gsoap-2.8.91/0000755000175000017500000000000013525245205012267 5ustar ellertellertgsoap-2.8.91/license.pdf0000644000175000017500000021361513525245163014417 0ustar ellertellert%PDF-1.4 % 3 0 obj << /Length 2924 /Filter /FlateDecode >> stream xڭZIs8WHUEp[gܕę;9t@jJTTRܕ\b_8[Ј0,q" cBx^}XX{m]#< B|A)IM(`Fbb'TznjgSل$!WGW$bCL~HLKˍ˺X'sXW[3jwEYf(ȸ^G8>KRB1d9ldB]ftt<%,ƒȫإoq7n6V*fk/2xM{upEA_G"clm__|“xqgd 촼oGk刭^kEDġ'<(efJ/(WSᙄGs<ǖIsB:ZW;Ws20&Υ "FPOaҺh.9FR"gAx!?rVjSSkӲ9'I<;byfa@ds)iӚQ#we#\т(^(!X|;6wl(wxx3ysow?ʼn<B(ma4cn3d "ĖzlMBDL<̴HYZc3 Fx`pX#-lM2 Jbv0O): x_0iwW d=&Rxu`;.AM*jmUT#lztjw\ښk¢Zu(jW;g}XպMg̏ʐ(w6:X|)Ru&E_bhQJ$BSAXw+UIyo~}p{~>3x3╘=DXqg  Հk4HN1ڵu^2;U%1)5kdm\}l «ȂRR: w}{rV2m,$$f%6?"f|h6JQ&J["˯_4SoL̄7HN*nxB3ձ&;u܌ԑQ"ac/M J2.qzXhҼĺ ١LOޜL?#EDLcRּm`moțxcNN ,f [.[ӄ1a1fȆͨ4ڲ7e!׹^[&gk1M_ڹM\Bky{'M+ b>6ځXr;tL5RەFԪֻ?."~ ]V-rQ;0 իpzuu9%kuh6r<: rTs Uf6]go-,r}%z1{ݍ',t4F P":1A:(TU7_7źl NKo :6O40[$n ?-Vg.h T BKCqS\[4ugbU!IM*YfSӐץ_& X'+m3v@ύxdst^h|(ts^e殶O;a.R~?6_LM覵kYzBlU]ߦ_ak&74[{q#m.鈵VOBjX'ɸjq]x@6'-_̤3~'6Oj4U̸&"_9s{/%_:A)gIQG2rR).s=>ndaCe{L@rƔ!=ye_]TLTUˮ--etmi3mY$Y;KٌwVK5h~VR"3Q_u7Ζ^ʹ+VҡlF4qHwPxB3Hky_+Z)d8eЛA:*(;p,6g|*(2OШ{&$8"1mQnmk3;y͉+X,,\6?-^=K`{.VڢJ1sCv觱^LM"A["bkb&]nd{Om]4XeM<{N&B.h͂! ݃}?' endstream endobj 2 0 obj << /Type /Page /Contents 3 0 R /Resources 1 0 R /MediaBox [0 0 612 792] /Parent 13 0 R >> endobj 1 0 obj << /Font << /F32 6 0 R /F33 9 0 R /F36 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 16 0 obj << /Length 2945 /Filter /FlateDecode >> stream xڵYYs~ׯK*`L,ykM,9Ȃ#׀:U 1sMo^e~vU?0S>tx6YC#v\otx7M^ ׿Q "$* Q*o^ޮU=c'Zy" D?SZGspJU}oJyTUIWE3uȣO&YzǺk9V48Ym(>]Q ti` խPU;MyvFE;Jm:svMZ^!oLJ3a⍻V}mﱕb|I?<'sc&dFW֟@$U*MʋcLArj*dPEL0:5(-ٖIL-5nY(KLGǒ]c;CGQdbN,s®cu[ iDBsui ÀvAVYo@`uqTXy=bhuEܯ*M}X,F N{ӎfjg -(`0.75_4fa7x n60o% ;/I2TK8~w7%|xs&<sl;n8m)?N!XɘFbj!aeڡ9^FťĔH"~z&@NJ仪Hu}5h"ؿ8퇑|۲;j灕I-pݜ1V"ܫRB7iG!b<96Q`j` Ǒ'|lY/wS{ G鲪Ctm a`=tL'tYV/gSA槩 gqGwKpfHZk"UX0}"ȧbY$3rRj3B[Z^Ot)v4c_ =Z1f(f4t~aF|x#?M[@ nu5(eDjd?@6\3 @.$"al0@<8 9le`,Ӎ#ivڈGnjBR"eGКzQd컏?t^ ow/A:׏>q-z7 b*9wwvm\Fhm! n6DXYHܖr8HT8Z_JT0Q'p/G.}=*8®OkvP1b-&b9®/ԗF#Hè;FLq/lRRPTӃ # \BGO!lH T}q_|ll[`B'+0c4Lt,zJ-bS,~K$N" =2j)VBi3{՟!x̰ kvKDu68&)uh['3!M*t)aba , ȱuz9#4^qa.B_s+N;Dć|@Hnߩ ԼͲUcHpVKU;ܯ95oa/9 H-PD b9\ ,}r+64],#D' Ƃ#ҎKM&oآ0hõSX'PcepGgЫ4`oT˘:,,s47ڒ7bdqz1rہp"._L(<Ϗ |. ÜaMDG©絈%X8$1'_w*9;1-\"4u9^Bf*ؘ߅T&&8ގu4fdcOרٟo?(8w_!#43WҾF_? w{]3*(Mٖd걔Z^L?Ǡ&8HDw'1忘Xc \A&4ܢ endstream endobj 15 0 obj << /Type /Page /Contents 16 0 R /Resources 14 0 R /MediaBox [0 0 612 792] /Parent 13 0 R >> endobj 14 0 obj << /Font << /F32 6 0 R /F33 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 19 0 obj << /Length 3798 /Filter /FlateDecode >> stream xڥ˒>_5U;4y\o6ɺıR}Hj,E$}W" h4o>>|Wcvy'f˓ ] 4cZ5QzNuŽٷ͹;uI_?~ ZEydVhtFfOQ?j_f"@TF!A#qD+p.^tDU3N@uNvIߵ/HI%*HL qLD^`F=Gn14仦Qfu2<먆GO$YXxb/:?JʽGl2Y$Q`x( %\8^@'q9! qv7 p _ @e`}4n@'G3r$f \|Z=$;--8Tck!TLC-r]No\ڦ,=Gpq.KSw0'mOH o4'=QHr&B|,Y-:Uՠ-ëuw:-Owc.UX{qTǖ@;g[[axRU 8H3#4M}xApv%Fio?pC<}v/?ߝT0Orhϓ2 21Q9o xwhдœ!QBL?lOr }k!) z?% u)aPs`o<m͜4?.K~RĢhOBRCkWW9Ù Av6$hEQCT7g/A:"  T(a|f4qp_uleq%@ uZc -N|j|쀳<ݽ\cEw/x B ,>s=VvhEe:YihtaDrH<yd }y0i֑a c^\-*>%S;>>ю"H;I=Km:OL=i<ퟠV0YEA bb0מ D1FhtŹf&y3lmf%MT/aŁp:_c-upwLY3* "R͡D* q^nGVt8tg;k&kmE`SLvI۱%沥U|hpd#Q(T- !aё#j̓DIO T@zyK_0:yj9Z1rSjf_CH ORxHW 7/5D`E),S σ4oF.*@9 ӘXHz#T27q#2*q3 C{=Uܨ0b7HV`~IdzjЙ3p2ZRlsSrPfvh dǍ뚩%#fwǜ:l"7(2SgO=L"2 L:Q nF+ wa9f`!?4ߕ YЁ)'œ*r}# #DVz38BSYn;<IQϏ#2~f"NPG.ZүDK(ܹ/1@t!{gpkfFIzv V'T<-eE=atlpS6"ףn]}!,'BX ;;v:#xʄZ$K{٣#+3$ϩƁϬi%<ҭO8dysc%33tHM0t  0q%d K$8 D:_Zm7 >m|Obc[޺$XhGpZ`]KlWeJ;*gYp^ٚJJ % /|z}>ͅ"ĜƧX='1rkaJ xb ة{B;'&UAF_Htb=7o _=4Xr兽hquTW_[:_NOmx&1ktV bS+s@N//y- .Ebx+mi`J?m!4: DGH=!9?(_IJ\F٤ +kؚRRT:fZ$A2C#X߮Ilü K-6א5.86^:B2L2$]lќ@. z $%|*VWij!1%(3BN}#ޭAOn46UX[_=^?KJJi]P1#&G嫩((rٿKuSw چCWα$DG!x<iǡ6ӹ'PH8A=*脊2 y8G#C #!D4$"ЏO%ڈJ [>s)|ƯLs52%A ٜv[gc ͊ͱGg|"֕X1Kp_EgtbIQJlS1Z, =GLfi@3μS +vqYrѨ>'ӼɆS4Hc'sj 2:Ps( n{vޚ!M,v{P:ǼOq󞹌i[Qzr8,FsE-Vۗ#s N )V5c^o6Ψa.2ճ#CZߺ+&[,t$:wa"tF|"s0\ m`v< (A/CV~)rlXRJ7,Y&EhnR.ENDT4aiV@y>%8%VH)K73ˣ1lH`i\,<]ҺrgWIG|ۯG#ʮD*7+?g3֝g endstream endobj 18 0 obj << /Type /Page /Contents 19 0 R /Resources 17 0 R /MediaBox [0 0 612 792] /Parent 13 0 R >> endobj 17 0 obj << /Font << /F33 9 0 R /F32 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 22 0 obj << /Length 2922 /Filter /FlateDecode >> stream xڥv_Gq](yb@h`'svA(D<ԭ^˛_l6Ͼ]֭oa6 m{j[X D3ÿ7M=p]"e` 6OZ D,3&2>+[PRH(jn`jJYV]L_ˈtC›pycƭtCAp1pw!st[>\0ۅxdg:?}%azfmPCK@"$, -G qpD붾k<|*hR4KqN=c_v3ojg]I#8OHj~_0|S K9Z>ȚDdyN{-rt4|Mч6R/jKAo<QUTÙV[i$  TiZlfEw&,- жK *k0U+=ń//\FӋ?ʚZMi5xYV0$*Uk)0Ȃ7+hMMIp#T ZPpdPxk7IޅqJG:@L ہI,ԥ94ȞNA/m T+` AMg4H :PZh3j?n_quZWJsVڪ-:ɰ,3 gk )Pۭ=R^ZL.?5YFÆBťqz%otVM&wu6C!sEdrf?yexU`&&69 ;c WH+3bN >cḒj7u3}W՞eV${aO!JOԌ6L/Ak6&_&ov!ᷚT@By9 *#8R9&6' @ZH828@p+!dKfKRV=.pH/V VykW)z]iϔu Wzm܆ttRDdAo4gQ U Hf5S/>KL c`&msQE Cg~)O8pHRPB+ņ&(f,5e[NEyB %K RacJ&7m=]T,1R5~P*mZɯ~U{W~MG iw^<-{<ߙhbۗb{(z rwb4[~K{8l@LB, ,Q1dq|oF?}aS41c=Ȃ?aT]&]sY6 .W޹x@S[gj) b=Em*En' aFaO9a?ї[fwi!Z়^e;3ZnY4^MG2Z '8jGaw^ X Ch p\A3-dz;k%i e1(@&!g{8~)ålτm(G1=4xL[.FYG# U̦$0NW E[ 1z& A\:4>_$q64yNeY 2 yw<X*R_suq\Z-k(Ӯo4~s_ib Ï w!i`E)Ռfhq =/ɿ L Ma#R  ]a ph!0'PfL}90^略L']?fc!D6>R8^= ˖m@MS>w endstream endobj 21 0 obj << /Type /Page /Contents 22 0 R /Resources 20 0 R /MediaBox [0 0 612 792] /Parent 13 0 R >> endobj 20 0 obj << /Font << /F32 6 0 R /F33 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 25 0 obj << /Length 3198 /Filter /FlateDecode >> stream xڍv8r`7$`mY8 ?llJ*[%!u{n/ жL×lKߵ:F)7%'*~deyVq̭|qc}cϗyD@!l)#[E5﹧Գz6C'hÜa&j%XL-V8>HGp5OIҷ-c `91{1^l_x1&š]mP:<H?t.1e0:y zY42?0_-?Mp$P#=B -PWAI H[ffy`[*Vu]R),TeZmb۳6ȄD(P`%(b\--gVtH [<';/Ќ`'E &yRl'perEn2U K,kfɜ[-Ǔ 7PӠc+hKq-bжEg{4NX¶~Vh̹NO ΘULZb3 t8k)/KqDgIi#*89E&}3&EЊQ=;"no%cJ8Lj2J[C^L-9v 9e qVWyGcRX,Y}fWq Ղ<.SAbrf0hй 3p=]o p(2{˳Za9ydXss0"5x"YIjtU?%lj$%ڤd}9/pKEC!AaH0ьE&ktZ#p؇,W9h öy#t ]&Ceco?q4}2G%K };Ө+%e1ݻXsXLJ"֬Vz|8.wI6+PCDeU6;N[zGcG⟤5 +rāM,oWfc3P !&lsf8B,LRXcKjCV=-](_Wó:#lI7o{9G&Цk1~[ub/re|ч7ZNI5enyx١UN,l<&HOۮcaKwooՆ1#8呕5-+?b|ǎԶ{^!.沋JRpՑN0"5^4ᷲ:2ȃ;|<9{&¶k1/%1D^ rlA#HhJf[I9p%!(A*g녦~Y, GoжL; {w8Bϓ.&3: tZWCqGBr׈!8Tό)Q?3ڿ!wv+wC O2x+mTD@dX8V9lL'49S(#(7)muǡ9Mb{6JRޡƱ<vM#.S "jϬYŌ~>Hx'+@es!s%8݆@nCIdWW ܷ ^q:싗,'O^f av\рUD8YG#ʈMԂǴ;b$0z+9 j (HNA_Jf\R!=Y fsUޖxN2 7ՎW,ڄ噖GD4f#w:a¡$U=u;F]] 3ިӼ[ߙ7I8? Q4mE1t>_Q]En-Зhy ʝ=GqILQx ] W:jƄ}rY)X 6ctަ1owyO0D>Vf7߬Лm6q&"WxNyϠgGu|q)w{ܼ\+[@~Vz ^=d@KA4V 50!9RCI/G{fJ`z3x8QM+/ec-4/,W7&5_/:AMThM = V~Mjݠcwe,='׆Zv_j endstream endobj 24 0 obj << /Type /Page /Contents 25 0 R /Resources 23 0 R /MediaBox [0 0 612 792] /Parent 13 0 R >> endobj 23 0 obj << /Font << /F33 9 0 R /F32 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 28 0 obj << /Length 2815 /Filter /FlateDecode >> stream xMwH_{1Ms"$1?^w0]l<'+ L{%JRI*U͵l6Q|?TEխQ}KySi-y($?|Zʦ!}"֤ou'4#(Z4td V?"B#8TG#Ƅtw5~7RGc0Wk&ltiAW28",ʼn;?m]rdc*<~CWK?. 9хs!& 9*| H}tU ~3Ƥ5}g 9>~*§n&P6ύ]67#b3:pFs23fC|àS:'YY) ROLH늮j?S10L3G ︁ Ccr^|:b#࢘62u[Q(^~:.ѻ Uڪl{4U'o=ql|v]k-i&rGNWߐ2 4[1t=AJjL kBRpX~,4n 1vPͤ4@n:o|&-zf23yMdq V.ֲJiӔ$>' 1s7jR𹯐iٌ%!.b ˊ:O;T(B&CK8 ljڢ,ED.6=. Hp"wMNhl|UaJ~sAV}ĈQPтPAt\,O߬h9 x&ۤG{znlŐ/A(j:Ħ-ݴ7bFoJވx*ݛJ`9$ݖOMTݷi'cO&]f9rj[k Ot\qeD'"؏p1 dP~|;_AfY.@0'E.A^kJsdPdM' pUȏ0Lb7m׫ N#.5{NZͥ*);P@Ev$G[ox nȤY3?fW3 [Y.\$:S4oQ9Դ'"tn8MzJߟh#i.b#}j(S IbOTk<`vuz Cב%YR~OVP&Wd-!dτ}JTr6>j^ޟ<$w%RG#҆|%7yK`S-VY Aȇb&?L!= 'zݩajyE~naDSVIj- kJyA!2EUw:O(¨kِq$\*GR"<]< TA7;! 7X85^hj|Wp-Iw8uxR\8kRy|?Emk sA,Űe?⑺bL-h YP)O_bLU@SC&~Wz0'>U+.28.[JCdf&(xnu!nl/ ߽ nJb=FQ{2Sޠ+O&bly-:{D# }]e{k s s>s`t#OB$? ?S-mjK:SK }:jfS=0 U{7^*qMҋ3E 2?|ʅ$f~x#+^iȱHe"`nj*Tb ;O;A ({]_GW3j\q+&3ԴGt/V<R4f~ī2L!n~9}T.ftk:K0QEW;TsuOqИKǚH)NPIAS =|=P#Lݜ<EgUx`yKy\/P-[WgV;/ C+j-%Qt섄`oCK|C[rK'ƻd+(j3{"aPPhj Eښp #g Y n`jo`< |}bv1>yDId4(ّ'r~$k䞈ԑ[L UM{MQgڳ`tIht3;_[{?D%}.: 1')ᎨB=q5E>{i:S VraJfD endstream endobj 27 0 obj << /Type /Page /Contents 28 0 R /Resources 26 0 R /MediaBox [0 0 612 792] /Parent 13 0 R >> endobj 26 0 obj << /Font << /F33 9 0 R /F32 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 29 0 obj << /Type /Encoding /Differences [ 0 /.notdef 1/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash/ogonek/ring 10/.notdef 11/breve/minus 13/.notdef 14/Zcaron/zcaron/caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity/lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde 127/.notdef 128/Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal 144/.notdef 147/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis 160/.notdef 161/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] >> endobj 11 0 obj << /Length1 1612 /Length2 9044 /Length3 532 /Length 9892 /Filter /FlateDecode >> stream xtePݶ&AChqw$hp@qBp Cp ; {uΟtUW{ɳ79x8Ej` *¡ q<dAp0"g@V9%#"":z8mlfM=66Z,VTVy!#uxq<@^>!SAaM`xyV5;FO-sy2y%Ϯh!VO?nKg'UO ע@ KXxiFϐQWrOjl2hUb ΚчF=׬[}$L퉠_YTY: ضL>K׋:RYA1ZziF=qtKxcTM܂_@XsysK4&+3p_/R:^YRjq(hڼL30 H]pq. 0RZီ1;`h*zՋs]P 2֛N܌7-_69z?68R2}ז׈hK9. XL =} !L. v&b%-K;~jf,:+-L,sI &0 n2pld^M}pjwk4`w݃+g)c ۉMX GDEVdޟ)q>aWJq> Tswk|%ms F *mˇA=CzDϝr߲^-_Bj%@B[Yy/ROnsޡCэd#r<ܑ}j~+NB QJu:%ݔS9Srɹ<5,Ͳa[+f>Ζn8WWf| ?ECBy;{Jal'ϕ/8S㼂Sܚ4mNY i0DYRm-SGqÆ(,ɣ/Fdfa?8l0kAq- f{eFiQVY< V8wzio]au G ވ~4eޙCz("(ڞe *W=[؉?( ymܤַ;306,W8ݪFm6WEoh%hYt w'n7dhRCs$x.`!aYSM%>)Pk'Тקlv97ܥprTsfEԜmv߳3~zXR=3##8u|-_ݏg}?`ҹAK:xs(̣5$}% VHDiPKSgKsInd05"S\Ipb7}2rQ-+IP*wׯc iհ#[*qmvJeUyaZ4h\N=ϼ{jLtLE%îN?6 lxpg"l! I)ϬU4]Yo|,\B YlmI. ݠSNlef47 h36}SkS)Ѫ~cLl 1r`rCr6$(sAlIsO$/IšȔa{ӛfa ĵ|=sl qǢJg ŵw?LHݕKj_xl8>-OSK _GxDq "(NrF=dҚ_h×v<~lqx+{LB)!M݋ SSNjSajv93Iؙ<Kqe~)): q^ɬBL6Y1Lrv  V`?^`ҾS6! U)gEEq3,n~]y.\%+p er:\s"gƘ "& 4ڬxD ^,DdBC$/jxcܵ_p&p!f3X  ')+7vw${s o8L>l31au`3(:B(Bi^Z:se6@0װh?X[%[ؠ=\f3]2hK ,Qf>˛f8V?2Jv L@j;\yhw3VIe;@`=@s_Ju}#?#Y&NٜD &Ź[I-R둖#=35'}/G8zͳdkiS>eu5{d~WCrzY'ޣ[zZ(aoؾ,r (o^%(6ӯ?F; `-!cYJsI4=-ɯ}Z60Ak~r>a:x,tSk@!Y9Or:˄V % ,IXUzjUV-^skǽUh-8Ola =ô&"Ư̙sњOz;rڞse (g!`>f1vr>n$(2HRҵRZ { t!:H@ ѼIfo?]&yɺ~>SlS.@<x;P8l:XcRûqdHC3T^?Q\{ :bC3ymeJZ~V&AZyޕhnPz2lޕ#w<"xA:}ji}\{ٳ}J-kB}c. Fu[΍wčSX?yz,.Ń+aYV ?~Npү7^H#DuS^ \((2$9"YnYҶ1j^Kn]"f/ƴX0 qUھT6ỴHxBʄjB?%,zj'6wp>c7 ޕm79P ,<j*FDW=Oz6Y.QHW* BFhzbؽKEk哓5c%(]ۮϚO 5y'gk'RcubpgMIj 6 *m&ڑNJ$;Fx$ئ0( nJ^(|׬`! ({{_T;N 6i358tE,(M ߠ+԰>WNA}0H.=7}K|f.ٰuM^Ԩ/$, ?uO%BBpFc<+o3gIpx(L"}uS8=p"$ 'RQ冮Wv Dh_JIQdeyxF.Re05)vxFQՑOcm, Wsl&މbn,n%OuS_EV!Ȕ9> %XFJ9S˞˼ z3&)$_qPDٍOK~ůKǴ]^qm*ў7J {ÄWٱ^.ZDP:&n~"e_-슜!EѸC,ȳmB8=`&aBbz$Œ]Ѵ伬>H ڲ|h@ c#M^bschUg[uOO Gᬖ=e6hxnb sktH6DB0*ڝșG?bUt[dٲe"1OT=ߊ9mRHN"}}\p-6m,ȐGxRMBX]<CyjqqAn&h?)38̰;ZTMWo<3γq oѳW@F)s: CZ).sѱ}"@ʰ=v7|1`9ف0}C-_i^f0wmƨSd ޓ|i0 Dn-Rޞak"1JʏOjP)Av[N-MEMx#ՔOiÁTGeα^ڔatmL6Fyͱ9>4=ZwN.4 õ;ӥSKʥ%&ICc_1?ZT?Xk]qG aTQs6K$2*`;.7,?ccZ f%Hooliqme'l.쭁Ht(y؈ -]lrH(d2oPSv{1v&Ma%)Azؖ' N^RT֢3 =ߴ&Ǽ_clz2oGd2 C r,+Rt*s/z7Jش4Qu X 'i$TcfOMoE mxC)az`~9_;4dOqϐ? 90y\9H~Iz}<-nnz%)p*K@Q^K㰞B4Qw\` xx/X'u'DBkx0ϮsKrпC9:Y%K.9$R'KG$ @}0>_zhRnO3%&b5Zӹqͤ*70@`KFb5C&z78L67c^GgDiC5ܐh-f*EƊTub}yŽa&ruoO5Һz[њa?lt΄!, T;MS~|鳊&q؝2ƈQ0biJ0>٢h if˪ 1HcS46X1// yb۪D maYePo 齜oB;%j[K :`W+.ԹxL}pdҺMzBgfPu` 쿼QhiB`ۗ#Xt:ޔ*Zݘ0hHFj_*jLl/:$nMiQޙ|-E-%:e[t(37p{zt|4*.٤uFgіE+:%YπdOf.`c(vpTh|JI/4GxG֌'.3 2|ƞOg>}L߮?owg/`Saxl">&Ubv`!9w3\9\'3GkowWNH*~<߈Gp.O|=ό<\zy N"@~$gѹ^j=K@ JeFf ~Ԯm9CiBAlF:QjA*ꑖ:[AI &SUvp_6rKegRweEeky@B8/3IRk[4p?<>D\w7jV1hc|'\{>b%4} 2 Og'")s鮂5aVݣ'_n/ ux!V@R5.8ˏ,UK#%.SL.4[we~LT+m|iPM=~iI gFh-͡M{lz,Z ?bS|Iæҗc<8|%3KF*i=M(.9TŐ~_|Me|CH׻eJ:$H+FZEۊ1Uԡ:EUQ]T%<2lW)XЬ0VVٲ  -jh䃰;%i/3 "`z b<*3

1oggB!Ps$ov?mSz0USFLQ-[r9S|[gEMd=_[$OF?@MvAeRw AKG Q4۝@HK,4lp1+*Y"PYiI%+"NJ7D;y{EmF]g(_KݕX]V\ #Y̮.443b"6 `B6OXڃ̝Psg; endstream endobj 12 0 obj << /Type /Font /Subtype /Type1 /Encoding 29 0 R /FirstChar 46 /LastChar 119 /Widths 30 0 R /BaseFont /VKWOVG+NimbusMonL-Regu /FontDescriptor 10 0 R >> endobj 10 0 obj << /Ascent 625 /CapHeight 557 /Descent -147 /FontName /VKWOVG+NimbusMonL-Regu /ItalicAngle 0 /StemV 41 /XHeight 426 /FontBBox [-12 -237 650 811] /Flags 4 /CharSet (/period/slash/two/a/b/c/d/e/g/h/i/l/m/n/o/p/r/s/t/u/v/w) /FontFile 11 0 R >> endobj 30 0 obj [600 600 0 0 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 600 600 600 600 600 0 600 600 600 0 0 600 600 600 600 600 0 600 600 600 600 600 600 ] endobj 8 0 obj << /Length1 1630 /Length2 18356 /Length3 532 /Length 19270 /Filter /FlateDecode >> stream xڬctem& wl6bVcgǩضm۶m;}q?c59^Jƶ@ [=3@񇭵-௜\h23y@c`#ڹ9T?ԩiiS ?4=MmVv@_kGe 2ḼQE%MiI*@ht0(9Z̍6@j?92vF݀F@Tt;g# [? +!;ۿulAFv ߨJbdf'_5䯥?%Kd`n]A2 f`4mL3: /?:KvvVn2acf7 ?"mcb `f?t@5ꟙhǨ` @2 B -de``wc Y4V?ks+V;4o[mLRo+Xdd01۳UmV6zf&S1376t+FY/CRqFux3spY޿ q߄ @u31ϓ15gtA6 Q998%_ oq@#E[#TP vธvo7@z<*.mr@IS}n,+ʮ$e./R< 6N?Fb3y-H-&?ޠ &X^=Q:`=!y%Ec4䟞Q?=R t@fEÒ:C"Rg j{DaIh9U&33I4?G-H9`=7PZI_Р2OH;*$;Yw)f4q>W 4Zk˺3Clԋvq ϊ r5B1Z>I^-;X]Vޢ=\ A[YE$uIxxlUbW0 A`S9YlBQ{IˆKgqfTW 8=@dH;W]yxS@=(\ǰ`tWBs q ӕu ^QQYJzڐd+&?Ź*e%,MssYSub6{$EO̟Oܦn7`yRMx!5̐"?aMU3 i3QH C4Nj{Qo7ffQƽ-,G=Gg&!$)qg!m/˪ T`@q뇯vj`Cu`MXk/eEDH[}H<_c݁G@&\'FHL#kfCW32(ĜBϮ>}5wjˠr34=T!4ݓЮ H',YQC7)p(wEߖxtark`! Pc R:olBX5O)N 5͓Ohg+lI|+-=:skhrpS$'|r{̩1N4Hl`J؃~Ӫk 7= ;M sL'hd ZO<ʛ4,޾nAy>泶@HƇWtqy?7_ӕd''X37@UI/%14Mv,x y>+;}eY־ǟ[qg^ 'gZ~8ԄBQeZ5F((lvT7b4ɷ~E*.#ihۗGIjsA^ [A  gw~30tTG]o:%i'' sR`nL+ m{ZM+AXlf˗Nn'UZ7䟦{uS*lAOD9*vp@'!`nGb:I &GQtGJWL-?%0SD#rIZeq.cc3]'Gݟ .1ɢ Xkj*(||}JсX&>{|"g)H/|RcobF0=dFK7'c**Ӎ(DӸM76oL#~ ,-mQGJ+^⬸]P ~'Urn]Z "4L_(jO ŽҐ)h8gTpx_:o-5giFyR}=}ٜQ>U-ْALόTz~gքr̪;wR/Ó.f̜}g4ROVطŮǪv!@ɵ5Z̈ zP˸0`r0PDduyx&-xH E9huƆ:ȋ:@Lq>!м&Fe$]s 6uddM~852˹&t:cmSh vXq il L~9x=_Q'hc1 |v]z5fল~Uf@Nlܱ-N8 oW-1)Jbmu' TJ'ijtfsktHմP.biݸI-E~A 7foxbz_[ѵ|ˇ \􍕋Ѧ B_ژeQ 򒌬tkp tw'pJlSe5D6JK)plGq>̤ "O 6ǘ#6TFې $:wc]+Cr_fА]3~&t9Q$O>* 2v =ܰjXagɸex&Ŧcy{'1kbWFwBHNs%9 3C}@ w[ P"N(2XL!XwVrD-Њz $[.9Ѥd]n4ԄOtfM#ۼEI}AKɷ E3-/ אQƒxrNX T! _$mC}~8O~I&x8eS-I#pv2e09`@+Av(TWVV+tQ I}@VWꜭ ʟ~~#RYfY|&UgTðk8<!D{wYEжȉ?| /70UeB ~˽=P:ׇYKNbn8jc[wȬ=o%ܳBxzm5gpD{WV:2W]iEؖFޏ޴a{ ٤ƍ2#M,'Ti/4sW; Zw $G}bٌc5W_[{Vq*Z>qHDZaBfplĜN|Pt~h)*1XѠNfK<_ 6ÌE#X{b8gw=4O(t$K`[6Pq+!`=oT) cs, `C ᕎV3?N**e}3ƋoSRONdy4-ƕPG"2/yľoqD;^ܖתCKaw%W[tMx㮝D9xFhr Y 5JHݠfFˤ0Cs,; ]-Rbz6HդӕMW,~jj<ÔԎ)}R&e|gǬ[Ic?6\a0"i:PC2sDR1Y4sƁ|?btgo$HMY%>:ɾZj֢+5xDK᩺h$ ]Γ~tRi rgW֖b;Wxf"*m0jw b")톮/<} >|ʛm W8urI4ݫR 3[mA2vr),=n)1P4JWy V5oUW8aroi3|ŗ$Fް$:CUnuO8KPj^Li9iZAjBm}_(h :]Nޫ9~ˌ¼w#/kLt2~D!VS淡v].vUn54QDiվ{:D9[1o]CdDU$z(楃@dg6܃\` /ub'׽QSV0Od۠]DײcAIש3ڨ`à d)'`* 2jrQH:\KXlpE{ 3-Q{-ߦJoz09:,ٚMPegxII$d,p+44M!--P9.O$"?eAG\fg}D4 lIZya&w4&n M e/H13䖽Y({3 12HkTv$ z9Djj;Ħk֦3wW NN,t+ӵrrhUA_t ghoK,Pڸ=r:X(K§(]+<Ъյs)2M B33Q\4{Azuq{繄#XLNFS\&]* y@_({80w_qzjAsEDc ZtN\;e?or{!|}q1ټHsfΜCޠ0$= .8FbUǬ |ٹ8sI%8n-}s̎KNTBa7mJR4P_&u9G&a%H/YaIEhd}]#is d2I@pR^mqa}U"cJ To߿~ɸ#Ҏ)@3=g/+@AdogcQ$\M*=R1§!XɌ@pX4* !c!3jc GFk?K>}sl3.E!'I95gtR}o.`zKP/S%faoKz{tIP,KE;yэ G~*Hl7f5o~.]-c XMDpUyw~#铒#ƇR{җ[cRJlӲz簾3q?߇KoLpe慑m"4s""!hv+wʋum dx~vБGӥGCD<>*{6v̝z"#BGdɡ|tR]F D+|R+كaB[p{`(< ;$^ ' smnրTy7?5Gh< hG5*9zK UfW)j~Jʀvjb6*v*Nf,$RivIJ|:Ʀ$阊z)nl?qFXݬ `rs7z'P:%?_ U9ͅaޣ?u4S* 1H"&g6Jl:\zN 0ހr 7n&㝭"xJAo=2F.˴ 5|\hKO`=a`q. m)Fbj]Rl݌6oM譂q.ue5`:Mӂ=UrјB+;r$;qׄ 8ZݸaYkn SI+G ]TQ˰l$8|S,*7ky c$؄17] ̻[4,:_TF(# ?-aM7'ץ/*%.sEgTnZlVESH5p0rm͚s)d ۪(vkI*dBS@VvC mTP&U7[摍x7u70*;*W4~gh-j<١@6I]/B->eܯg56W|$!j*% ]k7KYTNHeA}I( &87kOR晉d +b>"]EI7 9xCFE Ar0)Woۻ l"r;ݮ[]IS&t DNc*Dl+"1ɠf #碃eK`_!qݷLJe#g A, hڋuF~a`A@3y*дV*5cQZH,ZTd$i2Bynz5FD3sLIyG$~Qr7b r^|#feZӗ]V'B5)ړy6^5(kBa 1'+%GE/RɥúX+jGI%G#=SÄK]LLƾLܥOh f9PWB, ˔m OvsݔYc drX8_`%Q-3tϢGfvW #l5ޑ_'mbDl0/[H銼9]rӯݴ$T~[n[2, `8)睗Qpg("F3o/^k:B|JIC]0YT~B.yL :^{-p,6Afs[ab=՟9J C~aĿ"uojefpI5p(FNsMLĦy l)LƝiS o?HQJ$jH d!xKo̸}Cp#m]ًêaRǟA1u0N}WJ7E!c͝mIh}@WEb}Q~E17/&,FװmǔmRU!eH[@<owIPh4c/˔G+faoW!0YrRDXow3cln'i. >t|j /mgz_͂<u* kZ6O 1~snPzzyzj4B6I$GKH℈è.m'Ef)mmB6~egJ֡V$dɎD\sqԇWXfr6Z^; <ђ$'-'wEE0~DP]HJt3OEzlc:KEH`iݐYq~3;kwFW.|s[5(e EvY@'| 0Eg ;Vp3lVXL~U{Ton8=NIXWT)M7GorC]]..Xm,z "%'4sDkظA%x]|L3߻3%l#s^[=|ސֻ ;~MW??RժG`dEkF WUI&m}ѣ4L͎|1 U*2&NM+ q9f:IOShՀ^oڰb&f~M%[_ b(<>Tdg>K.PQC7f^5cGlvif1ΌŜR ]fO\F9&J5qzޫ%'T CАc n oxj.d-SXf1 l[(x,~"{n`.0<6}$~k6 p+X((9uC"7> 2dlimXFew07 U vm\(4s&B;2*# F"LW8}$gu/sf(񲺄~?D3&yYz z} x]g'In~53a䛩U1r ,IyAW2UWkc%H7QI},J+ :fC@ oKpYb`Za<~<3`7}kM a:%**-.DMs$shu@\|3-;M\ "Z1C};)P·*p&9XdX#H]A|59k`L&ʗoBͮ_%k;w9|Ut[bl#m/܎a7tFbj;^\P"ukQDJ'WCөCcpF3ڼAH]Xw} d͹lHCL!9 ]8IDHu[[3SaEh.oz`蔌\_"5H1ӈYN@}3͠+ "g?ePDxy8#I8W~S"ʣQU0U?Bfu 9JɊC"sK}&[p2 烰̲!\2p5hkp*%]hFeNœ\9]N5D07$0Lsdt R]1VR2(3?RԾ1KH #bH4qlh_8e5WUgU,pfC8B,LG úوmC/ u_ћL1Bc1lc`q4{ ܀kBТנA/0BVQ)Ns 4=l2&Nl(h93\gQj`,UlDn|ٷF,G @iZC KI+H gDoe^"Q~2X՟l_ujHHiGs#&px܂ꝇoGcr(Ԗ'm= qIqr 3goaݤdӨW2*ܸb<%>#`!t/#>ܷp$ӝZ[BNWBB`%f9 xngU(p3~}a:ԥF 2j6q 8N.=$3||iWU`-y 9MA%wdF>?,!wC*S."z Қ9 >b|s0+Eu kĵ6IQ6WGny[4=۞{zM[' )G ! RhVyLыY7%š #d;įfdX9_FѺI]<״PYKf/ yI0钊H9KNr=IhzouV6cWf[ *˵_{E,!XE9A~88AB d!MT  krc]b~K}*min5uÂƳcUI#> J[~P.Q W4tXLn9Lw;w=k(y1c&7ߣߌ{!0/+K:}#JE\ض}BsT1Y(ҮZIі(Dϖ;}`.EDԀe0n}?VgxTܓuuF"0ƞφ\/ 9OܷBcCm+ XbxJM(i=?vgPx#JPK4:H9'1Rܟ[1˵R siocr>)Sk4TsX)"Dw& 1"эDsதk#U.- S$(NS&`9X9Y1U )Cf̱A= !r߮[_O.ͤ  arQ*WDv{:Qf|xbd=nN(οGoeH%ެgIs3ЉtuD_x9 >οO]JՅZO#Ab`͡}#c߄͉̀ȾœE15HpTT,OI ^1IMI(ny+UQg !H%7Ţb7Yr_Ȱ"@pJd rK1kz-q@% VD ƓVLcsa'K8Ob9D]b03YX_g[rj.ݧ<ꫵT~Aԯ#Hi|OQs"i~cd۬:s@~̝›_i{]A*251"=qk_ %%^U"mLvl_BDP/$ˮZ->_T( K:i''$_o蘿9O Љc-ZpQvxqzn(J/s\A0P>?6.+oC$o$zh3"Ձ@.Kh%#Z뤵/P^wZ)^ QGH?{ _~+>& w׋>FT\.S1;9]!OMfGDVNU44!s4Mb+rzTѱ &'Q@9!bgqP/3jhj*FF-UA<]t1EW r,6dUWM ɽ$>ǐ^? ȷ^2W#s/ۛ㈘2VG &@h0zBe9uyYؠ19@/jB~p u ,93K7|Bp!o)D O!Ublxp}OXݺYv}~aYS̚M616|lO(Ws tv1n}(m*9n!vG2 ~WmTY1|Y7.á-%`4-σxc 3.7cT4-WY"̺5䯐,eCo{/'-4hhG@~؅IAxG?@Ӛ-JbYs4#/I3`m_ !LRrIxv{RC<&iN#$b78T==&PEsO.y,on*6RJB/RRn^xN\Ӑs5>j؈N|iRX5yNimYEAGג0Ka x,WޒVBHaT%9W mu*i/W<%{jW![&&f+6{ ]8d# Ro]~A\:b{:Tp\R[L=B3§͈,Vwa'8OxH(nAN*}-d2 iYm;h1nyCdL$wSȒrN=i谥ozS(Aq}Y%uhhi_7ZrFgEs}pM$ X86K>r4۞͇vaV&چc0 ܤAc-Eo3wXf#R 5er0WgpcT[Q73܉M:Myi,OE8amrVcSDZ:#V}=gy(,F.p7;viN' &-S4|.]7:#<}'X֞J᫜hQ&<ѣ~t}OO;9]}c x \)(>*-Ïf8V50|i{GE35ALuP-z7N]am{? xt׃іYGMX@0 .NWڮ㚲%΢l ­{DphS ZT˟nፉ jh'4MApv9"ݷUءzZw Fv&DRP0yz1|F0bYa'4E=.a%o昜8xwIc5OSgv6EJO:w3K+2s6Ftvڻ-s9K8 l@1o!?>KupqB&0[uw͗ݏzaxXn#b?v1eo,6Cu$ݙXSpe'fGۼ/ˮƲ=i<nMw(ip쐹XM&ti }&P%νZaRhfv\()X"tE`&kq'wdVқNƓ 䫶7B*Sv4״O,:P^-_urqjX 69#k?G6u^v5Gh~>fbNg(ޒјiHZ2[ֳqxJ=Y|.{eKՖ oYHqf;cma4:DxcU30ꂽ_!&帅mUq%Rv--ЛW{#)۱s գ-S< ˤQS"W-8ģ+7- "Fz`H=oWmذaQBkY xp60sRe՛3sNug=!5b6('}0Udp.G62Ră#gYã{3!6( %Q~ wVV#Ky*\g,q- &B}' U-mYR/MfW>NIFG̨BWmT%s_^ A+[ \^" ?D7gkkp`b3,x"7|pnK5엷O݅p=f&,DSRw(Sסnw|/qh/E_;sτ8g!0&-}9njsKs7\[9f (f>}G:%h IGgAR+ôA7mߣFW˘ƪ@k@T-*ǁS&3'^ڞi8淳*D?wnf9BŷCPm/ry}y噕 a5oQ`4J֒^8ŶFզK5]ݲmo'rTzV/g-yܨ1Uܹ$.9jť8:V8jTҕC$+)RaA PB~se?xJJƍ6=_7R߃{kC&cǐaͬ'rG]O0[;c? u(%XMLK33sj+EkItż2G.{N},?;Y.2=tG{/w-kl(ǫ^@!c%a͗@]BR:0)svsFZ6y7(")m,8ngd l0"#YE$-e: -޽sA7 yf ^4o;+wK㝶a*zƥ]?R(L6cC/hΫמS~'x9_FZyy3܇=Lژ(6[p1QKlkSݼ E= h$ ~؟ 'T;DCY1 ΗFyyª B>5XSjnY^CS#Cr>q}1[׻<5x&vJ`~-+鳤o@gwoyx!"& { ^]Jw9P)x7%" Gfpd6]tՋ k94W nz<WplEM_ 8:͆@?=4?w+׊}< qX8#;A YLZ0͇hљ?W"j8}v#LRQ<(ʓ H Տ\Ou L>cU4vK6 SS67~ս:ሾOz ?{Ix*4>VPNurvz7=w ڶ>{~C~j[GSxEzBg)bX%ե 8E6 G8B8܂u >Xok,JcŚJz7d}몲OXa Ʌ)kϜCԗM.S)Gb,WT sv u[y -#.E.S1.:Z 5TiɱYB~MWj>^X+0|ed\I>)F> endobj 7 0 obj << /Ascent 678 /CapHeight 651 /Descent -216 /FontName /KDRGFK+NimbusRomNo9L-Regu /ItalicAngle 0 /StemV 85 /XHeight 450 /FontBBox [-168 -281 1000 924] /Flags 4 /CharSet (/fi/percent/quoteright/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/four/five/six/eight/nine/colon/semicolon/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/quotedblleft/quotedblright/endash) /FontFile 8 0 R >> endobj 31 0 obj [556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 833 0 333 333 333 0 0 250 333 250 278 500 500 500 500 500 500 500 0 500 500 278 278 0 0 0 0 0 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 0 333 0 0 0 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 444 444 0 500 ] endobj 5 0 obj << /Length1 1626 /Length2 15057 /Length3 532 /Length 15934 /Filter /FlateDecode >> stream xeP$ܲ%S@5Z@5и6.w#93s'gz*"j\+(J2eUF3;3#+ /@dcFюGQhs PR9Av@^& 4Xyxx(bv Kg7MZzz0N [@k;{_DU l 1%emE):@ h t4(XL S`n`jgk5'X"Nc=7 n :ڀƶglٚZC_FSsrv2u;VU7OgKcj;v#L]i_0 ['3Z&@o`pqZ#/?>KʶWrvZ3!i]5nb?|@ 柝K`4G`Vs[@2_"Y -bmhlw>2ƶ @CbH1Y{%hMيYgߑZF$h r6[׿f@Gk-)?,AVo?+տ3˪o*]g5{+ vf;KS_@qV0vvt?N F쟵Qu65i<4EX[3 \sxR\r8ľA0߿ڮ/-|&qcPhǚ'xGCAۗEElP~u(ɢq7͠ x֟5˓=ij}v'Z#FmUPt!!}N<%+2UCzW,n[ 9o˹6^GIKf]lh`xƙWejlj G ~N f Ba,V0e-_gJ1!&'D+&1AHJ A6tM%n{ 1Y|HPCi(CGd2]jIke&JHw;z ekjry@OmGAƨ$S=KC4 L^Me+,bm$~ ycykx!I ,ӢqAM ֳ;+11p dЫYQn\Q"jz %PR Q:8` P#Z[/J[2(-YRMbY{hY!w%g7O/pJ™_emzI Xٻ7^4L"Lڧ}CST2Q,+0G ~W{6Bc f\W=a4]\$ 5V%ԊB{2IλlUJRV=Z87֋?i+wz$ŕKXJcC(8v?ӆLU'Bx>Ťi/T?[U3;zZ2DwݥeHg/2>zovb[V57"Sq~OYƌƷR4Gjт_1bf@U!*S|b'yvt8>/wG {*%P`_h7=~I~-+*qa6qdǑ"{2]b`>ql:]LEݭ R?Y-R dݢ{tc[pԏ]9UMi>D-E3js5WLE9 kbrt`sاډdH5=yUu+Tu9,{gzۈ"&0U=5NUrxUk9Dr=T8쟌︖U^M٬.H/M1I . :"à H=ĉ>?aS_ I/% ͭ{ڂ6w'+L*rdG/^(t4>@jY&,Jä=[إ䘑WDVbHny~KcZyi*4p/Z`a&К[_Ymɏ>KH@&RpcY]j»J7Q-jb3I>9hlC¼7- ^6X-~VA~NŖ1HM ?M/J3Ln d l2iuvCfu)\fYb[7D.W#BɒnS=%^@\U\xsb/~YNS^ DIwEq 0 [5jP {W3Y9~um5G;ﻕms&zo`[JoB"9`BQPiK/@KR@ ظYPF̵ ?7o %I0f3`^պ40JR E玍avA4HAZ)eFW%MHoq7ebF-벣!,3gNKJ^ jᗁur\@q=U2&ڋ:aCt;â\LI^M]8|:ٹ@PF6-.# rbzKm PYC я72oSS N}N)k;1E7CoU`kۓ[DB'Fimv5K>'4x-=DQ~U!HR5Qb+t~#J8cQi˘SOh]mfŗqPu_+g ~c6&b5) [N\3F׶ab#|UsVn+XE;ABzéGrt GV~ӥ463bI jnxfTS! 7~QCޮ}S%D"j.pδ 8&BɲP`֑y:`L0F9b Aers}٠q+vL,CrM\vG~1hOPIh yTm;p@Kܯf`WN󏪣#;(ػ׭[SA= J]*;OSMURvr9q'_ u$6֝Y`GCGk7s#x:貽 -_mi$ͦ rx 9," ,T6_^Ϛ A 8-jt.is;JMTر FQƼ-N2X;Nmgȣ -1pRC+Y9x~3E3^bſ,8]IA $>ii~IX'ᔕ h4l QT-ѱÕ-7BD"404B0P9h߸M||+5>~+UQbȂ؆:ŭba)d)0)!W"4YAed d\ >Y+}pk)t;GUoo%6d.r?S} d:- ņ [.1>Bdy%8w!%tu 4,7.Ϛ*(`O5?ỆxdDyANޥ, +y/5"Äj^n:^60)g~8|c9 L 0INY"GY/`+: (|-欁tw7 ͆:c~S9=TU k/-1-@ZxqkYSCTufoߔb?(4N P/WE[cWd|3( hP1{x2Ws[\g̈́N6Խ/s6NZ;yX9TNڍNӢqgެI]P\Jkn3Hb`V{"p^ݝrKfs^۰1l ]gh[zh{'"[vm,{ Ԓ{C=4NPmƓz1;vke%8n<~^w$1~ofl]Vtw_ ̙<cDY/FF\"Z[$<BRqt꜐t&,2/9U/hw-U_+tH4MݢNN-~h2?!32i2Ʈ0#Q\=no,B84mpl>[z`Z]*U5䫆GP8D[Em9wv9/8y^>p R8a029.ePakG"b>|>8QW]&†O&k!x1+*V;s8=FbI΋j =-K8[pU Bbj-;r>BZ|TY9r H(#r%6hcKI=2 }`'BcӺAǏ?u8h+_QFѦ*wWоɌ12d )/noA8,:Pf~;9qv- (,M[S 'ER6&` ґŞe |7JgzFk *1b dGW]X>🖮UC2&_EJ^0 ŠH7*' `.aؑ4=& J~V$U Qr g"G8ň3zpMOO_tŌ_Gw^::洂D]iKT5\tڏ%uy,5p x^c0'OG AdU<=6yA6?aY0]n1Ɏm/~|{;pLXxgh$8jIٺlKn+K^QGz]|Cġq4q++ron fX ǒ*mZF=43}S4I#/VT=@攂I?FAG\8'65`/`a\xs*-֭=HݙUM#0ĎL61=)YnX-AnY$ %- rVJq>>γ7R#YL)J4Ga3'FT꧈vG+Z*|qy[ک[~1~_J ƈ~KʁXpH5ePI7ٌfrSgNYvdR1}tf,#TBnkA_r.JX}ZduA=  ;4 (L&__~V%| ~7YʝM">V6~ a!Ze]FXHC^ 77᪉ s)g|e dz>x=j ;;(mʼn'W"G54<-!x=Bu᱌Lz&Y&*<R~OxsbarJZ7 7cKDj$j`qҦ ^u7~ 9ӋdȈuNŋ0d-BE |rl/^Ǵwu׃gnv }>~_ݵI.Nx)FSb9s,*j(Ox{Rz&<~C+XT3] VѭrlF䆂yw"ɤ=S(iz !ʇ&v_:Y?TZqKЕ7zR-ePnY& 9rcKB-j}pwTnlɹIA\U/#^ ;C1zX>viXEzxbeyx^$S tY BqXcҺ'C9\l6u}x4)H47 !597=,\5ș J]+[V-O xxm>*C ar/|r8(Fpᔇߞ7>wEb5|rx_!k\D epYf"&+5eѰ"d#m$NȄTaW-ЉSR@E#Z.-!U!aTʟ-tNTv/'B_qkO` :,̿SN5fd .l\x+xΠ\VMU:}|Ggf$("A”N¡+;HM!?dhv{(0 ׍]v_/"~UB{:CCXI{0O%82XnF%ز.cWR _LpGI( udBWuDu6.?X ɚtTw55/J\uL@'h|@MR s3\ L{}dqڠƙjTFuh7P4`Ph%<>hj F& A/Fyt^|.?!>ސ(=$-4[5rsR:GD͖<-v~f!q0zytk9K2Uo'NS|5\?=Xڝc ~; K4+E]%c<.=< s5CxJm']}hQa? A,aԶ3mŐ[wSIPDd "q/sK|O/\3Kqë?E*RP (ڼt ʫT'6G V.9x4AOm>jt d cBL|OQ/ $n1,lq2:KKs MVwзK\RmT.pUp,gD\=E6jOc-I`Ύ3VX9iw)oU-OV.u;Q &Xhe+ z"R3Ѹ2qU6Z[N?|Lau !{0~;glx\מ?d%1:US)|E7z|I Caȡp {Swj zBecXyF1A꽵P)(е _JMóM̾B47Y*(#60q5nj c|e[3, aucefKR7a.^_6cבU+UnRLsﬡxр:(k8Rx*G. Q-w'`2Ō$ܮkĥ1j8~ۯPwCԩ2`8>&'drd#/d3*۩V;@[lV&'h #G9t 0!Hy #a-QylkFou:n)NA˽?Tt gfyUEh+~h1_H03=ŀY_?>BO]Q2wrgϒʊ6rέ[ [wdqYmB,Ӗ2 k(׊}]m$d*\ae!'laR9#Ŵؙo¥ԠwY+7/ {%V+o1ߔ|H6?B,8[}ők;YUiܦxf@b,d^ IH sM[o?a 3bV߮3~ 06}dp6j^O5ndxّ;3>EWχ Pn@t"2i(m{bg7mYГab) oqYHp0ex3Zn榟,_`W: q0ez o-\7=Gi}YmiǛփ&\ iry7mʦ} U@|؀E&cv ?}\pm˂˥on9Y(ùxrk*|`|RV~Y-e-{ib~'CZ/3'<ie Z} !x`[Nn[:;zB>|Ϻ ('@5tfb4PCc^!e_"\HtKS#|9s=Vj4\tH϶1\G$vgnEeXLla`M'`n9TtD)f0 ;yu12$2}rn8m6R^vQشW3⮏febˢ5{[5ӗ0խ2;x\AXXwV@8]6,fnUi> S}I0y1~,DHuC'q_#l4b*׋+GޢWf1#F ᚗ ⩬·pz;-yuIcEjj5|3RLDu6jVnz wUi7+W_*A1B|s)?C;%FC"Հ`u#`BWuXpvâ`R|/ޠTZ[q7N|Oj×%+h^rQA>Yٻ}ag ~]Ƒ!3?-QU-yyGr]X7bSnl:Ug%Vn3bMYSS'_'V3M9aVXoCf[f}Эߖ$HJdNS|­kz6Mߍ61~"HdyzWl"Lv7xD xi3 _9uSlZeib%c'Dɜ" |HYN:F)+,O}J4tjpi]u[}qDJ ~븨As3C9'"GF:MȌD̨Yą,ˆGt{-G~Eĉ:ZfQa.>TiMi N[?ZCtd亰 2E ZMg*vFAf0/R {{=YTʰ r&JgXsOʈ,A|)O'/QGj)O+Hoȧ?%!붊J%LVs9~al.NTŝfE8vcܒ +'50#ޅWI)=QOٱdp̉VHW FUkzY&" jwٺ{*f:k~ן y/v7\aQE2n~no`3NC3cSx0ՄnLer`{D[6#ccށv]Oү#N)W6VNeDѯ呦`~F(52qHs#ĜzZW4jS^|̐ g2PUA?Vjuc=+8V ov1 %*p:mo= Һ^ uei upo#&5U3ɧkc&4e[e.]q?05ߐ;ѓ? Zj xں^|.<2* X\=bN-zL`Hw)owʎ߮M-j,\T6s*P[|ziZ@-Sņ}۫8,!!mw7f/r5o#$מ3v96,OG^ VWQEu64!aY)bH˾Ԙ)<ʶ%tk2 ?2D(=C< 6+z,vQzkq nI@a^lL@m)J(d*UE.PK[70l਴p̜;r"_m㟩|E FPZm&"-MɇP7 j ;in 溧4gLzcNX%tki#b>{h;iFܴ"-#]9U4ZdOFڻfB=XTp/ j=!c@$`H>q5{E[ˈzz F~{[JnFw1dOF)y-sI%Ȋzj|"U$j:&:ط,ADcң%oy[޽X󱰎j:yjjbDJ.1zuU _U6UЁ]ud@@r ľ#\-vq=zkӄdA#Fx3$˰*O9Oc,s"N{4-t)_~nyLҗfAM'hHٰkR[%|~$(p'2J7/(o}a3t-ن]Y~C'N G0-n RrkΌ䲯nJ<_Zg)R<&n yT{c7캷EQxkhlS`wkiXVQq'6`k*W Dvij~4NdCIj"l5j/Ի; |h͍"?uH|1l<^-ꗀM7m"f379tt?C8#IW{uP7$]?ɟ(5=їudhwjQ^ҜZ֓χh8})WأPiRțCfhS^QF~Dʎ`1UiP]s%4ā0iE\*BN:MD gVG4 10)23E!Q-9} v WYw%AykcC‹{GKZRb1|ӯl9.DŽfmϢ3  .#{E&@sJݖon6~ "}X>⇿dLO9Wzp0%%ZuaqC[b"7=•įnnꓶ^V˕?LxMd*5YZL/V"=5?zORƮ1JK'>a݉Ol氡(uZ[xۖeȿǏ(F)Xn=1=fFZ>3c7 4 g 0}"ur7E=N7B1~K7;]e4 f_Ί|dCGХCj.EC5o?4&&'ިn ^4xŭN2j8J2-3Jj yد  >:r3I*N1gR#KW[)V%9%p̗ȦSV8X= hYuE}ی/M[A$uYx 8 2_#f;^3 ;Β+nay5~e Uu `͞#h%1iLn{rLu.>ɘRCaU*t82N|/׭z0FG[d fFcO*kqHGIlbm:P'!RR%/+F,;l\Y7b!~^uȍ(IQ1eLESh{$niphF-t8&qI3a)sus܁,i3WQ%.|‡줌YobMӷZŠWa*DgI)D5 ! &{Xj5 }'XX\!<òFe16I:w ~Cp`N}jGbv3{"0R]q*y %m I~`Ȃ=4n i>Qgm*r|;("{VQ^ޒy|##%/ɔs>ۛƠ*%4#'3_!E.Oj*Wq"Tg6ZU@"$|C۶4"J*dAX+Hs> endobj 4 0 obj << /Ascent 690 /CapHeight 690 /Descent -209 /FontName /QQLJSA+NimbusRomNo9L-Medi /ItalicAngle 0 /StemV 140 /XHeight 461 /FontBBox [-168 -341 1000 960] /Flags 4 /CharSet (/fi/parenleft/parenright/period/zero/one/two/three/four/five/six/seven/eight/nine/A/B/C/D/E/F/G/H/I/L/M/N/O/P/R/S/T/U/V/W/X/Y/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/quotedblleft/quotedblright) /FontFile 5 0 R >> endobj 32 0 obj [556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 333 0 0 0 0 250 0 500 500 500 500 500 500 500 500 500 500 0 0 0 0 0 0 0 722 667 722 722 667 611 778 778 389 0 0 667 944 722 778 611 0 722 556 667 722 722 1000 722 722 0 0 0 0 0 0 0 500 556 444 556 444 333 500 556 278 0 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 500 ] endobj 13 0 obj << /Type /Pages /Count 6 /Kids [2 0 R 15 0 R 18 0 R 21 0 R 24 0 R 27 0 R] >> endobj 33 0 obj << /Type /Catalog /Pages 13 0 R >> endobj 34 0 obj << /Producer (pdfeTeX-1.30.4) /Creator (TeX) /CreationDate (D:20150810093635-04'00') /PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.30.4-2.2 (Web2C 7.5.5) kpathsea version 3.5.5) >> endobj xref 0 35 0000000000 65535 f 0000003123 00000 n 0000003018 00000 n 0000000015 00000 n 0000069515 00000 n 0000053293 00000 n 0000069348 00000 n 0000052325 00000 n 0000032767 00000 n 0000052158 00000 n 0000032299 00000 n 0000022119 00000 n 0000032132 00000 n 0000070359 00000 n 0000006347 00000 n 0000006239 00000 n 0000003214 00000 n 0000010413 00000 n 0000010305 00000 n 0000006427 00000 n 0000013603 00000 n 0000013495 00000 n 0000010493 00000 n 0000017069 00000 n 0000016961 00000 n 0000013683 00000 n 0000020152 00000 n 0000020044 00000 n 0000017149 00000 n 0000020232 00000 n 0000032556 00000 n 0000052822 00000 n 0000069921 00000 n 0000070452 00000 n 0000070503 00000 n trailer << /Size 35 /Root 33 0 R /Info 34 0 R /ID [<86C647F2B5BD2DDB5E3D30EE3622C3A6> <86C647F2B5BD2DDB5E3D30EE3622C3A6>] >> startxref 70708 %%EOF gsoap-2.8.91/config.h.in0000644000175000017500000001627513525245157014333 0ustar ellertellert/* config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if you have the `alarm' function. */ #undef HAVE_ALARM /* Define to 1 if you have the header file. */ #undef HAVE_ARPA_INET_H /* Define to 1 if you have the `asctime' function. */ #undef HAVE_ASCTIME /* Define to 1 if you have the `asctime_r' function. */ #undef HAVE_ASCTIME_R /* Define to 1 if you have the header file. */ #undef HAVE_CTYPE_H /* Define to 1 if you have the header file. */ #undef HAVE_ERRNO_H /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the header file. */ #undef HAVE_FLOAT_H /* Define to 1 if you have the `freelocale' function. */ #undef HAVE_FREELOCALE /* Define to 1 if you have the `ftime' function. */ #undef HAVE_FTIME /* Define to 1 if you have the `gethostbyname_r' function. */ #undef HAVE_GETHOSTBYNAME_R /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY /* Define to 1 if you have the `gmtime' function. */ #undef HAVE_GMTIME /* Define to 1 if you have the `gmtime_r' function. */ #undef HAVE_GMTIME_R /* Define to 1 if you have the header file. */ #undef HAVE_GNUTLS_GNUTLS_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* isinf */ #undef HAVE_ISINF /* isnan */ #undef HAVE_ISNAN /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if you have the header file. */ #undef HAVE_LOCALE_H /* Define to 1 if you have the `localtime_r' function. */ #undef HAVE_LOCALTIME_R /* Define to 1 if your system has a GNU libc compatible `malloc' function, and to 0 otherwise. */ #undef HAVE_MALLOC /* Define to 1 if you have the header file. */ #undef HAVE_MATH_H /* Define to 1 if you have the `mbtowc' function. */ #undef HAVE_MBTOWC /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the header file. */ #undef HAVE_NETDB_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H /* Define to 1 if you have the `newlocale' function. */ #undef HAVE_NEWLOCALE /* Define to 1 if you have the header file. */ #undef HAVE_OPENSSL_SSL_H /* Define to 1 if you have the `poll' function. */ #undef HAVE_POLL /* Define to 1 if you have the header file. */ #undef HAVE_POLL_H /* Define to 1 if you have the `random' function. */ #undef HAVE_RANDOM /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT /* Define to 1 if you have the `snprintf' function. */ #undef HAVE_SNPRINTF /* Define to 1 if you have the `socket' function. */ #undef HAVE_SOCKET /* Define to 1 if the system has the type `socklen_t'. */ #undef HAVE_SOCKLEN_T /* Define to 1 if you have the `sprintf_l' function. */ #undef HAVE_SPRINTF_L /* Define to 1 if you have the `sscanf' function. */ #undef HAVE_SSCANF /* Define to 1 if you have the `sscanf_l' function. */ #undef HAVE_SSCANF_L /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strchr' function. */ #undef HAVE_STRCHR /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the `strerror_r' function. */ #undef HAVE_STRERROR_R /* Define to 1 if you have the `strftime' function. */ #undef HAVE_STRFTIME /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strlcat' function. */ #undef HAVE_STRLCAT /* Define to 1 if you have the `strlcpy' function. */ #undef HAVE_STRLCPY /* Define to 1 if you have the `strrchr' function. */ #undef HAVE_STRRCHR /* Define to 1 if you have the `strstr' function. */ #undef HAVE_STRSTR /* Define to 1 if you have the `strtod' function. */ #undef HAVE_STRTOD /* Define to 1 if you have the `strtod_l' function. */ #undef HAVE_STRTOD_L /* Define to 1 if you have the `strtof' function. */ #undef HAVE_STRTOF /* Define to 1 if you have the `strtof_l' function. */ #undef HAVE_STRTOF_L /* Define to 1 if you have the `strtol' function. */ #undef HAVE_STRTOL /* Define to 1 if you have the `strtold' function. */ #undef HAVE_STRTOLD /* Define to 1 if you have the `strtold_l' function. */ #undef HAVE_STRTOLD_L /* Define to 1 if you have the `strtoll' function. */ #undef HAVE_STRTOLL /* Define to 1 if you have the `strtoul' function. */ #undef HAVE_STRTOUL /* Define to 1 if you have the `strtoull' function. */ #undef HAVE_STRTOULL /* Define to 1 if `tm_gmtoff' is a member of `struct tm'. */ #undef HAVE_STRUCT_TM_TM_GMTOFF /* Define to 1 if `__tm_gmtoff' is a member of `struct tm'. */ #undef HAVE_STRUCT_TM___TM_GMTOFF /* Define to 1 if you have the header file. */ #undef HAVE_SYS_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIMEB_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the `timegm' function. */ #undef HAVE_TIMEGM /* Define to 1 if you have the header file. */ #undef HAVE_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `uselocale' function. */ #undef HAVE_USELOCALE /* Define to 1 if you have the `wctomb' function. */ #undef HAVE_WCTOMB /* Define to 1 if you have the header file. */ #undef HAVE_XLOCALE_H /* Define to 1 if you have the header file. */ #undef HAVE_ZLIB_H /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define as the return type of signal handlers (`int' or `void'). */ #undef RETSIGTYPE /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if you can safely include both and . */ #undef TIME_WITH_SYS_TIME /* Define to 1 if your declares `struct tm'. */ #undef TM_IN_SYS_TIME /* Version number of package */ #undef VERSION /* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a `char[]'. */ #undef YYTEXT_POINTER /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to rpl_malloc if the replacement function should be used. */ #undef malloc /* Define to `unsigned int' if does not define. */ #undef size_t gsoap-2.8.91/depcomp0000755000175000017500000002752513525245157013665 0ustar ellertellert#! /bin/sh # depcomp - compile a program generating dependencies as side-effects # Copyright 1999, 2000 Free Software Foundation, Inc. # 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, 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. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # `libtool' can also be set to `yes' or `no'. depfile=${depfile-`echo "$object" | sed 's,\([^/]*\)$,.deps/\1,;s/\.\([^.]*\)$/.P\1/'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. This file always lives in the current directory. # Also, the AIX compiler puts `$object:' at the start of each line; # $object doesn't have directory information. stripped=`echo "$object" | sed -e 's,^.*/,,' -e 's/\(.*\)\..*$/\1/'` tmpdepfile="$stripped.u" outname="$stripped.o" if test "$libtool" = yes; then "$@" -Wc,-M else "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi if test -f "$tmpdepfile"; then # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; tru64) # The Tru64 AIX compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. tmpdepfile1="$object.d" tmpdepfile2=`echo "$object" | sed -e 's/.o$/.d/'` if test "$libtool" = yes; then "$@" -Wc,-MD else "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi if test -f "$tmpdepfile1"; then tmpdepfile="$tmpdepfile1" else tmpdepfile="$tmpdepfile2" fi if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a space and a tab in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the proprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. test -z "$dashmflag" && dashmflag=-M ( IFS=" " case " $* " in *" --mode=compile "*) # this is libtool, let us make it quiet for arg do # cycle over the arguments case "$arg" in "--mode=compile") # insert --quiet before "--mode=compile" set fnord "$@" --quiet shift # fnord ;; esac set fnord "$@" "$arg" shift # fnord shift # "$arg" done ;; esac "$@" $dashmflag | sed 's:^[^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" ) & proc=$! "$@" stat=$? wait "$proc" if test "$stat" != 0; then exit $stat; fi rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) # X makedepend ( shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift;; -*) ;; *) set fnord "$@" "$arg"; shift;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} 2>/dev/null -o"$obj_suffix" -f"$tmpdepfile" "$@" ) & proc=$! "$@" stat=$? wait "$proc" if test "$stat" != 0; then exit $stat; fi rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tail +3 "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the proprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. ( IFS=" " case " $* " in *" --mode=compile "*) for arg do # cycle over the arguments case $arg in "--mode=compile") # insert --quiet before "--mode=compile" set fnord "$@" --quiet shift # fnord ;; esac set fnord "$@" "$arg" shift # fnord shift # "$arg" done ;; esac "$@" -E | sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" ) & proc=$! "$@" stat=$? wait "$proc" if test "$stat" != 0; then exit $stat; fi rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the proprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. ( IFS=" " case " $* " in *" --mode=compile "*) for arg do # cycle over the arguments case $arg in "--mode=compile") # insert --quiet before "--mode=compile" set fnord "$@" --quiet shift # fnord ;; esac set fnord "$@" "$arg" shift # fnord shift # "$arg" done ;; esac "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" ) & proc=$! "$@" stat=$? wait "$proc" if test "$stat" != 0; then exit $stat; fi rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 gsoap-2.8.91/config.status.old0000755000175000017500000013727313525245157015604 0ustar ellertellert#! /bin/sh # Generated by configure. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=${CONFIG_SHELL-/bin/sh} ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH exec 6>&1 # Open the log real soon, to keep \$[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. Logging --version etc. is OK. exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX } >&5 cat >&5 <<_CSEOF This file was extended by gsoap $as_me 2.7, which was generated by GNU Autoconf 2.59. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ _CSEOF echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 echo >&5 config_files=" Makefile gsoap.pc gsoap++.pc gsoapck.pc gsoapck++.pc gsoapssl.pc gsoapssl++.pc gsoap/Makefile gsoap/src/Makefile gsoap/wsdl/Makefile gsoap/samples/Makefile gsoap/samples/calc/Makefile gsoap/samples/calc++/Makefile gsoap/samples/dime/Makefile gsoap/samples/dom/Makefile gsoap/samples/events/Makefile gsoap/samples/events++/Makefile gsoap/samples/factory/Makefile gsoap/samples/factorytest/Makefile gsoap/samples/gmt/Makefile gsoap/samples/googleapi/Makefile gsoap/samples/hello/Makefile gsoap/samples/httpcookies/Makefile gsoap/samples/lu/Makefile gsoap/samples/magic/Makefile gsoap/samples/mashup/Makefile gsoap/samples/mashup++/Makefile gsoap/samples/mtom/Makefile gsoap/samples/mtom-stream/Makefile gsoap/samples/polytest/Makefile gsoap/samples/roll/Makefile gsoap/samples/router/Makefile gsoap/samples/rss/Makefile gsoap/samples/ssl/Makefile gsoap/samples/udp/Makefile gsoap/samples/varparam/Makefile gsoap/samples/wsa/Makefile gsoap/samples/wsse/Makefile gsoap/samples/xml-rpc/Makefile" config_headers=" config.h" config_commands=" depfiles" ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." ac_cs_version="\ gsoap config.status 2.7 configured by ./configure, generated by GNU Autoconf 2.59, with options \"'--enable-samples'\" Copyright (C) 2003 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." srcdir=. INSTALL="/usr/bin/install -c" # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "x$1" : 'x\([^=]*\)='` ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` ac_shift=: ;; -*) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; *) # This is not an option, so the user has probably given explicit # arguments. ac_option=$1 ac_need_defaults=false;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --vers* | -V ) echo "$ac_cs_version"; exit 0 ;; --he | --h) # Conflict between --help and --header { { echo "$as_me:$LINENO: error: ambiguous option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi if $ac_cs_recheck; then echo "running /bin/sh ./configure " '--enable-samples' $ac_configure_extra_args " --no-create --no-recursion" >&6 exec /bin/sh ./configure '--enable-samples' $ac_configure_extra_args --no-create --no-recursion fi # # INIT-COMMANDS section. # AMDEP_TRUE="" ac_aux_dir="." for ac_config_target in $ac_config_targets do case "$ac_config_target" in # Handling of arguments. "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; "gsoap.pc" ) CONFIG_FILES="$CONFIG_FILES gsoap.pc" ;; "gsoap++.pc" ) CONFIG_FILES="$CONFIG_FILES gsoap++.pc" ;; "gsoapck.pc" ) CONFIG_FILES="$CONFIG_FILES gsoapck.pc" ;; "gsoapck++.pc" ) CONFIG_FILES="$CONFIG_FILES gsoapck++.pc" ;; "gsoapssl.pc" ) CONFIG_FILES="$CONFIG_FILES gsoapssl.pc" ;; "gsoapssl++.pc" ) CONFIG_FILES="$CONFIG_FILES gsoapssl++.pc" ;; "gsoap/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/Makefile" ;; "gsoap/src/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/src/Makefile" ;; "gsoap/wsdl/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/wsdl/Makefile" ;; "gsoap/samples/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/Makefile" ;; "gsoap/samples/calc/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/calc/Makefile" ;; "gsoap/samples/calc++/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/calc++/Makefile" ;; "gsoap/samples/dime/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/dime/Makefile" ;; "gsoap/samples/dom/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/dom/Makefile" ;; "gsoap/samples/events/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/events/Makefile" ;; "gsoap/samples/events++/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/events++/Makefile" ;; "gsoap/samples/factory/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/factory/Makefile" ;; "gsoap/samples/factorytest/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/factorytest/Makefile" ;; "gsoap/samples/gmt/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/gmt/Makefile" ;; "gsoap/samples/googleapi/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/googleapi/Makefile" ;; "gsoap/samples/hello/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/hello/Makefile" ;; "gsoap/samples/httpcookies/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/httpcookies/Makefile" ;; "gsoap/samples/lu/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/lu/Makefile" ;; "gsoap/samples/magic/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/magic/Makefile" ;; "gsoap/samples/mashup/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/mashup/Makefile" ;; "gsoap/samples/mashup++/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/mashup++/Makefile" ;; "gsoap/samples/mtom/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/mtom/Makefile" ;; "gsoap/samples/mtom-stream/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/mtom-stream/Makefile" ;; "gsoap/samples/polytest/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/polytest/Makefile" ;; "gsoap/samples/roll/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/roll/Makefile" ;; "gsoap/samples/router/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/router/Makefile" ;; "gsoap/samples/rss/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/rss/Makefile" ;; "gsoap/samples/ssl/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/ssl/Makefile" ;; "gsoap/samples/udp/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/udp/Makefile" ;; "gsoap/samples/varparam/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/varparam/Makefile" ;; "gsoap/samples/wsa/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsa/Makefile" ;; "gsoap/samples/wsse/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsse/Makefile" ;; "gsoap/samples/xml-rpc/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsoap/samples/xml-rpc/Makefile" ;; "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason to put it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Create a temporary directory, and hook for its removal unless debugging. $debug || { trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./confstat$$-$RANDOM (umask 077 && mkdir $tmp) } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } # # CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "$CONFIG_FILES"; then # Protect against being on the right side of a sed subst in config.status. sed 's/,@/@@/; s/@,/@@/; s/,;t t$/@;t t/; /@;t t$/s/[\\&,]/\\&/g; s/@@/,@/; s/@@/@,/; s/@;t t$/,;t t/' >$tmp/subs.sed <<\CEOF s,@SHELL@,/bin/sh,;t t s,@PATH_SEPARATOR@,:,;t t s,@PACKAGE_NAME@,gsoap,;t t s,@PACKAGE_TARNAME@,gsoap,;t t s,@PACKAGE_VERSION@,2.7,;t t s,@PACKAGE_STRING@,gsoap 2.7,;t t s,@PACKAGE_BUGREPORT@,,;t t s,@exec_prefix@,${prefix},;t t s,@prefix@,/usr/local,;t t s,@program_transform_name@,s,x,x,,;t t s,@bindir@,${exec_prefix}/bin,;t t s,@sbindir@,${exec_prefix}/sbin,;t t s,@libexecdir@,${exec_prefix}/libexec,;t t s,@datadir@,${prefix}/share,;t t s,@sysconfdir@,${prefix}/etc,;t t s,@sharedstatedir@,${prefix}/com,;t t s,@localstatedir@,${prefix}/var,;t t s,@libdir@,${exec_prefix}/lib,;t t s,@includedir@,${prefix}/include,;t t s,@oldincludedir@,/usr/include,;t t s,@infodir@,${prefix}/info,;t t s,@mandir@,${prefix}/man,;t t s,@build_alias@,,;t t s,@host_alias@,,;t t s,@target_alias@,,;t t s,@DEFS@,-DHAVE_CONFIG_H,;t t s,@ECHO_C@,,;t t s,@ECHO_N@,-n,;t t s,@ECHO_T@,,;t t s,@LIBS@,,;t t s,@INSTALL_PROGRAM@,${INSTALL},;t t s,@INSTALL_SCRIPT@,${INSTALL},;t t s,@INSTALL_DATA@,${INSTALL} -m 644,;t t s,@PACKAGE@,gsoap,;t t s,@VERSION@,2.7,;t t s,@ACLOCAL@,${SHELL} /Users/engelen/Projects/gsoap/gsoap-2.7/missing --run aclocal-1.6,;t t s,@AUTOCONF@,${SHELL} /Users/engelen/Projects/gsoap/gsoap-2.7/missing --run autoconf,;t t s,@AUTOMAKE@,${SHELL} /Users/engelen/Projects/gsoap/gsoap-2.7/missing --run automake-1.6,;t t s,@AUTOHEADER@,${SHELL} /Users/engelen/Projects/gsoap/gsoap-2.7/missing --run autoheader,;t t s,@MAKEINFO@,${SHELL} /Users/engelen/Projects/gsoap/gsoap-2.7/missing --run makeinfo,;t t s,@AMTAR@,${SHELL} /Users/engelen/Projects/gsoap/gsoap-2.7/missing --run tar,;t t s,@install_sh@,/Users/engelen/Projects/gsoap/gsoap-2.7/install-sh,;t t s,@STRIP@,,;t t s,@ac_ct_STRIP@,,;t t s,@INSTALL_STRIP_PROGRAM@,${SHELL} $(install_sh) -c -s,;t t s,@AWK@,awk,;t t s,@SET_MAKE@,,;t t s,@build@,i386-apple-darwin8.11.1,;t t s,@build_cpu@,i386,;t t s,@build_vendor@,apple,;t t s,@build_os@,darwin8.11.1,;t t s,@host@,i386-apple-darwin8.11.1,;t t s,@host_cpu@,i386,;t t s,@host_vendor@,apple,;t t s,@host_os@,darwin8.11.1,;t t s,@CXX@,g++,;t t s,@CXXFLAGS@,-g -O2,;t t s,@LDFLAGS@,,;t t s,@CPPFLAGS@,,;t t s,@ac_ct_CXX@,g++,;t t s,@EXEEXT@,,;t t s,@OBJEXT@,o,;t t s,@DEPDIR@,.deps,;t t s,@am__include@,include,;t t s,@am__quote@,,;t t s,@AMDEP_TRUE@,,;t t s,@AMDEP_FALSE@,#,;t t s,@AMDEPBACKSLASH@,\,;t t s,@CXXDEPMODE@,depmode=gcc3,;t t s,@CC@,gcc,;t t s,@CFLAGS@,-g -O2,;t t s,@ac_ct_CC@,gcc,;t t s,@CCDEPMODE@,depmode=gcc3,;t t s,@LEX@,flex,;t t s,@LEXLIB@,-lfl,;t t s,@LEX_OUTPUT_ROOT@,lex.yy,;t t s,@YACC@,bison -y,;t t s,@CPP@,gcc -E,;t t s,@RANLIB@,ranlib,;t t s,@ac_ct_RANLIB@,ranlib,;t t s,@LN_S@,ln -s,;t t s,@SAMPLE_EXTRA_LIBS@,,;t t s,@platform@,MACOSX,;t t s,@EGREP@,grep -E,;t t s,@LIBOBJS@,,;t t s,@DEBUG_COMPILE_TRUE@,#,;t t s,@DEBUG_COMPILE_FALSE@,,;t t s,@SOAPCPP2_DEBUG@,,;t t s,@SOAPCPP2_IMPORTPATH@,-DSOAPCPP_IMPORT_PATH="\"${prefix}/share/gsoap/import\"",;t t s,@WSDL2H_IMPORTPATH@,-DWSDL_IMPORT_PATH="\"${prefix}/share/gsoap/WS\"",;t t s,@SOAPCPP2_NONAMESPACES@,,;t t s,@WSDL2H_EXTRA_FLAGS@,-DWITH_OPENSSL -DWITH_GZIP,;t t s,@WSDL2H_EXTRA_LIBS@,-lssl -lcrypto -lz,;t t s,@WSDL2H_SOAP_CPP_LIB@,libgsoapssl++.a,;t t s,@ENABLE_SAMPLES_TRUE@,,;t t s,@ENABLE_SAMPLES_FALSE@,#,;t t s,@ENABLE_SAMPLES@,,;t t s,@SAMPLE_DIRS@,. samples,;t t s,@LEX_DEFINE@,-DWITH_FLEX,;t t s,@LEX_FLAGS@,-l,;t t s,@BISON_DEFINE@,-DWITH_BISON,;t t s,@YACC_LIB@,,;t t s,@LTLIBOBJS@,,;t t CEOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_lines=48 ac_sed_frag=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_lines # Line after last line for current file. ac_more_lines=: ac_sed_cmds= while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag else sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag fi if test ! -s $tmp/subs.frag; then ac_more_lines=false else # The purpose of the label and of the branching condition is to # speed up the sed processing (if there are no `@' at all, there # is no need to browse any of the substitutions). # These are the two extra sed commands mentioned above. (echo ':t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" else ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr $ac_sed_frag + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_lines` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi fi # test -n "$CONFIG_FILES" for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_builddir$INSTALL ;; esac if test x"$ac_file" != x-; then { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} rm -f "$ac_file" fi # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ if test x"$ac_file" = x-; then configure_input= else configure_input="$ac_file. " fi configure_input=$configure_input"Generated from `echo $ac_file_in | sed 's,.*/,,'` by configure." # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } echo "$f";; *) # Relative if test -f "$f"; then # Build tree echo "$f" elif test -f "$srcdir/$f"; then # Source tree echo "$srcdir/$f" else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } sed "/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; s/^[^=]*=[ ]*$//; } :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s,@configure_input@,$configure_input,;t t s,@srcdir@,$ac_srcdir,;t t s,@abs_srcdir@,$ac_abs_srcdir,;t t s,@top_srcdir@,$ac_top_srcdir,;t t s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t s,@builddir@,$ac_builddir,;t t s,@abs_builddir@,$ac_abs_builddir,;t t s,@top_builddir@,$ac_top_builddir,;t t s,@abs_top_builddir@,$ac_abs_top_builddir,;t t s,@INSTALL@,$ac_INSTALL,;t t " $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out rm -f $tmp/stdin if test x"$ac_file" != x-; then mv $tmp/out $ac_file else cat $tmp/out rm -f $tmp/out fi done # # CONFIG_HEADER section. # # These sed commands are passed to sed as "A NAME B NAME C VALUE D", where # NAME is the cpp macro being defined and VALUE is the value it is being given. # # ac_d sets the value in "#define NAME VALUE" lines. ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' ac_dB='[ ].*$,\1#\2' ac_dC=' ' ac_dD=',;t' # ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ac_uB='$,\1#\2define\3' ac_uC=' ' ac_uD=',;t' for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } # Do quote $f, to prevent DOS paths from being IFS'd. echo "$f";; *) # Relative if test -f "$f"; then # Build tree echo "$f" elif test -f "$srcdir/$f"; then # Source tree echo "$srcdir/$f" else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } # Remove the trailing spaces. sed 's/[ ]*$//' $ac_file_inputs >$tmp/in # Handle all the #define templates only if necessary. if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then # If there are no defines, we may have an empty if/fi : cat >$tmp/defines.sed <$tmp/out rm -f $tmp/in mv $tmp/out $tmp/in cat >$tmp/defines.sed <$tmp/out rm -f $tmp/in mv $tmp/out $tmp/in fi # grep # Handle all the #undef templates cat >$tmp/undefs.sed <$tmp/out rm -f $tmp/in mv $tmp/out $tmp/in cat >$tmp/undefs.sed <$tmp/out rm -f $tmp/in mv $tmp/out $tmp/in cat >$tmp/undefs.sed <$tmp/out rm -f $tmp/in mv $tmp/out $tmp/in # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ if test x"$ac_file" = x-; then echo "/* Generated by configure. */" >$tmp/config.h else echo "/* $ac_file. Generated by configure. */" >$tmp/config.h fi cat $tmp/in >>$tmp/config.h rm -f $tmp/in if test x"$ac_file" != x-; then if diff $ac_file $tmp/config.h >/dev/null 2>&1; then { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 echo "$as_me: $ac_file is unchanged" >&6;} else ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } rm -f $ac_file mv $tmp/config.h $ac_file fi else cat $tmp/config.h rm -f $tmp/config.h fi # Run the commands associated with the file. case $ac_file in config.h ) # update the timestamp echo 'timestamp for config.h' >"./stamp-h1" ;; esac done # # CONFIG_COMMANDS section. # for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue ac_dest=`echo "$ac_file" | sed 's,:.*,,'` ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_dir=`(dirname "$ac_dest") 2>/dev/null || $as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_dest" : 'X\(//\)[^/]' \| \ X"$ac_dest" : 'X\(//\)$' \| \ X"$ac_dest" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_dest" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 echo "$as_me: executing $ac_dest commands" >&6;} case $ac_dest in depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # So let's grep whole file. if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then dirpart=`(dirname "$mf") 2>/dev/null || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` else continue fi grep '^DEP_FILES *= *[^ #]' < "$mf" > /dev/null || continue # Extract the definition of DEP_FILES from the Makefile without # running `make'. DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"` test -z "$DEPDIR" && continue # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n -e '/^U = / s///p' < "$mf"` test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" # We invoke sed twice because it is the simplest approach to # changing $(DEPDIR) to its actual value in the expansion. for file in `sed -n -e ' /^DEP_FILES = .*\\\\$/ { s/^DEP_FILES = // :loop s/\\\\$// p n /\\\\$/ b loop p } /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`(dirname "$file") 2>/dev/null || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p $dirpart/$fdir else as_dir=$dirpart/$fdir as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} { (exit 1); exit 1; }; }; } # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ;; esac done { (exit 0); exit 0; } gsoap-2.8.91/INSTALL.txt0000644000175000017500000003346613525245163014155 0ustar ellertellert INSTALLATION ============ See the following sections below: - Installing gSOAP on Windows - Installing gSOAP on Windows with Cygwin or MinGW - Installing gSOAP on Mac OS X - Installing gSOAP on Unix/Linux - Installing gSOAP on Mac OS X/Unix/Linux without automake, Bison, and Flex - Installing gSOAP on other systems Installing gSOAP on Windows --------------------------- Windows (all versions) and WinCE are supported. Executables and source code are both included in the download package. This means that Windows developers can start right away. If you get an error "The application was unable to start correctly (0xc000007b). Click OK to close the application." when running wsdl2h.exe or soapcpp2.exe then upgrade to gSOAP 2.8.58 or later or download Microsoft Visual C++ Redistributable for Visual Studio 2015 from https://www.microsoft.com/en-us/download/details.aspx?id=48145 For VC++ examples, see the gsoap/VisualStudio2005 directory in the download package for examples that work with VisualStudio 2005 and later. The executables of the two gSOAP tools are located in the download package: - gsoap/bin/win32/wsdl2h.exe translator of WSDL/XSD to services and XML data bindings (interface tool) - gsoap/bin/win32/soapcpp2.exe code generator for services and XML data bindings (implementation tool) The wsdl2h.exe and soapcpp2.exe tools are invoked from the Windows command prompt or from within your IDE as a custom-build step in Visual Studio. Make sure that wsdl2h.exe and soapcpp2.exe can be launched/executed from the Windows command prompt. To do so, select My Computer / Properties / Advanced System Settings / Environment Variables. In the bottom pane select Path and click Edit. Add the full path ending with gsoap/bin/win32/ after the last ';'. You should now be able to execute wsdl2h.exe and soapcpp2.exe from the command line, or from Start / Run. To invoke wsdl2h.exe as a custom build step in Visual Studio C++ on a given input WSDL file, first select the project name in Solution Explorer then Property Pages from the View menu, see custom-build steps in Visual Studio http://msdn.microsoft.com/en-us/library/hefydhhy.aspx. Enter wsdl2h.exe -o service.h "FullPathToWSDLfile" as the Command Line property in Custom Build Step with the full path to the WSDL or the WSDL URL. Enter the generated gSOAP header file service.h as the Outputs property. Follow the same procedure to configure soapcpp2.exe to be invoked on this gSOAP header file (assuming you generated this file first), enter soapcpp2.exe "C:\Users/YourUserName\Documents\VisualStudio 20XX\Projects\YY\service.h" as a Command Line with YourUserName and XX and YY set as needed. Enter soapStub.h soapH.h soapC.cpp soapClient.cpp soapServer.cpp as Outputs. If you prefer generating client proxy and/or server web service classes using soapcpp2.exe -j then add the soapXYZProxy.h soapXYZProxy.cpp soapXYZService.h soapXYZService.cpp as Outputs as well. Run soapcpp2 by selecting the gSOAP header file and Compile. Add the generated files to your project's dependencies. To invoke wsdl2h.exe from the Windows command prompt, execute wsdl2h.exe on one or more WSDL and/or XSD files to generate code. Say you have a WSDL file service.wsdl. The steps to generate the service interface service.h and the client and server implementation source code files are: $ wsdl2h.exe -o service.h service.wsdl $ soapcpp2.exe -j service.h You can use wsdl2h.exe with URLs to WSDL and XSD files as well. But please note that wsdl2h.exe is not https-capable by default. To use https URLs it is perhaps easiest to download the WSDL and XSD files to a local directory with a browser and then apply wsdl2h.exe to the WSDL files and/or XSD files. Enabling https for wsdl2h.exe requires OpenSSL which takes much more effort to install and build with wsdl2h.exe. Your project should take the following dependences into account: - winsock2.h - ws2tcpip.h - ws2spi.h - Ws2_32.lib The ws2_32.lib dependence may require some steps. To do this in Visual Studio C++ for example, go to "Project", "settings", select the "Link" tab (the project file needs to be selected in the file view) and add ws2_32.lib to the "Object/library modules" entry Finally, note that the gSOAP distribution package contains a number of .c files. Mixing .c with .cpp files is not recommended with Visual Studio and will lead to runtime errors when building DLLs. Therefore, always rename .c files to .cpp files to use them in your C++ projects with Visual Studio. You are now ready to use gSOAP from the Windows shell command line or invoke the tools in Visual Studio as custom-build steps. Installing gSOAP on Windows with Cygwin or MinGW ------------------------------------------------ Read Installing gSOAP on Windows first and you can ignore the discussion of Visual Studio. You must link your code against -lws2_32 and use -DWITH_NO_C_LOCALE to compile. For example: $ soapcpp2.exe -j -CL calc.h $ c++ -DWITH_NO_C_LOCALE -o calcclient calcclient.cpp soapC.cpp soapcalcProxy.cpp stdsoap2.cpp -lws2_32 Later gSOAP releases may work without removing locale support with the -DWITH_NO_C_LOCALE option, so try compiling without this option first to see if this completes without reporting errors with locale_t or that xlocale.h could not be found. Install OpenSSL and Zlib libraries to enable HTTPS and HTTP compression. Cygwin users should select openssl-devel source and zlib-devel source to install. Otherwise, the OpenSSL and Zlib header files cannot be found. Tip: when autoconf, automake, flex, bison, openssl-devel, and zlib-devel are installed you can run configure to build the gSOAP tools and libraries as follows: $ ./configure $ make $ make install Installing gSOAP on Mac OS X ---------------------------- It is recommended to install gSOAP per installation instructions for Unix/Linux as described below. We strongly recommend to download the latest version of OpenSSL to build the tools. Use an installation tool such as Macports https://www.macports.org or Homebrew http://brew.sh to install OpenSSL: First install the Xcode command line tools, then Flex, Bison, and OpenSSL: $ xcode-select -install $ sudo port install flex bison openssl Then execute: $ cd gsoap-2.8 $ ./configure --with-openssl=/usr/local/opt/openssl $ make $ sudo make install For convenience we also included Mac OS X binaries of the tools in the download package, but built without OpenSSL: - gsoap/bin/macosx/wsdl2h translator of WSDL/XSD to services and XML data bindings (interface tool) - gsoap/bin/macosx/soapcpp2 code generator for services and XML data bindings (implementation tool) Use -I/usr/local/opt/openssl/include and -L/usr/local/opt/openssl/lib to compile your code. Instead of the gsoap/libgsoapXX.a libraries, you can compile and link the source code gsoap/stdsoap2.c and gsoap/stdsoap2.cpp directly in your project builds. When compiling these source files you can enable SSL, GZIP, HTTP cookies, IPv6 support using the following compiler flags: -DWITH_OPENSSL to enable SSL, link with OpenSSL -DWITH_GNUTLS to enable SSL, link with GNUTLS -DWITH_GZIP to enable compression, link with Zlib -DWITH_COOKIES to enable HTTP cookies -DWITH_IPV6 to enable IPv6 -DWITH_C_LOCALE to force C locale, for proper use of decimal point in floats -DWITH_NO_C_LOCALE no C locale, if there are errors for locale_t or xlocale.h -DWITH_DOM to enable DOM for WS-Security, link with dom.c (or dom.cpp) These flags should be used to compile *ALL* of your source code files to ensure consistency. There is also a MacPorts https://macports.org port of gSOAP available. To install, execute: $ port list gsoap $ port install gsoap Before installing, check the release version of gSOAP on MacPorts against the changelog https://www.genivia.com/changelog.html to determine if the MacPorts version is up to date. Installing gSOAP on Unix/Linux ------------------------------ After unpacking the .zip file, install the gSOAP software on Unix/Linux systems as follows: $ ./configure $ make $ sudo make install For the last step use admin (root) permissions (e.g. using sudo). To install the executables in a local folder, say in $HOME/bin without requiring root access, use: $ ./configure $ make $ sudo make install exec_prefix=$HOME The ./configure command takes the following configuration options: --enable-samples also builds the examples --enable-ipv6 builds the library with IPv6 support (-DWITH_IPV6) --enable-ipv6-v6only builds the library with IPv6 support (-DWITH_IPV6_V6ONLY) --disable-ssl removes all dependences on OpenSSL from the tools and libraries --enable-gnutls replaces the dependence on OpenSSL by GNU TLS (-DWITH_GNUTLS) --enable-debug builds the software (-DDEBUG) to produce audit logs (slow!) --disable-namespaces removes global namespaces table linkage requirement --disable-c-locale removes the C locale and locale_t (-DWITH_NO_C_LOCALE) --with-openssl=DIR specifies the OpenSSL installation directory --with-zlib=DIR specifies the Zlib installation directory After successful configuration and completion of the build steps, the following two tools are produced: - gsoap/bin/wsdl2h translator of WSDL/XSD to services and XML data bindings - gsoap/bin/soapcpp2 code generator for services and XML data bindings The following libraries are produced depending on the configuration options: - gsoap/libgsoap++.a the C++ runtime engine (plain, no HTTPS) - gsoap/libgsoapssl++.a the C++ runtime engine, DOM, cookies, zlib, and SSL - gsoap/libgsoap.a the C runtime engine (plain, no HTTPS) - gsoap/libgsoapssl.a the C runtime engine, DOM, cookies, zlib, and SSL If you got these files, you are now ready to use gSOAP. If the above fails, then please verify that you have: - Automake tools installed (make and GNU m4) - Bison installed from www.gnu.org/software/bison or Yacc - Flex installed from flex.sourceforge.net - OpenSSL from www.openssl.org or GNUTLS from www.gnu.org/software/gnutls - Optionally Zlib to support compression from www.zlib.net. To build the tools and libraries without SSL/TLS (i.e. removing HTTPS support and WS-Security support from wsdl2h and the libraries), rerun: $ ./configure --disable-ssl $ make $ sudo make install For the last step use admin (root) permissions (e.g. using sudo) or use exec_prefix to install locally (see above). If you are having trouble with automake, Bison, or Flex then see the additional instructions below. Installing gSOAP on Mac OS X/Unix/Linux without automake, Bison, and Flex ------------------------------------------------------------------------- If automake, Bison, and Flex are not installed on your system and you cannot get these to install, then build the wsdl2h and soapcpp2 tools as follows: $ cd gsoap/src $ make -f MakefileManual soapcpp2 $ cd gsoap/wsdl $ make -f MakefileManual secure If this fails to build soapcpp2 because the files gsoap/src/lex.yy.c, gsoap/src/soapcpp2_yacc.tab.h (or gsoap/src/soapcpp2_yacc.h), and gsoap/src/soapcpp2_yacc.tab.c (or gsoap/src/soapcpp2_yacc.c) were removed in a prior build attempt, then please unarchive the gSOAP package content again to retrieve these original files and redo the steps above. If you do not have OpenSSL installed, then building a https-capable wsdl2h fails. To build wsdl2h without OpenSSL for https: $ cd gsoap/wsdl $ make -f MakefileManual This produces: - gsoap/bin/wsdl2h translator of WSDL/XSD to services and XML data bindings - gsoap/bin/soapcpp2 code generator for services and XML data bindings Instead of the gsoap/libgsoapXX.a libraries (which were not produced), you can compile and link the source code gsoap/stdsoap2.c (for C) and gsoap/stdsoap2.cpp (for C++) directly in your project builds. When compiling these source files you can enable SSL, GZIP, HTTP cookies, IPv6 support using the following compiler flags: -DWITH_OPENSSL to enable SSL, link with OpenSSL -DWITH_GNUTLS to enable SSL, link with GNUTLS -DWITH_GZIP to enable compression, link with Zlib -DWITH_COOKIES to enable HTTP cookies -DWITH_IPV6 to enable IPv6 -DWITH_C_LOCALE to force C locale -DWITH_NO_C_LOCALE no locale, in case of compiler errors with locale_t -DWITH_DOM to enable DOM for WS-Security, link with dom.c (or dom.cpp) These flags should be used to compile ALL of your source code files to ensure consistency. Note 1: to use clang instead of GCC: $ cd gsoap/src $ make CC=clang -f MakefileManual soapcpp2 $ cd gsoap/wsdl $ make CC=clang CPP=clang++ -f MakefileManual secure Note 2: some systems may require additional libraries, for example Sun OS: $ cd gsoap/wsdl $ make CC=CC CPP=CC SOCKLIB='-lsocket -lnsl -lxnet' -f MakefileManual secure Note 3: to use Yacc instead of Bison: $ cd gsoap/src $ make YACC='yacc -d -v -s soapcpp2_yacc' CMFLAGS='-DWITH_YACC -DWITH_FLEX' -f MakefileManual You are now ready to use gSOAP. Installing gSOAP on other systems --------------------------------- Having trouble installing gSOAP on other systems? If you are unable to build the wsdl2h and soapcpp2 tools on your system, then install the tools on a supported system to generate source code and copy the code cross platforms. The generated source code is portable and platform independent. The gSOAP engine, library, and plugins can be compiled on a wide range of platforms to complete your project builds. For TandemNonStop installation and usage, see the gsoap/TandemNonStop directory in the gSOAP package for instructions. iOS is supported, see the gsoap/ios_plugin directory in the download package. Symbian support is no longer included in the most recent releases. Please inquire for assistance. Palm OS support is no longer included in the most recent releases. The latest stable release with Palm OS support is gSOAP 2.7.8c. gsoap-2.8.91/gsoapssl++.pc.in0000644000175000017500000000051313525245163015203 0ustar ellertellertprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: GSoap Description: SOAP C++ Web Services with SSL, ZLIB, DOM Version: 2.8.91 Requires: Libs: -L${libdir} -lgsoapssl++ Libs.private: @SAMPLE_SSL_LIBS@ @SAMPLE_EXTRA_LIBS@ Cflags: @SOAPCPP2_IPV6@ @WSDL2H_EXTRA_FLAGS@ -DWITH_DOM -I${includedir} gsoap-2.8.91/Makefile.in0000644000175000017500000007435013525245163014350 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ ####### This is the input file for automake, which will generate Makefile.in ########## VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = gsoap.pc gsoap++.pc gsoapck.pc gsoapck++.pc \ gsoapssl.pc gsoapssl++.pc CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgconfigdir)" DATA = $(pkgconfig_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir distdir-am dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(srcdir)/gsoap++.pc.in $(srcdir)/gsoap.pc.in \ $(srcdir)/gsoapck++.pc.in $(srcdir)/gsoapck.pc.in \ $(srcdir)/gsoapssl++.pc.in $(srcdir)/gsoapssl.pc.in compile \ config.guess config.sub depcomp install-sh missing \ mkinstalldirs ylwrap DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = . gsoap CLEANFILES = *~ VERYVERYCLEANFILES = *~ configure Makefile.in compile config.guess config.sub config.log autoscan.log \ depcomp install-sh missing mkinstalldirs stamp-h.in config.h.in \ aclocal.m4 *.cache Makefile AUTOMAKE_OPTIONS = foreign 1.4 pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = gsoap.pc gsoap++.pc gsoapck.pc gsoapck++.pc gsoapssl.pc gsoapssl++.pc EXTRA_DIST = gsoap.pc.in gsoap++.pc.in gsoapck.pc.in gsoapck++.pc.in gsoapssl.pc.in gsoapssl++.pc.in all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 gsoap.pc: $(top_builddir)/config.status $(srcdir)/gsoap.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ gsoap++.pc: $(top_builddir)/config.status $(srcdir)/gsoap++.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ gsoapck.pc: $(top_builddir)/config.status $(srcdir)/gsoapck.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ gsoapck++.pc: $(top_builddir)/config.status $(srcdir)/gsoapck++.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ gsoapssl.pc: $(top_builddir)/config.status $(srcdir)/gsoapssl.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ gsoapssl++.pc: $(top_builddir)/config.status $(srcdir)/gsoapssl++.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(DATA) config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(pkgconfigdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-pkgconfigDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-pkgconfigDATA .MAKE: $(am__recursive_targets) all install-am install-data-am \ install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-generic distclean-hdr \ distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-data-hook install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgconfigDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-pkgconfigDATA .PRECIOUS: Makefile .PHONY: backup install-data-hook: echo "+--------------------------------------------------------+"; \ echo "| You now have successfully built and installed gsoap. |"; \ echo "| |"; \ echo "| You can link your programs with -lgsoap++ for |"; \ echo "| C++ projects created with soapcpp2 and you can link |"; \ echo "| with -lgsoap for C projects generated with soapcpp2 -c |"; \ echo "| |"; \ echo "| There are also corresponding libraries for SSL and |"; \ echo "| zlib compression support (-lgsoapssl and lgsoapssl++) |"; \ echo "| which require linking -lssl -lcrypto -lz |"; \ echo "| |"; \ echo "| Thanks for using gsoap. |"; \ echo "| |"; \ echo "| http://sourceforge.net/projects/gsoap2 |"; \ echo "+--------------------------------------------------------+"; reallyveryveryclean: $(MAKE) distclean for file in $(VERYVERYCLEANFILES);do rm -rf $(VERYVERYCLEANFILES);done; backup: $(MAKE) clean $(MAKE) distclean CURRENTDIR=`pwd` && \ BACKUPDIR=`basename $$CURRENTDIR` && \ cd .. && \ tar -czhf $$BACKUPDIR.tgz $$BACKUPDIR && \ cd $$BACKUPDIR && \ ls -l $$CURRENTDIR.tgz # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/ylwrap0000755000175000017500000001531413525245163013542 0ustar ellertellert#! /bin/sh # ylwrap - wrapper for lex/yacc invocations. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1996-2018 Free Software Foundation, Inc. # # Written by Tom Tromey . # # 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, 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . get_dirname () { case $1 in */*|*\\*) printf '%s\n' "$1" | sed -e 's|\([\\/]\)[^\\/]*$|\1|';; # Otherwise, we want the empty string (not "."). esac } # guard FILE # ---------- # The CPP macro used to guard inclusion of FILE. guard () { printf '%s\n' "$1" \ | sed \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \ -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g' \ -e 's/__*/_/g' } # quote_for_sed [STRING] # ---------------------- # Return STRING (or stdin) quoted to be used as a sed pattern. quote_for_sed () { case $# in 0) cat;; 1) printf '%s\n' "$1";; esac \ | sed -e 's|[][\\.*]|\\&|g' } case "$1" in '') echo "$0: No files given. Try '$0 --help' for more information." 1>&2 exit 1 ;; --basedir) basedir=$2 shift 2 ;; -h|--h*) cat <<\EOF Usage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]... Wrapper for lex/yacc invocations, renaming files as desired. INPUT is the input file OUTPUT is one file PROG generates DESIRED is the file we actually want instead of OUTPUT PROGRAM is program to run ARGS are passed to PROG Any number of OUTPUT,DESIRED pairs may be used. Report bugs to . EOF exit $? ;; -v|--v*) echo "ylwrap $scriptversion" exit $? ;; esac # The input. input=$1 shift # We'll later need for a correct munging of "#line" directives. input_sub_rx=`get_dirname "$input" | quote_for_sed` case $input in [\\/]* | ?:[\\/]*) # Absolute path; do nothing. ;; *) # Relative path. Make it absolute. input=`pwd`/$input ;; esac input_rx=`get_dirname "$input" | quote_for_sed` # Since DOS filename conventions don't allow two dots, # the DOS version of Bison writes out y_tab.c instead of y.tab.c # and y_tab.h instead of y.tab.h. Test to see if this is the case. y_tab_nodot=false if test -f y_tab.c || test -f y_tab.h; then y_tab_nodot=true fi # The parser itself, the first file, is the destination of the .y.c # rule in the Makefile. parser=$1 # A sed program to s/FROM/TO/g for all the FROM/TO so that, for # instance, we rename #include "y.tab.h" into #include "parse.h" # during the conversion from y.tab.c to parse.c. sed_fix_filenames= # Also rename header guards, as Bison 2.7 for instance uses its header # guard in its implementation file. sed_fix_header_guards= while test $# -ne 0; do if test x"$1" = x"--"; then shift break fi from=$1 # Handle y_tab.c and y_tab.h output by DOS if $y_tab_nodot; then case $from in "y.tab.c") from=y_tab.c;; "y.tab.h") from=y_tab.h;; esac fi shift to=$1 shift sed_fix_filenames="${sed_fix_filenames}s|"`quote_for_sed "$from"`"|$to|g;" sed_fix_header_guards="${sed_fix_header_guards}s|"`guard "$from"`"|"`guard "$to"`"|g;" done # The program to run. prog=$1 shift # Make any relative path in $prog absolute. case $prog in [\\/]* | ?:[\\/]*) ;; *[\\/]*) prog=`pwd`/$prog ;; esac dirname=ylwrap$$ do_exit="cd '`pwd`' && rm -rf $dirname > /dev/null 2>&1;"' (exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 mkdir $dirname || exit 1 cd $dirname case $# in 0) "$prog" "$input" ;; *) "$prog" "$@" "$input" ;; esac ret=$? if test $ret -eq 0; then for from in * do to=`printf '%s\n' "$from" | sed "$sed_fix_filenames"` if test -f "$from"; then # If $2 is an absolute path name, then just use that, # otherwise prepend '../'. case $to in [\\/]* | ?:[\\/]*) target=$to;; *) target=../$to;; esac # Do not overwrite unchanged header files to avoid useless # recompilations. Always update the parser itself: it is the # destination of the .y.c rule in the Makefile. Divert the # output of all other files to a temporary file so we can # compare them to existing versions. if test $from != $parser; then realtarget=$target target=tmp-`printf '%s\n' "$target" | sed 's|.*[\\/]||g'` fi # Munge "#line" or "#" directives. Don't let the resulting # debug information point at an absolute srcdir. Use the real # output file name, not yy.lex.c for instance. Adjust the # include guards too. sed -e "/^#/!b" \ -e "s|$input_rx|$input_sub_rx|" \ -e "$sed_fix_filenames" \ -e "$sed_fix_header_guards" \ "$from" >"$target" || ret=$? # Check whether files must be updated. if test "$from" != "$parser"; then if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then echo "$to is unchanged" rm -f "$target" else echo "updating $to" mv -f "$target" "$realtarget" fi fi else # A missing file is only an error for the parser. This is a # blatant hack to let us support using "yacc -d". If -d is not # specified, don't fail when the header file is "missing". if test "$from" = "$parser"; then ret=1 fi fi done fi # Remove the directory. cd .. rm -rf $dirname exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: gsoap-2.8.91/install-sh0000755000175000017500000003601013525245163014276 0ustar ellertellert#!/bin/sh # install - install a program, script, or datafile scriptversion=2018-03-11.20; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dstbase=`basename "$src"` case $dst in */) dst=$dst$dstbase;; *) dst=$dst/$dstbase;; esac dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi case $dstdir in */) dstdirslash=$dstdir;; *) dstdirslash=$dstdir/;; esac obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) # Note that $RANDOM variable is not portable (e.g. dash); Use it # here however when possible just to lower collision chance. tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 # Because "mkdir -p" follows existing symlinks and we likely work # directly in world-writeable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p' feature. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=${dstdirslash}_inst.$$_ rmtmp=${dstdirslash}_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: gsoap-2.8.91/makemake0000755000175000017500000000162113525245163013773 0ustar ellertellert#! /bin/sh aclocal autoheader rm -f missing automake --add-missing autoconf automake ./configure --enable-samples --enable-ipv6-v6only --with-openssl=/usr/local/opt/openssl rm -f gsoap/*.o rm -f gsoap/wsdl/wsdlC.cpp rm -f gsoap/wsdl/*.o rm -f gsoap/src/*.o rm -f gsoap/samples/*/*.o rm -f gsoap/samples/*/soapStub.h rm -f gsoap/samples/*/soapH.h rm -f gsoap/samples/*/soapC.c rm -f gsoap/samples/*/soapC.cpp rm -f gsoap/samples/databinding/addressC.cpp rm -f gsoap/samples/chaining/envC.c rm -f gsoap/samples/chaining/qServerLib.c rm -f gsoap/samples/chaining/cServerLib.c rm -f gsoap/samples/chaining++/envC.cpp rm -f gsoap/samples/chaining++/QuotequoteService.cpp rm -f gsoap/samples/chaining++/CalccalcService.cpp cd gsoap/samples/calc_xcode; soapcpp2 -i -wx -C calc.h; cd - cd gsoap/samples/calc_vs2005/calc_vs2005; soapcpp2 -i -wx -C calc.h; cd - echo "Please run the following command now:" echo "make" gsoap-2.8.91/missing0000755000175000017500000001533613525245163013701 0ustar ellertellert#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1996-2018 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # 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, 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=https://www.perl.org/ flex_URL=https://github.com/westes/flex gnu_software_URL=https://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: gsoap-2.8.91/gsoapck.pc.in0000644000175000017500000000045713525245163014660 0ustar ellertellertprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: GSoap Description: SOAP C Web Services with Cookies Enabled Version: 2.8.91 Requires: Libs: -L${libdir} -lgsoapck Libs.private: @SAMPLE_EXTRA_LIBS@ Cflags: @SOAPCPP2_IPV6@ -DWITH_COOKIES -DWITH_DOM -I${includedir} gsoap-2.8.91/stamp-h.in0000644000175000017500000000001213525245163014164 0ustar ellertellerttimestamp gsoap-2.8.91/config.guess.old0000755000175000017500000012706313525245157015403 0ustar ellertellert#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, # Inc. timestamp='2007-07-22' # This file 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., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:[3456]*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; EM64T | authenticamd) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; xtensa:Linux:*:*) echo xtensa-unknown-linux-gnu exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^LIBC/{ s: ::g p }'`" test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit } test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: gsoap-2.8.91/autom4te.cache/0000755000175000017500000000000013525245157015101 5ustar ellertellertgsoap-2.8.91/autom4te.cache/traces.40000644000175000017500000014261413525245157016457 0ustar ellertellertm4trace:/opt/local/share/aclocal-1.15/amversion.m4:20: -1- AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.15' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.15.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) m4trace:/opt/local/share/aclocal-1.15/amversion.m4:37: -1- AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.15.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) m4trace:/opt/local/share/aclocal-1.15/auxdir.m4:51: -1- AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) m4trace:/opt/local/share/aclocal-1.15/cond.m4:32: -1- AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) m4trace:/opt/local/share/aclocal-1.15/depend.m4:156: -1- AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) m4trace:/opt/local/share/aclocal-1.15/depend.m4:166: -1- AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) m4trace:/opt/local/share/aclocal-1.15/depend.m4:189: -1- AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) m4trace:/opt/local/share/aclocal-1.15/depout.m4:61: -1- AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ]) m4trace:/opt/local/share/aclocal-1.15/depout.m4:75: -1- AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) m4trace:/opt/local/share/aclocal-1.15/init.m4:171: -1- AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) m4trace:/opt/local/share/aclocal-1.15/init.m4:198: -1- AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) m4trace:/opt/local/share/aclocal-1.15/install-sh.m4:21: -1- AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) m4trace:/opt/local/share/aclocal-1.15/lead-dot.m4:19: -1- AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) m4trace:/opt/local/share/aclocal-1.15/lex.m4:19: -1- AC_DEFUN([AM_PROG_LEX], [AC_PREREQ([2.50])dnl AC_REQUIRE([AM_MISSING_HAS_RUN])dnl AC_REQUIRE([AC_PROG_LEX])dnl if test "$LEX" = :; then LEX=${am_missing_run}flex fi]) m4trace:/opt/local/share/aclocal-1.15/make.m4:49: -1- AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) m4trace:/opt/local/share/aclocal-1.15/missing.m4:14: -1- AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) m4trace:/opt/local/share/aclocal-1.15/missing.m4:38: -1- AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) m4trace:/opt/local/share/aclocal-1.15/obsolete.m4:15: -1- AC_DEFUN([AM_CONFIG_HEADER], [AC_DIAGNOSE([obsolete], ['$0': this macro is obsolete. You should use the 'AC][_CONFIG_HEADERS' macro instead.])dnl AC_CONFIG_HEADERS($@)]) m4trace:/opt/local/share/aclocal-1.15/obsolete.m4:24: -1- AC_DEFUN([AM_PROG_CC_STDC], [AC_PROG_CC am_cv_prog_cc_stdc=$ac_cv_prog_cc_stdc AC_DIAGNOSE([obsolete], ['$0': this macro is obsolete. You should simply use the 'AC][_PROG_CC' macro instead. Also, your code should no longer depend upon 'am_cv_prog_cc_stdc', but upon 'ac_cv_prog_cc_stdc'.])]) m4trace:/opt/local/share/aclocal-1.15/obsolete.m4:27: -1- AC_DEFUN([AM_C_PROTOTYPES], [AC_FATAL([automatic de-ANSI-fication support has been removed])]) m4trace:/opt/local/share/aclocal-1.15/obsolete.m4:28: -1- AU_DEFUN([fp_C_PROTOTYPES], [AM_C_PROTOTYPES]) m4trace:/opt/local/share/aclocal-1.15/obsolete.m4:28: -1- AC_DEFUN([fp_C_PROTOTYPES], [AC_DIAGNOSE([obsolete], [The macro `fp_C_PROTOTYPES' is obsolete. You should run autoupdate.])dnl AM_C_PROTOTYPES]) m4trace:/opt/local/share/aclocal-1.15/options.m4:12: -1- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) m4trace:/opt/local/share/aclocal-1.15/options.m4:18: -1- AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) m4trace:/opt/local/share/aclocal-1.15/options.m4:24: -1- AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) m4trace:/opt/local/share/aclocal-1.15/options.m4:30: -1- AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) m4trace:/opt/local/share/aclocal-1.15/prog-cc-c-o.m4:44: -1- AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) m4trace:/opt/local/share/aclocal-1.15/prog-cc-c-o.m4:47: -1- AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) m4trace:/opt/local/share/aclocal-1.15/runlog.m4:17: -1- AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) m4trace:/opt/local/share/aclocal-1.15/sanity.m4:82: -1- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) m4trace:/opt/local/share/aclocal-1.15/silent.m4:60: -1- AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) m4trace:/opt/local/share/aclocal-1.15/strip.m4:28: -1- AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) m4trace:/opt/local/share/aclocal-1.15/substnot.m4:12: -1- AC_DEFUN([_AM_SUBST_NOTMAKE]) m4trace:/opt/local/share/aclocal-1.15/substnot.m4:17: -1- AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) m4trace:/opt/local/share/aclocal-1.15/tar.m4:132: -1- AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^_?A[CHUM]_]) m4trace:configure.ac:2: -1- m4_pattern_forbid([_AC_]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) m4trace:configure.ac:2: -1- m4_pattern_allow([^AS_FLAGS$]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^_?m4_]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^dnl$]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^_?AS_]) m4trace:configure.ac:2: -1- m4_pattern_allow([^SHELL$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PATH_SEPARATOR$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^exec_prefix$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^prefix$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^program_transform_name$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^bindir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^sbindir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^libexecdir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^datarootdir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^datadir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^sysconfdir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^sharedstatedir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^localstatedir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^includedir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^oldincludedir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^docdir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^infodir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^htmldir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^dvidir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^pdfdir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^psdir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^libdir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^localedir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^mandir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^DEFS$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^ECHO_C$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^ECHO_N$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^ECHO_T$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^build_alias$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^host_alias$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^target_alias$]) m4trace:configure.ac:3: -1- AM_INIT_AUTOMAKE([foreign]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) m4trace:configure.ac:3: -1- AM_SET_CURRENT_AUTOMAKE_VERSION m4trace:configure.ac:3: -1- AM_AUTOMAKE_VERSION([1.15.1]) m4trace:configure.ac:3: -1- _AM_AUTOCONF_VERSION([2.69]) m4trace:configure.ac:3: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^INSTALL_DATA$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^am__isrc$]) m4trace:configure.ac:3: -1- _AM_SUBST_NOTMAKE([am__isrc]) m4trace:configure.ac:3: -1- m4_pattern_allow([^CYGPATH_W$]) m4trace:configure.ac:3: -1- _AM_SET_OPTIONS([foreign]) m4trace:configure.ac:3: -1- _AM_SET_OPTION([foreign]) m4trace:configure.ac:3: -2- _AM_MANGLE_OPTION([foreign]) m4trace:configure.ac:3: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.ac:3: -1- _AM_IF_OPTION([no-define], [], [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])]) m4trace:configure.ac:3: -2- _AM_MANGLE_OPTION([no-define]) m4trace:configure.ac:3: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.ac:3: -1- AM_SANITY_CHECK m4trace:configure.ac:3: -1- AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) m4trace:configure.ac:3: -1- AM_MISSING_HAS_RUN m4trace:configure.ac:3: -1- AM_AUX_DIR_EXPAND m4trace:configure.ac:3: -1- m4_pattern_allow([^ACLOCAL$]) m4trace:configure.ac:3: -1- AM_MISSING_PROG([AUTOCONF], [autoconf]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AUTOCONF$]) m4trace:configure.ac:3: -1- AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AUTOMAKE$]) m4trace:configure.ac:3: -1- AM_MISSING_PROG([AUTOHEADER], [autoheader]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AUTOHEADER$]) m4trace:configure.ac:3: -1- AM_MISSING_PROG([MAKEINFO], [makeinfo]) m4trace:configure.ac:3: -1- m4_pattern_allow([^MAKEINFO$]) m4trace:configure.ac:3: -1- AM_PROG_INSTALL_SH m4trace:configure.ac:3: -1- m4_pattern_allow([^install_sh$]) m4trace:configure.ac:3: -1- AM_PROG_INSTALL_STRIP m4trace:configure.ac:3: -1- m4_pattern_allow([^STRIP$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^MKDIR_P$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^mkdir_p$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AWK$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^SET_MAKE$]) m4trace:configure.ac:3: -1- AM_SET_LEADING_DOT m4trace:configure.ac:3: -1- m4_pattern_allow([^am__leading_dot$]) m4trace:configure.ac:3: -1- _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) m4trace:configure.ac:3: -2- _AM_MANGLE_OPTION([tar-ustar]) m4trace:configure.ac:3: -1- _AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])]) m4trace:configure.ac:3: -2- _AM_MANGLE_OPTION([tar-pax]) m4trace:configure.ac:3: -1- _AM_PROG_TAR([v7]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AMTAR$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^am__tar$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^am__untar$]) m4trace:configure.ac:3: -1- _AM_IF_OPTION([no-dependencies], [], [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) m4trace:configure.ac:3: -2- _AM_MANGLE_OPTION([no-dependencies]) m4trace:configure.ac:3: -1- AM_SILENT_RULES m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_V$]) m4trace:configure.ac:3: -1- AM_SUBST_NOTMAKE([AM_V]) m4trace:configure.ac:3: -1- _AM_SUBST_NOTMAKE([AM_V]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_DEFAULT_V$]) m4trace:configure.ac:3: -1- AM_SUBST_NOTMAKE([AM_DEFAULT_V]) m4trace:configure.ac:3: -1- _AM_SUBST_NOTMAKE([AM_DEFAULT_V]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_DEFAULT_VERBOSITY$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_BACKSLASH$]) m4trace:configure.ac:3: -1- _AM_SUBST_NOTMAKE([AM_BACKSLASH]) m4trace:configure.ac:5: -1- m4_pattern_allow([^build$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^build_cpu$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^build_vendor$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^build_os$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^host$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^host_cpu$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^host_vendor$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^host_os$]) m4trace:configure.ac:8: -1- AM_CONFIG_HEADER([config.h]) m4trace:configure.ac:8: -1- _m4_warn([obsolete], ['AM_CONFIG_HEADER': this macro is obsolete. You should use the 'AC_CONFIG_HEADERS' macro instead.], [/opt/local/share/aclocal-1.15/obsolete.m4:15: AM_CONFIG_HEADER is expanded from... configure.ac:8: the top level]) m4trace:configure.ac:11: -1- m4_pattern_allow([^SET_MAKE$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CXX$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CXXFLAGS$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CXX$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^ac_ct_CXX$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^EXEEXT$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^OBJEXT$]) m4trace:configure.ac:13: -1- _AM_DEPENDENCIES([CXX]) m4trace:configure.ac:13: -1- AM_SET_DEPDIR m4trace:configure.ac:13: -1- m4_pattern_allow([^DEPDIR$]) m4trace:configure.ac:13: -1- AM_OUTPUT_DEPENDENCY_COMMANDS m4trace:configure.ac:13: -1- AM_MAKE_INCLUDE m4trace:configure.ac:13: -1- m4_pattern_allow([^am__include$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__quote$]) m4trace:configure.ac:13: -1- AM_DEP_TRACK m4trace:configure.ac:13: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) m4trace:configure.ac:13: -1- m4_pattern_allow([^AMDEP_TRUE$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^AMDEP_FALSE$]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE]) m4trace:configure.ac:13: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__nodep$]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([am__nodep]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CXXDEPMODE$]) m4trace:configure.ac:13: -1- AM_CONDITIONAL([am__fastdepCXX], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CFLAGS$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^ac_ct_CC$]) m4trace:configure.ac:14: -1- _AM_PROG_CC_C_O m4trace:configure.ac:14: -1- AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) m4trace:configure.ac:14: -1- _AM_DEPENDENCIES([CC]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CCDEPMODE$]) m4trace:configure.ac:14: -1- AM_CONDITIONAL([am__fastdepCC], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) m4trace:configure.ac:14: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) m4trace:configure.ac:14: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE]) m4trace:configure.ac:14: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE]) m4trace:configure.ac:15: -1- AM_PROG_CC_C_O m4trace:configure.ac:16: -1- AM_PROG_LEX m4trace:configure.ac:16: -1- m4_pattern_allow([^LEX$]) m4trace:configure.ac:16: -1- m4_pattern_allow([^LEX_OUTPUT_ROOT$]) m4trace:configure.ac:16: -1- m4_pattern_allow([^LEXLIB$]) m4trace:configure.ac:16: -1- m4_pattern_allow([^YYTEXT_POINTER$]) m4trace:configure.ac:17: -1- m4_pattern_allow([^YACC$]) m4trace:configure.ac:17: -1- m4_pattern_allow([^YACC$]) m4trace:configure.ac:17: -1- m4_pattern_allow([^YFLAGS$]) m4trace:configure.ac:18: -1- m4_pattern_allow([^CPP$]) m4trace:configure.ac:18: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:18: -1- m4_pattern_allow([^CPP$]) m4trace:configure.ac:19: -1- m4_pattern_allow([^RANLIB$]) m4trace:configure.ac:21: -1- m4_pattern_allow([^LN_S$]) m4trace:configure.ac:22: -1- m4_pattern_allow([^AWK$]) m4trace:configure.ac:25: -1- m4_pattern_allow([^AR$]) m4trace:configure.ac:92: -1- m4_pattern_allow([^SAMPLE_EXTRA_LIBS$]) m4trace:configure.ac:93: -1- m4_pattern_allow([^platform$]) m4trace:configure.ac:96: -1- m4_pattern_allow([^GREP$]) m4trace:configure.ac:96: -1- m4_pattern_allow([^EGREP$]) m4trace:configure.ac:96: -1- m4_pattern_allow([^STDC_HEADERS$]) m4trace:configure.ac:100: -1- m4_pattern_allow([^const$]) m4trace:configure.ac:101: -1- m4_pattern_allow([^size_t$]) m4trace:configure.ac:102: -1- m4_pattern_allow([^TIME_WITH_SYS_TIME$]) m4trace:configure.ac:103: -1- m4_pattern_allow([^TM_IN_SYS_TIME$]) m4trace:configure.ac:108: -1- m4_pattern_allow([^HAVE_STRUCT_TM_TM_GMTOFF$]) m4trace:configure.ac:108: -1- m4_pattern_allow([^HAVE_STRUCT_TM___TM_GMTOFF$]) m4trace:configure.ac:111: -1- AC_DEFUN([_AC_Header_sys_time_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_list], [" sys/time.h"])]) _AC_HEADERS_EXPANSION]) m4trace:configure.ac:111: -1- AC_DEFUN([_AC_Header_unistd_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_list], [" unistd.h"])]) _AC_HEADERS_EXPANSION]) m4trace:configure.ac:111: -1- AC_DEFUN([_AC_Func_alarm], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_func_list], [" alarm"])]) _AC_FUNCS_EXPANSION]) m4trace:configure.ac:111: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:112: -1- _m4_warn([obsolete], [The macro `AC_TYPE_SIGNAL' is obsolete. You should run autoupdate.], [../../lib/autoconf/types.m4:759: AC_TYPE_SIGNAL is expanded from... configure.ac:112: the top level]) m4trace:configure.ac:112: -1- m4_pattern_allow([^RETSIGTYPE$]) m4trace:configure.ac:113: -1- m4_pattern_allow([^HAVE_STRFTIME$]) m4trace:configure.ac:113: -1- m4_pattern_allow([^HAVE_STRFTIME$]) m4trace:configure.ac:117: -1- m4_pattern_allow([^HAVE_ISNAN$]) m4trace:configure.ac:118: -1- m4_pattern_allow([^HAVE_ISINF$]) m4trace:configure.ac:126: -1- m4_pattern_allow([^HAVE_ISNAN$]) m4trace:configure.ac:138: -1- m4_pattern_allow([^HAVE_ISINF$]) m4trace:configure.ac:147: -1- m4_pattern_allow([^HAVE_GETHOSTBYNAME_R$]) m4trace:configure.ac:148: -1- m4_pattern_allow([^HAVE_STDLIB_H$]) m4trace:configure.ac:148: -1- m4_pattern_allow([^HAVE_MALLOC$]) m4trace:configure.ac:148: -1- m4_pattern_allow([^HAVE_MALLOC$]) m4trace:configure.ac:148: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:148: -1- m4_pattern_allow([^malloc$]) m4trace:configure.ac:159: -1- AM_CONDITIONAL([DEBUG_COMPILE], [test x$debug = xtrue]) m4trace:configure.ac:159: -1- m4_pattern_allow([^DEBUG_COMPILE_TRUE$]) m4trace:configure.ac:159: -1- m4_pattern_allow([^DEBUG_COMPILE_FALSE$]) m4trace:configure.ac:159: -1- _AM_SUBST_NOTMAKE([DEBUG_COMPILE_TRUE]) m4trace:configure.ac:159: -1- _AM_SUBST_NOTMAKE([DEBUG_COMPILE_FALSE]) m4trace:configure.ac:165: -1- m4_pattern_allow([^SOAPCPP2_DEBUG$]) m4trace:configure.ac:170: -1- m4_pattern_allow([^SOAPCPP2_IMPORTPATH$]) m4trace:configure.ac:175: -1- m4_pattern_allow([^WSDL2H_IMPORTPATH$]) m4trace:configure.ac:183: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:183: the top level]) m4trace:configure.ac:192: -1- m4_pattern_allow([^SOAPCPP2_NONAMESPACES$]) m4trace:configure.ac:200: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:200: the top level]) m4trace:configure.ac:209: -1- m4_pattern_allow([^SOAPCPP2_INCLUDE_XLOCALE$]) m4trace:configure.ac:217: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:217: the top level]) m4trace:configure.ac:226: -1- m4_pattern_allow([^SOAPCPP2_NO_C_LOCALE$]) m4trace:configure.ac:234: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:234: the top level]) m4trace:configure.ac:243: -1- m4_pattern_allow([^SOAPCPP2_IPV6$]) m4trace:configure.ac:262: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:262: the top level]) m4trace:configure.ac:269: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:269: the top level]) m4trace:configure.ac:310: -1- AM_CONDITIONAL([WITH_OPENSSL], [test "x$with_openssl" = "xyes" -a "x$with_gnutls" != "xyes"]) m4trace:configure.ac:310: -1- m4_pattern_allow([^WITH_OPENSSL_TRUE$]) m4trace:configure.ac:310: -1- m4_pattern_allow([^WITH_OPENSSL_FALSE$]) m4trace:configure.ac:310: -1- _AM_SUBST_NOTMAKE([WITH_OPENSSL_TRUE]) m4trace:configure.ac:310: -1- _AM_SUBST_NOTMAKE([WITH_OPENSSL_FALSE]) m4trace:configure.ac:311: -1- m4_pattern_allow([^WITH_OPENSSL$]) m4trace:configure.ac:312: -1- m4_pattern_allow([^WSDL2H_EXTRA_FLAGS$]) m4trace:configure.ac:313: -1- m4_pattern_allow([^WSDL2H_EXTRA_LIBS$]) m4trace:configure.ac:314: -1- m4_pattern_allow([^SAMPLE_INCLUDES$]) m4trace:configure.ac:315: -1- m4_pattern_allow([^SAMPLE_SSL_LIBS$]) m4trace:configure.ac:316: -1- m4_pattern_allow([^WSDL2H_SOAP_CPP_LIB$]) m4trace:configure.ac:326: -1- AM_CONDITIONAL([ENABLE_SAMPLES], [test x$samples = xtrue]) m4trace:configure.ac:326: -1- m4_pattern_allow([^ENABLE_SAMPLES_TRUE$]) m4trace:configure.ac:326: -1- m4_pattern_allow([^ENABLE_SAMPLES_FALSE$]) m4trace:configure.ac:326: -1- _AM_SUBST_NOTMAKE([ENABLE_SAMPLES_TRUE]) m4trace:configure.ac:326: -1- _AM_SUBST_NOTMAKE([ENABLE_SAMPLES_FALSE]) m4trace:configure.ac:327: -1- m4_pattern_allow([^ENABLE_SAMPLES$]) m4trace:configure.ac:334: -1- m4_pattern_allow([^SAMPLE_DIRS$]) m4trace:configure.ac:344: -1- m4_pattern_allow([^LEX_DEFINE$]) m4trace:configure.ac:345: -1- m4_pattern_allow([^LEX_FLAGS$]) m4trace:configure.ac:346: -1- m4_pattern_allow([^LEXLIB$]) m4trace:configure.ac:356: -1- m4_pattern_allow([^BISON_DEFINE$]) m4trace:configure.ac:357: -1- m4_pattern_allow([^YACC_LIB$]) m4trace:configure.ac:406: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:406: -1- m4_pattern_allow([^LTLIBOBJS$]) m4trace:configure.ac:406: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) m4trace:configure.ac:406: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) m4trace:configure.ac:406: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) m4trace:configure.ac:406: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) m4trace:configure.ac:406: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) m4trace:configure.ac:406: -1- _AC_AM_CONFIG_HEADER_HOOK(["$ac_file"]) m4trace:configure.ac:406: -1- _AM_OUTPUT_DEPENDENCY_COMMANDS gsoap-2.8.91/autom4te.cache/output.50000644000175000017500000072004413525245157016536 0ustar ellertellert@%:@! /bin/sh @%:@ Guess values for system-dependent variables and create Makefiles. @%:@ Generated by GNU Autoconf 2.69 for gsoap 2.8. @%:@ @%:@ @%:@ Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @%:@ @%:@ @%:@ This configure script is free software; the Free Software Foundation @%:@ gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in @%:@( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIB@&t@OBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='gsoap' PACKAGE_TARNAME='gsoap' PACKAGE_VERSION='2.8' PACKAGE_STRING='gsoap 2.8' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="gsoap/stdsoap2.cpp" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_list= ac_func_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS YACC_LIB BISON_DEFINE LEX_FLAGS LEX_DEFINE SAMPLE_DIRS ENABLE_SAMPLES ENABLE_SAMPLES_FALSE ENABLE_SAMPLES_TRUE WSDL2H_SOAP_CPP_LIB SAMPLE_SSL_LIBS SAMPLE_INCLUDES WSDL2H_EXTRA_LIBS WSDL2H_EXTRA_FLAGS WITH_OPENSSL WITH_OPENSSL_FALSE WITH_OPENSSL_TRUE SOAPCPP2_IPV6_V6ONLY SOAPCPP2_IPV6 SOAPCPP2_NO_C_LOCALE SOAPCPP2_INCLUDE_XLOCALE SOAPCPP2_NONAMESPACES WSDL2H_IMPORTPATH SOAPCPP2_IMPORTPATH SOAPCPP2_DEBUG DEBUG_COMPILE_FALSE DEBUG_COMPILE_TRUE LIB@&t@OBJS EGREP GREP platform SAMPLE_EXTRA_LIBS AR LN_S RANLIB CPP YFLAGS YACC LEXLIB LEX_OUTPUT_ROOT LEX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX host_os host_vendor host_cpu host build_os build_vendor build_cpu build AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL am__quote' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking enable_debug enable_namespaces enable_xlocale enable_c_locale enable_ipv6 enable_ipv6_v6only with_zlib with_openssl enable_ssl enable_gnutls enable_samples ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS YACC YFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures gsoap 2.8 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX @<:@@S|@ac_default_prefix@:>@ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX @<:@PREFIX@:>@ By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root @<:@DATAROOTDIR/doc/gsoap@:>@ --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of gsoap 2.8:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-debug add debug symbols for debugging --disable-namespaces compile library without namespaces --enable-xlocale compile library with forced inclusion of xlocale.h --disable-c-locale compile library without c locale usage --enable-ipv6 compile library with IPv6 support --enable-ipv6-v6only compile library with IPv6-v6only support --disable-ssl build without SSL/TLS --enable-gnutls build with GNUTLS SSL/TLS --enable-samples enable compile for the gsoap samples Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-zlib=DIR zlib installation prefix --with-openssl=DIR openssl installation prefix Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags YACC The `Yet Another Compiler Compiler' implementation to use. Defaults to the first program found out of: `bison -y', `byacc', `yacc'. YFLAGS The list of arguments that will be passed by default to @S|@YACC. This script will default YFLAGS to the empty string to avoid a default value of `-d' given by some make applications. CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF gsoap configure 2.8 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## @%:@ ac_fn_cxx_try_compile LINENO @%:@ ---------------------------- @%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_cxx_try_compile @%:@ ac_fn_c_try_compile LINENO @%:@ -------------------------- @%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_compile @%:@ ac_fn_c_try_link LINENO @%:@ ----------------------- @%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_link @%:@ ac_fn_c_try_cpp LINENO @%:@ ---------------------- @%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_cpp @%:@ ac_fn_c_try_run LINENO @%:@ ---------------------- @%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes @%:@ that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_run @%:@ ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using @%:@ the include files in INCLUDES and setting the cache variable VAR @%:@ accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_header_mongrel @%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists and can be compiled using the include files in @%:@ INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_header_compile @%:@ ac_fn_c_check_type LINENO TYPE VAR INCLUDES @%:@ ------------------------------------------- @%:@ Tests whether TYPE exists after having included INCLUDES, setting cache @%:@ variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_type @%:@ ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES @%:@ ---------------------------------------------------- @%:@ Tries to find if the field MEMBER exists in type AGGR, after including @%:@ INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_member @%:@ ac_fn_c_check_func LINENO FUNC VAR @%:@ ---------------------------------- @%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by gsoap $as_me 2.8, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in @%:@(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi as_fn_append ac_header_list " sys/time.h" as_fn_append ac_header_list " unistd.h" as_fn_append ac_func_list " alarm" # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.16' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in @%:@(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null @%:@ Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='gsoap' VERSION='2.8' cat >>confdefs.h <<_ACEOF @%:@define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # AC_CONFIG_HEADERS([config.h]) ac_config_headers="$ac_config_headers config.h" # we use subdirs. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi # Checks for programs. ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 $as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; } cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } case $?:`cat confinc.out 2>/dev/null` in @%:@( '0:this is the am__doit target') : case $s in @%:@( BSD) : am__include='.include' am__quote='"' ;; @%:@( *) : am__include='include' am__quote='' ;; esac ;; @%:@( *) : ;; esac if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 $as_echo "${_am_result}" >&6; } @%:@ Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $@%:@ != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi for ac_prog in flex lex do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LEX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LEX"; then ac_cv_prog_LEX="$LEX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LEX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LEX=$ac_cv_prog_LEX if test -n "$LEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5 $as_echo "$LEX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$LEX" && break done test -n "$LEX" || LEX=":" if test "x$LEX" != "x:"; then cat >conftest.l <<_ACEOF %% a { ECHO; } b { REJECT; } c { yymore (); } d { yyless (1); } e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */ yyless ((input () != 0)); } f { unput (yytext[0]); } . { BEGIN INITIAL; } %% #ifdef YYTEXT_POINTER extern char *yytext; #endif int main (void) { return ! yylex () + ! yywrap (); } _ACEOF { { ac_try="$LEX conftest.l" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$LEX conftest.l") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex output file root" >&5 $as_echo_n "checking lex output file root... " >&6; } if ${ac_cv_prog_lex_root+:} false; then : $as_echo_n "(cached) " >&6 else if test -f lex.yy.c; then ac_cv_prog_lex_root=lex.yy elif test -f lexyy.c; then ac_cv_prog_lex_root=lexyy else as_fn_error $? "cannot find output from $LEX; giving up" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5 $as_echo "$ac_cv_prog_lex_root" >&6; } LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root if test -z "${LEXLIB+set}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex library" >&5 $as_echo_n "checking lex library... " >&6; } if ${ac_cv_lib_lex+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS=$LIBS ac_cv_lib_lex='none needed' for ac_lib in '' -lfl -ll; do LIBS="$ac_lib $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_lex=$ac_lib fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext test "$ac_cv_lib_lex" != 'none needed' && break done LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5 $as_echo "$ac_cv_lib_lex" >&6; } test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5 $as_echo_n "checking whether yytext is a pointer... " >&6; } if ${ac_cv_prog_lex_yytext_pointer+:} false; then : $as_echo_n "(cached) " >&6 else # POSIX says lex can declare yytext either as a pointer or an array; the # default is implementation-dependent. Figure out which it is, since # not all implementations provide the %pointer and %array declarations. ac_cv_prog_lex_yytext_pointer=no ac_save_LIBS=$LIBS LIBS="$LEXLIB $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define YYTEXT_POINTER 1 `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_prog_lex_yytext_pointer=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5 $as_echo "$ac_cv_prog_lex_yytext_pointer" >&6; } if test $ac_cv_prog_lex_yytext_pointer = yes; then $as_echo "@%:@define YYTEXT_POINTER 1" >>confdefs.h fi rm -f conftest.l $LEX_OUTPUT_ROOT.c fi if test "$LEX" = :; then LEX=${am_missing_run}flex fi for ac_prog in 'bison -y' byacc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_YACC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$YACC"; then ac_cv_prog_YACC="$YACC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_YACC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi YACC=$ac_cv_prog_YACC if test -n "$YACC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 $as_echo "$YACC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$YACC" && break done test -n "$YACC" || YACC="yacc" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@ifdef __STDC__ @%:@ include @%:@else @%:@ include @%:@endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@ifdef __STDC__ @%:@ include @%:@else @%:@ include @%:@endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi #AM_PROG_LIBTOOL { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="${ac_tool_prefix}ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AR" = x; then AR=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi else AR="$ac_cv_prog_AR" fi # AC_DECL_YYTEXT SAMPLE_EXTRA_LIBS="-lm" # Platform-specific Makefile setup case "${host}" in *-*-solaris*) platform=SUN_OS SAMPLE_EXTRA_LIBS="-lxnet -lsocket -lnsl -lm" WSDL2H_EXTRA_LIBS="-lxnet -lsocket -lnsl -lrt" ;; *-*-sysv5*) platform=UNIXWARE ;; *-*-UnixWare*) platform=UNIXWARE ;; *-*-unixware*) platform=UNIXWARE ;; *-*-sco3.2v5*) platform=OPENSERVER SAMPLE_EXTRA_LIBS="-lsocket -lm" ;; *-*-linux*) platform=LINUX # if test x$debug = xtrue; then # CFLAGS="-g" #don't want the -O2 for debugging. # else # CFLAGS="-O2" #don't want the -g for release compile. # fi ;; *-*-cygwin*) platform=CYGWIN ;; *-*-mingw*) platform=MINGW SAMPLE_EXTRA_LIBS="-lws2_32 -lkernel32 -luser32 -lgdi32 -lm" WSDL2H_EXTRA_LIBS="-lws2_32 -lkernel32 -luser32 -lgdi32 -lm" ;; *-*-freebsd*) platform=FREEBSD ;; *-*-openbsd*) platform=OPENBSD ;; *-*-irix*) platform=IRIX ;; *-*-aix*) platform=AIX case "${host}" in *-*-aix4.1*) osver=AIX41;; *-*-aix4.2*) osver=AIX42;; *-*-aix4.*) osver=AIX43;; *-*-aix5.1*) osver=AIX51;; *-*-aix5.2*) osver=AIX52;; *-*-aix5.3*) osver=AIX53;; *-*-aix6.*) osver=AIX61;; *-*-aix7.*) osver=AIX71;; esac SAMPLE_EXTRA_LIBS="-lm" ;; *-sequent-*) platform=PTX ;; *-*-hp*) platform=HP_UX ; case "${host}" in *-*-hpux11*) osver=HPUX11;; *-*-hpux10*) osver=HPUX10;; *) osver=HPUX11;; esac ;; *-*-mvs*) platform=OS390 ;; *-*-os400*) platform=OS400 ;; *-*-OS400*) platform=OS400 ;; *-*-osf*) platform=TRU64 ;; *-apple-*) platform=MACOSX # Appease 10.7 Lion (OpenSSL deprecated) CXXFLAGS="-Wno-deprecated-declarations" CFLAGS="-Wno-deprecated-declarations" ;; *-nto-qnx) platform=QNX SAMPLE_EXTRA_LIBS="-lsocket -lm" ;; *) platform=UNKNOWN SAMPLE_EXTRA_LIBS="-lm" ;; esac # Checks for header files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in arpa/inet.h locale.h xlocale.h errno.h fcntl.h ctype.h limits.h float.h math.h netdb.h netinet/in.h stdlib.h string.h strings.h stdint.h inttypes.h time.h sys/inttypes.h sys/socket.h sys/types.h sys/time.h sys/timeb.h unistd.h poll.h openssl/ssl.h gnutls/gnutls.h zlib.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" " #if HAVE_SYS_SOCKET_H # include #endif " if test "x$ac_cv_type_socklen_t" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_SOCKLEN_T 1 _ACEOF fi # Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "@%:@define const /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF @%:@define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "@%:@define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if ${ac_cv_struct_tm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "@%:@define TM_IN_SYS_TIME 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct tm" "tm_gmtoff" "ac_cv_member_struct_tm_tm_gmtoff" " #include #include " if test "x$ac_cv_member_struct_tm_tm_gmtoff" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRUCT_TM_TM_GMTOFF 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct tm" "__tm_gmtoff" "ac_cv_member_struct_tm___tm_gmtoff" " #include #include " if test "x$ac_cv_member_struct_tm___tm_gmtoff" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRUCT_TM___TM_GMTOFF 1 _ACEOF fi # Checks for library functions. for ac_header in $ac_header_list do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in $ac_func_list do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mktime" >&5 $as_echo_n "checking for working mktime... " >&6; } if ${ac_cv_func_working_mktime+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_working_mktime=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Test program from Paul Eggert and Tony Leneis. */ #ifdef TIME_WITH_SYS_TIME # include # include #else # ifdef HAVE_SYS_TIME_H # include # else # include # endif #endif #include #include #ifdef HAVE_UNISTD_H # include #endif #ifndef HAVE_ALARM # define alarm(X) /* empty */ #endif /* Work around redefinition to rpl_putenv by other config tests. */ #undef putenv static time_t time_t_max; static time_t time_t_min; /* Values we'll use to set the TZ environment variable. */ static const char *tz_strings[] = { (const char *) 0, "TZ=GMT0", "TZ=JST-9", "TZ=EST+3EDT+2,M10.1.0/00:00:00,M2.3.0/00:00:00" }; #define N_STRINGS (sizeof (tz_strings) / sizeof (tz_strings[0])) /* Return 0 if mktime fails to convert a date in the spring-forward gap. Based on a problem report from Andreas Jaeger. */ static int spring_forward_gap () { /* glibc (up to about 1998-10-07) failed this test. */ struct tm tm; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ((char*) "TZ=PST8PDT,M4.1.0,M10.5.0"); tm.tm_year = 98; tm.tm_mon = 3; tm.tm_mday = 5; tm.tm_hour = 2; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; return mktime (&tm) != (time_t) -1; } static int mktime_test1 (time_t now) { struct tm *lt; return ! (lt = localtime (&now)) || mktime (lt) == now; } static int mktime_test (time_t now) { return (mktime_test1 (now) && mktime_test1 ((time_t) (time_t_max - now)) && mktime_test1 ((time_t) (time_t_min + now))); } static int irix_6_4_bug () { /* Based on code from Ariel Faigon. */ struct tm tm; tm.tm_year = 96; tm.tm_mon = 3; tm.tm_mday = 0; tm.tm_hour = 0; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; mktime (&tm); return tm.tm_mon == 2 && tm.tm_mday == 31; } static int bigtime_test (int j) { struct tm tm; time_t now; tm.tm_year = tm.tm_mon = tm.tm_mday = tm.tm_hour = tm.tm_min = tm.tm_sec = j; now = mktime (&tm); if (now != (time_t) -1) { struct tm *lt = localtime (&now); if (! (lt && lt->tm_year == tm.tm_year && lt->tm_mon == tm.tm_mon && lt->tm_mday == tm.tm_mday && lt->tm_hour == tm.tm_hour && lt->tm_min == tm.tm_min && lt->tm_sec == tm.tm_sec && lt->tm_yday == tm.tm_yday && lt->tm_wday == tm.tm_wday && ((lt->tm_isdst < 0 ? -1 : 0 < lt->tm_isdst) == (tm.tm_isdst < 0 ? -1 : 0 < tm.tm_isdst)))) return 0; } return 1; } static int year_2050_test () { /* The correct answer for 2050-02-01 00:00:00 in Pacific time, ignoring leap seconds. */ unsigned long int answer = 2527315200UL; struct tm tm; time_t t; tm.tm_year = 2050 - 1900; tm.tm_mon = 2 - 1; tm.tm_mday = 1; tm.tm_hour = tm.tm_min = tm.tm_sec = 0; tm.tm_isdst = -1; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ((char*) "TZ=PST8PDT,M4.1.0,M10.5.0"); t = mktime (&tm); /* Check that the result is either a failure, or close enough to the correct answer that we can assume the discrepancy is due to leap seconds. */ return (t == (time_t) -1 || (0 < t && answer - 120 <= t && t <= answer + 120)); } int main () { time_t t, delta; int i, j; /* This test makes some buggy mktime implementations loop. Give up after 60 seconds; a mktime slower than that isn't worth using anyway. */ alarm (60); for (;;) { t = (time_t_max << 1) + 1; if (t <= time_t_max) break; time_t_max = t; } time_t_min = - ((time_t) ~ (time_t) 0 == (time_t) -1) - time_t_max; delta = time_t_max / 997; /* a suitable prime number */ for (i = 0; i < N_STRINGS; i++) { if (tz_strings[i]) putenv ((char*) tz_strings[i]); for (t = 0; t <= time_t_max - delta; t += delta) if (! mktime_test (t)) return 1; if (! (mktime_test ((time_t) 1) && mktime_test ((time_t) (60 * 60)) && mktime_test ((time_t) (60 * 60 * 24)))) return 1; for (j = 1; ; j <<= 1) if (! bigtime_test (j)) return 1; else if (INT_MAX / 2 < j) break; if (! bigtime_test (INT_MAX)) return 1; } return ! (irix_6_4_bug () && spring_forward_gap () && year_2050_test ()); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_working_mktime=yes else ac_cv_func_working_mktime=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_working_mktime" >&5 $as_echo "$ac_cv_func_working_mktime" >&6; } if test $ac_cv_func_working_mktime = no; then case " $LIB@&t@OBJS " in *" mktime.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS mktime.$ac_objext" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 $as_echo_n "checking return type of signal handlers... " >&6; } if ${ac_cv_type_signal+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_signal=int else ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 $as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF @%:@define RETSIGTYPE $ac_cv_type_signal _ACEOF for ac_func in strftime do : ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime" if test "x$ac_cv_func_strftime" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRFTIME 1 _ACEOF else # strftime is in -lintl on SCO UNIX. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strftime in -lintl" >&5 $as_echo_n "checking for strftime in -lintl... " >&6; } if ${ac_cv_lib_intl_strftime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char strftime (); int main () { return strftime (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_strftime=yes else ac_cv_lib_intl_strftime=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_strftime" >&5 $as_echo "$ac_cv_lib_intl_strftime" >&6; } if test "x$ac_cv_lib_intl_strftime" = xyes; then : $as_echo "@%:@define HAVE_STRFTIME 1" >>confdefs.h LIBS="-lintl $LIBS" fi fi done for ac_func in random gettimeofday ftime localtime_r timegm gmtime gmtime_r asctime asctime_r memset select socket snprintf strchr strerror strerror_r strlcpy strlcat strrchr strstr strtol strtoul strtoll strtoull strtold strtod strtof strtold_l strtod_l strtof_l sscanf sscanf_l snprintf sprintf_l wctomb mbtowc poll newlocale uselocale freelocale do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # Checks for isnan and isinf ac_fn_c_check_func "$LINENO" "isnan" "ac_cv_func_isnan" if test "x$ac_cv_func_isnan" = xyes; then : has_isnan=1; $as_echo "@%:@define HAVE_ISNAN 1" >>confdefs.h else has_isnan=0 fi ac_fn_c_check_func "$LINENO" "isinf" "ac_cv_func_isinf" if test "x$ac_cv_func_isinf" = xyes; then : has_isinf=1; $as_echo "@%:@define HAVE_ISINF 1" >>confdefs.h else has_isinf=0 fi # check for macro isnan in math if test $has_isnan = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for macro isnan" >&5 $as_echo_n "checking for macro isnan... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { { int foo; foo = isnan(0); } ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : has_isnan=1 else has_isnan=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $has_isnan = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "@%:@define HAVE_ISNAN 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # check for macro isinf in math if test $has_isinf = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for macro isinf" >&5 $as_echo_n "checking for macro isinf... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { { int foo; foo = isinf(0); } ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : has_isinf=1 else has_isinf=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $has_isinf = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "@%:@define HAVE_ISINF 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # Function test depending on platform # AIX Has incompatible gethostbyname_r if test $platform != AIX -a $platform != TRU64; then for ac_func in gethostbyname_r do : ac_fn_c_check_func "$LINENO" "gethostbyname_r" "ac_cv_func_gethostbyname_r" if test "x$ac_cv_func_gethostbyname_r" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_GETHOSTBYNAME_R 1 _ACEOF fi done for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 $as_echo_n "checking for GNU libc compatible malloc... " >&6; } if ${ac_cv_func_malloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_malloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { return ! malloc (0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_malloc_0_nonnull=yes else ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 $as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes; then : $as_echo "@%:@define HAVE_MALLOC 1" >>confdefs.h else $as_echo "@%:@define HAVE_MALLOC 0" >>confdefs.h case " $LIB@&t@OBJS " in *" malloc.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS malloc.$ac_objext" ;; esac $as_echo "@%:@define malloc rpl_malloc" >>confdefs.h fi fi # the debug build options adds symbols to compiler output (-g for g++) @%:@ Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; case "${enableval}" in yes) debug=true ;; no) debug=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;; esac else debug=false fi if test x$debug = xtrue; then DEBUG_COMPILE_TRUE= DEBUG_COMPILE_FALSE='#' else DEBUG_COMPILE_TRUE='#' DEBUG_COMPILE_FALSE= fi if test x$debug = xtrue; then SOAPCPP2_DEBUG="-DDEBUG" ##define DEBUG for debugging else SOAPCPP2_DEBUG= fi # set the default soapcpp2 import path SOAPCPP2_IMPORTPATH="-DSOAPCPP2_IMPORT_PATH=\"\\\"${datadir}/gsoap/import\\\"\"" #SOAPCPP2_IMPORTPATH="-DSOAPCPP2_IMPORT_PATH=\"\\\"`pwd`/gsoap/import\\\"\"" # set the default wsdl2h import path WSDL2H_IMPORTPATH="-DWSDL2H_IMPORT_PATH=\"\\\"${datadir}/gsoap/WS\\\"\"" #WSDL2H_IMPORTPATH="-DWSDL2H_IMPORT_PATH=\"\\\"`pwd`/gsoap/WS\\\"\"" # the disable-namespaces option adds the -DWITH_NONAMESPACES to the # library compilation thus disabling namespaces @%:@ Check whether --enable-namespaces was given. if test "${enable_namespaces+set}" = set; then : enableval=$enable_namespaces; with_namespaces="$enable_namespaces" else with_namespaces="yes" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for disable namespaces in library" >&5 $as_echo_n "checking for disable namespaces in library... " >&6; } if test "x$with_namespaces" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_NONAMESPACES="-DWITH_NONAMESPACES" ##define to remove nsmap link dependence fi # the enable-xlocale option adds the -DWITH_INCLUDE_XLOCALE_H to the # library compilation thus forcing the inclusion of xlocale.h @%:@ Check whether --enable-xlocale was given. if test "${enable_xlocale+set}" = set; then : enableval=$enable_xlocale; with_xlocale="$enable_xlocale" else with_xlocale="no" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enable xlocale usage in library" >&5 $as_echo_n "checking for enable xlocale usage in library... " >&6; } if test "x$with_xlocale" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_INCLUDE_XLOCALE="-DWITH_INCLUDE_XLOCALE_H" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # the disable-c-locale option adds the -DWITH_NO_C_LOCALE to the # library compilation thus disabling the use of the C locale usage @%:@ Check whether --enable-c-locale was given. if test "${enable_c_locale+set}" = set; then : enableval=$enable_c_locale; with_no_c_locale="$enable_c_locale" else with_no_c_locale="yes" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for disable c locale usage in library" >&5 $as_echo_n "checking for disable c locale usage in library... " >&6; } if test "x$with_no_c_locale" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_NO_C_LOCALE="-DWITH_NO_C_LOCALE" fi # the enable-ipv6 option adds the -DWITH_IPV6 to the # library compilation thus enabling IPv6 @%:@ Check whether --enable-ipv6 was given. if test "${enable_ipv6+set}" = set; then : enableval=$enable_ipv6; with_ipv6="$enable_ipv6" else with_ipv6="no" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enable ipv6 in library" >&5 $as_echo_n "checking for enable ipv6 in library... " >&6; } if test "x$with_ipv6" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_IPV6="-DWITH_IPV6" ##define to add IPv6 support else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # the enable-ipv6-v6only option adds the -DWITH_IPV6_V6ONLY to the # library compilation thus enabling IPv6 without remapping IPv4 to IPv6 @%:@ Check whether --enable-ipv6-v6only was given. if test "${enable_ipv6_v6only+set}" = set; then : enableval=$enable_ipv6_v6only; with_ipv6_v6only="$enable_ipv6_v6only" else with_ipv6_v6only="no" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enable ipv6-v6only in library" >&5 $as_echo_n "checking for enable ipv6-v6only in library... " >&6; } if test "x$with_ipv6_v6only" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_IPV6_V6ONLY="-DWITH_IPV6_V6ONLY" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # the zlib installation prefix path @%:@ Check whether --with-zlib was given. if test "${with_zlib+set}" = set; then : withval=$with_zlib; ZLIB=$withval fi # the OpenSSL installation prefix path @%:@ Check whether --with-openssl was given. if test "${with_openssl+set}" = set; then : withval=$with_openssl; OPENSSL=$withval fi # the disable-ssl option removes the dependence on OpenSSL @%:@ Check whether --enable-ssl was given. if test "${enable_ssl+set}" = set; then : enableval=$enable_ssl; with_openssl="$enable_ssl" else with_openssl="yes" fi # the enable-gnutls option enables GNUTLS in favor of OpenSSL @%:@ Check whether --enable-gnutls was given. if test "${enable_gnutls+set}" = set; then : enableval=$enable_gnutls; with_gnutls="$enable_gnutls" else with_gnutls="no" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for disable openssl in library" >&5 $as_echo_n "checking for disable openssl in library... " >&6; } if test "x$with_openssl" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enable gnutls in library" >&5 $as_echo_n "checking for enable gnutls in library... " >&6; } if test "x$with_gnutls" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } WSDL2H_EXTRA_FLAGS="-DWITH_GNUTLS -DWITH_GZIP" WSDL2H_EXTRA_LIBS="${WSDL2H_EXTRA_LIBS} -lgnutls -lgcrypt -lgpg-error -lz" SAMPLE_INCLUDES= SAMPLE_SSL_LIBS="-lgnutls -lgcrypt -lgpg-error -lz" WSDL2H_SOAP_CPP_LIB="libgsoapssl++.a" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } WSDL2H_EXTRA_FLAGS="-DWITH_OPENSSL -DWITH_GZIP" # compile with wsdl2h when OPENSSL is available WSDL2H_EXTRA_LIBS="${WSDL2H_EXTRA_LIBS} -lssl -lcrypto -lz" SAMPLE_INCLUDES= SAMPLE_SSL_LIBS="-lssl -lcrypto -lz" WSDL2H_SOAP_CPP_LIB="libgsoapssl++.a" fi if test -n "$ZLIB"; then WSDL2H_EXTRA_FLAGS="-I${ZLIB}/include ${WSDL2H_EXTRA_FLAGS}" WSDL2H_EXTRA_LIBS="-L${ZLIB}/lib ${WSDL2H_EXTRA_LIBS}" SAMPLE_INCLUDES="-I${ZLIB}/include ${SAMPLE_SSL_LIBS}" SAMPLE_SSL_LIBS="-L${ZLIB}/lib ${SAMPLE_SSL_LIBS}" fi if test -n "$OPENSSL"; then WSDL2H_EXTRA_FLAGS="-I${OPENSSL}/include ${WSDL2H_EXTRA_FLAGS}" WSDL2H_EXTRA_LIBS="-L${OPENSSL}/lib ${WSDL2H_EXTRA_LIBS}" SAMPLE_INCLUDES="-I${OPENSSL}/include" SAMPLE_SSL_LIBS="-L${OPENSSL}/lib ${SAMPLE_SSL_LIBS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } WSDL2H_EXTRA_FLAGS= SAMPLE_SSL_LIBS= SAMPLE_INCLUDES= WSDL2H_SOAP_CPP_LIB="libgsoap++.a" fi if test "x$with_openssl" = "xyes" -a "x$with_gnutls" != "xyes"; then WITH_OPENSSL_TRUE= WITH_OPENSSL_FALSE='#' else WITH_OPENSSL_TRUE='#' WITH_OPENSSL_FALSE= fi # enable the compile of the samples @%:@ Check whether --enable-samples was given. if test "${enable_samples+set}" = set; then : enableval=$enable_samples; case "${enableval}" in yes) samples=true ;; no) samples=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-samples" "$LINENO" 5 ;; esac else samples=false fi if test x$samples = xtrue; then ENABLE_SAMPLES_TRUE= ENABLE_SAMPLES_FALSE='#' else ENABLE_SAMPLES_TRUE='#' ENABLE_SAMPLES_FALSE= fi if test x$samples = xtrue; then SAMPLE_DIRS=". samples" else SAMPLE_DIRS= fi if test x$LEX = xflex; then LEX_DEFINE=-DWITH_FLEX LEX_FLAGS="-l" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No 'flex' command detected on current path: trying existing scanner" >&5 $as_echo "$as_me: WARNING: No 'flex' command detected on current path: trying existing scanner" >&2;} LEX_DEFINE=-DWITH_LEX LEX_FLAGS= fi # check if we must define -DWITH_BISON if test "$YACC" = "bison -y"; then BISON_DEFINE=-DWITH_BISON YACC_LIB= else BISON_DEFINE=-DWITH_YACC YACC_LIB="-ly" fi ac_config_files="$ac_config_files Makefile gsoap.pc gsoap++.pc gsoapck.pc gsoapck++.pc gsoapssl.pc gsoapssl++.pc gsoap/Makefile gsoap/src/Makefile gsoap/wsdl/Makefile gsoap/samples/Makefile gsoap/samples/autotest/Makefile gsoap/samples/aws/Makefile gsoap/samples/calc/Makefile gsoap/samples/calc++/Makefile gsoap/samples/chaining/Makefile gsoap/samples/chaining++/Makefile gsoap/samples/databinding/Makefile gsoap/samples/dime/Makefile gsoap/samples/dom/Makefile gsoap/samples/oneway/Makefile gsoap/samples/oneway++/Makefile gsoap/samples/factory/Makefile gsoap/samples/factorytest/Makefile gsoap/samples/gmt/Makefile gsoap/samples/googleapi/Makefile gsoap/samples/hello/Makefile gsoap/samples/httpcookies/Makefile gsoap/samples/lu/Makefile gsoap/samples/magic/Makefile gsoap/samples/mashup/Makefile gsoap/samples/mashup++/Makefile gsoap/samples/mtom/Makefile gsoap/samples/mtom-stream/Makefile gsoap/samples/polytest/Makefile gsoap/samples/primes/Makefile gsoap/samples/roll/Makefile gsoap/samples/router/Makefile gsoap/samples/atom/Makefile gsoap/samples/rss/Makefile gsoap/samples/ssl/Makefile gsoap/samples/template/Makefile gsoap/samples/udp/Makefile gsoap/samples/varparam/Makefile gsoap/samples/wsa/Makefile gsoap/samples/wsrm/Makefile gsoap/samples/wsse/Makefile gsoap/samples/wst/Makefile gsoap/samples/xml-rpc-json/Makefile gsoap/samples/rest/Makefile gsoap/samples/testmsgr/Makefile gsoap/samples/async/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIB@&t@OBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DEBUG_COMPILE_TRUE}" && test -z "${DEBUG_COMPILE_FALSE}"; then as_fn_error $? "conditional \"DEBUG_COMPILE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_OPENSSL_TRUE}" && test -z "${WITH_OPENSSL_FALSE}"; then as_fn_error $? "conditional \"WITH_OPENSSL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_SAMPLES_TRUE}" && test -z "${ENABLE_SAMPLES_FALSE}"; then as_fn_error $? "conditional \"ENABLE_SAMPLES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by gsoap $as_me 2.8, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ gsoap config.status 2.8 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX @%:@@%:@ Running $as_me. @%:@@%:@ _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "gsoap.pc") CONFIG_FILES="$CONFIG_FILES gsoap.pc" ;; "gsoap++.pc") CONFIG_FILES="$CONFIG_FILES gsoap++.pc" ;; "gsoapck.pc") CONFIG_FILES="$CONFIG_FILES gsoapck.pc" ;; "gsoapck++.pc") CONFIG_FILES="$CONFIG_FILES gsoapck++.pc" ;; "gsoapssl.pc") CONFIG_FILES="$CONFIG_FILES gsoapssl.pc" ;; "gsoapssl++.pc") CONFIG_FILES="$CONFIG_FILES gsoapssl++.pc" ;; "gsoap/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/Makefile" ;; "gsoap/src/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/src/Makefile" ;; "gsoap/wsdl/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/wsdl/Makefile" ;; "gsoap/samples/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/Makefile" ;; "gsoap/samples/autotest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/autotest/Makefile" ;; "gsoap/samples/aws/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/aws/Makefile" ;; "gsoap/samples/calc/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/calc/Makefile" ;; "gsoap/samples/calc++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/calc++/Makefile" ;; "gsoap/samples/chaining/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/chaining/Makefile" ;; "gsoap/samples/chaining++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/chaining++/Makefile" ;; "gsoap/samples/databinding/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/databinding/Makefile" ;; "gsoap/samples/dime/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/dime/Makefile" ;; "gsoap/samples/dom/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/dom/Makefile" ;; "gsoap/samples/oneway/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/oneway/Makefile" ;; "gsoap/samples/oneway++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/oneway++/Makefile" ;; "gsoap/samples/factory/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/factory/Makefile" ;; "gsoap/samples/factorytest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/factorytest/Makefile" ;; "gsoap/samples/gmt/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/gmt/Makefile" ;; "gsoap/samples/googleapi/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/googleapi/Makefile" ;; "gsoap/samples/hello/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/hello/Makefile" ;; "gsoap/samples/httpcookies/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/httpcookies/Makefile" ;; "gsoap/samples/lu/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/lu/Makefile" ;; "gsoap/samples/magic/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/magic/Makefile" ;; "gsoap/samples/mashup/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mashup/Makefile" ;; "gsoap/samples/mashup++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mashup++/Makefile" ;; "gsoap/samples/mtom/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mtom/Makefile" ;; "gsoap/samples/mtom-stream/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mtom-stream/Makefile" ;; "gsoap/samples/polytest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/polytest/Makefile" ;; "gsoap/samples/primes/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/primes/Makefile" ;; "gsoap/samples/roll/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/roll/Makefile" ;; "gsoap/samples/router/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/router/Makefile" ;; "gsoap/samples/atom/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/atom/Makefile" ;; "gsoap/samples/rss/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/rss/Makefile" ;; "gsoap/samples/ssl/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/ssl/Makefile" ;; "gsoap/samples/template/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/template/Makefile" ;; "gsoap/samples/udp/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/udp/Makefile" ;; "gsoap/samples/varparam/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/varparam/Makefile" ;; "gsoap/samples/wsa/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsa/Makefile" ;; "gsoap/samples/wsrm/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsrm/Makefile" ;; "gsoap/samples/wsse/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsse/Makefile" ;; "gsoap/samples/wst/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wst/Makefile" ;; "gsoap/samples/xml-rpc-json/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/xml-rpc-json/Makefile" ;; "gsoap/samples/rest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/rest/Makefile" ;; "gsoap/samples/testmsgr/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/testmsgr/Makefile" ;; "gsoap/samples/async/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/async/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. case $CONFIG_FILES in @%:@( *\'*) : eval set x "$CONFIG_FILES" ;; @%:@( *) : set x $CONFIG_FILES ;; @%:@( *) : ;; esac shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`$as_dirname -- "$am_mf" || $as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$am_mf" : 'X\(//\)[^/]' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` am_filepart=`$as_basename -- "$am_mf" || $as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$am_mf" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` { echo "$as_me:$LINENO: cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles" >&5 (cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments for automatic dependency tracking. Try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). See \`config.log' for more details" "$LINENO" 5; } fi { am_dirpart=; unset am_dirpart;} { am_filepart=; unset am_filepart;} { am_mf=; unset am_mf;} { am_rc=; unset am_rc;} rm -f conftest-deps.mk } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi gsoap-2.8.91/autom4te.cache/output.30000644000175000017500000070335713525245157016544 0ustar ellertellert@%:@! /bin/sh @%:@ Guess values for system-dependent variables and create Makefiles. @%:@ Generated by GNU Autoconf 2.69 for gsoap 2.8. @%:@ @%:@ @%:@ Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @%:@ @%:@ @%:@ This configure script is free software; the Free Software Foundation @%:@ gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in @%:@( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIB@&t@OBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='gsoap' PACKAGE_TARNAME='gsoap' PACKAGE_VERSION='2.8' PACKAGE_STRING='gsoap 2.8' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="gsoap/stdsoap2.cpp" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_list= ac_func_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS YACC_LIB BISON_DEFINE LEX_FLAGS LEX_DEFINE SAMPLE_DIRS ENABLE_SAMPLES ENABLE_SAMPLES_FALSE ENABLE_SAMPLES_TRUE WSDL2H_SOAP_CPP_LIB SAMPLE_SSL_LIBS SAMPLE_INCLUDES WSDL2H_EXTRA_LIBS WSDL2H_EXTRA_FLAGS SOAPCPP2_IPV6 SOAPCPP2_NONAMESPACES WSDL2H_IMPORTPATH SOAPCPP2_IMPORTPATH SOAPCPP2_DEBUG DEBUG_COMPILE_FALSE DEBUG_COMPILE_TRUE LIB@&t@OBJS EGREP GREP platform SAMPLE_EXTRA_LIBS LN_S RANLIB CPP YFLAGS YACC LEXLIB LEX_OUTPUT_ROOT LEX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX host_os host_vendor host_cpu host build_os build_vendor build_cpu build AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking enable_debug enable_namespaces enable_ipv6 with_zlib with_openssl enable_ssl enable_gnutls enable_samples ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS YACC YFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures gsoap 2.8 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX @<:@@S|@ac_default_prefix@:>@ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX @<:@PREFIX@:>@ By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root @<:@DATAROOTDIR/doc/gsoap@:>@ --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of gsoap 2.8:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-debug add debug symbols for debugging --disable-namespaces compile library without namespaces --enable-ipv6 compile library with IPv6 support --disable-ssl build without SSL/TLS --enable-gnutls build with GNUTLS SSL/TLS --enable-samples enable compile for the gsoap samples Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-zlib=DIR zlib installation prefix --with-openssl=DIR openssl installation prefix Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags YACC The `Yet Another Compiler Compiler' implementation to use. Defaults to the first program found out of: `bison -y', `byacc', `yacc'. YFLAGS The list of arguments that will be passed by default to @S|@YACC. This script will default YFLAGS to the empty string to avoid a default value of `-d' given by some make applications. CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF gsoap configure 2.8 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## @%:@ ac_fn_cxx_try_compile LINENO @%:@ ---------------------------- @%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_cxx_try_compile @%:@ ac_fn_c_try_compile LINENO @%:@ -------------------------- @%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_compile @%:@ ac_fn_c_try_link LINENO @%:@ ----------------------- @%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_link @%:@ ac_fn_c_try_cpp LINENO @%:@ ---------------------- @%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_cpp @%:@ ac_fn_c_try_run LINENO @%:@ ---------------------- @%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes @%:@ that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_run @%:@ ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using @%:@ the include files in INCLUDES and setting the cache variable VAR @%:@ accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_header_mongrel @%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists and can be compiled using the include files in @%:@ INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_header_compile @%:@ ac_fn_c_check_type LINENO TYPE VAR INCLUDES @%:@ ------------------------------------------- @%:@ Tests whether TYPE exists after having included INCLUDES, setting cache @%:@ variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_type @%:@ ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES @%:@ ---------------------------------------------------- @%:@ Tries to find if the field MEMBER exists in type AGGR, after including @%:@ INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_member @%:@ ac_fn_c_check_func LINENO FUNC VAR @%:@ ---------------------------------- @%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by gsoap $as_me 2.8, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in @%:@(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi as_fn_append ac_header_list " sys/time.h" as_fn_append ac_header_list " unistd.h" as_fn_append ac_func_list " alarm" # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.14' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in @%:@(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null @%:@ Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='gsoap' VERSION='2.8' cat >>confdefs.h <<_ACEOF @%:@define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # AC_CONFIG_HEADERS([config.h]) ac_config_headers="$ac_config_headers config.h" # we use subdirs. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi # Checks for programs. ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf @%:@ Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $@%:@ != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi for ac_prog in flex lex do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LEX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LEX"; then ac_cv_prog_LEX="$LEX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LEX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LEX=$ac_cv_prog_LEX if test -n "$LEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5 $as_echo "$LEX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$LEX" && break done test -n "$LEX" || LEX=":" if test "x$LEX" != "x:"; then cat >conftest.l <<_ACEOF %% a { ECHO; } b { REJECT; } c { yymore (); } d { yyless (1); } e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */ yyless ((input () != 0)); } f { unput (yytext[0]); } . { BEGIN INITIAL; } %% #ifdef YYTEXT_POINTER extern char *yytext; #endif int main (void) { return ! yylex () + ! yywrap (); } _ACEOF { { ac_try="$LEX conftest.l" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$LEX conftest.l") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex output file root" >&5 $as_echo_n "checking lex output file root... " >&6; } if ${ac_cv_prog_lex_root+:} false; then : $as_echo_n "(cached) " >&6 else if test -f lex.yy.c; then ac_cv_prog_lex_root=lex.yy elif test -f lexyy.c; then ac_cv_prog_lex_root=lexyy else as_fn_error $? "cannot find output from $LEX; giving up" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5 $as_echo "$ac_cv_prog_lex_root" >&6; } LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root if test -z "${LEXLIB+set}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex library" >&5 $as_echo_n "checking lex library... " >&6; } if ${ac_cv_lib_lex+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS=$LIBS ac_cv_lib_lex='none needed' for ac_lib in '' -lfl -ll; do LIBS="$ac_lib $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_lex=$ac_lib fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext test "$ac_cv_lib_lex" != 'none needed' && break done LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5 $as_echo "$ac_cv_lib_lex" >&6; } test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5 $as_echo_n "checking whether yytext is a pointer... " >&6; } if ${ac_cv_prog_lex_yytext_pointer+:} false; then : $as_echo_n "(cached) " >&6 else # POSIX says lex can declare yytext either as a pointer or an array; the # default is implementation-dependent. Figure out which it is, since # not all implementations provide the %pointer and %array declarations. ac_cv_prog_lex_yytext_pointer=no ac_save_LIBS=$LIBS LIBS="$LEXLIB $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define YYTEXT_POINTER 1 `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_prog_lex_yytext_pointer=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5 $as_echo "$ac_cv_prog_lex_yytext_pointer" >&6; } if test $ac_cv_prog_lex_yytext_pointer = yes; then $as_echo "@%:@define YYTEXT_POINTER 1" >>confdefs.h fi rm -f conftest.l $LEX_OUTPUT_ROOT.c fi if test "$LEX" = :; then LEX=${am_missing_run}flex fi for ac_prog in 'bison -y' byacc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_YACC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$YACC"; then ac_cv_prog_YACC="$YACC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_YACC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi YACC=$ac_cv_prog_YACC if test -n "$YACC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 $as_echo "$YACC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$YACC" && break done test -n "$YACC" || YACC="yacc" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@ifdef __STDC__ @%:@ include @%:@else @%:@ include @%:@endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@ifdef __STDC__ @%:@ include @%:@else @%:@ include @%:@endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi #AM_PROG_LIBTOOL { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done # AC_DECL_YYTEXT SAMPLE_EXTRA_LIBS="-lm" # Platform-specific Makefile setup case "${host}" in *-*-solaris*) platform=SUN_OS SAMPLE_EXTRA_LIBS="-lxnet -lsocket -lnsl -lm" WSDL2H_EXTRA_LIBS="-lxnet -lsocket -lnsl -lrt" ;; *-*-sysv5*) platform=UNIXWARE ;; *-*-UnixWare*) platform=UNIXWARE ;; *-*-unixware*) platform=UNIXWARE ;; *-*-sco3.2v5*) platform=OPENSERVER SAMPLE_EXTRA_LIBS="-lsocket -lm" ;; *-*-linux*) platform=LINUX # if test x$debug = xtrue; then # CFLAGS="-g" #don't want the -O2 for debugging. # else # CFLAGS="-O2" #don't want the -g for release compile. # fi ;; *-*-cygwin*) platform=CYGWIN ;; *-*-mingw*) platform=MINGW SAMPLE_EXTRA_LIBS="-lws2_32 -lkernel32 -luser32 -lgdi32 -lm" WSDL2H_EXTRA_LIBS="-lws2_32 -lkernel32 -luser32 -lgdi32 -lm" ;; *-*-freebsd*) platform=FREEBSD ;; *-*-openbsd*) platform=OPENBSD ;; *-*-irix*) platform=IRIX ;; *-*-aix*) platform=AIX case "${host}" in *-*-aix4.1*) osver=AIX41;; *-*-aix4.2*) osver=AIX42;; *-*-aix4.3*) osver=AIX43;; *-*-aix4.*) osver=AIX43;; *-*-aix5.2) osver=AIX52;; *-*-aix5.3) osver=AIX53;; *-*-aix6.1) osver=AIX61;; esac ;; *-sequent-*) platform=PTX ;; *-*-hp*) platform=HP_UX ; case "${host}" in *-*-hpux11*) osver=HPUX11;; *-*-hpux10*) osver=HPUX10;; *) osver=HPUX11;; esac ;; *-*-mvs*) platform=OS390 ;; *-*-os400*) platform=OS400 ;; *-*-OS400*) platform=OS400 ;; *-*-osf*) platform=TRU64 ;; *-apple-*) platform=MACOSX # Appease 10.7 Lion (OpenSSL deprecated) CXXFLAGS="-Wno-deprecated-declarations" CFLAGS="-Wno-deprecated-declarations" ;; *-nto-qnx) platform=QNX SAMPLE_EXTRA_LIBS="-lsocket -lm" ;; *) platform=UNKNOWN ;; esac # Checks for header files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in arpa/inet.h xlocale.h errno.h fcntl.h ctype.h limits.h float.h math.h netdb.h netinet/in.h stdlib.h string.h strings.h stdint.h inttypes.h time.h sys/inttypes.h sys/socket.h sys/types.h sys/time.h sys/timeb.h unistd.h poll.h openssl/ssl.h gnutls/gnutls.h zlib.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "@%:@define const /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF @%:@define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "@%:@define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if ${ac_cv_struct_tm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "@%:@define TM_IN_SYS_TIME 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct tm" "tm_gmtoff" "ac_cv_member_struct_tm_tm_gmtoff" " #include #include " if test "x$ac_cv_member_struct_tm_tm_gmtoff" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRUCT_TM_TM_GMTOFF 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct tm" "__tm_gmtoff" "ac_cv_member_struct_tm___tm_gmtoff" " #include #include " if test "x$ac_cv_member_struct_tm___tm_gmtoff" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRUCT_TM___TM_GMTOFF 1 _ACEOF fi # Checks for library functions. for ac_header in $ac_header_list do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in $ac_func_list do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mktime" >&5 $as_echo_n "checking for working mktime... " >&6; } if ${ac_cv_func_working_mktime+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_working_mktime=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Test program from Paul Eggert and Tony Leneis. */ #ifdef TIME_WITH_SYS_TIME # include # include #else # ifdef HAVE_SYS_TIME_H # include # else # include # endif #endif #include #include #ifdef HAVE_UNISTD_H # include #endif #ifndef HAVE_ALARM # define alarm(X) /* empty */ #endif /* Work around redefinition to rpl_putenv by other config tests. */ #undef putenv static time_t time_t_max; static time_t time_t_min; /* Values we'll use to set the TZ environment variable. */ static const char *tz_strings[] = { (const char *) 0, "TZ=GMT0", "TZ=JST-9", "TZ=EST+3EDT+2,M10.1.0/00:00:00,M2.3.0/00:00:00" }; #define N_STRINGS (sizeof (tz_strings) / sizeof (tz_strings[0])) /* Return 0 if mktime fails to convert a date in the spring-forward gap. Based on a problem report from Andreas Jaeger. */ static int spring_forward_gap () { /* glibc (up to about 1998-10-07) failed this test. */ struct tm tm; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ((char*) "TZ=PST8PDT,M4.1.0,M10.5.0"); tm.tm_year = 98; tm.tm_mon = 3; tm.tm_mday = 5; tm.tm_hour = 2; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; return mktime (&tm) != (time_t) -1; } static int mktime_test1 (time_t now) { struct tm *lt; return ! (lt = localtime (&now)) || mktime (lt) == now; } static int mktime_test (time_t now) { return (mktime_test1 (now) && mktime_test1 ((time_t) (time_t_max - now)) && mktime_test1 ((time_t) (time_t_min + now))); } static int irix_6_4_bug () { /* Based on code from Ariel Faigon. */ struct tm tm; tm.tm_year = 96; tm.tm_mon = 3; tm.tm_mday = 0; tm.tm_hour = 0; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; mktime (&tm); return tm.tm_mon == 2 && tm.tm_mday == 31; } static int bigtime_test (int j) { struct tm tm; time_t now; tm.tm_year = tm.tm_mon = tm.tm_mday = tm.tm_hour = tm.tm_min = tm.tm_sec = j; now = mktime (&tm); if (now != (time_t) -1) { struct tm *lt = localtime (&now); if (! (lt && lt->tm_year == tm.tm_year && lt->tm_mon == tm.tm_mon && lt->tm_mday == tm.tm_mday && lt->tm_hour == tm.tm_hour && lt->tm_min == tm.tm_min && lt->tm_sec == tm.tm_sec && lt->tm_yday == tm.tm_yday && lt->tm_wday == tm.tm_wday && ((lt->tm_isdst < 0 ? -1 : 0 < lt->tm_isdst) == (tm.tm_isdst < 0 ? -1 : 0 < tm.tm_isdst)))) return 0; } return 1; } static int year_2050_test () { /* The correct answer for 2050-02-01 00:00:00 in Pacific time, ignoring leap seconds. */ unsigned long int answer = 2527315200UL; struct tm tm; time_t t; tm.tm_year = 2050 - 1900; tm.tm_mon = 2 - 1; tm.tm_mday = 1; tm.tm_hour = tm.tm_min = tm.tm_sec = 0; tm.tm_isdst = -1; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ((char*) "TZ=PST8PDT,M4.1.0,M10.5.0"); t = mktime (&tm); /* Check that the result is either a failure, or close enough to the correct answer that we can assume the discrepancy is due to leap seconds. */ return (t == (time_t) -1 || (0 < t && answer - 120 <= t && t <= answer + 120)); } int main () { time_t t, delta; int i, j; /* This test makes some buggy mktime implementations loop. Give up after 60 seconds; a mktime slower than that isn't worth using anyway. */ alarm (60); for (;;) { t = (time_t_max << 1) + 1; if (t <= time_t_max) break; time_t_max = t; } time_t_min = - ((time_t) ~ (time_t) 0 == (time_t) -1) - time_t_max; delta = time_t_max / 997; /* a suitable prime number */ for (i = 0; i < N_STRINGS; i++) { if (tz_strings[i]) putenv ((char*) tz_strings[i]); for (t = 0; t <= time_t_max - delta; t += delta) if (! mktime_test (t)) return 1; if (! (mktime_test ((time_t) 1) && mktime_test ((time_t) (60 * 60)) && mktime_test ((time_t) (60 * 60 * 24)))) return 1; for (j = 1; ; j <<= 1) if (! bigtime_test (j)) return 1; else if (INT_MAX / 2 < j) break; if (! bigtime_test (INT_MAX)) return 1; } return ! (irix_6_4_bug () && spring_forward_gap () && year_2050_test ()); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_working_mktime=yes else ac_cv_func_working_mktime=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_working_mktime" >&5 $as_echo "$ac_cv_func_working_mktime" >&6; } if test $ac_cv_func_working_mktime = no; then case " $LIB@&t@OBJS " in *" mktime.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS mktime.$ac_objext" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 $as_echo_n "checking return type of signal handlers... " >&6; } if ${ac_cv_type_signal+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_signal=int else ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 $as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF @%:@define RETSIGTYPE $ac_cv_type_signal _ACEOF for ac_func in strftime do : ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime" if test "x$ac_cv_func_strftime" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRFTIME 1 _ACEOF else # strftime is in -lintl on SCO UNIX. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strftime in -lintl" >&5 $as_echo_n "checking for strftime in -lintl... " >&6; } if ${ac_cv_lib_intl_strftime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char strftime (); int main () { return strftime (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_strftime=yes else ac_cv_lib_intl_strftime=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_strftime" >&5 $as_echo "$ac_cv_lib_intl_strftime" >&6; } if test "x$ac_cv_lib_intl_strftime" = xyes; then : $as_echo "@%:@define HAVE_STRFTIME 1" >>confdefs.h LIBS="-lintl $LIBS" fi fi done for ac_func in random gettimeofday ftime localtime_r timegm gmtime gmtime_r asctime asctime_r memset select socket snprintf strchr strerror strerror_r strlcpy strrchr strstr strtol strtoul strtoll strtoull strtold strtod strtof strtold_l strtod_l strtof_l sscanf sscanf_l snprintf sprintf_l wctomb mbtowc poll do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # Checks for isnan and isinf ac_fn_c_check_func "$LINENO" "isnan" "ac_cv_func_isnan" if test "x$ac_cv_func_isnan" = xyes; then : has_isnan=1; $as_echo "@%:@define HAVE_ISNAN 1" >>confdefs.h else has_isnan=0 fi ac_fn_c_check_func "$LINENO" "isinf" "ac_cv_func_isinf" if test "x$ac_cv_func_isinf" = xyes; then : has_isinf=1; $as_echo "@%:@define HAVE_ISINF 1" >>confdefs.h else has_isinf=0 fi # check for macro isnan in math if test $has_isnan = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for macro isnan" >&5 $as_echo_n "checking for macro isnan... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { { int foo; foo = isnan(0); } ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : has_isnan=1 else has_isnan=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $has_isnan = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "@%:@define HAVE_ISNAN 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # check for macro isinf in math if test $has_isinf = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for macro isinf" >&5 $as_echo_n "checking for macro isinf... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { { int foo; foo = isinf(0); } ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : has_isinf=1 else has_isinf=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $has_isinf = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "@%:@define HAVE_ISINF 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # Function test depending on platform # AIX Has incompatible gethostbyname_r if test $platform != AIX -a $platform != TRU64; then for ac_func in gethostbyname_r do : ac_fn_c_check_func "$LINENO" "gethostbyname_r" "ac_cv_func_gethostbyname_r" if test "x$ac_cv_func_gethostbyname_r" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_GETHOSTBYNAME_R 1 _ACEOF fi done for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 $as_echo_n "checking for GNU libc compatible malloc... " >&6; } if ${ac_cv_func_malloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_malloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { return ! malloc (0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_malloc_0_nonnull=yes else ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 $as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes; then : $as_echo "@%:@define HAVE_MALLOC 1" >>confdefs.h else $as_echo "@%:@define HAVE_MALLOC 0" >>confdefs.h case " $LIB@&t@OBJS " in *" malloc.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS malloc.$ac_objext" ;; esac $as_echo "@%:@define malloc rpl_malloc" >>confdefs.h fi fi # the debug build options adds symbols to compiler output (-g for g++) @%:@ Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; case "${enableval}" in yes) debug=true ;; no) debug=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;; esac else debug=false fi if test x$debug = xtrue; then DEBUG_COMPILE_TRUE= DEBUG_COMPILE_FALSE='#' else DEBUG_COMPILE_TRUE='#' DEBUG_COMPILE_FALSE= fi if test x$debug = xtrue; then SOAPCPP2_DEBUG="-DDEBUG" ##define DEBUG for debugging else SOAPCPP2_DEBUG= fi # set the default soapcpp2 import path SOAPCPP2_IMPORTPATH="-DSOAPCPP2_IMPORT_PATH=\"\\\"${datadir}/gsoap/import\\\"\"" #SOAPCPP2_IMPORTPATH="-DSOAPCPP2_IMPORT_PATH=\"\\\"`pwd`/gsoap/import\\\"\"" # set the default wsdl2h import path WSDL2H_IMPORTPATH="-DWSDL2H_IMPORT_PATH=\"\\\"${datadir}/gsoap/WS\\\"\"" #WSDL2H_IMPORTPATH="-DWSDL2H_IMPORT_PATH=\"\\\"`pwd`/gsoap/WS\\\"\"" # the disable-namespaces option adds the -DWITH_NONAMESPACES to the # library compilation thus disabling namespaces @%:@ Check whether --enable-namespaces was given. if test "${enable_namespaces+set}" = set; then : enableval=$enable_namespaces; with_namespaces="$enable_ns" else with_namespaces="yes" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for disable namespaces in library" >&5 $as_echo_n "checking for disable namespaces in library... " >&6; } if test "x$with_namespaces" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_NONAMESPACES="-DWITH_NONAMESPACES" ##define to remove nsmap link dependence fi # the enable-ipv6 option adds the -DWITH_IPV6 to the # library compilation thus enabling IPv6 @%:@ Check whether --enable-ipv6 was given. if test "${enable_ipv6+set}" = set; then : enableval=$enable_ipv6; with_ipv6="$enable_ipv6" else with_ipv6="no" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enable ipv6 in library" >&5 $as_echo_n "checking for enable ipv6 in library... " >&6; } if test "x$with_ipv6" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_IPV6="-DWITH_IPV6 -DWITH_NO_IPV6_V6ONLY" ##define to add IPv6 support else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # the zlib installation prefix path @%:@ Check whether --with-zlib was given. if test "${with_zlib+set}" = set; then : withval=$with_zlib; ZLIB=$withval fi # the OpenSSL installation prefix path @%:@ Check whether --with-openssl was given. if test "${with_openssl+set}" = set; then : withval=$with_openssl; OPENSSL=$withval fi # the disable-ssl option removes the dependence on OpenSSL @%:@ Check whether --enable-ssl was given. if test "${enable_ssl+set}" = set; then : enableval=$enable_ssl; with_openssl="$enable_openssl" else with_openssl="yes" fi # the enable-gnutls option enables GNUTLS in favor of OpenSSL @%:@ Check whether --enable-gnutls was given. if test "${enable_gnutls+set}" = set; then : enableval=$enable_gnutls; with_gnutls="$enable_gnutls" else with_gnutls="no" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for disable openssl in library" >&5 $as_echo_n "checking for disable openssl in library... " >&6; } if test "x$with_openssl" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enable gnutls in library" >&5 $as_echo_n "checking for enable gnutls in library... " >&6; } if test "x$with_gnutls" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } WSDL2H_EXTRA_FLAGS="-DWITH_GNUTLS -DWITH_GZIP" WSDL2H_EXTRA_LIBS="${WSDL2H_EXTRA_LIBS} -lgnutls -lgcrypt -lgpg-error -lz" SAMPLE_INCLUDES= SAMPLE_SSL_LIBS="-lgnutls -lgcrypt -lgpg-error -lz" WSDL2H_SOAP_CPP_LIB="libgsoapssl++.a" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } WSDL2H_EXTRA_FLAGS="-DWITH_OPENSSL -DWITH_GZIP" # an ugly hack to get httpda and smdevp plugins to conditionally # compile with wsdl2h when OPENSSL is available WSDL2H_EXTRA_LIBS="${WSDL2H_EXTRA_LIBS} ../plugin/httpda.c ../plugin/smdevp.c ../plugin/threads.c -lssl -lcrypto -lz" SAMPLE_INCLUDES= SAMPLE_SSL_LIBS="-lssl -lcrypto -lz" WSDL2H_SOAP_CPP_LIB="libgsoapssl++.a" fi if test -n "$ZLIB"; then WSDL2H_EXTRA_FLAGS="-I${ZLIB}/include ${WSDL2H_EXTRA_FLAGS}" WSDL2H_EXTRA_LIBS="-L${ZLIB}/lib ${WSDL2H_EXTRA_LIBS}" SAMPLE_INCLUDES="-I${ZLIB}/include ${SAMPLE_SSL_LIBS}" SAMPLE_SSL_LIBS="-L${ZLIB}/lib ${SAMPLE_SSL_LIBS}" fi if test -n "$OPENSSL"; then WSDL2H_EXTRA_FLAGS="-I${OPENSSL}/include ${WSDL2H_EXTRA_FLAGS}" WSDL2H_EXTRA_LIBS="-L${OPENSSL}/lib ${WSDL2H_EXTRA_LIBS}" SAMPLE_INCLUDES="-I${OPENSSL}/include" SAMPLE_SSL_LIBS="-L${OPENSSL}/lib ${SAMPLE_SSL_LIBS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } WSDL2H_EXTRA_FLAGS= SAMPLE_SSL_LIBS= SAMPLE_INCLUDES= WSDL2H_SOAP_CPP_LIB="libgsoap++.a" fi # enable the compile of the samples @%:@ Check whether --enable-samples was given. if test "${enable_samples+set}" = set; then : enableval=$enable_samples; case "${enableval}" in yes) samples=true ;; no) samples=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-samples" "$LINENO" 5 ;; esac else samples=false fi if test x$samples = xtrue; then ENABLE_SAMPLES_TRUE= ENABLE_SAMPLES_FALSE='#' else ENABLE_SAMPLES_TRUE='#' ENABLE_SAMPLES_FALSE= fi if test x$samples = xtrue; then SAMPLE_DIRS=". samples" else SAMPLE_DIRS= fi if test x$LEX = xflex; then LEX_DEFINE=-DWITH_FLEX LEX_FLAGS="-l" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No 'flex' command detected on current path: trying existing scanner" >&5 $as_echo "$as_me: WARNING: No 'flex' command detected on current path: trying existing scanner" >&2;} LEX_DEFINE=-DWITH_LEX LEX_FLAGS= fi # check if we must define -DWITH_BISON if test "$YACC" = "bison -y"; then BISON_DEFINE=-DWITH_BISON YACC_LIB= else BISON_DEFINE=-DWITH_YACC YACC_LIB="-ly" fi ac_config_files="$ac_config_files Makefile gsoap.pc gsoap++.pc gsoapck.pc gsoapck++.pc gsoapssl.pc gsoapssl++.pc gsoap/Makefile gsoap/src/Makefile gsoap/wsdl/Makefile gsoap/samples/Makefile gsoap/samples/autotest/Makefile gsoap/samples/aws/Makefile gsoap/samples/calc/Makefile gsoap/samples/calc++/Makefile gsoap/samples/chaining/Makefile gsoap/samples/chaining++/Makefile gsoap/samples/databinding/Makefile gsoap/samples/dime/Makefile gsoap/samples/dom/Makefile gsoap/samples/oneway/Makefile gsoap/samples/oneway++/Makefile gsoap/samples/factory/Makefile gsoap/samples/factorytest/Makefile gsoap/samples/gmt/Makefile gsoap/samples/googleapi/Makefile gsoap/samples/hello/Makefile gsoap/samples/httpcookies/Makefile gsoap/samples/lu/Makefile gsoap/samples/magic/Makefile gsoap/samples/mashup/Makefile gsoap/samples/mashup++/Makefile gsoap/samples/mtom/Makefile gsoap/samples/mtom-stream/Makefile gsoap/samples/polytest/Makefile gsoap/samples/primes/Makefile gsoap/samples/roll/Makefile gsoap/samples/router/Makefile gsoap/samples/rss/Makefile gsoap/samples/ssl/Makefile gsoap/samples/template/Makefile gsoap/samples/udp/Makefile gsoap/samples/varparam/Makefile gsoap/samples/wsa/Makefile gsoap/samples/wsrm/Makefile gsoap/samples/wsse/Makefile gsoap/samples/wst/Makefile gsoap/samples/xml-rpc-json/Makefile gsoap/samples/rest/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIB@&t@OBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DEBUG_COMPILE_TRUE}" && test -z "${DEBUG_COMPILE_FALSE}"; then as_fn_error $? "conditional \"DEBUG_COMPILE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_SAMPLES_TRUE}" && test -z "${ENABLE_SAMPLES_FALSE}"; then as_fn_error $? "conditional \"ENABLE_SAMPLES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by gsoap $as_me 2.8, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ gsoap config.status 2.8 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX @%:@@%:@ Running $as_me. @%:@@%:@ _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "gsoap.pc") CONFIG_FILES="$CONFIG_FILES gsoap.pc" ;; "gsoap++.pc") CONFIG_FILES="$CONFIG_FILES gsoap++.pc" ;; "gsoapck.pc") CONFIG_FILES="$CONFIG_FILES gsoapck.pc" ;; "gsoapck++.pc") CONFIG_FILES="$CONFIG_FILES gsoapck++.pc" ;; "gsoapssl.pc") CONFIG_FILES="$CONFIG_FILES gsoapssl.pc" ;; "gsoapssl++.pc") CONFIG_FILES="$CONFIG_FILES gsoapssl++.pc" ;; "gsoap/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/Makefile" ;; "gsoap/src/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/src/Makefile" ;; "gsoap/wsdl/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/wsdl/Makefile" ;; "gsoap/samples/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/Makefile" ;; "gsoap/samples/autotest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/autotest/Makefile" ;; "gsoap/samples/aws/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/aws/Makefile" ;; "gsoap/samples/calc/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/calc/Makefile" ;; "gsoap/samples/calc++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/calc++/Makefile" ;; "gsoap/samples/chaining/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/chaining/Makefile" ;; "gsoap/samples/chaining++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/chaining++/Makefile" ;; "gsoap/samples/databinding/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/databinding/Makefile" ;; "gsoap/samples/dime/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/dime/Makefile" ;; "gsoap/samples/dom/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/dom/Makefile" ;; "gsoap/samples/oneway/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/oneway/Makefile" ;; "gsoap/samples/oneway++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/oneway++/Makefile" ;; "gsoap/samples/factory/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/factory/Makefile" ;; "gsoap/samples/factorytest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/factorytest/Makefile" ;; "gsoap/samples/gmt/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/gmt/Makefile" ;; "gsoap/samples/googleapi/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/googleapi/Makefile" ;; "gsoap/samples/hello/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/hello/Makefile" ;; "gsoap/samples/httpcookies/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/httpcookies/Makefile" ;; "gsoap/samples/lu/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/lu/Makefile" ;; "gsoap/samples/magic/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/magic/Makefile" ;; "gsoap/samples/mashup/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mashup/Makefile" ;; "gsoap/samples/mashup++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mashup++/Makefile" ;; "gsoap/samples/mtom/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mtom/Makefile" ;; "gsoap/samples/mtom-stream/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mtom-stream/Makefile" ;; "gsoap/samples/polytest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/polytest/Makefile" ;; "gsoap/samples/primes/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/primes/Makefile" ;; "gsoap/samples/roll/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/roll/Makefile" ;; "gsoap/samples/router/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/router/Makefile" ;; "gsoap/samples/rss/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/rss/Makefile" ;; "gsoap/samples/ssl/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/ssl/Makefile" ;; "gsoap/samples/template/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/template/Makefile" ;; "gsoap/samples/udp/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/udp/Makefile" ;; "gsoap/samples/varparam/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/varparam/Makefile" ;; "gsoap/samples/wsa/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsa/Makefile" ;; "gsoap/samples/wsrm/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsrm/Makefile" ;; "gsoap/samples/wsse/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsse/Makefile" ;; "gsoap/samples/wst/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wst/Makefile" ;; "gsoap/samples/xml-rpc-json/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/xml-rpc-json/Makefile" ;; "gsoap/samples/rest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/rest/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi gsoap-2.8.91/autom4te.cache/output.40000644000175000017500000071475413525245157016550 0ustar ellertellert@%:@! /bin/sh @%:@ Guess values for system-dependent variables and create Makefiles. @%:@ Generated by GNU Autoconf 2.69 for gsoap 2.8. @%:@ @%:@ @%:@ Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @%:@ @%:@ @%:@ This configure script is free software; the Free Software Foundation @%:@ gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in @%:@( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIB@&t@OBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='gsoap' PACKAGE_TARNAME='gsoap' PACKAGE_VERSION='2.8' PACKAGE_STRING='gsoap 2.8' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="gsoap/stdsoap2.cpp" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_list= ac_func_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS YACC_LIB BISON_DEFINE LEX_FLAGS LEX_DEFINE SAMPLE_DIRS ENABLE_SAMPLES ENABLE_SAMPLES_FALSE ENABLE_SAMPLES_TRUE WSDL2H_SOAP_CPP_LIB SAMPLE_SSL_LIBS SAMPLE_INCLUDES WSDL2H_EXTRA_LIBS WSDL2H_EXTRA_FLAGS WITH_OPENSSL WITH_OPENSSL_FALSE WITH_OPENSSL_TRUE SOAPCPP2_IPV6 SOAPCPP2_NO_C_LOCALE SOAPCPP2_INCLUDE_XLOCALE SOAPCPP2_NONAMESPACES WSDL2H_IMPORTPATH SOAPCPP2_IMPORTPATH SOAPCPP2_DEBUG DEBUG_COMPILE_FALSE DEBUG_COMPILE_TRUE LIB@&t@OBJS EGREP GREP platform SAMPLE_EXTRA_LIBS AR LN_S RANLIB CPP YFLAGS YACC LEXLIB LEX_OUTPUT_ROOT LEX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX host_os host_vendor host_cpu host build_os build_vendor build_cpu build AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking enable_debug enable_namespaces enable_xlocale enable_c_locale enable_ipv6 with_zlib with_openssl enable_ssl enable_gnutls enable_samples ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS YACC YFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures gsoap 2.8 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX @<:@@S|@ac_default_prefix@:>@ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX @<:@PREFIX@:>@ By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root @<:@DATAROOTDIR/doc/gsoap@:>@ --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of gsoap 2.8:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-debug add debug symbols for debugging --disable-namespaces compile library without namespaces --enable-xlocale compile library with forced inclusion of xlocale.h --disable-c-locale compile library without c locale usage --enable-ipv6 compile library with IPv6 support --disable-ssl build without SSL/TLS --enable-gnutls build with GNUTLS SSL/TLS --enable-samples enable compile for the gsoap samples Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-zlib=DIR zlib installation prefix --with-openssl=DIR openssl installation prefix Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags YACC The `Yet Another Compiler Compiler' implementation to use. Defaults to the first program found out of: `bison -y', `byacc', `yacc'. YFLAGS The list of arguments that will be passed by default to @S|@YACC. This script will default YFLAGS to the empty string to avoid a default value of `-d' given by some make applications. CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF gsoap configure 2.8 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## @%:@ ac_fn_cxx_try_compile LINENO @%:@ ---------------------------- @%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_cxx_try_compile @%:@ ac_fn_c_try_compile LINENO @%:@ -------------------------- @%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_compile @%:@ ac_fn_c_try_link LINENO @%:@ ----------------------- @%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_link @%:@ ac_fn_c_try_cpp LINENO @%:@ ---------------------- @%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_cpp @%:@ ac_fn_c_try_run LINENO @%:@ ---------------------- @%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes @%:@ that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_run @%:@ ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using @%:@ the include files in INCLUDES and setting the cache variable VAR @%:@ accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_header_mongrel @%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists and can be compiled using the include files in @%:@ INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_header_compile @%:@ ac_fn_c_check_type LINENO TYPE VAR INCLUDES @%:@ ------------------------------------------- @%:@ Tests whether TYPE exists after having included INCLUDES, setting cache @%:@ variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_type @%:@ ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES @%:@ ---------------------------------------------------- @%:@ Tries to find if the field MEMBER exists in type AGGR, after including @%:@ INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_member @%:@ ac_fn_c_check_func LINENO FUNC VAR @%:@ ---------------------------------- @%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by gsoap $as_me 2.8, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in @%:@(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi as_fn_append ac_header_list " sys/time.h" as_fn_append ac_header_list " unistd.h" as_fn_append ac_func_list " alarm" # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.15' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in @%:@(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null @%:@ Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='gsoap' VERSION='2.8' cat >>confdefs.h <<_ACEOF @%:@define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # AC_CONFIG_HEADERS([config.h]) ac_config_headers="$ac_config_headers config.h" # we use subdirs. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi # Checks for programs. ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf @%:@ Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $@%:@ != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi for ac_prog in flex lex do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LEX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LEX"; then ac_cv_prog_LEX="$LEX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LEX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LEX=$ac_cv_prog_LEX if test -n "$LEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5 $as_echo "$LEX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$LEX" && break done test -n "$LEX" || LEX=":" if test "x$LEX" != "x:"; then cat >conftest.l <<_ACEOF %% a { ECHO; } b { REJECT; } c { yymore (); } d { yyless (1); } e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */ yyless ((input () != 0)); } f { unput (yytext[0]); } . { BEGIN INITIAL; } %% #ifdef YYTEXT_POINTER extern char *yytext; #endif int main (void) { return ! yylex () + ! yywrap (); } _ACEOF { { ac_try="$LEX conftest.l" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$LEX conftest.l") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex output file root" >&5 $as_echo_n "checking lex output file root... " >&6; } if ${ac_cv_prog_lex_root+:} false; then : $as_echo_n "(cached) " >&6 else if test -f lex.yy.c; then ac_cv_prog_lex_root=lex.yy elif test -f lexyy.c; then ac_cv_prog_lex_root=lexyy else as_fn_error $? "cannot find output from $LEX; giving up" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5 $as_echo "$ac_cv_prog_lex_root" >&6; } LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root if test -z "${LEXLIB+set}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex library" >&5 $as_echo_n "checking lex library... " >&6; } if ${ac_cv_lib_lex+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS=$LIBS ac_cv_lib_lex='none needed' for ac_lib in '' -lfl -ll; do LIBS="$ac_lib $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_lex=$ac_lib fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext test "$ac_cv_lib_lex" != 'none needed' && break done LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5 $as_echo "$ac_cv_lib_lex" >&6; } test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5 $as_echo_n "checking whether yytext is a pointer... " >&6; } if ${ac_cv_prog_lex_yytext_pointer+:} false; then : $as_echo_n "(cached) " >&6 else # POSIX says lex can declare yytext either as a pointer or an array; the # default is implementation-dependent. Figure out which it is, since # not all implementations provide the %pointer and %array declarations. ac_cv_prog_lex_yytext_pointer=no ac_save_LIBS=$LIBS LIBS="$LEXLIB $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define YYTEXT_POINTER 1 `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_prog_lex_yytext_pointer=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5 $as_echo "$ac_cv_prog_lex_yytext_pointer" >&6; } if test $ac_cv_prog_lex_yytext_pointer = yes; then $as_echo "@%:@define YYTEXT_POINTER 1" >>confdefs.h fi rm -f conftest.l $LEX_OUTPUT_ROOT.c fi if test "$LEX" = :; then LEX=${am_missing_run}flex fi for ac_prog in 'bison -y' byacc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_YACC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$YACC"; then ac_cv_prog_YACC="$YACC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_YACC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi YACC=$ac_cv_prog_YACC if test -n "$YACC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 $as_echo "$YACC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$YACC" && break done test -n "$YACC" || YACC="yacc" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@ifdef __STDC__ @%:@ include @%:@else @%:@ include @%:@endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@ifdef __STDC__ @%:@ include @%:@else @%:@ include @%:@endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi #AM_PROG_LIBTOOL { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="${ac_tool_prefix}ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AR" = x; then AR=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi else AR="$ac_cv_prog_AR" fi # AC_DECL_YYTEXT SAMPLE_EXTRA_LIBS="-lm" # Platform-specific Makefile setup case "${host}" in *-*-solaris*) platform=SUN_OS SAMPLE_EXTRA_LIBS="-lxnet -lsocket -lnsl -lm" WSDL2H_EXTRA_LIBS="-lxnet -lsocket -lnsl -lrt" ;; *-*-sysv5*) platform=UNIXWARE ;; *-*-UnixWare*) platform=UNIXWARE ;; *-*-unixware*) platform=UNIXWARE ;; *-*-sco3.2v5*) platform=OPENSERVER SAMPLE_EXTRA_LIBS="-lsocket -lm" ;; *-*-linux*) platform=LINUX # if test x$debug = xtrue; then # CFLAGS="-g" #don't want the -O2 for debugging. # else # CFLAGS="-O2" #don't want the -g for release compile. # fi ;; *-*-cygwin*) platform=CYGWIN ;; *-*-mingw*) platform=MINGW SAMPLE_EXTRA_LIBS="-lws2_32 -lkernel32 -luser32 -lgdi32 -lm" WSDL2H_EXTRA_LIBS="-lws2_32 -lkernel32 -luser32 -lgdi32 -lm" ;; *-*-freebsd*) platform=FREEBSD ;; *-*-openbsd*) platform=OPENBSD ;; *-*-irix*) platform=IRIX ;; *-*-aix*) platform=AIX case "${host}" in *-*-aix4.1*) osver=AIX41;; *-*-aix4.2*) osver=AIX42;; *-*-aix4.3*) osver=AIX43;; *-*-aix4.*) osver=AIX43;; *-*-aix5.2) osver=AIX52;; *-*-aix5.3) osver=AIX53;; *-*-aix6.1) osver=AIX61;; esac ;; *-sequent-*) platform=PTX ;; *-*-hp*) platform=HP_UX ; case "${host}" in *-*-hpux11*) osver=HPUX11;; *-*-hpux10*) osver=HPUX10;; *) osver=HPUX11;; esac ;; *-*-mvs*) platform=OS390 ;; *-*-os400*) platform=OS400 ;; *-*-OS400*) platform=OS400 ;; *-*-osf*) platform=TRU64 ;; *-apple-*) platform=MACOSX # Appease 10.7 Lion (OpenSSL deprecated) CXXFLAGS="-Wno-deprecated-declarations" CFLAGS="-Wno-deprecated-declarations" ;; *-nto-qnx) platform=QNX SAMPLE_EXTRA_LIBS="-lsocket -lm" ;; *) platform=UNKNOWN ;; esac # Checks for header files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in arpa/inet.h locale.h xlocale.h errno.h fcntl.h ctype.h limits.h float.h math.h netdb.h netinet/in.h stdlib.h string.h strings.h stdint.h inttypes.h time.h sys/inttypes.h sys/socket.h sys/types.h sys/time.h sys/timeb.h unistd.h poll.h openssl/ssl.h gnutls/gnutls.h zlib.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "@%:@define const /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF @%:@define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "@%:@define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if ${ac_cv_struct_tm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "@%:@define TM_IN_SYS_TIME 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct tm" "tm_gmtoff" "ac_cv_member_struct_tm_tm_gmtoff" " #include #include " if test "x$ac_cv_member_struct_tm_tm_gmtoff" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRUCT_TM_TM_GMTOFF 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct tm" "__tm_gmtoff" "ac_cv_member_struct_tm___tm_gmtoff" " #include #include " if test "x$ac_cv_member_struct_tm___tm_gmtoff" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRUCT_TM___TM_GMTOFF 1 _ACEOF fi # Checks for library functions. for ac_header in $ac_header_list do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in $ac_func_list do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mktime" >&5 $as_echo_n "checking for working mktime... " >&6; } if ${ac_cv_func_working_mktime+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_working_mktime=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Test program from Paul Eggert and Tony Leneis. */ #ifdef TIME_WITH_SYS_TIME # include # include #else # ifdef HAVE_SYS_TIME_H # include # else # include # endif #endif #include #include #ifdef HAVE_UNISTD_H # include #endif #ifndef HAVE_ALARM # define alarm(X) /* empty */ #endif /* Work around redefinition to rpl_putenv by other config tests. */ #undef putenv static time_t time_t_max; static time_t time_t_min; /* Values we'll use to set the TZ environment variable. */ static const char *tz_strings[] = { (const char *) 0, "TZ=GMT0", "TZ=JST-9", "TZ=EST+3EDT+2,M10.1.0/00:00:00,M2.3.0/00:00:00" }; #define N_STRINGS (sizeof (tz_strings) / sizeof (tz_strings[0])) /* Return 0 if mktime fails to convert a date in the spring-forward gap. Based on a problem report from Andreas Jaeger. */ static int spring_forward_gap () { /* glibc (up to about 1998-10-07) failed this test. */ struct tm tm; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ((char*) "TZ=PST8PDT,M4.1.0,M10.5.0"); tm.tm_year = 98; tm.tm_mon = 3; tm.tm_mday = 5; tm.tm_hour = 2; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; return mktime (&tm) != (time_t) -1; } static int mktime_test1 (time_t now) { struct tm *lt; return ! (lt = localtime (&now)) || mktime (lt) == now; } static int mktime_test (time_t now) { return (mktime_test1 (now) && mktime_test1 ((time_t) (time_t_max - now)) && mktime_test1 ((time_t) (time_t_min + now))); } static int irix_6_4_bug () { /* Based on code from Ariel Faigon. */ struct tm tm; tm.tm_year = 96; tm.tm_mon = 3; tm.tm_mday = 0; tm.tm_hour = 0; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; mktime (&tm); return tm.tm_mon == 2 && tm.tm_mday == 31; } static int bigtime_test (int j) { struct tm tm; time_t now; tm.tm_year = tm.tm_mon = tm.tm_mday = tm.tm_hour = tm.tm_min = tm.tm_sec = j; now = mktime (&tm); if (now != (time_t) -1) { struct tm *lt = localtime (&now); if (! (lt && lt->tm_year == tm.tm_year && lt->tm_mon == tm.tm_mon && lt->tm_mday == tm.tm_mday && lt->tm_hour == tm.tm_hour && lt->tm_min == tm.tm_min && lt->tm_sec == tm.tm_sec && lt->tm_yday == tm.tm_yday && lt->tm_wday == tm.tm_wday && ((lt->tm_isdst < 0 ? -1 : 0 < lt->tm_isdst) == (tm.tm_isdst < 0 ? -1 : 0 < tm.tm_isdst)))) return 0; } return 1; } static int year_2050_test () { /* The correct answer for 2050-02-01 00:00:00 in Pacific time, ignoring leap seconds. */ unsigned long int answer = 2527315200UL; struct tm tm; time_t t; tm.tm_year = 2050 - 1900; tm.tm_mon = 2 - 1; tm.tm_mday = 1; tm.tm_hour = tm.tm_min = tm.tm_sec = 0; tm.tm_isdst = -1; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ((char*) "TZ=PST8PDT,M4.1.0,M10.5.0"); t = mktime (&tm); /* Check that the result is either a failure, or close enough to the correct answer that we can assume the discrepancy is due to leap seconds. */ return (t == (time_t) -1 || (0 < t && answer - 120 <= t && t <= answer + 120)); } int main () { time_t t, delta; int i, j; /* This test makes some buggy mktime implementations loop. Give up after 60 seconds; a mktime slower than that isn't worth using anyway. */ alarm (60); for (;;) { t = (time_t_max << 1) + 1; if (t <= time_t_max) break; time_t_max = t; } time_t_min = - ((time_t) ~ (time_t) 0 == (time_t) -1) - time_t_max; delta = time_t_max / 997; /* a suitable prime number */ for (i = 0; i < N_STRINGS; i++) { if (tz_strings[i]) putenv ((char*) tz_strings[i]); for (t = 0; t <= time_t_max - delta; t += delta) if (! mktime_test (t)) return 1; if (! (mktime_test ((time_t) 1) && mktime_test ((time_t) (60 * 60)) && mktime_test ((time_t) (60 * 60 * 24)))) return 1; for (j = 1; ; j <<= 1) if (! bigtime_test (j)) return 1; else if (INT_MAX / 2 < j) break; if (! bigtime_test (INT_MAX)) return 1; } return ! (irix_6_4_bug () && spring_forward_gap () && year_2050_test ()); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_working_mktime=yes else ac_cv_func_working_mktime=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_working_mktime" >&5 $as_echo "$ac_cv_func_working_mktime" >&6; } if test $ac_cv_func_working_mktime = no; then case " $LIB@&t@OBJS " in *" mktime.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS mktime.$ac_objext" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 $as_echo_n "checking return type of signal handlers... " >&6; } if ${ac_cv_type_signal+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_signal=int else ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 $as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF @%:@define RETSIGTYPE $ac_cv_type_signal _ACEOF for ac_func in strftime do : ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime" if test "x$ac_cv_func_strftime" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRFTIME 1 _ACEOF else # strftime is in -lintl on SCO UNIX. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strftime in -lintl" >&5 $as_echo_n "checking for strftime in -lintl... " >&6; } if ${ac_cv_lib_intl_strftime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char strftime (); int main () { return strftime (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_strftime=yes else ac_cv_lib_intl_strftime=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_strftime" >&5 $as_echo "$ac_cv_lib_intl_strftime" >&6; } if test "x$ac_cv_lib_intl_strftime" = xyes; then : $as_echo "@%:@define HAVE_STRFTIME 1" >>confdefs.h LIBS="-lintl $LIBS" fi fi done for ac_func in random gettimeofday ftime localtime_r timegm gmtime gmtime_r asctime asctime_r memset select socket snprintf strchr strerror strerror_r strlcpy strrchr strstr strtol strtoul strtoll strtoull strtold strtod strtof strtold_l strtod_l strtof_l sscanf sscanf_l snprintf sprintf_l wctomb mbtowc poll newlocale uselocale freelocale do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # Checks for isnan and isinf ac_fn_c_check_func "$LINENO" "isnan" "ac_cv_func_isnan" if test "x$ac_cv_func_isnan" = xyes; then : has_isnan=1; $as_echo "@%:@define HAVE_ISNAN 1" >>confdefs.h else has_isnan=0 fi ac_fn_c_check_func "$LINENO" "isinf" "ac_cv_func_isinf" if test "x$ac_cv_func_isinf" = xyes; then : has_isinf=1; $as_echo "@%:@define HAVE_ISINF 1" >>confdefs.h else has_isinf=0 fi # check for macro isnan in math if test $has_isnan = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for macro isnan" >&5 $as_echo_n "checking for macro isnan... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { { int foo; foo = isnan(0); } ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : has_isnan=1 else has_isnan=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $has_isnan = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "@%:@define HAVE_ISNAN 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # check for macro isinf in math if test $has_isinf = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for macro isinf" >&5 $as_echo_n "checking for macro isinf... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { { int foo; foo = isinf(0); } ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : has_isinf=1 else has_isinf=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $has_isinf = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "@%:@define HAVE_ISINF 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # Function test depending on platform # AIX Has incompatible gethostbyname_r if test $platform != AIX -a $platform != TRU64; then for ac_func in gethostbyname_r do : ac_fn_c_check_func "$LINENO" "gethostbyname_r" "ac_cv_func_gethostbyname_r" if test "x$ac_cv_func_gethostbyname_r" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_GETHOSTBYNAME_R 1 _ACEOF fi done for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 $as_echo_n "checking for GNU libc compatible malloc... " >&6; } if ${ac_cv_func_malloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_malloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { return ! malloc (0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_malloc_0_nonnull=yes else ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 $as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes; then : $as_echo "@%:@define HAVE_MALLOC 1" >>confdefs.h else $as_echo "@%:@define HAVE_MALLOC 0" >>confdefs.h case " $LIB@&t@OBJS " in *" malloc.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS malloc.$ac_objext" ;; esac $as_echo "@%:@define malloc rpl_malloc" >>confdefs.h fi fi # the debug build options adds symbols to compiler output (-g for g++) @%:@ Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; case "${enableval}" in yes) debug=true ;; no) debug=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;; esac else debug=false fi if test x$debug = xtrue; then DEBUG_COMPILE_TRUE= DEBUG_COMPILE_FALSE='#' else DEBUG_COMPILE_TRUE='#' DEBUG_COMPILE_FALSE= fi if test x$debug = xtrue; then SOAPCPP2_DEBUG="-DDEBUG" ##define DEBUG for debugging else SOAPCPP2_DEBUG= fi # set the default soapcpp2 import path SOAPCPP2_IMPORTPATH="-DSOAPCPP2_IMPORT_PATH=\"\\\"${datadir}/gsoap/import\\\"\"" #SOAPCPP2_IMPORTPATH="-DSOAPCPP2_IMPORT_PATH=\"\\\"`pwd`/gsoap/import\\\"\"" # set the default wsdl2h import path WSDL2H_IMPORTPATH="-DWSDL2H_IMPORT_PATH=\"\\\"${datadir}/gsoap/WS\\\"\"" #WSDL2H_IMPORTPATH="-DWSDL2H_IMPORT_PATH=\"\\\"`pwd`/gsoap/WS\\\"\"" # the disable-namespaces option adds the -DWITH_NONAMESPACES to the # library compilation thus disabling namespaces @%:@ Check whether --enable-namespaces was given. if test "${enable_namespaces+set}" = set; then : enableval=$enable_namespaces; with_namespaces="$enable_ns" else with_namespaces="yes" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for disable namespaces in library" >&5 $as_echo_n "checking for disable namespaces in library... " >&6; } if test "x$with_namespaces" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_NONAMESPACES="-DWITH_NONAMESPACES" ##define to remove nsmap link dependence fi # the enable-xlocale option adds the -DWITH_INCLUDE_XLOCALE_H to the # library compilation thus forcing the inclusion of xlocale.h @%:@ Check whether --enable-xlocale was given. if test "${enable_xlocale+set}" = set; then : enableval=$enable_xlocale; with_xlocale="$enable_xl" else with_xlocale="no" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enable xlocale usage in library" >&5 $as_echo_n "checking for enable xlocale usage in library... " >&6; } if test "x$with_xlocale" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SOAPCPP2_INCLUDE_XLOCALE="-DWITH_INCLUDE_XLOCALE_H" fi # the disable-c-locale option adds the -DWITH_NO_C_LOCALE to the # library compilation thus disabling the use of the C locale usage @%:@ Check whether --enable-c-locale was given. if test "${enable_c_locale+set}" = set; then : enableval=$enable_c_locale; with_no_c_locale="$enable_cl" else with_no_c_locale="yes" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for disable c locale usage in library" >&5 $as_echo_n "checking for disable c locale usage in library... " >&6; } if test "x$with_no_c_locale" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_NO_C_LOCALE="-DWITH_NO_C_LOCALE" fi # the enable-ipv6 option adds the -DWITH_IPV6 to the # library compilation thus enabling IPv6 @%:@ Check whether --enable-ipv6 was given. if test "${enable_ipv6+set}" = set; then : enableval=$enable_ipv6; with_ipv6="$enable_ipv6" else with_ipv6="no" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enable ipv6 in library" >&5 $as_echo_n "checking for enable ipv6 in library... " >&6; } if test "x$with_ipv6" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_IPV6="-DWITH_IPV6 -DWITH_NO_IPV6_V6ONLY" ##define to add IPv6 support else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # the zlib installation prefix path @%:@ Check whether --with-zlib was given. if test "${with_zlib+set}" = set; then : withval=$with_zlib; ZLIB=$withval fi # the OpenSSL installation prefix path @%:@ Check whether --with-openssl was given. if test "${with_openssl+set}" = set; then : withval=$with_openssl; OPENSSL=$withval fi # the disable-ssl option removes the dependence on OpenSSL @%:@ Check whether --enable-ssl was given. if test "${enable_ssl+set}" = set; then : enableval=$enable_ssl; with_openssl="$enable_openssl" else with_openssl="yes" fi # the enable-gnutls option enables GNUTLS in favor of OpenSSL @%:@ Check whether --enable-gnutls was given. if test "${enable_gnutls+set}" = set; then : enableval=$enable_gnutls; with_gnutls="$enable_gnutls" else with_gnutls="no" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for disable openssl in library" >&5 $as_echo_n "checking for disable openssl in library... " >&6; } if test "x$with_openssl" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enable gnutls in library" >&5 $as_echo_n "checking for enable gnutls in library... " >&6; } if test "x$with_gnutls" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } WSDL2H_EXTRA_FLAGS="-DWITH_GNUTLS -DWITH_GZIP" WSDL2H_EXTRA_LIBS="${WSDL2H_EXTRA_LIBS} -lgnutls -lgcrypt -lgpg-error -lz" SAMPLE_INCLUDES= SAMPLE_SSL_LIBS="-lgnutls -lgcrypt -lgpg-error -lz" WSDL2H_SOAP_CPP_LIB="libgsoapssl++.a" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } WSDL2H_EXTRA_FLAGS="-DWITH_OPENSSL -DWITH_GZIP" # compile with wsdl2h when OPENSSL is available WSDL2H_EXTRA_LIBS="${WSDL2H_EXTRA_LIBS} -lssl -lcrypto -lz" SAMPLE_INCLUDES= SAMPLE_SSL_LIBS="-lssl -lcrypto -lz" WSDL2H_SOAP_CPP_LIB="libgsoapssl++.a" fi if test -n "$ZLIB"; then WSDL2H_EXTRA_FLAGS="-I${ZLIB}/include ${WSDL2H_EXTRA_FLAGS}" WSDL2H_EXTRA_LIBS="-L${ZLIB}/lib ${WSDL2H_EXTRA_LIBS}" SAMPLE_INCLUDES="-I${ZLIB}/include ${SAMPLE_SSL_LIBS}" SAMPLE_SSL_LIBS="-L${ZLIB}/lib ${SAMPLE_SSL_LIBS}" fi if test -n "$OPENSSL"; then WSDL2H_EXTRA_FLAGS="-I${OPENSSL}/include ${WSDL2H_EXTRA_FLAGS}" WSDL2H_EXTRA_LIBS="-L${OPENSSL}/lib ${WSDL2H_EXTRA_LIBS}" SAMPLE_INCLUDES="-I${OPENSSL}/include" SAMPLE_SSL_LIBS="-L${OPENSSL}/lib ${SAMPLE_SSL_LIBS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } WSDL2H_EXTRA_FLAGS= SAMPLE_SSL_LIBS= SAMPLE_INCLUDES= WSDL2H_SOAP_CPP_LIB="libgsoap++.a" fi if test "x$with_openssl" = "xyes" -a "x$with_gnutls" != "xyes"; then WITH_OPENSSL_TRUE= WITH_OPENSSL_FALSE='#' else WITH_OPENSSL_TRUE='#' WITH_OPENSSL_FALSE= fi # enable the compile of the samples @%:@ Check whether --enable-samples was given. if test "${enable_samples+set}" = set; then : enableval=$enable_samples; case "${enableval}" in yes) samples=true ;; no) samples=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-samples" "$LINENO" 5 ;; esac else samples=false fi if test x$samples = xtrue; then ENABLE_SAMPLES_TRUE= ENABLE_SAMPLES_FALSE='#' else ENABLE_SAMPLES_TRUE='#' ENABLE_SAMPLES_FALSE= fi if test x$samples = xtrue; then SAMPLE_DIRS=". samples" else SAMPLE_DIRS= fi if test x$LEX = xflex; then LEX_DEFINE=-DWITH_FLEX LEX_FLAGS="-l" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No 'flex' command detected on current path: trying existing scanner" >&5 $as_echo "$as_me: WARNING: No 'flex' command detected on current path: trying existing scanner" >&2;} LEX_DEFINE=-DWITH_LEX LEX_FLAGS= fi # check if we must define -DWITH_BISON if test "$YACC" = "bison -y"; then BISON_DEFINE=-DWITH_BISON YACC_LIB= else BISON_DEFINE=-DWITH_YACC YACC_LIB="-ly" fi ac_config_files="$ac_config_files Makefile gsoap.pc gsoap++.pc gsoapck.pc gsoapck++.pc gsoapssl.pc gsoapssl++.pc gsoap/Makefile gsoap/src/Makefile gsoap/wsdl/Makefile gsoap/samples/Makefile gsoap/samples/autotest/Makefile gsoap/samples/aws/Makefile gsoap/samples/calc/Makefile gsoap/samples/calc++/Makefile gsoap/samples/chaining/Makefile gsoap/samples/chaining++/Makefile gsoap/samples/databinding/Makefile gsoap/samples/dime/Makefile gsoap/samples/dom/Makefile gsoap/samples/oneway/Makefile gsoap/samples/oneway++/Makefile gsoap/samples/factory/Makefile gsoap/samples/factorytest/Makefile gsoap/samples/gmt/Makefile gsoap/samples/googleapi/Makefile gsoap/samples/hello/Makefile gsoap/samples/httpcookies/Makefile gsoap/samples/lu/Makefile gsoap/samples/magic/Makefile gsoap/samples/mashup/Makefile gsoap/samples/mashup++/Makefile gsoap/samples/mtom/Makefile gsoap/samples/mtom-stream/Makefile gsoap/samples/polytest/Makefile gsoap/samples/primes/Makefile gsoap/samples/roll/Makefile gsoap/samples/router/Makefile gsoap/samples/atom/Makefile gsoap/samples/rss/Makefile gsoap/samples/ssl/Makefile gsoap/samples/template/Makefile gsoap/samples/udp/Makefile gsoap/samples/varparam/Makefile gsoap/samples/wsa/Makefile gsoap/samples/wsrm/Makefile gsoap/samples/wsse/Makefile gsoap/samples/wst/Makefile gsoap/samples/xml-rpc-json/Makefile gsoap/samples/rest/Makefile gsoap/samples/testmsgr/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIB@&t@OBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DEBUG_COMPILE_TRUE}" && test -z "${DEBUG_COMPILE_FALSE}"; then as_fn_error $? "conditional \"DEBUG_COMPILE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_OPENSSL_TRUE}" && test -z "${WITH_OPENSSL_FALSE}"; then as_fn_error $? "conditional \"WITH_OPENSSL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_SAMPLES_TRUE}" && test -z "${ENABLE_SAMPLES_FALSE}"; then as_fn_error $? "conditional \"ENABLE_SAMPLES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by gsoap $as_me 2.8, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ gsoap config.status 2.8 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX @%:@@%:@ Running $as_me. @%:@@%:@ _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "gsoap.pc") CONFIG_FILES="$CONFIG_FILES gsoap.pc" ;; "gsoap++.pc") CONFIG_FILES="$CONFIG_FILES gsoap++.pc" ;; "gsoapck.pc") CONFIG_FILES="$CONFIG_FILES gsoapck.pc" ;; "gsoapck++.pc") CONFIG_FILES="$CONFIG_FILES gsoapck++.pc" ;; "gsoapssl.pc") CONFIG_FILES="$CONFIG_FILES gsoapssl.pc" ;; "gsoapssl++.pc") CONFIG_FILES="$CONFIG_FILES gsoapssl++.pc" ;; "gsoap/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/Makefile" ;; "gsoap/src/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/src/Makefile" ;; "gsoap/wsdl/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/wsdl/Makefile" ;; "gsoap/samples/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/Makefile" ;; "gsoap/samples/autotest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/autotest/Makefile" ;; "gsoap/samples/aws/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/aws/Makefile" ;; "gsoap/samples/calc/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/calc/Makefile" ;; "gsoap/samples/calc++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/calc++/Makefile" ;; "gsoap/samples/chaining/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/chaining/Makefile" ;; "gsoap/samples/chaining++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/chaining++/Makefile" ;; "gsoap/samples/databinding/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/databinding/Makefile" ;; "gsoap/samples/dime/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/dime/Makefile" ;; "gsoap/samples/dom/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/dom/Makefile" ;; "gsoap/samples/oneway/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/oneway/Makefile" ;; "gsoap/samples/oneway++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/oneway++/Makefile" ;; "gsoap/samples/factory/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/factory/Makefile" ;; "gsoap/samples/factorytest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/factorytest/Makefile" ;; "gsoap/samples/gmt/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/gmt/Makefile" ;; "gsoap/samples/googleapi/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/googleapi/Makefile" ;; "gsoap/samples/hello/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/hello/Makefile" ;; "gsoap/samples/httpcookies/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/httpcookies/Makefile" ;; "gsoap/samples/lu/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/lu/Makefile" ;; "gsoap/samples/magic/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/magic/Makefile" ;; "gsoap/samples/mashup/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mashup/Makefile" ;; "gsoap/samples/mashup++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mashup++/Makefile" ;; "gsoap/samples/mtom/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mtom/Makefile" ;; "gsoap/samples/mtom-stream/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mtom-stream/Makefile" ;; "gsoap/samples/polytest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/polytest/Makefile" ;; "gsoap/samples/primes/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/primes/Makefile" ;; "gsoap/samples/roll/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/roll/Makefile" ;; "gsoap/samples/router/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/router/Makefile" ;; "gsoap/samples/atom/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/atom/Makefile" ;; "gsoap/samples/rss/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/rss/Makefile" ;; "gsoap/samples/ssl/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/ssl/Makefile" ;; "gsoap/samples/template/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/template/Makefile" ;; "gsoap/samples/udp/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/udp/Makefile" ;; "gsoap/samples/varparam/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/varparam/Makefile" ;; "gsoap/samples/wsa/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsa/Makefile" ;; "gsoap/samples/wsrm/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsrm/Makefile" ;; "gsoap/samples/wsse/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsse/Makefile" ;; "gsoap/samples/wst/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wst/Makefile" ;; "gsoap/samples/xml-rpc-json/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/xml-rpc-json/Makefile" ;; "gsoap/samples/rest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/rest/Makefile" ;; "gsoap/samples/testmsgr/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/testmsgr/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi gsoap-2.8.91/autom4te.cache/output.60000644000175000017500000072004413525245157016537 0ustar ellertellert@%:@! /bin/sh @%:@ Guess values for system-dependent variables and create Makefiles. @%:@ Generated by GNU Autoconf 2.69 for gsoap 2.8. @%:@ @%:@ @%:@ Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @%:@ @%:@ @%:@ This configure script is free software; the Free Software Foundation @%:@ gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in @%:@( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIB@&t@OBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='gsoap' PACKAGE_TARNAME='gsoap' PACKAGE_VERSION='2.8' PACKAGE_STRING='gsoap 2.8' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="gsoap/stdsoap2.cpp" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_list= ac_func_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS YACC_LIB BISON_DEFINE LEX_FLAGS LEX_DEFINE SAMPLE_DIRS ENABLE_SAMPLES ENABLE_SAMPLES_FALSE ENABLE_SAMPLES_TRUE WSDL2H_SOAP_CPP_LIB SAMPLE_SSL_LIBS SAMPLE_INCLUDES WSDL2H_EXTRA_LIBS WSDL2H_EXTRA_FLAGS WITH_OPENSSL WITH_OPENSSL_FALSE WITH_OPENSSL_TRUE SOAPCPP2_IPV6_V6ONLY SOAPCPP2_IPV6 SOAPCPP2_NO_C_LOCALE SOAPCPP2_INCLUDE_XLOCALE SOAPCPP2_NONAMESPACES WSDL2H_IMPORTPATH SOAPCPP2_IMPORTPATH SOAPCPP2_DEBUG DEBUG_COMPILE_FALSE DEBUG_COMPILE_TRUE LIB@&t@OBJS EGREP GREP platform SAMPLE_EXTRA_LIBS AR LN_S RANLIB CPP YFLAGS YACC LEXLIB LEX_OUTPUT_ROOT LEX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX host_os host_vendor host_cpu host build_os build_vendor build_cpu build AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL am__quote' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking enable_debug enable_namespaces enable_xlocale enable_c_locale enable_ipv6 enable_ipv6_v6only with_zlib with_openssl enable_ssl enable_gnutls enable_samples ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS YACC YFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures gsoap 2.8 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX @<:@@S|@ac_default_prefix@:>@ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX @<:@PREFIX@:>@ By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root @<:@DATAROOTDIR/doc/gsoap@:>@ --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of gsoap 2.8:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-debug add debug symbols for debugging --disable-namespaces compile library without namespaces --enable-xlocale compile library with forced inclusion of xlocale.h --disable-c-locale compile library without c locale usage --enable-ipv6 compile library with IPv6 support --enable-ipv6-v6only compile library with IPv6-v6only support --disable-ssl build without SSL/TLS --enable-gnutls build with GNUTLS SSL/TLS --enable-samples enable compile for the gsoap samples Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-zlib=DIR zlib installation prefix --with-openssl=DIR openssl installation prefix Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags YACC The `Yet Another Compiler Compiler' implementation to use. Defaults to the first program found out of: `bison -y', `byacc', `yacc'. YFLAGS The list of arguments that will be passed by default to @S|@YACC. This script will default YFLAGS to the empty string to avoid a default value of `-d' given by some make applications. CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF gsoap configure 2.8 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## @%:@ ac_fn_cxx_try_compile LINENO @%:@ ---------------------------- @%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_cxx_try_compile @%:@ ac_fn_c_try_compile LINENO @%:@ -------------------------- @%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_compile @%:@ ac_fn_c_try_link LINENO @%:@ ----------------------- @%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_link @%:@ ac_fn_c_try_cpp LINENO @%:@ ---------------------- @%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_cpp @%:@ ac_fn_c_try_run LINENO @%:@ ---------------------- @%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes @%:@ that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_run @%:@ ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using @%:@ the include files in INCLUDES and setting the cache variable VAR @%:@ accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_header_mongrel @%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists and can be compiled using the include files in @%:@ INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_header_compile @%:@ ac_fn_c_check_type LINENO TYPE VAR INCLUDES @%:@ ------------------------------------------- @%:@ Tests whether TYPE exists after having included INCLUDES, setting cache @%:@ variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_type @%:@ ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES @%:@ ---------------------------------------------------- @%:@ Tries to find if the field MEMBER exists in type AGGR, after including @%:@ INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_member @%:@ ac_fn_c_check_func LINENO FUNC VAR @%:@ ---------------------------------- @%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by gsoap $as_me 2.8, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in @%:@(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi as_fn_append ac_header_list " sys/time.h" as_fn_append ac_header_list " unistd.h" as_fn_append ac_func_list " alarm" # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.16' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in @%:@(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null @%:@ Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='gsoap' VERSION='2.8' cat >>confdefs.h <<_ACEOF @%:@define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # AC_CONFIG_HEADERS([config.h]) ac_config_headers="$ac_config_headers config.h" # we use subdirs. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi # Checks for programs. ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 $as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; } cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } case $?:`cat confinc.out 2>/dev/null` in @%:@( '0:this is the am__doit target') : case $s in @%:@( BSD) : am__include='.include' am__quote='"' ;; @%:@( *) : am__include='include' am__quote='' ;; esac ;; @%:@( *) : ;; esac if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 $as_echo "${_am_result}" >&6; } @%:@ Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $@%:@ != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi for ac_prog in flex lex do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LEX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LEX"; then ac_cv_prog_LEX="$LEX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LEX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LEX=$ac_cv_prog_LEX if test -n "$LEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5 $as_echo "$LEX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$LEX" && break done test -n "$LEX" || LEX=":" if test "x$LEX" != "x:"; then cat >conftest.l <<_ACEOF %% a { ECHO; } b { REJECT; } c { yymore (); } d { yyless (1); } e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */ yyless ((input () != 0)); } f { unput (yytext[0]); } . { BEGIN INITIAL; } %% #ifdef YYTEXT_POINTER extern char *yytext; #endif int main (void) { return ! yylex () + ! yywrap (); } _ACEOF { { ac_try="$LEX conftest.l" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$LEX conftest.l") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex output file root" >&5 $as_echo_n "checking lex output file root... " >&6; } if ${ac_cv_prog_lex_root+:} false; then : $as_echo_n "(cached) " >&6 else if test -f lex.yy.c; then ac_cv_prog_lex_root=lex.yy elif test -f lexyy.c; then ac_cv_prog_lex_root=lexyy else as_fn_error $? "cannot find output from $LEX; giving up" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5 $as_echo "$ac_cv_prog_lex_root" >&6; } LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root if test -z "${LEXLIB+set}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex library" >&5 $as_echo_n "checking lex library... " >&6; } if ${ac_cv_lib_lex+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS=$LIBS ac_cv_lib_lex='none needed' for ac_lib in '' -lfl -ll; do LIBS="$ac_lib $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_lex=$ac_lib fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext test "$ac_cv_lib_lex" != 'none needed' && break done LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5 $as_echo "$ac_cv_lib_lex" >&6; } test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5 $as_echo_n "checking whether yytext is a pointer... " >&6; } if ${ac_cv_prog_lex_yytext_pointer+:} false; then : $as_echo_n "(cached) " >&6 else # POSIX says lex can declare yytext either as a pointer or an array; the # default is implementation-dependent. Figure out which it is, since # not all implementations provide the %pointer and %array declarations. ac_cv_prog_lex_yytext_pointer=no ac_save_LIBS=$LIBS LIBS="$LEXLIB $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define YYTEXT_POINTER 1 `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_prog_lex_yytext_pointer=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5 $as_echo "$ac_cv_prog_lex_yytext_pointer" >&6; } if test $ac_cv_prog_lex_yytext_pointer = yes; then $as_echo "@%:@define YYTEXT_POINTER 1" >>confdefs.h fi rm -f conftest.l $LEX_OUTPUT_ROOT.c fi if test "$LEX" = :; then LEX=${am_missing_run}flex fi for ac_prog in 'bison -y' byacc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_YACC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$YACC"; then ac_cv_prog_YACC="$YACC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_YACC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi YACC=$ac_cv_prog_YACC if test -n "$YACC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 $as_echo "$YACC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$YACC" && break done test -n "$YACC" || YACC="yacc" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@ifdef __STDC__ @%:@ include @%:@else @%:@ include @%:@endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@ifdef __STDC__ @%:@ include @%:@else @%:@ include @%:@endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi #AM_PROG_LIBTOOL { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="${ac_tool_prefix}ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AR" = x; then AR=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi else AR="$ac_cv_prog_AR" fi # AC_DECL_YYTEXT SAMPLE_EXTRA_LIBS="-lm" # Platform-specific Makefile setup case "${host}" in *-*-solaris*) platform=SUN_OS SAMPLE_EXTRA_LIBS="-lxnet -lsocket -lnsl -lm" WSDL2H_EXTRA_LIBS="-lxnet -lsocket -lnsl -lrt" ;; *-*-sysv5*) platform=UNIXWARE ;; *-*-UnixWare*) platform=UNIXWARE ;; *-*-unixware*) platform=UNIXWARE ;; *-*-sco3.2v5*) platform=OPENSERVER SAMPLE_EXTRA_LIBS="-lsocket -lm" ;; *-*-linux*) platform=LINUX # if test x$debug = xtrue; then # CFLAGS="-g" #don't want the -O2 for debugging. # else # CFLAGS="-O2" #don't want the -g for release compile. # fi ;; *-*-cygwin*) platform=CYGWIN ;; *-*-mingw*) platform=MINGW SAMPLE_EXTRA_LIBS="-lws2_32 -lkernel32 -luser32 -lgdi32 -lm" WSDL2H_EXTRA_LIBS="-lws2_32 -lkernel32 -luser32 -lgdi32 -lm" ;; *-*-freebsd*) platform=FREEBSD ;; *-*-openbsd*) platform=OPENBSD ;; *-*-irix*) platform=IRIX ;; *-*-aix*) platform=AIX case "${host}" in *-*-aix4.1*) osver=AIX41;; *-*-aix4.2*) osver=AIX42;; *-*-aix4.*) osver=AIX43;; *-*-aix5.1*) osver=AIX51;; *-*-aix5.2*) osver=AIX52;; *-*-aix5.3*) osver=AIX53;; *-*-aix6.*) osver=AIX61;; *-*-aix7.*) osver=AIX71;; esac SAMPLE_EXTRA_LIBS="-lm" ;; *-sequent-*) platform=PTX ;; *-*-hp*) platform=HP_UX ; case "${host}" in *-*-hpux11*) osver=HPUX11;; *-*-hpux10*) osver=HPUX10;; *) osver=HPUX11;; esac ;; *-*-mvs*) platform=OS390 ;; *-*-os400*) platform=OS400 ;; *-*-OS400*) platform=OS400 ;; *-*-osf*) platform=TRU64 ;; *-apple-*) platform=MACOSX # Appease 10.7 Lion (OpenSSL deprecated) CXXFLAGS="-Wno-deprecated-declarations" CFLAGS="-Wno-deprecated-declarations" ;; *-nto-qnx) platform=QNX SAMPLE_EXTRA_LIBS="-lsocket -lm" ;; *) platform=UNKNOWN SAMPLE_EXTRA_LIBS="-lm" ;; esac # Checks for header files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in arpa/inet.h locale.h xlocale.h errno.h fcntl.h ctype.h limits.h float.h math.h netdb.h netinet/in.h stdlib.h string.h strings.h stdint.h inttypes.h time.h sys/inttypes.h sys/socket.h sys/types.h sys/time.h sys/timeb.h unistd.h poll.h openssl/ssl.h gnutls/gnutls.h zlib.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" " #if HAVE_SYS_SOCKET_H # include #endif " if test "x$ac_cv_type_socklen_t" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_SOCKLEN_T 1 _ACEOF fi # Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "@%:@define const /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF @%:@define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "@%:@define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if ${ac_cv_struct_tm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "@%:@define TM_IN_SYS_TIME 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct tm" "tm_gmtoff" "ac_cv_member_struct_tm_tm_gmtoff" " #include #include " if test "x$ac_cv_member_struct_tm_tm_gmtoff" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRUCT_TM_TM_GMTOFF 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct tm" "__tm_gmtoff" "ac_cv_member_struct_tm___tm_gmtoff" " #include #include " if test "x$ac_cv_member_struct_tm___tm_gmtoff" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRUCT_TM___TM_GMTOFF 1 _ACEOF fi # Checks for library functions. for ac_header in $ac_header_list do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in $ac_func_list do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mktime" >&5 $as_echo_n "checking for working mktime... " >&6; } if ${ac_cv_func_working_mktime+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_working_mktime=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Test program from Paul Eggert and Tony Leneis. */ #ifdef TIME_WITH_SYS_TIME # include # include #else # ifdef HAVE_SYS_TIME_H # include # else # include # endif #endif #include #include #ifdef HAVE_UNISTD_H # include #endif #ifndef HAVE_ALARM # define alarm(X) /* empty */ #endif /* Work around redefinition to rpl_putenv by other config tests. */ #undef putenv static time_t time_t_max; static time_t time_t_min; /* Values we'll use to set the TZ environment variable. */ static const char *tz_strings[] = { (const char *) 0, "TZ=GMT0", "TZ=JST-9", "TZ=EST+3EDT+2,M10.1.0/00:00:00,M2.3.0/00:00:00" }; #define N_STRINGS (sizeof (tz_strings) / sizeof (tz_strings[0])) /* Return 0 if mktime fails to convert a date in the spring-forward gap. Based on a problem report from Andreas Jaeger. */ static int spring_forward_gap () { /* glibc (up to about 1998-10-07) failed this test. */ struct tm tm; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ((char*) "TZ=PST8PDT,M4.1.0,M10.5.0"); tm.tm_year = 98; tm.tm_mon = 3; tm.tm_mday = 5; tm.tm_hour = 2; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; return mktime (&tm) != (time_t) -1; } static int mktime_test1 (time_t now) { struct tm *lt; return ! (lt = localtime (&now)) || mktime (lt) == now; } static int mktime_test (time_t now) { return (mktime_test1 (now) && mktime_test1 ((time_t) (time_t_max - now)) && mktime_test1 ((time_t) (time_t_min + now))); } static int irix_6_4_bug () { /* Based on code from Ariel Faigon. */ struct tm tm; tm.tm_year = 96; tm.tm_mon = 3; tm.tm_mday = 0; tm.tm_hour = 0; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; mktime (&tm); return tm.tm_mon == 2 && tm.tm_mday == 31; } static int bigtime_test (int j) { struct tm tm; time_t now; tm.tm_year = tm.tm_mon = tm.tm_mday = tm.tm_hour = tm.tm_min = tm.tm_sec = j; now = mktime (&tm); if (now != (time_t) -1) { struct tm *lt = localtime (&now); if (! (lt && lt->tm_year == tm.tm_year && lt->tm_mon == tm.tm_mon && lt->tm_mday == tm.tm_mday && lt->tm_hour == tm.tm_hour && lt->tm_min == tm.tm_min && lt->tm_sec == tm.tm_sec && lt->tm_yday == tm.tm_yday && lt->tm_wday == tm.tm_wday && ((lt->tm_isdst < 0 ? -1 : 0 < lt->tm_isdst) == (tm.tm_isdst < 0 ? -1 : 0 < tm.tm_isdst)))) return 0; } return 1; } static int year_2050_test () { /* The correct answer for 2050-02-01 00:00:00 in Pacific time, ignoring leap seconds. */ unsigned long int answer = 2527315200UL; struct tm tm; time_t t; tm.tm_year = 2050 - 1900; tm.tm_mon = 2 - 1; tm.tm_mday = 1; tm.tm_hour = tm.tm_min = tm.tm_sec = 0; tm.tm_isdst = -1; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ((char*) "TZ=PST8PDT,M4.1.0,M10.5.0"); t = mktime (&tm); /* Check that the result is either a failure, or close enough to the correct answer that we can assume the discrepancy is due to leap seconds. */ return (t == (time_t) -1 || (0 < t && answer - 120 <= t && t <= answer + 120)); } int main () { time_t t, delta; int i, j; /* This test makes some buggy mktime implementations loop. Give up after 60 seconds; a mktime slower than that isn't worth using anyway. */ alarm (60); for (;;) { t = (time_t_max << 1) + 1; if (t <= time_t_max) break; time_t_max = t; } time_t_min = - ((time_t) ~ (time_t) 0 == (time_t) -1) - time_t_max; delta = time_t_max / 997; /* a suitable prime number */ for (i = 0; i < N_STRINGS; i++) { if (tz_strings[i]) putenv ((char*) tz_strings[i]); for (t = 0; t <= time_t_max - delta; t += delta) if (! mktime_test (t)) return 1; if (! (mktime_test ((time_t) 1) && mktime_test ((time_t) (60 * 60)) && mktime_test ((time_t) (60 * 60 * 24)))) return 1; for (j = 1; ; j <<= 1) if (! bigtime_test (j)) return 1; else if (INT_MAX / 2 < j) break; if (! bigtime_test (INT_MAX)) return 1; } return ! (irix_6_4_bug () && spring_forward_gap () && year_2050_test ()); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_working_mktime=yes else ac_cv_func_working_mktime=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_working_mktime" >&5 $as_echo "$ac_cv_func_working_mktime" >&6; } if test $ac_cv_func_working_mktime = no; then case " $LIB@&t@OBJS " in *" mktime.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS mktime.$ac_objext" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 $as_echo_n "checking return type of signal handlers... " >&6; } if ${ac_cv_type_signal+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_signal=int else ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 $as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF @%:@define RETSIGTYPE $ac_cv_type_signal _ACEOF for ac_func in strftime do : ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime" if test "x$ac_cv_func_strftime" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRFTIME 1 _ACEOF else # strftime is in -lintl on SCO UNIX. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strftime in -lintl" >&5 $as_echo_n "checking for strftime in -lintl... " >&6; } if ${ac_cv_lib_intl_strftime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char strftime (); int main () { return strftime (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_strftime=yes else ac_cv_lib_intl_strftime=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_strftime" >&5 $as_echo "$ac_cv_lib_intl_strftime" >&6; } if test "x$ac_cv_lib_intl_strftime" = xyes; then : $as_echo "@%:@define HAVE_STRFTIME 1" >>confdefs.h LIBS="-lintl $LIBS" fi fi done for ac_func in random gettimeofday ftime localtime_r timegm gmtime gmtime_r asctime asctime_r memset select socket snprintf strchr strerror strerror_r strlcpy strlcat strrchr strstr strtol strtoul strtoll strtoull strtold strtod strtof strtold_l strtod_l strtof_l sscanf sscanf_l snprintf sprintf_l wctomb mbtowc poll newlocale uselocale freelocale do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # Checks for isnan and isinf ac_fn_c_check_func "$LINENO" "isnan" "ac_cv_func_isnan" if test "x$ac_cv_func_isnan" = xyes; then : has_isnan=1; $as_echo "@%:@define HAVE_ISNAN 1" >>confdefs.h else has_isnan=0 fi ac_fn_c_check_func "$LINENO" "isinf" "ac_cv_func_isinf" if test "x$ac_cv_func_isinf" = xyes; then : has_isinf=1; $as_echo "@%:@define HAVE_ISINF 1" >>confdefs.h else has_isinf=0 fi # check for macro isnan in math if test $has_isnan = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for macro isnan" >&5 $as_echo_n "checking for macro isnan... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { { int foo; foo = isnan(0); } ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : has_isnan=1 else has_isnan=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $has_isnan = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "@%:@define HAVE_ISNAN 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # check for macro isinf in math if test $has_isinf = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for macro isinf" >&5 $as_echo_n "checking for macro isinf... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { { int foo; foo = isinf(0); } ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : has_isinf=1 else has_isinf=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $has_isinf = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "@%:@define HAVE_ISINF 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # Function test depending on platform # AIX Has incompatible gethostbyname_r if test $platform != AIX -a $platform != TRU64; then for ac_func in gethostbyname_r do : ac_fn_c_check_func "$LINENO" "gethostbyname_r" "ac_cv_func_gethostbyname_r" if test "x$ac_cv_func_gethostbyname_r" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_GETHOSTBYNAME_R 1 _ACEOF fi done for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 $as_echo_n "checking for GNU libc compatible malloc... " >&6; } if ${ac_cv_func_malloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_malloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { return ! malloc (0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_malloc_0_nonnull=yes else ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 $as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes; then : $as_echo "@%:@define HAVE_MALLOC 1" >>confdefs.h else $as_echo "@%:@define HAVE_MALLOC 0" >>confdefs.h case " $LIB@&t@OBJS " in *" malloc.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS malloc.$ac_objext" ;; esac $as_echo "@%:@define malloc rpl_malloc" >>confdefs.h fi fi # the debug build options adds symbols to compiler output (-g for g++) @%:@ Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; case "${enableval}" in yes) debug=true ;; no) debug=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;; esac else debug=false fi if test x$debug = xtrue; then DEBUG_COMPILE_TRUE= DEBUG_COMPILE_FALSE='#' else DEBUG_COMPILE_TRUE='#' DEBUG_COMPILE_FALSE= fi if test x$debug = xtrue; then SOAPCPP2_DEBUG="-DDEBUG" ##define DEBUG for debugging else SOAPCPP2_DEBUG= fi # set the default soapcpp2 import path SOAPCPP2_IMPORTPATH="-DSOAPCPP2_IMPORT_PATH=\"\\\"${datadir}/gsoap/import\\\"\"" #SOAPCPP2_IMPORTPATH="-DSOAPCPP2_IMPORT_PATH=\"\\\"`pwd`/gsoap/import\\\"\"" # set the default wsdl2h import path WSDL2H_IMPORTPATH="-DWSDL2H_IMPORT_PATH=\"\\\"${datadir}/gsoap/WS\\\"\"" #WSDL2H_IMPORTPATH="-DWSDL2H_IMPORT_PATH=\"\\\"`pwd`/gsoap/WS\\\"\"" # the disable-namespaces option adds the -DWITH_NONAMESPACES to the # library compilation thus disabling namespaces @%:@ Check whether --enable-namespaces was given. if test "${enable_namespaces+set}" = set; then : enableval=$enable_namespaces; with_namespaces="$enable_namespaces" else with_namespaces="yes" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for disable namespaces in library" >&5 $as_echo_n "checking for disable namespaces in library... " >&6; } if test "x$with_namespaces" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_NONAMESPACES="-DWITH_NONAMESPACES" ##define to remove nsmap link dependence fi # the enable-xlocale option adds the -DWITH_INCLUDE_XLOCALE_H to the # library compilation thus forcing the inclusion of xlocale.h @%:@ Check whether --enable-xlocale was given. if test "${enable_xlocale+set}" = set; then : enableval=$enable_xlocale; with_xlocale="$enable_xlocale" else with_xlocale="no" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enable xlocale usage in library" >&5 $as_echo_n "checking for enable xlocale usage in library... " >&6; } if test "x$with_xlocale" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_INCLUDE_XLOCALE="-DWITH_INCLUDE_XLOCALE_H" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # the disable-c-locale option adds the -DWITH_NO_C_LOCALE to the # library compilation thus disabling the use of the C locale usage @%:@ Check whether --enable-c-locale was given. if test "${enable_c_locale+set}" = set; then : enableval=$enable_c_locale; with_no_c_locale="$enable_c_locale" else with_no_c_locale="yes" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for disable c locale usage in library" >&5 $as_echo_n "checking for disable c locale usage in library... " >&6; } if test "x$with_no_c_locale" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_NO_C_LOCALE="-DWITH_NO_C_LOCALE" fi # the enable-ipv6 option adds the -DWITH_IPV6 to the # library compilation thus enabling IPv6 @%:@ Check whether --enable-ipv6 was given. if test "${enable_ipv6+set}" = set; then : enableval=$enable_ipv6; with_ipv6="$enable_ipv6" else with_ipv6="no" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enable ipv6 in library" >&5 $as_echo_n "checking for enable ipv6 in library... " >&6; } if test "x$with_ipv6" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_IPV6="-DWITH_IPV6" ##define to add IPv6 support else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # the enable-ipv6-v6only option adds the -DWITH_IPV6_V6ONLY to the # library compilation thus enabling IPv6 without remapping IPv4 to IPv6 @%:@ Check whether --enable-ipv6-v6only was given. if test "${enable_ipv6_v6only+set}" = set; then : enableval=$enable_ipv6_v6only; with_ipv6_v6only="$enable_ipv6_v6only" else with_ipv6_v6only="no" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enable ipv6-v6only in library" >&5 $as_echo_n "checking for enable ipv6-v6only in library... " >&6; } if test "x$with_ipv6_v6only" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_IPV6_V6ONLY="-DWITH_IPV6_V6ONLY" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # the zlib installation prefix path @%:@ Check whether --with-zlib was given. if test "${with_zlib+set}" = set; then : withval=$with_zlib; ZLIB=$withval fi # the OpenSSL installation prefix path @%:@ Check whether --with-openssl was given. if test "${with_openssl+set}" = set; then : withval=$with_openssl; OPENSSL=$withval fi # the disable-ssl option removes the dependence on OpenSSL @%:@ Check whether --enable-ssl was given. if test "${enable_ssl+set}" = set; then : enableval=$enable_ssl; with_openssl="$enable_ssl" else with_openssl="yes" fi # the enable-gnutls option enables GNUTLS in favor of OpenSSL @%:@ Check whether --enable-gnutls was given. if test "${enable_gnutls+set}" = set; then : enableval=$enable_gnutls; with_gnutls="$enable_gnutls" else with_gnutls="no" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for disable openssl in library" >&5 $as_echo_n "checking for disable openssl in library... " >&6; } if test "x$with_openssl" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enable gnutls in library" >&5 $as_echo_n "checking for enable gnutls in library... " >&6; } if test "x$with_gnutls" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } WSDL2H_EXTRA_FLAGS="-DWITH_GNUTLS -DWITH_GZIP" WSDL2H_EXTRA_LIBS="${WSDL2H_EXTRA_LIBS} -lgnutls -lgcrypt -lgpg-error -lz" SAMPLE_INCLUDES= SAMPLE_SSL_LIBS="-lgnutls -lgcrypt -lgpg-error -lz" WSDL2H_SOAP_CPP_LIB="libgsoapssl++.a" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } WSDL2H_EXTRA_FLAGS="-DWITH_OPENSSL -DWITH_GZIP" # compile with wsdl2h when OPENSSL is available WSDL2H_EXTRA_LIBS="${WSDL2H_EXTRA_LIBS} -lssl -lcrypto -lz" SAMPLE_INCLUDES= SAMPLE_SSL_LIBS="-lssl -lcrypto -lz" WSDL2H_SOAP_CPP_LIB="libgsoapssl++.a" fi if test -n "$ZLIB"; then WSDL2H_EXTRA_FLAGS="-I${ZLIB}/include ${WSDL2H_EXTRA_FLAGS}" WSDL2H_EXTRA_LIBS="-L${ZLIB}/lib ${WSDL2H_EXTRA_LIBS}" SAMPLE_INCLUDES="-I${ZLIB}/include ${SAMPLE_SSL_LIBS}" SAMPLE_SSL_LIBS="-L${ZLIB}/lib ${SAMPLE_SSL_LIBS}" fi if test -n "$OPENSSL"; then WSDL2H_EXTRA_FLAGS="-I${OPENSSL}/include ${WSDL2H_EXTRA_FLAGS}" WSDL2H_EXTRA_LIBS="-L${OPENSSL}/lib ${WSDL2H_EXTRA_LIBS}" SAMPLE_INCLUDES="-I${OPENSSL}/include" SAMPLE_SSL_LIBS="-L${OPENSSL}/lib ${SAMPLE_SSL_LIBS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } WSDL2H_EXTRA_FLAGS= SAMPLE_SSL_LIBS= SAMPLE_INCLUDES= WSDL2H_SOAP_CPP_LIB="libgsoap++.a" fi if test "x$with_openssl" = "xyes" -a "x$with_gnutls" != "xyes"; then WITH_OPENSSL_TRUE= WITH_OPENSSL_FALSE='#' else WITH_OPENSSL_TRUE='#' WITH_OPENSSL_FALSE= fi # enable the compile of the samples @%:@ Check whether --enable-samples was given. if test "${enable_samples+set}" = set; then : enableval=$enable_samples; case "${enableval}" in yes) samples=true ;; no) samples=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-samples" "$LINENO" 5 ;; esac else samples=false fi if test x$samples = xtrue; then ENABLE_SAMPLES_TRUE= ENABLE_SAMPLES_FALSE='#' else ENABLE_SAMPLES_TRUE='#' ENABLE_SAMPLES_FALSE= fi if test x$samples = xtrue; then SAMPLE_DIRS=". samples" else SAMPLE_DIRS= fi if test x$LEX = xflex; then LEX_DEFINE=-DWITH_FLEX LEX_FLAGS="-l" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No 'flex' command detected on current path: trying existing scanner" >&5 $as_echo "$as_me: WARNING: No 'flex' command detected on current path: trying existing scanner" >&2;} LEX_DEFINE=-DWITH_LEX LEX_FLAGS= fi # check if we must define -DWITH_BISON if test "$YACC" = "bison -y"; then BISON_DEFINE=-DWITH_BISON YACC_LIB= else BISON_DEFINE=-DWITH_YACC YACC_LIB="-ly" fi ac_config_files="$ac_config_files Makefile gsoap.pc gsoap++.pc gsoapck.pc gsoapck++.pc gsoapssl.pc gsoapssl++.pc gsoap/Makefile gsoap/src/Makefile gsoap/wsdl/Makefile gsoap/samples/Makefile gsoap/samples/autotest/Makefile gsoap/samples/aws/Makefile gsoap/samples/calc/Makefile gsoap/samples/calc++/Makefile gsoap/samples/chaining/Makefile gsoap/samples/chaining++/Makefile gsoap/samples/databinding/Makefile gsoap/samples/dime/Makefile gsoap/samples/dom/Makefile gsoap/samples/oneway/Makefile gsoap/samples/oneway++/Makefile gsoap/samples/factory/Makefile gsoap/samples/factorytest/Makefile gsoap/samples/gmt/Makefile gsoap/samples/googleapi/Makefile gsoap/samples/hello/Makefile gsoap/samples/httpcookies/Makefile gsoap/samples/lu/Makefile gsoap/samples/magic/Makefile gsoap/samples/mashup/Makefile gsoap/samples/mashup++/Makefile gsoap/samples/mtom/Makefile gsoap/samples/mtom-stream/Makefile gsoap/samples/polytest/Makefile gsoap/samples/primes/Makefile gsoap/samples/roll/Makefile gsoap/samples/router/Makefile gsoap/samples/atom/Makefile gsoap/samples/rss/Makefile gsoap/samples/ssl/Makefile gsoap/samples/template/Makefile gsoap/samples/udp/Makefile gsoap/samples/varparam/Makefile gsoap/samples/wsa/Makefile gsoap/samples/wsrm/Makefile gsoap/samples/wsse/Makefile gsoap/samples/wst/Makefile gsoap/samples/xml-rpc-json/Makefile gsoap/samples/rest/Makefile gsoap/samples/testmsgr/Makefile gsoap/samples/async/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIB@&t@OBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DEBUG_COMPILE_TRUE}" && test -z "${DEBUG_COMPILE_FALSE}"; then as_fn_error $? "conditional \"DEBUG_COMPILE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_OPENSSL_TRUE}" && test -z "${WITH_OPENSSL_FALSE}"; then as_fn_error $? "conditional \"WITH_OPENSSL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_SAMPLES_TRUE}" && test -z "${ENABLE_SAMPLES_FALSE}"; then as_fn_error $? "conditional \"ENABLE_SAMPLES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by gsoap $as_me 2.8, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ gsoap config.status 2.8 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX @%:@@%:@ Running $as_me. @%:@@%:@ _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "gsoap.pc") CONFIG_FILES="$CONFIG_FILES gsoap.pc" ;; "gsoap++.pc") CONFIG_FILES="$CONFIG_FILES gsoap++.pc" ;; "gsoapck.pc") CONFIG_FILES="$CONFIG_FILES gsoapck.pc" ;; "gsoapck++.pc") CONFIG_FILES="$CONFIG_FILES gsoapck++.pc" ;; "gsoapssl.pc") CONFIG_FILES="$CONFIG_FILES gsoapssl.pc" ;; "gsoapssl++.pc") CONFIG_FILES="$CONFIG_FILES gsoapssl++.pc" ;; "gsoap/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/Makefile" ;; "gsoap/src/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/src/Makefile" ;; "gsoap/wsdl/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/wsdl/Makefile" ;; "gsoap/samples/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/Makefile" ;; "gsoap/samples/autotest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/autotest/Makefile" ;; "gsoap/samples/aws/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/aws/Makefile" ;; "gsoap/samples/calc/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/calc/Makefile" ;; "gsoap/samples/calc++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/calc++/Makefile" ;; "gsoap/samples/chaining/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/chaining/Makefile" ;; "gsoap/samples/chaining++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/chaining++/Makefile" ;; "gsoap/samples/databinding/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/databinding/Makefile" ;; "gsoap/samples/dime/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/dime/Makefile" ;; "gsoap/samples/dom/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/dom/Makefile" ;; "gsoap/samples/oneway/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/oneway/Makefile" ;; "gsoap/samples/oneway++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/oneway++/Makefile" ;; "gsoap/samples/factory/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/factory/Makefile" ;; "gsoap/samples/factorytest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/factorytest/Makefile" ;; "gsoap/samples/gmt/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/gmt/Makefile" ;; "gsoap/samples/googleapi/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/googleapi/Makefile" ;; "gsoap/samples/hello/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/hello/Makefile" ;; "gsoap/samples/httpcookies/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/httpcookies/Makefile" ;; "gsoap/samples/lu/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/lu/Makefile" ;; "gsoap/samples/magic/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/magic/Makefile" ;; "gsoap/samples/mashup/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mashup/Makefile" ;; "gsoap/samples/mashup++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mashup++/Makefile" ;; "gsoap/samples/mtom/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mtom/Makefile" ;; "gsoap/samples/mtom-stream/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mtom-stream/Makefile" ;; "gsoap/samples/polytest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/polytest/Makefile" ;; "gsoap/samples/primes/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/primes/Makefile" ;; "gsoap/samples/roll/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/roll/Makefile" ;; "gsoap/samples/router/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/router/Makefile" ;; "gsoap/samples/atom/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/atom/Makefile" ;; "gsoap/samples/rss/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/rss/Makefile" ;; "gsoap/samples/ssl/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/ssl/Makefile" ;; "gsoap/samples/template/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/template/Makefile" ;; "gsoap/samples/udp/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/udp/Makefile" ;; "gsoap/samples/varparam/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/varparam/Makefile" ;; "gsoap/samples/wsa/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsa/Makefile" ;; "gsoap/samples/wsrm/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsrm/Makefile" ;; "gsoap/samples/wsse/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsse/Makefile" ;; "gsoap/samples/wst/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wst/Makefile" ;; "gsoap/samples/xml-rpc-json/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/xml-rpc-json/Makefile" ;; "gsoap/samples/rest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/rest/Makefile" ;; "gsoap/samples/testmsgr/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/testmsgr/Makefile" ;; "gsoap/samples/async/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/async/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. case $CONFIG_FILES in @%:@( *\'*) : eval set x "$CONFIG_FILES" ;; @%:@( *) : set x $CONFIG_FILES ;; @%:@( *) : ;; esac shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`$as_dirname -- "$am_mf" || $as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$am_mf" : 'X\(//\)[^/]' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` am_filepart=`$as_basename -- "$am_mf" || $as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$am_mf" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` { echo "$as_me:$LINENO: cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles" >&5 (cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments for automatic dependency tracking. Try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). See \`config.log' for more details" "$LINENO" 5; } fi { am_dirpart=; unset am_dirpart;} { am_filepart=; unset am_filepart;} { am_mf=; unset am_mf;} { am_rc=; unset am_rc;} rm -f conftest-deps.mk } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi gsoap-2.8.91/autom4te.cache/traces.20000644000175000017500000013766713525245157016471 0ustar ellertellertm4trace:/usr/local/share/aclocal-1.14/amversion.m4:20: -1- AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.14' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.14], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) m4trace:/usr/local/share/aclocal-1.14/amversion.m4:37: -1- AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.14])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) m4trace:/usr/local/share/aclocal-1.14/auxdir.m4:52: -1- AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) m4trace:/usr/local/share/aclocal-1.14/cond.m4:32: -1- AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) m4trace:/usr/local/share/aclocal-1.14/depend.m4:156: -1- AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) m4trace:/usr/local/share/aclocal-1.14/depend.m4:166: -1- AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) m4trace:/usr/local/share/aclocal-1.14/depend.m4:189: -1- AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) m4trace:/usr/local/share/aclocal-1.14/depout.m4:61: -1- AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ]) m4trace:/usr/local/share/aclocal-1.14/depout.m4:75: -1- AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) m4trace:/usr/local/share/aclocal-1.14/init.m4:167: -1- AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi]) m4trace:/usr/local/share/aclocal-1.14/init.m4:194: -1- AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) m4trace:/usr/local/share/aclocal-1.14/install-sh.m4:21: -1- AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) m4trace:/usr/local/share/aclocal-1.14/lead-dot.m4:19: -1- AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) m4trace:/usr/local/share/aclocal-1.14/lex.m4:19: -1- AC_DEFUN([AM_PROG_LEX], [AC_PREREQ([2.50])dnl AC_REQUIRE([AM_MISSING_HAS_RUN])dnl AC_REQUIRE([AC_PROG_LEX])dnl if test "$LEX" = :; then LEX=${am_missing_run}flex fi]) m4trace:/usr/local/share/aclocal-1.14/make.m4:49: -1- AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) m4trace:/usr/local/share/aclocal-1.14/missing.m4:14: -1- AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) m4trace:/usr/local/share/aclocal-1.14/missing.m4:38: -1- AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) m4trace:/usr/local/share/aclocal-1.14/obsolete.m4:15: -1- AC_DEFUN([AM_CONFIG_HEADER], [AC_DIAGNOSE([obsolete], ['$0': this macro is obsolete. You should use the 'AC][_CONFIG_HEADERS' macro instead.])dnl AC_CONFIG_HEADERS($@)]) m4trace:/usr/local/share/aclocal-1.14/obsolete.m4:24: -1- AC_DEFUN([AM_PROG_CC_STDC], [AC_PROG_CC am_cv_prog_cc_stdc=$ac_cv_prog_cc_stdc AC_DIAGNOSE([obsolete], ['$0': this macro is obsolete. You should simply use the 'AC][_PROG_CC' macro instead. Also, your code should no longer depend upon 'am_cv_prog_cc_stdc', but upon 'ac_cv_prog_cc_stdc'.])]) m4trace:/usr/local/share/aclocal-1.14/obsolete.m4:27: -1- AC_DEFUN([AM_C_PROTOTYPES], [AC_FATAL([automatic de-ANSI-fication support has been removed])]) m4trace:/usr/local/share/aclocal-1.14/obsolete.m4:28: -1- AU_DEFUN([fp_C_PROTOTYPES], [AM_C_PROTOTYPES]) m4trace:/usr/local/share/aclocal-1.14/obsolete.m4:28: -1- AC_DEFUN([fp_C_PROTOTYPES], [AC_DIAGNOSE([obsolete], [The macro `fp_C_PROTOTYPES' is obsolete. You should run autoupdate.])dnl AM_C_PROTOTYPES]) m4trace:/usr/local/share/aclocal-1.14/options.m4:12: -1- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) m4trace:/usr/local/share/aclocal-1.14/options.m4:18: -1- AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) m4trace:/usr/local/share/aclocal-1.14/options.m4:24: -1- AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) m4trace:/usr/local/share/aclocal-1.14/options.m4:30: -1- AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) m4trace:/usr/local/share/aclocal-1.14/prog-cc-c-o.m4:44: -1- AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) m4trace:/usr/local/share/aclocal-1.14/prog-cc-c-o.m4:47: -1- AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) m4trace:/usr/local/share/aclocal-1.14/runlog.m4:17: -1- AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) m4trace:/usr/local/share/aclocal-1.14/sanity.m4:82: -1- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) m4trace:/usr/local/share/aclocal-1.14/silent.m4:60: -1- AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) m4trace:/usr/local/share/aclocal-1.14/strip.m4:28: -1- AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) m4trace:/usr/local/share/aclocal-1.14/substnot.m4:12: -1- AC_DEFUN([_AM_SUBST_NOTMAKE]) m4trace:/usr/local/share/aclocal-1.14/substnot.m4:17: -1- AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) m4trace:/usr/local/share/aclocal-1.14/tar.m4:132: -1- AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^_?A[CHUM]_]) m4trace:configure.ac:2: -1- m4_pattern_forbid([_AC_]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) m4trace:configure.ac:2: -1- m4_pattern_allow([^AS_FLAGS$]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^_?m4_]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^dnl$]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^_?AS_]) m4trace:configure.ac:2: -1- m4_pattern_allow([^SHELL$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PATH_SEPARATOR$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^exec_prefix$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^prefix$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^program_transform_name$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^bindir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^sbindir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^libexecdir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^datarootdir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^datadir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^sysconfdir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^sharedstatedir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^localstatedir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^includedir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^oldincludedir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^docdir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^infodir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^htmldir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^dvidir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^pdfdir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^psdir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^libdir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^localedir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^mandir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^DEFS$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^ECHO_C$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^ECHO_N$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^ECHO_T$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^build_alias$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^host_alias$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^target_alias$]) m4trace:configure.ac:3: -1- AM_INIT_AUTOMAKE([foreign]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) m4trace:configure.ac:3: -1- AM_SET_CURRENT_AUTOMAKE_VERSION m4trace:configure.ac:3: -1- AM_AUTOMAKE_VERSION([1.14]) m4trace:configure.ac:3: -1- _AM_AUTOCONF_VERSION([2.69]) m4trace:configure.ac:3: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^INSTALL_DATA$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^am__isrc$]) m4trace:configure.ac:3: -1- _AM_SUBST_NOTMAKE([am__isrc]) m4trace:configure.ac:3: -1- m4_pattern_allow([^CYGPATH_W$]) m4trace:configure.ac:3: -1- _AM_SET_OPTIONS([foreign]) m4trace:configure.ac:3: -1- _AM_SET_OPTION([foreign]) m4trace:configure.ac:3: -2- _AM_MANGLE_OPTION([foreign]) m4trace:configure.ac:3: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.ac:3: -1- _AM_IF_OPTION([no-define], [], [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])]) m4trace:configure.ac:3: -2- _AM_MANGLE_OPTION([no-define]) m4trace:configure.ac:3: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.ac:3: -1- AM_SANITY_CHECK m4trace:configure.ac:3: -1- AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) m4trace:configure.ac:3: -1- AM_MISSING_HAS_RUN m4trace:configure.ac:3: -1- AM_AUX_DIR_EXPAND m4trace:configure.ac:3: -1- m4_pattern_allow([^ACLOCAL$]) m4trace:configure.ac:3: -1- AM_MISSING_PROG([AUTOCONF], [autoconf]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AUTOCONF$]) m4trace:configure.ac:3: -1- AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AUTOMAKE$]) m4trace:configure.ac:3: -1- AM_MISSING_PROG([AUTOHEADER], [autoheader]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AUTOHEADER$]) m4trace:configure.ac:3: -1- AM_MISSING_PROG([MAKEINFO], [makeinfo]) m4trace:configure.ac:3: -1- m4_pattern_allow([^MAKEINFO$]) m4trace:configure.ac:3: -1- AM_PROG_INSTALL_SH m4trace:configure.ac:3: -1- m4_pattern_allow([^install_sh$]) m4trace:configure.ac:3: -1- AM_PROG_INSTALL_STRIP m4trace:configure.ac:3: -1- m4_pattern_allow([^STRIP$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^MKDIR_P$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^mkdir_p$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AWK$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^SET_MAKE$]) m4trace:configure.ac:3: -1- AM_SET_LEADING_DOT m4trace:configure.ac:3: -1- m4_pattern_allow([^am__leading_dot$]) m4trace:configure.ac:3: -1- _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) m4trace:configure.ac:3: -2- _AM_MANGLE_OPTION([tar-ustar]) m4trace:configure.ac:3: -1- _AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])]) m4trace:configure.ac:3: -2- _AM_MANGLE_OPTION([tar-pax]) m4trace:configure.ac:3: -1- _AM_PROG_TAR([v7]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AMTAR$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^am__tar$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^am__untar$]) m4trace:configure.ac:3: -1- _AM_IF_OPTION([no-dependencies], [], [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) m4trace:configure.ac:3: -2- _AM_MANGLE_OPTION([no-dependencies]) m4trace:configure.ac:3: -1- AM_SILENT_RULES m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_V$]) m4trace:configure.ac:3: -1- AM_SUBST_NOTMAKE([AM_V]) m4trace:configure.ac:3: -1- _AM_SUBST_NOTMAKE([AM_V]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_DEFAULT_V$]) m4trace:configure.ac:3: -1- AM_SUBST_NOTMAKE([AM_DEFAULT_V]) m4trace:configure.ac:3: -1- _AM_SUBST_NOTMAKE([AM_DEFAULT_V]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_DEFAULT_VERBOSITY$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_BACKSLASH$]) m4trace:configure.ac:3: -1- _AM_SUBST_NOTMAKE([AM_BACKSLASH]) m4trace:configure.ac:5: -1- m4_pattern_allow([^build$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^build_cpu$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^build_vendor$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^build_os$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^host$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^host_cpu$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^host_vendor$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^host_os$]) m4trace:configure.ac:8: -1- AM_CONFIG_HEADER([config.h]) m4trace:configure.ac:8: -1- _m4_warn([obsolete], ['AM_CONFIG_HEADER': this macro is obsolete. You should use the 'AC_CONFIG_HEADERS' macro instead.], [/usr/local/share/aclocal-1.14/obsolete.m4:15: AM_CONFIG_HEADER is expanded from... configure.ac:8: the top level]) m4trace:configure.ac:11: -1- m4_pattern_allow([^SET_MAKE$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CXX$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CXXFLAGS$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CXX$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^ac_ct_CXX$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^EXEEXT$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^OBJEXT$]) m4trace:configure.ac:13: -1- _AM_DEPENDENCIES([CXX]) m4trace:configure.ac:13: -1- AM_SET_DEPDIR m4trace:configure.ac:13: -1- m4_pattern_allow([^DEPDIR$]) m4trace:configure.ac:13: -1- AM_OUTPUT_DEPENDENCY_COMMANDS m4trace:configure.ac:13: -1- AM_MAKE_INCLUDE m4trace:configure.ac:13: -1- m4_pattern_allow([^am__include$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__quote$]) m4trace:configure.ac:13: -1- AM_DEP_TRACK m4trace:configure.ac:13: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) m4trace:configure.ac:13: -1- m4_pattern_allow([^AMDEP_TRUE$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^AMDEP_FALSE$]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE]) m4trace:configure.ac:13: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__nodep$]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([am__nodep]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CXXDEPMODE$]) m4trace:configure.ac:13: -1- AM_CONDITIONAL([am__fastdepCXX], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CFLAGS$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^ac_ct_CC$]) m4trace:configure.ac:14: -1- _AM_PROG_CC_C_O m4trace:configure.ac:14: -1- AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) m4trace:configure.ac:14: -1- _AM_DEPENDENCIES([CC]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CCDEPMODE$]) m4trace:configure.ac:14: -1- AM_CONDITIONAL([am__fastdepCC], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) m4trace:configure.ac:14: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) m4trace:configure.ac:14: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE]) m4trace:configure.ac:14: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE]) m4trace:configure.ac:15: -1- AM_PROG_CC_C_O m4trace:configure.ac:16: -1- AM_PROG_LEX m4trace:configure.ac:16: -1- m4_pattern_allow([^LEX$]) m4trace:configure.ac:16: -1- m4_pattern_allow([^LEX_OUTPUT_ROOT$]) m4trace:configure.ac:16: -1- m4_pattern_allow([^LEXLIB$]) m4trace:configure.ac:16: -1- m4_pattern_allow([^YYTEXT_POINTER$]) m4trace:configure.ac:17: -1- m4_pattern_allow([^YACC$]) m4trace:configure.ac:17: -1- m4_pattern_allow([^YACC$]) m4trace:configure.ac:17: -1- m4_pattern_allow([^YFLAGS$]) m4trace:configure.ac:18: -1- m4_pattern_allow([^CPP$]) m4trace:configure.ac:18: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:18: -1- m4_pattern_allow([^CPP$]) m4trace:configure.ac:19: -1- m4_pattern_allow([^RANLIB$]) m4trace:configure.ac:21: -1- m4_pattern_allow([^LN_S$]) m4trace:configure.ac:22: -1- m4_pattern_allow([^AWK$]) m4trace:configure.ac:90: -1- m4_pattern_allow([^SAMPLE_EXTRA_LIBS$]) m4trace:configure.ac:91: -1- m4_pattern_allow([^platform$]) m4trace:configure.ac:94: -1- m4_pattern_allow([^GREP$]) m4trace:configure.ac:94: -1- m4_pattern_allow([^EGREP$]) m4trace:configure.ac:94: -1- m4_pattern_allow([^STDC_HEADERS$]) m4trace:configure.ac:98: -1- m4_pattern_allow([^const$]) m4trace:configure.ac:99: -1- m4_pattern_allow([^size_t$]) m4trace:configure.ac:100: -1- m4_pattern_allow([^TIME_WITH_SYS_TIME$]) m4trace:configure.ac:101: -1- m4_pattern_allow([^TM_IN_SYS_TIME$]) m4trace:configure.ac:106: -1- m4_pattern_allow([^HAVE_STRUCT_TM_TM_GMTOFF$]) m4trace:configure.ac:106: -1- m4_pattern_allow([^HAVE_STRUCT_TM___TM_GMTOFF$]) m4trace:configure.ac:109: -1- AC_DEFUN([_AC_Header_sys_time_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_list], [" sys/time.h"])]) _AC_HEADERS_EXPANSION]) m4trace:configure.ac:109: -1- AC_DEFUN([_AC_Header_unistd_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_list], [" unistd.h"])]) _AC_HEADERS_EXPANSION]) m4trace:configure.ac:109: -1- AC_DEFUN([_AC_Func_alarm], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_func_list], [" alarm"])]) _AC_FUNCS_EXPANSION]) m4trace:configure.ac:109: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:110: -1- _m4_warn([obsolete], [The macro `AC_TYPE_SIGNAL' is obsolete. You should run autoupdate.], [../../lib/autoconf/types.m4:759: AC_TYPE_SIGNAL is expanded from... configure.ac:110: the top level]) m4trace:configure.ac:110: -1- m4_pattern_allow([^RETSIGTYPE$]) m4trace:configure.ac:111: -1- m4_pattern_allow([^HAVE_STRFTIME$]) m4trace:configure.ac:111: -1- m4_pattern_allow([^HAVE_STRFTIME$]) m4trace:configure.ac:115: -1- m4_pattern_allow([^HAVE_ISNAN$]) m4trace:configure.ac:116: -1- m4_pattern_allow([^HAVE_ISINF$]) m4trace:configure.ac:124: -1- m4_pattern_allow([^HAVE_ISNAN$]) m4trace:configure.ac:136: -1- m4_pattern_allow([^HAVE_ISINF$]) m4trace:configure.ac:145: -1- m4_pattern_allow([^HAVE_GETHOSTBYNAME_R$]) m4trace:configure.ac:146: -1- m4_pattern_allow([^HAVE_STDLIB_H$]) m4trace:configure.ac:146: -1- m4_pattern_allow([^HAVE_MALLOC$]) m4trace:configure.ac:146: -1- m4_pattern_allow([^HAVE_MALLOC$]) m4trace:configure.ac:146: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:146: -1- m4_pattern_allow([^malloc$]) m4trace:configure.ac:157: -1- AM_CONDITIONAL([DEBUG_COMPILE], [test x$debug = xtrue]) m4trace:configure.ac:157: -1- m4_pattern_allow([^DEBUG_COMPILE_TRUE$]) m4trace:configure.ac:157: -1- m4_pattern_allow([^DEBUG_COMPILE_FALSE$]) m4trace:configure.ac:157: -1- _AM_SUBST_NOTMAKE([DEBUG_COMPILE_TRUE]) m4trace:configure.ac:157: -1- _AM_SUBST_NOTMAKE([DEBUG_COMPILE_FALSE]) m4trace:configure.ac:163: -1- m4_pattern_allow([^SOAPCPP2_DEBUG$]) m4trace:configure.ac:168: -1- m4_pattern_allow([^SOAPCPP2_IMPORTPATH$]) m4trace:configure.ac:173: -1- m4_pattern_allow([^WSDL2H_IMPORTPATH$]) m4trace:configure.ac:181: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:181: the top level]) m4trace:configure.ac:190: -1- m4_pattern_allow([^SOAPCPP2_NONAMESPACES$]) m4trace:configure.ac:198: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:198: the top level]) m4trace:configure.ac:207: -1- m4_pattern_allow([^SOAPCPP2_IPV6$]) m4trace:configure.ac:226: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:226: the top level]) m4trace:configure.ac:233: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:233: the top level]) m4trace:configure.ac:275: -1- m4_pattern_allow([^WSDL2H_EXTRA_FLAGS$]) m4trace:configure.ac:276: -1- m4_pattern_allow([^WSDL2H_EXTRA_LIBS$]) m4trace:configure.ac:277: -1- m4_pattern_allow([^SAMPLE_INCLUDES$]) m4trace:configure.ac:278: -1- m4_pattern_allow([^SAMPLE_SSL_LIBS$]) m4trace:configure.ac:279: -1- m4_pattern_allow([^WSDL2H_SOAP_CPP_LIB$]) m4trace:configure.ac:289: -1- AM_CONDITIONAL([ENABLE_SAMPLES], [test x$samples = xtrue]) m4trace:configure.ac:289: -1- m4_pattern_allow([^ENABLE_SAMPLES_TRUE$]) m4trace:configure.ac:289: -1- m4_pattern_allow([^ENABLE_SAMPLES_FALSE$]) m4trace:configure.ac:289: -1- _AM_SUBST_NOTMAKE([ENABLE_SAMPLES_TRUE]) m4trace:configure.ac:289: -1- _AM_SUBST_NOTMAKE([ENABLE_SAMPLES_FALSE]) m4trace:configure.ac:290: -1- m4_pattern_allow([^ENABLE_SAMPLES$]) m4trace:configure.ac:297: -1- m4_pattern_allow([^SAMPLE_DIRS$]) m4trace:configure.ac:307: -1- m4_pattern_allow([^LEX_DEFINE$]) m4trace:configure.ac:308: -1- m4_pattern_allow([^LEX_FLAGS$]) m4trace:configure.ac:309: -1- m4_pattern_allow([^LEXLIB$]) m4trace:configure.ac:319: -1- m4_pattern_allow([^BISON_DEFINE$]) m4trace:configure.ac:320: -1- m4_pattern_allow([^YACC_LIB$]) m4trace:configure.ac:367: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:367: -1- m4_pattern_allow([^LTLIBOBJS$]) m4trace:configure.ac:367: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) m4trace:configure.ac:367: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) m4trace:configure.ac:367: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) m4trace:configure.ac:367: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) m4trace:configure.ac:367: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) m4trace:configure.ac:367: -1- _AC_AM_CONFIG_HEADER_HOOK(["$ac_file"]) m4trace:configure.ac:367: -1- _AM_OUTPUT_DEPENDENCY_COMMANDS gsoap-2.8.91/autom4te.cache/traces.50000644000175000017500000015400313525245157016453 0ustar ellertellertm4trace:aclocal.m4:697: -1- AC_SUBST([am__quote]) m4trace:aclocal.m4:697: -1- AC_SUBST_TRACE([am__quote]) m4trace:aclocal.m4:697: -1- m4_pattern_allow([^am__quote$]) m4trace:configure.ac:2: -1- AC_INIT([gsoap], [2.8]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^_?A[CHUM]_]) m4trace:configure.ac:2: -1- m4_pattern_forbid([_AC_]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) m4trace:configure.ac:2: -1- m4_pattern_allow([^AS_FLAGS$]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^_?m4_]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^dnl$]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^_?AS_]) m4trace:configure.ac:2: -1- AC_SUBST([SHELL]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([SHELL]) m4trace:configure.ac:2: -1- m4_pattern_allow([^SHELL$]) m4trace:configure.ac:2: -1- AC_SUBST([PATH_SEPARATOR]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PATH_SEPARATOR]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PATH_SEPARATOR$]) m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_NAME], [m4_ifdef([AC_PACKAGE_NAME], ['AC_PACKAGE_NAME'])]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_NAME]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_TARNAME], [m4_ifdef([AC_PACKAGE_TARNAME], ['AC_PACKAGE_TARNAME'])]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_TARNAME]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_VERSION], [m4_ifdef([AC_PACKAGE_VERSION], ['AC_PACKAGE_VERSION'])]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_VERSION]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_STRING], [m4_ifdef([AC_PACKAGE_STRING], ['AC_PACKAGE_STRING'])]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_STRING]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_URL], [m4_ifdef([AC_PACKAGE_URL], ['AC_PACKAGE_URL'])]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_URL]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.ac:2: -1- AC_SUBST([exec_prefix], [NONE]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([exec_prefix]) m4trace:configure.ac:2: -1- m4_pattern_allow([^exec_prefix$]) m4trace:configure.ac:2: -1- AC_SUBST([prefix], [NONE]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([prefix]) m4trace:configure.ac:2: -1- m4_pattern_allow([^prefix$]) m4trace:configure.ac:2: -1- AC_SUBST([program_transform_name], [s,x,x,]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([program_transform_name]) m4trace:configure.ac:2: -1- m4_pattern_allow([^program_transform_name$]) m4trace:configure.ac:2: -1- AC_SUBST([bindir], ['${exec_prefix}/bin']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([bindir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^bindir$]) m4trace:configure.ac:2: -1- AC_SUBST([sbindir], ['${exec_prefix}/sbin']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([sbindir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^sbindir$]) m4trace:configure.ac:2: -1- AC_SUBST([libexecdir], ['${exec_prefix}/libexec']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([libexecdir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^libexecdir$]) m4trace:configure.ac:2: -1- AC_SUBST([datarootdir], ['${prefix}/share']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([datarootdir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^datarootdir$]) m4trace:configure.ac:2: -1- AC_SUBST([datadir], ['${datarootdir}']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([datadir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^datadir$]) m4trace:configure.ac:2: -1- AC_SUBST([sysconfdir], ['${prefix}/etc']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([sysconfdir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^sysconfdir$]) m4trace:configure.ac:2: -1- AC_SUBST([sharedstatedir], ['${prefix}/com']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([sharedstatedir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^sharedstatedir$]) m4trace:configure.ac:2: -1- AC_SUBST([localstatedir], ['${prefix}/var']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([localstatedir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^localstatedir$]) m4trace:configure.ac:2: -1- AC_SUBST([includedir], ['${prefix}/include']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([includedir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^includedir$]) m4trace:configure.ac:2: -1- AC_SUBST([oldincludedir], ['/usr/include']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([oldincludedir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^oldincludedir$]) m4trace:configure.ac:2: -1- AC_SUBST([docdir], [m4_ifset([AC_PACKAGE_TARNAME], ['${datarootdir}/doc/${PACKAGE_TARNAME}'], ['${datarootdir}/doc/${PACKAGE}'])]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([docdir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^docdir$]) m4trace:configure.ac:2: -1- AC_SUBST([infodir], ['${datarootdir}/info']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([infodir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^infodir$]) m4trace:configure.ac:2: -1- AC_SUBST([htmldir], ['${docdir}']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([htmldir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^htmldir$]) m4trace:configure.ac:2: -1- AC_SUBST([dvidir], ['${docdir}']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([dvidir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^dvidir$]) m4trace:configure.ac:2: -1- AC_SUBST([pdfdir], ['${docdir}']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([pdfdir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^pdfdir$]) m4trace:configure.ac:2: -1- AC_SUBST([psdir], ['${docdir}']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([psdir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^psdir$]) m4trace:configure.ac:2: -1- AC_SUBST([libdir], ['${exec_prefix}/lib']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([libdir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^libdir$]) m4trace:configure.ac:2: -1- AC_SUBST([localedir], ['${datarootdir}/locale']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([localedir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^localedir$]) m4trace:configure.ac:2: -1- AC_SUBST([mandir], ['${datarootdir}/man']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([mandir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^mandir$]) m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */ @%:@undef PACKAGE_NAME]) m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */ @%:@undef PACKAGE_TARNAME]) m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */ @%:@undef PACKAGE_VERSION]) m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */ @%:@undef PACKAGE_STRING]) m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */ @%:@undef PACKAGE_BUGREPORT]) m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_URL]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_URL], [/* Define to the home page for this package. */ @%:@undef PACKAGE_URL]) m4trace:configure.ac:2: -1- AC_SUBST([DEFS]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([DEFS]) m4trace:configure.ac:2: -1- m4_pattern_allow([^DEFS$]) m4trace:configure.ac:2: -1- AC_SUBST([ECHO_C]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([ECHO_C]) m4trace:configure.ac:2: -1- m4_pattern_allow([^ECHO_C$]) m4trace:configure.ac:2: -1- AC_SUBST([ECHO_N]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([ECHO_N]) m4trace:configure.ac:2: -1- m4_pattern_allow([^ECHO_N$]) m4trace:configure.ac:2: -1- AC_SUBST([ECHO_T]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([ECHO_T]) m4trace:configure.ac:2: -1- m4_pattern_allow([^ECHO_T$]) m4trace:configure.ac:2: -1- AC_SUBST([LIBS]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.ac:2: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:2: -1- AC_SUBST([build_alias]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([build_alias]) m4trace:configure.ac:2: -1- m4_pattern_allow([^build_alias$]) m4trace:configure.ac:2: -1- AC_SUBST([host_alias]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([host_alias]) m4trace:configure.ac:2: -1- m4_pattern_allow([^host_alias$]) m4trace:configure.ac:2: -1- AC_SUBST([target_alias]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([target_alias]) m4trace:configure.ac:2: -1- m4_pattern_allow([^target_alias$]) m4trace:configure.ac:3: -1- AM_INIT_AUTOMAKE([foreign]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) m4trace:configure.ac:3: -1- AM_AUTOMAKE_VERSION([1.16.1]) m4trace:configure.ac:3: -1- AC_REQUIRE_AUX_FILE([install-sh]) m4trace:configure.ac:3: -1- AC_SUBST([INSTALL_PROGRAM]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([INSTALL_PROGRAM]) m4trace:configure.ac:3: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) m4trace:configure.ac:3: -1- AC_SUBST([INSTALL_SCRIPT]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([INSTALL_SCRIPT]) m4trace:configure.ac:3: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) m4trace:configure.ac:3: -1- AC_SUBST([INSTALL_DATA]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([INSTALL_DATA]) m4trace:configure.ac:3: -1- m4_pattern_allow([^INSTALL_DATA$]) m4trace:configure.ac:3: -1- AC_SUBST([am__isrc], [' -I$(srcdir)']) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([am__isrc]) m4trace:configure.ac:3: -1- m4_pattern_allow([^am__isrc$]) m4trace:configure.ac:3: -1- _AM_SUBST_NOTMAKE([am__isrc]) m4trace:configure.ac:3: -1- AC_SUBST([CYGPATH_W]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([CYGPATH_W]) m4trace:configure.ac:3: -1- m4_pattern_allow([^CYGPATH_W$]) m4trace:configure.ac:3: -1- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME']) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([PACKAGE]) m4trace:configure.ac:3: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.ac:3: -1- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION']) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([VERSION]) m4trace:configure.ac:3: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.ac:3: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE]) m4trace:configure.ac:3: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.ac:3: -1- AH_OUTPUT([PACKAGE], [/* Name of package */ @%:@undef PACKAGE]) m4trace:configure.ac:3: -1- AC_DEFINE_TRACE_LITERAL([VERSION]) m4trace:configure.ac:3: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.ac:3: -1- AH_OUTPUT([VERSION], [/* Version number of package */ @%:@undef VERSION]) m4trace:configure.ac:3: -1- AC_REQUIRE_AUX_FILE([missing]) m4trace:configure.ac:3: -1- AC_SUBST([ACLOCAL]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([ACLOCAL]) m4trace:configure.ac:3: -1- m4_pattern_allow([^ACLOCAL$]) m4trace:configure.ac:3: -1- AC_SUBST([AUTOCONF]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([AUTOCONF]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AUTOCONF$]) m4trace:configure.ac:3: -1- AC_SUBST([AUTOMAKE]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([AUTOMAKE]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AUTOMAKE$]) m4trace:configure.ac:3: -1- AC_SUBST([AUTOHEADER]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([AUTOHEADER]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AUTOHEADER$]) m4trace:configure.ac:3: -1- AC_SUBST([MAKEINFO]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([MAKEINFO]) m4trace:configure.ac:3: -1- m4_pattern_allow([^MAKEINFO$]) m4trace:configure.ac:3: -1- AC_SUBST([install_sh]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([install_sh]) m4trace:configure.ac:3: -1- m4_pattern_allow([^install_sh$]) m4trace:configure.ac:3: -1- AC_SUBST([STRIP]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([STRIP]) m4trace:configure.ac:3: -1- m4_pattern_allow([^STRIP$]) m4trace:configure.ac:3: -1- AC_SUBST([INSTALL_STRIP_PROGRAM]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([INSTALL_STRIP_PROGRAM]) m4trace:configure.ac:3: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) m4trace:configure.ac:3: -1- AC_REQUIRE_AUX_FILE([install-sh]) m4trace:configure.ac:3: -1- AC_SUBST([MKDIR_P]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([MKDIR_P]) m4trace:configure.ac:3: -1- m4_pattern_allow([^MKDIR_P$]) m4trace:configure.ac:3: -1- AC_SUBST([mkdir_p], ['$(MKDIR_P)']) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([mkdir_p]) m4trace:configure.ac:3: -1- m4_pattern_allow([^mkdir_p$]) m4trace:configure.ac:3: -1- AC_SUBST([AWK]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([AWK]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AWK$]) m4trace:configure.ac:3: -1- AC_SUBST([SET_MAKE]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([SET_MAKE]) m4trace:configure.ac:3: -1- m4_pattern_allow([^SET_MAKE$]) m4trace:configure.ac:3: -1- AC_SUBST([am__leading_dot]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([am__leading_dot]) m4trace:configure.ac:3: -1- m4_pattern_allow([^am__leading_dot$]) m4trace:configure.ac:3: -1- AC_SUBST([AMTAR], ['$${TAR-tar}']) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([AMTAR]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AMTAR$]) m4trace:configure.ac:3: -1- AC_SUBST([am__tar]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([am__tar]) m4trace:configure.ac:3: -1- m4_pattern_allow([^am__tar$]) m4trace:configure.ac:3: -1- AC_SUBST([am__untar]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([am__untar]) m4trace:configure.ac:3: -1- m4_pattern_allow([^am__untar$]) m4trace:configure.ac:3: -1- AM_SILENT_RULES m4trace:configure.ac:3: -1- AC_SUBST([AM_V]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([AM_V]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_V$]) m4trace:configure.ac:3: -1- _AM_SUBST_NOTMAKE([AM_V]) m4trace:configure.ac:3: -1- AC_SUBST([AM_DEFAULT_V]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([AM_DEFAULT_V]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_DEFAULT_V$]) m4trace:configure.ac:3: -1- _AM_SUBST_NOTMAKE([AM_DEFAULT_V]) m4trace:configure.ac:3: -1- AC_SUBST([AM_DEFAULT_VERBOSITY]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([AM_DEFAULT_VERBOSITY]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_DEFAULT_VERBOSITY$]) m4trace:configure.ac:3: -1- AC_SUBST([AM_BACKSLASH]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([AM_BACKSLASH]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_BACKSLASH$]) m4trace:configure.ac:3: -1- _AM_SUBST_NOTMAKE([AM_BACKSLASH]) m4trace:configure.ac:5: -1- AC_CANONICAL_HOST m4trace:configure.ac:5: -1- AC_CANONICAL_BUILD m4trace:configure.ac:5: -1- AC_REQUIRE_AUX_FILE([config.sub]) m4trace:configure.ac:5: -1- AC_REQUIRE_AUX_FILE([config.guess]) m4trace:configure.ac:5: -1- AC_SUBST([build], [$ac_cv_build]) m4trace:configure.ac:5: -1- AC_SUBST_TRACE([build]) m4trace:configure.ac:5: -1- m4_pattern_allow([^build$]) m4trace:configure.ac:5: -1- AC_SUBST([build_cpu], [$[1]]) m4trace:configure.ac:5: -1- AC_SUBST_TRACE([build_cpu]) m4trace:configure.ac:5: -1- m4_pattern_allow([^build_cpu$]) m4trace:configure.ac:5: -1- AC_SUBST([build_vendor], [$[2]]) m4trace:configure.ac:5: -1- AC_SUBST_TRACE([build_vendor]) m4trace:configure.ac:5: -1- m4_pattern_allow([^build_vendor$]) m4trace:configure.ac:5: -1- AC_SUBST([build_os]) m4trace:configure.ac:5: -1- AC_SUBST_TRACE([build_os]) m4trace:configure.ac:5: -1- m4_pattern_allow([^build_os$]) m4trace:configure.ac:5: -1- AC_SUBST([host], [$ac_cv_host]) m4trace:configure.ac:5: -1- AC_SUBST_TRACE([host]) m4trace:configure.ac:5: -1- m4_pattern_allow([^host$]) m4trace:configure.ac:5: -1- AC_SUBST([host_cpu], [$[1]]) m4trace:configure.ac:5: -1- AC_SUBST_TRACE([host_cpu]) m4trace:configure.ac:5: -1- m4_pattern_allow([^host_cpu$]) m4trace:configure.ac:5: -1- AC_SUBST([host_vendor], [$[2]]) m4trace:configure.ac:5: -1- AC_SUBST_TRACE([host_vendor]) m4trace:configure.ac:5: -1- m4_pattern_allow([^host_vendor$]) m4trace:configure.ac:5: -1- AC_SUBST([host_os]) m4trace:configure.ac:5: -1- AC_SUBST_TRACE([host_os]) m4trace:configure.ac:5: -1- m4_pattern_allow([^host_os$]) m4trace:configure.ac:8: -1- _m4_warn([obsolete], ['AM_CONFIG_HEADER': this macro is obsolete. You should use the 'AC_CONFIG_HEADERS' macro instead.], [aclocal.m4:752: AM_CONFIG_HEADER is expanded from... configure.ac:8: the top level]) m4trace:configure.ac:8: -1- AC_CONFIG_HEADERS([config.h]) m4trace:configure.ac:11: -1- AC_SUBST([SET_MAKE]) m4trace:configure.ac:11: -1- AC_SUBST_TRACE([SET_MAKE]) m4trace:configure.ac:11: -1- m4_pattern_allow([^SET_MAKE$]) m4trace:configure.ac:13: -1- AC_SUBST([CXX]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([CXX]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CXX$]) m4trace:configure.ac:13: -1- AC_SUBST([CXXFLAGS]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([CXXFLAGS]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CXXFLAGS$]) m4trace:configure.ac:13: -1- AC_SUBST([LDFLAGS]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([LDFLAGS]) m4trace:configure.ac:13: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.ac:13: -1- AC_SUBST([LIBS]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.ac:13: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:13: -1- AC_SUBST([CPPFLAGS]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([CPPFLAGS]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:13: -1- AC_SUBST([CXX]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([CXX]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CXX$]) m4trace:configure.ac:13: -1- AC_SUBST([ac_ct_CXX]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([ac_ct_CXX]) m4trace:configure.ac:13: -1- m4_pattern_allow([^ac_ct_CXX$]) m4trace:configure.ac:13: -1- AC_SUBST([EXEEXT], [$ac_cv_exeext]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([EXEEXT]) m4trace:configure.ac:13: -1- m4_pattern_allow([^EXEEXT$]) m4trace:configure.ac:13: -1- AC_SUBST([OBJEXT], [$ac_cv_objext]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([OBJEXT]) m4trace:configure.ac:13: -1- m4_pattern_allow([^OBJEXT$]) m4trace:configure.ac:13: -1- AC_SUBST([DEPDIR], ["${am__leading_dot}deps"]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([DEPDIR]) m4trace:configure.ac:13: -1- m4_pattern_allow([^DEPDIR$]) m4trace:configure.ac:13: -1- AC_SUBST([am__include]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([am__include]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__include$]) m4trace:configure.ac:13: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) m4trace:configure.ac:13: -1- AC_SUBST([AMDEP_TRUE]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([AMDEP_TRUE]) m4trace:configure.ac:13: -1- m4_pattern_allow([^AMDEP_TRUE$]) m4trace:configure.ac:13: -1- AC_SUBST([AMDEP_FALSE]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([AMDEP_FALSE]) m4trace:configure.ac:13: -1- m4_pattern_allow([^AMDEP_FALSE$]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE]) m4trace:configure.ac:13: -1- AC_SUBST([AMDEPBACKSLASH]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([AMDEPBACKSLASH]) m4trace:configure.ac:13: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH]) m4trace:configure.ac:13: -1- AC_SUBST([am__nodep]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([am__nodep]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__nodep$]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([am__nodep]) m4trace:configure.ac:13: -1- AC_SUBST([CXXDEPMODE], [depmode=$am_cv_CXX_dependencies_compiler_type]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([CXXDEPMODE]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CXXDEPMODE$]) m4trace:configure.ac:13: -1- AM_CONDITIONAL([am__fastdepCXX], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3]) m4trace:configure.ac:13: -1- AC_SUBST([am__fastdepCXX_TRUE]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([am__fastdepCXX_TRUE]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$]) m4trace:configure.ac:13: -1- AC_SUBST([am__fastdepCXX_FALSE]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([am__fastdepCXX_FALSE]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE]) m4trace:configure.ac:14: -1- AC_SUBST([CC]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- AC_SUBST([CFLAGS]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([CFLAGS]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CFLAGS$]) m4trace:configure.ac:14: -1- AC_SUBST([LDFLAGS]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([LDFLAGS]) m4trace:configure.ac:14: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.ac:14: -1- AC_SUBST([LIBS]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.ac:14: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:14: -1- AC_SUBST([CPPFLAGS]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([CPPFLAGS]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:14: -1- AC_SUBST([CC]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- AC_SUBST([CC]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- AC_SUBST([CC]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- AC_SUBST([CC]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- AC_SUBST([ac_ct_CC]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([ac_ct_CC]) m4trace:configure.ac:14: -1- m4_pattern_allow([^ac_ct_CC$]) m4trace:configure.ac:14: -1- AC_REQUIRE_AUX_FILE([compile]) m4trace:configure.ac:14: -1- AC_SUBST([CCDEPMODE], [depmode=$am_cv_CC_dependencies_compiler_type]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([CCDEPMODE]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CCDEPMODE$]) m4trace:configure.ac:14: -1- AM_CONDITIONAL([am__fastdepCC], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) m4trace:configure.ac:14: -1- AC_SUBST([am__fastdepCC_TRUE]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([am__fastdepCC_TRUE]) m4trace:configure.ac:14: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) m4trace:configure.ac:14: -1- AC_SUBST([am__fastdepCC_FALSE]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([am__fastdepCC_FALSE]) m4trace:configure.ac:14: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) m4trace:configure.ac:14: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE]) m4trace:configure.ac:14: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE]) m4trace:configure.ac:15: -1- AM_PROG_CC_C_O m4trace:configure.ac:16: -1- AC_SUBST([LEX]) m4trace:configure.ac:16: -1- AC_SUBST_TRACE([LEX]) m4trace:configure.ac:16: -1- m4_pattern_allow([^LEX$]) m4trace:configure.ac:16: -1- AC_SUBST([LEX_OUTPUT_ROOT], [$ac_cv_prog_lex_root]) m4trace:configure.ac:16: -1- AC_SUBST_TRACE([LEX_OUTPUT_ROOT]) m4trace:configure.ac:16: -1- m4_pattern_allow([^LEX_OUTPUT_ROOT$]) m4trace:configure.ac:16: -1- AC_SUBST([LEXLIB]) m4trace:configure.ac:16: -1- AC_SUBST_TRACE([LEXLIB]) m4trace:configure.ac:16: -1- m4_pattern_allow([^LEXLIB$]) m4trace:configure.ac:16: -1- AC_DEFINE_TRACE_LITERAL([YYTEXT_POINTER]) m4trace:configure.ac:16: -1- m4_pattern_allow([^YYTEXT_POINTER$]) m4trace:configure.ac:16: -1- AH_OUTPUT([YYTEXT_POINTER], [/* Define to 1 if `lex\' declares `yytext\' as a `char *\' by default, not a `char@<:@@:>@\'. */ @%:@undef YYTEXT_POINTER]) m4trace:configure.ac:17: -1- AC_SUBST([YACC]) m4trace:configure.ac:17: -1- AC_SUBST_TRACE([YACC]) m4trace:configure.ac:17: -1- m4_pattern_allow([^YACC$]) m4trace:configure.ac:17: -1- AC_SUBST([YACC]) m4trace:configure.ac:17: -1- AC_SUBST_TRACE([YACC]) m4trace:configure.ac:17: -1- m4_pattern_allow([^YACC$]) m4trace:configure.ac:17: -1- AC_SUBST([YFLAGS]) m4trace:configure.ac:17: -1- AC_SUBST_TRACE([YFLAGS]) m4trace:configure.ac:17: -1- m4_pattern_allow([^YFLAGS$]) m4trace:configure.ac:18: -1- AC_SUBST([CPP]) m4trace:configure.ac:18: -1- AC_SUBST_TRACE([CPP]) m4trace:configure.ac:18: -1- m4_pattern_allow([^CPP$]) m4trace:configure.ac:18: -1- AC_SUBST([CPPFLAGS]) m4trace:configure.ac:18: -1- AC_SUBST_TRACE([CPPFLAGS]) m4trace:configure.ac:18: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:18: -1- AC_SUBST([CPP]) m4trace:configure.ac:18: -1- AC_SUBST_TRACE([CPP]) m4trace:configure.ac:18: -1- m4_pattern_allow([^CPP$]) m4trace:configure.ac:19: -1- AC_SUBST([RANLIB]) m4trace:configure.ac:19: -1- AC_SUBST_TRACE([RANLIB]) m4trace:configure.ac:19: -1- m4_pattern_allow([^RANLIB$]) m4trace:configure.ac:21: -1- AC_SUBST([LN_S], [$as_ln_s]) m4trace:configure.ac:21: -1- AC_SUBST_TRACE([LN_S]) m4trace:configure.ac:21: -1- m4_pattern_allow([^LN_S$]) m4trace:configure.ac:22: -1- AC_SUBST([AWK]) m4trace:configure.ac:22: -1- AC_SUBST_TRACE([AWK]) m4trace:configure.ac:22: -1- m4_pattern_allow([^AWK$]) m4trace:configure.ac:25: -1- AC_SUBST([AR]) m4trace:configure.ac:25: -1- AC_SUBST_TRACE([AR]) m4trace:configure.ac:25: -1- m4_pattern_allow([^AR$]) m4trace:configure.ac:96: -1- AC_SUBST([SAMPLE_EXTRA_LIBS]) m4trace:configure.ac:96: -1- AC_SUBST_TRACE([SAMPLE_EXTRA_LIBS]) m4trace:configure.ac:96: -1- m4_pattern_allow([^SAMPLE_EXTRA_LIBS$]) m4trace:configure.ac:97: -1- AC_SUBST([platform]) m4trace:configure.ac:97: -1- AC_SUBST_TRACE([platform]) m4trace:configure.ac:97: -1- m4_pattern_allow([^platform$]) m4trace:configure.ac:100: -1- AC_SUBST([GREP]) m4trace:configure.ac:100: -1- AC_SUBST_TRACE([GREP]) m4trace:configure.ac:100: -1- m4_pattern_allow([^GREP$]) m4trace:configure.ac:100: -1- AC_SUBST([EGREP]) m4trace:configure.ac:100: -1- AC_SUBST_TRACE([EGREP]) m4trace:configure.ac:100: -1- m4_pattern_allow([^EGREP$]) m4trace:configure.ac:100: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS]) m4trace:configure.ac:100: -1- m4_pattern_allow([^STDC_HEADERS$]) m4trace:configure.ac:100: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if you have the ANSI C header files. */ @%:@undef STDC_HEADERS]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_ARPA_INET_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_ARPA_INET_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_LOCALE_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_LOCALE_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_XLOCALE_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_XLOCALE_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_ERRNO_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_ERRNO_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_FCNTL_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_FCNTL_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_CTYPE_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_CTYPE_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_LIMITS_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_LIMITS_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_FLOAT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_FLOAT_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_MATH_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_MATH_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_NETDB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_NETDB_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_NETINET_IN_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_NETINET_IN_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDLIB_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRING_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRINGS_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDINT_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_INTTYPES_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_TIME_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_TIME_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_SYS_INTTYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_INTTYPES_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_SYS_SOCKET_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_SOCKET_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TYPES_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_SYS_TIME_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TIME_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_SYS_TIMEB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TIMEB_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_UNISTD_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_POLL_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_POLL_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_OPENSSL_SSL_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_OPENSSL_SSL_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_GNUTLS_GNUTLS_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_GNUTLS_GNUTLS_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_ZLIB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_ZLIB_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TYPES_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_STAT_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDLIB_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRING_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_MEMORY_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRINGS_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_INTTYPES_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDINT_H]) m4trace:configure.ac:101: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_UNISTD_H]) m4trace:configure.ac:109: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SOCKLEN_T]) m4trace:configure.ac:109: -1- m4_pattern_allow([^HAVE_SOCKLEN_T$]) m4trace:configure.ac:109: -1- AH_OUTPUT([HAVE_SOCKLEN_T], [/* Define to 1 if the system has the type `socklen_t\'. */ @%:@undef HAVE_SOCKLEN_T]) m4trace:configure.ac:112: -1- AC_DEFINE_TRACE_LITERAL([const]) m4trace:configure.ac:112: -1- m4_pattern_allow([^const$]) m4trace:configure.ac:112: -1- AH_OUTPUT([const], [/* Define to empty if `const\' does not conform to ANSI C. */ @%:@undef const]) m4trace:configure.ac:113: -1- AC_DEFINE_TRACE_LITERAL([size_t]) m4trace:configure.ac:113: -1- m4_pattern_allow([^size_t$]) m4trace:configure.ac:113: -1- AH_OUTPUT([size_t], [/* Define to `unsigned int\' if does not define. */ @%:@undef size_t]) m4trace:configure.ac:114: -1- AC_DEFINE_TRACE_LITERAL([TIME_WITH_SYS_TIME]) m4trace:configure.ac:114: -1- m4_pattern_allow([^TIME_WITH_SYS_TIME$]) m4trace:configure.ac:114: -1- AH_OUTPUT([TIME_WITH_SYS_TIME], [/* Define to 1 if you can safely include both and . */ @%:@undef TIME_WITH_SYS_TIME]) m4trace:configure.ac:115: -1- AC_DEFINE_TRACE_LITERAL([TM_IN_SYS_TIME]) m4trace:configure.ac:115: -1- m4_pattern_allow([^TM_IN_SYS_TIME$]) m4trace:configure.ac:115: -1- AH_OUTPUT([TM_IN_SYS_TIME], [/* Define to 1 if your declares `struct tm\'. */ @%:@undef TM_IN_SYS_TIME]) m4trace:configure.ac:120: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_TM_TM_GMTOFF]) m4trace:configure.ac:120: -1- m4_pattern_allow([^HAVE_STRUCT_TM_TM_GMTOFF$]) m4trace:configure.ac:120: -1- AH_OUTPUT([HAVE_STRUCT_TM_TM_GMTOFF], [/* Define to 1 if `tm_gmtoff\' is a member of `struct tm\'. */ @%:@undef HAVE_STRUCT_TM_TM_GMTOFF]) m4trace:configure.ac:120: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_TM___TM_GMTOFF]) m4trace:configure.ac:120: -1- m4_pattern_allow([^HAVE_STRUCT_TM___TM_GMTOFF$]) m4trace:configure.ac:120: -1- AH_OUTPUT([HAVE_STRUCT_TM___TM_GMTOFF], [/* Define to 1 if `__tm_gmtoff\' is a member of `struct tm\'. */ @%:@undef HAVE_STRUCT_TM___TM_GMTOFF]) m4trace:configure.ac:123: -1- AH_OUTPUT([HAVE_SYS_TIME_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TIME_H]) m4trace:configure.ac:123: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_UNISTD_H]) m4trace:configure.ac:123: -1- AH_OUTPUT([HAVE_ALARM], [/* Define to 1 if you have the `alarm\' function. */ @%:@undef HAVE_ALARM]) m4trace:configure.ac:123: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS mktime.$ac_objext"]) m4trace:configure.ac:123: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.ac:123: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:123: -1- AC_LIBSOURCE([mktime.c]) m4trace:configure.ac:124: -1- _m4_warn([obsolete], [The macro `AC_TYPE_SIGNAL' is obsolete. You should run autoupdate.], [../../lib/autoconf/types.m4:759: AC_TYPE_SIGNAL is expanded from... configure.ac:124: the top level]) m4trace:configure.ac:124: -1- AC_DEFINE_TRACE_LITERAL([RETSIGTYPE]) m4trace:configure.ac:124: -1- m4_pattern_allow([^RETSIGTYPE$]) m4trace:configure.ac:124: -1- AH_OUTPUT([RETSIGTYPE], [/* Define as the return type of signal handlers (`int\' or `void\'). */ @%:@undef RETSIGTYPE]) m4trace:configure.ac:125: -1- AH_OUTPUT([HAVE_STRFTIME], [/* Define to 1 if you have the `strftime\' function. */ @%:@undef HAVE_STRFTIME]) m4trace:configure.ac:125: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRFTIME]) m4trace:configure.ac:125: -1- m4_pattern_allow([^HAVE_STRFTIME$]) m4trace:configure.ac:125: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRFTIME]) m4trace:configure.ac:125: -1- m4_pattern_allow([^HAVE_STRFTIME$]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_RANDOM], [/* Define to 1 if you have the `random\' function. */ @%:@undef HAVE_RANDOM]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_GETTIMEOFDAY], [/* Define to 1 if you have the `gettimeofday\' function. */ @%:@undef HAVE_GETTIMEOFDAY]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_FTIME], [/* Define to 1 if you have the `ftime\' function. */ @%:@undef HAVE_FTIME]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_LOCALTIME_R], [/* Define to 1 if you have the `localtime_r\' function. */ @%:@undef HAVE_LOCALTIME_R]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_TIMEGM], [/* Define to 1 if you have the `timegm\' function. */ @%:@undef HAVE_TIMEGM]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_GMTIME], [/* Define to 1 if you have the `gmtime\' function. */ @%:@undef HAVE_GMTIME]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_GMTIME_R], [/* Define to 1 if you have the `gmtime_r\' function. */ @%:@undef HAVE_GMTIME_R]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_ASCTIME], [/* Define to 1 if you have the `asctime\' function. */ @%:@undef HAVE_ASCTIME]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_ASCTIME_R], [/* Define to 1 if you have the `asctime_r\' function. */ @%:@undef HAVE_ASCTIME_R]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_MEMSET], [/* Define to 1 if you have the `memset\' function. */ @%:@undef HAVE_MEMSET]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_SELECT], [/* Define to 1 if you have the `select\' function. */ @%:@undef HAVE_SELECT]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_SOCKET], [/* Define to 1 if you have the `socket\' function. */ @%:@undef HAVE_SOCKET]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_SNPRINTF], [/* Define to 1 if you have the `snprintf\' function. */ @%:@undef HAVE_SNPRINTF]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_STRCHR], [/* Define to 1 if you have the `strchr\' function. */ @%:@undef HAVE_STRCHR]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_STRERROR], [/* Define to 1 if you have the `strerror\' function. */ @%:@undef HAVE_STRERROR]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_STRERROR_R], [/* Define to 1 if you have the `strerror_r\' function. */ @%:@undef HAVE_STRERROR_R]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_STRLCPY], [/* Define to 1 if you have the `strlcpy\' function. */ @%:@undef HAVE_STRLCPY]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_STRLCAT], [/* Define to 1 if you have the `strlcat\' function. */ @%:@undef HAVE_STRLCAT]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_STRRCHR], [/* Define to 1 if you have the `strrchr\' function. */ @%:@undef HAVE_STRRCHR]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_STRSTR], [/* Define to 1 if you have the `strstr\' function. */ @%:@undef HAVE_STRSTR]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_STRTOL], [/* Define to 1 if you have the `strtol\' function. */ @%:@undef HAVE_STRTOL]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_STRTOUL], [/* Define to 1 if you have the `strtoul\' function. */ @%:@undef HAVE_STRTOUL]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_STRTOLL], [/* Define to 1 if you have the `strtoll\' function. */ @%:@undef HAVE_STRTOLL]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_STRTOULL], [/* Define to 1 if you have the `strtoull\' function. */ @%:@undef HAVE_STRTOULL]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_STRTOLD], [/* Define to 1 if you have the `strtold\' function. */ @%:@undef HAVE_STRTOLD]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_STRTOD], [/* Define to 1 if you have the `strtod\' function. */ @%:@undef HAVE_STRTOD]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_STRTOF], [/* Define to 1 if you have the `strtof\' function. */ @%:@undef HAVE_STRTOF]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_STRTOLD_L], [/* Define to 1 if you have the `strtold_l\' function. */ @%:@undef HAVE_STRTOLD_L]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_STRTOD_L], [/* Define to 1 if you have the `strtod_l\' function. */ @%:@undef HAVE_STRTOD_L]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_STRTOF_L], [/* Define to 1 if you have the `strtof_l\' function. */ @%:@undef HAVE_STRTOF_L]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_SSCANF], [/* Define to 1 if you have the `sscanf\' function. */ @%:@undef HAVE_SSCANF]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_SSCANF_L], [/* Define to 1 if you have the `sscanf_l\' function. */ @%:@undef HAVE_SSCANF_L]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_SNPRINTF], [/* Define to 1 if you have the `snprintf\' function. */ @%:@undef HAVE_SNPRINTF]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_SPRINTF_L], [/* Define to 1 if you have the `sprintf_l\' function. */ @%:@undef HAVE_SPRINTF_L]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_WCTOMB], [/* Define to 1 if you have the `wctomb\' function. */ @%:@undef HAVE_WCTOMB]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_MBTOWC], [/* Define to 1 if you have the `mbtowc\' function. */ @%:@undef HAVE_MBTOWC]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_POLL], [/* Define to 1 if you have the `poll\' function. */ @%:@undef HAVE_POLL]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_NEWLOCALE], [/* Define to 1 if you have the `newlocale\' function. */ @%:@undef HAVE_NEWLOCALE]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_USELOCALE], [/* Define to 1 if you have the `uselocale\' function. */ @%:@undef HAVE_USELOCALE]) m4trace:configure.ac:126: -1- AH_OUTPUT([HAVE_FREELOCALE], [/* Define to 1 if you have the `freelocale\' function. */ @%:@undef HAVE_FREELOCALE]) m4trace:configure.ac:129: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ISNAN]) m4trace:configure.ac:129: -1- m4_pattern_allow([^HAVE_ISNAN$]) m4trace:configure.ac:129: -1- AH_OUTPUT([HAVE_ISNAN], [/* isnan */ @%:@undef HAVE_ISNAN]) m4trace:configure.ac:130: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ISINF]) m4trace:configure.ac:130: -1- m4_pattern_allow([^HAVE_ISINF$]) m4trace:configure.ac:130: -1- AH_OUTPUT([HAVE_ISINF], [/* isinf */ @%:@undef HAVE_ISINF]) m4trace:configure.ac:138: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ISNAN]) m4trace:configure.ac:138: -1- m4_pattern_allow([^HAVE_ISNAN$]) m4trace:configure.ac:138: -1- AH_OUTPUT([HAVE_ISNAN], [/* isnan */ @%:@undef HAVE_ISNAN]) m4trace:configure.ac:150: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ISINF]) m4trace:configure.ac:150: -1- m4_pattern_allow([^HAVE_ISINF$]) m4trace:configure.ac:150: -1- AH_OUTPUT([HAVE_ISINF], [/* isinf */ @%:@undef HAVE_ISINF]) m4trace:configure.ac:159: -1- AH_OUTPUT([HAVE_GETHOSTBYNAME_R], [/* Define to 1 if you have the `gethostbyname_r\' function. */ @%:@undef HAVE_GETHOSTBYNAME_R]) m4trace:configure.ac:159: -1- AC_DEFINE_TRACE_LITERAL([HAVE_GETHOSTBYNAME_R]) m4trace:configure.ac:159: -1- m4_pattern_allow([^HAVE_GETHOSTBYNAME_R$]) m4trace:configure.ac:160: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDLIB_H]) m4trace:configure.ac:160: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STDLIB_H]) m4trace:configure.ac:160: -1- m4_pattern_allow([^HAVE_STDLIB_H$]) m4trace:configure.ac:160: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MALLOC]) m4trace:configure.ac:160: -1- m4_pattern_allow([^HAVE_MALLOC$]) m4trace:configure.ac:160: -1- AH_OUTPUT([HAVE_MALLOC], [/* Define to 1 if your system has a GNU libc compatible `malloc\' function, and to 0 otherwise. */ @%:@undef HAVE_MALLOC]) m4trace:configure.ac:160: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MALLOC]) m4trace:configure.ac:160: -1- m4_pattern_allow([^HAVE_MALLOC$]) m4trace:configure.ac:160: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS malloc.$ac_objext"]) m4trace:configure.ac:160: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.ac:160: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:160: -1- AC_LIBSOURCE([malloc.c]) m4trace:configure.ac:160: -1- AC_DEFINE_TRACE_LITERAL([malloc]) m4trace:configure.ac:160: -1- m4_pattern_allow([^malloc$]) m4trace:configure.ac:160: -1- AH_OUTPUT([malloc], [/* Define to rpl_malloc if the replacement function should be used. */ @%:@undef malloc]) m4trace:configure.ac:171: -1- AM_CONDITIONAL([DEBUG_COMPILE], [test x$debug = xtrue]) m4trace:configure.ac:171: -1- AC_SUBST([DEBUG_COMPILE_TRUE]) m4trace:configure.ac:171: -1- AC_SUBST_TRACE([DEBUG_COMPILE_TRUE]) m4trace:configure.ac:171: -1- m4_pattern_allow([^DEBUG_COMPILE_TRUE$]) m4trace:configure.ac:171: -1- AC_SUBST([DEBUG_COMPILE_FALSE]) m4trace:configure.ac:171: -1- AC_SUBST_TRACE([DEBUG_COMPILE_FALSE]) m4trace:configure.ac:171: -1- m4_pattern_allow([^DEBUG_COMPILE_FALSE$]) m4trace:configure.ac:171: -1- _AM_SUBST_NOTMAKE([DEBUG_COMPILE_TRUE]) m4trace:configure.ac:171: -1- _AM_SUBST_NOTMAKE([DEBUG_COMPILE_FALSE]) m4trace:configure.ac:177: -1- AC_SUBST([SOAPCPP2_DEBUG]) m4trace:configure.ac:177: -1- AC_SUBST_TRACE([SOAPCPP2_DEBUG]) m4trace:configure.ac:177: -1- m4_pattern_allow([^SOAPCPP2_DEBUG$]) m4trace:configure.ac:182: -1- AC_SUBST([SOAPCPP2_IMPORTPATH]) m4trace:configure.ac:182: -1- AC_SUBST_TRACE([SOAPCPP2_IMPORTPATH]) m4trace:configure.ac:182: -1- m4_pattern_allow([^SOAPCPP2_IMPORTPATH$]) m4trace:configure.ac:187: -1- AC_SUBST([WSDL2H_IMPORTPATH]) m4trace:configure.ac:187: -1- AC_SUBST_TRACE([WSDL2H_IMPORTPATH]) m4trace:configure.ac:187: -1- m4_pattern_allow([^WSDL2H_IMPORTPATH$]) m4trace:configure.ac:195: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:195: the top level]) m4trace:configure.ac:204: -1- AC_SUBST([SOAPCPP2_NONAMESPACES]) m4trace:configure.ac:204: -1- AC_SUBST_TRACE([SOAPCPP2_NONAMESPACES]) m4trace:configure.ac:204: -1- m4_pattern_allow([^SOAPCPP2_NONAMESPACES$]) m4trace:configure.ac:212: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:212: the top level]) m4trace:configure.ac:221: -1- AC_SUBST([SOAPCPP2_INCLUDE_XLOCALE]) m4trace:configure.ac:221: -1- AC_SUBST_TRACE([SOAPCPP2_INCLUDE_XLOCALE]) m4trace:configure.ac:221: -1- m4_pattern_allow([^SOAPCPP2_INCLUDE_XLOCALE$]) m4trace:configure.ac:229: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:229: the top level]) m4trace:configure.ac:238: -1- AC_SUBST([SOAPCPP2_NO_C_LOCALE]) m4trace:configure.ac:238: -1- AC_SUBST_TRACE([SOAPCPP2_NO_C_LOCALE]) m4trace:configure.ac:238: -1- m4_pattern_allow([^SOAPCPP2_NO_C_LOCALE$]) m4trace:configure.ac:246: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:246: the top level]) m4trace:configure.ac:255: -1- AC_SUBST([SOAPCPP2_IPV6]) m4trace:configure.ac:255: -1- AC_SUBST_TRACE([SOAPCPP2_IPV6]) m4trace:configure.ac:255: -1- m4_pattern_allow([^SOAPCPP2_IPV6$]) m4trace:configure.ac:263: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:263: the top level]) m4trace:configure.ac:272: -1- AC_SUBST([SOAPCPP2_IPV6_V6ONLY]) m4trace:configure.ac:272: -1- AC_SUBST_TRACE([SOAPCPP2_IPV6_V6ONLY]) m4trace:configure.ac:272: -1- m4_pattern_allow([^SOAPCPP2_IPV6_V6ONLY$]) m4trace:configure.ac:291: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:291: the top level]) m4trace:configure.ac:298: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:298: the top level]) m4trace:configure.ac:339: -1- AM_CONDITIONAL([WITH_OPENSSL], [test "x$with_openssl" = "xyes" -a "x$with_gnutls" != "xyes"]) m4trace:configure.ac:339: -1- AC_SUBST([WITH_OPENSSL_TRUE]) m4trace:configure.ac:339: -1- AC_SUBST_TRACE([WITH_OPENSSL_TRUE]) m4trace:configure.ac:339: -1- m4_pattern_allow([^WITH_OPENSSL_TRUE$]) m4trace:configure.ac:339: -1- AC_SUBST([WITH_OPENSSL_FALSE]) m4trace:configure.ac:339: -1- AC_SUBST_TRACE([WITH_OPENSSL_FALSE]) m4trace:configure.ac:339: -1- m4_pattern_allow([^WITH_OPENSSL_FALSE$]) m4trace:configure.ac:339: -1- _AM_SUBST_NOTMAKE([WITH_OPENSSL_TRUE]) m4trace:configure.ac:339: -1- _AM_SUBST_NOTMAKE([WITH_OPENSSL_FALSE]) m4trace:configure.ac:340: -1- AC_SUBST([WITH_OPENSSL]) m4trace:configure.ac:340: -1- AC_SUBST_TRACE([WITH_OPENSSL]) m4trace:configure.ac:340: -1- m4_pattern_allow([^WITH_OPENSSL$]) m4trace:configure.ac:341: -1- AC_SUBST([WSDL2H_EXTRA_FLAGS]) m4trace:configure.ac:341: -1- AC_SUBST_TRACE([WSDL2H_EXTRA_FLAGS]) m4trace:configure.ac:341: -1- m4_pattern_allow([^WSDL2H_EXTRA_FLAGS$]) m4trace:configure.ac:342: -1- AC_SUBST([WSDL2H_EXTRA_LIBS]) m4trace:configure.ac:342: -1- AC_SUBST_TRACE([WSDL2H_EXTRA_LIBS]) m4trace:configure.ac:342: -1- m4_pattern_allow([^WSDL2H_EXTRA_LIBS$]) m4trace:configure.ac:343: -1- AC_SUBST([SAMPLE_INCLUDES]) m4trace:configure.ac:343: -1- AC_SUBST_TRACE([SAMPLE_INCLUDES]) m4trace:configure.ac:343: -1- m4_pattern_allow([^SAMPLE_INCLUDES$]) m4trace:configure.ac:344: -1- AC_SUBST([SAMPLE_SSL_LIBS]) m4trace:configure.ac:344: -1- AC_SUBST_TRACE([SAMPLE_SSL_LIBS]) m4trace:configure.ac:344: -1- m4_pattern_allow([^SAMPLE_SSL_LIBS$]) m4trace:configure.ac:345: -1- AC_SUBST([WSDL2H_SOAP_CPP_LIB]) m4trace:configure.ac:345: -1- AC_SUBST_TRACE([WSDL2H_SOAP_CPP_LIB]) m4trace:configure.ac:345: -1- m4_pattern_allow([^WSDL2H_SOAP_CPP_LIB$]) m4trace:configure.ac:355: -1- AM_CONDITIONAL([ENABLE_SAMPLES], [test x$samples = xtrue]) m4trace:configure.ac:355: -1- AC_SUBST([ENABLE_SAMPLES_TRUE]) m4trace:configure.ac:355: -1- AC_SUBST_TRACE([ENABLE_SAMPLES_TRUE]) m4trace:configure.ac:355: -1- m4_pattern_allow([^ENABLE_SAMPLES_TRUE$]) m4trace:configure.ac:355: -1- AC_SUBST([ENABLE_SAMPLES_FALSE]) m4trace:configure.ac:355: -1- AC_SUBST_TRACE([ENABLE_SAMPLES_FALSE]) m4trace:configure.ac:355: -1- m4_pattern_allow([^ENABLE_SAMPLES_FALSE$]) m4trace:configure.ac:355: -1- _AM_SUBST_NOTMAKE([ENABLE_SAMPLES_TRUE]) m4trace:configure.ac:355: -1- _AM_SUBST_NOTMAKE([ENABLE_SAMPLES_FALSE]) m4trace:configure.ac:356: -1- AC_SUBST([ENABLE_SAMPLES]) m4trace:configure.ac:356: -1- AC_SUBST_TRACE([ENABLE_SAMPLES]) m4trace:configure.ac:356: -1- m4_pattern_allow([^ENABLE_SAMPLES$]) m4trace:configure.ac:363: -1- AC_SUBST([SAMPLE_DIRS]) m4trace:configure.ac:363: -1- AC_SUBST_TRACE([SAMPLE_DIRS]) m4trace:configure.ac:363: -1- m4_pattern_allow([^SAMPLE_DIRS$]) m4trace:configure.ac:373: -1- AC_SUBST([LEX_DEFINE]) m4trace:configure.ac:373: -1- AC_SUBST_TRACE([LEX_DEFINE]) m4trace:configure.ac:373: -1- m4_pattern_allow([^LEX_DEFINE$]) m4trace:configure.ac:374: -1- AC_SUBST([LEX_FLAGS]) m4trace:configure.ac:374: -1- AC_SUBST_TRACE([LEX_FLAGS]) m4trace:configure.ac:374: -1- m4_pattern_allow([^LEX_FLAGS$]) m4trace:configure.ac:375: -1- AC_SUBST([LEXLIB]) m4trace:configure.ac:375: -1- AC_SUBST_TRACE([LEXLIB]) m4trace:configure.ac:375: -1- m4_pattern_allow([^LEXLIB$]) m4trace:configure.ac:385: -1- AC_SUBST([BISON_DEFINE]) m4trace:configure.ac:385: -1- AC_SUBST_TRACE([BISON_DEFINE]) m4trace:configure.ac:385: -1- m4_pattern_allow([^BISON_DEFINE$]) m4trace:configure.ac:386: -1- AC_SUBST([YACC_LIB]) m4trace:configure.ac:386: -1- AC_SUBST_TRACE([YACC_LIB]) m4trace:configure.ac:386: -1- m4_pattern_allow([^YACC_LIB$]) m4trace:configure.ac:435: -1- AC_CONFIG_FILES([ Makefile \ gsoap.pc gsoap++.pc gsoapck.pc gsoapck++.pc gsoapssl.pc gsoapssl++.pc \ gsoap/Makefile \ gsoap/src/Makefile \ gsoap/wsdl/Makefile \ gsoap/samples/Makefile \ gsoap/samples/autotest/Makefile \ gsoap/samples/aws/Makefile \ gsoap/samples/calc/Makefile \ gsoap/samples/calc++/Makefile \ gsoap/samples/chaining/Makefile \ gsoap/samples/chaining++/Makefile \ gsoap/samples/databinding/Makefile \ gsoap/samples/dime/Makefile \ gsoap/samples/dom/Makefile \ gsoap/samples/oneway/Makefile \ gsoap/samples/oneway++/Makefile \ gsoap/samples/factory/Makefile \ gsoap/samples/factorytest/Makefile \ gsoap/samples/gmt/Makefile \ gsoap/samples/googleapi/Makefile \ gsoap/samples/hello/Makefile \ gsoap/samples/httpcookies/Makefile \ gsoap/samples/lu/Makefile \ gsoap/samples/magic/Makefile \ gsoap/samples/mashup/Makefile \ gsoap/samples/mashup++/Makefile \ gsoap/samples/mtom/Makefile \ gsoap/samples/mtom-stream/Makefile \ gsoap/samples/polytest/Makefile \ gsoap/samples/primes/Makefile \ gsoap/samples/roll/Makefile \ gsoap/samples/router/Makefile \ gsoap/samples/atom/Makefile \ gsoap/samples/rss/Makefile \ gsoap/samples/ssl/Makefile \ gsoap/samples/template/Makefile \ gsoap/samples/udp/Makefile \ gsoap/samples/varparam/Makefile \ gsoap/samples/wsa/Makefile \ gsoap/samples/wsrm/Makefile \ gsoap/samples/wsse/Makefile \ gsoap/samples/wst/Makefile \ gsoap/samples/xml-rpc-json/Makefile \ gsoap/samples/rest/Makefile \ gsoap/samples/testmsgr/Makefile \ gsoap/samples/async/Makefile ]) m4trace:configure.ac:436: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs]) m4trace:configure.ac:436: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.ac:436: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:436: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs]) m4trace:configure.ac:436: -1- AC_SUBST_TRACE([LTLIBOBJS]) m4trace:configure.ac:436: -1- m4_pattern_allow([^LTLIBOBJS$]) m4trace:configure.ac:436: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) m4trace:configure.ac:436: -1- AC_SUBST([am__EXEEXT_TRUE]) m4trace:configure.ac:436: -1- AC_SUBST_TRACE([am__EXEEXT_TRUE]) m4trace:configure.ac:436: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) m4trace:configure.ac:436: -1- AC_SUBST([am__EXEEXT_FALSE]) m4trace:configure.ac:436: -1- AC_SUBST_TRACE([am__EXEEXT_FALSE]) m4trace:configure.ac:436: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) m4trace:configure.ac:436: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) m4trace:configure.ac:436: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) m4trace:configure.ac:436: -1- AC_SUBST_TRACE([top_builddir]) m4trace:configure.ac:436: -1- AC_SUBST_TRACE([top_build_prefix]) m4trace:configure.ac:436: -1- AC_SUBST_TRACE([srcdir]) m4trace:configure.ac:436: -1- AC_SUBST_TRACE([abs_srcdir]) m4trace:configure.ac:436: -1- AC_SUBST_TRACE([top_srcdir]) m4trace:configure.ac:436: -1- AC_SUBST_TRACE([abs_top_srcdir]) m4trace:configure.ac:436: -1- AC_SUBST_TRACE([builddir]) m4trace:configure.ac:436: -1- AC_SUBST_TRACE([abs_builddir]) m4trace:configure.ac:436: -1- AC_SUBST_TRACE([abs_top_builddir]) m4trace:configure.ac:436: -1- AC_SUBST_TRACE([INSTALL]) m4trace:configure.ac:436: -1- AC_SUBST_TRACE([MKDIR_P]) gsoap-2.8.91/autom4te.cache/requests0000644000175000017500000006402713525245204016701 0ustar ellertellert# This file was generated. # It contains the lists of macros which have been traced. # It can be safely removed. @request = ( bless( [ '0', 1, [ '/usr/local/share/autoconf' ], [ '/usr/local/share/autoconf/autoconf/autoconf.m4f', '-', '/usr/local/share/aclocal-1.14/internal/ac-config-macro-dirs.m4', '/usr/local/share/aclocal-1.14/amversion.m4', '/usr/local/share/aclocal-1.14/auxdir.m4', '/usr/local/share/aclocal-1.14/cond.m4', '/usr/local/share/aclocal-1.14/depend.m4', '/usr/local/share/aclocal-1.14/depout.m4', '/usr/local/share/aclocal-1.14/init.m4', '/usr/local/share/aclocal-1.14/install-sh.m4', '/usr/local/share/aclocal-1.14/lead-dot.m4', '/usr/local/share/aclocal-1.14/lex.m4', '/usr/local/share/aclocal-1.14/make.m4', '/usr/local/share/aclocal-1.14/missing.m4', '/usr/local/share/aclocal-1.14/obsolete.m4', '/usr/local/share/aclocal-1.14/options.m4', '/usr/local/share/aclocal-1.14/prog-cc-c-o.m4', '/usr/local/share/aclocal-1.14/runlog.m4', '/usr/local/share/aclocal-1.14/sanity.m4', '/usr/local/share/aclocal-1.14/silent.m4', '/usr/local/share/aclocal-1.14/strip.m4', '/usr/local/share/aclocal-1.14/substnot.m4', '/usr/local/share/aclocal-1.14/tar.m4', 'configure.in' ], { 'AC_DEFUN' => 1, '_AM_CONFIG_MACRO_DIRS' => 1, 'AU_DEFUN' => 1, 'AM_AUX_DIR_EXPAND' => 1, 'AM_PROG_INSTALL_SH' => 1, 'AM_SET_DEPDIR' => 1, 'AM_PROG_INSTALL_STRIP' => 1, 'AM_RUN_LOG' => 1, '_AM_IF_OPTION' => 1, '_AM_DEPENDENCIES' => 1, 'AM_AUTOMAKE_VERSION' => 1, 'AM_PROG_LEX' => 1, 'AM_MISSING_PROG' => 1, 'AM_MAKE_INCLUDE' => 1, '_AM_MANGLE_OPTION' => 1, 'AM_SANITY_CHECK' => 1, 'AM_DEP_TRACK' => 1, 'm4_pattern_allow' => 1, 'AM_SILENT_RULES' => 1, 'm4_pattern_forbid' => 1, '_AM_SUBST_NOTMAKE' => 1, 'AM_INIT_AUTOMAKE' => 1, '_AM_PROG_TAR' => 1, 'include' => 1, '_AM_SET_OPTIONS' => 1, 'AM_SET_LEADING_DOT' => 1, 'AM_MISSING_HAS_RUN' => 1, 'AM_CONFIG_HEADER' => 1, 'AM_CONDITIONAL' => 1, '_AM_AUTOCONF_VERSION' => 1, '_AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, '_AM_PROG_CC_C_O' => 1, '_AM_SET_OPTION' => 1, 'AC_CONFIG_MACRO_DIR_TRACE' => 1, 'm4_include' => 1, '_AC_AM_CONFIG_HEADER_HOOK' => 1, 'AM_PROG_CC_C_O' => 1, 'AC_CONFIG_MACRO_DIR' => 1, 'AC_DEFUN_ONCE' => 1, 'AM_SET_CURRENT_AUTOMAKE_VERSION' => 1, 'AM_C_PROTOTYPES' => 1, 'AM_PROG_CC_STDC' => 1, 'AM_SUBST_NOTMAKE' => 1, 'AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, '_m4_warn' => 1, 'fp_C_PROTOTYPES' => 1 } ], 'Autom4te::Request' ), bless( [ '1', 1, [ '/usr/local/share/autoconf' ], [ '/usr/local/share/autoconf/autoconf/autoconf.m4f', 'aclocal.m4', 'configure.in' ], { 'AM_PROG_CC_C_O' => 1, 'm4_include' => 1, 'AM_MAKEFILE_INCLUDE' => 1, 'sinclude' => 1, 'AM_PROG_F77_C_O' => 1, 'AC_FC_PP_SRCEXT' => 1, 'AM_CONDITIONAL' => 1, 'AM_PROG_MOC' => 1, 'AM_NLS' => 1, '_m4_warn' => 1, 'AC_CANONICAL_HOST' => 1, 'AM_PROG_CXX_C_O' => 1, 'AC_FC_FREEFORM' => 1, 'AM_EXTRA_RECURSIVE_TARGETS' => 1, 'AC_CANONICAL_BUILD' => 1, 'AM_POT_TOOLS' => 1, 'm4_sinclude' => 1, '_AM_SUBST_NOTMAKE' => 1, 'AC_FC_SRCEXT' => 1, 'AC_PROG_LIBTOOL' => 1, 'LT_CONFIG_LTDL_DIR' => 1, 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1, 'm4_pattern_forbid' => 1, 'AM_PATH_GUILE' => 1, 'AM_SILENT_RULES' => 1, '_AM_COND_ENDIF' => 1, 'm4_pattern_allow' => 1, 'AC_CONFIG_AUX_DIR' => 1, 'AC_CONFIG_SUBDIRS' => 1, '_AM_MAKEFILE_INCLUDE' => 1, 'AC_CONFIG_LIBOBJ_DIR' => 1, 'include' => 1, 'AC_SUBST' => 1, 'AM_INIT_AUTOMAKE' => 1, 'AC_CONFIG_LINKS' => 1, '_AM_COND_IF' => 1, 'AC_CANONICAL_SYSTEM' => 1, 'AH_OUTPUT' => 1, 'AM_AUTOMAKE_VERSION' => 1, 'AC_FC_PP_DEFINE' => 1, 'AC_CANONICAL_TARGET' => 1, 'AM_GNU_GETTEXT' => 1, 'AM_PROG_AR' => 1, 'AC_DEFINE_TRACE_LITERAL' => 1, '_AM_COND_ELSE' => 1, 'AC_LIBSOURCE' => 1, 'AM_PROG_MKDIR_P' => 1, 'AC_REQUIRE_AUX_FILE' => 1, 'LT_SUPPORTED_TAG' => 1, 'AM_PROG_FC_C_O' => 1, 'AM_MAINTAINER_MODE' => 1, 'AC_INIT' => 1, 'AC_CONFIG_FILES' => 1, '_LT_AC_TAGCONFIG' => 1, 'AM_ENABLE_MULTILIB' => 1, 'AC_CONFIG_HEADERS' => 1, 'LT_INIT' => 1, 'AC_SUBST_TRACE' => 1, 'AM_XGETTEXT_OPTION' => 1 } ], 'Autom4te::Request' ), bless( [ '2', 1, [ '/usr/local/share/autoconf' ], [ '/usr/local/share/autoconf/autoconf/autoconf.m4f', '-', '/usr/local/share/aclocal-1.14/internal/ac-config-macro-dirs.m4', '/usr/local/share/aclocal-1.14/amversion.m4', '/usr/local/share/aclocal-1.14/auxdir.m4', '/usr/local/share/aclocal-1.14/cond.m4', '/usr/local/share/aclocal-1.14/depend.m4', '/usr/local/share/aclocal-1.14/depout.m4', '/usr/local/share/aclocal-1.14/init.m4', '/usr/local/share/aclocal-1.14/install-sh.m4', '/usr/local/share/aclocal-1.14/lead-dot.m4', '/usr/local/share/aclocal-1.14/lex.m4', '/usr/local/share/aclocal-1.14/make.m4', '/usr/local/share/aclocal-1.14/missing.m4', '/usr/local/share/aclocal-1.14/obsolete.m4', '/usr/local/share/aclocal-1.14/options.m4', '/usr/local/share/aclocal-1.14/prog-cc-c-o.m4', '/usr/local/share/aclocal-1.14/runlog.m4', '/usr/local/share/aclocal-1.14/sanity.m4', '/usr/local/share/aclocal-1.14/silent.m4', '/usr/local/share/aclocal-1.14/strip.m4', '/usr/local/share/aclocal-1.14/substnot.m4', '/usr/local/share/aclocal-1.14/tar.m4', 'configure.ac' ], { 'AM_SET_DEPDIR' => 1, 'AM_PROG_INSTALL_SH' => 1, 'AM_AUX_DIR_EXPAND' => 1, '_AM_CONFIG_MACRO_DIRS' => 1, 'AU_DEFUN' => 1, 'AC_DEFUN' => 1, '_AM_MANGLE_OPTION' => 1, 'AM_SANITY_CHECK' => 1, 'AM_MISSING_PROG' => 1, 'AM_MAKE_INCLUDE' => 1, 'AM_AUTOMAKE_VERSION' => 1, 'AM_PROG_LEX' => 1, '_AM_IF_OPTION' => 1, '_AM_DEPENDENCIES' => 1, 'AM_RUN_LOG' => 1, 'AM_PROG_INSTALL_STRIP' => 1, 'AM_SET_LEADING_DOT' => 1, 'include' => 1, '_AM_SET_OPTIONS' => 1, 'AM_INIT_AUTOMAKE' => 1, '_AM_PROG_TAR' => 1, '_AM_SUBST_NOTMAKE' => 1, 'm4_pattern_forbid' => 1, 'AM_DEP_TRACK' => 1, 'm4_pattern_allow' => 1, 'AM_SILENT_RULES' => 1, 'fp_C_PROTOTYPES' => 1, 'AM_PROG_CC_STDC' => 1, 'AM_SUBST_NOTMAKE' => 1, 'AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, '_m4_warn' => 1, 'AM_C_PROTOTYPES' => 1, '_AC_AM_CONFIG_HEADER_HOOK' => 1, 'AM_PROG_CC_C_O' => 1, 'AC_CONFIG_MACRO_DIR' => 1, 'AM_SET_CURRENT_AUTOMAKE_VERSION' => 1, 'AC_DEFUN_ONCE' => 1, '_AM_SET_OPTION' => 1, 'AC_CONFIG_MACRO_DIR_TRACE' => 1, 'm4_include' => 1, '_AM_AUTOCONF_VERSION' => 1, '_AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, '_AM_PROG_CC_C_O' => 1, 'AM_MISSING_HAS_RUN' => 1, 'AM_CONFIG_HEADER' => 1, 'AM_CONDITIONAL' => 1 } ], 'Autom4te::Request' ), bless( [ '3', 1, [ '/usr/local/share/autoconf' ], [ '/usr/local/share/autoconf/autoconf/autoconf.m4f', 'aclocal.m4', 'configure.ac' ], { 'AC_CONFIG_LIBOBJ_DIR' => 1, 'AC_CONFIG_SUBDIRS' => 1, 'AC_CONFIG_AUX_DIR' => 1, '_AM_MAKEFILE_INCLUDE' => 1, 'AC_CONFIG_LINKS' => 1, '_AM_COND_IF' => 1, 'AM_INIT_AUTOMAKE' => 1, 'AC_SUBST' => 1, 'include' => 1, 'AC_PROG_LIBTOOL' => 1, '_AM_SUBST_NOTMAKE' => 1, 'AC_FC_SRCEXT' => 1, 'AM_POT_TOOLS' => 1, 'm4_sinclude' => 1, 'AM_EXTRA_RECURSIVE_TARGETS' => 1, 'AC_CANONICAL_BUILD' => 1, 'm4_pattern_allow' => 1, 'AM_SILENT_RULES' => 1, '_AM_COND_ENDIF' => 1, 'AM_PATH_GUILE' => 1, 'LT_CONFIG_LTDL_DIR' => 1, 'm4_pattern_forbid' => 1, 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1, 'AC_FC_FREEFORM' => 1, 'AM_PROG_CXX_C_O' => 1, 'AC_CANONICAL_HOST' => 1, '_m4_warn' => 1, 'm4_include' => 1, 'AM_PROG_CC_C_O' => 1, 'AM_NLS' => 1, 'AM_PROG_MOC' => 1, 'AC_FC_PP_SRCEXT' => 1, 'AM_CONDITIONAL' => 1, 'AM_PROG_F77_C_O' => 1, 'sinclude' => 1, 'AM_MAKEFILE_INCLUDE' => 1, 'AC_CONFIG_HEADERS' => 1, 'LT_INIT' => 1, 'AM_ENABLE_MULTILIB' => 1, '_LT_AC_TAGCONFIG' => 1, 'AM_XGETTEXT_OPTION' => 1, 'AC_SUBST_TRACE' => 1, 'LT_SUPPORTED_TAG' => 1, 'AC_REQUIRE_AUX_FILE' => 1, 'AM_PROG_MKDIR_P' => 1, 'AC_CONFIG_FILES' => 1, 'AC_INIT' => 1, 'AM_PROG_FC_C_O' => 1, 'AM_MAINTAINER_MODE' => 1, 'AC_DEFINE_TRACE_LITERAL' => 1, 'AC_LIBSOURCE' => 1, '_AM_COND_ELSE' => 1, 'AM_GNU_GETTEXT' => 1, 'AC_CANONICAL_TARGET' => 1, 'AM_AUTOMAKE_VERSION' => 1, 'AC_FC_PP_DEFINE' => 1, 'AC_CANONICAL_SYSTEM' => 1, 'AH_OUTPUT' => 1, 'AM_PROG_AR' => 1 } ], 'Autom4te::Request' ), bless( [ '4', 1, [ '/opt/local/share/autoconf' ], [ '/opt/local/share/autoconf/autoconf/autoconf.m4f', '-', '/opt/local/share/aclocal-1.15/internal/ac-config-macro-dirs.m4', '/opt/local/share/aclocal-1.15/amversion.m4', '/opt/local/share/aclocal-1.15/auxdir.m4', '/opt/local/share/aclocal-1.15/cond.m4', '/opt/local/share/aclocal-1.15/depend.m4', '/opt/local/share/aclocal-1.15/depout.m4', '/opt/local/share/aclocal-1.15/init.m4', '/opt/local/share/aclocal-1.15/install-sh.m4', '/opt/local/share/aclocal-1.15/lead-dot.m4', '/opt/local/share/aclocal-1.15/lex.m4', '/opt/local/share/aclocal-1.15/make.m4', '/opt/local/share/aclocal-1.15/missing.m4', '/opt/local/share/aclocal-1.15/obsolete.m4', '/opt/local/share/aclocal-1.15/options.m4', '/opt/local/share/aclocal-1.15/prog-cc-c-o.m4', '/opt/local/share/aclocal-1.15/runlog.m4', '/opt/local/share/aclocal-1.15/sanity.m4', '/opt/local/share/aclocal-1.15/silent.m4', '/opt/local/share/aclocal-1.15/strip.m4', '/opt/local/share/aclocal-1.15/substnot.m4', '/opt/local/share/aclocal-1.15/tar.m4', 'configure.ac' ], { 'include' => 1, '_AM_SET_OPTIONS' => 1, 'AM_INIT_AUTOMAKE' => 1, '_AM_PROG_TAR' => 1, 'AM_SET_LEADING_DOT' => 1, 'm4_pattern_forbid' => 1, 'm4_pattern_allow' => 1, 'AM_DEP_TRACK' => 1, 'AM_SILENT_RULES' => 1, '_AM_SUBST_NOTMAKE' => 1, 'AM_SUBST_NOTMAKE' => 1, 'AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, 'AM_PROG_CC_STDC' => 1, '_m4_warn' => 1, 'AM_C_PROTOTYPES' => 1, 'fp_C_PROTOTYPES' => 1, '_AM_AUTOCONF_VERSION' => 1, '_AM_PROG_CC_C_O' => 1, '_AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, 'AM_CONFIG_HEADER' => 1, 'AM_MISSING_HAS_RUN' => 1, 'AM_CONDITIONAL' => 1, '_AC_AM_CONFIG_HEADER_HOOK' => 1, 'AM_PROG_CC_C_O' => 1, 'AC_CONFIG_MACRO_DIR' => 1, 'AM_SET_CURRENT_AUTOMAKE_VERSION' => 1, 'AC_DEFUN_ONCE' => 1, 'AC_CONFIG_MACRO_DIR_TRACE' => 1, '_AM_SET_OPTION' => 1, 'm4_include' => 1, 'AM_PROG_INSTALL_SH' => 1, 'AM_SET_DEPDIR' => 1, 'AC_DEFUN' => 1, 'AM_AUX_DIR_EXPAND' => 1, '_AM_CONFIG_MACRO_DIRS' => 1, 'AU_DEFUN' => 1, '_AM_MANGLE_OPTION' => 1, 'AM_SANITY_CHECK' => 1, 'AM_MISSING_PROG' => 1, 'AM_MAKE_INCLUDE' => 1, 'AM_RUN_LOG' => 1, 'AM_PROG_INSTALL_STRIP' => 1, 'AM_AUTOMAKE_VERSION' => 1, 'AM_PROG_LEX' => 1, '_AM_IF_OPTION' => 1, '_AM_DEPENDENCIES' => 1 } ], 'Autom4te::Request' ), bless( [ '5', 1, [ '/opt/local/share/autoconf' ], [ '/opt/local/share/autoconf/autoconf/autoconf.m4f', 'aclocal.m4', 'configure.ac' ], { 'AC_CANONICAL_TARGET' => 1, 'AM_GNU_GETTEXT' => 1, 'AC_CANONICAL_SYSTEM' => 1, 'AH_OUTPUT' => 1, 'AC_FC_PP_DEFINE' => 1, 'AM_AUTOMAKE_VERSION' => 1, 'AM_PROG_AR' => 1, 'AC_DEFINE_TRACE_LITERAL' => 1, 'AC_LIBSOURCE' => 1, '_AM_COND_ELSE' => 1, 'LT_SUPPORTED_TAG' => 1, 'AM_PROG_MKDIR_P' => 1, 'AC_REQUIRE_AUX_FILE' => 1, 'AC_CONFIG_FILES' => 1, 'AM_MAINTAINER_MODE' => 1, 'AM_PROG_FC_C_O' => 1, 'AC_INIT' => 1, 'AC_CONFIG_HEADERS' => 1, 'LT_INIT' => 1, '_LT_AC_TAGCONFIG' => 1, 'AM_ENABLE_MULTILIB' => 1, 'AM_XGETTEXT_OPTION' => 1, 'AC_SUBST_TRACE' => 1, 'm4_include' => 1, 'AM_PROG_CC_C_O' => 1, 'AC_FC_PP_SRCEXT' => 1, 'AM_CONDITIONAL' => 1, 'AM_NLS' => 1, 'AM_PROG_MOC' => 1, 'AM_MAKEFILE_INCLUDE' => 1, 'sinclude' => 1, 'AM_PROG_F77_C_O' => 1, 'AC_FC_FREEFORM' => 1, 'AM_PROG_CXX_C_O' => 1, '_m4_warn' => 1, 'AC_CANONICAL_HOST' => 1, 'AC_FC_SRCEXT' => 1, '_AM_SUBST_NOTMAKE' => 1, 'AC_PROG_LIBTOOL' => 1, 'AC_CANONICAL_BUILD' => 1, 'AM_EXTRA_RECURSIVE_TARGETS' => 1, 'm4_sinclude' => 1, 'AM_POT_TOOLS' => 1, 'AM_SILENT_RULES' => 1, '_AM_COND_ENDIF' => 1, 'm4_pattern_allow' => 1, 'm4_pattern_forbid' => 1, 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1, 'LT_CONFIG_LTDL_DIR' => 1, 'AM_PATH_GUILE' => 1, 'AC_CONFIG_LIBOBJ_DIR' => 1, '_AM_MAKEFILE_INCLUDE' => 1, 'AC_CONFIG_AUX_DIR' => 1, 'AC_CONFIG_SUBDIRS' => 1, 'AC_SUBST' => 1, '_AM_COND_IF' => 1, 'AM_INIT_AUTOMAKE' => 1, 'AC_CONFIG_LINKS' => 1, 'include' => 1 } ], 'Autom4te::Request' ), bless( [ '6', 1, [ '/opt/local/share/autoconf' ], [ '/opt/local/share/autoconf/autoconf/autoconf.m4f', '-', '/opt/local/share/aclocal-1.16/internal/ac-config-macro-dirs.m4', '/opt/local/share/aclocal-1.16/amversion.m4', '/opt/local/share/aclocal-1.16/auxdir.m4', '/opt/local/share/aclocal-1.16/cond.m4', '/opt/local/share/aclocal-1.16/depend.m4', '/opt/local/share/aclocal-1.16/depout.m4', '/opt/local/share/aclocal-1.16/init.m4', '/opt/local/share/aclocal-1.16/install-sh.m4', '/opt/local/share/aclocal-1.16/lead-dot.m4', '/opt/local/share/aclocal-1.16/lex.m4', '/opt/local/share/aclocal-1.16/make.m4', '/opt/local/share/aclocal-1.16/missing.m4', '/opt/local/share/aclocal-1.16/obsolete.m4', '/opt/local/share/aclocal-1.16/options.m4', '/opt/local/share/aclocal-1.16/prog-cc-c-o.m4', '/opt/local/share/aclocal-1.16/runlog.m4', '/opt/local/share/aclocal-1.16/sanity.m4', '/opt/local/share/aclocal-1.16/silent.m4', '/opt/local/share/aclocal-1.16/strip.m4', '/opt/local/share/aclocal-1.16/substnot.m4', '/opt/local/share/aclocal-1.16/tar.m4', 'configure.ac' ], { 'AM_C_PROTOTYPES' => 1, 'AM_SUBST_NOTMAKE' => 1, 'AM_PROG_CC_STDC' => 1, 'AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, '_m4_warn' => 1, 'fp_C_PROTOTYPES' => 1, 'AM_MISSING_HAS_RUN' => 1, 'AM_CONFIG_HEADER' => 1, 'AM_CONDITIONAL' => 1, '_AM_AUTOCONF_VERSION' => 1, '_AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, '_AM_PROG_CC_C_O' => 1, '_AM_SET_OPTION' => 1, 'AC_CONFIG_MACRO_DIR_TRACE' => 1, 'm4_include' => 1, 'AM_PROG_CC_C_O' => 1, '_AC_AM_CONFIG_HEADER_HOOK' => 1, 'AM_SET_CURRENT_AUTOMAKE_VERSION' => 1, 'AC_DEFUN_ONCE' => 1, 'AC_CONFIG_MACRO_DIR' => 1, 'AM_INIT_AUTOMAKE' => 1, '_AM_PROG_TAR' => 1, 'include' => 1, '_AM_SET_OPTIONS' => 1, 'AM_SET_LEADING_DOT' => 1, 'AM_DEP_TRACK' => 1, 'm4_pattern_allow' => 1, 'AM_SILENT_RULES' => 1, 'm4_pattern_forbid' => 1, '_AM_SUBST_NOTMAKE' => 1, 'AM_MISSING_PROG' => 1, 'AM_MAKE_INCLUDE' => 1, '_AM_MANGLE_OPTION' => 1, 'AM_SANITY_CHECK' => 1, 'AM_PROG_INSTALL_STRIP' => 1, 'AM_RUN_LOG' => 1, '_AM_IF_OPTION' => 1, '_AM_DEPENDENCIES' => 1, 'AM_AUTOMAKE_VERSION' => 1, 'AM_PROG_LEX' => 1, 'AM_PROG_INSTALL_SH' => 1, 'AM_SET_DEPDIR' => 1, 'AC_DEFUN' => 1, '_AM_CONFIG_MACRO_DIRS' => 1, 'AU_DEFUN' => 1, 'AM_AUX_DIR_EXPAND' => 1 } ], 'Autom4te::Request' ) ); gsoap-2.8.91/autom4te.cache/traces.10000644000175000017500000014267113525245157016457 0ustar ellertellertm4trace:configure.in:2: -1- AC_INIT([gsoap], [2.8]) m4trace:configure.in:2: -1- m4_pattern_forbid([^_?A[CHUM]_]) m4trace:configure.in:2: -1- m4_pattern_forbid([_AC_]) m4trace:configure.in:2: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) m4trace:configure.in:2: -1- m4_pattern_allow([^AS_FLAGS$]) m4trace:configure.in:2: -1- m4_pattern_forbid([^_?m4_]) m4trace:configure.in:2: -1- m4_pattern_forbid([^dnl$]) m4trace:configure.in:2: -1- m4_pattern_forbid([^_?AS_]) m4trace:configure.in:2: -1- AC_SUBST([SHELL]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([SHELL]) m4trace:configure.in:2: -1- m4_pattern_allow([^SHELL$]) m4trace:configure.in:2: -1- AC_SUBST([PATH_SEPARATOR]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([PATH_SEPARATOR]) m4trace:configure.in:2: -1- m4_pattern_allow([^PATH_SEPARATOR$]) m4trace:configure.in:2: -1- AC_SUBST([PACKAGE_NAME], [m4_ifdef([AC_PACKAGE_NAME], ['AC_PACKAGE_NAME'])]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([PACKAGE_NAME]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.in:2: -1- AC_SUBST([PACKAGE_TARNAME], [m4_ifdef([AC_PACKAGE_TARNAME], ['AC_PACKAGE_TARNAME'])]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([PACKAGE_TARNAME]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.in:2: -1- AC_SUBST([PACKAGE_VERSION], [m4_ifdef([AC_PACKAGE_VERSION], ['AC_PACKAGE_VERSION'])]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([PACKAGE_VERSION]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.in:2: -1- AC_SUBST([PACKAGE_STRING], [m4_ifdef([AC_PACKAGE_STRING], ['AC_PACKAGE_STRING'])]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([PACKAGE_STRING]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.in:2: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.in:2: -1- AC_SUBST([PACKAGE_URL], [m4_ifdef([AC_PACKAGE_URL], ['AC_PACKAGE_URL'])]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([PACKAGE_URL]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.in:2: -1- AC_SUBST([exec_prefix], [NONE]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([exec_prefix]) m4trace:configure.in:2: -1- m4_pattern_allow([^exec_prefix$]) m4trace:configure.in:2: -1- AC_SUBST([prefix], [NONE]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([prefix]) m4trace:configure.in:2: -1- m4_pattern_allow([^prefix$]) m4trace:configure.in:2: -1- AC_SUBST([program_transform_name], [s,x,x,]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([program_transform_name]) m4trace:configure.in:2: -1- m4_pattern_allow([^program_transform_name$]) m4trace:configure.in:2: -1- AC_SUBST([bindir], ['${exec_prefix}/bin']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([bindir]) m4trace:configure.in:2: -1- m4_pattern_allow([^bindir$]) m4trace:configure.in:2: -1- AC_SUBST([sbindir], ['${exec_prefix}/sbin']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([sbindir]) m4trace:configure.in:2: -1- m4_pattern_allow([^sbindir$]) m4trace:configure.in:2: -1- AC_SUBST([libexecdir], ['${exec_prefix}/libexec']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([libexecdir]) m4trace:configure.in:2: -1- m4_pattern_allow([^libexecdir$]) m4trace:configure.in:2: -1- AC_SUBST([datarootdir], ['${prefix}/share']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([datarootdir]) m4trace:configure.in:2: -1- m4_pattern_allow([^datarootdir$]) m4trace:configure.in:2: -1- AC_SUBST([datadir], ['${datarootdir}']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([datadir]) m4trace:configure.in:2: -1- m4_pattern_allow([^datadir$]) m4trace:configure.in:2: -1- AC_SUBST([sysconfdir], ['${prefix}/etc']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([sysconfdir]) m4trace:configure.in:2: -1- m4_pattern_allow([^sysconfdir$]) m4trace:configure.in:2: -1- AC_SUBST([sharedstatedir], ['${prefix}/com']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([sharedstatedir]) m4trace:configure.in:2: -1- m4_pattern_allow([^sharedstatedir$]) m4trace:configure.in:2: -1- AC_SUBST([localstatedir], ['${prefix}/var']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([localstatedir]) m4trace:configure.in:2: -1- m4_pattern_allow([^localstatedir$]) m4trace:configure.in:2: -1- AC_SUBST([includedir], ['${prefix}/include']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([includedir]) m4trace:configure.in:2: -1- m4_pattern_allow([^includedir$]) m4trace:configure.in:2: -1- AC_SUBST([oldincludedir], ['/usr/include']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([oldincludedir]) m4trace:configure.in:2: -1- m4_pattern_allow([^oldincludedir$]) m4trace:configure.in:2: -1- AC_SUBST([docdir], [m4_ifset([AC_PACKAGE_TARNAME], ['${datarootdir}/doc/${PACKAGE_TARNAME}'], ['${datarootdir}/doc/${PACKAGE}'])]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([docdir]) m4trace:configure.in:2: -1- m4_pattern_allow([^docdir$]) m4trace:configure.in:2: -1- AC_SUBST([infodir], ['${datarootdir}/info']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([infodir]) m4trace:configure.in:2: -1- m4_pattern_allow([^infodir$]) m4trace:configure.in:2: -1- AC_SUBST([htmldir], ['${docdir}']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([htmldir]) m4trace:configure.in:2: -1- m4_pattern_allow([^htmldir$]) m4trace:configure.in:2: -1- AC_SUBST([dvidir], ['${docdir}']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([dvidir]) m4trace:configure.in:2: -1- m4_pattern_allow([^dvidir$]) m4trace:configure.in:2: -1- AC_SUBST([pdfdir], ['${docdir}']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([pdfdir]) m4trace:configure.in:2: -1- m4_pattern_allow([^pdfdir$]) m4trace:configure.in:2: -1- AC_SUBST([psdir], ['${docdir}']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([psdir]) m4trace:configure.in:2: -1- m4_pattern_allow([^psdir$]) m4trace:configure.in:2: -1- AC_SUBST([libdir], ['${exec_prefix}/lib']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([libdir]) m4trace:configure.in:2: -1- m4_pattern_allow([^libdir$]) m4trace:configure.in:2: -1- AC_SUBST([localedir], ['${datarootdir}/locale']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([localedir]) m4trace:configure.in:2: -1- m4_pattern_allow([^localedir$]) m4trace:configure.in:2: -1- AC_SUBST([mandir], ['${datarootdir}/man']) m4trace:configure.in:2: -1- AC_SUBST_TRACE([mandir]) m4trace:configure.in:2: -1- m4_pattern_allow([^mandir$]) m4trace:configure.in:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.in:2: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */ @%:@undef PACKAGE_NAME]) m4trace:configure.in:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.in:2: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */ @%:@undef PACKAGE_TARNAME]) m4trace:configure.in:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.in:2: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */ @%:@undef PACKAGE_VERSION]) m4trace:configure.in:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.in:2: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */ @%:@undef PACKAGE_STRING]) m4trace:configure.in:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.in:2: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */ @%:@undef PACKAGE_BUGREPORT]) m4trace:configure.in:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_URL]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.in:2: -1- AH_OUTPUT([PACKAGE_URL], [/* Define to the home page for this package. */ @%:@undef PACKAGE_URL]) m4trace:configure.in:2: -1- AC_SUBST([DEFS]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([DEFS]) m4trace:configure.in:2: -1- m4_pattern_allow([^DEFS$]) m4trace:configure.in:2: -1- AC_SUBST([ECHO_C]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([ECHO_C]) m4trace:configure.in:2: -1- m4_pattern_allow([^ECHO_C$]) m4trace:configure.in:2: -1- AC_SUBST([ECHO_N]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([ECHO_N]) m4trace:configure.in:2: -1- m4_pattern_allow([^ECHO_N$]) m4trace:configure.in:2: -1- AC_SUBST([ECHO_T]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([ECHO_T]) m4trace:configure.in:2: -1- m4_pattern_allow([^ECHO_T$]) m4trace:configure.in:2: -1- AC_SUBST([LIBS]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.in:2: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.in:2: -1- AC_SUBST([build_alias]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([build_alias]) m4trace:configure.in:2: -1- m4_pattern_allow([^build_alias$]) m4trace:configure.in:2: -1- AC_SUBST([host_alias]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([host_alias]) m4trace:configure.in:2: -1- m4_pattern_allow([^host_alias$]) m4trace:configure.in:2: -1- AC_SUBST([target_alias]) m4trace:configure.in:2: -1- AC_SUBST_TRACE([target_alias]) m4trace:configure.in:2: -1- m4_pattern_allow([^target_alias$]) m4trace:configure.in:3: -1- AM_INIT_AUTOMAKE([subdir-objects]) m4trace:configure.in:3: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) m4trace:configure.in:3: -1- AM_AUTOMAKE_VERSION([1.14]) m4trace:configure.in:3: -1- AC_REQUIRE_AUX_FILE([install-sh]) m4trace:configure.in:3: -1- AC_SUBST([INSTALL_PROGRAM]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([INSTALL_PROGRAM]) m4trace:configure.in:3: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) m4trace:configure.in:3: -1- AC_SUBST([INSTALL_SCRIPT]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([INSTALL_SCRIPT]) m4trace:configure.in:3: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) m4trace:configure.in:3: -1- AC_SUBST([INSTALL_DATA]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([INSTALL_DATA]) m4trace:configure.in:3: -1- m4_pattern_allow([^INSTALL_DATA$]) m4trace:configure.in:3: -1- AC_SUBST([am__isrc], [' -I$(srcdir)']) m4trace:configure.in:3: -1- AC_SUBST_TRACE([am__isrc]) m4trace:configure.in:3: -1- m4_pattern_allow([^am__isrc$]) m4trace:configure.in:3: -1- _AM_SUBST_NOTMAKE([am__isrc]) m4trace:configure.in:3: -1- AC_SUBST([CYGPATH_W]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([CYGPATH_W]) m4trace:configure.in:3: -1- m4_pattern_allow([^CYGPATH_W$]) m4trace:configure.in:3: -1- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME']) m4trace:configure.in:3: -1- AC_SUBST_TRACE([PACKAGE]) m4trace:configure.in:3: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.in:3: -1- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION']) m4trace:configure.in:3: -1- AC_SUBST_TRACE([VERSION]) m4trace:configure.in:3: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.in:3: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE]) m4trace:configure.in:3: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.in:3: -1- AH_OUTPUT([PACKAGE], [/* Name of package */ @%:@undef PACKAGE]) m4trace:configure.in:3: -1- AC_DEFINE_TRACE_LITERAL([VERSION]) m4trace:configure.in:3: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.in:3: -1- AH_OUTPUT([VERSION], [/* Version number of package */ @%:@undef VERSION]) m4trace:configure.in:3: -1- AC_REQUIRE_AUX_FILE([missing]) m4trace:configure.in:3: -1- AC_SUBST([ACLOCAL]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([ACLOCAL]) m4trace:configure.in:3: -1- m4_pattern_allow([^ACLOCAL$]) m4trace:configure.in:3: -1- AC_SUBST([AUTOCONF]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([AUTOCONF]) m4trace:configure.in:3: -1- m4_pattern_allow([^AUTOCONF$]) m4trace:configure.in:3: -1- AC_SUBST([AUTOMAKE]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([AUTOMAKE]) m4trace:configure.in:3: -1- m4_pattern_allow([^AUTOMAKE$]) m4trace:configure.in:3: -1- AC_SUBST([AUTOHEADER]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([AUTOHEADER]) m4trace:configure.in:3: -1- m4_pattern_allow([^AUTOHEADER$]) m4trace:configure.in:3: -1- AC_SUBST([MAKEINFO]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([MAKEINFO]) m4trace:configure.in:3: -1- m4_pattern_allow([^MAKEINFO$]) m4trace:configure.in:3: -1- AC_SUBST([install_sh]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([install_sh]) m4trace:configure.in:3: -1- m4_pattern_allow([^install_sh$]) m4trace:configure.in:3: -1- AC_SUBST([STRIP]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([STRIP]) m4trace:configure.in:3: -1- m4_pattern_allow([^STRIP$]) m4trace:configure.in:3: -1- AC_SUBST([INSTALL_STRIP_PROGRAM]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([INSTALL_STRIP_PROGRAM]) m4trace:configure.in:3: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) m4trace:configure.in:3: -1- AC_REQUIRE_AUX_FILE([install-sh]) m4trace:configure.in:3: -1- AC_SUBST([MKDIR_P]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([MKDIR_P]) m4trace:configure.in:3: -1- m4_pattern_allow([^MKDIR_P$]) m4trace:configure.in:3: -1- AC_SUBST([mkdir_p], ['$(MKDIR_P)']) m4trace:configure.in:3: -1- AC_SUBST_TRACE([mkdir_p]) m4trace:configure.in:3: -1- m4_pattern_allow([^mkdir_p$]) m4trace:configure.in:3: -1- AC_SUBST([AWK]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([AWK]) m4trace:configure.in:3: -1- m4_pattern_allow([^AWK$]) m4trace:configure.in:3: -1- AC_SUBST([SET_MAKE]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([SET_MAKE]) m4trace:configure.in:3: -1- m4_pattern_allow([^SET_MAKE$]) m4trace:configure.in:3: -1- AC_SUBST([am__leading_dot]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([am__leading_dot]) m4trace:configure.in:3: -1- m4_pattern_allow([^am__leading_dot$]) m4trace:configure.in:3: -1- AC_SUBST([AMTAR], ['$${TAR-tar}']) m4trace:configure.in:3: -1- AC_SUBST_TRACE([AMTAR]) m4trace:configure.in:3: -1- m4_pattern_allow([^AMTAR$]) m4trace:configure.in:3: -1- AC_SUBST([am__tar]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([am__tar]) m4trace:configure.in:3: -1- m4_pattern_allow([^am__tar$]) m4trace:configure.in:3: -1- AC_SUBST([am__untar]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([am__untar]) m4trace:configure.in:3: -1- m4_pattern_allow([^am__untar$]) m4trace:configure.in:3: -1- AM_SILENT_RULES m4trace:configure.in:3: -1- AC_SUBST([AM_V]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([AM_V]) m4trace:configure.in:3: -1- m4_pattern_allow([^AM_V$]) m4trace:configure.in:3: -1- _AM_SUBST_NOTMAKE([AM_V]) m4trace:configure.in:3: -1- AC_SUBST([AM_DEFAULT_V]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([AM_DEFAULT_V]) m4trace:configure.in:3: -1- m4_pattern_allow([^AM_DEFAULT_V$]) m4trace:configure.in:3: -1- _AM_SUBST_NOTMAKE([AM_DEFAULT_V]) m4trace:configure.in:3: -1- AC_SUBST([AM_DEFAULT_VERBOSITY]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([AM_DEFAULT_VERBOSITY]) m4trace:configure.in:3: -1- m4_pattern_allow([^AM_DEFAULT_VERBOSITY$]) m4trace:configure.in:3: -1- AC_SUBST([AM_BACKSLASH]) m4trace:configure.in:3: -1- AC_SUBST_TRACE([AM_BACKSLASH]) m4trace:configure.in:3: -1- m4_pattern_allow([^AM_BACKSLASH$]) m4trace:configure.in:3: -1- _AM_SUBST_NOTMAKE([AM_BACKSLASH]) m4trace:configure.in:5: -1- AC_CANONICAL_HOST m4trace:configure.in:5: -1- AC_CANONICAL_BUILD m4trace:configure.in:5: -1- AC_REQUIRE_AUX_FILE([config.sub]) m4trace:configure.in:5: -1- AC_REQUIRE_AUX_FILE([config.guess]) m4trace:configure.in:5: -1- AC_SUBST([build], [$ac_cv_build]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([build]) m4trace:configure.in:5: -1- m4_pattern_allow([^build$]) m4trace:configure.in:5: -1- AC_SUBST([build_cpu], [$[1]]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([build_cpu]) m4trace:configure.in:5: -1- m4_pattern_allow([^build_cpu$]) m4trace:configure.in:5: -1- AC_SUBST([build_vendor], [$[2]]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([build_vendor]) m4trace:configure.in:5: -1- m4_pattern_allow([^build_vendor$]) m4trace:configure.in:5: -1- AC_SUBST([build_os]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([build_os]) m4trace:configure.in:5: -1- m4_pattern_allow([^build_os$]) m4trace:configure.in:5: -1- AC_SUBST([host], [$ac_cv_host]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([host]) m4trace:configure.in:5: -1- m4_pattern_allow([^host$]) m4trace:configure.in:5: -1- AC_SUBST([host_cpu], [$[1]]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([host_cpu]) m4trace:configure.in:5: -1- m4_pattern_allow([^host_cpu$]) m4trace:configure.in:5: -1- AC_SUBST([host_vendor], [$[2]]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([host_vendor]) m4trace:configure.in:5: -1- m4_pattern_allow([^host_vendor$]) m4trace:configure.in:5: -1- AC_SUBST([host_os]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([host_os]) m4trace:configure.in:5: -1- m4_pattern_allow([^host_os$]) m4trace:configure.in:8: -1- _m4_warn([obsolete], ['AM_CONFIG_HEADER': this macro is obsolete. You should use the 'AC_CONFIG_HEADERS' macro instead.], [aclocal.m4:766: AM_CONFIG_HEADER is expanded from... configure.in:8: the top level]) m4trace:configure.in:8: -1- AC_CONFIG_HEADERS([config.h]) m4trace:configure.in:11: -1- AC_SUBST([SET_MAKE]) m4trace:configure.in:11: -1- AC_SUBST_TRACE([SET_MAKE]) m4trace:configure.in:11: -1- m4_pattern_allow([^SET_MAKE$]) m4trace:configure.in:13: -1- AC_SUBST([CXX]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([CXX]) m4trace:configure.in:13: -1- m4_pattern_allow([^CXX$]) m4trace:configure.in:13: -1- AC_SUBST([CXXFLAGS]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([CXXFLAGS]) m4trace:configure.in:13: -1- m4_pattern_allow([^CXXFLAGS$]) m4trace:configure.in:13: -1- AC_SUBST([LDFLAGS]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([LDFLAGS]) m4trace:configure.in:13: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.in:13: -1- AC_SUBST([LIBS]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.in:13: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.in:13: -1- AC_SUBST([CPPFLAGS]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([CPPFLAGS]) m4trace:configure.in:13: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.in:13: -1- AC_SUBST([CXX]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([CXX]) m4trace:configure.in:13: -1- m4_pattern_allow([^CXX$]) m4trace:configure.in:13: -1- AC_SUBST([ac_ct_CXX]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([ac_ct_CXX]) m4trace:configure.in:13: -1- m4_pattern_allow([^ac_ct_CXX$]) m4trace:configure.in:13: -1- AC_SUBST([EXEEXT], [$ac_cv_exeext]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([EXEEXT]) m4trace:configure.in:13: -1- m4_pattern_allow([^EXEEXT$]) m4trace:configure.in:13: -1- AC_SUBST([OBJEXT], [$ac_cv_objext]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([OBJEXT]) m4trace:configure.in:13: -1- m4_pattern_allow([^OBJEXT$]) m4trace:configure.in:13: -1- AC_SUBST([DEPDIR], ["${am__leading_dot}deps"]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([DEPDIR]) m4trace:configure.in:13: -1- m4_pattern_allow([^DEPDIR$]) m4trace:configure.in:13: -1- AC_SUBST([am__include]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([am__include]) m4trace:configure.in:13: -1- m4_pattern_allow([^am__include$]) m4trace:configure.in:13: -1- AC_SUBST([am__quote]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([am__quote]) m4trace:configure.in:13: -1- m4_pattern_allow([^am__quote$]) m4trace:configure.in:13: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) m4trace:configure.in:13: -1- AC_SUBST([AMDEP_TRUE]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([AMDEP_TRUE]) m4trace:configure.in:13: -1- m4_pattern_allow([^AMDEP_TRUE$]) m4trace:configure.in:13: -1- AC_SUBST([AMDEP_FALSE]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([AMDEP_FALSE]) m4trace:configure.in:13: -1- m4_pattern_allow([^AMDEP_FALSE$]) m4trace:configure.in:13: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE]) m4trace:configure.in:13: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE]) m4trace:configure.in:13: -1- AC_SUBST([AMDEPBACKSLASH]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([AMDEPBACKSLASH]) m4trace:configure.in:13: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) m4trace:configure.in:13: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH]) m4trace:configure.in:13: -1- AC_SUBST([am__nodep]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([am__nodep]) m4trace:configure.in:13: -1- m4_pattern_allow([^am__nodep$]) m4trace:configure.in:13: -1- _AM_SUBST_NOTMAKE([am__nodep]) m4trace:configure.in:13: -1- AC_SUBST([CXXDEPMODE], [depmode=$am_cv_CXX_dependencies_compiler_type]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([CXXDEPMODE]) m4trace:configure.in:13: -1- m4_pattern_allow([^CXXDEPMODE$]) m4trace:configure.in:13: -1- AM_CONDITIONAL([am__fastdepCXX], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3]) m4trace:configure.in:13: -1- AC_SUBST([am__fastdepCXX_TRUE]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([am__fastdepCXX_TRUE]) m4trace:configure.in:13: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$]) m4trace:configure.in:13: -1- AC_SUBST([am__fastdepCXX_FALSE]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([am__fastdepCXX_FALSE]) m4trace:configure.in:13: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$]) m4trace:configure.in:13: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE]) m4trace:configure.in:13: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE]) m4trace:configure.in:14: -1- AC_SUBST([CC]) m4trace:configure.in:14: -1- AC_SUBST_TRACE([CC]) m4trace:configure.in:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:14: -1- AC_SUBST([CFLAGS]) m4trace:configure.in:14: -1- AC_SUBST_TRACE([CFLAGS]) m4trace:configure.in:14: -1- m4_pattern_allow([^CFLAGS$]) m4trace:configure.in:14: -1- AC_SUBST([LDFLAGS]) m4trace:configure.in:14: -1- AC_SUBST_TRACE([LDFLAGS]) m4trace:configure.in:14: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.in:14: -1- AC_SUBST([LIBS]) m4trace:configure.in:14: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.in:14: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.in:14: -1- AC_SUBST([CPPFLAGS]) m4trace:configure.in:14: -1- AC_SUBST_TRACE([CPPFLAGS]) m4trace:configure.in:14: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.in:14: -1- AC_SUBST([CC]) m4trace:configure.in:14: -1- AC_SUBST_TRACE([CC]) m4trace:configure.in:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:14: -1- AC_SUBST([CC]) m4trace:configure.in:14: -1- AC_SUBST_TRACE([CC]) m4trace:configure.in:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:14: -1- AC_SUBST([CC]) m4trace:configure.in:14: -1- AC_SUBST_TRACE([CC]) m4trace:configure.in:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:14: -1- AC_SUBST([CC]) m4trace:configure.in:14: -1- AC_SUBST_TRACE([CC]) m4trace:configure.in:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:14: -1- AC_SUBST([ac_ct_CC]) m4trace:configure.in:14: -1- AC_SUBST_TRACE([ac_ct_CC]) m4trace:configure.in:14: -1- m4_pattern_allow([^ac_ct_CC$]) m4trace:configure.in:14: -1- AC_REQUIRE_AUX_FILE([compile]) m4trace:configure.in:14: -1- AC_SUBST([CCDEPMODE], [depmode=$am_cv_CC_dependencies_compiler_type]) m4trace:configure.in:14: -1- AC_SUBST_TRACE([CCDEPMODE]) m4trace:configure.in:14: -1- m4_pattern_allow([^CCDEPMODE$]) m4trace:configure.in:14: -1- AM_CONDITIONAL([am__fastdepCC], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) m4trace:configure.in:14: -1- AC_SUBST([am__fastdepCC_TRUE]) m4trace:configure.in:14: -1- AC_SUBST_TRACE([am__fastdepCC_TRUE]) m4trace:configure.in:14: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) m4trace:configure.in:14: -1- AC_SUBST([am__fastdepCC_FALSE]) m4trace:configure.in:14: -1- AC_SUBST_TRACE([am__fastdepCC_FALSE]) m4trace:configure.in:14: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) m4trace:configure.in:14: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE]) m4trace:configure.in:14: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE]) m4trace:configure.in:15: -1- AM_PROG_CC_C_O m4trace:configure.in:16: -1- AC_SUBST([LEX]) m4trace:configure.in:16: -1- AC_SUBST_TRACE([LEX]) m4trace:configure.in:16: -1- m4_pattern_allow([^LEX$]) m4trace:configure.in:16: -1- AC_SUBST([LEX_OUTPUT_ROOT], [$ac_cv_prog_lex_root]) m4trace:configure.in:16: -1- AC_SUBST_TRACE([LEX_OUTPUT_ROOT]) m4trace:configure.in:16: -1- m4_pattern_allow([^LEX_OUTPUT_ROOT$]) m4trace:configure.in:16: -1- AC_SUBST([LEXLIB]) m4trace:configure.in:16: -1- AC_SUBST_TRACE([LEXLIB]) m4trace:configure.in:16: -1- m4_pattern_allow([^LEXLIB$]) m4trace:configure.in:16: -1- AC_DEFINE_TRACE_LITERAL([YYTEXT_POINTER]) m4trace:configure.in:16: -1- m4_pattern_allow([^YYTEXT_POINTER$]) m4trace:configure.in:16: -1- AH_OUTPUT([YYTEXT_POINTER], [/* Define to 1 if `lex\' declares `yytext\' as a `char *\' by default, not a `char@<:@@:>@\'. */ @%:@undef YYTEXT_POINTER]) m4trace:configure.in:17: -1- AC_SUBST([YACC]) m4trace:configure.in:17: -1- AC_SUBST_TRACE([YACC]) m4trace:configure.in:17: -1- m4_pattern_allow([^YACC$]) m4trace:configure.in:17: -1- AC_SUBST([YACC]) m4trace:configure.in:17: -1- AC_SUBST_TRACE([YACC]) m4trace:configure.in:17: -1- m4_pattern_allow([^YACC$]) m4trace:configure.in:17: -1- AC_SUBST([YFLAGS]) m4trace:configure.in:17: -1- AC_SUBST_TRACE([YFLAGS]) m4trace:configure.in:17: -1- m4_pattern_allow([^YFLAGS$]) m4trace:configure.in:18: -1- AC_SUBST([CPP]) m4trace:configure.in:18: -1- AC_SUBST_TRACE([CPP]) m4trace:configure.in:18: -1- m4_pattern_allow([^CPP$]) m4trace:configure.in:18: -1- AC_SUBST([CPPFLAGS]) m4trace:configure.in:18: -1- AC_SUBST_TRACE([CPPFLAGS]) m4trace:configure.in:18: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.in:18: -1- AC_SUBST([CPP]) m4trace:configure.in:18: -1- AC_SUBST_TRACE([CPP]) m4trace:configure.in:18: -1- m4_pattern_allow([^CPP$]) m4trace:configure.in:19: -1- AC_SUBST([RANLIB]) m4trace:configure.in:19: -1- AC_SUBST_TRACE([RANLIB]) m4trace:configure.in:19: -1- m4_pattern_allow([^RANLIB$]) m4trace:configure.in:21: -1- AC_SUBST([LN_S], [$as_ln_s]) m4trace:configure.in:21: -1- AC_SUBST_TRACE([LN_S]) m4trace:configure.in:21: -1- m4_pattern_allow([^LN_S$]) m4trace:configure.in:22: -1- AC_SUBST([AWK]) m4trace:configure.in:22: -1- AC_SUBST_TRACE([AWK]) m4trace:configure.in:22: -1- m4_pattern_allow([^AWK$]) m4trace:configure.in:90: -1- AC_SUBST([SAMPLE_EXTRA_LIBS]) m4trace:configure.in:90: -1- AC_SUBST_TRACE([SAMPLE_EXTRA_LIBS]) m4trace:configure.in:90: -1- m4_pattern_allow([^SAMPLE_EXTRA_LIBS$]) m4trace:configure.in:91: -1- AC_SUBST([platform]) m4trace:configure.in:91: -1- AC_SUBST_TRACE([platform]) m4trace:configure.in:91: -1- m4_pattern_allow([^platform$]) m4trace:configure.in:94: -1- AC_SUBST([GREP]) m4trace:configure.in:94: -1- AC_SUBST_TRACE([GREP]) m4trace:configure.in:94: -1- m4_pattern_allow([^GREP$]) m4trace:configure.in:94: -1- AC_SUBST([EGREP]) m4trace:configure.in:94: -1- AC_SUBST_TRACE([EGREP]) m4trace:configure.in:94: -1- m4_pattern_allow([^EGREP$]) m4trace:configure.in:94: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS]) m4trace:configure.in:94: -1- m4_pattern_allow([^STDC_HEADERS$]) m4trace:configure.in:94: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if you have the ANSI C header files. */ @%:@undef STDC_HEADERS]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_ARPA_INET_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_ARPA_INET_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_XLOCALE_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_XLOCALE_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_ERRNO_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_ERRNO_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_FCNTL_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_FCNTL_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_LIMITS_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_LIMITS_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_NETDB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_NETDB_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_NETINET_IN_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_NETINET_IN_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDLIB_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRING_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRINGS_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDINT_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_INTTYPES_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_TIME_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_TIME_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_SYS_INTTYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_INTTYPES_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_SYS_SOCKET_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_SOCKET_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TYPES_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_SYS_TIME_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TIME_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_SYS_TIMEB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TIMEB_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_UNISTD_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_POLL_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_POLL_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_OPENSSL_SSL_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_OPENSSL_SSL_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_GNUTLS_GNUTLS_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_GNUTLS_GNUTLS_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_ZLIB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_ZLIB_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TYPES_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_STAT_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDLIB_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRING_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_MEMORY_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRINGS_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_INTTYPES_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDINT_H]) m4trace:configure.in:95: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_UNISTD_H]) m4trace:configure.in:98: -1- AC_DEFINE_TRACE_LITERAL([const]) m4trace:configure.in:98: -1- m4_pattern_allow([^const$]) m4trace:configure.in:98: -1- AH_OUTPUT([const], [/* Define to empty if `const\' does not conform to ANSI C. */ @%:@undef const]) m4trace:configure.in:99: -1- AC_DEFINE_TRACE_LITERAL([size_t]) m4trace:configure.in:99: -1- m4_pattern_allow([^size_t$]) m4trace:configure.in:99: -1- AH_OUTPUT([size_t], [/* Define to `unsigned int\' if does not define. */ @%:@undef size_t]) m4trace:configure.in:100: -1- AC_DEFINE_TRACE_LITERAL([TIME_WITH_SYS_TIME]) m4trace:configure.in:100: -1- m4_pattern_allow([^TIME_WITH_SYS_TIME$]) m4trace:configure.in:100: -1- AH_OUTPUT([TIME_WITH_SYS_TIME], [/* Define to 1 if you can safely include both and . */ @%:@undef TIME_WITH_SYS_TIME]) m4trace:configure.in:101: -1- AC_DEFINE_TRACE_LITERAL([TM_IN_SYS_TIME]) m4trace:configure.in:101: -1- m4_pattern_allow([^TM_IN_SYS_TIME$]) m4trace:configure.in:101: -1- AH_OUTPUT([TM_IN_SYS_TIME], [/* Define to 1 if your declares `struct tm\'. */ @%:@undef TM_IN_SYS_TIME]) m4trace:configure.in:106: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_TM_TM_GMTOFF]) m4trace:configure.in:106: -1- m4_pattern_allow([^HAVE_STRUCT_TM_TM_GMTOFF$]) m4trace:configure.in:106: -1- AH_OUTPUT([HAVE_STRUCT_TM_TM_GMTOFF], [/* Define to 1 if `tm_gmtoff\' is a member of `struct tm\'. */ @%:@undef HAVE_STRUCT_TM_TM_GMTOFF]) m4trace:configure.in:106: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_TM___TM_GMTOFF]) m4trace:configure.in:106: -1- m4_pattern_allow([^HAVE_STRUCT_TM___TM_GMTOFF$]) m4trace:configure.in:106: -1- AH_OUTPUT([HAVE_STRUCT_TM___TM_GMTOFF], [/* Define to 1 if `__tm_gmtoff\' is a member of `struct tm\'. */ @%:@undef HAVE_STRUCT_TM___TM_GMTOFF]) m4trace:configure.in:109: -1- AH_OUTPUT([HAVE_SYS_TIME_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TIME_H]) m4trace:configure.in:109: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_UNISTD_H]) m4trace:configure.in:109: -1- AH_OUTPUT([HAVE_ALARM], [/* Define to 1 if you have the `alarm\' function. */ @%:@undef HAVE_ALARM]) m4trace:configure.in:109: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS mktime.$ac_objext"]) m4trace:configure.in:109: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.in:109: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.in:109: -1- AC_LIBSOURCE([mktime.c]) m4trace:configure.in:110: -1- _m4_warn([obsolete], [The macro `AC_TYPE_SIGNAL' is obsolete. You should run autoupdate.], [../../lib/autoconf/types.m4:759: AC_TYPE_SIGNAL is expanded from... configure.in:110: the top level]) m4trace:configure.in:110: -1- AC_DEFINE_TRACE_LITERAL([RETSIGTYPE]) m4trace:configure.in:110: -1- m4_pattern_allow([^RETSIGTYPE$]) m4trace:configure.in:110: -1- AH_OUTPUT([RETSIGTYPE], [/* Define as the return type of signal handlers (`int\' or `void\'). */ @%:@undef RETSIGTYPE]) m4trace:configure.in:111: -1- AH_OUTPUT([HAVE_STRFTIME], [/* Define to 1 if you have the `strftime\' function. */ @%:@undef HAVE_STRFTIME]) m4trace:configure.in:111: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRFTIME]) m4trace:configure.in:111: -1- m4_pattern_allow([^HAVE_STRFTIME$]) m4trace:configure.in:111: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRFTIME]) m4trace:configure.in:111: -1- m4_pattern_allow([^HAVE_STRFTIME$]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_RANDOM], [/* Define to 1 if you have the `random\' function. */ @%:@undef HAVE_RANDOM]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_GETTIMEOFDAY], [/* Define to 1 if you have the `gettimeofday\' function. */ @%:@undef HAVE_GETTIMEOFDAY]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_FTIME], [/* Define to 1 if you have the `ftime\' function. */ @%:@undef HAVE_FTIME]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_LOCALTIME_R], [/* Define to 1 if you have the `localtime_r\' function. */ @%:@undef HAVE_LOCALTIME_R]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_TIMEGM], [/* Define to 1 if you have the `timegm\' function. */ @%:@undef HAVE_TIMEGM]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_GMTIME], [/* Define to 1 if you have the `gmtime\' function. */ @%:@undef HAVE_GMTIME]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_GMTIME_R], [/* Define to 1 if you have the `gmtime_r\' function. */ @%:@undef HAVE_GMTIME_R]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_MEMSET], [/* Define to 1 if you have the `memset\' function. */ @%:@undef HAVE_MEMSET]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_SELECT], [/* Define to 1 if you have the `select\' function. */ @%:@undef HAVE_SELECT]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_SOCKET], [/* Define to 1 if you have the `socket\' function. */ @%:@undef HAVE_SOCKET]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_SNPRINTF], [/* Define to 1 if you have the `snprintf\' function. */ @%:@undef HAVE_SNPRINTF]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRCHR], [/* Define to 1 if you have the `strchr\' function. */ @%:@undef HAVE_STRCHR]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRERROR], [/* Define to 1 if you have the `strerror\' function. */ @%:@undef HAVE_STRERROR]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRERROR_R], [/* Define to 1 if you have the `strerror_r\' function. */ @%:@undef HAVE_STRERROR_R]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRRCHR], [/* Define to 1 if you have the `strrchr\' function. */ @%:@undef HAVE_STRRCHR]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRSTR], [/* Define to 1 if you have the `strstr\' function. */ @%:@undef HAVE_STRSTR]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRTOL], [/* Define to 1 if you have the `strtol\' function. */ @%:@undef HAVE_STRTOL]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRTOUL], [/* Define to 1 if you have the `strtoul\' function. */ @%:@undef HAVE_STRTOUL]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRTOLL], [/* Define to 1 if you have the `strtoll\' function. */ @%:@undef HAVE_STRTOLL]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRTOULL], [/* Define to 1 if you have the `strtoull\' function. */ @%:@undef HAVE_STRTOULL]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRTOLD], [/* Define to 1 if you have the `strtold\' function. */ @%:@undef HAVE_STRTOLD]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRTOD], [/* Define to 1 if you have the `strtod\' function. */ @%:@undef HAVE_STRTOD]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRTOF], [/* Define to 1 if you have the `strtof\' function. */ @%:@undef HAVE_STRTOF]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRTOLD_L], [/* Define to 1 if you have the `strtold_l\' function. */ @%:@undef HAVE_STRTOLD_L]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRTOD_L], [/* Define to 1 if you have the `strtod_l\' function. */ @%:@undef HAVE_STRTOD_L]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STRTOF_L], [/* Define to 1 if you have the `strtof_l\' function. */ @%:@undef HAVE_STRTOF_L]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_SSCANF], [/* Define to 1 if you have the `sscanf\' function. */ @%:@undef HAVE_SSCANF]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_SSCANF_L], [/* Define to 1 if you have the `sscanf_l\' function. */ @%:@undef HAVE_SSCANF_L]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_SPRINTF_L], [/* Define to 1 if you have the `sprintf_l\' function. */ @%:@undef HAVE_SPRINTF_L]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_WCTOMB], [/* Define to 1 if you have the `wctomb\' function. */ @%:@undef HAVE_WCTOMB]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_MBTOWC], [/* Define to 1 if you have the `mbtowc\' function. */ @%:@undef HAVE_MBTOWC]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_POLL], [/* Define to 1 if you have the `poll\' function. */ @%:@undef HAVE_POLL]) m4trace:configure.in:115: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ISNAN]) m4trace:configure.in:115: -1- m4_pattern_allow([^HAVE_ISNAN$]) m4trace:configure.in:115: -1- AH_OUTPUT([HAVE_ISNAN], [/* isnan */ @%:@undef HAVE_ISNAN]) m4trace:configure.in:116: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ISINF]) m4trace:configure.in:116: -1- m4_pattern_allow([^HAVE_ISINF$]) m4trace:configure.in:116: -1- AH_OUTPUT([HAVE_ISINF], [/* isinf */ @%:@undef HAVE_ISINF]) m4trace:configure.in:124: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ISNAN]) m4trace:configure.in:124: -1- m4_pattern_allow([^HAVE_ISNAN$]) m4trace:configure.in:124: -1- AH_OUTPUT([HAVE_ISNAN], [/* isnan */ @%:@undef HAVE_ISNAN]) m4trace:configure.in:136: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ISINF]) m4trace:configure.in:136: -1- m4_pattern_allow([^HAVE_ISINF$]) m4trace:configure.in:136: -1- AH_OUTPUT([HAVE_ISINF], [/* isinf */ @%:@undef HAVE_ISINF]) m4trace:configure.in:145: -1- AH_OUTPUT([HAVE_GETHOSTBYNAME_R], [/* Define to 1 if you have the `gethostbyname_r\' function. */ @%:@undef HAVE_GETHOSTBYNAME_R]) m4trace:configure.in:145: -1- AC_DEFINE_TRACE_LITERAL([HAVE_GETHOSTBYNAME_R]) m4trace:configure.in:145: -1- m4_pattern_allow([^HAVE_GETHOSTBYNAME_R$]) m4trace:configure.in:146: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDLIB_H]) m4trace:configure.in:146: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STDLIB_H]) m4trace:configure.in:146: -1- m4_pattern_allow([^HAVE_STDLIB_H$]) m4trace:configure.in:146: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MALLOC]) m4trace:configure.in:146: -1- m4_pattern_allow([^HAVE_MALLOC$]) m4trace:configure.in:146: -1- AH_OUTPUT([HAVE_MALLOC], [/* Define to 1 if your system has a GNU libc compatible `malloc\' function, and to 0 otherwise. */ @%:@undef HAVE_MALLOC]) m4trace:configure.in:146: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MALLOC]) m4trace:configure.in:146: -1- m4_pattern_allow([^HAVE_MALLOC$]) m4trace:configure.in:146: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS malloc.$ac_objext"]) m4trace:configure.in:146: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.in:146: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.in:146: -1- AC_LIBSOURCE([malloc.c]) m4trace:configure.in:146: -1- AC_DEFINE_TRACE_LITERAL([malloc]) m4trace:configure.in:146: -1- m4_pattern_allow([^malloc$]) m4trace:configure.in:146: -1- AH_OUTPUT([malloc], [/* Define to rpl_malloc if the replacement function should be used. */ @%:@undef malloc]) m4trace:configure.in:157: -1- AM_CONDITIONAL([DEBUG_COMPILE], [test x$debug = xtrue]) m4trace:configure.in:157: -1- AC_SUBST([DEBUG_COMPILE_TRUE]) m4trace:configure.in:157: -1- AC_SUBST_TRACE([DEBUG_COMPILE_TRUE]) m4trace:configure.in:157: -1- m4_pattern_allow([^DEBUG_COMPILE_TRUE$]) m4trace:configure.in:157: -1- AC_SUBST([DEBUG_COMPILE_FALSE]) m4trace:configure.in:157: -1- AC_SUBST_TRACE([DEBUG_COMPILE_FALSE]) m4trace:configure.in:157: -1- m4_pattern_allow([^DEBUG_COMPILE_FALSE$]) m4trace:configure.in:157: -1- _AM_SUBST_NOTMAKE([DEBUG_COMPILE_TRUE]) m4trace:configure.in:157: -1- _AM_SUBST_NOTMAKE([DEBUG_COMPILE_FALSE]) m4trace:configure.in:163: -1- AC_SUBST([SOAPCPP2_DEBUG]) m4trace:configure.in:163: -1- AC_SUBST_TRACE([SOAPCPP2_DEBUG]) m4trace:configure.in:163: -1- m4_pattern_allow([^SOAPCPP2_DEBUG$]) m4trace:configure.in:168: -1- AC_SUBST([SOAPCPP2_IMPORTPATH]) m4trace:configure.in:168: -1- AC_SUBST_TRACE([SOAPCPP2_IMPORTPATH]) m4trace:configure.in:168: -1- m4_pattern_allow([^SOAPCPP2_IMPORTPATH$]) m4trace:configure.in:173: -1- AC_SUBST([WSDL2H_IMPORTPATH]) m4trace:configure.in:173: -1- AC_SUBST_TRACE([WSDL2H_IMPORTPATH]) m4trace:configure.in:173: -1- m4_pattern_allow([^WSDL2H_IMPORTPATH$]) m4trace:configure.in:181: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.in:181: the top level]) m4trace:configure.in:190: -1- AC_SUBST([SOAPCPP2_NONAMESPACES]) m4trace:configure.in:190: -1- AC_SUBST_TRACE([SOAPCPP2_NONAMESPACES]) m4trace:configure.in:190: -1- m4_pattern_allow([^SOAPCPP2_NONAMESPACES$]) m4trace:configure.in:198: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.in:198: the top level]) m4trace:configure.in:207: -1- AC_SUBST([SOAPCPP2_IPV6]) m4trace:configure.in:207: -1- AC_SUBST_TRACE([SOAPCPP2_IPV6]) m4trace:configure.in:207: -1- m4_pattern_allow([^SOAPCPP2_IPV6$]) m4trace:configure.in:220: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.in:220: the top level]) m4trace:configure.in:227: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.in:227: the top level]) m4trace:configure.in:264: -1- AC_SUBST([WSDL2H_EXTRA_FLAGS]) m4trace:configure.in:264: -1- AC_SUBST_TRACE([WSDL2H_EXTRA_FLAGS]) m4trace:configure.in:264: -1- m4_pattern_allow([^WSDL2H_EXTRA_FLAGS$]) m4trace:configure.in:265: -1- AC_SUBST([WSDL2H_EXTRA_LIBS]) m4trace:configure.in:265: -1- AC_SUBST_TRACE([WSDL2H_EXTRA_LIBS]) m4trace:configure.in:265: -1- m4_pattern_allow([^WSDL2H_EXTRA_LIBS$]) m4trace:configure.in:266: -1- AC_SUBST([SAMPLE_INCLUDES]) m4trace:configure.in:266: -1- AC_SUBST_TRACE([SAMPLE_INCLUDES]) m4trace:configure.in:266: -1- m4_pattern_allow([^SAMPLE_INCLUDES$]) m4trace:configure.in:267: -1- AC_SUBST([SAMPLE_SSL_LIBS]) m4trace:configure.in:267: -1- AC_SUBST_TRACE([SAMPLE_SSL_LIBS]) m4trace:configure.in:267: -1- m4_pattern_allow([^SAMPLE_SSL_LIBS$]) m4trace:configure.in:268: -1- AC_SUBST([WSDL2H_SOAP_CPP_LIB]) m4trace:configure.in:268: -1- AC_SUBST_TRACE([WSDL2H_SOAP_CPP_LIB]) m4trace:configure.in:268: -1- m4_pattern_allow([^WSDL2H_SOAP_CPP_LIB$]) m4trace:configure.in:278: -1- AM_CONDITIONAL([ENABLE_SAMPLES], [test x$samples = xtrue]) m4trace:configure.in:278: -1- AC_SUBST([ENABLE_SAMPLES_TRUE]) m4trace:configure.in:278: -1- AC_SUBST_TRACE([ENABLE_SAMPLES_TRUE]) m4trace:configure.in:278: -1- m4_pattern_allow([^ENABLE_SAMPLES_TRUE$]) m4trace:configure.in:278: -1- AC_SUBST([ENABLE_SAMPLES_FALSE]) m4trace:configure.in:278: -1- AC_SUBST_TRACE([ENABLE_SAMPLES_FALSE]) m4trace:configure.in:278: -1- m4_pattern_allow([^ENABLE_SAMPLES_FALSE$]) m4trace:configure.in:278: -1- _AM_SUBST_NOTMAKE([ENABLE_SAMPLES_TRUE]) m4trace:configure.in:278: -1- _AM_SUBST_NOTMAKE([ENABLE_SAMPLES_FALSE]) m4trace:configure.in:279: -1- AC_SUBST([ENABLE_SAMPLES]) m4trace:configure.in:279: -1- AC_SUBST_TRACE([ENABLE_SAMPLES]) m4trace:configure.in:279: -1- m4_pattern_allow([^ENABLE_SAMPLES$]) m4trace:configure.in:286: -1- AC_SUBST([SAMPLE_DIRS]) m4trace:configure.in:286: -1- AC_SUBST_TRACE([SAMPLE_DIRS]) m4trace:configure.in:286: -1- m4_pattern_allow([^SAMPLE_DIRS$]) m4trace:configure.in:296: -1- AC_SUBST([LEX_DEFINE]) m4trace:configure.in:296: -1- AC_SUBST_TRACE([LEX_DEFINE]) m4trace:configure.in:296: -1- m4_pattern_allow([^LEX_DEFINE$]) m4trace:configure.in:297: -1- AC_SUBST([LEX_FLAGS]) m4trace:configure.in:297: -1- AC_SUBST_TRACE([LEX_FLAGS]) m4trace:configure.in:297: -1- m4_pattern_allow([^LEX_FLAGS$]) m4trace:configure.in:298: -1- AC_SUBST([LEXLIB]) m4trace:configure.in:298: -1- AC_SUBST_TRACE([LEXLIB]) m4trace:configure.in:298: -1- m4_pattern_allow([^LEXLIB$]) m4trace:configure.in:308: -1- AC_SUBST([BISON_DEFINE]) m4trace:configure.in:308: -1- AC_SUBST_TRACE([BISON_DEFINE]) m4trace:configure.in:308: -1- m4_pattern_allow([^BISON_DEFINE$]) m4trace:configure.in:309: -1- AC_SUBST([YACC_LIB]) m4trace:configure.in:309: -1- AC_SUBST_TRACE([YACC_LIB]) m4trace:configure.in:309: -1- m4_pattern_allow([^YACC_LIB$]) m4trace:configure.in:353: -1- AC_CONFIG_FILES([ Makefile \ gsoap.pc gsoap++.pc gsoapck.pc gsoapck++.pc gsoapssl.pc gsoapssl++.pc \ gsoap/Makefile \ gsoap/src/Makefile \ gsoap/wsdl/Makefile \ gsoap/samples/Makefile \ gsoap/samples/autotest/Makefile \ gsoap/samples/calc/Makefile \ gsoap/samples/calc++/Makefile \ gsoap/samples/chaining/Makefile \ gsoap/samples/chaining++/Makefile \ gsoap/samples/databinding/Makefile \ gsoap/samples/dime/Makefile \ gsoap/samples/dom/Makefile \ gsoap/samples/oneway/Makefile \ gsoap/samples/oneway++/Makefile \ gsoap/samples/factory/Makefile \ gsoap/samples/factorytest/Makefile \ gsoap/samples/gmt/Makefile \ gsoap/samples/googleapi/Makefile \ gsoap/samples/hello/Makefile \ gsoap/samples/httpcookies/Makefile \ gsoap/samples/lu/Makefile \ gsoap/samples/magic/Makefile \ gsoap/samples/mashup/Makefile \ gsoap/samples/mashup++/Makefile \ gsoap/samples/mtom/Makefile \ gsoap/samples/mtom-stream/Makefile \ gsoap/samples/polytest/Makefile \ gsoap/samples/primes/Makefile \ gsoap/samples/roll/Makefile \ gsoap/samples/router/Makefile \ gsoap/samples/rss/Makefile \ gsoap/samples/ssl/Makefile \ gsoap/samples/template/Makefile \ gsoap/samples/udp/Makefile \ gsoap/samples/varparam/Makefile \ gsoap/samples/wsa/Makefile \ gsoap/samples/wsrm/Makefile \ gsoap/samples/wsse/Makefile \ gsoap/samples/xml-rpc-json/Makefile gsoap/samples/rest/Makefile ]) m4trace:configure.in:354: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.in:354: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.in:354: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([LTLIBOBJS]) m4trace:configure.in:354: -1- m4_pattern_allow([^LTLIBOBJS$]) m4trace:configure.in:354: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) m4trace:configure.in:354: -1- AC_SUBST([am__EXEEXT_TRUE]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([am__EXEEXT_TRUE]) m4trace:configure.in:354: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) m4trace:configure.in:354: -1- AC_SUBST([am__EXEEXT_FALSE]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([am__EXEEXT_FALSE]) m4trace:configure.in:354: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) m4trace:configure.in:354: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) m4trace:configure.in:354: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([top_builddir]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([top_build_prefix]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([srcdir]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([abs_srcdir]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([top_srcdir]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([abs_top_srcdir]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([builddir]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([abs_builddir]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([abs_top_builddir]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([INSTALL]) m4trace:configure.in:354: -1- AC_SUBST_TRACE([MKDIR_P]) gsoap-2.8.91/autom4te.cache/output.00000644000175000017500000070172313525245157016534 0ustar ellertellert@%:@! /bin/sh @%:@ Guess values for system-dependent variables and create Makefiles. @%:@ Generated by GNU Autoconf 2.69 for gsoap 2.8. @%:@ @%:@ @%:@ Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @%:@ @%:@ @%:@ This configure script is free software; the Free Software Foundation @%:@ gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in @%:@( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIB@&t@OBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='gsoap' PACKAGE_TARNAME='gsoap' PACKAGE_VERSION='2.8' PACKAGE_STRING='gsoap 2.8' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="gsoap/stdsoap2.cpp" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_list= ac_func_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS YACC_LIB BISON_DEFINE LEX_FLAGS LEX_DEFINE SAMPLE_DIRS ENABLE_SAMPLES ENABLE_SAMPLES_FALSE ENABLE_SAMPLES_TRUE WSDL2H_SOAP_CPP_LIB SAMPLE_SSL_LIBS SAMPLE_INCLUDES WSDL2H_EXTRA_LIBS WSDL2H_EXTRA_FLAGS SOAPCPP2_IPV6 SOAPCPP2_NONAMESPACES WSDL2H_IMPORTPATH SOAPCPP2_IMPORTPATH SOAPCPP2_DEBUG DEBUG_COMPILE_FALSE DEBUG_COMPILE_TRUE LIB@&t@OBJS EGREP GREP platform SAMPLE_EXTRA_LIBS LN_S RANLIB CPP YFLAGS YACC LEXLIB LEX_OUTPUT_ROOT LEX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX host_os host_vendor host_cpu host build_os build_vendor build_cpu build AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking enable_debug enable_namespaces enable_ipv6 with_openssl enable_ssl enable_gnutls enable_samples ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS YACC YFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures gsoap 2.8 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX @<:@@S|@ac_default_prefix@:>@ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX @<:@PREFIX@:>@ By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root @<:@DATAROOTDIR/doc/gsoap@:>@ --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of gsoap 2.8:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-debug add debug symbols for debugging --disable-namespaces compile library without namespaces --enable-ipv6 compile library with IPv6 support --disable-ssl build without SSL/TLS --enable-gnutls build with GNUTLS SSL/TLS --enable-samples enable compile for the gsoap samples Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-openssl=DIR openssl installation prefix Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags YACC The `Yet Another Compiler Compiler' implementation to use. Defaults to the first program found out of: `bison -y', `byacc', `yacc'. YFLAGS The list of arguments that will be passed by default to @S|@YACC. This script will default YFLAGS to the empty string to avoid a default value of `-d' given by some make applications. CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF gsoap configure 2.8 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## @%:@ ac_fn_cxx_try_compile LINENO @%:@ ---------------------------- @%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_cxx_try_compile @%:@ ac_fn_c_try_compile LINENO @%:@ -------------------------- @%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_compile @%:@ ac_fn_c_try_link LINENO @%:@ ----------------------- @%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_link @%:@ ac_fn_c_try_cpp LINENO @%:@ ---------------------- @%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_cpp @%:@ ac_fn_c_try_run LINENO @%:@ ---------------------- @%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes @%:@ that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_run @%:@ ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using @%:@ the include files in INCLUDES and setting the cache variable VAR @%:@ accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_header_mongrel @%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists and can be compiled using the include files in @%:@ INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_header_compile @%:@ ac_fn_c_check_type LINENO TYPE VAR INCLUDES @%:@ ------------------------------------------- @%:@ Tests whether TYPE exists after having included INCLUDES, setting cache @%:@ variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_type @%:@ ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES @%:@ ---------------------------------------------------- @%:@ Tries to find if the field MEMBER exists in type AGGR, after including @%:@ INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_member @%:@ ac_fn_c_check_func LINENO FUNC VAR @%:@ ---------------------------------- @%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by gsoap $as_me 2.8, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in @%:@(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi as_fn_append ac_header_list " sys/time.h" as_fn_append ac_header_list " unistd.h" as_fn_append ac_func_list " alarm" # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.14' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in @%:@(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null @%:@ Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='gsoap' VERSION='2.8' cat >>confdefs.h <<_ACEOF @%:@define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # AC_CONFIG_HEADERS([config.h]) ac_config_headers="$ac_config_headers config.h" # we use subdirs. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi # Checks for programs. ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf @%:@ Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $@%:@ != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi for ac_prog in flex lex do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LEX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LEX"; then ac_cv_prog_LEX="$LEX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LEX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LEX=$ac_cv_prog_LEX if test -n "$LEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5 $as_echo "$LEX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$LEX" && break done test -n "$LEX" || LEX=":" if test "x$LEX" != "x:"; then cat >conftest.l <<_ACEOF %% a { ECHO; } b { REJECT; } c { yymore (); } d { yyless (1); } e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */ yyless ((input () != 0)); } f { unput (yytext[0]); } . { BEGIN INITIAL; } %% #ifdef YYTEXT_POINTER extern char *yytext; #endif int main (void) { return ! yylex () + ! yywrap (); } _ACEOF { { ac_try="$LEX conftest.l" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$LEX conftest.l") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex output file root" >&5 $as_echo_n "checking lex output file root... " >&6; } if ${ac_cv_prog_lex_root+:} false; then : $as_echo_n "(cached) " >&6 else if test -f lex.yy.c; then ac_cv_prog_lex_root=lex.yy elif test -f lexyy.c; then ac_cv_prog_lex_root=lexyy else as_fn_error $? "cannot find output from $LEX; giving up" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5 $as_echo "$ac_cv_prog_lex_root" >&6; } LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root if test -z "${LEXLIB+set}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex library" >&5 $as_echo_n "checking lex library... " >&6; } if ${ac_cv_lib_lex+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS=$LIBS ac_cv_lib_lex='none needed' for ac_lib in '' -lfl -ll; do LIBS="$ac_lib $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_lex=$ac_lib fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext test "$ac_cv_lib_lex" != 'none needed' && break done LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5 $as_echo "$ac_cv_lib_lex" >&6; } test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5 $as_echo_n "checking whether yytext is a pointer... " >&6; } if ${ac_cv_prog_lex_yytext_pointer+:} false; then : $as_echo_n "(cached) " >&6 else # POSIX says lex can declare yytext either as a pointer or an array; the # default is implementation-dependent. Figure out which it is, since # not all implementations provide the %pointer and %array declarations. ac_cv_prog_lex_yytext_pointer=no ac_save_LIBS=$LIBS LIBS="$LEXLIB $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define YYTEXT_POINTER 1 `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_prog_lex_yytext_pointer=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5 $as_echo "$ac_cv_prog_lex_yytext_pointer" >&6; } if test $ac_cv_prog_lex_yytext_pointer = yes; then $as_echo "@%:@define YYTEXT_POINTER 1" >>confdefs.h fi rm -f conftest.l $LEX_OUTPUT_ROOT.c fi if test "$LEX" = :; then LEX=${am_missing_run}flex fi for ac_prog in 'bison -y' byacc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_YACC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$YACC"; then ac_cv_prog_YACC="$YACC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_YACC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi YACC=$ac_cv_prog_YACC if test -n "$YACC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 $as_echo "$YACC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$YACC" && break done test -n "$YACC" || YACC="yacc" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@ifdef __STDC__ @%:@ include @%:@else @%:@ include @%:@endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@ifdef __STDC__ @%:@ include @%:@else @%:@ include @%:@endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi #AM_PROG_LIBTOOL { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done # AC_DECL_YYTEXT SAMPLE_EXTRA_LIBS="-lm" # Platform-specific Makefile setup case "${host}" in *-*-solaris*) platform=SUN_OS SAMPLE_EXTRA_LIBS="-lxnet -lsocket -lnsl -lm" WSDL2H_EXTRA_LIBS="-lssl -lcrypto -lz -lsocket -lxnet -lnsl -lrt" ;; *-*-sysv5*) platform=UNIXWARE ;; *-*-UnixWare*) platform=UNIXWARE ;; *-*-unixware*) platform=UNIXWARE ;; *-*-sco3.2v5*) platform=OPENSERVER SAMPLE_EXTRA_LIBS="-lsocket -lm" ;; *-*-linux*) platform=LINUX # if test x$debug = xtrue; then # CFLAGS="-g" #don't want the -O2 for debugging. # else # CFLAGS="-O2" #don't want the -g for release compile. # fi ;; *-*-cygwin*) platform=CYGWIN ;; *-*-mingw*) platform=MINGW SAMPLE_EXTRA_LIBS="-lws2_32 -lkernel32 -luser32 -lgdi32 -lm" WSDL2H_EXTRA_LIBS="-lssl -lcrypto -lws2_32 -lkernel32 -luser32 -lgdi32 -lm" ;; *-*-freebsd*) platform=FREEBSD ;; *-*-openbsd*) platform=OPENBSD ;; *-*-irix*) platform=IRIX ;; *-*-aix*) platform=AIX case "${host}" in *-*-aix4.1*) osver=AIX41;; *-*-aix4.2*) osver=AIX42;; *-*-aix4.3*) osver=AIX43;; *-*-aix4.*) osver=AIX43;; *-*-aix5.2) osver=AIX52;; *-*-aix5.3) osver=AIX53;; *-*-aix6.1) osver=AIX61;; esac ;; *-sequent-*) platform=PTX ;; *-*-hp*) platform=HP_UX ; case "${host}" in *-*-hpux11*) osver=HPUX11;; *-*-hpux10*) osver=HPUX10;; *) osver=HPUX11;; esac ;; *-*-mvs*) platform=OS390 ;; *-*-os400*) platform=OS400 ;; *-*-OS400*) platform=OS400 ;; *-*-osf*) platform=TRU64 ;; *-apple-*) platform=MACOSX # Appease 10.7 Lion (OpenSSL deprecated) CXXFLAGS="-Wno-deprecated-declarations" CFLAGS="-Wno-deprecated-declarations" ;; *-nto-qnx) platform=QNX SAMPLE_EXTRA_LIBS="-lsocket -lm" ;; *) platform=UNKNOWN ;; esac # Checks for header files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in arpa/inet.h xlocale.h errno.h fcntl.h limits.h netdb.h netinet/in.h stdlib.h string.h strings.h stdint.h inttypes.h time.h sys/inttypes.h sys/socket.h sys/types.h sys/time.h sys/timeb.h unistd.h poll.h openssl/ssl.h gnutls/gnutls.h zlib.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "@%:@define const /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF @%:@define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "@%:@define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if ${ac_cv_struct_tm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "@%:@define TM_IN_SYS_TIME 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct tm" "tm_gmtoff" "ac_cv_member_struct_tm_tm_gmtoff" " #include #include " if test "x$ac_cv_member_struct_tm_tm_gmtoff" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRUCT_TM_TM_GMTOFF 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct tm" "__tm_gmtoff" "ac_cv_member_struct_tm___tm_gmtoff" " #include #include " if test "x$ac_cv_member_struct_tm___tm_gmtoff" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRUCT_TM___TM_GMTOFF 1 _ACEOF fi # Checks for library functions. for ac_header in $ac_header_list do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in $ac_func_list do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mktime" >&5 $as_echo_n "checking for working mktime... " >&6; } if ${ac_cv_func_working_mktime+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_working_mktime=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Test program from Paul Eggert and Tony Leneis. */ #ifdef TIME_WITH_SYS_TIME # include # include #else # ifdef HAVE_SYS_TIME_H # include # else # include # endif #endif #include #include #ifdef HAVE_UNISTD_H # include #endif #ifndef HAVE_ALARM # define alarm(X) /* empty */ #endif /* Work around redefinition to rpl_putenv by other config tests. */ #undef putenv static time_t time_t_max; static time_t time_t_min; /* Values we'll use to set the TZ environment variable. */ static const char *tz_strings[] = { (const char *) 0, "TZ=GMT0", "TZ=JST-9", "TZ=EST+3EDT+2,M10.1.0/00:00:00,M2.3.0/00:00:00" }; #define N_STRINGS (sizeof (tz_strings) / sizeof (tz_strings[0])) /* Return 0 if mktime fails to convert a date in the spring-forward gap. Based on a problem report from Andreas Jaeger. */ static int spring_forward_gap () { /* glibc (up to about 1998-10-07) failed this test. */ struct tm tm; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ((char*) "TZ=PST8PDT,M4.1.0,M10.5.0"); tm.tm_year = 98; tm.tm_mon = 3; tm.tm_mday = 5; tm.tm_hour = 2; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; return mktime (&tm) != (time_t) -1; } static int mktime_test1 (time_t now) { struct tm *lt; return ! (lt = localtime (&now)) || mktime (lt) == now; } static int mktime_test (time_t now) { return (mktime_test1 (now) && mktime_test1 ((time_t) (time_t_max - now)) && mktime_test1 ((time_t) (time_t_min + now))); } static int irix_6_4_bug () { /* Based on code from Ariel Faigon. */ struct tm tm; tm.tm_year = 96; tm.tm_mon = 3; tm.tm_mday = 0; tm.tm_hour = 0; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; mktime (&tm); return tm.tm_mon == 2 && tm.tm_mday == 31; } static int bigtime_test (int j) { struct tm tm; time_t now; tm.tm_year = tm.tm_mon = tm.tm_mday = tm.tm_hour = tm.tm_min = tm.tm_sec = j; now = mktime (&tm); if (now != (time_t) -1) { struct tm *lt = localtime (&now); if (! (lt && lt->tm_year == tm.tm_year && lt->tm_mon == tm.tm_mon && lt->tm_mday == tm.tm_mday && lt->tm_hour == tm.tm_hour && lt->tm_min == tm.tm_min && lt->tm_sec == tm.tm_sec && lt->tm_yday == tm.tm_yday && lt->tm_wday == tm.tm_wday && ((lt->tm_isdst < 0 ? -1 : 0 < lt->tm_isdst) == (tm.tm_isdst < 0 ? -1 : 0 < tm.tm_isdst)))) return 0; } return 1; } static int year_2050_test () { /* The correct answer for 2050-02-01 00:00:00 in Pacific time, ignoring leap seconds. */ unsigned long int answer = 2527315200UL; struct tm tm; time_t t; tm.tm_year = 2050 - 1900; tm.tm_mon = 2 - 1; tm.tm_mday = 1; tm.tm_hour = tm.tm_min = tm.tm_sec = 0; tm.tm_isdst = -1; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ((char*) "TZ=PST8PDT,M4.1.0,M10.5.0"); t = mktime (&tm); /* Check that the result is either a failure, or close enough to the correct answer that we can assume the discrepancy is due to leap seconds. */ return (t == (time_t) -1 || (0 < t && answer - 120 <= t && t <= answer + 120)); } int main () { time_t t, delta; int i, j; /* This test makes some buggy mktime implementations loop. Give up after 60 seconds; a mktime slower than that isn't worth using anyway. */ alarm (60); for (;;) { t = (time_t_max << 1) + 1; if (t <= time_t_max) break; time_t_max = t; } time_t_min = - ((time_t) ~ (time_t) 0 == (time_t) -1) - time_t_max; delta = time_t_max / 997; /* a suitable prime number */ for (i = 0; i < N_STRINGS; i++) { if (tz_strings[i]) putenv ((char*) tz_strings[i]); for (t = 0; t <= time_t_max - delta; t += delta) if (! mktime_test (t)) return 1; if (! (mktime_test ((time_t) 1) && mktime_test ((time_t) (60 * 60)) && mktime_test ((time_t) (60 * 60 * 24)))) return 1; for (j = 1; ; j <<= 1) if (! bigtime_test (j)) return 1; else if (INT_MAX / 2 < j) break; if (! bigtime_test (INT_MAX)) return 1; } return ! (irix_6_4_bug () && spring_forward_gap () && year_2050_test ()); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_working_mktime=yes else ac_cv_func_working_mktime=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_working_mktime" >&5 $as_echo "$ac_cv_func_working_mktime" >&6; } if test $ac_cv_func_working_mktime = no; then case " $LIB@&t@OBJS " in *" mktime.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS mktime.$ac_objext" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 $as_echo_n "checking return type of signal handlers... " >&6; } if ${ac_cv_type_signal+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_signal=int else ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 $as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF @%:@define RETSIGTYPE $ac_cv_type_signal _ACEOF for ac_func in strftime do : ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime" if test "x$ac_cv_func_strftime" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRFTIME 1 _ACEOF else # strftime is in -lintl on SCO UNIX. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strftime in -lintl" >&5 $as_echo_n "checking for strftime in -lintl... " >&6; } if ${ac_cv_lib_intl_strftime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char strftime (); int main () { return strftime (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_strftime=yes else ac_cv_lib_intl_strftime=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_strftime" >&5 $as_echo "$ac_cv_lib_intl_strftime" >&6; } if test "x$ac_cv_lib_intl_strftime" = xyes; then : $as_echo "@%:@define HAVE_STRFTIME 1" >>confdefs.h LIBS="-lintl $LIBS" fi fi done for ac_func in random gettimeofday ftime localtime_r timegm gmtime gmtime_r memset select socket snprintf strchr strerror strerror_r strrchr strstr strtol strtoul strtoll strtoull strtold strtod strtof strtold_l strtod_l strtof_l sscanf sscanf_l sprintf_l wctomb mbtowc poll do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # Checks for isnan and isinf ac_fn_c_check_func "$LINENO" "isnan" "ac_cv_func_isnan" if test "x$ac_cv_func_isnan" = xyes; then : has_isnan=1; $as_echo "@%:@define HAVE_ISNAN 1" >>confdefs.h else has_isnan=0 fi ac_fn_c_check_func "$LINENO" "isinf" "ac_cv_func_isinf" if test "x$ac_cv_func_isinf" = xyes; then : has_isinf=1; $as_echo "@%:@define HAVE_ISINF 1" >>confdefs.h else has_isinf=0 fi # check for macro isnan in math if test $has_isnan = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for macro isnan" >&5 $as_echo_n "checking for macro isnan... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { { int foo; foo = isnan(0); } ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : has_isnan=1 else has_isnan=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $has_isnan = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "@%:@define HAVE_ISNAN 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # check for macro isinf in math if test $has_isinf = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for macro isinf" >&5 $as_echo_n "checking for macro isinf... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { { int foo; foo = isinf(0); } ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : has_isinf=1 else has_isinf=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $has_isinf = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "@%:@define HAVE_ISINF 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # Function test depending on platform # AIX Has incompatible gethostbyname_r if test $platform != AIX -a $platform != TRU64; then for ac_func in gethostbyname_r do : ac_fn_c_check_func "$LINENO" "gethostbyname_r" "ac_cv_func_gethostbyname_r" if test "x$ac_cv_func_gethostbyname_r" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_GETHOSTBYNAME_R 1 _ACEOF fi done for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 $as_echo_n "checking for GNU libc compatible malloc... " >&6; } if ${ac_cv_func_malloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_malloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { return ! malloc (0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_malloc_0_nonnull=yes else ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 $as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes; then : $as_echo "@%:@define HAVE_MALLOC 1" >>confdefs.h else $as_echo "@%:@define HAVE_MALLOC 0" >>confdefs.h case " $LIB@&t@OBJS " in *" malloc.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS malloc.$ac_objext" ;; esac $as_echo "@%:@define malloc rpl_malloc" >>confdefs.h fi fi # the debug build options adds symbols to compiler output (-g for g++) @%:@ Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; case "${enableval}" in yes) debug=true ;; no) debug=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;; esac else debug=false fi if test x$debug = xtrue; then DEBUG_COMPILE_TRUE= DEBUG_COMPILE_FALSE='#' else DEBUG_COMPILE_TRUE='#' DEBUG_COMPILE_FALSE= fi if test x$debug = xtrue; then SOAPCPP2_DEBUG="-DDEBUG" ##define DEBUG for debugging else SOAPCPP2_DEBUG= fi # set the default soapcpp2 import path SOAPCPP2_IMPORTPATH="-DSOAPCPP_IMPORT_PATH=\"\\\"${datadir}/gsoap/import\\\"\"" #SOAPCPP2_IMPORTPATH="-DSOAPCPP2_IMPORT_PATH=\"\\\"`pwd`/gsoap/import\\\"\"" # set the default wsdl2h import path WSDL2H_IMPORTPATH="-DWSDL_IMPORT_PATH=\"\\\"${datadir}/gsoap/WS\\\"\"" #WSDL2H_IMPORTPATH="-DWSDL2H_IMPORT_PATH=\"\\\"`pwd`/gsoap/WS\\\"\"" # the disable-namespaces option adds the -DWITH_NONAMESPACES to the # library compilation thus disabling namespaces @%:@ Check whether --enable-namespaces was given. if test "${enable_namespaces+set}" = set; then : enableval=$enable_namespaces; with_namespaces="$enable_ns" else with_namespaces="yes" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for disable namespaces in library" >&5 $as_echo_n "checking for disable namespaces in library... " >&6; } if test "x$with_namespaces" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_NONAMESPACES="-DWITH_NONAMESPACES" ##define to remove nsmap link dependence fi # the enable-ipv6 option adds the -DWITH_IPV6 to the # library compilation thus enabling IPv6 @%:@ Check whether --enable-ipv6 was given. if test "${enable_ipv6+set}" = set; then : enableval=$enable_ipv6; with_ipv6="yes" else with_ipv6="$disable_ipv6" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enable ipv6 in library" >&5 $as_echo_n "checking for enable ipv6 in library... " >&6; } if test "x$with_ipv6" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_IPV6="-DWITH_IPV6 -DWITH_NO_IPV6_V6ONLY" ##define to add IPv6 support else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # the OpenSSL installation prefix path @%:@ Check whether --with-openssl was given. if test "${with_openssl+set}" = set; then : withval=$with_openssl; OPENSSL=$withval fi # the disable-ssl option removes the dependence on OpenSSL @%:@ Check whether --enable-ssl was given. if test "${enable_ssl+set}" = set; then : enableval=$enable_ssl; with_openssl="$enable_openssl" else with_openssl="yes" fi # the enable-gnutls option enables GNUTLS in favor of OpenSSL @%:@ Check whether --enable-gnutls was given. if test "${enable_gnutls+set}" = set; then : enableval=$enable_gnutls; with_gnutls="yes" else with_gnutls="$disable_gnutls" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for disable openssl in library" >&5 $as_echo_n "checking for disable openssl in library... " >&6; } if test "x$with_openssl" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enable gnutls in library" >&5 $as_echo_n "checking for enable gnutls in library... " >&6; } if test "x$with_gnutls" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } WSDL2H_EXTRA_FLAGS="-DWITH_GNUTLS -DWITH_GZIP" WSDL2H_EXTRA_LIBS="-lgnutls -lgcrypt -lgpg-error -lz" SAMPLE_INCLUDES= SAMPLE_SSL_LIBS="-lgnutls -lgcrypt -lgpg-error -lz" WSDL2H_SOAP_CPP_LIB="libgsoapssl++.a" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } WSDL2H_EXTRA_FLAGS="-DWITH_OPENSSL -DWITH_GZIP" # an ugly hack to get httpda and md5evp plugins to conditionally # compile with wsdl2h when OPENSSL is available WSDL2H_EXTRA_LIBS="../plugin/httpda.c ../plugin/md5evp.c -lssl -lcrypto -lz" SAMPLE_INCLUDES= SAMPLE_SSL_LIBS="-lssl -lcrypto -lz" WSDL2H_SOAP_CPP_LIB="libgsoapssl++.a" fi if test -n "$OPENSSL"; then WSDL2H_EXTRA_FLAGS="-I${OPENSSL}/include ${WSDL2H_EXTRA_FLAGS}" WSDL2H_EXTRA_LIBS="-L${OPENSSL}/lib ${WSDL2H_EXTRA_LIBS}" SAMPLE_INCLUDES="-I${OPENSSL}/include" SAMPLE_SSL_LIBS="-L${OPENSSL}/lib ${SAMPLE_SSL_LIBS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } WSDL2H_EXTRA_FLAGS= WSDL2H_EXTRA_LIBS= SAMPLE_SSL_LIBS= SAMPLE_INCLUDES= WSDL2H_SOAP_CPP_LIB="libgsoap++.a" fi # enable the compile of the samples @%:@ Check whether --enable-samples was given. if test "${enable_samples+set}" = set; then : enableval=$enable_samples; case "${enableval}" in yes) samples=true ;; no) samples=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-samples" "$LINENO" 5 ;; esac else samples=false fi if test x$samples = xtrue; then ENABLE_SAMPLES_TRUE= ENABLE_SAMPLES_FALSE='#' else ENABLE_SAMPLES_TRUE='#' ENABLE_SAMPLES_FALSE= fi if test x$samples = xtrue; then SAMPLE_DIRS=". samples" else SAMPLE_DIRS= fi if test x$LEX = xflex; then LEX_DEFINE=-DWITH_FLEX LEX_FLAGS="-l" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No 'flex' command detected on current path: trying existing scanner" >&5 $as_echo "$as_me: WARNING: No 'flex' command detected on current path: trying existing scanner" >&2;} LEX_DEFINE=-DWITH_LEX LEX_FLAGS= fi # check if we must define -DWITH_BISON if test "$YACC" = "bison -y"; then BISON_DEFINE=-DWITH_BISON YACC_LIB= else BISON_DEFINE=-DWITH_YACC YACC_LIB="-ly" fi ac_config_files="$ac_config_files Makefile gsoap.pc gsoap++.pc gsoapck.pc gsoapck++.pc gsoapssl.pc gsoapssl++.pc gsoap/Makefile gsoap/src/Makefile gsoap/wsdl/Makefile gsoap/samples/Makefile gsoap/samples/autotest/Makefile gsoap/samples/calc/Makefile gsoap/samples/calc++/Makefile gsoap/samples/chaining/Makefile gsoap/samples/chaining++/Makefile gsoap/samples/databinding/Makefile gsoap/samples/dime/Makefile gsoap/samples/dom/Makefile gsoap/samples/oneway/Makefile gsoap/samples/oneway++/Makefile gsoap/samples/factory/Makefile gsoap/samples/factorytest/Makefile gsoap/samples/gmt/Makefile gsoap/samples/googleapi/Makefile gsoap/samples/hello/Makefile gsoap/samples/httpcookies/Makefile gsoap/samples/lu/Makefile gsoap/samples/magic/Makefile gsoap/samples/mashup/Makefile gsoap/samples/mashup++/Makefile gsoap/samples/mtom/Makefile gsoap/samples/mtom-stream/Makefile gsoap/samples/polytest/Makefile gsoap/samples/primes/Makefile gsoap/samples/roll/Makefile gsoap/samples/router/Makefile gsoap/samples/rss/Makefile gsoap/samples/ssl/Makefile gsoap/samples/template/Makefile gsoap/samples/udp/Makefile gsoap/samples/varparam/Makefile gsoap/samples/wsa/Makefile gsoap/samples/wsrm/Makefile gsoap/samples/wsse/Makefile gsoap/samples/xml-rpc-json/Makefile gsoap/samples/rest/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIB@&t@OBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DEBUG_COMPILE_TRUE}" && test -z "${DEBUG_COMPILE_FALSE}"; then as_fn_error $? "conditional \"DEBUG_COMPILE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_SAMPLES_TRUE}" && test -z "${ENABLE_SAMPLES_FALSE}"; then as_fn_error $? "conditional \"ENABLE_SAMPLES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by gsoap $as_me 2.8, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ gsoap config.status 2.8 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX @%:@@%:@ Running $as_me. @%:@@%:@ _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "gsoap.pc") CONFIG_FILES="$CONFIG_FILES gsoap.pc" ;; "gsoap++.pc") CONFIG_FILES="$CONFIG_FILES gsoap++.pc" ;; "gsoapck.pc") CONFIG_FILES="$CONFIG_FILES gsoapck.pc" ;; "gsoapck++.pc") CONFIG_FILES="$CONFIG_FILES gsoapck++.pc" ;; "gsoapssl.pc") CONFIG_FILES="$CONFIG_FILES gsoapssl.pc" ;; "gsoapssl++.pc") CONFIG_FILES="$CONFIG_FILES gsoapssl++.pc" ;; "gsoap/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/Makefile" ;; "gsoap/src/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/src/Makefile" ;; "gsoap/wsdl/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/wsdl/Makefile" ;; "gsoap/samples/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/Makefile" ;; "gsoap/samples/autotest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/autotest/Makefile" ;; "gsoap/samples/calc/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/calc/Makefile" ;; "gsoap/samples/calc++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/calc++/Makefile" ;; "gsoap/samples/chaining/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/chaining/Makefile" ;; "gsoap/samples/chaining++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/chaining++/Makefile" ;; "gsoap/samples/databinding/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/databinding/Makefile" ;; "gsoap/samples/dime/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/dime/Makefile" ;; "gsoap/samples/dom/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/dom/Makefile" ;; "gsoap/samples/oneway/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/oneway/Makefile" ;; "gsoap/samples/oneway++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/oneway++/Makefile" ;; "gsoap/samples/factory/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/factory/Makefile" ;; "gsoap/samples/factorytest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/factorytest/Makefile" ;; "gsoap/samples/gmt/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/gmt/Makefile" ;; "gsoap/samples/googleapi/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/googleapi/Makefile" ;; "gsoap/samples/hello/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/hello/Makefile" ;; "gsoap/samples/httpcookies/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/httpcookies/Makefile" ;; "gsoap/samples/lu/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/lu/Makefile" ;; "gsoap/samples/magic/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/magic/Makefile" ;; "gsoap/samples/mashup/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mashup/Makefile" ;; "gsoap/samples/mashup++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mashup++/Makefile" ;; "gsoap/samples/mtom/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mtom/Makefile" ;; "gsoap/samples/mtom-stream/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mtom-stream/Makefile" ;; "gsoap/samples/polytest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/polytest/Makefile" ;; "gsoap/samples/primes/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/primes/Makefile" ;; "gsoap/samples/roll/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/roll/Makefile" ;; "gsoap/samples/router/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/router/Makefile" ;; "gsoap/samples/rss/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/rss/Makefile" ;; "gsoap/samples/ssl/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/ssl/Makefile" ;; "gsoap/samples/template/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/template/Makefile" ;; "gsoap/samples/udp/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/udp/Makefile" ;; "gsoap/samples/varparam/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/varparam/Makefile" ;; "gsoap/samples/wsa/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsa/Makefile" ;; "gsoap/samples/wsrm/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsrm/Makefile" ;; "gsoap/samples/wsse/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsse/Makefile" ;; "gsoap/samples/xml-rpc-json/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/xml-rpc-json/Makefile" ;; "gsoap/samples/rest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/rest/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi gsoap-2.8.91/autom4te.cache/output.10000644000175000017500000070172313525245157016535 0ustar ellertellert@%:@! /bin/sh @%:@ Guess values for system-dependent variables and create Makefiles. @%:@ Generated by GNU Autoconf 2.69 for gsoap 2.8. @%:@ @%:@ @%:@ Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @%:@ @%:@ @%:@ This configure script is free software; the Free Software Foundation @%:@ gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in @%:@( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIB@&t@OBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='gsoap' PACKAGE_TARNAME='gsoap' PACKAGE_VERSION='2.8' PACKAGE_STRING='gsoap 2.8' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="gsoap/stdsoap2.cpp" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_list= ac_func_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS YACC_LIB BISON_DEFINE LEX_FLAGS LEX_DEFINE SAMPLE_DIRS ENABLE_SAMPLES ENABLE_SAMPLES_FALSE ENABLE_SAMPLES_TRUE WSDL2H_SOAP_CPP_LIB SAMPLE_SSL_LIBS SAMPLE_INCLUDES WSDL2H_EXTRA_LIBS WSDL2H_EXTRA_FLAGS SOAPCPP2_IPV6 SOAPCPP2_NONAMESPACES WSDL2H_IMPORTPATH SOAPCPP2_IMPORTPATH SOAPCPP2_DEBUG DEBUG_COMPILE_FALSE DEBUG_COMPILE_TRUE LIB@&t@OBJS EGREP GREP platform SAMPLE_EXTRA_LIBS LN_S RANLIB CPP YFLAGS YACC LEXLIB LEX_OUTPUT_ROOT LEX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX host_os host_vendor host_cpu host build_os build_vendor build_cpu build AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking enable_debug enable_namespaces enable_ipv6 with_openssl enable_ssl enable_gnutls enable_samples ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS YACC YFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures gsoap 2.8 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX @<:@@S|@ac_default_prefix@:>@ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX @<:@PREFIX@:>@ By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root @<:@DATAROOTDIR/doc/gsoap@:>@ --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of gsoap 2.8:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-debug add debug symbols for debugging --disable-namespaces compile library without namespaces --enable-ipv6 compile library with IPv6 support --disable-ssl build without SSL/TLS --enable-gnutls build with GNUTLS SSL/TLS --enable-samples enable compile for the gsoap samples Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-openssl=DIR openssl installation prefix Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags YACC The `Yet Another Compiler Compiler' implementation to use. Defaults to the first program found out of: `bison -y', `byacc', `yacc'. YFLAGS The list of arguments that will be passed by default to @S|@YACC. This script will default YFLAGS to the empty string to avoid a default value of `-d' given by some make applications. CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF gsoap configure 2.8 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## @%:@ ac_fn_cxx_try_compile LINENO @%:@ ---------------------------- @%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_cxx_try_compile @%:@ ac_fn_c_try_compile LINENO @%:@ -------------------------- @%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_compile @%:@ ac_fn_c_try_link LINENO @%:@ ----------------------- @%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_link @%:@ ac_fn_c_try_cpp LINENO @%:@ ---------------------- @%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_cpp @%:@ ac_fn_c_try_run LINENO @%:@ ---------------------- @%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes @%:@ that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_run @%:@ ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using @%:@ the include files in INCLUDES and setting the cache variable VAR @%:@ accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_header_mongrel @%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists and can be compiled using the include files in @%:@ INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_header_compile @%:@ ac_fn_c_check_type LINENO TYPE VAR INCLUDES @%:@ ------------------------------------------- @%:@ Tests whether TYPE exists after having included INCLUDES, setting cache @%:@ variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_type @%:@ ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES @%:@ ---------------------------------------------------- @%:@ Tries to find if the field MEMBER exists in type AGGR, after including @%:@ INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_member @%:@ ac_fn_c_check_func LINENO FUNC VAR @%:@ ---------------------------------- @%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by gsoap $as_me 2.8, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in @%:@(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi as_fn_append ac_header_list " sys/time.h" as_fn_append ac_header_list " unistd.h" as_fn_append ac_func_list " alarm" # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.14' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in @%:@(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null @%:@ Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='gsoap' VERSION='2.8' cat >>confdefs.h <<_ACEOF @%:@define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # AC_CONFIG_HEADERS([config.h]) ac_config_headers="$ac_config_headers config.h" # we use subdirs. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi # Checks for programs. ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf @%:@ Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $@%:@ != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi for ac_prog in flex lex do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LEX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LEX"; then ac_cv_prog_LEX="$LEX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LEX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LEX=$ac_cv_prog_LEX if test -n "$LEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5 $as_echo "$LEX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$LEX" && break done test -n "$LEX" || LEX=":" if test "x$LEX" != "x:"; then cat >conftest.l <<_ACEOF %% a { ECHO; } b { REJECT; } c { yymore (); } d { yyless (1); } e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */ yyless ((input () != 0)); } f { unput (yytext[0]); } . { BEGIN INITIAL; } %% #ifdef YYTEXT_POINTER extern char *yytext; #endif int main (void) { return ! yylex () + ! yywrap (); } _ACEOF { { ac_try="$LEX conftest.l" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$LEX conftest.l") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex output file root" >&5 $as_echo_n "checking lex output file root... " >&6; } if ${ac_cv_prog_lex_root+:} false; then : $as_echo_n "(cached) " >&6 else if test -f lex.yy.c; then ac_cv_prog_lex_root=lex.yy elif test -f lexyy.c; then ac_cv_prog_lex_root=lexyy else as_fn_error $? "cannot find output from $LEX; giving up" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5 $as_echo "$ac_cv_prog_lex_root" >&6; } LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root if test -z "${LEXLIB+set}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex library" >&5 $as_echo_n "checking lex library... " >&6; } if ${ac_cv_lib_lex+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS=$LIBS ac_cv_lib_lex='none needed' for ac_lib in '' -lfl -ll; do LIBS="$ac_lib $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_lex=$ac_lib fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext test "$ac_cv_lib_lex" != 'none needed' && break done LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5 $as_echo "$ac_cv_lib_lex" >&6; } test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5 $as_echo_n "checking whether yytext is a pointer... " >&6; } if ${ac_cv_prog_lex_yytext_pointer+:} false; then : $as_echo_n "(cached) " >&6 else # POSIX says lex can declare yytext either as a pointer or an array; the # default is implementation-dependent. Figure out which it is, since # not all implementations provide the %pointer and %array declarations. ac_cv_prog_lex_yytext_pointer=no ac_save_LIBS=$LIBS LIBS="$LEXLIB $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define YYTEXT_POINTER 1 `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_prog_lex_yytext_pointer=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5 $as_echo "$ac_cv_prog_lex_yytext_pointer" >&6; } if test $ac_cv_prog_lex_yytext_pointer = yes; then $as_echo "@%:@define YYTEXT_POINTER 1" >>confdefs.h fi rm -f conftest.l $LEX_OUTPUT_ROOT.c fi if test "$LEX" = :; then LEX=${am_missing_run}flex fi for ac_prog in 'bison -y' byacc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_YACC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$YACC"; then ac_cv_prog_YACC="$YACC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_YACC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi YACC=$ac_cv_prog_YACC if test -n "$YACC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 $as_echo "$YACC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$YACC" && break done test -n "$YACC" || YACC="yacc" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@ifdef __STDC__ @%:@ include @%:@else @%:@ include @%:@endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@ifdef __STDC__ @%:@ include @%:@else @%:@ include @%:@endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi #AM_PROG_LIBTOOL { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done # AC_DECL_YYTEXT SAMPLE_EXTRA_LIBS="-lm" # Platform-specific Makefile setup case "${host}" in *-*-solaris*) platform=SUN_OS SAMPLE_EXTRA_LIBS="-lxnet -lsocket -lnsl -lm" WSDL2H_EXTRA_LIBS="-lssl -lcrypto -lz -lsocket -lxnet -lnsl -lrt" ;; *-*-sysv5*) platform=UNIXWARE ;; *-*-UnixWare*) platform=UNIXWARE ;; *-*-unixware*) platform=UNIXWARE ;; *-*-sco3.2v5*) platform=OPENSERVER SAMPLE_EXTRA_LIBS="-lsocket -lm" ;; *-*-linux*) platform=LINUX # if test x$debug = xtrue; then # CFLAGS="-g" #don't want the -O2 for debugging. # else # CFLAGS="-O2" #don't want the -g for release compile. # fi ;; *-*-cygwin*) platform=CYGWIN ;; *-*-mingw*) platform=MINGW SAMPLE_EXTRA_LIBS="-lws2_32 -lkernel32 -luser32 -lgdi32 -lm" WSDL2H_EXTRA_LIBS="-lssl -lcrypto -lws2_32 -lkernel32 -luser32 -lgdi32 -lm" ;; *-*-freebsd*) platform=FREEBSD ;; *-*-openbsd*) platform=OPENBSD ;; *-*-irix*) platform=IRIX ;; *-*-aix*) platform=AIX case "${host}" in *-*-aix4.1*) osver=AIX41;; *-*-aix4.2*) osver=AIX42;; *-*-aix4.3*) osver=AIX43;; *-*-aix4.*) osver=AIX43;; *-*-aix5.2) osver=AIX52;; *-*-aix5.3) osver=AIX53;; *-*-aix6.1) osver=AIX61;; esac ;; *-sequent-*) platform=PTX ;; *-*-hp*) platform=HP_UX ; case "${host}" in *-*-hpux11*) osver=HPUX11;; *-*-hpux10*) osver=HPUX10;; *) osver=HPUX11;; esac ;; *-*-mvs*) platform=OS390 ;; *-*-os400*) platform=OS400 ;; *-*-OS400*) platform=OS400 ;; *-*-osf*) platform=TRU64 ;; *-apple-*) platform=MACOSX # Appease 10.7 Lion (OpenSSL deprecated) CXXFLAGS="-Wno-deprecated-declarations" CFLAGS="-Wno-deprecated-declarations" ;; *-nto-qnx) platform=QNX SAMPLE_EXTRA_LIBS="-lsocket -lm" ;; *) platform=UNKNOWN ;; esac # Checks for header files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in arpa/inet.h xlocale.h errno.h fcntl.h limits.h netdb.h netinet/in.h stdlib.h string.h strings.h stdint.h inttypes.h time.h sys/inttypes.h sys/socket.h sys/types.h sys/time.h sys/timeb.h unistd.h poll.h openssl/ssl.h gnutls/gnutls.h zlib.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "@%:@define const /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF @%:@define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "@%:@define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if ${ac_cv_struct_tm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "@%:@define TM_IN_SYS_TIME 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct tm" "tm_gmtoff" "ac_cv_member_struct_tm_tm_gmtoff" " #include #include " if test "x$ac_cv_member_struct_tm_tm_gmtoff" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRUCT_TM_TM_GMTOFF 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct tm" "__tm_gmtoff" "ac_cv_member_struct_tm___tm_gmtoff" " #include #include " if test "x$ac_cv_member_struct_tm___tm_gmtoff" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRUCT_TM___TM_GMTOFF 1 _ACEOF fi # Checks for library functions. for ac_header in $ac_header_list do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in $ac_func_list do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mktime" >&5 $as_echo_n "checking for working mktime... " >&6; } if ${ac_cv_func_working_mktime+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_working_mktime=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Test program from Paul Eggert and Tony Leneis. */ #ifdef TIME_WITH_SYS_TIME # include # include #else # ifdef HAVE_SYS_TIME_H # include # else # include # endif #endif #include #include #ifdef HAVE_UNISTD_H # include #endif #ifndef HAVE_ALARM # define alarm(X) /* empty */ #endif /* Work around redefinition to rpl_putenv by other config tests. */ #undef putenv static time_t time_t_max; static time_t time_t_min; /* Values we'll use to set the TZ environment variable. */ static const char *tz_strings[] = { (const char *) 0, "TZ=GMT0", "TZ=JST-9", "TZ=EST+3EDT+2,M10.1.0/00:00:00,M2.3.0/00:00:00" }; #define N_STRINGS (sizeof (tz_strings) / sizeof (tz_strings[0])) /* Return 0 if mktime fails to convert a date in the spring-forward gap. Based on a problem report from Andreas Jaeger. */ static int spring_forward_gap () { /* glibc (up to about 1998-10-07) failed this test. */ struct tm tm; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ((char*) "TZ=PST8PDT,M4.1.0,M10.5.0"); tm.tm_year = 98; tm.tm_mon = 3; tm.tm_mday = 5; tm.tm_hour = 2; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; return mktime (&tm) != (time_t) -1; } static int mktime_test1 (time_t now) { struct tm *lt; return ! (lt = localtime (&now)) || mktime (lt) == now; } static int mktime_test (time_t now) { return (mktime_test1 (now) && mktime_test1 ((time_t) (time_t_max - now)) && mktime_test1 ((time_t) (time_t_min + now))); } static int irix_6_4_bug () { /* Based on code from Ariel Faigon. */ struct tm tm; tm.tm_year = 96; tm.tm_mon = 3; tm.tm_mday = 0; tm.tm_hour = 0; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; mktime (&tm); return tm.tm_mon == 2 && tm.tm_mday == 31; } static int bigtime_test (int j) { struct tm tm; time_t now; tm.tm_year = tm.tm_mon = tm.tm_mday = tm.tm_hour = tm.tm_min = tm.tm_sec = j; now = mktime (&tm); if (now != (time_t) -1) { struct tm *lt = localtime (&now); if (! (lt && lt->tm_year == tm.tm_year && lt->tm_mon == tm.tm_mon && lt->tm_mday == tm.tm_mday && lt->tm_hour == tm.tm_hour && lt->tm_min == tm.tm_min && lt->tm_sec == tm.tm_sec && lt->tm_yday == tm.tm_yday && lt->tm_wday == tm.tm_wday && ((lt->tm_isdst < 0 ? -1 : 0 < lt->tm_isdst) == (tm.tm_isdst < 0 ? -1 : 0 < tm.tm_isdst)))) return 0; } return 1; } static int year_2050_test () { /* The correct answer for 2050-02-01 00:00:00 in Pacific time, ignoring leap seconds. */ unsigned long int answer = 2527315200UL; struct tm tm; time_t t; tm.tm_year = 2050 - 1900; tm.tm_mon = 2 - 1; tm.tm_mday = 1; tm.tm_hour = tm.tm_min = tm.tm_sec = 0; tm.tm_isdst = -1; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ((char*) "TZ=PST8PDT,M4.1.0,M10.5.0"); t = mktime (&tm); /* Check that the result is either a failure, or close enough to the correct answer that we can assume the discrepancy is due to leap seconds. */ return (t == (time_t) -1 || (0 < t && answer - 120 <= t && t <= answer + 120)); } int main () { time_t t, delta; int i, j; /* This test makes some buggy mktime implementations loop. Give up after 60 seconds; a mktime slower than that isn't worth using anyway. */ alarm (60); for (;;) { t = (time_t_max << 1) + 1; if (t <= time_t_max) break; time_t_max = t; } time_t_min = - ((time_t) ~ (time_t) 0 == (time_t) -1) - time_t_max; delta = time_t_max / 997; /* a suitable prime number */ for (i = 0; i < N_STRINGS; i++) { if (tz_strings[i]) putenv ((char*) tz_strings[i]); for (t = 0; t <= time_t_max - delta; t += delta) if (! mktime_test (t)) return 1; if (! (mktime_test ((time_t) 1) && mktime_test ((time_t) (60 * 60)) && mktime_test ((time_t) (60 * 60 * 24)))) return 1; for (j = 1; ; j <<= 1) if (! bigtime_test (j)) return 1; else if (INT_MAX / 2 < j) break; if (! bigtime_test (INT_MAX)) return 1; } return ! (irix_6_4_bug () && spring_forward_gap () && year_2050_test ()); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_working_mktime=yes else ac_cv_func_working_mktime=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_working_mktime" >&5 $as_echo "$ac_cv_func_working_mktime" >&6; } if test $ac_cv_func_working_mktime = no; then case " $LIB@&t@OBJS " in *" mktime.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS mktime.$ac_objext" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 $as_echo_n "checking return type of signal handlers... " >&6; } if ${ac_cv_type_signal+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_signal=int else ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 $as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF @%:@define RETSIGTYPE $ac_cv_type_signal _ACEOF for ac_func in strftime do : ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime" if test "x$ac_cv_func_strftime" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRFTIME 1 _ACEOF else # strftime is in -lintl on SCO UNIX. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strftime in -lintl" >&5 $as_echo_n "checking for strftime in -lintl... " >&6; } if ${ac_cv_lib_intl_strftime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char strftime (); int main () { return strftime (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_strftime=yes else ac_cv_lib_intl_strftime=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_strftime" >&5 $as_echo "$ac_cv_lib_intl_strftime" >&6; } if test "x$ac_cv_lib_intl_strftime" = xyes; then : $as_echo "@%:@define HAVE_STRFTIME 1" >>confdefs.h LIBS="-lintl $LIBS" fi fi done for ac_func in random gettimeofday ftime localtime_r timegm gmtime gmtime_r memset select socket snprintf strchr strerror strerror_r strrchr strstr strtol strtoul strtoll strtoull strtold strtod strtof strtold_l strtod_l strtof_l sscanf sscanf_l sprintf_l wctomb mbtowc poll do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # Checks for isnan and isinf ac_fn_c_check_func "$LINENO" "isnan" "ac_cv_func_isnan" if test "x$ac_cv_func_isnan" = xyes; then : has_isnan=1; $as_echo "@%:@define HAVE_ISNAN 1" >>confdefs.h else has_isnan=0 fi ac_fn_c_check_func "$LINENO" "isinf" "ac_cv_func_isinf" if test "x$ac_cv_func_isinf" = xyes; then : has_isinf=1; $as_echo "@%:@define HAVE_ISINF 1" >>confdefs.h else has_isinf=0 fi # check for macro isnan in math if test $has_isnan = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for macro isnan" >&5 $as_echo_n "checking for macro isnan... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { { int foo; foo = isnan(0); } ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : has_isnan=1 else has_isnan=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $has_isnan = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "@%:@define HAVE_ISNAN 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # check for macro isinf in math if test $has_isinf = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for macro isinf" >&5 $as_echo_n "checking for macro isinf... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { { int foo; foo = isinf(0); } ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : has_isinf=1 else has_isinf=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $has_isinf = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "@%:@define HAVE_ISINF 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # Function test depending on platform # AIX Has incompatible gethostbyname_r if test $platform != AIX -a $platform != TRU64; then for ac_func in gethostbyname_r do : ac_fn_c_check_func "$LINENO" "gethostbyname_r" "ac_cv_func_gethostbyname_r" if test "x$ac_cv_func_gethostbyname_r" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_GETHOSTBYNAME_R 1 _ACEOF fi done for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 $as_echo_n "checking for GNU libc compatible malloc... " >&6; } if ${ac_cv_func_malloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_malloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { return ! malloc (0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_malloc_0_nonnull=yes else ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 $as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes; then : $as_echo "@%:@define HAVE_MALLOC 1" >>confdefs.h else $as_echo "@%:@define HAVE_MALLOC 0" >>confdefs.h case " $LIB@&t@OBJS " in *" malloc.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS malloc.$ac_objext" ;; esac $as_echo "@%:@define malloc rpl_malloc" >>confdefs.h fi fi # the debug build options adds symbols to compiler output (-g for g++) @%:@ Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; case "${enableval}" in yes) debug=true ;; no) debug=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;; esac else debug=false fi if test x$debug = xtrue; then DEBUG_COMPILE_TRUE= DEBUG_COMPILE_FALSE='#' else DEBUG_COMPILE_TRUE='#' DEBUG_COMPILE_FALSE= fi if test x$debug = xtrue; then SOAPCPP2_DEBUG="-DDEBUG" ##define DEBUG for debugging else SOAPCPP2_DEBUG= fi # set the default soapcpp2 import path SOAPCPP2_IMPORTPATH="-DSOAPCPP_IMPORT_PATH=\"\\\"${datadir}/gsoap/import\\\"\"" #SOAPCPP2_IMPORTPATH="-DSOAPCPP2_IMPORT_PATH=\"\\\"`pwd`/gsoap/import\\\"\"" # set the default wsdl2h import path WSDL2H_IMPORTPATH="-DWSDL_IMPORT_PATH=\"\\\"${datadir}/gsoap/WS\\\"\"" #WSDL2H_IMPORTPATH="-DWSDL2H_IMPORT_PATH=\"\\\"`pwd`/gsoap/WS\\\"\"" # the disable-namespaces option adds the -DWITH_NONAMESPACES to the # library compilation thus disabling namespaces @%:@ Check whether --enable-namespaces was given. if test "${enable_namespaces+set}" = set; then : enableval=$enable_namespaces; with_namespaces="$enable_ns" else with_namespaces="yes" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for disable namespaces in library" >&5 $as_echo_n "checking for disable namespaces in library... " >&6; } if test "x$with_namespaces" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_NONAMESPACES="-DWITH_NONAMESPACES" ##define to remove nsmap link dependence fi # the enable-ipv6 option adds the -DWITH_IPV6 to the # library compilation thus enabling IPv6 @%:@ Check whether --enable-ipv6 was given. if test "${enable_ipv6+set}" = set; then : enableval=$enable_ipv6; with_ipv6="yes" else with_ipv6="$disable_ipv6" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enable ipv6 in library" >&5 $as_echo_n "checking for enable ipv6 in library... " >&6; } if test "x$with_ipv6" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_IPV6="-DWITH_IPV6 -DWITH_NO_IPV6_V6ONLY" ##define to add IPv6 support else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # the OpenSSL installation prefix path @%:@ Check whether --with-openssl was given. if test "${with_openssl+set}" = set; then : withval=$with_openssl; OPENSSL=$withval fi # the disable-ssl option removes the dependence on OpenSSL @%:@ Check whether --enable-ssl was given. if test "${enable_ssl+set}" = set; then : enableval=$enable_ssl; with_openssl="$enable_openssl" else with_openssl="yes" fi # the enable-gnutls option enables GNUTLS in favor of OpenSSL @%:@ Check whether --enable-gnutls was given. if test "${enable_gnutls+set}" = set; then : enableval=$enable_gnutls; with_gnutls="yes" else with_gnutls="$disable_gnutls" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for disable openssl in library" >&5 $as_echo_n "checking for disable openssl in library... " >&6; } if test "x$with_openssl" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enable gnutls in library" >&5 $as_echo_n "checking for enable gnutls in library... " >&6; } if test "x$with_gnutls" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } WSDL2H_EXTRA_FLAGS="-DWITH_GNUTLS -DWITH_GZIP" WSDL2H_EXTRA_LIBS="-lgnutls -lgcrypt -lgpg-error -lz" SAMPLE_INCLUDES= SAMPLE_SSL_LIBS="-lgnutls -lgcrypt -lgpg-error -lz" WSDL2H_SOAP_CPP_LIB="libgsoapssl++.a" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } WSDL2H_EXTRA_FLAGS="-DWITH_OPENSSL -DWITH_GZIP" # an ugly hack to get httpda and md5evp plugins to conditionally # compile with wsdl2h when OPENSSL is available WSDL2H_EXTRA_LIBS="../plugin/httpda.c ../plugin/md5evp.c -lssl -lcrypto -lz" SAMPLE_INCLUDES= SAMPLE_SSL_LIBS="-lssl -lcrypto -lz" WSDL2H_SOAP_CPP_LIB="libgsoapssl++.a" fi if test -n "$OPENSSL"; then WSDL2H_EXTRA_FLAGS="-I${OPENSSL}/include ${WSDL2H_EXTRA_FLAGS}" WSDL2H_EXTRA_LIBS="-L${OPENSSL}/lib ${WSDL2H_EXTRA_LIBS}" SAMPLE_INCLUDES="-I${OPENSSL}/include" SAMPLE_SSL_LIBS="-L${OPENSSL}/lib ${SAMPLE_SSL_LIBS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } WSDL2H_EXTRA_FLAGS= WSDL2H_EXTRA_LIBS= SAMPLE_SSL_LIBS= SAMPLE_INCLUDES= WSDL2H_SOAP_CPP_LIB="libgsoap++.a" fi # enable the compile of the samples @%:@ Check whether --enable-samples was given. if test "${enable_samples+set}" = set; then : enableval=$enable_samples; case "${enableval}" in yes) samples=true ;; no) samples=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-samples" "$LINENO" 5 ;; esac else samples=false fi if test x$samples = xtrue; then ENABLE_SAMPLES_TRUE= ENABLE_SAMPLES_FALSE='#' else ENABLE_SAMPLES_TRUE='#' ENABLE_SAMPLES_FALSE= fi if test x$samples = xtrue; then SAMPLE_DIRS=". samples" else SAMPLE_DIRS= fi if test x$LEX = xflex; then LEX_DEFINE=-DWITH_FLEX LEX_FLAGS="-l" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No 'flex' command detected on current path: trying existing scanner" >&5 $as_echo "$as_me: WARNING: No 'flex' command detected on current path: trying existing scanner" >&2;} LEX_DEFINE=-DWITH_LEX LEX_FLAGS= fi # check if we must define -DWITH_BISON if test "$YACC" = "bison -y"; then BISON_DEFINE=-DWITH_BISON YACC_LIB= else BISON_DEFINE=-DWITH_YACC YACC_LIB="-ly" fi ac_config_files="$ac_config_files Makefile gsoap.pc gsoap++.pc gsoapck.pc gsoapck++.pc gsoapssl.pc gsoapssl++.pc gsoap/Makefile gsoap/src/Makefile gsoap/wsdl/Makefile gsoap/samples/Makefile gsoap/samples/autotest/Makefile gsoap/samples/calc/Makefile gsoap/samples/calc++/Makefile gsoap/samples/chaining/Makefile gsoap/samples/chaining++/Makefile gsoap/samples/databinding/Makefile gsoap/samples/dime/Makefile gsoap/samples/dom/Makefile gsoap/samples/oneway/Makefile gsoap/samples/oneway++/Makefile gsoap/samples/factory/Makefile gsoap/samples/factorytest/Makefile gsoap/samples/gmt/Makefile gsoap/samples/googleapi/Makefile gsoap/samples/hello/Makefile gsoap/samples/httpcookies/Makefile gsoap/samples/lu/Makefile gsoap/samples/magic/Makefile gsoap/samples/mashup/Makefile gsoap/samples/mashup++/Makefile gsoap/samples/mtom/Makefile gsoap/samples/mtom-stream/Makefile gsoap/samples/polytest/Makefile gsoap/samples/primes/Makefile gsoap/samples/roll/Makefile gsoap/samples/router/Makefile gsoap/samples/rss/Makefile gsoap/samples/ssl/Makefile gsoap/samples/template/Makefile gsoap/samples/udp/Makefile gsoap/samples/varparam/Makefile gsoap/samples/wsa/Makefile gsoap/samples/wsrm/Makefile gsoap/samples/wsse/Makefile gsoap/samples/xml-rpc-json/Makefile gsoap/samples/rest/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIB@&t@OBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DEBUG_COMPILE_TRUE}" && test -z "${DEBUG_COMPILE_FALSE}"; then as_fn_error $? "conditional \"DEBUG_COMPILE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_SAMPLES_TRUE}" && test -z "${ENABLE_SAMPLES_FALSE}"; then as_fn_error $? "conditional \"ENABLE_SAMPLES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by gsoap $as_me 2.8, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ gsoap config.status 2.8 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX @%:@@%:@ Running $as_me. @%:@@%:@ _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "gsoap.pc") CONFIG_FILES="$CONFIG_FILES gsoap.pc" ;; "gsoap++.pc") CONFIG_FILES="$CONFIG_FILES gsoap++.pc" ;; "gsoapck.pc") CONFIG_FILES="$CONFIG_FILES gsoapck.pc" ;; "gsoapck++.pc") CONFIG_FILES="$CONFIG_FILES gsoapck++.pc" ;; "gsoapssl.pc") CONFIG_FILES="$CONFIG_FILES gsoapssl.pc" ;; "gsoapssl++.pc") CONFIG_FILES="$CONFIG_FILES gsoapssl++.pc" ;; "gsoap/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/Makefile" ;; "gsoap/src/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/src/Makefile" ;; "gsoap/wsdl/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/wsdl/Makefile" ;; "gsoap/samples/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/Makefile" ;; "gsoap/samples/autotest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/autotest/Makefile" ;; "gsoap/samples/calc/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/calc/Makefile" ;; "gsoap/samples/calc++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/calc++/Makefile" ;; "gsoap/samples/chaining/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/chaining/Makefile" ;; "gsoap/samples/chaining++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/chaining++/Makefile" ;; "gsoap/samples/databinding/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/databinding/Makefile" ;; "gsoap/samples/dime/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/dime/Makefile" ;; "gsoap/samples/dom/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/dom/Makefile" ;; "gsoap/samples/oneway/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/oneway/Makefile" ;; "gsoap/samples/oneway++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/oneway++/Makefile" ;; "gsoap/samples/factory/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/factory/Makefile" ;; "gsoap/samples/factorytest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/factorytest/Makefile" ;; "gsoap/samples/gmt/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/gmt/Makefile" ;; "gsoap/samples/googleapi/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/googleapi/Makefile" ;; "gsoap/samples/hello/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/hello/Makefile" ;; "gsoap/samples/httpcookies/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/httpcookies/Makefile" ;; "gsoap/samples/lu/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/lu/Makefile" ;; "gsoap/samples/magic/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/magic/Makefile" ;; "gsoap/samples/mashup/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mashup/Makefile" ;; "gsoap/samples/mashup++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mashup++/Makefile" ;; "gsoap/samples/mtom/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mtom/Makefile" ;; "gsoap/samples/mtom-stream/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mtom-stream/Makefile" ;; "gsoap/samples/polytest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/polytest/Makefile" ;; "gsoap/samples/primes/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/primes/Makefile" ;; "gsoap/samples/roll/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/roll/Makefile" ;; "gsoap/samples/router/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/router/Makefile" ;; "gsoap/samples/rss/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/rss/Makefile" ;; "gsoap/samples/ssl/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/ssl/Makefile" ;; "gsoap/samples/template/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/template/Makefile" ;; "gsoap/samples/udp/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/udp/Makefile" ;; "gsoap/samples/varparam/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/varparam/Makefile" ;; "gsoap/samples/wsa/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsa/Makefile" ;; "gsoap/samples/wsrm/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsrm/Makefile" ;; "gsoap/samples/wsse/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsse/Makefile" ;; "gsoap/samples/xml-rpc-json/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/xml-rpc-json/Makefile" ;; "gsoap/samples/rest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/rest/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi gsoap-2.8.91/autom4te.cache/traces.60000644000175000017500000014331313525245157016456 0ustar ellertellertm4trace:/opt/local/share/aclocal-1.16/amversion.m4:20: -1- AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.16' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.16.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) m4trace:/opt/local/share/aclocal-1.16/amversion.m4:37: -1- AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.16.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) m4trace:/opt/local/share/aclocal-1.16/auxdir.m4:51: -1- AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) m4trace:/opt/local/share/aclocal-1.16/cond.m4:32: -1- AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) m4trace:/opt/local/share/aclocal-1.16/depend.m4:156: -1- AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) m4trace:/opt/local/share/aclocal-1.16/depend.m4:166: -1- AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) m4trace:/opt/local/share/aclocal-1.16/depend.m4:189: -1- AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) m4trace:/opt/local/share/aclocal-1.16/depout.m4:52: -1- AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. AS_CASE([$CONFIG_FILES], [*\'*], [eval set x "$CONFIG_FILES"], [*], [set x $CONFIG_FILES]) shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`AS_DIRNAME(["$am_mf"])` am_filepart=`AS_BASENAME(["$am_mf"])` AM_RUN_LOG([cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles]) || am_rc=$? done if test $am_rc -ne 0; then AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments for automatic dependency tracking. Try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking).]) fi AS_UNSET([am_dirpart]) AS_UNSET([am_filepart]) AS_UNSET([am_mf]) AS_UNSET([am_rc]) rm -f conftest-deps.mk } ]) m4trace:/opt/local/share/aclocal-1.16/depout.m4:65: -1- AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])]) m4trace:/opt/local/share/aclocal-1.16/init.m4:171: -1- AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) m4trace:/opt/local/share/aclocal-1.16/init.m4:198: -1- AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) m4trace:/opt/local/share/aclocal-1.16/install-sh.m4:21: -1- AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) m4trace:/opt/local/share/aclocal-1.16/lead-dot.m4:19: -1- AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) m4trace:/opt/local/share/aclocal-1.16/lex.m4:19: -1- AC_DEFUN([AM_PROG_LEX], [AC_PREREQ([2.50])dnl AC_REQUIRE([AM_MISSING_HAS_RUN])dnl AC_REQUIRE([AC_PROG_LEX])dnl if test "$LEX" = :; then LEX=${am_missing_run}flex fi]) m4trace:/opt/local/share/aclocal-1.16/make.m4:41: -1- AC_DEFUN([AM_MAKE_INCLUDE], [AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) AS_CASE([$?:`cat confinc.out 2>/dev/null`], ['0:this is the am__doit target'], [AS_CASE([$s], [BSD], [am__include='.include' am__quote='"'], [am__include='include' am__quote=''])]) if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* AC_MSG_RESULT([${_am_result}]) AC_SUBST([am__include])]) m4trace:/opt/local/share/aclocal-1.16/make.m4:42: -1- m4_pattern_allow([^am__quote$]) m4trace:/opt/local/share/aclocal-1.16/missing.m4:14: -1- AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) m4trace:/opt/local/share/aclocal-1.16/missing.m4:38: -1- AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) m4trace:/opt/local/share/aclocal-1.16/obsolete.m4:15: -1- AC_DEFUN([AM_CONFIG_HEADER], [AC_DIAGNOSE([obsolete], ['$0': this macro is obsolete. You should use the 'AC][_CONFIG_HEADERS' macro instead.])dnl AC_CONFIG_HEADERS($@)]) m4trace:/opt/local/share/aclocal-1.16/obsolete.m4:24: -1- AC_DEFUN([AM_PROG_CC_STDC], [AC_PROG_CC am_cv_prog_cc_stdc=$ac_cv_prog_cc_stdc AC_DIAGNOSE([obsolete], ['$0': this macro is obsolete. You should simply use the 'AC][_PROG_CC' macro instead. Also, your code should no longer depend upon 'am_cv_prog_cc_stdc', but upon 'ac_cv_prog_cc_stdc'.])]) m4trace:/opt/local/share/aclocal-1.16/obsolete.m4:27: -1- AC_DEFUN([AM_C_PROTOTYPES], [AC_FATAL([automatic de-ANSI-fication support has been removed])]) m4trace:/opt/local/share/aclocal-1.16/obsolete.m4:28: -1- AU_DEFUN([fp_C_PROTOTYPES], [AM_C_PROTOTYPES]) m4trace:/opt/local/share/aclocal-1.16/obsolete.m4:28: -1- AC_DEFUN([fp_C_PROTOTYPES], [AC_DIAGNOSE([obsolete], [The macro `fp_C_PROTOTYPES' is obsolete. You should run autoupdate.])dnl AM_C_PROTOTYPES]) m4trace:/opt/local/share/aclocal-1.16/options.m4:12: -1- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) m4trace:/opt/local/share/aclocal-1.16/options.m4:18: -1- AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) m4trace:/opt/local/share/aclocal-1.16/options.m4:24: -1- AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) m4trace:/opt/local/share/aclocal-1.16/options.m4:30: -1- AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) m4trace:/opt/local/share/aclocal-1.16/prog-cc-c-o.m4:44: -1- AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) m4trace:/opt/local/share/aclocal-1.16/prog-cc-c-o.m4:47: -1- AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) m4trace:/opt/local/share/aclocal-1.16/runlog.m4:17: -1- AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) m4trace:/opt/local/share/aclocal-1.16/sanity.m4:82: -1- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) m4trace:/opt/local/share/aclocal-1.16/silent.m4:60: -1- AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) m4trace:/opt/local/share/aclocal-1.16/strip.m4:28: -1- AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) m4trace:/opt/local/share/aclocal-1.16/substnot.m4:12: -1- AC_DEFUN([_AM_SUBST_NOTMAKE]) m4trace:/opt/local/share/aclocal-1.16/substnot.m4:17: -1- AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) m4trace:/opt/local/share/aclocal-1.16/tar.m4:132: -1- AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^_?A[CHUM]_]) m4trace:configure.ac:2: -1- m4_pattern_forbid([_AC_]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) m4trace:configure.ac:2: -1- m4_pattern_allow([^AS_FLAGS$]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^_?m4_]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^dnl$]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^_?AS_]) m4trace:configure.ac:2: -1- m4_pattern_allow([^SHELL$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PATH_SEPARATOR$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^exec_prefix$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^prefix$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^program_transform_name$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^bindir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^sbindir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^libexecdir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^datarootdir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^datadir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^sysconfdir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^sharedstatedir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^localstatedir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^includedir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^oldincludedir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^docdir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^infodir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^htmldir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^dvidir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^pdfdir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^psdir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^libdir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^localedir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^mandir$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^DEFS$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^ECHO_C$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^ECHO_N$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^ECHO_T$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^build_alias$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^host_alias$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^target_alias$]) m4trace:configure.ac:3: -1- AM_INIT_AUTOMAKE([foreign]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) m4trace:configure.ac:3: -1- AM_SET_CURRENT_AUTOMAKE_VERSION m4trace:configure.ac:3: -1- AM_AUTOMAKE_VERSION([1.16.1]) m4trace:configure.ac:3: -1- _AM_AUTOCONF_VERSION([2.69]) m4trace:configure.ac:3: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^INSTALL_DATA$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^am__isrc$]) m4trace:configure.ac:3: -1- _AM_SUBST_NOTMAKE([am__isrc]) m4trace:configure.ac:3: -1- m4_pattern_allow([^CYGPATH_W$]) m4trace:configure.ac:3: -1- _AM_SET_OPTIONS([foreign]) m4trace:configure.ac:3: -1- _AM_SET_OPTION([foreign]) m4trace:configure.ac:3: -2- _AM_MANGLE_OPTION([foreign]) m4trace:configure.ac:3: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.ac:3: -1- _AM_IF_OPTION([no-define], [], [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])]) m4trace:configure.ac:3: -2- _AM_MANGLE_OPTION([no-define]) m4trace:configure.ac:3: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.ac:3: -1- AM_SANITY_CHECK m4trace:configure.ac:3: -1- AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) m4trace:configure.ac:3: -1- AM_MISSING_HAS_RUN m4trace:configure.ac:3: -1- AM_AUX_DIR_EXPAND m4trace:configure.ac:3: -1- m4_pattern_allow([^ACLOCAL$]) m4trace:configure.ac:3: -1- AM_MISSING_PROG([AUTOCONF], [autoconf]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AUTOCONF$]) m4trace:configure.ac:3: -1- AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AUTOMAKE$]) m4trace:configure.ac:3: -1- AM_MISSING_PROG([AUTOHEADER], [autoheader]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AUTOHEADER$]) m4trace:configure.ac:3: -1- AM_MISSING_PROG([MAKEINFO], [makeinfo]) m4trace:configure.ac:3: -1- m4_pattern_allow([^MAKEINFO$]) m4trace:configure.ac:3: -1- AM_PROG_INSTALL_SH m4trace:configure.ac:3: -1- m4_pattern_allow([^install_sh$]) m4trace:configure.ac:3: -1- AM_PROG_INSTALL_STRIP m4trace:configure.ac:3: -1- m4_pattern_allow([^STRIP$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^MKDIR_P$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^mkdir_p$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AWK$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^SET_MAKE$]) m4trace:configure.ac:3: -1- AM_SET_LEADING_DOT m4trace:configure.ac:3: -1- m4_pattern_allow([^am__leading_dot$]) m4trace:configure.ac:3: -1- _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) m4trace:configure.ac:3: -2- _AM_MANGLE_OPTION([tar-ustar]) m4trace:configure.ac:3: -1- _AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])]) m4trace:configure.ac:3: -2- _AM_MANGLE_OPTION([tar-pax]) m4trace:configure.ac:3: -1- _AM_PROG_TAR([v7]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AMTAR$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^am__tar$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^am__untar$]) m4trace:configure.ac:3: -1- _AM_IF_OPTION([no-dependencies], [], [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) m4trace:configure.ac:3: -2- _AM_MANGLE_OPTION([no-dependencies]) m4trace:configure.ac:3: -1- AM_SILENT_RULES m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_V$]) m4trace:configure.ac:3: -1- AM_SUBST_NOTMAKE([AM_V]) m4trace:configure.ac:3: -1- _AM_SUBST_NOTMAKE([AM_V]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_DEFAULT_V$]) m4trace:configure.ac:3: -1- AM_SUBST_NOTMAKE([AM_DEFAULT_V]) m4trace:configure.ac:3: -1- _AM_SUBST_NOTMAKE([AM_DEFAULT_V]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_DEFAULT_VERBOSITY$]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_BACKSLASH$]) m4trace:configure.ac:3: -1- _AM_SUBST_NOTMAKE([AM_BACKSLASH]) m4trace:configure.ac:5: -1- m4_pattern_allow([^build$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^build_cpu$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^build_vendor$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^build_os$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^host$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^host_cpu$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^host_vendor$]) m4trace:configure.ac:5: -1- m4_pattern_allow([^host_os$]) m4trace:configure.ac:8: -1- AM_CONFIG_HEADER([config.h]) m4trace:configure.ac:8: -1- _m4_warn([obsolete], ['AM_CONFIG_HEADER': this macro is obsolete. You should use the 'AC_CONFIG_HEADERS' macro instead.], [/opt/local/share/aclocal-1.16/obsolete.m4:15: AM_CONFIG_HEADER is expanded from... configure.ac:8: the top level]) m4trace:configure.ac:11: -1- m4_pattern_allow([^SET_MAKE$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CXX$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CXXFLAGS$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CXX$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^ac_ct_CXX$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^EXEEXT$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^OBJEXT$]) m4trace:configure.ac:13: -1- _AM_DEPENDENCIES([CXX]) m4trace:configure.ac:13: -1- AM_SET_DEPDIR m4trace:configure.ac:13: -1- m4_pattern_allow([^DEPDIR$]) m4trace:configure.ac:13: -1- AM_OUTPUT_DEPENDENCY_COMMANDS m4trace:configure.ac:13: -1- AM_MAKE_INCLUDE m4trace:configure.ac:13: -1- AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__include$]) m4trace:configure.ac:13: -1- AM_DEP_TRACK m4trace:configure.ac:13: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) m4trace:configure.ac:13: -1- m4_pattern_allow([^AMDEP_TRUE$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^AMDEP_FALSE$]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE]) m4trace:configure.ac:13: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__nodep$]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([am__nodep]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CXXDEPMODE$]) m4trace:configure.ac:13: -1- AM_CONDITIONAL([am__fastdepCXX], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CFLAGS$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^ac_ct_CC$]) m4trace:configure.ac:14: -1- _AM_PROG_CC_C_O m4trace:configure.ac:14: -1- AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) m4trace:configure.ac:14: -1- _AM_DEPENDENCIES([CC]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CCDEPMODE$]) m4trace:configure.ac:14: -1- AM_CONDITIONAL([am__fastdepCC], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) m4trace:configure.ac:14: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) m4trace:configure.ac:14: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE]) m4trace:configure.ac:14: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE]) m4trace:configure.ac:15: -1- AM_PROG_CC_C_O m4trace:configure.ac:16: -1- AM_PROG_LEX m4trace:configure.ac:16: -1- m4_pattern_allow([^LEX$]) m4trace:configure.ac:16: -1- m4_pattern_allow([^LEX_OUTPUT_ROOT$]) m4trace:configure.ac:16: -1- m4_pattern_allow([^LEXLIB$]) m4trace:configure.ac:16: -1- m4_pattern_allow([^YYTEXT_POINTER$]) m4trace:configure.ac:17: -1- m4_pattern_allow([^YACC$]) m4trace:configure.ac:17: -1- m4_pattern_allow([^YACC$]) m4trace:configure.ac:17: -1- m4_pattern_allow([^YFLAGS$]) m4trace:configure.ac:18: -1- m4_pattern_allow([^CPP$]) m4trace:configure.ac:18: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:18: -1- m4_pattern_allow([^CPP$]) m4trace:configure.ac:19: -1- m4_pattern_allow([^RANLIB$]) m4trace:configure.ac:21: -1- m4_pattern_allow([^LN_S$]) m4trace:configure.ac:22: -1- m4_pattern_allow([^AWK$]) m4trace:configure.ac:25: -1- m4_pattern_allow([^AR$]) m4trace:configure.ac:96: -1- m4_pattern_allow([^SAMPLE_EXTRA_LIBS$]) m4trace:configure.ac:97: -1- m4_pattern_allow([^platform$]) m4trace:configure.ac:100: -1- m4_pattern_allow([^GREP$]) m4trace:configure.ac:100: -1- m4_pattern_allow([^EGREP$]) m4trace:configure.ac:100: -1- m4_pattern_allow([^STDC_HEADERS$]) m4trace:configure.ac:109: -1- m4_pattern_allow([^HAVE_SOCKLEN_T$]) m4trace:configure.ac:112: -1- m4_pattern_allow([^const$]) m4trace:configure.ac:113: -1- m4_pattern_allow([^size_t$]) m4trace:configure.ac:114: -1- m4_pattern_allow([^TIME_WITH_SYS_TIME$]) m4trace:configure.ac:115: -1- m4_pattern_allow([^TM_IN_SYS_TIME$]) m4trace:configure.ac:120: -1- m4_pattern_allow([^HAVE_STRUCT_TM_TM_GMTOFF$]) m4trace:configure.ac:120: -1- m4_pattern_allow([^HAVE_STRUCT_TM___TM_GMTOFF$]) m4trace:configure.ac:123: -1- AC_DEFUN([_AC_Header_sys_time_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_list], [" sys/time.h"])]) _AC_HEADERS_EXPANSION]) m4trace:configure.ac:123: -1- AC_DEFUN([_AC_Header_unistd_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_list], [" unistd.h"])]) _AC_HEADERS_EXPANSION]) m4trace:configure.ac:123: -1- AC_DEFUN([_AC_Func_alarm], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_func_list], [" alarm"])]) _AC_FUNCS_EXPANSION]) m4trace:configure.ac:123: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:124: -1- _m4_warn([obsolete], [The macro `AC_TYPE_SIGNAL' is obsolete. You should run autoupdate.], [../../lib/autoconf/types.m4:759: AC_TYPE_SIGNAL is expanded from... configure.ac:124: the top level]) m4trace:configure.ac:124: -1- m4_pattern_allow([^RETSIGTYPE$]) m4trace:configure.ac:125: -1- m4_pattern_allow([^HAVE_STRFTIME$]) m4trace:configure.ac:125: -1- m4_pattern_allow([^HAVE_STRFTIME$]) m4trace:configure.ac:129: -1- m4_pattern_allow([^HAVE_ISNAN$]) m4trace:configure.ac:130: -1- m4_pattern_allow([^HAVE_ISINF$]) m4trace:configure.ac:138: -1- m4_pattern_allow([^HAVE_ISNAN$]) m4trace:configure.ac:150: -1- m4_pattern_allow([^HAVE_ISINF$]) m4trace:configure.ac:159: -1- m4_pattern_allow([^HAVE_GETHOSTBYNAME_R$]) m4trace:configure.ac:160: -1- m4_pattern_allow([^HAVE_STDLIB_H$]) m4trace:configure.ac:160: -1- m4_pattern_allow([^HAVE_MALLOC$]) m4trace:configure.ac:160: -1- m4_pattern_allow([^HAVE_MALLOC$]) m4trace:configure.ac:160: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:160: -1- m4_pattern_allow([^malloc$]) m4trace:configure.ac:171: -1- AM_CONDITIONAL([DEBUG_COMPILE], [test x$debug = xtrue]) m4trace:configure.ac:171: -1- m4_pattern_allow([^DEBUG_COMPILE_TRUE$]) m4trace:configure.ac:171: -1- m4_pattern_allow([^DEBUG_COMPILE_FALSE$]) m4trace:configure.ac:171: -1- _AM_SUBST_NOTMAKE([DEBUG_COMPILE_TRUE]) m4trace:configure.ac:171: -1- _AM_SUBST_NOTMAKE([DEBUG_COMPILE_FALSE]) m4trace:configure.ac:177: -1- m4_pattern_allow([^SOAPCPP2_DEBUG$]) m4trace:configure.ac:182: -1- m4_pattern_allow([^SOAPCPP2_IMPORTPATH$]) m4trace:configure.ac:187: -1- m4_pattern_allow([^WSDL2H_IMPORTPATH$]) m4trace:configure.ac:195: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:195: the top level]) m4trace:configure.ac:204: -1- m4_pattern_allow([^SOAPCPP2_NONAMESPACES$]) m4trace:configure.ac:212: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:212: the top level]) m4trace:configure.ac:221: -1- m4_pattern_allow([^SOAPCPP2_INCLUDE_XLOCALE$]) m4trace:configure.ac:229: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:229: the top level]) m4trace:configure.ac:238: -1- m4_pattern_allow([^SOAPCPP2_NO_C_LOCALE$]) m4trace:configure.ac:246: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:246: the top level]) m4trace:configure.ac:255: -1- m4_pattern_allow([^SOAPCPP2_IPV6$]) m4trace:configure.ac:263: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:263: the top level]) m4trace:configure.ac:272: -1- m4_pattern_allow([^SOAPCPP2_IPV6_V6ONLY$]) m4trace:configure.ac:291: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:291: the top level]) m4trace:configure.ac:298: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:298: the top level]) m4trace:configure.ac:339: -1- AM_CONDITIONAL([WITH_OPENSSL], [test "x$with_openssl" = "xyes" -a "x$with_gnutls" != "xyes"]) m4trace:configure.ac:339: -1- m4_pattern_allow([^WITH_OPENSSL_TRUE$]) m4trace:configure.ac:339: -1- m4_pattern_allow([^WITH_OPENSSL_FALSE$]) m4trace:configure.ac:339: -1- _AM_SUBST_NOTMAKE([WITH_OPENSSL_TRUE]) m4trace:configure.ac:339: -1- _AM_SUBST_NOTMAKE([WITH_OPENSSL_FALSE]) m4trace:configure.ac:340: -1- m4_pattern_allow([^WITH_OPENSSL$]) m4trace:configure.ac:341: -1- m4_pattern_allow([^WSDL2H_EXTRA_FLAGS$]) m4trace:configure.ac:342: -1- m4_pattern_allow([^WSDL2H_EXTRA_LIBS$]) m4trace:configure.ac:343: -1- m4_pattern_allow([^SAMPLE_INCLUDES$]) m4trace:configure.ac:344: -1- m4_pattern_allow([^SAMPLE_SSL_LIBS$]) m4trace:configure.ac:345: -1- m4_pattern_allow([^WSDL2H_SOAP_CPP_LIB$]) m4trace:configure.ac:355: -1- AM_CONDITIONAL([ENABLE_SAMPLES], [test x$samples = xtrue]) m4trace:configure.ac:355: -1- m4_pattern_allow([^ENABLE_SAMPLES_TRUE$]) m4trace:configure.ac:355: -1- m4_pattern_allow([^ENABLE_SAMPLES_FALSE$]) m4trace:configure.ac:355: -1- _AM_SUBST_NOTMAKE([ENABLE_SAMPLES_TRUE]) m4trace:configure.ac:355: -1- _AM_SUBST_NOTMAKE([ENABLE_SAMPLES_FALSE]) m4trace:configure.ac:356: -1- m4_pattern_allow([^ENABLE_SAMPLES$]) m4trace:configure.ac:363: -1- m4_pattern_allow([^SAMPLE_DIRS$]) m4trace:configure.ac:373: -1- m4_pattern_allow([^LEX_DEFINE$]) m4trace:configure.ac:374: -1- m4_pattern_allow([^LEX_FLAGS$]) m4trace:configure.ac:375: -1- m4_pattern_allow([^LEXLIB$]) m4trace:configure.ac:385: -1- m4_pattern_allow([^BISON_DEFINE$]) m4trace:configure.ac:386: -1- m4_pattern_allow([^YACC_LIB$]) m4trace:configure.ac:436: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:436: -1- m4_pattern_allow([^LTLIBOBJS$]) m4trace:configure.ac:436: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) m4trace:configure.ac:436: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) m4trace:configure.ac:436: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) m4trace:configure.ac:436: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) m4trace:configure.ac:436: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) m4trace:configure.ac:436: -1- _AC_AM_CONFIG_HEADER_HOOK(["$ac_file"]) m4trace:configure.ac:436: -1- _AM_OUTPUT_DEPENDENCY_COMMANDS m4trace:configure.ac:436: -1- AM_RUN_LOG([cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles]) gsoap-2.8.91/autom4te.cache/traces.00000644000175000017500000013772313525245157016460 0ustar ellertellertm4trace:/usr/local/share/aclocal-1.14/amversion.m4:20: -1- AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.14' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.14], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) m4trace:/usr/local/share/aclocal-1.14/amversion.m4:37: -1- AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.14])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) m4trace:/usr/local/share/aclocal-1.14/auxdir.m4:52: -1- AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) m4trace:/usr/local/share/aclocal-1.14/cond.m4:32: -1- AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) m4trace:/usr/local/share/aclocal-1.14/depend.m4:156: -1- AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) m4trace:/usr/local/share/aclocal-1.14/depend.m4:166: -1- AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) m4trace:/usr/local/share/aclocal-1.14/depend.m4:189: -1- AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) m4trace:/usr/local/share/aclocal-1.14/depout.m4:61: -1- AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ]) m4trace:/usr/local/share/aclocal-1.14/depout.m4:75: -1- AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) m4trace:/usr/local/share/aclocal-1.14/init.m4:167: -1- AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi]) m4trace:/usr/local/share/aclocal-1.14/init.m4:194: -1- AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) m4trace:/usr/local/share/aclocal-1.14/install-sh.m4:21: -1- AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) m4trace:/usr/local/share/aclocal-1.14/lead-dot.m4:19: -1- AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) m4trace:/usr/local/share/aclocal-1.14/lex.m4:19: -1- AC_DEFUN([AM_PROG_LEX], [AC_PREREQ([2.50])dnl AC_REQUIRE([AM_MISSING_HAS_RUN])dnl AC_REQUIRE([AC_PROG_LEX])dnl if test "$LEX" = :; then LEX=${am_missing_run}flex fi]) m4trace:/usr/local/share/aclocal-1.14/make.m4:49: -1- AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) m4trace:/usr/local/share/aclocal-1.14/missing.m4:14: -1- AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) m4trace:/usr/local/share/aclocal-1.14/missing.m4:38: -1- AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) m4trace:/usr/local/share/aclocal-1.14/obsolete.m4:15: -1- AC_DEFUN([AM_CONFIG_HEADER], [AC_DIAGNOSE([obsolete], ['$0': this macro is obsolete. You should use the 'AC][_CONFIG_HEADERS' macro instead.])dnl AC_CONFIG_HEADERS($@)]) m4trace:/usr/local/share/aclocal-1.14/obsolete.m4:24: -1- AC_DEFUN([AM_PROG_CC_STDC], [AC_PROG_CC am_cv_prog_cc_stdc=$ac_cv_prog_cc_stdc AC_DIAGNOSE([obsolete], ['$0': this macro is obsolete. You should simply use the 'AC][_PROG_CC' macro instead. Also, your code should no longer depend upon 'am_cv_prog_cc_stdc', but upon 'ac_cv_prog_cc_stdc'.])]) m4trace:/usr/local/share/aclocal-1.14/obsolete.m4:27: -1- AC_DEFUN([AM_C_PROTOTYPES], [AC_FATAL([automatic de-ANSI-fication support has been removed])]) m4trace:/usr/local/share/aclocal-1.14/obsolete.m4:28: -1- AU_DEFUN([fp_C_PROTOTYPES], [AM_C_PROTOTYPES]) m4trace:/usr/local/share/aclocal-1.14/obsolete.m4:28: -1- AC_DEFUN([fp_C_PROTOTYPES], [AC_DIAGNOSE([obsolete], [The macro `fp_C_PROTOTYPES' is obsolete. You should run autoupdate.])dnl AM_C_PROTOTYPES]) m4trace:/usr/local/share/aclocal-1.14/options.m4:12: -1- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) m4trace:/usr/local/share/aclocal-1.14/options.m4:18: -1- AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) m4trace:/usr/local/share/aclocal-1.14/options.m4:24: -1- AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) m4trace:/usr/local/share/aclocal-1.14/options.m4:30: -1- AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) m4trace:/usr/local/share/aclocal-1.14/prog-cc-c-o.m4:44: -1- AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) m4trace:/usr/local/share/aclocal-1.14/prog-cc-c-o.m4:47: -1- AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) m4trace:/usr/local/share/aclocal-1.14/runlog.m4:17: -1- AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) m4trace:/usr/local/share/aclocal-1.14/sanity.m4:82: -1- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) m4trace:/usr/local/share/aclocal-1.14/silent.m4:60: -1- AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) m4trace:/usr/local/share/aclocal-1.14/strip.m4:28: -1- AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) m4trace:/usr/local/share/aclocal-1.14/substnot.m4:12: -1- AC_DEFUN([_AM_SUBST_NOTMAKE]) m4trace:/usr/local/share/aclocal-1.14/substnot.m4:17: -1- AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) m4trace:/usr/local/share/aclocal-1.14/tar.m4:132: -1- AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) m4trace:configure.in:2: -1- m4_pattern_forbid([^_?A[CHUM]_]) m4trace:configure.in:2: -1- m4_pattern_forbid([_AC_]) m4trace:configure.in:2: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) m4trace:configure.in:2: -1- m4_pattern_allow([^AS_FLAGS$]) m4trace:configure.in:2: -1- m4_pattern_forbid([^_?m4_]) m4trace:configure.in:2: -1- m4_pattern_forbid([^dnl$]) m4trace:configure.in:2: -1- m4_pattern_forbid([^_?AS_]) m4trace:configure.in:2: -1- m4_pattern_allow([^SHELL$]) m4trace:configure.in:2: -1- m4_pattern_allow([^PATH_SEPARATOR$]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.in:2: -1- m4_pattern_allow([^exec_prefix$]) m4trace:configure.in:2: -1- m4_pattern_allow([^prefix$]) m4trace:configure.in:2: -1- m4_pattern_allow([^program_transform_name$]) m4trace:configure.in:2: -1- m4_pattern_allow([^bindir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^sbindir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^libexecdir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^datarootdir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^datadir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^sysconfdir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^sharedstatedir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^localstatedir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^includedir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^oldincludedir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^docdir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^infodir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^htmldir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^dvidir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^pdfdir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^psdir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^libdir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^localedir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^mandir$]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.in:2: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.in:2: -1- m4_pattern_allow([^DEFS$]) m4trace:configure.in:2: -1- m4_pattern_allow([^ECHO_C$]) m4trace:configure.in:2: -1- m4_pattern_allow([^ECHO_N$]) m4trace:configure.in:2: -1- m4_pattern_allow([^ECHO_T$]) m4trace:configure.in:2: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.in:2: -1- m4_pattern_allow([^build_alias$]) m4trace:configure.in:2: -1- m4_pattern_allow([^host_alias$]) m4trace:configure.in:2: -1- m4_pattern_allow([^target_alias$]) m4trace:configure.in:3: -1- AM_INIT_AUTOMAKE([subdir-objects]) m4trace:configure.in:3: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) m4trace:configure.in:3: -1- AM_SET_CURRENT_AUTOMAKE_VERSION m4trace:configure.in:3: -1- AM_AUTOMAKE_VERSION([1.14]) m4trace:configure.in:3: -1- _AM_AUTOCONF_VERSION([2.69]) m4trace:configure.in:3: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) m4trace:configure.in:3: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) m4trace:configure.in:3: -1- m4_pattern_allow([^INSTALL_DATA$]) m4trace:configure.in:3: -1- m4_pattern_allow([^am__isrc$]) m4trace:configure.in:3: -1- _AM_SUBST_NOTMAKE([am__isrc]) m4trace:configure.in:3: -1- m4_pattern_allow([^CYGPATH_W$]) m4trace:configure.in:3: -1- _AM_SET_OPTIONS([subdir-objects]) m4trace:configure.in:3: -1- _AM_SET_OPTION([subdir-objects]) m4trace:configure.in:3: -2- _AM_MANGLE_OPTION([subdir-objects]) m4trace:configure.in:3: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.in:3: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.in:3: -1- _AM_IF_OPTION([no-define], [], [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])]) m4trace:configure.in:3: -2- _AM_MANGLE_OPTION([no-define]) m4trace:configure.in:3: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.in:3: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.in:3: -1- AM_SANITY_CHECK m4trace:configure.in:3: -1- AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) m4trace:configure.in:3: -1- AM_MISSING_HAS_RUN m4trace:configure.in:3: -1- AM_AUX_DIR_EXPAND m4trace:configure.in:3: -1- m4_pattern_allow([^ACLOCAL$]) m4trace:configure.in:3: -1- AM_MISSING_PROG([AUTOCONF], [autoconf]) m4trace:configure.in:3: -1- m4_pattern_allow([^AUTOCONF$]) m4trace:configure.in:3: -1- AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) m4trace:configure.in:3: -1- m4_pattern_allow([^AUTOMAKE$]) m4trace:configure.in:3: -1- AM_MISSING_PROG([AUTOHEADER], [autoheader]) m4trace:configure.in:3: -1- m4_pattern_allow([^AUTOHEADER$]) m4trace:configure.in:3: -1- AM_MISSING_PROG([MAKEINFO], [makeinfo]) m4trace:configure.in:3: -1- m4_pattern_allow([^MAKEINFO$]) m4trace:configure.in:3: -1- AM_PROG_INSTALL_SH m4trace:configure.in:3: -1- m4_pattern_allow([^install_sh$]) m4trace:configure.in:3: -1- AM_PROG_INSTALL_STRIP m4trace:configure.in:3: -1- m4_pattern_allow([^STRIP$]) m4trace:configure.in:3: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) m4trace:configure.in:3: -1- m4_pattern_allow([^MKDIR_P$]) m4trace:configure.in:3: -1- m4_pattern_allow([^mkdir_p$]) m4trace:configure.in:3: -1- m4_pattern_allow([^AWK$]) m4trace:configure.in:3: -1- m4_pattern_allow([^SET_MAKE$]) m4trace:configure.in:3: -1- AM_SET_LEADING_DOT m4trace:configure.in:3: -1- m4_pattern_allow([^am__leading_dot$]) m4trace:configure.in:3: -1- _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) m4trace:configure.in:3: -2- _AM_MANGLE_OPTION([tar-ustar]) m4trace:configure.in:3: -1- _AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])]) m4trace:configure.in:3: -2- _AM_MANGLE_OPTION([tar-pax]) m4trace:configure.in:3: -1- _AM_PROG_TAR([v7]) m4trace:configure.in:3: -1- m4_pattern_allow([^AMTAR$]) m4trace:configure.in:3: -1- m4_pattern_allow([^am__tar$]) m4trace:configure.in:3: -1- m4_pattern_allow([^am__untar$]) m4trace:configure.in:3: -1- _AM_IF_OPTION([no-dependencies], [], [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) m4trace:configure.in:3: -2- _AM_MANGLE_OPTION([no-dependencies]) m4trace:configure.in:3: -1- AM_SILENT_RULES m4trace:configure.in:3: -1- m4_pattern_allow([^AM_V$]) m4trace:configure.in:3: -1- AM_SUBST_NOTMAKE([AM_V]) m4trace:configure.in:3: -1- _AM_SUBST_NOTMAKE([AM_V]) m4trace:configure.in:3: -1- m4_pattern_allow([^AM_DEFAULT_V$]) m4trace:configure.in:3: -1- AM_SUBST_NOTMAKE([AM_DEFAULT_V]) m4trace:configure.in:3: -1- _AM_SUBST_NOTMAKE([AM_DEFAULT_V]) m4trace:configure.in:3: -1- m4_pattern_allow([^AM_DEFAULT_VERBOSITY$]) m4trace:configure.in:3: -1- m4_pattern_allow([^AM_BACKSLASH$]) m4trace:configure.in:3: -1- _AM_SUBST_NOTMAKE([AM_BACKSLASH]) m4trace:configure.in:5: -1- m4_pattern_allow([^build$]) m4trace:configure.in:5: -1- m4_pattern_allow([^build_cpu$]) m4trace:configure.in:5: -1- m4_pattern_allow([^build_vendor$]) m4trace:configure.in:5: -1- m4_pattern_allow([^build_os$]) m4trace:configure.in:5: -1- m4_pattern_allow([^host$]) m4trace:configure.in:5: -1- m4_pattern_allow([^host_cpu$]) m4trace:configure.in:5: -1- m4_pattern_allow([^host_vendor$]) m4trace:configure.in:5: -1- m4_pattern_allow([^host_os$]) m4trace:configure.in:8: -1- AM_CONFIG_HEADER([config.h]) m4trace:configure.in:8: -1- _m4_warn([obsolete], ['AM_CONFIG_HEADER': this macro is obsolete. You should use the 'AC_CONFIG_HEADERS' macro instead.], [/usr/local/share/aclocal-1.14/obsolete.m4:15: AM_CONFIG_HEADER is expanded from... configure.in:8: the top level]) m4trace:configure.in:11: -1- m4_pattern_allow([^SET_MAKE$]) m4trace:configure.in:13: -1- m4_pattern_allow([^CXX$]) m4trace:configure.in:13: -1- m4_pattern_allow([^CXXFLAGS$]) m4trace:configure.in:13: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.in:13: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.in:13: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.in:13: -1- m4_pattern_allow([^CXX$]) m4trace:configure.in:13: -1- m4_pattern_allow([^ac_ct_CXX$]) m4trace:configure.in:13: -1- m4_pattern_allow([^EXEEXT$]) m4trace:configure.in:13: -1- m4_pattern_allow([^OBJEXT$]) m4trace:configure.in:13: -1- _AM_DEPENDENCIES([CXX]) m4trace:configure.in:13: -1- AM_SET_DEPDIR m4trace:configure.in:13: -1- m4_pattern_allow([^DEPDIR$]) m4trace:configure.in:13: -1- AM_OUTPUT_DEPENDENCY_COMMANDS m4trace:configure.in:13: -1- AM_MAKE_INCLUDE m4trace:configure.in:13: -1- m4_pattern_allow([^am__include$]) m4trace:configure.in:13: -1- m4_pattern_allow([^am__quote$]) m4trace:configure.in:13: -1- AM_DEP_TRACK m4trace:configure.in:13: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) m4trace:configure.in:13: -1- m4_pattern_allow([^AMDEP_TRUE$]) m4trace:configure.in:13: -1- m4_pattern_allow([^AMDEP_FALSE$]) m4trace:configure.in:13: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE]) m4trace:configure.in:13: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE]) m4trace:configure.in:13: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) m4trace:configure.in:13: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH]) m4trace:configure.in:13: -1- m4_pattern_allow([^am__nodep$]) m4trace:configure.in:13: -1- _AM_SUBST_NOTMAKE([am__nodep]) m4trace:configure.in:13: -1- m4_pattern_allow([^CXXDEPMODE$]) m4trace:configure.in:13: -1- AM_CONDITIONAL([am__fastdepCXX], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3]) m4trace:configure.in:13: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$]) m4trace:configure.in:13: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$]) m4trace:configure.in:13: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE]) m4trace:configure.in:13: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE]) m4trace:configure.in:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:14: -1- m4_pattern_allow([^CFLAGS$]) m4trace:configure.in:14: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.in:14: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.in:14: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.in:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:14: -1- m4_pattern_allow([^ac_ct_CC$]) m4trace:configure.in:14: -1- _AM_PROG_CC_C_O m4trace:configure.in:14: -1- AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) m4trace:configure.in:14: -1- _AM_DEPENDENCIES([CC]) m4trace:configure.in:14: -1- m4_pattern_allow([^CCDEPMODE$]) m4trace:configure.in:14: -1- AM_CONDITIONAL([am__fastdepCC], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) m4trace:configure.in:14: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) m4trace:configure.in:14: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) m4trace:configure.in:14: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE]) m4trace:configure.in:14: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE]) m4trace:configure.in:15: -1- AM_PROG_CC_C_O m4trace:configure.in:16: -1- AM_PROG_LEX m4trace:configure.in:16: -1- m4_pattern_allow([^LEX$]) m4trace:configure.in:16: -1- m4_pattern_allow([^LEX_OUTPUT_ROOT$]) m4trace:configure.in:16: -1- m4_pattern_allow([^LEXLIB$]) m4trace:configure.in:16: -1- m4_pattern_allow([^YYTEXT_POINTER$]) m4trace:configure.in:17: -1- m4_pattern_allow([^YACC$]) m4trace:configure.in:17: -1- m4_pattern_allow([^YACC$]) m4trace:configure.in:17: -1- m4_pattern_allow([^YFLAGS$]) m4trace:configure.in:18: -1- m4_pattern_allow([^CPP$]) m4trace:configure.in:18: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.in:18: -1- m4_pattern_allow([^CPP$]) m4trace:configure.in:19: -1- m4_pattern_allow([^RANLIB$]) m4trace:configure.in:21: -1- m4_pattern_allow([^LN_S$]) m4trace:configure.in:22: -1- m4_pattern_allow([^AWK$]) m4trace:configure.in:90: -1- m4_pattern_allow([^SAMPLE_EXTRA_LIBS$]) m4trace:configure.in:91: -1- m4_pattern_allow([^platform$]) m4trace:configure.in:94: -1- m4_pattern_allow([^GREP$]) m4trace:configure.in:94: -1- m4_pattern_allow([^EGREP$]) m4trace:configure.in:94: -1- m4_pattern_allow([^STDC_HEADERS$]) m4trace:configure.in:98: -1- m4_pattern_allow([^const$]) m4trace:configure.in:99: -1- m4_pattern_allow([^size_t$]) m4trace:configure.in:100: -1- m4_pattern_allow([^TIME_WITH_SYS_TIME$]) m4trace:configure.in:101: -1- m4_pattern_allow([^TM_IN_SYS_TIME$]) m4trace:configure.in:106: -1- m4_pattern_allow([^HAVE_STRUCT_TM_TM_GMTOFF$]) m4trace:configure.in:106: -1- m4_pattern_allow([^HAVE_STRUCT_TM___TM_GMTOFF$]) m4trace:configure.in:109: -1- AC_DEFUN([_AC_Header_sys_time_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_list], [" sys/time.h"])]) _AC_HEADERS_EXPANSION]) m4trace:configure.in:109: -1- AC_DEFUN([_AC_Header_unistd_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_list], [" unistd.h"])]) _AC_HEADERS_EXPANSION]) m4trace:configure.in:109: -1- AC_DEFUN([_AC_Func_alarm], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_func_list], [" alarm"])]) _AC_FUNCS_EXPANSION]) m4trace:configure.in:109: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.in:110: -1- _m4_warn([obsolete], [The macro `AC_TYPE_SIGNAL' is obsolete. You should run autoupdate.], [../../lib/autoconf/types.m4:759: AC_TYPE_SIGNAL is expanded from... configure.in:110: the top level]) m4trace:configure.in:110: -1- m4_pattern_allow([^RETSIGTYPE$]) m4trace:configure.in:111: -1- m4_pattern_allow([^HAVE_STRFTIME$]) m4trace:configure.in:111: -1- m4_pattern_allow([^HAVE_STRFTIME$]) m4trace:configure.in:115: -1- m4_pattern_allow([^HAVE_ISNAN$]) m4trace:configure.in:116: -1- m4_pattern_allow([^HAVE_ISINF$]) m4trace:configure.in:124: -1- m4_pattern_allow([^HAVE_ISNAN$]) m4trace:configure.in:136: -1- m4_pattern_allow([^HAVE_ISINF$]) m4trace:configure.in:145: -1- m4_pattern_allow([^HAVE_GETHOSTBYNAME_R$]) m4trace:configure.in:146: -1- m4_pattern_allow([^HAVE_STDLIB_H$]) m4trace:configure.in:146: -1- m4_pattern_allow([^HAVE_MALLOC$]) m4trace:configure.in:146: -1- m4_pattern_allow([^HAVE_MALLOC$]) m4trace:configure.in:146: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.in:146: -1- m4_pattern_allow([^malloc$]) m4trace:configure.in:157: -1- AM_CONDITIONAL([DEBUG_COMPILE], [test x$debug = xtrue]) m4trace:configure.in:157: -1- m4_pattern_allow([^DEBUG_COMPILE_TRUE$]) m4trace:configure.in:157: -1- m4_pattern_allow([^DEBUG_COMPILE_FALSE$]) m4trace:configure.in:157: -1- _AM_SUBST_NOTMAKE([DEBUG_COMPILE_TRUE]) m4trace:configure.in:157: -1- _AM_SUBST_NOTMAKE([DEBUG_COMPILE_FALSE]) m4trace:configure.in:163: -1- m4_pattern_allow([^SOAPCPP2_DEBUG$]) m4trace:configure.in:168: -1- m4_pattern_allow([^SOAPCPP2_IMPORTPATH$]) m4trace:configure.in:173: -1- m4_pattern_allow([^WSDL2H_IMPORTPATH$]) m4trace:configure.in:181: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.in:181: the top level]) m4trace:configure.in:190: -1- m4_pattern_allow([^SOAPCPP2_NONAMESPACES$]) m4trace:configure.in:198: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.in:198: the top level]) m4trace:configure.in:207: -1- m4_pattern_allow([^SOAPCPP2_IPV6$]) m4trace:configure.in:220: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.in:220: the top level]) m4trace:configure.in:227: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.in:227: the top level]) m4trace:configure.in:264: -1- m4_pattern_allow([^WSDL2H_EXTRA_FLAGS$]) m4trace:configure.in:265: -1- m4_pattern_allow([^WSDL2H_EXTRA_LIBS$]) m4trace:configure.in:266: -1- m4_pattern_allow([^SAMPLE_INCLUDES$]) m4trace:configure.in:267: -1- m4_pattern_allow([^SAMPLE_SSL_LIBS$]) m4trace:configure.in:268: -1- m4_pattern_allow([^WSDL2H_SOAP_CPP_LIB$]) m4trace:configure.in:278: -1- AM_CONDITIONAL([ENABLE_SAMPLES], [test x$samples = xtrue]) m4trace:configure.in:278: -1- m4_pattern_allow([^ENABLE_SAMPLES_TRUE$]) m4trace:configure.in:278: -1- m4_pattern_allow([^ENABLE_SAMPLES_FALSE$]) m4trace:configure.in:278: -1- _AM_SUBST_NOTMAKE([ENABLE_SAMPLES_TRUE]) m4trace:configure.in:278: -1- _AM_SUBST_NOTMAKE([ENABLE_SAMPLES_FALSE]) m4trace:configure.in:279: -1- m4_pattern_allow([^ENABLE_SAMPLES$]) m4trace:configure.in:286: -1- m4_pattern_allow([^SAMPLE_DIRS$]) m4trace:configure.in:296: -1- m4_pattern_allow([^LEX_DEFINE$]) m4trace:configure.in:297: -1- m4_pattern_allow([^LEX_FLAGS$]) m4trace:configure.in:298: -1- m4_pattern_allow([^LEXLIB$]) m4trace:configure.in:308: -1- m4_pattern_allow([^BISON_DEFINE$]) m4trace:configure.in:309: -1- m4_pattern_allow([^YACC_LIB$]) m4trace:configure.in:354: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.in:354: -1- m4_pattern_allow([^LTLIBOBJS$]) m4trace:configure.in:354: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) m4trace:configure.in:354: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) m4trace:configure.in:354: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) m4trace:configure.in:354: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) m4trace:configure.in:354: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) m4trace:configure.in:354: -1- _AC_AM_CONFIG_HEADER_HOOK(["$ac_file"]) m4trace:configure.in:354: -1- _AM_OUTPUT_DEPENDENCY_COMMANDS gsoap-2.8.91/autom4te.cache/output.20000644000175000017500000070335713525245157016543 0ustar ellertellert@%:@! /bin/sh @%:@ Guess values for system-dependent variables and create Makefiles. @%:@ Generated by GNU Autoconf 2.69 for gsoap 2.8. @%:@ @%:@ @%:@ Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @%:@ @%:@ @%:@ This configure script is free software; the Free Software Foundation @%:@ gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in @%:@( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIB@&t@OBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='gsoap' PACKAGE_TARNAME='gsoap' PACKAGE_VERSION='2.8' PACKAGE_STRING='gsoap 2.8' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="gsoap/stdsoap2.cpp" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_list= ac_func_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS YACC_LIB BISON_DEFINE LEX_FLAGS LEX_DEFINE SAMPLE_DIRS ENABLE_SAMPLES ENABLE_SAMPLES_FALSE ENABLE_SAMPLES_TRUE WSDL2H_SOAP_CPP_LIB SAMPLE_SSL_LIBS SAMPLE_INCLUDES WSDL2H_EXTRA_LIBS WSDL2H_EXTRA_FLAGS SOAPCPP2_IPV6 SOAPCPP2_NONAMESPACES WSDL2H_IMPORTPATH SOAPCPP2_IMPORTPATH SOAPCPP2_DEBUG DEBUG_COMPILE_FALSE DEBUG_COMPILE_TRUE LIB@&t@OBJS EGREP GREP platform SAMPLE_EXTRA_LIBS LN_S RANLIB CPP YFLAGS YACC LEXLIB LEX_OUTPUT_ROOT LEX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX host_os host_vendor host_cpu host build_os build_vendor build_cpu build AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking enable_debug enable_namespaces enable_ipv6 with_zlib with_openssl enable_ssl enable_gnutls enable_samples ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS YACC YFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures gsoap 2.8 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX @<:@@S|@ac_default_prefix@:>@ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX @<:@PREFIX@:>@ By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root @<:@DATAROOTDIR/doc/gsoap@:>@ --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of gsoap 2.8:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-debug add debug symbols for debugging --disable-namespaces compile library without namespaces --enable-ipv6 compile library with IPv6 support --disable-ssl build without SSL/TLS --enable-gnutls build with GNUTLS SSL/TLS --enable-samples enable compile for the gsoap samples Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-zlib=DIR zlib installation prefix --with-openssl=DIR openssl installation prefix Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags YACC The `Yet Another Compiler Compiler' implementation to use. Defaults to the first program found out of: `bison -y', `byacc', `yacc'. YFLAGS The list of arguments that will be passed by default to @S|@YACC. This script will default YFLAGS to the empty string to avoid a default value of `-d' given by some make applications. CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF gsoap configure 2.8 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## @%:@ ac_fn_cxx_try_compile LINENO @%:@ ---------------------------- @%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_cxx_try_compile @%:@ ac_fn_c_try_compile LINENO @%:@ -------------------------- @%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_compile @%:@ ac_fn_c_try_link LINENO @%:@ ----------------------- @%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_link @%:@ ac_fn_c_try_cpp LINENO @%:@ ---------------------- @%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_cpp @%:@ ac_fn_c_try_run LINENO @%:@ ---------------------- @%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes @%:@ that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_run @%:@ ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using @%:@ the include files in INCLUDES and setting the cache variable VAR @%:@ accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_header_mongrel @%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists and can be compiled using the include files in @%:@ INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_header_compile @%:@ ac_fn_c_check_type LINENO TYPE VAR INCLUDES @%:@ ------------------------------------------- @%:@ Tests whether TYPE exists after having included INCLUDES, setting cache @%:@ variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_type @%:@ ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES @%:@ ---------------------------------------------------- @%:@ Tries to find if the field MEMBER exists in type AGGR, after including @%:@ INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_member @%:@ ac_fn_c_check_func LINENO FUNC VAR @%:@ ---------------------------------- @%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by gsoap $as_me 2.8, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in @%:@(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi as_fn_append ac_header_list " sys/time.h" as_fn_append ac_header_list " unistd.h" as_fn_append ac_func_list " alarm" # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.14' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in @%:@(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null @%:@ Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='gsoap' VERSION='2.8' cat >>confdefs.h <<_ACEOF @%:@define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # AC_CONFIG_HEADERS([config.h]) ac_config_headers="$ac_config_headers config.h" # we use subdirs. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi # Checks for programs. ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf @%:@ Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $@%:@ != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi for ac_prog in flex lex do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LEX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LEX"; then ac_cv_prog_LEX="$LEX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LEX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LEX=$ac_cv_prog_LEX if test -n "$LEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5 $as_echo "$LEX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$LEX" && break done test -n "$LEX" || LEX=":" if test "x$LEX" != "x:"; then cat >conftest.l <<_ACEOF %% a { ECHO; } b { REJECT; } c { yymore (); } d { yyless (1); } e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */ yyless ((input () != 0)); } f { unput (yytext[0]); } . { BEGIN INITIAL; } %% #ifdef YYTEXT_POINTER extern char *yytext; #endif int main (void) { return ! yylex () + ! yywrap (); } _ACEOF { { ac_try="$LEX conftest.l" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$LEX conftest.l") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex output file root" >&5 $as_echo_n "checking lex output file root... " >&6; } if ${ac_cv_prog_lex_root+:} false; then : $as_echo_n "(cached) " >&6 else if test -f lex.yy.c; then ac_cv_prog_lex_root=lex.yy elif test -f lexyy.c; then ac_cv_prog_lex_root=lexyy else as_fn_error $? "cannot find output from $LEX; giving up" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5 $as_echo "$ac_cv_prog_lex_root" >&6; } LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root if test -z "${LEXLIB+set}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex library" >&5 $as_echo_n "checking lex library... " >&6; } if ${ac_cv_lib_lex+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS=$LIBS ac_cv_lib_lex='none needed' for ac_lib in '' -lfl -ll; do LIBS="$ac_lib $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_lex=$ac_lib fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext test "$ac_cv_lib_lex" != 'none needed' && break done LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5 $as_echo "$ac_cv_lib_lex" >&6; } test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5 $as_echo_n "checking whether yytext is a pointer... " >&6; } if ${ac_cv_prog_lex_yytext_pointer+:} false; then : $as_echo_n "(cached) " >&6 else # POSIX says lex can declare yytext either as a pointer or an array; the # default is implementation-dependent. Figure out which it is, since # not all implementations provide the %pointer and %array declarations. ac_cv_prog_lex_yytext_pointer=no ac_save_LIBS=$LIBS LIBS="$LEXLIB $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define YYTEXT_POINTER 1 `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_prog_lex_yytext_pointer=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5 $as_echo "$ac_cv_prog_lex_yytext_pointer" >&6; } if test $ac_cv_prog_lex_yytext_pointer = yes; then $as_echo "@%:@define YYTEXT_POINTER 1" >>confdefs.h fi rm -f conftest.l $LEX_OUTPUT_ROOT.c fi if test "$LEX" = :; then LEX=${am_missing_run}flex fi for ac_prog in 'bison -y' byacc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_YACC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$YACC"; then ac_cv_prog_YACC="$YACC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_YACC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi YACC=$ac_cv_prog_YACC if test -n "$YACC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 $as_echo "$YACC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$YACC" && break done test -n "$YACC" || YACC="yacc" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@ifdef __STDC__ @%:@ include @%:@else @%:@ include @%:@endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@ifdef __STDC__ @%:@ include @%:@else @%:@ include @%:@endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi #AM_PROG_LIBTOOL { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done # AC_DECL_YYTEXT SAMPLE_EXTRA_LIBS="-lm" # Platform-specific Makefile setup case "${host}" in *-*-solaris*) platform=SUN_OS SAMPLE_EXTRA_LIBS="-lxnet -lsocket -lnsl -lm" WSDL2H_EXTRA_LIBS="-lxnet -lsocket -lnsl -lrt" ;; *-*-sysv5*) platform=UNIXWARE ;; *-*-UnixWare*) platform=UNIXWARE ;; *-*-unixware*) platform=UNIXWARE ;; *-*-sco3.2v5*) platform=OPENSERVER SAMPLE_EXTRA_LIBS="-lsocket -lm" ;; *-*-linux*) platform=LINUX # if test x$debug = xtrue; then # CFLAGS="-g" #don't want the -O2 for debugging. # else # CFLAGS="-O2" #don't want the -g for release compile. # fi ;; *-*-cygwin*) platform=CYGWIN ;; *-*-mingw*) platform=MINGW SAMPLE_EXTRA_LIBS="-lws2_32 -lkernel32 -luser32 -lgdi32 -lm" WSDL2H_EXTRA_LIBS="-lws2_32 -lkernel32 -luser32 -lgdi32 -lm" ;; *-*-freebsd*) platform=FREEBSD ;; *-*-openbsd*) platform=OPENBSD ;; *-*-irix*) platform=IRIX ;; *-*-aix*) platform=AIX case "${host}" in *-*-aix4.1*) osver=AIX41;; *-*-aix4.2*) osver=AIX42;; *-*-aix4.3*) osver=AIX43;; *-*-aix4.*) osver=AIX43;; *-*-aix5.2) osver=AIX52;; *-*-aix5.3) osver=AIX53;; *-*-aix6.1) osver=AIX61;; esac ;; *-sequent-*) platform=PTX ;; *-*-hp*) platform=HP_UX ; case "${host}" in *-*-hpux11*) osver=HPUX11;; *-*-hpux10*) osver=HPUX10;; *) osver=HPUX11;; esac ;; *-*-mvs*) platform=OS390 ;; *-*-os400*) platform=OS400 ;; *-*-OS400*) platform=OS400 ;; *-*-osf*) platform=TRU64 ;; *-apple-*) platform=MACOSX # Appease 10.7 Lion (OpenSSL deprecated) CXXFLAGS="-Wno-deprecated-declarations" CFLAGS="-Wno-deprecated-declarations" ;; *-nto-qnx) platform=QNX SAMPLE_EXTRA_LIBS="-lsocket -lm" ;; *) platform=UNKNOWN ;; esac # Checks for header files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in arpa/inet.h xlocale.h errno.h fcntl.h ctype.h limits.h float.h math.h netdb.h netinet/in.h stdlib.h string.h strings.h stdint.h inttypes.h time.h sys/inttypes.h sys/socket.h sys/types.h sys/time.h sys/timeb.h unistd.h poll.h openssl/ssl.h gnutls/gnutls.h zlib.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "@%:@define const /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF @%:@define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "@%:@define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if ${ac_cv_struct_tm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "@%:@define TM_IN_SYS_TIME 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct tm" "tm_gmtoff" "ac_cv_member_struct_tm_tm_gmtoff" " #include #include " if test "x$ac_cv_member_struct_tm_tm_gmtoff" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRUCT_TM_TM_GMTOFF 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct tm" "__tm_gmtoff" "ac_cv_member_struct_tm___tm_gmtoff" " #include #include " if test "x$ac_cv_member_struct_tm___tm_gmtoff" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRUCT_TM___TM_GMTOFF 1 _ACEOF fi # Checks for library functions. for ac_header in $ac_header_list do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in $ac_func_list do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mktime" >&5 $as_echo_n "checking for working mktime... " >&6; } if ${ac_cv_func_working_mktime+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_working_mktime=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Test program from Paul Eggert and Tony Leneis. */ #ifdef TIME_WITH_SYS_TIME # include # include #else # ifdef HAVE_SYS_TIME_H # include # else # include # endif #endif #include #include #ifdef HAVE_UNISTD_H # include #endif #ifndef HAVE_ALARM # define alarm(X) /* empty */ #endif /* Work around redefinition to rpl_putenv by other config tests. */ #undef putenv static time_t time_t_max; static time_t time_t_min; /* Values we'll use to set the TZ environment variable. */ static const char *tz_strings[] = { (const char *) 0, "TZ=GMT0", "TZ=JST-9", "TZ=EST+3EDT+2,M10.1.0/00:00:00,M2.3.0/00:00:00" }; #define N_STRINGS (sizeof (tz_strings) / sizeof (tz_strings[0])) /* Return 0 if mktime fails to convert a date in the spring-forward gap. Based on a problem report from Andreas Jaeger. */ static int spring_forward_gap () { /* glibc (up to about 1998-10-07) failed this test. */ struct tm tm; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ((char*) "TZ=PST8PDT,M4.1.0,M10.5.0"); tm.tm_year = 98; tm.tm_mon = 3; tm.tm_mday = 5; tm.tm_hour = 2; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; return mktime (&tm) != (time_t) -1; } static int mktime_test1 (time_t now) { struct tm *lt; return ! (lt = localtime (&now)) || mktime (lt) == now; } static int mktime_test (time_t now) { return (mktime_test1 (now) && mktime_test1 ((time_t) (time_t_max - now)) && mktime_test1 ((time_t) (time_t_min + now))); } static int irix_6_4_bug () { /* Based on code from Ariel Faigon. */ struct tm tm; tm.tm_year = 96; tm.tm_mon = 3; tm.tm_mday = 0; tm.tm_hour = 0; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; mktime (&tm); return tm.tm_mon == 2 && tm.tm_mday == 31; } static int bigtime_test (int j) { struct tm tm; time_t now; tm.tm_year = tm.tm_mon = tm.tm_mday = tm.tm_hour = tm.tm_min = tm.tm_sec = j; now = mktime (&tm); if (now != (time_t) -1) { struct tm *lt = localtime (&now); if (! (lt && lt->tm_year == tm.tm_year && lt->tm_mon == tm.tm_mon && lt->tm_mday == tm.tm_mday && lt->tm_hour == tm.tm_hour && lt->tm_min == tm.tm_min && lt->tm_sec == tm.tm_sec && lt->tm_yday == tm.tm_yday && lt->tm_wday == tm.tm_wday && ((lt->tm_isdst < 0 ? -1 : 0 < lt->tm_isdst) == (tm.tm_isdst < 0 ? -1 : 0 < tm.tm_isdst)))) return 0; } return 1; } static int year_2050_test () { /* The correct answer for 2050-02-01 00:00:00 in Pacific time, ignoring leap seconds. */ unsigned long int answer = 2527315200UL; struct tm tm; time_t t; tm.tm_year = 2050 - 1900; tm.tm_mon = 2 - 1; tm.tm_mday = 1; tm.tm_hour = tm.tm_min = tm.tm_sec = 0; tm.tm_isdst = -1; /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" instead of "TZ=America/Vancouver" in order to detect the bug even on systems that don't support the Olson extension, or don't have the full zoneinfo tables installed. */ putenv ((char*) "TZ=PST8PDT,M4.1.0,M10.5.0"); t = mktime (&tm); /* Check that the result is either a failure, or close enough to the correct answer that we can assume the discrepancy is due to leap seconds. */ return (t == (time_t) -1 || (0 < t && answer - 120 <= t && t <= answer + 120)); } int main () { time_t t, delta; int i, j; /* This test makes some buggy mktime implementations loop. Give up after 60 seconds; a mktime slower than that isn't worth using anyway. */ alarm (60); for (;;) { t = (time_t_max << 1) + 1; if (t <= time_t_max) break; time_t_max = t; } time_t_min = - ((time_t) ~ (time_t) 0 == (time_t) -1) - time_t_max; delta = time_t_max / 997; /* a suitable prime number */ for (i = 0; i < N_STRINGS; i++) { if (tz_strings[i]) putenv ((char*) tz_strings[i]); for (t = 0; t <= time_t_max - delta; t += delta) if (! mktime_test (t)) return 1; if (! (mktime_test ((time_t) 1) && mktime_test ((time_t) (60 * 60)) && mktime_test ((time_t) (60 * 60 * 24)))) return 1; for (j = 1; ; j <<= 1) if (! bigtime_test (j)) return 1; else if (INT_MAX / 2 < j) break; if (! bigtime_test (INT_MAX)) return 1; } return ! (irix_6_4_bug () && spring_forward_gap () && year_2050_test ()); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_working_mktime=yes else ac_cv_func_working_mktime=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_working_mktime" >&5 $as_echo "$ac_cv_func_working_mktime" >&6; } if test $ac_cv_func_working_mktime = no; then case " $LIB@&t@OBJS " in *" mktime.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS mktime.$ac_objext" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 $as_echo_n "checking return type of signal handlers... " >&6; } if ${ac_cv_type_signal+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_signal=int else ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 $as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF @%:@define RETSIGTYPE $ac_cv_type_signal _ACEOF for ac_func in strftime do : ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime" if test "x$ac_cv_func_strftime" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRFTIME 1 _ACEOF else # strftime is in -lintl on SCO UNIX. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strftime in -lintl" >&5 $as_echo_n "checking for strftime in -lintl... " >&6; } if ${ac_cv_lib_intl_strftime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char strftime (); int main () { return strftime (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_strftime=yes else ac_cv_lib_intl_strftime=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_strftime" >&5 $as_echo "$ac_cv_lib_intl_strftime" >&6; } if test "x$ac_cv_lib_intl_strftime" = xyes; then : $as_echo "@%:@define HAVE_STRFTIME 1" >>confdefs.h LIBS="-lintl $LIBS" fi fi done for ac_func in random gettimeofday ftime localtime_r timegm gmtime gmtime_r asctime asctime_r memset select socket snprintf strchr strerror strerror_r strlcpy strrchr strstr strtol strtoul strtoll strtoull strtold strtod strtof strtold_l strtod_l strtof_l sscanf sscanf_l snprintf sprintf_l wctomb mbtowc poll do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # Checks for isnan and isinf ac_fn_c_check_func "$LINENO" "isnan" "ac_cv_func_isnan" if test "x$ac_cv_func_isnan" = xyes; then : has_isnan=1; $as_echo "@%:@define HAVE_ISNAN 1" >>confdefs.h else has_isnan=0 fi ac_fn_c_check_func "$LINENO" "isinf" "ac_cv_func_isinf" if test "x$ac_cv_func_isinf" = xyes; then : has_isinf=1; $as_echo "@%:@define HAVE_ISINF 1" >>confdefs.h else has_isinf=0 fi # check for macro isnan in math if test $has_isnan = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for macro isnan" >&5 $as_echo_n "checking for macro isnan... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { { int foo; foo = isnan(0); } ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : has_isnan=1 else has_isnan=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $has_isnan = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "@%:@define HAVE_ISNAN 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # check for macro isinf in math if test $has_isinf = 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for macro isinf" >&5 $as_echo_n "checking for macro isinf... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { { int foo; foo = isinf(0); } ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : has_isinf=1 else has_isinf=0 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $has_isinf = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "@%:@define HAVE_ISINF 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # Function test depending on platform # AIX Has incompatible gethostbyname_r if test $platform != AIX -a $platform != TRU64; then for ac_func in gethostbyname_r do : ac_fn_c_check_func "$LINENO" "gethostbyname_r" "ac_cv_func_gethostbyname_r" if test "x$ac_cv_func_gethostbyname_r" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_GETHOSTBYNAME_R 1 _ACEOF fi done for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 $as_echo_n "checking for GNU libc compatible malloc... " >&6; } if ${ac_cv_func_malloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_malloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { return ! malloc (0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_malloc_0_nonnull=yes else ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 $as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes; then : $as_echo "@%:@define HAVE_MALLOC 1" >>confdefs.h else $as_echo "@%:@define HAVE_MALLOC 0" >>confdefs.h case " $LIB@&t@OBJS " in *" malloc.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS malloc.$ac_objext" ;; esac $as_echo "@%:@define malloc rpl_malloc" >>confdefs.h fi fi # the debug build options adds symbols to compiler output (-g for g++) @%:@ Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; case "${enableval}" in yes) debug=true ;; no) debug=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;; esac else debug=false fi if test x$debug = xtrue; then DEBUG_COMPILE_TRUE= DEBUG_COMPILE_FALSE='#' else DEBUG_COMPILE_TRUE='#' DEBUG_COMPILE_FALSE= fi if test x$debug = xtrue; then SOAPCPP2_DEBUG="-DDEBUG" ##define DEBUG for debugging else SOAPCPP2_DEBUG= fi # set the default soapcpp2 import path SOAPCPP2_IMPORTPATH="-DSOAPCPP2_IMPORT_PATH=\"\\\"${datadir}/gsoap/import\\\"\"" #SOAPCPP2_IMPORTPATH="-DSOAPCPP2_IMPORT_PATH=\"\\\"`pwd`/gsoap/import\\\"\"" # set the default wsdl2h import path WSDL2H_IMPORTPATH="-DWSDL2H_IMPORT_PATH=\"\\\"${datadir}/gsoap/WS\\\"\"" #WSDL2H_IMPORTPATH="-DWSDL2H_IMPORT_PATH=\"\\\"`pwd`/gsoap/WS\\\"\"" # the disable-namespaces option adds the -DWITH_NONAMESPACES to the # library compilation thus disabling namespaces @%:@ Check whether --enable-namespaces was given. if test "${enable_namespaces+set}" = set; then : enableval=$enable_namespaces; with_namespaces="$enable_ns" else with_namespaces="yes" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for disable namespaces in library" >&5 $as_echo_n "checking for disable namespaces in library... " >&6; } if test "x$with_namespaces" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_NONAMESPACES="-DWITH_NONAMESPACES" ##define to remove nsmap link dependence fi # the enable-ipv6 option adds the -DWITH_IPV6 to the # library compilation thus enabling IPv6 @%:@ Check whether --enable-ipv6 was given. if test "${enable_ipv6+set}" = set; then : enableval=$enable_ipv6; with_ipv6="$enable_ipv6" else with_ipv6="no" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enable ipv6 in library" >&5 $as_echo_n "checking for enable ipv6 in library... " >&6; } if test "x$with_ipv6" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SOAPCPP2_IPV6="-DWITH_IPV6 -DWITH_NO_IPV6_V6ONLY" ##define to add IPv6 support else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # the zlib installation prefix path @%:@ Check whether --with-zlib was given. if test "${with_zlib+set}" = set; then : withval=$with_zlib; ZLIB=$withval fi # the OpenSSL installation prefix path @%:@ Check whether --with-openssl was given. if test "${with_openssl+set}" = set; then : withval=$with_openssl; OPENSSL=$withval fi # the disable-ssl option removes the dependence on OpenSSL @%:@ Check whether --enable-ssl was given. if test "${enable_ssl+set}" = set; then : enableval=$enable_ssl; with_openssl="$enable_openssl" else with_openssl="yes" fi # the enable-gnutls option enables GNUTLS in favor of OpenSSL @%:@ Check whether --enable-gnutls was given. if test "${enable_gnutls+set}" = set; then : enableval=$enable_gnutls; with_gnutls="$enable_gnutls" else with_gnutls="no" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for disable openssl in library" >&5 $as_echo_n "checking for disable openssl in library... " >&6; } if test "x$with_openssl" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enable gnutls in library" >&5 $as_echo_n "checking for enable gnutls in library... " >&6; } if test "x$with_gnutls" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } WSDL2H_EXTRA_FLAGS="-DWITH_GNUTLS -DWITH_GZIP" WSDL2H_EXTRA_LIBS="${WSDL2H_EXTRA_LIBS} -lgnutls -lgcrypt -lgpg-error -lz" SAMPLE_INCLUDES= SAMPLE_SSL_LIBS="-lgnutls -lgcrypt -lgpg-error -lz" WSDL2H_SOAP_CPP_LIB="libgsoapssl++.a" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } WSDL2H_EXTRA_FLAGS="-DWITH_OPENSSL -DWITH_GZIP" # an ugly hack to get httpda and smdevp plugins to conditionally # compile with wsdl2h when OPENSSL is available WSDL2H_EXTRA_LIBS="${WSDL2H_EXTRA_LIBS} ../plugin/httpda.c ../plugin/smdevp.c ../plugin/threads.c -lssl -lcrypto -lz" SAMPLE_INCLUDES= SAMPLE_SSL_LIBS="-lssl -lcrypto -lz" WSDL2H_SOAP_CPP_LIB="libgsoapssl++.a" fi if test -n "$ZLIB"; then WSDL2H_EXTRA_FLAGS="-I${ZLIB}/include ${WSDL2H_EXTRA_FLAGS}" WSDL2H_EXTRA_LIBS="-L${ZLIB}/lib ${WSDL2H_EXTRA_LIBS}" SAMPLE_INCLUDES="-I${ZLIB}/include ${SAMPLE_SSL_LIBS}" SAMPLE_SSL_LIBS="-L${ZLIB}/lib ${SAMPLE_SSL_LIBS}" fi if test -n "$OPENSSL"; then WSDL2H_EXTRA_FLAGS="-I${OPENSSL}/include ${WSDL2H_EXTRA_FLAGS}" WSDL2H_EXTRA_LIBS="-L${OPENSSL}/lib ${WSDL2H_EXTRA_LIBS}" SAMPLE_INCLUDES="-I${OPENSSL}/include" SAMPLE_SSL_LIBS="-L${OPENSSL}/lib ${SAMPLE_SSL_LIBS}" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } WSDL2H_EXTRA_FLAGS= SAMPLE_SSL_LIBS= SAMPLE_INCLUDES= WSDL2H_SOAP_CPP_LIB="libgsoap++.a" fi # enable the compile of the samples @%:@ Check whether --enable-samples was given. if test "${enable_samples+set}" = set; then : enableval=$enable_samples; case "${enableval}" in yes) samples=true ;; no) samples=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-samples" "$LINENO" 5 ;; esac else samples=false fi if test x$samples = xtrue; then ENABLE_SAMPLES_TRUE= ENABLE_SAMPLES_FALSE='#' else ENABLE_SAMPLES_TRUE='#' ENABLE_SAMPLES_FALSE= fi if test x$samples = xtrue; then SAMPLE_DIRS=". samples" else SAMPLE_DIRS= fi if test x$LEX = xflex; then LEX_DEFINE=-DWITH_FLEX LEX_FLAGS="-l" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No 'flex' command detected on current path: trying existing scanner" >&5 $as_echo "$as_me: WARNING: No 'flex' command detected on current path: trying existing scanner" >&2;} LEX_DEFINE=-DWITH_LEX LEX_FLAGS= fi # check if we must define -DWITH_BISON if test "$YACC" = "bison -y"; then BISON_DEFINE=-DWITH_BISON YACC_LIB= else BISON_DEFINE=-DWITH_YACC YACC_LIB="-ly" fi ac_config_files="$ac_config_files Makefile gsoap.pc gsoap++.pc gsoapck.pc gsoapck++.pc gsoapssl.pc gsoapssl++.pc gsoap/Makefile gsoap/src/Makefile gsoap/wsdl/Makefile gsoap/samples/Makefile gsoap/samples/autotest/Makefile gsoap/samples/aws/Makefile gsoap/samples/calc/Makefile gsoap/samples/calc++/Makefile gsoap/samples/chaining/Makefile gsoap/samples/chaining++/Makefile gsoap/samples/databinding/Makefile gsoap/samples/dime/Makefile gsoap/samples/dom/Makefile gsoap/samples/oneway/Makefile gsoap/samples/oneway++/Makefile gsoap/samples/factory/Makefile gsoap/samples/factorytest/Makefile gsoap/samples/gmt/Makefile gsoap/samples/googleapi/Makefile gsoap/samples/hello/Makefile gsoap/samples/httpcookies/Makefile gsoap/samples/lu/Makefile gsoap/samples/magic/Makefile gsoap/samples/mashup/Makefile gsoap/samples/mashup++/Makefile gsoap/samples/mtom/Makefile gsoap/samples/mtom-stream/Makefile gsoap/samples/polytest/Makefile gsoap/samples/primes/Makefile gsoap/samples/roll/Makefile gsoap/samples/router/Makefile gsoap/samples/rss/Makefile gsoap/samples/ssl/Makefile gsoap/samples/template/Makefile gsoap/samples/udp/Makefile gsoap/samples/varparam/Makefile gsoap/samples/wsa/Makefile gsoap/samples/wsrm/Makefile gsoap/samples/wsse/Makefile gsoap/samples/wst/Makefile gsoap/samples/xml-rpc-json/Makefile gsoap/samples/rest/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIB@&t@OBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DEBUG_COMPILE_TRUE}" && test -z "${DEBUG_COMPILE_FALSE}"; then as_fn_error $? "conditional \"DEBUG_COMPILE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_SAMPLES_TRUE}" && test -z "${ENABLE_SAMPLES_FALSE}"; then as_fn_error $? "conditional \"ENABLE_SAMPLES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by gsoap $as_me 2.8, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ gsoap config.status 2.8 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX @%:@@%:@ Running $as_me. @%:@@%:@ _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "gsoap.pc") CONFIG_FILES="$CONFIG_FILES gsoap.pc" ;; "gsoap++.pc") CONFIG_FILES="$CONFIG_FILES gsoap++.pc" ;; "gsoapck.pc") CONFIG_FILES="$CONFIG_FILES gsoapck.pc" ;; "gsoapck++.pc") CONFIG_FILES="$CONFIG_FILES gsoapck++.pc" ;; "gsoapssl.pc") CONFIG_FILES="$CONFIG_FILES gsoapssl.pc" ;; "gsoapssl++.pc") CONFIG_FILES="$CONFIG_FILES gsoapssl++.pc" ;; "gsoap/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/Makefile" ;; "gsoap/src/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/src/Makefile" ;; "gsoap/wsdl/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/wsdl/Makefile" ;; "gsoap/samples/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/Makefile" ;; "gsoap/samples/autotest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/autotest/Makefile" ;; "gsoap/samples/aws/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/aws/Makefile" ;; "gsoap/samples/calc/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/calc/Makefile" ;; "gsoap/samples/calc++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/calc++/Makefile" ;; "gsoap/samples/chaining/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/chaining/Makefile" ;; "gsoap/samples/chaining++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/chaining++/Makefile" ;; "gsoap/samples/databinding/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/databinding/Makefile" ;; "gsoap/samples/dime/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/dime/Makefile" ;; "gsoap/samples/dom/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/dom/Makefile" ;; "gsoap/samples/oneway/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/oneway/Makefile" ;; "gsoap/samples/oneway++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/oneway++/Makefile" ;; "gsoap/samples/factory/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/factory/Makefile" ;; "gsoap/samples/factorytest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/factorytest/Makefile" ;; "gsoap/samples/gmt/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/gmt/Makefile" ;; "gsoap/samples/googleapi/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/googleapi/Makefile" ;; "gsoap/samples/hello/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/hello/Makefile" ;; "gsoap/samples/httpcookies/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/httpcookies/Makefile" ;; "gsoap/samples/lu/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/lu/Makefile" ;; "gsoap/samples/magic/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/magic/Makefile" ;; "gsoap/samples/mashup/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mashup/Makefile" ;; "gsoap/samples/mashup++/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mashup++/Makefile" ;; "gsoap/samples/mtom/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mtom/Makefile" ;; "gsoap/samples/mtom-stream/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/mtom-stream/Makefile" ;; "gsoap/samples/polytest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/polytest/Makefile" ;; "gsoap/samples/primes/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/primes/Makefile" ;; "gsoap/samples/roll/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/roll/Makefile" ;; "gsoap/samples/router/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/router/Makefile" ;; "gsoap/samples/rss/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/rss/Makefile" ;; "gsoap/samples/ssl/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/ssl/Makefile" ;; "gsoap/samples/template/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/template/Makefile" ;; "gsoap/samples/udp/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/udp/Makefile" ;; "gsoap/samples/varparam/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/varparam/Makefile" ;; "gsoap/samples/wsa/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsa/Makefile" ;; "gsoap/samples/wsrm/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsrm/Makefile" ;; "gsoap/samples/wsse/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wsse/Makefile" ;; "gsoap/samples/wst/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/wst/Makefile" ;; "gsoap/samples/xml-rpc-json/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/xml-rpc-json/Makefile" ;; "gsoap/samples/rest/Makefile") CONFIG_FILES="$CONFIG_FILES gsoap/samples/rest/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi gsoap-2.8.91/autom4te.cache/traces.30000644000175000017500000014467413525245157016466 0ustar ellertellertm4trace:configure.ac:2: -1- AC_INIT([gsoap], [2.8]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^_?A[CHUM]_]) m4trace:configure.ac:2: -1- m4_pattern_forbid([_AC_]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) m4trace:configure.ac:2: -1- m4_pattern_allow([^AS_FLAGS$]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^_?m4_]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^dnl$]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^_?AS_]) m4trace:configure.ac:2: -1- AC_SUBST([SHELL]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([SHELL]) m4trace:configure.ac:2: -1- m4_pattern_allow([^SHELL$]) m4trace:configure.ac:2: -1- AC_SUBST([PATH_SEPARATOR]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PATH_SEPARATOR]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PATH_SEPARATOR$]) m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_NAME], [m4_ifdef([AC_PACKAGE_NAME], ['AC_PACKAGE_NAME'])]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_NAME]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_TARNAME], [m4_ifdef([AC_PACKAGE_TARNAME], ['AC_PACKAGE_TARNAME'])]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_TARNAME]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_VERSION], [m4_ifdef([AC_PACKAGE_VERSION], ['AC_PACKAGE_VERSION'])]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_VERSION]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_STRING], [m4_ifdef([AC_PACKAGE_STRING], ['AC_PACKAGE_STRING'])]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_STRING]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_URL], [m4_ifdef([AC_PACKAGE_URL], ['AC_PACKAGE_URL'])]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_URL]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.ac:2: -1- AC_SUBST([exec_prefix], [NONE]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([exec_prefix]) m4trace:configure.ac:2: -1- m4_pattern_allow([^exec_prefix$]) m4trace:configure.ac:2: -1- AC_SUBST([prefix], [NONE]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([prefix]) m4trace:configure.ac:2: -1- m4_pattern_allow([^prefix$]) m4trace:configure.ac:2: -1- AC_SUBST([program_transform_name], [s,x,x,]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([program_transform_name]) m4trace:configure.ac:2: -1- m4_pattern_allow([^program_transform_name$]) m4trace:configure.ac:2: -1- AC_SUBST([bindir], ['${exec_prefix}/bin']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([bindir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^bindir$]) m4trace:configure.ac:2: -1- AC_SUBST([sbindir], ['${exec_prefix}/sbin']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([sbindir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^sbindir$]) m4trace:configure.ac:2: -1- AC_SUBST([libexecdir], ['${exec_prefix}/libexec']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([libexecdir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^libexecdir$]) m4trace:configure.ac:2: -1- AC_SUBST([datarootdir], ['${prefix}/share']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([datarootdir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^datarootdir$]) m4trace:configure.ac:2: -1- AC_SUBST([datadir], ['${datarootdir}']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([datadir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^datadir$]) m4trace:configure.ac:2: -1- AC_SUBST([sysconfdir], ['${prefix}/etc']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([sysconfdir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^sysconfdir$]) m4trace:configure.ac:2: -1- AC_SUBST([sharedstatedir], ['${prefix}/com']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([sharedstatedir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^sharedstatedir$]) m4trace:configure.ac:2: -1- AC_SUBST([localstatedir], ['${prefix}/var']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([localstatedir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^localstatedir$]) m4trace:configure.ac:2: -1- AC_SUBST([includedir], ['${prefix}/include']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([includedir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^includedir$]) m4trace:configure.ac:2: -1- AC_SUBST([oldincludedir], ['/usr/include']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([oldincludedir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^oldincludedir$]) m4trace:configure.ac:2: -1- AC_SUBST([docdir], [m4_ifset([AC_PACKAGE_TARNAME], ['${datarootdir}/doc/${PACKAGE_TARNAME}'], ['${datarootdir}/doc/${PACKAGE}'])]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([docdir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^docdir$]) m4trace:configure.ac:2: -1- AC_SUBST([infodir], ['${datarootdir}/info']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([infodir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^infodir$]) m4trace:configure.ac:2: -1- AC_SUBST([htmldir], ['${docdir}']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([htmldir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^htmldir$]) m4trace:configure.ac:2: -1- AC_SUBST([dvidir], ['${docdir}']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([dvidir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^dvidir$]) m4trace:configure.ac:2: -1- AC_SUBST([pdfdir], ['${docdir}']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([pdfdir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^pdfdir$]) m4trace:configure.ac:2: -1- AC_SUBST([psdir], ['${docdir}']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([psdir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^psdir$]) m4trace:configure.ac:2: -1- AC_SUBST([libdir], ['${exec_prefix}/lib']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([libdir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^libdir$]) m4trace:configure.ac:2: -1- AC_SUBST([localedir], ['${datarootdir}/locale']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([localedir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^localedir$]) m4trace:configure.ac:2: -1- AC_SUBST([mandir], ['${datarootdir}/man']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([mandir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^mandir$]) m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */ @%:@undef PACKAGE_NAME]) m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */ @%:@undef PACKAGE_TARNAME]) m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */ @%:@undef PACKAGE_VERSION]) m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */ @%:@undef PACKAGE_STRING]) m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */ @%:@undef PACKAGE_BUGREPORT]) m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_URL]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_URL], [/* Define to the home page for this package. */ @%:@undef PACKAGE_URL]) m4trace:configure.ac:2: -1- AC_SUBST([DEFS]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([DEFS]) m4trace:configure.ac:2: -1- m4_pattern_allow([^DEFS$]) m4trace:configure.ac:2: -1- AC_SUBST([ECHO_C]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([ECHO_C]) m4trace:configure.ac:2: -1- m4_pattern_allow([^ECHO_C$]) m4trace:configure.ac:2: -1- AC_SUBST([ECHO_N]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([ECHO_N]) m4trace:configure.ac:2: -1- m4_pattern_allow([^ECHO_N$]) m4trace:configure.ac:2: -1- AC_SUBST([ECHO_T]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([ECHO_T]) m4trace:configure.ac:2: -1- m4_pattern_allow([^ECHO_T$]) m4trace:configure.ac:2: -1- AC_SUBST([LIBS]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.ac:2: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:2: -1- AC_SUBST([build_alias]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([build_alias]) m4trace:configure.ac:2: -1- m4_pattern_allow([^build_alias$]) m4trace:configure.ac:2: -1- AC_SUBST([host_alias]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([host_alias]) m4trace:configure.ac:2: -1- m4_pattern_allow([^host_alias$]) m4trace:configure.ac:2: -1- AC_SUBST([target_alias]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([target_alias]) m4trace:configure.ac:2: -1- m4_pattern_allow([^target_alias$]) m4trace:configure.ac:3: -1- AM_INIT_AUTOMAKE([foreign]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) m4trace:configure.ac:3: -1- AM_AUTOMAKE_VERSION([1.14]) m4trace:configure.ac:3: -1- AC_REQUIRE_AUX_FILE([install-sh]) m4trace:configure.ac:3: -1- AC_SUBST([INSTALL_PROGRAM]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([INSTALL_PROGRAM]) m4trace:configure.ac:3: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) m4trace:configure.ac:3: -1- AC_SUBST([INSTALL_SCRIPT]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([INSTALL_SCRIPT]) m4trace:configure.ac:3: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) m4trace:configure.ac:3: -1- AC_SUBST([INSTALL_DATA]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([INSTALL_DATA]) m4trace:configure.ac:3: -1- m4_pattern_allow([^INSTALL_DATA$]) m4trace:configure.ac:3: -1- AC_SUBST([am__isrc], [' -I$(srcdir)']) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([am__isrc]) m4trace:configure.ac:3: -1- m4_pattern_allow([^am__isrc$]) m4trace:configure.ac:3: -1- _AM_SUBST_NOTMAKE([am__isrc]) m4trace:configure.ac:3: -1- AC_SUBST([CYGPATH_W]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([CYGPATH_W]) m4trace:configure.ac:3: -1- m4_pattern_allow([^CYGPATH_W$]) m4trace:configure.ac:3: -1- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME']) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([PACKAGE]) m4trace:configure.ac:3: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.ac:3: -1- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION']) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([VERSION]) m4trace:configure.ac:3: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.ac:3: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE]) m4trace:configure.ac:3: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.ac:3: -1- AH_OUTPUT([PACKAGE], [/* Name of package */ @%:@undef PACKAGE]) m4trace:configure.ac:3: -1- AC_DEFINE_TRACE_LITERAL([VERSION]) m4trace:configure.ac:3: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.ac:3: -1- AH_OUTPUT([VERSION], [/* Version number of package */ @%:@undef VERSION]) m4trace:configure.ac:3: -1- AC_REQUIRE_AUX_FILE([missing]) m4trace:configure.ac:3: -1- AC_SUBST([ACLOCAL]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([ACLOCAL]) m4trace:configure.ac:3: -1- m4_pattern_allow([^ACLOCAL$]) m4trace:configure.ac:3: -1- AC_SUBST([AUTOCONF]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([AUTOCONF]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AUTOCONF$]) m4trace:configure.ac:3: -1- AC_SUBST([AUTOMAKE]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([AUTOMAKE]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AUTOMAKE$]) m4trace:configure.ac:3: -1- AC_SUBST([AUTOHEADER]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([AUTOHEADER]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AUTOHEADER$]) m4trace:configure.ac:3: -1- AC_SUBST([MAKEINFO]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([MAKEINFO]) m4trace:configure.ac:3: -1- m4_pattern_allow([^MAKEINFO$]) m4trace:configure.ac:3: -1- AC_SUBST([install_sh]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([install_sh]) m4trace:configure.ac:3: -1- m4_pattern_allow([^install_sh$]) m4trace:configure.ac:3: -1- AC_SUBST([STRIP]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([STRIP]) m4trace:configure.ac:3: -1- m4_pattern_allow([^STRIP$]) m4trace:configure.ac:3: -1- AC_SUBST([INSTALL_STRIP_PROGRAM]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([INSTALL_STRIP_PROGRAM]) m4trace:configure.ac:3: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) m4trace:configure.ac:3: -1- AC_REQUIRE_AUX_FILE([install-sh]) m4trace:configure.ac:3: -1- AC_SUBST([MKDIR_P]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([MKDIR_P]) m4trace:configure.ac:3: -1- m4_pattern_allow([^MKDIR_P$]) m4trace:configure.ac:3: -1- AC_SUBST([mkdir_p], ['$(MKDIR_P)']) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([mkdir_p]) m4trace:configure.ac:3: -1- m4_pattern_allow([^mkdir_p$]) m4trace:configure.ac:3: -1- AC_SUBST([AWK]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([AWK]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AWK$]) m4trace:configure.ac:3: -1- AC_SUBST([SET_MAKE]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([SET_MAKE]) m4trace:configure.ac:3: -1- m4_pattern_allow([^SET_MAKE$]) m4trace:configure.ac:3: -1- AC_SUBST([am__leading_dot]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([am__leading_dot]) m4trace:configure.ac:3: -1- m4_pattern_allow([^am__leading_dot$]) m4trace:configure.ac:3: -1- AC_SUBST([AMTAR], ['$${TAR-tar}']) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([AMTAR]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AMTAR$]) m4trace:configure.ac:3: -1- AC_SUBST([am__tar]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([am__tar]) m4trace:configure.ac:3: -1- m4_pattern_allow([^am__tar$]) m4trace:configure.ac:3: -1- AC_SUBST([am__untar]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([am__untar]) m4trace:configure.ac:3: -1- m4_pattern_allow([^am__untar$]) m4trace:configure.ac:3: -1- AM_SILENT_RULES m4trace:configure.ac:3: -1- AC_SUBST([AM_V]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([AM_V]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_V$]) m4trace:configure.ac:3: -1- _AM_SUBST_NOTMAKE([AM_V]) m4trace:configure.ac:3: -1- AC_SUBST([AM_DEFAULT_V]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([AM_DEFAULT_V]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_DEFAULT_V$]) m4trace:configure.ac:3: -1- _AM_SUBST_NOTMAKE([AM_DEFAULT_V]) m4trace:configure.ac:3: -1- AC_SUBST([AM_DEFAULT_VERBOSITY]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([AM_DEFAULT_VERBOSITY]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_DEFAULT_VERBOSITY$]) m4trace:configure.ac:3: -1- AC_SUBST([AM_BACKSLASH]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([AM_BACKSLASH]) m4trace:configure.ac:3: -1- m4_pattern_allow([^AM_BACKSLASH$]) m4trace:configure.ac:3: -1- _AM_SUBST_NOTMAKE([AM_BACKSLASH]) m4trace:configure.ac:5: -1- AC_CANONICAL_HOST m4trace:configure.ac:5: -1- AC_CANONICAL_BUILD m4trace:configure.ac:5: -1- AC_REQUIRE_AUX_FILE([config.sub]) m4trace:configure.ac:5: -1- AC_REQUIRE_AUX_FILE([config.guess]) m4trace:configure.ac:5: -1- AC_SUBST([build], [$ac_cv_build]) m4trace:configure.ac:5: -1- AC_SUBST_TRACE([build]) m4trace:configure.ac:5: -1- m4_pattern_allow([^build$]) m4trace:configure.ac:5: -1- AC_SUBST([build_cpu], [$[1]]) m4trace:configure.ac:5: -1- AC_SUBST_TRACE([build_cpu]) m4trace:configure.ac:5: -1- m4_pattern_allow([^build_cpu$]) m4trace:configure.ac:5: -1- AC_SUBST([build_vendor], [$[2]]) m4trace:configure.ac:5: -1- AC_SUBST_TRACE([build_vendor]) m4trace:configure.ac:5: -1- m4_pattern_allow([^build_vendor$]) m4trace:configure.ac:5: -1- AC_SUBST([build_os]) m4trace:configure.ac:5: -1- AC_SUBST_TRACE([build_os]) m4trace:configure.ac:5: -1- m4_pattern_allow([^build_os$]) m4trace:configure.ac:5: -1- AC_SUBST([host], [$ac_cv_host]) m4trace:configure.ac:5: -1- AC_SUBST_TRACE([host]) m4trace:configure.ac:5: -1- m4_pattern_allow([^host$]) m4trace:configure.ac:5: -1- AC_SUBST([host_cpu], [$[1]]) m4trace:configure.ac:5: -1- AC_SUBST_TRACE([host_cpu]) m4trace:configure.ac:5: -1- m4_pattern_allow([^host_cpu$]) m4trace:configure.ac:5: -1- AC_SUBST([host_vendor], [$[2]]) m4trace:configure.ac:5: -1- AC_SUBST_TRACE([host_vendor]) m4trace:configure.ac:5: -1- m4_pattern_allow([^host_vendor$]) m4trace:configure.ac:5: -1- AC_SUBST([host_os]) m4trace:configure.ac:5: -1- AC_SUBST_TRACE([host_os]) m4trace:configure.ac:5: -1- m4_pattern_allow([^host_os$]) m4trace:configure.ac:8: -1- _m4_warn([obsolete], ['AM_CONFIG_HEADER': this macro is obsolete. You should use the 'AC_CONFIG_HEADERS' macro instead.], [aclocal.m4:766: AM_CONFIG_HEADER is expanded from... configure.ac:8: the top level]) m4trace:configure.ac:8: -1- AC_CONFIG_HEADERS([config.h]) m4trace:configure.ac:11: -1- AC_SUBST([SET_MAKE]) m4trace:configure.ac:11: -1- AC_SUBST_TRACE([SET_MAKE]) m4trace:configure.ac:11: -1- m4_pattern_allow([^SET_MAKE$]) m4trace:configure.ac:13: -1- AC_SUBST([CXX]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([CXX]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CXX$]) m4trace:configure.ac:13: -1- AC_SUBST([CXXFLAGS]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([CXXFLAGS]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CXXFLAGS$]) m4trace:configure.ac:13: -1- AC_SUBST([LDFLAGS]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([LDFLAGS]) m4trace:configure.ac:13: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.ac:13: -1- AC_SUBST([LIBS]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.ac:13: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:13: -1- AC_SUBST([CPPFLAGS]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([CPPFLAGS]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:13: -1- AC_SUBST([CXX]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([CXX]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CXX$]) m4trace:configure.ac:13: -1- AC_SUBST([ac_ct_CXX]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([ac_ct_CXX]) m4trace:configure.ac:13: -1- m4_pattern_allow([^ac_ct_CXX$]) m4trace:configure.ac:13: -1- AC_SUBST([EXEEXT], [$ac_cv_exeext]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([EXEEXT]) m4trace:configure.ac:13: -1- m4_pattern_allow([^EXEEXT$]) m4trace:configure.ac:13: -1- AC_SUBST([OBJEXT], [$ac_cv_objext]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([OBJEXT]) m4trace:configure.ac:13: -1- m4_pattern_allow([^OBJEXT$]) m4trace:configure.ac:13: -1- AC_SUBST([DEPDIR], ["${am__leading_dot}deps"]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([DEPDIR]) m4trace:configure.ac:13: -1- m4_pattern_allow([^DEPDIR$]) m4trace:configure.ac:13: -1- AC_SUBST([am__include]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([am__include]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__include$]) m4trace:configure.ac:13: -1- AC_SUBST([am__quote]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([am__quote]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__quote$]) m4trace:configure.ac:13: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) m4trace:configure.ac:13: -1- AC_SUBST([AMDEP_TRUE]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([AMDEP_TRUE]) m4trace:configure.ac:13: -1- m4_pattern_allow([^AMDEP_TRUE$]) m4trace:configure.ac:13: -1- AC_SUBST([AMDEP_FALSE]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([AMDEP_FALSE]) m4trace:configure.ac:13: -1- m4_pattern_allow([^AMDEP_FALSE$]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE]) m4trace:configure.ac:13: -1- AC_SUBST([AMDEPBACKSLASH]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([AMDEPBACKSLASH]) m4trace:configure.ac:13: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH]) m4trace:configure.ac:13: -1- AC_SUBST([am__nodep]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([am__nodep]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__nodep$]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([am__nodep]) m4trace:configure.ac:13: -1- AC_SUBST([CXXDEPMODE], [depmode=$am_cv_CXX_dependencies_compiler_type]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([CXXDEPMODE]) m4trace:configure.ac:13: -1- m4_pattern_allow([^CXXDEPMODE$]) m4trace:configure.ac:13: -1- AM_CONDITIONAL([am__fastdepCXX], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3]) m4trace:configure.ac:13: -1- AC_SUBST([am__fastdepCXX_TRUE]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([am__fastdepCXX_TRUE]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$]) m4trace:configure.ac:13: -1- AC_SUBST([am__fastdepCXX_FALSE]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([am__fastdepCXX_FALSE]) m4trace:configure.ac:13: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE]) m4trace:configure.ac:13: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE]) m4trace:configure.ac:14: -1- AC_SUBST([CC]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- AC_SUBST([CFLAGS]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([CFLAGS]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CFLAGS$]) m4trace:configure.ac:14: -1- AC_SUBST([LDFLAGS]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([LDFLAGS]) m4trace:configure.ac:14: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.ac:14: -1- AC_SUBST([LIBS]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.ac:14: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:14: -1- AC_SUBST([CPPFLAGS]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([CPPFLAGS]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:14: -1- AC_SUBST([CC]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- AC_SUBST([CC]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- AC_SUBST([CC]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- AC_SUBST([CC]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:14: -1- AC_SUBST([ac_ct_CC]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([ac_ct_CC]) m4trace:configure.ac:14: -1- m4_pattern_allow([^ac_ct_CC$]) m4trace:configure.ac:14: -1- AC_REQUIRE_AUX_FILE([compile]) m4trace:configure.ac:14: -1- AC_SUBST([CCDEPMODE], [depmode=$am_cv_CC_dependencies_compiler_type]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([CCDEPMODE]) m4trace:configure.ac:14: -1- m4_pattern_allow([^CCDEPMODE$]) m4trace:configure.ac:14: -1- AM_CONDITIONAL([am__fastdepCC], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) m4trace:configure.ac:14: -1- AC_SUBST([am__fastdepCC_TRUE]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([am__fastdepCC_TRUE]) m4trace:configure.ac:14: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) m4trace:configure.ac:14: -1- AC_SUBST([am__fastdepCC_FALSE]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([am__fastdepCC_FALSE]) m4trace:configure.ac:14: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) m4trace:configure.ac:14: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE]) m4trace:configure.ac:14: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE]) m4trace:configure.ac:15: -1- AM_PROG_CC_C_O m4trace:configure.ac:16: -1- AC_SUBST([LEX]) m4trace:configure.ac:16: -1- AC_SUBST_TRACE([LEX]) m4trace:configure.ac:16: -1- m4_pattern_allow([^LEX$]) m4trace:configure.ac:16: -1- AC_SUBST([LEX_OUTPUT_ROOT], [$ac_cv_prog_lex_root]) m4trace:configure.ac:16: -1- AC_SUBST_TRACE([LEX_OUTPUT_ROOT]) m4trace:configure.ac:16: -1- m4_pattern_allow([^LEX_OUTPUT_ROOT$]) m4trace:configure.ac:16: -1- AC_SUBST([LEXLIB]) m4trace:configure.ac:16: -1- AC_SUBST_TRACE([LEXLIB]) m4trace:configure.ac:16: -1- m4_pattern_allow([^LEXLIB$]) m4trace:configure.ac:16: -1- AC_DEFINE_TRACE_LITERAL([YYTEXT_POINTER]) m4trace:configure.ac:16: -1- m4_pattern_allow([^YYTEXT_POINTER$]) m4trace:configure.ac:16: -1- AH_OUTPUT([YYTEXT_POINTER], [/* Define to 1 if `lex\' declares `yytext\' as a `char *\' by default, not a `char@<:@@:>@\'. */ @%:@undef YYTEXT_POINTER]) m4trace:configure.ac:17: -1- AC_SUBST([YACC]) m4trace:configure.ac:17: -1- AC_SUBST_TRACE([YACC]) m4trace:configure.ac:17: -1- m4_pattern_allow([^YACC$]) m4trace:configure.ac:17: -1- AC_SUBST([YACC]) m4trace:configure.ac:17: -1- AC_SUBST_TRACE([YACC]) m4trace:configure.ac:17: -1- m4_pattern_allow([^YACC$]) m4trace:configure.ac:17: -1- AC_SUBST([YFLAGS]) m4trace:configure.ac:17: -1- AC_SUBST_TRACE([YFLAGS]) m4trace:configure.ac:17: -1- m4_pattern_allow([^YFLAGS$]) m4trace:configure.ac:18: -1- AC_SUBST([CPP]) m4trace:configure.ac:18: -1- AC_SUBST_TRACE([CPP]) m4trace:configure.ac:18: -1- m4_pattern_allow([^CPP$]) m4trace:configure.ac:18: -1- AC_SUBST([CPPFLAGS]) m4trace:configure.ac:18: -1- AC_SUBST_TRACE([CPPFLAGS]) m4trace:configure.ac:18: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:18: -1- AC_SUBST([CPP]) m4trace:configure.ac:18: -1- AC_SUBST_TRACE([CPP]) m4trace:configure.ac:18: -1- m4_pattern_allow([^CPP$]) m4trace:configure.ac:19: -1- AC_SUBST([RANLIB]) m4trace:configure.ac:19: -1- AC_SUBST_TRACE([RANLIB]) m4trace:configure.ac:19: -1- m4_pattern_allow([^RANLIB$]) m4trace:configure.ac:21: -1- AC_SUBST([LN_S], [$as_ln_s]) m4trace:configure.ac:21: -1- AC_SUBST_TRACE([LN_S]) m4trace:configure.ac:21: -1- m4_pattern_allow([^LN_S$]) m4trace:configure.ac:22: -1- AC_SUBST([AWK]) m4trace:configure.ac:22: -1- AC_SUBST_TRACE([AWK]) m4trace:configure.ac:22: -1- m4_pattern_allow([^AWK$]) m4trace:configure.ac:90: -1- AC_SUBST([SAMPLE_EXTRA_LIBS]) m4trace:configure.ac:90: -1- AC_SUBST_TRACE([SAMPLE_EXTRA_LIBS]) m4trace:configure.ac:90: -1- m4_pattern_allow([^SAMPLE_EXTRA_LIBS$]) m4trace:configure.ac:91: -1- AC_SUBST([platform]) m4trace:configure.ac:91: -1- AC_SUBST_TRACE([platform]) m4trace:configure.ac:91: -1- m4_pattern_allow([^platform$]) m4trace:configure.ac:94: -1- AC_SUBST([GREP]) m4trace:configure.ac:94: -1- AC_SUBST_TRACE([GREP]) m4trace:configure.ac:94: -1- m4_pattern_allow([^GREP$]) m4trace:configure.ac:94: -1- AC_SUBST([EGREP]) m4trace:configure.ac:94: -1- AC_SUBST_TRACE([EGREP]) m4trace:configure.ac:94: -1- m4_pattern_allow([^EGREP$]) m4trace:configure.ac:94: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS]) m4trace:configure.ac:94: -1- m4_pattern_allow([^STDC_HEADERS$]) m4trace:configure.ac:94: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if you have the ANSI C header files. */ @%:@undef STDC_HEADERS]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_ARPA_INET_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_ARPA_INET_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_XLOCALE_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_XLOCALE_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_ERRNO_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_ERRNO_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_FCNTL_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_FCNTL_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_CTYPE_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_CTYPE_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_LIMITS_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_LIMITS_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_FLOAT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_FLOAT_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_MATH_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_MATH_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_NETDB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_NETDB_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_NETINET_IN_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_NETINET_IN_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDLIB_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRING_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRINGS_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDINT_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_INTTYPES_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_TIME_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_TIME_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_SYS_INTTYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_INTTYPES_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_SYS_SOCKET_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_SOCKET_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TYPES_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_SYS_TIME_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TIME_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_SYS_TIMEB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TIMEB_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_UNISTD_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_POLL_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_POLL_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_OPENSSL_SSL_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_OPENSSL_SSL_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_GNUTLS_GNUTLS_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_GNUTLS_GNUTLS_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_ZLIB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_ZLIB_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TYPES_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_STAT_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDLIB_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRING_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_MEMORY_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRINGS_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_INTTYPES_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDINT_H]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_UNISTD_H]) m4trace:configure.ac:98: -1- AC_DEFINE_TRACE_LITERAL([const]) m4trace:configure.ac:98: -1- m4_pattern_allow([^const$]) m4trace:configure.ac:98: -1- AH_OUTPUT([const], [/* Define to empty if `const\' does not conform to ANSI C. */ @%:@undef const]) m4trace:configure.ac:99: -1- AC_DEFINE_TRACE_LITERAL([size_t]) m4trace:configure.ac:99: -1- m4_pattern_allow([^size_t$]) m4trace:configure.ac:99: -1- AH_OUTPUT([size_t], [/* Define to `unsigned int\' if does not define. */ @%:@undef size_t]) m4trace:configure.ac:100: -1- AC_DEFINE_TRACE_LITERAL([TIME_WITH_SYS_TIME]) m4trace:configure.ac:100: -1- m4_pattern_allow([^TIME_WITH_SYS_TIME$]) m4trace:configure.ac:100: -1- AH_OUTPUT([TIME_WITH_SYS_TIME], [/* Define to 1 if you can safely include both and . */ @%:@undef TIME_WITH_SYS_TIME]) m4trace:configure.ac:101: -1- AC_DEFINE_TRACE_LITERAL([TM_IN_SYS_TIME]) m4trace:configure.ac:101: -1- m4_pattern_allow([^TM_IN_SYS_TIME$]) m4trace:configure.ac:101: -1- AH_OUTPUT([TM_IN_SYS_TIME], [/* Define to 1 if your declares `struct tm\'. */ @%:@undef TM_IN_SYS_TIME]) m4trace:configure.ac:106: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_TM_TM_GMTOFF]) m4trace:configure.ac:106: -1- m4_pattern_allow([^HAVE_STRUCT_TM_TM_GMTOFF$]) m4trace:configure.ac:106: -1- AH_OUTPUT([HAVE_STRUCT_TM_TM_GMTOFF], [/* Define to 1 if `tm_gmtoff\' is a member of `struct tm\'. */ @%:@undef HAVE_STRUCT_TM_TM_GMTOFF]) m4trace:configure.ac:106: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_TM___TM_GMTOFF]) m4trace:configure.ac:106: -1- m4_pattern_allow([^HAVE_STRUCT_TM___TM_GMTOFF$]) m4trace:configure.ac:106: -1- AH_OUTPUT([HAVE_STRUCT_TM___TM_GMTOFF], [/* Define to 1 if `__tm_gmtoff\' is a member of `struct tm\'. */ @%:@undef HAVE_STRUCT_TM___TM_GMTOFF]) m4trace:configure.ac:109: -1- AH_OUTPUT([HAVE_SYS_TIME_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TIME_H]) m4trace:configure.ac:109: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_UNISTD_H]) m4trace:configure.ac:109: -1- AH_OUTPUT([HAVE_ALARM], [/* Define to 1 if you have the `alarm\' function. */ @%:@undef HAVE_ALARM]) m4trace:configure.ac:109: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS mktime.$ac_objext"]) m4trace:configure.ac:109: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.ac:109: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:109: -1- AC_LIBSOURCE([mktime.c]) m4trace:configure.ac:110: -1- _m4_warn([obsolete], [The macro `AC_TYPE_SIGNAL' is obsolete. You should run autoupdate.], [../../lib/autoconf/types.m4:759: AC_TYPE_SIGNAL is expanded from... configure.ac:110: the top level]) m4trace:configure.ac:110: -1- AC_DEFINE_TRACE_LITERAL([RETSIGTYPE]) m4trace:configure.ac:110: -1- m4_pattern_allow([^RETSIGTYPE$]) m4trace:configure.ac:110: -1- AH_OUTPUT([RETSIGTYPE], [/* Define as the return type of signal handlers (`int\' or `void\'). */ @%:@undef RETSIGTYPE]) m4trace:configure.ac:111: -1- AH_OUTPUT([HAVE_STRFTIME], [/* Define to 1 if you have the `strftime\' function. */ @%:@undef HAVE_STRFTIME]) m4trace:configure.ac:111: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRFTIME]) m4trace:configure.ac:111: -1- m4_pattern_allow([^HAVE_STRFTIME$]) m4trace:configure.ac:111: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRFTIME]) m4trace:configure.ac:111: -1- m4_pattern_allow([^HAVE_STRFTIME$]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_RANDOM], [/* Define to 1 if you have the `random\' function. */ @%:@undef HAVE_RANDOM]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_GETTIMEOFDAY], [/* Define to 1 if you have the `gettimeofday\' function. */ @%:@undef HAVE_GETTIMEOFDAY]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_FTIME], [/* Define to 1 if you have the `ftime\' function. */ @%:@undef HAVE_FTIME]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_LOCALTIME_R], [/* Define to 1 if you have the `localtime_r\' function. */ @%:@undef HAVE_LOCALTIME_R]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_TIMEGM], [/* Define to 1 if you have the `timegm\' function. */ @%:@undef HAVE_TIMEGM]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_GMTIME], [/* Define to 1 if you have the `gmtime\' function. */ @%:@undef HAVE_GMTIME]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_GMTIME_R], [/* Define to 1 if you have the `gmtime_r\' function. */ @%:@undef HAVE_GMTIME_R]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_ASCTIME], [/* Define to 1 if you have the `asctime\' function. */ @%:@undef HAVE_ASCTIME]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_ASCTIME_R], [/* Define to 1 if you have the `asctime_r\' function. */ @%:@undef HAVE_ASCTIME_R]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_MEMSET], [/* Define to 1 if you have the `memset\' function. */ @%:@undef HAVE_MEMSET]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_SELECT], [/* Define to 1 if you have the `select\' function. */ @%:@undef HAVE_SELECT]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_SOCKET], [/* Define to 1 if you have the `socket\' function. */ @%:@undef HAVE_SOCKET]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_SNPRINTF], [/* Define to 1 if you have the `snprintf\' function. */ @%:@undef HAVE_SNPRINTF]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRCHR], [/* Define to 1 if you have the `strchr\' function. */ @%:@undef HAVE_STRCHR]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRERROR], [/* Define to 1 if you have the `strerror\' function. */ @%:@undef HAVE_STRERROR]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRERROR_R], [/* Define to 1 if you have the `strerror_r\' function. */ @%:@undef HAVE_STRERROR_R]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRLCPY], [/* Define to 1 if you have the `strlcpy\' function. */ @%:@undef HAVE_STRLCPY]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRRCHR], [/* Define to 1 if you have the `strrchr\' function. */ @%:@undef HAVE_STRRCHR]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRSTR], [/* Define to 1 if you have the `strstr\' function. */ @%:@undef HAVE_STRSTR]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRTOL], [/* Define to 1 if you have the `strtol\' function. */ @%:@undef HAVE_STRTOL]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRTOUL], [/* Define to 1 if you have the `strtoul\' function. */ @%:@undef HAVE_STRTOUL]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRTOLL], [/* Define to 1 if you have the `strtoll\' function. */ @%:@undef HAVE_STRTOLL]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRTOULL], [/* Define to 1 if you have the `strtoull\' function. */ @%:@undef HAVE_STRTOULL]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRTOLD], [/* Define to 1 if you have the `strtold\' function. */ @%:@undef HAVE_STRTOLD]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRTOD], [/* Define to 1 if you have the `strtod\' function. */ @%:@undef HAVE_STRTOD]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRTOF], [/* Define to 1 if you have the `strtof\' function. */ @%:@undef HAVE_STRTOF]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRTOLD_L], [/* Define to 1 if you have the `strtold_l\' function. */ @%:@undef HAVE_STRTOLD_L]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRTOD_L], [/* Define to 1 if you have the `strtod_l\' function. */ @%:@undef HAVE_STRTOD_L]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_STRTOF_L], [/* Define to 1 if you have the `strtof_l\' function. */ @%:@undef HAVE_STRTOF_L]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_SSCANF], [/* Define to 1 if you have the `sscanf\' function. */ @%:@undef HAVE_SSCANF]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_SSCANF_L], [/* Define to 1 if you have the `sscanf_l\' function. */ @%:@undef HAVE_SSCANF_L]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_SNPRINTF], [/* Define to 1 if you have the `snprintf\' function. */ @%:@undef HAVE_SNPRINTF]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_SPRINTF_L], [/* Define to 1 if you have the `sprintf_l\' function. */ @%:@undef HAVE_SPRINTF_L]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_WCTOMB], [/* Define to 1 if you have the `wctomb\' function. */ @%:@undef HAVE_WCTOMB]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_MBTOWC], [/* Define to 1 if you have the `mbtowc\' function. */ @%:@undef HAVE_MBTOWC]) m4trace:configure.ac:112: -1- AH_OUTPUT([HAVE_POLL], [/* Define to 1 if you have the `poll\' function. */ @%:@undef HAVE_POLL]) m4trace:configure.ac:115: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ISNAN]) m4trace:configure.ac:115: -1- m4_pattern_allow([^HAVE_ISNAN$]) m4trace:configure.ac:115: -1- AH_OUTPUT([HAVE_ISNAN], [/* isnan */ @%:@undef HAVE_ISNAN]) m4trace:configure.ac:116: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ISINF]) m4trace:configure.ac:116: -1- m4_pattern_allow([^HAVE_ISINF$]) m4trace:configure.ac:116: -1- AH_OUTPUT([HAVE_ISINF], [/* isinf */ @%:@undef HAVE_ISINF]) m4trace:configure.ac:124: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ISNAN]) m4trace:configure.ac:124: -1- m4_pattern_allow([^HAVE_ISNAN$]) m4trace:configure.ac:124: -1- AH_OUTPUT([HAVE_ISNAN], [/* isnan */ @%:@undef HAVE_ISNAN]) m4trace:configure.ac:136: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ISINF]) m4trace:configure.ac:136: -1- m4_pattern_allow([^HAVE_ISINF$]) m4trace:configure.ac:136: -1- AH_OUTPUT([HAVE_ISINF], [/* isinf */ @%:@undef HAVE_ISINF]) m4trace:configure.ac:145: -1- AH_OUTPUT([HAVE_GETHOSTBYNAME_R], [/* Define to 1 if you have the `gethostbyname_r\' function. */ @%:@undef HAVE_GETHOSTBYNAME_R]) m4trace:configure.ac:145: -1- AC_DEFINE_TRACE_LITERAL([HAVE_GETHOSTBYNAME_R]) m4trace:configure.ac:145: -1- m4_pattern_allow([^HAVE_GETHOSTBYNAME_R$]) m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDLIB_H]) m4trace:configure.ac:146: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STDLIB_H]) m4trace:configure.ac:146: -1- m4_pattern_allow([^HAVE_STDLIB_H$]) m4trace:configure.ac:146: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MALLOC]) m4trace:configure.ac:146: -1- m4_pattern_allow([^HAVE_MALLOC$]) m4trace:configure.ac:146: -1- AH_OUTPUT([HAVE_MALLOC], [/* Define to 1 if your system has a GNU libc compatible `malloc\' function, and to 0 otherwise. */ @%:@undef HAVE_MALLOC]) m4trace:configure.ac:146: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MALLOC]) m4trace:configure.ac:146: -1- m4_pattern_allow([^HAVE_MALLOC$]) m4trace:configure.ac:146: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS malloc.$ac_objext"]) m4trace:configure.ac:146: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.ac:146: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:146: -1- AC_LIBSOURCE([malloc.c]) m4trace:configure.ac:146: -1- AC_DEFINE_TRACE_LITERAL([malloc]) m4trace:configure.ac:146: -1- m4_pattern_allow([^malloc$]) m4trace:configure.ac:146: -1- AH_OUTPUT([malloc], [/* Define to rpl_malloc if the replacement function should be used. */ @%:@undef malloc]) m4trace:configure.ac:157: -1- AM_CONDITIONAL([DEBUG_COMPILE], [test x$debug = xtrue]) m4trace:configure.ac:157: -1- AC_SUBST([DEBUG_COMPILE_TRUE]) m4trace:configure.ac:157: -1- AC_SUBST_TRACE([DEBUG_COMPILE_TRUE]) m4trace:configure.ac:157: -1- m4_pattern_allow([^DEBUG_COMPILE_TRUE$]) m4trace:configure.ac:157: -1- AC_SUBST([DEBUG_COMPILE_FALSE]) m4trace:configure.ac:157: -1- AC_SUBST_TRACE([DEBUG_COMPILE_FALSE]) m4trace:configure.ac:157: -1- m4_pattern_allow([^DEBUG_COMPILE_FALSE$]) m4trace:configure.ac:157: -1- _AM_SUBST_NOTMAKE([DEBUG_COMPILE_TRUE]) m4trace:configure.ac:157: -1- _AM_SUBST_NOTMAKE([DEBUG_COMPILE_FALSE]) m4trace:configure.ac:163: -1- AC_SUBST([SOAPCPP2_DEBUG]) m4trace:configure.ac:163: -1- AC_SUBST_TRACE([SOAPCPP2_DEBUG]) m4trace:configure.ac:163: -1- m4_pattern_allow([^SOAPCPP2_DEBUG$]) m4trace:configure.ac:168: -1- AC_SUBST([SOAPCPP2_IMPORTPATH]) m4trace:configure.ac:168: -1- AC_SUBST_TRACE([SOAPCPP2_IMPORTPATH]) m4trace:configure.ac:168: -1- m4_pattern_allow([^SOAPCPP2_IMPORTPATH$]) m4trace:configure.ac:173: -1- AC_SUBST([WSDL2H_IMPORTPATH]) m4trace:configure.ac:173: -1- AC_SUBST_TRACE([WSDL2H_IMPORTPATH]) m4trace:configure.ac:173: -1- m4_pattern_allow([^WSDL2H_IMPORTPATH$]) m4trace:configure.ac:181: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:181: the top level]) m4trace:configure.ac:190: -1- AC_SUBST([SOAPCPP2_NONAMESPACES]) m4trace:configure.ac:190: -1- AC_SUBST_TRACE([SOAPCPP2_NONAMESPACES]) m4trace:configure.ac:190: -1- m4_pattern_allow([^SOAPCPP2_NONAMESPACES$]) m4trace:configure.ac:198: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:198: the top level]) m4trace:configure.ac:207: -1- AC_SUBST([SOAPCPP2_IPV6]) m4trace:configure.ac:207: -1- AC_SUBST_TRACE([SOAPCPP2_IPV6]) m4trace:configure.ac:207: -1- m4_pattern_allow([^SOAPCPP2_IPV6$]) m4trace:configure.ac:226: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:226: the top level]) m4trace:configure.ac:233: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... ../../lib/autoconf/general.m4:1472: AC_ARG_ENABLE is expanded from... configure.ac:233: the top level]) m4trace:configure.ac:275: -1- AC_SUBST([WSDL2H_EXTRA_FLAGS]) m4trace:configure.ac:275: -1- AC_SUBST_TRACE([WSDL2H_EXTRA_FLAGS]) m4trace:configure.ac:275: -1- m4_pattern_allow([^WSDL2H_EXTRA_FLAGS$]) m4trace:configure.ac:276: -1- AC_SUBST([WSDL2H_EXTRA_LIBS]) m4trace:configure.ac:276: -1- AC_SUBST_TRACE([WSDL2H_EXTRA_LIBS]) m4trace:configure.ac:276: -1- m4_pattern_allow([^WSDL2H_EXTRA_LIBS$]) m4trace:configure.ac:277: -1- AC_SUBST([SAMPLE_INCLUDES]) m4trace:configure.ac:277: -1- AC_SUBST_TRACE([SAMPLE_INCLUDES]) m4trace:configure.ac:277: -1- m4_pattern_allow([^SAMPLE_INCLUDES$]) m4trace:configure.ac:278: -1- AC_SUBST([SAMPLE_SSL_LIBS]) m4trace:configure.ac:278: -1- AC_SUBST_TRACE([SAMPLE_SSL_LIBS]) m4trace:configure.ac:278: -1- m4_pattern_allow([^SAMPLE_SSL_LIBS$]) m4trace:configure.ac:279: -1- AC_SUBST([WSDL2H_SOAP_CPP_LIB]) m4trace:configure.ac:279: -1- AC_SUBST_TRACE([WSDL2H_SOAP_CPP_LIB]) m4trace:configure.ac:279: -1- m4_pattern_allow([^WSDL2H_SOAP_CPP_LIB$]) m4trace:configure.ac:289: -1- AM_CONDITIONAL([ENABLE_SAMPLES], [test x$samples = xtrue]) m4trace:configure.ac:289: -1- AC_SUBST([ENABLE_SAMPLES_TRUE]) m4trace:configure.ac:289: -1- AC_SUBST_TRACE([ENABLE_SAMPLES_TRUE]) m4trace:configure.ac:289: -1- m4_pattern_allow([^ENABLE_SAMPLES_TRUE$]) m4trace:configure.ac:289: -1- AC_SUBST([ENABLE_SAMPLES_FALSE]) m4trace:configure.ac:289: -1- AC_SUBST_TRACE([ENABLE_SAMPLES_FALSE]) m4trace:configure.ac:289: -1- m4_pattern_allow([^ENABLE_SAMPLES_FALSE$]) m4trace:configure.ac:289: -1- _AM_SUBST_NOTMAKE([ENABLE_SAMPLES_TRUE]) m4trace:configure.ac:289: -1- _AM_SUBST_NOTMAKE([ENABLE_SAMPLES_FALSE]) m4trace:configure.ac:290: -1- AC_SUBST([ENABLE_SAMPLES]) m4trace:configure.ac:290: -1- AC_SUBST_TRACE([ENABLE_SAMPLES]) m4trace:configure.ac:290: -1- m4_pattern_allow([^ENABLE_SAMPLES$]) m4trace:configure.ac:297: -1- AC_SUBST([SAMPLE_DIRS]) m4trace:configure.ac:297: -1- AC_SUBST_TRACE([SAMPLE_DIRS]) m4trace:configure.ac:297: -1- m4_pattern_allow([^SAMPLE_DIRS$]) m4trace:configure.ac:307: -1- AC_SUBST([LEX_DEFINE]) m4trace:configure.ac:307: -1- AC_SUBST_TRACE([LEX_DEFINE]) m4trace:configure.ac:307: -1- m4_pattern_allow([^LEX_DEFINE$]) m4trace:configure.ac:308: -1- AC_SUBST([LEX_FLAGS]) m4trace:configure.ac:308: -1- AC_SUBST_TRACE([LEX_FLAGS]) m4trace:configure.ac:308: -1- m4_pattern_allow([^LEX_FLAGS$]) m4trace:configure.ac:309: -1- AC_SUBST([LEXLIB]) m4trace:configure.ac:309: -1- AC_SUBST_TRACE([LEXLIB]) m4trace:configure.ac:309: -1- m4_pattern_allow([^LEXLIB$]) m4trace:configure.ac:319: -1- AC_SUBST([BISON_DEFINE]) m4trace:configure.ac:319: -1- AC_SUBST_TRACE([BISON_DEFINE]) m4trace:configure.ac:319: -1- m4_pattern_allow([^BISON_DEFINE$]) m4trace:configure.ac:320: -1- AC_SUBST([YACC_LIB]) m4trace:configure.ac:320: -1- AC_SUBST_TRACE([YACC_LIB]) m4trace:configure.ac:320: -1- m4_pattern_allow([^YACC_LIB$]) m4trace:configure.ac:366: -1- AC_CONFIG_FILES([ Makefile \ gsoap.pc gsoap++.pc gsoapck.pc gsoapck++.pc gsoapssl.pc gsoapssl++.pc \ gsoap/Makefile \ gsoap/src/Makefile \ gsoap/wsdl/Makefile \ gsoap/samples/Makefile \ gsoap/samples/autotest/Makefile \ gsoap/samples/aws/Makefile \ gsoap/samples/calc/Makefile \ gsoap/samples/calc++/Makefile \ gsoap/samples/chaining/Makefile \ gsoap/samples/chaining++/Makefile \ gsoap/samples/databinding/Makefile \ gsoap/samples/dime/Makefile \ gsoap/samples/dom/Makefile \ gsoap/samples/oneway/Makefile \ gsoap/samples/oneway++/Makefile \ gsoap/samples/factory/Makefile \ gsoap/samples/factorytest/Makefile \ gsoap/samples/gmt/Makefile \ gsoap/samples/googleapi/Makefile \ gsoap/samples/hello/Makefile \ gsoap/samples/httpcookies/Makefile \ gsoap/samples/lu/Makefile \ gsoap/samples/magic/Makefile \ gsoap/samples/mashup/Makefile \ gsoap/samples/mashup++/Makefile \ gsoap/samples/mtom/Makefile \ gsoap/samples/mtom-stream/Makefile \ gsoap/samples/polytest/Makefile \ gsoap/samples/primes/Makefile \ gsoap/samples/roll/Makefile \ gsoap/samples/router/Makefile \ gsoap/samples/rss/Makefile \ gsoap/samples/ssl/Makefile \ gsoap/samples/template/Makefile \ gsoap/samples/udp/Makefile \ gsoap/samples/varparam/Makefile \ gsoap/samples/wsa/Makefile \ gsoap/samples/wsrm/Makefile \ gsoap/samples/wsse/Makefile \ gsoap/samples/wst/Makefile \ gsoap/samples/xml-rpc-json/Makefile gsoap/samples/rest/Makefile ]) m4trace:configure.ac:367: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs]) m4trace:configure.ac:367: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.ac:367: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:367: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs]) m4trace:configure.ac:367: -1- AC_SUBST_TRACE([LTLIBOBJS]) m4trace:configure.ac:367: -1- m4_pattern_allow([^LTLIBOBJS$]) m4trace:configure.ac:367: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) m4trace:configure.ac:367: -1- AC_SUBST([am__EXEEXT_TRUE]) m4trace:configure.ac:367: -1- AC_SUBST_TRACE([am__EXEEXT_TRUE]) m4trace:configure.ac:367: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) m4trace:configure.ac:367: -1- AC_SUBST([am__EXEEXT_FALSE]) m4trace:configure.ac:367: -1- AC_SUBST_TRACE([am__EXEEXT_FALSE]) m4trace:configure.ac:367: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) m4trace:configure.ac:367: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) m4trace:configure.ac:367: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) m4trace:configure.ac:367: -1- AC_SUBST_TRACE([top_builddir]) m4trace:configure.ac:367: -1- AC_SUBST_TRACE([top_build_prefix]) m4trace:configure.ac:367: -1- AC_SUBST_TRACE([srcdir]) m4trace:configure.ac:367: -1- AC_SUBST_TRACE([abs_srcdir]) m4trace:configure.ac:367: -1- AC_SUBST_TRACE([top_srcdir]) m4trace:configure.ac:367: -1- AC_SUBST_TRACE([abs_top_srcdir]) m4trace:configure.ac:367: -1- AC_SUBST_TRACE([builddir]) m4trace:configure.ac:367: -1- AC_SUBST_TRACE([abs_builddir]) m4trace:configure.ac:367: -1- AC_SUBST_TRACE([abs_top_builddir]) m4trace:configure.ac:367: -1- AC_SUBST_TRACE([INSTALL]) m4trace:configure.ac:367: -1- AC_SUBST_TRACE([MKDIR_P]) gsoap-2.8.91/configure.scan0000644000175000017500000000344313525245157015130 0ustar ellertellert# Process this file with autoconf to produce a configure script. AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS) AC_CONFIG_SRCDIR([config.h.in]) AC_CONFIG_HEADER([config.h]) # Checks for programs. AC_PROG_CXX AC_PROG_CC AC_PROG_INSTALL AC_PROG_LN_S AC_PROG_MAKE_SET AC_PROG_AWK AC_PROG_CPP AC_PROG_LEX AC_PROG_RANLIB AC_PROG_YACC # Checks for libraries. # FIXME: Replace `main' with a function in `-le': AC_CHECK_LIB([e], [main]) # FIXME: Replace `main' with a function in `-lgsoap': AC_CHECK_LIB([gsoap], [main]) # FIXME: Replace `main' with a function in `-links': AC_CHECK_LIB([inks], [main]) # FIXME: Replace `main' with a function in `-lm': AC_CHECK_LIB([m], [main]) # Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS([arpa/inet.h errno.h fcntl.h limits.h netdb.h netinet/in.h stddef.h stdlib.h string.h strings.h sys/socket.h sys/time.h unistd.h]) # Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_TYPE_SIZE_T AC_HEADER_TIME AC_STRUCT_TM # Checks for library functions. AC_FUNC_MALLOC AC_FUNC_MKTIME AC_TYPE_SIGNAL AC_FUNC_STRFTIME AC_FUNC_STRTOD AC_CHECK_FUNCS([gethostbyname localtime_r memset pow select socket strchr strerror strrchr strstr strtol strtoul]) AC_CONFIG_FILES([Makefile soapcpp2/Makefile soapcpp2/samples/Makefile soapcpp2/samples/calc/Makefile soapcpp2/samples/dime/Makefile soapcpp2/samples/factory/Makefile soapcpp2/samples/factorytest/Makefile soapcpp2/samples/mybubble/Makefile soapcpp2/samples/quote/Makefile soapcpp2/samples/quote2/Makefile soapcpp2/samples/quote3/Makefile soapcpp2/samples/quotex/Makefile soapcpp2/src/Makefile]) AC_OUTPUT gsoap-2.8.91/mkinstalldirs0000755000175000017500000000132213525245163015076 0ustar ellertellert#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain # $Id: mkinstalldirs,v 1.13 1999/01/05 03:18:55 bje Exp $ errstatus=0 for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case "$pathcomp" in -* ) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr fi fi pathcomp="$pathcomp/" done done exit $errstatus # mkinstalldirs ends here gsoap-2.8.91/config.guess0000644000175000017500000013135513525245157014622 0ustar ellertellert#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2014 Free Software Foundation, Inc. timestamp='2014-01-01' # This file 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 3 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, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches with a ChangeLog entry to config-patches@gnu.org. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; or1k:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: gsoap-2.8.91/changelog.md0000644000175000017500000032575213525245157014564 0ustar ellertellert [![Go down](images/go-down.png) Go down](#latest) to view the latest changes Version 1.1 (1/1/2000) --- - Added typedef conventions. - Added enumerations. - Added hexBinary encoding. - Added base64 encoding. - Enable pass by reference operator (&) for output parameter. - Enable specification of methods in classes. Version 1.2 (9/9/2001) --- - Added WSDL generator. Version 1.2w (9/14/2001) --- - Win32 port. - Fixed a socket communication problem in win32 version. - Added namespace name pattern matching to ease validation. Version 1.2.1 (10/24/2001) --- - Added chunked HTTP 1.1 transfer support. - Improved buffering. - Fixed a problem with nested vector allocation. Version 1.2.2 (11/2/2001) --- - Support for special XML element names with dots, underscores, and center dots (see documentation section 5.3). - Fixed a decoding problem with dynamic array of pointers to polymorphic objects. - Fixed an encoding problem with enumerations. - Added a "safe-mode" flag to disable serialization of multi-referenced objects with `soap_disable_href = 1;` - You can set this global flag anywere in the code, but at least before serialization is performed. It will disable the use of href attributes when sending multi-reference data. Instead, the data is copied in the payload. When set, this flag will hang the serializer when sending cyclic data structures. Version 1.2.3 (12/5/2001) --- - Added bool type encoding/decoding. - Added dynamic multi-dimensional arrays. - Added support for primitive polymorphic types. - Added full support for CDATA content decoding. - More convenient customization of SOAP Headers and Faults. No separate soapheader.h and soapfault.h files required (and therefore no .cpp files have to be created for these). Instead, the compiler generates customized SOAP Header and SOAP Fault marshalling routines when struct/class `SOAP_ENV__Fault` and/or `SOAP_ENV__Header` are specified in the header file input to the compiler. - On demand generation of the marshalling routines for the primitive types, which reduces the size of the executables. - Fixed a WSDL incompatibility problem in the WSDL generator. - Improved decoding of multi-reference elements (no *`xsi:type`* required anymore in receiving message so gSOAP does not break). - Improved support for encoding/decoding indirect data (e.g. pointers to pointers to data). - Improved encoding of data with the same pointers to shared data but with the shared data declared with different XML schema types (formerly encoded as multi-reference data which could cause type incmpatibilities at the receiving side). For example, in the declarations `typedef char *xsd__NCName; xsd__NCName *s="SOAP"; char *t = s;` the pointers s and t point to the same data, but will not be encoded as multi-reference data since the types are different. - Added flag `soap_enable_null = 1;` - When set, all NULL pointers will be explicitly encoded. By default, NULL pointers are omitted from the SOAP payload. For example, with this flag set all NULL strings and other NULL pointer data will appear as nil values in the SOAP payload. - Added flag: `soap_enable_embedding = 1;` - When set, multi-reference data will be encoded inline which will guarantee the exact preservation of the structure of the data transmitted. However, some SOAP implementations do not support embedding inline multi-reference data although this encoding style is likely to be included in future verions of the SOAP protocol. The flag is useful when creating C++ applications that need to communicate data to eachother and the data structures need to be preserved. Setting this flag may cause a duplication of multi-reference data by the receiver created with the SOAP stub compiler when the data is part of a struct/class or array. The data is not copied by the receiver when the struct/class or arrays use pointers to the data type. - Added the ability to declare virtual destructors. - Fixed a compilation error with fixed-size array of pointers. - Fixed a problem with padding in Base64 (en/de)coding. - Fixed XML entity decoding (hexadecimal). - Added encoding of sparse arrays. A sparse array MUST be declared as a (fixed-size of dynamic) array of pointers. NULL pointer values are omitted from the output and *`SOAP-ENC:position`* attributes are used for non-NULL elements. - Changed `soap_put` and `soap_get` functions to include explicit schema type parameters. This fixed a problem with Web services that need to return typedef-ed XML schema types The new stdsoap.cpp and stdsoap.h files are incompatible with the previous version(s). - Added the ability to ignore the names of accessors when decoding fields through the use of a leading underscore (`_`) in a field name. For example: `ns__mymethod(xsd__string in, xsd__string &_return);` - When used to invoke a remote method, the actual element name of the remote return parameter used by the service is insignificant. - Improved memory management. Added new function: `soap_destroy()` to remove all class instances. - Improved documentation. - Added `time_t` type support, but still need to add encoding/decoding routines to the runtime (next version). - Added `wchar_t` type support, but still need to add encoding/decoding routines to the runtime (next version). Version 1.2.4 (12/17/2001) --- - Added support for wide character strings (`wchar_t*`). - Added support for `time_t` type. - Added support for SOAP literal encoding. - Fixed an obscure bug in the deserialization of data from the SOAP4R toolkit that caused the deserializer to hang. - Fixed a problem with the `soap_disable_href` flag. - Fixed a problem with the position attributes in sparse multi-dimensional arrays. - Fixed a problem with the generation of .nsmap files. - Fixed a problem with mixed content decoding in strings. Version 1.2.5 (12/27/2001) --- - Fixed a memory leak in the block allocation scheme used for strings, hexBinary, and base64 types. - Fixed a bug in the WSDL generator for fixed-size arrays. - Fixed a problem with the use of trailing underscores in field names in struct/class declarations. Version 1.2.6 (1/25/2002) --- - Improved portability. - Improved id/href hash table efficiency and storage. - Improved namespace URI matching with wildcards. - Improved stand-alone deployment. - Added `soap_disable_response_count` flag. - Fixed operator declaration parsing (cast operators). - Fixed a WSDL generator bug for output parameters and enumeration types. - Renamed function `soap_return_fault()` into `soap_send_fault()`. Version 2.0 (2/2/2002) --- - Rewrote the compiler (soapcpp2) and the run-time engine libraries to create a thread safe implementation. Versions 1.2.7 and 2.0.1 (2/11/2002) --- - Added new soapcpp2 compiler options (-h -c -d -p). - Added optional specification of service name, location, and namespace URI in header file. - Improved interoperability. Versions 1.2.8 and 2.0.2 (2/24/2002) --- - Added function callbacks to support customized I/O and HTTP operations. This allows for plug-in HTTP code, NSAPI interface code, reading/writing from/to files or string buffers, etc. - Added HTTP 1.0/1.1 keep-alive support. - Added HTTP 1.1 chunked transfer support. - Added `soap_disable_request_count` flag. - Added `soap_enable_array_overflow` flag. - Added type naming conventions to serialize elements without generating *`xsi:type`* attributes. - Fixed a fixed-size array decoding problem (type mismatch). - Fixed `` print bug in the WSDL generator. Versions 1.3 and 2.1 (3/10/2002) --- - Added client-side SSL (HTTPS) support (thanks to Massimo Cafaro for his suggestions). - Added a naming convention for dynamic array `__ptr` fields which enables the naming of the XML tags of array elements. - Added WSDL Header and Fault schema generation. - Improved doc/literal encoding style. - Improved WSDL service/schema namespace generation. - Fixed *`SOAP-ENV:Header`* to be self contained. - Fixed WSDL generation of xsd schema types declared as string. - Fixed a method overriding type clash for derived classes. - Fixed spurious occurrence of `id="-1"` with `soap_enable_null` flag enabled. - Fixed a front-end gSOAP compiler problem with forward and cyclic struct declarations. Versions 1.3.1 and 2.1.1 (3/25/2002) --- - Added header file source constructs to support transient data types and transient struct/class fields to control gSOAP's code generatiion window for (de)serialization routines. - Added callback for handling XML elements that are ignored on the receiving side (e.g. because of schema type problems). This feature is intended to enhance the reliability of services/clients. - Added server-side SSL support and included an example multi-threaded stand-alone SSL secure SOAP server example. - Added proxy server support. - Improved message logging in gSOAP 2.1.1 (thanks to Jessie Ragsdale for his suggestions). - Fixed WSDL generation for dynamic arrays. - Fixed deserialization of empty multi-ref derived class instances. Versions 1.3.2 and 2.1.2 (4/15/2002) --- - Added socket timeout management. - Added optional client and server cookie support. - Added support for `maxOccurs="unbounded"` for arbitrary elements in complexTypes (not just limited to SOAP arrays). - Improved generation of schema *`xs:extension`* definitions to allow XML validation in the presence of class overriding. - Fixed ULONG64 type handling. - Fixed light validation problem (now rejects invalid XML schema URIs). - Fixed a deserialization type mismatch with typedef-ed pointer primitives. - Fixed WSDL and schema interoperability problems. Versions 1.3.3 and 2.1.3 (4/27/2002) --- - Added `mustUnderstand` declaration qualifier for SOAP Header processing. - Added `soap::actor` attribute for SOAP Header processing. - Added method-header-part directive to identify methods with header message associations (WSDL requirement). - Added bitmask (de)serialization. - Added FastCGI support. - Improved DLL build support (gSOAP 2.1.3 only). - Improved WinCE support (gSOAP 2.1.3 only, thanks to Sean Ryan for his suggestions). - Improved Mac OS X support. - WSDL generator improvements and fixes. - Workaround a bug in .NET SOAP Headers (non-unique id name values in .NET). - Fixed `disable_href=1` bug. - Fixed XML in string parsing code generation problem. Versions 1.3.4 and 2.1.4 (6/9/2002) --- - Added non-blocking `soap_accept()` with timeout management. - Added support for SOAP Header and Fault declared as classes. - Added syntax for `extern` declarations for transient types and fields. - Added support for SOAP Headers in SOAP Fault messages. - Added one-way SOAP messages (2.1.4 only). - Added support for user-defined (de)serializers (2.1.4 only). - Improved object memory management. - Improved support for AIX and HP platforms. - Fixed proxy server connect bug. - Fixed an OpenSSL bug. - Fixed `soap_instantiate_ClassX()` derived class allocation problem. - Fixed generation of spurious .xsd files when lots of trailing underscores are used by identifiers in the header file. - Fixed syntax error that occured with header files containing cyclic class declarations. - Fixed 'class in struct' and 'vector of classes' VMT initialization bugs. Version 2.1.5 (6/22/2002) --- - Added non-blocking remote method calls (not supported in win32 version). - Added specification of default values for struct/class fields. - Added specification of minOccurs and maxOccurs for struct/class fields. - Added support for the resolution operator `::` in identifiers. - Added abstract method declaration support. - Fixed WSDL generation of SOAP doc/lit. - Fixed `WITH_FASTCGI` option. Version 2.1.6 (7/10/2002) --- - Added DIME attachment support. - Added win32 non-blocking sockets. - Changed `"%lld"` and `"%llu"` format strings into `"%I64d"` and `"%I64u"` format string for win32. - Improved I/O. - Fixed multi-dimensional dynamic array (de)serialization. - Fixed WSDL enum and header namespace generation. Version 2.1.7 (8/6/2002) --- - Added generation of example SOAP/XML request and response messages by the compiler. - Added RSA to SSL stack. - Added two callbacks to the HTTP stack for efficient handling of HTTP headers in Apache-mod and IIS. - Added compiler option -m (malloc() memory control) and updated doc on memory allocation policies. - Added compiler option -i to support #include and #define directives. - Improved HTTP cookie support to handle new and old cookie protocols. - Improved external class (de)serialization support (std::string example is included). - Fixed a SSL+proxy connect problem. - Fixed uninitialized '//gsoap..executable:' string which caused sporadic exits. - Fixed XML literal string encoding problem introduced with DIME. - Fixed and removed WSDL duplicate response elements. - Fixed LONG64 and ULONG64 types for WinCE. Version 2.1.8 (8/28/2002) --- - Added client-side proxy class source code generation. - Added `soap.enable_strict` flag to enable very strict validation of messages (unknown namespace URIs and XML elements are not allowed). - Added `soap.socket_flags` to control socket send and recv flags, e.g. to disable broken pipe signals (`soap.socket_flags=MSG_NOSIGNAL`). - Added `//gsoap ns service method-action` header file directive. - Added server-side `soap_receiver_fault()` and `soap_sender_fault()` functions to return SOAP 1.1 and SOAP 1.2 faults. - Added seeding of the PRNG for SSL. - Added soapcpp2 compiler option '-2' to automate SOAP 1.2 support (SOAP 1.2 features are Beta-release). - Changed keep-alive support (see docs). - Improved WSDL output. - Workaround Bison 1.6 for win32 bug in gSOAP win32 version. - Fixed a wild-card matching bug in `soap_tag_cmp()`. - Fixed a string deserialization problem. - Fixed a deserialization bug that can occur in a client-server combination with gSOAP and Apache Axis. Version 2.1.9 (9/08/2002) --- - Added HTTP proxy authentication. - Added plug-in registry (Beta). - Changed compiler exit status for compilation errors. - Fixed stdin/stdout binary mode for DIME transfer with gSOAP for win32. - Fixed win32 soapcpp2.exe bug in .res.xml file generation. Version 2.1.10 (10/14/2002) --- - Added `//gsoap ns service method-documentation:` directive. - Added provision for additional documentation text with `//gsoap ns service name:` directive. - Added #import pragma to (recursively) import gSOAP header files. - Added plugin features and included a plugin example in 'extras' directory. - Added automake/autoconf to generic gSOAP package (thanks to Christian Aberger). - Added `-DWITH_LOCALTIME` compilation option to control `time_t` (de)serialization. - Changed `time_t` (de)serialization (now uses timegm() and gmtime() to handle UTC). Found that mktime() library call is buggy on some systems. - Improved and reorganized package directory structure. - Fixed DDL linkage problem with instantiate/delete routines dealing with class instance memory management. - Fixed compilation problem with Sun Workshop CC compiler and other compilers that adopt a specfic class VMT structure that could break object (de)serializers. - Fixed bug in WSDL generator with multiple service namespaces. Version 2.1.11 (11/10/2002) --- - Added a multi-functional SOAP router application (message forwarding and message relay server). - Added keep-alive support for asynchronous one-way messages. - Improved parsing and handling of function prototypes and class methods. - Improved modular design to enable the compilation and linkage of multiple client and service modules. - Improved user-defined SOAP Fault detail handling. - Fixed `SSL_accept` bug. - Fixed serialization of pointers to dynamic arrays with multi-references. Version 2.2 (12/12/2002) --- - Added XML attribute (de)serialization support. - Added XSD QName parsing and conversion support (`typedef char *xsd__QName`). - Added compression support (`-DWITH_ZLIB` requires Zlib). - Changed and improved transport and encoding settings by splitting up sending and receiving side flags into separate sets. Deprecated `soap.enable_X` and `soap.disable_X` flags. - Improved keep-alive support (automatic client and server sides). - Fixed a bug in mustUnderstand handling. - Fixed a sporadic crash of the gSOAP compiler under win32. - Fixed user-defined SOAP Fault output in WSDL generator. Version 2.2.1 (12/18/2002) --- - Added callbacks to enable custom streaming of DIME attachments. - Fixed broken serialization of pointers to dynamic arrays with NULL `__ptr`. - Fixed some WSDL issues. Version 2.2.2 (1/25/2003) --- - Added gzip support (`-DWITH_GZIP` requires Zlib). - Added `faccept()` callback. - Improved HTTP chunking. - Fixed OpenSSL and `accept_timeout` (OpenSSL requires blocking sockets). - Fixed HTTP header buffering. - Fixed UTF8 decoding of a subset of characters (2-octet UTF). - Fixed `operator==` parsing. - Fixed a couple of WSDL issues. Version 2.2.3 (3/2/2003) --- - Added server-side HTTP basic authentication. - Improved speed. - Improved Tru64 portability. - Changed `fpost()` function callback signature: added `int port` argument and added port number to the Host: HTTP header. - Fixed memory leak in SSL connect when using OpenSSL DH. - Fixed custom (de)serializer definitions parsing. - Fixed a gzip/deflate bug with large transfers. - Fixed use of `ftime()` for `time_t` (de)serialization with timezones. - Fixed a problem with concurrent access to global namespace table by multiple threads. - Fixed crash with //gsoap name directive. - Fixed deserialization bug with multi-ref object encoding by Apache Axis. Version 2.3.1-8 (9/24/2003) --- - Updated SOAP 1.2 support (implements the SOAP 1.2 recommendation). - Added STL container support and built-in `std::string` encoding. - Added stand-alone Web server example to serve static and dynamic pages with a new HTTP GET plugin. - Added `void*` (de)serialization, e.g. useful to support polymorphism with C applications and as an alternative to union types. - Added XML DOM parser to support SOAP document encoding and for mixing of application data (de)serialization within an XML DOM. - Added `WITH_LEAN` and `WITH_LEANER` compilation flags to improve support for small-memory devices such as WinCE and Palm. - Added `SOAP_XML_CANONICAL` flag for canonical XML output (XML-C14N support and SOAP 1.2 normalization support). - Added `//gsoap ns method-encoding:` directive. - Added `//gsoap ns schema import:` directive. - Added optional class getter and setter methods for object (de)serialization. - Added `volatile` qualifier to indicate that certain type declarations should be treated 'as-is' when types are declared externally (e.g. part of a library). - Added a new string notation for declarations to specify simpleType restriction patterns. - Added soapcpp2 -I option to indicate #import path. - Added support for (de)serialization of application data to C++ iostreams. - Added `fsslauth()` callback. - Added HTTP code error values. - Added `SOAP_MALLOC` and `SOAP_FREE` macros to replace `malloc()` and `free()`. - Added `soap_strdup(soap, string)` to copy strings in gSOAP's memory space. - Added chunked streaming DIME output (thanks to J. Li for his suggestions). - Added `SOAP_SOCKET` for win32 support (thanks to B. Gille for his suggestions). - Added `SO_LINGER` support with `soap.connect_flags`. - Added support for iso-8859-1 encoded XML parsing (default is utf8). - Added #module directive to build shared libraries. - Added C++ namespaces support to enable the compilation and linkage of multiple client and service codes. - Added `WITH_CASEINSENSITIVETAGS` compilation flag to enable case insensitive XML parsing. - Improved WSDL types schema output. - Improved custom (de)serialization (note: extras/stringtest example has been changed). - Improved SOAP literal encoding. - Improved speed. - Improved HTTP1.0/1.1 support. - Removed `soap.defaultNamespace` in favor of automatic SOAP literal output based on `soap.encodingStyle` value. - Fixed GMT to DST localtime conversion, but still issues with Sun Solaris. - Fixed dynamic array `__offset` handling. - Fixed class definition order. - Fixed sporadic memory leak in HTTP cookie reader. - Fixed multi-threaded server-side OpenSSL initialization. - Fixed enumeration-based XML attribute deserialiation. - Fixed *`SOAP-ENC:position`* attribute placement when arrays of pointers are mixed with nillable data. - Fixed crash when parsing incorrect SOAP/XML attribute content. Version 2.4 (12/20/2003) --- - New WSDL parser and importer with improved support for SOAP document style and literal encoding. - Added optional full schema validation (partial by default). Use `SOAP_XML_STRICT` flag. - Added SSL session caching. - Added `soap_set_namespaces()` to switch namespace tables. - Fixed plugin memory leak. REQUIRED CHANGE to plugin allocation and copying. - Fixed server-side blocking SSL accept. Version 2.4.1 (01/07/2004) --- - Changed `_USCORE_` and `_DOT_` naming conventions into `_USCORE` and `_DOT` to improve name mapping. - Updated DOM parser (integrated into core gSOAP library). - Improved WSDL parser and included several new features. - Fixed WSDL schema import and WSDL literal output. Version 2.5 (01/28/2004) --- - Changed default encoding to SOAP RPC literal, as mandated by WS-I Basic Profile 1.0a and best practices. - Added soapcpp2 compiler option -e for backward compatibility to gSOAP 2.4.1 and earlier that use SOAP RPC encoding defaults (helpful when migrating gSOAP projects to 2.5). - Added automatic compiler-side WS-I Basic Profile 1.0a compliance warnings (warns before deployment). - Added `fget()` callback for HTTP GET responses. - Added IPv6 support contributed by Wind River Systems. - Added VxWorks support contributed by Wind River Systems. - Improved SOAP Fault handling. - Improved interop with Axis RPC encoded response messages. - Fixed `std::string` *`xsi:type`* attribute value. - Fixed gSOAP 2.4 problems with serialization of enumeration values outside enumeration range. - Fixed gSOAP 2.4 Pocket PC build problem. - Fixed wsdl2h SOAP Fault and Header output. Version 2.5.1 (02/12/2004) --- - Improved WSDL output and WS-I BP1.0a compliance. - Improved WSDL parser stability. - Fixed problem parsing empty *`xsd:base64Binary`* elements. - Fixed VxWorks and TRU64 portability issues. - Fixed HTTP 400 error problem. - Fixed soapcpp2 2.5 stability problem with one-way messages. Version 2.5.2 (02/23/2004) --- - Fixed WSDL generation warnings. - Fixed LONG64 problem for PalmOS. - Fixed module build link problem and 'components' example. Version 2.6.0 (03/28/2004) --- - Changed default style to doc/lit. - Improved doc/lit WSDL handling. - Improved soapcpp2 sample SOAP/XML message output. - Added proxy support for wsdl2h. - Fixed CONNECT method for proxy+SSL+gzip. Version 2.6.1 (06/07/2004) --- - Added optional multibyte character support. - Improved WSDL output. - Fixed STL container multi-ref deserialization problem with missing data. - Fixed doc/lit server code generation from doc/lit WSDL definitions. Version 2.6.2 (06/12/2004) --- - Added Matlab(tm) code output (documentation is not availabel yet). - Improved wsdl2h output for schema facets. - Updated dom.cpp. - Changed wsdl2h `std::string*` to `std::string` generation (to avoid double pointers `std::string**`). To obtain old behavior, add entry `xsd__string = | std::string* | std::string*` to typemap.dat. - Fixed wsdl2h handling of *`xs:include>`*. - Fixed wsdl2h handling of empty namespaces and absent targetNamespace schema attributes. - Fixed MB char handling. Version 2.7.0a/b/c/d/e/f (09/10/2004, 2/1/2005) --- - Added multipart/related support for SOAP with MIME attachments (SwA). - Added API functions for DIME open and closed layout support. - Added `//gsoap schema elementForm:` and `//gsoap schema attributeForm` directives. - Added `fclosesocket`, `fshutdownsocket`, `fpoll`, `fserveloop` callbacks. - Added `soap.authrealm` string attribute to set basic authentication realm. - Added `soap.prolog` string attribute to output optional XML prolog with processing instructions and directives. - Added soapcpp2 option -t. - Added wsdl2h options -e and -i. - Added Palm OS and Symbian instructions and examples. - Added xml-rpc support and examples. - New `mod_gsoap` directory with modules for Apache 1.x/2.x, IIS, and WinInet - Improved XML validation with `SOAP_XML_STRICT` flag. - Improved memory footprint (reduced code size and reduced serialization overhead). - Improved runtime id-ref serialization and deserialization. - Improved wsdl2h translation. - Updated dom.cpp. - Updated webserver.c. - Fixed issues with namespace qualification in doc/lit messages. - Fixed `SOAP_HREF` error. - Fixed proxy+SSL+zlib+chunking. - Fixed SSL `select()` polling in `frecv()`. - Fixed wsdl2h multidimensional SOAP arrays generate problem. Version 2.7.1 (03/31/2005) --- - Added new style of C++ proxy/object generation (objects derived from soap struct), enabled with soapcpp2 option -i. - Added new features to wsdl2h generation to enable user-defined class/struct extensions such as member data and functions which are declared in typemap.dat. - Added MIME multipart/form-data parsing to support HTTP POST HTML form handling (example included in samples/webserver). - Added built-in memory leak detection enabled with `-DDEBUG`. - Added UDDI v2 API and examples. - Added 'WS' directory with WS protocols, such as WS-Addressing. This part will mature as more WS protocols will be added over time. - Added `fseterror()` callback. - Improved wsdl2h code output. - Enhanced Web server sample code, and httpget and logging plugins. - Fixed base64/hexBinary XML attribute serialization. - Fixed a missing min/maxOccurs check for validation. Version 2.7.2 (05/11/2005) --- - Added SOAP-over-UDP IPv4/IPv6 support with examples. - Added UDDI v2 API publish example. - Improved wsdl2h parser accepting multiple WSDL/XSD files from the command line. - Fixed wsdl2h schema import from included schema bug. - Fixed SOAP 1.2 Fault Subcode handling. Version 2.7.3 (06/27/2005) --- - Added MTOM attachment support. - Added 'plugin' directory with example plug-ins. - Added 'import' directory for commonly #import-ed files such as stlvector.h. - Added HTTP digest authentication plug-in 'plugins/httpda.h'. - Added new import feature to wsdl2h using `ns=URI` convention for typemap.dat files, which enables wsdl2h to parse a WSDL that imports known WSDLs/schemas such as XOP, XML MIME, and WS-Addressing without actually reading the imported WSDL/schemas. - Added soapcpp2 options -C and -S to generate client- or server-only codes. - Added multi-path support for soappcpp2 option -I. - Added C and C++ examples to combine multiple clients and services into one executable, see the samples/components directory in the package. - Improved soapcpp2 option -e to generate SOAP RPC encoding style client/server codes by default (instead of document/literal by default). - Fixed wsdl2h circular import of schemas. - Fixed attributeGroup handling in wsdl2h. - Fixed soapcpp2 handling of 'invisible' tags, e.g. `__any`, that should only be populated after all else failed to match the delivered XML content. - Fixed validation of numeric enum constants with `SOAP_XML_STRICT` validation. - Fixed engine's spurious log file generation issue. Version 2.7.4 (07/24/2005) --- - Added union serialization. - Added `//gsoap ... type-documentation:` directive. - Added `//gsoap ... method-mime-type:` directive. - Added wsdl2h option -g for generating global element/attribute declarations for building modular .h files. - Added wsdl2 option -y for generating typedef synonyms for structs and enums, with improved handling of typedefs by soapcpp2. - Added wsdl2 option -u to disable union generation for *`xs:choice`*. - Improved wsdl2h documentation generation. - Improved wsdl2h and soapcpp2 MIME bindings. - Improved dynamic memory allocation in engine with look-aside buffering. - Fixed wsdl2h *`xs:complexContent/extension/attributeGroup`* translation. - Fixed wsdl2h *`xs:choice`* with min/maxOccurs != 1 translation. - Fixed wsdl2h *`soap:body parts`* attribute. Version 2.7.5 (08/01/2005) --- - Added *`xs:redefine`* processing to wsdl2h. - Added HTML POST application/x-www-form-urlencoded plugin httpform.c (demo samples/webserver). - Improved wsdl2h output. - Fixed wsdl2h handling of duplicate values in single enum list. Version 2.7.6 revision a/b/c/d/e (08/19/2005-02/18/06) --- - Added WS-Security authentication, tokens, and signatures with new 'wsse' plugin, see documentation in 'doc' directory and 'samples/wsse'. - Added 'doc' directory for documentation and moved soapdoc2.html and soapdoc2.pdf. - Added `SOAP_XML_INDENT` flag. - Added `soap_sender_fault_subcode()` and `soap_receiver_fault_subcode()` for SOAP 1.2 subcodes. - Added `WITH_DOM` compile flag to enable flushing serialized and deserialized data to DOM (as well as a stream). - Added soapcpp2 option -L. - Added soapcpp2 option -a. - Added wsdl2h option -a (for backward compatibility). - Added wsdl2h option -d. - Added `WITH_TCPFIN` comile flag to enable optional shutdown with how=1 (TCPFIN) after final sends to force EOF on other side (used to be the default behavior). - Added schema substitutionGroup support. - Added `soap_ssl_init()`. - Improved DOM implementation and documentation. - Improved AS400 portability. - Improved schema choice support. - Fixed wsdl2h multiple schema include issue. - Fixed `soaps2dateTime` and `soap_timegm` functions when `timegm` is not available. - Fixed exc-c14n formatting. - Fixed SOAP 1.2 fault handling. - Fixed missing `soap_flag___item2` issue. - Fixed partial MIME boundary parsing issue. - Fixed base64 parsing with `WITH_FAST`. - Fixed MIME encoding of `\r\r` sequence. - Fixed QName normalization issue. - Fixed relative path schema import. - Fixed MTOM cid matching with URL encoded IDs. - Fixed wide-character (`wchar_t*`) XML attribute handling. - Fixed `std::vector` element id-ref ordering in deserializer. Version 2.7.7 (04/07/2006) --- - Added streaming MTOM support (see also example in samples/mtom-stream). - Added `long double` serialization support with custom serializer (`custom/long_double.h`). - Added automatic detection of application's `soap_malloc()` data overruns in `-DDEBUG` mode. - Improved `time_t` and `struct tm` (`custom/struct_tm.h`) serialization. - Fixed issue with a wrongly generated namespace map entry. - Fixed PalmOS socket connection issues. - Fixed XML attributes with bitmask enumeration (`enum*`) values. Version 2.7.8 revisions a/b/c (06/05/2006-06/24/2006)) --- - Added X509 extension checks. - Added advanced MTOM streaming features. - Added WS-Addressing plugin and demo. - Moved soapcpp2 and wsdl2h to bin directory. - Improved SOAP1.2 MTOM interop. - Changed `soap_send_empty_response` function signature (additional status argument) for HTTP optional response binding. - Changed `fmimewriteopen()` callback signature. - Fixed wsdl2h top-level element and complexType name clash issue. - Fixed HTTP chunking with empty response message body. - Fixed WSSE digest authentication. - Fixed WSDL response element output. - Fixed SOAP 1.2 *`RPC:result`* handling with `SOAP_XML_STRICT` flag. - Fixed WSSE signed response messages. - Fixed Win32 max open connection exceeded checking. - Fixed *`xsi:type`* matching for `__name` fields, which required a signature change of `soap_element_begin_in()` with an additional 'type' parameter (affecting custom deserializers, see custom dir). Version 2.7.9 revisions a/b/c/d/e/f/g/h/i/j/k/l (10/24/2006-09/26/2007) --- - Added wsdl2h option -j to omit the generation of SOAP Header and Faults for customization of these. - Added wsdl2h option -q to generate C++ namespace qualified header files. - Added `SOAP_SSLv3`, `SOAP_TLSv1`, `SOAP_SSL_SKIP_HOST_CHECK` flags. - Added file input and output specifications (with `<` and `>`) to wsdl2h's typemap.dat to specify input and output for wsdl2h. - Added WS-Addressing 2005/03 support. - Added function `soap_free(soap)` that executes `soap_done(soap); free(soap)` and renamed previous `soap_free()` to `soap_temp_free()`. - Added wsdl2h option `-_` to translate `_USCORE`. - Added *`xsd:anyAttribute`* (using DOM parser) with wsdl2h option -d. - Added multi-WSDL types section schema component merging. - Added TCP keep-alive settings. - Added QName list normalization. - Changed soapcpp2 default rule for generating attribute form qualified to unqualified. - Improved wsdl2h SOAP Fault coding. - Improved performance and stability. - Improved portability. - Improved wsdl2h empty namespace handling ("" namespace). - Improved wsdl2h and schema conversion to C and C++. - Improved SSL timeouts and error handling. - Improved soapcpp2 option -i (generate proxy and service classes). - Improved class instance initialization. - Improved use of IPv6. - Improved proxy and server code output for soapcpp2 option -i. - Improved soapcpp2 code output with additional exception checks. - Fixed MIME/MTOM start id handling (SOAP message no longer required to be first attachment). - Fixed WS-Security wsse plugin canonicalization format issue. - Fixed ZIP content remainder parsing (CRC check). - Fixed WSA API handling of messages with MIME/DIME attachments. - Fixed wsdl2h *`xs:include`* relative path includes. - Fixed `_XML` literal string parsing of root attributes. Version 2.7.10 (01/27/2008) --- - Combined pre-built win32, Linux i386, and Mac universal binaries into a single software distribution package to streamline the distribution. - Added new Web service examples and removed XMethods dependence. - Added soapcpp2 option -qname for automatic C++ namespace qualification. - Added HTTP PUT, DELETE, HEAD callback support. - Added ability to derive classes from soap struct (in gSOAP header files). - Updated certificates and fixed cacerts.c. - Improved soapcpp2 option -i proxy/server object generation. - Improved socket timeout handling. - Improved HTTP chunking handling and efficiency. - Improved web server implementation. - Improved soapcpp2 and wsdl2h warning and error reporting. - Fixed dom parser handling of default xml namespace bindings. - Fixed wsdl2h default ("") namespace handling. Version 2.7.11 (07/26/2008) --- - Added new wsseapi signature verification API functions. - Added mutability property of `SOAP_ENV__Header` and `SOAP_ENV__Fault` struct to allow consistent redefinitions and on-the-fly member additions. - Added wsdl2h -r option parameter for web proxy access. - Added MINGW portability. - Added configure option --disable-openssl to build wsdl2h and libraries without OpenSSL. - Added `WITH_C_LOCALE` compilation flag to enable the use of `c_locale` and local-specific numeric conversion routines. - Added WS-Addressing metadata (wsam) support. - Fixed *`xml:lang`* in SOAP 1.2 *`SOAP-ENV:Text`*. - Fixed XML literal strings with maxOccurs="unbounded" - Fixed SSL connection engine issue. - Fixed RPC literal part name handling issue. - Fixed in update: SSL alloc/free issue and s2dateTime. Version 2.7.12 (10/01/2008) --- - Added multi-endpoint connect capability. Endpoint string can be a space-separated list of endpoint URLs, where each URL is tried in turn. - Added `SOAP_SSL_NO_DEFAULT_CA_PATH` option. - Fixed SSL connect issue when the SSL handshake or network connection fails. - Fixed *`xsi:nil`* handling for strings (NULL vs. "") in case of empty elements. - Fixed DOM xmlns="" namespace issue in XML output. - Fixed `IP_MULTICAST_TTL` failure to compile. - Fixed non-critical WSSE API `soap_wsse_verify_nested` code. Version 2.7.13 (03/21/2009) --- - Improved wsdl2h code output. - Updated gsoapWinInet. - Updated DOM xmlns namespace binding handling. - Fixed OpenSSL memory leak. Version 2.7.14 (09/07/2009) --- - Added support for `poll()` to replace `select()` to prevent `FD_EXCEEDED`. - Fixed enum local simpleType restriction attribute initialization. - Fixed utf8 string parsing issue when first char in CDATA could cause problems. - Fixed UDP IPv6 multicast-unicast exchange. - Fixed gzip end-of-stream check. - Fixed wsdl2h portType operation-input/output matching to ensure operations can be safely overloaded. Version 2.7.15 (11/07/2009) --- - Added `soap_read_X()` and `soap_write_X()` macros to simplify object reading and writing. - Fixed `soap_new_X()` functions compilation problem. - Fixed SSL session in context copy. - Fixed win32 `select()` in `tcp_select()`. - Fixed wstrings in unions. - Fixed preservation of CDATA sections in literal XML strings. Version 2.7.16 (04/05/2010) --- - Added soapcpp2 option -T to generate auto-test echo server code with an example in samples/autotest based on 294 patterns for data binding W3C workgroup. - Added soapcpp2 option -b to serialize byte arrays char[] as fixed-size strings (array of *`xsd:byte`* otherwise). - Added *`xsd:duration`* serializer: import custom/duration.h. - Added gsoap header syntax '$' type qualifier to indicate special struct/class members (array length, union discriminators). - Added "colon notation" to attach XML prefixes to C/C++ names without changing the names, an alternative to the `ns__` prefix notation by writing `ns:name` instead of `ns__name` where the former stands for just `name` to the C/C++ compiler. - Added wsdl2h options -z# for backward compatibility flags (-z1, -z2). - Added `SOAP_XML_IGNORENS` to optionally ignore XML namespaces. - Added WS-ReliableMessaging plugin. - Added custom *`xsd:duration`* serializer. - Added WSSE plugin `soap_wsse_set_wsu_id()` to simplify signing of elements (sets the wsu:Id of a given element tag name). - Improved handling of struct/class member name clashes resulting from XML schemas definitions. - Improved SOAP RPC ecoding response element tag acceptance. - Improved VxWorks compatibility. - Fixed FastCGI SOAP/XML processing with MIME attachments. - Fixed `typedef std::string XML`, for literal XML serialization problem. - Fixed a rare incorrect well-formedness error when xmlns default namespaces are absent. - Fixed a zlib compression error when obsolete crc check is used. - Fixed WS-Addressing HTTPS message relay (OpenSSL crash). Version 2.7.17 (05/10/2010) --- - Added WS-Policy 1.2 and 1.5, WS-SecurityPolicy 1.2 support for wsdl2h. - Improved WS-ReliableMessaging interop and verified MT-safety. - Improved WS-Security WSSE plugin documentation. - Fixed soapcpp2 line number error reporting. - Fixed WSSE plugin `soap_wsse_set_wsu_id()`. - Fixed wsdl2h cycle problem with recursive *`xs:include`* and *`xs:import`*. - Fixed enum translation of enum symbols with colons. - Fixed `std::wstring` used as XML attribute value UTF8 encoding (internal stdsoap2 API changed). Version 2.8.0 (09/20/2010) --- - Added wsdl2h option -W: suppress warnings. - Added wsdl2h option -i: for advanced uses only to skip schema imports. - Added automatic *`xsi:nil`* output for NULL pointer members when minOccurs>0 (member has '1' occurence annotation). - Improved wstring and `wchar_t*` handling when `wchar_t` is less than 4 bytes. - Improved use of custom serializers in builds. - Fixed wsdl2h type mapping of nested *`xs:sequence`* and *`xs:choice`*. - Fixed soapcpp2 handling of extension base qualified elements and derived type unqualified elements. - Fixed WSRM message resend buffer leak. - Licensing change for reasons of consistency and transparency: the soapcpp2 tool (2.8.0 and up) is licensed under the same conditions as the wsdl2h tool, which means that soapcpp2 is no longer covered by the gSOAP public license. Version 2.8.1 (01/14/2011) --- - Added WS-Security WSSE plugin-integrated streaming XML encryption. - Added WS-Security WSSE plugin `soap_wsse_sign_only()`. - Added soapcpp2 -f flag to split large output source code files into parts. - Fixed C++ mapping of *`xs:sequence`* with maxOccurs larger than 1. Version 2.8.2 (04/17/2011) --- - Added soapcpp2 -j option to generate C++ proxies and services in alternative format to the -i option. - Fixed wsdl2h issue with optional elements with default value. - Fixed cyclic WSDL import dependences in wsdl2h. - Fixed WSRM server-side fault state handing. - Fixed leading unicode character parsing and conversion issue in literal XML strings. Version 2.8.3 (06/24/2011) --- - Added soapcpp2 -y option to generate C/C++ type access information to the generated sample XML messages, allowing for the verification of C/C++ data access to the actual XML content. - Added JSON support in addition to XML-RPC, see the XML-RPC content in the samples folder. - Improved DOM processing (an optional feature). - Fixed bugs, compilation and porting issues. Version 2.8.4 (10/24/2011) --- - Added NTLM support (enabled with `-DWITH_NTLM`, requires libntlm). - Added WS-Discovery 1.1 support (see doc/wsdd and plugin/wsddapi.h and wsddapi.c). - Added `//gsoap` typed directive to control *`xsi:type`* attribuation per namespace. - Added `SOAP_XML_NOTYPE` flag to disable *`xsi:type`* attributes. - Improved WS-Security encryption (AES, `soap_wsse_add_EncryptedKey_encrypt_only`). - Improved HTTP proxy authentication support (digest and NTLM). - Fixed bugs and portability issues. Version 2.8.5 (11/19/2011) --- - Fixed build issues with WS-Discovery. - Fixed HTTP basic auth crash. - Fixed `WITH_COMPAT` and `WITH_C_LOCALE`. - Fixed wsdl2h output for XSD abstract element extraneous ';'. Version 2.8.6 (12/14/2011) --- - Improved WS-Security compatibility. - Fixed multi and cyclic WSDL import. - Fixed tags of qualified referenced elements. - Fixed C builds for improved portability. Version 2.8.7 (02/07/2012) --- - Added new REST examples. - Added versioning checks to ensure project builds are consistent. - Improved interoperability of wsdl2h output wrt. to element qualification. - Renamed `-DTANDEM` to `-DTANDEM_NONSTOP` to prevent naming conflicts. - Fixed WS-Discovery URL. - Fixed soapcpp2 option -i and -j server chaining. Version 2.8.8 (02/20/2012) --- - Added REST plugin (httppost.c) enhancements and examples. - Added static version checks to prevent linkage to old incompatible libraries that could lead to runtime failures. Version 2.8.9 (06/10/2012) --- - Added examples to interoperate with WCF basicHttp, basicTransportSecurity, basicMessageSecurity, and wsDualHttp. - Added soapcpp2 option -A for service dispatching based on Action values only. - Added wsdl2h option -z3. - Added wsse support for WS-SecureConversation. - Added wsrm5 WS-ReliableMessaging 1.0 2005. - Added iOS plugin with examples. - Improved WS-Policy analysis and reporting. - Fixed and improved wsse plugin for WS-Security interoperability with WCF and other implementations (required a small API change). - Fixed HTTP headers for NTLM. - Fixed httpda plugin OpenSSL init crash in md5evp.c. Version 2.8.10 (08/16/2012) --- - Added soapcpp2 -Q option (C++ namespaces). - Added wsdl2h -b option (bi-directional operations for duplex services). - Updated WS-Addressing and WS-ReliableMessaging plugins, documentation, and examples. Version 2.8.11 (10/14/2012) --- - Added soapcpp2 -0 option to remove SOAP bindings when applicable. - Changed wsdl2h output for the few cases that multiple service bindings are defined, use wsdl2h -Nns for backward compatibility. - Improved DOM processing. - Improved C++0x/C++11 compatibility. - Fixed httpda plugin crash. - Fixed wsdl2h processing of *`xs:group maxOccurs="unbounded"`*. - Fixed `mod_gsoap` plugin compilation issues. - Fixed literal XML UTF8 (UTF8 is now retained with `SOAP_C_UTFSTRING`). Version 2.8.12 (12/8/2012) --- - Added WSDL 2.0 support to wsdl2h. - Added //gsoap method-protocol directive. - Improved XML REST support, soapcpp2 -0 option for "no-SOAP" services. - Improved class instantiation with `soap_new_X`, `soap_new_set_X`, `soap_new_req_X`. - Improved soapcpp2 -b option. - Improved WCF WS-Addressing interop (duplex) channel. - Changed code to normalize in/out MEP for solicit-response messaging. - Fixed client-side OpenSSL host check that is known to crash in OpenSSL. Version 2.8.13 (1/21/2013) --- - Improved XML-RPC/JSON API and documentation, with one change: now must use `SOAP_C_UTFSTRING` to hold UTF8 in 8-bit strings. - Improved VxWorks compatibility. - Updated `soap_read_X` and `soap_write_X` to serialize object graphs with SOAP encoding enabled: use `soap_set_version(soap, V)` with V=0 (no SOAP), V=1 (SOAP1.1), V=2 (SOAP1.2). - Fixed broken WSDL *`types`* nested schema XSD import. - Fixed operation action overriding by input/output SOAP action. - Deprecated old-style C++ service proxies and objects (use soapcpp2 -z1 flag to generate). Version 2.8.14 (2/4/2013) --- - Added explanation of wsdl2h option -Nname which is used to generate a service (and its prefix name) for each service binding (bindings are collected in one service by default). - Fixed PRId64 formatting. - Fixed broken MIME with doc/lit (when SOAP encodingStyle is not used). Version 2.8.15 (5/12/2013) --- - Added wsdl2h option -R for auto-generation of REST-based service operations (also added examples/rest example). - Change `soap_read_X()` and `soap_write_X()` to prevent removal of HTTP headers after calling `soap_connect()`. - Fixed automatic detection of DIME/MIME transfers. - Fixed HTTP 1.0 chunking issue. - Fixed HTTP digest authentication with DIME/MIME transfers. - Fixed OpenSSL subject alt name check. - Fixed HTTP 100 message handling issue. Version 2.8.16 (8/12/2013) --- - Improved support for Android platform. - Improved WCF interop duplex messaging requiring ChannelInstances. - Fixed complexType restriction of schema types with redefined attributes in wsdl2h output. - Fixed wcf/WS/DualHttp example (wrong use of `send_X()` replaced by `X()` for client-side operations X, to allow HTTP keep-alive to be used). - Fixed use of sprintf's that trigger Valgrind and Fortify warnings. - Fixed parsing character strings from CDATA sections ending in ']'. - Fixed DOM output for `SOAP_XML_CANONICAL` c14n normalization of xmlns namespace bindings. Version 2.8.17r (12/1/2013) --- - Added WS-RM message queueing option for WS-RM NoDiscard. - Added wsdl2h option -r for authorized web access and proxy access. - Improved C++11 compatibility. - Improved ISO compatibility (compile -pedantic). - Improved I/O timeouts timing accuracy in the presence of EINTR interrupts (set `SOAP_MAXEINTR`). - Fixed in 2.8.17r: fixed socket timeout issue. Version 2.8.18 (8/24/2014) --- - Added *`xs:precision`* and *`xs:scale`* support. - Added support for BPEL PartnerLink and VariableProperties to wsdl2h in support of BPEL projects. - Added soapcpp -z2 flag for backward compatibility with to 2.7.x: omit XML output of elements for pointers that are NULL even when minOccurs=1 (required). - Changed wsdl2h C++ output to always generate pass-by-reference response parameters (disable with -z6). - Improved WS-RM interoperability. - Fixed message part elements and types in default (xmlns="") namespace. - Fixed `&#;`-entity code conversion bug in XML attribute deserialization. - Fixed wsdl2h nested simpleType restriction with itemTypes. - Fixed wsdl2h substitutionGroup element in other namespace. - Fixed *`xs:choice`* strict validation. - Fixed timeout/EINTR issue. Version 2.8.19 (11/8/2014) --- - Added string validation callbacks fsvalidate and fwvalidate for regex pattern-based validation of strings and wide strings against XML schema regex patterns. - Fixed *`xs:choice`* strict validation with *`minOccurs="0"`* element(s). - Fixed `TCP_FASTOPEN` with UDP. - Fixed MTOM Content-Disposition ID overriding problem. - AIX portability fixes. Version 2.8.20 (11/30/2014) --- - Added XML 1.1 control char encoding support. - Fixed C/C++ compiler warnings. Version 2.8.21 (12/05/2014) --- - Added `-DWITH_REPLACE_ILLEGAL_UTF8` compilation option to replace UTF8 content that is outside the allowed range of XML 1.0. - Improved WS-RM (memory usage). - Fixed additional C/C++ compiler warnings. - Fixed `strftime` `%F` and `%T` use (removed). Version 2.8.22 (4/12/2015) --- - Added XSD 1.1 support (*`xs:override`*, *`xs:defaultAttributes`*, *`xs:targetNamespace`* on element and attribute declarations, and other additions). - Added import/wsdd5.h to support WS-Discovery 1.0 with WS-Addressing 2005/08 (typemap.dat now sets wsdd5.h instead of wsdd10.h by default). - Improved portability, including Solaris and AIX porting. - Improved option -R is now required to enable REST WSDL bindings and non-HTTP transport (in addition to enabling REST WSDL operations). - Fixed wsdl2h handling of *`xs:redefine`*. - Fixed deep class inherited `xsd__anyType` deserializer issue causing serialization and validation errors. - Fixed `std::vector*` deserialization bug that occurs under very specific circumstances. - Fixed wsdd plugin `SOAP_WSDD_APP_MAX_DELAY`. - Fixed wsse/smdevp memory leak. Version 2.8.23 (8/17/2015) --- - Added TLS SNI. - Added Unicode C++11 identifier support to soapcpp2, supported directly by UTF8 encoding and the UCN `\uNNNN` extension of identifier naming in the C99/C98++ standards. - Added wsdl2h option -U to allow UTF8-encoded Unicode C/C++ identifiers upon mapping universal XML tag names to C/C++ identifier names (this is a C++ standard-dependent and compiler-dependent feature). - Replaced C lib functions `memcpy`, `memmove`, `strcpy`, `strcat`, `strncpy`, `strncat`, `sscanf`, `sprintf` by more secure alternatives when available on target platform. On windows you should add an [Invalid Parameter Routine](https://msdn.microsoft.com/en-us/library/ksazx244.aspx), to ignore and let gsoap safely continue with truncated strings (and deal with soft errors later). - Updated OpenSSL and GNUTLS integration. - Fixed soapcpp2 SOAP RPC literal WSDL output (supported are SOAP RPC encoded, RPC literal, document literal, and REST). - Fixed C++ struct soap context constructor memory leak when `WITH_GZIP` is enabled and changed struct soap context allocation in C++. - Fixed redundant call to `OpenSSL_add_all_digests()`, since `OpenSSL_add_all_algorithms()` already adds digests. This caused issues on certain platforms with OpenSSL 1.0.1 and higher. - Fixed missing client-side `soap_recv_fault` with empty doc/lit responses. - Fixed missing *`xs:restriction`* tag in soapcpp2 WSDL/XSD output. Version 2.8.24r (11/01/2015) --- - Added new soapcpp2 option `-c++11`, enabling support for C++11 syntax and features, including: - scoped enumerations (`enum class`) with underlying types (`enum class : type` is 8, 16, 32, or 64 signed int); - serialization of smart pointers `std::shared_ptr` and `std::unique_ptr` (and deprecated `std::auto_ptr` if needed); - virtual method `final` and `override` syntax; - `nullptr` constant member initializer. - More efficient C++11 STL vector, list, and deque deserialization code based on `emplace_back()`. - Added new `xsd__date` custom serializer `custom/struct_tm_date.h` to bind `struct tm` to *`xsd:date`*. - Added new `xsd__time` custom serializer `custom/long_time.h` to bind `ULONG64` to *`xsd:time`* with microsecond precision. - Added new `xsd__duration` custom serializer `custom/chrono_duration.h` to bind C++11 `std::chrono::nanoseconds` to *`xsd:duration`*. - Added `xsd__dateTime` custom serializer `custom/chrono_time_point.h` to bind C++11 `std::chrono::time_point` to *`xsd:dateTime`*. - Added new TLS/SSL flags `SOAP_TLSv1_0`, `SOAP_TLSv1_1`, and `SOAP_TLSv1_2` to limit TLS protocol selections. - Added new SHA224/SHA384 digest options, ECDSA (requires OpenSSL 0.9.8 or later), and HMACOutputLength truncation (within limits) to WSSE. - Added Galois counter mode (GCM) authenticated encryption to WSSE with AES128/AES192/AES256, requires OpenSSL 1.0.2 or later. - Added the concept of "mutable" structs and classes, which allow for incremental compile-time addition of new members to the struct/class, which gives them a tuple-like behavior with the tuple being populated in distinct parts of the soapcpp2 input source. This is similar to the way the `SOAP_ENV__Header` struct was already handled. This is not a standard C/C++ feature. - Added `$CONTAINER = name` and `$POINTER = name` definitions to `typemap.dat` for specifying the C++ container to use (`std::vector` by default) and C++11 smart pointer to use (no smart pointer by default), see [databindings](https://www.genivia.com/doc/databinding/html). - Improved soapcpp2 input source code analysis and C/C++ syntax coverage. - Improved soapcpp2 output WSDL and XSD with added root-level elements and attributes on demand, see [databindings](https://www.genivia.com/doc/databinding/html). - Improved efficiency and case coverage of SOAP encoded messages with id-ref anchors using redesigned pre- and post node graph construction analysis algorithms (`soap_id_enter`, `soap_id_forward`, `soap_id_lookup`, and `soap_update_pointers` have changed). - Improved cyclic data structure detection and XML rendering with non-SOAP-encoded literal style (and/or the `SOAP_XML_TREE` flag) to prune cycles from trees. `SOAP_XML_TREE` produces XML document "trees" rather than id-ref XML graphs. Graphs are produced with SOAP encoding or with the `SOAP_XML_GRAPH` flag. - Improved primitive `union` members access in C++ by removing unnecessary pointers. - Improved checking of signatures in WSSE plugin. - Updated soapcpp2 `size_t` mapping to transient (non-serializable) type. The wsdl2h tool does not generate `size_t`. If `size_t` is used in your header files for soapcpp2, then use `unsigned long` to replace `size_t`, which replicates the old `size_t` mapping to `unsigned long` (beware, this is not portable). - Updated *`xsi:nil`* serialization rules for pointer-type struct/class members, by forcing *`xsi:nil="true"`* element output for required **nillable** elements (no longer requiring the `SOAP_XML_NIL` flag). - Updated wsdl2h Nillable optional element annotations (i.e.g for `nillable=true` and `minOccurs>0`), now requiring inbound elements with *`xsi:nil`* or validation error. NULL pointer-based outbound nillable elements with `minOccurs>0` are now serialized with *`xsi:nil="true"`*, see above. - Updated dateTime content validation with `SOAP_XML_STRICT`, otherwise accepts ISO8601 variants. - Fixed `SOAP_UNION_name_type_member` macro constants for C++ namespace `name` (wsdl2h option `-qname` to ensure that the generated macro names are unique. - Fixed attribute serialization when attribute of type `std::string` has a default value while actual value is set to "" (empty). - Fixed class inheritance from base class `soap_dom_element` (declared in `dom.h`) which should include the content of the DOM node(s) together with the (de)serialized content of the derived class instance. - Fixed default/fixed values of element/attribute references to global elements/attributes with global default/fixed values. - Fixed *`xs:group`* and *`xs:substitutionGroup`* element namespace prefix qualifications of struct and classe members. - Fixed deserialization of nested *`xs:sequence`* class pointers to NULL (structs are OK) when *`xs:sequence`* is optional and sequence data is not present on the inbound stream. - Fixed missing `custom/struct_timeval.c` inbound microsecond fraction of *`xsd:dateTime`* values. - Fixed `typedef` of a custom serializer type. - Fixed `typedef` pointer type use in `@type` attribute declarations. - Fixed linking against newer EVP functions in older OpenSSL versions to compile WSSE plugin. - Fixed WSSE decryption with HTTP-chunked and fragmented messages in transport. Version 2.8.25 (11/11/2015) --- - Added `xsd__decimal` custom serializer `custom/float128.h` to bind `` quad precision float `__float128` to *`xsd:decimal`*. - Added group circular reference detection to wsdl2h. Generates code for circular group references that is safe to use, but with loss of occurrence validation constraints, if any are present. - Updated and improved XML-RPC and JSON implementation with wider `_int`, now 64 bit, while keeping XML-RPC type `_i4` to just 32 bit. Existing project C code that uses the XML-RPC and JSON plugin SHOULD be updated to use `_i4` (`int`) instead of `_int` when `_int` is still used as a 32 bit `int` in their project. - Fixed strict validation of empty elements unless the element is href/ref-attributed with SOAP encoding (this validation check was temporarily lost in the 2.8.24r release). - Fixed missing `#include ` for smart pointers. - Fixed float type minInclusive and maxInclusive fractional bounds validation. - Fixed compilation issues when C++ namespaces (soapcpp2 option `-q`) are used with custom serializers. - Fixed wsdl2h option `-p`, which may cause type name clashes with generated C++ `xsd__anyType` wrapper classes for simple types. Version 2.8.26 (11/30/2015) --- - Added new **jsoncpp** code generator that takes a JSON sample document and renders it in JSON API code for C or C++. The jsoncpp tool is located in `gsoap/samples/xml-rpc-json` with the XML-RPC and JSON APIs and samples. - Added new C/C++ XML-RPC and JSON APIs `xml-rpc.c` and `json.c[pp]` to simplify JSON and XML-RPC in C and C++. The old `json_c.h` and `json_c.c` are deprecated and removed in favor of the improved APIs `json.h` and `json.c[pp]`. - Added `xsd__integer` custom serializer `custom/int128.h` to bind big int `__int128_t` to *`xsd:integer`*. - Added floating point exclusive range bounds notation to gSOAP header file syntax, with `<` on the side of `:` for an exclusive bound (`min <: max` makes `min` exclusive, `min <:< max` makes both exclusive, and `min :< max` makes `max` exclusive), while keeping `min : max` for inclusive bounds. - Added C++11 syntax for struct/class member initialization with `{ initval }`, which has an identical effect as declaring members with `= initval` initializers. This works in C and C++. - Added HTTP2 support to WinInet plugin. - Expanded [XML-RPC and JSON documentation](https://www.genivia.com/doc/xml-rpc-json/html). - Expanded [Data Bindings documentation](https://www.genivia.com/doc/databinding/html). - Improved wsdl2h schema import processing when WSDL and XSD have the same namespace and *`xs:import`* is used instead of *`xs:include`* to populate the schema. - Improved wsdl2h output for integer enumeration constants, omits trailing underscores for pseudo-numeric enum constants, updated soapcpp2 to accept duplicate enum constants in different enum lists when their values are the same. - Fixed `soap_del_string` memory issue in `char*` string deletion. - Fixed soapcpp2 option `-s` by enforcing `SOAP_XML_STRICT` on the body of inbound messages for client and server. - Fixed a rare issue where elements end up missing in a substitutionGroup when several WSDLs with the same namespace are imported into one WSDL. - Fixed strict validation rejection of empty element body when empty when permitted. Version 2.8.27 (12/7/2015) --- - Added new JSONPath code generation feature to jsoncpp in `gsoap/samples/xml-rpc-json` with new option `-p`. Supports C++ (and C in the next release). - Improved JSON API functionality and robustness. - Improved substitutionGroup union member: removed prefix `__` from member name and removed rogue `;`. - Fixed `WITH_NOIDREF` broken `iht` initialization introduced in 2.8.25/26, which may lead to a crash. Version 2.8.28 (02/01/2016) --- - Added new **domcpp** code generator that takes an XML sample document and renders it in XML DOM API code for C or C++. Can also convert XPath to XML DOM API code with option `-p`. The domcpp tool is located in `gsoap/samples/dom` with the XML DOM samples. - Added many new API functions to a fully redesigned XML DOM API v5 for C and C++ with new DOM API documentation. The redesigned DOM API v5 is mostly backward compatible to DOM API v4, but with DOM string `data` members changed to `text` members. Many API functions are added to define a clean interface without having to use the DOM structure data members. The `soap_dom_next_element()` function now takes a second parameter that is an element pointer to stop deep traversal at (use NULL for old behavior). See updated [XML DOM and XPath](https://www.genivia.com/doc/dom/html) documentation for details. - Added C serialization to/from strings with new C `soap` struct members `const char *soap::is` input string to parse from and `const char **soap:os` pointer to string that is set by the engine to point to the output. Note that C++ code is unchanged and the `soap::is` and `soap::os` are still members pointers to `istream` and `ostream` streams (use `std::stringstream` for input/output from/to strings). - Added JSON API C function `set_size` to set/change array sizes and JSON API C function `set_struct` to create an empty JSON object. - Improved jsoncpp command line tool to generate JSONPath C code and improved overall to generate more compact code. - Improved `SOAP_XML_DEFAULTNS` flag to emit XML default namespace declarations. - Improved strictness of XML verification under default settings (i.e. without requiring `SOAP_XML_STRICT`). - Changed string deserialization when XML content with tags is encountered: XML tags are no longer parsed as part of strings. You must use `XML` string type to parse literal XML content or use DOM. - Fixed C++ JSON/XML-RPC API `time_t` type usage to `ULONG64` to ensure portability. This affects the `value(time_t)` constructor, the `value::operator=(time_t)` assignment operator, and `value::operator time_t()` cast, which have been replaced by versions using `ULONG64`. To use these in C++ for `time_t` ISO 8601 date time serialization, simply cast `time_t` values to `ULONG64` values. - Fixed gsoapWinInet.cpp:243, `pDst` should be `a_pDst`. - Fixed SNI `SSL_set_tlsext_host_name` call for OpenSSL 0.9.8f. - Fixed `soap_instantiate` of smart pointer when instantiating derived class by *`xsi:type`*. - Fixed friend `__declspec(dllexport)` declarations in generated classes. Version 2.8.29 (02/24/2016) --- - Added new soapcpp2 option `-r` to generate a soapReadme.md report that summarizes the input .h file information, the serializable C/C++ types, the services, and the generated code. Use a markdown converter to browse or download the free readmeviewer.html from https://www.genivia.com/files/readmeviewer.html.zip to view the soapReadme.md report in a browser. - Added new wsdl2h option `-M` to suppress error "must understand element with wsdl:required='true'". - Upgraded HTTP digest authentication `httpda` plugin to 2.0 to support RFC7616 "HTTP Digest Access Authentication" with SHA2 (replacing MD5) that is compatible with RFC2617; compile and link upgraded `plugin/httpda.c` with `plugin/smdevp.c` instead of `plugin/md5evp.c`. - Updated wsdl2h HTTPS-enabled build steps to use upgraded `httpda` plugin. - Updated `samples/webserver` to use upgraded `httpda` plugin. - Updated the samples with new AWS S3 SOAP API example `samples/aws`. - Improved soapcpp2 code generation of inline object read/write functions in C++, instead of macros generated in C. - Fixed and improved soapcpp2 code generation with options `-p` and `-q`. - Fixed definitions/service/port/wsaw:UsingAddressing processing. - Fixed SNI `SSL_set_tlsext_host_name` call for OpenSSL 0.9.8f. - Fixed wsdl2h skipping *`mime:multipartRelated/mime:part`*. Version 2.8.30 (04/02/2016) --- - Added backtick XML tag name syntax to interface files for soapcpp2, which allows for the overriding of the translated tag names of struct/class members and service operation parameters, see the [Data Bindings documentation](https://www.genivia.com/doc/databinding/html#toxsd9-5). Older gSOAP versions do not support the backtick tag in the generated WSDL and schemas (messages are OK). - Added macro `SOAP_MAXLEVEL` to trigger `SOAP_LEVEL` error when XML nesting level of inbound XML exceeds the value of `SOAP_MAXLEVEL`. Default value is 10000. Redefine `SOAP_MAXLEVEL` as needed, with lower values to restrict XML nesting depth for receivers to accept. - Added macro `SOAP_MAXLENGTH` to trigger `SOAP_LENGTH` content length error when string content in inbound XML exceeds the value of `SOAP_MAXLENGTH`. Applies to strings that are potentially unbounded, i.e. that are not already constrained by XML validation maxLength constaints (which could be larger than `SOAP_MAXLENGTH`). Default value is zero (0) which means that string length is unconstrained if XML validation maxLength is not given. Redefine `SOAP_MAXLENGTH` as needed, with lower values to restrict string lengths for receivers to accept. - Added macro `SOAP_MAXOCCURS` to trigger `SOAP_OCCURS` content error when array and container lengths exceed the value of `SOAP_MAXOCCURS`. Must be greater than zero (0). Default value is 100000. Redefine `SOAP_MAXOCCURS` as needed, with lower values to restrict array and container lengths for receivers to accept. - Updated wsdl2h WS-Policy processing to include WS-RM protocol versioning. - Updated `soap_ignore_element` processing efficiency. - Updated `import/saml1.h` and `import/saml2.h`. - Improved soapcpp2 generation of WSDL and XSD for unqualified C/C++ types or when mixing qualified and unqualified C/C++ types and type names. - Changed soapcpp2 default behavior for generating WSDL and XSD files with *`elementFormDefault="unqualified"`* from the old default behavior with *`elementFormDefault="qualified"`*, i.e. when `//gsoap ns elementForm:` directive is NOT explicitly included in the interface .h file for soapcpp2 and when soapcpp2 option -e is not used. *This change DOES NOT affect interface files produced by wsdl2h*, only those interface .h files that are not auto-generated and do not have elementForm directives. *If you use soapcpp2 to generate WSDL and schemas AND you need backward compatible SOAP document/literal style messaging AND you DO NOT have `//gsoap ns service style: rpc` (or soapcpp2 option -e) AND you DO NOT have `//gsoap ns schema elementForm:` directives already in your .h file, then you SHOULD add `//gsoap ns schema elementForm: qualified` directives to your .h file for each `ns` prefix*. This recommendation ensures backward compatibility in your current SOAP document/literal style messaging projects. Changing the soapcpp2 default behavior to *`elementFormDefault="unqualified"`* simplifies data bindings. It is also the accurate form to use when C/C++ types are not namespace qualified in the .h interface file for soapcpp2. - Improved DLL export with compiler flag `/DSOAP_STD_EXPORTS` (which defines `SOAP_STD_EXPORTS`) to dllexport the API, classes, and the proxy and service classes. Modified the plugins to support dllexport. - Fixed soapcpp2 crash with enum constants > 255 due to libc `isalpha` crashing on some Linux systems. - Fixed `import/wsp.h` soapcpp2 compilation error. - Fixed soapcpp2 option `-w` that may cause a message response element tag name inconsistency with SOAP doc/lit style. - Fixed deserialization issue with dynamic arrays of STL containers/smart-pointers (i.e. a pointer to an array of containers/smart-pointers, which is an unlikely combination to use, but should work). Version 2.8.31 (05/1/2016) --- - Added engine context `sndbuf` and `rcvbuf` attributes to (re)set `setsockopt` values for `SO_SNDBUF` and `SO_RCVBUF`, respectively. Default value is `SOAP_BUFLEN`, same as engine's internal message buffer size. Setting to zero forces the engine to omit the `setsockopt` `SO_SNDBUF` and `SOAP_RCVBUF` calls, which for example can be used to enable TCP buffer autotuning with Linux (Linux 2.4 and up). - Added "http://userid:passwd@domain/path" userinfo syntax for HTTP Basic and NTLM authentication, i.e. this automatically sets `soap::userid` and `soap::passwd` from the userinfo and also sets `soap::authrealm` to the domain if not already set. HTTP Basic authentication is not recommended without secure https. For NTLM authentication, set `soap::ntlm_challenge = ""` to proceed immediately with NTLM instead of Basic authentication. - Improved strengthening of `SOAP_XML_STRICT` and the soapcpp2 `-s` flag to reject all extra (non-deserializable) XML and character data by the parser and deserializers. - Improved client-side certificate checking (DNS or IP, and wildcards). - Improved soapcpp2 option `-t` and `//gsoap ns schema typed: y` directive that force the addition of *`xsi:type`* attributes to XML content except for types whose type names are prefixed with an underscore (i.e. root elements w/o type as per wsdl2h data bindings rules). - Fixed crash with nested dynamic arrays in C++ (C is fine) i.e. classes and structs with `__ptr` and `__size` members as arrays of elements, where these arrays contain nested dynamic arrays. [See here for patch](https://www.genivia.com/advisory.html). - Fixed typedef of `xsd__hexBinary` struct/class, which should map to hexBinary but instead mapped to base64Binary. - Fixed `nc` and `cnonce`, which are removed when `qop` directive is absent in HTTP digest authentication as per RFC2617. - Fixed the digest authentication plugin from blocking basic authentication. - Fixed soapcpp2 naming of unnamed function/method parameters as `_param_N` with N now counting up sequentially *per function* instead of globally counting up. Use soapcpp2 option `-z3` for backward compatible global parameter indexing. - Fixed (smart) pointer deserialization of non-base (derived) objects that are XML serialized with SOAP id-ref encoding using a href/ref that references a derived object (i.e. should result in a (smart) pointer to a derived instance, not a base instance or missing instance). - Fixed strict validation (`SOAP_XML_STRICT`) of unqualified attributes in elements with a default namespace. - Fixed wsdl2h 2.8.28-30 parsing of *`xs:unique`* causing wsdl2h to skip over schema components. The fix also improved string-based parsing of XML content with a fix for 2.8.28-30 XML string handling. Version 2.8.32 (05/10/2016) --- - Improved soapcpp2 code generation of type converters `int soap_s2T(soap*, const char*, T*)` and `const char *soap_T2s(soap*, T)` for primitive and binary types T. - Fixed unqualified *`xsi:type`* content matching with default namespace, which may lead to a failure in the 2.8.31 release to instantiate derived instances for complexType extensions. - Fixed Solaris-specific memory issues in `soap_wstrdup`. Version 2.8.33 (06/14/2016) --- - Updated WS-Trust gsoap/import/wstx.h `__wst__RequestSecurityToken` response message parameter to `wst__RequestSecurityTokenResponseCollection` - Updated WS-Security gsoap/import/wsse.h with optional SAML assertions in the Security header. - Updated response processing for empty HTTP body with HTTP code 200 to 202: no longer forces socket close when HTTP keep-alive is enabled. - Updated `_XML` literal string XML serialization for qualified tag names, no longer uses default namespace (as in *`xmlns="URI"`*) but a prefixed tag name only. - Updated wsdl2h options `-p` and `-d`, now generates `xsd__anyType*` (i.e. with pointer) data members without requiring the user to define a typemap.dat rule to do so. This change reinstates some of the old behavior of 2.8.23 and earlier versions. - Fixed wsddapi.c compilation issue on Windows (`usleep` replaced). - Fixed validation of *`simpleType/restriction/length`* when restriction base is a list that is mapped to a string. - Fixed validation of *`simpleType/restriction`* with base type string length bounds restrictions. Version 2.8.34 (08/17/2016) --- - Added custom serializers for QT primitive types and QT containers. This serializes many QT types directly in XML. The QT types to use for XSD types are specified in the typemap.dat. See the updated gsoap/typemap.dat file in the distribution package and the updated [databindings](https://www.genivia.com/doc/databinding/html) documentation for details. - Added HTTP server session management plugin to manage server-side session cookies. - Added basic common WADL support to wsdl2h to generate code for WADL REST XML applications. - Improved client-side URL query generation and support for URL templates for REST operations. - Updated the iOS plugin and its Web service examples. - Updated SSL calls for improved iOS portability. - Updated wsdl2h headerfault support (optional fault details in SOAP Headers, not widely used by Web services tools). - Updated VC++ ISAPI plugin. - Fixed `soap_send_empty_response()` with HTTP keep-alive to prevent exit of the server loop back to `soap_accept()`, i.e. prematurely killing the keep-alive connection causing EOF/RST. - Fixed `#import "wsse.h"` in `gsoap/import/ds.h` by moving it down to avoid missing type declaration of `_ds__KeyInfo` which may cause a soapcpp2 syntax error. - Fixed WS-Security interoperability issues, fixes issues with XML encryption. Token handler callback has new parameters to pass the key data of SecurityTokenReference/KeyIdentifier. - Fixed the internal `feltbegout` and `feltendout` callbacks: when set no longer emits XML and (alternative) output is expected to be emitted by these callbacks. Version 2.8.35 (09/19/2016) --- - Added auto-generation of new C functions `T * soap_new_T(struct soap*, int n)` to allocate and default initialize one (or more with `n>1`) value(s) of type `T`. Uses `soap_malloc(soap, n * sizeof(T))` and applies `soap_default_T(struct soap*, T*)` to each value allocated. - Added WS-Trust wst extensible framework with SAML 1.0/2.0 tokens, PSHA1 algorithm, and an example WS-Trust client and server to request, create, sign, and verify SAML 2.0 tokens. - Changed `soap_new_block` to `soap_alloc_block` in stdsoap2.h and in the gsoap libs to prevent potential name clashes with generated code for a `block` type. - Improved UDP connectivity with WS-Discovery to reuse current socket connection, i.e. preventing premature socket close when `soap::socket` is the `soap::master` socket. - Fixed wsdl2h option `-u` to prevent a deserialization issue that occurs in the specific case of an *``* within a *``*. Version 2.8.36 (09/21/2016) --- - Fixed a problem with `SOAP_ENV__Header` missing in wsdl2h-generated .h file (problem occurs with 2.8.34/35 due to an update for headerfaults). Version 2.8.37 (10/25/2016) --- - Added server-side HTTP cross-origin resource sharing (CORS) access control using HTTP OPTIONS `fopt()` callback. - Fixed `make -j n` parallel builds. - Fixed an issue causing UDP message fragmentation. - Fixed `soap_mq` message queue plugin dropping connections. - Fixed missing nested [] in arrayType value in SOAP 1.1 encoding (SOAP 1.2 not affected). Version 2.8.38 (11/11/2016) --- - Added auto-generated client-side REST API functions to simplify REST GET, PUT, POST operations with XML data: `soap_GET_T`, `soap_PUT_T`, `soap_POST_send_T`, and `soap_POST_recv_T` for XML elements/types `T`. Also `soap_DELETE` REST DELETE added. See [get started](http://www.genivia.com/dev.html#services) on how to use these functions. - Updated samples/webserver to use both the httpform and httppost plugins to serve HTML form data and REST PUT, POST, DELETE operations for the updated samples/rest example person.c and person.cpp clients. Version 2.8.39 (11/17/2016) --- - Minor improvements: the engine sets the temporary "C" locale for floating point conversion on most systems. This is now the default on most systems, rather than an option. To disable, compile source code with `-DWITH_NO_C_LOCALE`. To enable, compile with `-DWITH_C_LOCALE`. As before, the setting is temporary and thread-local in the engine so it does not affect the application's locale. Version 2.8.40 (12/10/2016) --- - Improved wsdl2h import/include relative path search. - Fixed wsdl2h schema import when imports are deeply nested in imports/includes. - Fixed MinGW compilation issue. Version 2.8.41 (01/11/2017) --- - Added updates to support OpenSSL 1.1.0. - Added HTTP header `Accept: multipart/related,application/xop+xml,*/*;q=0.8` when MTOM is expected (i.e. when the input mode flag is set to `SOAP_ENC_MTOM`). - Improved CORS internals and compatibility. - Fixed minor issues with `WITH_NOIO` and `WITH_NO_C_LOCALE`. - Fixed bug in XML attribute serialization of QT QByteArray and QString types. - Fixed WinCE7 `IP_MULTICAST_IF` issue. Version 2.8.42 (01/20/2017) --- - Improved `WITH_REPLACE_ILLEGAL_UTF8` flag to compile the source code of the gSOAP libraries: this replaces illegal UTF-8 input/output with the replacement character U+FFFD (or define your own `SOAP_UNKNOWN_UNICODE_CHAR`). - Fixed shared pointer to QName string QName output normalization. - Fixed wsdl2h pointer member to vector for minOccurs="0" by removing the unnecessary pointer to the container, i.e. just using the container. Version 2.8.43 (02/05/2017) --- - Added `SSL_CTX_need_tmp_RSA()` check (OpenSSL 1.0.1 and greater). - Fixed string length limiting issue in QT QString type serializer `custom/qstring.h` and addressed compilation issue with other QT types serializers. - Fixed documentation of `soap_copy_stream()` followed by `soap_free_stream()` to chain services. - Fixed `soap_psha1` string buffering. Version 2.8.44 upd (03/04/2017) --- - Improved windows portability and stability. - Fixed WS-Discovery `soap_wsdd_listen` memory cleanup on timeouts. - Fixed `soap::os` saved message string NUL termination (a problem in C code, not in C++). - Fixed Cygwin and MinGW missing xlocale.h error. Version 2.8.45 upd (04/07/2017) --- - Fixed an issue with the WSSE plugin that caused WS-Security SignedInfo/Reference/Transforms/Transform/InclusiveNamespaces/@PrefixList ending up being ignored by the canonicalizer. - Fixed Windows and WinCE compilation issues. - Improvements. Version 2.8.46 (05/16/2017) --- - Improved WS-Trust API, updated import/wst.h, import/saml1.h, import/saml2.h and import/wsdd.h definitions. - Added `soap::client_interface` string to set the client IP address interface with `inet_pton()` (not generally available on windows). - Fixes for minor issues, improvements. Version 2.8.47 (06/07/2017) --- - Added CURL plugin to use libcurl for gSOAP client applications. - Fixed spurious occurrences of `` elements in XML renderings of DOM nodes. - Improvements. Version 2.8.48 upd (06/21/2017) --- - Improved element and attribute `default` and `fixed` value validation. Changed the code generation by wsdl2h slightly for optional elements with default values. This fixes an issue when an optional element is omitted in XML and becomes indistinguishable from an empty element because in both cases a default value is assigned. An omitted optional element has no default value. New XML validation error codes `SOAP_FIXED` and `SOAP_EMPTY`. - Added `soap::transfer_timeout` max transfer timeout, to use in combination with `soap::send_timeout` and `soap::recv_timeout`. - Fixed a potential vulnerability that may be exposed with a large and specific XML message over 2 GB in size. After receiving this 2 GB message, a buffer overflow can cause an open unsecured application to crash or malfunction. Clients communicating with HTTPS with trusted servers are not affected. Version 2.8.49 upd (07/28/2017,07/28/2017) --- - Improved JSON API to compile with XML data bindings, see updated JSON API documentation on "Compiling XML-RPC/JSON together with gSOAP XML data binding code" - Improved white space handling of built-in XSD types that have "replace" and "collapse" white space properties. Further, types derived from these built-in XSD types will now inherit the white space "replace" or "collapse" property, meaning that white space of inbound strings are normalized (`xsd__anyURI`, `xsd__language` `xsd__ENTITY`, `xsd__ENTITIES`, `xsd__ID`, `xsd__IDREF`, `xsd__IDREFS`, `xsd__Name`, `xsd__NCName`, `xsd__NMTOKEN`, `xsd__NMTOKENS`, `xsd__normalizedString`, `xsd__token`, etc). - Fixed a memory leak in the deserializer of `std::vector` (and dynamic arrays of `xsd__anyType`) where `xsd__anyType` is a DOM node imported with `#import "dom.h"`. - Fixed WSSE plugin recanonicalization of inclusive C14N SignedInfo. - Fixes for minor issues, improvements. Version 2.8.50 upd (07/23/2017,07/28/2017) --- - Added samples/atom Atom 1.0 XML REST example. - Added `soap::recv_maxlength` to change the limit on the length of messages received. Default is 2GB max. Greater lengths are possible, but at your own risk. It is recommended for services deployed in uncontrolled environments to use the [Apache module](https://www.genivia.com/doc/apache/html/index.html) and [ISAPI extension](https://www.genivia.com/doc/isapi/html/index.html), see the gSOAP [tutorial](https://www.genivia.com/tutorials.html) and [documentation](https://www.genivia.com/docs.html). - Removed client-side `SOAP_PURE_VIRTUAL` from `copy()` in the code generated by soapcpp2 for options `-i` and `-j`. - Updated memory deallocation of `soap_del_xsd__anyAttribute`. - Updated the callback function signatures of `fpost` and `fresponse`. - Improvements. Version 2.8.51 (07/28/2017) --- - Additional stability and robustness improvements. - Fixed WinInet HTTP GET blocking issue resulting in EOF. Version 2.8.52 (08/18/2017) --- - Added testmsgr "Test Messenger" with documentation. The Test Messenger application is used for functional and non-functional testing of Web services and clients. The Test Messenger is located in samples/testmsgr. - Added `SOAP_MAXALLOCSIZE` macro to limit the size argument of `malloc()` calls, where zero means unlimited (default). Exceeding the limit results in `SOAP_EOM` (out of memory) errors. Some systems raise signals or throw exceptions when the the size argument of `malloc()` exceeds a certain size. To avoid signals and exceptions set the `SOAP_MAXALLOCSIZE` as needed. - Fixed 2.8.51 issue in parsing HTTP empty lines, fixed with: `if (i == len) /* empty line: end of HTTP/MIME header */` - Fixed WS-RM plugin blocking issue on fatal errors. - Improved use of STL containers: `#import "stl.h"` is no longer required. - Improvements. Version 2.8.53 (08/29/2017) --- - Improved testmsgr "Test Messenger" to handle element repetitions, selections, and optional values for complete XML message randomization to test services and clients. Updated soapcpp2 option `-g` to emit XML message templates with the new template indicators. - Updated plugin/threads.h to let `THREAD_CREATE` return 0 (OK) on Windows like pthreads, thereby making the `THREAD_CREATE` return value portable. - Fixed DIME receiver looping on specific malformed DIME headers. Version 2.8.54 (09/17/2017) --- - Added Google Map Directions and Distance Matrix API XML examples, updating and replacing the old `gsoap/samples/googleapi` example. - Added Google Map Distance Matrix API JSON example gsoap/xml-rpc-json/json-GoogleDistanceMatrix.cpp. - Added wsdl2h option `-S` to specify a name for the soap context member variable of generated classes (C++ only), use `-S ''` to remove the `soap` member variable. - Improved handling of empty SOAP Body responses by client applications using doc/lit style messaging, returns `SOAP_OK` instead of HTTP 200 error code. - Improved Apache module with new `IMPLEMENT_GSOAP_SERVER_INIT(user_func)` to specify a user-defined initialization function to initialize the soap context and register plugins, and service operation faults are now returned with proper HTTP status codes. - Improved Borland C++ builds. - Improved `soap_GET_Type` to close socket if connection does not use HTTP keep-alive. - Improved DIME/MTOM/MIME attachment handling and detection. - Improvements. Version 2.8.55 (10/26/2017) --- - Improved Test Messenger to generate and consume XML test messages with MTOM/MIME attachments, new options `-A`, `-C`, `-H` and `-M`. - Updated WinInet plugin. - Updated DOM node serialization of embedded serializable data: to serialize types defined in C++ namespaces, please see the updated DOM documentation about the new `-DSOAP_DOM_EXTERNAL_NAMESPACE=namespace_name` flag and how to "register" additional C++ namespaces. - Fixed deserialization of pointers to Qt types with the custom serializers `custom/qbytearray_base64.h`, `custom/qbytearray_hex.h`, `custom/qdate.h`, `custom/qstring.h`, and `custom/qtime.h`. - Fixed `WITH_NOIO` compilation errors (`close()` and/or `gettimeofday()` not found). Version 2.8.56 (12/07/2017) --- - Added new `soap::bind_v6only` context flag, replacing compile-time flag `WITH_IPV6_V6ONLY` (`soap::bind_v6only=1`) and `WITH_NO_IPV6_V6ONLY` (`soap::bind_v6only=0`). - Added wsdl2h option `-D` to make attribute members with default values optional by adding pointers to member types, so assigning a NULL to an attribute member is identical to assigning the default value, this flag does not affect deserializing from XML (i.e. the default value is set when attribute is missing). - Improved wsdl2h code generation for struct/class members with default/fixed values. - Improved JSON and XML-RPC C and C++ APIs. - Improved `SOAP_NEW` and `SOAP_DELETE` family of macros by passing the `soap` context to user-defined replacements, updated `soap_link()`. - Improved `import/saml1.h` and `import/saml2.h` to fix WS/WS-typemap.dat `wsu__Id` optional attribute. - Improved required attribute pointer member rendition in XML, producing default XML value if attribute pointer member is NULL. - Improved HTTP/S cookie handling. - Fixed non-portable `isalnum()` call in JSON parser. - Fixed missing C++ custom serializer type object allocators (e.g. `gsoap/custom/qstring.cpp`), when pointers to custom serialized C++ types are used. - Fixed memory leak in JSON C++ API `json.cpp` struct/array append `operator+`. Version 2.8.57 (12/10/2017) --- - Fixed an issue with the `WITH_IPV6_V6ONLY` compiler flag. Version 2.8.58 (12/17/2017) --- - Improvements to prevent macro `USE_32BIT_TIME_T` to cause misaligned `soap` contexts, due to inconsistent size of `time_t`. - Improvements to support obsolete HTTP cookie formats. - Fixed Windows tools wsdl2h.exe and soapcpp2.exe "The application was unable to start correctly (0xc000007b)" error. Version 2.8.59 (12/30/2017) --- - Removed `#include soapH.h` from generated `.nsmap` file to promote transparency and to prevent accidental inclusions that may cause definition clashes when soapcpp2 option -q is used. - Fixed UDP message transport compression, compile flag `-DWITH_ZLIB` and runtime flag `SOAP_ENC_ZLIB`. Version 2.8.60 (1/15/2018) --- - Added wsdl2h options `-O1` and `-O2` to optimize schemas internally after reading WSDL and XSD files: `-O1` removes duplicate members from nested choice/sequence and `-O2` also removes unused schema types that are unreachable from WSDL and XSD root definitions by a new "schema slicing" algorithm. - Added ability to specify `$SIZE = TYPE` in `typemap.dat` for setting `size_t` or `int` type for array sizes (default is `int` array size), see [databindings](https://www.genivia.com/doc/databinding/html). - Changed wsdl2h C++ source code generated for *`xs:choice maxOccurs>0`* with simpler `std::vector` instead of a dynamic array with size and pointer members, use wsdl2h option `-z7` to revert to the old wsdl2h behavior for backward compatibility. - Improved soapcpp2-generated sample XML messages and fixed a special case where base class namespace prefixes may be rendered incorrectly in an XML sample or test message. - Improved handling of nested *`xs:sequence`* in *`xs:choice`* by removing duplicate name warnings, the duplicate member is still generated by wsdl2h however as a reminder, but should be ignored in your code. Use the new wsdl2h option `-O1` to remove the duplicate member altogether. - Fixed a soapcpp2 problem with bitmask enumerations of QName values. Version 2.8.61 (1/27/2018) --- - Added `WITH_DEFAULT_VIRTUAL` to generate default methods that return `SOAP_NO_METHOD` for C++ services generated with soapcpp2 option `-j` or `-i`. A derived class can then selectively implement service methods as needed. This addition required the use of a new macro `SOAP_PURE_VIRTUAL_COPY` for virtual `::copy()` methods, replacing `SOAP_PURE_VIRTUAL` for `::copy()`. - Added `SOAP_H_FILE` macro to improve the use of plugins and custom serializers in project builds with soapcpp2 options `-p` and `-q` that rename the generated files such as `soapH.h`, the macro changes the `#include "soapH.h"` to `#include "nameH.h"` by invoking the C/C++ compiler with option `-DSOAP_H_FILE=nameH.h`. - Fixed a glitch in soapcpp2 to generate `soap_write_T` functions for `typedef ... T` types that represent XML elements. - Fixed double free in CURL plugin. Version 2.8.62 (2/10/2018) --- - Added wsdl2h options `-O3` and `-O4` to aggressively optimize WSDLs internally by "schema slicing": `-O3` applies `-O2` and also removes unused root attributes, `-O4` applies `-O3` and also removes unused root elements. It only makes sense to use `-O4` with one or more WSDLs (and XSDs that are imported by the WSDL), because all schema components will be removed from XSDs that are not used by WSDLs. - Added the inclusion of `xlocale.h` for GNU Linux to avoid compilation issues. - Updated HTTP digest plugin. - Improved soapcpp2 options `-g` and `-y`, may be used together to generate sample XML messages. - Fixed Borland C++ compilation issue. Version 2.8.63 (2/17/2018) --- - Improved Test Messenger: easy randomized testing of Web Services; added `__PERMUTE` indicator and automatic handling of SOAP 1.1/1.2 array dimension adjustments (`arrayType` and `arraySize` attributes), among other improvements. - Minor improvements. Version 2.8.64 (3/5/2018) --- - Upgraded TLS/SSL engine to support GNUTLS 3.3.0 and greater. To use the GNUTLS library in place of OpenSSL run `./configure --enable=gnutls` and compile all source code with `-DWITH_GNUTLS` instead of `-DWITH_OPENSSL`. - Improved Test Messenger with new options `-d num` and `-u`, where `-dnum` specifies the number of iterations to hit a server with test messages, and `-u` includes Unicode characters in randomized content. Other usability improvements and a bug fix. - Improved WSSE WS-Security plugin and added documentation section with clarifications on how the plugin defends against signature wrapping attacks when you perform signature verification function calls. - Updated `xlocale.h` inclusion for GNU Linux, again. Some Red Hat Linux versions require `xlocale.h` in order to compile stdsoap2.c/stdsoap2.cpp and should therefore be compiled with the new compilation flag `-DWITH_INCLUDE_XLOCALE_H`, or by using `./configure --enable-xlocale`, to force the inclusion of `xlocale.h`. Version 2.8.65 (3/8/2018) --- - Corrected an issue in soapcpp2 to parse negative floating range bounds declared in typedefs. Version 2.8.66 (4/9/2018) --- - Added `soap_close_connection()` to close a connection from another thread. - Fixed C++ proxy and server class `copy()` and `operator=()` methods to prevent a possible memory leak which may occur in certain usage scenarios. - Fixed an issue in wsdl2h, generating an incorrect simpleType element name that leads to a soapcpp2 error. The element has a local simpleType restriction of a simpleType with the same name as the element type, where this simpleType in turn is a restriction. Version 2.8.67 (6/11/2018) --- - Changed `typemap.dat` to disable `xsd__duration` custom serializer by default, meaning that `xsd__duration` is serialized as a string by default. To serialize `xsd__duration` as an integer with the `gsoap/custom/duration.c` custom serializer e.g. in ONVIF, please re-enable the `xsd__duration` custom serializer by removing the `#` comment from the `xsd__duration` specification in `typemap.dat`. - Fixed an issue where the 64 bit integer types `LONG64` and `ULONG64` and their serializers would be downcast to 32 bit when compiling C code with newer GCC versions, due to `__STDC_VERSION__` no longer being defined by the compiler. - Fixed Apache module URL query `?wsdl` handling. - Fixed `gsoap/custom/qstring.cpp` deserializer, converts XML entities to/from chars. Version 2.8.68 (6/29/2018) --- - Minor improvements. Version 2.8.69 (7/18/2018) --- - Improved *`xs:redefine`* processing, fixing the remaining "circular group reference" warnings. - Improved XML sample message generation. Version 2.8.70 (8/27/2018) --- - Renewed the PEM files for the SSL examples included with gSOAP. - Updated `typemap.dat` for ONVIF and upgraded `wsdd10.h` (WS-Discovery 1.0 with WS-Addressing 2004/08) to `wsdd5.h` (WS-Discovery 1.0 with WS-Addressing 2005/08). - Fixed a deserialization issue with Qt `QString` used in a wrapper class (as `__item` member), when the wrapper class is used in a container, such as `std::vector`. Version 2.8.71 (11/12/2018) --- - Improved user guide and added API documentation modules. - Added TLSv3 support with OpenSSL 1.1.1. - Added `./configure --enable-ipv6-v6only` option to build the libraries with `-DWITH_IPV6_V6ONLY` - Added HTTP PATCH support. - Added `soap::bearer` string for HTTP authorization with bearer tokens, assign the token value at the client side, the string contains the token value at the server side. - Added `json_send_fault` to use in place of SOAP `soap_send_fault` calls, and `json_send_error` to use in place of SOAP `soap_sender_fault` calls. Use `soap_send_fault` when an internal server-side error occurred and `soap_send_error` for the server to respond with an error message. - Updated SSL/TLS options for `soap_ssl_client_context` and `soap_ssl_server_context` to allow combinations of `SOAP_TLSv1_0`, `SOAP_TLSv1_1`, `SOAP_TLSv1_2`, `SOAP_TLSv1_3` protocols (v1.3 only available with OpenSSL 1.1.1 and greater), a change from the single TLS protocol flag. - Updated Apache mod gSOAP to set the client IP `soap::ip` and host `soap::host` values. - Improved `soap_response` with `SOAP_FILE` parameter: it is now possible to return a HTTP status code with `SOAP_FILE + code` which returns the given http status code (200 to 599) with the http content type. - Improved `json_call` performance. - Improved `soap_close_connection` enabled with `-DWITH_SELF_PIPE`. - Improved `soap_get_http_body` memory use. - Changed `soap_get_http_body` to return "" (empty string) when no HTTP body is detected instead of NULL, to distinguish receiving an empty HTTP body (returning "") from errors (returning NULL with `soap::error` set). - Changed Apache mod gSOAP `mod_gsoap.c` to use `RTLD_LOCAL` instead of `RTLD_GLOBAL` to permit multiple concurrent gSOAP modules to be loaded in Apache 2 with dlopen. - Renamed the `soap_check_faultX` functions to `soap_fault_X` functions: `soap_check_faultstring` is replaced by `soap_fault_string`, `soap_check_faultdetail` is replaced by `soap_fault_detail`, `soap_check_faultsubcode` is replaced by `soap_fault_subcode`. - Renamed the `SOCKET_CLOSE_ON_EXIT` macro to `WITH_SOCKET_CLOSE_ON_EXIT`. - Renamed the `query` functions of the HTTP GET plugin gsoap/plugin/httpget.c to `soap_query`, `soap_query_key`, `soap_query_val`. - Renamed the `form` function of the HTTP POST form plugin gsoap/plugin/httpform.cto `soap_get_form`. - Fixed `-DWITH_INCLUDE_XLOCALE_H` and `configure` script: the problem caused build failures on Linux. It is possible to force the use of `xlocale.h` with `./configure --enable-xlocale` but only use this when necessary, when `locale_t` is not declared. - Fixed C14N-related WS-Security signature issue introduced in 2.8.28, which in most cases made no difference but could lead to a signature validation failure. - Fixed soapcpp2 code generation issue for single- and multi-dimensional fixed-size arrays. - Fixed wsdl2h missing built-in XSD types when multiple WSDLs are imported. Version 2.8.72 (11/24/2018) --- - Improved the HTTP GET `http_get` and HTTP POST `http_post` plugins, handling of a HTTP POST request that has an empty body is now supported. - Updated user guide, corrected `soap_rand_uuid` description: string returned is stored in a temporary buffer, not stored in managed memory. - Fixed spurious constant initialization problem for `enum` types in soapcpp2-generated code, the problem was introduced with soapcpp2 2.8.71 C/C++ grammar expansion. - Fixed a CURL plugin issue that prevented PUT and DELETE methods to work properly. Version 2.8.73 (12/3/2018) --- - Implemented a work around an OpenSSL bug that may cause `SSL_get_error()` to crash in `soap_ssl_accept()`. The crash depends on the configuration used and occurs in versions 2.8.71-72. See [advisories](https://www.genivia.com/advisory.html) for details. - Improved `soap_ssl_accept()` timeout settings to improve the performance of gSOAP stand-alone HTTPS servers. - Renamed `soap_get_http_body()` to `soap_http_get_body()` to avoid name clashes with soapcpp2-generated `soap_get_T` functions. - Renamed `soap_get_form()` to `soap_http_get_form()` to avoid name clashes with soapcpp2-generated `soap_get_T` functions. - Renamed `soap_get_mime_attachment()` to `soap_recv_mime_attachment()` to avoid name clashes with soapcpp2-generated `soap_get_T` functions. - Renamed `soap_get_stats()` to `soap_http_get_stats()` of the httpget plugin to avoid name clashes with soapcpp2-generated `soap_get_T` functions. - Renamed `soap_get_logging_stats()` to `soap_logging_stats()` of the logging plugin to avoid name clashes with soapcpp2-generated `soap_get_T` functions. - Moved `soap_http_get_form()`, `soap_query()`, `soap_query_key()`, and `soap_query_val()` functions from the httpget and httpform plugin APIs to the stdsoap2.c[pp] library API. No project rebuilds should be necessary when using these plugins with this upgrade. - Updated `gsoap/samples/webserver` example and documentation with improved job queueing when the thread pool option is used. Version 2.8.74 (12/11/2018) --- - Fixed an issue with MIME/MTOM attachment sending when the HTTP-digest plugin is used or when compression is enabled, returning incorrect `SOAP_EOM` error (i.e. not caused by out-of-memory). The problem was introduced in 2.8.70. Version 2.8.75 (1/14/2019) --- - Added httppipe plugin for HTTP pipelining, as requested by users. - Added asynchronous messaging example `gsoap/samples/async` to demonstrate asynchronous messaging. - Added wsdl2h option `-F` to add transient pointer members to structs to simulate type derivation with structs in C. This addition makes it easier to (de)serialize derived types in C that are indicated with *`xsi:type`* attributes in XML. This approach greatly improves the use of derived types in C compared to the `void*` pointer to anything serialization trick. This option can also be used in C++ to replace class inheritance by this approach, when desired. - Added wsdl2h option `-L` to generate less documentation in interface header files by removing all @note comments that are generic. - Added `WITH_NOEMPTYNAMESPACES` compile-time flag to disable *`xmlns=""`*, this is intended for backward compatibility with old XML parsers and old gSOAP versions that do not support *`xmlns=""`* empty default namespaces. When used with the runtime `SOAP_XML_DEFAULTNS` mode flag, produces XML that lacks *`xmlns=""`* which should only be used for special cases and is not recommended in general. - Improved interface header file format and content generated by wsdl2h. - Improved wsdl2h *`import schemaLocation`* logic. - Updated wsdl2h option `-D` to make attributes with fixed values pointer members in structs and classes, not just attributes with default values. - Updated wsdl2h option `-f` to flatten C++ class hierarchy by removing inheritance. This option removes support for type derivation with *`xsi:type`* in XML (indicating restricted and extended type values which cannot be used as a result). This update also removes pointers from the item value types of arrays and containers, because there are no derived types that could extend the item value types. - Updated soapcpp2 to split up the `soap_call_ns__webmethod` functions into new `soap_send_ns__webmethod` and `soap_recv_ns__webmethod` functions called by `soap_call_ns__webmethod`. The new functions can be used for asynchronous messaging, while `soap_call_webmethod` is used for synchronous messaging. This update also applies to C++ proxy classes with the addition of new `send_webmethod` and `recv_webmethod` methods for asynchronous messaging. - Updated the httppost plugin with improved media type pattern matching of media patterns in the table of handlers, thereby removing the need to specify also the `media/type;*` patterns to match parameters. Media type patterns without a `;` will match the media type of the message whether or not the media type of the message includes parameters. - Updated `gsoap/samples/webserver` example and fixed the webserver HTTP keep-alive connection persistence configuration setting that was turned off (because both input and output mode flags should be set to `SOAP_IO_KEEPALIVE`). - Updated soapcpp2 option `-j` to call `destroy()` in destructor to deallocate managed heap data (like option `-i`), if the `soap` context was allocated by the proxy and service object constructors. - Updated wsdl2h to generate qualified operations for the document/literal wrapped pattern with incorrect use of part/@type in WSDLs, fixing an issue with wsdl2h option `-Nname` that may cause interop problems. - Updated the CURL plugin to support the proxy settings specified by the user as proxy host `soap::proxy_host`, proxy port `soap::proxy_port`, and proxy credentials `soap::proxy_userid` and `soap::proxy_passwd`. - Updated the WinInet plugin to support the proxy settings specified by the user as proxy host `soap::proxy_host`, proxy port `soap::proxy_port`, and proxy credentials `soap::proxy_userid` and `soap::proxy_passwd`. - Updated call to OpenSSL `ERR_remove_state` (deprecated) by `ERR_remove_thread_state`. - Fixed a bug in HTTP cookie handling by the engine. HTTP cookies are disabled by default, but enabled with the `-DWITH_COOKIES` compile-time flag or when using the C/C++ `libgsoapck`/`libgsoapck++` and `libgsoapssl`/`libgsoapssl++` libraries. Removed `-DWITH_COOKIES` from the `libgsoapssl`/`libgsoapssl++` build, disabling HTTP cookies by default for this library. Instead, compile `stdsoap2.c`/`stdsoap2.cpp` and `dom.c`/`dom.cpp` with `-DWITH_IPV6` `-DWITH_OPENSSL` `-DWITH_GZIP` `-DWITH_DOM` `-DWITH_COOKIES` to obtain the same functionality as the old `libgsoapssl`/`libgsoapssl++` libraries. Version 2.8.76 (1/21/2019) --- - Improved soapcpp2 option `-a`. - Updated to remove GCC 8.2 warnings. - Updated wsdl2h WSDL and schema imports of files specified by relative paths: file name without path or file name with path stating with ../ are considered relative locations with respect to the current WSDL and schema that is importing, otherwise imported files are considered relative to the directory in which wsdl2h is run (the `-I` option can be used to change that location). - Minor improvements. Version 2.8.77 (1/23/2019) --- - Updated wsdl2h to display warnings for invalid complexType and simpleType extensions/restrictions but generates valid code in such cases by inference, the update also fixes a valid extension case. - Updated `gsoap/samples/async` examples. - Fixed compilation error for soapcpp2 options `-i` and `-j` caused by special case with empty input arguments to service operations. Version 2.8.78 (1/27/2019) --- - Added jsoncpp new option `-k`. - Updated soapcpp2 to remove C compiler warnings, a minor change to reorder the source code output. - Updated `gsoap/samples/async`. Version 2.8.79 (2/10/2019) --- - Updated to remove OpenSSL deprecated API warnings. - Fixed a bug in wsdl2h option `-c` for C source code output, resulting in a missing `*` pointer for `_XML __any` member declaration when declared after the `$ int __size` array size member. The bug may lead to validation errors in extensible types when extra elements are present in the XML payload received. The fix produces the correct `_XML *__any` member declaration. - Minor improvements. Version 2.8.80 (2/20/2019) --- - Updated to remove VS2017 compiler warnings and to fix `soap_faultcode` (or similar) link errors. - Updated to remove GCC 8.2 warnings. - Updated examples to link against libpthread when required. - Improved wsdl2h handling of relative file paths. Version 2.8.81 (3/6/2019) --- - Added the ability to specify `nullptr` web service operation arguments, similar to `nullptr` struct and class members. This enables `xs:nillable="true"` elements corresponding to web service operation arguments. - Updated wsdl2h *`import schemaLocation`* logic to handle relative paths. - Updated to improve checking of `_GNU_SOURCE`, `_POSIX_C_SOURCE`, `_XOPEN_SOURCE` for GNU-specific non-XSI-compliant `gethostbyname_r` and `strerror_r` function. If you run into compilation problems with these two functions, please contact Genivia technical support. - Updated DOM API for embedded serializable data types: `SOAP_DOM_ASIS` removes XML namespace bindings (`xmlns`) from the XML output of the embedded data type, which are normally added to ensure namespace prefixes are always valid when serializable data is embedded in XML. Using `SOAP_DOM_ASIS` requires the DOM to include `xmlns` namespace bindings explicitly. Version 2.8.82 (3/14/2019) --- - Minor fixes and improvements. Version 2.8.83 (4/18/2019) --- - Added wsdl2h optimization options `-Ow2`, `-Ow3`, and `-Ow4` to optimize the generated source code by schema slicing, while retaining all derived extensions of base types. The new optimization options are generally recommended instead of the more aggressive `-O2`, `-O3`, and `-O4`, respectively, when derived type extensions of a base type are used in XML messages, which are referenced by *`xsi:type`* attributes in XML messages. If base types are overridden by derived types indicated with *`xsi:type`* in XML, then the `-Ow` options should be used instead of the more aggressive `-O` options. - Added wsdl2h option `-Q` to make `xsd__anySimpleType` equal to `xsd__anyType` to use as the base type for derived types, so that elements of type *`xsd:anySimpleType`* can be serialized with a derived type, using inheritance in C++ and by using simulated inheritance in C using wsdl2h option `-F`. On the other hand this option invalidates XML attributes of type *`xsd:anySimpleType`*. The soapcpp2 tool warns about this invalid attribute type as a result. - Updated wsdl2h options `-p` and `-F` to generate additional wrappers for primitive types that aren't XSD primitive types, such as `SOAP-ENC:base64`. This allows serialization of `xs:anyType` and `xs:anySimpleType` with additional derived types such as `SOAP-ENC:base64`. - Improved wsdl2h output for the infrequently-used `SOAP-ENC:Array` type. To regress to the old behavior, add this line `SOAP_ENC__Array = | struct { _XML *__ptr; int __size; } | struct { _XML *__ptr; int __size; }` to your copy of typemap.dat and rerun wsdl2h with the updated typemap.dat definitions. - Fixed an issue with soapcpp2 option `-A` that resulted in error 13 `SOAP_NO_METHOD`. - Minor improvements. Version 2.8.84 (5/14/2019) --- - Minor fixes and improvements. Version 2.8.85 (6/24/2019) --- - Added `soap::client_addr` string to specify a IPv4 or IPv6 or a host address to bind to before connecting. This can be used at the client side to bind to an address before connecting to a server endpoint, similar to `soap::client_port`. - Fixed wsdl2h compilation issue with C++17. - Fixed `custom/duration.c` custom deserializer `SOAP_TYPE` error caused by parsing duration fractional seconds. Version 2.8.86 (6/24/2019) --- - Fixed a problem with the `SOAP_SSL_DEFAULT` settings parameter used with `soap_ssl_client_context` and `soap_ssl_server_context` when `SOAP_SSL_DEFAULT` is used without any `SOAP_TLSv1_X` or `SOAP_SSLv3` values. Version 2.8.87 (7/1/2019) --- - Added `soap::connect_retry` to specify a number of retries at the client side when connecting to a server fails, with exponential backoff of 2^n seconds between retries (1s, 2s, 4s, 8s, ... up to 32s per iteration). Zero by default, meaning no retries. - Added `soap::client_addr_ipv6` to optionally specify a IPv6 or host address to bind to at the client side, when the destination is a IPv6 server, otherwise uses `soap::client_addr` to bind. - Improved portability for Cygwin, `gethostbyname_r` not available on Cygwin. Version 2.8.88 (7/25/2019) --- - Fixed an issue with wsdl2h `typemap.dat` for WS-Trust WSDLs causing missing types in the generated header file. - Portability fixes and improvements. Version 2.8.89 (8/5/2019) --- - Added wsdl2h option `-X` to do not qualify part names in order to disambiguate document/literal wrapped patterns (as the other choice to disambiguate instead of the default qualification with schema namespaces). - Added wsdl2h option `-z8` for backward compatibility with 2.8.74 and earlier: don't qualify part names to disambiguate doc/lit wrapped patterns and revert to the old wrapper class/struct naming used for `xs:anyType` inheritance. - Improved wsdl2h option `-L` to skip non-essential comments from the output. - Faster soapcpp2 and other improvements. Version 2.8.90 (8/14/2019) --- - Improved software bundling to prevent autoheader from running with `./configure`, other minor improvements. Version 2.8.91 (8/15/2019) {#latest} --- - Correction to fix soapcpp2 2.8.90 `-z#` flag enforcement problem. [![To top](https://www.genivia.com/images/go-up.png) To top](changelog.html) gsoap-2.8.91/config.sub0000755000175000017500000010645513525245157014273 0ustar ellertellert#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2018 Free Software Foundation, Inc. timestamp='2018-03-08' # This file 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 3 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, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo "$1" exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ kopensolaris*-gnu* | cloudabi*-eabi* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo "$1" | sed 's/-[^-]*$//'` if [ "$basic_machine" != "$1" ] then os=`echo "$1" | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo "$1" | sed -e 's/86-.*/86-sequent/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | ba \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | e2k | epiphany \ | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia16 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pru \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | visium \ | wasm32 \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; leon|leon[3-9]) basic_machine=sparc-$basic_machine ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | ba-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | e2k-* | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pru-* \ | pyramid-* \ | riscv32-* | riscv64-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | visium-* \ | wasm32-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-pc os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; asmjs) basic_machine=asmjs-unknown ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2*) basic_machine=m68k-bull os=-sysv3 ;; e500v[12]) basic_machine=powerpc-unknown os=$os"spe" ;; e500v[12]-*) basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=$os"spe" ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; leon-*|leon[3-9]-*) basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'` ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=-linux ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; nsv-tandem) basic_machine=nsv-tandem ;; nsx-tandem) basic_machine=nsx-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh5el) basic_machine=sh5le-unknown ;; simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; x64) basic_machine=x86_64-pc ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo "$basic_machine" | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases that might get confused # with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # es1800 is here to avoid being matched by es* (a different OS) -es1800*) os=-ose ;; # Now accept the basic system types. # The portable systems comes first. # Each alternative MUST end in a * to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* | -cloudabi* | -sortix* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* | -hcos* \ | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \ | -midnightbsd*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -xray | -os68k* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo "$os" | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo "$os" | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo "$os" | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4*) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -pikeos*) # Until real need of OS specific support for # particular features comes up, bare metal # configurations are quite functional. case $basic_machine in arm*) os=-eabi ;; *) os=-elf ;; esac ;; -nacl*) ;; -ios) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; pru-*) os=-elf ;; *-be) os=-beos ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo "$basic_machine" | sed "s/unknown/$vendor/"` ;; esac echo "$basic_machine$os" exit # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: gsoap-2.8.91/NOTES.txt0000644000175000017500000000474313525245163013733 0ustar ellertellert DISTRIBUTION NOTES To install gSOAP, unpack the archive. You will get the following files: README.txt read this first LICENSE.txt licensing information for users of the GPLv2 open source version INSTALL.txt installation instructions NOTES.txt this file license.pdf gSOAP public license applicable to some parts of the software factsheet.pdf Quick overview of facts and features The 'gsoap' folder contains essential source code for the run-time libraries: stdsoap2.h header file for stdsoap2.c[pp] stdsoap2.c C library with the gSOAP engine, this is the source for libgsoap stdsoap2.cpp C++ library (functionality identical to stdsoap2.c) dom.c C DOM parser dom.cpp C++ DOM parser (functionality identical to dom.c) and the following folders: bin pre-built binaries of wsdl2h and soapcpp2 for Mac OS and Windows doc documentation, including the user guide samples examples import #import-ed header files for soapcpp2 compiler plugin plug-ins for advanced features custom custom serializers for various data types mod_gsoap Apache mod_gsoap, IIS, and WinInet support extras contributed extras src soapcpp2 tool source files wsdl wsdl2h tool source files for WSDL and XSD translation WS WS-typemap.dat and WS-* protocol schemas for plug-in development uddi2 UDDI v2 Palm Palm OS support (deprecated) Symbian Symbian OS support TandemNonStop Tandem NonStop OS support VisualStudio2005 To build soapcpp2 and wsdl2h for MS VS platforms 2005 and up The SOAP/XML client/server examples, XML-RPC, JSON, RSS, DOM parsing, WS-Security, SOAP/XML auto-testing services, XML databindings, and other examples of advanced features are available in the 'samples' subdirectory. The 'gsoap_mod' directory includes Apache 1.x and 2.0 mods for gSOAP, IIS, and WinInet support. WinInet allows gsoap to use the WinInet API instead of calls to the socket API. The primary benefit of this arrangement is that "if IE works, your program will work". There is no need to read proxy settings from the registry, deal with proxy configuration scripts, etc. Changes in the "Internet Options" dialog box will immediately take effect in your program. Additionally, this will allow gsoap to handle forms of authentication not yet supported natively, such as NTLM (Integrated Windows Authentication), etc. Contributions are included in the 'extras' directory. All contributions are covered by the gSOAP public license, unless specifically stated otherwise in the contributed file(s). gsoap-2.8.91/factsheet.pdf0000644000175000017500000145001213525245157014741 0ustar ellertellert%PDF-1.3 % 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream x͝qǿSMڕ[E-%QڴXK/G}Wf1=ӳC"#udUYY5ߧHO4oҶҺӗWWWyU_= vӪߤyfY6ipЦnP|ڼ۴]WweQ7ɣ^Ufe1~} k}.?+[SdUZݮ+4]WzeQZ?../ fzM_yZg<-ӳ|twz駗Q` J:=<@ӳ@ b8/]V&ԭ* A0> <r}ٟBဟDu~]kD>2N ᯕؿ_Yɋ KlmuQBіXB[-M}D9t6BDY$gOGGz^V)e a@(#V[1Czf|l_"t`~±G5Y4WJ, 44g>ΦeQpǨ`5/=O geeQL΂[_;Ž izwˋvx{[yoU[ھEavq=$@ =CAsmC]]ff M Cc!؂-_QϸkU]3+o"_4'+w5o@58% Q5pIW:ft}/FżrNdB~ nrEN3ς(c_y~ o..'Ur߄wUb]+G`ote(P' Ep{BsX_ ־;H֔-Z.]V]6r֞h6gOy2$.ESF1 "DFy‡gއ=|,!(/La,9v]!D0;254`bIpjh}k>iVUu)vZD p_ d^DMz9lbwX"hu^;#QvP"g Dbe`M]wPA*4&2 0hiڠt5MƷ5mVi]fcviG{wh[O#V¼"x׋ŒcS\y-@Oabgt]0-`4zz`]{ O\JH!sh񑋈F'!끅Q+:IbmqZTe ^`9\~9hu+Oy--]DY/u9q{& 0ˏăβ|g#J%"z[`ej^a{evB}$xXQ4Z#Lγ'5!sBWCtH0āD[r`yWޙלufFŹۑD{<8}@9-d٣Jǁe@ʿ Tp3W۲Hv{_13$CnPkY@ hĝfZ[=:$wmc }vb%4):pbvgz"1yrlb*#l쑰<ܢ6yh-6bfa ߞ'C I z%<@!p'}a[ ew i8JNy.>-gHs1kgS,/¾{y ;YH}f$ԸUd.bqԇ<2){X#x+ 0;L{mm!x&h&Hy[A3WQWT L]픷^Pot{ )e2鏼@2gسBI0,? e?)hx5 +021!&Qoanۘ :ZcaJ 'M|ertqY"1GQ? PjmZQ܍U,@;$+3b-. /Br0g,-JpĘJu%XmoMn&6$M>B/D@ꬎ{d4*V߯a$0˶.w O[77E ;ڄ0917%ڲ87]Gtmw虌^ۀo^e襁,.Qw# aDD0 [s&8+%¢+u8t1SU=䢉a~:=Ie fV'#%_fӞRgrQnBP| m~S?<O^ɧ.j:َmj%4l%$>1v['4XԿV޻ݐLRݴ6nKRvS+ ؖ$%mhʚr+8cM" 3A&GjR.:@%sV7,.qȶ ї&p =zcmga29EA(V߬#FTmⱨEY슺/I!_/+6-|˵ C45`b-DB0 G#2er=GKPnoQPWhoe3?&+FZcXn![Gb."}xFBDž4I ?G9wHRIm3+HǙM&r|@qSE{ԕ8r$VX̪X+Zg$l>:3$w? ;3FFL06 = kEm(D2>t)E9XUřcRHdzfHOn$CQf Bf%`Z`c$XS %Ķc,XS2j BI*؉L8X4-gsAb`,ʱs}mp5J"ZN3UėzqAZ`΍'ьuj2i6Z ÷S25X:ҜЯQNV:q l5#XelG۟_vuFl Ns, ǕƎc;\M^;^=x] 6K޹ $soҳshLI^rG)?߅-,I_(Svy˛-Yzl<\Ko=Dû aȎ]Os>6p mJ7b ɋg(VdLtJpu|<&$IklS8[5T_rr7*lZ3 /=U4k"EXໝ:*^Ien|u ғM,&+CQξtB_IeO $`\QYW>("0il2>RkAW-92&s ߢ9]^mlz 4n$`(Rz`@h~^P,Jp,@Z vAYU\O @AyDzdPz7xlc#.JLJ? |76/熓]F+઎vBoI'9@2C ւ/{XJ5吔3U+$hVy@ҧ5k\7,l{jyɠfW*nr (w88XV`fv1/A@59ng9ZHҁV1 NB,z(UGʁ^k{d6c7bn\V'5W<'E&`6GԹ%f71 C=oRyLJҼۥshy&`6d̔m[4MpwUXla玳 n"{Єf3]ımc)LGop3%V(ms9/y\/xۻOe >S8ycz嵭3,m qEDMZXwnS؎6A }~;/ѱ-{/[M ipQEe|9drg Jٿp)zz<[wI Ot:7r>+&J{N5ߪreOS ]gB6?rr$+\OZSL fDecx[|=$1oSgYyl[6IUu7 91$_ S\b}(rCGĄZ̝T~c^_Dr+vq&hɵqe wuC޳]87*RvЃs=:9xDT>ÛكWSye-_3?hA gRBhU=kĂR0HZ- z gbEĢKmC j5 q|b=x=-9=l_7bs}Lȷ[fMa8fkf1 7"ri2;U^aՖ`Mt66z9f<2C;Z<Fis;D-ʤa,bA$-<1'D#&tx-7nEhQh~.FY*v6wʠ`gmQSW@ ǿl NfwNŅԈr7{I$v-Wlrd뿸 RXX/k-n+~`lv8CWxC^{#kW 0ԑy`~b>YkW+w/q 1g=rҖQ+O7ef`k=i,ƏlTP?&lR}/dtcJ{6^+I+Wrǖ'=LX!^9tð@ pX!$ok}4nWΜl&`FF4@PA,C8`A}T;Vں78uʬuf%D"=V i u r.QO R`1I&a 9`U(wE1EqoF @b"4Ӂ|g&!1%4tu dmob`0YO5 )@Li@薍^t% ?ELnWs] u sL*[d ! #j V.н ^%-A s&֯_KR_VrhMޢd)HYc wȜ2ZXB ۷zM$CEDد?> endobj 6 0 obj << /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /ColorSpace << /Cs1 7 0 R >> /ExtGState << /Gs1 36 0 R /Gs2 37 0 R >> /Font << /TT7 27 0 R /G1 21 0 R /TT3 10 0 R /TT5 20 0 R /TT2 9 0 R >> /XObject << /Im10 34 0 R /Im6 24 0 R /Im2 13 0 R /Im1 11 0 R /Im4 17 0 R /Im3 15 0 R /Im5 22 0 R /Im7 28 0 R /Im9 32 0 R /Im8 30 0 R >> >> endobj 34 0 obj << /Length 35 0 R /Type /XObject /Subtype /Image /Width 1024 /Height 332 /Interpolate true /ColorSpace 7 0 R /Intent /Perceptual /BitsPerComponent 8 /Filter /DCTDecode >> stream JFIFHH XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmExifMM*JR(iZHH02310100LC     C   L" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?aݧ6>=w;3HKo|!Z`@4؂7+ %ezWiy.{m5cvӆXC]ڥkӱ'<rx't~JEr5 Zm۟!Ez#9?7_&kP \W to*ST[Ϛ5+8v t/_xI"+u,:һmf']RxQkZk>+'B~`3TP0w纨.W"-6wЅ|?oe]5FH"l@Q?&[,s|)&x !RX85_5F2漚-T}o5j=^UҮ~9#?ΧUWz8vp?g\mΛjʑ5Afv@̹PVti9Vfa?X/\[Vu؁3 I9J%R\rrjnVΔQNGd^a ~xdɀrruSCcd=ZxZ-b)"WBytW 2vW\g9)ntI$?:%xok =oQ!;?5~k@+^ U&\ 85Faqk7߈b>eDln˞=Nr̄cO0I@{y'YFڲgˉc|`~u1ϗg/ksk+mX {QX^) r7 uJ؈kD2yN(֠bY TΥiJ&L*Q2;]lh#|YvcT%\[:9+h]6wιNʲ]N6F\DExU5NWHۉ? ^9Cx21^Mx~鱷b 6o!w"kꭾMh4N+WE@$\g5Yl2k) ITY0(?ZF4nnT~5`X)!GΙ~4ï(yC2) f'єswU"̋`|6Д|i}T|E#?;HY"PV<;?1T? HݢAmhE^ٶ؛X?s*9i>qmvڋ@f;]-D29a)r:vk@>kSQ+?j=N(@jW}.$\_WGcCOQQBqB?mz>M=.orikb?JSo(?/TGZ*uJHHndz[v?Iƺc?#1PIñ_%?nvՙ|?WJ[ȏ Ui>"hp.c~/ݰcu! ѭ}O~-Ѭide^y{EN?IB>kTŠE?_o:/#Fē]^4eO+ZP =]s :xz<3U}'C^jzyܷ5̛-l;iJ׿i#icHOR\uO~ $z5|D5^i.M"?55Tϸ|?Lnd~`Ϳx~OkNu{MpeϽxS)4˖LoJsNڮY+H[rLߝH /w"Eg?S'ڰok s޼*z ^nJ5{z<>WCZ|L@=SFs\-jbYBҼ<;.A5/gxSwgJ hV?{{$h%m+p~|IGb}+,\a_ʼh䝟SI'k<7|Tn?7)#}>ظ~Uc>n|8y)z3^CO?~'Ӯ $pk4X`RD1_Lh߲%tT,<]:x]ViJ INf_)f*1 cA?vexD 09#^vU0xSīf Fz [jIYa\38?-Cq:ʪ<$vrfF*sַhh 8A5AgdRpx-(%AUw&}oœxE^&>qּosGXTW@>~MjnÃfJo7M56reJ,=е*x(@߭Sq/r*v?C5/7qW|P &h >S3_x㟊%Dv ]_wv5!C'5R=\'.ݽE! }YMX<z!X$ck KRos]/F`4*qӊ>l2*~_d#psLMRSk|BGbxrpwm$*-< W;=k*j^~.ߋKb<DG`0?k[9ootg?jfj~cch| 07AP?_Ҿo>X[,>i?؃GW7w;38ʾ,*|uy~2`rz5Uǧ| orm"c)pңm㊐G_Ed|P>rO`y4yCp}Mm 9S"vqVv,sN)6 d"<'299ޚ1+7 SžU<ڵ.péTru8`z3|0=r+=c唒*\᳐T97Ra }̨mHICʐmG/i?+rc$u6OS"Nw c1=Gjܜ·Of@Wp$:暹aݩ~Boى9o@-+wYXI=mn`\XgzaT^)kcVՏ<~QJ#_q;ھ׬İ/01H:dVTeκuqgnٕp xA5 0+̪B٫ކUm<zҹbк2tݸz0?5JJpg֤QD9)([[rO`fz s ڦA;3 º DDCuVS 7F] MNcB792| `=koW2GATt&ހHwod[KN3Y׊6vo?`[WQ|:V9n~Ѡs$W]&z~ׇ,$3dZ'϶'a/٪3%l~U^q_=$3ϵ}+>G,p b^wG|͵ŊMo;k R@׻`8UVBmlhů>?ҟz&xCo9,%#WԬu4z_^ ~ ~f}u7OXx~fT(J=%~T:g7oϽ[}>vF*uپ~i-)RC;PY o_zjw_Q[mM'%+4oC,~˗#=+x cW %p[MZ;sVa-GkLޯ}+ٴH/앤Kb6&G֧Zi.i# Ƶnop+g|q'$Yyf|Ym 4 sھ/ ެbtjU4Û-A>6?=A Z{"s}jYtw.3=$̫| M-.,y`H3ڹq_S4uy-Jk/I9[޾}RqɆʬ>bÒxqʾũ\*fO@>b+җt:>]2,\n-"q־43FhE|,qpW6mc^ijq-7^/ ˸<5E`K9ȯ$'~5} թRgR2_'4'hkõm7уu ,#!x+)-ڇ:l5fWZ+p+WZcyEuԣ7cRo[P1\`E}(%X]6@mͬgtZ>o0r}x'WQOqnqV❮l%d\+FC If7JTZ׍>daJWZX^|t&Nޤ9f7(5e99x4$LU ~>WG;3t9ހ*~-\P*<7bGp8I#*sMR|#u=~%p6ZhwW+REx_o4`bMWl YYNGe9$gOX|{>}}﷍ɯ:Ak^UfXҰfb/#"|U/YXجPb4y)X!@(G.<̣"W>GB*,ZQ4xw!wX>>$<==GUt,=+`Ԧsgo3nkyCD^p6f`MY=7~A=8;lܠ#~,mdoq)4?폌ցڣ@}bϧ1'NC?emdh_F7N=:WÝJM'ƞ W1K/85%mY_6m>r*F1TR]SP ʏZmv3 K+dRR?Ӯ!0̚5Ěav"<)?JtJ-u>QU _c?2muan?A]7C =52D_͆<B ~%Z~ մch *~dS?¾R$mY~~7PZ|0R]kҶ0W9;B7GN*%gԺΗgc N d\]msf '6\svǴrOeBB#>5mbԨQ6 0Y+E9?ZѾ'jl' ׎xmjϧ>Z=J=cI ϟ]7$KB?85MݿV>>܂J8Ȩ*xca|O&. T ǵz> ms6v}0Eu,D$%cX*wN$`cdL$*5oJqQMp\nNw"@T.$(OZ+gw5VL)RxA^}C:."Y+Nj&kJXcB8wt^$Y3q{T"<9nJԊL fv2#9MW2! nʴM=E/W1ҟ%S3-N>mRvt \yMD.JNF*yɶrJ=z.WjkRҧ(=ԡۗP=[SYrv确 :[H ^6I?Y8Q7EΞ|< f^<3Uq |+ii̥rz27I>״E ~ץ#!˖1m#Ѓ:H&o*[d{Ú͹o۷' Wϝm5U#XI$K+|y!kQt#)CM ]⫘>Tt1z'謴mCaXk}e6o&S'6>ak_÷Nm1Wn"<$ˇh㡑ud>Y]+zyq_'^x}70h_5&vɕDx>#*NoYtR#K>W*~)Y,Hfw3ZE06GXdD- j' szNW(k7EmںitOGJ}tĈH>$Qu9FΥ8ּɦJt5zDūˎcIIj5fSǰ|$@ y8+mg2~b]qM8{j7ob1uue-OtJ9>t f?Ҭ 7l8GiV < ȤʾR/]nHѽRF~{|ogW 圱=޽'^Zxw{ɪ];B]=[mJz߈!еR[Ê[Ϗj~֡u+lњ٢ f.!d`pAIRң>­xmDGUҹc+JoF5!mKZoKq3< Cą +Fp+ٜt80=&}To,VE$[a$LvGxV\qj=Jbpgpw2pX,y^[[rU#bevjcj[q/tm>$4+_RxwWD4eeكtؾ$D| %TU=q\8O+FOi-Ϗ'<73FN@(.Y( xNkU<-_$lZk^ /~Ĭ9+ tu%Ni.ΟibZ(jsZ4v(㹍vF-tUH.;5tͮNUEMR8Pn<Zr\ v^X]ر_QX׈=B!G^|\):0U߃6PWZkQU@Vu0u^FXYh:RC *=?h XeI=C+ j;0$J+(e,izPë]S[Fs{Ec9f*h Ie8i[D{:}+vzMY;07]H 5/`TC$9z:ZًJ;-5?$CzV֛4zK뺽{ND1tMx[s?lu9֨{߂-ƘbPf,k<=Y8q^'t2RAJb-<o- R=fs˱Ͻs^" Rf+۳^0Xy}N[#j/YYܑzѷwZLc9 ȯ^9'{w#ZcƟ)$6Q+fb:+UL:R{!:=W&.cFu=1^i@ i?5m Y]!Xנ_5K S;~.x~u).|qjs&~i tbC9sF/B}pZaytPLWL՟/-f0\o L&G'v҂Rv#/ɱ䐚ݞSl!Nk'9+7wW 8UdԢa^w if+8C%vuOv0klFgR#Q FSkГwg:沾cTӣTj+6d iJ-o _Xva';P¼Ųɩ\u^tڠ{W-,wQZ~5 E5c`@)CA 4#j}@ٿëTk2 XA-+W+_cS_e.>* ^G idlS^pUp]Zsm>t>Eɥ=E34,:8#6Ii[2Dl%7vbYyuVXBGg*կ}~G.|:*Gt|F-P⹳abPN}AR2eF1@׵cFiȿIu;ޝp ѱWlh` 921_>|G ;WfN^\Ӂ~ٚHB#]kzqY],jwdcc^)ӡfdU|WWɥudtğ+`9+(4]Pnlrk|CoV/Ö/ "~16xbPuhH%kDee[:+ʎ.)ڌ[]},4y/.7VhL=ҹoRӼe]|ϡzÚ3qXWwm G"άr Ĺ< (C_h}-/z>\*9?yV$a _nW7:[{f`pS5Ꮓ d$p;Ed,*?+ ַmۖZNӆQ|hyle2m[kռ4IYV O)ƻ]WLJ5hK[!L$hLP 5^Ěo8ApGt +C2n5L[PW}Exorš= c1X.Hrϑ,3ou:ޯV_Mk1!۶IoɒHsOO*]#E|֯u,uh*s")j׎ [\ƻLg'+/Mr=_ֶ̦K(/!o=#YO563s l"z+VII` ZӤ)8{U#x4Qd{w,ÌvױxcNL^k&܆ӝ>/dvR.DZ5sJVB-s~_J4Bݥ=+f-FG ZNjo5f~՞&>S`}Zj5bӜ #mXWx[ӌ(~|.c rISfh&6⽹ՙK kӤ^8[kwyş!6`3_c^4',,w 5/ع[}vS*RR'{Rrêk P)Jm1=p1Vtj-Ȕe/OSn>OΪ\kikV-LozeXCT}g QH_>-G-܅ bNk⦬vFRV!8pkXeuvQ;-c孝c^|sjT|^m737U}=Y,H:vY]#-_5j-gs.x9:d5e2~T|K䉷QIc /-+a_]O2ckm2EMa5~-ηuKB*gf!>}6 ć- }/xw_I k irTXg-J?e|_'t3>!='|{Tձudp:SE 9-ȡRq.M-)ϵc:*.:ź5sj=ȩI𮪹ʡ>-qV:7yשMйe|9扞u-k5hOZ|I[&٦fP NԵ}YV,ѥu9ds*p*HPD鎢 AW j988O$j2 Td9v9V>zzk'G7t!w^E_!//Csnl\k'4!Z4s>ͼ7pku!cMtS2v)\/L{1}xiw`F} xG3ZSڼU5yQ9`~ku{٣v50POs^{ZM36ӎkwS=C2t|Gqq9$ZҩyQEZ^r| yϽaxo \jrG"\5EF 'E#Ӽb%NGp4}knHqx]l֕#{+}#& \{{ɆUs_!(;L,#q'̦ R-rUo\\}Ky:\xMލ?k>Ts-{HOf'q;kf72p* x:R+='p,A$Wx"Rn;ש SRgȣUkqҹl>k|zbWh5KW"})@FN WZ*v[PiXvI&!ܳ ϸjiyt}F|í{ xǥxǵ{F3|/ީtu)D˃r+ZЉ.֟(tzt)HuzbP=5b$@hjyj<`DJ͍$j2ּ ;AiiJ2c^ J<mi夳hf)>Wؕ&̳k%{5^_ yCgSA+'CVԼ={km,S4:g%fc헴g /F[>}NY}SE>{s}6v[< `𕚫ldr+Ƒt+Ȩ}w*j!C-+$]$\,x}%WWP}G}q <(Ѻe^/r; 6zbA̱9S{O} +Ƣ<㥑7E[ ^q_/AOar]j<Wo-F[{+m2Ym#8hDIsySGyAtl-VD7c+BKh:G9k>__F\w|̧u7iOc>FO{s὘ܓ[/`QQ^d+˟csyTTmǞ_qeEOQ^wIuS,MG\Z֖hM%'1ibq8wY[˄*Rώ>$-Uˤ"D 2zz`c ~#'2`$qh>ק\0ѼbB]7|X4(x} |3Mé||CqgZ1E(-!8?l+q*^Y| xu n>>mW8{>Ե9QV[R0pk̼)44H[b1xx <ӦU,{y"c/1>^}ԝgݧ׿:=V [OIҬpzZWºݗy,J=+ nQas,G{۩8TxlTcqt_ }|v𥤄Et=`jX<;>#ԍ|EIʜe[pjp3^Aǵym2,w|:ǻ9zc|g#5 mH#+~k2}v8BX +=zвЋ:Ա2EC>$3Hckc$ƃ9c+OjW2i iJvKvncF\0QT}'B.-OY_gg{WxZ*\3y:8<+Fܾ"O,7*+>> ⿉vךf2O+ m,{㰯9cSylziIyG}:vIyEU2te6~Lc.]IhM\_7+?as+4gi_ms d^N3V5(95_ )En}٣-2[":u⌛ԑ~7>7U.e-6le H>ޔL4^')1Lc6<†3H}k)'vsϾ&WMELgJ<^=z!! OpkCźuǭyRV{Qg̶>2Ɖ=j$UO1\8,]/ݚ?k~ c39-R;-mV28qqj\ȋ[XoMޤ֦6ַ$Juk献 ;[5 '('Ԍz8F&9I[t}NjKCCV,$ ׹-"|-j'z?H :JiOˌpZݰ潲ݚz?!F{*H6bOzI]XWB'_չ˂0bUc_E唥$As[iޜ׮h8fWk3KlIHoj.܄b1r6jN~ȳ}X+/4w8nA> w 7dVGwzⱵoP10|g83/ŞVdYGJ_hd*΢`39L3Gf̻W(WB[3OY*|ԑj-4d\Ҿ1]:(WS_F/WöCGD }i60$ufGB}0V͎.,ڬ{(TkCP]ĊbxO/J}I$C\v5⿵GϣNvfJQgVs>Z{ȴ &!TEG2Mg+8I$Ҵl{W9f8"Oҡs]2ívV~$ F ~}>Sפ?, yDEג6הYQ] [Uس܎ka< \4C= ;h\¾oC/ D&u|"i&FSi2Mn񚼰`UǥxnYmbzV-ZOIb'^ɭOVKfUcǭu6:dkx?I+%&%̉Siٞ!Źzor]<Ȗkћkּ}gF!iwl̠}kx(6Lb.#1]X|Jp%{W iׅYf\zf[;MФ.Z"S潧*>4ңW59M J݁M\݇EpmԈ83ֵu;`SWgdZKN+3R sy,sҿ:ZCF{tzgoϭXP+ѫC3ޮZ![4^Q_QmyWY1E6Wr#+nl5$<0KFᷞ#/?ޗ諺r5:<;C^y" {xwO?aOx5k.vR,p8b_x=ޭ}[\JHz6T'Q)0zf> [HHz>qg^H m4-Jړ=+sDN;nr$+JA-BUASiCR7|_/[v0dWo.0 B12{"ֹ%9Tvm}kO@?0ҾhS=ۓQ%+N\Ew}>&{J~+vdh0'We-7U s??8;E?:q;>д{>Sy)"P V5}jkl8_+};| 1_FxÛ_Rۉ$>S ka`>.$̱8Ht]Zy FhMclQ#yaՁA׽|pKZxk.m>4YOBmZ1t %$Tg_:CF%mf9y~FuU//-$լy~EdڼT!= jME24 V@:_څ\I"(i,dF3 CK BּlDU-7g1I(-wv#oÝM+a8;Ш+/r՘G/!8?J5i|PN]h:,6Ѵv:W_2r{(0XNkwm< vZolȊr=[mZ(VDUS r:C^c?^iGa*O }Mg Kv01ӛgkV3MA/S4 o&GuP9XT~TZ߁WI+l6Ąu%y`:fs,<_{wsҼ\W+c]$_xm&>x)eS-Xtkĥ\֯c~&x{^9\}*k+-kSdȶ8l5ᥗmp0ޕW m4eiä1b>V5\yq_P.VZ_ yT2+o|YY Ke֠H6WxE/;iN~S8tΧ<é¨_PAr+19fZwG>3 õ)^VkALx''5|ijVb/;ʲHgbyDQ5|2=CWsk-fcik_d8^N bU|Tc2]EF9?u-#xDf۵a'W-ۛ9.!ױAS^emAr-)%CK if2vxv^cT?v<[w#/(`)sI#g,Q_\[$E-kb9iܸb0N+jN3|ONT-%9}k7/gw+%s9>Эi \pGZy8ez<'.mnZɷbDE'Ue~mwi$N9x/̾"!W4uEZwṴJpY9eu%Зmu=Gb{ժsx_~NzW6k*gAng3[ɐp+/Dk``5y⹤em3 d׉k@,Y5WxcC,m oM8M ݲk^<TbYm f lS+sJzt=YQ#O-zGʽb⊰ZUY&N؞f/O L]SB*{8^={cQV1I yd[XˬG+_jWs^e61X0 e؊1S]5 c\v5^I޹mrL۹~UFk ;reٺs[_?ii+iNw\n+*hFuʀB}zW6WSF㟋$i^rMmi?"ʢg33\FӼo"]t*XT?>i-Y#G؟-u)SNwp0ZRo3E _|U=^ܛu~psI+pU>W^g?-r_ -:;'fEc]w$'¿%!wge6꙳@bN §O@O֭Xٙiֹ?AXf$lWX]SA{M7bO-H̯{ Ely^_žVv:Wc&rI8۞~]x!\q_DxJJCs{a ˹SG+p4mOJO]KqS|o<_LϙEusx+M+0@ښu:lw*2A_|^Z 8,OֿD>TOmyWz'+XÕ{56x}kV9%B+q,. s\'QӊtTF2U@Kn bHBsU/`2'!Gjmx32SGhcM\6i-e;hBWz_Dw;豭+5rT"I^$fOQx8tԏַ1s|]NHV&~$cM(TFWtմȜ8;+_tq#S!|A-iXýg\0SgšHׂN+jdS|V˰<"]4|3 _j̫ ~uWrCoIK+tDyQ㊫zf]S :mTy< ZjxY3$F+jmv[5rYJzWx1ɭ8VSAcw}ک /kez͌ukV b+SR "+N2]E42^ox"F$g_ ʿ-}?xx¶2 `~sշ俺{bU \-i~x\t&f/ב_$( |ksc %k4 C˰(S+g:c5tz?ZVZcV1b/>١PgAZνIr(csN缏9졧x%--|v^ /mun=A4ĈO|?kZBA|d>Ur9j>Jt.,<ꎣp'u)uqak+p5,z,渏>3n֘za!x9$e#<.uYgtۚoE`S#h*y9cvl=xC&%Dé iQkzwLu5>#i\~_?AIՍ84m\a֤,y'Meb\"$'ЭcK{Jc|zЯX~9,Zؐ^n?ڭm7NҔaC{G4{锬˃56lFO g?/WV[G!A; Dg-q`,Ο)nr`%_&>X1Y!cQ^m.]icw)>k|wl'kaNu8 ,^:tZGS#խzN^|@t s*2k߈X- l*jpInTki{H*!.-u(2:_5ojOɯ|gGG )Z0H+D:y"k#ލÏ$H M&?it4(m/& Zf'S:2dp5O_G?S\M72DbH$_况t!֖,m{U?#fH>*1k6|>f8DZ./gIwJiI%D7?}Ԥ2ȠH@< \Es,N;q}t{I8*e*$_WZMgҚXToKuTp3pi$~U6̻R=ꌑa!`duF6={{ԦӺ42MThs:U) #'ͣE2 u;vy@Ob^>_ֹrGU'(,'m~ήc}!PO$c]K 8Ahmg#;W4)=ڳ2Ab*}Ҵ#SZiX.: Hp{WN{eZZMR#hns^&fyU?F#wps{[6|E_3ͩX얚',JV{͖։GJPyh6rmd\qOëD'Wo^ڬ9iltgtRˤR4H~SU.W$5d2ynt2lm)ln^SҼ)cgoXT(1V-:MET֗2T<+5ӭ͓Q˥M;ҥVJ HwJ)N1H1]ΛqBM"T^˜֒7p.4Jq`$^֋2UBE2>AAhЩiOj`zbY[Mm)|lW΄^7\s_7VҎ[F@q+Rqbahomu ??t+f.rz |U #ߕsXsw?5%zr٤#s\e_ !hĻB88wuUa2^/%RR&Nͽ֛掣7zCq)G|ey[CD;ályq2x__J5IUG,@dz#uwjbEb3^^|lddNe xe}3^*}k߃!9B`/_]oVwm.~XiZ>+ FWKsl% U/ ulIǭt[`æ:S}~k;nw[A'8mmP 0z ]В4^M2t|*aHa\="J׭%kE7,UgQn{.?硩Ɔs暸d]qs˸bQƏ82Pxv5^+Ȫv9p? ZrFZ? &pWd}+:gBvi´,RvD #8 lɤS=kAu[}\. 1ֺgMZSg?:&X^ $~!Zز\;?A%B9wWݟ oo|VʴzqTZ|/k7>,Pm֯8R8JɨݭEc^i\4*DʟOG.▔BqeLckM.<>{_KOّ@ZhN6cxEI?ݪ_ o<1 r(붨|ϦMkwaV{$4.3O{7/bYR|ʚ; H煪zs0ܚ2yrt6::4q?0n¶]Yl9sX f+j [gVWh?0 ֆUj5?ekO-OOwƋV]_LӇ|(t?V1qXb*=#RR,ݑZU2aI oƇ}-rӀѾK0aP0S2Zl_# V3 QF}{ZzxOQm$0,:ײ^\ .= }I~˫Zy^@q yҞ_7 S^6}O :tʥs!\Ov\rkXE_C¶VF\. 9m1k25^JǕQkfqǽTZY_4[N( g㔥^,:.kح$3:sX6B9zfӛhgsZ; 蘪nk1k u&*> $z⽃:}Ҍqώpk>jOa"Fvc0]FyQTv0'^L/5VӨ.yoL4؁\w>,ģ\ĿݤEf=1_/ըMy a1YsM}GZDF8 ?Fm5z4X~&5 fծX<0Ykk~i4,E>/ qb"&-} 7Ƨ_Q*2h~c%+v6UgO+[ 鳂dtż{'6ۜ$IFsYn%'+g\U; }~۱0*{vz?ë1,I$W+־Nh7eGկfix&V2Etw&O\Hṓx=(t$CQEgˢDmWa֯%PYG>շP-l0q]Ǜ-V8NM+IGK^|LD`Z޹5+gcHa&g\Bpsp:ɹ̃\r4ƽdxxMOǫ7n&o>*n/}uD*~  ?g)Sš+<Ȟ`W? b1xXe1 #9N<:,!@=9u|`b~˓ ctⳬJV~A59~B-Ñ\N9jY`f'ӽR wk샴 ccFdltj=b܉l̻4Bg<#O,;tܷ=ZHibIhC<@V' >j7\5NW9wtnۂǯ^ka0UtڴQF'f -Gf6+UBIƒZV`ā<0Iɜa־z1izƓذ^5kmp~v&5iMɳ -$y'qZK}>qI%%;^xNfRz՛yS%rz5jD}VԜ3j`?9S#n?r{YCDt{8reDUoCƬeO)H1qRaMhsE'1ک^XQ5e%To/$q='UX#Mc- d961pQe=Y0TKvCte"s>}Wڎ)P O$zףNn5"*J.3`ڮ2Hp3X wrQfW-(#,kO;wu{آbg\]yt|ssl mr➚*vwgӤADqW~ 4uJ󼳀}^5KG_;[42S)Iqc_xoųE<ӧ:eq-UlfF;]45OOb5Oja$D\z\Z)C(T6H=ED9VyVFdި \)XvהI:f3ֽ%׳^]Y& Hk߀OmYķ,{RAk֪ޮc$"t6|KV7?(.r+vmy% Fk8uw'8>~̾'mH q^v?Ѽ4hƧ+WGx/?+t׎j[9"(4O3槼(cExXb^^Nj~YWׄ43[6Xd niڀyuf jKXIn7moek9o$(0(` 4}E;]>X[m^4^ƐFYkͫK* u [zͷ k3~3xXԮrWF(\NS?8]<\1psCFxiQnzozl0c!m.І~j8>hi<;#Ʌqϥ>xOEF]Bm! DzUfLkeYV$}ndo/uuO͖:]w_!d<{:ːe)JΟZ/y']7YOz+\{hVVKWEaj^lFWI^ϝ.O,效5ꐗ:3lNt 1X]yr# ^n(pzk"g=V=vϽp\ x$6k 쯪wgQ7uL9q ,:+3 @Ţ]~#d 5fm.Y7ջpұ%,Qyar=i`(&C gV+gnJu E%%ZpΧGs{ Cj1_7~zOA(B}1'J&0ez<{#2H~R}Yk-q4R>|04Z35\ir&(k%QO5%ЉW.=ZYugN_6QUJ{Wý:#;RAd\S)o;k:xeu+FVylJTui>Z~)= Aֳ4^~й%~eC0lS?:7]dFb:yԱS}ײzn8H's #:Xg-E`tMî L:uE( <]r8 κB\lVQ*958ԥ:m xYۈ:cڵHϖzf* ^F"hJf1Nr{V ف.\䒢2.UoQoBjnJ<A$sN#9N+lEz88:35J.Zv;yɪԮرhۜ5z\#ɾy.f 'w:$b+ClFwOI77Qœ3qtUU+;Ö)E?i𺱏o.?ռmŘ' Wia9#2<=sSھzҎ5R\^ #2Jv]]}oaS)=xX1'UBɉҔfM)?skhed _:^(k[_Y\<1+/ٯcz+y5 Uu9{NJiIҺ(d85ZfmL|\7<__B/m} %X|^rj0r4g__S|U3Fd)־BM[SKR h3Ԛܒ/ xe]ϥp"[J5ukXQ`Vy]=khavz>Z^F*su&[|MI 36kng2I%oÊ[N?qsE߽r7f / Ǧk ^;Sp˞Yml i>Y xCv vCPu-![FT986¦n&Q#8OXhWF⍬J~=MrƛxXu#e)B;=ڀpOk#_ ]kL"ܮdilcrw*qj$uT"d\Z,_5l!u#ָ[(9UnZN|#>(Jy$5oMxH@:_-ţo s^cy[+۷73ד18'N|p:jpi6۫Gݷ'}H<ǧDjkWq+ {Gn*X·9'Ry=W']dz51\%LFJ9JI`>JOj/7>?ϴ4YXB=X`Wk~h:蹒Y3^y7[]7T[rJhrRbkKhj/>l*0^* ~9p)C}L9bܞZ%ijтY>l3 ߴBxs [ںѢ{ٮIy2뺱eG-.2סO%zX-ٲͨ0wp:eL4[cuPON-e= ucF"Pǝ5sh}η27Ev&H5Pwʽ9-|YzoHђXxԍU9=Oj5K>$fq_9{fٷviөGX;1V>Կg_Ok߳6hKZ?\-䀏S]6k(̨:We,Io3~xKc\փX%u^+b)&fk?pu8Hg7)'5Iʕӕ.Y}gs%2ækfy58ѧЩu>} J[}vWhc9qብY{6)#(i0j.F=ifn,IN[.l۫믇H#ңW ;Jc+<z$KqV,﶐wT䘣g8qV"\$ )\W~yo5]汩[m> 5ڨ-'h[\d 0U5)\^qY3rB`z՘ r9Mn29DC)u_UٯOZLwYҜԛ&f-pbmp~2u#ٯCF/gޱ3FryaO;\ w(ՍՑjMB~\-T`0VSfVQE| '"ßR+<5Ηڵa&Nָ+ͦx5rk\V;XC=+#? U*sw T*H~y[{SMz^9go/ sYw$ ZBq@+Ϝj<ʪ%,]N?R?}_+aVQWju~]6?d iB5\vSiR-#ݼqc7z^;S7ןҹ?|<3G5<׌5K)PҺߍz7g6HEʼncWa"d~oϭ?%x4&{İi1yak-N cOTtԴhRHp<;6Cm6pOZ% $p+r(N}e)+U[5,ᛜճPy7 5,Bx[ƂUf!ujxϭy/mQҽp$QW+2saxQs5N:=.jJO򯷓*nzykgv:uE}YBKHzWA᠁n8w@}W4aʑh` "3vֻI1W*c9V}?}srUz֎SG.ﰟZ<GK7?}_"-ژP (?wZОg%X_Sψ4;ǎ=F9[Ѽ]4#ˑVw2rw,k*3SEӫ(>[k >rŰ]ڵ8 g5kvr{ӳК~E$::ղN& gΞ*[ki9U{IL,LWW"DY',*h<7]ΉW,L"Fe5.// -}g:Y]hpѲw^jR|eaӁTޓD}LU]U18ǡ 7QB>R4/°n%7,YIZǞ('u-bཤ7' .}jǍu)H͛?;~u%Ytc;m;V>֎c/`mt\zWqM31rS]˫O%=_"$[{wŦxJjjs >S85ؗɻ45S>F:w~ k## ^E?x͜۴G whyw&5QǨ928cK Y=IZV"kCZw|82®OZ2 p]`ݫ;&|JdN{VOb:Ѥt fRnJVki0N_SCt I*,$T먀GJfu8xʞ7+Ԏ]:VܶoNxȤk{7\I)~=ah*0[!pʙnsL$)8N1wzE@,pGu4 M8?Ms֘s֜GT|qT'ߊGwstɻ,{ԑZZt)m7ү {KF g1=1VmJLt_fR<!F\Ԯ 3\%W2TUJWPM9'-iO94k65ٔ>56R _W ?vQ$t՘C$maF|~ۯc}{1|<"3ѓ¾C +Vb]+CxIMlKujqs^ܪG9!LUKH4}RAey5vO5ˑW5r TVU!F^k̯@(q>NUn%K s,jy~4AmddW,ꨝ4:>6f.2xG0%ܳªb%l, L3JqJ< Seyr+%{'F=Ev n&)#?t>x˧,k3.k3,د4lc5:x/X`zZh¤6e':Sx C=|wy*bƾ,vn-|#xT8+"0~jǟ(ڿ>St>E/k>GL(&<#zU3Ç+.'@yP+S̀ Ev)hsw^1SՆrU[-=*XƼM()+u. `p G>/QqXzϊmtd{HQxb?xbuݹKu8潌DjJ53Ĥঽv<=~FijzC]nbNH[C gŢ-LKFޞnH*ХU+֚o{5QvTao6#֝d'-+uK)8\5hBrH`1^yl=G.]FW}O ]. oc0߅Q^ZܤSPmݹ*Αs.4t))'nJ1^[&Mg]Mym\ ^jOI*b g4-qx:N(D?C^e{.ž^k2IY47qUsޤ%@px5FY!< I`lkP dM)'ajZIrq5Rz79'+|W s]a[9'?A;w=~8e'DRؓŗ)ޟgvǙ G 6m&Jv?" ?F5+}]/xGCA(W@~;j!R!i>bQfF0oROf9OG\9eSufmn׎jb {e}2X}J=-\־ sYMיxp4ڍ5x~UIT5^vHGNyXM KU%]W)YY.BZd`Jnx_Ri`5'Q X*?ZcH4gf ?\Y _GF1SJ +Rz_=qV̓DAVpur]VWTLzt2`:UyT[̮d %&j)JےFsSpxtizKXYd=JAii:Xxui~}H-/?bBԺL{qSq\%d> 4[uȐ`KY~ֲѱɐ3MX Su<ձ攆Aث+й5,|⾤ۀÊ~,/Fa]>XWbJOǍidlT|cc}{ji!F+N&%67^AVCz֒|.fw>FHYSU/tF>s[w4[5h[K"K&<|v7";K7aR*k>v`}zTmzF\xXbM@n)]|dNۚS\|=9d }U:biҨ8547ZZV+# {1. UԬ"ӮT9 -WS4א0W@=Mw:/ƻ <:Ն`٩H+4oqHTJߝvoĝ:.d5'qʜG]oj[A0`W+(oiqW5ՌgF++'i񅽅yOz?ڿNBM;>Ɓ BPH%i y"Ե> {3IJ9F|xgB{ pM|ѥMherzW?6rRF$Ӈ*ͥvg7E$R}k5όyƢo3ǥmj;9-V=KPkY}W{5b+uu9O-{ŸZKPgNOgU8Vὦ̯3\֥CGO '_A_<%ǭEh}޹|GѾ'xaV%rOuh⪫IVkO+?):42g~DHR5#xyzooƌqJ~͢q}hp.!B-5ϊ7M+Q va@"{޽⬾uj(ؐSOaRt:tNdZD(2sEgbÜd49rsUHj:D"GX8mԹ] GAU8Z$mvjS8%8Ӛ+N+,JΦf*ڶUn$Kp('5T s߼Rq^u[u9}kqs#Y}c2lĜOZ)OQX> ˮAg/tdR)}h Q^nHAR]ca?JA'j-2+IP?g=w'L2aQY5B7Tug^9?kWd̓U- ȭ]$cx'+ţ-ǎsq^7Vp[?4_ 8(#6 ^?l=zK5xGlɴj .6^fv#s_]JfqѵV}WAܵ<` y5$1/UqIޕrRH)1Sȥ-c z╇rXjP197O XpXK9"Ͷ@WEt9fwo6&ϣӔں`<Vt3F]xW̌fՔlC'5Lc`o'MUE.6}3R𦟨UP8~eFv}kŝ>W|Ӊ*x$ȡa)B<$\ױ>H4ϏZm0FƨޢL>=qXxu]h<œ,l 0tۖLz֚ӠW=}f+a^1xhFOBh?j:K"5;6? m ??pZӒZ28\?4֤y8ٟGVt'S$U +̦Gf/I#B՘! UmCVD4>SewfMk*AN,wRo&"q\HS{@s<[}k|3![t0իѭ5m:op[˙B,F6z1?I}Vx+k̾5GjPZ9WZ_NKB8k jگcv( K;y=cIۼKfUIb4Wj.;CYQPjAozer CroVg$MX6 PVW*Р9w:J8şԠVԕ5\)KJ +2 C&wKm|ReAm:"iWqI_}TaGPƣ9SLl SUQk!5fzҋSZv(&:W5\ YkI_'o]{נxgDOY@TI$`c^5^wyrM{;Axt1mi>"?q _(xOŗ>`C&a_ {:Cbp0Uv37mHH |خ/ h~ P SUhYrH/n=xFIs;qO37d麭΁rc?4o]-%r8\uEr=+h3{VZkzFOh#.: C]Ə/ K :T(A}o~_?`V{Woj|zqTuAKό/v qھa ,Hǭw{ۜ0$#|] [a+vE=+OP/.IVT%>^_G}}7}1 SĚ|?DfOkkE=V=ׇvnss9gkˢbͲw3[~)21~??]&|]"BGԏ{N]Io[=̧!)'E3q,ί1Sٿcʨ{ $#-^u@tYST-n~ /T1ǿkSH q덧Ip^3E W}OF:4u)n/;b+W^c93|8񽾁Oo.u_u֑/wtOb2 (su/V<2xH%xb daєk11JXYi%7'-5 2; W7 Ơ+A/4OROOqR[7E:澹/GZ# ^h-ճ{z8>zrٯg,3cSR-E{L:z[)R3uN 4b0qfjre}+FWڙ=Ԧ>Y\ZTvV5vbkzAq> mx/r0H~,I]x W:_D'*.qΣf>**Wfn-o"[} iGq!v҉E`|W+x;UK Q;H#]jaG |3iy/ĝ8YKAoNk ukG-B. ךxòLNw`Rxqe`"n0{kB@j;QgB 1Mc^G8'A-:/&4D:]HfCu\)EKP+׮emFmayt?wK425=@"62s\rݪvyڹ]bm"i'mNkƚߑnwZ\56AUN# 7m}u$ՏҾ&sK=gxF_t3Ond zf]N+| fGWk豕9)/Bvosq!mz;fjSEdaܞAXP.Wat㯯]F?v{ke)KW\ZKJSK`Uղv%g֊I'" &3NU朊Fx 9qSy`4AW8G4J #m('u+40r4"Hw'=-&i1YRT2kx$KDr><9&W3LCWKc\VVo|nYiP eǥte{=-ǥtRpau9Vqkg.5Ss8)((֤o3-vj7qYPVekG cV5PtHO)v@5c֔uW $MBRA v }@Ri6ۏ2Aa+Do.60~4QFcªI F|H6qIB]([se"%p"ڹl  cjdj|\.xGB𢌳 m"RE=TB֬?&E^3V4'VDӏh7z趐榴Z&x='_r#\+ס0xp+-x'p9u 5ux.XB{xB? ؾd5gROjb[5G F^׽R:<5:u*n1d'_1w[Du k+p7wE뭖A}o|ut'p8>-j~/Չ3sW<1D#9A5O`ik\{r8$ȥOD$:YW oXZmEGZM𥦉/U ǥ 'd|usH[K0j|)tIU~SҽsXQM_6zٵDgj=gY#诀?0Ez&<@AdW~ >-&6,2վ(_-öPfGsδXrȕq+F|BkmXT޷à+չnEf73d ZY`vG"¤YJo*v溭}SHOtJZ} ;5&~'ܼ ?moCp!W˿ R[W2ǖL>ua>gyQƗţ-m%eתA>o&|ǿ3Iul7vW 7|F-~R1M]:4ѴWp֓kvjat@I Vl'p8Z*9˪3R$T*MKWz*GGNOg޵/ꬴ$ WһZՔ:Keb~fɯ!W|Uk Ir{r+46OQPwOc(6g2? ;^h'ҽe$t,rP^ge"S}󩩰GWbg5F=rɵ!N_[<+a^㨖it2Ǹy,5+eKrtԎ$? uXy|irM?2|Uc/^N'Ly,y["񏁮YZ־-:B/s_xEu(@x|f)A~Z?G|9X(ATq}Dbh+Q{z>-bfٯKKuo[H;[oY;}WϮG~F-KEm]>Uܗ ÿ|sKפЯZLa.DF yo|V~-xsuދu]YZRa?oO<|sԟ⹭U<׃xSkX=ѣ[/O-ϼjߌ1kZB[d?9#5iS[ 9+hl|W9iP2l" vvxL!U4[q]X 0Wm i-D2 [#ұĩ+)iٟG,S^Z]5fHmLv) rv5^)MX01פj#,W%]8Rrpz`k+-W@zξ[+k2ZR%{ Om W3* (m>>|%mԐ$TckH϶mnH~k[F *^JN1Z팪Y{imڽjTS牍ɻM{v 0}>h"68#tBUwV*Nqkiϛ/m<vBW [⺘ulqBoT{|G~Dmzu^Y(26NNH5R W+'=Njկ|,H8yu2'ˏη|Gn:WlP5-X]xjTq0Su&q~=/rQ S\ ŘrO$_Q0T*>H^<`_,wW~ٮ2M}G$lm:yhYZ|O QP)n r[ګ^jg>/mia8T.ۏrjj--pWMLd ]@'8+VF~niZnץ!L]6m z8so !2ADJٱҼHr9:ԼcʼAcfq}Ό-LD4tcm&ȗw?n7sMyN^c&j/ʸ+j.Rp}O]ӥsլ@E + W/ٔ?ިVVZ V97О+;xs(.C®Z;BmAAYuwǚG!<l3Z ᝛|3O֡89ju272mZ{wPl W4{KUvF+ Jyc*OulCn#8J%;\iQ_iH9*: fxkޤEfρY-z屚θ_qRG74>+5_&_k?} *\7Wٻ_[ўlrgml\wu;hv8 mnbXyljw zTqWdy QVgMk2Y1b`k^ك.+͔؛$X$qLsҮ@rd\ :kchkTaWрkv 83Hҹ u52Yԛ6ǚ-l^\RŧÀ >G&54=#zFQpb_i]@Qgԥ%ò-!`fLѰzb^`{ecctN=T3zքVP??2r) e/n; W>v_JEՌsϸ\vG%Z8Jxȫ6yCoSui ] S_*Pɮ^f})7soh&|?i/۾5*i}6@5rVyc"~uYTQ:&7F[+i1àY=*xkQ|3<{O?j7ҕ8K6uOBG,%)" Iy6a Z@Y0~?I_/LqVc& hL1_Ji$D! )Kw&Wy5W4Vwg+7y G>3YnVdY,VL0}ohnL^LpΜyL']wluO9#;s$aVo=:_oy{W _Q_ bH\ԃRBz3GT+ X!E|s/&O4I^_h#.gq?cxQ[#swWT)pC֩V Xl]B[ `y5x;Ե-qПFS^˦|ˢe隖?8d$I+FQOЪrW<sҭxh 2̄-C|:T2*,CzWg#O}OTvvJdR8YM(Q"=6C kOè^P/ݏ 5 vӤYiL~%OeSSUQ]*\C pUbaװxlżTHvaF2^^ZTmD\G &~6TusGmHUpA*+NZ1xYvܷ>#?+ [&vi7Mxѽ+!ek31_g"u52tY:>n?qG~z];A:![{qRT^_]2]a^N&麄%ݻsXr3_K |aJMQJUѵ(nmf߇ Cqz[nmff_ s|Lߌ4ۭ#YWIEE% ھG bVRjMi*u-os+ JEgƶ^`\9bC^%2|\Iw&$wt=6JOW _&5Rx}ygM”}߯Y|}Ib3v#S63ЏZ?þFB'Ҽ7j𶡣g1`1=qc8rUh:uGy3lSYQĻ>knj|%j9g !P{aot89q^*-Ks+2;k$yA~W_~σsCα$/wHvPǓ^=E6Jq}@+8X;ZI)hy: ٮUcaG?Aun!=vLtrtԹUλp7!Hc I֮MBzFf (z"ŬIAִuC SSX^#~ çiWN*砯敋K^.d.rrj~N3,X|((zcԎkOMMgRMo[ыiQӏxv4^Y 4Ǹ7Gw}+N?:pC~W|sILF;+be{=|?T$K4{rˀH!d !:NsvUa"zchch!|,̺'+;BEK hÎOoq7iwBUhɾ<ļI ?*ӥKpʳPi܅kgI߹e[;컷'»˺ t G[rPFsypөw'&>uf!uDשؼavWϿ ] m^a-.8veuV[s|/VΎ+Fb Z6rˁ(iͲ4ߏJOYBa|N]NtQO]5J*}My|C-TTUuaF ?c."SC.,tؼk+4,H tȬA{:«MV̖F'=!}xHE0KZ<R&#O5k?4>#l> l T+G /iER緼o\2k15 > YkJeZuI g5u1ؚ9gL@5tפÈzƷ DmZ> Ĭnw y)T{8M+ŗ],^đ._Wvs^_qfiiCz>?Jx]"¥$TK!vА`ǓQzV;TlwWn:TmjلsP7'4 ̣,oo 5lV9v<ըcHM&VӾ2[c*v~џuk OyVU5_o?es0=jj|J>ҞtO̸1T/{}^i q5u.;A)v~LG M(dxs_Gv 52gY,WR0m?z޴(kRdw=~zpø{:JZ3_:DI-}_×B)3Bk=kRHDl*81{5a|]i=؁]߀i5HHI`Ee+{[j&+cs qW=.N\s1k~ jv$?{JwĞfx3e^Jk%Wt4k{R$sz_>$!CUk>i:%={mZ"q_ApӇ*~ycIFkdՀrE77Z[y?1s^a\"S\$kNS 5Z<'qOSFtR0jkOSLvlw)2R(&8nP&SY<ڜ´ 9Sղ֟!^-eDHcWox `&亹;s1*_chlgnj-K@eeGrk~1icvzj 2FMg~-bTњkz͎ $lבxm*C+=}koYeY|1)%f}>1UtJAf5]IÐeXc3貨bQ$P{!N¯x# Qp?@j{,VHG3C{Y.Eg WExo⹙K ݕmt P=H-˜JTezRk7a.s7|AreѴnDQxLM.?)qnC@qx>0<[xx$[ֽ6ZEe!ss壜#jj'JSŷk1myP$fڣzst5X;u?Pn⻭f% D|_Xm"2GBqP[^OI%"|8kvN5 5%Q=#5_i xCNM¿ҽ*7ޥsx_ُ^&Qң 6HNԊRTqݤT||a7WiHEDźOC=\؊ҽ|s\,~4cE} x ,ƞ0ɷ֠Ebl$z6y;R7hXZa*b5FM__>l6V$}+Ƨ[ɚY\%\Գ+/Vcv=O``?|D8 uUQ=[y~LaA߀2#EL֩(3uAS]tIfPȶc;uic%`d(4~_%)_}8rAisIb]>~Uo2Ci0a-Kx{-.'lu#V-Q^$۵`\xxgMry4PCČ9qڬh\3~8:I@@-Ȇ$ssXGṥJcV0ZDyyg+֓R<ЄL zؓSežR\}+|whRc'@6ǂ?k˩:\Kc{*Iwg)1iݷϹꭓlVZRr~RRQWh|mYZTy#nbdP䞵8"lͷ! e[$-.wj}+&+tO 둥% #5+҃иZ- u\"T11eAWK4iP0g@޺t]&BVe [ҩ7?=] $ yPE.#PVy}R;tqO3Riq〠sTo /fM:$u5.6Wp!_;EcYˎe2sX*gs<%qW-&i,a&ƾ1mڸKSK` i:mD6\[ ?G0F1|x%)$#۳U)YJ'D)g\kņB# cL6q.hl.mH,RvNaޙ <]JߋSm3ķ.CW+2Ǻ@׌hRжcbY *ϚglEt}/>#[Tvܪk2:f;t鳮d`ncW9crNVʛ=R8^mwo_։ZfB:n1qvhq䋋=.aJKQ\U)7ZZ签^&>p TSu3\vC#bSԂ(憿sY Ӕ!ϵ>V;_*x"Y.NV`z|{ (Y!s{r=E>moju+H̊ǣnܥs/W|SӼ3}˥xHFϰG`~K|.7ig#$]D|pL\+)svamdEЁzW׋4|?⛀T&S~xMmGF688ȯ/m~wcp"j^G jgkKºg-cFnb8gG#%Lk0PZZ>ǣro xDebcWJ n^7ZxxRcyy`sܥZQXr)tFt'Iq.%+}/nsNP5j8;֡F|Ҽ[ &8q^(5.7i8 ꕟH-"[ .:ܜwv)_Cǩ_ 6xiFg +޴):\ !ֽ>u0I+>fءV~ _UnVGVQó 5sFA"3)Ҽ7.H3/YqܸkHG˷8'4RTk^u3zo\ 19z/3jx0?z!|Gw]+<$yјײxgŶ:HYK:=RVmc=Ɵn.Z02+ bFsO@Uu5 E$y1x96nxv51qfk/KC r=_%6*U>՝sxBQѢ'\d]DۂHمFU`:zbZUƣl|R湏ٷ㶥sь3c&I J|ԥ{I4}n~eSwgIjRua n3޿C~~6^?ҭ剾fkʾ)gZP'9` cREzZV _OK+gMUၛSS_6 F7klutz.Ij eLƼ^[^'kTERĕT(l.]VWՅkF'>j0T'2`k 0||JrnڢGҨf5l7+[@衯.&aG,*ԚjjbQ5ي\8poC¾%ZԤHCzkĵdz,>o>_@RRHw^I f{!vyy#QQ)!Рn,rXWm~uO _È^gndϝ `-ZuPLdT?k]so_S݆u Aj =Z ][%aY 5)-n䱗hm۔76yk|Mt#@g猨/VP|J= N/i{bT-xTrQ4Ǎ|/abe \ 5{d?ѵ-a1cċ0oάx hWvy|ն~c>3W|SstG+&{}FmIkpўU&Rw8 O!`wm Dg|"o|tgIZm=QcjZulVŀ1⽫vӂDGZɟa%C{iSvrr?ufPI*C?=ѩ5}sㄺvk] xPwt{CxHھUWc:ι^4A_8'V{?W8\2׽FZFp*RG.%=9W 99e_WV'mH.y=(R'5Kaw7GQ^#ǣ1o`N$^1]e$(99O-\R=M3e㓞ΣMSWXkT]kTXp~_"GDBLo[|,.:4ּSRy%RO$ⓖ)$9/Ϭ5ĆIUWprI[VF kbĮq).[EtD2梿E^mb}jw~WvZs}YC41I#9*ml~&o[t+n'1$bAQxN޵| =Niaj?\8NLI*:* 4ۺG?t~> O(18o1 pz ?^W-֭+H J~8LMVzYi{%a/1_/YF7M_&;uc~t,2}X>/n8HOUqB99pw5TmzPVNLfj$-f&(Gd#pVޭz.X2rN)藚6`!KOj>t+sT֪++szxWvB];nj|H,JZz#,(*&h C&~Ҿ.rk>+3sP[G-""3WZ\J8"$dP:?0^H_W<Խ',2nPޖp$O6܃Tq01Wn>M3; sڼOMNEv^+zG$gNP}Or~5n# i(TZ .u%ЖYI ȓnL~n1lN+n/Yc0u5% 9!s+e$0H5kOoy'sCm; B@|?q rXkV$fF?am#Epo:IUUs*{e+ [SNSFR6WՊYѾsV`x4_=3r*yXrN7MJ*e;դd2(zTUHQVH̬0íRnRRr¶u5a_p!Ԣ鷱%} hl6 nVOFLqձ*ՔIjޝ6-5-L:h%aozÆ@\אrzx(ӫUk/G\JɦW(i3}ɷMDc~%4~$~k05xϊaH<ڴKjwb6CTaest~pz5rnz 0"ԴY!Ҡ11Xu[\[*3x?\yBq y>;%-vx?ccJwŸEk{ۢN yt?hbha5b_dpXZ,^Kh|}N+珊:g4wo6) \Y8]í>2"H׭:!MBFyaQo6{rH{J46SAoq%i+u w+" Q6!V[u9exlv*],NegJ:'| xi#-l%k}/$QFO7V-qU-4'fJSZ{ܻ I}mAOwYn OM}{EVQq+|-G眖oCR+q#NYcǚ'! F/95|#}=^NRkz6Ӧ, 35O"OWҸv?'2F2{5F2ލ)Hf>Z"/c/} MGvq"'!e\:c/Z<3>xwsu^ЭbrWuG`W[ia=iy?g cQX‘FgdCl港NdٕO`:גx/wrs.X~ L\ϲ,GBU3I[]4 sk"{9hAl Y؛Fy7+W͑l֥8jx+@Ǔ+ҭi<+Хp+إ%RS kK*7QJ}8A^} UCi_3濉Hx@ù+PddzGiNΉƼ⽤k30C.?^ $H>l}:4ӹM$ywbc_Ӆ>35tخ,1 L+> 7l*$gaWTױCCJkYj ]SN-}DQ^_$;hF ,xԓ8=.DS-owi(hߡNW?쑸UjS[xKv235JyMfEݰT >л=k>\3H/<^6ϿJ#l=zxw&5ףhx.2'I;FyR)ޥ {dr3Z WiA+ł5vқ]NVj*vK[s1nw5e]}g5ު OWSf..1FI$oʩxTgS#' _ƸjS=MsuU5!.tHyc^m*rV\4Ө8\ʼ+_uZo<4jνvsر+TQfI\,S0&þkQd]:|(IerF2V8B•p,T\z6\"jgHUEڛl zUUϿJϹC#z֝|TA8Jnڟ#3qdB,(=h2K휟ic0zG*(#ϷZ)<="j~z׫#?jڕ)cחtQW?4Z9 >1K[Dvy;5|YۂTr[/ Y =FFqǠֳS~-|҆g$q[]: \D $ҹ[؍Ω :9=I;Zqnt>H4ԓqT젗^դL,*գ]7H2Z|YCOmָ;~KU$/*[r߻2|2Vc+F}z¸ M?Hxa}|>BZxv|AuxBE~USDUVP@I!C_RƯi$dtǷQO2bNj֓!bOB~"a<ֻ ,I 5+d˜8a].T8yK3czq]WTk k}ʺ)s4Ā:=#!LJi+2146I}S, `WX)|0I34mODW=csr߻RMkǨ]J G_O|--ZX6h1v4621Kyy.$Sqm Wv;Fs_f}s㎟oI"6`pkw<Ϙ>5.И_܊(nQEQElR캲|>jWxysHצǓ }wb=gfE~UL.Zo8:ֱJ:d* *wMe'varװ;͎=Ť,׫|>uxyt;9J[uj׌T21_q~5Y~/*]M5˝د3SR;l봧4G <222px,l.5+_ <+]Ͻ \ xkWCG<ޱt'uy+;#dϣN-QҾ6b%,0A|/j0 \]kT&g= IexVgwl׋5ԥ$o[ /#vj>0%ܧ̹.7i&cWhgS0KJ4s߃'+`CTWxOa~,m˪ ?cߜ,ס[QϚ$1xrrQuYcf@}k"Ʒ\ʤS5]B uB a+ f_Wӫ&|YD_dPyhxC#^Y¾Ҿx+AX L1Jc :Yu&$[̦];AXEyF ϭzjjV*+$I"2[]hSbyq+;5d9椵K+|P#!+̀߭uo3=N_4I0޵J !&2N^Zxl>\Y G SWҹ@;W/a_sVLBݺJc9oAS+Pxz? X>0UO V\ j$tʫ jgRp1NiKkZO;~W]L7B:T^a1A5O#Qr)zާ_Q gd pT͉[˜R}\kZM mgYA D`vȹZ:EQ@Q@Q@UO}WTYYz|V/*R~@ mYspq5ED\<`c׬m$ce򎦼ǵ85X79 9V*\(֚ߕ4z|ѠX^C_VչFx|U-ɤ;&?^_^~KNdoƮ摫?@fllpOּS-ͱ_*56֫xv0@%č1?_~.X[șF|4qTip L18/ (#lɵjMWl ̪Gjt\M8.UQT/O XOw۫ c3+h(a(NqA|8ODLM7B| 3WS&T#V@Ecm՛}ņҜ"2|SCaHd\ːw 2?x.1v@2J Z?ebjَdvWQ hQs,=Gx sӏBigg({e{*i6wlU3G֜cGp{_Bn5ʁĿsop˞kYݹ)Zm)\|T z}'HM-í·?BO5HCdd9 WxSWMǞt\}pk1]Ω;>ǺO\Y?T-_5 ZywEv"|? }*ŢXP WU:59H7QXhC.2XSj$EY9z04}n#Xiq̱B\|;QClxаrAMJ~g,,. &E$mp{Wovi̜b2vۏxø$\GNyv i~ZPi,93SF6w= V GҼL'LP |\`쎿Myu3+\TGKm Bz5nw\V$xAcr62@ +.-D~5 pvb ĜͽуޥɡF9]b> WAj<\~Z0G@AfHtSYv2J9v4hmAԎkR1ճғVfcݱQw' y< 13; W˅S^o l+rv<-Nbr$%0^2]ΥewץnizŨFlTi |>]>i6=]G `;mBFGJ)dwsĖ'YwmMhqW~9<$-bdF,7⭳&%yLyz\# D!kBr GecY蟙cD:q|TNc=?xUFYbߙ+>! ^l;86rKH2 MJEF+A2+p4oP媠ȹ[FfUdV=k7&ADqVVQ=*cq9cJ f̜Bk҅NHrōH|2'ɩaWaR r`z}+Jx29O|һ磷sQ]N Ijr-8;sBXfo#FW6WyZ'*Of}EjD-J3}KJ.9Ep^ ԍÌ˴½G Nmv=JnMK6.b_%w dnA&H.a]X)rVM1GQ|='Y4ZWm-# \4lLk]SP%C C*&~g֭>D>l+ ]}o ksn*J_2H% r1WM+2Vѡhsۋ.>ym>Ig4J!E(RǀOҤ{B 'ٛî$Qb;TZL61<'7FX^gJc`eh=J'c)|G-+1 I5k Yd>VQҾmD\Ak~x~H#q=`*\Mq9bf亞ccs*$\WUxY-“1h>.eبr_z6x7Ew%5_AXRF!U օyex1xT폠Kos, ҼRdǑ޹V©П%-J߆z+$7> 0}k73`_q/PV@r>bjldz^nu T9 My7d+5߉s\i0= sHV|ZY%ڡ2* zWvH@1|OXxk|YDl#5\bxյ'%EWM;MKu5|{ZƦ-X+:Ʊ+آiev 2g|oՍiS3j?A oz&(QXI-ǕXtFeGz=۾NU `!ԓw,ǭOrwF`Y۠=f]Z躯%Y+-|__^F =z*G~:~x~7 *`?tD:dVXwc`V Av1X@-rE}/v4@HއkR/٣:O.hf=n~cϜ ׎|ZOsvT2S88Zr,Yd11oݱ9Xv `4UzE?Y+; C$W躊BmӺG~85[BiO,rzfٜĮ"KLV<㷇mq[ )}KdG+ ($I[vgOr)`⇇#?cՍ ȼw6kK Lf?®?ƽ|_vK^Eu+tkaaxnkD>\>j<<@$F++3xrv Cs\oCzp5ivl~Z'|Yi{_p=b2atFH,x.^GA`a/{I75n3U8;uFӻ/b3CT5% 9EhIcV}t'Q(p9=K!$$}bI_$w}!>H䲮EsC*kqY4]36AUrZ;T}qڸy7T6 [q8t mpb nRv5W-Og?ޮ~D2=qWgsmޕSά<\# :nPcۧU7 /.,Vͻ2B7{r\GP#%WW):d=ɜ 8^7ʹr}v6PH.z+؋\O/gM~847!Sq]ô[nG G' -mFg% 5Xv1ʯӹWxMDl-QrE?I+{[=<#MrG&(7|̊eBӭewy$D}8J4PmT4VI=&n ~]~?#m6]x[NROm$b]`4,QOV#-ྐA?JƹYdcs-߉xYm/J3dgL)+ے9e-<>$8D^(9So_Lf[[6sƤUju qhܭs퇆`^[^i$0F&uO +p|ԩ(Ue&p- +^ի}:3La WCQu 7N<LW$ ڶ2j'%,<#ȴ%D|˝jL"r+2KYMRե5usGƯ%j{xҝ}!X rſDA61KQ"կEwnCVmSM7Jȹmk)Gʹ} %҈[F<ǟo[x09Sc~$Z]>źVj&uw_ũ]BَE>j,`9n_M,YY:5 oZ?1Iv^ |qT|G]]9q] ʦcέc?=t{,ܚFXJ#<爛ط^k|QKD9_f ,.<P{JwCs8+Qg%re5>1{c\ט'ŹVVs׮jj{(Vm UeGC>cQ}kE-]y>:7} v샍r+~*x>|_3PSᔥJx0Ȓ8b9w wCvyPk Ҭa՟}\x_}DV-tQ^Sڒ)-JxhƧ2+VXh-~=VoQVt:WGa=>lU`WUaM?49b3]쭔[ xy2I\{:0I(hяy>-<$.-ov6~]xեYE / @kj >+èGA^|n[#/ #?f׆[rȊ܆a^q03{˦))j}miv5_ )). F"d(O_P6Aw@tS8a{1bO_BI4yx&:tI]3f޻Y_B+g u]C:,ET~I ̇ݚe݋7"~OpsS螩>ۧ嶕/LUsgND:~zϛ:FK}Rp͊ n .XIKI .qkJV/>cy$Iy;qÏ +xAk1$!Ljr@~ta׼'pI8ejxzB{;M|)|,m=rZ(x<贤ۍzW9 KE3].皜V5耈z(ǻyJS= wT*d5/Jgc1*Z\ZO#Jz.Pϥl\B\gdJ޵dytRNX+yyToߒ:{sU/~xrkZg3''#\Υ-uG2ck_.n;-slܒ՝qZB8Q{VT tⱮFBSEYw$RYk$ޔ'F޳U>Y^ Ci^+u^=ӾmexG$_Zskq,jیE_G>z*99w|%ʻ"Ѵ?1E+VonrX|ƪW0Th|vT>)iY~EFZ0kOmܑ_LYw5tk5KݜLʲcѷS~ &m`<]p*?J?<;2reҏ5J#= ɦW/F|}xiYT5>[9l)jS-՜R_ϙt.RO΄՝p#Hd?!-^i8enZnи?ңyF${ҢϢbwqVwFx1_Kjz_:FW? -ljO?+RwS endstream endobj 35 0 obj 81755 endobj 24 0 obj << /Length 25 0 R /Type /XObject /Subtype /Image /Width 160 /Height 160 /Interpolate true /ColorSpace 7 0 R /Intent /Perceptual /SMask 38 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x흅w[Wگ_w5&ff;I̴)M$MF;f&Y23333l&NlYe[Nwy$Xofϳf}sSWc$B( 餗ʓO{7^?EJ; !r!! VU[=J?mG4<CF.;OF'~2\mzSW:>*Y ѐQagίM?Ӫp3( anM5=T H|q]f!! 2 1myg(x 4Ol{ӝcC7U k٤ uϚ?=cysO=35 ys dM ! 2"&","2R#8#>;mRW}9>hHȈHȋHȎ 8eKcNL"n;3};?}E61 v)AvA/mo̞̜OKOlr YɁgUIIbB dDL$EXEdFpdG|"(V:k}a@zth풂ClBrQGUHK'68),I/O? ̓H%RI$EXEPGv LFߌIQi\ˈa8wF޶<B2Cl[{bGiu{zⱉ~%L(-~r 3[R&!#b")"/"#uc#>@`ԦaͲ +ׇ6>5!3&'򅢊}Ipdޘޘ>aJb Ğ5_TI%"#b") yOU@v Hbc,>,_2{3g(eTs)͉~HgohOhOS'#zENEXd_Tdb\ԽȎ 8%@8iKx ;h@IEx nV]nԦ⪃'cG#Iũ^,|W1>5r/jDB@HȋHȎ DcP@ 0 dKXaAsB27H̵O!0Ǣm=ÝБnhTl$6?lw5ca*[;^ቦ\b","2R#xlAp4@8Z?myc^6v<y ¼/;eC]AA#A=Naz֤ObAqvFIIUEdF!!l h&` p"(5; iX=b< ϐ;*l Sߩn lFU0v OOv W4dx%zb𒓼El-JLq0+2#; h&` p"(:K)-s(U&!.M搭ϏXV=ի{{cƆ;|fgdMuxUx6Bd 𒓼ExM93*a;j#; h&`It(KR#oWvALyZfpۢgZyz$o@rmF149 hVdt̙&~_ Os w(z_G{oKo.N =jw)Kkh|Ç񒓼O2Zge LD_ZY3q[A΂2OjOkU)Y O]zl:|k9rXvdس&55czzZ C"Ajj*d͆#9֏J@`'uUJf1?m+G[o}[ZfN\ !cɅ|Lɰ5 e/ p,'`n#<Ă`r}1/ʩ$vCE>iࣖZ׬|ZysmV䅉hP:x ? V^r4s9 ǀ X D*b-cFZ bgG9n(O6Æ>leZ-?6_~U;Fl`pwI{k ǀ X S47V |*Zt*摝kym{m.j}+7 >jzKrf&R}oF~3P@ 0 ds|g{ybrC,Y$1X皬wi~1ݦia֦5tzar*w8I"-A&g.&C%5^4@&d+ Vk7W<7VQV}_jn_ZS Woh{oSEG+y[_tL1Y7v-/v8 XW+-=dbP.*믒ok5ogِ̿4MKh_ۚ= i4dEi%+2,Hoi!_U)w̋P<7ߨOqi/7T4O^ט|xa$'_y :b0^L-uҙLg~oKɯ֥ZjڴZߔ~kӹ&mXy|Ɋ 6 5_|H_ׁ?'PRmukR>n>?u>٩.e<'Fϫk-'>m;^@`RQl/'5oL|&ڔR_S75nlL: _lH8E$huGsN8rn YñGZGd8<:T"7&4gcG)p|[hLr긘WLp91Y,nce¦j_ySemO+;uNgq65dEOۧ/Ee^I75B2dvl$@5, 8Ԉ,#B~\yA 0K/8Ib |lcSƺ?M .6#Crq+"dKtW O#Fh.nafTB]}b5FgܐXt$#17dHdN<ʇH7@ CPF)%d' @dA$"Ǣ*.1,[ A2p e+7$PJ74"~A;#C|eq)ɹ9%u咕qW BaA <=xzwvhNv/t ѡ>孺iiɞ8[n>o'1󥹞uSު ">^#F]8/Bp#qx$L)2e#EJv 'HJrjDd@`> R]muN /ʿOɳ2Z:&L~MXcwr|szzjj c %Ei) 9V̘Ki-]m] 7̛c[s/ֲZwH%sdKAARVu-@qh%=PܔB!"4$LeR7o" !r!)Cs0?nnkd! w,r*P:G&B6'nٝ̾+W<3I}LGO{y]ijnrxdx,hGdا.JPb(qtlE-Gӗn-κZW7Ց8󶛗sQ}#1ɲRmuB7cJIޝ=#::Jc}S ,|@%@ |)/S/_ a`UVoMmW a$vյ{ׯ_V]_KS낭[bxL訒H3Ū 9EPPvQVc[=-7to~Urh:z>˗ţ%JNM KGbΆU xS@h wiK:ap*:fO]wWq~mtqX= p!#&sMMi utUdtGQݱ%A irR[wu&~G%6v9rkEo(X&qr6֦ƯڝFtS<]wTхtmکϯ@#Rxo88$+˻}KơKRr2YY>"!"Q)u Y~LjvT_72&l\Nm h&` p"| V"_Z޻B5>Udsƚ3k*OGNة Woܻܽ{wR#3Cx3?6Ѿ!axNI.tfCHXKb.B.' ~:Vrqp*Ω&^ `i%rNo/2&_C}ƾGB,flfHKS4D8`Y9tE86AYue}]8Xh( s>ƒ:[F&/8=R*@Cy#-'%O%*xjѫwU-ĩ9)\K7>p p'jaB85}5!8kzjDFuW8X 0 dA P$lZV|~O5N|&v&~Eo`P٩STjC_m]-ɂA#f(r2h{,8d$><. pgp ?q'qUܰL WjO5^ ]m'K0UK; ]1 C ^!YaŌc6Ѕ7m+Z"UO߽؛^uM.ͤPPmUi^k[ƚ#n sD]řa2yp߲0xΓ$[fQhc*qp{OXit*\zEXxO9%ٜkZ󡠜O[bl$DZV[+)Dk36ߍY48K8/FryyJњ&hMm]X9\hCիWjzNr٦X m)QjuFǓG&2?hB@3$N| N19lr"*&_)"KJWs,kn:UjuŚꄯuP[TT z0qpɩnyهF&AAG$>2%mBDC8'@@`> `ip[M"i͌ȏ},SRޫl}^C1}nʻSᕞ,%\[h8 }|ձxH/",,}jt:[Q _ZնT'#DmUih{5acuQE從0 D|%~(tE%v?Bm^0*AڣK UѶmmp 35& \2ވ\9h$Mn,(X݀_>d,If)> #ʘdjT0+-M-Br>/%Ւ[µ",/̴sXW_)*u&1I& ((BWHl[Mء˸*ie (= ,|%@ _/ *-ZUꀮ셋+ˢ'Gn*arRwNH]rj]FsbCZ `ݮR|%g-K^ a*ONz;TFVԝrFt881U'کBaZeWqKNF/)3')4ơR'\"1Oʋ/W#NǪD?6:ht\nc f0jp,Eyx&LqRI&FF)Ip,@8+pw7[H|C ]5$Ohr.ti/wqa|wB䆒h[GhS8˸hElsG_7\LHr#iďYKMA ">Of(&m%!w%0i+]잢Dr<?  X MƀiT.BC]Z,Bq kVx@P#ɺKߵ[*KQPS$#qmT.PQhbZ|оpZ>ئ K8]G܄2if-|wYx['ۦe!R {pfU,̴8ÆZӎ10awp('3FSmJ?vjlƦc^(1|tOj ڋǫ쳔!ABepr!b.OpΟEp pWEg^[ޗ6I(^ =3 sJI d>-=J [EؕɆղ0OAFu([gqz\G5r (e ) 5EՅ I _ `ݦk*(>sEj8}uF>4h&΂FoM)F+J.=9g[ѡҘJHjx{D/E/[.߭9Khr+h^kk1V?7?j&;aikh#D˾'8_KsPoڮ.LەL\T 3/Rw5y/L߹980JKo^aY(4Ug:z@==+{GyDPv3?b&s1N ],BX|/fvbn~Wu{K+cID⎢Jf^jIaF?quͬBMD۹GAGٕMo-o;]5#c.U? ,|@%@*=-. 8%96@ZVU47%+^|<ɃG&O'O_yaһ'NLxJfɗL뷧jқNFPe$ǥ~"N6 *|m;*cT|lbI 8fS- *!.^'/Isϵt5WUUuߜW9+Y{i_T+3/ϥ~HA__@UU53Ν:7ʟ4w6Dž|OJQ/I+ `a'_>'ߣ_0mI}]7u)5ds7n^onCu>1|`օ z>=|pnr"fbQ?W)JZ*7{RSUF -zGw5q6Av!2C*Ui|ٞtS_H5Vy-C'NI*\td]j^nu-- o ̦H8?C1'V512o?8Uq~nA   `Cñ'~  X `˷,v8ff*^"ڵ[d>=5Hď*dfrCR[alqKmjqyG#P/MN?|<f2Î^%p69y-L_FGLC\#-b"We̢Dr9f =S憚}TKY;n>BQ¦1)t$CwKQ.M&YuR*)i϶B X Ju?=d<:-p/=pj5 䄻Ŗ={FDńw sx>3(Ș[+n^|>&3?WXJ)Zqyrx:Y-щ %S9T2:#LJkcef3ǖ 4J/A _E1p#jKj ~,ȈyyhB,3?: A֮X7SìN4_P[Ys rykWiLOCI.id8?\tV3`^q{#; \-@[İghɖSOj} HZdOFl* 6R[PlE3bIK+s[P I7ŗ_G%,֒x˲d_G˹phdLwʝJrpU|ĦbQy: O>uΖ8PL.|g@ 0 dA)_4Z2_aes#\Jۗ1p, 63KXY^qnWO"!#{i69!-P\$P rE o|*K<@qY_5P4G=OpTdU'drWtFv]2 >nfek`lj'++||,b-P"߫)~s/S 2ᙻ|A~Z|WբlRW\p@MU1/9[$k!1,ݣG.u[ Ԇ-ҚÉyat0y42(Xw=>_7Jf6'x@Xf]jۼ ':BCm[yRDum8""GX_ˈpt&Q"*N YC!|m?!JF0+d;7|eW!:߃&_cש9wUx$8g1J|K[o2#Y+ˑ~! 6  R@霟EשHP+_b|AIU~Olcf WO 1eA;jVafFZfpm_G87#F+?8p_s 5T?T-}e5%u_NAG+bZN)7 !JsV #+DPU=|-C_Iw10o pdo 5m,/y:ip,h\NA9)t~y-bL#NRXz9&'b|Aym|DIQ3 hluϊ,:?:/HF]k _!PbzUz1Z}N3WΐKD#BW$21d=H\k=\A 18bي#Jڦ_ƁGM'̣<,-]hlD#+xғ|*,'"gE٪g'}Rq̼MԷ iϝHDK_8ȄTr@AG*Vp@$-98g' MW&2>@`WIA Pw煾7rR@_R#:+HyIIv%FM޸u9˔1|:ŎIFb.Bٗ)dBV)(&ب7J. h̄PB4!J4хwwqSyEeu `qf6yAfy;s.҃>e-YiNEc+*+k{]PZ* 69>\F/_8N3c'Ume6 MF-ېW=9SW#GFmhn]|>&2g7XO R.M,kS~(7n/G+Zdod[[ C7-'LLH8@א2շ4WjmTZq"Nfe|Ud @,uyIdز8 h %=UL.p4#pGRhL# 21+ X Jb:7XT*ttD%%1-: y,irAz4W|߉HWކ~2k$a <,XBJf+ZB*liк9~q(XOѽΨƤBY**sAYged<}aLԽ/Sgc!"4T.!]1Am838@8iq???S1f1 ɾViVY*)| V",o,n^ вcfߤy >zJ}vkS%bKZ޼1BF  Z7+{>&龦YYv@5#:L4^L-=Ҟy/vXw6r5cmB:||!塟B!GR^rP,0S?C/0^F᚟ݞyMf65Kofs W."(tɇ48OB8EhHK"""/Ly܈ؼ+>\V5=`|g\IcZdY taz5˦oO ~mt$KzΗlɜ"B#@Jf5fs|sQQiYyeeO֤*&|\>}uހgSe&ynI2sGn]M6c+qX*X J~n>|i B6BʪHe$ʪ/ْx{[G}nuG6ot$i XC,},S}ҹO֦JQoW9vZGGGg98OK42![2 ~-ٹJO5_FJjawdr0D SH'H%)dNO9߽GX"4#.q^RGa9Ձ//?o^S}Ye[Sw?.#58@by<F՟~׻2gxXvDUNQz[XZY2N tȚh}7'lsH@2Vy4*/T%Ů] A k> `Η磻~r_YΌڦ18i(&5.o-/pY  nҿYMY^o3P8)gF}C4K\x՚:8_ן{Y7 K,!űeEхM5OMz41eO1K<65M3pa\2$۵5@κ8q>O=m]^{ 5 >iIr͉Jj+$ߜ£dJ^R]JMC 4*//4Ik:_8h> `f4r "2v`ĤW,ǃud|(#5otD5<6K&I$5hZ3uq|Am |~"P(gxY$y[>=MR|mGk|zZ^a_1A䭅w,Y \Lraqa`]X|Iw%i$=]_is]Pty!/m io^MNjM\txeL #0^C?3Xw>s/K leO _/ he75gf%WɄ"`W_ `lYw|r 鈱r :<"ۂ6T*=@|J=mV<#-.r/J"\N ~A P~] Hd03>b~4UB7?=|-R |SG{ׅ2ؤ `U7)Bg2}X~4,<^2ç"|Odu{HkK2s >JKYlkc) +Cv#gR>lwFGp4z#Xe=E=L\*<;.;hІd$撧 YI_]I5+@;*Sn;A-hchfK Hik)YnF [/}"$p3L +x LIReYe}gL4Wr$Ujw3 :$DzY3|&Ɖ.U6X6޻uol2e$p3~2gœ3{X qVaU&Qz1Jkx(I XFXf#4OsO1<4Mr~kKIʷ=i rN D}*1MA@`hAª:w޺=&6+':DU?-(˺8Zl^6)S%> i #9@8 03Z߯;`-I L"]Lc$ R_kL$wDi|ڢ9D LҚAՀθiz IsLG+ᒻ SQ~QTKpE͝VLaš~br+k{*,&t™'3|!E*3WK,j. !M83,|>l-PLgghrr͵ۿBԿ"*2[Y *y;ǚ~f/w):ZR+-6e1c)\je[-X{Hs Uğ<JP!>!-*[f0 d_?_GKW6mK2fQTEwAԩYeOγkg3BiY8oe^wTU9+1Ig}%&t| ĒN?V@%t U[8FpdG|>!4{>}O{gFL&Q"KMz pC&P}%Q_ @ 0=1Xab}ALУfB !JʴeeE^Xlyf)0댆HJHȎ e 'R-#&=ϟ}!:?}0?K9ZlfUӭb SE?ꃼ@ U1fF;d$Sf9iQ@%r!)"Tg) ?uv=^}XksLX<$@9 8FS?!r!! 2"&","2R#83Cw޺[mpG#221amk,nĤAljH0ejȈ'"2R#ob[eF{dok=d{ p~x},ROUUꆀȈH`U/5ƣa[׻ z;p-_i~W \%8@=OB.DL׻"#b*U}2ۘ-X0ͧwU7B1)5\lZ endstream endobj 25 0 obj 19325 endobj 13 0 obj << /Length 14 0 R /Type /XObject /Subtype /Image /Width 256 /Height 61 /Interpolate true /ColorSpace 40 0 R /Intent /Perceptual /SMask 41 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xYeŎ/=IOIҷEߋNP@1S` 2?_uvCqZB/v G}؟v -[`nv -[`nv -[`n/ ;wcW_}+d!drן9sgsAJ?\|~r}Q+NhjJt9[駟EC\σgþ _~_|=< 99[o>h-=G_|n:5\cW7~N8~"T1Gq;/ag}[bh}W<eN_;n6zq8SO=ŖQ)[ҧCXIÁ+6G՘iFwlԛ^k$T~m]愯<򈊵{V Hk[ s;+gpYء=|I|dc.s pQ2t&@+dnS(>TasHA&y^}Uz'* x2ku?Zc76) /^L-n2y=M0ف0 |Wv -*ϴm|JOʍd%ٴ8lwgOBO>Bcg}6Z o]-p[o}ක:{r'mfZ=Om`77;iA>EgJCMGvXc#` :6LJ8AS7׿ll<)ehaW\b!l#_e\nO50 AUTm2Wp?ÜU ~ cϕ,3Jf`8???()j8`C—~U$NH`X`w,P= 8#’"0\{:h#1B֤'Ϟ=mĻp#2Tv^SrӒtvaTgg V^pts+ֳ0+rB*G몂6`)[M > P5}0{}4 C4GD>SsY#P8h`Db^<ၘhx2 N >T)qD|[;y`Kl֨"X)WNh|_EQjhz1hwѿ#+0ln7H)&:s NhL`mAm0\9kA(>8WuI# `/q>'I]tPBV$00U qE9N73Ua[&(Ĩ C"P*v#O(8 h4@L",kD&$!1:D PJ'ެ"q\83E&AN4ImH mOFDCF$P]씿 p <|AS[z' 8 GїN^~|@ 㢚hrrIKq"J&4T~+j-1; !vqFB8Tb`ɖr>$d<^];&W!&o)4VmUf\|Db25NVǀca;{Ml7sI6-YK ɵͩل*ϔ\ RYWОV65JsD<[ VDw !>D9s91dJkL#RjRG3[ u̹i,g 2sgհ(P 54p2 ;PdBV02H#1%e(H,i }?xj @ą)SƑ,sYp¯oyE)C1JN }Ɩ%H'^ 2Eټ2ˎ`θkcB-_W m9jJz% lj"g=Nbm c[bmԻWԛ"[qYkȄtĶGd6i,J&-$#M,g+cjA,B}sGqnQ&!4"1Aiр̉MD0X!tbR!IS]iF%B"S(Lb 1gi%>r ?}MMGk- Q~Ҍbdp ^4ɍ؛Rkk fYIkhB:[F2gü\*fBhN{^/+ NM+[l11lC mڍ"r.kJKfl=ћJsm g!*Opܶ g(KcJۢT)ʊ$Ke ^b%P)fUx[Ì̒Y\Nvw}qJ%fXrl:7m|QsY gGAmWb9fq?ܨoLI~ehM+jDV[EyjJ,Yc׮'V^ n!1xIy%ƇA$FlO&RE8)WM-r0'}5єRV Q^IGqw㦐ZVdm4Ұ|#^9`MPL4iAVBݒ2~圢M=$ctfT '%yvp䚶<9UX wjbV_#?i.ՊԶSM =Mfm]ITacc@W6<>Tj=ۄ=hmčCF!b`g*X (jlW ~l^ <0nF KU]2VsFOX*'&mzj˼Drsd me^S&"BEܪՔ pF^LovJ#nork TM k̥qV䆲ɐl?*z5&m'~޴5-Zo2U+e,Uc'>5 mX u话WW,GJg8J {.-)Fu%{ 4KO<;%Lrr| 8 ᗍu# Yb0+2fٴJLQ{F\aɿ1zt ĕ_>H/z]yͤa۩qː}sf}t1GͷL#:Hc"IjZE4JE G敡0=8LLҜ!$ }ZEWYh8XdCObiUQJ]T+9?BNP BkQCFԮn8o6G/HL]uxhyRh'BoUH^XUDFcg%Yj߉$y)P9/V%NϏ(D"z} ")@٧P(k[ic 8?ckM" Ƥ!k=_9!!!~q;tN2JrŜX'FF{^9*=liP(-kMTPtp:)bĘe4e:LЍ7;nNUYi& թ<-&"akP0g )6}_hOMpF*U<3Q`ȩ%DƳCӈrH[IVSȖjVٚ,#/1$~ F%iohOkRƇW*eN"UcEi!prg M'rR5\03bbЁ 1*Lb64)|H^\WTyqs:vFT-X5; 3 2F(H+Q_۱!*J%BgmZ*}ŭ#]mĀn6nފF yQ8wa! LW[5C^W'>jrۨ?03[Gپi)r`n+1q|`qzJ2cB4OYJIrT9הKVFkŰ3Y PF\ѳgQ,q!7E[L"ڲ:0K 2!p1V2"<-gc!i%16d$SD~ kL+s/g `)u] b47OZwA%_D2$E 1wT,,FgYl{1SH̥H*Jwg/K8R $S;  PǹxWK@``$9N  xF p2b: CB!ʈ= |{p6h/ 'M=<.j-[`nv -[`nv -[`nv s,2 endstream endobj 14 0 obj 6105 endobj 11 0 obj << /Length 12 0 R /Type /XObject /Subtype /Image /Width 207 /Height 144 /Interpolate true /ColorSpace 7 0 R /Intent /Perceptual /SMask 43 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x]YpyvUJ򐇼18eَdeٖLKe[mQ⁽]"uaܝk @[-:EI$@޻eII;+JU{`f4ꫩFoOwwŋ1` 0c1` 0c1` 0c1` 0c1` 0c1` 0c1` 0c1` 0c1` 0ƀ|B# E^ #LdL*:K,G atp6̗b+ΰl_(  anwc'BAKs#M(Yl= b:UDEXѿ_ޱlxt)֩T yݤf[[*7/_TbcU]I𮣡ݯh#_߫]ɌO()O}96~VKxmV+F3g#(jUnb%o_ۯ[O_ssƕ}@.6K2RQFmvy-ڥt KaFUb}p#BQ^J@P>Ivd<|P@N>>:Kkcԉͻ׿G{`:*HkxdZر;ܛ<7MmMdDi-̰Gȷ: f\]7 NoW-p)lɓ_·OŋݗsR!Lxp:\>g<@Hnߌລb8+b=_b~>_bɜ{m9bgKch-h*mܚAĆ7˃Ӹ^*(}V*خ*}C')6's |;I:L|ځ mj % j%،K>[|T`$6͚Ўn kO*M2`M29'5N_s?|j{2׶ƿQi@LS!䝚QEdm 5>2@5N r`ڟ,]}_\&U lI\6bãv%O:4s~lO/˾x%UܢZ6?.'a2(0?^JR/Wq Ugj֙#9*t@02wC¼G,\(uIsi)+.i#೴L`&EňXF~im O^isC'3C$ ܉˪F\4@- cVrbapg- Xpf2sIUGj`eeWl+2Ҡ7b*]¢Cœ=7EP_|2;x{?pC)T_Bh_zn`ѓLl_ZFtj˦PthЩ+Et`K0f{[7I}Lʨj9ldLnJTbxUnoAɊjN n)j&;Up ^=Jzrx0{"wMFӱBl t䣃yF1v[vuQLHѡسQf|5'jW4peҸ+S;,7=QG7"Q0CTJfZ$UnɄ§(FJ$ْc% eԥk:W1舍u+jtID4y/,|w>{ .͝CM..zZPwB_12>[Ahl`|>8Zl$d̕4x*x7:.P;17%9zt[:ë/JikzI̓TPC:OGU8KpA^wP簉W7J.LѫrltӡzWkJMϡ%62n 9V 2Peƻ36tjA!+{ &B-lưj\3+kUp)JC'zJ"&5)z̈jf&*C1T^P0= d͂U4^iRLD"0k(qV] 1'T r,V]O,B-*"z\0C(>nbR (/ P&uk:LF:8 9 ~b%{`j !smzܚqE&g%Hl-lmZ Ԣ'$E2~]t cBz3!^Ǘdr_ZRp d@͡) _#Xp8LW1yPtry B_K5b}m lk(X%VN-AiƈOm b%wT{c: yIk7\?u@+ pP+;8M$C†ؠXNj-7 Ok- cntqCFNZtS4Ba=V]Ǯ}ܷ^U7EN\_o6vf<^UhZC-5Luz$܌`o9 M36nB8`g>._.^;'QHZ8M;'x[cg$q?”w,m*,l=P6R<ІJHSb ua+iM]izjJSy:09/~LC/P?¨ DQ3j'wsUV<TDl**.}XM5u驧+M9i-mOrlwΗ~4Z j"5WZ׃dbq!' : +Gy5R;17<-J-q+Y"N uA!i4a.1 {388!|5wahgp COBj kٮT1E 7! @lwے TlVЉj1Llb깃dwwg_M'O|j^w>@ĖPj6'5 4̈́,{·!r yCudJlRk,ڙ|FUlYzMA,&@W%,i,߿o|^c d՝khI}#NDlꧫoEx+e =mF{䖫Ȉ_Gl?:f*۹yMl< /~!}9uIo#+Mzr9^ [V2`FHf&~;44=5r8i8Am2GyR5H]u5#$L HM1_*<ꤏws WbC|kRa.q 66)9h3(}x &&"rNXZFc Vc!Utc.(k&q+LtH1Ϡs%+ #Q`Lwq18C'u53* AڽzђC)=9ARpz! كZ('P cgxYLR%ri<D&ND%'"Bd[( gL!fq,"0X@-*Z9]D !o2frȀŢ$?X)X_?o&ȥupM`V̲on& 焐rgHY:1>2BLqΞ&Y,&ZCF/dԃbK8:@*l4U#Y|XMާVǔvMHf'b҅L2BwuYpvRnh0S(|bM:gsCLLȓM|-Iv&0߽;ۛSG ?~Go>7>3z,|] *X7G V#QLz-x=YPvRdJ6茄DĆ%+ Ԝ@6*hZ!DΞ|敖ZU&6qc='t)-mAhW"G;;8Fqc[綦 [Gjlšmdj:=(R- =QqmuËono9<Ef5*Q6,02uLltFh]ׄa>l jĆvb]"cêw$94=8S2qR-d#)YOd J1tc!a"٭g,^l*rO?/L N)ڙVQ)frSj>E%$iuubWwG֘*66qLP%kO4cp^AQn)3<*7Kl tws|Ǯpޛ"ʑ=G/ؼäahNe&+|LTU*64<ffFkvJpb$[:Ig7-@!~ 𽻆ߑet B-6ZCޤfkX4͉4cHu2.6訇WUMLStJN_CX:AL%w`;/ἅV v9|76ͣkUlP(S'6ҙA¹WM;iu5u6_ [ f=O $z6zwɺb3'32oleʹ4Y+zZ4@rӄn!H<>%^iјm dPSVTl8AɌlfNlI:!zUL >R&MT_Y TnP(xI Y#-f`/(1|[tGda7S2nb.,ԻU_m yCgFpȻSDZЕ_9Xvӑ7'3~pE=h5_. W"Z/e"GlX! s ~ }yX GONgݏQ;#8D$N9L+UrT\)8%UEjF ՘(VF+Ÿ%:b`=Q iCkЪ̯VJk8b#y8욲8 >\[1励)Z]ƘyfTq4z5hr^Gj׿n4C|;]Ԃ {3G>Р5Lc@F]Ѱv;j["vc"N,F RvX>PlĆ}*f>\Oˀz[w.`FW 0alnNa?B`.c&cK[CU pϟ̢ {X5FɢNCm7Yp3P`gn"7bb& b4b2DV,bU>da+m18"e pdۚ[0]sDYQ_76ѽĆU`L66Z$ bö*v /w?|{L]bQPW쭆q$HlVKhảޱ) d)WbA뺱 eF(æ޺*wS*Lµ?=Ѐod `^6])?8k@Տ/ҖW7428Z8}6hg&ҵ?;#o(_2FKPaS+L"dvꫪmՃt"Kh-:K7>V KT0QdֶI]٦ț,Egwc{2 w#ߞ&rLw_;x^ޏmqw$0ltV,G > stream xyUǿV}RiJ(RH,ٲ~-)J (EHHQBK(Խw;sg>sY?O TtтG33HQ_ɉ0nܸxz۶m["}yfΜyԮ]N:j:C222|[%R;^oz^lYRBiȪw, z&]ʯV*)s^'YGwx(7k aG?w)~u%xhnsJe[oU9|w}'PJy#F%`F7(E.Y.-XM <6m:\s{Mj~B%.i٧lIDnؐ3@fe`o?'pBfOa9U#V] ?T05#Ը/?_|+x8ٹsL5rV,Z'kVEMjK>`t_+3i$5k֯_6nxƌIM ?y.R=|LN?t =z\tEG _#,]:Mϒ|X.^vVZzCϾ}zi!=k,{APOx~WC.06gx@hѢ-ZXb3Θ?CUI?3_["[5M:y[ѕ O-`6_}V=ӬY^zɎ-|~g\nQ8㇋/Vrɤ͐|~&fXy g]cڕ;ld̑K,L0B'jݦ}mٶڵ3f !bOBxeG qճP:tׯߨQH:た^{2ƅyg&"(Ҽys)1Bߓ |ɵ^ˬǍ7zGydvavB-IȆMY}jSSS=jڴi(B04h,rrrYUV3Hڒ̊Z{gQ)W93jsXF ʕ+*x%B_ލO>;y /p޼ywuJv6joJ %Ppd?jtؑq5<G{Of/OozztiġڿЄXzrbO8QGYx(V _~s1Yge7~v*^GK6gTK|ٺGa;WU6-.{5\#8x.ڵkUR+*\'-3wljШQ#g[ucu5ϭW̌I&$ H 4L#Tz$K?d]N) k7r 2]K 15[mٮ)s=|:op'//kA> 69TWO:?ʉ߲eKsaɓRw iǏ @,\ 9k| mb,#nж`~8W*HyH,:᪂*Lv(61_[nJ@K 뮓lfy;x ТxywJOVPv衇*9F[!ygԩwy'lz9%?#YNm<}P•խ[W2v؁3G}$eB{'xaYG5Q-[򯺅+nJw>`TVq|IY܋>[. /lٲK. NlB+'~.CHɡ4R 6#dRqx챿j̏>ƉB A $.~,+|Q9T~Mf>jC-(ݸ՗p18A;K#o߾r0^8e.0\K s#7~x nSRrme<~?ݹnxFaOFY(([6oެ[ N:~pC{9~r> `mX8q:t@ bu ~P(9wP] {dn\lVHF#KwJ^'Qqa`T9>dR)fY WJ NLs=W:l;w4H8)2/n` Hҷ㉬0Դ* ~֭[w#NN5ҪU+0|p. $D%.$'6WkD"R%\bb\u_1v 0rփ>4R2h%5 $\C J$;w k2\9g^sv$a^ E&ntʔ)X’SNRDbdwJ㎓fKP\#4) GT"-w^J%T_*kHN#ERLzWMaɧ7t ?uX~I̤&0^N:ȺD1Z6^SJk. gaTzCkH!н{I1FE8qO׈s H].>J€ͼNPkk@d'j9Q[:;n A)![So!T09q d?(Yfk&+oe'SH#(v NpC ےƫ1Zu cQ$;\9(;e.?A A?ͻv]U˩үeso^6hٮWd_F? 5\мUyvslРԯ` `̨uC9ۙ%J+7ΛSNs=Vb*&դC hH0A1jkl4;!Ӹ#fpdOyL &Lu`H(̶Gv* 6^ ׫vG>Zl~&P!R?,:Mv͓bީvO,$w݊MFx"^=XެM_Vü+o 3X5V}(U)Hp9}P !m$YI7er<;`YIjJH Ӹ#7pңQOEU[xzL_>X1%ҫ݂7 ߓh-[x3+pG$,KNX~8 *d4{eQ߉L@ `(fsQe2?[j%82M(\-9*i t~Jɑeofe|9ݨC(ubue*W$U7ذ{Ur0E⺘!E~SBVX!9{4oWijÉna6):E[) 02;|[Ht+oڛR;X+ M;V4g//7?PntvYfWn IS#י$5q?)P8Ŀ3]p┃plrK/UWٛKW-~6ɻ|w٘>ON%FwџHlpY-հyNlcߒ}Wv/@'B2VNz~~Q3kd|L!rTHV^ KKM%Sy>% B[r};yU,Z<~U4oQqbh bd|9Ѭ)))/\nM)8M}uVJ B澳yPV1&UQ])sN%LDCZ6G#AKg]OG@J#J J+|r>_!#_+=甡%;}_{^pCʁTygY:D5Q@S<۫ZInt3ɼVJ~U*r[BYEKiy_) MҁP9ՠ(ع95MP"^:00b9+"3)H9B#Fkӻq\g$%D~>/&g*@+.y4#*$:%N(+/*:Bըbʗl\-"ClJ9Tŵlh |Zoݼٵr ?2P( H8?xK_vE{o6yVΚ-.&&f([AK6} '((V g~WCrCi+{74Qq?f7Ii Xxʶ$1s/\l׉/,?$DUoĂ3|!%уA]"O$9s'x\1SBA\g-CHMf6K[Nzrp"+?AD~uתxp,!$v76+ҕBc4%m-~~I7w.J6nawG>]oy.F-Hxw}by? pBm!%=(|gF9"i|J=D*iTe9- y;bbuG>B /.1D%+' S T(c7O?eȱ*)/ukd۶m۷Sa(**?M*6$RPPj8=ȆPDc)~,WԄ~ JɎ2wPlH_7/lؘ8Fʖa10Sp P5F$g-aUVjVd endstream endobj 18 0 obj 6031 endobj 15 0 obj << /Length 16 0 R /Type /XObject /Subtype /Image /Width 202 /Height 60 /Interpolate true /ColorSpace 7 0 R /Intent /Perceptual /SMask 47 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x}xTU?U!NˤgJ +6,EEV]EQPJ !@ NS3Lzo 3w& χ3}s=w{=7SL~&%0)I LJ`Ri D;xu`#=j[ti{mwOw{&s7=$)f13gzqāu3 +8qZ0pa^_ FYw;ݝ<|Uqmd7% 8ĉćޛtcOzqM+x7MW[RuG>b랲ƟSտ1MחN[}~<_~d;#)>LFU_ڲ]c2h,u4x45S&{>'{I/W兢U/zZ7*^{[?}oVO?9xL`MXY]&)2s%|͚5MvבQcn>gf,~${_gO=_񷗫VVں]7oXO7ll߷|?mٽq{jRқ/UhuiYӧϕ:clW.[13γxEaEK XCyrU_^~UoMKk^}jͺ7߯Y$67~߾#%!/;\-.)Je*F؜_uj le7,ѧ_x75Uo}}ŵϼRrU*_+<7*V?k|_~CU~howw$ JtU5rUefn4[=~% t7DO( K5ZmcSesRY-(\uX&P+L=RVYyw>O6|]'4>50Hɕ =+ʕԧVm;쭓41|RV6$6)d|Bl|sS22 )LӶ7 4{}(ze˟yYʵO|㺨]CC֒R@s".}3z[!իWm3rr `oW7454676464457TUj** Ui8/0=#+5-#+;L$JstGh5Q+_x]}gtVuumGGptUTT*m ;#dN 74ίoכ=Q:|'Nƞ:}y>वgDV\ƬWl1{R]Vલruu垪C'or܉qJ$UVpBP9?U G#Tx^;TVrKJX29KH*s!*n'|QC ˭K;ohg֝v- 0}Brl=!e\ȼ;#Z 5 :kY,Z[Ư. l|gKg1~Q'ؾ]{%B끝Q "G*rʁ=995##VQkjjH ;*(꺎@(\bca) p{vwu =}MOoFK~wG;C/k2Ju#XkHZYHfG0p Ʃ1N~%d>'n@5 9!U#*gp:`| :^n(]M%xR(1r(NJjy<;T,(1"&{bRrFfw@ iniB/78HEPP TJUhZݍ?-=}mGcުUS{:y#"5J@P=6Oe[9#Hk.MBD%B;x+cA \={?Y'i]ܙi*1tؔi WԠ^-zbx.dtKLk۸5<CDS&U2-[F8*ZZ}Cڑʡ!]_S[ߨh:1%%- ŒL,a;W]]D'VU@!"H]UEV@ [ 8 :<< >44 rkW5(n{OtuL} (܃~&:QB#,YVT!thϞ0a\ g GP2L+ zOLs@L=&F.@5`9@ye^XY`H&w1JP?_z#mұYfK!kĥ78 5}'\2QsV&Mm{jvjW,2;.fxzzD-(;'іk:`C'$, B7GȅzOڪ|ǝӁ#ǰT 8px=8@ɝro2E $%ԇVqgX9aTD_If 5a3=dXaiŤe.#f::CePmٳкm}dW jhBV󵬾^RT{is/rWdyPwq/U-` ,/z% YaK N x$ oDʕ+.*h??F&馭Yku;sY0 Js2}ᢻb6 nx]4g 5\ۘr2F3P}E =@x-yr΀'TY{ZRXVS.t4;a!f۱gme.T=0RY+f <sw9rɑĆN8iBXBHMeЉ/wuJOYHڦ[QE/~Qg#M +O:T/J33Urc$㊏r39T{3ta6BZF~@2(J>xǢmݎOItBDɜ&cXYTJXf7'5sye2#ʌu”6qW:jn=z؄ 73]fj`(Hlݕ~A}ce_W=3< He@`/‘{er/:onnc@bjWW'uR+WUv P>KYa{qa7 HFYݠ$=NŢ*f 0z\L F؎nYA  6Ps)QKYyklٺ3Y}yf0xepC*[(8b-g s.?9T0#&qCO^ ,ֆfa80DPVkk+Vʺ/o}𶎶f?YZo5wo}KG||]c9,[- gX-$pUY=<Px~d&Z J;WV`8IWnG25!It@ "&{fzg ̂-P!Ztb`+f |/X ?K#\RIAOy78鉾aѽC#CCHe`+WFam fU+)OQKVT!շ+gZ XVlk6FheR9_c (xG ^ }` S,ZN զue'b,Y!EYko{I^LhD@KPѕ}tl>Aoc"x74g3#}يƒ21׵Σ *Cg@_-?Po/E59/v/p9ndPr]zuf²# X΋)~atBIbƢbV4C#7P#b Z%4ƵnWqtQn'=ALJ_CI&1)HgӮ`$`'$GxN3/`Рo g xхp ?%$)8v|'Tbty F'ï7TJiN


WWU#WVag$O"gM.ԢUL EJe^Vxs8s)V@ DR… 5#.%st\,^ۛKav$5ꏸ* GNK $oA.7B,U/1^lA _WpUK1T$и; W 0EXK0Vrճ\3q~a^kFG}qm 8|Pfs LbiDz xcAք*-ޡXJ.ObW lUo&rCr}(rrHq8B/`Y |bჾ%vGsn!ЂrpM! -/H̠}v<0YaZ%h_9l`ɀ8_<ݓC܇8TqC(M @DLh}dYq0K7bx#Q B0y̒1<4a7>!YsDsՁs2ВN/Hܪ8xL#֏LH`,C4&HhYp~kCZ&#2Lw"P A?+00|bYy…s?˛*MUEQ4 .'RXF$!|0I Qn8@Vi7.9YEsD7&1G>$Xġh)s'D=}`L 3]}rC2xJ穂W̑ x!ڨ/U 0 P$ NllKDzjCwqfX*'T$E0𑸊C` ?!NUTuu>l7 wHh,'M= Jf&=xs8I1^Se.tk ;d|o<. :W7.XUR=VZxe\OtSXįk:@-|]YjaM<~Vi M@_T[ '#]e0A,|"*hI`_k7ygH cd2¾j+] !adb 7Bc6"g //cgzpd`"ZH{+Ec!Ɂ7 hNvbQ%JBy|Y\b?=CJ FއO0,6?m[Y*Mr5E)ZPalj]BB277ʻqD$%Dd[$,Sa-+ݭy)7'3kNPy4PȢVWJ5_*Tf?aA+ Y bلۊ 7p՞Ӎ;ou# )lqn2iIJ?^ %J'ZMPd! {*r4ie}&AH$ 5CCHo+**kIV}Do`7/ū K=xE = ^2eS,1P8#zAYI9H*䌫 bbn+N\ 7xOXftYe 3$ 횣1zX\C;dݫ;:/u1[_#8d.X^*u{s 5L`! w7B2,-4≜X +(>c*wU &7"ڎ=DdM%:(W1%kAY%Y0"@H&s'ܗ`d @y2eRp\p/ś/ +(-UC_ D++*%\Y| KE̬l ˿6fFY{d Tw@buW Iʛ[X4`p{H`!'N|@!킇4PGܯ OD./c˸a!̱J= -OصM)0v,J*BW_6 J@6lG(3#RW:d/o@KX҅=]fr\0eRyb`7_xĈ%^hc'Zih}JŤ ::6=#;R*쮾z"==spV?K5vtk K@z8~ ty$()9,~(o#{,~r#>2hI=Iy @b9yEsjH8~<{/ɕIқ(!P " - de` deU|; n7 dü?~c,~bɊ{Wh>\>j^K.Q 1B+H[X/jZ]Ko~ԁJ]`&.$+*sWH'U'hWuͭ29,ozrI{\;ǟK.yT{XHPa- S?>{ M>9sOXh {C 5M1132&1fw:# \ѭ&[}I)/ÿ"+oС&{|@1 F' ,YQ-}\h$E$7剩x]*^k'@K"s_l";l-mv'P-7C~lIU ws*YΜsWxْGKcKZS&/|Ef^ᅗ&mʑ7;08*Zbck\BF "%bg\}y]5_(CAsR<'aQ=V~RU8u͛0>ݼekJjzo@uMlCb 6+RCZHFv3/20xR_귫غr.  E'7tce5}E:[m3bx;ܑ'6m./8e۶tњ!/(lTHoD+RŐsp+ఇΩ㽂vd'> stream xwT`G7hb, (HE)"*"*R)RH., owk3s]+Wٙs}?3}1sο                                                                                           E… [lY`ĉ_6k֬AoFիVZ?UVMXvm҇~ؾ}AMz'UdOw^<@@@@HZ`߾}7~衇.BVO\uU"=zhҥ     `@NNΰa'ZoFO n~{رPQ     H 33e˖wW'ڵJ4^C@@@@4 ߿馛|%v;ZjEء[@@@@/cՔ]wեK'O @@@@P"0a„ *{\RV:{l%t    a8sLN,@wٿO9G@@@@ikڴi2eM/mkݺǥ0    N 4߾=ASW\ѲeӧOn0    *pa.]ObҾ"} @@@@@ ,C.AkѣGXƉ    A1"$wu]ӧO›6@@@@@e?#~Ȱٳc!    ͛_vea N+ԩxvE@@@@͛wO Br֭[@@@@@ yF9/ pJ/@@@@@w~4%x}s0@@@@,Э[ҥKկ~5zhS     `T"#oh{c     ۷-[6:<<''ô     *0y2eȋi9^n̴n@@@@H( . +b̘1 '@@@@@> ("_~iqC     P/ %eu)fxM|x~?7YFU1A~}',s>N֎#+Pѳ7Ł?iBI3~dyl'#.R \-y*i?Vݒxn%K 2-E8wSO=,W^{5zuc6䮶]Łaomu1 FAYA}f6Vt9 Iךּ! 3cNe*A/1t"Ӟ,TRwq?_nVZu}cǎ2e7i$СCvשSg[}kbx@5o_"wMpUjv1jC$ g:tN77y$ȩ|SY:m/[ X)ț=T :je|)zԨQ&p5׼_|HVL֭[Ǎg+-\uUV}{9/\Џ(@׊/v+$e8Oş!E ½H6st*$A=5`.e!U7;XfKsa豖uWhO= BQol&3=\ҥ=}_4 ]rqrהvR_ avI?,M hz7-' OM36} dUג̒,(QRQ\4[(ͽ۴g% >[o͜.\0aBժUԾ?C%ftrWo@VC"w9 @`l>b] B[ ]rRn:)иd5˔^,,sĴ0q*Tg*c zq  fu6}ðv?W_˕=ƛ|8T2l/=,ɚ.]Z\7=z8On۶Zٻϻ,]c䮶5`.jI 6be`N%9/AU㵜% jakۨfmCa>^V]S@]E2lGTt,<Ϳ-={[o-2H\{i`aR wMW-ۓw̛ܵx4bi,CjLi@H-`trPRj^Zg5S&byWMɳCm|e*^tq l&OZj?Sq+yCSĕ.qi|棏>7dZV#@o"wUߋ 87"=@H;w@׹M<f6sם;9g#ꪳ'9i3,S~zer&k_~{6mOƏN3˖-3U< Ec䮞ldH*:g?MjFrWvuM`|PXorbR3n܌J*|gK8HU7 H#pO>7͆+77nFw}7Nx͹kٲe9 w}]myczmu:$w5aiYytL^gڽYijfJ&5g qj)p7]jժ|j|\z3g2(y4FwgC1I ]cf I4nlT*U;ܮĮ]/ՒhW:Uv8lzj+gյzB^}'-S;|iٳC9]_9RNw~[T)qe`]1r`)Z3-w-<{Y*o.LlJ T^suV6.+n9cmnlVnjneFYۨ&o=zpfgg}տou9GW c$w ׍i퐻53wsܢ䃈ܵd# @xF&k9%+^+s6Xu%ҬlWe+[H|].92СC$@\[ ROpq'0h7Frנ~ݘ-VcsWqHWhK| &Ո @oOOf:sU[P35OV]K,SҸd]baѣeʔۦMnݺzop>jr`-MsWq ~x+6fRj|MFkܒUW#>]&PpjvSLfCR8{y^qf^[񭖿G}x=f5~ joܯfRK٪a׌ ;w^ve}&woΨ-rWq@K~DrWގGC Oto ΍(.GFq?xFG1\k- M҇Ce{E,˯\|cǎ&rT{ァej>%k"^C@8źr1rWgȘH Յ?Ke?yONsϫy埻$Pva4 wmydQ_^j6XvGWo9d<]ovvdnݺFS\ŊOP2eΞ=k$ wMk4w-xcUlRUW6} P0kxʛqR5=6QX5G7|SqdY#GT}ȴU *n>388{s҈/򞠑t, K+7ZdAoT~*s;+VTzaֶbVLE:,^*N*6(]#.I-mp=A%T;Kђ-oN '卻ZlmlLUW5%+jtIPXKU!D|/U\Yev6L,мyss'W (X#274;nx㗭i-fUkPηC{[m3"F*44{n9mjT?/ګYu061ࢂs%Xf`8;w/Ws=5LbT`릛nJTvT @.H pZx.&8y)Z Z#SntG7vo./z==FĪl4Of[ [~Nob.H/X ddd( ]EGcǎE>XΝ;e˖[?(@ &M!8*n)p i3bl=$N¾IdXFϿ7[ xv)]_ @b)H]'(DHfi2S2srW3H %([x;?k~FQcXhoUWP@kKc;X\8%҂s<ʗ/&wꪫΝ;fjƎrWt@Uٛw3S⌮Yi L,zբ[* ^c{oDw6}&)v*{vfp_fG.7^F 鱰nVti5Zd2rWet@Rsױs?lw{&{zjy4IrW&Ko$ze_{7%ZK M6%K~6ߞN]3as˗ ]E/W'2F@JmB ^@j{='x!whJ޻|)[&x3w*jt?g?z}KV]gЙԕZqǮ'I(@ҥ;H\ "@ 䮁0) H=iMR3Wq Ekw}GrWS`K$̔:{Wߤj~\堖iΓps`+5Ryiܻ@dQ)n-{ˮ3wt|J䮭[S'"GrWPl$r`tӗn>1੫1ET>iF- K.Sby[* ӻb(V]#ŨșknI?c[@voYMi& 8)*k }fƔjŏVL E0 &P!Zש6RbmRFqZlYjDg JW\Ae[ *6JrSr-.1L w5yv- Rf|axUrd-k|:? 6rWgǨHq$53cj>H&_h2c &UB9+v8OݦpP}`n4tR5k c/@jQRsr5f!qagqZ^}~9yElf΋U8)~Z޴Qxa>%9Eh+Qp-bSDxVYcWM:uT ;58ƭN(8L/b[t'r0 xZM;}b|=?#>sw)(HV"YxR@K<.2~6ڙ:_৤dm?`ucjrӧO[ EX$@jdQs?{bɞ)^\vuVL7dB$&̂556 Rqb*|'cG+Xu&Wȿ{';AE]Ԥ-n}ĢZ}cfd5n@߮I/ܦe&C㨓:(%["kD*X +="юe] w߿/GjA~-Mtioa`~- ;wx3hșQO5 w5vjL+1j-Ѳ/k2KSW͢Hs׹+wzp]*ѧ@<:]Q(ތU1ݑ;w+ߺ巢%>Xы_Pd#]L2+XLZ@z}%҅-7w*l253D'u6NJ%5kdQu3I u-%w8˛.e_8qFQ%2j;"}qɮl?n#M;5#fI67JUרO1OM d5NЈ8WW- %]?CЌeڴi r뮻Xd #w%wMѲ=_Z[:;:uW>}!i$5*@v 7Q(r ._]1˽:KP%kt+WI,ڬ&%fʎUW;v0e6)]7a7:ܑ5@L"p{~%Uٲ"ǷFfݦYmOvOk!2rkP)Ę2d4kac _}!_+HA >q*8JBv~|?Y;_T:zlBHa{o*]&w%wb wǹE>O_z9#' *6J/-c]}gwu#Pů5[ v >[Ykz7Mgu ~ ʳB_OT@Y\ __o\ܳ,A=&w5j3tV>]Zq\k!= H;d7 pc3okRD7u½J좵WŖ2SֹzˡDƏU[0g2F3֘ u*@^\ZܕU1],^^"w h gSVbNX坢~q%]N>]e ;> 3Sw -Pv{*؏92GV]gǁ^j6Xe-qv{G=%\䮟ܕU͑rȒrWG ۞|_Sz}Vq%J=]8 Kq,.7{x\:m\f'hjcFwjXu8I 6&XUz齎͘=&}W%QkÆ \W䮺%wkR 8A[͠{h|M_3AI: SlPZYەQ\(FÙamAёbV]N>Ue?cۗ%:҅8jX_ fM==NYS{@Hc]N]*r[UY|'`xv'\+,W VEczc٪e2vĪک=cXbl7pif涘e(bS-;^)]˖-k Hux&VLZ8 O{F{~Nj$άqKjmz3&-/s_7'nJ䮢}If]]ruGxy/Ur<M,Uo?Wl:3G:iA )pSQИ%NW_TƏr`811 _@@ruz/UM 5>S޵A Z^rss3fH\-Zq@jqnrN|Ֆ%c*w;7+CB|LFm5Yz!d=,^+</'_g'*Su]V-'`Më)Tkjʢ)Ԧe9 @(W]htZLk#=ZܕՊ5z%O1ǹE s~V vr@ r@ @fYS;~A4w'KJ͚#k\Q;d,G1mt]\&}]DV[\9kJ-]]<2c"we1G?&+p*( }[پNNVˮϻnݓ$Md%7dl5}fCdO 6#tEEn:tZa"\샧m?_re$]]8\]#kxj]8M.ܵPӴYdU#' |$w9AN`DWFdBˈ.ݢef){#bյ}Д+anaԨ=Ӽ)7Fkq-[*]E۷oчQ5^6FUw ~n\%6FaS. e:vL,q,SKt!wؓW`uf*UƊ'6}Nw])j.jr~YB8 2w ꂊ3"!]x}_.1g&Xj 7Ef$C(]3'0s^ܨJgĢgfn6.p(J`- < ?[բ+ f6mRl>T殝F,Y-#@xrW1w;z>gM<:rQjGлQ6/E`ڌTϩYBTd}', Q]d>I̠ Xu͟#+*}8WKŗĭZ)s_+,U+t! `D *w[pGF_OLH/ k b.$NK%Pk^%Ç+]SNX0Mմ Fϸ+I_ɞl5*KM'wֶ1 sgc5:G/nդ@:MHΓĖ :6ʆv )Ъ,e>efP@8]9rטX~-_-f9%grט#I,8K^~e'}ZO]"uԺHjt_R8)*͆$԰!ⶒ e]lRYz5*!6rװ85M5~F=]!gqebH^6?&wGK'޲jrTb֋_|u~5{/ŰάqM]ą xI=l$5,wW@h]9+ OKeyf(=U7-&zZ'whP%I;?`|J]l|+\`;֟=^u[U4v-5VeK:64{M7)^˔)s-tӕ ۼynՍyd &=+>[]|e!wMpX EL_pW.}á)w8y3@R`M-{E-x^_͛+]EGjrIOXʗ/rwX5" [55 dL*^`䮉[^%e\_Ԗ *qʝA'ᯏf Dϳh V`a%[wիWD_˗/6Ǝx;vtǯ24bTripthE]KI`ڎ۷W+쪧nݺlvZrN:C6Jtl6Wm1)lF1|3'Vl:sq}q'ܰ&sþ~1F]>=v7M`[I7yLPQѣG/29_uV#u^dZ7 wMj|=ѴWkRG;5a(Lqh!V['#-6#SYU7̳\w:L@8?O00yJ*)xA-//鍊nR!3y3״OaTBZorH`W;9g cH" "YS Y{Yg8> /Vd»+X"^z}9ĉT0nݺ?O F]~]S[OOş)~5#ĴHL[NcѼKV,{弧jyB8 8Vdx>"pjv:ѾFG}U]}۶mMY .,U91qV6ɾ:"w wMϿ7@㹜]S>Bڑg1lTjEjmD?#qQ98Vdx>"F$iѣY/UrȌ[WyV)(~߾}7p)[E 䮁0) L'v~/]nC1g_s"̕Tpa=؋`-'#{UCp4dOX|Ȼ"LСC3]͜ wn9 rWG -0 ֓"۟9s-@n ?i7= l{A)xywRY#gwhrh7:j#w  ^z-̍v3.~D "A@ \ШJ}պ:S`k D_Ν;gϲ;| 7G]5|+c75퓻xThl@#>]) 3fU:?_x!a/pdA٪$-J4k@ FwmSM~_gKU<"P(@*HrUeE`2L nh>w`U0l},bK .ԛo "Ό2ee/]Ν; 7G]5cGk45BK$Z4@>3-]%ܥģՐ 8R}63w(U3#ѽJ,W_՛/:X TM4Ѯ- 裏* w5g.$䮲X >1#DM$j%)܂"kI,eIC(IO`ߴ:!q%Z(J_@\hk5! 7q!l߾]] gw]VLE:,@fr~9Nɶ.]!{!-L R%Nm*VPMwvRCKܠC"tۧ¬`РA&䮢;vhIٻw+s&U<%@jtPL]MWWvF`GʎHq? 3^ nH&0|]=fB`C % g4 2-͛qslz-V ]>w@U$fɺr/!wUy@--zk`Lm9^vnH&0gƬ$~ymBWTOeXx޽W]u9_m)fa͛7w2GoϷZU殒~lKr.@xVl:Pf^"wU|H@,"f1-}ճd@L# :?xO"d+nI yq#W%YùwPDӣ˰I +Əo#~_9o<19Z5߶6E}Uɷ{=P͠tٛSF5dq^U)8g$Ԥ73z,bZϽ6>S?VRŴPS\SB:|;@>CL @s6|wr!/jq4[X#$NI'`ڦ1IܺD5Xu\C۶iޫb5I9^m1<K_B EIȑ#MMKK33q-̮M61˯c?z/ڒUWG ,,&dF_d 6]`uufF9E*cZ];-cyɒ%J23zU+~w?ܹE^{hW_};4u6̯yӚ"w;#'0]#$Iy#g^|z\j;-'ޜ&;WeY*4JO6xj+'_t1R_W~ 6lX#%`ҤI/@57rW32oU/7y\p]!@#ǥIfF,=vwLUױ Ma86fo K3JFƦх]yUV5jh8p`"5SD-[T#C/j]: ^]uzz&5Y ^z(a_I˫~/f H6}GBNEdžʼn BoSz|A}qc͙ZǍ״iӻ| ==prU׽䮁eo5pr&ԴHL)N/ǛjyXu j*`M@f ߪ^&:ij-O?3f̲e˒#7o^BnGZl3g(8TB]Y*ME8IcG䮒Zq$.e]JfOX1av*XD4>2^05s]Ge GKk׮-SLtg_sSO=%_|{ďO>,JV#d- J wYrU']a #8"ЈO tepVdg{nh9yhEW lvX/W[ w y&~l]ફZfK!cjYؕuJ9ԍ}@jL^I;[4qG!)DhxM _ +}8T#][-k)^RuN-N(x%[+=H_"-Hf/ p]zy݆Uq~Z5y#]7Gv=O`|QBz@ 5Vlkj;+wؗo;O, ^5݋Ǯ )WձcG[My|rֽ]'Vh}Y w5I0 ֻj ` Tp}6g@ucL/2&Ɨڶm7Nw/Æ f1c?z/ڒU~/\ *q!w2SoC`Qai ćɋ).ʙ- oQnY\xyg 9\߿ٽm֬mt %+@f kɎwS~uE~όI̘HN@ѵ}jek[U=Bӣ{Y6?Zgjf3fݦi[l+T}24jkJ؏䮆(ܵ>}]:4%V$rWT*"HE}t =}7sv=z[UK#;]]J@HZ@YslIVwh߾}W i1 wYf5V]e{ř%5Y >{z%cU7TGG"5 C+cN9Gn^lwފE+N/4ii wYfU[]K$2g]N4ū9JH豯^qgks3HךּLa42E2=UVa53˷K3Z3fW\Q\jڅ vhP\rט5ֱ]h5EumoUm1BBAnveD S ??U.zcfCU7Qo+[ąkHޥlr;z^& _F ]w^n[ʘY4Y5zu1]͟ %-6>C`QsD,zH<@=|w%F}cI\f Q޽;yFǓ'O8/@YZ|@j[9*BewY%w-ߺ'I2 شӤkvGcR`Mή;jV'ˤqZg>m%w0~yyy*T3~o?<rս濑]͟*]]yj.4Ƨ#R`Mͺ#{i*l4㽎rL/ƬVZE<$Pt鴴4%SJ' ƬHj/,r( nuzI]7];,(ITOU"uIZ`5{~߄eRLѴg1z:=v<|6OF7|+?)rWe]?G+<{M{;יWI0DIcӮSl` Դs .Ǡ+5maMt|P)So߾'xT/|ԩ[oShK"})@̛ i3Z=_{䮩͈i{6#ԓ_[(j' R+(RUH$mfb"DgX]\wLYFdk/J*%#{ gW]uUzzz <\rWc|/c wof$Oyb `3< ztNY(7ZTɱgώg{c gwuW8c`G#dgg! wUVk75s6_Mޒ١jM .#XuK$zZv!J6PhR1KA]'|_Sa\u&{h:rWy -$w5pŦx[orפݘةd٠)+(QUD"{7XfW'Zz${ܫ\|!|IzlN9ιY܈6n(>r+T?$) 䮒gC%w5Mj%[cgm/E5Y3'0s^*5 j+_Oj5XuXs %nG\`ϑ<+Bij&Ɲ'xDiii]w]hCԤ~-;6'"    B ??iӦ\v A+.,Ю];@@@@@ );vTT)AΗ.첷~ȑ#Ia1     Xr~i8#QW^}֭     ) X"+k;"    @ 6K ψ6jh׮] Xx @@@@) .m_wuf۷o瓋@@@@@ƍX*nUr3gzw`K@@@@@ X}m۶lٲ=P׮]?!    ) lܸUVwq]/'\SwvD@@@@;vիWŊ 33ثW^8p     ܹs?gy檫қ^s5/h%K M!    ֭[׿ >eʔ^{O?tӦM yfk@@@@@@!4'|RzG}[n˓c[oUdjφ`#G     V:t\bŋgqM0ҥKK6mɱb8                                                                                                                                       v?:{) @@@@@Rq(CƲǛ t lYSh]@@@@@0 ϱnbaO? cG@@@@ܞbZ|W'.eA@@@@B%p,3?btjO>pCu,Th @@@@(R@0n3˷_O I@@@@p[`ܯdFn?qno}0:@@@@8w ڶfEǧsh|#    c+i> OSSho9v81@@@@,p4BoŨw[a>;    ^np7 6[` @@@@fvì`WnÒ"    `f>txq+v(O     fVr҄%ݛ#F    Vuì`WqO,\A     7 6rYY'^t`    (` M_5o>'@@@@@Foll<@@@@\aV,2@@@@@pY~ @@@@.fr-.     `@holL;@@@@0+5R0#    aV$#oi?)@p@Q?mC@J^='}z&|5~/neq"N', ,u?cm}D)@KծZ@p^@|ӼagNS{h߮sQ9N3myHmlG@0k^jLν@@t D4sRkʕ"A@p kv2Vb&@rdI ,Wz- ka5H+d_wc(Qѯ ЗJ~]N2A! GMkq dIIC F-Ƹ.xﺻdl"A !O@ET"pg!ڏ+hd DbA@RP)lI SZY(cz(J>#M'g%tA@(' ; ~i܄ `J . dE@IA@(h&,x1vPᇿfJ" PCS67SQl»֐^!A@0# ԇy* kj^XV7zR VA' woPՌ<A@!QCZ) |"" $G`ʧC׿5z/~ |A!` XIuWC 9$[A@B@j/V(d)X[*c_ҋA ^Gь̪4S1»AE$A@# G1A#@Gk.t ?٘W-S,! kqt P4,m0 Z4A*" >' @ld ()A`ծXV:] )iSC"Ԇ2SxWK C |*,lwS)Ѫ5RŔ| . $A O@&kwA@>)"@a! OaH+tŲ_iQa DD#] @Og) '`V Ձ#ylP)ZA =I >5@q Y0/v\q ]H-BD˄ut@Sa|@N&RxB " ;B}C*  2ؠ$iA U4=W1^O?~~6,!jhFQp64 k»֨^$A@C@0d$^" Sx%sA@pGg)vWE{I `PxW% @MF@RwA GhA@]~pHxx-"o @r(FUQi$A@"@@"hD PS&2 5]kx E@PY߽T S^.A@B} j)H(2P4$,L" DB@q+oXxH}I  x~?_ GA!A@(w-9AJTsF*y푔    ]&o @eKʏR7?A@A@A@@@xhG P(cY@+0aYEs12ϼikS$,    ]-   d%)A@xה4!   XwM/]qj  w %Kv`譎^a3ߔ>ݢ/F7vw!_F|DzfR"bMSH ȅ)u+[! f=hPguqϹF-ܱ~k?3o.~lȜV#l)ƽǿ#x(zٸZMhs1{A{&:MX9rN6z4TcG?shg[8vո,i;vU'.߳COV [ 'FQ/ x{=/Ǡbh{^1+v9|*O+uq~ܒݮnW'/CO#hlē-l,nJF!Kph# swUżs(}̧=JV /[x t~̕6Wbv'DM2F.uIbIwSL`cș](t(u{NZD'5HU{NPQtSK!T`KU$7$a !-X(T.%g6AB}4Tµ/~3˨}]-uf&".E6jbpYpϿ QF9R =<9G\g>dT$i7Dr2Fv 1~.?^`?v}Q]F-]H!V]+7naC׫t'=Vkwџ;>AߕhŽU 79wwZfw?n1wѭnRXUB -SCŰKqQ V{UpZAR;mkKMG_gh/_xX|Ws|Ix mh0NGx*.kCzإƓ*[8k';G*(^b+.cl9\ʮȇąx[KnRG-aZK[햢&OtXxݔ0 dHX^Xцxh 3y$.<<,K tQpyqD槄w>+vf;LXd1y!'oo? 45vca@zgw + :޼;_oâ˫]eۗp޿e)`/%,Vٯ cVo|ui\^ xҧ"yW4HaXxַX5eV(g~Ua|4PN9 ` \w_ V=` ĸVbfUAΰGzg~bPv&s G 6 ؈A CVoh7`'lUm?\m'++e є=eMVuB]J `Sɓ,$ۆ/{[, 49]iCߠ6Gf ?12{0os0mkpàgN] %s`E蟑*k f|>q@ɂZl2=p=K?L[86Cb>kL=x/rCw0L%ޮct0߁+E"?lG1aXqE_τɠqkar::qvh%{M#{'/r,{*CT|wXM*2Y?Ҝ tj T*:P']O_SMj gs8_@o=Vqal ],$@{\ vXuZW/wA | rjp>V\|~3;`IO|sa¢%Pv6h1͍k}D8 @_v+[+|caC{%רReMo] f8 'y'ay$"RS5;:= CxXEp,m- O:?0:%7xIᎡV%LSxW /2kJX)pt`_zDph@5 0}ءcԠvƓG}/^g8QuoZ.+`CUޅ]4IYJ]OTmh;\PH{Nj9kOqGU'5Ԕwb?,(3@&@ExcI1wGĸ׈ջmJi w_'Q|_/w;_:~u:@`iu:: J"sد88YW1 t͢;fƊi_+ΧkweTG\a7Tμf3UOl.'/V=z۝9aX0c*!ėyۛ[GxW]3`m昼.R05q.yW% F*P",`թ Pd` uJ륱/a,>)`B3z WKLxרwq:3 Qswi_k޵ ; wSTb-t:pk'@e?KyJB]]բP~-eƻNZ[ gp& C-;xN9 a(Ğ r"4 ?Wc=w[bȞ쉏X~Q Qѳ7G&=+mL(k?`*Jcat`o 9UMͯԘ~ӄwEޕx K?4 b܁%q |#@a4'ax l6R! x'*stJ" -BQsCs`~aa]`c\Zs}P͕5< P;5끁yWۇ&jvE#g؝K]a!=ŐF ]o7'S.UTQtxd\a9cQiZ49:ac<@^v~TU.c#9Y 8I:0bwS^el:Y*h8]}| [h^rƻȗG؈YϿ-,A%`&~VFVkl eF>.lNR5|Q.Z0y>ae)ftTmY0,#U3 e.gٷPxW|16 C ͜s{K@?y$]=xaC@; 훀7%V`}` )扦cUn ǕUg5+Z^F# 4@w5⤹㙟wG38l[7)}'MlHAgi]xרȻV礴@ahqq,cVGx8xS6>=%M 8[?jrh 棓:y׻%W$U Lְ)^ GةE,lCh`vތ@ʟ=zа-k7х[Z Uy.IU{ĹNQJgxt)ӨM"{?QBxW'. r K/r]5M8u[HWQSuCzTp}OL ;\0`%kb]r_{L2z|Gڑc_v rw{Cܨ2k`qhvSQ° "a1G{,v8awJA»[Ű .\XrΈy/8*cŮerxOe-~ BʟEڅ.qm^T >T/;rфŷzN%tPpum)JItbEjZ7֌ ޕ^O},@æ5ו;ODԆɅ[9p2͆,1%kV<\w MWheO4ouuQ+5^ 3i*f( ?jXl~+842*D&YxJUaT#RLЎWo kN Z`ajRX᨝w:Kڭ ̕7[1-~tË]/+,&Ur6@3WT#0~Yc203Qut E{|'SJPʪowwt5wC>˨L 0kt@> / b+!NӠF arR!.0)wYw O< A' :aa80i9zLcu*Kب2 Y;LZy3mS Ē2ir#NsH]S9ќ8<ü˟cVlML0UJiXTO#S7DAx.c1veQwN00=~~ֹ>`s֚9.9]YHjQCeE0OذU.-ǫ 퇝)1=? Գ*Z`ѯˠIȮv`vƾwb5w ym~DҫW"9?Gk`U/xm u,1x4 Rj,AAg- cIλ2++ ˑ1=w(UF6`bs]?'s.zoJþVGO|< "%F*}#+0)0eTQt"axkƁ/)]V c)&  j z|}rȃJX YIT >v&+D+*!iA6aг@z5#+W=D. v}'.H)ֱL)Ԉ08^)j_}Jh* U eMIm~RP»fERKwc6 ޵" f-LJuxkQ 9~J9a3, rovy[[[y eI79!}U ZdKU|ؗV?j8Uw54T=Y6؆hZM6w[y+տ*1C-]tR^ftg/UvG#ʳXH晋7"Ǔ3ؑ O/uz鈯{8y-Qp(} ww͖c(m8Ҝ*8AMQ1$TkFxWT]/O3WY.67{1+Xp}EЏKw54h.HGK[Wlj͸%-& O_@xר !:gc% 3QkX010"}-I]4h\v˚ƻ/cPH8eV 施']xeZq*Ll.R3eH"w AR[<SV1}S1/M某/@s7?@]mѴ() 40ŸѣdE 0]O:M*OOxjjK7.q+\̈́1 9j6MǪݚv_pF#HGElO=wELho]3;yjS* 4@ 0ROtQ*H{[]50.Mqo?t,]Ze2mTGB`K0xW V»Fy,<| a|PWҬwQ$Bg@t@B3WZ1pb7/^}%?)$KmOYϲk +ӮHO~1ӂ arF.lj5/:LxWڠy D^ui۷Ʃyo5hr3۾bAI6kQo ,\RS((+]w25+U %أ.$y|Ȼ>}Y:kPpӝkl=ȁ:u5v1Dr$L @yӄamJ&:ᤒ¾r{OU8/Mi)~٥By=,Ĩ. bHPVP7=+D xG"APR''jThSzԦl ٢dCƴKVͰ!+@]f`c uMhIfڌrfŀ@)W?TD?QUε G8UE 0m~$_+q<kaj8s縑'5XA0ubtH/&| Rڂ=s&}*oGZl#"[B봷C*ш+!@QzQXxj";O5 jޕ'p)ٮ}卻 M@@xW(Pc´zXCBk8̌ӏ~Ȼw0V36< _ tOuC uL/wxRݨș }^4b?V =%,ao8d8&V/ 2_[VV 1]$(kimx¨s ^@q{Ce'+ђwU*0J^N l"ͼ+h&:t<ȃE]?rdj D%@쎧!jo9+`f( 4 &\Pv13!)FB'\{heт=lkP91c 6l܎}\BMQͤoوDӔ."fEhR&&7Hx 'X!a+/V@ Ss5 c5JVƁ] `N7Ȝ{CvB%!2F "]v%perVKr̾ƀtZXWXcf'E_e]swj{!FЦJ*}iΖ "/njTvZ+,Wu&K4qj06e؋Eۍ[=`\]X񋹙̵cyz.oȷ[!ޣ%)n|p&K_^RuaY YGPŇVPr&pL4 h{̉Wێ|L hY&+ڂwE>PPb8.f޵LOƾz5?Up1ũu~л]na!ĸb 0?sɻ?:uTZ-VÐkE}Le5aO$bj-Sri=E~;b9/0 0!6'XE+*C9P6CB ,.F$&8-5XFY#PZ!A!TKixx]3ߔY Z҃xd?1f{``͵Cj, >dh9R Eg92@-Xo{>mF4;Y%FSGn;p:0&^ӊKv_eaoƃ҉M*D~ zQ@=4& 2DJ)=i'1;9ha쿞k5]ҭllbqؼő7}~ Fh*v1:XI8UKսJW;ӍL8J*0o>.h>5)x;Ha'OhUNUʮ(j5/åMm0੕SxWwՌІY`5/CXYwln/7G^ɨ̽xeqؗmkAJlo)W"(g+ʕioaH%U4 F߲+{fX]A+Sbg~)*6յ2Kn +2SAk b7eF3mvcV^V K5+x08k  ^v_ Lxרz)i[:1Y>ft{y] # ܄ӫFB3r[>}90a70Bx ˇ=/fos*»w}x#} 8#)0ZZSq>형X VTV+C2JD ] QG j ĹkPa7qX'T>:sû u NyzM݈Cvټ4(7+.%s;Z 0+Oj:6 W®W$ v$ai9*OXF@B?x1w+. ?ݼda0 )$&lV2G6%84i ׀TA֟ha𮚑ء}fC࠰axahMTY6yzui_5M1jDԲbDI%Î/F)6SRmJm zR/=ԢJ?HF!w kǖ3ε1L7mgLXTw &{i62hcxqh0N8co%[M\͠(f9V'$y -kEs+ wXn e;h#JӠY[F.#sBU_`FB]̼FwDJ2˩> Dot]%^!T!ޏeUece9<+X9]Nqy=5鏔8%G!Ybv _uX8|o'Pl$_˅j*t_\]Ż@͢rKHt(n~p* +zw*+6ޕB25RQỠw0^1&ʱibwB*Ǵo#_K7N\vjc}hT4O5d`~7yXxs"JR?UCwr֨\z]WB?*RAΰa!i:0 d0WbT 0iyiH{X2Hꔰv.3b͗RfdJQ~<-_I|^BT$i@B J+.?> _ʅ:<dTqz}sf܋Q l-RsxW\W<##* o26=PKs$,~wTl,+UMo_ K,3aEPл(ѬG t*+~b/a+k+NS\Ԃ,ɌQ4@Rˮ^kxfnq^ M^jҡ }8LdP yh\6yWxk4٭ P[88ZI85ğ^t.iv9ڨl#A"o&"I51l5߾Tf-]%s0/ʲ:p_)g/p:o,/f溌VL,[/LOX{"E,ð'X 6X]aeC ~HIģIࣵT~N^o4J4'/fEY0UI0zNw6f2|ZC].5w*퇌f.@}YgW啒Ï4U׼+tJiX^Z״^[qe{j:(vИO}=NU/gN=k%Lm7,0W-KX8X 62W;B+OeCBduwE] \7-]pUVog%ml]yj kx6X檂JD޺]vQ)6xӰAҵs^~x)U&OiQ_8:ZJOX>#(*p*a9ej!tPzC=B0$=!a^ٰ^^ñlHm%vl(׸mm"iw CFůzα͋O%@ AwOs7j7n-/jMjeMҞ@Y Pf~hDQo$_l=QW_@3׼+Јfa^g,ES ]y v(jG2VqJ΄00iVKY(ހ.h;aEQxWO&)?n1P ڻx@h-F9W^QSE,jx6xib[vx[Eu8l&[2kQt$6#ݥ0v$ eCQK*C qAqIa;yX.V8Ǽs/%I3FunP"~ =pcN `StXT >aB%~ц_B;:p}lpRR(M\uØe6/#t/f1}WW]k1Z'EĽoϥ۰dC Чv ‡_%.OZmj^#$bhR.=,FP͇aT6e ClW4ZG3*X; VjDeW3\yfL5Wwt#%:s%;o+:e}HKd\}U])$65EH6 aӬv$,»fUMѥ]ѻW270}`qQj0I0xwdeɿw-=Gglv?{ޕڑW/(ўkV J", {F؆ۜrZj'ٷj`UAahˀûhBVD>1, :;Ob) CJN]C_dzO:nGIةt7nQJ{`ྚ XCUwsM+|Qw5OOԸ+z,KIJ ऀvW̏6bؤ@sTNy[LV¼6Ի{M-w6}ܸOaEL@JɁ$R$1,cP筵r 9rH%ܙEՄw5uچxWӁ 5*ap ӎSaB7 *H/}' m'$i3y[aI=)9 b=m\0>aݪa]怶 !2vHMr/Q=2^pܠB SWPfO$zYԻ&J?gkȓ*8U1'\b~yGJG8dT@e q[+],IQyneͼ7ӱRӴ!OoAI޽QBVwNyWj6 hs7(3k5Mlb%=nQyקq-歷';h@UB€CGT;;k~s $DbJm5gUs0xw̷u~Bؑx»7mU+:UyMy۰5C F_+ OLj>6qyþ"b+q P덻NG}awU ]7;iZ9QM{\.;֧ܺaPղe@ ]Z:6,IFF.cC%-K:h'LǔxWP1NK_g<ќjU]f=R̦X\#zPe| zR+N`C>c[X"OFՏO+PhM~aJ6q1O[;d86W4c&,֬ZmVsx׭a!#NX UXJ |3*0IXxWKe@ ]aTullB-IF1 =WHbs]]{W4jѥ-5,~@$y3oFhaxx]p`4u,یĻ^+?'?^*yES4ʢ5wQC#RR˻sY͇Gs塥^HB֌zj;]#w5L Wpp0̀i -FW_tQ* `5 [3M7+hclwGfΪ&nCX'Ka#]2𮰼V^1qlˡA>jc_Q9㖨jJewMHoj1SiߦŻR*xd~6x|Y»Ȼj"ޗO/E7829sǻD%Fc^LFn,ٰj Xm,F3{M»AȻ(Fڝk.3|tSex;,;NQ}z2ξ+3pG[!sO;lH ;7h/+5B" +t˚ \a@m{Ӏ+ؽgb7`e(vƂp>ŻNYT9c$ɪXyeۏ=mRtͣK&rF*!+84Yb5fo0YvJ`g>5j4gce`^Fo2mTbЛ`<ʻj^b'Qyn|}_ @l*dԾgr͚Gu_q5+Hrg7Ɓ6"0Ę*> ygQ|G?L4WF=ݲ)ݜFxW3>jD ͼ+v޲7_ Com)NP` +|y?7YP;P.lPuT5]#[|+5;. هȥBop{nT tZ 0xN,pjweX5b yŸi];&؃S)wn}P*5wvH<j+ :]yZOw(CO{ d 9>}F!pbb6 cT>v%ȻR;y5Sxʻk@X 2)ZؙhW> 9qvG;Uێp | lf4 RW»Fxǿa1w'pRn#-jNa@^făzWY^;Nc2G{B֜ypjyǪ\>=}gcТ]0&i.wpł-\57&wp1Lޕzc\h`b|:rx Gb\E[ME`N5jR.1*I/yp9qEAeEꦃ&bb : !4@v#JW؅*[Q<;w]񠣽øy[͍k> lhs;1 .g] MfiRE})W~5.rWuwj1hVXF`0v5.7AoyTne6P&XỎ%Eҕ1r|u:]6hRR5(qqm@l"A0o ㋆w}m)\́WABa].R\ k_ZehLFQP *Y9:#],iQ,1E j'Q 8yh}^?l"¦ -5GEJywhLFQ.Ho8UE% 5ȀG»]w:pzA͍k4^N#]¥JXxWCK  B| I c]1œtŰwDqU Ld<4#Džf|~?çkO7_ w=w:.o2p9uJ7_ʖq W%J,ohO^6)Gi]7?KC4Ew˪#q]{TH:wŽ<5[(u1$^R~T ֫͠O6gͧ(&y{yRi~sJIO 2MߐAxWCS j#wS ;_0wܶc Bljh>$sgC=  `; Wx_9qaĈhgYvSȻȰً-J,e3)޵Ez)E BGkwZDR|}o>x (V':h^PW2N_ĹjwEm'U0~{9:ȴ񮵚flL?g"V7[\?ǩЯ,wwZ86ƻsJZ};aٶsT8Mc pvOb޳(|ס 㬥؅H56FxWC J[=>1jQIbv[X*\pvyFMcEɍ=Y.Ά;꣋`s_҉qx׾VG:az}'8|βK',."]:erjJh*@M,z߹ Pb]`p@[%2!Ï=x~@]{ּx )mǬT-$fI%ot5 +Lf!w5*ޕ.ѝxGvpk`zkm{Od?=]](ILzxW V=׮ => b޻ޮ95Z&0B|»3l96l0jg+ڙ{ }TÁG--=GSpaUN/~"F% jFѾ+&z5kA X5睞 [xWU),/uhۄ!'Z4)ϺWRu,׽gẺ (s23VX4|xo6[Ht=6!$ wrp hUb<.Lj+<}ptbܑQ+O6$!WFQ=04⩅^`XJȚɻN^W:D | tʹ4RYkЧ ,7^$l,(i_n;,f|O!%^E/,[բ7ЋyB$,8Imb c`cDRįV P~S3C ̨NIjT=J+kx.&#ޭ)ዺߕHH ?-yq9l܂~X»F0m+={MCIMOJKޕVGv2AXU3kbCIZƾ5C*FyZ fAy͞DF` {# SŻ0ˣuƓE &λ~1 s.6RpƄ;t RaHn-\QMlc￴SŻB6H]Jm񠣨U6Ϛɻn?|mFwՇ7Hm0ywq\zH+][uJ0F1ڑhAqT[=2g2*rV}I~ҝ J[&)Z{o *)m'-鵠E[5 +27rfzО>wM+h~g5i]qw;GYCgxWcӴai,`P~VׁUtM]*sq?'fH CYs^]ou\Sr\ey~FpmXm?HD҆S3qƻB}KU  Лk& Us HCixxߠQcn0DI +I\]z)5Z]6\zx(i OI4PS`Ka`T3Z]w1C{dHx <-,-ml4&/kxW\/ynV^V}yƘ{aɼܪn7>[?Uy»F3mk.KԜKf Z]R qoU2~BOJ-z)PRXHޥB5~9&fڲ]>1sbX>cfo Hd|;ֽbnJAt&F1$Oh7}lȒ355MNx-"!mrFq dldnfc`o=4LQ$hbwD[g$?EƘ=RbܪGѩvqf[e1Ol]6_JxWQ>^fOhD[xҿ>37HMλLxץ' knb f~jw/cI& n]v: Ș1V蕨iY Ϸr~kw)=n[DVL hׂڄש ڿK7cļ|t#e#J3|H'^>){"5\i]=]}² 5 Btd jG]p)M.Pp0øؠk]\eW2[?Frq JZu#0Ѧ'/D.; Yм+n QfQ&<}%iFnwF ]]5Z<ԩ(@ĨA 5G='bժ58l{4%'"Uk6ZP@R^x*Ą fiF 6V]gph} ُl(/L>u)\wET2 R"p?&Ib(9_UeIutj&&A-( 9y ʬr ޵G G;/۷[qԬͭ\嵜OjG1o=h֑1,k$0󮌇ުXo}bOĸ_VkQqt{k][B UO_{໑A@*\[VbvdH/M KwwKhÌ.Y-h_-Jj\M AnަV^n1Ys[nX HHd[+Gӑb)yԦҬM}rޕ,רO4&&(DؑAD3w.I˻[9  u{Wa.`ph-&L6X^kN2wi5&%M3ABo?a@tBr-#T uLλRB6ꞒE5U+1ļ4WlT)6av{J08IxלGrWլ̎#tyٰ߯t6Y 1k-b¥-+]#wfx޺ ;REZq0^ =-:,,k2a)]6PB| KyW9[]m֣V £'/ Sý94m+o*;yhˉI_絓 rUwz?qeT%y6È$/70e,4I ?]~P/Wlvh癋 V3y0ǻR@0/lt70^w}K6P`n/v\wቆ,8CG&#iZU \ J0Z%( RfU!_i3/WNR`7q4? o}w0--" o,sLJxW֌ڜ/[VLa^yW((* yU_@j|FL[9ɪj-gx{O+ོ+<򇚷$\">mi+c$woe?W7mEYYczd)ڟ ]YIciu7Zm}zL[ͫs|՟lICKd  x+\5[o Ԃ.*I%dKޕEx*N1(P@Ŷ;tž^4-퓤Xj=ZqEcoE?òM{t!V%!{~~]is8ۥNZ!'Y95 U8<sMTÁ1%+Hs89Q"„ w]1;WP7 }p% ] ]6"ҏ^ptBz72oc?#HonC@W[2]\LOxh9m2޾7j)]9-+w? wW`LрrN]7y3piY\#m6x1f ;MޱF;]BI]M*aJŒ˹; $m2v֞!BOF{qߌwPlFϤP\͢t^i_#MFeE&rNKnmoVɦ |C{E8M\bVj[u*YӉhh*ОK/*sC%-.;:F n pX +}MP0@c'hW S;oT?»wEli=Er:l|˝qq")k2Ե^1G  ؼk<)?Y$ƞw^v?JKD8[i`*_cKA0 MZ(i.J|rQJx[qϟ^[喨]d@>!2hY6a ]*]b͐0651+УujZp#Ʀkn }z}#X?X%{>BK8' h&eeE6Q.1+JB\byI;[X4#UC%$*D*c%pXC㾆ԇH-ﺭ0HC3V,`ٶs`Ci4 gXK uuw{9vp[iƄ??-݇{%;>4,eEͤyWxQc {@:DǑz (wtі̙W*yK 0dl_n1Tm뢊䆽m$_42e+Ьf8MxW?&昔u.4064$8 Ay[|lS%6Z5xrݸR@ sfi؄w w_^:^jNM?4iej ]XQwlTCux\ۤT4I,=51tSj E`{n0.G[e49qȁH?V_"}t,KDGDB5%+d" z6f7}= yneHaCwx(Sz{0t\Đ w][q h* ;qqS-]x^,v?Q<{N ƙk1c/Ps`$Ҭ»FE,%giC=zAK¸Č毆YuÚk'AJ]&f!NP< jwin»wEs,p pSHhu:x#aue M騷 ؼ+%2n.1Zu] 2^wcª<ؔ-21wҩ ^sK8-޵τU+8Nq}! 5Zh0=HjIbֲrnPJ6Nwq%.減͘S]s[DE{Us#=m=&* @JxWH@tqLp.tE }[(죠V,h˶Ӓ};b +u<5/ϔN\4*`]ࡕz賑UniMcSxяe:]o{gEq?%$טŬ$jVD^75p/ 6 °30,(IQtoT|pjSU]z)eSlTx~ĪʹYI4%EWjsikK)x]~>D6ZQ=MuW5%Zʢ~~b9iQ<L7ȵ:M/\Fݵvg-g}jv8m $nϞ3?rEu>+jFDxŰ˹DIʵtYk}թ:,W˾Gby\MIkSM~L߭ړ,|읞 ^@ze+Z?}hȋ]U9KQoFFoKݩv+[%ܢ击^փܘ I6]SRvW7eHG.vRc  .u.TAtFgFZ *k#:r"|WF0r_Tv*)Eެԑa)Ub27VzQw"KCG٧idfqmr{ C%YGI^Uά*JwU߭Z^OC"wܠY^ZtGY<C-`wisS#({8}n&c8y8񑔒o(qk_O]uQ2Oٌi@P@5^" A1PQO`|M]='~l>|ΫB:_sӮ|_}ڳJ]?\hwV eAp!:Z!*^|EJTK(nU5Aw 3:{x*o*_Dێo/]-n40U'l+MwU~f`zŠ GN]t_rRwЇ_?S?5[)(T5}|6N[ tbVM&DaXpeTaxvpa+SOUܪJ"rE h->ZH) k܆TQ2Θ yi+RWؕZh{`ZLe?Z3%A6#U J.ح˫N#WM_]+GwKG,P/ /o=ثNhX<}e5^-i]Q>uOxU~➫e:׾i8Q@S?'SԈ&?>l*f^~of/e? ]돞UsxD:w)wⶃg^c?MZΞ ]tvP{ EDhu7ev=dPsg@8cs9gyGu;A)Ӹ; RX M _2UE;t׸ +MwUqr~7M[5ωڰ|,%W[K~*%]/}UԼtWeXg xٌa.(h۞zz+k鮪M^p[ zks>/0k؊[M] Waoڥ*cx]}@tnwZ$ÓG#ߣLpz{(C>UabKvh"WQ4[_4,*Pwe&g)}\ԥMeH67 zEkpbrx 0qВ̳傀$kY4 Ʉ4 Uo˃|*IIv[NRg/LI9%գ-.l;q}u׽mi ehi@N,[ZjG{g% nGs?˒b.e۷L,#Ky |W=vpCF6r{vr{ƷuWOc;rF'?8i2MgY{$Lo?cT\Awщwa98y2%%i ѥum%MU3+z0Tz}M/UzcݼnoYU*Z t:|7kXu9EC|3'y2_gŝۚ=GrxYҢ_>aSc}smi 7oIK !]Oo.ū_ő6mo$zȹktyW.ͻ-%*sUZy~6H6ĉ禌QQ(Tl:d k+g jW <`ΉeUs7+,[ eyJ&N ȶ8cסكxs|vSn Xo\K6hR%͟5 ]ɾ̾c5ynP5>:y#Ufq(\Lsc.ߌtrA9hMP+F_ *DweFI]R&+U*:SE3|krل$}䚭^7Un9tCc ǝ''`z/ɁI7[ɗn?%dʶUm*#?d~ ojG梻*Z+m̑eF`bh[p_q,U Y6k~PqUd#Oc0kI]k}Y\Xӌ(K!ǓI =t_?JE+Y,tJŔBpTw|X|^XIՊ0ʛ >{x=FwK/e*)Vco/d"}O3f[&7݇hߨIeZsb42*/k,uWUw}F:(*}+^ZP49{(U9ab˷72ýQp(S;7wDZ]y/?vFwKbuWDFcMv,Cd^p@B{gk\N' Cvf%+nz(f̷}v{ǘ>n*˙π]S(e@ D be2:R3%lwr[a{ZU6?}^H6Vg`oTXn+dl&,nGw (o^Gʡ[+y]cu ?R/G`3 lZ 44e{NRz  ] |d%~ GcfZw44zV%V"ƔOwR_3H@旱(7v0ܮ4 U4[Augiiaea j~i*lݎ#v=͉ {?]ԨJ^4IC>SφLUmOzk ͧe2uy` &FLZZ +iR|~ui/Z0')/:]mqЂSS'kشY0zcTV wr9`*v#)-ɃZ=FtnNlzEFJb-퀾>yNa803vT Mj0 c/\R'ˌ&(=glYL%[Dn>hcl*+Ww>gKV03xUp_#VbIYuܘJQT"i،BrncbW#g.RD_!V)PZ/GzN1]=I\4͖胉Jq:g}R~zZ+:#ɳ/I=|2qH3W,YqoP˹ 䐜с}^(f|f{dƾ'A8y%|q6abҌwX߷zM^X]e*A{5x0_) >+#r^ɜVlfPP#WL_-NcYL.[i)s[2|Uyъd| >Q+b)on8w33P^XW<=%TlO=%Wڙ@qV PB v_)/>~v)y\{LN_m *;5$~o2$Q׷:)FGk%t=Y{ϓL%%cH*!%Qr5Xc贺/Ѽ{O݉;W{π* k~4a7ntن V$ EQ; *WO+yѵ[ Zx{:tKuǗ9 Zʉ$ 2" #X~5q)_SսS_ΐkCC"hmPhi=}k,Є6R;u;,]TڣAċ{reO#9Qshϯ`X6_&_4i&kY0u'%7W"sv)}Hkٜz|ƽGM^%%_gŵXE:=lwO% 5`:%^ Ku52~@AA-!Y Iuk.b~}4kC]:M)Sp ~b6EvPsq];C-wj9@/Bezܣ%'^;qڋPŚ,E6VIFէulvNaA5-vy=V=unl/; Z97[˞͖=,iA'hO}ٴPam  xW6yn"wUN'Vifcl:t\aw ' < ȒSS]mpw27ݱmygnXhΖxyR%9WCfѵDr+1gjdB/Og"4V|kd4km^^ PО 4K Z/P뒳[𓬼x.#͒MB4Pӝ.ҘΘ7DI3@O_:th?- C)ՂiE/= +b_Q#Ъ,Xl(ˠ!YB@~Jڋj}ˤ.^7v=uEe5zY%I@_$EQF-غ2qn2{5,S$GHI }+H҄yDԕA7^])Zgn$In _C~#%M]:=MoЬ5;4ǔ_VD!ZuI(Ivpڰy[4,ήj.X>5JʖRp$DNUҽDO R)b-0֞bUu9GUm=#ʢ&rO]due $CZ:WK#l0e:7&֪^[hF;4BIPg%sI+v6(\L֌:7v:@'|PfXYhOlpmjaWEhDW6rq_g3"@V#Оd觓kº;ҎWG^ȳr W2un @ @ q2O1.Af|4}5q`J_r @ @ @ O&UziË0vdGyj+ @ @ dw"c8iu,~f`0Z'Wv_׫x1 @ @ @N _ى;xęlՕV?N1 @ @ N`惮`1@ @ @Hu2&k(  @ @}]˨f/U9D$ @ @b1rIg"> gbf@ @ @~DьzvuŇx @ @ %p?}Fh,Eu{B~@ @ @n :q_#u,]mA @ @HFKw==g֟HV| @ @ Whʨnբ_fJ!@ @ "CYl#@<=ڷo *,@ @ @ȍk_MZ7UxgSϭ$@ @ @ Sk5z^97a-7Ztoaҭr(9 @ @ 8p},osj#|bi뷵#Xs-&C @ @(/cgv> stream x콇uN!%Rޞ}>\K(RC?޴v廼ISH @&[}̮ =ER]]݃7n܈O@X?_'r:)NN5,ߩJm}_'Ph˂Tmul'kRʝ˜d**ƂrW ػ.MŮ$I|{)xw{W XKWy0%oGa^@v!v!yw۾r'܏;antU?,cFV~O(UkHβ|Fw\7Vkk׍w,w-5薵ݶ6nw;{݁ͻ]x+tr7>I SmDžXc@ي1uAލ½fnaie*m,e,eȿy}2Eò1qCxʒckճwI|{@Aσo\޼u~*!1zm1'Xw{=o2YJv];m-[kmKCʻnr]dEt?G?x]̵w\-{]kmSw>!zz<7oUPFo2v:~5qߚoK>%߳:G#W;x##wU|UOTqVn+*j툲d7&nm?և>VUi+y|)uwͅȚ{I蛗"`su➅pSSG#g1QKW;ԍkn˓淼mWp}-S_副W}>Vzky!w㮫qqqvQ}ih #LU=bP48ȵqgN,tQyo>7~L؋ Nm?ȏ2oǹyE`K~i" T;IH yw޲9HS~l*;^O"g0R;ԎPAW/1^W/㵫AWf|1 U+x2^L4 "2\I,%S"H8N Ga,!$qi7.;[1ITyff<+AS;ׅ{{cO$6! gqqB uo' Y\%dkS SnN7ʒeޯ cYuA> SqdÐb )v}ReL5/E?OCYunT(>LIRATvD+>OO+DyMIQ~iHh7 P(ݶ}5;A3AŨwؘ`ODI2^ث$yF(͘!‹dY+cm9^hB"ģksGy"| PWeqmxC".P"#ggi}3L0{{NrFV3qsoA~{=7{V=b,yh&)L7 }xxxB4y -w婴UU۾U"B,) /y1M[iտsyMCf(+-Seʉ(Šy"'gl4zavp>ˎw/3=+/fnkW^QTAb ,v;E1(!`t;K Ue OU09[ruy\#$s qJNwβ݋b mrV]Gt]= 4!X`A'~*|W4C^+Qsu⻩&^rȋ#SEn ]?]qT*=Koա22V:/pj\]XZ57v85h4p3݃ cYn> P9H/{Qs ,Cg.+=kg(()ZWWnQB\?B0! S-]tk~E]kA}z%YՍduJF  1NhD~]kt.yZ]j]gUqT{ZVXkCKmt]jSSmfͯj򲪞WՓ2VMA,w4Sr\?0;L(r#yUq`, Ux8jU=Ok^QFIqiqYi9q `b{P6_!Z̵0֖zUW/jIeyXZEbCUqvjs^?4'9ًwSdzx\:FYwc}0;41a'$ݞdIV4 ҸuX%]MYB o, AIڄ{^^NguрFN^By2GH/^/*~FWcl썱16f07ƺJ7˺zZ]^66IJUQd"e01| P30*Le51v3#/31C?; 74GQah4-24Gy uq:*Ѩ7'7Vd5zBȐ1b|i@R1=/0.fll,QMT n%"./s`FZLwR__IL 1e0'RGcdм4; 7 5aJ6֚$Wd<ߙ:"ԝiLpv'UN ѯ]θ;@ѯqL,OXKC( 20M0 r>}32Cxd&vjg6vae"UȨzVCR˚pz7&)W伡j˳ ?ɍ΋Xk3K\ͼM4MB$Obi=MI,.eAY(+sBUUfP7)2%MMeJԣZ߰w'LCYnvbLTG%He M)$CQ}=L\-mʩA̪&VK#;9̰)VϦ vpAļ!^T_,\x _shΠPsQakyZ^lNe,޲҇ޢ5 Ҝ6~e{3pJ)Kkp7u @uEY=ʷG(&8Iyu1x5vrbNQPT- WČR(WP(R.عՌi~eL̍ \zx/"/<#YL%yRpjjijVK6Xj `͹ΉEz ͚YO!ֺ`yI](qCT[ #Ʋ ;![8 Gsiojm+ӮN[ 1]үDw͍ 7c]2?)37Ija(êNNu5 2ZFZ i"Y2ԪDjmևPm Uf%hhhZhA4Gsa8u `n{tM`|texR.#mԆiq$z: 7pS77w5x#^S,M:T鴵dֹܽnWJ$* 8Ei7k?ɫA4E5Râ2^&e1yleը#1֘ƎUM*~n$UalZFk OD4uoF81ܝP#q"&cqŘ99x. v&:c5L. =_W_5;,Th@%mTyDm-m-֢m5& YMjZV3%;jc>hD&Zsk M8R Q^{rC˛"nUH'[ʑ WZIE)ʑ &s=ba76琇_x%;Ac fX,/3WA! =Ski4apy.hΖ5o[KZPBd-.j鮖U|_+4DOd7՚SiTZk-qגfJSMj7 ohٞpY|eZS^#b"VUuWS'̛6ŤXoskb+,<-@u&v3L3\Ώ[ۚMPꫀR]m#vpGthGuDGMt ܌zZpDMTkL5vq39&̵Z`UeJ\ucU=Z;el0 #zLGf?qJ@(s?xTcj Xe^%M]{ItKBο4sKJZ@BiiiiپhTʹ\c dĥֆTMDRHQ5Jlp2u4)e zn/S4hљxkt..b̋WQǰœnᩏ'QZnc,RG #U}uFh2Zlk/ژ/HXUoW+ZZEZ|%ZZenaGĹ X嗚Z**iiuՕi=Uk+tB Go"k:奄p}3b|I^k3XjRE3j F 3`U:uj* 32$BDu$J/M ^8RBvHGQ+,gkROk4p1ӂ}-<"-6C-IjjVi5ܕsaۥ +jZ\`U5M`|n@_jPML5.jT@ zRMdFi: K\/AJ~wh,, ^[eLccij,;%]#u퉷o<pC-<Ԣ ;c-9R#-=2#-GUkVhuXft\~Pt4M+r4(S}hPQ; :ߕ _Zڈk XʵqQ"KXKI&noN ?"Ɍ-y1;$XuZ AuCef44wꪁGfJ쪀ihhkʼnV5\vq߀ ³:ٍOo2kMm@ѯ:by{_&ΔH]h( boZ$J_t +XXϥf(zLђS-5S-3rS-MT+MTȘ[kp.L"&. :&(ntM{6/Ny@#N)F_|u K4^syk4o,ϋIEGaTV3b $ O5{IN/Ӌ s%k.#X!#;vqS'7SPGoT_8bmd*T[r%,8Լ,uC563-9R3-=Ӳ3-730J3<*36ٲ  |:]_gᗺnAqAxS1BLģ9$ #z^ݢ-hh&JO7{)NI wZAǑ⯓vAdZjglwl 5@`)]%騗doO T[3s|(aEM -=ײ - @UkVk-e\Ukslj\Upްހoxca]T]k1/ dR  |̉&=XMzD6k@yd+ z]UHr{'%,5/&s*&kVWChL)UpY/+a9вK-KJTVYhU]ҩВfkz|3,o {,.? X7^^x\_5&Dmja1]ZLҰE'taᦂ(M("V*Bފr@ "nZZX*}so bD+fuo/14VP1H_'0zZaFY`%dUjEU+ZY*VURjJ0#B =N'jOuC/Ɔ*P#JouV檎p7|e QX:J@D4":9)_ ΠHϴcVƇ8:bw{xgYp,[+pLPk-/b/5Iy#ȀP~~HYM@FjBvBz(֩mu:knێTm.ɥoX_„/1x{#J?_L$4V~tl#ͷB/'CS=N4XMHPMuUglny;$lSsetYƸhEbiY9vL47$O_^Y["- *tLetКQ40wnOK(<9fD;IQ0>v1!n]yߏs>(ߴ/r֟u!z_yLfIt4ׇ`h o̕hO@q)J{PibR ! >^A9ɦ;q!aP&-װ%Rs-ceb0ps3 c!N&8骶bS 窧.5ȡ0EZxV-m**=zOB߸XOW&%z!˚Ɨmf"Uk8\ i-4Q]դa[]8?ÉYN5qfŴ [ݴKqjQ mOY[nT:0ޘ B/,B]R9^[UΚ-09gY4FQi.CS! w3p"S{4b , K9hNTu8LO ބS&lwtF yXv*v˂ P[LSٖOqqe58Þo-Ss$8Sy|"5'k*Kv3)`XTS%c/Y$W8&OS;PQBϴ3RH=gTT$p|9U=,fի_*Zn |~HtBMnI`[}I13Gܘ7`1##@W`i{PUѠVMQ7k:\q?|QSeٲ?[b4_fϗ`PI ׿~ŷ;z>\a;%pɢ;ÿU|e z8 p ڿBKAptݭ "g<+>B<$Woq|2,VdfFTc֙8%{hOي؈TH r?]c_ +u0(Eq`Ȭ-^GY%5%XtQ&3eLAܳ bXB+M}t:Se< >E JGLKsέp[rE l  ZM$+.bzRUb՛).LJXOV,9 r@}d/3혼,/O!:|L#>_Κ$?XF*]AA޵at `ـ H[`I1}z#+mW&=3!cw4( z!wry 1]c+@ SbXݳzv1Ȓ a EO#3yuDrcͷڒuc"'T["^W)br84 ,I-WcoLc 67 I!TZ3Als8RÏSțR1p!<7Xz2gb=D7S2n^DMh@q W竃&GӛW0z^C.H<"_֛d1"#/ɬd<|WtUu>K1L|C0D8HcLMJ-Z e_hfѬ%w$^-5U|\ђNB$ |hr\!*^BOv f:ˌ{_ag J(N6򥁺;"o{9Պ/ͬz]]l<[#|U{2*AfȰ*a.ւ$Ŏ V!,g!HY7S)\rER^b*1k_'(*ƓɏdҗuEVYBYbX_,1`8 \XGL򅅱%D|/Em YnuR;SFShBCh; Wd,M%9}|Ip^Wz|^3_—m5S.Yae0m$ʍx-#EL|jB-P1Ub%U8 'm ~aCWSE2k=MS*;c2  ^-|_h!][ՓU ϺmW + )Yo4돉zhJt/lr5_vW|XJ@Y;[oxU^IUe1odK,V}İ73%-UYQѬ*&sL[b9WUPmvK Tt $=EĩzhϋuL L!?T]}HRMPò VLW%|0 ҘLmKiKfe|·_fWzS—$+`ϭfLm[ ˛c!mA?O|@H-+^a04>80]t ,в&Qj\GW_T ڳhg!X/kثKR蕅Iqnri:La $V|ļ$,?7fE挟`D,Lp|vK(k`K_ 0/ۈILpݙjaKA/ [A)b24^[G=ALo3y'oLV!zeii,9ATIGuҰK&G,I'πKhj%Y+/ ļĘaİ) ļ:\dJdyHwn,ofBab;؃O}O̞&ϖշ2L?G + ȩyψKLJ8.-%֚x2}!V4Oƅ~zW^aaVY0B49Ɗgݼha: QX-#JS5Ό@_0/n+>|K&~\obNJ^8w7ùXٔ)3D2(Gc؎=}ht߿߻=4Z{IdqNIZODNәz2W8PǡάjX6bQ[`H?vCN7S*DKBB_rXA̍(ߑ*lg$J2Idވ*ף\k=)[E=YҪKWY\7_}ګsbFp̌7V^%9fdpiL &h<:mIXvZO}.wOLwwϮ,@ʐ(2KaS\4<,Е5RYiša8G:iLǓP`|F9|C /oaJw Ͽ<|u7@zW'+I?8 fej]!Z՜I&Gg=²͜2g}͗|Vf$27X7[ufSۖԉo=:BVcCW{'[w/SwL`W.=a/8, Eܛu9vQ)i`p?|)!t#/ZǍmtG1y[|nv1.l6I!z5%[|BftOY0e~_Ն-r%NIG։6|eMٙԬhLi/y^dȬ`^=s-1B#@s*&Y (R) 5\${ /N .o]^,O MV/nٺȒ}LUĬ<)csaG4P6pV/V u#<: P&8~w|q0<;%3zL1QTQiaGKk e},y.M2-EVId! |WK3Y% [Dfjudʼ,̋A)Uf^j^4PisK8raOI'1ps]]Z__<=3lhG['%(tyS ʁrӏ !*ʄG6NHbIֻakudJ|w#NGUrqw__|W煮-<֫-Lh {#ݢ4._XK{.^$7k+ 5|XS͋3j GEeՌ@p+ndԠf1\Wdܱ.)#egWON {Wwn~kwB =u_ ~4*u'8 4Hf0ÅZP/L/ιz_@ E ْ/XgPAz6)D.g}.ݶ(yC"g\O蚂w@͋LjVH[2IҚƺ MyDf:-bʗbDz09̃H($% ڱ^ΧFѾo?O 띓w=vB*Fe֞ \ '7|gDustJR, uSՁGkQT(Q␫M|Ɓ8YjwLѵỎԘ̂KL(?#ͤۊUƆ 3Y-a^2Ŝ. Լ*$œv30o KVZ23tMxbG*V2ch ό6 ?B%/<#"n 1hESH29L~8I*BZ+Ҋ/2"[vQLѣ:MTX_.WUut)o=Z/7)@ThKsÿh nJS" jAg-ѴURA.!r 10 Smc vWgVãf%w c>JN⡡7WGԽ=Pju43wJ́y؍993xE4ɥɑƐ \S JDʈSFBoLF`#C' z[fY~%zj]GcU,bfWT韤s:&* Ѳ^ Efs9[P[g ԅ?q "bޭkS{Lօb?\??|?<~f?GstRq4/v3ZƦ6Ɓ֊:@J,LqPwd`6ˬX7*WEp̝%2'q4yI< @xw-zp>W߳ZX,]fm22n5^2Ƚ|x o.q}_3+|my]|t ݹ1[^^Y }Edqݿv3;w;=jS&~p3ZvE?j!ǤF3C \gKHJT]`'&'bAy꒧ibk,, %+[GmgJOb`]_- UV1_2~trx+w;_نŝM/lE/}i_Z{_<;6߆>~W|&ޗWWOOkg_;#?Bg_?9 #O䟏Nqtͣzvɲ{MҪ+~a ^w{rgv{KSAx"OGMzȱq&yq,c=]~jn7Du[ʭZ]ܮ@*n*wjn\U+J^BU[-w;ҝbVx+_x';}+y#|5a$P{wqus _ĭZ>L3A#Qـ~g}WAA˿r_5r]'.?8d?z }r/`2}2ol8/WG27ٗL_1b꫆˯_]~p]+WWo w-, ^?zvFzPTwʳ'6`a+pvo,{IvUEUͪjX./TLUUUŖ:{7ޛoOǝ7W˝7o___ar#Z\O2?J mtSO+EM5^{a.7x񻁋 w'p} 'x۶}߾ow?aiOjw!]m}֧/߿?c?9??gOtOwt>?Ϗk'ߺ1~*lTRS˗/?;{%']'tqd?|%+tS{ЧM{o?4q {П\ޟ]g.v?{ٳ]˓ϝl_n}p|kG8;~g'^6o#߻6__lfgjWBT$FD夁6x^.m,@lT\UOTP]rh>z0ܝno7W{{r[꿈oJlF>[|3y?͹`da|?jO  p)_D8|?O_ ݄GFJV{ ~=sO?w:g[?x_?}ӣeezpd^,O<_1?@*c+VklӅcUۖhnNAUqww"}]! q! !Hp)kݷv:8﫿f 9a59c}Oc>Q'pO)x}ǟk>X۲?|3^諒z~쳻7O?rExֲ֒-Ey[D61C{}$tui}_3^54l]2\K7vNv湿8o  p[Z|\FFǎS^]M=q)]%CCŃS]#]={O~ Msw'wN qǏxvp} ӧO>}l/d%?* # ڍ}W\!ּ9  2ĿK: .k:d| p`pN: ./󚌶",Z Z $fk p{m{`u'=Ow4v6w6w7 g MM L&ZZ~_P~`rsoѫw0ǏspaOdزk~o~~]y뽨gwyx:u\rwy{]G6֛ V%ƴikSW'My %]7^34jtqA#2 }vtNwN8o;'ڍۑv,LGZ pZ-׶ɶѮޡινΧl{_{䁮ដɉցz x-4">|vS~aG/dxwgS?Wyr죍ӻ׀+^=_vvE@|rUP;Kvxւy7f7ͯæ̮M^5&k2d,5 aïmڻ'Io^ƽzr'v䳭wBzy-sg\?su{﮹n]s޺K[ܶV]VNYv|rs֢-sglM[_2iyeژQʐҠB|\Lttll|bbb@homnw7xw7ji4)6($fg8de{UE7ĶF7ߜ궖W؃lʆKevvw˟=zw?OU?)UogyW_&>~̳ OF> t;to3ݿK˗}Aaںygҩ.7Nޘwޘs>x i+М/Cp8fyqrurebybibq||||||N1XhHP`@MmomO]w]W}g}G][Us]KGGwgksyUAIMLI3JsL>ꕟ\U|2*6nM/,.hXVzw'J_=e7 T}óWO^=N(n Owl<޺w'rv7Bo\ wog.sen7\o,Xp>|}+S'&lm.a!A˅~˹~^ ` 'k7El>dh`h`YwYwZXU[TY4W75ԕYՖ֖XVed%%h'DkńDEGۤ&sʊVՔ7fO-|m600j0888>>>99]Y{>)+[w/{+|0GvwM~N͘mD޽u-ΕAk7/X=rҙk >WyϺ_q]v4uq11Qa!ۅA~^^nnN["67ԛuՙvԘWUVT44nrRSqcQCQ]Q]AM~UnenynY~iQiaInAn^Q~aNNzVrflzdzHfxntQBIriJYjyZszZPznPjnU[ׯ*e`cg34&89+;si%k}-܍976oldn\ϸ~5ՔkIW/'\~1f}rԥ a+sK3S~s㾳gfFNOyO zN{vwryia~՞,6Y4Zu7Xt[tՙw֒1i&UZ+  J k j uu+ss4˳5˲5J4ʳ˲4ʲ4KJ˲I&ƥ9E:i:iz)I:Y @6>J=:L-,P-_3$P嬷* 8  cށʺ{zY9abg=JHALI7Z!iٓ~IYa5a}c#SSSc!#AÁF} u{wzv@lrhphokm;nnBXaPnPfV_8I+6-2.ԯ.ԫ.Щ^d@ VZijIJqrqrQRaRabAb~b,I!7I!'Q1;A!;_sRH馅&i)Zi14)Z+fBFlP Ր @?CJvÔQ=BE}(wG}Ou(4jQA_edSV55$)js 2aaſ>$n|.5)խģʳ֫ޫѳɣ٣ٽŭTg$ɹޮQH"5U7V56H z"Z@[Ev< x_Fy:ʲT T%%i٢Tĩʅ)Jdd$J^J^jnZnfnN^nnn,I';A;3^+=N#-F=9Z=)Z#1J=.B-&LBfdVXfvpcG8- #(/%@MAIM拮EYYY1qk{h#SRlGQP12DĤ%dEdDTKiJʑL--孭ll]\\O)*{+{x(y SppyxK{v']Clj.yC0wӿq\{Ny<\DN9r9 d/h'h+h#`-bo%bg 124YHF|C2QT`d`cbbe=!97;APP@AI'556)9NFAoegg?.&!!~BJRFZJNVZ^NVAANIIAEEQUUY]MUSC]KSC[[SG[KOO@_@PHdlhB24%LL M uu uյt4U4UTeT唤d$ĥd$EK I rp sp s qr201s32q20q3ha4t0jZV*ߌOMBC3 {{0Kk*| E%eyX88?00q/hll:23ˊ##ͭme98)(({...>^^!A11Q)I EUU M-=}#c⼝)WWwOgϞ;w|࠰ȨؘԔ쬌‚򲢪ʲJܫHd1@/ӧ=O;ZXۚ[ u 4tTԵUeO*KˋIɈK IH |B<܂F\0~pK6nVqr,v;-ѣG;&$$dggU\Xdhb&!-+߀ ?q!^>N^./h ,,&f!9YEA!!R'dX9- /*",)!.#}BA^^EEESSSOOؘdaaago夻ϙ3GDE"%$'''fg䖕UWUW4Vjk+*J 򳲲cc""{9flbfehH250WQTQUT9!$K xExxx8y88X9Y8XXad6-/ -񵷷pBfFFnvv n/ 7/?';KRR◲9ww7.NN[;Ȩȼl&fR خ(fff^^^AAA8/bɓgΜ  '#ڧ$deedgf}izzZrJJ|BBtLLDTTHXX@PY_8){G'k[;3K+ Y2b'DK prrrssr"paw03111+_lLtԸX7:::33o78,NVQ_ Ł+&+lcc ؝!)*+D3O)?JKK9{699 q21)KK[GPPW+2ʚz$ӧBCBOAZYYYUU]CڃWU~RnY~ ? mȀ'@TߏXt``mc@"`ⓒ:!..!&&&,,, Ǝ+" %<W tP*ÿS4 4,t, T/e" 1." JdcRVRR*",{wǝrsWu=v_1Q1)I$_lh``ffH$7((T*999##1VT74666Y}}=ம(-+#J@ <燍 >u *9AA~ j F$Wo_\:ZZqTȯRwbbA 4tD8yր//Dl}UP⢢ˇK"+{u y9yCmmgc[WWyAB:rrυWVUUֶv|Z0q܄D~E +#sBRRqQQ, |98|KTd%KKOƗ,QQSS\zjc(Q.RQ"UFG_apH/m=q)v.|x8xRI&&a 79(~Chhh]/H#AK$_u=}}S0+gt<=q?##RSpY C^䅗NggW{GG[k+~ (}jp3/>w;@OO[KSCMMYQI^VNFꄤq0B̫/b`D8\2TԴTT02THTTlllaaa^PÄD3gQqp[|ؙEEBDѰD6A1CN^) 5%%P&/?h4/H9rQ a!/wugg'~(#b#O#\bjqqqP` bowwvv֖f&&F 4ii)h!aA~_:Z1Z1023G12aɞKMCIE THSDr u,C2:}T\Jba'h),|.8/ ` +kiivvx.".!/^TTUl@yHθX*8/|1ghppttdbbbzjjvfb,^L{c?kkO Gů%bu|| aa9_oow7W"[X Jkkiʞ"h!3<<(z×PZ*MDcTSʣGC׿oN ) [[[;0((`KC#YH@"T1;7lyy*/jUS3sII)V66CKOO '[@ QQQ_,!b ;\VTV- dUU]UQ̤Qge&%&DEts;dgenbjle[GK]]UIYQYJ%.R&Y (.<$UgF&_h L̴t ̬BBA HL ݰqAfp 9n>/AEݻh@T ؊g}PNrdaaTXjz}CPqZ>A-/U V TW   utdwgv4$7&6UTT](*-(. +(  OKKM; KIONOJOL HJONKN9ꛘ⛘원t>1545Bfv\VN|N^Bn>FgFA*n]\X]z 6'|1=#C@PHIY/H ]td!?q#>08LNb&_P&ajZ*tBhP ED !2#B͡X8rە{6tĭ{Ol=y<|'o&{no|Fu/az=yl{2xhЃGCwvݼsN׵ͮ+7/o]_:xq}hem`i{fidocbfM|ٿk={1 %4<ց,a 9h}Vii02);z::|]𥢦0G77O޺?r}{@ùݹ-콚fٻ?>iŏ/~zw/ގ?;#O^<~5УC=}: NvWn_htuyybjJRB\thEgoi{OCջ'*+//!! Ro$J_૭|{2U(~9Bq qC,n \h$>޳(Og}w,w,CI.u,Qx`[}Wlj;:{Z;Z 65TWфXw )Q$E'55ŎA&4|KJQ]9w$ǥ9$=uIQ1uPj[A:*?!nAGEE ΋wZJfF:VfVFff&Ldc`fK;4ZL Dɯ1gJ*y/06-( !.R'<-M]m-5euU sS\OFe6w LN/,uOL/d: OMMJ 8} J9߳hnqgw@ Y`C~ 㜯  |L"_ [$t!iYN> 1994IΞMHCo9#cc?g,վ035d@pK-iUUCKK7nx1tɩq$n ]v] ega275AimiA UWWhW<%IOO#EHp9M$t@Mgss fׇ^}"hni%-'$,6&:Wo}xcDΟDNcBDD(~.55^H_ õ#Zy9ySR` Vv6']<<1Xiai>(<:&)-#'/z@nA! iEhB{  8HP(H_Tt\ SR 4Wz S2^l:#.{xbS@H=lڐa+22#cwqpv12175w7Є##+Dfh9v;^@*  SX J<(=_B²Zo|EXbbJbDKB |!O!b*@S 3MF$C Q I#^dhlB253657"iôutП004177 /y=C#]}Ckkh"UUo0 %_BZSw'`|B켂<̜|L0^ߍCEJFEݷh߾:t9JpcG(h#:|_&:t Тьy# eeg#KX4:>_1O7q50K6$::`455%O@HA&|||PsAߏ AeJh&C|m-v*+/h$ n=jlI +lCcmlm] bi+))Hu`bBb"|B<|x C 3̠uMN dX Vx/ zkŢyHrh!Š%I`(vܜ OWb>] JOG٥%@L4Xh+zDJO'~qn..UCC@:GhvAMlf&Jc""coDǙqqqB[}1ϩJ솄Ǒxy17 GfǎC ÇAa(̈́CDYAm(<1_oFY:Y\bܘbW!n^^ 3y"/ᾠe?Bcrrh]rxPP bp 1 fa nOMEvb,+`; "ڛ xBWa0 ű 0v+Lâ/rttD {Qo #0ƍ/''%Av۷/ѯF_BxyB‚DLQbҋ qϼ; |RKNNDmlee898?R ! {(ƭPT"n޼~.]BN[K{e  ;@EY( i2C 60rCEGC|1GW7( sާOR<|(!aq3|fSSSEfBC5 SSB`cEKE@Oy숙ɕx+@WaQ/US1OE*<1郤\VV BИ$&!|9P"qKX 30i(N!LԔǜ580fohh |1ˇ 99**> CC>0zT^Q!$,S3Ҝ<ԩI ٪EED0!l/!nF1 q*"4)t/ȈVWV1ֈ:<2 9M $;_h ܀&蚱1 1$,3 K)Y_`tg6tq7Pq|P 3fϘ驩(ʾvS3B C)Ą$9> ?n&p'bQ5R0jPp hܼtS 4Ύosax xE{WWh2`(/&5`eacl4 E./@k@7|Z 'aJXH>n?:]WT>(M.NCM݅8[0| n@ t8]Esx_'F/\1*y(<\ثa*5O0v3Sp*YQYO@K˅!Z-/}NWXH ' &q` /a:ZJvN#VuUn>B(NKCM k{{ 2???9[TX[nAQ~Aa_ȃ<4ZjJw}6ES n R𥥢db_Wy(t=2.J`sH^""0Ψ\/"*^GjZ(9@Vyi^dtEqV_1jA'pvQ2SRP_x扌,y flZ4p_** >^P|᳌LM #C+3`fgν0N!2_LnBs'◊ &r04;4>6~+UЖq3EGD4 7qkok:</E :atEA*'_<0?b X({ !_ GaЬiр@%2Mی _>/9yyB!aexE & <* b3߀~X|b4pl#^Q/@! ByFW'3`1 !ā&H}]ZHsx1两$h1|x3}*1r |OTL0̆"`|8n +Lqsr3Od?$b5(dd0)Џ̉)btY ٝ?hjn& xjE}6p!JDDg%%TH=|cn3L `h)C/`zM Q◣ %zed1q&Cl,Ա"?a3$5@c/k͍/J$7`B;t Qa"2e &$faf$eEVtswǻNMഏ7O AGz?߻;\iiiHh$AuptTL̓D |8mD OlűϿ߁\T endstream endobj 29 0 obj 34315 endobj 32 0 obj << /Length 33 0 R /Type /XObject /Subtype /Image /Width 160 /Height 160 /Interpolate true /ColorSpace 7 0 R /Intent /Perceptual /SMask 53 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xgXcW0wg{neWQDI PBYBBBBB @s(*Getϻ;;{z\v{*LA9Iw3w |?ߟg3@[6nnh69]5'+q&Y إ~o{zSvGΤ3[.'ڽ0;s;^)+*.z}k5F{IkdRp5?//./ FKE[buC}+{z''lw5w뽣Ȝo9>i_k,4&j{fGz{FINDóKwB 55Fcbhwz@{1VC{Wcqtvtb]C vuEN5Pt/ޜdkw?ۿ1>9;y}zֽc`90itv[=V7띟siIM=WO?}:2QmayiIqqianr}bghՇZ[^\XX\Z[޽|GZK:GoiǢKs vhj|8y"I݇7.ol 9*j8"-%I,%'dd'JT*bsV`b3ͻVb/ラGlJYyq I/ǽ&[`w/'N]_9U:@fIl9#'ˤd%+*M-镱[=˷C[c6#";\:} ͡ŕ`tK s=yMXKx:4{mr^l`+>z0{'+O?ٽ7r#2iN-WWV+Q3'e^LNOLMH'g'%7Вv,=`wuZ$:֠k"<9z돖,^<`x 0a *L7&_5wFc&xc{576H__70:>=?6εoGO[hN{FzG]Ў$"5;^[|xԢөPy Nk 7_O>rBX?c##ss++ׯ]zoxJGl+dcXx?5.cV!iV[du!-AV*M+ -]?j[KK}h,N,oܾ~?]ڮspT TnP1Z;b-fKhvxCN[Īه{<с1;.b`5Zݼze}7u{{=V_;]ϷFMAO<@7F3;s[fC2ĕr;?wO} Τա % 3x$:RsDd&rDRV-Plpprnl~uv12 "D]ϕ;ڮ]}%iIF d㛷WGgzƜ&R'K@el/d:~)[DA%#M@$: -iL^-VW֙lEJKhXf H1|l`d?0k5Z[Tmz+L10d CV kkf6[۫5F+:~G kHY(UBlXVT - 46>oh49SWGCs$WU#$bZZ,H^]t?|oOjP,u(<+D2Z6 ӫoMfXQkB \{\P^U[ L-,wnT5sZEU}M O6az VO_i1?7>=-`3wϙ|}5fW)56teݥͫ=Mf;8QtJJmjwCoG`nay`hyP3Yv{}k[/(4+go/_ǿ^}'6FTuPv:ݑ+}P]~ [Nk^(S18bP޹BPCݽ3K7Gc5J.L"0v10^x$-/~[cúFKGGL 7ͭ6=f[RSKXc}caX.q!_1BC4дc`*Nj8ΞE3dB.qΐhg& ٵY 6@"bC$ayjndae]Rݜjjn={N_( 'iFɫ qLٳ:HO]ru:O!O㌹]8QD %]6N@-Utyd|lˀ3능cyP# 98S\q76LvRNqNl@`Źxn. lsP lm^hXV3}7߸QDR;;gIJCq` P~o.AW*>rR"wxA Mx6C< zgbz`~P,IZC@ؒk&<478 [L*p YZ'nUd5:Y k,W[C@tl) Jbiwo6b4"_ NYI,(ԙX>5\ݙk u Mspn~dkD%I&fĵ{`g=N%=} g MLbɴBhq k[ǏWZ*]n`ʒa$Os˻ޥ1-$ᣇ'6%lnN'Z"Z?x ̬]"/g0 (սoѱlXY޺ն[hɕ"*^v54_ Ej\(3M<sl[rL?}d<3>߷jjlD8w+綯,"vaj^ѱb &gA|}=[GeHID駟|[)bzgf#fs|UZw 2p:~_u9Rr~VC#K\ޅ"·E ȃE7}5y>30Q (k%H:(Y"T^d({t3%gn޾X]V“ǏUju|v}Gu\=s1I\(a|_ ů+ KE*kZp$TLIŦ6>I Y۷o}d1 rA]yԞ̿FWOu//mK_TԽ>kX]( 675x 2u˭{>vL,4'>-\0>(kF _Pp3}_\Y;:W|Znu@s~9^;lx3+b@ Tk`@!Os<Ρ+_?I;7o~AQ0bvu :{FO,1)<5-QeBUkrm2?|ykh}vc Fqk Y}Ѯo2SKK.u޺ @opj=:lξ&%Jx`{3YYBM|_Ә5jkOcnЙd8="44EG>{ )- 겷&ee&ATs Qf3*WԾ&H$VLvkp?kKX|Qhx!!1Wvv@N23hO@d{b.Z\}= $y g8M.Q׾W\RQխ{~A/0}}15#? ZeHQEKKmщnkh `ϦWRIrfju":Dy ~*tV A^N_q_t:geR!}kkx2% |=spp֔Lf7$A A uBE{/t:n6A}` 5~BٽX=VPR>p^SPY!|_3Iaƈpu$'oݼP' =_] Lnk_{eĴo'<)W)㳑{}Bt)0VihfeF# K{No6ŗ +n,ykkK A0쉥 w&vj]_ñi7A7&mN~YEw<`lk @|p%[:ϑHz^CO^=8M2 ޡ2 sߨDJ,`WZoU^KpR3lP?ѕt=|PR%[|_3 N4ʵDO|:3l7}Voػt_jB2/>=1qDʪ<%272&VOK3w;<5F_7;n}JSK/Gȸ3~?Ȍބt)7"{^?S`qgOI-*S9y|VTPbpr\p~潇_ǺfC/Rޜx@&.P{Eh~>^}E$ʕΥKUYfoW^IP3:sh$2sż 8H/N$1xbj ktkMί'=}sn@ V鉝g+9FDŪ`$284TX3W^Bdp@9"hp3R@4\vSۮk^'̢:mǏNgIA|Z?ښ]$;oܺ&g-:خ֓?akRMM~Lr;~kglf{oz&Jd&-ٕ7۠K4/Y|߻1Yd89:-v vMw6#ܽ},dFSN,nGO?gSplpbkߺ8X%=9gagPEZ?Brrhx8ZdW]9~ wy`b6B 9`,/e@AN#{ot?38O\VJ&R mUv@|LWzCBvqyS']?x螴Ɩ&׎$+]qY7o$QIp ا;"؂)4>L,@lmXͣ*@|G0#bM mooST=cl=sMqW vO’NHSA5_O}eO$/u_S?~fo\;k\ $e*L?zzt=֞zߨ9&P)?yr`'k=/؈q3ȍg#{b~Gcq2_JʾtKo:F-#!ሙx^?5 +П&-)X;=YKdpf= VX,)+/2\qT&ڠ]#zӲ*kRz~rG9/2+DjIBa-o=C_ɣ\e|rZ ڶ[w_I_8: 9;'8UyrLt gخ\RW k=>Vt>UMWAL~볹_X _m Mu(*SϟŗXZTq(,>X=:ԯs X?䷯jxnLɏE"O[RZrWe7f:FC}GwCnhk1aL=U.FYY-?ÓSM{{pBnyU`4W_վ& L/c^ř+#2vutgtb> s{+u1W ݢP*AYtw;F 1s[1)p{򕝃c&Zӹï-UziMTXOr)B6 ;)0 {(>55;Ft(u5t MuuŷԺIp<>/>#2+ TW1wXBU>yt29#~%6:o L:^X/J`cb7g c#JRI\6?-ncxsp':⠊JN)t$CKڹ\g#~ɟ;23S%=ËQxƵW3'M*{߼K7%Srq"U3Z6g꣧;Ӡ͆cV3(fF5={_ݖVܺUM, ԹmѸ)wW%(Lj1 ݱY{u D(J ޫW=$6<:Fj&)ƒ3ikt'sₜ- n͓hp-T|3rzz^,^,?NE>hnurr '7_HW^o&0!S; 03LK)`gz+ ޘȁb~mHV@GɁFo9p!8yK$&Ƞw*zpOqErh{gJ_ X>'R/äuGomrFNӊˊaLEԳK! f6I* puZs#f{tx$<5\.IUU0_I#a|R)2ѻ;͞=|*@ֆE"6W/AzFNϬ);~O~T S8qX?`gg$Țm}`0BZA?$Z!U>-`Il?w9K9xv{iα ήe" 7֎B, /XvS6671h{OHU56;C֝{拉s}+裏bŌZk7NK<^'ty}\b8 Jcu NX">*@rVUwB:.49C:A׮:A̞Y$ovGNT61o # 0|=h?EEdQ M4u}'t:E`L5dfDGgs8OfWVjNnnu;Q ZBt 9 B :d@Y@#bKO1Gݹ{_Tm9][YyD:'||4qreqKkd=o|XAگvħ'IrxQsC##)9(қS :ө߅T(μs˅{H\f,,U?/'+Χ՚O ' 6ot/#hP(޾>Uh(bh|RBC'_.+"J`é*"$/2 1%8;񙎎5(w2Uγzb )M)NX$!Ѿ)rpA`!h^ G "y|K)YSdq.9uAkc3 Хk[7R9 M%o߾PEfJ]JH,O~W(>YzZt-?񟺽H$U6+V(߾+w6nGowx~fj|dxhpt~;_>Xٽucig{!-n\ݽq=yݹ qu+7`Jơ{7n]yN䲭k(9#`58VF݃ɩP8huEBc#{;[_$ds؏Ac/'e!HbA*PJKR2!)$3DDʤDǐ$D=,r@A|E)OJ(tg,#.Gb˄ a9/dʗ9R*GBaA)gYbC]b+d p)l-%4604JPhLQ%"xA~nvVfzjJR"ۿ[o׿?M5==]/%|j2gyr]&q *@ Sk Ȭ0qB}Uְ=jpǚ|-<숌8AqgPl'qw;1Gd LwSm +|[TTxVNUnbʍti}DOR)-R*aD~VH~+>5[lr?M>Em .啵4YHF.S@#hRWCd(!j: HcUj" rSqD^SgkpnT{z==ཫ1Lm{٣UMe2):XGUDZPKW4KHNXE< ܾsP&{9 żL ʮ+6JEmgWIj&iZz\oRZjCX 荕 P kt||]khn06Zmu&{=Xml09fwl2g]ejZʖ)$nj7X(7aFG/))EBApl 7󐟝KmsyhV7WhT4ɴ/h:~y>G h6!H!\jE]ׁN +[5t*͑*GLo 6Р-4` v/ VW]K[mUZclYWTSTc8|jj]AmVEL$2I[:MR];^MP*Q_~~~i^e;qQ_aptLB󦞥5Zxvw~mhauxf [[X\Z]Y_X[_ZX^[_^XXZ^][[[ܛ؛]ߛ^[ߌLwXz" u3Ic:,6q ] ]Z#\XERl)7Y0z%V^7.# Ve $ķ-(z#~vb6&{Pjhk(0rQ*q]bK}L3 wGVv&Vw'WwVwg76,n g卭ŵU rR`|=8o͙"`Q oR:+m*HuHf5p# v$0!\W;ڦϻ}N&tBy>Djk['h\S9c׊mtsn{k|q]{{p;nݽw>㧟<|>'|s;FW{7]RKd!0:*lC2S/>¬S5nŽ"/,B)_!޾R]k%TiզNeCџK{#` ήsT"niUN}Pbi\c9Kߪ{|;p͙?X?ypoލk`R xw>X>zO|۫?پ{7s׼CuSt1T_4ڎ5n ]j^m"Je^ܷY9jWC U  (Q<vs!*@cT *@F H]-RU-2y[#S6|a .Fah,4 ,e2.g |Xɪ+ڦVU]^nptv\&'4%4I.^LG31N ^Kҟߺ319JWPjy>Y!kT7]_jvf\]̧&130L0#LGrjW6.BIخmԷ&wVumUrm@* @Fb$YT*F0nL'^f82.Xl*Ea1eL IK"*N[k24ٍfWhFP)ྒྷMV4/511sYbIEJ+qT*R-+%1##"Ph<8@|hFN^:$'%3;)=3!5rrZ\bʥĔ ɗ/'$$&e@ 90 J9(bf^Q|j s Υ"~q~Zeb)%&$^RoITmN˅#=i89o'^b䜤<IP @lV@~@Q߮nhݕ ]c) t-A/P`X+(U`> sYd$r)JB(J\Q!i5Tq1˅$D1.1˅qL)-^P G,y _^))"0eT\))$|,"U,-paQRX-Bt47E$LXM%T\`4夬sIw3䗃./KTYh н~1 u–t_餱eo'_By2KLI@a%H, Kf<ᇒQxR.Ԁ{ [-T2@& 1EX*Cdq4Fh$(8&SH2R б6IV)W#V( E@h<QF2.- 0H@\3,<,WCU1UZ QDe3 `J %4<-$a cEhdqI \ā" Gr Q*H(x< 'v6 epgez,+. r.1 ?x;~xvrjȒ\HOBV'Q@R:es THfVN^>$KPXS1R &1+B$0?d@(L) h6ͥt r.\@SAee H)J PA()DW%說(щJ qلJށRB ǩ[<.bphpT|) K!bA'F!QL ’G@Qz @_H!aIN1W N{+7 "\]k9eF;:9)'!-7-3\PB0aG(F=-)A!KP4ppScRRAHRYƥ(rlRI8*@)ɤHJ24]dā$H,9] y/;8%,QKr&_ 'bs,f0Y4D dPh*̃f3ahJVA|zIyo];?u/B *1>A|`s# 񠝟W4d=䫲o[N%^N+H,Hdd47+5 ._ #t*͠Yt)᳤B|IE|H  B1/a񤥠{!`7!_&"gb@~}Ɨ04TԛId`) IQĨR zoeE{K*.—A1\$-A,$AqIxB$蛗r>I9o`%gLcjuu T^S{'MONMHJɅ[=*ql`Bm~7~a3LGC`|$cH|)$?# W*DRP<'_@~/ bv*TyhP^-.-`[1:U¾z#D;hx1x)t)x1p1p!^L;ߤPK|/GfWDLdV!%҈ʫ]Ɂ(JW+($J$kOX`ll)" \yRj+kWWW^-- x8i] *8H*O{UHU41C{>9=8ZQ\BmK5tYy '/nm9rH"suvfh c3ቲn|u ѩمNn%44/|?-ͫc^mܡ62&?M[lV_^e3r nZ_ 8-. ۀ$TU4*[:O_-,6d1&46B {7P3kjjXC]H\<_jV{dSUG JIY%L۵ 3K;p<UU.5 @!9zF&&'#I$u&ލ" ͭĒ ib4SSZF&3+{_sܛ<5===!!!,,쒙uTTp<3!,,yBIYU5w8%a2|HsTsD\ `Kp f8Fz[:[:jhh 媛_JJjrr cX &~W00L9888:9kkHJIIHJѧy899Y؎"L}03A (B SkS;Op.`hjrM}Nnhr隅%+=]] !20GX"XYY988Qhjhh@gDD?n߾M./׿@VV6I\("*Ã8v z?SGC!QP^#jD Ö^5TDK蟢7oW(I} 顛B0OERعE$$D HgTw%tFaWJߥ(*+*)+)TUTΨ0duHs#z^[_C[~y-@Uz5U8"ي%yEy%zU@̓(B"1p)HYsrRWWb"~^̮}D@\14bdioblaf5\Y\ruK'o GzfW~'ƅ1Y7 \ t=$2A1^Q^7]@U+'osG/s/89DdC-=?qU/'+6NfVv,lL̬L- t4tϪUecc@о---]wbd:*&*,/'rF]]뢖U5\|-~!q,…08SP_WSQ%H.{zݣ ݢ[ #_@JNJNW2l!O/LJ*L,L(9hwxbD!C,-OʯVU\ 2&Ofh qsW6d yFYQZR "^8ŏBHK*# #k]K qƆcsI),rsne+ 7ϬHTK!K.J$wǓ{b@1ee}zC~M}y`WDEFz"tVF /(A*&܍%vi-K [v'v:%؈%ԥfcGغްp6KZtZ('|4 GFfW)m}lrrJ*Q48ocfojap?ZXRpBv\ʭZ3;s n=%'T=Qj^315'gvF^<_z_퀆:7ftOoݟؼ;6:lڿRx"{9W>=20FyZ0;#56!*: K J׍8+.~f:ZP? '+tH:΋ܫ}N|_v>~z}\{qǥo?n_mtCV/c-C' ;#yMY)  1YaIE!љ!>an@yeSK=} #~FUYAL\8oDTW,]FJ Y`P:5leU-U:4 ?=2;>C'w/>}yͻۿyfqmaә徉Ż#%O {s$S2ȑxD_H/Wg[3+\ЁWa jx=>>1񵪭 %,syJDg)x'% MLfml]zCX{؍B񰥷]/>\[^Zvc>~ 㧷?l|X{ڛխכsKӋ%8'ͽõO˚{(wsɷԤlr (<.;$<5 0Ow_WG'/䒮 ںZZZ5ΩWW=$'+# č!x+TXNZB\ТRŤD%ťe啀rm`ljfmc $C/РȔⲢ**rѽ}OG^ Oν\X\\^^Y[/;IO뛛yeuhyu}iu}*mym8m$l'#=ƗeT`2qIQXk^pwr172?~AY5:2!$0;窣eSsk^>oamxQ꽃bCb18R&"7(B}wYK_S۟T,Nl;nV!>"!8)8 BKˍNx,8`܌K0Dl$]iQIigwq(Ɠ3zDlL&&MN NIF%&ecpq |,0ES $TLiaxb*omٗ+}C}m-ϯ.oy "C΍L:2tdbqލم婹,hd|zxl$dEvx|fdbKx_[ZY\݀Aáӣs36V6'gW I endstream endobj 33 0 obj 22512 endobj 30 0 obj << /Length 31 0 R /Type /XObject /Subtype /Image /Width 160 /Height 160 /Interpolate true /ColorSpace 7 0 R /Intent /Perceptual /SMask 55 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x`UgֆHXIr $A'  N !w(@[Z}}ܹC͞5!H޽z7h'7 hkXXYXint.rv>>&Rlm}\mM_X|aOZnhEc""BM u_X& I1*>PWI^ h8Gf.Zа;ǮYy-{ZlTWtKy~oSmkn$ PH+]ǧ7wWɟِ}@S#}|V~4\:~cW2":>ڔw$qNILXw{ϰ}W?/?Q8>]/]mWGȸ{jܽP+n>wwº 'Kdj$ -=|虛ұ>>~O~7lMII ֋f}hk2b7>؊[OگQŁfꪭWOH&0&KҪWU'O<~|??=p WFE:Z'/PL|}\}@zG>xƏnxQ3Ã}TUZ11]~{wo~!ǘO^tۣNWڮvpk7|V/~ɏ5w~zxރotݯ_Ե1v΅#C=/C;{.^ŗ_^ow>(S<}rӭMpOv=+Ltu4Dyj*&:rkdf'ns.>x$ nxww.['~ҕ_^{f[cWZl{EO3)ҽ};vwѓNp_^n߾wO|龫ʷ]T)ζfjMbjgge{UG]H6c޺ӵw/߼}'>z.=qnN=quVѕ3+dh 4+??tpҥ׬ݶN>qܩs}W׾Ï0pǏq'd͢%G^=]-1,)Kɲ%{sJ|cd1_=Cg?]GN5";yę.}77s?ØUgzO٘եO_Mtͼ}}: zzwn]kw\kÖ un??"M?֭B|Cbs:w-1jnEŦXi3(gO:z/׾㛏6|͗jh_8&2 8uQ4ٲmm;پ{kÞýQ(o͊u *O+6~%V HOo`hpdlF\rǮ]|œg?}ȉ='Ϝݾs'OV_?ił^CÃ}ݝm,L dbjжÈ.sQZx։W}x;[w=5_݇`wM-=}q' 9ϠaCnjrYS\xzEdv,9j{EًN;ܹNP/^}֣ WT4xZ\\@u?蓸2R0ww~oQ[ 2^}oO\z̥GO8t pw)F߯}7k6TV[6o);y=2O_EUUE-80":}QcƮ^fC.]>/ @ܱOZTX\zCxޕ6ΟpU0@>OJBCã2s;aFȢg_@µN>zCqxG)I|qƋl.sJVRus 2fWoBg?_^=rgw9?۾3*#0+pw}~mkwZiἥ3&N0l:vfש{fvNf(QUQQyEfv8i򖚭 ,y Y|/A ewڕgTTXNZ~HGCծ4](M2 uN^@vסG.[yX>2PZO 4^^=K?qGJ%x?{ƉK_>skG {цG@ dpZ, AqV[bܙs_R8hpnӲ~6ٙ{47{Ft++U Z'OC`YW2]pg鋗}n|?9rYhgeҺE֟lI8xcm8Y~! +vaYu+j+tV_D ssmdZ-cұ[,/Pk쌜.=zk<Z, }܊;v">"EDGO8 蒜>zgOp/Qo gl3ʔ.B,ڪSV(l')ʑ39ѝ4?]P<=H**%,(]l߽~ ͘0mL!vVvYilQWSz^h]LBjq^AN>~ 9~34ӗr7wԟqC9=Qܴ2"tjc+#-a5g&GOs賆߽n瞺{v۹n>_K; ɠGzJRX,>\ۭ\R5kJÇu+)w@}zBZhzҦu+o/^˗/G: ώr_?|dgGg?;cgq桯nuԈ`_'ks&-?XW5 2aLe×~ݻw[a7UoRSnK͵۷lkغ}4AbAJL/fWA&޶sSmúM[W,VL6klVv)ɽ ts{'@DwUV7ܵ{߁ރu?_8gAJνkؽkUSa׾CGvj/_bC6HGen#gN5kݡ1R 5.&Izfݧo~Aa~:vi&ϚYpe(roް7n޺MB~SM}VD .}ݸ^m6׭^[>e~f[ 楐Nc#Ȼt|ҤS7oVm;Vv[j6oݰiW^lIsL^6f!E c̐vOHUoz@-8:|^xn]ޣW~S'L-Zzk7`+!Rfۦ--k FuCu-fݦV+7aȈ;GXGnPy7.MHM/1sㆍlК-5u|luV\ps+c{>}Y9 fOXMO_h-۸.]hQw9s^n]ݿoѐG̘*훾d#wE~Q3܋έ?xhN;vԡSNt/.4yv̅0EKpǫu6A6b7լM[ukm؂YWr% *gR+/"6)X?`XJJrˏ?l5ӵu s{{/7QtA d~9S;uXBAPۂމ){%oRzAZر[訷zҺ~]7o*bҚ>/jn]QQo@z̶iJl6-4;7G{^ׂ^C ]T4y̘') \`%5jkV,[|O6s wo?K]6_hlȝl{6NrC {cK;/߀fM^1cSf3E nW4Cv}R2@gB2=.g|r &*/Ku+$:*]dmӯf  +ҝ65#+5#SHzVzFVfV̬eKwԱ@IQ1(9|y *.OVXVU|+_2wZ}}-2rN lbn9/2>Engho;p K :O0;h hnqvI kPO($ ^0ZH_Gnnܫ׮m]dQ;M)ii险iiY|q:uѵb 'υQϞb-EȒ͙{q@ ɸcV4xWQaK6Z<\[動O݈٫+jTV?SYRҳ@695IMLIH Zg,V{(u{u/`؀g-f/3oɼ(]0oqZFF ;k:P}𶃍Elrʕ3f tyz:8kjԬ-Z98f''h߾살^i=0llR&d1IJpq@ ݢR2rRerI(i[e/k۶V.[6~n p)II)iIi)״tt9###3Cr@NԹtԳk~@\"'-|6s/3AY'j"D{z9h6柶065 h5>KL\؄H7IZ*p'qSJ/ZS{o~Q}+K!kn哧NU/#CrzfbJ"$195Y"95-5-ED\9r:ک3-P+< ΟYlּҲ3Yo.y9A F'1087"st,[\B^8We NL:!x@ :7{#=#nFҲCuڝ+.&ABS n|b2+I2rJ]NL_aSd ^gvԩ5pA"7Cy)mvk7аryi e#쟗)55!$M,psW8ʀstquK m%l5-_z&Xk EF{tryEA?ߊJ~۷o[r%Zԩ[όITJ@2!9E,} |G)@ mF&vsrгSn݆=K^JXo@DBJD\rXtBBFvN^} 5zԑ{{ؖZQ`hxnO޻ĉ[k=+>}ȑ# sssbb2w'9=LL eQ*(8:a>!aj%V>?'=0"\[:kɬ6UDGu0̭o|S__GahFY9y.={g6!%-^4$MV+4W(ZuRrJ05%95U貈]VVvffn۶]rrڵkt{y=ɂG&e¢<ťN߿G[ketpvZ7n7u„q HU,ttVWiҪ6VvNHpa%w,xu|k QjcPKۡۼeP7ʇᅲs?]qc{}*4wpQq^:SeV3q I J'&)U&%%'aפgċTHjjFrrr\\H`'WfaQhO@M{Y3&F|]7pvrHgշ>N8QaٲeJ'w,;sn XLM,m^Pab@Y=%qIX.]:5_/(:o^ pgHR>`95+΄x,#J (c(/'oK hŀ1•/Ll\Ldd "stvf(:;999CF<d>NvN)^B;bĒaAZ,1۠) .}?]pavg,2jԈz+nN2r7߲@Gy}Pvtxz(5X4@3>uTE6FG7Y,Fv4 a%TeV" Jy& C a OOHLO {puuqv $C]`D?ӐC&ZZ>Ar'W,fq{qW4x_ǎoٺ6ѩ%cF#E򶳵Ro_JkX:|>9BDvUPcE>W\RԶS) ˢڦe~aEϘA'dӳsIHNPLay^\.ocH|BB|B\\|ltLTDdp`;wpr;:D,{<=80=sx ]T2|IDUJOE%wK[epdLnߒʭ{Y+q۬:۵gҥO(),Mn/߅]nn}\l~h(a>qAYD£юJL+6ׂ+}ο~Y>cWy2jGm/s*Ypf%1!K*,"k+9e$ll\|LtldDdhHK:]]1[Ksm-u#C KKwrr9=cb239iА#KfN*--[0k٦NqҔi鉑4eveU5?>|˗?`U3Lӿ~ZF_ p ??3c(*lek"ڑWdLȘnqcXbmTx/KV<Ol'R)ig^)g VzvX℘؈ȐPO/1ZɅ6@#25Սu-::Z:dx0ڞ2_ܴΝF;xD3_`βY;~„0ߏŸ̞C[}{O?z׬[W:eAm,%ae3a_~A!"A{T\4* m,Yy-]=}TAld(aQQaYC\.rO-Uo7EGSV-[h;x+|CBRcbRu&N/l㢚V;{UIH?O_iXV7bjƍoN:tƸN 9{x} :ZjFFFVvt9?3(cXT׈^e3FK/KM}CbW XdUbLlBtL\T4NTxxDppqP)R=drZ|W}& а]:?`ƨ1YX5[O9nv6f/El-:PqؚEwH wv\+0NuՍD [9$On޼%+u~|ֶ%4Xz}qٰа`@*&DZ!*wwvr41Pچ<+O JIe ec&̞1w5,=9vQeCYX/.S~ɬݧ..K 9"BNT\++͌^hiZ;}Y):W+#,Z bp|i| Pب@6P YJ5ſO>np% ȡ!IvĈ9'-왗C+6-Cc j!<|p+y1)FF p]=B=\^jkZ;=/!WE]C/&Q}q@7j(Ԗr%[Du5~j񱞾?]Z^= =tK66qz#ų6N*#fz_y'Os-\[y禭><|s2 u՟OZ6{7(8kx7o(/-7``"8;dҺuks+k-*EVk׮`ѢSGҩsz {X@_6-䥞ͮV6v$0?0(=9_疖/Zfw}?rČEÆx_bmnԡ׀ɋ%GܸyѣL;f=0e ?uNNboP5u芲9K6,W܄=F-9cٰ!SNo'?~NdtQzw vswsy .UožJI89;;ɂ]m7+>{[__ AqDd}M+[1w5/]i8gR7J0h {O{rϿv۶fOB46WAk)s՚fxI'@ކ:yrXZzrrF7d ^TwyŹ:/=-%*%huP{\پs'[2&C y{hix4([YɠDEwѿ1㧕W/_7Q9R 9xKW۟C{g-ԑ#tD]Y AMN-E?wPԿ𑣊&L;jBfA 򇍙tMUw%Խq&+|.Y:dlqnt ^JhFr|A2^iGn K{ 9n9KiXY:vȞ su:< MxNYuu5Ğ +ZmD$L߀qgv7~wߝ8}e-()W:11W~ܯےutubu.5 '爤_ܟ pϜ?n;9-ۓe4I#~~@gS]]=5UV-[iаt#6Z:zƺz8bt++&y'`jj*=`ˌd3z̷kiYnbVTԁ,w7220634cg t3H%qcJ 9 pvKlt;^uM-HNXۀ홺b˦땟* G 2Hbbcv565qZZm*FE_O_G[ƦuV1VS@uXƦfzFfpi-=c :CST*OjĪRlsQy{{{{2n+300TFC[RSQfNN@ISSYf~ikl:K?MLC 617257300C%aM+8k:]dREHKR3b%fΞQ s%άgHeN=_lD6767_H+"&y'B\QF1PG7@y*tڊXQgR` ÒC##sXPcͬ~~~F,hrV|.E{6ǰPl  I*//*bp6*DetAVU55%\RSSk7Qa#3 )6ŠFfVnHV目~^\hŅ UhYp*)IRUQ4J MmZQd൲:a҆-K['#skC3s3PxӚt(2z2^ p!Bc`aVJ98c>@a  jL//6bX2$t L-mE)b:d5fX+,<˸T'MD'Q[]v:H#?//&G%+ 634!7Nc*Ƒc &PYD+{YR<|M.#K+kOJ]xU]B_Hå kYY`!idA pM,`zFfVDg@eh>,=u򍈎2ì`,!^h>E%%Zj KYqaGco M-55&2Vv Kai&OXǚECCB#"#I/rQ)ѓ,.% eV*/('S4̸2}`f`mn1aW'&#=}(" TH6^ws@\Tgh ® &hbBgvb^ 4(b6@B\EqK vɑ2bP@b|QgCtYBK6~!bFh'-rGGNe2"2^^<̖(MDT &a%G68><#z*Hm908{l涁`1>{(%7 CMc^XDig@FkU#mvt\J1ᴦ{ŤآvE6CUUinBn*2/?b] hH}ņƢ܆Wa)FG^xxx6L@]ޤBBm"`n.z- 3A&g=`_(t QFLԘ+6ZWPDbzh p{;.`#y,K(-r>;p ~.t2q.<'S>DM(m|[Tc}DmBdicGK!=~<8ƉEނz¤Hb8KopI 4ۄ1Y S_" Tjӕ$/v_oq4J\5}"ijin@v CM،Bz1G-O/ceB![>tEF<KHE p 03|F:$F;ZhjPhmeMREJ:Cy1R  G,贩KP9 S |1fZ_bn ve27?2DfU=Zh6d(G8[(7j«^jO+ 20ԂQa!]F@/f*֋䇘\c PGFaYҌ.& Y/H1ATf,I)IHB#&TTix%T*1#Axa1 A%_MћOgKl+XYFrf"idSױҴ$\9Mp&Mi!AUKJ̘dB2"¨{Pf7U\V!#5Pa]=XF3Fp2'rP1?écKJY&Jm^~p ,VZ\ Cmd&*olje)z= BHKUGsa87PEk;'C(8>Wv>A>IH هP}&2SL qKiED-MD-.tSڂO۫Mܐ^>Nf J0. $]B9,@8.(Hl` 8:;;Q.აsM-DX=L`EW̌3H)3QnQF|WoٍvqsG.ÔPIQ&Z4:iG?>c=hgk#9 "_<8l0I+-:6)[?$t|%#,swz=^)~h2Z>F/3QQ%¯xE[)el{g!J%LB%C-RAYp-u r\=Xpl0j/!Tcwy,[a.rgCT)%O'hz>V |Rm ]\]]) c]h_Ihʖ~M/ah<%.Ŕl)ݡ277j$nnn\Yv$K0”I TX"K6^ZI(%!bIpEKջ~X͖(j_3Y2 jFzFd?bSy|[&I2~nÓt9􅏯  |}Vasئ&T,1!#^_X'(Il Ē"cZ,)29.&P,h Ɉ&^!NO_;Uc>aaħ0πY&@69dqˆoՅtdn0?()fLƽ+XXi&k-0j j8 jˋd/\hjB]BKnV@w+6BdŊmYkZSi~E'i.`:ӢC 0Ԓ%Hp 1gQ5S,6?nr2~/HN}`ǭ꒏V.IHRm43H|Yfjj)K͚A3AN U{H1pi_ 5j ]V,Z.I]gms&%ffS\kFK%RVj}4*SRC^RI &K&!iBjL2 ݢ8tZ )kaM,xK3T.)TdS\B@k}nuv!|-,JYf>_5.)> ]$oA xpƨ!hnHs$(NZ1OR,%x%Δ'b1άd,p\ C;+3T]Es ҇Irs5/*+DL,B MQ)`;1=&ȺLH0LutCM;8:X>7==3Hbkh1IH VccQgS\=.D0u_Aͩ~d/[z$%/F%m+h'WO>9D Ae+ l%Z䎅K pL31\,b=T܄RgY?BVtJUx]e24pU$ʍLs0|M%Xb"X|!M<` :mhb]/j|>H^uSK(õ 1egk=<05.Kpse)dÆ%3J,,tB4X7#֖#bY@s06~M-)k/Ks8 ^1?#L/7@)QJ"5Q;PR+v\1f7_N?DpXBt@W"jj,РEe9}KIӴ,@1\xz^nwE-*J HtN`3r|B8Fi<7qt'Q|!ZɀlJpEpᖓU]rjRKPWʫ^??ECMM +/ 9[I) 54H`/A.1 '@9)l%X>&hٲ%MI..gNR/:+*jjVp!,-o9/S|^yA@ XEo~ ZJZ+Ϧ]$>#Z]։D/Ex' 0"}*3ռ1aMMy`nQCl#>XEfSaY\QF^𣉏!:nc4x3IsQ&t?yml!+: p9WvfxP_ I>"K' ␕ {}-T!ռn-HBN+? endstream endobj 31 0 obj 21887 endobj 47 0 obj << /Length 48 0 R /Type /XObject /Subtype /Image /Width 202 /Height 60 /ColorSpace /DeviceGray /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream xXyPUU?(J*f ``P@ehepiQP --Dp_'rԬl-7pI2Ss!Jv}}Ofs;;ws92 <2xڸCĻGH#w{zesYԟzY!Sq= s"ewf'\KmpDNh5wm~GkLaZ̕6Yu2Cc0):Z!ghjdM _h'eGЫ̸"+ƎRkr\l|[8t8{KRg fyFءNVG1逰K1P:&'FҟB;FOKH@P v΃׹Hm?D9}"8,r[ 4$wE)|- lNV(ۤ]tG e+uN;[dIފ')#ɕx :^o/"=NQ!&EҴ$g*juvy0 ˯JJRcrMJs?͏ MjlwF HnX Ojʤ 4dcP E9\O#c)lI G` QMZţsv2։df"yxOҜU>V;_})`h@xH6 Abt!ا+jL"rQ叢|B[2|D5TBxw؛$+?$L2NÐ&saߍui7Pq"P 鵛bv*Ǥ \3E[or'2YS#Œu`AJ;^ =5^y0_aW)=15}Upalc%b]+3As*=J4,tv* =5Ƹ&c$)@)ҴُWA  PiQo.pMqqHGj!ay[MHTj jS ,K nQݽ%ڳa%LKV- !|"C-(q T\u" ^nb _i~F+ڇEY(2!)q(g$3ǰcs璼R4k,e9w|&\4qk+lH= Ͳғ+?Vtn]FPK#'[_B: endstream endobj 48 0 obj 2056 endobj 49 0 obj << /Length 50 0 R /Type /XObject /Subtype /Image /Width 1832 /Height 473 /ColorSpace /DeviceGray /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream x}8/]%]mF"@H $@H $@H $@H $@H $@H $@H $@H $@H $@H $@H $@H $@H $@H $@H $`@H_urH $Hл2H $p[Q@@H +%^DH $'-ԟK!$z%@H @˛t@H tދiby$[ 4CAH _M j $N]/0M@H':?*FH ?@˯GH $s 4?,FH H $[ 4῕-EH O`L@H Pͯ "$w'0!ݙ=@H J9_ {"$7'0ק͹;@H D}/YK"$&0׫9@H @y+"$&0uׯs _:/F_OKij3?Z.JU=uj;Iـlnә4[*,{> S{ɾ a* :@wUC]a$Zqrb@i<Ȉuڜ4u4roGvכ ޑ1@?+cw'`O00|J%mj>heo%!ceiؐiZuֲE6jS}ufmB2"\9 {ؽDs½77EӨ MuKKo{-!Ȕ 7]iy+в =aˆ3_!Fe6*ܷxr[4z(8 uDR%6B~Nl[`><4 Ҩ)G^hN/\tνi7svĹ7TBvn\a|ZU97%GfmsМ1ss}GJ|aOT3:">,oD+5g\:Ź280BMET^7 !;u ykxL ,qQMe}#@vV9QGȍy)FNsPG*3)Z7!^sw Y<@x߅9!b'j7C*HőR9^gN8]ANDg†$7_TM ͐tш=xo?QoP? KS飊EMwf2M1xjiǽ|0"B{ w=k 1 w4m67>*=T_ A:ظA@=b.!5-а.u pItuwX^SaOKy\rmПC <@s*!2w$ #`:=N=żEĘf擆uyRH7Ȁ9ܐ4g1!3F\#ˆA$ClGU0'^1eROwƠ?Jݶ2(6zLpF`hg4YN2ɪh4t,Pchܦ3]E!J6/< 3膻5cQϑo2ѪlTut0Ncdܧ3]G!߭J:/5n<*Y!7a(QOQn"٢.?kiz|_bب3^H&!mJݓ>3wXg~O ` "/iުvu媅JÀ4rݠ ->[Ǝ7 !;h,A"2^=_)ǖw8=f>؊ZYr@z0" aKsѼa I1hX#CӇw!=NWܤ}ІC 9A=⭜V[!ӷ:PV6h;E2CVwД`Hd8t8% ly 9m U`jc-7BcRMə#_{M];ΐ a!:-tBH!@s=o7!5"ORX!.]nA,tb~3!?Րe_'\y+}}$xy=@M&کM^V eӆXC*ei}bڴA48#){2O#~rtX,fg[b=GN!ÎƯCYE@3͜6Q7!& Acc(;4޺َ }!d9; ZBȰ-3PV!y͔oBnJ<%v$|V]ѓB~-ꅲϛ7ko|CL8$rd(xϣ+s*lr Yy,iW^C~KCYAbM5W7!Q =@#S72P^F.D}w]BNR`} ٭)?{ eJџ7kd$ RSKSIH?/I*2Q^ 7ExNYNw(ixٗqzfc%^-S ,?ݙb?W/S%/"+-"/^i}jOW*]6o#moV qzn[':hMzӆ]+*ߴVp0W{)s(9刅9J${eul⁤H^]Q[Tn7V|r|bqA^IEܡPYk a RLjuedU1kTiBp?-~\ϠH+|bT/1͢w"s{I?D;jQ㍈)_!~wZU얾Xy.ZQלzx05ٸZuю2*~v ;j\K7}^OHCxxKØ J!=z'P7!0؊H7>ƯJ)IյFI9S^nФP.+{*ls @K *wKb+CB.SϿHMDs`xN|RKddp K bJ4GOn`tȸ&&ſ v*VwN] K= M*g-Ŧ)Vy9&'KܤPyd|aZr)\;"myZUNJK!3VfUn%@)6i)F)= GUvQƨ0s&Y1 .C0 (K\كeBՖ +׋̦Txe?EEFZ1ڬ*) ǎ;K s'ݬ "QA~UTnof+vy{\WDEnTo3@OK!1J!F<6*JJC[cn\i7+ˑZuMۨM*w-K(.+ 27*T60_pOK15R1&2,7RSksn[!a7+ɇKRuM!]M*M* .+2*w*T޷v X LTU[lErW1w𔮛heIQI,J&/&6_^VZ }Ν M i)*Fy=*)r\LErOU34ZksϩY)V\PxY,Q!.NE_*g%z9 ܓL]:5*e$ٻk;ZwSIr^Q#uOqyoNh!;KDIIp|[OP~]۩\SC7XjgK2%V5$f]\jm̉☗S/p2;ܫPydt`R;r{d)S=uv,n?>gܬtC.UrEG"ֵұ6V2L(y;粊N~üJ] HI-tUHFڜq0cGc{mf{Z0r%Z%Zڤr[rF5͸q*[ܬPydpJe+6QL)ˮ(:"Zk3 bnV',,OOյڤr{Xx♗*Q7p̬TxXL:vmuژjBj*ⱽAS fe{rܺjkg^z*8k*VMW6^RmP{26ZyQrrl| h=tc_z^b-AŘKڪr{[X|YnT!߬kJ٢{堵Y[w!ȸIL$ſۏ=7f' S$HU#UGYLJfe2q\vY&ܘ\8x]h( ԁ)7%\nO&sNX×w2nm#]}d{*"?aIBdڜIZ%AYup5%@5GT Υ]ֱk;ӺB!]-Xڂ%fB5t04'Ȉ1ݬRJLc ^,j 50ZhȢIKV qI);9QEϙU")_OG]_bm{]|J ^$RH Zc5 Զx_JbqNT*H1pݬRY@h֥ ]TTnK9(ypPʪwf\*j>oHZUIY)ƟU\F )kjm-˖eV&/e٫`uxZVIY#_a77* KAhե gmR-ٲlʵkBMXƭ e ^_/M +ŔIX!U\"]i pHFg-rkmE+'[c DJ6!8jxw}x9PliΞ+'4P.Qn^{p] *pxO>K?r TzeyGtJ'CT+4ZyO%}!}f5ccwH3`4B{0VRh7ux`5  49OYvXnGd|s/Zc{CKF{ꁅ[2h9EO(&8c][o*}scs\MW m1}݂6Pw'Ϝ!"hŽQF+yq^ nVq&-ZbBkA:!ԉSB_?>SXȊg\_>Y jNh3 =vVS'N ~4g([a#M ٦YMŝjPh#Q =vRKgˇ\ JG a}QBf51 wV0L3>+z1-r6h!e }*7CD7aaLWB'{L*zANbڴIB!ӯƗ0>KWXÅO턌jYMÝLu5O,d޸B Ϛ!f 2>hx݆gqK󗼭6jaw\04iӞ m恞4Vxuxm#9nV77!3y|Pꍏ\}ax%Uoήt^B;ꎅݡ.W4];`œW$BWL5ɭ!3ٕ~9OGn*A$퀝Q툽&)STo\oq5.Zf|; t;G!3-8s P޽AڄzsHzI,ח6Vdsըlh!Ci\ ֩c#+_e@EL $Bu!Z [kMUn5rA3^S@/lSGL䑢5)U\3 p!: MXlWFOb*Y2 *,dwKUͣgBi꺹왟quEs Ί]cP66.,GG'ڶ<Ս}Ts vw f!KBYyyО/{]y E&Y ϻ8i{en7 5]?'`|- !L~Z4鬿|O/W Y8.1do.<6MչmYߤԤ6:3ݠ㈬("<ƈ7;0L:7m?O[ݥZ`]K`Τ*zo #jȚ/?- Y߀]Jޞ@|X\j䴬ԯrCk7bq}lFB3o4[5hM^ˤ.*ߵ'ѹzXnx}ss%_E.&n_|@x~Koɣh^}UxTnb't|M5Oq}{Yews;;D7?4穝*񩳐3߯5kt <14hǯ ,@h x5_K@Ѥ}@E^HVHmx)/X$RZ/-maZH?rhY OI׵\ X  x$j7z5ǒuqHrhX JHץL X$ $rVyK񿑀I߈["? Oו< X*+K$n_3} h?TX5PH rPKt]$ H?cB/'𝿕tx$'xR1!$Hr`U g> ߋvX;!7y}b2~AQG@bw麘MA&~4aY0^O`__0Q{#N RaPt]< I tHοW䡚 Ho u$ [@H '5>f $Nޞb"H $K`P|n'LBH $0161/@H <6@H`zmRmW"$x>IoE"@H;nzM"$x+wcxkEH $pcE7r @H kӑ@H ܜțfkGH $B}@H Gh~U> C@H @˛r@Ha@H ߔ+$@'`*7H $K@yUg@H SbC@H @\$|!$x-M FH $v?CH $@H $@H $@H $@H $@?5tE\%Km$* |b>ΧSz̍8鄔nN@ =n҃iH1]` _<:& SG5A sO d/`Y?A A`n1Kr6hpS`Y?9?5ém1/K*5W]$%-Vuk޷Pp_zU{-R^+㯤5=f ˆ`_/*mvkflHHpR0N|M/j$or]/ sDV]|:A_ 6Z?@-i%P?|?@~ɰPF-Wyf+h"' ?*Q}2&TNnl~8 N?3K30EJ ?~=&bH`o`Y?s<ĞěO0bΦF:?3#grnb?c[19̽m[dﶨ;7\.OOGf؏6<3|2Ȉ[W痓ydwH-CGrt[䀝tq>I#_n__N#1 mvj1d'~eu~9GvG2~$GEة O4d?s9`&?cO{҈[W痓ydwH-CGrt[䀝tq>I#_n__N#1 mvj1d'BH }2ޓF|h!$tot,."@GRM΋0 $ oνE{0 $ |?a2X!7?x Xlq(E|b `\]ɤ[S!zo[gcCS f a7SG,^M@|Br1Sf,$ɈHT1ΞA%-SƪV4J 51^%9>ZuV oL%bB0VӎK7fjx\V9TPR|y4WhP Gӊ=ʒ/2KVM-IUGIWbL[GƓ D\M@>ũ[& ☪WRE&XDG=Gt8>L֪qHb2^!WY7ʖqYSW O"c l ^OCT2`jϖHL^LxPUvOaUu SB{,ѳe E eOT8Upھ^`>Z jQ4 tLkOwÕ>#%ڠ y./MkF<'L,f$ƛn'!% f'l2Tpu:g\ pp h4N{FoF} !ظEO*ff$}n'(!i.)7^/Q+€&-ܐ㨗įtS됥 لPnzpe.i͑YP\}g-ޞë"sXĄ*'`R+\#vTj["XQeʮrHJ;XT Հj`̿|da:j%HY)C'Ԃ懁I:rM"X-^K[eYOÀU|JcټGYf-%υ Hnq*҂VRegS#vJ N"tЮm1--ƱBO" #=8I֙Ƃ3OUy%-,X6[hM'  ȥ? pC+}O>u#Ҙ tu?KtԔI=Hlf> }-*5!dž]M3'@B7EQsh%ˆlahHc?)o@.i`ZI84 .at28M[LiY(i{LsR)oiG+㐾tH5fLUlVEj&i&C頄Q7 i@٨p0tgOtCޤdhh:JDI9DZ0ڸ +8Vb~t9a3Vp(b6"5@/Mi^S}83P)5 ĭln,q _iI&]USݟs9 e^;c1Q* sHi+أ-TsLc۔n85'V1}rUko;(J#'HtNc ;̹&u0gV"O+Gi&K3PM>$JM[,ٜ҂=6[5O ĉOʬiUGuÈHǴӀN_rɦrԭCX- 0!Bk3_cr#Z N[%j0DIR<5@4vz)5 Wժc[ui$=ah//D"kR:D 4fPЅ 1~f8K#`bav (Qˤޓ6Kt]ۧfNo j:[zlAml]#ڌQH$6|Oʟð(@w7VD~-CvGx_F/0?Mge3 smBGvL)/CE)5 W*cl^mk1&t2<(2Ó!5&ԄG" WwBbw@93E@&Xnn5W辋; Py (T@ @ H1@u -3ό1h@'S g4Czt 49AKն6r 5fOLś`߻t9 xSBRf6V蠋7 s2$VO^sklTC >NEgޱ1OTgH=ʌ1 ޯ& r)y|$+z؆a\[FDi1EPKXxEŋTW[ouS|Z*^R"|Au*ǩl;WCɖJRg O3x#tvEA7{xeC%=qMxZn bhւ-vO(>=]7 k2V6n*4$79)!uǪL!qZ!]"joUnѦ!:&PyOw{ӳ paRj@USF]nivpZMۍ,=?E| Rt *rsK<1Y夤Mg:)8v·Lq!o2U?g q"P^o~vFtHP9 S1A(nґ$ekBeS9_rv|7N!22J\EݮWG"kTr{WRmchaH )U!i=Q5|?TRRTӍ6S%:O3װ@]oA5ygJ8ǥQlTl[3|Bo6mA9 R( R@kPjV˷nybu)B,Oj%<t$"(IX@*$-NҊMv$z>nWd,i1J./}O^~f$쬓Q.02xxksƷ؆.9 =A4֣.TW۴)tTPF{½gDK"xg\E{hVOM>S= YsRpAc\ 5{٘d2^>qF]X5B(K]\Kp.QԥpOZצ[1G쇊9e!+b(% fϘ5QͬZUǼ4x6Ky"9C:*y?4"CI!+TUǼTQru638f΁)YX|,rYlf [7`xo䪍@fxJHXx"-="jRN-ڱg Y9 ml ](QUpȼh3>,e(V9Qr'F#3kS`J9&/۠%OHr3˫,~5öl ? yzxLu\~uz#kZ`Erl|Qw<20{(RQr/ ".fp(xИLQ ґU5#wB#]z%J^B=O$Jص0)(+6Wтp,-kY\v#jCrXùErv*uTm&bLF(d0k@P0QCJ )]38ToKkyH>N^))^'mw5ݺ!c糓PwS0cF!m X>ZqeuUiRY-rvWsE|^ Fydǘ{(ْsW0LYeFɅ37!5'e=SSΔB *t^}3ᎃ5]+\aT>/XTr}N6s3fc` , X*akQV8X Jy"ybs+)Z(yϳ S:Kgg#&hW {]96M6&uh!5Ƨ90 P T,F{һ9}XCE7n ˿AFzO.chCNMϔNifO.Ǝt9P.pɦO~t:4s20Ӝ Tjuu쮥ӳŻ.RG핾qAf.dʩ- SI >L 4~zpJ\p;ؑn5ץc.iÏn^fN\&|ZJ`0VUnD@Ss)J߸C/NBW$7 I'^H'5aM&gNb .nmHU̱ lG7aC;'A. ּK=OxO`X'`.RG핾qV 1 %>,h<3b]; u~ءn9*lsoE *}𣛰ס`!OkG݀h Xgƻn|dYNJy"V[-O&P$g:!cIFzr#rM=e"sqB\Dt* [Dڄ,9;07k6Rߓ6yk aB ?]ȯ+}j cJ,Y =嘱0rUIL(9?'W.P\-Jp;r]"|{rb9gk Ou)-t9=/繋Q{oܡBm~>C %RB> 䏲)3dBU͜,_2>躚uY%uQu*5kSW(٪%2m&dɆ) qPgûj3#r|_s)J߸Cڂ} ं|UWd,;9u]ep}.]:H R'Aӫ5Nl6Gxi؄,9;= t.=gMs̳9]yJS}hQ:h.R},j cnJH Wa\['8\3 DT]dP٭7 p;Vr\"xmBlѝDbf`L< m-cS:┦b?]$9^|g'r* 9Ы5N~R[( δtQ9f5͙1.:%2m&dɆ)C$0,a: ֬Mh ֒x6C֔)d&LP*Jqp46*:O&ߝN^3a?z)Oj}&3J.u3m?>i@ssDYMsfANg#Y YsGrסjn41P'hXT` Li+Uj.j ?NglTtL;iDMLQJ{_5QrLOʄb|fd`ԅ ||SW9Ud˗|9Ÿ?'~t)'@|Qݘd~)y6&z]uέY]#j#+!ަqvhAus+̳idBnHz%~;KF8axA`ňR|䑬 |8U(L( ԧU0J.ԆSB=cz8Iq8ez;Kzj=Slݣ}GoU !@I` h%sͦTw);4.:MsC; SKv.[p 5)T!)wEz {nB+ *380JES0AKHqHA%߮u_)j{-*']~fxᕚB87xۙ#MuځλeR_m*wՍϒbRoT_-'FcWJMxgPFg +c SmO<! ]{,is7yl+RKL%zMc=֣\蔶#~dVp~! _![:+Α<m+|Sb(Ez^En_^rL~)N"F;ZfOemNx>|O`,Bج;AuaZ'~N8[;JF׽H ))ҚL!½d mT0T*Q%%^ e8R,h#] q06D!Z".2Vo ".&v;2! yQuqh"h$gگyEM(r$ W'}hJ:0VE#u{w&|B<˻#%~+-/'ࢵUZhBҡnqRg.|ZY|Z:p.n oka(n5mi!~jt\ r§?F8#k02m;A+k/H+N;bq^D\]XGF)7JV`u V(H{o&"Bo D)V D+18 M!ͩ)`ݽ.h ѝUq5ɝӕ5{L$Y╊S*Ռͬ\|z'_ S"ϣTh"o~:(!Մ ̩ 3SȢgt*QB9MfFкG+goVhz#l&wů˱0RI jy"d2>o*J Ϧ9D|Tj@rە .\u F3seiʅTp`0d㋓l5'"paOV@ެFشM}] _/`'c b≈b5㼴f0mT3*]rWP /(ʹ@oGʍު!L*~Va^`)2Qhc 8Ćww/_! >]VBN8J;3s@U!ϵHHWV45֨fv, 1`T)G=lId{"]Ht-б$V [ &>hG,WDT-˟2ft5&^sb:1'e 濦p6v ƁYmjyiхH;9(t=jvieH!Sڊ"n ґz?JZ=# WbG(FA O9 @ϻͩ&!6{ \b=bī GLi&O x-Pa-DF Sog~cBtkޏdVՄ-Ƒ MaF_)x>:aل,|l|oRw,>ew¯iRV]p1T%Jt "B%o1&)KId2 Z50;֓!*e/1%Yr!6| >`*q%JEM^/x2')3Λk9 AS:!t*dT!A:ҵ@G 3X##j`w' a3l6G!6| X$>` +{y%#4xUea9QqDY,UL`O)KIhzV!Q7[>"jH'(;4XOXfd? 6KVkLJ8:yNENְW pČ v@֨}Șj=㼵kV*tQo}t,uB&ɬA5]3סsqg@*!5N {LxOzJ;/Y{)h&2Ζ 6K{<'t Ȍ.S-F,G9S tdT IB .Jù3!ηjL? lQl' PU""#ZQ EkNiOtRKusҍ8ҵJ;`_-JkQ[ȬA5Iuגj::p.. ]/~}.4VrNczr P2]69է>Aff Dyԡc]wCm'3iH ' YˢPJù3vB6gfŻM)3ޓ۵-Q Ry9b&4b6˦:4jg#,CU4SZҎMvN}f.28Ȟb=+|vδYiѮ,o{8_t 1V!(ӎ|J[e"D]+qܛJB`[AeJ+{y,Q['^,%9 סsqπ?h#%fb]E&$3=:6X^ [Pl-$h؄055@.VqUZdNVUʫe"W*% N?=4P<ϢMt5q+lu qj-n=|:ˆ](f]ITfs=S,zfT!$b3&#֯4v Md&orlYh$ȴJ0y(#Xe'ި &׆tYG7aC⪟hqɦz]AS2{yHuPՙw@p-#\4Шn gq(ӪA3Q"K8ERPƶ{jd E.h$qu+H / |Zbe\y9&fn]jgs+$[FV9{jju4U+{-OX/7WdŠ*%>CaF`$QsˆU /h$} LJN;Hn6g{zg#|QNSA˅-GHtdMJnh(-m\.(2?Cf>OHaReQ9'tP8~Yj>Gù}:]q/Q29'ɸWB;!Od.>Tipʰ kAV v| sv*ӤH(@:2u&PBp, :JPsŠETt{;aC}:kQdzN☲R NR.MT2\{#;dNuClo)2U({y%-?Gv֎I@jZ*\鳇#opLS^FK'YAB5N*‘sE괐U]7Kx%bnm%L\YNةrtȤZHbuh!!ف";#v6V-S- 84UC2=U9A$qиȹfPN mBU/UuR`k%vbZb,gЯMWLXq^7-(w9Ueϣ\e^ g\9W˻ s?uvWF7͕ l'PUL=jzKx*25fP.$.SA]e.l"`lN4-~sJ!2ׂ$ 毷cFIoJ~*mR88IJpj'sE y1zkZ=(x;1|\]IEVVҥ@|7Y4caL[iy"].t5/ #5H $-5Wm xY"$]. |I("$7]rI("$W]* +r((!$w]*RK;p *H $4edN+@H /N@{b 4H $=u]@ $@@P!8"$]wH $߈"T $' ߟ6@H $P%N0.H $@뮷 H $HoE#¸"$ ^_/d@H ފEeqGH $7`߈[ $  @H$@^z׿@H $ &j,"H $PkR*H $Z_&:@H ?@u@H 8 4+%@H ʿ8BH $O@~]@"$@H $@H $@H $@H $@H $@H $@H $@H $@H $@H $@H $@H $@H $@H $@H`R޳ endstream endobj 50 0 obj 26483 endobj 53 0 obj << /Length 54 0 R /Type /XObject /Subtype /Image /Width 160 /Height 160 /ColorSpace /DeviceGray /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream x\g@P7 { Vk|&Qcc7V4FbAiҹٽ‹x̙3|;;̙݋{}z{Lbo35U]뀏V)ٕoe>ݚT)$1#T"XQðf#GIWG Y +7(¶È#rȃDN3E}k/alx$ؼ>F5)qT};Bp'5&:;<8=a kCF翡,,Bo*RmSo_X'CP6.b?d|as͘a_Ƨ@aöme(ɇNW1+Hbj3|"̓'UU!5 m.7x06fBU@cMGolϐ5eQj68lۖplWT`nq~M6nd7~%8pر7-\ēv0.>Gm=\ð43ƷI ɷWH!ڴö;jW,B3`lx_cw!]M۸xZM7@bf A|^b|5?q!_Im&!Ot3Zʄ͆䷴0iB{6S+;%P KW(tڔö7-mH!]TtM7&qd@ H8^Hߥ%ƃCG!5_aNxR3b_F Ap@+Ng$:r?N,"OT$_Kv{uV4܄"BuR^~>+rS$[ םE7Ac68k&.!zRNߊa| K9~1lJg/:?&q&e}ЎU}{gwu 9U 9c$S2"V||vTr )MmIe"V@δF7(~FaF3\H)*U~ (a6p0 *m ")&79" pBm|q`5Ǧ6[Z N+j!J]5~zDߎ^"%.ǶWJqlSV]JFsnp:֩8k6Wց~efo84l#=AƅX :z6H*mVG7e2Q*8( e6n &2 MQ?4JSN;ÿ"dNXdHz{}Żo!G3nBӿ<{  9cڔIǏ7b};k6%J/p9bz|v{3oL13 c3fv5rP}{vmߺyn|Yƿvf߅tHOJIb-d$Y ֕?83: ..E⯅ӳ(_g[2R^?M+ +VUT/ّ~k(MUWUi3]s+é39qCM׌jmT⠙ t $7skFzfju1ǘM˅uH7TZpqќ& eY\?jG@^5{W`w0/. D5T?WR/ QS,_'%3jtP R6?TNg/ΧƱSYZy<1S"^7)]7U_m+v:{%*ӓt#pd~zu0qȸhYϬIOv"pdO3v<ƕ%_{5\${JeI|IKHuej=v1+(٪zÃ!ޚ@uO#ƔPyLG{c]SsPG}J4ž3܂`wxFB\ȮzϐߣbmeC?Qyu//˄͜\د5^NIr|LDØ'\?d)<]yWP+iE^ѥ˶v;ɓ ۲,_/op(R\j]+tҽ"~YڨSUW\h w"'rC c%vR![y=X-FmbU/f4]/vWI4W٪u5%=9S;ԣfQ` G[o㿝tՆ=q#^tӸSRR^|4&~͈3G޺q& ծi=גM8 3.Z[=6oٲU-7poPϭvuʗ.^Aa _ == endstream endobj 54 0 obj 5106 endobj 51 0 obj << /Length 52 0 R /Type /XObject /Subtype /Image /Width 160 /Height 160 /ColorSpace /DeviceGray /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream x\y|MWYDDZ6QŠB>NcJDRKАQJ(S3JH頤h1)4F$ܛ{~g}o9{k2=׿5:=pÖ6 bӮ|=~ԡoRKOZmv޴:e^x3usi| nXԷ4xu(V|9n@ R x_X!O*%Q(rTDtP䱾}+ֈ>(O~G${CAP6Z?QpΓU5/ b!ګVƞ1Š>;UL *-~c`*c]oLsnYj PlOe"!A WT AI<օ3\ɣ7R0I"ܲNtO9stC1@ xݝI#k!+7?T^#,Ym>7`ɶ)5ÿe/')EO|9 Mu=g>^*}'Ao>0TD'H</]xp)BfS'99\pnwŘn6WpHx]Y,8KG:.>٭v1!l>%5_>A?$@I0|R ^ZﮌJץga%POJ?(a鏏h˖[ij Z ,6 J; ^ӁćK`Z3%\UyuΥO(|55(x)XbW]E3 ^ջÇh|R ?} )|$@W_UFE>*>ajشC rzeJѷHN,`gH*۲#81@!6QlНQH忡}(Ń_ϸU>Opի/ }BPJ@}ڇPU%K(Uf@@!B _$o7gOvH@ |rJVSw%>bB'Cʡ1`r3qH6@8Gĝv/|?>i:S +O!8AN^9JyX<*!qZ [ W2Vxcá_ Ψbk yD |J{ s"Ty#6 v'@'$X/W [z=YV0o{_RK,v7,|p%9eoMdYu'P"ml1|8=l8GG/̆>q0W;Ed X+۞Mo(K]( )z 6~ue5FnKBWJWXm8D鷼bi;WxFcXXɣ0 ?־pLN<*9 E-Xgv7Hv0$MXF(ش. CIer#,b1)3)/^`(S qm4CRy+L (0SL%uRxW/ 'Kgj1g ^Aœ:U2֟5C8*L.gRP.pE}$ị@J%~k-jqA+ljeRϢ{㰂9T:hUde, @( X{!9sZd+e3>lJR"+rq[vM:sZFx[8r-~~>v@(5>k` '}n\a 9}I{2ү_MrǓ9rGw\o)y-#݇yO Y\626_~jϦؘYD/G6NtP> vo?v0l /4/ac'N57z}}L\n1HmZ1Zncq ؕ+P O>)>q.vqpoSbx=aG׎K<̾r~0(8A!%,w/A 8"rb>_- ;wHS9{|Jjjs:/^~r۶.;B la?ƿZ.nkxS_2#,kU4{(U gbp.'fKC+7 E<ͅ^匕H$߇t-^bV1] ]#ķ]LjLKaP{Qi >]Ac D@j?Hq-dE G.FuxcjX]zp r2u9Hcoں?Yuw3CK:?!L)}0Մ'JxG4D .ΗF6+8Eu7eBX!y5)lj@\O.CxDHLgڟсSf9Rkm/c.T$>: C%=g>LZTF"oax4 D#Q_VݵN[ l0 gG'Ja͎+@4vؑ Hvs3 G6gi~c֫8TL U+.Y* r&{܅ȧ3w29&v6lu v飌S HJwnqdKyaaA endstream endobj 52 0 obj 3218 endobj 55 0 obj << /Length 56 0 R /Type /XObject /Subtype /Image /Width 160 /Height 160 /ColorSpace /DeviceGray /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream x\yxEBBP@LhD%¹9\ .E[ D|`E YnPT@n;=3=UIg#랞Wq~џVhv 5{b~N%m׊7uUALXejG}߾?WZc&vbdz;uv^V=_rt^ɩ711Rǣ|+ݭ24[k,.mHU[iD+˓y|F48lA:b5 Ȩ7Jង#|D=ٽhzMܹ2hnOC7A˭MQ^@ PuyM/&~)Í$$WŝQˢ.< 7;gmd/k\d=\#+r'³ldz+ dbMIނ6C_i Z=^g4"ax0%5rU33pSii9VP6JՁUue94MZ'\G\U% jtX\չ]JZsA=6PdT9_̬rӃz R WmR lXOXu G*$v;t2ŕ QSbEdBIA]bep:3,Ϙyv 'EApFQ4g#o @0JMҾQPJ1hSvcQDڜ\<8[U һ"T,cX:HnCy `g)Sq*KII2.|;ӕs.0ҥ6x[ `-}7r|mKwyV:mx,\|<Ub+ /u q N5I̪ipfN3\_bH)~&|/Lv]?1bB-?)@W0>$yHpi[u9Sr{턿6?Iy 7z=A9U:,g?; Sܷ@l[!'bA/-;>4sɋ" Ph: 5F{K3 P h6śTӔFB-{,KӳET 4#`X7x议NEAE$sJ70L蹴4G;n{i2P&D\$_䮇VF9樭Of>{S<\1T 5kgx"C ~˲ 6vǾ3bibA>,G};cːs[Sl'QŘ%z!lUY<.)1(G+T`c3lHhSVg5$**]exϩ]V~iyb*+J ;L1SpHBv# [^X&_{H~$!k\Xe qC"kXX[^Fҷ| ) ՗XnoNP,vy#tC>mѐ Ua;oy)͂<@pIbJg@*K[b|3ͳM'_3pmYc:ձ#;Y i7v0cMA ^TLGa?& :FK+sO7ϩbJFI 3\ f'`@k1nݭ+t>,- XWdV#ևˉD>8+:/P7VռKhBLܙ%\:OfHlߒv V%3" 7FYOɂh}؎;`֦-/A{wz`P+$^xq^X$[]xAQO7EifcA^t.U2LCb[j_ڤ5?<ٯU͟Mrp9نvŸr+?$2蔌+S+B:!7c"hIEV S|: VV)dU?wʶy,xoO%*xH?kn>mnh/strbl> stream x\klE{+J ?$QRyc}4?HT#/ $"ja Mi$%Vh4- }@Z;3gvs[{dΏ939s{iJŀb@1P (ŀb@1P (ŀb@1P @ZPcxCG4-8>} l.$'/ P][X%IrBrǧalpΐR:MkᠮsXbm5wAh=IH/'㮖E8j%9i)j=Rߢ0꾝yRۣ8lܛ{h,ja@qjr!+ߧ#Š [€[RY,̰ 2~.ox/C<^3|3>h;|?&=9Œ rHf@79zt{<ɤՈ497HObc%pyղJhkp߱Rvr6#,׃:S>bmɶ(-?`xBFswh*:7:ylO;3ƞ< (su(MwZxh?tehF?8`S6(:􌦥^b"ӆV}aM`}hf[lVu1viZ%wkp+ʹ~u֦ 0]+1lZcRu`Yִor6cPe x ɖ篣O;M{ߍe^c}+gu4C'ϷZ:`I5P ?p;lx J/-~ Hh襧VҞ?մ jGfEd@J듩^Я:p7c m=BƓ16iڄ̈nj Dl+P̓MK!݊&}dS rFe'Hgĝ֚B;s"<^o&'0OO'W;@4 魦e#~KVGL}2t73B4]QPyЛ$7,&*ʼHѠ- ͖,xkNVh)͉u jn.p>4T&"gS9TA5f&w' $rV3T,blH59=x5JlWOMc+ 7r0}al23S 9t.gMws)!WwrˑnrP{fx#4AͰ% 1@g5=uz $6v]`LXS08xωKzC[x}ؙx~Ŋـ$9l59xrCۦM\pR3p!}¿C VidxMp9 pFqH5S9t8ysgMC\CM.|5nl]&BǮl/#Mز%s*SM̺ ڶirޡ2nrOBg(_]MN>i |\>r Fgkx E$rf"^Vv.GN |G=xw0` lw }@qpDWw /vC6Vb@1P (ŀb@1P (ŀb@1P (ۏ= endstream endobj 44 0 obj 2151 endobj 45 0 obj << /Length 46 0 R /Type /XObject /Subtype /Image /Width 192 /Height 48 /ColorSpace /DeviceGray /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream xZmpV>IIBHA#!H4jH)V0*8@[U'"؎QEmeԒ LZ0B bRCsʹ3{>9gw~LKVdw ^ifrCDm=5+O.+|HPM V|"vSH8+W}pO͐=!IRfJ!V PS/J;$[_":_݌EVMDk~+̳[-NzKSmYag_%0^,;22Z@eOkЬNF. czG]{NO#҅^4zG۲Kco?v~$1&r$'?9YV<|y~Gl4s#R)\~a8^tG6tw<酛Bs;-t|?_qv1V;>O &O78jޛdxVCu&%av7T/3h˳ؾ)  q<=ߎqj#V;xU3?{ϳ%Jx ۝U_^]":PHh~lrs"Lg^}Ul^M|* `?O?= ~R],? "gc_a@~rH~XxN}In1 t ASC0x1vnO1jN}9mVeҐiY̛kW_sL=.ZKmw ou#cT_oxTw'-Ȕj" Y6G/D/+Uf%q`nZاkp8f}I?o!~/6㹺qoi`7ٯM1v?f1zn&^&&m|,FJ$2gz$_~a0UudST=iM5° $hw" O GY" 'yn oCUTftֵ?t=,Q<4?̿A* jji;B[:aO-Iq8 snӿÃ@^,g@7Kf$Z뿔rIŚ#Va1-;6U(5cAߍ~CI)a*x͗ :' Ɵﱑ?IWp>Wrn"k 0mQdtc駟i0-J,5lb6hإ)^{ uh]7Rzz?;N.DFN*+30=ytm4R|sy%tؓ1Zy^6ZtT5[£'I٬?+vㄾ%<δG,i1Oq!!5H[wܪHǼ(Cij3wM}tr?g? /$;I"BEQޮ/BQ!թek@3Yc$x|yNHEgeO]5ubrj~<o73?ב=ڒolv{]]WɿH Ec`΁L6MnXw0ў2ޏkO>gxן&K3/'(Agy*QZ? {x Vk3~UeU?fAi\EL}*\f6nZ Fyi{w&5PJoQpk0H.O6$Q4.lz-yĿp1cvX>kIt$9q6Z[OTcfw| i>'ʼ\QjbFFgvɿ`Z^UٿggF́CD(K(k<x? 4gT9,8 d 3G$TMFs 3{X'|rظ / d[П+@hѥX#CEk7:BKfqFqwJ endstream endobj 46 0 obj 2540 endobj 38 0 obj << /Length 39 0 R /Type /XObject /Subtype /Image /Width 160 /Height 160 /ColorSpace /DeviceGray /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream x흿N"QſH<6@BkkK`m7PkM`0V j1˰ s3$bg⛂2'_"sbg_#dt /rzن(tϞH˒[oM]43~`Im6 2/{˘T2@/#zH\0E+;ořѾ{M}'V4T/w%6{0{Ez OI\u: ※yI[oo5^W' yGI_/nv6WhG1\Qz x{}DMW=__8/K ?|oq xhkqG2\o|՗MԽvuO_&7Q8񣑁Z?ࠅ񣑁Z?ࠅ񣑁Z?ࠅ񣑁Z?ࠅ񣑁Z?ࠅ񣑁Z?ࠅ񣑁Z?ࠅ񣑁Z?ࠅ񣑁Z?ࠅ񣑁Z?ࠅ񣑁Z?ࠅ񣑁A=?Nu݇A#[()jW^0DOG{?h%D{?(QO;n?hw곪ύQ̬,{1/*Z̗U;7)Q0YBTޯ,ZDyȲ~MXϷ_~(:yGsnìވuo&\[ Ms65/g endstream endobj 39 0 obj 849 endobj 41 0 obj << /Length 42 0 R /Type /XObject /Subtype /Image /Width 256 /Height 61 /ColorSpace /DeviceGray /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream xZ 啾5/BXm͈cTQ4 ⌉QhpttQ\@ H١( ^-w/U^9xN挞{{u@,WBP8EZ\9NLY1JԚzWaPRV1 010z)ߦպ; r&.SТBL؉H q Q/jgpܹ=zsQyх$M2!NhǕpeS[b1F SD0opvp0Aiޱ) :/T3|ZRǵKg2G)LcVC痿vw{,C#CzqGp)Z~W :zQ Onª¥|PB?+7+\?mMht}n-=7KLٜ^\zX=Vx W'9ɸn&sB.d$yKߓ\~a!'XE/X9qlF'.gVtgbA39E%%N'^.5fT 28ǣY 75өb5gM6ƴJUIˋqXc(+d[UtlPtu:;guHMLԸ]NJ鼎<Yl!Ur+N=]3FO߀j0."w"Bֈ%cg=M߆D*Z~a%J,dM˞<@bw}ȶb c*xE?yfߖρ:*lY}xy֣&c6ϳ.K="cN`鬱#m٘J%r ZonKLߥ`CK,b?f#׊a;V:'CE=d˭T9 kؐ& O'9^̲8|WAJ5T??"?n8k$Y立 yI4cDFTq O;K1M ߚIc!Lq}f8:h.eZGZ9^{id]א/k ۵V3me[|V"䝝jNץ,1+p."V[v>^}#ݜXҟGQ8Cjwl0Ek/Y xDڐd=5o'z5PĽ>jt Կx["~hDWfC !w`ݲ F^z? 4ʫ՚CZzA1fp^V{vp-#4Ȏ1ġ}It_,ݗ-cĬȣmQ<+)9Z?:#q`0[Tb|xd&gCL'`.7DmA&j6Ι0=7Q).aJi ~3.VV1>KuP(GaW,2XsIz6i>[ ;d F 'S\!}v#O79&>kv^'_q >lBQE&"-Bimbӈ2%qr۬2vˏjx`ڂNaLJ;3CxC45eU)ű2,2扳*Iby|~ ɘO޶Lfw|kIHW=ofBmaM%c.'y;jc[G-6:CFϯă}ȃpw,{=T?hgMIߑH1릝 4*POYCw1'9uJ>LA;>} 7?=-M0r4+AH.G|&bx&ejީpNrޡؿmQA:b:C" -6ßh/1A/+wŻ_ܞa54/5T@ wlDʣ[LADh;ӣfIixԓȇtI.N`Z>6ϟ 7G G3<JH;h2rmT}-lqp>%z!dK MAIƯBn9+9#F1 =ThCTiS" g!3Fމ|tWtT>j$EKZfZ/7L7JyF֬$5pXSFOWqvv(G;  hHJ܄. J]K?-ʷ&͎C@oS_AaքRv`ɚYz!cfNH|k92ʴX28>zR-zbhxfQXaTz\B퓝cmH/ ٩XRIVV9'/NwS˞Ԗ [m1YZNjd9|a>f܌EQ0ڰFxʟ$I<7ݑSo \T{NOղpPLDRR+ݾ5BXBZF1m`wl6˸3>E[RHS@L}E"4:I.!G'@n_+\LAZ 4A֨/ q^ӒAh2/ )\b(ip HqÀ [43:<'A8#* 5-Kwq$Է5uF~}F12U c!ۨ\)(ƥ QyuKE< j cFU#`\^#KϱՈBu!{!8&2CAB??$PM+>V|뿫/˷ rO%K M,ߵβejhJ!]V){ƳɀCs09\ռ;4fA?k&6Bޡk|(dTѡ#b捫CM&`だ хwz$rνc+o#raS> endobj 37 0 obj << /Type /ExtGState /AAPL:AA true >> endobj 57 0 obj << /Length 58 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf endstream endobj 58 0 obj 2612 endobj 7 0 obj [ /ICCBased 57 0 R ] endobj 59 0 obj << /Length 60 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xUoT>oR? XGůUS[IJ*$:7鶪O{7@Hkk?<kktq݋m6nƶد-mR;`zv x#=\% oYRڱ#&?>ҹЪn_;j;$}*}+(}'}/LtY"$].9⦅%{_a݊]hk5'SN{<_ t jM{-4%TńtY۟R6#v\喊x:'HO3^&0::m,L%3:qVE t]~Iv6Wٯ) |ʸ2]G4(6w‹$"AEv m[D;Vh[}چN|3HS:KtxU'D;77;_"e?Yqx endstream endobj 60 0 obj 1047 endobj 40 0 obj [ /ICCBased 59 0 R ] endobj 62 0 obj << /Length 63 0 R /Filter /FlateDecode >> stream x՝m۶SM9n|d(uN>Τ&}8q6Ino9? ZA{Z}_۶ꇯϪ՝{ɫz*-WkҪOٮVϋtZ*kvmCe,ֻͶj垎wMW'CvZjvۦYu.ݵBuͪj-V-Qevգ'vc]ΣG X>zZguު.7[v-\VT۷WRh!^o="5pT1zӭj.[U[]lv]/zs5y{ }|~bcK}X B(<]x {zoZ8ͪw9fn^!!4l0Oգ2ie=4Pi:u/Pz|Unizt#ҷ]/wuݠXN-~ WoU 9GA >D/k8.ġx-h+ҫBYUFf_7h+k/W=Z=a"+4_IU5`C Q&nn-frFr'r&|>&*h 0~q]*b#<ऐA1o+D CܘҨ.">+pו=rHsz8hnGf"2QoeSȐ54ͪdQifU;*37PqN߹@Mq\&ʹ~ՏRL)= ro8(78Tx^7uF 89mw$~ mW/khߩ{uz\>N^jaR3RTL1GIjlf!e[,X<v` !x ,;}EA"9[zٮuOy͘^*bP9c24 !nn1vB\'"5U.1ʘ!>:2glWv Lfj 2S@ 6ㆥms>bCgq(En9 ^|ZQ||Á% mmo~' 텤+FlhtZ!P<+n u,wͪ8D[Īna a- !CQ=)t@ $p1=Ǻ]AZ0Nd_sJB.!NIv2Bqp6u, $ EmD1| NGvb'kP7[䅱bNG1;#q#ٯ7R8xs=sQ!ΰ&:ѭ{M:\7؊Yj=iYƭF"eඩ9eN1> XK=L^6 h^J TE?%X_%-Ћi#:ԉJuR'ѫ2/&[[}F37aaB|q]i-rlX$Q t8,Jhha8|N$a37pƺ(LS 5lHb̫n^4 0I,| ']> 7WvethmWxCb()NCǰv ^1ס; 󇏥*jCP^&P ? gr[j3 ytt2G )e5k_k>-;oW8ZT2\C1EcpwNuȇs-|"/g=Cx?)6EӐ}<25ыg#z~;=m7DFpov%s1TJlY*xJ^rP{5f0.*CӋ?$nxw-'J|o Ld`d lŶmj&+o8 _\%8.3f4$g^CLCE-7hū|cTa5M8=hTv_BC .]3 }+L^X|*'K#QBG^nw'_evܽ G_+'`CXب1@K(A׉x:b@s̍ 5HZKl#`koO-ZzTxő )09M%;&Os2y6 1>^ZȔ< y+Oҽig%mv_C ĸŀXy@+SےUubܽk:HUCq䗁KGgojE05?5]_eh\z7{s]\40V&=#=oZ(Ry(nnt*Ls/ =.@Grx$[8;Uвq$aG+ըߨs"LKQղ%Ti^=E:jơ"hej/."֠48zK6$ԍM!kNXZvDľ4 v&y9 R!щۡL2| zQ [C^&vDwM w?I01MgSB-7 ?DOh3 db8@.)Ѧ" aCeB P]6V"2Oq<垤1N$s9 n rVlX1 SQH7KRYRfu}_7X|5Ģ q_ ^~,X~q+-ӿ%)zF!򻀇`!ck&A& _'!E`mɗ<7` lXGEFPй{2+}4LiCf f:!4g P<&\֔I.~ڇ ,T4/ "%$L,m>R|f_iyq-N#ZȞ%S׬oY1]FO@v?-pM퓢fG嶥5;26=WtDEwcza1ljöYܰ%j'ltSjQ],zܺݒr5h 5{؊F2r6vb١=`eDc-iݲ/ lJ#sU+敭NCvf=lED`f`cEhm:lXFVĶ<^t޴!AbQc֛U͞N ;ȼiE~ͮmtϛڐb0s/هn؇iI+I^pu&xKnߤTM[ePǒ7nKx%7hzՋʅZrwFoik2e&o:zѴ3}8m.lc%6qPݹ a򟈨 .oم £!%eLBf>W@lmJb]pdG1Pqi/ oum֟wN"[]Wė!!,@,Wd"ݥ~`H1lǹ5:6kd, ?`2 ώ!yl=Oԣ0_6[OaK}\gn?ii҂9 % 70؜Л_z@X.{DN\ced0]DT^lyp<࠱Ms8#o'8Lg825(ݠ[sOuX7K9/5fD\vC@l#ʕeZovP7<0٤v O}cpYN/LHH짢J@   U?AlcnB%~+a`r}#+%ۓڻc,am,'X&A[j+I 4jvdԧ0'A)I!FR[u9$%r FJg]LO4s8^C>sm/$5géi\GB[8K,=;<uF)&d8RawԄBSpbL$ V;1̾LJ S`4S(g5$d)6bz5;.T-{e7kO/n?^P핤:K(9)O ބ~Bp *=̱RJYX-YJo. `,OK۟*R3Et}].qpRNuy7!ZOvvakMmI8؉?YaRnOF6t̚dֶ̉t"xb ++Q cBpez-DƁt%>,gso(a' &魅9K C>Wz1 8_#Y ;z>ƓVz1a` \2KL74dam9oMByK3Ǟ X6 ď5/x!@ٴ s0$v>0ihh֮4^K;c\ Q ADtűjW&GE5 |&"bѴΛ< uӨ&!PYb,a%6eikYJeHF)g`u\oޏ8 8L d(aec6Sr͝y,0F Lm\Uk%qǦh[W3 |zvda M=,l CHZ:=qw: PcnʸY,ۆ)톓= cn._ׅSMefgY17eznd,uk8[a;l U ByAJpYꍬzy5ltr@085js Vnx},z4M#w:Ny)ln00/oD75u&L``8 _mߠ0>σǩ(JVbO2q?e7S~8Rv0;&ËR̬֜iP~ bƺnr|*mg0ɷ9Pwkd2nƾCu^^v;2v"&j4 f.&9WIЉwtY\Eh)I!K ױCcۡL:fj0),6d$hx(sDa9fc "(BΎj[+%5Ih[r\^Zc)|} eTxP+xZ&ovȷbJ[QYy(;&(AX+򤓚ZQXD{[j;NMр KRAaŀIjtȄ,IjIѳ)A(vZ$dOq`oq B }qmzM6t_)aDZ&k@zr9yaDHշھw@d~eo{?B4+* -B%yV,@>cV^YjDBh~XyM"|`BtD^zb%hf8I>"_V$VRaN slgbNaI0z tX\mafv-cE;H{~w{6%,0Z&7;mh$jIO96B]+D19y̓Co[%K b\\Nht:iTAI^j6C 〙pjdZb gl9yQ`0 )F&4'lƬO,=ͪM&%u!5A'" 0aXjgQ['-8(W$giv2J^Dȣxn@v4۸s 2L 4xsr r.r7{;zPK=q3yk ڿvk42k[9˲Y1cJvp:y:o|]A""1ppY;۟?Y/#9"Y`A}5@R`@t0D9˯e lwi5 h}pbw%̭܄uU]C:?ˁ:d޾r;B9ZZ&Y|ReOe=.;e_.#6%ZN[ΨCg" I2k5[ch j nn=c%;na䐹bDU:Dg>V"°Śs:H?S76CE'>Jn( O+}L#}h j ڗ[Cc9y.ǝՀ-;C3$A<Űr!21o!Z ui})yve}x?+gX^ˑBs>^ 툝a )qW߈&JLIw8/@Ep0Br:KVyD1DBQEaHK>ȧɒR#Nw>'Y4`*rɌ!-aS}4C”t7l .thm6[\3 Eo.X70{d y%ᅒy_f'k5bۦ? TÌgtZ,T}4y5]; VDmFIx(z[RKcA&&Ap'.F] j]ZE+%[$Wh1hMoް_/@ѲG<57EDl)7CV^aQ6TF-k*gZQ"nXl I3a<,$tF+S c=C } ` so#+ʞ OۍM{Hz1v/͚g֔W!/dw)xoAvki \+`W>և@!ߔ 36rvyÙ!spV'Uz `½ ? n`;Gp(L ۄAt2g5UH˜Vy'Ȧ;)߂DMmSHXOI!ª1ɽ=*2$8'piOWp 3OjI b3S8>=>R0DjIH'C|g9!m &yC16:ը#W.'u@v"%v z{}0ـ#"($>y@Tf3eB`<<4^E=¼:=q!+5/ZX)4`LBAH㆚EHS:mj؜9ߌZF P󑢭2m`hqOcDWB,-3ڱW-ZGGԩT>#*Q\eq7HvH *`P>|Qd_jyeb5Up4B[^$;6( Mz㦉\вWR轍J:I0#DyϮVߚ٠44״F @o^~`Mݵ-lEޛc\-LƻDTƵbsH\`g0ŽT76yЇb-4?ta@9pٴH'bU9?SNl046Þ/D}B ~s PE)I|^ftF{1o~4'OO&mng|=ia|ͧ -tGNx2zIݳ_K_aOd ORf$2$;\F `7X?l²Q&ka\xkjmeϼߦzT@! ~+s.!u`~S4! jҪ \<ϰZe|7 > S Y C0- G 4y4=S9ஃ|j1 `yhj9G#> *la*hnd"OGJ~Q$GYyZwF>6s/oU,{44SYDBrŲ,b:͏K#ֻf0Xwq^=_`isXU b^s~>~X֜ P.^ס@֨വy* +H\X`}I BKK ĺ]~mIO6D{_2©Ensq|'Я`Wު-YcOǟ4xدꋾT(} =#3LÿHYj=r^&Qfk :0q:Mi_hMO޲{(Sz=6L}e2 "CL$ ]ƙlt8]%_9c1YNOz*yp'5]OqB yr 345_‚31kk(ݨ`hJy?kYk v_lu07!'3դ0v~Φ1CegPut0O玲R^&9.p'lI}ǑYrMF Rzʕ&,=w3w0#h'Egs(bN ɠ] WVO^ByjR |/ΏWZ86nr0=s86G.oմky6> &-R|˰nXh`B9)|)3EVKh,w9_GnVr7,A~.xKoB_in?I.˔ʻbY8C9݊@2k)z[UMsdSpz?t癫*ٟyM>~N<_{τB/L{!uBӇi{.WC<`sg}޼[u> Tp[K}v30k4"*x`q |Oyx# (r 0jU(qBq僩a@a"hΙ6utƨU*vnDxQp| edKF+%E-!eT-D+!F`&5˙t!,KG F^[ ҫ:;E*Pe= ַj-O@SDcSGExQTS'LN +w7'Jn&:b\\7[="7]m `mwebi:E0WwIcjʚJUHUбmk׷q(o\avmꢬaQC)Y}JF6 K^򪟈 5,tPEE-[gydν8="s[L;_{kcl|@d_r){ dW$DJDB++{emof- `T2.,YKH7,R'_8xŏx5 *tE&e(ʡ$=LDŽ%b"H#`\0'XrNI $K>0#nAҘ+M\+%̉W[КYi!Zp؄ASOj:`Q$1Bs:O8͜A|H0;ci>!O1cg"}Q#VCmѠDs.>>G'PL42|SL%?` y9C 炧5sU;dh^1}y{ s){W9>i14>BGJˇ8 C!φ ~Ng!QŀuB7,SeXk}COn@dpWf,b9틷GFoA}Iv17`:Q9?fd$"|EV`@1BP bH3gDds<̉[\`Bn`IlR]%rs0?C7H+Kls,_ǝCʞ7,OTbB{~@z+,JlJ%Op``,,5 gS_ EgW!nn J.^8Z{ /u lIް`~3Y&qF5-Ӫ,ͷ[cΐW%\2,l,INnWf.3:gb21j A]A smvEMb<9$|ҎQfܹOG ݔ2JZ,V_ak֜,p| qjWf]gh5>"SVAUW(SKcm˷R]ZNf [y^mLONjs.Uȸo p&LkmqVJS/("X{^sܵtm F>σ᫱  }](}m-Iֹe?hHɲV&{UCedQ*! ?IoɵdG|@`f`BH 9r b<'K0yVA!1/̋|5dJ7- ~&>1 4mPO|V=TL>c|sj6`ܼ#1Yj|.AAn.|`n"}?Fw)?`mmsvPffj}\ .ؾ=(a^}*v9:eY7|e;0RC8 3NzU,ITbQU8 60&)O< %\>5e /99noggݶ: endstream endobj 63 0 obj 13664 endobj 61 0 obj << /Type /Page /Parent 3 0 R /Resources 64 0 R /Contents 62 0 R /MediaBox [0 0 792 612] /Rotate 0 >> endobj 64 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /ExtGState << /Gs1 36 0 R /Gs2 37 0 R >> /Font << /G1 21 0 R /TT8 65 0 R /TT5 20 0 R /TT3 10 0 R /TT2 9 0 R >> >> endobj 3 0 obj << /Type /Pages /MediaBox [0 0 612 792] /Count 2 /Kids [ 2 0 R 61 0 R ] >> endobj 66 0 obj << /Type /Catalog /Pages 3 0 R /Version /1.4 >> endobj 65 0 obj << /Type /Font /Subtype /TrueType /BaseFont /OVVIWC+Garamond-Italic /FontDescriptor 67 0 R /Encoding /MacRomanEncoding /FirstChar 32 /LastChar 121 /Widths [ 250 219 0 0 0 0 0 219 0 0 0 0 219 260 219 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 760 0 0 0 0 573 0 0 323 0 0 0 0 781 677 531 0 0 500 583 0 0 0 0 646 0 302 0 302 0 0 0 406 406 271 406 292 219 323 417 229 208 521 219 625 427 354 406 427 302 292 250 427 344 531 500 333 ] >> endobj 67 0 obj << /Type /FontDescriptor /FontName /OVVIWC+Garamond-Italic /Flags 96 /FontBBox [-217 -315 1129 993] /ItalicAngle -6 /Ascent 862 /Descent -263 /CapHeight 644 /StemV 0 /XHeight 410 /MaxWidth 1153 /FontFile2 68 0 R >> endobj 68 0 obj << /Length 69 0 R /Length1 24136 /Filter /FlateDecode >> stream x `ŕ7^Lsjf4)4stOݲlK%cKXotXL0bv 2@l &1XB$q@bHH#g{U#5ڋH$68y5$?^s; !pxtö̾>o]Ù}^Rm\?8GBZdq1vLdMS>udyK{ N,\ n[) ixtd~1_P"̱BmxKJ1o3t4RvܞoOQ 93!d#e1?zxS HaBen9 mm\Np?_*eRt9̵Y }؋ހ+Is3#:!LGviS4_xV:>$\g=ϒ?#6oxi9__>`~y|w@'bz}|Ezf|\jb|_s#80Sm{ ]NhjBS3ͣ3qRӮΒl<hsh9i:sӮ=/G0h% Q6=O!M ɛA3=i,H!|bzDSL{NdCE |ysxHOϞ}zD I[~jz$ *g758p2uDp}4bvivF˳0bӮW2Hkzd;t|~ܣ)C{]hupu`&ru |y0KcմymfEQ6 .KyVC<BP,X-챟~{=v{vm챛cc5U_UNCaSXfQ!(xVVp QP B ۦ.Cm׹>`nYSBj뮳 dU7U2rT"mJtUiMw`;),mKPX!ܶty[]a]Or.(pL.pL.p CcO X&ںz& |v_۔˽,F,AR˥h5eE0{KJbQX&kěP K uT N.v>ӚKn ,F.5. ˡPA 4GߍNH@r P۔W*w?pzzO|?;=9}%sJ2σCR(/]Ӎ7(C S}KX],}8xx}\6uVzZ)=C8̏Ĭ>^s~|r8_ݔWIk._czC,$үXo\Z 5 jjSOinJ) {ݾ߰f+ؾn@SDj~)a) GD"Dg#7. Enk9}?Fw"D!HgO3V8.g9 #P;G&C=/ Bt5^ D$% pPݏF 9~f,UG =UD. |\Z~*G 8@!h/G}b|oGA?vIыUI sHWrA+4|?@4&JB)GQ@%݊ELAK9P*F"ʠǵFd3lѣ)]3VbA>xO{pWpE z-{ Nt';z .XD>q3")r΢{rrQ*F55@0s!ytzMgG`Wygخb3ggfwa|;>ƗD5zbx"R7y]6ܣ4Y) TZ`ZaǝoJڊGc tP0ޅyzy*lO)؞B߆;}p7o??I> [>l›V<'2~O; ooxY6l1"Iˈ.b%N섻# wGgW)+ERҍzO0^||ߚa0̞_ T b1F: öplGl cOٻ=B&o`D߄ z ߣ,f/XNpƨR@ք[p;^W~ mQ 7m|@#8o ?K07[/c%D}jb1bq8B|xF+%9Nz0!b&7{m{G \X j::Oc[[2yL9c??0c泍Iv>a$q~ |KAM}R7 Tߠ OK_`\`DnSЧ.މ?%n@w)e‚x,?/ q-j1ACS$Q4kpO9O ]̔[7%[I1SRV*Tu|43Y/nf|v<NY76;5ոs$ (>}빼(:ͩ To4nrhLUSY8kHM*4CRCSKO_^t ׯ]7$d+Ae)V{:>0y UWNFjJ;kj}ɚuN)e~=ݲ\ )&T{r{ekFm{=k_.t{;F5Itd`{Jm<eBwymYǭ)dw3hr3-EOH2j3a2\\AK=L@cГ^(֗ue0#0`& ):ܓ! |dp?BI\͝ɑ(%yѝSmQ=CB #];S{f:4cL̅3ҙgU9?"!Ӕ"x͆Ɗ)l9>s'>Mсɥ]}@ՍՓ>w|n7ymr4ܘsSwm0SEј2vBLvrm]e,/Ak_&Q8ψ[㔈l+#c@lŖRDKwP:HW+F|an8>_G@eԎ6@:hF܂hބhk@: h+\'_k)<t.@ UB[}kY t{{Ha!\Kh/~t_8 4"r,0 PSF>ۆQ zINj~W^{13ҭeQeG Lԣ y^()IB EBbE) p6ֳNjSuTHX.Mf #or&4`b`tV$屴H/X(yrR~PXP(5(˰ť.󆂡̆!ku%PӀd}S!F6O5O&1t5.ƐpI҇÷Fka7>ojtƸN4(,^Hh^ av+i;[fQ `^׽R>VGciRxIq(XRQrW^;ӏW7x%qgq_[B*"8."f1zfh"rXy9]r c$~’Z+Z`}^60$mrqy(Xh0|n\p!mT˨@5nSi=;;J<|P17wMDS5ج<Ϧ=]SQS,ZW' )8B::a /|૪ԳsVWO ϭxg?O?ύ޻#?\=^g@ߝVMkvn=:ENѧS)))yy9mUk焋E"}]T]T_\^]// ..GQ({TqTy;:>9=Wop nC↸QǑ5-mw3٘ټyYшX4F&5o;9qC]^[['Vl3k#ȿ6NGqg5>81#ddM~ E\PPAcc4P,QC&@r$1I[Q 3&FRš-f6f4HLJyph] @@]i3ϫ JD).-^ҐP7EujYh~5PWE4j,DE(?&Q0bگӷ2a͎*t&";P]idcsj#^_VVP,a7Y=Zٳ.ZR}}KfGF`A3[Gu4v_i5M|>w?m G.)ӊ\sNMhZJk<L9$%UJ6Xbȱ/qۗ,TZE &(^а=R:$~3* eϯYAʮSy 0g.t+^!媔=MUSSlK\GSLU+¶mag!hWĒ˫W\^tS/~i5`g`(8Yzwaw4$ψu D6A]e LVlׄmoB-d Bh~-0R !noX%3X#6+ mm.軁>+fpor ǝ۫,^9X-`!Ќf%哞26+/˜R>? )K|Śa(&~vT׏rsp\kIYށ|%mTR0$3pH a)%$/qCA MJlP(j(,ɆJl^ L#+YoHdt4*J%-fmc~9aC(zO=%`3q/ĂFڠcUTGrJ5߶ѿbWWJ-Eh5Te&HJa7hMrվ~S@*p>CC Ͻ 4y nk:xOb6c~|if,K3p}z^SJ(dRI, ($! D@U' 8(C 4!I0AP>$R$%h,BFc540:%#N~RT:2cW)QC+x[H!m]m~84UUpdфhA|)QRQUX#;VUf ow^ ލ,LXZoXzYD`lE9U\9j%e|A`iCYL5k\ckH?,8 ꜝ{G~;1vKXT @ZM~D -G?k%(`x5JAW(r%Rm_+-TpeBZi&v*8[IR ɝF7vw0i!rZVD?CEtХRR\:~\)SLx;Qӳ鱫/)~@QN>3/PlGI&yaDV%^I1P j1!{s,[iIe]<ȳ/m8)\fFԔswǬD׶$4xឫ+ѣmL,Ɓw}Sܗ9 n6:߉U+4ʰsjl\C \ƭڡkVӊac?;jN[qZXe{qgO7]~bĘl#yψ&مbGب oP(P*,1@c/]MN$pFhT/g A)cWDN d9%t[(0'0"x\R;lZVGG2 @7c8XSHt H>(`2JCbvɧ#93iW4j9>du7j%zMo\3#:rTE_Q;=4&smΛ:ceEG+*T_#cy8ll#7eDu|!bRհ0,g:W9@]LpD劉ɉj#Qq:KܱΎW;(h\}G'5w"] V:S_V4 w4V3iVX1C-3`siscf&ԜLOpk~7WR6[We$l$햬`d.% Kc01XBKxN(bۚ;d7YìZdn yNeFI|aa g3E"@Y FAJi{omY׭5TUy`(Ra[z´Jkϩ(^gq-b!D i uPJ\戴U&+ׇkkfswKXR$MYtCI'[e-˾ch$㸔ܖ!B"thɈQEr`)3[MfYJ!Di-u IAHڡ$MrdR幖T`Z;(-.˨\DzMƪS9ݏV՛sVAUE!֢EAB9$(6u\YmrzC`x)_CaV0E%őۜaՍ)#j#Kq'_[-9JG#b;v(v(Ny6[[`) OVJ֦U׻IEX)V "Y sX(B'lD]\ɀhoJ'>7_ysw.O$P%[v8+„Yvj/E gŒNGRm*ɩu4>5&YUn}y&lB+=x%8=@y_t-XӘ\.| ˒X͉FywE+IzH[Ncv:ڄZYX0 8I8!MGjUj͔ЧCՌuվXjHK$'YY9a"I\iRwXJ]n) @XIWʁpTZ? d8! -/1LD_` ?XrK2&LLiB:!%jPC@;[Y A4vѤxLֲ$+5#>^ѵ52 {;E:~01- ~-Uh lYK| 9I8,r]X([0;u bؑdpC{5W~]QpnN~A2R z,m!/)~WeǡCbBf +JDDa :Q|DN<k]p$di#|GW4;*uտhacTyJ2"lfkZR tElMEkkZm_ZwC[Ӷl=O)isLa3JXQ'*`feD' TS.LXS%CGS6UŅ]ìErxI^k{Q#絩TY95ū|)uvd $i-<QV\[ea0󨧛`2X];Wod?ى0uqホ%~!~Sy Pѹ[u@U|IKXR  OosMn$ƒ[Ko\ dtk9^t,fٕh]vn0ku7qsQb"mL?v9]-]7ܵ[5{5 Aa`9 "}ɺTХPN "%n܌J|a) ^·%l$iQ,8EuPȪCR+hA2,6 ݋Hv´l*V Έ#\[Tǔ dy3߿)'TKY=rK_-%sy?o)$5vNz!5PUֵm֚xpj8{] DYE+<]iPiW,D h(֐ F+O`[}UL$htU KFXQj~XVVE⽰p80< /j"\YW82]jEVeTY;43B'Ab5x-ⅅ<2%e'J 6E;,ZƝB 9/\\Rڪ6ʥRL@${4,NqWc Y/ٸ"k+n!X0g*1]UzWnxcv=OJ%Rj@Dg?ayDiK>N:XBd~x3h{HWj]iS994Q/.uOl)id'/yzA/Bn=*k.&4ɘ 2(G@ɐ >$Y. }+ W۵1mՆJhN6g > 9CV ypks؃XMNI]?;?^p:*!,F[O=8SD0g"Y+: gʶ (yrgEVKrK%K^zYbE _i,0ܳ䮺2{4YP{$2 6A u.Ph.J:`@J2J&ȖY2Jk] R@Lm-V޺9m(I$k/N7 9pY{IϲnFe&ނrE,f]p)]DX4-#<1u6WV`nc*:N-żNcj-ն@p-OZDeKOJuqKYz3|w]Գ2C0-'ASb_o`hF Oʌb cIkZߟ#O4([`J0vs_/w?A~iEϕk|+;O`8F&`RR0&KF3R&'1;ɨh:LS^cTCyM+,VvzzuWx2r5[ QN#GJFB;|*TWVW!VVV`}MC#7oRhnڸzӍǛCCXj~+oWvÍnmiO=KsǞ0˃xE2UYsɆІԼ)lbMK;J~Eתkӵ:tKtCaJ\ƴJ go7OoXbbo6zQ&XYѹXQ &k&杔iO;K[ޞ.1VWѡ͎Oi9xm{L={LfNŴ{Fb舋IFٗ)*4m T,;kXZJ?m/$#D:=*^}', 2,VItY<̗ߑJԇiC:ehZ}ldv]qWQ ZRꔻ=ZZ5fӵu~ݟu%R56R^PJ%G]d r`UԞe52P4De>؍ސpA(/8t:a,~+8.Ѹ7:FW#i̭SyD*Y+8s|xGn{Y`hu?rGjܽn[rK~)X3 ,E^5)?"F2˖Xzi*qX2ɂ@*@:Bgoƻy%5 o&Xz,15NmѠ`ү6yزш)2BM}{s6-QM*=ies0X0Y=9坟ق>x0jc>`2KFpWi[ I+hg6xdiţZ>~.A)Yoqƭ6Z6v7op6+fs8Òe5:.II}T NL#$ך(ub!^J#Jo<L$zSz1IP#f .HU *͎]3>df!-P$`5,6JCLkB K!B!^{ˆh/7\[n<y2^)nwصoԚɏwwv1 ޼tE=q:BO7ZvOl/)bT^0,~bEmhokKsAXb ْ7ZO쾉_26`ZnoTu<߷F'u}ktnMb$3Eݛ#8e.ĝe\H}A_2," eͱ*c$gʢ Vp69^ J?0!}.ya^Z-b Y[,jy~rix-<:¯3ٰ.M7M%*c|Πh8U1nbYk;Kn :#`*{JL×Nt5mw]n608KQ\"ЀՄ1UTjUY8L~RS*- ݜWe!A#o}/";ICD~1?j^_ Tig835TrNXߘ?=o|f@ }f֚5jYsb͛5NAB(]5crڄ0. r9;@l΄d! Πi@dLd<$;[  B !-5u>QG[*}=1hL| jN H>bW@r5{* ~[UXKܙ_/_UC3YAc_?8!ϭ*s ZMJ#Bn5=-4'͚k~fu&Gٿ_{((=2^o)VRZ<ʠ2q}\Ӌ\BXe^s^^},`IWά !nllnlH/y|e&'7vK%ҒӘH_Ҽ{ެR*LΰA0pv0QD1=$}&ig4睁X r D4Q^'/9Q),_]Z8\x_|!)ąTIIfprv]J_NJ_ˉ,d6=~dK¢H Rw7{]; ,zي)m#%Ma-pesכTN]Miu+G҇ $k1Kr`%-Hǒ]aŞ :m +%d2Y 30|jj&&qgDFʭPzUi8m)ZGY8D!)MO1AU`NtZǹiWg?~8mD[NxmDSDTDe0yDz"ZDɮv>C1)qJbs :D`ŢdHܐ@ymT]ޯu՚&>pstMX2qﲹ7mji.t`;a}b."K@"?ʪjub2PB +*B!gJ- 'h3>*Tb xO"tqމnX I"PQR^[+*^O.:tǗb& TFaK_4Ă'bⶰ5WbKB^ v '%# ~,Ci]p[ttsjsLsl6mõne1[:oXYւ/fbœMھl+IZ4&<& 1T0 mCJ.Zi2foNu)R V+ ]t0(g`g3#$Bva鉎&UK&r[eUUV-Ri[%;inhѾLN_JKve M1ӻlm Nrh_3"+H2)c d\+rmne$Ϧ6$paOUkQTŶx[^`Q*iU;>kLBn]1ۡ5|kWڤoXo3MW6CGڔjFɣsq?K-A_8[8 )(֢NSKl $@mЙ DbtEqX\H۩_dx[1OpdGv}a a2()bҲEgbgL 3d&*Dd^ʄhdWɃ R  s؃XtK|ݭ.gaVkfUt턻3hYi.|kOUan)Y^HXX$jט #c]i./Z+}`ǭ ?hVja I"KZXݔW&[rZrme7o:M7糟um8_4[`M0@ tJ6k8]LT_ˋ^Hj>W`P%Dr:A.ەNfwffg?@ A"8CzJ  ~A;`ew^7+ ؗX7Tud(˶s|}@2aɃ_,'-2+UJQ"&P"TSDUmT+t|hVҎޜ] Dy^j/-7Zo\e鄃< ^pSۡB'E>d o(CjNӭ9.q.IDQ8a(PZllku(ib>b[t:,/)ctaFLW&ƅ2&օ 7&>V=whB3s;_T.']`ZJ)#`47p5'Gy)G@e*F dJGgps9WLƄ<,D>u_[H`Qb!ގf*4zlp`?.]?Āq81<clj=SGp&3#Ygݟ@2 uƺVf0agfA Pq eCB^>"Du#k b;ZDt2 喍G)?E,8B]f+-#>mZ£h-8||56?NrfglEPbe O O50\w~w^6^;ws:\ZҁZhMhox+C .Ҥ3ܬK8neDv:M@n$"N0Q0 \^ǐjںZR̅ՆV4J ]\+hՋeB#Xh͡EfZk[zq@ ZB*4 [_UPjeFEk@@։İ 䢁cȞ<95VJZYO5RQHu endstream endobj 69 0 obj 18921 endobj 20 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RFAATS+Wingdings-Regular /FontDescriptor 70 0 R /ToUnicode 71 0 R /FirstChar 33 /LastChar 34 /Widths [ 891 786 ] >> endobj 71 0 obj << /Length 72 0 R /Filter /FlateDecode >> stream x]n wd,]R*U>Tx i*u/s|p׸e0$8o˽j=8þ\0EPB֒w8<8޲ :Ö7. 58hݫIW zGs_Q=!P""[$X&ȔZ].apF);x4SRRIb 5MǏv˙µ5\`s endstream endobj 72 0 obj 234 endobj 70 0 obj << /Type /FontDescriptor /FontName /RFAATS+Wingdings-Regular /Flags 4 /FontBBox [0 -211 1359 899] /ItalicAngle 0 /Ascent 899 /Descent -211 /CapHeight 799 /StemV 0 /XHeight 599 /MaxWidth 1443 /FontFile2 73 0 R >> endobj 73 0 obj << /Length 74 0 R /Length1 4108 /Filter /FlateDecode >> stream xW{pTιM6&$eQrM@KHIkۄaQv7  "`&ے:U *zPlhflk騣ѱ"6{o`廿=wsl꾫C[źȺ2[S[7ol[#Wܺʶ3Xmӿ7vau6!ϼ2psvnhgb[&u@\Yڰqi>DB?tq I%2 q%1K@KyA<2kyխZ;Y ~>RJa:}ҋD}Do}t92@I l_ ו[ /ڰ߆lxֆ6챡ކ:n 6, tz7A_==}4)ht;:^K ۰φlxچZlɆr$ @GC_B_@ m+u:'fܫ$w+]JrTd\$+Ɉ +שUMVNQ <5WQ]jTTUUQ*dLB<\BƉV 5f}5-7$9! T9Ĩ%J?=Up+Ը8McI}2 fx7iznP7z ]Qj]A֘t)#5+liu{"yJBO61~J/NȀ}U*3$5B(P1";Sy?8R*Vh?m>NBͅh5ЧQKk-"#G0V CY] f-|Py;Lp/F(6B~:DLH/FxY~>J`ǑbփaiY6n(jN> ~R҈#W:QZl04seW5+ӟgMu0F!_s_Y7BTtIkg #R)UFmdB `@M`Fw= K/Ro> }H0;Y|VA"n|~Ov' ;ږNG?7G%V qaO8 %%։^xVbaT+&BV١\yJy-m6僗hXmh'%UKz2B< LL6RH-gQmd[.3z=#=v}i.<^|_#oZ?_Ž{Cp<σc#LB"*l ao+ťm~J<'~ JiMꕞƎFe')#yP~_S&+ytlTiV:zQXNC_M.) vÝB40w*5|fb> B)Z&JR\HWl{IAڧlfDž0* OJT#Z-u(YxY}yEQ6W |땞B@Ʈ !G2cK %7-+S2-uE=ڴkɹr]Y4Ȓ(pFހjFQ:i18bsD 9f>CL?2W]33K[D|^-kju|Z,o VhƨվjEZV3XT @e=TZ:hA+łj``AF^0u<2Ba f46n'UdYV XrXhk С^-=rQohI؃Q>ͤ$l1@QVP>M]ЫQ,֔AKzOiZ%{n=ʥĒ~ʈϛre3̚h83h*1e-T3sDzk0nr^NrÌE`gH.]K'l}+= \:Of.bFq1kS,-FVi|FHriFSFa<YP)xUSm/"KˏGul#8&j,Wޤ@pRTh h/][Hu-&bC=q]sT( m) uHäs0&Մ77w&Z-D|W\\O_d揪gm&Ѓs[TpՃz5"3Vg)o3m,'i\8>!*8_^:gn'ГhEF-G;i\[Wz3r$͔Q2_A此t˗IPdhƌ7-!׉ Eo}ڋ\M߽* ߎ bel`8x9P%>g޺6oز#ֶ[0ʙy ZY ѷ}]nNӒ endstream endobj 74 0 obj 2691 endobj 21 0 obj << /Type /Font /Subtype /Type0 /Encoding /Identity-H /DescendantFonts [75 0 R] /BaseFont /VLYMPF+MS-Mincho /ToUnicode 76 0 R >> endobj 76 0 obj << /Length 77 0 R /Filter /FlateDecode >> stream x]j0 ~ Ż=@Rȡ?4xI04QC޾[Pl/}G"6+|O!{k_\6Vq_ D]g"k!]qWW 3>/cS-/,B'0ݳ/nنXR/> DJ"f!gwOZi~AmŖzGrէofd endstream endobj 77 0 obj 208 endobj 75 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /VLYMPF+MS-Mincho /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /W 78 0 R /DW 1000 /FontDescriptor 79 0 R >> endobj 78 0 obj [ ] endobj 79 0 obj << /Type /FontDescriptor /FontName /VLYMPF+MS-Mincho /Flags 4 /FontBBox [-977 -137 996 859] /ItalicAngle 0 /Ascent 859 /Descent -141 /CapHeight 762 /StemV 0 /XHeight 570 /MaxWidth 1000 /FontFile2 80 0 R >> endobj 80 0 obj << /Length 81 0 R /Length1 1768 /Filter /FlateDecode >> stream xmTKU_N$]ak A"G0I&!?FA d@ EQ RlOUOB@޽u}{}W;E^$NϜvƮCkVߝߐ56K.\A\؛N>ǿwaƋ} ?BfRӳ3X[=ٵ\xc4ȇ|TOi{Ѭ5a#6q `{z6; k Џ5 괬*{s{XӛFwtQ5)&z太Q12$Ԡ#hROqYz),FnJӍՆIɔҞs,Iqg݂q#:FcLRKtW"0Pa:НPmp{-b %coxHS43O@Q2)sﴌfbm\DwŦ3#!xVͺ::(&${ df]8 iP<09.&#p/Ky (("+Se@'d}f--jurܹpa!LX-<ʡ4.'Ģ=!:tG/.ݳ|ɵKD$ endstream endobj 81 0 obj 1217 endobj 9 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LXOAQP+Arial-Black /FontDescriptor 82 0 R /ToUnicode 83 0 R /FirstChar 33 /LastChar 70 /Widths [ 833 667 667 333 611 667 778 667 611 444 667 1000 444 389 667 611 333 778 667 333 667 389 722 333 944 667 667 667 611 1000 667 667 722 833 722 722 333 778 ] >> endobj 83 0 obj << /Length 84 0 R /Filter /FlateDecode >> stream x]n@<,EĘv"!(U$/}` o\ŷ8sᒿ>aueiu0%]%צ0fš[ߕufr˚·\Ue?(=ĩMtmiƓ{zusW糺v1_sr>"a=R/mNGꦘ.sӥO):Kc/O-6u%/uVm%IDYr;n$Hs|B٘hj{%wH@FɈj Ʉ:=H.  ^sZ 0'H(`(5d@o~k fوbPY*5`~KU2^A*jʹZ=-*peK jŧ0 %^z: JN?d,߭^i?. j?ms4Ow endstream endobj 84 0 obj 453 endobj 82 0 obj << /Type /FontDescriptor /FontName /LXOAQP+Arial-Black /Flags 4 /FontBBox [-194 -307 1687 1083] /ItalicAngle 0 /Ascent 1101 /Descent -310 /CapHeight 978 /StemV 0 /XHeight 733 /MaxWidth 1722 /FontFile2 85 0 R >> endobj 85 0 obj << /Length 86 0 R /Length1 3668 /Filter /FlateDecode >> stream xuWy\G;"DH AD@A" x"HJ Hmzjt..ֶZu]Kc[Z!} 07}1eĎ,#ls޻xᒞyJr{96O)6/O\7\ow}Ғ m۱.\_Osx酕_DhAfpđkM[ZFe;D<&5|rIMX/ۋ/xt]hcc8'*$A1p6gI8*'Y@-8&lqՊ ų=k(Ǭ_Wq^!ŵ8k l'Q)8"j2oWp͓7C˝qӃ NDC"~zED *B^!#qVD<(!:r$Ia#|)p;;|"!GX'nzqX,֊(?SgTJ/$tS"":ʹ*h'R,#UG^%㠕2I@oB$LaaaPB#RVvV( * #c2i38˵Mt1ls<:&<<2,2+H:?|NC{#6!zI)~{s;qFa;<۞8ho!j:}9/OoNH$ F*T5!aLX+x`!r-Uk sc7NT/%;篆,PA輛>#theFǣo07cz:ڣ`ڙC$P2:gosܒ %Ķۊ>Z~}Gm9toߌ2g6KmNX츿Y]~b={^#ъ~y8lBjVBXcβQ >NT!x9ShAb!ns=GK豣gN6w?}MPc9'*Cȹfĥ_<)y{]O3t8skA[qEJjt DmǢwĉ9yU/{a.O?zJ? :v{cW]XOӭJ S7OapnvFMӕ,|9hGXZ Fˢj49lj5ZA`y88wY5@y\FSU9S$(L^ n>=bϨ}-x5wڨ@/uKޯjvGؐUIWi0CK!!=`beCrrbgaM~Jc)X >gcM_( $YE`qh*gV2,<pʅR<LpVh&%c7C#tt2e|':N^9vDr^&OMӽq{?1w]6@NkeWU6fD=egqJGPэo֭*zW`yfQL:*'jԡ.%&mM q9 Ʌ,Iy _\;bKm'ȶHyH0B,b`y,B?V񔢦ރ^͎ ИA~`D-k3L63G;귯^ ?!>yq ?Gts0MBGp!Z%ononV??<(euàs#]hX u7ނ$ Ŋ(fH^y> u5ԯvMU|.ch팔Eə[w4gOpGVَ8]pkW0L7.Šy 7sr=PѬFCmSIawO҂Q+֔.Z2I\X8 e71?V[o>̿k ˉ+!:x{!} $-\9W;yU&DQճWv:,2JJʉ4l]-tOvуLay¤W,\fWxu.aOrˏ/P3elg/j{`?{_E{a:hx Zz~Bк`jڼrӳwb *REľ([G't~jG| *1EMr:'-^7EE~gҲ5̍xHZ^uC TM6:~P_- 7c2@Bw=9(wfwoJ4NK5DZyK/9q܇V;xƎ?fVɯ!~WUՒ35iBC.쨝:=@Lֻ|*%jIgbuqR XN{` Z׏ni.􎔼CXQb !bA/k{N[2aþ]vZ>Λ\VoA.JP0l+=.&I7K6C'|c(o3N&yWs/廯hrr[XXjOȭz~\> endobj 88 0 obj << /Length 89 0 R /Filter /FlateDecode >> stream x]Pj0+m% |胺[ZA- Y>Rzϭ5TFcuŭA! 8*ڨxg޳ݶD[;:$Yb`wn} v_.woF(q$޿3BV@#P"RTHi\|0vB&RU2t }WRd hB<%z2nx'*6tG~@RZcqW|J$Dy endstream endobj 89 0 obj 250 endobj 87 0 obj << /Type /FontDescriptor /FontName /IGOMCU+AppleColorEmoji /Flags 4 /FontBBox [-18 -23 1055 1000] /ItalicAngle 0 /Ascent 1000 /Descent -313 /CapHeight 889 /StemV 0 /XHeight 666 /MaxWidth 1000 /FontFile2 90 0 R >> endobj 90 0 obj << /Length 91 0 R /Length1 664 /Filter /FlateDecode >> stream x+)*Medh``fHM,` Sғ2RS |?@,(7*%P~O<P yL q(_H@dP= Ȧ" m2r2+$ojW>;w>`qN&(0+g@' `Dd1P#T%@Q&~Q%}O ?(P?3; "S?)'Ӭ azP%= @,F6SWoe0HVĽ,FfF` LI' XPꜟ_䚛 =H* endstream endobj 91 0 obj 351 endobj 10 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LPEHOY+Geneva /FontDescriptor 92 0 R /Encoding /MacRomanEncoding /FirstChar 32 /LastChar 213 /Widths [ 333 0 0 0 0 0 727 303 447 447 0 667 303 379 303 538 667 667 667 667 667 667 667 667 667 667 303 0 0 0 0 0 871 727 636 651 701 576 553 674 689 242 492 663 583 788 708 735 583 735 606 606 640 667 727 947 610 610 0 0 0 0 0 0 0 553 610 545 602 576 390 610 583 235 276 538 235 894 583 606 602 602 386 509 443 583 564 780 530 572 553 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 879 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 303 ] >> endobj 92 0 obj << /Type /FontDescriptor /FontName /LPEHOY+Geneva /Flags 32 /FontBBox [-808 -638 1686 1396] /ItalicAngle 0 /Ascent 1000 /Descent -250 /CapHeight 780 /StemV 0 /Leading 83 /XHeight 561 /MaxWidth 1716 /FontFile2 93 0 R >> endobj 93 0 obj << /Length 94 0 R /Length1 24920 /Filter /FlateDecode >> stream x|y|EUs_#d2rr r% ( (h!EkwPBp=p/qAEVWXY]2}' }睙ꮮz깟喅H6cD\9usgOm׵ui9!Ͽan.%D|f5@?p"Qg̚r[n 4N o;Pޭ-??t*"g$NpĂ438"*Yql5ʯi@Ѻ{O9nsPձ)$Ncwkέ5.z꿨vnRR5/ Dqp ?j˵mQ#%\S2}<_v =O_!^⣿I=U~_m7%#DA}n$>/r.Oeׅ.\/v3{>,jf%*W]FӺ"9hnjW)]&uEV`HX-q2 m8Kcі y{@|qw,=ۺ|{hMֆ4i߮l說.j*|7'ZD4Ǭ]N?XMt4Xon.jQb :HeIC yRy y4y}>O^+ϔiC)ŤUQIN!h.8$6%vl^aŁ8@,*MҾ{MjvW۪u5f3];9&ǏC:fЀ:wɾ WLz;s S;Lm,d}Mc:L_5u/Ew]l4u/Ew^Y5MMctZ;  ;|:k:wu]3l =HRD(cCm2 |h#˹5$\* OygnBHH'=mLRLh#|K뻽#<+ |E0dG?8M^7)}7IhL<.gFn.ý!uBWX_s㟌{n']"GQ:Rnr\Ww'f3}]Ba諑܀~lvh=!}TQZG_|\+fQapTlzI<o]QH0hr̼Va} FyAXFhǨ`?} 9+,\Ĝ?s'[& 1a_$YszїٷcT*2rlM{HH(`,nMi56INW@tC~|r<'sV%r5\ wrܣܓ~5|KJ7s]ˆ?`ԐBpp\TD،onvHo刼NoUF5o5Ft[)Wג'iGZseXv]^8J>IBwA,bC kP4" qrBޢ;srr) /. 2/-5%qj1SdIx`tgxz81;8UwiN?o.]2hM^hI-JR ;WC?Xk#*׺g;tmg]5ytoˠ咽\Az$#g, #YNo13;ǍZ[4vґ$۵;呝Ht݉ /붐kfgθjj'?]vZs:]NגnĩP&BV{,mkWh^5Bu3:bXu:XuG06j6\2-4}S>g:@m$W,tyѽZĩ@guriFMNib.OJ^^@nol_pߑ_b{>~GЂa ?m4Qi6@22Ck >ugk.57tΜAXfV(mLη;!ɸihk[%עҹ|DOM"HNS'7]y$ve+nRf&qv* ?%^;kh'Mo.7ka&qSwRz_S7nRyݤa\QIpfBHBs{SS0u6:MRnA&0S^4*ԖqSO\^ E Jz `} D&C.#^6?ry \jrtvF:fhnš0Z^삁dv"0<"v?up!<¸qgF;LpAxą^;^ƍAh5_Ax셑^y,p/`00q7p;E҅&N~1NJvKh$k'QBف2PQ6oR]dXJb"4|7F63dd8lA^ ž 6BLx xsZ8Sڷij'k1FNumڈKBUT؀\" K1'iڇ%@k^UBFA. vx3J&)$AbAAB3gC'!$fS@BR V@BPRA*5p#I \OF.6ݍ!/_q#V) 3ͯ_SYI>Ҧu)nCa)cqTct|3?ۮr,us%'u .ws.ޓW_R_JKOۈeR+7cll$υc:YJs r*O:QJGn5ll|v[6 5 ~no;9~}Zl!"}osX:z_tgheUd蒊+[FmrVW?>g9t"IZf)YvYeWSekŎY;HܯUQ.y7횷kO )}·j֋^~B2RjpoJ4jjjSAjfpx u@ <8gټ^ \ΨxB-h {G !{G=O DOiiky,rVn+'է+O#sL,V9LPU auU2} UP$l Mf`楨0,8h8鱩iȊMy. ,*-̏Bf.O h0=™\Iq-*$6WF9gh.)GcH$DAQaiY㿜yhֿx1XMlOhE==~*O}c˭|i_x`644yz?o4ڳ X|^(d ,FiVT,y NlYˢUNF*:>z[q_bhWDoVis~#pR dDFnz}=GvwQ>z@1ߊQJd뷧=']]}Ī|U, Yewg=Xk Do˔2Qi7s礴WO~gc?=+WknɘQ%o[>/חĉ_W5>n |ZQa)Ģw5û`4:^g*nz{DEhUZv)_cb|yei'L-PbL+,=.G{G;E!:+چi  m3I0ICuf8'-8LkDzmk{fϾFz~tS6r?y~D Wl?7ypUOp8\hj~W^UTu@n ݪb+4q7" : 19@0HWJsrctɪ'e# \;҅&L<9vvsyy l,Iɷ&?,>-s}w}oPx<¯ĸElJ5 )USJ%_(,U%:ĂZ+v/,.Pean1 \",Q3`z,d)…J ƒBbqȹy$Ѡ=G y\)ǥz}y|)Ԋş-\j*?k{q*lu˺u1)⊇'NyF>O_D4V*s6)O z>kSsRs367f roK-me6oSf:II^7FFfF6P}7xģF {"SYujHH=5 3&/;aO]F,a)35nb[b (s˯R[ e&D>6F#ko̚tMuA꫟hjʥi~׻od=-^#u;z`0?Hi48Vc71Uq=ү[Hh kV_tRRCFdD{('$~`le`u~ȘGENLGj^d=SES ^${jwqLC7c Xeor $C̷Xp` 'p+Z9ba  gL[v 9ięV\C RBdɲH8faiC9{'\ G&.~nH{kx7wӑ5$9-څ`!yoQE+O8 E<`(T&yH| /FG~즍{GK;{x %T-bLzkoW=9k:m'3)9c|rC6v ~oRsdE1EEG_79̤s(r$_#1'Sl܌JK@n8B$ؤJ\Nqm2zo\点UCgԯ~Α`o9o~x>@/_w͛>477Crށe74nSy 51=89T tOT՞w* 6fjQh(esj眤9is||jj5tL1sUxRj#?9K7Q]Uf`/BF3=ɪnP昝Θc4gWO#iz MJ7ܤKƏW^d%h ":13b#^6[mR8CX"}H.}%g'Wq:,YSIG0YLp F.")C$㿠` =(zsU&rֽZ&;tXh3OOz"(.F8XWb4G[:bХCInwgC3x8\3Ǝ0W({guKx:Gшٴ,j 'N gs"g#a&2;b|.T1i=H Hb7m4߇Eeђ#WʖXҬmhOɝB$sf{a2^ :?۠U j_—OM}pZ,M0d E~}Q=Fź\MgE]>b ]-J}.-P^͔ !LN'@a=A;KgO*8-?&}w:?w.H "70rѠ<EM'aL \1 q.lnXÜF"LFk4Ez^.[>\v޾DaeLg ۠3_5U*`` wPx]|]y]UjKAnQyP%΢sHIE\Pr+2EhQJ UDg]D/,N:H LN[|Q5) וNh~F]zڪGLO/zzhdd㕞<7E.nQ"ݥcǸռղɶɾô%5E[INƅl6fu8s\IH67Ybyd+y+; 43HJH7Ws4i@ wjU̽ΌV J ɹ4⚞H\@+ \IL/GCaUw=e+V=,YyXUR8pn8anЫy^>|s:aC<#ckX%ā gLf8BY@y,Mb)C߶?:;k-lOj{͉K?iL]ѼG{G6]]0*sX /0rLIBw.9 ?lsfBV8ܩS",E3|+=#Vlyס54h5Q6izN.._:)qRg!2c;po a{HTqDgr "k*[y 9- PaCvϻ=Nz"~jd9=W?t./~׿}~%T]F0THKJ idd"#Nd䷕LZmJZF_-gyo^!}}ͥtݹPP}1Zm$y>l$QnpP*d:ވzAJH7J#ejyC<3\ZC2= P`paul͐0;KͶe؃2]znnٴWޫ55*Gc17_;R:umZ^m\m[<":-˞(qlIrs2`lVIdo8dž,hdbklf%(WC/ Nw3E(V ԅ ]Q| p\o9Y/6,[u8?`ڬeܲeXꕚi**(3fe~_tuu?R a߾}B(FM/w4zh"ލ|@QEA:*Y68$1lqU#He*bxLG]l&̝ \6sU U)XlϫEA/H-GCz ]x0A|4;sq{>`..o1\urb¿ D 3@y>"rHcH .z^yokah˜XE g2 ٤ r뾠mq>_{/w7;.(2SF{Sw£u#&]s9|6wK%Դp[ڼy^ty1Puhh:-Uݟ* ;-;=uye36Eq  2USv+-47 q>^LlOf ~ 6-G 1 bjb5DflLbn&ʔ%{BGa7Ywo>uu>q;)>* L]?T_Ə}/{?r; pl)dh)cWbܧʨ|zbֺۼS^VJ[czcJ@C_,ހ'T gY%%4ϧ 𵥊>?Ex<8v?uqƧWIdr?uIMc`̟7a߂=+bς}u/fSl7:h{'갫~_5zDžzߣהBYUjgopH<<_ޫ;gT%9jvnF0<C^}s4M (] +-?Ȁ%ENљPΛI&lct10$b&Q%r\bQAmvFg 7-uE~1B,#=0j [UeyG ==7qytc]&RS}t<-)f7|a)l9#ۄHA4~(?-로 s , Oy>TSpMf  &Nw; 1{5iKIJw#<_[;V)UEp;GsgX>A&ܞ 󌎅c{He2pGMgS X48p$+IWUbޕЦ AFnրgbѳqUOQWll{7ݽܢ?p6@JtiG?Eb5@a?2UB.$ H&]ZRD.#\ߺx#}0CL::xj[c!j@1pv樇8Ar>:==À#$+{.fQ7~1SW/dž'nkخ]k5Wh!67Pv;tX>|"}"RJg^fAg*o6hɈlpͫ%yˌ+0~<:'{L(w0"ME#~{q'96XF]^ԍf-W70}z7U5%zQAtltz QJǜKMKKOKJNJ&mr4;2Ԡ>4Sij%Uu*Kt#T $g!5^$/X~?|ij.vJY adDxFM߰hWb{8>X~󹼚܋B'lB{.?521KSmOSc%~<]" 1qffr3[˔]Jt2] Ebw1qU^#6a_dBńu{r.a;<57gW5=jo7Ye7<`/xu֐wa]hak IkBcKp0Ӥq0N3٘|?S_q/q~] KYK {0gEL,mI^^V{KxKjXH!@rq i:jr&Hd ,a?%gL3YEh^!u3~MZ1Z={6߿g)!8Ƴ ~/嗯,xЂ2}bg^*8}xDIHXԐbKޠ@#О _4lPv>3::S)S)S5ER-\dZ%L# zxҏv+,Ͱ6]:wy:w0Kvs t-К6L&1@tNLNN3(f%$œ6Ewb W (lou!-L pj\Mw},1 S 31[я 3sxFGia8H0-YKKn[y珝\=QÕӆXs7La5ސ|;f hxc{2+~z t:JlǾ-Z -f++_u tIE7جJI^a-F ?xktr` `o`W9Bز7W%D3d@"0W5Sa^ueL|*o;zR&w/ͅY'y0:޲r֪!V;o22ںX#|XPo w a\QM"|נXt&UUCPIB΁,oT񱞞[:s 0Ei:@ox̑o%tN%*JG,&΍,eR%䊅bqmϊlxPOA4H EhE5`|E=2R: ߜ(e9(2ȝ4"| o3s z=yorDr5A;Z{3{vttxe=!CFb>pP?;'/gT X_l(6*zJRKCCZF$NM-\fqʸ lہ w8 /7fes׌&cXҀ\82\A&?d J/W߈km١Hȉ$cՎ) H:(x=iFPv@9r,gŁRR2e&J JFPv@9r,&8P2PQjP&DiAiCوn(QNP(((5(QflDy e7('P"G@qdԠLD҂҆1(P0]8?Τ3ԳԳԵ44__ހzoI_0uKW6z#kkG 3o9z@}̀: oPP?~ŀ:%ϛ8x&>e@Iz@.~u3ԛԯPa@}ր974d7P?^[\u@e@}z/Pեuf endstream endobj 94 0 obj 17459 endobj 95 0 obj (factsheet) endobj 96 0 obj (Mac OS X 10.12.5 Quartz PDFContext) endobj 97 0 obj (PowerPoint) endobj 98 0 obj (D:20170722230506Z00'00') endobj 1 0 obj << /Title 95 0 R /Producer 96 0 R /Creator 97 0 R /CreationDate 98 0 R /ModDate 98 0 R >> endobj xref 0 99 0000000000 65535 f 0000411462 00000 n 0000008534 00000 n 0000361903 00000 n 0000000022 00000 n 0000008514 00000 n 0000008648 00000 n 0000346594 00000 n 0000000000 00000 n 0000387520 00000 n 0000392820 00000 n 0000116888 00000 n 0000125272 00000 n 0000110542 00000 n 0000116867 00000 n 0000131564 00000 n 0000142030 00000 n 0000125293 00000 n 0000131543 00000 n 0000000000 00000 n 0000381764 00000 n 0000385301 00000 n 0000142052 00000 n 0000211890 00000 n 0000090975 00000 n 0000110520 00000 n 0000000000 00000 n 0000391598 00000 n 0000211912 00000 n 0000246447 00000 n 0000269223 00000 n 0000291330 00000 n 0000246469 00000 n 0000269201 00000 n 0000008993 00000 n 0000090953 00000 n 0000343751 00000 n 0000343805 00000 n 0000337765 00000 n 0000338806 00000 n 0000347801 00000 n 0000338826 00000 n 0000343730 00000 n 0000332649 00000 n 0000334992 00000 n 0000335013 00000 n 0000337744 00000 n 0000291352 00000 n 0000293599 00000 n 0000293620 00000 n 0000320296 00000 n 0000325637 00000 n 0000329047 00000 n 0000320318 00000 n 0000325616 00000 n 0000329068 00000 n 0000332628 00000 n 0000343858 00000 n 0000346573 00000 n 0000346630 00000 n 0000347780 00000 n 0000361600 00000 n 0000347838 00000 n 0000361578 00000 n 0000361717 00000 n 0000362057 00000 n 0000361993 00000 n 0000362499 00000 n 0000362730 00000 n 0000381742 00000 n 0000382271 00000 n 0000381941 00000 n 0000382251 00000 n 0000382499 00000 n 0000385280 00000 n 0000385749 00000 n 0000385445 00000 n 0000385729 00000 n 0000385950 00000 n 0000385970 00000 n 0000386192 00000 n 0000387499 00000 n 0000388385 00000 n 0000387836 00000 n 0000388365 00000 n 0000388612 00000 n 0000391577 00000 n 0000392131 00000 n 0000391785 00000 n 0000392111 00000 n 0000392360 00000 n 0000392800 00000 n 0000393503 00000 n 0000393738 00000 n 0000411288 00000 n 0000411310 00000 n 0000411338 00000 n 0000411391 00000 n 0000411420 00000 n trailer << /Size 99 /Root 66 0 R /Info 1 0 R /ID [ <305600dc3b3107e099973d45174b07f9> <305600dc3b3107e099973d45174b07f9> ] >> startxref 411567 %%EOF gsoap-2.8.91/gsoap.pc.in0000644000175000017500000000041113525245163014330 0ustar ellertellertprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: GSoap Description: SOAP C Web Services Version: 2.8.91 Requires: Libs: -L${libdir} -lgsoap Libs.private: @SAMPLE_EXTRA_LIBS@ Cflags: @SOAPCPP2_IPV6@ -DWITH_DOM -I${includedir} gsoap-2.8.91/gsoapssl.pc.in0000644000175000017500000000050713525245163015060 0ustar ellertellertprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: GSoap Description: SOAP C Web Services with SSL, ZLIB, DOM Version: 2.8.91 Requires: Libs: -L${libdir} -lgsoapssl Libs.private: @SAMPLE_SSL_LIBS@ @SAMPLE_EXTRA_LIBS@ Cflags: @SOAPCPP2_IPV6@ @WSDL2H_EXTRA_FLAGS@ -DWITH_DOM -I${includedir} gsoap-2.8.91/README.txt0000644000175000017500000003644213525245163014001 0ustar ellertellert================================================================================ Thanks for using gSOAP! The gSOAP toolkit provides a cross-platform software development toolkit for C and C++ server and client Web service applications, and simplifies the overall use of XML in any type of application. The toolkit supports SOAP 1.1/1.2 RPC encoding and document/literal styles, WSDL 1.1, MTOM/MIME/DIME attachments (streaming), SOAP-over-UDP, request-response and one-way messaging. The toolkit also supports WS-Addressing and WS-Security, with several other WS-* available or under development. See the official open-source gSOAP website http://gsoap2.sourceforge.net for project status and latest news. * The gSOAP 'soapcpp2' compiler and code generator and 'stdsoap2' runtime engine are stable since version release 2.1.3. * The gSOAP 'wsdl2h' WSDL/schema parser and code generator is stable since wsdl2h version release 1.1.0. The 'wsdl2h' tool fully supports WSDL 1.1, XML schemas, WS-Policy, and other WS-* protocols (details in the fact sheet). The software is provided "as is", without any warranty. However, gSOAP has been extensively field-tested in production-quality software development. We continue to improve gSOAP and add new features. See NOTES.txt for distributed notes and an overview of the package contents. See INSTALL.txt for installation instructions. See LICENSE.txt for software licensing. ================================================================================ WHAT'S COOL? ================================================================================ The gSOAP 'wsdl2h' tool is a gSOAP application itself, which demonstrates the capabilities of the generic XML handling by the toolkit to parse WSDL, XML schemas, and SOAP/XML. The gSOAP toolkit supports streaming technologies to expedite SOAP/XML and MTOM/MIME attachment transfers of potentially unlimited data lengths. The gSOAP toolkit is the only toolkit that supports the serialization of native C and C++ data types directly in XML. You can use it to export and import your application data in XML without having to write wrapper routines. The gSOAP toolkit ensures as small memory footprint. XML is a processed as a transient format and not buffered. Many optimizations have been applied to reduce resource requirements and to expedite XML parsing. The gSOAP toolkit provides stand-alone HTTP(S) web server functionality as well as Apache mod and IIS hooks (located in gsoap/mod_gsoap). Also CGI and FastCGI are supported. A web server example demonstrating the stand-alone functionality is included in the package. ================================================================================ FEATURES ================================================================================ XML data binding tools for C/C++ XML schema <=> C/C++ type binding means XML and C/C++ data is type safe XML streaming auto-serialization of C/C++ data (with optional use of DOM) XML-RPC from/to JSON from/to C/C++ serialization (also in streaming mode) No need to alter C/C++ types for serialization (declare type as 'volatile') WSDL 1.1/2.0, XSD 1.0/1.1, SOAP 1.1/1.2 compliant REST HTTP(S) 1.0/1.1 operations (GET,PUT,POST etc) for XML, JSON, etc Send and recieve XML over sockets, file FD, and C++ streams WS-I Basic Profile 1.0a, 1.1, and 1.2 compliant W3C schema patterns for data binding full test pattern coverage RSS 0.91, 0.92, 2.0 XML support MIME and MTOM attachment support (also in streaming mode) WS-Security XML authentication, signatures, encryption (also in streaming mode) WS-Policy 1.2, 1.5 and WS-SecurityPolicy 1.2 compliant WS-Addressing 2003/03, 2004/03, 2005/03 compliant WS-ReliableMessaging 1.0 and 1.1 compliant WS-Discovery 1.0/1.1 UDDI v2 API NTLM authentication HTTP basic and digest authentication SSL/TLS communications with SSL session caching (OpenSSL or GNUTLS) Proxy and proxy authentication support Compression (HTTP compression and zlib) IPv4 and IPv6, including direct TCP and UDP data transfer SOAP-over-UDP Apache 1.x and 2.0 modules IIS (ISAPI) and WinInet modules CGI and FastCGI support Stand-alone Web server included (multithreaded, SSL, compression) Integrated memory management with deallocation and leak detection Plug-ins for additional capabilities Internationalization/localization support (UTF8, UCS4, MB encodings, etc) WSDL/XSD conversion to C or C++ and vice versa Portable to small devices (WinCE, Palm, Symbian, VxWorks, Andriod, iPhone) Auto-test server code generation for (dummy) server testing Automatic XML document and message generation from WSDL and XSD C/C++ (cyclic) object graph auto-serialization (with SOAP id-href encoding) STL container auto-serialization and custom C++ container auto-serialization Over 40 example client and server applications included ================================================================================ PACKAGE ================================================================================ This distribution package contains platform-independent source code. Pre-built 'soapcpp2' and 'wsdl2h' binaries are included for the following platforms: * Win32 i386 compatible * MAC OS X The binaries are located in 'gsoap/bin'. Important: these 'wsdl2h' binaries use the default configuration without SSL support (no HTTPS site access). To configure and build the toolkit binaries and libraries, please see the installation instructions in the 'INSTALLATION' section below. ================================================================================ GETTING STARTED ================================================================================ Follow the installation instructions in INSTALL.txt first. The gSOAP 'wsdl2h' tool converts WSDLs into a gSOAP header file for processing with the gSOAP code gnerator 'soapcpp2' to generate XML serialization, stubs, and skeletons code to build Web services applications. Use 'wsdl2h' followed by 'soapcpp2' to translate an entire set of WSDL and XML schemas into representative C or C++ data structures and associated XML parsers. You can also use the gSOAP 'soapcpp2' tool directly on existing C/C++ data structure declarations to create XML serialization routines for these types to simplify the storage of data in XML. Example translation of WSDL to code in two steps: $ wsdl2h -s -o calc.h http://www.cs.fsu.edu/~engelen/calc.wsdl $ soapcpp2 -CL -I/path/to/gsoap/import calc.h The 'calc.h' header file contains the services and XML schema types represented in C/C++, together with other useful information copied from the WSDL related to the service. Run Doxygen on it to generate a nice set of pages. Do not include the wsdl2h-generated 'calc.h' header file directly into your code (the declarations are replicated in the generated code). The header file is processed by the gSOAP stub compiler 'soapcpp2' to generate the following files for your project: soapClient.cpp client-side stub routines for service invocation soapServer.cpp server-side skeleton routines for server development soapC.cpp C/C++ parameter marshalling code calc.nsmap An XML-to-C/C++ namespare mapping table To compile a client, all you need to do is to compile and link 'soapC.cpp', 'soapClient.cpp', and 'stdsoap2.cpp' (or the installed libgsoap++, see INSTALLATION) with your code. To access the service in your code: #include "soapH.h" #include "calc.nsmap" main() { struct soap *soap = soap_new(); // alloc 'soap' engine context double result; if (soap_call_ns2__add(soap, NULL, NULL, 1.0, 2.0, result) == SOAP_OK) std::cout << "The sum of 1.0 and 2.0 is " << result << std::endl; else soap_stream_fault(soap, std::cerr); soap_destroy(soap); // dealloc serialization data soap_end(soap); // dealloc temp data soap_free(soap); // dealloc 'soap' engine context } First, this imports all soapcpp-generated definitions and the namespace mapping table. Then the soap_call_ns2__add() invokes the service. This function is generated from the calc.h file by soapcpp2. The calc.h file includes instructions on what functions to call. To develop a C++ client application based on C++ proxy objects rather than C-like functions, use 'soapcpp2' option -j: $ wsdl2h -s -o calc.h http://www.cs.fsu.edu/~engelen/calc.wsdl $ soapcpp2 -j -CL -I/path/to/gsoap/import calc.h This generates 'soapcalcProxy.h' and 'soapcalcProxy.cpp' with a calcProxy class with service methods that you can use to invoke services. For example: #include "soapcalcProxy.h" #include "calc.nsmap" main() { calcProxy service; double result; if (service.add(1.0, 2.0, result) == SOAP_OK) std::cout << "The sum of 1.0 and 2.0 is " << result << std::endl; else service.soap_stream_fault(std::cerr); service.destroy(); // dealloc serialization and temp data } Compile the above program and link with 'soapC.cpp', 'soapcalcProxy.cpp', and 'stdsoap2.cpp' (or -lgsoap++). To develop a C client, use 'wsdl2h' option -c to generate pure C code. There are many options that you can use depending on the need to develop C applications, C++ with or without STL, or C++ proxy and server objects. In addition, the XML schema type mapping is defined by 'typemap.dat', located in the project root and 'WS' folders. The 'typemap.dat' file is used to customize the 'wsdl2h' output. It is important to use this file for larger projects that depend in WS-* protocols, such as WS-Addressing and WS-Security. More information about the 'wsdl2h' and 'soapcpp2' tools and their options can be found in the gSOAP documentation and the Quick How-To page on the gSOAP Web site, see: http://gsoap2.sourceforge.net See also the 'gsoap/wsdl/README.txt' for more details on the WSDL parser and installation. The 'gsoap/bin' folder includes pre-built 'soapcpp2' and 'wsdlh2' executables for various platforms. ================================================================================ BUILD NOTES ================================================================================ QNX On QNX the bison.simple file is located in $QNX_HOST/usr/share/bison.simple Update your .profile to include: export BISON_SIMPLE=$QNX_HOST/usr/share/bison/bison.simple export BISON_HAIRY=$QNX_HOST/usr/share/bison/bison.hairy WIN32 Bison 1.6 can crash on Win32 systems if YYINITDEPTH is too small Compile with /DYYINITDEPTH=5000 ================================================================================ CHANGELOG ================================================================================ Visit http://www.cs.fsu.edu/~engelen/changelog.html to view the latest changes. ================================================================================ LICENSE ================================================================================ See LICENSE.txt ================================================================================ COPYRIGHT ================================================================================ Copyright (C) 2000-2015 Robert van Engelen, Genivia, Inc. All Rights Reserved. ================================================================================ USE RESTRICTIONS ================================================================================ You may not: (i) transfer rights to gSOAP or claim authorship; or (ii) remove any product identification, copyright, proprietary notices or labels from gSOAP. ================================================================================ WARRANTY ================================================================================ GENIVIA INC. EXPRESSLY DISCLAIMS ALL WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY RIGHTS, AND ANY WARRANTY THAT MAY ARISE BY REASON OF TRADE USAGE, CUSTOM, OR COURSE OF DEALING. WITHOUT LIMITING THE FOREGOING, YOU ACKNOWLEDGE THAT THE SOFTWARE IS PROVIDED "AS IS" AND THAT GENIVIA INC. DO NOT WARRANT THE SOFTWARE WILL RUN UNINTERRUPTED OR ERROR FREE. LIMITED LIABILITY: THE ENTIRE RISK AS TO RESULTS AND PERFORMANCE OF THE SOFTWARE IS ASSUMED BY YOU. UNDER NO CIRCUMSTANCES WILL GENIVIA INC. BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES OF ANY KIND OR NATURE WHATSOEVER, WHETHER BASED ON CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, ARISING OUT OF OR IN ANY WAY RELATED TO THE SOFTWARE, EVEN IF GENIVIA INC. HAS BEEN ADVISED ON THE POSSIBILITY OF SUCH DAMAGE OR IF SUCH DAMAGE COULD HAVE BEEN REASONABLY FORESEEN, AND NOTWITHSTANDING ANY FAILURE OF ESSENTIAL PURPOSE OF ANY EXCLUSIVE REMEDY PROVIDED. SUCH LIMITATION ON DAMAGES INCLUDES, BUT IS NOT LIMITED TO, DAMAGES FOR LOSS OF GOODWILL, LOST PROFITS, LOSS OF DATA OR SOFTWARE, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION OR IMPAIRMENT OF OTHER GOODS. IN NO EVENT WILL GENIVIA INC. BE LIABLE FOR THE COSTS OF PROCUREMENT OF SUBSTITUTE SOFTWARE OR SERVICES. YOU ACKNOWLEDGE THAT THIS SOFTWARE IS NOT DESIGNED FOR USE IN ON-LINE EQUIPMENT IN HAZARDOUS ENVIRONMENTS SUCH AS OPERATION OF NUCLEAR FACILITIES, AIRCRAFT NAVIGATION OR CONTROL, OR LIFE-CRITICAL APPLICATIONS. GENIVIA INC. EXPRESSLY DISCLAIM ANY LIABILITY RESULTING FROM USE OF THE SOFTWARE IN ANY SUCH ON-LINE EQUIPMENT IN HAZARDOUS ENVIRONMENTS AND ACCEPTS NO LIABILITY IN RESPECT OF ANY ACTIONS OR CLAIMS BASED ON THE USE OF THE SOFTWARE IN ANY SUCH ON-LINE EQUIPMENT IN HAZARDOUS ENVIRONMENTS BY YOU. FOR PURPOSES OF THIS PARAGRAPH, THE TERM "LIFE-CRITICAL APPLICATION" MEANS AN APPLICATION IN WHICH THE FUNCTIONING OR MALFUNCTIONING OF THE SOFTWARE MAY RESULT DIRECTLY OR INDIRECTLY IN PHYSICAL INJURY OR LOSS OF HUMAN LIFE. ================================================================================ EXTERNAL THIRD-PARTY LIBRARIES ================================================================================ The gSOAP toolkit is self-contained and does not require any third-party software to run in its standard configuration. When compression and SSL encryption are required the Zlib and OpenSSL libraries must be installed. To build the gSOAP 'soapcpp2' compiler, you must have Bison and Flex installed or the older Yacc and Lex equivalents. Note that licensing differs for Flex versus Lex, and Bison versus Yacc. Win32 builds of clients and services requires winsock.dll. 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. The distribution contains a Visual Studio 2005 project example in the 'samples/calc_vs2005' folder with the necessary project settings to link libraries and automatically invoke to soapcpp2 compiler as a custom build. ================================================================================ DISCLAIMER ================================================================================ WE PROVIDE YOU WITH "REAL-WORLD" EXAMPLES BUT WE CANNOT GUARANTEE THAT ALL CLIENT EXAMPLES CAN CONNECT TO THIRD PARTY WEB SERVICES WHEN THESE SERVICES ARE DOWN OR HAVE BEEN REMOVED. ================================================================================ gsoap-2.8.91/gsoap++.pc.in0000644000175000017500000000041513525245163014462 0ustar ellertellertprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: GSoap Description: SOAP C++ Web Services Version: 2.8.91 Requires: Libs: -L${libdir} -lgsoap++ Libs.private: @SAMPLE_EXTRA_LIBS@ Cflags: @SOAPCPP2_IPV6@ -DWITH_DOM -I${includedir} gsoap-2.8.91/gsoap/0000755000175000017500000000000013525564137013410 5ustar ellertellertgsoap-2.8.91/gsoap/.deps/0000755000175000017500000000000013525245205014411 5ustar ellertellertgsoap-2.8.91/gsoap/.deps/libgsoapck___la-stdsoap2_ck_cpp.Plo0000644000175000017500000000001013525245157023226 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/.deps/stdsoap2.Po0000644000175000017500000000444413525245157016464 0ustar ellertellertstdsoap2.o : \ stdsoap2.h ../config.h /usr/include/stdlib.h \ /usr/include/machine/ansi.h /usr/include/ppc/ansi.h \ /usr/include/machine/types.h /usr/include/ppc/types.h \ /usr/include/sys/cdefs.h /usr/include/stdio.h /usr/include/sys/types.h \ /usr/include/sys/appleapiopts.h /usr/include/machine/endian.h \ /usr/include/ppc/endian.h /usr/include/string.h /usr/include/ctype.h \ /usr/include/runetype.h /usr/include/limits.h \ /usr/include/gcc/darwin/3.1/machine/limits.h /usr/include/ppc/limits.h \ /usr/include/sys/syslimits.h /usr/include/errno.h \ /usr/include/sys/errno.h /usr/include/sys/timeb.h /usr/include/time.h \ /usr/include/sys/socket.h /usr/include/machine/param.h \ /usr/include/ppc/param.h /usr/include/strings.h /usr/include/sys/time.h \ /usr/include/netinet/in.h /usr/include/netinet6/in6.h \ /usr/include/netinet/tcp.h /usr/include/arpa/inet.h \ /usr/include/sys/param.h /usr/include/sys/signal.h \ /usr/include/machine/signal.h /usr/include/ppc/signal.h \ /usr/include/math.h /usr/include/architecture/ppc/math.h \ /usr/include/netdb.h /usr/include/unistd.h /usr/include/fcntl.h \ /usr/include/sys/fcntl.h stdsoap2.o : stdsoap2.h : ../config.h : /usr/include/stdlib.h : /usr/include/machine/ansi.h : /usr/include/ppc/ansi.h : /usr/include/machine/types.h : /usr/include/ppc/types.h : /usr/include/sys/cdefs.h : /usr/include/stdio.h : /usr/include/sys/types.h : /usr/include/sys/appleapiopts.h : /usr/include/machine/endian.h : /usr/include/ppc/endian.h : /usr/include/string.h : /usr/include/ctype.h : /usr/include/runetype.h : /usr/include/limits.h : /usr/include/gcc/darwin/3.1/machine/limits.h : /usr/include/ppc/limits.h : /usr/include/sys/syslimits.h : /usr/include/errno.h : /usr/include/sys/errno.h : /usr/include/sys/timeb.h : /usr/include/time.h : /usr/include/sys/socket.h : /usr/include/machine/param.h : /usr/include/ppc/param.h : /usr/include/strings.h : /usr/include/sys/time.h : /usr/include/netinet/in.h : /usr/include/netinet6/in6.h : /usr/include/netinet/tcp.h : /usr/include/arpa/inet.h : /usr/include/sys/param.h : /usr/include/sys/signal.h : /usr/include/machine/signal.h : /usr/include/ppc/signal.h : /usr/include/math.h : /usr/include/architecture/ppc/math.h : /usr/include/netdb.h : /usr/include/unistd.h : /usr/include/fcntl.h : /usr/include/sys/fcntl.h : gsoap-2.8.91/gsoap/.deps/wssedemo-stdsoap2.Po0000644000175000017500000003257613525245157020317 0ustar ellertellert../../wssedemo-stdsoap2.o: ../../stdsoap2.c ../../../gsoap/stdsoap2.h \ ../../../config.h /usr/include/stdlib.h /usr/include/Availability.h \ /usr/include/AvailabilityInternal.h /usr/include/_types.h \ /usr/include/sys/_types.h /usr/include/sys/cdefs.h \ /usr/include/sys/_symbol_aliasing.h \ /usr/include/sys/_posix_availability.h /usr/include/machine/_types.h \ /usr/include/i386/_types.h /usr/include/sys/wait.h \ /usr/include/sys/_types/_pid_t.h /usr/include/sys/_types/_id_t.h \ /usr/include/sys/signal.h /usr/include/sys/appleapiopts.h \ /usr/include/machine/signal.h /usr/include/i386/signal.h \ /usr/include/machine/_mcontext.h /usr/include/i386/_mcontext.h \ /usr/include/mach/i386/_structs.h \ /usr/include/sys/_types/_sigaltstack.h \ /usr/include/sys/_types/_ucontext.h \ /usr/include/sys/_types/_pthread_attr_t.h \ /usr/include/sys/_types/_sigset_t.h /usr/include/sys/_types/_size_t.h \ /usr/include/sys/_types/_uid_t.h /usr/include/sys/resource.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/include/stdint.h \ /usr/include/stdint.h /usr/include/sys/_types/_int8_t.h \ /usr/include/sys/_types/_int16_t.h /usr/include/sys/_types/_int32_t.h \ /usr/include/sys/_types/_int64_t.h /usr/include/_types/_uint8_t.h \ /usr/include/_types/_uint16_t.h /usr/include/_types/_uint32_t.h \ /usr/include/_types/_uint64_t.h /usr/include/sys/_types/_intptr_t.h \ /usr/include/sys/_types/_uintptr_t.h /usr/include/_types/_intmax_t.h \ /usr/include/_types/_uintmax_t.h /usr/include/sys/_types/_timeval.h \ /usr/include/machine/endian.h /usr/include/i386/endian.h \ /usr/include/sys/_endian.h /usr/include/libkern/_OSByteOrder.h \ /usr/include/libkern/i386/_OSByteOrder.h /usr/include/alloca.h \ /usr/include/sys/_types/_ct_rune_t.h /usr/include/sys/_types/_rune_t.h \ /usr/include/sys/_types/_wchar_t.h /usr/include/sys/_types/_null.h \ /usr/include/machine/types.h /usr/include/i386/types.h \ /usr/include/sys/_types/___offsetof.h /usr/include/sys/_types/_dev_t.h \ /usr/include/sys/_types/_mode_t.h /usr/include/stdio.h \ /usr/include/sys/_types/_va_list.h /usr/include/sys/_types/_off_t.h \ /usr/include/sys/_types/_ssize_t.h /usr/include/secure/_stdio.h \ /usr/include/secure/_common.h /usr/include/string.h \ /usr/include/sys/_types/_rsize_t.h /usr/include/sys/_types/_errno_t.h \ /usr/include/strings.h /usr/include/secure/_string.h \ /usr/include/ctype.h /usr/include/runetype.h \ /usr/include/sys/_types/_wint_t.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/include/limits.h \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/i386/limits.h /usr/include/i386/_limits.h \ /usr/include/sys/syslimits.h /usr/include/poll.h \ /usr/include/sys/poll.h /usr/include/errno.h /usr/include/sys/errno.h \ /usr/include/sys/types.h /usr/include/sys/_types/_blkcnt_t.h \ /usr/include/sys/_types/_blksize_t.h /usr/include/sys/_types/_gid_t.h \ /usr/include/sys/_types/_in_addr_t.h \ /usr/include/sys/_types/_in_port_t.h /usr/include/sys/_types/_ino_t.h \ /usr/include/sys/_types/_ino64_t.h /usr/include/sys/_types/_key_t.h \ /usr/include/sys/_types/_nlink_t.h /usr/include/sys/_types/_clock_t.h \ /usr/include/sys/_types/_time_t.h \ /usr/include/sys/_types/_useconds_t.h \ /usr/include/sys/_types/_suseconds_t.h \ /usr/include/sys/_types/_fd_def.h \ /usr/include/sys/_types/_fd_setsize.h \ /usr/include/sys/_types/_fd_set.h /usr/include/sys/_types/_fd_clr.h \ /usr/include/sys/_types/_fd_zero.h /usr/include/sys/_types/_fd_isset.h \ /usr/include/sys/_types/_fd_copy.h \ /usr/include/sys/_types/_pthread_cond_t.h \ /usr/include/sys/_types/_pthread_condattr_t.h \ /usr/include/sys/_types/_pthread_mutex_t.h \ /usr/include/sys/_types/_pthread_mutexattr_t.h \ /usr/include/sys/_types/_pthread_once_t.h \ /usr/include/sys/_types/_pthread_rwlock_t.h \ /usr/include/sys/_types/_pthread_rwlockattr_t.h \ /usr/include/sys/_types/_pthread_t.h \ /usr/include/sys/_types/_pthread_key_t.h \ /usr/include/sys/_types/_fsblkcnt_t.h \ /usr/include/sys/_types/_fsfilcnt_t.h /usr/include/sys/timeb.h \ /usr/include/time.h /usr/include/_structs.h \ /usr/include/sys/_structs.h /usr/include/sys/_types/_timespec.h \ /usr/include/sys/socket.h /usr/include/machine/_param.h \ /usr/include/i386/_param.h /usr/include/sys/_types/_sa_family_t.h \ /usr/include/sys/_types/_socklen_t.h \ /usr/include/sys/_types/_iovec_t.h /usr/include/sys/time.h \ /usr/include/sys/_select.h /usr/include/netinet/in.h \ /usr/include/netinet6/in6.h /usr/include/netinet/tcp.h \ /usr/include/arpa/inet.h /usr/include/netdb.h /usr/include/unistd.h \ /usr/include/sys/unistd.h /usr/include/sys/_types/_posix_vdisable.h \ /usr/include/sys/_types/_seek_set.h /usr/include/sys/select.h \ /usr/include/sys/_types/_uuid_t.h /usr/include/gethostuuid.h \ /usr/include/fcntl.h /usr/include/sys/fcntl.h \ /usr/include/sys/_types/_o_sync.h /usr/include/sys/_types/_o_dsync.h \ /usr/include/sys/_types/_s_ifmt.h /usr/include/sys/_types/_filesec_t.h \ /usr/include/openssl/bio.h /usr/include/AvailabilityMacros.h \ /usr/include/openssl/e_os2.h /usr/include/openssl/opensslconf.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/include/stdarg.h \ /usr/include/openssl/crypto.h /usr/include/openssl/stack.h \ /usr/include/openssl/safestack.h /usr/include/openssl/opensslv.h \ /usr/include/openssl/ossl_typ.h /usr/include/openssl/symhacks.h \ /usr/include/openssl/err.h /usr/include/openssl/lhash.h \ /usr/include/openssl/rand.h /usr/include/openssl/ssl.h \ /usr/include/openssl/comp.h /usr/include/openssl/x509.h \ /usr/include/openssl/buffer.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/include/stddef.h \ /usr/include/openssl/evp.h /usr/include/openssl/objects.h \ /usr/include/openssl/obj_mac.h /usr/include/openssl/asn1.h \ /usr/include/openssl/bn.h /usr/include/openssl/ec.h \ /usr/include/openssl/ecdsa.h /usr/include/openssl/ecdh.h \ /usr/include/openssl/rsa.h /usr/include/openssl/dsa.h \ /usr/include/openssl/dh.h /usr/include/openssl/sha.h \ /usr/include/openssl/x509_vfy.h /usr/include/openssl/pkcs7.h \ /usr/include/openssl/pem.h /usr/include/openssl/pem2.h \ /usr/include/openssl/hmac.h /usr/include/openssl/kssl.h \ /usr/include/openssl/ssl2.h /usr/include/openssl/ssl3.h \ /usr/include/openssl/pq_compat.h /usr/include/openssl/tls1.h \ /usr/include/openssl/dtls1.h /usr/include/openssl/pqueue.h \ /usr/include/openssl/ssl23.h /usr/include/openssl/x509v3.h \ /usr/include/openssl/conf.h /usr/include/zlib.h /usr/include/zconf.h \ /usr/include/math.h /usr/include/inttypes.h ../../../gsoap/stdsoap2.h: ../../../config.h: /usr/include/stdlib.h: /usr/include/Availability.h: /usr/include/AvailabilityInternal.h: /usr/include/_types.h: /usr/include/sys/_types.h: /usr/include/sys/cdefs.h: /usr/include/sys/_symbol_aliasing.h: /usr/include/sys/_posix_availability.h: /usr/include/machine/_types.h: /usr/include/i386/_types.h: /usr/include/sys/wait.h: /usr/include/sys/_types/_pid_t.h: /usr/include/sys/_types/_id_t.h: /usr/include/sys/signal.h: /usr/include/sys/appleapiopts.h: /usr/include/machine/signal.h: /usr/include/i386/signal.h: /usr/include/machine/_mcontext.h: /usr/include/i386/_mcontext.h: /usr/include/mach/i386/_structs.h: /usr/include/sys/_types/_sigaltstack.h: /usr/include/sys/_types/_ucontext.h: /usr/include/sys/_types/_pthread_attr_t.h: /usr/include/sys/_types/_sigset_t.h: /usr/include/sys/_types/_size_t.h: /usr/include/sys/_types/_uid_t.h: /usr/include/sys/resource.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/include/stdint.h: /usr/include/stdint.h: /usr/include/sys/_types/_int8_t.h: /usr/include/sys/_types/_int16_t.h: /usr/include/sys/_types/_int32_t.h: /usr/include/sys/_types/_int64_t.h: /usr/include/_types/_uint8_t.h: /usr/include/_types/_uint16_t.h: /usr/include/_types/_uint32_t.h: /usr/include/_types/_uint64_t.h: /usr/include/sys/_types/_intptr_t.h: /usr/include/sys/_types/_uintptr_t.h: /usr/include/_types/_intmax_t.h: /usr/include/_types/_uintmax_t.h: /usr/include/sys/_types/_timeval.h: /usr/include/machine/endian.h: /usr/include/i386/endian.h: /usr/include/sys/_endian.h: /usr/include/libkern/_OSByteOrder.h: /usr/include/libkern/i386/_OSByteOrder.h: /usr/include/alloca.h: /usr/include/sys/_types/_ct_rune_t.h: /usr/include/sys/_types/_rune_t.h: /usr/include/sys/_types/_wchar_t.h: /usr/include/sys/_types/_null.h: /usr/include/machine/types.h: /usr/include/i386/types.h: /usr/include/sys/_types/___offsetof.h: /usr/include/sys/_types/_dev_t.h: /usr/include/sys/_types/_mode_t.h: /usr/include/stdio.h: /usr/include/sys/_types/_va_list.h: /usr/include/sys/_types/_off_t.h: /usr/include/sys/_types/_ssize_t.h: /usr/include/secure/_stdio.h: /usr/include/secure/_common.h: /usr/include/string.h: /usr/include/sys/_types/_rsize_t.h: /usr/include/sys/_types/_errno_t.h: /usr/include/strings.h: /usr/include/secure/_string.h: /usr/include/ctype.h: /usr/include/runetype.h: /usr/include/sys/_types/_wint_t.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/include/limits.h: /usr/include/limits.h: /usr/include/machine/limits.h: /usr/include/i386/limits.h: /usr/include/i386/_limits.h: /usr/include/sys/syslimits.h: /usr/include/poll.h: /usr/include/sys/poll.h: /usr/include/errno.h: /usr/include/sys/errno.h: /usr/include/sys/types.h: /usr/include/sys/_types/_blkcnt_t.h: /usr/include/sys/_types/_blksize_t.h: /usr/include/sys/_types/_gid_t.h: /usr/include/sys/_types/_in_addr_t.h: /usr/include/sys/_types/_in_port_t.h: /usr/include/sys/_types/_ino_t.h: /usr/include/sys/_types/_ino64_t.h: /usr/include/sys/_types/_key_t.h: /usr/include/sys/_types/_nlink_t.h: /usr/include/sys/_types/_clock_t.h: /usr/include/sys/_types/_time_t.h: /usr/include/sys/_types/_useconds_t.h: /usr/include/sys/_types/_suseconds_t.h: /usr/include/sys/_types/_fd_def.h: /usr/include/sys/_types/_fd_setsize.h: /usr/include/sys/_types/_fd_set.h: /usr/include/sys/_types/_fd_clr.h: /usr/include/sys/_types/_fd_zero.h: /usr/include/sys/_types/_fd_isset.h: /usr/include/sys/_types/_fd_copy.h: /usr/include/sys/_types/_pthread_cond_t.h: /usr/include/sys/_types/_pthread_condattr_t.h: /usr/include/sys/_types/_pthread_mutex_t.h: /usr/include/sys/_types/_pthread_mutexattr_t.h: /usr/include/sys/_types/_pthread_once_t.h: /usr/include/sys/_types/_pthread_rwlock_t.h: /usr/include/sys/_types/_pthread_rwlockattr_t.h: /usr/include/sys/_types/_pthread_t.h: /usr/include/sys/_types/_pthread_key_t.h: /usr/include/sys/_types/_fsblkcnt_t.h: /usr/include/sys/_types/_fsfilcnt_t.h: /usr/include/sys/timeb.h: /usr/include/time.h: /usr/include/_structs.h: /usr/include/sys/_structs.h: /usr/include/sys/_types/_timespec.h: /usr/include/sys/socket.h: /usr/include/machine/_param.h: /usr/include/i386/_param.h: /usr/include/sys/_types/_sa_family_t.h: /usr/include/sys/_types/_socklen_t.h: /usr/include/sys/_types/_iovec_t.h: /usr/include/sys/time.h: /usr/include/sys/_select.h: /usr/include/netinet/in.h: /usr/include/netinet6/in6.h: /usr/include/netinet/tcp.h: /usr/include/arpa/inet.h: /usr/include/netdb.h: /usr/include/unistd.h: /usr/include/sys/unistd.h: /usr/include/sys/_types/_posix_vdisable.h: /usr/include/sys/_types/_seek_set.h: /usr/include/sys/select.h: /usr/include/sys/_types/_uuid_t.h: /usr/include/gethostuuid.h: /usr/include/fcntl.h: /usr/include/sys/fcntl.h: /usr/include/sys/_types/_o_sync.h: /usr/include/sys/_types/_o_dsync.h: /usr/include/sys/_types/_s_ifmt.h: /usr/include/sys/_types/_filesec_t.h: /usr/include/openssl/bio.h: /usr/include/AvailabilityMacros.h: /usr/include/openssl/e_os2.h: /usr/include/openssl/opensslconf.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/include/stdarg.h: /usr/include/openssl/crypto.h: /usr/include/openssl/stack.h: /usr/include/openssl/safestack.h: /usr/include/openssl/opensslv.h: /usr/include/openssl/ossl_typ.h: /usr/include/openssl/symhacks.h: /usr/include/openssl/err.h: /usr/include/openssl/lhash.h: /usr/include/openssl/rand.h: /usr/include/openssl/ssl.h: /usr/include/openssl/comp.h: /usr/include/openssl/x509.h: /usr/include/openssl/buffer.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/include/stddef.h: /usr/include/openssl/evp.h: /usr/include/openssl/objects.h: /usr/include/openssl/obj_mac.h: /usr/include/openssl/asn1.h: /usr/include/openssl/bn.h: /usr/include/openssl/ec.h: /usr/include/openssl/ecdsa.h: /usr/include/openssl/ecdh.h: /usr/include/openssl/rsa.h: /usr/include/openssl/dsa.h: /usr/include/openssl/dh.h: /usr/include/openssl/sha.h: /usr/include/openssl/x509_vfy.h: /usr/include/openssl/pkcs7.h: /usr/include/openssl/pem.h: /usr/include/openssl/pem2.h: /usr/include/openssl/hmac.h: /usr/include/openssl/kssl.h: /usr/include/openssl/ssl2.h: /usr/include/openssl/ssl3.h: /usr/include/openssl/pq_compat.h: /usr/include/openssl/tls1.h: /usr/include/openssl/dtls1.h: /usr/include/openssl/pqueue.h: /usr/include/openssl/ssl23.h: /usr/include/openssl/x509v3.h: /usr/include/openssl/conf.h: /usr/include/zlib.h: /usr/include/zconf.h: /usr/include/math.h: /usr/include/inttypes.h: gsoap-2.8.91/gsoap/.deps/libgsoapck_la-stdsoap2_ck.Plo0000644000175000017500000000001013525245157022066 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/.deps/stdsoap2_ssl.Po0000644000175000017500000000467313525245157017351 0ustar ellertellertstdsoap2_ssl.o: stdsoap2_ssl.c stdsoap2.h ../config.h \ /usr/include/stdlib.h /usr/include/machine/ansi.h \ /usr/include/ppc/ansi.h /usr/include/machine/types.h \ /usr/include/ppc/types.h /usr/include/sys/cdefs.h /usr/include/alloca.h \ /usr/include/stdio.h /usr/include/sys/types.h \ /usr/include/sys/appleapiopts.h /usr/include/machine/endian.h \ /usr/include/ppc/endian.h /usr/include/string.h /usr/include/ctype.h \ /usr/include/runetype.h /usr/include/limits.h \ /usr/include/gcc/darwin/3.3/machine/limits.h /usr/include/ppc/limits.h \ /usr/include/sys/syslimits.h /usr/include/errno.h \ /usr/include/sys/errno.h /usr/include/sys/timeb.h /usr/include/time.h \ /usr/include/sys/socket.h /usr/include/machine/param.h \ /usr/include/ppc/param.h /usr/include/strings.h /usr/include/sys/time.h \ /usr/include/netinet/in.h /usr/include/netinet6/in6.h \ /usr/include/netinet/tcp.h /usr/include/arpa/inet.h \ /usr/include/sys/param.h /usr/include/sys/signal.h \ /usr/include/machine/signal.h /usr/include/ppc/signal.h \ /usr/include/math.h /usr/include/architecture/ppc/math.h \ /usr/include/netdb.h /usr/include/unistd.h /usr/include/sys/unistd.h \ /usr/include/signal.h /usr/include/fcntl.h /usr/include/sys/fcntl.h stdsoap2.h: ../config.h: /usr/include/stdlib.h: /usr/include/machine/ansi.h: /usr/include/ppc/ansi.h: /usr/include/machine/types.h: /usr/include/ppc/types.h: /usr/include/sys/cdefs.h: /usr/include/alloca.h: /usr/include/stdio.h: /usr/include/sys/types.h: /usr/include/sys/appleapiopts.h: /usr/include/machine/endian.h: /usr/include/ppc/endian.h: /usr/include/string.h: /usr/include/ctype.h: /usr/include/runetype.h: /usr/include/limits.h: /usr/include/gcc/darwin/3.3/machine/limits.h: /usr/include/ppc/limits.h: /usr/include/sys/syslimits.h: /usr/include/errno.h: /usr/include/sys/errno.h: /usr/include/sys/timeb.h: /usr/include/time.h: /usr/include/sys/socket.h: /usr/include/machine/param.h: /usr/include/ppc/param.h: /usr/include/strings.h: /usr/include/sys/time.h: /usr/include/netinet/in.h: /usr/include/netinet6/in6.h: /usr/include/netinet/tcp.h: /usr/include/arpa/inet.h: /usr/include/sys/param.h: /usr/include/sys/signal.h: /usr/include/machine/signal.h: /usr/include/ppc/signal.h: /usr/include/math.h: /usr/include/architecture/ppc/math.h: /usr/include/netdb.h: /usr/include/unistd.h: /usr/include/sys/unistd.h: /usr/include/signal.h: /usr/include/fcntl.h: /usr/include/sys/fcntl.h: gsoap-2.8.91/gsoap/.deps/libgsoapssl_la-stdsoap2_ssl.Plo0000644000175000017500000000001013525245157022476 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/.deps/libgsoap___a-dom.Po0000644000175000017500000002717313525245157020104 0ustar ellertellertlibgsoap___a-dom.o libgsoap___a-dom.o: dom.cpp stdsoap2.h ../config.h \ /usr/include/stdlib.h /usr/include/Availability.h \ /usr/include/AvailabilityInternal.h /usr/include/_types.h \ /usr/include/sys/_types.h /usr/include/sys/cdefs.h \ /usr/include/machine/_types.h /usr/include/i386/_types.h \ /usr/include/sys/wait.h /usr/include/sys/signal.h \ /usr/include/sys/appleapiopts.h /usr/include/machine/signal.h \ /usr/include/i386/signal.h /usr/include/i386/_structs.h \ /usr/include/sys/_structs.h /usr/include/machine/_structs.h \ /usr/include/mach/i386/_structs.h /usr/include/sys/resource.h \ /usr/include/machine/endian.h /usr/include/i386/endian.h \ /usr/include/sys/_endian.h /usr/include/libkern/_OSByteOrder.h \ /usr/include/libkern/i386/_OSByteOrder.h /usr/include/alloca.h \ /usr/include/machine/types.h /usr/include/i386/types.h \ /usr/include/i386/_types.h /usr/include/stdio.h /usr/include/string.h \ /usr/include/ctype.h /usr/include/runetype.h \ /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/limits.h \ /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/syslimits.h \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/i386/limits.h /usr/include/i386/_limits.h \ /usr/include/sys/syslimits.h /usr/include/poll.h \ /usr/include/sys/poll.h /usr/include/c++/4.2.1/string \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++config.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/os_defines.h \ /usr/include/unistd.h /usr/include/sys/unistd.h \ /usr/include/sys/select.h /usr/include/sys/_select.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/cpu_defines.h \ /usr/include/c++/4.2.1/bits/stringfwd.h \ /usr/include/c++/4.2.1/bits/char_traits.h \ /usr/include/c++/4.2.1/cstring /usr/include/c++/4.2.1/cstddef \ /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/stddef.h \ /usr/include/c++/4.2.1/bits/stl_algobase.h \ /usr/include/c++/4.2.1/climits /usr/include/c++/4.2.1/cstdlib \ /usr/include/c++/4.2.1/iosfwd \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++locale.h \ /usr/include/c++/4.2.1/clocale /usr/include/locale.h \ /usr/include/_locale.h /usr/include/c++/4.2.1/cstdio \ /usr/include/c++/4.2.1/cstdarg \ /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/stdarg.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++io.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/gthr.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/gthr-default.h \ /usr/include/pthread.h /usr/include/pthread_impl.h /usr/include/sched.h \ /usr/include/time.h /usr/include/_structs.h \ /usr/include/c++/4.2.1/cctype /usr/include/c++/4.2.1/bits/postypes.h \ /usr/include/c++/4.2.1/cwchar /usr/include/c++/4.2.1/ctime \ /usr/include/wchar.h /usr/include/_wctype.h \ /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/stdint.h \ /usr/include/c++/4.2.1/bits/functexcept.h \ /usr/include/c++/4.2.1/exception_defines.h \ /usr/include/c++/4.2.1/bits/stl_pair.h \ /usr/include/c++/4.2.1/bits/cpp_type_traits.h \ /usr/include/c++/4.2.1/ext/type_traits.h /usr/include/c++/4.2.1/utility \ /usr/include/c++/4.2.1/bits/stl_relops.h \ /usr/include/c++/4.2.1/bits/stl_iterator_base_types.h \ /usr/include/c++/4.2.1/bits/stl_iterator_base_funcs.h \ /usr/include/c++/4.2.1/bits/concept_check.h \ /usr/include/c++/4.2.1/bits/stl_iterator.h \ /usr/include/c++/4.2.1/debug/debug.h /usr/include/c++/4.2.1/memory \ /usr/include/c++/4.2.1/bits/allocator.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++allocator.h \ /usr/include/c++/4.2.1/ext/new_allocator.h /usr/include/c++/4.2.1/new \ /usr/include/c++/4.2.1/exception \ /usr/include/c++/4.2.1/bits/stl_construct.h \ /usr/include/c++/4.2.1/bits/stl_uninitialized.h \ /usr/include/c++/4.2.1/bits/stl_raw_storage_iter.h \ /usr/include/c++/4.2.1/limits \ /usr/include/c++/4.2.1/bits/ostream_insert.h \ /usr/include/c++/4.2.1/bits/stl_function.h \ /usr/include/c++/4.2.1/bits/basic_string.h \ /usr/include/c++/4.2.1/ext/atomicity.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/atomic_word.h \ /usr/include/c++/4.2.1/algorithm /usr/include/c++/4.2.1/bits/stl_algo.h \ /usr/include/c++/4.2.1/bits/stl_heap.h \ /usr/include/c++/4.2.1/bits/stl_tempbuf.h \ /usr/include/c++/4.2.1/bits/basic_string.tcc \ /usr/include/c++/4.2.1/iostream /usr/include/c++/4.2.1/ostream \ /usr/include/c++/4.2.1/ios /usr/include/c++/4.2.1/bits/localefwd.h \ /usr/include/c++/4.2.1/bits/ios_base.h \ /usr/include/c++/4.2.1/bits/locale_classes.h \ /usr/include/c++/4.2.1/streambuf \ /usr/include/c++/4.2.1/bits/streambuf.tcc \ /usr/include/c++/4.2.1/bits/basic_ios.h \ /usr/include/c++/4.2.1/bits/streambuf_iterator.h \ /usr/include/c++/4.2.1/bits/locale_facets.h \ /usr/include/c++/4.2.1/cwctype /usr/include/wctype.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/ctype_base.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/ctype_inline.h \ /usr/include/c++/4.2.1/bits/codecvt.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/time_members.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/messages_members.h \ /usr/include/c++/4.2.1/bits/basic_ios.tcc \ /usr/include/c++/4.2.1/bits/ostream.tcc /usr/include/c++/4.2.1/locale \ /usr/include/c++/4.2.1/bits/locale_facets.tcc \ /usr/include/c++/4.2.1/typeinfo /usr/include/c++/4.2.1/istream \ /usr/include/c++/4.2.1/bits/istream.tcc /usr/include/errno.h \ /usr/include/sys/errno.h /usr/include/sys/types.h \ /usr/include/sys/timeb.h /usr/include/sys/socket.h \ /usr/include/machine/_param.h /usr/include/i386/_param.h \ /usr/include/strings.h /usr/include/sys/time.h \ /usr/include/netinet/in.h /usr/include/netinet6/in6.h \ /usr/include/netinet/tcp.h /usr/include/arpa/inet.h \ /usr/include/netdb.h /usr/include/fcntl.h /usr/include/sys/fcntl.h \ /usr/include/math.h /usr/include/architecture/i386/math.h \ /usr/include/AvailabilityMacros.h stdsoap2.h: ../config.h: /usr/include/stdlib.h: /usr/include/Availability.h: /usr/include/AvailabilityInternal.h: /usr/include/_types.h: /usr/include/sys/_types.h: /usr/include/sys/cdefs.h: /usr/include/machine/_types.h: /usr/include/i386/_types.h: /usr/include/sys/wait.h: /usr/include/sys/signal.h: /usr/include/sys/appleapiopts.h: /usr/include/machine/signal.h: /usr/include/i386/signal.h: /usr/include/i386/_structs.h: /usr/include/sys/_structs.h: /usr/include/machine/_structs.h: /usr/include/mach/i386/_structs.h: /usr/include/sys/resource.h: /usr/include/machine/endian.h: /usr/include/i386/endian.h: /usr/include/sys/_endian.h: /usr/include/libkern/_OSByteOrder.h: /usr/include/libkern/i386/_OSByteOrder.h: /usr/include/alloca.h: /usr/include/machine/types.h: /usr/include/i386/types.h: /usr/include/i386/_types.h: /usr/include/stdio.h: /usr/include/string.h: /usr/include/ctype.h: /usr/include/runetype.h: /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/limits.h: /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/syslimits.h: /usr/include/limits.h: /usr/include/machine/limits.h: /usr/include/i386/limits.h: /usr/include/i386/_limits.h: /usr/include/sys/syslimits.h: /usr/include/poll.h: /usr/include/sys/poll.h: /usr/include/c++/4.2.1/string: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++config.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/os_defines.h: /usr/include/unistd.h: /usr/include/sys/unistd.h: /usr/include/sys/select.h: /usr/include/sys/_select.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/cpu_defines.h: /usr/include/c++/4.2.1/bits/stringfwd.h: /usr/include/c++/4.2.1/bits/char_traits.h: /usr/include/c++/4.2.1/cstring: /usr/include/c++/4.2.1/cstddef: /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/stddef.h: /usr/include/c++/4.2.1/bits/stl_algobase.h: /usr/include/c++/4.2.1/climits: /usr/include/c++/4.2.1/cstdlib: /usr/include/c++/4.2.1/iosfwd: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++locale.h: /usr/include/c++/4.2.1/clocale: /usr/include/locale.h: /usr/include/_locale.h: /usr/include/c++/4.2.1/cstdio: /usr/include/c++/4.2.1/cstdarg: /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/stdarg.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++io.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/gthr.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/gthr-default.h: /usr/include/pthread.h: /usr/include/pthread_impl.h: /usr/include/sched.h: /usr/include/time.h: /usr/include/_structs.h: /usr/include/c++/4.2.1/cctype: /usr/include/c++/4.2.1/bits/postypes.h: /usr/include/c++/4.2.1/cwchar: /usr/include/c++/4.2.1/ctime: /usr/include/wchar.h: /usr/include/_wctype.h: /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/stdint.h: /usr/include/c++/4.2.1/bits/functexcept.h: /usr/include/c++/4.2.1/exception_defines.h: /usr/include/c++/4.2.1/bits/stl_pair.h: /usr/include/c++/4.2.1/bits/cpp_type_traits.h: /usr/include/c++/4.2.1/ext/type_traits.h: /usr/include/c++/4.2.1/utility: /usr/include/c++/4.2.1/bits/stl_relops.h: /usr/include/c++/4.2.1/bits/stl_iterator_base_types.h: /usr/include/c++/4.2.1/bits/stl_iterator_base_funcs.h: /usr/include/c++/4.2.1/bits/concept_check.h: /usr/include/c++/4.2.1/bits/stl_iterator.h: /usr/include/c++/4.2.1/debug/debug.h: /usr/include/c++/4.2.1/memory: /usr/include/c++/4.2.1/bits/allocator.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++allocator.h: /usr/include/c++/4.2.1/ext/new_allocator.h: /usr/include/c++/4.2.1/new: /usr/include/c++/4.2.1/exception: /usr/include/c++/4.2.1/bits/stl_construct.h: /usr/include/c++/4.2.1/bits/stl_uninitialized.h: /usr/include/c++/4.2.1/bits/stl_raw_storage_iter.h: /usr/include/c++/4.2.1/limits: /usr/include/c++/4.2.1/bits/ostream_insert.h: /usr/include/c++/4.2.1/bits/stl_function.h: /usr/include/c++/4.2.1/bits/basic_string.h: /usr/include/c++/4.2.1/ext/atomicity.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/atomic_word.h: /usr/include/c++/4.2.1/algorithm: /usr/include/c++/4.2.1/bits/stl_algo.h: /usr/include/c++/4.2.1/bits/stl_heap.h: /usr/include/c++/4.2.1/bits/stl_tempbuf.h: /usr/include/c++/4.2.1/bits/basic_string.tcc: /usr/include/c++/4.2.1/iostream: /usr/include/c++/4.2.1/ostream: /usr/include/c++/4.2.1/ios: /usr/include/c++/4.2.1/bits/localefwd.h: /usr/include/c++/4.2.1/bits/ios_base.h: /usr/include/c++/4.2.1/bits/locale_classes.h: /usr/include/c++/4.2.1/streambuf: /usr/include/c++/4.2.1/bits/streambuf.tcc: /usr/include/c++/4.2.1/bits/basic_ios.h: /usr/include/c++/4.2.1/bits/streambuf_iterator.h: /usr/include/c++/4.2.1/bits/locale_facets.h: /usr/include/c++/4.2.1/cwctype: /usr/include/wctype.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/ctype_base.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/ctype_inline.h: /usr/include/c++/4.2.1/bits/codecvt.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/time_members.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/messages_members.h: /usr/include/c++/4.2.1/bits/basic_ios.tcc: /usr/include/c++/4.2.1/bits/ostream.tcc: /usr/include/c++/4.2.1/locale: /usr/include/c++/4.2.1/bits/locale_facets.tcc: /usr/include/c++/4.2.1/typeinfo: /usr/include/c++/4.2.1/istream: /usr/include/c++/4.2.1/bits/istream.tcc: /usr/include/errno.h: /usr/include/sys/errno.h: /usr/include/sys/types.h: /usr/include/sys/timeb.h: /usr/include/sys/socket.h: /usr/include/machine/_param.h: /usr/include/i386/_param.h: /usr/include/strings.h: /usr/include/sys/time.h: /usr/include/netinet/in.h: /usr/include/netinet6/in6.h: /usr/include/netinet/tcp.h: /usr/include/arpa/inet.h: /usr/include/netdb.h: /usr/include/fcntl.h: /usr/include/sys/fcntl.h: /usr/include/math.h: /usr/include/architecture/i386/math.h: /usr/include/AvailabilityMacros.h: gsoap-2.8.91/gsoap/.deps/.dirstamp0000644000175000017500000000000013525245157016231 0ustar ellertellertgsoap-2.8.91/gsoap/.deps/libgsoap_la-stdsoap2.Plo0000644000175000017500000000001013525245157021073 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/.deps/libgsoapssl++.a.Po0000644000175000017500000000001013525245157017575 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/.deps/libgsoapck___a-dom.Po0000644000175000017500000002717713525245157020426 0ustar ellertellertlibgsoapck___a-dom.o libgsoapck___a-dom.o: dom.cpp stdsoap2.h ../config.h \ /usr/include/stdlib.h /usr/include/Availability.h \ /usr/include/AvailabilityInternal.h /usr/include/_types.h \ /usr/include/sys/_types.h /usr/include/sys/cdefs.h \ /usr/include/machine/_types.h /usr/include/i386/_types.h \ /usr/include/sys/wait.h /usr/include/sys/signal.h \ /usr/include/sys/appleapiopts.h /usr/include/machine/signal.h \ /usr/include/i386/signal.h /usr/include/i386/_structs.h \ /usr/include/sys/_structs.h /usr/include/machine/_structs.h \ /usr/include/mach/i386/_structs.h /usr/include/sys/resource.h \ /usr/include/machine/endian.h /usr/include/i386/endian.h \ /usr/include/sys/_endian.h /usr/include/libkern/_OSByteOrder.h \ /usr/include/libkern/i386/_OSByteOrder.h /usr/include/alloca.h \ /usr/include/machine/types.h /usr/include/i386/types.h \ /usr/include/i386/_types.h /usr/include/stdio.h /usr/include/string.h \ /usr/include/ctype.h /usr/include/runetype.h \ /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/limits.h \ /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/syslimits.h \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/i386/limits.h /usr/include/i386/_limits.h \ /usr/include/sys/syslimits.h /usr/include/poll.h \ /usr/include/sys/poll.h /usr/include/c++/4.2.1/string \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++config.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/os_defines.h \ /usr/include/unistd.h /usr/include/sys/unistd.h \ /usr/include/sys/select.h /usr/include/sys/_select.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/cpu_defines.h \ /usr/include/c++/4.2.1/bits/stringfwd.h \ /usr/include/c++/4.2.1/bits/char_traits.h \ /usr/include/c++/4.2.1/cstring /usr/include/c++/4.2.1/cstddef \ /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/stddef.h \ /usr/include/c++/4.2.1/bits/stl_algobase.h \ /usr/include/c++/4.2.1/climits /usr/include/c++/4.2.1/cstdlib \ /usr/include/c++/4.2.1/iosfwd \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++locale.h \ /usr/include/c++/4.2.1/clocale /usr/include/locale.h \ /usr/include/_locale.h /usr/include/c++/4.2.1/cstdio \ /usr/include/c++/4.2.1/cstdarg \ /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/stdarg.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++io.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/gthr.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/gthr-default.h \ /usr/include/pthread.h /usr/include/pthread_impl.h /usr/include/sched.h \ /usr/include/time.h /usr/include/_structs.h \ /usr/include/c++/4.2.1/cctype /usr/include/c++/4.2.1/bits/postypes.h \ /usr/include/c++/4.2.1/cwchar /usr/include/c++/4.2.1/ctime \ /usr/include/wchar.h /usr/include/_wctype.h \ /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/stdint.h \ /usr/include/c++/4.2.1/bits/functexcept.h \ /usr/include/c++/4.2.1/exception_defines.h \ /usr/include/c++/4.2.1/bits/stl_pair.h \ /usr/include/c++/4.2.1/bits/cpp_type_traits.h \ /usr/include/c++/4.2.1/ext/type_traits.h /usr/include/c++/4.2.1/utility \ /usr/include/c++/4.2.1/bits/stl_relops.h \ /usr/include/c++/4.2.1/bits/stl_iterator_base_types.h \ /usr/include/c++/4.2.1/bits/stl_iterator_base_funcs.h \ /usr/include/c++/4.2.1/bits/concept_check.h \ /usr/include/c++/4.2.1/bits/stl_iterator.h \ /usr/include/c++/4.2.1/debug/debug.h /usr/include/c++/4.2.1/memory \ /usr/include/c++/4.2.1/bits/allocator.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++allocator.h \ /usr/include/c++/4.2.1/ext/new_allocator.h /usr/include/c++/4.2.1/new \ /usr/include/c++/4.2.1/exception \ /usr/include/c++/4.2.1/bits/stl_construct.h \ /usr/include/c++/4.2.1/bits/stl_uninitialized.h \ /usr/include/c++/4.2.1/bits/stl_raw_storage_iter.h \ /usr/include/c++/4.2.1/limits \ /usr/include/c++/4.2.1/bits/ostream_insert.h \ /usr/include/c++/4.2.1/bits/stl_function.h \ /usr/include/c++/4.2.1/bits/basic_string.h \ /usr/include/c++/4.2.1/ext/atomicity.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/atomic_word.h \ /usr/include/c++/4.2.1/algorithm /usr/include/c++/4.2.1/bits/stl_algo.h \ /usr/include/c++/4.2.1/bits/stl_heap.h \ /usr/include/c++/4.2.1/bits/stl_tempbuf.h \ /usr/include/c++/4.2.1/bits/basic_string.tcc \ /usr/include/c++/4.2.1/iostream /usr/include/c++/4.2.1/ostream \ /usr/include/c++/4.2.1/ios /usr/include/c++/4.2.1/bits/localefwd.h \ /usr/include/c++/4.2.1/bits/ios_base.h \ /usr/include/c++/4.2.1/bits/locale_classes.h \ /usr/include/c++/4.2.1/streambuf \ /usr/include/c++/4.2.1/bits/streambuf.tcc \ /usr/include/c++/4.2.1/bits/basic_ios.h \ /usr/include/c++/4.2.1/bits/streambuf_iterator.h \ /usr/include/c++/4.2.1/bits/locale_facets.h \ /usr/include/c++/4.2.1/cwctype /usr/include/wctype.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/ctype_base.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/ctype_inline.h \ /usr/include/c++/4.2.1/bits/codecvt.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/time_members.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/messages_members.h \ /usr/include/c++/4.2.1/bits/basic_ios.tcc \ /usr/include/c++/4.2.1/bits/ostream.tcc /usr/include/c++/4.2.1/locale \ /usr/include/c++/4.2.1/bits/locale_facets.tcc \ /usr/include/c++/4.2.1/typeinfo /usr/include/c++/4.2.1/istream \ /usr/include/c++/4.2.1/bits/istream.tcc /usr/include/errno.h \ /usr/include/sys/errno.h /usr/include/sys/types.h \ /usr/include/sys/timeb.h /usr/include/sys/socket.h \ /usr/include/machine/_param.h /usr/include/i386/_param.h \ /usr/include/strings.h /usr/include/sys/time.h \ /usr/include/netinet/in.h /usr/include/netinet6/in6.h \ /usr/include/netinet/tcp.h /usr/include/arpa/inet.h \ /usr/include/netdb.h /usr/include/fcntl.h /usr/include/sys/fcntl.h \ /usr/include/math.h /usr/include/architecture/i386/math.h \ /usr/include/AvailabilityMacros.h stdsoap2.h: ../config.h: /usr/include/stdlib.h: /usr/include/Availability.h: /usr/include/AvailabilityInternal.h: /usr/include/_types.h: /usr/include/sys/_types.h: /usr/include/sys/cdefs.h: /usr/include/machine/_types.h: /usr/include/i386/_types.h: /usr/include/sys/wait.h: /usr/include/sys/signal.h: /usr/include/sys/appleapiopts.h: /usr/include/machine/signal.h: /usr/include/i386/signal.h: /usr/include/i386/_structs.h: /usr/include/sys/_structs.h: /usr/include/machine/_structs.h: /usr/include/mach/i386/_structs.h: /usr/include/sys/resource.h: /usr/include/machine/endian.h: /usr/include/i386/endian.h: /usr/include/sys/_endian.h: /usr/include/libkern/_OSByteOrder.h: /usr/include/libkern/i386/_OSByteOrder.h: /usr/include/alloca.h: /usr/include/machine/types.h: /usr/include/i386/types.h: /usr/include/i386/_types.h: /usr/include/stdio.h: /usr/include/string.h: /usr/include/ctype.h: /usr/include/runetype.h: /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/limits.h: /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/syslimits.h: /usr/include/limits.h: /usr/include/machine/limits.h: /usr/include/i386/limits.h: /usr/include/i386/_limits.h: /usr/include/sys/syslimits.h: /usr/include/poll.h: /usr/include/sys/poll.h: /usr/include/c++/4.2.1/string: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++config.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/os_defines.h: /usr/include/unistd.h: /usr/include/sys/unistd.h: /usr/include/sys/select.h: /usr/include/sys/_select.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/cpu_defines.h: /usr/include/c++/4.2.1/bits/stringfwd.h: /usr/include/c++/4.2.1/bits/char_traits.h: /usr/include/c++/4.2.1/cstring: /usr/include/c++/4.2.1/cstddef: /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/stddef.h: /usr/include/c++/4.2.1/bits/stl_algobase.h: /usr/include/c++/4.2.1/climits: /usr/include/c++/4.2.1/cstdlib: /usr/include/c++/4.2.1/iosfwd: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++locale.h: /usr/include/c++/4.2.1/clocale: /usr/include/locale.h: /usr/include/_locale.h: /usr/include/c++/4.2.1/cstdio: /usr/include/c++/4.2.1/cstdarg: /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/stdarg.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++io.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/gthr.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/gthr-default.h: /usr/include/pthread.h: /usr/include/pthread_impl.h: /usr/include/sched.h: /usr/include/time.h: /usr/include/_structs.h: /usr/include/c++/4.2.1/cctype: /usr/include/c++/4.2.1/bits/postypes.h: /usr/include/c++/4.2.1/cwchar: /usr/include/c++/4.2.1/ctime: /usr/include/wchar.h: /usr/include/_wctype.h: /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/stdint.h: /usr/include/c++/4.2.1/bits/functexcept.h: /usr/include/c++/4.2.1/exception_defines.h: /usr/include/c++/4.2.1/bits/stl_pair.h: /usr/include/c++/4.2.1/bits/cpp_type_traits.h: /usr/include/c++/4.2.1/ext/type_traits.h: /usr/include/c++/4.2.1/utility: /usr/include/c++/4.2.1/bits/stl_relops.h: /usr/include/c++/4.2.1/bits/stl_iterator_base_types.h: /usr/include/c++/4.2.1/bits/stl_iterator_base_funcs.h: /usr/include/c++/4.2.1/bits/concept_check.h: /usr/include/c++/4.2.1/bits/stl_iterator.h: /usr/include/c++/4.2.1/debug/debug.h: /usr/include/c++/4.2.1/memory: /usr/include/c++/4.2.1/bits/allocator.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++allocator.h: /usr/include/c++/4.2.1/ext/new_allocator.h: /usr/include/c++/4.2.1/new: /usr/include/c++/4.2.1/exception: /usr/include/c++/4.2.1/bits/stl_construct.h: /usr/include/c++/4.2.1/bits/stl_uninitialized.h: /usr/include/c++/4.2.1/bits/stl_raw_storage_iter.h: /usr/include/c++/4.2.1/limits: /usr/include/c++/4.2.1/bits/ostream_insert.h: /usr/include/c++/4.2.1/bits/stl_function.h: /usr/include/c++/4.2.1/bits/basic_string.h: /usr/include/c++/4.2.1/ext/atomicity.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/atomic_word.h: /usr/include/c++/4.2.1/algorithm: /usr/include/c++/4.2.1/bits/stl_algo.h: /usr/include/c++/4.2.1/bits/stl_heap.h: /usr/include/c++/4.2.1/bits/stl_tempbuf.h: /usr/include/c++/4.2.1/bits/basic_string.tcc: /usr/include/c++/4.2.1/iostream: /usr/include/c++/4.2.1/ostream: /usr/include/c++/4.2.1/ios: /usr/include/c++/4.2.1/bits/localefwd.h: /usr/include/c++/4.2.1/bits/ios_base.h: /usr/include/c++/4.2.1/bits/locale_classes.h: /usr/include/c++/4.2.1/streambuf: /usr/include/c++/4.2.1/bits/streambuf.tcc: /usr/include/c++/4.2.1/bits/basic_ios.h: /usr/include/c++/4.2.1/bits/streambuf_iterator.h: /usr/include/c++/4.2.1/bits/locale_facets.h: /usr/include/c++/4.2.1/cwctype: /usr/include/wctype.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/ctype_base.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/ctype_inline.h: /usr/include/c++/4.2.1/bits/codecvt.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/time_members.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/messages_members.h: /usr/include/c++/4.2.1/bits/basic_ios.tcc: /usr/include/c++/4.2.1/bits/ostream.tcc: /usr/include/c++/4.2.1/locale: /usr/include/c++/4.2.1/bits/locale_facets.tcc: /usr/include/c++/4.2.1/typeinfo: /usr/include/c++/4.2.1/istream: /usr/include/c++/4.2.1/bits/istream.tcc: /usr/include/errno.h: /usr/include/sys/errno.h: /usr/include/sys/types.h: /usr/include/sys/timeb.h: /usr/include/sys/socket.h: /usr/include/machine/_param.h: /usr/include/i386/_param.h: /usr/include/strings.h: /usr/include/sys/time.h: /usr/include/netinet/in.h: /usr/include/netinet6/in6.h: /usr/include/netinet/tcp.h: /usr/include/arpa/inet.h: /usr/include/netdb.h: /usr/include/fcntl.h: /usr/include/sys/fcntl.h: /usr/include/math.h: /usr/include/architecture/i386/math.h: /usr/include/AvailabilityMacros.h: gsoap-2.8.91/gsoap/.deps/libgsoapssl___a-dom.Po0000644000175000017500000003447513525245157020631 0ustar ellertellertlibgsoapssl___a-dom.o libgsoapssl___a-dom.o: dom.cpp stdsoap2.h \ ../config.h /usr/include/stdlib.h /usr/include/Availability.h \ /usr/include/AvailabilityInternal.h /usr/include/_types.h \ /usr/include/sys/_types.h /usr/include/sys/cdefs.h \ /usr/include/machine/_types.h /usr/include/i386/_types.h \ /usr/include/sys/wait.h /usr/include/sys/signal.h \ /usr/include/sys/appleapiopts.h /usr/include/machine/signal.h \ /usr/include/i386/signal.h /usr/include/i386/_structs.h \ /usr/include/sys/_structs.h /usr/include/machine/_structs.h \ /usr/include/mach/i386/_structs.h /usr/include/sys/resource.h \ /usr/include/machine/endian.h /usr/include/i386/endian.h \ /usr/include/sys/_endian.h /usr/include/libkern/_OSByteOrder.h \ /usr/include/libkern/i386/_OSByteOrder.h /usr/include/alloca.h \ /usr/include/machine/types.h /usr/include/i386/types.h \ /usr/include/i386/_types.h /usr/include/stdio.h /usr/include/string.h \ /usr/include/ctype.h /usr/include/runetype.h \ /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/limits.h \ /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/syslimits.h \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/i386/limits.h /usr/include/i386/_limits.h \ /usr/include/sys/syslimits.h /usr/include/poll.h \ /usr/include/sys/poll.h /usr/include/c++/4.2.1/string \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++config.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/os_defines.h \ /usr/include/unistd.h /usr/include/sys/unistd.h \ /usr/include/sys/select.h /usr/include/sys/_select.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/cpu_defines.h \ /usr/include/c++/4.2.1/bits/stringfwd.h \ /usr/include/c++/4.2.1/bits/char_traits.h \ /usr/include/c++/4.2.1/cstring /usr/include/c++/4.2.1/cstddef \ /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/stddef.h \ /usr/include/c++/4.2.1/bits/stl_algobase.h \ /usr/include/c++/4.2.1/climits /usr/include/c++/4.2.1/cstdlib \ /usr/include/c++/4.2.1/iosfwd \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++locale.h \ /usr/include/c++/4.2.1/clocale /usr/include/locale.h \ /usr/include/_locale.h /usr/include/c++/4.2.1/cstdio \ /usr/include/c++/4.2.1/cstdarg \ /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/stdarg.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++io.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/gthr.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/gthr-default.h \ /usr/include/pthread.h /usr/include/pthread_impl.h /usr/include/sched.h \ /usr/include/time.h /usr/include/_structs.h \ /usr/include/c++/4.2.1/cctype /usr/include/c++/4.2.1/bits/postypes.h \ /usr/include/c++/4.2.1/cwchar /usr/include/c++/4.2.1/ctime \ /usr/include/wchar.h /usr/include/_wctype.h \ /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/stdint.h \ /usr/include/c++/4.2.1/bits/functexcept.h \ /usr/include/c++/4.2.1/exception_defines.h \ /usr/include/c++/4.2.1/bits/stl_pair.h \ /usr/include/c++/4.2.1/bits/cpp_type_traits.h \ /usr/include/c++/4.2.1/ext/type_traits.h /usr/include/c++/4.2.1/utility \ /usr/include/c++/4.2.1/bits/stl_relops.h \ /usr/include/c++/4.2.1/bits/stl_iterator_base_types.h \ /usr/include/c++/4.2.1/bits/stl_iterator_base_funcs.h \ /usr/include/c++/4.2.1/bits/concept_check.h \ /usr/include/c++/4.2.1/bits/stl_iterator.h \ /usr/include/c++/4.2.1/debug/debug.h /usr/include/c++/4.2.1/memory \ /usr/include/c++/4.2.1/bits/allocator.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++allocator.h \ /usr/include/c++/4.2.1/ext/new_allocator.h /usr/include/c++/4.2.1/new \ /usr/include/c++/4.2.1/exception \ /usr/include/c++/4.2.1/bits/stl_construct.h \ /usr/include/c++/4.2.1/bits/stl_uninitialized.h \ /usr/include/c++/4.2.1/bits/stl_raw_storage_iter.h \ /usr/include/c++/4.2.1/limits \ /usr/include/c++/4.2.1/bits/ostream_insert.h \ /usr/include/c++/4.2.1/bits/stl_function.h \ /usr/include/c++/4.2.1/bits/basic_string.h \ /usr/include/c++/4.2.1/ext/atomicity.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/atomic_word.h \ /usr/include/c++/4.2.1/algorithm /usr/include/c++/4.2.1/bits/stl_algo.h \ /usr/include/c++/4.2.1/bits/stl_heap.h \ /usr/include/c++/4.2.1/bits/stl_tempbuf.h \ /usr/include/c++/4.2.1/bits/basic_string.tcc \ /usr/include/c++/4.2.1/iostream /usr/include/c++/4.2.1/ostream \ /usr/include/c++/4.2.1/ios /usr/include/c++/4.2.1/bits/localefwd.h \ /usr/include/c++/4.2.1/bits/ios_base.h \ /usr/include/c++/4.2.1/bits/locale_classes.h \ /usr/include/c++/4.2.1/streambuf \ /usr/include/c++/4.2.1/bits/streambuf.tcc \ /usr/include/c++/4.2.1/bits/basic_ios.h \ /usr/include/c++/4.2.1/bits/streambuf_iterator.h \ /usr/include/c++/4.2.1/bits/locale_facets.h \ /usr/include/c++/4.2.1/cwctype /usr/include/wctype.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/ctype_base.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/ctype_inline.h \ /usr/include/c++/4.2.1/bits/codecvt.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/time_members.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/messages_members.h \ /usr/include/c++/4.2.1/bits/basic_ios.tcc \ /usr/include/c++/4.2.1/bits/ostream.tcc /usr/include/c++/4.2.1/locale \ /usr/include/c++/4.2.1/bits/locale_facets.tcc \ /usr/include/c++/4.2.1/typeinfo /usr/include/c++/4.2.1/istream \ /usr/include/c++/4.2.1/bits/istream.tcc /usr/include/errno.h \ /usr/include/sys/errno.h /usr/include/sys/types.h \ /usr/include/sys/timeb.h /usr/include/sys/socket.h \ /usr/include/machine/_param.h /usr/include/i386/_param.h \ /usr/include/strings.h /usr/include/sys/time.h \ /usr/include/netinet/in.h /usr/include/netinet6/in6.h \ /usr/include/netinet/tcp.h /usr/include/arpa/inet.h \ /usr/include/netdb.h /usr/include/fcntl.h /usr/include/sys/fcntl.h \ /usr/include/openssl/bio.h /usr/include/openssl/e_os2.h \ /usr/include/openssl/opensslconf.h /usr/include/openssl/crypto.h \ /usr/include/openssl/stack.h /usr/include/openssl/safestack.h \ /usr/include/openssl/opensslv.h /usr/include/openssl/ossl_typ.h \ /usr/include/openssl/symhacks.h /usr/include/openssl/err.h \ /usr/include/openssl/lhash.h /usr/include/openssl/rand.h \ /usr/include/openssl/ssl.h /usr/include/openssl/comp.h \ /usr/include/openssl/x509.h /usr/include/openssl/buffer.h \ /usr/include/openssl/evp.h /usr/include/openssl/objects.h \ /usr/include/openssl/obj_mac.h /usr/include/openssl/asn1.h \ /usr/include/openssl/bn.h /usr/include/openssl/ec.h \ /usr/include/openssl/ecdsa.h /usr/include/openssl/ecdh.h \ /usr/include/openssl/rsa.h /usr/include/openssl/dsa.h \ /usr/include/openssl/dh.h /usr/include/openssl/sha.h \ /usr/include/openssl/x509_vfy.h /usr/include/openssl/pkcs7.h \ /usr/include/openssl/pem.h /usr/include/openssl/pem2.h \ /usr/include/openssl/hmac.h /usr/include/openssl/kssl.h \ /usr/include/openssl/ssl2.h /usr/include/openssl/ssl3.h \ /usr/include/openssl/pq_compat.h /usr/include/openssl/tls1.h \ /usr/include/openssl/dtls1.h /usr/include/openssl/pqueue.h \ /usr/include/openssl/ssl23.h /usr/include/openssl/x509v3.h \ /usr/include/openssl/conf.h /usr/include/zlib.h /usr/include/zconf.h \ /usr/include/math.h /usr/include/architecture/i386/math.h \ /usr/include/AvailabilityMacros.h stdsoap2.h: ../config.h: /usr/include/stdlib.h: /usr/include/Availability.h: /usr/include/AvailabilityInternal.h: /usr/include/_types.h: /usr/include/sys/_types.h: /usr/include/sys/cdefs.h: /usr/include/machine/_types.h: /usr/include/i386/_types.h: /usr/include/sys/wait.h: /usr/include/sys/signal.h: /usr/include/sys/appleapiopts.h: /usr/include/machine/signal.h: /usr/include/i386/signal.h: /usr/include/i386/_structs.h: /usr/include/sys/_structs.h: /usr/include/machine/_structs.h: /usr/include/mach/i386/_structs.h: /usr/include/sys/resource.h: /usr/include/machine/endian.h: /usr/include/i386/endian.h: /usr/include/sys/_endian.h: /usr/include/libkern/_OSByteOrder.h: /usr/include/libkern/i386/_OSByteOrder.h: /usr/include/alloca.h: /usr/include/machine/types.h: /usr/include/i386/types.h: /usr/include/i386/_types.h: /usr/include/stdio.h: /usr/include/string.h: /usr/include/ctype.h: /usr/include/runetype.h: /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/limits.h: /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/syslimits.h: /usr/include/limits.h: /usr/include/machine/limits.h: /usr/include/i386/limits.h: /usr/include/i386/_limits.h: /usr/include/sys/syslimits.h: /usr/include/poll.h: /usr/include/sys/poll.h: /usr/include/c++/4.2.1/string: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++config.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/os_defines.h: /usr/include/unistd.h: /usr/include/sys/unistd.h: /usr/include/sys/select.h: /usr/include/sys/_select.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/cpu_defines.h: /usr/include/c++/4.2.1/bits/stringfwd.h: /usr/include/c++/4.2.1/bits/char_traits.h: /usr/include/c++/4.2.1/cstring: /usr/include/c++/4.2.1/cstddef: /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/stddef.h: /usr/include/c++/4.2.1/bits/stl_algobase.h: /usr/include/c++/4.2.1/climits: /usr/include/c++/4.2.1/cstdlib: /usr/include/c++/4.2.1/iosfwd: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++locale.h: /usr/include/c++/4.2.1/clocale: /usr/include/locale.h: /usr/include/_locale.h: /usr/include/c++/4.2.1/cstdio: /usr/include/c++/4.2.1/cstdarg: /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/stdarg.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++io.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/gthr.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/gthr-default.h: /usr/include/pthread.h: /usr/include/pthread_impl.h: /usr/include/sched.h: /usr/include/time.h: /usr/include/_structs.h: /usr/include/c++/4.2.1/cctype: /usr/include/c++/4.2.1/bits/postypes.h: /usr/include/c++/4.2.1/cwchar: /usr/include/c++/4.2.1/ctime: /usr/include/wchar.h: /usr/include/_wctype.h: /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/stdint.h: /usr/include/c++/4.2.1/bits/functexcept.h: /usr/include/c++/4.2.1/exception_defines.h: /usr/include/c++/4.2.1/bits/stl_pair.h: /usr/include/c++/4.2.1/bits/cpp_type_traits.h: /usr/include/c++/4.2.1/ext/type_traits.h: /usr/include/c++/4.2.1/utility: /usr/include/c++/4.2.1/bits/stl_relops.h: /usr/include/c++/4.2.1/bits/stl_iterator_base_types.h: /usr/include/c++/4.2.1/bits/stl_iterator_base_funcs.h: /usr/include/c++/4.2.1/bits/concept_check.h: /usr/include/c++/4.2.1/bits/stl_iterator.h: /usr/include/c++/4.2.1/debug/debug.h: /usr/include/c++/4.2.1/memory: /usr/include/c++/4.2.1/bits/allocator.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++allocator.h: /usr/include/c++/4.2.1/ext/new_allocator.h: /usr/include/c++/4.2.1/new: /usr/include/c++/4.2.1/exception: /usr/include/c++/4.2.1/bits/stl_construct.h: /usr/include/c++/4.2.1/bits/stl_uninitialized.h: /usr/include/c++/4.2.1/bits/stl_raw_storage_iter.h: /usr/include/c++/4.2.1/limits: /usr/include/c++/4.2.1/bits/ostream_insert.h: /usr/include/c++/4.2.1/bits/stl_function.h: /usr/include/c++/4.2.1/bits/basic_string.h: /usr/include/c++/4.2.1/ext/atomicity.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/atomic_word.h: /usr/include/c++/4.2.1/algorithm: /usr/include/c++/4.2.1/bits/stl_algo.h: /usr/include/c++/4.2.1/bits/stl_heap.h: /usr/include/c++/4.2.1/bits/stl_tempbuf.h: /usr/include/c++/4.2.1/bits/basic_string.tcc: /usr/include/c++/4.2.1/iostream: /usr/include/c++/4.2.1/ostream: /usr/include/c++/4.2.1/ios: /usr/include/c++/4.2.1/bits/localefwd.h: /usr/include/c++/4.2.1/bits/ios_base.h: /usr/include/c++/4.2.1/bits/locale_classes.h: /usr/include/c++/4.2.1/streambuf: /usr/include/c++/4.2.1/bits/streambuf.tcc: /usr/include/c++/4.2.1/bits/basic_ios.h: /usr/include/c++/4.2.1/bits/streambuf_iterator.h: /usr/include/c++/4.2.1/bits/locale_facets.h: /usr/include/c++/4.2.1/cwctype: /usr/include/wctype.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/ctype_base.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/ctype_inline.h: /usr/include/c++/4.2.1/bits/codecvt.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/time_members.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/messages_members.h: /usr/include/c++/4.2.1/bits/basic_ios.tcc: /usr/include/c++/4.2.1/bits/ostream.tcc: /usr/include/c++/4.2.1/locale: /usr/include/c++/4.2.1/bits/locale_facets.tcc: /usr/include/c++/4.2.1/typeinfo: /usr/include/c++/4.2.1/istream: /usr/include/c++/4.2.1/bits/istream.tcc: /usr/include/errno.h: /usr/include/sys/errno.h: /usr/include/sys/types.h: /usr/include/sys/timeb.h: /usr/include/sys/socket.h: /usr/include/machine/_param.h: /usr/include/i386/_param.h: /usr/include/strings.h: /usr/include/sys/time.h: /usr/include/netinet/in.h: /usr/include/netinet6/in6.h: /usr/include/netinet/tcp.h: /usr/include/arpa/inet.h: /usr/include/netdb.h: /usr/include/fcntl.h: /usr/include/sys/fcntl.h: /usr/include/openssl/bio.h: /usr/include/openssl/e_os2.h: /usr/include/openssl/opensslconf.h: /usr/include/openssl/crypto.h: /usr/include/openssl/stack.h: /usr/include/openssl/safestack.h: /usr/include/openssl/opensslv.h: /usr/include/openssl/ossl_typ.h: /usr/include/openssl/symhacks.h: /usr/include/openssl/err.h: /usr/include/openssl/lhash.h: /usr/include/openssl/rand.h: /usr/include/openssl/ssl.h: /usr/include/openssl/comp.h: /usr/include/openssl/x509.h: /usr/include/openssl/buffer.h: /usr/include/openssl/evp.h: /usr/include/openssl/objects.h: /usr/include/openssl/obj_mac.h: /usr/include/openssl/asn1.h: /usr/include/openssl/bn.h: /usr/include/openssl/ec.h: /usr/include/openssl/ecdsa.h: /usr/include/openssl/ecdh.h: /usr/include/openssl/rsa.h: /usr/include/openssl/dsa.h: /usr/include/openssl/dh.h: /usr/include/openssl/sha.h: /usr/include/openssl/x509_vfy.h: /usr/include/openssl/pkcs7.h: /usr/include/openssl/pem.h: /usr/include/openssl/pem2.h: /usr/include/openssl/hmac.h: /usr/include/openssl/kssl.h: /usr/include/openssl/ssl2.h: /usr/include/openssl/ssl3.h: /usr/include/openssl/pq_compat.h: /usr/include/openssl/tls1.h: /usr/include/openssl/dtls1.h: /usr/include/openssl/pqueue.h: /usr/include/openssl/ssl23.h: /usr/include/openssl/x509v3.h: /usr/include/openssl/conf.h: /usr/include/zlib.h: /usr/include/zconf.h: /usr/include/math.h: /usr/include/architecture/i386/math.h: /usr/include/AvailabilityMacros.h: gsoap-2.8.91/gsoap/.deps/libgsoapssl___la-stdsoap2_ssl_cpp.Plo0000644000175000017500000000001013525245157023636 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/.deps/libgsoapssl.a.Po0000644000175000017500000000001013525245157017447 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/.deps/libgsoap___la-stdsoap2_cpp.Plo0000644000175000017500000000001013525245157022233 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/.deps/stdsoap2_cpp.Po0000644000175000017500000001757613525245157017340 0ustar ellertellertstdsoap2_cpp.o stdsoap2_cpp.o: stdsoap2_cpp.cpp stdsoap2.h ../config.h \ /usr/include/gcc/darwin/3.1/g++-v3/string \ /usr/include/gcc/darwin/3.1/g++-v3/ppc-darwin/bits/c++config.h \ /usr/include/gcc/darwin/3.1/g++-v3/ppc-darwin/bits/os_defines.h \ /usr/include/gcc/darwin/3.1/g++-v3/bits/stringfwd.h \ /usr/include/gcc/darwin/3.1/g++-v3/bits/char_traits.h \ /usr/include/gcc/darwin/3.1/g++-v3/cstring \ /usr/include/gcc/darwin/3.1/g++-v3/cstddef \ /usr/include/gcc/darwin/3.1/g++-v3/bits/fpos.h \ /usr/include/gcc/darwin/3.1/g++-v3/ppc-darwin/bits/c++io.h \ /usr/include/gcc/darwin/3.1/g++-v3/cstdio \ /usr/include/gcc/darwin/3.1/g++-v3/ppc-darwin/bits/gthr.h \ /usr/include/gcc/darwin/3.1/g++-v3/ppc-darwin/bits/gthr-default.h \ /usr/include/gcc/darwin/3.1/g++-v3/cwchar \ /usr/include/gcc/darwin/3.1/g++-v3/ctime \ /usr/include/gcc/darwin/3.1/g++-v3/memory \ /usr/include/gcc/darwin/3.1/g++-v3/bits/stl_algobase.h \ /usr/include/gcc/darwin/3.1/g++-v3/climits \ /usr/include/gcc/darwin/3.1/g++-v3/cstdlib \ /usr/include/gcc/darwin/3.1/g++-v3/new \ /usr/include/gcc/darwin/3.1/g++-v3/exception \ /usr/include/gcc/darwin/3.1/g++-v3/iosfwd \ /usr/include/gcc/darwin/3.1/g++-v3/bits/functexcept.h \ /usr/include/gcc/darwin/3.1/g++-v3/exception_defines.h \ /usr/include/gcc/darwin/3.1/g++-v3/bits/stl_pair.h \ /usr/include/gcc/darwin/3.1/g++-v3/bits/type_traits.h \ /usr/include/gcc/darwin/3.1/g++-v3/bits/stl_iterator_base_types.h \ /usr/include/gcc/darwin/3.1/g++-v3/bits/stl_iterator_base_funcs.h \ /usr/include/gcc/darwin/3.1/g++-v3/bits/concept_check.h \ /usr/include/gcc/darwin/3.1/g++-v3/bits/stl_iterator.h \ /usr/include/gcc/darwin/3.1/g++-v3/bits/stl_alloc.h \ /usr/include/gcc/darwin/3.1/g++-v3/cassert \ /usr/include/gcc/darwin/3.1/g++-v3/bits/stl_threads.h \ /usr/include/gcc/darwin/3.1/g++-v3/bits/stl_construct.h \ /usr/include/gcc/darwin/3.1/g++-v3/bits/stl_uninitialized.h \ /usr/include/gcc/darwin/3.1/g++-v3/bits/stl_raw_storage_iter.h \ /usr/include/gcc/darwin/3.1/g++-v3/bits/stl_function.h \ /usr/include/gcc/darwin/3.1/g++-v3/bits/basic_string.h \ /usr/include/gcc/darwin/3.1/g++-v3/ppc-darwin/bits/atomicity.h \ /usr/include/gcc/darwin/3.1/g++-v3/algorithm \ /usr/include/gcc/darwin/3.1/g++-v3/bits/stl_algo.h \ /usr/include/gcc/darwin/3.1/g++-v3/bits/stl_heap.h \ /usr/include/gcc/darwin/3.1/g++-v3/bits/stl_tempbuf.h \ /usr/include/gcc/darwin/3.1/g++-v3/bits/basic_string.tcc \ /usr/include/gcc/darwin/3.1/g++-v3/iostream \ /usr/include/gcc/darwin/3.1/g++-v3/ostream \ /usr/include/gcc/darwin/3.1/g++-v3/ios \ /usr/include/gcc/darwin/3.1/g++-v3/bits/localefwd.h \ /usr/include/gcc/darwin/3.1/g++-v3/ppc-darwin/bits/c++locale.h \ /usr/include/gcc/darwin/3.1/g++-v3/clocale \ /usr/include/gcc/darwin/3.1/g++-v3/cctype \ /usr/include/gcc/darwin/3.1/g++-v3/bits/ios_base.h \ /usr/include/gcc/darwin/3.1/g++-v3/streambuf \ /usr/include/gcc/darwin/3.1/g++-v3/bits/streambuf.tcc \ /usr/include/gcc/darwin/3.1/g++-v3/bits/basic_ios.h \ /usr/include/gcc/darwin/3.1/g++-v3/bits/streambuf_iterator.h \ /usr/include/gcc/darwin/3.1/g++-v3/bits/locale_facets.h \ /usr/include/gcc/darwin/3.1/g++-v3/cwctype \ /usr/include/gcc/darwin/3.1/g++-v3/ppc-darwin/bits/ctype_base.h \ /usr/include/gcc/darwin/3.1/g++-v3/ppc-darwin/bits/ctype_inline.h \ /usr/include/gcc/darwin/3.1/g++-v3/bits/codecvt.h \ /usr/include/gcc/darwin/3.1/g++-v3/ppc-darwin/bits/messages_members.h \ /usr/include/gcc/darwin/3.1/g++-v3/bits/basic_ios.tcc \ /usr/include/gcc/darwin/3.1/g++-v3/bits/ostream.tcc \ /usr/include/gcc/darwin/3.1/g++-v3/locale \ /usr/include/gcc/darwin/3.1/g++-v3/bits/locale_facets.tcc \ /usr/include/gcc/darwin/3.1/g++-v3/cerrno \ /usr/include/gcc/darwin/3.1/g++-v3/cmath \ /usr/include/gcc/darwin/3.1/g++-v3/bits/cmath.tcc \ /usr/include/gcc/darwin/3.1/g++-v3/limits \ /usr/include/gcc/darwin/3.1/g++-v3/ppc-darwin/bits/cpu_limits.h \ /usr/include/gcc/darwin/3.1/g++-v3/typeinfo \ /usr/include/gcc/darwin/3.1/g++-v3/istream \ /usr/include/gcc/darwin/3.1/g++-v3/bits/istream.tcc stdsoap2.h: ../config.h: /usr/include/gcc/darwin/3.1/g++-v3/string: /usr/include/gcc/darwin/3.1/g++-v3/ppc-darwin/bits/c++config.h: /usr/include/gcc/darwin/3.1/g++-v3/ppc-darwin/bits/os_defines.h: /usr/include/gcc/darwin/3.1/g++-v3/bits/stringfwd.h: /usr/include/gcc/darwin/3.1/g++-v3/bits/char_traits.h: /usr/include/gcc/darwin/3.1/g++-v3/cstring: /usr/include/gcc/darwin/3.1/g++-v3/cstddef: /usr/include/gcc/darwin/3.1/g++-v3/bits/fpos.h: /usr/include/gcc/darwin/3.1/g++-v3/ppc-darwin/bits/c++io.h: /usr/include/gcc/darwin/3.1/g++-v3/cstdio: /usr/include/gcc/darwin/3.1/g++-v3/ppc-darwin/bits/gthr.h: /usr/include/gcc/darwin/3.1/g++-v3/ppc-darwin/bits/gthr-default.h: /usr/include/gcc/darwin/3.1/g++-v3/cwchar: /usr/include/gcc/darwin/3.1/g++-v3/ctime: /usr/include/gcc/darwin/3.1/g++-v3/memory: /usr/include/gcc/darwin/3.1/g++-v3/bits/stl_algobase.h: /usr/include/gcc/darwin/3.1/g++-v3/climits: /usr/include/gcc/darwin/3.1/g++-v3/cstdlib: /usr/include/gcc/darwin/3.1/g++-v3/new: /usr/include/gcc/darwin/3.1/g++-v3/exception: /usr/include/gcc/darwin/3.1/g++-v3/iosfwd: /usr/include/gcc/darwin/3.1/g++-v3/bits/functexcept.h: /usr/include/gcc/darwin/3.1/g++-v3/exception_defines.h: /usr/include/gcc/darwin/3.1/g++-v3/bits/stl_pair.h: /usr/include/gcc/darwin/3.1/g++-v3/bits/type_traits.h: /usr/include/gcc/darwin/3.1/g++-v3/bits/stl_iterator_base_types.h: /usr/include/gcc/darwin/3.1/g++-v3/bits/stl_iterator_base_funcs.h: /usr/include/gcc/darwin/3.1/g++-v3/bits/concept_check.h: /usr/include/gcc/darwin/3.1/g++-v3/bits/stl_iterator.h: /usr/include/gcc/darwin/3.1/g++-v3/bits/stl_alloc.h: /usr/include/gcc/darwin/3.1/g++-v3/cassert: /usr/include/gcc/darwin/3.1/g++-v3/bits/stl_threads.h: /usr/include/gcc/darwin/3.1/g++-v3/bits/stl_construct.h: /usr/include/gcc/darwin/3.1/g++-v3/bits/stl_uninitialized.h: /usr/include/gcc/darwin/3.1/g++-v3/bits/stl_raw_storage_iter.h: /usr/include/gcc/darwin/3.1/g++-v3/bits/stl_function.h: /usr/include/gcc/darwin/3.1/g++-v3/bits/basic_string.h: /usr/include/gcc/darwin/3.1/g++-v3/ppc-darwin/bits/atomicity.h: /usr/include/gcc/darwin/3.1/g++-v3/algorithm: /usr/include/gcc/darwin/3.1/g++-v3/bits/stl_algo.h: /usr/include/gcc/darwin/3.1/g++-v3/bits/stl_heap.h: /usr/include/gcc/darwin/3.1/g++-v3/bits/stl_tempbuf.h: /usr/include/gcc/darwin/3.1/g++-v3/bits/basic_string.tcc: /usr/include/gcc/darwin/3.1/g++-v3/iostream: /usr/include/gcc/darwin/3.1/g++-v3/ostream: /usr/include/gcc/darwin/3.1/g++-v3/ios: /usr/include/gcc/darwin/3.1/g++-v3/bits/localefwd.h: /usr/include/gcc/darwin/3.1/g++-v3/ppc-darwin/bits/c++locale.h: /usr/include/gcc/darwin/3.1/g++-v3/clocale: /usr/include/gcc/darwin/3.1/g++-v3/cctype: /usr/include/gcc/darwin/3.1/g++-v3/bits/ios_base.h: /usr/include/gcc/darwin/3.1/g++-v3/streambuf: /usr/include/gcc/darwin/3.1/g++-v3/bits/streambuf.tcc: /usr/include/gcc/darwin/3.1/g++-v3/bits/basic_ios.h: /usr/include/gcc/darwin/3.1/g++-v3/bits/streambuf_iterator.h: /usr/include/gcc/darwin/3.1/g++-v3/bits/locale_facets.h: /usr/include/gcc/darwin/3.1/g++-v3/cwctype: /usr/include/gcc/darwin/3.1/g++-v3/ppc-darwin/bits/ctype_base.h: /usr/include/gcc/darwin/3.1/g++-v3/ppc-darwin/bits/ctype_inline.h: /usr/include/gcc/darwin/3.1/g++-v3/bits/codecvt.h: /usr/include/gcc/darwin/3.1/g++-v3/ppc-darwin/bits/messages_members.h: /usr/include/gcc/darwin/3.1/g++-v3/bits/basic_ios.tcc: /usr/include/gcc/darwin/3.1/g++-v3/bits/ostream.tcc: /usr/include/gcc/darwin/3.1/g++-v3/locale: /usr/include/gcc/darwin/3.1/g++-v3/bits/locale_facets.tcc: /usr/include/gcc/darwin/3.1/g++-v3/cerrno: /usr/include/gcc/darwin/3.1/g++-v3/cmath: /usr/include/gcc/darwin/3.1/g++-v3/bits/cmath.tcc: /usr/include/gcc/darwin/3.1/g++-v3/limits: /usr/include/gcc/darwin/3.1/g++-v3/ppc-darwin/bits/cpu_limits.h: /usr/include/gcc/darwin/3.1/g++-v3/typeinfo: /usr/include/gcc/darwin/3.1/g++-v3/istream: /usr/include/gcc/darwin/3.1/g++-v3/bits/istream.tcc: gsoap-2.8.91/gsoap/.deps/wssedemo-dom.Po0000644000175000017500000003256413525245157017334 0ustar ellertellert../../wssedemo-dom.o: ../../dom.c ../../../gsoap/stdsoap2.h \ ../../../config.h /usr/include/stdlib.h /usr/include/Availability.h \ /usr/include/AvailabilityInternal.h /usr/include/_types.h \ /usr/include/sys/_types.h /usr/include/sys/cdefs.h \ /usr/include/sys/_symbol_aliasing.h \ /usr/include/sys/_posix_availability.h /usr/include/machine/_types.h \ /usr/include/i386/_types.h /usr/include/sys/wait.h \ /usr/include/sys/_types/_pid_t.h /usr/include/sys/_types/_id_t.h \ /usr/include/sys/signal.h /usr/include/sys/appleapiopts.h \ /usr/include/machine/signal.h /usr/include/i386/signal.h \ /usr/include/machine/_mcontext.h /usr/include/i386/_mcontext.h \ /usr/include/mach/i386/_structs.h \ /usr/include/sys/_types/_sigaltstack.h \ /usr/include/sys/_types/_ucontext.h \ /usr/include/sys/_types/_pthread_attr_t.h \ /usr/include/sys/_types/_sigset_t.h /usr/include/sys/_types/_size_t.h \ /usr/include/sys/_types/_uid_t.h /usr/include/sys/resource.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/include/stdint.h \ /usr/include/stdint.h /usr/include/sys/_types/_int8_t.h \ /usr/include/sys/_types/_int16_t.h /usr/include/sys/_types/_int32_t.h \ /usr/include/sys/_types/_int64_t.h /usr/include/_types/_uint8_t.h \ /usr/include/_types/_uint16_t.h /usr/include/_types/_uint32_t.h \ /usr/include/_types/_uint64_t.h /usr/include/sys/_types/_intptr_t.h \ /usr/include/sys/_types/_uintptr_t.h /usr/include/_types/_intmax_t.h \ /usr/include/_types/_uintmax_t.h /usr/include/sys/_types/_timeval.h \ /usr/include/machine/endian.h /usr/include/i386/endian.h \ /usr/include/sys/_endian.h /usr/include/libkern/_OSByteOrder.h \ /usr/include/libkern/i386/_OSByteOrder.h /usr/include/alloca.h \ /usr/include/sys/_types/_ct_rune_t.h /usr/include/sys/_types/_rune_t.h \ /usr/include/sys/_types/_wchar_t.h /usr/include/sys/_types/_null.h \ /usr/include/machine/types.h /usr/include/i386/types.h \ /usr/include/sys/_types/___offsetof.h /usr/include/sys/_types/_dev_t.h \ /usr/include/sys/_types/_mode_t.h /usr/include/stdio.h \ /usr/include/sys/_types/_va_list.h /usr/include/sys/_types/_off_t.h \ /usr/include/sys/_types/_ssize_t.h /usr/include/secure/_stdio.h \ /usr/include/secure/_common.h /usr/include/string.h \ /usr/include/sys/_types/_rsize_t.h /usr/include/sys/_types/_errno_t.h \ /usr/include/strings.h /usr/include/secure/_string.h \ /usr/include/ctype.h /usr/include/runetype.h \ /usr/include/sys/_types/_wint_t.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/include/limits.h \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/i386/limits.h /usr/include/i386/_limits.h \ /usr/include/sys/syslimits.h /usr/include/poll.h \ /usr/include/sys/poll.h /usr/include/errno.h /usr/include/sys/errno.h \ /usr/include/sys/types.h /usr/include/sys/_types/_blkcnt_t.h \ /usr/include/sys/_types/_blksize_t.h /usr/include/sys/_types/_gid_t.h \ /usr/include/sys/_types/_in_addr_t.h \ /usr/include/sys/_types/_in_port_t.h /usr/include/sys/_types/_ino_t.h \ /usr/include/sys/_types/_ino64_t.h /usr/include/sys/_types/_key_t.h \ /usr/include/sys/_types/_nlink_t.h /usr/include/sys/_types/_clock_t.h \ /usr/include/sys/_types/_time_t.h \ /usr/include/sys/_types/_useconds_t.h \ /usr/include/sys/_types/_suseconds_t.h \ /usr/include/sys/_types/_fd_def.h \ /usr/include/sys/_types/_fd_setsize.h \ /usr/include/sys/_types/_fd_set.h /usr/include/sys/_types/_fd_clr.h \ /usr/include/sys/_types/_fd_zero.h /usr/include/sys/_types/_fd_isset.h \ /usr/include/sys/_types/_fd_copy.h \ /usr/include/sys/_types/_pthread_cond_t.h \ /usr/include/sys/_types/_pthread_condattr_t.h \ /usr/include/sys/_types/_pthread_mutex_t.h \ /usr/include/sys/_types/_pthread_mutexattr_t.h \ /usr/include/sys/_types/_pthread_once_t.h \ /usr/include/sys/_types/_pthread_rwlock_t.h \ /usr/include/sys/_types/_pthread_rwlockattr_t.h \ /usr/include/sys/_types/_pthread_t.h \ /usr/include/sys/_types/_pthread_key_t.h \ /usr/include/sys/_types/_fsblkcnt_t.h \ /usr/include/sys/_types/_fsfilcnt_t.h /usr/include/sys/timeb.h \ /usr/include/time.h /usr/include/_structs.h \ /usr/include/sys/_structs.h /usr/include/sys/_types/_timespec.h \ /usr/include/sys/socket.h /usr/include/machine/_param.h \ /usr/include/i386/_param.h /usr/include/sys/_types/_sa_family_t.h \ /usr/include/sys/_types/_socklen_t.h \ /usr/include/sys/_types/_iovec_t.h /usr/include/sys/time.h \ /usr/include/sys/_select.h /usr/include/netinet/in.h \ /usr/include/netinet6/in6.h /usr/include/netinet/tcp.h \ /usr/include/arpa/inet.h /usr/include/netdb.h /usr/include/unistd.h \ /usr/include/sys/unistd.h /usr/include/sys/_types/_posix_vdisable.h \ /usr/include/sys/_types/_seek_set.h /usr/include/sys/select.h \ /usr/include/sys/_types/_uuid_t.h /usr/include/gethostuuid.h \ /usr/include/fcntl.h /usr/include/sys/fcntl.h \ /usr/include/sys/_types/_o_sync.h /usr/include/sys/_types/_o_dsync.h \ /usr/include/sys/_types/_s_ifmt.h /usr/include/sys/_types/_filesec_t.h \ /usr/include/openssl/bio.h /usr/include/AvailabilityMacros.h \ /usr/include/openssl/e_os2.h /usr/include/openssl/opensslconf.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/include/stdarg.h \ /usr/include/openssl/crypto.h /usr/include/openssl/stack.h \ /usr/include/openssl/safestack.h /usr/include/openssl/opensslv.h \ /usr/include/openssl/ossl_typ.h /usr/include/openssl/symhacks.h \ /usr/include/openssl/err.h /usr/include/openssl/lhash.h \ /usr/include/openssl/rand.h /usr/include/openssl/ssl.h \ /usr/include/openssl/comp.h /usr/include/openssl/x509.h \ /usr/include/openssl/buffer.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/include/stddef.h \ /usr/include/openssl/evp.h /usr/include/openssl/objects.h \ /usr/include/openssl/obj_mac.h /usr/include/openssl/asn1.h \ /usr/include/openssl/bn.h /usr/include/openssl/ec.h \ /usr/include/openssl/ecdsa.h /usr/include/openssl/ecdh.h \ /usr/include/openssl/rsa.h /usr/include/openssl/dsa.h \ /usr/include/openssl/dh.h /usr/include/openssl/sha.h \ /usr/include/openssl/x509_vfy.h /usr/include/openssl/pkcs7.h \ /usr/include/openssl/pem.h /usr/include/openssl/pem2.h \ /usr/include/openssl/hmac.h /usr/include/openssl/kssl.h \ /usr/include/openssl/ssl2.h /usr/include/openssl/ssl3.h \ /usr/include/openssl/pq_compat.h /usr/include/openssl/tls1.h \ /usr/include/openssl/dtls1.h /usr/include/openssl/pqueue.h \ /usr/include/openssl/ssl23.h /usr/include/openssl/x509v3.h \ /usr/include/openssl/conf.h /usr/include/zlib.h /usr/include/zconf.h \ /usr/include/math.h /usr/include/inttypes.h ../../../gsoap/stdsoap2.h: ../../../config.h: /usr/include/stdlib.h: /usr/include/Availability.h: /usr/include/AvailabilityInternal.h: /usr/include/_types.h: /usr/include/sys/_types.h: /usr/include/sys/cdefs.h: /usr/include/sys/_symbol_aliasing.h: /usr/include/sys/_posix_availability.h: /usr/include/machine/_types.h: /usr/include/i386/_types.h: /usr/include/sys/wait.h: /usr/include/sys/_types/_pid_t.h: /usr/include/sys/_types/_id_t.h: /usr/include/sys/signal.h: /usr/include/sys/appleapiopts.h: /usr/include/machine/signal.h: /usr/include/i386/signal.h: /usr/include/machine/_mcontext.h: /usr/include/i386/_mcontext.h: /usr/include/mach/i386/_structs.h: /usr/include/sys/_types/_sigaltstack.h: /usr/include/sys/_types/_ucontext.h: /usr/include/sys/_types/_pthread_attr_t.h: /usr/include/sys/_types/_sigset_t.h: /usr/include/sys/_types/_size_t.h: /usr/include/sys/_types/_uid_t.h: /usr/include/sys/resource.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/include/stdint.h: /usr/include/stdint.h: /usr/include/sys/_types/_int8_t.h: /usr/include/sys/_types/_int16_t.h: /usr/include/sys/_types/_int32_t.h: /usr/include/sys/_types/_int64_t.h: /usr/include/_types/_uint8_t.h: /usr/include/_types/_uint16_t.h: /usr/include/_types/_uint32_t.h: /usr/include/_types/_uint64_t.h: /usr/include/sys/_types/_intptr_t.h: /usr/include/sys/_types/_uintptr_t.h: /usr/include/_types/_intmax_t.h: /usr/include/_types/_uintmax_t.h: /usr/include/sys/_types/_timeval.h: /usr/include/machine/endian.h: /usr/include/i386/endian.h: /usr/include/sys/_endian.h: /usr/include/libkern/_OSByteOrder.h: /usr/include/libkern/i386/_OSByteOrder.h: /usr/include/alloca.h: /usr/include/sys/_types/_ct_rune_t.h: /usr/include/sys/_types/_rune_t.h: /usr/include/sys/_types/_wchar_t.h: /usr/include/sys/_types/_null.h: /usr/include/machine/types.h: /usr/include/i386/types.h: /usr/include/sys/_types/___offsetof.h: /usr/include/sys/_types/_dev_t.h: /usr/include/sys/_types/_mode_t.h: /usr/include/stdio.h: /usr/include/sys/_types/_va_list.h: /usr/include/sys/_types/_off_t.h: /usr/include/sys/_types/_ssize_t.h: /usr/include/secure/_stdio.h: /usr/include/secure/_common.h: /usr/include/string.h: /usr/include/sys/_types/_rsize_t.h: /usr/include/sys/_types/_errno_t.h: /usr/include/strings.h: /usr/include/secure/_string.h: /usr/include/ctype.h: /usr/include/runetype.h: /usr/include/sys/_types/_wint_t.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/include/limits.h: /usr/include/limits.h: /usr/include/machine/limits.h: /usr/include/i386/limits.h: /usr/include/i386/_limits.h: /usr/include/sys/syslimits.h: /usr/include/poll.h: /usr/include/sys/poll.h: /usr/include/errno.h: /usr/include/sys/errno.h: /usr/include/sys/types.h: /usr/include/sys/_types/_blkcnt_t.h: /usr/include/sys/_types/_blksize_t.h: /usr/include/sys/_types/_gid_t.h: /usr/include/sys/_types/_in_addr_t.h: /usr/include/sys/_types/_in_port_t.h: /usr/include/sys/_types/_ino_t.h: /usr/include/sys/_types/_ino64_t.h: /usr/include/sys/_types/_key_t.h: /usr/include/sys/_types/_nlink_t.h: /usr/include/sys/_types/_clock_t.h: /usr/include/sys/_types/_time_t.h: /usr/include/sys/_types/_useconds_t.h: /usr/include/sys/_types/_suseconds_t.h: /usr/include/sys/_types/_fd_def.h: /usr/include/sys/_types/_fd_setsize.h: /usr/include/sys/_types/_fd_set.h: /usr/include/sys/_types/_fd_clr.h: /usr/include/sys/_types/_fd_zero.h: /usr/include/sys/_types/_fd_isset.h: /usr/include/sys/_types/_fd_copy.h: /usr/include/sys/_types/_pthread_cond_t.h: /usr/include/sys/_types/_pthread_condattr_t.h: /usr/include/sys/_types/_pthread_mutex_t.h: /usr/include/sys/_types/_pthread_mutexattr_t.h: /usr/include/sys/_types/_pthread_once_t.h: /usr/include/sys/_types/_pthread_rwlock_t.h: /usr/include/sys/_types/_pthread_rwlockattr_t.h: /usr/include/sys/_types/_pthread_t.h: /usr/include/sys/_types/_pthread_key_t.h: /usr/include/sys/_types/_fsblkcnt_t.h: /usr/include/sys/_types/_fsfilcnt_t.h: /usr/include/sys/timeb.h: /usr/include/time.h: /usr/include/_structs.h: /usr/include/sys/_structs.h: /usr/include/sys/_types/_timespec.h: /usr/include/sys/socket.h: /usr/include/machine/_param.h: /usr/include/i386/_param.h: /usr/include/sys/_types/_sa_family_t.h: /usr/include/sys/_types/_socklen_t.h: /usr/include/sys/_types/_iovec_t.h: /usr/include/sys/time.h: /usr/include/sys/_select.h: /usr/include/netinet/in.h: /usr/include/netinet6/in6.h: /usr/include/netinet/tcp.h: /usr/include/arpa/inet.h: /usr/include/netdb.h: /usr/include/unistd.h: /usr/include/sys/unistd.h: /usr/include/sys/_types/_posix_vdisable.h: /usr/include/sys/_types/_seek_set.h: /usr/include/sys/select.h: /usr/include/sys/_types/_uuid_t.h: /usr/include/gethostuuid.h: /usr/include/fcntl.h: /usr/include/sys/fcntl.h: /usr/include/sys/_types/_o_sync.h: /usr/include/sys/_types/_o_dsync.h: /usr/include/sys/_types/_s_ifmt.h: /usr/include/sys/_types/_filesec_t.h: /usr/include/openssl/bio.h: /usr/include/AvailabilityMacros.h: /usr/include/openssl/e_os2.h: /usr/include/openssl/opensslconf.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/include/stdarg.h: /usr/include/openssl/crypto.h: /usr/include/openssl/stack.h: /usr/include/openssl/safestack.h: /usr/include/openssl/opensslv.h: /usr/include/openssl/ossl_typ.h: /usr/include/openssl/symhacks.h: /usr/include/openssl/err.h: /usr/include/openssl/lhash.h: /usr/include/openssl/rand.h: /usr/include/openssl/ssl.h: /usr/include/openssl/comp.h: /usr/include/openssl/x509.h: /usr/include/openssl/buffer.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/include/stddef.h: /usr/include/openssl/evp.h: /usr/include/openssl/objects.h: /usr/include/openssl/obj_mac.h: /usr/include/openssl/asn1.h: /usr/include/openssl/bn.h: /usr/include/openssl/ec.h: /usr/include/openssl/ecdsa.h: /usr/include/openssl/ecdh.h: /usr/include/openssl/rsa.h: /usr/include/openssl/dsa.h: /usr/include/openssl/dh.h: /usr/include/openssl/sha.h: /usr/include/openssl/x509_vfy.h: /usr/include/openssl/pkcs7.h: /usr/include/openssl/pem.h: /usr/include/openssl/pem2.h: /usr/include/openssl/hmac.h: /usr/include/openssl/kssl.h: /usr/include/openssl/ssl2.h: /usr/include/openssl/ssl3.h: /usr/include/openssl/pq_compat.h: /usr/include/openssl/tls1.h: /usr/include/openssl/dtls1.h: /usr/include/openssl/pqueue.h: /usr/include/openssl/ssl23.h: /usr/include/openssl/x509v3.h: /usr/include/openssl/conf.h: /usr/include/zlib.h: /usr/include/zconf.h: /usr/include/math.h: /usr/include/inttypes.h: gsoap-2.8.91/gsoap/ios_plugin/0000755000175000017500000000000013525245161015551 5ustar ellertellertgsoap-2.8.91/gsoap/ios_plugin/README.md0000644000175000017500000014641213525245161017040 0ustar ellertellert@mainpage The iOS Plugin @section title The iOS Plugin [TOC] By Bethany Sanders, Robert van Engelen, Ning Xie, and Wei Zhang @section ios_overview Overview Consuming Web services on iOS (iPhone and iPad) platforms is increasingly in demand today. Xcode does not offer built-in tools that make consuming XML Web services easy. This means that detailed knowledge of XML processing is required to send SOAP/XML and XML REST requests to the Web services and parse the XML response. By contrast, the gSOAP toolkit offers an automated XML data binding toolkit for C and C++ to develop SOAP/XML Web services and clients. You can also use the iOS plugin to consume XML-RPC and JSON Web services with the [XML-RPC & JSON/JSON-Path](https://www.genivia.com/doc/xml-rpc-json/html/index.html) plugin for gSOAP. The plugin makes it easy to consume Web services on iOS platforms, such as iPhone and iPad. Moreover, the plugin takes advantage of iOS network connectivity by supporting 3G/4G/LTE and wifi. To use the iOS plugin for development of client applications on iOS platforms, register the plugin with the gSOAP engine context as follows: @code #import "gsoapios.h" struct soap *soap = soap_new(); // new engine context soap_register_plugin(soap, soap_ios); // register the iOS plugin ... soap_destroy(soap); // clean up deserialized data soap_end(soap); // clean up temporaries soap_free(soap); // free the context @endcode When coding in C++, it is recommended to generate C++ proxy classes with soapcpp2 option -j which are then used to instantiate proxy objects that manage the gSOAP engine context to register with the plugin as follows: @code #import "gsoapios.h" Proxy proxy; soap_register_plugin(proxy.soap, soap_ios); ... proxy.destroy(); @endcode There are no other plugin API calls necessary to make a Web service client application work with iOS. This means that you can develop iOS apps that consume complex SOAP/XML, XML REST, and JSON Web services. @section ios_start Getting Started To start building Web services client applications for iPhone and/or iPad with gSOAP, you will need: - The [gSOAP toolkit](http://www.genivia.com/Products/downloads.html) version 2.8.50 or greater; - Xcode with the iOS SDK installed. Developing Web services client applications on iOS is no different than developing these applications on another OS with gSOAP when you use this iOS Plugin. The steps to create a client application on iOS: - Use wsdl2h and soapcpp2 to generate C++ code with client stubs or client proxy classes (soapcpp2 option -j) from WSDL and XSD files; - Create an iOS application project in Xcode; - Add stdsoap2.cpp and stdsoap2.h from the gSOAP package to your iOS project; - Add gsoapios.h and gsoapios.mm that are part of the iOS plugin files to your iOS project; - In your client code create an engine context and register the iOS plugin; - In your client code add the Web service methods invocations that you want, see the wsdl2h-generated header file (first step above) with interface declarations for instructions on how to invoke services. All of the source code files should be of type Objective C++ source. Mixing C files with C++ files will cause errors. Rename .c files to .cpp files as necessary. @section ios_cache_policy Specifying the Cache Policy The interaction between the client and the Web serviceserver can be controlled by specifying the cache policy. To specify the cache policy, use the API function `soap_ios_setcachepolicy(struct soap *soap, unsigned int policy)`. This API function cannot be called before the plugin is registered. @code #import "gsoapios.h" struct soap *soap = soap_new(); soap_register_plugin(soap, soap_ios); // Specify the cache policy for the request soap_ios_setchacepolicy(soap, NSURLRequestReturnCacheDataElseLoad); ... soap_destroy(soap); // clean up deserialized data soap_end(soap); // clean up temporaries soap_free(soap); // free the context @endcode The available cache policies that can be specified are: @code enum { NSURLRequestUseProtocolCachePolicy = 0, NSURLRequestReloadIgnoringLocalCacheData = 1, NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, NSURLRequestReturnCacheDataElseLoad = 2, NSURLRequestReturnCacheDataDontLoad = 3, NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4, NSURLRequestReloadRevalidatingCacheData = 5 } @endcode The default cache policy is `NSURLRequestUseProtocolCachePolicy`. @section ios_timeout_interval Specifying a Timeout Interval The timeout of a network connection can be specified using the API function `soap_ios_settimeoutinterval(struct soap *soap, double seconds)`: @code #import "gsoapios.h" struct soap *soap = soap_new(); soap_register_plugin(soap, soap_ios); // Specify the timout interval as 30 seconds soap_ios_settimeoutinterval(soap, 30.0); ... soap_destroy(soap); // clean up deserialized data soap_end(soap); // clean up temporaries soap_free(soap); // free the context @endcode The default timeout is 60 seconds. @section ios_http_auth HTTP Authentication To support authentication when access is denied (HTTP 401 error) when the client tries to connect, enable HTTP authentication as follows. Basic authentication is simply enabled at the client-side by setting the `soap.userid` and `soap.passwd` strings to a username and password, respectively: @code struct soap *soap = soap_new(); soap->userid = "someone"; soap->passwd = "somepass"; @endcode When using a generated C++ proxy class: @code Proxy proxy; porxy.soap->userid = "someone"; porxy.soap->passwd = "somepass"; @endcode Make sure to **never use Basic authentication without HTTPS**. HTTPS must be used to ensure that Basic authentication is secure. @section ios_example Examples This section introduces four examples to demonstrate the development of client applications consuming Web services on iOS platforms, such as iPhone and iPad, by using the gSOAP tools and the iOS plugin. The first example @ref ios_example_calc is a basic calculator client app. The second example @ref ios_example_geoip is a web service that locates the country of a certain IP Adress. The third example @ref ios_example_weather returns weather results for well-known US cities, and the fourth example @ref ios_example_air shows information on every airport within a given country. We assume you already have had some experience developing applications for iPhone and iPad using Xcode with iOS SDK installed. Experience is not required to read on, but helpful in case you get lost in the details of the Xcode iOS SDK. General recommendations: - Rename .m files to .mm files; - Generate a C++ proxy class using soapcpp2 -j, which produces the source code you will need to access the Web service; - Add stdsoap2.cpp and stdsoap2.h from the gSOAP source code tree to your iOS project; - Add gsoapios.h and gsoapios.mm that are part of the iOS plugin files to your iOS project; - In your client code register the iOS plugin. @subsection ios_example_calc Simple Calculator Example (C++) This example shows you how to develop a client application in C++ using gSOAP and the ios plugin, which consumes a simple calculator service on iOS using gSOAP. The simple calculator service was developed and deployed as a demo to [get started with gSOAP](http://www.genivia.com/dev.html). The gSOAP Calculator Service provides several operations such as add, sub, mul, div etc. In this example, we use the operation add as a demo. Other operations are applied in a similar way. The wsdl file for this service can be obtained at the following link: http://www.genivia.com/calc.wsdl The Xcode project for this example can be found in gsoap/ios_plugin/examples/calc. @subsubsection ios_calc_step_1 Step 1: Generating stubs for C++ API The gsoap/ios_plugin/examples/calc directory already contains calc.h so you can skip this step. To generate codes for the calculator Web service, we first run the wsdl2h tool from the command line on the URL of the WSDL and use option -o to specify the output file (Alternatively, you can download the calc.wsdl and use the local file instead of the URL): wsdl2h -o calc.h http://www.genivia.com/calc.wsdl This generates the calc.h service definition header file with service operation definitions and types for the operation's data. By default, gSOAP assumes you will use C++ with STL. We have not yet generated the stubs for the API. To do so, run the soapcpp2 compiler: soapcpp2 -CL -I$GSOAP_HOME/import calc.h Option -CL indicates client-side only files (soapcpp2 generates both client and server stubs and skeletons by default). This generates a number of source files for client application development. We do not have to generate a proxy class in this example because it does not use a Proxy class. @subsubsection ios_calc_step_2 Step 2: Creating Xcode project for iPhone Launch Xcode, create a Single View-based Application project and name it Calc. Open the ViewController.xib (main storyboard) file in the Interface Builder. Double-click on the View item and populate it with the views listed below and shown in Figure 1: - Two Labels ("+" and "A Simple Calculator") - Two Text Fields (operand1 and operand2) - One Button ("Add" button) @image html calc-view.png "Figure 1. View of the Calculator Web Service Client App" In Xcode, edit the file ViewController.h to make it look like the following: @code // File: ViewController.h #import @interface ViewController : UIViewController { UITextField *op1; // operand1 UITextField *op2; // operand2 } @property (nonatomic, retain) IBOutlet UITextField *op1; // this code is generated when you link the text fields @property (nonatomic, retain) IBOutlet UITextField *op2; // this code is generated when you link the text fields - (IBAction) buttonPressed; @end @endcode Link the op1 and op2 to the two Text Fields and delegate the button action to method buttonPressed. In Xcode, edit the file info.plist to make it look like the following: NSAppTransportSecurity NSAllowsArbitraryLoads CFBundleDevelopmentRegion en CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1 LSRequiresIPhoneOS UILaunchStoryboardName LaunchScreen UIMainStoryboardFile Main UIRequiredDeviceCapabilities armv7 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight These changes ensure that you can access the web services despite the added layer of protection (App Transport Security). @subsubsection ios_calc_step_3 Step 3: Adding generated source stubs to the Xcode project Add the source files soapC.cpp, soapClient.cpp, soapH.h, and soapStub.h generated in Step 1 of this tutorial to the project. Also add files stdsoap2.h and stdsoap2.cpp to the project from gSOAP package as well as the iOS plugin files gsoapios.h and gsoapios.mm. Once all of your files have been added to the project, ensure they are all of type "Objective C++ Source". This ensures that there will be no issues with mixing Objective C and C++ code. @subsubsection ios_calc_step_4 Step 4: Implementing the Logic by calling the soap service Firstly, edit file main.mm to import the file calc.nsmap. Link errors may arise without importing this XML namespace mapping table. @code // File: main.mm #import #import "../../calc.nsmap" int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } @endcode Then, implement the source file ViewController.mm as the following: @code #import "ViewController.h" #import "soapStub.h" #import "gsoapios.h" @implementation ViewController @synthesize op1; // Set or get operand1 @synthesize op2; // Set or get operand2 - (IBAction) buttonPressed { double x = [op1.text doubleValue]; double y = [op2.text doubleValue]; struct soap *soap = soap_new1(SOAP_IO_DEFAULT|SOAP_IO_KEEPALIVE|SOAP_XML_INDENT|SOAP_XML_STRICT); if (soap_register_plugin(soap, soap_ios) == SOAP_OK) { // Specify the timeout interval (optional) to 45 seconds instead of // the default 60 seconds soap_ios_settimeoutinterval(soap, 45.0); double result; // Call Web service operation add int status = soap_call_ns2__add(soap, NULL, NULL,x, y, result); soap_free_temp(soap); // Cleanup temporary resources // Check soap response status if (status == SOAP_OK) { NSString *resultString; NSString *titleString; resultString = [NSString stringWithFormat:@"%f",result]; titleString = [NSString stringWithFormat:@"%f + %f =",x, y]; // Show the result in an alert UIAlertController * alert = [UIAlertController alertControllerWithTitle:titleString message:resultString preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction* cancelButton = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action){}]; [alert addAction: cancelButton]; [self presentViewController:alert animated:YES completion:nil]; } else soap_print_fault(soap,stderr); // Print soap error in console } soap_destroy(soap); soap_end(soap); soap_free(soap); } @end @endcode A screen snapshot of the client is shown in Figure 2. @image html calc-result.png "Figure 2: Snapshot of the CalcViewService result" @subsection ios_example_geoip GeoIPService Example (C++) [GeoIPService](http://www.webservicex.net/geoipservice.asmx?op=GetGeoIP) is a live SOAP Web service that enables you to look up countries by IP address or by Context. This example shows you how to develop a client application in C++ using gSOAP and the ios plugin, which consumes the GeoIPService on iOS using gSOAP. The WSDL file for this service can be downloaded at the following link: http://www.webservicex.net/geoipservice.asmx?WSDL It is crucial to follow these directions in order for your app to work: - Rename the .m files to .mm files. The iOS plugin implementation file gsoapios.m must be renamed to gsoapios.mm. The main.m must be renamed to main.mm. Other files such as your ViewController must also be renamed with .mm. - Generate C++ proxy using proper options with wsdl2h and soapcpp2. - Use stdsoap2.cpp from the gSOAP package in your iOS project. The Xcode project for this example can be found in gsoap/ios_plugin/examples/GeoIPService. @subsubsection ios_geoip_step_1 Step 1: Generating stubs for C++ Proxy To generate codes for the GeoIPService Web service, we first run the wsdl2h tool from the command line on the URL of the WSDL and use option -o to specify the output file (alternatively, you can download the GeoIPService.wsdl file and use the local file instead of the URL): wsdl2h -o GeoIPService.h -Ngeoip 'http://www.webservicex.net/geoipservice.asmx?WSDL' This generates the GeoIPService.h service interface header file with service operation definitions and types for the operation's data. By default, gSOAP assumes you will use C++ with STL. To generate the stubs for the C++ proxy classes, run the soapcpp2: soapcpp2 -j -CL -I$GSOAP_HOME/import GeoIPService.h Option -j tells the compiler to generate the C++ proxy class and option -CL indicates client-side only files (soapcpp2 generates both client and server stubs and skeletons by default). Option -I is needed to import the stlvector.h file from the import directory in the gSOAP package to support serialization of STL vectors. @subsubsection ios_geoip_step_2 Step 2: Creating an Xcode project for iPhone Create a Single View-based Application project and name it GeoIPService.Open the ViewController.xib (main storyboard) file in the Interface Builder. Double-click on the View item and populate it with the views listed below and shown in Figure 3: - A Label ("Enter IP Address") - A Text Field - One Round Rect Button ("Find Country" button) @image html geoip-view.png "Figure 3. View of the GeoIPService Client" In Xcode, edit the file ViewController.h to make it look like the following: @code // File: ViewController.h #import @interface ViewController : UIViewController { UITextField* IPAddress; } @property (strong, nonatomic) IBOutlet UITextField *IPAddress; // this code generated when you link the text //field to IPAddress - (IBAction) buttonPressed; @end @endcode Set the ipAddress outlet and the buttonFindCountry:(id)sender method to delegate action of the button. In Xcode, edit the file info.plist to make it look like the following: NSAppTransportSecurity NSAllowsArbitraryLoads CFBundleDevelopmentRegion en CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1 LSRequiresIPhoneOS UILaunchStoryboardName LaunchScreen UIMainStoryboardFile Main UIRequiredDeviceCapabilities armv7 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight These changes ensure that you can access the web services despite the added layer of protection of App Transport Security). @subsubsection ios_geoip_step_3 Step 3: Adding generated source stubs to the Xcode project Add the source files soapC.cpp, soapGeoIPServiceSoapProxy.cpp, soapGeoIPServiceSoapProxy.h, soapH.h, and soapStub.h generated in Step 1 of this tutorial to the project. Also add files stdsoap2.h and stdsoap2.cpp to the project from the gSOAP package and the iOS plugin files gsoapios.h and gsoapios.mm. Once all of your files have been added to the project, ensure they are all of type "Objective C++ Source". This ensures that there will be no issues with mixing Objective C and C++ code. @subsubsection ios_geoip_step_4 Step 4: Implementing the Logic by calling the soap service Firstly, edit file main.mm to import the file GeoIPService.nsmap. Linking errors would arise without importing this XML namespace mapping table. @code // File: main.mm #import #import "AppDelegate.h" #include "../../GeoIPServiceSoap.nsmap" int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } @endcode Then, implement the source file ViewController.mm as the following: @code #import "ViewController.h" #include "soapGeoIPServiceSoapProxy.h" #import "soapStub.h" #import "gsoapios.h" using namespace std; typedef struct _ns1__GetGeoIP RequestStruct; typedef struct _ns1__GetGeoIPResponse ResponseStruct; @implementation ViewController @synthesize IPAddress; - (IBAction)buttonPressed:(id)sender { RequestStruct ip; ResponseStruct response; //creates proxy GeoIPServiceSoapProxy service(SOAP_IO_DEFAULT|SOAP_IO_KEEPALIVE|SOAP_XML_INDENT|SOAP_XML_STRICT); soap_init(service.soap); //sets IPAddress from input std::string ipAdd = std::string((char *)[IPAddress.text UTF8String]); ip.IPAddress = &ipAdd; // ----- register plugin for callbacks ------ soap_register_plugin(service.soap, soap_ios); // Optional: timeout internal, the default is 60.0 seconds soap_ios_settimeoutinterval(service.soap, 30.0); //call web service int status = service.GetGeoIP(&ip, response); string* result; string err_msg = "Invalid IP address"; if (status == SOAP_OK) { NSString *soapResult; NSString *titleMsg; if (response.GetGeoIPResult && response.GetGeoIPResult->CountryName) result = response.GetGeoIPResult->CountryName; else result = &err_msg; soapResult = [NSString stringWithUTF8String:result->c_str()]; titleMsg = [NSString stringWithFormat: @"%@", @"Country Found"]; //show result as an alert UIAlertController * alert = [UIAlertController alertControllerWithTitle:titleMsg message:soapResult preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction* cancelButton = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action){}]; [alert addAction: cancelButton]; [self presentViewController:alert animated:YES completion:nil]; } else service.soap_stream_fault(std::cerr); service.destroy(); } // Override to allow orientations other than the default portrait orientation. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown || interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight); } - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } - (void)viewDidUnload { // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; } - (void)dealloc { // [ipAddress release]; // [super dealloc]; } @end @endcode An image of the app is shown in Figure 4. @image html geoip-result.png "Figure 4: Snapshot of the GeoIPServiceViewService result" @subsection ios_example_weather Weather Example (C++) GlobalWeather is a live SOAP Web service that enables you to look up the Weather in popular cities around the world. For simplicity, this example is limited to cities in the United States. For some reason, some very popular cities are not supported by this web service. For example, no results for New York City will be returned. There is an error message within the app that shows whenever one of these cities is entered. Know that the error message is not an issue with the app you just built, but something that the web service itself does not provide. This example shows how to develop a client application in C++ using gSOAP and the ios plugin, which consumes the Weather service on iOS using gSOAP. The WSDL file for this service can be downloaded at the following link: http://www.webservicex.net/globalweather.asmx?WSDL It is crucial to follow these directions in order for your app to work: - Rename the .m files to .mm files. The iOS plugin implementation file gsoapios.m must be renamed to gsoapios.mm. The main.m must be renamed to main.mm. Other files such as your ViewController must also be renamed with .mm. - Generate C++ proxy using proper options with wsdl2h and soapcpp2. - Use stdsoap2.cpp from the gSOAP package in your iOS project. The Xcode project for this example can be found in gsoap/ios_plugin/examples/Weather. @subsubsection ios_weather_step_1 Step 1: Generating stubs for C++ Proxy To generate codes for the GeoIPService Web service, we first run the wsdl2h tool from the command line on the URL of the WSDL and use option -o to specify the output file (Alternatively, you can download the GlobalWeather.wsdl file and use the local file instead of the URL): wsdl2h -o weather.h 'http://www.webservicex.net/globalweather.asmx?WSDL' This generates the weather.h service definition header file with service operation definitions and types for the operation's data. By default, gSOAP assumes you will use C++ with STL. To generate the stubs for the C++ proxy classes, run the soapcpp2 tool: soapcpp2 -j -CL -I$GSOAP_HOME/import weather.h Option -j tells soapcpp2 to generate the C++ proxy class and option -CL indicates client-side only files (soapcpp2 generates both client and server stubs and skeletons by default). Option -I is needed to import the stlvector.h file from the import directory in the gSOAP package to support serialization of STL vectors. @subsubsection ios_weather_step_2 Step 2: Creating an Xcode project for iPhone Create a Single View-based Application project and name it Weather. Open the ViewController.xib(main storyboard) file in the Interface Builder.Double-click on the View item and populate it with the views listed below and shown in Figure 3: - A Label ("Enter US City") - A Text Field - One Round Rect Button ("Get Weather Results" button) In Xcode, edit the file ViewController.h to make it look like the following: @code #import @interface ViewController : UIViewController { UITextField* inputcity; } @property (strong, nonatomic) IBOutlet UITextField *inputcity; - (IBAction) buttonPressed; @end @endcode Set the inputcity outlet and the buttonFindCountry:(id)sender method to delegate action of the button. In Xcode, edit the file info.plist to make it look like the following: NSAppTransportSecurity NSAllowsArbitraryLoads CFBundleDevelopmentRegion en CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1 LSRequiresIPhoneOS UILaunchStoryboardName LaunchScreen UIMainStoryboardFile Main UIRequiredDeviceCapabilities armv7 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight These changes ensure that you can access the web services despite the added layer of protection of App Transport Security). @subsubsection ios_weather_step_3 Step 3: Adding generated source stubs to the Xcode project Add the source files soapC.cpp, soapGloabalWeatherSoapProxy.cpp, soapGloabalWeatherSoapProxy.h, soapH.h, and soapStub.h generated in Step 1 of this tutorial to the project. Also add files stdsoap2.h and stdsoap2.cpp to the project from gsoap package and the iOS plugin files gsoapios.h and gsoapios.mm. Once all of your files have been added to the project, ensure they are all of type "Objective C++ Source". This ensures that there will be no issues with mixing Objective C and C++ code. @subsubsection ios_weather_step_4 Step 4: Implementing the Logic by calling the soap service Firstly, edit file main.mm to import the file GlobalWeatherSoap.nsmap. Linking errors would arise without importing this XML namespace mapping table. @code // File: main.mm #import #import "AppDelegate.h" #include "../../GlobalWeatherSoap.nsmap" int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } @endcode Then, implement the source file ViewController.mm as the following, where we used the [gSOAP domcpp](http://www.genivia.com/doc/dom/html) tool with option -i on an example weather XML data file to produce DOM code to extract the XML data (see further below): @code #import "ViewController.h" #include "soapGlobalWeatherSoapProxy.h" #import "soapStub.h" #import "gsoapios.h" #include typedef struct _ns__GetWeather RequestStruct; typedef struct _ns__GetWeatherResponse ResponseStruct; @implementation ViewController @synthesize inputcity; - (IBAction)buttonPressed:(id)sender { RequestStruct sending; ResponseStruct receiving; std::string result = ""; GlobalWeatherSoapProxy service; soap_init(service.soap); // ----- register plugin for callbacks ------ soap_register_plugin(service.soap, soap_ios); std::string cname= std::string((char *)[inputcity.text UTF8String]); sending.CityName = &cname; std::string USA = "United States"; sending.CountryName = &USA; if (service.GetWeather(&sending, receiving) == SOAP_OK) { std::ofstream xmlwrite("/Users/bethanysanders/Documents/work/Weather/Weather/message.txt"); std::ifstream xmlread("/Users/bethanysanders/Documents/work/Weather/Weather/message.txt"); if(xmlwrite.is_open()) { xmlwrite << *(receiving.GetWeatherResult); xmlwrite.close(); struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); ctx->double_format = "%lG"; xsd__anyType dom(ctx); if (xmlread.is_open()) xmlread >> dom; if (dom.soap->error) result = "Error: Try a different city"; xsd__anyAttribute *att; xsd__anyType *elt; if ((elt = dom.elt_get("Wind"))) { xsd__anyType& dom_Wind = *elt; if (dom_Wind.get_text()) { result += "Wind = "; result += dom_Wind.get_text(); } } if ((elt = dom.elt_get("Visibility"))) { xsd__anyType& dom_Visibility = *elt; if(dom_Visibility.get_text()) { result += "\nVisibility = "; result += dom_Visibility.get_text(); } } if ((elt = dom.elt_get("SkyConditions"))) { xsd__anyType& dom_SkyConditions = *elt; if (dom_SkyConditions.get_text()) { result += "\nSky Conditions = "; result += dom_SkyConditions.get_text(); } } if ((elt = dom.elt_get("Temperature"))) { xsd__anyType& dom_Temperature = *elt; if (dom_Temperature.get_text()) { result += "\nTemperature = "; result += dom_Temperature.get_text(); } } if ((elt = dom.elt_get("DewPoint"))) { xsd__anyType& dom_DewPoint = *elt; if (dom_DewPoint.get_text()) { result += "\nDew Point = "; result += dom_DewPoint.get_text(); } } if ((elt = dom.elt_get("RelativeHumidity"))) { xsd__anyType& dom_RelativeHumidity = *elt; if (dom_RelativeHumidity.get_text()) { result += "\nRelative Humidity = "; result += dom_RelativeHumidity.get_text(); } } if ((elt = dom.elt_get("Pressure"))) { xsd__anyType& dom_Pressure = *elt; if (dom_Pressure.get_text()) { result += "\nPressure = "; result += dom_Pressure.get_text(); } } xmlread.close(); soap_destroy(ctx); // delete objects soap_end(ctx); // delete DOM data soap_free(ctx); // free context } } NSString *titleMsg; NSString *Weather; titleMsg = [NSString stringWithFormat: @"%@", @"Weather Results"]; Weather = [NSString stringWithUTF8String:result.c_str()]; //show result as an alert UIAlertController * alert = [UIAlertController alertControllerWithTitle:titleMsg message:Weather preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction* cancelButton = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action){}]; [alert addAction: cancelButton]; [self presentViewController:alert animated:YES completion:nil]; service.destroy(); } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end @endcode You will notice there is much more code in this example's ViewController.mm. This is because this web service stores the whole XML response within a string instead of appropriate variables. The dom parser can fix this situation so that you can still access your results without having to parse the XML yourself. The dom code in this example was generated via command line in UNIX. To do so, once you have dom executable in your working directory, just execute the command ./domcpp -i weather.xml where weather.xml is a file that stores an example xml response. Option -i tells the domcpp tool to generate the code you need to parse your result. To obtain an example XML response, test the web service on http://www.webservicex.net/New/Home/ServiceDetail/56. The domcpp tool is found in gsoap/samples/dom and should be built in that directory with: make domcpp Then move or copy the domcpp executable to use it for your projects. For more information about domcpp, read [XML DOM and XPath](https://www.genivia.com/doc/dom/html/index.html) of the gSOAP documentation. @subsection ios_example_air Air Example (C++) Airport Information Web Service is a live SOAP Web service that enables you to look up Airport Information of countries around the world. For some reason, some very well known countries are not supported by this web service. For example, no results for Russia will be returned. There is an error message within the app that shows whenever one of these countries is entered. Know that the error message is not an issue with the app you just built, but information that the web service itself does not provide. This example shows how to develop a client application in C++ using gSOAP and the ios plugin, which consumes the Weather service on iOS using gSOAP. The WSDL file for this service can be downloaded at the following link: http://www.webservicex.net/airport.asmx?WSDL It is crucial to follow these directions in order for your app to work: - Rename the .m files to .mm files. The iOS plugin implementation file gsoapios.m must be renamed to gsoapios.mm. The main.m must be renamed to main.mm. Other files such as your ViewController must also be renamed with .mm. - Generate C++ proxy using proper options with wsdl2h and soapcpp2. - Use the stdsoap2.cpp instead of stdsoap2.c from the gSOAP package in your iOS project. The Xcode project for this example can be found in gsoap/ios_plugin/examples/Air. @subsubsection ios_air_step_1 Step 1: Generating stubs for C++ Proxy To generate codes for the GeoIPService Web service, we first run the wsdl2h tool from the command line on the URL of the WSDL and use option -o to specify the output file (Alternatively, you can download the airport.wsdl file and use the local file instead of the URL): wsdl2h -o airport.h 'http://www.webservicex.net/airport.asmx?WSDL' This generates the airport.h service definition header file with service operation definitions and types for the operation's data. By default, gSOAP assumes you will use C++ with STL. To generate the stubs for the C++ proxy classes, run the soapcpp2. compiler: soapcpp2 -j -CL -I$GSOAP_HOME/import airport.h Option -j tells the compiler to generate the C++ proxy class and option -CL indicates client-side only files (soapcpp2 generates both client and server stubs and skeletons by default). Option -I is needed to import the stlvector.h file from the import directory in the gSOAP package to support serialization of STL vectors. @subsubsection ios_air_step_2 Step 2: Creating an Xcode project for iPhone Create a Single View-based Application project and name it Air. Open the ViewController.xib(main storyboard) file in the Interface Builder.Double-click on the View item and populate it with the views listed below and shown in Figure 3: - A Label ("Enter Country") - A Text Field - One Round Rect Button ("Get Airport Information" button) - One Text View (to show the results) In Xcode, edit the file ViewController.h to make it look like the following: @code #import @interface ViewController : UIViewController { UITextField* country_name; UITextView* showResults; } @property (strong, nonatomic) IBOutlet UITextField *country_name; @property (strong, nonatomic) IBOutlet UITextView *showResults; -(IBAction) buttonPressed; @end @endcode Set the `country_name` and `showResults` outlets and the `buttonFindCountry:(id)sender` method to delegate action of the button. In Xcode, edit the file info.plist to make it look like the following: NSAppTransportSecurity NSAllowsArbitraryLoads CFBundleDevelopmentRegion en CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1 LSRequiresIPhoneOS UILaunchStoryboardName LaunchScreen UIMainStoryboardFile Main UIRequiredDeviceCapabilities armv7 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight These changes ensure that you can access the web services despite the added layer of protection of App Transport Security). @subsubsection ios_air_step_3 Step 3: Adding generated source stubs to the Xcode project Add the source files soapC.cpp, soapairportSoapProxy.cpp, soapairportSoapProxy.h, soapH.h, and soapStub.h generated in Step 1 of this tutorial to the project. Also add files stdsoap2.h and stdsoap2.cpp to the project from the gSOAP package and the iOS plugin files gsoapios.h and gsoapios.mm. Once all of your files have been added to the project, ensure they are all of type "Objective C++ Source". This ensures that there will be no issues with mixing Objective C and C++ code. @subsubsection ios_air_step_4 Step 4: Implementing the Logic by calling the soap service Firstly, edit file main.mm to import the file airportSoap.nsmap. Linking errors would arise without importing this XML namespace mapping table. @code // File: main.mm #import #import "AppDelegate.h" #include "../../airportSoap.nsmap" int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } @endcode Then, we implement the source file ViewController.mm as the following, where we used the [gSOAP domcpp](http://www.genivia.com/doc/dom/html) tool with option -i on an example weather XML data file to produce DOM code to extract the XML data (see further below) @code #import "ViewController.h" #include "soapairportSoapProxy.h" #import "soapStub.h" #import "gsoapios.h" #include @interface ViewController () @end @implementation ViewController @synthesize country_name; @synthesize showResults; - (IBAction)buttonPressed:(id)sender { _ns1__GetAirportInformationByCountry sending; _ns1__GetAirportInformationByCountryResponse receiving; std::string result = ""; //stores resulting data bool webserviceresult = true; //keeps track of if the web service returns a readable result airportSoapProxy service; soap_init(service.soap); // ----- register plugin for callbacks ------ soap_register_plugin(service.soap, soap_ios); std::string countryname = std::string((char*)[country_name.text UTF8String]); sending.country = &countryname; std::ofstream out("/Users/bethanysanders/Documents/work/Air/Air/xmlmessage.txt"); std::ifstream in("/Users/bethanysanders/Documents/work/Air/Air/xmlmessage.txt"); if (service.GetAirportInformationByCountry(&sending,receiving) == SOAP_OK) if (out.is_open()) out << *(receiving.GetAirportInformationByCountryResult); out.close(); struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); ctx->double_format = "%lG"; xsd__anyType dom(ctx); if (in.is_open()) in >> dom; if (dom.soap->error) webserviceresult = false; xsd__anyType *elt; for (xsd__anyType *it = dom.elt_get("Table"); it; it = it->get_next()) { xsd__anyType& dom_Table = *it; if ((elt = dom_Table.elt_get("AirportCode"))) { xsd__anyType& dom_Table_AirportCode = *elt; if (dom_Table_AirportCode.get_text()) { result += "\n\nAirport Code = "; result += dom_Table_AirportCode.get_text(); } } if ((elt = dom_Table.elt_get("CityOrAirportName"))) { xsd__anyType& dom_Table_CityOrAirportName = *elt; if (dom_Table_CityOrAirportName.get_text()) { result += "\nCity or Airport Name = "; result += dom_Table_CityOrAirportName.get_text(); } } if ((elt = dom_Table.elt_get("Country"))) { xsd__anyType& dom_Table_Country = *elt; if (dom_Table_Country.get_text()) { result += "\nCountry = "; result += dom_Table_Country.get_text(); } } if ((elt = dom_Table.elt_get("CountryAbbrviation"))) { xsd__anyType& dom_Table_CountryAbbrviation = *elt; if (dom_Table_CountryAbbrviation.get_text()) { result += "\nCountry Abbreviation = "; result += dom_Table_CountryAbbrviation.get_text(); } } if ((elt = dom_Table.elt_get("CountryCode"))) { xsd__anyType& dom_Table_CountryCode = *elt; if (dom_Table_CountryCode.get_text()) { result += "\nCountry Code = "; result += dom_Table_CountryCode.get_text(); } } if ((elt = dom_Table.elt_get("GMTOffset"))) { xsd__anyType& dom_Table_GMTOffset = *elt; if (dom_Table_GMTOffset.get_text()) { result += "\nGMT Offset = "; result += dom_Table_GMTOffset.get_text(); } } if ((elt = dom_Table.elt_get("RunwayLengthFeet"))) { xsd__anyType& dom_Table_RunwayLengthFeet = *elt; if (dom_Table_RunwayLengthFeet.get_text()) { result += "\nRunway Length (feet) = "; result += dom_Table_RunwayLengthFeet.get_text(); } } if ((elt = dom_Table.elt_get("RunwayElevationFeet"))) { xsd__anyType& dom_Table_RunwayElevationFeet = *elt; if (dom_Table_RunwayElevationFeet.get_text()) { result += "\nRunway Elevation (feet) = "; result += dom_Table_RunwayElevationFeet.get_text(); } } if ((elt = dom_Table.elt_get("LatitudeDegree"))) { xsd__anyType& dom_Table_LatitudeDegree = *elt; if (dom_Table_LatitudeDegree.get_text()) { result += "\nLatitude Degree = "; result += dom_Table_LatitudeDegree.get_text(); } } if ((elt = dom_Table.elt_get("LatitudeMinute"))) { xsd__anyType& dom_Table_LatitudeMinute = *elt; if (dom_Table_LatitudeMinute.get_text()) { result += "\nLatitude Minute = "; result += dom_Table_LatitudeMinute.get_text(); } } if ((elt = dom_Table.elt_get("LatitudeSecond"))) { xsd__anyType& dom_Table_LatitudeSecond = *elt; if (dom_Table_LatitudeSecond.get_text()) { result += "\nLatitude Second = "; result += dom_Table_LatitudeSecond.get_text(); } } if ((elt = dom_Table.elt_get("LatitudeNpeerS"))) { xsd__anyType& dom_Table_LatitudeNpeerS = *elt; if (dom_Table_LatitudeNpeerS.get_text()) { result += "\nLatitude N or S = "; result += dom_Table_LatitudeNpeerS.get_text(); } } if ((elt = dom_Table.elt_get("LongitudeDegree"))) { xsd__anyType& dom_Table_LongitudeDegree = *elt; if (dom_Table_LongitudeDegree.get_text()) { result += "\nLongitude Degree = "; result += dom_Table_LongitudeDegree.get_text(); } } if ((elt = dom_Table.elt_get("LongitudeMinute"))) { xsd__anyType& dom_Table_LongitudeMinute = *elt; if (dom_Table_LongitudeMinute.get_text()) { result += "\nLongitude Minute = "; result += dom_Table_LongitudeMinute.get_text(); } } if ((elt = dom_Table.elt_get("LongitudeSeconds"))) { xsd__anyType& dom_Table_LongitudeSeconds = *elt; if (dom_Table_LongitudeSeconds.get_text()) { result += "\nLongitude Second = "; result += dom_Table_LongitudeSeconds.get_text(); } } if ((elt = dom_Table.elt_get("LongitudeEperW"))) { xsd__anyType& dom_Table_LongitudeEperW = *elt; if (dom_Table_LongitudeEperW.get_text()) { result += "\nLongitude E or W = "; result += dom_Table_LongitudeEperW.get_text(); } } } NSString *airPorts = [NSString stringWithUTF8String:result.c_str()]; if (result == "" || !webserviceresult) airPorts = [NSString stringWithFormat: @"%@", @"Error: no know information. Try a different country."]; showResults.editable = NO; showResults.showsVerticalScrollIndicator = YES; showResults.text = airPorts; soap_destroy(ctx); // delete objects soap_end(ctx); // delete DOM data soap_free(ctx); // free context service.destroy(); } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end @endcode You will notice there is much more code in this example's ViewController.mm. This is because this web service stores the whole XML response within a string instead of appropriate variables. The dom parser can fix this situation so that you can still access your results without having to parse the XML yourself. The dom code in this example was generated via command line in UNIX. To do so, once you have dom executable in your working directory, just execute the command ./domcpp -i airPorts.xml where airPorts.xml is a file that stores an example xml response. The option -i is what tells the dom tool to generate the code you need to parse your result. To obtain an example XML response, test the web service on http://www.webservicex.net/New/Home/ServiceDetail/20. The domcpp tool is found in gsoap/samples/dom and should be built in that directory with: make domcpp Then move or copy the domcpp executable to use it for your projects. For more information about domcpp, read [XML DOM and XPath](https://www.genivia.com/doc/dom/html/index.html) of the gSOAP documentation. gsoap-2.8.91/gsoap/ios_plugin/gsoapios.h0000644000175000017500000002067613525245161017561 0ustar ellertellert/* gsoapios.h iOS plugin (iPhone and iPad) gSOAP XML Web services tools Copyright (C) 2000-2016, 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-2016, 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 GSOAPIOS_H #define GSOAPIOS_H #import "stdsoap2.h" #import #import /** @brief stores states for connection establishment, buffering soap request and response */ @interface GSoapiOSURLData : NSObject { @private NSString *endpoint; NSString *host; NSString *soap_action; NSString *http_method; NSString *content_type; NSMutableData *http_req_msg; NSData *soap_req_msg; NSData *soap_res_msg; int port; int req_content_length; int received_length; // received length of response for deserialization bool request_sent; // flag indicates a soap request has been made // The timeout interval for the new request, in seconds double timeout_interval; unsigned int cache_policy; // The cache policy for the new request NSString *user_name; NSString *password; } @property(nonatomic, retain) NSString *endpoint; // Web service endpoint @property(nonatomic, retain) NSString *host; // host name @property(nonatomic, retain) NSString *soap_action; // soap action @property(nonatomic, retain) NSString *http_method; // http method @property(nonatomic, retain) NSString *content_type; // http content type // http request messgae @property(nonatomic, retain) NSMutableData *http_req_msg; // soap request message @property(nonatomic, retain) NSData *soap_req_msg; // soap response xml message @property(nonatomic, retain) NSData *soap_res_msg; //---------------------------------- @property(nonatomic) int port; // port @property(nonatomic) int req_content_length; // request content length // received length of response for deserialization @property(nonatomic) int received_length; // flag indicates a soap request has been made @property(nonatomic) bool request_sent; // the timout interval for request @property(nonatomic) double timeout_interval; @property(nonatomic) unsigned int cache_policy; //-------------------------------------------- // user and password: must appear in pair @property(nonatomic, retain) NSString *user_name; // user name @property(nonatomic, retain) NSString *password; // pasword - (id) init; @end /** plugin identification for plugin registry */ #define SOAP_IOS_ID "SOAP_IOS-1.0" #ifdef __cplusplus extern "C" { #endif /** @struct soap_ios_data @brief soap_ios plugin data to override callbacks and store states to manipulate SOAP connection using iOS libraries */ struct soap_ios_data { // Stores states such as endpoint, serialized request and response GSoapiOSURLData *url_data; // Buffer variable char* buf; // Tracks the size of the buffer size_t len; // Pointer to the result message const char *res_msg; // The number of bytes the buffer has left to copy from the res_msg size_t res_len; // A callback function to replace the default tcp_connect function // Rather than establishment of a tcp connection using socket, this callback // extracts and saves states (endpoint, http-method, content-type etc.) and // buffers serialized request SOAP_SOCKET (*fopen)(struct soap*, const char*, const char*, int); // A callback function to replace the default tcp_disconnect function // Since no connection is established in fopen, this function does noop int (*fclose)(struct soap*); // A callback function to replace the default send function // This function buffers serialized request including HTTP header and body // (soap message) int (*fsend)(struct soap*, const char *, size_t); // A callback function to replace the default send function // This function sends a synchrous request to the endpoint and receives // response using iOS SDK class NSURLConnection. The response is then snet // to soap for deserialization. size_t (*frecv)(struct soap*, char *, size_t); }; /** @fn int soap_ios(struct soap *soap, struct soap_plugin *p, void *arg); @brief Save the old callbacks and set new callbacks to handle soap client applications on iOS platforms (iPhone and iPad) @param soap The soap context @param[in] p The soap plugin data @param[in] arg The arguments for soap plugin @return SOAP_OK if registration is successfull; SOAP_EOM otherwise Usage: @code struct soap *soap = soap_new(); soap_register_plugin(soap, soap_ios); @endcode */ int soap_ios(struct soap *soap, struct soap_plugin *p, void *arg); /** @fn void soap_ios_setcachepolicy(struct soap *soap, unsigned int policy) @brief Sets cache policy The constants used to specify interaction with the cached responses are: enum { NSURLRequestUseProtocolCachePolicy = 0, NSURLRequestReloadIgnoringLocalCacheData = 1, NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, NSURLRequestReturnCacheDataElseLoad = 2, NSURLRequestReturnCacheDataDontLoad = 3, NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4, NSURLRequestReloadRevalidatingCacheData = 5 }; @param soap The soap context @param[in] policy The policy to be specified for he request */ void soap_ios_setcachepolicy(struct soap *soap, unsigned int policy); /** @fn soap_ios_settimeoutinterval(struct soap *soap, double seconds) @brief Sets timeout interval @param soap The soap context @param[in] seconds The value for the timeout interval to be specifed (in seconds) */ void soap_ios_settimeoutinterval(struct soap *soap, double seconds); #ifdef __cplusplus } #endif // __cplusplus #endif gsoap-2.8.91/gsoap/ios_plugin/gsoapios.mm0000644000175000017500000004350113525245161017733 0ustar ellertellert /* gsoapios.mm iOS plugin (iPhone and iPad) gSOAP XML Web services tools Copyright (C) 2000-2016, 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-2016, 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 ------------------------------------------------------------------------------- */ #import "gsoapios.h" #import #import // ----------------------------------------------------------------------------- // Start of objective-c Class GSoapiOSURLData implementation // ----------------------------------------------------------------------------- /** Class GSoapiOSURLData @brief The class stores the states for connection establishment, buffering soap request and response */ @implementation GSoapiOSURLData @synthesize endpoint; ///< Set or get endpoint @synthesize host; ///< Set or get host name @synthesize soap_action; ///< Set or get soap action @synthesize http_method; ///< Set or get HTTP method @synthesize content_type; ///< Set or get content type @synthesize http_req_msg; ///< Set or get HTTP request message @synthesize soap_req_msg; ///< Set or get SOAP request @synthesize soap_res_msg; ///< Set or get SOAP response @synthesize port; ///< Set or get port @synthesize received_length; ///< Set or get received message length @synthesize request_sent; ///< Set or get the flag for the first time sending @synthesize req_content_length; ///< Set or get request message length @synthesize timeout_interval; ///< Set or get timeout interval @synthesize cache_policy; ///< Set or get cache policy @synthesize user_name; ///< Set or get user ID for authentication @synthesize password; ///< Set or get password for authentication /** @fn init @brief Constructor */ - (id) init { self = [super init]; http_req_msg = [NSMutableData alloc]; timeout_interval = 60.0; // 60 seconds by default cache_policy = NSURLRequestUseProtocolCachePolicy; // The default cache policy return self; } @end // ----------------------------------------------------------------------------- // End of objective-c Class GSoapiOSURLData implementation // ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- // Start of C plugin implementation // ----------------------------------------------------------------------------- /** plugin identification for plugin registry */ const char soap_ios_id[13] = SOAP_IOS_ID; // Unique plugin ID static int soap_ios_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src); static void soap_ios_delete(struct soap *soap, struct soap_plugin *p); static int soap_ios_init(struct soap *soap, soap_ios_data *data); static SOAP_SOCKET soap_ios_open( struct soap *soap, const char *endpoint, const char *host, int port); static int soap_ios_close( struct soap *soap); static int soap_ios_send( struct soap *soap, const char *buf, size_t len); static size_t soap_ios_recv(struct soap *soap, char *buf, size_t len); //void soap_ios_setcachepolicy(struct soap *soap, unsigned int policy); //void soap_ios_settimeoutinterval(struct soap *soap, double seconds); /** @fn int soap_ios(struct soap *soap, struct soap_plugin *p, void *arg); @brief Save the old callbacks and set new callbacks to handle soap client applications on iOS platforms (iPhone and iPad) @param soap The soap context @param[in] p The soap plugin data @param[in] arg The arguments for soap plugin @return SOAP_OK if registration is successfull; SOAP_EOM otherwise Usage: @code struct soap *soap = soap_new(); soap_register_plugin(soap, soap_ios); @endcode */ int soap_ios(struct soap *soap, struct soap_plugin *p, void *arg) { p->id = soap_ios_id; // set a unique plugin id p->data = new soa p->data = static_cast(new soap_ios_data); // Allocate memory p->fcopy = soap_ios_copy; // set fcopy callback for soap_copy(truct soap*) p->fdelete = soap_ios_delete; // set fdeete callback if (p->data) { if (soap_ios_init(soap, static_cast(p->data))) { delete static_cast(p->data); // free resource upon failure to initialize plugin return SOAP_EOM; } } return SOAP_OK; } /** @fn int soap_ios_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) @brief Duplicates the plugin context for the soap context @param soap The soap context @param[out] dst The destination plugin data to store to @param[in] src The sources plugin data to be copied from @return SOAP_OK if registration is successfull; SOAP_ERR otherwise */ static int soap_ios_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) { *dst = *src; dst->data = static_cast(new soap_ios_data); if (dst->data) return soap_ios_init(soap, static_cast(dst->data)); return SOAP_ERR; } /** @fn void soap_ios_delete(struct soap *soap, struct soap_plugin *p) @brief Destroys the plugin context @param soap context @param[in] p plugin data */ static void soap_ios_delete(struct soap *soap, struct soap_plugin *p) { soap_ios_data *data = static_cast(p->data); if (data && data->url_data)// Free url_data // [data->url_data release] delete data; // Free the pointer to url_data } /** @fn int soap_ios_init(struct soap *soap, soap_ios_data *data) @brief Initializes the plugin data @param soap The soap context @param[out] data The plugin data to be initialized @return SOAP_OK if initialization is sucessful; SOAP_ERR otherwise */ static int soap_ios_init(struct soap *soap, soap_ios_data *data) { data->url_data = [[GSoapiOSURLData alloc] init]; if (data->url_data == nil) return SOAP_ERR; // failure to init data->res_len = 0; data->res_msg = ""; // save and set callbacks data->fopen = soap->fopen; // save old fopen callback data->fclose = soap->fclose; // save old fclose callback data->fsend = soap->fsend; // save old fsend callback data->frecv = soap->frecv; // save old frecv callback data->buf = nil; // sets initial value of buf to nil data->len = 0; // sets initial buffer length value to 0 soap->fopen = soap_ios_open; // replace open callback soap->fclose = soap_ios_close; // replace close callback soap->fsend = soap_ios_send; // replace send callback soap->frecv = soap_ios_recv; // replace recv callback return SOAP_OK; } /** @fn SOAP_SOCKET soap_ios_open( struct soap *soap, const char *endpoint, const char *host, int port) @brief Extracts states from soap context and saves states for soap connection @param soap The soap context @param[in] endpoint The Web service's endpoint @param[in] host The host name @param[in] port The port numer @return 1 A valid socket Note: This open function does not create a real socket for communication. The actual connection establishment happens in the frecv callback */ static SOAP_SOCKET soap_ios_open( struct soap *soap, const char *endpoint, const char *host, int port) { // Pull out the pluin data soap_ios_data *data = static_cast(soap_lookup_plugin(soap, soap_ios_id)); if (data == NULL || data->url_data == nil) return SOAP_INVALID_SOCKET; GSoapiOSURLData * url_data = data->url_data; [url_data setEndpoint:[NSString stringWithUTF8String:endpoint]]; [url_data setHost:[NSString stringWithUTF8String:host]]; [url_data setPort:port]; [url_data setRequest_sent:false]; [url_data setReceived_length:0]; [url_data setSoap_action:[NSString stringWithUTF8String:soap->action]]; [url_data setReq_content_length:soap->count]; // Extract a pair of userid and password if present if (soap->userid && soap->passwd) { [url_data setUser_name:[NSString stringWithUTF8String:soap->userid]]; [url_data setPassword:[NSString stringWithUTF8String:soap->passwd]]; } else { [url_data setUser_name:nil]; [url_data setPassword:nil]; } // Extracts and saves http-method switch (soap->status) { case SOAP_POST: [url_data setHttp_method:@"POST"]; break; case SOAP_GET: [url_data setHttp_method:@"GET"]; break; case SOAP_DEL: [url_data setHttp_method:@"DELETE"]; break; case SOAP_CONNECT: [url_data setHttp_method:@"CONNECT"]; break; default: [url_data setHttp_method:@"POST"]; break; } // Extracts and saves http content-type if ((soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) { [url_data setContent_type:@"application/dime"]; } else if (soap->version == 2) { if (soap->mode & SOAP_ENC_MTOM) { [url_data setContent_type:@"application/xop+xml; charset=utf-8; \ type=\"application/soap+xml\""]; } else { [url_data setContent_type:@"application/soap+xml; charset=utf-8"]; } } else if (soap->mode & SOAP_ENC_MTOM) { [url_data setContent_type:@"application/xop+xml; charset=utf-8; \ type=\"text/xml\""]; } else { [url_data setContent_type:@"text/xml; charset=utf-8"]; } return 1; } /** @fn int soap_ios_close(struct soap *soap) @param soap The soap context @return 0 Note: This open function does not create a real socket for communication. The actual connection establishment happens in the frecv callback */ static int soap_ios_close( struct soap *soap) { return 0; } /** @fn int soap_ios_send( struct soap *soap, const char *buf, size_t len) @brief Buffers the http/soap request in plugin data @param soap The soap context @param[in] buf The buffer holding the serialized http/soap request @param[in] len The buffer size @return The number of bytes buffered Note: This send function does not send any data to its peer. Rather it buffers the serialied soap request including http header to the plugin data. The sending happens actually in frecv function. */ static int soap_ios_send( struct soap *soap, const char *buf, size_t len) { soap_ios_data *data = static_cast(soap_lookup_plugin(soap, soap_ios_id)); GSoapiOSURLData *url_data = data->url_data; [url_data.http_req_msg appendBytes:buf length: len]; return len > 0 ? SOAP_OK : SOAP_EOF; } /** @fn size_t soap_ios_recv( struct soap *soap, char *buf, size_t len) @brief Sends soap request, buffers soap response and serialize the response @param soap The soap context @param[out] buf The buffer for the received data @param[in] len The number of bytes received @return The number of bytes received Note: This recv function sends a synchronous soap request through NSURLRequest, receives soap response, serializes response. */ static size_t soap_ios_recv( struct soap *soap, char *buf, size_t len) { soap_ios_data *data = static_cast(soap_lookup_plugin(soap, soap_ios_id)); GSoapiOSURLData *url_data = data->url_data; // Handle HTTP basic authentication if present if (url_data.user_name && url_data.password) { NSURLCredential *credential = [NSURLCredential credentialWithUser:url_data.user_name password:url_data.password persistence:NSURLCredentialPersistenceForSession]; NSURLProtectionSpace * protectionSpace = [[NSURLProtectionSpace alloc] initWithHost:url_data.host port:url_data.port protocol:@"http" realm:nil authenticationMethod:nil]; [[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential:credential forProtectionSpace:protectionSpace]; } // -------- End of auhentication handling --------- // Execute once: sending the request and receiving response // Send request through NSURLSessionDataTask and completionHandler // and receive response if (url_data.request_sent == false) { [url_data setRequest_sent:true]; //int msg_len = [url_data.http_req_msg length]; NSRange range = NSMakeRange([url_data.http_req_msg length] - url_data.req_content_length, url_data.req_content_length); url_data.soap_req_msg = [url_data.http_req_msg subdataWithRange:range]; NSURL *url = [NSURL URLWithString:url_data.endpoint]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestCachePolicy)url_data.cache_policy timeoutInterval:url_data.timeout_interval]; [request addValue:url_data.host forHTTPHeaderField:@"HOST"]; [request addValue:url_data.soap_action forHTTPHeaderField:@"SOAPACTION"]; [request addValue:url_data.content_type forHTTPHeaderField:@"Content-Type"]; [request setHTTPMethod:url_data.http_method]; NSString *conten_length = [NSString stringWithFormat:@"%d", [url_data.soap_req_msg length]]; [request addValue:conten_length forHTTPHeaderField:@"Content-Length"]; [request setHTTPBody:url_data.soap_req_msg]; dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); //ensures DataTask is synchronous NSURLSessionDataTask *dataTask = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { // Error handling if (error) { NSLog(@"ERROR:<%@>\n", [error localizedDescription]); //const char *fault_string = [[error localizedDescription] UTF8String]; soap_receiver_fault(soap, [[error localizedDescription ] UTF8String], ""); } else { url_data.soap_res_msg = [NSData dataWithData:data]; } dispatch_semaphore_signal(semaphore); } ]; [dataTask resume]; dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); //[url_data setRequest_sent:true]; } // may execute multiple times depending on the buffer size and response length if (url_data.request_sent) { if (data->res_msg == "" && data->res_len == 0) { data->res_msg = (const char*)[url_data.soap_res_msg bytes]; //result message as string data->res_len = [url_data.soap_res_msg length]; // response length } if (data->res_len < len) // if the # of bytes you neeed to read is < the max num of bytes. Only copy what you len = data->res_len; // need memcpy(buf,data->res_msg,len); // copy to the buffer data->res_msg += len ; // point to the byte you will start copying from on the next call data->res_len -= len ; // update the amount of bytes you still need to copy } return len; // no longer calls function when len = 0 } /** @fn void soap_ios_setcachepolicy(struct soap *soap, unsigned int policy) @brief Sets cache policy The constants used to specify interaction with the cached responses are: enum { NSURLRequestUseProtocolCachePolicy = 0, NSURLRequestReloadIgnoringLocalCacheData = 1, NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, NSURLRequestReturnCacheDataElseLoad = 2, NSURLRequestReturnCacheDataDontLoad = 3, NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4, NSURLRequestReloadRevalidatingCacheData = 5 }; @param soap The soap context @param[in] policy The policy to be specified for he request */ void soap_ios_setcachepolicy(struct soap *soap, unsigned int policy) { soap_ios_data *data = static_cast(soap_lookup_plugin(soap, soap_ios_id)); data->url_data.cache_policy = policy; } /** @fn soap_ios_settimeoutinterval(struct soap *soap, double seconds) @brief Sets timeout interval @param soap The soap context @param[in] seconds The value for the timeout interval to be specified (in seconds) */ void soap_ios_settimeoutinterval(struct soap *soap, double seconds) { soap_ios_data *data = static_cast(soap_lookup_plugin(soap, soap_ios_id)); data->url_data.timeout_interval = seconds; } // ----------------------------------------------------------------------------- // END of plugin implementation // ----------------------------------------------------------------------------- gsoap-2.8.91/gsoap/ios_plugin/examples/0000755000175000017500000000000013525245161017367 5ustar ellertellertgsoap-2.8.91/gsoap/ios_plugin/examples/Air/0000755000175000017500000000000013525564140020103 5ustar ellertellertgsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/0000755000175000017500000000000013525564140020616 5ustar ellertellertgsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/Air/0000755000175000017500000000000013525564140021331 5ustar ellertellertgsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/Air/main.mm0000644000175000017500000000040513525245161022606 0ustar ellertellert// // main.mm // #import #import "AppDelegate.h" #include "../../airportSoap.nsmap" int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } gsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/Air/ViewController.mm0000644000175000017500000001703013525245161024642 0ustar ellertellert// // ViewController.mm // #import "ViewController.h" #include "soapairportSoapProxy.h" #import "soapStub.h" #import "gsoapios.h" #include @interface ViewController () @end @implementation ViewController @synthesize country_name; @synthesize showResults; - (IBAction)buttonPressed:(id)sender { _ns1__GetAirportInformationByCountry sending; _ns1__GetAirportInformationByCountryResponse receiving; std::string result = ""; //stores resulting data bool webserviceresult = true; //keeps track of if the web service returns a readable result airportSoapProxy service; soap_init(service.soap); // ----- register plugin for callbacks ------ soap_register_plugin(service.soap, soap_ios); std::string countryname = std::string((char*)[country_name.text UTF8String]); sending.country = &countryname; std::stringstream xmlmessage; if(service.GetAirportInformationByCountry(&sending,receiving)==SOAP_OK) xmlmessage << *(receiving.GetAirportInformationByCountryResult); struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); ctx->double_format = "%lG"; xsd__anyType dom(ctx); xmlmessage >> dom; if (dom.soap->error) webserviceresult = false; xsd__anyType *elt; #define USE_ATT(path, text) std::cout << path << " = " << text << std::endl #define USE_ELT(path, text) std::cout << path << " = " << text << std::endl for (xsd__anyType *it = dom.elt_get("Table"); it; it = it->get_next()) { xsd__anyType& dom_Table = *it; if ((elt = dom_Table.elt_get("AirportCode"))) { xsd__anyType& dom_Table_AirportCode = *elt; if (dom_Table_AirportCode.get_text()) { result += "\n\nAirport Code = "; result += dom_Table_AirportCode.get_text(); } } if ((elt = dom_Table.elt_get("CityOrAirportName"))) { xsd__anyType& dom_Table_CityOrAirportName = *elt; if (dom_Table_CityOrAirportName.get_text()) { result += "\nCity or Airport Name = "; result += dom_Table_CityOrAirportName.get_text(); } } if ((elt = dom_Table.elt_get("Country"))) { xsd__anyType& dom_Table_Country = *elt; if (dom_Table_Country.get_text()) { result += "\nCountry = "; result += dom_Table_Country.get_text(); } } if ((elt = dom_Table.elt_get("CountryAbbrviation"))) { xsd__anyType& dom_Table_CountryAbbrviation = *elt; if (dom_Table_CountryAbbrviation.get_text()) { result += "\nCountry Abbreviation = "; result += dom_Table_CountryAbbrviation.get_text(); } } if ((elt = dom_Table.elt_get("CountryCode"))) { xsd__anyType& dom_Table_CountryCode = *elt; if (dom_Table_CountryCode.get_text()) { result += "\nCountry Code = "; result += dom_Table_CountryCode.get_text(); } } if ((elt = dom_Table.elt_get("GMTOffset"))) { xsd__anyType& dom_Table_GMTOffset = *elt; if (dom_Table_GMTOffset.get_text()) { result += "\nGMT Offset = "; result += dom_Table_GMTOffset.get_text(); } } if ((elt = dom_Table.elt_get("RunwayLengthFeet"))) { xsd__anyType& dom_Table_RunwayLengthFeet = *elt; if (dom_Table_RunwayLengthFeet.get_text()) { result += "\nRunway Length (feet) = "; result += dom_Table_RunwayLengthFeet.get_text(); } } if ((elt = dom_Table.elt_get("RunwayElevationFeet"))) { xsd__anyType& dom_Table_RunwayElevationFeet = *elt; if (dom_Table_RunwayElevationFeet.get_text()) { result += "\nRunway Elevation (feet) = "; result += dom_Table_RunwayElevationFeet.get_text(); } } if ((elt = dom_Table.elt_get("LatitudeDegree"))) { xsd__anyType& dom_Table_LatitudeDegree = *elt; if (dom_Table_LatitudeDegree.get_text()) { result += "\nLatitude Degree = "; result += dom_Table_LatitudeDegree.get_text(); } } if ((elt = dom_Table.elt_get("LatitudeMinute"))) { xsd__anyType& dom_Table_LatitudeMinute = *elt; if (dom_Table_LatitudeMinute.get_text()) { result += "\nLatitude Minute = "; result += dom_Table_LatitudeMinute.get_text(); } } if ((elt = dom_Table.elt_get("LatitudeSecond"))) { xsd__anyType& dom_Table_LatitudeSecond = *elt; if (dom_Table_LatitudeSecond.get_text()) { result += "\nLatitude Second = "; result += dom_Table_LatitudeSecond.get_text(); } } if ((elt = dom_Table.elt_get("LatitudeNpeerS"))) { xsd__anyType& dom_Table_LatitudeNpeerS = *elt; if (dom_Table_LatitudeNpeerS.get_text()) { result += "\nLatitude N or S = "; result += dom_Table_LatitudeNpeerS.get_text(); } } if ((elt = dom_Table.elt_get("LongitudeDegree"))) { xsd__anyType& dom_Table_LongitudeDegree = *elt; if (dom_Table_LongitudeDegree.get_text()) { result += "\nLongitude Degree = "; result += dom_Table_LongitudeDegree.get_text(); } } if ((elt = dom_Table.elt_get("LongitudeMinute"))) { xsd__anyType& dom_Table_LongitudeMinute = *elt; if (dom_Table_LongitudeMinute.get_text()) { result += "\nLongitude Minute = "; result += dom_Table_LongitudeMinute.get_text(); } } if ((elt = dom_Table.elt_get("LongitudeSeconds"))) { xsd__anyType& dom_Table_LongitudeSeconds = *elt; if (dom_Table_LongitudeSeconds.get_text()) { result += "\nLongitude Second = "; result += dom_Table_LongitudeSeconds.get_text(); } } if ((elt = dom_Table.elt_get("LongitudeEperW"))) { xsd__anyType& dom_Table_LongitudeEperW = *elt; if (dom_Table_LongitudeEperW.get_text()) { result += "\nLongitude E or W = "; result += dom_Table_LongitudeEperW.get_text(); } } } NSString *airPorts = [NSString stringWithUTF8String:result.c_str()]; if(result == "" || !webserviceresult) airPorts = [NSString stringWithFormat: @"%@", @"Error: no know information. Try a different country."]; showResults.editable = NO; showResults.showsVerticalScrollIndicator = YES; showResults.text = airPorts; soap_destroy(ctx); // delete objects soap_end(ctx); // delete DOM data soap_free(ctx); // free context service.destroy(); } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end gsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/Air/AppDelegate.mm0000644000175000017500000000360313525245161024040 0ustar ellertellert// // AppDelegate.mm // #import "AppDelegate.h" @interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. return YES; } - (void)applicationWillResignActive:(UIApplication *)application { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. } - (void)applicationDidEnterBackground:(UIApplication *)application { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. } - (void)applicationWillEnterForeground:(UIApplication *)application { // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. } - (void)applicationDidBecomeActive:(UIApplication *)application { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. } - (void)applicationWillTerminate:(UIApplication *)application { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } @end gsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/Air/Assets.xcassets/0000755000175000017500000000000013525245161024426 5ustar ellertellertgsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/Air/Assets.xcassets/AppIcon.appiconset/0000755000175000017500000000000013525245161030123 5ustar ellertellertgsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/Air/Assets.xcassets/AppIcon.appiconset/Contents.json0000644000175000017500000000221313525245161032611 0ustar ellertellert{ "images" : [ { "idiom" : "iphone", "size" : "29x29", "scale" : "2x" }, { "idiom" : "iphone", "size" : "29x29", "scale" : "3x" }, { "idiom" : "iphone", "size" : "40x40", "scale" : "2x" }, { "idiom" : "iphone", "size" : "40x40", "scale" : "3x" }, { "idiom" : "iphone", "size" : "60x60", "scale" : "2x" }, { "idiom" : "iphone", "size" : "60x60", "scale" : "3x" }, { "idiom" : "ipad", "size" : "29x29", "scale" : "1x" }, { "idiom" : "ipad", "size" : "29x29", "scale" : "2x" }, { "idiom" : "ipad", "size" : "40x40", "scale" : "1x" }, { "idiom" : "ipad", "size" : "40x40", "scale" : "2x" }, { "idiom" : "ipad", "size" : "76x76", "scale" : "1x" }, { "idiom" : "ipad", "size" : "76x76", "scale" : "2x" }, { "idiom" : "ipad", "size" : "83.5x83.5", "scale" : "2x" } ], "info" : { "version" : 1, "author" : "xcode" } }gsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/Air/ViewController.h0000644000175000017500000000051113525245161024454 0ustar ellertellert// // ViewController.h // #import @interface ViewController : UIViewController{ UITextField* country_name; UITextView* showResults; } @property (strong, nonatomic) IBOutlet UITextField *country_name; @property (strong, nonatomic) IBOutlet UITextView *showResults; -(IBAction) buttonPressed; @end gsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/Air/Base.lproj/0000755000175000017500000000000013525245161023327 5ustar ellertellertgsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/Air/Base.lproj/Main.storyboard0000644000175000017500000001130313525245161026323 0ustar ellertellert gsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/Air/Base.lproj/LaunchScreen.storyboard0000644000175000017500000000320013525245161030006 0ustar ellertellert gsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/Air/Info.plist0000644000175000017500000000311613525245161023301 0ustar ellertellert NSAppTransportSecurity NSAllowsArbitraryLoads CFBundleDevelopmentRegion en CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1 LSRequiresIPhoneOS UILaunchStoryboardName LaunchScreen UIMainStoryboardFile Main UIRequiredDeviceCapabilities armv7 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UISupportedInterfaceOrientations~ipad UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight gsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/Air/AppDelegate.h0000644000175000017500000000025113525245161023652 0ustar ellertellert// // AppDelegate.h // #import @interface AppDelegate : UIResponder @property (strong, nonatomic) UIWindow *window; @end gsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/Air.xcodeproj/0000755000175000017500000000000013525245161023324 5ustar ellertellertgsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/Air.xcodeproj/project.xcworkspace/0000755000175000017500000000000013525245161027322 5ustar ellertellert././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/Air.xcodeproj/project.xcworkspace/contents.xcworkspacedatagsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/Air.xcodeproj/project.xcworkspace/contents.xcworkspac0000644000175000017500000000022413525245161033263 0ustar ellertellert gsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/Air.xcodeproj/project.xcworkspace/xcuserdata/0000755000175000017500000000000013525245161031465 5ustar ellertellert././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/Air.xcodeproj/project.xcworkspace/xcuserdata/bethanysanders.xcuserdatad/gsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/Air.xcodeproj/project.xcworkspace/xcuserdata/bethanys0000755000175000017500000000000013525245161033223 5ustar ellertellert././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/Air.xcodeproj/project.xcworkspace/xcuserdata/bethanysanders.xcuserdatad/UserInterfaceState.xcuserstategsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/Air.xcodeproj/project.xcworkspace/xcuserdata/bethanys0000644000175000017500000006463313525245161033241 0ustar ellertellertbplist00X$versionX$objectsY$archiverT$top'()*+,-./39QRSTUVWXYZ[\]uvwxyz{|}~   &*<=KLMNOPTUV\]^jklmnoptuy    &'()*+,0159=>BFJPQR\]^_`aeinouy}~  $%&./04:?GHPQabcdefgwxyz{|}      !"#&+,-.:;<BCGMQRX^fghpqrz{ #$./0489quvz{$%&'()*+789EFGSTUVWXYZfghijklmyz{| !"./0<=>?KLMNZ[\]ijklmnop|}~ !"#$%&'/3489ABCDEMNXYZ[cmnopqr|}~U$null WNS.keysZNS.objectsV$class aE_$9AE6F07F-4802-41CD-8FD5-719EEC2F8E47_IDEWorkspaceDocument &  ! $% CK^IDEWindowFrame_!IDEOrderedWorkspaceTabControllers_>IDEWorkspaceTabController_26FCCB0D-7EB3-404C-982E-6FC5DBBD99E3_,IDEWorkspaceWindowControllerUniqueIdentifier_IDEActiveWorkspaceTabController_IDEWindowToolbarIsVisible_IDEWindowTabBarIsVisible_{{4, 0}, {1436, 877}} 024567Z$classnameX$classesWNSArray68XNSObject :E&;<=>?@ABCDF$HIJKL$NOS]`OK[IDETabLabel_IDEShowNavigator]IDEEditorArea_-IDEWorkspaceTabControllerUtilityAreaSplitView_IDENavigatorArea_,IDEWorkspaceTabControllerDesignAreaSplitView\ViewDebugger_IDEShowUtilities^IDETabFilePath_AssistantEditorsLayout]Air.xcodeproj ^i&_`abcdefgh !"#$%&jkl$OOpqr%'ҀOOހCK_IDEEditorMode_Genius_IDEEditorMode_StandardZlayoutTree]IDEShowEditor_VersionEditorSubmodeZEditorMode_IDEDefaultDebugArea_DebuggerSplitView_ DefaultPersistentRepresentations_ShowDebuggerArea &()*+K]SplitPosition_%EditorLayout_PersistentRepresentation"? &,-.\KYAlternateTMain /01O2OZE_)EditorLayout_StateSavingStateDictionaries_EditorLayout_Selected_EditorLayout_Geometry 3Y &456789:;?@%ɀABCDE_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRange]HideAllIssues_%PrimaryDocumentSelectedCharacterRange#AY ĶX{0, 439}X{241, 0}45\NSDictionary8 O_DocumentLocation^IdentifierPath_DomainIdentifier_IndexOfDocumentIdentifierPGSO 2HL &IJK_navigableItem_name_ViewController.h45_NSMutableDictionary8 &MNKZidentifier_;Xcode.InterfaceBuilderKit.GeniusCategory.SelectionAutomatic [documentURLYtimestampQR_Hfile:///Users/bethanysanders/Documents/work/Air/Air/Air/ViewController.h45_DVTDocumentLocation8_DVTDocumentLocation45_(IDENavigableItemArchivableRepresentation8_(IDENavigableItemArchivableRepresentation_@interface ViewController_ViewController.h_&Xcode.IDEKit.EditorDocument.SourceCode  WNS.base[NS.relativeXQ45UNSURL845^NSMutableArray68 [Y_{{0, 0}, {457, 462}} !/01"O$]OE '2(^ +3&456789:456789:_`vzK_*com.apple.InterfaceBuilder3.Storyboard.XIB >D?@ABCabcdeEFCHIfheilE_SelectedMemberIdentifiers_EditedMemberConfiguration_SelectionProvider_#IBStoryboardStructureViewController_IBCanvasViewController Q2RgZaHC-d7-90VWdefault WY&XjZkK_LastKnownOutlineViewWidth#@p _d&`abcmnopefghqrsuKZZoomFactor[CenterPoint_EditedTopLevelMemberIDs_$ObjectIDToLastKnownCanvasPositionMap#?\{279, 332.5} q2rtZBYZ-38-t0r vw&K z{}~xSw_/Xcode.IDENavigableItemDomain.WorkspaceStructure 2y} 8ZIdentifierUIndexz{|_Main.storyboard45_IDEArchivableStringIndexPair8_IDEArchivableStringIndexPair ~|SAir O~O| ހR_Rfile:///Users/bethanysanders/Documents/work/Air/Air/Air/Base.lproj/Main.storyboard\Show Results_7Xcode.IDEKit.InterfaceBuilder.EditorDocument.Storyboard  X 2_{{0, 0}, {916, 462}} &)K &-K OOЀE_)EditorLayout_StateSavingStateDictionaries_EditorLayout_Selected_EditorLayout_Geometry 2Ȁ &Ҁڀƀ̀̀΀πK\FileDataType[EditorState_ArchivableRepresentation_NavigableItemName_DocumentNavigableItemName_DocumentExtensionIdentifier[DocumentURL_com.apple.xcode.project 通ŀE_(Xcode3ProjectEditor.sourceList.splitview_+Xcode3ProjectEditor_Xcode3BuildPhasesEditor_,Xcode3ProjectEditorSelectedDocumentLocations_,Xcode3ProjectEditorPreviousTargetEditorClass &K_DVTSplitViewItems Y E]DVTIdentifier_DVTViewMagnitude_!sourceListSplitViewItemIdentifier#@e@  EP#@H & !"#$K_+Xcode3BuildPhasesEditorDisclosedNamesKey2.0_58596A171D53A2F2002C48A8_58596A191D53A2F2002C48A8_&kXcode3BuildPhasesEditorScrollPointKey_58596A161D53A2F2002C48A8_58596A181D53A2F2002C48A8 -/._Link Binary With Libraries4523\NSMutableSet248UNSSet 67&K :;&KV{0, 0} ?@&K CD&K G2HK LMNOYselection_Bfile:///Users/bethanysanders/Documents/work/Air/Air/Air.xcodeproj/#Ac#9 SW&TUVXYZ€KVEditorVTarget_ Xcode3BuildPhasesEditorLocations_Xcode3BuildPhasesEditorSAir b2cÀ fg&K45jk_Xcode3ProjectDocumentLocationlm8_Xcode3ProjectDocumentLocation_DVTDocumentLocation_Xcode3BuildPhasesEditor pq}tˀǀSw v2wȀ zOɀO|SAir ހ̀R_Bfile:///Users/bethanysanders/Documents/work/Air/Air/Air.xcodeproj/SAir_7Xcode.Xcode3ProjectSupport.EditorDocument.Xcode3Project  X 2р_{{0, 0}, {916, 839}} _rootLayoutTreeNode_geniusEditorContextNode_primaryEditorContextNodeڀӀ XchildrenVparent[contentType_ documentArchivableRepresentation[orientationڀ }ـՀSw 2ր O׀O|SAir ހ̀R ۀ܀ 2Ӏ45_'IDEWorkspaceTabControllerLayoutTreeNode8_'IDEWorkspaceTabControllerLayoutTreeNode45_#IDEWorkspaceTabControllerLayoutTree8_#IDEWorkspaceTabControllerLayoutTree &̀߀рKXLeftView_IDESplitViewDebugAreaZLayoutModeYRightView &܀%O$COK_VariablesViewShowsRawValues_VariablesViewSelectedScope_ VariablesViewViewSortDescriptors_VariablesViewShowsType 2 &K_DVTSplitViewItems Y EXLeftView#@| EYRightView#@|   & OOK_ConsoleFilterMode &K Y  !"EYIDEEditor#@~ '*+,E_IDEDebuggerArea#@u 12&K 57&8K ;<=Y @CEE#@@ ILNE#@k RY&STUVWX  Z[\]^_  /=>JK_ Xcode.IDEKit.Navigator.Structure_Xcode.IDEKit.Navigator.Issues_Xcode.IDEKit.Navigator.Debug_SelectedNavigator_Xcode.IDEKit.Navigator.Logs_"Xcode.IDEKit.Navigator.Breakpoints ho&ijklmn  pqr%t%CCK_IDEExpandedItemsTree^IDEVisibleRect_IDESelectedTree_!IDERecentDocumentFilteringEnabled_,IDENavigatorExpandedItemsBeforeFilteringTree_IDESCMStatusFilteringEnabled ~E_IDEValuesAsTree &KSAir &KPSAir &K_Supporting Files_{{0, 0}, {259, 782}} E &K E &K &j! "#$%&'(%%%ɀC)*+C,-C.K_IDEErrorFilteringEnabled_IDECollapsedFiles_IDEExpandedIssues^IDEShowsByType_IDESelectedNavigables_IDECollapsedTypes_IDERecentFilteringEnabled_IDECollapsedGroups_{{0, 0}, {259, 753}} / / Y / / &j0123 4%O%C5OC;N@OE_IDEValuesAsTree DE&K HJ>NKQE NO&K_{{0, 0}, {259, 782}} SU&VTK YZ[\UX[Y _bcdVWE_IDENavigatorArea#@p@ ilmnYZE]IDEEditorArea#@ svwd\WE_IDEUtilitiesArea |&}~^_$$K_ShowsOnlyInterestingViewObjects_ShowsOnlyVisibleViewObjects_:/Users/bethanysanders/Documents/work/Air/Air/Air.xcodeproj &bcdefghi$j`cq}K_BreakpointsActivated_DefaultEditorStatesForURLs\ActiveScheme_ActiveRunDestination_DefaultEditorFrameSizeForURLs_0LastCompletedPersistentSchemeBasedActivityReport_DocumentWindows_RecentEditorDocumentURLs &klmnopq{BMK_'Xcode.IDEKit.EditorDocument.LogDocument_'Xcode.IDEKit.EditorDocument.PlistEditor_7Xcode.Xcode3ProjectSupport.EditorDocument.Xcode3Project_&Xcode.IDEKit.EditorDocument.SourceCode_7Xcode.IDEKit.InterfaceBuilder.EditorDocument.Storyboard_(Xcode.IDEKit.EditorDocument.AssetCatalog &rtK  Xs_2x-xcode-log://17D2EE0B-46C3-4E24-9CA0-DBE357202D84 &ŁuǁvK_SelectedDocumentLocations 2́w _expandTranscriptYindexPathzsx _NSIndexPathLength_NSIndexPathValue y45[NSIndexPath8[NSIndexPath45_IDELogDocumentLocation8_IDELogDocumentLocation_DVTDocumentLocation &|~K  X}_Bfile:///Users/bethanysanders/Documents/work/Air/Air/Air/Info.plist &K_IDE_PLIST_EDITOR_SELECTION_KEY_ IDE_PLIST_EDITOR_VISIBLERECT_KEY_IDE_PLIST_EDITOR_EXPANSION_KEY_{{0, 0}, {880, 787}} / Y &K  NX &通K 2K  NO#Ac"Z %)&TU(*Y,K_ Xcode3BuildPhasesEditorLocations_Xcode3BuildPhasesEditor 122 56&K_Xcode3BuildPhasesEditor :U&;<=>?@ABCDEFGHIJKLMNOPQRSTįVWXYZ[\]^_`abcdefghijklmnoƁ́Ձ݁ !$'+/3;?K  tX_Hfile:///Users/bethanysanders/Documents/work/Air/Air/Air/ViewController.m  yX_Wfile:///Users/bethanysanders/Downloads/gsoap-2.8/gsoap/ios_plugin/ios_plugin/gsoapios.h  ~X_7file:///Users/bethanysanders/Documents/work/Air/dom.cpp  X_ofile:///Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/locale  X_pfile:///Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/ostream  X_file:///Users/bethanysanders/Documents/work/Air/Air/Air/main.m  ӀX_Afile:///Users/bethanysanders/Documents/work/Air/airportSoap.nsmap  ؀X_:file:///Users/bethanysanders/Documents/work/Air/soapStub.h  ݀X_?file:///Users/bethanysanders/Documents/work/Air/Air/Air/main.mm  X_Ffile:///Users/bethanysanders/Documents/work/Air/soapairportSoapProxy.h  X_Ifile:///Users/bethanysanders/Documents/work/Air/Air/Air/ViewController.mm  X_Efile:///Users/bethanysanders/Documents/work/Air/Air/Air/AppDelegate.h  X_Efile:///Users/bethanysanders/Documents/work/Air/Air/Air/AppDelegate.m &ǁȁɁʤ%"ˁ̀CK_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRange]HideAllIssues_%PrimaryDocumentSelectedCharacterRange#AS X{0, 497}  &  ΁ρЁѤ  %ҁӀCԀK_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRange]HideAllIssues_%PrimaryDocumentSelectedCharacterRange#A[bY{0, 2513}Y{4976, 0} &ցׁ؁٤ %"ځۀC܀K_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRange]HideAllIssues_%PrimaryDocumentSelectedCharacterRange#A[Y{0, 2851}Z{74399, 0} ,1&ǁȁɁʤ23%"ށ߀CK#ASz*]{49635, 1386} :?&ǁȁɁʤ@A%"CK#ASeB]{21710, 1607} HM&IJKLNO%QCK_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRange]HideAllIssues_%PrimaryDocumentSelectedCharacterRange#A[2Y{0, 2696}W{49, 0} [`&\]^_ab%dCK_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRange]HideAllIssues_%PrimaryDocumentSelectedCharacterRange#AU'3\{2157, 1880}Y{3625, 0} ns&IJKLtu%wCK#A[Y{0, 1917}X{630, 0} }&ǁȁɁʤ%CK#ASY{0, 1614}X{289, 0} &IJKL%CK#A[Y{0, 1880}W{53, 0} &ցׁ؁٤%CK#A[zY{0, 2685}Z{33118, 0} &IJKL%CK#A[zY{0, 2281}W{10, 0} &IJKL% C K#A[lfY{0, 1923}W{20, 0} &\]^_%"  CK#AU'+8]{24928, 1796} &IJKL%߁CK#A[tX{0, 329}W{28, 0} &Ā=>?@%"CK#AY ,Y{0, 1308} &%CK_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRange]HideAllIssues_%PrimaryDocumentSelectedCharacterRange#AcgXOY{0, 2799}Y{2665, 0}  &IJKL  %C K#A[Y{0, 2650}Y{2459, 0} &ǁȁɁʤ%""#CK#ASLX{0, 337} #(&IJKL)*%"%&CK#A[ V2X{0, 597} 16&IJKL78%:()C*K#A[=Y{0, 2794}W{13, 0} @E&IJKLFG%I,-C.K#A[sX{0, 296}W{14, 0} OT&IJKLUV%X01C2K#A[*|Y{0, 3315}W{25, 0} ^c&_`ab4567de%g89C:K_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRange]HideAllIssues_%PrimaryDocumentSelectedCharacterRange#Ac]~[{220, 2303}W{23, 0} qv&IJKLwx%z<=C>K#A[ϞX{0, 169}W{24, 0} &ǁȁɁʤ%"@ACK#AS_WY{0, 2034} &ACK &?@ABCabcdeCDeEFK_&heightClass=regular-widthClass=regular &XjZkK &`abcmnGopHIJKLK_LastOverviewZoomFactor#?Z{440, 412}#? 2rt &K &āNƁPK  ˀXO_Hfile:///Users/bethanysanders/Documents/work/Air/Air/Air/Assets.xcassets/ &ԁQRSTUVہWXY]^_K_detailController_selectedItemIdentifiers_source-list-area[sourceItems]sclicing-area]overview-area_IBICCatalogOverviewController / &Z[K_expandedItemIDs \45448 / &K &K abE]IDENameStringSAir      defghijk$%$lCmnopEYtargetSDKZisEligible_targetDeviceIsWireless_targetDeviceLocation_targetArchitecture_targetDeviceFamily_targetDeviceModelCode_targetDeviceIsConcrete_iphonesimulator9.3_>dvtdevice-iphonesimulator:949C3351-857E-4EF6-A71D-9360DB1F9CE8Vx86_64ViPhoneYiPhone8,2 (+&)*rt,-v{K  2Xs_Hfile:///Users/bethanysanders/Documents/work/Air/soapairportSoapProxy.cpp  7Xu_?yzEUwidthVheight#@#@ FI;<wx>Ky|E#@ OS&PQR~TU~K_0IDEActivityReportCompletionSummaryStringSegments_IDEActivityReportOptions_IDEActivityReportTitle \]^_`aY dh&efgij~K_&IDEActivityReportStringSegmentPriority_+IDEActivityReportStringSegmentBackSeparator_)IDEActivityReportStringSegmentStringValue#@c % sw&efgxyzK#@Q UBuild &efg~K#@R: &efgeqKc %  WNS.dataOabplist00;Troot#-27EKR[boqsu!$-4<ILNPU]`eruz?Á45]NSMutableData8VNSData &egiЁK_"IDEActivityReportStringSegmentType_"IDEActivityReportStringSegmentDate_'IDEActivityReportStringSegmentDateStyle_'IDEActivityReportStringSegmentTimeStyle WNS.time#A^"=45VNSDate8_8/12/16 at 11:26 AMj  Y RȁY  ̀X_Afile:///Users/bethanysanders/Documents/work/Air/airportSoap.nsmap  ҀX_Hfile:///Users/bethanysanders/Documents/work/Air/soapairportSoapProxy.cpp  ׀X_Ffile:///Users/bethanysanders/Documents/work/Air/soapairportSoapProxy.h  ܀X_9file:///Users/bethanysanders/Documents/work/Air/soapC.cpp  X_7file:///Users/bethanysanders/Documents/work/Air/soapH.h  X_:file:///Users/bethanysanders/Documents/work/Air/soapStub.h_NSKeyedArchiverUState"+5:?$3579;=?APRTVXZ\^`o%A\t}  (;Iy     4 6 8 : < > @ B D F H ] _ a c e g i k m o q s  + > K P R T Y [ ] _ m  7 O X [ ] _ l { }  * 6 H U ^ ` b d f o q s u w y    # ( = P _ r   #%(*,7uw %.Y^%4;DGIKbovxz|)+-/13>@BDFHJf  -6CLNPRT]_acegr~ R[bdfhjw#0246 !#%257:<>KRTVX_aceg )5Pd N}  /S\inprwy{}~,Up"#$&/246GQSUWY(+-/<=>@Iip "gk:<>@B[dkw +-/13<?ACLv{ &(*,.09Q\fs|~     ' * , / 1 3 G P U W Y [ h m o q v x z | !!!!!!!!!!)!.!0!2!7!9!;!=!G!P!]!b!d!f!k!m!o!q!!!!!!!!!!!!!!!!!!!!!!!!!!"" " " """""""/"<"?"B"E"H"K"N"["^"a"d"g"j"m"o""""##(#5#B#E#H#K#N#Q#T#a#d#g#j#l#o#q#s#####$$*$-$0$3$6$8$J$W$Z$]$`$c$e$i$v${$~$$$$$$$$$$$$$$$$$$$$$$$% % %%%%%%%(%+%.%1%3%@%A%B%D%Q%d%g%j%m%p%s%v%y%|%%%%%%%%%%%%%%%%&&*&F&[&r&{&|&~&&&&&&&&&&&&&&&&&&&&&&&&&&&&''2'L'g'''''''''''''(&(/(2(4(6(E(\(^(((((((((((((((((())!)G)])))))))))))))))**********4*\*i*l*o*r*u*w**********************+++ + ++++$+&+(+-+0+3+5+H+Q+^+c+e+g+l+o+r+t+++++++++++++++++++,,$,a,n,,,,,,,,,,,,,,,,,,,,,---9-l-~-----------------..:.t..////////*/,/./1/f/s/v/y/|////////////////0 0 0"0%0.0:0?0K0T0m0t00000000000011$1+1.11141;1=1@1C1E1f1111111111111111222 2 22"2$2&2(2*2325272:2=2?2H2K2N2P2a2d2g2i2k2t2222222222222222222233&3]3`3c3f3i3l3o3r3u3x3{3~33333333333333333333333334444 4 4444444!4$4'4*4-40424?4A4C4F4444445 5555M5Z5\5^5a555556Z6g6i6k6n6666677#7%7'7*7u77777777788+8-8/828888888888989E9G9I9L99999::*:,:.:1:v:::::::::;; ;";$;';h;u;w;y;|;;;;;<<< <"<%> > >>>>.>U>c>>>>>>>>>>>>>>>>??%?M?V?`?j?w??????????????@@#@-@8@E@N@Q@T@W@Z@c@f@i@k@m@o@x@@@@@@@@@@@@@@@@@@@@@@AAAA A A'ANA\AAAAAAAAAAAAAAAAABB'BOBXBeBoB|BBBBBBBBBBBBBBBBBBBBBBBBBBCCCC$C-C0C3C6C9CBCECHCJCMCOCXCbCjCwCCCCCCCCCCCCCCCCCCCCCCCCCCDD DD D)D,D/D2D5D>DADDDFDIDKDTD^DfDsD|DDDDDDDDDDDDDDDDDDDDDDDDDDEEEEE E"E$E-E0E3E5E7E9EBELEYEbEeEhEkEnEwEzE}EEEEEEEFFFF&F/F2F5F8F;FDFGFJFLFOFQFZFdFnF{FFFFFFFFFFFFFFFFFFFFFFFFFFGG GGGGG"G+G.G1G3G6G8GAGKGSG`GiGlGoGrGuG~GGGGGGGGGGGGGGGGGGGGGGGHHHHHHH#H&H)H+H.H0HKHrHHHHHHHHHHHHHHHHHIIII$I-I0I3I6I9IBIEIHIJILINIWIaInIqItIwIzI|IIIIIIIIIIIIIIIIIIIIIJJJJJJJJ(J+J.J1J4J7J9JRJ[JfJoJxJ{J}JJJJJJJJJJJJJJJK KK$K'K*K-K0K3K6KCKFKIKLKOKRKUKWKjKKKKKKKKKKKKLLLLL!L"L%L.L3L SchemeUserState Air.xcscheme orderHint 0 SuppressBuildableAutocreation 58596A191D53A2F2002C48A8 primary 58596A321D53A2F3002C48A8 primary 58596A3D1D53A2F3002C48A8 primary ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/Air.xcodeproj/xcuserdata/bethanysanders.xcuserdatad/xcschemes/Air.xcschemegsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/Air.xcodeproj/xcuserdata/bethanysanders.xcuserdatad/x0000644000175000017500000000777713525245161033223 0ustar ellertellert ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/Air.xcodeproj/xcuserdata/bethanysanders.xcuserdatad/xcdebugger/gsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/Air.xcodeproj/xcuserdata/bethanysanders.xcuserdatad/x0000755000175000017500000000000013525245161033177 5ustar ellertellert././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/Air.xcodeproj/xcuserdata/bethanysanders.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlistgsoap-2.8.91/gsoap/ios_plugin/examples/Air/Air/Air.xcodeproj/xcuserdata/bethanysanders.xcuserdatad/x0000644000175000017500000000013313525245161033176 0ustar ellertellert gsoap-2.8.91/gsoap/ios_plugin/examples/Air/airport.h0000644000175000017500000020042013525245161021731 0ustar ellertellert/* airport.h Generated by wsdl2h 2.8.33 from http://www.webservicex.net/airport.asmx?WSDL and typemap.dat 2016-08-17 14:07:57 GMT DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS USE THE soapcpp2-GENERATED SOURCE CODE FILES FOR YOUR PROJECT BUILDS gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. 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 -------------------------------------------------------------------------------- */ /** @page page_notes Notes @note HINTS: - Run soapcpp2 on airport.h to generate the SOAP/XML processing logic. Use soapcpp2 -I to specify paths for #import To build with STL, 'stl.h' is imported from 'import' dir in package. Use soapcpp2 -j to generate improved proxy and server classes. Use soapcpp2 -r to generate a report. - Use wsdl2h -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. - Run Doxygen (www.doxygen.org) on this file to generate documentation. - Use wsdl2h -R to generate REST operations. - Use wsdl2h -nname to use name as the base namespace prefix instead of 'ns'. - Use wsdl2h -Nname for service prefix and produce multiple service bindings - Use wsdl2h -d to enable DOM support for xsd:anyType. - Use wsdl2h -g to auto-generate readers and writers for root elements. - Use wsdl2h -b to auto-generate bi-directional operations (duplex ops). - Use wsdl2h -U to map XML names to C++ Unicode identifiers instead of _xNNNN. - Use wsdl2h -u to disable the generation of unions. - Struct/class members serialized as XML attributes are annotated with a '@'. - Struct/class members that have a special role are annotated with a '$'. @warning DO NOT INCLUDE THIS ANNOTATED FILE DIRECTLY IN YOUR PROJECT SOURCE CODE. USE THE FILES GENERATED BY soapcpp2 FOR YOUR PROJECT'S SOURCE CODE: THE soapStub.h FILE CONTAINS THIS CONTENT WITHOUT ANNOTATIONS. @copyright LICENSE: @verbatim -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. The wsdl2h tool and its generated software are released under the GPL. This software is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- @endverbatim */ //gsoapopt c++,w /******************************************************************************\ * * * Definitions * * http://www.webserviceX.NET * * * \******************************************************************************/ /******************************************************************************\ * * * $CONTAINER * * std::vector * * * \******************************************************************************/ template class std::vector; /******************************************************************************\ * * * Import * * * \******************************************************************************/ #import "stl.h" // enable STL containers when used (option -s removes STL dependency) /******************************************************************************\ * * * 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: ns1 = "http://www.webserviceX.NET" */ #define SOAP_NAMESPACE_OF_ns1 "http://www.webserviceX.NET" //gsoap ns1 schema namespace: http://www.webserviceX.NET //gsoap ns1 schema elementForm: qualified //gsoap ns1 schema attributeForm: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ /******************************************************************************\ * * * Forward Declarations * * * \******************************************************************************/ // Forward declaration of class _ns1__getAirportInformationByISOCountryCode. class _ns1__getAirportInformationByISOCountryCode; // Forward declaration of class _ns1__getAirportInformationByISOCountryCodeResponse. class _ns1__getAirportInformationByISOCountryCodeResponse; // Forward declaration of class _ns1__getAirportInformationByCityOrAirportName. class _ns1__getAirportInformationByCityOrAirportName; // Forward declaration of class _ns1__getAirportInformationByCityOrAirportNameResponse. class _ns1__getAirportInformationByCityOrAirportNameResponse; // Forward declaration of class _ns1__GetAirportInformationByCountry. class _ns1__GetAirportInformationByCountry; // Forward declaration of class _ns1__GetAirportInformationByCountryResponse. class _ns1__GetAirportInformationByCountryResponse; // Forward declaration of class _ns1__getAirportInformationByAirportCode. class _ns1__getAirportInformationByAirportCode; // Forward declaration of class _ns1__getAirportInformationByAirportCodeResponse. class _ns1__getAirportInformationByAirportCodeResponse; /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://www.webserviceX.NET * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://www.webserviceX.NET * * * \******************************************************************************/ /// @brief Top-level root element "http://www.webserviceX.NET":getAirportInformationByISOCountryCode /// @brief "http://www.webserviceX.NET":getAirportInformationByISOCountryCode is a complexType. /// /// class _ns1__getAirportInformationByISOCountryCode operations: /// - _ns1__getAirportInformationByISOCountryCode* soap_new__ns1__getAirportInformationByISOCountryCode(soap*) allocate /// - _ns1__getAirportInformationByISOCountryCode* soap_new__ns1__getAirportInformationByISOCountryCode(soap*, int num) allocate array /// - _ns1__getAirportInformationByISOCountryCode* soap_new_req__ns1__getAirportInformationByISOCountryCode(soap*, ...) allocate, set required members /// - _ns1__getAirportInformationByISOCountryCode* soap_new_set__ns1__getAirportInformationByISOCountryCode(soap*, ...) allocate, set all public members /// - _ns1__getAirportInformationByISOCountryCode::soap_default(soap*) reset members to default /// - int soap_read__ns1__getAirportInformationByISOCountryCode(soap*, _ns1__getAirportInformationByISOCountryCode*) deserialize from a stream /// - int soap_write__ns1__getAirportInformationByISOCountryCode(soap*, _ns1__getAirportInformationByISOCountryCode*) serialize to a stream /// - _ns1__getAirportInformationByISOCountryCode* _ns1__getAirportInformationByISOCountryCode::soap_dup(soap*) returns deep copy of _ns1__getAirportInformationByISOCountryCode, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _ns1__getAirportInformationByISOCountryCode::soap_del() deep deletes _ns1__getAirportInformationByISOCountryCode data members, use only after _ns1__getAirportInformationByISOCountryCode::soap_dup(NULL) (use soapcpp2 -Ed) class _ns1__getAirportInformationByISOCountryCode { public: /// Element "CountryAbbrviation" of XSD type xs:string. std::string* CountryAbbrviation 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://www.webserviceX.NET":getAirportInformationByISOCountryCodeResponse /// @brief "http://www.webserviceX.NET":getAirportInformationByISOCountryCodeResponse is a complexType. /// /// class _ns1__getAirportInformationByISOCountryCodeResponse operations: /// - _ns1__getAirportInformationByISOCountryCodeResponse* soap_new__ns1__getAirportInformationByISOCountryCodeResponse(soap*) allocate /// - _ns1__getAirportInformationByISOCountryCodeResponse* soap_new__ns1__getAirportInformationByISOCountryCodeResponse(soap*, int num) allocate array /// - _ns1__getAirportInformationByISOCountryCodeResponse* soap_new_req__ns1__getAirportInformationByISOCountryCodeResponse(soap*, ...) allocate, set required members /// - _ns1__getAirportInformationByISOCountryCodeResponse* soap_new_set__ns1__getAirportInformationByISOCountryCodeResponse(soap*, ...) allocate, set all public members /// - _ns1__getAirportInformationByISOCountryCodeResponse::soap_default(soap*) reset members to default /// - int soap_read__ns1__getAirportInformationByISOCountryCodeResponse(soap*, _ns1__getAirportInformationByISOCountryCodeResponse*) deserialize from a stream /// - int soap_write__ns1__getAirportInformationByISOCountryCodeResponse(soap*, _ns1__getAirportInformationByISOCountryCodeResponse*) serialize to a stream /// - _ns1__getAirportInformationByISOCountryCodeResponse* _ns1__getAirportInformationByISOCountryCodeResponse::soap_dup(soap*) returns deep copy of _ns1__getAirportInformationByISOCountryCodeResponse, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _ns1__getAirportInformationByISOCountryCodeResponse::soap_del() deep deletes _ns1__getAirportInformationByISOCountryCodeResponse data members, use only after _ns1__getAirportInformationByISOCountryCodeResponse::soap_dup(NULL) (use soapcpp2 -Ed) class _ns1__getAirportInformationByISOCountryCodeResponse { public: /// Element "getAirportInformationByISOCountryCodeResult" of XSD type xs:string. std::string* getAirportInformationByISOCountryCodeResult 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://www.webserviceX.NET":getAirportInformationByCityOrAirportName /// @brief "http://www.webserviceX.NET":getAirportInformationByCityOrAirportName is a complexType. /// /// class _ns1__getAirportInformationByCityOrAirportName operations: /// - _ns1__getAirportInformationByCityOrAirportName* soap_new__ns1__getAirportInformationByCityOrAirportName(soap*) allocate /// - _ns1__getAirportInformationByCityOrAirportName* soap_new__ns1__getAirportInformationByCityOrAirportName(soap*, int num) allocate array /// - _ns1__getAirportInformationByCityOrAirportName* soap_new_req__ns1__getAirportInformationByCityOrAirportName(soap*, ...) allocate, set required members /// - _ns1__getAirportInformationByCityOrAirportName* soap_new_set__ns1__getAirportInformationByCityOrAirportName(soap*, ...) allocate, set all public members /// - _ns1__getAirportInformationByCityOrAirportName::soap_default(soap*) reset members to default /// - int soap_read__ns1__getAirportInformationByCityOrAirportName(soap*, _ns1__getAirportInformationByCityOrAirportName*) deserialize from a stream /// - int soap_write__ns1__getAirportInformationByCityOrAirportName(soap*, _ns1__getAirportInformationByCityOrAirportName*) serialize to a stream /// - _ns1__getAirportInformationByCityOrAirportName* _ns1__getAirportInformationByCityOrAirportName::soap_dup(soap*) returns deep copy of _ns1__getAirportInformationByCityOrAirportName, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _ns1__getAirportInformationByCityOrAirportName::soap_del() deep deletes _ns1__getAirportInformationByCityOrAirportName data members, use only after _ns1__getAirportInformationByCityOrAirportName::soap_dup(NULL) (use soapcpp2 -Ed) class _ns1__getAirportInformationByCityOrAirportName { public: /// Element "cityOrAirportName" of XSD type xs:string. std::string* cityOrAirportName 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://www.webserviceX.NET":getAirportInformationByCityOrAirportNameResponse /// @brief "http://www.webserviceX.NET":getAirportInformationByCityOrAirportNameResponse is a complexType. /// /// class _ns1__getAirportInformationByCityOrAirportNameResponse operations: /// - _ns1__getAirportInformationByCityOrAirportNameResponse* soap_new__ns1__getAirportInformationByCityOrAirportNameResponse(soap*) allocate /// - _ns1__getAirportInformationByCityOrAirportNameResponse* soap_new__ns1__getAirportInformationByCityOrAirportNameResponse(soap*, int num) allocate array /// - _ns1__getAirportInformationByCityOrAirportNameResponse* soap_new_req__ns1__getAirportInformationByCityOrAirportNameResponse(soap*, ...) allocate, set required members /// - _ns1__getAirportInformationByCityOrAirportNameResponse* soap_new_set__ns1__getAirportInformationByCityOrAirportNameResponse(soap*, ...) allocate, set all public members /// - _ns1__getAirportInformationByCityOrAirportNameResponse::soap_default(soap*) reset members to default /// - int soap_read__ns1__getAirportInformationByCityOrAirportNameResponse(soap*, _ns1__getAirportInformationByCityOrAirportNameResponse*) deserialize from a stream /// - int soap_write__ns1__getAirportInformationByCityOrAirportNameResponse(soap*, _ns1__getAirportInformationByCityOrAirportNameResponse*) serialize to a stream /// - _ns1__getAirportInformationByCityOrAirportNameResponse* _ns1__getAirportInformationByCityOrAirportNameResponse::soap_dup(soap*) returns deep copy of _ns1__getAirportInformationByCityOrAirportNameResponse, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _ns1__getAirportInformationByCityOrAirportNameResponse::soap_del() deep deletes _ns1__getAirportInformationByCityOrAirportNameResponse data members, use only after _ns1__getAirportInformationByCityOrAirportNameResponse::soap_dup(NULL) (use soapcpp2 -Ed) class _ns1__getAirportInformationByCityOrAirportNameResponse { public: /// Element "getAirportInformationByCityOrAirportNameResult" of XSD type xs:string. std::string* getAirportInformationByCityOrAirportNameResult 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://www.webserviceX.NET":GetAirportInformationByCountry /// @brief "http://www.webserviceX.NET":GetAirportInformationByCountry is a complexType. /// /// class _ns1__GetAirportInformationByCountry operations: /// - _ns1__GetAirportInformationByCountry* soap_new__ns1__GetAirportInformationByCountry(soap*) allocate /// - _ns1__GetAirportInformationByCountry* soap_new__ns1__GetAirportInformationByCountry(soap*, int num) allocate array /// - _ns1__GetAirportInformationByCountry* soap_new_req__ns1__GetAirportInformationByCountry(soap*, ...) allocate, set required members /// - _ns1__GetAirportInformationByCountry* soap_new_set__ns1__GetAirportInformationByCountry(soap*, ...) allocate, set all public members /// - _ns1__GetAirportInformationByCountry::soap_default(soap*) reset members to default /// - int soap_read__ns1__GetAirportInformationByCountry(soap*, _ns1__GetAirportInformationByCountry*) deserialize from a stream /// - int soap_write__ns1__GetAirportInformationByCountry(soap*, _ns1__GetAirportInformationByCountry*) serialize to a stream /// - _ns1__GetAirportInformationByCountry* _ns1__GetAirportInformationByCountry::soap_dup(soap*) returns deep copy of _ns1__GetAirportInformationByCountry, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _ns1__GetAirportInformationByCountry::soap_del() deep deletes _ns1__GetAirportInformationByCountry data members, use only after _ns1__GetAirportInformationByCountry::soap_dup(NULL) (use soapcpp2 -Ed) class _ns1__GetAirportInformationByCountry { public: /// Element "country" of XSD type xs:string. std::string* country 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://www.webserviceX.NET":GetAirportInformationByCountryResponse /// @brief "http://www.webserviceX.NET":GetAirportInformationByCountryResponse is a complexType. /// /// class _ns1__GetAirportInformationByCountryResponse operations: /// - _ns1__GetAirportInformationByCountryResponse* soap_new__ns1__GetAirportInformationByCountryResponse(soap*) allocate /// - _ns1__GetAirportInformationByCountryResponse* soap_new__ns1__GetAirportInformationByCountryResponse(soap*, int num) allocate array /// - _ns1__GetAirportInformationByCountryResponse* soap_new_req__ns1__GetAirportInformationByCountryResponse(soap*, ...) allocate, set required members /// - _ns1__GetAirportInformationByCountryResponse* soap_new_set__ns1__GetAirportInformationByCountryResponse(soap*, ...) allocate, set all public members /// - _ns1__GetAirportInformationByCountryResponse::soap_default(soap*) reset members to default /// - int soap_read__ns1__GetAirportInformationByCountryResponse(soap*, _ns1__GetAirportInformationByCountryResponse*) deserialize from a stream /// - int soap_write__ns1__GetAirportInformationByCountryResponse(soap*, _ns1__GetAirportInformationByCountryResponse*) serialize to a stream /// - _ns1__GetAirportInformationByCountryResponse* _ns1__GetAirportInformationByCountryResponse::soap_dup(soap*) returns deep copy of _ns1__GetAirportInformationByCountryResponse, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _ns1__GetAirportInformationByCountryResponse::soap_del() deep deletes _ns1__GetAirportInformationByCountryResponse data members, use only after _ns1__GetAirportInformationByCountryResponse::soap_dup(NULL) (use soapcpp2 -Ed) class _ns1__GetAirportInformationByCountryResponse { public: /// Element "GetAirportInformationByCountryResult" of XSD type xs:string. std::string* GetAirportInformationByCountryResult 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://www.webserviceX.NET":getAirportInformationByAirportCode /// @brief "http://www.webserviceX.NET":getAirportInformationByAirportCode is a complexType. /// /// class _ns1__getAirportInformationByAirportCode operations: /// - _ns1__getAirportInformationByAirportCode* soap_new__ns1__getAirportInformationByAirportCode(soap*) allocate /// - _ns1__getAirportInformationByAirportCode* soap_new__ns1__getAirportInformationByAirportCode(soap*, int num) allocate array /// - _ns1__getAirportInformationByAirportCode* soap_new_req__ns1__getAirportInformationByAirportCode(soap*, ...) allocate, set required members /// - _ns1__getAirportInformationByAirportCode* soap_new_set__ns1__getAirportInformationByAirportCode(soap*, ...) allocate, set all public members /// - _ns1__getAirportInformationByAirportCode::soap_default(soap*) reset members to default /// - int soap_read__ns1__getAirportInformationByAirportCode(soap*, _ns1__getAirportInformationByAirportCode*) deserialize from a stream /// - int soap_write__ns1__getAirportInformationByAirportCode(soap*, _ns1__getAirportInformationByAirportCode*) serialize to a stream /// - _ns1__getAirportInformationByAirportCode* _ns1__getAirportInformationByAirportCode::soap_dup(soap*) returns deep copy of _ns1__getAirportInformationByAirportCode, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _ns1__getAirportInformationByAirportCode::soap_del() deep deletes _ns1__getAirportInformationByAirportCode data members, use only after _ns1__getAirportInformationByAirportCode::soap_dup(NULL) (use soapcpp2 -Ed) class _ns1__getAirportInformationByAirportCode { public: /// Element "airportCode" of XSD type xs:string. std::string* airportCode 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://www.webserviceX.NET":getAirportInformationByAirportCodeResponse /// @brief "http://www.webserviceX.NET":getAirportInformationByAirportCodeResponse is a complexType. /// /// class _ns1__getAirportInformationByAirportCodeResponse operations: /// - _ns1__getAirportInformationByAirportCodeResponse* soap_new__ns1__getAirportInformationByAirportCodeResponse(soap*) allocate /// - _ns1__getAirportInformationByAirportCodeResponse* soap_new__ns1__getAirportInformationByAirportCodeResponse(soap*, int num) allocate array /// - _ns1__getAirportInformationByAirportCodeResponse* soap_new_req__ns1__getAirportInformationByAirportCodeResponse(soap*, ...) allocate, set required members /// - _ns1__getAirportInformationByAirportCodeResponse* soap_new_set__ns1__getAirportInformationByAirportCodeResponse(soap*, ...) allocate, set all public members /// - _ns1__getAirportInformationByAirportCodeResponse::soap_default(soap*) reset members to default /// - int soap_read__ns1__getAirportInformationByAirportCodeResponse(soap*, _ns1__getAirportInformationByAirportCodeResponse*) deserialize from a stream /// - int soap_write__ns1__getAirportInformationByAirportCodeResponse(soap*, _ns1__getAirportInformationByAirportCodeResponse*) serialize to a stream /// - _ns1__getAirportInformationByAirportCodeResponse* _ns1__getAirportInformationByAirportCodeResponse::soap_dup(soap*) returns deep copy of _ns1__getAirportInformationByAirportCodeResponse, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _ns1__getAirportInformationByAirportCodeResponse::soap_del() deep deletes _ns1__getAirportInformationByAirportCodeResponse data members, use only after _ns1__getAirportInformationByAirportCodeResponse::soap_dup(NULL) (use soapcpp2 -Ed) class _ns1__getAirportInformationByAirportCodeResponse { public: /// Element "getAirportInformationByAirportCodeResult" of XSD type xs:string. std::string* getAirportInformationByAirportCodeResult 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /******************************************************************************\ * * * Additional Top-Level Elements * * http://www.webserviceX.NET * * * \******************************************************************************/ /// @brief Top-level root element "http://www.webserviceX.NET":string of XSD type xs:string. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /******************************************************************************\ * * * Additional Top-Level Attributes * * http://www.webserviceX.NET * * * \******************************************************************************/ /******************************************************************************\ * * * Services * * * \******************************************************************************/ // This service supports SOAP 1.2 namespaces: #import "soap12.h" //gsoap ns1 service name: airportSoap //gsoap ns1 service type: airportSoap //gsoap ns1 service port: http://www.webservicex.net/airport.asmx //gsoap ns1 service namespace: http://www.webserviceX.NET //gsoap ns1 service transport: http://schemas.xmlsoap.org/soap/http /** @mainpage Service Definitions @section Service_bindings Service Bindings - @ref airportSoap @section Service_more More Information - @ref page_notes "Notes" - @ref page_XMLDataBinding "XML Data Binding" - @ref SOAP_ENV__Header "SOAP Header Content" (when applicable) - @ref SOAP_ENV__Detail "SOAP Fault Detail Content" (when applicable) */ /** @page airportSoap Binding "airportSoap" @section airportSoap_operations Operations of Binding "airportSoap" - @ref __ns1__getAirportInformationByISOCountryCode - @ref __ns1__getAirportInformationByCityOrAirportName - @ref __ns1__GetAirportInformationByCountry - @ref __ns1__getAirportInformationByAirportCode - @ref __ns1__getAirportInformationByISOCountryCode_ - @ref __ns1__getAirportInformationByCityOrAirportName_ - @ref __ns1__GetAirportInformationByCountry_ - @ref __ns1__getAirportInformationByAirportCode_ @section airportSoap_ports Default endpoints of Binding "airportSoap" - http://www.webservicex.net/airport.asmx @note Multiple service bindings collected as one, use wsdl2h option -Nname to produce a separate service for each binding */ /******************************************************************************\ * * * Service Binding * * airportSoap * * * \******************************************************************************/ /******************************************************************************\ * * * Service Operation * * __ns1__getAirportInformationByISOCountryCode * * * \******************************************************************************/ /** Operation "__ns1__getAirportInformationByISOCountryCode" of service binding "airportSoap". Get Airport Code, CityOrAirport Name, Country, Country Abbrv, CountryCode,GMT Offset Runway Length in Feet, Runway Elevation in Feet,Latitude in Degree,Latitude in Minute Latitude in Second,Latitude in N/S, Longitude in Degree, Longitude in Minute, Longitude in Seconds and longitude E/W by ISO country code - SOAP document/literal style messaging - Default endpoints: - http://www.webservicex.net/airport.asmx - Default SOAP action or REST location path: - "http://www.webserviceX.NET/getAirportInformationByISOCountryCode" - Addressing input action: "http://www.webserviceX.NET/getAirportInformationByISOCountryCode" - Addressing output action: "http://www.webserviceX.NET/getAirportInformationByISOCountryCodeResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__getAirportInformationByISOCountryCode( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _ns1__getAirportInformationByISOCountryCode* ns1__getAirportInformationByISOCountryCode, // output parameters: _ns1__getAirportInformationByISOCountryCodeResponse&ns1__getAirportInformationByISOCountryCodeResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__getAirportInformationByISOCountryCode( struct soap *soap, // input parameters: _ns1__getAirportInformationByISOCountryCode* ns1__getAirportInformationByISOCountryCode, // output parameters: _ns1__getAirportInformationByISOCountryCodeResponse&ns1__getAirportInformationByISOCountryCodeResponse ); @endcode C++ proxy class (defined in soapairportSoapProxy.h generated with soapcpp2): @code class airportSoapProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapairportSoapService.h generated with soapcpp2): @code class airportSoapService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns1 service method-protocol: getAirportInformationByISOCountryCode SOAP //gsoap ns1 service method-style: getAirportInformationByISOCountryCode document //gsoap ns1 service method-encoding: getAirportInformationByISOCountryCode literal //gsoap ns1 service method-input-action: getAirportInformationByISOCountryCode http://www.webserviceX.NET/getAirportInformationByISOCountryCode //gsoap ns1 service method-output-action: getAirportInformationByISOCountryCode http://www.webserviceX.NET/getAirportInformationByISOCountryCodeResponse int __ns1__getAirportInformationByISOCountryCode( _ns1__getAirportInformationByISOCountryCode* ns1__getAirportInformationByISOCountryCode, ///< Input parameter _ns1__getAirportInformationByISOCountryCodeResponse&ns1__getAirportInformationByISOCountryCodeResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __ns1__getAirportInformationByCityOrAirportName * * * \******************************************************************************/ /** Operation "__ns1__getAirportInformationByCityOrAirportName" of service binding "airportSoap". Get Airport Code, CityOrAirport Name, Country, Country Abbrv, CountryCode,GMT Offset Runway Length in Feet, Runway Elevation in Feet,Latitude in Degree,Latitude in Minute Latitude in Second,Latitude in N/S, Longitude in Degree, Longitude in Minute, Longitude in Seconds and longitude E/W by city or airport name - SOAP document/literal style messaging - Default endpoints: - http://www.webservicex.net/airport.asmx - Default SOAP action or REST location path: - "http://www.webserviceX.NET/getAirportInformationByCityOrAirportName" - Addressing input action: "http://www.webserviceX.NET/getAirportInformationByCityOrAirportName" - Addressing output action: "http://www.webserviceX.NET/getAirportInformationByCityOrAirportNameResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__getAirportInformationByCityOrAirportName( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _ns1__getAirportInformationByCityOrAirportName* ns1__getAirportInformationByCityOrAirportName, // output parameters: _ns1__getAirportInformationByCityOrAirportNameResponse&ns1__getAirportInformationByCityOrAirportNameResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__getAirportInformationByCityOrAirportName( struct soap *soap, // input parameters: _ns1__getAirportInformationByCityOrAirportName* ns1__getAirportInformationByCityOrAirportName, // output parameters: _ns1__getAirportInformationByCityOrAirportNameResponse&ns1__getAirportInformationByCityOrAirportNameResponse ); @endcode C++ proxy class (defined in soapairportSoapProxy.h generated with soapcpp2): @code class airportSoapProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapairportSoapService.h generated with soapcpp2): @code class airportSoapService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns1 service method-protocol: getAirportInformationByCityOrAirportName SOAP //gsoap ns1 service method-style: getAirportInformationByCityOrAirportName document //gsoap ns1 service method-encoding: getAirportInformationByCityOrAirportName literal //gsoap ns1 service method-input-action: getAirportInformationByCityOrAirportName http://www.webserviceX.NET/getAirportInformationByCityOrAirportName //gsoap ns1 service method-output-action: getAirportInformationByCityOrAirportName http://www.webserviceX.NET/getAirportInformationByCityOrAirportNameResponse int __ns1__getAirportInformationByCityOrAirportName( _ns1__getAirportInformationByCityOrAirportName* ns1__getAirportInformationByCityOrAirportName, ///< Input parameter _ns1__getAirportInformationByCityOrAirportNameResponse&ns1__getAirportInformationByCityOrAirportNameResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __ns1__GetAirportInformationByCountry * * * \******************************************************************************/ /** Operation "__ns1__GetAirportInformationByCountry" of service binding "airportSoap". Get Airport Code, CityOrAirport Name, Country, Country Abbrv, CountryCode,GMT Offset Runway Length in Feet, Runway Elevation in Feet,Latitude in Degree,Latitude in Minute Latitude in Second,Latitude in N/S, Longitude in Degree, Longitude in Minute, Longitude in Seconds and longitude E/W by country name - SOAP document/literal style messaging - Default endpoints: - http://www.webservicex.net/airport.asmx - Default SOAP action or REST location path: - "http://www.webserviceX.NET/GetAirportInformationByCountry" - Addressing input action: "http://www.webserviceX.NET/GetAirportInformationByCountry" - Addressing output action: "http://www.webserviceX.NET/GetAirportInformationByCountryResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__GetAirportInformationByCountry( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _ns1__GetAirportInformationByCountry* ns1__GetAirportInformationByCountry, // output parameters: _ns1__GetAirportInformationByCountryResponse&ns1__GetAirportInformationByCountryResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__GetAirportInformationByCountry( struct soap *soap, // input parameters: _ns1__GetAirportInformationByCountry* ns1__GetAirportInformationByCountry, // output parameters: _ns1__GetAirportInformationByCountryResponse&ns1__GetAirportInformationByCountryResponse ); @endcode C++ proxy class (defined in soapairportSoapProxy.h generated with soapcpp2): @code class airportSoapProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapairportSoapService.h generated with soapcpp2): @code class airportSoapService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns1 service method-protocol: GetAirportInformationByCountry SOAP //gsoap ns1 service method-style: GetAirportInformationByCountry document //gsoap ns1 service method-encoding: GetAirportInformationByCountry literal //gsoap ns1 service method-input-action: GetAirportInformationByCountry http://www.webserviceX.NET/GetAirportInformationByCountry //gsoap ns1 service method-output-action: GetAirportInformationByCountry http://www.webserviceX.NET/GetAirportInformationByCountryResponse int __ns1__GetAirportInformationByCountry( _ns1__GetAirportInformationByCountry* ns1__GetAirportInformationByCountry, ///< Input parameter _ns1__GetAirportInformationByCountryResponse&ns1__GetAirportInformationByCountryResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __ns1__getAirportInformationByAirportCode * * * \******************************************************************************/ /** Operation "__ns1__getAirportInformationByAirportCode" of service binding "airportSoap". Get Airport Code, CityOrAirport Name, Country, Country Abbrv, CountryCode,GMT Offset Runway Length in Feet, Runway Elevation in Feet,Latitude in Degree,Latitude in Minute Latitude in Second,Latitude in N/S, Longitude in Degree, Longitude in Minute, Longitude in Seconds and longitude E/W by airport code - SOAP document/literal style messaging - Default endpoints: - http://www.webservicex.net/airport.asmx - Default SOAP action or REST location path: - "http://www.webserviceX.NET/getAirportInformationByAirportCode" - Addressing input action: "http://www.webserviceX.NET/getAirportInformationByAirportCode" - Addressing output action: "http://www.webserviceX.NET/getAirportInformationByAirportCodeResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__getAirportInformationByAirportCode( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _ns1__getAirportInformationByAirportCode* ns1__getAirportInformationByAirportCode, // output parameters: _ns1__getAirportInformationByAirportCodeResponse&ns1__getAirportInformationByAirportCodeResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__getAirportInformationByAirportCode( struct soap *soap, // input parameters: _ns1__getAirportInformationByAirportCode* ns1__getAirportInformationByAirportCode, // output parameters: _ns1__getAirportInformationByAirportCodeResponse&ns1__getAirportInformationByAirportCodeResponse ); @endcode C++ proxy class (defined in soapairportSoapProxy.h generated with soapcpp2): @code class airportSoapProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapairportSoapService.h generated with soapcpp2): @code class airportSoapService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns1 service method-protocol: getAirportInformationByAirportCode SOAP //gsoap ns1 service method-style: getAirportInformationByAirportCode document //gsoap ns1 service method-encoding: getAirportInformationByAirportCode literal //gsoap ns1 service method-input-action: getAirportInformationByAirportCode http://www.webserviceX.NET/getAirportInformationByAirportCode //gsoap ns1 service method-output-action: getAirportInformationByAirportCode http://www.webserviceX.NET/getAirportInformationByAirportCodeResponse int __ns1__getAirportInformationByAirportCode( _ns1__getAirportInformationByAirportCode* ns1__getAirportInformationByAirportCode, ///< Input parameter _ns1__getAirportInformationByAirportCodeResponse&ns1__getAirportInformationByAirportCodeResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __ns1__getAirportInformationByISOCountryCode_ * * * \******************************************************************************/ /** Operation "__ns1__getAirportInformationByISOCountryCode_" of service binding "airportSoap". Get Airport Code, CityOrAirport Name, Country, Country Abbrv, CountryCode,GMT Offset Runway Length in Feet, Runway Elevation in Feet,Latitude in Degree,Latitude in Minute Latitude in Second,Latitude in N/S, Longitude in Degree, Longitude in Minute, Longitude in Seconds and longitude E/W by ISO country code - SOAP document/literal style messaging - Default endpoints: - http://www.webservicex.net/airport.asmx - Default SOAP action or REST location path: - "http://www.webserviceX.NET/getAirportInformationByISOCountryCode" - Addressing input action: "http://www.webserviceX.NET/getAirportInformationByISOCountryCode" - Addressing output action: "http://www.webserviceX.NET/getAirportInformationByISOCountryCodeResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__getAirportInformationByISOCountryCode_( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _ns1__getAirportInformationByISOCountryCode* ns1__getAirportInformationByISOCountryCode, // output parameters: _ns1__getAirportInformationByISOCountryCodeResponse&ns1__getAirportInformationByISOCountryCodeResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__getAirportInformationByISOCountryCode_( struct soap *soap, // input parameters: _ns1__getAirportInformationByISOCountryCode* ns1__getAirportInformationByISOCountryCode, // output parameters: _ns1__getAirportInformationByISOCountryCodeResponse&ns1__getAirportInformationByISOCountryCodeResponse ); @endcode C++ proxy class (defined in soapairportSoapProxy.h generated with soapcpp2): @code class airportSoapProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapairportSoapService.h generated with soapcpp2): @code class airportSoapService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns1 service method-protocol: getAirportInformationByISOCountryCode_ SOAP //gsoap ns1 service method-style: getAirportInformationByISOCountryCode_ document //gsoap ns1 service method-encoding: getAirportInformationByISOCountryCode_ literal //gsoap ns1 service method-input-action: getAirportInformationByISOCountryCode_ http://www.webserviceX.NET/getAirportInformationByISOCountryCode //gsoap ns1 service method-output-action: getAirportInformationByISOCountryCode_ http://www.webserviceX.NET/getAirportInformationByISOCountryCodeResponse int __ns1__getAirportInformationByISOCountryCode_( _ns1__getAirportInformationByISOCountryCode* ns1__getAirportInformationByISOCountryCode, ///< Input parameter _ns1__getAirportInformationByISOCountryCodeResponse&ns1__getAirportInformationByISOCountryCodeResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __ns1__getAirportInformationByCityOrAirportName_ * * * \******************************************************************************/ /** Operation "__ns1__getAirportInformationByCityOrAirportName_" of service binding "airportSoap". Get Airport Code, CityOrAirport Name, Country, Country Abbrv, CountryCode,GMT Offset Runway Length in Feet, Runway Elevation in Feet,Latitude in Degree,Latitude in Minute Latitude in Second,Latitude in N/S, Longitude in Degree, Longitude in Minute, Longitude in Seconds and longitude E/W by city or airport name - SOAP document/literal style messaging - Default endpoints: - http://www.webservicex.net/airport.asmx - Default SOAP action or REST location path: - "http://www.webserviceX.NET/getAirportInformationByCityOrAirportName" - Addressing input action: "http://www.webserviceX.NET/getAirportInformationByCityOrAirportName" - Addressing output action: "http://www.webserviceX.NET/getAirportInformationByCityOrAirportNameResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__getAirportInformationByCityOrAirportName_( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _ns1__getAirportInformationByCityOrAirportName* ns1__getAirportInformationByCityOrAirportName, // output parameters: _ns1__getAirportInformationByCityOrAirportNameResponse&ns1__getAirportInformationByCityOrAirportNameResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__getAirportInformationByCityOrAirportName_( struct soap *soap, // input parameters: _ns1__getAirportInformationByCityOrAirportName* ns1__getAirportInformationByCityOrAirportName, // output parameters: _ns1__getAirportInformationByCityOrAirportNameResponse&ns1__getAirportInformationByCityOrAirportNameResponse ); @endcode C++ proxy class (defined in soapairportSoapProxy.h generated with soapcpp2): @code class airportSoapProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapairportSoapService.h generated with soapcpp2): @code class airportSoapService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns1 service method-protocol: getAirportInformationByCityOrAirportName_ SOAP //gsoap ns1 service method-style: getAirportInformationByCityOrAirportName_ document //gsoap ns1 service method-encoding: getAirportInformationByCityOrAirportName_ literal //gsoap ns1 service method-input-action: getAirportInformationByCityOrAirportName_ http://www.webserviceX.NET/getAirportInformationByCityOrAirportName //gsoap ns1 service method-output-action: getAirportInformationByCityOrAirportName_ http://www.webserviceX.NET/getAirportInformationByCityOrAirportNameResponse int __ns1__getAirportInformationByCityOrAirportName_( _ns1__getAirportInformationByCityOrAirportName* ns1__getAirportInformationByCityOrAirportName, ///< Input parameter _ns1__getAirportInformationByCityOrAirportNameResponse&ns1__getAirportInformationByCityOrAirportNameResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __ns1__GetAirportInformationByCountry_ * * * \******************************************************************************/ /** Operation "__ns1__GetAirportInformationByCountry_" of service binding "airportSoap". Get Airport Code, CityOrAirport Name, Country, Country Abbrv, CountryCode,GMT Offset Runway Length in Feet, Runway Elevation in Feet,Latitude in Degree,Latitude in Minute Latitude in Second,Latitude in N/S, Longitude in Degree, Longitude in Minute, Longitude in Seconds and longitude E/W by country name - SOAP document/literal style messaging - Default endpoints: - http://www.webservicex.net/airport.asmx - Default SOAP action or REST location path: - "http://www.webserviceX.NET/GetAirportInformationByCountry" - Addressing input action: "http://www.webserviceX.NET/GetAirportInformationByCountry" - Addressing output action: "http://www.webserviceX.NET/GetAirportInformationByCountryResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__GetAirportInformationByCountry_( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _ns1__GetAirportInformationByCountry* ns1__GetAirportInformationByCountry, // output parameters: _ns1__GetAirportInformationByCountryResponse&ns1__GetAirportInformationByCountryResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__GetAirportInformationByCountry_( struct soap *soap, // input parameters: _ns1__GetAirportInformationByCountry* ns1__GetAirportInformationByCountry, // output parameters: _ns1__GetAirportInformationByCountryResponse&ns1__GetAirportInformationByCountryResponse ); @endcode C++ proxy class (defined in soapairportSoapProxy.h generated with soapcpp2): @code class airportSoapProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapairportSoapService.h generated with soapcpp2): @code class airportSoapService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns1 service method-protocol: GetAirportInformationByCountry_ SOAP //gsoap ns1 service method-style: GetAirportInformationByCountry_ document //gsoap ns1 service method-encoding: GetAirportInformationByCountry_ literal //gsoap ns1 service method-input-action: GetAirportInformationByCountry_ http://www.webserviceX.NET/GetAirportInformationByCountry //gsoap ns1 service method-output-action: GetAirportInformationByCountry_ http://www.webserviceX.NET/GetAirportInformationByCountryResponse int __ns1__GetAirportInformationByCountry_( _ns1__GetAirportInformationByCountry* ns1__GetAirportInformationByCountry, ///< Input parameter _ns1__GetAirportInformationByCountryResponse&ns1__GetAirportInformationByCountryResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __ns1__getAirportInformationByAirportCode_ * * * \******************************************************************************/ /** Operation "__ns1__getAirportInformationByAirportCode_" of service binding "airportSoap". Get Airport Code, CityOrAirport Name, Country, Country Abbrv, CountryCode,GMT Offset Runway Length in Feet, Runway Elevation in Feet,Latitude in Degree,Latitude in Minute Latitude in Second,Latitude in N/S, Longitude in Degree, Longitude in Minute, Longitude in Seconds and longitude E/W by airport code - SOAP document/literal style messaging - Default endpoints: - http://www.webservicex.net/airport.asmx - Default SOAP action or REST location path: - "http://www.webserviceX.NET/getAirportInformationByAirportCode" - Addressing input action: "http://www.webserviceX.NET/getAirportInformationByAirportCode" - Addressing output action: "http://www.webserviceX.NET/getAirportInformationByAirportCodeResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__getAirportInformationByAirportCode_( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _ns1__getAirportInformationByAirportCode* ns1__getAirportInformationByAirportCode, // output parameters: _ns1__getAirportInformationByAirportCodeResponse&ns1__getAirportInformationByAirportCodeResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__getAirportInformationByAirportCode_( struct soap *soap, // input parameters: _ns1__getAirportInformationByAirportCode* ns1__getAirportInformationByAirportCode, // output parameters: _ns1__getAirportInformationByAirportCodeResponse&ns1__getAirportInformationByAirportCodeResponse ); @endcode C++ proxy class (defined in soapairportSoapProxy.h generated with soapcpp2): @code class airportSoapProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapairportSoapService.h generated with soapcpp2): @code class airportSoapService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns1 service method-protocol: getAirportInformationByAirportCode_ SOAP //gsoap ns1 service method-style: getAirportInformationByAirportCode_ document //gsoap ns1 service method-encoding: getAirportInformationByAirportCode_ literal //gsoap ns1 service method-input-action: getAirportInformationByAirportCode_ http://www.webserviceX.NET/getAirportInformationByAirportCode //gsoap ns1 service method-output-action: getAirportInformationByAirportCode_ http://www.webserviceX.NET/getAirportInformationByAirportCodeResponse int __ns1__getAirportInformationByAirportCode_( _ns1__getAirportInformationByAirportCode* ns1__getAirportInformationByAirportCode, ///< Input parameter _ns1__getAirportInformationByAirportCodeResponse&ns1__getAirportInformationByAirportCodeResponse ///< Output parameter ); /** @page airportSoap Binding "airportSoap" @section airportSoap_policy_enablers Policy Enablers of Binding "airportSoap" None specified. */ /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. Data can be read and deserialized from: - an int file descriptor, using soap->recvfd = fd - a socket, using soap->socket = (int)... - a C++ stream (istream, stringstream), using soap->is = (istream*)... - a C string, using soap->is = (const char*)... - any input, using the soap->frecv() callback Data can be serialized and written to: - an int file descriptor, using soap->sendfd = (int)... - a socket, using soap->socket = (int)... - a C++ stream (ostream, stringstream), using soap->os = (ostream*)... - a C string, using soap->os = (const char**)... - any output, using the soap->fsend() callback The following options are available for (de)serialization control: - soap->encodingStyle = NULL; to remove SOAP 1.1/1.2 encodingStyle - soap_mode(soap, SOAP_XML_TREE); XML without id-ref (no cycles!) - soap_mode(soap, SOAP_XML_GRAPH); XML with id-ref (including cycles) - soap_set_namespaces(soap, struct Namespace *nsmap); to set xmlns bindings @section ns1 Top-level root elements of schema "http://www.webserviceX.NET" - @ref _ns1__getAirportInformationByISOCountryCode @code // Reader (returns SOAP_OK on success): soap_read__ns1__getAirportInformationByISOCountryCode(struct soap*, _ns1__getAirportInformationByISOCountryCode*); // Writer (returns SOAP_OK on success): soap_write__ns1__getAirportInformationByISOCountryCode(struct soap*, _ns1__getAirportInformationByISOCountryCode*); @endcode - @ref _ns1__getAirportInformationByISOCountryCodeResponse @code // Reader (returns SOAP_OK on success): soap_read__ns1__getAirportInformationByISOCountryCodeResponse(struct soap*, _ns1__getAirportInformationByISOCountryCodeResponse*); // Writer (returns SOAP_OK on success): soap_write__ns1__getAirportInformationByISOCountryCodeResponse(struct soap*, _ns1__getAirportInformationByISOCountryCodeResponse*); @endcode - @ref _ns1__getAirportInformationByCityOrAirportName @code // Reader (returns SOAP_OK on success): soap_read__ns1__getAirportInformationByCityOrAirportName(struct soap*, _ns1__getAirportInformationByCityOrAirportName*); // Writer (returns SOAP_OK on success): soap_write__ns1__getAirportInformationByCityOrAirportName(struct soap*, _ns1__getAirportInformationByCityOrAirportName*); @endcode - @ref _ns1__getAirportInformationByCityOrAirportNameResponse @code // Reader (returns SOAP_OK on success): soap_read__ns1__getAirportInformationByCityOrAirportNameResponse(struct soap*, _ns1__getAirportInformationByCityOrAirportNameResponse*); // Writer (returns SOAP_OK on success): soap_write__ns1__getAirportInformationByCityOrAirportNameResponse(struct soap*, _ns1__getAirportInformationByCityOrAirportNameResponse*); @endcode - @ref _ns1__GetAirportInformationByCountry @code // Reader (returns SOAP_OK on success): soap_read__ns1__GetAirportInformationByCountry(struct soap*, _ns1__GetAirportInformationByCountry*); // Writer (returns SOAP_OK on success): soap_write__ns1__GetAirportInformationByCountry(struct soap*, _ns1__GetAirportInformationByCountry*); @endcode - @ref _ns1__GetAirportInformationByCountryResponse @code // Reader (returns SOAP_OK on success): soap_read__ns1__GetAirportInformationByCountryResponse(struct soap*, _ns1__GetAirportInformationByCountryResponse*); // Writer (returns SOAP_OK on success): soap_write__ns1__GetAirportInformationByCountryResponse(struct soap*, _ns1__GetAirportInformationByCountryResponse*); @endcode - @ref _ns1__getAirportInformationByAirportCode @code // Reader (returns SOAP_OK on success): soap_read__ns1__getAirportInformationByAirportCode(struct soap*, _ns1__getAirportInformationByAirportCode*); // Writer (returns SOAP_OK on success): soap_write__ns1__getAirportInformationByAirportCode(struct soap*, _ns1__getAirportInformationByAirportCode*); @endcode - @ref _ns1__getAirportInformationByAirportCodeResponse @code // Reader (returns SOAP_OK on success): soap_read__ns1__getAirportInformationByAirportCodeResponse(struct soap*, _ns1__getAirportInformationByAirportCodeResponse*); // Writer (returns SOAP_OK on success): soap_write__ns1__getAirportInformationByAirportCodeResponse(struct soap*, _ns1__getAirportInformationByAirportCodeResponse*); @endcode - (use wsdl2h option -g to auto-generate type _ns1__string) */ /* End of airport.h */ gsoap-2.8.91/gsoap/ios_plugin/examples/calc/0000755000175000017500000000000013525564140020272 5ustar ellertellertgsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/0000755000175000017500000000000013525564140021174 5ustar ellertellertgsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/calc/0000755000175000017500000000000013525564140022076 5ustar ellertellertgsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/calc/main.mm0000644000175000017500000000041013525245161023347 0ustar ellertellert// // main.m // #import #include "AppDelegate.h" #include "../../calc.nsmap" int main(int argc, char * argv[]) { @autoreleasepool { int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate"); return retVal; } } gsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/calc/ViewController.mm0000644000175000017500000000432513525245161025412 0ustar ellertellert// //ViewController.mm // #import "ViewController.h" #import "soapStub.h" #import "gsoapios.h" @implementation ViewController @synthesize op1; // Set or get opreand1 @synthesize op2; // Set or get opreand1 - (IBAction)buttonPressed:(id)sender { } - (IBAction) buttonPressed { double x = [op1.text doubleValue]; double y = [op2.text doubleValue]; struct soap *soap = soap_new1(SOAP_IO_DEFAULT|SOAP_IO_KEEPALIVE|SOAP_XML_INDENT|SOAP_XML_STRICT); if (soap_register_plugin(soap, soap_ios) == SOAP_OK) { // Specify the timeout interval (optional) to 45 seconds instead of // the default 60 seconds soap_ios_settimeoutinterval(soap, 45.0); double result; // Call Web service operation add int status = soap_call_ns2__add(soap, NULL, NULL,x, y, result); soap_free_temp(soap); // Cleanup temporary resources // Check soap response status if (status == SOAP_OK) { NSString *resultString; NSString *titleString; resultString = [NSString stringWithFormat:@"%f",result]; titleString = [NSString stringWithFormat:@"%f + %f =",x, y]; // Show the result in an alert UIAlertController * alert = [UIAlertController alertControllerWithTitle:titleString message:resultString preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction* cancelButton = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action){}]; [alert addAction: cancelButton]; [self presentViewController:alert animated:YES completion:nil]; } else { // Caveat: Better to extract the error message and show it using an alert soap_print_fault(soap,stderr); // Print soap error in console } } soap_destroy(soap); soap_end(soap); soap_free(soap); } @end gsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/calc/AppDelegate.mm0000644000175000017500000000365713525245161024616 0ustar ellertellert// //AppDelegate.mm // #import "AppDelegate.h" #import "ViewController.h" @implementation AppDelegate @synthesize window; @synthesize viewController; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. return YES; } - (void)applicationWillResignActive:(UIApplication *)application { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. } - (void)applicationDidEnterBackground:(UIApplication *)application { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. } - (void)applicationWillEnterForeground:(UIApplication *)application { // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. } - (void)applicationDidBecomeActive:(UIApplication *)application { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. } - (void)applicationWillTerminate:(UIApplication *)application { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } @end gsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/calc/Assets.xcassets/0000755000175000017500000000000013525245161025173 5ustar ellertellertgsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/calc/Assets.xcassets/AppIcon.appiconset/0000755000175000017500000000000013525245161030670 5ustar ellertellert././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/calc/Assets.xcassets/AppIcon.appiconset/Contents.jsongsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/calc/Assets.xcassets/AppIcon.appiconset/Contents.js0000644000175000017500000000111113525245161033015 0ustar ellertellert{ "images" : [ { "idiom" : "iphone", "size" : "29x29", "scale" : "2x" }, { "idiom" : "iphone", "size" : "29x29", "scale" : "3x" }, { "idiom" : "iphone", "size" : "40x40", "scale" : "2x" }, { "idiom" : "iphone", "size" : "40x40", "scale" : "3x" }, { "idiom" : "iphone", "size" : "60x60", "scale" : "2x" }, { "idiom" : "iphone", "size" : "60x60", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } }gsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/calc/ViewController.h0000644000175000017500000000051113525245161025221 0ustar ellertellert// // File: ViewController.h // #import @interface ViewController : UIViewController { UITextField *op1; // operand1 UITextField *op2; // operand2 } @property (nonatomic, retain) IBOutlet UITextField *op1; @property (nonatomic, retain) IBOutlet UITextField *op2; - (IBAction) buttonPressed; @end gsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/calc/Base.lproj/0000755000175000017500000000000013525245161024074 5ustar ellertellertgsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/calc/Base.lproj/Main.storyboard0000644000175000017500000001522213525245161027074 0ustar ellertellert gsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/calc/Base.lproj/LaunchScreen.storyboard0000644000175000017500000000320113525245161030554 0ustar ellertellert gsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/calc/Info.plist0000644000175000017500000000245413525245161024052 0ustar ellertellert NSAppTransportSecurity NSAllowsArbitraryLoads CFBundleDevelopmentRegion en CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1 LSRequiresIPhoneOS UILaunchStoryboardName LaunchScreen UIMainStoryboardFile Main UIRequiredDeviceCapabilities armv7 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight gsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/calc/AppDelegate.h0000644000175000017500000000050213525245161024416 0ustar ellertellert// //AppDelegate.h // #import @class ViewController; @interface AppDelegate : UIResponder { UIWindow *window; ViewController *viewController; } @property (strong, nonatomic) UIWindow *window; @property (nonatomic, retain) IBOutlet ViewController *viewController; @end gsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/Calc.xcodeproj/0000755000175000017500000000000013525245161024031 5ustar ellertellertgsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/Calc.xcodeproj/project.xcworkspace/0000755000175000017500000000000013525245161030027 5ustar ellertellert././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/Calc.xcodeproj/project.xcworkspace/contents.xcworkspacedatagsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/Calc.xcodeproj/project.xcworkspace/contents.xcworks0000644000175000017500000000022513525245161033305 0ustar ellertellert gsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/Calc.xcodeproj/project.xcworkspace/xcuserdata/0000755000175000017500000000000013525245161032172 5ustar ellertellert././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/Calc.xcodeproj/project.xcworkspace/xcuserdata/bethanysanders.xcuserdatad/gsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/Calc.xcodeproj/project.xcworkspace/xcuserdata/betha0000755000175000017500000000000013525245161033176 5ustar ellertellert././@LongLink0000644000000000000000000000023100000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/Calc.xcodeproj/project.xcworkspace/xcuserdata/bethanysanders.xcuserdatad/UserInterfaceState.xcuserstategsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/Calc.xcodeproj/project.xcworkspace/xcuserdata/betha0000644000175000017500000014744013525245161033212 0ustar ellertellertbplist00X$versionX$objectsY$archiverT$top*+,-./01237=QRSTUVWXYopqrstuvwx!"'/019:;?EJRST\]ghijz{|}~ !"#$%&'()*+,  !"&'+,0156:;?@DEIJNOSTXY]^bcghlmqrvw#$%&234@ABCDEFGSTUVWXYZfghtuvw !-./;<=IJKLXYZfghiuvw&'(456<@AIJKLSZ[\]dels )*+,-.89:;EFGHRSTU_`ablmnopqr|}~ !"#$./019=>BCQRSTUVZ[\bcdpqrstuy}         ! $ ( , 6 @ A B C G H I N Q U _ ` a b f i j t x y ~             " & , - . 8 9 : ; < = A E J K W X Y Z [ a f n o p q y z               / 3 4 8 9 = > B C G H L M Q R V W _ ` a b c k l t u }       " & ' + , 0 1 5 6 : ; ? @ D E I J \ ] ^ _ ` a b c d h           $ 6 7 8 9 : ; < = C G K Q R Z [ ^ c f i o p t '()*+,-237ABIOPTXY]abcghnt|  $()-./378=BHIMQRSW\`fgmw{  !"#$(,-7;MYZ[\bhlmnrvz{|U$null WNS.keysZNS.objectsV$class 8_$A6F45CC1-51E1-4478-B40B-C3F150F5F66A_IDEWorkspaceDocument_$10CD2DED-2F61-414C-95F4-BC537FDF4FF8 !)  "#$ "(  4_IDEWindowTabBarIsVisible^IDEWindowFrame_!IDEOrderedWorkspaceTabControllers_,IDEWorkspaceWindowControllerUniqueIdentifier_IDEActiveWorkspaceTabController_IDEWindowToolbarIsVisible_>IDEWorkspaceTabController_A7B97E09-4A19-4D28-83E2-5533C554FDA8_{{9, 89}, {800, 788}} 46 89:;Z$classnameX$classesWNSArray:G)?@ABCDEFH"JKL"NO ^e 54]IDEEditorArea_IDEShowNavigator_-IDEWorkspaceTabControllerUtilityAreaSplitView_IDENavigatorArea_,IDEWorkspaceTabControllerDesignAreaSplitView_IDEShowUtilities^IDETabFilePath_AssistantEditorsLayout Zd)[\]^_`abc !"#efgOOjkl"$*955:T] 4ZlayoutTree_IDEEditorMode_Standard]IDEShowEditor_VersionEditorSubmodeZEditorMode_IDEDefaultDebugArea_DebuggerSplitView_ DefaultPersistentRepresentations_ShowDebuggerAreayz{ |}~_rootLayoutTreeNode_geniusEditorContextNode_primaryEditorContextNode&%) }|}XchildrenVparent[contentType_ documentArchivableRepresentation[orientation&( }}'( 6~%89_'IDEWorkspaceTabControllerLayoutTreeNode<_'IDEWorkspaceTabControllerLayoutTreeNode89_#IDEWorkspaceTabControllerLayoutTree<_#IDEWorkspaceTabControllerLayoutTree )+,4_%EditorLayout_PersistentRepresentation )-.4TMain /01O2568_)EditorLayout_StateSavingStateDictionaries_EditorLayout_Selected_EditorLayout_Geometry 63 )489_NSMutableDictionary<\NSDictionary 6ƀ7_{{0, 0}, {800, 766}}89ʢ< )р;<=>ր?EQR4XLeftView_IDESplitViewDebugAreaZLayoutModeYRightView )@ABC"Og 5D94_VariablesViewShowsRawValues_VariablesViewSelectedScope_ VariablesViewViewSortDescriptors_VariablesViewShowsType 6 )FG4_DVTSplitViewItems HMP IJKL8]DVTIdentifier_DVTViewMagnitudeXLeftView#@y  IJ  NO8YRightView#@x89^NSMutableArray:< )SO54_ConsoleFilterMode )UV4_DVTSplitViewItems #$%WZP (+IJ,-XY8YIDEEditor#@i` 25IJ67[\8_IDEDebuggerArea#@\ <=)4 @B)FC_4 FGH`cP KNIJOPab8P#@ UXIJOZad8#@= ^b)_`afghcdeist4_Xcode.IDEKit.Navigator.Logs_SelectedNavigator_ Xcode.IDEKit.Navigator.Structure kr)lmnopqjklmno"t"v"x p q r4_ IDELogNavigatorBotFilterStateKey_collapsedIdentifiers_IDELogNavigatorGroupByKey_expandedIdentifiers_#IDELogNavigatorRecentFilterStateKey_"IDELogNavigatorVisibleRectStateKey P P_{{0, 0}, {259, 753}}_ Xcode.IDEKit.Navigator.Structure )uvwxyz""{~ 4_IDEExpandedItemsTree^IDEVisibleRect_IDESelectedTree_!IDERecentDocumentFilteringEnabled_,IDENavigatorExpandedItemsBeforeFilteringTree_IDESCMStatusFilteringEnabled |}8_IDEValuesAsTree )4_{{0, 0}, {0, 0}} |8 )4 |8 )4 )F€4 ȀP IJЀ8_IDENavigatorArea#@p@ IJڀ8]IDEEditorArea#@` IJЀ8_IDEUtilitiesArea_=/Users/bethanysanders/Documents/work/calc/calc/Calc.xcodeproj )񀏀g9ADRr4_BreakpointsActivated_DefaultEditorStatesForURLs\ActiveScheme_ActiveRunDestination_DefaultEditorFrameSizeForURLs_0LastCompletedPersistentSchemeBasedActivityReport_DocumentWindows_RecentEditorDocumentURLs )     ǁׁOhсہ34_&Xcode.IDEKit.EditorDocument.SourceCode_0Xcode.IDEKit.EditorDocument.ViewDebuggerDocument_6Xcode.IDEKit.EditorDocument.SourceCodeComparisonEditor_1Xcode.IDEKit.EditorDocument.SourceCode-from-Plist_7Xcode.IDEKit.InterfaceBuilder.EditorDocument.Storyboard_9Xcode.IDEKit.EditorDocument.SourceCode-from-Xcode3Project_9Xcode.IDEKit.EditorDocument.SourceCode-from-Asset-Catalog_(Xcode.IDEKit.EditorDocument.AssetCatalog_'Xcode.IDEKit.EditorDocument.PlistEditor_IDEQuickLookEditor.Editor_7Xcode.Xcode3ProjectSupport.EditorDocument.Xcode3Project_.Xcode.IDEKit.EditorDocument.SourceCode-from-IB -\)../0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[€ĀƀȀʀ̀΀ЀҀԀր؀ڀ܀ހ.]^_`abcdefghijklmnopqrstuvwxyz{|}~ !$'*-48;CKNRUX`hknvz}Ā4 }WNS.base[NS.relative_Efile:///Users/bethanysanders/Documents/work/calc/calc/calc/Info.plist89UNSURL< }_Wfile:///Users/bethanysanders/Downloads/gsoap-2.8/gsoap/ios_plugin/ios_plugin/gsoapios.m }_~x-xcode-disassembly://stack_frame?launchSessionRef=7fb15493d7a0&stackFrameHash=14783566117410356837&stackFrameRef=7fb1712c6ea0 }_}x-xcode-disassembly://stack_frame?launchSessionRef=7fb15493d7a0&stackFrameHash=7772002701374407618&stackFrameRef=7fb15543f310 }_:file:///Users/bethanysanders/Documents/work/calc/soapC.cpp }_}x-xcode-disassembly://stack_frame?launchSessionRef=7fb15493d7a0&stackFrameHash=7772002701374407618&stackFrameRef=7fb155c32680 }_Afile:///Users/bethanysanders/Documents/work/calc/calc/calc/main.m }_~x-xcode-disassembly://stack_frame?launchSessionRef=7fb15493d7a0&stackFrameHash=14783566117410356837&stackFrameRef=7fb155c63bf0 }_Kfile:///Users/bethanysanders/Documents/work/calc/calc/calc/ViewController.m }_Bfile:///Users/bethanysanders/Documents/work/calc/calc/calc/main.mm }ƀ_Hfile:///Users/bethanysanders/Documents/work/calc/calc/calc/calc_Prefix.h }ˀ_;file:///Users/bethanysanders/Documents/work/calc/calc.nsmap }Ѐ_=file:///Users/bethanysanders/Documents/work/calc/calc.nsmap.h }Հ_file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIButton.h }ڀ_~x-xcode-disassembly://stack_frame?launchSessionRef=7fb15493d7a0&stackFrameHash=14783566117410356837&stackFrameRef=7fb1559cb3b0 }߀_Pfile:///Users/bethanysanders/Documents/work/calc/calc/calcUITests/calcUITests.mm }_}x-xcode-disassembly://stack_frame?launchSessionRef=7fb15493d7a0&stackFrameHash=7772002701374407618&stackFrameRef=7fb152a54250 }_Kfile:///Users/bethanysanders/Documents/work/calc/calc/calcTests/calcTests.m }_?file:///Users/bethanysanders/Documents/work/calc/soapClient.cpp }_Cfile:///Users/bethanysanders/Downloads/gsoap-2.8/gsoap/stdsoap2.cpp }_}x-xcode-disassembly://stack_frame?launchSessionRef=7fb15493d7a0&stackFrameHash=9179579258811452792&stackFrameRef=7fb155845c80 }_~x-xcode-disassembly://stack_frame?launchSessionRef=7fb15493d7a0&stackFrameHash=14783566117410356837&stackFrameRef=7fb171271fb0 }_Efile:///Users/bethanysanders/Documents/work/calc/calc/calc_Prefix.pch }_Ifile:///Users/bethanysanders/Documents/work/calc/calc/calc/AppDelegate.mm } _Ofile:///Users/bethanysanders/Documents/work/calc/calc/calcUITests/calcUITests.m }_8file:///Users/bethanysanders/Documents/work/calc/soapH.h }_Cfile:///Users/bethanysanders/Documents/work/calc/calc/calc/Header.h }_file:///Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h } _~x-xcode-disassembly://stack_frame?launchSessionRef=7fb15493d7a0&stackFrameHash=14783566117410356837&stackFrameRef=7fb155923870 }%_Afile:///Users/bethanysanders/Downloads/gsoap-2.8/gsoap/stdsoap2.h }*_Lfile:///Users/bethanysanders/Documents/work/calc/calc/calcTests/calcTests.mm }/_Lfile:///Users/bethanysanders/Documents/work/calc/calc/calc/ViewController.mm }4_~x-xcode-disassembly://stack_frame?launchSessionRef=7fb15493d7a0&stackFrameHash=14783566117410356837&stackFrameRef=7fb15547e220 }9_Xfile:///Users/bethanysanders/Downloads/gsoap-2.8/gsoap/ios_plugin/ios_plugin/gsoapios.mm }>_Jfile:///Users/bethanysanders/Documents/work/calc/calc/calc/calc_Prefix.pch }C_Hfile:///Users/bethanysanders/Documents/work/calc/calc/calc/AppDelegate.h }H_~x-xcode-disassembly://stack_frame?launchSessionRef=7fb15493d7a0&stackFrameHash=14783566117410356837&stackFrameRef=7fb153d23d00 }M_~x-xcode-disassembly://stack_frame?launchSessionRef=7fb15493d7a0&stackFrameHash=14783566117410356837&stackFrameRef=7fb154345e10 }R_Kfile:///Users/bethanysanders/Documents/work/calc/calc/calc/ViewController.h }W_}x-xcode-disassembly://stack_frame?launchSessionRef=7fb15493d7a0&stackFrameHash=7772002701374407618&stackFrameRef=7fb15545e840 }\_Hfile:///Users/bethanysanders/Documents/work/calc/calc/calc/AppDelegate.m }a_~x-xcode-disassembly://stack_frame?launchSessionRef=7fb15493d7a0&stackFrameHash=14783566117410356837&stackFrameRef=7fb17127e610 }f_}x-xcode-disassembly://stack_frame?launchSessionRef=7fb15493d7a0&stackFrameHash=7772002701374407618&stackFrameRef=7fb15434cd70 }k_Wfile:///Users/bethanysanders/Downloads/gsoap-2.8/gsoap/ios_plugin/ios_plugin/gsoapios.h }p_}x-xcode-disassembly://stack_frame?launchSessionRef=7fb15493d7a0&stackFrameHash=7772002701374407618&stackFrameRef=7fb155478380 }u_;file:///Users/bethanysanders/Documents/work/calc/soapStub.h x})yz{|~"  4_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRange]HideAllIssues_%PrimaryDocumentSelectedCharacterRange#A7X{0, 997}X{289, 0} )   " 4_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRange]HideAllIssues_%PrimaryDocumentSelectedCharacterRange#A41b]{23123, 1713}Z{24277, 0} )yz{|" 4#A8 G<\{2170, 2396}V{0, 0} )yz{|" 4#A8 ]{10109, 2628} )"ā  4_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRange]HideAllIssues_%PrimaryDocumentSelectedCharacterRange#A>,]{76947, 1854}Z{83297, 1} )yz{|""# 4#A8 Ņ\{3825, 3144} )   "%& 4#A41nhX{0, 439} )yz{|"() 4#A8 ,v\{2170, 2396} )   "+, 4#A41zdX{0, 499}  )  ./01  "23 4_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRange]HideAllIssues_%PrimaryDocumentSelectedCharacterRange#A9_ eX{0, 438} )   "!56 74#A4;xX{0, 312}V{2, 0} ',)  ./01-."9: 4#A9_X{0, 562} 5:)6789<=>?;<">@A B4_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRange]HideAllIssues_%PrimaryDocumentSelectedCharacterRange#A4(>X{0, 562}X{562, 0} HM)IJKLDEFGNO"QHI J4_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRange]HideAllIssues_%PrimaryDocumentSelectedCharacterRange#A60FY{0, 2395}X{786, 0} [`)yz{|ab"LM 4#A8 `!\{2170, 2472} in)  ./01op"rOP Q4#A9R,oY{0, 1202}X{690, 0} x})yz{|~"ST 4#A8 z\{3825, 3181} )  ./01"VW 4#A9RX{0, 895} )YZ[\"]^ _4_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRange]HideAllIssues_%PrimaryDocumentSelectedCharacterRange#AG:D[{776, 2093}Z{1070, 25} )abcd"ef g4_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRange]HideAllIssues_%PrimaryDocumentSelectedCharacterRange#A=[o]{486518, 812}[{495345, 0} )yz{|"ij 4#A8 $XY{0, 2703} )yz{|"lm 4#A8 m\{2170, 2396} )ځopqr"߁st u4_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRange]HideAllIssues_%PrimaryDocumentSelectedCharacterRange#A5=:$ݔX{0, 313}Y{247, 57} )  ./01"wx y4#A9q%/Y{0, 2133}X{218, 0} )  ./01"{| 4#A9RL Y{0, 1202}  )abcd  "~ 4#A=QOmYY{0, 1058} )   " 4#A4:O<X{0, 192} "')   ()" 4#A4;Z]{20742, 1594} 05)yz{|67" 4#A8 b_\{3634, 2471} >C)abcdDE"G 4#A=\\&^{101856, 1543}[{102593, 0} MR)  ./01ST" 4#A9RX{0, 895} [`)ab"d 4#A>'WY{0, 2133}Y{1152, 0} jo)yz{|pq" 4#A8 J\{4287, 2526} x})abcd~" 4#A=dKv]{32802, 1804}Z{35572, 0} )ځopqr" 4#A5; [X{0, 312}X{0, 312} )  ./01" 4#A9b^;X{0, 438}X{437, 0} )yz{|" 4#A8 $B\{2170, 2396} )yz{|" 4#A8 \{2170, 2396} )abcd"ʁ 4#A=S6*X{0, 323}X{173, 0} )yz{|" 4#A8 *s\{7943, 2828} )   " 4#A41utlY{0, 2036} )yz{|" 4#A8 \{4287, 2526} )yz{|" 4#A8 Ϟ|\{3825, 3144}  )    " 4_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRange]HideAllIssues_%PrimaryDocumentSelectedCharacterRange#A=to5\{4401, 1913}Y{4267, 0}  )yz{|!""À 4#A8 \{7943, 2779} ).)abcd/0"Łƀ 4#A=QKs\{2442, 1233} 79)8ȡ:ʀ4 }?_"x-xcode-debug-views://7faf576f6d10 BE)CDˁ̢FǴ΀4TzoomXrotation#?!d, M6NOPQρӁՁր T6UVVXЁссҀ#?##?<-AŐ ^6VUVbсЁсԀ#?7X[ f6VVUVссЁр m6VVVUсссЀ t)uvYxDzKT}~9؁ڀ܀ҁހꀼ  '.5;?BEHK4 }_?file:///Users/bethanysanders/Documents/work/calc/soapClient.cpp }_Ifile:///Users/bethanysanders/Documents/work/calc/calc/calc/AppDelegate.mm }_:file:///Users/bethanysanders/Documents/work/calc/soapC.cpp }_;file:///Users/bethanysanders/Documents/work/calc/soapStub.h }_8file:///Users/bethanysanders/Documents/work/calc/soapH.h }_Bfile:///Users/bethanysanders/Documents/work/calc/calc/calc/main.mm }_}x-xcode-disassembly://stack_frame?launchSessionRef=7ffede564f40&stackFrameHash=7672746153683991403&stackFrameRef=7ffeddac9180 }À_Xfile:///Users/bethanysanders/Downloads/gsoap-2.8/gsoap/ios_plugin/ios_plugin/gsoapios.mm }Ȁ_Ufile:///Users/bethanysanders/Documents/work/calc/calc/calc/Base.lproj/Main.storyboard }̀_Hfile:///Users/bethanysanders/Documents/work/calc/calc/calc/AppDelegate.h }Ҁ_}x-xcode-disassembly://stack_frame?launchSessionRef=7ffed6ae02d0&stackFrameHash=6318885899319152757&stackFrameRef=7ffeab7bb1e0 }׀_}x-xcode-disassembly://stack_frame?launchSessionRef=7ffed6ae02d0&stackFrameHash=6223843911395422681&stackFrameRef=7ffee1c4f4a0 }܀_Cfile:///Users/bethanysanders/Downloads/gsoap-2.8/gsoap/stdsoap2.cpp }_Lfile:///Users/bethanysanders/Documents/work/calc/calc/calc/ViewController.mm )" 4_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRange]HideAllIssues_%PrimaryDocumentSelectedCharacterRange#A[u&(gY{0, 2234}X{471, 0} )4W{23, 0}#A[yHZY{0, 1967} )  4_%PrimaryDocumentSelectedCharacterRange_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRange#A[H\{6301, 1761} ) 4X{129, 0}#A[…JY{0, 1801}  $)!"#   &'4_%PrimaryDocumentSelectedCharacterRange_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRange#AYX{0, 313} /3)4564X{613, 0}#A[‰Y{0, 2450} <@)ABC4W{15, 0}#A[’ʣY{0, 2621} IM)NOP4W{32, 0}#A[wOX{0, 329} VZ)[\]4V{8, 0}#A[ˆ"Y{0, 2259} cg)def!"#hij$%&4_%PrimaryDocumentSelectedCharacterRange_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRangeW{17, 0}#Ac\X{0, 264} sw)tuv()*xyz+,-4_%PrimaryDocumentSelectedCharacterRange_$PrimaryDocumentVisibleCharacterRange_PrimaryDocumentTimestampX{702, 0}X{0, 702}#A>WpQ )/012344_%PrimaryDocumentSelectedCharacterRange_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRangeZ{42005, 0}#AbP;ڄ\{2420, 1952} )6789:4_%PrimaryDocumentSelectedCharacterRange_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRange#AB%X{0, 672} )<=>4W{22, 0}#A[zX{0, 322} )@A4#A[xX{0, 562} )tuv()*CD4Y{0, 1818}#A>" )tuv()*΁FG4[{787, 2427}#A>$k )!ځ7IJ4#A[n,Y{0, 2587} )LMN4W{26, 0}#A[vzlX{0, 733} )^_`abc4_%PrimaryDocumentSelectedCharacterRange_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRangeX{617, 0}#A[Y{0, 1324} %))WXY*+,efg4X{464, 0}#A>X{0, 733} 25)34ik67m4 }<j_]file:///Users/bethanysanders/Documents/work/calc/calc/calc/Base.lproj/LaunchScreen.storyboard }Al_Ufile:///Users/bethanysanders/Documents/work/calc/calc/calc/Base.lproj/Main.storyboard DJ)EFGHInopqrKLINOsurvy4_SelectedMemberIdentifiers_EditedMemberConfiguration_SelectionProvider_#IBStoryboardStructureViewController_IBCanvasViewController W6XtZ01J-lp-oVMWdefault ]_)^w`x4_LastKnownOutlineViewWidth#@p ej)fghiz{|}UlmnЁ~4ZZoomFactor[CenterPoint_EditedTopLevelMemberIDs_$ObjectIDToLastKnownCanvasPositionMapY{84, 416} v6Xt z{)4 ~)4_SelectedMemberIdentifiers_EditedMemberConfiguration_SelectionProvider_#IBStoryboardStructureViewController_IBCanvasViewController 6Z8bC-Xf-vdC_heightClass=regular )4_LastKnownOutlineViewWidth#@i )UЁ4ZZoomFactor[CenterPoint_EditedTopLevelMemberIDs_$ObjectIDToLastKnownCanvasPositionMap\{346, 161.5} 6ZBYZ-38-t0r )4 )4 }À_Tfile:///Users/bethanysanders/Documents/work/calc/calc/calc.xcodeproj/project.pbxproj }Ȁ_Tfile:///Users/bethanysanders/Documents/work/calc/calc/Calc.xcodeproj/project.pbxproj )4 )4 )Ձ؁4 }݀_Pfile:///var/folders/_5/fw_576j11612pt111rjjjq1m0000gn/T/Assets-D5EXjfUK.xcassets }_Pfile:///var/folders/_5/fw_576j11612pt111rjjjq1m0000gn/T/Assets-orWWx0Ob.xcassets )4 )4 )4 }_Kfile:///Users/bethanysanders/Documents/work/calc/calc/calc/Assets.xcassets/ )     4_detailController_selectedItemIdentifiers_source-list-area[sourceItems]sclicing-area]overview-area_IBICCatalogOverviewController  89  \NSMutableSet  4_IDE_PLIST_EDITOR_SELECTION_KEY_ IDE_PLIST_EDITOR_VISIBLERECT_KEY_IDE_PLIST_EDITOR_EXPANSION_KEY D6 E_NSAppTransportSecurity_{{0, 0}, {880, 525}} J  K L OP R EP V Z) W X YāŁƣ \ ]Dǁɀ4_IDE_PLIST_EDITOR_SELECTION_KEY_IDE_PLIST_EDITOR_EXPANSION_KEY_ IDE_PLIST_EDITOR_VISIBLERECT_KEY c  dȁ gP_{{0, 0}, {880, 406}} k o) W X YāŁƣ p q rˁ́Ѐ4 u6 v̀_NSAppTransportSecurity z  { |΁ρ P v̀P_{{0, 0}, {880, 406}} ) ҡ Ԁ4 } _file:///Users/bethanysanders/Library/Developer/Xcode/DerivedData/calc-amettingskenqnhcwujznbnbykbg/Build/Products/Debug-iphonesimulator/calc.app/ ) ա ր4_SelectedDocumentLocations 6 ׀ O _IDEQuickLookPageNumberYtimestamp[documentURL5ف؁_file:///Users/bethanysanders/Library/Developer/Xcode/DerivedData/calc-amettingskenqnhcwujznbnbykbg/Build/Products/Debug-iphonesimulator/calc.app/#A4* h89 _IDEQuickLookDocumentLocation <_IDEQuickLookDocumentLocation_DVTDocumentLocation ) ܁ޢ 4 } _Efile:///Users/bethanysanders/Documents/work/calc/calc/calc.xcodeproj/ } _Efile:///Users/bethanysanders/Documents/work/calc/calc/Calc.xcodeproj/ ) Á Ɂ4_-Xcode3ProjectEditorPreviousProjectEditorClass_(Xcode3ProjectEditor.sourceList.splitview_+Xcode3ProjectEditor_Xcode3BuildPhasesEditor_,Xcode3ProjectEditorSelectedDocumentLocations_,Xcode3ProjectEditorPreviousTargetEditorClass_Xcode3ProjectInfoEditor ) Ӂ Ձ4_DVTSplitViewItems ہP   8]DVTIdentifier_DVTViewMagnitude_!sourceListSplitViewItemIdentifier#@e@   8P#@( )  4_5825C14E1D340CBA0078A3F7_+Xcode3BuildPhasesEditorDisclosedNamesKey2.0_5825C1501D340CBA0078A3F7_5825C1511D340CBA0078A3F7_5825C14F1D340CBA0078A3F7_&kXcode3BuildPhasesEditorScrollPointKey )4     _Compile Sources_Link Binary With Libraries_Copy Bundle Resources  )4  )4  )4 #6 $ ' ( ) * +Yselection _Efile:///Users/bethanysanders/Documents/work/calc/calc/calc.xcodeproj/#A9Y -8 / 3) 0 1 2 4 5 6   4VEditorVTarget_ Xcode3BuildPhasesEditorLocations_Xcode3BuildPhasesEditorTcalc >6 ?  B C)489 F G_Xcode3ProjectDocumentLocation H I<_Xcode3ProjectDocumentLocation_DVTDocumentLocation_Xcode3BuildPhasesEditor L Q) M N O P R S T U)24_(Xcode3ProjectEditor.sourceList.splitview_+Xcode3ProjectEditor_Xcode3BuildPhasesEditor_,Xcode3ProjectEditorSelectedDocumentLocations_,Xcode3ProjectEditorPreviousTargetEditorClass \ ^)F _4 b c dP g j h i k 8]DVTIdentifier_DVTViewMagnitude_!sourceListSplitViewItemIdentifier r u h i w8#@ { ) | } ~   !" #$&'(4_5825C14E1D340CBA0078A3F7_+Xcode3BuildPhasesEditorDisclosedNamesKey2.0_5825C1501D340CBA0078A3F7_5825C1511D340CBA0078A3F7_5825C14F1D340CBA0078A3F7_&kXcode3BuildPhasesEditorScrollPointKey )4  %_Link Binary With Libraries )4 )4 )4 6 * ' +-,+ _Efile:///Users/bethanysanders/Documents/work/calc/calc/Calc.xcodeproj/#Ac_ Ġ ) 0 1 . 5 / 04_ Xcode3BuildPhasesEditorLocations_Xcode3BuildPhasesEditor 6 1 )4_Xcode3BuildPhasesEditor ) ȁ46 ˁ8>4 } Ѐ5_]file:///Users/bethanysanders/Documents/work/calc/calc/calc/Base.lproj/LaunchScreen.storyboard } Հ7_Ufile:///Users/bethanysanders/Documents/work/calc/calc/calc/Base.lproj/Main.storyboard ) ہ9:; ߁<=4_%PrimaryDocumentSelectedCharacterRange_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRange#ABO8 X{0, 687} ) ?@4Y{0, 4257}#A[gXB  B C8]IDENameStringTcalc    EFGHIJKL g"  gM9 NOPQ98YtargetSDKZisEligible_targetDeviceIsWireless_targetDeviceLocation_targetArchitecture_targetDeviceFamily_targetDeviceModelCode_targetDeviceIsConcrete_iphonesimulator9.3_>dvtdevice-iphonesimulator:949C3351-857E-4EF6-A71D-9360DB1F9CE8Vx86_64ViPhoneYiPhone8,2  %)    ! " # $SUWY[]_a & ' ( ) * + , -chjlmnpq4 } 2T_Wfile:///Users/bethanysanders/Downloads/gsoap-2.8/gsoap/ios_plugin/ios_plugin/gsoapios.h } 7V_:file:///Users/bethanysanders/Documents/work/calc/soapC.cpp } <X_Lfile:///Users/bethanysanders/Documents/work/calc/calc/calc/ViewController.mm } AZ_Kfile:///Users/bethanysanders/Documents/work/calc/calc/calcTests/calcTests.m } F\_Kfile:///Users/bethanysanders/Documents/work/calc/calc/calc/ViewController.h } K^_?file:///Users/bethanysanders/Documents/work/calc/soapClient.cpp } P`_Efile:///Users/bethanysanders/Documents/work/calc/calc/calc/Info.plist } Ub_Xfile:///Users/bethanysanders/Downloads/gsoap-2.8/gsoap/ios_plugin/ios_plugin/gsoapios.mm X [ Y Zde \ ]fg8UwidthVheight#@#@ d g Y Zde \ ifi8#@ m p Y Zde \ rfk8#@p v y Y Zde \ ]fg8 ~  Y Zde \ ]fg8  Y Zde \ fo8#@X  Y Zde \ ]fg8  Y Zde \ ]fg8 ) stu 5v 4_0IDEActivityReportCompletionSummaryStringSegments_IDEActivityReportOptions_IDEActivityReportTitle w~P ) xyz {|}4_&IDEActivityReportStringSegmentPriority_+IDEActivityReportStringSegmentBackSeparator_)IDEActivityReportStringSegmentStringValue#@c % TCalc ) xyz ˁ4#@Q UBuild ) xyz 5 4#@R: ) xyzU Ё4c % WNS.dataO`bplist00;Troot#-27EKR[boqsu|!*17DKMOT\_dqty?89 ]NSMutableData _;file:///Users/bethanysanders/Documents/work/calc/soapStub.h } C_8file:///Users/bethanysanders/Documents/work/calc/soapH.h } H_:file:///Users/bethanysanders/Documents/work/calc/soapC.cpp K S) L M N O P Q R T U V Ng"9 4^IDEWindowFrame_!IDEOrderedWorkspaceTabControllers_>IDEWorkspaceTabController_2D965AF6-11D1-4E53-A00C-1B71F1372AA8_,IDEWorkspaceWindowControllerUniqueIdentifier_IDEActiveWorkspaceTabController_IDEWindowToolbarIsVisible_IDEWindowTabBarIsVisible_{{44, 0}, {1332, 877}} e6 N i t) j k l m n o p q r sOg w x y z {g } ~59HM9PQ4_AssistantEditorsLayout_IDEShowNavigator[IDETabLabel_-IDEWorkspaceTabControllerUtilityAreaSplitView_IDENavigatorArea_,IDEWorkspaceTabControllerDesignAreaSplitView\ViewDebugger_IDEShowUtilities^IDETabFilePath]IDEEditorArea_project.pbxproj )  4_DVTSplitViewItems P IJO a8#@P IJOZad8 ) ÁāŁƁǁȁɁʩ d ˁہs )4_ Xcode.IDEKit.Navigator.Structure_Xcode.IDEKit.Navigator.Symbol_ Xcode.IDEKit.Navigator.BatchFind_SelectedNavigator_Xcode.IDEKit.Navigator.Issues_"Xcode.IDEKit.Navigator.Breakpoints_Xcode.IDEKit.Navigator.Test_Xcode.IDEKit.Navigator.Logs_Xcode.IDEKit.Navigator.Debug ) ΁́́΁ρЁѦ " "ҁց׀ ـ 4_IDEExpandedItemsTree^IDEVisibleRect_IDESelectedTree_IDESCMStatusFilteringEnabled_,IDENavigatorExpandedItemsBeforeFilteringTree_!IDERecentDocumentFilteringEnabled | Ӏ8 ) ԡ Հ4TCalcP_{{0, 0}, {259, 782}} | ؀8 ) ԡ Հ4 | ڀ8 )4  )      ܁݁ށ߁gg g "999 4_#IDESymbolNavigatorShowWorkspaceOnly_IDESymbolNavigatorShowHierarchy_IDEExpandedItems_!IDESymbolNavigatorShowClassesOnly_IDESymbolNamePatternString_!IDESymbolNavigatorSelectedSymbols_$IDESymbolNavigatorShowContainersOnly  P_c:objc(cs)ViewController !6  % -) & ' ( ) * + , .O 0OOg 455594_)IDEBatchFindNavigatorFindAttributedString_IDEBatchFindMatchStyle_,IDEBatchFindNavigatorReplaceAttributedString_IDEBatchFindFindType_IDEBatchFindNavigatorFindMode_IDEBatchFindIgnoreCase_.IDEBatchFindNavigatorSelectedLocationsStateKey > ? @ A BXNSString\NSAttributes D E FYNS.string_#NSURLRequestReturnCacheDataElseLoad89 H I_NSMutableString H J d A D E hP j l k m8_IDEValuesAsTree q r)4 u ) v x y z { | } ~́" " "    4_IDEErrorFilteringEnabled_IDECollapsedFiles_IDEExpandedIssues^IDEShowsByType_IDESelectedNavigables_IDECollapsedTypes_IDERecentFilteringEnabled_IDECollapsedGroups_{{0, 0}, {259, 753}}   P   )    "  4^IDEVisibleRect_%IDEBreakpointNavigatorFilterOnEnabled_IDESelectedTree_IDECollapsedtemsTree_{{0, 0}, {259, 782}}   8_IDEValuesAsTree )4   8 )4 )   "" ҁ 4_IDEFailedTestsFilteringEnabled_IDESchemeFilteringEnabled_{{0, 0}, {259, 782}}  ف ہ8_IDEValuesAsTree )4 )  !"#" " " $ % (4_ IDELogNavigatorBotFilterStateKey_"IDELogNavigatorVisibleRectStateKey_IDELogNavigatorGroupByKey_expandedIdentifiers_#IDELogNavigatorRecentFilterStateKey_collapsedIdentifiers_{{0, 0}, {259, 753}} &'P_!entity:calc:scheme:calc project:1Wproject P  )  *+,- .  O""/05 G 4_IDEStackCompressionValue_IDEDebugTransientStates_DBGNavigatorContentMode_IDEShowOnlyRunningBlocks_IDEShowOnlyInterestingContent  )12345!"gg%679994_'IDEExecutionEnvironmentAddressStringKey_IDEDebugExpandedItems_%IDEDebugAlreadyShownForNewPausedState_1IDEHaveInitiallyExpandedCPUDebuggingChildrenState_IDEDebugSelectedNavigableItems^0x7f7f9aa2b0e0 . / 58 Ycalc %% 1 45:P89 :;}=>?@_DocumentLocation^IdentifierPath_DomainIdentifier_IndexOfDocumentIdentifier<F;E_1Xcode.IDENavigableItem.ExecutionEnvironmentDomain C6DEFG=@BCJK LONZIdentifierUIndex>5?_0 soap_register_plugin_arg89QR_IDEArchivableStringIndexPairS<_IDEArchivableStringIndexPairJK UONA5?XThread 1JK 5ON 5?JK ^OND5?_89de_(IDENavigableItemArchivableRepresentationf<_(IDENavigableItemArchivableRepresentation_{{0, 0}, {259, 782}} ik) lI4 opqrJKLP uxIJЀ8 }IJڀ8 IJЀ8 )NOgg994_ShowsOnlyInterestingViewObjects_ShowsOnlyVisibleViewObjects_M/Users/bethanysanders/Documents/work/calc/calc/Calc.xcodeproj/project.pbxproj )RSTUVWXYZ[\g  g]^9//94_ DefaultPersistentRepresentations_IDEEditorMode_StandardZlayoutTree]IDEShowEditor_VersionEditorSubmodeZEditorMode_IDEEditorMode_Version_IDEEditorMode_Genius_IDEDefaultDebugArea_DebuggerSplitView_ShowDebuggerArea )4 )_ā`4_%EditorLayout_PersistentRepresentation )-ˁa4 сbcdOՁe58_)EditorLayout_StateSavingStateDictionaries_EditorLayout_Selected_EditorLayout_Geometry 6܁f )ghijklmnosw4\FileDataType[EditorState_ArchivableRepresentation_NavigableItemName_DocumentNavigableItemName_DocumentExtensionIdentifier[DocumentURL_#public.objective-c-plus-plus-source abcd"pq r8#A=ef\{2258, 1895}Y{2318, 0}89 :; > O}uFt5_/Xcode.IDENavigableItemDomain.WorkspaceStructure 6vy|JK Nwx?^soapClient.cpp JK Nz{?WClassesJK 5ON 5? %&}~_?file:///Users/bethanysanders/Documents/work/calc/soapClient.cpp89*+_DVTDocumentLocation,<_DVTDocumentLocation_}soap_call_ns2__add(struct soap *soap, const char *soap_endpoint, const char *soap_action, double a, double b, double &result)_&Xcode.IDEKit.EditorDocument.SourceCode }%~ 465_{{0, 0}, {1140, 710}}yz{ 9};) }9A(89 :;CD>FGF_/Xcode.IDENavigableItemDomain.WorkspaceStructure J6KJK NON5?TCalc &}߁ X}}( ]6; ac)bd4_%EditorLayout_PersistentRepresentation hj)-k4 nr/01sOu58 x6y |)}~ ހ4\FileDataType[EditorState_ArchivableRepresentation_NavigableItemName_DocumentNavigableItemName_DocumentExtensionIdentifier[DocumentURL_com.apple.xcode.project 889 :;>FF 6JK ON5?TCalc &}߁TCalc_9Xcode.IDEKit.EditorDocument.SourceCode-from-Xcode3Project 6_{{0, 0}, {812, 441}} )b4]SplitPosition"? )-āЀ4YAlternate ˁOρ5΀8_)EditorLayout_StateSavingStateDictionaries_EditorLayout_Selected_EditorLayout_Geometry ցP )ʁˁ́̀4\FileDataType[EditorState_ArchivableRepresentation_NavigableItemName_DocumentNavigableItemName_DocumentExtensionIdentifier[DocumentURL_public.c-header yz{|" 8#A8KX{0, 556}X{350, 0}89 :;>}OȁF5 6  ŀ  )áĀ4_navigableItem_name_ViewController.h )ơǀ4Zidentifier_(Xcode.IDEKit.GeniusCategory.Counterparts &}Ɂ_Kfile:///Users/bethanysanders/Documents/work/calc/calc/calc/ViewController.h_@interface ViewController_ViewController.h_&Xcode.IDEKit.EditorDocument.SourceCode } )*πP_{{0, 0}, {439, 454}} .2ˁ3O5р58 869Ҁ <D)FGHIKnӁׁځ́4 NSyz{|TU"WԁՀ ր8#A8Z{212, 908}Y{1060, 0}89 :;]^> Oށ؁Ft5 c6defف܁݀JK IjNځہ?_ViewController.mm JK Nz{?JK 5ON 5? w&}߁_Lfile:///Users/bethanysanders/Documents/work/calc/calc/calc/ViewController.mm^-buttonPressed }w 6_{{0, 0}, {880, 454}} )р;>O54_IDESplitViewDebugAreaZLayoutMode )"Og 5D94_VariablesViewShowsRawValues_VariablesViewSelectedScope_ VariablesViewViewSortDescriptors_VariablesViewShowsType ) 4 P IJK8#@u IJ N8#@u )O54_ConsoleFilterMode )Uˁ4 ЁP IJ,؀X8#@}` IJ6[8#@w_NSKeyedArchiverUState"+5:? 7 = J R ] d k m o q x z |         ! # % ' ) + - / J Y } + , D M P R T ] h q y ~ ) < k ~  #1HSi}/8?Knz|~"HMs'?W`cegtuvx  3>HU^`bdfoqsuwy  )279;=JOQSXZ\^l!#&(*>GLNPR_dfhmoqs} !"+8=?AFHJLUbikmovxz|~  7Nj*79;=?ACPRTVXZ\^u!3@ABDWdgilnp}~&+-/468:HQ^ceglnpr 3P]t "$&(*,.02KMPSVY\_behknp9s@\3579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}  "%(+.147:=@CFILORUX[^adgjmpsvy{   k x z | ~ ! !!!!!!!!!!!!!"u"""""""""#`#m#o#q#s#####$$&$($*$,$w$$$$$$$$$%%(%*%,%.%%%%%&y&&&&&&&&&'r'''''''''(((5(7(9(;((((())!)#)%)')))))******b*o*q*s*u*****++"+$+&+(+n+{+}++,B,O,Q,S,U,,,,,---:-<->-@-------........./////S/`/b/d/f/////0E0R0T0V0X000001:1G1I1K1M111112+282:2<2>222223R3_3a3c3e333334R4_4a4c4f4444444444444455,5T5]5f5o5|5555555555555566(666A6N6W6Z6]6`6c6l6o6r6t6w6y66666666666666666666777777777787_7m7777777777777777788888!8$8'808386888;8=8F8O8\8e8h8k8n8q8z8}88888888888888888888889999 9999999:9a9o999999999999999999:::::::%:(:+:-:0:2:;:D:Q:Z:]:`:c:f:o:r:u:w:z:|:::::;;;;%;(;+;.;1;:;=;@;B;E;G;b;;;;;;;;;;;;<< < <<<<<)<6>>>>>>>>>8>_>m>>>>>>>>>>>>>>>>>??????"?%?.?1?4?6?9?;?D?Q?^?g?j?m?p?s?|????????@@ @@@*@3@6@9@<@?@H@K@N@P@S@U@^@h@q@~@@@@@@@@@@@@@@@@@@@@@@@@@@AAAA A#A&A)A2A5A8A:A=A?AHAQA^AgAjAmApAsA|AAAAAAAAAAAAAAAAAAAAAABBB B BBBBB!B$B&B/B>BJBWB`BcBfBiBlBuBxB{B}BBBBBBBBBBBBBBBBBBBBBCCCC CCCCCC!C*C7CDCMCPCSCVCYCbCeChCjCmCoCxCCCCCCCCCCCCCCCCCCCCDDDDDDDDDD%D.D7DDDMDPDSDVDYDbDeDhDjDmDoDxDDDDDDDDDDDDDDDDDDDDDDEEEE E EEE&E3EF@FCFEFNF[FhFqFtFwFzF}FFFFFFFFFG GG!G+G8GAGDGGGJGMGVGYG\G^GaGcGlGyGGGGGGGGGGGGGGGGGGGGGGGGHH(H-H0H3H8H;H>H@HEHNHWH`HiHlHoHrHuHwHHHHHHHHHHHHHHHHHHHHHHHHHII IIIIII(IQITIWIYI\I^IaIcIeIhIkInIqItIwIyI|IIIIIIIIIIIIIIIIIIIIIIIIIIIIJ?JLJNJPJSJJJJJJJJKKKBKOKQKSKVKKKKKKKKKKL~LLLLLLLLMMYMfMhMjMmMMMMMNLNYN[N]N`NNNNNO:OGOIOKONOOOOOOOOOOOOOOPP%PMPVP`PiPvP}PPPPPPPPPPPPPPPPPPPPPQ Q%QLQUQbQoQvQyQ|QQQQQQQQQQQQQQQQQQQRRRFRORXReRlRoRrRuR|RRRRRRRRRRRRRRRRRRRRRSSSS SSSSSS$S-S6SCSJSMSPSSSZS]S`ScSeSlSuSSSSSSSSSSSSSTT T)T2T?TFTITLTOTVTYT\T_TaTTTTTTTTTUUU U UUUU=UXUUUUUUUUUUUUUUUVV9VBVKVXV_VbVeVhVoVrVuVxVzVVVVVVVVVVVVVVVVVVVVVVVWWWWW$W+W.W1W4W;W>WAWDWFWRW[WhWoWrWuWxWWWWWWWWWWWWWWWWWWWWWWWXXX XXXXX#X%X'X*XyXXXXXXXXXY6YCYJYMYPYSYZY]Y`YcYeYYYYYYYYZZZZZZZZZAZ\ZZZZZZZZZZZZZZZZZZZZ[[[ [ [[[[["[[[[[[[\\ \ \\\\ \#\&\)\,\/\1\M\i\}\\\\\\\\\\\\\\]] ]-]6]9]<]?]B]K]N]Q]T]W]Y]d]p]]]]]]]]]]]]]]]]^^^^^^^^^ ^<^X^l^^^^^^^^^^^^^^___*_3_6_9_<_?_H_K_N_Q_T_V_a_m_______________```` ` ````!`x`````````aaaaaaaaa"a%a(a*a7a9a;a>aaaaaabbbb bbbbb'b*b-b0b3b5bBbDbFbIbbbbbbbbbbbbbbbbbbcc$c0c>cLclcucvcycccccccccccccccccccccddddddd d'd*d-d0d7d:d=d@dBdOdVdYd\d_dfdidldodqdddddddeee e%e(e+e.e7e8e:eCeFeIeKeXe_ebeeeheoeqeteweyeeeeeeeeeeff f'f*f-f0f7f:f=f@fBfKfNfQfSflfufzf}ffffffffffffffffffffgzgggggggggggggghhhh h hhhhhhiii i#i&i+i.i1i3i@iBiDiGiiiiiiijjj j jjjj j#j&j)j,j.j^jjjkk/ksEsHsKsNsUsXs[s^s`ssssssssssssssssssst t tttrttttttttttuuuu u u5uPuwuuuuuuuuuuuuuuuuuuuuuuvvvvv v#v&v)v,v/v@vCvEvGvJvMvPvSvUvWvavlvvvvvvw wMwTw[wewrwwwwwwwwwwwwwwwwwwwwwwwx4xAxCxExHxxxxxxxxxxyJyWyYy[y^yyyyyzzzzzz^zkzmzozrzzzzzzzzzzz{{{{#{&{){.{1{4{6{?{L{Q{T{W{\{_{b{d{m{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||| ||||"|'|*|-|/|<|C|F|I|L|S|V|Y|\|^|||||||||||||}}}}}}}}}B}p}}}}}}}}}}}}}}}}}}~~~ ~~~~~~ ~)~,~9~@~C~F~I~P~S~V~Y~[~b~k~s׀ڀ "%(+8;=@CEGIn ,.7<>@BK`cfilorux{~\ikmpʃ׃كۃބ"/136|΄ۄ݄߄*,.1n{…х6e׆ "%(=?ADGJMPRUXZs‡Ո$3AS`cfilnÈЈՈ׈وވ 258;=@CFILNqȉ +Ihuʊي 9]jmoruwċNjɋ֋ً܋ߋ +.147:=@OQSVX[^`b"IRUXZu~ƍɍˍ΍Ѝҍԍ׍َMdΎێ 6?QXanqtwz|ҏۏ /DMPS\_`mpsvy{Đǐʐ͐АӐ֐ِ!5IXp̑Ցّ֑ "%(+.7:ADGPSUWZ\}ÓƓɓ˓ݓ '),.1368[ؔ@HQRTanqtwz}ӕ(*7BEHKNQ\_bdfik՗ *9BGJMPZcfikїӗ֗ٗܗߘ%(+.13@KQTVYv˜ϘҘԘט %.7bg™ę͙ԙיڙݙߙ !.357<>@BOTWZ_ace"%(+.147:QTWZ\_behknprǛޛ.BUbcdfsvy|ÜМלڜݜ5MVY\^kz}Ν7Civ֞ٞܞߞ&),/1>ADGVXehknvxǠԠ֠ؠ۠8:=?BWZ]`cfá̡١ܡߡ !$'*-/Wdgiloq~ɢ̢ϢҢբآۢޢ8Lhңգأۣޣ "%(*/ktwz|Ƥˤؤݤ  "%'Sk¥ťԥץڥݥ3Omyæ̦զަ #&),/1FYfilort ) SchemeUserState calc.xcscheme orderHint 0 SuppressBuildableAutocreation 5825C1511D340CBA0078A3F7 primary 5825C16A1D340CBB0078A3F7 primary 5825C1751D340CBB0078A3F7 primary ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/Calc.xcodeproj/xcuserdata/bethanysanders.xcuserdatad/xcschemes/calc.xcschemegsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/Calc.xcodeproj/xcuserdata/bethanysanders.xcuserdata0000644000175000017500000001054013525245161033273 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/Calc.xcodeproj/xcuserdata/bethanysanders.xcuserdatad/xcdebugger/gsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/Calc.xcodeproj/xcuserdata/bethanysanders.xcuserdata0000755000175000017500000000000013525245161033271 5ustar ellertellert././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/Calc.xcodeproj/xcuserdata/bethanysanders.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlistgsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/Calc.xcodeproj/xcuserdata/bethanysanders.xcuserdata0000644000175000017500000000013313525245161033270 0ustar ellertellert gsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc/calc_Prefix.pch0000644000175000017500000000047113525245161024110 0ustar ellertellert// // Prefix header for all source files of the 'Calc' target in the 'Calc' project // #define DEBUG #ifdef DEBUG #define DLog(...) NSLog(__VA_ARGS__) #else #define DLog(...) /* empty*/ #endif #define ALog(...) NSLog(__VA_ARGS_) #ifdef __OBJC__ #import #import #endif gsoap-2.8.91/gsoap/ios_plugin/examples/calc/calc.h0000644000175000017500000006402613525245161021354 0ustar ellertellert/* calc.h Generated by wsdl2h 2.8.33 from http://www.genivia.com/calc.wsdl and typemap.dat 2016-08-17 14:10:07 GMT DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS USE THE soapcpp2-GENERATED SOURCE CODE FILES FOR YOUR PROJECT BUILDS gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. 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 -------------------------------------------------------------------------------- */ /** @page page_notes Notes @note HINTS: - Run soapcpp2 on calc.h to generate the SOAP/XML processing logic. Use soapcpp2 -I to specify paths for #import To build with STL, 'stl.h' is imported from 'import' dir in package. Use soapcpp2 -j to generate improved proxy and server classes. Use soapcpp2 -r to generate a report. - Use wsdl2h -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. - Run Doxygen (www.doxygen.org) on this file to generate documentation. - Use wsdl2h -R to generate REST operations. - Use wsdl2h -nname to use name as the base namespace prefix instead of 'ns'. - Use wsdl2h -Nname for service prefix and produce multiple service bindings - Use wsdl2h -d to enable DOM support for xsd:anyType. - Use wsdl2h -g to auto-generate readers and writers for root elements. - Use wsdl2h -b to auto-generate bi-directional operations (duplex ops). - Use wsdl2h -U to map XML names to C++ Unicode identifiers instead of _xNNNN. - Use wsdl2h -u to disable the generation of unions. - Struct/class members serialized as XML attributes are annotated with a '@'. - Struct/class members that have a special role are annotated with a '$'. @warning DO NOT INCLUDE THIS ANNOTATED FILE DIRECTLY IN YOUR PROJECT SOURCE CODE. USE THE FILES GENERATED BY soapcpp2 FOR YOUR PROJECT'S SOURCE CODE: THE soapStub.h FILE CONTAINS THIS CONTENT WITHOUT ANNOTATIONS. @copyright LICENSE: @verbatim -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. The wsdl2h tool and its generated software are released under the GPL. This software is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- @endverbatim */ //gsoapopt c++,w /******************************************************************************\ * * * Definitions * * http://websrv.cs.fsu.edu/~engelen/calc.wsdl * * * \******************************************************************************/ /******************************************************************************\ * * * $CONTAINER * * std::vector * * * \******************************************************************************/ template class std::vector; /******************************************************************************\ * * * Import * * * \******************************************************************************/ #import "stl.h" // enable STL containers when used (option -s removes STL dependency) /******************************************************************************\ * * * 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: ns1 = "http://websrv.cs.fsu.edu/~engelen/calc.wsdl" ns2 = "urn:calc" */ #define SOAP_NAMESPACE_OF_ns2 "urn:calc" //gsoap ns2 schema namespace: urn:calc //gsoap ns2 schema form: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ /******************************************************************************\ * * * Forward Declarations * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * urn:calc * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * urn:calc * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Elements * * urn:calc * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * urn:calc * * * \******************************************************************************/ /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap ns2 service name: calc //gsoap ns2 service type: calcPortType //gsoap ns2 service port: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns2 service namespace: urn:calc //gsoap ns2 service transport: http://schemas.xmlsoap.org/soap/http /** @mainpage calc Definitions @section calc_bindings Service Bindings - @ref calc @section calc_more More Information - @ref page_notes "Notes" - @ref page_XMLDataBinding "XML Data Binding" - @ref SOAP_ENV__Header "SOAP Header Content" (when applicable) - @ref SOAP_ENV__Detail "SOAP Fault Detail Content" (when applicable) */ /** @page calc Binding "calc" @section calc_service Service Documentation "calc" gSOAP 2.7.9k generated service definition @section calc_operations Operations of Binding "calc" - @ref ns2__add - @ref ns2__sub - @ref ns2__mul - @ref ns2__div - @ref ns2__pow @section calc_ports Default endpoints of Binding "calc" - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi @note Use wsdl2h option -Nname to change the service binding prefix name */ /******************************************************************************\ * * * Service Binding * * calc * * * \******************************************************************************/ /******************************************************************************\ * * * Service Operation * * ns2__add * * * \******************************************************************************/ /** Operation "ns2__add" of service binding "calc". Service definition of function ns__add - SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" - Default endpoints: - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call_ns2__add( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: double a, double b, // output parameters: double &result ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int ns2__add( struct soap *soap, // input parameters: double a, double b, // output parameters: double &result ); @endcode C++ proxy class (defined in soapcalcProxy.h generated with soapcpp2): @code class calcProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapcalcService.h generated with soapcpp2): @code class calcService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns2 service method-protocol: add SOAP //gsoap ns2 service method-style: add rpc //gsoap ns2 service method-encoding: add http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: add "" //gsoap ns2 service method-output-action: add Response int ns2__add( double :a, ///< Input parameter, : unqualified name as per RPC encoding double :b, ///< Input parameter, : unqualified name as per RPC encoding double &:result ///< Output parameter, : unqualified name as per RPC encoding ); /******************************************************************************\ * * * Service Operation * * ns2__sub * * * \******************************************************************************/ /** Operation "ns2__sub" of service binding "calc". Service definition of function ns__sub - SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" - Default endpoints: - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call_ns2__sub( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: double a, double b, // output parameters: double &result ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int ns2__sub( struct soap *soap, // input parameters: double a, double b, // output parameters: double &result ); @endcode C++ proxy class (defined in soapcalcProxy.h generated with soapcpp2): @code class calcProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapcalcService.h generated with soapcpp2): @code class calcService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns2 service method-protocol: sub SOAP //gsoap ns2 service method-style: sub rpc //gsoap ns2 service method-encoding: sub http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: sub "" //gsoap ns2 service method-output-action: sub Response int ns2__sub( double :a, ///< Input parameter, : unqualified name as per RPC encoding double :b, ///< Input parameter, : unqualified name as per RPC encoding double &:result ///< Output parameter, : unqualified name as per RPC encoding ); /******************************************************************************\ * * * Service Operation * * ns2__mul * * * \******************************************************************************/ /** Operation "ns2__mul" of service binding "calc". Service definition of function ns__mul - SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" - Default endpoints: - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call_ns2__mul( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: double a, double b, // output parameters: double &result ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int ns2__mul( struct soap *soap, // input parameters: double a, double b, // output parameters: double &result ); @endcode C++ proxy class (defined in soapcalcProxy.h generated with soapcpp2): @code class calcProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapcalcService.h generated with soapcpp2): @code class calcService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns2 service method-protocol: mul SOAP //gsoap ns2 service method-style: mul rpc //gsoap ns2 service method-encoding: mul http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: mul "" //gsoap ns2 service method-output-action: mul Response int ns2__mul( double :a, ///< Input parameter, : unqualified name as per RPC encoding double :b, ///< Input parameter, : unqualified name as per RPC encoding double &:result ///< Output parameter, : unqualified name as per RPC encoding ); /******************************************************************************\ * * * Service Operation * * ns2__div * * * \******************************************************************************/ /** Operation "ns2__div" of service binding "calc". Service definition of function ns__div - SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" - Default endpoints: - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call_ns2__div( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: double a, double b, // output parameters: double &result ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int ns2__div( struct soap *soap, // input parameters: double a, double b, // output parameters: double &result ); @endcode C++ proxy class (defined in soapcalcProxy.h generated with soapcpp2): @code class calcProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapcalcService.h generated with soapcpp2): @code class calcService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns2 service method-protocol: div SOAP //gsoap ns2 service method-style: div rpc //gsoap ns2 service method-encoding: div http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: div "" //gsoap ns2 service method-output-action: div Response int ns2__div( double :a, ///< Input parameter, : unqualified name as per RPC encoding double :b, ///< Input parameter, : unqualified name as per RPC encoding double &:result ///< Output parameter, : unqualified name as per RPC encoding ); /******************************************************************************\ * * * Service Operation * * ns2__pow * * * \******************************************************************************/ /** Operation "ns2__pow" of service binding "calc". Service definition of function ns__pow - SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" - Default endpoints: - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call_ns2__pow( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: double a, double b, // output parameters: double &result ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int ns2__pow( struct soap *soap, // input parameters: double a, double b, // output parameters: double &result ); @endcode C++ proxy class (defined in soapcalcProxy.h generated with soapcpp2): @code class calcProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapcalcService.h generated with soapcpp2): @code class calcService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns2 service method-protocol: pow SOAP //gsoap ns2 service method-style: pow rpc //gsoap ns2 service method-encoding: pow http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: pow "" //gsoap ns2 service method-output-action: pow Response int ns2__pow( double :a, ///< Input parameter, : unqualified name as per RPC encoding double :b, ///< Input parameter, : unqualified name as per RPC encoding double &:result ///< Output parameter, : unqualified name as per RPC encoding ); /** @page calc Binding "calc" @section calc_policy_enablers Policy Enablers of Binding "calc" None specified. */ /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. Data can be read and deserialized from: - an int file descriptor, using soap->recvfd = fd - a socket, using soap->socket = (int)... - a C++ stream (istream, stringstream), using soap->is = (istream*)... - a C string, using soap->is = (const char*)... - any input, using the soap->frecv() callback Data can be serialized and written to: - an int file descriptor, using soap->sendfd = (int)... - a socket, using soap->socket = (int)... - a C++ stream (ostream, stringstream), using soap->os = (ostream*)... - a C string, using soap->os = (const char**)... - any output, using the soap->fsend() callback The following options are available for (de)serialization control: - soap->encodingStyle = NULL; to remove SOAP 1.1/1.2 encodingStyle - soap_mode(soap, SOAP_XML_TREE); XML without id-ref (no cycles!) - soap_mode(soap, SOAP_XML_GRAPH); XML with id-ref (including cycles) - soap_set_namespaces(soap, struct Namespace *nsmap); to set xmlns bindings @section ns2 Top-level root elements of schema "urn:calc" */ /* End of calc.h */ gsoap-2.8.91/gsoap/ios_plugin/examples/README.txt0000644000175000017500000000135613525245161021072 0ustar ellertellert INSTRUCIONS =========== To compile the examples, first copy the following files to the source code files folders of each example (Air, app2, calc, Weather): - gsoapios.h (located under gsoap/ios_plugin/) - gsoapios.mm (located under gsoap/ios_plugin/) - stdsoap2.h (located under gsoap/) - stdsoap2.cpp (located under gsoap/) - dom.cpp (located under gsoap/) Then generate updated files with soapcpp2 for each example: cd Air soapcpp2 -j -CL -I../../../import airport.h cd app2 soapcpp2 -j -CL -I../../../import GeoIPService.h cd calc soapcpp2 -CL -I../../../import calc.h cd Weather soapcpp2 -j -CL -I../../../import weather.h DOCUMENTATION ============= See http://www.genivia.com/doc/ios/index.html gsoap-2.8.91/gsoap/ios_plugin/examples/app2/0000755000175000017500000000000013525564140020232 5ustar ellertellertgsoap-2.8.91/gsoap/ios_plugin/examples/app2/GeoIPService.h0000644000175000017500000010574413525245161022701 0ustar ellertellert/* GeoIPService.h Generated by wsdl2h 2.8.33 from http://www.webservicex.net/geoipservice.asmx?WSDL and typemap.dat 2016-08-17 14:09:08 GMT DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS USE THE soapcpp2-GENERATED SOURCE CODE FILES FOR YOUR PROJECT BUILDS gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. 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 -------------------------------------------------------------------------------- */ /** @page page_notes Notes @note HINTS: - Run soapcpp2 on GeoIPService.h to generate the SOAP/XML processing logic. Use soapcpp2 -I to specify paths for #import To build with STL, 'stl.h' is imported from 'import' dir in package. Use soapcpp2 -j to generate improved proxy and server classes. Use soapcpp2 -r to generate a report. - Use wsdl2h -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. - Run Doxygen (www.doxygen.org) on this file to generate documentation. - Use wsdl2h -R to generate REST operations. - Use wsdl2h -nname to use name as the base namespace prefix instead of 'ns'. - Use wsdl2h -Nname for service prefix and produce multiple service bindings - Use wsdl2h -d to enable DOM support for xsd:anyType. - Use wsdl2h -g to auto-generate readers and writers for root elements. - Use wsdl2h -b to auto-generate bi-directional operations (duplex ops). - Use wsdl2h -U to map XML names to C++ Unicode identifiers instead of _xNNNN. - Use wsdl2h -u to disable the generation of unions. - Struct/class members serialized as XML attributes are annotated with a '@'. - Struct/class members that have a special role are annotated with a '$'. @warning DO NOT INCLUDE THIS ANNOTATED FILE DIRECTLY IN YOUR PROJECT SOURCE CODE. USE THE FILES GENERATED BY soapcpp2 FOR YOUR PROJECT'S SOURCE CODE: THE soapStub.h FILE CONTAINS THIS CONTENT WITHOUT ANNOTATIONS. @copyright LICENSE: @verbatim -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. The wsdl2h tool and its generated software are released under the GPL. This software is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- @endverbatim */ //gsoapopt c++,w /******************************************************************************\ * * * Definitions * * http://www.webservicex.net/ * * * \******************************************************************************/ /******************************************************************************\ * * * $CONTAINER * * std::vector * * * \******************************************************************************/ template class std::vector; /******************************************************************************\ * * * Import * * * \******************************************************************************/ #import "stl.h" // enable STL containers when used (option -s removes STL dependency) /******************************************************************************\ * * * 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: ns1 = "http://www.webservicex.net/" */ #define SOAP_NAMESPACE_OF_ns1 "http://www.webservicex.net/" //gsoap ns1 schema namespace: http://www.webservicex.net/ //gsoap ns1 schema elementForm: qualified //gsoap ns1 schema attributeForm: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ /******************************************************************************\ * * * Forward Declarations * * * \******************************************************************************/ // Forward declaration of class ns1__GeoIP. class ns1__GeoIP; // Forward declaration of class _ns1__GetGeoIP. class _ns1__GetGeoIP; // Forward declaration of class _ns1__GetGeoIPResponse. class _ns1__GetGeoIPResponse; // Forward declaration of class _ns1__GetGeoIPContext. class _ns1__GetGeoIPContext; // Forward declaration of class _ns1__GetGeoIPContextResponse. class _ns1__GetGeoIPContextResponse; /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://www.webservicex.net/ * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://www.webservicex.net/ * * * \******************************************************************************/ /// @brief "http://www.webservicex.net/":GeoIP is a complexType. /// /// class ns1__GeoIP operations: /// - ns1__GeoIP* soap_new_ns1__GeoIP(soap*) allocate /// - ns1__GeoIP* soap_new_ns1__GeoIP(soap*, int num) allocate array /// - ns1__GeoIP* soap_new_req_ns1__GeoIP(soap*, ...) allocate, set required members /// - ns1__GeoIP* soap_new_set_ns1__GeoIP(soap*, ...) allocate, set all public members /// - ns1__GeoIP::soap_default(soap*) reset members to default /// - int soap_read_ns1__GeoIP(soap*, ns1__GeoIP*) deserialize from a stream /// - int soap_write_ns1__GeoIP(soap*, ns1__GeoIP*) serialize to a stream /// - ns1__GeoIP* ns1__GeoIP::soap_dup(soap*) returns deep copy of ns1__GeoIP, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - ns1__GeoIP::soap_del() deep deletes ns1__GeoIP data members, use only after ns1__GeoIP::soap_dup(NULL) (use soapcpp2 -Ed) class ns1__GeoIP { public: /// Element "ReturnCode" of XSD type xs:int. int ReturnCode 1; ///< Required element. /// Element "IP" of XSD type xs:string. std::string* IP 0; ///< Optional element. /// Element "ReturnCodeDetails" of XSD type xs:string. std::string* ReturnCodeDetails 0; ///< Optional element. /// Element "CountryName" of XSD type xs:string. std::string* CountryName 0; ///< Optional element. /// Element "CountryCode" of XSD type xs:string. std::string* CountryCode 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://www.webservicex.net/":GetGeoIP /// @brief "http://www.webservicex.net/":GetGeoIP is a complexType. /// /// class _ns1__GetGeoIP operations: /// - _ns1__GetGeoIP* soap_new__ns1__GetGeoIP(soap*) allocate /// - _ns1__GetGeoIP* soap_new__ns1__GetGeoIP(soap*, int num) allocate array /// - _ns1__GetGeoIP* soap_new_req__ns1__GetGeoIP(soap*, ...) allocate, set required members /// - _ns1__GetGeoIP* soap_new_set__ns1__GetGeoIP(soap*, ...) allocate, set all public members /// - _ns1__GetGeoIP::soap_default(soap*) reset members to default /// - int soap_read__ns1__GetGeoIP(soap*, _ns1__GetGeoIP*) deserialize from a stream /// - int soap_write__ns1__GetGeoIP(soap*, _ns1__GetGeoIP*) serialize to a stream /// - _ns1__GetGeoIP* _ns1__GetGeoIP::soap_dup(soap*) returns deep copy of _ns1__GetGeoIP, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _ns1__GetGeoIP::soap_del() deep deletes _ns1__GetGeoIP data members, use only after _ns1__GetGeoIP::soap_dup(NULL) (use soapcpp2 -Ed) class _ns1__GetGeoIP { public: /// Element "IPAddress" of XSD type xs:string. std::string* IPAddress 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://www.webservicex.net/":GetGeoIPResponse /// @brief "http://www.webservicex.net/":GetGeoIPResponse is a complexType. /// /// class _ns1__GetGeoIPResponse operations: /// - _ns1__GetGeoIPResponse* soap_new__ns1__GetGeoIPResponse(soap*) allocate /// - _ns1__GetGeoIPResponse* soap_new__ns1__GetGeoIPResponse(soap*, int num) allocate array /// - _ns1__GetGeoIPResponse* soap_new_req__ns1__GetGeoIPResponse(soap*, ...) allocate, set required members /// - _ns1__GetGeoIPResponse* soap_new_set__ns1__GetGeoIPResponse(soap*, ...) allocate, set all public members /// - _ns1__GetGeoIPResponse::soap_default(soap*) reset members to default /// - int soap_read__ns1__GetGeoIPResponse(soap*, _ns1__GetGeoIPResponse*) deserialize from a stream /// - int soap_write__ns1__GetGeoIPResponse(soap*, _ns1__GetGeoIPResponse*) serialize to a stream /// - _ns1__GetGeoIPResponse* _ns1__GetGeoIPResponse::soap_dup(soap*) returns deep copy of _ns1__GetGeoIPResponse, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _ns1__GetGeoIPResponse::soap_del() deep deletes _ns1__GetGeoIPResponse data members, use only after _ns1__GetGeoIPResponse::soap_dup(NULL) (use soapcpp2 -Ed) class _ns1__GetGeoIPResponse { public: /// Element "GetGeoIPResult" of XSD type "http://www.webservicex.net/":GeoIP. ns1__GeoIP* GetGeoIPResult 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://www.webservicex.net/":GetGeoIPContext /// @brief "http://www.webservicex.net/":GetGeoIPContext is a complexType. /// /// class _ns1__GetGeoIPContext operations: /// - _ns1__GetGeoIPContext* soap_new__ns1__GetGeoIPContext(soap*) allocate /// - _ns1__GetGeoIPContext* soap_new__ns1__GetGeoIPContext(soap*, int num) allocate array /// - _ns1__GetGeoIPContext* soap_new_req__ns1__GetGeoIPContext(soap*, ...) allocate, set required members /// - _ns1__GetGeoIPContext* soap_new_set__ns1__GetGeoIPContext(soap*, ...) allocate, set all public members /// - _ns1__GetGeoIPContext::soap_default(soap*) reset members to default /// - int soap_read__ns1__GetGeoIPContext(soap*, _ns1__GetGeoIPContext*) deserialize from a stream /// - int soap_write__ns1__GetGeoIPContext(soap*, _ns1__GetGeoIPContext*) serialize to a stream /// - _ns1__GetGeoIPContext* _ns1__GetGeoIPContext::soap_dup(soap*) returns deep copy of _ns1__GetGeoIPContext, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _ns1__GetGeoIPContext::soap_del() deep deletes _ns1__GetGeoIPContext data members, use only after _ns1__GetGeoIPContext::soap_dup(NULL) (use soapcpp2 -Ed) class _ns1__GetGeoIPContext { public: /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://www.webservicex.net/":GetGeoIPContextResponse /// @brief "http://www.webservicex.net/":GetGeoIPContextResponse is a complexType. /// /// class _ns1__GetGeoIPContextResponse operations: /// - _ns1__GetGeoIPContextResponse* soap_new__ns1__GetGeoIPContextResponse(soap*) allocate /// - _ns1__GetGeoIPContextResponse* soap_new__ns1__GetGeoIPContextResponse(soap*, int num) allocate array /// - _ns1__GetGeoIPContextResponse* soap_new_req__ns1__GetGeoIPContextResponse(soap*, ...) allocate, set required members /// - _ns1__GetGeoIPContextResponse* soap_new_set__ns1__GetGeoIPContextResponse(soap*, ...) allocate, set all public members /// - _ns1__GetGeoIPContextResponse::soap_default(soap*) reset members to default /// - int soap_read__ns1__GetGeoIPContextResponse(soap*, _ns1__GetGeoIPContextResponse*) deserialize from a stream /// - int soap_write__ns1__GetGeoIPContextResponse(soap*, _ns1__GetGeoIPContextResponse*) serialize to a stream /// - _ns1__GetGeoIPContextResponse* _ns1__GetGeoIPContextResponse::soap_dup(soap*) returns deep copy of _ns1__GetGeoIPContextResponse, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _ns1__GetGeoIPContextResponse::soap_del() deep deletes _ns1__GetGeoIPContextResponse data members, use only after _ns1__GetGeoIPContextResponse::soap_dup(NULL) (use soapcpp2 -Ed) class _ns1__GetGeoIPContextResponse { public: /// Element "GetGeoIPContextResult" of XSD type "http://www.webservicex.net/":GeoIP. ns1__GeoIP* GetGeoIPContextResult 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /******************************************************************************\ * * * Additional Top-Level Elements * * http://www.webservicex.net/ * * * \******************************************************************************/ /// @brief Top-level root element "http://www.webservicex.net/":GeoIP of XSD type "http://www.webservicex.net/":GeoIP. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /******************************************************************************\ * * * Additional Top-Level Attributes * * http://www.webservicex.net/ * * * \******************************************************************************/ /******************************************************************************\ * * * Services * * * \******************************************************************************/ // This service supports SOAP 1.2 namespaces: #import "soap12.h" //gsoap ns1 service name: GeoIPServiceSoap //gsoap ns1 service type: GeoIPServiceSoap //gsoap ns1 service port: http://www.webservicex.net/geoipservice.asmx //gsoap ns1 service namespace: http://www.webservicex.net/ //gsoap ns1 service transport: http://schemas.xmlsoap.org/soap/http /** @mainpage Service Definitions @section Service_bindings Service Bindings - @ref GeoIPServiceSoap @section Service_more More Information - @ref page_notes "Notes" - @ref page_XMLDataBinding "XML Data Binding" - @ref SOAP_ENV__Header "SOAP Header Content" (when applicable) - @ref SOAP_ENV__Detail "SOAP Fault Detail Content" (when applicable) */ /** @page GeoIPServiceSoap Binding "GeoIPServiceSoap" @section GeoIPServiceSoap_operations Operations of Binding "GeoIPServiceSoap" - @ref __ns1__GetGeoIP - @ref __ns1__GetGeoIPContext - @ref __ns1__GetGeoIP_ - @ref __ns1__GetGeoIPContext_ @section GeoIPServiceSoap_ports Default endpoints of Binding "GeoIPServiceSoap" - http://www.webservicex.net/geoipservice.asmx @note Multiple service bindings collected as one, use wsdl2h option -Nname to produce a separate service for each binding */ /******************************************************************************\ * * * Service Binding * * GeoIPServiceSoap * * * \******************************************************************************/ /******************************************************************************\ * * * Service Operation * * __ns1__GetGeoIP * * * \******************************************************************************/ /** Operation "__ns1__GetGeoIP" of service binding "GeoIPServiceSoap". GeoIPService - GetGeoIP enables you to easily look up countries by IP addresses - SOAP document/literal style messaging - Default endpoints: - http://www.webservicex.net/geoipservice.asmx - Default SOAP action or REST location path: - "http://www.webservicex.net/GetGeoIP" - Addressing input action: "http://www.webservicex.net/GetGeoIP" - Addressing output action: "http://www.webservicex.net/GetGeoIPResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__GetGeoIP( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _ns1__GetGeoIP* ns1__GetGeoIP, // output parameters: _ns1__GetGeoIPResponse &ns1__GetGeoIPResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__GetGeoIP( struct soap *soap, // input parameters: _ns1__GetGeoIP* ns1__GetGeoIP, // output parameters: _ns1__GetGeoIPResponse &ns1__GetGeoIPResponse ); @endcode C++ proxy class (defined in soapGeoIPServiceSoapProxy.h generated with soapcpp2): @code class GeoIPServiceSoapProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapGeoIPServiceSoapService.h generated with soapcpp2): @code class GeoIPServiceSoapService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns1 service method-protocol: GetGeoIP SOAP //gsoap ns1 service method-style: GetGeoIP document //gsoap ns1 service method-encoding: GetGeoIP literal //gsoap ns1 service method-input-action: GetGeoIP http://www.webservicex.net/GetGeoIP //gsoap ns1 service method-output-action: GetGeoIP http://www.webservicex.net/GetGeoIPResponse int __ns1__GetGeoIP( _ns1__GetGeoIP* ns1__GetGeoIP, ///< Input parameter _ns1__GetGeoIPResponse &ns1__GetGeoIPResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __ns1__GetGeoIPContext * * * \******************************************************************************/ /** Operation "__ns1__GetGeoIPContext" of service binding "GeoIPServiceSoap". GeoIPService - GetGeoIPContext enables you to easily look up countries by Context - SOAP document/literal style messaging - Default endpoints: - http://www.webservicex.net/geoipservice.asmx - Default SOAP action or REST location path: - "http://www.webservicex.net/GetGeoIPContext" - Addressing input action: "http://www.webservicex.net/GetGeoIPContext" - Addressing output action: "http://www.webservicex.net/GetGeoIPContextResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__GetGeoIPContext( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _ns1__GetGeoIPContext* ns1__GetGeoIPContext, // output parameters: _ns1__GetGeoIPContextResponse &ns1__GetGeoIPContextResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__GetGeoIPContext( struct soap *soap, // input parameters: _ns1__GetGeoIPContext* ns1__GetGeoIPContext, // output parameters: _ns1__GetGeoIPContextResponse &ns1__GetGeoIPContextResponse ); @endcode C++ proxy class (defined in soapGeoIPServiceSoapProxy.h generated with soapcpp2): @code class GeoIPServiceSoapProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapGeoIPServiceSoapService.h generated with soapcpp2): @code class GeoIPServiceSoapService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns1 service method-protocol: GetGeoIPContext SOAP //gsoap ns1 service method-style: GetGeoIPContext document //gsoap ns1 service method-encoding: GetGeoIPContext literal //gsoap ns1 service method-input-action: GetGeoIPContext http://www.webservicex.net/GetGeoIPContext //gsoap ns1 service method-output-action: GetGeoIPContext http://www.webservicex.net/GetGeoIPContextResponse int __ns1__GetGeoIPContext( _ns1__GetGeoIPContext* ns1__GetGeoIPContext, ///< Input parameter _ns1__GetGeoIPContextResponse &ns1__GetGeoIPContextResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __ns1__GetGeoIP_ * * * \******************************************************************************/ /** Operation "__ns1__GetGeoIP_" of service binding "GeoIPServiceSoap". GeoIPService - GetGeoIP enables you to easily look up countries by IP addresses - SOAP document/literal style messaging - Default endpoints: - http://www.webservicex.net/geoipservice.asmx - Default SOAP action or REST location path: - "http://www.webservicex.net/GetGeoIP" - Addressing input action: "http://www.webservicex.net/GetGeoIP" - Addressing output action: "http://www.webservicex.net/GetGeoIPResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__GetGeoIP_( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _ns1__GetGeoIP* ns1__GetGeoIP, // output parameters: _ns1__GetGeoIPResponse &ns1__GetGeoIPResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__GetGeoIP_( struct soap *soap, // input parameters: _ns1__GetGeoIP* ns1__GetGeoIP, // output parameters: _ns1__GetGeoIPResponse &ns1__GetGeoIPResponse ); @endcode C++ proxy class (defined in soapGeoIPServiceSoapProxy.h generated with soapcpp2): @code class GeoIPServiceSoapProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapGeoIPServiceSoapService.h generated with soapcpp2): @code class GeoIPServiceSoapService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns1 service method-protocol: GetGeoIP_ SOAP //gsoap ns1 service method-style: GetGeoIP_ document //gsoap ns1 service method-encoding: GetGeoIP_ literal //gsoap ns1 service method-input-action: GetGeoIP_ http://www.webservicex.net/GetGeoIP //gsoap ns1 service method-output-action: GetGeoIP_ http://www.webservicex.net/GetGeoIPResponse int __ns1__GetGeoIP_( _ns1__GetGeoIP* ns1__GetGeoIP, ///< Input parameter _ns1__GetGeoIPResponse &ns1__GetGeoIPResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __ns1__GetGeoIPContext_ * * * \******************************************************************************/ /** Operation "__ns1__GetGeoIPContext_" of service binding "GeoIPServiceSoap". GeoIPService - GetGeoIPContext enables you to easily look up countries by Context - SOAP document/literal style messaging - Default endpoints: - http://www.webservicex.net/geoipservice.asmx - Default SOAP action or REST location path: - "http://www.webservicex.net/GetGeoIPContext" - Addressing input action: "http://www.webservicex.net/GetGeoIPContext" - Addressing output action: "http://www.webservicex.net/GetGeoIPContextResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__GetGeoIPContext_( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _ns1__GetGeoIPContext* ns1__GetGeoIPContext, // output parameters: _ns1__GetGeoIPContextResponse &ns1__GetGeoIPContextResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__GetGeoIPContext_( struct soap *soap, // input parameters: _ns1__GetGeoIPContext* ns1__GetGeoIPContext, // output parameters: _ns1__GetGeoIPContextResponse &ns1__GetGeoIPContextResponse ); @endcode C++ proxy class (defined in soapGeoIPServiceSoapProxy.h generated with soapcpp2): @code class GeoIPServiceSoapProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapGeoIPServiceSoapService.h generated with soapcpp2): @code class GeoIPServiceSoapService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns1 service method-protocol: GetGeoIPContext_ SOAP //gsoap ns1 service method-style: GetGeoIPContext_ document //gsoap ns1 service method-encoding: GetGeoIPContext_ literal //gsoap ns1 service method-input-action: GetGeoIPContext_ http://www.webservicex.net/GetGeoIPContext //gsoap ns1 service method-output-action: GetGeoIPContext_ http://www.webservicex.net/GetGeoIPContextResponse int __ns1__GetGeoIPContext_( _ns1__GetGeoIPContext* ns1__GetGeoIPContext, ///< Input parameter _ns1__GetGeoIPContextResponse &ns1__GetGeoIPContextResponse ///< Output parameter ); /** @page GeoIPServiceSoap Binding "GeoIPServiceSoap" @section GeoIPServiceSoap_policy_enablers Policy Enablers of Binding "GeoIPServiceSoap" None specified. */ /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. Data can be read and deserialized from: - an int file descriptor, using soap->recvfd = fd - a socket, using soap->socket = (int)... - a C++ stream (istream, stringstream), using soap->is = (istream*)... - a C string, using soap->is = (const char*)... - any input, using the soap->frecv() callback Data can be serialized and written to: - an int file descriptor, using soap->sendfd = (int)... - a socket, using soap->socket = (int)... - a C++ stream (ostream, stringstream), using soap->os = (ostream*)... - a C string, using soap->os = (const char**)... - any output, using the soap->fsend() callback The following options are available for (de)serialization control: - soap->encodingStyle = NULL; to remove SOAP 1.1/1.2 encodingStyle - soap_mode(soap, SOAP_XML_TREE); XML without id-ref (no cycles!) - soap_mode(soap, SOAP_XML_GRAPH); XML with id-ref (including cycles) - soap_set_namespaces(soap, struct Namespace *nsmap); to set xmlns bindings @section ns1 Top-level root elements of schema "http://www.webservicex.net/" - @ref _ns1__GetGeoIP @code // Reader (returns SOAP_OK on success): soap_read__ns1__GetGeoIP(struct soap*, _ns1__GetGeoIP*); // Writer (returns SOAP_OK on success): soap_write__ns1__GetGeoIP(struct soap*, _ns1__GetGeoIP*); @endcode - @ref _ns1__GetGeoIPResponse @code // Reader (returns SOAP_OK on success): soap_read__ns1__GetGeoIPResponse(struct soap*, _ns1__GetGeoIPResponse*); // Writer (returns SOAP_OK on success): soap_write__ns1__GetGeoIPResponse(struct soap*, _ns1__GetGeoIPResponse*); @endcode - @ref _ns1__GetGeoIPContext @code // Reader (returns SOAP_OK on success): soap_read__ns1__GetGeoIPContext(struct soap*, _ns1__GetGeoIPContext*); // Writer (returns SOAP_OK on success): soap_write__ns1__GetGeoIPContext(struct soap*, _ns1__GetGeoIPContext*); @endcode - @ref _ns1__GetGeoIPContextResponse @code // Reader (returns SOAP_OK on success): soap_read__ns1__GetGeoIPContextResponse(struct soap*, _ns1__GetGeoIPContextResponse*); // Writer (returns SOAP_OK on success): soap_write__ns1__GetGeoIPContextResponse(struct soap*, _ns1__GetGeoIPContextResponse*); @endcode - (use wsdl2h option -g to auto-generate type _ns1__GeoIP) */ /* End of GeoIPService.h */ gsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/0000755000175000017500000000000013525564140021074 5ustar ellertellertgsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/0000755000175000017500000000000013525564140021736 5ustar ellertellertgsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/main.mm0000644000175000017500000000041313525245161023212 0ustar ellertellert// // main.m // #import #import "AppDelegate.h" #include "../../GeoIPServiceSoap.nsmap" int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } gsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/ViewController.mm0000644000175000017500000000631713525245161025255 0ustar ellertellert// // ViewController.mm // #import "ViewController.h" #include "soapGeoIPServiceSoapProxy.h" #import "soapStub.h" #import "gsoapios.h" using namespace std; //@interface ViewController () //@end typedef struct _ns1__GetGeoIP RequestStruct; typedef struct _ns1__GetGeoIPResponse ResponseStruct; @implementation ViewController @synthesize IPAddress; - (IBAction)buttonPressed:(id)sender { RequestStruct ip; ResponseStruct response; //creates proxy GeoIPServiceSoapProxy service(SOAP_IO_DEFAULT|SOAP_IO_KEEPALIVE|SOAP_XML_INDENT|SOAP_XML_STRICT); soap_init(service.soap); //sets IPAddress from input std::string ipAdd = std::string((char *)[IPAddress.text UTF8String]); ip.IPAddress = &ipAdd; // ----- register plugin for callbacks ------ soap_register_plugin(service.soap, soap_ios); // Optional: timeout internal, the default is 60.0 seconds soap_ios_settimeoutinterval(service.soap, 30.0); //call web service int status = service.GetGeoIP(&ip, response); string* result; string err_msg = "Invalid IP address"; if ( status == SOAP_OK) { NSString *soapResult; NSString *titleMsg; if(response.GetGeoIPResult && response.GetGeoIPResult->CountryName) { result = response.GetGeoIPResult->CountryName; } else { result = &err_msg; } soapResult = [NSString stringWithUTF8String:result->c_str()]; titleMsg = [NSString stringWithFormat: @"%@", @"Country Found"]; //show result as an alert UIAlertController * alert = [UIAlertController alertControllerWithTitle:titleMsg message:soapResult preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction* cancelButton = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action){}]; [alert addAction: cancelButton]; [self presentViewController:alert animated:YES completion:nil]; } else { service.soap_stream_fault(std::cerr); } service.destroy(); } // Override to allow orientations other than the default portrait orientation. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown || interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight); } - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } - (void)viewDidUnload { // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; } - (void)dealloc { // [ipAddress release]; // [super dealloc]; } @end gsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/AppDelegate.mm0000644000175000017500000000365513525245161024454 0ustar ellertellert// // AppDelegate.mm // #import "AppDelegate.h" #import "ViewController.h" @implementation AppDelegate @synthesize window; @synthesize viewController; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. return YES; } - (void)applicationWillResignActive:(UIApplication *)application { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. } - (void)applicationDidEnterBackground:(UIApplication *)application { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. } - (void)applicationWillEnterForeground:(UIApplication *)application { // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. } - (void)applicationDidBecomeActive:(UIApplication *)application { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. } - (void)applicationWillTerminate:(UIApplication *)application { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } @end gsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/Assets.xcassets/0000755000175000017500000000000013525245161025033 5ustar ellertellertgsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/Assets.xcassets/AppIcon.appiconset/0000755000175000017500000000000013525245161030530 5ustar ellertellert././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/Assets.xcassets/AppIcon.appiconset/Contents.jsongsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/Assets.xcassets/AppIcon.appiconset/Contents.js0000644000175000017500000000206513525245161032666 0ustar ellertellert{ "images" : [ { "idiom" : "iphone", "size" : "29x29", "scale" : "2x" }, { "idiom" : "iphone", "size" : "29x29", "scale" : "3x" }, { "idiom" : "iphone", "size" : "40x40", "scale" : "2x" }, { "idiom" : "iphone", "size" : "40x40", "scale" : "3x" }, { "idiom" : "iphone", "size" : "60x60", "scale" : "2x" }, { "idiom" : "iphone", "size" : "60x60", "scale" : "3x" }, { "idiom" : "ipad", "size" : "29x29", "scale" : "1x" }, { "idiom" : "ipad", "size" : "29x29", "scale" : "2x" }, { "idiom" : "ipad", "size" : "40x40", "scale" : "1x" }, { "idiom" : "ipad", "size" : "40x40", "scale" : "2x" }, { "idiom" : "ipad", "size" : "76x76", "scale" : "1x" }, { "idiom" : "ipad", "size" : "76x76", "scale" : "2x" } ], "info" : { "version" : 1, "author" : "xcode" } }gsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/GeoIPService.xcodeproj/0000755000175000017500000000000013525245161026215 5ustar ellertellertgsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/GeoIPService.xcodeproj/project.xcworkspace/0000755000175000017500000000000013525245161032213 5ustar ellertellert././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/GeoIPService.xcodeproj/project.xcworkspace/contents.xcworkspacedatagsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/GeoIPService.xcodeproj/project.xcworkspace/con0000644000175000017500000000031413525245161032713 0ustar ellertellert ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/GeoIPService.xcodeproj/project.xcworkspace/xcuserdata/gsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/GeoIPService.xcodeproj/project.xcworkspace/xcu0000755000175000017500000000000013525245161032733 5ustar ellertellert././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/GeoIPService.xcodeproj/project.xcworkspace/xcuserdata/bethanysanders.xcuserdatad/gsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/GeoIPService.xcodeproj/project.xcworkspace/xcu0000755000175000017500000000000013525245161032733 5ustar ellertellert././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/GeoIPService.xcodeproj/project.xcworkspace/xcuserdata/bethanysanders.xcuserdatad/UserInterfaceState.xcuserstategsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/GeoIPService.xcodeproj/project.xcworkspace/xcu0000644000175000017500000006657313525245161032756 0ustar ellertellertbplist00 2 3X$versionX$objectsY$archiverT$top'()*+,-./39QRSTUVWXYZ[\]uvwxyz{|}~      !"#$%&*016>?@HIJK[\]^_`aeimqrvw{   $6789:;<=>JKLMNOPQW\bcdjklpqrstx|} "&*+,059=AGLTU]^lmnopq #&,2:;<DEFNOWXYZnopqrstuv  $)*+34567;GHIJKQV^_`abjk{|}~   !%&*+/0459:>?KLMNOPQR^_`abcdeqrst  !"#/01=>?@LMNO[\]^jkltxy}~ %+/59?CIJPQRfghijklmnopqrsy}~          " # ' ( , - 1U$null WNS.keysZNS.objectsV$class R@_$3B3917D7-FE42-4400-A5CE-8F96E6580EA1_IDEWorkspaceDocument &  ! $% 14^IDEWindowFrame_!IDEOrderedWorkspaceTabControllers_>IDEWorkspaceTabController_89BFACBA-62A5-4D74-85D1-75DCD1C96324_,IDEWorkspaceWindowControllerUniqueIdentifier_IDEActiveWorkspaceTabController_IDEWindowToolbarIsVisible_IDEWindowTabBarIsVisible_{{4, 0}, {1397, 877}} 024567Z$classnameX$classesWNSArray68XNSObject :E&;<=>?@ABCDF$HIJKL$NODNQ24[IDETabLabel_IDEShowNavigator]IDEEditorArea_-IDEWorkspaceTabControllerUtilityAreaSplitView_IDENavigatorArea_,IDEWorkspaceTabControllerDesignAreaSplitView\ViewDebugger_IDEShowUtilities^IDETabFilePath_AssistantEditorsLayout_GeoIPService.xcodeproj ^i&_`abcdefgh !"#$%&jk%$OOpqrs'E1224_IDEDefaultDebugArea_IDEEditorMode_Standard_ShowDebuggerArea]IDEShowEditor_VersionEditorSubmodeZEditorMode_DebuggerSplitView_IDEEditorMode_Genius_ DefaultPersistentRepresentationsZlayoutTree &()*+,5784XLeftViewYRightViewZLayoutMode_IDESplitViewDebugArea &-./0%O$1234_VariablesViewShowsRawValues_VariablesViewSelectedScope_ VariablesViewViewSortDescriptors_VariablesViewShowsType 245_NSMutableDictionary8\NSDictionary &6O24_ConsoleFilterMode &9:4_DVTSplitViewItems ;AD <=€>?@]DVTIdentifier_DVTViewMagnitudeXLeftView#@w45ɢ8 <=ЀBC@YRightView#@~45^NSMutableArray68 &ـFۀG4_%EditorLayout_PersistentRepresentation &HI4TMain JKLOM2@_)EditorLayout_StateSavingStateDictionaries_EditorLayout_Selected_EditorLayout_Geometry 2N &OPQRSTUVW4\FileDataType[EditorState_ArchivableRepresentation_NavigableItemName_DocumentNavigableItemName_DocumentExtensionIdentifier[DocumentURL_com.apple.xcode.project XYZ[\]^_hix@_&Xcode3ProjectEditor_Xcode3TargetEditor_(Xcode3ProjectEditor.sourceList.splitview_,Xcode3ProjectEditorPreviousTargetEditorClass_+Xcode3ProjectEditor_Xcode3BuildPhasesEditor_,Xcode3ProjectEditorSelectedDocumentLocations_-Xcode3ProjectEditor_Xcode3BuildSettingsEditor '(&4 +-&,`.a4_DVTSplitViewItems 234beD 7:<=;?_#IDEWorkspaceTabControllerLayoutTree@8_#IDEWorkspaceTabControllerLayoutTree BD&9E4 HIJD MP<=ERf@#@ VY<=E[f@#@n _e&`abcd    fghij "-454_ Xcode.IDEKit.Navigator.Structure_"Xcode.IDEKit.Navigator.Breakpoints_Xcode.IDEKit.Navigator.Debug_SelectedNavigator_Xcode.IDEKit.Navigator.Issues ry&stuvwxz{%%~11 4_IDEExpandedItemsTree_,IDENavigatorExpandedItemsBeforeFilteringTree_!IDERecentDocumentFilteringEnabled_IDESCMStatusFilteringEnabled^IDEVisibleRect_IDESelectedTree @_IDEValuesAsTree &4\GeoIPService &4PTapp2 &4_Supporting Files @ &4_{{0, 0}, {259, 782}} !@ &4 &ā#$%&%Ɂ'1(+4^IDEVisibleRect_%IDEBreakpointNavigatorFilterOnEnabled_IDESelectedTree_IDECollapsedtemsTree_{{0, 0}, {259, 782}} ҁ)ԁ*@_IDEValuesAsTree &4 ҁ)߁,@ &4 &./01%%11234_IDEShowOnlyInterestingContent_IDEShowOnlyRunningBlocks^IDEVisibleRect_IDEStackCompressionValue_{{0, 0}, {259, 782}}_ Xcode.IDEKit.Navigator.Structure &w6789:;<=%%  % 1>?@1AB1C4_IDEErrorFilteringEnabled_IDECollapsedFiles_IDEExpandedIssues^IDEShowsByType_IDESelectedNavigables_IDECollapsedTypes_IDERecentFilteringEnabled_IDECollapsedGroups_{{0, 0}, {259, 753}} pu pu D !pu $pu ')&9*E4 -./0FILD 36<=78GH@_IDENavigatorArea#@p@ =@<=ABJK@]IDEEditorArea#@h GJ<=K8MH@_IDEUtilitiesArea PS&QROP$$4_ShowsOnlyVisibleViewObjects_ShowsOnlyInterestingViewObjects_J/Users/bethanysanders/Documents/work/app2/app2/app2/GeoIPService.xcodeproj [d&\]^_`abcSTUVWXYZ$fghijkl[sv4_BreakpointsActivated_DefaultEditorStatesForURLs\ActiveScheme_ActiveRunDestination_DefaultEditorFrameSizeForURLs_0LastCompletedPersistentSchemeBasedActivityReport_DocumentWindows_RecentEditorDocumentURLs w}&xy3|\]ƀ^~_i;[4_'Xcode.IDEKit.EditorDocument.PlistEditor_7Xcode.Xcode3ProjectSupport.EditorDocument.Xcode3Project_'Xcode.IDEKit.EditorDocument.LogDocument &`b4 a_Efile:///Users/bethanysanders/Documents/work/app2/app2/app2/Info.plist &cde3fg4_IDE_PLIST_EDITOR_SELECTION_KEY_ IDE_PLIST_EDITOR_VISIBLERECT_KEY_IDE_PLIST_EDITOR_EXPANSION_KEY_{{0, 0}, {877, 787}} phu D &jkmoy4 z l_Lfile:///Users/bethanysanders/Documents/work/app2/app2/GeoIPService.xcodeproj n_Dfile:///Users/bethanysanders/Documents/work/app2/app2/app2.xcodeproj &ZY[\]Xp_iq^4_Xcode3BuildPhasesEditor 2ҁr tsz#Ac9K &ހ}~uvw4_ Xcode3BuildPhasesEditorLocations_Xcode3BuildPhasesEditor 2x &4 &z{|}~4_(Xcode3ProjectEditor.sourceList.splitview_,Xcode3ProjectEditorPreviousTargetEditorClass_,Xcode3ProjectEditorSelectedDocumentLocations_&Xcode3ProjectEditor_Xcode3TargetEditor &4_DVTSplitViewItems D    <d@]DVTIdentifier_DVTViewMagnitude_!sourceListSplitViewItemIdentifier   @P#@`_Xcode3TargetEditor !2" %&'_Lfile:///Users/bethanysanders/Documents/work/app2/app2/GeoIPService.xcodeproj#AJ ,/&-.014VEditorVTarget_Xcode3TargetEditor\GeoIPService 89&4 <A&=>?@BCDE4_(Xcode3ProjectEditor.sourceList.splitview_+Xcode3ProjectEditor_Xcode3BuildPhasesEditor_,Xcode3ProjectEditorSelectedDocumentLocations_,Xcode3ProjectEditorPreviousTargetEditorClass LN&9O4 RSTD WZXY[\@]DVTIdentifier_DVTViewMagnitude_!sourceListSplitViewItemIdentifier#@e@ cfXYh@#@( ls&mnopqrtuvwXyv4_58BCAD791D4A7B12009ED67E_58BCAD761D4A7B12009ED67E_58BCAD781D4A7B12009ED67E_+Xcode3BuildPhasesEditorDisclosedNamesKey2.0_&kXcode3BuildPhasesEditorScrollPointKey_58BCAD771D4A7B12009ED67E &4 &4 &4 pu_Link Binary With Libraries &4 2 _Efile:///Users/bethanysanders/Documents/work/app2/app2/app2.xcodeproj/#AJ}0 &-.4_ Xcode3BuildPhasesEditorLocations_Xcode3BuildPhasesEditor 2 &4_Xcode3BuildPhasesEditor &ʁÁŁǁɁˁ́ρсӁՁׁفہݯށ߁ %),0484 _Cfile:///Users/bethanysanders/Downloads/gsoap-2.8/gsoap/stdsoap2.cpp _:file:///Users/bethanysanders/Documents/work/app2/soapC.cpp _;file:///Users/bethanysanders/Documents/work/app2/soapStub.h _Wfile:///Users/bethanysanders/Downloads/gsoap-2.8/gsoap/ios_plugin/ios_plugin/gsoapios.h _Kfile:///Users/bethanysanders/Documents/work/app2/app2/app2/ViewController.m _Afile:///Users/bethanysanders/Documents/work/app2/app2/app2/main.m _Afile:///Users/bethanysanders/Downloads/gsoap-2.8/gsoap/stdsoap2.h _Lfile:///Users/bethanysanders/Documents/work/app2/soapGeoIPServiceSoapProxy.h  _Efile:///Users/bethanysanders/Documents/work/app2/app2/app2/Info.plist _Ifile:///Users/bethanysanders/Documents/work/app2/app2/app2/AppDelegate.mm _Lfile:///Users/bethanysanders/Documents/work/app2/app2/app2/ViewController.mm _8file:///Users/bethanysanders/Documents/work/app2/soapH.h _Xfile:///Users/bethanysanders/Downloads/gsoap-2.8/gsoap/ios_plugin/ios_plugin/gsoapios.mm $_Bfile:///Users/bethanysanders/Documents/work/app2/app2/app2/main.mm )_Hfile:///Users/bethanysanders/Documents/work/app2/app2/app2/AppDelegate.m ._Nfile:///Users/bethanysanders/Documents/work/app2/soapGeoIPServiceSoapProxy.cpp 3_Hfile:///Users/bethanysanders/Documents/work/app2/app2/app2/AppDelegate.h 8_Kfile:///Users/bethanysanders/Documents/work/app2/app2/app2/ViewController.h =_Gfile:///Users/bethanysanders/Documents/work/app2/GeoIPServiceSoap.nsmap @E&ABCDFG%I14_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRange]HideAllIssues_%PrimaryDocumentSelectedCharacterRange#A[2\{1328, 2032}Y{2583, 2} SX&TUVWYZ%\14_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRange]HideAllIssues_%PrimaryDocumentSelectedCharacterRange#A[XZY{0, 1885}W{58, 0} fk&TUVWlm%o14#A[N$̼Y{0, 2766}W{13, 0} uz&vwxy{|%~14_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRange]HideAllIssues_%PrimaryDocumentSelectedCharacterRange#AYlY{0, 2513}Y{5955, 0} &@ABC%X1v4#AJ| X{0, 499} &@ABC%X1v4#AJ~X{0, 339} &TUVW%14#A[]zY{0, 2650}Y{2459, 0} &TUVW%14#A[RΞY{0, 3459}W{30, 0} &Ɓ    %ˁ14_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRange]HideAllIssues_%PrimaryDocumentSelectedCharacterRange#ARtC&Y{0, 1614}Z{175, 115} &TUVW%ށ14#A[GgY{0, 1965}W{20, 0} &TUVW%14#A[E'Y{0, 1730}W{24, 0} &TUVW%14#A[PReY{0, 2286}W{10, 0} & ! % "#1$4_PrimaryDocumentTimestamp_$PrimaryDocumentVisibleCharacterRange]HideAllIssues_%PrimaryDocumentSelectedCharacterRange#Ac3Y{0, 2646}V{2, 0} &TUVW%&'1(4#A[CaX{0, 267}W{18, 0} $)&@ABC*+%X*+1v4#AJ{MY{0, 2036} 27&TUVW89%;-.1/4#A[T>Y{0, 2048}X{0, 639} AF&TUVWGH%J12134#A[I\X{0, 321}W{22, 0} PU&TUVWVW%Y56174#A[FX{0, 228}W{27, 0} _d&TUVWef%X9:1v4#A[Z9BX{0, 598} mp&no<>qr@H4 w=_]file:///Users/bethanysanders/Documents/work/app2/app2/app2/Base.lproj/LaunchScreen.storyboard |?_Ufile:///Users/bethanysanders/Documents/work/app2/app2/app2/Base.lproj/Main.storyboard &πЀрҀӥ3ցABC4_IBOutlineViewController &ءـ4 &Āۀ܀݀ޤ߁DEG4Y{-3, 400} 2FZ01J-lp-oVM &4 &IJKLMNցMPR4_SelectedMemberIdentifiers_EditedMemberConfiguration_SelectionProvider_#IBStoryboardStructureViewController_IBCanvasViewController 2OZ8bC-Xf-vdC &ÁQـ4_LastKnownOutlineViewWidth &́STUVҀ߁WXZ4ZZoomFactor[CenterPoint_EditedTopLevelMemberIDs_$ObjectIDToLastKnownCanvasPositionMapZ{183, 395} 2ہYZBYZ-38-t0r &4 &\^`bko4 ]_2x-xcode-log://30F0618E-9F03-4310-9671-8C08EE54CA92 __2x-xcode-log://2EF4CF33-5E96-463B-9A5B-EEA196BA0083 a_2x-xcode-log://EAD44649-42B0-4CA6-91D4-1FF027308A40 &cd4_SelectedDocumentLocations 2e   _expandTranscriptYindexPathj]f _NSIndexPathLength_NSIndexPathDatagi WNS.dataCh45]NSMutableData8VNSData45[NSIndexPath8[NSIndexPath45!"_IDELogDocumentLocation#$8_IDELogDocumentLocation_DVTDocumentLocation &(&c)l4 ,2-m  4j_n6 7_NSIndexPathValuei :<&c=p4 @2Aq  G4jrn_2x-xcode-log://EAD44649-42B0-4CA6-91D4-1FF027308A40 KMLtNu@]IDENameStringTapp2 S\TUVWXYZ[wxyz{|}~]$%`abc$1@YtargetSDKZisEligible_targetDeviceIsWireless_targetDeviceLocation_targetArchitecture_targetDeviceFamily_targetDeviceModelCode_targetDeviceIsConcrete_iphonesimulator9.3_>dvtdevice-iphonesimulator:949C3351-857E-4EF6-A71D-9360DB1F9CE8Vx86_64ViPhoneYiPhone8,2 tv&uw4 |_Hfile:///Users/bethanysanders/Documents/work/app2/app2/app2/AppDelegate.m @UwidthVheight#@#@ &4_0IDEActivityReportCompletionSummaryStringSegments_IDEActivityReportOptions_IDEActivityReportTitle D &4_&IDEActivityReportStringSegmentPriority_+IDEActivityReportStringSegmentBackSeparator_)IDEActivityReportStringSegmentStringValue#@c % \GeoIPService &4#@Q UBuild &4#@R: &Ѐ߁4c %  Oabplist00;Troot#-27EKR[boqsu!$-4<ILNPU]`eruz?Áh &݁7774_"IDEActivityReportStringSegmentType_"IDEActivityReportStringSegmentDate_'IDEActivityReportStringSegmentDateStyle_'IDEActivityReportStringSegmentTimeStyle WNS.time#A[^45VNSDate8_8/10/16 at 3:28 PMj\GeoIPService  D    jD  _Xfile:///Users/bethanysanders/Downloads/gsoap-2.8/gsoap/ios_plugin/ios_plugin/gsoapios.mm  _Cfile:///Users/bethanysanders/Downloads/gsoap-2.8/gsoap/stdsoap2.cpp  _Afile:///Users/bethanysanders/Downloads/gsoap-2.8/gsoap/stdsoap2.h  _Gfile:///Users/bethanysanders/Documents/work/app2/GeoIPServiceSoap.nsmap  _:file:///Users/bethanysanders/Documents/work/app2/soapC.cpp  !_Nfile:///Users/bethanysanders/Documents/work/app2/soapGeoIPServiceSoapProxy.cpp  &_Lfile:///Users/bethanysanders/Documents/work/app2/soapGeoIPServiceSoapProxy.h  +_8file:///Users/bethanysanders/Documents/work/app2/soapH.h  0_;file:///Users/bethanysanders/Documents/work/app2/soapStub.h_NSKeyedArchiver 4 5UState"+5:?,CP_acegikm|~/Qm   .0247:=@BEGIUhv   0 I J W l n p r t v x z | ~   1 H k v     , I l     # , 1 3 5 7 D I K M R T V X f y    - : = ? B D F K X _ a c e l n p r t  !#%')6B]q  ;f"/013@CEHJL`inprt!#%')+-:<>@BDFHc~ )*+-:;<>GJLNktDMZacegnprtv}?Ubcdf{%068:<IRqv%*@Ity !&/246MZ]_bdfotvxz  +0249;=?IV]_acjlnpr!#%'4@[o:Hpy #anprt "$-024KX_acelnprt}')+-/13Ok,579;=FHJLNP[g,.02DFSUWY^kmoqz ) 6 8 : < E H J L c p q r t !! !0!!@!B!D!Y![!]!_!a!c!l!o!q!s!!!!!!!!!!!!!!!!!!!!"""B"K"q"v"""""""""""""""""""""## # # #####"#/#:#=#@#C#F#I#T#W#Z#]#`#c#e####$$ $$$ $#$&$)$,$9$<$?$A$C$F$I$K$b$$$$$%%%% %%%"%/%2%5%8%;%=%J%W%\%_%b%g%j%m%o%p%u%%%%%%%%%%%%%%%%%%%%%&&&& & &&&&!&$&&&3&<&?&B&E&H&Q&T&V&Y&\&^&m&&&&&&&&&&'''''' '#'&')','.';'<'='?'L'U'X'['^'a'j'l'n'q't'v''''''(($(7(:(=(@(C(F(I(L(O(R(e(g(j(m(p(r(u(x(z(}((((((()).)E)N)O)Q)Z)[)])f)g)i)r)s)u)~))))))))))))))))))))))))*** * *****&*/*<*A*C*E*J*M*P*R*e*r*w*z*}******++"+3+6+9+<+?+B+E+H+K+\+^+a+d+g+j+m+p+s+u+++++, ,2,M,Z,e,h,k,m,o,r,},,,,,,,,--)-,-/-2-5-7-D-F-H-K------------..&.=.F.I.L.N.W.X.Z.g.n.q.t.w.~............./ ////Z/g/t/v/x/z/|/~/////////////////////0000000000;0U0^0a0d0f0s0t0u0w00000000000001 191b1o1r1u1x1{1}1111111111111111222"2%2(2-202325262?2T2]2`2c2e2v2y2|22222222222233 3!3.3;3<3=3?3L3U3X3[3^3a3j3m3p3s3v3x3344/4<4?4A4D4G4I4R4W4Z4]4_4l4q4t4w4|44444444444444455 555 5#5&5)5,595<5?5B5E5G5J5L5g555566666 6-6.6/616>6?6@6B6K6N6Q6S6p6}6~66666666666667 77777#7&7(7+7-7P7j7s7v7y7{7777777777777777778888 8 8888>8A8D8G8J8M8P8S8V8Y8\8_8b8e8h8k8n8q8t8w8y8888888889$919395989v999999999:F:S:U:W:Z::::::;;;; ;Y;f;h;j;m;;;;;<<"<$<&<)>S>`>b>d>g>>>>>??!?#?%?(?r???????????????@"@+@8@B@O@X@[@^@a@d@m@p@s@u@x@z@@@@@AA AA#A&A)A,A/A8A;A>A@ACAEANAXA`AmAvAyA|AAAAAAAAAAABBB#B-B:BCBEBGBIBKBTBWBZB\B^B`BiBrBBBBBBBBBBBBBBBBBBBBBBBBBBBCC CC"C%C(C+C.C7C:C=C?CBCDCMCWC_ClCuCxC{C~CCCCCCCCCCDDD"D-D:DCDFDIDLDODXD[D^D`DcDeDnDxDDDDDDDDDDDDDDDDDDDDDDDEEEE E EEE&E3EZ@ZCZ~ZZZZZZZZ 6Zgsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/GeoIPService.xcodeproj/project.pbxproj0000644000175000017500000005714113525245161031301 0ustar ellertellert// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 58BCAD7F1D4A7B12009ED67E /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 58BCAD7E1D4A7B12009ED67E /* main.mm */; }; 58BCAD821D4A7B12009ED67E /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 58BCAD811D4A7B12009ED67E /* AppDelegate.mm */; }; 58BCAD851D4A7B12009ED67E /* ViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 58BCAD841D4A7B12009ED67E /* ViewController.mm */; }; 58BCAD881D4A7B12009ED67E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 58BCAD861D4A7B12009ED67E /* Main.storyboard */; }; 58BCAD8A1D4A7B12009ED67E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 58BCAD891D4A7B12009ED67E /* Assets.xcassets */; }; 58BCAD8D1D4A7B12009ED67E /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 58BCAD8B1D4A7B12009ED67E /* LaunchScreen.storyboard */; }; 58BCAD981D4A7B12009ED67E /* app2Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = 58BCAD971D4A7B12009ED67E /* app2Tests.m */; }; 58BCADA31D4A7B12009ED67E /* app2UITests.m in Sources */ = {isa = PBXBuildFile; fileRef = 58BCADA21D4A7B12009ED67E /* app2UITests.m */; }; 58BCADB61D4A7B30009ED67E /* GeoIPServiceSoap.nsmap in Resources */ = {isa = PBXBuildFile; fileRef = 58BCADB01D4A7B30009ED67E /* GeoIPServiceSoap.nsmap */; }; 58BCADB71D4A7B30009ED67E /* soapC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 58BCADB11D4A7B30009ED67E /* soapC.cpp */; }; 58BCADB81D4A7B30009ED67E /* soapGeoIPServiceSoapProxy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 58BCADB21D4A7B30009ED67E /* soapGeoIPServiceSoapProxy.cpp */; }; 58D56FDE1D639227000A7EF7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58D56FDD1D639227000A7EF7 /* Foundation.framework */; }; 58D56FE01D63922F000A7EF7 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58D56FDF1D63922F000A7EF7 /* CoreGraphics.framework */; }; 58D56FE21D639236000A7EF7 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58D56FE11D639236000A7EF7 /* UIKit.framework */; }; 58E1592E1D526F4400744E8F /* ViewController.h in Sources */ = {isa = PBXBuildFile; fileRef = 58BCAD831D4A7B12009ED67E /* ViewController.h */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ 58BCAD941D4A7B12009ED67E /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 58BCAD721D4A7B12009ED67E /* Project object */; proxyType = 1; remoteGlobalIDString = 58BCAD791D4A7B12009ED67E; remoteInfo = app2; }; 58BCAD9F1D4A7B12009ED67E /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 58BCAD721D4A7B12009ED67E /* Project object */; proxyType = 1; remoteGlobalIDString = 58BCAD791D4A7B12009ED67E; remoteInfo = app2; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ 58BCAD7A1D4A7B12009ED67E /* GeoIPService.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GeoIPService.app; sourceTree = BUILT_PRODUCTS_DIR; }; 58BCAD7E1D4A7B12009ED67E /* main.mm */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = ""; }; 58BCAD801D4A7B12009ED67E /* AppDelegate.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; path = AppDelegate.h; sourceTree = ""; }; 58BCAD811D4A7B12009ED67E /* AppDelegate.mm */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; path = AppDelegate.mm; sourceTree = ""; }; 58BCAD831D4A7B12009ED67E /* ViewController.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; path = ViewController.h; sourceTree = ""; }; 58BCAD841D4A7B12009ED67E /* ViewController.mm */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; path = ViewController.mm; sourceTree = ""; tabWidth = 5; }; 58BCAD871D4A7B12009ED67E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 58BCAD891D4A7B12009ED67E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 58BCAD8C1D4A7B12009ED67E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 58BCAD8E1D4A7B12009ED67E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 58BCAD931D4A7B12009ED67E /* GeoIPService.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GeoIPService.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 58BCAD971D4A7B12009ED67E /* app2Tests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = app2Tests.m; sourceTree = ""; }; 58BCAD991D4A7B12009ED67E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 58BCAD9E1D4A7B12009ED67E /* GeoIPService.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GeoIPService.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 58BCADA21D4A7B12009ED67E /* app2UITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = app2UITests.m; sourceTree = ""; }; 58BCADA41D4A7B12009ED67E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 58BCADB01D4A7B30009ED67E /* GeoIPServiceSoap.nsmap */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; name = GeoIPServiceSoap.nsmap; path = ../../GeoIPServiceSoap.nsmap; sourceTree = ""; }; 58BCADB11D4A7B30009ED67E /* soapC.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; name = soapC.cpp; path = ../../soapC.cpp; sourceTree = ""; }; 58BCADB21D4A7B30009ED67E /* soapGeoIPServiceSoapProxy.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; name = soapGeoIPServiceSoapProxy.cpp; path = ../../soapGeoIPServiceSoapProxy.cpp; sourceTree = ""; }; 58BCADB31D4A7B30009ED67E /* soapGeoIPServiceSoapProxy.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; name = soapGeoIPServiceSoapProxy.h; path = ../../soapGeoIPServiceSoapProxy.h; sourceTree = ""; }; 58BCADB41D4A7B30009ED67E /* soapH.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; name = soapH.h; path = ../../soapH.h; sourceTree = ""; }; 58BCADB51D4A7B30009ED67E /* soapStub.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; name = soapStub.h; path = ../../soapStub.h; sourceTree = ""; }; 58D56FDD1D639227000A7EF7 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 58D56FDF1D63922F000A7EF7 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 58D56FE11D639236000A7EF7 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 58BCAD771D4A7B12009ED67E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 58D56FE21D639236000A7EF7 /* UIKit.framework in Frameworks */, 58D56FE01D63922F000A7EF7 /* CoreGraphics.framework in Frameworks */, 58D56FDE1D639227000A7EF7 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 58BCAD901D4A7B12009ED67E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 58BCAD9B1D4A7B12009ED67E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 58BCAD711D4A7B12009ED67E = { isa = PBXGroup; children = ( 58D56FE11D639236000A7EF7 /* UIKit.framework */, 58D56FDF1D63922F000A7EF7 /* CoreGraphics.framework */, 58D56FDD1D639227000A7EF7 /* Foundation.framework */, 58BCAD7C1D4A7B12009ED67E /* app2 */, 58BCAD961D4A7B12009ED67E /* app2Tests */, 58BCADA11D4A7B12009ED67E /* app2UITests */, 58BCAD7B1D4A7B12009ED67E /* Products */, ); sourceTree = ""; }; 58BCAD7B1D4A7B12009ED67E /* Products */ = { isa = PBXGroup; children = ( 58BCAD7A1D4A7B12009ED67E /* GeoIPService.app */, 58BCAD931D4A7B12009ED67E /* GeoIPService.xctest */, 58BCAD9E1D4A7B12009ED67E /* GeoIPService.xctest */, ); name = Products; sourceTree = ""; }; 58BCAD7C1D4A7B12009ED67E /* app2 */ = { isa = PBXGroup; children = ( 58BCADB01D4A7B30009ED67E /* GeoIPServiceSoap.nsmap */, 58BCADB11D4A7B30009ED67E /* soapC.cpp */, 58BCADB21D4A7B30009ED67E /* soapGeoIPServiceSoapProxy.cpp */, 58BCADB31D4A7B30009ED67E /* soapGeoIPServiceSoapProxy.h */, 58BCADB41D4A7B30009ED67E /* soapH.h */, 58BCADB51D4A7B30009ED67E /* soapStub.h */, 58BCAD801D4A7B12009ED67E /* AppDelegate.h */, 58BCAD811D4A7B12009ED67E /* AppDelegate.mm */, 58BCAD831D4A7B12009ED67E /* ViewController.h */, 58BCAD841D4A7B12009ED67E /* ViewController.mm */, 58BCAD861D4A7B12009ED67E /* Main.storyboard */, 58BCAD891D4A7B12009ED67E /* Assets.xcassets */, 58BCAD8B1D4A7B12009ED67E /* LaunchScreen.storyboard */, 58BCAD7D1D4A7B12009ED67E /* Supporting Files */, ); path = app2; sourceTree = ""; }; 58BCAD7D1D4A7B12009ED67E /* Supporting Files */ = { isa = PBXGroup; children = ( 58BCAD8E1D4A7B12009ED67E /* Info.plist */, 58BCAD7E1D4A7B12009ED67E /* main.mm */, ); name = "Supporting Files"; sourceTree = ""; }; 58BCAD961D4A7B12009ED67E /* app2Tests */ = { isa = PBXGroup; children = ( 58BCAD971D4A7B12009ED67E /* app2Tests.m */, 58BCAD991D4A7B12009ED67E /* Info.plist */, ); path = app2Tests; sourceTree = ""; }; 58BCADA11D4A7B12009ED67E /* app2UITests */ = { isa = PBXGroup; children = ( 58BCADA21D4A7B12009ED67E /* app2UITests.m */, 58BCADA41D4A7B12009ED67E /* Info.plist */, ); path = app2UITests; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 58BCAD791D4A7B12009ED67E /* GeoIPService */ = { isa = PBXNativeTarget; buildConfigurationList = 58BCADA71D4A7B12009ED67E /* Build configuration list for PBXNativeTarget "GeoIPService" */; buildPhases = ( 58BCAD761D4A7B12009ED67E /* Sources */, 58BCAD771D4A7B12009ED67E /* Frameworks */, 58BCAD781D4A7B12009ED67E /* Resources */, ); buildRules = ( ); dependencies = ( ); name = GeoIPService; productName = app2; productReference = 58BCAD7A1D4A7B12009ED67E /* GeoIPService.app */; productType = "com.apple.product-type.application"; }; 58BCAD921D4A7B12009ED67E /* GeoIPServiceTests */ = { isa = PBXNativeTarget; buildConfigurationList = 58BCADAA1D4A7B12009ED67E /* Build configuration list for PBXNativeTarget "GeoIPServiceTests" */; buildPhases = ( 58BCAD8F1D4A7B12009ED67E /* Sources */, 58BCAD901D4A7B12009ED67E /* Frameworks */, 58BCAD911D4A7B12009ED67E /* Resources */, ); buildRules = ( ); dependencies = ( 58BCAD951D4A7B12009ED67E /* PBXTargetDependency */, ); name = GeoIPServiceTests; productName = app2Tests; productReference = 58BCAD931D4A7B12009ED67E /* GeoIPService.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; 58BCAD9D1D4A7B12009ED67E /* GeoIPServiceUITests */ = { isa = PBXNativeTarget; buildConfigurationList = 58BCADAD1D4A7B12009ED67E /* Build configuration list for PBXNativeTarget "GeoIPServiceUITests" */; buildPhases = ( 58BCAD9A1D4A7B12009ED67E /* Sources */, 58BCAD9B1D4A7B12009ED67E /* Frameworks */, 58BCAD9C1D4A7B12009ED67E /* Resources */, ); buildRules = ( ); dependencies = ( 58BCADA01D4A7B12009ED67E /* PBXTargetDependency */, ); name = GeoIPServiceUITests; productName = app2UITests; productReference = 58BCAD9E1D4A7B12009ED67E /* GeoIPService.xctest */; productType = "com.apple.product-type.bundle.ui-testing"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 58BCAD721D4A7B12009ED67E /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0730; ORGANIZATIONNAME = "Bethany Sanders"; TargetAttributes = { 58BCAD791D4A7B12009ED67E = { CreatedOnToolsVersion = 7.3.1; }; 58BCAD921D4A7B12009ED67E = { CreatedOnToolsVersion = 7.3.1; TestTargetID = 58BCAD791D4A7B12009ED67E; }; 58BCAD9D1D4A7B12009ED67E = { CreatedOnToolsVersion = 7.3.1; TestTargetID = 58BCAD791D4A7B12009ED67E; }; }; }; buildConfigurationList = 58BCAD751D4A7B12009ED67E /* Build configuration list for PBXProject "GeoIPService" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); mainGroup = 58BCAD711D4A7B12009ED67E; productRefGroup = 58BCAD7B1D4A7B12009ED67E /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 58BCAD791D4A7B12009ED67E /* GeoIPService */, 58BCAD921D4A7B12009ED67E /* GeoIPServiceTests */, 58BCAD9D1D4A7B12009ED67E /* GeoIPServiceUITests */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 58BCAD781D4A7B12009ED67E /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 58BCAD8D1D4A7B12009ED67E /* LaunchScreen.storyboard in Resources */, 58BCAD8A1D4A7B12009ED67E /* Assets.xcassets in Resources */, 58BCAD881D4A7B12009ED67E /* Main.storyboard in Resources */, 58BCADB61D4A7B30009ED67E /* GeoIPServiceSoap.nsmap in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; 58BCAD911D4A7B12009ED67E /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 58BCAD9C1D4A7B12009ED67E /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 58BCAD761D4A7B12009ED67E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 58BCADB71D4A7B30009ED67E /* soapC.cpp in Sources */, 58BCAD851D4A7B12009ED67E /* ViewController.mm in Sources */, 58BCAD821D4A7B12009ED67E /* AppDelegate.mm in Sources */, 58BCAD7F1D4A7B12009ED67E /* main.mm in Sources */, 58BCADB81D4A7B30009ED67E /* soapGeoIPServiceSoapProxy.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 58BCAD8F1D4A7B12009ED67E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 58BCAD981D4A7B12009ED67E /* app2Tests.m in Sources */, 58E1592E1D526F4400744E8F /* ViewController.h in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 58BCAD9A1D4A7B12009ED67E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 58BCADA31D4A7B12009ED67E /* app2UITests.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ 58BCAD951D4A7B12009ED67E /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 58BCAD791D4A7B12009ED67E /* GeoIPService */; targetProxy = 58BCAD941D4A7B12009ED67E /* PBXContainerItemProxy */; }; 58BCADA01D4A7B12009ED67E /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 58BCAD791D4A7B12009ED67E /* GeoIPService */; targetProxy = 58BCAD9F1D4A7B12009ED67E /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ 58BCAD861D4A7B12009ED67E /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( 58BCAD871D4A7B12009ED67E /* Base */, ); name = Main.storyboard; sourceTree = ""; }; 58BCAD8B1D4A7B12009ED67E /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( 58BCAD8C1D4A7B12009ED67E /* Base */, ); name = LaunchScreen.storyboard; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 58BCADA51D4A7B12009ED67E /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 9.3; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; 58BCADA61D4A7B12009ED67E /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 9.3; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; name = Release; }; 58BCADA81D4A7B12009ED67E /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; INFOPLIST_FILE = app2/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = genivia.app2; PRODUCT_NAME = GeoIPService; }; name = Debug; }; 58BCADA91D4A7B12009ED67E /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; INFOPLIST_FILE = app2/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = genivia.app2; PRODUCT_NAME = GeoIPService; }; name = Release; }; 58BCADAB1D4A7B12009ED67E /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; INFOPLIST_FILE = app2Tests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = genivia.app2Tests; PRODUCT_NAME = GeoIPService; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GeoIPService.app/GeoIPService"; }; name = Debug; }; 58BCADAC1D4A7B12009ED67E /* Release */ = { isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; INFOPLIST_FILE = app2Tests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = genivia.app2Tests; PRODUCT_NAME = GeoIPService; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GeoIPService.app/GeoIPService"; }; name = Release; }; 58BCADAE1D4A7B12009ED67E /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { INFOPLIST_FILE = app2UITests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = genivia.app2UITests; PRODUCT_NAME = GeoIPService; TEST_TARGET_NAME = app2; }; name = Debug; }; 58BCADAF1D4A7B12009ED67E /* Release */ = { isa = XCBuildConfiguration; buildSettings = { INFOPLIST_FILE = app2UITests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = genivia.app2UITests; PRODUCT_NAME = GeoIPService; TEST_TARGET_NAME = app2; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 58BCAD751D4A7B12009ED67E /* Build configuration list for PBXProject "GeoIPService" */ = { isa = XCConfigurationList; buildConfigurations = ( 58BCADA51D4A7B12009ED67E /* Debug */, 58BCADA61D4A7B12009ED67E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 58BCADA71D4A7B12009ED67E /* Build configuration list for PBXNativeTarget "GeoIPService" */ = { isa = XCConfigurationList; buildConfigurations = ( 58BCADA81D4A7B12009ED67E /* Debug */, 58BCADA91D4A7B12009ED67E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 58BCADAA1D4A7B12009ED67E /* Build configuration list for PBXNativeTarget "GeoIPServiceTests" */ = { isa = XCConfigurationList; buildConfigurations = ( 58BCADAB1D4A7B12009ED67E /* Debug */, 58BCADAC1D4A7B12009ED67E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 58BCADAD1D4A7B12009ED67E /* Build configuration list for PBXNativeTarget "GeoIPServiceUITests" */ = { isa = XCConfigurationList; buildConfigurations = ( 58BCADAE1D4A7B12009ED67E /* Debug */, 58BCADAF1D4A7B12009ED67E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 58BCAD721D4A7B12009ED67E /* Project object */; } gsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/GeoIPService.xcodeproj/xcuserdata/0000755000175000017500000000000013525245161030360 5ustar ellertellert././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/GeoIPService.xcodeproj/xcuserdata/bethanysanders.xcuserdatad/gsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/GeoIPService.xcodeproj/xcuserdata/bethanysande0000755000175000017500000000000013525245161032746 5ustar ellertellert././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/GeoIPService.xcodeproj/xcuserdata/bethanysanders.xcuserdatad/xcschemes/gsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/GeoIPService.xcodeproj/xcuserdata/bethanysande0000755000175000017500000000000013525245161032746 5ustar ellertellert././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/GeoIPService.xcodeproj/xcuserdata/bethanysanders.xcuserdatad/xcschemes/xcschememanagement.plistgsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/GeoIPService.xcodeproj/xcuserdata/bethanysande0000644000175000017500000000122013525245161032743 0ustar ellertellert SchemeUserState app2.xcscheme orderHint 0 SuppressBuildableAutocreation 58BCAD791D4A7B12009ED67E primary 58BCAD921D4A7B12009ED67E primary 58BCAD9D1D4A7B12009ED67E primary ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/GeoIPService.xcodeproj/xcuserdata/bethanysanders.xcuserdatad/xcschemes/app2.xcschemegsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/GeoIPService.xcodeproj/xcuserdata/bethanysande0000644000175000017500000001022513525245161032750 0ustar ellertellert gsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/ViewController.h0000644000175000017500000000034413525245161025065 0ustar ellertellert// // ViewController.h // #import @interface ViewController : UIViewController{ UITextField* IPAddress; } @property (strong, nonatomic) IBOutlet UITextField *IPAddress; - (IBAction) buttonPressed; @end gsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/Base.lproj/0000755000175000017500000000000013525245161023734 5ustar ellertellertgsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/Base.lproj/Main.storyboard0000644000175000017500000000767213525245161026746 0ustar ellertellert gsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/Base.lproj/LaunchScreen.storyboard0000644000175000017500000000320113525245161030414 0ustar ellertellert gsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/Info.plist0000644000175000017500000000311613525245161023706 0ustar ellertellert NSAppTransportSecurity NSAllowsArbitraryLoads CFBundleDevelopmentRegion en CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1 LSRequiresIPhoneOS UILaunchStoryboardName LaunchScreen UIMainStoryboardFile Main UIRequiredDeviceCapabilities armv7 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UISupportedInterfaceOrientations~ipad UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight gsoap-2.8.91/gsoap/ios_plugin/examples/app2/app2/app2/AppDelegate.h0000644000175000017500000000050113525245161024255 0ustar ellertellert// //AppDelegate.h // #import @class ViewController; @interface AppDelegate : UIResponder { UIWindow *window; ViewController *viewController; } @property (strong, nonatomic) UIWindow *window; @property (nonatomic, retain) IBOutlet ViewController *viewController; @end gsoap-2.8.91/gsoap/src/0000755000175000017500000000000013525245205014167 5ustar ellertellertgsoap-2.8.91/gsoap/src/lex.yy.c0000644000175000017500000031726313525245163015602 0ustar ellertellert #line 3 "lex.yy.c" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 35 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ #include #include #include #include /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; typedef uint64_t flex_uint64_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; #endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! FLEXINT_H */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart(yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern yy_size_t yyleng; extern FILE *yyin, *yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires * access to the local variable yy_act. Since yyless() is a macro, it would break * existing scanners that call yyless() from OUTSIDE yylex. * One obvious solution it to make yy_act a global. I tried that, and saw * a 5% performance hit in a non-yylineno scanner, because yy_act is * normally declared as a register variable-- so it is not worth it. */ #define YY_LESS_LINENO(n) \ do { \ yy_size_t yyl;\ for ( yyl = n; yyl < yyleng; ++yyl )\ if ( yytext[yyl] == '\n' )\ --yylineno;\ }while(0) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ yy_size_t yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* Stack of input buffers. */ static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] /* yy_hold_char holds the character lost when yytext is formed. */ static char yy_hold_char; static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */ yy_size_t yyleng; /* Points to current character in buffer. */ static char *yy_c_buf_p = (char *) 0; static int yy_init = 0; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* Flag which is used to allow yywrap()'s to do buffer switches * instead of setting up a fresh yyin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; void yyrestart (FILE *input_file ); void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); void yy_delete_buffer (YY_BUFFER_STATE b ); void yy_flush_buffer (YY_BUFFER_STATE b ); void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); void yypop_buffer_state (void ); static void yyensure_buffer_stack (void ); static void yy_load_buffer_state (void ); static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); #define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,yy_size_t len ); void *yyalloc (yy_size_t ); void *yyrealloc (void *,yy_size_t ); void yyfree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer(yyin,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer(yyin,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define yywrap(n) 1 #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; typedef int yy_state_type; #define YY_FLEX_LEX_COMPAT extern int yylineno; int yylineno = 1; extern char yytext[]; static yy_state_type yy_get_previous_state (void ); static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); static int yy_get_next_buffer (void ); static void yy_fatal_error (yyconst char msg[] ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (yy_size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ if ( yyleng + (yy_more_offset) >= YYLMAX ) \ YY_FATAL_ERROR( "token too large, exceeds YYLMAX" ); \ yy_flex_strncpy( &yytext[(yy_more_offset)], (yytext_ptr), yyleng + 1 ); \ yyleng += (yy_more_offset); \ (yy_prev_more_offset) = (yy_more_offset); \ (yy_more_offset) = 0; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 45 #define YY_END_OF_BUFFER 46 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_acclist[170] = { 0, 46, 44, 45, 2, 44, 45, 2, 45, 31, 44, 45, 44, 45,16427, 44, 45, 31, 44, 45, 31, 44, 45, 31, 44, 45, 44, 45,16426, 31, 44, 45, 31, 44, 45, 31, 44, 45, 31, 44, 45, 34, 44, 45, 34, 44, 45, 31, 44, 45, 31, 44, 45, 31, 44, 45, 31, 44, 45, 32, 44, 45, 32, 44, 45, 44, 45, 31, 44, 45, 44, 45, 31, 44, 45, 32, 44, 45, 32, 44, 45, 4, 45, 4, 45, 23,16427, 8235, 38,16427, 41, 14, 21, 15,16426, 8234, 37,16426, 12, 28, 10, 29, 11, 30, 3, 13, 34, 36, 34, 32, 32, 26, 24, 22, 25, 27, 32, 32, 16, 17, 20, 32, 32, 32, 5, 8235, 38, 41, 37, 9, 36, 36, 35, 18, 19, 32, 32, 33, 1, 32, 35, 36, 41, 41, 7, 9, 8, 9, 40, 41, 40, 39, 41, 39, 7, 9, 40, 41, 40, 39, 41, 39, 7, 7, 6, 7, 9, 6, 7, 9 } ; static yyconst flex_int16_t yy_accept[197] = { 0, 1, 1, 1, 1, 1, 2, 4, 7, 9, 12, 15, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50, 53, 56, 59, 62, 65, 67, 70, 72, 75, 78, 81, 83, 85, 86, 87, 88, 89, 90, 90, 90, 91, 91, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 105, 106, 106, 107, 107, 108, 109, 109, 110, 110, 111, 112, 113, 114, 115, 116, 117, 117, 117, 118, 118, 118, 119, 119, 120, 121, 122, 123, 124, 125, 125, 125, 126, 127, 128, 128, 128, 128, 128, 128, 129, 129, 130, 130, 130, 130, 131, 131, 132, 133, 134, 135, 135, 136, 137, 137, 138, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 143, 143, 144, 144, 146, 146, 146, 146, 148, 148, 148, 148, 148, 150, 150, 150, 151, 151, 151, 153, 153, 153, 154, 156, 156, 158, 159, 161, 162, 162, 163, 163, 163, 164, 164, 167, 167, 170, 170 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 4, 5, 6, 7, 8, 9, 10, 11, 8, 8, 12, 13, 8, 14, 15, 16, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 8, 20, 21, 22, 8, 8, 23, 23, 23, 23, 24, 25, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 26, 26, 28, 26, 26, 29, 26, 26, 8, 30, 8, 31, 26, 32, 33, 23, 23, 34, 35, 25, 36, 37, 38, 26, 26, 39, 40, 26, 41, 42, 26, 43, 44, 45, 46, 26, 26, 47, 26, 26, 8, 48, 8, 8, 1, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 50, 49, 49, 49, 49, 49, 49, 49, 51, 49, 51, 49, 49, 51, 49, 51, 49, 49, 51, 49, 49, 51, 49, 51, 51, 51, 51, 52, 51, 51, 51, 53, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54 } ; static yyconst flex_int32_t yy_meta[56] = { 0, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 5, 1, 1, 2, 6, 6, 6, 7, 6, 6, 7, 7, 1, 2, 6, 6, 6, 7, 7, 7, 6, 7, 7, 7, 7, 7, 7, 6, 7, 1, 1, 1, 7, 1, 1, 7, 7 } ; static yyconst flex_int16_t yy_base[215] = { 0, 0, 435, 477, 474, 483, 633, 633, 633, 461, 53, 58, 633, 459, 47, 55, 456, 50, 51, 58, 94, 35, 37, 55, 453, 56, 50, 80, 425, 437, 0, 66, 123, 405, 633, 435, 633, 87, 83, 633, 94, 442, 99, 141, 85, 91, 633, 633, 633, 117, 633, 633, 127, 633, 633, 633, 633, 633, 633, 633, 147, 633, 89, 0, 138, 633, 141, 172, 163, 396, 0, 418, 633, 633, 633, 407, 169, 183, 362, 109, 140, 186, 633, 359, 633, 633, 0, 0, 335, 633, 178, 209, 186, 192, 633, 223, 328, 325, 112, 92, 137, 362, 633, 228, 199, 124, 223, 147, 228, 232, 633, 633, 259, 183, 236, 273, 633, 0, 222, 315, 320, 227, 168, 240, 269, 254, 239, 287, 275, 292, 295, 311, 294, 226, 308, 246, 278, 168, 314, 325, 338, 291, 285, 319, 81, 332, 330, 352, 229, 231, 334, 342, 348, 262, 377, 391, 394, 397, 400, 403, 379, 633, 380, 387, 253, 633, 409, 412, 251, 416, 419, 133, 422, 428, 128, 431, 434, 78, 452, 461, 437, 440, 633, 633, 633, 633, 443, 633, 445, 446, 449, 457, 633, 458, 465, 633, 511, 518, 525, 532, 534, 538, 545, 552, 559, 566, 570, 576, 583, 590, 597, 604, 611, 618, 625 } ; static yyconst flex_int16_t yy_def[215] = { 0, 195, 1, 196, 196, 195, 195, 195, 195, 195, 197, 198, 195, 195, 195, 199, 195, 195, 195, 195, 195, 20, 200, 195, 195, 195, 201, 201, 195, 195, 202, 195, 201, 32, 195, 195, 195, 197, 203, 195, 197, 198, 198, 195, 198, 198, 195, 195, 195, 199, 195, 195, 199, 195, 195, 195, 195, 195, 195, 195, 204, 195, 195, 21, 195, 195, 195, 195, 201, 195, 32, 195, 195, 195, 195, 195, 201, 201, 195, 32, 203, 195, 195, 202, 195, 195, 32, 32, 32, 195, 203, 203, 203, 203, 195, 195, 195, 195, 198, 198, 205, 204, 195, 204, 204, 204, 195, 195, 195, 206, 195, 195, 195, 32, 32, 195, 195, 32, 203, 195, 195, 198, 198, 205, 205, 204, 204, 195, 195, 195, 195, 195, 195, 198, 198, 204, 204, 195, 195, 195, 195, 195, 195, 198, 198, 204, 204, 195, 195, 195, 198, 198, 207, 208, 195, 195, 209, 210, 211, 212, 207, 195, 207, 207, 208, 195, 210, 212, 209, 209, 210, 210, 210, 210, 211, 211, 212, 212, 212, 212, 213, 207, 195, 195, 195, 195, 213, 195, 213, 214, 213, 214, 195, 214, 213, 0, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195 } ; static yyconst flex_int16_t yy_nxt[689] = { 0, 6, 7, 8, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 12, 19, 20, 21, 22, 23, 24, 25, 26, 26, 26, 26, 27, 26, 26, 28, 29, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 31, 6, 7, 26, 6, 6, 32, 32, 38, 47, 50, 39, 42, 43, 42, 54, 195, 56, 51, 69, 48, 77, 59, 55, 57, 58, 60, 71, 72, 74, 75, 61, 78, 185, 195, 40, 94, 52, 80, 84, 94, 39, 38, 70, 70, 39, 94, 94, 44, 92, 45, 77, 93, 42, 43, 42, 79, 79, 106, 106, 42, 62, 78, 63, 63, 91, 85, 94, 151, 40, 64, 65, 50, 66, 66, 67, 40, 98, 122, 102, 51, 64, 50, 184, 99, 66, 79, 79, 183, 44, 100, 45, 66, 67, 77, 95, 95, 95, 39, 52, 51, 42, 102, 107, 107, 78, 121, 108, 108, 52, 113, 113, 114, 113, 113, 103, 108, 108, 126, 124, 66, 66, 91, 94, 86, 86, 87, 86, 86, 79, 79, 96, 66, 97, 77, 104, 39, 138, 138, 66, 77, 109, 109, 95, 39, 78, 105, 109, 109, 109, 39, 78, 195, 195, 102, 115, 115, 109, 109, 109, 91, 115, 115, 115, 118, 78, 134, 93, 91, 79, 79, 115, 115, 115, 91, 79, 79, 95, 95, 95, 39, 94, 94, 102, 113, 113, 114, 113, 113, 79, 79, 91, 106, 106, 102, 125, 103, 108, 108, 127, 65, 102, 65, 51, 91, 65, 182, 65, 165, 102, 127, 128, 128, 96, 65, 97, 104, 165, 155, 65, 133, 143, 124, 128, 136, 95, 154, 105, 129, 129, 128, 145, 100, 102, 129, 129, 129, 113, 113, 114, 113, 113, 130, 130, 129, 129, 129, 135, 130, 130, 130, 124, 137, 137, 128, 128, 138, 138, 130, 130, 130, 139, 139, 94, 140, 140, 128, 139, 139, 139, 140, 140, 140, 128, 94, 146, 149, 139, 139, 139, 140, 140, 140, 138, 138, 102, 148, 102, 156, 157, 156, 65, 142, 65, 147, 147, 158, 159, 158, 144, 147, 147, 147, 161, 141, 65, 132, 68, 68, 131, 147, 147, 147, 68, 68, 68, 150, 102, 120, 153, 119, 76, 76, 68, 68, 68, 152, 76, 76, 76, 162, 166, 166, 166, 161, 180, 156, 76, 76, 76, 117, 163, 161, 116, 158, 167, 167, 167, 169, 170, 169, 172, 173, 172, 175, 176, 175, 178, 179, 178, 112, 162, 162, 172, 173, 172, 178, 179, 178, 162, 169, 170, 169, 172, 173, 172, 172, 173, 172, 166, 111, 181, 172, 173, 172, 175, 176, 175, 178, 179, 178, 110, 187, 167, 81, 161, 169, 94, 187, 172, 190, 192, 175, 89, 187, 178, 178, 179, 178, 88, 82, 172, 192, 194, 178, 178, 179, 178, 169, 188, 187, 172, 162, 81, 172, 188, 73, 188, 193, 53, 172, 188, 46, 175, 36, 195, 178, 189, 35, 193, 193, 35, 33, 195, 195, 195, 195, 188, 195, 195, 195, 195, 195, 195, 178, 195, 195, 195, 195, 195, 195, 195, 195, 178, 34, 34, 34, 34, 34, 34, 34, 37, 37, 37, 37, 37, 37, 37, 41, 41, 41, 41, 41, 41, 41, 49, 49, 49, 49, 49, 49, 49, 68, 68, 76, 76, 76, 76, 83, 195, 195, 83, 83, 83, 83, 90, 90, 90, 90, 90, 90, 90, 101, 101, 101, 101, 101, 101, 101, 123, 123, 195, 123, 123, 123, 123, 109, 195, 109, 160, 160, 160, 160, 160, 160, 160, 164, 164, 164, 164, 164, 164, 164, 168, 168, 168, 168, 168, 168, 168, 171, 171, 171, 171, 171, 171, 171, 174, 174, 174, 174, 174, 174, 174, 177, 177, 177, 177, 177, 177, 177, 186, 186, 186, 186, 186, 186, 186, 191, 191, 191, 191, 191, 191, 191, 5, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195 } ; static yyconst flex_int16_t yy_chk[689] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 14, 15, 10, 11, 11, 11, 17, 21, 18, 15, 22, 14, 26, 19, 17, 18, 18, 19, 23, 23, 25, 25, 19, 26, 177, 21, 10, 144, 15, 27, 31, 44, 38, 37, 22, 22, 37, 45, 99, 11, 40, 11, 27, 40, 42, 42, 42, 26, 26, 62, 62, 11, 20, 27, 20, 20, 38, 31, 98, 144, 37, 20, 20, 49, 20, 20, 20, 40, 44, 99, 105, 49, 20, 52, 174, 45, 20, 27, 27, 171, 42, 52, 42, 20, 20, 32, 43, 43, 43, 80, 49, 100, 42, 60, 64, 64, 32, 98, 64, 64, 52, 79, 79, 79, 79, 79, 60, 107, 107, 105, 100, 66, 66, 80, 122, 32, 32, 32, 32, 32, 32, 32, 43, 66, 43, 68, 60, 90, 137, 137, 66, 76, 67, 67, 43, 92, 68, 60, 67, 67, 67, 93, 76, 77, 77, 104, 81, 81, 67, 67, 67, 90, 81, 81, 81, 91, 77, 122, 91, 92, 68, 68, 81, 81, 81, 93, 76, 76, 95, 95, 95, 118, 133, 121, 103, 113, 113, 113, 113, 113, 77, 77, 91, 106, 106, 126, 104, 103, 108, 108, 106, 106, 135, 106, 123, 118, 108, 168, 108, 164, 125, 106, 109, 109, 95, 106, 95, 103, 153, 149, 108, 121, 133, 123, 109, 126, 95, 148, 103, 112, 112, 109, 135, 124, 136, 112, 112, 112, 114, 114, 114, 114, 114, 115, 115, 112, 112, 112, 125, 115, 115, 115, 124, 127, 127, 128, 128, 127, 127, 115, 115, 115, 129, 129, 134, 130, 130, 128, 129, 129, 129, 130, 130, 130, 128, 143, 136, 142, 129, 129, 129, 130, 130, 130, 138, 138, 146, 141, 145, 150, 150, 150, 138, 132, 138, 139, 139, 151, 151, 151, 134, 139, 139, 139, 152, 131, 138, 120, 140, 140, 119, 139, 139, 139, 140, 140, 140, 143, 101, 97, 146, 96, 147, 147, 140, 140, 140, 145, 147, 147, 147, 152, 154, 154, 154, 160, 162, 150, 147, 147, 147, 88, 152, 163, 83, 151, 155, 155, 155, 156, 156, 156, 157, 157, 157, 158, 158, 158, 159, 159, 159, 78, 160, 162, 166, 166, 166, 167, 167, 167, 163, 169, 169, 169, 170, 170, 170, 172, 172, 172, 154, 75, 163, 173, 173, 173, 175, 175, 175, 176, 176, 176, 71, 180, 155, 69, 181, 156, 41, 186, 157, 188, 189, 158, 35, 190, 159, 178, 178, 178, 33, 29, 166, 191, 193, 167, 179, 179, 179, 169, 180, 194, 170, 181, 28, 172, 186, 24, 188, 189, 16, 173, 190, 13, 175, 9, 5, 176, 181, 4, 191, 193, 3, 2, 0, 0, 0, 0, 194, 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, 0, 179, 196, 196, 196, 196, 196, 196, 196, 197, 197, 197, 197, 197, 197, 197, 198, 198, 198, 198, 198, 198, 198, 199, 199, 199, 199, 199, 199, 199, 200, 200, 201, 201, 201, 201, 202, 0, 0, 202, 202, 202, 202, 203, 203, 203, 203, 203, 203, 203, 204, 204, 204, 204, 204, 204, 204, 205, 205, 0, 205, 205, 205, 205, 206, 0, 206, 207, 207, 207, 207, 207, 207, 207, 208, 208, 208, 208, 208, 208, 208, 209, 209, 209, 209, 209, 209, 209, 210, 210, 210, 210, 210, 210, 210, 211, 211, 211, 211, 211, 211, 211, 212, 212, 212, 212, 212, 212, 212, 213, 213, 213, 213, 213, 213, 213, 214, 214, 214, 214, 214, 214, 214, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195 } ; /* Table of booleans, true if rule could match eol. */ static yyconst flex_int32_t yy_rule_can_match_eol[46] = { 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, }; extern int yy_flex_debug; int yy_flex_debug = 0; static yy_state_type *yy_state_buf=0, *yy_state_ptr=0; static char *yy_full_match; static int yy_lp; static int yy_looking_for_trail_begin = 0; static int yy_full_lp; static int *yy_full_state; #define YY_TRAILING_MASK 0x2000 #define YY_TRAILING_HEAD_MASK 0x4000 #define REJECT \ { \ *yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ \ yy_cp = (yy_full_match); /* restore poss. backed-over text */ \ (yy_lp) = (yy_full_lp); /* restore orig. accepting pos. */ \ (yy_state_ptr) = (yy_full_state); /* restore orig. state */ \ yy_current_state = *(yy_state_ptr); /* restore curr. state */ \ ++(yy_lp); \ goto find_rule; \ } static int yy_more_offset = 0; static int yy_prev_more_offset = 0; #define yymore() ((yy_more_offset) = yy_flex_strlen( yytext )) #define YY_NEED_STRLEN #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET \ { \ (yy_more_offset) = (yy_prev_more_offset); \ yyleng -= (yy_more_offset); \ } #ifndef YYLMAX #define YYLMAX 8192 #endif char yytext[YYLMAX]; char *yytext_ptr; #line 1 "soapcpp2_lex.l" /* soapcpp2_lex.l Flex/Lex tokenizer for C/C++ -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, 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. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- */ #line 38 "soapcpp2_lex.l" #include "soapcpp2.h" #ifndef YY_NO_UNISTD_H #define YY_NO_UNISTD_H #endif #ifdef HAVE_CONFIG_H #include "soapcpp2_yacc.h" #else #include "soapcpp2_yacc.tab.h" #endif extern int isatty(int); /* silence warnings */ #ifdef WITH_BISON YYSTYPE yylval; #undef YY_NEED_STRLEN #define YY_INPUT(buf, result, max_size) \ { \ int c = getc(yyin); \ result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \ } #endif #ifndef WITH_LEX #define MAX_IMPORT_DEPTH 16 static struct importlist { struct importlist *next; char name[1]; } *importlist = NULL; static const char *fnstk[MAX_IMPORT_DEPTH]; static int lnstk[MAX_IMPORT_DEPTH]; static const char *imstk[MAX_IMPORT_DEPTH]; static YY_BUFFER_STATE instk[MAX_IMPORT_DEPTH]; #endif int imports = 0; const char *imported = NULL; static void check_id(const char*); static Token install_id(void); static Token install_tag(void); static Token install_int(void); static Token install_hex(void); static Token install_num(void); static Token install_chr(void); static Token install_str(void); static Token install_pragma(void); static void directive(void), option(void), xpath(void); static Token error_chr(void); static Token error_str(void); static int convchar(int*); static int hexchar(int*); static int octchar(int*); static void module(const char *name, const char *fullname); static void import(const char *file); static long magic(const char *name); #define YY_NO_INPUT 1 #line 837 "lex.yy.c" #define INITIAL 0 #define MLCOMMENT 1 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif static int yy_init_globals (void ); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ int yylex_destroy (void ); int yyget_debug (void ); void yyset_debug (int debug_flag ); YY_EXTRA_TYPE yyget_extra (void ); void yyset_extra (YY_EXTRA_TYPE user_defined ); FILE *yyget_in (void ); void yyset_in (FILE * in_str ); FILE *yyget_out (void ); void yyset_out (FILE * out_str ); yy_size_t yyget_leng (void ); char *yyget_text (void ); int yyget_lineno (void ); void yyset_lineno (int line_number ); /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int yywrap (void ); #else extern int yywrap (void ); #endif #endif #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void ); #else static int input (void ); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO fwrite( yytext, yyleng, 1, yyout ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ yy_size_t n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ break; \ } \ errno=0; \ clearerr(yyin); \ } \ }\ \ #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 extern int yylex (void); #define YY_DECL int yylex (void) #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ if ( yyleng > 0 ) \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \ (yytext[yyleng - 1] == '\n'); \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 110 "soapcpp2_lex.l" #line 1023 "lex.yy.c" if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif /* Create the reject buffer large enough to save one state per allowed character. */ if ( ! (yy_state_buf) ) (yy_state_buf) = (yy_state_type *)yyalloc(YY_STATE_BUF_SIZE ); if ( ! (yy_state_buf) ) YY_FATAL_ERROR( "out of dynamic memory in yylex()" ); if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin,YY_BUF_SIZE ); } yy_load_buffer_state( ); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_current_state += YY_AT_BOL(); (yy_state_ptr) = (yy_state_buf); *(yy_state_ptr)++ = yy_current_state; yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 196 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; *(yy_state_ptr)++ = yy_current_state; ++yy_cp; } while ( yy_base[yy_current_state] != 633 ); yy_find_action: yy_current_state = *--(yy_state_ptr); (yy_lp) = yy_accept[yy_current_state]; goto find_rule; /* Shut up GCC warning -Wall */ find_rule: /* we branch to this label when backing up */ for ( ; ; ) /* until we find what rule we matched */ { if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] ) { yy_act = yy_acclist[(yy_lp)]; if ( yy_act & YY_TRAILING_HEAD_MASK || (yy_looking_for_trail_begin) ) { if ( yy_act == (yy_looking_for_trail_begin) ) { (yy_looking_for_trail_begin) = 0; yy_act &= ~YY_TRAILING_HEAD_MASK; break; } } else if ( yy_act & YY_TRAILING_MASK ) { (yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK; (yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK; (yy_full_match) = yy_cp; (yy_full_state) = (yy_state_ptr); (yy_full_lp) = (yy_lp); } else { (yy_full_match) = yy_cp; (yy_full_state) = (yy_state_ptr); (yy_full_lp) = (yy_lp); break; } ++(yy_lp); goto find_rule; } --yy_cp; yy_current_state = *--(yy_state_ptr); (yy_lp) = yy_accept[yy_current_state]; } YY_DO_BEFORE_ACTION; if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) { yy_size_t yyl; for ( yyl = (yy_prev_more_offset); yyl < yyleng; ++yyl ) if ( yytext[yyl] == '\n' ) yylineno++; ; } do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 1: YY_RULE_SETUP #line 111 "soapcpp2_lex.l" { /* skip UTF8 BOM */ } YY_BREAK case 2: /* rule 2 can match eol */ YY_RULE_SETUP #line 112 "soapcpp2_lex.l" { /* skip white space */ } YY_BREAK case 3: YY_RULE_SETUP #line 113 "soapcpp2_lex.l" { BEGIN(MLCOMMENT); } YY_BREAK case 4: /* rule 4 can match eol */ YY_RULE_SETUP #line 114 "soapcpp2_lex.l" { } YY_BREAK case 5: YY_RULE_SETUP #line 115 "soapcpp2_lex.l" { BEGIN(INITIAL); } YY_BREAK case YY_STATE_EOF(MLCOMMENT): #line 116 "soapcpp2_lex.l" { execerror("Unclosed multiline comment at end of file"); } YY_BREAK case 6: /* rule 6 can match eol */ YY_RULE_SETUP #line 117 "soapcpp2_lex.l" { option(); } YY_BREAK case 7: /* rule 7 can match eol */ YY_RULE_SETUP #line 118 "soapcpp2_lex.l" { directive(); } YY_BREAK case 8: /* rule 8 can match eol */ YY_RULE_SETUP #line 119 "soapcpp2_lex.l" { xpath(); } YY_BREAK case 9: /* rule 9 can match eol */ YY_RULE_SETUP #line 120 "soapcpp2_lex.l" { /* skip single line comment */ } YY_BREAK case 10: YY_RULE_SETUP #line 121 "soapcpp2_lex.l" { return PA; } YY_BREAK case 11: YY_RULE_SETUP #line 122 "soapcpp2_lex.l" { return NA; } YY_BREAK case 12: YY_RULE_SETUP #line 123 "soapcpp2_lex.l" { return TA; } YY_BREAK case 13: YY_RULE_SETUP #line 124 "soapcpp2_lex.l" { return DA; } YY_BREAK case 14: YY_RULE_SETUP #line 125 "soapcpp2_lex.l" { return MA; } YY_BREAK case 15: YY_RULE_SETUP #line 126 "soapcpp2_lex.l" { return AA; } YY_BREAK case 16: YY_RULE_SETUP #line 127 "soapcpp2_lex.l" { return XA; } YY_BREAK case 17: YY_RULE_SETUP #line 128 "soapcpp2_lex.l" { return OA; } YY_BREAK case 18: YY_RULE_SETUP #line 129 "soapcpp2_lex.l" { return LA; } YY_BREAK case 19: YY_RULE_SETUP #line 130 "soapcpp2_lex.l" { return RA; } YY_BREAK case 20: YY_RULE_SETUP #line 131 "soapcpp2_lex.l" { return OR; } YY_BREAK case 21: YY_RULE_SETUP #line 132 "soapcpp2_lex.l" { return AN; } YY_BREAK case 22: YY_RULE_SETUP #line 133 "soapcpp2_lex.l" { return EQ; } YY_BREAK case 23: YY_RULE_SETUP #line 134 "soapcpp2_lex.l" { return NE; } YY_BREAK case 24: YY_RULE_SETUP #line 135 "soapcpp2_lex.l" { return LE; } YY_BREAK case 25: YY_RULE_SETUP #line 136 "soapcpp2_lex.l" { return GE; } YY_BREAK case 26: YY_RULE_SETUP #line 137 "soapcpp2_lex.l" { return LS; } YY_BREAK case 27: YY_RULE_SETUP #line 138 "soapcpp2_lex.l" { return RS; } YY_BREAK case 28: YY_RULE_SETUP #line 139 "soapcpp2_lex.l" { return PP; } YY_BREAK case 29: YY_RULE_SETUP #line 140 "soapcpp2_lex.l" { return NN; } YY_BREAK case 30: YY_RULE_SETUP #line 141 "soapcpp2_lex.l" { return AR; } YY_BREAK case 31: YY_RULE_SETUP #line 142 "soapcpp2_lex.l" { return yytext[0]; } YY_BREAK case 32: YY_RULE_SETUP #line 143 "soapcpp2_lex.l" { return install_id(); } YY_BREAK case 33: YY_RULE_SETUP #line 144 "soapcpp2_lex.l" { return install_tag(); } YY_BREAK case 34: YY_RULE_SETUP #line 145 "soapcpp2_lex.l" { return install_int(); } YY_BREAK case 35: YY_RULE_SETUP #line 146 "soapcpp2_lex.l" { return install_hex(); } YY_BREAK case 36: YY_RULE_SETUP #line 147 "soapcpp2_lex.l" { return install_num(); } YY_BREAK case 37: YY_RULE_SETUP #line 148 "soapcpp2_lex.l" { return install_chr(); } YY_BREAK case 38: /* rule 38 can match eol */ YY_RULE_SETUP #line 149 "soapcpp2_lex.l" { return install_str(); } YY_BREAK case 39: /* rule 39 can match eol */ YY_RULE_SETUP #line 150 "soapcpp2_lex.l" { char *s, *t, buf[1024]; s = strchr(yytext, '"'); if (!s) t = yytext+7; else { strcpy(buf, s+1); s = strchr(buf, '"'); *s = '\0'; t = strchr(s+1, '"'); if (t) { t++; s = strchr(t+1, '"'); if (s) *s = '\0'; } } module(buf, t); } YY_BREAK case 40: /* rule 40 can match eol */ YY_RULE_SETUP #line 168 "soapcpp2_lex.l" { char *s, buf[1024]; s = strchr(yytext, '"'); if (s) { strncpy(buf, s + 1, sizeof(buf)); buf[sizeof(buf) - 1] = '\0'; s = strchr(buf, '"'); if (!s) lexerror("Invalid import directive: missing ending \" or path too long"); else { *s = '\0'; import(buf); } } else lexerror("Invalid import directive: \" expected"); } YY_BREAK case 41: /* rule 41 can match eol */ YY_RULE_SETUP #line 184 "soapcpp2_lex.l" { return install_pragma(); } YY_BREAK case 42: /* rule 42 can match eol */ YY_RULE_SETUP #line 185 "soapcpp2_lex.l" { return error_chr(); } YY_BREAK case 43: /* rule 43 can match eol */ YY_RULE_SETUP #line 186 "soapcpp2_lex.l" { return error_str(); } YY_BREAK case 44: YY_RULE_SETUP #line 187 "soapcpp2_lex.l" { lexerror("Skipping unknown symbol"); } YY_BREAK case YY_STATE_EOF(INITIAL): #line 188 "soapcpp2_lex.l" { /* when Lex complains: remove this line and below */ #ifndef WITH_LEX if (--imports < 0) { yyterminate(); } else { if (vflag) fprintf(stderr, "End of %s\n\n", filename); yy_delete_buffer(YY_CURRENT_BUFFER); yy_switch_to_buffer(instk[imports]); filename = fnstk[imports]; yylineno = lnstk[imports]; imported = imstk[imports]; } #endif } YY_BREAK case 45: YY_RULE_SETUP #line 205 "soapcpp2_lex.l" ECHO; YY_BREAK #line 1443 "lex.yy.c" case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_c_buf_p); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer (void) { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { yy_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ YY_FATAL_ERROR( "input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart(yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state (void) { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); yy_current_state += YY_AT_BOL(); (yy_state_ptr) = (yy_state_buf); *(yy_state_ptr)++ = yy_current_state; for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 196 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; *(yy_state_ptr)++ = yy_current_state; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) { register int yy_is_jam; register YY_CHAR yy_c = 1; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 196 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 195); if ( ! yy_is_jam ) *(yy_state_ptr)++ = yy_current_state; return yy_is_jam ? 0 : yy_current_state; } #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void) #else static int input (void) #endif { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart(yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n'); if ( YY_CURRENT_BUFFER_LVALUE->yy_at_bol ) yylineno++; ; return c; } #endif /* ifndef YY_NO_INPUT */ /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyrestart (FILE * input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin,YY_BUF_SIZE ); } yy_init_buffer(YY_CURRENT_BUFFER,input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } static void yy_load_buffer_state (void) { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer(b,file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yy_delete_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) yyfree((void *) b->yy_ch_buf ); yyfree((void *) b ); } #ifndef __cplusplus extern int isatty (int ); #endif /* __cplusplus */ /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) { int oerrno = errno; yy_flush_buffer(b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yy_flush_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ static void yyensure_buffer_stack (void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } /** Setup the input buffer state to scan directly from a user-specified character buffer. * @param base the character buffer * @param size the size in bytes of the character buffer * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return 0; b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; b->yy_input_file = 0; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; yy_switch_to_buffer(b ); return b; } /** Setup the input buffer state to scan a string. The next call to yylex() will * scan from a @e copy of @a str. * @param yystr a NUL-terminated string to scan * * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use * yy_scan_bytes() instead. */ YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) { return yy_scan_bytes(yystr,strlen(yystr) ); } /** Setup the input buffer state to scan the given bytes. The next call to yylex() will * scan from a @e copy of @a bytes. * @param bytes the byte buffer to scan * @param len the number of bytes in the buffer pointed to by @a bytes. * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len ) { YY_BUFFER_STATE b; char *buf; yy_size_t n, i; /* Get memory for full buffer, including space for trailing EOB's. */ n = _yybytes_len + 2; buf = (char *) yyalloc(n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); for ( i = 0; i < _yybytes_len; ++i ) buf[i] = yybytes[i]; buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; b = yy_scan_buffer(buf,n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->yy_is_our_buffer = 1; return b; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif static void yy_fatal_error (yyconst char* msg ) { (void) fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /** Get the current line number. * */ int yyget_lineno (void) { return yylineno; } /** Get the input stream. * */ FILE *yyget_in (void) { return yyin; } /** Get the output stream. * */ FILE *yyget_out (void) { return yyout; } /** Get the length of the current token. * */ yy_size_t yyget_leng (void) { return yyleng; } /** Get the current token. * */ char *yyget_text (void) { return yytext; } /** Set the current line number. * @param line_number * */ void yyset_lineno (int line_number ) { yylineno = line_number; } /** Set the input stream. This does not discard the current * input buffer. * @param in_str A readable stream. * * @see yy_switch_to_buffer */ void yyset_in (FILE * in_str ) { yyin = in_str ; } void yyset_out (FILE * out_str ) { yyout = out_str ; } int yyget_debug (void) { return yy_flex_debug; } void yyset_debug (int bdebug ) { yy_flex_debug = bdebug ; } static int yy_init_globals (void) { /* Initialization is the same as for the non-reentrant scanner. * This function is called from yylex_destroy(), so don't allocate here. */ /* We do not touch yylineno unless the option is enabled. */ yylineno = 1; (yy_buffer_stack) = 0; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; (yy_c_buf_p) = (char *) 0; (yy_init) = 0; (yy_start) = 0; (yy_state_buf) = 0; (yy_state_ptr) = 0; (yy_full_match) = 0; (yy_lp) = 0; /* Defined in main.c */ #ifdef YY_STDINIT yyin = stdin; yyout = stdout; #else yyin = (FILE *) 0; yyout = (FILE *) 0; #endif /* For future reference: Set errno on error, since we are called by * yylex_init() */ return 0; } /* yylex_destroy is for both reentrant and non-reentrant scanners. */ int yylex_destroy (void) { /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; yypop_buffer_state(); } /* Destroy the stack itself. */ yyfree((yy_buffer_stack) ); (yy_buffer_stack) = NULL; yyfree ( (yy_state_buf) ); (yy_state_buf) = NULL; /* Reset the globals. This is important in a non-reentrant scanner so the next time * yylex() is called, initialization will occur. */ yy_init_globals( ); return 0; } /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *yyalloc (yy_size_t size ) { return (void *) malloc( size ); } void *yyrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void yyfree (void * ptr ) { free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 205 "soapcpp2_lex.l" /* install_id - lookup identifier in symbol table. If found, return token and symbol table entry. If not found, create entry in symbol table and return ID token. */ static Token install_id() { Symbol *p = lookup(yytext); if (!p) { int i, flag = 0; p = install(yytext, ID); /* [_](x|X)(m|M)(l|L)__ is OK */ /* [_](x|X)(m|M)(l|L).* is not OK */ /* .*__(x|X)(m|M)(l|L) is not OK */ /* .*::(x|X)(m|M)(l|L) is not OK */ for (i = 0; i < (int)yyleng; i++) { if ((yytext[i] == '_' && yytext[i+1] == '_') || (yytext[i] == ':' && yytext[i+1] == ':')) { flag = 1; check_id(yytext + i + 2); } } if (!flag && strcmp(yytext, "XML")) check_id(yytext); } yylval.sym = p; return p->token; } /* install_tag - return TAG token. */ static Token install_tag() { yylval.s = (char*)emalloc(yyleng); /* yyleng = length(yytext) */ strcpy(yylval.s, yytext+1); yylval.s[yyleng-2] = '\0'; return TAG; } /* check_id - check for (x|X)(m|M)(l|L) */ static void check_id(const char *s) { while (*s == '_') s++; if ((s[0] == 'x' || s[0] == 'X') && (s[1] == 'm' || s[1] == 'M') && (s[2] == 'l' || s[2] == 'L')) { sprintf(errbuf, "identifier '%s' starts with or embeds '%3.3s' character sequence, which is exclusively reserved for and by the W3C XML standards (for enum constants: please ignore this warning)", yytext, s); semwarn(errbuf); } } /* install_int - convert digits to integer and return LNG token. */ static Token install_int(void) { sscanf(yytext, SOAP_ULONG_FORMAT, &yylval.i); return LNG; } /* install_hex - convert hexadecimal digits to integer and return LNG */ static Token install_hex(void) { sscanf(yytext, SOAP_XLONG_FORMAT, &yylval.i); return LNG; } /* install_num - convert digits to floating point number and return DBL */ static Token install_num(void) { sscanf(yytext, "%lf", &yylval.r); return DBL; } /* install_chr - convert character constant and return CHR. */ static Token install_chr(void) { int i = 2; if (yytext[1] == '\\') yylval.c = convchar(&i); else yylval.c = yytext[i-1]; if (yytext[i] != '\'') lexerror("Illegal character constant"); return CHR; } /* install_str - convert and store string in memory. Return STR. */ static Token install_str(void) { int i, j = 0; yylval.s = (char*)emalloc(yyleng - 1); /* yyleng = length(yytext) */ for (i = 1 + (yytext[0] == 'L'); i < (int)yyleng - 1; i++) if (yytext[i] == '\\') { if (yytext[++i] != '\n') { yylval.s[j++] = convchar(&i); i--; } } else yylval.s[j++] = yytext[i]; yylval.s[j] = '\0'; return STR; } /* install_pragma - store pragma in string. Return PRAGMA. */ static Token install_pragma(void) { yylval.s = (char*)emalloc(yyleng); /* yyleng = length(yytext) */ strncpy(yylval.s, yytext, strlen(yytext)-1); yylval.s[strlen(yytext)-1] = '\0'; return PRAGMA; } static void directive(void) { int i, j, k; char *s; Service *sp; Method *m; Data *d; int service; for (i = 0; yytext[i]; i++) if (yytext[i] <= 32) break; for (; yytext[i]; i++) if (yytext[i] > 32 && yytext[i] != '\\') break; if (!strncmp(yytext+i, "schema", 6)) { sprintf(errbuf, "gsoap schema directive without namespace: %s", yytext+i); semwarn(errbuf); s = (char*)emalloc(1); *s = '\0'; } else if (!strncmp(yytext+i, "service", 7)) { s = (char*)emalloc(1); *s = '\0'; } else { for (j = i; yytext[j]; j++) if (yytext[j] <= 32) break; if (i == j) return; s = (char*)emalloc(j-i+1); for (k = 0; k < j-i; k++) { s[k] = yytext[k+i]; if (s[k] == '_') s[k] = '-'; } s[k] = '\0'; for (i = j; yytext[i]; i++) if (yytext[i] > 32 && yytext[i] != '\\') break; } for (sp = services; sp; sp = sp->next) if (!strcmp(sp->ns, s)) break; if (!sp) { sp = (Service*)emalloc(sizeof(Service)); sp->next = services; sp->ns = s; sp->name = NULL; sp->porttype = NULL; sp->portname = NULL; sp->binding = NULL; sp->definitions = NULL; sp->transport = NULL; sp->URL = NULL; sp->URI = NULL; sp->URI2 = NULL; sp->WSDL = NULL; sp->style = NULL; sp->encoding = NULL; sp->protocol = NULL; sp->xsi_type = 0; sp->elementForm = NULL; sp->attributeForm = NULL; sp->executable = NULL; sp->import = NULL; sp->documentation = NULL; sp->list = NULL; sp->data = NULL; services = sp; } if (!strncmp(yytext+i, "service", 7) || !strncmp(yytext+i, "schema", 6)) { service = strncmp(yytext+i, "schema", 6); for (i += 7; yytext[i]; i++) if (yytext[i] > 32 && yytext[i] != '\\') break; for (j = i; yytext[j]; j++) if (yytext[j] <= 32) break; for (; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; /* if (j == k) return; */ s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m = NULL; if (!strncmp(yytext+i, "name:", 5)) { sp->name = s; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] == '\\') k++; else if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; sp->documentation = s; } else if (service && (!strncmp(yytext+i, "type:", 5) || !strncmp(yytext+i, "portType:", 9) || !strncmp(yytext+i, "interface:", 10))) sp->porttype = s; else if (!strncmp(yytext+i, "portName:", 9)) sp->portname = s; else if (!strncmp(yytext+i, "binding:", 8)) sp->binding = s; else if (!strncmp(yytext+i, "definitions:", 12)) sp->definitions = s; else if (!strncmp(yytext+i, "documentation:", 14) || !strncmp(yytext+i, "doc:", 4)) { for (k = j; yytext[k]; k++) if (yytext[k] == '\\') k++; else if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; sp->documentation = s; } else if (!strncmp(yytext+i, "transport:", 10)) sp->transport = s; else if (!strncmp(yytext+i, "location:", 9) || !strncmp(yytext+i, "endpoint:", 9) || !strncmp(yytext+i, "port:", 5)) { if (sp->URL) { char *t = (char*)emalloc(strlen(sp->URL) + strlen(s) + 2); strcpy(t, sp->URL); strcat(t, " "); strcat(t, s); sp->URL = t; } else sp->URL = s; if (!service && !sp->import) sp->import = s; } else if (!strncmp(yytext+i, "executable:", 11)) sp->executable = s; else if (!strncmp(yytext+i, "namespace:", 10)) { if (service) { if (!sp->URI) sp->URI = s; sp->WSDL = s; } else if (!strcmp(sp->ns, "SOAP-ENV")) { if (soap_version > 0) semwarn("option -1 or -2 overrides SOAP-ENV namespace"); else envURI = s; sp->URI = (char*)envURI; } else if (!strcmp(sp->ns, "SOAP-ENC")) { if (soap_version > 0) semwarn("option -1 or -2 overrides SOAP-ENC namespace"); else encURI = s; sp->URI = (char*)encURI; } else sp->URI = s; } else if (!strncmp(yytext+i, "namespace2:", 11)) { sp->URI2 = s; } else if (!strncmp(yytext+i, "typed:", 6)) { sp->xsi_type = (*s == 'y'); } else if (!strncmp(yytext+i, "form:", 5)) { sp->elementForm = s; sp->attributeForm = s; } else if (!strncmp(yytext+i, "elementForm:", 12)) sp->elementForm = s; else if (!strncmp(yytext+i, "attributeForm:", 14)) sp->attributeForm = s; else if (!strncmp(yytext+i, "import:", 7)) { if (!sp->URI) sp->URI = s; sp->import = s; } else if (!strncmp(yytext+i, "encoding:", 9)) { if (!strcmp(s, "encoded")) sp->encoding = ""; else sp->encoding = s; } else if (!strncmp(yytext+i, "style:", 6)) sp->style = s; else if (!strncmp(yytext+i, "protocol:", 9)) sp->protocol = s; else if (!strncmp(yytext+i, "method-protocol:", 16)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = PROTOCOL; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] == '\\') k++; else if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-style:", 13)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = STYLE; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] == '\\') k++; else if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-encoding:", 16)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = ENCODING; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] == '\\') k++; else if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; if (strcmp(s, "encoded")) m->part = s; else m->part = ""; } else if (!strncmp(yytext+i, "method-response-encoding:", 25)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = RESPONSE_ENCODING; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] == '\\') k++; else if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; if (strcmp(s, "encoded")) m->part = s; else m->part = ""; } else if (!strncmp(yytext+i, "method-documentation:", 21) || !strncmp(yytext+i, "method:", 7)) { d = (Data*)emalloc(sizeof(Data)); d->name = s; d->text = NULL; d->next = sp->data; sp->data = d; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] == '\\') k++; else if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; d->text = s; } else if (!strncmp(yytext+i, "method-action:", 14)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = ACTION; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] == '\\') k++; else if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-input-action:", 20)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = REQUEST_ACTION; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] == '\\') k++; else if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-output-action:", 21)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = RESPONSE_ACTION; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] == '\\') k++; else if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-fault-action:", 20)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = FAULT_ACTION; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] == '\\') k++; else if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-mime-type:", 17)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = MIMEIN | MIMEOUT; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-input-mime-type:", 23)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = MIMEIN; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-output-mime-type:", 24)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = MIMEOUT; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-header-part:", 19)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = HDRIN | HDROUT; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-input-header-part:", 25)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = HDRIN; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-output-header-part:", 26)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = HDROUT; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-fault:", 13)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = FAULT; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!service && (!strncmp(yytext+i, "type-documentation:", 19) || !strncmp(yytext+i, "type:", 5))) { d = (Data*)emalloc(sizeof(Data)); d->name = s; d->text = NULL; d->next = sp->data; sp->data = d; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] == '\\') k++; else if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; d->text = s; } else { sprintf(errbuf, "unrecognized gsoap directive: %s", yytext+i); semwarn(errbuf); } if (m) { m->next = NULL; if (!sp->list) sp->list = m; else { Method *p; for (p = sp->list; p->next; p = p->next) continue; p->next = m; } } } else { sprintf(errbuf, "unrecognized gsoap directive: %s", yytext); semwarn(errbuf); } } static void option(void) { int i; if (imports) { sprintf(errbuf, "options directive: %s ignored in imported file(s)", yytext); semwarn(errbuf); return; } for (i = 0; yytext[i]; i++) if (yytext[i] <= 32) break; for (; yytext[i]; i++) if (yytext[i] > 32 && yytext[i] != '\\') break; for (; yytext[i]; i++) switch (yytext[i]) { case 'a': aflag = 1; break; case 'A': Aflag = 1; break; case 'c': if (yytext[i+1] == '+' && yytext[i+2] == '+') { i += 2; if (yytext[i+1] == '1' && yytext[i+2] == '1') { i += 2; c11flag = 1; } cflag = 0; } else { cflag = 1; } break; case 'e': eflag = 1; break; case 'i': iflag = 1; break; case 'j': jflag = 1; break; case 'n': nflag = 1; break; case 's': sflag = 1; break; case 't': tflag = 1; break; case 'w': wflag = 1; break; case 'x': xflag = 1; break; default: if (yytext[i] < 32 || yytext[i] == '/') return; } } static void xpath(void) { int i, j, k; char *s; XPath *xp; for (i = 0; yytext[i]; i++) if (yytext[i] <= 32) break; for (; yytext[i]; i++) if (yytext[i] > 32 && yytext[i] != '\\') break; for (j = i; yytext[j]; j++) if (yytext[j] <= 32) break; if (i == j) return; for (k = j; yytext[k]; k++) if (yytext[k] > 32 && yytext[k] != '\\') break; s = (char*)emalloc(yyleng - i); strncpy(s, yytext + i, j - i); s[j - i] = '\0'; for (xp = xpaths; xp; xp = xp->next) if (!strcmp(xp->name, s)) break; if (!xp) { xp = (XPath*)emalloc(sizeof(XPath)); xp->next = xpaths; xp->name = s; } s += j - i + 1; strcpy(s, yytext + k); xp->path = s; while (*s > 32) s++; *s = '\0'; } /* error_chr - lexical error in character constant. Return character 0 to allow parsing to continue */ static Token error_chr(void) { lexerror("Ending-' missing in character constant"); yylval.c = '\0'; return CHR; } /* error_str - lexical error in string. Return empty string to allow parsing to continue */ static Token error_str(void) { lexerror("Ending-\" missing in string"); yylval.s = ""; return STR; } /* Character conversion functions */ static int convchar(int *p) { switch (yytext[(*p)++]) { case 'a': return '\a'; case 'b': return '\b'; case 'f': return '\f'; case 'n': return '\n'; case 'r': return '\r'; case 't': return '\t'; case 'v': return '\v'; case 'x': return hexchar(p); case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': (*p)--; return octchar(p); default: return yytext[*p-1]; } } static int hexchar(int *p) { int i, d, c = 0; for (i = 0; isxdigit(d = yytext[*p]) && i < 2; i++) { c = (c << 4) + (d <= '9' ? d - '0' : toupper(d) - '7'); (*p)++; } return c; } static int octchar(int *p) { int i, d, c = 0; for (i = 0; (d = yytext[*p]) >= '0' && d <= '7' && i < 3; i++) { c = (c << 3) + d - '0'; (*p)++; } return c; } static void module(const char *name, const char *fullname) { char *s; if (!fullname) fullname = name; if (imports) { Pragma **pp; s = (char*)emalloc(strlen(fullname)+15); sprintf(s, "#include \"%sH.h\"", fullname); for (pp = &pragmas; *pp; pp = &(*pp)->next) if (!strcmp((*pp)->pragma, s)) break; if (!*pp) { *pp = (Pragma*)emalloc(sizeof(Pragma)); (*pp)->pragma = s; (*pp)->next = NULL; } s = (char*)emalloc(strlen(fullname)+1); imported = strcpy(s, fullname); fprintf(stderr, "Importing module '%s'\n\n", fullname); } else { lflag = 1; typeNO = magic(name); s = (char*)emalloc(strlen(fullname)+1); prefix = strcpy(s, fullname); fprintf(stderr, "Compiling module '%s' (magic number = %d)\n\n", fullname, typeNO); } } static long magic(const char *name) { size_t i; long n; if (strlen(name) > 4) semerror("#module name length must not exceed four characters"); n = 0; for (i = 0; i < strlen(name); i++) if (name[i] >= 'a' && name[i] <= 'z') n = 26*n + name[i] - 'a'; else if (name[i] >= 'A' && name[i] <= 'Z') n = 26*n + name[i] - 'A'; else semerror("#module name must be alphabetic and the length must not exceed four characters.\nUse '#module name longname' for longer names."); return 4699*n + 153424; } #ifdef WITH_LEX static void import(const char *file) { execerror("Cannot #import: soapcpp2 not compiled with flex (replace lex with flex)"); } #else static void import(const char *file) { char buf[1024]; struct importlist *p; if (vflag) fprintf(stderr, "Importing '%s': ", file); for (p = importlist; p; p = p->next) { if (!strcmp(p->name, file)) { if (vflag) fprintf(stderr, "file already read or currently being read\n\n"); return; } } if (imports >= MAX_IMPORT_DEPTH) execerror("Imports nested too deep"); instk[imports] = YY_CURRENT_BUFFER; fnstk[imports] = filename; lnstk[imports] = yylineno; imstk[imports] = imported; yylineno = 1; /* imported = NULL; this is useful to change the semantics of #import to NOT consider non-module imports to be part of the current module */ imports++; buf[0] = '\0'; if (!(yyin = fopen(file, "r"))) { if (importpath) { const char *s, *t; s = importpath; do { size_t n; t = strstr(s, SOAP_PATHSEP); if (t) { if ((size_t)(t - s) >= sizeof(buf)) t = s + sizeof(buf) - 1; strncpy(buf, s, t - s); buf[t - s] = '\0'; s = t + sizeof(SOAP_PATHSEP) - 1; } else { strcpy(buf, s); s = NULL; } n = strlen(buf) - 1; #ifdef __VMS if (buf[n] != ']' && buf[n] != ':') strcat(buf, ":"); #else if (buf[n] != SOAP_PATHCAT[0]) strcat(buf, SOAP_PATHCAT); #endif strcat(buf, file); yyin = fopen(buf, "r"); } while (s && !yyin); } if (!yyin) { sprintf(errbuf, "#import: Cannot open file \"%s\" for reading.\nHint: use option -I (for example -Igsoap" SOAP_PATHSEP "gsoap/import" SOAP_PATHSEP "gsoap/custom:.)", file); execerror(errbuf); } } if (vflag) { if (buf[0]) fprintf(stderr, "OK, found at %s\n\n", buf); else fprintf(stderr, "OK\n\n"); } p = (struct importlist*)emalloc(sizeof(struct importlist) + strlen(file)); /* has already + 1 byte size */ strcpy(p->name, file); filename = p->name; p->next = importlist; importlist = p; yy_switch_to_buffer(yy_create_buffer(yyin,YY_BUF_SIZE)); } #endif gsoap-2.8.91/gsoap/src/Make_mvc.mak0000644000175000017500000000157013525245163016411 0ustar ellertellertCC=cl CPP=cl LIBS= COFLAGS=-O2 # COFLAGS=-ZI -DDEBUG CFLAGS= -EHsc -nologo $(COFLAGS) soapcpp2.exe: soapcpp2.h soapcpp2_yacc.obj symbol2.obj error2.obj lex.yy.obj init2.obj soapcpp2.obj $(CC) $(CFLAGS) symbol2.obj error2.obj soapcpp2_yacc.obj lex.yy.obj \ init2.obj soapcpp2.obj $(LIBS) -Fe$@ .c.o: # soapcpp2.h soapcpp2_yacc.h error2.h $(CC) $(CFLAGS) -DWITH_BISON -DWITH_FLEX -c $< clean: del /f *.obj distclean: del /f soapcpp2.exe *.obj *.idb *.pdb *.ilk real-distclean: del /f soapcpp2.exe *.obj *.idb *.pdb *.ilk lex.yy.* soapcpp2_yacc.h \ soapcpp2_yacc.c y.tab.* *.output soapcpp2_yacc.c: soapcpp2_yacc.y soapcpp2.h error2.h bison.exe /d /v soapcpp2_yacc.y ren soapcpp2_yacc.tab.h soapcpp2_yacc.h ren soapcpp2_yacc.tab.c soapcpp2_yacc.c lex.yy.c: soapcpp2_yacc.h soapcpp2_yacc.c soapcpp2_lex.l flex.exe /l soapcpp2_lex.l gsoap-2.8.91/gsoap/src/.deps/0000755000175000017500000000000013525245164015204 5ustar ellertellertgsoap-2.8.91/gsoap/src/Makefile.in0000644000175000017500000010013513525245163016237 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ ####### This is the input file for automake, which will generate Makefile.in ########## VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = soapcpp2$(EXEEXT) subdir = gsoap/src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_soapcpp2_OBJECTS = soapcpp2-soapcpp2_yacc.$(OBJEXT) \ soapcpp2-soapcpp2_lex.$(OBJEXT) soapcpp2-symbol2.$(OBJEXT) \ soapcpp2-error2.$(OBJEXT) soapcpp2-init2.$(OBJEXT) \ soapcpp2-soapcpp2.$(OBJEXT) soapcpp2_OBJECTS = $(am_soapcpp2_OBJECTS) am__DEPENDENCIES_1 = soapcpp2_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) soapcpp2_LINK = $(CCLD) $(soapcpp2_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/soapcpp2-error2.Po \ ./$(DEPDIR)/soapcpp2-init2.Po ./$(DEPDIR)/soapcpp2-soapcpp2.Po \ ./$(DEPDIR)/soapcpp2-soapcpp2_lex.Po \ ./$(DEPDIR)/soapcpp2-soapcpp2_yacc.Po \ ./$(DEPDIR)/soapcpp2-symbol2.Po am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = LEXCOMPILE = $(LEX) $(AM_LFLAGS) $(LFLAGS) AM_V_LEX = $(am__v_LEX_@AM_V@) am__v_LEX_ = $(am__v_LEX_@AM_DEFAULT_V@) am__v_LEX_0 = @echo " LEX " $@; am__v_LEX_1 = YLWRAP = $(top_srcdir)/ylwrap am__yacc_c2h = sed -e s/cc$$/hh/ -e s/cpp$$/hpp/ -e s/cxx$$/hxx/ \ -e s/c++$$/h++/ -e s/c$$/h/ YACCCOMPILE = $(YACC) $(AM_YFLAGS) $(YFLAGS) AM_V_YACC = $(am__v_YACC_@AM_V@) am__v_YACC_ = $(am__v_YACC_@AM_DEFAULT_V@) am__v_YACC_0 = @echo " YACC " $@; am__v_YACC_1 = SOURCES = $(soapcpp2_SOURCES) DIST_SOURCES = $(soapcpp2_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/ylwrap \ soapcpp2_lex.c soapcpp2_yacc.c soapcpp2_yacc.h DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign 1.4 #LIBS= AM_YFLAGS = -d -v AM_LFLAGS = $(LEX_FLAGS) soapcpp2_CFLAGS = $(BISON_DEFINE) $(LEX_DEFINE) $(C_DEBUG_FLAGS) $(SOAPCPP2_IMPORTPATH) -D$(platform) soapcpp2_LDADD = $(YACC_LIB) $(LEXLIB) soapcpp2_SOURCES = soapcpp2_yacc.y soapcpp2_yacc.h soapcpp2_lex.l symbol2.c error2.c init2.c soapcpp2.c CLEANFILES = *~ soapcpp2_lex.c soapcpp2_yacc.c soapcpp2_yacc.h soapcpp2_yacc.output all: all-am .SUFFIXES: .SUFFIXES: .c .l .o .obj .y $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) soapcpp2_yacc.h: soapcpp2_yacc.c @if test ! -f $@; then rm -f soapcpp2_yacc.c; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) soapcpp2_yacc.c; else :; fi soapcpp2$(EXEEXT): $(soapcpp2_OBJECTS) $(soapcpp2_DEPENDENCIES) $(EXTRA_soapcpp2_DEPENDENCIES) @rm -f soapcpp2$(EXEEXT) $(AM_V_CCLD)$(soapcpp2_LINK) $(soapcpp2_OBJECTS) $(soapcpp2_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapcpp2-error2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapcpp2-init2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapcpp2-soapcpp2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapcpp2-soapcpp2_lex.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapcpp2-soapcpp2_yacc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapcpp2-symbol2.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` soapcpp2-soapcpp2_yacc.o: soapcpp2_yacc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -MT soapcpp2-soapcpp2_yacc.o -MD -MP -MF $(DEPDIR)/soapcpp2-soapcpp2_yacc.Tpo -c -o soapcpp2-soapcpp2_yacc.o `test -f 'soapcpp2_yacc.c' || echo '$(srcdir)/'`soapcpp2_yacc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/soapcpp2-soapcpp2_yacc.Tpo $(DEPDIR)/soapcpp2-soapcpp2_yacc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapcpp2_yacc.c' object='soapcpp2-soapcpp2_yacc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -c -o soapcpp2-soapcpp2_yacc.o `test -f 'soapcpp2_yacc.c' || echo '$(srcdir)/'`soapcpp2_yacc.c soapcpp2-soapcpp2_yacc.obj: soapcpp2_yacc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -MT soapcpp2-soapcpp2_yacc.obj -MD -MP -MF $(DEPDIR)/soapcpp2-soapcpp2_yacc.Tpo -c -o soapcpp2-soapcpp2_yacc.obj `if test -f 'soapcpp2_yacc.c'; then $(CYGPATH_W) 'soapcpp2_yacc.c'; else $(CYGPATH_W) '$(srcdir)/soapcpp2_yacc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/soapcpp2-soapcpp2_yacc.Tpo $(DEPDIR)/soapcpp2-soapcpp2_yacc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapcpp2_yacc.c' object='soapcpp2-soapcpp2_yacc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -c -o soapcpp2-soapcpp2_yacc.obj `if test -f 'soapcpp2_yacc.c'; then $(CYGPATH_W) 'soapcpp2_yacc.c'; else $(CYGPATH_W) '$(srcdir)/soapcpp2_yacc.c'; fi` soapcpp2-soapcpp2_lex.o: soapcpp2_lex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -MT soapcpp2-soapcpp2_lex.o -MD -MP -MF $(DEPDIR)/soapcpp2-soapcpp2_lex.Tpo -c -o soapcpp2-soapcpp2_lex.o `test -f 'soapcpp2_lex.c' || echo '$(srcdir)/'`soapcpp2_lex.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/soapcpp2-soapcpp2_lex.Tpo $(DEPDIR)/soapcpp2-soapcpp2_lex.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapcpp2_lex.c' object='soapcpp2-soapcpp2_lex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -c -o soapcpp2-soapcpp2_lex.o `test -f 'soapcpp2_lex.c' || echo '$(srcdir)/'`soapcpp2_lex.c soapcpp2-soapcpp2_lex.obj: soapcpp2_lex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -MT soapcpp2-soapcpp2_lex.obj -MD -MP -MF $(DEPDIR)/soapcpp2-soapcpp2_lex.Tpo -c -o soapcpp2-soapcpp2_lex.obj `if test -f 'soapcpp2_lex.c'; then $(CYGPATH_W) 'soapcpp2_lex.c'; else $(CYGPATH_W) '$(srcdir)/soapcpp2_lex.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/soapcpp2-soapcpp2_lex.Tpo $(DEPDIR)/soapcpp2-soapcpp2_lex.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapcpp2_lex.c' object='soapcpp2-soapcpp2_lex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -c -o soapcpp2-soapcpp2_lex.obj `if test -f 'soapcpp2_lex.c'; then $(CYGPATH_W) 'soapcpp2_lex.c'; else $(CYGPATH_W) '$(srcdir)/soapcpp2_lex.c'; fi` soapcpp2-symbol2.o: symbol2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -MT soapcpp2-symbol2.o -MD -MP -MF $(DEPDIR)/soapcpp2-symbol2.Tpo -c -o soapcpp2-symbol2.o `test -f 'symbol2.c' || echo '$(srcdir)/'`symbol2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/soapcpp2-symbol2.Tpo $(DEPDIR)/soapcpp2-symbol2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='symbol2.c' object='soapcpp2-symbol2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -c -o soapcpp2-symbol2.o `test -f 'symbol2.c' || echo '$(srcdir)/'`symbol2.c soapcpp2-symbol2.obj: symbol2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -MT soapcpp2-symbol2.obj -MD -MP -MF $(DEPDIR)/soapcpp2-symbol2.Tpo -c -o soapcpp2-symbol2.obj `if test -f 'symbol2.c'; then $(CYGPATH_W) 'symbol2.c'; else $(CYGPATH_W) '$(srcdir)/symbol2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/soapcpp2-symbol2.Tpo $(DEPDIR)/soapcpp2-symbol2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='symbol2.c' object='soapcpp2-symbol2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -c -o soapcpp2-symbol2.obj `if test -f 'symbol2.c'; then $(CYGPATH_W) 'symbol2.c'; else $(CYGPATH_W) '$(srcdir)/symbol2.c'; fi` soapcpp2-error2.o: error2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -MT soapcpp2-error2.o -MD -MP -MF $(DEPDIR)/soapcpp2-error2.Tpo -c -o soapcpp2-error2.o `test -f 'error2.c' || echo '$(srcdir)/'`error2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/soapcpp2-error2.Tpo $(DEPDIR)/soapcpp2-error2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='error2.c' object='soapcpp2-error2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -c -o soapcpp2-error2.o `test -f 'error2.c' || echo '$(srcdir)/'`error2.c soapcpp2-error2.obj: error2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -MT soapcpp2-error2.obj -MD -MP -MF $(DEPDIR)/soapcpp2-error2.Tpo -c -o soapcpp2-error2.obj `if test -f 'error2.c'; then $(CYGPATH_W) 'error2.c'; else $(CYGPATH_W) '$(srcdir)/error2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/soapcpp2-error2.Tpo $(DEPDIR)/soapcpp2-error2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='error2.c' object='soapcpp2-error2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -c -o soapcpp2-error2.obj `if test -f 'error2.c'; then $(CYGPATH_W) 'error2.c'; else $(CYGPATH_W) '$(srcdir)/error2.c'; fi` soapcpp2-init2.o: init2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -MT soapcpp2-init2.o -MD -MP -MF $(DEPDIR)/soapcpp2-init2.Tpo -c -o soapcpp2-init2.o `test -f 'init2.c' || echo '$(srcdir)/'`init2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/soapcpp2-init2.Tpo $(DEPDIR)/soapcpp2-init2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='init2.c' object='soapcpp2-init2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -c -o soapcpp2-init2.o `test -f 'init2.c' || echo '$(srcdir)/'`init2.c soapcpp2-init2.obj: init2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -MT soapcpp2-init2.obj -MD -MP -MF $(DEPDIR)/soapcpp2-init2.Tpo -c -o soapcpp2-init2.obj `if test -f 'init2.c'; then $(CYGPATH_W) 'init2.c'; else $(CYGPATH_W) '$(srcdir)/init2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/soapcpp2-init2.Tpo $(DEPDIR)/soapcpp2-init2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='init2.c' object='soapcpp2-init2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -c -o soapcpp2-init2.obj `if test -f 'init2.c'; then $(CYGPATH_W) 'init2.c'; else $(CYGPATH_W) '$(srcdir)/init2.c'; fi` soapcpp2-soapcpp2.o: soapcpp2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -MT soapcpp2-soapcpp2.o -MD -MP -MF $(DEPDIR)/soapcpp2-soapcpp2.Tpo -c -o soapcpp2-soapcpp2.o `test -f 'soapcpp2.c' || echo '$(srcdir)/'`soapcpp2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/soapcpp2-soapcpp2.Tpo $(DEPDIR)/soapcpp2-soapcpp2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapcpp2.c' object='soapcpp2-soapcpp2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -c -o soapcpp2-soapcpp2.o `test -f 'soapcpp2.c' || echo '$(srcdir)/'`soapcpp2.c soapcpp2-soapcpp2.obj: soapcpp2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -MT soapcpp2-soapcpp2.obj -MD -MP -MF $(DEPDIR)/soapcpp2-soapcpp2.Tpo -c -o soapcpp2-soapcpp2.obj `if test -f 'soapcpp2.c'; then $(CYGPATH_W) 'soapcpp2.c'; else $(CYGPATH_W) '$(srcdir)/soapcpp2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/soapcpp2-soapcpp2.Tpo $(DEPDIR)/soapcpp2-soapcpp2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapcpp2.c' object='soapcpp2-soapcpp2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(soapcpp2_CFLAGS) $(CFLAGS) -c -o soapcpp2-soapcpp2.obj `if test -f 'soapcpp2.c'; then $(CYGPATH_W) 'soapcpp2.c'; else $(CYGPATH_W) '$(srcdir)/soapcpp2.c'; fi` .l.c: $(AM_V_LEX)$(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE) .y.c: $(AM_V_YACC)$(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h `echo $@ | $(am__yacc_c2h)` y.output $*.output -- $(YACCCOMPILE) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -rm -f soapcpp2_lex.c -rm -f soapcpp2_yacc.c -rm -f soapcpp2_yacc.h clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/soapcpp2-error2.Po -rm -f ./$(DEPDIR)/soapcpp2-init2.Po -rm -f ./$(DEPDIR)/soapcpp2-soapcpp2.Po -rm -f ./$(DEPDIR)/soapcpp2-soapcpp2_lex.Po -rm -f ./$(DEPDIR)/soapcpp2-soapcpp2_yacc.Po -rm -f ./$(DEPDIR)/soapcpp2-symbol2.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/soapcpp2-error2.Po -rm -f ./$(DEPDIR)/soapcpp2-init2.Po -rm -f ./$(DEPDIR)/soapcpp2-soapcpp2.Po -rm -f ./$(DEPDIR)/soapcpp2-soapcpp2_lex.Po -rm -f ./$(DEPDIR)/soapcpp2-soapcpp2_yacc.Po -rm -f ./$(DEPDIR)/soapcpp2-symbol2.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-binPROGRAMS clean-generic cscopelist-am ctags ctags-am \ distclean distclean-compile distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-binPROGRAMS install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/src/soapcpp2_yacc.tab.h0000644000175000017500000000772013525245163017644 0ustar ellertellert/* A Bison parser, made by GNU Bison 3.3.1. */ /* Bison interface for Yacc-like parsers in C Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2019 Free Software Foundation, Inc. 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 3 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, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* Undocumented macros, especially those whose name start with YY_, are private implementation details. Do not rely on them. */ #ifndef YY_YY_SOAPCPP2_YACC_TAB_H_INCLUDED # define YY_YY_SOAPCPP2_YACC_TAB_H_INCLUDED /* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif #if YYDEBUG extern int yydebug; #endif /* Token type. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE enum yytokentype { PRAGMA = 258, AUTO = 259, DOUBLE = 260, INT = 261, STRUCT = 262, BREAK = 263, ELSE = 264, LONG = 265, SWITCH = 266, CASE = 267, ENUM = 268, REGISTER = 269, TYPEDEF = 270, CHAR = 271, EXTERN = 272, RETURN = 273, UNION = 274, CONST = 275, FLOAT = 276, SHORT = 277, UNSIGNED = 278, CONTINUE = 279, FOR = 280, SIGNED = 281, VOID = 282, DEFAULT = 283, GOTO = 284, SIZEOF = 285, VOLATILE = 286, DO = 287, IF = 288, STATIC = 289, WHILE = 290, CLASS = 291, PRIVATE = 292, PROTECTED = 293, PUBLIC = 294, VIRTUAL = 295, INLINE = 296, OPERATOR = 297, LLONG = 298, BOOL = 299, CFALSE = 300, CTRUE = 301, WCHAR = 302, TIME = 303, USING = 304, NAMESPACE = 305, ULLONG = 306, MUSTUNDERSTAND = 307, SIZE = 308, FRIEND = 309, TEMPLATE = 310, EXPLICIT = 311, TYPENAME = 312, MUTABLE = 313, FINAL = 314, null = 315, RESTRICT = 316, OVERRIDE = 317, UCHAR = 318, USHORT = 319, UINT = 320, ULONG = 321, NONE = 322, ID = 323, LAB = 324, TYPE = 325, LNG = 326, DBL = 327, CHR = 328, TAG = 329, STR = 330, PA = 331, NA = 332, TA = 333, DA = 334, MA = 335, AA = 336, XA = 337, OA = 338, LA = 339, RA = 340, OR = 341, AN = 342, EQ = 343, NE = 344, LE = 345, GE = 346, LS = 347, RS = 348, AR = 349, PP = 350, NN = 351 }; #endif /* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED union YYSTYPE { #line 146 "soapcpp2_yacc.y" /* yacc.c:1927 */ Symbol *sym; LONG64 i; double r; char c; char *s; Tnode *typ; Storage sto; Node rec; Entry *e; IR ir; #line 168 "soapcpp2_yacc.tab.h" /* yacc.c:1927 */ }; typedef union YYSTYPE YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_DECLARED 1 #endif extern YYSTYPE yylval; int yyparse (void); #endif /* !YY_YY_SOAPCPP2_YACC_TAB_H_INCLUDED */ gsoap-2.8.91/gsoap/src/soapcpp2.c0000644000175000017500000003620713525245163016075 0ustar ellertellert/* soapcpp2.c Main compiler and code generator batch program. gSOAP XML Web services tools Copyright (C) 2000-2019, 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. -------------------------------------------------------------------------------- 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 "soapcpp2.h" #ifndef SOAPCPP2_IMPORT_PATH # define SOAPCPP2_IMPORT_PATH (NULL) #endif extern void init(void); extern int yyparse(void); extern FILE *yyin; extern const char *ns_cname(const char*, const char*); FILE *fmsg; /* fd to flush compiler messages */ int soap_version = 0; /* SOAP version, -1=no SOAP, 0=not set, 1=1.1, 2=1.2 */ const char *copt = NULL;/* "-c" or "-c++11" or "-c++14" or NULL for default option C++ */ int vflag = 0; /* verbose output */ int wflag = 0; /* when set, don't generate WSDL and schema files */ int cflag = 0; /* when set, generate files with .c extension */ int c11flag = 0; /* when set, generate C++11/C++XX compatible files with .cpp extension */ int Cflag = 0; /* when set, generate only files for clients */ int aflag = 0; /* when set, use value of SOAP Action to dispatch method at server side */ int Aflag = 0; /* when set, require SOAP Action to dispatch method at server side */ int bflag = 0; /* when set, serialize byte arrays char[N] as string */ int eflag = 0; /* when set, use SOAP RPC encoding by default */ int Ecflag = 0; /* when set, generate extra functions for data copying (soap_dup_X) */ int Edflag = 0; /* when set, generate extra functions for data deletion (soap_del_X) */ int Etflag = 0; /* when set, generate data traversal/walker functions */ unsigned long fflag = 0;/* multi-file split for each bundle of -fN defs */ int gflag = 0; /* when set, generate XML sample messages in template format for testmsgr */ int iflag = 0; /* when set, generate new style proxy/object classes inherited from soap struct */ int jflag = 0; /* when set, generate new style proxy/object classes */ int mflag = 0; /* when set, generate code that requires array/binary classes to explicitly remove malloced array */ int nflag = 0; /* when set, names the namespaces global struct '%NAME%_namespaces */ int lflag = 0; /* when set, create library */ int Lflag = 0; /* when set, don't generate soapClientLib/soapServerLib */ int Qflag = 0; /* when set, use C++ namespaces for custom serializers */ int rflag = 0; /* when set, generate report */ int sflag = 0; /* when set, generate strict validation checks */ int Sflag = 0; /* when set, generate only files for servers */ int Tflag = 0; /* when set, generates server auto-test code */ int tflag = 0; /* when set, generates typed messsages (with xsi:type attributes) */ int uflag = 0; /* when set, uncomment WSDL and schema output */ int xflag = 0; /* when set, don't generate sample XML message files */ int yflag = 0; /* when set, add C/C++ info in sample XML messages */ int zflag = 0; /* when set, use backward compatibility option */ char dirpath[1024]; /* directory path for generated source files */ const char *prefix = "soap"; /* file name prefix for generated source files */ const char *fprefix; const char *filename; /* current file name */ const char *importpath = NULL; /* default file import path */ const char *defimportpath = SOAPCPP2_IMPORT_PATH; /* default file import path */ /* IMPORTANT: The terms and conditions of use of this software do not allow for the removal of the copyright notice from the main program for visual display. For integrations with other software, a similar copyright notice must be produced that is visible to users of the software. */ int main(int argc, char **argv) { int i, g; char *a, *s; fmsg = stderr; filename = NULL; for (i = 1; i < argc; i++) { a = argv[i]; if (*a == '-' #ifdef WIN32 || *a == '/' #endif ) { g = 1; while (g && *++a) switch (*a) { case 'C': Cflag = 1; if (Sflag) fprintf(stderr, "soapcpp2: using both options -C and -S omits client/server code\n"); break; case 'c': copt = a - 1; if (a[1] == '+' && a[2] == '+') { a += 2; if (isdigit(a[1]) && isdigit(a[2])) { c11flag = 10*(a[1] - '0') + a[2] - '0'; /* 11 = C++11, 14 = C++14, etc */ a += 2; } cflag = 0; } else { cflag = 1; } break; case 'd': a++; g = 0; if (*a) strcpy(dirpath, a); else if (i < argc && argv[++i]) strcpy(dirpath, argv[i]); else execerror("Option -d requires a directory path"); if (*dirpath && dirpath[strlen(dirpath)-1] != '/' && dirpath[strlen(dirpath)-1] != '\\') strcat(dirpath, SOAP_PATHCAT); break; case 'e': eflag = 1; break; case 'E': a++; g = 0; while (*a) { switch (*a) { case 'c': Ecflag = 1; break; case 'd': Edflag = 1; break; case 't': Etflag = 1; break; default: execerror("Option -E requires 'c' and/or 'd'"); } a++; } break; case 'f': a++; g = 0; if (*a) fflag = strtoul(a, NULL, 10); else if (i < argc && argv[++i]) fflag = strtoul(argv[i], NULL, 10); if (!fflag) execerror("Option -f requires a value"); if (fflag < 10) fflag = 10; break; case 'g': gflag = 1; break; case 'a': aflag = 1; break; case 'A': aflag = 1; Aflag = 1; break; case 'b': bflag = 1; break; case '?': case 'h': fprintf(stderr, "Usage: soapcpp2 [-0|-1|-2] [-C|-S|-CS] [-A] [-a] [-b] [-c|-c++|-c++11] [-d path] [-Ec] [-Ed] [-Et] [-e] [-f N] [-g] [-h] [-i] [-I path" SOAP_PATHSEP "path" SOAP_PATHSEP "...] [-L] [-l] [-m] [-n] [-p name] [-Q name] [-q name] [-r] [-s] [-T] [-t] [-u] [-V] [-v] [-w] [-x] [-y] [-z#] [infile]\n\n"); fprintf(stderr, "\ -0 no SOAP, generate REST source code\n\ -1 generate SOAP 1.1 source code\n\ -2 generate SOAP 1.2 source code\n\ -A require HTTP SOAPAction headers to invoke server-side operations\n\ -a use HTTP SOAPAction with WS-Addressing to invoke server-side operations\n\ -b serialize byte arrays char[N] as string\n\ -C generate client-side source code only\n\ -c generate C source code\n\ -c++ generate C++ source code (default)\n\ -c++11 generate C++ source code optimized for C++11 (compile with -std=c++11)\n\ -dpath use path to save files\n\ -Ec generate extra functions for deep copying\n\ -Ed generate extra functions for deep deletion\n\ -Et generate extra functions for data traversals with callback functions\n\ -e generate SOAP RPC encoding style bindings (also use -1 or -2)\n\ -fN multiple soapC files, with N serializer definitions per file (N>=10)\n\ -g generate XML sample messages in template format for testmsgr\n\ -h display help info and exit\n\ -Ipath use path(s) for #import (paths separated with '" SOAP_PATHSEP "')\n\ -i generate C++ service proxies and objects inherited from soap struct\n\ -j generate C++ service proxies and objects that share a soap struct\n\ -L don't generate soapClientLib/soapServerLib\n\ -l generate linkable modules (experimental)\n\ -m generate source code for the Matlab(tm) MEX compiler (deprecated)\n\ -n use service name to rename service functions and namespace table\n\ -pname save files with new prefix name instead of 'soap'\n\ -Qname use name as the C++ namespace, including custom serializers\n\ -qname use name as the C++ namespace, excluding custom serializers\n\ -r generate soapReadme.md report\n\ -S generate server-side source code only\n\ -s generate stub and skeleton functions with strict XML validation checks\n\ -T generate server auto-test source code\n\ -t generate source code for fully xsi:type typed SOAP/XML messages\n\ -u uncomment WSDL/schema output by suppressing XML comments\n\ -V display the current version and exit\n\ -v verbose output\n\ -w don't generate WSDL and schema files\n\ -x don't generate sample XML message files\n\ -y include C/C++ type access information in sample XML messages\n\ -z1 compatibility: generate old-style C++ service proxies and objects\n\ -z2 compatibility with 2.7.x: omit XML output for NULL pointers\n\ -z3 compatibility up to 2.8.30: _param_N indexing and nillable pointers\n\ infile header file to parse (if none reads stdin)\n\ \n"); exit(0); case 'I': a++; g = 0; s = NULL; if (*a) s = a; else if (i < argc && argv[++i]) s = argv[i]; else execerror("Option -I requires an import path"); if (importpath && s) { char *t = (char*)emalloc(strlen(importpath) + strlen(s) + 2); strcpy(t, importpath); strcat(t, SOAP_PATHSEP); strcat(t, s); importpath = t; } else importpath = s; break; case 'i': iflag = 1; break; case 'j': jflag = 1; break; case 'm': mflag = 1; break; case 'n': nflag = 1; break; case 'l': lflag = 1; break; case 'L': Lflag = 1; break; case 'r': rflag = 1; break; case 's': sflag = 1; break; case 'S': Sflag = 1; if (Cflag) fprintf(stderr, "soapcpp2: using both options -C and -S omits client/server code\n"); break; case 'T': Tflag = 1; break; case 't': tflag = 1; break; case 'u': uflag = 1; break; case 'w': wflag = 1; break; case 'x': xflag = 1; break; case 'y': yflag = 1; break; case 'p': a++; g = 0; if (*a) prefix = ns_cname(a, NULL); else if (i < argc && argv[++i]) prefix = ns_cname(argv[i], NULL); else execerror("Option -p requires an output file name prefix"); break; case 'Q': Qflag = 1; /* fall through */ case 'q': a++; g = 0; if (*a) set_namespace(ns_cname(a, NULL)); else if (i < argc && argv[++i]) set_namespace(ns_cname(argv[i], NULL)); else execerror("Option -q requires a namespace name"); break; case '0': soap_version = -1; break; case '1': soap_version = 1; envURI = "http://schemas.xmlsoap.org/soap/envelope/"; encURI = "http://schemas.xmlsoap.org/soap/encoding/"; break; case '2': soap_version = 2; envURI = "http://www.w3.org/2003/05/soap-envelope"; encURI = "http://www.w3.org/2003/05/soap-encoding"; rpcURI = "http://www.w3.org/2003/05/soap-rpc"; break; case 'V': printf("%s", VERSION); exit(0); case 'v': vflag = 1; break; case 'z': { int z = zflag; a++; if (zflag) fprintf(stderr, "soapcpp2: Option -z specified twice\n"); g = 0; if (*a) z = *a - '0'; else if (i < argc && argv[++i]) z = *argv[i] - '0'; else execerror("Option -z requires an argument"); if (zflag == 0 || z < zflag) zflag = z; break; } default: fprintf(stderr, "soapcpp2: Unknown option %s\n", a); exit(1); } } else if (!(yyin = fopen(argv[i], "r"))) { sprintf(errbuf, "Cannot open file \"%s\" for reading", argv[i]); execerror(errbuf); } else filename = argv[i]; } fprintf(fmsg, "\n** The gSOAP code generator for C and C++, soapcpp2 release " VERSION "\n** Copyright (C) 2000-2019, Robert van Engelen, Genivia Inc.\n** All Rights Reserved. This product is provided \"as is\", without any warranty.\n** The soapcpp2 tool and its generated software are released under the GPL.\n** ----------------------------------------------------------------------------\n** A commercial use license is available from Genivia Inc., contact@genivia.com\n** ----------------------------------------------------------------------------\n\n"); if (filename == NULL) { filename = "(stdin)"; fprintf(fmsg, "Reading from stdin...\n"); } if (importpath && defimportpath) { char *t = (char*)emalloc(strlen(importpath) + strlen(defimportpath) + 2); strcpy(t, importpath); strcat(t, SOAP_PATHSEP); strcat(t, defimportpath); importpath = t; } else if (!importpath) importpath = defimportpath; init(); if (yyparse()) synerror("skipping the remaining part of the input"); return errstat(); } gsoap-2.8.91/gsoap/src/MakefileManual0000644000175000017500000000242013525245163016766 0ustar ellertellert# gSOAP soapcpp2 Makefile by Robert van Engelen, Genivia Inc. # Use this to build the soapcpp2 tool when autoconf/automake are not # available. # # Dependences: # Flex (or Lex) # Bison # # Mac OS X universal binary: # CC=gcc -arch i386 -arch ppc CC=gcc # use LEX=flex -l or LEX=lex LEX=flex -l # use YACC=bison or YACC=yacc -d -v -s soapcpp2_yacc YACC=bison # For static linkage with Flex use: # LIBS=/usr/lib/libfl.a # For static linkage with Lex use: # LIBS=/usr/lib/libl.a COFLAGS=-O1 # For static linking use: # COFLAGS=-O1 -static # For debugging use: # COFLAGS=-g CWFLAGS=-Wall # CIFLAGS= # use -DWITH_BISON or -DWITH_YACC # use -DWITH_FLEX or -DWITH_LEX CMFLAGS=-DWITH_BISON -DWITH_FLEX # CFLAGS= $(CWFLAGS) $(COFLAGS) $(CIFLAGS) $(CMFLAGS) # release: $(MAKE) -f MakefileManual distclean $(YACC) -d -v soapcpp2_yacc.y $(LEX) soapcpp2_lex.l $(MAKE) -f MakefileManual soapcpp2 soapcpp2: soapcpp2.h soapcpp2_yacc.tab.o symbol2.o error2.o lex.yy.o init2.o soapcpp2.o $(CC) symbol2.o error2.o soapcpp2_yacc.tab.o lex.yy.o init2.o soapcpp2.o $(LIBS) -o $@ -cp -f soapcpp2 ../bin .c.o: soapcpp2_yacc.tab.h soapcpp2.h error2.h $(CC) $(CFLAGS) -c $< .PHONY: clean distclean clean: -rm -f *.o distclean: -rm -f soapcpp2 *.o *.output gsoap-2.8.91/gsoap/src/soapcpp2_lex.l0000644000175000017500000013000413525245163016744 0ustar ellertellert/* soapcpp2_lex.l Flex/Lex tokenizer for C/C++ -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, 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. -------------------------------------------------------------------------------- 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 "soapcpp2.h" #ifndef YY_NO_UNISTD_H #define YY_NO_UNISTD_H #endif #ifdef HAVE_CONFIG_H #include "soapcpp2_yacc.h" #else #include "soapcpp2_yacc.tab.h" #endif extern int isatty(int); /* silence warnings */ #ifdef WITH_BISON YYSTYPE yylval; #undef YY_NEED_STRLEN #define YY_INPUT(buf, result, max_size) \ { \ int c = getc(yyin); \ result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \ } #endif #ifndef WITH_LEX #define MAX_IMPORT_DEPTH 16 static struct importlist { struct importlist *next; char name[1]; } *importlist = NULL; static const char *fnstk[MAX_IMPORT_DEPTH]; static int lnstk[MAX_IMPORT_DEPTH]; static const char *imstk[MAX_IMPORT_DEPTH]; static YY_BUFFER_STATE instk[MAX_IMPORT_DEPTH]; #endif int imports = 0; const char *imported = NULL; static void check_id(const char*); static Token install_id(void); static Token install_tag(void); static Token install_int(void); static Token install_hex(void); static Token install_num(void); static Token install_chr(void); static Token install_str(void); static Token install_pragma(void); static void directive(void), option(void), xpath(void); static Token error_chr(void); static Token error_str(void); static int convchar(int*); static int hexchar(int*); static int octchar(int*); static void module(const char *name, const char *fullname); static void import(const char *file); static long magic(const char *name); %} BOM \xEF\xBB\xBF ws [ \t\v\r\f\n\x1A\xA0] digit [0-9] alpha ([a-zA-Z_\xA8\xAA\xAD\xAF\xB2\xB5\xB7\xB8\xB9\xBA\xBC\xBD\xBE]|[\xC0-\xFF][\x80-\xBF]*|\\u([0-9a-fA-F]{4})) id (:?{alpha})(:?{alpha}|{digit}|::)* tag `[^`\t\v\r\f\n>]+` int {digit}+[lLuU]* hex 0[xX][0-9a-fA-F]+[lLuU]* num {digit}+(\.{digit}+([Ee][+-]?{digit}+)?|(\.{digit}+)?[Ee][+-]?{digit}+)[fFlL]?|{digit}+[fF] chr '(\\'|[^'\n])*' str L?\"(\\\"|\\\n|[^"])*\" module #{ws}*module{ws}+.*\n import #{ws}*import{ws}+.*\n %option noyywrap %option noinput %option nounput %x MLCOMMENT %% ^{BOM} { /* skip UTF8 BOM */ } {ws} { /* skip white space */ } "/*" { BEGIN(MLCOMMENT); } .|\n { } "*/" { BEGIN(INITIAL); } <> { execerror("Unclosed multiline comment at end of file"); } "//"\/*"gsoapopt".*\n { option(); } "//"\/*"gsoap"(.|\\\n)*\n { directive(); } "//"\/*"xpath".*\n { xpath(); } "//".*\n { /* skip single line comment */ } "+=" { return PA; } "-=" { return NA; } "*=" { return TA; } "/=" { return DA; } "%=" { return MA; } "&=" { return AA; } "^=" { return XA; } "|=" { return OA; } "<<=" { return LA; } ">>=" { return RA; } "||" { return OR; } "&&" { return AN; } "==" { return EQ; } "!=" { return NE; } "<=" { return LE; } ">=" { return GE; } "<<" { return LS; } ">>" { return RS; } "++" { return PP; } "--" { return NN; } "->" { return AR; } [;,:=|^&<>+\-*/%!?~(){}\[\].@$] { return yytext[0]; } {id} { return install_id(); } {tag} { return install_tag(); } {int} { return install_int(); } {hex} { return install_hex(); } {num} { return install_num(); } {chr} { return install_chr(); } {str} { return install_str(); } {module} { char *s, *t, buf[1024]; s = strchr(yytext, '"'); if (!s) t = yytext+7; else { strcpy(buf, s+1); s = strchr(buf, '"'); *s = '\0'; t = strchr(s+1, '"'); if (t) { t++; s = strchr(t+1, '"'); if (s) *s = '\0'; } } module(buf, t); } {import} { char *s, buf[1024]; s = strchr(yytext, '"'); if (s) { strncpy(buf, s + 1, sizeof(buf)); buf[sizeof(buf) - 1] = '\0'; s = strchr(buf, '"'); if (!s) lexerror("Invalid import directive: missing ending \" or path too long"); else { *s = '\0'; import(buf); } } else lexerror("Invalid import directive: \" expected"); } #.*\n { return install_pragma(); } '[^'\n]*/\n { return error_chr(); } \"[^"\n]*/\n { return error_str(); } . { lexerror("Skipping unknown symbol"); } <> { /* when Lex complains: remove this line and below */ #ifndef WITH_LEX if (--imports < 0) { yyterminate(); } else { if (vflag) fprintf(stderr, "End of %s\n\n", filename); yy_delete_buffer(YY_CURRENT_BUFFER); yy_switch_to_buffer(instk[imports]); filename = fnstk[imports]; yylineno = lnstk[imports]; imported = imstk[imports]; } #endif } %% /* install_id - lookup identifier in symbol table. If found, return token and symbol table entry. If not found, create entry in symbol table and return ID token. */ static Token install_id() { Symbol *p = lookup(yytext); if (!p) { int i, flag = 0; p = install(yytext, ID); /* [_](x|X)(m|M)(l|L)__ is OK */ /* [_](x|X)(m|M)(l|L).* is not OK */ /* .*__(x|X)(m|M)(l|L) is not OK */ /* .*::(x|X)(m|M)(l|L) is not OK */ for (i = 0; i < (int)yyleng; i++) { if ((yytext[i] == '_' && yytext[i+1] == '_') || (yytext[i] == ':' && yytext[i+1] == ':')) { flag = 1; check_id(yytext + i + 2); } } if (!flag && strcmp(yytext, "XML")) check_id(yytext); } yylval.sym = p; return p->token; } /* install_tag - return TAG token. */ static Token install_tag() { yylval.s = (char*)emalloc(yyleng); /* yyleng = length(yytext) */ strcpy(yylval.s, yytext+1); yylval.s[yyleng-2] = '\0'; return TAG; } /* check_id - check for (x|X)(m|M)(l|L) */ static void check_id(const char *s) { while (*s == '_') s++; if ((s[0] == 'x' || s[0] == 'X') && (s[1] == 'm' || s[1] == 'M') && (s[2] == 'l' || s[2] == 'L')) { sprintf(errbuf, "identifier '%s' starts with or embeds '%3.3s' character sequence, which is exclusively reserved for and by the W3C XML standards (for enum constants: please ignore this warning)", yytext, s); semwarn(errbuf); } } /* install_int - convert digits to integer and return LNG token. */ static Token install_int(void) { sscanf(yytext, SOAP_ULONG_FORMAT, &yylval.i); return LNG; } /* install_hex - convert hexadecimal digits to integer and return LNG */ static Token install_hex(void) { sscanf(yytext, SOAP_XLONG_FORMAT, &yylval.i); return LNG; } /* install_num - convert digits to floating point number and return DBL */ static Token install_num(void) { sscanf(yytext, "%lf", &yylval.r); return DBL; } /* install_chr - convert character constant and return CHR. */ static Token install_chr(void) { int i = 2; if (yytext[1] == '\\') yylval.c = convchar(&i); else yylval.c = yytext[i-1]; if (yytext[i] != '\'') lexerror("Illegal character constant"); return CHR; } /* install_str - convert and store string in memory. Return STR. */ static Token install_str(void) { int i, j = 0; yylval.s = (char*)emalloc(yyleng - 1); /* yyleng = length(yytext) */ for (i = 1 + (yytext[0] == 'L'); i < (int)yyleng - 1; i++) if (yytext[i] == '\\') { if (yytext[++i] != '\n') { yylval.s[j++] = convchar(&i); i--; } } else yylval.s[j++] = yytext[i]; yylval.s[j] = '\0'; return STR; } /* install_pragma - store pragma in string. Return PRAGMA. */ static Token install_pragma(void) { yylval.s = (char*)emalloc(yyleng); /* yyleng = length(yytext) */ strncpy(yylval.s, yytext, strlen(yytext)-1); yylval.s[strlen(yytext)-1] = '\0'; return PRAGMA; } static void directive(void) { int i, j, k; char *s; Service *sp; Method *m; Data *d; int service; for (i = 0; yytext[i]; i++) if (yytext[i] <= 32) break; for (; yytext[i]; i++) if (yytext[i] > 32 && yytext[i] != '\\') break; if (!strncmp(yytext+i, "schema", 6)) { sprintf(errbuf, "gsoap schema directive without namespace: %s", yytext+i); semwarn(errbuf); s = (char*)emalloc(1); *s = '\0'; } else if (!strncmp(yytext+i, "service", 7)) { s = (char*)emalloc(1); *s = '\0'; } else { for (j = i; yytext[j]; j++) if (yytext[j] <= 32) break; if (i == j) return; s = (char*)emalloc(j-i+1); for (k = 0; k < j-i; k++) { s[k] = yytext[k+i]; if (s[k] == '_') s[k] = '-'; } s[k] = '\0'; for (i = j; yytext[i]; i++) if (yytext[i] > 32 && yytext[i] != '\\') break; } for (sp = services; sp; sp = sp->next) if (!strcmp(sp->ns, s)) break; if (!sp) { sp = (Service*)emalloc(sizeof(Service)); sp->next = services; sp->ns = s; sp->name = NULL; sp->porttype = NULL; sp->portname = NULL; sp->binding = NULL; sp->definitions = NULL; sp->transport = NULL; sp->URL = NULL; sp->URI = NULL; sp->URI2 = NULL; sp->WSDL = NULL; sp->style = NULL; sp->encoding = NULL; sp->protocol = NULL; sp->xsi_type = 0; sp->elementForm = NULL; sp->attributeForm = NULL; sp->executable = NULL; sp->import = NULL; sp->documentation = NULL; sp->list = NULL; sp->data = NULL; services = sp; } if (!strncmp(yytext+i, "service", 7) || !strncmp(yytext+i, "schema", 6)) { service = strncmp(yytext+i, "schema", 6); for (i += 7; yytext[i]; i++) if (yytext[i] > 32 && yytext[i] != '\\') break; for (j = i; yytext[j]; j++) if (yytext[j] <= 32) break; for (; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; /* if (j == k) return; */ s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m = NULL; if (!strncmp(yytext+i, "name:", 5)) { sp->name = s; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] == '\\') k++; else if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; sp->documentation = s; } else if (service && (!strncmp(yytext+i, "type:", 5) || !strncmp(yytext+i, "portType:", 9) || !strncmp(yytext+i, "interface:", 10))) sp->porttype = s; else if (!strncmp(yytext+i, "portName:", 9)) sp->portname = s; else if (!strncmp(yytext+i, "binding:", 8)) sp->binding = s; else if (!strncmp(yytext+i, "definitions:", 12)) sp->definitions = s; else if (!strncmp(yytext+i, "documentation:", 14) || !strncmp(yytext+i, "doc:", 4)) { for (k = j; yytext[k]; k++) if (yytext[k] == '\\') k++; else if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; sp->documentation = s; } else if (!strncmp(yytext+i, "transport:", 10)) sp->transport = s; else if (!strncmp(yytext+i, "location:", 9) || !strncmp(yytext+i, "endpoint:", 9) || !strncmp(yytext+i, "port:", 5)) { if (sp->URL) { char *t = (char*)emalloc(strlen(sp->URL) + strlen(s) + 2); strcpy(t, sp->URL); strcat(t, " "); strcat(t, s); sp->URL = t; } else sp->URL = s; if (!service && !sp->import) sp->import = s; } else if (!strncmp(yytext+i, "executable:", 11)) sp->executable = s; else if (!strncmp(yytext+i, "namespace:", 10)) { if (service) { if (!sp->URI) sp->URI = s; sp->WSDL = s; } else if (!strcmp(sp->ns, "SOAP-ENV")) { if (soap_version > 0) semwarn("option -1 or -2 overrides SOAP-ENV namespace"); else envURI = s; sp->URI = (char*)envURI; } else if (!strcmp(sp->ns, "SOAP-ENC")) { if (soap_version > 0) semwarn("option -1 or -2 overrides SOAP-ENC namespace"); else encURI = s; sp->URI = (char*)encURI; } else sp->URI = s; } else if (!strncmp(yytext+i, "namespace2:", 11)) { sp->URI2 = s; } else if (!strncmp(yytext+i, "typed:", 6)) { sp->xsi_type = (*s == 'y'); } else if (!strncmp(yytext+i, "form:", 5)) { sp->elementForm = s; sp->attributeForm = s; } else if (!strncmp(yytext+i, "elementForm:", 12)) sp->elementForm = s; else if (!strncmp(yytext+i, "attributeForm:", 14)) sp->attributeForm = s; else if (!strncmp(yytext+i, "import:", 7)) { if (!sp->URI) sp->URI = s; sp->import = s; } else if (!strncmp(yytext+i, "encoding:", 9)) { if (!strcmp(s, "encoded")) sp->encoding = ""; else sp->encoding = s; } else if (!strncmp(yytext+i, "style:", 6)) sp->style = s; else if (!strncmp(yytext+i, "protocol:", 9)) sp->protocol = s; else if (!strncmp(yytext+i, "method-protocol:", 16)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = PROTOCOL; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] == '\\') k++; else if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-style:", 13)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = STYLE; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] == '\\') k++; else if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-encoding:", 16)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = ENCODING; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] == '\\') k++; else if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; if (strcmp(s, "encoded")) m->part = s; else m->part = ""; } else if (!strncmp(yytext+i, "method-response-encoding:", 25)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = RESPONSE_ENCODING; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] == '\\') k++; else if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; if (strcmp(s, "encoded")) m->part = s; else m->part = ""; } else if (!strncmp(yytext+i, "method-documentation:", 21) || !strncmp(yytext+i, "method:", 7)) { d = (Data*)emalloc(sizeof(Data)); d->name = s; d->text = NULL; d->next = sp->data; sp->data = d; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] == '\\') k++; else if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; d->text = s; } else if (!strncmp(yytext+i, "method-action:", 14)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = ACTION; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] == '\\') k++; else if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-input-action:", 20)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = REQUEST_ACTION; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] == '\\') k++; else if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-output-action:", 21)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = RESPONSE_ACTION; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] == '\\') k++; else if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-fault-action:", 20)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = FAULT_ACTION; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] == '\\') k++; else if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-mime-type:", 17)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = MIMEIN | MIMEOUT; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-input-mime-type:", 23)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = MIMEIN; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-output-mime-type:", 24)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = MIMEOUT; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-header-part:", 19)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = HDRIN | HDROUT; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-input-header-part:", 25)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = HDRIN; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-output-header-part:", 26)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = HDROUT; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!strncmp(yytext+i, "method-fault:", 13)) { m = (Method*)emalloc(sizeof(Method)); m->name = s; m->mess = FAULT; m->part = NULL; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] <= 32) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; m->part = s; } else if (!service && (!strncmp(yytext+i, "type-documentation:", 19) || !strncmp(yytext+i, "type:", 5))) { d = (Data*)emalloc(sizeof(Data)); d->name = s; d->text = NULL; d->next = sp->data; sp->data = d; for (j = k; yytext[j]; j++) if (yytext[j] > 32 && yytext[j] != '\\') break; for (k = j; yytext[k]; k++) if (yytext[k] == '\\') k++; else if (yytext[k] == 10 || yytext[k] == 13) break; if (j == k) return; s = (char*)emalloc(k-j+1); strncpy(s, yytext+j, k-j); s[k-j] = '\0'; d->text = s; } else { sprintf(errbuf, "unrecognized gsoap directive: %s", yytext+i); semwarn(errbuf); } if (m) { m->next = NULL; if (!sp->list) sp->list = m; else { Method *p; for (p = sp->list; p->next; p = p->next) continue; p->next = m; } } } else { sprintf(errbuf, "unrecognized gsoap directive: %s", yytext); semwarn(errbuf); } } static void option(void) { int i; if (imports) { sprintf(errbuf, "options directive: %s ignored in imported file(s)", yytext); semwarn(errbuf); return; } for (i = 0; yytext[i]; i++) if (yytext[i] <= 32) break; for (; yytext[i]; i++) if (yytext[i] > 32 && yytext[i] != '\\') break; for (; yytext[i]; i++) switch (yytext[i]) { case 'a': aflag = 1; break; case 'A': Aflag = 1; break; case 'c': if (yytext[i+1] == '+' && yytext[i+2] == '+') { i += 2; if (yytext[i+1] == '1' && yytext[i+2] == '1') { i += 2; c11flag = 1; } cflag = 0; } else { cflag = 1; } break; case 'e': eflag = 1; break; case 'i': iflag = 1; break; case 'j': jflag = 1; break; case 'n': nflag = 1; break; case 's': sflag = 1; break; case 't': tflag = 1; break; case 'w': wflag = 1; break; case 'x': xflag = 1; break; default: if (yytext[i] < 32 || yytext[i] == '/') return; } } static void xpath(void) { int i, j, k; char *s; XPath *xp; for (i = 0; yytext[i]; i++) if (yytext[i] <= 32) break; for (; yytext[i]; i++) if (yytext[i] > 32 && yytext[i] != '\\') break; for (j = i; yytext[j]; j++) if (yytext[j] <= 32) break; if (i == j) return; for (k = j; yytext[k]; k++) if (yytext[k] > 32 && yytext[k] != '\\') break; s = (char*)emalloc(yyleng - i); strncpy(s, yytext + i, j - i); s[j - i] = '\0'; for (xp = xpaths; xp; xp = xp->next) if (!strcmp(xp->name, s)) break; if (!xp) { xp = (XPath*)emalloc(sizeof(XPath)); xp->next = xpaths; xp->name = s; } s += j - i + 1; strcpy(s, yytext + k); xp->path = s; while (*s > 32) s++; *s = '\0'; } /* error_chr - lexical error in character constant. Return character 0 to allow parsing to continue */ static Token error_chr(void) { lexerror("Ending-' missing in character constant"); yylval.c = '\0'; return CHR; } /* error_str - lexical error in string. Return empty string to allow parsing to continue */ static Token error_str(void) { lexerror("Ending-\" missing in string"); yylval.s = ""; return STR; } /* Character conversion functions */ static int convchar(int *p) { switch (yytext[(*p)++]) { case 'a': return '\a'; case 'b': return '\b'; case 'f': return '\f'; case 'n': return '\n'; case 'r': return '\r'; case 't': return '\t'; case 'v': return '\v'; case 'x': return hexchar(p); case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': (*p)--; return octchar(p); default: return yytext[*p-1]; } } static int hexchar(int *p) { int i, d, c = 0; for (i = 0; isxdigit(d = yytext[*p]) && i < 2; i++) { c = (c << 4) + (d <= '9' ? d - '0' : toupper(d) - '7'); (*p)++; } return c; } static int octchar(int *p) { int i, d, c = 0; for (i = 0; (d = yytext[*p]) >= '0' && d <= '7' && i < 3; i++) { c = (c << 3) + d - '0'; (*p)++; } return c; } static void module(const char *name, const char *fullname) { char *s; if (!fullname) fullname = name; if (imports) { Pragma **pp; s = (char*)emalloc(strlen(fullname)+15); sprintf(s, "#include \"%sH.h\"", fullname); for (pp = &pragmas; *pp; pp = &(*pp)->next) if (!strcmp((*pp)->pragma, s)) break; if (!*pp) { *pp = (Pragma*)emalloc(sizeof(Pragma)); (*pp)->pragma = s; (*pp)->next = NULL; } s = (char*)emalloc(strlen(fullname)+1); imported = strcpy(s, fullname); fprintf(stderr, "Importing module '%s'\n\n", fullname); } else { lflag = 1; typeNO = magic(name); s = (char*)emalloc(strlen(fullname)+1); prefix = strcpy(s, fullname); fprintf(stderr, "Compiling module '%s' (magic number = %d)\n\n", fullname, typeNO); } } static long magic(const char *name) { size_t i; long n; if (strlen(name) > 4) semerror("#module name length must not exceed four characters"); n = 0; for (i = 0; i < strlen(name); i++) if (name[i] >= 'a' && name[i] <= 'z') n = 26*n + name[i] - 'a'; else if (name[i] >= 'A' && name[i] <= 'Z') n = 26*n + name[i] - 'A'; else semerror("#module name must be alphabetic and the length must not exceed four characters.\nUse '#module name longname' for longer names."); return 4699*n + 153424; } #ifdef WITH_LEX static void import(const char *file) { execerror("Cannot #import: soapcpp2 not compiled with flex (replace lex with flex)"); } #else static void import(const char *file) { char buf[1024]; struct importlist *p; if (vflag) fprintf(stderr, "Importing '%s': ", file); for (p = importlist; p; p = p->next) { if (!strcmp(p->name, file)) { if (vflag) fprintf(stderr, "file already read or currently being read\n\n"); return; } } if (imports >= MAX_IMPORT_DEPTH) execerror("Imports nested too deep"); instk[imports] = YY_CURRENT_BUFFER; fnstk[imports] = filename; lnstk[imports] = yylineno; imstk[imports] = imported; yylineno = 1; /* imported = NULL; this is useful to change the semantics of #import to NOT consider non-module imports to be part of the current module */ imports++; buf[0] = '\0'; if (!(yyin = fopen(file, "r"))) { if (importpath) { const char *s, *t; s = importpath; do { size_t n; t = strstr(s, SOAP_PATHSEP); if (t) { if ((size_t)(t - s) >= sizeof(buf)) t = s + sizeof(buf) - 1; strncpy(buf, s, t - s); buf[t - s] = '\0'; s = t + sizeof(SOAP_PATHSEP) - 1; } else { strcpy(buf, s); s = NULL; } n = strlen(buf) - 1; #ifdef __VMS if (buf[n] != ']' && buf[n] != ':') strcat(buf, ":"); #else if (buf[n] != SOAP_PATHCAT[0]) strcat(buf, SOAP_PATHCAT); #endif strcat(buf, file); yyin = fopen(buf, "r"); } while (s && !yyin); } if (!yyin) { sprintf(errbuf, "#import: Cannot open file \"%s\" for reading.\nHint: use option -I (for example -Igsoap" SOAP_PATHSEP "gsoap/import" SOAP_PATHSEP "gsoap/custom:.)", file); execerror(errbuf); } } if (vflag) { if (buf[0]) fprintf(stderr, "OK, found at %s\n\n", buf); else fprintf(stderr, "OK\n\n"); } p = (struct importlist*)emalloc(sizeof(struct importlist) + strlen(file)); /* has already + 1 byte size */ strcpy(p->name, file); filename = p->name; p->next = importlist; importlist = p; yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE)); } #endif gsoap-2.8.91/gsoap/src/soapcpp2_yacc.y0000644000175000017500000034575313525245163017133 0ustar ellertellert/* soapcpp2_yacc.y Yacc/Bison grammar. Build notes: Bison 1.6 is known to crash on Win32 systems if YYINITDEPTH is too small Compile with -DYYINITDEPTH=5000 -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2018, 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. -------------------------------------------------------------------------------- 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 "soapcpp2.h" #ifdef WIN32 #ifndef __STDC__ #define __STDC__ #endif #define YYINCLUDED_STDLIB_H #ifdef WIN32_WITHOUT_SOLARIS_FLEX extern int soapcpp2lex(void); #else extern int yylex(void); #endif #else extern int yylex(void); #endif #define MAXNEST 16 /* max. nesting depth of scopes */ typedef struct Scope { Table *table; Entry *entry; Node node; LONG64 val; int offset; Bool grow; /* true if offset grows with declarations */ Bool mask; /* true if enum is mask */ } Scope; Scope stack[MAXNEST], /* stack of tables and offsets */ *sp; /* current scope stack pointer */ Table *classtable = NULL, *enumtable = NULL, *typetable = NULL, *booltable = NULL, *templatetable = NULL; int transient = 0; int permission = 0; int custom_header = 1; int custom_fault = 1; Pragma *pragmas = NULL; Tnode *qname = NULL; Tnode *xml = NULL; /* function prototypes for support routine section */ static Entry *undefined(Symbol*); static Tnode *mgtype(Tnode*, Tnode*); static Node op(const char*, Node, Node), iop(const char*, Node, Node), relop(const char*, Node, Node); static void mkscope(Table*, int), enterscope(Table*, int), exitscope(void); static int integer(Tnode*), real(Tnode*), numeric(Tnode*); static void set_value(Entry *p, Tnode *t, Node *n), add_soap(void), add_XML(void), add_qname(void), add_header(void), add_fault(void), add_response(Entry*, Entry*), add_result(Tnode*), add_request(Symbol*, Scope*), add_pragma(const char*); /* imported from symbol2.c */ extern int is_string(Tnode*), is_wstring(Tnode*), is_smart(Tnode*), is_XML(Tnode*), is_stdXML(Tnode*), is_anyType(Tnode*), is_anyAttribute(Tnode*); extern char *c_storage(Storage); extern const char *c_type(Tnode*); extern int is_primitive_or_string(Tnode*), is_stdstr(Tnode*), is_binary(Tnode*), is_external(Tnode*), is_mutable(Entry*); extern Entry *unlinklast(Table*); /* Temporaries used in semantic rules */ int i; char *s, *s1; const char *s2; Symbol *sym; Entry *p, *q; Tnode *t; Node tmp, c; %} /* We expect one shift-reduce conflict, see build notes in the header above */ /* %expect 1 */ /* directive is not compatible with Yacc */ /* If Yacc complains then remove the line above to allow Yacc to proceed */ %union { Symbol *sym; LONG64 i; double r; char c; char *s; Tnode *typ; Storage sto; Node rec; Entry *e; IR ir; } /* pragmas */ %token PRAGMA /* keywords */ %token AUTO DOUBLE INT STRUCT %token BREAK ELSE LONG SWITCH %token CASE ENUM REGISTER TYPEDEF %token CHAR EXTERN RETURN UNION %token CONST FLOAT SHORT UNSIGNED %token CONTINUE FOR SIGNED VOID %token DEFAULT GOTO SIZEOF VOLATILE %token DO IF STATIC WHILE %token CLASS PRIVATE PROTECTED PUBLIC %token VIRTUAL INLINE OPERATOR LLONG %token BOOL CFALSE CTRUE WCHAR %token TIME USING NAMESPACE ULLONG %token MUSTUNDERSTAND SIZE FRIEND %token TEMPLATE EXPLICIT TYPENAME MUTABLE %token FINAL null RESTRICT OVERRIDE %token UCHAR USHORT UINT ULONG /* */ %token NONE /* identifiers (TYPE = typedef identifier) */ %token ID LAB TYPE /* constants */ %token LNG %token DBL %token CHR %token TAG STR /* types and related */ %type type %type store virtual const abstract %type fname structid struct classid class unionid union base enum enumsc mask masksc %type id sc name %type tag patt %type nullptr utype %type value /* expressions and statements */ %type expr cexp oexp obex aexp abex rexp lexp pexp brinit init spec tspec ptrs array arrayck texpf texp qexp occurs bounds min minmax max /* terminals */ %left ',' %right '=' PA NA TA DA MA AA XA OA LA RA /* += -= *= /= %= &= ^= |= <<= >>= */ %right '?' %right ':' %left OR /* || */ %left AN /* && */ %left '|' %left '^' %left '&' %left EQ NE /* == != */ %left '<' LE '>' GE /* <= >= */ %left LS RS /* << >> */ %left '+' '-' %left '*' '/' '%' %left AR /* -> */ %token PP NN /* ++ -- */ %% /**************************************\ Program syntax \**************************************/ prog : s1 exts { if (lflag) { custom_header = 0; custom_fault = 0; } else { add_header(); add_fault(); } compile(sp->table); freetable(classtable); freetable(enumtable); freetable(typetable); freetable(booltable); freetable(templatetable); yylineno = 0; } ; s1 : /* empty */ { classtable = mktable(NULL); enumtable = mktable(NULL); typetable = mktable(NULL); booltable = mktable(NULL); templatetable = mktable(NULL); p = enter(booltable, lookup("false")); p->info.typ = mkint(); p->info.val.i = 0; p = enter(booltable, lookup("true")); p->info.typ = mkint(); p->info.val.i = 1; mkscope(mktable(mktable(NULL)), 0); } ; exts : NAMESPACE ID '{' exts1 '}' { set_namespace($2->name); } | exts1 { } ; exts1 : /* empty */ { add_soap(); add_XML(); add_qname(); } | exts1 ext { } ; ext : dclrs ';' { } | pragma { } | t1 { } | t2 { } | error ';' { synerror("input before ; skipped"); while (sp > stack) { freetable(sp->table); exitscope(); } yyerrok; } ; pragma : PRAGMA { add_pragma($1); } ; /**************************************\ Declarations \**************************************/ decls : /* empty */ { transient &= ~6; permission = 0; } | dclrs ';' decls { } | PRIVATE ':' t3 decls { } | PROTECTED ':' t4 decls { } | PUBLIC ':' t5 decls { } | t1 decls t2 decls { } | ';' decls { } | error ';' { synerror("declaration expected"); yyerrok; } ; t1 : '[' { transient |= 1; } ; t2 : ']' { transient &= ~1; } ; t3 : { permission = (int)Sprivate; } ; t4 : { permission = (int)Sprotected; } ; t5 : { permission = 0; } ; dclrs : spec { } | spec dclr { } | spec fdclr func { } | ctor func { } | dtor func { } | sym { } | dclrs ',' dclr { } | dclrs ',' fdclr func { } | error ID { sprintf(errbuf, "incomplete type in declaration of '%s'", $2->name); synerror(errbuf); yyerrok; } | error ')' { synerror("function declaration?"); yyerrok; } ; dclr : ptrs ID arrayck tag bounds brinit { if (((int)$3.sto & (int)Stypedef) && sp->table->level == GLOBAL) { if (($3.typ->type != Tstruct && $3.typ->type != Tclass && $3.typ->type != Tunion && $3.typ->type != Tenum && $3.typ->type != Tenumsc) || ((is_binary($3.typ) || is_stdstr($3.typ)) && strcmp($2->name, $3.typ->id->name)) || strcmp($2->name, $3.typ->id->name)) { p = enter(typetable, $2); p->info.typ = mksymtype($3.typ, $2); if (((int)$3.sto & (int)Sextern)) { p->info.typ->transient = -1; p->info.typ->extsym = $2; } else if (is_external($3.typ)) p->info.typ->transient = -3; /* extern and volatile */ else p->info.typ->transient = $3.typ->transient; if (p->info.typ->width == 0) p->info.typ->width = 8; p->info.sto = $3.sto; p->info.typ->restriction = $3.typ->sym; p->info.typ->synonym = $3.typ->sym; if ($5.hasmin) { p->info.typ->hasmin = $5.hasmin; p->info.typ->incmin = $5.incmin; p->info.typ->imin = $5.imin; p->info.typ->rmin = $5.rmin; p->info.typ->synonym = NULL; } else { p->info.typ->hasmin = $3.typ->hasmin; p->info.typ->incmin = $3.typ->incmin; p->info.typ->imin = $3.typ->imin; p->info.typ->rmin = $3.typ->rmin; } if ($5.hasmax) { p->info.typ->hasmax = $5.hasmax; p->info.typ->incmax = $5.incmax; p->info.typ->imax = $5.imax; p->info.typ->rmax = $5.rmax; p->info.typ->synonym = NULL; } else { p->info.typ->hasmax = $3.typ->hasmax; p->info.typ->incmax = $3.typ->incmax; p->info.typ->imax = $3.typ->imax; p->info.typ->rmax = $3.typ->rmax; } if (p->info.typ->property == 1) p->info.typ->property = $3.typ->property; if ($5.pattern) { p->info.typ->pattern = $5.pattern; p->info.typ->synonym = NULL; } else if (!p->info.typ->pattern) { p->info.typ->pattern = $3.typ->pattern; } } if ($6.hasval) set_value(p, $3.typ, &$6); $2->token = TYPE; } else { p = enter(sp->table, $2); p->tag = $4; p->info.typ = $3.typ; p->info.sto = (Storage)((int)$3.sto | permission); if ($6.hasval) set_value(p, $3.typ, &$6); else p->info.val.i = sp->val; if ($5.minOccurs < 0) { if ($6.hasval || ((int)$3.sto & (int)Sattribute) || ((int)$3.sto & (int)Sspecial) || $3.typ->type == Tpointer || $3.typ->type == Ttemplate || is_anyAttribute($3.typ) || !strncmp($2->name, "__size", 6)) p->info.minOccurs = 0; else p->info.minOccurs = 1; } else { p->info.minOccurs = $5.minOccurs; } p->info.maxOccurs = $5.maxOccurs; p->info.nillable = $5.nillable; if (sp->mask) sp->val <<= 1; else sp->val++; p->info.offset = sp->offset; if (((int)$3.sto & (int)Sextern)) p->level = GLOBAL; else if (((int)$3.sto & (int)Stypedef)) ; else if (sp->grow) sp->offset += p->info.typ->width; else if (p->info.typ->width > sp->offset) sp->offset = p->info.typ->width; } sp->entry = p; } ; fdclr : ptrs name { if (((int)$1.sto & (int)Stypedef)) { sprintf(errbuf, "invalid typedef qualifier for '%s'", $2->name); semwarn(errbuf); } p = enter(sp->table, $2); p->info.typ = $1.typ; p->info.sto = $1.sto; p->info.hasval = False; p->info.offset = sp->offset; if (sp->grow) sp->offset += p->info.typ->width; else if (p->info.typ->width > sp->offset) sp->offset = p->info.typ->width; sp->entry = p; } ; id : ID { $$ = $1; } | TYPE { $$ = $1; } ; name : id { $$ = $1; } | OPERATOR '!' { $$ = lookup("operator!"); } | OPERATOR '~' { $$ = lookup("operator~"); } | OPERATOR '=' { $$ = lookup("operator="); } | OPERATOR PA { $$ = lookup("operator+="); } | OPERATOR NA { $$ = lookup("operator-="); } | OPERATOR TA { $$ = lookup("operator*="); } | OPERATOR DA { $$ = lookup("operator/="); } | OPERATOR MA { $$ = lookup("operator%="); } | OPERATOR AA { $$ = lookup("operator&="); } | OPERATOR XA { $$ = lookup("operator^="); } | OPERATOR OA { $$ = lookup("operator|="); } | OPERATOR LA { $$ = lookup("operator<<="); } | OPERATOR RA { $$ = lookup("operator>>="); } | OPERATOR OR { $$ = lookup("operator||"); } | OPERATOR AN { $$ = lookup("operator&&"); } | OPERATOR '|' { $$ = lookup("operator|"); } | OPERATOR '^' { $$ = lookup("operator^"); } | OPERATOR '&' { $$ = lookup("operator&"); } | OPERATOR EQ { $$ = lookup("operator=="); } | OPERATOR NE { $$ = lookup("operator!="); } | OPERATOR '<' { $$ = lookup("operator<"); } | OPERATOR LE { $$ = lookup("operator<="); } | OPERATOR '>' { $$ = lookup("operator>"); } | OPERATOR GE { $$ = lookup("operator>="); } | OPERATOR LS { $$ = lookup("operator<<"); } | OPERATOR RS { $$ = lookup("operator>>"); } | OPERATOR '+' { $$ = lookup("operator+"); } | OPERATOR '-' { $$ = lookup("operator-"); } | OPERATOR '*' { $$ = lookup("operator*"); } | OPERATOR '/' { $$ = lookup("operator/"); } | OPERATOR '%' { $$ = lookup("operator%"); } | OPERATOR PP { $$ = lookup("operator++"); } | OPERATOR NN { $$ = lookup("operator--"); } | OPERATOR AR { $$ = lookup("operator->"); } | OPERATOR'['']'{ $$ = lookup("operator[]"); } | OPERATOR'('')'{ $$ = lookup("operator()"); } | OPERATOR texp { s1 = c_storage($2.sto); s2 = c_type($2.typ); s = (char*)emalloc(strlen(s1) + strlen(s2) + 10); strcpy(s, "operator "); strcat(s, s1); strcat(s, s2); $$ = lookup(s); if (!$$) $$ = install(s, ID); } ; ctor : name { sp->entry = enter(sp->table, $1); sp->entry->info.typ = mknone(); sp->entry->info.sto = permission; sp->entry->info.offset = sp->offset; sp->node.typ = mkvoid(); sp->node.sto = Snone; if ($1 != sp->table->sym) { if (sp->table->level == GLOBAL) { sp->entry->info.typ = mkint(); sp->node.typ = mkint(); } else if (strncmp($1->name, "operator ", 9)) { sprintf(errbuf, "invalid constructor function '%s' or missing return type", $1->name); semerror(errbuf); } } } ; dtor : virtual '~' id { if ($3 != sp->table->sym) { sprintf(errbuf, "invalid destructor function '%s'", $3->name); semerror(errbuf); } else { s = (char*)emalloc(strlen($3->name) + 2); s2 = strrchr($3->name, ':'); if (s2 && *(s2+1) && (s2 == $3->name || *(s2-1) != ':')) { strncpy(s, $3->name, s2 - $3->name + 1); strcat(s, "~"); strcat(s, s2 + 1); } else { strcpy(s, "~"); strcat(s, $3->name); } sym = lookup(s); if (!sym) sym = install(s, ID); sp->entry = enter(sp->table, sym); sp->entry->info.typ = mknone(); sp->entry->info.sto = $1; sp->entry->info.offset = sp->offset; } sp->node.typ = mkvoid(); sp->node.sto = Snone; } ; func : fname '(' s6 fargso ')' const abstract { if ($1->level == GLOBAL) { if (!((int)$1->info.sto & (int)Sextern) && sp->entry && sp->entry->info.typ->type == Tpointer && ((Tnode*)sp->entry->info.typ->ref)->type == Tchar) { sprintf(errbuf, "last output parameter of service operation function prototype '%s' is a pointer to a char which will only return one byte: use char** instead to return a string", $1->sym->name); semwarn(errbuf); } if (((int)$1->info.sto & (int)Sextern)) { $1->info.typ = mkmethod($1->info.typ, sp->table); } else if (sp->entry && (sp->entry->info.typ->type == Tpointer || sp->entry->info.typ->type == Treference || sp->entry->info.typ->type == Tarray || is_transient(sp->entry->info.typ))) { if ($1->info.typ->type == Tint) { sp->entry->info.sto = (Storage)((int)sp->entry->info.sto | (int)Sreturn); $1->info.typ = mkfun(sp->entry); $1->info.typ->id = $1->sym; if (!is_transient(sp->entry->info.typ)) { if (!is_response(sp->entry->info.typ)) { if (!is_XML(sp->entry->info.typ) && !is_stdXML(sp->entry->info.typ)) add_response($1, sp->entry); } else { add_result(sp->entry->info.typ); } } add_request($1->sym, sp); } else { sprintf(errbuf, "return type of service operation function prototype '%s' must be integer", $1->sym->name); semerror(errbuf); } } else { sprintf(errbuf, "last output parameter of service operation function prototype '%s' is a return parameter and must be a pointer or reference, or use %s(..., void) for one-way sends", $1->sym->name, $1->sym->name); semerror(errbuf); } } else if ($1->level == INTERNAL) { $1->info.typ = mkmethod($1->info.typ, sp->table); $1->info.sto = (Storage)((int)$1->info.sto | (int)$6 | (int)$7); transient &= ~1; } exitscope(); } ; fname : { $$ = sp->entry; } ; fargso : /* empty */ { } | fargs { } ; fargs : farg { } | farg ',' fargs { } | error ID { sprintf(errbuf, "undefined '%s'", $2->name); synerror(errbuf); } | error ',' { synerror("formal argument expected"); yyerrok; } ; farg : tspec ptrs arg { } ; arg : arrayck init { if (sp->table->level != PARAM) p = enter(sp->table, gensymidx("param", (int)++sp->val)); else if (eflag || zflag == 0 || zflag > 3) p = enter(sp->table, gensymidx("_param", (int)++sp->val)); else p = enter(sp->table, gensym("_param")); if (((int)$1.sto & (int)Stypedef)) semwarn("typedef in function argument"); p->info.typ = $1.typ; p->info.sto = $1.sto; p->info.offset = sp->offset; if ($2.hasval) set_value(p, $1.typ, &$2); if (((int)$1.sto & (int)Sextern)) p->level = GLOBAL; else if (sp->grow) sp->offset += p->info.typ->width; else if (p->info.typ->width > sp->offset) sp->offset = p->info.typ->width; sp->entry = p; } | ID arrayck tag occurs init { if (soap_version == 2 && *$1->name == '_' && sp->table->level == GLOBAL) { sprintf(errbuf, "SOAP 1.2 does not support anonymous parameters '%s'", $1->name); semwarn(errbuf); } if (((int)$2.sto & (int)Stypedef)) semwarn("typedef in function argument"); p = enter(sp->table, $1); p->info.typ = $2.typ; p->info.sto = $2.sto; p->tag = $3; if ($4.minOccurs < 0) { if ($5.hasval || ((int)$2.sto & (int)Sattribute) || ((int)$2.sto & (int)Sspecial) || $2.typ->type == Tpointer || $2.typ->type == Ttemplate || is_anyAttribute($2.typ) || !strncmp($1->name, "__size", 6)) p->info.minOccurs = 0; else p->info.minOccurs = 1; } else { p->info.minOccurs = $4.minOccurs; } p->info.maxOccurs = $4.maxOccurs; p->info.nillable = $4.nillable; p->info.offset = sp->offset; if ($5.hasval) set_value(p, $2.typ, &$5); if (((int)$2.sto & (int)Sextern)) p->level = GLOBAL; else if (sp->grow) sp->offset += p->info.typ->width; else if (p->info.typ->width > sp->offset) sp->offset = p->info.typ->width; sp->entry = p; } ; sym : ID tag init { tmp = sp->node; p = enter(sp->table, $1); p->info.typ = mkint(); p->info.sto = permission; p->tag = $2; p->info.hasval = True; p->info.ptrval = False; p->info.fixed = $3.fixed; p->info.val.i = sp->val; if ($3.hasval) { set_value(p, p->info.typ, &$3); sp->val = p->info.val.i; } if (sp->mask) sp->val <<= 1; else sp->val++; p->info.offset = sp->offset; sp->entry = p; } ; /**************************************\ Type specification \**************************************/ /* texpf : type expression (subset of C/C++) */ texpf : texp { $$ = $1; } | tspec ptrs '(' s6 fargso ')' { $$.typ = mkmethod(tmp.typ, sp->table); transient &= ~1; exitscope(); } ; texp : tspec ptrs array { $$ = $3; } | tspec ptrs ID array { $$ = $4; } ; spec : /*empty */ /* { $$.typ = mkint(); $$.sto = Snone; sp->node = $$; } */ type { $$.typ = $1; $$.sto = Snone; sp->node = $$; } | store spec { $$.typ = $2.typ; $$.sto = (Storage)((int)$1 | (int)$2.sto); if (((int)$$.sto & (int)Sattribute)) { if (is_smart($2.typ)) { if (!is_primitive_or_string($2.typ->ref) && !is_stdstr((Tnode*)$2.typ->ref) && !is_binary((Tnode*)$2.typ->ref) && !is_external((Tnode*)$2.typ->ref)) { semwarn("invalid attribute smart pointer @type"); $$.sto = (Storage)((int)$$.sto & ~(int)Sattribute); } } else if ($2.typ->type == Tpointer) { if (!is_primitive_or_string($2.typ->ref) && !is_stdstr((Tnode*)$2.typ->ref) && !is_binary((Tnode*)$2.typ->ref) && !is_external((Tnode*)$2.typ->ref)) { semwarn("invalid attribute pointer @type"); $$.sto = (Storage)((int)$$.sto & ~(int)Sattribute); } } else if ( !is_primitive_or_string($2.typ) && !is_stdstr($2.typ) && !is_binary($2.typ) && !is_external($2.typ)) { semwarn("invalid attribute @type"); $$.sto = (Storage)((int)$$.sto & ~(int)Sattribute); } } sp->node = $$; if (((int)$1 & (int)Sextern)) transient = 0; } | type spec { if ($1->type == Tint) switch ($2.typ->type) { case Tchar: $$.typ = $2.typ; break; case Tshort: $$.typ = $2.typ; break; case Tint: $$.typ = $1; break; case Tlong: $$.typ = $2.typ; break; case Tllong: $$.typ = $2.typ; break; default: semwarn("invalid int type specified"); $$.typ = $2.typ; } else if ($1->type == Tuint) switch ($2.typ->type) { case Tchar: $$.typ = mkuchar(); break; case Tshort: $$.typ = mkushort(); break; case Tint: $$.typ = $1; break; case Tlong: $$.typ = mkulong(); break; case Tllong: $$.typ = mkullong(); break; default: semwarn("invalid unsigned type specified"); $$.typ = $2.typ; } else if ($1->type == Tlong) switch ($2.typ->type) { case Tint: $$.typ = $1; break; case Tlong: $$.typ = mkllong(); break; case Tuint: $$.typ = mkulong(); break; case Tulong: $$.typ = mkullong(); break; case Tdouble: $$.typ = mkldouble(); break; default: semwarn("invalid use of 'long'"); $$.typ = $2.typ; } else if ($1->type == Tulong) switch ($2.typ->type) { case Tint: $$.typ = $1; break; case Tlong: $$.typ = mkullong(); break; case Tuint: $$.typ = $1; break; case Tulong: $$.typ = mkullong(); break; default: semwarn("invalid use of 'long'"); $$.typ = $2.typ; } else if ($2.typ->type == Tint) $$.typ = $1; else semwarn("invalid type specified (missing ';' or type name used as non-type identifier?)"); $$.sto = $2.sto; sp->node = $$; } ; tspec : store { $$.typ = mkint(); $$.sto = $1; sp->node = $$; if (((int)$1 & (int)Sextern)) transient = 0; } | type { $$.typ = $1; $$.sto = Snone; sp->node = $$; } | store tspec { $$.typ = $2.typ; $$.sto = (Storage)((int)$1 | (int)$2.sto); if (((int)$$.sto & (int)Sattribute)) { if (is_smart($2.typ)) { if (!is_primitive_or_string((Tnode*)$2.typ->ref) && !is_stdstr((Tnode*)$2.typ->ref) && !is_binary((Tnode*)$2.typ->ref) && !is_external((Tnode*)$2.typ->ref)) { semwarn("invalid attribute smart pointer @type"); $$.sto = (Storage)((int)$$.sto & ~(int)Sattribute); } } else if ($2.typ->type == Tpointer) { if (!is_primitive_or_string((Tnode*)$2.typ->ref) && !is_stdstr((Tnode*)$2.typ->ref) && !is_binary((Tnode*)$2.typ->ref) && !is_external((Tnode*)$2.typ->ref)) { semwarn("invalid attribute pointer @type"); $$.sto = (Storage)((int)$$.sto & ~(int)Sattribute); } } else if ( !is_primitive_or_string($2.typ) && !is_stdstr($2.typ) && !is_binary($2.typ) && !is_external($2.typ)) { semwarn("invalid attribute @type"); $$.sto = (Storage)((int)$$.sto & ~(int)Sattribute); } } sp->node = $$; if (((int)$1 & (int)Sextern)) transient = 0; } | type tspec { if ($1->type == Tint) switch ($2.typ->type) { case Tchar: $$.typ = $2.typ; break; case Tshort: $$.typ = $2.typ; break; case Tint: $$.typ = $1; break; case Tlong: $$.typ = $2.typ; break; case Tllong: $$.typ = $2.typ; break; default: semwarn("invalid int type specified"); $$.typ = $2.typ; } else if ($1->type == Tuint) switch ($2.typ->type) { case Tchar: $$.typ = mkuchar(); break; case Tshort: $$.typ = mkushort(); break; case Tint: $$.typ = $1; break; case Tlong: $$.typ = mkulong(); break; case Tllong: $$.typ = mkullong(); break; default: semwarn("invalid unsigned type specified"); $$.typ = $2.typ; } else if ($1->type == Tlong) switch ($2.typ->type) { case Tint: $$.typ = $1; break; case Tlong: $$.typ = mkllong(); break; case Tuint: $$.typ = mkulong(); break; case Tulong: $$.typ = mkullong(); break; case Tdouble: $$.typ = mkldouble(); break; default: semwarn("invalid use of 'long'"); $$.typ = $2.typ; } else if ($1->type == Tulong) switch ($2.typ->type) { case Tint: $$.typ = $1; break; case Tlong: $$.typ = mkullong(); break; case Tuint: $$.typ = $1; break; case Tulong: $$.typ = mkullong(); break; default: semwarn("invalid use of 'long'"); $$.typ = $2.typ; } else if ($2.typ->type == Tint) $$.typ = $1; else semwarn("invalid type specified (missing ';' or type name used as non-type identifier?)"); $$.sto = $2.sto; sp->node = $$; } ; type : VOID { $$ = mkvoid(); } | BOOL { $$ = mkbool(); } | CHAR { $$ = mkchar(); } | WCHAR { $$ = mkwchart(); } | SHORT { $$ = mkshort(); } | INT { $$ = mkint(); } | LONG { $$ = mklong(); } | LLONG { $$ = mkllong(); } | ULLONG { $$ = mkullong(); } | SIZE { $$ = mksize(); } | FLOAT { $$ = mkfloat(); } | DOUBLE { $$ = mkdouble(); } | SIGNED { $$ = mkint(); } | UNSIGNED { $$ = mkuint(); } | UCHAR { $$ = mkuchar(); } | USHORT { $$ = mkushort(); } | UINT { $$ = mkuint(); } | ULONG { $$ = mkulong(); } | TIME { $$ = mktimet(); } | TEMPLATE '<' tname id '>' CLASS id { if (!(p = entry(templatetable, $7))) { p = enter(templatetable, $7); p->info.typ = mktemplate(NULL, $7); $7->token = TYPE; } $$ = p->info.typ; } | CLASS '{' s2 decls '}' { sym = gensym("_Struct"); sprintf(errbuf, "anonymous class will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(classtable, sym))) { if (p->info.typ->ref || p->info.typ->type != Tclass) { sprintf(errbuf, "class '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } } else { p = enter(classtable, sym); p->info.typ = mkclass(NULL, 0); } sym->token = TYPE; sp->table->sym = sym; p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; p->info.typ->id = sym; $$ = p->info.typ; exitscope(); } | classid '{' decls '}' { if ((p = entry(classtable, $1->sym)) && p->info.typ->ref) { if (is_mutable(p)) { if (merge((Table*)p->info.typ->ref, sp->table)) { sprintf(errbuf, "member name clash in class '%s' declared at %s:%d", $1->sym->name, p->filename, p->lineno); semerror(errbuf); } p->info.typ->width += sp->offset; } } else { p = reenter(classtable, $1->sym); p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; p->info.typ->id = p->sym; if (p->info.typ->base) sp->table->prev = (Table*)entry(classtable, p->info.typ->base)->info.typ->ref; } $$ = p->info.typ; exitscope(); } | classid ':' base '{' decls '}' { p = reenter(classtable, $1->sym); if (!$3) { semerror("invalid base class"); } else { sp->table->prev = (Table*)$3->info.typ->ref; if (!sp->table->prev && !$3->info.typ->transient) { sprintf(errbuf, "class '%s' has incomplete type (if this class is not serializable then declare 'extern class %s')'", $3->sym->name, $3->sym->name); semerror(errbuf); } p->info.typ->base = $3->info.typ->id; } p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; p->info.typ->id = p->sym; $$ = p->info.typ; exitscope(); } | class { $1->info.typ->id = $1->sym; $$ = $1->info.typ; } | STRUCT '{' s2 decls '}' { sym = gensym("_Struct"); sprintf(errbuf, "anonymous struct will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(classtable, sym))) { if (p->info.typ->ref || p->info.typ->type != Tstruct) { sprintf(errbuf, "struct '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; } } else { p = enter(classtable, sym); p->info.typ = mkstruct(sp->table, sp->offset); } sp->table->sym = sym; p->info.typ->id = sym; $$ = p->info.typ; exitscope(); } | structid '{' decls '}' { if ((p = entry(classtable, $1->sym)) && p->info.typ->ref) { if (is_mutable(p)) { if (merge((Table*)p->info.typ->ref, sp->table)) { sprintf(errbuf, "member name clash in struct '%s' declared at %s:%d", $1->sym->name, p->filename, p->lineno); semerror(errbuf); } p->info.typ->width += sp->offset; } } else { p = reenter(classtable, $1->sym); p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; p->info.typ->id = p->sym; } $$ = p->info.typ; exitscope(); } | STRUCT id { if ((p = entry(classtable, $2))) { if (p->info.typ->type == Tstruct) { $$ = p->info.typ; } else { sprintf(errbuf, "'struct '%s' redeclaration (line %d)", $2->name, p->lineno); semerror(errbuf); $$ = mkint(); } } else { p = enter(classtable, $2); $$ = p->info.typ = mkstruct(NULL, 0); p->info.typ->id = $2; } } | UNION '{' s3 decls '}' { sym = gensym("_Union"); sprintf(errbuf, "anonymous union will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(classtable, sym))) { if (p->info.typ->ref) { sprintf(errbuf, "union or struct '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; } } else { p = enter(classtable, sym); p->info.typ = mkunion(sp->table, sp->offset); } sp->table->sym = sym; p->info.typ->id = sym; $$ = p->info.typ; exitscope(); } | unionid '{' decls '}' { if ((p = entry(classtable, $1->sym)) && p->info.typ->ref) { if (is_mutable(p)) { if (merge((Table*)p->info.typ->ref, sp->table)) { sprintf(errbuf, "member name clash in union '%s' declared at line %d", $1->sym->name, p->lineno); semerror(errbuf); } if (p->info.typ->width < sp->offset) p->info.typ->width = sp->offset; } } else { p = reenter(classtable, $1->sym); p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; p->info.typ->id = p->sym; } $$ = p->info.typ; exitscope(); } | UNION id { if ((p = entry(classtable, $2))) { if (p->info.typ->type == Tunion) { $$ = p->info.typ; } else { sprintf(errbuf, "'union %s' redeclaration (line %d)", $2->name, p->lineno); semerror(errbuf); $$ = mkint(); } } else { p = enter(classtable, $2); $$ = p->info.typ = mkunion(NULL, 0); p->info.typ->id = $2; } } | ENUM '{' s2 dclrs s5 '}' { sym = gensym("_Enum"); sprintf(errbuf, "anonymous enum will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(enumtable, sym))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = 4; /* 4 = enum */ } } else { p = enter(enumtable, sym); p->info.typ = mkenum(sp->table); } p->info.typ->id = sym; $$ = p->info.typ; exitscope(); } | ENUM '*' '{' s2 dclrs s5 '}' { sym = gensym("_Enum"); sprintf(errbuf, "anonymous enum will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(enumtable, sym))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = 9; /* 9 = mask */ } } else { p = enter(enumtable, sym); p->info.typ = mkmask(sp->table); } p->info.typ->id = sym; $$ = p->info.typ; exitscope(); } | enum '{' s2 dclrs s5 '}' { if ((p = entry(enumtable, $1->sym))) if (!p->info.typ->ref) p->info.typ->ref = sp->table; p->info.typ->id = $1->sym; $$ = p->info.typ; exitscope(); } | enumsc '{' s2 dclrs s5 '}' { if ((p = entry(enumtable, $1->sym))) if (!p->info.typ->ref) p->info.typ->ref = sp->table; p->info.typ->id = $1->sym; $$ = p->info.typ; exitscope(); } | mask '{' s4 dclrs s5 '}' { if ((p = entry(enumtable, $1->sym))) { if (!p->info.typ->ref) { p->info.typ->ref = sp->table; p->info.typ->width = 9; /* 9 = mask */ } } p->info.typ->id = $1->sym; $$ = p->info.typ; exitscope(); } | masksc '{' s4 dclrs s5 '}' { if ((p = entry(enumtable, $1->sym))) { if (!p->info.typ->ref) { p->info.typ->ref = sp->table; p->info.typ->width = 9; /* 9 = mask */ } } p->info.typ->id = $1->sym; $$ = p->info.typ; exitscope(); } | ENUM id { if ((p = entry(enumtable, $2))) { if (p->info.typ->type != Tenum) { sprintf(errbuf, "'enum %s' used where enum class is expected", $2->name); semwarn(errbuf); } $$ = p->info.typ; } else { p = enter(enumtable, $2); $$ = p->info.typ = mkenum(NULL); p->info.typ->id = $2; } } | ENUM sc { if ((p = entry(enumtable, $2))) { if (p->info.typ->type != Tenumsc) { sprintf(errbuf, "'enum class %s' used where enum is expected", $2->name); semwarn(errbuf); } $$ = p->info.typ; } else { p = enter(enumtable, $2); $$ = p->info.typ = mkenumsc(NULL); p->info.typ->id = $2; $2->token = TYPE; } } | TYPE { if ((p = entry(typetable, $1))) { $$ = p->info.typ; } else if ((p = entry(classtable, $1))) { $$ = p->info.typ; } else if ((p = entry(enumtable, $1))) { $$ = p->info.typ; } else if ($1 == lookup("std::string") || $1 == lookup("std::wstring")) { p = enter(classtable, $1); $$ = p->info.typ = mkclass(NULL, 8); p->info.typ->id = $1; if (cflag) p->info.typ->transient = 1; /* make std::string transient in C */ else p->info.typ->transient = -2; /* otherwise volatile in C++ */ } else { sprintf(errbuf, "unknown type '%s'", $1->name); semerror(errbuf); $$ = mkint(); } } | TYPE '<' texpf '>' { if ((p = entry(templatetable, $1))) { $$ = mktemplate($3.typ, $1); if (p->info.typ->transient) $$->transient = p->info.typ->transient; } else if ($1 == lookup("std::deque")) { add_pragma("#include "); p = enter(templatetable, $1); $$ = p->info.typ = mktemplate($3.typ, $1); } else if ($1 == lookup("std::list")) { add_pragma("#include "); p = enter(templatetable, $1); $$ = p->info.typ = mktemplate($3.typ, $1); } else if ($1 == lookup("std::vector")) { add_pragma("#include "); p = enter(templatetable, $1); $$ = p->info.typ = mktemplate($3.typ, $1); } else if ($1 == lookup("std::set")) { add_pragma("#include "); p = enter(templatetable, $1); $$ = p->info.typ = mktemplate($3.typ, $1); } else if ($1 == lookup("std::queue")) { add_pragma("#include "); p = enter(templatetable, $1); $$ = p->info.typ = mktemplate($3.typ, $1); $$->transient = 1; /* not serializable */ } else if ($1 == lookup("std::stack")) { add_pragma("#include "); p = enter(templatetable, $1); $$ = p->info.typ = mktemplate($3.typ, $1); $$->transient = 1; /* not serializable */ } else if ($1 == lookup("std::shared_ptr") || $1 == lookup("std::unique_ptr") || $1 == lookup("std::auto_ptr")) { $$ = mktemplate($3.typ, $1); $$->transient = -2; /* volatile indicates smart pointer template */ if (!c11flag) semwarn("To use smart pointers you should also use wsdl2h and soapcpp2 with option -c++11 or -c++14"); } else if ($1 == lookup("std::weak_ptr") || $1 == lookup("std::function")) { $$ = mktemplate($3.typ, $1); $$->transient = 1; /* not serializable */ } else { semerror("undefined template"); $$ = mkint(); } } | error ID error { sprintf(errbuf, "undeclared '%s'", $2->name); synerror(errbuf); $$ = mkint(); } | error ID '>' { sprintf(errbuf, "perhaps trying to use a template with an undefined type parameter '%s'?", $2->name); synerror(errbuf); $$ = mkint(); } | error '>' { synerror("perhaps trying to use an undefined template or template with a non-type template parameter? Declare 'template class name'"); $$ = mkint(); } | CLASS error '}' { synerror("malformed class definition (use spacing around ':' to separate derived : base)"); yyerrok; $$ = mkint(); } | STRUCT error '}' { synerror("malformed struct definition"); yyerrok; $$ = mkint(); } | UNION error '}' { synerror("malformed union definition"); yyerrok; $$ = mkint(); } | ENUM error '}' { synerror("malformed enum definition"); yyerrok; $$ = mkint(); } ; structid: struct s2 { sp->table->sym = $1->sym; $$ = $1; } ; struct : STRUCT id { if ((p = entry(classtable, $2))) { if (p->info.typ->ref) { if (!is_mutable(p)) { sprintf(errbuf, "struct '%s' already declared at %s:%d", $2->name, p->filename, p->lineno); semerror(errbuf); } } else { p = reenter(classtable, $2); } p->info.typ->transient = transient; } else { p = enter(classtable, $2); p->info.typ = mkstruct(NULL, 0); } $$ = p; } ; classid : class s2 { sp->table->sym = $1->sym; $$ = $1; } ; class : CLASS id { if ((p = entry(classtable, $2))) { if (p->info.typ->ref) { if (!is_mutable(p)) { sprintf(errbuf, "class '%s' already declared at %s:%d (redundant 'class' specifier here?)", $2->name, p->filename, p->lineno); semerror(errbuf); } } else { p = reenter(classtable, $2); } p->info.typ->transient = transient; } else { p = enter(classtable, $2); p->info.typ = mkclass(NULL, 0); p->info.typ->id = p->sym; } $2->token = TYPE; $$ = p; } ; unionid : union s3 { sp->table->sym = $1->sym; $$ = $1; } ; union : UNION id { if ((p = entry(classtable, $2))) { if (p->info.typ->ref) { if (!is_mutable(p)) { sprintf(errbuf, "union '%s' already declared at %s:%d", $2->name, p->filename, p->lineno); semerror(errbuf); } } else { p = reenter(classtable, $2); } p->info.typ->transient = transient; } else { p = enter(classtable, $2); p->info.typ = mkunion(NULL, 0); } $$ = p; } ; enum : ENUM id utype { if ((p = entry(enumtable, $2))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", $2->name, p->filename, p->lineno); semerror(errbuf); } } else { p = enter(enumtable, $2); p->info.typ = mkenum(0); } p->info.typ->width = (int)$3; $$ = p; } ; enumsc : ENUM sc utype { if ((p = entry(enumtable, $2))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", $2->name, p->filename, p->lineno); semerror(errbuf); } } else { p = enter(enumtable, $2); p->info.typ = mkenumsc(0); } p->info.typ->width = (int)$3; $2->token = TYPE; $$ = p; } ; mask : ENUM '*' id utype { if ((p = entry(enumtable, $3))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", $3->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ = mkmask(0); } } else { p = enter(enumtable, $3); p->info.typ = mkmask(0); } $$ = p; } ; masksc : ENUM '*' sc utype { if ((p = entry(enumtable, $3))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", $3->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ = mkmasksc(0); } } else { p = enter(enumtable, $3); p->info.typ = mkmasksc(0); } $3->token = TYPE; $$ = p; } ; sc : STRUCT id { $$ = $2; if (!c11flag) semwarn("To use scoped enumerations (enum class) you should also use wsdl2h and soapcpp2 with option -c++11 or -c++14"); } | CLASS id { $$ = $2; if (!c11flag) semwarn("To use scoped enumerations (enum class) you must also use wsdl2h and soapcpp2 with option -c++11 or -c++14"); } ; utype : ':' CHAR { $$ = 1; } | ':' WCHAR { $$ = 4; } | ':' SHORT { $$ = 2; } | ':' INT { $$ = 4; } | ':' LONG { $$ = 4; } | ':' LLONG { $$ = 8; } | ':' TYPE { $$ = 4; p = entry(typetable, $2); if (!p) p = entry(enumtable, $2); if (!p) semerror("enum underlying type must be one of int8_t, int16_t, int32_t, int64_t"); else $$ = p->info.typ->width; } | ':' { semerror("enum underlying type must be one of int8_t, int16_t, int32_t, int64_t"); $$ = 4; } | /* empty */ { $$ = 4; /* 4 = enum */ } ; tname : CLASS { } | STRUCT { } | TYPENAME { } ; base : PROTECTED base { $$ = $2; } | PRIVATE base { $$ = $2; } | PUBLIC base { $$ = $2; } | TYPE { $$ = entry(classtable, $1); if (!$$) { p = entry(typetable, $1); if (p && (p->info.typ->type == Tclass || p->info.typ->type == Tstruct)) $$ = p; } } | STRUCT id { $$ = entry(classtable, $2); } | CLASS id { $$ = entry(classtable, $2); } ; s2 : /* empty */ { if (transient <= -2) transient = 0; permission = 0; enterscope(mktable(NULL), 0); sp->entry = NULL; } ; s3 : /* empty */ { if (transient <= -2) transient = 0; permission = 0; enterscope(mktable(NULL), 0); sp->entry = NULL; sp->grow = False; } ; s4 : /* empty */ { enterscope(mktable(NULL), 0); sp->entry = NULL; sp->mask = True; sp->val = 1; } ; s5 : /* empty */ { } | ',' { } ; s6 : /* empty */ { if (sp->table->level == INTERNAL) transient |= 1; permission = 0; enterscope(mktable(NULL), 0); sp->entry = NULL; sp->table->level = PARAM; } ; store : AUTO { $$ = Sauto; } | REGISTER { $$ = Sregister; } | STATIC { $$ = Sstatic; } | EXPLICIT { $$ = Sexplicit; } | EXTERN { $$ = Sextern; transient = 1; } | TYPEDEF { $$ = Stypedef; } | VIRTUAL { $$ = Svirtual; } | CONST { $$ = Sconst; } | FINAL { $$ = Sfinal; } | OVERRIDE { $$ = Soverride; } | FRIEND { $$ = Sfriend; } | INLINE { $$ = Sinline; } | MUSTUNDERSTAND { $$ = SmustUnderstand; } | RETURN { $$ = Sreturn; } | '@' { $$ = Sattribute; if (eflag) semwarn("SOAP RPC encoding does not support XML attributes"); } | '$' { $$ = Sspecial; } | VOLATILE { $$ = Sextern; transient = -2; } | MUTABLE { $$ = Smutable; transient = -4; } ; const : /* empty */ { $$ = Snone; } | const CONST { $$ = (Storage)((int)$1 | (int)Sconstobj); } | const FINAL { $$ = (Storage)((int)$1 | (int)Sfinal); } | const OVERRIDE { $$ = (Storage)((int)$1 | (int)Soverride); } ; abstract: /* empty */ { $$ = Snone; } | '=' LNG { $$ = Sabstract; } ; virtual : /* empty */ { $$ = Snone; } | VIRTUAL { $$ = Svirtual; } ; ptrs : /* empty */ { $$ = tmp = sp->node; } | ptrs '*' { /* handle const pointers, such as const char* */ if (((int)tmp.sto & (int)Sconst)) tmp.sto = (Storage)(((int)tmp.sto & ~(int)Sconst) | (int)Sconstptr); tmp.typ = mkpointer(tmp.typ); tmp.typ->transient = transient; $$ = tmp; } | ptrs '&' { tmp.typ = mkreference(tmp.typ); tmp.typ->transient = transient; $$ = tmp; } | ptrs AN { tmp.typ = mkrvalueref(tmp.typ); tmp.typ->transient = transient; $$ = tmp; } ; array : /* empty */ { $$ = tmp; } /* tmp is inherited */ | '[' cexp ']' array { if (!bflag && $4.typ->type == Tchar) { sprintf(errbuf, "char[" SOAP_LONG_FORMAT "] will be serialized as an array of " SOAP_LONG_FORMAT " bytes: use soapcpp2 option -b to enable char[] string serialization or use char* for strings", $2.val.i, $2.val.i); semwarn(errbuf); } if ($2.hasval && $2.typ->type == Tint && $2.val.i > 0 && $4.typ->width > 0) { $$.typ = mkarray($4.typ, (int) $2.val.i * $4.typ->width); } else { $$.typ = mkarray($4.typ, 0); semerror("undetermined array size"); } $$.sto = $4.sto; } | '[' ']' array { $$.typ = mkpointer($3.typ); /* zero size array = pointer */ $$.sto = $3.sto; } ; arrayck : array { if ($1.typ->type == Tstruct || $1.typ->type == Tclass) { if (!$1.typ->ref && !$1.typ->transient && !((int)$1.sto & (int)Stypedef)) { if ($1.typ->type == Tstruct) sprintf(errbuf, "struct '%s' has incomplete type (if this struct is not serializable then declare 'extern struct %s')", $1.typ->id->name, $1.typ->id->name); else sprintf(errbuf, "class '%s' has incomplete type (if this class is not serializable then declare 'extern class %s')", $1.typ->id->name, $1.typ->id->name); semerror(errbuf); } } $$ = $1; } ; brinit : init { $$ = $1; } | '{' cexp '}' { if ($2.hasval) { $$.typ = $2.typ; $$.hasval = True; $$.fixed = False; $$.val = $2.val; } else { $$.hasval = False; semerror("initialization expression not constant"); } } ; init : /* empty */ { $$.hasval = False; $$.fixed = False; } | '=' cexp { if ($2.hasval) { $$.typ = $2.typ; $$.hasval = True; $$.fixed = False; $$.val = $2.val; } else { $$.hasval = False; semerror("initialization expression not constant"); } } | EQ cexp { if ($2.hasval) { $$.typ = $2.typ; $$.hasval = True; $$.fixed = True; $$.val = $2.val; } else { $$.hasval = False; semerror("initialization expression not constant"); } } ; tag : /* empty */ { $$ = NULL; } | TAG { $$ = $1; } ; occurs : nullptr { $$.minOccurs = -1; $$.maxOccurs = 1; $$.hasmin = False; $$.hasmax = False; $$.imin = 0; $$.imax = 0; $$.rmin = 0.0; $$.rmax = 0.0; $$.incmin = True; $$.incmax = True; $$.nillable = $1; $$.pattern = NULL; } | nullptr LNG { $$.minOccurs = $2; $$.maxOccurs = 1; if ($$.minOccurs < 0) $$.minOccurs = -1; $$.hasmin = False; $$.hasmax = False; $$.imin = 0; $$.imax = 0; $$.rmin = 0.0; $$.rmax = 0.0; $$.incmin = True; $$.incmax = True; $$.nillable = $1; $$.pattern = NULL; } | nullptr LNG ':' { $$.minOccurs = $2; $$.maxOccurs = 1; if ($$.minOccurs < 0) $$.minOccurs = -1; $$.hasmin = False; $$.hasmax = False; $$.imin = 0; $$.imax = 0; $$.rmin = 0.0; $$.rmax = 0.0; $$.incmin = True; $$.incmax = True; $$.nillable = $1; $$.pattern = NULL; } | nullptr LNG ':' LNG { $$.minOccurs = $2; $$.maxOccurs = $4; if ($$.minOccurs < 0 || $$.maxOccurs < 0) { $$.minOccurs = -1; $$.maxOccurs = 1; } else if ($$.minOccurs > $$.maxOccurs) { $$.minOccurs = -1; $$.maxOccurs = 1; } $$.hasmin = False; $$.hasmax = False; $$.imin = 0; $$.imax = 0; $$.rmin = 0.0; $$.rmax = 0.0; $$.incmin = True; $$.incmax = True; $$.nillable = $1; $$.pattern = NULL; } | nullptr ':' LNG { $$.minOccurs = -1; $$.maxOccurs = $3; if ($$.maxOccurs < 0) { $$.minOccurs = -1; $$.maxOccurs = 1; } $$.hasmin = False; $$.hasmax = False; $$.imin = 0; $$.imax = 0; $$.rmin = 0.0; $$.rmax = 0.0; $$.incmin = True; $$.incmax = True; $$.nillable = $1; $$.pattern = NULL; } ; bounds : nullptr patt { $$.hasmin = False; $$.hasmax = False; $$.minOccurs = -1; $$.maxOccurs = 1; $$.imin = 0; $$.imax = 0; $$.rmin = 0.0; $$.rmax = 0.0; $$.incmin = True; $$.incmax = True; $$.nillable = $1; $$.pattern = $2; } | nullptr patt value min { $$.hasmin = True; $$.hasmax = False; $$.incmin = $4.incmin; $$.incmax = $4.incmax; $$.minOccurs = $3.i; $$.maxOccurs = 1; if ($$.minOccurs < 0) $$.minOccurs = -1; $$.imin = $3.i; $$.imax = 0; $$.rmin = $3.r; $$.rmax = 0.0; $$.nillable = $1; $$.pattern = $2; } | nullptr patt value minmax value { $$.hasmin = True; $$.hasmax = True; $$.incmin = $4.incmin; $$.incmax = $4.incmax; $$.minOccurs = $3.i; $$.maxOccurs = $5.i; if ($$.minOccurs < 0 || $$.maxOccurs < 0) { $$.minOccurs = -1; $$.maxOccurs = 1; } else if ($$.minOccurs > $$.maxOccurs) { $$.minOccurs = -1; $$.maxOccurs = 1; } $$.imin = $3.i; $$.imax = $5.i; $$.rmin = $3.r; $$.rmax = $5.r; $$.nillable = $1; $$.pattern = $2; } | nullptr patt max value { $$.hasmin = False; $$.hasmax = True; $$.incmin = $3.incmin; $$.incmax = $3.incmax; $$.minOccurs = -1; $$.maxOccurs = $4.i; if ($$.maxOccurs < 0) { $$.minOccurs = -1; $$.maxOccurs = 1; } $$.imin = 0; $$.imax = $4.i; $$.rmin = 0.0; $$.rmax = $4.r; $$.nillable = $1; $$.pattern = $2; } ; nullptr : /* empty */ { $$ = zflag >= 1 && zflag <= 3; /* False, unless version 2.8.30 or earlier */ } | null { $$ = True; } ; patt : /* empty */ { $$ = NULL; } | STR { $$ = $1; } ; value : DBL { $$.i = (LONG64)($$.r = $1); } | LNG { $$.r = (double)($$.i = $1); } | CHR { $$.r = (double)($$.i = $1); } | '+' value { $$.i = +$2.i; $$.r = +$2.r; } | '-' value { $$.i = -$2.i; $$.r = -$2.r; } ; min : /* empty */ { $$.incmin = $$.incmax = True; } | ':' { $$.incmin = $$.incmax = True; } | '<' ':' { $$.incmin = False; $$.incmax = True; } | '<' { $$.incmin = False; $$.incmax = True; } ; minmax : ':' { $$.incmin = $$.incmax = True; } | '<' ':' { $$.incmin = False; $$.incmax = True; } | ':' '<' { $$.incmin = True; $$.incmax = False; } | '<' ':' '<' { $$.incmin = False; $$.incmax = False; } | '<' { $$.incmin = False; $$.incmax = False; } ; max : ':' { $$.incmin = $$.incmax = True; } | ':' '<' { $$.incmin = True; $$.incmax = False; } | '<' { $$.incmin = True; $$.incmax = False; } ; /**************************************\ Expressions \**************************************/ expr : expr ',' expr { $$ = $3; } | cexp { $$ = $1; } ; /* cexp : conditional expression */ cexp : obex '?' qexp ':' cexp { $$.typ = $3.typ; $$.sto = Snone; $$.hasval = False; } | oexp ; /* qexp : true-branch of ? : conditional expression */ qexp : expr { $$ = $1; } ; /* oexp : or-expression */ oexp : obex OR aexp { $$.hasval = False; $$.typ = mkint(); } | aexp { $$ = $1; } ; obex : oexp { $$ = $1; } ; /* aexp : and-expression */ aexp : abex AN rexp { $$.hasval = False; $$.typ = mkint(); } | rexp { $$ = $1; } ; abex : aexp { $$ = $1; } ; /* rexp : relational expression */ rexp : rexp '|' rexp { $$ = iop("|", $1, $3); } | rexp '^' rexp { $$ = iop("^", $1, $3); } | rexp '&' rexp { $$ = iop("&", $1, $3); } | rexp EQ rexp { $$ = relop("==", $1, $3); } | rexp NE rexp { $$ = relop("!=", $1, $3); } | rexp '<' rexp { $$ = relop("<", $1, $3); } | rexp LE rexp { $$ = relop("<=", $1, $3); } | rexp '>' rexp { $$ = relop(">", $1, $3); } | rexp GE rexp { $$ = relop(">=", $1, $3); } | rexp LS rexp { $$ = iop("<<", $1, $3); } | rexp RS rexp { $$ = iop(">>", $1, $3); } | rexp '+' rexp { $$ = op("+", $1, $3); } | rexp '-' rexp { $$ = op("-", $1, $3); } | rexp '*' rexp { $$ = op("*", $1, $3); } | rexp '/' rexp { $$ = op("/", $1, $3); } | rexp '%' rexp { $$ = iop("%", $1, $3); } | lexp { $$ = $1; } ; /* lexp : lvalue kind of expression with optional prefix contructs */ lexp : '!' lexp { if ($2.hasval) $$.val.i = !$2.val.i; $$.typ = $2.typ; $$.hasval = $2.hasval; } | '~' lexp { if ($2.hasval) $$.val.i = ~$2.val.i; $$.typ = $2.typ; $$.hasval = $2.hasval; } | '-' lexp { if ($2.hasval) { if (integer($2.typ)) $$.val.i = -$2.val.i; else if (real($2.typ)) $$.val.r = -$2.val.r; else typerror("string?"); } $$.typ = $2.typ; $$.hasval = $2.hasval; } | '+' lexp { $$ = $2; } | '*' lexp { if ($2.typ->type == Tpointer) $$.typ = (Tnode*)$2.typ->ref; else { typerror("dereference of non-pointer type"); $$.typ = $2.typ; } $$.sto = Snone; $$.hasval = False; } | '&' lexp { $$.typ = mkpointer($2.typ); $$.sto = Snone; $$.hasval = False; } | SIZEOF '(' texp ')' { $$.hasval = True; $$.fixed = False; $$.typ = mkint(); $$.val.i = $3.typ->width; } | pexp { $$ = $1; } ; /* pexp : primitive expression with optional postfix constructs */ pexp : '(' expr ')' { $$ = $2; } | ID { if (!(p = enumentry($1))) p = undefined($1); else $$.hasval = True; $$.fixed = False; $$.typ = p->info.typ; $$.val = p->info.val; } | LNG { $$.typ = mkint(); $$.hasval = True; $$.fixed = False; $$.val.i = $1; } | DBL { $$.typ = mkfloat(); $$.hasval = True; $$.fixed = False; $$.val.r = $1; } | CHR { $$.typ = mkchar(); $$.hasval = True; $$.fixed = False; $$.val.i = $1; } | STR { $$.typ = mkstring(); $$.hasval = True; $$.fixed = False; $$.val.s = $1; } | CFALSE { $$.typ = mkbool(); $$.hasval = True; $$.fixed = False; $$.val.i = 0; } | CTRUE { $$.typ = mkbool(); $$.hasval = True; $$.fixed = False; $$.val.i = 1; } ; %% int yywrap(void) { return 1; } /**************************************\ Support routines \**************************************/ static Node op(const char *op, Node p, Node q) { Node r; r.typ = p.typ; r.sto = Snone; if (p.hasval && q.hasval) { if (integer(p.typ) && integer(q.typ)) switch (op[0]) { case '|': r.val.i = p.val.i | q.val.i; break; case '^': r.val.i = p.val.i ^ q.val.i; break; case '&': r.val.i = p.val.i & q.val.i; break; case '<': r.val.i = p.val.i << q.val.i; break; case '>': r.val.i = p.val.i >> q.val.i; break; case '+': r.val.i = p.val.i + q.val.i; break; case '-': r.val.i = p.val.i - q.val.i; break; case '*': r.val.i = p.val.i * q.val.i; break; case '/': r.val.i = q.val.i != 0 ? p.val.i / q.val.i : 0; break; case '%': r.val.i = q.val.i != 0 ? p.val.i % q.val.i : 0; break; default: typerror(op); } else if (real(p.typ) && real(q.typ)) switch (op[0]) { case '+': r.val.r = p.val.r + q.val.r; break; case '-': r.val.r = p.val.r - q.val.r; break; case '*': r.val.r = p.val.r * q.val.r; break; case '/': r.val.r = q.val.r != 0 ? p.val.r / q.val.r : 0.0; break; default: typerror(op); } else semerror("invalid constant operation"); r.hasval = True; r.fixed = False; } else { r.typ = mgtype(p.typ, q.typ); r.hasval = False; } return r; } static Node iop(const char *iop, Node p, Node q) { if (integer(p.typ) && integer(q.typ)) return op(iop, p, q); typerror("integer operands only"); return p; } static Node relop(const char *op, Node p, Node q) { Node r; r.typ = mkint(); r.sto = Snone; r.hasval = True; r.fixed = False; r.val.i = 1; sprintf(errbuf, "comparison '%s' not evaluated and considered true", op); semwarn(errbuf); if (p.typ->type != Tpointer || p.typ != q.typ) r.typ = mgtype(p.typ, q.typ); return r; } /**************************************\ Scope management \**************************************/ /* mkscope - initialize scope stack with a new table and offset */ static void mkscope(Table *table, int offset) { sp = stack-1; enterscope(table, offset); } /* enterscope - enter a new scope by pushing a new table and offset on the stack */ static void enterscope(Table *table, int offset) { if (++sp == stack + MAXNEST) execerror("maximum scope nesting depth exceeded"); sp->table = table; sp->entry = NULL; sp->node.typ = mkint(); sp->node.sto = Snone; sp->val = 0; sp->offset = offset; sp->grow = True; /* by default, offset grows */ sp->mask = False; } /* exitscope - exit a scope by popping the table and offset from the stack */ static void exitscope(void) { check(sp-- != stack, "exitscope() has no matching enterscope()"); } /**************************************\ Undefined symbol \**************************************/ static Entry* undefined(Symbol *sym) { Entry *p; sprintf(errbuf, "undefined identifier '%s'", sym->name); semwarn(errbuf); p = enter(sp->table, sym); p->level = GLOBAL; p->info.typ = mkint(); p->info.sto = Sextern; p->info.hasval = False; return p; } /* mgtype - return most general type among two numerical types */ Tnode* mgtype(Tnode *typ1, Tnode *typ2) { if (numeric(typ1) && numeric(typ2)) { if (typ1->type < typ2->type) return typ2; } else { typerror("non-numeric type"); } return typ1; } /**************************************\ Type checks \**************************************/ static int integer(Tnode *typ) { switch (typ->type) { case Tchar: case Tshort: case Tint: case Tlong: return True; default: break; } return False; } static int real(Tnode *typ) { switch (typ->type) { case Tfloat: case Tdouble: case Tldouble: return True; default: break; } return False; } static int numeric(Tnode *typ) { return integer(typ) || real(typ); } static void set_value(Entry *p, Tnode *t, Node *n) { p->info.hasval = True; p->info.ptrval = False; p->info.fixed = n->fixed; if (is_smart(t) || (t->type == Tpointer && !is_string(t) && !is_wstring(t))) { p->info.hasval = False; p->info.ptrval = True; t = t->ref; } switch (t->type) { case Tchar: case Tuchar: case Tshort: case Tushort: case Tint: case Tuint: case Tlong: case Tulong: case Tllong: case Tullong: case Tenum: case Tenumsc: case Ttime: case Tsize: if (n->typ->type == Tint || n->typ->type == Tchar || n->typ->type == Tenum || n->typ->type == Tenumsc) { sp->val = p->info.val.i = n->val.i; if ((t->hasmin && t->imin > n->val.i) || (t->hasmin && !t->incmin && t->imin == n->val.i) || (t->hasmax && t->imax < n->val.i) || (t->hasmax && !t->incmax && t->imax == n->val.i)) semerror("initialization constant outside value range"); } else { semerror("type error in initialization constant"); p->info.hasval = False; p->info.ptrval = False; } break; case Tfloat: case Tdouble: case Tldouble: if (n->typ->type == Tfloat || n->typ->type == Tdouble || n->typ->type == Tldouble) { p->info.val.r = n->val.r; if ((t->hasmin && t->rmin > n->val.r) || (t->hasmin && !t->incmin && t->rmin == n->val.r) || (t->hasmax && t->rmax < n->val.r) || (t->hasmax && !t->incmax && t->rmax == n->val.r)) semerror("initialization constant outside value range"); } else if (n->typ->type == Tint) { p->info.val.r = (double)n->val.i; if ((t->hasmin && t->imin > n->val.i) || (t->hasmin && !t->incmin && t->imin == n->val.i) || (t->hasmax && t->imax < n->val.i) || (t->hasmax && !t->incmax && t->imax == n->val.i)) semerror("initialization constant outside value range"); } else { semerror("type error in initialization constant"); p->info.hasval = False; p->info.ptrval = False; } break; default: if (t->type == Tpointer && (((Tnode*)t->ref)->type == Tchar || ((Tnode*)t->ref)->type == Twchar) && n->typ->type == Tpointer && ((Tnode*)n->typ->ref)->type == Tchar) { p->info.val.s = n->val.s; } else if (bflag && t->type == Tarray && ((Tnode*)t->ref)->type == Tchar && n->typ->type == Tpointer && ((Tnode*)n->typ->ref)->type == Tchar) { if (t->width / ((Tnode*)t->ref)->width - 1 < (int)strlen(n->val.s)) { semerror("char[] initialization constant too long"); p->info.val.s = ""; } else { p->info.val.s = n->val.s; } } else if (t->id == lookup("std::string") || t->id == lookup("std::wstring")) { p->info.val.s = n->val.s; } else { semerror("type error in initialization constant"); p->info.hasval = False; p->info.ptrval = False; } break; } } /**************************************\ Type additions \**************************************/ static void add_fault(void) { Table *t; Entry *p1, *p2, *p3, *p4, *p5; Symbol *s1, *s2, *s3, *s4; imported = NULL; s1 = lookup("SOAP_ENV__Code"); p1 = entry(classtable, s1); if (!p1 || !p1->info.typ->ref) { t = mktable(NULL); if (!p1) { p1 = enter(classtable, s1); p1->info.typ = mkstruct(t, 3*4); p1->info.typ->id = s1; } else { p1->info.typ->ref = t; } p2 = enter(t, lookup("SOAP_ENV__Value")); p2->info.typ = qname; p2->info.minOccurs = 0; p2 = enter(t, lookup("SOAP_ENV__Subcode")); p2->info.typ = mkpointer(p1->info.typ); p2->info.minOccurs = 0; } else { t = p1->info.typ->ref; p2 = entry(t, lookup("SOAP_ENV__Value")); if (!p2) { sprintf(errbuf, "SOAP_ENV__Value member missing in SOAP_ENV__Code declared at %s:%d", p1->filename, p1->lineno); semerror(errbuf); } else if (p2->info.typ != qname) { sprintf(errbuf, "SOAP_ENV__Value member of SOAP_ENV__Code is not a _QName type declared at %s:%d", p2->filename, p2->lineno); semerror(errbuf); } p2 = entry(t, lookup("SOAP_ENV__Subcode")); if (!p2) { sprintf(errbuf, "SOAP_ENV__Subcode member missing in SOAP_ENV__Code declared at %s:%d", p1->filename, p1->lineno); semerror(errbuf); } else if (p2->info.typ->type != Tpointer || (Tnode*)p2->info.typ->ref != p1->info.typ) { sprintf(errbuf, "SOAP_ENV__Subcode member of SOAP_ENV__Code is not a SOAP_ENV__Subcode * type declared at %s:%d", p2->filename, p2->lineno); semerror(errbuf); } } s2 = lookup("SOAP_ENV__Detail"); p2 = entry(classtable, s2); if (!p2 || !p2->info.typ->ref) { t = mktable(NULL); if (!p2) { p2 = enter(classtable, s2); p2->info.typ = mkstruct(t, 3*4); p2->info.typ->id = s2; } else { p2->info.typ->ref = t; } p3 = enter(t, lookup("__any")); p3->info.typ = xml; p3->info.minOccurs = 0; p3 = enter(t, lookup("__type")); p3->info.typ = mkint(); p3->info.minOccurs = 0; p3 = enter(t, lookup("fault")); p3->info.typ = mkpointer(mkvoid()); p3->info.minOccurs = 0; custom_fault = 0; } s4 = lookup("SOAP_ENV__Reason"); p4 = entry(classtable, s4); if (!p4 || !p4->info.typ->ref) { t = mktable(NULL); if (!p4) { p4 = enter(classtable, s4); p4->info.typ = mkstruct(t, 4); p4->info.typ->id = s4; } else { p4->info.typ->ref = t; } p3 = enter(t, lookup("SOAP_ENV__Text")); p3->info.typ = mkstring(); p3->info.minOccurs = 0; } else { t = p4->info.typ->ref; p3 = entry(t, lookup("SOAP_ENV__Text")); if (!p3) { sprintf(errbuf, "SOAP_ENV__Text member missing in SOAP_ENV__Reason declared at %s:%d", p4->filename, p4->lineno); semerror(errbuf); } else if (!is_string(p3->info.typ)) { sprintf(errbuf, "SOAP_ENV__Text member of SOAP_ENV__Reason is not a char * type declared at %s:%d", p3->filename, p3->lineno); semerror(errbuf); } } s3 = lookup("SOAP_ENV__Fault"); p3 = entry(classtable, s3); if (!p3 || !p3->info.typ->ref) { t = mktable(NULL); if (!p3) { p3 = enter(classtable, s3); p3->info.typ = mkstruct(t, 9*4); p3->info.typ->id = s3; } else { p3->info.typ->ref = t; } p5 = enter(t, lookup("faultcode")); p5->info.typ = qname; p5->info.minOccurs = 0; p5 = enter(t, lookup("faultstring")); p5->info.typ = mkstring(); p5->info.minOccurs = 0; p5 = enter(t, lookup("faultactor")); p5->info.typ = mkstring(); p5->info.minOccurs = 0; p5 = enter(t, lookup("detail")); p5->info.typ = mkpointer(p2->info.typ); p5->info.minOccurs = 0; p5 = enter(t, s1); p5->info.typ = mkpointer(p1->info.typ); p5->info.minOccurs = 0; p5 = enter(t, s4); p5->info.typ = mkpointer(p4->info.typ); p5->info.minOccurs = 0; p5 = enter(t, lookup("SOAP_ENV__Node")); p5->info.typ = mkstring(); p5->info.minOccurs = 0; p5 = enter(t, lookup("SOAP_ENV__Role")); p5->info.typ = mkstring(); p5->info.minOccurs = 0; p5 = enter(t, lookup("SOAP_ENV__Detail")); p5->info.typ = mkpointer(p2->info.typ); p5->info.minOccurs = 0; } else { t = p3->info.typ->ref; p5 = entry(t, lookup("faultcode")); if (!p5) { sprintf(errbuf, "faultcode member missing in SOAP_ENV__Fault declared at %s:%d", p3->filename, p3->lineno); semerror(errbuf); } else if (p5->info.typ != qname) { sprintf(errbuf, "faultcode member of SOAP_ENV__Fault is not a _QName type declared at %s:%d", p5->filename, p5->lineno); semerror(errbuf); } p5 = entry(t, lookup("faultstring")); if (!p5) { sprintf(errbuf, "faultstring member missing in SOAP_ENV__Fault declared at %s:%d", p3->filename, p3->lineno); semerror(errbuf); } else if (!is_string(p5->info.typ)) { sprintf(errbuf, "faultstring member of SOAP_ENV__Fault is not a char * type declared at %s:%d", p5->filename, p5->lineno); semerror(errbuf); } p5 = entry(t, lookup("faultdetail")); if (p5 && (p5->info.typ->type != Tpointer || (Tnode*)p5->info.typ->ref != p2->info.typ)) { sprintf(errbuf, "faultdetail member of SOAP_ENV__Fault is not a SOAP_ENV__Detail * type declared at %s:%d", p5->filename, p5->lineno); semerror(errbuf); } p5 = entry(t, s1); if (!p5) { sprintf(errbuf, "SOAP_ENV__Code member missing in SOAP_ENV__Fault declared at %s:%d", p3->filename, p3->lineno); semerror(errbuf); } else if (p5->info.typ->type != Tpointer || (Tnode*)p5->info.typ->ref != p1->info.typ) { sprintf(errbuf, "SOAP_ENV__Code member of SOAP_ENV__Fault is not a SOAP_ENV__Code * type declared at %s:%d", p5->filename, p5->lineno); semerror(errbuf); } p5 = entry(t, s4); if (!p5) { sprintf(errbuf, "SOAP_ENV__Reason member missing in SOAP_ENV__Fault declared at %s:%d", p3->filename, p3->lineno); semerror(errbuf); } else if (p5->info.typ->type != Tpointer || (Tnode*)p5->info.typ->ref != p4->info.typ) { sprintf(errbuf, "SOAP_ENV__Reason member of SOAP_ENV__Fault is not a SOAP_ENV__Reason * type declared at %s:%d", p5->filename, p5->lineno); semerror(errbuf); } p5 = entry(t, lookup("SOAP_ENV__Node")); if (!p5) { sprintf(errbuf, "SOAP_ENV__Node member missing in SOAP_ENV__Fault declared at %s:%d", p3->filename, p3->lineno); semerror(errbuf); } else if (!is_string(p5->info.typ)) { sprintf(errbuf, "SOAP_ENV__Node member of SOAP_ENV__Fault is not a char * type declared at %s:%d", p5->filename, p5->lineno); semerror(errbuf); } p5 = entry(t, lookup("SOAP_ENV__Role")); if (!p5) { sprintf(errbuf, "SOAP_ENV__Role member missing in SOAP_ENV__Fault declared at %s:%d", p3->filename, p3->lineno); semerror(errbuf); } else if (!is_string(p5->info.typ)) { sprintf(errbuf, "SOAP_ENV__Role member of SOAP_ENV__Fault is not a char * type declared at %s:%d", p5->filename, p5->lineno); semerror(errbuf); } p5 = entry(t, lookup("SOAP_ENV__Detail")); if (p5 && (p5->info.typ->type != Tpointer || (Tnode*)p5->info.typ->ref != p2->info.typ)) { sprintf(errbuf, "SOAP_ENV__Detail member of SOAP_ENV__Fault is not a SOAP_ENV__Detail * type declared at %s:%d", p5->filename, p5->lineno); semerror(errbuf); } } } static void add_soap(void) { Symbol *s = lookup("soap"); p = enter(classtable, s); p->info.typ = mkstruct(NULL, 0); p->info.typ->transient = -2; p->info.typ->id = s; p->filename = "(built-in)"; p->lineno = 0; } static void add_XML(void) { Symbol *s = lookup("_XML"); s->token = TYPE; p = enter(typetable, s); xml = p->info.typ = mksymtype(mkstring(), s); p->info.sto = Stypedef; p->filename = "(built-in)"; p->lineno = 0; } static void add_qname(void) { Symbol *s = lookup("_QName"); s->token = TYPE; p = enter(typetable, s); qname = p->info.typ = mksymtype(mkstring(), s); p->info.sto = Stypedef; p->filename = "(built-in)"; p->lineno = 0; } static void add_header(void) { Table *t; Entry *p; Symbol *s = lookup("SOAP_ENV__Header"); imported = NULL; p = entry(classtable, s); if (!p || !p->info.typ->ref) { t = mktable(NULL); if (!p) p = enter(classtable, s); p->info.typ = mkstruct(t, 0); p->info.typ->id = s; custom_header = 0; } } static void add_response(Entry *fun, Entry *ret) { Table *t; Entry *p, *q; Symbol *s; size_t i = 0, j, n = strlen(fun->sym->name); char *r = (char*)emalloc(n+100); strcpy(r, fun->sym->name); strcat(r, "Response"); do { for (j = 0; j < i; j++) r[n+j+8] = '_'; r[n+i+8] = '\0'; if (!(s = lookup(r))) s = install(r, ID); i++; } while (entry(classtable, s)); free(r); t = mktable(NULL); q = enter(t, ret->sym); q->info = ret->info; if (q->info.typ->type == Treference) q->info.typ = (Tnode*)q->info.typ->ref; p = enter(classtable, s); p->info.typ = mkstruct(t, 4); p->info.typ->id = s; fun->info.typ->response = p; } static void add_result(Tnode *typ) { Entry *p; if (!typ->ref || !((Tnode*)typ->ref)->ref) { semwarn("response struct/class must be declared before used in function prototype"); return; } for (p = ((Table*)((Tnode*)typ->ref)->ref)->list; p; p = p->next) if (((int)p->info.sto & (int)Sreturn)) return; for (p = ((Table*)((Tnode*)typ->ref)->ref)->list; p; p = p->next) { if (p->info.typ->type != Tfun && !((int)p->info.sto & (int)Sattribute) && !is_transient(p->info.typ) && !((int)p->info.sto & ((int)Sprivate | (int)Sprotected))) p->info.sto = (Storage)((int)p->info.sto | (int)Sreturn); return; } } static void add_request(Symbol *sym, Scope *sp) { Entry *p; unlinklast(sp->table); if ((p = entry(classtable, sym))) { if (p->info.typ->ref) { sprintf(errbuf, "service operation name clash: struct/class '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; } } else { p = enter(classtable, sym); p->info.typ = mkstruct(sp->table, sp->offset); p->info.typ->id = sym; } if (p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (q->info.typ->type == Treference || q->info.typ->type == Trvalueref) { sprintf(errbuf, "parameter '%s' of service operation function '%s()' in %s:%d cannot be passed by reference: use a pointer instead", q->sym->name, sym->name, q->filename, q->lineno); semwarn(errbuf); } else if (((int)q->info.sto & ((int)Sconst | (int)Sconstptr))) { if (!is_string(q->info.typ) && !is_wstring(q->info.typ)) { sprintf(errbuf, "parameter '%s' of service operation function '%s()' in %s:%d cannot be declared const", q->sym->name, sym->name, q->filename, q->lineno); semwarn(errbuf); } } else if (((int)q->info.sto & ~((int)Sattribute | (int)Sextern | (int)Sspecial))) { sprintf(errbuf, "invalid parameter '%s' of service operation function '%s()' in %s:%d", q->sym->name, sym->name, q->filename, q->lineno); semwarn(errbuf); } } } } /**************************************\ Add pragma \**************************************/ static void add_pragma(const char *s) { Pragma **pp; for (pp = &pragmas; *pp; pp = &(*pp)->next) ; *pp = (Pragma*)emalloc(sizeof(Pragma)); (*pp)->pragma = s; (*pp)->next = NULL; } gsoap-2.8.91/gsoap/src/README.txt0000644000175000017500000001457213525245163015701 0ustar ellertellertThe gSOAP 'soapcpp2' source-to-source compiler INSTRUCTIONS The gSOAP soapcpp2 tool translates annotated C/C++ header files with interface defitions for services and clients to service and client implementation code. It also maps the C/C++ types to XML types, with the ability to generate XML schema and WSDL documents. When starting from WSDL and/or XML schemas, first use the gSOAP 'wsdl2h' tool to translate these into C/C++ header file with interface definitions. Then use 'soapcpp2' to translate these into implementation code. See also the README.txt in the 'wsdl' directory and documentation on the use of 'wsdl2h' with 'soapcpp2'. CONTENTS This part of the distribution contains the following files: README.txt This file MakefileManual Extra makefile when autoconf/automake fail to produce one soapcpp2.h Main header file soapcpp2.c Main application symbol2.c Symbol table handling and code generation module error2.h Header file for error2.c error2.c Error handling routines init2.c Compiler symbol table initialization soapcpp2_lex.l Flex/Lex tokens soapcpp2_yacc.y Yacc/Bison grammar INSTALLATION Use './configure' and 'make' in the root directory, as explained in the installation instructions. To build 'soapcpp2' when autoconf/automake fail, use: make -f MakefileManual The above commands to build 'soapcpp2' assume you have Bison and Flex installed. To use Yacc instead, please use: $ cd gsoap/src $ make YACC='yacc -d -v -s soapcpp2_yacc' CMFLAGS='-DWITH_YACC -DWITH_FLEX' -f MakefileManual If you do not have the Bison tool, please download and install it from here: http://www.gnu.org/software/bison/ If you do not have the Flex tool, please download and install it from here: http://flex.sourceforge.net What if you do not have Bison and Flex? Included in gsoap/src are the flex-generated file 'lex.yy.c' and bison-generated files 'soapcpp2_yacc.tab.h' and 'soapcpp2_yacc.tab.c'. These files may suffice (no guarantee however) to build 'soapcpp2' as follows: $ cd gsoap/src $ make -f MakefileManual soapcpp2 In case the files 'lex.yy.c', 'soapcpp2_yacc.tab.h', and 'soapcpp2_yacc.tab.c' were deleted in a prior build run, please unarchive the gSOAP package again to retrieve these original files. For your project builds, use the stdsoap2.c and stdsoap2.cpp sources rather than the libgsoap libs, as the libs are not built. To enable SSL, GZIP, HTTP cookies, IPv6 support, and/or force C locale usage, use the compiler flags: -DWITH_OPENSSL to enable SSL, link with OpenSSL -DWITH_GNUTLS to enable SSL, link with GNUTLS -DWITH_GZIP to enable compression, link with Zlib -DWITH_COOKIES to enable HTTP cookies -DWITH_IPV6 to enable IPv6 -DWITH_C_LOCALE to force C locale Note: these flags when set must be used to compile ALL your sources to ensure consistency. QNX INSTALLATION On QNX the bison.simple file is located in $QNX_HOST/usr/share/bison.simple Update your .profile to include: export BISON_SIMPLE=$QNX_HOST/usr/share/bison/bison.simple export BISON_HAIRY=$QNX_HOST/usr/share/bison/bison.hairy WIN32 INSTALLATION You need to install Flex and Bison to build soapcpp2. An MSN article explains how to do this with MS VS2005: http://msdn.microsoft.com/en-us/library/aa730877(VS.80).aspx#vccustombr_topic3 The older Bison v1.6 can crash on Win32 systems if YYINITDEPTH is too small: Compile with /DYYINITDEPTH=5000 COMMAND LINE OPTIONS -0 no SOAP, generate REST source code -1 generate SOAP 1.1 source code -2 generate SOAP 1.2 source code -A require SOAPAction headers to invoke server-side operations -a use SOAPAction with WS-Addressing to invoke server-side operations -b serialize byte arrays char[N] as string -C generate client-side code only -c generate C source code -c++ generate C++ source code (default) -c++11 generate C++ source code optimized for C++11 (compile with -std=c++11) -dpath use path to save files -Ec generate extra functions for deep copying -Ed generate extra functions for deep deletion -Et generate extra functions for data traversals with callback functions -e generate SOAP RPC encoding style bindings (also use -1 or -2) -fN multiple soapC files, with N serializer definitions per file (N>=10) -h display help info and exit -Ipath use path(s) for #import (paths separated with ':', or ';' for windows) -i generate C++ service proxies and objects inherited from soap struct -j generate C++ service proxies and objects that share a soap struct -L don't generate soapClientLib/soapServerLib -l generate linkable modules (experimental) -m generate source code for the Matlab(tm) MEX compiler (deprecated) -n use service name to rename service functions and namespace table -pname save files with new prefix name instead of 'soap' -Qname use name as the C++ namespace, including custom serializers -qname use name as the C++ namespace, exclusing custom serializers -r generate soapReadme.md report -S generate server-side code only -s generate stub and skeleton functions with strict XML validation checks -T generate server auto-test source code -t generate source code for fully xsi:type typed SOAP/XML messages -u uncomment comments in WSDL/schema output by suppressing XML comments -V display the current version and exit -v verbose output -w don't generate WSDL and schema files -x don't generate sample XML message files -y include C/C++ type access information in sample XML messages -z1 generate deprecated old-style C++ service proxies and objects -z2 compatibility with 2.7.x: omit XML output for NULL pointers -z3 compatibility up to 2.8.30: _param_N indexing and nillable pointers infile header file to parse (or stdin) DOCUMENTATION See soapdoc2.pdf for documentation. A NOTE ON HEAP MEMORY USAGE Parts of the soapcpp2 tool allocate heap memory during its execution to maintain critical state information during its execution. No attempt is made to release this memory before the program terminates. LICENSE The gSOAP 'soapcpp2' tool and (generated) source code are released under GPL or a commercial license. The commercial license is available from Genivia. Please visit http://genivia.com/Products/gsoap/contract.html COPYRIGHT NOTICE gSOAP XML Web services tools Copyright (C) 2000-2011, Robert van Engelen, Genivia, Inc. All Rights Reserved. gsoap-2.8.91/gsoap/src/init2.c0000644000175000017500000001553413525245163015373 0ustar ellertellert/* init2.c Symbol table initialization. gSOAP XML Web services tools Copyright (C) 2000-2015, 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. -------------------------------------------------------------------------------- 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 "soapcpp2.h" #ifdef HAVE_CONFIG_H #include "soapcpp2_yacc.h" #else #include "soapcpp2_yacc.tab.h" #endif typedef struct Keyword { const char *s; /* name */ Token t; /* token */ } Keyword; static Keyword keywords[] = { { "alignas", NONE }, { "alignof", NONE }, { "asm", NONE }, { "auto", AUTO }, { "bool", BOOL }, { "break", BREAK }, { "case", CASE }, { "catch", NONE }, { "char", CHAR }, { "class", CLASS }, { "const", CONST }, { "const_cast", NONE }, { "continue", CONTINUE }, { "default", DEFAULT }, { "delete", NONE }, { "do", DO }, { "double", DOUBLE }, { "dynamic_cast", NONE }, { "else", ELSE }, { "enum", ENUM }, { "errno", NONE }, { "explicit", EXPLICIT }, { "export", NONE }, { "extern", EXTERN }, { "false", CFALSE }, { "final", FINAL }, { "float", FLOAT }, { "for", FOR }, { "friend", FRIEND }, { "goto", GOTO }, { "if", IF }, { "inline", INLINE }, { "int", INT }, { "int8_t", CHAR }, { "int16_t", SHORT }, { "int32_t", INT }, { "int64_t", LLONG }, { "long", LONG }, { "LONG64", LLONG }, { "mutable", MUTABLE }, { "namespace", NAMESPACE }, { "new", NONE }, { "nullptr", null }, { "NULL", null }, { "operator", OPERATOR }, { "override", OVERRIDE }, { "private", PRIVATE }, { "protected", PROTECTED }, { "public", PUBLIC }, { "register", REGISTER }, { "reinterpret_cast", NONE }, { "restrict", NONE }, { "return", RETURN }, { "short", SHORT }, { "signed", SIGNED }, { "size_t", SIZE }, { "sizeof", SIZEOF }, { "static", STATIC }, { "static_cast", NONE }, { "struct", STRUCT }, { "switch", SWITCH }, { "template", TEMPLATE }, { "this", NONE }, { "throw", NONE }, { "time_t", TIME }, { "true", CTRUE }, { "typedef", TYPEDEF }, { "typeid", NONE }, { "typename", TYPENAME }, { "uint8_t", UCHAR }, { "uint16_t", USHORT }, { "uint32_t", UINT }, { "uint64_t", ULLONG }, { "ULONG64", ULLONG }, { "union", UNION }, { "unsigned", UNSIGNED }, { "using", USING }, { "virtual", VIRTUAL }, { "void", VOID }, { "volatile", VOLATILE }, { "wchar_t", WCHAR }, { "while", WHILE }, { "operator!", NONE }, { "operator~", NONE }, { "operator=", NONE }, { "operator+=", NONE }, { "operator-=", NONE }, { "operator*=", NONE }, { "operator/=", NONE }, { "operator%=", NONE }, { "operator&=", NONE }, { "operator^=", NONE }, { "operator|=", NONE }, { "operator<<=", NONE }, { "operator>>=", NONE }, { "operator||", NONE }, { "operator&&", NONE }, { "operator|", NONE }, { "operator^", NONE }, { "operator&", NONE }, { "operator==", NONE }, { "operator!=", NONE }, { "operator<", NONE }, { "operator<=", NONE }, { "operator>", NONE }, { "operator>=", NONE }, { "operator<<", NONE }, { "operator>>", NONE }, { "operator+", NONE }, { "operator-", NONE }, { "operator*", NONE }, { "operator/", NONE }, { "operator%", NONE }, { "operator++", NONE }, { "operator--", NONE }, { "operator->", NONE }, { "operator[]", NONE }, { "operator()", NONE }, { "mustUnderstand", MUSTUNDERSTAND }, { "soap", ID }, { "SOAP_ENV__Header", ID }, { "dummy", ID }, { "soap_header", ID }, { "SOAP_ENV__Fault", ID }, { "SOAP_ENV__Code", ID }, { "SOAP_ENV__Subcode",ID }, { "SOAP_ENV__Reason", ID }, { "SOAP_ENV__Text", ID }, { "SOAP_ENV__Detail", ID }, { "SOAP_ENV__Value", ID }, { "SOAP_ENV__Node", ID }, { "SOAP_ENV__Role", ID }, { "faultcode", ID }, { "faultstring", ID }, { "faultactor", ID }, { "detail", ID }, { "__type", ID }, { "fault", ID }, { "__any", ID }, { "_QName", ID }, { "_XML", ID }, { "std::string", TYPE }, { "std::wstring", TYPE }, { "std::u16string", TYPE }, { "std::u32string", TYPE }, { "std::deque", TYPE }, { "std::queue", TYPE }, { "std::list", TYPE }, { "std::vector", TYPE }, { "std::set", TYPE }, { "std::shared_ptr", TYPE }, { "std::unique_ptr", TYPE }, { "std::auto_ptr", TYPE }, { "std::weak_ptr", TYPE }, { "std::function", TYPE }, { "/*?*/", NONE }, { 0, 0 } }; /* init - initialize symbol table with predefined keywords */ void init(void) { struct Keyword *k; for (k = keywords; k->s; k++) install(k->s, k->t); } gsoap-2.8.91/gsoap/src/error2.c0000644000175000017500000001063613525245163015557 0ustar ellertellert/* error2.c Error handling. gSOAP XML Web services tools Copyright (C) 2000-2015, 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. -------------------------------------------------------------------------------- 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 "soapcpp2.h" #ifdef HAVE_CONFIG_H #include "soapcpp2_yacc.h" #else #include "soapcpp2_yacc.tab.h" #endif #define MAXERR 10 extern char yytext[]; /* lexeme found by the lexical analyzer */ static int lexerrno = 0; static int synerrno = 0; static int semerrno = 0; static int semwarno = 0; char errbuf[1024]; /* to hold error messages */ /* yyerror - auto-called by parser from an error production with nonterminal `error' */ void yyerror(const char *s) { (void)s; } /* lexerror - called by lexical analyzer upon failure to recognize a token */ void lexerror(const char *s) { fprintf(stderr, "%s(%d): %s: %s\n", filename, yylineno, s, yytext); if (lexerrno++ >= MAXERR) execerror("too many syntactic errors, bailing out"); } /* synerror - called by a semantic action for an error production in the yacc grammar */ void synerror(const char *s) { fprintf(stderr, "%s(%d): Syntax error: %s\n", filename, yylineno, s); if (synerrno++ >= MAXERR) execerror("too many syntactic errors, bailing out"); } /* semerror - report semantic error from static checking */ void semerror(const char *s) { fprintf(stderr, "\n%s(%d): **ERROR**: %s\n\n", filename, yylineno, s); if (semerrno++ >= MAXERR) execerror("too many semantic errors, bailing out"); } /* semwarn - report semantic warning from static checking */ void semwarn(const char *s) { if (yylineno) fprintf(stderr, "\n%s(%d): *WARNING*: %s\n\n", filename, yylineno, s); else fprintf(stderr, "\n%s: *WARNING*: %s\n\n", filename, s); semwarno++; } /* compliancewarn - report compliance warning */ void compliancewarn(const char *s) { fprintf(stderr, "Compliance warning: %s\n", s); } /* typerror - report type error (a semantic error) */ void typerror(const char *s) { fprintf(stderr, "%s(%d): Type error: %s\n", filename, yylineno, s); if (semerrno++ >= MAXERR) execerror("too many semantic errors, bailing out"); } /* execerror - print error message and terminate execution */ void execerror(const char *s) { fprintf(stderr, "Critical error: %s\n", s); exit(1); } /* progerror - called when check(expr) failed, i.e. upon programming error */ void progerror(const char *s, const char *f, int l) { fprintf(stderr, "Program failure: %s in file %s line %d\n", s, f, l); exit(1); } /* errstat - show error statistics */ int errstat(void) { if (!lexerrno && !synerrno && !semerrno) { fprintf(stderr, "\nCompilation successful "); if (semwarno) fprintf(stderr, "(%d warning%s)\n\n", semwarno, semwarno>1?"s":""); else fprintf(stderr, "\n\n"); return 0; } fprintf(stderr, "\nThere were errors:\n"); if (lexerrno) fprintf(stderr, "%d lexical error%s\n", lexerrno, lexerrno>1?"s":""); if (synerrno) fprintf(stderr, "%d syntax error%s\n", synerrno, synerrno>1?"s":""); if (semerrno) fprintf(stderr, "%d semantic error%s\n", semerrno, semerrno>1?"s":""); if (semwarno) fprintf(stderr, "%d warning%s\n", semwarno, semwarno>1?"s":""); fprintf(stderr, "\n"); return -1; } gsoap-2.8.91/gsoap/src/soapcpp2_yacc.tab.c0000644000175000017500000073244613525245163017651 0ustar ellertellert/* A Bison parser, made by GNU Bison 3.3.1. */ /* Bison implementation for Yacc-like parsers in C Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2019 Free Software Foundation, Inc. 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 3 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, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Undocumented macros, especially those whose name start with YY_, are private implementation details. Do not rely on them. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "3.3.1" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 0 /* Push parsers. */ #define YYPUSH 0 /* Pull parsers. */ #define YYPULL 1 /* First part of user prologue. */ #line 42 "soapcpp2_yacc.y" /* yacc.c:337 */ #include "soapcpp2.h" #ifdef WIN32 #ifndef __STDC__ #define __STDC__ #endif #define YYINCLUDED_STDLIB_H #ifdef WIN32_WITHOUT_SOLARIS_FLEX extern int soapcpp2lex(void); #else extern int yylex(void); #endif #else extern int yylex(void); #endif #define MAXNEST 16 /* max. nesting depth of scopes */ typedef struct Scope { Table *table; Entry *entry; Node node; LONG64 val; int offset; Bool grow; /* true if offset grows with declarations */ Bool mask; /* true if enum is mask */ } Scope; Scope stack[MAXNEST], /* stack of tables and offsets */ *sp; /* current scope stack pointer */ Table *classtable = NULL, *enumtable = NULL, *typetable = NULL, *booltable = NULL, *templatetable = NULL; int transient = 0; int permission = 0; int custom_header = 1; int custom_fault = 1; Pragma *pragmas = NULL; Tnode *qname = NULL; Tnode *xml = NULL; /* function prototypes for support routine section */ static Entry *undefined(Symbol*); static Tnode *mgtype(Tnode*, Tnode*); static Node op(const char*, Node, Node), iop(const char*, Node, Node), relop(const char*, Node, Node); static void mkscope(Table*, int), enterscope(Table*, int), exitscope(void); static int integer(Tnode*), real(Tnode*), numeric(Tnode*); static void set_value(Entry *p, Tnode *t, Node *n), add_soap(void), add_XML(void), add_qname(void), add_header(void), add_fault(void), add_response(Entry*, Entry*), add_result(Tnode*), add_request(Symbol*, Scope*), add_pragma(const char*); /* imported from symbol2.c */ extern int is_string(Tnode*), is_wstring(Tnode*), is_smart(Tnode*), is_XML(Tnode*), is_stdXML(Tnode*), is_anyType(Tnode*), is_anyAttribute(Tnode*); extern char *c_storage(Storage); extern const char *c_type(Tnode*); extern int is_primitive_or_string(Tnode*), is_stdstr(Tnode*), is_binary(Tnode*), is_external(Tnode*), is_mutable(Entry*); extern Entry *unlinklast(Table*); /* Temporaries used in semantic rules */ int i; char *s, *s1; const char *s2; Symbol *sym; Entry *p, *q; Tnode *t; Node tmp, c; #line 169 "soapcpp2_yacc.tab.c" /* yacc.c:337 */ # ifndef YY_NULLPTR # if defined __cplusplus # if 201103L <= __cplusplus # define YY_NULLPTR nullptr # else # define YY_NULLPTR 0 # endif # else # define YY_NULLPTR ((void*)0) # endif # endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* In a future release of Bison, this section will be replaced by #include "soapcpp2_yacc.tab.h". */ #ifndef YY_YY_SOAPCPP2_YACC_TAB_H_INCLUDED # define YY_YY_SOAPCPP2_YACC_TAB_H_INCLUDED /* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif #if YYDEBUG extern int yydebug; #endif /* Token type. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE enum yytokentype { PRAGMA = 258, AUTO = 259, DOUBLE = 260, INT = 261, STRUCT = 262, BREAK = 263, ELSE = 264, LONG = 265, SWITCH = 266, CASE = 267, ENUM = 268, REGISTER = 269, TYPEDEF = 270, CHAR = 271, EXTERN = 272, RETURN = 273, UNION = 274, CONST = 275, FLOAT = 276, SHORT = 277, UNSIGNED = 278, CONTINUE = 279, FOR = 280, SIGNED = 281, VOID = 282, DEFAULT = 283, GOTO = 284, SIZEOF = 285, VOLATILE = 286, DO = 287, IF = 288, STATIC = 289, WHILE = 290, CLASS = 291, PRIVATE = 292, PROTECTED = 293, PUBLIC = 294, VIRTUAL = 295, INLINE = 296, OPERATOR = 297, LLONG = 298, BOOL = 299, CFALSE = 300, CTRUE = 301, WCHAR = 302, TIME = 303, USING = 304, NAMESPACE = 305, ULLONG = 306, MUSTUNDERSTAND = 307, SIZE = 308, FRIEND = 309, TEMPLATE = 310, EXPLICIT = 311, TYPENAME = 312, MUTABLE = 313, FINAL = 314, null = 315, RESTRICT = 316, OVERRIDE = 317, UCHAR = 318, USHORT = 319, UINT = 320, ULONG = 321, NONE = 322, ID = 323, LAB = 324, TYPE = 325, LNG = 326, DBL = 327, CHR = 328, TAG = 329, STR = 330, PA = 331, NA = 332, TA = 333, DA = 334, MA = 335, AA = 336, XA = 337, OA = 338, LA = 339, RA = 340, OR = 341, AN = 342, EQ = 343, NE = 344, LE = 345, GE = 346, LS = 347, RS = 348, AR = 349, PP = 350, NN = 351 }; #endif /* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED union YYSTYPE { #line 146 "soapcpp2_yacc.y" /* yacc.c:352 */ Symbol *sym; LONG64 i; double r; char c; char *s; Tnode *typ; Storage sto; Node rec; Entry *e; IR ir; #line 322 "soapcpp2_yacc.tab.c" /* yacc.c:352 */ }; typedef union YYSTYPE YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_DECLARED 1 #endif extern YYSTYPE yylval; int yyparse (void); #endif /* !YY_YY_SOAPCPP2_YACC_TAB_H_INCLUDED */ #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #else typedef signed char yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(Msgid) dgettext ("bison-runtime", Msgid) # endif # endif # ifndef YY_ # define YY_(Msgid) Msgid # endif #endif #ifndef YY_ATTRIBUTE # if (defined __GNUC__ \ && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \ || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C # define YY_ATTRIBUTE(Spec) __attribute__(Spec) # else # define YY_ATTRIBUTE(Spec) /* empty */ # endif #endif #ifndef YY_ATTRIBUTE_PURE # define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__)) #endif #ifndef YY_ATTRIBUTE_UNUSED # define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__)) #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(E) ((void) (E)) #else # define YYUSE(E) /* empty */ #endif #if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ /* Suppress an incorrect diagnostic about yylval being uninitialized. */ # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\ _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") # define YY_IGNORE_MAYBE_UNINITIALIZED_END \ _Pragma ("GCC diagnostic pop") #else # define YY_INITIAL_VALUE(Value) Value #endif #ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN # define YY_IGNORE_MAYBE_UNINITIALIZED_END #endif #ifndef YY_INITIAL_VALUE # define YY_INITIAL_VALUE(Value) /* Nothing. */ #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS # include /* INFRINGES ON USER NAME SPACE */ /* Use EXIT_SUCCESS as a witness for stdlib.h. */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's 'empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined EXIT_SUCCESS \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined EXIT_SUCCESS void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined EXIT_SUCCESS void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss_alloc; YYSTYPE yyvs_alloc; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) # define YYCOPY_NEEDED 1 /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack_alloc, Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ Stack = &yyptr->Stack_alloc; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (0) #endif #if defined YYCOPY_NEEDED && YYCOPY_NEEDED /* Copy COUNT objects from SRC to DST. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(Dst, Src, Count) \ __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src))) # else # define YYCOPY(Dst, Src, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (Dst)[yyi] = (Src)[yyi]; \ } \ while (0) # endif # endif #endif /* !YYCOPY_NEEDED */ /* YYFINAL -- State number of the termination state. */ #define YYFINAL 3 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 1704 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 122 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 79 /* YYNRULES -- Number of rules. */ #define YYNRULES 301 /* YYNSTATES -- Number of states. */ #define YYNSTATES 469 #define YYUNDEFTOK 2 #define YYMAXUTOK 351 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM as returned by yylex, with out-of-bounds checking. */ #define YYTRANSLATE(YYX) \ ((unsigned) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM as returned by yylex. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 117, 2, 2, 121, 107, 94, 2, 119, 116, 105, 103, 76, 104, 2, 106, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 89, 113, 97, 77, 99, 88, 120, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 114, 2, 115, 93, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 111, 92, 112, 118, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 90, 91, 95, 96, 98, 100, 101, 102, 108, 109, 110 }; #if YYDEBUG /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { 0, 223, 223, 243, 258, 260, 262, 267, 269, 270, 271, 272, 273, 283, 292, 296, 298, 300, 302, 304, 306, 307, 312, 314, 316, 318, 320, 322, 323, 324, 326, 327, 328, 329, 331, 333, 338, 343, 463, 481, 482, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 533, 555, 589, 650, 652, 653, 655, 656, 658, 662, 667, 670, 692, 736, 768, 769, 776, 778, 786, 791, 832, 884, 891, 896, 937, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1018, 1044, 1070, 1093, 1097, 1125, 1149, 1170, 1198, 1223, 1244, 1271, 1298, 1307, 1316, 1330, 1344, 1361, 1379, 1409, 1476, 1482, 1487, 1491, 1497, 1503, 1509, 1516, 1521, 1546, 1551, 1578, 1583, 1608, 1626, 1645, 1667, 1690, 1695, 1701, 1702, 1703, 1704, 1705, 1706, 1707, 1717, 1721, 1723, 1724, 1725, 1727, 1729, 1730, 1731, 1740, 1741, 1743, 1751, 1760, 1767, 1768, 1770, 1779, 1780, 1781, 1782, 1783, 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791, 1793, 1794, 1799, 1800, 1801, 1803, 1804, 1805, 1806, 1809, 1810, 1812, 1813, 1815, 1816, 1824, 1829, 1835, 1836, 1854, 1859, 1874, 1875, 1890, 1894, 1908, 1923, 1924, 1926, 1940, 1956, 1973, 1998, 2019, 2034, 2051, 2076, 2096, 2097, 2099, 2100, 2102, 2103, 2104, 2105, 2106, 2108, 2109, 2110, 2111, 2113, 2114, 2115, 2116, 2117, 2119, 2120, 2121, 2130, 2131, 2134, 2140, 2143, 2146, 2150, 2152, 2155, 2158, 2160, 2163, 2164, 2165, 2166, 2167, 2168, 2169, 2170, 2171, 2172, 2173, 2174, 2175, 2176, 2177, 2178, 2179, 2182, 2188, 2194, 2207, 2208, 2219, 2224, 2231, 2234, 2235, 2244, 2250, 2256, 2262, 2268, 2274 }; #endif #if YYDEBUG || YYERROR_VERBOSE || 0 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "PRAGMA", "AUTO", "DOUBLE", "INT", "STRUCT", "BREAK", "ELSE", "LONG", "SWITCH", "CASE", "ENUM", "REGISTER", "TYPEDEF", "CHAR", "EXTERN", "RETURN", "UNION", "CONST", "FLOAT", "SHORT", "UNSIGNED", "CONTINUE", "FOR", "SIGNED", "VOID", "DEFAULT", "GOTO", "SIZEOF", "VOLATILE", "DO", "IF", "STATIC", "WHILE", "CLASS", "PRIVATE", "PROTECTED", "PUBLIC", "VIRTUAL", "INLINE", "OPERATOR", "LLONG", "BOOL", "CFALSE", "CTRUE", "WCHAR", "TIME", "USING", "NAMESPACE", "ULLONG", "MUSTUNDERSTAND", "SIZE", "FRIEND", "TEMPLATE", "EXPLICIT", "TYPENAME", "MUTABLE", "FINAL", "null", "RESTRICT", "OVERRIDE", "UCHAR", "USHORT", "UINT", "ULONG", "NONE", "ID", "LAB", "TYPE", "LNG", "DBL", "CHR", "TAG", "STR", "','", "'='", "PA", "NA", "TA", "DA", "MA", "AA", "XA", "OA", "LA", "RA", "'?'", "':'", "OR", "AN", "'|'", "'^'", "'&'", "EQ", "NE", "'<'", "LE", "'>'", "GE", "LS", "RS", "'+'", "'-'", "'*'", "'/'", "'%'", "AR", "PP", "NN", "'{'", "'}'", "';'", "'['", "']'", "')'", "'!'", "'~'", "'('", "'@'", "'$'", "$accept", "prog", "s1", "exts", "exts1", "ext", "pragma", "decls", "t1", "t2", "t3", "t4", "t5", "dclrs", "dclr", "fdclr", "id", "name", "ctor", "dtor", "func", "fname", "fargso", "fargs", "farg", "arg", "sym", "texpf", "texp", "spec", "tspec", "type", "structid", "struct", "classid", "class", "unionid", "union", "enum", "enumsc", "mask", "masksc", "sc", "utype", "tname", "base", "s2", "s3", "s4", "s5", "s6", "store", "const", "abstract", "virtual", "ptrs", "array", "arrayck", "brinit", "init", "tag", "occurs", "bounds", "nullptr", "patt", "value", "min", "minmax", "max", "expr", "cexp", "qexp", "oexp", "obex", "aexp", "abex", "rexp", "lexp", "pexp", YY_NULLPTR }; #endif # ifdef YYPRINT /* YYTOKNUM[NUM] -- (External) token number corresponding to the (internal) symbol number NUM (which must be that of a token). */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 44, 61, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 63, 58, 341, 342, 124, 94, 38, 343, 344, 60, 345, 62, 346, 347, 348, 43, 45, 42, 47, 37, 349, 350, 351, 123, 125, 59, 91, 93, 41, 33, 126, 40, 64, 36 }; # endif #define YYPACT_NINF -373 #define yypact_value_is_default(Yystate) \ (!!((Yystate) == (-373))) #define YYTABLE_NINF -269 #define yytable_value_is_error(Yytable_value) \ 0 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ static const yytype_int16 yypact[] = { -373, 30, -14, -373, -28, -373, 256, -68, 77, -373, -373, -373, -373, 16, -373, 25, -373, -373, -373, -373, -373, 20, -373, -373, -373, -373, -373, -373, -373, -373, 21, -63, -373, 374, -373, -373, -373, -373, -373, -373, -373, -373, -40, -373, -373, -373, -373, -373, -373, -373, -373, -45, 58, -373, -373, -373, -373, -373, -373, -373, -373, -35, -373, -373, -373, -373, -373, 34, 1091, -15, -373, 48, 69, -11, -373, -7, -5, 43, 55, 1484, 49, -373, 27, -373, -373, -373, 31, -373, -373, -373, 63, 87, -17, -17, 37, -373, 98, 98, 94, -373, 96, 104, -373, -373, -37, -373, 113, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -32, -373, -373, 107, -373, -373, 495, 616, 40, -373, 39, 1484, -373, -373, -373, 101, -373, -373, -373, 81, -373, 855, -373, 28, 855, -373, 855, -373, -373, -373, -373, -373, -373, -17, 1212, -373, -373, -373, 855, -373, -373, -373, -373, 140, 140, 1330, 32, -373, -373, -373, 855, -373, 855, 23, -373, -373, 153, -373, -373, -373, -373, -373, -17, 1585, 1585, -373, 125, -373, -373, -373, -373, -373, -373, 59, -373, -373, -373, -373, 84, 148, 176, 179, 737, 172, 973, 11, -17, -17, 28, 28, 28, -373, 174, 181, 183, 1330, 1330, 1330, 1330, -373, -373, 189, 1330, -373, -373, -22, 213, -373, -373, -373, -373, -373, -373, -373, 193, 194, 199, 123, -373, 192, 197, -373, -373, -373, -373, -373, -373, -373, 1585, 1585, 1585, 1585, 1585, 1585, 1585, -373, 74, 155, 232, 236, 733, -373, -373, -373, -373, 117, -373, 1413, -373, 243, -373, -373, -373, -373, -373, -373, 222, 737, -373, -373, -373, -373, -373, 855, -373, -373, 213, 213, 213, 213, -373, 213, 235, 241, -373, -373, -373, 199, 223, 310, 1484, -373, -373, -373, -373, -373, -373, -24, -373, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, -373, 89, 239, -373, 278, -373, 297, 737, 737, 737, 737, -373, 250, 252, 257, 270, 271, 273, -373, -373, 199, -17, 282, 1585, -373, 292, 313, 232, 733, 833, 847, 949, 858, 858, 475, 475, 475, 475, 226, 226, 238, 238, -373, -373, -373, 1413, 19, -373, -373, 1555, 234, -373, 135, 311, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, 1585, 283, 79, -373, 199, -373, 39, 1585, -373, -373, -373, 263, -373, -373, -373, -373, -373, 332, -373, 243, -373, 294, -373, -373, -373, 307, -373, 177, 177, -29, 177, -373, 297, -373, -373, -373, -373, 502, 269, -373, 177, -373, 39, 130, -373, 623, -373, -373, 318, 338, -373, 340, -373, -373 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. Performed when YYTABLE does not specify something else to do. Zero means the default is an error. */ static const yytype_uint16 yydefact[] = { 3, 0, 6, 1, 0, 2, 0, 0, 0, 13, 187, 115, 109, 0, 110, 0, 188, 192, 106, 191, 200, 0, 194, 114, 108, 117, 116, 104, 203, 189, 0, 193, 198, 0, 111, 105, 107, 122, 112, 199, 113, 197, 0, 190, 204, 195, 196, 118, 119, 120, 121, 226, 142, 22, 23, 201, 202, 7, 9, 10, 11, 0, 41, 79, 82, 82, 32, 213, 0, 0, 181, 0, 127, 0, 182, 0, 0, 0, 0, 0, 0, 6, 0, 146, 12, 36, 0, 39, 40, 181, 130, 0, 0, 0, 0, 181, 140, 141, 0, 182, 133, 0, 181, 154, 0, 193, 142, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 75, 73, 74, 0, 42, 43, 0, 78, 213, 0, 0, 0, 227, 223, 0, 213, 8, 30, 0, 31, 28, 82, 0, 99, 0, 151, 0, 0, 153, 0, 155, 181, 181, 183, 183, 98, 0, 0, 144, 145, 148, 0, 150, 161, 162, 181, 171, 171, 0, 170, 157, 158, 149, 0, 147, 0, 0, 76, 77, 217, 103, 102, 173, 172, 174, 0, 0, 0, 92, 0, 93, 213, 33, 82, 186, 29, 217, 216, 215, 214, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, 80, 4, 0, 0, 159, 160, 0, 184, 166, 167, 163, 165, 168, 164, 169, 0, 0, 217, 0, 95, 0, 0, 300, 301, 295, 296, 297, 298, 299, 0, 0, 0, 0, 0, 0, 0, 224, 261, 0, 264, 0, 267, 285, 293, 225, 143, 217, 34, 0, 220, 226, 21, 24, 25, 26, 20, 129, 0, 0, 179, 180, 176, 175, 177, 0, 125, 132, 184, 184, 184, 184, 128, 184, 213, 0, 131, 124, 96, 217, 0, 0, 0, 291, 289, 288, 290, 286, 287, 0, 259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 186, 0, 0, 84, 85, 213, 237, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 134, 219, 217, 0, 0, 0, 294, 262, 0, 263, 266, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 0, 0, 88, 205, 0, 217, 238, 223, 239, 16, 17, 18, 19, 126, 136, 137, 138, 139, 135, 218, 123, 292, 258, 0, 0, 209, 86, 217, 89, 223, 0, 37, 221, 240, 233, 260, 94, 206, 207, 208, 0, 81, 226, 90, 0, 242, 241, 243, 255, 257, 0, 0, 246, 0, 210, 237, 222, 256, 244, 245, 247, 249, 234, 0, 236, 223, 228, 252, 248, 235, 91, 229, 0, 253, 230, 232, 231 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { -373, -373, -373, -373, 331, -373, -373, -152, 8, 118, -373, -373, -373, -2, 349, 352, -12, 262, -373, -373, -46, -373, 42, 35, -373, -373, -373, -373, -140, -34, -25, -33, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, 329, -74, -373, 122, -39, 325, 265, 392, 95, -31, -373, -373, -373, -137, -183, -227, -373, -372, -273, -373, -373, -6, -373, -191, -373, -373, -373, -312, -197, -373, -373, -373, 114, -373, 478, 178, -373 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { -1, 1, 2, 5, 6, 57, 58, 222, 223, 60, 354, 355, 356, 224, 208, 209, 62, 63, 64, 65, 153, 154, 349, 350, 351, 420, 66, 205, 143, 67, 352, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 97, 186, 201, 231, 161, 166, 236, 312, 286, 79, 417, 433, 80, 158, 287, 288, 423, 204, 149, 457, 399, 400, 426, 444, 454, 455, 445, 326, 327, 373, 275, 276, 277, 278, 279, 280, 281 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule whose number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { 145, 90, 146, 96, 61, 274, 282, 195, 144, 100, 206, 232, 257, 233, 59, 353, 372, 86, 103, 155, 174, 98, 101, 187, 174, 240, 91, 424, 174, 148, 3, 192, 92, 164, 159, 225, 4, 253, 246, 254, 7, 151, 247, 81, 92, 171, 82, 198, 248, 435, 177, 87, 370, 88, 249, -212, 184, 147, 414, 317, 452, 93, 83, 191, 226, 227, 228, 229, 453, 293, 284, 295, 315, 93, -39, 250, 199, 83, 152, 251, 179, 180, 182, 193, 87, 462, 88, 151, 87, 87, 88, 88, 371, 87, 85, 88, 160, 200, 230, 429, 165, 257, 252, -35, 167, 87, 168, 88, 242, 243, -27, 211, 145, 145, 146, 146, 202, 145, 175, 146, 196, 197, 175, 33, 296, 207, 175, 89, 234, 235, 94, 99, 102, 366, 203, -87, 95, 162, 430, -35, -35, 431, 241, 176, 358, 82, -27, -27, 181, 212, 359, 88, 82, 259, 169, 150, 432, 393, -181, 163, 238, 447, -265, 285, -265, 394, 170, 172, 260, 261, 421, 61, 213, 256, -152, 214, 83, -40, -39, 369, -181, 59, 245, 83, 411, 255, 215, 185, 83, 258, 84, 262, 434, 85, 263, 264, 265, 289, 266, 178, 85, 463, 401, 402, 403, 404, 188, -156, 213, -171, 150, 214, 202, 297, 298, 397, 190, 267, 427, 464, 210, 255, 215, 194, 283, 436, 268, 269, 270, 185, 203, 256, 305, 306, 307, 308, 347, 290, 316, 310, 271, 272, 273, 328, 213, 329, 422, 214, 437, 438, 439, 450, 451, 145, 456, 146, -5, 8, 215, 9, 10, 11, 12, 13, 461, 291, 14, 256, 292, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 442, 443, 26, 27, 294, 302, 145, 28, 146, 311, 29, 318, 30, 303, 144, 304, 31, 32, 33, 34, 35, 309, 419, 36, 37, 313, 314, 38, 39, 40, 41, 42, 43, 256, 44, 45, 319, 148, 46, 47, 48, 49, 50, -268, 51, 213, 52, 330, 214, 342, 343, 344, 345, 346, 437, 438, 439, 54, 367, 215, -254, -254, -254, 344, 345, 346, 368, -185, 256, 299, 300, 301, 440, 365, 396, 395, 412, 398, 460, 145, 441, 146, 405, 145, 406, 146, 442, 443, 370, 407, 53, 54, -254, -254, -211, 104, 55, 56, 10, 11, 12, 13, 408, 409, 14, 410, 425, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 413, 428, 26, 27, 415, 446, 449, 28, 448, 466, 29, 467, 30, 468, 173, 357, 105, 32, 156, 34, 35, 157, 216, 36, 37, 183, 189, 38, 39, 40, 41, 42, 43, 418, 44, 45, 416, 237, 46, 47, 48, 49, 50, 458, 392, 374, 106, 320, 321, 322, 323, 324, 325, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 0, 0, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 0, 0, 0, 139, 0, 0, 140, 141, 142, 55, 56, 104, 0, 0, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 0, 0, 0, 105, 32, 0, 34, 35, 0, 0, 36, 37, 0, 0, 38, 39, 40, 41, 42, 43, 0, 44, 45, 0, 0, 46, 47, 48, 49, 50, 0, -101, 0, 106, 0, 0, 0, 0, 0, -101, -101, -250, -250, -250, 340, 341, 342, 343, 344, 345, 346, 0, 0, 0, -101, 0, 0, -101, -101, 0, 0, 0, -101, 0, 0, 0, 0, 459, -101, 0, 0, 0, 0, -250, -250, 0, 0, -101, 0, -101, 0, 0, -101, 55, 56, 104, 0, 0, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 0, 0, 0, 105, 32, 0, 34, 35, 0, 0, 36, 37, 0, 0, 38, 39, 40, 41, 42, 43, 0, 44, 45, 0, 0, 46, 47, 48, 49, 50, 0, -100, 0, 106, 0, 0, 0, 0, 0, -100, -100, -251, -251, -251, 360, 361, 362, 363, 0, 364, 0, 0, 0, 0, -100, 0, 0, -100, -100, 0, 0, 0, -100, 0, 0, 0, 0, 465, -100, 0, 0, 0, 0, -251, -251, 0, 0, -100, 0, -100, 0, 0, -100, 55, 56, 217, 0, 0, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 218, 219, 220, 31, 32, 33, 34, 35, 0, 0, 36, 37, 0, 0, 38, 39, 40, 41, 42, 43, 0, 44, 45, 0, 0, 46, 47, 48, 49, 50, 0, 51, 0, 52, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 0, 0, 0, 0, 0, 0, 0, 0, -14, 221, 53, -14, 0, 0, -211, 217, 55, 56, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 218, 219, 220, 31, 32, 33, 34, 35, 0, 0, 36, 37, 0, 0, 38, 39, 40, 41, 42, 43, 0, 44, 45, 0, 0, 46, 47, 48, 49, 50, 0, 51, 0, 52, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 0, -14, 221, 53, 0, 0, 0, -211, 217, 55, 56, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 218, 219, 220, 31, 32, 33, 34, 35, 0, 0, 36, 37, 0, 0, 38, 39, 40, 41, 42, 43, 0, 44, 45, 0, 0, 46, 47, 48, 49, 50, 0, 51, 0, 52, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 53, -14, 0, 0, -211, 104, 55, 56, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 0, 0, 0, 105, 32, -97, 34, 35, 0, 0, 36, 37, 0, 0, 38, 39, 40, 41, 42, 43, 0, 44, 45, 0, 0, 46, 47, 48, 49, 50, 0, -97, 0, 106, 0, 0, 0, 0, 0, -97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -97, 0, 0, -97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -97, 0, 0, 0, 0, 0, 0, -97, -97, 0, 0, 0, 0, 0, 0, 55, 56, 8, 0, 9, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 0, 0, 0, 31, 32, 33, 34, 35, 0, 0, 36, 37, 0, 0, 38, 39, 40, 41, 42, 43, 0, 44, 45, 0, 0, 46, 47, 48, 49, 50, 0, 51, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239, 0, 53, 54, 0, 0, -211, 244, 55, 56, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 0, 0, 0, 31, 32, 33, 34, 35, 0, 0, 36, 37, 0, 0, 38, 39, 40, 41, 42, 43, 0, 44, 45, 0, 0, 46, 47, 48, 49, 50, 0, 51, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 348, 0, 0, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, -211, 30, 55, 56, 0, 105, 32, 0, 34, 35, 0, 0, 36, 37, 0, 0, 38, 39, 40, 41, 42, 43, 0, 44, 45, 0, 0, 46, 47, 48, 49, 50, 0, 0, 0, 106, 0, 104, 0, 0, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 0, 0, 0, 105, 32, 0, 34, 35, -83, 0, 36, 37, 55, 56, 38, 39, 40, 41, 42, 43, 0, 44, 45, 0, 0, 46, 47, 48, 49, 50, 0, 0, 0, 106, 0, 348, 0, 0, 10, 11, 12, 13, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 29, 0, 30, 0, 0, 0, 105, 32, 0, 34, 35, 0, 0, 36, 37, 55, 56, 38, 39, 40, 41, 42, 43, 0, 44, 45, 259, 0, 46, 47, 48, 49, 50, 0, 0, 0, 106, 0, 0, 0, 0, 260, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, 263, 264, 265, 0, 266, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 0, 0, 267, 0, 0, 0, 0, 0, 0, 0, 0, 268, 269, 270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 271, 272, 273 }; static const yytype_int16 yycheck[] = { 33, 13, 33, 15, 6, 202, 203, 144, 33, 21, 150, 163, 195, 165, 6, 288, 328, 1, 30, 65, 1, 1, 1, 97, 1, 177, 1, 399, 1, 74, 0, 68, 7, 72, 68, 7, 50, 189, 6, 191, 68, 76, 10, 111, 7, 79, 68, 7, 16, 421, 89, 68, 76, 70, 22, 118, 95, 97, 370, 256, 89, 36, 99, 102, 36, 37, 38, 39, 97, 221, 207, 223, 255, 36, 119, 43, 36, 99, 113, 47, 92, 93, 94, 115, 68, 457, 70, 76, 68, 68, 70, 70, 116, 68, 116, 70, 111, 57, 70, 20, 111, 284, 70, 76, 111, 68, 111, 70, 182, 183, 76, 157, 145, 146, 145, 146, 77, 150, 99, 150, 145, 146, 99, 42, 113, 150, 99, 111, 167, 168, 105, 111, 111, 316, 95, 116, 111, 89, 59, 112, 113, 62, 181, 112, 296, 68, 112, 113, 111, 68, 302, 70, 68, 30, 111, 97, 77, 68, 89, 111, 172, 434, 88, 209, 90, 76, 111, 118, 45, 46, 397, 173, 91, 114, 111, 94, 99, 119, 119, 319, 111, 173, 184, 99, 367, 68, 105, 89, 99, 201, 113, 68, 419, 116, 71, 72, 73, 113, 75, 112, 116, 71, 354, 355, 356, 357, 112, 111, 91, 111, 97, 94, 77, 225, 226, 352, 112, 94, 415, 89, 119, 68, 105, 116, 99, 422, 103, 104, 105, 89, 95, 114, 234, 235, 236, 237, 119, 89, 115, 241, 117, 118, 119, 88, 91, 90, 111, 94, 71, 72, 73, 442, 443, 286, 445, 286, 0, 1, 105, 3, 4, 5, 6, 7, 455, 89, 10, 114, 89, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 103, 104, 26, 27, 112, 111, 319, 31, 319, 76, 34, 99, 36, 112, 319, 112, 40, 41, 42, 43, 44, 112, 68, 47, 48, 112, 112, 51, 52, 53, 54, 55, 56, 114, 58, 59, 119, 74, 62, 63, 64, 65, 66, 91, 68, 91, 70, 91, 94, 103, 104, 105, 106, 107, 71, 72, 73, 115, 115, 105, 71, 72, 73, 105, 106, 107, 36, 112, 114, 227, 228, 229, 89, 112, 76, 116, 368, 60, 89, 392, 97, 392, 112, 396, 112, 396, 103, 104, 76, 112, 114, 115, 103, 104, 118, 1, 120, 121, 4, 5, 6, 7, 112, 112, 10, 112, 75, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 116, 116, 26, 27, 89, 71, 97, 31, 112, 89, 34, 71, 36, 71, 81, 295, 40, 41, 67, 43, 44, 67, 158, 47, 48, 94, 99, 51, 52, 53, 54, 55, 56, 396, 58, 59, 392, 170, 62, 63, 64, 65, 66, 447, 347, 329, 70, 267, 268, 269, 270, 271, 272, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, -1, -1, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, -1, -1, -1, 114, -1, -1, 117, 118, 119, 120, 121, 1, -1, -1, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, -1, -1, -1, 40, 41, -1, 43, 44, -1, -1, 47, 48, -1, -1, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, 68, -1, 70, -1, -1, -1, -1, -1, 76, 77, 71, 72, 73, 101, 102, 103, 104, 105, 106, 107, -1, -1, -1, 91, -1, -1, 94, 95, -1, -1, -1, 99, -1, -1, -1, -1, 97, 105, -1, -1, -1, -1, 103, 104, -1, -1, 114, -1, 116, -1, -1, 119, 120, 121, 1, -1, -1, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, -1, -1, -1, 40, 41, -1, 43, 44, -1, -1, 47, 48, -1, -1, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, 68, -1, 70, -1, -1, -1, -1, -1, 76, 77, 71, 72, 73, 305, 306, 307, 308, -1, 310, -1, -1, -1, -1, 91, -1, -1, 94, 95, -1, -1, -1, 99, -1, -1, -1, -1, 97, 105, -1, -1, -1, -1, 103, 104, -1, -1, 114, -1, 116, -1, -1, 119, 120, 121, 1, -1, -1, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, 37, 38, 39, 40, 41, 42, 43, 44, -1, -1, 47, 48, -1, -1, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, 68, -1, 70, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, -1, -1, -1, -1, -1, -1, -1, -1, 112, 113, 114, 115, -1, -1, 118, 1, 120, 121, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, 37, 38, 39, 40, 41, 42, 43, 44, -1, -1, 47, 48, -1, -1, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, 68, -1, 70, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, -1, 112, 113, 114, -1, -1, -1, 118, 1, 120, 121, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, 37, 38, 39, 40, 41, 42, 43, 44, -1, -1, 47, 48, -1, -1, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, 68, -1, 70, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 113, 114, 115, -1, -1, 118, 1, 120, 121, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, -1, -1, -1, 40, 41, 42, 43, 44, -1, -1, 47, 48, -1, -1, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, 68, -1, 70, -1, -1, -1, -1, -1, 76, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 91, -1, -1, 94, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 105, -1, -1, -1, -1, -1, -1, 112, 113, -1, -1, -1, -1, -1, -1, 120, 121, 1, -1, 3, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, -1, -1, -1, 40, 41, 42, 43, 44, -1, -1, 47, 48, -1, -1, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, 68, -1, 70, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 112, -1, 114, 115, -1, -1, 118, 1, 120, 121, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, -1, -1, -1, 40, 41, 42, 43, 44, -1, -1, 47, 48, -1, -1, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, 68, -1, 70, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, 118, 36, 120, 121, -1, 40, 41, -1, 43, 44, -1, -1, 47, 48, -1, -1, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, -1, -1, 70, -1, 1, -1, -1, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, -1, -1, -1, 40, 41, -1, 43, 44, 116, -1, 47, 48, 120, 121, 51, 52, 53, 54, 55, 56, -1, 58, 59, -1, -1, 62, 63, 64, 65, 66, -1, -1, -1, 70, -1, 1, -1, -1, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 26, 27, -1, -1, -1, 31, -1, -1, 34, -1, 36, -1, -1, -1, 40, 41, -1, 43, 44, -1, -1, 47, 48, 120, 121, 51, 52, 53, 54, 55, 56, -1, 58, 59, 30, -1, 62, 63, 64, 65, 66, -1, -1, -1, 70, -1, -1, -1, -1, 45, 46, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 68, -1, -1, 71, 72, 73, -1, 75, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 120, 121, -1, -1, 94, -1, -1, -1, -1, -1, -1, -1, -1, 103, 104, 105, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 117, 118, 119 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 123, 124, 0, 50, 125, 126, 68, 1, 3, 4, 5, 6, 7, 10, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 26, 27, 31, 34, 36, 40, 41, 42, 43, 44, 47, 48, 51, 52, 53, 54, 55, 56, 58, 59, 62, 63, 64, 65, 66, 68, 70, 114, 115, 120, 121, 127, 128, 130, 131, 135, 138, 139, 140, 141, 148, 151, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 173, 176, 111, 68, 99, 113, 116, 1, 68, 70, 111, 138, 1, 7, 36, 105, 111, 138, 164, 1, 111, 138, 1, 111, 138, 1, 40, 70, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 114, 117, 118, 119, 150, 152, 153, 173, 97, 74, 182, 97, 76, 113, 142, 143, 142, 136, 137, 177, 151, 111, 168, 89, 111, 168, 111, 169, 111, 111, 111, 111, 151, 118, 126, 1, 99, 112, 168, 112, 138, 138, 111, 138, 164, 168, 89, 165, 165, 112, 169, 112, 168, 68, 115, 116, 177, 152, 152, 7, 36, 57, 166, 77, 95, 181, 149, 150, 152, 136, 137, 119, 142, 68, 91, 94, 105, 139, 1, 37, 38, 39, 113, 129, 130, 135, 7, 36, 37, 38, 39, 70, 167, 129, 129, 168, 168, 170, 170, 138, 112, 129, 168, 165, 165, 1, 135, 6, 10, 16, 22, 43, 47, 70, 129, 129, 68, 114, 178, 138, 30, 45, 46, 68, 71, 72, 73, 75, 94, 103, 104, 105, 117, 118, 119, 192, 194, 195, 196, 197, 198, 199, 200, 192, 99, 177, 142, 172, 178, 179, 113, 89, 89, 89, 129, 112, 129, 113, 138, 138, 167, 167, 167, 111, 112, 112, 135, 135, 135, 135, 112, 135, 76, 171, 112, 112, 178, 115, 192, 99, 119, 199, 199, 199, 199, 199, 199, 191, 192, 88, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 119, 1, 144, 145, 146, 152, 182, 132, 133, 134, 131, 129, 129, 171, 171, 171, 171, 171, 112, 178, 115, 36, 150, 76, 116, 191, 193, 196, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 172, 68, 76, 116, 76, 177, 60, 184, 185, 129, 129, 129, 129, 112, 112, 112, 112, 112, 112, 178, 138, 116, 191, 89, 144, 174, 145, 68, 147, 179, 111, 180, 181, 75, 186, 192, 116, 20, 59, 62, 77, 175, 179, 181, 192, 71, 72, 73, 89, 97, 103, 104, 187, 190, 71, 182, 112, 97, 187, 187, 89, 97, 188, 189, 187, 183, 185, 97, 89, 187, 181, 71, 89, 97, 89, 71, 71 }; /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 122, 123, 124, 125, 125, 126, 126, 127, 127, 127, 127, 127, 128, 129, 129, 129, 129, 129, 129, 129, 129, 130, 131, 132, 133, 134, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 136, 137, 138, 138, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 140, 141, 142, 143, 144, 144, 145, 145, 145, 145, 146, 147, 147, 148, 149, 149, 150, 150, 151, 151, 151, 152, 152, 152, 152, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 164, 165, 165, 165, 165, 165, 165, 165, 165, 165, 166, 166, 166, 167, 167, 167, 167, 167, 167, 168, 169, 170, 171, 171, 172, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 174, 174, 174, 174, 175, 175, 176, 176, 177, 177, 177, 177, 178, 178, 178, 179, 180, 180, 181, 181, 181, 182, 182, 183, 183, 183, 183, 183, 184, 184, 184, 184, 185, 185, 186, 186, 187, 187, 187, 187, 187, 188, 188, 188, 188, 189, 189, 189, 189, 189, 190, 190, 190, 191, 191, 192, 192, 193, 194, 194, 195, 196, 196, 197, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 199, 199, 199, 199, 199, 199, 199, 199, 200, 200, 200, 200, 200, 200, 200, 200 }; /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 2, 0, 5, 1, 0, 2, 2, 1, 1, 1, 2, 1, 0, 3, 4, 4, 4, 4, 2, 2, 1, 1, 0, 0, 0, 1, 2, 3, 2, 2, 1, 3, 4, 2, 2, 6, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 2, 1, 3, 7, 0, 0, 1, 1, 3, 2, 2, 3, 2, 5, 3, 1, 6, 3, 4, 1, 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 5, 4, 6, 1, 5, 4, 2, 5, 4, 2, 6, 7, 6, 6, 6, 6, 2, 2, 1, 4, 3, 3, 2, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 1, 1, 1, 2, 2, 2, 1, 2, 2, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 0, 2, 0, 1, 0, 2, 2, 2, 0, 4, 3, 1, 1, 3, 0, 2, 2, 0, 1, 1, 2, 3, 4, 3, 2, 4, 5, 4, 0, 1, 0, 1, 1, 1, 1, 2, 2, 0, 1, 2, 1, 1, 2, 2, 3, 1, 1, 2, 1, 3, 1, 5, 1, 1, 3, 1, 1, 3, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 2, 2, 2, 2, 2, 2, 4, 1, 3, 1, 1, 1, 1, 1, 1, 1 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY) \ { \ yychar = (Token); \ yylval = (Value); \ YYPOPSTACK (yylen); \ yystate = *yyssp; \ goto yybackup; \ } \ else \ { \ yyerror (YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (0) /* Error token number */ #define YYTERROR 1 #define YYERRCODE 256 /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (0) /* This macro is provided for backward compatibility. */ #ifndef YY_LOCATION_PRINT # define YY_LOCATION_PRINT(File, Loc) ((void) 0) #endif # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value); \ YYFPRINTF (stderr, "\n"); \ } \ } while (0) /*-----------------------------------. | Print this symbol's value on YYO. | `-----------------------------------*/ static void yy_symbol_value_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep) { FILE *yyoutput = yyo; YYUSE (yyoutput); if (!yyvaluep) return; # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyo, yytoknum[yytype], *yyvaluep); # endif YYUSE (yytype); } /*---------------------------. | Print this symbol on YYO. | `---------------------------*/ static void yy_symbol_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep) { YYFPRINTF (yyo, "%s %s (", yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]); yy_symbol_value_print (yyo, yytype, yyvaluep); YYFPRINTF (yyo, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ static void yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) { YYFPRINTF (stderr, "Stack now"); for (; yybottom <= yytop; yybottom++) { int yybot = *yybottom; YYFPRINTF (stderr, " %d", yybot); } YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (0) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ static void yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule) { unsigned long yylno = yyrline[yyrule]; int yynrhs = yyr2[yyrule]; int yyi; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { YYFPRINTF (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yystos[yyssp[yyi + 1 - yynrhs]], &yyvsp[(yyi + 1) - (yynrhs)] ); YYFPRINTF (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyssp, yyvsp, Rule); \ } while (0) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ static YYSIZE_T yystrlen (const char *yystr) { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ static char * yystpcpy (char *yydest, const char *yysrc) { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; else goto append; append: default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return (YYSIZE_T) (yystpcpy (yyres, yystr) - yyres); } # endif /* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message about the unexpected token YYTOKEN for the state stack whose top is YYSSP. Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is not large enough to hold the message. In that case, also set *YYMSG_ALLOC to the required number of bytes. Return 2 if the required number of bytes is too large to store. */ static int yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, yytype_int16 *yyssp, int yytoken) { YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]); YYSIZE_T yysize = yysize0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; /* Internationalized format string. */ const char *yyformat = YY_NULLPTR; /* Arguments of yyformat. */ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; /* Number of reported tokens (one for the "unexpected", one per "expected"). */ int yycount = 0; /* There are many possibilities here to consider: - If this state is a consistent state with a default action, then the only way this function was invoked is if the default action is an error action. In that case, don't check for expected tokens because there are none. - The only way there can be no lookahead present (in yychar) is if this state is a consistent state with a default action. Thus, detecting the absence of a lookahead is sufficient to determine that there is no unexpected or expected token to report. In that case, just report a simple "syntax error". - Don't assume there isn't a lookahead just because this state is a consistent state with a default action. There might have been a previous inconsistent state, consistent state with a non-default action, or user semantic action that manipulated yychar. - Of course, the expected token list depends on states to have correct lookahead information, and it depends on the parser not to perform extra reductions after fetching a lookahead from the scanner and before detecting a syntax error. Thus, state merging (from LALR or IELR) and default reductions corrupt the expected token list. However, the list is correct for canonical LR with one exception: it will still contain any token that will not be accepted due to an error action in a later state. */ if (yytoken != YYEMPTY) { int yyn = yypact[*yyssp]; yyarg[yycount++] = yytname[yytoken]; if (!yypact_value_is_default (yyn)) { /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. In other words, skip the first -YYN actions for this state because they are default actions. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yyx; for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR && !yytable_value_is_error (yytable[yyx + yyn])) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; break; } yyarg[yycount++] = yytname[yyx]; { YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]); if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM) yysize = yysize1; else return 2; } } } } switch (yycount) { # define YYCASE_(N, S) \ case N: \ yyformat = S; \ break default: /* Avoid compiler warnings. */ YYCASE_(0, YY_("syntax error")); YYCASE_(1, YY_("syntax error, unexpected %s")); YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); # undef YYCASE_ } { YYSIZE_T yysize1 = yysize + yystrlen (yyformat); if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM) yysize = yysize1; else return 2; } if (*yymsg_alloc < yysize) { *yymsg_alloc = 2 * yysize; if (! (yysize <= *yymsg_alloc && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; return 1; } /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ { char *yyp = *yymsg; int yyi = 0; while ((*yyp = *yyformat) != '\0') if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyformat += 2; } else { yyp++; yyformat++; } } return 0; } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) { YYUSE (yyvaluep); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN YYUSE (yytype); YY_IGNORE_MAYBE_UNINITIALIZED_END } /* The lookahead symbol. */ int yychar; /* The semantic value of the lookahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; /*----------. | yyparse. | `----------*/ int yyparse (void) { int yystate; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* The stacks and their tools: 'yyss': related to states. 'yyvs': related to semantic values. Refer to the stacks through separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs; YYSTYPE *yyvsp; YYSIZE_T yystacksize; int yyn; int yyresult; /* Lookahead token as an internal (translated) token number. */ int yytoken = 0; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; yyssp = yyss = yyssa; yyvsp = yyvs = yyvsa; yystacksize = YYINITDEPTH; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ goto yysetstate; /*------------------------------------------------------------. | yynewstate -- push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; /*--------------------------------------------------------------------. | yynewstate -- set current state (the top of the stack) to yystate. | `--------------------------------------------------------------------*/ yysetstate: *yyssp = (yytype_int16) yystate; if (yyss + yystacksize - 1 <= yyssp) #if !defined yyoverflow && !defined YYSTACK_RELOCATE goto yyexhaustedlab; #else { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = (YYSIZE_T) (yyssp - yyss + 1); # if defined yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } # else /* defined YYSTACK_RELOCATE */ /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss_alloc, yyss); YYSTACK_RELOCATE (yyvs_alloc, yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } #endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ YYDPRINTF ((stderr, "Entering state %d\n", yystate)); if (yystate == YYFINAL) YYACCEPT; goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a lookahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; if (yypact_value_is_default (yyn)) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = yylex (); } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yytable_value_is_error (yyn)) goto yyerrlab; yyn = -yyn; goto yyreduce; } /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the lookahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token. */ yychar = YYEMPTY; yystate = yyn; YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; YY_IGNORE_MAYBE_UNINITIALIZED_END goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: '$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 2: #line 223 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if (lflag) { custom_header = 0; custom_fault = 0; } else { add_header(); add_fault(); } compile(sp->table); freetable(classtable); freetable(enumtable); freetable(typetable); freetable(booltable); freetable(templatetable); yylineno = 0; } #line 2047 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 3: #line 243 "soapcpp2_yacc.y" /* yacc.c:1667 */ { classtable = mktable(NULL); enumtable = mktable(NULL); typetable = mktable(NULL); booltable = mktable(NULL); templatetable = mktable(NULL); p = enter(booltable, lookup("false")); p->info.typ = mkint(); p->info.val.i = 0; p = enter(booltable, lookup("true")); p->info.typ = mkint(); p->info.val.i = 1; mkscope(mktable(mktable(NULL)), 0); } #line 2066 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 4: #line 259 "soapcpp2_yacc.y" /* yacc.c:1667 */ { set_namespace((yyvsp[-3].sym)->name); } #line 2072 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 5: #line 260 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 2078 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 6: #line 262 "soapcpp2_yacc.y" /* yacc.c:1667 */ { add_soap(); add_XML(); add_qname(); } #line 2088 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 7: #line 267 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 2094 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 8: #line 269 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 2100 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 9: #line 270 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 2106 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 10: #line 271 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 2112 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 11: #line 272 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 2118 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 12: #line 273 "soapcpp2_yacc.y" /* yacc.c:1667 */ { synerror("input before ; skipped"); while (sp > stack) { freetable(sp->table); exitscope(); } yyerrok; } #line 2132 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 13: #line 283 "soapcpp2_yacc.y" /* yacc.c:1667 */ { add_pragma((yyvsp[0].s)); } #line 2138 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 14: #line 292 "soapcpp2_yacc.y" /* yacc.c:1667 */ { transient &= ~6; permission = 0; } #line 2147 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 15: #line 297 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 2153 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 16: #line 299 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 2159 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 17: #line 301 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 2165 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 18: #line 303 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 2171 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 19: #line 305 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 2177 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 20: #line 306 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 2183 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 21: #line 307 "soapcpp2_yacc.y" /* yacc.c:1667 */ { synerror("declaration expected"); yyerrok; } #line 2192 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 22: #line 312 "soapcpp2_yacc.y" /* yacc.c:1667 */ { transient |= 1; } #line 2198 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 23: #line 314 "soapcpp2_yacc.y" /* yacc.c:1667 */ { transient &= ~1; } #line 2204 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 24: #line 316 "soapcpp2_yacc.y" /* yacc.c:1667 */ { permission = (int)Sprivate; } #line 2210 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 25: #line 318 "soapcpp2_yacc.y" /* yacc.c:1667 */ { permission = (int)Sprotected; } #line 2216 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 26: #line 320 "soapcpp2_yacc.y" /* yacc.c:1667 */ { permission = 0; } #line 2222 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 27: #line 322 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 2228 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 28: #line 323 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 2234 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 29: #line 325 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 2240 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 30: #line 326 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 2246 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 31: #line 327 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 2252 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 32: #line 328 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 2258 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 33: #line 330 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 2264 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 34: #line 332 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 2270 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 35: #line 333 "soapcpp2_yacc.y" /* yacc.c:1667 */ { sprintf(errbuf, "incomplete type in declaration of '%s'", (yyvsp[0].sym)->name); synerror(errbuf); yyerrok; } #line 2280 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 36: #line 338 "soapcpp2_yacc.y" /* yacc.c:1667 */ { synerror("function declaration?"); yyerrok; } #line 2289 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 37: #line 344 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if (((int)(yyvsp[-3].rec).sto & (int)Stypedef) && sp->table->level == GLOBAL) { if (((yyvsp[-3].rec).typ->type != Tstruct && (yyvsp[-3].rec).typ->type != Tclass && (yyvsp[-3].rec).typ->type != Tunion && (yyvsp[-3].rec).typ->type != Tenum && (yyvsp[-3].rec).typ->type != Tenumsc) || ((is_binary((yyvsp[-3].rec).typ) || is_stdstr((yyvsp[-3].rec).typ)) && strcmp((yyvsp[-4].sym)->name, (yyvsp[-3].rec).typ->id->name)) || strcmp((yyvsp[-4].sym)->name, (yyvsp[-3].rec).typ->id->name)) { p = enter(typetable, (yyvsp[-4].sym)); p->info.typ = mksymtype((yyvsp[-3].rec).typ, (yyvsp[-4].sym)); if (((int)(yyvsp[-3].rec).sto & (int)Sextern)) { p->info.typ->transient = -1; p->info.typ->extsym = (yyvsp[-4].sym); } else if (is_external((yyvsp[-3].rec).typ)) p->info.typ->transient = -3; /* extern and volatile */ else p->info.typ->transient = (yyvsp[-3].rec).typ->transient; if (p->info.typ->width == 0) p->info.typ->width = 8; p->info.sto = (yyvsp[-3].rec).sto; p->info.typ->restriction = (yyvsp[-3].rec).typ->sym; p->info.typ->synonym = (yyvsp[-3].rec).typ->sym; if ((yyvsp[-1].rec).hasmin) { p->info.typ->hasmin = (yyvsp[-1].rec).hasmin; p->info.typ->incmin = (yyvsp[-1].rec).incmin; p->info.typ->imin = (yyvsp[-1].rec).imin; p->info.typ->rmin = (yyvsp[-1].rec).rmin; p->info.typ->synonym = NULL; } else { p->info.typ->hasmin = (yyvsp[-3].rec).typ->hasmin; p->info.typ->incmin = (yyvsp[-3].rec).typ->incmin; p->info.typ->imin = (yyvsp[-3].rec).typ->imin; p->info.typ->rmin = (yyvsp[-3].rec).typ->rmin; } if ((yyvsp[-1].rec).hasmax) { p->info.typ->hasmax = (yyvsp[-1].rec).hasmax; p->info.typ->incmax = (yyvsp[-1].rec).incmax; p->info.typ->imax = (yyvsp[-1].rec).imax; p->info.typ->rmax = (yyvsp[-1].rec).rmax; p->info.typ->synonym = NULL; } else { p->info.typ->hasmax = (yyvsp[-3].rec).typ->hasmax; p->info.typ->incmax = (yyvsp[-3].rec).typ->incmax; p->info.typ->imax = (yyvsp[-3].rec).typ->imax; p->info.typ->rmax = (yyvsp[-3].rec).typ->rmax; } if (p->info.typ->property == 1) p->info.typ->property = (yyvsp[-3].rec).typ->property; if ((yyvsp[-1].rec).pattern) { p->info.typ->pattern = (yyvsp[-1].rec).pattern; p->info.typ->synonym = NULL; } else if (!p->info.typ->pattern) { p->info.typ->pattern = (yyvsp[-3].rec).typ->pattern; } } if ((yyvsp[0].rec).hasval) set_value(p, (yyvsp[-3].rec).typ, &(yyvsp[0].rec)); (yyvsp[-4].sym)->token = TYPE; } else { p = enter(sp->table, (yyvsp[-4].sym)); p->tag = (yyvsp[-2].s); p->info.typ = (yyvsp[-3].rec).typ; p->info.sto = (Storage)((int)(yyvsp[-3].rec).sto | permission); if ((yyvsp[0].rec).hasval) set_value(p, (yyvsp[-3].rec).typ, &(yyvsp[0].rec)); else p->info.val.i = sp->val; if ((yyvsp[-1].rec).minOccurs < 0) { if ((yyvsp[0].rec).hasval || ((int)(yyvsp[-3].rec).sto & (int)Sattribute) || ((int)(yyvsp[-3].rec).sto & (int)Sspecial) || (yyvsp[-3].rec).typ->type == Tpointer || (yyvsp[-3].rec).typ->type == Ttemplate || is_anyAttribute((yyvsp[-3].rec).typ) || !strncmp((yyvsp[-4].sym)->name, "__size", 6)) p->info.minOccurs = 0; else p->info.minOccurs = 1; } else { p->info.minOccurs = (yyvsp[-1].rec).minOccurs; } p->info.maxOccurs = (yyvsp[-1].rec).maxOccurs; p->info.nillable = (yyvsp[-1].rec).nillable; if (sp->mask) sp->val <<= 1; else sp->val++; p->info.offset = sp->offset; if (((int)(yyvsp[-3].rec).sto & (int)Sextern)) p->level = GLOBAL; else if (((int)(yyvsp[-3].rec).sto & (int)Stypedef)) ; else if (sp->grow) sp->offset += p->info.typ->width; else if (p->info.typ->width > sp->offset) sp->offset = p->info.typ->width; } sp->entry = p; } #line 2412 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 38: #line 463 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if (((int)(yyvsp[-1].rec).sto & (int)Stypedef)) { sprintf(errbuf, "invalid typedef qualifier for '%s'", (yyvsp[0].sym)->name); semwarn(errbuf); } p = enter(sp->table, (yyvsp[0].sym)); p->info.typ = (yyvsp[-1].rec).typ; p->info.sto = (yyvsp[-1].rec).sto; p->info.hasval = False; p->info.offset = sp->offset; if (sp->grow) sp->offset += p->info.typ->width; else if (p->info.typ->width > sp->offset) sp->offset = p->info.typ->width; sp->entry = p; } #line 2434 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 39: #line 481 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = (yyvsp[0].sym); } #line 2440 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 40: #line 482 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = (yyvsp[0].sym); } #line 2446 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 41: #line 484 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = (yyvsp[0].sym); } #line 2452 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 42: #line 485 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator!"); } #line 2458 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 43: #line 486 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator~"); } #line 2464 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 44: #line 487 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator="); } #line 2470 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 45: #line 488 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator+="); } #line 2476 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 46: #line 489 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator-="); } #line 2482 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 47: #line 490 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator*="); } #line 2488 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 48: #line 491 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator/="); } #line 2494 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 49: #line 492 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator%="); } #line 2500 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 50: #line 493 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator&="); } #line 2506 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 51: #line 494 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator^="); } #line 2512 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 52: #line 495 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator|="); } #line 2518 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 53: #line 496 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator<<="); } #line 2524 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 54: #line 497 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator>>="); } #line 2530 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 55: #line 498 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator||"); } #line 2536 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 56: #line 499 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator&&"); } #line 2542 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 57: #line 500 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator|"); } #line 2548 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 58: #line 501 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator^"); } #line 2554 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 59: #line 502 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator&"); } #line 2560 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 60: #line 503 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator=="); } #line 2566 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 61: #line 504 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator!="); } #line 2572 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 62: #line 505 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator<"); } #line 2578 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 63: #line 506 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator<="); } #line 2584 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 64: #line 507 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator>"); } #line 2590 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 65: #line 508 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator>="); } #line 2596 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 66: #line 509 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator<<"); } #line 2602 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 67: #line 510 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator>>"); } #line 2608 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 68: #line 511 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator+"); } #line 2614 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 69: #line 512 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator-"); } #line 2620 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 70: #line 513 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator*"); } #line 2626 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 71: #line 514 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator/"); } #line 2632 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 72: #line 515 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator%"); } #line 2638 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 73: #line 516 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator++"); } #line 2644 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 74: #line 517 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator--"); } #line 2650 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 75: #line 518 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator->"); } #line 2656 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 76: #line 519 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator[]"); } #line 2662 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 77: #line 520 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = lookup("operator()"); } #line 2668 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 78: #line 521 "soapcpp2_yacc.y" /* yacc.c:1667 */ { s1 = c_storage((yyvsp[0].rec).sto); s2 = c_type((yyvsp[0].rec).typ); s = (char*)emalloc(strlen(s1) + strlen(s2) + 10); strcpy(s, "operator "); strcat(s, s1); strcat(s, s2); (yyval.sym) = lookup(s); if (!(yyval.sym)) (yyval.sym) = install(s, ID); } #line 2684 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 79: #line 533 "soapcpp2_yacc.y" /* yacc.c:1667 */ { sp->entry = enter(sp->table, (yyvsp[0].sym)); sp->entry->info.typ = mknone(); sp->entry->info.sto = permission; sp->entry->info.offset = sp->offset; sp->node.typ = mkvoid(); sp->node.sto = Snone; if ((yyvsp[0].sym) != sp->table->sym) { if (sp->table->level == GLOBAL) { sp->entry->info.typ = mkint(); sp->node.typ = mkint(); } else if (strncmp((yyvsp[0].sym)->name, "operator ", 9)) { sprintf(errbuf, "invalid constructor function '%s' or missing return type", (yyvsp[0].sym)->name); semerror(errbuf); } } } #line 2710 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 80: #line 556 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((yyvsp[0].sym) != sp->table->sym) { sprintf(errbuf, "invalid destructor function '%s'", (yyvsp[0].sym)->name); semerror(errbuf); } else { s = (char*)emalloc(strlen((yyvsp[0].sym)->name) + 2); s2 = strrchr((yyvsp[0].sym)->name, ':'); if (s2 && *(s2+1) && (s2 == (yyvsp[0].sym)->name || *(s2-1) != ':')) { strncpy(s, (yyvsp[0].sym)->name, s2 - (yyvsp[0].sym)->name + 1); strcat(s, "~"); strcat(s, s2 + 1); } else { strcpy(s, "~"); strcat(s, (yyvsp[0].sym)->name); } sym = lookup(s); if (!sym) sym = install(s, ID); sp->entry = enter(sp->table, sym); sp->entry->info.typ = mknone(); sp->entry->info.sto = (yyvsp[-2].sto); sp->entry->info.offset = sp->offset; } sp->node.typ = mkvoid(); sp->node.sto = Snone; } #line 2747 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 81: #line 590 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((yyvsp[-6].e)->level == GLOBAL) { if (!((int)(yyvsp[-6].e)->info.sto & (int)Sextern) && sp->entry && sp->entry->info.typ->type == Tpointer && ((Tnode*)sp->entry->info.typ->ref)->type == Tchar) { sprintf(errbuf, "last output parameter of service operation function prototype '%s' is a pointer to a char which will only return one byte: use char** instead to return a string", (yyvsp[-6].e)->sym->name); semwarn(errbuf); } if (((int)(yyvsp[-6].e)->info.sto & (int)Sextern)) { (yyvsp[-6].e)->info.typ = mkmethod((yyvsp[-6].e)->info.typ, sp->table); } else if (sp->entry && (sp->entry->info.typ->type == Tpointer || sp->entry->info.typ->type == Treference || sp->entry->info.typ->type == Tarray || is_transient(sp->entry->info.typ))) { if ((yyvsp[-6].e)->info.typ->type == Tint) { sp->entry->info.sto = (Storage)((int)sp->entry->info.sto | (int)Sreturn); (yyvsp[-6].e)->info.typ = mkfun(sp->entry); (yyvsp[-6].e)->info.typ->id = (yyvsp[-6].e)->sym; if (!is_transient(sp->entry->info.typ)) { if (!is_response(sp->entry->info.typ)) { if (!is_XML(sp->entry->info.typ) && !is_stdXML(sp->entry->info.typ)) add_response((yyvsp[-6].e), sp->entry); } else { add_result(sp->entry->info.typ); } } add_request((yyvsp[-6].e)->sym, sp); } else { sprintf(errbuf, "return type of service operation function prototype '%s' must be integer", (yyvsp[-6].e)->sym->name); semerror(errbuf); } } else { sprintf(errbuf, "last output parameter of service operation function prototype '%s' is a return parameter and must be a pointer or reference, or use %s(..., void) for one-way sends", (yyvsp[-6].e)->sym->name, (yyvsp[-6].e)->sym->name); semerror(errbuf); } } else if ((yyvsp[-6].e)->level == INTERNAL) { (yyvsp[-6].e)->info.typ = mkmethod((yyvsp[-6].e)->info.typ, sp->table); (yyvsp[-6].e)->info.sto = (Storage)((int)(yyvsp[-6].e)->info.sto | (int)(yyvsp[-1].sto) | (int)(yyvsp[0].sto)); transient &= ~1; } exitscope(); } #line 2811 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 82: #line 650 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.e) = sp->entry; } #line 2817 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 83: #line 652 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 2823 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 84: #line 653 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 2829 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 85: #line 655 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 2835 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 86: #line 657 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 2841 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 87: #line 658 "soapcpp2_yacc.y" /* yacc.c:1667 */ { sprintf(errbuf, "undefined '%s'", (yyvsp[0].sym)->name); synerror(errbuf); } #line 2850 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 88: #line 662 "soapcpp2_yacc.y" /* yacc.c:1667 */ { synerror("formal argument expected"); yyerrok; } #line 2859 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 89: #line 668 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 2865 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 90: #line 670 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if (sp->table->level != PARAM) p = enter(sp->table, gensymidx("param", (int)++sp->val)); else if (eflag || zflag == 0 || zflag > 3) p = enter(sp->table, gensymidx("_param", (int)++sp->val)); else p = enter(sp->table, gensym("_param")); if (((int)(yyvsp[-1].rec).sto & (int)Stypedef)) semwarn("typedef in function argument"); p->info.typ = (yyvsp[-1].rec).typ; p->info.sto = (yyvsp[-1].rec).sto; p->info.offset = sp->offset; if ((yyvsp[0].rec).hasval) set_value(p, (yyvsp[-1].rec).typ, &(yyvsp[0].rec)); if (((int)(yyvsp[-1].rec).sto & (int)Sextern)) p->level = GLOBAL; else if (sp->grow) sp->offset += p->info.typ->width; else if (p->info.typ->width > sp->offset) sp->offset = p->info.typ->width; sp->entry = p; } #line 2892 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 91: #line 693 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if (soap_version == 2 && *(yyvsp[-4].sym)->name == '_' && sp->table->level == GLOBAL) { sprintf(errbuf, "SOAP 1.2 does not support anonymous parameters '%s'", (yyvsp[-4].sym)->name); semwarn(errbuf); } if (((int)(yyvsp[-3].rec).sto & (int)Stypedef)) semwarn("typedef in function argument"); p = enter(sp->table, (yyvsp[-4].sym)); p->info.typ = (yyvsp[-3].rec).typ; p->info.sto = (yyvsp[-3].rec).sto; p->tag = (yyvsp[-2].s); if ((yyvsp[-1].rec).minOccurs < 0) { if ((yyvsp[0].rec).hasval || ((int)(yyvsp[-3].rec).sto & (int)Sattribute) || ((int)(yyvsp[-3].rec).sto & (int)Sspecial) || (yyvsp[-3].rec).typ->type == Tpointer || (yyvsp[-3].rec).typ->type == Ttemplate || is_anyAttribute((yyvsp[-3].rec).typ) || !strncmp((yyvsp[-4].sym)->name, "__size", 6)) p->info.minOccurs = 0; else p->info.minOccurs = 1; } else { p->info.minOccurs = (yyvsp[-1].rec).minOccurs; } p->info.maxOccurs = (yyvsp[-1].rec).maxOccurs; p->info.nillable = (yyvsp[-1].rec).nillable; p->info.offset = sp->offset; if ((yyvsp[0].rec).hasval) set_value(p, (yyvsp[-3].rec).typ, &(yyvsp[0].rec)); if (((int)(yyvsp[-3].rec).sto & (int)Sextern)) p->level = GLOBAL; else if (sp->grow) sp->offset += p->info.typ->width; else if (p->info.typ->width > sp->offset) sp->offset = p->info.typ->width; sp->entry = p; } #line 2939 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 92: #line 736 "soapcpp2_yacc.y" /* yacc.c:1667 */ { tmp = sp->node; p = enter(sp->table, (yyvsp[-2].sym)); p->info.typ = mkint(); p->info.sto = permission; p->tag = (yyvsp[-1].s); p->info.hasval = True; p->info.ptrval = False; p->info.fixed = (yyvsp[0].rec).fixed; p->info.val.i = sp->val; if ((yyvsp[0].rec).hasval) { set_value(p, p->info.typ, &(yyvsp[0].rec)); sp->val = p->info.val.i; } if (sp->mask) sp->val <<= 1; else sp->val++; p->info.offset = sp->offset; sp->entry = p; } #line 2966 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 93: #line 768 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = (yyvsp[0].rec); } #line 2972 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 94: #line 770 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).typ = mkmethod(tmp.typ, sp->table); transient &= ~1; exitscope(); } #line 2982 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 95: #line 777 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = (yyvsp[0].rec); } #line 2988 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 96: #line 779 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = (yyvsp[0].rec); } #line 2994 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 97: #line 786 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).typ = (yyvsp[0].typ); (yyval.rec).sto = Snone; sp->node = (yyval.rec); } #line 3004 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 98: #line 791 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).typ = (yyvsp[0].rec).typ; (yyval.rec).sto = (Storage)((int)(yyvsp[-1].sto) | (int)(yyvsp[0].rec).sto); if (((int)(yyval.rec).sto & (int)Sattribute)) { if (is_smart((yyvsp[0].rec).typ)) { if (!is_primitive_or_string((yyvsp[0].rec).typ->ref) && !is_stdstr((Tnode*)(yyvsp[0].rec).typ->ref) && !is_binary((Tnode*)(yyvsp[0].rec).typ->ref) && !is_external((Tnode*)(yyvsp[0].rec).typ->ref)) { semwarn("invalid attribute smart pointer @type"); (yyval.rec).sto = (Storage)((int)(yyval.rec).sto & ~(int)Sattribute); } } else if ((yyvsp[0].rec).typ->type == Tpointer) { if (!is_primitive_or_string((yyvsp[0].rec).typ->ref) && !is_stdstr((Tnode*)(yyvsp[0].rec).typ->ref) && !is_binary((Tnode*)(yyvsp[0].rec).typ->ref) && !is_external((Tnode*)(yyvsp[0].rec).typ->ref)) { semwarn("invalid attribute pointer @type"); (yyval.rec).sto = (Storage)((int)(yyval.rec).sto & ~(int)Sattribute); } } else if ( !is_primitive_or_string((yyvsp[0].rec).typ) && !is_stdstr((yyvsp[0].rec).typ) && !is_binary((yyvsp[0].rec).typ) && !is_external((yyvsp[0].rec).typ)) { semwarn("invalid attribute @type"); (yyval.rec).sto = (Storage)((int)(yyval.rec).sto & ~(int)Sattribute); } } sp->node = (yyval.rec); if (((int)(yyvsp[-1].sto) & (int)Sextern)) transient = 0; } #line 3050 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 99: #line 832 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((yyvsp[-1].typ)->type == Tint) switch ((yyvsp[0].rec).typ->type) { case Tchar: (yyval.rec).typ = (yyvsp[0].rec).typ; break; case Tshort: (yyval.rec).typ = (yyvsp[0].rec).typ; break; case Tint: (yyval.rec).typ = (yyvsp[-1].typ); break; case Tlong: (yyval.rec).typ = (yyvsp[0].rec).typ; break; case Tllong: (yyval.rec).typ = (yyvsp[0].rec).typ; break; default: semwarn("invalid int type specified"); (yyval.rec).typ = (yyvsp[0].rec).typ; } else if ((yyvsp[-1].typ)->type == Tuint) switch ((yyvsp[0].rec).typ->type) { case Tchar: (yyval.rec).typ = mkuchar(); break; case Tshort: (yyval.rec).typ = mkushort(); break; case Tint: (yyval.rec).typ = (yyvsp[-1].typ); break; case Tlong: (yyval.rec).typ = mkulong(); break; case Tllong: (yyval.rec).typ = mkullong(); break; default: semwarn("invalid unsigned type specified"); (yyval.rec).typ = (yyvsp[0].rec).typ; } else if ((yyvsp[-1].typ)->type == Tlong) switch ((yyvsp[0].rec).typ->type) { case Tint: (yyval.rec).typ = (yyvsp[-1].typ); break; case Tlong: (yyval.rec).typ = mkllong(); break; case Tuint: (yyval.rec).typ = mkulong(); break; case Tulong: (yyval.rec).typ = mkullong(); break; case Tdouble: (yyval.rec).typ = mkldouble(); break; default: semwarn("invalid use of 'long'"); (yyval.rec).typ = (yyvsp[0].rec).typ; } else if ((yyvsp[-1].typ)->type == Tulong) switch ((yyvsp[0].rec).typ->type) { case Tint: (yyval.rec).typ = (yyvsp[-1].typ); break; case Tlong: (yyval.rec).typ = mkullong(); break; case Tuint: (yyval.rec).typ = (yyvsp[-1].typ); break; case Tulong: (yyval.rec).typ = mkullong(); break; default: semwarn("invalid use of 'long'"); (yyval.rec).typ = (yyvsp[0].rec).typ; } else if ((yyvsp[0].rec).typ->type == Tint) (yyval.rec).typ = (yyvsp[-1].typ); else semwarn("invalid type specified (missing ';' or type name used as non-type identifier?)"); (yyval.rec).sto = (yyvsp[0].rec).sto; sp->node = (yyval.rec); } #line 3106 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 100: #line 884 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).typ = mkint(); (yyval.rec).sto = (yyvsp[0].sto); sp->node = (yyval.rec); if (((int)(yyvsp[0].sto) & (int)Sextern)) transient = 0; } #line 3118 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 101: #line 891 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).typ = (yyvsp[0].typ); (yyval.rec).sto = Snone; sp->node = (yyval.rec); } #line 3128 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 102: #line 896 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).typ = (yyvsp[0].rec).typ; (yyval.rec).sto = (Storage)((int)(yyvsp[-1].sto) | (int)(yyvsp[0].rec).sto); if (((int)(yyval.rec).sto & (int)Sattribute)) { if (is_smart((yyvsp[0].rec).typ)) { if (!is_primitive_or_string((Tnode*)(yyvsp[0].rec).typ->ref) && !is_stdstr((Tnode*)(yyvsp[0].rec).typ->ref) && !is_binary((Tnode*)(yyvsp[0].rec).typ->ref) && !is_external((Tnode*)(yyvsp[0].rec).typ->ref)) { semwarn("invalid attribute smart pointer @type"); (yyval.rec).sto = (Storage)((int)(yyval.rec).sto & ~(int)Sattribute); } } else if ((yyvsp[0].rec).typ->type == Tpointer) { if (!is_primitive_or_string((Tnode*)(yyvsp[0].rec).typ->ref) && !is_stdstr((Tnode*)(yyvsp[0].rec).typ->ref) && !is_binary((Tnode*)(yyvsp[0].rec).typ->ref) && !is_external((Tnode*)(yyvsp[0].rec).typ->ref)) { semwarn("invalid attribute pointer @type"); (yyval.rec).sto = (Storage)((int)(yyval.rec).sto & ~(int)Sattribute); } } else if ( !is_primitive_or_string((yyvsp[0].rec).typ) && !is_stdstr((yyvsp[0].rec).typ) && !is_binary((yyvsp[0].rec).typ) && !is_external((yyvsp[0].rec).typ)) { semwarn("invalid attribute @type"); (yyval.rec).sto = (Storage)((int)(yyval.rec).sto & ~(int)Sattribute); } } sp->node = (yyval.rec); if (((int)(yyvsp[-1].sto) & (int)Sextern)) transient = 0; } #line 3174 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 103: #line 937 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((yyvsp[-1].typ)->type == Tint) switch ((yyvsp[0].rec).typ->type) { case Tchar: (yyval.rec).typ = (yyvsp[0].rec).typ; break; case Tshort: (yyval.rec).typ = (yyvsp[0].rec).typ; break; case Tint: (yyval.rec).typ = (yyvsp[-1].typ); break; case Tlong: (yyval.rec).typ = (yyvsp[0].rec).typ; break; case Tllong: (yyval.rec).typ = (yyvsp[0].rec).typ; break; default: semwarn("invalid int type specified"); (yyval.rec).typ = (yyvsp[0].rec).typ; } else if ((yyvsp[-1].typ)->type == Tuint) switch ((yyvsp[0].rec).typ->type) { case Tchar: (yyval.rec).typ = mkuchar(); break; case Tshort: (yyval.rec).typ = mkushort(); break; case Tint: (yyval.rec).typ = (yyvsp[-1].typ); break; case Tlong: (yyval.rec).typ = mkulong(); break; case Tllong: (yyval.rec).typ = mkullong(); break; default: semwarn("invalid unsigned type specified"); (yyval.rec).typ = (yyvsp[0].rec).typ; } else if ((yyvsp[-1].typ)->type == Tlong) switch ((yyvsp[0].rec).typ->type) { case Tint: (yyval.rec).typ = (yyvsp[-1].typ); break; case Tlong: (yyval.rec).typ = mkllong(); break; case Tuint: (yyval.rec).typ = mkulong(); break; case Tulong: (yyval.rec).typ = mkullong(); break; case Tdouble: (yyval.rec).typ = mkldouble(); break; default: semwarn("invalid use of 'long'"); (yyval.rec).typ = (yyvsp[0].rec).typ; } else if ((yyvsp[-1].typ)->type == Tulong) switch ((yyvsp[0].rec).typ->type) { case Tint: (yyval.rec).typ = (yyvsp[-1].typ); break; case Tlong: (yyval.rec).typ = mkullong(); break; case Tuint: (yyval.rec).typ = (yyvsp[-1].typ); break; case Tulong: (yyval.rec).typ = mkullong(); break; default: semwarn("invalid use of 'long'"); (yyval.rec).typ = (yyvsp[0].rec).typ; } else if ((yyvsp[0].rec).typ->type == Tint) (yyval.rec).typ = (yyvsp[-1].typ); else semwarn("invalid type specified (missing ';' or type name used as non-type identifier?)"); (yyval.rec).sto = (yyvsp[0].rec).sto; sp->node = (yyval.rec); } #line 3230 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 104: #line 989 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.typ) = mkvoid(); } #line 3236 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 105: #line 990 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.typ) = mkbool(); } #line 3242 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 106: #line 991 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.typ) = mkchar(); } #line 3248 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 107: #line 992 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.typ) = mkwchart(); } #line 3254 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 108: #line 993 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.typ) = mkshort(); } #line 3260 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 109: #line 994 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.typ) = mkint(); } #line 3266 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 110: #line 995 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.typ) = mklong(); } #line 3272 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 111: #line 996 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.typ) = mkllong(); } #line 3278 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 112: #line 997 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.typ) = mkullong(); } #line 3284 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 113: #line 998 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.typ) = mksize(); } #line 3290 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 114: #line 999 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.typ) = mkfloat(); } #line 3296 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 115: #line 1000 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.typ) = mkdouble(); } #line 3302 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 116: #line 1001 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.typ) = mkint(); } #line 3308 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 117: #line 1002 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.typ) = mkuint(); } #line 3314 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 118: #line 1003 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.typ) = mkuchar(); } #line 3320 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 119: #line 1004 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.typ) = mkushort(); } #line 3326 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 120: #line 1005 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.typ) = mkuint(); } #line 3332 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 121: #line 1006 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.typ) = mkulong(); } #line 3338 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 122: #line 1007 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.typ) = mktimet(); } #line 3344 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 123: #line 1009 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if (!(p = entry(templatetable, (yyvsp[0].sym)))) { p = enter(templatetable, (yyvsp[0].sym)); p->info.typ = mktemplate(NULL, (yyvsp[0].sym)); (yyvsp[0].sym)->token = TYPE; } (yyval.typ) = p->info.typ; } #line 3358 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 124: #line 1019 "soapcpp2_yacc.y" /* yacc.c:1667 */ { sym = gensym("_Struct"); sprintf(errbuf, "anonymous class will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(classtable, sym))) { if (p->info.typ->ref || p->info.typ->type != Tclass) { sprintf(errbuf, "class '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } } else { p = enter(classtable, sym); p->info.typ = mkclass(NULL, 0); } sym->token = TYPE; sp->table->sym = sym; p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; p->info.typ->id = sym; (yyval.typ) = p->info.typ; exitscope(); } #line 3388 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 125: #line 1045 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((p = entry(classtable, (yyvsp[-3].e)->sym)) && p->info.typ->ref) { if (is_mutable(p)) { if (merge((Table*)p->info.typ->ref, sp->table)) { sprintf(errbuf, "member name clash in class '%s' declared at %s:%d", (yyvsp[-3].e)->sym->name, p->filename, p->lineno); semerror(errbuf); } p->info.typ->width += sp->offset; } } else { p = reenter(classtable, (yyvsp[-3].e)->sym); p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; p->info.typ->id = p->sym; if (p->info.typ->base) sp->table->prev = (Table*)entry(classtable, p->info.typ->base)->info.typ->ref; } (yyval.typ) = p->info.typ; exitscope(); } #line 3418 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 126: #line 1071 "soapcpp2_yacc.y" /* yacc.c:1667 */ { p = reenter(classtable, (yyvsp[-5].e)->sym); if (!(yyvsp[-3].e)) { semerror("invalid base class"); } else { sp->table->prev = (Table*)(yyvsp[-3].e)->info.typ->ref; if (!sp->table->prev && !(yyvsp[-3].e)->info.typ->transient) { sprintf(errbuf, "class '%s' has incomplete type (if this class is not serializable then declare 'extern class %s')'", (yyvsp[-3].e)->sym->name, (yyvsp[-3].e)->sym->name); semerror(errbuf); } p->info.typ->base = (yyvsp[-3].e)->info.typ->id; } p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; p->info.typ->id = p->sym; (yyval.typ) = p->info.typ; exitscope(); } #line 3445 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 127: #line 1093 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyvsp[0].e)->info.typ->id = (yyvsp[0].e)->sym; (yyval.typ) = (yyvsp[0].e)->info.typ; } #line 3454 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 128: #line 1098 "soapcpp2_yacc.y" /* yacc.c:1667 */ { sym = gensym("_Struct"); sprintf(errbuf, "anonymous struct will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(classtable, sym))) { if (p->info.typ->ref || p->info.typ->type != Tstruct) { sprintf(errbuf, "struct '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; } } else { p = enter(classtable, sym); p->info.typ = mkstruct(sp->table, sp->offset); } sp->table->sym = sym; p->info.typ->id = sym; (yyval.typ) = p->info.typ; exitscope(); } #line 3486 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 129: #line 1126 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((p = entry(classtable, (yyvsp[-3].e)->sym)) && p->info.typ->ref) { if (is_mutable(p)) { if (merge((Table*)p->info.typ->ref, sp->table)) { sprintf(errbuf, "member name clash in struct '%s' declared at %s:%d", (yyvsp[-3].e)->sym->name, p->filename, p->lineno); semerror(errbuf); } p->info.typ->width += sp->offset; } } else { p = reenter(classtable, (yyvsp[-3].e)->sym); p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; p->info.typ->id = p->sym; } (yyval.typ) = p->info.typ; exitscope(); } #line 3514 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 130: #line 1149 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((p = entry(classtable, (yyvsp[0].sym)))) { if (p->info.typ->type == Tstruct) { (yyval.typ) = p->info.typ; } else { sprintf(errbuf, "'struct '%s' redeclaration (line %d)", (yyvsp[0].sym)->name, p->lineno); semerror(errbuf); (yyval.typ) = mkint(); } } else { p = enter(classtable, (yyvsp[0].sym)); (yyval.typ) = p->info.typ = mkstruct(NULL, 0); p->info.typ->id = (yyvsp[0].sym); } } #line 3540 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 131: #line 1171 "soapcpp2_yacc.y" /* yacc.c:1667 */ { sym = gensym("_Union"); sprintf(errbuf, "anonymous union will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(classtable, sym))) { if (p->info.typ->ref) { sprintf(errbuf, "union or struct '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; } } else { p = enter(classtable, sym); p->info.typ = mkunion(sp->table, sp->offset); } sp->table->sym = sym; p->info.typ->id = sym; (yyval.typ) = p->info.typ; exitscope(); } #line 3572 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 132: #line 1199 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((p = entry(classtable, (yyvsp[-3].e)->sym)) && p->info.typ->ref) { if (is_mutable(p)) { if (merge((Table*)p->info.typ->ref, sp->table)) { sprintf(errbuf, "member name clash in union '%s' declared at line %d", (yyvsp[-3].e)->sym->name, p->lineno); semerror(errbuf); } if (p->info.typ->width < sp->offset) p->info.typ->width = sp->offset; } } else { p = reenter(classtable, (yyvsp[-3].e)->sym); p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; p->info.typ->id = p->sym; } (yyval.typ) = p->info.typ; exitscope(); } #line 3601 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 133: #line 1223 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((p = entry(classtable, (yyvsp[0].sym)))) { if (p->info.typ->type == Tunion) { (yyval.typ) = p->info.typ; } else { sprintf(errbuf, "'union %s' redeclaration (line %d)", (yyvsp[0].sym)->name, p->lineno); semerror(errbuf); (yyval.typ) = mkint(); } } else { p = enter(classtable, (yyvsp[0].sym)); (yyval.typ) = p->info.typ = mkunion(NULL, 0); p->info.typ->id = (yyvsp[0].sym); } } #line 3627 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 134: #line 1245 "soapcpp2_yacc.y" /* yacc.c:1667 */ { sym = gensym("_Enum"); sprintf(errbuf, "anonymous enum will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(enumtable, sym))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = 4; /* 4 = enum */ } } else { p = enter(enumtable, sym); p->info.typ = mkenum(sp->table); } p->info.typ->id = sym; (yyval.typ) = p->info.typ; exitscope(); } #line 3658 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 135: #line 1272 "soapcpp2_yacc.y" /* yacc.c:1667 */ { sym = gensym("_Enum"); sprintf(errbuf, "anonymous enum will be named '%s'", sym->name); semwarn(errbuf); if ((p = entry(enumtable, sym))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = 9; /* 9 = mask */ } } else { p = enter(enumtable, sym); p->info.typ = mkmask(sp->table); } p->info.typ->id = sym; (yyval.typ) = p->info.typ; exitscope(); } #line 3689 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 136: #line 1299 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((p = entry(enumtable, (yyvsp[-5].e)->sym))) if (!p->info.typ->ref) p->info.typ->ref = sp->table; p->info.typ->id = (yyvsp[-5].e)->sym; (yyval.typ) = p->info.typ; exitscope(); } #line 3702 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 137: #line 1308 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((p = entry(enumtable, (yyvsp[-5].e)->sym))) if (!p->info.typ->ref) p->info.typ->ref = sp->table; p->info.typ->id = (yyvsp[-5].e)->sym; (yyval.typ) = p->info.typ; exitscope(); } #line 3715 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 138: #line 1317 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((p = entry(enumtable, (yyvsp[-5].e)->sym))) { if (!p->info.typ->ref) { p->info.typ->ref = sp->table; p->info.typ->width = 9; /* 9 = mask */ } } p->info.typ->id = (yyvsp[-5].e)->sym; (yyval.typ) = p->info.typ; exitscope(); } #line 3733 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 139: #line 1331 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((p = entry(enumtable, (yyvsp[-5].e)->sym))) { if (!p->info.typ->ref) { p->info.typ->ref = sp->table; p->info.typ->width = 9; /* 9 = mask */ } } p->info.typ->id = (yyvsp[-5].e)->sym; (yyval.typ) = p->info.typ; exitscope(); } #line 3751 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 140: #line 1344 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((p = entry(enumtable, (yyvsp[0].sym)))) { if (p->info.typ->type != Tenum) { sprintf(errbuf, "'enum %s' used where enum class is expected", (yyvsp[0].sym)->name); semwarn(errbuf); } (yyval.typ) = p->info.typ; } else { p = enter(enumtable, (yyvsp[0].sym)); (yyval.typ) = p->info.typ = mkenum(NULL); p->info.typ->id = (yyvsp[0].sym); } } #line 3773 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 141: #line 1361 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((p = entry(enumtable, (yyvsp[0].sym)))) { if (p->info.typ->type != Tenumsc) { sprintf(errbuf, "'enum class %s' used where enum is expected", (yyvsp[0].sym)->name); semwarn(errbuf); } (yyval.typ) = p->info.typ; } else { p = enter(enumtable, (yyvsp[0].sym)); (yyval.typ) = p->info.typ = mkenumsc(NULL); p->info.typ->id = (yyvsp[0].sym); (yyvsp[0].sym)->token = TYPE; } } #line 3796 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 142: #line 1379 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((p = entry(typetable, (yyvsp[0].sym)))) { (yyval.typ) = p->info.typ; } else if ((p = entry(classtable, (yyvsp[0].sym)))) { (yyval.typ) = p->info.typ; } else if ((p = entry(enumtable, (yyvsp[0].sym)))) { (yyval.typ) = p->info.typ; } else if ((yyvsp[0].sym) == lookup("std::string") || (yyvsp[0].sym) == lookup("std::wstring")) { p = enter(classtable, (yyvsp[0].sym)); (yyval.typ) = p->info.typ = mkclass(NULL, 8); p->info.typ->id = (yyvsp[0].sym); if (cflag) p->info.typ->transient = 1; /* make std::string transient in C */ else p->info.typ->transient = -2; /* otherwise volatile in C++ */ } else { sprintf(errbuf, "unknown type '%s'", (yyvsp[0].sym)->name); semerror(errbuf); (yyval.typ) = mkint(); } } #line 3831 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 143: #line 1410 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((p = entry(templatetable, (yyvsp[-3].sym)))) { (yyval.typ) = mktemplate((yyvsp[-1].rec).typ, (yyvsp[-3].sym)); if (p->info.typ->transient) (yyval.typ)->transient = p->info.typ->transient; } else if ((yyvsp[-3].sym) == lookup("std::deque")) { add_pragma("#include "); p = enter(templatetable, (yyvsp[-3].sym)); (yyval.typ) = p->info.typ = mktemplate((yyvsp[-1].rec).typ, (yyvsp[-3].sym)); } else if ((yyvsp[-3].sym) == lookup("std::list")) { add_pragma("#include "); p = enter(templatetable, (yyvsp[-3].sym)); (yyval.typ) = p->info.typ = mktemplate((yyvsp[-1].rec).typ, (yyvsp[-3].sym)); } else if ((yyvsp[-3].sym) == lookup("std::vector")) { add_pragma("#include "); p = enter(templatetable, (yyvsp[-3].sym)); (yyval.typ) = p->info.typ = mktemplate((yyvsp[-1].rec).typ, (yyvsp[-3].sym)); } else if ((yyvsp[-3].sym) == lookup("std::set")) { add_pragma("#include "); p = enter(templatetable, (yyvsp[-3].sym)); (yyval.typ) = p->info.typ = mktemplate((yyvsp[-1].rec).typ, (yyvsp[-3].sym)); } else if ((yyvsp[-3].sym) == lookup("std::queue")) { add_pragma("#include "); p = enter(templatetable, (yyvsp[-3].sym)); (yyval.typ) = p->info.typ = mktemplate((yyvsp[-1].rec).typ, (yyvsp[-3].sym)); (yyval.typ)->transient = 1; /* not serializable */ } else if ((yyvsp[-3].sym) == lookup("std::stack")) { add_pragma("#include "); p = enter(templatetable, (yyvsp[-3].sym)); (yyval.typ) = p->info.typ = mktemplate((yyvsp[-1].rec).typ, (yyvsp[-3].sym)); (yyval.typ)->transient = 1; /* not serializable */ } else if ((yyvsp[-3].sym) == lookup("std::shared_ptr") || (yyvsp[-3].sym) == lookup("std::unique_ptr") || (yyvsp[-3].sym) == lookup("std::auto_ptr")) { (yyval.typ) = mktemplate((yyvsp[-1].rec).typ, (yyvsp[-3].sym)); (yyval.typ)->transient = -2; /* volatile indicates smart pointer template */ if (!c11flag) semwarn("To use smart pointers you should also use wsdl2h and soapcpp2 with option -c++11 or -c++14"); } else if ((yyvsp[-3].sym) == lookup("std::weak_ptr") || (yyvsp[-3].sym) == lookup("std::function")) { (yyval.typ) = mktemplate((yyvsp[-1].rec).typ, (yyvsp[-3].sym)); (yyval.typ)->transient = 1; /* not serializable */ } else { semerror("undefined template"); (yyval.typ) = mkint(); } } #line 3902 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 144: #line 1477 "soapcpp2_yacc.y" /* yacc.c:1667 */ { sprintf(errbuf, "undeclared '%s'", (yyvsp[-1].sym)->name); synerror(errbuf); (yyval.typ) = mkint(); } #line 3912 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 145: #line 1482 "soapcpp2_yacc.y" /* yacc.c:1667 */ { sprintf(errbuf, "perhaps trying to use a template with an undefined type parameter '%s'?", (yyvsp[-1].sym)->name); synerror(errbuf); (yyval.typ) = mkint(); } #line 3922 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 146: #line 1487 "soapcpp2_yacc.y" /* yacc.c:1667 */ { synerror("perhaps trying to use an undefined template or template with a non-type template parameter? Declare 'template class name'"); (yyval.typ) = mkint(); } #line 3931 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 147: #line 1492 "soapcpp2_yacc.y" /* yacc.c:1667 */ { synerror("malformed class definition (use spacing around ':' to separate derived : base)"); yyerrok; (yyval.typ) = mkint(); } #line 3941 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 148: #line 1498 "soapcpp2_yacc.y" /* yacc.c:1667 */ { synerror("malformed struct definition"); yyerrok; (yyval.typ) = mkint(); } #line 3951 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 149: #line 1504 "soapcpp2_yacc.y" /* yacc.c:1667 */ { synerror("malformed union definition"); yyerrok; (yyval.typ) = mkint(); } #line 3961 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 150: #line 1510 "soapcpp2_yacc.y" /* yacc.c:1667 */ { synerror("malformed enum definition"); yyerrok; (yyval.typ) = mkint(); } #line 3971 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 151: #line 1516 "soapcpp2_yacc.y" /* yacc.c:1667 */ { sp->table->sym = (yyvsp[-1].e)->sym; (yyval.e) = (yyvsp[-1].e); } #line 3980 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 152: #line 1521 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((p = entry(classtable, (yyvsp[0].sym)))) { if (p->info.typ->ref) { if (!is_mutable(p)) { sprintf(errbuf, "struct '%s' already declared at %s:%d", (yyvsp[0].sym)->name, p->filename, p->lineno); semerror(errbuf); } } else { p = reenter(classtable, (yyvsp[0].sym)); } p->info.typ->transient = transient; } else { p = enter(classtable, (yyvsp[0].sym)); p->info.typ = mkstruct(NULL, 0); } (yyval.e) = p; } #line 4009 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 153: #line 1546 "soapcpp2_yacc.y" /* yacc.c:1667 */ { sp->table->sym = (yyvsp[-1].e)->sym; (yyval.e) = (yyvsp[-1].e); } #line 4018 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 154: #line 1551 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((p = entry(classtable, (yyvsp[0].sym)))) { if (p->info.typ->ref) { if (!is_mutable(p)) { sprintf(errbuf, "class '%s' already declared at %s:%d (redundant 'class' specifier here?)", (yyvsp[0].sym)->name, p->filename, p->lineno); semerror(errbuf); } } else { p = reenter(classtable, (yyvsp[0].sym)); } p->info.typ->transient = transient; } else { p = enter(classtable, (yyvsp[0].sym)); p->info.typ = mkclass(NULL, 0); p->info.typ->id = p->sym; } (yyvsp[0].sym)->token = TYPE; (yyval.e) = p; } #line 4049 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 155: #line 1578 "soapcpp2_yacc.y" /* yacc.c:1667 */ { sp->table->sym = (yyvsp[-1].e)->sym; (yyval.e) = (yyvsp[-1].e); } #line 4058 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 156: #line 1583 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((p = entry(classtable, (yyvsp[0].sym)))) { if (p->info.typ->ref) { if (!is_mutable(p)) { sprintf(errbuf, "union '%s' already declared at %s:%d", (yyvsp[0].sym)->name, p->filename, p->lineno); semerror(errbuf); } } else { p = reenter(classtable, (yyvsp[0].sym)); } p->info.typ->transient = transient; } else { p = enter(classtable, (yyvsp[0].sym)); p->info.typ = mkunion(NULL, 0); } (yyval.e) = p; } #line 4087 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 157: #line 1608 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((p = entry(enumtable, (yyvsp[-1].sym)))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", (yyvsp[-1].sym)->name, p->filename, p->lineno); semerror(errbuf); } } else { p = enter(enumtable, (yyvsp[-1].sym)); p->info.typ = mkenum(0); } p->info.typ->width = (int)(yyvsp[0].i); (yyval.e) = p; } #line 4109 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 158: #line 1626 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((p = entry(enumtable, (yyvsp[-1].sym)))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", (yyvsp[-1].sym)->name, p->filename, p->lineno); semerror(errbuf); } } else { p = enter(enumtable, (yyvsp[-1].sym)); p->info.typ = mkenumsc(0); } p->info.typ->width = (int)(yyvsp[0].i); (yyvsp[-1].sym)->token = TYPE; (yyval.e) = p; } #line 4132 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 159: #line 1646 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((p = entry(enumtable, (yyvsp[-1].sym)))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", (yyvsp[-1].sym)->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ = mkmask(0); } } else { p = enter(enumtable, (yyvsp[-1].sym)); p->info.typ = mkmask(0); } (yyval.e) = p; } #line 4157 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 160: #line 1668 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((p = entry(enumtable, (yyvsp[-1].sym)))) { if (p->info.typ->ref) { sprintf(errbuf, "enum '%s' already declared at %s:%d", (yyvsp[-1].sym)->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ = mkmasksc(0); } } else { p = enter(enumtable, (yyvsp[-1].sym)); p->info.typ = mkmasksc(0); } (yyvsp[-1].sym)->token = TYPE; (yyval.e) = p; } #line 4183 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 161: #line 1690 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = (yyvsp[0].sym); if (!c11flag) semwarn("To use scoped enumerations (enum class) you should also use wsdl2h and soapcpp2 with option -c++11 or -c++14"); } #line 4193 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 162: #line 1695 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sym) = (yyvsp[0].sym); if (!c11flag) semwarn("To use scoped enumerations (enum class) you must also use wsdl2h and soapcpp2 with option -c++11 or -c++14"); } #line 4203 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 163: #line 1701 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.i) = 1; } #line 4209 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 164: #line 1702 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.i) = 4; } #line 4215 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 165: #line 1703 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.i) = 2; } #line 4221 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 166: #line 1704 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.i) = 4; } #line 4227 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 167: #line 1705 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.i) = 4; } #line 4233 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 168: #line 1706 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.i) = 8; } #line 4239 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 169: #line 1707 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.i) = 4; p = entry(typetable, (yyvsp[0].sym)); if (!p) p = entry(enumtable, (yyvsp[0].sym)); if (!p) semerror("enum underlying type must be one of int8_t, int16_t, int32_t, int64_t"); else (yyval.i) = p->info.typ->width; } #line 4254 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 170: #line 1717 "soapcpp2_yacc.y" /* yacc.c:1667 */ { semerror("enum underlying type must be one of int8_t, int16_t, int32_t, int64_t"); (yyval.i) = 4; } #line 4263 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 171: #line 1721 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.i) = 4; /* 4 = enum */ } #line 4269 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 172: #line 1723 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 4275 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 173: #line 1724 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 4281 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 174: #line 1725 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 4287 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 175: #line 1728 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.e) = (yyvsp[0].e); } #line 4293 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 176: #line 1729 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.e) = (yyvsp[0].e); } #line 4299 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 177: #line 1730 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.e) = (yyvsp[0].e); } #line 4305 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 178: #line 1731 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.e) = entry(classtable, (yyvsp[0].sym)); if (!(yyval.e)) { p = entry(typetable, (yyvsp[0].sym)); if (p && (p->info.typ->type == Tclass || p->info.typ->type == Tstruct)) (yyval.e) = p; } } #line 4319 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 179: #line 1740 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.e) = entry(classtable, (yyvsp[0].sym)); } #line 4325 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 180: #line 1741 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.e) = entry(classtable, (yyvsp[0].sym)); } #line 4331 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 181: #line 1743 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if (transient <= -2) transient = 0; permission = 0; enterscope(mktable(NULL), 0); sp->entry = NULL; } #line 4343 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 182: #line 1751 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if (transient <= -2) transient = 0; permission = 0; enterscope(mktable(NULL), 0); sp->entry = NULL; sp->grow = False; } #line 4356 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 183: #line 1760 "soapcpp2_yacc.y" /* yacc.c:1667 */ { enterscope(mktable(NULL), 0); sp->entry = NULL; sp->mask = True; sp->val = 1; } #line 4367 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 184: #line 1767 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 4373 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 185: #line 1768 "soapcpp2_yacc.y" /* yacc.c:1667 */ { } #line 4379 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 186: #line 1770 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if (sp->table->level == INTERNAL) transient |= 1; permission = 0; enterscope(mktable(NULL), 0); sp->entry = NULL; sp->table->level = PARAM; } #line 4392 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 187: #line 1779 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sto) = Sauto; } #line 4398 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 188: #line 1780 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sto) = Sregister; } #line 4404 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 189: #line 1781 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sto) = Sstatic; } #line 4410 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 190: #line 1782 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sto) = Sexplicit; } #line 4416 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 191: #line 1783 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sto) = Sextern; transient = 1; } #line 4422 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 192: #line 1784 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sto) = Stypedef; } #line 4428 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 193: #line 1785 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sto) = Svirtual; } #line 4434 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 194: #line 1786 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sto) = Sconst; } #line 4440 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 195: #line 1787 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sto) = Sfinal; } #line 4446 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 196: #line 1788 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sto) = Soverride; } #line 4452 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 197: #line 1789 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sto) = Sfriend; } #line 4458 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 198: #line 1790 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sto) = Sinline; } #line 4464 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 199: #line 1792 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sto) = SmustUnderstand; } #line 4470 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 200: #line 1793 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sto) = Sreturn; } #line 4476 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 201: #line 1794 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sto) = Sattribute; if (eflag) semwarn("SOAP RPC encoding does not support XML attributes"); } #line 4486 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 202: #line 1799 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sto) = Sspecial; } #line 4492 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 203: #line 1800 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sto) = Sextern; transient = -2; } #line 4498 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 204: #line 1801 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sto) = Smutable; transient = -4; } #line 4504 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 205: #line 1803 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sto) = Snone; } #line 4510 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 206: #line 1804 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sto) = (Storage)((int)(yyvsp[-1].sto) | (int)Sconstobj); } #line 4516 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 207: #line 1805 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sto) = (Storage)((int)(yyvsp[-1].sto) | (int)Sfinal); } #line 4522 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 208: #line 1807 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sto) = (Storage)((int)(yyvsp[-1].sto) | (int)Soverride); } #line 4528 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 209: #line 1809 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sto) = Snone; } #line 4534 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 210: #line 1810 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sto) = Sabstract; } #line 4540 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 211: #line 1812 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sto) = Snone; } #line 4546 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 212: #line 1813 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.sto) = Svirtual; } #line 4552 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 213: #line 1815 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = tmp = sp->node; } #line 4558 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 214: #line 1816 "soapcpp2_yacc.y" /* yacc.c:1667 */ { /* handle const pointers, such as const char* */ if (((int)tmp.sto & (int)Sconst)) tmp.sto = (Storage)(((int)tmp.sto & ~(int)Sconst) | (int)Sconstptr); tmp.typ = mkpointer(tmp.typ); tmp.typ->transient = transient; (yyval.rec) = tmp; } #line 4571 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 215: #line 1824 "soapcpp2_yacc.y" /* yacc.c:1667 */ { tmp.typ = mkreference(tmp.typ); tmp.typ->transient = transient; (yyval.rec) = tmp; } #line 4581 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 216: #line 1829 "soapcpp2_yacc.y" /* yacc.c:1667 */ { tmp.typ = mkrvalueref(tmp.typ); tmp.typ->transient = transient; (yyval.rec) = tmp; } #line 4591 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 217: #line 1835 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = tmp; } #line 4597 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 218: #line 1837 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if (!bflag && (yyvsp[0].rec).typ->type == Tchar) { sprintf(errbuf, "char[" SOAP_LONG_FORMAT "] will be serialized as an array of " SOAP_LONG_FORMAT " bytes: use soapcpp2 option -b to enable char[] string serialization or use char* for strings", (yyvsp[-2].rec).val.i, (yyvsp[-2].rec).val.i); semwarn(errbuf); } if ((yyvsp[-2].rec).hasval && (yyvsp[-2].rec).typ->type == Tint && (yyvsp[-2].rec).val.i > 0 && (yyvsp[0].rec).typ->width > 0) { (yyval.rec).typ = mkarray((yyvsp[0].rec).typ, (int) (yyvsp[-2].rec).val.i * (yyvsp[0].rec).typ->width); } else { (yyval.rec).typ = mkarray((yyvsp[0].rec).typ, 0); semerror("undetermined array size"); } (yyval.rec).sto = (yyvsp[0].rec).sto; } #line 4619 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 219: #line 1854 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).typ = mkpointer((yyvsp[0].rec).typ); /* zero size array = pointer */ (yyval.rec).sto = (yyvsp[0].rec).sto; } #line 4628 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 220: #line 1859 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((yyvsp[0].rec).typ->type == Tstruct || (yyvsp[0].rec).typ->type == Tclass) { if (!(yyvsp[0].rec).typ->ref && !(yyvsp[0].rec).typ->transient && !((int)(yyvsp[0].rec).sto & (int)Stypedef)) { if ((yyvsp[0].rec).typ->type == Tstruct) sprintf(errbuf, "struct '%s' has incomplete type (if this struct is not serializable then declare 'extern struct %s')", (yyvsp[0].rec).typ->id->name, (yyvsp[0].rec).typ->id->name); else sprintf(errbuf, "class '%s' has incomplete type (if this class is not serializable then declare 'extern class %s')", (yyvsp[0].rec).typ->id->name, (yyvsp[0].rec).typ->id->name); semerror(errbuf); } } (yyval.rec) = (yyvsp[0].rec); } #line 4647 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 221: #line 1874 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = (yyvsp[0].rec); } #line 4653 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 222: #line 1875 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((yyvsp[-1].rec).hasval) { (yyval.rec).typ = (yyvsp[-1].rec).typ; (yyval.rec).hasval = True; (yyval.rec).fixed = False; (yyval.rec).val = (yyvsp[-1].rec).val; } else { (yyval.rec).hasval = False; semerror("initialization expression not constant"); } } #line 4672 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 223: #line 1890 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).hasval = False; (yyval.rec).fixed = False; } #line 4681 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 224: #line 1894 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((yyvsp[0].rec).hasval) { (yyval.rec).typ = (yyvsp[0].rec).typ; (yyval.rec).hasval = True; (yyval.rec).fixed = False; (yyval.rec).val = (yyvsp[0].rec).val; } else { (yyval.rec).hasval = False; semerror("initialization expression not constant"); } } #line 4700 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 225: #line 1908 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((yyvsp[0].rec).hasval) { (yyval.rec).typ = (yyvsp[0].rec).typ; (yyval.rec).hasval = True; (yyval.rec).fixed = True; (yyval.rec).val = (yyvsp[0].rec).val; } else { (yyval.rec).hasval = False; semerror("initialization expression not constant"); } } #line 4719 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 226: #line 1923 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.s) = NULL; } #line 4725 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 227: #line 1924 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.s) = (yyvsp[0].s); } #line 4731 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 228: #line 1926 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = 1; (yyval.rec).hasmin = False; (yyval.rec).hasmax = False; (yyval.rec).imin = 0; (yyval.rec).imax = 0; (yyval.rec).rmin = 0.0; (yyval.rec).rmax = 0.0; (yyval.rec).incmin = True; (yyval.rec).incmax = True; (yyval.rec).nillable = (yyvsp[0].i); (yyval.rec).pattern = NULL; } #line 4750 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 229: #line 1940 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).minOccurs = (yyvsp[0].i); (yyval.rec).maxOccurs = 1; if ((yyval.rec).minOccurs < 0) (yyval.rec).minOccurs = -1; (yyval.rec).hasmin = False; (yyval.rec).hasmax = False; (yyval.rec).imin = 0; (yyval.rec).imax = 0; (yyval.rec).rmin = 0.0; (yyval.rec).rmax = 0.0; (yyval.rec).incmin = True; (yyval.rec).incmax = True; (yyval.rec).nillable = (yyvsp[-1].i); (yyval.rec).pattern = NULL; } #line 4771 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 230: #line 1957 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).minOccurs = (yyvsp[-1].i); (yyval.rec).maxOccurs = 1; if ((yyval.rec).minOccurs < 0) (yyval.rec).minOccurs = -1; (yyval.rec).hasmin = False; (yyval.rec).hasmax = False; (yyval.rec).imin = 0; (yyval.rec).imax = 0; (yyval.rec).rmin = 0.0; (yyval.rec).rmax = 0.0; (yyval.rec).incmin = True; (yyval.rec).incmax = True; (yyval.rec).nillable = (yyvsp[-2].i); (yyval.rec).pattern = NULL; } #line 4792 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 231: #line 1974 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).minOccurs = (yyvsp[-2].i); (yyval.rec).maxOccurs = (yyvsp[0].i); if ((yyval.rec).minOccurs < 0 || (yyval.rec).maxOccurs < 0) { (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = 1; } else if ((yyval.rec).minOccurs > (yyval.rec).maxOccurs) { (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = 1; } (yyval.rec).hasmin = False; (yyval.rec).hasmax = False; (yyval.rec).imin = 0; (yyval.rec).imax = 0; (yyval.rec).rmin = 0.0; (yyval.rec).rmax = 0.0; (yyval.rec).incmin = True; (yyval.rec).incmax = True; (yyval.rec).nillable = (yyvsp[-3].i); (yyval.rec).pattern = NULL; } #line 4821 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 232: #line 1999 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = (yyvsp[0].i); if ((yyval.rec).maxOccurs < 0) { (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = 1; } (yyval.rec).hasmin = False; (yyval.rec).hasmax = False; (yyval.rec).imin = 0; (yyval.rec).imax = 0; (yyval.rec).rmin = 0.0; (yyval.rec).rmax = 0.0; (yyval.rec).incmin = True; (yyval.rec).incmax = True; (yyval.rec).nillable = (yyvsp[-2].i); (yyval.rec).pattern = NULL; } #line 4845 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 233: #line 2020 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).hasmin = False; (yyval.rec).hasmax = False; (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = 1; (yyval.rec).imin = 0; (yyval.rec).imax = 0; (yyval.rec).rmin = 0.0; (yyval.rec).rmax = 0.0; (yyval.rec).incmin = True; (yyval.rec).incmax = True; (yyval.rec).nillable = (yyvsp[-1].i); (yyval.rec).pattern = (yyvsp[0].s); } #line 4864 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 234: #line 2035 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).hasmin = True; (yyval.rec).hasmax = False; (yyval.rec).incmin = (yyvsp[0].rec).incmin; (yyval.rec).incmax = (yyvsp[0].rec).incmax; (yyval.rec).minOccurs = (yyvsp[-1].ir).i; (yyval.rec).maxOccurs = 1; if ((yyval.rec).minOccurs < 0) (yyval.rec).minOccurs = -1; (yyval.rec).imin = (yyvsp[-1].ir).i; (yyval.rec).imax = 0; (yyval.rec).rmin = (yyvsp[-1].ir).r; (yyval.rec).rmax = 0.0; (yyval.rec).nillable = (yyvsp[-3].i); (yyval.rec).pattern = (yyvsp[-2].s); } #line 4885 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 235: #line 2052 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).hasmin = True; (yyval.rec).hasmax = True; (yyval.rec).incmin = (yyvsp[-1].rec).incmin; (yyval.rec).incmax = (yyvsp[-1].rec).incmax; (yyval.rec).minOccurs = (yyvsp[-2].ir).i; (yyval.rec).maxOccurs = (yyvsp[0].ir).i; if ((yyval.rec).minOccurs < 0 || (yyval.rec).maxOccurs < 0) { (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = 1; } else if ((yyval.rec).minOccurs > (yyval.rec).maxOccurs) { (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = 1; } (yyval.rec).imin = (yyvsp[-2].ir).i; (yyval.rec).imax = (yyvsp[0].ir).i; (yyval.rec).rmin = (yyvsp[-2].ir).r; (yyval.rec).rmax = (yyvsp[0].ir).r; (yyval.rec).nillable = (yyvsp[-4].i); (yyval.rec).pattern = (yyvsp[-3].s); } #line 4914 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 236: #line 2076 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).hasmin = False; (yyval.rec).hasmax = True; (yyval.rec).incmin = (yyvsp[-1].rec).incmin; (yyval.rec).incmax = (yyvsp[-1].rec).incmax; (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = (yyvsp[0].ir).i; if ((yyval.rec).maxOccurs < 0) { (yyval.rec).minOccurs = -1; (yyval.rec).maxOccurs = 1; } (yyval.rec).imin = 0; (yyval.rec).imax = (yyvsp[0].ir).i; (yyval.rec).rmin = 0.0; (yyval.rec).rmax = (yyvsp[0].ir).r; (yyval.rec).nillable = (yyvsp[-3].i); (yyval.rec).pattern = (yyvsp[-2].s); } #line 4938 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 237: #line 2096 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.i) = zflag >= 1 && zflag <= 3; /* False, unless version 2.8.30 or earlier */ } #line 4944 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 238: #line 2097 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.i) = True; } #line 4950 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 239: #line 2099 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.s) = NULL; } #line 4956 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 240: #line 2100 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.s) = (yyvsp[0].s); } #line 4962 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 241: #line 2102 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.ir).i = (LONG64)((yyval.ir).r = (yyvsp[0].r)); } #line 4968 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 242: #line 2103 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.ir).r = (double)((yyval.ir).i = (yyvsp[0].i)); } #line 4974 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 243: #line 2104 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.ir).r = (double)((yyval.ir).i = (yyvsp[0].c)); } #line 4980 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 244: #line 2105 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.ir).i = +(yyvsp[0].ir).i; (yyval.ir).r = +(yyvsp[0].ir).r; } #line 4986 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 245: #line 2106 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.ir).i = -(yyvsp[0].ir).i; (yyval.ir).r = -(yyvsp[0].ir).r; } #line 4992 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 246: #line 2108 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).incmin = (yyval.rec).incmax = True; } #line 4998 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 247: #line 2109 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).incmin = (yyval.rec).incmax = True; } #line 5004 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 248: #line 2110 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).incmin = False; (yyval.rec).incmax = True; } #line 5010 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 249: #line 2111 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).incmin = False; (yyval.rec).incmax = True; } #line 5016 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 250: #line 2113 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).incmin = (yyval.rec).incmax = True; } #line 5022 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 251: #line 2114 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).incmin = False; (yyval.rec).incmax = True; } #line 5028 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 252: #line 2115 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).incmin = True; (yyval.rec).incmax = False; } #line 5034 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 253: #line 2116 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).incmin = False; (yyval.rec).incmax = False; } #line 5040 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 254: #line 2117 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).incmin = False; (yyval.rec).incmax = False; } #line 5046 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 255: #line 2119 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).incmin = (yyval.rec).incmax = True; } #line 5052 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 256: #line 2120 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).incmin = True; (yyval.rec).incmax = False; } #line 5058 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 257: #line 2121 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).incmin = True; (yyval.rec).incmax = False; } #line 5064 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 258: #line 2130 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = (yyvsp[0].rec); } #line 5070 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 259: #line 2131 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = (yyvsp[0].rec); } #line 5076 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 260: #line 2135 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).typ = (yyvsp[-2].rec).typ; (yyval.rec).sto = Snone; (yyval.rec).hasval = False; } #line 5086 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 262: #line 2143 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = (yyvsp[0].rec); } #line 5092 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 263: #line 2146 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).hasval = False; (yyval.rec).typ = mkint(); } #line 5101 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 264: #line 2150 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = (yyvsp[0].rec); } #line 5107 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 265: #line 2152 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = (yyvsp[0].rec); } #line 5113 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 266: #line 2155 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).hasval = False; (yyval.rec).typ = mkint(); } #line 5121 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 267: #line 2158 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = (yyvsp[0].rec); } #line 5127 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 268: #line 2160 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = (yyvsp[0].rec); } #line 5133 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 269: #line 2163 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = iop("|", (yyvsp[-2].rec), (yyvsp[0].rec)); } #line 5139 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 270: #line 2164 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = iop("^", (yyvsp[-2].rec), (yyvsp[0].rec)); } #line 5145 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 271: #line 2165 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = iop("&", (yyvsp[-2].rec), (yyvsp[0].rec)); } #line 5151 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 272: #line 2166 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = relop("==", (yyvsp[-2].rec), (yyvsp[0].rec)); } #line 5157 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 273: #line 2167 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = relop("!=", (yyvsp[-2].rec), (yyvsp[0].rec)); } #line 5163 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 274: #line 2168 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = relop("<", (yyvsp[-2].rec), (yyvsp[0].rec)); } #line 5169 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 275: #line 2169 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = relop("<=", (yyvsp[-2].rec), (yyvsp[0].rec)); } #line 5175 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 276: #line 2170 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = relop(">", (yyvsp[-2].rec), (yyvsp[0].rec)); } #line 5181 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 277: #line 2171 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = relop(">=", (yyvsp[-2].rec), (yyvsp[0].rec)); } #line 5187 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 278: #line 2172 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = iop("<<", (yyvsp[-2].rec), (yyvsp[0].rec)); } #line 5193 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 279: #line 2173 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = iop(">>", (yyvsp[-2].rec), (yyvsp[0].rec)); } #line 5199 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 280: #line 2174 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = op("+", (yyvsp[-2].rec), (yyvsp[0].rec)); } #line 5205 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 281: #line 2175 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = op("-", (yyvsp[-2].rec), (yyvsp[0].rec)); } #line 5211 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 282: #line 2176 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = op("*", (yyvsp[-2].rec), (yyvsp[0].rec)); } #line 5217 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 283: #line 2177 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = op("/", (yyvsp[-2].rec), (yyvsp[0].rec)); } #line 5223 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 284: #line 2178 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = iop("%", (yyvsp[-2].rec), (yyvsp[0].rec)); } #line 5229 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 285: #line 2179 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = (yyvsp[0].rec); } #line 5235 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 286: #line 2182 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((yyvsp[0].rec).hasval) (yyval.rec).val.i = !(yyvsp[0].rec).val.i; (yyval.rec).typ = (yyvsp[0].rec).typ; (yyval.rec).hasval = (yyvsp[0].rec).hasval; } #line 5246 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 287: #line 2188 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((yyvsp[0].rec).hasval) (yyval.rec).val.i = ~(yyvsp[0].rec).val.i; (yyval.rec).typ = (yyvsp[0].rec).typ; (yyval.rec).hasval = (yyvsp[0].rec).hasval; } #line 5257 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 288: #line 2194 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((yyvsp[0].rec).hasval) { if (integer((yyvsp[0].rec).typ)) (yyval.rec).val.i = -(yyvsp[0].rec).val.i; else if (real((yyvsp[0].rec).typ)) (yyval.rec).val.r = -(yyvsp[0].rec).val.r; else typerror("string?"); } (yyval.rec).typ = (yyvsp[0].rec).typ; (yyval.rec).hasval = (yyvsp[0].rec).hasval; } #line 5275 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 289: #line 2207 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = (yyvsp[0].rec); } #line 5281 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 290: #line 2208 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if ((yyvsp[0].rec).typ->type == Tpointer) (yyval.rec).typ = (Tnode*)(yyvsp[0].rec).typ->ref; else { typerror("dereference of non-pointer type"); (yyval.rec).typ = (yyvsp[0].rec).typ; } (yyval.rec).sto = Snone; (yyval.rec).hasval = False; } #line 5297 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 291: #line 2219 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).typ = mkpointer((yyvsp[0].rec).typ); (yyval.rec).sto = Snone; (yyval.rec).hasval = False; } #line 5307 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 292: #line 2225 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).hasval = True; (yyval.rec).fixed = False; (yyval.rec).typ = mkint(); (yyval.rec).val.i = (yyvsp[-1].rec).typ->width; } #line 5318 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 293: #line 2231 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = (yyvsp[0].rec); } #line 5324 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 294: #line 2234 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec) = (yyvsp[-1].rec); } #line 5330 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 295: #line 2235 "soapcpp2_yacc.y" /* yacc.c:1667 */ { if (!(p = enumentry((yyvsp[0].sym)))) p = undefined((yyvsp[0].sym)); else (yyval.rec).hasval = True; (yyval.rec).fixed = False; (yyval.rec).typ = p->info.typ; (yyval.rec).val = p->info.val; } #line 5344 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 296: #line 2244 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).typ = mkint(); (yyval.rec).hasval = True; (yyval.rec).fixed = False; (yyval.rec).val.i = (yyvsp[0].i); } #line 5355 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 297: #line 2250 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).typ = mkfloat(); (yyval.rec).hasval = True; (yyval.rec).fixed = False; (yyval.rec).val.r = (yyvsp[0].r); } #line 5366 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 298: #line 2256 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).typ = mkchar(); (yyval.rec).hasval = True; (yyval.rec).fixed = False; (yyval.rec).val.i = (yyvsp[0].c); } #line 5377 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 299: #line 2262 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).typ = mkstring(); (yyval.rec).hasval = True; (yyval.rec).fixed = False; (yyval.rec).val.s = (yyvsp[0].s); } #line 5388 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 300: #line 2268 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).typ = mkbool(); (yyval.rec).hasval = True; (yyval.rec).fixed = False; (yyval.rec).val.i = 0; } #line 5399 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; case 301: #line 2274 "soapcpp2_yacc.y" /* yacc.c:1667 */ { (yyval.rec).typ = mkbool(); (yyval.rec).hasval = True; (yyval.rec).fixed = False; (yyval.rec).val.i = 1; } #line 5410 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ break; #line 5414 "soapcpp2_yacc.tab.c" /* yacc.c:1667 */ default: break; } /* User semantic actions sometimes alter yychar, and that requires that yytoken be updated with the new translation. We take the approach of translating immediately before every use of yytoken. One alternative is translating here after every semantic action, but that translation would be missed if the semantic action invokes YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an incorrect destructor might then be invoked immediately. In the case of YYERROR or YYBACKUP, subsequent parser actions might lead to an incorrect destructor call or verbose syntax error message before the lookahead is translated. */ YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now 'shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ { const int yylhs = yyr1[yyn] - YYNTOKENS; const int yyi = yypgoto[yylhs] + *yyssp; yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp ? yytable[yyi] : yydefgoto[yylhs]); } goto yynewstate; /*--------------------------------------. | yyerrlab -- here on detecting error. | `--------------------------------------*/ yyerrlab: /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (YY_("syntax error")); #else # define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ yyssp, yytoken) { char const *yymsgp = YY_("syntax error"); int yysyntax_error_status; yysyntax_error_status = YYSYNTAX_ERROR; if (yysyntax_error_status == 0) yymsgp = yymsg; else if (yysyntax_error_status == 1) { if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc); if (!yymsg) { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; yysyntax_error_status = 2; } else { yysyntax_error_status = YYSYNTAX_ERROR; yymsgp = yymsg; } } yyerror (yymsgp); if (yysyntax_error_status == 2) goto yyexhaustedlab; } # undef YYSYNTAX_ERROR #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse lookahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval); yychar = YYEMPTY; } } /* Else will try to reuse lookahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (0) YYERROR; /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (!yypact_value_is_default (yyn)) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; YY_IGNORE_MAYBE_UNINITIALIZED_END /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #if !defined yyoverflow || YYERROR_VERBOSE /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif /*-----------------------------------------------------. | yyreturn -- parsing is finished, return the result. | `-----------------------------------------------------*/ yyreturn: if (yychar != YYEMPTY) { /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = YYTRANSLATE (yychar); yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval); } /* Do not reclaim the symbols of the rule whose action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif return yyresult; } #line 2282 "soapcpp2_yacc.y" /* yacc.c:1918 */ int yywrap(void) { return 1; } /**************************************\ Support routines \**************************************/ static Node op(const char *op, Node p, Node q) { Node r; r.typ = p.typ; r.sto = Snone; if (p.hasval && q.hasval) { if (integer(p.typ) && integer(q.typ)) switch (op[0]) { case '|': r.val.i = p.val.i | q.val.i; break; case '^': r.val.i = p.val.i ^ q.val.i; break; case '&': r.val.i = p.val.i & q.val.i; break; case '<': r.val.i = p.val.i << q.val.i; break; case '>': r.val.i = p.val.i >> q.val.i; break; case '+': r.val.i = p.val.i + q.val.i; break; case '-': r.val.i = p.val.i - q.val.i; break; case '*': r.val.i = p.val.i * q.val.i; break; case '/': r.val.i = q.val.i != 0 ? p.val.i / q.val.i : 0; break; case '%': r.val.i = q.val.i != 0 ? p.val.i % q.val.i : 0; break; default: typerror(op); } else if (real(p.typ) && real(q.typ)) switch (op[0]) { case '+': r.val.r = p.val.r + q.val.r; break; case '-': r.val.r = p.val.r - q.val.r; break; case '*': r.val.r = p.val.r * q.val.r; break; case '/': r.val.r = q.val.r != 0 ? p.val.r / q.val.r : 0.0; break; default: typerror(op); } else semerror("invalid constant operation"); r.hasval = True; r.fixed = False; } else { r.typ = mgtype(p.typ, q.typ); r.hasval = False; } return r; } static Node iop(const char *iop, Node p, Node q) { if (integer(p.typ) && integer(q.typ)) return op(iop, p, q); typerror("integer operands only"); return p; } static Node relop(const char *op, Node p, Node q) { Node r; r.typ = mkint(); r.sto = Snone; r.hasval = True; r.fixed = False; r.val.i = 1; sprintf(errbuf, "comparison '%s' not evaluated and considered true", op); semwarn(errbuf); if (p.typ->type != Tpointer || p.typ != q.typ) r.typ = mgtype(p.typ, q.typ); return r; } /**************************************\ Scope management \**************************************/ /* mkscope - initialize scope stack with a new table and offset */ static void mkscope(Table *table, int offset) { sp = stack-1; enterscope(table, offset); } /* enterscope - enter a new scope by pushing a new table and offset on the stack */ static void enterscope(Table *table, int offset) { if (++sp == stack + MAXNEST) execerror("maximum scope nesting depth exceeded"); sp->table = table; sp->entry = NULL; sp->node.typ = mkint(); sp->node.sto = Snone; sp->val = 0; sp->offset = offset; sp->grow = True; /* by default, offset grows */ sp->mask = False; } /* exitscope - exit a scope by popping the table and offset from the stack */ static void exitscope(void) { check(sp-- != stack, "exitscope() has no matching enterscope()"); } /**************************************\ Undefined symbol \**************************************/ static Entry* undefined(Symbol *sym) { Entry *p; sprintf(errbuf, "undefined identifier '%s'", sym->name); semwarn(errbuf); p = enter(sp->table, sym); p->level = GLOBAL; p->info.typ = mkint(); p->info.sto = Sextern; p->info.hasval = False; return p; } /* mgtype - return most general type among two numerical types */ Tnode* mgtype(Tnode *typ1, Tnode *typ2) { if (numeric(typ1) && numeric(typ2)) { if (typ1->type < typ2->type) return typ2; } else { typerror("non-numeric type"); } return typ1; } /**************************************\ Type checks \**************************************/ static int integer(Tnode *typ) { switch (typ->type) { case Tchar: case Tshort: case Tint: case Tlong: return True; default: break; } return False; } static int real(Tnode *typ) { switch (typ->type) { case Tfloat: case Tdouble: case Tldouble: return True; default: break; } return False; } static int numeric(Tnode *typ) { return integer(typ) || real(typ); } static void set_value(Entry *p, Tnode *t, Node *n) { p->info.hasval = True; p->info.ptrval = False; p->info.fixed = n->fixed; if (is_smart(t) || (t->type == Tpointer && !is_string(t) && !is_wstring(t))) { p->info.hasval = False; p->info.ptrval = True; t = t->ref; } switch (t->type) { case Tchar: case Tuchar: case Tshort: case Tushort: case Tint: case Tuint: case Tlong: case Tulong: case Tllong: case Tullong: case Tenum: case Tenumsc: case Ttime: case Tsize: if (n->typ->type == Tint || n->typ->type == Tchar || n->typ->type == Tenum || n->typ->type == Tenumsc) { sp->val = p->info.val.i = n->val.i; if ((t->hasmin && t->imin > n->val.i) || (t->hasmin && !t->incmin && t->imin == n->val.i) || (t->hasmax && t->imax < n->val.i) || (t->hasmax && !t->incmax && t->imax == n->val.i)) semerror("initialization constant outside value range"); } else { semerror("type error in initialization constant"); p->info.hasval = False; p->info.ptrval = False; } break; case Tfloat: case Tdouble: case Tldouble: if (n->typ->type == Tfloat || n->typ->type == Tdouble || n->typ->type == Tldouble) { p->info.val.r = n->val.r; if ((t->hasmin && t->rmin > n->val.r) || (t->hasmin && !t->incmin && t->rmin == n->val.r) || (t->hasmax && t->rmax < n->val.r) || (t->hasmax && !t->incmax && t->rmax == n->val.r)) semerror("initialization constant outside value range"); } else if (n->typ->type == Tint) { p->info.val.r = (double)n->val.i; if ((t->hasmin && t->imin > n->val.i) || (t->hasmin && !t->incmin && t->imin == n->val.i) || (t->hasmax && t->imax < n->val.i) || (t->hasmax && !t->incmax && t->imax == n->val.i)) semerror("initialization constant outside value range"); } else { semerror("type error in initialization constant"); p->info.hasval = False; p->info.ptrval = False; } break; default: if (t->type == Tpointer && (((Tnode*)t->ref)->type == Tchar || ((Tnode*)t->ref)->type == Twchar) && n->typ->type == Tpointer && ((Tnode*)n->typ->ref)->type == Tchar) { p->info.val.s = n->val.s; } else if (bflag && t->type == Tarray && ((Tnode*)t->ref)->type == Tchar && n->typ->type == Tpointer && ((Tnode*)n->typ->ref)->type == Tchar) { if (t->width / ((Tnode*)t->ref)->width - 1 < (int)strlen(n->val.s)) { semerror("char[] initialization constant too long"); p->info.val.s = ""; } else { p->info.val.s = n->val.s; } } else if (t->id == lookup("std::string") || t->id == lookup("std::wstring")) { p->info.val.s = n->val.s; } else { semerror("type error in initialization constant"); p->info.hasval = False; p->info.ptrval = False; } break; } } /**************************************\ Type additions \**************************************/ static void add_fault(void) { Table *t; Entry *p1, *p2, *p3, *p4, *p5; Symbol *s1, *s2, *s3, *s4; imported = NULL; s1 = lookup("SOAP_ENV__Code"); p1 = entry(classtable, s1); if (!p1 || !p1->info.typ->ref) { t = mktable(NULL); if (!p1) { p1 = enter(classtable, s1); p1->info.typ = mkstruct(t, 3*4); p1->info.typ->id = s1; } else { p1->info.typ->ref = t; } p2 = enter(t, lookup("SOAP_ENV__Value")); p2->info.typ = qname; p2->info.minOccurs = 0; p2 = enter(t, lookup("SOAP_ENV__Subcode")); p2->info.typ = mkpointer(p1->info.typ); p2->info.minOccurs = 0; } else { t = p1->info.typ->ref; p2 = entry(t, lookup("SOAP_ENV__Value")); if (!p2) { sprintf(errbuf, "SOAP_ENV__Value member missing in SOAP_ENV__Code declared at %s:%d", p1->filename, p1->lineno); semerror(errbuf); } else if (p2->info.typ != qname) { sprintf(errbuf, "SOAP_ENV__Value member of SOAP_ENV__Code is not a _QName type declared at %s:%d", p2->filename, p2->lineno); semerror(errbuf); } p2 = entry(t, lookup("SOAP_ENV__Subcode")); if (!p2) { sprintf(errbuf, "SOAP_ENV__Subcode member missing in SOAP_ENV__Code declared at %s:%d", p1->filename, p1->lineno); semerror(errbuf); } else if (p2->info.typ->type != Tpointer || (Tnode*)p2->info.typ->ref != p1->info.typ) { sprintf(errbuf, "SOAP_ENV__Subcode member of SOAP_ENV__Code is not a SOAP_ENV__Subcode * type declared at %s:%d", p2->filename, p2->lineno); semerror(errbuf); } } s2 = lookup("SOAP_ENV__Detail"); p2 = entry(classtable, s2); if (!p2 || !p2->info.typ->ref) { t = mktable(NULL); if (!p2) { p2 = enter(classtable, s2); p2->info.typ = mkstruct(t, 3*4); p2->info.typ->id = s2; } else { p2->info.typ->ref = t; } p3 = enter(t, lookup("__any")); p3->info.typ = xml; p3->info.minOccurs = 0; p3 = enter(t, lookup("__type")); p3->info.typ = mkint(); p3->info.minOccurs = 0; p3 = enter(t, lookup("fault")); p3->info.typ = mkpointer(mkvoid()); p3->info.minOccurs = 0; custom_fault = 0; } s4 = lookup("SOAP_ENV__Reason"); p4 = entry(classtable, s4); if (!p4 || !p4->info.typ->ref) { t = mktable(NULL); if (!p4) { p4 = enter(classtable, s4); p4->info.typ = mkstruct(t, 4); p4->info.typ->id = s4; } else { p4->info.typ->ref = t; } p3 = enter(t, lookup("SOAP_ENV__Text")); p3->info.typ = mkstring(); p3->info.minOccurs = 0; } else { t = p4->info.typ->ref; p3 = entry(t, lookup("SOAP_ENV__Text")); if (!p3) { sprintf(errbuf, "SOAP_ENV__Text member missing in SOAP_ENV__Reason declared at %s:%d", p4->filename, p4->lineno); semerror(errbuf); } else if (!is_string(p3->info.typ)) { sprintf(errbuf, "SOAP_ENV__Text member of SOAP_ENV__Reason is not a char * type declared at %s:%d", p3->filename, p3->lineno); semerror(errbuf); } } s3 = lookup("SOAP_ENV__Fault"); p3 = entry(classtable, s3); if (!p3 || !p3->info.typ->ref) { t = mktable(NULL); if (!p3) { p3 = enter(classtable, s3); p3->info.typ = mkstruct(t, 9*4); p3->info.typ->id = s3; } else { p3->info.typ->ref = t; } p5 = enter(t, lookup("faultcode")); p5->info.typ = qname; p5->info.minOccurs = 0; p5 = enter(t, lookup("faultstring")); p5->info.typ = mkstring(); p5->info.minOccurs = 0; p5 = enter(t, lookup("faultactor")); p5->info.typ = mkstring(); p5->info.minOccurs = 0; p5 = enter(t, lookup("detail")); p5->info.typ = mkpointer(p2->info.typ); p5->info.minOccurs = 0; p5 = enter(t, s1); p5->info.typ = mkpointer(p1->info.typ); p5->info.minOccurs = 0; p5 = enter(t, s4); p5->info.typ = mkpointer(p4->info.typ); p5->info.minOccurs = 0; p5 = enter(t, lookup("SOAP_ENV__Node")); p5->info.typ = mkstring(); p5->info.minOccurs = 0; p5 = enter(t, lookup("SOAP_ENV__Role")); p5->info.typ = mkstring(); p5->info.minOccurs = 0; p5 = enter(t, lookup("SOAP_ENV__Detail")); p5->info.typ = mkpointer(p2->info.typ); p5->info.minOccurs = 0; } else { t = p3->info.typ->ref; p5 = entry(t, lookup("faultcode")); if (!p5) { sprintf(errbuf, "faultcode member missing in SOAP_ENV__Fault declared at %s:%d", p3->filename, p3->lineno); semerror(errbuf); } else if (p5->info.typ != qname) { sprintf(errbuf, "faultcode member of SOAP_ENV__Fault is not a _QName type declared at %s:%d", p5->filename, p5->lineno); semerror(errbuf); } p5 = entry(t, lookup("faultstring")); if (!p5) { sprintf(errbuf, "faultstring member missing in SOAP_ENV__Fault declared at %s:%d", p3->filename, p3->lineno); semerror(errbuf); } else if (!is_string(p5->info.typ)) { sprintf(errbuf, "faultstring member of SOAP_ENV__Fault is not a char * type declared at %s:%d", p5->filename, p5->lineno); semerror(errbuf); } p5 = entry(t, lookup("faultdetail")); if (p5 && (p5->info.typ->type != Tpointer || (Tnode*)p5->info.typ->ref != p2->info.typ)) { sprintf(errbuf, "faultdetail member of SOAP_ENV__Fault is not a SOAP_ENV__Detail * type declared at %s:%d", p5->filename, p5->lineno); semerror(errbuf); } p5 = entry(t, s1); if (!p5) { sprintf(errbuf, "SOAP_ENV__Code member missing in SOAP_ENV__Fault declared at %s:%d", p3->filename, p3->lineno); semerror(errbuf); } else if (p5->info.typ->type != Tpointer || (Tnode*)p5->info.typ->ref != p1->info.typ) { sprintf(errbuf, "SOAP_ENV__Code member of SOAP_ENV__Fault is not a SOAP_ENV__Code * type declared at %s:%d", p5->filename, p5->lineno); semerror(errbuf); } p5 = entry(t, s4); if (!p5) { sprintf(errbuf, "SOAP_ENV__Reason member missing in SOAP_ENV__Fault declared at %s:%d", p3->filename, p3->lineno); semerror(errbuf); } else if (p5->info.typ->type != Tpointer || (Tnode*)p5->info.typ->ref != p4->info.typ) { sprintf(errbuf, "SOAP_ENV__Reason member of SOAP_ENV__Fault is not a SOAP_ENV__Reason * type declared at %s:%d", p5->filename, p5->lineno); semerror(errbuf); } p5 = entry(t, lookup("SOAP_ENV__Node")); if (!p5) { sprintf(errbuf, "SOAP_ENV__Node member missing in SOAP_ENV__Fault declared at %s:%d", p3->filename, p3->lineno); semerror(errbuf); } else if (!is_string(p5->info.typ)) { sprintf(errbuf, "SOAP_ENV__Node member of SOAP_ENV__Fault is not a char * type declared at %s:%d", p5->filename, p5->lineno); semerror(errbuf); } p5 = entry(t, lookup("SOAP_ENV__Role")); if (!p5) { sprintf(errbuf, "SOAP_ENV__Role member missing in SOAP_ENV__Fault declared at %s:%d", p3->filename, p3->lineno); semerror(errbuf); } else if (!is_string(p5->info.typ)) { sprintf(errbuf, "SOAP_ENV__Role member of SOAP_ENV__Fault is not a char * type declared at %s:%d", p5->filename, p5->lineno); semerror(errbuf); } p5 = entry(t, lookup("SOAP_ENV__Detail")); if (p5 && (p5->info.typ->type != Tpointer || (Tnode*)p5->info.typ->ref != p2->info.typ)) { sprintf(errbuf, "SOAP_ENV__Detail member of SOAP_ENV__Fault is not a SOAP_ENV__Detail * type declared at %s:%d", p5->filename, p5->lineno); semerror(errbuf); } } } static void add_soap(void) { Symbol *s = lookup("soap"); p = enter(classtable, s); p->info.typ = mkstruct(NULL, 0); p->info.typ->transient = -2; p->info.typ->id = s; p->filename = "(built-in)"; p->lineno = 0; } static void add_XML(void) { Symbol *s = lookup("_XML"); s->token = TYPE; p = enter(typetable, s); xml = p->info.typ = mksymtype(mkstring(), s); p->info.sto = Stypedef; p->filename = "(built-in)"; p->lineno = 0; } static void add_qname(void) { Symbol *s = lookup("_QName"); s->token = TYPE; p = enter(typetable, s); qname = p->info.typ = mksymtype(mkstring(), s); p->info.sto = Stypedef; p->filename = "(built-in)"; p->lineno = 0; } static void add_header(void) { Table *t; Entry *p; Symbol *s = lookup("SOAP_ENV__Header"); imported = NULL; p = entry(classtable, s); if (!p || !p->info.typ->ref) { t = mktable(NULL); if (!p) p = enter(classtable, s); p->info.typ = mkstruct(t, 0); p->info.typ->id = s; custom_header = 0; } } static void add_response(Entry *fun, Entry *ret) { Table *t; Entry *p, *q; Symbol *s; size_t i = 0, j, n = strlen(fun->sym->name); char *r = (char*)emalloc(n+100); strcpy(r, fun->sym->name); strcat(r, "Response"); do { for (j = 0; j < i; j++) r[n+j+8] = '_'; r[n+i+8] = '\0'; if (!(s = lookup(r))) s = install(r, ID); i++; } while (entry(classtable, s)); free(r); t = mktable(NULL); q = enter(t, ret->sym); q->info = ret->info; if (q->info.typ->type == Treference) q->info.typ = (Tnode*)q->info.typ->ref; p = enter(classtable, s); p->info.typ = mkstruct(t, 4); p->info.typ->id = s; fun->info.typ->response = p; } static void add_result(Tnode *typ) { Entry *p; if (!typ->ref || !((Tnode*)typ->ref)->ref) { semwarn("response struct/class must be declared before used in function prototype"); return; } for (p = ((Table*)((Tnode*)typ->ref)->ref)->list; p; p = p->next) if (((int)p->info.sto & (int)Sreturn)) return; for (p = ((Table*)((Tnode*)typ->ref)->ref)->list; p; p = p->next) { if (p->info.typ->type != Tfun && !((int)p->info.sto & (int)Sattribute) && !is_transient(p->info.typ) && !((int)p->info.sto & ((int)Sprivate | (int)Sprotected))) p->info.sto = (Storage)((int)p->info.sto | (int)Sreturn); return; } } static void add_request(Symbol *sym, Scope *sp) { Entry *p; unlinklast(sp->table); if ((p = entry(classtable, sym))) { if (p->info.typ->ref) { sprintf(errbuf, "service operation name clash: struct/class '%s' already declared at %s:%d", sym->name, p->filename, p->lineno); semerror(errbuf); } else { p->info.typ->ref = sp->table; p->info.typ->width = sp->offset; } } else { p = enter(classtable, sym); p->info.typ = mkstruct(sp->table, sp->offset); p->info.typ->id = sym; } if (p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (q->info.typ->type == Treference || q->info.typ->type == Trvalueref) { sprintf(errbuf, "parameter '%s' of service operation function '%s()' in %s:%d cannot be passed by reference: use a pointer instead", q->sym->name, sym->name, q->filename, q->lineno); semwarn(errbuf); } else if (((int)q->info.sto & ((int)Sconst | (int)Sconstptr))) { if (!is_string(q->info.typ) && !is_wstring(q->info.typ)) { sprintf(errbuf, "parameter '%s' of service operation function '%s()' in %s:%d cannot be declared const", q->sym->name, sym->name, q->filename, q->lineno); semwarn(errbuf); } } else if (((int)q->info.sto & ~((int)Sattribute | (int)Sextern | (int)Sspecial))) { sprintf(errbuf, "invalid parameter '%s' of service operation function '%s()' in %s:%d", q->sym->name, sym->name, q->filename, q->lineno); semwarn(errbuf); } } } } /**************************************\ Add pragma \**************************************/ static void add_pragma(const char *s) { Pragma **pp; for (pp = &pragmas; *pp; pp = &(*pp)->next) ; *pp = (Pragma*)emalloc(sizeof(Pragma)); (*pp)->pragma = s; (*pp)->next = NULL; } gsoap-2.8.91/gsoap/src/error2.h0000644000175000017500000000363313525245163015563 0ustar ellertellert/* error2.h Error handling. 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 Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- */ extern char errbuf[]; #ifdef WIN32_WITHOUT_SOLARIS_FLEX extern void soapcpp2error(const char*); #else extern void yyerror(const char*); #endif extern void lexerror(const char*); extern void synerror(const char *); extern void semerror(const char *); extern void semwarn(const char *); extern void compliancewarn(const char *); extern void typerror(const char*); extern void execerror(const char*); extern void progerror(const char*, const char*, int); extern int errstat(void); gsoap-2.8.91/gsoap/src/Makefile.am0000644000175000017500000000116213525245163016226 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = foreign 1.4 #LIBS= AM_YFLAGS=-d -v AM_LFLAGS=$(LEX_FLAGS) bin_PROGRAMS=soapcpp2 soapcpp2_CFLAGS=$(BISON_DEFINE) $(LEX_DEFINE) $(C_DEBUG_FLAGS) $(SOAPCPP2_IMPORTPATH) -D$(platform) soapcpp2_LDADD=$(YACC_LIB) $(LEXLIB) soapcpp2_SOURCES= soapcpp2_yacc.y soapcpp2_yacc.h soapcpp2_lex.l symbol2.c error2.c init2.c soapcpp2.c CLEANFILES= *~ soapcpp2_lex.c soapcpp2_yacc.c soapcpp2_yacc.h soapcpp2_yacc.output gsoap-2.8.91/gsoap/src/soapcpp2.h0000644000175000017500000003230413525245163016074 0ustar ellertellert/* soapcpp2.h Common declarations. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2018, 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. -------------------------------------------------------------------------------- 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 #include #include #include #include #include #include #include "error2.h" #ifndef VERSION # define VERSION "2.8.91" /* Current version */ # define GSOAP_VERSION 20891 #endif #ifdef WIN32 # pragma warning(disable : 4996) # ifndef WITH_BISON # define WITH_BISON # endif #endif /* #define DEBUG */ /* uncomment to debug */ #ifdef DEBUG # define check(expr, msg) (void)((expr) ? 0 : (progerror(msg, __FILE__, __LINE__), 0)) # define DBGLOG(DBGCMD) { DBGCMD; } #else # define check(expr, msg) (void)(expr) # define DBGLOG(DBGCMD) #endif #ifdef WIN32 # ifdef WITH_BISON # ifdef WIN32_WITHOUT_SOLARIS_FLEX # define yyparse soapcpp2parse # define yylex soapcpp2lex # define yyerror soapcpp2error # define yylval soapcpp2lval # define yychar soapcpp2char # define yydebug soapcpp2debug # define yynerrs soapcpp2nerrs # define yylineno soapcpp2lineno # define yytext soapcpp2text # define yyin soapcpp2in # define yywrap soapcpp2wrap # endif # endif #endif #ifdef WIN32 # define SOAP_PATHCAT "\\" # define SOAP_PATHSEP ";" # define LONG64 __int64 #else # define SOAP_PATHCAT "/" # define SOAP_PATHSEP ":" # define LONG64 long long #endif #ifndef ULONG64 # define ULONG64 unsigned LONG64 #endif #if defined(WIN32) # define SOAP_LONG_FORMAT "%I64d" # define SOAP_ULONG_FORMAT "%I64u" # define SOAP_XLONG_FORMAT "%I64x" #elif defined(TRU64) # define SOAP_LONG_FORMAT "%ld" # define SOAP_ULONG_FORMAT "%lu" # define SOAP_XLONG_FORMAT "%lx" #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 #ifndef SOAP_XLONG_FORMAT # define SOAP_XLONG_FORMAT "%llx" /* printf format for unsigned 64 bit hex ints */ #endif extern int yylineno; typedef enum Bool {False, True} Bool; typedef int Token; typedef enum Type { Tnone, Tvoid, Tchar, /* primitive types from here*/ Twchar, Tshort, Tint, Tlong, Tllong, Tfloat, Tdouble, Tldouble, Tuchar, Tushort, Tuint, Tulong, Tullong, Tsize, Ttime, Tenum, Tenumsc, Tclass, /* compound types from here */ Tstruct, Tunion, Tpointer, /* pointer T* */ Treference, /* reference T& */ Trvalueref, /* C+11 rvalue reference T&& */ Tarray, /* fixed size array T[N] */ Ttemplate, /* template class */ Tfun } Type; #define TYPES (Tfun+1) /* number of type (operators) enumerated above */ typedef enum Storage { Snone = 0, Sauto = 0x000001, Sregister = 0x000002, Sstatic = 0x000004, Sextern = 0x000008, Stypedef = 0x000010, Svirtual = 0x000020, Sconst = 0x000040, Sconstobj = 0x000080, Sfinal = 0x000100, Soverride = 0x000200, Sconstptr = 0x000400, Sfriend = 0x000800, Sinline = 0x001000, Sabstract = 0x002000, SmustUnderstand = 0x004000, Sreturn = 0x008000, Sattribute = 0x010000, Sspecial = 0x020000, Sexplicit = 0x040000, Sprivate = 0x080000, Sprotected = 0x100000, Smutable = 0x200000 } Storage; typedef enum Level { INTERNAL, GLOBAL, PARAM, LOCAL } Level; #define mknone() mktype(Tnone, NULL, 0) #define mkvoid() mktype(Tvoid, NULL, 0) #define mkbool() mktype(Tenum, booltable, 4) #define mkchar() mktype(Tchar, NULL, 1) /* int8_t */ #define mkwchart() mktype(Twchar, NULL, 4) /* wchar_t */ #define mkshort() mktype(Tshort, NULL, 2) /* int32_t */ #define mkint() mktype(Tint, NULL, 4) /* int32_t */ #define mklong() mktype(Tlong, NULL, 8) /* int32_t */ #define mkllong() mktype(Tllong, NULL, 8) /* int64_t */ #define mkfloat() mktype(Tfloat, NULL, 4) #define mkdouble() mktype(Tdouble, NULL, 8) #define mkldouble() mktype(Tldouble, NULL, 16) /* long double */ #define mkuchar() mktype(Tuchar, NULL, 1) /* uint8_t unsigned char */ #define mkushort() mktype(Tushort, NULL, 2) /* utin16_t unsigned short */ #define mkuint() mktype(Tuint, NULL, 4) /* uint32_t unsigned int */ #define mkulong() mktype(Tulong, NULL, 8) /* uint64_t unsigned long */ #define mkullong() mktype(Tullong, NULL, 8) /* uint64_t unsigned long long */ #define mksize() mktype(Tsize, NULL, 8) /* transient size_t */ #define mktimet() mktype(Ttime, NULL, 4) #define mkenum(t) mktype(Tenum, t, 4) #define mkenumsc(t) mktype(Tenumsc, t, 4) #define mkmask(t) mktype(Tenum, t, 9) #define mkmasksc(t) mktype(Tenumsc, t, 9) #define mkpointer(t) mktype(Tpointer, t, 4) #define mkreference(t) mktype(Treference,t, 4) #define mkrvalueref(t) mktype(Trvalueref,t, 4) #define mkclass(t, w) mktype(Tclass, t, w) #define mkstruct(t, w) mktype(Tstruct, t, w) #define mkunion(t, w) mktype(Tunion, t, w) #define mkarray(t, w) mktype(Tarray, t, w) #define mkfun(t) mktype(Tfun, t, 0) #define mkstring() mkpointer(mkchar()) typedef struct Symbol { char *name; Token token; struct Symbol *next; } Symbol; Symbol *install(const char*, Token), *lookup(const char*), *gensym(const char*), *gensymidx(const char*, int); typedef enum Visited { Unexplored, Cold, Hot } Visited; typedef struct Tnode { Type type; void *ref; Symbol *id; /* struct/class/union/enum name */ Symbol *base; /* base class name */ Symbol *sym; /* typedef name */ Symbol *restriction; /* restriction via typedef base id */ Symbol *synonym; /* synonymous typedef base name for typedef base id */ Symbol *extsym; /* typedef sym of external type w/ custom serializer */ struct Entry *response; /* funcs only: points to response struct */ int width; int transient; const char *imported; struct Tnode *next; Visited visited; Bool recursive; /* recursive data type */ Bool generated; Bool wsdl; int num; Bool hasmin; Bool hasmax; Bool incmin; Bool incmax; LONG64 imin; LONG64 imax; double rmin; double rmax; int property; const char *pattern; } Tnode; typedef union Value { LONG64 i; double r; const char *s; } Value; typedef struct IDinf { Tnode *typ; Storage sto; Bool hasval; /* if true, identifier has a default value */ Bool ptrval; /* if true, identifier is a pointer to a default value */ Bool fixed; /* if true and hasval, identifier has a fixed value */ Value val; /* ... with this value */ int offset; LONG64 minOccurs; LONG64 maxOccurs; Bool nillable; } IDinfo; typedef struct Entry { Symbol *sym; const char *tag; IDinfo info; Level level; const char *filename; int lineno; struct Entry *next; } Entry; typedef struct Table { Symbol *sym; Level level; Entry *list; struct Table *prev; } Table; typedef struct FNinfo { Tnode *ret; Table *args; } FNinfo; typedef struct IR { LONG64 i; double r; } IR; typedef struct Node { Tnode *typ; Storage sto; Bool hasval; /* if true, this node has a default value */ Bool fixed; /* if true and hasval, this node has a fixed value */ Value val; /* ... this is the value */ Bool hasmin; Bool hasmax; Bool incmin; Bool incmax; LONG64 minOccurs; LONG64 maxOccurs; LONG64 imin; LONG64 imax; double rmin; double rmax; Bool nillable; int property; const char *pattern; } Node; #define ACTION 0x0000 #define REQUEST_ACTION 0x0001 #define RESPONSE_ACTION 0x0002 #define FAULT_ACTION 0x0004 #define HDRIN 0x0010 #define HDROUT 0x0020 #define MIMEIN 0x0040 #define MIMEOUT 0x0080 #define COMMENT 0x0100 #define ENCODING 0x0200 #define RESPONSE_ENCODING 0x0400 #define STYLE 0x0800 #define FAULT 0x1000 #define PROTOCOL 0x2000 typedef struct Data { struct Data *next; const char *name; const char *text; } Data; typedef struct Method { struct Method *next; const char *name; short mess; /* see #defines above */ const char *part; } Method; typedef struct Service { struct Service *next; const char *ns; const char *name; const char *porttype; const char *portname; const char *binding; const char *definitions; const char *transport; const char *URL; const char *executable; const char *import; const char *URI; const char *URI2; const char *WSDL; const char *style; const char *encoding; const char *protocol; int xsi_type; const char *elementForm; const char *attributeForm; const char *documentation; struct Method *list; struct Data *data; } Service; typedef struct XPath { struct XPath *next; const char *name; const char *path; } XPath; typedef struct Pragma { struct Pragma *next; const char *pragma; } Pragma; extern Entry *enter(Table*, Symbol*), *entry(Table*, Symbol*), *reenter(Table*, Symbol*), *enumentry(Symbol*); extern int merge(Table*, Table*); extern Table *mktable(Table*); extern Tnode *mkmethod(Tnode*, Table*); extern char *emalloc(size_t); extern Tnode *mktype(Type, void*, int); extern Tnode *mksymtype(Tnode*, Symbol*); extern Tnode *mktemplate(Tnode*, Symbol*); extern int is_transient(Tnode*); extern int is_response(Tnode*); extern void set_namespace(const char*); extern Table *typetable, *enumtable, *classtable, *booltable, *templatetable; extern void compile(Table*); extern void freetable(Table*); extern Entry *unlinklast(Table*); extern FILE *fmsg; extern int soap_version; extern const char *copt; extern int aflag; extern int Aflag; extern int bflag; extern int cflag; extern int c11flag; extern int Cflag; extern int eflag; extern int Ecflag; extern int Edflag; extern int Etflag; extern unsigned long fflag; extern int gflag; extern int iflag; extern int jflag; extern int mflag; extern int nflag; extern int lflag; extern int Lflag; extern int Qflag; extern int sflag; extern int rflag; extern int Sflag; extern int Tflag; extern int tflag; extern int uflag; extern int vflag; extern int wflag; extern int xflag; extern int yflag; extern int zflag; extern char dirpath[1024]; extern const char *filename; extern const char *prefix; extern const char *fprefix; extern const char *importpath; extern int custom_header; extern int custom_fault; extern Pragma *pragmas; extern Service *services; extern XPath *xpaths; extern const char *namespaceid; extern int transient; extern int imports; extern const char *imported; extern int typeNO; extern const char *envURI; extern const char *encURI; extern const char *rpcURI; extern const char *xsiURI; extern const char *xsdURI; gsoap-2.8.91/gsoap/src/symbol2.c0000644000175000017500000357456013525245163015751 0ustar ellertellert/* symbol2.c Symbolic processing: type analysis and code generation. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2018, 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. -------------------------------------------------------------------------------- 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 "soapcpp2.h" #ifdef HAVE_CONFIG_H #include "soapcpp2_yacc.h" #else #include "soapcpp2_yacc.tab.h" #endif const char *envURI = "http://schemas.xmlsoap.org/soap/envelope/"; const char *encURI = "http://schemas.xmlsoap.org/soap/encoding/"; const char *rpcURI = "http://www.w3.org/2003/05/soap-rpc"; const char *xsiURI = "http://www.w3.org/2001/XMLSchema-instance"; const char *xsdURI = "http://www.w3.org/2001/XMLSchema"; const char *tmpURI = "http://tempuri.org"; static Symbol *symlist = (Symbol*) 0; /* pointer to linked list of symbols */ static Symbol *nslist = (Symbol*) 0; /* pointer to linked list of namespace prefix symbols */ static Tnode *Tptr[TYPES]; const char *namespaceid = NULL; static unsigned long idnum = 0; Service *services = NULL; XPath *xpaths = NULL; /* TODO? */ FILE *fout = NULL, *fhead = NULL, *fclient = NULL, *fserver = NULL, *fheader = NULL, *freport = NULL, *flib = NULL, *fmatlab = NULL, *fmheader = NULL; int partnum = 0; int typeNO = 1; /* unique nonzero type no. assigned to all types */ static int is_anytype_flag = 0; /* anytype is used */ static int is_anyType_flag = 0; /* anyType XML DOM is used */ static int has_nsmap = 0; static char soapStub[1024]; static char soapH[1024]; static char soapC[1024]; static char soapClient[1024]; static char soapServer[1024]; static char soapClientLib[1024]; static char soapServerLib[1024]; static char soapReadme[1024]; static char soapProxyH[1024]; static char soapProxyC[1024]; static char soapServiceH[1024]; static char soapServiceC[1024]; static char soapTester[1024]; static char soapMatlab[1024]; static char soapMatlabHdr[1024]; static char pathsoapTester[4096]; static char pathsoapStub[4096]; static char pathsoapH[4096]; static char pathsoapC[4096]; static char pathsoapClient[4096]; static char pathsoapServer[4096]; static char pathsoapClientLib[4096]; static char pathsoapServerLib[4096]; static char pathsoapReadme[4096]; static char pathsoapProxyH[4096]; static char pathsoapProxyC[4096]; static char pathsoapServiceH[4096]; static char pathsoapServiceC[4096]; static char pathsoapMatlab[4096]; static char pathsoapMatlabHdr[4096]; int tagcmp(const char *s, const char *t); int tagncmp(const char *s, const char *t, size_t n); int property(Tnode*); void property_pattern(Tnode*, const char*); int is_qname(Tnode*); int is_stdqname(Tnode*); long minlen(Tnode *typ); long maxlen(Tnode *typ); const char* pattern(Tnode *typ); int is_soap12(const char*); int has_detail_string(void); int has_Detail_string(void); void needs_lang(Entry *e); int is_mutable(Entry *e); int is_header_or_fault(Tnode *typ); int is_body(Tnode *typ); int is_volatile(Tnode* typ); int is_untyped(Tnode* typ); int is_primclass(Tnode* typ); int is_imported(Tnode* typ); int is_smart(Tnode*); int is_smart_shared(Tnode*); const char * make_shared(Tnode*); int is_container(Tnode* typ); int is_template(Tnode* typ); int is_mask(Tnode* typ); int is_attachment(Tnode* typ); int is_void(Tnode* typ); int has_external(Tnode *typ); int has_volatile(Tnode *typ); int is_unmatched(Symbol *sym); int is_invisible(const char *name); int is_invisible_empty(Tnode *p); int is_element(Tnode *typ); int is_eq_nons(const char *s, const char *t); int is_eq(const char *s, const char *t); int is_item(Entry *p); int is_self(Entry *p); const char *cstring(const char*, int); const char *xstring(const char*); const char *get_mxClassID(Tnode*); const char *t_ident(Tnode*); const char *c_ident(Tnode*); const char *ident(const char*); const char *soap_type(Tnode*); const char *soap_union_member(Tnode*, Entry*); const char *c_storage(Storage); const char *c_const(Storage); const char *c_init(Entry*); const char *c_init_a(Entry*, const char*); const char *c_type(Tnode*); const char *c_type_constptr_id(Tnode*, const char*); const char *c_type_id(Tnode*, const char*); const char *c_type_sym(Tnode*); const char *c_type_synonym_id(Tnode*, const char*); const char *xsi_type(Tnode*); const char *xsi_type_u(Tnode*); const char *the_type(Tnode*); const char *wsdl_type(Tnode*, const char*); const char *base_type(Tnode*, const char*); const char *xml_tag(Tnode*); const char *ns_qualifiedElement(Tnode*); const char *ns_qualifiedElementName(const char*); const char *ns_qualifiedAttribute(Tnode*); const char *ns_qualifiedAttributeName(const char*); const char *ns_tag_convert(Entry*); const char *ns_convert(const char*); const char *field(Entry *p, const char *ns); const char *field_overridden(Table *t, Entry *p, const char *ns); const char *ns_add(Entry *p, const char *ns); const char *ns_addx(const char *tag, const char *ns); const char *ns_add_overridden(Table *t, Entry *p, const char *ns); const char *ns_tag_remove(Entry*); const char *ns_remove(const char*); const char *ns_remove1(const char*); const char *ns_remove2(const char*, const char*); const char *ns_remove3(const char*, const char*); const char *res_remove(const char*); const char *ns_name(const char*); const char *ns_cname(const char*, const char*); const char *ns_fname(const char*); int has_class(Tnode*); const char *union_member(Tnode*); int has_union(Tnode*); void gen_constructor(FILE *fd, Tnode*); int has_constructor(Tnode*); int has_destructor(Tnode*); int has_getter(Tnode*); int has_setter(Tnode*); int has_ns(Tnode*); int has_ns_t(Tnode*); int has_ns_eq(const char*, const char*); const char *strict_check(void); void fixed_check(FILE*, Entry*, Table*, const char*); const char *ns_of(const char*); int eq_ns(const char*, const char*); const char *prefix_of(const char*); int has_offset(Tnode*); int is_bool(Tnode*); int is_boolean(Tnode*); int reflevel(Tnode *typ); Tnode* reftype(Tnode *typ); int is_response(Tnode*); int is_XML(Tnode*); int is_stdXML(Tnode *p); Entry *get_response(Tnode*); const char *kind_of(Tnode*); int is_primitive_or_string(Tnode*); int is_primitive(Tnode*); Entry *is_discriminant(Tnode*); Entry *is_dynamic_array(Tnode*); int is_pointer_to_derived(Entry*); void gen_match_derived(FILE *, Tnode*); Entry *base_type_of_derived(Tnode *typ); int is_transient(Tnode*); int is_external(Tnode*); int is_anyType(Tnode*); int is_anyAttribute(Tnode*); int is_binary(Tnode*); int is_hexBinary(Tnode*); int is_fixedstring(Tnode*); int is_string(Tnode*); int is_wstring(Tnode*); int is_stdstring(Tnode*); int is_stdwstring(Tnode*); int is_stdstr(Tnode*); int is_typedef(Tnode*); int is_restriction(Tnode*); int has_restriction_base(Tnode *typ, const char *base); int is_synonym(Tnode*); int get_dimension(Tnode*); int get_dimension_product(Tnode*); Tnode * get_item_type(Tnode*, int*); const char *has_soapref(Tnode*); int is_soapref(Tnode*); int is_document(const char*); int is_literal(const char*); int is_keyword(const char *); int is_repetition(Entry*); int is_choice(Entry*); int required_choice(Tnode*); int is_sequence(Entry*); int is_anytype(Entry*); const char *xsi_type_Tarray(Tnode*); const char *xsi_type_Darray(Tnode*); void matlab_def_table(Table*); void generate_defs(void); void generate_type(Tnode *); int no_of_var(Tnode*); const char *pointer_stuff(Tnode*); void in_defs(void); void in_defs2(void); void in_defs3(void); void out_defs(void); void mark_defs(void); void dup_defs(void); void del_defs(void); void in_attach(void); void soap_serialize(Tnode*); void soap_traverse(Tnode*); void soap_default(Tnode*); void soap_put(Tnode*); void soap_out(Tnode*); void soap_out_Darray(Tnode *); void soap_get(Tnode*); void soap_in(Tnode*); void soap_in_Darray(Tnode *); void soap_instantiate(Tnode *); void soap_dup(Tnode *); void soap_del(Tnode *); int get_Darraydims(Tnode *typ); const char* get_Darraysize(const char *a, int d); const char *nillable(Entry*); const char *nillable_ref(Entry*); void soap_serve(Table*); void generate_proto(FILE*, Table*, Entry*); /* void generate_call(Table*, Entry*); void generate_server(Table*, Entry*); */ void detect_cycles(void); void detect_recursive_type(Tnode*); void generate_header(Table*); void get_namespace_prefixes(void); void generate_schema(Table*); void gen_schema(FILE*, Table*, const char*, const char*, int, const char*, const char*); void gen_schema_type(FILE *, Table*, Entry *, const char*, const char*, int, const char*, const char*); void gen_report_hr(); void gen_report_operation(const char *name, Entry *method, int service); void gen_report_type(Tnode*, const char*); void gen_report_type_doc(Entry *); void gen_report_members(Entry *type, const char*, const char*); void gen_report_member(Entry*, Entry*); void gen_method_documentation(FILE *fd, Entry *p, const char *ns); void gen_type_documentation(FILE *fd, Entry *type, const char *ns); int gen_member_documentation(FILE *fd, Symbol *type, Entry *member, const char *ns, int scope); void gen_text(FILE *fd, const char *s); void gen_schema_elements_attributes(FILE *fd, Table *t, const char *ns, const char *ns1, const char *encoding, const char *style); void gen_schema_elements(FILE *fd, Tnode *p, Tnode *b, const char *ns, const char *ns1); int gen_schema_element(FILE *fd, Tnode *p, Entry *q, const char *ns, const char *ns1); void gen_schema_attributes(FILE *fd, Tnode *p, Tnode *b, const char *ns, const char *ns1); void gen_wsdl(FILE*, Table*, const char*, const char*, const char*, const char*, const char*, const char*, const char*, const char*); const char *default_value(Entry*); const char *set_default_value(Entry*); void gen_nsmap(FILE*); void gen_proxy(FILE*, Table*, Symbol*, const char*, const char*); void gen_object(FILE*, Table*, const char*); void gen_proxy_header(FILE*, Table*, Symbol*, const char*); void gen_proxy_code(FILE*, Table*, Symbol*, const char*); void gen_object_header(FILE*, Table*, Symbol*, const char*); void gen_object_code(FILE*, Table*, Symbol*, const char*); void gen_method(FILE *fd, Entry *method, int server); void gen_report_params(Entry *p, Entry *result, int server); void gen_report_req_params(Tnode *typ); void gen_report_set_params(Tnode *typ); void gen_params_ref(FILE *fd, Table *params, Entry *result, int flag); void gen_params(FILE *fd, Table *params, Entry *result, int flag); void gen_args(FILE *fd, Table *params, Entry *result, int flag); void gen_query_url(FILE *fd, Table *params, int soap); void gen_query_url_type2s(FILE *fd, Tnode *typ, const char *name, const char *ptr, const char *idx); void gen_query_send_form_init(FILE *fd, Table *params); void gen_query_send_form(FILE *fd, Table *params); void gen_query_recv_form_init(FILE *fd, Entry *result); void gen_query_recv_form(FILE *fd, Entry *result); void gen_query_form_type2s(FILE *fd, Tnode *typ, const char *name, const char *ptr, const char *idx); void gen_query_form_s2type(FILE *fd, Tnode *typ, const char *name, const char *ptr, const char *ref, const char *idx); void gen_call_proto(FILE *fd, Entry *method); void gen_call_method(FILE *fd, Entry *method, const char *name); void gen_serve_method(FILE *fd, Table *table, Entry *param, const char *name); void gen_data(const char*, Table*, const char*, const char*); FILE *gen_env(const char*, const char*, int, const char*, int); void gen_xmlns(FILE*, int soap); void gen_field(FILE*, int, Entry*, const char*, const char*, const char*, int, int); void gen_val(FILE*, int, Tnode*, const char*, const char*, const char*, int); void gen_atts(FILE*, Table*, const char*, const char*, const char*); struct pair { const char *action; Entry *method; }; int mapcomp(const void *a, const void *b) { const struct pair *p = a, *q = b; return strcmp(p->action, q->action); } /* install - add new symbol */ Symbol * install(const char *name, Token token) { Symbol *p; p = (Symbol*)emalloc(sizeof(Symbol)); p->name = (char*)emalloc(strlen(name)+1); strcpy(p->name, name); p->token = token; p->next = symlist; symlist = p; return p; } /* lookup - search for an identifier's name. If found, return pointer to symbol table entry. Return pointer 0 if not found. */ Symbol * lookup(const char *name) { Symbol *p; for (p = symlist; p; p = p->next) if (!strcmp(p->name, name)) return p; return NULL; } /* gensymidx - generate new symbol from base name and index */ Symbol * gensymidx(const char *base, int idx) { char buf[1024]; Symbol *s; sprintf(buf, "%s_%d", base, idx); s = lookup(buf); if (s) return s; return install(buf, ID); } /* gensym - generate new symbol from base name */ Symbol * gensym(const char *base) { static int num = 1; return gensymidx(base, num++); } /* mktable - make a new symbol table with a pointer to a previous table */ Table * mktable(Table *table) { Table *p; p = (Table*)emalloc(sizeof(Table)); p->sym = lookup("/*?*/"); p->list = (Entry*) 0; if (table == (Table*) 0) p->level = INTERNAL; else p->level = (enum Level)(((int)table->level) + 1); p->prev = table; return p; } /* mkmethod - make a new method by calling mktype */ Tnode * mkmethod(Tnode *ret, Table *args) { FNinfo *fn = (FNinfo*)emalloc(sizeof(FNinfo)); fn->ret = ret; fn->args = args; return mktype(Tfun, fn, 0); } /* freetable - free space by removing a table */ void freetable(Table *table) { Entry *p, *q; if (table == (Table*) 0) return; for (p = table->list; p != (Entry*) 0; p = q) { q = p->next; free(p); } free(table); } /* unlinklast - unlink last entry added to table */ Entry * unlinklast(Table *table) { Entry **p, *q; if (table == (Table*)0) return (Entry*)0; for (p = &table->list; *p != (Entry*)0 && (*p)->next != (Entry*)0; p = &(*p)->next) ; q = *p; *p = (Entry*)0; return q; } /* enter - enter a symbol in a table. Error if already in the table */ Entry * enter(Table *table, Symbol *sym) { Entry *p, *q = NULL; Storage sto = Snone; again: for (p = table->list; p; q = p, p = p->next) { if (p->sym == sym) { if (p->info.typ->type != Tfun) { char *s; sprintf(errbuf, "Duplicate declaration of '%s' (already declared at line %d), changing conflicting identifier name to '%s_'", sym->name, p->lineno, sym->name); semwarn(errbuf); s = (char*)emalloc(strlen(sym->name) + 2); strcpy(s, sym->name); strcat(s, "_"); sym = lookup(s); if (!sym) sym = install(s, ID); free(s); goto again; } if (p->level == GLOBAL) { if (((int)p->info.sto & (int)Sextern)) { sto = p->info.sto; break; } else { sprintf(errbuf, "Duplicate declaration of '%s' (already declared at line %d)", sym->name, p->lineno); semwarn(errbuf); return p; } } } } p = (Entry*)emalloc(sizeof(Entry)); p->sym = sym; p->tag = NULL; p->info.typ = NULL; p->info.sto = sto; p->info.hasval = False; p->info.ptrval = False; p->info.fixed = False; p->info.minOccurs = 1; p->info.maxOccurs = 1; p->info.nillable = zflag >= 1 && zflag <= 3; /* False, unless version 2.8.30 or earlier */ p->info.offset = 0; p->level = table->level; p->filename = filename; p->lineno = yylineno; p->next = NULL; if (!q) table->list = p; else q->next = p; return p; } /* entry - return pointer to table entry of a symbol */ Entry * entry(Table *table, Symbol *sym) { Table *t; Entry *p; for (t = table; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->sym == sym) return p; return (Entry*)0; } /* reenter - re-enter a symbol in a table. */ Entry * reenter(Table *table, Symbol *sym) { Entry *p, *q = NULL; for (p = table->list; p; q = p, p = p->next) if (p->sym == sym) break; if (p && p->next) { if (q) q->next = p->next; else table->list = p->next; for (q = p->next; q->next; q = q->next) ; q->next = p; p->next = NULL; } return p; } /* merge - append two tables if members are not duplicated */ int merge(Table *dest, Table *src) { Entry *p, *q; for (p = src->list; p; p = p->next) { q = entry(dest, p->sym); if (!q) { q = enter(dest, p->sym); q->info = p->info; } else if (q->info.typ != p->info.typ) return 1; } return 0; } Entry * enumentry(Symbol *sym) { const char *s = strstr(sym->name, "::"); if (s && s[2]) { Entry *e; char *t = (char*)emalloc(s - sym->name + 1); strncpy(t, sym->name, s - sym->name); t[s - sym->name] = '\0'; e = entry(enumtable, lookup(t)); free(t); if (!e) return NULL; return entry((Table*)e->info.typ->ref, lookup(s + 2)); } else { Table *t; for (t = enumtable; t; t = t->prev) { Entry *p; for (p = t->list; p; p = p->next) { Entry *e = entry((Table*)p->info.typ->ref, sym); if (e) return e; } } } return NULL; } /* mktype - make a (new) type with a reference to additional information and the width in bytes required to store objects of that type. A pointer to the type is returned which can be compared to check if types are identical. */ Tnode * mktype(Type type, void *ref, int width) { Tnode *p; if (type != Tstruct && type != Tclass && type != Tunion && ((type != Tenum && type != Tenumsc) || ref)) { for (p = Tptr[type]; p; p = p->next) { if (p->ref == ref && p->sym == (Symbol*)0 && p->width == width && ((p->transient == 1 && transient == 1) || (p->transient != 1 && transient != 1))) { if (imported && !p->imported) p->imported = imported; return p; /* type already exists in table */ } } } p = (Tnode*)emalloc(sizeof(Tnode)); /* install new type */ p->type = type; p->ref = ref; p->id = lookup("/*?*/"); p->base = NULL; p->sym = NULL; p->restriction = NULL; p->synonym = NULL; p->extsym = NULL; p->response = NULL; p->width = width; p->visited = Unexplored; p->recursive = False; p->generated = False; p->wsdl = False; p->next = Tptr[type]; p->transient = transient; p->imported = imported; p->hasmin = False; p->hasmax = False; p->incmin = True; p->incmax = True; p->imin = 0; p->imax = 0; p->rmin = 0.0; p->rmax = 0.0; p->property = 1; p->pattern = NULL; p->num = typeNO++; Tptr[type] = p; DBGLOG(fprintf(stderr, "New type %s %s\n", c_type(p), p->imported)); if (type == Tpointer && ((Tnode*)ref)->imported && (((Tnode*)ref)->type == Tenum || ((Tnode*)ref)->type == Tenumsc || ((Tnode*)ref)->type == Tstruct || ((Tnode*)ref)->type == Tclass)) p->imported = ((Tnode*)ref)->imported; else if (lflag && !is_transient(p) && (type == Tenum || type == Tenumsc || type == Tstruct || type == Tclass)) mkpointer(p); return p; } Tnode * mksymtype(Tnode *typ, Symbol *sym) { Tnode *p; p = (Tnode*)emalloc(sizeof(Tnode)); /* install new type */ p->type = typ->type; p->ref = typ->ref; if (typ->id == lookup("/*?*/")) p->id = sym; else p->id = typ->id; p->sym = sym; p->restriction = NULL; p->synonym = NULL; p->extsym = typ->extsym; p->response = (Entry*)0; p->width = typ->width; p->visited = Unexplored; p->recursive = False; p->generated = False; p->wsdl = False; p->next = Tptr[typ->type]; p->transient = transient; p->imported = imported; p->hasmin = False; p->hasmax = False; p->incmin = True; p->incmax = True; p->imin = 0; p->imax = 0; p->rmin = 0.0; p->rmax = 0.0; property_pattern(p, sym->name); p->num = typeNO++; Tptr[typ->type] = p; DBGLOG(fprintf(stderr, "New typedef %s %s\n", c_type(p), p->imported)); return p; } Tnode * mktemplate(Tnode *typ, Symbol *id) { Tnode *p; for (p = Tptr[Ttemplate]; p; p = p->next) { if (p->ref == typ && p->id == id && ((p->transient == 1 && transient == 1) || (p->transient != 1 && transient != 1))) { if (imported && !p->imported) p->imported = imported; return p; /* type alrady exists in table */ } } p = (Tnode*)emalloc(sizeof(Tnode)); /* install new type */ p->type = Ttemplate; p->ref = typ; p->id = id; p->sym = NULL; p->restriction = NULL; p->synonym = NULL; p->extsym = NULL; p->response = (Entry*)0; p->width = 0; p->generated = False; p->wsdl = False; p->next = Tptr[Ttemplate]; p->transient = transient; p->imported = imported; p->hasmin = False; p->hasmax = False; p->incmin = True; p->incmax = True; p->imin = 0; p->imax = 0; p->rmin = 0.0; p->rmax = 0.0; p->property = 1; p->pattern = NULL; p->num = typeNO++; Tptr[Ttemplate] = p; return p; } /* DO NOT REMOVE OR ALTER (SEE LICENCE AGREEMENT AND COPYING.txt) */ void copyrightnote(FILE *fd, const char *fn) { fprintf(fd, "/* %s\n Generated by gSOAP " VERSION " for %s\n\ \n\ gSOAP XML Web services tools\n\ Copyright (C) 2000-2018, Robert van Engelen, Genivia Inc. All Rights Reserved.\n\ The soapcpp2 tool and its generated software are released under the GPL.\n\ This program is released under the GPL with the additional exemption that\n\ compiling, linking, and/or using OpenSSL is allowed.\n\ --------------------------------------------------------------------------------\n\ A commercial use license is available from Genivia Inc., contact@genivia.com\n\ --------------------------------------------------------------------------------\n\ */", fn, filename); } void banner(FILE *fd, const char *text) { int i; fprintf(fd, "\n\n/"); for (i = 0; i < 78; i++) fputc('*', fd); fprintf(fd, "\\\n *%76s*\n * %-75s*\n *%76s*\n\\", "", text, ""); for (i = 0; i < 78; i++) fputc('*', fd); fprintf(fd, "/\n"); } void identify(FILE *fd, const char *fn) { time_t t = time(NULL), *p = &t; char tmp[256]; char *source_date_epoch; source_date_epoch = getenv("SOURCE_DATE_EPOCH"); if (source_date_epoch) { ULONG64 epoch; if (sscanf(source_date_epoch, SOAP_ULONG_FORMAT, &epoch) == 1 && epoch != 0) t = epoch; } strftime(tmp, 256, "%Y-%m-%d %H:%M:%S GMT", gmtime(p)); fprintf(fd, "\n\nSOAP_SOURCE_STAMP(\"@(#) %s ver " VERSION " %s\")\n", fn, tmp); } void compile(Table *table) { Entry *p; Tnode *typ; Pragma *pragma; int classflag = 0; int found; int filenum; const char *s; char base[1024]; found = 0; for (p = table->list; p; p = p->next) if (p->info.typ->type == Tfun && !(p->info.sto & Sextern)) found = 1; if (!found) Sflag = Cflag = Lflag = 1; /* no service operations were found */ if (*dirpath) fprintf(fmsg, "Using project directory path: %s\n", dirpath); fprefix = "soap"; if (namespaceid) { prefix = namespaceid; fprintf(fmsg, "Using C++ namespace: %s\n", namespaceid); } else if (!lflag) { fprefix = prefix; } strcpy(base, prefix); if (cflag) s = ".c"; else s = ".cpp"; strcpy(soapMatlab, base); strcat(soapMatlab, "Matlab.c"); strcpy(pathsoapMatlab, dirpath); strcat(pathsoapMatlab, soapMatlab ); strcpy(soapMatlabHdr, base); strcat(soapMatlabHdr, "Matlab.h"); strcpy(pathsoapMatlabHdr, dirpath); strcat(pathsoapMatlabHdr, soapMatlabHdr); strcpy(soapStub, base); strcat(soapStub, "Stub.h"); strcpy(pathsoapStub, dirpath); strcat(pathsoapStub, soapStub); strcpy(soapH, base); strcat(soapH, "H.h"); strcpy(pathsoapH, dirpath); strcat(pathsoapH, soapH); strcpy(soapC, base); if (fflag) strcat(soapC, "C_nnn"); else strcat(soapC, "C"); strcat(soapC, s); strcpy(pathsoapC, dirpath); strcat(pathsoapC, soapC); strcpy(soapClient, base); strcat(soapClient, "Client"); strcat(soapClient, s); strcpy(pathsoapClient, dirpath); strcat(pathsoapClient, soapClient); strcpy(soapServer, base); strcat(soapServer, "Server"); strcat(soapServer, s); strcpy(pathsoapServer, dirpath); strcat(pathsoapServer, soapServer); strcpy(soapClientLib, base); strcat(soapClientLib, "ClientLib"); strcat(soapClientLib, s); strcpy(pathsoapClientLib, dirpath); strcat(pathsoapClientLib, soapClientLib); strcpy(soapServerLib, base); strcat(soapServerLib, "ServerLib"); strcat(soapServerLib, s); strcpy(pathsoapServerLib, dirpath); strcat(pathsoapServerLib, soapServerLib); strcpy(soapReadme, base); strcat(soapReadme, "Readme.md"); strcpy(pathsoapReadme, dirpath); strcat(pathsoapReadme, soapReadme); if (mflag) { fprintf(fmsg, "Saving %s Matlab definitions\n", pathsoapMatlab); fmatlab = fopen(pathsoapMatlab, "w"); if (!fmatlab) execerror("Cannot write to file"); copyrightnote(fmatlab, soapMatlab); fprintf(fmatlab, "\n#include \"%s\"\n", soapMatlabHdr); fprintf(fmsg, "Saving %s Matlab definitions\n", pathsoapMatlabHdr); fmheader = fopen(pathsoapMatlabHdr, "w"); if (!fmheader) execerror("Cannot write to file"); copyrightnote(fmheader, soapMatlabHdr); fprintf(fmheader, "\n#include \"mex.h\"\n#include \"%s\"\n", soapStub); } if (rflag) { fprintf(fmsg, "Saving %s report\n", pathsoapReadme); freport = fopen(pathsoapReadme, "w"); if (!freport) execerror("Cannot write to file"); } fprintf(fmsg, "Saving %s annotated copy of the source interface header file\n", pathsoapStub); fheader = fopen(pathsoapStub, "w"); if (!fheader) execerror("Cannot write to file"); copyrightnote(fheader, soapStub); fprintf(fheader, "\n"); for (pragma = pragmas; pragma; pragma = pragma->next) fprintf(fheader, "\n%s", pragma->pragma); fprintf(fheader, "\n\n#ifndef %sStub_H\n#define %sStub_H", prefix, prefix); if (nflag) fprintf(fheader, "\n#ifndef WITH_NONAMESPACES\n#define WITH_NONAMESPACES\n#endif"); if (namespaceid) fprintf(fheader, "\n#ifndef WITH_NOGLOBAL\n#define WITH_NOGLOBAL\n#endif"); fprintf(fheader, "\n#include \"stdsoap2.h\""); fprintf(fheader, "\n#if GSOAP_VERSION != %d\n# error \"GSOAP VERSION %d MISMATCH IN GENERATED CODE VERSUS LIBRARY CODE: PLEASE REINSTALL PACKAGE\"\n#endif\n", GSOAP_VERSION, GSOAP_VERSION); if (namespaceid) fprintf(fheader, "\n\nnamespace %s {", namespaceid); fprintf(fmsg, "Saving %s serialization functions to #include in projects\n", pathsoapH); fhead = fopen(pathsoapH, "w"); if (!fhead) execerror("Cannot write to file"); copyrightnote(fhead, soapH); fprintf(fhead, "\n\n#ifndef %sH_H\n#define %sH_H", prefix, prefix); fprintf(fhead, "\n#include \"%s\"", soapStub); if (namespaceid) fprintf(fhead, "\n\nnamespace %s {", namespaceid); fprintf(fhead, "\n#ifndef WITH_NOIDREF"); if (!cflag && !namespaceid) fprintf(fhead, "\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap*, const void*, int);"); if (!cflag && !namespaceid) fprintf(fhead, "\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap*);"); fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap*);"); fprintf(fhead, "\n#endif"); if (!cflag && !namespaceid) fprintf(fhead, "\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); fprintf(fhead, "\nSOAP_FMAC3 void * SOAP_FMAC4 soap_getelement(struct soap*, const char*, int*);"); fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap*, const void*, const char*, int, int);"); fprintf(fhead, "\nSOAP_FMAC3 void * SOAP_FMAC4 soap_dupelement(struct soap*, const void*, int);"); fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_delelement(const void*, int);"); if (!cflag && !namespaceid) fprintf(fhead, "\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap*);"); detect_cycles(); generate_header(table); generate_schema(table); if (!Sflag && !iflag && !jflag) { fprintf(fmsg, "Saving %s client call stub functions\n", pathsoapClient); fclient = fopen(pathsoapClient, "w"); if (!fclient) execerror("Cannot write to file"); copyrightnote(fclient, soapClient); fprintf(fclient, "\n\n#if defined(__BORLANDC__)"); fprintf(fclient, "\n#pragma option push -w-8060"); fprintf(fclient, "\n#pragma option push -w-8004"); fprintf(fclient, "\n#endif"); fprintf(fclient, "\n#include \"%sH.h\"", prefix); if (namespaceid) fprintf(fclient, "\n\nnamespace %s {", namespaceid); identify(fclient, soapClient); if (!Lflag) { flib = fopen(pathsoapClientLib, "w"); if (!flib) execerror("Cannot write to file"); copyrightnote(flib, soapClientLib); fprintf(fmsg, "Saving %s client stubs with serializers (use only for libs)\n", pathsoapClientLib); fprintf(flib, "\n\n/** Use this file in your project build instead of the two files %s and %s. This hides the serializer functions and avoids linking problems when linking multiple clients and servers. */\n", soapC, soapClient); /* fprintf(flib, "\n#ifndef WITH_NOGLOBAL\n#define WITH_NOGLOBAL\n#endif"); deprecated behavior */ fprintf(flib, "\n#define SOAP_FMAC3 static"); fprintf(flib, "\n#include \"%s\"", soapC); fprintf(flib, "\n#include \"%s\"", soapClient); fprintf(flib, "\n\n/* End of %s */\n", soapClientLib); fclose(flib); } } if (!Cflag && !iflag && !jflag) { fprintf(fmsg, "Saving %s server request dispatcher\n", pathsoapServer); fserver = fopen(pathsoapServer, "w"); if (!fserver) execerror("Cannot write to file"); copyrightnote(fserver, soapServer); fprintf(fserver, "\n\n#if defined(__BORLANDC__)"); fprintf(fserver, "\n#pragma option push -w-8060"); fprintf(fserver, "\n#pragma option push -w-8004"); fprintf(fserver, "\n#endif"); fprintf(fserver, "\n#include \"%sH.h\"", prefix); if (namespaceid) fprintf(fserver, "\n\nnamespace %s {", namespaceid); identify(fserver, soapServer); if (!Lflag) { flib = fopen(pathsoapServerLib, "w"); if (!flib) execerror("Cannot write to file"); copyrightnote(flib, soapServerLib); fprintf(fmsg, "Saving %s server request dispatcher with serializers (use only for libs)\n", pathsoapServerLib); fprintf(flib, "\n\n/** Use this file in your project build instead of the two files %s and %s. This hides the serializer functions and avoids linking problems when linking multiple clients and servers. */\n", soapC, soapServer); /* fprintf(flib, "\n#ifndef WITH_NOGLOBAL\n#define WITH_NOGLOBAL\n#endif"); deprecated behavior */ fprintf(flib, "\n#define SOAP_FMAC3 static"); fprintf(flib, "\n#include \"%s\"", soapC); fprintf(flib, "\n#include \"%s\"", soapServer); fprintf(flib, "\n\n/* End of %s */\n", soapServerLib); fclose(flib); } } if (!iflag && !jflag) soap_serve(table); classflag = 0; for (p = classtable->list; p; p = p->next) { if (p->info.typ->type == Tclass && p->info.typ->transient <= 0) { classflag = 1; break; } } for (p = enumtable->list; p; p = p->next) { if (p->info.typ->type == Tenumsc && p->info.typ->transient <= 0) { classflag = 1; break; } } if (classflag || Tptr[Ttemplate]) { if (cflag) semwarn("Option -c conflicts with the use of class definitions in the specified input"); } for (filenum = 1; partnum == 0; filenum++) { if (fflag) { char *t = strrchr(pathsoapC, '.'); sprintf(t-3, "%03d", filenum); *t = '.'; fprintf(fmsg, "Saving %s serialization functions (part %d)\n", pathsoapC, filenum); partnum = fflag; /* number of defs per file */ } else { fprintf(fmsg, "Saving %s serialization functions\n", pathsoapC); partnum = 1; } fout = fopen(pathsoapC, "w"); if (!fout) execerror("Cannot write to file"); copyrightnote(fout, soapC); fprintf(fout, "\n\n#if defined(__BORLANDC__)"); fprintf(fout, "\n#pragma option push -w-8060"); fprintf(fout, "\n#pragma option push -w-8004"); fprintf(fout, "\n#endif"); fprintf(fout, "\n\n#include \"%sH.h\"", prefix); if (namespaceid) fprintf(fout, "\n\nnamespace %s {", namespaceid); identify(fout, soapC); fflush(fout); if (filenum == 1) { if (!lflag) { fprintf(fout, "\n\n#ifndef WITH_NOGLOBAL"); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_getheader(struct soap *soap)\n{\n\tsoap->part = SOAP_IN_HEADER;\n\tsoap->header = soap_in_SOAP_ENV__Header(soap, \"SOAP-ENV:Header\", soap->header, NULL);\n\tsoap->part = SOAP_END_HEADER;\n\treturn soap->header == NULL;\n}"); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_putheader(struct soap *soap)\n{\n\tif (soap->version && soap->header)\n\t{\tsoap->part = SOAP_IN_HEADER;\n\t\tif (soap_out_SOAP_ENV__Header(soap, \"SOAP-ENV:Header\", 0, soap->header, \"\"))\n\t\t\treturn soap->error;\n\t\tsoap->part = SOAP_END_HEADER;\n\t}\n\treturn SOAP_OK;\n}"); if (cflag) { fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializeheader(struct soap *soap)\n{\n\tif (soap->version && soap->header)\n\t\tsoap_serialize_SOAP_ENV__Header(soap, soap->header);\n}"); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap *soap)\n{\n\tif (soap->header == NULL)\n\t{\tif ((soap->header = (struct SOAP_ENV__Header*)soap_malloc(soap, sizeof(struct SOAP_ENV__Header))))\n\t\t\tsoap_default_SOAP_ENV__Header(soap, soap->header);\n\t}\n}"); } else if ((p = entry(classtable, lookup("SOAP_ENV__Header"))) && p->info.typ->type == Tstruct) { fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializeheader(struct soap *soap)\n{\n\tif (soap->version && soap->header)\n\t\tsoap_serialize_SOAP_ENV__Header(soap, soap->header);\n}"); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap *soap)\n{\n\tif (soap->header == NULL)\n\t{\tif ((soap->header = soap_new_SOAP_ENV__Header(soap)))\n\t\t\tsoap_default_SOAP_ENV__Header(soap, soap->header);\n\t}\n}"); } else { fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializeheader(struct soap *soap)\n{\n\tif (soap->version && soap->header)\n\t\tsoap->header->soap_serialize(soap);\n}"); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap *soap)\n{\n\tif (soap->header == NULL)\n\t{\tif ((soap->header = soap_new_SOAP_ENV__Header(soap)))\n\t\t\tsoap->header->soap_default(soap);\n\t}\n}"); } fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap *soap)\n{\n\tif (soap->fault == NULL)\n\t{\tsoap->fault = soap_new_SOAP_ENV__Fault(soap, -1);\n\t\tif (soap->fault == NULL)\n\t\t\treturn;\n\t}\n\tif (soap->version == 2 && soap->fault->SOAP_ENV__Code == NULL)\n\t\tsoap->fault->SOAP_ENV__Code = soap_new_SOAP_ENV__Code(soap, -1);\n\tif (soap->version == 2 && soap->fault->SOAP_ENV__Reason == NULL)\n\t\tsoap->fault->SOAP_ENV__Reason = soap_new_SOAP_ENV__Reason(soap, -1);\n}"); if (cflag || ((p = entry(classtable, lookup("SOAP_ENV__Fault"))) && p->info.typ->type == Tstruct)) { fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializefault(struct soap *soap)\n{\n\tif (soap->fault)\n\t\tsoap_serialize_SOAP_ENV__Fault(soap, soap->fault);\n}"); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_putfault(struct soap *soap)\n{\n\tif (soap->fault)\n\t\treturn soap_put_SOAP_ENV__Fault(soap, soap->fault, \"SOAP-ENV:Fault\", \"\");\n\treturn SOAP_OK;\n}"); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_getfault(struct soap *soap)\n{\n\treturn (soap->fault = soap_get_SOAP_ENV__Fault(soap, NULL, \"SOAP-ENV:Fault\", NULL)) == NULL;\n}"); } else { fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serializefault(struct soap *soap)\n{\n\tif (soap->fault)\n\t\tsoap->fault->soap_serialize(soap);\n}"); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_putfault(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->fault)\n\t\treturn soap->fault->soap_put(soap, \"SOAP-ENV:Fault\", \"\");\n\treturn SOAP_EOM;\n}"); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_getfault(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->fault)\n\t\treturn soap->fault->soap_get(soap, \"SOAP-ENV:Fault\", NULL) == NULL;\n\treturn SOAP_EOM;\n}"); } fprintf(fout, "\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultcode(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->fault == NULL)\n\t\treturn NULL;\n\tif (soap->version == 2 && soap->fault->SOAP_ENV__Code)\n\t\treturn (const char**)(void*)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Value;\n\treturn (const char**)(void*)&soap->fault->faultcode;\n}"); fprintf(fout, "\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultsubcode(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->fault == NULL)\n\t\treturn NULL;\n\tif (soap->version == 2 && soap->fault->SOAP_ENV__Code)\n\t{\tif (soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode == NULL)\n\t\t{\tsoap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode = soap_new_SOAP_ENV__Code(soap, -1);\n\t\t\tif (soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode == NULL)\n\t\t\t\treturn NULL;\n\t\t}\n\t\treturn (const char**)(void*)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode->SOAP_ENV__Value;\n\t}\n\treturn (const char**)(void*)&soap->fault->faultcode;\n}"); fprintf(fout, "\n\nSOAP_FMAC3 const char * SOAP_FMAC4 soap_fault_subcode(struct soap *soap)\n{\n\tconst char **s = soap_faultsubcode(soap);\n\treturn s ? *s : NULL;\n}"); fprintf(fout, "\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultstring(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->fault == NULL)\n\t\treturn NULL;\n\tif (soap->version == 2 && soap->fault->SOAP_ENV__Reason)\n\t\treturn (const char**)(void*)&soap->fault->SOAP_ENV__Reason->SOAP_ENV__Text;\n\treturn (const char**)(void*)&soap->fault->faultstring;\n}"); fprintf(fout, "\n\nSOAP_FMAC3 const char * SOAP_FMAC4 soap_fault_string(struct soap *soap)\n{\n\tconst char **s = soap_faultstring(soap);\n\treturn s ? *s : NULL;\n}"); fprintf(fout, "\n\nSOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultdetail(struct soap *soap)\n{\n\tsoap_fault(soap);\n\tif (soap->fault == NULL)\n\t\treturn NULL;"); if (has_Detail_string()) fprintf(fout, "\n\tif (soap->version == 2)\n\t{\tif (soap->fault->SOAP_ENV__Detail == NULL)\n\t\t\tsoap->fault->SOAP_ENV__Detail = soap_new_SOAP_ENV__Detail(soap, -1);\n\t\treturn (const char**)(void*)&soap->fault->SOAP_ENV__Detail->__any;\n\t}"); if (has_detail_string()) fprintf(fout, "\n\tif (soap->fault->detail == NULL)\n\t\tsoap->fault->detail = soap_new_SOAP_ENV__Detail(soap, -1);\n\treturn (const char**)(void*)&soap->fault->detail->__any;\n}"); if (!has_detail_string() && !has_Detail_string()) fprintf(fout, "\n\treturn NULL;\n}"); fprintf(fout, "\n\nSOAP_FMAC3 const char * SOAP_FMAC4 soap_fault_detail(struct soap *soap)\n{\n\tconst char **s = soap_faultdetail(soap);\n\treturn s ? *s : NULL;\n}"); fprintf(fout, "\n\n#endif"); fprintf(fout, "\n\n#ifndef WITH_NOIDREF"); fprintf(fout, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap *soap)\n{"); fprintf(fout, "\n\tint t;\n\tif (soap->version == 1)\n\t{\tfor (;;)\n\t\t{\tif (!soap_getelement(soap, NULL, &t))\n\t\t\t\tif ((soap->error && soap->error != SOAP_TAG_MISMATCH) || soap_ignore_element(soap))\n\t\t\t\t\tbreak;\n\t\t}\n\t}"); fprintf(fout, "\n\tif (soap->error == SOAP_NO_TAG || soap->error == SOAP_EOF)"); fprintf(fout, "\n\t\tsoap->error = SOAP_OK;"); fprintf(fout, "\n\treturn soap->error;"); fprintf(fout, "\n}\n#endif"); if (!cflag && !namespaceid) fprintf(fout, "\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); fprintf(fout, "\nSOAP_FMAC3 void * SOAP_FMAC4 soap_getelement(struct soap *soap, const char *tag, int *type)\n{\t(void)type;"); fprintf(fout, "\n\tif (soap_peek_element(soap))\n\t\treturn NULL;"); fprintf(fout, "\n#ifndef WITH_NOIDREF\n\tif (!*soap->id || !(*type = soap_lookup_type(soap, soap->id)))\n\t\t*type = soap_lookup_type(soap, soap->href);"); fprintf(fout, "\n\tswitch (*type)\n\t{"); DBGLOG(fprintf(stderr, "\n Calling in_defs( ).")); fflush(fout); in_defs(); DBGLOG(fprintf(stderr, "\n Completed in_defs( ).")); fprintf(fout, "\n\tdefault:\n#else\n\t*type = 0;\n#endif"); fprintf(fout, "\n\t{\tconst char *t = soap->type;\n\t\tif (!*t)\n\t\t\tt = soap->tag;"); fflush(fout); in_defs2(); fprintf(fout, "\n\t\tt = soap->tag;"); in_defs3(); fprintf(fout, "\n#ifndef WITH_NOIDREF\n\t}\n#endif\n\t}\n\tsoap->error = SOAP_TAG_MISMATCH;\n\treturn NULL;\n}"); if (!cflag && !namespaceid) fprintf(fout, "\n\n#ifdef __cplusplus\n}\n#endif"); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap *soap)\n{"); fprintf(fout, "\n\tif (!soap_peek_element(soap))"); fprintf(fout, "\n\t{\tint t;"); fprintf(fout, "\n\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Unexpected element '%%s' in input (level = %%u, %%d)\\n\", soap->tag, soap->level, soap->body));"); fprintf(fout, "\n\t\tif (soap->mustUnderstand && !soap->other && !soap->fignore)"); fprintf(fout, "\n\t\t\treturn soap->error = SOAP_MUSTUNDERSTAND;"); /* old code: without option -s required SOAP_XML_STRICT to detect and flag extra elements; fprintf(fout, "\n\t\tif (((soap->mode & SOAP_XML_STRICT) && soap->part != SOAP_IN_HEADER) || !soap_match_tag(soap, soap->tag, \"SOAP-ENV:\"))\n\t\t{\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"REJECTING element '%%s'\\n\", soap->tag));\n\t\t\treturn soap->error = SOAP_TAG_MISMATCH;\n\t\t}"); */ fprintf(fout, "\n\t\tif ((%s!soap->fignore && soap->part != SOAP_IN_HEADER) || !soap_match_tag(soap, soap->tag, \"SOAP-ENV:\"))\n\t\t{\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"REJECTING element '%%s'\\n\", soap->tag));\n\t\t\treturn soap->error = SOAP_TAG_MISMATCH;\n\t\t}", strict_check()); fprintf(fout, "\n\t\tif (!*soap->id || !soap_getelement(soap, NULL, &t))"); fprintf(fout, "\n\t\t{\tsoap->peeked = 0;"); fprintf(fout, "\n\t\t\tif (soap->fignore)\n\t\t\t\tsoap->error = soap->fignore(soap, soap->tag);\n\t\t\telse\n\t\t\t\tsoap->error = SOAP_OK;"); fprintf(fout, "\n\t\t\tDBGLOG(TEST, if (!soap->error) SOAP_MESSAGE(fdebug, \"IGNORING element '%%s'\\n\", soap->tag));"); fprintf(fout, "\n\t\t\tif (!soap->error && soap->body && soap_ignore(soap))"); fprintf(fout, "\n\t\t\t\treturn soap->error;"); fprintf(fout, "\n\t\t}"); fprintf(fout, "\n\t}"); fprintf(fout, "\n\treturn soap->error;"); fprintf(fout, "\n}"); fprintf(fout, "\n\n#ifndef WITH_NOIDREF"); fprintf(fout, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap *soap)\n{\n\tint i;\n\tstruct soap_plist *pp;"); fprintf(fout, "\n\tif (soap->version == 1 && soap->encodingStyle && !(soap->mode & (SOAP_XML_TREE | SOAP_XML_GRAPH)))"); fprintf(fout, "\n\t\tfor (i = 0; i < SOAP_PTRHASH; i++)"); fprintf(fout, "\n\t\t\tfor (pp = soap->pht[i]; pp; pp = pp->next)"); fprintf(fout, "\n\t\t\t\tif (pp->mark1 == 2 || pp->mark2 == 2)"); fprintf(fout, "\n\t\t\t\t\tif (soap_putelement(soap, pp->ptr, SOAP_MULTIREFTAG, pp->id, pp->type))\n\t\t\t\t\t\treturn soap->error;"); fprintf(fout, "\n\treturn SOAP_OK;\n}\n#endif"); if (!cflag && !namespaceid) fprintf(fout, "\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); fprintf(fout, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap *soap, const void *ptr, const char *tag, int id, int type)\n{\t(void)tag;"); fprintf(fout, "\n\tswitch (type)\n\t{"); fflush(fout); out_defs(); fprintf(fout, "\n\tcase 0:\n\t\treturn SOAP_OK;\n\t}\n\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"soap_putelement '%%s' failed for type %%d in %s\\n\", tag ? tag : \"\", type));", cstring(pathsoapC, 0)); fprintf(fout, "\n\treturn soap_element_empty(soap, tag); /* unknown type to serialize */\n}"); if (!cflag && !namespaceid) fprintf(fout, "\n#ifdef __cplusplus\n}\n#endif"); fprintf(fout, "\n\n#ifndef WITH_NOIDREF"); if (!cflag && !namespaceid) fprintf(fout, "\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); if (is_anytype_flag) { fprintf(fout, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap *soap, const void *ptr, int type)\n{"); fprintf(fout, "\n\t(void)soap; (void)ptr; (void)type; /* appease -Wall -Werror */"); fprintf(fout, "\n\tswitch (type)\n\t{"); fflush(fout); mark_defs(); fprintf(fout, "\n\t}\n}"); } else { fprintf(fout, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap *soap, const void *ptr, int type)\n{"); fprintf(fout, "\n\t(void)soap; (void)ptr; (void)type; /* appease -Wall -Werror */"); fprintf(fout, "\n}"); } if (!cflag && !namespaceid) fprintf(fout, "\n#ifdef __cplusplus\n}\n#endif"); fprintf(fout, "\n#endif"); if (!cflag && !namespaceid) fprintf(fout, "\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); fprintf(fout, "\n\nSOAP_FMAC3 void * SOAP_FMAC4 soap_dupelement(struct soap *soap, const void *ptr, int type)\n{"); if (Ecflag) { fprintf(fout, "\n\tif (!ptr)\n\t\treturn NULL;"); fprintf(fout, "\n\tswitch (type)\n\t{"); fflush(fout); dup_defs(); fprintf(fout, "\n\t}"); } else { fprintf(fout, "(void)soap; (void)ptr; (void)type; /* appease -Wall -Werror */"); } fprintf(fout, "\n\treturn NULL;\n}"); if (!cflag && !namespaceid) fprintf(fout, "\n#ifdef __cplusplus\n}\n#endif"); if (!cflag && !namespaceid) fprintf(fout, "\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif"); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_delelement(const void *ptr, int type)\n{"); if (Edflag) { fprintf(fout, "\n\tif (!ptr)\n\t\treturn;"); fprintf(fout, "\n\tswitch (type)\n\t{"); fflush(fout); del_defs(); fprintf(fout, "\n\t}"); } else { fprintf(fout, "(void)ptr; (void)type; /* appease -Wall -Werror */"); } fprintf(fout, "\n}"); if (!cflag && !namespaceid) fprintf(fout, "\n#ifdef __cplusplus\n}\n#endif"); } if (!cflag) { fprintf(fhead, "\nSOAP_FMAC3 void * SOAP_FMAC4 %s_instantiate(struct soap*, int, const char*, const char*, size_t*);", prefix); fprintf(fout, "\n\nSOAP_FMAC3 void * SOAP_FMAC4 %s_instantiate(struct soap *soap, int t, const char *type, const char *arrayType, size_t *n)\n{\t(void)type;\n\tswitch (t)\n\t{", prefix); if (classtable) { for (p = classtable->list; p; p = p->next) { if ((p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && !is_transient(p->info.typ)) { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#ifndef WITH_NOGLOBAL"); fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)%s_instantiate_%s(soap, -1, type, arrayType, n);", soap_type(p->info.typ), fprefix, c_ident(p->info.typ)); if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#endif"); } } } if (typetable) { for (p = typetable->list; p; p = p->next) { if ((p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && !is_transient(p->info.typ)) { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#ifndef WITH_NOGLOBAL"); fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)%s_instantiate_%s(soap, -1, type, arrayType, n);", soap_type(p->info.typ), fprefix, c_ident(p->info.typ)); if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#endif"); } } } for (typ = Tptr[Ttemplate]; typ; typ = typ->next) if (typ->ref && !is_transient(typ)) fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)%s_instantiate_%s(soap, -1, type, arrayType, n);", soap_type(typ), fprefix, c_ident(typ)); fprintf(fout, "\n\t}\n\treturn NULL;\n}"); fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 %s_fdelete(struct soap *soap, struct soap_clist*);", prefix); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 %s_fdelete(struct soap *soap, struct soap_clist *p)", prefix); fprintf(fout, "\n{\n\t(void)soap; /* appease -Wall -Werror */\n\tif (!p->ptr)\n\t\treturn SOAP_OK;\n\tswitch (p->type)\n\t{"); if (classtable) { for (p = classtable->list; p; p = p->next) { if ((p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && !is_transient(p->info.typ)) { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#ifndef WITH_NOGLOBAL"); fprintf(fout, "\n\tcase %s:", soap_type(p->info.typ)); fprintf(fout, "\n\t\tif (p->size < 0)\n\t\t\tSOAP_DELETE(soap, static_cast<%s*>(p->ptr), %s);\n\t\telse\n\t\t\tSOAP_DELETE_ARRAY(soap, static_cast<%s*>(p->ptr), %s);\n\t\tbreak;", c_type(p->info.typ), c_type(p->info.typ), c_type(p->info.typ), c_type(p->info.typ)); if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#endif"); } } } if (typetable) { for (p = typetable->list; p; p = p->next) if (p->info.typ->type == Tclass || p->info.typ->type == Tstruct) /* && is_external(p->info.typ)) */ { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#ifndef WITH_NOGLOBAL"); fprintf(fout, "\n\tcase %s:", soap_type(p->info.typ)); fprintf(fout, "\n\t\tif (p->size < 0)\n\t\t\tSOAP_DELETE(soap, static_cast<%s*>(p->ptr), %s);\n\t\telse\n\t\t\tSOAP_DELETE_ARRAY(soap, static_cast<%s*>(p->ptr), %s);\n\t\tbreak;", c_type(p->info.typ), c_type(p->info.typ), c_type(p->info.typ), c_type(p->info.typ)); if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#endif"); } } for (typ = Tptr[Ttemplate]; typ; typ = typ->next) { if (typ->ref && !is_transient(typ)) { fprintf(fout, "\n\tcase %s:", soap_type(typ)); fprintf(fout, "\n\t\tif (p->size < 0)\n\t\t\tSOAP_DELETE(soap, static_cast<%s*>(p->ptr), %s);\n\t\telse\n\t\t\tSOAP_DELETE_ARRAY(soap, static_cast<%s*>(p->ptr), %s);\n\t\tbreak;", c_type(typ), c_type(typ), c_type(typ), c_type(typ)); } } fprintf(fout, "\n\tdefault:\n\t\treturn SOAP_ERR;"); fprintf(fout, "\n\t}\n\treturn SOAP_OK;"); fprintf(fout, "\n}"); fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 %s_fbase(int, int);", prefix); fprintf(fout, "\n\n#ifdef WIN32\n#pragma warning(push)\n// do not warn on switch w/o cases\n#pragma warning(disable:4065)\n#endif"); fprintf(fout, "\nSOAP_FMAC3 int SOAP_FMAC4 %s_fbase(int t, int b)", prefix); found = 0; if (classtable) { for (p = classtable->list; p; p = p->next) { if ((p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && p->info.typ->base && !is_transient(p->info.typ)) { Entry *e = entry(classtable, p->info.typ->base); if (e && !is_transient(e->info.typ)) { found = 1; break; } } } } if (found) { fprintf(fout, "\n{\n\tdo\n\t{\tswitch (t)\n\t\t{\n"); for (p = classtable->list; p; p = p->next) { if ((p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && p->info.typ->base && !is_transient(p->info.typ)) { Entry *e = entry(classtable, p->info.typ->base); if (e && !is_transient(e->info.typ)) fprintf(fout, "\n\t\tcase %s: t = %s; break;", soap_type(p->info.typ), soap_type(e->info.typ)); } } fprintf(fout, "\n\t\tdefault: return 0;\n\t\t}\n\t}\n\twhile (t != b);\n\treturn 1;\n}"); } else fprintf(fout, "\n{\n\t(void)t; (void)b; /* appease -Wall -Werror */\n\treturn 0;\n}"); fprintf(fout, "\n#ifdef WIN32\n#pragma warning(pop)\n#endif"); if (Tptr[Ttemplate] || classtable) { fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 %s_finsert(struct soap*, int, int, void*, size_t, const void*, void**);", prefix); fprintf(fout, "\n\n#ifndef WITH_NOIDREF"); fprintf(fout, "\n#ifdef WIN32\n#pragma warning(push)\n// do not warn on switch w/o cases\n#pragma warning(disable:4065)\n#endif"); fprintf(fout, "\nSOAP_FMAC3 void SOAP_FMAC4 %s_finsert(struct soap *soap, int t, int tt, void *p, size_t index, const void *q, void **x)", prefix); fprintf(fout, "\n{\n\t(void)soap; (void)t; (void)p; (void)index; (void)q; (void)x; /* appease -Wall -Werror */"); fprintf(fout, "\n\tswitch (tt)\n\t{"); for (typ = Tptr[Ttemplate]; typ; typ = typ->next) { if (typ->ref && !is_transient(typ)) { fprintf(fout, "\n\tcase %s:", soap_type(typ)); if (is_smart(typ)) { Tnode *ref = (Tnode*)typ->ref; if (ref->type == Tclass) fprintf(fout, "\n\t\tif (t == %s || %s_fbase(t, %s))\n\t\t{\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Smart pointer %s type=%%d location=%%p object=%%p\\n\", t, p, q));", soap_type(reftype(typ->ref)), prefix, soap_type(reftype(typ->ref)), c_type(typ)); else fprintf(fout, "\n\t\tif (t == %s)\n\t\t{\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Smart pointer %s type=%%d location=%%p object=%%p\\n\", t, p, q));", soap_type(reftype(typ->ref)), c_type(typ)); if (is_smart_shared(typ)) { fprintf(fout, "\n\t\t\tif (!*x)\n\t\t\t\t*(%s)(*x = (void*)p) = %s<%s>(**(%s)q);", c_type_id(typ, "*"), make_shared(typ), c_type(typ->ref), c_type_id(typ->ref, "**")); fprintf(fout, "\n\t\t\telse\n\t\t\t\t*(%s)p = *(%s)(*x);", c_type_id(typ, "*"), c_type_id(typ, "*")); } else { fprintf(fout, "\n\t\t\t*(*(%s)p = %s(SOAP_NEW(soap, %s))) = **(%s)q;", c_type_id(typ, "*"), c_type(typ), c_type(typ->ref), c_type_id(typ->ref, "**")); } } else { Tnode *ref = (Tnode*)typ->ref; if (ref->type == Tpointer && ((Tnode*)ref->ref)->type == Tclass) fprintf(fout, "\n\t\tif (t == %s || %s_fbase(t, %s))\n\t\t{\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Container %s insert type=%%d in %%d location=%%p object=%%p at index=%%lu\\n\", t, tt, p, q, (unsigned long)index));", soap_type(reftype(ref)), prefix, soap_type(reftype(ref)), c_type(typ)); else fprintf(fout, "\n\t\tif (t == %s)\n\t\t{\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Container %s insert type=%%d in %%d location=%%p object=%%p at index=%%lu\\n\", t, tt, p, q, (unsigned long)index));", soap_type(reftype(ref)), c_type(typ)); if (is_smart(ref) && strcmp(typ->id->name, "std::set")) { if (!strcmp(ref->id->name, "std::vector") || !strcmp(ref->id->name, "std::deque")) fprintf(fout, "\n\t\t\t%s::iterator i = ((%s)p)->begin() + index;", c_type(typ), c_type_id(typ, "*")); else fprintf(fout, "\n\t\t\t%s::iterator i = ((%s)p)->begin();\n\t\t\twhile (index-- > 0)\n\t\t\t\t++i;", c_type(typ), c_type_id(typ, "*")); if (is_smart_shared(ref)) fprintf(fout, "\n\t\t\tif (!*x)\n\t\t\t\t*(%s)(*x = &*i) = %s<%s>(**(%s)q);\n\t\t\telse\n\t\t\t\t*i = *(%s)*x;", c_type_id(ref, "*"), make_shared(ref), c_type(ref->ref), c_type_id(ref->ref, "**"), c_type_id(ref, "*")); else fprintf(fout, "\n\t\t\t*(*i = %s(SOAP_NEW(soap, %s))) = **(%s)q;", c_type(ref), c_type(ref->ref), c_type_id(ref->ref, "**")); } else { if (!strcmp(typ->id->name, "std::vector") || !strcmp(typ->id->name, "std::deque")) fprintf(fout, "\n\t\t\t(*(%s)p)[index] = *(%s)q;", c_type_id(typ, "*"), c_type_id(ref, "*")); else if (!strcmp(typ->id->name, "std::set")) fprintf(fout, "\n\t\t\t((%s)p)->insert(*(%s)q);", c_type_id(typ, "*"), c_type_id(ref, "*")); else fprintf(fout, "\n\t\t\t%s::iterator i = ((%s)p)->begin();\n\t\t\twhile (index-- > 0)\n\t\t\t\t++i;\n\t\t\t*i = *(%s)q;", c_type(typ), c_type_id(typ, "*"), c_type_id(ref, "*")); } } fprintf(fout, "\n\t\t}\n\t\tbreak;"); } } if (classtable) { for (p = classtable->list; p; p = p->next) { if (!is_transient(p->info.typ)) { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#ifndef WITH_NOGLOBAL"); fprintf(fout, "\n\tcase %s:", soap_type(p->info.typ)); fprintf(fout, "\n\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Copy %s type=%%d location=%%p object=%%p\\n\", t, p, q));", c_type(p->info.typ)); fprintf(fout, "\n\t\t*(%s*)p = *(%s*)q;\n\t\tbreak;", c_type(p->info.typ), c_type(p->info.typ)); if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#endif"); } } } if (typetable) { for (p = typetable->list; p; p = p->next) { if ((p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && !is_transient(p->info.typ)) { if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#ifndef WITH_NOGLOBAL"); fprintf(fout, "\n\tcase %s:", soap_type(p->info.typ)); fprintf(fout, "\n\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Copy %s type=%%d location=%%p object=%%p\\n\", t, p, q));", c_type(p->info.typ)); fprintf(fout, "\n\t\t*(%s*)p = *(%s*)q;\n\t\tbreak;", c_type(p->info.typ), c_type(p->info.typ)); if (is_header_or_fault(p->info.typ) || is_body(p->info.typ)) fprintf(fout, "\n#endif"); } } } fprintf(fout, "\n\tdefault:\n\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Could not insert type=%%d in %%d\\n\", t, tt));"); fprintf(fout, "\n\t}"); fprintf(fout, "\n}"); fprintf(fout, "\n#ifdef WIN32\n#pragma warning(pop)\n#endif"); fprintf(fout, "\n#endif"); } } } generate_defs(); if (namespaceid) fprintf(fout, "\n\n} // namespace %s\n", namespaceid); fprintf(fout, "\n\n#if defined(__BORLANDC__)"); fprintf(fout, "\n#pragma option pop"); fprintf(fout, "\n#pragma option pop"); fprintf(fout, "\n#endif"); fprintf(fout, "\n\n/* End of %s */\n", soapC); fclose(fout); } if (namespaceid) fprintf(fhead, "\n\n} // namespace %s\n", namespaceid); fprintf(fhead, "\n\n#endif"); fprintf(fhead, "\n\n/* End of %s */\n", soapH); fclose(fhead); if (namespaceid) fprintf(fheader, "\n\n} // namespace %s\n", namespaceid); fprintf(fheader, "\n\n#endif"); fprintf(fheader, "\n\n/* End of %s */\n", soapStub); fclose(fheader); if (mflag) { DBGLOG(fprintf(stderr, "\n Calling matlab_def_table( ).")); matlab_def_table(table); DBGLOG(fprintf(stderr, "\n Completed matlab_def_table( ).")); fclose(fmatlab); fclose(fmheader); } if (!Sflag && !iflag && !jflag) { if (namespaceid) fprintf(fclient, "\n\n} // namespace %s\n", namespaceid); fprintf(fclient, "\n\n#if defined(__BORLANDC__)"); fprintf(fclient, "\n#pragma option pop"); fprintf(fclient, "\n#pragma option pop"); fprintf(fclient, "\n#endif"); fprintf(fclient, "\n\n/* End of %s */\n", soapClient); fclose(fclient); } if (!Cflag && !iflag && !jflag) { if (namespaceid) fprintf(fserver, "\n\n} // namespace %s\n", namespaceid); fprintf(fserver, "\n\n#if defined(__BORLANDC__)"); fprintf(fserver, "\n#pragma option pop"); fprintf(fserver, "\n#pragma option pop"); fprintf(fserver, "\n#endif"); fprintf(fserver, "\n\n/* End of %s */\n", soapServer); fclose(fserver); } if (rflag) { char tmp[256]; time_t T = time(NULL); strftime(tmp, 256, "%a %b %d %Y %H:%M:%S UTC", gmtime(&T)); fprintf(freport, "\n [1]: https://www.genivia.com/images/go-up.png\n\n"); fprintf(freport, "--------------------------------------------------------------------------------\n\n_Generated on %s by soapcpp2 v" VERSION " for %s._\n_The gSOAP XML Web services tools are Copyright (C) Robert van Engelen, Genivia Inc. All Rights Reserved._\n", tmp, filename); fclose(freport); } } void gen_class(FILE *fd, Entry *p) { Entry *q; Tnode *typ = p->info.typ; const char *x, *s; const char *nse = ns_qualifiedElement(typ); const char *nsa = ns_qualifiedAttribute(typ); if (!typ->ref) { if (!is_transient(typ) && !is_external(typ) && !is_volatile(typ) && !is_imported(typ)) { sprintf(errbuf, "%s declared at %s:%d has no content, requires members", c_type(typ), p->filename, p->lineno); semwarn(errbuf); } return; } if (fd == freport) { fprintf(freport, "\n\n", c_ident(typ)); fprintf(freport, "### `%s`\n\n", c_type(typ)); if (soap_version < 0 && (is_header_or_fault(typ) || is_body(typ))) { fprintf(freport, "This %s is for internal use only\n\n", typ->type == Tstruct ? "struct" : typ->type == Tclass ? "class" : "union"); return; } else { fprintf(freport, "This %s is declared in [%s](%s) at line %d, ", typ->type == Tstruct ? "struct" : typ->type == Tclass ? "class" : "union", p->filename, p->filename, p->lineno); } } if (is_imported(typ)) return; x = xsi_type(typ); if (!x || !*x) x = wsdl_type(typ, ""); if (fd != freport) { fprintf(fd, "\n\n/* %s:%d */", p->filename, p->lineno); if (is_header_or_fault(typ) || is_body(typ)) fprintf(fd, "\n#ifndef WITH_NOGLOBAL"); fprintf(fd, "\n#ifndef %s\n", soap_type(typ)); if (namespaceid) fprintf(fd, "#define %s (-%d)\n", soap_type(typ), typ->num); /* namespaced SOAP_TYPE is negative to avoid clashes */ else fprintf(fd, "#define %s (%d)\n", soap_type(typ), typ->num); } if (typ->recursive) { if (fd == freport) fprintf(freport, "is recursive, meaning it may (in)directly reference itself through its (base or derived class) members, and "); else fprintf(fd, "/* Type %s is a recursive data type, (in)directly referencing itself through its (base or derived class) members */\n", typ->id->name); } if (is_volatile(typ)) { if (fd == freport) fprintf(freport, "is volatile, meaning it is declared external of the data binding interface and not redeclared here"); else fprintf(fd, "#if 0 /* Volatile: declared external of the data binding interface and not redeclared here */\n"); } else if (is_transient(typ)) { if (fd == freport) fprintf(freport, "is transient, meaning not serializable"); else fprintf(fd, "/* Transient type: */\n"); } else if (is_invisible(typ->id->name)) { if (fd == freport) fprintf(freport, "is a wrapper, meaning that it wraps data and is not visible in XML"); else fprintf(fd, "/* Wrapper: */\n"); x = ""; } else if (is_attachment(typ)) { if (fd == freport) fprintf(freport, "is an attachment, meaning binary data attached as a MTOM/MIME/DIME attachment or included as *`xsd:base64Binary`* base64 with `__ptr` pointing to the data of length `__size` and `id`, `type`, and `options` identifying and describing the attachment data (use the `SOAP_ENC_MTOM` or the `SOAP_ENC_MIME` flag and set at least `type` to create an attachment )"); else fprintf(fd, "/* binary data attached as MTOM/MIME/DIME attachment or included as *`xsd:base64Binary`* base64: */\n"); } else if (is_hexBinary(typ)) { if (fd == freport) fprintf(freport, "is binary, meaning serialized as *`xsd:hexBinary`* hex binary data with `__ptr` pointing to the data of length `__size`"); else fprintf(fd, "/* hexBinary XML schema type: */\n"); } else if (is_binary(typ)) { if (fd == freport) fprintf(freport, "is binary, meaning serialized as *`xsd:base64Binary`* base64 binary data with `__ptr` pointing to the data of length `__size`"); else fprintf(fd, "/* base64Binary XML schema type: */\n"); } else if (is_discriminant(typ)) { if (fd == freport) fprintf(freport, "is a choice, meaning a union with a union variant selector"); else fprintf(fd, "/* Choice: */\n"); } else if ((q = is_dynamic_array(typ))) { if (has_ns(typ) || is_untyped(typ)) { if (fd == freport) fprintf(freport, "is a sequence of elements, meaning that it has a pointer member `%s` pointing to an array of `%s` values and has an array size `%s`", ident(q->sym->name), c_type(q->info.typ->ref), ident(q->next->sym->name)); else fprintf(fd, "/* Sequence of %s schema type: */\n", x); } else { if (fd == freport) { int d = get_Darraydims(typ); if (!d) fprintf(freport, "is a SOAP-encoded array, meaning that the type name lacks a prefix and it has a member `%s` pointing to an array of `%s` values and has an array size member `%s`", ident(q->sym->name), c_type(q->info.typ->ref), ident(q->next->sym->name)); else fprintf(freport, "is a %dD SOAP-encoded array, meaning that the type name lacks a prefix and it has a member `%s` pointing to an array of `%s` values and has an array `%s[%d]` of sizes for each dimension", d, ident(q->sym->name), c_type(q->info.typ->ref), ident(q->next->sym->name), d); } else { if (!eflag && soap_version >= 0) { sprintf(errbuf, "SOAP-encoded array '%s' is specific to SOAP encoding only and not compliant with WS-I Basic Profile 1.0a", c_type(typ)); compliancewarn(errbuf); } fprintf(fd, "/* SOAP encoded array of %s schema type: */\n", x); } } } else if (is_primclass(typ)) { if (fd == freport) fprintf(freport, "is a simple content wrapper *`%s`*, meaning it wraps a primitive type", x); else fprintf(fd, "/* simple XML schema type '%s': */\n", x); } else if (is_header_or_fault(typ)) { if (fd == freport) { s = ident(typ->id->name); fprintf(freport, "is the SOAP protocol *`<%s>`* element", ns_convert(p->sym->name)); if (!strcmp(s, "SOAP_ENV__Header")) { int flag = 0; fprintf(freport, " with message-specific child elements that are mandatory to process when attributed with *`mustUnderstand=\"true\"`*. Headers are usually added and processed by plugins. To remove the SOAP Header when sending or returning a message, set `soap->header = NULL`. Use `soap_header(struct soap *soap)` to allocate a `%s` which will be pointed to by `soap->header`, then initialize it with `soap_default_SOAP_ENV__Header(soap, soap->header)` and set one or more of its data members (if any):\n\n", c_type(typ)); if (typ->ref && ((Table*)typ->ref)->list) { for (q = ((Table*)typ->ref)->list; q; q = q->next) { if (q->info.typ->type != Tfun && !is_transient(q->info.typ)) { fprintf(fd, "- `%s%s` ", c_storage(q->info.sto), c_type_id(q->info.typ, q->sym->name)); if (q->info.sto & SmustUnderstand) fprintf(fd, "element %s with mustUnderstand=\"true\">", ns_add(q, nse)); else fprintf(fd, "element %s", ns_add(q, nse)); if ((q->info.typ->type == Tclass || q->info.typ->type == Tstruct || q->info.typ->type == Tenum || q->info.typ->type == Tenumsc || is_typedef(q->info.typ)) && !is_stdstr(q->info.typ)) fprintf(freport, ", see also %s ", ident(q->info.typ->id->name), ident(q->info.typ->id->name)); fprintf(freport, "\n"); } } flag = 1; } if (!flag) fprintf(freport, "*No SOAP headers are applicable*"); fprintf(freport, "\n\nThis struct will be auto-generated when it is not explicitly declared in an interface header file,"); } else if (!strcmp(s, "SOAP_ENV__Fault")) { fprintf(freport, " with fault information and details returned by a service that triggered the error. At the server side, a fault can be explicitly set within a service operation by calling and returning:\n\n- `int soap_sender_fault(struct soap *soap, const char *faultstring, const char *XML)` return this error code when the sender is at fault (irrecoverable)\n- `int soap_receiver_fault(struct soap *soap, const char *faultstring, const char *XML)` return this error code when the receiver is at fault (recoverable, sender may retry)\n\nA service operation may also return an HTTP status or error code (200 to 599).\n\nAt the client side the (proxy) call returns the error code which is also stored in `soap->error`. The fault structure is pointed to by `soap->fault`. The fault can be displayed with:\n\n- `void soap_print_fault(struct soap *soap, FILE *fd)` display fault\n- `void soap_print_fault_location(struct soap *soap, FILE *fd)` display the location of the fault in the XML message that caused it\n- `void soap_sprint_fault(struct soap *soap, char *buf, size_t len)` write fault to buffer\n- `void soap_stream_fault(struct soap *soap, std::ostream&)` write fault to stream\n- `const char *soap_fault_subcode(struct soap *soap)` returns the SOAP Fault subcode QName string or NULL when absent\n- `const char *soap_fault_string(struct soap *soap)` returns the SOAP Fault string/reason or NULL when absent\n- `const char *soap_fault_detail(struct soap *soap)` returns the SOAP Fault detail XML string or NULL when absent\n- `const char **soap_faultsubcode(struct soap *soap)` returns a pointer to the SOAP Fault to set this QName string\n- `const char **soap_faultstring(struct soap *soap)` returns a pointer to the SOAP Fault string/reason to set this string\n- `const char **soap_faultdetail(struct soap *soap)` returns a pointer to the SOAP Fault detail XML string to set this string or returns NULL when not accessible"); fprintf(freport, "\n\nThis struct will be auto-generated when it is not explicitly declared in an interface header file"); } else if (!strcmp(s, "SOAP_ENV__Detail")) { int flag = 0; fprintf(freport, " with details returned by a service that triggered the error. Fault details are added and processed by plugins by setting the `detail` (for SOAP 1.1) or `SOAP_ENV__Detail` (for SOAP 1.2) member of `struct SOAP_ENV__Fault` and then setting one ore more of the detail members:\n\n"); if (typ->ref && ((Table*)typ->ref)->list) { for (q = ((Table*)typ->ref)->list; q; q = q->next) { if (q->info.typ->type != Tfun && !is_transient(q->info.typ)) { fprintf(fd, "- `%s%s` ", c_storage(q->info.sto), c_type_id(q->info.typ, q->sym->name)); if (is_XML(q->info.typ) && is_invisible(q->sym->name)) fprintf(fd, "catch-all XML in literal XML string"); else if (is_XML(q->info.typ)) fprintf(fd, "element *`<%s>`* with XML in literal XML string", ns_add(q, nse)); else if (is_anyType(q->info.typ)) fprintf(fd, "catch-all XML in DOM"); else if (is_anytype(q)) { if (namespaceid) fprintf(fd, "element *`<%s>`* serialized with C/C++ type `%s` = `SOAP_TYPE_%s_`", ns_add(q->next, nse), ident(q->sym->name), namespaceid); else fprintf(fd, "element *`<%s>`* serialized with C/C++ type `%s` = `SOAP_TYPE_`", ns_add(q->next, nse), ident(q->sym->name)); q = q->next; } else fprintf(fd, "element *`<%s>`*", ns_add(q, nse)); if ((q->info.typ->type == Tclass || q->info.typ->type == Tstruct || q->info.typ->type == Tenum || q->info.typ->type == Tenumsc || is_typedef(q->info.typ)) && !is_stdstr(q->info.typ)) fprintf(freport, ", see also %s ", ident(q->info.typ->id->name), ident(q->info.typ->id->name)); fprintf(fd, "\n"); } } flag = 1; } if (!flag) fprintf(freport, "No SOAP Fault details are applicable"); fprintf(freport, "\n\nThis struct will be auto-generated when it is not explicitly declared in an interface header file,"); } else { fprintf(freport, ". This struct is for internal use and will be auto-generated when not explicitly declared.\n\n"); gen_report_hr(); return; } } else fprintf(fd, "/* %s: */\n", ident(typ->id->name)); } else if (typ->type == Tunion) { if (fd == freport) fprintf(freport, "is serializable, but only when used as a member of a struct or class with a union variant selector"); else fprintf(fd, "/* union serializable only when used as a member of a struct or class with a union variant selector */\n"); } else if (x && *x) { if (fd == freport) fprintf(freport, "is serialized as XML schema type *`%s`*", x); else fprintf(fd, "/* complex XML schema type '%s': */\n", x); } else if (fd == freport) fprintf(freport, "is serializable"); if (fd == freport && is_mutable(p)) fprintf(freport, " and is declared mutable, meaning that multiple declarations in interface header files are collected into one structure"); if (fd == freport && typ->type == Tstruct) { int flag = 0; Tnode *r; for (r = Tptr[Tfun]; r; r = r->next) { if (!strcmp(r->id->name, p->sym->name)) { if (*x) fprintf(freport, " and is internally used as the operation request element *`<%s>`* with the request parameters of service operation `%s()`", x, ident(r->id->name)); else fprintf(freport, " and is internally used to wrap the request element(s) of the service operation `%s()`", ident(r->id->name)); flag = 1; } else if (r->response == p) { fprintf(freport, " and is internally used as the operation response element *`<%s>`* with the response parameters of service operation `%s()`", x, ident(r->id->name)); flag = 1; } } if (flag) { fprintf(freport, ".\n\n"); gen_report_hr(); return; } } fflush(fd); if (fd == freport) fprintf(freport, ", and has the following auto-completed declaration in %s:\n", soapStub); if (typ->type == Tstruct) { int permission = -1; int flag = 0; DBGLOG(fprintf(stderr, "\nstruct %s\n", typ->id->name)); if (cflag) { if (fd == freport) fprintf(freport, "\n struct %s {", ident(typ->id->name)); else fprintf(fd, "struct %s {", ident(typ->id->name)); } else { if (fd == freport) fprintf(freport, "\n struct SOAP_CMAC %s {", ident(typ->id->name)); else fprintf(fd, "struct SOAP_CMAC %s {", ident(typ->id->name)); } for (q = ((Table*)typ->ref)->list; q; q = q->next) { if (!cflag && permission != (q->info.sto & (Sprivate | Sprotected))) { if (q->info.sto & Sprivate) fprintf(fd, "\n private:"); else if (q->info.sto & Sprotected) fprintf(fd, "\n protected:"); else fprintf(fd, "\n public:"); permission = (q->info.sto & (Sprivate | Sprotected)); } if (cflag && q->info.typ->type == Tfun) continue; if (cflag && (q->info.sto & Stypedef)) continue; if (flag) flag = 0; else if (q->info.typ->type == Tfun || (q->info.sto & Stypedef)) ; else if (is_anyAttribute(q->info.typ)) fprintf(fd, "\n /** XML DOM attribute list */"); else if (q->info.sto & Sattribute) { if (q->info.minOccurs >= 1) fprintf(fd, "\n /** Required attribute '%s' of XML schema type '%s' */", ns_add(q, nsa), wsdl_type(q->info.typ, "")); else fprintf(fd, "\n /** Optional attribute '%s' of XML schema type '%s' */", ns_add(q, nsa), wsdl_type(q->info.typ, "")); } else if (is_soapref(q->info.typ)) fprintf(fd, "\n /** Context that manages this object */"); else if (q->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fd, "\n /** Not serialized */"); else if (q->info.sto & SmustUnderstand) fprintf(fd, "\n /** MustUnderstand */"); else if (!is_dynamic_array(typ) && is_repetition(q)) { if (q->info.maxOccurs > 1) fprintf(fd, "\n /** Sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements '%s' of XML schema type '%s'", q->info.minOccurs, q->info.maxOccurs, ns_add(q->next, nse), wsdl_type(q->next->info.typ, "")); else if (q->info.minOccurs >= 1) fprintf(fd, "\n /** Sequence of at least " SOAP_LONG_FORMAT " elements '%s' of XML schema type '%s'", q->info.minOccurs, ns_add(q->next, nse), wsdl_type(q->next->info.typ, "")); else fprintf(fd, "\n /** Sequence of elements '%s' of XML schema type '%s'", ns_add(q->next, nse), wsdl_type(q->next->info.typ, "")); fprintf(fd, " stored in dynamic array %s of length %s */", ident(q->next->sym->name), ident(q->sym->name)); flag = 1; } else if (is_anytype(q)) { fprintf(fd, "\n /** Any type of element '%s' assigned to %s with its SOAP_TYPE_ assigned to %s */\n /** Do not create a cyclic data structure through this member unless SOAP encoding or SOAP_XML_GRAPH are used for id-ref serialization */", ns_add(q->next, nse), ident(q->next->sym->name), ident(q->sym->name)); flag = 1; } else if (is_choice(q)) { Entry *r; fprintf(fd, "\n /** Union with %s variant selector %s set to one of:", c_type(q->next->info.typ), ident(q->sym->name)); if ((Table*)q->next->info.typ->ref) for (r = ((Table*)q->next->info.typ->ref)->list; r; r = r->next) fprintf(fd, " %s", soap_union_member(q->next->info.typ, r)); fprintf(fd, " */"); flag = 1; } else if (is_anyType(q->info.typ)) fprintf(fd, "\n /** XML DOM element node graph */"); else if (is_item(q)) fprintf(fd, "\n /** Simple content of XML schema type '%s' wrapped by this struct */", wsdl_type(q->info.typ, "")); else if (q->info.typ->type != Tfun && q->info.typ->type != Tunion && !(q->info.sto & (Sconst | Sprivate | Sprotected)) && !(q->info.sto & Sattribute) && !is_transient(q->info.typ) && !is_external(q->info.typ) && strncmp(q->sym->name, "__", 2)) { if (q->info.maxOccurs > 1) fprintf(fd, "\n /** Sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements '%s' of XML schema type '%s' */", q->info.minOccurs, q->info.maxOccurs, ns_add(q, nse), wsdl_type(q->info.typ, "")); else if (q->info.minOccurs >= 1) { if (q->info.nillable) fprintf(fd, "\n /** Required nillable (xsi:nil when NULL) element '%s' of XML schema type '%s' */", ns_add(q, nse), wsdl_type(q->info.typ, "")); else fprintf(fd, "\n /** Required element '%s' of XML schema type '%s' */", ns_add(q, nse), wsdl_type(q->info.typ, "")); } else fprintf(fd, "\n /** Optional element '%s' of XML schema type '%s' */", ns_add(q, nse), wsdl_type(q->info.typ, "")); } else if (is_external(q->info.typ)) fprintf(fd, "\n /** Typedef %s with custom serializer for %s */", c_type_sym(q->info.typ), c_type(q->info.typ)); else if (is_pointer_to_derived(q)) fprintf(fd, "\n /** Transient pointer to a derived type value that replaces the value of this base type %s when non-NULL */", c_type(typ)); else if (is_transient(q->info.typ)) fprintf(fd, "\n /** Transient (not serialized) */"); else if (is_imported(q->info.typ)) fprintf(fd, "\n /** Type imported from %s */", q->info.typ->imported); if (fd != freport) { if (!is_dynamic_array(typ) && !is_primclass(typ)) { if (!strncmp(q->sym->name, "__size", 6)) { if (q->info.typ->type != Tint && q->info.typ->type != Tsize) { sprintf(errbuf, "Member field '%s' is not an int or size_t type in struct '%s'", q->sym->name, typ->id->name); semwarn(errbuf); } else if (!q->next || (q->next->info.typ->type != Tpointer && !is_smart(q->next->info.typ))) { sprintf(errbuf, "Member field '%s' is not followed by a pointer member field in struct '%s'", q->sym->name, typ->id->name); semwarn(errbuf); } } else if (q->info.typ->type == Tint && !strncmp(q->sym->name, "__type", 6)) { if (!q->next || ((q->next->info.typ->type != Tpointer || ((Tnode*)q->next->info.typ->ref)->type != Tvoid))) { sprintf(errbuf, "Member field '%s' is not followed by a void pointer member field in struct '%s'", q->sym->name, typ->id->name); semwarn(errbuf); } } else if (q->info.typ->type == Tint && !strncmp(q->sym->name, "__union", 7)) { if (!q->next || ((q->next->info.typ->type != Tunion))) { sprintf(errbuf, "Member field '%s' is not followed by a union member field in struct '%s'", q->sym->name, typ->id->name); semwarn(errbuf); } } else if ((q->info.typ->type == Tint || q->info.typ->type == Tsize) && (q->info.sto & Sspecial)) { if (!q->next || (q->next->info.typ->type != Tpointer && !is_smart(q->next->info.typ) && (q->next->info.typ->type != Tunion))) { sprintf(errbuf, "Member field '%s' is not followed by a pointer or union member field in struct '%s'", q->sym->name, typ->id->name); semwarn(errbuf); } } } } fprintf(fd, "\n %s", c_storage(q->info.sto)); if (q->sym == typ->id && q->info.typ->type == Tfun) /* to emit constructor in a struct: constructor has no return value */ ((FNinfo*)q->info.typ->ref)->ret = mknone(); fprintf(fd, "%s", c_type_id(q->info.typ, q->sym->name)); if (q->info.sto & Sconstobj) fprintf(fd, " const"); if (q->info.sto & Sfinal) fprintf(fd, " final"); if (q->info.sto & Soverride) fprintf(fd, " override"); if (q->info.sto & Sconst) fprintf(fd, "%s;", c_init(q)); else { fprintf(fd, ";"); if (q->info.hasval) { if (q->info.fixed) fprintf(fd, "\t/**< initialized with fixed value%s */", c_init(q)); else fprintf(fd, "\t/**< initialized with default value%s */", c_init(q)); } else if (q->info.ptrval) { if (q->info.fixed) fprintf(fd, "\t/**< optional with fixed value%s */", c_init(q)); else fprintf(fd, "\t/**< optional with default value%s */", c_init(q)); } } } if (!cflag && !is_transient(typ) && !is_volatile(typ)) { fprintf(fd, "\n public:\n /** Return unique type id %s */\n long soap_type() const { return %s; }", soap_type(typ), soap_type(typ)); if ((s = union_member(typ))) { if (fd != freport) { sprintf(errbuf, "struct '%s' cannot be assigned a default constructor because it is directly or indirectly used as a member of union '%s'", typ->id->name, ident(s)); semwarn(errbuf); } } else { if (!has_constructor(typ)) { Table *t; Entry *p; fprintf(fd, "\n /** Constructor with member initializations */"); gen_constructor(fd, typ); for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Treference || p->info.typ->type == Trvalueref) { sprintf(errbuf, "no constructor for '%s' to explicitly initialize the reference member '%s'", typ->id->name, p->sym->name); semwarn(errbuf); } } } } /* not necessary to add a default destructor, keep the C -> C++ transparency of structs if (!has_destructor(typ)) fprintf(fd, "\n\t ~%s() { }", ident(typ->id->name)); */ } if (Ecflag) fprintf(fd, "\n /** Friend duplicator */\n friend SOAP_FMAC1 %s * SOAP_FMAC2 %s_dup_%s(struct soap*, %s*, %s);", c_type(typ), fprefix, c_ident(typ), c_type(typ), c_type_constptr_id(typ, "const*")); if (Edflag) fprintf(fd, "\n /** Friend deleter */\n friend SOAP_FMAC1 void SOAP_FMAC2 %s_del_%s(%s);", fprefix, c_ident(typ), c_type_constptr_id(typ, "const*")); fprintf(fd, "\n /** Friend allocator */\n friend SOAP_FMAC1 %s * SOAP_FMAC2 %s_instantiate_%s(struct soap*, int, const char*, const char*, size_t*);", c_ident(typ), fprefix, c_ident(typ)); } if (!((Table*)typ->ref)->list) { if (cflag && fd != freport) fprintf(fd, "\n#ifdef WITH_NOEMPTYSTRUCT\n\tchar dummy;\t/* empty struct is a GNU extension */\n#endif"); } if (fd == freport) { fprintf(freport, "\n };\n\n"); if (!is_transient(p->info.typ) && !is_header_or_fault(p->info.typ)) { const char *ns = prefix_of(p->sym->name); int uf = uflag; uflag = 1; gen_report_members(p, nsa, nse); fprintf(freport, "The following operations on `%s` are available:\n\n", c_type(p->info.typ)); if (cflag) { fprintf(freport, "- `(%s *)soap_malloc(struct soap*, sizeof(%s))` raw managed allocation\n", c_type(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `%s *soap_new_%s(struct soap*, int n)` managed allocation with default initialization of one `%s` when `n` = 1 or array `%s[n]` when `n` > 1\n", c_type(p->info.typ), c_ident(p->info.typ), c_type(p->info.typ), c_type(p->info.typ)); } else { fprintf(freport, "- `%s *soap_new_%s(struct soap*)` managed allocation with default initialization\n", c_type(p->info.typ), c_ident(p->info.typ)); fprintf(freport, "- `%s *soap_new_%s(struct soap*, int n)` managed allocation with default initialization of array `%s[n]`\n", c_type(p->info.typ), c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `%s *soap_new_req_%s(struct soap*", c_type(p->info.typ), c_ident(p->info.typ)); gen_report_req_params(p->info.typ); fprintf(freport, ")` managed allocation with required members assigned the values of these parameters, with all other members default initialized\n"); fprintf(freport, "- `%s *soap_new_set_%s(struct soap*", c_type(p->info.typ), c_ident(p->info.typ)); gen_report_set_params(p->info.typ); fprintf(freport, ")` managed allocation with the public members assigned the values of these parameters\n"); } fprintf(freport, "- `void soap_default_%s(struct soap*, %s*)` (re)set to default initialization values\n", c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `int soap_write_%s(struct soap*, const %s*)` serialize to XML, returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `int soap_read_%s(struct soap*, %s*)` deserialize from XML, returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `int soap_PUT_%s(struct soap*, const char *URL, const %s*)` REST PUT XML, returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `int soap_PATCH_%s(struct soap*, const char *URL, const %s*)` REST PATCH XML, returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `int soap_POST_send_%s(struct soap*, const char *URL, const %s*)` REST POST send XML (should be followed by a `soap_POST_recv_Type`), returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `int soap_POST_recv_%s(struct soap*, %s*)` REST POST receive XML (after a `soap_POST_send_Type`), returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `int soap_GET_%s(struct soap*, const char *URL, %s*)` REST GET XML, returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type(p->info.typ)); if (!wflag) { if (!is_invisible(p->sym->name) && !has_ns_eq("xsd", p->sym->name) && !is_header_or_fault(typ)) { s = ns_of(p->sym->name); if (s && *s && has_ns_eq(NULL, p->sym->name)) fprintf(freport, "\nThe component of XML schema type *`%s`* in schema \"[%s](#doc-namespaces)\" is:\n\n", x, s); else fprintf(freport, "\nThe component of XML schema type *`%s`* is:\n\n", x); gen_schema_type(freport, NULL, p, ns, ns, 1, NULL, NULL); } } fprintf(freport, "\n"); uflag = uf; } } else fprintf(fd, "\n};"); } else if (typ->type == Tclass) { int permission = -1; int flag = 0; DBGLOG(fprintf(stderr, "\nclass %s\n", typ->id->name)); if (fd == freport) fprintf(fd, "\n class SOAP_CMAC %s", ident(typ->id->name)); else fprintf(fd, "class SOAP_CMAC %s", ident(typ->id->name)); if (typ->base) fprintf(fd, " : public %s", ident(typ->base->name)); fprintf(fd, " {"); for (q = ((Table*)typ->ref)->list; q; q = q->next) { if (permission != (q->info.sto & (Sprivate | Sprotected))) { if (q->info.sto & Sprivate) fprintf(fd, "\n private:"); else if (q->info.sto & Sprotected) fprintf(fd, "\n protected:"); else fprintf(fd, "\n public:"); permission = (q->info.sto & (Sprivate | Sprotected)); } if (is_anyAttribute(q->info.typ)) fprintf(fd, "\n /// XML DOM attribute list"); else if (q->info.sto & Sattribute) { if (q->info.minOccurs >= 1) fprintf(fd, "\n /// Required attribute '%s' of XML schema type '%s'", ns_add(q, nsa), wsdl_type(q->info.typ, "")); else fprintf(fd, "\n /// Optional attribute '%s' of XML schema type '%s'", ns_add(q, nsa), wsdl_type(q->info.typ, "")); } if (flag) flag = 0; else if (q->info.typ->type == Tfun || (q->info.sto & Stypedef)) ; else if (is_soapref(q->info.typ)) fprintf(fd, "\n /// Context that manages this object"); else if (q->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fd, "\n /// Not serialized"); else if (q->info.sto & SmustUnderstand) fprintf(fd, "\n /// MustUnderstand"); else if (!is_dynamic_array(typ) && is_repetition(q)) { if (q->info.maxOccurs > 1) fprintf(fd, "\n /// Sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements '%s' of XML schema type '%s'", q->info.minOccurs, q->info.maxOccurs, ns_add(q->next, nse), wsdl_type(q->next->info.typ, "")); else if (q->info.minOccurs >= 1) fprintf(fd, "\n /// Sequence of at least " SOAP_LONG_FORMAT " elements '%s' of XML schema type '%s'", q->info.minOccurs, ns_add(q->next, nse), wsdl_type(q->next->info.typ, "")); else fprintf(fd, "\n /// Sequence of elements '%s' of XML schema type '%s'", ns_add(q->next, nse), wsdl_type(q->next->info.typ, "")); fprintf(fd, " stored in dynamic array %s of length %s", ident(q->next->sym->name), ident(q->sym->name)); flag = 1; } else if (is_anytype(q)) { fprintf(fd, "\n /// Any type of element '%s' assigned to %s with its SOAP_TYPE_ assigned to %s\n /// Do not create a cyclic data structure through this member unless SOAP encoding or SOAP_XML_GRAPH are used for id-ref serialization", ns_add(q->next, nse), ident(q->next->sym->name), ident(q->sym->name)); flag = 1; } else if (is_choice(q)) { Entry *r; fprintf(fd, "\n /// Union with %s variant selector %s set to one of:", c_type(q->next->info.typ), ident(q->sym->name)); for (r = ((Table*)q->next->info.typ->ref)->list; r; r = r->next) fprintf(fd, " %s", soap_union_member(q->next->info.typ, r)); flag = 1; } else if (is_anyType(q->info.typ)) fprintf(fd, "\n /// XML DOM element node graph"); else if (is_item(q)) fprintf(fd, "\n /// Simple content of XML schema type '%s' wrapped by this struct", wsdl_type(q->info.typ, "")); else if (q->info.typ->type != Tfun && q->info.typ->type != Tunion && !(q->info.sto & (Sconst | Sprivate | Sprotected)) && !(q->info.sto & Sattribute) && !is_transient(q->info.typ) && !is_external(q->info.typ) && strncmp(q->sym->name, "__", 2)) { if (q->info.maxOccurs > 1) fprintf(fd, "\n /// Sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements '%s' of XML schema type '%s'", q->info.minOccurs, q->info.maxOccurs, ns_add(q, nse), wsdl_type(q->info.typ, "")); else if (q->info.minOccurs >= 1) { if (q->info.nillable) fprintf(fd, "\n /// Required nillable (xsi:nil when NULL) element '%s' of XML schema type '%s'", ns_add(q, nse), wsdl_type(q->info.typ, "")); else fprintf(fd, "\n /// Required element '%s' of XML schema type '%s'", ns_add(q, nse), wsdl_type(q->info.typ, "")); } else fprintf(fd, "\n /// Optional element '%s' of XML schema type '%s'", ns_add(q, nse), wsdl_type(q->info.typ, "")); } else if (is_external(q->info.typ)) fprintf(fd, "\n /// Typedef %s with custom serializer for %s", c_type_sym(q->info.typ), c_type(q->info.typ)); else if (is_pointer_to_derived(q)) fprintf(fd, "\n /// Transient pointer to a derived type value that replaces the value of this base type %s when non-NULL", c_type(typ)); else if (is_transient(q->info.typ)) fprintf(fd, "\n /// Transient (not serialized)"); else if (is_imported(q->info.typ)) fprintf(fd, "\n /// Type imported from %s", q->info.typ->imported); if (fd != freport) { if (!is_dynamic_array(typ) && !is_primclass(typ)) { if (!strncmp(q->sym->name, "__size", 6)) { if (q->info.typ->type != Tint && q->info.typ->type != Tsize) { sprintf(errbuf, "Member field '%s' is not an int or size_t type in class '%s'", q->sym->name, typ->id->name); semwarn(errbuf); } else if (!q->next || (q->next->info.typ->type != Tpointer && !is_smart(q->next->info.typ))) { sprintf(errbuf, "Member field '%s' is not followed by a pointer member field in class '%s'", q->sym->name, typ->id->name); semwarn(errbuf); } } else if (q->info.typ->type == Tint && !strncmp(q->sym->name, "__type", 6)) { if (!q->next || ((q->next->info.typ->type != Tpointer || ((Tnode*)q->next->info.typ->ref)->type != Tvoid))) { sprintf(errbuf, "Member field '%s' is not followed by a void pointer member field in class '%s'", q->sym->name, typ->id->name); semwarn(errbuf); } } else if (q->info.typ->type == Tint && !strncmp(q->sym->name, "__union", 7)) { if (!q->next || ((q->next->info.typ->type != Tunion))) { sprintf(errbuf, "Member field '%s' is not followed by a union member field in class '%s'", q->sym->name, typ->id->name); semwarn(errbuf); } } else if ((q->info.typ->type == Tint || q->info.typ->type == Tsize) && (q->info.sto & Sspecial)) { if (!q->next || (q->next->info.typ->type != Tpointer && !is_smart(q->next->info.typ) && (q->next->info.typ->type != Tunion))) { sprintf(errbuf, "Member field '%s' is not followed by a pointer or union member field in class '%s'", q->sym->name, typ->id->name); semwarn(errbuf); } } } } fprintf(fd, "\n %s", c_storage(q->info.sto)); fprintf(fd, "%s", c_type_id(q->info.typ, q->sym->name)); if (q->info.sto & Sconstobj) fprintf(fd, " const"); if (q->info.sto & Sfinal) fprintf(fd, " final"); if (q->info.sto & Soverride) fprintf(fd, " override"); if (q->info.sto & Sabstract) fprintf(fd, " = 0;"); else if (q->info.sto & Sconst) fprintf(fd, "%s;", c_init(q)); else { fprintf(fd, ";"); if (q->info.hasval) { if (q->info.fixed) fprintf(fd, "\t///< initialized with fixed value%s", c_init(q)); else fprintf(fd, "\t///< initialized with default value%s", c_init(q)); } else if (q->info.ptrval) { if (q->info.fixed) fprintf(fd, "\t///< optional with fixed value%s", c_init(q)); else fprintf(fd, "\t///< optional with default value%s", c_init(q)); } } } if (!is_transient(typ) && !is_volatile(typ)) { fprintf(fd, "\n public:"); fprintf(fd, "\n /// Return unique type id %s", soap_type(typ)); fprintf(fd, "\n virtual long soap_type(void) const { return %s; }", soap_type(typ)); fprintf(fd, "\n /// (Re)set members to default values"); fprintf(fd, "\n virtual void soap_default(struct soap*);"); fprintf(fd, "\n /// Serialize object to prepare for SOAP 1.1/1.2 encoded output (or with SOAP_XML_GRAPH) by analyzing its (cyclic) structures"); fprintf(fd, "\n virtual void soap_serialize(struct soap*) const;"); if (Etflag) fprintf(fd, "\n virtual void soap_traverse(struct soap*, const char *s, soap_walker, soap_walker);"); fprintf(fd, "\n /// Output object in XML, compliant with SOAP 1.1 encoding style, return error code or SOAP_OK"); fprintf(fd, "\n virtual int soap_put(struct soap*, const char *tag, const char *type) const;"); fprintf(fd, "\n /// Output object in XML, with tag and optional id attribute and xsi:type, return error code or SOAP_OK"); fprintf(fd, "\n virtual int soap_out(struct soap*, const char *tag, int id, const char *type) const;"); fprintf(fd, "\n /// Get object from XML, compliant with SOAP 1.1 encoding style, return pointer to object or NULL on error"); fprintf(fd, "\n virtual void *soap_get(struct soap*, const char *tag, const char *type);"); fprintf(fd, "\n /// Get object from XML, with matching tag and type (NULL matches any tag and type), return pointer to object or NULL on error"); fprintf(fd, "\n virtual void *soap_in(struct soap*, const char *tag, const char *type);"); fprintf(fd, "\n /// Return a new object of type %s, default initialized and not managed by a soap context", c_type(typ)); fprintf(fd, "\n virtual %s *soap_alloc(void) const { return SOAP_NEW_UNMANAGED(%s); }", c_type(typ), c_type(typ)); if (Ecflag) { fprintf(fd, "\n /// Return a duplicate of this object by deep copying, replicating all deep cycles and shared pointers when a managing soap context is provided as argument.\n /// Deep copy is a tree when argument is NULL, but the presence of deep cycles will lead to non-termination.\n /// Use flag SOAP_XML_TREE with a managing context to copy into a tree without cycles and pointers to shared objects"); fprintf(fd, "\n virtual %s *soap_dup(struct soap *soap = NULL, void *dest = NULL) const { return %s_dup_%s(soap, (%s*)dest, this); }", c_type(typ), fprefix, c_ident(typ), c_type(typ)); } if (Edflag) { fprintf(fd, "\n /// Delete heap-allocated members of this object by deep deletion ONLY IF this object and all of its (deep) members are not managed by a soap context AND the deep structure is a tree (no cycles and co-referenced objects by way of multiple (non-smart) pointers pointing to the same data)\n /// Can be safely used after soap_dup(NULL) to delete the deep copy"); fprintf(fd, "\n virtual void soap_del(void) const { %s_del_%s(this); }", fprefix, c_ident(typ)); } if ((s = union_member(typ))) { if (fd != freport) { sprintf(errbuf, "class '%s' cannot be assigned a default constructor because it is directly or indirectly used as a member of union '%s'", typ->id->name, ident(s)); semwarn(errbuf); } } else { if (!has_constructor(typ)) { Table *t; Entry *p; fprintf(fd, "\n public:\n /// Constructor with default initializations"); gen_constructor(fd, typ); for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Treference || p->info.typ->type == Trvalueref) { sprintf(errbuf, "no constructor for '%s' to explicitly initialize the reference member '%s'", typ->id->name, p->sym->name); semwarn(errbuf); } } } } if (!has_destructor(typ)) fprintf(fd, "\n virtual ~%s() { }", c_ident(typ)); } if (Ecflag) fprintf(fd, "\n /// Friend duplicator\n friend SOAP_FMAC1 %s * SOAP_FMAC2 %s_dup_%s(struct soap*, %s*, %s);", c_type(typ), fprefix, c_ident(typ), c_type(typ), c_type_constptr_id(typ, "const*")); if (Edflag) fprintf(fd, "\n /// Friend deleter\n friend SOAP_FMAC1 void SOAP_FMAC2 %s_del_%s(%s);", fprefix, c_ident(typ), c_type_constptr_id(typ, "const*")); fprintf(fd, "\n /// Friend allocator used by soap_new_%s(struct soap*, int)\n friend SOAP_FMAC1 %s * SOAP_FMAC2 %s_instantiate_%s(struct soap*, int, const char*, const char*, size_t*);", c_ident(typ), c_ident(typ), fprefix, c_ident(typ)); /* the use of 'friend' causes problems linking static functions. Adding these friends could enable serializing protected/private members (which is not implemented) fprintf(fd, "\n friend %s *soap_in_%s(struct soap*, const char*, %s*, const char*);", typ->id->name, typ->id->name, typ->id->name); fprintf(fd, "\n friend int soap_out_%s(struct soap*, const char*, int, const %s*, const char*);", typ->id->name, typ->id->name); */ } if (fd == freport) { fprintf(freport, "\n };\n\n"); if (!is_transient(p->info.typ) && !is_header_or_fault(p->info.typ)) { const char *ns = prefix_of(p->sym->name); int uf = uflag; uflag = 1; gen_report_members(p, nsa, nse); fprintf(freport, "The following operations on `%s` are available:\n\n", c_type(p->info.typ)); fprintf(freport, "- `%s *soap_new_%s(struct soap*)` managed allocation with default initialization\n", c_type(p->info.typ), c_ident(p->info.typ)); fprintf(freport, "- `%s *soap_new_%s(struct soap*, int n)` managed allocation of array `%s[n]`\n", c_type(p->info.typ), c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `%s *soap_new_req_%s(struct soap*", c_type(p->info.typ), c_ident(p->info.typ)); gen_report_req_params(p->info.typ); fprintf(freport, ")` managed allocation with required members assigned the values of these parameters, with all other members default initialized\n"); fprintf(freport, "- `%s *soap_new_set_%s(struct soap*", c_type(p->info.typ), c_ident(p->info.typ)); gen_report_set_params(p->info.typ); fprintf(freport, ")` managed allocation with public members assigned the values of these parameters\n"); if (is_external(p->info.typ) || is_volatile(p->info.typ)) fprintf(freport, "- `void soap_default_%s(struct soap*, %s*)` (re)set members to default initialization values\n", c_ident(p->info.typ), c_type(p->info.typ)); else fprintf(freport, "- `void %s::soap_default(struct soap*)` (re)set members to default values\n", c_type(p->info.typ)); fprintf(freport, "- `int soap_write_%s(struct soap*, const %s*)` serialize to XML, returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `int soap_PUT_%s(struct soap*, const char *URL, const %s*)` REST PUT XML, returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `int soap_PATCH_%s(struct soap*, const char *URL, const %s*)` REST PATCH XML, returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `int soap_POST_send_%s(struct soap*, const char *URL, const %s*)` REST POST send XML (MUST be followed by a `soap_POST_recv_Type`), returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `int soap_read_%s(struct soap*, %s*)` deserialize from XML, returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `int soap_GET_%s(struct soap*, const char *URL, %s*)` REST GET XML, returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `int soap_POST_recv_%s(struct soap*, %s*)` REST POST receive XML (after a `soap_POST_send_Type`), returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type(p->info.typ)); if (!wflag) { if (!is_invisible(p->sym->name) && !has_ns_eq("xsd", p->sym->name) && !is_header_or_fault(typ)) { s = ns_of(p->sym->name); if (s && *s && has_ns_eq(NULL, p->sym->name)) fprintf(freport, "\nThe component of XML schema type *`%s`* in schema \"[%s](#doc-namespaces)\" is:\n\n", x, s); else fprintf(freport, "\nThe component of XML schema type *`%s`* is:\n\n", x); gen_schema_type(freport, NULL, p, ns, ns, 1, NULL, NULL); } } fprintf(freport, "\n"); uflag = uf; } } else fprintf(fd, "\n};"); } else if (typ->type == Tunion) { int i = 1; if (fd == freport) fprintf(fd, "\n union %s\n {", ident(typ->id->name)); else fprintf(fd, "union %s\n{", ident(typ->id->name)); for (q = ((Table*)typ->ref)->list; q; q = q->next) { if (q->info.typ->type == Tfun) { if (q->sym == typ->id) /* to emit constructor in a union: constructor has no return value */ ((FNinfo*)q->info.typ->ref)->ret = mknone(); } else { fprintf(fd, "\n #define %s\t(%d)\t/**< union variant selector value for member %s */", soap_union_member(typ, q), i, ident(q->sym->name)); i++; if (q->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fd, "\n /** Not serialized */"); else if (is_transient(q->info.typ)) fprintf(fd, "\n /** Transient (not serialized) */"); else if (is_external(q->info.typ)) fprintf(fd, "\n /** Typedef %s with custom serializer for %s */", c_type_sym(q->info.typ), c_type(q->info.typ)); if (q->info.sto & Sattribute) { sprintf(errbuf, "union '%s' contains attribute declarations", typ->id->name); semwarn(errbuf); } } fprintf(fd, "\n %s", c_storage(q->info.sto)); fprintf(fd, "%s;", c_type_id(q->info.typ, q->sym->name)); } if (!((Table*)typ->ref)->list) { if (cflag && fd != freport) fprintf(fd, "\n#ifdef WITH_NOEMPTYSTRUCT\n\tchar dummy;\t/* empty union is a GNU extension */\n#endif"); } if (fd == freport) fprintf(fd, "\n };\n\n"); else fprintf(fd, "\n};"); } if (fd == freport) { gen_report_hr(); } else { if (is_volatile(typ)) fprintf(fd, "\n#endif"); fprintf(fd, "\n#endif"); if (is_header_or_fault(typ) || is_body(typ)) fprintf(fd, "\n#endif"); } fflush(fd); } void gen_constructor(FILE *fd, Tnode *typ) { Table *t = typ->ref; Entry *p; const char *sep = " :"; if (!t) return; fprintf(fd, "\n %s()", c_ident(typ)); for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) continue; if ((p->info.sto & Sstatic)) continue; if (p->info.hasval) fprintf(fd, "%s %s(%s)", sep, ident(p->sym->name), c_init_a(p, "")); else fprintf(fd, "%s %s()", sep, ident(p->sym->name)); sep = ","; } fprintf(fd, " { }"); fflush(fd); } void generate_header(Table *t) { Service *sp; Entry *p, *q; int i; if (rflag) { fprintf(freport, "
\n@tableofcontents @section README\n\nTo view this file in the Firefox web browser, download readmeviewer.html from https://www.genivia.com/files/readmeviewer.html.zip, unzip and copy it to the same directory where this soapReadme.md file is located, then open it in Firefox to view the contents of soapReadme.md.\n\nThis markdown file is compatible with Doxygen.\n
\n\n"); fprintf(freport, "## Overview {#doc-overview}\n\nThis report was generated by soapcpp2 v" VERSION " for interface header file [%s](%s) with options -r %s%s%s%s%s%s%s%s%s\n\n", filename, filename, copt ? copt : "", soap_version < 0 ? " -0 " : " ", Cflag ? "-C " : "", Sflag ? "-S " : "", Lflag ? "-L " : "", iflag ? "-i " : jflag ? "-j " : "", wflag ? "-w " : "", namespaceid ? "-q" : strcmp(prefix, "soap") ? "-p" : "", strcmp(prefix, "soap") ? prefix : ""); for (sp = services; sp; sp = sp->next) { if (sp->documentation) { gen_text(freport, sp->documentation); fprintf(freport, "\n\n"); } } fprintf(freport, "### Tools\n\nThe **wsdl2h** command line tool takes a set of WSDL and XSD files to generate a data binding interface header file. This interface header file is similar to a C/C++ header file and contains declarations of C/C++ types and functions with explanatory comments, directives, and annotations. Types are declared in this interface header file as serializable. Functions are declared as Web service operations for the client and server sides.\n\nThe **soapcpp2** command line tool takes an interface header file (i.e. a header file) such as [%s](%s) to generate the data binding implementation. This implementation includes XML serializers and source code for the client and server side. An interface header file for soapcpp2 can be a regular C/C++ header file with type and function declarations (without code), and include annotations to declare XML schema-related properties.\n\n", filename, filename); fprintf(freport, "### Files\n\nThe following %s source code files were generated by soapcpp2 for interface header file [%s](%s):\n\n", cflag ? "C" : copt ? copt + 1 : "c++", filename, filename); fprintf(freport, "- [%s](%s) contains an annotated copy of [%s](%s) and of the imported files (if any), where most of the information in this report [%s](%s) is sourced from (this header file also #includes \"stdsoap2.h\")\n", soapStub, pathsoapStub, filename, filename, soapReadme, pathsoapReadme); fprintf(freport, "- [%s](%s) declares allocation and (de)serialization functions for each C/C++ type, to #include in projects (this header file also #includes \"%s\")\n", soapH, pathsoapH, soapStub); fprintf(freport, "- [%s](%s) defines allocation and (de)serialization functions for each C/C++ type, to compile with a project\n", soapC, pathsoapC); if (!Sflag) { if (!iflag && !jflag) { fprintf(freport, "- [%s](%s) defines client call stub functions for service invocation, to compile with a project\n", soapClient, pathsoapClient); if (!Lflag) fprintf(freport, "- [%s](%s) combines %s with %s into one \"library\" file, intended for combining multiple clients and servers that are separately generated with soapcpp2 option -p, thereby preventing serializer naming conflicts (this makes serialization functions locally visible to the client/server as static functions)\n", soapClientLib, pathsoapClientLib, soapC, soapClient); } else { fprintf(freport, "- See [Web client proxy class](#doc-client) for the client-side source code files to use\n"); } } if (!Cflag) { if (!iflag && !jflag) { fprintf(freport, "- [%s](%s) defines server functions, including the service dispatcher that calls back-end service operations, to compile with a project\n", soapServer, pathsoapServer); if (!Lflag) fprintf(freport, "- [%s](%s) combines %s with %s into one \"library\" file, intended for combining multiple clients and servers that are separately generated with soapcpp2 option -p, thereby preventing serializer function naming conflicts (this makes serialization functions locally visible to the client/server as static functions)\n", soapServerLib, pathsoapServerLib, soapC, soapServer); } else { fprintf(freport, "- See [Web service class](#doc-server) for the server-side source code files to use\n"); } } fprintf(freport, "\nAlso compile stdsoap2.%s (and dom.%s %s XML DOM is used) with a project (or link libgsoapssl%s.a) and use the following compile-time options:\n\n- `-DWITH_OPENSSL` to enable HTTPS with OpenSSL\n- `-DWITH_GNUTLS` to enable HTTPS with GNUTLS\n- `-DWITH_DOM` is required when using the WS-Security plugin\n- `-DWITH_GZIP` to enable message compression\n\nSee the gSOAP documentation for additional options.\n\n### Contents\n\nThis report has the following contents describing the data binding interface types, and the client- and the server-side operations (if any):\n\n", cflag ? "c" : "cpp", cflag ? "c" : "cpp", is_anyType_flag ? "because" : "if", cflag ? "" : "++"); if (enumtable && enumtable->list) fprintf(freport, "- [enumeration types](#doc-enums)\n"); if (classtable && classtable->list) fprintf(freport, "- [%sstruct and union types](#doc-classes)\n", cflag ? "" : "class, "); if (typetable && typetable->list) fprintf(freport, "- [typedefs](#doc-typedefs)\n"); fprintf(freport, "- [summary of serializable types](#doc-types)\n"); fprintf(freport, "- [schemas and namespaces](#doc-namespaces)\n"); if (!Sflag) { if (!iflag && !jflag) fprintf(freport, "- [Web client operations](#doc-client) lists the service operations to call\n"); else fprintf(freport, "- [Web client proxy class](#doc-client) lists the methods to invoke\n"); } if (!Cflag) { if (!iflag && !jflag) fprintf(freport, "- [Web server operations](#doc-server) lists the service operations to implement when developing a service\n"); else fprintf(freport, "- [Web service class](#doc-server) lists the methods to implement when developing a service\n"); } fprintf(freport, "\n"); gen_report_hr(); } if (enumtable && enumtable->list) { Table *r = mktable(NULL); banner(fheader, "Enumeration Types"); fflush(fheader); if (rflag) fprintf(freport, "## Enumeration Types {#doc-enums}\n\n\n\n"); for (p = enumtable->list; p; p = p->next) { if (rflag && p->info.typ->ref) fprintf(freport, "\n"); } freetable(r); if (rflag) { int uf = uflag; uflag = 1; fprintf(freport, "
Type Declared Serializable Bitmask Values
%s %s:%d %s %s ", c_ident(p->info.typ), c_type(p->info.typ), p->filename, p->lineno, !is_transient(p->info.typ) ? "yes" : "", is_mask(p->info.typ) ? "yes" : ""); if (!is_imported(p->info.typ) && (!is_transient(p->info.typ) || p->info.typ->ref)) { int enum64 = False; const char *x; x = xsi_type(p->info.typ); if (!x || !*x) x = wsdl_type(p->info.typ, ""); fprintf(fheader, "\n\n/* %s:%d */", p->filename, p->lineno); fprintf(fheader, "\n#ifndef %s", soap_type(p->info.typ)); if (namespaceid) fprintf(fheader, "\n#define %s (-%d)\n", soap_type(p->info.typ), p->info.typ->num); /* namespaced SOAP_TYPE is negative to avoid clashes */ else fprintf(fheader, "\n#define %s (%d)", soap_type(p->info.typ), p->info.typ->num); if (is_volatile(p->info.typ)) fprintf(fheader, "\n#if 0 /* Volatile: not declared here */"); if (is_mask(p->info.typ)) fprintf(fheader, "\n/* Bitmask %s */", x); else fprintf(fheader, "\n/* %s */", x); if ((Table*)p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (q->info.val.i > 0x7FFFLL || q->info.val.i < -0x8000LL) { enum64 = True; break; } } } if (cflag && p->info.typ->type == Tenum && p->sym->token == TYPE) fprintf(fheader, "\ntypedef "); else fprintf(fheader, "\n"); if (p->info.typ->width == 4 || is_mask(p->info.typ)) { if (p->info.typ->type == Tenumsc) { if (enum64) fprintf(fheader, "enum class %s : int64_t {", ident(p->info.typ->id->name)); else fprintf(fheader, "enum class %s {", ident(p->info.typ->id->name)); } else fprintf(fheader, "enum %s {", ident(p->info.typ->id->name)); } else { const char *t; switch (p->info.typ->width) { case 1: t = "int8_t"; break; case 2: t = "int16_t"; break; case 4: t = "int32_t"; break; default: t = "int64_t"; break; } if (p->info.typ->type == Tenumsc) fprintf(fheader, "enum class %s : %s {", ident(p->info.typ->id->name), t); else fprintf(fheader, "enum %s : %s {", ident(p->info.typ->id->name), t); } if ((Table*)p->info.typ->ref) { const char *c = ""; for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { Entry *e = NULL; if (rflag) fprintf(freport, "%s %s ", c, ident(q->sym->name)); if (p->info.typ->type == Tenum && (e = entry(r, q->sym)) && e->info.val.i == q->info.val.i) fprintf(fheader, " /* %s\n\t%s = " SOAP_LONG_FORMAT " */", c, ident(q->sym->name), q->info.val.i); else { if (q->info.val.i > 0 && q->info.val.i < 128 && isalpha((int)q->info.val.i)) fprintf(fheader, "%s\n\t%s = '%c'", c, ident(q->sym->name), (int)q->info.val.i); else if (q->info.val.i <= 0x7FFFLL && q->info.val.i >= -0x8000LL) fprintf(fheader, "%s\n\t%s = " SOAP_LONG_FORMAT, c, ident(q->sym->name), q->info.val.i); else fprintf(fheader, "%s\n\t%s = " SOAP_LONG_FORMAT "LL", c, ident(q->sym->name), q->info.val.i); if (p->info.typ->type == Tenum && !e) { e = enter(r, q->sym); e->info.val.i = q->info.val.i; } c = ","; } } } else { if (!is_transient(p->info.typ) && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_imported(p->info.typ)) { sprintf(errbuf, "%s declared at %s:%d has no content, requires enum constants", c_type(p->info.typ), p->filename, p->lineno); semwarn(errbuf); } } if (cflag && p->info.typ->type == Tenum && p->sym->token == TYPE) fprintf(fheader, "\n} %s;", ident(p->sym->name)); else fprintf(fheader, "\n};"); if (is_volatile(p->info.typ)) fprintf(fheader, "\n#endif"); fprintf(fheader, "\n#endif"); } if (rflag && p->info.typ->ref) fprintf(freport, "
\n\n"); for (p = enumtable->list; p; p = p->next) { const char *ns = prefix_of(p->sym->name); const char *x; x = xsi_type(p->info.typ); if (!x || !*x) x = wsdl_type(p->info.typ, ""); fprintf(freport, "\n\n", c_ident(p->info.typ)); fprintf(freport, "### `%s`\n\n", c_type(p->info.typ)); gen_report_type_doc(p); fprintf(freport, "This enum%s type is declared in [%s](%s) at line %d ", p->info.typ->type == Tenumsc ? " class" : "", p->filename, p->filename, p->lineno); if (is_mask(p->info.typ)) fprintf(freport, "and is a bitmask type, meaning that it represents a set of values created with bit-wise `|` (bitor) operations, "); if ((Table*)p->info.typ->ref) { const char *c = ""; fprintf(freport, "and has values "); for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (!is_mask(p->info.typ) && q->info.val.i > 0 && q->info.val.i < 128 && isalpha((int)q->info.val.i)) fprintf(freport, "%s `%s` (= " SOAP_LONG_FORMAT " = ASCII '%c')", c, ident(q->sym->name), q->info.val.i, (int)q->info.val.i); else fprintf(freport, "%s `%s` (= " SOAP_LONG_FORMAT ")", c, ident(q->sym->name), q->info.val.i); gen_report_member(p, q); c = ","; } } fprintf(freport, ".\n\n"); if (!is_transient(p->info.typ)) { if (cflag) { fprintf(freport, "- `(%s *)soap_malloc(struct soap*, sizeof(%s))` raw managed allocation\n", c_type(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `%s *soap_new_%s(struct soap*, int n)` managed allocation with default initialization of one `%s` when `n` = 1 or array `%s[n]` when `n` > 1\n", c_type(p->info.typ), c_ident(p->info.typ), c_type(p->info.typ), c_type(p->info.typ)); } else { fprintf(freport, "- `%s *soap_new_%s(struct soap*)` managed allocation with default initialization\n", c_type(p->info.typ), c_ident(p->info.typ)); fprintf(freport, "- `%s *soap_new_%s(struct soap*, int n)` managed allocation with default initialization of array `%s[n]`\n", c_type(p->info.typ), c_ident(p->info.typ), c_type(p->info.typ)); } fprintf(freport, "- `void soap_default_%s(struct soap*, %s)` set to default value\n", c_ident(p->info.typ), c_type_id(p->info.typ, "*value")); fprintf(freport, "- `const char *soap_%s2s(struct soap*, %s)` returns string-converted value in temporary string buffer\n", c_ident(p->info.typ), c_type_id(p->info.typ, "value")); fprintf(freport, "- `int soap_s2%s(struct soap*, const char*, %s)` convert string to value, returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type_id(p->info.typ, "*value")); if (!wflag) { if (!is_invisible(p->sym->name) && !has_ns_eq("xsd", p->sym->name)) { const char *s = ns_of(p->sym->name); if (s && *s && has_ns_eq(NULL, p->sym->name)) fprintf(freport, "\nThe component of XML schema type *`%s`* in schema \"[%s](#doc-namespaces)\" is:\n\n", x, s); else fprintf(freport, "\nThe component of XML schema type *`%s`* is:\n\n", x); gen_schema_type(freport, NULL, p, ns, ns, 1, NULL, NULL); } } fprintf(freport, "\n"); } gen_report_hr(); } uflag = uf; } } banner(fheader, "Types with Custom Serializers"); fflush(fheader); if (typetable) { for (p = typetable->list; p; p = p->next) { if (is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_imported(p->info.typ)) { fprintf(fheader, "\n\n/* %s:%d */", p->filename, p->lineno); fprintf(fheader, "\n#ifndef %s", soap_type(p->info.typ)); if (namespaceid) fprintf(fheader, "\n#define %s (-%d)\n", soap_type(p->info.typ), p->info.typ->num); /* namespaced SOAP_TYPE is negative to avoid clashes */ else fprintf(fheader, "\n#define %s (%d)", soap_type(p->info.typ), p->info.typ->num); fprintf(fheader, "\n%s%s;", c_storage(p->info.sto), c_type_synonym_id(p->info.typ, p->sym->name)); fprintf(fheader, "\n#endif"); } } } if (typetable) { for (p = typetable->list; p; p = p->next) { if (p->info.typ->type == Tclass && is_eq(p->info.typ->sym->name, "xsd__QName") && !is_external(p->info.typ) && !is_imported(p->info.typ)) { fprintf(fheader, "\n\n/* %s:%d */", p->filename, p->lineno); fprintf(fheader, "\n#ifndef %s", soap_type(p->info.typ)); if (namespaceid) fprintf(fheader, "\n#define %s (-%d)\n", soap_type(p->info.typ), p->info.typ->num); /* namespaced SOAP_TYPE is negative to avoid clashes */ else fprintf(fheader, "\n#define %s (%d)", soap_type(p->info.typ), p->info.typ->num); fprintf(fheader, "\n%sstd::string %s;", c_storage(p->info.sto), ident(p->sym->name)); fprintf(fheader, "\n#endif\n"); } } } if (classtable && classtable->list) { if (cflag) banner(fheader, "Structs and Unions"); else banner(fheader, "Classes, Structs and Unions"); fflush(fheader); if (rflag) fprintf(freport, "## %sStruct and Union Types {#doc-classes}\n\nThe table below lists the %sstructs and unions declared in [%s](%s) or that are imported:\n\n\n\n", cflag ? "" : "Class, ", cflag ? "" : "classes, ", filename, filename); for (p = classtable->list; p; p = p->next) { if (rflag && p->info.typ->ref && (soap_version >= 0 || (!is_header_or_fault(p->info.typ) && !is_body(p->info.typ)))) fprintf(freport, "\n", c_ident(p->info.typ), c_type(p->info.typ), p->filename, p->lineno, !is_transient(p->info.typ) ? "yes" : ""); if (!is_imported(p->info.typ) && !is_volatile(p->info.typ) && p->info.typ->ref) { if (!is_header_or_fault(p->info.typ) && !is_body(p->info.typ)) { if (cflag && (p->info.typ->type == Tstruct || p->info.typ->type == Tunion) && p->sym->token == TYPE) fprintf(fheader, "\ntypedef "); else fprintf(fheader, "\n"); if (p->info.typ->type == Tstruct) fprintf(fheader, "struct %s", ident(p->sym->name)); else if (!cflag && p->info.typ->type == Tclass) fprintf(fheader, "class %s", ident(p->sym->name)); else if (p->info.typ->type == Tunion) fprintf(fheader, "union %s", ident(p->sym->name)); if (cflag && (p->info.typ->type == Tstruct || p->info.typ->type == Tunion) && p->sym->token == TYPE) fprintf(fheader, " %s;", ident(p->sym->name)); else fprintf(fheader, ";"); fprintf(fheader, "\t/* %s:%d */", p->filename, p->lineno); } } } if (rflag) fprintf(freport, "
Type Declared Serializable
%s %s:%d %s
\n\n"); for (p = classtable->list; p; p = p->next) { if (rflag) gen_class(freport, p); gen_class(fheader, p); } } if (typetable) { banner(fheader, "Typedefs"); fflush(fheader); if (rflag) { fprintf(freport, "## Typedefs {#doc-typedefs}\n\n"); fprintf(freport, "A typedef type is serializable if its underlying base type is serializable. Typedefs may declare custom serializers, meaning their underlying types are custom-serialized in XML using serialization rules that differ from the serialization rules of the underlying base type:"); fprintf(freport, "\n\n\n"); } for (p = typetable->list; p; p = p->next) { if (rflag) { if (!is_transient(p->info.typ)) fprintf(freport, "\n", c_ident(p->info.typ), c_ident(p->info.typ), c_type(p->info.typ), p->filename, p->lineno, is_external(p->info.typ) || is_qname(p->info.typ) || is_stdqname(p->info.typ) || is_XML(p->info.typ) || is_stdXML(p->info.typ) ? "yes" : ""); else fprintf(freport, "\n", c_ident(p->info.typ), c_type(p->info.typ), p->filename, p->lineno); } if (!wflag && !is_primitive_or_string(p->info.typ) && !is_external(p->info.typ) && !is_XML(p->info.typ) && !is_transient(p->info.typ) && !has_ns_t(p->info.typ) && !is_imported(p->info.typ) && !is_template(p->info.typ)) { sprintf(errbuf, "serializable typedef '%s' is not namespace qualified: schema definition for '%s' in WSDL file output may be invalid", p->sym->name, p->sym->name); semwarn(errbuf); } if (p->info.typ->type == Tclass && is_eq(p->info.typ->sym->name, "xsd__QName") && !is_external(p->info.typ) && !is_imported(p->info.typ)) continue; if (!(is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_imported(p->info.typ)) || is_synonym(p->info.typ)) { fprintf(fheader, "\n\n/* %s:%d */", p->filename, p->lineno); fprintf(fheader, "\n#ifndef %s", soap_type(p->info.typ)); if (namespaceid) fprintf(fheader, "\n#define %s (-%d)\n", soap_type(p->info.typ), p->info.typ->num); /* namespaced SOAP_TYPE is negative to avoid clashes */ else fprintf(fheader, "\n#define %s (%d)", soap_type(p->info.typ), p->info.typ->num); fprintf(fheader, "\n%s%s;", c_storage(p->info.sto), c_type_synonym_id(p->info.typ, p->sym->name)); fprintf(fheader, "\n#endif"); } } if (rflag) { fprintf(freport, "
Typedef Type Declared Serializable Custom
%s %s %s:%d yes %s
%s %s %s:%d
\n\n"); for (p = typetable->list; p; p = p->next) { if (!is_transient(p->info.typ)) { fprintf(freport, "\n\n### `%s`\n\n", c_ident(p->info.typ), c_ident(p->info.typ)); gen_report_type_doc(p); if (p->lineno) fprintf(freport, "This typedef is declared in [%s](%s) at line %d", p->filename, p->filename, p->lineno); else fprintf(freport, "This typedef is internally generated"); if (has_ns_t(p->info.typ)) fprintf(freport, ", is serialized as XML schema type *`%s`*", xsi_type(p->info.typ)); if (is_XML(p->info.typ) || is_stdXML(p->info.typ)) fprintf(freport, " and is a built-in string type to hold XML that is literally serialized to and from XML"); else if (is_qname(p->info.typ) || is_stdqname(p->info.typ)) fprintf(freport, " and is a built-in string type to serialize a list of space-separated qualified names (*`xsd:QName`*), such that XML namespace prefixes are normalized to the XML prefixes defined in the [namespace table](#doc-namespaces) or replaced with \"URI\": when the namespace table has no prefix entry for the URI"); else if (is_anyType(p->info.typ)) fprintf(freport, " and is a built-in XML DOM element node graph"); else if (is_anyAttribute(p->info.typ)) fprintf(freport, " and is a built-in XML DOM attribute list"); else fprintf(freport, " and has underlying base type `%s`", c_type(p->info.typ)); if (is_primitive_or_string(p->info.typ) && (p->info.typ->pattern || p->info.typ->hasmin || p->info.typ->hasmax)) { fprintf(freport, ", which should be\n"); if (p->info.typ->pattern) { if (p->info.typ->pattern[0] == '%' && p->info.typ->pattern[1]) { unsigned int n = (unsigned int)strtoul(p->info.typ->pattern + 1, NULL, 10); unsigned int f = 0; const char *s = strchr(p->info.typ->pattern, '.'); if (s) f = (unsigned int)strtoul(s + 1, NULL, 10); if (n) fprintf(freport, "\n- number of total digits: %u", n); if (f) fprintf(freport, "\n- number of fraction digits: %u", f); } else fprintf(freport, "\n- matching regex pattern \"%s\"", p->info.typ->pattern); } if (p->info.typ->hasmin) { if (p->info.typ->type >= Tfloat && p->info.typ->type <= Tldouble) { if (p->info.typ->incmin) fprintf(freport, "\n- greater than or equal to %.16lG\n", p->info.typ->rmin); else fprintf(freport, "\n- greater than %.16lG\n", p->info.typ->rmin); } else if (p->info.typ->type >= Tchar && p->info.typ->type <= Tullong) { if (p->info.typ->incmin) fprintf(freport, "\n- greater than or equal to " SOAP_LONG_FORMAT "\n", p->info.typ->imin); else fprintf(freport, "\n- greater than " SOAP_LONG_FORMAT "\n", p->info.typ->imin); } else if (p->info.typ->hasmax && p->info.typ->imax >= 0 && p->info.typ->incmin && p->info.typ->incmax && p->info.typ->imin == p->info.typ->imax) fprintf(freport, "\n- equal to " SOAP_LONG_FORMAT " characters in length\n", p->info.typ->imin); else fprintf(freport, "\n- longer than or equal to " SOAP_LONG_FORMAT " characters in length\n", p->info.typ->imin); } if (p->info.typ->hasmax) { if (p->info.typ->type >= Tfloat && p->info.typ->type <= Tldouble) { if (p->info.typ->incmax) fprintf(freport, "\n- less than or equal to %.16lG\n", p->info.typ->rmax); else fprintf(freport, "\n- less than %.16lG\n", p->info.typ->rmax); } else if (p->info.typ->type >= Tchar && p->info.typ->type <= Tullong) { if (p->info.typ->incmax) fprintf(freport, "\n- less than or equal to " SOAP_LONG_FORMAT "\n", p->info.typ->imax); else fprintf(freport, "\n- less than " SOAP_LONG_FORMAT "\n", p->info.typ->imax); } else if (p->info.typ->hasmax && p->info.typ->imax >= 0 && p->info.typ->incmin && p->info.typ->incmax && p->info.typ->imin == p->info.typ->imax) ; else fprintf(freport, "\n- shorter than or equal to " SOAP_LONG_FORMAT " characters in length\n", p->info.typ->imin); } } fprintf(freport, "\n\n"); gen_report_hr(); } } } } banner(fheader, "Serializable Types"); fflush(fheader); if (rflag) { fprintf(freport, "## Summary of Serializable Types {#doc-types}\n\n"); fprintf(freport, "Each serializable %s *Type* with binding name *Name* has a set of auto-generated functions:\n\n", cflag ? "C" : "C/C++"); if (cflag) { fprintf(freport, "- `Type *soap_new_Name(struct soap*, int n)` managed allocation with default initialization of one *Type* when `n` = 1 or array *Type*`[n]` when `n` > 1\n"); fprintf(freport, "- `void soap_default_Name(struct soap*, Type*)` initialize or reset *Type* to default\n"); } else { fprintf(freport, "- `Type *soap_new_Name(struct soap*)` managed allocation and default initialization\n"); fprintf(freport, "- `Type *soap_new_Name(struct soap*, int n)` managed allocation and default initialization of an array `Type[n]`\n"); fprintf(freport, "- `void soap_default_Name(struct soap*, Type*)` initialize or reset non-class *Type* to default)\n"); fprintf(freport, "- `void Type::soap_default(struct soap*)` non-volatile class *Type* reset to default\n"); } fprintf(freport, "- `Type *soap_dup_Name(struct soap*, Type *dst, const Type *src)` requires soapcpp2 option -Ec, deep copy `src` to `dst` managed by context or unmanaged when context is NULL, returning `dst` (if `dst` is NULL then allocates `dst` copy)\n"); fprintf(freport, "- `void soap_del_Name(struct soap*, Type*)` requires soapcpp2 option -Ec, deep delete *Type* which must be unmanaged\n"); fprintf(freport, "- `const char *soap_Name2s(struct soap*, Type)` primitive *Type* only, returns string-converted *Type* in temporary string buffer\n"); fprintf(freport, "- `int soap_s2Name(struct soap*, const char*, Type*)` primitive *Type* only, convert string to value, returns `SOAP_OK` or error code\n"); fprintf(freport, "- `int soap_write_Name(struct soap*, const Type*)` serialize *Type* to XML, returns `SOAP_OK` or error code\n"); fprintf(freport, "- `int soap_PUT_Name(struct soap*, const char *URL, const Type*)` REST PUT *Type* in XML, returns `SOAP_OK` or error code\n"); fprintf(freport, "- `int soap_PATCH_Name(struct soap*, const char *URL, const Type*)` REST PATCH *Type* in XML, returns `SOAP_OK` or error code\n"); fprintf(freport, "- `int soap_POST_send_Name(struct soap*, const char *URL, const Type*)` REST POST send *Type* in XML (MUST be followed by a `soap_POST_recv_OtherName`), returns `SOAP_OK` or error code\n"); fprintf(freport, "- `int soap_read_Name(struct soap*, Type*)` deserialize *Type* from XML, returns `SOAP_OK` or error code\n"); fprintf(freport, "- `int soap_GET_Name(struct soap*, const char *URL, Type*)` REST GET *Type* from XML, returns `SOAP_OK` or error code\n"); fprintf(freport, "- `int soap_POST_recv_Name(struct soap*, Type*)` REST GET *Type* from XML (after a `soap_POST_send_OtherName`), returns `SOAP_OK` or error code\n"); if (cflag) fprintf(freport, "- `(Type *)soap_malloc(struct soap*, sizeof(Type))` raw managed allocation of *Type* without initialization\n"); else fprintf(freport, "- `(Type *)soap_malloc(struct soap*, sizeof(Type))` raw managed allocation of primitive *Type* (types that are not structs or classes) without initialization\n"); fprintf(freport, "- `const char *soap_strdup(struct soap*, const char*)` managed allocation and duplication of string\n"); fprintf(freport, "- `const wchar_t *soap_wstrdup(struct soap*, const wchar_t*)` managed allocation and duplication of wide string\n"); if (namespaceid) fprintf(freport, "\nEach *Type* also has a unique type id `SOAP_TYPE_%s_` that you can use to serialize `void*` in a struct/class by setting the `int __type` member to this type id.", namespaceid); else fprintf(freport, "\nEach *Type* also has a unique type id `SOAP_TYPE_` that you can use to serialize `void*` in a struct/class by setting the `int __type` member to this type id."); if (!cflag) fprintf(freport, " The unique type id is also used to distinguish derived class instances from base class instances by calling their `virtual soap_type()` methods that return this type id."); fprintf(freport, "\n\nFrom the toolkit documentation:\n\n"); if (cflag) fprintf(freport, "- Set `soap->sendfd = fd` to serialize to an `int fd` file descriptor\n- Set `soap->os = &cs` to serialize to a string `const char *cs`, which will be assigned by the engine and set to point to a managed string that is automatically deleted\n- Set `soap->recvfd = fd` to deserialize from an `int fd` file descriptor\n- Set `soap->is = cs` to deserialize from a `const char *cs` string\n- All managed allocated data is freed by `soap_end(soap)` with context `soap`\n"); else fprintf(freport, "- Set `soap->sendfd = fd` to serialize to an `int fd` file descriptor\n- Set `soap->os = &os` to serialize to a `std::ostream os`\n- Set `soap->recvfd = fd` to deserialize from an `int fd` file descriptor\n- Set `soap->is = &is` to deserialize from a `std::istream`\n- All managed allocated data is deleted by `soap_destroy(soap)` followed by `soap_end(soap)` with context `soap`\n"); fprintf(freport, "\nThe table below lists the serializable types by *Type*, binding *Name*, *Kind*, and the XSD data binding type and/or element. Pointers, arrays, and containers of these types are also serializable:\n\n\n\n", cflag ? "C" : "C/C++"); } for (i = 0; i < TYPES; i++) { if (i != Tnone && i != Tvoid && i != Tsize && i != Tunion && i != Treference && i != Trvalueref && i != Tfun) { Tnode *p; for (p = Tptr[i]; p; p = p->next) { if (!is_transient(p) && !is_invisible(p->id->name)) { fprintf(fheader, "\n\n/* %s has binding name '%s' for type '%s' */", c_type_sym(p), c_ident(p), xsi_type(p)); fprintf(fheader, "\n#ifndef %s", soap_type(p)); if (namespaceid) fprintf(fheader, "\n#define %s (-%d)\n", soap_type(p), p->num); /* namespaced SOAP_TYPE is negative to avoid clashes */ else fprintf(fheader, "\n#define %s (%d)", soap_type(p), p->num); fprintf(fheader, "\n#endif"); if (rflag && (p->type != Tpointer || is_string(p) || is_wstring(p))) { if ((p->type == Tstruct || p->type == Tclass || p->type == Tenum || p->type == Tenumsc || is_typedef(p)) && !is_stdstr(p)) fprintf(freport, "\n", c_ident(p), c_type_sym(p), c_ident(p), kind_of(p), is_XML(p) ? "(literal XML string)" : is_anyType(p) ? "(XML DOM element)" : is_anyAttribute(p) ? "(XML DOM attribute list)" : xsi_type(p)); else fprintf(freport, "\n", c_type_sym(p), c_ident(p), kind_of(p), is_XML(p) ? "(literal XML string)" : is_anyType(p) ? "(XML DOM element node)" : is_anyAttribute(p) ? "(XML DOM attribute list)" : xsi_type(p)); } } } } } if (rflag) { fprintf(freport, "
%s Type Name Kind XML schema name
%s %s %s %s
%s %s %s %s
\n\n"); gen_report_hr(); } banner(fheader, "Externals"); fflush(fheader); if (t) { for (p = t->list; p; p = p->next) { if (p->info.typ->type != Tfun || (p->info.sto & Sextern)) { fprintf(fheader, "\n\n/* %s:%d */\n", p->filename, p->lineno); if (!(p->info.sto & Sstatic)) fprintf(fheader, "extern "); fprintf(fheader, "%s", c_storage(p->info.sto)); fprintf(fheader, "%s", c_type_id(p->info.typ, p->sym->name)); fprintf(fheader, "%s;", c_init(p)); } } } fflush(fheader); } void get_namespace_prefixes(void) { Symbol *p, *q; Entry *e, *v; int i, n; const char *s; char buf[256]; if (nslist) return; for (p = symlist; p; p = p->next) { s = p->name; if (!strncmp(s, "__size", 6) || !strncmp(s, "__type", 6) || !strncmp(s, "__union", 7)) continue; while (*s == '_' || *s == '~') s++; n = (int)(strlen(s) - 2); for (i = 1; i < n; i++) { if (s[i] == ':' || (s[i-1] != '_' && s[i] == '_' && s[i+1] == '_' && s[i+2] && s[i+2] != '_') || (s[i-1] != '_' && (!strncmp(s+i, "___DOT", 6) || !strncmp(s+i, "___USCORE", 9) || (!strncmp(s+i, "___x", 4) && isxdigit(s[i+4]) && isxdigit(s[i+5]) && isxdigit(s[i+6]) && isxdigit(s[i+7]))))) { if (s[i+1] == ':') { i++; continue; } strncpy(buf, s, i); buf[i] = '\0'; if (!strcmp(buf, "SOAP_ENV") || !strcmp(buf, "SOAP_ENC") || !strcmp(buf, "xsd") || !strcmp(buf, "xsi") || !strcmp(buf, "xml") || !strcmp(buf, "std") || !strncmp(buf, "soap_", 5)) goto nsnext; for (q = nslist; q; q = q->next) if (!strcmp(q->name, buf)) goto nsnext; if (enumtable) for (e = enumtable->list; e; e = e->next) if (!strcmp(buf, e->sym->name)) if (e->info.typ->ref) for (v = ((Table*)e->info.typ->ref)->list; v; v = v->next) if (p == v->sym) goto nsnext; q = (Symbol*)emalloc(sizeof(Symbol)); q->name = (char*)emalloc(i+1); strcpy(q->name, buf); q->name[i] = '\0'; q->next = nslist; nslist = q; break; } } nsnext: ; } q = (Symbol*)emalloc(sizeof(Symbol)); q->name = (char*)emalloc(4); strcpy(q->name, "xsd"); q->next = nslist; nslist = q; q = (Symbol*)emalloc(sizeof(Symbol)); q->name = (char*)emalloc(4); strcpy(q->name, "xsi"); q->next = nslist; nslist = q; q = (Symbol*)emalloc(sizeof(Symbol)); q->name = (char*)emalloc(9); strcpy(q->name, "SOAP-ENC"); q->next = nslist; nslist = q; q = (Symbol*)emalloc(sizeof(Symbol)); q->name = (char*)emalloc(9); strcpy(q->name, "SOAP-ENV"); q->next = nslist; nslist = q; } void generate_schema(Table *t) { Entry *p = NULL; Symbol *ns; const char *name = NULL; const char *URL = NULL; const char *executable = NULL; const char *URI = NULL; const char *style = NULL; const char *encoding = NULL; const char *protocol = NULL; const char *import = NULL; Service *sp = NULL; char buf[4096]; FILE *fd; get_namespace_prefixes(); for (ns = nslist; ns; ns = ns->next) { if (!strcmp(ns->name, "SOAP-ENV") || !strcmp(ns->name, "SOAP-ENC") || !strcmp(ns->name, "xsi") || !strcmp(ns->name, "xsd")) continue; name = NULL; URL = NULL; executable = NULL; URI = NULL; style = NULL; encoding = NULL; import = NULL; for (sp = services; sp; sp = sp->next) { if (!tagcmp(sp->ns, ns->name)) { name = ns_cname(sp->name, NULL); URL = sp->URL; executable = sp->executable; URI = sp->URI; style = sp->style; encoding = sp->encoding; protocol = sp->protocol; import = sp->import; break; } } if (!URI) { char *s = (char*)emalloc(strlen(tmpURI) + strlen(ns->name) + 6); sprintf(s, "%s/%s.xsd", tmpURI, ns_convert(ns->name)); URI = s; } if (soap_version >= 0 && is_document(style) && encoding && !*encoding) { semwarn("Cannot use document style with SOAP encoding"); encoding = NULL; } if (!name) name = "Service"; if (t) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns->name, p->sym->name)) { if (name) fprintf(fmsg, "Using %s service name: %s\n", ns->name, name); if (protocol) fprintf(fmsg, "Using %s service protocol: %s\n", ns->name, protocol); if (style && soap_version >= 0) fprintf(fmsg, "Using %s service style: %s\n", ns->name, style); else if (!eflag && soap_version >= 0) fprintf(fmsg, "Using %s service style: document\n", ns->name); else if (eflag) fprintf(fmsg, "Using %s service style: rpc\n", ns->name); if (encoding && *encoding) fprintf(fmsg, "Using %s service encoding: %s\n", ns->name, encoding); else if (encoding && !*encoding && soap_version >= 0) fprintf(fmsg, "Using %s service encoding: encoded\n", ns->name); else if (!eflag && soap_version >= 0) fprintf(fmsg, "Using %s service encoding: literal\n", ns->name); else if (eflag) fprintf(fmsg, "Using %s service encoding: encoded\n", ns->name); if (URL) fprintf(fmsg, "Using %s service location: %s\n", ns->name, URL); if (executable) fprintf(fmsg, "Using %s service executable: %s\n", ns->name, executable); if (import) fprintf(fmsg, "Using %s schema import namespace: %s\n", ns->name, import); else if (URI) fprintf(fmsg, "Using %s schema namespace: %s\n", ns->name, URI); if (sp && sp->name) sprintf(buf, "%s%s.wsdl", dirpath, ns_cname(name, NULL)); else sprintf(buf, "%s%s.wsdl", dirpath, ns_cname(ns->name, NULL)); if (!wflag && !import) { fprintf(fmsg, "Saving %s Web Service description\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write WSDL file"); gen_wsdl(fd, t, ns->name, name, URL ? URL : "http://localhost:80", executable, URI, style, encoding, protocol); fclose(fd); } if (!cflag) { if (iflag || jflag) { const char *sname; if (sp && sp->name) sname = sp->name; else sname = ""; if (!Sflag) { const char *name1 = ns_cname(sname, "Proxy"); sprintf(soapProxyH, "%s%s.h", prefix, name1); sprintf(pathsoapProxyH, "%s%s", dirpath, soapProxyH); sprintf(soapProxyC, "%s%s.cpp", prefix, name1); sprintf(pathsoapProxyC, "%s%s", dirpath, soapProxyC); fprintf(fmsg, "Saving %s client proxy class\n", pathsoapProxyH); fd = fopen(pathsoapProxyH, "w"); if (!fd) execerror("Cannot write proxy class file"); copyrightnote(fd, soapProxyH); if (rflag) gen_proxy_header(freport, t, ns, name1); gen_proxy_header(fd, t, ns, name1); fclose(fd); fprintf(fmsg, "Saving %s client proxy class\n", pathsoapProxyC); fd = fopen(pathsoapProxyC, "w"); if (!fd) execerror("Cannot write proxy class file"); copyrightnote(fd, soapProxyC); gen_proxy_code(fd, t, ns, name1); fclose(fd); } if (!Cflag) { const char *name1 = ns_cname(sname, "Service"); sprintf(soapServiceH, "%s%s.h", prefix, name1); sprintf(pathsoapServiceH, "%s%s", dirpath, soapServiceH); sprintf(soapServiceC, "%s%s.cpp", prefix, name1); sprintf(pathsoapServiceC, "%s%s", dirpath, soapServiceC); fprintf(fmsg, "Saving %s service class\n", pathsoapServiceH); fd = fopen(pathsoapServiceH, "w"); if (!fd) execerror("Cannot write service class file"); copyrightnote(fd, soapServiceH); if (rflag) gen_object_header(freport, t, ns, name1); gen_object_header(fd, t, ns, name1); fclose(fd); fprintf(fmsg, "Saving %s service class\n", pathsoapServiceC); fd = fopen(pathsoapServiceC, "w"); if (!fd) execerror("Cannot write service class file"); copyrightnote(fd, soapServiceC); gen_object_code(fd, t, ns, name1); fclose(fd); } } else if (zflag == 1) { if (!Sflag && sp && sp->name) { sprintf(buf, "%s%s%s.h", dirpath, prefix, ns_cname(name, "Proxy")); fprintf(fmsg, "Saving %s simple client proxy (deprecated)\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write proxy file"); sprintf(buf, "%s%s.h", prefix, ns_cname(name, "Proxy")); copyrightnote(fd, buf); gen_proxy(fd, t, ns, name, URL ? URL : "http://localhost:80"); fclose(fd); } else if (!Sflag) { sprintf(buf, "%s%s.h", dirpath, ns_cname(prefix, "Proxy")); fprintf(fmsg, "Saving %s simple client proxy (deprecated)\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write proxy file"); sprintf(buf, "%s.h", ns_cname(prefix, "Proxy")); copyrightnote(fd, buf); gen_proxy(fd, t, ns, "Service", URL ? URL : "http://localhost:80"); fclose(fd); } if (!Cflag && sp && sp->name) { sprintf(buf, "%s%s%s.h", dirpath, prefix, ns_cname(name, "Object")); fprintf(fmsg, "Saving %s simple server object (deprecated)\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write server object file"); sprintf(buf, "%s%s.h", prefix, ns_cname(name, "Object")); copyrightnote(fd, buf); gen_object(fd, t, name); fclose(fd); } else if (!Cflag) { sprintf(buf, "%s%s.h", dirpath, ns_cname(prefix, "Object")); fprintf(fmsg, "Saving %s simple server object (deprecated)\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write server object file"); sprintf(buf, "%s.h", ns_cname(prefix, "Object")); copyrightnote(fd, buf); gen_object(fd, t, "Service"); fclose(fd); } } } if (!xflag) { strcpy(buf, dirpath); if (sp && sp->name) strcat(buf, ns_fname(name)); else strcat(buf, ns_fname(ns->name)); strcat(buf, "."); gen_data(buf, t, ns->name, encoding); } break; } } if (sp && sp->name) { has_nsmap = 1; if (nflag) sprintf(buf, "%s%s.nsmap", dirpath, prefix); else sprintf(buf, "%s%s.nsmap", dirpath, ns_cname(name, NULL)); fprintf(fmsg, "Saving %s namespace mapping table\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write nsmap file"); /* fprintf(fd, "\n#include \"%sH.h\"", prefix); better to leave to users to include this, so use stdsoap2.h instead: */ fprintf(fd, "\n#include \"stdsoap2.h\"\n/* This defines the global XML namespaces[] table to #include and compile */"); if (nflag) fprintf(fd, "\nSOAP_NMAC struct Namespace %s_namespaces[] = ", prefix); else fprintf(fd, "\nSOAP_NMAC struct Namespace namespaces[] = "); gen_nsmap(fd); fclose(fd); if (rflag) { Symbol *ns1; fprintf(freport, "## Schemas and Namespaces {#doc-namespaces}\n\nThe following schemas and namespaces are used in addition to the predefined SOAP and built-in XSD namespaces:\n\n"); for (ns1 = nslist; ns1; ns1 = ns1->next) { if (strcmp(ns1->name, "SOAP-ENV") && strcmp(ns1->name, "SOAP-ENC") && strcmp(ns1->name, "xsi") && strcmp(ns1->name, "xsd")) { Service *sp1; for (sp1 = services; sp1; sp1 = sp1->next) if (!tagcmp(sp1->ns, ns1->name) && sp1->URI) break; if (sp1) fprintf(freport, "- Prefix `%s` is bound to namespace URI *`%s`*", ns_convert(ns1->name), sp1->URI); else fprintf(freport, "- Prefix `%s` is bound to namespace URI *`%s/%s.xsd`*", ns_convert(ns1->name), tmpURI, ns_convert(ns1->name)); if (!wflag) { if (sp1 && sp1->name) fprintf(freport, " of service WSDL [%s.wsdl](%s%s.wsdl) and schema [%s.xsd](%s%s.xsd)", ns_cname(sp1->name, NULL), dirpath, ns_cname(sp1->name, NULL), ns_cname(ns1->name, NULL), dirpath, ns_cname(ns1->name, NULL)); else fprintf(freport, " of schema [%s.xsd](%s%s.xsd)", ns_cname(ns1->name, NULL), dirpath, ns_cname(ns1->name, NULL)); } if (sp1 && (sp1->elementForm || sp1->attributeForm)) fprintf(freport, " with local element form default *`%s`* and attribute form default *`%s`*\n", sp->elementForm?sp->elementForm:"unqualified", sp->attributeForm?sp->attributeForm:"unqualified"); else fprintf(freport, " with local element and attribute form default *`unqualified`*\n"); } } fprintf(freport, "\n\nThe following namespace table is saved to %s%s.nsmap:\n\n", dirpath, nflag ? prefix : ns_cname(name, NULL)); if (nflag) fprintf(freport, " struct Namespace %s_namespaces[] = ", prefix); else fprintf(freport, " struct Namespace namespaces[] = "); gen_nsmap(freport); fprintf(freport, "\nThe table binds XML namespace prefixes (first column) to namespace URIs (second column), similar to xmlns:prefix=\"URI\" in XML. The third column is a URI pattern with `*` wildcards that is also accepted as a valid namespace URI for inbound XML messages. The fourth column is NULL. This table is globally defined for the gSOAP engine. The engine context will look for it unless you compiled the gSOAP source codes with `-DWITH_NONAMESPACES`. You must assign this or another namespace table with `soap_set_namespaces(struct soap *soap, struct Namespace *namespaces)` after initializing the context and before processing XML.\n\n"); gen_report_hr(); } if (Cflag) Tflag = 0; if (Tflag) { Entry *method; const char *name1 = NULL; Tflag = 0; strcpy(soapTester, prefix); strcat(soapTester, "Tester"); if (cflag) strcat(soapTester, ".c"); else strcat(soapTester, ".cpp"); strcpy(pathsoapTester, dirpath); strcat(pathsoapTester, soapTester); fprintf(fmsg, "Saving %s auto-test echo server\n", pathsoapTester); fd = fopen(pathsoapTester, "w"); if (!fd) execerror("Cannot write to file"); copyrightnote(fd, soapTester); fprintf(fd, "\n/*\n Stand-alone server auto-test code:\n Takes request from standard input or over TCP/IP socket and returns\nresponse to standard output or socket\n\n Compile:\n cc soapTester.c soapServer.c soapC.c stdsoap2.c\n\n Command line usage with redirect over stdin/out:\n > ./a.out < SomeTest.req.xml\n > ./a.out 12288 < SomeTest.req.xml\n Note: 12288 = SOAP_XML_INDENT | SOAP_XML_STRICT (see codes in stdsoap2.h)\n Command line usage to start server at port 8080:\n > a.out 12288 8080\n*/"); if (iflag || jflag) { const char *sname; if (sp && sp->name) sname = sp->name; else sname = ""; name1 = ns_cname(sname, "Service"); fprintf(fd, "\n\n#include \"%s%s%s.h\"\n#include \"%s%s.nsmap\"\n\n\n\n#ifndef SOAP_DEFMAIN\n# define SOAP_DEFMAIN main\t/* redefine to use your own main() */\n#endif\n\nint SOAP_DEFMAIN(int argc, char **argv)\n{\n\t%s service(argc > 1 ? atoi(argv[1]) : 0);\n\tif (argc <= 2)\n\t\treturn service.serve();\n\twhile (service.run(atoi(argv[2])) != SOAP_OK && service.%serror != SOAP_TCP_ERROR)\n\t\tservice.soap_print_fault(stderr);\n\treturn 0;\n}\n", dirpath, prefix, name1, dirpath, nflag?prefix:ns_cname(name, NULL), name1, iflag ? "" : "soap->"); } else fprintf(fd, "\n\n#include \"%s%sH.h\"\n#include \"%s%s.nsmap\"\n\n#ifndef SOAP_DEFMAIN\n# define SOAP_DEFMAIN main\t/* redefine to use your own main() */\n#endif\n\nint SOAP_DEFMAIN(int argc, char **argv)\n{\n\tstruct soap *soap = soap_new1(argc > 1 ? atoi(argv[1]) : 0);\n\tif (argc <= 2)\n\t\treturn %s_serve(soap);\n\tif (soap_valid_socket(soap_bind(soap, NULL, atoi(argv[2]), 100)))\n\t{\twhile (soap_valid_socket(soap_accept(soap)))\n\t\t{\tif (%s_serve(soap))\n\t\t\t\tsoap_print_fault(soap, stderr);\n\t\t\tsoap_destroy(soap);\n\t\t\tsoap_end(soap);\n\t\t}\n\t}\n\tsoap_destroy(soap);\n\tsoap_end(soap);\n\tsoap_free(soap);\n\treturn 0;\n}\n", dirpath, prefix, dirpath, nflag?prefix:ns_cname(name, NULL), nflag?prefix:"soap", nflag?prefix:"soap"); for (method = t->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) { Entry *p = NULL, *q = entry(t, method->sym); Table *r; if (q) p = (Entry*)q->info.typ->ref; else { fprintf(stderr, "Internal error: no table entry\n"); return; } q = entry(classtable, method->sym); r = (Table*)q->info.typ->ref; if (iflag || jflag) fprintf(fd, "\n\n/** Auto-test server operation %s */\nint %s::%s(", method->sym->name, name1, ns_cname(method->sym->name, NULL)); else fprintf(fd, "\n\n/** Auto-test server operation %s */\nint %s(struct soap *soap", method->sym->name, ident(method->sym->name)); gen_params(fd, r, p, !iflag && !jflag); /* single param to single param echo */ if (p && r && r->list && r->list->info.typ == p->info.typ) fprintf(fd, "\n{\n\t/* Echo request-response parameter */\n\t*%s = *%s;\n\treturn SOAP_OK;\n}\n", ident(p->sym->name), ident(r->list->sym->name)); else if (p && r && r->list && p->info.typ->type == Tpointer && r->list->info.typ == (Tnode*)p->info.typ->ref) fprintf(fd, "\n{\n\t/* Echo request-response parameter */\n\t*%s = %s;\n\treturn SOAP_OK;\n}\n", ident(p->sym->name), ident(r->list->sym->name)); else if (p && r && r->list && p->info.typ->type == Treference && r->list->info.typ == (Tnode*)p->info.typ->ref) fprintf(fd, "\n{\n\t/* Echo request-response parameter */\n\t%s = %s;\n\treturn SOAP_OK;\n}\n", ident(p->sym->name), ident(r->list->sym->name)); else if (p && r && r->list && p->info.typ->type == Treference && r->list->info.typ->type == Tpointer && r->list->info.typ->ref == (Tnode*)p->info.typ->ref) fprintf(fd, "\n{\n\t/* Echo request-response parameter */\n\t%s = *%s;\n\treturn SOAP_OK;\n}\n", ident(p->sym->name), ident(r->list->sym->name)); /* params to wrapped params echo */ else { fprintf(fd, "\n{\n\t(void)soap; /* appease -Wall -Werror */"); if (r && p && p->info.typ->ref && ((Tnode*)p->info.typ->ref)->ref && (((Tnode*)p->info.typ->ref)->type == Tstruct || ((Tnode*)p->info.typ->ref)->type == Tclass)) { const char *s, *a; int d = 1; s = ident(p->sym->name); if (p->info.typ->type == Treference || p->info.typ->type == Trvalueref) a = "."; else a = "->"; for (p = ((Table*)((Tnode*)p->info.typ->ref)->ref)->list, q = r->list; p && q; p = p->next, q = q->next) { if (p->info.typ == q->info.typ) fprintf(fd, "\n\t%s%s%s = %s;", s, a, ident(p->sym->name), ident(q->sym->name)); else if (q->info.typ->type == Tpointer && p->info.typ == (Tnode*)q->info.typ->ref) fprintf(fd, "\n\t%s%s%s = *%s;", s, a, ident(p->sym->name), ident(q->sym->name)); else d = 0; } if (!d) fprintf(fd, "\n\t/* Returns incomplete response containing some default data values */"); } fprintf(fd, "\n\treturn SOAP_OK;\n}\n"); } fflush(fd); } } fclose(fd); } } } if (!wflag && !import) { sprintf(buf, "%s%s.xsd", dirpath, ns_cname(ns->name, NULL)); fprintf(fmsg, "Saving %s XML schema\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write schema file"); fprintf(fd, "\n"); gen_schema(fd, t, ns->name, ns->name, 1, style, encoding); fclose(fd); } } if (Tflag) fprintf(fmsg, "Warning: cannot save soapTester, need directive //gsoap ns service name:\n"); if (!has_nsmap) { for (ns = nslist; ns; ns = ns->next) if (strcmp(ns->name, "SOAP-ENV") && strcmp(ns->name, "SOAP-ENC") && strcmp(ns->name, "xsi") && strcmp(ns->name, "xsd")) break; if (nflag) sprintf(buf, "%s%s.nsmap", dirpath, prefix); else if (ns && ns->name) sprintf(buf, "%s%s.nsmap", dirpath, ns_cname(ns->name, NULL)); else sprintf(buf, "%ssoap.nsmap", dirpath); fprintf(fmsg, "Saving %s namespace mapping table\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write nsmap file"); /* fprintf(fd, "\n#include \"%sH.h\"", prefix); better to leave to users to include this, so use stdsoap2.h instead: */ fprintf(fd, "\n#include \"stdsoap2.h\"\n/* This defines the global XML namespaces[] table to #include and compile */"); if (nflag) fprintf(fd, "\nSOAP_NMAC struct Namespace %s_namespaces[] = ", prefix); else fprintf(fd, "\nSOAP_NMAC struct Namespace namespaces[] = "); gen_nsmap(fd); fclose(fd); if (rflag) { Symbol *ns1; fprintf(freport, "## Schemas and Namespaces {#doc-namespaces}\n\nThe following schemas and namespaces are used in addition to the predefined SOAP and built-in XSD namespaces:\n\n"); for (ns1 = nslist; ns1; ns1 = ns1->next) { if (strcmp(ns1->name, "SOAP-ENV") && strcmp(ns1->name, "SOAP-ENC") && strcmp(ns1->name, "xsi") && strcmp(ns1->name, "xsd")) { fprintf(freport, "- Prefix `%s` is bound to namespace URI *`%s/%s.xsd`*", ns_convert(ns1->name), tmpURI, ns_convert(ns1->name)); if (!wflag) fprintf(freport, " of schema [%s.xsd](%s%s.xsd)", ns_cname(ns1->name, NULL), dirpath, ns_cname(ns1->name, NULL)); else fprintf(freport, " with local element and attribute form default *`unqualified`*\n"); } } fprintf(freport, "\n\nThe following namespace table is saved to %s:\n\n", buf); if (nflag) fprintf(freport, " struct Namespace %s_namespaces[] = ", prefix); else fprintf(freport, " struct Namespace namespaces[] = "); gen_nsmap(freport); fprintf(freport, "\nThe table binds XML namespace prefixes (first column) to namespace URIs (second column), similar to xmlns:prefix=\"URI\" in XML. The third column is a URI pattern with `*` wildcards that is also accepted as a valid namespace URI for inbound XML messages. The fourth column is NULL (and can be omitted). This table is globally defined for the gSOAP engine and the engine context will look for it unless you compiled the gSOAP source codes with `-DWITH_NONAMESPACES`. Then assign this or another namespace table with `soap_set_namespaces(struct soap *soap, struct Namespace *namespaces)` after initializing the context and before processing XML.\n\n"); gen_report_hr(); } } } int chkhdr(const char *part) { Entry *p; p = entry(classtable, lookup("SOAP_ENV__Header")); if (p) for (p = ((Table*)p->info.typ->ref)->list; p; p = p->next) if (has_ns_eq(NULL, p->sym->name) && (!strcmp(part, p->sym->name) || is_eq_nons(part, p->sym->name))) return 1; sprintf(errbuf, "Cannot define method-header-part in WSDL: SOAP_ENV__Header \"%s\" member is not qualified", part); semwarn(errbuf); return 0; } void gen_wsdl(FILE *fd, Table *t, const char *ns, const char *name, const char *URL, const char *executable, const char *URI, const char *style, const char *encoding, const char *protocol) { Entry *p, *q, *r; Symbol *s; Service *sp, *sp2; Method *m; const char *mimein = NULL, *mimeout = NULL; int prot, mask = 0x00; /* 0x01 = SOAP, 0x02 = GET, 0x04 = PUT, 0x08 = DELETE, 0x10 = POST */ int hasport = 0; const char *action, *method_style = NULL, *method_encoding = NULL, *method_response_encoding = NULL; const char *portname; const char *binding; fprintf(fd, "\n"); for (sp = services; sp; sp = sp->next) if (!tagcmp(sp->ns, ns)) break; if (sp && sp->definitions) fprintf(fd, "definitions); else fprintf(fd, "WSDL) fprintf(fd, " targetNamespace=\"%s\"\n xmlns:tns=\"%s\"", sp->WSDL, sp->WSDL); else fprintf(fd, " targetNamespace=\"%s/%s.wsdl\"\n xmlns:tns=\"%s/%s.wsdl\"", URI, name, URI, name); if (sp && sp->binding) binding = ns_cname(sp->binding, NULL); else binding = name; if (sp && sp->portname) portname = ns_cname(sp->portname, NULL); else portname = name; for (s = nslist; s; s = s->next) { for (sp2 = services; sp2; sp2 = sp2->next) if (!tagcmp(sp2->ns, s->name) && sp2->URI) break; if (sp2) fprintf(fd, "\n xmlns:%s=\"%s\"", ns_convert(s->name), sp2->URI); else if (!strcmp(s->name, "SOAP-ENV")) fprintf(fd, "\n xmlns:SOAP-ENV=\"%s\"", envURI); else if (!strcmp(s->name, "SOAP-ENC")) fprintf(fd, "\n xmlns:SOAP-ENC=\"%s\"", encURI); else if (!strcmp(s->name, "xsi")) fprintf(fd, "\n xmlns:xsi=\"%s\"", xsiURI); else if (!strcmp(s->name, "xsd")) fprintf(fd, "\n xmlns:xsd=\"%s\"", xsdURI); else fprintf(fd, "\n xmlns:%s=\"%s/%s.xsd\"", ns_convert(s->name), tmpURI, ns_convert(s->name)); } if (is_soap12(encoding)) fprintf(fd, "\n xmlns:SOAP=\"http://schemas.xmlsoap.org/wsdl/soap12/\""); else fprintf(fd, "\n xmlns:SOAP=\"http://schemas.xmlsoap.org/wsdl/soap/\""); fprintf(fd, "\n xmlns:HTTP=\"http://schemas.xmlsoap.org/wsdl/http/\""); fprintf(fd, "\n xmlns:MIME=\"http://schemas.xmlsoap.org/wsdl/mime/\""); fprintf(fd, "\n xmlns:DIME=\"http://schemas.xmlsoap.org/ws/2002/04/dime/wsdl/\""); fprintf(fd, "\n xmlns:WSDL=\"http://schemas.xmlsoap.org/wsdl/\""); fprintf(fd, "\n xmlns=\"http://schemas.xmlsoap.org/wsdl/\">\n\n"); fprintf(fd, "\n\n"); for (s = nslist; s; s = s->next) gen_schema(fd, t, ns, s->name, !strcmp(s->name, ns), style, encoding); fprintf(fd, "\n\n"); fflush(fd); if (t) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) { mimein = NULL; mimeout = NULL; method_style = style; method_encoding = encoding; method_response_encoding = NULL; if (sp) { for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name)) { if (m->mess&MIMEIN) mimein = m->part; if (m->mess&MIMEOUT) mimeout = m->part; if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; else if (m->mess == STYLE) method_style = m->part; } } } if (!method_response_encoding) method_response_encoding = method_encoding; if (get_response(p->info.typ)) fprintf(fd, "\n", ns_remove(p->sym->name)); else fprintf(fd, "\n", ns_remove(p->sym->name)); fflush(fd); if (is_document(method_style)) { if (is_invisible(p->sym->name)) { q = entry(classtable, p->sym); if (q) { q = ((Table*)q->info.typ->ref)->list; if (q) { if (is_invisible(q->sym->name)) { r = entry(classtable, q->sym); if (r) { r = ((Table*)r->info.typ->ref)->list; if (r) { fprintf(fd, " sym, r, ns, 1)) fprintf(fd, " \n"); } } } else { fprintf(fd, " sym, q, ns, 1)) fprintf(fd, " \n"); } } } } else { fprintf(fd, " sym, p, ns, 1)) fprintf(fd, " \n"); } } else { q = entry(classtable, p->sym); if (q) { for (q = ((Table*)q->info.typ->ref)->list; q; q = q->next) { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && !is_repetition(q) && !is_anytype(q)) { if (is_XML(q->info.typ) || is_stdXML(q->info.typ)) fprintf(fd, " \n"); else { fprintf(fd, " sym->name), wsdl_type(q->info.typ, ns)); if (gen_member_documentation(fd, p->sym, q, ns, 1)) fprintf(fd, " \n"); } } } } } if (mimein) fprintf(fd, " \n"); fprintf(fd, "\n\n"); fflush(fd); q = (Entry*)p->info.typ->ref; for (r = t->list; r; r = r->next) if (r != p && r->info.typ->type == Tfun && !(r->info.sto & Sextern) && q == (Entry*)r->info.typ->ref) q = NULL; if (q && is_transient(q->info.typ)) ; else if (q && !is_response(q->info.typ)) { fprintf(fd, "\n", ns_remove(p->sym->name)); if (is_document(method_style)) fprintf(fd, " \n", ns_add(p, ns)); else if (is_literal(method_response_encoding)) { fprintf(fd, " sym->name), ns_add(q, ns)); if (gen_member_documentation(fd, p->sym, q, ns, 1)) fprintf(fd, " \n"); } else if (is_XML((Tnode*)q->info.typ->ref) || is_stdXML((Tnode*)q->info.typ->ref)) fprintf(fd, " \n"); else { fprintf(fd, " sym->name), wsdl_type(q->info.typ, ns)); if (gen_member_documentation(fd, p->sym, q, ns, 1)) fprintf(fd, " \n"); } if (mimeout) fprintf(fd, " \n"); fprintf(fd, "\n\n"); } else if (q && q->info.typ->wsdl == False) { q->info.typ->wsdl = True; fprintf(fd, "\n", ns_remove(((Tnode*)q->info.typ->ref)->id->name)); if (is_document(method_style)) { if (has_ns_eq(NULL, ((Entry*)p->info.typ->ref)->sym->name)) fprintf(fd, " \n", ns_convert(((Entry*)p->info.typ->ref)->sym->name)); else if (is_invisible(((Tnode*)q->info.typ->ref)->id->name)) { r = ((Table*)((Tnode*)q->info.typ->ref)->ref)->list; if (r) { fprintf(fd, " sym, r, ns, 1)) fprintf(fd, " \n"); } } else { fprintf(fd, " info.typ->ref)->id->name)); if (gen_member_documentation(fd, p->sym, q, ns, 1)) fprintf(fd, " \n"); } } else { if (((Tnode*)q->info.typ->ref)->ref) { for (q = ((Table*)((Tnode*)q->info.typ->ref)->ref)->list; q; q = q->next) { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && !is_repetition(q) && !is_anytype(q)) { if (is_XML(q->info.typ) || is_stdXML(q->info.typ)) fprintf(fd, " \n"); else { fprintf(fd, " sym->name), wsdl_type(q->info.typ, ns)); if (gen_member_documentation(fd, p->sym, q, ns, 1)) fprintf(fd, " \n"); } } } } } if (mimeout) fprintf(fd, " \n"); fprintf(fd, "\n\n"); } fflush(fd); } } if (custom_header) { Table *r; fprintf(fd, "\n", name); r = (Table*)entry(classtable, lookup("SOAP_ENV__Header"))->info.typ->ref; if (r) { for (q = r->list; q; q = q->next) { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && !is_repetition(q) && !is_anytype(q)) fprintf(fd, " \n", ns_remove(q->sym->name), ns_add(q, ns)); } } fprintf(fd, "\n\n"); } if (custom_fault) { Table *r; fprintf(fd, "\n", name); r = (Table*)entry(classtable, lookup("SOAP_ENV__Detail"))->info.typ->ref; if (r) for (q = r->list; q; q = q->next) if (!is_transient(q->info.typ) && !is_repetition(q) && !is_anytype(q) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && has_ns_eq(NULL, q->sym->name)) { fprintf(fd, " sym->name), ns_add(q, ns)); if (gen_member_documentation(fd, q->sym, q, ns, 1)) fprintf(fd, " \n"); } fprintf(fd, "\n\n"); } if (sp) { for (m = sp->list; m; m = m->next) { if (m->mess&FAULT && m->part) { Method *m2; int flag = 0; for (m2 = sp->list; m2 && m2 != m; m2 = m2->next) if (m2->mess&FAULT && !strcmp(m2->part, m->part)) flag = 1; if (!flag) { if (typetable) for (p = typetable->list; p; p = p->next) if ((m->mess&FAULT) && is_eq(m->part, p->info.typ->sym->name)) break; if (!p && classtable) for (p = classtable->list; p; p = p->next) if ((m->mess&FAULT) && is_eq(m->part, p->info.typ->id->name)) break; if (p) { fprintf(fd, "\n", ns_remove(m->part)); fprintf(fd, " \n", ns_convert(m->part)); fprintf(fd, "\n\n"); flag = 0; if (custom_fault) { Table *r; r = (Table*)entry(classtable, lookup("SOAP_ENV__Detail"))->info.typ->ref; if (r) for (q = r->list; q; q = q->next) if (!is_transient(q->info.typ) && !is_repetition(q) && !is_anytype(q) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && (!strcmp(q->sym->name, m->part) || !strcmp(q->sym->name + 1, m->part) || ((q->info.typ->type == Tpointer || is_smart(q->info.typ)) && ((((Tnode*)q->info.typ->ref)->id && !strcmp(((Tnode*)q->info.typ->ref)->id->name, m->part)) || (((Tnode*)q->info.typ->ref)->sym && !strcmp(((Tnode*)q->info.typ->ref)->sym->name, m->part)))))) { flag = 1; break; } } if (!flag) { sprintf(errbuf, "//gsoap %s method-fault %s %s directive does not refer to a member of struct SOAP_ENV__Detail: suggest to define struct SOAP_ENV__Detail with member %s", sp->ns, m->name, m->part, m->part); semwarn(errbuf); } } else { sprintf(errbuf, "//gsoap %s method-fault %s %s directive does not refer to struct/class or typedef: should globablly define fault %s as type (typedef or struct/class)", sp->ns, m->name, m->part, m->part); semwarn(errbuf); } } } } } fflush(fd); if (sp && sp->porttype) fprintf(fd, "\n", sp->porttype); else fprintf(fd, "\n", ns_cname(name, "PortType")); if (protocol) { if (strncmp(protocol, "SOAP", 4)) { if (strstr(protocol, "GET")) mask = 0x02; else if (strstr(protocol, "PUT")) mask = 0x04; else if (strstr(protocol, "DELETE")) mask = 0x08; else /* assume POST */ mask = 0x10; } else mask = 0x01; } for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) { if (sp) { for (m = sp->list; m; m = m->next) { if (m->mess == PROTOCOL) { if (strncmp(m->part, "SOAP", 4)) { if (strstr(m->part, "GET")) mask |= 0x02; else if (strstr(m->part, "PUT")) mask |= 0x04; else if (strstr(m->part, "DELETE")) mask |= 0x08; else /* assume POST */ mask |= 0x10; } else mask |= 0x01; } } } if (!mask) { if (soap_version < 0) mask = 0x10; /* -0 option: use POST */ else mask = 0x01; } fprintf(fd, " \n", ns_remove(p->sym->name)); gen_method_documentation(fd, p, ns); if (get_response(p->info.typ)) fprintf(fd, " \n", ns_remove(p->sym->name)); else fprintf(fd, " \n", ns_remove(p->sym->name)); q = (Entry*)p->info.typ->ref; if (q && is_transient(q->info.typ)) ; else if (q && !is_response(q->info.typ)) fprintf(fd, " \n", ns_remove(p->sym->name)); else if (q) fprintf(fd, " \n", ns_remove(((Tnode*)q->info.typ->ref)->id->name)); if (sp) for (m = sp->list; m; m = m->next) if ((m->mess&FAULT) && is_eq_nons(m->name, p->sym->name)) fprintf(fd, " \n", ns_remove(m->part), ns_remove(m->part)); fprintf(fd, " \n"); } } fprintf(fd, "\n\n"); for (prot = 0x01; prot <= 0x10; prot <<= 1) { if ((prot & mask)) { const char *v = ""; switch (prot) { case 0x01: v = ""; break; case 0x02: v = "GET"; break; case 0x04: v = "PUT"; break; case 0x08: v = "DELETE"; break; case 0x10: v = "POST"; break; } fprintf(fd, "porttype) fprintf(fd, "type=\"tns:%s\">\n porttype); else fprintf(fd, "type=\"tns:%s\">\n porttype) fprintf(fd, "type=\"tns:%s\">\n porttype); else fprintf(fd, "type=\"tns:%s\">\n transport) fprintf(fd, " transport=\"%s\"/>\n", sp->transport); else fprintf(fd, " transport=\"http://schemas.xmlsoap.org/soap/http\"/>\n"); } else { if (sp && sp->porttype) fprintf(fd, "type=\"tns:%s\">\n \n", sp->porttype, v); else fprintf(fd, "type=\"tns:%s\">\n \n", ns_cname(name, "PortType"), v); } fflush(fd); for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) { action = ""; mimein = NULL; mimeout = NULL; method_style = style; method_encoding = encoding; method_response_encoding = NULL; if (sp) { int v = 0x01; if (sp->protocol) { if (strncmp(sp->protocol, "SOAP", 4)) { if (strstr(sp->protocol, "GET")) v = 0x02; else if (strstr(sp->protocol, "PUT")) v = 0x04; else if (strstr(sp->protocol, "DELETE")) v = 0x08; else /* assume POST */ v = 0x10; } } for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name)) { if (m->mess&MIMEIN) mimein = m->part; if (m->mess&MIMEOUT) mimeout = m->part; if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; else if (m->mess == STYLE) method_style = m->part; else if (m->mess == ACTION || m->mess == REQUEST_ACTION) action = m->part; else if (m->mess == RESPONSE_ACTION) action = m->part; else if (m->mess == PROTOCOL) { if (strncmp(m->part, "SOAP", 4)) { if (strstr(m->part, "GET")) v = 0x02; else if (strstr(m->part, "PUT")) v = 0x04; else if (strstr(m->part, "DELETE")) v = 0x08; else /* assume POST */ v = 0x10; } else v = 0x1; } } } if (soap_version < 0) v = 0x10; /* -0 option: POST */ if (prot != v) continue; } if (!method_response_encoding) method_response_encoding = method_encoding; fprintf(fd, " \n", ns_remove(p->sym->name)); if (prot == 0x01) { if (is_document(style)) { if (is_document(method_style)) { if (is_soap12(encoding) && !*action) fprintf(fd, " \n"); else if (*action == '"') fprintf(fd, " \n", action); else fprintf(fd, " \n", action); } else if (is_soap12(encoding) && !*action) fprintf(fd, " \n"); else if (*action == '"') fprintf(fd, " \n", action); else fprintf(fd, " \n", action); } else { if (is_document(method_style)) { if (is_soap12(encoding) && !*action) fprintf(fd, " \n"); else if (*action == '"') fprintf(fd, " \n", action); else fprintf(fd, " \n", action); } else if (is_soap12(encoding) && !*action) fprintf(fd, " \n"); else if (*action == '"') fprintf(fd, " \n", action); else fprintf(fd, " \n", action); } } else { if (!*action) fprintf(fd, " \n"); else if (*action == '"') fprintf(fd, " \n", action); else fprintf(fd, " \n", action); } fprintf(fd, " \n"); q = entry(classtable, p->sym); if (prot == 0x01) { if (mimein) fprintf(fd, " \n \n"); if (is_literal(method_encoding) || (q && (q = (((Table*)q->info.typ->ref)->list)) && q && is_XML(q->info.typ))) { if (is_document(method_style)) fprintf(fd, " \n"); else fprintf(fd, " \n", URI); } else { if (encoding && *encoding) fprintf(fd, " \n", encoding, URI); else if (method_encoding && *method_encoding) fprintf(fd, " \n", method_encoding, URI); else fprintf(fd, " \n", encURI, URI); if (!eflag) { sprintf(errbuf, "operation '%s' is specific to SOAP encoding only and not compliant with WS-I Basic Profile 1.0a", p->sym->name); compliancewarn(errbuf); } } if (custom_header) { m = NULL; if (sp) { for (m = sp->list; m; m = m->next) if (is_eq_nons(m->name, p->sym->name) && (m->mess&HDRIN)) { if (chkhdr(m->part)) fprintf(fd, " \n", name, ns_remove(m->part)); } } } if (mimein) { if (sp) { for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name) && (m->mess&MIMEIN)) fprintf(fd, " \n \n \n", m->part); } } fprintf(fd, " \n \n"); } } else if (prot == 0x02) fprintf(fd, " \n"); else { if (mimein) fprintf(fd, " \n", mimein); else if (!q || is_document(method_style)) fprintf(fd, " \n"); else fprintf(fd, " \n", ns_remove(q->sym->name)); } fprintf(fd, " \n"); q = (Entry*)p->info.typ->ref; if (!q || !q->info.typ->ref) { fprintf(fd, " \n"); continue; } if (prot != 0x04) { fprintf(fd, " \n"); if (prot == 0x01) { if (mimeout) fprintf(fd, " \n \n"); if (is_literal(method_response_encoding) || is_XML((Tnode*)q->info.typ->ref)) { if (is_document(method_style)) fprintf(fd, " \n"); else fprintf(fd, " \n", URI); } else if (encoding && *encoding) fprintf(fd, " \n", encoding, URI); else if (method_response_encoding && *method_response_encoding) fprintf(fd, " \n", method_response_encoding, URI); else fprintf(fd, " \n", encURI, URI); if (custom_header) { if (sp) for (m = sp->list; m; m = m->next) if (is_eq_nons(m->name, p->sym->name) && (m->mess&HDROUT)) { if (chkhdr(m->part)) fprintf(fd, " \n", name, ns_remove(m->part)); } } if (mimeout) { if (sp) { for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name) && (m->mess&MIMEOUT)) fprintf(fd, " \n \n \n", m->part); } } fprintf(fd, " \n \n"); } } else { q = (Entry*)p->info.typ->ref; if (mimeout) fprintf(fd, " \n", mimeout); else if (is_document(method_style)) fprintf(fd, " \n"); else if (q && !is_transient(q->info.typ) && !is_response(q->info.typ) && is_literal(method_response_encoding)) fprintf(fd, " \n", ns_remove(q->sym->name)); else fprintf(fd, " \n"); } fprintf(fd, " \n"); } if (sp) for (m = sp->list; m; m = m->next) if ((m->mess&FAULT) && is_eq_nons(m->name, p->sym->name)) fprintf(fd, " \n \n \n", ns_remove(m->part), ns_remove(m->part)); fprintf(fd, " \n"); fflush(fd); } } fprintf(fd, "\n\n"); } } } fprintf(fd, "\n", name); if (sp && sp->documentation) { fprintf(fd, " \n "); gen_text(fd, sp->documentation); fprintf(fd, "\n \n"); } else { fprintf(fd, " gSOAP " VERSION " generated service definition\n"); } for (prot = 0x01; prot <= 0x10; prot <<= 1) { if ((prot & mask)) { const char *s, *t, *v = "", *b = "", *e = NULL; switch (prot) { case 0x01: v = ""; b = "SOAP"; break; case 0x02: v = "GET"; b = "HTTP"; break; case 0x04: v = "PUT"; b = "HTTP"; break; case 0x08: v = "DELETE"; b = "HTTP"; break; case 0x10: v = "POST"; b = "HTTP"; break; } fprintf(fd, " \n", portname, v, binding, v); if (executable) e = executable; for (s = URL; s; s = t) { int n; t = strchr(s, ' '); if (t) { n = (int)(t - s); t++; } else n = (int)strlen(s); if (e) fprintf(fd, " <%s:address location=\"%.*s/%s\"/>\n", b, n, s, e); else fprintf(fd, " <%s:address location=\"%.*s\"/>\n", b, n, s); } fprintf(fd, " \n"); hasport = 1; } } if (!hasport && executable) { const char *s, *t; fprintf(fd, " \n", portname, binding); for (s = URL; s; s = t) { int n; t = strchr(s, ' '); if (t) { n = (int)(t - s); t++; } else n = (int)strlen(s); fprintf(fd, " \n", n, s, executable); } fprintf(fd, " \n"); } fprintf(fd, "\n\n\n"); } const char * default_value(Entry *e) { Tnode *p = e->info.typ; Entry *q; static char buf[4096]; buf[0] = '\0'; if (e->info.ptrval) p = p->ref; if (e->info.hasval || e->info.ptrval) { switch (p->type) { case Tchar: case Twchar: case Tuchar: case Tshort: case Tushort: case Tint: case Tuint: case Tlong: case Tllong: case Tulong: case Tullong: case Tsize: sprintf(buf, SOAP_LONG_FORMAT, e->info.val.i); break; case Tfloat: case Tdouble: case Tldouble: sprintf(buf, "%.17lG", e->info.val.r); break; case Ttime: break; /* should get value? */ case Tenum: case Tenumsc: if (p->ref) { for (q = ((Table*)p->ref)->list; q; q = q->next) { if (q->info.val.i == e->info.val.i) { sprintf(buf, "%s", ns_remove2(q->sym->name, c_ident(p))); break; } } } break; default: if (e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-12) sprintf(buf, "%s", xstring(e->info.val.s)); break; } } else { switch (p->type) { case Tchar: case Twchar: case Tuchar: case Tshort: case Tushort: case Tint: case Tuint: case Tlong: case Tllong: case Tulong: case Tullong: case Tsize: if (p->hasmin && p->imin > 0) sprintf(buf, SOAP_LONG_FORMAT, p->imin + (p->incmin == False)); else if (p->hasmax && p->imax < 0) sprintf(buf, SOAP_LONG_FORMAT, p->imax - (p->incmax == False)); else strcpy(buf, "0"); break; case Tfloat: case Tdouble: case Tldouble: if (p->hasmin && p->rmin > 0) sprintf(buf, "%.17lG", p->rmin * (1 + (p->incmin == False)/1000)); else if (p->hasmax && p->rmax > 0) sprintf(buf, "%.17lG", p->rmax * (1 - (p->incmax == False)/1000)); else if (p->hasmin && p->rmin < 0) sprintf(buf, "%.17lG", p->rmin * (1 - (p->incmin == False)/1000)); else if (p->hasmax && p->rmax < 0) sprintf(buf, "%.17lG", p->rmax * (1 + (p->incmax == False)/1000)); else strcpy(buf, "0"); break; case Ttime: break; /* should get value? */ case Tenum: case Tenumsc: if (p->ref) if ((q = ((Table*)p->ref)->list)) sprintf(buf, "%s", ns_remove2(q->sym->name, c_ident(p))); break; default: break; } } return buf; } const char * set_default_value(Entry *e) { const char *a; Entry *q; static char buf[4096]; buf[0] = '\0'; if (e->info.fixed) a = "fixed"; else a = "default"; if (e->info.hasval || e->info.ptrval) { Tnode *p = e->info.typ; if (e->info.ptrval) p = p->ref; switch (p->type) { case Tchar: case Twchar: case Tuchar: case Tshort: case Tushort: case Tint: case Tuint: case Tlong: case Tllong: case Tulong: case Tullong: case Tsize: sprintf(buf, " %s=\"" SOAP_LONG_FORMAT "\"", a, e->info.val.i); break; case Tfloat: case Tdouble: case Tldouble: sprintf(buf, " %s=\"%.17lG\"", a, e->info.val.r); break; case Ttime: break; /* should get value? */ case Tenum: case Tenumsc: if (p->ref) { for (q = ((Table*)p->ref)->list; q; q = q->next) { if (q->info.val.i == e->info.val.i) { sprintf(buf, " %s=\"%s\"", a, ns_remove2(q->sym->name, c_ident(p))); break; } } } break; default: if (e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-12) sprintf(buf, " %s=\"%s\"", a, xstring(e->info.val.s)); break; } } return buf; } const char * nillable(Entry *e) { if (e->info.nillable && (e->info.typ->type == Tpointer || is_smart(e->info.typ))) return " nillable=\"true\""; return ""; } const char * nillable_ref(Entry *e) { if (e->info.nillable && (((Tnode*)e->info.typ->ref)->type == Tpointer || is_smart(e->info.typ->ref))) return " nillable=\"true\""; return ""; } void gen_schema(FILE *fd, Table *t, const char *ns1, const char *ns, int all, const char *style, const char *encoding) { Entry *p, *q, *r; Tnode *n; Symbol *s; Service *sp, *sp2; Method *m; int flag; if (!strcmp(ns, "SOAP-ENV") || !strcmp(ns, "SOAP-ENC") || !strcmp(ns, "xsi") || !strcmp(ns, "xsd")) return; for (sp = services; sp; sp = sp->next) if (!tagcmp(sp->ns, ns) && sp->URI) break; if (sp && sp->import) return; fprintf(fd, " URI); else fprintf(fd, "targetNamespace=\"%s/%s.xsd\"", tmpURI, ns_convert(ns)); for (s = nslist; s; s = s->next) { for (sp2 = services; sp2; sp2 = sp2->next) if (!tagcmp(sp2->ns, s->name) && sp2->URI) break; if (sp2) fprintf(fd, "\n xmlns:%s=\"%s\"", ns_convert(s->name), sp2->URI); else if (!strcmp(s->name, "SOAP-ENV")) { if (soap_version >= 0) fprintf(fd, "\n xmlns:SOAP-ENV=\"%s\"", envURI); } else if (!strcmp(s->name, "SOAP-ENC")) { if (soap_version >= 0) fprintf(fd, "\n xmlns:SOAP-ENC=\"%s\"", encURI); } else if (!strcmp(s->name, "xsi")) fprintf(fd, "\n xmlns:xsi=\"%s\"", xsiURI); else if (!strcmp(s->name, "xsd")) fprintf(fd, "\n xmlns:xsd=\"%s\"", xsdURI); else fprintf(fd, "\n xmlns:%s=\"%s/%s.xsd\"", ns_convert(s->name), tmpURI, ns_convert(s->name)); } fprintf(fd, "\n xmlns=\"%s\"\n", xsdURI); if (sp && (sp->elementForm || sp->attributeForm)) fprintf(fd, " elementFormDefault=\"%s\"\n attributeFormDefault=\"%s\">\n", sp->elementForm?sp->elementForm:"unqualified", sp->attributeForm?sp->attributeForm:"unqualified"); else fprintf(fd, " elementFormDefault=\"unqualified\"\n attributeFormDefault=\"unqualified\">\n"); fflush(fd); flag = 0; for (s = nslist; s; s = s->next) { for (sp2 = services; sp2; sp2 = sp2->next) if (sp2 != sp && !tagcmp(sp2->ns, s->name) && sp2->URI) break; if (sp2) { fprintf(fd, " URI); if (sp2->import) fprintf(fd, " schemaLocation=\"%s\"", sp2->import); fprintf(fd, "/>\n"); if (!strcmp(sp2->URI, encURI)) flag = 1; } } if (!flag) fprintf(fd, " ", encURI); fprintf(fd, "\n"); fflush(fd); if (typetable) { for (p = typetable->list; p; p = p->next) { if (is_transient(p->info.typ) || is_invisible(p->sym->name) || p->info.typ->type == Ttemplate) continue; if (is_element(p->info.typ) && (p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && !is_stdstr(p->info.typ)) continue; if ((!is_external(p->info.typ) || is_volatile(p->info.typ)) && ((has_ns_eq(ns, p->sym->name)))) { /* typedefs that are used for SOAP Fault details */ m = NULL; if (p->info.typ->type != Tstruct && p->info.typ->type != Tclass) { for (sp2 = services; sp2 && !m; sp2 = sp2->next) { for (m = sp2->list; m; m = m->next) { if ((m->mess&FAULT) && m->part && is_eq(m->part, p->sym->name)) break; } } } if (m) { if (!uflag) fprintf(fd, " \n"); fprintf(fd, " \n", ns_tag_remove(p), base_type(p->info.typ, ns1)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n"); continue; } if (is_primitive_or_string(p->info.typ) || is_binary(p->info.typ) || (p->info.typ->type == Tpointer && is_primitive_or_string((Tnode*)p->info.typ->ref))) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); if (!is_synonym(p->info.typ) && p->info.typ->pattern && p->info.typ->pattern[0] == '%' && p->info.typ->pattern[1]) { unsigned int n = (unsigned int)strtoul(p->info.typ->pattern + 1, NULL, 10); unsigned int f = 0; const char *s = strchr(p->info.typ->pattern, '.'); if (s) f = (unsigned int)strtoul(s + 1, NULL, 10); if (s && f && (p->info.typ->type == Tfloat || p->info.typ->type == Tdouble || p->info.typ->type == Tldouble)) { fprintf(fd, " \n", base_type(p->info.typ, ns1)); if (n) fprintf(fd, " \n", n); fprintf(fd, " \n", f); } else if (n && (p->info.typ->type == Tfloat || p->info.typ->type == Tdouble || p->info.typ->type == Tldouble)) { fprintf(fd, " \n", base_type(p->info.typ, ns1)); fprintf(fd, " \n", n); } else if (n && p->info.typ->type >= Tchar && p->info.typ->type <= Tullong) { fprintf(fd, " \n", base_type(p->info.typ, ns1)); fprintf(fd, " \n", n); } else { fprintf(fd, " \n", base_type(p->info.typ, ns1)); } } else { fprintf(fd, " \n", base_type(p->info.typ, ns1)); if (!is_synonym(p->info.typ) && p->info.typ->pattern) fprintf(fd, " \n", p->info.typ->pattern); } if (is_primitive(p->info.typ) || (p->info.typ->type == Tpointer && is_primitive((Tnode*)p->info.typ->ref) && !is_string(p->info.typ) && !is_wstring(p->info.typ))) { if (!is_synonym(p->info.typ) && p->info.typ->hasmin) { if (p->info.typ->type >= Tfloat && p->info.typ->type <= Tldouble) { if (p->info.typ->incmin) fprintf(fd, " \n", p->info.typ->rmin); else fprintf(fd, " \n", p->info.typ->rmin); } else { if (p->info.typ->incmin) fprintf(fd, " \n", p->info.typ->imin); else fprintf(fd, " \n", p->info.typ->imin); } } if (!is_synonym(p->info.typ) && p->info.typ->hasmax) { if (p->info.typ->type >= Tfloat && p->info.typ->type <= Tldouble) { if (p->info.typ->incmax) fprintf(fd, " \n", p->info.typ->rmax); else fprintf(fd, " \n", p->info.typ->rmax); } else { if (p->info.typ->incmax) fprintf(fd, " \n", p->info.typ->imax); else fprintf(fd, " \n", p->info.typ->imax); } } } else { if (!is_synonym(p->info.typ) && p->info.typ->hasmax && p->info.typ->imax >= 0 && p->info.typ->incmin && p->info.typ->incmax && p->info.typ->imin == p->info.typ->imax) fprintf(fd, " \n", p->info.typ->imax); else { if (!is_synonym(p->info.typ) && p->info.typ->hasmin && p->info.typ->imin >= 0) { if (p->info.typ->incmin) fprintf(fd, " \n", p->info.typ->imin); else fprintf(fd, " \n", p->info.typ->imin + 1); } if (!is_synonym(p->info.typ) && p->info.typ->hasmax && p->info.typ->imax >= 0) { if (p->info.typ->incmax) fprintf(fd, " \n", (ULONG64)p->info.typ->imax); else fprintf(fd, " \n", (ULONG64)p->info.typ->imax - 1); } } } fprintf(fd, " \n \n"); } else if (is_fixedstring(p->info.typ)) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n", base_type(p->info.typ, ns1)); if (!is_synonym(p->info.typ) && p->info.typ->hasmin && p->info.typ->imin >= 0) { if (p->info.typ->incmin) fprintf(fd, " \n", p->info.typ->imin); else fprintf(fd, " \n", p->info.typ->imin + 1); } if (!is_synonym(p->info.typ) && p->info.typ->hasmax && p->info.typ->imax >= 0) { if (p->info.typ->incmax) fprintf(fd, " \n", p->info.typ->imax); else fprintf(fd, " \n", p->info.typ->imax - 1); } else fprintf(fd, " \n", get_dimension(p->info.typ) - 1); fprintf(fd, " \n \n"); } else if (is_restriction(p->info.typ) && !has_ns_eq("xsd", p->info.typ->restriction->name)) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n", base_type(p->info.typ, ns1)); fprintf(fd, " \n \n \n"); } else { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n", base_type(p->info.typ, ns1)); fprintf(fd, " \n \n"); } } } } fflush(fd); if (enumtable) for (p = enumtable->list; p; p = p->next) gen_schema_type(fd, t, p, ns1, ns, all, style, encoding); fflush(fd); if (classtable) { for (p = classtable->list; p; p = p->next) { if (is_transient(p->info.typ) || is_invisible(p->sym->name)) continue; for (q = t->list; q; q = q->next) if (q->info.typ->type == Tfun && !(q->info.sto & Sextern) && p == get_response(q->info.typ)) break; /* omit the auto-generated and user-defined response struct/class (when necessary) */ if (!q) for (q = t->list; q; q = q->next) if (q->info.typ->type == Tfun && !(q->info.sto & Sextern) && !has_ns_eq(NULL, ((Entry*)q->info.typ->ref)->sym->name)) { r = entry(t, q->sym); if (r && r->info.typ->ref && is_response(((Entry*)r->info.typ->ref)->info.typ) && p->info.typ == (Tnode*)((Entry*)r->info.typ->ref)->info.typ->ref) break; } if (q) continue; /* classes that are used for SOAP Fault details */ m = NULL; for (sp2 = services; sp2 && !m; sp2 = sp2->next) for (m = sp2->list; m; m = m->next) if ((m->mess&FAULT) && m->part && is_eq(m->part, p->sym->name)) break; if (m) { if ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name)) { if (!uflag) fprintf(fd, " \n"); fprintf(fd, " \n", ns_tag_remove(p), base_type(p->info.typ, ns1)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n"); } } gen_schema_type(fd, t, p, ns1, ns, all, style, encoding); } } fflush(fd); for (n = Tptr[Tarray]; n; n = n->next) { if (is_transient(n) || is_fixedstring(n)) continue; if (is_literal(encoding)) fprintf(fd, " \n \n \n \n \n", c_ident(n), wsdl_type((Tnode*)n->ref, ns1), get_dimension(n)); else fprintf(fd, " \n \n \n \n \n \n \n \n \n", c_ident(n), xsi_type((Tnode*)n->ref), get_dimension(n)); fflush(fd); } gen_schema_elements_attributes(fd, t, ns, ns1, style, encoding); fprintf(fd, " \n\n"); } void gen_schema_type(FILE *fd, Table *t, Entry *p, const char *ns1, const char *ns, int all, const char *style, const char *encoding) { int i, d; char cbuf[4]; Entry *q; Tnode *typ = p->info.typ; if (!typ->ref) return; if (typ->type == Tenum || typ->type == Tenumsc) { int flag; if (!is_transient(p->info.typ) && !is_invisible(p->sym->name) && ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name))) { flag = 0; if ((Table*)p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (!has_ns_eq(NULL, ns_remove2(q->sym->name, c_ident(p->info.typ)))) { flag = 1; break; } } if (flag == 1) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { const char *s = ns_remove2(q->sym->name, c_ident(p->info.typ)); while (*s && isdigit(*s)) s++; if (*s) { flag = 2; break; } } } } fprintf(fd, " ", wsdl_type(p->info.typ, NULL)); gen_type_documentation(fd, p, ns); if (is_mask(p->info.typ)) { fprintf(fd, " \n"); if (flag == 0) fprintf(fd, " \n"); else if (flag == 1) fprintf(fd, " \n"); else fprintf(fd, " \n"); if ((Table*)p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (!uflag) fprintf(fd, " \n", q->info.val.i); fprintf(fd, " sym->name, c_ident(p->info.typ))); if (gen_member_documentation(fd, p->sym, q, ns, q->info.typ->type == Tenumsc)) fprintf(fd, " \n"); } } fprintf(fd, " \n \n \n"); } else { if (flag == 0) fprintf(fd, " \n"); else if (flag == 1) fprintf(fd, " \n"); else fprintf(fd, " \n"); if ((Table*)p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (!uflag) fprintf(fd, " \n", q->info.val.i); fprintf(fd, " sym->name, c_ident(p->info.typ))); if (gen_member_documentation(fd, p->sym, q, ns, q->info.typ->type == Tenumsc)) fprintf(fd, " \n"); } } fprintf(fd, " \n \n"); } } } else if (is_binary(typ)) { if ((!has_ns(typ) && all) || has_ns_eq(ns, p->sym->name)) { if (is_attachment(typ)) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n"); fprintf(fd, " "); if (!uflag) fprintf(fd, ""); fprintf(fd, "\n"); gen_schema_attributes(fd, typ, NULL, ns, ns1); fprintf(fd, " \n \n \n"); } else { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); if (is_hexBinary(typ)) fprintf(fd, " \n"); else fprintf(fd, " \n"); if (typ->hasmax && typ->imax >= 0 && typ->incmin && typ->incmax && typ->imin == typ->imax) fprintf(fd, " \n", typ->imin); else { if (typ->hasmin && typ->imin >= 0) { if (typ->incmin) fprintf(fd, " \n", typ->imin); else fprintf(fd, " \n", typ->imin + 1); } if (typ->hasmax && typ->imax >= 0) { if (typ->incmax) fprintf(fd, " \n", typ->imax); else fprintf(fd, " \n", typ->imax - 1); } } fprintf(fd, " \n \n"); } } } else if (!is_transient(typ) && is_primclass(typ)) { if ((!has_ns(typ) && all) || has_ns_eq(ns, p->sym->name)) { q = ((Table*)typ->ref)->list; if (q && strncmp(q->sym->name, "xsd__anyType", 12)) { if (is_string(q->info.typ) || is_wstring(q->info.typ) || is_stdstring(q->info.typ) || is_stdwstring(q->info.typ)) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n", wsdl_type(q->info.typ, ns1)); gen_schema_attributes(fd, typ, NULL, ns, ns1); fprintf(fd, " \n \n \n"); } else { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n", wsdl_type(q->info.typ, ns1)); gen_schema_attributes(fd, typ, NULL, ns, ns1); fprintf(fd, " \n \n \n"); } } } } else if (!is_transient(typ)) { q = ((Table*)typ->ref)->list; if (t && entry(t, p->sym) && (!q || !is_XML(q->info.typ))) ; else if (is_dynamic_array(typ)) { if (eflag || (!has_ns(typ) && !is_untyped(typ))) { if (all && strcmp(typ->id->name, "SOAP_ENC__Array")) { d = get_Darraydims(typ)-1; for (i = 0; i < d; i++) cbuf[i] = ','; cbuf[i] = '\0'; if (q->info.maxOccurs == 1) { fprintf(fd, " \n \n", wsdl_type(typ, NULL)); if (!is_literal(encoding)) fprintf(fd, " \n"); fprintf(fd, " \n \n \n", q->tag?ns_tag_remove(q):q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), nillable_ref(q)); if (!is_literal(encoding)) fprintf(fd, " \n \n", wsdl_type(q->info.typ, ns1), cbuf); fprintf(fd, " \n \n"); } else { fprintf(fd, " \n \n", wsdl_type(typ, NULL)); if (!is_literal(encoding)) fprintf(fd, " \n"); fprintf(fd, " \n \n \n", q->tag?ns_tag_remove(q):q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), q->info.minOccurs, q->info.maxOccurs, nillable_ref(q)); if (!is_literal(encoding)) fprintf(fd, " \n \n", wsdl_type(q->info.typ, ns1), cbuf); fprintf(fd, " \n \n"); } } } else if (typ->ref && ((Table*)typ->ref)->prev && !is_transient(entry(classtable, ((Table*)typ->ref)->prev->sym)->info.typ) && strncmp(((Table*)typ->ref)->prev->sym->name, "xsd__anyType", 12)) { if (q->info.maxOccurs == 1) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n \n", ns_convert(((Table*)typ->ref)->prev->sym->name)); fprintf(fd, " \n", q->tag?ns_tag_remove(q):q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1)); fprintf(fd, " \n \n \n"); gen_schema_attributes(fd, typ, NULL, ns, ns1); fprintf(fd, " \n"); } else { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n \n", ns_convert(((Table*)typ->ref)->prev->sym->name)); fprintf(fd, " \n", q->tag?ns_tag_remove(q):q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), q->info.minOccurs, q->info.maxOccurs, nillable_ref(q)); fprintf(fd, " \n \n \n"); gen_schema_attributes(fd, typ, NULL, ns, ns1); fprintf(fd, " \n"); } } else if (strcmp(typ->id->name, "SOAP_ENC__Array")) { if (q->info.maxOccurs == 1) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n \n \n", q->tag?ns_tag_remove(q):q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), nillable_ref(q)); } else { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n \n \n", q->tag?ns_tag_remove(q):q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), q->info.minOccurs, q->info.maxOccurs, nillable_ref(q)); } } } else if (is_discriminant(typ) && ((!has_ns(typ) && all) || has_ns_eq(ns, p->sym->name))) { if (typ->ref) { fprintf(fd, " \n", ns_remove(p->sym->name)); gen_schema_elements(fd, typ, NULL, ns, ns1); fprintf(fd, " \n"); } } else if (typ->type == Tstruct && ((!has_ns(typ) && all) || has_ns_eq(ns, p->sym->name))) { if (typ->ref) { Entry *base = base_type_of_derived(typ); if (base) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n \n", ns_convert(base->sym->name)); gen_schema_elements(fd, typ, base->info.typ, ns, ns1); fprintf(fd, " \n \n \n"); gen_schema_attributes(fd, typ, base->info.typ, ns, ns1); fprintf(fd, " \n"); } else { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n"); gen_schema_elements(fd, typ, NULL, ns, ns1); fprintf(fd, " \n"); gen_schema_attributes(fd, typ, NULL, ns, ns1); fprintf(fd, " \n"); } } } else if (typ->type == Tclass && ((!has_ns(typ) && all) || has_ns_eq(ns, p->sym->name))) { if (typ->ref) { Entry *base = base_type_of_derived(typ); if (((Table*)typ->ref)->prev && !is_transient(entry(classtable, ((Table*)typ->ref)->prev->sym)->info.typ) && strncmp(((Table*)typ->ref)->prev->sym->name, "xsd__anyType", 12)) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n \n", ns_convert(((Table*)typ->ref)->prev->sym->name)); gen_schema_elements(fd, typ, NULL, ns, ns1); fprintf(fd, " \n \n \n"); gen_schema_attributes(fd, typ, NULL, ns, ns1); fprintf(fd, " \n"); } else if (base) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n \n", ns_convert(base->sym->name)); gen_schema_elements(fd, typ, base->info.typ, ns, ns1); fprintf(fd, " \n \n \n"); gen_schema_attributes(fd, typ, base->info.typ, ns, ns1); fprintf(fd, " \n"); } else { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n"); gen_schema_elements(fd, typ, NULL, ns, ns1); fprintf(fd, " \n"); gen_schema_attributes(fd, typ, NULL, ns, ns1); fprintf(fd, " \n"); } } } } fflush(fd); } void gen_schema_elements(FILE *fd, Tnode *p, Tnode *b, const char *ns, const char *ns1) { Entry *q; for (q = ((Table*)p->ref)->list; q; q = q->next) { if (b) { Entry *e; for (e = ((Table*)b->ref)->list; e; e = e->next) if (q->info.typ == e->info.typ && q->sym == e->sym) break; if (e) continue; } if (gen_schema_element(fd, p, q, ns, ns1)) q = q->next; } } int gen_schema_element(FILE *fd, Tnode *p, Entry *q, const char *ns, const char *ns1) { const char *s, *t; if (is_transient(q->info.typ) || (q->info.sto & Sattribute) || q->info.typ->type == Tfun || q->info.typ->type == Tunion) return 0; if (is_repetition(q)) { if (is_sequence(q->next)) { if (q->info.maxOccurs == 1) fprintf(fd, " \n", q->info.minOccurs); else fprintf(fd, " \n", q->info.minOccurs, q->info.maxOccurs); if (q->next->info.typ->ref) gen_schema_elements(fd, (Tnode*)q->next->info.typ->ref, NULL, ns, ns1); fprintf(fd, " \n"); return 1; } t = ns_tag_convert(q->next); if (*t == '-') { fprintf(fd, " "); if (!uflag) fprintf(fd, "", q->next->sym->name); fprintf(fd, "\n"); } else if ((s = strchr(t+1, ':')) && (!strchr(q->next->sym->name+1, ':') || !has_ns_eq(ns, q->next->sym->name))) { if (((Tnode*)q->next->info.typ->ref)->type == Tpointer) { if (q->info.maxOccurs == 1) fprintf(fd, " info.minOccurs); else fprintf(fd, " info.minOccurs, q->info.maxOccurs); } else if (q->info.maxOccurs == 1) fprintf(fd, " info.minOccurs); else fprintf(fd, " info.minOccurs, q->info.maxOccurs); if (gen_member_documentation(fd, p->id, q, ns, 1)) fprintf(fd, " \n"); } else { const char *form = ""; if (!s) { s = t; if (*s == ':') { s++; form = " form=\"unqualified\""; } } else { s++; form = " form=\"qualified\""; } if (((Tnode*)q->next->info.typ->ref)->type == Tpointer) { if (q->info.maxOccurs == 1) fprintf(fd, " next->info.typ->ref, ns1), q->info.minOccurs, nillable(q), form); else fprintf(fd, " next->info.typ->ref, ns1), q->info.minOccurs, q->info.maxOccurs, nillable(q), form); } else if (q->info.maxOccurs == 1) fprintf(fd, " next->info.typ->ref, ns1), q->info.minOccurs, form); else fprintf(fd, " next->info.typ->ref, ns1), q->info.minOccurs, q->info.maxOccurs, form); if (gen_member_documentation(fd, p->id, q, ns, 1)) fprintf(fd, " \n"); } return 1; } else if ((q->info.typ->type == Ttemplate && !is_smart(q->info.typ)) || (q->info.typ->type == Tpointer && ((Tnode*)q->info.typ->ref)->type == Ttemplate) || (q->info.typ->type == Treference && ((Tnode*)q->info.typ->ref)->type == Ttemplate) || (q->info.typ->type == Trvalueref && ((Tnode*)q->info.typ->ref)->type == Ttemplate)) { t = ns_tag_convert(q); if (*t == '-') { fprintf(fd, " "); if (!uflag) fprintf(fd, "", q->sym->name); fprintf(fd, "\n"); } else if ((s = strchr(t+1, ':')) && (!strchr(q->sym->name+1, ':') || !has_ns_eq(ns, q->sym->name))) { if (((Tnode*)q->info.typ->ref)->type == Tpointer) { if (q->info.maxOccurs == 1) fprintf(fd, " info.minOccurs); else fprintf(fd, " info.minOccurs, q->info.maxOccurs); } else if (q->info.maxOccurs == 1) fprintf(fd, " info.minOccurs); else fprintf(fd, " info.minOccurs, q->info.maxOccurs); if (gen_member_documentation(fd, p->id, q, ns, 1)) fprintf(fd, " \n"); } else { const char *form = ""; if (!s) { s = t; if (*s == ':') { s++; form = " form=\"unqualified\""; } } else { s++; form = " form=\"qualified\""; } if (((Tnode*)q->info.typ->ref)->type == Tpointer) { if (q->info.maxOccurs == 1) fprintf(fd, " info.typ->ref, ns1), q->info.minOccurs, nillable(q), form); else fprintf(fd, " info.typ->ref, ns1), q->info.minOccurs, q->info.maxOccurs, nillable(q), form); } else if (q->info.maxOccurs == 1) fprintf(fd, " info.typ->ref, ns1), q->info.minOccurs, form); else fprintf(fd, " info.typ->ref, ns1), q->info.minOccurs, q->info.maxOccurs, form); if (gen_member_documentation(fd, p->id, q, ns, 1)) fprintf(fd, " \n"); } } else if (is_anytype(q)) /* ... maybe need to show all possible types rather than xsd:anyType */ { t = ns_tag_convert(q->next); if (*t == '-') { fprintf(fd, " "); if (!uflag) fprintf(fd, "", q->next->sym->name); fprintf(fd, "\n"); } else { fprintf(fd, " \n", t, q->info.minOccurs, q->info.maxOccurs); } return 1; } else if (is_choice(q)) { if (q->info.minOccurs == 0) fprintf(fd, " \n"); else fprintf(fd, " \n"); if (q->next->info.typ->ref) gen_schema_elements(fd, q->next->info.typ, NULL, ns, ns1); fprintf(fd, " \n"); return 1; } else if (is_sequence(q)) { if (q->info.minOccurs == 0) fprintf(fd, " \n"); else fprintf(fd, " \n"); if (q->info.typ->type == Tpointer) gen_schema_elements(fd, (Tnode*)q->info.typ->ref, NULL, ns, ns1); else if (q->info.typ->ref) gen_schema_elements(fd, q->info.typ, NULL, ns, ns1); fprintf(fd, " \n"); return 0; } else { t = ns_tag_convert(q); if (*t == '-' || !*t) { fprintf(fd, " "); if (!uflag) fprintf(fd, "", q->sym->name); fprintf(fd, "\n"); } else if ((s = strchr(t+1, ':')) && (!strchr(q->sym->name+1, ':') || !has_ns_eq(ns, q->sym->name))) { fprintf(fd, " info.minOccurs, q->info.maxOccurs, nillable(q), set_default_value(q)); if (gen_member_documentation(fd, p->id, q, ns, 1)) fprintf(fd, " \n"); } else { const char *form = ""; if (!s) { s = t; if (*s == ':') { s++; form = " form=\"unqualified\""; } } else { s++; form = " form=\"qualified\""; } fprintf(fd, " info.typ, ns1), q->info.minOccurs, q->info.maxOccurs, nillable(q), set_default_value(q), form); if (gen_member_documentation(fd, p->id, q, ns, 1)) fprintf(fd, " \n"); } } fflush(fd); return 0; } void gen_schema_elements_attributes(FILE *fd, Table *t, const char *ns, const char *ns1, const char *style, const char *encoding) { Entry *p, *q, *e; Table *elt, *att; Service *sp; Method *m; Symbol *sym; const char *s, *method_style, *method_encoding, *method_response_encoding; int all = !strcmp(ns, ns1); elt = mktable(NULL); att = mktable(NULL); if (t && all) { for (p = t->list; p; p = p->next) { if (!eflag && p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) { method_encoding = encoding; method_response_encoding = NULL; method_style = style; for (sp = services; sp; sp = sp->next) { if (!tagcmp(sp->ns, ns)) { for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name)) { if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; else if (m->mess == STYLE) method_style = m->part; } } } } if (!method_response_encoding) method_response_encoding = method_encoding; q = entry(classtable, p->sym); if (q) { if (is_document(method_style)) { if (!is_invisible(p->sym->name)) { sym = p->sym; s = sym->name; if (*s == '_' && !(sym = lookup(s + 1))) sym = install(s + 1, ID); if (!entry(elt, sym)) { if (!uflag) fprintf(fd, " \n"); fprintf(fd, " \n \n \n", ns_tag_remove(p)); gen_schema_elements(fd, q->info.typ, NULL, ns, ns1); fprintf(fd, " \n"); gen_schema_attributes(fd, q->info.typ, NULL, ns, ns1); fprintf(fd, " \n \n"); e = enter(elt, sym); e->info = p->info; } } else { for (q = ((Table*)q->info.typ->ref)->list; q; q = q->next) { if (!(q->info.sto & Sextern) && !has_ns_eq(NULL, q->sym->name)) { sym = q->sym; s = sym->name; if (*s == '_' && !(sym = lookup(s + 1))) sym = install(s + 1, ID); if (!entry(elt, sym)) /* enter/entry w/o prefix is not useful to avoid clashes */ { if (!uflag) fprintf(fd, " \n"); fprintf(fd, " \n", ns_tag_remove(q), wsdl_type(q->info.typ, ns1)); e = enter(elt, sym); e->info = q->info; } } } } } q = (Entry*)p->info.typ->ref; for (e = t->list; e; e = e->next) if (e != p && e->info.typ->type == Tfun && !(e->info.sto & Sextern) && q == (Entry*)e->info.typ->ref) q = NULL; if (q && !is_transient(q->info.typ)) { if (!is_response(q->info.typ)) { if (is_document(method_style)) { if (!uflag) fprintf(fd, " \n"); fprintf(fd, " \n \n", ns_tag_remove(p)); fprintf(fd, " \n"); gen_schema_element(fd, p->info.typ, q, ns, ns1); fprintf(fd, " \n"); fprintf(fd, " \n \n"); } } else if (((Tnode*)q->info.typ->ref)->ref) { if (is_document(method_style)) { if (!has_ns_eq(NULL, q->sym->name)) { sym = ((Tnode*)q->info.typ->ref)->id; s = sym->name; if (*s == '_' && !(sym = lookup(s + 1))) sym = install(s + 1, ID); if (!entry(elt, sym)) { if (!uflag) fprintf(fd, " \n"); fprintf(fd, " \n \n", ns_remove(((Tnode*)q->info.typ->ref)->id->name), ns_convert(((Tnode*)q->info.typ->ref)->id->name), ns_remove(((Tnode*)q->info.typ->ref)->id->name)); fprintf(fd, " \n"); gen_schema_elements(fd, (Tnode*)q->info.typ->ref, NULL, ns, ns1); fprintf(fd, " \n"); gen_schema_attributes(fd, (Tnode*)q->info.typ->ref, NULL, ns, ns1); fprintf(fd, " \n"); e = enter(elt, sym); e->info = q->info; } } } } } } } } } if (t && !eflag) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern)) { q = (Entry*)p->info.typ->ref; if (q && !is_transient(q->info.typ)) { if (is_response(q->info.typ)) { if (has_ns_eq(ns, q->sym->name)) { sym = q->sym; s = sym->name; if (*s == '_' && !(sym = lookup(s + 1))) sym = install(s + 1, ID); if (!entry(elt, sym)) { if (!uflag) fprintf(fd, " \n"); fprintf(fd, " \n", ns_tag_remove(q), wsdl_type(q->info.typ, ns1)); e = enter(elt, sym); e->info = q->info; } } } } } } } for (p = typetable->list; p; p = p->next) { if (is_transient(p->info.typ) || is_primclass(p->info.typ) || is_dynamic_array(p->info.typ)) continue; if (is_element(p->info.typ) && has_ns_eq(ns, p->sym->name)) { m = NULL; for (sp = services; sp && !m; sp = sp->next) for (m = sp->list; m; m = m->next) if ((m->mess&FAULT) && m->part && is_eq(m->part, p->sym->name)) break; if (!m) { sym = p->sym; s = sym->name; if (*s == '_' && !(sym = lookup(s + 1))) sym = install(s + 1, ID); if (!entry(elt, sym)) { fprintf(fd, " \n", ns_tag_remove(p), base_type(p->info.typ, ns1)); e = enter(elt, sym); e->info = p->info; } } } } for (p = classtable->list; p; p = p->next) { if (!p->info.typ->ref || /* is_invisible(p->info.typ->id->name) || */ is_transient(p->info.typ) || is_primclass(p->info.typ) || is_dynamic_array(p->info.typ)) continue; for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (!is_repetition(q) && !is_anytype(q) && (!strchr(q->sym->name+1, ':') || !eq_ns(p->sym->name, q->sym->name)) && has_ns_eq(ns, q->sym->name) && !is_transient(q->info.typ) && q->info.typ->type != Tfun) { m = NULL; for (sp = services; sp && !m; sp = sp->next) for (m = sp->list; m; m = m->next) if ((m->mess&FAULT) && m->part && is_eq(m->part, q->sym->name)) break; if (m) continue; /* already generated element for fault */ if (!(q->info.sto & Sattribute) && (q->info.typ->type == Tclass || q->info.typ->type == Tstruct || is_typedef(q->info.typ))) if (is_element(q->info.typ) || is_eq(q->info.typ->id->name, q->sym->name)) continue; /* type is already an element or type name matches member name */ sym = q->sym; s = sym->name; if (*s == '_' && !(sym = lookup(s + 1))) sym = install(s + 1, ID); if (q->info.sto & Sattribute) { e = entry(att, sym); if (e) { if ((!is_primitive(q->info.typ) || e->info.typ->type != q->info.typ->type) && reftype(e->info.typ) != reftype(q->info.typ)) { sprintf(errbuf, "Member '%s::%s' of type '%s' at line %d has a type that does not correspond to the required unique type '%s' defined for root-level attribute '%s'", p->sym->name, q->sym->name, c_type(q->info.typ), q->lineno, c_type(e->info.typ), ns_convert(q->sym->name)); semwarn(errbuf); } } else { fprintf(fd, " \n", ns_tag_remove(q), wsdl_type(q->info.typ, ns1)); e = enter(att, sym); e->info = q->info; } } else { e = entry(elt, sym); if (e) { if ((!is_primitive(q->info.typ) || e->info.typ->type != q->info.typ->type) && reftype(e->info.typ) != reftype(q->info.typ)) { sprintf(errbuf, "Member '%s::%s' of type '%s' at line %d has a type that does not correspond to the required unique type '%s' defined for root-level element '%s'", p->sym->name, q->sym->name, c_type(q->info.typ), q->lineno, c_type(e->info.typ), ns_convert(q->sym->name)); semwarn(errbuf); } } else { fprintf(fd, " \n", ns_tag_remove(q), wsdl_type(q->info.typ, ns1)); e = enter(elt, sym); e->info = q->info; } } } } if (is_element(p->info.typ) && has_ns_eq(ns, p->sym->name)) { m = NULL; for (sp = services; sp && !m; sp = sp->next) for (m = sp->list; m; m = m->next) if ((m->mess&FAULT) && m->part && is_eq(m->part, p->sym->name)) break; if (!m) { sym = p->sym; s = sym->name; if (*s == '_' && !(sym = lookup(s + 1))) sym = install(s + 1, ID); if (!entry(elt, sym)) { fprintf(fd, " \n", ns_tag_remove(p), wsdl_type(p->info.typ, ns1)); e = enter(elt, sym); e->info = p->info; } } } } freetable(elt); freetable(att); } void gen_schema_attributes(FILE *fd, Tnode *p, Tnode *b, const char *ns, const char *ns1) { Entry *q; const char *t = NULL, *s = NULL, *r = NULL; for (q = ((Table*)p->ref)->list; q; q = q->next) { if (b) { Entry *e; for (e = ((Table*)b->ref)->list; e; e = e->next) if (q->info.typ == e->info.typ && q->sym == e->sym) break; if (e) continue; } if (q->info.sto & Sattribute && !(q->info.sto & (Sprivate | Sprotected))) { r = set_default_value(q); t = ns_tag_convert(q); if (*t == '-' || is_anyAttribute(q->info.typ)) { fprintf(fd, " "); if (!uflag) fprintf(fd, "", q->sym->name); fprintf(fd, "\n"); } else if (*t && (s = strchr(t+1, ':')) && (!strchr(q->sym->name+1, ':') || !has_ns_eq(ns, q->sym->name))) { if (q->info.minOccurs) fprintf(fd, " \n", t, r); else if (q->info.maxOccurs == 0) fprintf(fd, " \n", t, r); else fprintf(fd, " \n", t, r); } else { const char *form = ""; if (!s) { s = t; if (*s == ':') { s++; form = " form=\"unqualified\""; } } else { s++; form = " form=\"qualified\""; } if (q->info.minOccurs) fprintf(fd, " info.typ, ns1), form, r); else if (q->info.maxOccurs == 0) fprintf(fd, " info.typ, ns1)); else fprintf(fd, " info.typ, ns1), form, r); if (gen_member_documentation(fd, p->id, q, ns, 1)) fprintf(fd, " \n"); } fflush(fd); } } } void gen_report_hr() { fprintf(freport, "[![][1] To top](#)\n\n\n"); } void gen_report_operation(const char *name, Entry *method, int service) { Service *sp; Method *m; int soap = (soap_version >= 0); int version = soap_version; int get = 0; int put = 0; int del = 0; int post = 0; int mimein = 0; int mimeout = 0; const char *style = NULL, *encoding = NULL; const char *action = NULL, *response_action = NULL, *method_encoding = NULL, *method_response_encoding = NULL; Entry *result, *p; result = (Entry*)method->info.typ->ref; (void)post; (void)method_response_encoding; p = entry(classtable, method->sym); if (!p) execerror("no table entry"); if (name) { if (service) fprintf(freport, "### Service Operation `%s::%s()`\n\n", name, ns_remove(method->sym->name)); else fprintf(freport, "### Proxy Operation `%s::%s()`\n\n", name, ns_remove(method->sym->name)); } else { if (service) fprintf(freport, "### Service Operation `%s()`\n\n", ident(method->sym->name)); else fprintf(freport, "### Operation `%s()`\n\n", ident(method->sym->name)); } for (sp = services; sp; sp = sp->next) { if (has_ns_eq(sp->ns, method->sym->name)) { style = sp->style; encoding = sp->encoding; method_encoding = encoding; method_response_encoding = NULL; if (sp->protocol) { if (strstr(sp->protocol, "GET")) get = 1; else if (strstr(sp->protocol, "PUT")) put = 1; else if (strstr(sp->protocol, "DELETE")) del = 1; else if (strstr(sp->protocol, "POST")) post = 1; if (strncmp(sp->protocol, "SOAP", 4)) soap = 0; else if (strlen(sp->protocol) > 6) version = sp->protocol[6] - '0'; } for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, method->sym->name)) { if (m->mess == ACTION || m->mess == REQUEST_ACTION) action = m->part; else if (m->mess == RESPONSE_ACTION) response_action = m->part; else if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; else if (m->mess == PROTOCOL) { if (strstr(m->part, "GET")) get = 1; else if (strstr(m->part, "PUT")) put = 1; else if (strstr(m->part, "DELETE")) del = 1; else if (strstr(m->part, "POST")) post = 1; if (strncmp(m->part, "SOAP", 4)) soap = 0; else if (strlen(m->part) > 6) version = m->part[6] - '0'; } else { if ((m->mess&MIMEIN) && !strcmp(m->part, "application/x-www-form-urlencoded")) mimein = 1; if ((m->mess&MIMEOUT) && !strcmp(m->part, "application/x-www-form-urlencoded")) mimeout = 1; } } } break; } } gen_report_type_doc(p); fprintf(freport, "This service operation is declared in [%s](%s) at line %d and has the following properties:\n\n", method->filename, method->filename, method->lineno); if (soap) { fprintf(freport, "- SOAP 1.%d protocol\n", version ? version : 1); fprintf(freport, "- SOAP %s style\n", is_document(style) ? "document" : "rpc"); if (sp && sp->URI && method_encoding) { if (is_literal(method_encoding)) fprintf(freport, "- SOAP literal\n"); else if (method_encoding && *method_encoding) fprintf(freport, "- SOAP %s\n", method_encoding); else if (method_encoding) fprintf(freport, "- SOAP encoded\n"); } else if (eflag) fprintf(freport, "- SOAP encoded\n"); else fprintf(freport, "- SOAP literal\n"); if (action && *action == '"') fprintf(freport, "- SOAP action %s\n", action); else if (action) fprintf(freport, "- SOAP action \"%s\"\n", action); else fprintf(freport, "- SOAP action \"\"\n"); if (response_action && *response_action == '"') fprintf(freport, "- SOAP response action %s\n", response_action); else if (response_action) fprintf(freport, "- SOAP response action \"%s\"\n", response_action); } else { fprintf(freport, "- REST operation\n"); } if (post) fprintf(freport, "- POST method\n"); else if (get) fprintf(freport, "- GET method\n"); else if (put) fprintf(freport, "- PUT method\n"); else if (del) fprintf(freport, "- DELETE method\n"); if (!get && !del && mimein) fprintf(freport, "- HTTP application/x-www-form-urlencoded request\n"); if (!put && !del && mimeout) fprintf(freport, "- HTTP application/x-www-form-urlencoded response\n"); if (sp && sp->URL) fprintf(freport, "- Default service endpoint URL \"%s\"\n", sp->URL); if (!soap && action) fprintf(freport, "- Operation endpoint location path \"%s\"\n", action); if (sp && sp->URI) fprintf(freport, "- Operation namespace prefix `%s` and URI \"[%s](#doc-namespaces)\"\n", sp->ns, sp->URI); if (name) { if (service) { if (!is_transient(result->info.typ)) fprintf(freport, "\nThe following service class method must be implemented in the service back-end code and will be called by the service dispatcher `%s::serve(soap)`:\n", name); else fprintf(freport, "\nThe following service class method must be implemented in the service back-end code and will be called by the service dispatcher `%s::serve(soap)`, and should return the value of `int %s::send_empty_%s_response(struct soap *soap, int httpcode)` when using HTTP:\n", name, name, ns_remove(method->sym->name)); } else { fprintf(freport, "\nTo invoke this service operation, use the following methods:\n"); } } else { if (service) { if (!is_transient(result->info.typ)) fprintf(freport, "\nThe following service operation function declared in [%s](%s) should be implemented in the service back-end code and is called by the service dispatcher `%s_serve(soap)` defined in [%s](%s), and should return `SOAP_OK` with the result value `%s` set or return an error code:\n", soapStub, pathsoapStub, nflag?prefix:"soap", soapServer, pathsoapServer, ident(result->sym->name)); else fprintf(freport, "\nThe following service operation function declared in [%s](%s) should be implemented in the service back-end code and is called by the service dispatcher `%s_serve(soap)` defined in [%s](%s), and should return the value of `int soap_send_empty_response(struct soap *soap, int httpcode)` when using HTTP:\n", soapStub, pathsoapStub, nflag?prefix:"soap", soapServer, pathsoapServer); } else { if (!is_transient(result->info.typ)) fprintf(freport, "\nTo invoke this service operation, use the following auto-generated function declared in [%s](%s) and defined in [%s](%s):\n", soapStub, pathsoapStub, soapClient, pathsoapClient); else fprintf(freport, "\nTo invoke this service operation, use the following auto-generated send function declared in [%s](%s) and defined in [%s](%s), where the recv function can be used by an asynchronous receiver:\n", soapStub, pathsoapStub, soapClient, pathsoapClient); } } } void gen_report_type(Tnode *typ, const char *what) { if (!is_transient(typ) && ((typ->type == Tstruct || typ->type == Tclass || typ->type == Tenum || typ->type == Tenumsc || is_typedef(typ)) && !is_stdstr(typ)) && !is_bool(typ)) fprintf(freport, ", where the type of this %s is %s ", what, ident(typ->id->name), ident(typ->id->name)); else if (typ->type == Tpointer && !is_string(typ) && !is_wstring(typ) && !is_soapref(typ)) { Tnode *ref = typ->ref; if ((ref->type == Tstruct || ref->type == Tclass || ref->type == Tenum || ref->type == Tenumsc || is_typedef(ref)) && !is_stdstr(ref) && !is_bool(ref)) fprintf(freport, ", where the type of this %s is a pointer to %s ", what, ident(ref->id->name), ident(ref->id->name)); } else if (is_smart(typ)) { Tnode *ref = typ->ref; if ((ref->type == Tstruct || ref->type == Tclass || ref->type == Tenum || ref->type == Tenumsc || is_typedef(ref)) && !is_stdstr(ref) && !is_bool(ref)) fprintf(freport, ", where the type of this %s is a smart pointer to %s ", what, ident(ref->id->name), ident(ref->id->name)); } else if (is_template(typ)) { Tnode *ref = typ->ref; if (ref->type == Tpointer || is_smart(ref)) { ref = (Tnode*)ref->ref; if ((ref->type == Tstruct || ref->type == Tclass || ref->type == Tenum || ref->type == Tenumsc || is_typedef(ref)) && !is_stdstr(ref) && !is_bool(ref)) fprintf(freport, ", where the type of this %s is a container of pointers to %s ", what, ident(ref->id->name), ident(ref->id->name)); } else if ((ref->type == Tstruct || ref->type == Tclass || ref->type == Tenum || ref->type == Tenumsc || is_typedef(ref)) && !is_stdstr(ref) && !is_bool(ref)) fprintf(freport, ", where the type of this %s is a container of %s ", what, ident(ref->id->name), ident(ref->id->name)); } } void gen_report_type_doc(Entry *type) { Service *sp; Data *d; if (!type->sym) return; for (sp = services; sp; sp = sp->next) { if (has_ns_eq(sp->ns, type->sym->name)) { for (d = sp->data; d; d = d->next) { if (d->name && d->text && !strstr(d->name, "::") && is_eq_nons(d->name, type->sym->name)) { gen_text(freport, d->text); fprintf(freport, "\n\n"); } } } } } void gen_report_members(Entry *type, const char *nsa, const char *nse) { Entry *q; int flag = 0; if (!(Table*)type->info.typ->ref) return; if (is_dynamic_array(type->info.typ) || is_choice(type)) return; fprintf(freport, "where:\n\n"); if (type->info.typ->base) fprintf(freport, "- %s is the base class of this derived class\n", ident(type->info.typ->base->name), ident(type->info.typ->base->name)); for (q = classtable->list; q; q = q->next) if (q->info.typ->base == type->sym) fprintf(freport, "- %s is a derived class of this base class\n", c_type(q->info.typ), c_type(q->info.typ)); q = base_type_of_derived(type->info.typ); if (q) fprintf(freport, "- %s is the base type of this derived type\n", ident(q->sym->name), ident(q->sym->name)); for (q = ((Table*)type->info.typ->ref)->list; q; q = q->next) if (is_pointer_to_derived(q)) fprintf(freport, "- %s is a derived type of this base type\n", c_type(q->info.typ->ref), c_type(q->info.typ->ref)); for (q = ((Table*)type->info.typ->ref)->list; q; q = q->next) { if (q->info.typ->type == Tfun) continue; if ((q->info.sto & Stypedef)) continue; if (flag) { flag = 0; continue; } fprintf(freport, "- `%s`", c_type_id(q->info.typ, q->sym->name)); gen_report_member(type, q); if (is_anyAttribute(q->info.typ)) fprintf(freport, " is an XML DOM attribute list"); else if (q->info.sto & Sattribute) { if (q->info.minOccurs >= 1) fprintf(freport, " is a required attribute *`%s`* of XML schema type *`%s`*", ns_add(q, nsa), wsdl_type(q->info.typ, "")); else fprintf(freport, " is an optional attribute *`%s`* of XML schema type *`%s`*", ns_add(q, nsa), wsdl_type(q->info.typ, "")); if (is_external(q->info.typ)) fprintf(freport, " with a custom serializer `%s`", c_type_sym(q->info.typ)); if (q->info.hasval) { if (q->info.fixed) fprintf(freport, " that must have the fixed value `%s`", c_init_a(q, "")); else fprintf(freport, " that has a default value `%s`", c_init_a(q, "")); } else if (q->info.ptrval) { if (q->info.fixed) fprintf(freport, " that has the fixed value `%s`", c_init_a(q, "")); else fprintf(freport, " that has a default value `%s`", c_init_a(q, "")); } } else if (is_soapref(q->info.typ)) { fprintf(freport, " the context that manages this object"); } else if (q->info.sto & (Sconst | Sprivate | Sprotected)) { fprintf(freport, " is not serialized\n"); continue; } else if (!is_dynamic_array(type->info.typ) && is_repetition(q)) { if (q->info.maxOccurs > 1) fprintf(freport, " is a sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements *`<%s>`* of XML schema type *`%s`*", q->info.minOccurs, q->info.maxOccurs, ns_add(q->next, nse), wsdl_type(q->next->info.typ, "")); else if (q->info.minOccurs >= 1) fprintf(freport, " is a sequence of at least " SOAP_LONG_FORMAT " elements *`<%s>`* of XML schema type *`%s`*", q->info.minOccurs, ns_add(q->next, nse), wsdl_type(q->next->info.typ, "")); else fprintf(freport, " is a sequence of elements *`<%s>`* of XML schema type *`%s`*", ns_add(q->next, nse), wsdl_type(q->next->info.typ, "")); fprintf(freport, " stored in dynamic array `%s` of length `%s`", ident(q->next->sym->name), ident(q->sym->name)); flag = 1; } else if (is_anytype(q)) { fprintf(freport, " is any type of element *`<%s>`* assigned to member `%s` as a `void*` pointer cast, with its `SOAP_TYPE_Name` assigned to member `%s`", ns_add(q->next, nse), ident(q->next->sym->name), ident(q->sym->name)); flag = 1; } else if (is_choice(q)) { Entry *r; fprintf(freport, " is a union `%s` with variant selector `%s` set to one of:", c_type(q->next->info.typ), ident(q->sym->name)); for (r = ((Table*)q->next->info.typ->ref)->list; r; r = r->next) fprintf(freport, " `%s`", soap_union_member(q->next->info.typ, r)); flag = 1; } else if (is_anyType(q->info.typ)) fprintf(freport, " is an XML DOM element node graph"); else if (is_item(q)) fprintf(freport, " is simple content of XML schema type *`%s`* wrapped in *`%s`*", wsdl_type(q->info.typ, ""), wsdl_type(type->info.typ, "")); else if (is_self(q)) fprintf(freport, " is *`%s`* wrapped in *`%s`*, where `__self` matches the element tag of the struct/class member with the `%s` type", wsdl_type(q->info.typ, ""), wsdl_type(type->info.typ, ""), c_type(type->info.typ)); else if (q->info.typ->type != Tfun && q->info.typ->type != Tunion && !(q->info.sto & (Sconst | Sprivate | Sprotected)) && !(q->info.sto & Sattribute) && !is_transient(q->info.typ) && !is_external(q->info.typ) && strncmp(q->sym->name, "__", 2)) { if (q->info.maxOccurs > 1) fprintf(freport, " is a sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements *`<%s>`* of XML schema type *`%s`*", q->info.minOccurs, q->info.maxOccurs, ns_add(q, nse), wsdl_type(q->info.typ, "")); else if (q->info.minOccurs >= 1) { if (q->info.nillable) fprintf(freport, " is a required nillable (xsi:nil when NULL) element *`<%s>`* of XML schema type *`%s`*", ns_add(q, nse), wsdl_type(q->info.typ, "")); else fprintf(freport, " is a required element *`<%s>`* of XML schema type *`%s`*", ns_add(q, nse), wsdl_type(q->info.typ, "")); } else fprintf(freport, " is an optional element *`<%s>`* of XML schema type *`%s`*", ns_add(q, nse), wsdl_type(q->info.typ, "")); } else if (is_external(q->info.typ) && q->info.minOccurs >= 1) { if (q->info.nillable) fprintf(freport, " is a required nillable (xsi:nil when NULL) element *`<%s>`* of XML schema type *`%s`* with a custom serializer `%s`", ns_add(q, nse), wsdl_type(q->info.typ, ""), c_type_sym(q->info.typ)); else fprintf(freport, " is a required element *`<%s>`* of XML schema type *`%s`* with a custom serializer `%s`", ns_add(q, nse), wsdl_type(q->info.typ, ""), c_type_sym(q->info.typ)); } else if (is_external(q->info.typ)) { fprintf(freport, " is an optional element *`<%s>`* of XML schema type *`%s`* with a custom serializer `%s`", ns_add(q, nse), wsdl_type(q->info.typ, ""), c_type_sym(q->info.typ)); } else if (is_pointer_to_derived(q)) { fprintf(freport, " is a transient pointer to a derived type value that replaces the value of this base type when non-NULL"); } else if (is_transient(q->info.typ)) { fprintf(freport, " is transient and not serialized"); } if (q->info.hasval) { if (q->info.fixed) fprintf(freport, " that must have the fixed value `%s`", c_init_a(q, "")); else fprintf(freport, " that has default value `%s`", c_init_a(q, "")); } else if (q->info.ptrval) { if (q->info.fixed) fprintf(freport, " that has the fixed value `%s`", c_init_a(q, "")); else fprintf(freport, " that has default value `%s`", c_init_a(q, "")); } gen_report_type(q->info.typ, "member"); if (is_invisible(q->sym->name)) fprintf(freport, " (the leading underscores of the member name make this member invisible in XML, meaning it has no element tag)"); else if (is_unmatched(q->sym)) fprintf(freport, " (the leading underscore of the member name makes this member a wildcard that matches any XML element tag)"); fprintf(freport, "\n"); } if (has_setter(type->info.typ)) fprintf(freport, "- `int set(struct soap *soap)` is a setter method, which is invoked by the serializer immediately before the instance is serialized\n"); if (has_getter(type->info.typ)) fprintf(freport, "- `int get(struct soap *soap)` is a getter method, which is invoked by the deserializer immediately after the instance is populated by the deserializer\n"); fprintf(freport, "\n"); } void gen_report_member(Entry *type, Entry *member) { Service *sp; const char *t; if (!type->sym || !member->sym->name) return; t = ns_remove(type->sym->name); for (sp = services; sp; sp = sp->next) { Data *d; if (has_ns_eq(sp->ns, type->sym->name)) { for (d = sp->data; d; d = d->next) { const char *s = strstr(d->name, "::"); if (s && !strncmp(t, d->name, s - d->name) && !t[s - d->name] && !strcmp(s + 2, member->sym->name)) { fprintf(freport, " "); gen_text(freport, d->text); } } } } } void gen_method_documentation(FILE *fd, Entry *p, const char *ns) { Service *sp; Data *d; if (!p->sym) return; for (sp = services; sp; sp = sp->next) { if (!tagcmp(sp->ns, ns)) { for (d = sp->data; d; d = d->next) { if (d->name && d->text && !strstr(d->name, "::") && is_eq_nons(d->name, p->sym->name)) { fprintf(fd, " \n "); gen_text(fd, d->text); fprintf(fd, "\n \n"); return; } } } } if (!uflag) fprintf(fd, " Service definition of function %s\n", p->sym->name); } void gen_type_documentation(FILE *fd, Entry *type, const char *ns) { Service *sp; Data *d; if (!type->sym) { fprintf(fd, "\n"); return; } for (sp = services; sp; sp = sp->next) { if (!tagcmp(sp->ns, ns)) { for (d = sp->data; d; d = d->next) { if (d->name && d->text && !strstr(d->name, "::") && is_eq_nons(d->name, type->sym->name)) { fprintf(fd, "\n \n \n "); gen_text(fd, d->text); fprintf(fd, "\n \n \n"); return; } } } } if (!uflag) fprintf(fd, "", type->sym->name); fprintf(fd, "\n"); } int gen_member_documentation(FILE *fd, Symbol *type, Entry *member, const char *ns, int scope) { Service *sp; Data *d; const char *t; if (!type || !member->sym) { fprintf(fd, "/>\n"); return 0; } t = ns_remove(type->name); for (sp = services; sp; sp = sp->next) { if (!tagcmp(sp->ns, ns)) { for (d = sp->data; d; d = d->next) { if (d->name && d->text) { const char *s = strstr(d->name, "::"); if (s && !strncmp(t, d->name, s - d->name) && !t[s - d->name] && !strcmp(s + 2, member->sym->name)) { fprintf(fd, ">\n \n \n "); gen_text(fd, d->text); fprintf(fd, "\n \n \n"); return 1; } } } } } fprintf(fd, "/>"); if (!uflag) { if (scope) fprintf(fd, "", type->name, member->sym->name); else fprintf(fd, "", member->sym->name); } fprintf(fd, "\n"); return 0; } void gen_text(FILE *fd, const char *s) { for (; *s; s++) { if (*s == 10) fprintf(fd, "\n"); else if (*s < 32 || *s >= 127) fprintf(fd, "&#%.2x;", (unsigned char)*s); else if (*s == '<') fprintf(fd, "<"); else if (*s == '>') fprintf(fd, ">"); else if (*s == '&') fprintf(fd, "&"); else if (*s == '\\' && (s[1] == '\n' || s[1] == '\r')) s += (s[1] == '\r'); else if (*s == '\\') fprintf(fd, "\\\\"); else fprintf(fd, "%c", *s); } } void gen_nsmap(FILE *fd) { Symbol *ns1; Service *sp; fprintf(fd, "{\n"); for (ns1 = nslist; ns1; ns1 = ns1->next) { for (sp = services; sp; sp = sp->next) if (!tagcmp(sp->ns, ns1->name) && sp->URI) break; if (sp) { if (!strcmp(ns1->name, "SOAP-ENV")) { if (soap_version < 0) fprintf(fd, " { \"SOAP-ENV\", NULL, NULL, NULL },\n"); else fprintf(fd, " { \"%s\", \"%s\", \"%s\", NULL },\n", ns_convert(ns1->name), sp->URI, sp->URI2 ? sp->URI2 : envURI); } else if (!strcmp(ns1->name, "SOAP-ENC")) { if (soap_version < 0) fprintf(fd, " { \"SOAP-ENC\", NULL, NULL, NULL },\n"); else fprintf(fd, " { \"%s\", \"%s\", \"%s\", NULL },\n", ns_convert(ns1->name), sp->URI, sp->URI2 ? sp->URI2 : encURI); } else if (sp->URI2) fprintf(fd, " { \"%s\", \"%s\", \"%s\", NULL },\n", ns_convert(ns1->name), sp->URI, sp->URI2); else fprintf(fd, " { \"%s\", \"%s\", NULL, NULL },\n", ns_convert(ns1->name), sp->URI); } else if (!strcmp(ns1->name, "SOAP-ENV")) { if (soap_version < 0) fprintf(fd, " { \"SOAP-ENV\", NULL, NULL, NULL },\n"); else if (is_soap12(NULL)) fprintf(fd, " { \"SOAP-ENV\", \"%s\", \"http://schemas.xmlsoap.org/soap/envelope/\", NULL },\n", envURI); else fprintf(fd, " { \"SOAP-ENV\", \"%s\", \"http://www.w3.org/*/soap-envelope\", NULL },\n", envURI); } else if (!strcmp(ns1->name, "SOAP-ENC")) { if (soap_version < 0) fprintf(fd, " { \"SOAP-ENC\", NULL, NULL, NULL },\n"); else if (is_soap12(NULL)) fprintf(fd, " { \"SOAP-ENC\", \"%s\", \"http://schemas.xmlsoap.org/soap/encoding/\", NULL },\n", encURI); else fprintf(fd, " { \"SOAP-ENC\", \"%s\", \"http://www.w3.org/*/soap-encoding\", NULL },\n", encURI); } else if (!strcmp(ns1->name, "xsi")) fprintf(fd, " { \"xsi\", \"%s\", \"http://www.w3.org/*/XMLSchema-instance\", NULL },\n", xsiURI); else if (!strcmp(ns1->name, "xsd")) fprintf(fd, " { \"xsd\", \"%s\", \"http://www.w3.org/*/XMLSchema\", NULL },\n", xsdURI); else fprintf(fd, " { \"%s\", \"%s/%s.xsd\", NULL, NULL },\n", ns_convert(ns1->name), tmpURI, ns_convert(ns1->name)); } fprintf(fd, " { NULL, NULL, NULL, NULL}\n };\n"); } void gen_proxy(FILE *fd, Table *table, Symbol *ns, const char *name, const char *URL) { Entry *p, *q, *r; Table *t, *output; Service *sp; int flag; const char *name1; name1 = ns_cname(name, NULL); for (sp = services; sp; sp = sp->next) if (!tagcmp(sp->ns, ns->name)) break; fprintf(fd, "\n\n#ifndef %s%sProxy_H\n#define %s%sProxy_H\n#include \"%sH.h\"", prefix, name1, prefix, name1, prefix); if (nflag) fprintf(fd, "\nextern SOAP_NMAC struct Namespace %s_namespaces[];", prefix); if (namespaceid) fprintf(fd, "\n\nnamespace %s {", namespaceid); fprintf(fd, "\nclass %s\n{ public:\n\t/// Runtime engine context allocated in constructor\n\tstruct soap *soap;\n\t/// Endpoint URL of service '%s' (change as needed)\n\tconst char *soap_endpoint_url;\n\t/// Constructor allocates soap engine context, sets default endpoint URL, and sets namespace mapping table\n", name1, name); if (nflag) fprintf(fd, "\t%s() { soap = soap_new(); if (soap) soap->namespaces = %s_namespaces; soap_endpoint_url = \"%s\"; }\n", name1, prefix, URL); else { fprintf(fd, "\t%s()\n\t{ soap = soap_new(); soap_endpoint_url = \"%s\"; if (soap && !soap->namespaces) { static const struct Namespace namespaces[] = ", name1, URL); gen_nsmap(fd); fprintf(fd, "\tsoap->namespaces = namespaces; } }\n"); } fprintf(fd, "\t/// Destructor deletes deserialized data and engine context\n\tvirtual ~%s() { if (soap) { soap_destroy(soap); soap_end(soap); soap_free(soap); } }\n", name1); fflush(fd); for (r = table->list; r; r = r->next) { if (r->info.typ->type == Tfun && !(r->info.sto & Sextern) && has_ns_eq(ns->name, r->sym->name)) { p = entry(table, r->sym); if (p) q = (Entry*)p->info.typ->ref; else { fprintf(stderr, "Internal error: no table entry\n"); return; } p = entry(classtable, r->sym); if (!p) { fprintf(stderr, "Internal error: no parameter table entry\n"); return; } output = (Table*)p->info.typ->ref; fprintf(fd, "\t/// Invoke '%s' of service '%s' and return error code (or SOAP_OK)\n", ns_remove(r->sym->name), name); fprintf(fd, "\tvirtual int %s(", ident(r->sym->name)); flag = 0; for (t = output; t; t = t->prev) { p = t->list; if (p) { fprintf(fd, "%s%s", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name)); for (p = p->next; p; p = p->next) fprintf(fd, ", %s%s", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name)); flag = 1; } } if (is_transient(q->info.typ)) fprintf(fd, ") { return soap ? soap_send_%s(soap, soap_endpoint_url, NULL", ident(r->sym->name)); else if (flag) fprintf(fd, ", %s%s) { return soap ? soap_call_%s(soap, soap_endpoint_url, NULL", c_storage(q->info.sto), c_type_id(q->info.typ, q->sym->name), ident(r->sym->name)); else fprintf(fd, "%s%s) { return soap ? soap_call_%s(soap, soap_endpoint_url, NULL", c_storage(q->info.sto), c_type_id(q->info.typ, q->sym->name), ident(r->sym->name)); for (t = output; t; t = t->prev) for (p = t->list; p; p = p->next) fprintf(fd, ", %s", ident(p->sym->name)); if (is_transient(q->info.typ)) fprintf(fd, ") : SOAP_EOM; }\n"); else fprintf(fd, ", %s) : SOAP_EOM; }\n", ident(q->sym->name)); fflush(fd); } } fprintf(fd, "};"); if (namespaceid) fprintf(fd, "\n\n} // namespace %s\n", namespaceid); fprintf(fd, "\n#endif\n"); } void gen_object(FILE *fd, Table *table, const char *name) { const char *name1; Entry *method; name1 = ns_cname(name, NULL); fprintf(fd, "\n\n#ifndef %s%sObject_H\n#define %s%sObject_H\n#include \"%sH.h\"", prefix, name1, prefix, name1, prefix); banner(fd, "Service Object"); if (namespaceid) fprintf(fd, "\n\nnamespace %s {", namespaceid); fprintf(fd, "\nclass %sService : public soap\n{ public:", name1); fprintf(fd, "\n\t%sService()\n\t{ static const struct Namespace namespaces[] = ", name1); gen_nsmap(fd); fprintf(fd, "\n\tsoap_init(this); this->namespaces = namespaces; };"); fprintf(fd, "\n\t/// Destructor deletes deserialized data and engine context"); fprintf(fd, "\n\tvirtual ~%sService() { soap_destroy(this); soap_end(this); };", name1); fprintf(fd, "\n#ifndef WITH_NOIO"); fprintf(fd, "\n\t/// Bind service to port (returns master socket or SOAP_INVALID_SOCKET)"); fprintf(fd, "\n\tvirtual\tSOAP_SOCKET bind(const char *host, int port, int backlog) { return soap_bind(this, host, port, backlog); };"); fprintf(fd, "\n\t/// Accept next request (returns socket or SOAP_INVALID_SOCKET)"); fprintf(fd, "\n\tvirtual\tSOAP_SOCKET accept() { return soap_accept(this); };"); fprintf(fd, "\n#if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); fprintf(fd, "\n\t/// Then accept SSL handshake, when SSL is used"); fprintf(fd, "\n\tvirtual\tint ssl_accept() { return soap_ssl_accept(this); };"); fprintf(fd, "\n#endif"); fprintf(fd, "\n#endif"); fprintf(fd, "\n\t/// Serve the pending request (returns SOAP_OK or error code)"); if (nflag) fprintf(fd, "\n\tvirtual\tint serve() { return %s_serve(this); };", prefix); else fprintf(fd, "\n\tvirtual\tint serve() { return soap_serve(this); };"); fprintf(fd, "\n};"); banner(fd, "Service Operations (you should define these globally)"); for (method = table->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) { Entry *p, *q = entry(table, method->sym); Table *output; if (q) p = (Entry*)q->info.typ->ref; else { fprintf(stderr, "Internal error: no table entry\n"); return; } q = entry(classtable, method->sym); output = (Table*)q->info.typ->ref; fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 %s(struct soap*", ident(method->sym->name)); gen_params(fd, output, p, 1); fprintf(fd, ";"); } } if (namespaceid) fprintf(fd, "\n\n} // namespace %s\n", namespaceid); fprintf(fd, "\n\n#endif\n"); } void gen_proxy_header(FILE *fd, Table *table, Symbol *ns, const char *name) { static int first_class = 1; Entry *p, *method; Table *t; if (fd != freport) fprintf(fd, "\n\n#ifndef %s%s_H\n#define %s%s_H\n#include \"%sH.h\"", prefix, name, prefix, name, prefix); else { Service *sp; if (first_class) fprintf(fd, "## Web Client Proxy Class %s {#doc-client}\n\n", name); else fprintf(fd, "## Web Client Proxy Class %s {#%s}\n\n", name, name); first_class = 0; for (sp = services; sp; sp = sp->next) { if (sp->documentation) { gen_text(freport, sp->documentation); fprintf(freport, "\n\n"); } } fprintf(fd, "This client proxy class is declared in [%s](%s) and defined in [%s](%s):", soapProxyH, pathsoapProxyH, soapProxyC, pathsoapProxyC); } if (namespaceid) fprintf(fd, "\n\n namespace %s {", namespaceid); if (iflag) fprintf(fd, "\n\n class SOAP_CMAC %s : public soap {\n public:", name); else { fprintf(fd, "\n\n class SOAP_CMAC %s {\n public:", name); fprintf(fd, "\n /// Context to manage proxy IO and data\n struct soap *soap;\n /// flag indicating that this context is owned by this proxy and should be deleted by the destructor\n bool soap_own;"); } fprintf(fd, "\n /// Endpoint URL of service '%s' (change as needed)", name); fprintf(fd, "\n const char *soap_endpoint;"); fprintf(fd, "\n /// Variables globally declared in %s, if any", filename); for (p = table->list; p; p = p->next) if (p->info.typ->type != Tfun && !(p->info.sto & Sstatic)) fprintf(fd, "\n %s%s;", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name)); fprintf(fd, "\n /// Construct a proxy with new managing context"); fprintf(fd, "\n %s();", name); fprintf(fd, "\n /// Copy constructor"); fprintf(fd, "\n %s(const %s& rhs);", name, name); if (iflag) { fprintf(fd, "\n /// Construct proxy given a managing context"); fprintf(fd, "\n %s(const struct soap&);", name); fprintf(fd, "\n /// Construct proxy given a managing context and endpoint URL"); fprintf(fd, "\n %s(const struct soap&, const char *soap_endpoint_url);", name); } else { fprintf(fd, "\n /// Construct proxy given a shared managing context"); fprintf(fd, "\n %s(struct soap*);", name); fprintf(fd, "\n /// Construct proxy given a shared managing context and endpoint URL"); fprintf(fd, "\n %s(struct soap*, const char *soap_endpoint_url);", name); } fprintf(fd, "\n /// Constructor taking an endpoint URL"); fprintf(fd, "\n %s(const char *soap_endpoint_url);", name); fprintf(fd, "\n /// Constructor taking input and output mode flags for the new managing context"); fprintf(fd, "\n %s(soap_mode iomode);", name); fprintf(fd, "\n /// Constructor taking endpoint URL and input and output mode flags for the new managing context"); fprintf(fd, "\n %s(const char *soap_endpoint_url, soap_mode iomode);", name); fprintf(fd, "\n /// Constructor taking input and output mode flags for the new managing context"); fprintf(fd, "\n %s(soap_mode imode, soap_mode omode);", name); if (iflag) fprintf(fd, "\n /// Destructor deletes deserialized data and its managing context"); else fprintf(fd, "\n /// Destructor deletes deserialized data and its managing context, when the context was allocated by the constructor"); fprintf(fd, "\n virtual ~%s();", name); fprintf(fd, "\n /// Initializer used by constructors"); fprintf(fd, "\n virtual void %s_init(soap_mode imode, soap_mode omode);", name); fprintf(fd, "\n /// Return a copy that has a new managing context with the same engine state"); fprintf(fd, "\n virtual %s *copy();", name); fprintf(fd, "\n /// Copy assignment"); fprintf(fd, "\n %s& operator=(const %s&);", name, name); fprintf(fd, "\n /// Delete all deserialized data (uses soap_destroy() and soap_end())"); fprintf(fd, "\n virtual void destroy();"); fprintf(fd, "\n /// Delete all deserialized data and reset to default"); fprintf(fd, "\n virtual void reset();"); fprintf(fd, "\n /// Disables and removes SOAP Header from message by setting soap->header = NULL"); fprintf(fd, "\n virtual void soap_noheader();"); if (!namespaceid) { p = entry(classtable, lookup("SOAP_ENV__Header")); if (p) { t = (Table*)p->info.typ->ref; if (t && t->list && !is_void(t->list->info.typ)) { fprintf(fd, "\n /// Add SOAP Header to message"); fprintf(fd, "\n virtual void soap_header("); gen_params_ref(fd, t, NULL, 0); fprintf(fd, ";"); } } } else fprintf(fd, "\n // virtual void soap_header(...) method removed due to option -q or -Q"); fprintf(fd, "\n /// Get SOAP Header structure (i.e. soap->header, which is NULL when absent)"); fprintf(fd, "\n virtual ::SOAP_ENV__Header *soap_header();"); fprintf(fd, "\n /// Get SOAP Fault structure (i.e. soap->fault, which is NULL when absent)"); fprintf(fd, "\n virtual ::SOAP_ENV__Fault *soap_fault();"); fprintf(fd, "\n /// Get SOAP Fault subcode QName string (NULL when absent)"); fprintf(fd, "\n virtual const char *soap_fault_subcode();"); fprintf(fd, "\n /// Get SOAP Fault string/reason (NULL when absent)"); fprintf(fd, "\n virtual const char *soap_fault_string();"); fprintf(fd, "\n /// Get SOAP Fault detail XML string (NULL when absent)"); fprintf(fd, "\n virtual const char *soap_fault_detail();"); fprintf(fd, "\n /// Close connection (normally automatic, except for send_X ops)"); fprintf(fd, "\n virtual int soap_close_socket();"); fprintf(fd, "\n /// Force close connection (can kill a thread blocked on IO)"); fprintf(fd, "\n virtual int soap_force_close_socket();"); fprintf(fd, "\n /// Print fault"); fprintf(fd, "\n virtual void soap_print_fault(FILE*);"); fprintf(fd, "\n #ifndef WITH_LEAN"); fprintf(fd, "\n #ifndef WITH_COMPAT"); fprintf(fd, "\n /// Print fault to stream"); fprintf(fd, "\n virtual void soap_stream_fault(std::ostream&);"); fprintf(fd, "\n #endif"); fprintf(fd, "\n /// Write fault to buffer"); fprintf(fd, "\n virtual char *soap_sprint_fault(char *buf, size_t len);"); fprintf(fd, "\n #endif"); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) gen_method(fd, method, 0); fprintf(fd, "\n };"); if (namespaceid) fprintf(fd, "\n\n } // namespace %s\n", namespaceid); if (fd != freport) fprintf(fd, "\n#endif\n"); else { fprintf(freport, "\n\n"); for (method = table->list; method; method = method->next) { Entry *result, *p; result = (Entry*)method->info.typ->ref; p = entry(classtable, method->sym); if (!p) execerror("no table entry"); if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) { gen_report_operation(name, method, 0); gen_method(freport, method, 0); fprintf(freport, "\n\nwhere:\n\n- `const char *soap_endpoint_url` is the endpoint URL or NULL to use the default endpoint\n- `const char *soap_action` is the SOAP action header or NULL to use the default action\n"); gen_report_params(p, result, 0); if (!is_transient(result->info.typ)) fprintf(freport, "The `%s` method sends the request message and receives the response message, assigning the last parameter `%s` the response value received. The `send_%s` method sends the request message and the `recv_%s` method receives the response message asynchronously. These methods return `SOAP_OK` or an error code.\n\n", ns_remove(method->sym->name), ident(result->sym->name), ns_remove(method->sym->name), ns_remove(method->sym->name)); else fprintf(freport, "The `send_%s` method sends the one-way request message and the `recv_%s` method receives the one-way request message. The `int soap_recv_empty_response(struct soap *soap)` function should be called after `send_%s` when communicating over HTTP to receive the HTTP acknowledgment.\n\n", ns_remove(method->sym->name), ns_remove(method->sym->name), ns_remove(method->sym->name)); gen_report_hr(); } } } } void gen_proxy_code(FILE *fd, Table *table, Symbol *ns, const char *name) { Entry *p, *method, *param; Table *t; const char *soap; if (iflag) soap = "this"; else soap = "this->soap"; fprintf(fd, "\n\n#include \"%s%s.h\"", prefix, name); if (namespaceid) fprintf(fd, "\n\nnamespace %s {", namespaceid); if (iflag) { fprintf(fd, "\n\n%s::%s() : soap(SOAP_IO_DEFAULT)\n{\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const %s& rhs)\n{\tsoap_copy_context(this, &rhs);\n\tthis->soap_endpoint = rhs.soap_endpoint;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const struct soap &_soap) : soap(_soap)\n{ }", name, name); fprintf(fd, "\n\n%s::%s(const struct soap &_soap, const char *soap_endpoint_url) : soap(_soap)\n{\n\tsoap_endpoint = soap_endpoint_url;\n}", name, name); fprintf(fd, "\n\n%s::%s(const char *soap_endpoint_url) : soap(SOAP_IO_DEFAULT)\n{\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n\tsoap_endpoint = soap_endpoint_url;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode iomode) : soap(iomode)\n{\t%s_init(iomode, iomode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const char *soap_endpoint_url, soap_mode iomode) : soap(iomode)\n{\t%s_init(iomode, iomode);\n\tsoap_endpoint = soap_endpoint_url;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode imode, soap_mode omode) : soap(imode, omode)\n{\t%s_init(imode, omode);\n}", name, name, name); fprintf(fd, "\n\n%s::~%s()\n{\n\tthis->destroy();\n}", name, name); } else { fprintf(fd, "\n\n%s::%s()\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const %s& rhs)\n{\tthis->soap = rhs.soap;\n\tthis->soap_own = false;\n\tthis->soap_endpoint = rhs.soap_endpoint;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(struct soap *_soap)\n{\tthis->soap = _soap;\n\tthis->soap_own = false;\n\t%s_init(_soap->imode, _soap->omode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(struct soap *_soap, const char *soap_endpoint_url)\n{\tthis->soap = _soap;\n\tthis->soap_own = false;\n\t%s_init(_soap->imode, _soap->omode);\n\tsoap_endpoint = soap_endpoint_url;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const char *soap_endpoint_url)\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n\tsoap_endpoint = soap_endpoint_url;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode iomode)\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(iomode, iomode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const char *soap_endpoint_url, soap_mode iomode)\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(iomode, iomode);\n\tsoap_endpoint = soap_endpoint_url;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode imode, soap_mode omode)\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(imode, omode);\n}", name, name, name); fprintf(fd, "\n\n%s::~%s()\n{\tif (this->soap_own)\n\t{\tthis->destroy();\n\t\tsoap_free(this->soap);\n\t}\n}", name, name); } fprintf(fd, "\n\nvoid %s::%s_init(soap_mode imode, soap_mode omode)\n{\tsoap_imode(%s, imode);\n\tsoap_omode(%s, omode);\n\tsoap_endpoint = NULL;\n\tstatic const struct Namespace namespaces[] = ", name, name, soap, soap); gen_nsmap(fd); fprintf(fd, "\tsoap_set_namespaces(%s, namespaces);\n}", soap); if (iflag) { fprintf(fd, "\n\n%s *%s::copy()\n{\t%s *dup = SOAP_NEW_UNMANAGED(%s(*(struct soap*)%s));\n\treturn dup;\n}", name, name, name, name, soap); fprintf(fd, "\n\n%s& %s::operator=(const %s& rhs)\n{\tsoap_done(this);\n\tsoap_copy_context(this, &rhs);\n\tthis->soap_endpoint = rhs.soap_endpoint;\n\treturn *this;\n}", name, name, name); } else { fprintf(fd, "\n\n%s *%s::copy()\n{\t%s *dup = SOAP_NEW_UNMANAGED(%s);\n\tif (dup)\n\t{\tsoap_done(dup->soap);\n\t\tsoap_copy_context(dup->soap, this->soap);\n\t}\n\treturn dup;\n}", name, name, name, name); fprintf(fd, "\n\n%s& %s::operator=(const %s& rhs)\n{\tif (this->soap != rhs.soap)\n\t{\tif (this->soap_own)\n\t\t\tsoap_free(this->soap);\n\t\tthis->soap = rhs.soap;\n\t\tthis->soap_own = false;\n\t\tthis->soap_endpoint = rhs.soap_endpoint;\n\t}\n\treturn *this;\n}", name, name, name); } fprintf(fd, "\n\nvoid %s::destroy()\n{\tsoap_destroy(%s);\n\tsoap_end(%s);\n}", name, soap, soap); fprintf(fd, "\n\nvoid %s::reset()\n{\tthis->destroy();\n\tsoap_done(%s);\n\tsoap_initialize(%s);\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, soap, soap, name); fprintf(fd, "\n\nvoid %s::soap_noheader()\n{\t%s->header = NULL;\n}", name, soap); if (!namespaceid) { p = entry(classtable, lookup("SOAP_ENV__Header")); if (p) { t = (Table*)p->info.typ->ref; if (t && t->list && !is_void(t->list->info.typ)) { fprintf(fd, "\n\nvoid %s::soap_header(", name); gen_params_ref(fd, t, NULL, 0); fprintf(fd, "\n{\n\t::soap_header(%s);", soap); for (param = t->list; param; param = param->next) { if (namespaceid) fprintf(fd, "\n\t((%s::SOAP_ENV__Header*)%s->header)->%s = %s;", namespaceid, soap, ident(param->sym->name), ident(param->sym->name)); else fprintf(fd, "\n\t%s->header->%s = %s;", soap, ident(param->sym->name), ident(param->sym->name)); } fprintf(fd, "\n}"); } } } fprintf(fd, "\n\n::SOAP_ENV__Header *%s::soap_header()\n{\treturn %s->header;\n}", name, soap); fprintf(fd, "\n\n::SOAP_ENV__Fault *%s::soap_fault()\n{\treturn %s->fault;\n}", name, soap); fprintf(fd, "\n\nconst char *%s::soap_fault_subcode()\n{\treturn ::soap_fault_subcode(%s);\n}", name, soap); fprintf(fd, "\n\nconst char *%s::soap_fault_string()\n{\treturn ::soap_fault_string(%s);\n}", name, soap); fprintf(fd, "\n\nconst char *%s::soap_fault_detail()\n{\treturn ::soap_fault_detail(%s);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_close_socket()\n{\treturn ::soap_closesock(%s);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_force_close_socket()\n{\treturn ::soap_force_closesock(%s);\n}", name, soap); fprintf(fd, "\n\nvoid %s::soap_print_fault(FILE *fd)\n{\t::soap_print_fault(%s, fd);\n}", name, soap); fprintf(fd, "\n\n#ifndef WITH_LEAN\n#ifndef WITH_COMPAT\nvoid %s::soap_stream_fault(std::ostream& os)\n{\t::soap_stream_fault(%s, os);\n}\n#endif", name, soap); fprintf(fd, "\n\nchar *%s::soap_sprint_fault(char *buf, size_t len)\n{\treturn ::soap_sprint_fault(%s, buf, len);\n}\n#endif", name, soap); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ) && has_ns_eq(ns->name, method->sym->name)) gen_call_method(fd, method, name); if (namespaceid) fprintf(fd, "\n\n} // namespace %s\n", namespaceid); fprintf(fd, "\n/* End of client proxy code */\n"); } void gen_object_header(FILE *fd, Table *table, Symbol *ns, const char *name) { static int first_class = 1; Entry *p, *method; Table *t; if (fd != freport) fprintf(fd, "\n\n#ifndef %s%s_H\n#define %s%s_H\n#include \"%sH.h\"", prefix, name, prefix, name, prefix); else { Service *sp; if (first_class) fprintf(fd, "## Web Service Class %s {#doc-server}\n\n", name); else fprintf(fd, "## Web Service Class %s {#%s}\n\n", name, name); first_class = 0; for (sp = services; sp; sp = sp->next) { if (sp->documentation) { gen_text(freport, sp->documentation); fprintf(freport, "\n\n"); } } fprintf(fd, "This service class is declared in [%s](%s) and defined in [%s](%s):", soapServiceH, pathsoapServiceH, soapServiceC, pathsoapServiceC); } if (namespaceid) fprintf(fd, "\n\n namespace %s {", namespaceid); if (iflag) fprintf(fd, "\n\n class SOAP_CMAC %s : public soap {\n public:", name); else { fprintf(fd, "\n\n class SOAP_CMAC %s {\n public:", name); fprintf(fd, "\n /// Context to manage service IO and data\n struct soap *soap;\n /// flag indicating that this context is owned by this service and should be deleted by the destructor\n bool soap_own;"); } fprintf(fd, "\n /// Variables globally declared in %s, if any", filename); for (p = table->list; p; p = p->next) if (p->info.typ->type != Tfun && !(p->info.sto & Sstatic)) fprintf(fd, "\n %s%s;", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name)); fprintf(fd, "\n /// Construct a service with new managing context"); fprintf(fd, "\n %s();", name); fprintf(fd, "\n /// Copy constructor"); fprintf(fd, "\n %s(const %s&);", name, name); if (iflag) { fprintf(fd, "\n /// Construct service given a managing context"); fprintf(fd, "\n %s(const struct soap&);", name); fprintf(fd, "\n /// Construct service given a managing context and endpoint"); fprintf(fd, "\n %s(const struct soap&, const char *soap_endpoint_url);", name); } else { fprintf(fd, "\n /// Construct service given a shared managing context"); fprintf(fd, "\n %s(struct soap*);", name); } fprintf(fd, "\n /// Constructor taking input+output mode flags for the new managing context"); fprintf(fd, "\n %s(soap_mode iomode);", name); fprintf(fd, "\n /// Constructor taking input and output mode flags for the new managing context"); fprintf(fd, "\n %s(soap_mode imode, soap_mode omode);", name); if (iflag) fprintf(fd, "\n /// Destructor deletes deserialized data and its managing context"); else fprintf(fd, "\n /// Destructor deletes deserialized data and its managing context, when the context was allocated by the constructor"); fprintf(fd, "\n virtual ~%s();", name); fprintf(fd, "\n /// Delete all deserialized data (with soap_destroy() and soap_end())"); fprintf(fd, "\n virtual void destroy();"); fprintf(fd, "\n /// Delete all deserialized data and reset to defaults"); fprintf(fd, "\n virtual void reset();"); fprintf(fd, "\n /// Initializer used by constructors"); fprintf(fd, "\n virtual void %s_init(soap_mode imode, soap_mode omode);", name); fprintf(fd, "\n /// Return a copy that has a new managing context with the same engine state"); fprintf(fd, "\n virtual %s *copy() SOAP_PURE_VIRTUAL_COPY;", name); fprintf(fd, "\n /// Copy assignment"); fprintf(fd, "\n %s& operator=(const %s&);", name, name); fprintf(fd, "\n /// Close connection (normally automatic)"); fprintf(fd, "\n virtual int soap_close_socket();"); fprintf(fd, "\n /// Force close connection (can kill a thread blocked on IO)"); fprintf(fd, "\n virtual int soap_force_close_socket();"); fprintf(fd, "\n /// Return sender-related fault to sender"); fprintf(fd, "\n virtual int soap_senderfault(const char *string, const char *detailXML);"); fprintf(fd, "\n /// Return sender-related fault with SOAP 1.2 subcode to sender"); fprintf(fd, "\n virtual int soap_senderfault(const char *subcodeQName, const char *string, const char *detailXML);"); fprintf(fd, "\n /// Return receiver-related fault to sender"); fprintf(fd, "\n virtual int soap_receiverfault(const char *string, const char *detailXML);"); fprintf(fd, "\n /// Return receiver-related fault with SOAP 1.2 subcode to sender"); fprintf(fd, "\n virtual int soap_receiverfault(const char *subcodeQName, const char *string, const char *detailXML);"); fprintf(fd, "\n /// Print fault"); fprintf(fd, "\n virtual void soap_print_fault(FILE*);"); fprintf(fd, "\n #ifndef WITH_LEAN"); fprintf(fd, "\n #ifndef WITH_COMPAT"); fprintf(fd, "\n /// Print fault to stream"); fprintf(fd, "\n virtual void soap_stream_fault(std::ostream&);"); fprintf(fd, "\n #endif"); fprintf(fd, "\n /// Write fault to buffer"); fprintf(fd, "\n virtual char *soap_sprint_fault(char *buf, size_t len);"); fprintf(fd, "\n #endif"); fprintf(fd, "\n /// Disables and removes SOAP Header from message by setting soap->header = NULL"); fprintf(fd, "\n virtual void soap_noheader();"); if (!namespaceid) { p = entry(classtable, lookup("SOAP_ENV__Header")); if (p) { t = (Table*)p->info.typ->ref; if (t && t->list && !is_void(t->list->info.typ)) { fprintf(fd, "\n /// Add SOAP Header to message"); fprintf(fd, "\n virtual void soap_header("); gen_params_ref(fd, t, NULL, 0); fprintf(fd, ";"); } } } else fprintf(fd, "\n // virtual void soap_header(...) method removed due to option -q or -Q"); fprintf(fd, "\n /// Get SOAP Header structure (i.e. soap->header, which is NULL when absent)"); fprintf(fd, "\n virtual ::SOAP_ENV__Header *soap_header();"); fprintf(fd, "\n #ifndef WITH_NOIO"); fprintf(fd, "\n /// Run simple single-thread (iterative, non-SSL) service on port until a connection error occurs (returns SOAP_OK or error code), use this->bind_flag = SO_REUSEADDR to rebind for immediate rerun"); fprintf(fd, "\n virtual int run(int port, int backlog = 1);"); fprintf(fd, "\n #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); fprintf(fd, "\n /// Run simple single-thread SSL service on port until a connection error occurs (returns SOAP_OK or error code), use this->bind_flag = SO_REUSEADDR to rebind for immediate rerun"); fprintf(fd, "\n virtual int ssl_run(int port, int backlog = 1);"); fprintf(fd, "\n #endif"); fprintf(fd, "\n /// Bind service to port (returns master socket or SOAP_INVALID_SOCKET upon error)"); fprintf(fd, "\n virtual SOAP_SOCKET bind(const char *host, int port, int backlog);"); fprintf(fd, "\n /// Accept next request (returns socket or SOAP_INVALID_SOCKET upon error)"); fprintf(fd, "\n virtual SOAP_SOCKET accept();"); fprintf(fd, "\n #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); fprintf(fd, "\n /// When SSL is used, after accept() should perform and accept SSL handshake"); fprintf(fd, "\n virtual int ssl_accept();"); fprintf(fd, "\n #endif"); fprintf(fd, "\n #endif"); fprintf(fd, "\n /// After accept() serve the pending request (returns SOAP_OK or error code)"); fprintf(fd, "\n virtual int serve();"); fprintf(fd, "\n /// Used by serve() to dispatch a pending request (returns SOAP_OK or error code)"); fprintf(fd, "\n virtual int dispatch();"); if (jflag) fprintf(fd, "\n virtual int dispatch(struct soap *soap);"); fprintf(fd, "\n //\n // Service operations are listed below: you should define these\n // Note: compile with -DWITH_PURE_VIRTUAL to declare pure virtual methods"); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) gen_method(fd, method, 1); fprintf(fd, "\n };"); if (namespaceid) fprintf(fd, "\n\n } // namespace %s\n", namespaceid); if (fd != freport) fprintf(fd, "\n#endif\n"); else { fprintf(freport, "\n\nUse the service request dispatcher to accept and process service requests:\n\n"); fprintf(freport, "- `int serve()` serves requests by calling one of the service methods that matches the request. Returns `SOAP_OK` or an error code. This function supports CGI by accepting a request on stdin and sending the response to stdout, and FastCGI. To serve over HTTP(S), use the following functions to establish a connection:\n\n"); fprintf(freport, "- `SOAP_SOCKET bind(const char *host, int port, int backlog)` returns master socket bound to port (and restricted to host name, if not NULL) or `SOAP_INVALID_SOCKET` upon error\n"); fprintf(freport, "- `SOAP_SOCKET accept()` accepts connection and returns socket when accepted, or `SOAP_INVALID_SOCKET` upon error\n"); fprintf(freport, "- `int soap_ssl_accept()` performs SSL handshake and returns `SOAP_OK` when successful or an error code, invoke this method after `accept()` to accept SSL/TLS connection\n\n"); for (method = table->list; method; method = method->next) { Entry *result, *p; result = (Entry*)method->info.typ->ref; p = entry(classtable, method->sym); if (!p) execerror("no table entry"); if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) { gen_report_operation(name, method, 1); gen_method(freport, method, 1); fprintf(freport, "\n\nwhere:\n\n"); gen_report_params(p, result, 1); if (!is_transient(result->info.typ)) fprintf(freport, "This service method should be implemented as part of the service back-end code and return `SOAP_OK` and set the last parameter `%s` to the result, or return an error code\n\n", ident(result->sym->name)); else fprintf(freport, "This service method should be implemented as part of the service back-end code and call `int %s::send_%s_empty_response(int httpcode)` with a HTTP status or error code (200 to 599) to return, when communicating over HTTP to return a HTTP header.\n\n", name, ns_remove(method->sym->name)); gen_report_hr(); } } } } void gen_object_code(FILE *fd, Table *table, Symbol *ns, const char *name) { Entry *p, *method, *catch_method, *param; Table *t; const char *soap; if (iflag) soap = "this"; else soap = "this->soap"; fprintf(fd, "\n\n#include \"%s%s.h\"", prefix, name); if (namespaceid) fprintf(fd, "\n\nnamespace %s {", namespaceid); if (iflag) { fprintf(fd, "\n\n%s::%s() : soap(SOAP_IO_DEFAULT)\n{\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const %s& rhs)\n{\tsoap_copy_context(this, &rhs);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const struct soap &_soap) : soap(_soap)\n{ }", name, name); fprintf(fd, "\n\n%s::%s(soap_mode iomode) : soap(iomode)\n{\t%s_init(iomode, iomode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode imode, soap_mode omode) : soap(imode, omode)\n{\t%s_init(imode, omode);\n}", name, name, name); fprintf(fd, "\n\n%s::~%s()\n{\n\tthis->destroy();\n}", name, name); } else { fprintf(fd, "\n\n%s::%s()\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const %s& rhs)\n{\tthis->soap = rhs.soap;\n\tthis->soap_own = false;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(struct soap *_soap)\n{\tthis->soap = _soap;\n\tthis->soap_own = false;\n\t%s_init(_soap->imode, _soap->omode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode iomode)\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(iomode, iomode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode imode, soap_mode omode)\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(imode, omode);\n}", name, name, name); fprintf(fd, "\n\n%s::~%s()\n{\tif (this->soap_own)\n\t{\tthis->destroy();\n\t\tsoap_free(this->soap);\n\t}\n}", name, name); } fprintf(fd, "\n\nvoid %s::%s_init(soap_mode imode, soap_mode omode)\n{\tsoap_imode(%s, imode);\n\tsoap_omode(%s, omode);\n\tstatic const struct Namespace namespaces[] = ", name, name, soap, soap); gen_nsmap(fd); fprintf(fd, "\tsoap_set_namespaces(%s, namespaces);\n}", soap); fprintf(fd, "\n\nvoid %s::destroy()\n{\tsoap_destroy(%s);\n\tsoap_end(%s);\n}", name, soap, soap); fprintf(fd, "\n\nvoid %s::reset()\n{\tthis->destroy();\n\tsoap_done(%s);\n\tsoap_initialize(%s);\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, soap, soap, name); if (iflag) { fprintf(fd, "\n\n#ifndef WITH_PURE_VIRTUAL\n%s *%s::copy()\n{\t%s *dup = SOAP_NEW_UNMANAGED(%s(*(struct soap*)%s));\n\treturn dup;\n}\n#endif", name, name, name, name, soap); fprintf(fd, "\n\n%s& %s::operator=(const %s& rhs)\n{\tsoap_done(this);\n\tsoap_copy_context(this, &rhs);\n\treturn *this;\n}", name, name, name); } else { fprintf(fd, "\n\n#ifndef WITH_PURE_VIRTUAL\n%s *%s::copy()\n{\t%s *dup = SOAP_NEW_UNMANAGED(%s);\n\tif (dup)\n\t{\tsoap_done(dup->soap);\n\t\tsoap_copy_context(dup->soap, this->soap);\n\t}\n\treturn dup;\n}\n#endif", name, name, name, name); fprintf(fd, "\n\n%s& %s::operator=(const %s& rhs)\n{\tif (this->soap != rhs.soap)\n\t{\tif (this->soap_own)\n\t\t\tsoap_free(this->soap);\n\t\tthis->soap = rhs.soap;\n\t\tthis->soap_own = false;\n\t}\n\treturn *this;\n}", name, name, name); } fprintf(fd, "\n\nint %s::soap_close_socket()\n{\treturn soap_closesock(%s);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_force_close_socket()\n{\treturn soap_force_closesock(%s);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_senderfault(const char *string, const char *detailXML)\n{\treturn ::soap_sender_fault(%s, string, detailXML);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_senderfault(const char *subcodeQName, const char *string, const char *detailXML)\n{\treturn ::soap_sender_fault_subcode(%s, subcodeQName, string, detailXML);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_receiverfault(const char *string, const char *detailXML)\n{\treturn ::soap_receiver_fault(%s, string, detailXML);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_receiverfault(const char *subcodeQName, const char *string, const char *detailXML)\n{\treturn ::soap_receiver_fault_subcode(%s, subcodeQName, string, detailXML);\n}", name, soap); fprintf(fd, "\n\nvoid %s::soap_print_fault(FILE *fd)\n{\t::soap_print_fault(%s, fd);\n}", name, soap); fprintf(fd, "\n\n#ifndef WITH_LEAN\n#ifndef WITH_COMPAT\nvoid %s::soap_stream_fault(std::ostream& os)\n{\t::soap_stream_fault(%s, os);\n}\n#endif", name, soap); fprintf(fd, "\n\nchar *%s::soap_sprint_fault(char *buf, size_t len)\n{\treturn ::soap_sprint_fault(%s, buf, len);\n}\n#endif", name, soap); fprintf(fd, "\n\nvoid %s::soap_noheader()\n{\t%s->header = NULL;\n}", name, soap); if (!namespaceid) { p = entry(classtable, lookup("SOAP_ENV__Header")); if (p) { t = (Table*)p->info.typ->ref; if (t && t->list && !is_void(t->list->info.typ)) { fprintf(fd, "\n\nvoid %s::soap_header(", name); gen_params_ref(fd, t, NULL, 0); fprintf(fd, "\n{\n\t::soap_header(%s);", soap); for (param = t->list; param; param = param->next) { if (namespaceid) fprintf(fd, "\n\t((%s::SOAP_ENV__Header*)%s->header)->%s = %s;", namespaceid, soap, ident(param->sym->name), ident(param->sym->name)); else fprintf(fd, "\n\t%s->header->%s = %s;", soap, ident(param->sym->name), ident(param->sym->name)); } fprintf(fd, "\n}"); } } } fprintf(fd, "\n\n::SOAP_ENV__Header *%s::soap_header()\n{\treturn %s->header;\n}", name, soap); fprintf(fd, "\n\n#ifndef WITH_NOIO"); fprintf(fd, "\nint %s::run(int port, int backlog)\n{\tif (!soap_valid_socket(%s->master) && !soap_valid_socket(this->bind(NULL, port, backlog)))\n\t\treturn %s->error;\n\tfor (;;)\n\t{\tif (!soap_valid_socket(this->accept()))\n\t\t{\tif (%s->errnum == 0) // timeout?\n\t\t\t\t%s->error = SOAP_OK;\n\t\t\tbreak;\n\t\t}\n\t\tif (this->serve())\n\t\t\tbreak;\n\t\tthis->destroy();\n\t}\n\treturn %s->error;\n}", name, soap, soap, soap, soap, soap); fprintf(fd, "\n\n#if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); fprintf(fd, "\nint %s::ssl_run(int port, int backlog)\n{\tif (!soap_valid_socket(%s->master) && !soap_valid_socket(this->bind(NULL, port, backlog)))\n\t\treturn %s->error;\n\tfor (;;)\n\t{\tif (!soap_valid_socket(this->accept()))\n\t\t{\tif (%s->errnum == 0) // timeout?\n\t\t\t\t%s->error = SOAP_OK;\n\t\t\tbreak;\n\t\t}\n\t\tif (this->ssl_accept() || this->serve())\n\t\t\tbreak;\n\t\tthis->destroy();\n\t}\n\treturn %s->error;\n}", name, soap, soap, soap, soap, soap); fprintf(fd, "\n#endif"); fprintf(fd, "\n\nSOAP_SOCKET %s::bind(const char *host, int port, int backlog)\n{\treturn soap_bind(%s, host, port, backlog);\n}", name, soap); fprintf(fd, "\n\nSOAP_SOCKET %s::accept()\n{\treturn soap_accept(%s);\n}", name, soap); fprintf(fd, "\n\n#if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); fprintf(fd, "\nint %s::ssl_accept()\n{\treturn soap_ssl_accept(%s);\n}", name, soap); fprintf(fd, "\n#endif"); fprintf(fd, "\n#endif"); fprintf(fd, "\n\nint %s::serve()", name); fprintf(fd, "\n{\n#ifndef WITH_FASTCGI\n\t%s->keep_alive = %s->max_keep_alive + 1;\n#endif\n\tdo\n\t{", soap, soap); fprintf(fd, "\n#ifndef WITH_FASTCGI\n\t\tif (%s->keep_alive > 0 && %s->max_keep_alive > 0)\n\t\t\t%s->keep_alive--;\n#endif", soap, soap, soap); fprintf(fd, "\n\t\tif (soap_begin_serve(%s))\n\t\t{\tif (%s->error >= SOAP_STOP)\n\t\t\t\tcontinue;\n\t\t\treturn %s->error;\n\t\t}", soap, soap, soap); fprintf(fd, "\n\t\tif ((dispatch() || (%s->fserveloop && %s->fserveloop(%s))) && %s->error && %s->error < SOAP_STOP)\n\t\t{\n#ifdef WITH_FASTCGI\n\t\t\tsoap_send_fault(%s);\n#else\n\t\t\treturn soap_send_fault(%s);\n#endif\n\t\t}", soap, soap, soap, soap, soap, soap, soap); fprintf(fd, "\n#ifdef WITH_FASTCGI\n\t\tsoap_destroy(%s);\n\t\tsoap_end(%s);\n\t} while (1);\n#else\n\t} while (%s->keep_alive);\n#endif", soap, soap, soap); fprintf(fd, "\n\treturn SOAP_OK;"); fprintf(fd, "\n}\n"); for (method = table->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) { if (jflag) fprintf(fd, "\nstatic int serve_%s(struct soap*, %s*);", ident(method->sym->name), name); else fprintf(fd, "\nstatic int serve_%s(%s*);", ident(method->sym->name), name); } } fprintf(fd, "\n\nint %s::dispatch()\n{", name); if (!iflag) { fprintf(fd, "\treturn dispatch(this->soap);\n}"); fprintf(fd, "\n\nint %s::dispatch(struct soap* soap)\n{", name); fprintf(fd, "\n\t%s_init(soap->imode, soap->omode);", name); soap = "soap"; } if (sflag) fprintf(fd, "\n\t%s->mode |= SOAP_XML_STRICT;", soap); if (aflag) { int i, num = 0; struct pair *map; for (method = table->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) { int found = 0; Service *sp; for (sp = services; sp; sp = sp->next) { if (has_ns_eq(sp->ns, method->sym->name)) { Method *m; for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, method->sym->name)) { if (m->mess == ACTION || m->mess == REQUEST_ACTION) { ++num; found = 1; } } } } } if (Aflag && !found) { sprintf(errbuf, "Option -A requires a SOAPAction specified for operation %s where none is defined", ident(method->sym->name)); compliancewarn(errbuf); } } } map = (struct pair*)emalloc(num * sizeof(struct pair)); num = 0; for (method = table->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) { Service *sp; for (sp = services; sp; sp = sp->next) { if (has_ns_eq(sp->ns, method->sym->name)) { Method *m; for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, method->sym->name)) { if (m->mess == ACTION || m->mess == REQUEST_ACTION) { map[num].action = m->part; map[num].method = method; ++num; } } } } } } } if (num > 0) { qsort(map, num, sizeof(struct pair), mapcomp); if (num > 4) /* binary search worthwhile when num > 4 */ { fprintf(fd, "\n\tif (soap->action)\n\t{\n\t\tconst char *soap_action[] = { "); for (i = 0; i < num; i++) { if (*map[i].action == '"') fprintf(fd, "%s, ", map[i].action); else fprintf(fd, "\"%s\", ", map[i].action); } fprintf(fd, " };"); fprintf(fd, "\n\t\tswitch (soap_binary_search_string(soap_action, %d, soap->action))\n\t\t{", num); for (i = 0; i < num; i++) { fprintf(fd, "\n\t\t\tcase %d:\t", i); if (iflag) fprintf(fd, "\n\t\t\t\treturn serve_%s(this);", ident(map[i].method->sym->name)); else fprintf(fd, "\n\t\t\t\treturn serve_%s(%s, this);", ident(map[i].method->sym->name), soap); } fprintf(fd, "\n\t\t}\n\t}"); } else { fprintf(fd, "\n\tif (soap->action)\n\t{"); for (i = 0; i < num; i++) { if (*map[i].action == '"') fprintf(fd, "\n\t\tif (!strcmp(soap->action, %s))", map[i].action); else fprintf(fd, "\n\t\tif (!strcmp(soap->action, \"%s\"))", map[i].action); if (iflag) fprintf(fd, "\n\t\t\treturn serve_%s(this);", ident(map[i].method->sym->name)); else fprintf(fd, "\n\t\t\treturn serve_%s(%s, this);", ident(map[i].method->sym->name), soap); } fprintf(fd, "\n\t}"); } } } if (!Aflag) { fprintf(fd, "\n\tsoap_peek_element(%s);", soap); catch_method = NULL; for (method = table->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) { if (is_invisible(method->sym->name)) { Entry *param = entry(classtable, method->sym); if (param) param = ((Table*)param->info.typ->ref)->list; if (param) { fprintf(fd, "\n\tif (!soap_match_tag(%s, %s->tag, \"%s\")", soap, soap, ns_convert(param->sym->name)); if (iflag) fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(method->sym->name)); else fprintf(fd, ")\n\t\treturn serve_%s(%s, this);", ident(method->sym->name), soap); } else { catch_method = method; } } else { fprintf(fd, "\n\tif (!soap_match_tag(%s, %s->tag, \"%s\")", soap, soap, ns_convert(method->sym->name)); if (iflag) fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(method->sym->name)); else fprintf(fd, ")\n\t\treturn serve_%s(%s, this);", ident(method->sym->name), soap); } } } if (catch_method) { if (iflag) fprintf(fd, "\n\treturn serve_%s(this);\n}", ident(catch_method->sym->name)); else fprintf(fd, "\n\treturn serve_%s(soap, this);\n}", ident(catch_method->sym->name)); } else { fprintf(fd, "\n\treturn %s->error = SOAP_NO_METHOD;\n}", soap); } } else { fprintf(fd, "\n\treturn %s->error = SOAP_NO_METHOD;\n}", soap); } for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ) && has_ns_eq(ns->name, method->sym->name)) gen_serve_method(fd, table, method, name); if (namespaceid) fprintf(fd, "\n\n} // namespace %s\n", namespaceid); fprintf(fd, "\n/* End of server object code */\n"); } void gen_method(FILE *fd, Entry *method, int server) { Table *params; Entry *result, *p; const char *soap; if (iflag) soap = "this"; else soap = "this->soap"; result = (Entry*)method->info.typ->ref; p = entry(classtable, method->sym); if (!p) execerror("no table entry"); params = (Table*)p->info.typ->ref; if (server || !is_transient(result->info.typ)) { if (is_transient(result->info.typ)) fprintf(fd, "\n //\n /// Web service one-way operation '%s' implementation, should return value of send_%s_empty_response() to send HTTP Accept acknowledgment, or return an error code, or return SOAP_OK to immediately return without sending an HTTP response message", ns_remove(method->sym->name), ns_remove(method->sym->name)); else if (server) fprintf(fd, "\n //\n /// Web service operation '%s' implementation, should return SOAP_OK or error code", ns_remove(method->sym->name)); else fprintf(fd, "\n //\n /// Web service synchronous operation '%s' with default endpoint and default SOAP Action header, returns SOAP_OK or error code", ns_remove(method->sym->name)); fprintf(fd, "\n virtual int %s(", ns_cname(method->sym->name, NULL)); gen_params_ref(fd, params, result, 0); if (!server) { fprintf(fd, " { return this->%s(NULL, NULL", ns_cname(method->sym->name, NULL)); gen_args(fd, params, result, 1); fprintf(fd, "; }"); fprintf(fd, "\n /// Web service synchronous operation '%s' to the specified endpoint and SOAP Action header, returns SOAP_OK or error code", ns_remove(method->sym->name)); fprintf(fd, "\n virtual int %s(const char *soap_endpoint_url, const char *soap_action", ns_cname(method->sym->name, NULL)); gen_params_ref(fd, params, result, 1); fprintf(fd, " { return this->send_%s(soap_endpoint_url, soap_action", ns_cname(method->sym->name, NULL)); gen_args(fd, params, NULL, 1); fprintf(fd, " || this->recv_%s(", ns_cname(method->sym->name, NULL)); gen_args(fd, NULL, result, 0); if (iflag) fprintf(fd, " ? this->error : SOAP_OK; }"); else fprintf(fd, " ? this->soap->error : SOAP_OK; }"); fprintf(fd, "\n /// Web service asynchronous operation 'send_%s' to send a request message to the specified endpoint and SOAP Action header, returns SOAP_OK or error code", ns_remove(method->sym->name)); fprintf(fd, "\n virtual int send_%s(const char *soap_endpoint_url, const char *soap_action", ns_cname(method->sym->name, NULL)); gen_params_ref(fd, params, NULL, 1); fprintf(fd, ";"); fprintf(fd, "\n /// Web service asynchronous operation 'recv_%s' to receive a response message from the connected endpoint, returns SOAP_OK or error code", ns_remove(method->sym->name)); fprintf(fd, "\n virtual int recv_%s(", ns_cname(method->sym->name, NULL)); gen_params_ref(fd, NULL, result, 0); fprintf(fd, ";"); } if (server) fprintf(fd, " SOAP_PURE_VIRTUAL;"); if (is_transient(result->info.typ)) { fprintf(fd, "\n /// Web service asynchronous send of HTTP Accept acknowledgment to be called in '%s', returns SOAP_OK or error code", ns_remove(method->sym->name)); fprintf(fd, "\n virtual int send_%s_empty_response(int soap_http_status = 202) { return soap_send_empty_response(%s, soap_http_status); }", ns_cname(method->sym->name, NULL), soap); } } else { fprintf(fd, "\n //\n /// Web service one-way synchronous send operation '%s' to the default endpoint with the default SOAP Action header then wait for HTTP OK/Accept response, returns SOAP_OK or error code", ns_remove(method->sym->name)); fprintf(fd, "\n virtual int %s(", ns_cname(method->sym->name, NULL)); gen_params_ref(fd, params, result, 0); fprintf(fd, " { return this->%s(NULL, NULL", ns_cname(method->sym->name, NULL)); gen_args(fd, params, result, 1); fprintf(fd, "; }"); fprintf(fd, "\n /// Web service one-way synchronous send operation '%s' to the specified endpoint and SOAP Action header then wait for HTTP OK/Accept response, returns SOAP_OK or error code", ns_remove(method->sym->name)); fprintf(fd, "\n virtual int %s(const char *soap_endpoint_url, const char *soap_action", ns_cname(method->sym->name, NULL)); gen_params_ref(fd, params, result, 1); fprintf(fd, " { return (this->send_%s(soap_endpoint_url, soap_action", ns_cname(method->sym->name, NULL)); gen_args(fd, params, result, 1); fprintf(fd, " || soap_recv_empty_response(%s)) ? %s->error : SOAP_OK; }", soap, soap); fprintf(fd, "\n /// Web service one-way asynchronous send operation 'send_%s' with default endpoint and default SOAP Action header, returns SOAP_OK or error code", ns_remove(method->sym->name)); fprintf(fd, "\n virtual int send_%s(", ns_cname(method->sym->name, NULL)); gen_params_ref(fd, params, result, 0); fprintf(fd, " { return this->send_%s(NULL, NULL", ns_cname(method->sym->name, NULL)); gen_args(fd, params, result, 1); fprintf(fd, "; }"); fprintf(fd, "\n /// Web service one-way asynchronous send operation 'send_%s' to the specified endpoint and SOAP Action header, returns SOAP_OK or error code", ns_remove(method->sym->name)); fprintf(fd, "\n virtual int send_%s(const char *soap_endpoint_url, const char *soap_action", ns_cname(method->sym->name, NULL)); gen_params_ref(fd, params, result, 1); fprintf(fd, ";\n /// Web service one-way asynchronous receive operation 'recv_%s', returns SOAP_OK or error code", ns_remove(method->sym->name)); fprintf(fd, ";\n virtual int recv_%s(", ns_cname(method->sym->name, NULL)); fprintf(fd, "struct %s&);", ident(method->sym->name)); fprintf(fd, "\n /// Web service asynchronous receive of HTTP Accept acknowledgment for one-way asynchronous send operation 'send_%s', returns SOAP_OK or error code", ns_remove(method->sym->name)); fprintf(fd, "\n virtual int recv_%s_empty_response() { return soap_recv_empty_response(%s); }", ns_cname(method->sym->name, NULL), soap); } } void gen_report_params(Entry *type, Entry *result, int server) { Table *params = (Table*)type->info.typ->ref; if (params) { Entry *param; for (param = params->list; param; param = param->next) { fprintf(freport, "- `%s` is %s", c_type_id(param->info.typ, param->sym->name), param->info.minOccurs > 0 ? "required" : "optional"); if (param->info.hasval || param->info.ptrval) { if (param->info.fixed) fprintf(freport, " with the fixed value%s", c_init(param)); else fprintf(freport, " with default value%s", c_init(param)); } gen_report_member(type, param); gen_report_type(param->info.typ, "parameter"); if (is_unmatched(param->sym)) fprintf(freport, " (the leading underscore makes this parameter a wildcard that matches any XML element tag)"); fprintf(freport, "\n"); } } if (!is_transient(result->info.typ)) { Tnode *ref = (Tnode*)result->info.typ->ref; if (result->info.typ->type == Tpointer) fprintf(freport, "- `%s` is the service operation response, which is a non-NULL pointer to a `%s`%s", c_type_id(result->info.typ, result->sym->name), c_type(result->info.typ->ref), server ? " that the service operation should populate with the response data" : " that the client provides with the call and is populated by the service operation as the result of the call"); else fprintf(freport, "- `%s` is the service operation response data populated by the service operation", c_type_id(result->info.typ, result->sym->name)); gen_report_type(ref, "result parameter"); if (is_unmatched(result->sym)) fprintf(freport, " (the leading underscore makes this result parameter a wildcard that matches any XML element tag)"); fprintf(freport, "\n"); } fprintf(freport, "\n"); } void gen_report_req_params(Tnode *typ) { Table *Tptr; Entry *Eptr; int derclass = 0, flag = 0; if (!is_dynamic_array(typ)) { for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) { if (is_repetition(Eptr) || is_anytype(Eptr)) flag = 2; if ((Eptr->info.minOccurs > 0 || flag) && !(Eptr->info.sto & (Sprivate | Sprotected | Sconst | Sstatic | Stypedef)) && Eptr->info.typ->type != Tfun && !is_soapref(Eptr->info.typ)) { if (flag) flag--; if (is_smart(Eptr->info.typ)) { if (is_smart_shared(Eptr->info.typ)) fprintf(freport, ", %s %s", c_type_id(Eptr->info.typ, "&"), ident(Eptr->sym->name)); else fprintf(freport, ", %s %s", c_type_id(Eptr->info.typ->ref, "*"), ident(Eptr->sym->name)); } else if (Eptr->info.typ->type == Ttemplate && is_smart(Eptr->info.typ->ref) && !is_smart_shared(Eptr->info.typ->ref)) continue; else if (Eptr->info.typ->type == Tclass || Eptr->info.typ->type == Tstruct || Eptr->info.typ->type == Tunion || Eptr->info.typ->type == Ttemplate) fprintf(freport, ", const %s& %s", c_type(Eptr->info.typ), ident(Eptr->sym->name)); else if ((Eptr->info.sto & Sconstptr)) fprintf(freport, ", const %s", c_type_id(Eptr->info.typ, Eptr->sym->name)); else if (Eptr->info.typ->type == Tarray) fprintf(freport, ", %s", c_type_id(Eptr->info.typ, Eptr->sym->name)); else fprintf(freport, ", %s", c_type_id(Eptr->info.typ, Eptr->sym->name)); if (derclass && Eptr->info.typ->type != Tarray) fprintf(freport, "__%d", derclass); } } } } } void gen_report_set_params(Tnode *typ) { Table *Tptr; Entry *Eptr; int derclass = 0; for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) { if (!(Eptr->info.sto & (Sprivate | Sprotected | Sconst | Sstatic | Stypedef)) && Eptr->info.typ->type != Tfun && !is_soapref(Eptr->info.typ)) { if (is_smart(Eptr->info.typ)) { if (is_smart_shared(Eptr->info.typ)) fprintf(freport, ", %s %s", c_type_id(Eptr->info.typ, "&"), ident(Eptr->sym->name)); else fprintf(freport, ", %s %s", c_type_id(Eptr->info.typ->ref, "*"), ident(Eptr->sym->name)); } else if (Eptr->info.typ->type == Ttemplate && is_smart(Eptr->info.typ->ref) && !is_smart_shared(Eptr->info.typ->ref)) continue; else if (Eptr->info.typ->type == Tclass || Eptr->info.typ->type == Tstruct || Eptr->info.typ->type == Tunion || Eptr->info.typ->type == Ttemplate) fprintf(freport, ", const %s& %s", c_type(Eptr->info.typ), ident(Eptr->sym->name)); else if ((Eptr->info.sto & Sconstptr)) fprintf(freport, ", const %s", c_type_id(Eptr->info.typ, Eptr->sym->name)); else if (Eptr->info.typ->type == Tarray) fprintf(freport, ", %s", c_type_id(Eptr->info.typ, Eptr->sym->name)); else fprintf(freport, ", %s", c_type_id(Eptr->info.typ, Eptr->sym->name)); if (derclass && Eptr->info.typ->type != Tarray) fprintf(freport, "__%d", derclass); } } } } void gen_params_ref(FILE *fd, Table *params, Entry *result, int flag) { if (params) { Entry *param; for (param = params->list; param; param = param->next) { if (!cflag && (param->info.typ->type == Tstruct || param->info.typ->type == Tclass)) fprintf(fd, "%s%s%s& %s", (flag || param != params->list) ? ", " : "", c_storage(param->info.sto | Sconst), c_type(param->info.typ), ident(param->sym->name)); else fprintf(fd, "%s%s%s", (flag || param != params->list) ? ", " : "", c_storage(param->info.sto), c_type_id(param->info.typ, param->sym->name)); } } if (!result || is_transient(result->info.typ)) fprintf(fd, ")"); else fprintf(fd, "%s%s%s)", (flag || (params && params->list)) ? ", " : "", c_storage(result->info.sto), c_type_id(result->info.typ, result->sym->name)); } void gen_params(FILE *fd, Table *params, Entry *result, int flag) { if (params) { Entry *param; for (param = params->list; param; param = param->next) fprintf(fd, "%s%s%s", (flag || param != params->list) ? ", " : "", c_storage(param->info.sto), c_type_id(param->info.typ, param->sym->name)); } if (!result || is_transient(result->info.typ)) fprintf(fd, ")"); else fprintf(fd, "%s%s%s)", (flag || (params && params->list)) ? ", " : "", c_storage(result->info.sto), c_type_id(result->info.typ, result->sym->name)); } void gen_args(FILE *fd, Table *params, Entry *result, int flag) { if (params) { Entry *param; for (param = params->list; param; param = param->next) fprintf(fd, "%s%s", (flag || param != params->list) ? ", " : "", ident(param->sym->name)); } if (!result || is_transient(result->info.typ)) fprintf(fd, ")"); else fprintf(fd, "%s%s)", (flag || (params && params->list)) ? ", " : "", ident(result->sym->name)); } void gen_query_url(FILE *fd, Table *params, int soap) { Entry *param; if (soap) fprintf(fd, "\n\tsoap_extend_url_query(soap, soap_endpoint, NULL);"); else fprintf(fd, "\n\tsoap_extend_url_query(soap, soap_endpoint, soap_action);"); for (param = params->list; param; param = param->next) { if (is_transient(param->info.typ)) continue; if (is_repetition(param) && is_primitive_or_string(param->next->info.typ->ref)) { fprintf(fd, "\n\t{\tint i;\n\t\tfor (i = 0; i < (int)%s; i++)\n\t\t\tsoap_url_query(soap, \"%s=\", ", ident(param->sym->name), ns_remove(param->next->sym->name)); gen_query_url_type2s(fd, param->next->info.typ->ref, ident(param->next->sym->name), "", "[i]"); fprintf(fd, ");\n\t}"); param = param->next; } else if (param->info.typ->type == Tpointer && is_container(param->info.typ->ref) && is_primitive_or_string(((Tnode*)param->info.typ->ref)->ref)) { fprintf(fd, "\n\tif (%s)\n\t\tfor (%s::const_iterator i = %s->begin(); i != %s->end(); ++i)\n\t\t\tsoap_url_query(soap, \"%s=\", ", ident(param->sym->name), c_type(param->info.typ->ref), ident(param->sym->name), ident(param->sym->name), ns_remove(param->sym->name)); gen_query_url_type2s(fd, ((Tnode*)param->info.typ->ref)->ref, "i", "*", ""); fprintf(fd, ");"); } else if (is_primitive_or_string(param->info.typ)) { fprintf(fd, "\n\tsoap_url_query(soap, \"%s=\", ", ns_remove(param->sym->name)); gen_query_url_type2s(fd, param->info.typ, ident(param->sym->name), "", ""); fprintf(fd, ");"); } else if (param->info.typ->type == Tpointer && is_primitive_or_string(param->info.typ->ref)) { fprintf(fd, "\n\tif (%s)\n\t\tsoap_url_query(soap, \"%s=\", ", ident(param->sym->name), ns_remove(param->sym->name)); gen_query_url_type2s(fd, param->info.typ->ref, ident(param->sym->name), "*", ""); fprintf(fd, ");"); } } } void gen_query_url_type2s(FILE *fd, Tnode *typ, const char *name, const char *ptr, const char *idx) { if (!is_transient(typ)) { if (is_stdstring(typ)) fprintf(fd, "(%s%s%s).c_str()", ptr, name, idx); else if (is_stdwstring(typ)) fprintf(fd, "soap_wchar2s(soap, (%s%s%s).c_str())", ptr, name, idx); else if (is_string(typ)) fprintf(fd, "%s%s%s", ptr, name, idx); else if (is_wstring(typ)) fprintf(fd, "soap_wchar2s(soap, %s%s%s)", ptr, name, idx); else if (is_primitive(typ)) fprintf(fd, "soap_%s2s(soap, %s%s%s)", c_ident(typ), ptr, name, idx); } } void gen_query_send_form_init(FILE *fd, Table *params) { Entry *param; for (param = params->list; param; param = param->next) { if (!is_transient(param->info.typ)) { if (is_repetition(param) && is_primitive_or_string(param->next->info.typ->ref)) { fprintf(fd, "\n\tint soap_tmp_i;"); break; } } } } void gen_query_send_form(FILE *fd, Table *params) { Entry *param; int init = 0; for (param = params->list; param; param = param->next) { if (!is_transient(param->info.typ)) { if (is_repetition(param) && is_primitive_or_string(param->next->info.typ->ref)) { if (init) fprintf(fd, ")\n\t\treturn soap_closesock(soap);"); fprintf(fd, "\n\tfor (soap_tmp_i = 0; soap_tmp_i < (int)%s; soap_tmp_i++)\n\t\tif (soap_query_send_key(soap, \"%s\") || ", ident(param->sym->name), ns_remove(param->next->sym->name)); gen_query_form_type2s(fd, param->next->info.typ->ref, ident(param->next->sym->name), "", "[soap_tmp_i]"); fprintf(fd, ")\n\t\t\treturn soap_closesock(soap);"); param = param->next; init = 0; } else if (is_container(param->info.typ) && is_primitive_or_string(param->info.typ->ref)) { if (init) fprintf(fd, ")\n\t\treturn soap_closesock(soap);"); fprintf(fd, "\n\tfor (%s::const_iterator i = %s.begin(); i != %s.end(); ++i)\n\t\tif (soap_query_send_key(soap, \"%s\") || ", c_type(param->info.typ), ident(param->sym->name), ident(param->sym->name), ns_remove(param->sym->name)); gen_query_form_type2s(fd, param->info.typ->ref, "i", "*", ""); fprintf(fd, ")\n\t\t\treturn soap_closesock(soap);"); init = 0; } else if (param->info.typ->type == Tpointer && is_container(param->info.typ->ref) && is_primitive_or_string(((Tnode*)param->info.typ->ref)->ref)) { if (init) fprintf(fd, ")\n\t\treturn soap_closesock(soap);"); fprintf(fd, "\n\tif (%s)\n\t\tfor (%s::const_iterator i = %s->begin(); i != %s->end(); ++i)\n\t\t\tif (soap_query_send_key(soap, \"%s\") || ", ident(param->sym->name), c_type(param->info.typ->ref), ident(param->sym->name), ident(param->sym->name), ns_remove(param->sym->name)); gen_query_form_type2s(fd, ((Tnode*)param->info.typ->ref)->ref, "i", "*", ""); fprintf(fd, ")\n\t\t\t\treturn soap_closesock(soap);"); init = 0; } else if (is_primitive_or_string(param->info.typ)) { if (!init++) fprintf(fd, "\n\tif ("); else fprintf(fd, "\n\t || "); fprintf(fd, "soap_query_send_key(soap, \"%s\")\n\t || ", ns_remove(param->sym->name)); gen_query_form_type2s(fd, param->info.typ, ident(param->sym->name), "", ""); } else if (param->info.typ->type == Tpointer && is_primitive_or_string(param->info.typ->ref)) { if (!init++) fprintf(fd, "\n\tif ("); else fprintf(fd, "\n\t || "); fprintf(fd, "(%s && (soap_query_send_key(soap, \"%s\") || ", ident(param->sym->name), ns_remove(param->sym->name)); gen_query_form_type2s(fd, param->info.typ->ref, ident(param->sym->name), "*", ""); fprintf(fd, "))"); } } } if (!init) fprintf(fd, "\n\tif ("); else fprintf(fd, "\n\t || "); fprintf(fd, "soap_end_send(soap))\n\t\treturn soap_closesock(soap);"); } void gen_query_recv_form_init(FILE *fd, Entry *result) { if ((result->info.typ->type == Treference || result->info.typ->type == Tpointer) && !is_invisible_empty((Tnode*)result->info.typ->ref)) { if ((((Tnode*)(result->info.typ->ref))->type == Tstruct || ((Tnode*)(result->info.typ->ref))->type == Tclass) && !is_stdstr(result->info.typ->ref) && !is_dynamic_array(result->info.typ->ref)) { Table *table = ((Tnode*)result->info.typ->ref)->ref; if (table) { Entry *param; for (param = table->list; param; param = param->next) { if (!is_transient(param->info.typ)) { if (is_repetition(param) && is_primitive_or_string(param->next->info.typ->ref)) { fprintf(fd, "\n\tstruct soap_blist *soap_blist_%s = NULL;", ident(param->next->sym->name)); param = param->next; } } } } } } } void gen_query_recv_form(FILE *fd, Entry *result) { if ((result->info.typ->type == Treference || result->info.typ->type == Tpointer) && !is_invisible_empty((Tnode*)result->info.typ->ref)) { if (is_primitive_or_string(result->info.typ->ref)) { fprintf(fd, "\n\tsoap_tmp_key = soap_query_key(soap, &soap_tmp);\n\tif (!soap_tmp_key)\n\t{\tsoap->error = SOAP_EMPTY;\n\t\treturn soap_closesock(soap);\n\t}"); fprintf(fd, "\n\tif (!strcmp(soap_tmp_key, \"%s\"))\n\t{\tif (", ns_remove(result->sym->name)); gen_query_form_s2type(fd, result->info.typ->ref, ident(result->sym->name), result->info.typ->type == Treference ? "&" : "", "", ""); fprintf(fd, ")\n\t\t\treturn soap_closesock(soap);\n\t}"); } else if ((((Tnode*)(result->info.typ->ref))->type == Tstruct || ((Tnode*)(result->info.typ->ref))->type == Tclass) && !is_dynamic_array(result->info.typ->ref)) { Table *table = ((Tnode*)result->info.typ->ref)->ref; if (table) { Entry *param; fprintf(fd, "\n\twhile (soap_tmp && (soap_tmp_key = soap_query_key(soap, &soap_tmp)))\n\t{"); for (param = table->list; param; param = param->next) { if (!is_transient(param->info.typ)) { if (is_repetition(param) && is_stdstr(param->next->info.typ->ref)) { fprintf(fd, "\n\t\tif (!strcmp(soap_tmp_key, \"%s\"))\n\t\t{\tif (soap_blist_%s == NULL)\n\t\t\t\tsoap_blist_%s = soap_alloc_block(soap);\n\t\t\t%s%s%s = soap_block<%s>::push(soap, soap_blist_%s);\n\t\t\tif (%s%s%s == NULL)\n\t\t\t\tbreak;\n\t\t\t%s%s%s++;\n\t\t\tif (", ns_remove(param->next->sym->name), ident(param->next->sym->name), ident(param->next->sym->name), ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->next->sym->name), c_type(param->next->info.typ->ref), ident(param->next->sym->name), ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->next->sym->name), ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->sym->name)); gen_query_form_s2type(fd, param->next->info.typ->ref, ident(result->sym->name), "", result->info.typ->type == Treference ? "." : "->", ident(param->next->sym->name)); fprintf(fd, ")\n\t\t\t\tbreak;\n\t\t}"); param = param->next; } else if (is_repetition(param) && is_primitive_or_string(param->next->info.typ->ref)) { fprintf(fd, "\n\t\tif (!strcmp(soap_tmp_key, \"%s\"))\n\t\t{\tif (soap_blist_%s == NULL)\n\t\t\t\tsoap_blist_%s = soap_alloc_block(soap);\n\t\t\t%s%s%s = (%s)soap_push_block_max(soap, soap_blist_%s, sizeof(%s));\n\t\t\tif (%s%s%s == NULL)\n\t\t\t\tbreak;\n\t\t\t%s%s%s++;\n\t\t\tif (", ns_remove(param->next->sym->name), ident(param->next->sym->name), ident(param->next->sym->name), ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->next->sym->name), c_type(param->next->info.typ), ident(param->next->sym->name), c_type(param->next->info.typ->ref), ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->next->sym->name), ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->sym->name)); gen_query_form_s2type(fd, param->next->info.typ->ref, ident(result->sym->name), "", result->info.typ->type == Treference ? "." : "->", ident(param->next->sym->name)); fprintf(fd, ")\n\t\t\t\tbreak;\n\t\t}"); param = param->next; } else if (is_container(param->info.typ) && is_primitive_or_string(param->info.typ->ref)) { fprintf(fd, "\n\t\tif (!strcmp(soap_tmp_key, \"%s\"))\n\t\t{\t%s soap_tmp_val;\n\t\t\tif (", ns_remove(param->sym->name), c_type(param->info.typ->ref)); gen_query_form_s2type(fd, param->info.typ->ref, "soap_tmp_val", "&", "", ""); fprintf(fd, ")\n\t\t\t\tbreak;\n\t\t\t%s%s%s.insert(%s%s%s.end(), soap_tmp_val);\n\t\t}", ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->sym->name), ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->sym->name)); } else if (param->info.typ->type == Tpointer && is_container(param->info.typ->ref) && is_primitive_or_string(((Tnode*)param->info.typ->ref)->ref)) { fprintf(fd, "\n\t\tif (!strcmp(soap_tmp_key, \"%s\"))\n\t\t{\t%s soap_tmp_val;\n\t\t\tif (", ns_remove(param->sym->name), c_type(((Tnode*)param->info.typ->ref)->ref)); gen_query_form_s2type(fd, ((Tnode*)param->info.typ->ref)->ref, "soap_tmp_val", "&", "", ""); fprintf(fd, ")\n\t\t\t\tbreak;\n\t\t\t%s%s%s->insert(%s%s%s->end(), soap_tmp_val);\n\t\t}", ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->sym->name), ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->sym->name)); } else if (is_primitive_or_string(param->info.typ)) { fprintf(fd, "\n\t\tif (!strcmp(soap_tmp_key, \"%s\"))\n\t\t{\tif (", ns_remove(param->sym->name)); gen_query_form_s2type(fd, param->info.typ, ident(result->sym->name), "&", result->info.typ->type == Treference ? "." : "->", ident(param->sym->name)); fprintf(fd, ")\n\t\t\t\tbreak;\n\t\t}"); } else if (param->info.typ->type == Tpointer && is_primitive_or_string(param->info.typ->ref)) { fprintf(fd, "\n\t\tif (!strcmp(soap_tmp_key, \"%s\"))\n\t\t{\tif (", ns_remove(param->sym->name)); gen_query_form_s2type(fd, param->info.typ->ref, ident(result->sym->name), "", result->info.typ->type == Treference ? "." : "->", ident(param->sym->name)); fprintf(fd, ")\n\t\t\t\tbreak;\n\t\t}"); } } } fprintf(fd, "\n\t}"); for (param = table->list; param; param = param->next) { if (!is_transient(param->info.typ)) { if (is_repetition(param) && is_stdstr(param->next->info.typ->ref)) { fprintf(fd, "\n\tif (soap_blist_%s)\n\t{\t%s%s%s = soap_new_%s(soap, %s%s%s);\n\t\tif (%s%s%s)\n\t\t\tsoap_block<%s>::save(soap, soap_blist_%s, %s%s%s);\n\t}", ident(param->next->sym->name), ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->next->sym->name), c_ident(param->next->info.typ->ref), ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->sym->name), ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->next->sym->name), c_type(param->next->info.typ->ref), ident(param->next->sym->name), ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->next->sym->name)); } else if (is_repetition(param) && is_primitive_or_string(param->next->info.typ->ref)) { fprintf(fd, "\n\tif (soap_blist_%s)\n\t\t%s%s%s = (%s)soap_save_block(soap, soap_blist_%s, NULL, 1);", ident(param->next->sym->name), ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->next->sym->name), c_type(param->next->info.typ), ident(param->next->sym->name)); param = param->next; } } } } } } } void gen_query_form_type2s(FILE *fd, Tnode *typ, const char *name, const char *ptr, const char *idx) { if (is_stdstring(typ)) fprintf(fd, "soap_query_send_val(soap, (%s%s%s).c_str())", ptr, name, idx); else if (is_stdwstring(typ)) fprintf(fd, "soap_query_send_val(soap, soap_wchar2s(soap, (%s%s%s)->c_str()))", ptr, name, idx); else if (is_string(typ)) fprintf(fd, "soap_query_send_val(soap, %s%s%s)", ptr, name, idx); else if (is_wstring(typ)) fprintf(fd, "soap_query_send_val(soap, soap_wchar2s(soap, %s%s%s))", ptr, name, idx); else if (typ->type == Tenum || typ->type == Tenumsc) fprintf(fd, "soap_query_send_val(soap, soap_%s2s(soap, %s%s%s))", c_ident(typ), ptr, name, idx); else if (is_primitive(typ)) fprintf(fd, "soap_query_send_val(soap, soap_%s2s(soap, %s%s%s))", c_ident(typ), ptr, name, idx); } void gen_query_form_s2type(FILE *fd, Tnode *typ, const char *name, const char *ptr, const char *ref, const char *idx) { if (is_stdstring(typ)) fprintf(fd, "soap_s2stdchar(soap, soap_query_val(soap, &soap_tmp), %s%s%s%s, %d, %ld, %ld, %s)", ptr, name, ref, idx, property(typ), minlen(typ), maxlen(typ), pattern(typ)); else if (is_stdwstring(typ)) fprintf(fd, "soap_s2stdwchar(soap, soap_query_val(soap, &soap_tmp), %s%s%s%s, %d, %ld, %ld, %s)", ptr, name, ref, idx, property(typ), minlen(typ), maxlen(typ), pattern(typ)); else if (is_string(typ)) fprintf(fd, "soap_string(soap, soap_query_val(soap, &soap_tmp), %s%s%s%s, %d, %ld, %ld, %s)", ptr, name, ref, idx, property(typ), minlen(typ), maxlen(typ), pattern(typ)); else if (is_wstring(typ)) fprintf(fd, "soap_wstring(soap, soap_query_val(soap, &soap_tmp), %s%s%s%s, %d, %ld, %ld, %s)", ptr, name, ref, idx, property(typ), minlen(typ), maxlen(typ), pattern(typ)); else if (is_primitive(typ)) fprintf(fd, "soap_s2%s(soap, soap_query_val(soap, &soap_tmp), %s%s%s%s)", c_ident(typ), ptr, name, ref, idx); } void gen_call_proto(FILE *fd, Entry *method) { Table *params; Entry *result, *p; result = (Entry*)method->info.typ->ref; p = entry(classtable, method->sym); if (!p) execerror("no table entry"); params = (Table*)p->info.typ->ref; if (fd == freport) gen_report_operation(NULL, method, 0); if (!is_transient(result->info.typ)) { fprintf(fd, "\n "); fprintf(fd, "\n /** Web service synchronous operation 'soap_call_%s' to the specified endpoint and SOAP Action header, returns SOAP_OK or error code */", ident(method->sym->name)); fprintf(fd, "\n SOAP_FMAC5 int SOAP_FMAC6 soap_call_%s(struct soap *soap, const char *soap_endpoint, const char *soap_action", ident(method->sym->name)); gen_params_ref(fd, params, result, 1); fprintf(fd, ";"); fprintf(fd, "\n /** Web service asynchronous operation 'soap_send_%s' to send a request message to the specified endpoint and SOAP Action header, returns SOAP_OK or error code */", ident(method->sym->name)); fprintf(fd, "\n SOAP_FMAC5 int SOAP_FMAC6 soap_send_%s(struct soap *soap, const char *soap_endpoint, const char *soap_action", ident(method->sym->name)); gen_params_ref(fd, params, NULL, 1); fprintf(fd, ";"); fprintf(fd, "\n /** Web service asynchronous operation 'soap_recv_%s' to receive a response message from the connected endpoint, returns SOAP_OK or error code */", ident(method->sym->name)); fprintf(fd, "\n SOAP_FMAC5 int SOAP_FMAC6 soap_recv_%s(struct soap *soap", ident(method->sym->name)); gen_params_ref(fd, NULL, result, 1); fprintf(fd, ";"); } else { fprintf(fd, "\n /** Web service one-way asynchronous operation 'soap_send_%s' */", ident(method->sym->name)); fprintf(fd, "\n SOAP_FMAC5 int SOAP_FMAC6 soap_send_%s(struct soap *soap, const char *soap_endpoint, const char *soap_action", ident(method->sym->name)); gen_params_ref(fd, params, NULL, 1); fprintf(fd, ";"); fprintf(fd, "\n /** Web service one-way asynchronous operation 'soap_recv_%s' */", ident(method->sym->name)); fprintf(fd, "\n SOAP_FMAC5 int SOAP_FMAC6 soap_recv_%s(struct soap *soap, struct %s *%s);", ident(method->sym->name), ident(method->sym->name), ident(result->sym->name)); } if (fd == freport) { fprintf(freport, "\n\nwhere:\n\n- `struct soap *soap` is the context\n- `const char *soap_endpoint` is the endpoint URL (or list of space-separated URLs) or NULL to use the default endpoint(s)\n- `const char *soap_action` is the SOAP action header or NULL to use the default action (recommended)\n"); gen_report_params(p, result, 0); if (!is_transient(result->info.typ)) fprintf(freport, "The `soap_call_%s` function sends the request message and receives the response message, assigning the last parameter `%s` the response value received. The `soap_send_%s` function sends the request message and the `soap_recv_%s` function receives the response message asynchronously. These functions return `SOAP_OK` or an error code.\n\n", ident(method->sym->name), ident(result->sym->name), ident(method->sym->name), ident(method->sym->name)); else fprintf(freport, "The `soap_send_%s` function sends the one-way request message and the `soap_recv_%s` function receives the one-way request message. The `int soap_recv_empty_response(struct soap *soap)` function should be called after the `send_%s` function when communicating over HTTP to receive the HTTP acknowledgment.\n\n", ident(method->sym->name), ident(method->sym->name), ident(method->sym->name)); gen_report_hr(); } } void gen_call_method(FILE *fd, Entry *method, const char *name) { Service *sp; Method *m; int soap = (soap_version >= 0); int version = soap_version; int get = 0; int put = 0; int del = 0; int post = 0; int mimein = 0; int mimeout = 0; const char *encoding = NULL; const char *xtag; const char *action = NULL, *method_encoding = NULL, *method_response_encoding = NULL; Table *params; Entry *param, *result, *p, *response = NULL; result = (Entry*)method->info.typ->ref; (void)post; p = entry(classtable, method->sym); if (!p) execerror("no table entry"); params = (Table*)p->info.typ->ref; if (!is_response(result->info.typ) && !is_XML(result->info.typ)) response = get_response(method->info.typ); if (name) { if (!is_transient(result->info.typ)) { fprintf(fd, "\n\nint %s::send_%s(const char *soap_endpoint_url, const char *soap_action", name, ns_cname(method->sym->name, NULL)); gen_params_ref(fd, params, NULL, 1); } else { fprintf(fd, "\n\nint %s::send_%s(const char *soap_endpoint_url, const char *soap_action", name, ns_cname(method->sym->name, NULL)); gen_params_ref(fd, params, NULL, 1); } } else { if (!is_transient(result->info.typ)) { fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_call_%s(struct soap *soap, const char *soap_endpoint, const char *soap_action", ident(method->sym->name)); gen_params_ref(fd, params, result, 1); fprintf(fd, "\n{\tif (soap_send_%s(soap, soap_endpoint, soap_action", ident(method->sym->name)); gen_args(fd, params, NULL, 1); fprintf(fd, " || soap_recv_%s(soap", ident(method->sym->name)); gen_args(fd, NULL, result, 1); fprintf(fd, ")\n\t\treturn soap->error;\n\treturn SOAP_OK;\n}"); fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_send_%s(struct soap *soap, const char *soap_endpoint, const char *soap_action", ident(method->sym->name)); gen_params_ref(fd, params, NULL, 1); } else { fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_send_%s(struct soap *soap, const char *soap_endpoint, const char *soap_action", ident(method->sym->name)); gen_params_ref(fd, params, NULL, 1); } } if (name) { if (iflag) fprintf(fd, "\n{\n\tstruct soap *soap = this;\n"); else fprintf(fd, "\n{\n"); } else { fprintf(fd, "\n{"); } for (sp = services; sp; sp = sp->next) { if (has_ns_eq(sp->ns, method->sym->name)) { encoding = sp->encoding; method_encoding = encoding; method_response_encoding = NULL; if (sp->protocol) { if (strstr(sp->protocol, "GET")) get = 1; else if (strstr(sp->protocol, "PUT")) put = 1; else if (strstr(sp->protocol, "DELETE")) del = 1; else if (strstr(sp->protocol, "POST")) post = 1; if (strncmp(sp->protocol, "SOAP", 4)) soap = 0; else if (strlen(sp->protocol) > 6) version = sp->protocol[6] - '0'; } for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, method->sym->name)) { if (m->mess == ACTION || m->mess == REQUEST_ACTION) action = m->part; else if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; else if (m->mess == PROTOCOL) { if (strstr(m->part, "GET")) get = 1; else if (strstr(m->part, "PUT")) put = 1; else if (strstr(m->part, "DELETE")) del = 1; else if (strstr(m->part, "POST")) post = 1; if (strncmp(m->part, "SOAP", 4)) soap = 0; else if (strlen(m->part) > 6) version = m->part[6] - '0'; } else { if ((m->mess&MIMEIN) && !strcmp(m->part, "application/x-www-form-urlencoded")) mimein = 1; if ((m->mess&MIMEOUT) && !strcmp(m->part, "application/x-www-form-urlencoded")) mimeout = 1; } } } break; } } if (!get && !del && !mimein) fprintf(fd, "\tstruct %s soap_tmp_%s;", ident(method->sym->name), ident(method->sym->name)); else if (!get && !del && mimein) gen_query_send_form_init(fd, params); if (name) fprintf(fd, "\n\tif (soap_endpoint_url != NULL)\n\t\tsoap_endpoint = soap_endpoint_url;"); if (sp && sp->URL) fprintf(fd, "\n\tif (soap_endpoint == NULL)\n\t\tsoap_endpoint = \"%s\";", sp->URL); if (action) { fprintf(fd, "\n\tif (soap_action == NULL)\n\t\tsoap_action = "); if (*action == '"') fprintf(fd, "%s;", action); else fprintf(fd, "\"%s\";", action); } if (!method_response_encoding) method_response_encoding = method_encoding; if (!get && !del && !mimein) { for (param = params->list; param; param = param->next) { if (param->info.typ->type == Tarray) fprintf(fd, "\n\tsoap_memcpy(soap_tmp_%s.%s, sizeof(%s), %s, sizeof(%s));", ident(method->sym->name), ident(param->sym->name), c_type(param->info.typ), ident(param->sym->name), c_type(param->info.typ)); else fprintf(fd, "\n\tsoap_tmp_%s.%s = %s;", ident(method->sym->name), ident(param->sym->name), ident(param->sym->name)); } fprintf(fd, "\n\tsoap_begin(soap);"); if (!soap) fprintf(fd, "\n\tsoap_set_version(soap, 0); /* no SOAP */"); else if (version > 0) fprintf(fd, "\n\tsoap_set_version(soap, %d); /* use SOAP1.%d */", version, version); if (soap && sp && method_encoding) { if (is_literal(method_encoding)) fprintf(fd, "\n\tsoap->encodingStyle = NULL; /* use SOAP literal style */"); else if (method_encoding) fprintf(fd, "\n\tsoap->encodingStyle = \"%s\"; /* use SOAP encoding style */", method_encoding); } else if (!eflag) { fprintf(fd, "\n\tsoap->encodingStyle = NULL; /* use SOAP literal style */"); } if (soap) fprintf(fd, "\n\tsoap_serializeheader(soap);"); fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", ident(method->sym->name), ident(method->sym->name)); fprintf(fd, "\n\tif (soap_begin_count(soap))\n\t\treturn soap->error;"); fprintf(fd, "\n\tif ((soap->mode & SOAP_IO_LENGTH))"); fprintf(fd, "\n\t{\tif (soap_envelope_begin_out(soap)"); if (soap) { fprintf(fd, "\n\t\t || soap_putheader(soap)"); fprintf(fd, "\n\t\t || soap_body_begin_out(soap)"); } fprintf(fd, "\n\t\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", \"\")", ident(method->sym->name), ident(method->sym->name), ns_convert(method->sym->name)); if (soap) fprintf(fd, "\n\t\t || soap_body_end_out(soap)"); fprintf(fd, "\n\t\t || soap_envelope_end_out(soap))"); fprintf(fd, "\n\t\t\t return soap->error;"); fprintf(fd, "\n\t}"); fprintf(fd, "\n\tif (soap_end_count(soap))\n\t\treturn soap->error;"); if (soap) { fprintf(fd, "\n\tif (soap_connect(soap, soap_endpoint, soap_action)"); } else { if (put) fprintf(fd, "\n\tif (soap_PUT(soap, soap_extend_url(soap, soap_endpoint, soap_action), soap_action, \"text/xml\")"); else fprintf(fd, "\n\tif (soap_POST(soap, soap_extend_url(soap, soap_endpoint, soap_action), soap_action, \"text/xml\")"); } fprintf(fd, "\n\t || soap_envelope_begin_out(soap)"); if (soap) { fprintf(fd, "\n\t || soap_putheader(soap)"); fprintf(fd, "\n\t || soap_body_begin_out(soap)"); } fprintf(fd, "\n\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", \"\")", ident(method->sym->name), ident(method->sym->name), ns_convert(method->sym->name)); if (soap) fprintf(fd, "\n\t || soap_body_end_out(soap)"); fprintf(fd, "\n\t || soap_envelope_end_out(soap)"); fprintf(fd, "\n\t || soap_end_send(soap))"); fprintf(fd, "\n\t\treturn soap_closesock(soap);"); } else if (get) { if (params->list) { gen_query_url(fd, params, soap); fprintf(fd, "\n\tif (soap_GET(soap, soap->msgbuf, soap_action))"); } else if (soap) { fprintf(fd, "\n\tif (soap_GET(soap, soap_endpoint, soap_action))"); } else { fprintf(fd, "\n\tif (soap_GET(soap, soap_extend_url(soap, soap_endpoint, soap_action), soap_action))"); } fprintf(fd, "\n\t\treturn soap_closesock(soap);"); } else if (del) { if (params->list) { gen_query_url(fd, params, soap); fprintf(fd, "\n\tif (soap_DELETE(soap, soap->msgbuf, soap_action))"); } else if (soap) { fprintf(fd, "\n\tif (soap_DELETE(soap, soap_endpoint, soap_action))"); } else { fprintf(fd, "\n\tif (soap_DELETE(soap, soap_extend_url(soap, soap_endpoint, soap_action), soap_action))"); } fprintf(fd, "\n\t\treturn soap_closesock(soap);"); } else if (mimein) { if (put) fprintf(fd, "\n\tif (soap_PUT(soap, soap_extend_url(soap, soap_endpoint, soap_action), soap_action, \"application/x-www-form-urlencoded\"))"); else fprintf(fd, "\n\tif (soap_POST(soap, soap_extend_url(soap, soap_endpoint, soap_action), soap_action, \"application/x-www-form-urlencoded\"))"); fprintf(fd, "\n\t\treturn soap_closesock(soap);"); gen_query_send_form(fd, params); } fprintf(fd, "\n\treturn SOAP_OK;\n}"); if (is_transient(result->info.typ)) { if (name) { fprintf(fd, "\n\nint %s::recv_%s(", name, ns_cname(method->sym->name, NULL)); fprintf(fd, "struct %s& tmp)", ident(method->sym->name)); if (iflag) fprintf(fd, "\n{\n\tstruct soap *soap = this;"); else fprintf(fd, "\n{"); fprintf(fd, "\n\tstruct %s *%s = &tmp;", ident(method->sym->name), ident(result->sym->name)); } else { fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_recv_%s(struct soap *soap, ", ident(method->sym->name)); fprintf(fd, "struct %s *%s)\n{", ident(method->sym->name), ident(result->sym->name)); } fprintf(fd, "\n\tsoap_default_%s(soap, %s);", ident(method->sym->name), ident(result->sym->name)); fprintf(fd, "\n\tsoap_begin(soap);"); } else { if (name) { fprintf(fd, "\n\nint %s::recv_%s(", name, ns_cname(method->sym->name, NULL)); gen_params_ref(fd, NULL, result, 0); if (iflag) fprintf(fd, "\n{\n\tstruct soap *soap = this;"); else fprintf(fd, "\n{"); } else { fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_recv_%s(struct soap *soap", ident(method->sym->name)); gen_params_ref(fd, NULL, result, 1); fprintf(fd, "\n{"); } if (response && !mimeout) fprintf(fd, "\n\tstruct %s *soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); if (mimeout) { fprintf(fd, "\n\tchar *soap_tmp, *soap_tmp_key;"); gen_query_recv_form_init(fd, result); } if (result->info.typ->type == Tarray) fprintf(fd, "\n\tsoap_default_%s(soap, %s);", c_ident(result->info.typ), ident(result->sym->name)); else if (result->info.typ->type == Treference && ((Tnode*)result->info.typ->ref)->type == Tclass && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref)) fprintf(fd, "\n\t%s.soap_default(soap);", ident(result->sym->name)); else if (((Tnode*)result->info.typ->ref)->type == Tclass && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref)) fprintf(fd, "\n\tif (!%s)\n\t\treturn soap_closesock(soap);\n\t%s->soap_default(soap);", ident(result->sym->name), ident(result->sym->name)); else if (result->info.typ->type == Treference && ((Tnode*)result->info.typ->ref)->type == Tpointer) fprintf(fd, "\n\t%s = NULL;", ident(result->sym->name)); else if (((Tnode*)result->info.typ->ref)->type == Tpointer) fprintf(fd, "\n\tif (!%s)\n\t\treturn soap_closesock(soap);\n\t*%s = NULL;", ident(result->sym->name), ident(result->sym->name)); else if (result->info.typ->type == Treference) fprintf(fd, "\n\tsoap_default_%s(soap, &%s);", c_ident((Tnode*)result->info.typ->ref), ident(result->sym->name)); else if (!is_void(result->info.typ)) fprintf(fd, "\n\tif (!%s)\n\t\treturn soap_closesock(soap);\n\tsoap_default_%s(soap, %s);", ident(result->sym->name), c_ident((Tnode*)result->info.typ->ref), ident(result->sym->name)); } if (mimeout) { fprintf(fd, "\n\tif (soap_begin_recv(soap)\n\t || (soap_tmp = soap_http_get_form(soap)) == NULL\n\t || soap_end_recv(soap))"); fprintf(fd, "\n\t\treturn soap_closesock(soap);"); gen_query_recv_form(fd, result); fprintf(fd, "\n\treturn soap_closesock(soap);"); fprintf(fd , "\n}"); fflush(fd); return; } fprintf(fd, "\n\tif (soap_begin_recv(soap)"); fprintf(fd, "\n\t || soap_envelope_begin_in(soap)"); fprintf(fd, "\n\t || soap_recv_header(soap)"); fprintf(fd, "\n\t || soap_body_begin_in(soap))"); fprintf(fd, "\n\t\treturn soap_closesock(soap);"); if (is_transient(result->info.typ)) { if (sflag) fprintf(fd, "\n\tsoap->mode |= SOAP_XML_STRICT;"); fprintf(fd, "\n\tsoap_get_%s(soap, %s, \"%s\", NULL);", ident(method->sym->name), ident(result->sym->name), ns_convert(method->sym->name)); fprintf(fd, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap->level == 2)\n\t\tsoap->error = SOAP_OK;"); fprintf(fd, "\n\tif (soap->error"); fprintf(fd, "\n\t || soap_body_end_in(soap)"); fprintf(fd, "\n\t || soap_envelope_end_in(soap)"); fprintf(fd, "\n\t || soap_end_recv(soap))"); fprintf(fd, "\n\t\treturn soap_closesock(soap);"); fprintf(fd, "\n\treturn soap_closesock(soap);\n}"); fflush(fd); return; } /* With RPC encoded responses, try to parse the fault first */ if (soap && !is_literal(method_response_encoding)) { fprintf(fd, "\n\tif (soap_recv_fault(soap, 1))\n\t\treturn soap->error;"); xtag = ""; } else if (has_ns_eq(NULL, result->sym->name)) { if (response) xtag = xml_tag(response->info.typ); else xtag = ns_convert(result->sym->name); } else { if (response) xtag = xml_tag(response->info.typ); else xtag = xml_tag(result->info.typ); } if (sflag) fprintf(fd, "\n\tsoap->mode |= SOAP_XML_STRICT;"); if (response) { fprintf(fd, "\n\tsoap_tmp_%s = soap_get_%s(soap, NULL, \"%s\", NULL);", c_ident(response->info.typ), c_ident(response->info.typ), xtag); fprintf(fd, "\n\tif (!soap_tmp_%s || soap->error)\n\t\treturn soap_recv_fault(soap, 0);", c_ident(response->info.typ)); } else if ((result->info.typ->type == Treference || result->info.typ->type == Tpointer) && !is_invisible_empty((Tnode*)result->info.typ->ref)) { if (result->info.typ->type == Treference && ((Tnode *) result->info.typ->ref)->type == Tclass && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref) && !is_dynamic_array((Tnode*)result->info.typ->ref)) fprintf(fd, "\n\t%s.soap_get(soap, \"%s\", NULL);", ident(result->sym->name), xtag); else if (result->info.typ->type == Tpointer && ((Tnode *) result->info.typ->ref)->type == Tclass && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref) && !is_dynamic_array((Tnode*)result->info.typ->ref)) fprintf(fd, "\n\t%s->soap_get(soap, \"%s\", NULL);", ident(result->sym->name), xtag); else if (result->info.typ->type == Treference && ((Tnode *) result->info.typ->ref)->type == Tstruct && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref) && !is_dynamic_array((Tnode*)result->info.typ->ref)) { fprintf(fd, "\n\tsoap_get_%s(soap, &%s, \"%s\", NULL);", c_ident((Tnode*)result->info.typ->ref), ident(result->sym->name), xtag); } else if (result->info.typ->type == Tpointer && ((Tnode *) result->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)result->info.typ->ref)) { fprintf(fd, "\n\tsoap_get_%s(soap, %s, \"%s\", NULL);", c_ident((Tnode*)result->info.typ->ref), ident(result->sym->name), xtag); } else if (result->info.typ->type == Tpointer && is_XML((Tnode*)result->info.typ->ref) && is_string((Tnode*)result->info.typ->ref)) { fprintf(fd, "\n\tsoap_inliteral(soap, NULL, (char**)%s);", ident(result->sym->name)); } else if (result->info.typ->type == Treference && is_XML((Tnode*)result->info.typ->ref) && is_string((Tnode*)result->info.typ->ref)) { fprintf(fd, "\n\tsoap_inliteral(soap, NULL, (char**)&%s);", ident(result->sym->name)); } else if (result->info.typ->type == Tpointer && is_XML((Tnode*)result->info.typ->ref) && is_wstring((Tnode*)result->info.typ->ref)) { fprintf(fd, "\n\tsoap_inwliteral(soap, NULL, (wchar_t**)%s);", ident(result->sym->name)); } else if (result->info.typ->type == Treference && is_XML((Tnode*)result->info.typ->ref) && is_wstring((Tnode*)result->info.typ->ref)) { fprintf(fd, "\n\tsoap_inwliteral(soap, NULL, (wchar_t**)&%s);", ident(result->sym->name)); } else if (result->info.typ->type == Treference) { fprintf(fd, "\n\tsoap_get_%s(soap, &%s, \"%s\", NULL);", c_ident(result->info.typ), ident(result->sym->name), xtag); } else { fprintf(fd, "\n\tsoap_get_%s(soap, %s, \"%s\", NULL);", c_ident(result->info.typ), ident(result->sym->name), xtag); } fprintf(fd, "\n\tif (soap->error)\n\t\treturn soap_recv_fault(soap, 0);"); } else if (soap && is_literal(method_response_encoding)) { fprintf(fd, "\n\tif (soap_recv_fault(soap, 1))\n\t\treturn soap->error;"); } fflush(fd); fprintf(fd, "\n\tif (soap_body_end_in(soap)"); fprintf(fd, "\n\t || soap_envelope_end_in(soap)"); fprintf(fd, "\n\t || soap_end_recv(soap))"); fprintf(fd, "\n\t\treturn soap_closesock(soap);"); if (response) { if (result->info.typ->type == Tarray) fprintf(fd, "\n\tsoap_memcpy(%s, sizeof(%s), soap_tmp_%s->%s, sizeof(%s));", ident(result->sym->name), c_ident(response->info.typ), c_type(result->info.typ), ident(result->sym->name), c_type(result->info.typ)); else if (result->info.typ->type == Treference) fprintf(fd, "\n\t%s = soap_tmp_%s->%s;", ident(result->sym->name), c_ident(response->info.typ), ident(result->sym->name)); else { fprintf(fd, "\n\tif (%s && soap_tmp_%s->%s)", ident(result->sym->name), c_ident(response->info.typ), ident(result->sym->name)); fprintf(fd, "\n\t\t*%s = *soap_tmp_%s->%s;", ident(result->sym->name), c_ident(response->info.typ), ident(result->sym->name)); } } fprintf(fd, "\n\treturn soap_closesock(soap);"); fprintf(fd , "\n}"); fflush(fd); } void gen_serve_method(FILE *fd, Table *table, Entry *param, const char *name) { Service *sp = NULL; const char *encoding; Entry *result, *p, *q, *pin, *pout, *response = NULL; Table *input; const char *xtag; Method *m; const char *method_encoding = NULL, *method_response_encoding = NULL; result = (Entry*)param->info.typ->ref; p = entry(classtable, param->sym); if (!p) execerror("no table entry"); if (!is_response(result->info.typ) && !is_XML(result->info.typ)) response = get_response(param->info.typ); q = entry(table, param->sym); if (!q) execerror("no table entry"); pout = (Entry*)q->info.typ->ref; if (!pout) execerror("no table entry"); if (name) { if (iflag) fprintf(fd, "\n\nstatic int serve_%s(%s *soap)\n{", ident(param->sym->name), name); else fprintf(fd, "\n\nstatic int serve_%s(struct soap *soap, %s *service)\n{", ident(param->sym->name), name); } else { fprintf(fheader, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_serve_%s(struct soap*);", ident(param->sym->name)); fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_serve_%s(struct soap *soap)\n{", ident(param->sym->name)); } fprintf(fd, "\tstruct %s soap_tmp_%s;", ident(param->sym->name), ident(param->sym->name)); for (sp = services; sp; sp = sp->next) { if (has_ns_eq(sp->ns, param->sym->name)) { encoding = sp->encoding; method_encoding = encoding; method_response_encoding = NULL; for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, param->sym->name)) { if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; } } break; } } if (!method_response_encoding) method_response_encoding = method_encoding; fflush(fd); if (!is_transient(pout->info.typ)) { if (pout->info.typ->type == Tarray && response) { fprintf(fd, "\n\tstruct %s soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); fprintf(fd, "\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); } else if (pout->info.typ->type == Tpointer && !is_stdstring(pout->info.typ) && !is_stdwstring(pout->info.typ) && response) { fprintf(fd, "\n\tstruct %s soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); fprintf(fd, "\n\t%s soap_tmp_%s;", c_type((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); fprintf(fd, "\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); if (((Tnode*)pout->info.typ->ref)->type == Tclass && !is_external((Tnode*)pout->info.typ->ref) && !is_volatile((Tnode*)pout->info.typ->ref) && !is_typedef((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\tsoap_tmp_%s.soap_default(soap);", c_ident((Tnode*)pout->info.typ->ref)); else if (((Tnode*)pout->info.typ->ref)->type == Tpointer) fprintf(fd, "\n\tsoap_tmp_%s = NULL;", c_ident((Tnode*)pout->info.typ->ref)); else fprintf(fd, "\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); fprintf(fd, "\n\tsoap_tmp_%s.%s = &soap_tmp_%s;", c_ident(response->info.typ), ident(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); } else if (response) { fprintf(fd, "\n\tstruct %s soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); fprintf(fd, "\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); } else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && (is_external((Tnode*)pout->info.typ->ref) || is_volatile((Tnode*)pout->info.typ->ref) || is_typedef((Tnode*)pout->info.typ->ref)) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) { fprintf(fd, "\n\t%s %s;", c_type((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); fprintf(fd, "\n\tsoap_default_%s(soap, &%s);", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); } else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) { fprintf(fd, "\n\t%s %s;", c_type((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); fprintf(fd, "\n\t%s.soap_default(soap);", ident(pout->sym->name)); } else if (((Tnode *)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref)) { fprintf(fd, "\n\t%s %s;", c_type((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); fprintf(fd, "\n\tsoap_default_%s(soap, &%s);", c_ident((Tnode *)pout->info.typ->ref), ident(pout->sym->name)); } else { fprintf(fd, "\n\t%s soap_tmp_%s;", c_type((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); if (is_string((Tnode*)pout->info.typ->ref) || is_wstring((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\tsoap_tmp_%s = NULL;", c_ident((Tnode*)pout->info.typ->ref)); else fprintf(fd, "\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); } } fprintf(fd, "\n\tsoap_default_%s(soap, &soap_tmp_%s);", ident(param->sym->name), ident(param->sym->name)); fflush(fd); q = entry(classtable, param->sym); if (!is_invisible_empty(q->info.typ)) { fprintf(fd, "\n\tif (!soap_get_%s(soap, &soap_tmp_%s, \"%s\", NULL))", ident(param->sym->name), ident(param->sym->name), ns_convert(param->sym->name)); fprintf(fd, "\n\t\treturn soap->error;"); } fprintf(fd, "\n\tif (soap_body_end_in(soap)"); fprintf(fd, "\n\t || soap_envelope_end_in(soap)"); fprintf(fd, "\n\t || soap_end_recv(soap))\n\t\treturn soap->error;"); if (name) { if (iflag) fprintf(fd, "\n\tsoap->error = soap->%s(", ns_cname(param->sym->name, NULL)); else fprintf(fd, "\n\tsoap->error = service->%s(", ns_cname(param->sym->name, NULL)); } else fprintf(fd, "\n\tsoap->error = %s(soap", ident(param->sym->name)); fflush(fd); input = (Table*) q->info.typ->ref; if (!input) execerror("no table entry"); for (pin = input->list; pin; pin = pin->next) { if (pin->info.typ->type == Trvalueref) fprintf(fd, "%sstd::move(soap_tmp_%s.%s)", !name || pin != input->list ? ", " : "", ident(param->sym->name), ident(pin->sym->name)); else fprintf(fd, "%ssoap_tmp_%s.%s", !name || pin != input->list ? ", " : "", ident(param->sym->name), ident(pin->sym->name)); } if (is_transient(pout->info.typ)) fprintf(fd, ");"); else { if (!name || input->list) fprintf(fd, ", "); if (response) fprintf(fd, "soap_tmp_%s.%s);", c_ident(response->info.typ), ident(pout->sym->name)); else if (pout->info.typ->type == Treference && (((Tnode*)pout->info.typ->ref)->type == Tstruct || ((Tnode*)pout->info.typ->ref)->type == Tclass) && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "%s);", ident(pout->sym->name)); else if ((((Tnode*)pout->info.typ->ref)->type == Tstruct || ((Tnode*)pout->info.typ->ref)->type == Tclass) && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "&%s);", ident(pout->sym->name)); else if (pout->info.typ->type == Treference) fprintf(fd, "soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref)); else fprintf(fd, "&soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref)); } fprintf(fd, "\n\tif (soap->error)\n\t\treturn soap->error;"); if (!is_transient(pout->info.typ)) { if (sp && method_response_encoding) { if (is_literal(method_response_encoding)) fprintf(fd, "\n\tsoap->encodingStyle = NULL; /* use SOAP literal style */"); else if (sp->encoding) fprintf(fd, "\n\tsoap->encodingStyle = \"%s\"; /* use SOAP encoding style */", sp->encoding); else if (method_response_encoding) fprintf(fd, "\n\tsoap->encodingStyle = \"%s\"; /* use SOAP encoding style */", method_response_encoding); else if (!eflag) fprintf(fd, "\n\tsoap->encodingStyle = NULL; /* use SOAP literal style */"); } else if (!eflag) { fprintf(fd, "\n\tsoap->encodingStyle = NULL; /* use SOAP literal style */"); } fprintf(fd, "\n\tsoap_serializeheader(soap);"); if (pout->info.typ->type == Tarray && response) fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); else if (response) fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && (is_external((Tnode*)pout->info.typ->ref) || is_volatile((Tnode*)pout->info.typ->ref) || is_typedef((Tnode*)pout->info.typ->ref)) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\tsoap_serialize_%s(soap, &%s);", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t%s.soap_serialize(soap);", ident(pout->sym->name)); else if (((Tnode *)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\tsoap_serialize_%s(soap, &%s);", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); else if (!is_XML((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); if (is_literal(method_response_encoding) && has_ns_eq(NULL, pout->sym->name)) xtag = ns_convert(pout->sym->name); else xtag = xml_tag(pout->info.typ); fprintf(fd, "\n\tif (soap_begin_count(soap))\n\t\treturn soap->error;"); fprintf(fd, "\n\tif ((soap->mode & SOAP_IO_LENGTH))"); fprintf(fd, "\n\t{\tif (soap_envelope_begin_out(soap)"); fprintf(fd, "\n\t\t || soap_putheader(soap)"); fprintf(fd, "\n\t\t || soap_body_begin_out(soap)"); if (response) fprintf(fd, "\n\t\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", \"\")", c_ident(response->info.typ), c_ident(response->info.typ), xml_tag(response->info.typ)); else if (((Tnode*)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && (is_external((Tnode*)pout->info.typ->ref) || is_volatile((Tnode*)pout->info.typ->ref) || is_typedef((Tnode*)pout->info.typ->ref)) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t\t || soap_put_%s(soap, &%s, \"%s\", \"\")", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name), ns_convert(pout->sym->name)); else if (((Tnode*)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t\t || %s.soap_put(soap, \"%s\", \"\")", ident(pout->sym->name), xtag); else if (((Tnode*)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t\t || soap_put_%s(soap, &%s, \"%s\", \"\")", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name), xtag); else if (is_XML((Tnode*)pout->info.typ->ref) && is_string((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t\t || soap_outliteral(soap, \"%s\", &soap_tmp_%s, NULL)", ns_convert(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); else if (is_XML((Tnode*)pout->info.typ->ref) && is_wstring((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t\t || soap_outwliteral(soap, \"%s\", &soap_tmp_%s, NULL)", ns_convert(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); else fprintf(fd, "\n\t\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", \"\")", c_ident(pout->info.typ), c_ident((Tnode*)pout->info.typ->ref), ns_convert(pout->sym->name)); fprintf(fd, "\n\t\t || soap_body_end_out(soap)"); fprintf(fd, "\n\t\t || soap_envelope_end_out(soap))"); fprintf(fd, "\n\t\t\t return soap->error;"); fprintf(fd, "\n\t};"); fprintf(fd, "\n\tif (soap_end_count(soap)"); fprintf(fd, "\n\t || soap_response(soap, SOAP_OK)"); fprintf(fd, "\n\t || soap_envelope_begin_out(soap)"); fprintf(fd, "\n\t || soap_putheader(soap)"); fprintf(fd, "\n\t || soap_body_begin_out(soap)"); if (response) fprintf(fd, "\n\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", \"\")", c_ident(response->info.typ), c_ident(response->info.typ), xml_tag(response->info.typ)); else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && (is_external((Tnode*)pout->info.typ->ref) || is_volatile((Tnode*)pout->info.typ->ref) || is_typedef((Tnode*)pout->info.typ->ref)) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t || soap_put_%s(soap, &%s, \"%s\", \"\")", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name), ns_convert(pout->sym->name)); else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t || %s.soap_put(soap, \"%s\", \"\")", ident(pout->sym->name), xtag); else if (((Tnode *)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t || soap_put_%s(soap, &%s, \"%s\", \"\")", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name), xtag); else if (is_XML((Tnode*)pout->info.typ->ref) && is_string((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t || soap_outliteral(soap, \"%s\", &soap_tmp_%s, NULL)", ns_convert(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); else if (is_XML((Tnode*)pout->info.typ->ref) && is_wstring((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t || soap_outwliteral(soap, \"%s\", &soap_tmp_%s, NULL)", ns_convert(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); else fprintf(fd, "\n\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", \"\")", c_ident(pout->info.typ), c_ident((Tnode*)pout->info.typ->ref), ns_convert(pout->sym->name)); fprintf(fd, "\n\t || soap_body_end_out(soap)"); fprintf(fd, "\n\t || soap_envelope_end_out(soap)"); fprintf(fd, "\n\t || soap_end_send(soap))"); fprintf(fd, "\n\t\treturn soap->error;"); } fprintf(fd, "\n\treturn soap_closesock(soap);"); fprintf(fd, "\n}"); fflush(fd); } void gen_response_begin(FILE *fd, int n, const char *s, int soap) { if (!is_invisible(s)) { fprintf(fd, "%*s<%sResponse", n, "", s); if (!soap || soap_version < 0) gen_xmlns(fd, 0); fprintf(fd, ">\n"); } } void gen_response_end(FILE *fd, int n, const char *s) { if (!is_invisible(s)) fprintf(fd, "%*s\n", n, "", s); } void gen_element_begin(FILE *fd, int n, const char *s, Entry *p) { if (!is_invisible(s)) { fprintf(fd, "%*s<%s", n, "", s); if (p) { const char *x = xsi_type_u(p->info.typ); if (x && *x) fprintf(fd, " xsi:type=\"%s\"", x); } if (soap_version >= 0 && p && (p->info.sto & SmustUnderstand)) fprintf(fd, " SOAP-ENV:mustUnderstand=\"%s\"", soap_version == 2 ? "true" : "1"); } } void gen_element_array(FILE *fd, int n, const char *s) { if (!is_invisible(s)) { fprintf(fd, "%*s<%s", n, "", s); if (tflag) fprintf(fd, " xsi:type=\"SOAP-ENC:Array\""); } } void gen_element_end(FILE *fd, int n, const char *s) { if (!is_invisible(s)) fprintf(fd, "%*s\n", n, "", s); } void gen_data(const char *buf, Table *t, const char *ns, const char *encoding) { Entry *p, *q, *r; FILE *fd; const char *method_encoding = NULL; const char *method_response_encoding = NULL; if (t) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) { int get = 0, put = 0, soap = 1, mimein = 0, mimeout = 0; Service *sp; Method *m; const char *nse = ns_qualifiedElement(p->info.typ); const char *nsa = ns_qualifiedAttribute(p->info.typ); method_encoding = encoding; method_response_encoding = NULL; for (sp = services; sp; sp = sp->next) { if (!tagcmp(sp->ns, ns)) { for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name)) { if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; else if (m->mess == PROTOCOL) { if (strncmp(m->part, "SOAP", 4)) soap = 0; if (strstr(m->part, "GET")) get = 1; else if (strstr(m->part, "PUT")) put = 1; } else { if ((m->mess&MIMEIN) && !strcmp(m->part, "application/x-www-form-urlencoded")) mimein = 1; if ((m->mess&MIMEOUT) && !strcmp(m->part, "application/x-www-form-urlencoded")) mimeout = 1; } } } } } if (!method_response_encoding) method_response_encoding = method_encoding; /* request */ if (!get && !mimein) { fd = gen_env(buf, ns_remove(p->sym->name), 0, method_encoding, soap); if (!fd) return; q = entry(classtable, p->sym); if (yflag) { fprintf(fd, "%*s\n"); } if (!is_invisible(p->sym->name)) { gen_element_begin(fd, 2, ns_convert(p->sym->name), NULL); if (!soap || soap_version < 0) gen_xmlns(fd, 0); } if (q) { int xmlns = 0; if (!is_invisible(p->sym->name)) { gen_atts(fd, (Table*)q->info.typ->ref, nse, nsa, encoding); fprintf(fd, "\n"); } else if (!soap || soap_version < 0) xmlns = 1; for (q = ((Table*)q->info.typ->ref)->list; q; q = q->next) gen_field(fd, 3, q, nse, nsa, method_encoding, q->info.minOccurs == 0, xmlns); } if (!is_invisible(p->sym->name)) gen_element_end(fd, 2, ns_convert(p->sym->name)); if (soap && soap_version >= 0) fprintf(fd, " \n\n"); fclose(fd); } /* response */ q = (Entry*)p->info.typ->ref; if (!put && !mimeout && q && !is_transient(q->info.typ)) { fd = gen_env(buf, ns_remove(p->sym->name), 1, method_response_encoding, soap); if (!fd) return; if (!is_response(q->info.typ)) { if (is_XML((Tnode*)q->info.typ->ref)) { gen_response_begin(fd, 2, ns_convert(p->sym->name), soap); gen_response_end(fd, 2, ns_convert(p->sym->name)); } else { gen_response_begin(fd, 2, ns_convert(p->sym->name), soap); gen_field(fd, 3, q, nse, nsa, method_response_encoding, q->info.minOccurs == 0, 0); gen_response_end(fd, 2, ns_convert(p->sym->name)); } } else if (q->info.typ->ref && ((Tnode*)q->info.typ->ref)->ref) { const char *xtag; nse = ns_qualifiedElement((Tnode*)q->info.typ->ref); nsa = ns_qualifiedAttribute((Tnode*)q->info.typ->ref); if (is_literal(method_response_encoding) && has_ns_eq(NULL, q->sym->name)) xtag = ns_convert(q->sym->name); else xtag = xml_tag(q->info.typ); if (yflag) fprintf(fd, "%*s\n", 2, "", ident(p->sym->name), c_type_id(q->info.typ, q->sym->name)); if (!is_invisible(xtag)) { gen_element_begin(fd, 2, xtag, NULL); if (!soap || soap_version < 0) gen_xmlns(fd, 0); gen_atts(fd, (Table*)((Tnode*)q->info.typ->ref)->ref, nse, nsa, encoding); fprintf(fd, "\n"); } for (r = ((Table*)((Tnode*)q->info.typ->ref)->ref)->list; r; r = r->next) gen_field(fd, 3, r, nse, nsa, method_response_encoding, q->info.minOccurs == 0, 0); if (!is_invisible(xtag)) gen_element_end(fd, 2, ns_addx(xtag, nse)); } fflush(fd); if (soap && soap_version >= 0) fprintf(fd, " \n\n"); fclose(fd); } } } } } void gen_field(FILE *fd, int n, Entry *p, const char *nse, const char *nsa, const char *encoding, int opt, int xmlns) { Entry *q; char tmp[32]; LONG64 i; int d; if (!(p->info.sto & (Sattribute | Sconst | Sprivate | Sprotected | Sspecial)) && !is_transient(p->info.typ) && p->info.typ->type != Tfun && strncmp(p->sym->name, "__size", 6) && strncmp(p->sym->name, "__type", 6) && !is_choice(p)) { if (n > 8 && (p->info.typ->type == Tpointer || is_smart(p->info.typ)) && p->info.nillable && !is_string(p->info.typ) && !is_wstring(p->info.typ)) { gen_element_begin(fd, n, ns_add(p, nse), NULL); if (xmlns) gen_xmlns(fd, 0); fprintf(fd, " xsi:nil=\"true\"/>\n"); return; } if (n > 8 && opt && !is_string(p->info.typ) && !is_wstring(p->info.typ)) return; if (n >= 16) { fprintf(fd, "%*s\n", n, ""); return; } if (yflag) fprintf(fd, "%*s\n", n, "", c_type_id(p->info.typ, p->sym->name)); if (is_container(p->info.typ)) { if (gflag) { fprintf(fd, "%*s<__REPEAT min=\"" SOAP_LONG_FORMAT "\"", n, "", p->info.minOccurs); if (p->info.maxOccurs > 1) fprintf(fd, " max=\"" SOAP_LONG_FORMAT "\"", p->info.maxOccurs); else fprintf(fd, " max=\"unbounded\""); fprintf(fd, ">\n"); } else if (yflag) { fprintf(fd, "%*s\n"); } opt = 0; } if (is_soap12(encoding) && (p->info.sto & Sreturn) && (nse || has_ns_eq(NULL, p->sym->name)) && !is_literal(encoding)) fprintf(fd, "%*s%s\n", n, "", rpcURI, ns_add(p, nse)); if (is_XML(p->info.typ)) { if (!is_invisible(p->sym->name)) { gen_element_begin(fd, n, ns_add(p, nse), NULL); if (xmlns) gen_xmlns(fd, 0); fprintf(fd, ">"); gen_element_end(fd, n, ns_add(p, nse)); } else { fprintf(fd, "%*s\n", n, ""); } } else { if (is_fixedstring(p->info.typ)) { gen_element_begin(fd, n, ns_add(p, nse), p); if (xmlns) gen_xmlns(fd, 0); fprintf(fd, ">"); fflush(fd); if ((p->info.hasval || p->info.ptrval) && p->info.val.s) fprintf(fd, "%s", xstring(p->info.val.s)); else gen_val(fd, n, p->info.typ, nse, nsa, encoding, opt); } else if (p->info.typ->type == Tarray) { i = ((Tnode*) p->info.typ->ref)->width; if (i) { i = p->info.typ->width / i; if (i > 100000) /* SOAP_MAXOCCURS */ i = 100000; } gen_element_array(fd, n, ns_add(p, nse)); if (is_soap12(encoding)) fprintf(fd, " SOAP-ENC:itemType=\"%s\" SOAP-ENC:arraySize=\"" SOAP_LONG_FORMAT "\"", xsi_type_Tarray(p->info.typ), i); else if (!is_literal(encoding)) fprintf(fd, " SOAP-ENC:arrayType=\"%s[" SOAP_LONG_FORMAT "]\"", xsi_type_Tarray(p->info.typ), i); fprintf(fd, ">"); fflush(fd); gen_val(fd, n, p->info.typ, nse, nsa, encoding, opt); } else if (is_binary(p->info.typ)) { gen_element_begin(fd, n, ns_add(p, nse), p); if (xmlns) gen_xmlns(fd, 0); fprintf(fd, ">"); fflush(fd); if ((p->info.hasval || p->info.ptrval) && p->info.val.s) fprintf(fd, "%s", xstring(p->info.val.s)); else gen_val(fd, n, p->info.typ, nse, nsa, encoding, opt); } else if ((q = is_dynamic_array(p->info.typ))) { if (!eflag && (has_ns(p->info.typ) || is_untyped(p->info.typ))) { gen_element_begin(fd, n, ns_add(p, nse), p); if (xmlns) gen_xmlns(fd, 0); gen_atts(fd, (Table*)p->info.typ->ref, nse, nsa, encoding); fprintf(fd, "\n"); gen_val(fd, n, p->info.typ, nse, nsa, encoding, 0); if (!is_invisible(p->sym->name)) fprintf(fd, "%*s", n, ""); } else { d = get_Darraydims(p->info.typ); if (d) { for (i = 0; i < d-1; i++) { if (is_soap12(encoding)) tmp[2*i] = ' '; else tmp[2*i] = ','; tmp[2*i+1] = '1'; } tmp[2*d-2] = '\0'; } else *tmp = '\0'; gen_element_array(fd, n, ns_add(p, nse)); i = q->info.minOccurs < 100000 ? q->info.minOccurs : 100000; if (i < 1) i = 1; if (is_soap12(encoding)) fprintf(fd, " SOAP-ENC:itemType=\"%s\" SOAP-ENC:arraySize=\"" SOAP_LONG_FORMAT "%s\"", wsdl_type(q->info.typ, ""), i, tmp); else if (!is_literal(encoding)) fprintf(fd, " SOAP-ENC:arrayType=\"%s[" SOAP_LONG_FORMAT "%s]\"", wsdl_type(q->info.typ, ""), i, tmp); fprintf(fd, ">\n"); gen_val(fd, n, p->info.typ, nse, nsa, encoding, q->info.minOccurs == 0); fprintf(fd, "%*s", n, ""); } fflush(fd); } else if ((p->info.typ->type == Tpointer || is_smart(p->info.typ) || p->info.typ->type == Treference || p->info.typ->type == Trvalueref) && (q = is_dynamic_array((Tnode*)p->info.typ->ref)) && !is_binary((Tnode*)p->info.typ->ref)) { if (!eflag && (has_ns((Tnode*)p->info.typ->ref) || is_untyped((Tnode*)p->info.typ->ref))) { gen_element_begin(fd, n, ns_add(p, nse), p); if (xmlns) gen_xmlns(fd, 0); gen_atts(fd, (Table*)((Tnode*)p->info.typ->ref)->ref, nse, nsa, encoding); fprintf(fd, "\n"); gen_val(fd, n, (Tnode*)p->info.typ->ref, nse, nsa, encoding, 0); if (!is_invisible(p->sym->name)) fprintf(fd, "%*s", n, ""); } else { d = get_Darraydims((Tnode*)p->info.typ->ref); if (d) { for (i = 0; i < d-1; i++) { tmp[2*i] = ','; tmp[2*i+1] = '1'; } tmp[2*d-2] = '\0'; } else *tmp = '\0'; gen_element_array(fd, n, ns_add(p, nse)); i = q->info.minOccurs < 100000 ? q->info.minOccurs : 100000; if (i < 1) i = 1; if (is_soap12(encoding)) fprintf(fd, " SOAP-ENC:itemType=\"%s\" SOAP-ENC:arraySize=\"" SOAP_LONG_FORMAT "%s\"", wsdl_type(((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.typ, ""), i, tmp); else if (!is_literal(encoding)) fprintf(fd, " SOAP-ENC:arrayType=\"%s[" SOAP_LONG_FORMAT "%s]\"", wsdl_type(((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.typ, ""), i, tmp); fprintf(fd, ">\n"); gen_val(fd, n, (Tnode*)p->info.typ->ref, nse, nsa, encoding, q->info.minOccurs == 0); fprintf(fd, "%*s", n, ""); } } else if (p->info.typ->type == Tstruct || p->info.typ->type == Tclass) { if (!is_invisible(p->sym->name)) { gen_element_begin(fd, n, ns_add(p, nse), p); if (xmlns) gen_xmlns(fd, 0); gen_atts(fd, (Table*)p->info.typ->ref, nse, nsa, encoding); } else if (is_anyType(p->info.typ)) fprintf(fd, "%*s\n", n, ""); } else if ((p->info.typ->type == Tpointer || is_smart(p->info.typ) || p->info.typ->type == Treference || p->info.typ->type == Trvalueref) && (((Tnode*)p->info.typ->ref)->type == Tstruct || ((Tnode*)p->info.typ->ref)->type == Tclass)) { if (!is_invisible(p->sym->name)) { gen_element_begin(fd, n, ns_add(p, nse), p); if (xmlns) gen_xmlns(fd, 0); gen_atts(fd, (Table*)((Tnode*)p->info.typ->ref)->ref, nse, nsa, encoding); } else if (is_anyType(p->info.typ)) fprintf(fd, "%*s\n", n, ""); } else if (p->info.typ->type != Tunion) { if (!is_invisible(p->sym->name)) { Tnode *ref = p->info.typ; gen_element_begin(fd, n, ns_add(p, nse), p); if (xmlns) gen_xmlns(fd, 0); if (p->info.typ->type == Tpointer || is_smart(p->info.typ) || p->info.typ->type == Treference || is_smart(p->info.typ)) ref = p->info.typ->ref; if (ref->type == Ttemplate) { if ((((Tnode*)ref->ref)->type == Tpointer || is_smart((Tnode*)ref->ref)) && (((Tnode*)((Tnode*)ref->ref)->ref)->type == Tclass || ((Tnode*)((Tnode*)ref->ref)->ref)->type == Tstruct)) gen_atts(fd, (Table*)((Tnode*)((Tnode*)ref->ref)->ref)->ref, nse, nsa, encoding); else if (((Tnode*)ref->ref)->type == Tclass || ((Tnode*)ref->ref)->type == Tstruct) gen_atts(fd, (Table*)((Tnode*)ref->ref)->ref, nse, nsa, encoding); else fprintf(fd, ">"); } else fprintf(fd, ">"); } } if (p->info.typ->sym && has_ns_eq("xsd", p->info.typ->sym->name)) { gen_val(fd, n+1, p->info.typ, nse, nsa, encoding, opt); } else { switch (p->info.typ->type) { case Tchar: case Tshort: case Tint: case Tlong: case Tllong: case Tuchar: case Tushort: case Tuint: case Tulong: case Tullong: if (p->info.hasval || p->info.ptrval) fprintf(fd, SOAP_LONG_FORMAT, p->info.val.i); else gen_val(fd, n+1, p->info.typ, nse, nsa, encoding, opt); break; case Tfloat: case Tdouble: case Tldouble: if (p->info.hasval || p->info.ptrval) fprintf(fd, "%.16lG", p->info.val.r); else gen_val(fd, n+1, p->info.typ, nse, nsa, encoding, opt); break; case Ttime: gen_val(fd, n+1, p->info.typ, nse, nsa, encoding, opt); break; case Tenum: case Tenumsc: if ((p->info.hasval || p->info.ptrval) && p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (p->info.val.i == q->info.val.i) { fprintf(fd, "%s", ns_remove2(q->sym->name, c_ident(p->info.typ))); break; } } } else { gen_val(fd, n+1, p->info.typ, nse, nsa, encoding, opt); } break; case Tpointer: case Treference: case Trvalueref: if (is_string(p->info.typ) || is_wstring(p->info.typ)) { if ((p->info.hasval || p->info.ptrval) && p->info.val.s) fprintf(fd, "%s", xstring(p->info.val.s)); else gen_val(fd, n, p->info.typ, nse, nsa, encoding, opt); } else if (!is_dynamic_array(p->info.typ->ref)) { Tnode *ref= p->info.typ->ref; if (p->info.hasval || p->info.ptrval) { switch (ref->type) { case Tchar: case Tshort: case Tint: case Tlong: case Tllong: case Tuchar: case Tushort: case Tuint: case Tulong: case Tullong: fprintf(fd, SOAP_LONG_FORMAT, p->info.val.i); break; case Tfloat: case Tdouble: case Tldouble: fprintf(fd, "%.16lG", p->info.val.r); break; case Tenum: case Tenumsc: if (ref->ref) { for (q = ((Table*)ref->ref)->list; q; q = q->next) { if (p->info.val.i == q->info.val.i) { fprintf(fd, "%s", ns_remove2(q->sym->name, c_ident(ref))); break; } } } else { gen_val(fd, n, ref, nse, nsa, encoding, opt); } break; default: gen_val(fd, n, ref, nse, nsa, encoding, opt); break; } } else { gen_val(fd, n, ref, nse, nsa, encoding, opt); } } break; case Tclass: if (is_stdstr(p->info.typ)) { if ((p->info.hasval || p->info.ptrval) && p->info.val.s) fprintf(fd, "%s", xstring(p->info.val.s)); else gen_val(fd, n, p->info.typ, nse, nsa, encoding, opt); } else if (!is_dynamic_array(p->info.typ)) gen_val(fd, n, p->info.typ, nse, nsa, encoding, opt); break; case Tstruct: if (!is_dynamic_array(p->info.typ)) gen_val(fd, n, p->info.typ, nse, nsa, encoding, opt); break; case Tunion: gen_val(fd, n, p->info.typ, nse, nsa, encoding, opt); break; case Ttemplate: if (gflag) { gen_val(fd, n, p->info.typ, nse, nsa, encoding, opt); } else if (!is_dynamic_array(p->info.typ->ref)) { if (is_smart(p->info.typ)) { i = 1; } else { i = p->info.minOccurs < 100000 ? p->info.minOccurs : 100000; if (i == 0) i = 1; } do { /* a bit of a hack, with a copy of the code above */ { gen_val(fd, n, p->info.typ, nse, nsa, encoding, opt); if (i > 1) { gen_element_end(fd, 0, ns_add(p, nse)); if (!is_invisible(p->sym->name)) { gen_element_begin(fd, n, ns_add(p, nse), p); if (p->info.typ->type == Ttemplate) { if ((((Tnode*)p->info.typ->ref)->type == Tpointer || is_smart((Tnode*)p->info.typ->ref)) && (((Tnode*)((Tnode*)p->info.typ->ref)->ref)->type == Tclass || ((Tnode*)((Tnode*)p->info.typ->ref)->ref)->type == Tstruct)) gen_atts(fd, (Table*)((Tnode*)((Tnode*)p->info.typ->ref)->ref)->ref, nse, nsa, encoding); else if (((Tnode*)p->info.typ->ref)->type == Tclass || ((Tnode*)p->info.typ->ref)->type == Tstruct) gen_atts(fd, (Table*)((Tnode*)p->info.typ->ref)->ref, nse, nsa, encoding); else fprintf(fd, ">"); } else fprintf(fd, ">"); } } fflush(fd); } } while (--i); } break; default: break; } } if (p->info.typ->type != Tunion) { if (!is_invisible(p->sym->name)) gen_element_end(fd, 0, ns_add(p, nse)); else fprintf(fd, "\n"); } if (gflag && is_container(p->info.typ)) fprintf(fd, "%*s\n", n, ""); fflush(fd); } } } void gen_atts(FILE *fd, Table *t, const char *nse, const char *nsa, const char *encoding) { Entry *q, *r; Tnode *p; while (t) { for (q = t->list; q; q = q->next) { if (q->info.sto & Sattribute && !is_invisible(q->sym->name) && q->info.maxOccurs != 0) { fprintf(fd, " %s=\"", ns_add(q, nsa)); if ((q->info.typ->type == Tpointer || is_smart(q->info.typ) || q->info.typ->type == Treference || q->info.typ->type == Trvalueref || q->info.typ->type == Ttemplate) && !is_string(q->info.typ) && !is_wstring(q->info.typ)) p = (Tnode*)q->info.typ->ref; else p = q->info.typ; if (!gflag && is_eq(q->sym->name, "id")) fprintf(fd, "_%lu", ++idnum); /* id="#" should be unique */ else if (!q->info.hasval && !q->info.ptrval && p->sym && has_ns_eq("xsd", p->sym->name)) { gen_val(fd, 0, p, nse, nsa, encoding, q->info.minOccurs == 0); } else { switch (p->type) { case Tchar: case Tshort: case Tint: case Tuchar: case Tushort: case Tuint: case Tlong: case Tulong: case Tllong: case Tullong: if (q->info.hasval || q->info.ptrval) fprintf(fd, SOAP_LONG_FORMAT, q->info.val.i); else gen_val(fd, 0, p, nse, nsa, encoding, q->info.minOccurs == 0); break; case Tfloat: case Tdouble: case Tldouble: if (q->info.hasval || q->info.ptrval) fprintf(fd, "%.16lG", q->info.val.r); else gen_val(fd, 0, p, nse, nsa, encoding, q->info.minOccurs == 0); break; case Ttime: gen_val(fd, 0, p, nse, nsa, encoding, q->info.minOccurs == 0); break; case Tenum: case Tenumsc: if ((q->info.hasval || q->info.ptrval) && p->ref) { for (r = ((Table*)p->ref)->list; r; r = r->next) { if (r->info.val.i == q->info.val.i) { fprintf(fd, "%s", ns_remove2(r->sym->name, c_ident(p))); break; } } } else gen_val(fd, 0, p, nse, nsa, encoding, q->info.minOccurs == 0); break; case Tpointer: case Treference: case Trvalueref: case Ttemplate: if (is_string(p) || is_wstring(p)) { if ((q->info.hasval || q->info.ptrval) && q->info.val.s) fprintf(fd, "%s", xstring(q->info.val.s)); else gen_val(fd, 0, p, nse, nsa, encoding, q->info.minOccurs == 0); } else if (is_stdstr(p->ref)) { if ((q->info.hasval || q->info.ptrval) && q->info.val.s) fprintf(fd, "%s", xstring(q->info.val.s)); else gen_val(fd, 0, p->ref, nse, nsa, encoding, q->info.minOccurs == 0); } break; case Tstruct: case Tclass: if (is_stdstr(p)) { if ((q->info.hasval || q->info.ptrval) && q->info.val.s) fprintf(fd, "%s", xstring(q->info.val.s)); else gen_val(fd, 0, p, nse, nsa, encoding, q->info.minOccurs == 0); } else { gen_val(fd, 0, p, nse, nsa, encoding, q->info.minOccurs == 0); } break; default: break; } } fprintf(fd, "\""); } } t = t->prev; if (t) nsa = ns_qualifiedAttributeName(t->sym->name); } fprintf(fd, ">"); fflush(fd); } void gen_val(FILE *fd, int n, Tnode *p, const char *nse, const char *nsa, const char *encoding, int opt) { Entry *q; LONG64 i; if (!is_transient(p) && p->type != Tfun && !is_XML(p)) { if (is_fixedstring(p)) { LONG64 k = p->width / ((Tnode*)p->ref)->width - 1; if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[TEXT[" SOAP_LONG_FORMAT ":" SOAP_LONG_FORMAT "]]]%%", k, k); } else { for (i = 0; i < k; i++) fprintf(fd, "X"); } return; } else if (p->type == Tarray) { i = ((Tnode*) p->ref)->width; fprintf(fd, "\n"); if (i) { i = p->width / i; if (gflag) { fprintf(fd, "%*s<__REPEAT min=\"" SOAP_LONG_FORMAT "\" max=\"" SOAP_LONG_FORMAT "\">\n", n+1, "", i, i); fprintf(fd, "%*s", n+1, ""); gen_val(fd, n+1, (Tnode*)p->ref, nse, nsa, encoding, 0); fprintf(fd, "\n"); fprintf(fd, "%*s\n", n+1, ""); } else { fprintf(fd, "%*s", n+1, ""); gen_val(fd, n+1, (Tnode*)p->ref, nse, nsa, encoding, 0); fprintf(fd, "\n"); } fprintf(fd, "%*s", n, ""); } return; } else if ((q = is_dynamic_array(p))) { if (is_hexBinary(p)) { if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[HEX[%ld:%ld]]]%%", minlen(p), maxlen(p)); else if (p->hasmin) fprintf(fd, "%%[[HEX[%ld:2147483647]]]%%", minlen(p)); else if (p->hasmax) fprintf(fd, "%%[[HEX[0:%ld]]]%%", maxlen(p)); else fprintf(fd, "%%[[HEX]]%%"); } } else if (is_binary(p)) { if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[BASE64[%ld:%ld]]]%%", minlen(p), maxlen(p)); else if (p->hasmin) fprintf(fd, "%%[[BASE64[%ld:2147483647]]]%%", minlen(p)); else if (p->hasmax) fprintf(fd, "%%[[BASE64[0:%ld]]]%%", maxlen(p)); else fprintf(fd, "%%[[BASE64]]%%"); } } else { int d = get_Darraydims(p); if (d == 0) d = 1; LONG64 k = q->info.minOccurs < 100000 ? q->info.minOccurs : 100000; if (k < 1 && (q->info.maxOccurs > 0 || q->info.maxOccurs < 0)) k = 1; if (gflag) { for (i = 0; i < d; i++) { fprintf(fd, "%*s<__REPEAT min=\"" SOAP_LONG_FORMAT "\"", n+1, "", q->info.minOccurs); if (q->info.maxOccurs > 1) fprintf(fd, " max=\"" SOAP_LONG_FORMAT "\"", q->info.maxOccurs); else fprintf(fd, " max=\"unbounded\""); fprintf(fd, ">\n"); } k = 1; } else if (yflag) { fprintf(fd, "%*s\n"); } for (i = 0; i < k; ++i) { fprintf(fd, "%*s<%s>", n+1, "", q->sym->name[5]?q->sym->name+5:"item"); gen_val(fd, n+1, q->info.typ, nse, nsa, encoding, q->info.maxOccurs == 0); fprintf(fd, "\n", q->sym->name[5]?q->sym->name+5:"item"); } if (gflag) for (i = 0; i < d; i++) fprintf(fd, "%*s\n", n+1, ""); } return; } else if (has_restriction_base(p, "xsd__anyURI")) { if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[URI]]%%"); } else { fprintf(fd, "http://www.example.com/schema/anyURI"); } return; } else if (has_restriction_base(p, "xsd__boolean")) { if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[BOOL]]%%"); } else { fprintf(fd, "false"); } return; } else if (has_restriction_base(p, "xsd__ENTITY") || has_restriction_base(p, "xsd__ENTITIES")) { if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[ENTITY[%ld:%ld]]]%%", minlen(p), maxlen(p)); else if (p->hasmin) fprintf(fd, "%%[[ENTITY[%ld:2147483647]]]%%", minlen(p)); else if (p->hasmax) fprintf(fd, "%%[[ENTITY[0:%ld]]]%%", maxlen(p)); else fprintf(fd, "%%[[ENTITY]]%%"); } else { if (p->imin > 0 && p->imin < 100000) for (i = 0; i < (int)p->imin; i++) fprintf(fd, "X"); } return; } else if (has_restriction_base(p, "xsd__ID")) { if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[ID[%ld:%ld]]]%%", minlen(p), maxlen(p)); else if (p->hasmin) fprintf(fd, "%%[[ID[%ld:2147483647]]]%%", minlen(p)); else if (p->hasmax) fprintf(fd, "%%[[ID[0:%ld]]]%%", maxlen(p)); else fprintf(fd, "%%[[ID]]%%"); } else if (p->imin > 0 && p->imin < 100000) { for (i = 0; i < (int)p->imin; i++) fprintf(fd, "X"); } else { fprintf(fd, "_%lu", ++idnum); } return; } else if (has_restriction_base(p, "xsd__IDREF") || has_restriction_base(p, "xsd__IDREFS")) { if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[IDREF[%ld:%ld]]]%%", minlen(p), maxlen(p)); else if (p->hasmin) fprintf(fd, "%%[[IDREF[%ld:2147483647]]]%%", minlen(p)); else if (p->hasmax) fprintf(fd, "%%[[IDREF[0:%ld]]]%%", maxlen(p)); else fprintf(fd, "%%[[IDREF]]%%"); } else if (p->imin > 0 && p->imin < 100000) { for (i = 0; i < (int)p->imin; i++) fprintf(fd, "X"); } else { fprintf(fd, "_%lu", ++idnum); } return; } else if (has_restriction_base(p, "xsd__integer")) { if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[INT64]]%%"); } else fprintf(fd, "0"); return; } else if (has_restriction_base(p, "xsd__date")) { if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[DATE]]%%"); } else { fprintf(fd, "1999-12-31"); } return; } else if (has_restriction_base(p, "xsd__dateTime")) { if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[DATETIME]]%%"); } else { char tmp[256]; time_t T = time(NULL); strftime(tmp, 256, "%Y-%m-%dT%H:%M:%SZ", gmtime(&T)); fprintf(fd, "%s", tmp); } return; } else if (has_restriction_base(p, "xsd__decimal")) { if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[DOUBLE]]%%"); } else { fprintf(fd, "0.0"); } return; } else if (has_restriction_base(p, "xsd__duration")) { if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[DURATION]]%%"); } else { fprintf(fd, "PT0S"); } return; } else if (has_restriction_base(p, "xsd__language")) { if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[LANG[%ld:%ld]]]%%", minlen(p), maxlen(p)); else if (p->hasmin) fprintf(fd, "%%[[LANG[%ld:2]]]%%", minlen(p)); else if (p->hasmax) fprintf(fd, "%%[[LANG[0:%ld]]]%%", maxlen(p)); else fprintf(fd, "%%[[LANG]]%%"); } else { if (p->imin > 0 && p->imin < 100000) for (i = 0; i < (int)p->imin; i++) fprintf(fd, "X"); } return; } else if (has_restriction_base(p, "xsd__Name")) { if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[NAME[%ld:%ld]]]%%", minlen(p), maxlen(p)); else if (p->hasmin) fprintf(fd, "%%[[NAME[%ld:2147483647]]]%%", minlen(p)); else if (p->hasmax) fprintf(fd, "%%[[NAME[0:%ld]]]%%", maxlen(p)); else fprintf(fd, "%%[[NAME]]%%"); } else { if (p->imin > 0 && p->imin < 100000) for (i = 0; i < (int)p->imin; i++) fprintf(fd, "X"); } return; } else if (has_restriction_base(p, "xsd__NCName")) { if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[NCNAME[%ld:%ld]]]%%", minlen(p), maxlen(p)); else if (p->hasmin) fprintf(fd, "%%[[NCNAME[%ld:2147483647]]]%%", minlen(p)); else if (p->hasmax) fprintf(fd, "%%[[NCNAME[0:%ld]]]%%", maxlen(p)); else fprintf(fd, "%%[[NCNAME]]%%"); } else { if (p->imin > 0 && p->imin < 100000) for (i = 0; i < (int)p->imin; i++) fprintf(fd, "X"); } return; } else if (has_restriction_base(p, "xsd__NMTOKEN") || has_restriction_base(p, "xsd__NMTOKENS")) { if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[NMTOKEN[%ld:%ld]]]%%", minlen(p), maxlen(p)); else if (p->hasmin) fprintf(fd, "%%[[NMTOKEN[%ld:2147483647]]]%%", minlen(p)); else if (p->hasmax) fprintf(fd, "%%[[NMTOKEN[0:%ld]]]%%", maxlen(p)); else fprintf(fd, "%%[[NMTOKEN]]%%"); } else { if (p->imin > 0 && p->imin < 100000) for (i = 0; i < (int)p->imin; i++) fprintf(fd, "X"); } return; } else if (has_restriction_base(p, "xsd__token") || has_restriction_base(p, "xsd__token")) { if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[TOKEN[%ld:%ld]]]%%", minlen(p), maxlen(p)); else if (p->hasmin) fprintf(fd, "%%[[TOKEN[%ld:2147483647]]]%%", minlen(p)); else if (p->hasmax) fprintf(fd, "%%[[TOKEN[0:%ld]]]%%", maxlen(p)); else fprintf(fd, "%%[[TOKEN]]%%"); } else { if (p->imin > 0 && p->imin < 100000) for (i = 0; i < (int)p->imin; i++) fprintf(fd, "X"); } return; } else if (has_restriction_base(p, "xsd__negativeInteger")) { if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[-9223372036854775808:-1]]%%"); } else { fprintf(fd, "-1"); } return; } else if (has_restriction_base(p, "xsd__nonNegativeInteger")) { if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[0:9223372036854775807]]%%"); } else { fprintf(fd, "0"); } return; } else if (has_restriction_base(p, "xsd__nonPositiveInteger")) { if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[-9223372036854775808:0]]%%"); } else { fprintf(fd, "0"); } return; } else if (has_restriction_base(p, "xsd__positiveInteger")) { if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[1:9223372036854775807]]%%"); } else { fprintf(fd, "1"); } return; } else if (has_restriction_base(p, "xsd__time")) { if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[TIME]]%%"); } else { fprintf(fd, "12:34:56.789Z"); } return; } else if (is_qname(p) || is_stdqname(p)) { if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[QNAME]]%%"); } else { fprintf(fd, "xsd:string"); } return; } if (p->pattern && *p->pattern != '%') { if (gflag) { const char *s; if (opt) fprintf(fd, "???"); fprintf(fd, "%%[['"); for (s = p->pattern; *s; s++) { if (*s == '\'') fprintf(fd, "\\'"); else fprintf(fd, "%c", *s); } if (p->hasmin && p->hasmax) fprintf(fd, "'[%ld:%ld]]]%%", minlen(p), maxlen(p)); else if (p->hasmin) fprintf(fd, "'[%ld:2147483647]]]%%", minlen(p)); else if (p->hasmax) fprintf(fd, "'[0:%ld]]]%%", maxlen(p)); else fprintf(fd, "']]%%"); return; } } switch (p->type) { case Tchar: if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[%d:%d]]%%", (int)p->imin + (p->incmin == False), (int)p->imax - (p->incmax == False)); else if (p->hasmin) fprintf(fd, "%%[[%d:127]]%%", (int)p->imin + (p->incmin == False)); else if (p->hasmax) fprintf(fd, "%%[[-128:%d]]%%", (int)p->imax - (p->incmax == False)); else fprintf(fd, "%%[[INT8]]%%"); } else { if (p->hasmin && p->imin > 0) fprintf(fd, "%d", (int)p->imin + (p->incmin == False)); else if (p->hasmax && p->imax < 0) fprintf(fd, "%d", (int)p->imax - (p->incmax == False)); else fprintf(fd, "0"); } break; case Tshort: if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[%d:%d]]%%", (int)p->imin + (p->incmin == False), (int)p->imax - (p->incmax == False)); else if (p->hasmin) fprintf(fd, "%%[[%d:32767]]%%", (int)p->imin + (p->incmin == False)); else if (p->hasmax) fprintf(fd, "%%[[-32768:%d]]%%", (int)p->imax - (p->incmax == False)); else fprintf(fd, "%%[[INT16]]%%"); } else { if (p->hasmin && p->imin > 0) fprintf(fd, "%d", (int)p->imin + (p->incmin == False)); else if (p->hasmax && p->imax < 0) fprintf(fd, "%d", (int)p->imax - (p->incmax == False)); else fprintf(fd, "0"); } break; case Tint: case Tlong: if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[%ld:%ld]]%%", (long)p->imin + (p->incmin == False), (long)p->imax - (p->incmax == False)); else if (p->hasmin) fprintf(fd, "%%[[%ld:2147483647]]%%", (long)p->imin + (p->incmin == False)); else if (p->hasmax) fprintf(fd, "%%[[-2147483648:%ld]]%%", (long)p->imax - (p->incmax == False)); else fprintf(fd, "%%[[INT32]]%%"); } else { if (p->hasmin && p->imin > 0) fprintf(fd, "%ld", (long)p->imin + (p->incmin == False)); else if (p->hasmax && p->imax < 0) fprintf(fd, "%ld", (long)p->imax - (p->incmax == False)); else fprintf(fd, "0"); } break; case Tllong: if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[" SOAP_LONG_FORMAT ":" SOAP_LONG_FORMAT "]]%%", p->imin + (p->incmin == False), p->imax - (p->incmax == False)); else if (p->hasmin) fprintf(fd, "%%[[" SOAP_LONG_FORMAT ":9223372036854775807]]%%", p->imin + (p->incmin == False)); else if (p->hasmax) fprintf(fd, "%%[[-9223372036854775808:" SOAP_LONG_FORMAT "]]%%", p->imax - (p->incmax == False)); else fprintf(fd, "%%[[INT64]]%%"); } else { if (p->hasmin && p->imin > 0) fprintf(fd, SOAP_LONG_FORMAT, p->imin + (p->incmin == False)); else if (p->hasmax && p->imax < 0) fprintf(fd, SOAP_LONG_FORMAT, p->imax - (p->incmax == False)); else fprintf(fd, "0"); } break; case Tuchar: if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[%u:%u]]%%", (unsigned int)p->imin + (p->incmin == False), (unsigned int)p->imax - (p->incmax == False)); else if (p->hasmin) fprintf(fd, "%%[[%u:255]]%%", (unsigned int)p->imin + (p->incmin == False)); else if (p->hasmax) fprintf(fd, "%%[[0:%u]]%%", (unsigned int)p->imax - (p->incmax == False)); else fprintf(fd, "%%[[UINT8]]%%"); } else { if (p->hasmin && p->imin > 0) fprintf(fd, "%u", (unsigned int)p->imin + (p->incmin == False)); else if (p->hasmax && p->imax < 0) fprintf(fd, "%u", (unsigned int)p->imax - (p->incmax == False)); else fprintf(fd, "0"); } break; case Tushort: if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[%u:%u]]%%", (unsigned int)p->imin + (p->incmin == False), (unsigned int)p->imax - (p->incmax == False)); else if (p->hasmin) fprintf(fd, "%%[[%u:65535]]%%", (unsigned int)p->imin + (p->incmin == False)); else if (p->hasmax) fprintf(fd, "%%[[0:%u]]%%", (unsigned int)p->imax - (p->incmax == False)); else fprintf(fd, "%%[[UINT16]]%%"); } else { if (p->hasmin && p->imin > 0) fprintf(fd, "%u", (unsigned int)p->imin + (p->incmin == False)); else if (p->hasmax && p->imax < 0) fprintf(fd, "%u", (unsigned int)p->imax - (p->incmax == False)); else fprintf(fd, "0"); } break; case Tuint: case Tulong: if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[%lu:%lu]]%%", (unsigned long)p->imin + (p->incmin == False), (unsigned long)p->imax - (p->incmax == False)); else if (p->hasmin) fprintf(fd, "%%[[%lu:4294967295]]%%", (unsigned long)p->imin + (p->incmin == False)); else if (p->hasmax) fprintf(fd, "%%[[0:%lu]]%%", (unsigned long)p->imax - (p->incmax == False)); else fprintf(fd, "%%[[UINT32]]%%"); } else { if (p->hasmin && p->imin > 0) fprintf(fd, "%lu", (unsigned long)p->imin + (p->incmin == False)); else if (p->hasmax && p->imax < 0) fprintf(fd, "%lu", (unsigned long)p->imax - (p->incmax == False)); else fprintf(fd, "0"); } break; case Tullong: if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[" SOAP_ULONG_FORMAT ":" SOAP_ULONG_FORMAT "]]%%", (ULONG64)p->imin + (p->incmin == False), (ULONG64)p->imax - (p->incmax == False)); else if (p->hasmin) fprintf(fd, "%%[[" SOAP_ULONG_FORMAT ":18446744073709551615]]%%", (ULONG64)p->imin + (p->incmin == False)); else if (p->hasmax) fprintf(fd, "%%[[0:" SOAP_ULONG_FORMAT "]]%%", (ULONG64)p->imax - (p->incmax == False)); else fprintf(fd, "%%[[UINT64]]%%"); } else { if (p->hasmin && p->imin > 0) fprintf(fd, SOAP_ULONG_FORMAT, (ULONG64)p->imin + (p->incmin == False)); else if (p->hasmax && p->imax < 0) fprintf(fd, SOAP_ULONG_FORMAT, (ULONG64)p->imax - (p->incmax == False)); else fprintf(fd, "0"); } break; case Tfloat: if (gflag) { const char *pattern = p->pattern && *p->pattern == '%' ? p->pattern : ""; if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax && p->incmin && p->incmax) fprintf(fd, "%%[[%.8E:%.8E%s]]%%", p->rmin, p->rmax, pattern); else if (p->hasmin && p->hasmax && p->incmin) fprintf(fd, "%%[[%.8E:%.8E%s)]%%", p->rmin, p->rmax, pattern); else if (p->hasmin && p->hasmax && p->incmax) fprintf(fd, "%%[(%.8E:%.8E%s]]%%", p->rmin, p->rmax, pattern); else if (p->hasmin && p->hasmax) fprintf(fd, "%%[(%.8E:%.8E%s)]%%", p->rmin, p->rmax, pattern); else if (p->hasmin && p->incmin) fprintf(fd, "%%[[%.8E:%.8E%s]]%%", p->rmin, FLT_MAX, pattern); else if (p->hasmin) fprintf(fd, "%%[(%.8E:%.8E%s]]%%", p->rmin, FLT_MAX, pattern); else if (p->hasmax && p->incmax) fprintf(fd, "%%[[%.8E:%.8E%s]]%%", -FLT_MAX, p->rmax, pattern); else if (p->hasmax) fprintf(fd, "%%[[%.8E:%.8E%s)]%%", -FLT_MAX, p->rmax, pattern); else fprintf(fd, "%%[[FLOAT%s]]%%", pattern); } else { if (p->hasmin && p->rmin > 0) fprintf(fd, "%.9lG", p->rmin * (1 + (p->incmin == False)/1000)); else if (p->hasmax && p->rmax > 0) fprintf(fd, "%.9lG", p->rmax * (1 - (p->incmax == False)/1000)); else if (p->hasmin && p->rmin < 0) fprintf(fd, "%.9lG", p->rmin * (1 - (p->incmin == False)/1000)); else if (p->hasmax && p->rmax < 0) fprintf(fd, "%.9lG", p->rmax * (1 + (p->incmax == False)/1000)); else fprintf(fd, "0.0"); } break; case Tdouble: case Tldouble: if (gflag) { const char *pattern = p->pattern && *p->pattern == '%' ? p->pattern : ""; if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax && p->incmin && p->incmax) fprintf(fd, "%%[[%.16lE:%.16lE%s]]%%", p->rmin, p->rmax, pattern); else if (p->hasmin && p->hasmax && p->incmin) fprintf(fd, "%%[[%.16lE:%.16lE%s)]%%", p->rmin, p->rmax, pattern); else if (p->hasmin && p->hasmax && p->incmax) fprintf(fd, "%%[(%.16lE:%.16lE%s]]%%", p->rmin, p->rmax, pattern); else if (p->hasmin && p->hasmax) fprintf(fd, "%%[(%.16lE:%.16lE%s)]%%", p->rmin, p->rmax, pattern); else if (p->hasmin && p->incmin) fprintf(fd, "%%[[%.16lE:%.16lE%s]]%%", p->rmin, DBL_MAX, pattern); else if (p->hasmin) fprintf(fd, "%%[(%.16lE:%.16lE%s]]%%", p->rmin, DBL_MAX, pattern); else if (p->hasmax && p->incmax) fprintf(fd, "%%[[%.16lE:%.16lE%s]]%%", -DBL_MAX, p->rmax, pattern); else if (p->hasmax) fprintf(fd, "%%[[%.16lE:%.16lE%s)]%%", -DBL_MAX, p->rmax, pattern); else fprintf(fd, "%%[[DOUBLE%s]]%%", pattern); } else { if (p->hasmin && p->rmin > 0) fprintf(fd, "%.17lG", p->rmin * (1 + (p->incmin == False)/1000)); else if (p->hasmax && p->rmax > 0) fprintf(fd, "%.17lG", p->rmax * (1 - (p->incmax == False)/1000)); else if (p->hasmin && p->rmin < 0) fprintf(fd, "%.17lG", p->rmin * (1 - (p->incmin == False)/1000)); else if (p->hasmax && p->rmax < 0) fprintf(fd, "%.17lG", p->rmax * (1 + (p->incmax == False)/1000)); else fprintf(fd, "0.0"); } break; case Ttime: if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[DATETIME]]%%"); } else { char tmp[256]; time_t T = time(NULL); strftime(tmp, 256, "%Y-%m-%dT%H:%M:%SZ", gmtime(&T)); fprintf(fd, "%s", tmp); } break; case Tenum: case Tenumsc: if (gflag) { if (opt) fprintf(fd, "???"); if (p->ref) { q = ((Table*)p->ref)->list; if (q) { if (!q->next) { fprintf(fd, "%s", ns_remove2(q->sym->name, c_ident(p))); } else { fprintf(fd, "%%[["); while (q) { fprintf(fd, "%s", ns_remove2(q->sym->name, c_ident(p))); if (q->next) fprintf(fd, "]["); q = q->next; } fprintf(fd, "]]%%"); } } } } else { if (p->ref && (q = ((Table*)p->ref)->list)) fprintf(fd, "%s", ns_remove2(q->sym->name, c_ident(p))); else fprintf(fd, "0"); } break; case Tpointer: case Treference: case Trvalueref: case Ttemplate: if (is_string(p) || is_wstring(p)) { if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[TEXT[%ld:%ld]]]%%", minlen(p), maxlen(p)); else if (p->hasmin) fprintf(fd, "%%[[TEXT[%ld:2147483647]]]%%", minlen(p)); else if (p->hasmax) fprintf(fd, "%%[[TEXT[0:%ld]]]%%", maxlen(p)); else fprintf(fd, "%%[[TEXT]]%%"); } else { if (p->imin > 0 && p->imin < 100000) for (i = 0; i < (int)p->imin; i++) fprintf(fd, "X"); } } else { gen_val(fd, n, (Tnode*)p->ref, nse, nsa, encoding, opt); } break; case Tclass: case Tstruct: nse = ns_qualifiedElement(p); nsa = ns_qualifiedAttribute(p); if (is_stdstr(p)) { if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[TEXT[%ld:%ld]]]%%", minlen(p), maxlen(p)); else if (p->hasmin) fprintf(fd, "%%[[TEXT[%ld:2147483647]]]%%", minlen(p)); else if (p->hasmax) fprintf(fd, "%%[[TEXT[0:%ld]]]%%", maxlen(p)); else fprintf(fd, "%%[[TEXT]]%%"); } else { if (p->imin > 0 && p->imin < 100000) for (i = 0; i < (int)p->imin; i++) fprintf(fd, "X"); } } else if (is_primclass(p)) { Table *t = (Table*)p->ref; while (t) { Entry *r = entry(classtable, t->sym); r = t->list; while (r && !is_item(r)) r = r->next; if (r) { gen_val(fd, n, r->info.typ, nse, nsa, encoding, opt); return; } t = t->prev; if (t) nse = ns_qualifiedElementName(t->sym->name); } } else if (!is_dynamic_array(p) && p->ref) { int i = 0; Table *t; if (gflag && opt) fprintf(fd, "???"); fprintf(fd, "\n"); for (t = (Table*)p->ref; t; t = t->prev) i++; for (; i > 0; i--) { int j; const char *nse1; t = (Table*)p->ref; for (j = 0; j < i-1; j++) t = t->prev; if (t == (Table*)p->ref) nse1 = nse; else nse1 = ns_qualifiedElementName(t->sym->name); for (q = t->list; q; q = q->next) { if (is_sequence(q)) { if (gflag) { if (q->info.minOccurs == 0) fprintf(fd, "%*s<__REPEAT min=\"" SOAP_LONG_FORMAT "\">\n", n+1, "", q->info.minOccurs); gen_field(fd, n, q, nse1, nsa, encoding, 0, 0); if (q->info.minOccurs == 0) fprintf(fd, "%*s\n", n+1, ""); } else { gen_field(fd, n, q, nse1, nsa, encoding, 0, 0); } } else if (is_repetition(q)) { if (gflag) { fprintf(fd, "%*s<__REPEAT min=\"" SOAP_LONG_FORMAT "\"", n+1, "", q->info.minOccurs); if (q->info.maxOccurs > 1) fprintf(fd, " max=\"" SOAP_LONG_FORMAT "\"", q->info.maxOccurs); else fprintf(fd, " max=\"unbounded\""); fprintf(fd, ">\n"); gen_field(fd, n+1, q->next, nse1, nsa, encoding, 0, 0); fprintf(fd, "%*s\n", n+1, ""); } else { LONG64 j; if (yflag) { fprintf(fd, "%*s\n"); } j = q->info.minOccurs < 100000 ? q->info.minOccurs : 100000; if (j < 1 && (q->info.maxOccurs > 0 || q->info.maxOccurs < 0)) j = 1; for (; j > 0; --j) gen_field(fd, n+1, q->next, nse1, nsa, encoding, q->info.minOccurs == 0 && (opt || !is_invisible(p->id->name)), 0); } q = q->next; } else { gen_field(fd, n+1, q, nse1, nsa, encoding, q->info.minOccurs == 0 && (opt || !is_invisible(p->id->name)), 0); } } } fprintf(fd, "%*s", n, ""); } break; case Tunion: if ((Table*)p->ref && ((Table*)p->ref)->list) { if (gflag) { fprintf(fd, "%*s<__SELECT>\n", n, ""); for (q = ((Table*)p->ref)->list; q; q = q->next) gen_field(fd, n, q, nse, nsa, encoding, 0, 0); fprintf(fd, "%*s\n", n, ""); } else { if (yflag) { fprintf(fd, "%*s\n"); } gen_field(fd, n, ((Table*)p->ref)->list, nse, nsa, encoding, 0, 0); } } break; default: break; } } } void gen_header(FILE *fd, const char *method, int response, const char *encoding) { if (custom_header) { Service *sp; Method *m = NULL; Entry *q; Table *r; q = entry(classtable, lookup("SOAP_ENV__Header")); if (yflag) fprintf(fd, " \n", c_type(q->info.typ)); fprintf(fd, " \n"); if (q) { r = (Table*)q->info.typ->ref; if (r) { for (q = r->list; q; q = q->next) { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun) { for (sp = services; sp; sp = sp->next) for (m = sp->list; m; m = m->next) if (is_eq(m->name, method) && (!strcmp(m->part, q->sym->name) || is_eq_nons(m->part, q->sym->name)) && ((!response && (m->mess&HDRIN)) || (response && (m->mess&HDROUT)))) { gen_field(fd, 2, q, NULL, NULL, encoding, q->info.minOccurs == 0, 0); break; } } } fprintf(fd, " \n"); } } } } FILE * gen_env(const char *buf, const char *method, int response, const char *encoding, int soap) { char tmp[1024]; FILE *fd; strcpy(tmp, buf); if (!soap) strcat(tmp, "REST."); #ifdef __vms if (!response) { sprintf(strrchr(tmp, '.'), "_%s_req.xml", method); fprintf(fmsg, "Saving %s sample SOAP/XML request\n", tmp); } else { sprintf(strrchr(tmp, '.'), "_%s_res.xml", method); fprintf(fmsg, "Saving %s sample SOAP/XML response\n", tmp); } #else strcpy(strrchr(tmp, '.')+1, method); if (!response) { strcat(tmp, ".req.xml"); fprintf(fmsg, "Saving %s sample SOAP/XML request\n", tmp); } else { strcat(tmp, ".res.xml"); fprintf(fmsg, "Saving %s sample SOAP/XML response\n", tmp); } #endif fd = fopen(tmp, "w"); if (!fd) execerror("Cannot write XML file"); fprintf(fd, "\n"); if (soap && soap_version >= 0) { fprintf(fd, "\n"); gen_header(fd, method, response, encoding); fprintf(fd, " \n"); } return fd; } void gen_xmlns(FILE *fd, int soap) { Symbol *s; Service *sp = NULL; for (s = nslist; s; s = s->next) { for (sp = services; sp; sp = sp->next) if (!tagcmp(sp->ns, s->name) && sp->URI) break; if (sp) fprintf(fd, "\n xmlns:%s=\"%s\"", ns_convert(s->name), sp->URI); else if (!strcmp(s->name, "SOAP-ENV")) { if (soap && soap_version >= 0) fprintf(fd, "\n xmlns:SOAP-ENV=\"%s\"", envURI); } else if (!strcmp(s->name, "SOAP-ENC")) { if (soap && soap_version >= 0) fprintf(fd, "\n xmlns:SOAP-ENC=\"%s\"", encURI); } else if (!strcmp(s->name, "xsi")) fprintf(fd, "\n xmlns:xsi=\"%s\"", xsiURI); else if (!strcmp(s->name, "xsd")) fprintf(fd, "\n xmlns:xsd=\"%s\"", xsdURI); else fprintf(fd, "\n xmlns:%s=\"%s/%s.xsd\"", ns_convert(s->name), tmpURI, ns_convert(s->name)); } } char * emalloc(size_t n) { char *p; if ((p = (char*)malloc(n)) == NULL) execerror("out of memory"); return p; } void soap_serve(Table *table) { if (!Sflag) { Entry *method; banner(fheader, "Client-Side Call Stub Functions"); if (rflag) { Service *sp; fprintf(freport, "## Web Client Operations {#doc-client}\n\n"); for (sp = services; sp; sp = sp->next) { if (sp->documentation) { gen_text(freport, sp->documentation); fprintf(freport, "\n\n"); } } } for (method = table->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ)) { if (rflag) gen_call_proto(freport, method); gen_call_proto(fheader, method); gen_call_method(fclient, method, NULL); } } } if (!Cflag) { Entry *method, *catch_method; if (rflag) { Service *sp; fprintf(freport, "## Web Server Operations {#doc-server}\n\n"); for (sp = services; sp; sp = sp->next) { if (sp->documentation) { gen_text(freport, sp->documentation); fprintf(freport, "\n\n"); } } } banner(fheader, "Server-Side Operations"); if (!cflag && !namespaceid) fprintf(fserver, "extern \"C\" "); fprintf(fserver, "SOAP_FMAC5 int SOAP_FMAC6 %s_serve(struct soap *soap)", nflag?prefix:"soap"); fprintf(fserver, "\n{\n#ifndef WITH_FASTCGI\n\tsoap->keep_alive = soap->max_keep_alive + 1;\n#endif\n\tdo\n\t{"); fprintf(fserver, "\n#ifndef WITH_FASTCGI\n\t\tif (soap->keep_alive > 0 && soap->max_keep_alive > 0)\n\t\t\tsoap->keep_alive--;\n#endif"); fprintf(fserver, "\n\t\tif (soap_begin_serve(soap))\n\t\t{\tif (soap->error >= SOAP_STOP)\n\t\t\t\tcontinue;\n\t\t\treturn soap->error;\n\t\t}"); if (namespaceid) fprintf(fserver, "\n\t\tif ((%s::%s_serve_request(soap) || (soap->fserveloop && soap->fserveloop(soap))) && soap->error && soap->error < SOAP_STOP)\n\t\t{\n#ifdef WITH_FASTCGI\n\t\t\tsoap_send_fault(soap);\n#else\n\t\t\treturn soap_send_fault(soap);\n#endif\n\t\t}", namespaceid, nflag?prefix:"soap"); else fprintf(fserver, "\n\t\tif ((%s_serve_request(soap) || (soap->fserveloop && soap->fserveloop(soap))) && soap->error && soap->error < SOAP_STOP)\n\t\t{\n#ifdef WITH_FASTCGI\n\t\t\tsoap_send_fault(soap);\n#else\n\t\t\treturn soap_send_fault(soap);\n#endif\n\t\t}", nflag?prefix:"soap"); fprintf(fserver, "\n#ifdef WITH_FASTCGI\n\t\tsoap_destroy(soap);\n\t\tsoap_end(soap);\n\t} while (1);\n#else\n\t} while (soap->keep_alive);\n#endif"); fprintf(fserver, "\n\treturn SOAP_OK;"); fprintf(fserver, "\n}"); fprintf(fserver, "\n\n#ifndef WITH_NOSERVEREQUEST\n"); if (!cflag && !namespaceid) fprintf(fserver, "extern \"C\" "); fprintf(fserver, "SOAP_FMAC5 int SOAP_FMAC6 %s_serve_request(struct soap *soap)\n{", nflag?prefix:"soap"); if (sflag) fprintf(fserver, "\n\tsoap->mode |= SOAP_XML_STRICT;"); if (aflag) { int i, num = 0; struct pair *map; for (method = table->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) { int found = 0; Service *sp; for (sp = services; sp; sp = sp->next) { if (has_ns_eq(sp->ns, method->sym->name)) { Method *m; for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, method->sym->name)) { if (m->mess == ACTION || m->mess == REQUEST_ACTION) { ++num; found = 1; } } } } } if (Aflag && !found) { sprintf(errbuf, "Option -A requires a SOAPAction specified for operation %s where none is defined", ident(method->sym->name)); compliancewarn(errbuf); } } } map = (struct pair*)emalloc(num * sizeof(struct pair)); num = 0; for (method = table->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) { Service *sp; for (sp = services; sp; sp = sp->next) { if (has_ns_eq(sp->ns, method->sym->name)) { Method *m; for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, method->sym->name)) { if (m->mess == ACTION || m->mess == REQUEST_ACTION) { map[num].action = m->part; map[num].method = method; ++num; } } } } } } } if (num > 0) { qsort(map, num, sizeof(struct pair), mapcomp); if (num > 4) /* binary search worthwhile when num > 4 */ { fprintf(fserver, "\n\tif (soap->action)\n\t{\n\t\tconst char *soap_action[] = { "); for (i = 0; i < num; i++) { if (*map[i].action == '"') fprintf(fserver, "%s, ", map[i].action); else fprintf(fserver, "\"%s\", ", map[i].action); } fprintf(fserver, " };"); fprintf(fserver, "\n\t\tswitch (soap_binary_search_string(soap_action, %d, soap->action))\n\t\t{", num); for (i = 0; i < num; i++) fprintf(fserver, "\n\t\t\tcase %d:\treturn soap_serve_%s(soap);", i, ident(map[i].method->sym->name)); fprintf(fserver, "\n\t\t}\n\t}"); } else { fprintf(fserver, "\n\tif (soap->action)\n\t{"); for (i = 0; i < num; i++) { if (*map[i].action == '"') fprintf(fserver, "\n\t\tif (!strcmp(soap->action, %s))", map[i].action); else fprintf(fserver, "\n\t\tif (!strcmp(soap->action, \"%s\"))", map[i].action); fprintf(fserver, "\n\t\t\treturn soap_serve_%s(soap);", ident(map[i].method->sym->name)); } fprintf(fserver, "\n\t}"); } } } if (!Aflag) { fprintf(fserver, "\n\tsoap_peek_element(soap);"); catch_method = NULL; for (method = table->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) { if (is_invisible(method->sym->name)) { Entry *param = entry(classtable, method->sym); if (param) param = ((Table*)param->info.typ->ref)->list; if (param) fprintf(fserver, "\n\tif (!soap_match_tag(soap, soap->tag, \"%s\"))\n\t\treturn soap_serve_%s(soap);", ns_convert(param->sym->name), ident(method->sym->name)); else catch_method = method; } else { fprintf(fserver, "\n\tif (!soap_match_tag(soap, soap->tag, \"%s\"))\n\t\treturn soap_serve_%s(soap);", ns_convert(method->sym->name), ident(method->sym->name)); } } } if (catch_method) fprintf(fserver, "\n\treturn soap_serve_%s(soap);", ident(catch_method->sym->name)); else fprintf(fserver, "\n\treturn soap->error = SOAP_NO_METHOD;"); } else { fprintf(fserver, "\n\treturn soap->error = SOAP_NO_METHOD;"); } fprintf(fserver, "\n}\n#endif"); if (rflag) { fprintf(freport, "Use the service request dispatcher that is auto-generated in [%s](%s) to accept and process service requests:\n\n", soapServer, pathsoapServer); fprintf(freport, " SOAP_FMAC5 int SOAP_FMAC6 %s_serve(struct soap *soap);\n\n", nflag?prefix:"soap"); fprintf(freport, "This function serves requests by calling one of the service operations listed further below that matches the request. Returns `SOAP_OK` or an error code. This function supports CGI by accepting a request on stdin and sending the response to stdout, and FastCGI. To serve over HTTP(S), use the following functions to establish a connection:\n\n"); fprintf(freport, "- `SOAP_SOCKET soap_bind(struct soap *soap, const char *host, int port, int backlog)` returns master socket bound to port (and restricted to host name if not NULL) or `SOAP_INVALID_SOCKET` upon error\n"); fprintf(freport, "- `SOAP_SOCKET soap_accept(struct soap *soap)` accepts connection and returns socket when accepted, or `SOAP_INVALID_SOCKET` upon error\n"); fprintf(freport, "- `int soap_ssl_accept(struct soap *soap)` performs SSL handshake and returns `SOAP_OK` when successful or an error code, call this function after `soap_accept()` to accept SSL/TLS connection\n\n"); } for (method = table->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) { if (rflag) generate_proto(freport, table, method); generate_proto(fheader, table, method); } } if (rflag) fprintf(freport, "\n\n"); banner(fheader, "Server-Side Skeletons to Invoke Service Operations"); fprintf(fheader, "\n"); if (!cflag && !namespaceid) fprintf(fheader, "extern \"C\" "); fprintf(fheader, "SOAP_FMAC5 int SOAP_FMAC6 %s_serve(struct soap*);", nflag?prefix:"soap"); fprintf(fheader, "\n\n"); if (!cflag && !namespaceid) fprintf(fheader, "extern \"C\" "); fprintf(fheader, "SOAP_FMAC5 int SOAP_FMAC6 %s_serve_request(struct soap*);", nflag?prefix:"soap"); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ)) gen_serve_method(fserver, table, method, NULL); } } void generate_proto(FILE *fd, Table *table, Entry *param) { Entry *q, *pout; Table *output; Entry *result; result = (Entry*)param->info.typ->ref; q = entry(table, param->sym); if (q) { pout = (Entry*)q->info.typ->ref; } else { fprintf(stderr, "Internal error: no table entry\n"); return; } q = entry(classtable, param->sym); output = (Table*)q->info.typ->ref; if (fd == freport) gen_report_operation(NULL, param, 1); if (is_transient(pout->info.typ)) fprintf(fd, "\n /** Web service one-way operation '%s' implementation, should return value of soap_send_empty_response() to send HTTP Accept acknowledgment, or return an error code, or return SOAP_OK to immediately return without sending an HTTP response message */", ident(param->sym->name)); else fprintf(fd, "\n /** Web service operation '%s' implementation, should return SOAP_OK or error code */", ident(param->sym->name)); fprintf(fd, "\n SOAP_FMAC5 int SOAP_FMAC6 %s(struct soap*", ident(param->sym->name)); gen_params(fd, output, pout, 1); fprintf(fd, ";"); if (fd == freport) { fprintf(freport, "\n\nwhere:\n\n- `struct soap *soap` is the context\n"); gen_report_params(q, result, 1); if (!is_transient(result->info.typ)) fprintf(freport, "This service function should be implemented as part of the service back-end code and return `SOAP_OK` and set the last parameter `%s` to the result, or return an error code\n\n", ident(result->sym->name)); else fprintf(freport, "This service function should be implemented as part of the service back-end code and call `int soap_send_empty_response(struct soap *soap, int httpcode)` with a HTTP status or error code (200 to 599) to return, when communicating over HTTP to return a HTTP header.\n\n"); gen_report_hr(); } } int tagcmp(const char *s, const char *t) { size_t i, n; if (!s) return -1; if (!t) return 1; n = strlen(s); for (i = 0; i < n; i++) { int c = t[i]; if (c == '_' && s[i] != '_') c = '-'; if (s[i] > c) return 1; if (s[i] < c) return -1; } return -(t[i] != 0); } int tagncmp(const char *s, const char *t, size_t n) { size_t i; if (!s) return -1; if (!t) return 1; for (i = 0; i < n; i++) { int c = t[i]; if (c == '_' && s[i] != '_') c = '-'; if (s[i] > c) return 1; if (s[i] < c) return -1; } return 0; } int property(Tnode *p) { if (is_primitive(p)) return 5; /* collapse white space in primitive type values */ return p->property; } void property_pattern(Tnode *p, const char *name) { p->property = 1; p->pattern = NULL; if (is_eq(name, "xsd__QName") || is_eq(name, "QName")) { p->property = 2; } else if (is_eq(name, "xsd__normalizedString") || is_eq(name, "xsd__anyURI")) { p->property = 4; } else if (is_eq(name, "xsd__NOTATION") || is_eq(name, "xsd__token")) { p->property = 5; } else if (is_eq(name, "xsd__language")) { p->property = 5; p->pattern = "([a-zA-Z]{2}|[iI]-[a-zA-Z]+|[xX]-[a-zA-Z]{1,8})(-[a-zA-Z]{1,8})*"; } else if (is_eq(name, "xsd__Name")) { p->property = 5; p->pattern = "\\i\\c*"; } else if (is_eq(name, "xsd__NMTOKEN")) { p->property = 5; p->pattern = "\\c+"; } else if (is_eq(name, "xsd__NMTOKENS")) { p->property = 5; p->pattern = "(\\c+[ ])*\\c+"; } else if (is_eq(name, "xsd__ENTITY") || is_eq(name, "xsd__ID") || is_eq(name, "xsd__IDREF") || is_eq(name, "xsd__NCName")) { p->property = 5; p->pattern = "[\\i-[:]][\\c-[:]]*"; } else if (is_eq(name, "xsd__ENTITIES") || is_eq(name, "xsd__IDREFS")) { p->property = 5; p->pattern = "([\\i-[:]][\\c-[:]]*[ ])*[\\i-[:]][\\c-[:]]*"; } else if (is_eq(name, "xsd__date")) { p->property = 5; p->pattern = "[-+]?\\d{4,}-\\d{2}-\\d{2}(Z|[-+]\\d{2}:\\d{2})?"; } else if (is_eq(name, "xsd__dateTime")) { p->property = 5; p->pattern = "[-+]?\\d{4,}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(Z|[-+]\\d{2}:\\d{2})?"; } else if (is_eq(name, "xsd__decimal")) { p->property = 5; p->pattern = "[-+]?(\\d+|\\d*\\.\\d*)"; } else if (is_eq(name, "xsd__duration")) { p->property = 5; p->pattern = "[-+]?P(\\d+Y)?(\\d+M)?(\\d+D)?(T(\\d+H)?(\\d+M)?(\\d+(\\.\\d*)?S)?)?"; } else if (is_eq(name, "xsd__gDay")) { p->property = 5; p->pattern = "---\\d{2}(Z|[-+]\\d{2}:\\d{2})?"; } else if (is_eq(name, "xsd__gMonth")) { p->property = 5; p->pattern = "--\\d{2}(Z|[-+]\\d{2}:\\d{2})?"; } else if (is_eq(name, "xsd__gMonthDay")) { p->property = 5; p->pattern = "--\\d{2}-\\d{2}(Z|[-+]\\d{2}:\\d{2})?"; } else if (is_eq(name, "xsd__gYear")) { p->property = 5; p->pattern = "([-+]?\\d{4,})(Z|[-+]\\d{2}:\\d{2})?"; } else if (is_eq(name, "xsd__gYearMonth")) { p->property = 5; p->pattern = "([-+]?\\d{4,})-\\d{2}(Z|[-+]\\d{2}:\\d{2})?"; } else if (is_eq(name, "xsd__integer")) { p->property = 5; p->pattern = "[-+]?\\d+"; } else if (is_eq(name, "xsd__negativeInteger")) { p->property = 5; p->pattern = "-\\d*[1-9]\\d*"; } else if (is_eq(name, "xsd__nonNegativeInteger")) { p->property = 5; p->pattern = "\\+?\\d+"; } else if (is_eq(name, "xsd__nonPositiveInteger")) { p->property = 5; p->pattern = "-\\d+|\\+?0+"; } else if (is_eq(name, "xsd__positiveInteger")) { p->property = 5; p->pattern = "\\+?\\d*[1-9]\\d*"; } else if (is_eq(name, "xsd__time")) { p->property = 5; p->pattern = "\\d{2}:\\d{2}:\\d{2}(Z|[-+]\\d{2}:\\d{2})?"; } } int is_qname(Tnode *p) { if (!is_string(p) && !is_wstring(p)) return 0; if (p->property == 2) return 1; if (p->sym && (is_eq(p->sym->name, "xsd__QName") || is_eq(p->sym->name, "QName"))) return 1; return p->id && (is_eq(p->id->name, "xsd__QName") || is_eq(p->id->name, "QName")); } int is_stdqname(Tnode *p) { if (!is_stdstring(p) && !is_stdwstring(p)) return 0; if (p->property == 2) return 1; if (p->sym && (is_eq(p->sym->name, "xsd__QName") || is_eq(p->sym->name, "QName"))) return 1; return p->id && (is_eq(p->id->name, "xsd__QName") || is_eq(p->id->name, "QName")); } int is_XML(Tnode *p) { if (is_synonym(p)) return (is_string(p) || is_wstring(p)) && is_eq(p->synonym->name, "XML"); return (p->sym && (is_string(p) || is_wstring(p)) && is_eq(p->sym->name, "XML")) || ((p->type == Tpointer || p->type == Treference || p->type == Trvalueref) && is_XML((Tnode*)p->ref)); } int is_stdXML(Tnode *p) { if (is_synonym(p)) return (is_stdstring(p) || is_stdwstring(p)) && is_eq(p->synonym->name, "XML"); return p->sym && (is_stdstring(p) || is_stdwstring(p)) && is_eq(p->sym->name, "XML"); } int is_response(Tnode *p) { return (p->type == Tpointer || p->type == Treference || p->type == Trvalueref) && p->ref && has_ns((Tnode*)p->ref) && ((((Tnode*)p->ref)->type == Tstruct || ((Tnode*)p->ref)->type == Tclass) && !is_external((Tnode*)p->ref) && !is_primclass((Tnode*)p->ref) && !is_dynamic_array((Tnode*)p->ref) && !is_stdstring((Tnode*)p->ref) && !is_stdwstring((Tnode*)p->ref)); } Entry* get_response(Tnode *p) { if (p->type == Tfun) return p->response; return 0; } int is_unmatched(Symbol *sym) { const char *s = sym->name; if (*s == ':') s++; return s[0] == '_' && s[1] != '_' && strncmp(s, "_DOT", 4) && strncmp(s, "_USCORE", 7) && (strncmp(s, "_x", 2) || !isxdigit(s[2]) || !isxdigit(s[3]) || !isxdigit(s[4]) || !isxdigit(s[5])); } int is_invisible(const char *name) { return name[0] == '-' || (name[0] == '_' && name[1] == '_' && strncmp(name, "__ptr", 5)); } int is_invisible_empty(Tnode *p) { if (p->type == Tstruct || p->type == Tclass) if (is_invisible(p->id->name)) if (!p->ref || !((Table*)p->ref)->list) return 1; return 0; } int is_element(Tnode *typ) { if (is_XML(typ) || is_stdXML(typ) || is_qname(typ) || is_stdqname(typ)) return 0; if (typ->sym) return is_unmatched(typ->sym); if (typ->type == Tstruct || typ->type == Tclass) return is_unmatched(typ->id); return 0; } int is_untyped(Tnode *typ) { Tnode *p; if (typ->sym) return is_unmatched(typ->sym); if (typ->type == Tpointer || typ->type == Treference || typ->type == Trvalueref || typ->type == Tarray) return is_untyped((Tnode*)typ->ref); if (typ->type == Tstruct || typ->type == Tclass) { if (is_dynamic_array(typ) && !has_ns(typ) && !is_binary(typ)) { p = (Tnode*)((Table*)typ->ref)->list->info.typ->ref; return is_untyped(p); } else return is_unmatched(typ->id); } return 0; } int is_primclass(Tnode *typ) { Table *t; if (typ->type == Tstruct || typ->type == Tclass) { if (!is_dynamic_array(typ)) { t = (Table*)typ->ref; while (t) { Entry *p = t->list; while (p && !is_item(p)) p = p->next; if (p) break; t = t->prev; } if (!t) return 0; t = (Table*)typ->ref; while (t) { Entry *p; for (p = t->list; p; p = p->next) if (!is_item(p) && p->info.typ->type != Tfun && !is_transient(p->info.typ) && p->info.sto != Sattribute && p->info.sto != Sprivate && p->info.sto != Sprotected) return 0; t = t->prev; } return 1; } } else if (typ->type == Tpointer || typ->type == Treference || typ->type == Trvalueref) return is_primclass((Tnode*)typ->ref); return 0; } int is_mask(Tnode *typ) { return ((typ->type == Tenum || typ->type == Tenumsc) && typ->width == 9); } int is_void(Tnode *typ) { if (!typ) return 1; if (typ->type == Tvoid) return 1; if (typ->type == Tpointer || typ->type == Treference || typ->type == Trvalueref || typ->type == Tarray || typ->type == Ttemplate) return is_void((Tnode*)typ->ref); return 0; } int is_pointer_to_derived(Entry *e) { if (is_soapref(e->info.typ)) return 0; if (e->info.typ->type == Tpointer && !(e->info.sto & (Sconst | Sprivate | Sprotected)) && is_transient(e->info.typ)) { Tnode *ref = e->info.typ->ref; if (ref && ref->id && !is_transient(ref)) { if (ref->sym) return is_eq(ref->sym->name, e->sym->name); return is_eq(ref->id->name, e->sym->name); } } return 0; } void gen_match_derived(FILE *fd, Tnode *typ) { fprintf(fd, "!soap_match_tag(soap, soap->type, \"%s\")", xsi_type(typ)); if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref && !is_transient(typ)) { Entry *p; for (p = ((Table*)typ->ref)->list; p; p = p->next) { if (is_pointer_to_derived(p)) { fprintf(fout, " || "); gen_match_derived(fd, p->info.typ->ref); } } } } Entry * base_type_of_derived(Tnode *typ) { Entry *base = NULL; if ((typ->type == Tstruct || typ->type == Tclass) && !is_transient(typ)) { Entry *p; for (p = classtable->list; p; p = p->next) { if ((p->info.typ->type == Tstruct || p->info.typ->type == Tclass) && !is_transient(p->info.typ) && p->info.typ->ref) { Entry *e; for (e = ((Table*)p->info.typ->ref)->list; e; e = e->next) { if (is_pointer_to_derived(e) && e->info.typ->ref == typ) { if (!base) { base = p; } else { sprintf(errbuf, "%s declared at %s:%d has multiple base types, including %s", c_type(typ), p->filename, p->lineno, base->sym->name); semwarn(errbuf); } } } } } } return base; } int is_transient(Tnode *typ) { if (!typ) return 1; if (typ->type == Tstruct && typ->id == lookup("soap")) return 1; if (is_external(typ) || is_volatile(typ)) return 0; if (typ->transient > 0) return 1; if (is_wstring(typ)) /* wchar_t* is serializable but wchar_t is transient */ return 0; switch (typ->type) { case Tpointer: case Treference: case Trvalueref: case Tarray: case Ttemplate: return is_transient((Tnode*)typ->ref); case Tnone: case Tvoid: case Twchar: /* wchar_t is transient */ case Tsize: /* size_t is transient */ return 1; default: break; } return 0; } int is_imported(Tnode* typ) { return typ->imported != NULL; } int is_external(Tnode* typ) { return typ->transient == -1 || typ->transient == -3; } int is_anyType(Tnode* typ) { if (!typ) return 0; if (typ->type == Tpointer || typ->type == Ttemplate) return is_anyType((Tnode*)typ->ref); if (is_external(typ) && typ->type == Tstruct && !strcmp(typ->id->name, "soap_dom_element")) return is_anyType_flag = 1; return 0; } int is_anyAttribute(Tnode* typ) { if (!typ) return 0; if (typ->type == Tpointer || typ->type == Ttemplate) return is_anyAttribute((Tnode*)typ->ref); return is_external(typ) && typ->type == Tstruct && !strcmp(typ->id->name, "soap_dom_attribute"); } int is_volatile(Tnode* typ) { return typ->transient == -2 || typ->transient == -3; } int is_smart(Tnode *p) { return p->type == Ttemplate && p->ref && is_volatile(p); } int is_smart_shared(Tnode *p) { if (is_smart(p)) { const char *s = strstr(p->id->name, "::"); if (s) return !strcmp(s, "::shared_ptr"); /* support shared_ptr STL and Boost */ } return 0; } const char * make_shared(Tnode *p) { const char *s = ""; /* should produce make_shared only if is_smart_shared(p) is true */ if (is_smart_shared(p)) { char *t; s = strstr(p->id->name, "::"); t = emalloc(s - p->id->name + 14); strncpy(t, p->id->name, s - p->id->name + 2); strcpy(t + (s - p->id->name) + 2, "make_shared"); s = t; } return s; } int is_container(Tnode *p) { if (p->type == Tpointer) return is_container((Tnode*)p->ref); return p->type == Ttemplate && !is_smart(p); } int is_template(Tnode *p) { if (p->type == Tpointer) return is_template((Tnode*)p->ref); return p->type == Ttemplate; } int is_repetition(Entry *p) { if (p) return p->next && p->next->info.typ->type == Tpointer && ((Tnode*)p->next->info.typ->ref)->type != Tvoid && (p->info.typ->type == Tint || p->info.typ->type == Tsize) && ((p->info.sto & Sspecial) || !strncmp(p->sym->name, "__size", 6)); return 0; } int is_item(Entry *p) { if (p) { int n; const char *s = p->sym->name; for (n = strlen(s) - 1; n && s[n] == '_'; n--) ; return !strncmp(s, "__item", n + 1); } return 0; } int is_self(Entry *p) { if (p) { int n; const char *s = p->sym->name; for (n = strlen(s) - 1; n && s[n] == '_'; n--) ; return !strncmp(s, "__self", n + 1); } return 0; } int is_choice(Entry *p) { if (p) if (p->next && p->next->info.typ->type == Tunion && p->info.typ->type == Tint && ((p->info.sto & Sspecial) || !strncmp(p->sym->name, "__union", 7))) return 1; return 0; } int required_choice(Tnode *typ) { if (typ->type == Tunion && ((Table*)typ->ref)) { Entry *p; for (p = ((Table*)typ->ref)->list; p; p = p->next) { if (!(p->info.sto & (Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && (!(p->info.sto & Sattribute)) && !is_repetition(p) && !is_anytype(p)) { if (p->info.minOccurs <= 0) return 0; } } } return -1; } int is_sequence(Entry *p) { if (p) { Tnode *q = p->info.typ; if (q->type == Tpointer) q = (Tnode*)q->ref; if ((q->type == Tstruct || q->type == Tclass) && is_invisible(p->sym->name) && is_invisible(q->id->name) && !is_transient(q)) return 1; } return 0; } int is_anytype(Entry *p) { if (p) { if (p->next && p->next->info.typ->type == Tpointer && ((Tnode*)p->next->info.typ->ref)->type == Tvoid && p->info.typ->type == Tint && ((p->info.sto & Sspecial) || !strncmp(p->sym->name, "__type", 6))) { is_anytype_flag = 1; return 1; } } return 0; } int is_keyword(const char *name) { Symbol *s = lookup(name); if (s) return s->token != ID; return 0; } int has_ptr(Tnode *typ) { Tnode *p; if (typ->type == Tpointer || typ->type == Treference || typ->type == Trvalueref) return 0; for (p = Tptr[Tpointer]; p; p = p->next) if ((Tnode*)p->ref == typ && p->transient != 1) return 1; return 0; } int has_detail_string(void) { Entry *p = entry(classtable, lookup("SOAP_ENV__Fault")); if (p && p->info.typ->ref && (p->info.typ->type == Tstruct || p->info.typ->type == Tclass)) { Entry *e = entry((Table*)p->info.typ->ref, lookup("detail")); if (e && e->info.typ->ref && e->info.typ->type == Tpointer && ((Tnode*)e->info.typ->ref)->type == Tstruct) { Entry *e2 = entry((Table*)((Tnode*)e->info.typ->ref)->ref, lookup("__any")); return e2 && is_string(e2->info.typ); } } return 0; } int has_Detail_string(void) { Entry *p = entry(classtable, lookup("SOAP_ENV__Fault")); if (p && p->info.typ->ref && (p->info.typ->type == Tstruct || p->info.typ->type == Tclass)) { Entry *e = entry((Table*)p->info.typ->ref, lookup("SOAP_ENV__Detail")); if (e && e->info.typ->ref && e->info.typ->type == Tpointer && ((Tnode*)e->info.typ->ref)->type == Tstruct) { Entry *e2 = entry((Table*)((Tnode*)e->info.typ->ref)->ref, lookup("__any")); return e2 && is_string(e2->info.typ); } } return 0; } int has_class(Tnode *typ) { Entry *p; if (!cflag && typ->type == Tstruct && typ->ref) { for (p = ((Table*)typ->ref)->list; p; p = p->next) { if (p->info.sto & Stypedef) continue; if (p->info.typ->type == Tclass || p->info.typ->type == Ttemplate) return 1; if (p->info.typ->type == Tstruct && has_class(p->info.typ)) return 1; } } return 0; } int has_external(Tnode *typ) { Entry *p; if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) { for (p = ((Table*)typ->ref)->list; p; p = p->next) { if (p->info.typ->type == Tstruct || p->info.typ->type == Tclass) { if (is_external(p->info.typ) || has_external(p->info.typ)) return 1; } } } return 0; } int has_volatile(Tnode *typ) { Entry *p; if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) { for (p = ((Table*)typ->ref)->list; p; p = p->next) { if (p->info.typ->type == Tstruct || p->info.typ->type == Tclass) { if (is_volatile(p->info.typ) || has_volatile(p->info.typ)) if (!is_stdstr(p->info.typ)) return 1; } } } return 0; } int has_ns(Tnode *typ) { if (typ->type == Tstruct || typ->type == Tclass || typ->type == Tenum || typ->type == Tenumsc) return has_ns_eq(NULL, typ->id->name); return 0; } int has_ns_t(Tnode *typ) { if (typ->sym) return has_ns_eq(NULL, typ->sym->name); return has_ns(typ); } /* needs_lang adds xml:lang attribute to matching struct/class member name we should use an annotation for soapcpp2's input this in the future instead of a hard-coded member name */ void needs_lang(Entry *e) { if (!strcmp(e->sym->name, "SOAP_ENV__Text")) fprintf(fout, "\n\tif (soap->lang)\n\t\tsoap_set_attr(soap, \"xml:lang\", soap->lang, 1);"); } int is_eq_nons(const char *s, const char *t) { size_t n, m; const char *r; while (*s == '_' || *s == ':') s++; while (*t == '_' || *t == ':') t++; if (!*s || !*t) return 0; r = strstr(t, "__"); if (r) t = r + 2; n = strlen(s) - 1; m = strlen(t) - 1; #ifdef SOAP_OLD_DIRECTIVE_NAME_MATCHING while (n > 0 && s[n] == '_') n--; while (m > 0 && t[m] == '_') m--; #endif if (n != m) return 0; return !strncmp(s, t, n + 1); } int is_eq(const char *s, const char *t) { size_t n, m; while (*s == '_' || *s == ':') s++; while (*t == '_' || *t == ':') t++; if (!*s || !*t) return 0; for (n = strlen(s) - 1; n && s[n] == '_'; n--) ; for (m = strlen(t) - 1; m && t[m] == '_'; m--) ; if (n != m) return 0; return !strncmp(s, t, n + 1); } int has_ns_eq(const char *ns, const char *s) { size_t n; while (*s == '_' || *s == ':') s++; if (!ns) { const char *t = *s ? strstr(s + 1, "__") : NULL; if (!t || (t[2] == 'x' && isxdigit(t[3]) && isxdigit(t[4]) && isxdigit(t[5]) && isxdigit(t[6])) || !strncmp(t+2, "DOT", 3) || !strncmp(t+2, "USCORE", 6)) { t = strchr(s, ':'); if (t && t[1] == ':') t = NULL; } return t && t[1] && t[2] && ( t[2] != '_' || (t[3] == 'x' && isxdigit(t[3]) && isxdigit(t[4]) && isxdigit(t[5]) && isxdigit(t[6])) || !strncmp(t+3, "DOT", 3) || !strncmp(t+3, "USCORE", 6)); } if ((n = strlen(ns)) < strlen(s)) return ((s[n] == '_' && s[n+1] == '_') || (s[n] == ':' && s[n+1] != ':')) && !tagncmp(ns, s, n); return 0; } const char * strict_check(void) { if (sflag) return ""; return "(soap->mode & SOAP_XML_STRICT) && "; } void fixed_check(FILE *fd, Entry *e, Table *t, const char *tabs) { const char *name = NULL; const char *type = NULL; char *buf; Tnode *p = e->info.typ; if (!e || (!e->info.hasval && !e->info.ptrval) || !e->info.fixed) return; name = ident(e->sym->name); if (t) type = ident(t->sym->name); buf = emalloc(2*strlen(name) + 2*(t ? strlen(type) + 2 : 0) + 20); if (e->info.ptrval) strcpy(buf, "(*a->"); else strcpy(buf, "a->"); if (t) { strcat(buf, type); strcat(buf, "::"); } strcat(buf, name); if (e->info.ptrval) strcat(buf, ")"); fprintf(fd, "\n%sif (*soap->href != '#' && (%s", tabs, strict_check()); if (e->info.ptrval) { fprintf(fd, "a->"); if (t) fprintf(fd, "%s::", type); fprintf(fd, "%s", name); if (is_smart(e->info.typ)) fprintf(fd, ".get()"); fprintf(fd, " && "); p = p->ref; } switch (p->type) { case Tchar: case Twchar: case Tuchar: case Tshort: case Tushort: case Tint: case Tuint: case Ttime: fprintf(fd, "%s != " SOAP_LONG_FORMAT, buf, e->info.val.i); break; case Tlong: fprintf(fd, "%s != " SOAP_LONG_FORMAT "L", buf, e->info.val.i); break; case Tulong: fprintf(fd, "%s != " SOAP_LONG_FORMAT "UL", buf, e->info.val.i); break; case Tllong: fprintf(fd, "%s != " SOAP_LONG_FORMAT "LL", buf, e->info.val.i); break; case Tullong: case Tsize: fprintf(fd, "%s != " SOAP_LONG_FORMAT "ULL", buf, e->info.val.i); break; case Tfloat: case Tdouble: fprintf(fd, "%s != %g", buf, e->info.val.r); break; case Tldouble: fprintf(fd, "%s != %gL", buf, e->info.val.r); break; case Tenum: case Tenumsc: if (e->info.val.i <= 0x7FFFLL && e->info.val.i >= -0x8000LL) fprintf(fd, "%s != (%s)" SOAP_LONG_FORMAT, buf, c_type(p), e->info.val.i); else fprintf(fd, "%s != (%s)" SOAP_LONG_FORMAT "LL", buf, c_type(p), e->info.val.i); break; default: if (is_stdstring(p) && e->info.val.s) fprintf(fd, "%s.compare(\"%s\")", buf, cstring(e->info.val.s, 0)); else if (is_stdwstring(p) && e->info.val.s) fprintf(fd, "%s.compare(L\"%s\")", buf, cstring(e->info.val.s, 0)); else if (is_wstring(p) && e->info.val.s) fprintf(fd, "wcscmp(%s, L\"%s\")", buf, cstring(e->info.val.s, 0)); else if (is_string(p) && e->info.val.s) fprintf(fd, "strcmp(%s, \"%s\")", buf, cstring(e->info.val.s, 0)); else fprintf(fd, "0"); break; } fprintf(fd, "))\n%s{\tsoap->error = SOAP_FIXED;\n%s\treturn NULL;\n%s}", tabs, tabs, tabs); } const char * ns_of(const char *name) { Service *sp; for (sp = services; sp; sp = sp->next) if (has_ns_eq(sp->ns, name)) break; if (sp) return sp->URI; return NULL; } int eq_ns(const char *s, const char *t) { return ns_of(s) == ns_of(t); } const char * prefix_of(const char *s) { const char *t; if (*s == ':' && s[1] != ':') return NULL; while (*s == '_' || *s == ':') s++; t = *s ? strstr(s + 1, "__") : NULL; if (!t) { t = strchr(s, ':'); if (t && t[1] == ':') t = NULL; } if (t && t[1] && t[2] && t[2] != '_') { char *r = (char*)emalloc(t - s + 1); strncpy(r, s, t - s); r[t - s] = '\0'; return r; } return NULL; } const char * ns_add_overridden(Table *t, Entry *p, const char *ns) { Entry *q; Symbol *s = t->sym; if (s) { do { for (q = t->list; q; q = q->next) if (!strcmp(q->sym->name, p->sym->name)) return ns_add(p, ns ? prefix_of(t->sym->name) : NULL); } while ((t = t->prev) != NULL); } return ns_add(p, ns); } const char * c_ident(Tnode *typ) { if (typ->sym && strcmp(typ->sym->name, "/*?*/")) return res_remove(typ->sym->name); return t_ident(typ); } const char * soap_type(Tnode *typ) { const char *t = c_ident(typ); char *s; if (namespaceid && (Qflag || !is_external(typ))) { s = (char*)emalloc(strlen(t) + strlen(namespaceid) + 12); strcpy(s, "SOAP_TYPE_"); strcat(s, namespaceid); strcat(s, "_"); } else { s = (char*)emalloc(strlen(t) + 11); strcpy(s, "SOAP_TYPE_"); } strcat(s, t); return s; } const char * soap_union_member(Tnode *typ, Entry *p) { const char *t = c_ident(typ); const char *n = ident(p->sym->name); char *s; if (namespaceid && (zflag == 0 || zflag > 3)) { s = (char*)emalloc(strlen(t) + strlen(n) + strlen(namespaceid) + 14); strcpy(s, "SOAP_UNION_"); strcat(s, namespaceid); strcat(s, "_"); } else { s = (char*)emalloc(strlen(t) + strlen(n) + 13); strcpy(s, "SOAP_UNION_"); } strcat(s, t); strcat(s, "_"); strcat(s, n); return s; } const char * ident(const char *name) { if (name) { const char *s = strrchr(name, ':'); if (s && *(s+1) && (s == name || *(s-1) != ':')) return s+1; } return name; } /*t_ident gives the base type name (e.g. when typedef'ed) of a type in identifier format*/ const char * t_ident(Tnode *typ) { char *p; const char *q; if (typ->extsym) return ident(typ->extsym->name); if (typ->restriction) return ident(typ->restriction->name); switch(typ->type) { case Tnone: return ""; case Tvoid: return "void"; case Tchar: return "byte"; case Twchar: return "wchar"; case Tshort: return "short"; case Tint: return "int"; case Tlong: return "long"; case Tllong: return "LONG64"; case Tfloat: return "float"; case Tdouble: return "double"; case Tldouble: return "decimal"; case Tuchar: return "unsignedByte"; case Tushort: return "unsignedShort"; case Tuint: return "unsignedInt"; case Tulong: return "unsignedLong"; case Tullong: return "ULONG64"; case Tsize: return "size_t"; case Ttime: return "dateTime"; case Tstruct: case Tclass: case Tunion: case Tenum: if (is_bool(typ)) return "bool"; case Tenumsc: return res_remove(typ->id->name); case Treference: case Trvalueref: return c_ident((Tnode*)typ->ref); case Tpointer: if (is_string(typ)) return "string"; if (is_wstring(typ)) return "wstring"; p = (char*)emalloc((10+strlen(q = c_ident((Tnode*)typ->ref))) * sizeof(char)); strcpy(p, "PointerTo"); strcat(p, q); return p; case Tarray: p = (char*)emalloc((16+strlen(c_ident((Tnode*)typ->ref))) * sizeof(char)); if (((Tnode*)typ->ref)->width) sprintf(p, "Array%dOf%s", typ->width / ((Tnode*) typ->ref)->width, c_ident((Tnode*)typ->ref)); else sprintf(p, "ArrayOf%s", c_ident((Tnode*)typ->ref)); return p; case Ttemplate: if (typ->ref) { p = (char*)emalloc((11+strlen(res_remove(typ->id->name))+strlen(q = c_ident((Tnode*)typ->ref))) * sizeof(char)); strcpy(p, res_remove(typ->id->name)); strcat(p, "TemplateOf"); strcat(p, q); return p; } case Tfun: return "Function"; } return "anyType"; } void utf8(char **t, long c) { if (c < 0x0080) *(*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'; } const char * ns_tag_convert(Entry *p) { if (p->tag) return p->tag; return ns_convert(p->sym->name); } const char * ns_convert(const char *tag) { const char *t; char *s; size_t i, n; if (*tag == ':') tag++; if (*tag == '_') { if (!strncmp(tag, "__ptr", 5)) { if (tag[5]) tag += 5; else tag = "item"; } else if (strncmp(tag, "_DOT", 4) && strncmp(tag, "_USCORE", 7) && (strncmp(tag, "_x", 2) || !isxdigit(tag[2]) || !isxdigit(tag[3]) || !isxdigit(tag[4]) || !isxdigit(tag[5]))) tag++; /* skip leading _ */ } for (n = strlen(tag); n > 0; n--) { if (tag[n-1] != '_') break; } t = s = (char*)emalloc(n+1); for (i = 0; i < n; i++) { if (tag[i] == '_') { if (tag[i+1] == '_' && !(tag[i+2] == 'x' && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5]) && isxdigit(tag[i+6]))) break; else if (!strncmp(tag+i, "_DOT", 4)) { *s++ = '.'; i += 3; } else if (!strncmp(tag+i, "_USCORE", 7)) { *s++ = '_'; i += 6; } else if (!strncmp(tag+i, "_x", 2) && isxdigit(tag[i+2]) && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5])) { char d[5]; strncpy(d, tag+i+2, 4); d[4] = '\0'; utf8(&s, strtoul(d, NULL, 16)); i += 5; } else *s++ = '-'; } else if (!strncmp(tag+i, "\\u", 2) && isxdigit(tag[i+2]) && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5])) { char d[5]; strncpy(d, tag+i+2, 4); d[4] = '\0'; utf8(&s, strtoul(d, NULL, 16)); i += 5; } else if (tag[i] == ':' && tag[i+1] == ':') break; else *s++ = tag[i]; } if (i < n) { *s++ = ':'; for (i += 2; i < n; i++) { if (tag[i] == '_') { if (!strncmp(tag+i, "_DOT", 4)) { *s++ = '.'; i += 3; } else if (!strncmp(tag+i, "_USCORE", 7)) { *s++ = '_'; i += 6; } else if (!strncmp(tag+i, "_x", 2) && isxdigit(tag[i+2]) && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5])) { char d[5]; strncpy(d, tag+i+2, 4); d[4] = '\0'; utf8(&s, strtoul(d, NULL, 16)); i += 5; } else *s++ = '-'; } else if (!strncmp(tag+i, "\\u", 2) && isxdigit(tag[i+2]) && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5])) { char d[5]; strncpy(d, tag+i+2, 4); d[4] = '\0'; utf8(&s, strtoul(d, NULL, 16)); i += 5; } else *s++ = tag[i]; } } *s = '\0'; return t; } const char * res_remove(const char *tag) { char *s; const char *t; if (!(t = strchr(tag, ':'))) return tag; if (t[1] != ':') tag = t + 1; if (!strchr(tag, ':')) return tag; s = (char*)emalloc(strlen(tag) + 1); t = strcpy(s, tag); while ((s = strchr(s, ':'))) *s = '_'; return t; } const char * ns_qualifiedElement(Tnode *typ) { const char *s = NULL; if (typ->sym) s = typ->sym->name; if (!s && typ->id) s = typ->id->name; return ns_qualifiedElementName(s); } const char * ns_qualifiedElementName(const char *s) { Service *sp; if (!s) return NULL; s = prefix_of(s); if (!s) return NULL; for (sp = services; sp; sp = sp->next) { if (sp->elementForm && !tagcmp(sp->ns, s)) { if (!strcmp(sp->elementForm, "qualified")) return s; return NULL; } } return NULL; } const char * ns_qualifiedAttribute(Tnode *typ) { const char *s = NULL; if (typ->sym) s = typ->sym->name; if (!s && typ->id) s = typ->id->name; return ns_qualifiedAttributeName(s); } const char * ns_qualifiedAttributeName(const char *s) { Service *sp; if (!s) return NULL; s = prefix_of(s); if (!s) return NULL; for (sp = services; sp; sp = sp->next) { if (sp->attributeForm && !tagcmp(sp->ns, s)) { if (!strcmp(sp->attributeForm, "qualified")) return s; return NULL; } } return NULL; } const char * field(Entry *p, const char *ns) { const char *r; char *s; if (is_self(p)) return "tag"; r = ns_add(p, ns); s = (char*)emalloc(strlen(r) + 3); strcpy(s, "\""); strcat(s, r); strcat(s, "\""); return s; } const char * field_overridden(Table *t, Entry *p, const char *ns) { const char *r; char *s; if (is_self(p)) return "tag"; r = ns_add_overridden(t, p, ns); s = (char*)emalloc(strlen(r) + 3); strcpy(s, "\""); strcat(s, r); strcat(s, "\""); return s; } const char * ns_add(Entry *p, const char *ns) { if (p->tag) return ns_addx(p->tag, ns); if (*p->sym->name == ':') return ns_convert(p->sym->name); return ns_addx(ns_convert(p->sym->name), ns); } const char * ns_addx(const char *tag, const char *ns) { const char *n; char *t; const char *s = tag; if (*s == ':') return s+1; if (!ns || *s == '-' || strchr(s, ':')) return s; n = ns_convert(ns); t = (char*)emalloc(strlen(n) + strlen(s) + 2); strcpy(t, n); strcat(t, ":"); strcat(t, s); return t; } const char * ns_name(const char *tag) { const char *t, *r, *s = tag; if (*s) { for (r = s+strlen(s)-1; r > s; r--) if (*r != '_') break; for (t = s + 1; t < r; t++) { if (t[0] == '_' && t[1] == '_') { s = t + 2; t++; } else if (t[0] == ':' && t[1] != ':') { s = t + 1; t++; } } } return s; } const char * ns_cname(const char *tag, const char *suffix) { char *s; const char *t; size_t i, n; if (!tag) return NULL; t = ns_name(tag); n = strlen(t); if (suffix) s = (char*)emalloc(n + strlen(suffix) + 2); else s = (char*)emalloc(n + 2); for (i = 0; i < n; i++) { if (!isalnum(t[i])) s[i] = '_'; else s[i] = t[i]; } s[i] = '\0'; if (suffix) strcat(s, suffix); if (is_keyword(t)) strcat(s, "_"); return s; } const char * ns_fname(const char *tag) { char *s; size_t i; s = (char*)emalloc(strlen(tag) + 1); strcpy(s, tag); for (i = 0; s[i]; i++) if (!isalnum(s[i])) s[i] = '_'; return s; } const char * ns_tag_remove(Entry *p) { if (p->tag) { const char *s = strchr(p->tag, ':'); if (s) return s + 1; return p->tag; } return ns_remove(p->sym->name); } const char * ns_remove(const char *tag) { return ns_convert(ns_name(tag)); } const char * ns_remove1(const char *tag) { const char *t, *s = tag; int n = 2; if (*s) { for (t = s + 1; *t && n; t++) if (t[0] == '_' && t[1] == '_') { s = t + 2; t++; n--; } if (n || (s[0] == '_' && s[1] != 'x' && strncmp(s, "_USCORE", 7)) || !*s) s = tag; } return s; } const char * ns_remove2(const char *tag, const char *type) { return ns_convert(ns_remove3(tag, type)); } const char * ns_remove3(const char *tag, const char *type) { size_t n; if (tag && type && !strncmp(tag, type, n = strlen(type)) && strlen(tag) > n + 2 && tag[n] == '_' && tag[n + 1] == '_') return tag + n + 2; return tag; } const char * xsi_type_u(Tnode *typ) { Service *sp; const char *s; if (tflag) return xsi_type(typ); s = xsi_type(typ); for (sp = services; sp; sp = sp->next) if (sp->xsi_type && has_ns_eq(sp->ns, s)) return s; return ""; } const char * xsi_type(Tnode *typ) { if (!typ) return "NULL"; if (is_dynamic_array(typ) && !has_ns(typ) && !is_binary(typ)) return xsi_type_Darray(typ); if (typ->type == Tarray) return xsi_type_Tarray(typ); if ((is_qname(typ) || is_stdqname(typ))) return "xsd:QName"; if (is_untyped(typ)) return ""; if (typ->sym) { if (!strncmp(typ->sym->name, "SOAP_ENV__", 10)) return ""; if (is_XML(typ)) return "xsd:anyType"; if (typ->type != Ttemplate) return ns_convert(typ->sym->name); } if (is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ)) return "xsd:string"; switch(typ->type) { case Tvoid: return "xsd:anyType"; case Tchar: return "xsd:byte"; case Twchar: return "wchar"; case Tshort: return "xsd:short"; case Tint: return "xsd:int"; case Tlong: case Tllong: return "xsd:long"; case Tfloat: return "xsd:float"; case Tdouble: return "xsd:double"; case Tldouble: return "xsd:decimal"; case Tuchar: return "xsd:unsignedByte"; case Tushort: return "xsd:unsignedShort"; case Tuint: return "xsd:unsignedInt"; case Tulong: case Tullong: return "xsd:unsignedLong"; case Ttime: return "xsd:dateTime"; case Tpointer: case Treference: case Trvalueref: return xsi_type((Tnode*)typ->ref); case Tenum: if (is_bool(typ)) return "xsd:boolean"; case Tenumsc: case Tstruct: case Tclass: if (!strncmp(typ->id->name, "SOAP_ENV__", 10)) return ""; return ns_convert(typ->id->name); case Ttemplate: if ((Tnode*)typ->ref) return xsi_type((Tnode*)typ->ref); break; default: break; } return ""; } const char * xml_tag(Tnode *typ) { if (!typ) return "NULL"; if ((typ->type == Tpointer && !is_string(typ) && !is_wstring(typ)) || typ->type == Treference || typ->type == Trvalueref) return xml_tag((Tnode*)typ->ref); if (typ->sym) return ns_convert(typ->sym->name); return the_type(typ); } const char * wsdl_type(Tnode *typ, const char *ns) { if (!typ) return "NULL"; if ((is_qname(typ) || is_stdqname(typ)) && ns) return "xsd:QName"; if (typ->sym) { if (is_XML(typ)) return "xsd:anyType"; else if (ns) return ns_convert(typ->sym->name); else return ns_remove(typ->sym->name); } return base_type(typ, ns); } const char * base_type(Tnode *typ, const char *ns) { int d; const char *s; char *t; if (typ->restriction) { if (ns) return ns_convert(typ->restriction->name); else return ns_remove(typ->restriction->name); } if (is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ) || is_fixedstring(typ)) { if (ns) return "xsd:string"; return "string"; } if (is_dynamic_array(typ) && !is_binary(typ) && !has_ns(typ) && !is_untyped(typ)) { s = ns_remove(wsdl_type(((Table*)typ->ref)->list->info.typ, NULL)); if (ns && *ns) { t = (char*)emalloc(strlen(s)+strlen(ns_convert(ns))+13); strcpy(t, ns_convert(ns)); strcat(t, ":"); strcat(t, "ArrayOf"); } else { t = (char*)emalloc(strlen(s)+12); strcpy(t, "ArrayOf"); } strcat(t, s); d = get_Darraydims(typ); if (d) sprintf(t+strlen(t), "%dD", d); return t; } switch (typ->type) { case Tvoid : if (ns) return "xsd:anyType"; return "anyType"; case Tchar : if (ns) return "xsd:byte"; return "byte"; case Tshort : if (ns) return "xsd:short"; return "short"; case Tint : if (ns) return "xsd:int"; return "int"; case Tlong : case Tllong : if (ns) return "xsd:long"; return "long"; case Tfloat: if (ns) return "xsd:float"; return "float"; case Tdouble: if (ns) return "xsd:double"; return "double"; case Tldouble: if (ns) return "xsd:decimal"; return "decimal"; case Tuchar: if (ns) return "xsd:unsignedByte"; return "unsignedByte"; case Tushort: if (ns) return "xsd:unsignedShort"; return "unsignedShort"; case Tuint: if (ns) return "xsd:unsignedInt"; return "unsignedInt"; case Tulong: case Tullong: if (ns) return "xsd:unsignedLong"; return "unsignedLong"; case Ttime: if (ns) return "xsd:dateTime"; return "dateTime"; case Tpointer: case Treference: case Trvalueref: return wsdl_type((Tnode*)typ->ref, ns); case Tarray: if (is_fixedstring(typ)) { if (typ->sym) { if (ns) return ns_convert(typ->sym->name); return ns_remove(typ->sym->name); } if (ns) return "xsd:string"; return "string"; } if (ns && *ns) { t = (char*)emalloc((strlen(ns_convert(ns))+strlen(c_ident(typ))+2) * sizeof(char)); strcpy(t, ns_convert(ns)); strcat(t, ":"); strcat(t, c_ident(typ)); return t; } else return c_ident(typ); case Tenum: if (is_bool(typ)) { if (ns) return "xsd:boolean"; return "boolean"; } case Tenumsc: case Tstruct: case Tclass: if (!has_ns(typ) && ns && *ns) { t = (char*)emalloc((strlen(ns_convert(ns))+strlen(typ->id->name)+2) * sizeof(char)); strcpy(t, ns_convert(ns)); strcat(t, ":"); strcat(t, ns_convert(typ->id->name)); return t; } else if (ns) return ns_convert(typ->id->name); else return ns_remove(typ->id->name); case Tunion: if (ns) return "xsd:choice"; return "choice"; case Ttemplate: if ((Tnode*)typ->ref) return wsdl_type((Tnode*)typ->ref, ns); break; default: break; } return ""; } const char * the_type(Tnode *typ) { if (!typ) return "NULL"; if (typ->type == Tarray || (is_dynamic_array(typ) && !is_binary(typ) && (eflag || (!has_ns(typ) && !is_untyped(typ))))) return "SOAP-ENC:Array"; if (is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ)) return "string"; switch (typ->type) { case Tchar: return "byte"; case Twchar: return "wchar"; case Tshort: return "short"; case Tint : return "int"; case Tlong : case Tllong : return "long"; case Tfloat: return "float"; case Tdouble: return "double"; case Tldouble: return "decimal"; case Tuchar: return "unsignedByte"; case Tushort: return "unsignedShort"; case Tuint: return "unsignedInt"; case Tulong: case Tullong: return "unsignedLong"; case Ttime: return "dateTime"; case Tpointer: case Treference: case Trvalueref: return the_type((Tnode*)typ->ref); case Tarray: return "SOAP-ENC:Array"; case Tenum: if (is_bool(typ)) return "boolean"; case Tenumsc: case Tstruct: case Tclass: return ns_convert(typ->id->name); default: break; } return ""; } /* c_type returns the type to be used in parameter declaration*/ const char * c_type(Tnode *typ) { char *p = NULL; const char *q, *r; Entry *e; if (typ == NULL) return "NULL"; switch (typ->type) { case Tnone: return ""; case Tvoid: return "void"; case Tchar: return "char"; case Twchar: return "wchar_t"; case Tshort: return "short"; case Tint : return "int"; case Tlong : return "long"; case Tllong : return "LONG64"; case Tfloat: return "float"; case Tdouble: return "double"; case Tldouble: return "long double"; case Tuchar: return "unsigned char"; case Tushort: return "unsigned short"; case Tuint: return "unsigned int"; case Tulong: return "unsigned long"; case Tullong: return "ULONG64"; case Tsize: return "size_t"; case Ttime: return "time_t"; case Tstruct: q = ident(typ->id->name); p = (char*)emalloc((8+strlen(q)) * sizeof(char)); strcpy(p, "struct "); strcat(p, q); return p; case Tclass: return ident(typ->id->name); case Tunion: q = ident(typ->id->name); p = (char*)emalloc((7+strlen(q)) * sizeof(char)); strcpy(p, "union "); strcat(p, q); return p; case Tenum: if (is_bool(typ)) return "bool"; q = ident(typ->id->name); p = (char*)emalloc((6+strlen(q)) * sizeof(char)); strcpy(p, "enum "); strcat(p, q); return p; case Tenumsc: return ident(typ->id->name); case Tpointer: return c_type_id((Tnode*)typ->ref, "*"); case Treference: return c_type_id((Tnode*)typ->ref, "&"); case Trvalueref: return c_type_id((Tnode*)typ->ref, "&&"); case Tarray: return c_type_id((Tnode*)typ->ref, "*"); case Tfun: p = (char*)emalloc(1024); strcpy(p, c_type(((FNinfo*)typ->ref)->ret)); strcat(p, "("); if (((FNinfo*)typ->ref)->args) { for (e = ((FNinfo*)typ->ref)->args->list; e; e = e->next) { strcat(p, c_storage(e->info.sto)); if (e->info.typ->type != Tvoid) { strcat(p, c_type_id(e->info.typ, e->sym->name)); strcat(p, c_init(e)); } else strcat(p, "void"); if (e->next) strcat(p, ", "); } } strcat(p, ")"); return p; case Ttemplate: if (typ->ref) { p = (char*)emalloc((strlen(q = c_type((Tnode*)typ->ref)) + strlen(r = ident(typ->id->name)) + 4) * sizeof(char)); strcpy(p, r); strcat(p, "<"); strcat(p, q); strcat(p, "> "); return p; } default: return "UnknownType"; } return p; } const char * c_storage(Storage sto) { static char buf[256]; buf[0] = '\0'; if (sto & Smutable) strcat(buf, "mutable "); if (sto & Sinline) strcat(buf, "inline "); if (sto & Sfriend) strcat(buf, "friend "); if (sto & Svirtual) strcat(buf, "virtual "); if (sto & Stypedef) strcat(buf, "typedef "); if (sto & Sexplicit) strcat(buf, "explicit "); if (sto & Sstatic) strcat(buf, "static "); if (sto & Sregister) strcat(buf, "register "); if (sto & Sauto) strcat(buf, "auto "); if (sto & Sconstptr) strcat(buf, "const "); if (sto & Sconst) strcat(buf, "const "); return buf; } const char * c_const(Storage sto) { if (sto & Sconst) return "const "; if (sto & Sconstptr) return "const "; return ""; } const char * c_init(Entry *e) { return c_init_a(e, " = "); } const char * c_init_a(Entry *e, const char *a) { static char buf[8196]; buf[0] = '\0'; if (e && (e->info.hasval || e->info.ptrval)) { Tnode *p = e->info.typ; if (e->info.ptrval) p = p->ref; switch (p->type) { case Tchar: case Twchar: case Tuchar: case Tshort: case Tushort: case Tint: case Tuint: case Ttime: case Tsize: sprintf(buf, "%s" SOAP_LONG_FORMAT, a, e->info.val.i); break; case Tlong: sprintf(buf, "%s" SOAP_LONG_FORMAT "L", a, e->info.val.i); break; case Tulong: sprintf(buf, "%s" SOAP_LONG_FORMAT "UL", a, e->info.val.i); break; case Tllong: sprintf(buf, "%s" SOAP_LONG_FORMAT "LL", a, e->info.val.i); break; case Tullong: sprintf(buf, "%s" SOAP_LONG_FORMAT "ULL", a, e->info.val.i); break; case Tfloat: case Tdouble: sprintf(buf, "%s%g", a, e->info.val.r); break; case Tldouble: sprintf(buf, "%s%gL", a, e->info.val.r); break; case Tenum: case Tenumsc: if (e->info.val.i <= 0x7FFFLL && e->info.val.i >= -0x8000LL) sprintf(buf, "%s(%s)" SOAP_LONG_FORMAT, a, c_type(p), e->info.val.i); else sprintf(buf, "%s(%s)" SOAP_LONG_FORMAT "LL", a, c_type(p), e->info.val.i); break; default: if (is_stdstring(p) && e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-6) sprintf(buf, "%s\"%s\"", a, cstring(e->info.val.s, 0)); else if (is_stdwstring(p) && e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-7) sprintf(buf, "%sL\"%s\"", a, cstring(e->info.val.s, 0)); else if (is_wstring(p) && e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-17) sprintf(buf, "%s(wchar_t*)L\"%s\"", a, cstring(e->info.val.s, 0)); else if (e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-13) sprintf(buf, "%s(char*)\"%s\"", a, cstring(e->info.val.s, 0)); else if (p->type == Tpointer) sprintf(buf, "%sNULL", a); break; } } return buf; } /* c_type_constptr_id returns the const* type to be used in parameter declaration */ const char * c_type_constptr_id(Tnode *typ, const char *name) { return c_type_id(typ, name); } /* c_type_id returns the type to be used in parameter declaration */ const char * c_type_id(Tnode *typ, const char *name) { const char *id; char *p = NULL; const char *q; char tempBuf[10]; Tnode *temp; Entry *e; if (!typ) return "NULL"; id = ident(name); switch (typ->type) { case Tnone: return id; case Tvoid: p = (char*)emalloc(6+strlen(id)); strcpy(p, "void "); strcat(p, id); break; case Tchar: p = (char*)emalloc(6+strlen(id)); strcpy(p, "char "); strcat(p, id); break; case Twchar: p = (char*)emalloc(9+strlen(id)); strcpy(p, "wchar_t "); strcat(p, id); break; case Tshort: p = (char*)emalloc(7+strlen(id)); strcpy(p, "short "); strcat(p, id); break; case Tint : p = (char*)emalloc(5+strlen(id)); strcpy(p, "int "); strcat(p, id); break; case Tlong : p = (char*)emalloc(6+strlen(id)); strcpy(p, "long "); strcat(p, id); break; case Tllong : p = (char*)emalloc(8+strlen(id)); strcpy(p, "LONG64 "); strcat(p, id); break; case Tfloat: p = (char*)emalloc(7+strlen(id)); strcpy(p, "float "); strcat(p, id); break; case Tdouble: p = (char*)emalloc(8+strlen(id)); strcpy(p, "double "); strcat(p, id); break; case Tldouble: p = (char*)emalloc(13+strlen(id)); strcpy(p, "long double "); strcat(p, id); break; case Tuchar: p = (char*)emalloc(15+strlen(id)); strcpy(p, "unsigned char "); strcat(p, id); break; case Tushort: p = (char*)emalloc(16+strlen(id)); strcpy(p, "unsigned short "); strcat(p, id); break; case Tuint: p = (char*)emalloc(14+strlen(id)); strcpy(p, "unsigned int "); strcat(p, id); break; case Tulong: p = (char*)emalloc(15+strlen(id)); strcpy(p, "unsigned long "); strcat(p, id); break; case Tullong: p = (char*)emalloc(9+strlen(id)); strcpy(p, "ULONG64 "); strcat(p, id); break; case Tsize: p = (char*)emalloc(8+strlen(id)); strcpy(p, "size_t "); strcat(p, id); break; case Ttime: p = (char*)emalloc(8+strlen(id)); strcpy(p, "time_t "); strcat(p, id); break; case Tstruct: q = ident(typ->id->name); p = (char*)emalloc((9+strlen(q)+strlen(id)) * sizeof(char)); strcpy(p, "struct "); strcat(p, q); strcat(p, " "); strcat(p, id); break; case Tclass: q = ident(typ->id->name); p = (char*)emalloc((2+strlen(q)+strlen(id)) * sizeof(char)); strcpy(p, q); strcat(p, " "); strcat(p, id); break; case Tunion: q = ident(typ->id->name); p = (char*)emalloc((8+strlen(q)+strlen(id)) * sizeof(char)); strcpy(p, "union "); strcat(p, q); strcat(p, " "); strcat(p, id); break; case Tenum: if (is_bool(typ)) { p = (char*)emalloc((strlen(id)+6)* sizeof(char)); strcpy(p, "bool "); strcat(p, id); return p; } q = ident(typ->id->name); p = (char*)emalloc((7+strlen(q)+strlen(id)) * sizeof(char)); strcpy(p, "enum "); strcat(p, q); strcat(p, " "); strcat(p, id); break; case Tenumsc: q = ident(typ->id->name); p = (char*)emalloc((7+strlen(q)+strlen(id)) * sizeof(char)); strcpy(p, q); strcat(p, " "); strcat(p, id); break; case Tpointer: p = (char*)emalloc(strlen(id)+2); p[0] = '*'; strcpy(p+1, id); return c_type_id((Tnode*)typ->ref, p); case Treference: p = (char*)emalloc(strlen(id)+2); p[0] = '&'; strcpy(p+1, id); return c_type_id((Tnode*)typ->ref, p); case Trvalueref: p = (char*)emalloc(strlen(id)+3); p[0] = '&'; p[1] = '&'; strcpy(p+2, id); return c_type_id((Tnode*)typ->ref, p); case Tarray: temp = typ; while (((Tnode*) (typ->ref))->type == Tarray) typ = (Tnode*)typ->ref; p = (char*)emalloc((12+strlen(q = c_type_id((Tnode*)typ->ref, id))) * sizeof(char)); strcpy(p, q); typ = temp; while (typ->type == Tarray) { if (((Tnode*) typ->ref)->width) { sprintf(tempBuf, "[%d]", (typ->width / ((Tnode*) typ->ref)->width)); strcat(p, tempBuf); } typ = (Tnode*)typ->ref; } break; case Tfun: if (id && strncmp(id, "operator ", 9)) q = c_type_id(((FNinfo*)typ->ref)->ret, id); else q = id; p = (char*)emalloc(1024); if (q) strcpy(p, q); strcat(p, "("); for (e = ((FNinfo*)typ->ref)->args->list; e; e = e->next) { strcat(p, c_storage(e->info.sto)); if (e->info.typ->type != Tvoid) { strcat(p, c_type_id(e->info.typ, e->sym->name)); strcat(p, c_init(e)); } else strcat(p, "void"); if (e->next) strcat(p, ", "); } strcat(p, ")"); break; case Ttemplate: if (typ->ref) { p = (char*)emalloc((strlen(q = c_type((Tnode*)typ->ref))+strlen(ident(typ->id->name))+strlen(id)+4) * sizeof(char)); strcpy(p, ident(typ->id->name)); strcat(p, "<"); strcat(p, q); strcat(p, "> "); strcat(p, id); break; } default: return "UnknownType"; } return p; } const char * c_type_sym(Tnode *typ) { if (typ->sym) return ident(typ->sym->name); return c_type(typ); } /* c_type_synonym_id returns the typedef synonym name as a type (if present) to be used in parameter declaration */ const char * c_type_synonym_id(Tnode *typ, const char *name) { if (typ->synonym) { const char *synonym = ident(typ->synonym->name); const char *id = ident(name); char *p = (char*)emalloc(strlen(synonym) + strlen(id) + 2); strcpy(p, synonym); strcat(p, " "); strcat(p, id); return p; } return c_type_id(typ, name); } const char * xsi_type_Tarray(Tnode *typ) { Tnode *t; int cardinality; char *p; const char *s; t = (Tnode*)typ->ref; if (is_fixedstring(typ)) { if (typ->sym) return ns_convert(typ->sym->name); return "xsd:string"; } cardinality = 1; while (t->type == Tarray || (is_dynamic_array(t) && !has_ns(t) && !is_untyped(t) && !is_binary(t))) { if (t->type == Tarray) t = (Tnode*)t->ref; else t = (Tnode*)((Table*)t->ref)->list->info.typ->ref; cardinality++; } s = xsi_type(t); if (!*s) s = wsdl_type(t, ""); p = (char*)emalloc(strlen(s)+cardinality+3); strcpy(p, s); if (cardinality > 1) { strcat(p, "["); for (; cardinality > 2; cardinality--) strcat(p, ", "); strcat(p, "]"); } return p; } const char * xsi_type_Darray(Tnode *typ) { Tnode *t; int cardinality; char *p; const char *s; Entry *q; if (!typ->ref) return ""; q = ((Table*)typ->ref)->list; while (q && q->info.typ->type == Tfun) q = q->next; t = (Tnode*)q->info.typ->ref; cardinality = 1; while (t->type == Tarray || (is_dynamic_array(t) && !has_ns(t) && !is_untyped(t) && !is_binary(t))) { if (t->type == Tarray) t = (Tnode*)t->ref; else { q = ((Table*)t->ref)->list; while (q && q->info.typ->type == Tfun) q = q->next; t = (Tnode*)q->info.typ->ref; } cardinality++; } s = xsi_type(t); if (!*s) s = wsdl_type(t, ""); p = (char*)emalloc(strlen(s)+cardinality*2+1); strcpy(p, s); if (cardinality > 1) { strcat(p, "["); for (; cardinality > 2; cardinality--) strcat(p, ", "); strcat(p, "]"); } return p; } void generate_type(Tnode *typ) { if (is_transient(typ) || typ->type == Twchar || is_void(typ)) return; if (lflag && typ->type == Tint && !typ->sym) { fprintf(fhead, "\n\n#ifndef %s_DEFINED", soap_type(typ)); fprintf(fhead, "\n#define %s_DEFINED", soap_type(typ)); fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_int(struct soap*, int*);"); fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_int(struct soap*, const char*, int, const int*, const char*);"); fprintf(fhead, "\nSOAP_FMAC1 int* SOAP_FMAC2 soap_in_int(struct soap*, const char*, int*, const char*);"); fprintf(fhead, "\n#endif"); return; /* do not generate int serializers in libs */ } else if (is_imported(typ) && (typ->type != Tint || typ->sym)) { return; } if (is_typedef(typ) && (is_element(typ) || is_synonym(typ))) fprintf(fhead, "\n/* %s is a typedef synonym of %s */", c_ident(typ), t_ident(typ)); else if (is_typedef(typ) && (is_element(typ) || is_restriction(typ))) fprintf(fhead, "\n/* %s is a typedef restriction of %s */", c_ident(typ), t_ident(typ)); if (is_primitive(typ) || is_string(typ) || is_wstring(typ)) { if (!Qflag && is_external(typ) && namespaceid) { const char *id = namespaceid; namespaceid = NULL; fprintf(fhead, "\n\n#ifndef %s_DEFINED", soap_type(typ)); fprintf(fhead, "\n#define %s_DEFINED", soap_type(typ)); namespaceid = id; fprintf(fhead, "\n\n}"); fprintf(fout, "\n\n}"); } else { fprintf(fhead, "\n\n#ifndef %s_DEFINED", soap_type(typ)); fprintf(fhead, "\n#define %s_DEFINED", soap_type(typ)); } fflush(fhead); soap_default(typ); soap_serialize(typ); if (Etflag) soap_traverse(typ); soap_out(typ); soap_in(typ); if (!Qflag && is_external(typ) && namespaceid) { fprintf(fhead, "\n\nnamespace %s {", namespaceid); fprintf(fout, "\n\nnamespace %s {", namespaceid); } if (is_string(typ) || is_wstring(typ)) { soap_dup(typ); soap_del(typ); } soap_instantiate(typ); soap_put(typ); soap_get(typ); fprintf(fhead, "\n#endif"); return; } switch(typ->type) { case Ttemplate: case Tpointer: case Tarray: case Tstruct: case Tclass: case Tunion: if (is_header_or_fault(typ) || is_body(typ)) { fprintf(fhead, "\n\n#ifndef WITH_NOGLOBAL"); fprintf(fout, "\n\n#ifndef WITH_NOGLOBAL"); } if (!Qflag && is_external(typ) && namespaceid) { const char *id = namespaceid; namespaceid = NULL; fprintf(fhead, "\n\n#ifndef %s_DEFINED", soap_type(typ)); fprintf(fhead, "\n#define %s_DEFINED", soap_type(typ)); namespaceid = id; fprintf(fhead, "\n\n}"); fprintf(fout, "\n\n}"); } else { fprintf(fhead, "\n\n#ifndef %s_DEFINED", soap_type(typ)); fprintf(fhead, "\n#define %s_DEFINED", soap_type(typ)); } fflush(fhead); soap_default(typ); soap_serialize(typ); if (Etflag) soap_traverse(typ); soap_out(typ); soap_in(typ); if (!Qflag && is_external(typ) && namespaceid) { fprintf(fhead, "\n\nnamespace %s {", namespaceid); fprintf(fout, "\n\nnamespace %s {", namespaceid); } soap_dup(typ); soap_del(typ); soap_instantiate(typ); soap_put(typ); soap_get(typ); fprintf(fhead, "\n#endif"); if (is_header_or_fault(typ) || is_body(typ)) { fprintf(fhead, "\n\n#endif"); fprintf(fout, "\n\n#endif"); } break; default: break; } } void matlab_gen_sparseStruct(void) { fprintf(fmheader, "\nstruct soapSparseArray{\n"); fprintf(fmheader, " int *ir;\n"); fprintf(fmheader, " int *jc;\n"); fprintf(fmheader, " double *pr;\n"); fprintf(fmheader, " int num_columns;\n"); fprintf(fmheader, " int num_rows;\n"); fprintf(fmheader, " int nzmax;\n"); fprintf(fmheader, "};\n"); } void matlab_c_to_mx_sparse(void) { fprintf(fmheader, "\nmxArray* c_to_mx_soapSparseArray(struct soapSparseArray);\n"); fprintf(fmatlab, "\nmxArray* c_to_mx_soapSparseArray(struct soapSparseArray a)\n"); fprintf(fmatlab, "{\n"); fprintf(fmatlab, " mxArray *b;\n"); fprintf(fmatlab, " b = mxCreateSparse(a.num_rows, a.num_columns, a.nzmax, mxREAL);\n"); fprintf(fmatlab, " mxSetIr(b,a.ir);\n"); fprintf(fmatlab, " mxSetJc(b,a.jc);\n"); fprintf(fmatlab, " mxSetPr(b,a.pr);\n"); fprintf(fmatlab, " return b;\n"); fprintf(fmatlab, "}\n"); } void matlab_mx_to_c_sparse(void) { fprintf(fmheader, "\nmxArray* mx_to_c_soapSparseArray(const mxArray *, struct soapSparseArray *);\n"); fprintf(fmatlab, "\nmxArray* mx_to_c_soapSparseArray(const mxArray *a, struct soapSparseArray *b)\n"); fprintf(fmatlab, "{\n"); fprintf(fmatlab, " if (!mxIsSparse(a))\n"); fprintf(fmatlab, " {\n"); fprintf(fmatlab, " mexErrMsgTxt(\"Input should be a sparse array.\");\n"); fprintf(fmatlab, " }\n"); fprintf(fmatlab, " /* Get the starting positions of the data in the sparse array. */ \n"); fprintf(fmatlab, " b->pr = mxGetPr(a);\n"); fprintf(fmatlab, " b->ir = mxGetIr(a);\n"); fprintf(fmatlab, " b->jc = mxGetJc(a);\n"); fprintf(fmatlab, " b->num_columns = mxGetN(a);\n"); fprintf(fmatlab, " b->num_rows = mxGetM(a);\n"); fprintf(fmatlab, " b->nzmax = mxGetNzmax(a);\n"); fprintf(fmatlab, "}\n"); } void matlab_mx_to_c_dynamicArray(Tnode* typ) { int d; Entry *p; p = is_dynamic_array(typ); fprintf(fmatlab, "{\n"); fprintf(fmatlab, "\tint i, numdims;\n"); fprintf(fmatlab, "\tconst int *dims;\n"); fprintf(fmatlab, "\tdouble *temp;\n"); fprintf(fmatlab, "\tint size = 1;\n"); fprintf(fmatlab, "\tint ret;\n"); fprintf(fmatlab, "\tnumdims = mxGetNumberOfDimensions(a);\n"); fprintf(fmatlab, "\tdims = mxGetDimensions(a);\n"); d = get_Darraydims(typ); fprintf(fmatlab, "\tif (numdims != %d)\n", d); fprintf(fmatlab, "\t\tmexErrMsgTxt(\"Incompatible array specifications in C and mx.\");\n"); /* fprintf(fmatlab, "\tfor (i=0;i__size[i] = dims[i];\n"); fprintf(fmatlab, "\t}\n"); */ if ((((Tnode *)p->info.typ->ref)->type != Tchar) && (((Tnode *)p->info.typ->ref)->type != Tuchar)) { fprintf(fmatlab, "\ttemp = (double*)mxGetPr(a);\n"); fprintf(fmatlab, "\tif (!temp)\n\t\tmexErrMsgTxt(\"mx_to_c_ArrayOfdouble: Pointer to data is NULL\");\n"); } fprintf(fmatlab, "\tfor (i = 0; i < numdims; i++) {\n"); fprintf(fmatlab, "\t\tif (b->__size[i] < dims[i])\n"); fprintf(fmatlab, "\t\t\tmexErrMsgTxt(\"Incompatible array dimensions in C and mx.\");\n"); fprintf(fmatlab, "\t\tsize *= dims[i];\n"); fprintf(fmatlab, "\t}\n"); if ((((Tnode *)p->info.typ->ref)->type != Tchar) && (((Tnode *)p->info.typ->ref)->type != Tuchar)) { fprintf(fmatlab, "\tfor (i = 0; i < size; i++)\n"); fprintf(fmatlab, "\t\tb->__ptr[i] = (%s)*temp++;\n", c_type((Tnode*)p->info.typ->ref)); } else { fprintf(fmatlab, "\tret = mxGetString(a, b->__ptr, size + 1);\n"); fprintf(fmatlab, "\tmexPrintf(\"ret = %%d, b->__ptr = %%s, size = %%d\", ret, b->__ptr, size);\n"); } fprintf(fmatlab, "\n}\n"); fflush(fmatlab); } void matlab_c_to_mx_dynamicArray(Tnode* typ) { int d, i; Entry *p; p = is_dynamic_array(typ); fprintf(fmatlab, "{\n"); fprintf(fmatlab, "\tmxArray *out;\n"); fprintf(fmatlab, "\t%s;\n", c_type_id((Tnode*)p->info.typ->ref, "*temp")); d = get_Darraydims(typ); fprintf(fmatlab, "\tint i;\n"); fprintf(fmatlab, "\tint ndim = %d, dims[%d] = {", d, d); for (i = 0; i < d; i++) { if (i == 0) fprintf(fmatlab, "a.__size[%d]", i); else fprintf(fmatlab, ", a.__size[%d]", i); } fprintf(fmatlab, "};\n"); fprintf(fmatlab, "\tint size = "); for (i = 0; i < d; i++) { if (i == 0) fprintf(fmatlab, "dims[%d]", i); else fprintf(fmatlab, "*dims[%d]", i); } fprintf(fmatlab, ";\n"); if ((((Tnode *)p->info.typ->ref)->type != Tchar) && (((Tnode *)p->info.typ->ref)->type != Tuchar)) { fprintf(fmatlab, "\tout = mxCreateNumericArray(ndim, dims, %s, mxREAL);\n", get_mxClassID((Tnode*)p->info.typ->ref)); fprintf(fmatlab, "\tif (!out)\n\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); fprintf(fmatlab, "\ttemp = (%s) mxGetPr(out);\n", c_type_id((Tnode*)p->info.typ->ref, "*")); fprintf(fmatlab, "\tif (!temp)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Pointer to data is NULL\");\n"); fprintf(fmatlab, "\tfor (i = 0; i < size; i++)\n"); fprintf(fmatlab, "\t\t*temp++ = a.__ptr[i];\n"); } else { fprintf(fmatlab, "\tout = mxCreateString(a.__ptr);\n"); fprintf(fmatlab, "\tif (!out)\n\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); } fprintf(fmatlab, "\treturn out;\n}\n"); fflush(fmatlab); } const char* get_mxClassID(Tnode* typ) { switch(typ->type) { case Tdouble: return "mxDOUBLE_CLASS"; case Tfloat: return "mxSINGLE_CLASS"; case Tshort: return "mxINT16_CLASS"; case Tushort: return "mxUINT16_CLASS"; case Tint: return "mxINT32_CLASS"; case Tuint: return "mxUINT32_CLASS"; case Tlong: return "mxINT32_CLASS"; case Tulong: return "mxUINT32_CLASS"; case Tllong: return "mxINT64_CLASS"; case Tullong: return "mxUINT64_CLASS"; case Tchar: return "mxCHAR_CLASS"; case Tuchar: return "mxCHAR_CLASS"; default: return ""; } } /*Function not in use.*/ void matlab_array_c_to_mx(Tnode* typ) { Tnode* temp; int d, i; fprintf(fmatlab, "{\n\tint rows, r, cols, c;\n"); fprintf(fmatlab, "\tmxArray* out;\n"); fprintf(fmatlab, "\tdouble* temp;\n"); d = get_dimension(typ); fprintf(fmatlab, "\tint ndim = %d, dims[%d] = {", d, d); temp=typ; for (i = 0; i < d; i++) { if (i == 0) fprintf(fmatlab, "%d", temp->width / ((Tnode*) temp->ref)->width); else fprintf(fmatlab, ", %d", temp->width / ((Tnode*) temp->ref)->width); temp=(Tnode*)typ->ref; } fprintf(fmatlab, "};\n"); fprintf(fmatlab, "\tout = mxCreateNumericArray(ndim, dims, mxDOUBLE_CLASS, mxREAL);\n"); fprintf(fmatlab, "\ttemp = (double *) mxGetPr(out);\n"); fprintf(fmatlab, "\tif (!out)\n\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); fprintf(fmatlab, "\tif (!temp)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Pointer to data is NULL\");\n"); fprintf(fmatlab, "\trows = mxGetM(out);\n"); fprintf(fmatlab, "\tif (!rows)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Data has zero rows\");\n"); fprintf(fmatlab, "\tcols = mxGetN(out);\n"); fprintf(fmatlab, "\tif (!cols)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Data has zero columns\");\n"); fprintf(fmatlab, "\tfor (c = 0; c < cols; c++)\n"); fprintf(fmatlab, "\t\tfor (r = 0; r < rows; r++)\n"); fprintf(fmatlab, "\t\t\t*temp++ = z->a[r][c];\n"); fprintf(fmatlab, "\treturn out;\n}\n"); fflush(fmatlab); } void matlab_c_to_mx_pointer(Tnode* typ) { if (!typ->ref) return; fprintf(fmheader, "\nmxArray* c_to_mx_%s(%s);\n", c_ident(typ), c_type_id(typ, "")); fprintf(fmatlab, "\nmxArray* c_to_mx_%s(%s)\n", c_ident(typ), c_type_id(typ, "a")); fprintf(fmatlab, "{\n"); fprintf(fmatlab, "\tmxArray *fout;\n"); fprintf(fmatlab, "\tfout = c_to_mx_%s(*a);\n", c_ident((Tnode*)typ->ref)); fprintf(fmatlab, "\treturn fout;\n"); fprintf(fmatlab, "}\n"); } void matlab_mx_to_c_pointer(Tnode* typ) { if (!typ->ref) return; fprintf(fmheader, "\nvoid mx_to_c_%s(const mxArray*, %s);\n", c_ident(typ), c_type_id(typ, "*")); fprintf(fmatlab, "\nvoid mx_to_c_%s(const mxArray* a, %s)\n", c_ident(typ), c_type_id(typ, "*b")); fprintf(fmatlab, "{\n\tmx_to_c_%s(a, *b);\n", c_ident((Tnode*)typ->ref)); fprintf(fmatlab, "\n}\n"); } void func2(Tnode* typ) { Table *table, *t; Entry *p; fprintf(fmatlab, "\tif (!mxIsStruct(a))\n\t\tmexErrMsgTxt(\"Input must be a structure.\");\n"); table=(Table*)typ->ref; for (t = table; t != (Table*)0; t = t->prev) { for (p = t->list; p != (Entry*)0; p = p->next) { if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) { fprintf(fmatlab, "\t{mxArray *tmp = mxGetField(a, 0, \"%s\");\n", ident(p->sym->name)); fprintf(fmatlab, "\tif (!tmp) {\n"); fprintf(fmatlab, "\t\tmexErrMsgTxt(\"Above member field is empty!\");\n\t}\n"); fprintf(fmatlab, "\tmx_to_c_%s(tmp, &b->%s);}\n", c_ident(p->info.typ), ident(p->sym->name)); } } } } void matlab_mx_to_c_struct(Tnode* typ) { if (!typ->ref) return; if (is_dynamic_array(typ)) { fprintf(fmheader, "\nvoid mx_to_c_%s(const mxArray*, %s);\n", c_ident(typ), c_type_id(typ, "*")); fprintf(fmatlab, "\nvoid mx_to_c_%s(const mxArray* a, %s)\n", c_ident(typ), c_type_id(typ, "*b")); matlab_mx_to_c_dynamicArray(typ); return; } else if (strstr(c_type_id(typ, ""), "soapSparseArray")) { return; } fprintf(fmheader, "\nvoid mx_to_c_%s(const mxArray*, %s);\n", c_ident(typ), c_type_id(typ, "*")); fprintf(fmatlab, "\nvoid mx_to_c_%s(const mxArray* a, %s)\n", c_ident(typ), c_type_id(typ, "*b")); fprintf(fmatlab, "{\n"); func2(typ); fprintf(fmatlab, "\n}\n"); return; } void matlab_c_to_mx_struct(Tnode* typ) { Table *table, *t; Entry *p; int number_of_fields=0; if (!typ->ref) return; if (is_dynamic_array(typ)) { fprintf(fmheader, "\nmxArray* c_to_mx_%s(%s);\n", c_ident(typ), c_type_id(typ, "")); fprintf(fmatlab, "\nmxArray* c_to_mx_%s(%s)\n", c_ident(typ), c_type_id(typ, "a")); matlab_c_to_mx_dynamicArray(typ); return; } else if (strstr(c_type_id(typ, ""), "soapSparseArray")) return; fprintf(fmheader, "\nmxArray* c_to_mx_%s(%s);\n", c_ident(typ), c_type_id(typ, "")); fprintf(fmatlab, "\nmxArray* c_to_mx_%s(%s)\n", c_ident(typ), c_type_id(typ, "a")); table=(Table*)typ->ref; fprintf(fmatlab, "{\n\tconst char* fnames[] = {"); for (t = table; t != (Table*)0; t = t->prev) { for (p = t->list; p != (Entry*)0; p = p->next) { if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) { if (number_of_fields) fprintf(fmatlab, ", \"%s\"", ident(p->sym->name)); else fprintf(fmatlab, "\"%s\"", ident(p->sym->name)); number_of_fields++; } } } fprintf(fmatlab, "}; /* pointers to member field names */\n"); fprintf(fmatlab, "\tint rows = 1, cols = 1;\n\tint index = 0;\n\tint number_of_fields = %d;\n\tmxArray *struct_array_ptr;\n", number_of_fields); fprintf(fmatlab, "\t/* Create a 1x1 struct matrix for output */\n"); fprintf(fmatlab, "\tstruct_array_ptr = mxCreateStructMatrix(rows, cols, number_of_fields, fnames);\n\tmexPrintf(\"6\");\n\tif (struct_array_ptr == NULL) {\n\t\tmexPrintf(\"COULDNT CREATE A MATRIX\");}\n\tmexPrintf(\"7\");\n"); for (t = table; t != (Table*)0; t = t->prev) { for (p = t->list; p != (Entry*)0; p = p->next) { if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) { fprintf(fmatlab, "\t{mxArray *fout = c_to_mx_%s(a.%s);\n", c_ident(p->info.typ), ident(p->sym->name)); fprintf(fmatlab, "\tmxSetField(struct_array_ptr, index, \"%s\" , fout);}\n", ident(p->sym->name)); } } } fprintf(fmatlab, "\treturn struct_array_ptr;\n}\n"); } void matlab_c_to_mx_primitive(Tnode *typ) { fprintf(fmheader, "\nmxArray* c_to_mx_%s(%s);", c_ident(typ), c_type_id(typ, "")); fprintf(fmatlab, "\nmxArray* c_to_mx_%s(%s)\n", c_ident(typ), c_type_id(typ, "a")); fprintf(fmatlab, "{\n\tmxArray *fout;\n"); if ((typ->type == Tchar) || (typ->type == Tuchar)) { fprintf(fmatlab, "\tchar buf[2];\n"); fprintf(fmatlab, "\tbuf[0] = a;\n"); fprintf(fmatlab, "\tbuf[1] = \'\\0\';\n"); fprintf(fmatlab, "\tfout = mxCreateString(buf);\n"); fprintf(fmatlab, "\tif (!fout)\n"); fprintf(fmatlab, "\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); } else { fprintf(fmatlab, "\tint ndim = 1, dims[1] = {1};\n"); fprintf(fmatlab, "\tfout = mxCreateNumericArray(ndim, dims, %s, mxREAL);\n", get_mxClassID(typ)); fprintf(fmatlab, "\t%s = (%s)mxGetPr(fout);\n", c_type_id(typ, "*temp"), c_type_id(typ, "*")); fprintf(fmatlab, "\tif (!fout)\n"); fprintf(fmatlab, "\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); fprintf(fmatlab, "\tif (!temp) \n"); fprintf(fmatlab, "\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Pointer to data is NULL\");\n"); fprintf(fmatlab, "\t*temp++= a;\n"); } fprintf(fmatlab, "\treturn fout;\n}\n"); } void matlab_mx_to_c_primitive(Tnode *typ) { fprintf(fmheader, "\nvoid mx_to_c_%s(const mxArray *, %s);\n", c_ident(typ), c_type_id(typ, "*")); fprintf(fmatlab, "\nvoid mx_to_c_%s(const mxArray *a, %s)\n", c_ident(typ), c_type_id(typ, "*b")); if ((typ->type == Tchar) || (typ->type == Tuchar)) { fprintf(fmatlab, "{\n\tint ret;\n"); fprintf(fmatlab, "\tchar buf[2];\n"); fprintf(fmatlab, "\tret = mxGetString(a, buf, 2);\n"); fprintf(fmatlab, "\tmexPrintf(\"ret = %%d, buf = %%s\", ret, buf);\n"); fprintf(fmatlab, "\t*b = buf[0];\n"); } else { fprintf(fmatlab, "{\n\tdouble* data = (double*)mxGetData(a);\n"); fprintf(fmatlab, "\t*b = (%s)*data;\n", c_type(typ)); } fprintf(fmatlab, "\n}\n"); } void matlab_out_generate(Tnode *typ) { if (is_transient(typ) || typ->type == Twchar || is_XML(typ)) return; /* typeNO++; if (typeNO>=1024) execerror("Too many user-defined data types"); */ if (is_primitive(typ)) { matlab_c_to_mx_primitive(typ); matlab_mx_to_c_primitive(typ); return; } switch(typ->type) { case Tstruct: matlab_c_to_mx_struct(typ); matlab_mx_to_c_struct(typ); break; case Tpointer: matlab_c_to_mx_pointer(typ); matlab_mx_to_c_pointer(typ); break; default: break; } } /*his function is called first it first generates all routines and then in the second pass calls all routines to generate matlab_out for the table*/ void func1(Table *table, Entry *param) { Entry *q, *pout, *response=NULL; q = entry(table, param->sym); if (q) { pout = (Entry*)q->info.typ->ref; } else { fprintf(stderr, "Internal error: no table entry\n"); return; } q = entry(classtable, param->sym); if (!is_response(pout->info.typ)) { response = get_response(param->info.typ); } fprintf(fmheader, "\n\toutside loop struct %s soap_tmp_%s;", param->sym->name, param->sym->name); if (!is_response(pout->info.typ) && response) { fprintf(fmheader, "\n\tif..inside loop struct %s *soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); } fflush(fmheader); } void matlab_def_table(Table *table) { Entry *q, *pout, *e, *response=NULL; int i; Tnode *p; /* for (q1 = table->list; q1 != (Entry*) 0; q1 = q1->next) if (q1->info.typ->type == Tfun) func1(table, q1); */ /* Sparse matrix code will be present by default */ matlab_gen_sparseStruct(); matlab_c_to_mx_sparse(); matlab_mx_to_c_sparse(); for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p != (Tnode*)0 ; p = p->next) { /* This is generated for everything declared in the ".h" file. To make sure that it doesnt get generated for functions do a comparison with p->sym->name, so that its not generated for functions. */ if (is_XML(p)) continue; if (strstr(c_ident(p), "SOAP_ENV_") != NULL) continue; for (q = table->list; q != (Entry*) 0; q = q->next) { if (strcmp(c_ident(p), q->sym->name) == 0) break; e=entry(table, q->sym); if (e) pout = (Entry*)e->info.typ->ref; else { fprintf(stderr, "Internal error: no table entry\n"); return; } if (!is_response(pout->info.typ)) { response = get_response(q->info.typ); } if (!is_response(pout->info.typ) && response) { if (strcmp(c_ident(p), c_ident(response->info.typ)) == 0) break; } } if (q == (Entry*) 0) matlab_out_generate(p); } } } void detect_cycles(void) { Tnode *p; for (p = Tptr[Tclass]; p; p = p->next) detect_recursive_type(p); for (p = Tptr[Tstruct]; p; p = p->next) detect_recursive_type(p); } void detect_recursive_type(Tnode *p) { if (is_transient(p)) return; if (p->type == Tclass || p->type == Tstruct || p->type == Tunion) { if (p->visited == Unexplored) { Table *t; Entry *e, *b = NULL; Tnode *q; p->visited = Hot; if ((p->type == Tclass || p->type == Tstruct) && p->base) { q = p; while (q->base) { b = entry(classtable, q->base); if (!b) break; q = b->info.typ; if (q->visited == Unexplored) detect_recursive_type(q); if (q->recursive) { p->recursive = True; break; } q->visited = Hot; } } if (!p->recursive) for (t = (Table*)p->ref; t; t = t->prev) for (e = t->list; e; e = e->next) detect_recursive_type(e->info.typ); if ((p->type == Tclass || p->type == Tstruct) && p->base) { q = p; while (q->base) { b = entry(classtable, q->base); if (!b) break; q = b->info.typ; if (q->recursive) p->recursive = True; q->visited = Cold; } } p->visited = Cold; } else if (p->visited == Hot) { p->recursive = True; } } else if (p->type == Tpointer || p->type == Treference || p->type == Trvalueref || p->type == Tarray || p->type == Ttemplate) { detect_recursive_type(p->ref); } } void generate_defs(void) { int i; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (!p->generated && !is_transient(p) && p->type != Twchar && !is_void(p)) { p->generated = True; generate_type(p); if (fflag) if (--partnum == 0) return; } } } } int no_of_var(Tnode *typ) { Entry *p; Table *t; int i=0; if (typ->type == Tstruct || typ->type == Tclass) { t = (Table*)typ->ref; for (p = t->list; p != (Entry*) 0; p = p->next) { if (p->info.typ->type == Tpointer) i++; } } if ((((Tnode *)(typ->ref))->type == Tstruct) || (((Tnode *)(typ->ref))->type == Tclass) ) { t = (Table*)((Tnode*)(typ->ref))->ref; for (p = t->list; p != (Entry*) 0; p = p->next) { if (p->info.typ->type == Tpointer) i++; } } return i; } void in_defs(void) { int i; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (!is_element(p) && !is_transient(p) && p->type != Twchar && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion && !is_XML(p) && !is_header_or_fault(p) && !is_body(p) && !is_template(p)) { const char *s = xsi_type(p); if (!*s) s = wsdl_type(p, ""); if (*s == '-') continue; if (is_string(p)) fprintf(fout, "\n\tcase %s:\n\t{\tchar **s;\n\t\ts = soap_in_%s(soap, tag, NULL, \"%s\");\n\t\treturn s ? *s : NULL;\n\t}", soap_type(p), c_ident(p), s); else if (is_wstring(p)) fprintf(fout, "\n\tcase %s:\n\t{\twchar_t **s;\n\t\ts = soap_in_%s(soap, tag, NULL, \"%s\");\n\t\treturn s ? *s : NULL;\n\t}", soap_type(p), c_ident(p), s); else fprintf(fout, "\n\tcase %s:\n\t\treturn soap_in_%s(soap, tag, NULL, \"%s\");", soap_type(p), c_ident(p), s); } } } } void in_defs2(void) { int i, j; Tnode *p; const char *s; for (i = 0; i < TYPES; i++) { /* make sure (wrapper) classes are checked first */ if (i == 0) j = Tclass; else if (i == Tclass) continue; else j = i; for (p = Tptr[j]; p; p = p->next) { if (!is_element(p) && !is_transient(p) && !is_template(p) && p->type != Twchar && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion && !is_XML(p) && !is_header_or_fault(p) && !is_body(p)) { s = xsi_type(p); if (!*s) s = wsdl_type(p, ""); if (*s == '-') continue; if (*s) { if (is_dynamic_array(p) && !is_binary(p) && !has_ns(p) && !is_untyped(p)) fprintf(fout, "\n\t\tif (*soap->arrayType && !soap_match_array(soap, \"%s\"))\n\t\t{\t*type = %s;\n\t\t\treturn soap_in_%s(soap, tag, NULL, NULL);\n\t\t}", s, soap_type(p), c_ident(p)); else if (is_string(p)) fprintf(fout, "\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\tchar **s;\n\t\t\t*type = %s;\n\t\t\ts = soap_in_%s(soap, tag, NULL, NULL);\n\t\t\treturn s ? *s : NULL;\n\t\t}", s, soap_type(p), c_ident(p)); else if (is_wstring(p)) fprintf(fout, "\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\twchar_t **s;\n\t\t\t*type = %s;\n\t\t\ts = soap_in_%s(soap, tag, NULL, NULL);\n\t\t\treturn s ? *s : NULL;\n\t\t}", s, soap_type(p), c_ident(p)); else if (p->type != Tpointer) fprintf(fout, "\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\t*type = %s;\n\t\t\treturn soap_in_%s(soap, tag, NULL, NULL);\n\t\t}", s, soap_type(p), c_ident(p)); } } } } } void in_defs3(void) { int i; Tnode *p; const char *s; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (is_element(p) && !is_transient(p) && !is_template(p) && p->type != Twchar && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion && !is_XML(p) && !is_header_or_fault(p) && !is_body(p)) { s = xsi_type(p); if (!*s) s = wsdl_type(p, ""); if (*s == '-') continue; if (*s) { if (is_dynamic_array(p) && !is_binary(p) && !has_ns(p) && !is_untyped(p)) fprintf(fout, "\n\t\tif (*soap->arrayType && !soap_match_array(soap, \"%s\"))\n\t\t{\t*type = %s;\n\t\t\treturn soap_in_%s(soap, NULL, NULL, NULL);\n\t\t}", s, soap_type(p), c_ident(p)); else if (is_string(p)) fprintf(fout, "\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\tchar **s;\n\t\t\t*type = %s;\n\t\t\ts = soap_in_%s(soap, NULL, NULL, NULL);\n\t\t\treturn s ? *s : NULL;\n\t\t}", s, soap_type(p), c_ident(p)); else if (is_wstring(p)) fprintf(fout, "\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\twchar_t **s;\n\t\t\t*type = %s;\n\t\t\ts = soap_in_%s(soap, NULL, NULL, NULL);\n\t\t\treturn s ? *s : NULL;\n\t\t}", s, soap_type(p), c_ident(p)); else if (p->type != Tpointer) fprintf(fout, "\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\t*type = %s;\n\t\t\treturn soap_in_%s(soap, NULL, NULL, NULL);\n\t\t}", s, soap_type(p), c_ident(p)); } } } } } void out_defs(void) { int i; const char *s; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (is_transient(p) || is_template(p) || is_XML(p) || is_header_or_fault(p) || is_body(p)) continue; if (is_element(p)) { s = wsdl_type(p, ""); if (*s == '-') continue; if (p->type == Tarray) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_%s(soap, \"%s\", id, (%s)ptr, \"\");", soap_type(p), c_ident(p), s, c_type_id((Tnode*)p->ref, "(*)")); else if (p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn ((%s)ptr)->soap_out(soap, \"%s\", id, \"\");", soap_type(p), c_type_id(p, "*"), s); else if (is_string(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_string(soap, \"%s\", id, (char*const*)(void*)&ptr, \"\");", soap_type(p), s); else if (is_wstring(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_wstring(soap, \"%s\", id, (wchar_t*const*)(void*)&ptr, \"\");", soap_type(p), s); else if (p->type == Tpointer) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_%s(soap, \"%s\", id, (%s)ptr, \"\");", soap_type(p), c_ident(p), s, c_type_constptr_id(p, "const*")); else if (p->type != Tnone && p->type != Ttemplate && p->type != Twchar && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_%s(soap, \"%s\", id, (const %s)ptr, \"\");", soap_type(p), c_ident(p), s, c_type_id(p, "*")); } else { s = xsi_type(p); if (!*s) s = wsdl_type(p, ""); if (*s == '-') continue; if (p->type == Tarray) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_%s(soap, tag, id, (%s)ptr, \"%s\");", soap_type(p), c_ident(p), c_type_id((Tnode*)p->ref, "(*)"), s); else if (p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn ((%s)ptr)->soap_out(soap, tag, id, \"%s\");", soap_type(p), c_type_id(p, "*"), s); else if (is_string(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_string(soap, tag, id, (char*const*)(void*)&ptr, \"%s\");", soap_type(p), s); else if (is_wstring(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_wstring(soap, tag, id, (wchar_t*const*)(void*)&ptr, \"%s\");", soap_type(p), s); else if (p->type == Tpointer) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_%s(soap, tag, id, (%s)ptr, \"%s\");", soap_type(p), c_ident(p), c_type_constptr_id(p, "const*"), s); else if (p->type != Tnone && p->type != Ttemplate && p->type != Twchar && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_%s(soap, tag, id, (const %s)ptr, \"%s\");", soap_type(p), c_ident(p), c_type_id(p, "*"), s); } } } } void mark_defs() { int i; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (is_transient(p) || is_template(p) || is_XML(p) || is_header_or_fault(p) || is_body(p) || is_void(p)) continue; if (p->type == Tarray) continue; else if (p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) fprintf(fout, "\n\tcase %s:\n\t\t((%s)ptr)->soap_serialize(soap);\n\t\tbreak;", soap_type(p), c_type_id(p, "*")); else if (is_string(p)) fprintf(fout, "\n\tcase %s:\n\t\tsoap_serialize_string(soap, (char*const*)(void*)&ptr);\n\t\tbreak;", soap_type(p)); else if (is_wstring(p)) fprintf(fout, "\n\tcase %s:\n\t\tsoap_serialize_wstring(soap, (wchar_t*const*)(void*)&ptr);\n\t\tbreak;", soap_type(p)); else if (p->type == Tpointer) fprintf(fout, "\n\tcase %s:\n\t\tsoap_serialize_%s(soap, (%s)ptr);\n\t\tbreak;", soap_type(p), c_ident(p), c_type_constptr_id(p, "const*")); else if (p->type == Ttemplate && p->ref) fprintf(fout, "\n\tcase %s:\n\t\tsoap_serialize_%s(soap, (const %s)ptr);\n\t\tbreak;", soap_type(p), c_ident(p), c_type_id(p, "*")); else if (!is_primitive(p) && p->type != Tnone && p->type != Ttemplate && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion) fprintf(fout, "\n\tcase %s:\n\t\tsoap_serialize_%s(soap, (const %s)ptr);\n\t\tbreak;", soap_type(p), c_ident(p), c_type_id(p, "*")); } } } void dup_defs() { int i; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (is_transient(p) || is_template(p) || is_XML(p) || is_header_or_fault(p) || is_body(p) || is_void(p)) continue; if (p->type == Tarray) continue; else if (p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)((%s)ptr)->soap_dup(soap);", soap_type(p), c_type_id(p, "*")); else if (is_string(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)soap_strdup(soap, (const char*)ptr);", soap_type(p)); else if (is_wstring(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)soap_wstrdup(soap, (const wchar_t*)ptr);", soap_type(p)); else if (p->type == Tpointer) fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)%s_dup_%s(soap, NULL, (%s)ptr);", soap_type(p), fprefix, c_ident(p), c_type_constptr_id(p, "const*")); else if (p->type == Ttemplate && p->ref) fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)%s_dup_%s(soap, NULL, (const %s)ptr);", soap_type(p), fprefix, c_ident(p), c_type_id(p, "*")); else if (!is_primitive(p) && p->type != Tnone && p->type != Ttemplate && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion) fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)%s_dup_%s(soap, NULL, (const %s)ptr);", soap_type(p), fprefix, c_ident(p), c_type_id(p, "*")); else if (p->type != Tnone && p->type != Ttemplate && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_memdup(soap, ptr, sizeof(%s));", soap_type(p), c_type(p)); } } } void del_defs() { int i; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (is_transient(p) || is_template(p) || is_XML(p) || is_header_or_fault(p) || is_body(p) || is_void(p)) continue; if (p->type == Tarray) continue; else if (p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) fprintf(fout, "\n\tcase %s:\n\t\tstatic_cast(ptr)->soap_del();\n\t\tSOAP_DELETE(NULL, static_cast(ptr), %s);\n\t\tbreak;", soap_type(p), c_type(p), c_type(p), c_type(p)); else if (is_string(p)) fprintf(fout, "\n\tcase %s:\n\t\t%s_del_string((char*const*)(void*)&ptr);\n\t\tbreak;", soap_type(p), fprefix); else if (is_wstring(p)) fprintf(fout, "\n\tcase %s:\n\t\t%s_del_wstring((wchar_t*const*)(void*)&ptr);\n\t\tbreak;", soap_type(p), fprefix); else if (p->type == Tpointer) fprintf(fout, "\n\tcase %s:\n\t\t%s_del_%s((%s)ptr);\n\t\tSOAP_FREE(NULL, ptr);\n\t\tbreak;", soap_type(p), fprefix, c_ident(p), c_type_constptr_id(p, "const*")); else if (p->type == Ttemplate && p->ref) fprintf(fout, "\n\tcase %s:\n\t\t%s_del_%s((const %s)ptr);\n\t\tSOAP_DELETE(NULL, static_cast(ptr), %s);\n\t\tbreak;", soap_type(p), fprefix, c_ident(p), c_type_id(p, "*"), c_type(p), c_type(p)); else if (!is_primitive(p) && p->type != Tnone && p->type != Ttemplate && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion) { if (!cflag && (p->type == Tstruct || p->type == Tclass)) fprintf(fout, "\n\tcase %s:\n\t\t%s_del_%s((const %s)ptr);\n\t\tSOAP_DELETE(NULL, static_cast(ptr), %s);\n\t\tbreak;", soap_type(p), fprefix, c_ident(p), c_type_id(p, "*"), c_type(p), c_type(p)); else fprintf(fout, "\n\tcase %s:\n\t\t%s_del_%s((const %s)ptr);\n\t\tSOAP_FREE(NULL, ptr);\n\t\tbreak;", soap_type(p), fprefix, c_ident(p), c_type_id(p, "*")); } else if (p->type != Tnone && p->type != Ttemplate && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion) fprintf(fout, "\n\tcase %s:\n\t\tSOAP_FREE(NULL, (const %s)ptr);\n\t\tbreak;", soap_type(p), c_type_id(p, "*")); } } } void in_attach(void) { int i; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (is_attachment(p)) { if (p->type == Tclass) fprintf(fout, "\n\t\tcase %s:\n\t\t{\t%s a;\n\t\t\ta = (%s)soap_id_enter(soap, soap->dime.id, NULL, %s, sizeof(%s), NULL, NULL, %s_instantiate, %s_fbase);\n\t\t\tif (a)\n\t\t\t{\ta->__ptr = (unsigned char*)soap->dime.ptr;\n\t\t\t\ta->__size = soap->dime.size;\n\t\t\t\ta->id = (char*)soap->dime.id;\n\t\t\t\ta->type = (char*)soap->dime.type;\n\t\t\t\ta->options = (char*)soap->dime.options;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn soap->error;\n\t\t\tbreak;\n\t\t}", soap_type(p), c_type_id(p, "*"), c_type_id(p, "*"), soap_type(p), c_type(p), prefix, prefix); else fprintf(fout, "\n\t\tcase %s:\n\t\t{\t%s a;\n\t\t\ta = (%s)soap_id_enter(soap, soap->dime.id, NULL, %s, sizeof(%s), NULL, NULL, NULL, NULL);\n\t\t\tif (!a)\n\t\t\t\treturn soap->error;\n\t\t\ta->__ptr = (unsigned char*)soap->dime.ptr;\n\t\t\ta->__size = soap->dime.size;\n\t\t\ta->id = (char*)soap->dime.id;\n\t\t\ta->type = (char*)soap->dime.type;\n\t\t\ta->options = (char*)soap->dime.options;\n\t\t\tbreak;\n\t\t}", soap_type(p), c_type_id(p, "*"), c_type_id(p, "*"), soap_type(p), c_type(p)); } else if (is_binary(p) && !is_transient(p)) { if (p->type == Tclass) fprintf(fout, "\n\t\tcase %s:\n\t\t{\t%s a;\n\t\t\ta = (%s)soap_id_enter(soap, soap->dime.id, NULL, %s, sizeof(%s), NULL, NULL, %s_instantiate, %s_fbase);\n\t\t\tif (!a)\n\t\t\t\treturn soap->error;\n\t\t\ta->__ptr = (unsigned char*)soap->dime.ptr;\n\t\t\ta->__size = soap->dime.size;\n\t\t\tbreak;\n\t\t}", soap_type(p), c_type_id(p, "*"), c_type_id(p, "*"), soap_type(p), c_type(p), prefix, prefix); else fprintf(fout, "\n\t\tcase %s:\n\t\t{\t%s a;\n\t\t\ta = (%s)soap_id_enter(soap, soap->dime.id, NULL, %s, sizeof(%s), NULL, NULL, NULL, NULL);\n\t\t\tif (!a)\n\t\t\t\treturn soap->error;\n\t\t\ta->__ptr = (unsigned char*)soap->dime.ptr;\n\t\t\ta->__size = soap->dime.size;\n\t\t\tbreak;\n\t\t}", soap_type(p), c_type_id(p, "*"), c_type_id(p, "*"), soap_type(p), c_type(p)); } } } } void soap_instantiate(Tnode *typ) { Table *Tptr; Entry *Eptr; int derclass = 0, flag = 0; const char *s; if (is_XML(typ)) return; if (typ->type == Tarray) return; if (typ->type == Tunion) return; if (typ->type == Tpointer && !is_string(typ) && !is_wstring(typ)) return; if (cflag) { if ((is_typedef(typ) && !is_external(typ)) || is_restriction(typ)) fprintf(fhead, "\n#define soap_new_%s soap_new_%s\n", c_ident(typ), t_ident(typ)); else { fprintf(fhead, "\n\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_new_%s(struct soap *soap, int n);", c_type(typ), c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_new_%s(struct soap *soap, int n)\n{\n\t%s *p;\n\t%s *a = (%s*)soap_malloc((soap), (n = (n < 0 ? 1 : n)) * sizeof(%s));\n\tfor (p = a; p && n--; p++)\n\t\tsoap_default_%s(soap, p);\n\treturn a;\n}", c_type(typ), c_ident(typ), c_type(typ), c_type(typ), c_type(typ), c_type(typ), c_ident(typ)); } return; } if (typ->type != Tclass || !typ->sym || !is_eq(typ->sym->name, "xsd__QName") || is_imported(typ)) { if ((is_typedef(typ) && !is_external(typ)) || is_restriction(typ)) { fprintf(fhead, "\n\n#define %s_instantiate_%s %s_instantiate_%s\n", fprefix, c_ident(typ), fprefix, t_ident(typ)); fprintf(fhead, "\n\n#define soap_new_%s soap_new_%s\n", c_ident(typ), t_ident(typ)); if ((typ->type == Tclass || typ->type == Tstruct) && typ->ref) { fprintf(fhead, "\n\n#define soap_new_req_%s soap_new_req_%s\n", c_ident(typ), t_ident(typ)); fprintf(fhead, "\n\n#define soap_new_set_%s soap_new_set_%s\n", c_ident(typ), t_ident(typ)); } return; } } if (is_primitive(typ) || is_string(typ) || is_wstring(typ)) { fprintf(fhead, "\n\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_new_%s(struct soap *soap, int n = -1);", c_type(typ), c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_new_%s(struct soap *soap, int n)\n{\n\t%s *a = static_cast<%s *>(soap_malloc(soap, (n = (n < 0 ? 1 : n)) * sizeof(%s)));\n\tfor (%s *p = a; p && n--; ++p)\n\t\tsoap_default_%s(soap, p);\n\treturn a;\n}", c_type(typ), c_ident(typ), c_type(typ), c_type(typ), c_type(typ), c_type(typ), c_ident(typ)); } /* NO LONGER CONSIDERED: soap_new_copy_Name1 may clash with soap_new_Name2 and soap_copy_X is already in use if (is_primitive(typ)) fprintf(fhead, "\n\ninline %s * soap_new_copy_%s(struct soap *soap, const %s& a)\n{\n\t%s *p = (%s*)soap_malloc(soap, sizeof(%s));\n\tif (p)\n\t\t*p = a;\n\treturn p;\n}", c_type(typ), c_ident(typ), c_type(typ), c_type(typ), c_type(typ), c_type(typ)); else if (is_string(typ)) fprintf(fhead, "\n\ninline char * soap_new_copy_string(struct soap *soap, const char *a)\n{\n\treturn soap_strdup(soap, a);\n}"); else if (is_wstring(typ)) fprintf(fhead, "\n\ninline wchar_t * soap_new_copy_wstring(struct soap *soap, const wchar_t *a)\n{\n\treturn soap_wstrdup(soap, a);\n}"); */ if (typ->type != Tstruct && typ->type != Tclass && typ->type != Ttemplate) return; fprintf(fhead, "\nSOAP_FMAC1 %s * SOAP_FMAC2 %s_instantiate_%s(struct soap*, int, const char*, const char*, size_t*);", c_type(typ), fprefix, c_ident(typ)); fprintf(fhead, "\n\ninline %s * soap_new_%s(struct soap *soap, int n = -1)\n{\n\treturn %s_instantiate_%s(soap, n, NULL, NULL, NULL);\n}", c_type(typ), c_ident(typ), fprefix, c_ident(typ)); /* NO LONGER CONSIDERED: soap_new_copy_Name1 may clash with soap_new_Name2 if (is_stdstring(typ)) { fprintf(fhead, "\n\ninline std::string * soap_new_copy_%s(struct soap *soap, const std::string& a)\n{\n\tstd::string *p = soap_new_%s(soap);\n\tif (p)\n\t\t*p = a;\n\treturn p;\n}", c_ident(typ), c_ident(typ)); fprintf(fhead, "\n\ninline std::string * soap_new_copy_%s(struct soap *soap, const char *a)\n{\n\tstd::string *p = soap_new_%s(soap);\n\tif (p)\n\t\tp->assign(a);\n\treturn p;\n}", c_ident(typ), c_ident(typ)); } else if (is_stdwstring(typ)) { fprintf(fhead, "\n\ninline std::wstring * soap_new_copy_%s(struct soap *soap, const std::wstring& a)\n{\n\tstd::wstring *p = soap_new_%s(soap);\n\tif (p)\n\t\t*p = a;\n\treturn p;\n}", c_ident(typ), c_ident(typ)); fprintf(fhead, "\n\ninline std::wstring * soap_new_copy_%s(struct soap *soap, const wchar_t *a)\n{\n\tstd::wstring *p = soap_new_%s(soap);\n\tif (p)\n\t\tp->assign(a);\n\treturn p;\n}", c_ident(typ), c_ident(typ)); } else if (!is_template(typ)) { fprintf(fhead, "\n\ninline %s * soap_new_copy_%s(struct soap *soap, const %s& a)\n{\n\t%s *p = soap_new_%s(soap);\n\tif (p)\n\t\t*p = a;\n\treturn p;\n}", c_type(typ), c_ident(typ), c_type(typ), c_type(typ), c_ident(typ)); } */ if (typ->type == Tclass || typ->type == Tstruct) { fprintf(fhead, "\n\ninline %s * soap_new_req_%s(\n\tstruct soap *soap", c_type(typ), c_ident(typ)); if (!is_dynamic_array(typ)) { for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) { if (is_repetition(Eptr) || is_anytype(Eptr)) flag = 2; if ((Eptr->info.minOccurs > 0 || flag) && !(Eptr->info.sto & (Sprivate | Sprotected | Sconst | Sstatic | Stypedef)) && Eptr->info.typ->type != Tfun && !is_soapref(Eptr->info.typ)) { if (flag) flag--; if (is_smart(Eptr->info.typ)) { if (is_smart_shared(Eptr->info.typ)) fprintf(fhead, ",\n\t%s %s", c_type_id(Eptr->info.typ, "&"), ident(Eptr->sym->name)); else fprintf(fhead, ",\n\t%s %s", c_type_id(Eptr->info.typ->ref, "*"), ident(Eptr->sym->name)); } else if (Eptr->info.typ->type == Ttemplate && is_smart(Eptr->info.typ->ref) && !is_smart_shared(Eptr->info.typ->ref)) continue; else if (Eptr->info.typ->type == Tclass || Eptr->info.typ->type == Tstruct || Eptr->info.typ->type == Tunion || Eptr->info.typ->type == Ttemplate) fprintf(fhead, ",\n\tconst %s& %s", c_type(Eptr->info.typ), ident(Eptr->sym->name)); else if ((Eptr->info.sto & Sconstptr)) fprintf(fhead, ",\n\tconst %s", c_type_id(Eptr->info.typ, Eptr->sym->name)); else if (Eptr->info.typ->type == Tarray) fprintf(fhead, ",\n\t%s", c_type_id(Eptr->info.typ, Eptr->sym->name)); else fprintf(fhead, ",\n\t%s", c_type_id(Eptr->info.typ, Eptr->sym->name)); if (derclass && Eptr->info.typ->type != Tarray) fprintf(fhead, "__%d", derclass); } } } } if (namespaceid && !is_external(typ)) fprintf(fhead, ")\n{\n\t%s = %s::soap_new_%s(soap);\n\tif (_p)\n\t{\t", c_type_id(typ, "*_p"), namespaceid, c_ident(typ)); else if (!is_external(typ)) fprintf(fhead, ")\n{\n\t%s = ::soap_new_%s(soap);\n\tif (_p)\n\t{\t", c_type_id(typ, "*_p"), c_ident(typ)); else fprintf(fhead, ")\n{\n\t%s = soap_new_%s(soap);\n\tif (_p)\n\t{\t", c_type_id(typ, "*_p"), c_ident(typ)); if (!is_external(typ)) { if (typ->type == Tclass && !is_volatile(typ)) fprintf(fhead, "_p->soap_default(soap);"); else if (namespaceid && !is_external(typ)) fprintf(fhead, "%s::soap_default_%s(soap, _p);", namespaceid, c_ident(typ)); else if (!is_external(typ)) fprintf(fhead, "::soap_default_%s(soap, _p);", c_ident(typ)); else fprintf(fhead, "soap_default_%s(soap, _p);", c_ident(typ)); } flag = 0; if (!is_dynamic_array(typ)) { for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) { if (is_repetition(Eptr) || is_anytype(Eptr)) flag = 2; if ((Eptr->info.minOccurs > 0 || flag) && !(Eptr->info.sto & (Sprivate | Sprotected | Sconst | Sstatic | Stypedef)) && Eptr->info.typ->type != Tfun && !is_soapref(Eptr->info.typ)) { if (flag) flag--; if (is_smart(Eptr->info.typ) && !is_smart_shared(Eptr->info.typ)) /* smart but not shared */ { if (typ->type == Tclass) fprintf(fhead, "\n\t\t_p->%s::%s = %s(%s", ident(Tptr->sym->name), ident(Eptr->sym->name), c_type(Eptr->info.typ), ident(Eptr->sym->name)); else fprintf(fhead, "\n\t\t_p->%s = %s(%s", ident(Eptr->sym->name), c_type(Eptr->info.typ), ident(Eptr->sym->name)); } else if (Eptr->info.typ->type == Tarray) { int cardinality; Tnode *ref = get_item_type(Eptr->info.typ, &cardinality); if (cardinality > 1) { const char *t = c_type(ref); if (typ->type == Tclass) fprintf(fhead, "\n\t\tfor (int i = 0; i < %d; i++)\n\t\t\t((%s*)(_p->%s::%s))[i] = ((%s*)%s)", get_dimension_product(Eptr->info.typ), t, ident(Tptr->sym->name), ident(Eptr->sym->name), t, ident(Eptr->sym->name)); else fprintf(fhead, "\n\t\tfor (int i = 0; i < %d; i++)\n\t\t\t((%s*)(_p->%s))[i] = ((%s*)%s)", get_dimension_product(Eptr->info.typ), t, ident(Eptr->sym->name), t, ident(Eptr->sym->name)); } else { if (typ->type == Tclass) fprintf(fhead, "\n\t\tfor (int i = 0; i < %d; i++)\n\t\t\t_p->%s::%s[i] = %s", get_dimension(Eptr->info.typ), ident(Tptr->sym->name), ident(Eptr->sym->name), ident(Eptr->sym->name)); else fprintf(fhead, "\n\t\tfor (int i = 0; i < %d; i++)\n\t\t\t_p->%s[i] = %s", get_dimension(Eptr->info.typ), ident(Eptr->sym->name), ident(Eptr->sym->name)); } } else if (Eptr->info.typ->type == Ttemplate && is_smart(Eptr->info.typ->ref) && !is_smart_shared(Eptr->info.typ->ref)) continue; else if (typ->type == Tclass) fprintf(fhead, "\n\t\t_p->%s::%s = %s", ident(Tptr->sym->name), ident(Eptr->sym->name), ident(Eptr->sym->name)); else fprintf(fhead, "\n\t\t_p->%s = %s", ident(Eptr->sym->name), ident(Eptr->sym->name)); if (derclass && Eptr->info.typ->type != Tarray) fprintf(fhead, "__%d", derclass); if (Eptr->info.typ->type == Tarray) fprintf(fhead, "[i];"); else if (is_smart(Eptr->info.typ) && !is_smart_shared(Eptr->info.typ)) /* smart but not shared */ fprintf(fhead, ");"); else fprintf(fhead, ";"); } } } } fprintf(fhead, "\n\t}\n\treturn _p;\n}"); fprintf(fhead, "\n\ninline %s * soap_new_set_%s(\n\tstruct soap *soap", c_type(typ), c_ident(typ)); for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) { if (!(Eptr->info.sto & (Sprivate | Sprotected | Sconst | Sstatic | Stypedef)) && Eptr->info.typ->type != Tfun && strcmp(Eptr->sym->name, "soap")) { if (is_smart(Eptr->info.typ)) { if (is_smart_shared(Eptr->info.typ)) fprintf(fhead, ",\n\t%s %s", c_type_id(Eptr->info.typ, "&"), ident(Eptr->sym->name)); else fprintf(fhead, ",\n\t%s %s", c_type_id(Eptr->info.typ->ref, "*"), ident(Eptr->sym->name)); } else if (Eptr->info.typ->type == Ttemplate && is_smart(Eptr->info.typ->ref) && !is_smart_shared(Eptr->info.typ->ref)) continue; else if (Eptr->info.typ->type == Tclass || Eptr->info.typ->type == Tstruct || Eptr->info.typ->type == Tunion || Eptr->info.typ->type == Ttemplate) fprintf(fhead, ",\n\tconst %s& %s", c_type(Eptr->info.typ), ident(Eptr->sym->name)); else if ((Eptr->info.sto & Sconstptr)) fprintf(fhead, ",\n\tconst %s", c_type_id(Eptr->info.typ, Eptr->sym->name)); else if (Eptr->info.typ->type == Tarray) fprintf(fhead, ",\n\t%s", c_type_id(Eptr->info.typ, Eptr->sym->name)); else fprintf(fhead, ",\n\t%s", c_type_id(Eptr->info.typ, Eptr->sym->name)); if (derclass && Eptr->info.typ->type != Tarray) fprintf(fhead, "__%d", derclass); } } } if (namespaceid && !is_external(typ)) fprintf(fhead, ")\n{\n\t%s = %s::soap_new_%s(soap);\n\tif (_p)\n\t{\t", c_type_id(typ, "*_p"), namespaceid, c_ident(typ)); else if (!is_external(typ)) fprintf(fhead, ")\n{\n\t%s = ::soap_new_%s(soap);\n\tif (_p)\n\t{\t", c_type_id(typ, "*_p"), c_ident(typ)); else fprintf(fhead, ")\n{\n\t%s = soap_new_%s(soap);\n\tif (_p)\n\t{\t", c_type_id(typ, "*_p"), c_ident(typ)); if (!is_external(typ)) { if (typ->type == Tclass && !is_volatile(typ)) fprintf(fhead, "_p->soap_default(soap);"); else if (namespaceid && !is_external(typ)) fprintf(fhead, "%s::soap_default_%s(soap, _p);", namespaceid, c_ident(typ)); else if (!is_external(typ)) fprintf(fhead, "::soap_default_%s(soap, _p);", c_ident(typ)); else fprintf(fhead, "soap_default_%s(soap, _p);", c_ident(typ)); } for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) { if (!(Eptr->info.sto & (Sprivate | Sprotected | Sconst | Sstatic | Stypedef)) && Eptr->info.typ->type != Tfun && strcmp(Eptr->sym->name, "soap")) { if (is_smart(Eptr->info.typ) && !is_smart_shared(Eptr->info.typ)) /* smart but not shared */ { if (typ->type == Tclass) fprintf(fhead, "\n\t\t_p->%s::%s = %s(%s", ident(Tptr->sym->name), ident(Eptr->sym->name), c_type(Eptr->info.typ), ident(Eptr->sym->name)); else fprintf(fhead, "\n\t\t_p->%s = %s(%s", ident(Eptr->sym->name), c_type(Eptr->info.typ), ident(Eptr->sym->name)); } else if (Eptr->info.typ->type == Tarray) { int cardinality; Tnode *ref = get_item_type(Eptr->info.typ, &cardinality); if (cardinality > 1) { const char *t = c_type(ref); if (typ->type == Tclass) fprintf(fhead, "\n\t\tfor (int i = 0; i < %d; i++)\n\t\t\t((%s*)(_p->%s::%s))[i] = ((%s*)%s)", get_dimension_product(Eptr->info.typ), t, ident(Tptr->sym->name), ident(Eptr->sym->name), t, ident(Eptr->sym->name)); else fprintf(fhead, "\n\t\tfor (int i = 0; i < %d; i++)\n\t\t\t((%s*)(_p->%s))[i] = ((%s*)%s)", get_dimension_product(Eptr->info.typ), t, ident(Eptr->sym->name), t, ident(Eptr->sym->name)); } else { if (typ->type == Tclass) fprintf(fhead, "\n\t\tfor (int i = 0; i < %d; i++)\n\t\t\t_p->%s::%s[i] = %s", get_dimension(Eptr->info.typ), ident(Tptr->sym->name), ident(Eptr->sym->name), ident(Eptr->sym->name)); else fprintf(fhead, "\n\t\tfor (int i = 0; i < %d; i++)\n\t\t\t_p->%s[i] = %s", get_dimension(Eptr->info.typ), ident(Eptr->sym->name), ident(Eptr->sym->name)); } } else if (Eptr->info.typ->type == Ttemplate && is_smart(Eptr->info.typ->ref) && !is_smart_shared(Eptr->info.typ->ref)) continue; else if (typ->type == Tclass) fprintf(fhead, "\n\t\t_p->%s::%s = %s", ident(Tptr->sym->name), ident(Eptr->sym->name), ident(Eptr->sym->name)); else fprintf(fhead, "\n\t\t_p->%s = %s", ident(Eptr->sym->name), ident(Eptr->sym->name)); if (derclass && Eptr->info.typ->type != Tarray) fprintf(fhead, "__%d", derclass); if (Eptr->info.typ->type == Tarray) fprintf(fhead, "[i];"); else if (is_smart(Eptr->info.typ) && !is_smart_shared(Eptr->info.typ)) /* smart but not shared */ fprintf(fhead, ");"); else fprintf(fhead, ";"); } } } fprintf(fhead, "\n\t}\n\treturn _p;\n}"); } /* deprecated fprintf(fhead, "\n\ninline void soap_delete_%s(struct soap *soap, %s) { soap_delete(soap, p); }", c_ident(typ), c_type_id(typ, "*p")); */ fprintf(fout, "\n\nSOAP_FMAC1 %s * SOAP_FMAC2 %s_instantiate_%s(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size)", c_type(typ), fprefix, c_ident(typ)); fprintf(fout, "\n{"); fprintf(fout, "\n\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"%s_instantiate_%s(%%p, %%d, %%s, %%s)\\n\", (void*)soap, n, type?type:\"\", arrayType?arrayType:\"\"));", fprefix, c_ident(typ)); fprintf(fout, "\n\t(void)type; (void)arrayType; /* appease -Wall -Werror */"); for (Eptr = classtable->list; Eptr; Eptr = Eptr->next) { Tptr = ((Table *) Eptr->info.typ->ref); if (Tptr == ((Table *) typ->ref)) { continue; } derclass = 0; while (Tptr) { if (Tptr == (Table*)typ->ref) { derclass = 1; } Tptr = Tptr->prev; } if (derclass == 1 && !is_transient(Eptr->info.typ)) { if (is_dynamic_array(Eptr->info.typ) && !is_binary(Eptr->info.typ) && !has_ns(Eptr->info.typ) && !is_untyped(Eptr->info.typ)) fprintf(fout, "\n\tif (soap && arrayType && !soap_match_tag(soap, arrayType, \"%s\"))", xsi_type(Eptr->info.typ)); else fprintf(fout, "\n\tif (soap && type && !soap_match_tag(soap, type, \"%s\"))", the_type(Eptr->info.typ)); fprintf(fout, "\n\t\treturn %s_instantiate_%s(soap, n, NULL, NULL, size);", fprefix, c_ident(Eptr->info.typ)); derclass = 0; } } fprintf(fout, "\n\t%s;\n\tsize_t k = sizeof(%s);", c_type_id(typ, "*p"), c_type(typ)); fprintf(fout, "\n\tstruct soap_clist *cp = soap_link(soap, %s, n, %s_fdelete);", soap_type(typ), prefix); fprintf(fout, "\n\tif (!cp && soap && n != SOAP_NO_LINK_TO_DELETE)\n\t\treturn NULL;"); fprintf(fout, "\n\tif (n < 0)"); fprintf(fout, "\n\t{\tp = SOAP_NEW(soap, %s);", c_type(typ)); if ((s = has_soapref(typ))) fprintf(fout, "\n\t\tif (p)\n\t\t\tp->%s = soap;", s); fprintf(fout, "\n\t}\n\telse"); fprintf(fout, "\n\t{\tp = SOAP_NEW_ARRAY(soap, %s, n);", c_type(typ)); fprintf(fout, "\n\t\tk *= n;"); if (s) fprintf(fout, "\n\t\tif (p)\n\t\t\tfor (int i = 0; i < n; i++)\n\t\t\t\tp[i].%s = soap;", s); fprintf(fout, "\n\t}"); fprintf(fout, "\n\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Instantiated %s location=%%p n=%%d\\n\", (void*)p, n));", c_type(typ)); fprintf(fout, "\n\tif (size)\n\t\t*size = k;"); fprintf(fout, "\n\tif (!p)\n\t\tsoap->error = SOAP_EOM;"); fprintf(fout, "\n\telse if (cp)\n\t\tcp->ptr = (void*)p;"); fprintf(fout, "\n\treturn p;"); fprintf(fout, "\n}"); } void soap_dup(Tnode *typ) { if (!Ecflag) return; if (is_XML(typ)) return; if (typ->type != Tstruct && typ->type != Tclass && typ->type != Ttemplate && typ->type != Tpointer) return; if (typ->type != Tclass || !(typ->sym && (is_stdstring(typ) || is_stdwstring(typ)) && is_eq(typ->sym->name, "xsd__QName")) || is_imported(typ)) { if ((is_typedef(typ) && !is_external(typ)) || is_restriction(typ)) { fprintf(fhead, "\n\n#define %s_dup_%s %s_dup_%s\n", fprefix, c_ident(typ), fprefix, t_ident(typ)); return; } } if (typ->type == Tstruct && (is_anyType(typ) || is_anyAttribute(typ))) { if (strcmp(fprefix, "soap")) fprintf(fhead, "\n\n#define %s_dup_%s soap_dup_%s\n", fprefix, c_ident(typ), c_ident(typ)); return; } fprintf(fhead, "\n\nSOAP_FMAC1 %s * SOAP_FMAC2 %s_dup_%s(struct soap*, %s*, %s);", c_type(typ), fprefix, c_ident(typ), c_type(typ), c_type_constptr_id(typ, "const*")); fprintf(fout, "\n\nSOAP_FMAC1 %s * SOAP_FMAC2 %s_dup_%s(struct soap *soap, %s *d, %s)\n{", c_type(typ), fprefix, c_ident(typ), c_type(typ), c_type_constptr_id(typ, "const*a")); if (typ->type == Tclass || typ->type == Tstruct) { fprintf(fout, "\n\tstruct soap_plist *pp = NULL;"); if (typ->recursive) fprintf(fout, "\n\tchar *mark = NULL;"); } fprintf(fout, "\n\tif (!a)\n\t\treturn NULL;"); if (typ->type == Tclass || typ->type == Tstruct) { if (typ->recursive) fprintf(fout, "\n\tif (!d && ((d = (%s*)soap_mark_lookup(soap, (const void*)a, %s, &pp, &mark)) || soap_mark_cycle(soap, pp)))\n\t\treturn d;", c_type(typ), soap_type(typ)); else fprintf(fout, "\n\tif (!d && (d = (%s*)soap_mark_lookup(soap, (const void*)a, %s, &pp, NULL)))\n\t\treturn d;", c_type(typ), soap_type(typ)); } if (cflag) fprintf(fout, "\n\tif (!d && !(d = (%s*)soap_malloc(soap, sizeof(%s))))\n\t\treturn NULL; /* ERROR */", c_type(typ), c_type(typ)); else if (typ->type == Tpointer) fprintf(fout, "\n\tif (!d && !(d = (%s*)soap_malloc(soap, sizeof(%s))))\n\t\treturn NULL; /* ERROR */", c_type(typ), c_type(typ)); else fprintf(fout, "\n\tif (!d && !(d = soap_new_%s(soap)))\n\t\treturn NULL; /* ERROR */", c_ident(typ)); if (typ->type == Tclass || typ->type == Tstruct) fprintf(fout, "\n\tsoap_mark_dup(soap, (void*)d, pp);"); fflush(fout); if (is_string(typ)) { fprintf(fout, "\n\t*d = NULL;\n\tif (*a)\n\t{\tstruct soap_plist *pp = NULL;\n\t\tif (!(*d = (%s)soap_mark_lookup(soap, (const void*)*a, %s, &pp, NULL)))", c_type(typ), soap_type(typ)); fprintf(fout, "\n\t\t\tsoap_mark_dup(soap, *d = soap_strdup(soap, *a), pp);\n\t}\n\telse\n\t\t*d = NULL;"); } else if (is_wstring(typ)) { fprintf(fout, "\n\tif (*a)\n\t{\tstruct soap_plist *pp = NULL;\n\t\tif (!(*d = (%s)soap_mark_lookup(soap, (const void*)*a, %s, &pp, NULL)))", c_type(typ), soap_type(typ)); fprintf(fout, "\n\t\t\tsoap_mark_dup(soap, *d = soap_wstrdup(soap, *a), pp);\n\t}\n\telse\n\t\t*d = NULL;"); } else if (typ->type == Tpointer) { Tnode *ref = typ->ref; if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref)) { fprintf(fout, "\n\tif (*a)\n\t\t*d = (*a)->soap_dup(soap);\n\telse\n\t\t*d = NULL;"); } else if (is_XML(ref) && is_string(ref)) { if (cflag) fprintf(fout, "\n\tif (*a && (*d = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t**d = soap_strdup(soap, **a);\n\telse\n\t\t*d = NULL;", c_type(typ), c_type(ref)); else fprintf(fout, "\n\tif (*a && (*d = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t**d = soap_strdup(soap, **a);\n\telse\n\t\t*d = NULL;", c_type(typ), c_type(ref)); } else if (is_XML(ref) && is_wstring(ref)) { if (cflag) fprintf(fout, "\n\tif (*a && (*d = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t**d = soap_wstrdup(soap, **a);\n\telse\n\t\t*d = NULL;", c_type(typ), c_type(ref)); else fprintf(fout, "\n\tif (*a && (*d = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t**d = soap_wstrdup(soap, **a);\n\telse\n\t\t*d = NULL;", c_type(typ), c_type(ref)); } else if (is_primitive(ref) || is_external(typ) || is_volatile(ref) || is_transient(ref)) { if (cflag) fprintf(fout, "\n\tif (*a && (*d = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t**d = **a;\n\telse\n\t\t*d = NULL;", c_type(typ), c_type(ref)); else if (is_primitive(ref)) fprintf(fout, "\n\tif (*a && (*d = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t**d = **a;\n\telse\n\t\t*d = NULL;", c_type(typ), c_type(ref)); else fprintf(fout, "\n\tif (*a && (*d = soap_new_%s(soap)))\n\t\t**d = **a;\n\telse\n\t\t*d = NULL;", c_ident(ref)); if (!is_primitive(ref) && is_transient(ref)) fprintf(fout, " /* transient (shallow copy) */"); } else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) { fprintf(fout, "\n\tif (*a)\n\t\t*d = %s_dup_%s(soap, NULL, *a);\n\telse\n\t\t*d = NULL;", fprefix, c_ident(ref)); } } else if (is_smart(typ)) { Tnode *ref = typ->ref; if (is_smart_shared(typ)) { fprintf(fout, "\n\tif (*a)\n\t{\tstruct soap_plist *pp = NULL;\n\t\tchar *mark = NULL;\n\t\t%s *sp = (%s*)soap_mark_lookup(soap, (const void*)a->get(), %s, &pp, &mark);\n\t\tif (sp)\n\t\t\t*d = *sp;\n\t\telse if (soap_mark_cycle(soap, pp))\n\t\t\treturn d;\n\t\telse\n\t\t{\t", c_type(typ), c_type(typ), soap_type(typ)); if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref) && !is_transient(ref)) fprintf(fout, "*d = %s((*a)->soap_alloc());\n\t\t\tsoap_mark_dup(soap, (void*)d, pp);\n\t\t\t(*a)->soap_dup(soap, (void*)d->get());", c_type(typ)); else if (is_primitive(ref) || is_external(ref) || is_volatile(ref) || is_transient(ref)) fprintf(fout, "*d = %s<%s>(**a);", make_shared(typ), c_type(ref)); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "*d = %s<%s>();\n\t\t\tsoap_mark_dup(soap, (void*)d, pp);\n\t\t\t%s_dup_%s(soap, d->get(), a->get());", make_shared(typ), c_type(ref), fprefix, c_ident(ref)); fprintf(fout, "\n\t\t\tsoap_unmark(soap, mark);\n\t\t}\n\t}"); } else { if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref) && !is_transient(ref)) fprintf(fout, "\n\tif (a->get())\n\t\t*d = %s((*a)->soap_dup(soap, (void*)(*a)->soap_alloc()));", c_type(typ)); else if (is_primitive(ref) || is_transient(ref)) fprintf(fout, "\n\tif (a->get() && (*d = %s(SOAP_NEW(soap, %s))).get())\n\t\t**d = **a;", c_type(typ), c_type(ref)); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\tif (a->get())\n\t\t*d = %s(%s_dup_%s(soap, SOAP_NEW(soap, %s), a->get()));", c_type(typ), fprefix, c_ident(ref), c_type(ref)); } } else if (typ->type == Ttemplate) { Tnode *ref = typ->ref; if (strcmp(typ->id->name, "std::set") || is_primitive(ref) || is_external(ref) || is_volatile(ref) || is_transient(ref)) fprintf(fout, "\n\t*d = *a;"); if (!is_primitive(ref) && !is_external(ref) && !is_volatile(ref) && !is_transient(ref)) { if (!strcmp(typ->id->name, "std::set")) { fprintf(fout, "\n\t%s v;\n\tfor (%s::const_iterator i = a->begin(); i != a->end(); ++i)\n\t{\t", c_type(ref), c_type(typ)); if (is_XML(ref) && is_string(ref)) fprintf(fout, "v = soap_strdup(soap, *i);\n\t\td->insert(v);"); else if (is_XML(ref) && is_wstring(ref)) fprintf(fout, "v = soap_wstrdup(soap, *i);\n\t\td->insert(v);"); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "%s_dup_%s(soap, &v, &*i);\n\t\td->insert(v);", fprefix, c_ident(ref)); else fprintf(fout, "\n\t\td->insert(*i);"); } else { fprintf(fout, "\n\t%s::iterator j = d->begin();\n\tfor (%s::const_iterator i = a->begin(); i != a->end(); ++i, ++j)\n\t{\t", c_type(typ), c_type(typ)); if (is_XML(ref) && is_string(ref)) fprintf(fout, "*j = soap_strdup(soap, *i);"); else if (is_XML(ref) && is_wstring(ref)) fprintf(fout, "*j = soap_wstrdup(soap, *i);"); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "%s_dup_%s(soap, &*j, &*i);", fprefix, c_ident(ref)); } fprintf(fout, "\n\t}"); } } else if (typ->ref) { Entry *p = is_dynamic_array(typ); if (p) { if (is_binary(typ)) { if (cflag) fprintf(fout, "\n\td->__ptr = NULL;\n\td->__size = a->__size;\n\tif (a->__ptr && a->__size > 0)\n\t{\td->__ptr = (unsigned char*)soap_malloc(soap, a->__size);\n\t\tsoap_memcpy(d->__ptr, d->__size, a->__ptr, a->__size);\n\t}"); else fprintf(fout, "\n\td->__ptr = NULL;\n\td->__size = a->__size;\n\tif (a->__ptr && a->__size > 0)\n\t{\td->__ptr = (unsigned char*)soap_malloc(soap, a->__size);\n\t\tsoap_memcpy(d->__ptr, d->__size, a->__ptr, a->__size);\n\t}"); if (is_attachment(typ)) fprintf(fout, "\n\td->id = soap_strdup(soap, a->id);\n\td->type = soap_strdup(soap, a->type);\n\td->options = soap_strdup(soap, a->options); /* WARNING: cannot copy binary DIME attachment options correctly, MIME/MTOM is OK */"); } else { Tnode *ref = p->info.typ->ref; int dim = get_Darraydims(typ); const char *d = ident(p->sym->name); fprintf(fout, "\n\tif (a->%s)\n\t{", d); if (dim) fprintf(fout, "\tsize_t i, n = soap_size(a->__size, %d);", dim); else fprintf(fout, "\tint i, n = a->__size;"); if (cflag) fprintf(fout, "\n\t\td->%s = (%s)soap_malloc(soap, n * sizeof(%s));", d, c_type(p->info.typ), c_type(ref)); else if (is_primitive(ref) || ref->type == Tpointer) fprintf(fout, "\n\t\td->%s = (%s)soap_malloc(soap, n * sizeof(%s));", d, c_type(p->info.typ), c_type(ref)); else fprintf(fout, "\n\t\td->%s = soap_new_%s(soap, n);", d, c_ident(ref)); fprintf(fout, "\n\t\tfor (i = 0; i < n; i++)"); if (is_XML(ref) && is_string(ref)) fprintf(fout, "\n\t\t\td->%s[i] = soap_strdup(soap, a->%s[i]);", d, d); else if (is_XML(ref) && is_wstring(ref)) fprintf(fout, "\n\t\t\td->%s[i] = soap_wstrdup(soap, a->%s[i]);", d, d); else if (is_primitive(ref) || is_transient(ref)) fprintf(fout, "\n\t\t\td->%s[i] = a->%s[i];", d, d); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t\t%s_dup_%s(soap, &d->%s[i], &a->%s[i]);", fprefix, c_ident(ref), d, d); fprintf(fout, "\n\t}\n\telse\n\t\td->%s = NULL;", d); if (dim) fprintf(fout, "\n\tsoap_memcpy(&d->__size, sizeof(d->__size), &a->__size, sizeof(a->__size));"); else fprintf(fout, "\n\td->__size = a->__size;"); if (has_offset(typ)) { if (dim) fprintf(fout, "\n\tsoap_memcpy(&d->__offset, sizeof(d->__offset), &a->__offset, sizeof(a->__offset));"); else fprintf(fout, "\n\td->__offset = a->__offset;"); } } } else { Table *t = (Table*)typ->ref; const char *b = ""; const char *c = ""; if (typ->type == Tclass) { b = ident(t->sym->name); c = "::"; } if (t->prev) fprintf(fout, "\n\t%s_dup_%s(soap, d, a);", fprefix, ident(t->prev->sym->name)); for (p = ((Table*)typ->ref)->list; p; p = p->next) { const char *d = ident(p->sym->name); if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) { continue; } else if (p->info.sto & Sconst) { fprintf(fout, "\n\t/* const %s skipped */", d); } else if (p->info.sto & Sstatic) { fprintf(fout, "\n\t/* static %s skipped */", d); } else if (p->info.sto & Stypedef) { fprintf(fout, "\n\t/* typedef %s skipped */", d); } else if (is_repetition(p)) { Tnode *ref = p->next->info.typ->ref; const char *e = ident(p->next->sym->name); fprintf(fout, "\n\td->%s%s%s = a->%s%s%s;\n\tif (a->%s%s%s > 0 && a->%s%s%s)", b, c, d, b, c, d, b, c, d, b, c, e); if (cflag) { if (ref->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t{\tint i;\n\t\td->%s%s%s = (const %s)soap_malloc(soap, a->%s%s%s * sizeof(%s));", b, c, e, c_type(p->next->info.typ), b, c, d, c_type(ref)); else fprintf(fout, "\n\t{\tint i;\n\t\td->%s%s%s = (%s)soap_malloc(soap, a->%s%s%s * sizeof(%s));", b, c, e, c_type(p->next->info.typ), b, c, d, c_type(ref)); } else if (is_primitive(ref) || ref->type == Tpointer) { if (ref->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t{\tint i;\n\t\td->%s%s%s = (const %s)soap_malloc(soap, a->%s%s%s * sizeof(%s));", b, c, e, c_type(p->next->info.typ), b, c, d, c_type(ref)); else fprintf(fout, "\n\t{\tint i;\n\t\td->%s%s%s = (%s)soap_malloc(soap, a->%s%s%s * sizeof(%s));", b, c, e, c_type(p->next->info.typ), b, c, d, c_type(ref)); } else { fprintf(fout, "\n\t{\tint i;\n\t\td->%s%s%s = soap_new_%s(soap, a->%s%s%s);", b, c, e, c_ident(ref), b, c, d); } fprintf(fout, "\n\t\tfor (i = 0; i < (int)a->%s%s%s; i++)", b, c, d); if (is_XML(ref) && is_string(ref)) fprintf(fout, "\n\t\t\td->%s%s%s[i] = soap_strdup(soap, a->%s%s%s[i]);", b, c, e, b, c, e); else if (is_XML(ref) && is_wstring(ref)) fprintf(fout, "\n\t\t\td->%s%s%s[i] = soap_wstrdup(soap, a->%s%s%s[i]);", b, c, e, b, c, e); else if (is_primitive(ref)) fprintf(fout, "\n\t\t\td->%s%s%s[i] = a->%s%s%s[i];", b, c, e, b, c, e); else if (ref->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t\t\t%s_dup_%s(soap, (%s)&d->%s%s%s[i], (%s)&a->%s%s%s[i]);", fprefix, c_ident(ref), c_type_id(ref, "*"), b, c, e, c_type_id(ref, "const*"), b, c, e); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t\t%s_dup_%s(soap, &d->%s%s%s[i], &a->%s%s%s[i]);", fprefix, c_ident(ref), b, c, e, b, c, e); fprintf(fout, "\n\t}\n\telse\n\t\td->%s%s%s = NULL;", b, c, e); p = p->next; } else if (is_anytype(p)) { fprintf(fout, "\n\td->%s%s%s = soap_dupelement(soap, a->%s%s%s, d->%s%s%s = a->%s%s%s);", b, c, ident(p->next->sym->name), b, c, ident(p->next->sym->name), b, c, d, b, c, d); p = p->next; } else if (is_choice(p)) { Entry *q; const char *e = ident(p->next->sym->name); fprintf(fout, "\n\td->%s%s%s = a->%s%s%s;", b, c, d, b, c, d); fprintf(fout, "\n\tswitch (a->%s%s%s)\n\t{", b, c, d); t = (Table*)p->next->info.typ->ref; if (t) { for (q = t->list; q; q = q->next) { const char *f = ident(q->sym->name); fprintf(fout, "\n\t\tcase %s:", soap_union_member(p->next->info.typ, q)); if (is_XML(q->info.typ) && is_string(q->info.typ)) fprintf(fout, "\n\t\t\td->%s%s%s.%s = soap_strdup(soap, a->%s%s%s.%s);", b, c, e, f, b, c, e, f); else if (is_XML(q->info.typ) && is_wstring(q->info.typ)) fprintf(fout, "\n\t\t\td->%s%s%s.%s = soap_wstrdup(soap, a->%s%s%s.%s);", b, c, e, f, b, c, e, f); else if (is_primitive(q->info.typ)) fprintf(fout, "\n\t\t\td->%s%s%s.%s = a->%s%s%s.%s;", b, c, e, f, b, c, e, f); else if (is_transient(q->info.typ)) fprintf(fout, "\n\t\t\td->%s%s%s.%s = a->%s%s%s.%s; /* transient (shallow copy) */", b, c, e, f, b, c, e, f); else if (q->info.typ->type == Tclass || q->info.typ->type == Tstruct || q->info.typ->type == Ttemplate || q->info.typ->type == Tpointer) fprintf(fout, "\n\t\t\t%s_dup_%s(soap, &d->%s%s%s.%s, &a->%s%s%s.%s);", fprefix, c_ident(q->info.typ), b, c, e, f, b, c, e, f); fprintf(fout, "\n\t\t\tbreak;"); } } fprintf(fout, "\n\t}"); p = p->next; } else if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "\n\td->%s%s%s = soap_strdup(soap, (char*)a->%s%s%s);", b, c, d, b, c, d); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "\n\td->%s%s%s = soap_wstrdup(soap, (char*)a->%s%s%s);", b, c, d, b, c, d); } else if (is_soapref(p->info.typ)) { fprintf(fout, "\n\td->%s%s%s = soap;", b, c, d); } else if (is_primitive(p->info.typ)) { fprintf(fout, "\n\td->%s%s%s = a->%s%s%s;", b, c, d, b, c, d); } else if (is_pointer_to_derived(p)) { Tnode *ref = p->info.typ->ref; if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref)) fprintf(fout, "\n\td->%s%s%s = a->%s%s%s ? a->%s%s%s->soap_dup(soap) : NULL;", b, c, d, b, c, d, b, c, d); else if (ref->type == Tstruct || ref->type == Tclass) fprintf(fout, "\n\td->%s%s%s = a->%s%s%s ? %s_dup_%s(soap, NULL, a->%s%s%s) : NULL;", b, c, d, b, c, d, fprefix, c_ident(ref), b, c, d); else if (is_primitive(ref)) fprintf(fout, "\n\tif (a->%s%s%s && (d->%s%s%s = (%s)soap_malloc(soap, sizeof(%s))) != NULL)\n\t\t*d->%s%s%s = *a->%s%s%s;\n\telse\n\t\td->%s%s%s = NULL;", b, c, d, b, c, d, c_type(p->info.typ), c_type(ref), b, c, d, b, c, d, b, c, d); } else if (is_transient(p->info.typ)) { fprintf(fout, "\n\td->%s%s%s = a->%s%s%s; /* transient (shallow copy) */", b, c, d, b, c, d); } else if (p->info.typ->type == Tarray) { int cardinality; Tnode *ref = get_item_type(p->info.typ, &cardinality); if (cardinality > 1) { const char *t = c_type(ref); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < %d; i++)", get_dimension_product(p->info.typ)); if (is_XML(ref) && is_string(ref)) fprintf(fout, "\n\t\t\t((%s*)(d->%s%s%s))[i] = soap_strdup(soap, ((%s*)(a->%s%s%s))[i]);", t, b, c, d, t, b, c, d); else if (is_XML(ref) && is_wstring(ref)) fprintf(fout, "\n\t\t\t((%s*)(d->%s%s%s))[i] = soap_wstrdup(soap, ((%s*)(a->%s%s%s))[i]);", t, b, c, d, t, b, c, d); else if (is_primitive(ref)) fprintf(fout, "\n\t\t\t((%s*)(d->%s%s%s))[i] = ((%s*)(a->%s%s%s))[i];", t, b, c, d, t, b, c, d); else if (is_transient(ref)) fprintf(fout, "\n\t\t\t((%s*)(d->%s%s%s))[i] = ((%s*)(a->%s%s%s))[i]; /* transient (shallow copy) */", t, b, c, d, t, b, c, d); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t\t%s_dup_%s(soap, &((%s*)(d->%s%s%s))[i], &((%s*)(a->%s%s%s))[i]);", fprefix, c_ident(ref), t, b, c, d, t, b, c, d); } else { fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < %d; i++)", get_dimension(p->info.typ)); if (is_XML(ref) && is_string(ref)) fprintf(fout, "\n\t\t\td->%s%s%s[i] = soap_strdup(soap, a->%s%s%s[i]);", b, c, d, b, c, d); else if (is_XML(ref) && is_wstring(ref)) fprintf(fout, "\n\t\t\td->%s%s%s[i] = soap_wstrdup(soap, a->%s%s%s[i]);", b, c, d, b, c, d); else if (is_primitive(ref)) fprintf(fout, "\n\t\t\td->%s%s%s[i] = a->%s%s%s[i];", b, c, d, b, c, d); else if (is_transient(ref)) fprintf(fout, "\n\t\t\td->%s%s%s[i] = a->%s%s%s[i]; /* transient (shallow copy) */", b, c, d, b, c, d); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t\t%s_dup_%s(soap, &d->%s%s%s[i], &a->%s%s%s[i]);", fprefix, c_ident(ref), b, c, d, b, c, d); } fprintf(fout, "\n\t}"); } else if (p->info.typ->type == Tpointer && (p->info.sto & Sconstptr)) { fprintf(fout, "\n\t%s_dup_%s(soap, (%s)&d->%s%s%s, (%s)&a->%s%s%s);", fprefix, c_ident(p->info.typ), c_type_id(p->info.typ, "*"), b, c, d, c_type_id(p->info.typ, "const*"), b, c, d); } else if (p->info.typ->type == Tclass || p->info.typ->type == Tstruct || p->info.typ->type == Ttemplate || p->info.typ->type == Tpointer) { fprintf(fout, "\n\t%s_dup_%s(soap, &d->%s%s%s, &a->%s%s%s);", fprefix, c_ident(p->info.typ), b, c, d, b, c, d); } else { fprintf(fout, "\n\t/* %s skipped */", d); } } } } else { fprintf(fout, "\n\t*d = *a;"); } if ((typ->type == Tclass || typ->type == Tstruct) && typ->recursive) fprintf(fout, "\n\tsoap_unmark(soap, mark);"); fprintf(fout, "\n\treturn d;\n}"); fflush(fout); } void soap_del(Tnode *typ) { if (!Edflag) return; if (is_XML(typ)) return; if (typ->type != Tstruct && typ->type != Tclass && typ->type != Ttemplate && typ->type != Tpointer) return; if (typ->type != Tclass || !(typ->sym && (is_stdstring(typ) || is_stdwstring(typ)) && is_eq(typ->sym->name, "xsd__QName")) || is_imported(typ)) { if ((is_typedef(typ) && !is_external(typ)) || is_restriction(typ)) { fprintf(fhead, "\n\n#define %s_del_%s %s_del_%s\n", fprefix, c_ident(typ), fprefix, t_ident(typ)); return; } } if (typ->type == Tstruct && (is_anyType(typ) || is_anyAttribute(typ))) { if (strcmp(fprefix, "soap")) fprintf(fhead, "\n\n#define %s_del_%s soap_del_%s\n", fprefix, c_ident(typ), c_ident(typ)); return; } fprintf(fhead, "\n\nSOAP_FMAC1 void SOAP_FMAC2 %s_del_%s(%s);", fprefix, c_ident(typ), c_type_constptr_id(typ, "const*")); fprintf(fout, "\n\nSOAP_FMAC1 void SOAP_FMAC2 %s_del_%s(%s)\n{", fprefix, c_ident(typ), c_type_constptr_id(typ, "const*a")); fprintf(fout, "\n\tif (!a)\n\t\treturn;"); fflush(fout); if (is_string(typ) || is_wstring(typ)) { if (cflag) fprintf(fout, "\n\tif (*a)\n\t\tSOAP_FREE(NULL, *a);"); else fprintf(fout, "\n\tif (*a)\n\t\tSOAP_FREE(NULL, *a);"); } else if (typ->type == Tpointer) { Tnode *ref = typ->ref; if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref)) fprintf(fout, "\n\tif (*a)\n\t{\t(*a)->soap_del();\n\t\tSOAP_DELETE(NULL, *a, %s);\n\t}", c_type(ref)); else if (is_XML(ref)) { if (cflag) fprintf(fout, "\n\tif (*a)\n\t{\tif (**a)\n\t\t\tSOAP_FREE(NULL, **a);\n\t\tSOAP_FREE(NULL, *a);\n\t}"); else fprintf(fout, "\n\tif (*a)\n\t{\tif (**a)\n\t\t\tSOAP_FREE(NULL, **a);\n\t\tSOAP_FREE(NULL, *a);\n\t}"); } else if (is_primitive(ref) || is_external(typ) || is_volatile(ref) || is_transient(ref)) { if (cflag) fprintf(fout, "\n\tif (*a)\n\t\tSOAP_FREE(NULL, *a);"); else if (is_primitive(ref)) fprintf(fout, "\n\tif (*a)\n\t\tSOAP_FREE(NULL, *a);"); else fprintf(fout, "\n\tif (*a)\n\t\tSOAP_DELETE(NULL, *a, %s);", c_type(ref)); } else if (cflag) fprintf(fout, "\n\tif (*a)\n\t{\t%s_del_%s(*a);\n\t\tSOAP_FREE(NULL, *a);\n\t}", fprefix, c_ident(ref)); else if (ref->type == Tpointer) fprintf(fout, "\n\tif (*a)\n\t{\t%s_del_%s(*a);\n\t\tSOAP_FREE(NULL, *a);\n\t}", fprefix, c_ident(ref)); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate) fprintf(fout, "\n\tif (*a)\n\t{\t%s_del_%s(*a);\n\t\tSOAP_DELETE(NULL, *a, %s);\n\t}", fprefix, c_ident(ref), c_type(ref)); } else if (is_smart(typ)) { Tnode *ref = typ->ref; if (is_smart_shared(typ)) { if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref) && !is_transient(ref)) fprintf(fout, "\n\tif (*a)\n\t\t(*a)->soap_del();"); else if (is_primitive(ref) || is_transient(ref)) ; else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\tif (*a)\n\t\t%s_del_%s(a->get());", fprefix, c_ident(ref)); } else { if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref) && !is_transient(ref)) fprintf(fout, "\n\tif (a->get())\n\t\t(*a)->soap_del();"); else if (is_primitive(ref) || is_transient(ref)) ; else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\tif (a->get())\n\t\t%s_del_%s(a->get());", fprefix, c_ident(ref)); } } else if (typ->type == Ttemplate) { Tnode *ref = typ->ref; if (!is_primitive(ref) && !is_external(typ) && !is_volatile(ref) && !is_transient(ref)) { fprintf(fout, "\n\tfor (%s::const_iterator i = a->begin(); i != a->end(); ++i)", c_type(typ)); if (is_XML(ref)) fprintf(fout, "\n\t\tSOAP_FREE(NULL, *i);"); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t%s_del_%s(&*i);", fprefix, c_ident(ref)); else fprintf(fout, "\n\t\t; /* skipped */"); } } else if (typ->ref) { Entry *p = is_dynamic_array(typ); if (p) { if (is_binary(typ)) { if (cflag) fprintf(fout, "\n\tif (a->__ptr)\n\t\tSOAP_FREE(NULL, a->__ptr);"); else fprintf(fout, "\n\tif (a->__ptr)\n\t\tSOAP_FREE(NULL, a->__ptr);"); if (is_attachment(typ)) { if (cflag) fprintf(fout, "\n\tif (a->id)\n\t\tSOAP_FREE(NULL, a->id);\n\tif (a->type)\n\t\tSOAP_FREE(NULL, a->type);\n\tif (a->options)\n\t\tSOAP_FREE(NULL, a->options);"); else fprintf(fout, "\n\tif (a->id)\n\t\tSOAP_FREE(NULL, a->id);\n\tif (a->type)\n\t\tSOAP_FREE(NULL, a->type);\n\tif (a->options)\n\t\tSOAP_FREE(NULL, a->options);"); } } else { Tnode *ref = p->info.typ->ref; int dim = get_Darraydims(typ); const char *d = ident(p->sym->name); fprintf(fout, "\n\tif (a->%s)\n\t{", d); if (!is_primitive(ref) && !is_transient(ref)) { if (dim) fprintf(fout, "\tsize_t i, n = soap_size(a->__size, %d);", dim); else fprintf(fout, "\tint i, n = a->__size;"); fprintf(fout, "\n\t\tfor (i = 0; i < n; i++)"); if (is_XML(ref)) fprintf(fout, "\n\t\t\tSOAP_FREE(NULL, a->%s[i]);", d); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t\t%s_del_%s(&a->%s[i]);", fprefix, c_ident(ref), d); } if (cflag || is_primitive(ref) || ref->type == Tpointer) fprintf(fout, "\n\t\tSOAP_FREE(NULL, a->%s);\n\t}", d); else fprintf(fout, "\n\t\tSOAP_DELETE_ARRAY(NULL, a->%s, %s);\n\t}", d, c_type(ref)); } } else { Table *t = (Table*)typ->ref; const char *b = ""; const char *c = ""; if (typ->type == Tclass) { b = ident(t->sym->name); c = "::"; } if (t->prev) fprintf(fout, "\n\t%s_del_%s(a);", fprefix, ident(t->prev->sym->name)); for (p = ((Table*)typ->ref)->list; p; p = p->next) { const char *d = ident(p->sym->name); if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) { continue; } else if (p->info.sto & Sconst) { fprintf(fout, "\n\t/* const %s skipped */", d); } else if (p->info.sto & Sstatic) { fprintf(fout, "\n\t/* static %s skipped */", d); } else if (p->info.sto & Stypedef) { fprintf(fout, "\n\t/* typedef %s skipped */", d); } else if (is_repetition(p)) { Tnode *ref = p->next->info.typ->ref; const char *e = ident(p->next->sym->name); fprintf(fout, "\n\tif (a->%s%s%s)\n\t{", b, c, e); if (!is_primitive(ref) && !is_transient(ref)) { fprintf(fout, "\tint i;\n\t\tfor (i = 0; i < (int)a->%s%s%s; i++)", b, c, d); if (is_XML(ref)) fprintf(fout, "\n\t\t\tSOAP_FREE(NULL, a->%s%s%s[i]);", b, c, e); else if (ref->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t\t\t%s_del_%s((%s)&a->%s%s%s[i]);", fprefix, c_ident(ref), c_type_id(ref, "*"), b, c, e); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t\t%s_del_%s(&a->%s%s%s[i]);", fprefix, c_ident(ref), b, c, e); } if (cflag) fprintf(fout, "\n\t\tSOAP_FREE(NULL, a->%s%s%s);\n\t}", b, c, e); else if (is_primitive(ref) || ref->type == Tpointer) fprintf(fout, "\n\t\tSOAP_FREE(NULL, a->%s%s%s);\n\t}", b, c, e); else fprintf(fout, "\n\t\tSOAP_DELETE_ARRAY(soap, a->%s%s%s, %s);\n\t}", b, c, e, c_type(ref)); p = p->next; } else if (is_anytype(p)) { fprintf(fout, "\n\tsoap_delelement(a->%s%s%s, a->%s%s%s);", b, c, ident(p->next->sym->name), b, c, d); p = p->next; } else if (is_choice(p)) { Entry *q; const char *e = ident(p->next->sym->name); fprintf(fout, "\n\tswitch (a->%s%s%s)\n\t{", b, c, d); t = (Table*)p->next->info.typ->ref; if (t) { for (q = t->list; q; q = q->next) { if (!is_primitive(q->info.typ) && !is_transient(q->info.typ)) { const char *f = ident(q->sym->name); fprintf(fout, "\n\t\tcase %s:", soap_union_member(p->next->info.typ, q)); if (is_XML(q->info.typ)) fprintf(fout, "\n\t\t\tif (a->%s%s%s.%s)\n\t\t\t\tSOAP_FREE(NULL, a->%s%s%s.%s);", b, c, e, f, b, c, e, f); else if (q->info.typ->type == Tclass || q->info.typ->type == Tstruct || q->info.typ->type == Ttemplate || q->info.typ->type == Tpointer) fprintf(fout, "\n\t\t\t%s_del_%s(&a->%s%s%s.%s);", fprefix, c_ident(q->info.typ), b, c, e, f); fprintf(fout, "\n\t\t\tbreak;"); } } } fprintf(fout, "\n\t}"); p = p->next; } else if (is_XML(p->info.typ)) { fprintf(fout, "\n\tif (a->%s%s%s)\n\t\tSOAP_FREE(NULL, a->%s%s%s);", b, c, d, b, c, d); } else if (p->info.typ->type == Tpointer && (p->info.sto & Sconstptr)) { fprintf(fout, "\n\t%s_del_%s((%s)&a->%s%s%s);", fprefix, c_ident(p->info.typ), c_type_id(p->info.typ, "*"), b, c, d); } else if (is_primitive(p->info.typ)) { fprintf(fout, "\n\t/* %s skipped */", d); } else if (is_pointer_to_derived(p)) { Tnode *ref = p->info.typ->ref; if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref)) fprintf(fout, "\n\tif (a->%s%s%s)\n\t{\ta->%s%s%s->soap_del();\n\t\tSOAP_DELETE(NULL, a->%s%s%s, %s);\n\t}", b, c, d, b, c, d, b, c, d, c_type(ref)); else if (ref->type == Tstruct || ref->type == Tclass) fprintf(fout, "\n\tif (a->%s%s%s)\n\t{\t%s_del_%s(a->%s%s%s);\n\t\tSOAP_FREE(NULL, a->%s%s%s);\n\t}", b, c, d, fprefix, c_ident(ref), b, c, d, b, c, d); else if (is_primitive(ref)) fprintf(fout, "\n\tif (a->%s%s%s)\n\t\tSOAP_FREE(NULL, a->%s%s%s);", b, c, d, b, c, d); } else if (is_transient(p->info.typ)) { fprintf(fout, "\n\t/* transient %s skipped */", d); } else if (p->info.typ->type == Tarray) { int cardinality; Tnode *ref = get_item_type(p->info.typ, &cardinality); if (!is_primitive(ref) && !is_transient(ref)) { if (cardinality > 1) { const char *t = c_type(ref); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < %d; i++)", get_dimension_product(p->info.typ)); if (is_XML(ref)) fprintf(fout, "\n\t\t\tif (((%s*)(a->%s%s%s))[i])\n\t\t\t\tSOAP_FREE(NULL, ((%s*)(a->%s%s%s))[i]);", t, b, c, d, t, b, c, d); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t\t%s_del_%s(&((%s*)(a->%s%s%s))[i]);", fprefix, c_ident(ref), t, b, c, d); } else { fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < %d; i++)", get_dimension(p->info.typ)); if (is_XML(ref)) fprintf(fout, "\n\t\t\tif (a->%s%s%s[i])\n\t\t\t\tSOAP_FREE(NULL, a->%s%s%s[i]);", b, c, d, b, c, d); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t\t%s_del_%s(&a->%s%s%s[i]);", fprefix, c_ident(ref), b, c, d); } fprintf(fout, "\n\t}"); } } else if (p->info.typ->type == Tclass || p->info.typ->type == Tstruct || p->info.typ->type == Ttemplate || p->info.typ->type == Tpointer) { fprintf(fout, "\n\t%s_del_%s(&a->%s%s%s);", fprefix, c_ident(p->info.typ), b, c, d); } else { fprintf(fout, "\n\t/* %s skipped */", d); } } } } fprintf(fout, "\n}"); fflush(fout); } int get_dimension(Tnode *typ) { if (((Tnode*)typ->ref)->width) return typ->width / ((Tnode*) typ->ref)->width; return 0; } int get_dimension_product(Tnode *typ) { int total = 1; while (typ->type == Tarray) { total *= get_dimension(typ); typ = (Tnode*)typ->ref; } return total; } Tnode * get_item_type(Tnode *typ, int *depth) { *depth = 0; while (typ->type == Tarray) { typ = (Tnode*)typ->ref; (*depth)++; } return typ; } void soap_serialize(Tnode *typ) { int d; Table *table, *t; Entry *p; Tnode* temp; int cardinality; const char *self; if (is_XML(typ)) return; if (is_primitive(typ)) return; if (is_typedef(typ) && (is_template(typ) || is_element(typ) || is_restriction(typ) || is_external(typ) || is_imported(typ)) && (!is_external(typ) || is_volatile(typ))) { if (typ->type == Tclass && !is_stdstring(typ) && !is_stdwstring(typ) && !is_volatile(typ)) fprintf(fhead, "\n\n#define soap_serialize_%s(soap, a) (a)->soap_serialize(soap)\n", c_ident(typ)); else { if (typ->type == Tstruct && is_element(typ)) /* don't permit for typedef'd elements, see soap_put() */ fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);", t_ident(typ), c_type_id(typ, "*")); fprintf(fhead, "\n\n#define soap_serialize_%s soap_serialize_%s\n", c_ident(typ), t_ident(typ)); } return; } if ((p = is_dynamic_array(typ))) { if (typ->type == Tclass && !is_typedef(typ) && !is_volatile(typ)) { if (is_external(typ)) return; fprintf(fout, "\n\nvoid %s::soap_serialize(struct soap *soap) const\n{", c_ident(typ)); fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */\n#ifndef WITH_NOIDREF"); if (is_binary(typ)) { if (is_attachment(typ)) fprintf(fout, "\n\tif (this->__ptr)\n\t\t(void)soap_attachment_reference(soap, this, this->__ptr, this->__size, %s, this->id, this->type);\n#endif\n}", soap_type(typ)); else fprintf(fout, "\n\tif (this->__ptr)\n\t\t(void)soap_array_reference(soap, this, this->__ptr, this->__size, %s);\n#endif\n}", soap_type(typ)); fflush(fout); return; } else { d = get_Darraydims(typ); if (d) { fprintf(fout, "\n\tif (this->%s && !soap_array_reference(soap, this, this->%s, %s, %s))", ident(p->sym->name), ident(p->sym->name), get_Darraysize("this", d), soap_type(typ)); fprintf(fout, "\n\t{\tsize_t i, n = soap_size(this->__size, %d);", d); fprintf(fout, "\n\t\tfor (i = 0; i < n; i++)"); } else { fprintf(fout, "\n\tif (this->%s && !soap_array_reference(soap, this, this->%s, this->__size, %s))", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\t{\tfor (size_t i = 0; i < (size_t)this->__size; i++)"); } fprintf(fout, "\n\t\t{"); if (has_ptr((Tnode*)p->info.typ->ref)) fprintf(fout, "\tsoap_embedded(soap, this->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_XML((Tnode*)p->info.typ->ref) && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tthis->%s[i].soap_serialize(soap);", ident(p->sym->name)); else if (is_string((Tnode*)p->info.typ->ref) && !is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (char*const*)(this->%s + i));", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); else if (is_wstring((Tnode*)p->info.typ->ref) && !is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (wchar_t*const*)(this->%s + i));", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); else if (!is_XML((Tnode*)p->info.typ->ref) && !is_primitive((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, this->%s + i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); fprintf(fout, "\n\t\t}\n\t}\n#endif\n}"); return; } } else { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, const %s)\n{", c_ident(typ), c_type_id(typ, "*a")); if (is_binary(typ)) { fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */\n#ifndef WITH_NOIDREF"); if (is_attachment(typ)) fprintf(fout, "\n\tif (a->%s)\n\t\t(void)soap_attachment_reference(soap, a, a->%s, a->__size, %s, a->id, a->type);\n#endif\n}", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); else fprintf(fout, "\n\tif (a->%s)\n\t\t(void)soap_array_reference(soap, a, a->%s, a->__size, %s);\n#endif\n}", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fflush(fout); return; } else { fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */\n#ifndef WITH_NOIDREF"); d = get_Darraydims(typ); if (d) { fprintf(fout, "\n\tif (a->%s && !soap_array_reference(soap, a, a->%s, %s, %s))", ident(p->sym->name), ident(p->sym->name), get_Darraysize("a", d), soap_type(typ)); fprintf(fout, "\n\t{\tsize_t i, n = soap_size(a->__size, %d);", d); fprintf(fout, "\n\t\tfor (i = 0; i < n; i++)"); } else { fprintf(fout, "\n\tif (a->%s && !soap_array_reference(soap, a, a->%s, a->__size, %s))", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < a->__size; i++)"); } fprintf(fout, "\n\t\t{"); if (has_ptr((Tnode*)p->info.typ->ref)) fprintf(fout, "\tsoap_embedded(soap, a->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_XML((Tnode*)p->info.typ->ref) && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\ta->%s[i].soap_serialize(soap);", ident(p->sym->name)); else if (is_string((Tnode*)p->info.typ->ref) && !is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (char*const*)(a->%s + i));", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); else if (is_wstring((Tnode*)p->info.typ->ref) && !is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (wchar_t*const*)(a->%s + i));", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); else if (!is_XML((Tnode*)p->info.typ->ref) && !is_primitive((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, a->%s + i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); fprintf(fout, "\n\t\t}\n\t}\n#endif\n}"); fflush(fout); return; } } } if (is_stdstring(typ) || is_stdwstring(typ)) { fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, const %s)\n{\t(void)soap; (void)a; /* appease -Wall -Werror */\n}", c_ident(typ), c_type_id(typ, "*a")); return; } switch(typ->type) { case Tclass: if (!is_volatile(typ) && typ->ref) /* fall through to switch case Tstruct */ { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); return; } if (!is_typedef(typ)) { self = "this"; fprintf(fout, "\n\nvoid %s::soap_serialize(struct soap *soap) const\n{\n\t(void)soap; /* appease -Wall -Werror */", ident(typ->id->name)); } else { self = "p"; fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, const %s)\n{\n\t(void)soap; (void)p; /* appease -Wall -Werror */", c_ident(typ), c_type_id(typ, "*p")); } fprintf(fout, "\n#ifndef WITH_NOIDREF"); table = (Table*)typ->ref; if (table && !is_invisible(typ->id->name)) { for (p = table->list; p; p = p->next) { if (is_pointer_to_derived(p)) { Tnode *ref = p->info.typ->ref; if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref)) fprintf(fout, "\n\tif (this->%s)\n\t{\tthis->%s->soap_serialize(soap);\n\t\treturn;\n\t}", ident(p->sym->name), ident(p->sym->name)); else if (!is_primitive_or_string(ref)) fprintf(fout, "\n\tif (this->%s)\n\t{\tsoap_serialize_%s(soap, this->%s);\n\t\treturn;\n\t}", ident(p->sym->name), c_ident(ref), ident(p->sym->name)); else fprintf(fout, "\n\tif (this->%s)\n\t\treturn;", ident(p->sym->name)); } } } for (p = table->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if ((p->info.sto & Sattribute)) ; else if (is_repetition(p)) { if (!is_XML(p->next->info.typ)) { fprintf(fout, "\n\tif (%s->%s::%s)", self, ident(table->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < (int)%s->%s::%s; i++)\n\t\t{", self, ident(table->sym->name), ident(p->sym->name)); if (!is_invisible(p->next->sym->name)) if (has_ptr((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_embedded(soap, %s->%s::%s + i, %s);", self, ident(table->sym->name), ident(p->next->sym->name), soap_type((Tnode*)p->next->info.typ->ref)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t%s->%s::%s[i].soap_serialize(soap);", self, ident(table->sym->name), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (char*const*)(%s->%s::%s + i));", c_ident((Tnode*)p->next->info.typ->ref), self, ident(table->sym->name), ident(p->next->sym->name)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (wchar_t*const*)(%s->%s::%s + i));", c_ident((Tnode*)p->next->info.typ->ref), self, ident(table->sym->name), ident(p->next->sym->name)); else if (!is_primitive((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, %s->%s::%s + i);", c_ident((Tnode*)p->next->info.typ->ref), self, ident(table->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\t}\n\t}"); } p = p->next; } else if (is_anytype(p)) { fprintf(fout, "\n\tsoap_markelement(soap, %s->%s, %s->%s);", self, ident(p->next->sym->name), self, ident(p->sym->name)); p = p->next; } else if (is_choice(p)) { fprintf(fout, "\n\tsoap_serialize_%s(soap, %s->%s::%s, &%s->%s::%s);", c_ident(p->next->info.typ), self, ident(table->sym->name), ident(p->sym->name), self, ident(table->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_transient(p->info.typ)) { if (!is_pointer_to_derived(p)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); } else if (p->info.typ->type == Tarray) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, %s->%s::%s, %s);", self, ident(table->sym->name), ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\tsoap_serialize_%s(soap, %s->%s::%s);", c_ident(p->info.typ), self, ident(table->sym->name), ident(p->sym->name)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &%s->%s::%s, %s);", self, ident(table->sym->name), ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\t%s->%s::%s.soap_serialize(soap);", self, ident(table->sym->name), ident(p->sym->name)); } else if (!is_void(p->info.typ) && !is_XML(p->info.typ)) { if (!is_template(p->info.typ)) if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &%s->%s::%s, %s);", self, ident(table->sym->name), ident(p->sym->name), soap_type(p->info.typ)); if (is_string(p->info.typ)) fprintf(fout, "\n\tsoap_serialize_%s(soap, (char*const*)&%s->%s::%s);", c_ident(p->info.typ), self, ident(table->sym->name), ident(p->sym->name)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\tsoap_serialize_%s(soap, (wchar_t*const*)&%s->%s::%s);", c_ident(p->info.typ), self, ident(table->sym->name), ident(p->sym->name)); else if ((p->info.typ->type == Treference || p->info.typ->type == Trvalueref) && ((Tnode*)(p->info.typ->ref))->type == Tclass && !is_external(p->info.typ->ref) && !is_volatile(p->info.typ->ref)) fprintf(fout, "\n\t%s->%s::%s.soap_serialize(soap);", self, ident(table->sym->name), ident(p->sym->name)); else if ((p->info.typ->type == Treference || p->info.typ->type == Trvalueref) && !is_primitive(p->info.typ->ref)) fprintf(fout, "\n\tsoap_serialize_%s(soap, &%s->%s::%s);", c_ident(p->info.typ), self, ident(table->sym->name), ident(p->sym->name)); else if (!is_primitive(p->info.typ) && p->info.typ->type != Treference && p->info.typ->type != Trvalueref) fprintf(fout, "\n\tsoap_serialize_%s(soap, &%s->%s::%s);", c_ident(p->info.typ), self, ident(table->sym->name), ident(p->sym->name)); else if (!is_primitive(p->info.typ)) fprintf(fout, "\n\t/* %s skipped */", ident(p->sym->name)); } } if (table && table->prev) fprintf(fout, "\n\t%s->%s::soap_serialize(soap);", self, ident(table->prev->sym->name)); fprintf(fout, "\n#endif\n}"); break; } /* fall through to next case when class is volatile, since serializers cannot be member functions */ case Tstruct: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, const %s)\n{", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */\n#ifndef WITH_NOIDREF"); table = (Table*)typ->ref; if (table && !is_invisible(typ->id->name)) { for (p = table->list; p; p = p->next) { if (is_pointer_to_derived(p)) { Tnode *ref = p->info.typ->ref; if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref)) fprintf(fout, "\n\tif (a->%s)\n\t{\ta->%s->soap_serialize(soap);\n\t\treturn;\n\t}", ident(p->sym->name), ident(p->sym->name)); else if (!is_primitive_or_string(ref)) fprintf(fout, "\n\tif (a->%s)\n\t{\tsoap_serialize_%s(soap, a->%s);\n\t\treturn;\n\t}", ident(p->sym->name), c_ident(ref), ident(p->sym->name)); else fprintf(fout, "\n\tif (a->%s)\n\t\treturn;", ident(p->sym->name)); } } } for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { if (!is_XML(p->next->info.typ)) { fprintf(fout, "\n\tif (a->%s)", ident(p->next->sym->name)); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < (int)a->%s; i++)\n\t\t{", ident(p->sym->name)); if (!is_invisible(p->next->sym->name)) if (has_ptr((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_embedded(soap, a->%s + i, %s);", ident(p->next->sym->name), soap_type((Tnode*)p->next->info.typ->ref)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\ta->%s[i].soap_serialize(soap);", ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (char*const*)(a->%s + i));", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (wchar_t*const*)(a->%s + i));", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); else if (!is_primitive((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, a->%s + i);", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); fprintf(fout, "\n\t\t}\n\t}"); } p = p->next; } else if (is_anytype(p)) { fprintf(fout, "\n\tsoap_markelement(soap, a->%s, a->%s);", ident(p->next->sym->name), ident(p->sym->name)); p = p->next; } else if (is_choice(p)) { fprintf(fout, "\n\tsoap_serialize_%s(soap, a->%s, &a->%s);", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_transient(p->info.typ)) { if (!is_pointer_to_derived(p)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); } else if (p->info.typ->type == Tarray) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\tsoap_serialize_%s(soap, a->%s);", c_ident(p->info.typ), ident(p->sym->name)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\ta->%s.soap_serialize(soap);", ident(p->sym->name)); } else if (!is_void(p->info.typ) && !is_XML(p->info.typ)) { if (!is_template(p->info.typ)) if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); if (is_string(p->info.typ)) fprintf(fout, "\n\tsoap_serialize_%s(soap, (char*const*)&a->%s);", c_ident(p->info.typ), ident(p->sym->name)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\tsoap_serialize_%s(soap, (wchar_t*const*)&a->%s);", c_ident(p->info.typ), ident(p->sym->name)); else if ((p->info.typ->type == Treference || p->info.typ->type == Trvalueref) && ((Tnode*)(p->info.typ->ref))->type == Tclass && !is_external(p->info.typ->ref) && !is_volatile(p->info.typ->ref)) fprintf(fout, "\n\ta->%s.soap_serialize(soap);", ident(p->sym->name)); else if ((p->info.typ->type == Treference || p->info.typ->type == Trvalueref) && !is_primitive(p->info.typ->ref)) fprintf(fout, "\n\tsoap_serialize_%s(soap, &a->%s);", c_ident(p->info.typ), ident(p->sym->name)); else if (!is_primitive(p->info.typ) && p->info.typ->type != Treference && p->info.typ->type != Trvalueref) fprintf(fout, "\n\tsoap_serialize_%s(soap, &a->%s);", c_ident(p->info.typ), ident(p->sym->name)); else if (!is_primitive(p->info.typ)) fprintf(fout, "\n\t/* %s skipped */", ident(p->sym->name)); } } } fprintf(fout, "\n#endif\n}"); break; case Tunion: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*")); if (!typ->ref) return; fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, int choice, const %s)\n{", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)soap; (void)choice; (void)a; /* appease -Wall -Werror */\n#ifndef WITH_NOIDREF"); fprintf(fout, "\n\tswitch (choice)\n\t{"); table = (Table*)typ->ref; for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) ; else if (is_anytype(p)) ; else if (is_transient(p->info.typ)) { if (!is_pointer_to_derived(p)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); } else if (p->info.typ->type == Tarray) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); if (has_ptr(p->info.typ)) fprintf(fout, "\n\t\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\t\tsoap_serialize_%s(soap, a->%s);", c_ident(p->info.typ), ident(p->sym->name)); fprintf(fout, "\n\t\tbreak;"); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); if (has_ptr(p->info.typ)) fprintf(fout, "\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\t\ta->%s.soap_serialize(soap);", ident(p->sym->name)); fprintf(fout, "\n\t\tbreak;"); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); if (has_ptr(p->info.typ)) fprintf(fout, "\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); if (!is_primitive(p->info.typ)) fprintf(fout, "\n\t\tsoap_serialize_%s(soap, &a->%s);", c_ident(p->info.typ), ident(p->sym->name)); fprintf(fout, "\n\t\tbreak;"); } } } fprintf(fout, "\n\tdefault:\n\t\tbreak;\n\t}\n#endif\n}"); break; case Tpointer: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, %s);", c_ident(typ), c_type_constptr_id(typ, "const*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, %s);", c_ident(typ), c_type_constptr_id(typ, "const*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, %s)\n{\n\t(void)soap; (void)a; /* appease -Wall -Werror */\n#ifndef WITH_NOIDREF", c_ident(typ), c_type_constptr_id(typ, "const*a")); temp = (Tnode*)typ->ref; if (!temp) return; if (is_string(typ) || is_wstring(typ)) fprintf(fout, "\n\t(void)soap_reference(soap, *a, %s);", soap_type(typ)); else if (is_primitive(temp)) fprintf(fout, "\n\t(void)soap_reference(soap, *a, %s);", soap_type(temp)); else { if (is_dynamic_array(temp)) fprintf(fout, "\n\tif (*a)"); else fprintf(fout, "\n\tif (!soap_reference(soap, *a, %s))", soap_type(temp)); if (temp->type == Tclass && !is_external(temp) && !is_volatile(temp) && !is_typedef(temp)) fprintf(fout, "\n\t\t(*a)->soap_serialize(soap);"); else fprintf(fout, "\n\t\tsoap_serialize_%s(soap, *a);", c_ident(temp)); } fprintf(fout, "\n#endif\n}"); break; case Tarray: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "const")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "const")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, %s)\n{", c_ident(typ), c_type_id(typ, "const a")); if (!is_primitive((Tnode*)typ->ref)) { fprintf(fout, "\n\tint i;"); fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */\n#ifndef WITH_NOIDREF"); fprintf(fout, "\n\tfor (i = 0; i < %d; i++)", get_dimension(typ)); (void)get_item_type(typ, &cardinality); fprintf(fout, "\n\t{"); if (has_ptr((Tnode*)typ->ref)) { fprintf(fout, "\tsoap_embedded(soap, a"); if (cardinality > 1) fprintf(fout, "[i]"); else fprintf(fout, "+i"); fprintf(fout, ", %s);", soap_type((Tnode*)typ->ref)); } if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { fprintf(fout, "\n\t\ta[i].soap_serialize(soap)"); } else if (!is_primitive((Tnode*)typ->ref)) { fprintf(fout, "\n\t\tsoap_serialize_%s(soap, a", c_ident((Tnode*)typ->ref)); if (cardinality > 1) { fprintf(fout, "[i])"); } else { fprintf(fout, "+i)"); } } fprintf(fout, ";\n\t}"); fprintf(fout, "\n#endif\n}"); } else fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */\n}"); break; case Ttemplate: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); temp = (Tnode*)typ->ref; if (!temp) return; fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, const %s)\n{\n\t(void)soap; (void)a;/* appease -Wall -Werror */\n#ifndef WITH_NOIDREF", c_ident(typ), c_type_id(typ, "*a")); if (!is_XML(temp) && temp->type != Tfun && !is_void(temp)) { if (is_smart(typ)) { if (is_primitive(temp)) fprintf(fout, "\n\t(void)soap_reference(soap, a->get(), %s);", soap_type(temp)); else { if (is_dynamic_array(temp)) fprintf(fout, "\n\tif (a->get())"); else fprintf(fout, "\n\tif (!soap_reference(soap, a->get(), %s))", soap_type(temp)); if (temp->type == Tclass && !is_external(temp) && !is_volatile(temp) && !is_typedef(temp)) fprintf(fout, "\n\t\t(*a)->soap_serialize(soap);"); else fprintf(fout, "\n\t\tsoap_serialize_%s(soap, a->get());", c_ident(temp)); } } else if (!is_primitive(temp)) { fprintf(fout, "\n\tfor (%s::const_iterator i = a->begin(); i != a->end(); ++i)", c_type(typ)); if (temp->type == Tclass && !is_external(temp) && !is_volatile(temp) && !is_typedef(temp)) fprintf(fout, "\n\t\t(*i).soap_serialize(soap);"); else fprintf(fout, "\n\t\tsoap_serialize_%s(soap, &(*i));", c_ident(temp)); } } fprintf(fout, "\n#endif\n}"); default: break; } } void soap_default(Tnode* typ) { int i, d; Table *table, *t; Entry *p; const char *s; int cardinality; if (is_XML(typ)) return; if (typ->type == Tpointer && !is_string(typ) && !is_wstring(typ)) return; if (is_typedef(typ) && (is_template(typ) || is_element(typ) || is_restriction(typ) || is_external(typ) || is_imported(typ)) && (!is_external(typ) || is_volatile(typ))) { if (typ->type == Tclass && !is_stdstring(typ) && !is_stdwstring(typ) && !is_volatile(typ)) fprintf(fhead, "\n\n#define soap_default_%s(soap, a) (a)->%s::soap_default(soap)\n", c_ident(typ), t_ident(typ)); else if (typ->type == Tclass && is_eq(typ->sym->name, "xsd__QName")) fprintf(fhead, "\n\n#define soap_default_%s soap_default_std__string\n", c_ident(typ)); else fprintf(fhead, "\n\n#define soap_default_%s soap_default_%s\n", c_ident(typ), t_ident(typ)); return; } p = is_dynamic_array(typ); if (p) { if (typ->type == Tclass && !is_typedef(typ) && !is_volatile(typ)) { if (is_external(typ)) return; fprintf(fout, "\n\nvoid %s::soap_default(struct soap *soap)\n{", c_ident(typ)); if ((s = has_soapref(typ))) fprintf(fout, "\n\tthis->%s = soap;", s); else fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); if (is_smart(p->info.typ)) fprintf(fout, "\n\tthis->%s.reset();", ident(p->sym->name)); else fprintf(fout, "\n\tthis->%s = NULL;", ident(p->sym->name)); d = get_Darraydims(typ); if (d) { for (i = 0; i < d; i++) { fprintf(fout, "\n\tthis->__size[%d] = 0;", i); if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0) fprintf(fout, "\n\tthis->__offset[%d] = 0;", i); } } else { fprintf(fout, "\n\tthis->__size = 0;"); if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0) fprintf(fout, "\n\tthis->__offset = 0;"); } if (is_attachment(typ)) fprintf(fout, "\n\tthis->id = NULL;\n\tthis->type = NULL;\n\tthis->options = NULL;"); fprintf(fout, "\n}"); } else { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{", c_ident(typ), c_type_id(typ, "*a")); if ((s = has_soapref(typ))) fprintf(fout, "\n\ta->%s = soap;", s); else fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); d = get_Darraydims(typ); if (d) { for (i = 0; i < d; i++) { fprintf(fout, "\n\ta->__size[%d] = 0;", i); if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0) fprintf(fout, "\n\ta->__offset[%d] = 0;", i); } } else { fprintf(fout, "\n\ta->__size = 0;"); if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0) fprintf(fout, "\n\ta->__offset = 0;"); } if (is_attachment(typ)) fprintf(fout, "\n\ta->id = NULL;\n\ta->type = NULL;\n\ta->options = NULL;"); fprintf(fout, "\n}"); } fflush(fout); return; } if (is_primitive(typ) || is_string(typ) || is_wstring(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); return; } if (is_imported(typ) && typ->type == Tint && !typ->sym) fprintf(fout, "\n\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap *soap, %s)\n{\n\t(void)soap; /* appease -Wall -Werror */\n#ifdef SOAP_DEFAULT_%s\n\t*a = SOAP_DEFAULT_%s;\n#else\n\t*a = (%s)0;\n#endif\n}", c_ident(typ), c_type_id(typ, "*a"), c_ident(typ), c_ident(typ), c_type(typ)); else if (cflag) { fprintf(fhead, "\n\n#ifdef SOAP_DEFAULT_%s\n#define soap_default_%s(soap, a) (*(a) = SOAP_DEFAULT_%s)\n#else\n#define soap_default_%s(soap, a) (*(a) = (%s)0)\n#endif", c_ident(typ), c_ident(typ), c_ident(typ), c_ident(typ), c_type(typ)); } else fprintf(fhead, "\n\ninline void soap_default_%s(struct soap *soap, %s)\n{\n\t(void)soap; /* appease -Wall -Werror */\n#ifdef SOAP_DEFAULT_%s\n\t*a = SOAP_DEFAULT_%s;\n#else\n\t*a = (%s)0;\n#endif\n}", c_ident(typ), c_type_id(typ, "*a"), c_ident(typ), c_ident(typ), c_type(typ)); return; } if (is_fixedstring(typ)) { fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, char[]);", c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, char a[])\n{\n\t(void)soap; /* appease -Wall -Werror */\n\ta[0] = '\\0';\n}", c_ident(typ)); return; } if (is_stdstring(typ) || is_stdwstring(typ)) { fprintf(fhead, "\n\ninline void soap_default_%s(struct soap *soap, %s)\n{\n\t(void)soap; /* appease -Wall -Werror */\n\tp->erase();\n}", c_ident(typ), c_type_id(typ, "*p")); return; } switch(typ->type) { case Tclass: if (!is_volatile(typ) && !is_typedef(typ) && typ->ref) /* fall through to switch case Tstruct */ { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); return; } table=(Table*)typ->ref; fprintf(fout, "\n\nvoid %s::soap_default(struct soap *soap)\n{", ident(typ->id->name)); if ((s = has_soapref(typ))) fprintf(fout, "\n\tthis->%s = soap;", s); else fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); fflush(fout); if (table) { if (table->prev) fprintf(fout, "\n\tthis->%s::soap_default(soap);", ident(table->prev->sym->name)); for (p = table->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) continue; if (p->info.sto & Sconst) fprintf(fout, "\n\t/* const %s skipped */", ident(p->sym->name)); else if (is_choice(p)) { fprintf(fout, "\n\tthis->%s::%s = %d;", ident(table->sym->name), ident(p->sym->name), required_choice(p->next->info.typ)); p = p->next; } else if (is_repetition(p) || is_anytype(p)) { fprintf(fout, "\n\tthis->%s::%s = 0;\n\tthis->%s::%s = NULL;", ident(table->sym->name), ident(p->sym->name), ident(table->sym->name), ident(p->next->sym->name)); p = p->next; } else { if (is_fixedstring(p->info.typ)) { if (p->info.hasval) fprintf(fout, "\n\tsoap_strcpy(this->%s::%s, %d, \"%s\");", ident(table->sym->name), ident(p->sym->name), get_dimension(p->info.typ), cstring(p->info.val.s, 0)); else fprintf(fout, "\n\tthis->%s::%s[0] = '\\0';", ident(table->sym->name), ident(p->sym->name)); } else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tsoap_default_%s(soap, this->%s::%s);", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ) && !is_transient(p->info.typ)) fprintf(fout, "\n\tthis->%s::%s.%s::soap_default(soap);", ident(table->sym->name), ident(p->sym->name), c_ident(p->info.typ)); else if (p->info.hasval) fprintf(fout, "\n\tthis->%s::%s%s;", ident(table->sym->name), ident(p->sym->name), c_init(p)); else if (p->info.typ->type == Tpointer && (!is_string(p->info.typ) || is_XML(p->info.typ) || (p->info.sto & Sconstptr))) fprintf(fout, "\n\tthis->%s::%s = NULL;", ident(table->sym->name), ident(p->sym->name)); else if (is_transient(p->info.typ) || is_void(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.typ->type != Treference && p->info.typ->type != Trvalueref) fprintf(fout, "\n\tsoap_default_%s(soap, &this->%s::%s);", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name)); else fprintf(fout, "\n\t/* %s skipped */", ident(p->sym->name)); } } } fprintf(fout, "\n}"); fflush(fout); break; } case Tstruct: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{", c_ident(typ), c_type_id(typ, "*a")); fflush(fout); if ((s = has_soapref(typ))) fprintf(fout, "\n\ta->%s = soap;", s); else fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); table = (Table*)typ->ref; for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) continue; if (p->info.sto & Sconst) fprintf(fout, "\n\t/* const %s skipped */", ident(p->sym->name)); else if (p->info.sto & (Sprivate | Sprotected)) fprintf(fout, "\n\t/* private/protected %s skipped */", ident(p->sym->name)); else if (is_choice(p)) { fprintf(fout, "\n\ta->%s = %d;", ident(p->sym->name), required_choice(p->next->info.typ)); p = p->next; } else if (is_repetition(p) || is_anytype(p)) { fprintf(fout, "\n\ta->%s = 0;\n\ta->%s = NULL;", ident(p->sym->name), ident(p->next->sym->name)); p = p->next; } else { if (is_fixedstring(p->info.typ)) { if (p->info.hasval) fprintf(fout, "\n\tsoap_strcpy(a->%s, %d, \"%s\");", ident(p->sym->name), get_dimension(p->info.typ), cstring(p->info.val.s, 0)); else fprintf(fout, "\n\ta->%s[0] = '\\0';", ident(p->sym->name)); } else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tsoap_default_%s(soap, a->%s);", c_ident(p->info.typ), ident(p->sym->name)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ) && !is_transient(p->info.typ)) fprintf(fout, "\n\ta->%s.%s::soap_default(soap);", ident(p->sym->name), c_ident(p->info.typ)); else if (p->info.hasval) fprintf(fout, "\n\ta->%s%s;", ident(p->sym->name), c_init(p)); else if (p->info.typ->type == Tpointer && (!is_string(p->info.typ) || is_XML(p->info.typ) || (p->info.sto & Sconstptr))) fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); else if (is_transient(p->info.typ) || is_void(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.typ->type != Treference && p->info.typ->type != Trvalueref) fprintf(fout, "\n\tsoap_default_%s(soap, &a->%s);", c_ident(p->info.typ), ident(p->sym->name)); else fprintf(fout, "\n\t/* %s skipped */", ident(p->sym->name)); } } } fprintf(fout, "\n}"); fflush(fout); break; case Tarray: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{", c_ident(typ), c_type_id(typ, "a")); fprintf(fout, "\n\tint i;"); fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); fprintf(fout, "\n\tfor (i = 0; i < %d; i++)", get_dimension(typ)); (void)get_item_type(typ, &cardinality); if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref)) { if (cardinality>1) fprintf(fout, "a[i].%s::soap_default(soap)", t_ident((Tnode*)typ->ref)); else fprintf(fout, "(a+i)->soap_default(soap)"); } else if (((Tnode*)typ->ref)->type == Tpointer) fprintf(fout, "\n\t\ta[i] = NULL"); else { fprintf(fout, "\n\t\tsoap_default_%s(soap, a", c_ident((Tnode*)typ->ref)); if (cardinality>1) fprintf(fout, "[i])"); else fprintf(fout, "+i)"); } fprintf(fout, ";\n}"); break; case Ttemplate: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{", c_ident(typ), c_type_id(typ, "*p")); fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); if (is_smart(typ)) fprintf(fout, "\n\tp->reset();"); else fprintf(fout, "\n\tp->clear();"); fprintf(fout, "\n}"); fflush(fout); break; default: break; } } void soap_traverse(Tnode* typ) { int d; Table *table, *t; Entry *p; Tnode* temp; int cardinality; if (is_primitive_or_string(typ) || is_fixedstring(typ)) { fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{\t(void)soap; (void)q; /* appease -Wall -Werror */", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");\n}", soap_type(typ), c_type(typ)); return; } if (typ->type != Tclass || !(typ->sym && (is_stdstring(typ) || is_stdwstring(typ)) && is_eq(typ->sym->name, "xsd__QName")) || is_external(typ) || is_imported(typ)) if (is_typedef(typ) && !is_external(typ)) { if (typ->type == Tclass && !is_stdstring(typ) && !is_stdwstring(typ) && !is_volatile(typ)) fprintf(fhead, "\n\n#define soap_traverse_%s(soap, a, s, p, q) (a)->soap_traverse(soap, s, p, q)\n", c_ident(typ)); else if (typ->type == Tclass && is_eq(typ->sym->name, "xsd__QName")) fprintf(fhead, "\n\n#define soap_traverse_%s(soap, a, s, p, q) soap_traverse_std__string(soap, a, s, p, q)\n", c_ident(typ)); else fprintf(fhead, "\n\n#define soap_traverse_%s(soap, a, s, p, q) soap_traverse_%s(soap, a, s, p, q)\n", c_ident(typ), t_ident(typ)); return; } if (is_XML(typ)) { fprintf(fhead, "\n\n#define soap_traverse_%s(soap, a, s, p, q) soap_traverse_%s(soap, a, s, p, q)\n", c_ident(typ), t_ident(typ)); return; } if ((p = is_dynamic_array(typ))) { if (typ->type == Tclass && !is_volatile(typ)) { if (is_external(typ)) return; fprintf(fout, "\n\nvoid %s::soap_traverse(struct soap *soap, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ)); if (is_binary(typ)) { if (is_attachment(typ)) fprintf(fout, "\n\tif (this->%s && soap_attachment_reference(soap, this, this->%s, this->__size, %s, this->id, this->type))\n\t{", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); else fprintf(fout, "\n\tif (this->%s && !soap_array_reference(soap, this, this->%s, this->__size, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)this->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name); if (is_attachment(typ)) { fprintf(fout, "\n\t\tif (p) p(soap, (void*)this->id, SOAP_TYPE_string, \"id\", NULL);"); fprintf(fout, "\n\t\tif (q) q(soap, (void*)this->id, SOAP_TYPE_string, \"id\", NULL);"); fprintf(fout, "\n\t\tif (p) p(soap, (void*)this->type, SOAP_TYPE_string, \"type\", NULL);"); fprintf(fout, "\n\t\tif (q) q(soap, (void*)this->type, SOAP_TYPE_string, \"type\", NULL);"); fprintf(fout, "\n\t\tif (p) p(soap, (void*)this->options, 0, \"options\", NULL);"); fprintf(fout, "\n\t\tif (q) q(soap, (void*)this->options, 0, \"options\", NULL);"); } fprintf(fout, "\n\t\tif (q) q(soap, (void*)this->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name); fprintf(fout, "\n\t\tif (q) q(soap, (void*)this, %s, s, \"%s\");\n\t}\n}", soap_type(typ), c_type(typ)); fflush(fout); return; } else { d = get_Darraydims(typ); if (d) { fprintf(fout, "\n\tif (this->%s && !soap_array_reference(soap, this, this->%s, %s, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), get_Darraysize("this", d), soap_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tfor (size_t i = 0; i < soap_size(this->__size, %d); i++)", d); } else { fprintf(fout, "\n\tif (this->%s && !soap_array_reference(soap, this, this->%s, this->__size, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tfor (size_t i = 0; i < (size_t)this->__size; i++)"); } fprintf(fout, "\n\t\t{"); if (has_ptr((Tnode*)p->info.typ->ref)) fprintf(fout, "\tsoap_embedded(soap, this->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tthis->%s[i].soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name); else fprintf(fout, "\n\t\t\tsoap_traverse_%s(soap, this->%s + i, \"%s\", p, q);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), ident(p->sym->name)); fprintf(fout, "\n\t\t}\n\t\tif (q) q(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t}\n}"); return; } } else { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ), c_type_id(typ, "*a")); if (is_binary(typ)) { if (is_attachment(typ)) fprintf(fout, "\n\tif (a->%s && soap_attachment_reference(soap, a, a->%s, a->__size, %s, a->id, a->type))\n\t{", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); else fprintf(fout, "\n\tif (a->%s && !soap_array_reference(soap, a, a->%s, a->__size, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)a->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name); if (is_attachment(typ)) { fprintf(fout, "\n\t\tif (p) p(soap, (void*)a->id, SOAP_TYPE_string, \"id\", NULL);"); fprintf(fout, "\n\t\tif (q) q(soap, (void*)a->id, SOAP_TYPE_string, \"id\", NULL);"); fprintf(fout, "\n\t\tif (p) p(soap, (void*)a->type, SOAP_TYPE_string, \"type\", NULL);"); fprintf(fout, "\n\t\tif (q) q(soap, (void*)a->type, SOAP_TYPE_string, \"type\", NULL);"); fprintf(fout, "\n\t\tif (p) p(soap, (void*)a->options, 0, \"options\", NULL);"); fprintf(fout, "\n\t\tif (q) q(soap, (void*)a->options, 0, \"options\", NULL);"); } fprintf(fout, "\n\t\tif (q) q(soap, (void*)a->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name); fprintf(fout, "\n\t\tif (q) q(soap, (void*)a, %s, s, \"%s\");\n\t}\n}", soap_type(typ), c_type(typ)); fflush(fout); return; } else { fprintf(fout, "\n\tsize_t i;"); d = get_Darraydims(typ); if (d) { fprintf(fout, "\n\tif (a->%s && !soap_array_reference(soap, a, a->%s, %s, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), get_Darraysize("a", d), soap_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tfor (i = 0; i < soap_size(a->__size, %d); i++)", d); } else { fprintf(fout, "\n\tif (a->%s && !soap_array_reference(soap, a, a->%s, a->__size, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tfor (i = 0; i < (size_t)a->__size; i++)"); } fprintf(fout, "\n\t\t{"); if (has_ptr((Tnode*)p->info.typ->ref)) fprintf(fout, "\tsoap_embedded(soap, a->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\ta->%s[i].soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name); else fprintf(fout, "\n\t\t\tsoap_traverse_%s(soap, a->%s + i, \"%s\", p, q);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), p->sym->name); fprintf(fout, "\n\t\t}\n\t\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t}\n}"); fflush(fout); return; } } } switch(typ->type) { case Tclass: if (!is_volatile(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } table=(Table*)typ->ref; fprintf(fout, "\n\nvoid %s::soap_traverse(struct soap *soap, const char *s, soap_walker p, soap_walker q)\n{", ident(typ->id->name)); fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); fprintf(fout, "\n\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { fprintf(fout, "\n\tif (this->%s::%s)", ident(t->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < (int)this->%s::%s; i++)\n\t\t{", ident(t->sym->name), ident(p->sym->name)); if (!is_invisible(p->next->sym->name)) if (has_ptr((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_embedded(soap, this->%s::%s + i, %s);", ident(t->sym->name), ident(p->next->sym->name), soap_type((Tnode*)p->next->info.typ->ref)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tthis->%s::%s[i].soap_traverse(soap, \"%s\", p, q);", ident(t->sym->name), ident(p->next->sym->name), p->next->sym->name); else fprintf(fout, "\n\t\t\tsoap_traverse_%s(soap, this->%s::%s + i, \"%s\", p, q);", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name), p->next->sym->name); fprintf(fout, "\n\t\t}\n\t}"); p = p->next; } else if (is_anytype(p)) { p = p->next; } else if (is_choice(p)) { fprintf(fout, "\n\tsoap_traverse_%s(soap, this->%s::%s, &this->%s::%s, \"%s\", p, q);", c_ident(p->next->info.typ), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name), p->next->sym->name); p = p->next; } else if (p->info.typ->type == Tarray) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, this->%s::%s, %s);", ident(t->sym->name), ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\tsoap_traverse_%s(soap, this->%s::%s, \"%s\", p, q);", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), p->sym->name); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &this->%s::%s, %s);", ident(t->sym->name), ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\tthis->%s::%s.soap_traverse(soap, \"%s\", p, q);", ident(t->sym->name), ident(p->sym->name), p->sym->name); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (!is_template(p->info.typ)) if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &this->%s::%s, %s);", ident(t->sym->name), ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\tsoap_traverse_%s(soap, &this->%s::%s, \"%s\", p, q);", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), p->sym->name); } } } fprintf(fout, "\n\tif (q) q(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n}"); break; } /* fall through to next case when class is volatile, since serializers cannot be member functions */ case Tstruct: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); if (!typ->ref) return; fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); table=(Table*)typ->ref; for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { fprintf(fout, "\n\tif (a->%s)", ident(p->next->sym->name)); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < (int)a->%s; i++)\n\t\t{", ident(p->sym->name)); if (!is_invisible(p->next->sym->name)) if (has_ptr((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_embedded(soap, a->%s + i, %s);", ident(p->next->sym->name), soap_type((Tnode*)p->next->info.typ->ref)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\ta->%s[i].soap_traverse(soap, \"%s\", p, q);", ident(p->next->sym->name), p->next->sym->name); else fprintf(fout, "\n\t\t\tsoap_traverse_%s(soap, a->%s + i, \"%s\", p, q);", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name), p->next->sym->name); fprintf(fout, "\n\t\t}\n\t}"); p = p->next; } else if (is_anytype(p)) { p = p->next; } else if (is_choice(p)) { fprintf(fout, "\n\tsoap_traverse_%s(soap, a->%s, &a->%s, \"%s\", p, q);", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name), p->next->sym->name); p = p->next; } else if (p->info.typ->type == Tarray) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\tsoap_traverse_%s(soap, a->%s, \"%s\", p, q);", c_ident(p->info.typ), ident(p->sym->name), p->sym->name); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\ta->%s.soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (!is_template(p->info.typ)) if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\tsoap_traverse_%s(soap, &a->%s, \"%s\", p, q);", c_ident(p->info.typ), ident(p->sym->name), p->sym->name); } } } fprintf(fout, "\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n}"); break; case Tunion: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, int, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } table = (Table*)typ->ref; fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, int, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, int choice, %s, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\tswitch (choice)\n\t{"); for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) ; else if (is_anytype(p)) ; else if (p->info.typ->type == Tarray) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); if (has_ptr(p->info.typ)) fprintf(fout, "\n\t\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\t\tsoap_traverse_%s(soap, a->%s, \"%s\", p, q);", c_ident(p->info.typ), ident(p->sym->name), p->sym->name); fprintf(fout, "\n\t\tbreak;"); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); if (has_ptr(p->info.typ)) fprintf(fout, "\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\t\ta->%s.soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name); fprintf(fout, "\n\t\tbreak;"); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); if (has_ptr(p->info.typ)) fprintf(fout, "\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\t\tsoap_traverse_%s(soap, &a->%s, \"%s\", p, q);", c_ident(p->info.typ), ident(p->sym->name), p->sym->name); fprintf(fout, "\n\t\tbreak;"); } } } fprintf(fout, "\n\tdefault:\n\t\tbreak;\n\t}"); fprintf(fout, "\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n}"); break; case Tpointer: if (((Tnode*)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ), c_type_id(typ, "*a")); p = is_dynamic_array((Tnode*)typ->ref); if (p) { d = get_Darraydims((Tnode*)typ->ref); if (d) fprintf(fout, "\n\tif (*a)"); else fprintf(fout, "\n\tif (*a)"); } else fprintf(fout, "\n\tif (!soap_reference(soap, *a, %s))", soap_type((Tnode*)typ->ref)); fprintf(fout, "\n\t\t(*a)->soap_traverse(soap, s, p, q);\n}"); } else { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ), c_type_id(typ, "*a")); if (is_primitive((Tnode*)typ->ref)) { fprintf(fout, "\n\tif (!soap_reference(soap, *a, %s))\n\t{", soap_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)*a, %s, s, \"%s\");", soap_type((Tnode*)typ->ref), c_type((Tnode*)typ->ref)); fprintf(fout, "\n\t\tif (q) q(soap, (void*)*a, %s, s, \"%s\");\n\t}\n}", soap_type((Tnode*)typ->ref), c_type((Tnode*)typ->ref)); } else if ((p = is_dynamic_array((Tnode*)typ->ref)) != NULL) { d = get_Darraydims((Tnode*)typ->ref); if (d) fprintf(fout, "\n\tif (*a)"); else fprintf(fout, "\n\tif (*a)"); fprintf(fout, "\n\t\tsoap_traverse_%s(soap, *a, s, p, q);\n}", c_ident((Tnode*)typ->ref)); } else { fprintf(fout, "\n\tif (!soap_reference(soap, *a, %s))", soap_type((Tnode*)typ->ref)); fprintf(fout, "\n\t\tsoap_traverse_%s(soap, *a, s, p, q);\n}", c_ident((Tnode*)typ->ref)); } } break; case Tarray: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type(typ)); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)", c_ident(typ), c_type_id(typ, "a")); if (is_primitive((Tnode*)typ->ref)) { fprintf(fout, "\n{"); fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); } else { fprintf(fout, "\n{\n\tsize_t i;"); fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\tfor (i = 0; i < %d; i++)", get_dimension(typ)); (void)get_item_type(typ, &cardinality); fprintf(fout, "\n\t{"); if (has_ptr((Tnode*)typ->ref)) { fprintf(fout, "\tsoap_embedded(soap, a"); if (cardinality > 1) fprintf(fout, "[i]"); else fprintf(fout, "+i"); fprintf(fout, ", %s);", soap_type((Tnode*)typ->ref)); } if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { fprintf(fout, "\n\ta[i].soap_traverse(soap, s, p, q)"); } else if (!is_primitive((Tnode*)typ->ref)) { fprintf(fout, "\n\tsoap_traverse_%s(soap, a", c_ident((Tnode*)typ->ref)); if (cardinality > 1) fprintf(fout, "[i], s, p, q)"); else fprintf(fout, "+i, s, p, q)"); } fprintf(fout, ";\n\t}"); } fprintf(fout, "\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n}"); break; case Ttemplate: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); temp = (Tnode*)typ->ref; if (!temp) return; fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{\n\t(void)soap; (void)a; (void)s; (void)p; (void)q; /* appease -Wall -Werror */", c_ident(typ), c_type_id(typ, "*a")); if (!is_primitive(temp) && temp->type != Tfun && !is_void(temp)) { fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\tfor (%s::iterator i = a->begin(); i != a->end(); ++i)", c_type(typ)); if (temp->type == Tclass && !is_external(temp) && !is_volatile(temp) && !is_typedef(temp)) fprintf(fout, "\n\t\t(*i).soap_traverse(soap, s, p, q);"); else fprintf(fout, "\n\t\tsoap_traverse_%s(soap, &(*i), s, p, q);", c_ident(temp)); fprintf(fout, "\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); } fprintf(fout, "\n}"); default: break; } } void soap_put(Tnode *typ) { const char *ci = c_ident(typ); const char *ct = c_type(typ); if (is_XML(typ)) return; if (typ->type == Ttemplate || typ->type == Tunion) return; if (is_typedef(typ) && (is_template(typ) /*|| is_element(typ) don't permit for typedef'd elements */ || is_synonym(typ) || is_external(typ) || is_imported(typ)) && (!is_external(typ) || is_volatile(typ))) { fprintf(fhead, "\n\n#define soap_put_%s soap_put_%s\n", c_ident(typ), t_ident(typ)); fprintf(fhead, "\n\n#define soap_write_%s soap_write_%s\n", c_ident(typ), t_ident(typ)); fprintf(fhead, "\n\n#define soap_PUT_%s soap_PUT_%s\n", c_ident(typ), t_ident(typ)); fprintf(fhead, "\n\n#define soap_PATCH_%s soap_PATCH_%s\n", c_ident(typ), t_ident(typ)); fprintf(fhead, "\n\n#define soap_POST_send_%s soap_POST_send_%s\n", c_ident(typ), t_ident(typ)); return; } if (typ->type == Tarray) { fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap*, %s, const char*, const char*);", ci, c_type_id(typ, "const")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap *soap, %s, const char *tag, const char *type)\n{", ci, c_type_id(typ, "const a")); } else if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) fprintf(fout, "\n\nint %s::soap_put(struct soap *soap, const char *tag, const char *type) const\n{", ct); else if (typ->type == Tpointer) { fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap*, %s, const char*, const char*);", ci, c_type_constptr_id(typ, "const*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap *soap, %s, const char *tag, const char *type)\n{", ci, c_type_constptr_id(typ, "const*a")); } else { fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap*, const %s, const char*, const char*);", ci, c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap *soap, const %s, const char *tag, const char *type)\n{", ci, c_type_id(typ, "*a")); } fflush(fout); if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, tag ? tag : \"%s\", -2, this, type))\n\t\treturn soap->error;", ci, xml_tag(typ)); else fprintf(fout, "\n\tif (soap_out_%s(soap, tag ? tag : \"%s\", -2, a, type))\n\t\treturn soap->error;", ci, xml_tag(typ)); if (!is_invisible(typ->id->name)) fprintf(fout, "\n\treturn soap_putindependent(soap);\n}"); else fprintf(fout, "\n\treturn SOAP_OK;\n}"); if ((typ->type != Tpointer || is_string(typ) || is_wstring(typ)) && typ->type != Tarray && typ->type != Treference && typ->type != Trvalueref && !is_template(typ) && !is_anyAttribute(typ)) { const char *x = xsi_type_u(typ); if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && (!is_typedef(typ) || is_element(typ) /* don't permit for typedef'd elements, see above */)) { fprintf(fhead, "\n\ninline int soap_write_%s(struct soap *soap, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_begin_send(soap) || (p->soap_serialize(soap), 0) || p->soap_put(soap, \"%s\", p->soap_type() == %s ? \"%s\" : NULL) || soap_end_send(soap))\n\t\treturn soap->error;\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), xml_tag(typ), soap_type(typ), x); fprintf(fhead, "\n\ninline int soap_PUT_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_PUT(soap, URL, NULL, \"text/xml; charset=utf-8\") || (p->soap_serialize(soap), 0) || p->soap_put(soap, \"%s\", p->soap_type() == %s ? \"%s\" : NULL) || soap_end_send(soap) || soap_recv_empty_response(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), xml_tag(typ), soap_type(typ), x); fprintf(fhead, "\n\ninline int soap_PATCH_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_PATCH(soap, URL, NULL, \"text/xml; charset=utf-8\") || (p->soap_serialize(soap), 0) || p->soap_put(soap, \"%s\", p->soap_type() == %s ? \"%s\" : NULL) || soap_end_send(soap) || soap_recv_empty_response(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), xml_tag(typ), soap_type(typ), x); fprintf(fhead, "\n\ninline int soap_POST_send_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_POST(soap, URL, NULL, \"text/xml; charset=utf-8\") || (p->soap_serialize(soap), 0) || p->soap_put(soap, \"%s\", p->soap_type() == %s ? \"%s\" : NULL) || soap_end_send(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), xml_tag(typ), soap_type(typ), x); } else if (is_primitive_or_string(typ)) { if (cflag) fprintf(fhead, "\n\n#ifndef soap_write_%s\n#define soap_write_%s(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || soap_put_%s(soap, data, \"%s\", \"%s\") || soap_end_send(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), xml_tag(typ), x); else if (namespaceid && !is_external(typ)) fprintf(fhead, "\n\ninline int soap_write_%s(struct soap *soap, %s)\n{\n\tsoap_free_temp(soap);\n\tif (p)\n\t{\tif (soap_begin_send(soap) || %s::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap))\n\t\t\treturn soap->error;\n\t}\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), namespaceid, c_ident(typ), xml_tag(typ), x); else if (!is_external(typ)) fprintf(fhead, "\n\ninline int soap_write_%s(struct soap *soap, %s)\n{\n\tsoap_free_temp(soap);\n\tif (p)\n\t{\tif (soap_begin_send(soap) || ::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap))\n\t\t\treturn soap->error;\n\t}\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), xml_tag(typ), x); else fprintf(fhead, "\n\ninline int soap_write_%s(struct soap *soap, %s)\n{\n\tsoap_free_temp(soap);\n\tif (p)\n\t{\tif (soap_begin_send(soap) || soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap))\n\t\t\treturn soap->error;\n\t}\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), xml_tag(typ), x); if (cflag) fprintf(fhead, "\n\n#ifndef soap_PUT_%s\n#define soap_PUT_%s(soap, URL, data) ( soap_free_temp(soap), soap_PUT(soap, URL, NULL, \"text/xml; charset=utf-8\") || soap_put_%s(soap, data, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap), soap_closesock(soap) )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), xml_tag(typ), x); else if (namespaceid && !is_external(typ)) fprintf(fhead, "\n\ninline int soap_PUT_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_PUT(soap, URL, NULL, \"text/xml; charset=utf-8\") || %s::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), namespaceid, c_ident(typ), xml_tag(typ), x); else if (!is_external(typ)) fprintf(fhead, "\n\ninline int soap_PUT_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_PUT(soap, URL, NULL, \"text/xml; charset=utf-8\") || ::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), xml_tag(typ), x); else fprintf(fhead, "\n\ninline int soap_PUT_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_PUT(soap, URL, NULL, \"text/xml; charset=utf-8\") || soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), xml_tag(typ), x); if (cflag) fprintf(fhead, "\n\n#ifndef soap_PATCH_%s\n#define soap_PATCH_%s(soap, URL, data) ( soap_free_temp(soap), soap_PATCH(soap, URL, NULL, \"text/xml; charset=utf-8\") || soap_put_%s(soap, data, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap), soap_closesock(soap) )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), xml_tag(typ), x); else if (namespaceid && !is_external(typ)) fprintf(fhead, "\n\ninline int soap_PATCH_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_PATCH(soap, URL, NULL, \"text/xml; charset=utf-8\") || %s::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), namespaceid, c_ident(typ), xml_tag(typ), x); else if (!is_external(typ)) fprintf(fhead, "\n\ninline int soap_PATCH_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_PATCH(soap, URL, NULL, \"text/xml; charset=utf-8\") || ::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), xml_tag(typ), x); else fprintf(fhead, "\n\ninline int soap_PATCH_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_PATCH(soap, URL, NULL, \"text/xml; charset=utf-8\") || soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), xml_tag(typ), x); if (cflag) fprintf(fhead, "\n\n#ifndef soap_POST_send_%s\n#define soap_POST_send_%s(soap, URL, data) ( soap_free_temp(soap), ( soap_POST(soap, URL, NULL, \"text/xml; charset=utf-8\") || soap_put_%s(soap, data, \"%s\", \"%s\") || soap_end_send(soap) ) && soap_closesock(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), xml_tag(typ), x); else if (namespaceid && !is_external(typ)) fprintf(fhead, "\n\ninline int soap_POST_send_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_POST(soap, URL, NULL, \"text/xml; charset=utf-8\") || %s::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), namespaceid, c_ident(typ), xml_tag(typ), x); else if (!is_external(typ)) fprintf(fhead, "\n\ninline int soap_POST_send_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_POST(soap, URL, NULL, \"text/xml; charset=utf-8\") || ::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), xml_tag(typ), x); else fprintf(fhead, "\n\ninline int soap_POST_send_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_POST(soap, URL, NULL, \"text/xml; charset=utf-8\") || soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), xml_tag(typ), x); } else { if (cflag) fprintf(fhead, "\n\n#ifndef soap_write_%s\n#define soap_write_%s(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_%s(soap, data), 0) || soap_put_%s(soap, data, \"%s\", \"%s\") || soap_end_send(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), c_ident(typ), xml_tag(typ), x); else if (namespaceid && !is_external(typ)) fprintf(fhead, "\n\ninline int soap_write_%s(struct soap *soap, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_begin_send(soap) || (%s::soap_serialize_%s(soap, p), 0) || %s::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap))\n\t\t\treturn soap->error;\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), namespaceid, c_ident(typ), namespaceid, c_ident(typ), xml_tag(typ), x); else if (!is_external(typ)) fprintf(fhead, "\n\ninline int soap_write_%s(struct soap *soap, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_begin_send(soap) || (::soap_serialize_%s(soap, p), 0) || ::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap))\n\t\t\treturn soap->error;\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), c_ident(typ), xml_tag(typ), x); else fprintf(fhead, "\n\ninline int soap_write_%s(struct soap *soap, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_begin_send(soap) || (soap_serialize_%s(soap, p), 0) || soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap))\n\t\t\treturn soap->error;\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), c_ident(typ), xml_tag(typ), x); if (cflag) fprintf(fhead, "\n\n#ifndef soap_PUT_%s\n#define soap_PUT_%s(soap, URL, data) ( soap_free_temp(soap), soap_PUT(soap, URL, NULL, \"text/xml; charset=utf-8\") || (soap_serialize_%s(soap, data), 0) || soap_put_%s(soap, data, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap), soap_closesock(soap) )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), c_ident(typ), xml_tag(typ), x); else if (namespaceid && !is_external(typ)) fprintf(fhead, "\n\ninline int soap_PUT_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_PUT(soap, URL, NULL, \"text/xml; charset=utf-8\") || (%s::soap_serialize_%s(soap, p), 0) || %s::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), namespaceid, c_ident(typ), namespaceid, c_ident(typ), xml_tag(typ), x); else if (!is_external(typ)) fprintf(fhead, "\n\ninline int soap_PUT_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_PUT(soap, URL, NULL, \"text/xml; charset=utf-8\") || (::soap_serialize_%s(soap, p), 0) || ::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), c_ident(typ), xml_tag(typ), x); else fprintf(fhead, "\n\ninline int soap_PUT_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_PUT(soap, URL, NULL, \"text/xml; charset=utf-8\") || (soap_serialize_%s(soap, p), 0) || soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), c_ident(typ), xml_tag(typ), x); if (cflag) fprintf(fhead, "\n\n#ifndef soap_PATCH_%s\n#define soap_PATCH_%s(soap, URL, data) ( soap_free_temp(soap), soap_PATCH(soap, URL, NULL, \"text/xml; charset=utf-8\") || (soap_serialize_%s(soap, data), 0) || soap_put_%s(soap, data, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap), soap_closesock(soap) )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), c_ident(typ), xml_tag(typ), x); else if (namespaceid && !is_external(typ)) fprintf(fhead, "\n\ninline int soap_PATCH_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_PATCH(soap, URL, NULL, \"text/xml; charset=utf-8\") || (%s::soap_serialize_%s(soap, p), 0) || %s::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), namespaceid, c_ident(typ), namespaceid, c_ident(typ), xml_tag(typ), x); else if (!is_external(typ)) fprintf(fhead, "\n\ninline int soap_PATCH_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_PATCH(soap, URL, NULL, \"text/xml; charset=utf-8\") || (::soap_serialize_%s(soap, p), 0) || ::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), c_ident(typ), xml_tag(typ), x); else fprintf(fhead, "\n\ninline int soap_PATCH_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_PATCH(soap, URL, NULL, \"text/xml; charset=utf-8\") || (soap_serialize_%s(soap, p), 0) || soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), c_ident(typ), xml_tag(typ), x); if (cflag) fprintf(fhead, "\n\n#ifndef soap_POST_send_%s\n#define soap_POST_send_%s(soap, URL, data) ( soap_free_temp(soap), ( soap_POST(soap, URL, NULL, \"text/xml; charset=utf-8\") || (soap_serialize_%s(soap, data), 0) || soap_put_%s(soap, data, \"%s\", \"%s\") || soap_end_send(soap) ) && soap_closesock(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), c_ident(typ), xml_tag(typ), x); else if (namespaceid && !is_external(typ)) fprintf(fhead, "\n\ninline int soap_POST_send_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_POST(soap, URL, NULL, \"text/xml; charset=utf-8\") || (%s::soap_serialize_%s(soap, p), 0) || %s::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), namespaceid, c_ident(typ), namespaceid, c_ident(typ), xml_tag(typ), x); else if (!is_external(typ)) fprintf(fhead, "\n\ninline int soap_POST_send_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_POST(soap, URL, NULL, \"text/xml; charset=utf-8\") || (::soap_serialize_%s(soap, p), 0) || ::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), c_ident(typ), xml_tag(typ), x); else fprintf(fhead, "\n\ninline int soap_POST_send_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_POST(soap, URL, NULL, \"text/xml; charset=utf-8\") || (soap_serialize_%s(soap, p), 0) || soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), c_ident(typ), xml_tag(typ), x); } } fflush(fout); } Entry * is_dynamic_array(Tnode *typ) { Entry *p; Table *t; if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) { for (t = (Table*)typ->ref; t; t = t->prev) { p = t->list; while (p && p->info.typ->type == Tfun) p = p->next; if (p && (p->info.typ->type == Tpointer || is_smart(p->info.typ)) && !strncmp(ident(p->sym->name), "__ptr", 5)) if (p->next && (p->next->info.typ->type == Tint || (p->next->info.typ->type == Tarray && (((Tnode*)p->next->info.typ->ref)->type == Tint))) && !strncmp(ident(p->next->sym->name), "__size", 6)) return p; } } return NULL; } Entry * is_discriminant(Tnode *typ) { Entry *p; Table *t; if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) { t = (Table*)typ->ref; /* only if this struct/class has a union and is not derived */ if (t && !t->prev) { p = t->list; if (p && p->info.typ->type == Tint && ((p->info.sto & Sspecial) || !strncmp(ident(p->sym->name), "__union", 7))) if (p->next && p->next->info.typ->type == Tunion) { Entry *q; for (q = p->next->next; q; q = q->next) { if (q->info.typ->type != Tfun && !is_void(q->info.typ) && !is_transient(q->info.typ)) return NULL; } return p; } } } return NULL; } int get_Darraydims(Tnode *typ) { Entry *p; Table *t; if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) { for (t = (Table*)typ->ref; t; t = t->prev) { p = t->list; while (p && p->info.typ->type == Tfun) p = p->next; if (p && (p->info.typ->type == Tpointer || is_smart(p->info.typ)) && !strncmp(ident(p->sym->name), "__ptr", 5)) if (p->next && p->next->info.typ->type == Tarray && ((Tnode*)p->next->info.typ->ref)->type == Tint && !strncmp(ident(p->next->sym->name), "__size", 6)) return get_dimension(p->next->info.typ); } } return 0; } const char* get_Darraysize(const char *a, int d) { int i; char *s = (char*)emalloc(d * (strlen(a) + 16) + 1); *s = '\0'; for (i = 0; i < d; i++) { size_t l = strlen(s); sprintf(s + l, "%s%s->__size[%d]", i ? " * " : "", a, i); } return s; } int has_offset(Tnode *typ) { Entry *p; Table *t; if (typ->type == Tstruct || typ->type == Tclass) { for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if ((p->info.typ->type == Tint || (p->info.typ->type == Tarray && ((Tnode*)p->info.typ->ref)->type == Tint)) && !strcmp(ident(p->sym->name), "__offset")) return 1; } } } return 0; } int is_bool(Tnode *typ) { return (typ->type == Tenum && (Table*)typ->ref == booltable); } int is_boolean(Tnode *typ) { if (typ->type == Tenum) { if ((Table*)typ->ref == booltable) return 1; else { size_t n = strlen(ident(typ->id->name)); return n >= 7 && is_eq(ident(typ->id->name) + n - 7, "boolean"); } } return 0; } int is_hexBinary(Tnode *typ) { Table *t; if (!is_binary(typ)) return 0; if ((typ->synonym && typ->synonym->name && strstr(typ->synonym->name, "hex")) || (typ->sym && typ->sym->name && strstr(typ->sym->name, "hex")) || (typ->id && typ->id->name && strstr(typ->id->name, "hex"))) return 1; for (t = (Table*)typ->ref; t; t = t->prev) if (t->sym && t->sym->name && strstr(t->sym->name, "hex")) return 1; return 0; } int is_binary(Tnode *typ) { if (!has_ns(typ) && !is_element(typ)) return 0; if (typ->type == Tstruct || typ->type == Tclass) { Table *t; for (t = (Table*)typ->ref; t; t = t->prev) { Entry *p; p = t->list; while (p && p->info.typ->type == Tfun) p = p->next; if (p && (p->info.typ->type == Tpointer || is_smart(p->info.typ)) && ((Tnode*)p->info.typ->ref)->type == Tuchar && !strcmp(ident(p->sym->name), "__ptr")) { p = p->next; return p && p->info.typ->type == Tint && !strncmp(ident(p->sym->name), "__size", 6); } } } return 0; } int is_attachment(Tnode *typ) { Entry *p; Table *t; if (!is_binary(typ) || is_transient(typ)) return 0; for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (is_string(p->info.typ) && !strcmp(p->sym->name, "id")) { p = p->next; if (!p || !is_string(p->info.typ) || strcmp(p->sym->name, "type")) break; p = p->next; if (!p || !is_string(p->info.typ) || strcmp(p->sym->name, "options")) break; return 1; } } } return 0; } int is_mutable(Entry *e) { return e->info.typ->transient == -4 || is_header_or_fault(e->info.typ); } int is_header_or_fault(Tnode *typ) { if (typ->type == Tpointer || typ->type == Treference) return is_header_or_fault((Tnode*)typ->ref); return (typ->type == Tstruct || typ->type == Tclass) && (!strcmp(ident(typ->id->name), "SOAP_ENV__Header") || !strcmp(ident(typ->id->name), "SOAP_ENV__Fault") || !strcmp(ident(typ->id->name), "SOAP_ENV__Text") || !strcmp(ident(typ->id->name), "SOAP_ENV__Code") || !strcmp(ident(typ->id->name), "SOAP_ENV__Detail") || !strcmp(ident(typ->id->name), "SOAP_ENV__Reason")); } int is_body(Tnode *typ) { if (typ->type == Tpointer || typ->type == Treference) return is_body((Tnode*)typ->ref); return (typ->type == Tstruct || typ->type == Tclass) && !strcmp(ident(typ->id->name), "SOAP_ENV__Body"); } long minlen(Tnode *typ) { if (!typ->hasmin || typ->imin < 0) return 0; if (typ->imin > 2147483647) return 2147483647; if (typ->incmin) return (long)typ->imin; return (long)typ->imin + 1; } long maxlen(Tnode *typ) { if (!typ->hasmax || typ->imax < 0) return -1; if (typ->imax > 2147483647) return 2147483647; if (typ->incmax) return (long)typ->imax; return (long)typ->imax - 1; } const char* pattern(Tnode *typ) { if (!typ->pattern || (typ->pattern[0] == '%' && typ->pattern[1])) return "NULL"; return cstring(typ->pattern, 1); } int is_soap12(const char *enc) { return !strcmp(envURI, "http://www.w3.org/2003/05/soap-envelope") || (enc && !strcmp(enc, "http://www.w3.org/2003/05/soap-encoding")); } int is_document(const char *style) { return soap_version < 0 || (!eflag && !style) || (style && !strcmp(style, "document")); } int is_literal(const char *encoding) { return soap_version < 0 || (!eflag && !encoding) || (encoding && !strcmp(encoding, "literal")); } const char * has_soapref(Tnode *typ) { Entry *p; Table *t; if (typ->type == Tstruct || typ->type == Tclass) for (t = (Table*)typ->ref; t; t = t->prev) for (p = t->list; p; p = p->next) if (is_soapref(p->info.typ) && (t == (Table*)typ->ref || !(p->info.sto & Sprivate))) return ident(p->sym->name); return NULL; } int is_soapref(Tnode *typ) { return typ->type == Tpointer && ((Tnode*)typ->ref)->type == Tstruct && ((Tnode*)typ->ref)->id == lookup("soap"); } const char * union_member(Tnode *typ) { Table *t; Entry *p, *q; for (p = classtable->list; p; p = p->next) { if (p->info.typ->type == Tunion) { for (t = (Table*)p->info.typ->ref; t; t = t->prev) for (q = t->list; q; q = q->next) if (typ == q->info.typ) return p->info.typ->id->name; } else { for (t = (Table*)p->info.typ->ref; t; t = t->prev) { for (q = t->list; q; q = q->next) { if (typ == q->info.typ) { const char *s = union_member(p->info.typ); if (s) return s; } } } } } return NULL; } int has_union(Tnode *typ) { Table *t; Entry *p; if (typ->type == Tclass || typ->type == Tstruct) { for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tunion) return 1; else if ((p->info.typ->type == Tstruct || p->info.typ->type == Tclass) && has_union(p->info.typ)) return 1; } } } return 0; } int has_constructor(Tnode *typ) { Table *t; Entry *p; if (typ->type == Tclass || typ->type == Tstruct) for (t = (Table*)typ->ref; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->info.typ->type == Tfun && !strcmp(p->sym->name, typ->id->name) && ((FNinfo *)p->info.typ->ref)->ret->type == Tnone) if (!((FNinfo*)p->info.typ->ref)->args->list) return 1; return 0; } int has_destructor(Tnode *typ) { Entry *p; Table *t; if (typ->type == Tclass || typ->type == Tstruct) for (t = (Table*)typ->ref; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->info.typ->type == Tfun && strchr(p->sym->name, '~')) return 1; return 0; } int has_getter(Tnode *typ) { Entry *p, *q; Table *t; if (typ->type == Tclass || (!cflag && typ->type == Tstruct)) { for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !strcmp(p->sym->name, "get") && ((FNinfo *)p->info.typ->ref)->ret->type == Tint) { q = ((FNinfo*)p->info.typ->ref)->args->list; if (q && q->info.typ->type == Tpointer && ((Tnode*)q->info.typ->ref)->type == Tstruct && ((Tnode*)q->info.typ->ref)->id == lookup("soap")) return 1; } } } } return 0; } int has_setter(Tnode *typ) { Entry *p, *q; Table *t; if (typ->type == Tclass || (!cflag && typ->type == Tstruct)) { for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !strcmp(p->sym->name, "set") && ((FNinfo *)p->info.typ->ref)->ret->type == Tint) { q = ((FNinfo*)p->info.typ->ref)->args->list; if (q && q->info.typ->type == Tpointer && ((Tnode*)q->info.typ->ref)->type == Tstruct && ((Tnode*)q->info.typ->ref)->id == lookup("soap")) return 1; } } } } return 0; } const char* kind_of(Tnode *typ) { if (is_bool(typ)) return "bool"; if (is_attachment(typ)) return "base64 binary or attachment"; if (is_hexBinary(typ)) return "hex binary"; if (is_binary(typ)) return "base64 binary"; if (is_stdstring(typ)) return "std::string"; if (is_stdwstring(typ)) return "std::wstring"; if (is_external(typ)) return "custom"; if (is_string(typ)) return "string"; if (is_wstring(typ)) return "wide string"; if (typ->type == Tenum || typ->type == Tenumsc) return "enum"; if (is_primitive(typ)) return c_type(typ); if (typ->type == Tclass) return "class"; if (typ->type == Tstruct) return "struct"; if (is_smart(typ)) return "smart pointer"; if (is_template(typ)) return "container"; return ""; } int is_primitive_or_string(Tnode *typ) { return is_primitive(typ) || is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ) || is_qname(typ) || is_stdqname(typ); } int is_primitive(Tnode *typ) { return typ->type >= Tchar && typ->type <= Tenumsc; } int is_string(Tnode *typ) { return typ->type == Tpointer && ((Tnode*)typ->ref)->type == Tchar && !((Tnode*)typ->ref)->sym; } int is_fixedstring(Tnode *typ) { return bflag && typ->type == Tarray && ((Tnode*)typ->ref)->type == Tchar; } int is_wstring(Tnode *typ) { return typ->type == Tpointer && ((Tnode*)typ->ref)->type == Twchar; } int is_stdstring(Tnode *typ) { return typ->type == Tclass && typ->id == lookup("std::string"); } int is_stdwstring(Tnode *typ) { return typ->type == Tclass && typ->id == lookup("std::wstring"); } int is_stdstr(Tnode *typ) { if (typ->type == Tpointer) return is_stdstring((Tnode*)typ->ref) || is_stdwstring((Tnode*)typ->ref); return is_stdstring(typ) || is_stdwstring(typ); } int is_typedef(Tnode *typ) { return typ->sym && !is_transient(typ); } int is_restriction(Tnode *typ) { return is_typedef(typ) && typ->restriction; } int has_restriction_base(Tnode *typ, const char *base) { while (typ) { Entry *p; if (typ->sym && is_eq(typ->sym->name, base)) return 1; if (!typ->restriction) break; if (is_eq(typ->restriction->name, base)) return 1; p = entry(typetable, typ->restriction); if (!p) break; typ = p->info.typ; } return 0; } int is_synonym(Tnode *typ) { return is_typedef(typ) && typ->synonym; } int reflevel(Tnode *typ) { int level; for (level = 0; typ->type == Tpointer || is_smart(typ); level++) typ = (Tnode*)typ->ref; return level; } Tnode * reftype(Tnode *typ) { while ((typ->type == Tpointer && !is_string(typ) && !is_wstring(typ)) || typ->type == Treference || typ->type == Trvalueref || is_smart(typ)) typ = (Tnode*)typ->ref; return typ; } void soap_set_attr(Entry *p, const char *obj, const char *name, const char *tag) { Tnode *typ = p->info.typ; if (p->info.sto & (Sconst | Sprivate | Sprotected)) return; if (typ->type == Treference || typ->type == Trvalueref) typ = typ->ref; if (p->info.minOccurs == 0 && (typ->type != Tpointer || is_string(typ) || is_wstring(typ)) && p->info.hasval && !p->info.ptrval && !p->info.fixed) { if (is_string(typ)) fprintf(fout, "\n\tif (!%s->%s || strcmp(%s->%s, %s))\n\t{\t", obj, name, obj, name, c_init_a(p, "")); else if (is_wstring(typ)) fprintf(fout, "\n\tif (!%s->%s || wcscmp(%s->%s, %s))\n\t{\t", obj, name, obj, name, c_init_a(p, "")); else fprintf(fout, "\n\tif (%s->%s != %s)\n\t{\t", obj, name, c_init_a(p, "")); } else fprintf(fout, "\n\t"); if ((is_external(typ) || is_typedef(typ)) && !is_anyAttribute(typ) && !is_anyType(typ) && !is_smart(typ) && typ->type != Tpointer && !is_stdstr(typ) && !is_string(typ) && !is_wstring(typ) && !is_binary(typ)) fprintf(fout, "soap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, c_ident(typ), obj, name); else if (is_XML(typ)) { if (p->info.minOccurs > 0) fprintf(fout, "soap_set_attr(soap, \"%s\", %s->%s ? %s->%s : \"%s\", 1);", tag, obj, name, obj, name, default_value(p)); else fprintf(fout, "if (%s->%s)\n\t\tsoap_set_attr(soap, \"%s\", %s->%s, 1);", obj, name, tag, obj, name); } else if (is_string(typ)) { if (p->info.minOccurs > 0) fprintf(fout, "soap_set_attr(soap, \"%s\", %s->%s ? soap_%s2s(soap, %s->%s) : \"%s\", 1);", tag, obj, name, c_ident(typ), obj, name, default_value(p)); else fprintf(fout, "if (%s->%s)\n\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", obj, name, tag, c_ident(typ), obj, name); } else if (is_wstring(typ)) { if (p->info.minOccurs > 0) fprintf(fout, "soap_set_attr(soap, \"%s\", %s->%s ? soap_%s2s(soap, %s->%s) : \"%s\", 2);", tag, obj, name, c_ident(typ), obj, name, default_value(p)); else fprintf(fout, "if (%s->%s)\n\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 2);", obj, name, tag, c_ident(typ), obj, name); } else if (is_stdstring(typ)) { fprintf(fout, "soap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, c_ident(typ), obj, name); } else if (is_stdwstring(typ)) { fprintf(fout, "soap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 2);", tag, c_ident(typ), obj, name); } else if (is_smart(typ) || (typ->type == Tpointer && !is_string(typ) && !is_wstring(typ))) { Tnode *ptr = (Tnode*)typ->ref; if (is_smart(typ)) fprintf(fout, "if (%s->%s.get())\n\t{\t", obj, name); else fprintf(fout, "if (%s->%s)\n\t{\t", obj, name); if ((is_external(ptr) || is_typedef(ptr)) && !is_anyAttribute(ptr) && !is_anyType(ptr) && !is_stdstr(ptr) && !is_string(ptr) && !is_wstring(ptr) && !is_binary(ptr)) fprintf(fout, "soap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", tag, c_ident(ptr), obj, name); else if (is_XML(ptr)) fprintf(fout, "if (*%s->%s)\n\t\tsoap_set_attr(soap, \"%s\", *%s->%s, 1);", obj, name, tag, obj, name); else if (is_string(ptr)) fprintf(fout, "if (*%s->%s)\n\t\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", obj, name, tag, c_ident(ptr), obj, name); else if (is_wstring(ptr)) fprintf(fout, "if (*%s->%s)\n\t\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 2);", obj, name, tag, c_ident(ptr), obj, name); else if (is_stdwstring(ptr)) fprintf(fout, "soap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 2);", tag, c_ident(ptr), obj, name); else if (is_primitive_or_string(ptr) || is_binary(ptr)) fprintf(fout, "soap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", tag, c_ident(ptr), obj, name); else if (is_anyAttribute(ptr)) fprintf(fout, "if (soap_out_%s(soap, \"%s\", -1, %s->%s, \"%s\"))\n\t\t\treturn soap->error;", c_ident(ptr), tag, obj, name, xsi_type_u(ptr)); else { sprintf(errbuf, "Member '%s' cannot be serialized as an XML attribute", name); semwarn(errbuf); } fprintf(fout, "\n\t}"); if (p->info.minOccurs > 0) { fprintf(fout, "\n\telse\n\t\t"); if (is_wstring(ptr) || is_stdwstring(ptr)) fprintf(fout, "soap_set_attr(soap, \"%s\", \"%s\", 2);", tag, default_value(p)); else fprintf(fout, "soap_set_attr(soap, \"%s\", \"%s\", 1);", tag, default_value(p)); } } else if (is_primitive_or_string(typ) || is_binary(typ)) fprintf(fout, "soap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, c_ident(typ), obj, name); else if (is_anyAttribute(typ)) fprintf(fout, "if (soap_out_%s(soap, \"%s\", -1, &%s->%s, \"%s\"))\n\t\treturn soap->error;", c_ident(typ), tag, obj, name, xsi_type_u(typ)); else { sprintf(errbuf, "Member '%s' cannot be serialized as an XML attribute", name); semwarn(errbuf); } if (p->info.minOccurs == 0 && (typ->type != Tpointer || is_string(typ) || is_wstring(typ)) && p->info.hasval && !p->info.ptrval && !p->info.fixed) fprintf(fout, "\n\t}"); } void soap_attr_value(Entry *p, const char *obj, const char *name, const char *tag) { int occurs = 0; Tnode *typ = p->info.typ; if (p->info.sto & (Sconst | Sprivate | Sprotected)) return; if (typ->type == Treference || typ->type == Trvalueref) typ = typ->ref; if (p->info.maxOccurs == 0) occurs = 2; /* prohibited */ else if (p->info.minOccurs >= 1) occurs = 1; /* required */ if (sflag && occurs) occurs += 2; /* prohibited/required if SOAP_XML_STRICT */ if ((is_external(typ) || is_typedef(typ)) && !is_anyAttribute(typ) && !is_anyType(typ) && !is_smart(typ) && typ->type != Tpointer && !is_stdstr(typ) && !is_string(typ) && !is_wstring(typ) && !is_binary(typ)) fprintf(fout, "\n\tif (soap_s2%s(soap, soap_attr_value(soap, \"%s\", %d, %d), &%s->%s))\n\t\treturn NULL;", c_ident(typ), tag, property(typ), occurs, obj, name); else if (is_smart(typ) || (typ->type == Tpointer && !is_string(typ) && !is_wstring(typ))) { Tnode *ptr = (Tnode*)typ->ref; const char *get = ""; if (!is_anyAttribute(ptr) && !is_anyType(ptr)) fprintf(fout, "\n\t{\n\t\tconst char *t = soap_attr_value(soap, \"%s\", %d, %d);\n\t\tif (t)\n\t\t{", tag, property(ptr), occurs); if (is_smart(typ)) { fprintf(fout, "\n\t\t\t%s->%s = %s(SOAP_NEW(soap, %s));", obj, name, c_type(typ), c_type(ptr)); get = ".get()"; } else if (is_stdstr(ptr) || ptr->type == Tclass) fprintf(fout, "\n\t\t\tif (!(%s->%s = soap_new_%s(soap)))\n\t\t\t{\tsoap->error = SOAP_EOM;\n\t\t\t\treturn NULL;\n\t\t\t}", obj, name, c_ident(ptr)); else fprintf(fout, "\n\t\t\tif (!(%s->%s = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t\t{\tsoap->error = SOAP_EOM;\n\t\t\t\treturn NULL;\n\t\t\t}", obj, name, c_type(typ), c_type(ptr)); if ((is_external(ptr) || is_typedef(ptr)) && !is_anyAttribute(ptr) && !is_anyType(ptr) && !is_stdstr(ptr) && !is_string(ptr) && !is_wstring(ptr) && !is_binary(ptr)) fprintf(fout, "\n\t\t\tif (soap_s2%s(soap, t, %s->%s%s))\n\t\t\t\treturn NULL;", c_ident(ptr), obj, name, get); else if (is_smart(typ) && is_anyAttribute(ptr)) fprintf(fout, "\n\t\t\tif (!soap_in_%s(soap, \"%s\", %s->%s%s, \"%s\")\n\t\t\t\t%s->%s.reset();", c_ident(ptr), tag, obj, name, get, xsi_type(ptr), obj, name); else if (is_anyAttribute(ptr)) fprintf(fout, "\n\t\t\t%s->%s = soap_in_%s(soap, \"%s\", %s->%s, \"%s\");", obj, name, c_ident(ptr), tag, obj, name, xsi_type(ptr)); else if (is_XML(ptr)) fprintf(fout, "\n\t\t\tif (soap_s2char(soap, t, %s->%s%s, 0, %ld, %ld, %s))\n\t\t\t\treturn NULL;", obj, name, get, minlen(ptr), maxlen(ptr), pattern(ptr)); else if (is_primitive_or_string(ptr) || is_binary(ptr)) fprintf(fout, "\n\t\t\tif (soap_s2%s(soap, t, %s->%s%s))\n\t\t\t\treturn NULL;", c_ident(ptr), obj, name, get); if (!is_anyAttribute(ptr) && !is_anyType(ptr)) { fixed_check(fout, p, NULL, "\t\t\t"); fprintf(fout, "\n\t\t}\n\t\telse if (soap->error)\n\t\t\treturn NULL;\n\t}"); } } else if (is_anyAttribute(typ)) fprintf(fout, "\n\tsoap_in_%s(soap, \"%s\", &%s->%s, \"%s\");", c_ident(typ), tag, obj, name, xsi_type(typ)); else if (is_XML(typ)) fprintf(fout, "\n\tif (soap_s2char(soap, soap_attr_value(soap, \"%s\", 0, %d), &%s->%s, 0, %ld, %ld, %s))\n\t\treturn NULL;", tag, occurs, obj, name, minlen(typ), maxlen(typ), pattern(typ)); else if (is_primitive_or_string(typ) || is_binary(typ)) fprintf(fout, "\n\tif (soap_s2%s(soap, soap_attr_value(soap, \"%s\", %d, %d), &%s->%s))\n\t\treturn NULL;", c_ident(typ), tag, property(typ), occurs, obj, name); if (!is_smart(typ) && !(typ->type == Tpointer && !is_string(typ) && !is_wstring(typ))) fixed_check(fout, p, NULL, "\t"); } const char * ptr_cast(Table *t, const char *name) { const char *type = ident(t->sym->name); char *s = (char*)emalloc(strlen(type) + strlen(name) + 6); sprintf(s, "((%s*)%s)", type, name); return s; } void soap_out(Tnode *typ) { Table *table, *t; Entry *p = NULL; int cardinality, i, j, d; Tnode *temp; const char *nse = ns_qualifiedElement(typ); const char *nsa = ns_qualifiedAttribute(typ); const char *x; if (is_XML(typ)) return; if (is_dynamic_array(typ)) { soap_out_Darray(typ); return; } if (is_external(typ) && !is_volatile(typ)) fprintf(fhead, "\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap*, %s);", c_ident(typ), c_type(typ)); else if (is_qname(typ)) fprintf(fhead, "\n\n#define soap_%s2s(soap, a) soap_QName2s(soap, (a))", c_ident(typ)); else if (is_string(typ)) fprintf(fhead, "\n\n#define soap_%s2s(soap, a) (a)", c_ident(typ)); else if (is_wstring(typ)) fprintf(fhead, "\n\n#define soap_%s2s(soap, a) soap_wchar2s((soap), (a))", c_ident(typ)); else if (is_stdqname(typ)) fprintf(fhead, "\n\n#define soap_%s2s(soap, a) soap_QName2s((soap), (a).c_str())", c_ident(typ)); else if (is_stdstring(typ)) fprintf(fhead, "\n\n#define soap_%s2s(soap, a) ((a).c_str())", c_ident(typ)); else if (is_stdwstring(typ)) fprintf(fhead, "\n\n#define soap_%s2s(soap, a) soap_wchar2s((soap), (a).c_str())", c_ident(typ)); else if (is_typedef(typ) && (!is_external(typ) || is_volatile(typ)) && !is_qname(typ) && !is_stdqname(typ)) { if ((typ->type == Tfloat || typ->type == Tdouble || typ->type == Tldouble) && typ->pattern && typ->pattern[0] == '%' && typ->pattern[1]) { fprintf(fhead, "\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap*, %s);", c_ident(typ), c_type(typ)); fprintf(fout, "\n\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap *soap, %s)", c_ident(typ), c_type_id(typ, "n")); fprintf(fout, "\n{\n\tconst char *s;"); if (typ->type == Tfloat) fprintf(fout, "\n\tconst char *t = soap->float_format;\n\tsoap->float_format = \"%s\";", typ->pattern); else if (typ->type == Tdouble) fprintf(fout, "\n\tconst char *t = soap->double_format;\n\tsoap->double_format = \"%s\";", typ->pattern); else if (typ->type == Tldouble) fprintf(fout, "\n\tconst char *t = soap->long_double_format;\n\tsoap->long_double_format = \"%s\";", typ->pattern); fprintf(fout, "\n\ts = soap_%s2s(soap, n);", t_ident(typ)); if (typ->type == Tfloat) fprintf(fout, "\n\tsoap->float_format = t;"); else if (typ->type == Tdouble) fprintf(fout, "\n\tsoap->double_format = t;"); else if (typ->type == Tldouble) fprintf(fout, "\n\tsoap->long_double_format = t;"); fprintf(fout, "\n\treturn s;\n}"); } else { fprintf(fhead, "\n\n#define soap_%s2s soap_%s2s\n", c_ident(typ), t_ident(typ)); } } if (is_typedef(typ) && (is_element(typ) || is_synonym(typ) || is_external(typ)) && (!is_external(typ) || is_volatile(typ))) { fprintf(fhead, "\n\n#define soap_out_%s soap_out_%s\n", c_ident(typ), t_ident(typ)); return; } if (is_primitive(typ) && typ->type != Tenum && typ->type != Tenumsc) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ), c_type_id(typ, "*a")); if (typ->pattern && typ->pattern[0] == '%' && typ->pattern[1]) { fprintf(fout, "\n\tint err;"); if (typ->type == Tfloat) fprintf(fout, "\n\tconst char *s = soap->float_format;\n\tsoap->float_format = \"%s\";", typ->pattern); else if (typ->type == Tdouble) fprintf(fout, "\n\tconst char *s = soap->double_format;\n\tsoap->double_format = \"%s\";", typ->pattern); else if (typ->type == Tldouble) fprintf(fout, "\n\tconst char *s = soap->long_double_format;\n\tsoap->long_double_format = \"%s\";", typ->pattern); x = xsi_type_u(typ); if (x && *x) fprintf(fout, "\n\tif (!type)\n\t\ttype = \"%s\";", x); if (typ->type == Tllong || typ->type == Tullong) fprintf(fout, "\n\terr = soap_out%s(soap, tag, id, a, type, %s);", c_type(typ), soap_type(typ)); else fprintf(fout, "\n\terr = soap_out%s(soap, tag, id, a, type, %s);", the_type(typ), soap_type(typ)); if (typ->type == Tfloat) fprintf(fout, "\n\tsoap->float_format = s;"); else if (typ->type == Tdouble) fprintf(fout, "\n\tsoap->double_format = s;"); else if (typ->type == Tldouble) fprintf(fout, "\n\tsoap->long_double_format = s;"); fprintf(fout, "\n\treturn err;\n}"); } else { x = xsi_type_u(typ); if (x && *x) fprintf(fout, "\n\tif (!type)\n\t\ttype = \"%s\";", x); if (typ->type == Tllong || typ->type == Tullong) fprintf(fout, "\n\treturn soap_out%s(soap, tag, id, a, type, %s);\n}", c_type(typ), soap_type(typ)); else fprintf(fout, "\n\treturn soap_out%s(soap, tag, id, a, type, %s);\n}", the_type(typ), soap_type(typ)); } return; } if (is_fixedstring(typ)) { fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const char[], const char*);", c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const char a[], const char *type)\n{", c_ident(typ)); fprintf(fout, "\n\treturn soap_outstring(soap, tag, id, (char*const*)(void*)&a, type, %s);\n}", soap_type(typ)); return; } if (is_string(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, char*const*, const char*);", c_ident(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, char*const*, const char*);", c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, char *const*a, const char *type)\n{", c_ident(typ)); fprintf(fout, "\n\treturn soap_outstring(soap, tag, id, a, type, %s);\n}", soap_type(typ)); return; } if (is_wstring(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, wchar_t*const*, const char*);", c_ident(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, wchar_t*const*, const char*);", c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, wchar_t *const*a, const char *type)\n{", c_ident(typ)); fprintf(fout, "\n\treturn soap_outwstring(soap, tag, id, a, type, %s);\n}", soap_type(typ)); return; } if (is_stdstring(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const std::string*, const char*);", c_ident(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const std::string*, const char*);", c_ident(typ)); if (is_stdXML(typ)) fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const std::string *s, const char *type)\n{\n\t(void)id; /* appease -Wall -Werror */\n\tconst char *t = s->c_str();\n\treturn soap_outliteral(soap, tag, (char*const*)(void*)&t, type);\n}", c_ident(typ)); else fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const std::string *s, const char *type)\n{\n\tif ((soap->mode & SOAP_C_NILSTRING) && s->empty())\n\t\treturn soap_element_null(soap, tag, id, type);\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, s, %s), type) || soap_string_out(soap, s->c_str(), 0) || soap_element_end_out(soap, tag))\n\t\treturn soap->error;\n\treturn SOAP_OK;\n}", c_ident(typ), soap_type(typ)); return; } if (is_stdwstring(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const std::wstring*, const char*);", c_ident(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const std::wstring*, const char*);", c_ident(typ)); if (is_stdXML(typ)) fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const std::wstring *s, const char *type)\n{\n\tconst wchar_t *t = s->c_str();\n\treturn soap_outwliteral(soap, tag, (wchar_t*const*)(void*)&t, type);\n}", c_ident(typ)); else fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const std::wstring *s, const char *type)\n{\n\tif ((soap->mode & SOAP_C_NILSTRING) && s->empty())\n\t\treturn soap_element_null(soap, tag, id, type);\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, s, %s), type) || soap_wstring_out(soap, s->c_str(), 0) || soap_element_end_out(soap, tag))\n\t\treturn soap->error;\n\treturn SOAP_OK;\n}", c_ident(typ), soap_type(typ)); return; } switch(typ->type) { case Tstruct: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ), c_type_id(typ, "*a")); table = (Table*)typ->ref; for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (is_repetition(p) || is_anytype(p) || is_choice(p)) p = p->next; else if (is_transient(p->info.typ)) ; else if (p->info.sto & Sattribute) ; else if (is_qname(p->info.typ)) fprintf(fout, "\n\tconst char *soap_tmp_%s;", ident(p->sym->name)); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\tstd::string soap_tmp_%s;", ident(p->sym->name)); else if ((p->info.typ->type == Tpointer || is_smart_shared(p->info.typ)) && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tconst char *soap_tmp_%s;", ident(p->sym->name)); else if (is_smart(p->info.typ) && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tconst char *soap_tmp_%s;", ident(p->sym->name)); } } if (has_setter(typ)) fprintf(fout, "\n\tif (((%s)a)->set(soap))\n\t\treturn soap->error;", c_type_id(typ, "*")); if (table && !is_invisible(typ->id->name)) { for (p = table->list; p; p = p->next) { if (is_pointer_to_derived(p)) fprintf(fout, "\n\tif (a->%s)\n\t\treturn soap_out_%s(soap, tag, id, a->%s, \"%s\");", ident(p->sym->name), c_ident(p->info.typ->ref), ident(p->sym->name), xsi_type(p->info.typ->ref)); } } x = xsi_type_u(typ); if (x && *x) fprintf(fout, "\n\tif (!type)\n\t\ttype = \"%s\";", x); for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (is_repetition(p) || is_anytype(p) || is_choice(p)) p = p->next; else if (is_transient(p->info.typ)) ; else if (p->info.sto & Sattribute) soap_set_attr(p, "a", ident(p->sym->name), ns_add(p, nsa)); else if (is_qname(p->info.typ)) fprintf(fout, "\n\tsoap_tmp_%s = soap_QName2s(soap, a->%s);", ident(p->sym->name), ident(p->sym->name)); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\tsoap_tmp_%s = soap_QName2s(soap, a->%s.c_str());", ident(p->sym->name), ident(p->sym->name)); else if ((p->info.typ->type == Tpointer || is_smart_shared(p->info.typ)) && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tsoap_tmp_%s = a->%s ? soap_QName2s(soap, *a->%s) : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); else if (is_smart(p->info.typ) && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tsoap_tmp_%s = a->%s.get() ? soap_QName2s(soap, *a->%s) : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); else if ((p->info.typ->type == Tpointer || is_smart_shared(p->info.typ)) && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tstd::string soap_temp_%s(a->%s ? soap_QName2s(soap, a->%s->c_str()) : \"\"), *soap_tmp_%s = a->%s ? &soap_temp_%s : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); else if (is_smart(p->info.typ) && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tstd::string soap_temp_%s(a->%s.get() ? soap_QName2s(soap, a->%s->c_str()) : \"\"), *soap_tmp_%s = a->%s.get() ? &soap_temp_%s : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); } } fprintf(fout, "\n\t(void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */"); if (!table) { fprintf(fout, "\n\treturn SOAP_OK;\n}"); } else if (is_primclass(typ)) { for (table = (Table*)typ->ref; table; table = table->prev) { p = table->list; while (p && !is_item(p)) p = p->next; if (p) break; } if ((p->info.sto & SmustUnderstand) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && !is_transient(p->info.typ) && !is_void(p->info.typ) && p->info.typ->type != Tfun) fprintf(fout, "\n\tsoap->mustUnderstand = 1;"); if (p->info.typ->type == Tarray) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, a->%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\treturn a->%s.soap_out(soap, tag, id, \"%s\");", ident(p->sym->name), xsi_type_u(typ)); else if (is_qname(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)(void*)&soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if ((p->info.typ->type == Tpointer || is_smart(p->info.typ)) && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)(void)&soap_tmp_%s, \"%s\");", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type_u(typ->ref)); else if ((p->info.typ->type == Tpointer || is_smart(p->info.typ)) && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tif (soap_tmp_%s)\n\t\treturn soap_out_%s(soap, tag, id, soap_tmp_%s, \"%s\");", ident(p->sym->name), c_ident(p->info.typ->ref), ident(p->sym->name), xsi_type_u(typ->ref)); else if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\treturn soap_outliteral(soap, tag, (char*const*)&a->%s, NULL);", ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\treturn soap_outwliteral(soap, tag, (wchar_t*const*)&a->%s, NULL);", ident(p->sym->name)); else if (is_string(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)&a->%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (wchar_t*const*)&a->%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &a->%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else fprintf(fout, "\n\treturn SOAP_OK;"); fprintf(fout, "\n}"); } else { if (!is_invisible(typ->id->name)) fprintf(fout, "\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), type))\n\t\treturn soap->error;", soap_type(typ)); fflush(fout); for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if ((p->info.sto & Sreturn)) { if (nse || has_ns_eq(NULL, p->sym->name)) { if (p->info.typ->type == Tpointer) fprintf(fout, "\n\tif (a->%s)\n\t\tsoap_element_result(soap, \"%s\");", ident(p->sym->name), ns_add(p, nse)); else fprintf(fout, "\n\tsoap_element_result(soap, \"%s\");", ns_add(p, nse)); } } if ((p->info.sto & SmustUnderstand) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && !is_void(p->info.typ) && p->info.typ->type != Tfun) fprintf(fout, "\n\tsoap->mustUnderstand = 1;"); needs_lang(p); if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if ((p->info.sto & (Sconst | Sprivate | Sprotected))) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if ((p->info.sto & Sattribute)) ; else if (is_repetition(p)) { fprintf(fout, "\n\tif (a->%s)", ident(p->next->sym->name)); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < (int)a->%s; i++)", ident(p->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tif (a->%s[i].soap_out(soap, \"%s\", -1, \"%s\"))\n\t\t\t\treturn soap->error;", ident(p->next->sym->name), ns_add(p->next, nse), xsi_type_u((Tnode*)p->next->info.typ->ref)); else if (is_qname((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t{\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s[i]);\n\t\t\tif (soap_out_%s(soap, \"%s\", -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\t\t\treturn soap->error;\n\t\t}", ident(p->next->sym->name), ident(p->next->sym->name), c_ident((Tnode*)p->next->info.typ->ref), ns_add(p->next, nse), ident(p->next->sym->name), xsi_type_u((Tnode*)p->next->info.typ->ref)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tif (soap_outliteral(soap, \"%s\", (char*const*)(a->%s + i), NULL))\n\t\t\t\treturn soap->error;", ns_add(p->next, nse), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tif (soap_outwliteral(soap, \"%s\", (wchar_t*const*)(a->%s + i), NULL))\n\t\t\t\treturn soap->error;", ns_add(p->next, nse), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tif (soap_out_string(soap, \"%s\", -1, (char*const*)(a->%s + i), \"%s\"))\n\t\t\t\treturn soap->error;", ns_add(p->next, nse), ident(p->next->sym->name), xsi_type_u((Tnode*)p->next->info.typ->ref)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tif (soap_out_wstring(soap, \"%s\", -1, (wchar_t*const*)(a->%s + i), \"%s\"))\n\t\t\t\treturn soap->error;", ns_add(p->next, nse), ident(p->next->sym->name), xsi_type_u((Tnode*)p->next->info.typ->ref)); else fprintf(fout, "\n\t\t\tif (soap_out_%s(soap, \"%s\", -1, a->%s + i, \"%s\"))\n\t\t\t\treturn soap->error;", c_ident((Tnode*)p->next->info.typ->ref), ns_add(p->next, nse), ident(p->next->sym->name), xsi_type_u((Tnode*)p->next->info.typ->ref)); fprintf(fout, "\n\t}"); p = p->next; } else if (is_anytype(p) && is_invisible(p->next->sym->name)) { fprintf(fout, "\n\tif (soap_putelement(soap, a->%s, tag, -1, a->%s))\n\t\treturn soap->error;", ident(p->next->sym->name), ident(p->sym->name)); p = p->next; } else if (is_anytype(p)) { fprintf(fout, "\n\tif (soap_putelement(soap, a->%s, \"%s\", -1, a->%s))\n\t\treturn soap->error;", ident(p->next->sym->name), ns_add(p->next, nse), ident(p->sym->name)); p = p->next; } else if (is_choice(p)) { fprintf(fout, "\n\tif (soap_out_%s(soap, a->%s, &a->%s))\n\t\treturn soap->error;", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_transient(p->info.typ)) { if (!is_pointer_to_derived(p)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); } else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, a->%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_u(p->info.typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif (a->%s.soap_out(soap, %s, -1, \"%s\"))\n\t\treturn soap->error;", ident(p->sym->name), field(p, nse), xsi_type_u(p->info.typ)); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, &soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_u(p->info.typ)); else { if (zflag != 2 && p->info.typ->type == Tpointer && !is_void(p->info.typ) && p->info.minOccurs > 0) { /* xsi:nil only if nillable, otherwise empty element */ if (p->info.nillable) fprintf(fout, "\n\tif (!a->%s)\n\t{\tif (soap_element_nil(soap, %s))\n\t\t\treturn soap->error;\n\t}\n\telse ", ident(p->sym->name), field(p, nse)); else fprintf(fout, "\n\tif (!a->%s)\n\t{\tif (soap_element_empty(soap, %s))\n\t\t\treturn soap->error;\n\t}\n\telse ", ident(p->sym->name), field(p, nse)); } else { fprintf(fout, "\n\t"); } if (is_qname(p->info.typ)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_u(p->info.typ)); else if ((p->info.typ->type == Tpointer || is_smart(p->info.typ)) && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ->ref), field(p, nse), ident(p->sym->name), xsi_type_u(p->info.typ->ref)); else if ((p->info.typ->type == Tpointer || is_smart(p->info.typ)) && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "if (soap_tmp_%s && soap_out_%s(soap, %s, -1, soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", ident(p->sym->name), c_ident(p->info.typ->ref), field(p, nse), ident(p->sym->name), xsi_type_u(p->info.typ->ref)); else if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "if (soap_outliteral(soap, %s, (char*const*)&a->%s, NULL))\n\t\treturn soap->error;", field(p, nse), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "if (soap_outwliteral(soap, %s, (wchar_t*const*)&a->%s, NULL))\n\t\treturn soap->error;", field(p, nse), ident(p->sym->name)); else if (is_string(p->info.typ)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, (char*const*)&a->%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_u(p->info.typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, (wchar_t*const*)&a->%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_u(p->info.typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, &a->%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_u(p->info.typ)); else fprintf(fout, "{ }"); } } } if (!is_invisible(typ->id->name)) fprintf(fout, "\n\treturn soap_element_end_out(soap, tag);\n}"); else fprintf(fout, "\n\treturn SOAP_OK;\n}"); } fflush(fout); break; case Tclass: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); return; } if (!is_volatile(typ) && !is_typedef(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fout, "\n\nint %s::soap_out(struct soap *soap, const char *tag, int id, const char *type) const", ident(typ->id->name)); fprintf(fout, "\n{\n\treturn soap_out_%s(soap, tag, id, this, type);\n}", c_ident(typ)); } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ), c_type_id(typ, "*a")); fflush(fout); if (has_setter(typ)) fprintf(fout, "\n\tif (((%s)a)->set(soap))\n\t\treturn soap->error;", c_type_id(typ, "*")); table = (Table*)typ->ref; if (table && !is_invisible(typ->id->name)) { for (p = table->list; p; p = p->next) { if (is_pointer_to_derived(p)) fprintf(fout, "\n\tif (a->%s)\n\t\treturn soap_out_%s(soap, tag, id, a->%s, \"%s\");", ident(p->sym->name), c_ident(p->info.typ->ref), ident(p->sym->name), xsi_type(p->info.typ->ref)); } } x = xsi_type_u(typ); if (x && *x) fprintf(fout, "\n\tif (!type)\n\t\ttype = \"%s\";", x); for (t = table; t; t = t->prev) { Entry *e = entry(classtable, t->sym); const char *nsa1 = e ? ns_qualifiedAttribute(e->info.typ) : nsa; for (p = t->list; p; p = p->next) { if (is_repetition(p) || is_anytype(p) || is_choice(p)) p = p->next; else if (is_transient(p->info.typ)) ; else if (p->info.sto & Sattribute) soap_set_attr(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa1)); else if (is_qname(p->info.typ)) fprintf(fout, "\n\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s);", ident(p->sym->name), ident(p->sym->name)); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\tstd::string soap_tmp_%s(soap_QName2s(soap, a->%s.c_str()));", ident(p->sym->name), ident(p->sym->name)); else if ((p->info.typ->type == Tpointer || is_smart_shared(p->info.typ)) && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tconst char *soap_tmp_%s = a->%s ? soap_QName2s(soap, *a->%s) : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); else if (is_smart(p->info.typ) && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tconst char *soap_tmp_%s = a->%s.get() ? soap_QName2s(soap, *a->%s) : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); else if ((p->info.typ->type == Tpointer || is_smart_shared(p->info.typ)) && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tstd::string soap_temp_%s(a->%s ? soap_QName2s(soap, a->%s->c_str()) : \"\"), *soap_tmp_%s = a->%s ? &soap_temp_%s : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); else if (is_smart(p->info.typ) && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tstd::string soap_temp_%s(a->%s.get() ? soap_QName2s(soap, a->%s->c_str()) : \"\"), *soap_tmp_%s = a->%s.get() ? &soap_temp_%s : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); } } fprintf(fout, "\n\t(void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */"); if (!table) { fprintf(fout, "\n\treturn SOAP_OK;\n}"); } else if (is_primclass(typ)) { for (t = table; t; t = t->prev) { p = t->list; while (p && !is_item(p)) p = p->next; if (p) break; } if ((p->info.sto & SmustUnderstand) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && !is_transient(p->info.typ) && !is_void(p->info.typ) && p->info.typ->type != Tfun) fprintf(fout, "\n\tsoap->mustUnderstand = 1;"); if (table && table->prev) { if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\treturn soap_outliteral(soap, tag, (char*const*)&a->%s::%s, \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\treturn soap_outwliteral(soap, tag, (wchar_t*const*)&a->%s::%s, \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else if (is_qname(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)(void*)&soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); else if (is_string(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)&a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (wchar_t*const*)&a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\treturn (a->%s::%s).soap_out(soap, tag, id, \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); else if ((p->info.typ->type == Tpointer || is_smart(p->info.typ)) && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)(void*)&soap_tmp_%s, \"%s\");", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type_u(typ->ref)); else if ((p->info.typ->type == Tpointer || is_smart(p->info.typ)) && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tif (soap_tmp_%s)\n\t\treturn soap_out_%s(soap, tag, id, soap_tmp_%s, \"%s\");", ident(p->sym->name), c_ident(p->info.typ->ref), ident(p->sym->name), xsi_type_u(typ->ref)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else fprintf(fout, "\n\treturn SOAP_OK;"); } else { if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\treturn soap_outliteral(soap, tag, (char*const*)&a->%s::%s, NULL);", ident(t->sym->name), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\treturn soap_outwliteral(soap, tag, (wchar_t*const*)&a->%s::%s, NULL);", ident(t->sym->name), ident(p->sym->name)); else if (is_qname(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)(void*)&soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (is_string(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)&a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type_u(typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (wchar_t*const*)&a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\treturn (a->%s::%s).soap_out(soap, tag, id, \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type_u(typ)); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if ((p->info.typ->type == Tpointer || is_smart(p->info.typ)) && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)(void*)&soap_tmp_%s, \"%s\");", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type_u(typ->ref)); else if ((p->info.typ->type == Tpointer || is_smart(p->info.typ)) && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tif (soap_tmp_%s)\n\t\treturn soap_out_%s(soap, tag, id, soap_tmp_%s, \"%s\");", ident(p->sym->name), c_ident(p->info.typ->ref), ident(p->sym->name), xsi_type_u(typ->ref)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type_u(typ)); else fprintf(fout, "\n\treturn SOAP_OK;"); } fprintf(fout, "\n}"); } else { if (!is_invisible(typ->id->name)) { if (table && table->prev) fprintf(fout, "\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), type ? type : \"%s\"))\n\t\treturn soap->error;", soap_type(typ), xsi_type(typ)); else fprintf(fout, "\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), type))\n\t\treturn soap->error;", soap_type(typ)); } fflush(fout); i = 0; /* Get the depth of the inheritance hierarchy */ for (t = table; t; t = t->prev) i++; /* Call routines to output the member data of the class */ /* Data members of the Base Classes are outputed first followed by the data members of the Derived classes. Overridden data members are output twice once for the base class they are defined in and once for the derived class that overwrites them */ for (; i > 0; i--) { Entry *e; const char *nse1; t = table; for (j = 0; j < i-1; j++) t = t->prev; e = entry(classtable, t->sym); nse1 = e ? ns_qualifiedElement(e->info.typ) : nse; for (p = t->list; p != (Entry*) 0; p = p->next) { if (p->info.sto & Sreturn) { if (nse1 || has_ns_eq(NULL, p->sym->name)) { if (p->info.typ->type == Tpointer) fprintf(fout, "\n\tif (a->%s)\n\t\tsoap_element_result(soap, \"%s\");", ident(p->sym->name), ns_add(p, nse1)); else fprintf(fout, "\n\tsoap_element_result(soap, \"%s\");", ns_add(p, nse1)); } } if ((p->info.sto & SmustUnderstand) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && !is_transient(p->info.typ) && !is_void(p->info.typ) && p->info.typ->type != Tfun) fprintf(fout, "\n\tsoap->mustUnderstand = 1;"); needs_lang(p); if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { fprintf(fout, "\n\tif (a->%s::%s)", ident(t->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < (int)a->%s::%s; i++)", ident(t->sym->name), ident(p->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tif (a->%s::%s[i].soap_out(soap, %s, -1, \"%s\"))\n\t\t\t\treturn soap->error;", ident(t->sym->name), ident(p->next->sym->name), field_overridden(t, p->next, nse1), xsi_type_u((Tnode*)p->next->info.typ->ref)); else if (is_qname((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t{\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s[i]);\n\t\t\tif (soap_out_%s(soap, %s, -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\t\t\treturn soap->error;\n\t\t}", ident(p->next->sym->name), ident(p->next->sym->name), c_ident((Tnode*)p->next->info.typ->ref), field_overridden(t, p->next, nse1), ident(p->next->sym->name), xsi_type_u((Tnode*)p->next->info.typ->ref)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tif (soap_outliteral(soap, %s, (char*const*)(a->%s::%s + i), NULL))\n\t\t\t\treturn soap->error;", field_overridden(t, p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tif (soap_outwliteral(soap, %s, (wchar_t*const*)(a->%s::%s + i), NULL))\n\t\t\t\treturn soap->error;", field_overridden(t, p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tif (soap_out_string(soap, \"%s\", -1, (char*const*)(a->%s::%s + i), \"%s\"))\n\t\t\t\treturn soap->error;", ns_add(p->next, nse), ident(t->sym->name), ident(p->next->sym->name), xsi_type_u((Tnode*)p->next->info.typ->ref)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tif (soap_out_wstring(soap, \"%s\", -1, (wchar_t*const*)(a->%s::%s + i), \"%s\"))\n\t\t\t\treturn soap->error;", ns_add(p->next, nse), ident(t->sym->name), ident(p->next->sym->name), xsi_type_u((Tnode*)p->next->info.typ->ref)); else fprintf(fout, "\n\t\t\tif (soap_out_%s(soap, %s, -1, a->%s::%s + i, \"%s\"))\n\t\t\t\treturn soap->error;", c_ident((Tnode*)p->next->info.typ->ref), field_overridden(t, p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type_u((Tnode*)p->next->info.typ->ref)); fprintf(fout, "\n\t}"); p = p->next; } else if (is_anytype(p) && is_invisible(p->next->sym->name)) { fprintf(fout, "\n\tif (soap_putelement(soap, a->%s::%s, tag, -1, a->%s::%s))\n\t\treturn soap->error;", ident(t->sym->name), ident(p->next->sym->name), ident(t->sym->name), ident(p->sym->name)); p = p->next; } else if (is_anytype(p)) { fprintf(fout, "\n\tif (soap_putelement(soap, a->%s::%s, %s, -1, a->%s::%s))\n\t\treturn soap->error;", ident(t->sym->name), ident(p->next->sym->name), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); p = p->next; } else if (is_choice(p)) { fprintf(fout, "\n\tif (soap_out_%s(soap, a->%s::%s, &a->%s::%s))\n\t\treturn soap->error;", c_ident(p->next->info.typ), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_item(p)) { } else if (is_transient(p->info.typ)) { if (!is_pointer_to_derived(p)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); } else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, a->%s::%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_u(p->info.typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif ((a->%s::%s).soap_out(soap, %s, -1, \"%s\"))\n\t\treturn soap->error;", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1), xsi_type_u(p->info.typ)); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, &soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_u(p->info.typ)); else { if (zflag != 2 && p->info.typ->type == Tpointer && !is_void(p->info.typ) && p->info.minOccurs > 0) { /* xsi:nil only if nillable, otherwise empty element */ if (p->info.nillable) fprintf(fout, "\n\tif (!a->%s::%s)\n\t{\tif (soap_element_nil(soap, %s))\n\t\t\treturn soap->error;\n\t}\n\telse ", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1)); else fprintf(fout, "\n\tif (!a->%s::%s)\n\t{\tif (soap_element_empty(soap, %s))\n\t\t\treturn soap->error;\n\t}\n\telse ", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1)); } else { fprintf(fout, "\n\t"); } if (is_qname(p->info.typ)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_u(p->info.typ)); else if ((p->info.typ->type == Tpointer || is_smart(p->info.typ)) && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident((Tnode*)p->info.typ->ref), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_u(p->info.typ->ref)); else if ((p->info.typ->type == Tpointer || is_smart(p->info.typ)) && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "if (soap_tmp_%s && soap_out_%s(soap, %s, -1, soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", ident(p->sym->name), c_ident(p->info.typ->ref), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_u(p->info.typ->ref)); else if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "if (soap_outliteral(soap, %s, (char*const*)&a->%s::%s, NULL))\n\t\treturn soap->error;", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "if (soap_outwliteral(soap, %s, (wchar_t*const*)&a->%s::%s, NULL))\n\t\treturn soap->error;", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); else if (is_string(p->info.typ)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, (char*const*)&a->%s::%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_u(p->info.typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, (wchar_t*const*)&a->%s::%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_u(p->info.typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, &a->%s::%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_u(p->info.typ)); else fprintf(fout, "{ }"); } } } i = 0; /* Get the depth of the inheritance hierarchy */ for (t = table; t; t = t->prev) i++; /* output __item(s) and inherited DOM at the end */ for (; i > 0; i--) { Entry *e; const char *nse1; t = table; for (j = 0; j < i-1; j++) t = t->prev; e = entry(classtable, t->sym); if (!t->prev && e && e->info.typ && e->info.typ->base && !strcmp(e->info.typ->base->name, "soap_dom_element")) fprintf(fout, "\n\tif (soap_out_xsd__anyType(soap, NULL, -1, static_cast(a), NULL))\n\t\treturn soap->error;"); nse1 = e ? ns_qualifiedElement(e->info.typ) : nse; for (p = t->list; p != (Entry*) 0; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected | Sattribute)) ; else if (is_repetition(p) || is_anytype(p) || is_choice(p)) p = p->next; else if (!is_item(p)) ; else if (is_transient(p->info.typ)) ; else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, a->%s::%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_u(p->info.typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif ((a->%s::%s).soap_out(soap, %s, -1, \"%s\"))\n\t\treturn soap->error;", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1), xsi_type_u(p->info.typ)); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, &soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_u(p->info.typ)); else { if (zflag != 2 && p->info.typ->type == Tpointer && !is_void(p->info.typ) && p->info.minOccurs > 0) { /* xsi:nil only if nillable, otherwise empty element */ if (p->info.nillable) fprintf(fout, "\n\tif(a->%s::%s)\n\t{\tif (soap_element_nil(soap, %s))\n\t\t\treturn soap->error;\n\t}\n\telse", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1)); else fprintf(fout, "\n\tif(a->%s::%s)\n\t{\tif (soap_element_empty(soap, %s))\n\t\t\treturn soap->error;\n\t}\n\telse", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1)); } else { fprintf(fout, "\n\t"); } if (is_qname(p->info.typ)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_u(p->info.typ)); else if ((p->info.typ->type == Tpointer || is_smart(p->info.typ)) && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident((Tnode*)p->info.typ->ref), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_u(p->info.typ->ref)); else if ((p->info.typ->type == Tpointer || is_smart(p->info.typ)) && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "if (soap_tmp_%s && soap_out_%s(soap, %s, -1, soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", ident(p->sym->name), c_ident(p->info.typ->ref), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_u(p->info.typ->ref)); else if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "if (soap_outliteral(soap, %s, (char*const*)&a->%s::%s, NULL))\n\t\treturn soap->error;", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "if (soap_outwliteral(soap, %s, (wchar_t*const*)&a->%s::%s, NULL))\n\t\treturn soap->error;", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); else if (is_string(p->info.typ)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, (char*const*)&a->%s::%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_u(p->info.typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, (wchar_t*const*)&a->%s::%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_u(p->info.typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, &a->%s::%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_u(p->info.typ)); else fprintf(fout, "{ }"); } fflush(fout); } } if (!is_invisible(typ->id->name)) fprintf(fout, "\n\treturn soap_element_end_out(soap, tag);\n}"); else fprintf(fout, "\n\treturn SOAP_OK;\n}"); } fflush(fout); break; case Tunion: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, int choice, const %s)\n{", c_ident(typ), c_type_id(typ, "*a")); table = (Table*)typ->ref; fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); fprintf(fout, "\n\tswitch (choice)\n\t{"); if (table) { for (p = table->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) ; else if (is_anytype(p)) ; else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.typ->type == Tarray) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn soap_out_%s(soap, \"%s\", -1, a->%s, \"%s\");", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type_u(p->info.typ)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn a->%s.soap_out(soap, \"%s\", -1, \"%s\");", ident(p->sym->name), ns_add(p, nse), xsi_type_u(p->info.typ)); } else if (is_qname(p->info.typ) || is_stdqname(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t{\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s);", ident(p->sym->name), ident(p->sym->name)); fprintf(fout, "\n\t\treturn soap_out_%s(soap, \"%s\", -1, (char*const*)(void*)&soap_tmp_%s, \"%s\");\n\t}", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type_u(p->info.typ)); } else if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn soap_outliteral(soap, \"%s\", (char*const*)&a->%s, NULL);", ns_add(p, nse), ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn soap_outwliteral(soap, \"%s\", (wchar_t*const*)&a->%s, NULL);", ns_add(p, nse), ident(p->sym->name)); } else if (is_string(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn soap_out_%s(soap, \"%s\", -1, (char*const*)&a->%s, \"%s\");", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type_u(p->info.typ)); } else if (is_wstring(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn soap_out_%s(soap, \"%s\", -1, (wchar_t*const*)&a->%s, \"%s\");", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type_u(p->info.typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn soap_out_%s(soap, \"%s\", -1, &a->%s, \"%s\");", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type_u(p->info.typ)); } } } fprintf(fout, "\n\tdefault:\n\t\tbreak;\n\t}\n\treturn SOAP_OK;\n}"); fflush(fout); break; case Tpointer: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char *, int, %s, const char *);", c_ident(typ), c_type_constptr_id(typ, "const*")); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char *, int, %s, const char *);", c_ident(typ), c_type_constptr_id(typ, "const*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, %s, const char *type)\n{", c_ident(typ), c_type_constptr_id(typ, "const*a")); if (is_template(typ)) { fprintf(fout, "\n\tif (!*a)"); fprintf(fout, "\n\t\treturn soap_element_null(soap, tag, id, type);"); fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, *a, type);", c_ident((Tnode*)typ->ref)); } else { p = is_dynamic_array((Tnode*)typ->ref); if (p) { d = get_Darraydims((Tnode*)typ->ref); if (d) fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, *a, *a ? (*a)->%s : NULL, *a ? %s : 0, type, %s, NULL);", ident(p->sym->name), get_Darraysize("(*a)", d), soap_type((Tnode*)typ->ref)); else fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, *a, *a ? (*a)->%s : NULL, *a ? (*a)->__size : 0, type, %s, NULL);", ident(p->sym->name), soap_type((Tnode*)typ->ref)); fprintf(fout, "\n\tif (!*a || id < 0)\n\t\treturn soap->error;"); } else { if (((Tnode*)typ->ref)->recursive) fprintf(fout, "\n\tchar *mark;\n\tid = soap_element_id(soap, tag, id, *a, NULL, 0, type, %s, &mark);", soap_type((Tnode*)typ->ref)); else fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, *a, NULL, 0, type, %s, NULL);", soap_type((Tnode*)typ->ref)); fprintf(fout, "\n\tif (id < 0)\n\t\treturn soap->error;"); } if (((Tnode *) typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { if (!p && ((Tnode*)typ->ref)->recursive) fprintf(fout, "\n\t(void)(*a)->soap_out(soap, tag, id, (*a)->soap_type() == %s ? type : NULL);\n\tsoap_unmark(soap, mark);\n\treturn soap->error;", soap_type((Tnode*)typ->ref)); else fprintf(fout, "\n\treturn (*a)->soap_out(soap, tag, id, (*a)->soap_type() == %s ? type : NULL);", soap_type((Tnode*)typ->ref)); } else { if (!p && ((Tnode*)typ->ref)->recursive) fprintf(fout, "\n\t(void)soap_out_%s(soap, tag, id, *a, type);\n\tsoap_unmark(soap, mark);\n\treturn soap->error;", c_ident((Tnode*)typ->ref)); else fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, *a, type);", c_ident((Tnode*)typ->ref)); } } fprintf(fout, "\n}"); break; case Tarray: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, %s, const char*);", c_ident(typ), c_type_id(typ, "const")); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, %s, const char*);", c_ident(typ), c_type_id(typ, "const")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, %s, const char *type)\n{", c_ident(typ), c_type_id(typ, "const a")); fprintf(fout, "\n\tsize_t i;\n\t(void)type;"); fprintf(fout, "\n\tsoap_array_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), \"%s[%d]\", 0);", soap_type(typ), xsi_type_Tarray(typ), get_dimension(typ)); (void)get_item_type(typ, &cardinality); fprintf(fout, "\n\tfor (i = 0; i < %d; i++)\n\t{", get_dimension(typ)); if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { if (cardinality>1) fprintf(fout, "\n\t\tif (a[i].soap_out(soap, \"item\", -1, \"%s\")", xsi_type_u((Tnode*)typ->ref)); else fprintf(fout, "\n\t\tif ((a+i)->soap_out(soap, \"item\", -1, \"%s\")", xsi_type_u((Tnode*)typ->ref)); } else { if (((Tnode *)typ->ref)->type != Tarray) { if (((Tnode *)typ->ref)->type == Tpointer) fprintf(fout, "\n\t\tsoap->position = 1;\n\t\tsoap->positions[0] = i;\n\t\tif (soap_out_%s(soap, \"item\", -1, a", c_ident((Tnode*)typ->ref)); else fprintf(fout, "\n\t\tif (soap_out_%s(soap, \"item\", -1, a", c_ident((Tnode*)typ->ref)); } else fprintf(fout, "\n\t\tif (soap_out_%s(soap, \"item\", -1, a", c_ident((Tnode*)typ->ref)); if (cardinality>1) fprintf(fout, "[i], \"%s\")", xsi_type_u((Tnode*)typ->ref)); else fprintf(fout, "+i, \"%s\")", xsi_type_u((Tnode*)typ->ref)); } fprintf(fout, ")\n\t\t\treturn soap->error;"); if (((Tnode *)typ->ref)->type == Tpointer) fprintf(fout, "\n\t}\n\tsoap->position = 0;\n\treturn soap_element_end_out(soap, tag);\n}"); else fprintf(fout, "\n\t}\n\treturn soap_element_end_out(soap, tag);\n}"); break; case Tenum: case Tenumsc: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); if (!is_typedef(typ)) { fprintf(fout, "\n\nstatic const struct soap_code_map soap_codes_%s[] =\n{", c_ident(typ)); for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (typ->type == Tenumsc) fprintf(fout, "\t{ (LONG64)%s::%s, \"%s\" },\n", c_ident(typ), ident(p->sym->name), ns_remove2(p->sym->name, c_ident(typ))); else fprintf(fout, "\t{ (LONG64)%s, \"%s\" },\n", ident(p->sym->name), ns_remove2(p->sym->name, c_ident(typ))); } } fprintf(fout, "\t{ 0, NULL }\n"); fprintf(fout, "};"); } if (!is_typedef(typ)) { fprintf(fhead, "\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap*, %s);", c_ident(typ), c_type(typ)); fprintf(fout, "\n\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap *soap, %s)", c_ident(typ), c_type_id(typ, "n")); if (is_boolean(typ)) { fprintf(fout, "\n{\n\t(void)soap; /* appease -Wall -Werror */\n\treturn soap_code_str(soap_codes_%s, n != 0);\n}", c_ident(typ)); } else if (!is_mask(typ)) { fprintf(fout, "\n{\n\tconst char *s = soap_code_str(soap_codes_%s, (long)n);", c_ident(typ)); fprintf(fout, "\n\tif (s)\n\t\treturn s;"); fprintf(fout, "\n\treturn soap_long2s(soap, (long)n);"); fprintf(fout, "\n}"); } else { fprintf(fout, "\n{\n\treturn soap_code_list(soap, soap_codes_%s, (long)n);\n}", c_ident(typ)); } } fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ), c_type_id(typ, "*a")); x = xsi_type_u(typ); if (x && *x) fprintf(fout, "\n\tif (!type)\n\t\ttype = \"%s\";", x); fprintf(fout, "\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), type)", soap_type(typ)); fprintf(fout, " || soap_send(soap, soap_%s2s(soap, *a)))\n\t\treturn soap->error;", c_ident(typ)); fprintf(fout, "\n\treturn soap_element_end_out(soap, tag);\n}"); break; case Ttemplate: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); return; } if (is_typedef(typ)) { fprintf(fhead, "\n\n#define soap_out_%s soap_out_%s\n", c_ident(typ), t_ident(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); temp = (Tnode*)typ->ref; if (!temp) return; fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)id; (void)type; /* appease -Wall -Werror */"); if (is_smart(typ)) { p = is_dynamic_array((Tnode*)typ->ref); if (p) { d = get_Darraydims((Tnode*)typ->ref); if (d) fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, a->get(), a->get() ? (*a)->%s : NULL, a->get() ? %s : 0, type, %s, NULL);", ident(p->sym->name), get_Darraysize("(*a)", d), soap_type((Tnode*)typ->ref)); else fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, a->get(), a->get() ? (*a)->%s : NULL, a->get() ? (*a)->__size : 0, type, %s, NULL);", ident(p->sym->name), soap_type((Tnode*)typ->ref)); } else if (((Tnode*)typ->ref)->recursive) fprintf(fout, "\n\tchar *mark;\n\tid = soap_element_id(soap, tag, id, a->get(), NULL, 0, type, %s, &mark);", soap_type((Tnode*)typ->ref)); else fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, a->get(), NULL, 0, type, %s, NULL);", soap_type((Tnode*)typ->ref)); fprintf(fout, "\n\tif (id < 0)\n\t\treturn soap->error;"); if (((Tnode *) typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { if (!p && ((Tnode*)typ->ref)->recursive) fprintf(fout, "\n\t(void)(*a)->soap_out(soap, tag, id, (*a)->soap_type() == %s ? type : NULL);\n\tsoap_unmark(soap, mark);\n\treturn soap->error;", soap_type((Tnode*)typ->ref)); else fprintf(fout, "\n\treturn (*a)->soap_out(soap, tag, id, (*a)->soap_type() == %s ? type : NULL);", soap_type((Tnode*)typ->ref)); } else { if (!p && ((Tnode*)typ->ref)->recursive) fprintf(fout, "\n\t(void)soap_out_%s(soap, tag, id, a->get(), type);\n\tsoap_unmark(soap, mark);\n\treturn soap->error;", c_ident((Tnode*)typ->ref)); else fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, a->get(), type);", c_ident((Tnode*)typ->ref)); } fprintf(fout, "\n}"); } else { fprintf(fout, "\n\tfor (%s::const_iterator i = a->begin(); i != a->end(); ++i)\n\t{", c_type(typ)); if (temp->type == Tarray) fprintf(fout, "\n\t\tif (soap_out_%s(soap, tag, id, *i, \"%s\"))", c_ident(temp), xsi_type_u(typ)); else if (temp->type == Tclass && !is_external(temp) && !is_volatile(temp) && !is_typedef(temp)) fprintf(fout, "\n\t\tif ((*i).soap_out(soap, tag, id, \"%s\"))", xsi_type_u(typ)); else if (is_qname(temp)) fprintf(fout, "\n\t\tconst char *soap_tmp = soap_QName2s(soap, *i);\n\t\tif (soap_out_%s(soap, tag, id, (char*const*)(void*)&soap_tmp, \"%s\"))", c_ident(temp), xsi_type_u(typ)); else if (is_stdqname(temp)) fprintf(fout, "\n\t\tstd::string soap_tmp(soap_QName2s(soap, (*i).c_str()));\n\t\tif (soap_out_%s(soap, tag, id, &soap_tmp, \"%s\"))", c_ident(temp), xsi_type_u(typ)); else if (is_XML(temp) && is_string(temp)) fprintf(fout, "\n\t\tif (soap_outliteral(soap, tag, (char*const*)&(*i), NULL))"); else if (is_XML(temp) && is_wstring(temp)) fprintf(fout, "\n\t\tif (soap_outwliteral(soap, tag, (wchar_t*const*)&(*i), NULL))"); else if (is_string(temp)) fprintf(fout, "\n\t\tif (soap_out_%s(soap, tag, -1, (char*const*)&(*i), \"%s\"))", c_ident(temp), xsi_type_u(typ)); else if (is_wstring(temp)) fprintf(fout, "\n\t\tif (soap_out_%s(soap, tag, -1, (wchar_t*const*)&(*i), \"%s\"))", c_ident(temp), xsi_type_u(typ)); else if (is_bool(temp)) fprintf(fout, "\n\t\tbool b = (*i);\n\t\tif (soap_out_%s(soap, tag, id, &b, \"%s\"))", c_ident(temp), xsi_type_u(typ)); else fprintf(fout, "\n\t\tif (soap_out_%s(soap, tag, id, &(*i), \"%s\"))", c_ident(temp), xsi_type_u(typ)); fprintf(fout, "\n\t\t\treturn soap->error;"); fprintf(fout, "\n\t}\n\treturn SOAP_OK;\n}"); } break; default: break; } } void soap_out_Darray(Tnode *typ) { int i, j, d = 0; Table *t, *table; Entry *p; const char *nse = ns_qualifiedElement(typ); const char *nsa = ns_qualifiedAttribute(typ); const char *item; table = (Table*)typ->ref; fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); if (is_external(typ)) return; if (is_binary(typ)) { fprintf(fhead, "\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap*, %s);", c_ident(typ), c_type(typ)); fprintf(fout, "\n\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap *soap, %s)\n{", c_ident(typ), c_type_id(typ, "a")); if (is_hexBinary(typ)) fprintf(fout, "\n\treturn soap_s2hex(soap, a.__ptr, NULL, a.__size);"); else fprintf(fout, "\n\treturn soap_s2base64(soap, a.__ptr, NULL, a.__size);"); fprintf(fout, "\n}"); } if (typ->type == Tclass && !is_volatile(typ) && !is_typedef(typ)) { fprintf(fout, "\n\nint %s::soap_out(struct soap *soap, const char *tag, int id, const char *type) const", c_type(typ)); fprintf(fout, "\n{\n\treturn soap_out_%s(soap, tag, id, this, type);\n}", c_ident(typ)); } fflush(fout); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ), c_type_id(typ, "*a")); if (has_setter(typ)) fprintf(fout, "\n\t((%s)a)->set(soap);", c_type_id(typ, "*")); if (!is_binary(typ)) { p = is_dynamic_array(typ); d = get_Darraydims(typ); if (d) fprintf(fout, "\n\tsize_t i, n = soap_size(a->__size, %d);", d); else fprintf(fout, "\n\tint i, n = a->__size;"); } if (typ->type == Tclass) { for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.sto & Sattribute) soap_set_attr(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa)); } } } else { for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.sto & Sattribute) soap_set_attr(p, "a", ident(p->sym->name), ns_add(p, nsa)); } } } p = is_dynamic_array(typ); if (p->sym->name[5]) item = ns_addx(ns_convert(p->sym->name + 5), nse); else item = ns_addx("item", nse); if (!has_ns(typ) && !is_untyped(typ) && !is_binary(typ)) { const char *s = xsi_type(typ); if (is_untyped(p->info.typ)) s = wsdl_type(p->info.typ, "xsd"); if (d) { if (has_offset(typ)) fprintf(fout, "\n\tchar *t = a->%s ? soap_putsizesoffsets(soap, \"%s\", a->__size, a->__offset, %d) : NULL;", ident(p->sym->name), s, d); else fprintf(fout, "\n\tchar *t = a->%s ? soap_putsizesoffsets(soap, \"%s\", a->__size, NULL, %d) : NULL;", ident(p->sym->name), s, d); } else { if (has_offset(typ)) fprintf(fout, "\n\tchar *t = a->%s ? soap_putsizesoffsets(soap, \"%s\", &a->__size, &a->__offset, 1) : NULL;", ident(p->sym->name), s); else fprintf(fout, "\n\tchar *t = a->%s ? soap_putsizesoffsets(soap, \"%s\", &a->__size, NULL, 1) : NULL;", ident(p->sym->name), s); } } if (d) fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, a, a->%s, %s, type, %s, NULL);", ident(p->sym->name), get_Darraysize("a", d), soap_type(typ)); else if (is_attachment(typ)) { fprintf(fout, "\n#ifndef WITH_LEANER\n\tid = soap_attachment(soap, tag, id, a, a->%s, a->__size, a->id, a->type, a->options, type, %s);", ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n#else\n\tid = soap_element_id(soap, tag, id, a, a->%s, a->__size, type, %s, NULL);\n#endif", ident(p->sym->name), soap_type(typ)); } else fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, a, a->%s, a->__size, type, %s, NULL);", ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\tif (id < 0)\n\t\treturn soap->error;"); fprintf(fout, "\n\tif ("); if (has_ns(typ) || is_untyped(typ) || is_binary(typ)) { if (table && table->prev) fprintf(fout, "soap_element_begin_out(soap, tag, id, type ? type : \"%s\")", xsi_type(typ)); else fprintf(fout, "soap_element_begin_out(soap, tag, id, type)"); } else if (has_offset(typ)) { if (d) fprintf(fout, "soap_array_begin_out(soap, tag, id, t, soap_putoffsets(soap, a->__offset, %d))", d); else fprintf(fout, "soap_array_begin_out(soap, tag, id, t, soap_putoffsets(soap, &a->__offset, 1))"); } else fprintf(fout, "soap_array_begin_out(soap, tag, id, t, NULL)"); fprintf(fout, ")\n\t\treturn soap->error;"); if (is_hexBinary(typ)) fprintf(fout, "\n\tif (soap_puthex(soap, a->__ptr, a->__size))\n\t\treturn soap->error;"); else if (is_binary(typ)) fprintf(fout, "\n\tif (soap_putbase64(soap, a->__ptr, a->__size))\n\t\treturn soap->error;"); else { fprintf(fout, "\n\tfor (i = 0; i < n; i++)\n\t{"); if (!has_ns(typ) && !is_untyped(typ)) { if (d) { fprintf(fout, "\n\t\tsoap->position = %d;", d); for (i = 0; i < d; i++) { fprintf(fout, "\n\t\tsoap->positions[%d] = i", i); for (j = i+1; j < d; j++) fprintf(fout, "/a->__size[%d]", j); fprintf(fout, "%%a->__size[%d];", i); } fprintf(fout, "\n\t\tif ("); if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "soap_outliteral(soap, \"%s\", (char*const*)&a->%s[i], NULL)", item, ident(p->sym->name)); else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "soap_outwliteral(soap, \"%s\", (wchar_t*const*)&a->%s[i], NULL)", item, ident(p->sym->name)); else if (is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "soap_out_%s(soap, \"%s\", -1, (char*const*)&a->%s[i], \"%s\")", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); else if (is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "soap_out_%s(soap, \"%s\", -1, (wchar_t*const*)&a->%s[i], \"%s\")", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); else if (((Tnode *)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "a->%s[i].soap_out(soap, \"%s\", -1, \"%s\")", ident(p->sym->name), item, xsi_type_u(((Tnode *)p->info.typ->ref))); else fprintf(fout, "soap_out_%s(soap, \"%s\", -1, &a->%s[i], \"%s\")", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); fprintf(fout, ")\n\t\t\treturn soap->error;"); } else { fprintf(fout, "\n\t\tsoap->position = 1;\n\t\tsoap->positions[0] = i;"); fprintf(fout, "\n\t\tif ("); if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "soap_outliteral(soap, \"%s\", &a->%s[i], NULL)", item, ident(p->sym->name)); else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "soap_outwliteral(soap, \"%s\", &a->%s[i], NULL)", item, ident(p->sym->name)); else if (is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "soap_out_%s(soap, \"%s\", -1, (char*const*)&a->%s[i], \"%s\")", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); else if (is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "soap_out_%s(soap, \"%s\", -1, (wchar_t*const*)&a->%s[i], \"%s\")", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); else if (((Tnode *)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "a->%s[i].soap_out(soap, \"%s\", -1, \"%s\")", ident(p->sym->name), item, xsi_type_u(((Tnode *)p->info.typ->ref))); else fprintf(fout, "soap_out_%s(soap, \"%s\", -1, &a->%s[i], \"%s\")", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); fprintf(fout, ")\n\t\t\treturn soap->error;"); } } else { fprintf(fout, "\n\t\tif ("); if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "soap_outliteral(soap, \"%s\", &a->%s[i], NULL)", item, ident(p->sym->name)); else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "soap_outwliteral(soap, \"%s\", &a->%s[i], NULL)", item, ident(p->sym->name)); else if (is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "soap_out_%s(soap, \"%s\", -1, (char*const*)&a->%s[i], \"%s\")", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); else if (is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "soap_out_%s(soap, \"%s\", -1, (wchar_t*const*)&a->%s[i], \"%s\")", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); else if (((Tnode *)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "a->%s[i].soap_out(soap, \"%s\", -1, \"%s\")", ident(p->sym->name), item, xsi_type_u(((Tnode *)p->info.typ->ref))); else fprintf(fout, "soap_out_%s(soap, \"%s\", -1, &a->%s[i], \"%s\")", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); fprintf(fout, ")\n\t\t\treturn soap->error;"); } } if (is_binary(typ)) fprintf(fout, "\n\treturn soap_element_end_out(soap, tag);\n}"); else if (!has_ns(typ) && !is_untyped(typ)) fprintf(fout, "\n\t}\n\tsoap->position = 0;\n\treturn soap_element_end_out(soap, tag);\n}"); else fprintf(fout, "\n\t}\n\treturn soap_element_end_out(soap, tag);\n}"); } void soap_get(Tnode *typ) { Tnode *temp; int cardinality; if (is_XML(typ)) return; if (typ->type == Ttemplate || typ->type == Tunion) return; if (is_typedef(typ) && (is_template(typ) || is_element(typ) || is_synonym(typ) || is_external(typ) || is_imported(typ)) && (!is_external(typ) || is_volatile(typ))) { fprintf(fhead, "\n\n#define soap_get_%s soap_get_%s\n", c_ident(typ), t_ident(typ)); fprintf(fhead, "\n\n#define soap_read_%s soap_read_%s\n", c_ident(typ), t_ident(typ)); fprintf(fhead, "\n\n#define soap_GET_%s soap_GET_%s\n", c_ident(typ), t_ident(typ)); fprintf(fhead, "\n\n#define soap_POST_recv_%s soap_POST_recv_%s\n", c_ident(typ), t_ident(typ)); return; } if (typ->type == Tarray) { /* ARRAY */ temp = get_item_type(typ, &cardinality); fprintf(fhead, "\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_get_%s(struct soap*, %s, const char*, const char*);", c_type(temp), c_ident(typ), c_type_id(typ, "")); fprintf(fout, "\n\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_get_%s(struct soap *soap, %s, const char *tag, const char *type)", c_type(temp), c_ident(typ), c_type_id(typ, "a")); fprintf(fout, "\n{\n\t%s;", c_type_id(temp, "(*p)")); fprintf(fout, "\n\tif ((p = soap_in_%s(soap, tag, a, type)))", c_ident(typ)); } else if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) { /* CLASS */ fprintf(fout, "\n\nvoid *%s::soap_get(struct soap *soap, const char *tag, const char *type)", c_type(typ)); fprintf(fout, "\n{\n\treturn soap_get_%s(soap, this, tag, type);\n}", c_ident(typ)); fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_get_%s(struct soap*, %s, const char*, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_get_%s(struct soap *soap, %s, const char *tag, const char *type)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*p")); fprintf(fout, "\n\tif ((p = soap_in_%s(soap, tag, p, type)))", c_ident(typ)); } else { fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_get_%s(struct soap*, %s, const char*, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_get_%s(struct soap *soap, %s, const char *tag, const char *type)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*p")); fprintf(fout, "\n\tif ((p = soap_in_%s(soap, tag, p, type)))", c_ident(typ)); } fprintf(fout, "\n\t\tif (soap_getindependent(soap))\n\t\t\treturn NULL;"); fprintf(fout, "\n\treturn p;\n}"); if ((typ->type != Tpointer || is_string(typ) || is_wstring(typ)) && typ->type != Tarray && typ->type != Treference && typ->type != Trvalueref && !is_template(typ) && !is_anyAttribute(typ)) { if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) { if (namespaceid && !is_external(typ)) fprintf(fhead, "\n\ninline int soap_read_%s(struct soap *soap, %s)\n{\n\tif (p)\n\t{\tp->soap_default(soap);\n\t\tif (soap_begin_recv(soap) || %s::soap_get_%s(soap, p, NULL, NULL) == NULL || soap_end_recv(soap))\n\t\t\treturn soap->error;\n\t}\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_id(typ, "*p"), namespaceid, c_ident(typ)); else if (!is_external(typ)) fprintf(fhead, "\n\ninline int soap_read_%s(struct soap *soap, %s)\n{\n\tif (p)\n\t{\tp->soap_default(soap);\n\t\tif (soap_begin_recv(soap) || ::soap_get_%s(soap, p, NULL, NULL) == NULL || soap_end_recv(soap))\n\t\t\treturn soap->error;\n\t}\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_id(typ, "*p"), c_ident(typ)); else fprintf(fhead, "\n\ninline int soap_read_%s(struct soap *soap, %s)\n{\n\tif (p)\n\t{\tp->soap_default(soap);\n\t\tif (soap_begin_recv(soap) || soap_get_%s(soap, p, NULL, NULL) == NULL || soap_end_recv(soap))\n\t\t\treturn soap->error;\n\t}\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_id(typ, "*p"), c_ident(typ)); } else if (is_primitive_or_string(typ)) { if (cflag) fprintf(fhead, "\n\n#ifndef soap_read_%s\n#define soap_read_%s(soap, data) ( soap_begin_recv(soap) || !soap_get_%s(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ)); else if (namespaceid && !is_external(typ)) fprintf(fhead, "\n\ninline int soap_read_%s(struct soap *soap, %s)\n{\n\tif (p)\n\t{\tif (soap_begin_recv(soap) || %s::soap_get_%s(soap, p, NULL, NULL) == NULL || soap_end_recv(soap))\n\t\t\treturn soap->error;\n\t}\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_id(typ, "*p"), namespaceid, c_ident(typ)); else if (!is_external(typ)) fprintf(fhead, "\n\ninline int soap_read_%s(struct soap *soap, %s)\n{\n\tif (p)\n\t{\tif (soap_begin_recv(soap) || ::soap_get_%s(soap, p, NULL, NULL) == NULL || soap_end_recv(soap))\n\t\t\treturn soap->error;\n\t}\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_id(typ, "*p"), c_ident(typ)); else fprintf(fhead, "\n\ninline int soap_read_%s(struct soap *soap, %s)\n{\n\tif (p)\n\t{\tif (soap_begin_recv(soap) || soap_get_%s(soap, p, NULL, NULL) == NULL || soap_end_recv(soap))\n\t\t\treturn soap->error;\n\t}\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_id(typ, "*p"), c_ident(typ)); } else { if (cflag) fprintf(fhead, "\n\n#ifndef soap_read_%s\n#define soap_read_%s(soap, data) ( ((data) ? (soap_default_%s(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !soap_get_%s(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), c_ident(typ)); else if (namespaceid && !is_external(typ)) fprintf(fhead, "\n\ninline int soap_read_%s(struct soap *soap, %s)\n{\n\tif (p)\n\t{\t%s::soap_default_%s(soap, p);\n\t\tif (soap_begin_recv(soap) || %s::soap_get_%s(soap, p, NULL, NULL) == NULL || soap_end_recv(soap))\n\t\t\treturn soap->error;\n\t}\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_id(typ, "*p"), namespaceid, c_ident(typ), namespaceid, c_ident(typ)); else if (!is_external(typ)) fprintf(fhead, "\n\ninline int soap_read_%s(struct soap *soap, %s)\n{\n\tif (p)\n\t{\t::soap_default_%s(soap, p);\n\t\tif (soap_begin_recv(soap) || ::soap_get_%s(soap, p, NULL, NULL) == NULL || soap_end_recv(soap))\n\t\t\treturn soap->error;\n\t}\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_id(typ, "*p"), c_ident(typ), c_ident(typ)); else fprintf(fhead, "\n\ninline int soap_read_%s(struct soap *soap, %s)\n{\n\tif (p)\n\t{\tsoap_default_%s(soap, p);\n\t\tif (soap_begin_recv(soap) || soap_get_%s(soap, p, NULL, NULL) == NULL || soap_end_recv(soap))\n\t\t\treturn soap->error;\n\t}\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_id(typ, "*p"), c_ident(typ), c_ident(typ)); } if (cflag) fprintf(fhead, "\n\n#ifndef soap_GET_%s\n#define soap_GET_%s(soap, URL, data) ( soap_GET(soap, URL, NULL) || soap_read_%s(soap, (data)), soap_closesock(soap) )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ)); else if (namespaceid && !is_external(typ)) fprintf(fhead, "\n\ninline int soap_GET_%s(struct soap *soap, const char *URL, %s)\n{\n\tif (soap_GET(soap, URL, NULL) || %s::soap_read_%s(soap, p))\n\t\treturn soap_closesock(soap);\n\treturn soap_closesock(soap);\n}", c_ident(typ), c_type_id(typ, "*p"), namespaceid, c_ident(typ)); else if (!is_external(typ)) fprintf(fhead, "\n\ninline int soap_GET_%s(struct soap *soap, const char *URL, %s)\n{\n\tif (soap_GET(soap, URL, NULL) || ::soap_read_%s(soap, p))\n\t\treturn soap_closesock(soap);\n\treturn soap_closesock(soap);\n}", c_ident(typ), c_type_id(typ, "*p"), c_ident(typ)); else fprintf(fhead, "\n\ninline int soap_GET_%s(struct soap *soap, const char *URL, %s)\n{\n\tif (soap_GET(soap, URL, NULL) || soap_read_%s(soap, p))\n\t\treturn soap_closesock(soap);\n\treturn soap_closesock(soap);\n}", c_ident(typ), c_type_id(typ, "*p"), c_ident(typ)); if (cflag) fprintf(fhead, "\n\n#ifndef soap_POST_recv_%s\n#define soap_POST_recv_%s(soap, data) ( soap_read_%s(soap, (data)) || soap_closesock(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ)); else if (namespaceid && !is_external(typ)) fprintf(fhead, "\n\ninline int soap_POST_recv_%s(struct soap *soap, %s)\n{\n\tif (%s::soap_read_%s(soap, p))\n\t\treturn soap_closesock(soap);\n\treturn soap_closesock(soap);\n}", c_ident(typ), c_type_id(typ, "*p"), namespaceid, c_ident(typ)); else if (!is_external(typ)) fprintf(fhead, "\n\ninline int soap_POST_recv_%s(struct soap *soap, %s)\n{\n\tif (::soap_read_%s(soap, p))\n\t\treturn soap_closesock(soap);\n\treturn soap_closesock(soap);\n}", c_ident(typ), c_type_id(typ, "*p"), c_ident(typ)); else fprintf(fhead, "\n\ninline int soap_POST_recv_%s(struct soap *soap, %s)\n{\n\tif (soap_read_%s(soap, p))\n\t\treturn soap_closesock(soap);\n\treturn soap_closesock(soap);\n}", c_ident(typ), c_type_id(typ, "*p"), c_ident(typ)); } fflush(fout); } void soap_in(Tnode *typ) { Entry *p = NULL; Table *table, *t; int strict, nonempty, flag, cardinality, i, j; Tnode *n, *temp; const char *nse = ns_qualifiedElement(typ); const char *nsa = ns_qualifiedAttribute(typ); int der = 0; if (is_XML(typ)) return; if (is_dynamic_array(typ)) { soap_in_Darray(typ); return; } if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap*, const char*, %s);", c_ident(typ), c_type_id(typ, "*")); } else if (is_qname(typ)) fprintf(fhead, "\n\n#define soap_s2%s(soap, s, a) soap_s2QName((soap), (s), (char**)(a), %ld, %ld, %s)", c_ident(typ), minlen(typ), maxlen(typ), pattern(typ)); else if (is_string(typ)) fprintf(fhead, "\n\n#define soap_s2%s(soap, s, a) soap_s2char((soap), (s), (char**)(a), %d, %ld, %ld, %s)", c_ident(typ), property(typ), minlen(typ), maxlen(typ), pattern(typ)); else if (is_wstring(typ)) fprintf(fhead, "\n\n#define soap_s2%s(soap, s, a) soap_s2wchar((soap), (s), (wchar_t**)(a), %d, %ld, %ld, %s)", c_ident(typ), property(typ), minlen(typ), maxlen(typ), pattern(typ)); else if (is_stdqname(typ)) fprintf(fhead, "\n\n#define soap_s2%s(soap, s, a) soap_s2stdQName((soap), (s), (a), %ld, %ld, %s)", c_ident(typ), minlen(typ), maxlen(typ), pattern(typ)); else if (is_stdstring(typ)) fprintf(fhead, "\n\n#define soap_s2%s(soap, s, a) soap_s2stdchar((soap), (s), (a), %d, %ld, %ld, %s)", c_ident(typ), property(typ), minlen(typ), maxlen(typ), pattern(typ)); else if (is_stdwstring(typ)) fprintf(fhead, "\n\n#define soap_s2%s(soap, s, a) soap_s2stdwchar((soap), (s), (a), %d, %ld, %ld, %s)", c_ident(typ), property(typ), minlen(typ), maxlen(typ), pattern(typ)); else if (is_typedef(typ) && typ->type <= Tstruct && (!is_external(typ) || is_volatile(typ)) && !is_qname(typ) && !is_stdqname(typ)) { if (!is_synonym(typ) && (typ->hasmin || typ->hasmax || (typ->pattern && typ->pattern[0] != '%'))) { fprintf(fhead, "\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap*, const char*, %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap *soap, const char *s, %s)\n{", c_ident(typ), c_type_id(typ, "*a")); if (is_string(typ) || is_wstring(typ) || is_stdstr(typ)) fprintf(fout, "\n\tint err = soap_s2%s(soap, s, a, %ld, %ld, %s);\n\tif (!err)\n\t{", t_ident(typ), minlen(typ), maxlen(typ), pattern(typ)); else { fprintf(fout, "\n\tint err = soap_s2%s(soap, s, a);\n\tif (!err)\n\t{", t_ident(typ)); if (typ->hasmin) { if (!cflag && (typ->type == Tclass || typ->type == Tstruct)) { long min = minlen(typ); if (min > 0) fprintf(fout, "\n\t\tif (a->size() < %ld)\n\t\t\treturn soap->error = SOAP_LENGTH;", min); } else if ((typ->type >= Tfloat && typ->type <= Tldouble) || is_external(typ)) fprintf(fout, "\n\t\tif (*a %s %.17lG)\n\t\t\treturn soap->error = SOAP_LENGTH;", typ->incmin ? "<" : "<=", typ->rmin); else if (typ->imin > 0 || typ->type < Tuchar || typ->type > Tullong) fprintf(fout, "\n\t\tif (*a %s " SOAP_LONG_FORMAT ")\n\t\t\treturn soap->error = SOAP_LENGTH;", typ->incmin ? "<" : "<=", typ->imin); } if (typ->hasmax) { if (!cflag && (typ->type == Tclass || typ->type == Tstruct)) { long max = maxlen(typ); if (max >= 0) fprintf(fout, "\n\t\tif (a->size() > %ld)\n\t\t\treturn soap->error = SOAP_LENGTH;", max); } else if ((typ->type >= Tfloat && typ->type <= Tldouble) || is_external(typ)) fprintf(fout, "\n\t\tif (*a %s %.17lG)\n\t\t\treturn soap->error = SOAP_LENGTH;", typ->incmax ? ">" : ">=", typ->rmax); else if (typ->imax >= 0 || typ->type < Tuchar || typ->type > Tullong) fprintf(fout, "\n\t\tif (*a %s " SOAP_LONG_FORMAT ")\n\t\t\treturn soap->error = SOAP_LENGTH;", typ->incmax ? ">" : ">=", typ->imax); } } fprintf(fout, "\n\t}\n\treturn err;\n}"); } else fprintf(fhead, "\n\n#define soap_s2%s soap_s2%s\n", c_ident(typ), t_ident(typ)); } if (is_typedef(typ) && (is_element(typ) || is_synonym(typ)) && (!is_external(typ) || is_volatile(typ))) { fprintf(fhead, "\n\n#define soap_in_%s soap_in_%s\n", c_ident(typ), t_ident(typ)); return; } if ((is_primitive_or_string(typ) && typ->type != Tenum && typ->type != Tenumsc) || (is_external(typ) && is_volatile(typ))) { if (is_stdstring(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 std::string * SOAP_FMAC2 soap_in_%s(struct soap*, const char*, std::string*, const char*);", c_ident(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 std::string * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::string*, const char*);", c_ident(typ)); if (is_stdXML(typ)) fprintf(fout, "\n\nSOAP_FMAC3 std::string * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, std::string *s, const char *type)\n{\n\tchar *t;\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_inliteral(soap, tag, &t))\n\t{\tif (!s)\n\t\t\ts = soap_new_std__string(soap, -1);\n\t\ts->assign(t);\n\t\treturn s;\n\t}\n\treturn NULL;\n}", c_ident(typ)); else { fprintf(fout, "\n\nSOAP_FMAC3 std::string * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, std::string *s, const char *type)\n{\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;\n\tif (!s)\n\t\ts = soap_new_std__string(soap, -1);\n\tif (soap->null)\n\t\tif (s)\n\t\t\ts->erase();", c_ident(typ)); fprintf(fout, "\n\tif (soap->body && *soap->href != '#')\n\t{\tchar *t;\n\t\ts = (std::string*)soap_id_enter(soap, soap->id, s, %s, sizeof(std::string), soap->type, soap->arrayType, %s_instantiate, %s_fbase);\n\t\tif (s)\n\t\t{\tif (!(t = soap_string_in(soap, %d, %ld, %ld, %s)))\n\t\t\t\treturn NULL;\n\t\t\ts->assign(t);\n\t\t}\n\t}\n\telse\n\t\ts = (std::string*)soap_id_forward(soap, soap->href, soap_id_enter(soap, soap->id, s, %s, sizeof(std::string), soap->type, soap->arrayType, %s_instantiate, %s_fbase), 0, %s, %s, sizeof(std::string), 0, %s_finsert, NULL);\n\tif (soap->body && soap_element_end_in(soap, tag))\n\t\treturn NULL;\n\treturn s;\n}", soap_type(typ), prefix, prefix, property(typ), minlen(typ), maxlen(typ), pattern(typ), soap_type(typ), prefix, prefix, soap_type(typ), soap_type(typ), prefix); } return; } if (is_stdwstring(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC3 std::wstring * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::wstring*, const char*);", c_ident(typ)); return; } if (is_stdXML(typ)) fprintf(fout, "\n\nSOAP_FMAC3 std::wstring * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, std::wstring *s, const char *type)\n{\n\twchar_t *t;\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_inwliteral(soap, tag, &t))\n\t{\tif (!s)\n\t\t\ts = soap_new_std__wstring(soap, -1);\n\t\ts->assign(t);\n\t\treturn s;\n\t}\n\treturn NULL;\n}", c_ident(typ)); else { fprintf(fhead, "\nSOAP_FMAC3 std::wstring * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::wstring*, const char*);", c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 std::wstring * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, std::wstring *s, const char *type)\n{\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;\n\tif (!s)\n\t\ts = soap_new_std__wstring(soap, -1);\n\tif (soap->null)\n\t\tif (s)\n\t\t\ts->erase();", c_ident(typ)); fprintf(fout, "\n\tif (soap->body && *soap->href != '#')\n\t{\twchar_t *t;\n\t\ts = (std::wstring*)soap_id_enter(soap, soap->id, s, %s, sizeof(std::wstring), soap->type, soap->arrayType, %s_instantiate, %s_fbase);\n\t\tif (s)\n\t\t{\tif (!(t = soap_wstring_in(soap, %d, %ld, %ld, %s)))\n\t\t\t\treturn NULL;\n\t\t\ts->assign(t);\n\t\t}\n\t}\n\telse\n\t\ts = (std::wstring*)soap_id_forward(soap, soap->href, soap_id_enter(soap, soap->id, s, %s, sizeof(std::wstring), soap->type, soap->arrayType, %s_instantiate, %s_fbase), 0, %s, %s, sizeof(std::wstring), 0, %s_finsert, NULL);\n\tif (soap->body && soap_element_end_in(soap, tag))\n\t\treturn NULL;\n\treturn s;\n}", soap_type(typ), prefix, prefix, property(typ), minlen(typ), maxlen(typ), pattern(typ), soap_type(typ), prefix, prefix, soap_type(typ), soap_type(typ), prefix); } return; } if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s * SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type(typ), c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type(typ), c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type(typ), c_ident(typ), c_type_id(typ, "*a")); if (is_wstring(typ)) fprintf(fout, "\n\ta = soap_inwstring(soap, tag, a, type, %s, %d, %ld, %ld, %s);", soap_type(typ), property(typ), minlen(typ), maxlen(typ), pattern(typ)); else if (is_string(typ)) fprintf(fout, "\n\ta = soap_instring(soap, tag, a, type, %s, %d, %ld, %ld, %s);", soap_type(typ), property(typ), minlen(typ), maxlen(typ), pattern(typ)); else { if (typ->type == Tllong || typ->type == Tullong) fprintf(fout, "\n\ta = soap_in%s(soap, tag, a, type, %s);", c_type(typ), soap_type(typ)); else if (is_primitive_or_string(typ)) fprintf(fout, "\n\ta = soap_in%s(soap, tag, a, type, %s);", the_type(typ), soap_type(typ)); else fprintf(fout, "\n\ta = soap_in_%s(soap, tag, a, type);", t_ident(typ)); if (typ->hasmin) { if (!cflag && (typ->type == Tclass || typ->type == Tstruct)) { long min = minlen(typ); if (min > 0) fprintf(fout, "\n\tif (a && a->size() < %ld)\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", min); } else if ((typ->type >= Tfloat && typ->type <= Tldouble) || is_external(typ)) fprintf(fout, "\n\tif (a && *a %s %.17lG)\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", typ->incmin ? "<" : "<=", typ->rmin); else if (typ->imin > 0 || typ->type < Tuchar || typ->type > Tullong) fprintf(fout, "\n\tif (a && *a %s " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", typ->incmin ? "<" : "<=", typ->imin); } if (typ->hasmax) { if (!cflag && (typ->type == Tclass || typ->type == Tstruct)) { long max = maxlen(typ); if (max >= 0) fprintf(fout, "\n\tif (a && a->size() > %ld)\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", max); } else if ((typ->type >= Tfloat && typ->type <= Tldouble) || is_external(typ)) fprintf(fout, "\n\tif (a && *a %s %.17lG)\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", typ->incmax ? ">" : ">=", typ->rmax); else if (typ->imax >= 0 || typ->type < Tuchar || typ->type > Tullong) fprintf(fout, "\n\tif (a && *a %s " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", typ->incmax ? ">" : ">=", typ->imax); } } fprintf(fout, "\n\treturn a;\n}"); fflush(fout); return; } if (is_fixedstring(typ)) { int n = typ->width / ((Tnode*)typ->ref)->width; fprintf(fhead, "\nSOAP_FMAC3 char* SOAP_FMAC4 soap_in_%s(struct soap*, const char*, char[], const char*);", c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 char* SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, char a[], const char *type)\n{\tchar *p = NULL;\n\tif (!soap_instring(soap, tag, &p, type, %s, 1, 0, %d, %s))\n\t\treturn NULL;\n\tif (!p)\n\t{\tif (*soap->href == '#')\n\t\t\tsoap_id_nullify(soap, soap->href);\n\t\telse\n\t\t\tsoap->error = SOAP_NULL;\n\t\treturn NULL;\n\t}\n\tsoap_strncpy(a, %d, p, %d);\n\treturn a;\n}", c_ident(typ), soap_type(typ), n - 1, pattern(typ), n, n - 1); return; } switch(typ->type) { case Tstruct: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*a")); table = (Table*)typ->ref; if (!table) { fprintf(fout, "\n\t(void)soap; (void)tag; (void)a; (void)type; /* appease -Wall -Werror */"); fprintf(fout, "\n\tif (!a)\n\t\tsoap->error = SOAP_TAG_MISMATCH;\n\treturn a;\n}"); } else if (is_primclass(typ)) { for (p = table->list; p; p = p->next) { if (is_pointer_to_derived(p)) { der = 1; break; } } if (der) fprintf(fout, "\n\tint err = soap_element_begin_in(soap, tag, 1, type);\n\tif (err && err != SOAP_TYPE)\n\t\treturn NULL;"); else fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;"); fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */"); if (!cflag) fprintf(fout, "\n\tif (!(a = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType, %s_instantiate, %s_fbase)))\n\t\treturn NULL;", c_type_id(typ, "*"), soap_type(typ), c_type(typ), prefix, prefix); else fprintf(fout, "\n\tif (!(a = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), NULL, NULL, NULL, NULL)))\n\t\treturn NULL;", c_type_id(typ, "*"), soap_type(typ), c_type(typ)); fprintf(fout, "\n\tsoap_revert(soap);\n\t*soap->id = '\\0';"); fprintf(fout, "\n\tsoap_default_%s(soap, a);", c_ident(typ)); if (der) { fprintf(fout, "\n\tif (err == SOAP_TYPE)\n\t{"); for (p = table->list; p; p = p->next) { if (is_pointer_to_derived(p)) { fprintf(fout, "\n\t\tif (("); gen_match_derived(fout, p->info.typ->ref); fprintf(fout, ") && (a->%s = soap_in_%s(soap, tag, NULL, NULL)) != NULL)\n\t\t\treturn a;", ident(p->sym->name), c_ident(p->info.typ->ref)); } } fprintf(fout, "\n\t\treturn NULL;\n\t}"); } for (t = (Table*)typ->ref; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, "a", ident(p->sym->name), ns_add(p, nsa)); fflush(fout); for (table = (Table*)typ->ref; table; table = table->prev) { p = table->list; while (p && !is_item(p)) p = p->next; if (p) break; } if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tif (!soap_inliteral(soap, tag, (char**)&a->%s))", ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tif (!soap_inwliteral(soap, tag, (wchar_t**)&a->%s))", ident(p->sym->name)); else if (is_string(p->info.typ)) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, (char**)&a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, (wchar_t**)&a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif (!a->%s.soap_in(soap, tag, \"%s\"))", ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, &a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); fprintf(fout, "\n\t\treturn NULL;"); fixed_check(fout, p, NULL, "\t"); if (has_getter(typ)) fprintf(fout, "\n\tif (a->get(soap))\n\t\treturn NULL;"); fprintf(fout, "\n\treturn a;\n}"); } else { table = (Table*)typ->ref; if (!is_discriminant(typ)) { for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (!(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (is_anytype(p) || is_choice(p)) { p = p->next; fprintf(fout, "\n\tsize_t soap_flag_%s = " SOAP_LONG_FORMAT ";", ident(p->sym->name), p->info.maxOccurs); } else if (is_repetition(p)) { fprintf(fout, "\n\tstruct soap_blist *soap_blist_%s = NULL;", ident(p->next->sym->name)); p = p->next; } else if (!is_transient(p->info.typ) && !is_container(p->info.typ)) fprintf(fout, "\n\tsize_t soap_flag_%s = " SOAP_LONG_FORMAT ";", ident(p->sym->name), p->info.maxOccurs); } } } } if (!is_invisible(typ->id->name)) { for (p = table->list; p; p = p->next) { if (is_pointer_to_derived(p)) { der = 1; break; } } if (der) fprintf(fout, "\n\tint err = soap_element_begin_in(soap, tag, 0, type);\n\tif (err && err != SOAP_TYPE)\n\t\treturn NULL;"); else fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 0, NULL))\n\t\treturn NULL;"); fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */"); } else if (!is_discriminant(typ)) { if (table && (table->prev || table->list)) fprintf(fout, "\n\tshort soap_flag;"); fprintf(fout, "\n\t(void)tag; (void)type; /* appease -Wall -Werror */"); } else { fprintf(fout, "\n\t(void)tag; (void)type; /* appease -Wall -Werror */"); } if (has_class(typ)) { if (is_invisible(typ->id->name)) fprintf(fout, "\n\ta = (%s*)soap_id_enter(soap, \"\", a, %s, sizeof(%s), soap->type, soap->arrayType, %s_instantiate, %s_fbase);", c_type(typ), soap_type(typ), c_type(typ), prefix, prefix); else fprintf(fout, "\n\ta = (%s*)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType, %s_instantiate, %s_fbase);", c_type(typ), soap_type(typ), c_type(typ), prefix, prefix); } else if (is_invisible(typ->id->name)) fprintf(fout, "\n\ta = (%s*)soap_id_enter(soap, \"\", a, %s, sizeof(%s), NULL, NULL, NULL, NULL);", c_type(typ), soap_type(typ), c_type(typ)); else fprintf(fout, "\n\ta = (%s*)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), NULL, NULL, NULL, NULL);", c_type(typ), soap_type(typ), c_type(typ)); fprintf(fout, "\n\tif (!a)\n\t\treturn NULL;"); fprintf(fout, "\n\tsoap_default_%s(soap, a);", c_ident(typ)); if (der) { fprintf(fout, "\n\tif (err == SOAP_TYPE)\n\t{"); for (p = table->list; p; p = p->next) { if (is_pointer_to_derived(p)) { fprintf(fout, "\n\t\tif (("); gen_match_derived(fout, p->info.typ->ref); fprintf(fout, ") && (a->%s = soap_in_%s(soap, tag, NULL, \"%s\")) != NULL)\n\t\t\treturn a;", ident(p->sym->name), c_ident(p->info.typ->ref), xsi_type(p->info.typ->ref)); } } fprintf(fout, "\n\t\treturn NULL;\n\t}"); } for (t = table; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, "a", ident(p->sym->name), ns_add(p, nsa)); if (!is_invisible(typ->id->name)) { if (!is_discriminant(typ)) { fprintf(fout, "\n\tif (soap->body && *soap->href != '#')\n\t{"); fprintf(fout, "\n\t\tfor (;;)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;"); } else fprintf(fout, "\n\tif (!tag || *tag == '-' || (soap->body && *soap->href != '#'))\n\t{"); } else if (!is_discriminant(typ)) { if (table && (table->prev || table->list)) fprintf(fout, "\n\t\tfor (soap_flag = 0;; soap_flag = 1)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;"); } flag = 0; for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { if (is_unmatched(p->next->sym) || is_invisible(p->next->sym->name)) { p = p->next; continue; } flag = 1; fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && "); fprintf(fout, "!soap_element_begin_in(soap, %s, 1, NULL))", field(p->next, nse)); fprintf(fout, "\n\t\t\t{\tif (a->%s == NULL)\n\t\t\t\t{\tif (soap_blist_%s == NULL)\n\t\t\t\t\t\tsoap_blist_%s = soap_alloc_block(soap);", ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass || ((Tnode*)p->next->info.typ->ref)->type == Ttemplate || has_class((Tnode*)p->next->info.typ->ref) || (!cflag && ((Tnode*)p->next->info.typ->ref)->type == Tstruct)) fprintf(fout, "\n\t\t\t\t\ta->%s = soap_block<%s>::push(soap, soap_blist_%s);\n\t\t\t\t\tif (a->%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name), ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t\t\t\t\ta->%s = (const %s)soap_push_block_max(soap, soap_blist_%s, sizeof(%s));\n\t\t\t\t\tif (a->%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), c_type((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\ta->%s = (%s)soap_push_block_max(soap, soap_blist_%s, sizeof(%s));\n\t\t\t\t\tif (a->%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), c_type((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\ta->%s->soap_default(soap);", ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\tsoap_default_%s(soap, a->%s);", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\t*a->%s = NULL;", ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t}"); fprintf(fout, "\n\t\t\t\tsoap_revert(soap);"); if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, %s, (char**)a->%s))", field(p->next, nse), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, %s, (wchar_t**)a->%s))", field(p->next, nse), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (char**)a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (wchar_t**)a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); fprintf(fout, "\n\t\t\t\t{\ta->%s++;\n\t\t\t\t\ta->%s = NULL;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}", ident(p->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_anytype(p)) { flag = 1; fprintf(fout, "\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->next->sym->name)); if (is_self(p->next)) fprintf(fout, "\n\t\t\t{\tif ((a->%s = soap_getelement(soap, tag, &a->%s)))", ident(p->next->sym->name), ident(p->sym->name)); else if (is_invisible(p->next->sym->name)) fprintf(fout, "\n\t\t\t{\tif ((a->%s = soap_getelement(soap, NULL, &a->%s)))", ident(p->next->sym->name), ident(p->sym->name)); else fprintf(fout, "\n\t\t\t{\tif ((a->%s = soap_getelement(soap, %s, &a->%s)))", ident(p->next->sym->name), field(p->next, nse), ident(p->sym->name)); fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s = 0;", ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}\n\t\t\t}"); p = p->next; } else if (is_discriminant(typ) && p->next) { flag = 1; fprintf(fout, "\n\t\tif (!soap_in_%s(soap, &a->%s, &a->%s))", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\t\treturn NULL;"); break; } else if (is_choice(p)) { flag = 1; fprintf(fout, "\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t{\tif (soap_in_%s(soap, &a->%s, &a->%s))", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s = 0;", ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}\n\t\t\t}"); p = p->next; } else if (is_transient(p->info.typ)) { if (!is_pointer_to_derived(p)) fprintf(fout, "\n\t\t\t/* transient %s skipped */", ident(p->sym->name)); } else { flag = 1; if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap_flag_%s && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))", ident(p->sym->name)); else if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); else fprintf(fout, "\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->sym->name)); fprintf(fout, "\n\t\t\t{\t"); } if (is_unmatched(p->sym)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "if (soap_inliteral(soap, NULL, (char**)&a->%s))", ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "if (soap_inwliteral(soap, NULL, (wchar_t**)&a->%s))", ident(p->sym->name)); } else if (is_string(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, NULL, (char**)&a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(p->info.typ)); } else if (is_wstring(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, NULL, (wchar_t**)&a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tarray) { fprintf(fout, "if (soap_in_%s(soap, NULL, a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "if (a->%s.soap_in(soap, NULL, \"%s\"))", ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, NULL, &a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(p->info.typ)); } } else if (!is_invisible(p->sym->name)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "if (soap_inliteral(soap, %s, (char**)&a->%s))", field(p, nse), ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "if (soap_inwliteral(soap, %s, (wchar_t**)&a->%s))", field(p, nse), ident(p->sym->name)); } else if (is_string(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, %s, (char**)&a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); } else if (is_wstring(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, %s, (wchar_t**)&a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tarray) { fprintf(fout, "if (soap_in_%s(soap, %s, a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "if (a->%s.soap_in(soap, %s, \"%s\"))", ident(p->sym->name), field(p, nse), xsi_type(p->info.typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, %s, &a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); } } if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\t\t\tcontinue;"); else { fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s--;", ident(p->sym->name)); fixed_check(fout, p, NULL, "\t\t\t\t\t"); if (p->info.hasval && !p->info.fixed && (is_string(p->info.typ) || is_wstring(p->info.typ))) { fprintf(fout, "\n\t\t\t\t\tif (*soap->href != '#' && a->%s && ", ident(p->sym->name)); fprintf(fout, "!*a->%s)", ident(p->sym->name)); fprintf(fout, "\n\t\t\t\t\t\ta->%s%s;", ident(p->sym->name), c_init(p)); } else if (p->info.ptrval && !p->info.fixed && (is_string(p->info.typ->ref) || is_wstring(p->info.typ->ref) || is_stdstring(p->info.typ->ref) || is_stdwstring(p->info.typ->ref))) { Tnode *ptr = (Tnode*)p->info.typ->ref; if (is_smart(p->info.typ)) fprintf(fout, "\n\t\t\t\t\tif (*soap->href != '#' && a->%s.get() && ", ident(p->sym->name)); else fprintf(fout, "\n\t\t\t\t\tif (*soap->href != '#' && a->%s && ", ident(p->sym->name)); if (is_string(ptr) || is_wstring(ptr)) fprintf(fout, "*a->%s && !**a->%s)", ident(p->sym->name), ident(p->sym->name)); else fprintf(fout, "a->%s->empty())", ident(p->sym->name)); fprintf(fout, "\n\t\t\t\t\t\t*a->%s%s;", ident(p->sym->name), c_init(p)); } fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}"); if (p->info.ptrval && !p->info.fixed && !(is_string(p->info.typ->ref) || is_wstring(p->info.typ->ref) || is_stdstring(p->info.typ->ref) || is_stdwstring(p->info.typ->ref))) { Tnode *ptr = (Tnode*)p->info.typ->ref; fprintf(fout, "\n\t\t\t\tif (soap->error == SOAP_EMPTY)\n\t\t\t\t{\t"); if (is_smart(p->info.typ)) { if (is_smart_shared(p->info.typ)) fprintf(fout, "a->%s = %s<%s>();", ident(p->sym->name), make_shared(p->info.typ), c_type(ptr)); else if (ptr->type == Tclass && !is_external(ptr) && !is_volatile(ptr) && !is_typedef(ptr)) fprintf(fout, "a->%s = %s(%s_instantiate_%s(soap, SOAP_NO_LINK_TO_DELETE, soap->type, soap->arrayType, NULL));", ident(p->sym->name), c_type(p->info.typ), fprefix, c_ident(ptr)); else fprintf(fout, "a->%s = %s(SOAP_NEW(soap, %s));", ident(p->sym->name), c_type(p->info.typ), c_type(ptr)); } else if (ptr->type == Tclass) { fprintf(fout, "if (!(a->%s = (%s)%s_instantiate_%s(soap, -1, soap->type, soap->arrayType, NULL)))\n\t\t\t\t\t\treturn NULL;", ident(p->sym->name), c_type(p->info.typ), fprefix, c_ident(ptr)); } else { fprintf(fout, "if (!(a->%s = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t\t\t\t\treturn NULL;", ident(p->sym->name), c_type(p->info.typ), c_type(ptr)); } fprintf(fout, "\n\t\t\t\t\t*a->%s%s;", ident(p->sym->name), c_init(p)); fprintf(fout, "\n\t\t\t\t\tsoap->error = SOAP_OK;\n\t\t\t\t\tsoap_flag_%s--;\n\t\t\t\t\tcontinue;\n\t\t\t\t}", ident(p->sym->name)); } } fprintf(fout, "\n\t\t\t}"); } } fflush(fout); } } if (!is_discriminant(typ)) { for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (is_repetition(p) && (is_unmatched(p->next->sym) || (is_invisible(p->next->sym->name)))) { flag = 1; fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && "); if (is_unmatched(p->next->sym)) fprintf(fout, "!soap_element_begin_in(soap, NULL, 1, NULL))"); else if (is_invisible(p->next->sym->name)) fprintf(fout, "!soap_peek_element(soap))"); fprintf(fout, "\n\t\t\t{\tif (a->%s == NULL)\n\t\t\t\t{\tif (soap_blist_%s == NULL)\n\t\t\t\t\t\tsoap_blist_%s = soap_alloc_block(soap);", ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass || ((Tnode*)p->next->info.typ->ref)->type == Ttemplate || has_class((Tnode*)p->next->info.typ->ref) || (!cflag && ((Tnode*)p->next->info.typ->ref)->type == Tstruct)) fprintf(fout, "\n\t\t\t\t\ta->%s = soap_block<%s>::push(soap, soap_blist_%s);\n\t\t\t\t\tif (a->%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name), ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t\t\t\t\ta->%s = (const %s)soap_push_block_max(soap, soap_blist_%s, sizeof(%s));\n\t\t\t\t\tif (a->%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), c_type((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\ta->%s = (%s)soap_push_block_max(soap, soap_blist_%s, sizeof(%s));\n\t\t\t\t\tif (a->%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), c_type((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\ta->%s->soap_default(soap);", ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\tsoap_default_%s(soap, a->%s);", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\t*a->%s = NULL;", ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t}"); if (!is_invisible(p->next->sym->name)) fprintf(fout, "\n\t\t\t\tsoap_revert(soap);"); if (is_unmatched(p->next->sym)) { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, NULL, (char**)a->%s))", ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, NULL, (wchar_t**)a->%s))", ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, (char**)a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, (wchar_t**)a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); } else { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, %s, (char**)a->%s))", field(p->next, nse), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, %s, (wchar_t**)a->%s))", field(p->next, nse), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (char**)a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (wchar_t**)a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); } fprintf(fout, "\n\t\t\t\t{\ta->%s++;\n\t\t\t\t\ta->%s = NULL;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}", ident(p->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_repetition(p) || is_anytype(p) || is_choice(p)) { p = p->next; continue; } else if (is_invisible(p->sym->name) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && !(p->info.sto & Sattribute)) { flag = 1; if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap_flag_%s && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))", ident(p->sym->name)); else if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); else fprintf(fout, "\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->sym->name)); fprintf(fout, "\n\t\t\t{\t"); if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "if (soap_inliteral(soap, %s, (char**)&a->%s))", field(p, nse), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "if (soap_inwliteral(soap, %s, (wchar_t**)&a->%s))", field(p, nse), ident(p->sym->name)); else if (is_string(p->info.typ)) fprintf(fout, "if (soap_in_%s(soap, %s, (char**)&a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "if (soap_in_%s(soap, %s, (wchar_t**)&a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); else if (p->info.typ->type == Tarray) fprintf(fout, "if (soap_in_%s(soap, %s, a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "if (a->%s.soap_in(soap, %s, \"%s\"))", ident(p->sym->name), field(p, nse), xsi_type(p->info.typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "if (soap_in_%s(soap, %s, &a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\t\t\tcontinue;"); else { fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s--;", ident(p->sym->name)); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}"); } fprintf(fout, "\n\t\t\t}"); } } } for (t = table; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->info.sto & Sreturn) if (nse || has_ns_eq(NULL, p->sym->name)) fprintf(fout, "\n\t\t\tsoap_check_result(soap, \"%s\");", ns_add(p, nse)); if (!flag && is_invisible(typ->id->name)) fprintf(fout, "\n\tsoap->error = SOAP_TAG_MISMATCH;\n\ta = NULL;"); if (!is_invisible(typ->id->name) || (table && (table->prev || table->list))) { if (!is_invisible(typ->id->name) || is_discriminant(typ)) fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)\n\t\t\t\tsoap->error = soap_ignore_element(soap);"); else fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && soap_flag)\n\t\t\t{\tsoap->error = SOAP_OK;\n\t\t\t\tbreak;\n\t\t\t}"); if (!is_invisible(typ->id->name)) fprintf(fout, "\n\t\t\tif (soap->error == SOAP_NO_TAG)"); else fprintf(fout, "\n\t\t\tif (soap_flag && soap->error == SOAP_NO_TAG)"); fprintf(fout, "\n\t\t\t\tbreak;"); fprintf(fout, "\n\t\t\tif (soap->error)\n\t\t\t\treturn NULL;"); fprintf(fout, "\n\t\t}"); } } if (table && !is_discriminant(typ)) { for (p = table->list; p; p = p->next) { if (is_repetition(p)) { if (((Tnode*)p->next->info.typ->ref)->type == Tclass || ((Tnode*)p->next->info.typ->ref)->type == Ttemplate || has_class((Tnode*)p->next->info.typ->ref) || (!cflag && ((Tnode*)p->next->info.typ->ref)->type == Tstruct)) { fprintf(fout, "\n\t\tif (a->%s)\n\t\t\tsoap_block<%s>::pop(soap, soap_blist_%s);", ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name)); fprintf(fout, "\n\t\tif (a->%s)\n\t\t{\ta->%s = soap_new_%s(soap, a->%s);\n\t\t\tif (!a->%s)\n\t\t\t\treturn NULL;\n\t\t\tsoap_block<%s>::save(soap, soap_blist_%s, a->%s);\n\t\t}\n\t\telse\n\t\t{\ta->%s = NULL;\n\t\t\tif (soap_blist_%s)\n\t\t\t\tsoap_block<%s>::end(soap, soap_blist_%s);\n\t\t}", ident(p->sym->name), ident(p->next->sym->name), c_ident(p->next->info.typ->ref), ident(p->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name)); } else { fprintf(fout, "\n\t\tif (a->%s)\n\t\t\tsoap_pop_block(soap, soap_blist_%s);", ident(p->next->sym->name), ident(p->next->sym->name)); if ((((Tnode*)p->next->info.typ->ref)->type == Tpointer && (p->next->info.sto & Sconstptr))) fprintf(fout, "\n\t\tif (a->%s)\n\t\t{\ta->%s = (const %s)soap_save_block(soap, soap_blist_%s, NULL, 1);\n\t\t}\n\t\telse\n\t\t{\ta->%s = NULL;\n\t\t\tif (soap_blist_%s)\n\t\t\t\tsoap_end_block(soap, soap_blist_%s);\n\t\t}", ident(p->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name)); else fprintf(fout, "\n\t\tif (a->%s)\n\t\t{\ta->%s = (%s)soap_save_block(soap, soap_blist_%s, NULL, 1);\n\t\t}\n\t\telse\n\t\t{\ta->%s = NULL;\n\t\t\tif (soap_blist_%s)\n\t\t\t\tsoap_end_block(soap, soap_blist_%s);\n\t\t}", ident(p->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name)); } p = p->next; } } } if (!is_invisible(typ->id->name)) { if (is_discriminant(typ)) fprintf(fout, "\n\t\tif (tag && *tag != '-')\n\t\t{\tsoap->error = soap_ignore_element(soap);\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH || soap_element_end_in(soap, tag))\n\t\t\t\treturn NULL;\n\t\t}"); else fprintf(fout, "\n\t\tif (soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); } strict = 0; nonempty = 0; if (table && !is_discriminant(typ)) { for (p = table->list; p; p = p->next) { if (p->info.minOccurs > 0 && p->info.maxOccurs >= 0 && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_transient(p->info.typ) && !is_container(p->info.typ) && !is_repetition(p) && !is_choice(p)) { if (is_item(p)) continue; if (is_anytype(p)) { p = p->next; if (p->info.minOccurs <= 0) continue; } if ((p->info.typ->type != Tpointer && !is_smart(p->info.typ)) || p->info.nillable) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(soap_flag_%s > " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.maxOccurs - p->info.minOccurs); strict = 1; } else fprintf(fout, " || soap_flag_%s > " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.maxOccurs - p->info.minOccurs); } else if (strict == 0) { if (is_smart(p->info.typ)) fprintf(fout, "\n\t\tif (%s(!a->%s.get()", strict_check(), ident(p->sym->name)); else fprintf(fout, "\n\t\tif (%s(!a->%s", strict_check(), ident(p->sym->name)); strict = 1; } else { if (is_smart(p->info.typ)) fprintf(fout, " || !a->%s.get()", ident(p->sym->name)); else fprintf(fout, " || !a->%s", ident(p->sym->name)); } nonempty = 1; } else if (is_container(p->info.typ)) { if (p->info.minOccurs > 0) { if (p->info.typ->type == Tpointer) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(!a->%s || a->%s->size() < " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), ident(p->sym->name), p->info.minOccurs); strict = 1; } else fprintf(fout, " || !a->%s || a->%s->size() < " SOAP_LONG_FORMAT, ident(p->sym->name), ident(p->sym->name), p->info.minOccurs); } else { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s.size() < " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.minOccurs); strict = 1; } else fprintf(fout, " || a->%s.size() < " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.minOccurs); } nonempty = 1; } if (p->info.maxOccurs > 1) { if (p->info.typ->type == Tpointer) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s((a->%s && a->%s->size() > " SOAP_LONG_FORMAT ")", strict_check(), ident(p->sym->name), ident(p->sym->name), p->info.maxOccurs); strict = 1; } else fprintf(fout, " || (a->%s && a->%s->size() > " SOAP_LONG_FORMAT ")", ident(p->sym->name), ident(p->sym->name), p->info.maxOccurs); } else { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s.size() > " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.maxOccurs); strict = 1; } else fprintf(fout, " || a->%s.size() > " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.maxOccurs); } } } else if (is_repetition(p)) { if (p->info.minOccurs > 0) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s < " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.minOccurs); strict = 1; } else fprintf(fout, " || a->%s < " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.minOccurs); nonempty = 1; } if (p->info.maxOccurs > 1) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s > " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.maxOccurs); strict = 1; } else fprintf(fout, " || a->%s > " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.maxOccurs); } p = p->next; } else if (is_choice(p)) { if (p->info.minOccurs != 0 && required_choice(p->next->info.typ) < 0) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(soap_flag_%s", strict_check(), ident(p->next->sym->name)); strict = 1; } else fprintf(fout, " || soap_flag_%s", ident(p->next->sym->name)); nonempty = 1; } p = p->next; } } if (strict) fprintf(fout, "))\n\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\treturn NULL;\n\t\t}"); } if (has_getter(typ)) fprintf(fout, "\n\t\tif (a->get(soap))\n\t\t\treturn NULL;"); if (!is_invisible(typ->id->name)) { if (nonempty) fprintf(fout, "\n\t}\n\telse if (%s*soap->href != '#')\n\t{\tsoap->error = SOAP_OCCURS;\n\t\treturn NULL;", strict_check()); fprintf(fout, "\n\t}\n\telse\n\t{\t"); if (!cflag) fprintf(fout, "a = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, %s, sizeof(%s), 0, %s_finsert, NULL);", c_type_id(typ, "*"), soap_type(typ), soap_type(typ), c_type(typ), prefix); else fprintf(fout, "a = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, %s, sizeof(%s), 0, NULL, NULL);", c_type_id(typ, "*"), soap_type(typ), soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;\n\t}"); } fprintf(fout, "\n\treturn a;\n}"); } break; case Tclass: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); if (!is_volatile(typ) && !is_typedef(typ)) { fprintf(fout, "\n\nvoid *%s::soap_in(struct soap *soap, const char *tag, const char *type)", c_type(typ)); fprintf(fout, "\n{\n\treturn soap_in_%s(soap, tag, this, type);\n}", c_ident(typ)); fflush(fout); } fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*a")); table = (Table*)typ->ref; if (!table) { fprintf(fout, "\n\t(void)soap; (void)tag; (void)a; (void)type; /* appease -Wall -Werror */"); fprintf(fout, "\n\tif (!a)\n\t\tsoap->error = SOAP_TAG_MISMATCH;\n\treturn a;\n}"); } else if (is_primclass(typ)) { fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */"); for (p = table->list; p; p = p->next) { if (is_pointer_to_derived(p)) { der = 1; break; } } if (der) fprintf(fout, "\n\tint err = soap_element_begin_in(soap, tag, 1, type);\n\tif (err && err != SOAP_TYPE)\n\t\treturn NULL;"); else fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;"); fprintf(fout, "\n\tif (!(a = (%s*)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType, %s_instantiate, %s_fbase)))\n\t{\tsoap->error = SOAP_TAG_MISMATCH;\n\t\treturn NULL;\n\t}", c_type(typ), soap_type(typ), c_type(typ), prefix, prefix); fprintf(fout, "\n\tsoap_revert(soap);\n\t*soap->id = '\\0';"); fprintf(fout, "\n\tif (soap->alloced && soap->alloced != %s)", soap_type(typ)); fprintf(fout, "\n\t\treturn (%s)a->soap_in(soap, tag, type);", c_type_id(typ, "*")); fprintf(fout, "\n\tif (soap->alloced)\n\t\ta->soap_default(soap);"); if (der) { fprintf(fout, "\n\tif (err == SOAP_TYPE)\n\t{"); for (p = table->list; p; p = p->next) { if (is_pointer_to_derived(p)) { fprintf(fout, "\n\t\tif (("); gen_match_derived(fout, p->info.typ->ref); fprintf(fout, ") && (a->%s = soap_in_%s(soap, tag, NULL, \"%s\")) != NULL)\n\t\t\treturn a;", ident(p->sym->name), c_ident(p->info.typ->ref), xsi_type(p->info.typ->ref)); } } fprintf(fout, "\n\t\treturn NULL;\n\t}"); } for (t = table; t; t = t->prev) { Entry *e = entry(classtable, t->sym); const char *nsa1 = e ? ns_qualifiedAttribute(e->info.typ) : nsa; for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa1)); } fflush(fout); for (table = (Table*)typ->ref; table; table = table->prev) { p = table->list; while (p && !is_item(p)) p = p->next; if (p) break; } if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tif (!soap_inliteral(soap, tag, (char**)&a->%s::%s))", ident(table->sym->name), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tif (!soap_inwliteral(soap, tag, (wchar_t**)&a->%s::%s))", ident(table->sym->name), ident(p->sym->name)); else if (is_string(p->info.typ)) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, (char**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name), xsi_type(typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, (wchar_t**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif (!(a->%s::%s).soap_in(soap, tag, \"%s\"))", ident(table->sym->name), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, &a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name), xsi_type(typ)); fprintf(fout, "\n\t\treturn NULL;"); fixed_check(fout, p, t, "\t"); if (has_getter(typ)) fprintf(fout, "\n\tif (a->get(soap))\n\t\treturn NULL;"); fprintf(fout, "\n\treturn a;\n}"); } else { if (!is_invisible(typ->id->name)) { fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */"); for (p = table->list; p; p = p->next) { if (is_pointer_to_derived(p)) { der = 1; break; } } if (der) fprintf(fout, "\n\tint err = soap_element_begin_in(soap, tag, 0, type);\n\tif (err && err != SOAP_TYPE)\n\t\treturn NULL;"); else fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 0, NULL))\n\t\treturn NULL;"); fprintf(fout, "\n\ta = (%s*)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType, %s_instantiate, %s_fbase);", c_type(typ), soap_type(typ), c_type(typ), prefix, prefix); } else { fprintf(fout, "\n\t(void)tag; (void)type; /* appease -Wall -Werror */"); fprintf(fout, "\n\ta = (%s*)soap_id_enter(soap, \"\", a, %s, sizeof(%s), soap->type, soap->arrayType, %s_instantiate, %s_fbase);", c_type(typ), soap_type(typ), c_type(typ), prefix, prefix); } fprintf(fout, "\n\tif (!a)\n\t\treturn NULL;"); table = (Table*)typ->ref; if (!is_discriminant(typ)) { if (!is_invisible(typ->id->name)) { fprintf(fout, "\n\tif (soap->alloced && soap->alloced != %s)", soap_type(typ)); fprintf(fout, "\n\t{\tsoap_revert(soap);"); fprintf(fout, "\n\t\t*soap->id = '\\0';"); if (is_volatile(typ) || is_typedef(typ)) fprintf(fout, "\n\t\treturn soap_in_%s(soap, tag, a, type);", c_ident(typ)); else fprintf(fout, "\n\t\treturn (%s)a->soap_in(soap, tag, type);", c_type_id(typ, "*")); fprintf(fout, "\n\t}"); } } fprintf(fout, "\n\tif (soap->alloced)"); if (is_volatile(typ) || is_typedef(typ)) fprintf(fout, "\n\t\tsoap_default_%s(soap, a);", c_ident(typ)); else fprintf(fout, "\n\t\ta->soap_default(soap);"); if (der) { fprintf(fout, "\n\tif (err == SOAP_TYPE)\n\t{"); for (p = table->list; p; p = p->next) { if (is_pointer_to_derived(p)) { fprintf(fout, "\n\t\tif (("); gen_match_derived(fout, p->info.typ->ref); fprintf(fout, ") && (a->%s = soap_in_%s(soap, tag, NULL, \"%s\")) != NULL)\n\t\t\treturn a;", ident(p->sym->name), c_ident(p->info.typ->ref), xsi_type(p->info.typ->ref)); } } fprintf(fout, "\n\t\treturn NULL;\n\t}"); } for (t = table; t; t = t->prev) { Entry *e = entry(classtable, t->sym); const char *nsa1 = e ? ns_qualifiedAttribute(e->info.typ) : nsa; for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa1)); } fflush(fout); i = 0; if (!is_discriminant(typ)) { for (t = table; t; t = t->prev) i++; for (; i > 0; i--) { t = table; for (j = 0; j < i-1; j++) t = t->prev; if (!t->prev) { Entry *e = entry(classtable, t->sym); if (e && e->info.typ && e->info.typ->base && !strcmp(e->info.typ->base->name, "soap_dom_element")) fprintf(fout, "\n\tsize_t soap_flag_soap_dom_element = 1;"); } for (p = t->list; p; p = p->next) { if (!(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (is_anytype(p) || is_choice(p)) { p = p->next; fprintf(fout, "\n\tsize_t soap_flag_%s%d = " SOAP_LONG_FORMAT ";", ident(p->sym->name), i, p->info.maxOccurs); } else if (is_repetition(p)) { fprintf(fout, "\n\tstruct soap_blist *soap_blist_%s%d = NULL;", ident(p->next->sym->name), i); p = p->next; } else if (!is_transient(p->info.typ) && !is_container(p->info.typ)) fprintf(fout, "\n\tsize_t soap_flag_%s%d = " SOAP_LONG_FORMAT ";", ident(p->sym->name), i, p->info.maxOccurs); } } } } fflush(fout); if (!is_invisible(typ->id->name)) { if (!is_discriminant(typ)) { fprintf(fout, "\n\tif (soap->body && *soap->href != '#')\n\t{"); fprintf(fout, "\n\t\tfor (;;)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;"); } else fprintf(fout, "\n\tif (!tag || *tag == '-' || (soap->body && *soap->href != '#'))\n\t{"); } else if (!is_discriminant(typ)) { if (table && (table->prev || table->list)) fprintf(fout, "\n\t\tfor (short soap_flag = 0;; soap_flag = 1)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;"); } table = (Table*)typ->ref; i = 0; flag = 0; for (t = table; t; t = t->prev) i++; for (; i > 0; i--) { Entry *e; const char *nse1; t = table; for (j = 0; j < i-1; j++) t = t->prev; e = entry(classtable, t->sym); nse1 = e ? ns_qualifiedElement(e->info.typ) : nse; for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (is_item(p)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t\t\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { if (is_unmatched(p->next->sym) || is_invisible(p->next->sym->name)) { p = p->next; continue; } flag = 1; fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && "); fprintf(fout, "!soap_element_begin_in(soap, %s, 1, NULL))", field(p->next, nse1)); fprintf(fout, "\n\t\t\t{\tif (a->%s::%s == NULL)\n\t\t\t\t{\tif (soap_blist_%s%d == NULL)\n\t\t\t\t\t\tsoap_blist_%s%d = soap_alloc_block(soap);", ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i, ident(p->next->sym->name), i); if (((Tnode*)p->next->info.typ->ref)->type == Tclass || ((Tnode*)p->next->info.typ->ref)->type == Ttemplate || has_class((Tnode*)p->next->info.typ->ref) || (!cflag && ((Tnode*)p->next->info.typ->ref)->type == Tstruct)) fprintf(fout, "\n\t\t\t\t\ta->%s::%s = soap_block<%s>::push(soap, soap_blist_%s%d);\n\t\t\t\t\tif (a->%s::%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name), i, ident(t->sym->name), ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t\t\t\t\ta->%s::%s = (const %s)soap_push_block_max(soap, soap_blist_%s%d, sizeof(%s));\n\t\t\t\t\tif (a->%s::%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, c_type((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\ta->%s::%s = (%s)soap_push_block_max(soap, soap_blist_%s%d, sizeof(%s));\n\t\t\t\t\tif (a->%s::%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, c_type((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\ta->%s::%s->soap_default(soap);", ident(t->sym->name), ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\tsoap_default_%s(soap, a->%s::%s);", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\t*a->%s::%s = NULL;", ident(t->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t}"); fprintf(fout, "\n\t\t\t\tsoap_revert(soap);"); if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, %s, (char**)a->%s::%s))", field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, %s, (wchar_t**)a->%s::%s))", field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (char**)a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (wchar_t**)a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); fprintf(fout, "\n\t\t\t\t{\ta->%s::%s++;\n\t\t\t\t\ta->%s::%s = NULL;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_anytype(p)) { flag = 1; fprintf(fout, "\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)", ident(p->next->sym->name), i); if (is_self(p->next)) fprintf(fout, "\n\t\t\t{\tif ((a->%s::%s = soap_getelement(soap, tag, &a->%s::%s)))", ident(t->sym->name), ident(p->next->sym->name), ident(t->sym->name), ident(p->sym->name)); else if (is_invisible(p->next->sym->name)) fprintf(fout, "\n\t\t\t{\tif ((a->%s::%s = soap_getelement(soap, NULL, &a->%s::%s)))", ident(t->sym->name), ident(p->next->sym->name), ident(t->sym->name), ident(p->sym->name)); else fprintf(fout, "\n\t\t\t{\tif ((a->%s::%s = soap_getelement(soap, %s, &a->%s::%s)))", ident(t->sym->name), ident(p->next->sym->name), field(p->next, nse1), ident(t->sym->name), ident(p->sym->name)); fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s%d = 0;", ident(p->next->sym->name), i); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}\n\t\t\t}"); p = p->next; } else if (is_discriminant(typ) && p->next) { flag = 1; fprintf(fout, "\n\t\tif (!soap_in_%s(soap, &a->%s, &a->%s))", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\t\treturn NULL;"); i = 0; break; } else if (is_choice(p)) { flag = 1; fprintf(fout, "\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)", ident(p->next->sym->name), i); fprintf(fout, "\n\t\t\t{\tif (soap_in_%s(soap, &a->%s::%s, &a->%s::%s))", c_ident(p->next->info.typ), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s%d = 0;", ident(p->next->sym->name), i); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}\n\t\t}"); p = p->next; } else if (is_transient(p->info.typ)) { if (!is_pointer_to_derived(p)) fprintf(fout, "\n\t\t\t/* transient %s skipped */", ident(p->sym->name)); } else { flag = 1; if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap_flag_%s%d && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))", ident(p->sym->name), i); else if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); else fprintf(fout, "\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)", ident(p->sym->name), i); fprintf(fout, "\n\t\t\t{\t"); } if (is_unmatched(p->sym)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "if (soap_inliteral(soap, NULL, (char**)&a->%s::%s))", ident(t->sym->name), ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "if (soap_inwliteral(soap, NULL, (wchar_t**)&a->%s::%s))", ident(t->sym->name), ident(p->sym->name)); } else if (is_string(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, NULL, (char**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (is_wstring(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, NULL, (wchar_t**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tarray) { fprintf(fout, "if (soap_in_%s(soap, NULL, a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "if ((a->%s::%s).soap_in(soap, NULL, \"%s\"))", ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, NULL, &a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } } else if (!is_invisible(p->sym->name)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "if (soap_inliteral(soap, %s, (char**)&a->%s::%s))", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "if (soap_inwliteral(soap, %s, (wchar_t**)&a->%s::%s))", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); } else if (is_string(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, %s, (char**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (is_wstring(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, %s, (wchar_t**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tarray) { fprintf(fout, "if (soap_in_%s(soap, %s, a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "if ((a->%s::%s).soap_in(soap, %s, \"%s\"))", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1), xsi_type(p->info.typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, %s, &a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } } if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\t\t\tcontinue;"); else { fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s%d--;", ident(p->sym->name), i); fixed_check(fout, p, t, "\t\t\t\t\t"); if (p->info.hasval && !p->info.fixed && (is_string(p->info.typ) || is_wstring(p->info.typ))) { fprintf(fout, "\n\t\t\t\t\tif (*soap->href != '#' && a->%s::%s && ", ident(t->sym->name), ident(p->sym->name)); fprintf(fout, "!*a->%s::%s)", ident(t->sym->name), ident(p->sym->name)); fprintf(fout, "\n\t\t\t\t\t\ta->%s::%s%s;", ident(t->sym->name), ident(p->sym->name), c_init(p)); } else if (p->info.ptrval && !p->info.fixed && (is_string(p->info.typ->ref) || is_wstring(p->info.typ->ref) || is_stdstring(p->info.typ->ref) || is_stdwstring(p->info.typ->ref))) { Tnode *ptr = (Tnode*)p->info.typ->ref; if (is_smart(p->info.typ)) fprintf(fout, "\n\t\t\t\t\tif (*soap->href != '#' && a->%s::%s.get() && ", ident(t->sym->name), ident(p->sym->name)); else fprintf(fout, "\n\t\t\t\t\tif (*soap->href != '#' && a->%s::%s && ", ident(t->sym->name), ident(p->sym->name)); if (is_string(ptr) || is_wstring(ptr)) fprintf(fout, "*a->%s::%s && !**a->%s::%s)", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->sym->name)); else fprintf(fout, "a->%s::%s->empty())", ident(t->sym->name), ident(p->sym->name)); fprintf(fout, "\n\t\t\t\t\t\t*a->%s::%s%s;", ident(t->sym->name), ident(p->sym->name), c_init(p)); } fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}"); if (p->info.ptrval && !p->info.fixed && !(is_string(p->info.typ->ref) || is_wstring(p->info.typ->ref) || is_stdstring(p->info.typ->ref) || is_stdwstring(p->info.typ->ref))) { Tnode *ptr = (Tnode*)p->info.typ->ref; fprintf(fout, "\n\t\t\t\tif (soap->error == SOAP_EMPTY)\n\t\t\t\t{\t"); if (is_smart(p->info.typ)) { if (is_smart_shared(p->info.typ)) fprintf(fout, "a->%s::%s = %s<%s>();", ident(t->sym->name), ident(p->sym->name), make_shared(p->info.typ), c_type(ptr)); else if (ptr->type == Tclass && !is_external(ptr) && !is_volatile(ptr) && !is_typedef(ptr)) fprintf(fout, "a->%s::%s = %s(%s_instantiate_%s(soap, SOAP_NO_LINK_TO_DELETE, soap->type, soap->arrayType, NULL));", ident(t->sym->name), ident(p->sym->name), c_type(p->info.typ), fprefix, c_ident(ptr)); else fprintf(fout, "a->%s::%s = %s(SOAP_NEW(soap, %s));", ident(t->sym->name), ident(p->sym->name), c_type(p->info.typ), c_type(ptr)); } else if (ptr->type == Tclass) { fprintf(fout, "if (!(a->%s::%s = (%s)%s_instantiate_%s(soap, -1, soap->type, soap->arrayType, NULL)))\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->sym->name), c_type(p->info.typ), fprefix, c_ident(ptr)); } else { fprintf(fout, "if (!(a->%s::%s = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->sym->name), c_type(p->info.typ), c_type(ptr)); } fprintf(fout, "\n\t\t\t\t\t*a->%s::%s%s;", ident(t->sym->name), ident(p->sym->name), c_init(p)); fprintf(fout, "\n\t\t\t\t\tsoap->error = SOAP_OK;\n\t\t\t\t\tsoap_flag_%s%d--;\n\t\t\t\t\tcontinue;\n\t\t\t\t}", ident(p->sym->name), i); } } fprintf(fout, "\n\t\t\t}"); } fflush(fout); } } } if (!is_discriminant(typ)) { Entry *e; const char *nse1; i = 0; for (t = table; t; t = t->prev) { i++; e = entry(classtable, t->sym); nse1 = e ? ns_qualifiedElement(e->info.typ) : nse; for (p = t->list; p; p = p->next) { if (is_repetition(p) && (is_unmatched(p->next->sym) || is_invisible(p->next->sym->name))) { flag = 1; fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && "); if (is_unmatched(p->next->sym)) fprintf(fout, "!soap_element_begin_in(soap, NULL, 1, NULL))"); else if (is_invisible(p->next->sym->name)) fprintf(fout, "!soap_peek_element(soap))"); fprintf(fout, "\n\t\t\t{\tif (a->%s::%s == NULL)\n\t\t\t\t{\tif (soap_blist_%s%d == NULL)\n\t\t\t\t\t\tsoap_blist_%s%d = soap_alloc_block(soap);", ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i, ident(p->next->sym->name), i); if (((Tnode*)p->next->info.typ->ref)->type == Tclass || ((Tnode*)p->next->info.typ->ref)->type == Ttemplate || has_class((Tnode*)p->next->info.typ->ref) || (!cflag && ((Tnode*)p->next->info.typ->ref)->type == Tstruct)) fprintf(fout, "\n\t\t\t\t\ta->%s::%s = soap_block<%s>::push(soap, soap_blist_%s%d);\n\t\t\t\t\tif (a->%s::%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name), i, ident(t->sym->name), ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t\t\t\t\ta->%s::%s = (const %s)soap_push_block_max(soap, soap_blist_%s%d, sizeof(%s));\n\t\t\t\t\tif (a->%s::%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, c_type((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\ta->%s::%s = (%s)soap_push_block_max(soap, soap_blist_%s%d, sizeof(%s));\n\t\t\t\t\tif (a->%s::%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, c_type((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\ta->%s::%s->soap_default(soap);", ident(t->sym->name), ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\tsoap_default_%s(soap, a->%s::%s);", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\t*a->%s::%s = NULL;", ident(t->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t}"); if (!is_invisible(p->next->sym->name)) fprintf(fout, "\n\t\t\t\tsoap_revert(soap);"); if (is_unmatched(p->next->sym)) { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, NULL, (char**)a->%s::%s))", ident(t->sym->name), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, NULL, (wchar_t**)a->%s::%s))", ident(t->sym->name), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, (char**)a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, (wchar_t**)a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); } else { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, %s, (char**)a->%s::%s))", field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, %s, (wchar_t**)a->%s::%s))", field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (char**)a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (wchar_t**)a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); } fprintf(fout, "\n\t\t\t\t{\ta->%s::%s++;\n\t\t\t\t\ta->%s::%s = NULL;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_repetition(p) || is_anytype(p) || is_choice(p)) { p = p->next; continue; } else if (is_invisible(p->sym->name) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && !(p->info.sto & Sattribute)) { flag = 1; if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap_flag_%s%d && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))", ident(p->sym->name), i); else if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); else fprintf(fout, "\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)", ident(p->sym->name), i); fprintf(fout, "\n\t\t\t{\t"); if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "if (soap_inliteral(soap, %s, (char**)&a->%s::%s))", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "if (soap_inwliteral(soap, %s, (wchar_t**)&a->%s::%s))", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); } else if (is_string(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, %s, (char**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (is_wstring(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, %s, (wchar_t**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tarray) { fprintf(fout, "if (soap_in_%s(soap, %s, a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "if ((a->%s::%s).soap_in(soap, %s, \"%s\"))", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1), xsi_type(p->info.typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, %s, &a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\t\t\tcontinue;"); else { fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s%d--;", ident(p->sym->name), i); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}"); } fprintf(fout, "\n\t\t\t}"); } } if (!t->prev && e && e->info.typ && e->info.typ->base && !strcmp(e->info.typ->base->name, "soap_dom_element")) { fprintf(fout, "\n\t\t\tif (soap_flag_soap_dom_element && soap->error == SOAP_TAG_MISMATCH)\n\t\t\t\tif (soap_in_xsd__anyType(soap, NULL, static_cast(a), NULL))"); fprintf(fout, "\n\t\t\t\t{\tsoap_flag_soap_dom_element = 0;"); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}"); } } for (t = table; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->info.sto & Sreturn) if (nse || has_ns_eq(NULL, p->sym->name)) fprintf(fout, "\n\t\t\tsoap_check_result(soap, \"%s\");", ns_add(p, nse)); if (!flag && is_invisible(typ->id->name)) fprintf(fout, "\n\tsoap->error = SOAP_TAG_MISMATCH;\n\ta = NULL;"); if (!is_invisible(typ->id->name) || (table && (table->prev || table->list))) { if (!is_invisible(typ->id->name) || is_discriminant(typ)) fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)\n\t\t\t\tsoap->error = soap_ignore_element(soap);"); else fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && soap_flag)\n\t\t\t{\n\t\t\t\tsoap->error = SOAP_OK;\n\t\t\t\tbreak;\n\t\t\t}"); if (!is_invisible(typ->id->name)) fprintf(fout, "\n\t\t\tif (soap->error == SOAP_NO_TAG)"); else fprintf(fout, "\n\t\t\tif (soap_flag && soap->error == SOAP_NO_TAG)"); fprintf(fout, "\n\t\t\t\tbreak;"); fprintf(fout, "\n\t\t\tif (soap->error)\n\t\t\t\treturn NULL;"); fprintf(fout, "\n\t\t}"); } } if (!is_discriminant(typ)) { i = 0; for (t = table; t; t = t->prev) i++; for (; i > 0; i--) { t = table; for (j = 0; j < i-1; j++) t = t->prev; for (p = t->list; p; p = p->next) { if (is_repetition(p)) { if (((Tnode*)p->next->info.typ->ref)->type == Tclass || ((Tnode*)p->next->info.typ->ref)->type == Ttemplate || has_class((Tnode*)p->next->info.typ->ref) || (((Tnode*)p->next->info.typ->ref)->type == Tstruct && !cflag)) { fprintf(fout, "\n\t\tif (a->%s::%s)\n\t\t\tsoap_block<%s>::pop(soap, soap_blist_%s%d);", ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name), i); fprintf(fout, "\n\t\tif (a->%s::%s)\n\t\t{\ta->%s::%s = soap_new_%s(soap, a->%s::%s);\n\t\t\tif (!a->%s::%s)\n\t\t\t\treturn NULL;\n\t\t\tsoap_block<%s>::save(soap, soap_blist_%s%d, a->%s::%s);\n\t\t}\n\t\telse\n\t\t{\ta->%s::%s = NULL;\n\t\t\tif (soap_blist_%s%d)\n\t\t\t\tsoap_block<%s>::end(soap, soap_blist_%s%d);\n\t\t}", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name), c_ident(p->next->info.typ->ref), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name), i, ident(t->sym->name), ident(p->next->sym->name), ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i, c_type(p->next->info.typ->ref), ident(p->next->sym->name), i); } else { fprintf(fout, "\n\t\tif (a->%s::%s)\n\t\t\tsoap_pop_block(soap, soap_blist_%s%d);", ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i); if ((((Tnode*)p->next->info.typ->ref)->type == Tpointer && (p->next->info.sto & Sconstptr))) fprintf(fout, "\n\t\tif (a->%s::%s)\n\t\t{\ta->%s::%s = (const %s)soap_save_block(soap, soap_blist_%s%d, NULL, 1);\n\t\t}\n\t\telse\n\t\t{\ta->%s::%s = NULL;\n\t\t\tif (soap_blist_%s%d)\n\t\t\t\tsoap_end_block(soap, soap_blist_%s%d);\n\t\t}", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i, ident(p->next->sym->name), i); else fprintf(fout, "\n\t\tif (a->%s::%s)\n\t\t{\ta->%s::%s = (%s)soap_save_block(soap, soap_blist_%s%d, NULL, 1);\n\t\t}\n\t\telse\n\t\t{\ta->%s::%s = NULL;\n\t\t\tif (soap_blist_%s%d)\n\t\t\t\tsoap_end_block(soap, soap_blist_%s%d);\n\t\t}", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i, ident(p->next->sym->name), i); } p = p->next; } } } } if (!is_invisible(typ->id->name)) { if (is_discriminant(typ)) fprintf(fout, "\n\t\tif (tag && *tag != '-')\n\t\t{\tsoap->error = soap_ignore_element(soap);\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH || soap_element_end_in(soap, tag))\n\t\t\t\treturn NULL;\n\t\t}"); else fprintf(fout, "\n\t\tif (soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); } strict = 0; nonempty = 0; if (!is_discriminant(typ)) { i = 0; for (t = table; t; t = t->prev) i++; for (; i > 0; i--) { t = table; for (j = 0; j < i-1; j++) t = t->prev; for (p = t->list; p; p = p->next) { if (p->info.minOccurs > 0 && p->info.maxOccurs >= 0 && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_transient(p->info.typ) && !is_container(p->info.typ) && !is_repetition(p) && !is_choice(p)) { if (is_item(p)) continue; if (is_anytype(p)) { p = p->next; if (p->info.minOccurs <= 0) continue; } if ((p->info.typ->type != Tpointer && !is_smart(p->info.typ)) || p->info.nillable) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(soap_flag_%s%d > " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), i, p->info.maxOccurs - p->info.minOccurs); strict = 1; } else fprintf(fout, " || soap_flag_%s%d > " SOAP_LONG_FORMAT, ident(p->sym->name), i, p->info.maxOccurs - p->info.minOccurs); } else if (strict == 0) { if (is_smart(p->info.typ)) fprintf(fout, "\n\t\tif (%s(!a->%s::%s.get()", strict_check(), ident(t->sym->name), ident(p->sym->name)); else fprintf(fout, "\n\t\tif (%s(!a->%s::%s", strict_check(), ident(t->sym->name), ident(p->sym->name)); strict = 1; } else { if (is_smart(p->info.typ)) fprintf(fout, " || !a->%s::%s.get()", ident(t->sym->name), ident(p->sym->name)); else fprintf(fout, " || !a->%s::%s", ident(t->sym->name), ident(p->sym->name)); } nonempty = 1; } else if (is_container(p->info.typ)) { if (p->info.minOccurs > 0) { if (p->info.typ->type == Tpointer) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(!a->%s::%s || a->%s::%s->size() < " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); strict = 1; } else fprintf(fout, " || !a->%s::%s || a->%s::%s->size() < " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); } else { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s::%s.size() < " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); strict = 1; } else fprintf(fout, " || a->%s::%s.size() < " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); } nonempty = 1; } if (p->info.maxOccurs > 1) { if (p->info.typ->type == Tpointer) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s((a->%s::%s && a->%s::%s->size() > " SOAP_LONG_FORMAT ")", strict_check(), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); strict = 1; } else fprintf(fout, " || (a->%s::%s && a->%s::%s->size() > " SOAP_LONG_FORMAT ")", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); } else { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s::%s.size() > " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); strict = 1; } else fprintf(fout, " || a->%s::%s.size() > " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); } } } else if (is_repetition(p)) { if (p->info.minOccurs > 0) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s::%s < " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); strict = 1; } else fprintf(fout, " || a->%s::%s < " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); nonempty = 1; } if (p->info.maxOccurs > 1) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s::%s > " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); strict = 1; } else fprintf(fout, " || a->%s::%s > " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); } p = p->next; } else if (is_choice(p)) { if (p->info.minOccurs != 0 && required_choice(p->next->info.typ) < 0) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(soap_flag_%s%d", strict_check(), ident(p->next->sym->name), i); strict = 1; } else fprintf(fout, " || soap_flag_%s%d", ident(p->next->sym->name), i); nonempty = 1; } p = p->next; } } } if (strict) fprintf(fout, "))\n\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\treturn NULL;\n\t\t}"); } if (has_getter(typ)) fprintf(fout, "\n\t\tif (a->get(soap))\n\t\t\treturn NULL;"); if (!is_invisible(typ->id->name)) { if (nonempty) fprintf(fout, "\n\t}\n\telse if (%s*soap->href != '#')\n\t{\tsoap->error = SOAP_OCCURS;\n\t\treturn NULL;", strict_check()); fprintf(fout, "\n\t}\n\telse\n\t{"); fprintf(fout, "\ta = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, %s, sizeof(%s), 0, %s_finsert, %s_fbase);", c_type_id(typ, "*"), soap_type(typ), soap_type(typ), c_type(typ), prefix, prefix); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;\n\t}"); } fprintf(fout, "\n\treturn a;\n}"); } break; case Tunion: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, int*, %s);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, int*, %s);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, int *choice, %s)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)a; /* appease -Wall -Werror */"); fprintf(fout, "\n\tsoap->error = SOAP_TAG_MISMATCH;"); table = (Table *)typ->ref; if (table) { for (p = table->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_transient(p->info.typ)) { if (!is_pointer_to_derived(p)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); } else if (!is_invisible(p->sym->name)) { if (is_unmatched(p->sym)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inliteral(soap, NULL, (char**)&a->%s))", ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inwliteral(soap, NULL, (wchar_t**)&a->%s))", ident(p->sym->name)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, NULL, a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(p->info.typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && a->%s.soap_in(soap, NULL, \"%s\"))", ident(p->sym->name), xsi_type(p->info.typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (p->info.typ->type == Tpointer) fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, NULL, &a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(p->info.typ)); } } else { if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inliteral(soap, \"%s\", (char**)&a->%s))", ns_add(p, nse), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inwliteral(soap, \"%s\", (wchar_t**)&a->%s))", ns_add(p, nse), ident(p->sym->name)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, \"%s\", a->%s, \"%s\"))", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && a->%s.soap_in(soap, \"%s\", \"%s\"))", ident(p->sym->name), ns_add(p, nse), xsi_type(p->info.typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (p->info.typ->type == Tpointer) fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, \"%s\", &a->%s, \"%s\"))", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); } } fprintf(fout, "\n\t{\t*choice = %s;", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn a;"); fprintf(fout, "\n\t}"); fflush(fout); } } } table = (Table *)typ->ref; if (table) { for (p = table->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) ; else if (is_transient(p->info.typ)) ; else if (p->info.sto & Sattribute) ; else if (is_invisible(p->sym->name)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inliteral(soap, \"%s\", (char**)&a->%s))", ns_add(p, nse), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inwliteral(soap, \"%s\", (wchar_t**)&a->%s))", ns_add(p, nse), ident(p->sym->name)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, \"%s\", a->%s, NULL))", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && a->%s.soap_in(soap, \"%s\", NULL))", ident(p->sym->name), ns_add(p, nse)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (p->info.typ->type == Tpointer) fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, \"%s\", &a->%s, NULL))", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name)); } fprintf(fout, "\n\t{\t*choice = %s;", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn a;"); fprintf(fout, "\n\t}"); fflush(fout); } } } fprintf(fout, "\n\t*choice = %d;", required_choice(typ)); fprintf(fout, "\n\tif (!soap->error)\n\t\tsoap->error = SOAP_TAG_MISMATCH;\n\treturn NULL;\n}"); break; case Tpointer: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_element_begin_in(soap, tag, 1, NULL))"); fprintf(fout, "\n\t\treturn NULL;"); if (is_template(typ->ref)) { fprintf(fout, "\n\tsoap_revert(soap);"); fprintf(fout, "\n\tif (!a)\n\t{\tif (!(a = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t\treturn NULL;\n\t\t*a = NULL;\n\t}", c_type_id(typ, "*"), c_type(typ)); fprintf(fout, "\n\tif (!(*a = soap_in_%s(soap, tag, *a, type)))\n\t\treturn NULL;", c_ident((Tnode*)typ->ref)); fprintf(fout, "\n\treturn a;\n}"); } else if (((Tnode *) typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { fprintf(fout, "\n\tif (!a)\n\t\tif (!(a = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t\treturn NULL;", c_type_id(typ, "*"), c_type(typ)); fprintf(fout, "\n\t*a = NULL;\n\tif (!soap->null && *soap->href != '#')"); fprintf(fout, "\n\t{\tsoap_revert(soap);"); fprintf(fout, "\n\t\tif (!(*a = (%s)%s_instantiate_%s(soap, -1, soap->type, soap->arrayType, NULL)))", c_type(typ), fprefix, c_ident((Tnode*)typ->ref)); fprintf(fout, "\n\t\t\treturn NULL;"); fprintf(fout, "\n\t\t(*a)->soap_default(soap);"); fprintf(fout, "\n\t\tif (!(*a)->soap_in(soap, tag, NULL))"); fprintf(fout, "\n\t\t{\t*a = NULL;\n\t\t\treturn NULL;\n\t\t}"); fprintf(fout, "\n\t}\n\telse\n\t{\ta = (%s)soap_id_lookup(soap, soap->href, (void**)a, %s, sizeof(%s), %d, %s_fbase);", c_type_id(typ, "*"), soap_type(reftype(typ->ref)), c_type(reftype(typ->ref)), reflevel(typ->ref), prefix); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}\n\treturn a;\n}"); } else { fprintf(fout, "\n\tif (!a)\n\t\tif (!(a = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t\treturn NULL;", c_type_id(typ, "*"), c_type(typ)); fprintf(fout, "\n\t*a = NULL;\n\tif (!soap->null && *soap->href != '#')"); fprintf(fout, "\n\t{\tsoap_revert(soap);"); fprintf(fout, "\n\t\tif (!(*a = soap_in_%s(soap, tag, *a, type)))", c_ident((Tnode*)typ->ref)); fprintf(fout, "\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}\n\telse\n\t{\ta = (%s)soap_id_lookup(soap, soap->href, (void**)a, %s, sizeof(%s), %d, NULL);", c_type_id(typ, "*"), soap_type(reftype(typ->ref)), c_type(reftype(typ->ref)), reflevel(typ->ref)); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}\n\treturn a;\n}"); } break; case Tarray: temp = get_item_type(typ, &cardinality); if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s * SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type(temp), c_ident(typ), c_type_id(typ, "")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type(temp), c_ident(typ), c_type_id(typ, "")); fprintf(fout, "\n\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type(temp), c_ident(typ), c_type_id(typ, "a")); fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 0, NULL))"); fprintf(fout, "\n\t\treturn NULL;"); fprintf(fout, "\n\tif (soap_match_array(soap, type))"); fprintf(fout, "\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}"); fprintf(fout, "\n\ta = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), NULL, NULL, NULL, NULL);", c_type_id(typ->ref, "(*)"), soap_type(typ), c_type_id(typ, "")); fprintf(fout, "\n\tif (!a)\n\t\treturn NULL;"); fprintf(fout, "\n\tsoap_default_%s(soap, a);", c_ident(typ)); fprintf(fout, "\n\tif (soap->body && *soap->href != '#')"); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < %d; i++)", get_dimension(typ)); fprintf(fout, "\n\t\t{\tsoap_peek_element(soap);\n\t\t\tif (soap->position)\n\t\t\t{\ti = soap->positions[0];\n\t\t\t\tif (i < 0 || i >= %d)\n\t\t\t\t{\tsoap->error = SOAP_IOB;\n\t\t\t\t\treturn NULL;\n\t\t\t\t}\n\t\t\t}", get_dimension(typ)); fprintf(fout, "\n\t\t\tif (!soap_in_%s(soap, NULL, a", c_ident((Tnode*)typ->ref)); if (cardinality > 1) fprintf(fout, "[i]"); else fprintf(fout, "+i"); fprintf(fout, ", \"%s\"))", xsi_type((Tnode*)typ->ref)); fprintf(fout, "\n\t\t\t{\tif (soap->error != SOAP_NO_TAG)\n\t\t\t\t\treturn NULL;"); fprintf(fout, "\n\t\t\t\tsoap->error = SOAP_OK;"); fprintf(fout, "\n\t\t\t\tbreak;"); fprintf(fout, "\n\t\t\t}"); fprintf(fout, "\n\t\t}"); fprintf(fout, "\n\t\tif ((soap->mode & SOAP_C_NOIOB))\n\t\t\twhile (soap_element_end_in(soap, tag) == SOAP_SYNTAX_ERROR)\n\t\t\t{\tsoap->peeked = 1;\n\t\t\t\tsoap_ignore_element(soap);\n\t\t\t}"); fprintf(fout, "\n\t\telse if (soap_element_end_in(soap, tag))\n\t\t{\tif (soap->error == SOAP_SYNTAX_ERROR)\n\t\t\t\tsoap->error = SOAP_IOB;\n\t\t\treturn NULL;\n\t\t}"); if (!cflag) fprintf(fout, "\n\t}\n\telse\n\t{\ta = (%s)soap_id_forward(soap, soap->href, (void*)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), NULL, NULL, NULL, NULL), 0, %s, %s, sizeof(%s), 0, %s_finsert, NULL);", c_type_id(typ->ref, "(*)"), soap_type(typ), c_type_id(typ, ""), soap_type(typ), soap_type(typ), c_type_id(typ, ""), prefix); else fprintf(fout, "\n\t}\n\telse\n\t{\ta = (%s)soap_id_forward(soap, soap->href, (void*)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), NULL, NULL, NULL, NULL), 0, %s, %s, sizeof(%s), 0, NULL, NULL);", c_type_id(typ->ref, "(*)"), soap_type(typ), c_type_id(typ, ""), soap_type(typ), soap_type(typ), c_type_id(typ, "")); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}\n\treturn (%s*)a;\n}", c_type(temp)); break; case Tenum: case Tenumsc: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); if (!is_typedef(typ)) { fprintf(fhead, "\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap*, const char*, %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap *soap, const char *s, %s)\n{", c_ident(typ), c_type_id(typ, "*a")); if (!is_mask(typ)) { LONG64 min = 0; LONG64 max = 0; fprintf(fout, "\n\tconst struct soap_code_map *map;"); t = (Table*)typ->ref; if (t && t->list && has_ns_eq(NULL, ns_remove3(t->list->sym->name, c_ident(typ)))) { fprintf(fout, "\n\tchar *t;"); fprintf(fout, "\n\tif (!s)\n\t\treturn soap->error;"); fprintf(fout, "\n\tsoap_s2QName(soap, s, &t, %ld, %ld, %s);", minlen(typ), maxlen(typ), pattern(typ)); fprintf(fout, "\n\tmap = soap_code(soap_codes_%s, t);", c_ident(typ)); } else { fprintf(fout, "\n\tif (!s)\n\t\treturn soap->error;"); fprintf(fout, "\n\tmap = soap_code(soap_codes_%s, s);", c_ident(typ)); } for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.val.i < min) min = p->info.val.i; if (p->info.val.i > max) max = p->info.val.i; } } if (is_boolean(typ)) fprintf(fout, "\n\tif (map)\n\t\t*a = (%s)(map->code != 0);\n\telse if (!*s)\n\t\treturn soap->error = SOAP_EMPTY;\n\telse\n\t{\tlong n;\n\t\tif (soap_s2long(soap, s, &n) || n < 0 || n > 1)\n\t\t\treturn soap->error = SOAP_TYPE;\n\t\t*a = (%s)(n != 0);\n\t}\n\treturn SOAP_OK;\n}", c_type(typ), c_type(typ)); else if (sflag) fprintf(fout, "\n\tif (map)\n\t\t*a = (%s)map->code;\n\telse if (!*s)\n\t\treturn soap->error = SOAP_EMPTY;\n\telse\n\t\treturn soap->error = SOAP_TYPE;\n\treturn SOAP_OK;\n}", c_type(typ)); else if (min >= -2147483648LL && min <= 2147483647LL && max >= -2147483648LL && max <= 2147483647LL) fprintf(fout, "\n\tif (map)\n\t\t*a = (%s)map->code;\n\telse if (!*s)\n\t\treturn soap->error = SOAP_EMPTY;\n\telse\n\t{\tint n;\n\t\tif (soap_s2int(soap, s, &n) || n < " SOAP_LONG_FORMAT " || n > " SOAP_LONG_FORMAT ")\n\t\t\treturn soap->error = SOAP_TYPE;\n\t\t*a = (%s)n;\n\t}\n\treturn SOAP_OK;\n}", c_type(typ), min, max, c_type(typ)); else fprintf(fout, "\n\tif (map)\n\t\t*a = (%s)map->code;\n\telse if (!*s)\n\t\treturn soap->error = SOAP_EMPTY;\n\telse\n\t{\tLONG64 n;\n\t\tif (soap_s2LONG64(soap, s, &n) || n < " SOAP_LONG_FORMAT "LL || n > " SOAP_LONG_FORMAT "LL)\n\t\t\treturn soap->error = SOAP_TYPE;\n\t\t*a = (%s)n;\n\t}\n\treturn SOAP_OK;\n}", c_type(typ), min, max, c_type(typ)); } else { t = (Table*)typ->ref; if (t && t->list && has_ns_eq(NULL, ns_remove3(t->list->sym->name, c_ident(typ)))) { fprintf(fout, "\n\tchar *t;"); fprintf(fout, "\n\tsoap_s2QName(soap, s, &t, %ld, %ld, %s);", minlen(typ), maxlen(typ), pattern(typ)); fprintf(fout, "\n\t*a = (%s)soap_code_bits(soap_codes_%s, t);", c_type(typ), c_ident(typ)); } else fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */\n\t*a = (%s)soap_code_bits(soap_codes_%s, s);", c_type(typ), c_ident(typ)); fprintf(fout, "\n\treturn SOAP_OK;\n}"); } } fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*a")); if (is_boolean(typ)) { fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 0, NULL))"); fprintf(fout, "\n\t\treturn NULL;"); fprintf(fout, "\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \":boolean\"))"); fprintf(fout, "\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}"); } else if (typ->sym) { fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 0, NULL))"); fprintf(fout, "\n\t\treturn NULL;"); fprintf(fout, "\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \"%s\"))", base_type(typ, "")); fprintf(fout, "\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}"); } else { fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 0, type))"); fprintf(fout, "\n\t\treturn NULL;"); } fprintf(fout, "\n\ta = (%s*)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), NULL, NULL, NULL, NULL);", c_type(typ), soap_type(typ), c_type(typ)); fprintf(fout, "\n\tif (!a)\n\t\treturn NULL;"); fprintf(fout, "\n\tif (*soap->href != '#')\n\t{"); fprintf(fout, "\tint err = soap_s2%s(soap, soap_value(soap), a);\n\t\tif ((soap->body && soap_element_end_in(soap, tag)) || err)\n\t\t\treturn NULL;", c_ident(typ)); fprintf(fout, "\n\t}\n\telse\n\t{\ta = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, %s, sizeof(%s), 0, NULL, NULL);", c_type_id(typ, "*"), soap_type(typ), soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}\n\treturn a;\n}"); break; case Ttemplate: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); return; } if (is_typedef(typ)) { fprintf(fhead, "\n\n#define soap_in_%s soap_in_%s\n", c_ident(typ), t_ident(typ)); return; } n = (Tnode*)typ->ref; if (n->type == Tfun || is_void(n)) return; fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */"); if (is_smart(typ)) { fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 1, NULL))"); fprintf(fout, "\n\t\treturn NULL;"); fprintf(fout, "\n\tif (!a && !(a = soap_new_%s(soap)))\n\t\treturn NULL;", c_ident(typ)); fprintf(fout, "\n\tif (!soap->null && *soap->href != '#')\n\t{"); if (is_smart_shared(typ)) { fprintf(fout, "\tvoid **x = soap_id_smart(soap, soap->id, %s, sizeof(%s));", soap_type(n), c_type(n)); if (n->type == Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n)) fprintf(fout, "\n\t\tif (x && *x)\n\t\t\t*a = *(%s)(*x);\n\t\telse if ((*a = %s(%s_instantiate_%s(soap, SOAP_NO_LINK_TO_DELETE, soap->type, soap->arrayType, NULL))))\n\t\t{\tif (x)\n\t\t\t\t*x = (void*)a;\n\t\t}\n\t\telse\n\t\t\treturn NULL;", c_type_id(typ, "*"), c_type(typ), fprefix, c_ident(n)); else fprintf(fout, "\n\t\tif (x && *x)\n\t\t\t*a = *(%s)(*x);\n\t\telse\n\t\t{\t*a = %s<%s>();\n\t\t\tif (x)\n\t\t\t\t*x = (void*)a;\n\t\t}", c_type_id(typ, "*"), make_shared(typ), c_type(n)); } else if (n->type == Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n)) fprintf(fout, "\tif (!(*a = %s(%s_instantiate_%s(soap, SOAP_NO_LINK_TO_DELETE, soap->type, soap->arrayType, NULL))))\n\t\t\treturn NULL;", c_type(typ), fprefix, c_ident(n)); else fprintf(fout, "\tif (!(*a = %s(SOAP_NEW(soap, %s))))\n\t\t\treturn NULL;", c_type(typ), c_type(n)); fprintf(fout, "\n\t\tsoap_revert(soap);"); if (is_XML(n) && is_string(n)) fprintf(fout, "\n\t\tif (!soap_inliteral(soap, tag, (char*const*)a->get()))\n\t\t\treturn NULL;"); else if (is_XML(n) && is_wstring(n)) fprintf(fout, "\n\t\tif (!soap_inwliteral(soap, tag, (wchar_t*const*)a->get()))\n\t\t\treturn NULL;"); else if (n->type == Tarray) fprintf(fout, "\n\t\tif (!soap_in_%s(soap, tag, a->get(), \"%s\"))\n\t\t\treturn NULL;", c_ident(n), xsi_type(n)); else if (n->type == Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n)) { fprintf(fout, "\n\t\t(*a)->soap_default(soap);"); fprintf(fout, "\n\t\tif (!(*a)->soap_in(soap, tag, NULL))\n\t\t\treturn NULL;"); } else { fprintf(fout, "\n\t\tsoap_default_%s(soap, a->get());", c_ident(n)); fprintf(fout, "\n\t\tif (!soap_in_%s(soap, tag, a->get(), \"%s\"))\n\t\t\treturn NULL;", c_ident(n), xsi_type(n)); } fprintf(fout, "\n\t}\n\telse\n\t{"); fprintf(fout, "\tif (!soap_id_forward(soap, soap->href, a, 0, %s, %s, sizeof(%s), %d, %s_finsert, %s_fbase))\n\t\t\treturn NULL;", soap_type(reftype(n)), soap_type(typ), c_type(reftype(n)), reflevel(n) + 1, prefix, prefix); /* reflevel + 1 since smart pointer accepts derived types */ fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}\n\treturn a;\n}"); } else if (c11flag && (!strcmp(typ->id->name, "std::deque") || !strcmp(typ->id->name, "std::list") || (!strcmp(typ->id->name, "std::vector") && !is_bool(n)))) /* use C++11 emplace_back */ { fprintf(fout, "\n\tshort soap_flag;"); fprintf(fout, "\n\tfor (soap_flag = 0;; soap_flag = 1)\n\t{"); fprintf(fout, "\n\t\tif (tag && *tag != '-')\n\t\t{\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\t\t\tbreak;\n\t\t\tsoap_revert(soap);\n\t\t}"); fprintf(fout, "\n\t\tif (!a && !(a = soap_new_%s(soap)))\n\t\t\treturn NULL;", c_ident(typ)); if (!strcmp(typ->id->name, "std::vector") && !is_primitive(n) && n->type != Tpointer) { fprintf(fout, "\n\t\tif (!a->empty() && a->size() == a->capacity())\n\t\t{\tconst void *p = &a->front();"); fprintf(fout, "\n\t\t\ta->emplace_back();"); fprintf(fout, "\n\t\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Vector capacity increased to %%lu to fit %%lu items: updating pointers\\n\", a->capacity(), a->size()));"); fprintf(fout, "\n\t\t\tsoap_update_pointers(soap, (const char*)&a->front(), (const char*)p, (a->size() - 1) * sizeof(%s));", c_type(n)); fprintf(fout, "\n\t\t}\n\t\telse\n\t\t{\ta->emplace_back();\n\t\t}"); fprintf(fout, "\n\t\t%s *n = &a->back();\n\t\t", c_type(n)); } else { fprintf(fout, "\n\t\ta->emplace_back();\n\t\t%s *n = &a->back();\n\t\t", c_type(n)); } if (n->type == Tpointer) fprintf(fout, "*n = NULL;"); else if (n->type == Tarray) fprintf(fout, "soap_default_%s(soap, n);", c_ident(n)); else if (n->type == Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n)) fprintf(fout, "n->soap_default(soap);"); else if (n->type != Tfun && !is_void(n) && !is_XML(n)) fprintf(fout, "soap_default_%s(soap, n);", c_ident(n)); if (!is_primitive(n) && n->type != Tpointer) fprintf(fout, "\n\t\tshort soap_shaky = soap_begin_shaky(soap);"); fprintf(fout, "\n\t\tif (tag && *tag != '-' && (*soap->id || *soap->href == '#'))\n\t\t{\tif ("); fprintf(fout, "!soap_id_forward(soap, *soap->id?soap->id:soap->href, a, (size_t)a->size() - 1, %s, %s, sizeof(%s), %d, %s_finsert, %s_fbase))\n\t\t\t\tbreak;\n\t\t\tif (", soap_type(reftype(n)), soap_type(typ), c_type(reftype(n)), reflevel(n), prefix, prefix); if (is_XML(n) && is_string(n)) fprintf(fout, "!soap_inliteral(soap, tag, NULL)"); else if (is_XML(n) && is_wstring(n)) fprintf(fout, "!soap_inwliteral(soap, tag, NULL)"); else if (n->type == Tarray) fprintf(fout, "!soap_in_%s(soap, tag, NULL, \"%s\")", c_ident(n), xsi_type(n)); else fprintf(fout, "!soap_in_%s(soap, tag, NULL, \"%s\")", c_ident(n), xsi_type(n)); fprintf(fout, ")\n\t\t\t\tbreak;\n\t\t}\n\t\telse\n\t\t{\t"); if (is_XML(n) && is_string(n)) fprintf(fout, "if (!soap_inliteral(soap, tag, n))"); else if (is_XML(n) && is_wstring(n)) fprintf(fout, "if (!soap_inwliteral(soap, tag, n))"); else if (n->type == Tarray) fprintf(fout, "if (!soap_in_%s(soap, tag, n, \"%s\"))", c_ident(n), xsi_type(n)); else fprintf(fout, "if (!soap_in_%s(soap, tag, n, \"%s\"))", c_ident(n), xsi_type(n)); fprintf(fout, "\n\t\t\t{\ta->pop_back();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}"); if (!is_primitive(n) && n->type != Tpointer) fprintf(fout, "\n\t\tsoap_end_shaky(soap, soap_shaky);"); fprintf(fout, "\n\t\tif (!tag || *tag == '-')\n\t\t\treturn a;\n\t}\n\tif (soap_flag && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))\n\t{\tsoap->error = SOAP_OK;\n\t\treturn a;\n\t}\n\treturn NULL;\n}"); } else { fprintf(fout, "\n\tshort soap_flag;"); fprintf(fout, "\n\tfor (soap_flag = 0;; soap_flag = 1)\n\t{"); fprintf(fout, "\n\t\tif (tag && *tag != '-')\n\t\t{\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\t\t\tbreak;\n\t\t\tsoap_revert(soap);\n\t\t}"); fprintf(fout, "\n\t\tif (!a && !(a = soap_new_%s(soap)))\n\t\t\treturn NULL;", c_ident(typ)); fprintf(fout, "\n\t\telse if (static_cast(a->size()) > soap->maxoccurs)\n\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\treturn NULL;\n\t\t}"); fprintf(fout, "\n\t\t%s;\n\t\t", c_type_id(n, "n")); if (n->type == Tpointer) fprintf(fout, "n = NULL;"); else if (n->type == Tarray) fprintf(fout, "soap_default_%s(soap, &n);", c_ident(n)); else if (n->type == Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n)) fprintf(fout, "n.soap_default(soap);"); else if (n->type != Tfun && !is_void(n) && !is_XML(n) && !is_smart(n)) fprintf(fout, "soap_default_%s(soap, &n);", c_ident(n)); if (!is_primitive(n) && n->type != Tpointer) fprintf(fout, "\n\t\tshort soap_shaky = soap_begin_shaky(soap);"); fprintf(fout, "\n\t\tif (tag && *tag != '-' && (*soap->id || *soap->href == '#'))\n\t\t{\tif ("); fprintf(fout, "!soap_id_forward(soap, *soap->id?soap->id:soap->href, a, static_cast(a->size()), %s, %s, sizeof(%s), %d, %s_finsert, %s_fbase))\n\t\t\t\tbreak;\n\t\t\tif (", soap_type(reftype(n)), soap_type(typ), c_type(reftype(n)), reflevel(n), prefix, prefix); if (is_XML(n) && is_string(n)) fprintf(fout, "!soap_inliteral(soap, tag, NULL)"); else if (is_XML(n) && is_wstring(n)) fprintf(fout, "!soap_inwliteral(soap, tag, NULL)"); else if (n->type == Tarray) fprintf(fout, "!soap_in_%s(soap, tag, NULL, \"%s\")", c_ident(n), xsi_type(n)); else fprintf(fout, "!soap_in_%s(soap, tag, NULL, \"%s\")", c_ident(n), xsi_type(n)); fprintf(fout, ")\n\t\t\t\tbreak;\n\t\t}\n\t\telse\n\t\t{\t"); if (is_XML(n) && is_string(n)) fprintf(fout, "if (!soap_inliteral(soap, tag, &n))"); else if (is_XML(n) && is_wstring(n)) fprintf(fout, "if (!soap_inwliteral(soap, tag, &n))"); else if (n->type == Tarray) fprintf(fout, "if (!soap_in_%s(soap, tag, &n, \"%s\"))", c_ident(n), xsi_type(n)); else fprintf(fout, "if (!soap_in_%s(soap, tag, &n, \"%s\"))", c_ident(n), xsi_type(n)); fprintf(fout, "\n\t\t\t\tbreak;\n\t\t}"); if (!is_primitive(n) && n->type != Tpointer) fprintf(fout, "\n\t\tsoap_end_shaky(soap, soap_shaky);"); if (!(!strcmp(typ->id->name, "std::list") || !strcmp(typ->id->name, "std::deque") || !strcmp(typ->id->name, "std::set")) && !is_primitive(n) && n->type != Tpointer && !is_smart(n)) { fprintf(fout, "\n\t\tif (a->size())\n\t\t{\tconst void *p = &*a->begin();\n\t\t\tsoap_update_pointers(soap, (const char*)&(*a->insert(a->end(), n)), (const char*)&n, sizeof(%s));", c_type(n)); fprintf(fout, "\n\t\t\tif (p != &*a->begin())\n\t\t\t{\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Container capacity increased: updating pointers\\n\"));"); fprintf(fout, "\n\t\t\t\tsoap_update_pointers(soap, (const char*)&*a->begin(), (const char*)p, (a->size() - 1) * sizeof(%s));\n\t\t\t}", c_type(n)); fprintf(fout, "\n\t\t}\n\t\telse\n\t\t{\tsoap_update_pointers(soap, (const char*)&(*a->insert(a->end(), n)), (const char*)&n, sizeof(%s));", c_type(n)); fprintf(fout, "\n\t\t}"); } else { if (is_primitive(n) || n->type == Tpointer || is_smart(n)) fprintf(fout, "\n\t\ta->insert(a->end(), n);"); else fprintf(fout, "\n\t\tsoap_update_pointers(soap, (const char*)&(*a->insert(a->end(), n)), (const char*)&n, sizeof(%s));", c_type(n)); } fprintf(fout, "\n\t\tif (!tag || *tag == '-')\n\t\t\treturn a;\n\t}\n\tif (soap_flag && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))\n\t{\tsoap->error = SOAP_OK;\n\t\treturn a;\n\t}\n\treturn NULL;\n}"); } break; default: break; } fflush(fout); } void soap_in_Darray(Tnode *typ) { int i, j, d; Entry *p; Table *t; const char *nsa = ns_qualifiedAttribute(typ); p = is_dynamic_array(typ); d = get_Darraydims(typ); fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); if (is_external(typ)) return; if (is_binary(typ)) { fprintf(fhead, "\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap*, const char*, %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap *soap, const char *s, %s)\n{", c_ident(typ), c_type_id(typ, "*a")); if (is_hexBinary(typ)) fprintf(fout, "\n\ta->__ptr = (unsigned char*)soap_hex2s(soap, s, NULL, 0, &a->__size);"); else fprintf(fout, "\n\ta->__ptr = (unsigned char*)soap_base642s(soap, s, NULL, 0, &a->__size);"); fprintf(fout, "\n\tif (!a->__ptr)\n\t\treturn soap->error;"); if (typ->hasmin) { long min = minlen(typ); if (min > 0) fprintf(fout, "\n\tif (a->__size < %ld)\n\t\treturn soap->error = SOAP_LENGTH;", min); } if (typ->hasmax) { long max = maxlen(typ); if (max >= 0) fprintf(fout, "\n\tif (a->__size > %ld)\n\t\treturn soap->error = SOAP_LENGTH;", max); } fprintf(fout, "\n\treturn SOAP_OK;\n}"); } if (typ->type == Tclass && !is_volatile(typ) && !is_typedef(typ)) { fprintf(fout, "\n\nvoid *%s::soap_in(struct soap *soap, const char *tag, const char *type)", c_type(typ)); fprintf(fout, "\n{\n\treturn soap_in_%s(soap, tag, this, type);\n}", c_ident(typ)); } fflush(fout); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*a")); if (is_binary(typ)) fprintf(fout, "\n{"); else if (d) fprintf(fout, "\n{\n\tsize_t i, n;\n\tint j;\n\t%s;", c_type_id(p->info.typ, "p")); else fprintf(fout, "\n{\n\tint i, j;\n\t%s;", c_type_id(p->info.typ, "p")); fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;"); if (is_hexBinary(typ)) fprintf(fout, "\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \":hexBinary\"))"); else if (is_binary(typ)) fprintf(fout, "\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \":base64Binary\") && soap_match_tag(soap, soap->type, \":base64\"))"); else if (has_ns(typ) || is_untyped(typ)) fprintf(fout, "\n\tif (*soap->type && soap_match_array(soap, \"%s\") && soap_match_tag(soap, soap->type, type))", xsi_type((Tnode*)p->info.typ->ref)); else fprintf(fout, "\n\tif (soap_match_array(soap, type))"); fprintf(fout, "\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}"); if (typ->type == Tclass) { fprintf(fout, "\n\ta = (%s*)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType, %s_instantiate, %s_fbase);", c_type(typ), soap_type(typ), c_type(typ), prefix, prefix); fprintf(fout, "\n\tif (!a)\n\t\treturn NULL;"); fprintf(fout, "\n\ta->soap_default(soap);"); for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa)); } } else { fprintf(fout, "\n\ta = (%s*)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), NULL, NULL, NULL, NULL);", c_type(typ), soap_type(typ), c_type(typ)); fprintf(fout, "\n\tif (!a)\n\t\treturn NULL;"); fprintf(fout, "\n\tsoap_default_%s(soap, a);", c_ident(typ)); for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, "a", ident(p->sym->name), ns_add(p, nsa)); } } if (is_attachment(typ)) fprintf(fout, "\n\tif (soap->body && !*soap->href)\n\t{"); else fprintf(fout, "\n\tif (soap->body && *soap->href != '#')\n\t{"); p = is_dynamic_array(typ); if (is_binary(typ)) { if (is_hexBinary(typ)) fprintf(fout, "\n\t\ta->__ptr = soap_gethex(soap, &a->__size);"); else { fprintf(fout, "\n\t\ta->__ptr = soap_getbase64(soap, &a->__size, 0);"); if (is_attachment(typ)) fprintf(fout, "\n#ifndef WITH_LEANER\n\t\tif (soap_xop_forward(soap, &a->__ptr, &a->__size, &a->id, &a->type, &a->options))\n\t\t\treturn NULL;\n#endif"); } fprintf(fout, "\n\t\tif ((!a->__ptr && soap->error) || soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); if (typ->hasmin) { long min = minlen(typ); if (min > 0) fprintf(fout, "\n\t\tif (a->__size < %ld)\n\t\t{\tsoap->error = SOAP_LENGTH;\n\t\t\treturn NULL;\n\t\t}", min); } if (typ->hasmax) { long max = maxlen(typ); if (max >= 0) fprintf(fout, "\n\t\tif (a->__size > %ld)\n\t\t{\tsoap->error = SOAP_LENGTH;\n\t\t\treturn NULL;\n\t\t}", max); } } else { fprintf(fout, "\n\t\tif (*soap->arraySize)\n\t\t{"); if (d) { fprintf(fout, "\n\t\t\tn = soap_getsizes(soap->arraySize, a->__size, %d);", d); if (has_offset(typ)) fprintf(fout, "\n\t\t\tn -= j = soap_getoffsets(soap->arrayOffset, a->__size, a->__offset, %d);", d); else fprintf(fout, "\n\t\t\tn -= j = soap_getoffsets(soap->arrayOffset, a->__size, NULL, %d);", d); if (p->info.minOccurs > 0) fprintf(fout, "\n\t\t\tif (%sn < " SOAP_LONG_FORMAT ")\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}", strict_check(), p->info.minOccurs); if (p->info.maxOccurs > 1) fprintf(fout, "\n\t\t\t\tif (%sn > " SOAP_LONG_FORMAT ")\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}", strict_check(), p->info.maxOccurs); else fprintf(fout, "\n\t\t\tif (n > soap->maxoccurs)\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}"); if (((Tnode*)p->info.typ->ref)->type == Tclass || (((Tnode*)p->info.typ->ref)->type == Tstruct && !cflag)) { fprintf(fout, "\n\t\t\ta->%s = soap_new_%s(soap, n);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref)); if (!is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref) && ((Tnode*)p->info.typ->ref)->type == Tclass) fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\t(a->%s+i)->%s::soap_default(soap);", ident(p->sym->name), c_type((Tnode*)p->info.typ->ref)); else if (((Tnode*)p->info.typ->ref)->type == Tpointer) fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } else if (has_class((Tnode*)p->info.typ->ref)) { fprintf(fout, "\n\t\t\ta->%s = soap_new_%s(soap, n);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref)); fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } else { fprintf(fout, "\n\t\t\ta->%s = (%s)soap_malloc(soap, n * sizeof(%s));", ident(p->sym->name), c_type_id((Tnode*)p->info.typ->ref, "*"), c_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tpointer) fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\ta->%s[i] = NULL;", ident(p->sym->name)); else if (!is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)"); fprintf(fout, "\n\t\t\t{\tsoap_peek_element(soap);\n\t\t\t\tif (soap->position == %d)", d); fprintf(fout, "\n\t\t\t\t{\ti = (size_t)("); for (i = 0; i < d; i++) { fprintf(fout, "soap->positions[%d]", i); for (j = 1; j < d-i; j++) fprintf(fout, "*a->__size[%d]", j); if (i < d-1) fprintf(fout, "+"); } fprintf(fout, "-j);"); fprintf(fout, "\n\t\t\t\t\tif (i >= n)\n\t\t\t\t\t{\tsoap->error = SOAP_IOB;\n\t\t\t\t\t\treturn NULL;\n\t\t\t\t\t}\n\t\t\t\t}"); fprintf(fout, "\n\t\t\t\tif (!soap_in_%s(soap, NULL, a->%s + i, \"%s\"))", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type((Tnode*)p->info.typ->ref)); fprintf(fout, "\n\t\t\t\t{\tif (soap->error != SOAP_NO_TAG)\n\t\t\t\t\t\treturn NULL;"); fprintf(fout, "\n\t\t\t\t\tsoap->error = SOAP_OK;"); fprintf(fout, "\n\t\t\t\t\tbreak;"); fprintf(fout, "\n\t\t\t\t}"); } else { fprintf(fout, "\n\t\t\tsoap_getsizes(soap->arraySize, &a->__size, 1);"); if (has_offset(typ)) fprintf(fout, "\n\t\t\ta->__size -= j = soap_getoffsets(soap->arrayOffset, &a->__size, &a->__offset, 1);"); else fprintf(fout, "\n\t\t\ta->__size -= j = soap_getoffsets(soap->arrayOffset, &a->__size, NULL, 1);"); if (p->info.minOccurs > 0) fprintf(fout, "\n\t\t\tif (%sa->__size < " SOAP_LONG_FORMAT ")\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}", strict_check(), p->info.minOccurs); if (p->info.maxOccurs > 1) fprintf(fout, "\n\t\t\tif (%sa->__size > " SOAP_LONG_FORMAT ")\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}", strict_check(), p->info.maxOccurs); else fprintf(fout, "\n\t\t\tif ((size_t)a->__size > soap->maxoccurs)\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}"); if (((Tnode*)p->info.typ->ref)->type == Tclass || (((Tnode*)p->info.typ->ref)->type == Tstruct && !cflag)) { fprintf(fout, "\n\t\t\ta->%s = soap_new_%s(soap, a->__size);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref)); if (!is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref) && ((Tnode*)p->info.typ->ref)->type == Tclass) fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\t(a->%s+i)->%s::soap_default(soap);", ident(p->sym->name), c_type((Tnode*)p->info.typ->ref)); else fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } else if (has_class((Tnode*)p->info.typ->ref)) { fprintf(fout, "\n\t\t\ta->%s = soap_new_%s(soap, a->__size);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref)); fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } else { fprintf(fout, "\n\t\t\ta->%s = (%s)soap_malloc(soap, sizeof(%s) * a->__size);", ident(p->sym->name), c_type_id((Tnode*)p->info.typ->ref, "*"), c_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tpointer) fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\ta->%s[i] = NULL;", ident(p->sym->name)); else if (!is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)"); fprintf(fout, "\n\t\t\t{\tsoap_peek_element(soap);\n\t\t\t\tif (soap->position)\n\t\t\t\t{\ti = soap->positions[0]-j;\n\t\t\t\t\tif (i < 0 || i >= a->__size)\n\t\t\t\t\t{\tsoap->error = SOAP_IOB;\n\t\t\t\t\t\treturn NULL;\n\t\t\t\t\t}\n\t\t\t\t}"); if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (!soap_inliteral(soap, NULL, (char**)(a->%s + i)))", ident(p->sym->name)); else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (!soap_inwliteral(soap, NULL, (wchar_t**)(a->%s + i)))", ident(p->sym->name)); else if (is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (!soap_in_%s(soap, NULL, (char**)(a->%s + i), \"%s\"))", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type((Tnode*)p->info.typ->ref)); else if (is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (!soap_in_%s(soap, NULL, (wchar_t**)(a->%s + i), \"%s\"))", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type((Tnode*)p->info.typ->ref)); else fprintf(fout, "\n\t\t\t\tif (!soap_in_%s(soap, NULL, a->%s + i, \"%s\"))", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type((Tnode*)p->info.typ->ref)); fprintf(fout, "\n\t\t\t\t{\tif (soap->error != SOAP_NO_TAG)\n\t\t\t\t\t\treturn NULL;"); fprintf(fout, "\n\t\t\t\t\tsoap->error = SOAP_OK;"); fprintf(fout, "\n\t\t\t\t\tbreak;"); fprintf(fout, "\n\t\t\t\t}"); } fprintf(fout, "\n\t\t\t}\n\t\t}\n\t\telse"); fprintf(fout, "\n\t\t{\tif (soap_alloc_block(soap) == NULL)\n\t\t\t\treturn NULL;"); if (d) { for (i = 1; i < d; i++) fprintf(fout, "\n\t\t\ta->__size[%d] = 1;", i); fprintf(fout, "\n\t\t\tfor (a->__size[0] = 0; ; a->__size[0]++)\n\t\t\t{"); } else { fprintf(fout, "\n\t\t\tfor (a->__size = 0; ; a->__size++)\n\t\t\t{"); } if (((Tnode*)p->info.typ->ref)->type == Tclass || ((Tnode*)p->info.typ->ref)->type == Ttemplate || has_class((Tnode*)p->info.typ->ref) || (!cflag && ((Tnode*)p->info.typ->ref)->type == Tstruct)) fprintf(fout, "\tp = soap_block<%s>::push(soap, NULL);\n\t\t\t\tif (!p)\n\t\t\t\t\tbreak;", c_type((Tnode*)p->info.typ->ref)); else fprintf(fout, "\tp = (%s)soap_push_block(soap, NULL, sizeof(%s));\n\t\t\t\tif (!p)\n\t\t\t\t\tbreak;", c_type(p->info.typ), c_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tp->soap_default(soap);"); else if (((Tnode*)p->info.typ->ref)->type == Tpointer) fprintf(fout, "\n\t\t\t\t*p = NULL;"); else if (!is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tsoap_default_%s(soap, p);", c_ident((Tnode*)p->info.typ->ref)); if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (!soap_inliteral(soap, NULL, p))"); else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (!soap_inwliteral(soap, NULL, p))"); else fprintf(fout, "\n\t\t\t\tif (!soap_in_%s(soap, NULL, p, \"%s\"))", c_ident((Tnode*)p->info.typ->ref), xsi_type((Tnode*)p->info.typ->ref)); fprintf(fout, "\n\t\t\t\t{\tif (soap->error == SOAP_NO_TAG)"); fprintf(fout, "\n\t\t\t\t\t\tsoap->error = SOAP_OK;"); if (((Tnode*)p->info.typ->ref)->type == Tclass || ((Tnode*)p->info.typ->ref)->type == Ttemplate || has_class((Tnode*)p->info.typ->ref) || (!cflag && ((Tnode*)p->info.typ->ref)->type == Tstruct)) fprintf(fout, "\n\t\t\t\t\tsoap_block<%s>::pop(soap, NULL);", c_type((Tnode*)p->info.typ->ref)); else fprintf(fout, "\n\t\t\t\t\tsoap_pop_block(soap, NULL);"); fprintf(fout, "\n\t\t\t\t\tbreak;"); fprintf(fout, "\n\t\t\t\t}"); if (d) { if (p->info.maxOccurs > 1) fprintf(fout, "\n\t\t\t\tif (%sa->__size[0] > " SOAP_LONG_FORMAT ")", strict_check(), p->info.maxOccurs); else fprintf(fout, "\n\t\t\t\tif ((size_t)a->__size[0] > soap->maxoccurs)"); } else { if (p->info.maxOccurs > 1) fprintf(fout, "\n\t\t\t\tif (%sa->__size > " SOAP_LONG_FORMAT ")", strict_check(), p->info.maxOccurs); else fprintf(fout, "\n\t\t\t\tif ((size_t)a->__size > soap->maxoccurs)"); } fprintf(fout, "\n\t\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\t\treturn NULL;\n\t\t\t\t}"); fprintf(fout, "\n\t\t\t}"); if (p->info.minOccurs > 0) { if (d) fprintf(fout, "\n\t\t\tif (%sa->__size[0] < " SOAP_LONG_FORMAT ")\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}", strict_check(), p->info.minOccurs); else fprintf(fout, "\n\t\t\tif (%sa->__size < " SOAP_LONG_FORMAT ")\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}", strict_check(), p->info.minOccurs); } if (((Tnode*)p->info.typ->ref)->type == Tclass || ((Tnode*)p->info.typ->ref)->type == Ttemplate || has_class((Tnode*)p->info.typ->ref) || (!cflag && ((Tnode*)p->info.typ->ref)->type == Tstruct)) { fprintf(fout, "\n\t\t\tif (soap->blist->size)\n\t\t\t\ta->%s = soap_new_%s(soap, soap->blist->size/sizeof(%s));\n\t\t\telse\n\t\t\t\ta->%s = NULL;", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref), c_type((Tnode*)p->info.typ->ref), ident(p->sym->name)); fprintf(fout, "\n\t\t\tif (a->%s)\n\t\t\t\tsoap_block<%s>::save(soap, NULL, a->%s);\n\t\t\telse\n\t\t\t\tsoap_block<%s>::end(soap, NULL);", ident(p->sym->name), c_type((Tnode*)p->info.typ->ref), ident(p->sym->name), c_type((Tnode*)p->info.typ->ref)); } else fprintf(fout, "\n\t\t\ta->%s = (%s)soap_save_block(soap, NULL, NULL, 1);", ident(p->sym->name), c_type(p->info.typ)); fprintf(fout, "\n\t\t}"); fprintf(fout, "\n\t\tif (soap->error || soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); } if (has_getter(typ)) fprintf(fout, "\n\t\tif (a->get(soap))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}\n\telse\n\t{\t"); if (is_attachment(typ)) fprintf(fout, "\n#ifndef WITH_LEANER\n\t\tif (*soap->href != '#')\n\t\t{\tif (soap_attachment_forward(soap, &a->__ptr, &a->__size, &a->id, &a->type, &a->options))\n\t\t\t\treturn NULL;\n\t\t}\n\t\telse\n#endif\n\t\t\t"); if (typ->type == Tclass || (!cflag && typ->type == Tstruct)) fprintf(fout, "a = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, %s, sizeof(%s), 0, %s_finsert, %s_fbase);", c_type_id(typ, "*"), soap_type(typ), soap_type(typ), c_type(typ), prefix, prefix); else fprintf(fout, "a = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, %s, sizeof(%s), 0, NULL, NULL);", c_type_id(typ, "*"), soap_type(typ), soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}"); fprintf(fout, "\n\treturn a;\n}"); } const char * cstring(const char *s, int q) { size_t n; char *t; const char *r; for (n = 0, r = s; *r; n++, r++) { if (*r == '"' || *r == '\\') n++; else if (*r < 32) n += 3; } r = t = (char*)emalloc(n + 2*q + 1); if (q) *t++ = '"'; for (; *s; s++) { if (*s == '"' || *s == '\\') { *t++ = '\\'; *t++ = *s; } else if (*s < 32) { sprintf(t, "\\%03o", (unsigned int)(unsigned char)*s); t += 4; } else *t++ = *s; } if (q) *t++ = '"'; *t = '\0'; return r; } const char * xstring(const char *s) { size_t n; char *t; const char *r; for (n = 0, r = s; *r; n++, r++) { if (*r < 32 || *r >= 127) n += 4; else if (*r == '<' || *r == '>') n += 3; else if (*r == '&') n += 4; else if (*r == '"') n += 5; else if (*r == '\\') n += 1; } r = t = (char*)emalloc(n + 1); for (; *s; s++) { if (*s < 32 || *s >= 127) { sprintf(t, "&#%.2x;", (unsigned char)*s); t += 5; } else if (*s == '<') { strcpy(t, "<"); t += 4; } else if (*s == '>') { strcpy(t, ">"); t += 4; } else if (*s == '&') { strcpy(t, "&"); t += 5; } else if (*s == '"') { strcpy(t, """); t += 6; } else if (*s == '\\') { strcpy(t, "\\\\"); t += 2; } else *t++ = *s; } *t = '\0'; return r; } void set_namespace(const char *id) { namespaceid = id; if (id) { const char *s = id; int h = 0; while (*s) h = 65599*h + *s++; if (h == 0) h = 1; h <<= 12; /* permits 4096 unique types */ if (h < 0) h = -h; typeNO = h; } } gsoap-2.8.91/gsoap/Makefile.in0000644000175000017500000016546613525245161015470 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gsoap ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgdatadir)" \ "$(DESTDIR)$(includedir)" LIBRARIES = $(lib_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libgsoap___a_AR = $(AR) $(ARFLAGS) libgsoap___a_LIBADD = am_libgsoap___a_OBJECTS = libgsoap___a-stdsoap2_cpp.$(OBJEXT) \ libgsoap___a-dom_cpp.$(OBJEXT) libgsoap___a_OBJECTS = $(am_libgsoap___a_OBJECTS) libgsoap_a_AR = $(AR) $(ARFLAGS) libgsoap_a_LIBADD = am_libgsoap_a_OBJECTS = libgsoap_a-stdsoap2.$(OBJEXT) \ libgsoap_a-dom.$(OBJEXT) libgsoap_a_OBJECTS = $(am_libgsoap_a_OBJECTS) libgsoapck___a_AR = $(AR) $(ARFLAGS) libgsoapck___a_LIBADD = am_libgsoapck___a_OBJECTS = libgsoapck___a-stdsoap2_ck_cpp.$(OBJEXT) \ libgsoapck___a-dom_cpp.$(OBJEXT) libgsoapck___a_OBJECTS = $(am_libgsoapck___a_OBJECTS) libgsoapck_a_AR = $(AR) $(ARFLAGS) libgsoapck_a_LIBADD = am_libgsoapck_a_OBJECTS = libgsoapck_a-stdsoap2_ck.$(OBJEXT) \ libgsoapck_a-dom.$(OBJEXT) libgsoapck_a_OBJECTS = $(am_libgsoapck_a_OBJECTS) libgsoapssl___a_AR = $(AR) $(ARFLAGS) libgsoapssl___a_LIBADD = am_libgsoapssl___a_OBJECTS = \ libgsoapssl___a-stdsoap2_ssl_cpp.$(OBJEXT) \ libgsoapssl___a-dom_cpp.$(OBJEXT) libgsoapssl___a_OBJECTS = $(am_libgsoapssl___a_OBJECTS) libgsoapssl_a_AR = $(AR) $(ARFLAGS) libgsoapssl_a_LIBADD = am_libgsoapssl_a_OBJECTS = libgsoapssl_a-stdsoap2_ssl.$(OBJEXT) \ libgsoapssl_a-dom.$(OBJEXT) libgsoapssl_a_OBJECTS = $(am_libgsoapssl_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/libgsoap___a-dom_cpp.Po \ ./$(DEPDIR)/libgsoap___a-stdsoap2_cpp.Po \ ./$(DEPDIR)/libgsoap_a-dom.Po \ ./$(DEPDIR)/libgsoap_a-stdsoap2.Po \ ./$(DEPDIR)/libgsoapck___a-dom_cpp.Po \ ./$(DEPDIR)/libgsoapck___a-stdsoap2_ck_cpp.Po \ ./$(DEPDIR)/libgsoapck_a-dom.Po \ ./$(DEPDIR)/libgsoapck_a-stdsoap2_ck.Po \ ./$(DEPDIR)/libgsoapssl___a-dom_cpp.Po \ ./$(DEPDIR)/libgsoapssl___a-stdsoap2_ssl_cpp.Po \ ./$(DEPDIR)/libgsoapssl_a-dom.Po \ ./$(DEPDIR)/libgsoapssl_a-stdsoap2_ssl.Po am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libgsoap___a_SOURCES) $(libgsoap_a_SOURCES) \ $(libgsoapck___a_SOURCES) $(libgsoapck_a_SOURCES) \ $(libgsoapssl___a_SOURCES) $(libgsoapssl_a_SOURCES) DIST_SOURCES = $(libgsoap___a_SOURCES) $(libgsoap_a_SOURCES) \ $(libgsoapck___a_SOURCES) $(libgsoapck_a_SOURCES) \ $(libgsoapssl___a_SOURCES) $(libgsoapssl_a_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(nobase_pkgdata_DATA) HEADERS = $(include_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir distdir-am am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SUBDIRS = . src wsdl @SAMPLE_DIRS@ CLEANFILES = soapcpp2 wsdl2h stdsoap2_cpp.cpp stdsoap2_ck.c stdsoap2_ck_cpp.cpp stdsoap2_ssl.c stdsoap2_ssl_cpp.cpp dom_cpp.cpp AM_CXXFLAGS = $(SOAPCPP2_DEBUG) -D$(platform) AM_CFLAGS = $(SOAPCPP2_DEBUG) -D$(platform) # Install all soapcpp2 and wsdl2h files into ${prefix}/share/gsoap nobase_pkgdata_DATA = $(top_srcdir)/gsoap/import/* $(top_srcdir)/gsoap/plugin/* $(top_srcdir)/gsoap/WS/* $(top_srcdir)/gsoap/custom/* $(top_srcdir)/gsoap/extras/* lib_LIBRARIES = libgsoap.a libgsoap++.a libgsoapck.a libgsoapck++.a libgsoapssl.a libgsoapssl++.a libgsoap_a_SOURCES = stdsoap2.c dom.c libgsoap_a_CFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_NO_C_LOCALE) $(SOAPCPP2_IPV6) $(SOAPCPP2_IPV6_V6ONLY) -D$(platform) libgsoap___a_SOURCES = stdsoap2_cpp.cpp dom_cpp.cpp libgsoap___a_CXXFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_NO_C_LOCALE) $(SOAPCPP2_IPV6) $(SOAPCPP2_IPV6_V6ONLY) -D$(platform) libgsoapck_a_SOURCES = stdsoap2_ck.c dom.c libgsoapck_a_CFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_NO_C_LOCALE) $(SOAPCPP2_IPV6) $(SOAPCPP2_IPV6_V6ONLY) -D$(platform) -DWITH_COOKIES libgsoapck___a_SOURCES = stdsoap2_ck_cpp.cpp dom_cpp.cpp libgsoapck___a_CXXFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_NO_C_LOCALE) $(SOAPCPP2_IPV6) $(SOAPCPP2_IPV6_V6ONLY) -D$(platform) -DWITH_COOKIES libgsoapssl_a_SOURCES = stdsoap2_ssl.c dom.c libgsoapssl_a_CFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_NO_C_LOCALE) $(SOAPCPP2_IPV6) $(SOAPCPP2_IPV6_V6ONLY) -D$(platform) $(WSDL2H_EXTRA_FLAGS) -DWITH_DOM -DWITH_COOKIES libgsoapssl___a_SOURCES = stdsoap2_ssl_cpp.cpp dom_cpp.cpp libgsoapssl___a_CXXFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_NO_C_LOCALE) $(SOAPCPP2_IPV6) $(SOAPCPP2_IPV6_V6ONLY) -D$(platform) $(WSDL2H_EXTRA_FLAGS) -DWITH_DOM -DWITH_COOKIES BUILT_SOURCES = stdsoap2_cpp.cpp dom_cpp.cpp stdsoap2_ck.c stdsoap2_ck_cpp.cpp stdsoap2_ssl.c stdsoap2_ssl_cpp.cpp include_HEADERS = stdsoap2.h all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .c .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLIBRARIES: $(lib_LIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(INSTALL_DATA) $$list2 '$(DESTDIR)$(libdir)'"; \ $(INSTALL_DATA) $$list2 "$(DESTDIR)$(libdir)" || exit $$?; } @$(POST_INSTALL) @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ if test -f $$p; then \ $(am__strip_dir) \ echo " ( cd '$(DESTDIR)$(libdir)' && $(RANLIB) $$f )"; \ ( cd "$(DESTDIR)$(libdir)" && $(RANLIB) $$f ) || exit $$?; \ else :; fi; \ done uninstall-libLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(libdir)'; $(am__uninstall_files_from_dir) clean-libLIBRARIES: -test -z "$(lib_LIBRARIES)" || rm -f $(lib_LIBRARIES) libgsoap++.a: $(libgsoap___a_OBJECTS) $(libgsoap___a_DEPENDENCIES) $(EXTRA_libgsoap___a_DEPENDENCIES) $(AM_V_at)-rm -f libgsoap++.a $(AM_V_AR)$(libgsoap___a_AR) libgsoap++.a $(libgsoap___a_OBJECTS) $(libgsoap___a_LIBADD) $(AM_V_at)$(RANLIB) libgsoap++.a libgsoap.a: $(libgsoap_a_OBJECTS) $(libgsoap_a_DEPENDENCIES) $(EXTRA_libgsoap_a_DEPENDENCIES) $(AM_V_at)-rm -f libgsoap.a $(AM_V_AR)$(libgsoap_a_AR) libgsoap.a $(libgsoap_a_OBJECTS) $(libgsoap_a_LIBADD) $(AM_V_at)$(RANLIB) libgsoap.a libgsoapck++.a: $(libgsoapck___a_OBJECTS) $(libgsoapck___a_DEPENDENCIES) $(EXTRA_libgsoapck___a_DEPENDENCIES) $(AM_V_at)-rm -f libgsoapck++.a $(AM_V_AR)$(libgsoapck___a_AR) libgsoapck++.a $(libgsoapck___a_OBJECTS) $(libgsoapck___a_LIBADD) $(AM_V_at)$(RANLIB) libgsoapck++.a libgsoapck.a: $(libgsoapck_a_OBJECTS) $(libgsoapck_a_DEPENDENCIES) $(EXTRA_libgsoapck_a_DEPENDENCIES) $(AM_V_at)-rm -f libgsoapck.a $(AM_V_AR)$(libgsoapck_a_AR) libgsoapck.a $(libgsoapck_a_OBJECTS) $(libgsoapck_a_LIBADD) $(AM_V_at)$(RANLIB) libgsoapck.a libgsoapssl++.a: $(libgsoapssl___a_OBJECTS) $(libgsoapssl___a_DEPENDENCIES) $(EXTRA_libgsoapssl___a_DEPENDENCIES) $(AM_V_at)-rm -f libgsoapssl++.a $(AM_V_AR)$(libgsoapssl___a_AR) libgsoapssl++.a $(libgsoapssl___a_OBJECTS) $(libgsoapssl___a_LIBADD) $(AM_V_at)$(RANLIB) libgsoapssl++.a libgsoapssl.a: $(libgsoapssl_a_OBJECTS) $(libgsoapssl_a_DEPENDENCIES) $(EXTRA_libgsoapssl_a_DEPENDENCIES) $(AM_V_at)-rm -f libgsoapssl.a $(AM_V_AR)$(libgsoapssl_a_AR) libgsoapssl.a $(libgsoapssl_a_OBJECTS) $(libgsoapssl_a_LIBADD) $(AM_V_at)$(RANLIB) libgsoapssl.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsoap___a-dom_cpp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsoap___a-stdsoap2_cpp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsoap_a-dom.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsoap_a-stdsoap2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsoapck___a-dom_cpp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsoapck___a-stdsoap2_ck_cpp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsoapck_a-dom.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsoapck_a-stdsoap2_ck.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsoapssl___a-dom_cpp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsoapssl___a-stdsoap2_ssl_cpp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsoapssl_a-dom.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsoapssl_a-stdsoap2_ssl.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` libgsoap_a-stdsoap2.o: stdsoap2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap_a_CFLAGS) $(CFLAGS) -MT libgsoap_a-stdsoap2.o -MD -MP -MF $(DEPDIR)/libgsoap_a-stdsoap2.Tpo -c -o libgsoap_a-stdsoap2.o `test -f 'stdsoap2.c' || echo '$(srcdir)/'`stdsoap2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoap_a-stdsoap2.Tpo $(DEPDIR)/libgsoap_a-stdsoap2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stdsoap2.c' object='libgsoap_a-stdsoap2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap_a_CFLAGS) $(CFLAGS) -c -o libgsoap_a-stdsoap2.o `test -f 'stdsoap2.c' || echo '$(srcdir)/'`stdsoap2.c libgsoap_a-stdsoap2.obj: stdsoap2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap_a_CFLAGS) $(CFLAGS) -MT libgsoap_a-stdsoap2.obj -MD -MP -MF $(DEPDIR)/libgsoap_a-stdsoap2.Tpo -c -o libgsoap_a-stdsoap2.obj `if test -f 'stdsoap2.c'; then $(CYGPATH_W) 'stdsoap2.c'; else $(CYGPATH_W) '$(srcdir)/stdsoap2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoap_a-stdsoap2.Tpo $(DEPDIR)/libgsoap_a-stdsoap2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stdsoap2.c' object='libgsoap_a-stdsoap2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap_a_CFLAGS) $(CFLAGS) -c -o libgsoap_a-stdsoap2.obj `if test -f 'stdsoap2.c'; then $(CYGPATH_W) 'stdsoap2.c'; else $(CYGPATH_W) '$(srcdir)/stdsoap2.c'; fi` libgsoap_a-dom.o: dom.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap_a_CFLAGS) $(CFLAGS) -MT libgsoap_a-dom.o -MD -MP -MF $(DEPDIR)/libgsoap_a-dom.Tpo -c -o libgsoap_a-dom.o `test -f 'dom.c' || echo '$(srcdir)/'`dom.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoap_a-dom.Tpo $(DEPDIR)/libgsoap_a-dom.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dom.c' object='libgsoap_a-dom.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap_a_CFLAGS) $(CFLAGS) -c -o libgsoap_a-dom.o `test -f 'dom.c' || echo '$(srcdir)/'`dom.c libgsoap_a-dom.obj: dom.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap_a_CFLAGS) $(CFLAGS) -MT libgsoap_a-dom.obj -MD -MP -MF $(DEPDIR)/libgsoap_a-dom.Tpo -c -o libgsoap_a-dom.obj `if test -f 'dom.c'; then $(CYGPATH_W) 'dom.c'; else $(CYGPATH_W) '$(srcdir)/dom.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoap_a-dom.Tpo $(DEPDIR)/libgsoap_a-dom.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dom.c' object='libgsoap_a-dom.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap_a_CFLAGS) $(CFLAGS) -c -o libgsoap_a-dom.obj `if test -f 'dom.c'; then $(CYGPATH_W) 'dom.c'; else $(CYGPATH_W) '$(srcdir)/dom.c'; fi` libgsoapck_a-stdsoap2_ck.o: stdsoap2_ck.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck_a_CFLAGS) $(CFLAGS) -MT libgsoapck_a-stdsoap2_ck.o -MD -MP -MF $(DEPDIR)/libgsoapck_a-stdsoap2_ck.Tpo -c -o libgsoapck_a-stdsoap2_ck.o `test -f 'stdsoap2_ck.c' || echo '$(srcdir)/'`stdsoap2_ck.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapck_a-stdsoap2_ck.Tpo $(DEPDIR)/libgsoapck_a-stdsoap2_ck.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stdsoap2_ck.c' object='libgsoapck_a-stdsoap2_ck.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck_a_CFLAGS) $(CFLAGS) -c -o libgsoapck_a-stdsoap2_ck.o `test -f 'stdsoap2_ck.c' || echo '$(srcdir)/'`stdsoap2_ck.c libgsoapck_a-stdsoap2_ck.obj: stdsoap2_ck.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck_a_CFLAGS) $(CFLAGS) -MT libgsoapck_a-stdsoap2_ck.obj -MD -MP -MF $(DEPDIR)/libgsoapck_a-stdsoap2_ck.Tpo -c -o libgsoapck_a-stdsoap2_ck.obj `if test -f 'stdsoap2_ck.c'; then $(CYGPATH_W) 'stdsoap2_ck.c'; else $(CYGPATH_W) '$(srcdir)/stdsoap2_ck.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapck_a-stdsoap2_ck.Tpo $(DEPDIR)/libgsoapck_a-stdsoap2_ck.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stdsoap2_ck.c' object='libgsoapck_a-stdsoap2_ck.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck_a_CFLAGS) $(CFLAGS) -c -o libgsoapck_a-stdsoap2_ck.obj `if test -f 'stdsoap2_ck.c'; then $(CYGPATH_W) 'stdsoap2_ck.c'; else $(CYGPATH_W) '$(srcdir)/stdsoap2_ck.c'; fi` libgsoapck_a-dom.o: dom.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck_a_CFLAGS) $(CFLAGS) -MT libgsoapck_a-dom.o -MD -MP -MF $(DEPDIR)/libgsoapck_a-dom.Tpo -c -o libgsoapck_a-dom.o `test -f 'dom.c' || echo '$(srcdir)/'`dom.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapck_a-dom.Tpo $(DEPDIR)/libgsoapck_a-dom.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dom.c' object='libgsoapck_a-dom.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck_a_CFLAGS) $(CFLAGS) -c -o libgsoapck_a-dom.o `test -f 'dom.c' || echo '$(srcdir)/'`dom.c libgsoapck_a-dom.obj: dom.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck_a_CFLAGS) $(CFLAGS) -MT libgsoapck_a-dom.obj -MD -MP -MF $(DEPDIR)/libgsoapck_a-dom.Tpo -c -o libgsoapck_a-dom.obj `if test -f 'dom.c'; then $(CYGPATH_W) 'dom.c'; else $(CYGPATH_W) '$(srcdir)/dom.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapck_a-dom.Tpo $(DEPDIR)/libgsoapck_a-dom.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dom.c' object='libgsoapck_a-dom.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck_a_CFLAGS) $(CFLAGS) -c -o libgsoapck_a-dom.obj `if test -f 'dom.c'; then $(CYGPATH_W) 'dom.c'; else $(CYGPATH_W) '$(srcdir)/dom.c'; fi` libgsoapssl_a-stdsoap2_ssl.o: stdsoap2_ssl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl_a_CFLAGS) $(CFLAGS) -MT libgsoapssl_a-stdsoap2_ssl.o -MD -MP -MF $(DEPDIR)/libgsoapssl_a-stdsoap2_ssl.Tpo -c -o libgsoapssl_a-stdsoap2_ssl.o `test -f 'stdsoap2_ssl.c' || echo '$(srcdir)/'`stdsoap2_ssl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapssl_a-stdsoap2_ssl.Tpo $(DEPDIR)/libgsoapssl_a-stdsoap2_ssl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stdsoap2_ssl.c' object='libgsoapssl_a-stdsoap2_ssl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl_a_CFLAGS) $(CFLAGS) -c -o libgsoapssl_a-stdsoap2_ssl.o `test -f 'stdsoap2_ssl.c' || echo '$(srcdir)/'`stdsoap2_ssl.c libgsoapssl_a-stdsoap2_ssl.obj: stdsoap2_ssl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl_a_CFLAGS) $(CFLAGS) -MT libgsoapssl_a-stdsoap2_ssl.obj -MD -MP -MF $(DEPDIR)/libgsoapssl_a-stdsoap2_ssl.Tpo -c -o libgsoapssl_a-stdsoap2_ssl.obj `if test -f 'stdsoap2_ssl.c'; then $(CYGPATH_W) 'stdsoap2_ssl.c'; else $(CYGPATH_W) '$(srcdir)/stdsoap2_ssl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapssl_a-stdsoap2_ssl.Tpo $(DEPDIR)/libgsoapssl_a-stdsoap2_ssl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stdsoap2_ssl.c' object='libgsoapssl_a-stdsoap2_ssl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl_a_CFLAGS) $(CFLAGS) -c -o libgsoapssl_a-stdsoap2_ssl.obj `if test -f 'stdsoap2_ssl.c'; then $(CYGPATH_W) 'stdsoap2_ssl.c'; else $(CYGPATH_W) '$(srcdir)/stdsoap2_ssl.c'; fi` libgsoapssl_a-dom.o: dom.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl_a_CFLAGS) $(CFLAGS) -MT libgsoapssl_a-dom.o -MD -MP -MF $(DEPDIR)/libgsoapssl_a-dom.Tpo -c -o libgsoapssl_a-dom.o `test -f 'dom.c' || echo '$(srcdir)/'`dom.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapssl_a-dom.Tpo $(DEPDIR)/libgsoapssl_a-dom.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dom.c' object='libgsoapssl_a-dom.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl_a_CFLAGS) $(CFLAGS) -c -o libgsoapssl_a-dom.o `test -f 'dom.c' || echo '$(srcdir)/'`dom.c libgsoapssl_a-dom.obj: dom.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl_a_CFLAGS) $(CFLAGS) -MT libgsoapssl_a-dom.obj -MD -MP -MF $(DEPDIR)/libgsoapssl_a-dom.Tpo -c -o libgsoapssl_a-dom.obj `if test -f 'dom.c'; then $(CYGPATH_W) 'dom.c'; else $(CYGPATH_W) '$(srcdir)/dom.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapssl_a-dom.Tpo $(DEPDIR)/libgsoapssl_a-dom.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dom.c' object='libgsoapssl_a-dom.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl_a_CFLAGS) $(CFLAGS) -c -o libgsoapssl_a-dom.obj `if test -f 'dom.c'; then $(CYGPATH_W) 'dom.c'; else $(CYGPATH_W) '$(srcdir)/dom.c'; fi` .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` libgsoap___a-stdsoap2_cpp.o: stdsoap2_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap___a_CXXFLAGS) $(CXXFLAGS) -MT libgsoap___a-stdsoap2_cpp.o -MD -MP -MF $(DEPDIR)/libgsoap___a-stdsoap2_cpp.Tpo -c -o libgsoap___a-stdsoap2_cpp.o `test -f 'stdsoap2_cpp.cpp' || echo '$(srcdir)/'`stdsoap2_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoap___a-stdsoap2_cpp.Tpo $(DEPDIR)/libgsoap___a-stdsoap2_cpp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='stdsoap2_cpp.cpp' object='libgsoap___a-stdsoap2_cpp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap___a_CXXFLAGS) $(CXXFLAGS) -c -o libgsoap___a-stdsoap2_cpp.o `test -f 'stdsoap2_cpp.cpp' || echo '$(srcdir)/'`stdsoap2_cpp.cpp libgsoap___a-stdsoap2_cpp.obj: stdsoap2_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap___a_CXXFLAGS) $(CXXFLAGS) -MT libgsoap___a-stdsoap2_cpp.obj -MD -MP -MF $(DEPDIR)/libgsoap___a-stdsoap2_cpp.Tpo -c -o libgsoap___a-stdsoap2_cpp.obj `if test -f 'stdsoap2_cpp.cpp'; then $(CYGPATH_W) 'stdsoap2_cpp.cpp'; else $(CYGPATH_W) '$(srcdir)/stdsoap2_cpp.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoap___a-stdsoap2_cpp.Tpo $(DEPDIR)/libgsoap___a-stdsoap2_cpp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='stdsoap2_cpp.cpp' object='libgsoap___a-stdsoap2_cpp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap___a_CXXFLAGS) $(CXXFLAGS) -c -o libgsoap___a-stdsoap2_cpp.obj `if test -f 'stdsoap2_cpp.cpp'; then $(CYGPATH_W) 'stdsoap2_cpp.cpp'; else $(CYGPATH_W) '$(srcdir)/stdsoap2_cpp.cpp'; fi` libgsoap___a-dom_cpp.o: dom_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap___a_CXXFLAGS) $(CXXFLAGS) -MT libgsoap___a-dom_cpp.o -MD -MP -MF $(DEPDIR)/libgsoap___a-dom_cpp.Tpo -c -o libgsoap___a-dom_cpp.o `test -f 'dom_cpp.cpp' || echo '$(srcdir)/'`dom_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoap___a-dom_cpp.Tpo $(DEPDIR)/libgsoap___a-dom_cpp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dom_cpp.cpp' object='libgsoap___a-dom_cpp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap___a_CXXFLAGS) $(CXXFLAGS) -c -o libgsoap___a-dom_cpp.o `test -f 'dom_cpp.cpp' || echo '$(srcdir)/'`dom_cpp.cpp libgsoap___a-dom_cpp.obj: dom_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap___a_CXXFLAGS) $(CXXFLAGS) -MT libgsoap___a-dom_cpp.obj -MD -MP -MF $(DEPDIR)/libgsoap___a-dom_cpp.Tpo -c -o libgsoap___a-dom_cpp.obj `if test -f 'dom_cpp.cpp'; then $(CYGPATH_W) 'dom_cpp.cpp'; else $(CYGPATH_W) '$(srcdir)/dom_cpp.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoap___a-dom_cpp.Tpo $(DEPDIR)/libgsoap___a-dom_cpp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dom_cpp.cpp' object='libgsoap___a-dom_cpp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoap___a_CXXFLAGS) $(CXXFLAGS) -c -o libgsoap___a-dom_cpp.obj `if test -f 'dom_cpp.cpp'; then $(CYGPATH_W) 'dom_cpp.cpp'; else $(CYGPATH_W) '$(srcdir)/dom_cpp.cpp'; fi` libgsoapck___a-stdsoap2_ck_cpp.o: stdsoap2_ck_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck___a_CXXFLAGS) $(CXXFLAGS) -MT libgsoapck___a-stdsoap2_ck_cpp.o -MD -MP -MF $(DEPDIR)/libgsoapck___a-stdsoap2_ck_cpp.Tpo -c -o libgsoapck___a-stdsoap2_ck_cpp.o `test -f 'stdsoap2_ck_cpp.cpp' || echo '$(srcdir)/'`stdsoap2_ck_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapck___a-stdsoap2_ck_cpp.Tpo $(DEPDIR)/libgsoapck___a-stdsoap2_ck_cpp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='stdsoap2_ck_cpp.cpp' object='libgsoapck___a-stdsoap2_ck_cpp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck___a_CXXFLAGS) $(CXXFLAGS) -c -o libgsoapck___a-stdsoap2_ck_cpp.o `test -f 'stdsoap2_ck_cpp.cpp' || echo '$(srcdir)/'`stdsoap2_ck_cpp.cpp libgsoapck___a-stdsoap2_ck_cpp.obj: stdsoap2_ck_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck___a_CXXFLAGS) $(CXXFLAGS) -MT libgsoapck___a-stdsoap2_ck_cpp.obj -MD -MP -MF $(DEPDIR)/libgsoapck___a-stdsoap2_ck_cpp.Tpo -c -o libgsoapck___a-stdsoap2_ck_cpp.obj `if test -f 'stdsoap2_ck_cpp.cpp'; then $(CYGPATH_W) 'stdsoap2_ck_cpp.cpp'; else $(CYGPATH_W) '$(srcdir)/stdsoap2_ck_cpp.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapck___a-stdsoap2_ck_cpp.Tpo $(DEPDIR)/libgsoapck___a-stdsoap2_ck_cpp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='stdsoap2_ck_cpp.cpp' object='libgsoapck___a-stdsoap2_ck_cpp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck___a_CXXFLAGS) $(CXXFLAGS) -c -o libgsoapck___a-stdsoap2_ck_cpp.obj `if test -f 'stdsoap2_ck_cpp.cpp'; then $(CYGPATH_W) 'stdsoap2_ck_cpp.cpp'; else $(CYGPATH_W) '$(srcdir)/stdsoap2_ck_cpp.cpp'; fi` libgsoapck___a-dom_cpp.o: dom_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck___a_CXXFLAGS) $(CXXFLAGS) -MT libgsoapck___a-dom_cpp.o -MD -MP -MF $(DEPDIR)/libgsoapck___a-dom_cpp.Tpo -c -o libgsoapck___a-dom_cpp.o `test -f 'dom_cpp.cpp' || echo '$(srcdir)/'`dom_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapck___a-dom_cpp.Tpo $(DEPDIR)/libgsoapck___a-dom_cpp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dom_cpp.cpp' object='libgsoapck___a-dom_cpp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck___a_CXXFLAGS) $(CXXFLAGS) -c -o libgsoapck___a-dom_cpp.o `test -f 'dom_cpp.cpp' || echo '$(srcdir)/'`dom_cpp.cpp libgsoapck___a-dom_cpp.obj: dom_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck___a_CXXFLAGS) $(CXXFLAGS) -MT libgsoapck___a-dom_cpp.obj -MD -MP -MF $(DEPDIR)/libgsoapck___a-dom_cpp.Tpo -c -o libgsoapck___a-dom_cpp.obj `if test -f 'dom_cpp.cpp'; then $(CYGPATH_W) 'dom_cpp.cpp'; else $(CYGPATH_W) '$(srcdir)/dom_cpp.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapck___a-dom_cpp.Tpo $(DEPDIR)/libgsoapck___a-dom_cpp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dom_cpp.cpp' object='libgsoapck___a-dom_cpp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapck___a_CXXFLAGS) $(CXXFLAGS) -c -o libgsoapck___a-dom_cpp.obj `if test -f 'dom_cpp.cpp'; then $(CYGPATH_W) 'dom_cpp.cpp'; else $(CYGPATH_W) '$(srcdir)/dom_cpp.cpp'; fi` libgsoapssl___a-stdsoap2_ssl_cpp.o: stdsoap2_ssl_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl___a_CXXFLAGS) $(CXXFLAGS) -MT libgsoapssl___a-stdsoap2_ssl_cpp.o -MD -MP -MF $(DEPDIR)/libgsoapssl___a-stdsoap2_ssl_cpp.Tpo -c -o libgsoapssl___a-stdsoap2_ssl_cpp.o `test -f 'stdsoap2_ssl_cpp.cpp' || echo '$(srcdir)/'`stdsoap2_ssl_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapssl___a-stdsoap2_ssl_cpp.Tpo $(DEPDIR)/libgsoapssl___a-stdsoap2_ssl_cpp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='stdsoap2_ssl_cpp.cpp' object='libgsoapssl___a-stdsoap2_ssl_cpp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl___a_CXXFLAGS) $(CXXFLAGS) -c -o libgsoapssl___a-stdsoap2_ssl_cpp.o `test -f 'stdsoap2_ssl_cpp.cpp' || echo '$(srcdir)/'`stdsoap2_ssl_cpp.cpp libgsoapssl___a-stdsoap2_ssl_cpp.obj: stdsoap2_ssl_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl___a_CXXFLAGS) $(CXXFLAGS) -MT libgsoapssl___a-stdsoap2_ssl_cpp.obj -MD -MP -MF $(DEPDIR)/libgsoapssl___a-stdsoap2_ssl_cpp.Tpo -c -o libgsoapssl___a-stdsoap2_ssl_cpp.obj `if test -f 'stdsoap2_ssl_cpp.cpp'; then $(CYGPATH_W) 'stdsoap2_ssl_cpp.cpp'; else $(CYGPATH_W) '$(srcdir)/stdsoap2_ssl_cpp.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapssl___a-stdsoap2_ssl_cpp.Tpo $(DEPDIR)/libgsoapssl___a-stdsoap2_ssl_cpp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='stdsoap2_ssl_cpp.cpp' object='libgsoapssl___a-stdsoap2_ssl_cpp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl___a_CXXFLAGS) $(CXXFLAGS) -c -o libgsoapssl___a-stdsoap2_ssl_cpp.obj `if test -f 'stdsoap2_ssl_cpp.cpp'; then $(CYGPATH_W) 'stdsoap2_ssl_cpp.cpp'; else $(CYGPATH_W) '$(srcdir)/stdsoap2_ssl_cpp.cpp'; fi` libgsoapssl___a-dom_cpp.o: dom_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl___a_CXXFLAGS) $(CXXFLAGS) -MT libgsoapssl___a-dom_cpp.o -MD -MP -MF $(DEPDIR)/libgsoapssl___a-dom_cpp.Tpo -c -o libgsoapssl___a-dom_cpp.o `test -f 'dom_cpp.cpp' || echo '$(srcdir)/'`dom_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapssl___a-dom_cpp.Tpo $(DEPDIR)/libgsoapssl___a-dom_cpp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dom_cpp.cpp' object='libgsoapssl___a-dom_cpp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl___a_CXXFLAGS) $(CXXFLAGS) -c -o libgsoapssl___a-dom_cpp.o `test -f 'dom_cpp.cpp' || echo '$(srcdir)/'`dom_cpp.cpp libgsoapssl___a-dom_cpp.obj: dom_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl___a_CXXFLAGS) $(CXXFLAGS) -MT libgsoapssl___a-dom_cpp.obj -MD -MP -MF $(DEPDIR)/libgsoapssl___a-dom_cpp.Tpo -c -o libgsoapssl___a-dom_cpp.obj `if test -f 'dom_cpp.cpp'; then $(CYGPATH_W) 'dom_cpp.cpp'; else $(CYGPATH_W) '$(srcdir)/dom_cpp.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsoapssl___a-dom_cpp.Tpo $(DEPDIR)/libgsoapssl___a-dom_cpp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dom_cpp.cpp' object='libgsoapssl___a-dom_cpp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsoapssl___a_CXXFLAGS) $(CXXFLAGS) -c -o libgsoapssl___a-dom_cpp.obj `if test -f 'dom_cpp.cpp'; then $(CYGPATH_W) 'dom_cpp.cpp'; else $(CYGPATH_W) '$(srcdir)/dom_cpp.cpp'; fi` install-nobase_pkgdataDATA: $(nobase_pkgdata_DATA) @$(NORMAL_INSTALL) @list='$(nobase_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \ fi; \ $(am__nobase_list) | while read dir files; do \ xfiles=; for file in $$files; do \ if test -f "$$file"; then xfiles="$$xfiles $$file"; \ else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ test -z "$$xfiles" || { \ test "x$$dir" = x. || { \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)/$$dir'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)/$$dir"; }; \ echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(pkgdatadir)/$$dir'"; \ $(INSTALL_DATA) $$xfiles "$(DESTDIR)$(pkgdatadir)/$$dir" || exit $$?; }; \ done uninstall-nobase_pkgdataDATA: @$(NORMAL_UNINSTALL) @list='$(nobase_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir) install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ done uninstall-includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-recursive all-am: Makefile $(LIBRARIES) $(DATA) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-recursive clean-am: clean-generic clean-libLIBRARIES mostlyclean-am distclean: distclean-recursive -rm -f ./$(DEPDIR)/libgsoap___a-dom_cpp.Po -rm -f ./$(DEPDIR)/libgsoap___a-stdsoap2_cpp.Po -rm -f ./$(DEPDIR)/libgsoap_a-dom.Po -rm -f ./$(DEPDIR)/libgsoap_a-stdsoap2.Po -rm -f ./$(DEPDIR)/libgsoapck___a-dom_cpp.Po -rm -f ./$(DEPDIR)/libgsoapck___a-stdsoap2_ck_cpp.Po -rm -f ./$(DEPDIR)/libgsoapck_a-dom.Po -rm -f ./$(DEPDIR)/libgsoapck_a-stdsoap2_ck.Po -rm -f ./$(DEPDIR)/libgsoapssl___a-dom_cpp.Po -rm -f ./$(DEPDIR)/libgsoapssl___a-stdsoap2_ssl_cpp.Po -rm -f ./$(DEPDIR)/libgsoapssl_a-dom.Po -rm -f ./$(DEPDIR)/libgsoapssl_a-stdsoap2_ssl.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-includeHEADERS install-nobase_pkgdataDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-libLIBRARIES install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f ./$(DEPDIR)/libgsoap___a-dom_cpp.Po -rm -f ./$(DEPDIR)/libgsoap___a-stdsoap2_cpp.Po -rm -f ./$(DEPDIR)/libgsoap_a-dom.Po -rm -f ./$(DEPDIR)/libgsoap_a-stdsoap2.Po -rm -f ./$(DEPDIR)/libgsoapck___a-dom_cpp.Po -rm -f ./$(DEPDIR)/libgsoapck___a-stdsoap2_ck_cpp.Po -rm -f ./$(DEPDIR)/libgsoapck_a-dom.Po -rm -f ./$(DEPDIR)/libgsoapck_a-stdsoap2_ck.Po -rm -f ./$(DEPDIR)/libgsoapssl___a-dom_cpp.Po -rm -f ./$(DEPDIR)/libgsoapssl___a-stdsoap2_ssl_cpp.Po -rm -f ./$(DEPDIR)/libgsoapssl_a-dom.Po -rm -f ./$(DEPDIR)/libgsoapssl_a-stdsoap2_ssl.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-includeHEADERS uninstall-libLIBRARIES \ uninstall-nobase_pkgdataDATA .MAKE: $(am__recursive_targets) all check install install-am \ install-data-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--depfiles check check-am clean clean-generic \ clean-libLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-data-hook install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-includeHEADERS install-info \ install-info-am install-libLIBRARIES install-man \ install-nobase_pkgdataDATA install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-includeHEADERS uninstall-libLIBRARIES \ uninstall-nobase_pkgdataDATA .PRECIOUS: Makefile stdsoap2_ck.c: stdsoap2.cpp $(LN_S) -f $(top_srcdir)/gsoap/stdsoap2.cpp stdsoap2_ck.c stdsoap2_cpp.cpp: stdsoap2.cpp $(LN_S) -f $(top_srcdir)/gsoap/stdsoap2.cpp stdsoap2_cpp.cpp stdsoap2_ck_cpp.cpp: stdsoap2.cpp $(LN_S) -f $(top_srcdir)/gsoap/stdsoap2.cpp stdsoap2_ck_cpp.cpp stdsoap2_ssl.c: stdsoap2.cpp $(LN_S) -f $(top_srcdir)/gsoap/stdsoap2.cpp stdsoap2_ssl.c stdsoap2_ssl_cpp.cpp: stdsoap2.cpp $(LN_S) -f $(top_srcdir)/gsoap/stdsoap2.cpp stdsoap2_ssl_cpp.cpp dom_cpp.cpp: dom.cpp $(LN_S) -f $(top_srcdir)/gsoap/dom.cpp dom_cpp.cpp install-data-hook: $(LN_S) -f $(top_builddir)/gsoap/src/soapcpp2 $(top_builddir)/gsoap/soapcpp2 || echo "ok, link already exists". $(LN_S) -f $(top_builddir)/gsoap/wsdl/wsdl2h $(top_builddir)/gsoap/wsdl2h || echo "ok, link already exists". # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/uddi2/0000755000175000017500000000000013525564137014417 5ustar ellertellertgsoap-2.8.91/gsoap/uddi2/uddi_v2.h0000644000175000017500000051611313525245163016126 0ustar ellertellert/** @mainpage gSOAP UDDI v2 Universal Description, Discovery and Integration, or UDDI, is the name of a group of web-based registries that expose information about a business or other entity and its technical interfaces. See the UDDI v2 specification @url http://uddi.org/pubs/ProgrammersAPI_v2.htm for more details. @section UDDI2_CLASSES Classes See Related Pages for examples. UDDI Inquire classes - @ref uddi2__find_USCOREbinding - @ref uddi2__find_USCOREbusiness - @ref uddi2__find_USCORErelatedBusinesses - @ref uddi2__find_USCOREservice - @ref uddi2__find_USCOREtModel - @ref uddi2__get_USCOREbindingDetail - @ref uddi2__get_USCOREbusinessDetail - @ref uddi2__get_USCOREbusinessDetailExt - @ref uddi2__get_USCOREserviceDetail - @ref uddi2__get_USCOREtModelDetail UDDI Publish classes - @ref uddi2__add_USCOREpublisherAssertions - @ref uddi2__delete_USCOREbinding - @ref uddi2__delete_USCOREbusiness - @ref uddi2__delete_USCOREservice - @ref uddi2__delete_USCOREtModel - @ref uddi2__delete_USCOREpublisherAssertions - @ref uddi2__discard_USCOREauthToken - @ref uddi2__get_USCOREassertionStatusReport - @ref uddi2__get_USCOREauthToken - @ref uddi2__get_USCOREpublisherAssertions - @ref uddi2__get_USCOREregisteredInfo - @ref uddi2__save_USCOREbinding - @ref uddi2__save_USCOREbusiness - @ref uddi2__save_USCOREservice - @ref uddi2__save_USCOREtModel - @ref uddi2__set_USCOREpublisherAssertions @section UDDI2_BINDINGS Binding Reference - @ref InquireSoap - @ref PublishSoap */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_binding // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREbinding @brief Represents a request to locate bindings that meet the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137712 */ /** @fn uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbinding class. */ /** @fn uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap, const char *tModelKey) @brief @param[in] soap gSOAP context @param[in] tModelKey string Creates an instance of the find_USCOREbinding class using the specified tModel key. */ /** @fn uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of tModel key strings Creates an instance of the find_USCOREbinding class using the specified tModel keys. */ /** @fn uddi2__bindingDetail* uddi2__find_USCOREbinding::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__bindingDetail object or NULL on error Send a request to a UDDI server to find binding details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_business // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREbusiness @brief Represents a request to locate businesses that meet specific requirements. When the send method is called, the instance returns a uddi2__businessList object that contains a list of business that matched the search criteria. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137713 See also @ref example2. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, const char *name) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class using the specified name of the requested business. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, std::vector keyedReferences) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class using the specified category references. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class using the specified tModel keys. */ /** @fn uddi2__businessList *uddi2__find_USCOREbusiness::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__businessList object or NULL on error Send a request to a UDDI server to find a list of businesses. See also @ref example2. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_relatedBusinesses // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCORErelatedBusinesses @brief Represents a request to locate businesses that are related to a specific business. When the send method is called, the instance returns a uddi2__relatedBusinessList object that contains a list of business that matched the relationship set. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137714 */ /** @fn uddi2__find_USCORErelatedBusinesses::uddi2__find_USCORErelatedBusinesses(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCORErelatedBusiness class. */ /** @fn uddi2__find_USCORErelatedBusinesses::uddi2__find_USCORErelatedBusinesses(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey string Creates an instance of the find_USCORErelatedBusiness class using the specified business key. */ /** @fn uddi2__relatedBusinessesList *uddi2__find_USCORErelatedBusinesses::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__relatedBusinessList object or NULL on error Send a request to a UDDI server to find a list of related businesses. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_service // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREservice @brief Represents a request to locate services that meet the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137715 See also @ref example1. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREservice class. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, const char *name) @brief @param[in] soap gSOAP context @param[in] name of the service Creates an instance of the find_USCOREservice class using the specified name. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, std::vector keyedReferences) @brief @param[in] soap gSOAP context @param[in] keyedReferences collection of category keys Creates an instance of the find_USCOREservice class using the specified category keys. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of tModel key strings Creates an instance of the find_USCOREservice class using the specified tModel keys. */ /** @fn uddi2__serviceList* uddi2__find_USCOREservice::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__serviceList object or NULL on error Send a request to a UDDI server to find a list of services. See also @ref example1. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_tModel // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREtModel @brief Represents a request to locate a list of tModel entries that match a set of specific criteria. The result of a search is a uddi2__tModelList object that contains information about registered tModel data that matches the criteria. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137716 */ /** @fn uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREtModel class. */ /** @fn uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap, const char *name) @brief @param[in] soap gSOAP context @param[in] name of the tModel Creates an instance of the find_USCOREtModel class using the specified tModel name. */ /** @fn uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap, std::vector keyedReferences) @brief @param[in] soap gSOAP context @param[in] keyedReferences collection of category keys Creates an instance of the find_USCOREtModel class using the specified category keys. */ /** @fn uddi2__tModelList* uddi2__find_USCOREtModel::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__tModelList object or NULL on error Send a request to a UDDI server to find a tModelList. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_bindingDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREbindingDetail @brief Represents a request to get binding details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137717 */ /** @fn uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREbindingDetail class. */ /** @fn uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap, const char *bindingKey) @brief @param[in] soap gSOAP context @param[in] bindingKey string Creates an instance of the get_USCOREbindingDetail class using the specified binding key. */ /** @fn uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap, std::vector bindingKeys) @brief @param[in] soap gSOAP context @param[in] bindingKeys collection of key strings Creates an instance of the get_USCOREbindingDetail class using the specified collection of binding keys. */ /** @fn uddi2__bindingDetail* uddi2__get_USCOREbindingDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__bindingDetail object or NULL on error Send a request to a UDDI server to get the binding details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_businessDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREbusinessDetail @brief Represents a request to get business details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137718 */ /** @fn uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREbusinessDetail class. */ /** @fn uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey string Creates an instance of the get_USCOREbusinessDetail class using the specified business key. */ /** @fn uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap, std::vector businessKeys) @brief @param[in] soap gSOAP context @param[in] businessKeys collection of key strings Creates an instance of the get_USCOREbusinessDetail class using the specified collection of business keys. */ /** @fn uddi2__businessDetail* uddi2__get_USCOREbusinessDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__businessDetail object or NULL on error Send a request to a UDDI server to get the business details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_businessDetailExt // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREbusinessDetailExt @brief Represents a request to get business details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137719 */ /** @fn uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREbusinessDetailExt class. */ /** @fn uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey string Creates an instance of the get_USCOREbusinessDetailExt class using the specified business key. */ /** @fn uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap, std::vector businessKeys) @brief @param[in] soap gSOAP context @param[in] businessKeys collection of key strings Creates an instance of the get_USCOREbusinessDetailExt class using the specified collection of business keys. */ /** @fn uddi2__businessDetailExt* uddi2__get_USCOREbusinessDetailExt::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__businessDetailExt object or NULL on error Send a request to a UDDI server to get the business details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_serviceDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREserviceDetail @brief Represents a request to get service details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137720 */ /** @fn uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREserviceDetail class. */ /** @fn uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap, const char *serviceKey) @brief @param[in] soap gSOAP context @param[in] serviceKey string Creates an instance of the get_USCOREserviceDetail class using the specified service key. */ /** @fn uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap, std::vector serviceKeys) @brief @param[in] soap gSOAP context @param[in] serviceKeys collection of key strings Creates an instance of the get_USCOREserviceDetail class using the specified collection of service keys. */ /** @fn uddi2__serviceDetail* uddi2__get_USCOREserviceDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__serviceDetail object or NULL on error Send a request to a UDDI server to get the service details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_tModelDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREtModelDetail @brief Represents a request to get tModel details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137721 */ /** @fn uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREtModelDetail class. */ /** @fn uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap, const char *tModelKey) @brief @param[in] soap gSOAP context @param[in] tModelKey string Creates an instance of the get_USCOREtModelDetail class using the specified tModel key. */ /** @fn uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of key strings Creates an instance of the get_USCOREtModelDetail class using the specified collection of tModel keys. */ /** @fn uddi2__tModelDetail* uddi2__get_USCOREtModelDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__tModelDetail object or NULL on error Send a request to a UDDI server to get the tModel details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:add_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__add_USCOREpublisherAssertions @brief Represents a request to add one or more publisher assertions to the assertion collection for an individual publisher. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137731 */ /** @fn uddi2__add_USCOREpublisherAssertions::uddi2__add_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the add_USCOREpublisherAssertions class. */ /** @fn uddi2__add_USCOREpublisherAssertions::uddi2__add_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) @brief @param[in] soap gSOAP context @param[in] publisherAssertions collection of publisher assertions Creates an instance of the add_USCOREpublisherAssertions class using the specified publisher assertions. */ /** @fn uddi2__dispositionReport *uddi2__add_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI server to add one or more publisher assertions to the assertion collection for an individual publisher. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_binding // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREbinding @brief Represents a request to delete a binding that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137732 */ /** @fn uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap) @brief Creates an instance of the delete_USCOREbinding class. */ /** @fn uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap, const char *bindingKey) @brief @param[in] soap gSOAP context @param[in] bindingKey a binding key string Creates an instance of the delete_USCOREbinding class. */ /** @fn uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap, std::vector bindingKeys) @brief @param[in] soap gSOAP context @param[in] bindingKeys collection of binding keys Creates an instance of the delete_USCOREbinding class using the specified binding keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREbinding::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a binding that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_business // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREbusiness @brief Represents a request to delete a business that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137733 */ /** @fn uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREbusiness class. */ /** @fn uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey a business key string Creates an instance of the delete_USCOREbusiness class using the specified business key. */ /** @fn uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap, std::vector businessKeys) @brief @param[in] soap gSOAP context @param[in] businessKeys collection of business keys Creates an instance of the delete_USCOREbusiness class using the specified business keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREbusiness::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a business that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_service // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREservice @brief Represents a request to delete a service that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137735 */ /** @fn uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREservice class. */ /** @fn uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap, const char *serviceKey) @brief @param[in] soap gSOAP context @param[in] serviceKey a service key string Creates an instance of the delete_USCOREservice class using the specified service key. */ /** @fn uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap, std::vector serviceKeys) @brief @param[in] soap gSOAP context @param[in] serviceKeys collection of service keys Creates an instance of the delete_USCOREservice class using the specified service keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREservice::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a service that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_tModel // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREtModel @brief Represents a request to delete a tModel that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137736 */ /** @fn uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREtModel class. */ /** @fn uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap, const char *tModelKey) @brief @param[in] soap gSOAP context @param[in] tModelKey a tModel key string Creates an instance of the delete_USCOREtModel class using the specified tModel key. */ /** @fn uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of tModel keys Creates an instance of the delete_USCOREtModel class using the specified tModel keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREtModel::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a tModel that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREpublisherAssertions @brief Represents a request to delete publisher assertions meeting the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137734 */ /** @fn uddi2__delete_USCOREpublisherAssertions::uddi2__delete_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREpublisherAssertions class. */ /** @fn uddi2__delete_USCOREpublisherAssertions::uddi2__delete_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) @brief @param[in] soap gSOAP context @param[in] publisherAssertions a collection of publisher assertions Creates an instance of the delete_USCOREpublisherAssertions class using the specified collection of publisher assertions. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete publisher assertions meeting the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:discard_authToken // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__discard_USCOREauthToken @brief Represents a request to discard an authorization token obtained with the get_USCOREauthToken class. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137737 */ /** @fn uddi2__discard_USCOREauthToken::uddi2__discard_USCOREauthToken(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREauthToken class. */ /** @fn uddi2__discard_USCOREauthToken::uddi2__discard_USCOREauthToken(struct soap *soap, const char *authInfo) @brief @param[in] soap gSOAP context @param[in] authInfo authorization token provided by the UDDI server Creates an instance of the delete_USCOREauthToken class using the specified authentication token string. */ /** @fn uddi2__dispositionReport *uddi2__discard_USCOREauthToken::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to discard an authentication token. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_assertionStatusReport // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREassertionStatusReport @brief Provides the ability to determine the status of current and outstanding publisher assertions. The results can be restricted by setting the completionStatus property. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137738 */ /** @fn uddi2__get_USCOREassertionStatusReport::uddi2__get_USCOREassertionStatusReport(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREassertionStatusReport class. */ /** @fn uddi2__get_USCOREassertionStatusReport::uddi2__get_USCOREassertionStatusReport(struct soap *soap, const char *completionStatus) @brief @param[in] soap gSOAP context @param[in] completionStatus completion status string Creates an instance of the get_USCOREassertionStatusReport class using the specified completion status. */ /** @fn uddi2__assertionStatusReport *uddi2__get_USCOREassertionStatusReport::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__assertionStatusReport object or NULL on error Send a request to a UDDI service to get the status of current and outstanding publisher assertions. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_authToken // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREauthToken @brief Represents a request to obtain an authorization token, which is represented by the uddi2__authToken class. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137739 */ /** @fn uddi2__get_USCOREauthToken::uddi2__get_USCOREauthToken(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREauthToken class. */ /** @fn uddi2__get_USCOREauthToken::uddi2__get_USCOREauthToken(struct soap *soap, const char *userid, const char *passwd) @brief @param[in] soap gSOAP context @param[in] userid the user ID string @param[in] passwd the password string Creates an instance of the get_USCOREauthToken class using the specified user ID and password. */ /** @fn uddi2__authToken *uddi2__get_USCOREauthToken::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__authToken object or NULL on error Send a request to a UDDI service to get a authorization token given a user ID and password. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREpublisherAssertions @brief Represents a request to obtain the full set of publisher assertions that are associated with an individual publisher. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137740 */ /** @fn uddi2__get_USCOREpublisherAssertions::uddi2__get_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREpublisherAssetions class. */ /** @fn uddi2__publisherAssertions *uddi2__get_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__publisherAssertions object or NULL on error Send a request to a UDDI service to get publisher assertions. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_registeredInfo // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREregisteredInfo @brief Represents a request to get all registered business entities and tModels controlled by an individual. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137741 */ /** @fn uddi2__get_USCOREregisteredInfo::uddi2__get_USCOREregisteredInfo(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREregisteredInfo class. */ /** @fn uddi2__registeredInfo *uddi2__get_USCOREregisteredInfo::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__registeredInfo object or NULL on error Send a request to a UDDI service to get all registered business entities and tModels controlled by an individual. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_binding // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREbinding @brief Represents a request to post binding information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137742 */ /** @fn uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREbinding class. */ /** @fn uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap, uddi2__bindingTemplate &bindingTemplate) @brief @param[in] soap gSOAP context @param[in] bindingTemplate binding template Creates an instance of the save_USCOREbinding class using the specified binding template. */ /** @fn uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap, std::vector bindingTemplates) @brief @param[in] soap gSOAP context @param[in] bindingTemplates collection of binding templates Creates an instance of the save_USCOREbinding class using the specified binding templates. */ /** @fn uddi2__bindingDetail *uddi2__save_USCOREbinding::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__bindingDetail object or NULL on error Send a request to a UDDI server to post binding information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_business // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREbusiness @brief Represents a request to post business information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137743 */ /** @fn uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREbusiness class. */ /** @fn uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap, uddi2__businessEntity &businessEntity) @brief @param[in] soap gSOAP context @param[in] businessEntity business entity Creates an instance of the save_USCOREbusiness class using the specified business entity. */ /** @fn uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap, std::vector businessEntities) @brief @param[in] soap gSOAP context @param[in] businessEntities collection of business entities Creates an instance of the save_USCOREbusiness class using the specified business entities. */ /** @fn uddi2__businessDetail *uddi2__save_USCOREbusiness::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__businessDetail object or NULL on error Send a request to a UDDI server to post business information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_service // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREservice @brief Represents a request to post service information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137744 */ /** @fn uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREservice class. */ /** @fn uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap, uddi2__businessService &businessService) @brief @param[in] soap gSOAP context @param[in] businessService business service Creates an instance of the save_USCOREservice class using the specified service. */ /** @fn uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap, std::vector businessServices) @brief @param[in] soap gSOAP context @param[in] businessServices collection of business services Creates an instance of the save_USCOREservice class using the specified services. */ /** @fn uddi2__serviceDetail *uddi2__save_USCOREservice::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__serviceDetail object or NULL on error Send a request to a UDDI server to post service information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_tModel // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREtModel @brief Represents a request to post tModel information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137745 */ /** @fn uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREtModel class. */ /** @fn uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap, uddi2__tModel &tModel) @brief @param[in] soap gSOAP context @param[in] tModel a tModel Creates an instance of the save_USCOREtModel class using the specified tModel. */ /** @fn uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap, std::vector tModels) @brief @param[in] soap gSOAP context @param[in] tModels collection of tModels Creates an instance of the save_USCOREtModel class using the specified tModels. */ /** @fn uddi2__tModelDetail *uddi2__save_USCOREtModel::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__tModelDetail object or NULL on error Send a request to a UDDI server to post tModel information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:set_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__set_USCOREpublisherAssertions @brief Represents a request to modify the existing publisher assertions for an individual publisher. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137746 */ /** @fn uddi2__set_USCOREpublisherAssertions::uddi2__set_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the set_USCOREpublisherAssertions class. */ /** @fn uddi2__set_USCOREpublisherAssertions::uddi2__set_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) @brief @param[in] soap gSOAP context @param[in] publisherAssertions collection of publisher assertions Creates an instance of the set_USCOREpublisherAssertions class using the specified collection of publisher assertions. */ /** @fn uddi2__publisherAssertions *uddi2__set_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__publisherAssertions object or NULL on error Send a request to a UDDI server to post tModel information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // Code Examples // //////////////////////////////////////////////////////////////////////////////// /** @page example1 Code Example 1: Finding a service This example shows you how to find Web services. In this case, the example finds Web services with names that begin with the word "magic". @code #include "inqH.h" int main(int argc, char **argv) { char *search_string = "magic"; if (argc > 1) search_string = argv[1]; // Create a gSOAP context struct soap *soap = soap_new(); // Create an object to find a business uddi2__find_USCOREservice fs(soap, search_string); // Send the request uddi2__serviceList *sl = fs.send("http://uddi.xmethods.net/inquire"); // Check if result is OK if (!sl) soap_print_fault(soap, stderr); // If OK, report the service name(s) and unique identification keys else if (sl->serviceInfos) { std::cout << "Search results on " << search_string << ":" << std::endl << std::endl; for (std::vector::const_iterator si = sl->serviceInfos->serviceInfo.begin(); si != sl->serviceInfos->serviceInfo.end(); ++si) { // Report serviceKey and businessKey std::cout << "serviceKey=" << (*si)->serviceKey << std::endl << "businessKey=" << (*si)->businessKey << std::endl; // Report names for (std::vector::const_iterator n = (*si)->name.begin(); n != (*si)->name.end(); ++n) std::cout << "name=" << (*n)->__item << std::endl; std::cout << std::endl; } } // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } @endcode To compile: - wsdl2h -tuddi2-typemap.dat inquire_v2.wsdl - soapcpp2 -I.. -pinq inquire_v2.h - g++ -DWITH_NONAMESPACES -I.. -o example1 example1.cpp inquire_v2.cpp inqC.cpp inqClient.cpp ../stdsoap2.cpp */ /** @page example2 Code Example 2: Finding a business This example shows you how to find a business from a UDDI server. @code #include "inqH.h" int main(int argc, char **argv) { char *search_string = "xmethods"; if (argc > 1) search_string = argv[1]; // Create a gSOAP context struct soap *soap = soap_new(); // Create an object to find a business uddi2__find_USCOREbusiness fb(soap, search_string); // Send the request uddi2__businessList *bl = fb.send("http://uddi.xmethods.net/inquire"); // Check if result is OK if (!bl) soap_print_fault(soap, stderr); // If OK, report the business name(s) and unique identification keys else if (bl->businessInfos) { std::cout << "Search results on " << search_string << ":" << std::endl << std::endl; for (std::vector::const_iterator bi = bl->businessInfos->businessInfo.begin(); bi != bl->businessInfos->businessInfo.end(); ++bi) { // Report businessKey std::cout << "businessKey=" << (*bi)->businessKey << std::endl; // Report names for (std::vector::const_iterator n = (*bi)->name.begin(); n != (*bi)->name.end(); ++n) std::cout << "name=" << (*n)->__item << std::endl; std::cout << std::endl; } } // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } @endcode To compile: - wsdl2h -tuddi2-typemap.dat inquire_v2.wsdl - soapcpp2 -I.. -pinq inquire_v2.h - g++ -DWITH_NONAMESPACES -I.. -o example2 example2.cpp inquire_v2.cpp inqC.cpp inqClient.cpp ../stdsoap2.cpp */ /** @page example3 Code Example 3: Publishing a WSDL and service on XMethods This example shows you how to publish a Web service. In this case, the example template code obtains an authorization token, saves the tModel with the WSDL URL in the server, and saves the business service information in the server. @code #include "pubH.h" const char *server = "https://uddi.xmethods.net/publish"; const char *userid = "..."; // user ID to access UDDI server const char *passwd = "..."; // password to access UDDI server int main(int argc, char **argv) { // Create a gSOAP context struct soap *soap = soap_new(); // Setup SSL context (optional) to verify server's credentials if (soap_ssl_client_context(soap, SOAP_SSL_DEFAULT, NULL, NULL, "cacerts.pem", NULL, NULL)) { soap_print_fault(soap, stderr); exit(1); } // Step 1: Get an authorization token from the UDDI server uddi2__get_USCOREauthToken get_authToken(soap, userid, passwd); uddi2__authToken *authToken = get_authToken.send(server); // Check if authorized if (!authToken) { soap_print_fault(soap, stderr); exit(1); } // Authorization info provided by server for this session char *authInfo = authToken->authInfo; // Step 2: Create a tModel for the WSDL to be published uddi2__tModel tModel; tModel.soap_default(soap); // Create the tModel and service name tModel.name = soap_new_uddi2__name(soap, -1); tModel.name->__item = "..."; tModel.name->xml__lang_ = "en"; // Create XMethods description elements (see http://www.xmethods.net/ve2/UDDI.po) uddi2__description *description = soap_new_uddi2__description(soap, 6); description[0].__item = "SHORT DESCRIPTION: ..."; description[0].xml__lang_ = "en"; description[1].__item = "SHORT DESCRIPTION: ..."; description[1].xml__lang_ = "en"; description[2].__item = "USAGE NOTES: ..."; description[2].xml__lang_ = "en"; description[3].__item = "HOMEPAGE URL: ..."; description[3].xml__lang_ = "en"; description[4].__item = "CONTACT EMAIL: ..."; description[4].xml__lang_ = "en"; description[5].__item = "IMPLEMENTATION: ..."; description[5].xml__lang_ = "en"; // Add the four description elements to the tModel tModel.description.push_back(description + 0); tModel.description.push_back(description + 1); tModel.description.push_back(description + 2); tModel.description.push_back(description + 4); // Add an overviewDoc element with description and overviewURL tModel.overviewDoc = soap_new_uddi2__overviewDoc(soap, -1); tModel.overviewDoc->soap_default(soap); tModel.overviewDoc->description.push_back(soap_new_uddi2__description(soap, -1)); tModel.overviewDoc->description[0]->__item = "WSDL source document"; tModel.overviewDoc->description[0]->xml__lang_ = "en"; tModel.overviewDoc->overviewURL = "http://.../my.wsdl#bindingName"; // Omit identifier bag tModel.identifierBag = NULL; // Add a category with a WSDL-specific keyedReference tModel.categoryBag = soap_new_uddi2__categoryBag(soap, -1); tModel.categoryBag->soap_default(soap); tModel.categoryBag->keyedReference.push_back(soap_new_uddi2__keyedReference(soap, -1)); tModel.categoryBag->keyedReference[0]->tModelKey = "..."; tModel.categoryBag->keyedReference[0]->keyName = "uddi-org:types"; tModel.categoryBag->keyedReference[0]->keyValue = "wsdlSpec"; tModel.authorizedName = "..."; tModel.operator_ = "..."; tModel.tModelKey = "..."; // Save the tModel uddi2__save_USCOREtModel save_tModel(soap, tModel); uddi2__tModelDetail *tModelDetail = save_tModel.send(server, authInfo); // Step 3: Create a new service to be published uddi2__businessService service; service.soap_default(soap); // Service name is the tModel name (XMethods) service.name.push_back(tModel.name); // Add two description elements to the service service.description.push_back(description + 4); service.description.push_back(description + 5); // Create binding template uddi2__bindingTemplate bindingTemplate; bindingTemplate.soap_default(soap); bindingTemplate.tModelInstanceDetails = soap_new_uddi2__tModelInstanceDetails(soap, -1); bindingTemplate.tModelInstanceDetails->tModelInstanceInfo.push_back(soap_new_uddi2__tModelInstanceInfo(soap, -1)); bindingTemplate.tModelInstanceDetails->tModelInstanceInfo[0]->instanceDetails = NULL; bindingTemplate.tModelInstanceDetails->tModelInstanceInfo[0]->tModelKey = tModel.tModelKey; bindingTemplate.accessPoint = soap_new_uddi2__accessPoint(soap, -1); bindingTemplate.accessPoint->__item = "..."; bindingTemplate.accessPoint->URLType = uddi2__URLType__http; bindingTemplate.hostingRedirector = NULL; bindingTemplate.serviceKey = "..."; bindingTemplate.bindingKey = "..."; // Add binding Template to service service.bindingTemplates = soap_new_uddi2__bindingTemplates(soap, -1); service.bindingTemplates->soap_default(soap); service.bindingTemplates->bindingTemplate.push_back(&bindingTemplate); service.categoryBag = NULL; service.serviceKey = "..."; service.businessKey = "..."; // Save the service uddi2__save_USCOREservice save_service(soap, service); uddi2__serviceDetail *serviceDetail = save_service.send(server, authInfo); // Step 4: Discard authorization token uddi2__discard_USCOREauthToken discard_authToken(soap, authInfo); uddi2__dispositionReport *dispositionReport = discard_authToken.send(server); // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } @endcode To compile: - wsdl2h -tuddi2-typemap.dat publish_v2.wsdl - soapcpp2 -I.. -ppub publish_v2.h - g++ -DWITH_OPENSSL -DWITH_NONAMESPACES -I.. -o example3 example3.cpp publish_v2.cpp pubC.cpp pubClient.cpp ../stdsoap2.cpp */ /* uddi_v2.h Generated by wsdl2h 1.2.0 from inquire_v2.wsdl publish_v2.wsdl and uddi2-typemap.dat 2005-04-24 00:29:41 GMT Copyright (C) 2001-2005 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 wsdl2h option -l to view the software license terms. - Use wsdl2h options -c and -s to generate pure C code or C++ code without STL. - To build with STL, stlvector.h from the gSOAP distribution must be in the current directory. Or use soapcpp2 option -I with path to stlvector.h. - Use typemap.dat to control schema 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. */ /******************************************************************************\ * * * * * * \******************************************************************************/ //gsoapopt w #import "stlvector.h" /******************************************************************************\ * * * 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: inq2 = urn:uddi-org:inquiry_v2 uddi2 = urn:uddi-org:api_v2 pub2 = urn:uddi-org:publication_v2 */ //gsoap inq2 schema namespace: urn:uddi-org:inquiry_v2 //gsoap uddi2 schema namespace: urn:uddi-org:api_v2 //gsoap pub2 schema namespace: urn:uddi-org:publication_v2 //gsoap inq2 schema form: unqualified //gsoap uddi2 schema elementForm: qualified //gsoap uddi2 schema attributeForm: unqualified //gsoap pub2 schema form: unqualified /******************************************************************************\ * * * Schema Types * * * \******************************************************************************/ /// Primitive built-in type "xs:NMTOKEN" typedef char* xsd__NMTOKEN; /// Built-in attribute "xml:lang" typedef char* xml__lang; class uddi2__accessPoint; class uddi2__address; class uddi2__addressLine; class uddi2__assertionStatusItem; class uddi2__bindingTemplate; class uddi2__bindingTemplates; class uddi2__businessEntity; class uddi2__businessEntityExt; class uddi2__businessInfo; class uddi2__businessInfos; class uddi2__businessService; class uddi2__businessServices; class uddi2__categoryBag; class uddi2__contact; class uddi2__contacts; class uddi2__description; class uddi2__discoveryURL; class uddi2__discoveryURLs; class uddi2__dispositionReport; class uddi2__email; class uddi2__errInfo; class uddi2__findQualifiers; class uddi2__hostingRedirector; class uddi2__identifierBag; class uddi2__instanceDetails; class uddi2__keyedReference; class uddi2__keysOwned; class uddi2__name; class uddi2__overviewDoc; class uddi2__phone; class uddi2__publisherAssertion; class uddi2__relatedBusinessInfo; class uddi2__relatedBusinessInfos; class uddi2__result; class uddi2__serviceInfo; class uddi2__serviceInfos; class uddi2__sharedRelationships; class uddi2__tModel; class uddi2__tModelBag; class uddi2__tModelInfo; class uddi2__tModelInfos; class uddi2__tModelInstanceDetails; class uddi2__tModelInstanceInfo; class uddi2__add_USCOREpublisherAssertions; class uddi2__delete_USCOREbinding; class uddi2__delete_USCOREbusiness; class uddi2__delete_USCOREpublisherAssertions; class uddi2__delete_USCOREservice; class uddi2__delete_USCOREtModel; class uddi2__discard_USCOREauthToken; class uddi2__find_USCOREbinding; class uddi2__find_USCOREbusiness; class uddi2__find_USCORErelatedBusinesses; class uddi2__find_USCOREservice; class uddi2__find_USCOREtModel; class uddi2__get_USCOREassertionStatusReport; class uddi2__get_USCOREauthToken; class uddi2__get_USCOREbindingDetail; class uddi2__get_USCOREbusinessDetail; class uddi2__get_USCOREbusinessDetailExt; class uddi2__get_USCOREpublisherAssertions; class uddi2__get_USCOREregisteredInfo; class uddi2__get_USCOREserviceDetail; class uddi2__get_USCOREtModelDetail; class uddi2__save_USCOREbinding; class uddi2__save_USCOREbusiness; class uddi2__save_USCOREservice; class uddi2__save_USCOREtModel; class uddi2__set_USCOREpublisherAssertions; class uddi2__validate_USCOREvalues; class uddi2__assertionStatusReport; class uddi2__authToken; class uddi2__bindingDetail; class uddi2__businessDetail; class uddi2__businessDetailExt; class uddi2__businessList; class uddi2__publisherAssertions; class uddi2__registeredInfo; class uddi2__relatedBusinessesList; class uddi2__serviceDetail; class uddi2__serviceList; class uddi2__tModelDetail; class uddi2__tModelList; /// Schema "urn:uddi-org:api_v2":bindingKey simpleType restriction of xs:string typedef char* uddi2__bindingKey; /// Schema "urn:uddi-org:api_v2":businessKey simpleType restriction of xs:string typedef char* uddi2__businessKey; /// Schema "urn:uddi-org:api_v2":serviceKey simpleType restriction of xs:string typedef char* uddi2__serviceKey; /// Schema "urn:uddi-org:api_v2":tModelKey simpleType restriction of xs:string typedef char* uddi2__tModelKey; /// Schema "urn:uddi-org:api_v2":direction simpleType restriction of xs:NMTOKEN /// Note: enum values are prefixed with 'uddi2__direction' to avoid name clashes, please use wsdl2h option -e to omit this prefix enum uddi2__direction { uddi2__direction__fromKey, ///< xs:NMTOKEN value="fromKey" uddi2__direction__toKey, ///< xs:NMTOKEN value="toKey" }; /// Schema "urn:uddi-org:api_v2":truncated simpleType restriction of xs:NMTOKEN /// Note: enum values are prefixed with 'uddi2__truncated' to avoid name clashes, please use wsdl2h option -e to omit this prefix enum uddi2__truncated { uddi2__truncated__true_, ///< xs:NMTOKEN value="true" uddi2__truncated__false_, ///< xs:NMTOKEN value="false" }; /// Schema "urn:uddi-org:api_v2":URLType simpleType restriction of xs:NMTOKEN /// Note: enum values are prefixed with 'uddi2__URLType' to avoid name clashes, please use wsdl2h option -e to omit this prefix enum uddi2__URLType { uddi2__URLType__mailto, ///< xs:NMTOKEN value="mailto" uddi2__URLType__http, ///< xs:NMTOKEN value="http" uddi2__URLType__https, ///< xs:NMTOKEN value="https" uddi2__URLType__ftp, ///< xs:NMTOKEN value="ftp" uddi2__URLType__fax, ///< xs:NMTOKEN value="fax" uddi2__URLType__phone, ///< xs:NMTOKEN value="phone" uddi2__URLType__other, ///< xs:NMTOKEN value="other" }; /// Schema "urn:uddi-org:api_v2":keyType simpleType restriction of xs:NMTOKEN /// Note: enum values are prefixed with 'uddi2__keyType' to avoid name clashes, please use wsdl2h option -e to omit this prefix enum uddi2__keyType { uddi2__keyType__businessKey, ///< xs:NMTOKEN value="businessKey" uddi2__keyType__tModelKey, ///< xs:NMTOKEN value="tModelKey" uddi2__keyType__serviceKey, ///< xs:NMTOKEN value="serviceKey" uddi2__keyType__bindingKey, ///< xs:NMTOKEN value="bindingKey" }; /// Schema urn:uddi-org:api_v2:"address" class uddi2__address { public: /// Vector of uddi2__addressLine* with length 0..unbounded std::vector addressLine 0; /// Attribute useType of type xs:string @char* useType 0; ///< Optional attribute /// Attribute sortCode of type xs:string @char* sortCode 0; ///< Optional attribute /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"assertionStatusItem" class uddi2__assertionStatusItem { public: /// Element reference "urn:uddi-org:api_v2":fromKey uddi2__businessKey fromKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":toKey uddi2__businessKey toKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":keyedReference uddi2__keyedReference* keyedReference 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":keysOwned uddi2__keysOwned* keysOwned 1; ///< Required element /// Attribute completionStatus of type xs:string @char* completionStatus 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"bindingTemplate" class uddi2__bindingTemplate { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":tModelInstanceDetails uddi2__tModelInstanceDetails* tModelInstanceDetails 1; ///< Required element // CHOICE OF ELEMENTS: /// Element reference "urn:uddi-org:api_v2":accessPoint uddi2__accessPoint* accessPoint 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":hostingRedirector uddi2__hostingRedirector* hostingRedirector 1; ///< Required element // END CHOICE /// Attribute serviceKey of type "urn:uddi-org:api_v2":serviceKey @uddi2__serviceKey serviceKey 0; ///< Optional attribute /// Attribute bindingKey of type "urn:uddi-org:api_v2":bindingKey @uddi2__bindingKey bindingKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"bindingTemplates" class uddi2__bindingTemplates { public: /// Vector of uddi2__bindingTemplate* with length 0..unbounded std::vector bindingTemplate 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessEntity" class uddi2__businessEntity { public: /// Element reference "urn:uddi-org:api_v2":discoveryURLs uddi2__discoveryURLs* discoveryURLs 0; ///< Optional element /// Vector of uddi2__name* with length 0..unbounded std::vector name 1; /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":contacts uddi2__contacts* contacts 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":businessServices uddi2__businessServices* businessServices 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":identifierBag uddi2__identifierBag* identifierBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 0; ///< Optional attribute /// Attribute authorizedName of type xs:string @char* authorizedName 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessEntityExt" class uddi2__businessEntityExt { public: /// Element reference "urn:uddi-org:api_v2":businessEntity uddi2__businessEntity* businessEntity 1; ///< Required element // TODO: // Schema extensibility is user-definable // Consult the protocol documentation to insert declarations here: _XML __any ; ///< Catch any element content in XML string /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessInfo" class uddi2__businessInfo { public: /// Vector of uddi2__name* with length 0..unbounded std::vector name 1; /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":serviceInfos uddi2__serviceInfos* serviceInfos 1; ///< Required element /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessInfos" class uddi2__businessInfos { public: /// Vector of uddi2__businessInfo* with length 0..unbounded std::vector businessInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessService" class uddi2__businessService { public: /// Vector of uddi2__name* with length 0..unbounded std::vector name 0; /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":bindingTemplates uddi2__bindingTemplates* bindingTemplates 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Attribute serviceKey of type "urn:uddi-org:api_v2":serviceKey @uddi2__serviceKey serviceKey 1; ///< Required attribute /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessServices" class uddi2__businessServices { public: /// Vector of uddi2__businessService* with length 0..unbounded std::vector businessService 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"categoryBag" class uddi2__categoryBag { public: /// Vector of uddi2__keyedReference* with length 0..unbounded std::vector keyedReference 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"contact" class uddi2__contact { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":personName char* personName 1; ///< Required element /// Vector of uddi2__phone* with length 0..unbounded std::vector phone 0; /// Vector of uddi2__email* with length 0..unbounded std::vector email 0; /// Vector of uddi2__address* with length 0..unbounded std::vector address 0; /// Attribute useType of type xs:string @char* useType 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"contacts" class uddi2__contacts { public: /// Vector of uddi2__contact* with length 0..unbounded std::vector contact 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"discoveryURLs" class uddi2__discoveryURLs { public: /// Vector of uddi2__discoveryURL* with length 0..unbounded std::vector discoveryURL 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"dispositionReport" class uddi2__dispositionReport { public: /// Vector of uddi2__result* with length 0..unbounded std::vector result 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"findQualifiers" class uddi2__findQualifiers { public: /// Vector of char* with length 0..unbounded std::vector findQualifier 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"hostingRedirector" class uddi2__hostingRedirector { public: /// Attribute bindingKey of type "urn:uddi-org:api_v2":bindingKey @uddi2__bindingKey bindingKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"identifierBag" class uddi2__identifierBag { public: /// Vector of uddi2__keyedReference* with length 0..unbounded std::vector keyedReference 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"instanceDetails" class uddi2__instanceDetails { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":overviewDoc uddi2__overviewDoc* overviewDoc 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":instanceParms char* instanceParms 0; ///< Optional element /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"keyedReference" class uddi2__keyedReference { public: /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 0; ///< Optional attribute /// Attribute keyName of type xs:string @char* keyName 0; ///< Optional attribute /// Attribute keyValue of type xs:string @char* keyValue 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"keysOwned" class uddi2__keysOwned { public: /// Element reference "urn:uddi-org:api_v2":fromKey uddi2__businessKey fromKey 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":toKey uddi2__businessKey toKey 0; ///< Optional element /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"overviewDoc" class uddi2__overviewDoc { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":overviewURL char* overviewURL 0; ///< Optional element /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"publisherAssertion" class uddi2__publisherAssertion { public: /// Element reference "urn:uddi-org:api_v2":fromKey uddi2__businessKey fromKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":toKey uddi2__businessKey toKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":keyedReference uddi2__keyedReference* keyedReference 1; ///< Required element /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"relatedBusinessInfo" class uddi2__relatedBusinessInfo { public: /// Element reference "urn:uddi-org:api_v2":businessKey uddi2__businessKey businessKey 1; ///< Required element /// Vector of uddi2__name* with length 0..unbounded std::vector name 1; /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Vector of uddi2__sharedRelationships* with length 0..2 std::vector sharedRelationships 1:2; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"relatedBusinessInfos" class uddi2__relatedBusinessInfos { public: /// Vector of uddi2__relatedBusinessInfo* with length 0..unbounded std::vector relatedBusinessInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"result" class uddi2__result { public: /// Element reference "urn:uddi-org:api_v2":errInfo uddi2__errInfo* errInfo 0; ///< Optional element /// Attribute keyType of type "urn:uddi-org:api_v2":keyType @enum uddi2__keyType* keyType 0; ///< Optional attribute /// Attribute errno of type xs:int @int errno_ 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"serviceInfo" class uddi2__serviceInfo { public: /// Vector of uddi2__name* with length 0..unbounded std::vector name 0; /// Attribute serviceKey of type "urn:uddi-org:api_v2":serviceKey @uddi2__serviceKey serviceKey 1; ///< Required attribute /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"serviceInfos" class uddi2__serviceInfos { public: /// Vector of uddi2__serviceInfo* with length 0..unbounded std::vector serviceInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"sharedRelationships" class uddi2__sharedRelationships { public: /// Vector of uddi2__keyedReference* with length 0..unbounded std::vector keyedReference 1; /// Attribute direction of type "urn:uddi-org:api_v2":direction @enum uddi2__direction direction 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModel" class uddi2__tModel { public: /// Element reference "urn:uddi-org:api_v2":name uddi2__name* name 1; ///< Required element /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":overviewDoc uddi2__overviewDoc* overviewDoc 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":identifierBag uddi2__identifierBag* identifierBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 0; ///< Optional attribute /// Attribute authorizedName of type xs:string @char* authorizedName 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelBag" class uddi2__tModelBag { public: /// Vector of uddi2__tModelKey with length 0..unbounded std::vector tModelKey 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelInfo" class uddi2__tModelInfo { public: /// Element reference "urn:uddi-org:api_v2":name uddi2__name* name 1; ///< Required element /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelInfos" class uddi2__tModelInfos { public: /// Vector of uddi2__tModelInfo* with length 0..unbounded std::vector tModelInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelInstanceDetails" class uddi2__tModelInstanceDetails { public: /// Vector of uddi2__tModelInstanceInfo* with length 0..unbounded std::vector tModelInstanceInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelInstanceInfo" class uddi2__tModelInstanceInfo { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":instanceDetails uddi2__instanceDetails* instanceDetails 0; ///< Optional element /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"add_publisherAssertions" class uddi2__add_USCOREpublisherAssertions { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__publisherAssertion* with length 0..unbounded std::vector publisherAssertion 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__add_USCOREpublisherAssertions(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__add_USCOREpublisherAssertions(struct soap*, std::vector publisherAssertions); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_binding" class uddi2__delete_USCOREbinding { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__bindingKey with length 0..unbounded std::vector bindingKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbinding(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbinding(struct soap*, const char *bindingKey); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbinding(struct soap*, std::vector bindingKeys); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_business" class uddi2__delete_USCOREbusiness { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__businessKey with length 0..unbounded std::vector businessKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbusiness(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbusiness(struct soap*, const char *businessKey); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbusiness(struct soap*, std::vector businessKeys); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_publisherAssertions" class uddi2__delete_USCOREpublisherAssertions { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__publisherAssertion* with length 0..unbounded std::vector publisherAssertion 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREpublisherAssertions(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREpublisherAssertions(struct soap*, std::vector publisherAssertions); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_service" class uddi2__delete_USCOREservice { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__serviceKey with length 0..unbounded std::vector serviceKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREservice(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREservice(struct soap*, const char *serviceKey); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREservice(struct soap*, std::vector serviceKeys); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_tModel" class uddi2__delete_USCOREtModel { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__tModelKey with length 0..unbounded std::vector tModelKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREtModel(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREtModel(struct soap*, const char *tModelKey); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREtModel(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"discard_authToken" class uddi2__discard_USCOREauthToken { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__discard_USCOREauthToken(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__discard_USCOREauthToken(struct soap*, const char *authInfo); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_binding" class uddi2__find_USCOREbinding { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":tModelBag uddi2__tModelBag* tModelBag 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// Attribute serviceKey of type "urn:uddi-org:api_v2":serviceKey @uddi2__serviceKey serviceKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbinding(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbinding(struct soap*, const char *tModelKey); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbinding(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__bindingDetail *send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_business" class uddi2__find_USCOREbusiness { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Vector of uddi2__name* with length 0..unbounded std::vector name 0; /// Element reference "urn:uddi-org:api_v2":identifierBag uddi2__identifierBag* identifierBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":tModelBag uddi2__tModelBag* tModelBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":discoveryURLs uddi2__discoveryURLs* discoveryURLs 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbusiness(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbusiness(struct soap*, const char *name); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbusiness(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbusiness(struct soap*, std::vector keyedReferences); /// Member declared in uddi2-typemap.dat uddi2__businessList *send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_relatedBusinesses" class uddi2__find_USCORErelatedBusinesses { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":businessKey uddi2__businessKey businessKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":keyedReference uddi2__keyedReference* keyedReference 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCORErelatedBusinesses(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCORErelatedBusinesses(struct soap*, const char *businessKey); /// Member declared in uddi2-typemap.dat uddi2__relatedBusinessesList *send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_service" class uddi2__find_USCOREservice { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Vector of uddi2__name* with length 0..unbounded std::vector name 0; /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":tModelBag uddi2__tModelBag* tModelBag 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCOREservice(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREservice(struct soap*, const char *name); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREservice(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREservice(struct soap*, std::vector keyedReferences); /// Member declared in uddi2-typemap.dat uddi2__serviceList* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_tModel" class uddi2__find_USCOREtModel { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":name uddi2__name* name 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":identifierBag uddi2__identifierBag* identifierBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCOREtModel(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREtModel(struct soap*, const char *name); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREtModel(struct soap*, std::vector keyedReferences); /// Member declared in uddi2-typemap.dat uddi2__tModelList* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_assertionStatusReport" class uddi2__get_USCOREassertionStatusReport { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":completionStatus char* completionStatus 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREassertionStatusReport(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREassertionStatusReport(struct soap*, const char *completionStatus); /// Member declared in uddi2-typemap.dat uddi2__assertionStatusReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"get_authToken" class uddi2__get_USCOREauthToken { public: /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute userID of type xs:string @char* userID 1; ///< Required attribute /// Attribute cred of type xs:string @char* cred 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREauthToken(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREauthToken(struct soap*, const char *userid, const char *passwd); /// Member declared in uddi2-typemap.dat uddi2__authToken* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_bindingDetail" class uddi2__get_USCOREbindingDetail { public: /// Vector of uddi2__bindingKey with length 0..unbounded std::vector bindingKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbindingDetail(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbindingDetail(struct soap*, const char *bindingKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbindingDetail(struct soap*, std::vector bindingKeys); /// Member declared in uddi2-typemap.dat uddi2__bindingDetail* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_businessDetail" class uddi2__get_USCOREbusinessDetail { public: /// Vector of uddi2__businessKey with length 0..unbounded std::vector businessKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetail(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetail(struct soap*, const char *businessKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetail(struct soap*, std::vector businessKeys); /// Member declared in uddi2-typemap.dat uddi2__businessDetail* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_businessDetailExt" class uddi2__get_USCOREbusinessDetailExt { public: /// Vector of uddi2__businessKey with length 0..unbounded std::vector businessKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetailExt(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetailExt(struct soap*, const char *businessKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetailExt(struct soap*, std::vector businessKeys); /// Member declared in uddi2-typemap.dat uddi2__businessDetailExt* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_publisherAssertions" class uddi2__get_USCOREpublisherAssertions { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREpublisherAssertions(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__publisherAssertions* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"get_registeredInfo" class uddi2__get_USCOREregisteredInfo { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREregisteredInfo(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__registeredInfo* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"get_serviceDetail" class uddi2__get_USCOREserviceDetail { public: /// Vector of uddi2__serviceKey with length 0..unbounded std::vector serviceKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREserviceDetail(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREserviceDetail(struct soap*, const char *serviceKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREserviceDetail(struct soap*, std::vector serviceKeys); /// Member declared in uddi2-typemap.dat uddi2__serviceDetail* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_tModelDetail" class uddi2__get_USCOREtModelDetail { public: /// Vector of uddi2__tModelKey with length 0..unbounded std::vector tModelKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREtModelDetail(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREtModelDetail(struct soap*, const char *tModelKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREtModelDetail(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__tModelDetail* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"save_binding" class uddi2__save_USCOREbinding { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__bindingTemplate* with length 0..unbounded std::vector bindingTemplate 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbinding(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbinding(struct soap*, uddi2__bindingTemplate &bindingTemplate); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbinding(struct soap*, std::vector bindingTemplates); /// Member declared in uddi2-typemap.dat uddi2__bindingDetail* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"save_business" class uddi2__save_USCOREbusiness { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__businessEntity* with length 0..unbounded std::vector businessEntity 0; /// Vector of char* with length 0..unbounded std::vector uploadRegister 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbusiness(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbusiness(struct soap*, uddi2__businessEntity &businessEntity); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbusiness(struct soap*, std::vector businessEntities); /// Member declared in uddi2-typemap.dat uddi2__businessDetail* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"save_service" class uddi2__save_USCOREservice { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__businessService* with length 0..unbounded std::vector businessService 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__save_USCOREservice(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREservice(struct soap*, uddi2__businessService &businessService); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREservice(struct soap*, std::vector businessServices); /// Member declared in uddi2-typemap.dat uddi2__serviceDetail* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"save_tModel" class uddi2__save_USCOREtModel { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__tModel* with length 0..unbounded std::vector tModel 0; /// Vector of char* with length 0..unbounded std::vector uploadRegister 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__save_USCOREtModel(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREtModel(struct soap*, uddi2__tModel &tModel); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREtModel(struct soap*, std::vector tModels); /// Member declared in uddi2-typemap.dat uddi2__tModelDetail* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"set_publisherAssertions" class uddi2__set_USCOREpublisherAssertions { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__publisherAssertion* with length 0..unbounded std::vector publisherAssertion 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__set_USCOREpublisherAssertions(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__set_USCOREpublisherAssertions(struct soap*, std::vector publisherAssertions); /// Member declared in uddi2-typemap.dat uddi2__publisherAssertions* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"validate_values" class uddi2__validate_USCOREvalues { public: // CHOICE OF ELEMENTS: /// Vector of uddi2__businessEntity* with length 0..unbounded std::vector businessEntity 0; /// Vector of uddi2__businessService* with length 0..unbounded std::vector businessService 0; /// Vector of uddi2__tModel* with length 0..unbounded std::vector tModel 0; // END CHOICE /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"assertionStatusReport" class uddi2__assertionStatusReport { public: /// Vector of uddi2__assertionStatusItem* with length 0..unbounded std::vector assertionStatusItem 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"authToken" class uddi2__authToken { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"bindingDetail" class uddi2__bindingDetail { public: /// Vector of uddi2__bindingTemplate* with length 0..unbounded std::vector bindingTemplate 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessDetail" class uddi2__businessDetail { public: /// Vector of uddi2__businessEntity* with length 0..unbounded std::vector businessEntity 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessDetailExt" class uddi2__businessDetailExt { public: /// Vector of uddi2__businessEntityExt* with length 0..unbounded std::vector businessEntityExt 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessList" class uddi2__businessList { public: /// Element reference "urn:uddi-org:api_v2":businessInfos uddi2__businessInfos* businessInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"publisherAssertions" class uddi2__publisherAssertions { public: /// Vector of uddi2__publisherAssertion* with length 0..unbounded std::vector publisherAssertion 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute authorizedName of type xs:string @char* authorizedName 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"registeredInfo" class uddi2__registeredInfo { public: /// Element reference "urn:uddi-org:api_v2":businessInfos uddi2__businessInfos* businessInfos 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":tModelInfos uddi2__tModelInfos* tModelInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"relatedBusinessesList" class uddi2__relatedBusinessesList { public: /// Element reference "urn:uddi-org:api_v2":businessKey uddi2__businessKey businessKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":relatedBusinessInfos uddi2__relatedBusinessInfos* relatedBusinessInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"serviceDetail" class uddi2__serviceDetail { public: /// Vector of uddi2__businessService* with length 0..unbounded std::vector businessService 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"serviceList" class uddi2__serviceList { public: /// Element reference "urn:uddi-org:api_v2":serviceInfos uddi2__serviceInfos* serviceInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelDetail" class uddi2__tModelDetail { public: /// Vector of uddi2__tModel* with length 0..unbounded std::vector tModel 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelList" class uddi2__tModelList { public: /// Element reference "urn:uddi-org:api_v2":tModelInfos uddi2__tModelInfos* tModelInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"accessPoint" class uddi2__accessPoint { public: char* __item ; /// Attribute URLType of type "urn:uddi-org:api_v2":URLType @enum uddi2__URLType URLType 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"addressLine" class uddi2__addressLine { public: char* __item ; /// Attribute keyName of type xs:string @char* keyName 0; ///< Optional attribute /// Attribute keyValue of type xs:string @char* keyValue 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"description" class uddi2__description { public: char* __item ; /// Attribute reference xml:lang @xml__lang xml__lang_ 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"discoveryURL" class uddi2__discoveryURL { public: char* __item ; /// Attribute useType of type xs:string @char* useType 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"email" class uddi2__email { public: char* __item ; /// Attribute useType of type xs:string @char* useType 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"errInfo" class uddi2__errInfo { public: char* __item ; /// Attribute errCode of type xs:string @char* errCode 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"name" class uddi2__name { public: char* __item ; /// Attribute reference xml:lang @xml__lang xml__lang_ 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"phone" class uddi2__phone { public: char* __item ; /// Attribute useType of type xs:string @char* useType 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap inq2 service name: InquireSoap //gsoap inq2 service type: Inquire //gsoap inq2 service namespace: urn:uddi-org:inquiry_v2 //gsoap pub2 service name: PublishSoap //gsoap pub2 service type: Publish //gsoap pub2 service namespace: urn:uddi-org:publication_v2 /** @mainpage Service Definitions @section Service_bindings Bindings - @ref InquireSoap - @ref PublishSoap */ /** @page InquireSoap Binding "InquireSoap" @section InquireSoap_operations Operations of Binding "InquireSoap" - @ref __inq2__find_USCOREbinding - @ref __inq2__find_USCOREbusiness - @ref __inq2__find_USCORErelatedBusinesses - @ref __inq2__find_USCOREservice - @ref __inq2__find_USCOREtModel - @ref __inq2__get_USCOREbindingDetail - @ref __inq2__get_USCOREbusinessDetail - @ref __inq2__get_USCOREbusinessDetailExt - @ref __inq2__get_USCOREserviceDetail - @ref __inq2__get_USCOREtModelDetail @section InquireSoap_ports Endpoints of Binding "InquireSoap" */ /** @page PublishSoap Binding "PublishSoap" @section PublishSoap_operations Operations of Binding "PublishSoap" - @ref __pub2__add_USCOREpublisherAssertions - @ref __pub2__delete_USCOREbinding - @ref __pub2__delete_USCOREbusiness - @ref __pub2__delete_USCOREpublisherAssertions - @ref __pub2__delete_USCOREservice - @ref __pub2__delete_USCOREtModel - @ref __pub2__discard_USCOREauthToken - @ref __pub2__get_USCOREassertionStatusReport - @ref __pub2__get_USCOREauthToken - @ref __pub2__get_USCOREpublisherAssertions - @ref __pub2__get_USCOREregisteredInfo - @ref __pub2__save_USCOREbinding - @ref __pub2__save_USCOREbusiness - @ref __pub2__save_USCOREservice - @ref __pub2__save_USCOREtModel - @ref __pub2__set_USCOREpublisherAssertions @section PublishSoap_ports Endpoints of Binding "PublishSoap" */ /******************************************************************************\ * * * SOAP Fault Detail * * * \******************************************************************************/ /// The SOAP Fault Detail element contains one of the following types serialized // in the __type and fault fields of the SOAP_ENV__Detail struct (see docs) class _dispositionReport { public: uddi2__dispositionReport* uddi2__dispositionReport_; struct soap *soap ; }; /******************************************************************************\ * * * InquireSoap * * * \******************************************************************************/ /******************************************************************************\ * * * __inq2__find_USCOREbinding * * * \******************************************************************************/ /// Operation "__inq2__find_USCOREbinding" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="find_binding" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__find_USCOREbinding(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: uddi2__find_USCOREbinding* uddi2__find_USCOREbinding_, // response parameters: uddi2__bindingDetail* uddi2__bindingDetail_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: find_USCOREbinding document //gsoap inq2 service method-encoding: find_USCOREbinding literal //gsoap inq2 service method-action: find_USCOREbinding find_binding //gsoap inq2 service method-fault: find_USCOREbinding _dispositionReport int __inq2__find_USCOREbinding( uddi2__find_USCOREbinding* uddi2__find_USCOREbinding_, uddi2__bindingDetail* uddi2__bindingDetail_ ///< response parameter ); /******************************************************************************\ * * * __inq2__find_USCOREbusiness * * * \******************************************************************************/ /// Operation "__inq2__find_USCOREbusiness" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="find_business" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__find_USCOREbusiness(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: uddi2__find_USCOREbusiness* uddi2__find_USCOREbusiness_, // response parameters: uddi2__businessList* uddi2__businessList_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: find_USCOREbusiness document //gsoap inq2 service method-encoding: find_USCOREbusiness literal //gsoap inq2 service method-action: find_USCOREbusiness find_business //gsoap inq2 service method-fault: find_USCOREbusiness _dispositionReport int __inq2__find_USCOREbusiness( uddi2__find_USCOREbusiness* uddi2__find_USCOREbusiness_, uddi2__businessList* uddi2__businessList_ ///< response parameter ); /******************************************************************************\ * * * __inq2__find_USCORErelatedBusinesses * * * \******************************************************************************/ /// Operation "__inq2__find_USCORErelatedBusinesses" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="find_relatedBusinesses" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__find_USCORErelatedBusinesses(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: uddi2__find_USCORErelatedBusinesses* uddi2__find_USCORErelatedBusinesses_, // response parameters: uddi2__relatedBusinessesList* uddi2__relatedBusinessesList_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: find_USCORErelatedBusinesses document //gsoap inq2 service method-encoding: find_USCORErelatedBusinesses literal //gsoap inq2 service method-action: find_USCORErelatedBusinesses find_relatedBusinesses //gsoap inq2 service method-fault: find_USCORErelatedBusinesses _dispositionReport int __inq2__find_USCORErelatedBusinesses( uddi2__find_USCORErelatedBusinesses* uddi2__find_USCORErelatedBusinesses_, uddi2__relatedBusinessesList* uddi2__relatedBusinessesList_ ///< response parameter ); /******************************************************************************\ * * * __inq2__find_USCOREservice * * * \******************************************************************************/ /// Operation "__inq2__find_USCOREservice" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="find_service" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__find_USCOREservice(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: uddi2__find_USCOREservice* uddi2__find_USCOREservice_, // response parameters: uddi2__serviceList* uddi2__serviceList_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: find_USCOREservice document //gsoap inq2 service method-encoding: find_USCOREservice literal //gsoap inq2 service method-action: find_USCOREservice find_service //gsoap inq2 service method-fault: find_USCOREservice _dispositionReport int __inq2__find_USCOREservice( uddi2__find_USCOREservice* uddi2__find_USCOREservice_, uddi2__serviceList* uddi2__serviceList_ ///< response parameter ); /******************************************************************************\ * * * __inq2__find_USCOREtModel * * * \******************************************************************************/ /// Operation "__inq2__find_USCOREtModel" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="find_tModel" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__find_USCOREtModel(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: uddi2__find_USCOREtModel* uddi2__find_USCOREtModel_, // response parameters: uddi2__tModelList* uddi2__tModelList_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: find_USCOREtModel document //gsoap inq2 service method-encoding: find_USCOREtModel literal //gsoap inq2 service method-action: find_USCOREtModel find_tModel //gsoap inq2 service method-fault: find_USCOREtModel _dispositionReport int __inq2__find_USCOREtModel( uddi2__find_USCOREtModel* uddi2__find_USCOREtModel_, uddi2__tModelList* uddi2__tModelList_ ///< response parameter ); /******************************************************************************\ * * * __inq2__get_USCOREbindingDetail * * * \******************************************************************************/ /// Operation "__inq2__get_USCOREbindingDetail" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_bindingDetail" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__get_USCOREbindingDetail(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: uddi2__get_USCOREbindingDetail* uddi2__get_USCOREbindingDetail_, // response parameters: uddi2__bindingDetail* uddi2__bindingDetail_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: get_USCOREbindingDetail document //gsoap inq2 service method-encoding: get_USCOREbindingDetail literal //gsoap inq2 service method-action: get_USCOREbindingDetail get_bindingDetail //gsoap inq2 service method-fault: get_USCOREbindingDetail _dispositionReport int __inq2__get_USCOREbindingDetail( uddi2__get_USCOREbindingDetail* uddi2__get_USCOREbindingDetail_, uddi2__bindingDetail* uddi2__bindingDetail_ ///< response parameter ); /******************************************************************************\ * * * __inq2__get_USCOREbusinessDetail * * * \******************************************************************************/ /// Operation "__inq2__get_USCOREbusinessDetail" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_businessDetail" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__get_USCOREbusinessDetail(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: uddi2__get_USCOREbusinessDetail* uddi2__get_USCOREbusinessDetail_, // response parameters: uddi2__businessDetail* uddi2__businessDetail_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: get_USCOREbusinessDetail document //gsoap inq2 service method-encoding: get_USCOREbusinessDetail literal //gsoap inq2 service method-action: get_USCOREbusinessDetail get_businessDetail //gsoap inq2 service method-fault: get_USCOREbusinessDetail _dispositionReport int __inq2__get_USCOREbusinessDetail( uddi2__get_USCOREbusinessDetail* uddi2__get_USCOREbusinessDetail_, uddi2__businessDetail* uddi2__businessDetail_ ///< response parameter ); /******************************************************************************\ * * * __inq2__get_USCOREbusinessDetailExt * * * \******************************************************************************/ /// Operation "__inq2__get_USCOREbusinessDetailExt" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_businessDetailExt" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__get_USCOREbusinessDetailExt(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: uddi2__get_USCOREbusinessDetailExt* uddi2__get_USCOREbusinessDetailExt_, // response parameters: uddi2__businessDetailExt* uddi2__businessDetailExt_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: get_USCOREbusinessDetailExt document //gsoap inq2 service method-encoding: get_USCOREbusinessDetailExt literal //gsoap inq2 service method-action: get_USCOREbusinessDetailExt get_businessDetailExt //gsoap inq2 service method-fault: get_USCOREbusinessDetailExt _dispositionReport int __inq2__get_USCOREbusinessDetailExt( uddi2__get_USCOREbusinessDetailExt* uddi2__get_USCOREbusinessDetailExt_, uddi2__businessDetailExt* uddi2__businessDetailExt_ ///< response parameter ); /******************************************************************************\ * * * __inq2__get_USCOREserviceDetail * * * \******************************************************************************/ /// Operation "__inq2__get_USCOREserviceDetail" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_serviceDetail" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__get_USCOREserviceDetail(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: uddi2__get_USCOREserviceDetail* uddi2__get_USCOREserviceDetail_, // response parameters: uddi2__serviceDetail* uddi2__serviceDetail_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: get_USCOREserviceDetail document //gsoap inq2 service method-encoding: get_USCOREserviceDetail literal //gsoap inq2 service method-action: get_USCOREserviceDetail get_serviceDetail //gsoap inq2 service method-fault: get_USCOREserviceDetail _dispositionReport int __inq2__get_USCOREserviceDetail( uddi2__get_USCOREserviceDetail* uddi2__get_USCOREserviceDetail_, uddi2__serviceDetail* uddi2__serviceDetail_ ///< response parameter ); /******************************************************************************\ * * * __inq2__get_USCOREtModelDetail * * * \******************************************************************************/ /// Operation "__inq2__get_USCOREtModelDetail" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_tModelDetail" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__get_USCOREtModelDetail(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: uddi2__get_USCOREtModelDetail* uddi2__get_USCOREtModelDetail_, // response parameters: uddi2__tModelDetail* uddi2__tModelDetail_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: get_USCOREtModelDetail document //gsoap inq2 service method-encoding: get_USCOREtModelDetail literal //gsoap inq2 service method-action: get_USCOREtModelDetail get_tModelDetail //gsoap inq2 service method-fault: get_USCOREtModelDetail _dispositionReport int __inq2__get_USCOREtModelDetail( uddi2__get_USCOREtModelDetail* uddi2__get_USCOREtModelDetail_, uddi2__tModelDetail* uddi2__tModelDetail_ ///< response parameter ); /******************************************************************************\ * * * PublishSoap * * * \******************************************************************************/ /******************************************************************************\ * * * __pub2__add_USCOREpublisherAssertions * * * \******************************************************************************/ /// Operation "__pub2__add_USCOREpublisherAssertions" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="add_publisherAssertions" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__add_USCOREpublisherAssertions(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: uddi2__add_USCOREpublisherAssertions* uddi2__add_USCOREpublisherAssertions_, // response parameters: uddi2__dispositionReport* uddi2__dispositionReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: add_USCOREpublisherAssertions document //gsoap pub2 service method-encoding: add_USCOREpublisherAssertions literal //gsoap pub2 service method-action: add_USCOREpublisherAssertions add_publisherAssertions //gsoap pub2 service method-fault: add_USCOREpublisherAssertions _dispositionReport int __pub2__add_USCOREpublisherAssertions( uddi2__add_USCOREpublisherAssertions* uddi2__add_USCOREpublisherAssertions_, uddi2__dispositionReport* uddi2__dispositionReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__delete_USCOREbinding * * * \******************************************************************************/ /// Operation "__pub2__delete_USCOREbinding" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="delete_binding" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__delete_USCOREbinding(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: uddi2__delete_USCOREbinding* uddi2__delete_USCOREbinding_, // response parameters: uddi2__dispositionReport* uddi2__dispositionReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: delete_USCOREbinding document //gsoap pub2 service method-encoding: delete_USCOREbinding literal //gsoap pub2 service method-action: delete_USCOREbinding delete_binding //gsoap pub2 service method-fault: delete_USCOREbinding _dispositionReport int __pub2__delete_USCOREbinding( uddi2__delete_USCOREbinding* uddi2__delete_USCOREbinding_, uddi2__dispositionReport* uddi2__dispositionReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__delete_USCOREbusiness * * * \******************************************************************************/ /// Operation "__pub2__delete_USCOREbusiness" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="delete_business" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__delete_USCOREbusiness(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: uddi2__delete_USCOREbusiness* uddi2__delete_USCOREbusiness_, // response parameters: uddi2__dispositionReport* uddi2__dispositionReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: delete_USCOREbusiness document //gsoap pub2 service method-encoding: delete_USCOREbusiness literal //gsoap pub2 service method-action: delete_USCOREbusiness delete_business //gsoap pub2 service method-fault: delete_USCOREbusiness _dispositionReport int __pub2__delete_USCOREbusiness( uddi2__delete_USCOREbusiness* uddi2__delete_USCOREbusiness_, uddi2__dispositionReport* uddi2__dispositionReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__delete_USCOREpublisherAssertions * * * \******************************************************************************/ /// Operation "__pub2__delete_USCOREpublisherAssertions" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="delete_publisherAssertions" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__delete_USCOREpublisherAssertions(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: uddi2__delete_USCOREpublisherAssertions* uddi2__delete_USCOREpublisherAssertions_, // response parameters: uddi2__dispositionReport* uddi2__dispositionReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: delete_USCOREpublisherAssertions document //gsoap pub2 service method-encoding: delete_USCOREpublisherAssertions literal //gsoap pub2 service method-action: delete_USCOREpublisherAssertions delete_publisherAssertions //gsoap pub2 service method-fault: delete_USCOREpublisherAssertions _dispositionReport int __pub2__delete_USCOREpublisherAssertions( uddi2__delete_USCOREpublisherAssertions* uddi2__delete_USCOREpublisherAssertions_, uddi2__dispositionReport* uddi2__dispositionReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__delete_USCOREservice * * * \******************************************************************************/ /// Operation "__pub2__delete_USCOREservice" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="delete_service" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__delete_USCOREservice(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: uddi2__delete_USCOREservice* uddi2__delete_USCOREservice_, // response parameters: uddi2__dispositionReport* uddi2__dispositionReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: delete_USCOREservice document //gsoap pub2 service method-encoding: delete_USCOREservice literal //gsoap pub2 service method-action: delete_USCOREservice delete_service //gsoap pub2 service method-fault: delete_USCOREservice _dispositionReport int __pub2__delete_USCOREservice( uddi2__delete_USCOREservice* uddi2__delete_USCOREservice_, uddi2__dispositionReport* uddi2__dispositionReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__delete_USCOREtModel * * * \******************************************************************************/ /// Operation "__pub2__delete_USCOREtModel" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="delete_tModel" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__delete_USCOREtModel(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: uddi2__delete_USCOREtModel* uddi2__delete_USCOREtModel_, // response parameters: uddi2__dispositionReport* uddi2__dispositionReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: delete_USCOREtModel document //gsoap pub2 service method-encoding: delete_USCOREtModel literal //gsoap pub2 service method-action: delete_USCOREtModel delete_tModel //gsoap pub2 service method-fault: delete_USCOREtModel _dispositionReport int __pub2__delete_USCOREtModel( uddi2__delete_USCOREtModel* uddi2__delete_USCOREtModel_, uddi2__dispositionReport* uddi2__dispositionReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__discard_USCOREauthToken * * * \******************************************************************************/ /// Operation "__pub2__discard_USCOREauthToken" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="discard_authToken" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__discard_USCOREauthToken(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: uddi2__discard_USCOREauthToken* uddi2__discard_USCOREauthToken_, // response parameters: uddi2__dispositionReport* uddi2__dispositionReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: discard_USCOREauthToken document //gsoap pub2 service method-encoding: discard_USCOREauthToken literal //gsoap pub2 service method-action: discard_USCOREauthToken discard_authToken //gsoap pub2 service method-fault: discard_USCOREauthToken _dispositionReport int __pub2__discard_USCOREauthToken( uddi2__discard_USCOREauthToken* uddi2__discard_USCOREauthToken_, uddi2__dispositionReport* uddi2__dispositionReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__get_USCOREassertionStatusReport * * * \******************************************************************************/ /// Operation "__pub2__get_USCOREassertionStatusReport" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_assertionStatusReport" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__get_USCOREassertionStatusReport(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: uddi2__get_USCOREassertionStatusReport* uddi2__get_USCOREassertionStatusReport_, // response parameters: uddi2__assertionStatusReport* uddi2__assertionStatusReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: get_USCOREassertionStatusReport document //gsoap pub2 service method-encoding: get_USCOREassertionStatusReport literal //gsoap pub2 service method-action: get_USCOREassertionStatusReport get_assertionStatusReport //gsoap pub2 service method-fault: get_USCOREassertionStatusReport _dispositionReport int __pub2__get_USCOREassertionStatusReport( uddi2__get_USCOREassertionStatusReport* uddi2__get_USCOREassertionStatusReport_, uddi2__assertionStatusReport* uddi2__assertionStatusReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__get_USCOREauthToken * * * \******************************************************************************/ /// Operation "__pub2__get_USCOREauthToken" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_authToken" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__get_USCOREauthToken(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: uddi2__get_USCOREauthToken* uddi2__get_USCOREauthToken_, // response parameters: uddi2__authToken* uddi2__authToken_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: get_USCOREauthToken document //gsoap pub2 service method-encoding: get_USCOREauthToken literal //gsoap pub2 service method-action: get_USCOREauthToken get_authToken //gsoap pub2 service method-fault: get_USCOREauthToken _dispositionReport int __pub2__get_USCOREauthToken( uddi2__get_USCOREauthToken* uddi2__get_USCOREauthToken_, uddi2__authToken* uddi2__authToken_ ///< response parameter ); /******************************************************************************\ * * * __pub2__get_USCOREpublisherAssertions * * * \******************************************************************************/ /// Operation "__pub2__get_USCOREpublisherAssertions" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_publisherAssertions" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__get_USCOREpublisherAssertions(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: uddi2__get_USCOREpublisherAssertions* uddi2__get_USCOREpublisherAssertions_, // response parameters: uddi2__publisherAssertions* uddi2__publisherAssertions_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: get_USCOREpublisherAssertions document //gsoap pub2 service method-encoding: get_USCOREpublisherAssertions literal //gsoap pub2 service method-action: get_USCOREpublisherAssertions get_publisherAssertions //gsoap pub2 service method-fault: get_USCOREpublisherAssertions _dispositionReport int __pub2__get_USCOREpublisherAssertions( uddi2__get_USCOREpublisherAssertions* uddi2__get_USCOREpublisherAssertions_, uddi2__publisherAssertions* uddi2__publisherAssertions_ ///< response parameter ); /******************************************************************************\ * * * __pub2__get_USCOREregisteredInfo * * * \******************************************************************************/ /// Operation "__pub2__get_USCOREregisteredInfo" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_registeredInfo" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__get_USCOREregisteredInfo(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: uddi2__get_USCOREregisteredInfo* uddi2__get_USCOREregisteredInfo_, // response parameters: uddi2__registeredInfo* uddi2__registeredInfo_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: get_USCOREregisteredInfo document //gsoap pub2 service method-encoding: get_USCOREregisteredInfo literal //gsoap pub2 service method-action: get_USCOREregisteredInfo get_registeredInfo //gsoap pub2 service method-fault: get_USCOREregisteredInfo _dispositionReport int __pub2__get_USCOREregisteredInfo( uddi2__get_USCOREregisteredInfo* uddi2__get_USCOREregisteredInfo_, uddi2__registeredInfo* uddi2__registeredInfo_ ///< response parameter ); /******************************************************************************\ * * * __pub2__save_USCOREbinding * * * \******************************************************************************/ /// Operation "__pub2__save_USCOREbinding" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="save_binding" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__save_USCOREbinding(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: uddi2__save_USCOREbinding* uddi2__save_USCOREbinding_, // response parameters: uddi2__bindingDetail* uddi2__bindingDetail_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: save_USCOREbinding document //gsoap pub2 service method-encoding: save_USCOREbinding literal //gsoap pub2 service method-action: save_USCOREbinding save_binding //gsoap pub2 service method-fault: save_USCOREbinding _dispositionReport int __pub2__save_USCOREbinding( uddi2__save_USCOREbinding* uddi2__save_USCOREbinding_, uddi2__bindingDetail* uddi2__bindingDetail_ ///< response parameter ); /******************************************************************************\ * * * __pub2__save_USCOREbusiness * * * \******************************************************************************/ /// Operation "__pub2__save_USCOREbusiness" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="save_business" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__save_USCOREbusiness(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: uddi2__save_USCOREbusiness* uddi2__save_USCOREbusiness_, // response parameters: uddi2__businessDetail* uddi2__businessDetail_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: save_USCOREbusiness document //gsoap pub2 service method-encoding: save_USCOREbusiness literal //gsoap pub2 service method-action: save_USCOREbusiness save_business //gsoap pub2 service method-fault: save_USCOREbusiness _dispositionReport int __pub2__save_USCOREbusiness( uddi2__save_USCOREbusiness* uddi2__save_USCOREbusiness_, uddi2__businessDetail* uddi2__businessDetail_ ///< response parameter ); /******************************************************************************\ * * * __pub2__save_USCOREservice * * * \******************************************************************************/ /// Operation "__pub2__save_USCOREservice" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="save_service" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__save_USCOREservice(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: uddi2__save_USCOREservice* uddi2__save_USCOREservice_, // response parameters: uddi2__serviceDetail* uddi2__serviceDetail_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: save_USCOREservice document //gsoap pub2 service method-encoding: save_USCOREservice literal //gsoap pub2 service method-action: save_USCOREservice save_service //gsoap pub2 service method-fault: save_USCOREservice _dispositionReport int __pub2__save_USCOREservice( uddi2__save_USCOREservice* uddi2__save_USCOREservice_, uddi2__serviceDetail* uddi2__serviceDetail_ ///< response parameter ); /******************************************************************************\ * * * __pub2__save_USCOREtModel * * * \******************************************************************************/ /// Operation "__pub2__save_USCOREtModel" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="save_tModel" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__save_USCOREtModel(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: uddi2__save_USCOREtModel* uddi2__save_USCOREtModel_, // response parameters: uddi2__tModelDetail* uddi2__tModelDetail_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: save_USCOREtModel document //gsoap pub2 service method-encoding: save_USCOREtModel literal //gsoap pub2 service method-action: save_USCOREtModel save_tModel //gsoap pub2 service method-fault: save_USCOREtModel _dispositionReport int __pub2__save_USCOREtModel( uddi2__save_USCOREtModel* uddi2__save_USCOREtModel_, uddi2__tModelDetail* uddi2__tModelDetail_ ///< response parameter ); /******************************************************************************\ * * * __pub2__set_USCOREpublisherAssertions * * * \******************************************************************************/ /// Operation "__pub2__set_USCOREpublisherAssertions" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="set_publisherAssertions" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__set_USCOREpublisherAssertions(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: uddi2__set_USCOREpublisherAssertions* uddi2__set_USCOREpublisherAssertions_, // response parameters: uddi2__publisherAssertions* uddi2__publisherAssertions_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: set_USCOREpublisherAssertions document //gsoap pub2 service method-encoding: set_USCOREpublisherAssertions literal //gsoap pub2 service method-action: set_USCOREpublisherAssertions set_publisherAssertions //gsoap pub2 service method-fault: set_USCOREpublisherAssertions _dispositionReport int __pub2__set_USCOREpublisherAssertions( uddi2__set_USCOREpublisherAssertions* uddi2__set_USCOREpublisherAssertions_, uddi2__publisherAssertions* uddi2__publisherAssertions_ ///< response parameter ); /* End of uddi_v2.h */ gsoap-2.8.91/gsoap/uddi2/uddi2-typemap.dat0000644000175000017500000016654613525245163017612 0ustar ellertellert# uddi2map.dat # # gSOAP type map bindings for UDDI v2 to run the gSOAP WSDL tool 'wsdl2h' # # Includes full documentation and examples of the gSOAP UDDI v2 API [ /** @mainpage gSOAP UDDI v2 Universal Description, Discovery and Integration, or UDDI, is the name of a group of web-based registries that expose information about a business or other entity and its technical interfaces. See the UDDI v2 specification @url http://uddi.org/pubs/ProgrammersAPI_v2.htm for more details. @section UDDI2_CLASSES Classes See Related Pages for examples. UDDI Inquire classes - @ref uddi2__find_USCOREbinding - @ref uddi2__find_USCOREbusiness - @ref uddi2__find_USCORErelatedBusinesses - @ref uddi2__find_USCOREservice - @ref uddi2__find_USCOREtModel - @ref uddi2__get_USCOREbindingDetail - @ref uddi2__get_USCOREbusinessDetail - @ref uddi2__get_USCOREbusinessDetailExt - @ref uddi2__get_USCOREserviceDetail - @ref uddi2__get_USCOREtModelDetail UDDI Publish classes - @ref uddi2__add_USCOREpublisherAssertions - @ref uddi2__delete_USCOREbinding - @ref uddi2__delete_USCOREbusiness - @ref uddi2__delete_USCOREservice - @ref uddi2__delete_USCOREtModel - @ref uddi2__delete_USCOREpublisherAssertions - @ref uddi2__discard_USCOREauthToken - @ref uddi2__get_USCOREassertionStatusReport - @ref uddi2__get_USCOREauthToken - @ref uddi2__get_USCOREpublisherAssertions - @ref uddi2__get_USCOREregisteredInfo - @ref uddi2__save_USCOREbinding - @ref uddi2__save_USCOREbusiness - @ref uddi2__save_USCOREservice - @ref uddi2__save_USCOREtModel - @ref uddi2__set_USCOREpublisherAssertions @section UDDI2_BINDINGS Binding Reference - @ref InquireSoap - @ref PublishSoap */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_binding // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREbinding @brief Represents a request to locate bindings that meet the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137712 */ /** @fn uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbinding class. */ /** @fn uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap, const char *tModelKey) @brief @param[in] soap gSOAP context @param[in] tModelKey string Creates an instance of the find_USCOREbinding class using the specified tModel key. */ /** @fn uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of tModel key strings Creates an instance of the find_USCOREbinding class using the specified tModel keys. */ /** @fn uddi2__bindingDetail* uddi2__find_USCOREbinding::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__bindingDetail object or NULL on error Send a request to a UDDI server to find binding details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_business // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREbusiness @brief Represents a request to locate businesses that meet specific requirements. When the send method is called, the instance returns a uddi2__businessList object that contains a list of business that matched the search criteria. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137713 See also @ref example2. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, const char *name) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class using the specified name of the requested business. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, std::vector keyedReferences) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class using the specified category references. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class using the specified tModel keys. */ /** @fn uddi2__businessList *uddi2__find_USCOREbusiness::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__businessList object or NULL on error Send a request to a UDDI server to find a list of businesses. See also @ref example2. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_relatedBusinesses // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCORErelatedBusinesses @brief Represents a request to locate businesses that are related to a specific business. When the send method is called, the instance returns a uddi2__relatedBusinessList object that contains a list of business that matched the relationship set. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137714 */ /** @fn uddi2__find_USCORErelatedBusinesses::uddi2__find_USCORErelatedBusinesses(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCORErelatedBusiness class. */ /** @fn uddi2__find_USCORErelatedBusinesses::uddi2__find_USCORErelatedBusinesses(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey string Creates an instance of the find_USCORErelatedBusiness class using the specified business key. */ /** @fn uddi2__relatedBusinessesList *uddi2__find_USCORErelatedBusinesses::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__relatedBusinessList object or NULL on error Send a request to a UDDI server to find a list of related businesses. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_service // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREservice @brief Represents a request to locate services that meet the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137715 See also @ref example1. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREservice class. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, const char *name) @brief @param[in] soap gSOAP context @param[in] name of the service Creates an instance of the find_USCOREservice class using the specified name. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, std::vector keyedReferences) @brief @param[in] soap gSOAP context @param[in] keyedReferences collection of category keys Creates an instance of the find_USCOREservice class using the specified category keys. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of tModel key strings Creates an instance of the find_USCOREservice class using the specified tModel keys. */ /** @fn uddi2__serviceList* uddi2__find_USCOREservice::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__serviceList object or NULL on error Send a request to a UDDI server to find a list of services. See also @ref example1. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_tModel // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREtModel @brief Represents a request to locate a list of tModel entries that match a set of specific criteria. The result of a search is a uddi2__tModelList object that contains information about registered tModel data that matches the criteria. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137716 */ /** @fn uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREtModel class. */ /** @fn uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap, const char *name) @brief @param[in] soap gSOAP context @param[in] name of the tModel Creates an instance of the find_USCOREtModel class using the specified tModel name. */ /** @fn uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap, std::vector keyedReferences) @brief @param[in] soap gSOAP context @param[in] keyedReferences collection of category keys Creates an instance of the find_USCOREtModel class using the specified category keys. */ /** @fn uddi2__tModelList* uddi2__find_USCOREtModel::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__tModelList object or NULL on error Send a request to a UDDI server to find a tModelList. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_bindingDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREbindingDetail @brief Represents a request to get binding details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137717 */ /** @fn uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREbindingDetail class. */ /** @fn uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap, const char *bindingKey) @brief @param[in] soap gSOAP context @param[in] bindingKey string Creates an instance of the get_USCOREbindingDetail class using the specified binding key. */ /** @fn uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap, std::vector bindingKeys) @brief @param[in] soap gSOAP context @param[in] bindingKeys collection of key strings Creates an instance of the get_USCOREbindingDetail class using the specified collection of binding keys. */ /** @fn uddi2__bindingDetail* uddi2__get_USCOREbindingDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__bindingDetail object or NULL on error Send a request to a UDDI server to get the binding details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_businessDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREbusinessDetail @brief Represents a request to get business details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137718 */ /** @fn uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREbusinessDetail class. */ /** @fn uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey string Creates an instance of the get_USCOREbusinessDetail class using the specified business key. */ /** @fn uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap, std::vector businessKeys) @brief @param[in] soap gSOAP context @param[in] businessKeys collection of key strings Creates an instance of the get_USCOREbusinessDetail class using the specified collection of business keys. */ /** @fn uddi2__businessDetail* uddi2__get_USCOREbusinessDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__businessDetail object or NULL on error Send a request to a UDDI server to get the business details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_businessDetailExt // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREbusinessDetailExt @brief Represents a request to get business details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137719 */ /** @fn uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREbusinessDetailExt class. */ /** @fn uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey string Creates an instance of the get_USCOREbusinessDetailExt class using the specified business key. */ /** @fn uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap, std::vector businessKeys) @brief @param[in] soap gSOAP context @param[in] businessKeys collection of key strings Creates an instance of the get_USCOREbusinessDetailExt class using the specified collection of business keys. */ /** @fn uddi2__businessDetailExt* uddi2__get_USCOREbusinessDetailExt::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__businessDetailExt object or NULL on error Send a request to a UDDI server to get the business details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_serviceDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREserviceDetail @brief Represents a request to get service details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137720 */ /** @fn uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREserviceDetail class. */ /** @fn uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap, const char *serviceKey) @brief @param[in] soap gSOAP context @param[in] serviceKey string Creates an instance of the get_USCOREserviceDetail class using the specified service key. */ /** @fn uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap, std::vector serviceKeys) @brief @param[in] soap gSOAP context @param[in] serviceKeys collection of key strings Creates an instance of the get_USCOREserviceDetail class using the specified collection of service keys. */ /** @fn uddi2__serviceDetail* uddi2__get_USCOREserviceDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__serviceDetail object or NULL on error Send a request to a UDDI server to get the service details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_tModelDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREtModelDetail @brief Represents a request to get tModel details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137721 */ /** @fn uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREtModelDetail class. */ /** @fn uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap, const char *tModelKey) @brief @param[in] soap gSOAP context @param[in] tModelKey string Creates an instance of the get_USCOREtModelDetail class using the specified tModel key. */ /** @fn uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of key strings Creates an instance of the get_USCOREtModelDetail class using the specified collection of tModel keys. */ /** @fn uddi2__tModelDetail* uddi2__get_USCOREtModelDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__tModelDetail object or NULL on error Send a request to a UDDI server to get the tModel details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:add_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__add_USCOREpublisherAssertions @brief Represents a request to add one or more publisher assertions to the assertion collection for an individual publisher. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137731 */ /** @fn uddi2__add_USCOREpublisherAssertions::uddi2__add_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the add_USCOREpublisherAssertions class. */ /** @fn uddi2__add_USCOREpublisherAssertions::uddi2__add_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) @brief @param[in] soap gSOAP context @param[in] publisherAssertions collection of publisher assertions Creates an instance of the add_USCOREpublisherAssertions class using the specified publisher assertions. */ /** @fn uddi2__dispositionReport *uddi2__add_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI server to add one or more publisher assertions to the assertion collection for an individual publisher. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_binding // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREbinding @brief Represents a request to delete a binding that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137732 */ /** @fn uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap) @brief Creates an instance of the delete_USCOREbinding class. */ /** @fn uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap, const char *bindingKey) @brief @param[in] soap gSOAP context @param[in] bindingKey a binding key string Creates an instance of the delete_USCOREbinding class. */ /** @fn uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap, std::vector bindingKeys) @brief @param[in] soap gSOAP context @param[in] bindingKeys collection of binding keys Creates an instance of the delete_USCOREbinding class using the specified binding keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREbinding::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a binding that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_business // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREbusiness @brief Represents a request to delete a business that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137733 */ /** @fn uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREbusiness class. */ /** @fn uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey a business key string Creates an instance of the delete_USCOREbusiness class using the specified business key. */ /** @fn uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap, std::vector businessKeys) @brief @param[in] soap gSOAP context @param[in] businessKeys collection of business keys Creates an instance of the delete_USCOREbusiness class using the specified business keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREbusiness::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a business that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_service // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREservice @brief Represents a request to delete a service that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137735 */ /** @fn uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREservice class. */ /** @fn uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap, const char *serviceKey) @brief @param[in] soap gSOAP context @param[in] serviceKey a service key string Creates an instance of the delete_USCOREservice class using the specified service key. */ /** @fn uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap, std::vector serviceKeys) @brief @param[in] soap gSOAP context @param[in] serviceKeys collection of service keys Creates an instance of the delete_USCOREservice class using the specified service keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREservice::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a service that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_tModel // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREtModel @brief Represents a request to delete a tModel that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137736 */ /** @fn uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREtModel class. */ /** @fn uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap, const char *tModelKey) @brief @param[in] soap gSOAP context @param[in] tModelKey a tModel key string Creates an instance of the delete_USCOREtModel class using the specified tModel key. */ /** @fn uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of tModel keys Creates an instance of the delete_USCOREtModel class using the specified tModel keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREtModel::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a tModel that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREpublisherAssertions @brief Represents a request to delete publisher assertions meeting the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137734 */ /** @fn uddi2__delete_USCOREpublisherAssertions::uddi2__delete_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREpublisherAssertions class. */ /** @fn uddi2__delete_USCOREpublisherAssertions::uddi2__delete_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) @brief @param[in] soap gSOAP context @param[in] publisherAssertions a collection of publisher assertions Creates an instance of the delete_USCOREpublisherAssertions class using the specified collection of publisher assertions. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete publisher assertions meeting the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:discard_authToken // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__discard_USCOREauthToken @brief Represents a request to discard an authorization token obtained with the get_USCOREauthToken class. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137737 */ /** @fn uddi2__discard_USCOREauthToken::uddi2__discard_USCOREauthToken(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREauthToken class. */ /** @fn uddi2__discard_USCOREauthToken::uddi2__discard_USCOREauthToken(struct soap *soap, const char *authInfo) @brief @param[in] soap gSOAP context @param[in] authInfo authorization token provided by the UDDI server Creates an instance of the delete_USCOREauthToken class using the specified authentication token string. */ /** @fn uddi2__dispositionReport *uddi2__discard_USCOREauthToken::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to discard an authentication token. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_assertionStatusReport // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREassertionStatusReport @brief Provides the ability to determine the status of current and outstanding publisher assertions. The results can be restricted by setting the completionStatus property. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137738 */ /** @fn uddi2__get_USCOREassertionStatusReport::uddi2__get_USCOREassertionStatusReport(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREassertionStatusReport class. */ /** @fn uddi2__get_USCOREassertionStatusReport::uddi2__get_USCOREassertionStatusReport(struct soap *soap, const char *completionStatus) @brief @param[in] soap gSOAP context @param[in] completionStatus completion status string Creates an instance of the get_USCOREassertionStatusReport class using the specified completion status. */ /** @fn uddi2__assertionStatusReport *uddi2__get_USCOREassertionStatusReport::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__assertionStatusReport object or NULL on error Send a request to a UDDI service to get the status of current and outstanding publisher assertions. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_authToken // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREauthToken @brief Represents a request to obtain an authorization token, which is represented by the uddi2__authToken class. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137739 */ /** @fn uddi2__get_USCOREauthToken::uddi2__get_USCOREauthToken(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREauthToken class. */ /** @fn uddi2__get_USCOREauthToken::uddi2__get_USCOREauthToken(struct soap *soap, const char *userid, const char *passwd) @brief @param[in] soap gSOAP context @param[in] userid the user ID string @param[in] passwd the password string Creates an instance of the get_USCOREauthToken class using the specified user ID and password. */ /** @fn uddi2__authToken *uddi2__get_USCOREauthToken::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__authToken object or NULL on error Send a request to a UDDI service to get a authorization token given a user ID and password. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREpublisherAssertions @brief Represents a request to obtain the full set of publisher assertions that are associated with an individual publisher. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137740 */ /** @fn uddi2__get_USCOREpublisherAssertions::uddi2__get_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREpublisherAssetions class. */ /** @fn uddi2__publisherAssertions *uddi2__get_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__publisherAssertions object or NULL on error Send a request to a UDDI service to get publisher assertions. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_registeredInfo // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREregisteredInfo @brief Represents a request to get all registered business entities and tModels controlled by an individual. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137741 */ /** @fn uddi2__get_USCOREregisteredInfo::uddi2__get_USCOREregisteredInfo(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREregisteredInfo class. */ /** @fn uddi2__registeredInfo *uddi2__get_USCOREregisteredInfo::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__registeredInfo object or NULL on error Send a request to a UDDI service to get all registered business entities and tModels controlled by an individual. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_binding // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREbinding @brief Represents a request to post binding information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137742 */ /** @fn uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREbinding class. */ /** @fn uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap, uddi2__bindingTemplate &bindingTemplate) @brief @param[in] soap gSOAP context @param[in] bindingTemplate binding template Creates an instance of the save_USCOREbinding class using the specified binding template. */ /** @fn uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap, std::vector bindingTemplates) @brief @param[in] soap gSOAP context @param[in] bindingTemplates collection of binding templates Creates an instance of the save_USCOREbinding class using the specified binding templates. */ /** @fn uddi2__bindingDetail *uddi2__save_USCOREbinding::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__bindingDetail object or NULL on error Send a request to a UDDI server to post binding information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_business // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREbusiness @brief Represents a request to post business information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137743 */ /** @fn uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREbusiness class. */ /** @fn uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap, uddi2__businessEntity &businessEntity) @brief @param[in] soap gSOAP context @param[in] businessEntity business entity Creates an instance of the save_USCOREbusiness class using the specified business entity. */ /** @fn uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap, std::vector businessEntities) @brief @param[in] soap gSOAP context @param[in] businessEntities collection of business entities Creates an instance of the save_USCOREbusiness class using the specified business entities. */ /** @fn uddi2__businessDetail *uddi2__save_USCOREbusiness::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__businessDetail object or NULL on error Send a request to a UDDI server to post business information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_service // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREservice @brief Represents a request to post service information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137744 */ /** @fn uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREservice class. */ /** @fn uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap, uddi2__businessService &businessService) @brief @param[in] soap gSOAP context @param[in] businessService business service Creates an instance of the save_USCOREservice class using the specified service. */ /** @fn uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap, std::vector businessServices) @brief @param[in] soap gSOAP context @param[in] businessServices collection of business services Creates an instance of the save_USCOREservice class using the specified services. */ /** @fn uddi2__serviceDetail *uddi2__save_USCOREservice::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__serviceDetail object or NULL on error Send a request to a UDDI server to post service information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_tModel // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREtModel @brief Represents a request to post tModel information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137745 */ /** @fn uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREtModel class. */ /** @fn uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap, uddi2__tModel &tModel) @brief @param[in] soap gSOAP context @param[in] tModel a tModel Creates an instance of the save_USCOREtModel class using the specified tModel. */ /** @fn uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap, std::vector tModels) @brief @param[in] soap gSOAP context @param[in] tModels collection of tModels Creates an instance of the save_USCOREtModel class using the specified tModels. */ /** @fn uddi2__tModelDetail *uddi2__save_USCOREtModel::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__tModelDetail object or NULL on error Send a request to a UDDI server to post tModel information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:set_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__set_USCOREpublisherAssertions @brief Represents a request to modify the existing publisher assertions for an individual publisher. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137746 */ /** @fn uddi2__set_USCOREpublisherAssertions::uddi2__set_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the set_USCOREpublisherAssertions class. */ /** @fn uddi2__set_USCOREpublisherAssertions::uddi2__set_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) @brief @param[in] soap gSOAP context @param[in] publisherAssertions collection of publisher assertions Creates an instance of the set_USCOREpublisherAssertions class using the specified collection of publisher assertions. */ /** @fn uddi2__publisherAssertions *uddi2__set_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__publisherAssertions object or NULL on error Send a request to a UDDI server to post tModel information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // Code Examples // //////////////////////////////////////////////////////////////////////////////// /** @page example1 Code Example 1: Finding a service This example shows you how to find Web services. In this case, the example finds Web services with names that begin with the word "magic". @code #include "inqH.h" int main(int argc, char **argv) { char *search_string = "magic"; if (argc > 1) search_string = argv[1]; // Create a gSOAP context struct soap *soap = soap_new(); // Create an object to find a business uddi2__find_USCOREservice fs(soap, search_string); // Send the request uddi2__serviceList *sl = fs.send("http://uddi.xmethods.net/inquire"); // Check if result is OK if (!sl) soap_print_fault(soap, stderr); // If OK, report the service name(s) and unique identification keys else if (sl->serviceInfos) { std::cout << "Search results on " << search_string << ":" << std::endl << std::endl; for (std::vector::const_iterator si = sl->serviceInfos->serviceInfo.begin(); si != sl->serviceInfos->serviceInfo.end(); ++si) { // Report serviceKey and businessKey std::cout << "serviceKey=" << (*si)->serviceKey << std::endl << "businessKey=" << (*si)->businessKey << std::endl; // Report names for (std::vector::const_iterator n = (*si)->name.begin(); n != (*si)->name.end(); ++n) std::cout << "name=" << (*n)->__item << std::endl; std::cout << std::endl; } } // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } @endcode To compile: - wsdl2h -tuddi2-typemap.dat inquire_v2.wsdl - soapcpp2 -I.. -pinq inquire_v2.h - g++ -DWITH_NONAMESPACES -I.. -o example1 example1.cpp inquire_v2.cpp inqC.cpp inqClient.cpp ../stdsoap2.cpp */ /** @page example2 Code Example 2: Finding a business This example shows you how to find a business from a UDDI server. @code #include "inqH.h" int main(int argc, char **argv) { char *search_string = "xmethods"; if (argc > 1) search_string = argv[1]; // Create a gSOAP context struct soap *soap = soap_new(); // Create an object to find a business uddi2__find_USCOREbusiness fb(soap, search_string); // Send the request uddi2__businessList *bl = fb.send("http://uddi.xmethods.net/inquire"); // Check if result is OK if (!bl) soap_print_fault(soap, stderr); // If OK, report the business name(s) and unique identification keys else if (bl->businessInfos) { std::cout << "Search results on " << search_string << ":" << std::endl << std::endl; for (std::vector::const_iterator bi = bl->businessInfos->businessInfo.begin(); bi != bl->businessInfos->businessInfo.end(); ++bi) { // Report businessKey std::cout << "businessKey=" << (*bi)->businessKey << std::endl; // Report names for (std::vector::const_iterator n = (*bi)->name.begin(); n != (*bi)->name.end(); ++n) std::cout << "name=" << (*n)->__item << std::endl; std::cout << std::endl; } } // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } @endcode To compile: - wsdl2h -tuddi2-typemap.dat inquire_v2.wsdl - soapcpp2 -I.. -pinq inquire_v2.h - g++ -DWITH_NONAMESPACES -I.. -o example2 example2.cpp inquire_v2.cpp inqC.cpp inqClient.cpp ../stdsoap2.cpp */ /** @page example3 Code Example 3: Publishing a WSDL and service on XMethods This example shows you how to publish a Web service. In this case, the example template code obtains an authorization token, saves the tModel with the WSDL URL in the server, and saves the business service information in the server. @code #include "pubH.h" const char *server = "https://uddi.xmethods.net/publish"; const char *userid = "..."; // user ID to access UDDI server const char *passwd = "..."; // password to access UDDI server int main(int argc, char **argv) { // Create a gSOAP context struct soap *soap = soap_new(); // Setup SSL context (optional) to verify server's credentials if (soap_ssl_client_context(soap, SOAP_SSL_DEFAULT, NULL, NULL, "cacerts.pem", NULL, NULL)) { soap_print_fault(soap, stderr); exit(1); } // Step 1: Get an authorization token from the UDDI server uddi2__get_USCOREauthToken get_authToken(soap, userid, passwd); uddi2__authToken *authToken = get_authToken.send(server); // Check if authorized if (!authToken) { soap_print_fault(soap, stderr); exit(1); } // Authorization info provided by server for this session char *authInfo = authToken->authInfo; // Step 2: Create a tModel for the WSDL to be published uddi2__tModel tModel; tModel.soap_default(soap); // Create the tModel and service name tModel.name = soap_new_uddi2__name(soap, -1); tModel.name->__item = "..."; tModel.name->xml__lang_ = "en"; // Create XMethods description elements (see http://www.xmethods.net/ve2/UDDI.po) uddi2__description *description = soap_new_uddi2__description(soap, 6); description[0].__item = "SHORT DESCRIPTION: ..."; description[0].xml__lang_ = "en"; description[1].__item = "SHORT DESCRIPTION: ..."; description[1].xml__lang_ = "en"; description[2].__item = "USAGE NOTES: ..."; description[2].xml__lang_ = "en"; description[3].__item = "HOMEPAGE URL: ..."; description[3].xml__lang_ = "en"; description[4].__item = "CONTACT EMAIL: ..."; description[4].xml__lang_ = "en"; description[5].__item = "IMPLEMENTATION: ..."; description[5].xml__lang_ = "en"; // Add the four description elements to the tModel tModel.description.push_back(description + 0); tModel.description.push_back(description + 1); tModel.description.push_back(description + 2); tModel.description.push_back(description + 4); // Add an overviewDoc element with description and overviewURL tModel.overviewDoc = soap_new_uddi2__overviewDoc(soap, -1); tModel.overviewDoc->soap_default(soap); tModel.overviewDoc->description.push_back(soap_new_uddi2__description(soap, -1)); tModel.overviewDoc->description[0]->__item = "WSDL source document"; tModel.overviewDoc->description[0]->xml__lang_ = "en"; tModel.overviewDoc->overviewURL = "http://.../my.wsdl#bindingName"; // Omit identifier bag tModel.identifierBag = NULL; // Add a category with a WSDL-specific keyedReference tModel.categoryBag = soap_new_uddi2__categoryBag(soap, -1); tModel.categoryBag->soap_default(soap); tModel.categoryBag->keyedReference.push_back(soap_new_uddi2__keyedReference(soap, -1)); tModel.categoryBag->keyedReference[0]->tModelKey = "..."; tModel.categoryBag->keyedReference[0]->keyName = "uddi-org:types"; tModel.categoryBag->keyedReference[0]->keyValue = "wsdlSpec"; tModel.authorizedName = "..."; tModel.operator_ = "..."; tModel.tModelKey = "..."; // Save the tModel uddi2__save_USCOREtModel save_tModel(soap, tModel); uddi2__tModelDetail *tModelDetail = save_tModel.send(server, authInfo); // Step 3: Create a new service to be published uddi2__businessService service; service.soap_default(soap); // Service name is the tModel name (XMethods) service.name.push_back(tModel.name); // Add two description elements to the service service.description.push_back(description + 4); service.description.push_back(description + 5); // Create binding template uddi2__bindingTemplate bindingTemplate; bindingTemplate.soap_default(soap); bindingTemplate.tModelInstanceDetails = soap_new_uddi2__tModelInstanceDetails(soap, -1); bindingTemplate.tModelInstanceDetails->tModelInstanceInfo.push_back(soap_new_uddi2__tModelInstanceInfo(soap, -1)); bindingTemplate.tModelInstanceDetails->tModelInstanceInfo[0]->instanceDetails = NULL; bindingTemplate.tModelInstanceDetails->tModelInstanceInfo[0]->tModelKey = tModel.tModelKey; bindingTemplate.accessPoint = soap_new_uddi2__accessPoint(soap, -1); bindingTemplate.accessPoint->__item = "..."; bindingTemplate.accessPoint->URLType = uddi2__URLType__http; bindingTemplate.hostingRedirector = NULL; bindingTemplate.serviceKey = "..."; bindingTemplate.bindingKey = "..."; // Add binding Template to service service.bindingTemplates = soap_new_uddi2__bindingTemplates(soap, -1); service.bindingTemplates->soap_default(soap); service.bindingTemplates->bindingTemplate.push_back(&bindingTemplate); service.categoryBag = NULL; service.serviceKey = "..."; service.businessKey = "..."; // Save the service uddi2__save_USCOREservice save_service(soap, service); uddi2__serviceDetail *serviceDetail = save_service.send(server, authInfo); // Step 4: Discard authorization token uddi2__discard_USCOREauthToken discard_authToken(soap, authInfo); uddi2__dispositionReport *dispositionReport = discard_authToken.send(server); // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } @endcode To compile: - wsdl2h -tuddi2-typemap.dat publish_v2.wsdl - soapcpp2 -I.. -ppub publish_v2.h - g++ -DWITH_OPENSSL -DWITH_NONAMESPACES -I.. -o example3 example3.cpp publish_v2.cpp pubC.cpp pubClient.cpp ../stdsoap2.cpp */ ] ################################################################################ # # UDDI v2 XML namespaces # ################################################################################ inq2 = "urn:uddi-org:inquiry_v2" pub2 = "urn:uddi-org:publication_v2" uddi2 = "urn:uddi-org:api_v2" ################################################################################ # # Type Definitions # ################################################################################ # Use regular C strings only: xsd__string = | char* | char* ################################################################################ # # Class/Struct Extensions # ################################################################################ # uddi2:find_binding object extended with con/de-structors and send() uddi2__find_USCOREbinding = $ uddi2__find_USCOREbinding(struct soap*); uddi2__find_USCOREbinding = $ uddi2__find_USCOREbinding(struct soap*, const char *tModelKey); uddi2__find_USCOREbinding = $ uddi2__find_USCOREbinding(struct soap*, std::vector tModelKeys); uddi2__find_USCOREbinding = $ uddi2__bindingDetail *send(const char *endpoint); # uddi2:find_business object extended with con/de-structors and send() uddi2__find_USCOREbusiness = $ uddi2__find_USCOREbusiness(struct soap*); uddi2__find_USCOREbusiness = $ uddi2__find_USCOREbusiness(struct soap*, const char *name); uddi2__find_USCOREbusiness = $ uddi2__find_USCOREbusiness(struct soap*, std::vector tModelKeys); uddi2__find_USCOREbusiness = $ uddi2__find_USCOREbusiness(struct soap*, std::vector keyedReferences); uddi2__find_USCOREbusiness = $ uddi2__businessList *send(const char *endpoint); # uddi2:find_relatedBusinesses object extended with con/de-structors and send() uddi2__find_USCORErelatedBusinesses = $ uddi2__find_USCORErelatedBusinesses(struct soap*); uddi2__find_USCORErelatedBusinesses = $ uddi2__find_USCORErelatedBusinesses(struct soap*, const char *businessKey); uddi2__find_USCORErelatedBusinesses = $ uddi2__relatedBusinessesList *send(const char *endpoint); # uddi2:find_service object extended with con/de-structors and send() uddi2__find_USCOREservice = $ uddi2__find_USCOREservice(struct soap*); uddi2__find_USCOREservice = $ uddi2__find_USCOREservice(struct soap*, const char *name); uddi2__find_USCOREservice = $ uddi2__find_USCOREservice(struct soap*, std::vector tModelKeys); uddi2__find_USCOREservice = $ uddi2__find_USCOREservice(struct soap*, std::vector keyedReferences); uddi2__find_USCOREservice = $ uddi2__serviceList* send(const char *endpoint); # uddi2:find_tModel object extended with con/de-structors and send() uddi2__find_USCOREtModel = $ uddi2__find_USCOREtModel(struct soap*); uddi2__find_USCOREtModel = $ uddi2__find_USCOREtModel(struct soap*, const char *name); uddi2__find_USCOREtModel = $ uddi2__find_USCOREtModel(struct soap*, std::vector keyedReferences); uddi2__find_USCOREtModel = $ uddi2__tModelList* send(const char *endpoint); # uddi2:get_bindingDetail object extended with con/de-structors and send() uddi2__get_USCOREbindingDetail = $ uddi2__get_USCOREbindingDetail(struct soap*); uddi2__get_USCOREbindingDetail = $ uddi2__get_USCOREbindingDetail(struct soap*, const char *bindingKey); uddi2__get_USCOREbindingDetail = $ uddi2__get_USCOREbindingDetail(struct soap*, std::vector bindingKeys); uddi2__get_USCOREbindingDetail = $ uddi2__bindingDetail* send(const char *endpoint); # uddi2:get_businessDetail object extended with con/de-structors and send() uddi2__get_USCOREbusinessDetail = $ uddi2__get_USCOREbusinessDetail(struct soap*); uddi2__get_USCOREbusinessDetail = $ uddi2__get_USCOREbusinessDetail(struct soap*, const char *businessKey); uddi2__get_USCOREbusinessDetail = $ uddi2__get_USCOREbusinessDetail(struct soap*, std::vector businessKeys); uddi2__get_USCOREbusinessDetail = $ uddi2__businessDetail* send(const char *endpoint); # uddi2:get_businessDetailExt object extended with con/de-structors and send() uddi2__get_USCOREbusinessDetailExt = $ uddi2__get_USCOREbusinessDetailExt(struct soap*); uddi2__get_USCOREbusinessDetailExt = $ uddi2__get_USCOREbusinessDetailExt(struct soap*, const char *businessKey); uddi2__get_USCOREbusinessDetailExt = $ uddi2__get_USCOREbusinessDetailExt(struct soap*, std::vector businessKeys); uddi2__get_USCOREbusinessDetailExt = $ uddi2__businessDetailExt* send(const char *endpoint); # uddi2:get_serviceDetail object extended with con/de-structors and send() uddi2__get_USCOREserviceDetail = $ uddi2__get_USCOREserviceDetail(struct soap*); uddi2__get_USCOREserviceDetail = $ uddi2__get_USCOREserviceDetail(struct soap*, const char *serviceKey); uddi2__get_USCOREserviceDetail = $ uddi2__get_USCOREserviceDetail(struct soap*, std::vector serviceKeys); uddi2__get_USCOREserviceDetail = $ uddi2__serviceDetail* send(const char *endpoint); # uddi2:get_tModelDetail object extended with con/de-structors and send() uddi2__get_USCOREtModelDetail = $ uddi2__get_USCOREtModelDetail(struct soap*); uddi2__get_USCOREtModelDetail = $ uddi2__get_USCOREtModelDetail(struct soap*, const char *tModelKey); uddi2__get_USCOREtModelDetail = $ uddi2__get_USCOREtModelDetail(struct soap*, std::vector tModelKeys); uddi2__get_USCOREtModelDetail = $ uddi2__tModelDetail* send(const char *endpoint); # uddi2:add_publisherAssertions object extended with con/de-structors and send() uddi2__add_USCOREpublisherAssertions = $ uddi2__add_USCOREpublisherAssertions(struct soap*); uddi2__add_USCOREpublisherAssertions = $ uddi2__add_USCOREpublisherAssertions(struct soap*, std::vector publisherAssertions); uddi2__add_USCOREpublisherAssertions = $ uddi2__dispositionReport* send(const char *endpoint, char *authInfo); # uddi2:delete_binding object extended with con/de-structors and send() uddi2__delete_USCOREbinding = $ uddi2__delete_USCOREbinding(struct soap*); uddi2__delete_USCOREbinding = $ uddi2__delete_USCOREbinding(struct soap*, const char *bindingKey); uddi2__delete_USCOREbinding = $ uddi2__delete_USCOREbinding(struct soap*, std::vector bindingKeys); uddi2__delete_USCOREbinding = $ uddi2__dispositionReport* send(const char *endpoint, char *authInfo); # uddi2:delete_business object extended with con/de-structors and send() uddi2__delete_USCOREbusiness = $ uddi2__delete_USCOREbusiness(struct soap*); uddi2__delete_USCOREbusiness = $ uddi2__delete_USCOREbusiness(struct soap*, const char *businessKey); uddi2__delete_USCOREbusiness = $ uddi2__delete_USCOREbusiness(struct soap*, std::vector businessKeys); uddi2__delete_USCOREbusiness = $ uddi2__dispositionReport* send(const char *endpoint, char *authInfo); # uddi2:delete_service object extended with con/de-structors and send() uddi2__delete_USCOREservice = $ uddi2__delete_USCOREservice(struct soap*); uddi2__delete_USCOREservice = $ uddi2__delete_USCOREservice(struct soap*, const char *serviceKey); uddi2__delete_USCOREservice = $ uddi2__delete_USCOREservice(struct soap*, std::vector serviceKeys); uddi2__delete_USCOREservice = $ uddi2__dispositionReport* send(const char *endpoint, char *authInfo); # uddi2:delete_tModel object extended with con/de-structors and send() uddi2__delete_USCOREtModel = $ uddi2__delete_USCOREtModel(struct soap*); uddi2__delete_USCOREtModel = $ uddi2__delete_USCOREtModel(struct soap*, const char *tModelKey); uddi2__delete_USCOREtModel = $ uddi2__delete_USCOREtModel(struct soap*, std::vector tModelKeys); uddi2__delete_USCOREtModel = $ uddi2__dispositionReport* send(const char *endpoint, char *authInfo); # uddi2:delete_publisherAssertions object extended with con/de-structors and send() uddi2__delete_USCOREpublisherAssertions = $ uddi2__delete_USCOREpublisherAssertions(struct soap*); uddi2__delete_USCOREpublisherAssertions = $ uddi2__delete_USCOREpublisherAssertions(struct soap*, std::vector publisherAssertions); uddi2__delete_USCOREpublisherAssertions = $ uddi2__dispositionReport* send(const char *endpoint, char *authInfo); # uddi2:discard_authToken object extended with con/de-structors and send() uddi2__discard_USCOREauthToken = $ uddi2__discard_USCOREauthToken(struct soap*); uddi2__discard_USCOREauthToken = $ uddi2__discard_USCOREauthToken(struct soap*, const char *authInfo); uddi2__discard_USCOREauthToken = $ uddi2__dispositionReport* send(const char *endpoint); # uddi2:get_assertionStatusReport object extended with con/de-structors and send() uddi2__get_USCOREassertionStatusReport = $ uddi2__get_USCOREassertionStatusReport(struct soap*); uddi2__get_USCOREassertionStatusReport = $ uddi2__get_USCOREassertionStatusReport(struct soap*, const char *completionStatus); uddi2__get_USCOREassertionStatusReport = $ uddi2__assertionStatusReport* send(const char *endpoint, char *authInfo); # uddi2:get_authToken object extended with con/de-structors and send() uddi2__get_USCOREauthToken = $ uddi2__get_USCOREauthToken(struct soap*); uddi2__get_USCOREauthToken = $ uddi2__get_USCOREauthToken(struct soap*, const char *userid, const char *passwd); uddi2__get_USCOREauthToken = $ uddi2__authToken* send(const char *endpoint); # uddi2:get_publisherAssertions object extended with con/de-structors and send() uddi2__get_USCOREpublisherAssertions = $ uddi2__get_USCOREpublisherAssertions(struct soap*); uddi2__get_USCOREpublisherAssertions = $ uddi2__publisherAssertions* send(const char *endpoint, char *authInfo); # uddi2:get_registeredInfo object extended with con/de-structors and send() uddi2__get_USCOREregisteredInfo = $ uddi2__get_USCOREregisteredInfo(struct soap*); uddi2__get_USCOREregisteredInfo = $ uddi2__registeredInfo* send(const char *endpoint, char *authInfo); # uddi2:save_binding object extended with con/de-structors and send() uddi2__save_USCOREbinding = $ uddi2__save_USCOREbinding(struct soap*); uddi2__save_USCOREbinding = $ uddi2__save_USCOREbinding(struct soap*, uddi2__bindingTemplate &bindingTemplate); uddi2__save_USCOREbinding = $ uddi2__save_USCOREbinding(struct soap*, std::vector bindingTemplates); uddi2__save_USCOREbinding = $ uddi2__bindingDetail* send(const char *endpoint, char *authInfo); # uddi2:save_business object extended with con/de-structors and send() uddi2__save_USCOREbusiness = $ uddi2__save_USCOREbusiness(struct soap*); uddi2__save_USCOREbusiness = $ uddi2__save_USCOREbusiness(struct soap*, uddi2__businessEntity &businessEntity); uddi2__save_USCOREbusiness = $ uddi2__save_USCOREbusiness(struct soap*, std::vector businessEntities); uddi2__save_USCOREbusiness = $ uddi2__businessDetail* send(const char *endpoint, char *authInfo); # uddi2:save_service object extended with con/de-structors and send() uddi2__save_USCOREservice = $ uddi2__save_USCOREservice(struct soap*); uddi2__save_USCOREservice = $ uddi2__save_USCOREservice(struct soap*, uddi2__businessService &businessService); uddi2__save_USCOREservice = $ uddi2__save_USCOREservice(struct soap*, std::vector businessServices); uddi2__save_USCOREservice = $ uddi2__serviceDetail* send(const char *endpoint, char *authInfo); # uddi2:save_tModel object extended with con/de-structors and send() uddi2__save_USCOREtModel = $ uddi2__save_USCOREtModel(struct soap*); uddi2__save_USCOREtModel = $ uddi2__save_USCOREtModel(struct soap*, uddi2__tModel &tModel); uddi2__save_USCOREtModel = $ uddi2__save_USCOREtModel(struct soap*, std::vector tModels); uddi2__save_USCOREtModel = $ uddi2__tModelDetail* send(const char *endpoint, char *authInfo); # uddi2:set_publisherAssertions object extended with con/de-structors and send() uddi2__set_USCOREpublisherAssertions = $ uddi2__set_USCOREpublisherAssertions(struct soap*); uddi2__set_USCOREpublisherAssertions = $ uddi2__set_USCOREpublisherAssertions(struct soap*, std::vector publisherAssertions); uddi2__set_USCOREpublisherAssertions = $ uddi2__publisherAssertions* send(const char *endpoint, char *authInfo); gsoap-2.8.91/gsoap/uddi2/Makefile0000644000175000017500000000402413525245163016052 0ustar ellertellert.SUFFIXES: .wsdl .xsd GSOAP=../bin/soapcpp2 WSDL2H=../bin/wsdl2h SOAPH=../stdsoap2.h SOAPC=../stdsoap2.c SOAPCPP=../stdsoap2.cpp SOAPDOMC=../dom.c SOAPDOMCPP=../dom.cpp CC=gcc CPP=g++ LIBS= COFLAGS=-O2 CWFLAGS=-Wall CIFLAGS=-I../ CMFLAGS=-DWITH_NONAMESPACES CFLAGS= $(CWFLAGS) $(COFLAGS) $(CIFLAGS) $(CMFLAGS) all: example1 example2 example1: example1.cpp inqClientLib.o inquire_v2.o $(SOAPCPP) envC.o $(CPP) $(CFLAGS) -o example1 example1.cpp inqClientLib.o inquire_v2.o $(SOAPCPP) envC.o example2: example2.cpp inqClientLib.o inquire_v2.o $(SOAPCPP) envC.o $(CPP) $(CFLAGS) -o example2 example2.cpp inqClientLib.o inquire_v2.o $(SOAPCPP) envC.o example3: example3.cpp pubClientLib.o publish_v2.o $(SOAPCPP) envC.o $(CPP) $(CFLAGS) -DWITH_OPENSSL -o example3 example3.cpp pubClientLib.o publish_v2.o $(SOAPCPP) envC.o -lssl -lcrypto uddiClientLib.cpp: uddi_v2.h inquire_v2.h publish_v2.h $(GSOAP) -I.. -C -p uddi uddi_v2.h $(GSOAP) -I.. -C -p inq inquire_v2.h $(GSOAP) -I.. -C -p pub publish_v2.h inqClientLib.cpp: inquire_v2.h $(GSOAP) -I.. -C -p inq inquire_v2.h pubClientLib.cpp: publish_v2.h $(GSOAP) -I.. -C -p pub publish_v2.h envC.cpp: echo '' > env.h $(GSOAP) -I.. -CSL -p env env.h .c.o: $(CPP) $(CFLAGS) -c $< .cpp.o: $(CPP) $(CFLAGS) -c $< uddi_v2.h: inquire_v2.wsdl publish_v2.wsdl uddi_v2.xsd uddi2-typemap.dat $(WSDL2H) -tuddi2-typemap.dat -ouddi_v2.h inquire_v2.wsdl publish_v2.wsdl inquire_v2.h: inquire_v2.wsdl uddi_v2.xsd uddi2-typemap.dat $(WSDL2H) -tuddi2-typemap.dat inquire_v2.wsdl publish_v2.h: publish_v2.wsdl uddi_v2.xsd uddi2-typemap.dat $(WSDL2H) -tuddi2-typemap.dat publish_v2.wsdl .PHONY: clean distclean clean: rm -f *.o *.log *.xml *.nsmap *Stub.h inqH.h pubH.h uddiH.h *Proxy.h *Object.h inqC*.cpp inqS*.cpp pubC*.cpp pubS*.cpp uddiC*.cpp uddiS*.cpp env*.h env*.cpp distclean: rm -f *.o *.log *.xml *.nsmap *Stub.h inqH.h pubH.h uddiH.h *Proxy.h *Object.h inqC*.cpp inqS*.cpp pubC*.cpp pubS*.cpp uddiC*.cpp uddiS*.cpp env*.h env*.cpp rm -f example1 example2 example3 gsoap-2.8.91/gsoap/uddi2/example2.cpp0000644000175000017500000000530213525245163016633 0ustar ellertellert/* example2.cpp Example UDDI V2 Client -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2004-2005, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "inqH.h" int main(int argc, char **argv) { char *search_string = "xmethods"; if (argc > 1) search_string = argv[1]; // Create a gSOAP context struct soap *soap = soap_new(); // Create an object to find a business uddi2__find_USCOREbusiness fb(soap, search_string); // Send the request uddi2__businessList *bl = fb.send("http://uddi.xmethods.net/inquire"); // Check if result is OK if (!bl) soap_print_fault(soap, stderr); // If OK, report the business name(s) and unique identification keys else if (bl->businessInfos) { std::cout << "Search results on " << search_string << ":" << std::endl << std::endl; for (std::vector::const_iterator bi = bl->businessInfos->businessInfo.begin(); bi != bl->businessInfos->businessInfo.end(); ++bi) { // Report businessKey std::cout << "businessKey=" << (*bi)->businessKey << std::endl; // Report names for (std::vector::const_iterator n = (*bi)->name.begin(); n != (*bi)->name.end(); ++n) std::cout << "name=" << (*n)->__item << std::endl; std::cout << std::endl; } } // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } gsoap-2.8.91/gsoap/uddi2/publish_v2.h0000644000175000017500000045566113525245163016661 0ustar ellertellert/** @mainpage gSOAP UDDI v2 Universal Description, Discovery and Integration, or UDDI, is the name of a group of web-based registries that expose information about a business or other entity and its technical interfaces. See the UDDI v2 specification @url http://uddi.org/pubs/ProgrammersAPI_v2.htm for more details. @section UDDI2_CLASSES Classes See Related Pages for examples. UDDI Inquire classes - @ref uddi2__find_USCOREbinding - @ref uddi2__find_USCOREbusiness - @ref uddi2__find_USCORErelatedBusinesses - @ref uddi2__find_USCOREservice - @ref uddi2__find_USCOREtModel - @ref uddi2__get_USCOREbindingDetail - @ref uddi2__get_USCOREbusinessDetail - @ref uddi2__get_USCOREbusinessDetailExt - @ref uddi2__get_USCOREserviceDetail - @ref uddi2__get_USCOREtModelDetail UDDI Publish classes - @ref uddi2__add_USCOREpublisherAssertions - @ref uddi2__delete_USCOREbinding - @ref uddi2__delete_USCOREbusiness - @ref uddi2__delete_USCOREservice - @ref uddi2__delete_USCOREtModel - @ref uddi2__delete_USCOREpublisherAssertions - @ref uddi2__discard_USCOREauthToken - @ref uddi2__get_USCOREassertionStatusReport - @ref uddi2__get_USCOREauthToken - @ref uddi2__get_USCOREpublisherAssertions - @ref uddi2__get_USCOREregisteredInfo - @ref uddi2__save_USCOREbinding - @ref uddi2__save_USCOREbusiness - @ref uddi2__save_USCOREservice - @ref uddi2__save_USCOREtModel - @ref uddi2__set_USCOREpublisherAssertions @section UDDI2_BINDINGS Binding Reference - @ref InquireSoap - @ref PublishSoap */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_binding // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREbinding @brief Represents a request to locate bindings that meet the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137712 */ /** @fn uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbinding class. */ /** @fn uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap, const char *tModelKey) @brief @param[in] soap gSOAP context @param[in] tModelKey string Creates an instance of the find_USCOREbinding class using the specified tModel key. */ /** @fn uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of tModel key strings Creates an instance of the find_USCOREbinding class using the specified tModel keys. */ /** @fn uddi2__bindingDetail* uddi2__find_USCOREbinding::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__bindingDetail object or NULL on error Send a request to a UDDI server to find binding details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_business // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREbusiness @brief Represents a request to locate businesses that meet specific requirements. When the send method is called, the instance returns a uddi2__businessList object that contains a list of business that matched the search criteria. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137713 See also @ref example2. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, const char *name) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class using the specified name of the requested business. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, std::vector keyedReferences) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class using the specified category references. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class using the specified tModel keys. */ /** @fn uddi2__businessList *uddi2__find_USCOREbusiness::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__businessList object or NULL on error Send a request to a UDDI server to find a list of businesses. See also @ref example2. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_relatedBusinesses // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCORErelatedBusinesses @brief Represents a request to locate businesses that are related to a specific business. When the send method is called, the instance returns a uddi2__relatedBusinessList object that contains a list of business that matched the relationship set. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137714 */ /** @fn uddi2__find_USCORErelatedBusinesses::uddi2__find_USCORErelatedBusinesses(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCORErelatedBusiness class. */ /** @fn uddi2__find_USCORErelatedBusinesses::uddi2__find_USCORErelatedBusinesses(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey string Creates an instance of the find_USCORErelatedBusiness class using the specified business key. */ /** @fn uddi2__relatedBusinessesList *uddi2__find_USCORErelatedBusinesses::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__relatedBusinessList object or NULL on error Send a request to a UDDI server to find a list of related businesses. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_service // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREservice @brief Represents a request to locate services that meet the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137715 See also @ref example1. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREservice class. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, const char *name) @brief @param[in] soap gSOAP context @param[in] name of the service Creates an instance of the find_USCOREservice class using the specified name. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, std::vector keyedReferences) @brief @param[in] soap gSOAP context @param[in] keyedReferences collection of category keys Creates an instance of the find_USCOREservice class using the specified category keys. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of tModel key strings Creates an instance of the find_USCOREservice class using the specified tModel keys. */ /** @fn uddi2__serviceList* uddi2__find_USCOREservice::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__serviceList object or NULL on error Send a request to a UDDI server to find a list of services. See also @ref example1. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_tModel // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREtModel @brief Represents a request to locate a list of tModel entries that match a set of specific criteria. The result of a search is a uddi2__tModelList object that contains information about registered tModel data that matches the criteria. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137716 */ /** @fn uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREtModel class. */ /** @fn uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap, const char *name) @brief @param[in] soap gSOAP context @param[in] name of the tModel Creates an instance of the find_USCOREtModel class using the specified tModel name. */ /** @fn uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap, std::vector keyedReferences) @brief @param[in] soap gSOAP context @param[in] keyedReferences collection of category keys Creates an instance of the find_USCOREtModel class using the specified category keys. */ /** @fn uddi2__tModelList* uddi2__find_USCOREtModel::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__tModelList object or NULL on error Send a request to a UDDI server to find a tModelList. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_bindingDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREbindingDetail @brief Represents a request to get binding details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137717 */ /** @fn uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREbindingDetail class. */ /** @fn uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap, const char *bindingKey) @brief @param[in] soap gSOAP context @param[in] bindingKey string Creates an instance of the get_USCOREbindingDetail class using the specified binding key. */ /** @fn uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap, std::vector bindingKeys) @brief @param[in] soap gSOAP context @param[in] bindingKeys collection of key strings Creates an instance of the get_USCOREbindingDetail class using the specified collection of binding keys. */ /** @fn uddi2__bindingDetail* uddi2__get_USCOREbindingDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__bindingDetail object or NULL on error Send a request to a UDDI server to get the binding details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_businessDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREbusinessDetail @brief Represents a request to get business details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137718 */ /** @fn uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREbusinessDetail class. */ /** @fn uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey string Creates an instance of the get_USCOREbusinessDetail class using the specified business key. */ /** @fn uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap, std::vector businessKeys) @brief @param[in] soap gSOAP context @param[in] businessKeys collection of key strings Creates an instance of the get_USCOREbusinessDetail class using the specified collection of business keys. */ /** @fn uddi2__businessDetail* uddi2__get_USCOREbusinessDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__businessDetail object or NULL on error Send a request to a UDDI server to get the business details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_businessDetailExt // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREbusinessDetailExt @brief Represents a request to get business details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137719 */ /** @fn uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREbusinessDetailExt class. */ /** @fn uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey string Creates an instance of the get_USCOREbusinessDetailExt class using the specified business key. */ /** @fn uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap, std::vector businessKeys) @brief @param[in] soap gSOAP context @param[in] businessKeys collection of key strings Creates an instance of the get_USCOREbusinessDetailExt class using the specified collection of business keys. */ /** @fn uddi2__businessDetailExt* uddi2__get_USCOREbusinessDetailExt::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__businessDetailExt object or NULL on error Send a request to a UDDI server to get the business details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_serviceDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREserviceDetail @brief Represents a request to get service details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137720 */ /** @fn uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREserviceDetail class. */ /** @fn uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap, const char *serviceKey) @brief @param[in] soap gSOAP context @param[in] serviceKey string Creates an instance of the get_USCOREserviceDetail class using the specified service key. */ /** @fn uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap, std::vector serviceKeys) @brief @param[in] soap gSOAP context @param[in] serviceKeys collection of key strings Creates an instance of the get_USCOREserviceDetail class using the specified collection of service keys. */ /** @fn uddi2__serviceDetail* uddi2__get_USCOREserviceDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__serviceDetail object or NULL on error Send a request to a UDDI server to get the service details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_tModelDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREtModelDetail @brief Represents a request to get tModel details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137721 */ /** @fn uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREtModelDetail class. */ /** @fn uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap, const char *tModelKey) @brief @param[in] soap gSOAP context @param[in] tModelKey string Creates an instance of the get_USCOREtModelDetail class using the specified tModel key. */ /** @fn uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of key strings Creates an instance of the get_USCOREtModelDetail class using the specified collection of tModel keys. */ /** @fn uddi2__tModelDetail* uddi2__get_USCOREtModelDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__tModelDetail object or NULL on error Send a request to a UDDI server to get the tModel details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:add_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__add_USCOREpublisherAssertions @brief Represents a request to add one or more publisher assertions to the assertion collection for an individual publisher. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137731 */ /** @fn uddi2__add_USCOREpublisherAssertions::uddi2__add_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the add_USCOREpublisherAssertions class. */ /** @fn uddi2__add_USCOREpublisherAssertions::uddi2__add_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) @brief @param[in] soap gSOAP context @param[in] publisherAssertions collection of publisher assertions Creates an instance of the add_USCOREpublisherAssertions class using the specified publisher assertions. */ /** @fn uddi2__dispositionReport *uddi2__add_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI server to add one or more publisher assertions to the assertion collection for an individual publisher. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_binding // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREbinding @brief Represents a request to delete a binding that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137732 */ /** @fn uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap) @brief Creates an instance of the delete_USCOREbinding class. */ /** @fn uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap, const char *bindingKey) @brief @param[in] soap gSOAP context @param[in] bindingKey a binding key string Creates an instance of the delete_USCOREbinding class. */ /** @fn uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap, std::vector bindingKeys) @brief @param[in] soap gSOAP context @param[in] bindingKeys collection of binding keys Creates an instance of the delete_USCOREbinding class using the specified binding keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREbinding::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a binding that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_business // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREbusiness @brief Represents a request to delete a business that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137733 */ /** @fn uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREbusiness class. */ /** @fn uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey a business key string Creates an instance of the delete_USCOREbusiness class using the specified business key. */ /** @fn uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap, std::vector businessKeys) @brief @param[in] soap gSOAP context @param[in] businessKeys collection of business keys Creates an instance of the delete_USCOREbusiness class using the specified business keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREbusiness::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a business that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_service // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREservice @brief Represents a request to delete a service that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137735 */ /** @fn uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREservice class. */ /** @fn uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap, const char *serviceKey) @brief @param[in] soap gSOAP context @param[in] serviceKey a service key string Creates an instance of the delete_USCOREservice class using the specified service key. */ /** @fn uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap, std::vector serviceKeys) @brief @param[in] soap gSOAP context @param[in] serviceKeys collection of service keys Creates an instance of the delete_USCOREservice class using the specified service keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREservice::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a service that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_tModel // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREtModel @brief Represents a request to delete a tModel that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137736 */ /** @fn uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREtModel class. */ /** @fn uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap, const char *tModelKey) @brief @param[in] soap gSOAP context @param[in] tModelKey a tModel key string Creates an instance of the delete_USCOREtModel class using the specified tModel key. */ /** @fn uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of tModel keys Creates an instance of the delete_USCOREtModel class using the specified tModel keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREtModel::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a tModel that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREpublisherAssertions @brief Represents a request to delete publisher assertions meeting the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137734 */ /** @fn uddi2__delete_USCOREpublisherAssertions::uddi2__delete_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREpublisherAssertions class. */ /** @fn uddi2__delete_USCOREpublisherAssertions::uddi2__delete_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) @brief @param[in] soap gSOAP context @param[in] publisherAssertions a collection of publisher assertions Creates an instance of the delete_USCOREpublisherAssertions class using the specified collection of publisher assertions. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete publisher assertions meeting the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:discard_authToken // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__discard_USCOREauthToken @brief Represents a request to discard an authorization token obtained with the get_USCOREauthToken class. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137737 */ /** @fn uddi2__discard_USCOREauthToken::uddi2__discard_USCOREauthToken(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREauthToken class. */ /** @fn uddi2__discard_USCOREauthToken::uddi2__discard_USCOREauthToken(struct soap *soap, const char *authInfo) @brief @param[in] soap gSOAP context @param[in] authInfo authorization token provided by the UDDI server Creates an instance of the delete_USCOREauthToken class using the specified authentication token string. */ /** @fn uddi2__dispositionReport *uddi2__discard_USCOREauthToken::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to discard an authentication token. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_assertionStatusReport // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREassertionStatusReport @brief Provides the ability to determine the status of current and outstanding publisher assertions. The results can be restricted by setting the completionStatus property. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137738 */ /** @fn uddi2__get_USCOREassertionStatusReport::uddi2__get_USCOREassertionStatusReport(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREassertionStatusReport class. */ /** @fn uddi2__get_USCOREassertionStatusReport::uddi2__get_USCOREassertionStatusReport(struct soap *soap, const char *completionStatus) @brief @param[in] soap gSOAP context @param[in] completionStatus completion status string Creates an instance of the get_USCOREassertionStatusReport class using the specified completion status. */ /** @fn uddi2__assertionStatusReport *uddi2__get_USCOREassertionStatusReport::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__assertionStatusReport object or NULL on error Send a request to a UDDI service to get the status of current and outstanding publisher assertions. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_authToken // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREauthToken @brief Represents a request to obtain an authorization token, which is represented by the uddi2__authToken class. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137739 */ /** @fn uddi2__get_USCOREauthToken::uddi2__get_USCOREauthToken(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREauthToken class. */ /** @fn uddi2__get_USCOREauthToken::uddi2__get_USCOREauthToken(struct soap *soap, const char *userid, const char *passwd) @brief @param[in] soap gSOAP context @param[in] userid the user ID string @param[in] passwd the password string Creates an instance of the get_USCOREauthToken class using the specified user ID and password. */ /** @fn uddi2__authToken *uddi2__get_USCOREauthToken::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__authToken object or NULL on error Send a request to a UDDI service to get a authorization token given a user ID and password. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREpublisherAssertions @brief Represents a request to obtain the full set of publisher assertions that are associated with an individual publisher. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137740 */ /** @fn uddi2__get_USCOREpublisherAssertions::uddi2__get_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREpublisherAssetions class. */ /** @fn uddi2__publisherAssertions *uddi2__get_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__publisherAssertions object or NULL on error Send a request to a UDDI service to get publisher assertions. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_registeredInfo // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREregisteredInfo @brief Represents a request to get all registered business entities and tModels controlled by an individual. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137741 */ /** @fn uddi2__get_USCOREregisteredInfo::uddi2__get_USCOREregisteredInfo(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREregisteredInfo class. */ /** @fn uddi2__registeredInfo *uddi2__get_USCOREregisteredInfo::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__registeredInfo object or NULL on error Send a request to a UDDI service to get all registered business entities and tModels controlled by an individual. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_binding // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREbinding @brief Represents a request to post binding information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137742 */ /** @fn uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREbinding class. */ /** @fn uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap, uddi2__bindingTemplate &bindingTemplate) @brief @param[in] soap gSOAP context @param[in] bindingTemplate binding template Creates an instance of the save_USCOREbinding class using the specified binding template. */ /** @fn uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap, std::vector bindingTemplates) @brief @param[in] soap gSOAP context @param[in] bindingTemplates collection of binding templates Creates an instance of the save_USCOREbinding class using the specified binding templates. */ /** @fn uddi2__bindingDetail *uddi2__save_USCOREbinding::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__bindingDetail object or NULL on error Send a request to a UDDI server to post binding information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_business // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREbusiness @brief Represents a request to post business information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137743 */ /** @fn uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREbusiness class. */ /** @fn uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap, uddi2__businessEntity &businessEntity) @brief @param[in] soap gSOAP context @param[in] businessEntity business entity Creates an instance of the save_USCOREbusiness class using the specified business entity. */ /** @fn uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap, std::vector businessEntities) @brief @param[in] soap gSOAP context @param[in] businessEntities collection of business entities Creates an instance of the save_USCOREbusiness class using the specified business entities. */ /** @fn uddi2__businessDetail *uddi2__save_USCOREbusiness::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__businessDetail object or NULL on error Send a request to a UDDI server to post business information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_service // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREservice @brief Represents a request to post service information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137744 */ /** @fn uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREservice class. */ /** @fn uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap, uddi2__businessService &businessService) @brief @param[in] soap gSOAP context @param[in] businessService business service Creates an instance of the save_USCOREservice class using the specified service. */ /** @fn uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap, std::vector businessServices) @brief @param[in] soap gSOAP context @param[in] businessServices collection of business services Creates an instance of the save_USCOREservice class using the specified services. */ /** @fn uddi2__serviceDetail *uddi2__save_USCOREservice::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__serviceDetail object or NULL on error Send a request to a UDDI server to post service information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_tModel // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREtModel @brief Represents a request to post tModel information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137745 */ /** @fn uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREtModel class. */ /** @fn uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap, uddi2__tModel &tModel) @brief @param[in] soap gSOAP context @param[in] tModel a tModel Creates an instance of the save_USCOREtModel class using the specified tModel. */ /** @fn uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap, std::vector tModels) @brief @param[in] soap gSOAP context @param[in] tModels collection of tModels Creates an instance of the save_USCOREtModel class using the specified tModels. */ /** @fn uddi2__tModelDetail *uddi2__save_USCOREtModel::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__tModelDetail object or NULL on error Send a request to a UDDI server to post tModel information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:set_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__set_USCOREpublisherAssertions @brief Represents a request to modify the existing publisher assertions for an individual publisher. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137746 */ /** @fn uddi2__set_USCOREpublisherAssertions::uddi2__set_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the set_USCOREpublisherAssertions class. */ /** @fn uddi2__set_USCOREpublisherAssertions::uddi2__set_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) @brief @param[in] soap gSOAP context @param[in] publisherAssertions collection of publisher assertions Creates an instance of the set_USCOREpublisherAssertions class using the specified collection of publisher assertions. */ /** @fn uddi2__publisherAssertions *uddi2__set_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__publisherAssertions object or NULL on error Send a request to a UDDI server to post tModel information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // Code Examples // //////////////////////////////////////////////////////////////////////////////// /** @page example1 Code Example 1: Finding a service This example shows you how to find Web services. In this case, the example finds Web services with names that begin with the word "magic". @code #include "inqH.h" int main(int argc, char **argv) { char *search_string = "magic"; if (argc > 1) search_string = argv[1]; // Create a gSOAP context struct soap *soap = soap_new(); // Create an object to find a business uddi2__find_USCOREservice fs(soap, search_string); // Send the request uddi2__serviceList *sl = fs.send("http://uddi.xmethods.net/inquire"); // Check if result is OK if (!sl) soap_print_fault(soap, stderr); // If OK, report the service name(s) and unique identification keys else if (sl->serviceInfos) { std::cout << "Search results on " << search_string << ":" << std::endl << std::endl; for (std::vector::const_iterator si = sl->serviceInfos->serviceInfo.begin(); si != sl->serviceInfos->serviceInfo.end(); ++si) { // Report serviceKey and businessKey std::cout << "serviceKey=" << (*si)->serviceKey << std::endl << "businessKey=" << (*si)->businessKey << std::endl; // Report names for (std::vector::const_iterator n = (*si)->name.begin(); n != (*si)->name.end(); ++n) std::cout << "name=" << (*n)->__item << std::endl; std::cout << std::endl; } } // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } @endcode To compile: - wsdl2h -tuddi2-typemap.dat inquire_v2.wsdl - soapcpp2 -I.. -pinq inquire_v2.h - g++ -DWITH_NONAMESPACES -I.. -o example1 example1.cpp inquire_v2.cpp inqC.cpp inqClient.cpp ../stdsoap2.cpp */ /** @page example2 Code Example 2: Finding a business This example shows you how to find a business from a UDDI server. @code #include "inqH.h" int main(int argc, char **argv) { char *search_string = "xmethods"; if (argc > 1) search_string = argv[1]; // Create a gSOAP context struct soap *soap = soap_new(); // Create an object to find a business uddi2__find_USCOREbusiness fb(soap, search_string); // Send the request uddi2__businessList *bl = fb.send("http://uddi.xmethods.net/inquire"); // Check if result is OK if (!bl) soap_print_fault(soap, stderr); // If OK, report the business name(s) and unique identification keys else if (bl->businessInfos) { std::cout << "Search results on " << search_string << ":" << std::endl << std::endl; for (std::vector::const_iterator bi = bl->businessInfos->businessInfo.begin(); bi != bl->businessInfos->businessInfo.end(); ++bi) { // Report businessKey std::cout << "businessKey=" << (*bi)->businessKey << std::endl; // Report names for (std::vector::const_iterator n = (*bi)->name.begin(); n != (*bi)->name.end(); ++n) std::cout << "name=" << (*n)->__item << std::endl; std::cout << std::endl; } } // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } @endcode To compile: - wsdl2h -tuddi2-typemap.dat inquire_v2.wsdl - soapcpp2 -I.. -pinq inquire_v2.h - g++ -DWITH_NONAMESPACES -I.. -o example2 example2.cpp inquire_v2.cpp inqC.cpp inqClient.cpp ../stdsoap2.cpp */ /** @page example3 Code Example 3: Publishing a WSDL and service on XMethods This example shows you how to publish a Web service. In this case, the example template code obtains an authorization token, saves the tModel with the WSDL URL in the server, and saves the business service information in the server. @code #include "pubH.h" const char *server = "https://uddi.xmethods.net/publish"; const char *userid = "..."; // user ID to access UDDI server const char *passwd = "..."; // password to access UDDI server int main(int argc, char **argv) { // Create a gSOAP context struct soap *soap = soap_new(); // Setup SSL context (optional) to verify server's credentials if (soap_ssl_client_context(soap, SOAP_SSL_DEFAULT, NULL, NULL, "cacerts.pem", NULL, NULL)) { soap_print_fault(soap, stderr); exit(1); } // Step 1: Get an authorization token from the UDDI server uddi2__get_USCOREauthToken get_authToken(soap, userid, passwd); uddi2__authToken *authToken = get_authToken.send(server); // Check if authorized if (!authToken) { soap_print_fault(soap, stderr); exit(1); } // Authorization info provided by server for this session char *authInfo = authToken->authInfo; // Step 2: Create a tModel for the WSDL to be published uddi2__tModel tModel; tModel.soap_default(soap); // Create the tModel and service name tModel.name = soap_new_uddi2__name(soap, -1); tModel.name->__item = "..."; tModel.name->xml__lang_ = "en"; // Create XMethods description elements (see http://www.xmethods.net/ve2/UDDI.po) uddi2__description *description = soap_new_uddi2__description(soap, 6); description[0].__item = "SHORT DESCRIPTION: ..."; description[0].xml__lang_ = "en"; description[1].__item = "SHORT DESCRIPTION: ..."; description[1].xml__lang_ = "en"; description[2].__item = "USAGE NOTES: ..."; description[2].xml__lang_ = "en"; description[3].__item = "HOMEPAGE URL: ..."; description[3].xml__lang_ = "en"; description[4].__item = "CONTACT EMAIL: ..."; description[4].xml__lang_ = "en"; description[5].__item = "IMPLEMENTATION: ..."; description[5].xml__lang_ = "en"; // Add the four description elements to the tModel tModel.description.push_back(description + 0); tModel.description.push_back(description + 1); tModel.description.push_back(description + 2); tModel.description.push_back(description + 4); // Add an overviewDoc element with description and overviewURL tModel.overviewDoc = soap_new_uddi2__overviewDoc(soap, -1); tModel.overviewDoc->soap_default(soap); tModel.overviewDoc->description.push_back(soap_new_uddi2__description(soap, -1)); tModel.overviewDoc->description[0]->__item = "WSDL source document"; tModel.overviewDoc->description[0]->xml__lang_ = "en"; tModel.overviewDoc->overviewURL = "http://.../my.wsdl#bindingName"; // Omit identifier bag tModel.identifierBag = NULL; // Add a category with a WSDL-specific keyedReference tModel.categoryBag = soap_new_uddi2__categoryBag(soap, -1); tModel.categoryBag->soap_default(soap); tModel.categoryBag->keyedReference.push_back(soap_new_uddi2__keyedReference(soap, -1)); tModel.categoryBag->keyedReference[0]->tModelKey = "..."; tModel.categoryBag->keyedReference[0]->keyName = "uddi-org:types"; tModel.categoryBag->keyedReference[0]->keyValue = "wsdlSpec"; tModel.authorizedName = "..."; tModel.operator_ = "..."; tModel.tModelKey = "..."; // Save the tModel uddi2__save_USCOREtModel save_tModel(soap, tModel); uddi2__tModelDetail *tModelDetail = save_tModel.send(server, authInfo); // Step 3: Create a new service to be published uddi2__businessService service; service.soap_default(soap); // Service name is the tModel name (XMethods) service.name.push_back(tModel.name); // Add two description elements to the service service.description.push_back(description + 4); service.description.push_back(description + 5); // Create binding template uddi2__bindingTemplate bindingTemplate; bindingTemplate.soap_default(soap); bindingTemplate.tModelInstanceDetails = soap_new_uddi2__tModelInstanceDetails(soap, -1); bindingTemplate.tModelInstanceDetails->tModelInstanceInfo.push_back(soap_new_uddi2__tModelInstanceInfo(soap, -1)); bindingTemplate.tModelInstanceDetails->tModelInstanceInfo[0]->instanceDetails = NULL; bindingTemplate.tModelInstanceDetails->tModelInstanceInfo[0]->tModelKey = tModel.tModelKey; bindingTemplate.accessPoint = soap_new_uddi2__accessPoint(soap, -1); bindingTemplate.accessPoint->__item = "..."; bindingTemplate.accessPoint->URLType = uddi2__URLType__http; bindingTemplate.hostingRedirector = NULL; bindingTemplate.serviceKey = "..."; bindingTemplate.bindingKey = "..."; // Add binding Template to service service.bindingTemplates = soap_new_uddi2__bindingTemplates(soap, -1); service.bindingTemplates->soap_default(soap); service.bindingTemplates->bindingTemplate.push_back(&bindingTemplate); service.categoryBag = NULL; service.serviceKey = "..."; service.businessKey = "..."; // Save the service uddi2__save_USCOREservice save_service(soap, service); uddi2__serviceDetail *serviceDetail = save_service.send(server, authInfo); // Step 4: Discard authorization token uddi2__discard_USCOREauthToken discard_authToken(soap, authInfo); uddi2__dispositionReport *dispositionReport = discard_authToken.send(server); // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } @endcode To compile: - wsdl2h -tuddi2-typemap.dat publish_v2.wsdl - soapcpp2 -I.. -ppub publish_v2.h - g++ -DWITH_OPENSSL -DWITH_NONAMESPACES -I.. -o example3 example3.cpp publish_v2.cpp pubC.cpp pubClient.cpp ../stdsoap2.cpp */ /* publish_v2.h Generated by wsdl2h 1.2.0 from publish_v2.wsdl and uddi2-typemap.dat 2005-04-24 00:29:41 GMT Copyright (C) 2001-2005 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 wsdl2h option -l to view the software license terms. - Use wsdl2h options -c and -s to generate pure C code or C++ code without STL. - To build with STL, stlvector.h from the gSOAP distribution must be in the current directory. Or use soapcpp2 option -I with path to stlvector.h. - Use typemap.dat to control schema 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. */ /******************************************************************************\ * * * urn:uddi-org:publication_v2 * * * \******************************************************************************/ /* WSDL Documentation: Copyright (c) 2000 - 2002 by Accenture, Ariba, Inc., Commerce One, Inc. Fujitsu Limited, Hewlett-Packard Company, i2 Technologies, Inc., Intel Corporation, International Business Machines Corporation, Microsoft Corporation, Oracle Corporation, SAP AG, Sun Microsystems, Inc., and VeriSign, Inc. All Rights Reserved. WSDL Service Interface for UDDI Publication API V2.0 This WSDL document defines the publication API calls for interacting with the UDDI registry. The complete UDDI API specification is available at http://www.uddi.org/specification.html. */ //gsoapopt w #import "stlvector.h" /******************************************************************************\ * * * 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: pub2 = "urn:uddi-org:publication_v2" uddi2 = urn:uddi-org:api_v2 */ //gsoap pub2 schema namespace: urn:uddi-org:publication_v2 //gsoap uddi2 schema namespace: urn:uddi-org:api_v2 //gsoap pub2 schema form: unqualified //gsoap uddi2 schema elementForm: qualified //gsoap uddi2 schema attributeForm: unqualified /******************************************************************************\ * * * Schema Types * * * \******************************************************************************/ /// Primitive built-in type "xs:NMTOKEN" typedef char* xsd__NMTOKEN; /// Built-in attribute "xml:lang" typedef char* xml__lang; class uddi2__accessPoint; class uddi2__address; class uddi2__addressLine; class uddi2__assertionStatusItem; class uddi2__bindingTemplate; class uddi2__bindingTemplates; class uddi2__businessEntity; class uddi2__businessEntityExt; class uddi2__businessInfo; class uddi2__businessInfos; class uddi2__businessService; class uddi2__businessServices; class uddi2__categoryBag; class uddi2__contact; class uddi2__contacts; class uddi2__description; class uddi2__discoveryURL; class uddi2__discoveryURLs; class uddi2__dispositionReport; class uddi2__email; class uddi2__errInfo; class uddi2__findQualifiers; class uddi2__hostingRedirector; class uddi2__identifierBag; class uddi2__instanceDetails; class uddi2__keyedReference; class uddi2__keysOwned; class uddi2__name; class uddi2__overviewDoc; class uddi2__phone; class uddi2__publisherAssertion; class uddi2__relatedBusinessInfo; class uddi2__relatedBusinessInfos; class uddi2__result; class uddi2__serviceInfo; class uddi2__serviceInfos; class uddi2__sharedRelationships; class uddi2__tModel; class uddi2__tModelBag; class uddi2__tModelInfo; class uddi2__tModelInfos; class uddi2__tModelInstanceDetails; class uddi2__tModelInstanceInfo; class uddi2__add_USCOREpublisherAssertions; class uddi2__delete_USCOREbinding; class uddi2__delete_USCOREbusiness; class uddi2__delete_USCOREpublisherAssertions; class uddi2__delete_USCOREservice; class uddi2__delete_USCOREtModel; class uddi2__discard_USCOREauthToken; class uddi2__find_USCOREbinding; class uddi2__find_USCOREbusiness; class uddi2__find_USCORErelatedBusinesses; class uddi2__find_USCOREservice; class uddi2__find_USCOREtModel; class uddi2__get_USCOREassertionStatusReport; class uddi2__get_USCOREauthToken; class uddi2__get_USCOREbindingDetail; class uddi2__get_USCOREbusinessDetail; class uddi2__get_USCOREbusinessDetailExt; class uddi2__get_USCOREpublisherAssertions; class uddi2__get_USCOREregisteredInfo; class uddi2__get_USCOREserviceDetail; class uddi2__get_USCOREtModelDetail; class uddi2__save_USCOREbinding; class uddi2__save_USCOREbusiness; class uddi2__save_USCOREservice; class uddi2__save_USCOREtModel; class uddi2__set_USCOREpublisherAssertions; class uddi2__validate_USCOREvalues; class uddi2__assertionStatusReport; class uddi2__authToken; class uddi2__bindingDetail; class uddi2__businessDetail; class uddi2__businessDetailExt; class uddi2__businessList; class uddi2__publisherAssertions; class uddi2__registeredInfo; class uddi2__relatedBusinessesList; class uddi2__serviceDetail; class uddi2__serviceList; class uddi2__tModelDetail; class uddi2__tModelList; /// Schema "urn:uddi-org:api_v2":bindingKey simpleType restriction of xs:string typedef char* uddi2__bindingKey; /// Schema "urn:uddi-org:api_v2":businessKey simpleType restriction of xs:string typedef char* uddi2__businessKey; /// Schema "urn:uddi-org:api_v2":serviceKey simpleType restriction of xs:string typedef char* uddi2__serviceKey; /// Schema "urn:uddi-org:api_v2":tModelKey simpleType restriction of xs:string typedef char* uddi2__tModelKey; /// Schema "urn:uddi-org:api_v2":direction simpleType restriction of xs:NMTOKEN /// Note: enum values are prefixed with 'uddi2__direction' to avoid name clashes, please use wsdl2h option -e to omit this prefix enum uddi2__direction { uddi2__direction__fromKey, ///< xs:NMTOKEN value="fromKey" uddi2__direction__toKey, ///< xs:NMTOKEN value="toKey" }; /// Schema "urn:uddi-org:api_v2":truncated simpleType restriction of xs:NMTOKEN /// Note: enum values are prefixed with 'uddi2__truncated' to avoid name clashes, please use wsdl2h option -e to omit this prefix enum uddi2__truncated { uddi2__truncated__true_, ///< xs:NMTOKEN value="true" uddi2__truncated__false_, ///< xs:NMTOKEN value="false" }; /// Schema "urn:uddi-org:api_v2":URLType simpleType restriction of xs:NMTOKEN /// Note: enum values are prefixed with 'uddi2__URLType' to avoid name clashes, please use wsdl2h option -e to omit this prefix enum uddi2__URLType { uddi2__URLType__mailto, ///< xs:NMTOKEN value="mailto" uddi2__URLType__http, ///< xs:NMTOKEN value="http" uddi2__URLType__https, ///< xs:NMTOKEN value="https" uddi2__URLType__ftp, ///< xs:NMTOKEN value="ftp" uddi2__URLType__fax, ///< xs:NMTOKEN value="fax" uddi2__URLType__phone, ///< xs:NMTOKEN value="phone" uddi2__URLType__other, ///< xs:NMTOKEN value="other" }; /// Schema "urn:uddi-org:api_v2":keyType simpleType restriction of xs:NMTOKEN /// Note: enum values are prefixed with 'uddi2__keyType' to avoid name clashes, please use wsdl2h option -e to omit this prefix enum uddi2__keyType { uddi2__keyType__businessKey, ///< xs:NMTOKEN value="businessKey" uddi2__keyType__tModelKey, ///< xs:NMTOKEN value="tModelKey" uddi2__keyType__serviceKey, ///< xs:NMTOKEN value="serviceKey" uddi2__keyType__bindingKey, ///< xs:NMTOKEN value="bindingKey" }; /// Schema urn:uddi-org:api_v2:"address" class uddi2__address { public: /// Vector of uddi2__addressLine* with length 0..unbounded std::vector addressLine 0; /// Attribute useType of type xs:string @char* useType 0; ///< Optional attribute /// Attribute sortCode of type xs:string @char* sortCode 0; ///< Optional attribute /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"assertionStatusItem" class uddi2__assertionStatusItem { public: /// Element reference "urn:uddi-org:api_v2":fromKey uddi2__businessKey fromKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":toKey uddi2__businessKey toKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":keyedReference uddi2__keyedReference* keyedReference 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":keysOwned uddi2__keysOwned* keysOwned 1; ///< Required element /// Attribute completionStatus of type xs:string @char* completionStatus 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"bindingTemplate" class uddi2__bindingTemplate { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":tModelInstanceDetails uddi2__tModelInstanceDetails* tModelInstanceDetails 1; ///< Required element // CHOICE OF ELEMENTS: /// Element reference "urn:uddi-org:api_v2":accessPoint uddi2__accessPoint* accessPoint 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":hostingRedirector uddi2__hostingRedirector* hostingRedirector 1; ///< Required element // END CHOICE /// Attribute serviceKey of type "urn:uddi-org:api_v2":serviceKey @uddi2__serviceKey serviceKey 0; ///< Optional attribute /// Attribute bindingKey of type "urn:uddi-org:api_v2":bindingKey @uddi2__bindingKey bindingKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"bindingTemplates" class uddi2__bindingTemplates { public: /// Vector of uddi2__bindingTemplate* with length 0..unbounded std::vector bindingTemplate 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessEntity" class uddi2__businessEntity { public: /// Element reference "urn:uddi-org:api_v2":discoveryURLs uddi2__discoveryURLs* discoveryURLs 0; ///< Optional element /// Vector of uddi2__name* with length 0..unbounded std::vector name 1; /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":contacts uddi2__contacts* contacts 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":businessServices uddi2__businessServices* businessServices 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":identifierBag uddi2__identifierBag* identifierBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 0; ///< Optional attribute /// Attribute authorizedName of type xs:string @char* authorizedName 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessEntityExt" class uddi2__businessEntityExt { public: /// Element reference "urn:uddi-org:api_v2":businessEntity uddi2__businessEntity* businessEntity 1; ///< Required element // TODO: // Schema extensibility is user-definable // Consult the protocol documentation to insert declarations here: _XML __any ; ///< Catch any element content in XML string /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessInfo" class uddi2__businessInfo { public: /// Vector of uddi2__name* with length 0..unbounded std::vector name 1; /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":serviceInfos uddi2__serviceInfos* serviceInfos 1; ///< Required element /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessInfos" class uddi2__businessInfos { public: /// Vector of uddi2__businessInfo* with length 0..unbounded std::vector businessInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessService" class uddi2__businessService { public: /// Vector of uddi2__name* with length 0..unbounded std::vector name 0; /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":bindingTemplates uddi2__bindingTemplates* bindingTemplates 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Attribute serviceKey of type "urn:uddi-org:api_v2":serviceKey @uddi2__serviceKey serviceKey 1; ///< Required attribute /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessServices" class uddi2__businessServices { public: /// Vector of uddi2__businessService* with length 0..unbounded std::vector businessService 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"categoryBag" class uddi2__categoryBag { public: /// Vector of uddi2__keyedReference* with length 0..unbounded std::vector keyedReference 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"contact" class uddi2__contact { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":personName char* personName 1; ///< Required element /// Vector of uddi2__phone* with length 0..unbounded std::vector phone 0; /// Vector of uddi2__email* with length 0..unbounded std::vector email 0; /// Vector of uddi2__address* with length 0..unbounded std::vector address 0; /// Attribute useType of type xs:string @char* useType 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"contacts" class uddi2__contacts { public: /// Vector of uddi2__contact* with length 0..unbounded std::vector contact 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"discoveryURLs" class uddi2__discoveryURLs { public: /// Vector of uddi2__discoveryURL* with length 0..unbounded std::vector discoveryURL 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"dispositionReport" class uddi2__dispositionReport { public: /// Vector of uddi2__result* with length 0..unbounded std::vector result 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"findQualifiers" class uddi2__findQualifiers { public: /// Vector of char* with length 0..unbounded std::vector findQualifier 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"hostingRedirector" class uddi2__hostingRedirector { public: /// Attribute bindingKey of type "urn:uddi-org:api_v2":bindingKey @uddi2__bindingKey bindingKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"identifierBag" class uddi2__identifierBag { public: /// Vector of uddi2__keyedReference* with length 0..unbounded std::vector keyedReference 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"instanceDetails" class uddi2__instanceDetails { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":overviewDoc uddi2__overviewDoc* overviewDoc 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":instanceParms char* instanceParms 0; ///< Optional element /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"keyedReference" class uddi2__keyedReference { public: /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 0; ///< Optional attribute /// Attribute keyName of type xs:string @char* keyName 0; ///< Optional attribute /// Attribute keyValue of type xs:string @char* keyValue 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"keysOwned" class uddi2__keysOwned { public: /// Element reference "urn:uddi-org:api_v2":fromKey uddi2__businessKey fromKey 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":toKey uddi2__businessKey toKey 0; ///< Optional element /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"overviewDoc" class uddi2__overviewDoc { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":overviewURL char* overviewURL 0; ///< Optional element /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"publisherAssertion" class uddi2__publisherAssertion { public: /// Element reference "urn:uddi-org:api_v2":fromKey uddi2__businessKey fromKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":toKey uddi2__businessKey toKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":keyedReference uddi2__keyedReference* keyedReference 1; ///< Required element /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"relatedBusinessInfo" class uddi2__relatedBusinessInfo { public: /// Element reference "urn:uddi-org:api_v2":businessKey uddi2__businessKey businessKey 1; ///< Required element /// Vector of uddi2__name* with length 0..unbounded std::vector name 1; /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Vector of uddi2__sharedRelationships* with length 0..2 std::vector sharedRelationships 1:2; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"relatedBusinessInfos" class uddi2__relatedBusinessInfos { public: /// Vector of uddi2__relatedBusinessInfo* with length 0..unbounded std::vector relatedBusinessInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"result" class uddi2__result { public: /// Element reference "urn:uddi-org:api_v2":errInfo uddi2__errInfo* errInfo 0; ///< Optional element /// Attribute keyType of type "urn:uddi-org:api_v2":keyType @enum uddi2__keyType* keyType 0; ///< Optional attribute /// Attribute errno of type xs:int @int errno_ 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"serviceInfo" class uddi2__serviceInfo { public: /// Vector of uddi2__name* with length 0..unbounded std::vector name 0; /// Attribute serviceKey of type "urn:uddi-org:api_v2":serviceKey @uddi2__serviceKey serviceKey 1; ///< Required attribute /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"serviceInfos" class uddi2__serviceInfos { public: /// Vector of uddi2__serviceInfo* with length 0..unbounded std::vector serviceInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"sharedRelationships" class uddi2__sharedRelationships { public: /// Vector of uddi2__keyedReference* with length 0..unbounded std::vector keyedReference 1; /// Attribute direction of type "urn:uddi-org:api_v2":direction @enum uddi2__direction direction 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModel" class uddi2__tModel { public: /// Element reference "urn:uddi-org:api_v2":name uddi2__name* name 1; ///< Required element /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":overviewDoc uddi2__overviewDoc* overviewDoc 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":identifierBag uddi2__identifierBag* identifierBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 0; ///< Optional attribute /// Attribute authorizedName of type xs:string @char* authorizedName 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelBag" class uddi2__tModelBag { public: /// Vector of uddi2__tModelKey with length 0..unbounded std::vector tModelKey 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelInfo" class uddi2__tModelInfo { public: /// Element reference "urn:uddi-org:api_v2":name uddi2__name* name 1; ///< Required element /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelInfos" class uddi2__tModelInfos { public: /// Vector of uddi2__tModelInfo* with length 0..unbounded std::vector tModelInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelInstanceDetails" class uddi2__tModelInstanceDetails { public: /// Vector of uddi2__tModelInstanceInfo* with length 0..unbounded std::vector tModelInstanceInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelInstanceInfo" class uddi2__tModelInstanceInfo { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":instanceDetails uddi2__instanceDetails* instanceDetails 0; ///< Optional element /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"add_publisherAssertions" class uddi2__add_USCOREpublisherAssertions { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__publisherAssertion* with length 0..unbounded std::vector publisherAssertion 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__add_USCOREpublisherAssertions(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__add_USCOREpublisherAssertions(struct soap*, std::vector publisherAssertions); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_binding" class uddi2__delete_USCOREbinding { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__bindingKey with length 0..unbounded std::vector bindingKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbinding(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbinding(struct soap*, const char *bindingKey); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbinding(struct soap*, std::vector bindingKeys); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_business" class uddi2__delete_USCOREbusiness { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__businessKey with length 0..unbounded std::vector businessKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbusiness(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbusiness(struct soap*, const char *businessKey); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbusiness(struct soap*, std::vector businessKeys); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_publisherAssertions" class uddi2__delete_USCOREpublisherAssertions { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__publisherAssertion* with length 0..unbounded std::vector publisherAssertion 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREpublisherAssertions(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREpublisherAssertions(struct soap*, std::vector publisherAssertions); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_service" class uddi2__delete_USCOREservice { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__serviceKey with length 0..unbounded std::vector serviceKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREservice(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREservice(struct soap*, const char *serviceKey); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREservice(struct soap*, std::vector serviceKeys); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_tModel" class uddi2__delete_USCOREtModel { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__tModelKey with length 0..unbounded std::vector tModelKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREtModel(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREtModel(struct soap*, const char *tModelKey); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREtModel(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"discard_authToken" class uddi2__discard_USCOREauthToken { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__discard_USCOREauthToken(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__discard_USCOREauthToken(struct soap*, const char *authInfo); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_binding" class uddi2__find_USCOREbinding { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":tModelBag uddi2__tModelBag* tModelBag 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// Attribute serviceKey of type "urn:uddi-org:api_v2":serviceKey @uddi2__serviceKey serviceKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbinding(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbinding(struct soap*, const char *tModelKey); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbinding(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__bindingDetail *send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_business" class uddi2__find_USCOREbusiness { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Vector of uddi2__name* with length 0..unbounded std::vector name 0; /// Element reference "urn:uddi-org:api_v2":identifierBag uddi2__identifierBag* identifierBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":tModelBag uddi2__tModelBag* tModelBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":discoveryURLs uddi2__discoveryURLs* discoveryURLs 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbusiness(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbusiness(struct soap*, const char *name); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbusiness(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbusiness(struct soap*, std::vector keyedReferences); /// Member declared in uddi2-typemap.dat uddi2__businessList *send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_relatedBusinesses" class uddi2__find_USCORErelatedBusinesses { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":businessKey uddi2__businessKey businessKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":keyedReference uddi2__keyedReference* keyedReference 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCORErelatedBusinesses(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCORErelatedBusinesses(struct soap*, const char *businessKey); /// Member declared in uddi2-typemap.dat uddi2__relatedBusinessesList *send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_service" class uddi2__find_USCOREservice { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Vector of uddi2__name* with length 0..unbounded std::vector name 0; /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":tModelBag uddi2__tModelBag* tModelBag 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCOREservice(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREservice(struct soap*, const char *name); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREservice(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREservice(struct soap*, std::vector keyedReferences); /// Member declared in uddi2-typemap.dat uddi2__serviceList* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_tModel" class uddi2__find_USCOREtModel { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":name uddi2__name* name 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":identifierBag uddi2__identifierBag* identifierBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCOREtModel(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREtModel(struct soap*, const char *name); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREtModel(struct soap*, std::vector keyedReferences); /// Member declared in uddi2-typemap.dat uddi2__tModelList* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_assertionStatusReport" class uddi2__get_USCOREassertionStatusReport { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":completionStatus char* completionStatus 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREassertionStatusReport(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREassertionStatusReport(struct soap*, const char *completionStatus); /// Member declared in uddi2-typemap.dat uddi2__assertionStatusReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"get_authToken" class uddi2__get_USCOREauthToken { public: /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute userID of type xs:string @char* userID 1; ///< Required attribute /// Attribute cred of type xs:string @char* cred 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREauthToken(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREauthToken(struct soap*, const char *userid, const char *passwd); /// Member declared in uddi2-typemap.dat uddi2__authToken* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_bindingDetail" class uddi2__get_USCOREbindingDetail { public: /// Vector of uddi2__bindingKey with length 0..unbounded std::vector bindingKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbindingDetail(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbindingDetail(struct soap*, const char *bindingKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbindingDetail(struct soap*, std::vector bindingKeys); /// Member declared in uddi2-typemap.dat uddi2__bindingDetail* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_businessDetail" class uddi2__get_USCOREbusinessDetail { public: /// Vector of uddi2__businessKey with length 0..unbounded std::vector businessKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetail(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetail(struct soap*, const char *businessKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetail(struct soap*, std::vector businessKeys); /// Member declared in uddi2-typemap.dat uddi2__businessDetail* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_businessDetailExt" class uddi2__get_USCOREbusinessDetailExt { public: /// Vector of uddi2__businessKey with length 0..unbounded std::vector businessKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetailExt(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetailExt(struct soap*, const char *businessKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetailExt(struct soap*, std::vector businessKeys); /// Member declared in uddi2-typemap.dat uddi2__businessDetailExt* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_publisherAssertions" class uddi2__get_USCOREpublisherAssertions { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREpublisherAssertions(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__publisherAssertions* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"get_registeredInfo" class uddi2__get_USCOREregisteredInfo { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREregisteredInfo(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__registeredInfo* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"get_serviceDetail" class uddi2__get_USCOREserviceDetail { public: /// Vector of uddi2__serviceKey with length 0..unbounded std::vector serviceKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREserviceDetail(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREserviceDetail(struct soap*, const char *serviceKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREserviceDetail(struct soap*, std::vector serviceKeys); /// Member declared in uddi2-typemap.dat uddi2__serviceDetail* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_tModelDetail" class uddi2__get_USCOREtModelDetail { public: /// Vector of uddi2__tModelKey with length 0..unbounded std::vector tModelKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREtModelDetail(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREtModelDetail(struct soap*, const char *tModelKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREtModelDetail(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__tModelDetail* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"save_binding" class uddi2__save_USCOREbinding { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__bindingTemplate* with length 0..unbounded std::vector bindingTemplate 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbinding(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbinding(struct soap*, uddi2__bindingTemplate &bindingTemplate); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbinding(struct soap*, std::vector bindingTemplates); /// Member declared in uddi2-typemap.dat uddi2__bindingDetail* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"save_business" class uddi2__save_USCOREbusiness { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__businessEntity* with length 0..unbounded std::vector businessEntity 0; /// Vector of char* with length 0..unbounded std::vector uploadRegister 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbusiness(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbusiness(struct soap*, uddi2__businessEntity &businessEntity); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbusiness(struct soap*, std::vector businessEntities); /// Member declared in uddi2-typemap.dat uddi2__businessDetail* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"save_service" class uddi2__save_USCOREservice { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__businessService* with length 0..unbounded std::vector businessService 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__save_USCOREservice(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREservice(struct soap*, uddi2__businessService &businessService); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREservice(struct soap*, std::vector businessServices); /// Member declared in uddi2-typemap.dat uddi2__serviceDetail* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"save_tModel" class uddi2__save_USCOREtModel { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__tModel* with length 0..unbounded std::vector tModel 0; /// Vector of char* with length 0..unbounded std::vector uploadRegister 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__save_USCOREtModel(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREtModel(struct soap*, uddi2__tModel &tModel); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREtModel(struct soap*, std::vector tModels); /// Member declared in uddi2-typemap.dat uddi2__tModelDetail* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"set_publisherAssertions" class uddi2__set_USCOREpublisherAssertions { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__publisherAssertion* with length 0..unbounded std::vector publisherAssertion 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__set_USCOREpublisherAssertions(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__set_USCOREpublisherAssertions(struct soap*, std::vector publisherAssertions); /// Member declared in uddi2-typemap.dat uddi2__publisherAssertions* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"validate_values" class uddi2__validate_USCOREvalues { public: // CHOICE OF ELEMENTS: /// Vector of uddi2__businessEntity* with length 0..unbounded std::vector businessEntity 0; /// Vector of uddi2__businessService* with length 0..unbounded std::vector businessService 0; /// Vector of uddi2__tModel* with length 0..unbounded std::vector tModel 0; // END CHOICE /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"assertionStatusReport" class uddi2__assertionStatusReport { public: /// Vector of uddi2__assertionStatusItem* with length 0..unbounded std::vector assertionStatusItem 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"authToken" class uddi2__authToken { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"bindingDetail" class uddi2__bindingDetail { public: /// Vector of uddi2__bindingTemplate* with length 0..unbounded std::vector bindingTemplate 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessDetail" class uddi2__businessDetail { public: /// Vector of uddi2__businessEntity* with length 0..unbounded std::vector businessEntity 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessDetailExt" class uddi2__businessDetailExt { public: /// Vector of uddi2__businessEntityExt* with length 0..unbounded std::vector businessEntityExt 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessList" class uddi2__businessList { public: /// Element reference "urn:uddi-org:api_v2":businessInfos uddi2__businessInfos* businessInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"publisherAssertions" class uddi2__publisherAssertions { public: /// Vector of uddi2__publisherAssertion* with length 0..unbounded std::vector publisherAssertion 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute authorizedName of type xs:string @char* authorizedName 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"registeredInfo" class uddi2__registeredInfo { public: /// Element reference "urn:uddi-org:api_v2":businessInfos uddi2__businessInfos* businessInfos 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":tModelInfos uddi2__tModelInfos* tModelInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"relatedBusinessesList" class uddi2__relatedBusinessesList { public: /// Element reference "urn:uddi-org:api_v2":businessKey uddi2__businessKey businessKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":relatedBusinessInfos uddi2__relatedBusinessInfos* relatedBusinessInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"serviceDetail" class uddi2__serviceDetail { public: /// Vector of uddi2__businessService* with length 0..unbounded std::vector businessService 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"serviceList" class uddi2__serviceList { public: /// Element reference "urn:uddi-org:api_v2":serviceInfos uddi2__serviceInfos* serviceInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelDetail" class uddi2__tModelDetail { public: /// Vector of uddi2__tModel* with length 0..unbounded std::vector tModel 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelList" class uddi2__tModelList { public: /// Element reference "urn:uddi-org:api_v2":tModelInfos uddi2__tModelInfos* tModelInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"accessPoint" class uddi2__accessPoint { public: char* __item ; /// Attribute URLType of type "urn:uddi-org:api_v2":URLType @enum uddi2__URLType URLType 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"addressLine" class uddi2__addressLine { public: char* __item ; /// Attribute keyName of type xs:string @char* keyName 0; ///< Optional attribute /// Attribute keyValue of type xs:string @char* keyValue 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"description" class uddi2__description { public: char* __item ; /// Attribute reference xml:lang @xml__lang xml__lang_ 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"discoveryURL" class uddi2__discoveryURL { public: char* __item ; /// Attribute useType of type xs:string @char* useType 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"email" class uddi2__email { public: char* __item ; /// Attribute useType of type xs:string @char* useType 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"errInfo" class uddi2__errInfo { public: char* __item ; /// Attribute errCode of type xs:string @char* errCode 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"name" class uddi2__name { public: char* __item ; /// Attribute reference xml:lang @xml__lang xml__lang_ 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"phone" class uddi2__phone { public: char* __item ; /// Attribute useType of type xs:string @char* useType 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap pub2 service name: PublishSoap //gsoap pub2 service type: Publish //gsoap pub2 service namespace: urn:uddi-org:publication_v2 /** @mainpage UDDI_Publication_API_V2 Definitions @section UDDI_Publication_API_V2_documentation Documentation Copyright (c) 2000 - 2002 by Accenture, Ariba, Inc., Commerce One, Inc. Fujitsu Limited, Hewlett-Packard Company, i2 Technologies, Inc., Intel Corporation, International Business Machines Corporation, Microsoft Corporation, Oracle Corporation, SAP AG, Sun Microsystems, Inc., and VeriSign, Inc. All Rights Reserved. WSDL Service Interface for UDDI Publication API V2.0 This WSDL document defines the publication API calls for interacting with the UDDI registry. The complete UDDI API specification is available at http://www.uddi.org/specification.html. @section UDDI_Publication_API_V2_bindings Bindings - @ref PublishSoap */ /** @page PublishSoap Binding "PublishSoap" @section PublishSoap_operations Operations of Binding "PublishSoap" - @ref __pub2__add_USCOREpublisherAssertions - @ref __pub2__delete_USCOREbinding - @ref __pub2__delete_USCOREbusiness - @ref __pub2__delete_USCOREpublisherAssertions - @ref __pub2__delete_USCOREservice - @ref __pub2__delete_USCOREtModel - @ref __pub2__discard_USCOREauthToken - @ref __pub2__get_USCOREassertionStatusReport - @ref __pub2__get_USCOREauthToken - @ref __pub2__get_USCOREpublisherAssertions - @ref __pub2__get_USCOREregisteredInfo - @ref __pub2__save_USCOREbinding - @ref __pub2__save_USCOREbusiness - @ref __pub2__save_USCOREservice - @ref __pub2__save_USCOREtModel - @ref __pub2__set_USCOREpublisherAssertions @section PublishSoap_ports Endpoints of Binding "PublishSoap" */ /******************************************************************************\ * * * SOAP Fault Detail * * * \******************************************************************************/ /// The SOAP Fault Detail element contains one of the following types serialized // in the __type and fault fields of the SOAP_ENV__Detail struct (see docs) class _dispositionReport { public: uddi2__dispositionReport* uddi2__dispositionReport_; struct soap *soap ; }; /******************************************************************************\ * * * PublishSoap * * * \******************************************************************************/ /******************************************************************************\ * * * __pub2__add_USCOREpublisherAssertions * * * \******************************************************************************/ /// Operation "__pub2__add_USCOREpublisherAssertions" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="add_publisherAssertions" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__add_USCOREpublisherAssertions(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: uddi2__add_USCOREpublisherAssertions* uddi2__add_USCOREpublisherAssertions_, // response parameters: uddi2__dispositionReport* uddi2__dispositionReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: add_USCOREpublisherAssertions document //gsoap pub2 service method-encoding: add_USCOREpublisherAssertions literal //gsoap pub2 service method-action: add_USCOREpublisherAssertions add_publisherAssertions //gsoap pub2 service method-fault: add_USCOREpublisherAssertions _dispositionReport int __pub2__add_USCOREpublisherAssertions( uddi2__add_USCOREpublisherAssertions* uddi2__add_USCOREpublisherAssertions_, uddi2__dispositionReport* uddi2__dispositionReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__delete_USCOREbinding * * * \******************************************************************************/ /// Operation "__pub2__delete_USCOREbinding" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="delete_binding" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__delete_USCOREbinding(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: uddi2__delete_USCOREbinding* uddi2__delete_USCOREbinding_, // response parameters: uddi2__dispositionReport* uddi2__dispositionReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: delete_USCOREbinding document //gsoap pub2 service method-encoding: delete_USCOREbinding literal //gsoap pub2 service method-action: delete_USCOREbinding delete_binding //gsoap pub2 service method-fault: delete_USCOREbinding _dispositionReport int __pub2__delete_USCOREbinding( uddi2__delete_USCOREbinding* uddi2__delete_USCOREbinding_, uddi2__dispositionReport* uddi2__dispositionReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__delete_USCOREbusiness * * * \******************************************************************************/ /// Operation "__pub2__delete_USCOREbusiness" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="delete_business" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__delete_USCOREbusiness(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: uddi2__delete_USCOREbusiness* uddi2__delete_USCOREbusiness_, // response parameters: uddi2__dispositionReport* uddi2__dispositionReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: delete_USCOREbusiness document //gsoap pub2 service method-encoding: delete_USCOREbusiness literal //gsoap pub2 service method-action: delete_USCOREbusiness delete_business //gsoap pub2 service method-fault: delete_USCOREbusiness _dispositionReport int __pub2__delete_USCOREbusiness( uddi2__delete_USCOREbusiness* uddi2__delete_USCOREbusiness_, uddi2__dispositionReport* uddi2__dispositionReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__delete_USCOREpublisherAssertions * * * \******************************************************************************/ /// Operation "__pub2__delete_USCOREpublisherAssertions" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="delete_publisherAssertions" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__delete_USCOREpublisherAssertions(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: uddi2__delete_USCOREpublisherAssertions* uddi2__delete_USCOREpublisherAssertions_, // response parameters: uddi2__dispositionReport* uddi2__dispositionReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: delete_USCOREpublisherAssertions document //gsoap pub2 service method-encoding: delete_USCOREpublisherAssertions literal //gsoap pub2 service method-action: delete_USCOREpublisherAssertions delete_publisherAssertions //gsoap pub2 service method-fault: delete_USCOREpublisherAssertions _dispositionReport int __pub2__delete_USCOREpublisherAssertions( uddi2__delete_USCOREpublisherAssertions* uddi2__delete_USCOREpublisherAssertions_, uddi2__dispositionReport* uddi2__dispositionReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__delete_USCOREservice * * * \******************************************************************************/ /// Operation "__pub2__delete_USCOREservice" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="delete_service" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__delete_USCOREservice(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: uddi2__delete_USCOREservice* uddi2__delete_USCOREservice_, // response parameters: uddi2__dispositionReport* uddi2__dispositionReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: delete_USCOREservice document //gsoap pub2 service method-encoding: delete_USCOREservice literal //gsoap pub2 service method-action: delete_USCOREservice delete_service //gsoap pub2 service method-fault: delete_USCOREservice _dispositionReport int __pub2__delete_USCOREservice( uddi2__delete_USCOREservice* uddi2__delete_USCOREservice_, uddi2__dispositionReport* uddi2__dispositionReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__delete_USCOREtModel * * * \******************************************************************************/ /// Operation "__pub2__delete_USCOREtModel" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="delete_tModel" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__delete_USCOREtModel(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: uddi2__delete_USCOREtModel* uddi2__delete_USCOREtModel_, // response parameters: uddi2__dispositionReport* uddi2__dispositionReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: delete_USCOREtModel document //gsoap pub2 service method-encoding: delete_USCOREtModel literal //gsoap pub2 service method-action: delete_USCOREtModel delete_tModel //gsoap pub2 service method-fault: delete_USCOREtModel _dispositionReport int __pub2__delete_USCOREtModel( uddi2__delete_USCOREtModel* uddi2__delete_USCOREtModel_, uddi2__dispositionReport* uddi2__dispositionReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__discard_USCOREauthToken * * * \******************************************************************************/ /// Operation "__pub2__discard_USCOREauthToken" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="discard_authToken" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__discard_USCOREauthToken(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: uddi2__discard_USCOREauthToken* uddi2__discard_USCOREauthToken_, // response parameters: uddi2__dispositionReport* uddi2__dispositionReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: discard_USCOREauthToken document //gsoap pub2 service method-encoding: discard_USCOREauthToken literal //gsoap pub2 service method-action: discard_USCOREauthToken discard_authToken //gsoap pub2 service method-fault: discard_USCOREauthToken _dispositionReport int __pub2__discard_USCOREauthToken( uddi2__discard_USCOREauthToken* uddi2__discard_USCOREauthToken_, uddi2__dispositionReport* uddi2__dispositionReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__get_USCOREassertionStatusReport * * * \******************************************************************************/ /// Operation "__pub2__get_USCOREassertionStatusReport" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_assertionStatusReport" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__get_USCOREassertionStatusReport(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: uddi2__get_USCOREassertionStatusReport* uddi2__get_USCOREassertionStatusReport_, // response parameters: uddi2__assertionStatusReport* uddi2__assertionStatusReport_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: get_USCOREassertionStatusReport document //gsoap pub2 service method-encoding: get_USCOREassertionStatusReport literal //gsoap pub2 service method-action: get_USCOREassertionStatusReport get_assertionStatusReport //gsoap pub2 service method-fault: get_USCOREassertionStatusReport _dispositionReport int __pub2__get_USCOREassertionStatusReport( uddi2__get_USCOREassertionStatusReport* uddi2__get_USCOREassertionStatusReport_, uddi2__assertionStatusReport* uddi2__assertionStatusReport_ ///< response parameter ); /******************************************************************************\ * * * __pub2__get_USCOREauthToken * * * \******************************************************************************/ /// Operation "__pub2__get_USCOREauthToken" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_authToken" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__get_USCOREauthToken(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: uddi2__get_USCOREauthToken* uddi2__get_USCOREauthToken_, // response parameters: uddi2__authToken* uddi2__authToken_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: get_USCOREauthToken document //gsoap pub2 service method-encoding: get_USCOREauthToken literal //gsoap pub2 service method-action: get_USCOREauthToken get_authToken //gsoap pub2 service method-fault: get_USCOREauthToken _dispositionReport int __pub2__get_USCOREauthToken( uddi2__get_USCOREauthToken* uddi2__get_USCOREauthToken_, uddi2__authToken* uddi2__authToken_ ///< response parameter ); /******************************************************************************\ * * * __pub2__get_USCOREpublisherAssertions * * * \******************************************************************************/ /// Operation "__pub2__get_USCOREpublisherAssertions" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_publisherAssertions" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__get_USCOREpublisherAssertions(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: uddi2__get_USCOREpublisherAssertions* uddi2__get_USCOREpublisherAssertions_, // response parameters: uddi2__publisherAssertions* uddi2__publisherAssertions_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: get_USCOREpublisherAssertions document //gsoap pub2 service method-encoding: get_USCOREpublisherAssertions literal //gsoap pub2 service method-action: get_USCOREpublisherAssertions get_publisherAssertions //gsoap pub2 service method-fault: get_USCOREpublisherAssertions _dispositionReport int __pub2__get_USCOREpublisherAssertions( uddi2__get_USCOREpublisherAssertions* uddi2__get_USCOREpublisherAssertions_, uddi2__publisherAssertions* uddi2__publisherAssertions_ ///< response parameter ); /******************************************************************************\ * * * __pub2__get_USCOREregisteredInfo * * * \******************************************************************************/ /// Operation "__pub2__get_USCOREregisteredInfo" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_registeredInfo" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__get_USCOREregisteredInfo(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: uddi2__get_USCOREregisteredInfo* uddi2__get_USCOREregisteredInfo_, // response parameters: uddi2__registeredInfo* uddi2__registeredInfo_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: get_USCOREregisteredInfo document //gsoap pub2 service method-encoding: get_USCOREregisteredInfo literal //gsoap pub2 service method-action: get_USCOREregisteredInfo get_registeredInfo //gsoap pub2 service method-fault: get_USCOREregisteredInfo _dispositionReport int __pub2__get_USCOREregisteredInfo( uddi2__get_USCOREregisteredInfo* uddi2__get_USCOREregisteredInfo_, uddi2__registeredInfo* uddi2__registeredInfo_ ///< response parameter ); /******************************************************************************\ * * * __pub2__save_USCOREbinding * * * \******************************************************************************/ /// Operation "__pub2__save_USCOREbinding" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="save_binding" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__save_USCOREbinding(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: uddi2__save_USCOREbinding* uddi2__save_USCOREbinding_, // response parameters: uddi2__bindingDetail* uddi2__bindingDetail_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: save_USCOREbinding document //gsoap pub2 service method-encoding: save_USCOREbinding literal //gsoap pub2 service method-action: save_USCOREbinding save_binding //gsoap pub2 service method-fault: save_USCOREbinding _dispositionReport int __pub2__save_USCOREbinding( uddi2__save_USCOREbinding* uddi2__save_USCOREbinding_, uddi2__bindingDetail* uddi2__bindingDetail_ ///< response parameter ); /******************************************************************************\ * * * __pub2__save_USCOREbusiness * * * \******************************************************************************/ /// Operation "__pub2__save_USCOREbusiness" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="save_business" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__save_USCOREbusiness(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: uddi2__save_USCOREbusiness* uddi2__save_USCOREbusiness_, // response parameters: uddi2__businessDetail* uddi2__businessDetail_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: save_USCOREbusiness document //gsoap pub2 service method-encoding: save_USCOREbusiness literal //gsoap pub2 service method-action: save_USCOREbusiness save_business //gsoap pub2 service method-fault: save_USCOREbusiness _dispositionReport int __pub2__save_USCOREbusiness( uddi2__save_USCOREbusiness* uddi2__save_USCOREbusiness_, uddi2__businessDetail* uddi2__businessDetail_ ///< response parameter ); /******************************************************************************\ * * * __pub2__save_USCOREservice * * * \******************************************************************************/ /// Operation "__pub2__save_USCOREservice" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="save_service" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__save_USCOREservice(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: uddi2__save_USCOREservice* uddi2__save_USCOREservice_, // response parameters: uddi2__serviceDetail* uddi2__serviceDetail_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: save_USCOREservice document //gsoap pub2 service method-encoding: save_USCOREservice literal //gsoap pub2 service method-action: save_USCOREservice save_service //gsoap pub2 service method-fault: save_USCOREservice _dispositionReport int __pub2__save_USCOREservice( uddi2__save_USCOREservice* uddi2__save_USCOREservice_, uddi2__serviceDetail* uddi2__serviceDetail_ ///< response parameter ); /******************************************************************************\ * * * __pub2__save_USCOREtModel * * * \******************************************************************************/ /// Operation "__pub2__save_USCOREtModel" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="save_tModel" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__save_USCOREtModel(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: uddi2__save_USCOREtModel* uddi2__save_USCOREtModel_, // response parameters: uddi2__tModelDetail* uddi2__tModelDetail_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: save_USCOREtModel document //gsoap pub2 service method-encoding: save_USCOREtModel literal //gsoap pub2 service method-action: save_USCOREtModel save_tModel //gsoap pub2 service method-fault: save_USCOREtModel _dispositionReport int __pub2__save_USCOREtModel( uddi2__save_USCOREtModel* uddi2__save_USCOREtModel_, uddi2__tModelDetail* uddi2__tModelDetail_ ///< response parameter ); /******************************************************************************\ * * * __pub2__set_USCOREpublisherAssertions * * * \******************************************************************************/ /// Operation "__pub2__set_USCOREpublisherAssertions" of service binding "PublishSoap" /** Operation details: - SOAP document/literal style - SOAP action="set_publisherAssertions" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___pub2__set_USCOREpublisherAssertions(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: uddi2__set_USCOREpublisherAssertions* uddi2__set_USCOREpublisherAssertions_, // response parameters: uddi2__publisherAssertions* uddi2__publisherAssertions_ ); @endcode C++ proxy class (defined in soapPublishSoapProxy.h): class PublishSoap; */ //gsoap pub2 service method-style: set_USCOREpublisherAssertions document //gsoap pub2 service method-encoding: set_USCOREpublisherAssertions literal //gsoap pub2 service method-action: set_USCOREpublisherAssertions set_publisherAssertions //gsoap pub2 service method-fault: set_USCOREpublisherAssertions _dispositionReport int __pub2__set_USCOREpublisherAssertions( uddi2__set_USCOREpublisherAssertions* uddi2__set_USCOREpublisherAssertions_, uddi2__publisherAssertions* uddi2__publisherAssertions_ ///< response parameter ); /* End of publish_v2.h */ gsoap-2.8.91/gsoap/uddi2/cacerts.pem0000644000175000017500000062777613525245163016572 0ustar ellertellert# Part of the source for this file is provided by Mozilla: # http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 # This file was converted to PEM format with tools provided by OpenSSL. # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. GlobalSign Root CA ================== -----BEGIN CERTIFICATE----- MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== -----END CERTIFICATE----- GlobalSign Root CA - R2 ======================= -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp 9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu 01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== -----END CERTIFICATE----- Verisign Class 3 Public Primary Certification Authority - G3 ============================================================ -----BEGIN CERTIFICATE----- MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== -----END CERTIFICATE----- Entrust.net Premium 2048 Secure Server CA ========================================= -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= -----END CERTIFICATE----- Baltimore CyberTrust Root ========================= -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp -----END CERTIFICATE----- AddTrust External Root ====================== -----BEGIN CERTIFICATE----- MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= -----END CERTIFICATE----- Entrust Root Certification Authority ==================================== -----BEGIN CERTIFICATE----- MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 -----END CERTIFICATE----- GeoTrust Global CA ================== -----BEGIN CERTIFICATE----- MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet 8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm Mw== -----END CERTIFICATE----- GeoTrust Universal CA ===================== -----BEGIN CERTIFICATE----- MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs 7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d 8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI P/rmMuGNG2+k5o7Y+SlIis5z/iw= -----END CERTIFICATE----- GeoTrust Universal CA 2 ======================= -----BEGIN CERTIFICATE----- MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP 20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG 8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 +/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ 4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS -----END CERTIFICATE----- Visa eCommerce Root =================== -----BEGIN CERTIFICATE----- MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI /k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt 398znM/jra6O1I7mT1GvFpLgXPYHDw== -----END CERTIFICATE----- Comodo AAA Services root ======================== -----BEGIN CERTIFICATE----- MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== -----END CERTIFICATE----- QuoVadis Root CA ================ -----BEGIN CERTIFICATE----- MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi 5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi 5nrQNiOKSnQ2+Q== -----END CERTIFICATE----- QuoVadis Root CA 2 ================== -----BEGIN CERTIFICATE----- MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt 66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK +JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II 4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u -----END CERTIFICATE----- QuoVadis Root CA 3 ================== -----BEGIN CERTIFICATE----- MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= -----END CERTIFICATE----- Security Communication Root CA ============================== -----BEGIN CERTIFICATE----- MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw 8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX 5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g 0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ 6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi FL39vmwLAw== -----END CERTIFICATE----- Sonera Class 2 Root CA ====================== -----BEGIN CERTIFICATE----- MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 /Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt 0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH llpwrN9M -----END CERTIFICATE----- XRamp Global CA Root ==================== -----BEGIN CERTIFICATE----- MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc /Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz 8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= -----END CERTIFICATE----- Go Daddy Class 2 CA =================== -----BEGIN CERTIFICATE----- MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b vZ8= -----END CERTIFICATE----- Starfield Class 2 CA ==================== -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 QBFGmh95DmK/D5fs4C8fF5Q= -----END CERTIFICATE----- Taiwan GRCA =========== -----BEGIN CERTIFICATE----- MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O 1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk 7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy +fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS -----END CERTIFICATE----- DigiCert Assured ID Root CA =========================== -----BEGIN CERTIFICATE----- MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== -----END CERTIFICATE----- DigiCert Global Root CA ======================= -----BEGIN CERTIFICATE----- MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- DigiCert High Assurance EV Root CA ================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K -----END CERTIFICATE----- Certplus Class 2 Primary CA =========================== -----BEGIN CERTIFICATE----- MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR 5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ 7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW //1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 l7+ijrRU -----END CERTIFICATE----- DST Root CA X3 ============== -----BEGIN CERTIFICATE----- MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ -----END CERTIFICATE----- SwissSign Gold CA - G2 ====================== -----BEGIN CERTIFICATE----- MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR 7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm 5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr 44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ -----END CERTIFICATE----- SwissSign Silver CA - G2 ======================== -----BEGIN CERTIFICATE----- MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG 9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm +/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH 6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P 4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L 3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx /uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u -----END CERTIFICATE----- GeoTrust Primary Certification Authority ======================================== -----BEGIN CERTIFICATE----- MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG 1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= -----END CERTIFICATE----- thawte Primary Root CA ====================== -----BEGIN CERTIFICATE----- MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ 1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== -----END CERTIFICATE----- VeriSign Class 3 Public Primary Certification Authority - G5 ============================================================ -----BEGIN CERTIFICATE----- MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq -----END CERTIFICATE----- SecureTrust CA ============== -----BEGIN CERTIFICATE----- MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= -----END CERTIFICATE----- Secure Global CA ================ -----BEGIN CERTIFICATE----- MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW -----END CERTIFICATE----- COMODO Certification Authority ============================== -----BEGIN CERTIFICATE----- MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== -----END CERTIFICATE----- Network Solutions Certificate Authority ======================================= -----BEGIN CERTIFICATE----- MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc /Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q 4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey -----END CERTIFICATE----- COMODO ECC Certification Authority ================================== -----BEGIN CERTIFICATE----- MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X 4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= -----END CERTIFICATE----- OISTE WISeKey Global Root GA CA =============================== -----BEGIN CERTIFICATE----- MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ /yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 +vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= -----END CERTIFICATE----- Certigna ======== -----BEGIN CERTIFICATE----- MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY 1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== -----END CERTIFICATE----- Deutsche Telekom Root CA 2 ========================== -----BEGIN CERTIFICATE----- MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU Cm26OWMohpLzGITY+9HPBVZkVw== -----END CERTIFICATE----- Cybertrust Global Root ====================== -----BEGIN CERTIFICATE----- MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW 0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin 89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT 8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi 5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW WL1WMRJOEcgh4LMRkWXbtKaIOM5V -----END CERTIFICATE----- ePKI Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX 12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= -----END CERTIFICATE----- certSIGN ROOT CA ================ -----BEGIN CERTIFICATE----- MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD 0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD -----END CERTIFICATE----- GeoTrust Primary Certification Authority - G3 ============================================= -----BEGIN CERTIFICATE----- MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr 2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt -----END CERTIFICATE----- thawte Primary Root CA - G2 =========================== -----BEGIN CERTIFICATE----- MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== -----END CERTIFICATE----- thawte Primary Root CA - G3 =========================== -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC +BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY 7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC 8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= -----END CERTIFICATE----- GeoTrust Primary Certification Authority - G2 ============================================= -----BEGIN CERTIFICATE----- MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 npaqBA+K -----END CERTIFICATE----- VeriSign Universal Root Certification Authority =============================================== -----BEGIN CERTIFICATE----- MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj 1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 mJO37M2CYfE45k+XmCpajQ== -----END CERTIFICATE----- VeriSign Class 3 Public Primary Certification Authority - G4 ============================================================ -----BEGIN CERTIFICATE----- MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB /zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== -----END CERTIFICATE----- NetLock Arany (Class Gold) Főtanúsítvány ======================================== -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu 0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw /HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= -----END CERTIFICATE----- Staat der Nederlanden Root CA - G2 ================================== -----BEGIN CERTIFICATE----- MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ 5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65 48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737 qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz +51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm 66+KAQ== -----END CERTIFICATE----- Hongkong Post Root CA 1 ======================= -----BEGIN CERTIFICATE----- MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== -----END CERTIFICATE----- SecureSign RootCA11 =================== -----BEGIN CERTIFICATE----- MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= -----END CERTIFICATE----- Microsec e-Szigno Root CA 2009 ============================== -----BEGIN CERTIFICATE----- MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG 0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm 1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi LXpUq3DDfSJlgnCW -----END CERTIFICATE----- GlobalSign Root CA - R3 ======================= -----BEGIN CERTIFICATE----- MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ 0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r kpeDMdmztcpHWD9f -----END CERTIFICATE----- Autoridad de Certificacion Firmaprofesional CIF A62634068 ========================================================= -----BEGIN CERTIFICATE----- MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx 51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi 6Et8Vcad+qMUu2WFbm5PEn4KPJ2V -----END CERTIFICATE----- Izenpe.com ========== -----BEGIN CERTIFICATE----- MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ 03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU +zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK 0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ 0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== -----END CERTIFICATE----- Chambers of Commerce Root - 2008 ================================ -----BEGIN CERTIFICATE----- MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ 0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH 3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF 9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ -----END CERTIFICATE----- Global Chambersign Root - 2008 ============================== -----BEGIN CERTIFICATE----- MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB /gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp 1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG /5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg 9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z 09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B -----END CERTIFICATE----- Go Daddy Root Certificate Authority - G2 ======================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq 9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD +qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r 5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 -----END CERTIFICATE----- Starfield Root Certificate Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx 4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 -----END CERTIFICATE----- Starfield Services Root Certificate Authority - G2 ================================================== -----BEGIN CERTIFICATE----- MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 -----END CERTIFICATE----- AffirmTrust Commercial ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv 0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= -----END CERTIFICATE----- AffirmTrust Networking ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 /PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 /ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= -----END CERTIFICATE----- AffirmTrust Premium =================== -----BEGIN CERTIFICATE----- MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV 5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs +7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 /bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo +Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC 6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK +4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== -----END CERTIFICATE----- AffirmTrust Premium ECC ======================= -----BEGIN CERTIFICATE----- MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X 57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM eQ== -----END CERTIFICATE----- Certum Trusted Network CA ========================= -----BEGIN CERTIFICATE----- MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= -----END CERTIFICATE----- TWCA Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP 4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG 9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== -----END CERTIFICATE----- Security Communication RootCA2 ============================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ +T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R 3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk 3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 -----END CERTIFICATE----- EC-ACC ====== -----BEGIN CERTIFICATE----- MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw 0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D 5EI= -----END CERTIFICATE----- Hellenic Academic and Research Institutions RootCA 2011 ======================================================= -----BEGIN CERTIFICATE----- MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI 1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa 71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u 8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH 3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD /md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N 7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 -----END CERTIFICATE----- Actalis Authentication Root CA ============================== -----BEGIN CERTIFICATE----- MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC 4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo 2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== -----END CERTIFICATE----- Trustis FPS Root CA =================== -----BEGIN CERTIFICATE----- MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P 8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl iB6XzCGcKQENZetX2fNXlrtIzYE= -----END CERTIFICATE----- Buypass Class 2 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn 9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b /+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN rJgWVqA= -----END CERTIFICATE----- Buypass Class 3 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR 5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh 7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH 2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV /afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz 6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi Cp/HuZc= -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 3 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK 9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W 0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== -----END CERTIFICATE----- EE Certification Centre Root CA =============================== -----BEGIN CERTIFICATE----- MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw 93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU 3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM dcGWxZ0= -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 2009 ============================== -----BEGIN CERTIFICATE----- MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ 4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm 2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 EV 2009 ================================= -----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T 7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv w9y4AyHqnxbxLFS1 -----END CERTIFICATE----- CA Disig Root R2 ================ -----BEGIN CERTIFICATE----- MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa 5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV 7+ZtsH8tZ/3zbBt1RqPlShfppNcL -----END CERTIFICATE----- ACCVRAIZ1 ========= -----BEGIN CERTIFICATE----- MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ 0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR 5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J 9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd 3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p EfbRD0tVNEYqi4Y7 -----END CERTIFICATE----- TWCA Global Root CA =================== -----BEGIN CERTIFICATE----- MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M 8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg /eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= -----END CERTIFICATE----- TeliaSonera Root CA v1 ====================== -----BEGIN CERTIFICATE----- MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ 6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA 3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx 0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= -----END CERTIFICATE----- E-Tugra Certification Authority =============================== -----BEGIN CERTIFICATE----- MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB /wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G C7TbO6Orb1wdtn7os4I07QZcJA== -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 2 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR 3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN 9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== -----END CERTIFICATE----- Atos TrustedRoot 2011 ===================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr 54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G 3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed -----END CERTIFICATE----- QuoVadis Root CA 1 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV 7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX 9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP +V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh 3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV hMJKzRwuJIczYOXD -----END CERTIFICATE----- QuoVadis Root CA 2 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD 6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr O3jtZsSOeWmD3n+M -----END CERTIFICATE----- QuoVadis Root CA 3 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe 6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX 0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 PpxxVJkES/1Y+Zj0 -----END CERTIFICATE----- DigiCert Assured ID Root G2 =========================== -----BEGIN CERTIFICATE----- MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH 35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv 0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo IhNzbM8m9Yop5w== -----END CERTIFICATE----- DigiCert Assured ID Root G3 =========================== -----BEGIN CERTIFICATE----- MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy 1vUhZscv6pZjamVFkpUBtA== -----END CERTIFICATE----- DigiCert Global Root G2 ======================= -----BEGIN CERTIFICATE----- MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO 3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu 5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl MrY= -----END CERTIFICATE----- DigiCert Global Root G3 ======================= -----BEGIN CERTIFICATE----- MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y 3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 VOKa5Vt8sycX -----END CERTIFICATE----- DigiCert Trusted Root G4 ======================== -----BEGIN CERTIFICATE----- MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy 7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN 5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb /UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa 5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP 82Z+ -----END CERTIFICATE----- COMODO RSA Certification Authority ================================== -----BEGIN CERTIFICATE----- MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+ 5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX 2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3 sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5 WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+ nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52 7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I LaZRfyHBNVOFBkpdn627G190 -----END CERTIFICATE----- USERTrust RSA Certification Authority ===================================== -----BEGIN CERTIFICATE----- MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz 0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O +T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq /nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8 yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+ eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ 7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM 8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 -----END CERTIFICATE----- USERTrust ECC Certification Authority ===================================== -----BEGIN CERTIFICATE----- MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu 9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= -----END CERTIFICATE----- GlobalSign ECC Root CA - R4 =========================== -----BEGIN CERTIFICATE----- MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q= -----END CERTIFICATE----- GlobalSign ECC Root CA - R5 =========================== -----BEGIN CERTIFICATE----- MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 -----END CERTIFICATE----- Staat der Nederlanden Root CA - G3 ================================== -----BEGIN CERTIFICATE----- MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5 1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp 07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE 41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1 v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA 8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b 8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq 1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk= -----END CERTIFICATE----- Staat der Nederlanden EV Root CA ================================ -----BEGIN CERTIFICATE----- MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r 0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8 Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr 08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV 0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd 74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq 5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi 5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4 WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg== -----END CERTIFICATE----- IdenTrust Commercial Root CA 1 ============================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi 1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl 3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH 6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe 2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R cGzM7vRX+Bi6hG6H -----END CERTIFICATE----- IdenTrust Public Sector Root CA 1 ================================= -----BEGIN CERTIFICATE----- MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL 4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ 3Wl9af0AVqW3rLatt8o+Ae+c -----END CERTIFICATE----- Entrust Root Certification Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP /vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO e4pIb4tF9g== -----END CERTIFICATE----- Entrust Root Certification Authority - EC1 ========================================== -----BEGIN CERTIFICATE----- MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef 9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G -----END CERTIFICATE----- CFCA EV ROOT ============ -----BEGIN CERTIFICATE----- MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD 7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB /wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua 4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su -----END CERTIFICATE----- Certinomis - Root CA ==================== -----BEGIN CERTIFICATE----- MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjETMBEGA1UEChMK Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAbBgNVBAMTFENlcnRpbm9taXMg LSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMzMTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIx EzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRD ZXJ0aW5vbWlzIC0gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQos P5L2fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJflLieY6pOo d5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQVWZUKxkd8aRi5pwP5ynap z8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDFTKWrteoB4owuZH9kb/2jJZOLyKIOSY00 8B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09x RLWtwHkziOC/7aOgFLScCbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE 6OXWk6RiwsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJwx3t FvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SGm/lg0h9tkQPTYKbV PZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4F2iw4lNVYC2vPsKD2NkJK/DAZNuH i5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZngWVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGj YzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I 6tNxIqSSaHh02TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/0KGRHCwPT5iV WVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWwF6YSjNRieOpWauwK0kDDPAUw Pk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZSg081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAX lCOotQqSD7J6wWAsOMwaplv/8gzjqh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJ y29SWwNyhlCVCNSNh4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9 Iff/ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8Vbtaw5Bng DwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwjY/M50n92Uaf0yKHxDHYi I0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nM cyrDflOR1m749fPH0FFNjkulW+YZFzvWgQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVr hkIGuUE= -----END CERTIFICATE----- OISTE WISeKey Global Root GB CA =============================== -----BEGIN CERTIFICATE----- MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk 9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB /zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= -----END CERTIFICATE----- SZAFIR ROOT CA2 =============== -----BEGIN CERTIFICATE----- MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE 2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5 O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67 oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul 4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6 +/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw== -----END CERTIFICATE----- Certum Trusted Network CA 2 =========================== -----BEGIN CERTIFICATE----- MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1 bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9 7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130 GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ 9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 zAYspsbiDrW5viSP -----END CERTIFICATE----- Hellenic Academic and Research Institutions RootCA 2015 ======================================================= -----BEGIN CERTIFICATE----- MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0 aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+ 6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2 fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+ D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn 82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q p/UsQu0yrbYhnr68 -----END CERTIFICATE----- Hellenic Academic and Research Institutions ECC RootCA 2015 =========================================================== -----BEGIN CERTIFICATE----- MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0 aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290 Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR -----END CERTIFICATE----- ISRG Root X1 ============ -----BEGIN CERTIFICATE----- MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ 4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf 1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY 9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV 0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ m+kXQ99b21/+jh5Xos1AnX5iItreGCc= -----END CERTIFICATE----- AC RAIZ FNMT-RCM ================ -----BEGIN CERTIFICATE----- MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou 08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ 47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW +YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d 8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm 5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM= -----END CERTIFICATE----- Amazon Root CA 1 ================ -----BEGIN CERTIFICATE----- MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB /zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy 8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa 2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 -----END CERTIFICATE----- Amazon Root CA 2 ================ -----BEGIN CERTIFICATE----- MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ 3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY +gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= -----END CERTIFICATE----- Amazon Root CA 3 ================ -----BEGIN CERTIFICATE----- MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== -----END CERTIFICATE----- Amazon Root CA 4 ================ -----BEGIN CERTIFICATE----- MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN /sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri 83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== -----END CERTIFICATE----- LuxTrust Global Root 2 ====================== -----BEGIN CERTIFICATE----- MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQELBQAwRjELMAkG A1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNVBAMMFkx1eFRydXN0IEdsb2Jh bCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUwMzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEW MBQGA1UECgwNTHV4VHJ1c3QgUy5BLjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCC AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wm Kb3FibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTemhfY7RBi2 xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1EMShduxq3sVs35a0VkBC wGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsnXpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm 1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkm FRseTJIpgp7VkoGSQXAZ96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niF wpN6cj5mj5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4gDEa/ a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+8kPREd8vZS9kzl8U ubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2jX5t/Lax5Gw5CMZdjpPuKadUiDTSQ MC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmHhFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB /zBCBgNVHSAEOzA5MDcGByuBKwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5 Lmx1eHRydXN0Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT +Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQELBQADggIBAGoZ FO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9BzZAcg4atmpZ1gDlaCDdLnIN H2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTOjFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW 7MM3LGVYvlcAGvI1+ut7MV3CwRI9loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIu ZY+kt9J/Z93I055cqqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWA VWe+2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/JEAdemrR TxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKrezrnK+T+Tb/mjuuqlPpmt /f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQfLSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc 7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31I iyBMz2TWuJdGsE7RKlY6oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr -----END CERTIFICATE----- TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 ============================================= -----BEGIN CERTIFICATE----- MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11 IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8 6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0 3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9 WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= -----END CERTIFICATE----- GDCA TrustAUTH R5 ROOT ====================== -----BEGIN CERTIFICATE----- MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ 9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4 oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx 9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9 H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35 6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd +PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ 8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv /EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== -----END CERTIFICATE----- TrustCor RootCert CA-1 ====================== -----BEGIN CERTIFICATE----- MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYDVQQGEwJQQTEP MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkx MjMxMTcyMzE2WjCBpDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFu YW1hIENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUGA1UECwwe VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZUcnVzdENvciBSb290Q2Vy dCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv463leLCJhJrMxnHQFgKq1mq jQCj/IDHUHuO1CAmujIS2CNUSSUQIpidRtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4 pQa81QBeCQryJ3pS/C3Vseq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0 JEsq1pme9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CVEY4h gLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorWhnAbJN7+KIor0Gqw /Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/DeOxCbeKyKsZn3MzUOcwHwYDVR0j BBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AYYwDQYJKoZIhvcNAQELBQADggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5 mDo4Nvu7Zp5I/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZyonnMlo2HD6C qFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djtsL1Ac59v2Z3kf9YKVmgenFK+P 3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdNzl/HHk484IkzlQsPpTLWPFp5LBk= -----END CERTIFICATE----- TrustCor RootCert CA-2 ====================== -----BEGIN CERTIFICATE----- MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNVBAYTAlBBMQ8w DQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQwIgYDVQQKDBtUcnVzdENvciBT eXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0 eTEfMB0GA1UEAwwWVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEy MzExNzI2MzlaMIGkMQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5h bWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0 IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnIG7CKqJiJJWQdsg4foDSq8Gb ZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9Nk RvRUqdw6VC0xK5mC8tkq1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1 oYxOdqHp2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nKDOOb XUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hapeaz6LMvYHL1cEksr1 /p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF3wP+TfSvPd9cW436cOGlfifHhi5q jxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQP eSghYA2FFn3XVDjxklb9tTNMg9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+Ctg rKAmrhQhJ8Z3mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh 8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAdBgNVHQ4EFgQU 2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6UnrybPZx9mCAZ5YwwYrIwDwYD VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/h Osh80QA9z+LqBrWyOrsGS2h60COXdKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnp kpfbsEZC89NiqpX+MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv 2wnL/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RXCI/hOWB3 S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYaZH9bDTMJBzN7Bj8RpFxw PIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dv DDqPys/cA8GiCcjl/YBeyGBCARsaU1q7N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYU RpFHmygk71dSTlxCnKr3Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANE xdqtvArBAs8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp5KeX RKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu1uwJ -----END CERTIFICATE----- TrustCor ECA-1 ============== -----BEGIN CERTIFICATE----- MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYDVQQGEwJQQTEP MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkxFzAVBgNVBAMMDlRydXN0Q29yIEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3Mjgw N1owgZwxCzAJBgNVBAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5 MSQwIgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29y IENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3IgRUNBLTEwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb3w9U73NjKYKtR8aja+3+XzP4Q1HpGjOR MRegdMTUpwHmspI+ap3tDvl0mEDTPwOABoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23 xFUfJ3zSCNV2HykVh0A53ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmc p0yJF4OuowReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/wZ0+ fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZFZtS6mFjBAgMBAAGj YzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAfBgNVHSMEGDAWgBREnkj1zG1I1KBL f/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF AAOCAQEABT41XBVwm8nHc2FvcivUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u /ukZMjgDfxT2AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50soIipX1TH0Xs J5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BIWJZpTdwHjFGTot+fDz2LYLSC jaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1WitJ/X5g== -----END CERTIFICATE----- SSL.com Root Certification Authority RSA ======================================== -----BEGIN CERTIFICATE----- MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxDjAM BgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24x MTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYw MjEyMTczOTM5WhcNNDEwMjEyMTczOTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NM LmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2RxFdHaxh3a3by/ZPkPQ/C Fp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aXqhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8 P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcCC52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/ge oeOy3ZExqysdBP+lSgQ36YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkp k8zruFvh/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrFYD3Z fBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93EJNyAKoFBbZQ+yODJ gUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVcUS4cK38acijnALXRdMbX5J+tB5O2 UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi8 1xtZPCvM8hnIk2snYxnP/Okm+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4s bE6x/c+cCbqiM+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4GA1UdDwEB/wQE AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGVcpNxJK1ok1iOMq8bs3AD/CUr dIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBcHadm47GUBwwyOabqG7B52B2ccETjit3E+ZUf ijhDPwGFpUenPUayvOUiaPd7nNgsPgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAsl u1OJD7OAUN5F7kR/q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjq erQ0cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jra6x+3uxj MxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90IH37hVZkLId6Tngr75qNJ vTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/YK9f1JmzJBjSWFupwWRoyeXkLtoh/D1JI Pb9s2KJELtFOt3JY04kTlf5Eq/jXixtunLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406y wKBjYZC6VWg3dGq2ktufoYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NI WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k= -----END CERTIFICATE----- SSL.com Root Certification Authority ECC ======================================== -----BEGIN CERTIFICATE----- MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+ 8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z 5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl -----END CERTIFICATE----- SSL.com EV Root Certification Authority RSA R2 ============================================== -----BEGIN CERTIFICATE----- MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+ B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim 9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48 +qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1 ++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7 CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1 hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX 9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== -----END CERTIFICATE----- SSL.com EV Root Certification Authority ECC =========================================== -----BEGIN CERTIFICATE----- MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy 3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe 5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== -----END CERTIFICATE----- GlobalSign Root CA - R6 ======================= -----BEGIN CERTIFICATE----- MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE 3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+ azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP 0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0 lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr 3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1 0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= -----END CERTIFICATE----- OISTE WISeKey Global Root GC CA =============================== -----BEGIN CERTIFICATE----- MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 -----END CERTIFICATE----- gsoap-2.8.91/gsoap/uddi2/example1.cpp0000644000175000017500000000537013525245163016637 0ustar ellertellert/* example1.cpp Example UDDI V2 Client -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2004-2005, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "inqH.h" int main(int argc, char **argv) { char *search_string = "magic"; if (argc > 1) search_string = argv[1]; // Create a gSOAP context struct soap *soap = soap_new(); // Create an object to find a business uddi2__find_USCOREservice fs(soap, search_string); // Send the request uddi2__serviceList *sl = fs.send("http://uddi.xmethods.net/inquire"); // Check if result is OK if (!sl) soap_print_fault(soap, stderr); // If OK, report the service name(s) and unique identification keys else if (sl->serviceInfos) { std::cout << "Search results on " << search_string << ":" << std::endl << std::endl; for (std::vector::const_iterator si = sl->serviceInfos->serviceInfo.begin(); si != sl->serviceInfos->serviceInfo.end(); ++si) { // Report serviceKey and businessKey std::cout << "serviceKey=" << (*si)->serviceKey << std::endl << "businessKey=" << (*si)->businessKey << std::endl; // Report names for (std::vector::const_iterator n = (*si)->name.begin(); n != (*si)->name.end(); ++n) std::cout << "name=" << (*n)->__item << std::endl; std::cout << std::endl; } } // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } gsoap-2.8.91/gsoap/uddi2/README.txt0000644000175000017500000000274313525245163016116 0ustar ellertellertgSOAP UDDI v2 See directory html/index.html for documentation and examples of the UDDI v2 API generated with gSOAP and Doxygen. The API is written in C++. However, wsdl2h option -c can be used to generate C code serializers for UDDI v2. The API implementation supports UDDI v2 inquiry and publish operations. A Makefile is included to build two example C++ clients, example1 and example2, to search services and businesses, respectively. Code can be generated for the inquiry API, publish API, and both combined. To do so, run wsdl2h on inquire_v2.wsdl and/or publish_v2.wsdl COMPILATION The build steps are generally as follows: # Run wsdl2h with mapping specified in uddi2-typemap.dat on the UDDI WSDL(s): $ wsdl2h -tuddi2-typemap.dat -ouddi_v2.h inquire_v2.wsdl publish_v2.wsdl # Run soapcpp2 on the generated .h file (-puddi saves sources as uddiXYZ): $ soapcpp2 -I.. -puddi uddi_v2.h # Complete the build: $ g++ -DWITH_NONAMESPACES -I.. -o main main.cpp inquire_v2.cpp publish_v2.cpp uddiC.cpp uddiClient.cpp ../stdsoap2.cpp # To avoid link errors combining multiple services, replace the last step with: $ echo '' > env.h $ soapcpp2 -I.. -penv env.h $ g++ -DWITH_NONAMESPACES -I.. -o main main.cpp inquire_v2.cpp publish_v2.cpp uddiClientLib.cpp ../stdsoap2.cpp USING DOXYGEN To generate documentation, use Doxygen on the generated header file, e.g. uddi_v2.h. Part of the documentation is included in the uddi2-typemap.dat file, which was used to generate the header file(s) with wsdl2h. gsoap-2.8.91/gsoap/uddi2/inquire_v2.cpp0000644000175000017500000003776013525245163017216 0ustar ellertellert/* inquire_v2.cpp UDDI V2 Inquiry Interface -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2004-2005, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "inqH.h" #undef SOAP_NMAC #define SOAP_NMAC static #define uddiH_H #include "InquireSoap.nsmap" //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_binding // //////////////////////////////////////////////////////////////////////////////// uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap, const char *tModelKey) { // Initialize this object and associate it with the gSOAP context soap_default(soap); // Create a new UDDI tModelKey this->tModelBag = soap_new_uddi2__tModelBag(soap, -1); this->tModelBag->soap_default(soap); this->tModelBag->tModelKey.push_back(soap_strdup(soap, tModelKey)); this->generic = "2.0"; } uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap, std::vector tModelKeys) { // Initialize this object and associate it with the gSOAP context soap_default(soap); // Create a new UDDI tModelKey Bag this->tModelBag = soap_new_uddi2__tModelBag(soap, -1); this->tModelBag->soap_default(soap); this->tModelBag->tModelKey = tModelKeys; this->generic = "2.0"; } uddi2__bindingDetail *uddi2__find_USCOREbinding::send(const char *endpoint) { // Allocate result uddi2__bindingDetail *result = soap_new_uddi2__bindingDetail(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___inq2__find_USCOREbinding(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_business // //////////////////////////////////////////////////////////////////////////////// uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, const char *name) { // Initialize this object and associate it with the gSOAP context soap_default(soap); // Create a new UDDI name uddi2__name *uname = soap_new_uddi2__name(soap, -1); uname->soap_default(soap); uname->__item = soap_strdup(soap, name); this->name.push_back(uname); this->generic = "2.0"; } uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, std::vector keyedReferences) { // Initialize this object and associate it with the gSOAP context soap_default(soap); // Create a new UDDI tModelBag this->categoryBag = soap_new_uddi2__categoryBag(soap, -1); this->categoryBag->soap_default(soap); this->categoryBag->keyedReference = keyedReferences; this->generic = "2.0"; } uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, std::vector tModelKeys) { // Initialize this object and associate it with the gSOAP context soap_default(soap); // Create a new UDDI tModelBag this->tModelBag = soap_new_uddi2__tModelBag(soap, -1); this->tModelBag->soap_default(soap); this->tModelBag->tModelKey = tModelKeys; this->generic = "2.0"; } uddi2__businessList *uddi2__find_USCOREbusiness::send(const char *endpoint) { // Allocate result uddi2__businessList *result = soap_new_uddi2__businessList(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___inq2__find_USCOREbusiness(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_relatedBusinesses // //////////////////////////////////////////////////////////////////////////////// uddi2__find_USCORErelatedBusinesses::uddi2__find_USCORErelatedBusinesses(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__find_USCORErelatedBusinesses::uddi2__find_USCORErelatedBusinesses(struct soap *soap, const char *businessKey) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->businessKey = soap_strdup(soap, businessKey); this->generic = "2.0"; } uddi2__relatedBusinessesList *uddi2__find_USCORErelatedBusinesses::send(const char *endpoint) { // Allocate result uddi2__relatedBusinessesList *result = soap_new_uddi2__relatedBusinessesList(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___inq2__find_USCORErelatedBusinesses(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_service // //////////////////////////////////////////////////////////////////////////////// uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, const char *name) { // Initialize this object and associate it with the gSOAP context soap_default(soap); // Create a new UDDI name uddi2__name *uname = soap_new_uddi2__name(soap, -1); uname->soap_default(soap); uname->__item = soap_strdup(soap, name); this->name.push_back(uname); this->generic = "2.0"; } uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, std::vector keyedReferences) { // Initialize this object and associate it with the gSOAP context soap_default(soap); // Create a new UDDI tModelBag this->categoryBag = soap_new_uddi2__categoryBag(soap, -1); this->categoryBag->soap_default(soap); this->categoryBag->keyedReference = keyedReferences; this->generic = "2.0"; } uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, std::vector tModelKeys) { // Initialize this object and associate it with the gSOAP context soap_default(soap); // Create a new UDDI tModelBag this->tModelBag = soap_new_uddi2__tModelBag(soap, -1); this->tModelBag->soap_default(soap); this->tModelBag->tModelKey = tModelKeys; this->generic = "2.0"; } uddi2__serviceList* uddi2__find_USCOREservice::send(const char *endpoint) { // Allocate result uddi2__serviceList *result = soap_new_uddi2__serviceList(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___inq2__find_USCOREservice(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_tModel // //////////////////////////////////////////////////////////////////////////////// uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap, const char *name) { // Initialize this object and associate it with the gSOAP context soap_default(soap); // Create a new UDDI name this->name = soap_new_uddi2__name(soap, -1); this->name->soap_default(soap); this->name->__item = soap_strdup(soap, name); this->generic = "2.0"; } uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap, std::vector keyedReferences) { // Initialize this object and associate it with the gSOAP context soap_default(soap); // Create a new UDDI tModelBag this->categoryBag = soap_new_uddi2__categoryBag(soap, -1); this->categoryBag->soap_default(soap); this->categoryBag->keyedReference = keyedReferences; this->generic = "2.0"; } uddi2__tModelList* uddi2__find_USCOREtModel::send(const char *endpoint) { // Allocate result uddi2__tModelList *result = soap_new_uddi2__tModelList(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___inq2__find_USCOREtModel(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_bindingDetail // //////////////////////////////////////////////////////////////////////////////// uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap, const char *bindingKey) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->bindingKey.push_back(soap_strdup(soap, bindingKey)); this->generic = "2.0"; } uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap, std::vector bindingKeys) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->bindingKey = bindingKeys; this->generic = "2.0"; } uddi2__bindingDetail *uddi2__get_USCOREbindingDetail::send(const char *endpoint) { // Allocate result uddi2__bindingDetail *result = soap_new_uddi2__bindingDetail(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___inq2__get_USCOREbindingDetail(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_businessDetail // //////////////////////////////////////////////////////////////////////////////// uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap, const char *businessKey) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->businessKey.push_back(soap_strdup(soap, businessKey)); this->generic = "2.0"; } uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap, std::vector businessKeys) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->businessKey = businessKeys; this->generic = "2.0"; } uddi2__businessDetail *uddi2__get_USCOREbusinessDetail::send(const char *endpoint) { // Allocate result uddi2__businessDetail *result = soap_new_uddi2__businessDetail(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___inq2__get_USCOREbusinessDetail(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_businessDetailExt // //////////////////////////////////////////////////////////////////////////////// uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap, const char *businessKey) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->businessKey.push_back(soap_strdup(soap, businessKey)); this->generic = "2.0"; } uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap, std::vector businessKeys) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->businessKey = businessKeys; this->generic = "2.0"; } uddi2__businessDetailExt *uddi2__get_USCOREbusinessDetailExt::send(const char *endpoint) { // Allocate result uddi2__businessDetailExt *result = soap_new_uddi2__businessDetailExt(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___inq2__get_USCOREbusinessDetailExt(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_serviceDetail // //////////////////////////////////////////////////////////////////////////////// uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap, const char *serviceKey) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->serviceKey.push_back(soap_strdup(soap, serviceKey)); this->generic = "2.0"; } uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap, std::vector serviceKeys) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->serviceKey = serviceKeys; this->generic = "2.0"; } uddi2__serviceDetail *uddi2__get_USCOREserviceDetail::send(const char *endpoint) { // Allocate result uddi2__serviceDetail *result = soap_new_uddi2__serviceDetail(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___inq2__get_USCOREserviceDetail(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_tModelDetail // //////////////////////////////////////////////////////////////////////////////// uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap, const char *tModelKey) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->tModelKey.push_back(soap_strdup(soap, tModelKey)); this->generic = "2.0"; } uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap, std::vector tModelKeys) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->tModelKey = tModelKeys; this->generic = "2.0"; } uddi2__tModelDetail *uddi2__get_USCOREtModelDetail::send(const char *endpoint) { // Allocate result uddi2__tModelDetail *result = soap_new_uddi2__tModelDetail(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___inq2__get_USCOREtModelDetail(soap, endpoint, NULL, this, result)) return NULL; return result; } gsoap-2.8.91/gsoap/uddi2/publish_v2.cpp0000644000175000017500000005145113525245163017201 0ustar ellertellert/* publish_v2.cpp UDDI V2 Publish Interface -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2004-2005, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "pubH.h" #define SOAP_NMAC static #define uddiH_H #include "PublishSoap.nsmap" //////////////////////////////////////////////////////////////////////////////// // // uddi2:add_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// uddi2__add_USCOREpublisherAssertions::uddi2__add_USCOREpublisherAssertions(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__add_USCOREpublisherAssertions::uddi2__add_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->publisherAssertion = publisherAssertions; this->generic = "2.0"; } uddi2__dispositionReport *uddi2__add_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) { // Set authorization token this->authInfo = authInfo; // Allocate result uddi2__dispositionReport *result = soap_new_uddi2__dispositionReport(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__add_USCOREpublisherAssertions(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_binding // //////////////////////////////////////////////////////////////////////////////// uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap, const char *bindingKey) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->bindingKey.push_back(soap_strdup(soap, bindingKey)); this->generic = "2.0"; } uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap, std::vector bindingKeys) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->bindingKey = bindingKeys; this->generic = "2.0"; } uddi2__dispositionReport *uddi2__delete_USCOREbinding::send(const char *endpoint, char *authInfo) { // Set authorization token this->authInfo = authInfo; // Allocate result uddi2__dispositionReport *result = soap_new_uddi2__dispositionReport(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__delete_USCOREbinding(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_business // //////////////////////////////////////////////////////////////////////////////// uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap, const char *businessKey) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->businessKey.push_back(soap_strdup(soap, businessKey)); this->generic = "2.0"; } uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap, std::vector businessKeys) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->businessKey = businessKeys; this->generic = "2.0"; } uddi2__dispositionReport *uddi2__delete_USCOREbusiness::send(const char *endpoint, char *authInfo) { // Set authorization token this->authInfo = authInfo; // Allocate result uddi2__dispositionReport *result = soap_new_uddi2__dispositionReport(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__delete_USCOREbusiness(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_service // //////////////////////////////////////////////////////////////////////////////// uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap, const char *serviceKey) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->serviceKey.push_back(soap_strdup(soap, serviceKey)); this->generic = "2.0"; } uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap, std::vector serviceKeys) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->serviceKey = serviceKeys; this->generic = "2.0"; } uddi2__dispositionReport *uddi2__delete_USCOREservice::send(const char *endpoint, char *authInfo) { // Set authorization token this->authInfo = authInfo; // Allocate result uddi2__dispositionReport *result = soap_new_uddi2__dispositionReport(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__delete_USCOREservice(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_tModel // //////////////////////////////////////////////////////////////////////////////// uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap, const char *tModelKey) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->tModelKey.push_back(soap_strdup(soap, tModelKey)); this->generic = "2.0"; } uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap, std::vector tModelKeys) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->tModelKey = tModelKeys; this->generic = "2.0"; } uddi2__dispositionReport *uddi2__delete_USCOREtModel::send(const char *endpoint, char *authInfo) { // Set authorization token this->authInfo = authInfo; // Allocate result uddi2__dispositionReport *result = soap_new_uddi2__dispositionReport(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__delete_USCOREtModel(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// uddi2__delete_USCOREpublisherAssertions::uddi2__delete_USCOREpublisherAssertions(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__delete_USCOREpublisherAssertions::uddi2__delete_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->publisherAssertion = publisherAssertions; this->generic = "2.0"; } uddi2__dispositionReport *uddi2__delete_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) { // Set authorization token this->authInfo = authInfo; // Allocate result uddi2__dispositionReport *result = soap_new_uddi2__dispositionReport(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__delete_USCOREpublisherAssertions(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:discard_authToken // //////////////////////////////////////////////////////////////////////////////// uddi2__discard_USCOREauthToken::uddi2__discard_USCOREauthToken(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__discard_USCOREauthToken::uddi2__discard_USCOREauthToken(struct soap *soap, const char *authInfo) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->authInfo = soap_strdup(soap, authInfo); this->generic = "2.0"; } uddi2__dispositionReport *uddi2__discard_USCOREauthToken::send(const char *endpoint) { // Allocate result uddi2__dispositionReport *result = soap_new_uddi2__dispositionReport(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__discard_USCOREauthToken(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_assertionStatusReport // //////////////////////////////////////////////////////////////////////////////// uddi2__get_USCOREassertionStatusReport::uddi2__get_USCOREassertionStatusReport(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__get_USCOREassertionStatusReport::uddi2__get_USCOREassertionStatusReport(struct soap *soap, const char *completionStatus) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->completionStatus = soap_strdup(soap, completionStatus); this->generic = "2.0"; } uddi2__assertionStatusReport *uddi2__get_USCOREassertionStatusReport::send(const char *endpoint, char *authInfo) { // Set authorization token this->authInfo = authInfo; // Allocate result uddi2__assertionStatusReport *result = soap_new_uddi2__assertionStatusReport(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__get_USCOREassertionStatusReport(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_authToken // //////////////////////////////////////////////////////////////////////////////// uddi2__get_USCOREauthToken::uddi2__get_USCOREauthToken(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__get_USCOREauthToken::uddi2__get_USCOREauthToken(struct soap *soap, const char *userid, const char *passwd) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->userID = soap_strdup(soap, userid); this->cred = soap_strdup(soap, passwd); this->generic = "2.0"; } uddi2__authToken *uddi2__get_USCOREauthToken::send(const char *endpoint) { // Allocate result uddi2__authToken *result = soap_new_uddi2__authToken(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__get_USCOREauthToken(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// uddi2__get_USCOREpublisherAssertions::uddi2__get_USCOREpublisherAssertions(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__publisherAssertions *uddi2__get_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) { // Set authorization token this->authInfo = authInfo; // Allocate result uddi2__publisherAssertions *result = soap_new_uddi2__publisherAssertions(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__get_USCOREpublisherAssertions(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_registeredInfo // //////////////////////////////////////////////////////////////////////////////// uddi2__get_USCOREregisteredInfo::uddi2__get_USCOREregisteredInfo(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__registeredInfo *uddi2__get_USCOREregisteredInfo::send(const char *endpoint, char *authInfo) { // Set authorization token this->authInfo = authInfo; // Allocate result uddi2__registeredInfo *result = soap_new_uddi2__registeredInfo(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__get_USCOREregisteredInfo(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_binding // //////////////////////////////////////////////////////////////////////////////// uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap, uddi2__bindingTemplate &bindingTemplate) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->bindingTemplate.push_back(&bindingTemplate); this->generic = "2.0"; } uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap, std::vector bindingTemplates) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->bindingTemplate = bindingTemplates; this->generic = "2.0"; } uddi2__bindingDetail *uddi2__save_USCOREbinding::send(const char *endpoint, char *authInfo) { // Set authorization token this->authInfo = authInfo; // Allocate result uddi2__bindingDetail *result = soap_new_uddi2__bindingDetail(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__save_USCOREbinding(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_business // //////////////////////////////////////////////////////////////////////////////// uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap, uddi2__businessEntity &businessEntity) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->businessEntity.push_back(&businessEntity); this->generic = "2.0"; } uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap, std::vector businessEntities) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->businessEntity = businessEntities; this->generic = "2.0"; } uddi2__businessDetail *uddi2__save_USCOREbusiness::send(const char *endpoint, char *authInfo) { // Set authorization token this->authInfo = authInfo; // Allocate result uddi2__businessDetail *result = soap_new_uddi2__businessDetail(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__save_USCOREbusiness(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_service // //////////////////////////////////////////////////////////////////////////////// uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap, uddi2__businessService &businessService) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->businessService.push_back(&businessService); this->generic = "2.0"; } uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap, std::vector businessServices) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->businessService = businessServices; this->generic = "2.0"; } uddi2__serviceDetail *uddi2__save_USCOREservice::send(const char *endpoint, char *authInfo) { // Set authorization token this->authInfo = authInfo; // Allocate result uddi2__serviceDetail *result = soap_new_uddi2__serviceDetail(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__save_USCOREservice(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_tModel // //////////////////////////////////////////////////////////////////////////////// uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap, uddi2__tModel &tModel) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->tModel.push_back(&tModel); this->generic = "2.0"; } uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap, std::vector tModels) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->tModel = tModels; this->generic = "2.0"; } uddi2__tModelDetail *uddi2__save_USCOREtModel::send(const char *endpoint, char *authInfo) { // Set authorization token this->authInfo = authInfo; // Allocate result uddi2__tModelDetail *result = soap_new_uddi2__tModelDetail(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__save_USCOREtModel(soap, endpoint, NULL, this, result)) return NULL; return result; } //////////////////////////////////////////////////////////////////////////////// // // uddi2:set_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// uddi2__set_USCOREpublisherAssertions::uddi2__set_USCOREpublisherAssertions(struct soap *soap) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->generic = "2.0"; } uddi2__set_USCOREpublisherAssertions::uddi2__set_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) { // Initialize this object and associate it with the gSOAP context soap_default(soap); this->publisherAssertion = publisherAssertions; this->generic = "2.0"; } uddi2__publisherAssertions *uddi2__set_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) { // Set authorization token this->authInfo = authInfo; // Allocate result uddi2__publisherAssertions *result = soap_new_uddi2__publisherAssertions(soap, -1); // Invoke the wrapper soap_set_namespaces(soap, namespaces); if (soap_call___pub2__set_USCOREpublisherAssertions(soap, endpoint, NULL, this, result)) return NULL; return result; } gsoap-2.8.91/gsoap/uddi2/example3.cpp0000644000175000017500000001507013525245163016637 0ustar ellertellert/* example3.cpp Example UDDI V2 Client -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2004-2005, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "pubH.h" const char *server = "https://uddi.xmethods.net/publish"; const char *userid = "..."; // user ID to access UDDI server const char *passwd = "..."; // password to access UDDI server int main(int argc, char **argv) { // Create a gSOAP context struct soap *soap = soap_new(); // Setup SSL context (optional) to verify server's credentials if (soap_ssl_client_context(soap, SOAP_SSL_DEFAULT, NULL, NULL, "cacerts.pem", NULL, NULL)) { soap_print_fault(soap, stderr); exit(1); } // Step 1: Get an authorization token from the UDDI server uddi2__get_USCOREauthToken get_authToken(soap, userid, passwd); uddi2__authToken *authToken = get_authToken.send(server); // Check if authorized if (!authToken) { soap_print_fault(soap, stderr); exit(1); } // Authorization info provided by server for this session char *authInfo = authToken->authInfo; // Step 2: Create a tModel for the WSDL to be published uddi2__tModel tModel; tModel.soap_default(soap); // Create the tModel and service name tModel.name = soap_new_uddi2__name(soap, -1); tModel.name->__item = "..."; tModel.name->xml__lang_ = "en"; // Create XMethods description elements (see http://www.xmethods.net/ve2/UDDI.po) uddi2__description *description = soap_new_uddi2__description(soap, 6); description[0].__item = "SHORT DESCRIPTION: ..."; description[0].xml__lang_ = "en"; description[1].__item = "SHORT DESCRIPTION: ..."; description[1].xml__lang_ = "en"; description[2].__item = "USAGE NOTES: ..."; description[2].xml__lang_ = "en"; description[3].__item = "HOMEPAGE URL: ..."; description[3].xml__lang_ = "en"; description[4].__item = "CONTACT EMAIL: ..."; description[4].xml__lang_ = "en"; description[5].__item = "IMPLEMENTATION: ..."; description[5].xml__lang_ = "en"; // Add the four description elements to the tModel tModel.description.push_back(description + 0); tModel.description.push_back(description + 1); tModel.description.push_back(description + 2); tModel.description.push_back(description + 4); // Add an overviewDoc element with description and overviewURL tModel.overviewDoc = soap_new_uddi2__overviewDoc(soap, -1); tModel.overviewDoc->soap_default(soap); tModel.overviewDoc->description.push_back(soap_new_uddi2__description(soap, -1)); tModel.overviewDoc->description[0]->__item = "WSDL source document"; tModel.overviewDoc->description[0]->xml__lang_ = "en"; tModel.overviewDoc->overviewURL = "http://.../my.wsdl#bindingName"; // Omit identifier bag tModel.identifierBag = NULL; // Add a category with a WSDL-specific keyedReference tModel.categoryBag = soap_new_uddi2__categoryBag(soap, -1); tModel.categoryBag->soap_default(soap); tModel.categoryBag->keyedReference.push_back(soap_new_uddi2__keyedReference(soap, -1)); tModel.categoryBag->keyedReference[0]->tModelKey = "..."; tModel.categoryBag->keyedReference[0]->keyName = "uddi-org:types"; tModel.categoryBag->keyedReference[0]->keyValue = "wsdlSpec"; tModel.authorizedName = "..."; tModel.operator_ = "..."; tModel.tModelKey = "..."; // Save the tModel uddi2__save_USCOREtModel save_tModel(soap, tModel); uddi2__tModelDetail *tModelDetail = save_tModel.send(server, authInfo); // Step 3: Create a new service to be published uddi2__businessService service; service.soap_default(soap); // Service name is the tModel name (XMethods) service.name.push_back(tModel.name); // Add two description elements to the service service.description.push_back(description + 4); service.description.push_back(description + 5); // Create binding template uddi2__bindingTemplate bindingTemplate; bindingTemplate.soap_default(soap); bindingTemplate.tModelInstanceDetails = soap_new_uddi2__tModelInstanceDetails(soap, -1); bindingTemplate.tModelInstanceDetails->tModelInstanceInfo.push_back(soap_new_uddi2__tModelInstanceInfo(soap, -1)); bindingTemplate.tModelInstanceDetails->tModelInstanceInfo[0]->instanceDetails = NULL; bindingTemplate.tModelInstanceDetails->tModelInstanceInfo[0]->tModelKey = tModel.tModelKey; bindingTemplate.accessPoint = soap_new_uddi2__accessPoint(soap, -1); bindingTemplate.accessPoint->__item = "..."; bindingTemplate.accessPoint->URLType = uddi2__URLType__http; bindingTemplate.hostingRedirector = NULL; bindingTemplate.serviceKey = "..."; bindingTemplate.bindingKey = "..."; // Add binding Template to service service.bindingTemplates = soap_new_uddi2__bindingTemplates(soap, -1); service.bindingTemplates->soap_default(soap); service.bindingTemplates->bindingTemplate.push_back(&bindingTemplate); service.categoryBag = NULL; service.serviceKey = "..."; service.businessKey = "..."; // Save the service uddi2__save_USCOREservice save_service(soap, service); uddi2__serviceDetail *serviceDetail = save_service.send(server, authInfo); // Step 4: Discard authorization token uddi2__discard_USCOREauthToken discard_authToken(soap, authInfo); uddi2__dispositionReport *dispositionReport = discard_authToken.send(server); // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } gsoap-2.8.91/gsoap/uddi2/inquire_v2.h0000644000175000017500000043123313525245163016654 0ustar ellertellert/** @mainpage gSOAP UDDI v2 Universal Description, Discovery and Integration, or UDDI, is the name of a group of web-based registries that expose information about a business or other entity and its technical interfaces. See the UDDI v2 specification @url http://uddi.org/pubs/ProgrammersAPI_v2.htm for more details. @section UDDI2_CLASSES Classes See Related Pages for examples. UDDI Inquire classes - @ref uddi2__find_USCOREbinding - @ref uddi2__find_USCOREbusiness - @ref uddi2__find_USCORErelatedBusinesses - @ref uddi2__find_USCOREservice - @ref uddi2__find_USCOREtModel - @ref uddi2__get_USCOREbindingDetail - @ref uddi2__get_USCOREbusinessDetail - @ref uddi2__get_USCOREbusinessDetailExt - @ref uddi2__get_USCOREserviceDetail - @ref uddi2__get_USCOREtModelDetail UDDI Publish classes - @ref uddi2__add_USCOREpublisherAssertions - @ref uddi2__delete_USCOREbinding - @ref uddi2__delete_USCOREbusiness - @ref uddi2__delete_USCOREservice - @ref uddi2__delete_USCOREtModel - @ref uddi2__delete_USCOREpublisherAssertions - @ref uddi2__discard_USCOREauthToken - @ref uddi2__get_USCOREassertionStatusReport - @ref uddi2__get_USCOREauthToken - @ref uddi2__get_USCOREpublisherAssertions - @ref uddi2__get_USCOREregisteredInfo - @ref uddi2__save_USCOREbinding - @ref uddi2__save_USCOREbusiness - @ref uddi2__save_USCOREservice - @ref uddi2__save_USCOREtModel - @ref uddi2__set_USCOREpublisherAssertions @section UDDI2_BINDINGS Binding Reference - @ref InquireSoap - @ref PublishSoap */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_binding // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREbinding @brief Represents a request to locate bindings that meet the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137712 */ /** @fn uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbinding class. */ /** @fn uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap, const char *tModelKey) @brief @param[in] soap gSOAP context @param[in] tModelKey string Creates an instance of the find_USCOREbinding class using the specified tModel key. */ /** @fn uddi2__find_USCOREbinding::uddi2__find_USCOREbinding(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of tModel key strings Creates an instance of the find_USCOREbinding class using the specified tModel keys. */ /** @fn uddi2__bindingDetail* uddi2__find_USCOREbinding::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__bindingDetail object or NULL on error Send a request to a UDDI server to find binding details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_business // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREbusiness @brief Represents a request to locate businesses that meet specific requirements. When the send method is called, the instance returns a uddi2__businessList object that contains a list of business that matched the search criteria. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137713 See also @ref example2. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, const char *name) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class using the specified name of the requested business. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, std::vector keyedReferences) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class using the specified category references. */ /** @fn uddi2__find_USCOREbusiness::uddi2__find_USCOREbusiness(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREbusiness class using the specified tModel keys. */ /** @fn uddi2__businessList *uddi2__find_USCOREbusiness::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__businessList object or NULL on error Send a request to a UDDI server to find a list of businesses. See also @ref example2. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_relatedBusinesses // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCORErelatedBusinesses @brief Represents a request to locate businesses that are related to a specific business. When the send method is called, the instance returns a uddi2__relatedBusinessList object that contains a list of business that matched the relationship set. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137714 */ /** @fn uddi2__find_USCORErelatedBusinesses::uddi2__find_USCORErelatedBusinesses(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCORErelatedBusiness class. */ /** @fn uddi2__find_USCORErelatedBusinesses::uddi2__find_USCORErelatedBusinesses(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey string Creates an instance of the find_USCORErelatedBusiness class using the specified business key. */ /** @fn uddi2__relatedBusinessesList *uddi2__find_USCORErelatedBusinesses::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__relatedBusinessList object or NULL on error Send a request to a UDDI server to find a list of related businesses. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_service // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREservice @brief Represents a request to locate services that meet the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137715 See also @ref example1. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREservice class. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, const char *name) @brief @param[in] soap gSOAP context @param[in] name of the service Creates an instance of the find_USCOREservice class using the specified name. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, std::vector keyedReferences) @brief @param[in] soap gSOAP context @param[in] keyedReferences collection of category keys Creates an instance of the find_USCOREservice class using the specified category keys. */ /** @fn uddi2__find_USCOREservice::uddi2__find_USCOREservice(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of tModel key strings Creates an instance of the find_USCOREservice class using the specified tModel keys. */ /** @fn uddi2__serviceList* uddi2__find_USCOREservice::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__serviceList object or NULL on error Send a request to a UDDI server to find a list of services. See also @ref example1. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:find_tModel // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__find_USCOREtModel @brief Represents a request to locate a list of tModel entries that match a set of specific criteria. The result of a search is a uddi2__tModelList object that contains information about registered tModel data that matches the criteria. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137716 */ /** @fn uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the find_USCOREtModel class. */ /** @fn uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap, const char *name) @brief @param[in] soap gSOAP context @param[in] name of the tModel Creates an instance of the find_USCOREtModel class using the specified tModel name. */ /** @fn uddi2__find_USCOREtModel::uddi2__find_USCOREtModel(struct soap *soap, std::vector keyedReferences) @brief @param[in] soap gSOAP context @param[in] keyedReferences collection of category keys Creates an instance of the find_USCOREtModel class using the specified category keys. */ /** @fn uddi2__tModelList* uddi2__find_USCOREtModel::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__tModelList object or NULL on error Send a request to a UDDI server to find a tModelList. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_bindingDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREbindingDetail @brief Represents a request to get binding details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137717 */ /** @fn uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREbindingDetail class. */ /** @fn uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap, const char *bindingKey) @brief @param[in] soap gSOAP context @param[in] bindingKey string Creates an instance of the get_USCOREbindingDetail class using the specified binding key. */ /** @fn uddi2__get_USCOREbindingDetail::uddi2__get_USCOREbindingDetail(struct soap *soap, std::vector bindingKeys) @brief @param[in] soap gSOAP context @param[in] bindingKeys collection of key strings Creates an instance of the get_USCOREbindingDetail class using the specified collection of binding keys. */ /** @fn uddi2__bindingDetail* uddi2__get_USCOREbindingDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__bindingDetail object or NULL on error Send a request to a UDDI server to get the binding details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_businessDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREbusinessDetail @brief Represents a request to get business details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137718 */ /** @fn uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREbusinessDetail class. */ /** @fn uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey string Creates an instance of the get_USCOREbusinessDetail class using the specified business key. */ /** @fn uddi2__get_USCOREbusinessDetail::uddi2__get_USCOREbusinessDetail(struct soap *soap, std::vector businessKeys) @brief @param[in] soap gSOAP context @param[in] businessKeys collection of key strings Creates an instance of the get_USCOREbusinessDetail class using the specified collection of business keys. */ /** @fn uddi2__businessDetail* uddi2__get_USCOREbusinessDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__businessDetail object or NULL on error Send a request to a UDDI server to get the business details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_businessDetailExt // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREbusinessDetailExt @brief Represents a request to get business details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137719 */ /** @fn uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREbusinessDetailExt class. */ /** @fn uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey string Creates an instance of the get_USCOREbusinessDetailExt class using the specified business key. */ /** @fn uddi2__get_USCOREbusinessDetailExt::uddi2__get_USCOREbusinessDetailExt(struct soap *soap, std::vector businessKeys) @brief @param[in] soap gSOAP context @param[in] businessKeys collection of key strings Creates an instance of the get_USCOREbusinessDetailExt class using the specified collection of business keys. */ /** @fn uddi2__businessDetailExt* uddi2__get_USCOREbusinessDetailExt::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__businessDetailExt object or NULL on error Send a request to a UDDI server to get the business details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_serviceDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREserviceDetail @brief Represents a request to get service details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137720 */ /** @fn uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREserviceDetail class. */ /** @fn uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap, const char *serviceKey) @brief @param[in] soap gSOAP context @param[in] serviceKey string Creates an instance of the get_USCOREserviceDetail class using the specified service key. */ /** @fn uddi2__get_USCOREserviceDetail::uddi2__get_USCOREserviceDetail(struct soap *soap, std::vector serviceKeys) @brief @param[in] soap gSOAP context @param[in] serviceKeys collection of key strings Creates an instance of the get_USCOREserviceDetail class using the specified collection of service keys. */ /** @fn uddi2__serviceDetail* uddi2__get_USCOREserviceDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__serviceDetail object or NULL on error Send a request to a UDDI server to get the service details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_tModelDetail // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREtModelDetail @brief Represents a request to get tModel details from a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137721 */ /** @fn uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREtModelDetail class. */ /** @fn uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap, const char *tModelKey) @brief @param[in] soap gSOAP context @param[in] tModelKey string Creates an instance of the get_USCOREtModelDetail class using the specified tModel key. */ /** @fn uddi2__get_USCOREtModelDetail::uddi2__get_USCOREtModelDetail(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of key strings Creates an instance of the get_USCOREtModelDetail class using the specified collection of tModel keys. */ /** @fn uddi2__tModelDetail* uddi2__get_USCOREtModelDetail::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__tModelDetail object or NULL on error Send a request to a UDDI server to get the tModel details. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:add_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__add_USCOREpublisherAssertions @brief Represents a request to add one or more publisher assertions to the assertion collection for an individual publisher. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137731 */ /** @fn uddi2__add_USCOREpublisherAssertions::uddi2__add_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the add_USCOREpublisherAssertions class. */ /** @fn uddi2__add_USCOREpublisherAssertions::uddi2__add_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) @brief @param[in] soap gSOAP context @param[in] publisherAssertions collection of publisher assertions Creates an instance of the add_USCOREpublisherAssertions class using the specified publisher assertions. */ /** @fn uddi2__dispositionReport *uddi2__add_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI server to add one or more publisher assertions to the assertion collection for an individual publisher. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_binding // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREbinding @brief Represents a request to delete a binding that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137732 */ /** @fn uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap) @brief Creates an instance of the delete_USCOREbinding class. */ /** @fn uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap, const char *bindingKey) @brief @param[in] soap gSOAP context @param[in] bindingKey a binding key string Creates an instance of the delete_USCOREbinding class. */ /** @fn uddi2__delete_USCOREbinding::uddi2__delete_USCOREbinding(struct soap *soap, std::vector bindingKeys) @brief @param[in] soap gSOAP context @param[in] bindingKeys collection of binding keys Creates an instance of the delete_USCOREbinding class using the specified binding keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREbinding::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a binding that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_business // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREbusiness @brief Represents a request to delete a business that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137733 */ /** @fn uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREbusiness class. */ /** @fn uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap, const char *businessKey) @brief @param[in] soap gSOAP context @param[in] businessKey a business key string Creates an instance of the delete_USCOREbusiness class using the specified business key. */ /** @fn uddi2__delete_USCOREbusiness::uddi2__delete_USCOREbusiness(struct soap *soap, std::vector businessKeys) @brief @param[in] soap gSOAP context @param[in] businessKeys collection of business keys Creates an instance of the delete_USCOREbusiness class using the specified business keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREbusiness::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a business that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_service // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREservice @brief Represents a request to delete a service that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137735 */ /** @fn uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREservice class. */ /** @fn uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap, const char *serviceKey) @brief @param[in] soap gSOAP context @param[in] serviceKey a service key string Creates an instance of the delete_USCOREservice class using the specified service key. */ /** @fn uddi2__delete_USCOREservice::uddi2__delete_USCOREservice(struct soap *soap, std::vector serviceKeys) @brief @param[in] soap gSOAP context @param[in] serviceKeys collection of service keys Creates an instance of the delete_USCOREservice class using the specified service keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREservice::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a service that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_tModel // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREtModel @brief Represents a request to delete a tModel that meets the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137736 */ /** @fn uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREtModel class. */ /** @fn uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap, const char *tModelKey) @brief @param[in] soap gSOAP context @param[in] tModelKey a tModel key string Creates an instance of the delete_USCOREtModel class using the specified tModel key. */ /** @fn uddi2__delete_USCOREtModel::uddi2__delete_USCOREtModel(struct soap *soap, std::vector tModelKeys) @brief @param[in] soap gSOAP context @param[in] tModelKeys collection of tModel keys Creates an instance of the delete_USCOREtModel class using the specified tModel keys. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREtModel::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete a tModel that meets the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:delete_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__delete_USCOREpublisherAssertions @brief Represents a request to delete publisher assertions meeting the specified requirements. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137734 */ /** @fn uddi2__delete_USCOREpublisherAssertions::uddi2__delete_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREpublisherAssertions class. */ /** @fn uddi2__delete_USCOREpublisherAssertions::uddi2__delete_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) @brief @param[in] soap gSOAP context @param[in] publisherAssertions a collection of publisher assertions Creates an instance of the delete_USCOREpublisherAssertions class using the specified collection of publisher assertions. */ /** @fn uddi2__dispositionReport *uddi2__delete_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to delete publisher assertions meeting the specified requirements. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:discard_authToken // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__discard_USCOREauthToken @brief Represents a request to discard an authorization token obtained with the get_USCOREauthToken class. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137737 */ /** @fn uddi2__discard_USCOREauthToken::uddi2__discard_USCOREauthToken(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the delete_USCOREauthToken class. */ /** @fn uddi2__discard_USCOREauthToken::uddi2__discard_USCOREauthToken(struct soap *soap, const char *authInfo) @brief @param[in] soap gSOAP context @param[in] authInfo authorization token provided by the UDDI server Creates an instance of the delete_USCOREauthToken class using the specified authentication token string. */ /** @fn uddi2__dispositionReport *uddi2__discard_USCOREauthToken::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__dispositionReport object or NULL on error Send a request to a UDDI service to discard an authentication token. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_assertionStatusReport // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREassertionStatusReport @brief Provides the ability to determine the status of current and outstanding publisher assertions. The results can be restricted by setting the completionStatus property. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137738 */ /** @fn uddi2__get_USCOREassertionStatusReport::uddi2__get_USCOREassertionStatusReport(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREassertionStatusReport class. */ /** @fn uddi2__get_USCOREassertionStatusReport::uddi2__get_USCOREassertionStatusReport(struct soap *soap, const char *completionStatus) @brief @param[in] soap gSOAP context @param[in] completionStatus completion status string Creates an instance of the get_USCOREassertionStatusReport class using the specified completion status. */ /** @fn uddi2__assertionStatusReport *uddi2__get_USCOREassertionStatusReport::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__assertionStatusReport object or NULL on error Send a request to a UDDI service to get the status of current and outstanding publisher assertions. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_authToken // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREauthToken @brief Represents a request to obtain an authorization token, which is represented by the uddi2__authToken class. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137739 */ /** @fn uddi2__get_USCOREauthToken::uddi2__get_USCOREauthToken(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREauthToken class. */ /** @fn uddi2__get_USCOREauthToken::uddi2__get_USCOREauthToken(struct soap *soap, const char *userid, const char *passwd) @brief @param[in] soap gSOAP context @param[in] userid the user ID string @param[in] passwd the password string Creates an instance of the get_USCOREauthToken class using the specified user ID and password. */ /** @fn uddi2__authToken *uddi2__get_USCOREauthToken::send(const char *endpoint) @brief @param[in] endpoint URL of the UDDI server @return A pointer to a uddi2__authToken object or NULL on error Send a request to a UDDI service to get a authorization token given a user ID and password. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREpublisherAssertions @brief Represents a request to obtain the full set of publisher assertions that are associated with an individual publisher. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137740 */ /** @fn uddi2__get_USCOREpublisherAssertions::uddi2__get_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREpublisherAssetions class. */ /** @fn uddi2__publisherAssertions *uddi2__get_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__publisherAssertions object or NULL on error Send a request to a UDDI service to get publisher assertions. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:get_registeredInfo // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__get_USCOREregisteredInfo @brief Represents a request to get all registered business entities and tModels controlled by an individual. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137741 */ /** @fn uddi2__get_USCOREregisteredInfo::uddi2__get_USCOREregisteredInfo(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the get_USCOREregisteredInfo class. */ /** @fn uddi2__registeredInfo *uddi2__get_USCOREregisteredInfo::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__registeredInfo object or NULL on error Send a request to a UDDI service to get all registered business entities and tModels controlled by an individual. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_binding // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREbinding @brief Represents a request to post binding information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137742 */ /** @fn uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREbinding class. */ /** @fn uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap, uddi2__bindingTemplate &bindingTemplate) @brief @param[in] soap gSOAP context @param[in] bindingTemplate binding template Creates an instance of the save_USCOREbinding class using the specified binding template. */ /** @fn uddi2__save_USCOREbinding::uddi2__save_USCOREbinding(struct soap *soap, std::vector bindingTemplates) @brief @param[in] soap gSOAP context @param[in] bindingTemplates collection of binding templates Creates an instance of the save_USCOREbinding class using the specified binding templates. */ /** @fn uddi2__bindingDetail *uddi2__save_USCOREbinding::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__bindingDetail object or NULL on error Send a request to a UDDI server to post binding information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_business // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREbusiness @brief Represents a request to post business information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137743 */ /** @fn uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREbusiness class. */ /** @fn uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap, uddi2__businessEntity &businessEntity) @brief @param[in] soap gSOAP context @param[in] businessEntity business entity Creates an instance of the save_USCOREbusiness class using the specified business entity. */ /** @fn uddi2__save_USCOREbusiness::uddi2__save_USCOREbusiness(struct soap *soap, std::vector businessEntities) @brief @param[in] soap gSOAP context @param[in] businessEntities collection of business entities Creates an instance of the save_USCOREbusiness class using the specified business entities. */ /** @fn uddi2__businessDetail *uddi2__save_USCOREbusiness::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__businessDetail object or NULL on error Send a request to a UDDI server to post business information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_service // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREservice @brief Represents a request to post service information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137744 */ /** @fn uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREservice class. */ /** @fn uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap, uddi2__businessService &businessService) @brief @param[in] soap gSOAP context @param[in] businessService business service Creates an instance of the save_USCOREservice class using the specified service. */ /** @fn uddi2__save_USCOREservice::uddi2__save_USCOREservice(struct soap *soap, std::vector businessServices) @brief @param[in] soap gSOAP context @param[in] businessServices collection of business services Creates an instance of the save_USCOREservice class using the specified services. */ /** @fn uddi2__serviceDetail *uddi2__save_USCOREservice::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__serviceDetail object or NULL on error Send a request to a UDDI server to post service information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:save_tModel // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__save_USCOREtModel @brief Represents a request to post tModel information on a UDDI server. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137745 */ /** @fn uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the save_USCOREtModel class. */ /** @fn uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap, uddi2__tModel &tModel) @brief @param[in] soap gSOAP context @param[in] tModel a tModel Creates an instance of the save_USCOREtModel class using the specified tModel. */ /** @fn uddi2__save_USCOREtModel::uddi2__save_USCOREtModel(struct soap *soap, std::vector tModels) @brief @param[in] soap gSOAP context @param[in] tModels collection of tModels Creates an instance of the save_USCOREtModel class using the specified tModels. */ /** @fn uddi2__tModelDetail *uddi2__save_USCOREtModel::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__tModelDetail object or NULL on error Send a request to a UDDI server to post tModel information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // uddi2:set_publisherAssertions // //////////////////////////////////////////////////////////////////////////////// /** @class uddi2__set_USCOREpublisherAssertions @brief Represents a request to modify the existing publisher assertions for an individual publisher. See @url http://uddi.org/pubs/ProgrammersAPI_v2.htm#_Toc25137746 */ /** @fn uddi2__set_USCOREpublisherAssertions::uddi2__set_USCOREpublisherAssertions(struct soap *soap) @brief @param[in] soap gSOAP context Creates an instance of the set_USCOREpublisherAssertions class. */ /** @fn uddi2__set_USCOREpublisherAssertions::uddi2__set_USCOREpublisherAssertions(struct soap *soap, std::vector publisherAssertions) @brief @param[in] soap gSOAP context @param[in] publisherAssertions collection of publisher assertions Creates an instance of the set_USCOREpublisherAssertions class using the specified collection of publisher assertions. */ /** @fn uddi2__publisherAssertions *uddi2__set_USCOREpublisherAssertions::send(const char *endpoint, char *authInfo) @brief @param[in] endpoint URL of the UDDI server @param[in] authInfo authorization token provided by the UDDI server @return A pointer to a uddi2__publisherAssertions object or NULL on error Send a request to a UDDI server to post tModel information on the server. */ //////////////////////////////////////////////////////////////////////////////// // // Code Examples // //////////////////////////////////////////////////////////////////////////////// /** @page example1 Code Example 1: Finding a service This example shows you how to find Web services. In this case, the example finds Web services with names that begin with the word "magic". @code #include "inqH.h" int main(int argc, char **argv) { char *search_string = "magic"; if (argc > 1) search_string = argv[1]; // Create a gSOAP context struct soap *soap = soap_new(); // Create an object to find a business uddi2__find_USCOREservice fs(soap, search_string); // Send the request uddi2__serviceList *sl = fs.send("http://uddi.xmethods.net/inquire"); // Check if result is OK if (!sl) soap_print_fault(soap, stderr); // If OK, report the service name(s) and unique identification keys else if (sl->serviceInfos) { std::cout << "Search results on " << search_string << ":" << std::endl << std::endl; for (std::vector::const_iterator si = sl->serviceInfos->serviceInfo.begin(); si != sl->serviceInfos->serviceInfo.end(); ++si) { // Report serviceKey and businessKey std::cout << "serviceKey=" << (*si)->serviceKey << std::endl << "businessKey=" << (*si)->businessKey << std::endl; // Report names for (std::vector::const_iterator n = (*si)->name.begin(); n != (*si)->name.end(); ++n) std::cout << "name=" << (*n)->__item << std::endl; std::cout << std::endl; } } // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } @endcode To compile: - wsdl2h -tuddi2-typemap.dat inquire_v2.wsdl - soapcpp2 -I.. -pinq inquire_v2.h - g++ -DWITH_NONAMESPACES -I.. -o example1 example1.cpp inquire_v2.cpp inqC.cpp inqClient.cpp ../stdsoap2.cpp */ /** @page example2 Code Example 2: Finding a business This example shows you how to find a business from a UDDI server. @code #include "inqH.h" int main(int argc, char **argv) { char *search_string = "xmethods"; if (argc > 1) search_string = argv[1]; // Create a gSOAP context struct soap *soap = soap_new(); // Create an object to find a business uddi2__find_USCOREbusiness fb(soap, search_string); // Send the request uddi2__businessList *bl = fb.send("http://uddi.xmethods.net/inquire"); // Check if result is OK if (!bl) soap_print_fault(soap, stderr); // If OK, report the business name(s) and unique identification keys else if (bl->businessInfos) { std::cout << "Search results on " << search_string << ":" << std::endl << std::endl; for (std::vector::const_iterator bi = bl->businessInfos->businessInfo.begin(); bi != bl->businessInfos->businessInfo.end(); ++bi) { // Report businessKey std::cout << "businessKey=" << (*bi)->businessKey << std::endl; // Report names for (std::vector::const_iterator n = (*bi)->name.begin(); n != (*bi)->name.end(); ++n) std::cout << "name=" << (*n)->__item << std::endl; std::cout << std::endl; } } // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } @endcode To compile: - wsdl2h -tuddi2-typemap.dat inquire_v2.wsdl - soapcpp2 -I.. -pinq inquire_v2.h - g++ -DWITH_NONAMESPACES -I.. -o example2 example2.cpp inquire_v2.cpp inqC.cpp inqClient.cpp ../stdsoap2.cpp */ /** @page example3 Code Example 3: Publishing a WSDL and service on XMethods This example shows you how to publish a Web service. In this case, the example template code obtains an authorization token, saves the tModel with the WSDL URL in the server, and saves the business service information in the server. @code #include "pubH.h" const char *server = "https://uddi.xmethods.net/publish"; const char *userid = "..."; // user ID to access UDDI server const char *passwd = "..."; // password to access UDDI server int main(int argc, char **argv) { // Create a gSOAP context struct soap *soap = soap_new(); // Setup SSL context (optional) to verify server's credentials if (soap_ssl_client_context(soap, SOAP_SSL_DEFAULT, NULL, NULL, "cacerts.pem", NULL, NULL)) { soap_print_fault(soap, stderr); exit(1); } // Step 1: Get an authorization token from the UDDI server uddi2__get_USCOREauthToken get_authToken(soap, userid, passwd); uddi2__authToken *authToken = get_authToken.send(server); // Check if authorized if (!authToken) { soap_print_fault(soap, stderr); exit(1); } // Authorization info provided by server for this session char *authInfo = authToken->authInfo; // Step 2: Create a tModel for the WSDL to be published uddi2__tModel tModel; tModel.soap_default(soap); // Create the tModel and service name tModel.name = soap_new_uddi2__name(soap, -1); tModel.name->__item = "..."; tModel.name->xml__lang_ = "en"; // Create XMethods description elements (see http://www.xmethods.net/ve2/UDDI.po) uddi2__description *description = soap_new_uddi2__description(soap, 6); description[0].__item = "SHORT DESCRIPTION: ..."; description[0].xml__lang_ = "en"; description[1].__item = "SHORT DESCRIPTION: ..."; description[1].xml__lang_ = "en"; description[2].__item = "USAGE NOTES: ..."; description[2].xml__lang_ = "en"; description[3].__item = "HOMEPAGE URL: ..."; description[3].xml__lang_ = "en"; description[4].__item = "CONTACT EMAIL: ..."; description[4].xml__lang_ = "en"; description[5].__item = "IMPLEMENTATION: ..."; description[5].xml__lang_ = "en"; // Add the four description elements to the tModel tModel.description.push_back(description + 0); tModel.description.push_back(description + 1); tModel.description.push_back(description + 2); tModel.description.push_back(description + 4); // Add an overviewDoc element with description and overviewURL tModel.overviewDoc = soap_new_uddi2__overviewDoc(soap, -1); tModel.overviewDoc->soap_default(soap); tModel.overviewDoc->description.push_back(soap_new_uddi2__description(soap, -1)); tModel.overviewDoc->description[0]->__item = "WSDL source document"; tModel.overviewDoc->description[0]->xml__lang_ = "en"; tModel.overviewDoc->overviewURL = "http://.../my.wsdl#bindingName"; // Omit identifier bag tModel.identifierBag = NULL; // Add a category with a WSDL-specific keyedReference tModel.categoryBag = soap_new_uddi2__categoryBag(soap, -1); tModel.categoryBag->soap_default(soap); tModel.categoryBag->keyedReference.push_back(soap_new_uddi2__keyedReference(soap, -1)); tModel.categoryBag->keyedReference[0]->tModelKey = "..."; tModel.categoryBag->keyedReference[0]->keyName = "uddi-org:types"; tModel.categoryBag->keyedReference[0]->keyValue = "wsdlSpec"; tModel.authorizedName = "..."; tModel.operator_ = "..."; tModel.tModelKey = "..."; // Save the tModel uddi2__save_USCOREtModel save_tModel(soap, tModel); uddi2__tModelDetail *tModelDetail = save_tModel.send(server, authInfo); // Step 3: Create a new service to be published uddi2__businessService service; service.soap_default(soap); // Service name is the tModel name (XMethods) service.name.push_back(tModel.name); // Add two description elements to the service service.description.push_back(description + 4); service.description.push_back(description + 5); // Create binding template uddi2__bindingTemplate bindingTemplate; bindingTemplate.soap_default(soap); bindingTemplate.tModelInstanceDetails = soap_new_uddi2__tModelInstanceDetails(soap, -1); bindingTemplate.tModelInstanceDetails->tModelInstanceInfo.push_back(soap_new_uddi2__tModelInstanceInfo(soap, -1)); bindingTemplate.tModelInstanceDetails->tModelInstanceInfo[0]->instanceDetails = NULL; bindingTemplate.tModelInstanceDetails->tModelInstanceInfo[0]->tModelKey = tModel.tModelKey; bindingTemplate.accessPoint = soap_new_uddi2__accessPoint(soap, -1); bindingTemplate.accessPoint->__item = "..."; bindingTemplate.accessPoint->URLType = uddi2__URLType__http; bindingTemplate.hostingRedirector = NULL; bindingTemplate.serviceKey = "..."; bindingTemplate.bindingKey = "..."; // Add binding Template to service service.bindingTemplates = soap_new_uddi2__bindingTemplates(soap, -1); service.bindingTemplates->soap_default(soap); service.bindingTemplates->bindingTemplate.push_back(&bindingTemplate); service.categoryBag = NULL; service.serviceKey = "..."; service.businessKey = "..."; // Save the service uddi2__save_USCOREservice save_service(soap, service); uddi2__serviceDetail *serviceDetail = save_service.send(server, authInfo); // Step 4: Discard authorization token uddi2__discard_USCOREauthToken discard_authToken(soap, authInfo); uddi2__dispositionReport *dispositionReport = discard_authToken.send(server); // Remove deserialized objects soap_destroy(soap); // Remove temporary data soap_end(soap); // Detach and free context soap_done(soap); free(soap); return 0; } @endcode To compile: - wsdl2h -tuddi2-typemap.dat publish_v2.wsdl - soapcpp2 -I.. -ppub publish_v2.h - g++ -DWITH_OPENSSL -DWITH_NONAMESPACES -I.. -o example3 example3.cpp publish_v2.cpp pubC.cpp pubClient.cpp ../stdsoap2.cpp */ /* inquire_v2.h Generated by wsdl2h 1.2.0 from inquire_v2.wsdl and uddi2-typemap.dat 2005-04-24 00:29:41 GMT Copyright (C) 2001-2005 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 wsdl2h option -l to view the software license terms. - Use wsdl2h options -c and -s to generate pure C code or C++ code without STL. - To build with STL, stlvector.h from the gSOAP distribution must be in the current directory. Or use soapcpp2 option -I with path to stlvector.h. - Use typemap.dat to control schema 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. */ /******************************************************************************\ * * * urn:uddi-org:inquiry_v2 * * * \******************************************************************************/ /* WSDL Documentation: Copyright (c) 2000 - 2002 by Accenture, Ariba, Inc., Commerce One, Inc. Fujitsu Limited, Hewlett-Packard Company, i2 Technologies, Inc., Intel Corporation, International Business Machines Corporation, Microsoft Corporation, Oracle Corporation, SAP AG, Sun Microsystems, Inc., and VeriSign, Inc. All Rights Reserved. WSDL Service Interface for UDDI Inquiry API V2.0 This WSDL document defines the inquiry API calls for interacting with the UDDI registry. The complete UDDI API specification is available at http://www.uddi.org/specification.html. */ //gsoapopt w #import "stlvector.h" /******************************************************************************\ * * * 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: inq2 = "urn:uddi-org:inquiry_v2" uddi2 = urn:uddi-org:api_v2 */ //gsoap inq2 schema namespace: urn:uddi-org:inquiry_v2 //gsoap uddi2 schema namespace: urn:uddi-org:api_v2 //gsoap inq2 schema form: unqualified //gsoap uddi2 schema elementForm: qualified //gsoap uddi2 schema attributeForm: unqualified /******************************************************************************\ * * * Schema Types * * * \******************************************************************************/ /// Primitive built-in type "xs:NMTOKEN" typedef char* xsd__NMTOKEN; /// Built-in attribute "xml:lang" typedef char* xml__lang; class uddi2__accessPoint; class uddi2__address; class uddi2__addressLine; class uddi2__assertionStatusItem; class uddi2__bindingTemplate; class uddi2__bindingTemplates; class uddi2__businessEntity; class uddi2__businessEntityExt; class uddi2__businessInfo; class uddi2__businessInfos; class uddi2__businessService; class uddi2__businessServices; class uddi2__categoryBag; class uddi2__contact; class uddi2__contacts; class uddi2__description; class uddi2__discoveryURL; class uddi2__discoveryURLs; class uddi2__dispositionReport; class uddi2__email; class uddi2__errInfo; class uddi2__findQualifiers; class uddi2__hostingRedirector; class uddi2__identifierBag; class uddi2__instanceDetails; class uddi2__keyedReference; class uddi2__keysOwned; class uddi2__name; class uddi2__overviewDoc; class uddi2__phone; class uddi2__publisherAssertion; class uddi2__relatedBusinessInfo; class uddi2__relatedBusinessInfos; class uddi2__result; class uddi2__serviceInfo; class uddi2__serviceInfos; class uddi2__sharedRelationships; class uddi2__tModel; class uddi2__tModelBag; class uddi2__tModelInfo; class uddi2__tModelInfos; class uddi2__tModelInstanceDetails; class uddi2__tModelInstanceInfo; class uddi2__add_USCOREpublisherAssertions; class uddi2__delete_USCOREbinding; class uddi2__delete_USCOREbusiness; class uddi2__delete_USCOREpublisherAssertions; class uddi2__delete_USCOREservice; class uddi2__delete_USCOREtModel; class uddi2__discard_USCOREauthToken; class uddi2__find_USCOREbinding; class uddi2__find_USCOREbusiness; class uddi2__find_USCORErelatedBusinesses; class uddi2__find_USCOREservice; class uddi2__find_USCOREtModel; class uddi2__get_USCOREassertionStatusReport; class uddi2__get_USCOREauthToken; class uddi2__get_USCOREbindingDetail; class uddi2__get_USCOREbusinessDetail; class uddi2__get_USCOREbusinessDetailExt; class uddi2__get_USCOREpublisherAssertions; class uddi2__get_USCOREregisteredInfo; class uddi2__get_USCOREserviceDetail; class uddi2__get_USCOREtModelDetail; class uddi2__save_USCOREbinding; class uddi2__save_USCOREbusiness; class uddi2__save_USCOREservice; class uddi2__save_USCOREtModel; class uddi2__set_USCOREpublisherAssertions; class uddi2__validate_USCOREvalues; class uddi2__assertionStatusReport; class uddi2__authToken; class uddi2__bindingDetail; class uddi2__businessDetail; class uddi2__businessDetailExt; class uddi2__businessList; class uddi2__publisherAssertions; class uddi2__registeredInfo; class uddi2__relatedBusinessesList; class uddi2__serviceDetail; class uddi2__serviceList; class uddi2__tModelDetail; class uddi2__tModelList; /// Schema "urn:uddi-org:api_v2":bindingKey simpleType restriction of xs:string typedef char* uddi2__bindingKey; /// Schema "urn:uddi-org:api_v2":businessKey simpleType restriction of xs:string typedef char* uddi2__businessKey; /// Schema "urn:uddi-org:api_v2":serviceKey simpleType restriction of xs:string typedef char* uddi2__serviceKey; /// Schema "urn:uddi-org:api_v2":tModelKey simpleType restriction of xs:string typedef char* uddi2__tModelKey; /// Schema "urn:uddi-org:api_v2":direction simpleType restriction of xs:NMTOKEN /// Note: enum values are prefixed with 'uddi2__direction' to avoid name clashes, please use wsdl2h option -e to omit this prefix enum uddi2__direction { uddi2__direction__fromKey, ///< xs:NMTOKEN value="fromKey" uddi2__direction__toKey, ///< xs:NMTOKEN value="toKey" }; /// Schema "urn:uddi-org:api_v2":truncated simpleType restriction of xs:NMTOKEN /// Note: enum values are prefixed with 'uddi2__truncated' to avoid name clashes, please use wsdl2h option -e to omit this prefix enum uddi2__truncated { uddi2__truncated__true_, ///< xs:NMTOKEN value="true" uddi2__truncated__false_, ///< xs:NMTOKEN value="false" }; /// Schema "urn:uddi-org:api_v2":URLType simpleType restriction of xs:NMTOKEN /// Note: enum values are prefixed with 'uddi2__URLType' to avoid name clashes, please use wsdl2h option -e to omit this prefix enum uddi2__URLType { uddi2__URLType__mailto, ///< xs:NMTOKEN value="mailto" uddi2__URLType__http, ///< xs:NMTOKEN value="http" uddi2__URLType__https, ///< xs:NMTOKEN value="https" uddi2__URLType__ftp, ///< xs:NMTOKEN value="ftp" uddi2__URLType__fax, ///< xs:NMTOKEN value="fax" uddi2__URLType__phone, ///< xs:NMTOKEN value="phone" uddi2__URLType__other, ///< xs:NMTOKEN value="other" }; /// Schema "urn:uddi-org:api_v2":keyType simpleType restriction of xs:NMTOKEN /// Note: enum values are prefixed with 'uddi2__keyType' to avoid name clashes, please use wsdl2h option -e to omit this prefix enum uddi2__keyType { uddi2__keyType__businessKey, ///< xs:NMTOKEN value="businessKey" uddi2__keyType__tModelKey, ///< xs:NMTOKEN value="tModelKey" uddi2__keyType__serviceKey, ///< xs:NMTOKEN value="serviceKey" uddi2__keyType__bindingKey, ///< xs:NMTOKEN value="bindingKey" }; /// Schema urn:uddi-org:api_v2:"address" class uddi2__address { public: /// Vector of uddi2__addressLine* with length 0..unbounded std::vector addressLine 0; /// Attribute useType of type xs:string @char* useType 0; ///< Optional attribute /// Attribute sortCode of type xs:string @char* sortCode 0; ///< Optional attribute /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"assertionStatusItem" class uddi2__assertionStatusItem { public: /// Element reference "urn:uddi-org:api_v2":fromKey uddi2__businessKey fromKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":toKey uddi2__businessKey toKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":keyedReference uddi2__keyedReference* keyedReference 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":keysOwned uddi2__keysOwned* keysOwned 1; ///< Required element /// Attribute completionStatus of type xs:string @char* completionStatus 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"bindingTemplate" class uddi2__bindingTemplate { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":tModelInstanceDetails uddi2__tModelInstanceDetails* tModelInstanceDetails 1; ///< Required element // CHOICE OF ELEMENTS: /// Element reference "urn:uddi-org:api_v2":accessPoint uddi2__accessPoint* accessPoint 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":hostingRedirector uddi2__hostingRedirector* hostingRedirector 1; ///< Required element // END CHOICE /// Attribute serviceKey of type "urn:uddi-org:api_v2":serviceKey @uddi2__serviceKey serviceKey 0; ///< Optional attribute /// Attribute bindingKey of type "urn:uddi-org:api_v2":bindingKey @uddi2__bindingKey bindingKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"bindingTemplates" class uddi2__bindingTemplates { public: /// Vector of uddi2__bindingTemplate* with length 0..unbounded std::vector bindingTemplate 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessEntity" class uddi2__businessEntity { public: /// Element reference "urn:uddi-org:api_v2":discoveryURLs uddi2__discoveryURLs* discoveryURLs 0; ///< Optional element /// Vector of uddi2__name* with length 0..unbounded std::vector name 1; /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":contacts uddi2__contacts* contacts 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":businessServices uddi2__businessServices* businessServices 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":identifierBag uddi2__identifierBag* identifierBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 0; ///< Optional attribute /// Attribute authorizedName of type xs:string @char* authorizedName 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessEntityExt" class uddi2__businessEntityExt { public: /// Element reference "urn:uddi-org:api_v2":businessEntity uddi2__businessEntity* businessEntity 1; ///< Required element // TODO: // Schema extensibility is user-definable // Consult the protocol documentation to insert declarations here: _XML __any ; ///< Catch any element content in XML string /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessInfo" class uddi2__businessInfo { public: /// Vector of uddi2__name* with length 0..unbounded std::vector name 1; /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":serviceInfos uddi2__serviceInfos* serviceInfos 1; ///< Required element /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessInfos" class uddi2__businessInfos { public: /// Vector of uddi2__businessInfo* with length 0..unbounded std::vector businessInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessService" class uddi2__businessService { public: /// Vector of uddi2__name* with length 0..unbounded std::vector name 0; /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":bindingTemplates uddi2__bindingTemplates* bindingTemplates 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Attribute serviceKey of type "urn:uddi-org:api_v2":serviceKey @uddi2__serviceKey serviceKey 1; ///< Required attribute /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessServices" class uddi2__businessServices { public: /// Vector of uddi2__businessService* with length 0..unbounded std::vector businessService 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"categoryBag" class uddi2__categoryBag { public: /// Vector of uddi2__keyedReference* with length 0..unbounded std::vector keyedReference 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"contact" class uddi2__contact { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":personName char* personName 1; ///< Required element /// Vector of uddi2__phone* with length 0..unbounded std::vector phone 0; /// Vector of uddi2__email* with length 0..unbounded std::vector email 0; /// Vector of uddi2__address* with length 0..unbounded std::vector address 0; /// Attribute useType of type xs:string @char* useType 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"contacts" class uddi2__contacts { public: /// Vector of uddi2__contact* with length 0..unbounded std::vector contact 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"discoveryURLs" class uddi2__discoveryURLs { public: /// Vector of uddi2__discoveryURL* with length 0..unbounded std::vector discoveryURL 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"dispositionReport" class uddi2__dispositionReport { public: /// Vector of uddi2__result* with length 0..unbounded std::vector result 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"findQualifiers" class uddi2__findQualifiers { public: /// Vector of char* with length 0..unbounded std::vector findQualifier 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"hostingRedirector" class uddi2__hostingRedirector { public: /// Attribute bindingKey of type "urn:uddi-org:api_v2":bindingKey @uddi2__bindingKey bindingKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"identifierBag" class uddi2__identifierBag { public: /// Vector of uddi2__keyedReference* with length 0..unbounded std::vector keyedReference 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"instanceDetails" class uddi2__instanceDetails { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":overviewDoc uddi2__overviewDoc* overviewDoc 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":instanceParms char* instanceParms 0; ///< Optional element /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"keyedReference" class uddi2__keyedReference { public: /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 0; ///< Optional attribute /// Attribute keyName of type xs:string @char* keyName 0; ///< Optional attribute /// Attribute keyValue of type xs:string @char* keyValue 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"keysOwned" class uddi2__keysOwned { public: /// Element reference "urn:uddi-org:api_v2":fromKey uddi2__businessKey fromKey 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":toKey uddi2__businessKey toKey 0; ///< Optional element /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"overviewDoc" class uddi2__overviewDoc { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":overviewURL char* overviewURL 0; ///< Optional element /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"publisherAssertion" class uddi2__publisherAssertion { public: /// Element reference "urn:uddi-org:api_v2":fromKey uddi2__businessKey fromKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":toKey uddi2__businessKey toKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":keyedReference uddi2__keyedReference* keyedReference 1; ///< Required element /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"relatedBusinessInfo" class uddi2__relatedBusinessInfo { public: /// Element reference "urn:uddi-org:api_v2":businessKey uddi2__businessKey businessKey 1; ///< Required element /// Vector of uddi2__name* with length 0..unbounded std::vector name 1; /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Vector of uddi2__sharedRelationships* with length 0..2 std::vector sharedRelationships 1:2; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"relatedBusinessInfos" class uddi2__relatedBusinessInfos { public: /// Vector of uddi2__relatedBusinessInfo* with length 0..unbounded std::vector relatedBusinessInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"result" class uddi2__result { public: /// Element reference "urn:uddi-org:api_v2":errInfo uddi2__errInfo* errInfo 0; ///< Optional element /// Attribute keyType of type "urn:uddi-org:api_v2":keyType @enum uddi2__keyType* keyType 0; ///< Optional attribute /// Attribute errno of type xs:int @int errno_ 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"serviceInfo" class uddi2__serviceInfo { public: /// Vector of uddi2__name* with length 0..unbounded std::vector name 0; /// Attribute serviceKey of type "urn:uddi-org:api_v2":serviceKey @uddi2__serviceKey serviceKey 1; ///< Required attribute /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"serviceInfos" class uddi2__serviceInfos { public: /// Vector of uddi2__serviceInfo* with length 0..unbounded std::vector serviceInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"sharedRelationships" class uddi2__sharedRelationships { public: /// Vector of uddi2__keyedReference* with length 0..unbounded std::vector keyedReference 1; /// Attribute direction of type "urn:uddi-org:api_v2":direction @enum uddi2__direction direction 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModel" class uddi2__tModel { public: /// Element reference "urn:uddi-org:api_v2":name uddi2__name* name 1; ///< Required element /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":overviewDoc uddi2__overviewDoc* overviewDoc 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":identifierBag uddi2__identifierBag* identifierBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 0; ///< Optional attribute /// Attribute authorizedName of type xs:string @char* authorizedName 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelBag" class uddi2__tModelBag { public: /// Vector of uddi2__tModelKey with length 0..unbounded std::vector tModelKey 1; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelInfo" class uddi2__tModelInfo { public: /// Element reference "urn:uddi-org:api_v2":name uddi2__name* name 1; ///< Required element /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelInfos" class uddi2__tModelInfos { public: /// Vector of uddi2__tModelInfo* with length 0..unbounded std::vector tModelInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelInstanceDetails" class uddi2__tModelInstanceDetails { public: /// Vector of uddi2__tModelInstanceInfo* with length 0..unbounded std::vector tModelInstanceInfo 0; /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelInstanceInfo" class uddi2__tModelInstanceInfo { public: /// Vector of uddi2__description* with length 0..unbounded std::vector description 0; /// Element reference "urn:uddi-org:api_v2":instanceDetails uddi2__instanceDetails* instanceDetails 0; ///< Optional element /// Attribute tModelKey of type "urn:uddi-org:api_v2":tModelKey @uddi2__tModelKey tModelKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"add_publisherAssertions" class uddi2__add_USCOREpublisherAssertions { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__publisherAssertion* with length 0..unbounded std::vector publisherAssertion 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__add_USCOREpublisherAssertions(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__add_USCOREpublisherAssertions(struct soap*, std::vector publisherAssertions); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_binding" class uddi2__delete_USCOREbinding { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__bindingKey with length 0..unbounded std::vector bindingKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbinding(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbinding(struct soap*, const char *bindingKey); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbinding(struct soap*, std::vector bindingKeys); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_business" class uddi2__delete_USCOREbusiness { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__businessKey with length 0..unbounded std::vector businessKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbusiness(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbusiness(struct soap*, const char *businessKey); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREbusiness(struct soap*, std::vector businessKeys); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_publisherAssertions" class uddi2__delete_USCOREpublisherAssertions { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__publisherAssertion* with length 0..unbounded std::vector publisherAssertion 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREpublisherAssertions(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREpublisherAssertions(struct soap*, std::vector publisherAssertions); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_service" class uddi2__delete_USCOREservice { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__serviceKey with length 0..unbounded std::vector serviceKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREservice(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREservice(struct soap*, const char *serviceKey); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREservice(struct soap*, std::vector serviceKeys); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"delete_tModel" class uddi2__delete_USCOREtModel { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__tModelKey with length 0..unbounded std::vector tModelKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREtModel(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREtModel(struct soap*, const char *tModelKey); /// Member declared in uddi2-typemap.dat uddi2__delete_USCOREtModel(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"discard_authToken" class uddi2__discard_USCOREauthToken { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__discard_USCOREauthToken(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__discard_USCOREauthToken(struct soap*, const char *authInfo); /// Member declared in uddi2-typemap.dat uddi2__dispositionReport* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_binding" class uddi2__find_USCOREbinding { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":tModelBag uddi2__tModelBag* tModelBag 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// Attribute serviceKey of type "urn:uddi-org:api_v2":serviceKey @uddi2__serviceKey serviceKey 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbinding(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbinding(struct soap*, const char *tModelKey); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbinding(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__bindingDetail *send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_business" class uddi2__find_USCOREbusiness { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Vector of uddi2__name* with length 0..unbounded std::vector name 0; /// Element reference "urn:uddi-org:api_v2":identifierBag uddi2__identifierBag* identifierBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":tModelBag uddi2__tModelBag* tModelBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":discoveryURLs uddi2__discoveryURLs* discoveryURLs 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbusiness(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbusiness(struct soap*, const char *name); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbusiness(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREbusiness(struct soap*, std::vector keyedReferences); /// Member declared in uddi2-typemap.dat uddi2__businessList *send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_relatedBusinesses" class uddi2__find_USCORErelatedBusinesses { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":businessKey uddi2__businessKey businessKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":keyedReference uddi2__keyedReference* keyedReference 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCORErelatedBusinesses(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCORErelatedBusinesses(struct soap*, const char *businessKey); /// Member declared in uddi2-typemap.dat uddi2__relatedBusinessesList *send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_service" class uddi2__find_USCOREservice { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Vector of uddi2__name* with length 0..unbounded std::vector name 0; /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":tModelBag uddi2__tModelBag* tModelBag 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// Attribute businessKey of type "urn:uddi-org:api_v2":businessKey @uddi2__businessKey businessKey 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCOREservice(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREservice(struct soap*, const char *name); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREservice(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREservice(struct soap*, std::vector keyedReferences); /// Member declared in uddi2-typemap.dat uddi2__serviceList* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"find_tModel" class uddi2__find_USCOREtModel { public: /// Element reference "urn:uddi-org:api_v2":findQualifiers uddi2__findQualifiers* findQualifiers 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":name uddi2__name* name 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":identifierBag uddi2__identifierBag* identifierBag 0; ///< Optional element /// Element reference "urn:uddi-org:api_v2":categoryBag uddi2__categoryBag* categoryBag 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute maxRows of type xs:int @int* maxRows 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__find_USCOREtModel(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREtModel(struct soap*, const char *name); /// Member declared in uddi2-typemap.dat uddi2__find_USCOREtModel(struct soap*, std::vector keyedReferences); /// Member declared in uddi2-typemap.dat uddi2__tModelList* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_assertionStatusReport" class uddi2__get_USCOREassertionStatusReport { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":completionStatus char* completionStatus 0; ///< Optional element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREassertionStatusReport(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREassertionStatusReport(struct soap*, const char *completionStatus); /// Member declared in uddi2-typemap.dat uddi2__assertionStatusReport* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"get_authToken" class uddi2__get_USCOREauthToken { public: /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute userID of type xs:string @char* userID 1; ///< Required attribute /// Attribute cred of type xs:string @char* cred 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREauthToken(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREauthToken(struct soap*, const char *userid, const char *passwd); /// Member declared in uddi2-typemap.dat uddi2__authToken* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_bindingDetail" class uddi2__get_USCOREbindingDetail { public: /// Vector of uddi2__bindingKey with length 0..unbounded std::vector bindingKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbindingDetail(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbindingDetail(struct soap*, const char *bindingKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbindingDetail(struct soap*, std::vector bindingKeys); /// Member declared in uddi2-typemap.dat uddi2__bindingDetail* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_businessDetail" class uddi2__get_USCOREbusinessDetail { public: /// Vector of uddi2__businessKey with length 0..unbounded std::vector businessKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetail(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetail(struct soap*, const char *businessKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetail(struct soap*, std::vector businessKeys); /// Member declared in uddi2-typemap.dat uddi2__businessDetail* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_businessDetailExt" class uddi2__get_USCOREbusinessDetailExt { public: /// Vector of uddi2__businessKey with length 0..unbounded std::vector businessKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetailExt(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetailExt(struct soap*, const char *businessKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREbusinessDetailExt(struct soap*, std::vector businessKeys); /// Member declared in uddi2-typemap.dat uddi2__businessDetailExt* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_publisherAssertions" class uddi2__get_USCOREpublisherAssertions { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREpublisherAssertions(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__publisherAssertions* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"get_registeredInfo" class uddi2__get_USCOREregisteredInfo { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREregisteredInfo(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__registeredInfo* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"get_serviceDetail" class uddi2__get_USCOREserviceDetail { public: /// Vector of uddi2__serviceKey with length 0..unbounded std::vector serviceKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREserviceDetail(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREserviceDetail(struct soap*, const char *serviceKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREserviceDetail(struct soap*, std::vector serviceKeys); /// Member declared in uddi2-typemap.dat uddi2__serviceDetail* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"get_tModelDetail" class uddi2__get_USCOREtModelDetail { public: /// Vector of uddi2__tModelKey with length 0..unbounded std::vector tModelKey 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__get_USCOREtModelDetail(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREtModelDetail(struct soap*, const char *tModelKey); /// Member declared in uddi2-typemap.dat uddi2__get_USCOREtModelDetail(struct soap*, std::vector tModelKeys); /// Member declared in uddi2-typemap.dat uddi2__tModelDetail* send(const char *endpoint); }; /// Schema urn:uddi-org:api_v2:"save_binding" class uddi2__save_USCOREbinding { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__bindingTemplate* with length 0..unbounded std::vector bindingTemplate 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbinding(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbinding(struct soap*, uddi2__bindingTemplate &bindingTemplate); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbinding(struct soap*, std::vector bindingTemplates); /// Member declared in uddi2-typemap.dat uddi2__bindingDetail* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"save_business" class uddi2__save_USCOREbusiness { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__businessEntity* with length 0..unbounded std::vector businessEntity 0; /// Vector of char* with length 0..unbounded std::vector uploadRegister 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbusiness(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbusiness(struct soap*, uddi2__businessEntity &businessEntity); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREbusiness(struct soap*, std::vector businessEntities); /// Member declared in uddi2-typemap.dat uddi2__businessDetail* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"save_service" class uddi2__save_USCOREservice { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__businessService* with length 0..unbounded std::vector businessService 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__save_USCOREservice(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREservice(struct soap*, uddi2__businessService &businessService); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREservice(struct soap*, std::vector businessServices); /// Member declared in uddi2-typemap.dat uddi2__serviceDetail* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"save_tModel" class uddi2__save_USCOREtModel { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__tModel* with length 0..unbounded std::vector tModel 0; /// Vector of char* with length 0..unbounded std::vector uploadRegister 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__save_USCOREtModel(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREtModel(struct soap*, uddi2__tModel &tModel); /// Member declared in uddi2-typemap.dat uddi2__save_USCOREtModel(struct soap*, std::vector tModels); /// Member declared in uddi2-typemap.dat uddi2__tModelDetail* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"set_publisherAssertions" class uddi2__set_USCOREpublisherAssertions { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Vector of uddi2__publisherAssertion* with length 0..unbounded std::vector publisherAssertion 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; /// Member declared in uddi2-typemap.dat uddi2__set_USCOREpublisherAssertions(struct soap*); /// Member declared in uddi2-typemap.dat uddi2__set_USCOREpublisherAssertions(struct soap*, std::vector publisherAssertions); /// Member declared in uddi2-typemap.dat uddi2__publisherAssertions* send(const char *endpoint, char *authInfo); }; /// Schema urn:uddi-org:api_v2:"validate_values" class uddi2__validate_USCOREvalues { public: // CHOICE OF ELEMENTS: /// Vector of uddi2__businessEntity* with length 0..unbounded std::vector businessEntity 0; /// Vector of uddi2__businessService* with length 0..unbounded std::vector businessService 0; /// Vector of uddi2__tModel* with length 0..unbounded std::vector tModel 0; // END CHOICE /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"assertionStatusReport" class uddi2__assertionStatusReport { public: /// Vector of uddi2__assertionStatusItem* with length 0..unbounded std::vector assertionStatusItem 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"authToken" class uddi2__authToken { public: /// Element reference "urn:uddi-org:api_v2":authInfo char* authInfo 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"bindingDetail" class uddi2__bindingDetail { public: /// Vector of uddi2__bindingTemplate* with length 0..unbounded std::vector bindingTemplate 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessDetail" class uddi2__businessDetail { public: /// Vector of uddi2__businessEntity* with length 0..unbounded std::vector businessEntity 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessDetailExt" class uddi2__businessDetailExt { public: /// Vector of uddi2__businessEntityExt* with length 0..unbounded std::vector businessEntityExt 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"businessList" class uddi2__businessList { public: /// Element reference "urn:uddi-org:api_v2":businessInfos uddi2__businessInfos* businessInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"publisherAssertions" class uddi2__publisherAssertions { public: /// Vector of uddi2__publisherAssertion* with length 0..unbounded std::vector publisherAssertion 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute authorizedName of type xs:string @char* authorizedName 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"registeredInfo" class uddi2__registeredInfo { public: /// Element reference "urn:uddi-org:api_v2":businessInfos uddi2__businessInfos* businessInfos 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":tModelInfos uddi2__tModelInfos* tModelInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"relatedBusinessesList" class uddi2__relatedBusinessesList { public: /// Element reference "urn:uddi-org:api_v2":businessKey uddi2__businessKey businessKey 1; ///< Required element /// Element reference "urn:uddi-org:api_v2":relatedBusinessInfos uddi2__relatedBusinessInfos* relatedBusinessInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"serviceDetail" class uddi2__serviceDetail { public: /// Vector of uddi2__businessService* with length 0..unbounded std::vector businessService 0; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"serviceList" class uddi2__serviceList { public: /// Element reference "urn:uddi-org:api_v2":serviceInfos uddi2__serviceInfos* serviceInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelDetail" class uddi2__tModelDetail { public: /// Vector of uddi2__tModel* with length 0..unbounded std::vector tModel 1; /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"tModelList" class uddi2__tModelList { public: /// Element reference "urn:uddi-org:api_v2":tModelInfos uddi2__tModelInfos* tModelInfos 1; ///< Required element /// Attribute generic of type xs:string @char* generic 1; ///< Required attribute /// Attribute operator of type xs:string @char* operator_ 1; ///< Required attribute /// Attribute truncated of type "urn:uddi-org:api_v2":truncated @enum uddi2__truncated* truncated 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"accessPoint" class uddi2__accessPoint { public: char* __item ; /// Attribute URLType of type "urn:uddi-org:api_v2":URLType @enum uddi2__URLType URLType 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"addressLine" class uddi2__addressLine { public: char* __item ; /// Attribute keyName of type xs:string @char* keyName 0; ///< Optional attribute /// Attribute keyValue of type xs:string @char* keyValue 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"description" class uddi2__description { public: char* __item ; /// Attribute reference xml:lang @xml__lang xml__lang_ 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"discoveryURL" class uddi2__discoveryURL { public: char* __item ; /// Attribute useType of type xs:string @char* useType 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"email" class uddi2__email { public: char* __item ; /// Attribute useType of type xs:string @char* useType 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"errInfo" class uddi2__errInfo { public: char* __item ; /// Attribute errCode of type xs:string @char* errCode 1; ///< Required attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"name" class uddi2__name { public: char* __item ; /// Attribute reference xml:lang @xml__lang xml__lang_ 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /// Schema urn:uddi-org:api_v2:"phone" class uddi2__phone { public: char* __item ; /// Attribute useType of type xs:string @char* useType 0; ///< Optional attribute /// A handle to the soap struct context that manages this class instance struct soap *soap ; }; /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap inq2 service name: InquireSoap //gsoap inq2 service type: Inquire //gsoap inq2 service namespace: urn:uddi-org:inquiry_v2 /** @mainpage UDDI_Inquiry_API_V2 Definitions @section UDDI_Inquiry_API_V2_documentation Documentation Copyright (c) 2000 - 2002 by Accenture, Ariba, Inc., Commerce One, Inc. Fujitsu Limited, Hewlett-Packard Company, i2 Technologies, Inc., Intel Corporation, International Business Machines Corporation, Microsoft Corporation, Oracle Corporation, SAP AG, Sun Microsystems, Inc., and VeriSign, Inc. All Rights Reserved. WSDL Service Interface for UDDI Inquiry API V2.0 This WSDL document defines the inquiry API calls for interacting with the UDDI registry. The complete UDDI API specification is available at http://www.uddi.org/specification.html. @section UDDI_Inquiry_API_V2_bindings Bindings - @ref InquireSoap */ /** @page InquireSoap Binding "InquireSoap" @section InquireSoap_operations Operations of Binding "InquireSoap" - @ref __inq2__find_USCOREbinding - @ref __inq2__find_USCOREbusiness - @ref __inq2__find_USCORErelatedBusinesses - @ref __inq2__find_USCOREservice - @ref __inq2__find_USCOREtModel - @ref __inq2__get_USCOREbindingDetail - @ref __inq2__get_USCOREbusinessDetail - @ref __inq2__get_USCOREbusinessDetailExt - @ref __inq2__get_USCOREserviceDetail - @ref __inq2__get_USCOREtModelDetail @section InquireSoap_ports Endpoints of Binding "InquireSoap" */ /******************************************************************************\ * * * SOAP Fault Detail * * * \******************************************************************************/ /// The SOAP Fault Detail element contains one of the following types serialized // in the __type and fault fields of the SOAP_ENV__Detail struct (see docs) class _dispositionReport { public: uddi2__dispositionReport* uddi2__dispositionReport_; struct soap *soap ; }; /******************************************************************************\ * * * InquireSoap * * * \******************************************************************************/ /******************************************************************************\ * * * __inq2__find_USCOREbinding * * * \******************************************************************************/ /// Operation "__inq2__find_USCOREbinding" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="find_binding" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__find_USCOREbinding(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: uddi2__find_USCOREbinding* uddi2__find_USCOREbinding_, // response parameters: uddi2__bindingDetail* uddi2__bindingDetail_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: find_USCOREbinding document //gsoap inq2 service method-encoding: find_USCOREbinding literal //gsoap inq2 service method-action: find_USCOREbinding find_binding //gsoap inq2 service method-fault: find_USCOREbinding _dispositionReport int __inq2__find_USCOREbinding( uddi2__find_USCOREbinding* uddi2__find_USCOREbinding_, uddi2__bindingDetail* uddi2__bindingDetail_ ///< response parameter ); /******************************************************************************\ * * * __inq2__find_USCOREbusiness * * * \******************************************************************************/ /// Operation "__inq2__find_USCOREbusiness" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="find_business" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__find_USCOREbusiness(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: uddi2__find_USCOREbusiness* uddi2__find_USCOREbusiness_, // response parameters: uddi2__businessList* uddi2__businessList_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: find_USCOREbusiness document //gsoap inq2 service method-encoding: find_USCOREbusiness literal //gsoap inq2 service method-action: find_USCOREbusiness find_business //gsoap inq2 service method-fault: find_USCOREbusiness _dispositionReport int __inq2__find_USCOREbusiness( uddi2__find_USCOREbusiness* uddi2__find_USCOREbusiness_, uddi2__businessList* uddi2__businessList_ ///< response parameter ); /******************************************************************************\ * * * __inq2__find_USCORErelatedBusinesses * * * \******************************************************************************/ /// Operation "__inq2__find_USCORErelatedBusinesses" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="find_relatedBusinesses" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__find_USCORErelatedBusinesses(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: uddi2__find_USCORErelatedBusinesses* uddi2__find_USCORErelatedBusinesses_, // response parameters: uddi2__relatedBusinessesList* uddi2__relatedBusinessesList_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: find_USCORErelatedBusinesses document //gsoap inq2 service method-encoding: find_USCORErelatedBusinesses literal //gsoap inq2 service method-action: find_USCORErelatedBusinesses find_relatedBusinesses //gsoap inq2 service method-fault: find_USCORErelatedBusinesses _dispositionReport int __inq2__find_USCORErelatedBusinesses( uddi2__find_USCORErelatedBusinesses* uddi2__find_USCORErelatedBusinesses_, uddi2__relatedBusinessesList* uddi2__relatedBusinessesList_ ///< response parameter ); /******************************************************************************\ * * * __inq2__find_USCOREservice * * * \******************************************************************************/ /// Operation "__inq2__find_USCOREservice" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="find_service" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__find_USCOREservice(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: uddi2__find_USCOREservice* uddi2__find_USCOREservice_, // response parameters: uddi2__serviceList* uddi2__serviceList_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: find_USCOREservice document //gsoap inq2 service method-encoding: find_USCOREservice literal //gsoap inq2 service method-action: find_USCOREservice find_service //gsoap inq2 service method-fault: find_USCOREservice _dispositionReport int __inq2__find_USCOREservice( uddi2__find_USCOREservice* uddi2__find_USCOREservice_, uddi2__serviceList* uddi2__serviceList_ ///< response parameter ); /******************************************************************************\ * * * __inq2__find_USCOREtModel * * * \******************************************************************************/ /// Operation "__inq2__find_USCOREtModel" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="find_tModel" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__find_USCOREtModel(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: uddi2__find_USCOREtModel* uddi2__find_USCOREtModel_, // response parameters: uddi2__tModelList* uddi2__tModelList_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: find_USCOREtModel document //gsoap inq2 service method-encoding: find_USCOREtModel literal //gsoap inq2 service method-action: find_USCOREtModel find_tModel //gsoap inq2 service method-fault: find_USCOREtModel _dispositionReport int __inq2__find_USCOREtModel( uddi2__find_USCOREtModel* uddi2__find_USCOREtModel_, uddi2__tModelList* uddi2__tModelList_ ///< response parameter ); /******************************************************************************\ * * * __inq2__get_USCOREbindingDetail * * * \******************************************************************************/ /// Operation "__inq2__get_USCOREbindingDetail" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_bindingDetail" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__get_USCOREbindingDetail(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: uddi2__get_USCOREbindingDetail* uddi2__get_USCOREbindingDetail_, // response parameters: uddi2__bindingDetail* uddi2__bindingDetail_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: get_USCOREbindingDetail document //gsoap inq2 service method-encoding: get_USCOREbindingDetail literal //gsoap inq2 service method-action: get_USCOREbindingDetail get_bindingDetail //gsoap inq2 service method-fault: get_USCOREbindingDetail _dispositionReport int __inq2__get_USCOREbindingDetail( uddi2__get_USCOREbindingDetail* uddi2__get_USCOREbindingDetail_, uddi2__bindingDetail* uddi2__bindingDetail_ ///< response parameter ); /******************************************************************************\ * * * __inq2__get_USCOREbusinessDetail * * * \******************************************************************************/ /// Operation "__inq2__get_USCOREbusinessDetail" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_businessDetail" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__get_USCOREbusinessDetail(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: uddi2__get_USCOREbusinessDetail* uddi2__get_USCOREbusinessDetail_, // response parameters: uddi2__businessDetail* uddi2__businessDetail_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: get_USCOREbusinessDetail document //gsoap inq2 service method-encoding: get_USCOREbusinessDetail literal //gsoap inq2 service method-action: get_USCOREbusinessDetail get_businessDetail //gsoap inq2 service method-fault: get_USCOREbusinessDetail _dispositionReport int __inq2__get_USCOREbusinessDetail( uddi2__get_USCOREbusinessDetail* uddi2__get_USCOREbusinessDetail_, uddi2__businessDetail* uddi2__businessDetail_ ///< response parameter ); /******************************************************************************\ * * * __inq2__get_USCOREbusinessDetailExt * * * \******************************************************************************/ /// Operation "__inq2__get_USCOREbusinessDetailExt" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_businessDetailExt" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__get_USCOREbusinessDetailExt(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: uddi2__get_USCOREbusinessDetailExt* uddi2__get_USCOREbusinessDetailExt_, // response parameters: uddi2__businessDetailExt* uddi2__businessDetailExt_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: get_USCOREbusinessDetailExt document //gsoap inq2 service method-encoding: get_USCOREbusinessDetailExt literal //gsoap inq2 service method-action: get_USCOREbusinessDetailExt get_businessDetailExt //gsoap inq2 service method-fault: get_USCOREbusinessDetailExt _dispositionReport int __inq2__get_USCOREbusinessDetailExt( uddi2__get_USCOREbusinessDetailExt* uddi2__get_USCOREbusinessDetailExt_, uddi2__businessDetailExt* uddi2__businessDetailExt_ ///< response parameter ); /******************************************************************************\ * * * __inq2__get_USCOREserviceDetail * * * \******************************************************************************/ /// Operation "__inq2__get_USCOREserviceDetail" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_serviceDetail" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__get_USCOREserviceDetail(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: uddi2__get_USCOREserviceDetail* uddi2__get_USCOREserviceDetail_, // response parameters: uddi2__serviceDetail* uddi2__serviceDetail_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: get_USCOREserviceDetail document //gsoap inq2 service method-encoding: get_USCOREserviceDetail literal //gsoap inq2 service method-action: get_USCOREserviceDetail get_serviceDetail //gsoap inq2 service method-fault: get_USCOREserviceDetail _dispositionReport int __inq2__get_USCOREserviceDetail( uddi2__get_USCOREserviceDetail* uddi2__get_USCOREserviceDetail_, uddi2__serviceDetail* uddi2__serviceDetail_ ///< response parameter ); /******************************************************************************\ * * * __inq2__get_USCOREtModelDetail * * * \******************************************************************************/ /// Operation "__inq2__get_USCOREtModelDetail" of service binding "InquireSoap" /** Operation details: - SOAP document/literal style - SOAP action="get_tModelDetail" - SOAP Fault: _dispositionReport C stub function (defined in soapClient.c[pp]): @code int soap_call___inq2__get_USCOREtModelDetail(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: uddi2__get_USCOREtModelDetail* uddi2__get_USCOREtModelDetail_, // response parameters: uddi2__tModelDetail* uddi2__tModelDetail_ ); @endcode C++ proxy class (defined in soapInquireSoapProxy.h): class InquireSoap; */ //gsoap inq2 service method-style: get_USCOREtModelDetail document //gsoap inq2 service method-encoding: get_USCOREtModelDetail literal //gsoap inq2 service method-action: get_USCOREtModelDetail get_tModelDetail //gsoap inq2 service method-fault: get_USCOREtModelDetail _dispositionReport int __inq2__get_USCOREtModelDetail( uddi2__get_USCOREtModelDetail* uddi2__get_USCOREtModelDetail_, uddi2__tModelDetail* uddi2__tModelDetail_ ///< response parameter ); /* End of inquire_v2.h */ gsoap-2.8.91/gsoap/typemap.dat0000644000175000017500000006322413525245163015563 0ustar ellertellert# typemap.dat # Use this file to define XML namespace prefixes and type bindings for # interface header files generated by the wsdl2h tool. # # This typemap.dat file is the default file used by wsdl2h to customize # its output. You can use wsdl2h option -t to specify an alternate file. ####### XML NAMESPACE BINDINGS # You can define XML namespace prefix bindings to override the default # choice of the ns1, ns2, ... prefixes generated by wsdl2h. It is highly # recommended to provide namespace prefixes for your project's XML # namespaces. In this way, changes to the WSDL (or newer releases of # wsdl2h) will have a minimal impact on coding and project maintenance. # # Bindings for namespace prefixes are of the form: # # prefix = "URI" # # For example, to bind prefix s3 to the AWS S3 namespace: # # s3 = "http://s3.amazonaws.com/doc/2006-03-01/" ####### XSD TYPE BINDINGS # Type bindings can be provided to bind XML schema types to C/C++ # types for your project. # # Type bindings are of the form: # # prefix__type = declaration | use | ptr-use # # where 'prefix__type' is the C/C++-translation of the schema type, # 'declaration' introduces the type in the header file, the optional # 'use' specifies how the type is used directly, and the optional # 'ptr-use' specifies how the type is used as a pointer type. # # For example, to use wide strings in C: # # xsd__string = | wchar_t* | wchar_t* # # this replaces the default char* mapping in C for xsd:string. # To use C++ std::wstring for xsd:string: # # xsd__string = | std::wstring # # After enabling one of these lines, all XSD strings will be changed in # the interface file generated by wsdl2h. Rerun wsdl2h if necessary. # Note that the 'declaration' part above is empta,y as expected. # # When a type binding requires only the usage to be changed and the # declaration part must be kept intact, then the declaration part should # be specified as an elipsis '...': # # prefix__type = ... | use | ptr-use # # This ensure that the wsdl2h-generated type definition is preserved, # while the use and ptr-use are changed. ####### CLASS/STRUCT MEMBER ADDITIONS # Additional data and function members can be provided to extend a # wsdl2h-generated struct or class. # # Class and struct extensions are of the form: # # prefix__type = $ member-declaration # # For example, to add a constructor and destructor to class myns__record: # # myns__record = $ myns__record(); # myns__record = $ ~myns__record(); ####### TYPE EQUIVALENCES # Type equivalence mappings can be given to replace a type with another: # # prefix__type1 == prefix__type2 # # This replaces 'prefix__type1' by 'prefix__type2' in the wsdl2h output. # # For example: # # SOAP_ENC__boolean == xsd__boolean # # replaces 'SOAP_ENC__boolean' with the C/C++ type information that # corresponds to `xsd__boolean' which is 'bool' for C++. # # Target C/C++ type names (names without prefix) can also be replaced: # # float == double # # which replaces all 'float' with 'double' in the wsdl2h output. Beware # that replacing types may lead to xsi:type mismatches and SOAP # encoding id-ref mismatches when parsing inbound XML messages. However, # this is not a problem when using XML instead of SOAP and when mapping # schema root elements to their types, for example the WCF serialization # root element remappings defined further below. ####### BUILT-IN VARIABLES # The variable '$CONTAINER' defines the container to emit in the # generated declarations, which is std::vector by default. For example, # to change containers to std::list: # # $CONTAINER = std::list # # To remove containers, use wsdl2h option -s (removes std::string also, # you can re-introduce std::string with xsd__string = | std::string). # # The variable '$POINTER' defines the smart pointer to emit in the # generated declarations, replacing '*'. For example: # # $POINTER = std::shared_ptr # # Not all pointers in the generated output are replaced by smart # pointers by wsdl2h, such as pointers as union members and pointers # as struct/class members that point to arrays of values. # # The variable '$SIZE' defines the type of array sizes, which is int by # default. For example, to change array size types to size_t: # # $SIZE = size_t # # Permissible types are int and size_t. This variable does not affect # the size of SOAP-encoded arrays, xsd__hexBinary and xsd__base64Binary # types, which is always int. ####### USER-DEFINED CONTENT # Any other content to be included in the generated header file can be # provided by enclosing it within brackets [ and ]. These brackets MUST # appear at the start of a new line. # # For example, to add an #import directive to the wsdl2h-generated output: # # [ # #import "wsa5.h" # ] #------------------------------------------------------------------------------- #gSOAP XML Web services tools #Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. #This software is released under one of the following two licenses: #GPL or Genivia's license for commercial use. #------------------------------------------------------------------------------- #A commercial use license is available from Genivia, Inc., contact@genivia.com #------------------------------------------------------------------------------- [ // Reminder: Modify typemap.dat to customize the header file generated by wsdl2h ] # Remember: type bindings are given on a single line (use \ to continue # with the next line). Here is an example binding for the XSD int type # that maps to an 'int': # xsd__int = | int # To use regular char* strings instead of std::string, use: # xsd__string = | char* | char* # For char* serialized with xsi:type when using soapcpp2 option -t, use: # xsd__string = typedef char *xsd__string; | xsd__string | xsd__string # The following mapping is internally applied by wsdl2h for C (not C++): # (assuming option -e is used to remove the xsd__boolean__ name prefix) # xsd__boolean = enum xsd__boolean { false_, true_ }; | enum xsd__boolean # Uncomment the line below to use __int128_t for xsd:integer instead of # mapping xsd:integer to string. # Then rerun wsdl2h and also compile and link custom/int128.c # xsd__integer = #import "custom/int128.h" | xsd__integer # # Or if the xsd:integer value range is bounded to int64_t, then: # xsd__integer = typedef LONG64 xsd__integer; # # Also, to enable XSD integer types that are restrictions of xsd:integer # to be mapped to int128 or LONG64, uncomment: # xsd__nonNegativeInteger = typedef xsd__integer xsd__nonNegativeInteger 0 : ; # xsd__nonPositiveInteger = typedef xsd__integer xsd__nonPositiveInteger : 0 ; # xsd__positiveInteger = typedef xsd__integer xsd__positiveInteger 1 : ; # xsd__negativeInteger = typedef xsd__integer xsd__negativeInteger : -1; # Uncomment the line below to use long double for xsd:decimal instead of # mapping xsd:decimal to string. # Then rerun wsdl2h and also compile and link custom/long_double.c. # xsd__decimal = #import "custom/long_double.h" | long double # # Or if your system supports __float128 then you can use: # xsd__decimal = #import "custom/float128.h" | xsd__decimal # # Or if the xsd:decimal value range is bounded to double, then: # xsd__decimal = typedef double xsd__decimal; # Uncomment the line below to use struct tm instead of time_t xsd:dateTime # Then rerun wsdl2h and also compile and link custom/struct_tm.c. # xsd__dateTime = #import "custom/struct_tm.h" | xsd__dateTime # Uncomment the line below to use timeval with usec precision xsd:dateTime # Then rerun wsdl2h and also compile and link custom/struct_timeval.c. # xsd__dateTime = #import "custom/struct_timeval.h" | xsd__dateTime # Uncomment the line below to use std::chrono::system_clock::time_point # for xsd:dateTime. # Then rerun wsdl2h and also compile and link custom/chrono_time_point.c. # xsd__dateTime = #import "custom/chrono_time_point.h" | xsd__dateTime # Uncomment the line below to use struct tm for xsd:date instead of # mapping xsd:date to string. # Then rerun wsdl2h and also compile and link custom/struct_tm_date.c. # xsd__date = #import "custom/struct_tm_date.h" | xsd__date # Uncomment the line below to use LONG64 int for xsd:duration instead of # mapping xsd:duration to string (in milliseconds precision). # Then rerun wsdl2h and also compile and link custom/duration.c. # # xsd__duration = #import "custom/duration.h" | xsd__duration # Uncomment the line below to use C++11 std::chrono::nanoseconds for # xsd:duration instead of mapping xsd:duration to string. # Then rerun wsdl2h and also compile and link custom/chrono_duration.cpp. # xsd__duration = #import "custom/chrono_duration.h" | xsd__duration # Uncomment the line below to use ULONG64 int for xsd:time instead of # mapping xsd:time to string (also comes with high usec precision) # Then rerun wsdl2h and also compile and link custom/time.c # xsd__time = #import "custom/long_time.h" | xsd__time # When compiling WITH_LEAN there is no hexBinary serializer. You can # remap the hexBinary type to a string as follows: # xsd__hexBinary = | char* # When wsdl2h option -d is used, xsd:any is mapped to xsd__anyType DOM # declared in dom.h and implemented in dom.c/dom.cpp. You can remap # xsd:any, for example to a pointer to a DOM node as follows: # xsd__any = | xsd__anyType* # When SOAP 1.2 Faults should carry multiple SOAP_ENV__Text elements with # xml:lang attributes, then remap SOAP_ENV__Reason as follows: # [ # struct SOAP_ENV__Reason # { # char *SOAP_ENV__Text; // at least one SOAP-ENV:Text for the gSOAP engine # $int size; # struct SOAP_ENV__Text *SOAP_ENV__Text_; // array of more SOAP-ENV:Text # }; # struct SOAP_ENV__Text # { # char *__item; # @char *xml__lang; # }; # ] # SOAP-ENV mapping. Note that SOAP Body content is mapped to an XML # string. Use xsd__anyType instead of _XML to use a DOM instead. SOAP_ENV__Envelope = struct SOAP_ENV__Envelope { struct SOAP_ENV__Header *SOAP_ENV__Header; _XML SOAP_ENV__Body; }; | struct SOAP_ENV__Envelope SOAP_ENV__Header = | struct SOAP_ENV__Header SOAP_ENV__Fault = | struct SOAP_ENV__Fault SOAP_ENV__Detail = | struct SOAP_ENV__Detail SOAP_ENV__Code = | struct SOAP_ENV__Code SOAP_ENV__Subcode = | struct SOAP_ENV__Subcode SOAP_ENV__Reason = | struct SOAP_ENV__Reason # SOAP-ENV mapping when using C++ namespaces with soapcpp2 option -q # THE FOLLOWING DEFINITIONS SHOULD ONLY BE USED WHEN COMPILATION ERRORS # OCCUR. Remove the previous SOAP_ENV__Envelope, SOAP_ENV__Header and # SOAP_ENV__Fault, then enable the following definitions: # SOAP_ENV__Envelope = struct SOAP_ENV__Envelope { struct SOAP_ENV__Header_ *SOAP_ENV__Header; _XML SOAP_ENV__Body; }; | struct SOAP_ENV__Envelope # SOAP_ENV__Header = struct SOAP_ENV__Header_ { /* place SOAP Header elements here, if any */ }; | struct SOAP_ENV__Header_ # SOAP_ENV__Fault = \ # struct SOAP_ENV__Fault_\ # {\ # char *faultcode;\ # char *faultstring;\ # char *faultactor;\ # struct SOAP_ENV__Detail_ *detail;\ # struct SOAP_ENV__Code_ *SOAP_ENV__Code;\ # struct SOAP_ENV__Reason_ *SOAP_ENV__Reason;\ # char *SOAP_ENV__Node;\ # char *SOAP_ENV__Role;\ # struct SOAP_ENV__Detail_ *SOAP_ENV__Detail;\ # };\ # struct SOAP_ENV__Detail_\ # {\ # char *__any;\ # int __type;\ # void *fault;\ # };\ # struct SOAP_ENV__Code_\ # {\ # char *SOAP_ENV__Value;\ # struct SOAP_ENV__Code_ *SOAP_ENV__Subcode_;\ # };\ # struct SOAP_ENV__Reason_\ # {\ # char *SOAP_ENV__Text;\ # };\ # | struct SOAP_ENV__Fault_ # Older gSOAP versions prior to 2.8.83 used a simple SOAP_ENC__Array type # which can be re-enabled by uncommenting this line: # SOAP_ENC__Array = | struct { _XML *__ptr; int __size; } | struct { _XML *__ptr; int __size; } # Temporary URI tempuri = "http://tempuri.org/" # Empty URI empty = "" # .NET WCF DataContract Serialization Schema ser = arr = "http://schemas.microsoft.com/2003/10/Serialization/Arrays" # .NET WCF DataContract Serialization Schema root element remappings _ser__anyURI == xsd__anyURI _ser__boolean == xsd__boolean _ser__base64Binary == xsd__base64Binary _ser__byte == xsd__byte _ser__dateTime == xsd__dateTime _ser__decimal == xsd__decimal _ser__double == xsd__double _ser__float == xsd__float _ser__int == xsd__int _ser__long == xsd__long _ser__QName == xsd__QName _ser__short == xsd__short _ser__string == xsd__string _ser__unsignedByte == xsd__unsignedByte _ser__unsignedInt == xsd__unsignedInt _ser__unsignedLong == xsd__unsignedLong _ser__unsignedShort == xsd__unsignedShort # .NET WCF ser:anyType represents an object (see import/ser.h): _ser__anyType = | struct __ser__anyType | struct __ser__anyType # .NET WCF ser:char element and type represents a Unicode character _ser__char = | int ser__char = | int # .NET WCF ser:duration root element and type maps to xsd:duration _ser__duration == xsd__duration ser__duration == xsd__duration # .NET WCF ser:guid pattern = "[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}" _ser__guid = | char* ser__guid = | char* # .NET WCF samples mssamh = "http://Microsoft.Samples.Http" mssamhi = "http://Microsoft.Samples.Http/Imports" mssamt = "http://Microsoft.Samples.TransportSecurity" mssamti = "http://Microsoft.Samples.TransportSecurity/Imports" mssamm = "http://Microsoft.Samples.MessageSecurity" mssammi = "http://Microsoft.Samples.MessageSecurity/Imports" mssadh = "http://Microsoft.Samples.DualHttp" mssadhi = "http://Microsoft.Samples.DualHttp/Imports" # MTOM xop and xmime are imported from xop.h, xmime.h, and xmlmime.h: # Note: changed xmlmime to xmime to avoid other MTOM tools from # complaining that 'xml' is reserved. xop = xmime = xmime4 = xmime5 = # xop:Include is imported from xop.h and redefined as _xop__Include: xop__Include = #import "xop.h" | _xop__Include # xmime/xmlmime:contentType attribute is a string: _xmime__contentType = | char* | char* _xmime4__contentType = | char* | char* _xmime5__contentType = | char* | char* # exc-c14n c14n = # WS-Addressing (2003, 2004, and 2005 schemas) # See import/wsa.h, import/wsa3.h etc for definitions and code examples # The API is defined in plugin/wsaapi.c, plugin/wsaapi3.c, etc. wsa = wsa3 = wsa4 = wsa5 = # The types below should not use pointers, so we add a 3rd column: _wsa__Action = | | _wsa__Action _wsa__MessageID = | | _wsa__MessageID _wsa__To = | | _wsa__To _wsa3__Action = | | _wsa3__Action _wsa3__MessageID = | | _wsa3__MessageID _wsa3__To = | | _wsa3__To _wsa4__Action = | | _wsa4__Action _wsa4__MessageID = | | _wsa4__MessageID _wsa4__To = | | _wsa4__To _wsa5__Action = | | _wsa5__Action _wsa5__MessageID = | | _wsa5__MessageID _wsa5__To = | | _wsa5__To # WS-ReliableMessaging 1.1 and 1.0 (and obsolete WS-Reliability 2004) wsrm = wsrm5 = wsrm4 = # WS-Discovery 1.1 (2009/01) and 1.0 (2004/08 with WS-Addressing) # To upgrade WS-Discovery to WS-Addressing 2005/08, uncomment wsdd5: wsdd = #wsdd5 = wsdd10 = wsdd5__HelloType = | wsdd__HelloType wsdd5__ByeType = | wsdd__ByeType wsdd5__ProbeType = | wsdd__ProbeType wsdd5__ProbeMatchesType = | wsdd__ProbeMatchesType wsdd5__ProbeMatchType = | wsdd__ProbeMatchType wsdd5__ResolveType = | wsdd__ResolveType wsdd5__ResolveMatchesType = | wsdd__ResolveMatchesType wsdd5__ResolveMatchType = | wsdd__ResolveMatchType wsdd5__ScopesType = | wsdd__ScopesType wsdd5__SecurityType = | wsdd__SecurityType wsdd5__SigType = | wsdd__SigType wsdd5__AppSequenceType = | wsdd__AppSequenceType wsdd10__HelloType = | wsdd__HelloType wsdd10__ByeType = | wsdd__ByeType wsdd10__ProbeType = | wsdd__ProbeType wsdd10__ProbeMatchesType = | wsdd__ProbeMatchesType wsdd10__ProbeMatchType = | wsdd__ProbeMatchType wsdd10__ResolveType = | wsdd__ResolveType wsdd10__ResolveMatchesType = | wsdd__ResolveMatchesType wsdd10__ResolveMatchType = | wsdd__ResolveMatchType wsdd10__ScopesType = | wsdd__ScopesType wsdd10__SecurityType = | wsdd__SecurityType wsdd10__SigType = | wsdd__SigType wsdd10__AppSequenceType = | wsdd__AppSequenceType # WS-Policy wsp = # WS-SecureConversation 1.4 wsc = wsc2 = # WS-Trust 1.2 and 1.3 wst = # Some WSDLs use the incorrect URI (below), if so, replace the above with: # wst = wst2 = wst__RequestSecurityToken = | wst__RequestSecurityTokenType* wst__RequestSecurityTokenResponse = | wst__RequestSecurityTokenResponseType* wst__RequestSecurityTokenCollection = | wst__RequestSecurityTokenCollectionType* wst__RequestSecurityTokenResponseCollection = | wst__RequestSecurityTokenResponseCollectionType* wst2__RequestSecurityToken = | wst__RequestSecurityTokenType* wst2__RequestSecurityTokenResponse = | wst__RequestSecurityTokenResponseType* wst2__RequestSecurityTokenCollection = | wst__RequestSecurityTokenCollectionType* wst2__RequestSecurityTokenResponseCollection = | wst__RequestSecurityTokenResponseCollectionType* # SAML bindings saml1 = saml2 = # WS-Security wsse 2004 v1.0 and 1.1 and old wsse 2002 schema wsse11 = wsse = wsse2 = _wsse2__Security == _wsse__Security wsse2__Security == wsse__Security # wsu 2004 wsu = _wsu__Id = | char* _wsu__Created = | time_t _wsu__Expires = | time_t wsu__AttributedDateTime = | time_t wsu__AttributedURI = | char* # Bindings for ds and xenc for WS-Security protocols: ds = xenc = # xlink xlink = "http://www.w3.org/1999/xlink" # wsrp routing protocol (deprecated) wsrp = # BPEL 2.0 bpel = "http://docs.oasis-open.org/wsbpel/2.0/process/executable" bpelabs = "http://docs.oasis-open.org/wsbpel/2.0/process/abstract" plnk = "http://docs.oasis-open.org/wsbpel/2.0/plnktype" sref = "http://docs.oasis-open.org/wsbpel/2.0/serviceref" vprop = "http://docs.oasis-open.org/wsbpel/2.0/varprop" # ONVIF recommended prefixes as per 8/20/12 # http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl # http://www.onvif.org/onvif/ver10/event/wsdl/event.wsdl # http://www.onvif.org/onvif/ver10/display.wsdl # http://www.onvif.org/onvif/ver10/deviceio.wsdl # http://www.onvif.org/onvif/ver20/imaging/wsdl/imaging.wsdl # http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl # http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl # http://www.onvif.org/onvif/ver10/receiver.wsdl # http://www.onvif.org/onvif/ver10/recording.wsdl # http://www.onvif.org/onvif/ver10/search.wsdl # http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl # http://www.onvif.org/onvif/ver10/replay.wsdl # http://www.onvif.org/onvif/ver20/analytics/wsdl/analytics.wsdl # http://www.onvif.org/onvif/ver10/analyticsdevice.wsdl # http://www.onvif.org/onvif/ver10/schema/onvif.xsd tds = "http://www.onvif.org/ver10/device/wsdl" tev = "http://www.onvif.org/ver10/events/wsdl" tls = "http://www.onvif.org/ver10/display/wsdl" tmd = "http://www.onvif.org/ver10/deviceIO/wsdl" timg = "http://www.onvif.org/ver20/imaging/wsdl" trt = "http://www.onvif.org/ver10/media/wsdl" tptz = "http://www.onvif.org/ver20/ptz/wsdl" trv = "http://www.onvif.org/ver10/receiver/wsdl" trc = "http://www.onvif.org/ver10/recording/wsdl" tse = "http://www.onvif.org/ver10/search/wsdl" trp = "http://www.onvif.org/ver10/replay/wsdl" tan = "http://www.onvif.org/ver20/analytics/wsdl" tad = "http://www.onvif.org/ver10/analyticsdevice/wsdl" tas = "http://www.onvif.org/ver10/advancedsecurity/wsdl" tdn = "http://www.onvif.org/ver10/network/wsdl" tt = "http://www.onvif.org/ver10/schema" # to extend tt__EventFilter with TopicExpression element (for C): # tt__EventFilter = $ struct wsnt__TopicExpressionType *wsnt__TopicExpression; # to extend tt__EventFilter with TopicExpression element (for C++): # tt__EventFilter = $ wsnt__TopicExpressionType *wsnt__TopicExpression; # to extend _tds__Service_Capabilities with trt:ProfileCapabilities element (for C): # tds__Service_Capabilities = $ struct trt__ProfileCapabilities* trt__ProfileCapabilities; # to extend _tds__Service_Capabilities with trt:ProfileCapabilities element (for C++): # _tds__Service_Capabilities = $ trt__ProfileCapabilities* trt__ProfileCapabilities_; # to extend trt__ProfileCapabilities with @Rotation attribute (for C): # trt__ProfileCapabilities = $ @enum xsd__boolean Rotation; # to extend trt__ProfileCapabilities with @Rotation attribute (for C++): # trt__ProfileCapabilities = $ @bool Rotation; # OASIS recommended prefixes wsnt = "http://docs.oasis-open.org/wsn/b-2" wsntw = "http://docs.oasis-open.org/wsn/bw-2" wsrfbf = "http://docs.oasis-open.org/wsrf/bf-2" wsrfr = "http://docs.oasis-open.org/wsrf/r-2" wsrfrw = "http://docs.oasis-open.org/wsrf/rw-2" wstop = "http://docs.oasis-open.org/wsn/t-1" # TR-069 recommended prefixes cwmp = "urn:dslforum-org:cwmp-1-1" cwmp = "urn:dslforum-org:cwmp-1-2" lwn = "urn:broadband-forum-org:cwmp:lwnotif-1-0" dm = "urn:broadband-forum-org:cwmp:datamodel-1-5" dmr = "urn:broadband-forum-org:cwmp:datamodel-report-0-1" dt = "urn:broadband-forum-org:cwmp:devicetype-1-3" dtf = "urn:broadband-forum-org:cwmp:devicetype-features" xmpp = "urn:broadband-forum-org:cwmp:xmppConnReq-1-0" bdc = "urn:broadband-forum-org:ipdr:tr-232-1-0" ipdr = "http://www.ipdr.org/namespaces/ipdr" # XMPP and jabber protocols (a selection) stream = "http://etherx.jabber.org/streams" iqrpc = "jabber:iq:rpc" xdata = "jabber:x:data" iqlast = "jabber:iq:last" # XHTML prefix and recommended types xhtml = "http://www.w3.org/1999/xhtml" xhtml__Number = | unsigned int xhtml__Pixels = | unsigned int # HL7 FHIR prefix # When using FHIR you may want to use XHTML as a DOM instead of XML data # binding resulting in lots of code, by uncommenting the following line: # xhtml = # with this line uncommented, create an xhtml.h file with the following: = #import "dom.h" # typedef xsd__anyType _xhtml__div; fhir = "http://hl7.org/fhir" # Prefix bindings for WhiteMesa interoperability testing round 2: i = "http://soapinterop.org/" s = "http://soapinterop.org/xsd" # Prefix bindings for Amazon AWS S3 Web Services: aws = "urn:PI/DevCentral/SoapService" s3 = "http://s3.amazonaws.com/doc/2006-03-01/" _s3__CreateBucketResponse = $ s3__CreateBucketResult* CreateBucketResponse; _s3__CopyObjectResponse = $ s3__CopyObjectResult* CopyObjectResponse; # Prefix bindings for Exchange Web Services ewsmsg = "http://schemas.microsoft.com/exchange/services/2006/messages" ewstype = "http://schemas.microsoft.com/exchange/services/2006/types" # Prefix binding for Mappoint Web services: mpt = "http://s.mappoint.net/mappoint-30/" # Prefix binding for XLIFF 2.0 xliff = "urn:oasis:names:tc:xliff:document:2.0" xliff__priorityValue = typedef int xliff__priorityValue 1:10; gsoap-2.8.91/gsoap/doc/0000755000175000017500000000000013525564140014147 5ustar ellertellertgsoap-2.8.91/gsoap/doc/wsa/0000755000175000017500000000000013525564137014747 5ustar ellertellertgsoap-2.8.91/gsoap/doc/wsa/Doxyfile0000644000175000017500000002317713525245160016457 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "WS-Addressing" PROJECT_NUMBER = "2.8 Stable" PROJECT_LOGO = "../GeniviaLogo2_trans_noslogan.png" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../plugin/wsaapi.h ../../plugin/wsaapi.c FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = ../doxygen_header.html HTML_FOOTER = ../doxygen_footer.html HTML_STYLESHEET = HTML_EXTRA_STYLESHEET = ../genivia_content.css ../genivia_tabs.css HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /opt/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.91/gsoap/doc/wsdd/0000755000175000017500000000000013525564137015116 5ustar ellertellertgsoap-2.8.91/gsoap/doc/wsdd/Doxyfile0000644000175000017500000002335013525245160016617 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "WS-Discovery" PROJECT_NUMBER = "2.8 Stable" PROJECT_LOGO = "../GeniviaLogo2_trans_noslogan.png" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../plugin/wsddapi.h ../../plugin/wsddapi.c ../../plugin/wsaapi.h ../../plugin/wsaapi.c ../../import/wsdd.h ../../import/wsdx.h ../../import/wsa5.h FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = ../doxygen_header.html HTML_FOOTER = ../doxygen_footer.html HTML_STYLESHEET = HTML_EXTRA_STYLESHEET = ../genivia_content.css ../genivia_tabs.css HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /opt/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.91/gsoap/doc/sessions/0000755000175000017500000000000013525564137016023 5ustar ellertellertgsoap-2.8.91/gsoap/doc/sessions/Doxyfile0000644000175000017500000002330213525245160017521 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "HTTP Server Session Management" PROJECT_NUMBER = "2.8 Stable" PROJECT_LOGO = "../GeniviaLogo2_trans_noslogan.png" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../plugin/sessions.h ../../plugin/sessions.c ../../plugin/threads.h ../../plugin/threads.c FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = ../doxygen_header.html HTML_FOOTER = ../doxygen_footer.html HTML_STYLESHEET = HTML_EXTRA_STYLESHEET = ../genivia_content.css ../genivia_tabs.css HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /opt/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.91/gsoap/doc/uddi2/0000755000175000017500000000000013525564137015164 5ustar ellertellertgsoap-2.8.91/gsoap/doc/uddi2/Doxyfile0000644000175000017500000002314313525245160016665 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "UDDI v2" PROJECT_NUMBER = "2.8 stable" PROJECT_LOGO = "../GeniviaLogo2_trans_noslogan.png" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../uddi2/uddi_v2.h FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = ../doxygen_header.html HTML_FOOTER = ../doxygen_footer.html HTML_STYLESHEET = HTML_EXTRA_STYLESHEET = ../genivia_content.css ../genivia_tabs.css HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /opt/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.91/gsoap/doc/wsse/0000755000175000017500000000000013525564137015136 5ustar ellertellertgsoap-2.8.91/gsoap/doc/wsse/Doxyfile0000644000175000017500000002357213525245160016645 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "WS-Security" PROJECT_NUMBER = "2.8 Stable" PROJECT_LOGO = "../GeniviaLogo2_trans_noslogan.png" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../plugin/wsseapi.h ../../plugin/wsseapi.c ../../plugin/smdevp.h ../../plugin/smdevp.c ../../plugin/mecevp.h ../../plugin/mecevp.c ../../plugin/threads.h ../../plugin/threads.c ../../import/wsse.h ../../import/ds.h ../../import/xenc.h ../../import/wsu.h ../../import/c14n.h ../../import/wsc.h FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = ../doxygen_header.html HTML_FOOTER = ../doxygen_footer.html HTML_STYLESHEET = HTML_EXTRA_STYLESHEET = ../genivia_content.css ../genivia_tabs.css HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /opt/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.91/gsoap/doc/wst/0000755000175000017500000000000013525564137014772 5ustar ellertellertgsoap-2.8.91/gsoap/doc/wst/Doxyfile0000644000175000017500000002353513525245161016501 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "WS-Trust" PROJECT_NUMBER = "2.8 Stable" PROJECT_LOGO = "../GeniviaLogo2_trans_noslogan.png" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../plugin/wstapi.h ../../plugin/wstapi.c ../../import/wst.h ../../import/wstx.h ../../import/wsp_appliesto.h ../../import/wsse.h ../../import/ds.h ../../import/xenc.h ../../import/wsu.h ../../import/c14n.h ../../import/wsc.h ../../import/saml1.h ../../import/saml2.h FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = ../doxygen_header.html HTML_FOOTER = ../doxygen_footer.html HTML_STYLESHEET = HTML_EXTRA_STYLESHEET = ../genivia_content.css ../genivia_tabs.css HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /opt/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.91/gsoap/doc/fonts/0000755000175000017500000000000013525245160015276 5ustar ellertellertgsoap-2.8.91/gsoap/doc/fonts/inconsolata-webfont.ttf0000755000175000017500000012614013525245160022000 0ustar ellertellertFFTM]kZGDEF8 OS/2mNX`cmap@cvt 8fpgmS/egasp$glyf%8,headn6hheaAs$hmtxnilocarmaxp| nameA,Upost7n3Tprep{Ewebf*SX=Yv|33d  /kPfEd@ % & ~Sx    " & / : _ !"% Rx    " & / 9 _ !"%pL7  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ardeixpkvjsgwl|cnm}bعyqzzqv|fR]D,KLPXJvY#?+X=YKLPX}Y ԰.-, ڰ +-,KRXE#Y!-,i @PX!@Y-,+X!#!zXYKRXXY#!+XFvYXYYY-, \Z-,"PX \\Y-,$PX@\\Y-, 9/- , }+XY %I# &JPXea PX8!!Ya RX8!!YY- ,+X!!Y- , Ұ +- , /+\X G#Faj X db8!!Y!Y- , 9/ GFa# #JPX#RX@8!Y#PX@e8!YY-,+X=!! ֊KRX #I UX8!!Y!!YY-,# /+\X# XKS!YX&I## I#a8!!!!Y!!!!!Y-, ڰ+-, Ұ+-, /+\X G#Faj G#F#aj` X db8!!Y!!Y-, %Jd# PX<Y-,@@BBKcKc UX RX#b #Bb #BY @RX CcB CcB ce!Y!!Y-,Cc#Cc#-DdU./<2<2/<2<23!%!!D $hUDqdXG+ +/ִ + ++ / +$901$462"47>32#.qGdHHd2 17 %g0dGGdG4$ ",, 3-5EK,UL/3 +2 /ְ2  +2!+  99999017654&54632?654&54632, 6"#9D2- 5"#9D1g>3V89?@H>3V89?@H3+3/333*+222 +@ +/$3*+ $2 /ֱ++ + !+6?Z+ ?X+ . .  +++ +  +  + + + +?g+  ++++?g+  + ++ #99 .......@ ................@9901??77777?3 *)|+() * -|-,x+)^]a[Lc`woaYz519A0/-3:20 +@0/ +/7/$327 +@ +B/ֱ2 2/+6222.$:$2.=+2) C+299)=99019%)26A$97901?&'.546753&'4/&'#5&>54'&'zX fI(=V*sX  F|nGox&o"&[\/_pf#FzmHK? o{ No  Uu& [Mm|x^@b \xHe8: (3 +'+, ++2"' +2 ' +4/ֱ+  +))/+%5+ $9/) '"9992  $%$999014632"&332654.#"4632#"32654&":^_$Ê5*"!&>$&?\^_^_ B+)@BRBssqk1F GP3H H$⚙ SOJSYLLJ #0;j!+3'+9?>54&#"Jvvtxe? EVxq@dkP&P;/ Q]d{GUT:8Q+w@rvd7H][|sZObXs**a5nd(FGZTKU*/ +/ְ2 +  99017654&54632- 5"#9D1g>3V89?@HgT/ֱ+017#"&#"&>  Ch}j\ykS /ֱ +01654'7'*nls2(zU&73% 'U5J E7pp ӄj  ͔}jYT[3\/ R/32 +@ + +@ + / ְ2 2 +@  + +@ + +015!3!!#\j^T}^}Rr(/ +/ֱ + ++0167654.'.54632R9.E19U5K0%! */F^L@r//+015!@pb5+ ++ + /ִ + + +01%462"&pGdGGdG_0EE`FE~Q//+01z}l>f+K+#+,/ֱ )+ -+) $9# +$9014>32#".7.#"32>54'fHuM;tiO/1Pjp9MvI(j70aQ3L)o:#HG6"t\6q֓g0YqERTD|S[!Lngne%++/ֱ +901%3#NcOML.]+(+-+// ֱ  +@ +0+ +,99(9-+9!$90135>7>54&#"'>32!276Kx"B!)fKsh8m(M=.GD+:1 ZlA1DH%fH, S`oіAyjC+BC2GI& f.U,+  +, +// ֱ)  # 0+ )999&9#99901?32654&#"527>54&#"'>32#"&l 4K)n#F@H~`\O32.'.#">32#"&'&732654.#"68{vc  H&"CZC2*SD}b;՗X6` vY(CL)GE𙞞tn!>f|GS9haWROxD!\t )++ /ֱ+9015!#6ӁqvVw}EutOhB{ "1j+ +/2/ֱ #  /# + ,  3+,#  $9/  )$901467.54632#"&73264&'>54&#"{rXjȑo]n⧤he|^z4.BBMbvUSqAm6-]~\12oǢ`''2/X:, )HPpj!-r +++%  +./ֱ""+/+"99 (+$9)9 99+%999014632#"'7326767#"&732676&#"՘m/,67|tc P)L'.,O΋\E*r\b鑒tn$VZqAIḇUGpbb9+ +/ +/ְ 2 + 2 ++01%462"&462"&pGdGGdGGdGGdG_0EE`FE0EF`EERrbP/ +/ֱ  +/ 3 ++ $99990167654.'.54632462"&R9.E19U(GdGGdG5K0%! */F^LF0EF`EEGa5 5Gi4^j8\\/// +015!5!\II\~~~~Qa75 5Q:caj8cyS"+d*/& +/,/ֱ #+( ++-+%&)*$9(9 9&"$901>32#5467>54&#"462"&Bu4!: 9 ">A-{\N1HdGGdH}eqӗ.S8</3[BUURqDB&BF&[~`Q?0FF`FE@5G0+++ 90 +B0 +H/ֱ%%+6 6+@22I+6 +0$9-.99+-9999B%999014>32#5#"&5467>;4&#"327#".%3267>=#"@yc7Oi@^D.R"1;X Qߔg-xk.nL?aN`oU$rBӅs}V&CcU.hmC]0-U0<'8 ,+3+ + / + 9013#!!핍k|Yuc#0c++0$# +$1/ֱ$2+*  2+* 9#9$ 90 9013!2#'327>54&'&+5327>54&'&+cj2>Z%XagVkpe)bC8l9AGLEB}v;;AD>9p&X\#$pe+}vFG|!y`89bS'>!++ !+(/ֱ)+ $9 9014>32&54654'.#"3267#".S@c~@4 (J͔K,j}YKn65qK)NF q$|HM,x G+ + + /ֱ 2 +@ +2@  + +013!!!!!xy]&~ @++ + /ֱ 2 +@  +@  + +013!!!!#~o|J)p$++$ +*/ֱ+! 2! +@ +++$999!9!9 $9014>32&'.#"327#5!#".J%>UXdR(v7e ST0@ybwnlX[Fb<ot†i>(rcg CT^Yx։pN0| AD(`oO+3+ 3  + /ֱ 222+ 2 + 90133!3#!o  " 0b9 G + 2+2 /ֱ  +@ +2 +@ +2 +0153#5!#!y xxxwe H++2!/ֱ +@ + +@ +"+9901?327>45#5!##"&e_*`0a6 G+]Uvu'/Q6"J*xx(32#".3267654'.#"<<]}x=n=NLz|]R'@UW-F*92)L+SS?( _%zvz|(auxP!UXy|gcJmxD++ +/ֱ2+ + 99013!2+!27>54&'&+x3@X&X_^V%U>1a36@o< ,Ci+>/2D/ֱ--%+9+ E+%3>9999999 999> %3$9014>323267""#"'.'&545.732>54'.#"<<]}x=o.q6G/z;mlN1&@TY/%IVA,4*L,TT>'_%{xfx01  = 4hؘu{S#CjyӁibJos[+ 3+ +/ֱ 2+ + 99 9 9 9013!2##327>54&'&+sx3AZ&V_t'a36@oj3^1++ 4/ֱ# # +2+5+#99 '1$9+9 +$901?32654'&$'&54632&54'.#"#"&jU /bk&Bܩi@Z 'Vi}+1cA_ZxϏ<J\////ֱ  +@ +2 +01!!5!!9IA#z9-+ +2/ִ ++9013 9,m 3fG\//+01!!Gs'}xs^( / +/ִ ++ 9017&'.'i7!@ ->1'+3='9;)!jkd{!9i++%+0 +:/ֱ""+,22;+"9%0$9999017467>354.'&#"'632#5#"&73267>=#"#"#"#"dmj7[e6dHn-kYQ&" ?  YRSS'#$%@Zh]PK1eGg~vB`F(F*!>`zS0W++! +-1/ֱ2'+2+9' $9-!9990133>32#"&'32>54.#"z ,YGmADpJT.47)1>/ AO;));P?FtS MY;rvzx?OD|z13M*-G~R^P2I?s3++ /ֱ!+$901432.'.#"3267#"so8h *4R-G/UBc[Rz#% ;6cHL\S3[++$+// +@ +4/ֱ  +)22 5+ 99/$ 999014>323#&=#".73267654'.#"\0Nik8_"  ,ZFkA#6HD"LWZ.,TP1gmIWJ4  ?6!'QO\32!327#".7!654'&#"dGyV=piM h-@UO)^R;f`yE"JZ;:P~L1iOGJ?v\GU>t^"R!+/32/ #/!ְ2 2 ! +@  +! +@! +$+ 9901535467>32&'&'.#"!!#!0djC lA9B80V;+ Z"GJA`[u[*\OrLX5;q,t,yyyna'V\Y*LYTx-GX;.- n@'MM9$'CJLN$)0L%? @yyxwQ!H+3 +"/ֱ!2!+ #+ 99 90133>32#4.'&#" 7[Q#"2MB{#Q  RiWNM4.4Q;S/%I3+? _+2+/ /ֱ +@ + +@ + + + $901353#5!3462"wt>X>>XvxvX==X=c?#Y+/ #/ $/ֱ +@ ++! %+"#$9 99017326765!5!#"&462"c_ -F'=e.hW>X>>X %>84a zLj5ZaEX==X=Q-+ 3+/ֱ2+99013; #"(F5u,X{S   s_Q <+2/ /ֱ +@ + +@ + +0135!!5!!vdw%vN.j+"33++ 3)2//ֱ. 2.#+" "+0+#.9" 9 9) 9990133>32>32#46.'&#"#4'.#"N"f8>\ sDa14=0' 0B/\3@M;>JJV-;e)  4TARZ!$$W6PtG+ 3++/ֱ2 + + 990133>32#4.'&#"7[Q#"2MB|#RiWNM4.4Q;S/%H4SD++ /ֱ+ !+99 99014>32#".732654&#"SHxXQuFEuTXwGuoprjJ@xuqzCI~t̼z,S+++(/-/ֱ22"+ .+"99( 999013>32#"&'#32>54.#"z0ZGnBDqJU/ uFAQ>*,=S>GwLX:qw|x>OF/TTLV>C,GTaN1 J>:W)S+++%/*/ֱ+ 22 ++99% 999014>3253##"73267654'.#"WEsN*L6--YmKG1[M.su?#" O\`R32.'&#"˚,keE 6e:HIajgF B0/W1$8u6`5+ +&7/ֱ)) +08+)99  &-5$90!"999&  0$901?32654'.'.54632&4'.#"#"uT ?If^(6$0ȟh@V %XQt]$:3^\27SAK,; )+=!lLG0QI7E-I!M6gT3#+ +3#2$/!ֱ! +@ +%+6?+ #.  ##+?+   +  +  +  #9 9 .... # ........@9!990173?!!327#"'.547  2 Y;_r.F/x n,+z0NIUtid$`C7!M+++3"/!ֱ+ 2#+9990133267653#&5457#"&'.!`8Av!% .X]( B73+ .¯+ . ?P+ .     ......@  ..........@9013376'453# # Z: <_]jtQ-*^a &+3+3 / + 99013 33 #aIX[8l."2+3!/ #/ֱ$+ !9990173276?3673#".L5I:!  4'7%,Zy =#JE  Ohc1fg 5+ 2+ /+9 99015!5!!26gC-# eŁe9lDP`=/://3Q/ ֱIL22! -022R+:=E9-I99(9 $999$9015327654&547>:;#"&:;#*.'&54654'&#l(]-5e")/48>GG/!R .d!76T !- 9LJ @6-$r6*Xr/7w`\  t 3_cA_+ *GwL!p: s  X*5)E8/ֱ  +013mPV-/.//Q/Hֱ9<22  22R+.-%9 <99A9E9990153:;#"*+53:>7654&54>7&'&54654'.#>84/)"e5-\(*X*6r$-6@ JL9 -! T67!d. R!/Gt  \`w7/r)5*X  s :p!LwG* +_Ac_3 U4+/ /+ 999 99901>323267#".#"U/T/S<7? .N2^1W.O95@"]MQg -- ADNLq"/0"~qdXH+ +/ +/ִ + ++ +$901462"4673#"&'&qGdHHd:%g 17 dGGdG.-5E 4$ ",, c_%,+!// 3*/-/ֱ& &"+.+6&!"."!.ɰ6?u+ "! ""+?t+ ! ! +! +! + ! +?+ "#"+)"+*"+#" #9)9! 9 9 #).....@   #)*..........@* $99014?&5464&'&'3267+'7&7c SZ :__J5JAevp_Y.   t  E3<7cGL*Ã&P66+03++46 /( 6 +!3 27/ֱ$ $ +@$! +$+ / &2  +@ +8+  99$"(4$9(4-99 $99  99017>7654'#53&54632.'.#"3#632327#".#"P;&'GjӔqZ  I'Y˰KF8UB7jk6y?je nKuC@hq x9LuvQyU9jU-.MPt8!r/!/ "/ֱ+#+$9 $9 $9$9!$9  $9017&47'76327'#"'264&"s:;tItRhdSrIq=Nn54'.'k6\5[o^(5\KFCe0sbIPjm)dXTDACŘgrn!""(v~)4@}  #1#_CZ7?MyDo+|AwaTg,M]A^:5/z>?l,~D{\b5'B'g:( F!Q//3 2 /ֱ  + +01462"$462":;54'&#"'632#5#"&7327>=#"&"j=<(4? H'\}BGeV^|hH9WE" <#2><7oo7g  G"=ZTtEB2aAEX}^-@A:,$ C}4 557OR07PR0.URY0.URBP0/ +@ +/ֱ  +@ ++015!#E{@r//+015!@'=)4 /*+(/**+(* +@( +4/*+/*+5/ִ++)+*2)/+!+!++6+) 99/ '$$9!&99%9(%&99*$$94!901432 .732654& 32#327654'&+%dO]\128C5bjI!).!Ie12Ql'VS17WN,-"//+ ++015!ss!E/ //ֱ  ++ $9 99901462"&72654&"梢~Z~ZZ~Z q⢡tD``ED``\# _ / /32 +@ + +@ +/ ְ2 2 +@  +2 +@ +2+015!3!!#5!\j^K}^}e4%R/ /&/ֱ +@ +'+9 99 %$901>32!276!5>7>54&#"-^x_pu2u (jEi37TF8a oPZ_gXO]8 Z7m:Q*J+3J2%?0X.//*+/"1/ ֱ+ %2+ (9+999(9%99901732654.#"532654&#"'>32#"&_ R,Kj #M7([OVC4f$K4Nq@4AV|Tj &  N7"&g>+0I2-L=BZ8W d@cF- / +/ִ ++01k-W1*\%+3 2+3/+/ֱ * + ,+%9"9 "($9016533267653326?#"&'#"&'1([28d*8 7 ^6@`#OK~ p r@63!###.nd.qH@wza+!j p0b./ + + /ִ + + +01462"&pGdGGdG0EE`FEB] + #+ +/*+/ ִ + ++ 9999 9901732654'&+73#"B3Zq5)7<X "3=viUI aA<\d +/ֱ +901%3#Yyg37gG////ֱ+  +99 99015!4632#"&732654&"]9hU36Zl:|oKJomn7oo>.WY_[/Ƭx{}}4 7'7%'7P7"P7U0RU0 qk  /3+2  +@  + +@ +//ִ$++2+2 +@ + +@ ++ 999 99  9 $90173#7533##5'35 Fhxa}H?gg]x)s7h:nNL kk //*+2)/*+/0/ִ$+&++& +@& +1+ 99& $99 99) $/$9 9990173# >32!276!5>7654&#" Fhxa}$K`{MZ](*  6 U6UUC8-Mx)s7@HkLRF@J- gH,W.BE:);(qx.2=@+ +)+3/93>+723> +@3< +>3 +@>5 +,/*+/+0/0 +*+A/ ִ)+ #+)?+<27+:27? +@79 +?7 +@?3 +B+ &9?)>970599,>@99&9#1$901732654.#"532654&#"'>32#"&7533##5'35L, I@E6*Q<)r>Z}3)4DdCzca}H?gg]iU5>,R2"&;($<15hH-F O4On8s7h:nNLS"+u + /+/& +,/ֱ +  (+$ +$/( +-+$9 9  %&*+$9 999014>7>=33267#"&462"4!: 9 ">A-{\N1hBuHdGGdO.S8</3[BUURqDB&BF&[~`Qaeq`FE10EU ,+3+  +/+ 9013#!7!핍k|wQ90YuȏUU ,+3+  +/+ 9013#!%!핍k|9Q+Yu~U,+3+ +/+9013#!%3'!핍k|& ,C8YuNj"%L+3+# +// &/'+#%9"9999013#!63232>7#".#"!핍k|pw&J=* L/ֱ2+'?+2@ !"*,78$96/'-99 *99 9014>32&54654'.#"3267#"'732654'&+7.S@c~@4 (J͔K,j4c "3=vil3Zq5)7<AyxY7w_%tC   DPTHEVm OA<\LUI 0dxU G+ + +/ֱ 2 +@ +2@  ++013!!!!!7xyQ90]&ƏUxU G+ + +/ֱ 2 +@ +2@  ++013!!!!!%xy9R]&~xU O+ + +/ֱ 2 +@ +2@  ++  9013!!!!!%3'xy` ,C]&NxO p+ + +/3 2/ֱ 2 +@ +2 + + 2+ 99013!!!!!462"$462"xy[&g++" +%3#2'/ְ2 "2 +@% + +@ ++ (+ 990153!2#!3267>54&'.+3#>c^>nnUzD`1[b57FN5'iv.QԮC(k !=sK*6[vgj ) +3+3+!/&/*/ֱ + 2++ 9!)$9  999  99!$)999&9999901333#63232>7#".#"gr6pw&J. L=X5(M4A%7+O 7% ! . RKF0;09E<U*.I++%//ֱ + 0+ +-$9% 99901>32#".3267654'.#"7<<]}x=n=NLz|]R'@UW-F*92)L+SS?(YQ90 _%zvz|(auxP!UXy|gcJmƏU<U*.I++%//ֱ + 0+ +-$9% 99901>32#".3267654'.#"%<<]}x=n=NLz|]R'@UW-F*92)L+SS?(9R _%zvz|(auxP!UXy|gcJm~<U*1I++%2/ֱ + 3+ +.$9% 99901>32#".3267654'.#"%3'<<]}x=n=NLz|]R'@UW-F*92)L+SS?( ,C _%zvz|(auxP!UXy|gcJmN<j0Fy+7+A(/-/G/ֱ11<+ H+19<$(0$9 %9A7 999(+0999-%9901>32#".63232>7#".#"3267654'.#"<<]}x=n=NLz|]Cpw&J. L=X5(M4A%7+L'@UW-F*92)L+SS?( _%zvz|(a% ! . RKF0;09EuxP!UXy|gcJm<O*2:l++%2/93. 52;/ֱ,+0 04+8 8 + <+40%$9% 99901>32#".3267654'.#"462"$462"<<]}x=n=NLz|]R'@UW-F*92)L+SS?(327#"''7&&#"3267654/<<]}x=j^nqNL54&'&+x Lo6X_^V5kIa36@oqZ4t++"/#,/5/ֱ44+ +))/ ) +@)" +6+)4$9#99, 90134>7>32#"'732654&'&+5327>54&#"q.kWLsڞw^I;OcK
;:$:H\4c#b;54.'&#"'632#5#"&73267>=#"&7dmj7[e6dHn-kYQ&" ~4YRSxgS'"$%@Zh]PK1eGg~vB`F(F*!>` W>d{!59k++%+. +:/ֱ""+,22;+"9%068$9999017467>;54.'&#"'632#5#"&73267>=#"&dmj7[e6dHn-kYQ&" ~4YRSS'"$%@Zh]PK1eGg~vB`F(F*!>`7-Wd{{!5<r++%+. +=/ֱ""+,22>+"9%068:$999999017467>;54.'&#"'632#5#"&73267>=#"&3'dmj7[e6dHn-kYQ&" ~4YRS',`S'"$%@Zh]PK1eGg~vB`F(F*!>`' Fdh!=Q++A+J +4/*:/$R/ֱ>>+H2212S+>"99@ $*4=AL$9/099J9999*4"=99:1899017467>;54.'&#"'632#5#"&63232>7#".#"3267>=#"&dmj7[e6dHn-ipx&K<* L=X5!>1-3%6+0kYQ&" ~4YRSS'"$%@Zh]PK1eGg~1&@ . RKF -. 8FB`F(F*!>`d{Q!5=E++%+. +=/D39 @2F/ֱ""7+; ;+,22C ? ?/C G+;7%999?0999C 9.9999017467>;54.'&#"'632#5#"&73267>=#"&462"$462"dmj7[e6dHn-kYQ&" ~4YRS=V<`V<$+>C+;+;+,22H+7"9>9C%089<=$9; 9.9999EA6:;7$9017467>;54.'&#"'632#5#"&73267>=#"&462"'264&"dmj7[e6dHn-kYQ&" ~4YRSXnmm2F22F2S'"$%@Zh]PK1eGg~vB`F(F*!>`Yjjj'67N666IU.+43(:2+3 Q2E. +"3J2!V/ֱ7 7C+2#J2#K+ W+799C 4999#199K(.999 *9E(*1999 !9990174676?54'.#"'>32>32327#"&'#"&73267>&=%54'.#"_\L{- Q0+SH+|EJy!"uA;o$Vh=_7I,{CN*!|JoY?,J,l2023B'J3'T)"5D%3=/)Z6;D;;D;<)pEAN_Y.;DJT4:KBAL|B^2.&5 NT )S,+0M;ds5r3+3+%/**+1/+6/ֱ-+"7+-@ %'23$91*"(99$901432.'.#"3267#"'732654'&+7&so8h *4R-G/Ux "3=vil3Zq5)7<[Rz#% ;6cLA<\LUI d&*C++"  ++/ֱ 2,+ 999014>32!327#".7!6&#"7dGyV=piMh-@UO)^R;f`yEq)QP"JZ[XP~L1iOGJ?vs>tW>d&*C++"  ++/ֱ 2,+ 999014>32!327#".7!6&#"dGyV=piMh-@UO)^R;f`yEq)QP<|w>"JZ[XP~L1iOGJ?vs>t-Wd{&-C++"  +./ֱ 2/+ 999014>32!327#".7!6&#"3'dGyV=piMh-@UO)^R;f`yEq)QP<,_|w>"JZ[XP~L1iOGJ?vs>t FdQ%.6++*&  +&%/53! 127/ֱ &2 +# 0+4 8+#  %990*$94'(999 99&9014>32!327#".462"!6&#"462"dGyV=piMh-@UO)^R;f`yE=V<"JZ[XP~L1iOGJ?vhV<t@V<+ H+2+/ֱ +@ + +@ ++ 9901353#5!3wdvxvk-W+{ J+2+/ֱ +@ + +@ ++ 99901353#5!33'w,_vxv[ F+Q l+2+/3 2/ ְ2 + +@ ++ + 999901353#5!3462"$462"w4.#"Sc=s%_r^T#P7hu/YT36VX,5cR1%k|Ja:P3"5K=\2څ\d&QʓK!,Uth7u+ 3++./$4/8/ֱ2 + 9+799 $.4$9 )+99$.7994+2990133>32#4.'&#"63232>7#".#"7[Q#"2MB|#spx&K<* L=X5!>1-3%6+RiWNM4.4Q;S/%H4&@ . RKF -. 8FS#G++$/ֱ+ %+ "$9 99014>32#".732654&#"7SHxXQuFEuTXwGuoprgjJ@xuqzCI~t̼W>S#G++$/ֱ+ %+ "$9 99014>32#".732654&#"SHxXQuFEuTXwGuoprjJ@xuqzCI~t̼-WS{&G++'/ֱ+ (+ #$9 99014>32#".732654&#"3'SHxXQuFEuTXwGuopr#,_jJ@xuqzCI~t̼ FSh.:u+2+8&/+/;/ֱ//5+ <+/95!&.$9 #982 99&).999+#9014>32#".63232>7#".#"32654&#"SHxXQuFEuTXwGgpw&K<* L=X5(M4A%7+&uoprjJ@xuqzCI~R&@ . RKF0;09Ec̼SQ'/o++%/.3 *20/ֱ+ "+ - "+) )/- 1+)%$9% 99014>32#".462"32654&#"462"SHxXQuFEuTXwG327#"''7.7&#"326'SHxXQOLmQEuTdYSj[GPD;28r=@oLjJ":qzC.7B}dE $Ne#K+++3$/ֱ+ 2%+ "99990133267653#&?#"&'.7!`8Av!% .X](g B7#K+++3$/ֱ+ 2%+ "99990133267653#&?#"&'.!`8Av!% .X](" B732#"&'32>54.#"|0ZGnBDqJU/ uFAQ>*,=S>Gw$ LX:qw|x>OF/TTLV>C,GTaN1 J>:.Q"*2r+3!/ */13& -23/$ֱ( (,+0 0,+4+($ !$9,99.199 !9990173276?3673#"462"$462".L5I:!  4'7%,Zyf325!!!!!!5#"&'&3267.#"E/IdD&U*@gV).9W*5Q )9!/U( maJ:]&@NLAUE8<$RPu +CQ"+&312+ 3?M2D" +DR/ֱ,,E+E +@E8 +S+E,@  "&432>32!327#"'#".'&732654.54>54&#"!54.'.#" :,L9d!'m :)-U$WK*.SlSW1--1XY(/#:B A;:PXoTSN;w]MI,$NNCsD '2>9LC+*E&'4;::Od++3/3 2/ ֱ ++ + 99999013 3#462"$462":97#".#"pw&K<* L=X5(M4A%7+&@ . RKF0;09E@r5!@@r5!@@r5!@@5!@@5!@u(/ +/ֱ + ++0147#"&uF;,E19U>6I0& */F^Rr(/ +/ֱ + ++0167654.'.54632R;,E19U-6I0&! */F^LRr(/ +/ֱ + ++0167654.'.54632R9.E19U5K0%! */F^Li'N/%3 +2(/ֱ + ++ +" +)+990147#"&%47#"&G;,E19UF;,E19U>6I0& */F^L>6I0& */F^}F)N/)3 +$2*/ֱ + ++'' +! +++)990167654.'.54632%67654.'.54632};,E19Ub;,E19U-6I2$! */F^L>6I0&! */F^L}F)N/)3 +$2*/ֱ + ++'' +! +++)990167654.'.54632%67654.'.54632}9.E19Ub9.E19U5K2#! */F^L>5K0%! */F^L^ ./ + + /ִ + + +01462#"^eeeIHdddT+33 + 22+ +/ִ + + ++ ++017462"&%462"&%462"&GdGGdGbGdGGdGaGdGGdG_0EE`FE10EE`FE10EE`FE)}4/ִ ++015)7PR0.UR)}4/ִ ++901%'7)P7U0C6f0+++0 +#3%20 +327/ְ62!&2 8++-990173547#7367>32.'&#"!!!!327#".'CRrh1&emg4m3[}i*,!.?3L~]:w6lzaNw N6vwSB`3o[ v:?w}TFDTghBem$}+ 33*+2 +@ +22/ִ+ +@ + +@ +++ 2+++ 9 9015!##3?3#/$Ÿ]PHMMCV>= qRR3ה{pmH5+ ++ +/ִ + ++011!\_<||jn Dq3z:JU\Rpfc{pRG\Q@cSnxJoeWSg<x<sj@g3#S:g Gdzs\dOcNSzWuQ a.glUqcPJ\1pB   Sxxxx>g<<<<<<gggg:xqddddddsddddSSSSSSS.|. :5j5j#H[ uRR}}^H))C$,,,,~."Jr2JJv, * f | " T ( t \ :|6Z$Nd P<p|h v$8N N !J!" "D"#$#$D$f$$%R%p%&&f&&'h''(*(L(()<)*++R++,0,--r..D../b>>?(?@@@A(AABtBC2CDDjDEXEF&FGBHHbHHHHHHHHHHHHHHHHI IINIIJ JJKKnKnKKKL6LLV r 6 6  L LX $     0Created by Raph Levien using his own tools and FontForge. Copyright 2006 Raph Levien. Released under the SIL Open Font License, http://scripts.sil.org/OFL.InconsolataMediumFontForge 2.0 : Inconsolata : 7-2-2009Inconsolata MediumVersion 001.010 InconsolataWebfont 1.0Sat Jun 28 16:52:12 2014f  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a bcdefghjikmlnoqprsutvwxzy{}|~    glyph1glyph2uni00A0uni00ADuni00B2uni00B3uni00B5uni00B9uni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni2010uni2011 figuredashuni202Funi205FEurouni25FCKPXYF+X!YKRX!Y+\X E+D E++D E~++D E++D E\++D EJ++D E++D E+D E +Fv+D E +Fv+D E +Fv+D E :+Fv+D E9+Fv+D E*+Fv+D E+Fv+D E+Fv+D EL+Fv+D E>+Fv+D E$+Fv+D E-+Fv+DY+S*gsoap-2.8.91/gsoap/doc/fonts/inconsolata-webfont.eot0000755000175000017500000005307213525245160021775 0ustar ellertellert:V\U  LP/kˡInconsolata Medium Version 001.010 $Inconsolata MediumBSGPr4248+B`WhKqJx"U:r,/4\ liʚELFMC>^+H,'mSfZ}o6euX6H7I5ۦF}f.Lx/R F`H0sKL e#fɩd4P?a?H g,WWA&/),sAFn%ؿtЃ71/GsX<=9o/_ gDË|h(E'T8XmfQ8'UJBhTmE20h.Ŧ3C3΃Z~nKP"b0E7<ñj0 b9Kw I7(JeX<ԗ/<;)QKIH@>AElLY<}!$b1$ v)Ak4 !8? di2ݯq@К.H'E1'?b JQ 0=xH r%\z' 7ƀnrHl/ ˆ_p?b17 Wv߮Nmqa'&+X7_e%pU SfMHSbUռ"L0, &h[W8R($ekUޅ@?-)PPvE6~Ҍdru$2|T6МMܚDI b@ FܮEf8 X}͡33`cR{uWRA=ףUI?w[D6ڻ+e$$w-k`kNHaT7iuKDf!$#U;z hS u2[xqIPs)\+dfkExWe39XazrYTfۧ!6KGD/[q5K.F!6[X[}Ut\#g-Ws cuTQ.VNz!ڗ-{Nx.Ǡ8(2 ,M n+@1He{Jʩ:!AVSjޞa}Bt h5r`\`_OcGn^R5@G/UԦ>Y@.l԰g©9ԡZHWfPridJcH+0SG!^K(ÇG J[z /V;9J9Yн.<>5J0/S%(x $0# _)vǛ) rQ+@hsKy;dYkK¼Mhy;}mֈI;Uzc \u^U|=4k!dHfd"Rd$+V1(ς<>-s%[pnfv`ef{J `9 tV >&TFASeyԥ(ơGH É&srJ_!"҆6 \,Tk% H3Թ:r"6Ę?ڴ&([-38$(PWc CH` h'%Bܵfp$E#٫D*w@OYML6qLw3;9U0_ aRZ` P3?n0aͺn>ZE;,h'[ 55f0|3jE\L5]ISH#Y>ySh{-v8? ^"#qD(rR2RH&ܯ罻7l{DGD) VnHIVR+2Y6a3ɶӼynZ[C9Md-!D,?Aۭ^"G6Vк/-^9š"-E =D/m<8xfeI:'5i%9PeiҫV#XZ6-` x%Hsbbqݹ@^h"((-pԞ:>:/q")m^D{]Ix@1 ~,u\\Vz"\ +܋XHK7=9#NfrR1F~;BJv5`SPFEji3`\w|:aF1UV„PU#%G:Hk|s }WSswL* fݻJ (Z2j+ J˿۬M}32(E,83Jk(&23.X2z3A:&G ?R`]?vXW[J=z! )| ]Uٽ }:({d]кg mc'ܙ" I;>R0} (9=V0${: y"D~ɏR*N9 B;([͠E1Έk0A `K$C1Yhq@F"lTp2| ;F~*n/=i.I<[tց::j`3Jo| u'-1Hs#>?<rQW$A(l̇}`%${?7ހ}kɸI;9~0CW t_3ϛw" MU`}) D0j#凓ȼYNv*mːd, IY~'ha]ȘJ++ޫK$m%X4q N lژh]Ez`jtEgGfYNՄ# CcE[1~x]D"_l<ẩϙE > )Fm}($J%om Ojh. OT3t:>]$ 1ޖ_>{.l,B=רB@CW f&xQ >8hJ2iP'nWbCIс*"4(LD##9%&(;S%&X-6ZHaަ|PC4 4S3T!!h[duou9uU\Ѵ] rN0*M I 9ZEэ%;m."O!B`NdVތPd5.4E'SH%tLmG's H* cWe:-jbX)I@ o03@TZu!.4`]ָڶ*/vN2yxĕfȩmb&b?:Aıf,eX5AV5ː㆜F+`BmV 梠{i+愕nFE#rjG8 ˞wNG[uR|}@~Wq`oJO!Gb@xKH Kۂe&W($I%jNnM1/>%,Z:35 3ؒq\.Pgxֽ~yu@ 01>]YhA3 < Az^d.<^R<`!(EJ\\3 AKEi"Ow't ULl h%[u?D ogi3}\Awhf + Мy&2@yx07K.i](7w*_Eq:ᬌ? a[Kh{eYmsݜ#=Ƙe0HFdx5UèquTvH.Kdu愱w 6xC* $'拓nz$KгyYnɬ(zB#YG/j[[Bݕ c퇾 pq1Yr40ܨgh]cLQBȅt"΀ڡZT*%]'~H 6E9Aa7^!%h~)Oǖ+G"d !]oX)n1D+Pxg#5&:'Jo"-| y(r>o)DH ,mMPf?O 9m. CJ_wӴDK -鎲rR('uY߼)V.{>tHJh~YHFJr8b%3"d-|E"CT45 5Աݼ|B3W ʥl''"Emֵch˲ nkG^,JPZ"%;s[=E odBy+\RmXFs@Z@QD)s^!#%1pd f 0,rHNȴTz*h~57RIӡoq>+] tf`~)!ݺi4u'!iJSQ53e1 02Vݴw0Yz9##H y NHzW23Fx`)ᙔ *ByKx,e$r>ȅaI\$n?IBf`rx۵ě]0B .S50ݡJEX=2B3Kԯ17UVOaEw5-Tu ygڟԓJ9>2=(UKa"^c䔻]pJREUuMp 9C>]F<K$f9Ċgx55KĸUM/pU2G)2 U\6Ox׈G¿laɮo6 o_ ߣPtpR]<,ǑjxE~ JfX)W,y#Dskו4`m6mshfLvɊ@XZd/>k֧b1K9ɎXprF &q_N-5pZ9@8@CP4|~ql@C!<}jө7,e/tFkφtLf7/0@W6CxJ59ΠZK>w.ڤpHr>}Fw3;=Y4Ț*n;+|Y} zǢNc*͈9]a"61ug)"0*ûh$!vhsX,.Zx&'FI#wJ*f hP)Ws(vawvYIeU}7/z: p02.a`ͬ t,o85[".[8{AeUkVh\IA\?X,L8*e T]k܎Qyf#(4s ~,=`Du9ŎNUo=U٣eWFf1uhC& 0cgR`dgߤ(HPmQGj)i+I)tF1"&q; jQ4(9쌶&DmaC|hD2B?bֆh_vA(1ոa\ŬIAz~Jwy*ͅ]:VCf w@TwRq{HBoRiTn'fcph\h!grْ T iEYZ8lhTqݕd ?tU#SGBJ0 '"MXcsmZ2:YTB2 hm9>Xe4>Ad(ǿT?lJr%UܽǓ$1-厰,K=a 铩ct8WL&Ȭs(+@oZ*,YmtaLwY,;=˷^n1[7BC#A+2RSHswX`JH00NSGX)4yyeYkA}+k$î\)<-3n\ PnG&䠠ַفSAdV?&wyXB9@(7C 0Sf: eaS=?Yk/?6I҈ HtEj!˼Bg Ӧ@bG>`Jmgc5Ә! ]% zf_8Q$=fdI]0J,,L0m{P2pg~+NβF(k?T~Cy@ A4-eSâ0Oط\:!Eo\!|Dr`KABe>NQTJ#,iJf˽;&0 0X}[l7n<Ƕ$5WNhr@@j݆/FTd"+xZ0`3͆$p6~Kߙ!, `;\VDYs I2&9Q ( @ZItθ3fBMQ^>  .#VFI٥_O\o TE0 a@!jöAw-$1#h0MW|ͦ2tg=vfES<<^v Tt.'FNРxeg@JY\b 0IHQ䡮0U0W/Dr?24zW WUN /ѯspF_"I vs |$͚a Cӕ8^ΗӠ5AQ!p;y~:Uӌ5.˨Po a6K$F#b44.$ZZjQ-Λ2J?љ,OwGI{gQ8]Љtڪ,.}VuP*zW W`9ADGУb6``B^DCUSm1A~ɉ<F|CSnˋDVKHrq)V)GPye0Y &¥]Jt% 3~ZQOo`~>VPtm j%ր B}@ 7ZlXC-QiǪR>Uqzdڣ gBfah$ RjcҮ nƳ@hڑw];șUoq0I,r˹tr"Vc\egdrt\FEa;<2_Ō]r`Hi(("DzЗ<=b_6a!쨷lb,m6GMϲrt TN83-N9c|D>)^d1+HM31cݤH0L g?d^Q'7cgΌv'oSRmMbE Q:_!$:>,v3c%:NmGQaQ~4Fnh=l+ ,ujRp>\117Q@aQJR` WZM5w&:}jAe1Z/pAL5Ck@JQ0l*u(h@tP~ɶ)FITHH@W\ / HL/ Vk7P;" y{JhUul>$u[JGrļ'9\dn>8F?yjKmnno~+\G k+E8rHh]W\!o:p7x&R _֢b$HwËd"Xiw̗GȨhƝ_ /Lc`b,-eVe a%LFr1T\An21Yu[!_g*hqJSŨhbp^w%%4 bR 8j. b* ~#P"=WBl#~H2&~X-@V/ʸӅ΁.&Zdon w+ G*813R+r˽/yA0: lM#;+?nSئހqAڐQHL)X Cf?*z{CXԙa^9#ͭaaQ\O4a$pb\:*ъV=TQ-q+ϸoҴY-,.:Q/)?d;-w':tRGc=YmV\*űCE,^! [zLWf %MH")łAQ~V'xTVXۗ%0$+% ,bg664Qk?yر?cp)A욌-'fFf6/̪ -=`eO&l:YFd&t_ :R`0~mI}Htv Pp}*ԇb-kDb|b:Rn^$YпJ\e*r!xj5`<8p-r1/bhsBYУ \_@2RƔ"<(EAP2k0=x hby;nݣgǁ%(iZr"Vʜ=}~gDizPy8E>ѭx}~BzBzN2tkb?Ɗ.qY}`0L3L !~!4aJ&JX:`V8@!ҁ;(F̩V ]-@[m*w@ɬť[4PUP<@0  G[j9`ǻkn-~G^bJHQ„`:SeM=L=PIga53H !`-j$ ہ-HbT\(2'/6aURT!UȖζ7֕!dQH+-PaC"qh R` ?`1M d|P_:3 "(@PƐϣ"(䪽jE_e Y]k=cb=V]ck-G0l?UlզBƞei"dTI"|=j-uި2ӽAJ9`!3p8̂LhDq " KKCTݴw''t o.G-9b xI幚{G t`.q 2ty=PI^HӪXyǑ8)$ :t+@-6CdA|Zɽ&L,1<עqS SkSۄC[n ^_̊?߮P,K5r*xHE,޶OFQOT|Z@1G3ޞ"dĤ B5'|f:,hx[B!^ҿ,p(vwMNzHڐ|A$vWRH'nW΁j^6;c5 .`[P x`sr6T*ڼUϛLJ!qu blMI?L.(OJcSVF*$pWf jV<#l$G1 =ڀO( b~l9!EQۓ+SlS;*Ct6 ;XSyQ&D\1-.4)p|pthqsyev FՍ|LLA;`EW+FoYAFFcܶfi+h<,ˍLtgan3|@X˜ֆ̡(B-l[YԦaho[\ٗHzU,Y/_66Lj+No@X0*li=mQGQ(i9\rd xEiX t& ̽]c'{\ ==6-7'$9C#EҎ4AF̆+SKrۅW-H ѣwz?,Z(XT+!\]fR޾f qj(DKT3)LW/a9 ۴FlCtvDo5,1ڸl71g.v $l +9,\ 102wE4tXGYkehHLR.,ÐM0b>絽8Ͳ%l$ʘmZleч+p7cMw:(z' ARϹmtdLxX'!u=+Ab[I Ny@oHǿ%*n4` F M(H𹃎J0Hy|rku][GGFWb=ֽV :-C4~c$_FU sKS wjn`v2ȤE0tG@m"R:hPBX!ռjaE1gZe[ɰtw >c~-*M( `SLFq˲r^n1s ȲR  :=W{Iurn_İA{5y9X:0g$T{E]KzV5=jkbhi?VqLJ$oHY qBaxӀB >%Nƍ%IB`ƹPtG.nU#E>&LW qlq_@Z?;l'q:3 \%o҉t# 71 rI/ȁf_.@Pk [ 嬱!eǰy kP(b(+h=یzkmP:v4Fg %1ΠIHVMDWҼ`-1Kԋ~é(1 YV"~DoaHۄ\"`v-t2gZXjV;2r. d3߄a 6<fԎ= wOW@Q Prf>pYz߂z\C d?isސnuu2Fp`\S`i~X`Yu4 s {/Ps/Ŵ,UI Jg,Z.7YslxEsSst+.Eػ5'Ƿu^uI~ }1H[F (Â-?g줥+koAKb-m e]n`ߑ R4*K3=l c䔉*~fQk&Y,i>ʃ['3hs!oBY~V2f zVA1ͅ5NNj ~eƨ-#DX}ԥ)9ꖺI/VUP9{eҦ腒#֚ԗ: s(*uBC!d/ Cg3K5O%h<` -p@!:I62`Y 93y[,&?mU+뮪05,;خq/ 2?Ez؂CG DB{&Mv`P$c"7ÚHo|H 61-^5丄&;䞱t@SN"H4lo!87ppl+> ҮRަd@ D%?5Y0^#ҝ6O/A|51LqJE;eQG a`36JC٤R~}U72b:߇zFY$&bF R'+wji xdz2,)`@) Spe> [3 =s}MM\1Jm0?Ff_  PP\%&b܈Xk5TSᲯ@-]CdvMH1&`Ij=`wn]g֪=v̯A$hdbpP LpP绵`ԍE2OB] K#i_C(X~A֑6Sx[qzF%7PlӃFR$}# \tIfJ^dt?Mê:ˣoG#SrD5@Ûz-4URQۊ^ >1R {cLॳn@lzF;19i  5K(ոFP]u5/e.r:ٚ@fQ iڵe<{txYtDU1`͒#YPMWN%t]#31EAs5/H3qvex06B_#\Z> xz 繻mF>9sH d'-wEੲSyo.!bPSp%H+Hn D^&})pN&f+YǛ[SCRtXY97Кd ߍ?,行QP L?k$N +=D*i an[XQ\S6Hl L˛x@ Fې)p]&BiYlw煐R j:y{7v1#[&݆[lj3`LE+ː$ #@NDk?_`Qp,_6A@wѵh9QM@w禺3> 6zSyɵ]|E32Ghh *5PA`x->$. ΢^1 Q!%mlS2n{ @},y5H" wGݫ%N'Sr+`T? 6 *1Y *B+r=|r0{d^9V:L N5r~5,AlmyWɘF] `pm^¯$'IxS'{I@WVx8S+ce2Qc 4O zj?U WNsaǵ.OsCkI 5L<xFZ yf2\GE63%(Fq#gjݵ @q7 NZ:b-`8F'R4żGt+ DHwrNUAo kzi ْ4P5!M#4nR]2y@x1o0ꗪnFM-űLzfķ6"2[#x;G RKIԍ 'Eq_L h:ގ?c0-kZ"e13bo>XW ++׈pX.3Jٱ݈mb#;Ex%Lx*5;Ɉ>7NȞ+KZGb)۹'wv0`~j@ rA{Őm/Dp֙||N[ HGŋ$P,H 4ǶE;4]j_u>/B}kTc9p ̀4Ph5MQXAGj\>D67_dg`9 8nT̅EmJ m,:<"$| E!TTƠ&0RCQg; -tb2(qyDh^C)uC MQi7JFC)-"ڨ0lK >G+Fr>>ZbB SC7̣@L dd)8o&@SO gZiYI ĬNS4=,4Ѿ65ݲx)20.WQMaͳ|_Tr&na&-Kiܒnh8'p <3M;%{A}!đmp Б|H6$GI DNjAڊ3"gYדC3TxI )ŝ5%3@\WDq!_ :(QK$3pӝ :qn&f#%;`܏aXJ5\ago0A\AElb]؅Z- ަlߟJ%"`'V$3s!rbqkb9s8`<3zvc3g Ϥ0G QzLסX5ՑëcPcFv2B4%VKۦNyRf<}P)"u̿Xoą VL2x4o"wM frM&#= JPiEj,fAR:<4Ā ^HHnZ9w[hƈcؙ{ 8 ^$ԃ.۵|@:U9 kj h oJNk[49w~ ͏Gh9}ϺS[Y#HDT[XS \9 ^U[ 4g&xh(TG0jcw hP=Du(8QB (烆lp غ|#!*:Z/Iӈ31ɩd^~Gy$TLx.%"7Át\W?XFy/Ar*q<YdQ 2@6l_־bάS?W-jv"rC<渆EԐ4~dD0?+CSL04!Ҟ%?%He(sORߓ8(rSLpPT4;')ˈ}gX4luJWO@y.@SA`r8ł4kڀUpzK~2pdKT.bDX$L"B7ngsoap-2.8.91/gsoap/doc/fonts/inconsolata-webfont.woff0000755000175000017500000006214013525245160022143 0ustar ellertellertwOFFd``FFTM]kZGDEF OS/2Y`mNcmapx@cvt 88 fpgmeS/gasp|glyfW"%8head\16nhhea\ $Ashmtx\niloca^Ηrmaxp`H name`hQA,Uposta7n3prepcE{webfdX*S=Yv|xc`d``b `b`§@1!xc`f~՘u!{y-Ytի֬]n[l۱}RR3V,,~R1!캜@{IMz7v2!3k4;;sΙ3KʑwkS$6NH덌Zlfu є;j=o)M;Z ;4: !qKͺb00.?R4j˰Ѽ34@Skm!qK˦6$tUS]`*́Vy &ҷ$, b 9@HƼIJ;ㆵƑ6O'ӿZxԽ |[Օ?[oOWY-ٖ-ْmYޝKg ξ;! Y!l-@ߓai3Е63mtJ)} $a$s|r0J5 iH?DevCcᒑ9-Z;Ԑ$x?&z"zRLjѳ2dAܹ9LT3Lh2""RnD"=>K?[ VGBU#ZY+t%ªӮqU&:]N^saB6w\5+ zv󖊕+;Tz|eeXYomq̻$ h73L7##RAl@e4|Hʎ**샒"HHrF<8*k͉d%KBʳ -^S]I:fL>n.[})M4tt4o378 LR2!IHҞϔ$+E$Ct&GH?gqb}OJ3"s.A)", \j,.pz$Ijr^l>#}b3,’!2LP79j[Ufki9pxo;~]f>=|znΘww|G>ss̯2ք`^NWv~XXXdܼ|wAv-!dM7~\̄mjboR=w {]:_C9]ƑBqtR_V\3jOe<2cw_~{^f*C_>>UݑKw.u@h& \ƅJZǫ}h.񼩲c: y;gnԮϮs&h?S3L crP=H- -`PȀ4 JXik*E9 M(PzQv##^eKJ/0>˔uRj8R]ꠉ}82m&D@Pw>׷|n}os +{hhu̪NB;n>塇v|1йH-I`矛[KKMfvʳŇ;bB&PS'mzdewdqB-K=ʭf1vAYm2 z0ߧVv"CHZiu%[V$k7uL-ܵv?9J=V& f:Z]NF0S? ~DJS?\QIT- mc{}C6{jooydV$1$a %L%aD괡$ap IwQb6(MjuV oiRhCg^/.$Y{qovr;CaFiv #XbFG鵆/Vq0[^*a Vf6Y,m~S=5hH/}l }v iz@YLq+Q&k˙3 ZuM$-X&YlꠠkIE[6ˡ_ a.fF"Qsp9=7WX2x-*`B$&iA5!UeT PJҪtE fsu@g\bh& qAXeX-ONvHM'wL_8o- j՚ ɍaU{Bɺ :y?[WZ9薻;4n̥xuW0.|cb@kOP[{d=HZjpj.I r (H##`.RRR !XyD7q9櫎JMh+4Wդ 'x8sNmxl߹u]&/NkήtH8sy_cOa~6b~,@[.eZ(`ZH=&3TQH %mTu: K.)(Y7:􂲢dDq&114-O';ɲ\tWA.=:1>f'dxnG9fx# i I=llMRFer>?\~X]**uZKqXCu,W;}vݸe\{n-U oxs]{ׁԽw;Â)d̖4{V1YS*09f:EcxNjIU֨b|l΂wj Jj|RSZSs7 U+pXMOo{b YP{:GΜwyOXSv;P<(糏4ƈ(m pb-XV[qw~|޶SS?M}?u!; N >>O9Eu'8V_8 ;"q`#"Z/1QszTGr92X=%#/L>x*DA|ݳen}a wkV}Żƹ\虹E"[teϾ'=l42L+99mS/@~Axr5#l$G1(@Y SF@| J,OcpO[ɇxpWy _~)+N~o=Yhb z(A.4a~fˊZꨎv}[=5鞲ކ׷m\U<K6^ct0aZ0ζn=:aLL.S^%3^\\<% fQ0AX|z% `=/΢ RK%Z`!.;ڲsg6w 5<,˧rK.^x+vmp$Ps'n=f#  tZӰV IlTW~8.9[ ڟZt(دGa}0iQƽvLdNS7zLN:`~̀N_|j_j{.{>$ ]Rm".(xnTԘ>yn1o0YSnWLW _7!(gz3X QRU 4T4W"u5]9x7Fhٵ'~cAC؍۾~֦bӖg-Ż6M!{R KO irvLU*\!guHi=,IVF6ߢ6QYltT cvYr^1\r㣄5=̚K!aHYFJ]>]`n 5=5aP"Q9樘tȘ*die0mM˚:Ox]D񦾾K G$8ކZa@ H(. r'iq C6`Mf7EUU<8^UbYɪv|wB-yhvU Fk|]b)ε3v\\{ JEK&REti,!IJ$,K$z%>8Y֤fꔛ\ +QԚg:\³sqGaL}zjn0Q6DFMwZ kXd>HsaDGPJO8j]zuߨ SgueTQO F1hjo%Kjط;Τ>|ve%Ƿ73w?ٳzE~z%O숌0ZՃ+"kqPÃ2x,kPb9(`G ]xvQOS%eUx׿XforNnoS^IWV6MG59)($_F/ZY O74T8]%pH0;bo gokl|#]~ݔʻ-E&n-*l֬ {}fIm}.O,Ց !IxNUkNۙ_m9]ouyAG[a-ϧrAzwc,%B*vjRrעIظl2S3u WW \aIuQ *TJKFLxʘiᶦ=p~Z_bL#CҶA)X %- Yhで< ԍiƁRc"nrՏFMДɇ}ޣ6O7nzG$_&xCok|ɝmWiXv-Kltdjd!L‹_i6 @dA_`XtJy%0>u)(Qq~=8ݲoڷL34-7i-HU/ZAz1b7 d2:xFd&YzAb$WHwSb[S7o!T0FmC-Q6J\&e85YN"D u' {&uC`OkR+vUu(穌hWӉN\⭒ F5V{q9V]|Ȯ79Bؓ"NDؐLfC"S6vkJ_PYw7ʼnn@`kT]2#2st|@*2I^ɌG>C^O%؉/ >kW)W1L:QQ!_TCF'_#2X_b[Ru鸼{O,L΋K:Co>vb ZFQMV` v:jL\N7lPIlŔeX򦼜ʠi 1dzݽk\JЁq/L v@-,@*gNЫRctN b[ˢQL@Hd8h/({5R~B2hM/WZi>X|tK \7ܬTs+;oógkMw >]4sϘv ZYthڤU/㖶zjRnŗL9igG^xՃI\Ĝu쨤A9JIzkPg9R_Eڥd2B&-jqy(9usPм['lkpU\.la|eoI]?Ђk{ȷ5%V̶Շr֥lnA n9=msٶ]̡ ˂+f>c:aɔ%8yr08{JaAIEwQV }?,N^Qgѵh{Agk2 FyC4-6XBJ,4F3Ĩ?`~}\VVty6a:k;3n3efUgG ښ|CB3tIPGCЧvfPtĩz$|ZsY ~RfQ7-ROSbslӯΟ5mj}o;g66mڕCyLR`:UUL`*`Z&d`.Ƀ̈́`f |~j -ڑ+Aw YarU9ۃrR_ i '̹"kRW7Mes]XaAԚ~Au{ϳbks%0i JF7NWđe}6-nf% aU"xLqsO/Loʟ]^?=+=9Y3gΩ6|/]׻hy+vH*Bi͵+G&& @0'F]ǟkµۻ 7졙\m ?I3YL -~-rb-y, Xwvэ dD)OmooxjӖϓxk7{}=O|咽av `eyd#(4;8d噭"k4A[NPb12<U+0WԲFݧ+qxø ?rk0no/hTZ8ݱ37{Dܺ/Z_T5{ieRijt]H2UDk&=eeHXm`VLB#hjLZ bY/6Sg tsڶ;wO &*;:ZUkJBug;pyBrqwճbJ?r_rD!C?YGYd@R V4/JWPs4.cKLI^$sx駗cMfKά[7C:ӤK0^D_yv5]6uT|1`-&^ZqB˞'_'ԛVn^-hm\RQҸ6v?bĞm,\:>y4io2LVdI 8VHF{98u.H*Y0\* \uUu<jeKk[wx=ij.zXV;q)59Z]y+7k.3ShD %]]"n1hg̉,$x )NY-OL(\VK^ " :[:8Nt8V#Vſ K0)؟~AVe}(//KJv d}bFo5Zd9CZ?s*FgSfw9 ' L&#jCxհY5KӼZ}|7,Fraɱ<}ɔk/b ۏmn1S'(/a x16K>>Kc[F&^yHb*76nI U* Ru >& 늟^#*KkcS15 yM3!cs-8wVLzܩ牎'*xEeݕa^o4FWy]7 O%uߚO %= 6K>E,ב~re_;j8rau B3 t#b!Po9Nn0^9T oKH(ODKc5.AvNfǛ9^lQIusx(\d[=FiOL;嗗p))#Tvx#dz̡D)p=# 05R ^_یMd:,$y-,G8탧)"qz)q'bMg~-Cn,%$|D huNIp<6s|ݒ%l=]g߷iɼO="ٿMeb *-ߖ?k~J˯z)~C2.ý&~I֠!zIj, 4D8Xn1Y' JQ UB` P~ D|xD||٨faߪ>pR̪/UlZOֻ}dYZǿvfK[6xweT VN/??\0yׄ=;i٬ՂƗM^ԺRmnj^[omɅ˫-A8.\3+9W+cV]?(@=~PTQ81ִ\yavclm8+<& vm-x>`F0i.QqMzH 6;;ˬ`_Qo@C_+-Zf{b5t+D0hJƕ'LFBa+FF'(y͕/z=O??E޻n{ZMWp-9iϗʟ__w?0<|Tjs3K4^8_t{uK?8WA&$s8 뢈hDiB(`(ZD5( bL`靹E!E10Q\2~ф QN였Z1ix,{:fmlNvױ ,޳Ý9mnOښH|F\|GkҪ968ֶqeֶ{Օӏdz^\b c&.5QjFO<$;3ȼ/q4[TdNHeNV) IGi19_b?ȶL0S/őR=Oq)^}y"ˣEbDyVM7 *7c (&x#„ ʮs8ʿ"Q*0fGTl"9CT|7_z_VFkW߱|މޒwTp̬1_fL&Se6Xa:v P*gԒ j֭?` t`aL 24ؔR>'-k;LQdn/diϣ .*<o}< Kr~s_2zKP T3 Q~I%= iK:Mbz5*Ja,AzHyes0Gh V F6`0ΞDG0:UVј}jpꕮjp:3oD']޴=JuFŽmbYU:8m%M]T5MJBh&W-cYYȁ?Yã8PvXnDJyb 춃:z<]H mJ(ۥ8!ZD:C\ꨫ_<%ZzόIF丣8Ǽ`UN̔T~qϬ;{>3%.Yj)T11Z89~eˊckx/g/ g`/xv k 4ha3@l.<>p{ZR>'{ʣԳ_Rd$1Yr)$IĆb5sJBҩȂ@RoQ)Q(X$+^cUc"+WWmQW#9 +ss҂Z1Y\ӲTk}6&2t'ɖΦ lp{[Aqevʖ'Ν:!^#۸LFdZ.S I͚GQ67]N<0RZ2H@b"?LmXB·v?'Cv;W4W>&]傾 3*SS*R9\赌f x&WLHh0*6¨ڜlDeƙ4 iEP?ĝ .ɞGo.q z_,qǭGRL,9M//cYA/!bW fl[?$yz`ձ+x#1n#Qsʏ(EsΑd)djq$YFaQ^Xq|8'V3]='um\fBٟ|fޒ3 "n{ո%Nq E1"|0S/Q^}ғQE#W<>G83d̉I"O|gaИE.3Iz*4fGrb5cK\3ʘ 2 8f̘KTmn ?~v|}}LJUz(c>Wό-:tD0?Ef%;cq@@}i1Umr;KYfa~uVwQMf_r]lkX7cR{E}Em: O2ƠLjj,#Ԙ#R6`QrZ9zz"]t.ň*a3Lej뉅3Bh&er9Bµ衁+W +Y a斑ALIYyP)m83PLCᵊ!kTjb7(!ha^K vWb4t =IUn%ް3kC`do2۰/bKxQl %yJ+GzR?H2?!r 3hd2#3M$)VQhiuB= @fly€ʞk60 YWWfn7nQ4^7ů4Pn1{ajwCB{>rNsO!^c1T#$|</IbF+f:KxO--tz>8RbʤfƏyMy٘\q3Éd3Rg4Szi6cӴ ŠhMSgJ a4!PSqeo%rS]2kde:e Ѝˠe s9]b1sbM `9PycMҶl|̍41]qyZQiZVRl{*ᣝNjyF "6VX hy V!݋ CRr5+VlhJ;XcvLARQLYβF51R\\Ҵnڰ='SrxA}/`? ٵ)*`G{^42%1e=ǸI"L>P,qkqy&yn2@6Y YI{9SR=rjRMw8' 8g#HxN#uHw鷨BԾf#TÑyn6i}vSfSLUUހh-ߥƛ" ,#f|^igvighlUܰU%RWZ4ŝ^Jtx*,PVk/%#T۴\nmP&:}svx:z8z-xT8Jc]GZPX19 tzh FX m[ W \U* 7%Yf*pEH WflZb,S%6Z\&_J]f@ESXL?9Ͻ&^QgQ4Y5J,[Id]:Mh ]TiN;iZ==du)szs6OdҥsW#,b͞ƒ[3j"D6;lwvĔ唫S. "CoLL&nڅ~MᮑQl  |h^7GMyB QS0ʴߟ;#"|[0zصڹh˗43 KV?-܈ G~@S طURDU"PXeL4~8mp3Lj+0gDW+|jR8a'`Vb^7pmHwfyڇ{2#?m.>Gۀ3zNpV)Q.hʔK@ ͸'J{&c=Nuomk'^&ԫf!NشXʟ}K/^7_w^T1Fw܂/"Ed Z.$WR z1Dd **:Ժ1[2lV?\r6U:+8͜>to=Gv.X?uʼnI 4uZXŸs:{n~ܓoԯFNozd%gWcUމ Cž}h3gnԉ&;Ѽ@;~\/^4zno;*Cwt/ǵ!9._rT|<_x%×(_M|i×iԡ-ɵJ9l`m>zO} &'?wәGGu 2|"r)~\D.D3r ֔Z52*τM>-Z]aiUck<9Rèy>~Y({B)Dz|.0|릾 YR(qP=YbI EF3*z񆜗ZiZ23Os7<~Â[0Tos{^fjL cIJ*&s+m1\Z;=: mƐat+gU8;&.NEA!<>=*ŤVBJx$&xcJm+|J+1vb:3𽦙dZR\o7OS3")XrmzEhf~ghO[.o{kœl.5ۑqI|bm+ȡye]b )[g~bYgJ|[=()_S?5ljkb]2/\?kVUݤqݏ86),5 %3BW*[SiOj1\ؘpERed PTi'ٔVR ř_'6Ӧb`MS(q`oh:AbU-D6wq\L)e3J#:[;p;WYcE1F[+035h/'G:5f6^PJsǴ^L^6io}<- -QZ?hZ"MZvѧ>3>Mt <|5U@U@*@I1٫EEI D 8+4+WxPSdWlT9ti [ϖad>?wPn%n 5+ܒ1왞ig-ctygph2&T {,MhMo׌osql+~-[?3m0'oM̉kf@=̈́WP{*3W2]6FoNʊa;mYOˈXʘԘ1vbS)HGik7Vfc2*,,cr2+PMD$H<0ryI Fdepzk5o"hQڋ}}#=%5-$i-:7ooI995uf+=.?rE`a/@v1 zT^PǢ@P`M1nMGܙ7$W)=OgƭKE?Yų~s7+V3{nYӵnZW=qa4AjXXw|$oY~m2qn6<.':nwz}߶~xÞpxh8)'Ώ)WxNqESμ\87nwōƱKqōD$qy?čyFכwy?ݼRip ?Nf_yM=PH &>#rZ<'8Y)@[m4M[a/SHFEǵ(\i(Hܰ{!7c6RR+FZR3V31͡ C)]`J؉y4./2_a]OC`*@ IJdŋٺ''J_Å Bٖ2cc-|\aEW.Pk2z O5K6e#p+yAڬ}R55x:K}>P=,_$E}λqo)b ҘM B;9B_]UT~M!7 VY=40xU4l *ڽ~y3{5: ok]ծuk݃n![Q$M4a"(.&D|H B􃽣F14O_oY:wn|i'V{Uc%,Yal"M6`d``.)!! eк_urh[7lA1WqC]A8ئUX/vJ:f+ BЕх0bVDEo*Û|DPMgPvhLVR+нf]i~J&rI8w oVh#Ɇ-h>kƓ;oSSV~8s??9vT~tnb. q㘅U`XVEg  Bڐ{CH兔uZs-ukZg b4󜛋wfPT\HWz u% !R"*i!aYpV{j,9̮Li4Vt$'u53H~љƦ%{oTV}/Hͼ.oi<wOn;lu57ծ~[lO 1xzas$1rHW?}nYl-sm0:ejƲ4ռb֦V`V*hvd;d)'Y6/z"{ S O  q\{ a,b14UxZI"N6cnp/jS%۴~^*iNW{.#\ ɪBi2Msba)U9·1]Rr^(/b/zlMN[dR+<0BmEDeUq`&.7^Ղ^SUE et*sm?֠Q7܉`%wFdIRڕME] YPXƪrh84E‡ffFG`1~q'GUbq'"Ƨި} ޛJܩd3JNg UQS6:s$ZB+2 !;z$wq VXqW s=t+[3M2-ZJdz^FzQ 3= /^Ƅ<=ƃQn$ChWm1@EIo\xL]ڄȐoBw3<3ls(?b9mU3co;ӳi`1;=O {``mn~]w{̼9.?-|wsF<#)J=!hxLD uF{)[{#+r6poh^-XpL[Yt"u6lu`U^GW?e;forЮ8y=%'Ce#y'sBz )E?;xc`d```dox~  poD, $ !Mxc`d``[/S @ {TxuMGDQTL**iS31mDfdmErTFE"Y ZU0<99Ϲ7)+PM+09ƋЅKXe<#G p=8f]G7aK6d ;:d<c\^̍1w֢׹4kχ0Pf}iɬc]a~UgM[x +Y^{Nws ~>ޛbtmvߣH|#ĽeEG\#ƵR_:xxّ9Ϙwgl&[jC| 4$E1QjIqq;~U}DPo]ǁV[\iz]Ao^cnbxc``Ё:k&11cRIJ + &l^l;YqpLyW w9  [ߌ;Q]$z VN%|IGd(h 19'$$j$H̐!%U&uOZEz~ W)z)RRPrQzEE%MOejj5&4j?3W_XqDF*yng~9-H8$ 'K$HɤJdIٴ=H':Ӆt#'Mҏ @CE.&yS@!`0a Ǎ")J(F3c<$&3Lc:3,ʘM9s<*Q6=[N81`o~6nV8 ~$)泀T*<1O{i}XL %KYr>45 YZֳ|*g85^Z-1+q/ (I,)*i9sV%ܔLbd}5~pj֔Ŗ{\JSYWC44.eT){nK]꺳: *+Vex-M$k;Loo=xE̱P^V"JLn<I &}X$Njp xI9✗ [g -!"$jIӠ؅ԗ Q_rM-b6A)3[f#f ؾ2#f*01cP ]0oF [S*gsoap-2.8.91/gsoap/doc/fonts/inconsolata-webfont.svg0000755000175000017500000017170113525245160022005 0ustar ellertellert gsoap-2.8.91/gsoap/doc/genivia_content.css0000644000175000017500000000642413525245160020041 0ustar ellertellert/* font face requires Genivia Website fonts */ @font-face { font-family: 'inconsolatamedium'; src: url('../../fonts/inconsolata-webfont.eot'); src: url('../../fonts/inconsolata-webfont.eot?#iefix') format('embedded-opentype'), url('../../fonts/inconsolata-webfont.woff') format('woff'), url('../../fonts/inconsolata-webfont.ttf') format('truetype'), url('../../fonts/inconsolata-webfont.svg#inconsolatamedium') format('svg'); font-weight: normal; font-style: normal; } #titlearea { padding: 0px; margin: 0px; width: 100%; border-bottom: 0px; } div.textblock { margin-left: 10%; margin-right: 10%; } a.el { font-weight: normal; } pre { font-family: inconsolatamedium, monospace, serif !important; font-size: 1em !important; } code { display: inline-block; background-color: #ffe; font-family: inconsolatamedium, monospace, serif !important; margin-top: 1px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; padding-left: 2px; padding-right: 2px; border: 1px solid #ddd; border-radius: 3px; } em code { background-color: #FAFAFA; font-style: normal; } b code { color: hsl(0, 0%, 100%); background-color: hsl(0, 0%, 25%); font-style: normal; font-weight: normal; } td code { border: none; padding: 0px; } div.header { visibility: hidden; } div.toc { padding: 14px 25px; background: #fafafa; border: 1px solid rgba(38, 91, 142, 0.5); border-radius: 7px 7px 7px 7px; float: right; height: auto; margin: 0px 20px 10px 10px; width: 200px; } div.toc h3 { visibility: hidden; } div.alt div.fragment { border: 1px solid rgba(38, 91, 142, 0.5); border-left: 10px solid #000; background-color: #FAFAFA; padding-left: 0px; padding-right: 6px; padding-top: 6px; padding-bottom: 6px; margin-left: 0px; font: 100 1em; line-height: normal; overflow: auto; } div.fragment { border: 1px solid rgba(38, 91, 142, 0.5); border-left: 10px solid #c0504d; background-color: #ffe; padding-left: 10px; padding-right: 6px; padding-top: 6px; padding-bottom: 6px; margin-left: 0px; font: 100 1em; line-height: normal; overflow: auto; } div.line { line-height: normal; } span.lineno { display: none; } pre.fragment { border: 0px; background-color: hsl(0, 0%, 25%); color: hsl(0, 0%, 100%); padding: 6px; margin-left: 0px; font: 100 1em; line-height: normal; overflow: auto; white-space: pre; } table.doxtable { border-collapse: collapse; margin-top: 4px; margin-bottom: 4px; margin-left: 0px; background-color: #ffe; } table.doxtable th { background-color: #c0504d; color: #FFFFFF; font-size: 110%; padding-bottom: 4px; padding-top: 5px; } .navpath ul { font-size: 11px; color: rgba(255, 255, 255, 0.9); background: #c0504d; border: 1px solid #ddd; margin:0px; padding:0px; } .navpath li { list-style-type:none; float:left; padding-left:10px; padding-right:15px; background: #c0504d; color: rgba(255, 255, 255, 0.9); } .navpath li.navelem a { height:32px; display:block; text-decoration: none; outline: none; color: rgba(255, 255, 255, 0.9); text-shadow: none; text-decoration: none; } .navpath li.navelem a:hover { background: #E23232; color: #fff; } gsoap-2.8.91/gsoap/doc/curl/0000755000175000017500000000000013525564137015122 5ustar ellertellertgsoap-2.8.91/gsoap/doc/curl/Doxyfile0000644000175000017500000002321113525245157016625 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "CURL plugin for gSOAP" PROJECT_NUMBER = "2.8 Stable" PROJECT_LOGO = "../GeniviaLogo2_trans_noslogan.png" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../plugin/curlapi.h ../../plugin/curlapi.c FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = ../doxygen_header.html HTML_FOOTER = ../doxygen_footer.html HTML_STYLESHEET = HTML_EXTRA_STYLESHEET = ../genivia_content.css ../genivia_tabs.css HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /opt/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.91/gsoap/doc/databinding/0000755000175000017500000000000013525564137016421 5ustar ellertellertgsoap-2.8.91/gsoap/doc/databinding/Doxyfile0000644000175000017500000002363713525245157020140 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "Data Bindings" PROJECT_NUMBER = "2.8 Stable" PROJECT_LOGO = "../GeniviaLogo2_trans_noslogan.png" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../samples/databinding/README.md ../../samples/databinding/address.h ../../samples/databinding/address.cpp ../../samples/databinding/graph.h ../../samples/databinding/graph.cpp ../../samples/databinding/addressH.h ../../samples/databinding/graphH.h ../../samples/databinding/addressStub.h ../../samples/databinding/graphStub.h FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = YES EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = YES INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = ../doxygen_header.html HTML_FOOTER = ../doxygen_footer.html HTML_STYLESHEET = HTML_EXTRA_STYLESHEET = ../genivia_content.css ../genivia_tabs.css HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = YES TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /opt/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.91/gsoap/doc/wsrm/0000755000175000017500000000000013525564137015145 5ustar ellertellertgsoap-2.8.91/gsoap/doc/wsrm/Doxyfile0000644000175000017500000002350513525245160016650 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "WS-ReliableMessaging" PROJECT_NUMBER = "2.8 Stable" PROJECT_LOGO = "../GeniviaLogo2_trans_noslogan.png" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../plugin/wsrmapi.h ../../plugin/wsrmapi.c ../../plugin/wsaapi.h ../../plugin/wsaapi.c ../../plugin/mq.h ../../plugin/mq.c ../../custom/duration.h ../../custom/duration.c ../../import/wsrm.h ../../import/wsrx.h ../../import/wsa5.h FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = ../doxygen_header.html HTML_FOOTER = ../doxygen_footer.html HTML_STYLESHEET = HTML_EXTRA_STYLESHEET = ../genivia_content.css ../genivia_tabs.css HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /opt/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.91/gsoap/doc/guide/0000755000175000017500000000000013525564140015244 5ustar ellertellertgsoap-2.8.91/gsoap/doc/guide/Doxyfile0000644000175000017500000002322313525245160016752 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "gSOAP User Guide" PROJECT_NUMBER = "2.8" PROJECT_LOGO = ../GeniviaLogo2_trans_noslogan.png OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = NO INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = NO SHOW_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = index.md stdsoap2.h FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = YES EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = ../doxygen_header.html HTML_FOOTER = ../doxygen_footer.html HTML_STYLESHEET = HTML_EXTRA_STYLESHEET = ../genivia_content.css ../genivia_tabs.css HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO TOC_INCLUDE_HEADINGS = 3 DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = YES TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = NO CLASS_GRAPH = NO COLLABORATION_GRAPH = NO UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = NO INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = NO DOT_IMAGE_FORMAT = png DOT_PATH = /opt/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.91/gsoap/doc/guide/index.md0000644000175000017500000305237513525245160016712 0ustar ellertellertgSOAP user guide {#mainpage} ================ [TOC] # User guide
Copyright (c) 2000-2019, Genivia Inc.
All rights reserved.
# Introduction {#intro} The gSOAP toolkit offers C/C++ tools and libraries to implement efficient and secure SOAP, XML, JSON and REST client and service Web API applications. The tools also offer XML data bindings for C and C++ to generate XML serializers to efficiently read and write C/C++ data to and from files and streams. The gSOAP wsdl2h tool consumes WSDL and XSD schema files to converts them to C/C++ source code to implement XML messaging infrastructures. This frees the developer to focus on application functionality rather than on infrastructure. More specifically, the wsdl2h tool consumes WSDLs to generate a C or C++ interface header file, which uses a developer-friendly C/C++ header file syntax. This allows developers to inspect Web services and XML schemas from a functionality point of view, rather than getting bogged down into the underlying SOAP-based infrastructure details of WSDLs and XSDs. The soapcpp2 tool generates all the Web service binding source code with XML serializers necessary to quickly develop server-side and client-side Web service APIs. The soapcpp2 tool can also be used to produce, rather than consume, WSDL and XSD files to deploy XML Web services or to develop XML applications. This approach allows the deployment of legacy C/C++ applications as services. Simply describe the Web API in a C or C++ interface header file for the soapcpp2 tool to generate the C/C++ source code that glues everything together. Besides SOAP-based services, also non-SOAP XML and JSON REST services can be implemented with the gSOAP tools. Either described by WSDLs or by XML schemas converted to C/C++ source code by wsdl2h, or by using the JSON libraries included with gSOAP to develop JSON applications. Furthermore, the gSOAP tools can be just as easily used to develop C/C++ applications that efficiently consume and produce XML by leveraging XML data bindings for C/C++ based on XML schemas. Basically, an XML schema has an equivalent set of C/C++ data types for the components described by the schema. So XML schema strings are just C/C++ strings, XML schema enumerations are C/C++ enums, XML schema complex types are just structs and classes in C/C++, and so on. This enhances the reliability and safety of XML applications, because type-safe serializable C/C++ data types are serialized and validated in XML automatically. This XML data binding means that your XML data is simply represented as C/C++ data. Reading and writing XML is a lot easier than using a DOM or SAX library for XML. This is not more expensive or more complex than it sounds. In fact, the generated XML serializers are very efficient to parse and validate XML and may run more than 30 times faster than validating XML parsers such as Apache Xerces C++. In summary, gSOAP offers a type-safe and transparent approach to develop XML applications that has proven to be quicker to develop (by auto-coding), safer (by XML validation and type-safety), more reliable (by auto-generation of XML test messages and warnings), and higher performing (by efficient serializers and XML parsers generated in C/C++), compared to DOM and SAX libraries. This user guide explains the gSOAP tools and libraries. This user guide and additional documentation for the growing number of gSOAP plugins can be found at . A getting-started guide for developers is available at with a tutorial on common topics at . Various examples ranging from simple calculator service APIs to very large protocols spanning dozens of WSDLs can be found at . For frequently asked questions see for help. 🔝 [Back to table of contents](#) # Notational conventions {#conventions} The typographical conventions used by this document are: * `Courier` denotes C and C++ source code. * `Courier` denotes XML content, JSON content, file and path names, and URIs. * `Courier` denotes HTTP content, text file content, and shell commands with command line options and arguments. The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC-2119. 🔝 [Back to table of contents](#) # Tooling characteristics {#features} * **Safety**: the tools generate type-safe XML serialization functions for native and user-defined C and C++ data structures. * **Protocols**: WSDL 1.1, WSDL 2.0, REST, SOAP 1.1, SOAP 1.2, SOAP RPC encoding style, SOAP document/literal style, SOAP-over-UDP, WS-Security, WS-Addressing, WS-ReliableMessaging, WS-Discovery, WS-Trust, WS-Policy, JSON REST/RPC, XML-RPC, Atom and RSS. JSON is supported as a library bundled with the XML-RPC library to switch between XML-RPC and JSON protocols (since these are similar, speaking data wise). For more details, see the `gsoap/samples/xml-rpc-json` folder in the gSOAP package and the [XML-RPC and JSON](../../xml-rpc-json/html/index.html) documentation. * **SOAP**: implements the full range of SOAP 1.1/1.2 specifications, including RPC encoding and document/literal messaging styles. * **XSD**: supports all XML schema 1.0 and 1.1 schema type constructs and has been tested against the W3C XML Schema Patterns for Databinding Interoperability working group. * **XML**: implements a fast schema-specific XML pull parser that does not require intermediate storage of XML in a DOM to deserialize data. * **HTTP**: HTTP 1.0/1.1 (HTTP 2.0 will be available soon), IPv4 and IPv6, HTTPS (requires OpenSSL or GNUTLS), cookies, authentication, Zlib deflate and gzip compression, and connecting through HTTP proxies. * **Attachments**: MIME (SwA), DIME, and MTOM attachments are supported. Streaming capabilities to direct the data stream to/from resources using user-defined callbacks. gSOAP is the only toolkit that supports streaming MIME, DIME, and MTOM attachment transfers, which allows you to exchange binary data of practically unlimited size in the fastest possible way by streaming, while ensuring the usefulness of XML interoperability. * **Debugging**: compilation of client and service applications in `#DEBUG` mode traces their engine activity for debugging, verifies memory usage (leak detection), and saves message logs for inspection. * **Testing**: `soapcpp2 -T` generates server source code that automatically implements echo message services for testing. The `testmsgr` tool generates XML messages from message templates for server-side and client-side black-box testing, see [Test Messenger](../../testmsgr/html/index.html) documentation. In addition, the soapcpp2 tool generates sample SOAP/XML input and output messages for verification and testing. * **Speed**: the soapcpp2-generated high-performance XML serializers are ideal for building efficient Web services that are compute-intensive and are therefore best written in C or C++. * **Portability**: source code is portable and compiles on Windows, Unix, Linux, Mac OS X, Symbian, VXWorks, and embedded systems that run WinCE, Symbian, embedded Linux, and so on. The memory footprint of gSOAP client and service applications is small. * **Footprint**: input and output buffering is used to increase efficiency and reduce memory usage. Input and output messages are not fully buffered or stored in a DOM unless required or specified. As a result, large messages can be transmitted by low-memory devices. 🔝 [Back to table of contents](#) # API documentation modules {#start-modules} The API documentation is broken down into the following functional documentation [modules](modules.html) that drill down into the lower-level API of macros, functions, context and context variables, plugins and more:
Debugging and loggingThis module defines compile-time flags and functions for run-time debugging and logging
WITH_MACRO compile-time flagsThis module defines the WITH_MACRO compile-time flags to configure the engine build
SOAP_MACRO compile-time valuesThis module defines the SOAP_MACRO compile-time values to configure the engine build
SOAP_MACRO run-time flagsThis module defines the SOAP_MACRO run-time soap_mode flags to set the engine mode
SOAP_MACRO run-time error codesThis module defines the SOAP_MACRO run-time soap_status error codes returned by functions and stored in soap::error
Context with engine stateThis module defines the soap context structure with the engine state and functions to allocate, initialize, copy and delete contexts
Callback functionsThis module defines the callback functions of the soap context to modify its behavior, as is done by plugins
SSL/TLS context and functionsThis module defines functions to set the SSL/TLS context for HTTPS and WS-Security
HTTP and IO functionsThis module defines functions for HTTP operations and functions for receiving and sending data
HTTP cookie functionsThis module defines functions to set and get HTTP cookies at the server side
Conversion functionsThis module defines conversion functions of values of various types to and from strings
XML namespace tablesThis module defines the Namespace XML namespace structure and function to activate a table
Header structure and functionsThis module defines the SOAP_ENV__Header structure and soap_header function to allocate the header
Fault structure and functionsThis module defines the SOAP_ENV__Fault structure and functions to set and get fault information
DIME attachment functionsThis module defines functions to set and get DIME attachments
MIME attachment functionsThis module defines functions to set and get MIME/MTOM attachments
Plugins and plugin registry functionsThis module defines plugin registry functions to register plugins
Thread and mutex functionsThis module defines portable thread and mutex functions
Miscellaneous functionsThis module defines other useful functions
🔝 [Back to table of contents](#) # Getting started {#start} To start using gSOAP, you will need: * The gSOAP software from . Select the gSOAP toolkit commercial edition to download (a download key is provided with the commercial-use license), or download the GPLv2 open source version from SourceForge . * A C or C++ compiler. * OpenSSL (or GNUTLS) and the Zlib libraries to enable SSL (HTTPS) and compression. These libraries are available for most platforms and are often already installed. * Flex and Bison to build the soapcpp2 tool. You can also build soapcpp2 without Bison and Flex installed, see for details. The gSOAP source code package includes: * The `wsdl2h` data binding tool that converts WSDLs and XSDs to generate interface header files for soapcpp2. The source code of the wsdl2h tool is located in `gsoap/wsdl`. * The `soapcpp2` code generation tool that takes an interface header file and generates the C/C++ Web service binding implementation source code. The source code of the soapcpp2 tool is located in `gsoap/src`. * The run-time engine `gsoap/stdsoap2.h` and source code `gsoap/stdsoap2.c` for C and `gsoap/stdsoap2.cpp` for C++. These are compiled into the C libraries `gsoap/libgsoap.a` (without OpenSSL/GNUTLS for SSL/TLS), `gsoap/libgsoapssl.a` (with OpenSSL/GNUTLS for SSL/TLS and with `gsoap/dom.c` for DOM API), and the C++ libraries `gsoap/libgsoap++.a` (without OpenSSL/GNUTLS for SSL/TLS), `gsoap/libgsoapssl++.a` (with OpenSSL/GNUTLS for SSL/TLS and with `gsoap/dom.cpp` for DOM API). There are two more versions of these libraries with HTTP cookies enabled. * Several examples of gSOAP applications and other development tools that are build with wsdl2h and soapcpp2 are located in `gsoap/samples`. * XML DOM API and the domcpp code generation tool located in `gsoap/samples/dom`, see also the [XML DOM API and domcpp](../../dom/html/index.html) documentation. * JSON and XML-RPC libraries and the jsoncpp code generation tool located in `gsoap/samples/xml-rpc-json`, see also the [XML-RPC and JSON](../../xml-rpc-json/html/index.html) documentation. * An XML Web API testing tool located in `gsoap/samples/testmsgr`, see also the [Test Messenger](../../testmsgr/html/index.html) documentation. * Plugins to enhance the capabilities of the engine and to support WS protocols such as WS-Security, WS-Addressing, WS-ReliableMessaging, and WS-Discovery. The plugins are located in `gsoap/plugin` and `gsoap/mod_gsoap`. Most but not all plugins are imported into interface header files for soapcpp2 with the `#import` directive. See also API documentation Module \ref group_plugin. * Custom serializers for several C and C++ types to enhance the capabilities of XML serialization, located in `gsoap/custom`. Custom serializers are imported into interface header files for soapcpp2 with the `#import` directive. This is usually done via a `typemap.dat` file for wsdl2h that specifies bindings for XML schema types to C/C++ types, including custom serializers when desired. The wsdl2h and soapcpp2 tools and the gSOAP libraries are build with `./configure` and `make`, see the download and installation page for the most recent versions of gSOAP and gSOAP software installation details. The examples and other tools are build with `./configure --enable-samples` and `make`. Non-SSL-enabled (that is, not HTTPS capable) versions of the binaries of the wsdl2h and soapcpp2 tools are also included in the gSOAP package in `gsoap/bin` for Windows and Mac OS platforms. The SSL-enabled and HTTPS-capable wsdl2h tool is only available for download from with a commercial-use license and download key. Although gSOAP tools are available in binary format for several platforms, the code generated by these tools is equivalent. This means that the generated source code files can be transferred between platforms and locally compiled. The examples given in this document do not require the libraries of the engine to be build, but rather show the use of the source code: `gsoap/stdsoap2.c` and `gsoap/dom.c` (or `gsoap/stdsoap2.cpp` and `gsoap/dom.cpp` for C++). Using the source code instead of the libraries gives more control when we use the `-DWITH_MACRO` and `-DSOAP_MACRO` compile-time options, see also Modules \ref group_with and \ref group_soap. 🔝 [Back to table of contents](#) ## Where to find examples {#start-examples} Introductory examples can be found online at . Additional examples can be found online at . The gSOAP package also contains numerous examples in the `gsoap/samples` directory. Run `make` inside these directories to build the example applications. The examples are meant to demonstrate basic to advanced features of gSOAP. Some examples are actually development tools and libraries, such as Test Messenger located in `gsoap/samples/testmsgr` to test XML Web APIs, the XML DOM API and domcpp located in `gsoap/samples/dom` to generate XML DOM API source code from XML files, the JSON API and jsoncpp located in `gsoap/samples/xml-rpc-json` to generate JSON API source code from JSON files. Advanced examples include a streaming MTOM attachment server and client application demonstrate high-performance file exchanges, located in `gsoap/samples/mtom-stream`. An SSL-secure Web server application demonstrates the generation of dynamic content for Web browsing and Web services functionality at the same time, located in `gsoap/samples/webservice`. 🔝 [Back to table of contents](#) ## Creating a SOAP/XML client application {#start-client} This section explains the basics to develop a SOAP/XML client application in C and C++. We refer to for additional introductory examples of SOAP/XML, XML REST and JSON applications in C and C++. The wsdl2h tool imports one or more WSDLs and XML schemas and generates a gSOAP interface file for soapcpp2 with familiar C/C++ header file syntax to define the Web service operations and the C/C++ data types. The soapcpp2 tool then takes this header file and generates XML serializers for the data types (`soapStub.h`, `soapH.h`, and `soapC.cpp`), the client-side stub functions (`soapClient.cpp`), and server-side skeleton functions (`soapServer.cpp`). The soapcpp2 tool can also generate WSDL definitions to implement a service from scratch, i.e. without defining a WSDL first. This "closes the loop" in that it enables Web services development from WSDL or directly from a set of C/C++ operations declared as functions in an interface header file for soapcpp2 without the need for users to be experts in WSDL and XSD. You only need to follow a few steps to execute the tools from the command line or using a Makefile (see also MSVC++ project examples in the `gsoap/samples` directory with tool integration in the MSVC++ IDE). For example, to generate code for the calculator Web service, we run the wsdl2h tool from the command line on the URL of the WSDL and use [`wsdl2h -o calc.h` option `-o calc.h`](#wsdl2h-o) to specify the `calc.h` interface file to output: wsdl2h -o calc.h http://www.genivia.com/calc.wsdl This generates the `calc.h` service definition interface file with service operation definitions and types to pass with the operation parameters. This interface file is then input to the soapcpp2 tool to generate the stub and skeleton source code and XML serialization functions. The `calc.h` file includes documentation extracted form the WSDL and introductions to process the file with soapcpp2. You can use Doxygen () to automatically generate the documentation pages for your development from the generated `calc.h` interface file. To generate a markdown report for your client, use `soapcpp2 -r` option `-r` which has more details than the `calc.h` file. In this example we will develop a C++ API for the calculator service. By default, the wsdl2h tool assumes C++ with STL. To build without STL, use [`wsdl2h -s` option `-s`](#wsdl2h-s): wsdl2h -s -o calc.h http://www.genivia.com/calc.wsdl @note Visual Studio IDE users should make sure to compile all gSOAP source code files in C++ compilation mode. If you migrate to a project file `.vcproj`, please set `CompileAs="2"` in your `.vcproj` file. We have not yet generated the stub functions and serializers for our C++ client application to invoke remote service operations. To do so, we run the soapcpp2 tool as follows: soapcpp2 -j -C -Iimport calc.h Option `-j` (and alternatively option `-i`) indicates that we want C++ proxy and server objects that include the client (and server) code, option `-C` indicates client-side only files are generated (soapcpp2 generates both client stub functions and server skeleton functions by default). Option `-I` is needed to import the `stlvector.h` file from the `gsoap/import` directory located in the gSOAP source code package to support serialization of STL vectors, when applicable. We use the generated `soapcalcProxy` class declared and defined in `soapcalcProxy.h` and `soapcalcProxy.cpp`, and `calc.nsmap` XML namespace mapping table to access the Web service. The `soapcalcProxy.h` file includes documentation on the proxy class. The `soapcalcProxy` class is a proxy to invoke the remote service: ~~~{.cpp} // File: calclient.cpp #include "soapcalcProxy.h" #include "calc.nsmap" int main() { calcProxy service; double result; if (service.add(1.0, 2.0, result) == SOAP_OK) std::cout << "The sum of 1.0 and 2.0 is " << result << std::endl; else service.soap_stream_fault(std::cerr); service.destroy(); // delete data and release memory } ~~~ To complete the build, compile the code above and compile this with the generated `soapC.cpp` and `soapcalcProxy.cpp` files, and link the engine with `-lgsoap++`: c++ -o calcclient calcclient.cpp soapcalcProxy.cpp soapC.cpp -lgsoap++ Alternatively, compile `gsoap/stdsoap2.cpp`: c++ -o calcclient calcclient.cpp soapcalcProxy.cpp soapC.cpp stdsoap2.cpp In both cases it is assumed that `stdsoap2.h` and the soapcpp2-generated `soapcalcProxy.h`, `soapStub.h`, `soapH.h`, and `calc.nsmap` files are located in the current directory. Then run the example: ./calcclient The sum of 1.0 and 2.0 is 3 To build a pure C application, use [`wsdl2h -c` option `-c`](#wsdl2h-c) and run `soapcpp2 -C` to generate the client stub functions and serializers: wsdl2h -c -o calc.h http://www.genivia.com/calc.wsdl soapcpp2 -C -Iimport calc.h In this case our code uses a simple C function call to invoke the service and we also need to explicitly delete data and the context with `::soap_end` and `::soap_free`: ~~~{.cpp} // File: calclient.c #include "soapH.h" // include the generated declarations #include "calc.nsmap" // include the generated namespace table int main() { struct soap *soap = soap_new(); double result; if (soap_call_ns__add(soap, 1.0, 2.0, &result) == SOAP_OK) printf("The sum of 1.0 and 2.0 is %lg\n", result); else soap_print_fault(soap, stderr); soap_destroy(soap); // delete managed objects soap_end(soap); // delete managed data and temporaries soap_free(soap); // finalize and delete the context } ~~~ To complete the build, compile the code above and compile this with the generated `soapC.c` and `soapClient.c` files, and link the engine with `-lgsoap`: cc -o calcclient calclient.c soapClient.c soapC.c -lgsoap Alternatively, compile `gsoap/stdsoap2.c`: cc -o calcclient calclient.c soapClient.c soapC.c stdsoap2.c In both cases it is assumed that `stdsoap2.h` and the soapcpp2-generated `soapStub.h`, `soapH.h`, and `calc.nsmap` files are located in the current directory. Then run the example: ./calcclient The sum of 1.0 and 2.0 is 3 The calculator example is fairly simple and used here to illustrate the development steps from code generation to running the application. The development steps for large-scale XML applications is similar. See for additional introductory examples of SOAP/XML, XML REST and JSON applications in C and C++. See and the examples located in the gSOAP source code package in the `gsoap/samples` directory. 🔝 [Back to table of contents](#) ## Creating a SOAP/XML service application {#start-service} This section explains the basics to develop a SOAP/XML service application in C and C++. We refer to for additional introductory examples of SOAP/XML, XML REST and JSON applications in C and C++. Developing a service application is easy. In this example we will demonstrate a service deployed with the Common Gateway Interface (CGI) because it is a simple mechanism. This is not the preferred deployment mechanism. Because CGI is slow and stateless. FastCGI improves the speed of CGI applications, but is still stateless. Faster services can be developed as a stand-alone gSOAP HTTP/HTTPS servers as explained in this section further below. To deploy services in a public and possibly hostile environment, we recommend the use of Apache module or IIS ISAPI extension to manage and protect services. An Apache module plugin and ISAPI extension plugin is included in the gSOAP package under `gsoap/mod_gsoap`. For details, see: * [gSOAP Apache module](../../apache/html/index.html) documentation * [gSOAP ISAPI extension](../../isapi/html/index.html) documentation To deploy gSOAP stand-alone services in a public environment make sure to protect your service application as explained in Sections \ref safety and \ref timeout. See also our tutorials with instructions to protect your online gSOAP Web APIs. Let's get started. Suppose we want to implement a simple CGI-based service that returns the time in GMT. For this example we start with an interface header file for soapcpp2, `currentTime.h` which contains the service definitions. Such a file can be obtained from a WSDL using wsdl2h when a WSDL is available. When a WSDL is not available, you can define the service in C/C++ definitions in a newly created interface header file and let the soapcpp2 tool generate the source code and WSDL for you. The `currenTime` service operation of our Web service has only one output parameter, which is the current time defined in our `currentTime.h` service specification: ~~~{.cpp} // File: currentTime.h //gsoap ns service name: currentTime //gsoap ns service namespace: urn:currentTime //gsoap ns service location: http://www.yourdomain.com/currentTime.cgi int ns__currentTime(time_t& response); ~~~ Note that we associate an XML namespace prefix `ns` and namespace name `urn:currentTime` with the service WSDL and SOAP/XML messages. The gSOAP tools use a special convention for identifier names that are part of a namespace: a namespace prefix (`ns` in this case) followed by a double underscore `__`. This convention is used to resolve namespaces and to avoid name clashes. The `ns` namespace prefix is bound to the `urn:currentTime` namespace name with the `//gsoap` directive. The `//gsoap` directives are used to set the properties of the service, in this case the name, namespace, and location endpoint. The service implementation for CGI simply requires a `::soap_serve` call on a `::soap` context created with `::soap_new`. The service operations are implemented as functions, which are called by the service skeleton functions via the service request dispatcher `::soap_serve`: ~~~{.cpp} // File: currentTime.cpp #include "soapH.h" // include the generated declarations #include "currentTime.nsmap" // include the generated namespace table int main() { // create soap context and serve one CGI-based request: struct soap *soap = soap_new1(SOAP_XML_INDENT); soap_serve(soap); soap_destroy(soap); // delete managed class instances soap_end(soap); // delete managed data and temporaries soap_free(soap); // finalize and free the context } int ns__currentTime(struct soap *soap, time_t& response) { response = time(0); return SOAP_OK; } ~~~ Note that we pass the `::soap` context with the engine context information to the service operation function as the first argument. The `::soap` context comes in handy to determine properties of the connection and to dynamically allocate data with `::soap_malloc` or with the generated `soap_new_T` functions for serializable types `T` that will be automatically deleted by calling `::soap_destroy` and `::soap_end` when the service operation is done and the service loop rolls over. We run the soapcpp2 tool on the header file to generate the server-side code: soapcpp2 -S currentTime.h and then compile the CGI binary: c++ -o currentTime.cgi currentTime.cpp soapServer.cpp soapC.cpp stdsoap2.cpp To activate the service, copy the `currentTime.cgi` binary to your `bin-cgi` directory and set the proper file permissions. The soapcpp2 tool generated the WSDL definitions `currentTime.wsdl`. You can use the WSDL to advertise your service. You don't need to use this WSDL to develop a gSOAP client. You can use the `currentTime.h` file with `soapcpp2 -C` option `-C` to generate client-side code. Since CGI is very simple, a convenient aspect of CGI is that it exchanges messages over standard input and output. Therefore, you can run the CGI binary on the auto-generated example request XML file `currentTime.currentTime.req.xml` to test your server: ./currentTime.cgi < currentTime.currentTime.req.xml and this displays the HTTP server response: Status: 200 OK Server: gSOAP/2.8 X-Frame-Options: SAMEORIGIN Content-Type: text/xml; charset=utf-8 Content-Length: 460 Connection: close ~~~{.xml} 2018-10-25T17:17:03Z ~~~ The above approach works also for C. Just use `soapcpp2 -c -S` option `-c` in addition to the `-S` option to generate C code. Of course, in C we use pointers instead of references and the `currentTime.h` file should be adjusted to use C syntax and types. Run `soapcpp2 -r -c -S` option `-r` to generate a `soapReadme.md` report. This report includes many details about the service operations and serializable C/C++ data types declared in the interface header file. This markdown file can be converted to HTML or other document formats with tools such as [Doxygen](www.doxygen.org). A more elegant server implementation in C++ can be obtained by using `soapcpp2 -j -S` option `-j` (or option `-i`) to generate C++ client-side proxy and server-side service objects as classes that you can use to build clients and services in C++. The option removes the generation of `soapClient.cpp` and `soapServer.cpp`, since these are no longer needed when we have classes that implement the client and server logic: soapcpp2 -j -S currentTime.h This generates `soapcurrentTimeService.h` and `soapcurrentTimeService.cpp` files, as well as auxiliary files `soapStub.h`, `soapH.h`, and `soapC.cpp` and `currentTime.nsmap`. The `soapcurrentTimeService.h` file includes documentation on the service class. Now using the `currentTimeService` class we can improve the CGI service application: ~~~{.cpp} // File: currentTime.cpp #include "soapcurrentTimeService.h" // include the proxy declarations #include "currentTime.nsmap" // include the generated namespace table int main() { // create server and serve one CGI-based request: currentTimeService server(SOAP_XML_INDENT); server.serve(); server.destroy(); } int currentTimeService::currentTime(time_t& response) { response = time(0); return SOAP_OK; } ~~~ We compile this with: c++ -o currentTime.cgi currentTime.cpp soapcurrentTimeService.cpp soapC.cpp stdsoap2.cpp and install the binary as a CGI application. To run the server as a stand-alone iterative (i.e. non-multi-hreaded) server on port 8080 until a the accept times out or an error occurs: ~~~{.cpp} if (server.run(8080) != SOAP_OK) server.soap_stream_fault(std::cerr); ~~~ To run the server as a stand-alone iterative server on port 8080 while ignoring common errors until a TCP occurs: ~~~{.cpp} while (server.run(8080) != SOAP_OK) { if (server.soap->error == SOAP_TCP_ERROR) break; server.soap_stream_fault(std::cerr); } ~~~ To implement stand-alone and multi-threaded services, see Sections \ref stand-alone and \ref mt. These stand-alone Web Services handle multiple SOAP requests by spawning a thread for each request. Thread pooling is also an option. The use of Apache modules and ISAPI extensions to deploy gSOAP services is recommended to ensure load balancing, access control, tracing, and so on. For more information on server-side service classes, see Section \ref object . For more information on client-side proxy classes, see Section \ref proxy . See for additional introductory examples of SOAP/XML, XML REST and JSON applications in C and C++. See and the gSOAP source code package `gsoap/samples` for more examples. 🔝 [Back to table of contents](#) # Introduction to XML data bindings {#databindings} This section is a basic introduction to XML data bindings in C/C++. Because gSOAP offers many options to implement XML data bindings, we wrote a separate [C and C++ XML data bindings](../../databinding/html/index.html) document on this topic that contains an in-depth discussion of XML schema mappings to C/C++ types, using wsdl2h with `typemap.dat` to customize these bindings, memory management to allocate and release serializable types, and how to use [soapcpp2 options](#soapcpp2options) to generate deep data structure copy and delete functions for serializable types. Basically, the C/C++ XML data binding in gSOAP provides and automated mechanism to serialize any C and C++ data structure in XML and to deserialize XML back into C/C++ data structures. To facilitate XML data bindings, a WSDL or an XML schema (XSD file) can converted with wsdl2h into a set of serializable C or C++ data type declarations. These C/C++ type declarations can be readily incorporated into your application to manipulate XML directly as C/C++ data structures with much more ease than DOM or SAX. For example, XML schema strings are just C/C++ strings, XML schema enumerations are C/C++ enums, XML schema complex types are just structs or classes in C/C++, and so on. In this way, an automatic mapping between XML elements of the XML schema and members of a class is created. No DOM traversals and SAX events are needed. More importantly, the XML C/C++ data binding makes XML manipulation type safe. That is, the type safety of C/C++ ensures that only valid XML documents can be parsed and generated. The wsdl2h tool performs the mapping of WSDL and XML schemas to C and/or C++ automatically. The output of wsdl2h is a "data binding interface file" which is simply an annotated C/C++ header file with the serializable C/C++ data types that represent XML schema components. This file also includes comments and documentation of the serializable data types. For WSDLs, also functions are declared in this interface file that represent XML Web services operations. Let's illustrate XML data bindings with an example. Suppose we have an XML document with a book record:
~~~{.xml} Farewell John Doe ABC's is our Name ~~~
An example XML schema (XSD file) that defines the book element and type could be:
~~~{.xml} ~~~
Now, using wsdl2h we translate this XML schema that defines the book type and root element into a C++ class definition: ~~~{.cpp} class book { public: @ ULONG64 isbn; std::string title; std::string publisher; }; ~~~ Note that annotations such as `@` are used to distinguish attributes from elements. These annotations are gSOAP-specific and are handled by the soapcpp2 tool that reads this generated interface file and generates the XML data binding implementation with serializers for the data types declared in the interface file. That is, the soapcpp2 tool generates all the necessary code to parse and generate XML for `book` objects. Validation constraints such as `minOccurs="1"` and `use="required"` are included in the generated code as checks that are enforced with the `#SOAP_XML_STRICT` flag. To write the XML representation of a book object instantiated in our C++ application, we first create a `::soap` engine context and use it with `soap_write_book` (a function generated by soapcpp2) to write the object in XML to standard output: ~~~{.cpp} struct soap *soap = soap_new1(SOAP_XML_INDENT); // new context book bk; bk.isbn = 1234567890; bk.title = "Farewell John Doe"; bk.publisher = "ABC's is our Name"; if (soap_write_book(soap, &bk) != SOAP_OK) ... // error soap_destroy(soap); // delete managed class instances soap_end(soap); // delete managed data and temporaries soap_free(soap); // finalize and free the context ~~~ The `::soap` context holds the engine state and run-time flags, such as `#SOAP_XML_INDENT`, serialization options, and other I/O settings. This means that we can simply set the output file descriptor `int ::soap::sendfd` or output stream `std::ostream* ::soap::os` of the context to redirect the content to a file or string. Also, when serializing a graph with `#SOAP_XML_GRAPH` rather than an XML tree, the XML output contains id-ref attributes to reference nodes in the XML graph, similar to the way SOAP encoding with multi-reference id-ref/href works, see Section \ref bindings for details. To read the XML representation from standard input into a book class instance: ~~~{.cpp} struct soap *soap = soap_new1(SOAP_XML_STRICT); // new context book bk; if (soap_read_book(soap, &bk) != SOAP_OK) ... // error else cout << bk.isbn << ", " << bk.title << ", " << bk.publisher << endl; ... // further use of bk soap_destroy(soap); // delete managed class instances soap_end(soap); // delete managed data and temporaries soap_free(soap); // finalize and free the context ~~~ Automatic built-in strict XML validation is enabled with `#SOAP_XML_STRICT`, which ensures that data members are present so we can safely print them in this example, thus ensuring consistency of data with the XML schema. We can set the `int ::soap::recvfd` file descriptor or the `std::istream* ::soap::is` input stream to read from a file or string stream instead of stdin. The `::soap_destroy` and `::soap_end` calls deallocate the deserialized data, so use these with care. Memory management is automatic in gSOAP to avoid leaks. The above example uses a very simple example schema. The gSOAP toolkit handles all XML schema constructs defined by the XML schema standard. The toolkit is also able to serialize pointer-based C/C++ data structures, including cyclic graphs, structs/classes, unions, enums, STL containers, and even special data types such as `struct tm`. Therefore, the toolkit works in two directions: from WSDL/schema to C/C++ and from C/C++ to WSDL/schema. The gSOAP toolkit also handles multiple schemas defined in multiple namespaces. Normally the namespace prefixes of XML namespaces are added to the C/C++ type definitions to ensure type uniqueness. For example, if we would combine two schemas in the same application where both schemas define a `book` object, we need to resolve this conflict. In gSOAP this is done using namespace prefixes, rather than C++ namespaces (research has pointed out that XML namespaces are not equivalent to C++ namespaces). Thus, the `book` class might actually be bound to an XML namespace and the class would be named `ns__book`, where `ns` is bound to the corresponding namespace. For example, the following run-time flags are available to control serialization as an XML tree or graph: ~~~{.cpp} struct soap *soap = soap_new(); soap_set_mode(soap, SOAP_XML_TREE); // use this for XML without id-ref (no cycles!) soap_set_mode(soap, SOAP_XML_GRAPH); // or use this for XML with id-ref (including cycles) ~~~ Other flags can be used to format XML, see Section \ref flags . For more details on XML databinding support for C and C++, see Section \ref bindings and the [C and C++ XML data bindings](../../databinding/html/index.html) document. 🔝 [Back to table of contents](#) # A quick user guide {#guide} This section of the user guide presents a quick overview to get started with gSOAP. In principle, XML SOAP and REST clients and services can be developed in C and C++ with the soapcpp2 tool without a detailed understanding of XML, XML schema, WSDL, and the XML SOAP protocol. 🔝 [Back to table of contents](#) ## How to build Web API clients {#client} The implementation of a client application that invokes remote service operations by serializing application data in XML for the remote operation request, also called XML marshalling in remote procedure calling. This requires a "stub function", also called "service proxy", for each service operation that the client invokes. The primary stub's responsibility is to serialize the parameter data in XML, send the request with the parameters to the designated SOAP service over the wire, to wait for the response, and to deserialize the parameter data of the response when it arrives. With the stub function in place, the client application invokes a remote service operation as if it would invoke a local function. To write a client stub function in C or C++ by hand is a tedious task, especially if the input and output parameters of a service operation contain elaborate data structures that must meet XML validation constraints. Fortunately, the wsdl2h tool and soapcpp2 tool automate the development of SOAP/XML Web service client and server applications. The soapcpp2 tool generates the necessary gluing code (the client stub functions and server skeleton functions) to build web service clients and services. The input to the soapcpp2 tool consists of an interface file with familiar C/C++ header file syntax. This interface header file can be automatically generated from a WSDL (Web Service Description Language) documentation of a service with the gSOAP wsdl2h tool. The following command: wsdl2h -o calc.h http://www.genivia.com/calc.wsdl generates the `calc.h` interface header file for soapcpp2. The WSDL specification may consist of multiple imported WSDL files and XSD schema files. The WSDLs and XSDs are then translated to C or C++, replacing WSDL service operation by C/C++ functions and XML schema data types by C/C++ data types. To generate C code, we use [`wsdl2h -c` option `-c`](#wsdl2h-c): wsdl2h -c -o calc.h http://www.genivia.com/calc.wsdl For more details on the wsdl2h tool and its options, see Section \ref wsdlin . When upgrading gSOAP to a newer version it is often not necessary to perform this first step again, since newer versions are backward compatible to previous interface header files generated by wsdl2h. Looking into the file `calc.h` we see that the SOAP service methods are specified as function prototypes. For example, the `add` function to add two doubles is declared as: ~~~{.cpp} int ns2__add(double a, double b, double& result); ~~~ The `ns2__add` function uses an XML namespace prefix to distinguish it from operations defined in other namespaces, thus nicely preventing name clashes in this way. The convention to add an XML namespace prefix to the names of operations, types, and `struct` and `class` members is universally used by the gSOAP tools and automatically added by wsdl2h. Next, the `calc.h` header file is input to the soapcpp2 tool to generate the gluing code's logic to invoke the Web service from a client application: soapcpp2 calc.h The function prototypes in `calc.h` are converted by the soapcpp2 tool to stub functions for remote calls: * `soapStub.h` annotated copy of the header file's definitions. * `soapH.h` XML serializers declarations * `soapC.cpp` XML serializers implementations * `soapClient.cpp` the client calling stub functions The logic of the generated `soapClient.cpp` stub functions allow client applications to seamlessly interact with existing SOAP Web services as illustrated by the client code example in the next section. The input and output parameters of a service operation may be primitive data types or compound data types, such as containers and pointer-based linked data structures. These are defined in the interface header file, which is either generated by the wsdl2h tool or it may be specified by hand. The soapcpp2 tool automatically generates XML serializers and XML deserializers for these data types to enable the generated stub functions to serialize the contents of the parameters of the service operations in XML. The soapcpp2 tool also generates "skeleton functions" `soapServer.cpp` for each of the service operations specified in the interface header file. The skeleton functions can be readily used to implement one or more of the service operations in a new XML Web service. To develop C++ client applications, a useful option to use with soapcpp2 is `-j` to generate proxy classes to invoke services, instead of global functions: soapcpp2 -j calc.h The function prototypes in `calc.h` are converted by the soapcpp2 tool to the following function: * `soapStub.h` annotated copy of the header file's definitions. * `soapH.h` XML serializers declarations * `soapC.cpp` XML serializers implementations * `soapcalcProxy.h` the client proxy class * `soapcalcProxy.cpp` the client proxy class implementation To use the proxy class, `#include "soapcalcProxy.h"` and compile and link `soapcalcProxy.cpp`. See the following section. 🔝 [Back to table of contents](#) ### Example {#example1} The `add` service operation declared in the `calc.h` file obtained with the wsdl2h tool in the previous section, adds two doubles. The WSDL description of the service provides the endpoint to invoke the service operations and the XML namespace used by the operations: * Endpoint URL: `http://websrv.cs.fsu.edu/~engelen/calcserver.cgi` * XML namespace: `urn:calc` Each SOAP-specific service operation also has a "SOAP action", which is an optional string to identify the operation, which is mainly used with WS-Addressing. The request and response messages for SOAP RPC-encoded services are simply represented by C functions with input and output parameters. For the `add` operation, the SOAP binding details are: * SOAP style: RPC * SOAP encoding: encoded * SOAP action: "" This information is translated to the wsdl2h-generated interface header file with the service definitions. The `calc.h` header file for C++ generated by wsdl2h contains the following directives and declarations: ~~~{.cpp} //gsoap ns2 schema namespace: urn:calc //gsoap ns2 schema form: unqualified //gsoap ns2 service name: calc //gsoap ns2 service type: calcPortType //gsoap ns2 service port: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns2 service namespace: urn:calc //gsoap ns2 service transport: http://schemas.xmlsoap.org/soap/http //gsoap ns2 service method-protocol: add SOAP //gsoap ns2 service method-style: add rpc //gsoap ns2 service method-encoding: add http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: add "" int ns2__add(double a, double b, double& result); ~~~ The actual contents may vary depending on the release version and the options used to control the output. The other calculator service operations are similar and were elided for clarity. The `//gsoap` directives are interpreted by the soapcpp2 tool to generate code that is compliant to the SOAP protocol. For this service the SOAP protocol with the "SOAP 1.1 RPC encoding style" is used. This produces XML messages with the familiar SOAP envelope and body in the SOAP 1.1 namespace and a `SOAP-ENV:encodingStyle` attribute for SOAP RPC encoding (a simple XML serialization format) as can be seen in the XML request message:
~~~{.xml} ~~~{.xml} 1.0 2.0 ~~~
REST instead of SOAP is specified with `HTTP` instead of `SOAP` with the `//gsoap service method-protocol:` directive to carry our XML messages using the HTTP POST method without a SOAP envelope: ~~~{.cpp} //gsoap ns2 service method-protocol: add HTTP int ns2__add(double a, double b, double& result); ~~~ This produces non-SOAP XML messages with HTTP POST. For example:
~~~{.xml} 1.0 2.0 ~~~
Likewise you can specify `POST`, `PUT`, and `GET` HTTP methods for direct XML messaging instead of `SOAP`. However, all XML Web services protocols such as WS-Security and WS-Addressing require SOAP to include the SOAP Headers. Note that the function declaration itself and the client-side calling stub and server-side skeleton functions are unchanged. The internals of the generated functions are changed to accommodate the protocol specified with the directives. For more details about the `//gsoap` directives, see Section \ref directives . So as you can see, the Web service operations are declared as function prototypes. When the parameters of the function are structs and classes, then all of these interdependent data types are included in the wsdl2h-generated header file. In this simple example the parameters are primitive types. The calculator `add` operation takes two double floats `a` and `b`, and returns the sum in `result`. By convention, all parameters are input parameters except the last parameter which is an output parameter or specified as `void` for one-way messages. The last parameter is always a single output parameter, if not `void`. A `struct` or `class` is used to wrap multiple output parameters, see also Section \ref multiple . This last parameter must be a pointer or reference. By contrast, the input parameters support pass by value or by pointer, but not pass by C++ reference due to complications when generating compilable source code for the stub and skeleton functions. The function prototype associated with a service operation always returns an `int`. The return value indicates success with `#SOAP_OK` (zero) or failure with a nonzero value. See Section \ref errcodes for the error codes. The role of the namespace prefix (`ns2__`) in the service operation name specified as a function prototype associates an XML namespace with the service operation as a qualified name, i.e. qualified by means of a namespace prefix. This is discussed in detail in Section \ref namespace . Basically, the namespace prefix is added to a function name or type name with a pair of underscores, as in `ns2__add`, where `ns2` is the namespace prefix and `add` is the service operation name. This mechanism ensures uniqueness of operations and types associated with a service. When using wsdl2h it is strongly recommended to set the namespace prefix to a name of your choice by modifying the `typemap.dat` file that is used by wsdl2h. This file can be copied from `gsoap/typemap.dat` and modified in the local directory where you run wsdl2h. This avoids problems when running wsdl2h on multiple WSDLs where the sequence of prefixes `ns1`, `ns2`, and so on are arbitrarily assigned to the services. To choose a prefix name for all the operations and types of a service, say prefix `c__` for the calculator service, add the following line to `typemap.dat`: c = "urn:calc" and rerun wsdl2h. Moreover, the `typemap.dat` configures wsdl2h to use specific bindings and data types for services. The result is that `c__add` is used to uniquely identify the operation rather than the more arbitrary name `ns2__add`. A note on the use of underscores in names: a single underscore in an identifier name will be translated into a dash in XML, because dashes are more frequently used in XML compared to underscores, see Section \ref idtrans . Double underscores separate the namespace prefix from the unqualified part of the qualified name. Next, the soapcpp2 tool is invoked from the command line to process the `calc.h` service definitions: soapcpp2 calc.h The tool generates the client stub functions for the service operations. Stub functions can be invoked by a client program to invoke the remote service operations. The interface of the generated stub function is identical to the function prototype in the `calc.h` service definition file, but with additional parameters to pass the engine's context `::soap`, an endpoint URL (or NULL for the default), and a SOAP action (or NULL for the default): ~~~{.cpp} int soap_call_c__add(struct soap *soap, char *URL, char *action, double a, double b, double& result); ~~~ This stub function is saved in `soapClient.cpp`. The file `soapC.cpp` contains the serializer and deserializer functions for the data types used by the stub. You can use [`wsdl2h -c` option `-c`](#wsdl2h-c) to generate pure C code. Likewise, `soapcpp2 -c` option `-c` generates pure C code, if the input interface file is written in C of course. The `::soap` parameter of the stub function shown above must be a valid pointer to a `::soap` context. The `URL` parameter when non-NULL overrides the default endpoint address defined by the WSDL and the `//gsoap service port:` directive. The `action` parameter when non-NULL overrides the default SOAP action defined by the WSDL and the `//gsoap service method-action:` directive. The following example C/C++ client program uses the generated stub function to invoke the remote service operation: ~~~{.cpp} #include "soapH.h" // include the generated declarations #include "calc.nsmap" // include the generated namespace table int main() { double sum; struct soap *soap = soap_new(); // the context if (soap_call_c__add(soap, NULL, NULL, 1.0, 2.0, &sum) == SOAP_OK) std::cout << "Sum = " << sum << std::endl; else // an error occurred soap_print_fault(soap, stderr); // display the SOAP fault message on the stderr stream soap_destroy(soap); // delete managed class instances soap_end(soap); // delete managed data and temporaries soap_free(soap); // finalize and free the context return 0; } ~~~ The `soap_call_c__add` call returns `#SOAP_OK` (zero) on success and a nonzero error on failure. When an error occurred you can print the fault message with the `soap_print_fault(struct soap*, FILE*)` function. Use `soap_sprint_fault(struct soap*, char *buf, size_t len)` to save the fault message to a string buffer `buf[0...len-1]`. Use `soap_stream_fault(struct soap*, std::ostream&)` to send the fault message to a stream. The following functions are used to explicitly set up a `::soap` context and finalize it: * `soap_new()` allocates, initializes, and returns a pointer to a new `::soap` context. * `soap_new1(soap_mode mode)` allocates, initializes and sets both in- and out-mode flags to the same mode, and returns a pointer to a new `::soap` context. * `soap_new2(soap_mode imode, soap_mode omode)` allocates, initializes and sets in- and out-mode flags, and returns a pointer to a new `::soap` context. * `soap_copy(struct soap*)` allocates and returns a new context by copying the given context with `::soap_copy_context`, such that the new context returned does not share any data with the given context. * `soap_init(struct soap*)` initializes a stack-allocated `::soap` context in C, when not using `::soap_new`, for C++ use the `::soap` constructors instead. * `soap_init1(struct soap*, soap_mode mode)` initializes a stack-allocated `::soap` context, when not using `::soap_new1`, and sets both in- and out-mode flags to the same mode, for C++ use the `::soap` constructors instead. * `soap_init2(struct soap*, soap_mode imode, soap_mode omode)` initializes a stack-allocated `::soap` context, when not using `::soap_new2`, and sets in- and out-mode flags, for C++ use the `::soap` constructors instead. * `soap_done(struct soap*)` finalizes a context but does not delete the specified `::soap` context (for example when stack-allocated). The context can be re-initialized afterwards with `::soap_init`. In C++, a stack-allocated context invokes this function in its destructor when the context is deleted. * `soap_free(struct soap*)` finalizes and deletes the given context, when created with `::soap_new` or `::soap_copy`. A `::soap` context can be reused as many times as necessary and does not need to be reinitialized when doing so. However, a new context is required for each thread that runs independently to guarantee exclusive access to a `::soap` context by each thread. Also the use of any client calls within an active service operation implemented at the server side requires a new context, since `::soap_serve` is still processing with the current `::soap` context that must be maintained while the service operation and response has not been completed yet. The soapcpp2 code generator tool generates a service proxy class for C++ client applications (and service objects for server applications) with the `soapcpp2 -j` option `-j` (or `-i` option): soapcpp2 -j calc.h The proxy is defined in: * `soapcalcProxy.h` client proxy class * `soapcalcProxy.cpp` client proxy class Without the `-j` option, C-like `soapClient.cpp` and `soapServer.cpp` source codes are is generated. Use option `-i` as an alternative to `-j` to generate classes with the same functionality, but that are inherited from the `::soap` struct. With the `-j` option, the `::soap` engine context is a pointer member of the generated proxy and service classes and can therefore be shared with other proxy or service class instances. The choice of option to use is application-dependent, but the choice is also important when services are chained to serve requests on the same server port, see Section \ref chaining . The generated C++ proxy class initializes the context and offers the service interface as a collection of methods: ~~~{.cpp} #include "soapcalcProxy.h" // get proxy #include "calc.nsmap" // include the generated namespace table int main() { calcProxy calc(SOAP_XML_INDENT); double sum; if (calc.add(1.0, 2.0, sum) == SOAP_OK) std::cout << "Sum = " << sum << std::endl; else calc.soap_stream_fault(std::cerr); calc.destroy(); return calc.soap->error; // nonzero when error } ~~~ The proxy constructor takes context mode parameters to initialize the context, e.g. `#SOAP_XML_INDENT` in this example. The code is compiled and linked with `soapcalcProxy.cpp`, `soapC.cpp`, and `gsoap/stdsoap2.cpp`. The proxy class name is extracted from the WSDL content and may not always be in a short format. You can change this directive to customize the service name: ~~~{.cpp} //gsoap c service name: calc ~~~ then rerun soapcpp2 to generate code that uses the new name. When the example client application is invoked, a SOAP request is performed: POST /~engelen/calcserver.cgi HTTP/1.1 Host: websrv.cs.fsu.edu User-Agent: gSOAP/2.8 Content-Type: text/xml; charset=utf-8 Content-Length: 464 Connection: close SOAPAction: ""
~~~{.xml} 1 2 ~~~
The SOAP response message is: HTTP/1.1 200 OK Date: Wed, 05 May 2010 16:02:21 GMT Server: Apache/2.0.52 (Scientific Linux) Content-Length: 463 Connection: close Content-Type: text/xml; charset=utf-8
~~~{.xml} 3 ~~~
A client can invoke a sequence of service operations, like so: ~~~{.cpp} #include "soapcalcProxy.h" // get proxy #include "calc.nsmap" // include the generated namespace table int main() { calcProxy calc(SOAP_IO_KEEPALIVE); // keep-alive improves connection performance double sum = 0.0; double val[] = { 5.0, 3.5, 7.1, 1.2 }; for (int i = 0; i < 4; i++) if (calc.add(sum, val[i], sum)) return calc.soap->error; std::cout << "Sum = " << sum << std::endl; calc.destroy(); return 0; } ~~~ In the example shown above, no deserialized data is deallocated until `calc.destroy()`. To deallocate deserialized data between the calls we change the loop as follows: ~~~{.cpp} for (int i = 0; i < 4; i++) { if (calc.add(sum, val[i], sum)) return calc.soap->error; calc.destroy(); } ~~~ Deallocation is safe here, since the float values were copied and saved in `sum`. In other scenarios we should make sure data is copied to local data structures when the data should be preserved. There are tooling options for deep copy and delete of entire data structures to simplify this task, see Section \ref deep. To delegate deletion to another context for later removal, use `soap_delegate_deletion(struct soap *soap_from, struct soap *soap_to)`. For example: ~~~{.cpp} struct soap soap; soap_init(&soap); { // create proxy calcProxy calc; ... // data produced, e.g. deserialized data with client-side calls soap_delegate_deletion(&calc, &soap); calc.destroy(); } ... // data can still be used soap_destroy(&soap); // delete managed class instances soap_end(&soap); // delete managed data and temporaries soap_done(&soap); // finalize the context ~~~ In C we use [`wsdl2h -c` option `-c`](#wsdl2h-c) to generate C. The example client calculator program would be written as: ~~~{.cpp} #include "soapH.h" #include "calc.nsmap" int main() { struct soap soap; double sum = 0.0; double val[] = { 5.0, 3.5, 7.1, 1.2 }; int i; soap_init1(&soap, SOAP_IO_KEEPALIVE); for (i = 0; i < 4; i++) if (soap_call_c__add(&soap, NULL, NULL, sum, val[i], &sum)) return soap.error; printf("Sum = %lg\n", sum); soap_end(&soap); soap_done(&soap); return 0; } ~~~ The code above is compiled and linked with the soapcpp2-generated `soapClient.c` and `soapC.c` files, and `gsoap/stdsoap2.c` (or compile with `-bgsoap`). 🔝 [Back to table of contents](#) ### XML namespace considerations {#namespace} The declaration of the `ns2__add` function prototype discussed in the previous section uses the namespace prefix `ns2__` of the service operation XML namespace, which is distinguished by a pair of underscores in the function name to separate the namespace prefix from the service operation name. The purpose of a namespace prefix is to associate a service operation name with a service in order to prevent naming conflicts, e.g. to distinguish identical service operation names used by different services. Note that the XML response of the service example uses a namespace prefix that may be different (e.g. `ns`) as long as it bound to the same namespace name `urn:calc` through the `xmlns:ns="urn:calc"` binding. The use of namespace prefixes and namespace names is also required to enable SOAP applications to validate the content of SOAP messages. The namespace name in the service response is verified by the stub function by using the information supplied in a namespace mapping table that is required to be part of gSOAP client and service application codes. The table is accessed at run time to resolve namespace bindings, both by the generated stub's data structure serializer for encoding the client request and by the generated stub's data structure deserializer to decode and validate the service response. The namespace mapping table should not be part of the header file input to the soapcpp2 tool. Service details including namespace bindings may be provided with gSOAP directives in a header file, see Section \ref directives . The namespace mapping table is: ~~~{.cpp} struct Namespace namespaces[] = { // { "prefix", "URI", "URI-pattern" (optional) } { "SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/"}, // must be first { "SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/"}, // must be second { "xsi", "http://www.w3.org/2001/XMLSchema-instance"}, // must be third { "xsd", "http://www.w3.org/2001/XMLSchema"}, // 2001 XML Schema { "ns2", "urn:calc"}, // given by the service description { NULL, NULL} // end of table }; ~~~ The first four namespace entries in the table consist of the standard namespaces used by the SOAP protocol. In fact, the namespace mapping table is explicitly declared to enable a programmer to specify the SOAP encoding style and to allow the inclusion of namespace-prefix with namespace-name bindings to comply to the namespace requirements of a specific SOAP service. For example, the namespace prefix `ns2`, which is bound to `urn:calc` by the namespace mapping table shown above, is used by the generated stub function to encode the `add` request. This is performed automatically by the soapcpp2 tool by using the `ns2` prefix of the `ns2__add` method name specified in the `calc.h` header file. In general, if a function name of a service operation, `struct` name, `class` name, `enum` name, or member name of a `struct` or `class` has a pair of underscores, the name has a namespace prefix that must be defined in the namespace mapping table. The namespace mapping table will be output as part of the SOAP Envelope by the stub function. For example:
~~~{.xml} ... ~~~
The namespace bindings will be used by a SOAP service to validate the SOAP request. 🔝 [Back to table of contents](#) ### Example {#example2} The incorporation of namespace prefixes into C++ identifier names is necessary to distinguish service operations that share the same name but are provided by separate Web services and/or organizations. It avoids potential name clashes, while sticking to the C syntax since C has no support for namespaces. The C++ proxy classes generated with `soapcpp2 -j` option `-j` (or option `-i`) drop the namespace prefix from the method names. The namespace prefix convention is also be applied to non-primitive types. For example, `class` names are prefixed to avoid name clashes when the same name is used by multiple XML schemas. This ensures that the XML databinding never suffers from conflicting schema content. For example: ~~~{.cpp} class e__Address // an electronic address from schema 'e' { public: char *email; char *url; }; class s__Address // a street address from schema 's' { public: char *street; int number; char *city; }; ~~~ At this point you may ask why the gSOAP tools do no use C++ namespaces to implement XML namespaces. The answer is not too complicated. XML namespaces are semantically more rich than C++ namespaces. For example, XML schema complexTypes may reference elements in another schema and these elements may be qualified in XML. There could also be element name clashes when element names are the same but referenced in different schemas. In gSOAP this is resolved by naming `struct` and `class` members with the namespace prefix notation, thereby ensuring that name clashes among members cannot occur. An instance of `e__Address` is encoded by the generated serializer for this type as an Address element with namespace prefix `e`:
~~~{.xml} me@home www.me.com ~~~
While an instance of `s__Address` is encoded by the generated serializer for this type as an Address element with namespace prefix `s`:
~~~{.xml} Technology Drive 5 Softcity ~~~
The namespace mapping table of the client program must have entries for `e` and `s` that refer to the XML Schemas of the data types: ~~~{.cpp} struct Namespace namespaces[] = { { "SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/" }, { "SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/" }, { "xsi", "http://www.w3.org/2001/XMLSchema-instance" }, { "xsd", "http://www.w3.org/2001/XMLSchema" }, { "e", "http://www.me.com/schemas/electronic-address" }, { "s", "http://www.me.com/schemas/street-address" }, { NULL, NULL } }; ~~~ This table is automatically generated by soapcpp2 and saved as a `.nsmap` file that can be included in the source code. 🔝 [Back to table of contents](#) ### How to generate C++ client proxy classes {#proxy} Proxy classes for C++ client applications are automatically generated by the soapcpp2 tool, as was shown in Section \ref example1 . A new and improved code generation capability is implemented in soapcpp2 for C++ proxy classes by using `soapcpp2 -j` option `-j` (or option `-i`). These new proxy classes have a cleaner interface and offer more capabilities compared to the gSOAP 2.7 proxy and service classes. In C++ you can also use [`wsdl2h -q name` option `-q name`](#wsdl2h-q) to generate the proxy class and serializers in the specified C++ namespace `name`. This is very useful if you want to create multiple proxies for services by repeated use of wsdl2h and then combine them in one code. Alternatively, you can run wsdl2h just once on all service WSDLs and have soapcpp2 generate multiple proxies for you. The latter approach does not use C++ namespaces and actually reduces the overall amount of source code by avoiding code duplication. To illustrate the generation of a proxy class, the `calc.h` header file example of the previous section used. ~~~{.cpp} // Content of file "calc.h": //gsoap ns2 schema namespace: urn:calc //gsoap ns2 schema form: unqualified //gsoap ns2 service name: calc //gsoap ns2 service type: calcPortType //gsoap ns2 service port: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns2 service namespace: urn:calc //gsoap ns2 service transport: http://schemas.xmlsoap.org/soap/http //gsoap ns2 service method-protocol: add SOAP //gsoap ns2 service method-style: add rpc //gsoap ns2 service method-encoding: add http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: add "" int ns2__add(double a, double b, double& result); //gsoap ns2 service method-protocol: sub SOAP //gsoap ns2 service method-style: sub rpc //gsoap ns2 service method-encoding: sub http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: sub "" int ns2__sub(double a, double b, double& result); //gsoap ns2 service method-protocol: mul SOAP //gsoap ns2 service method-style: mul rpc //gsoap ns2 service method-encoding: mul http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: mul "" int ns2__mul(double a, double b, double& result); ~~~ The `namespace` directives declare the XML schema namespace and WSDL service namespace, which are the same in this example. The `name`, `type`, and `port` directives declare service details, which are used by soapcpp2 to name the proxy class, the WSDL port type, and the service location port which is the endpoint URL of the service. The messaging `transport` mode is HTTP. The groups of four directives per service operation declare the operation SOAP style (RPC) and encoding (SOAP encoded), and SOAP action string, which is optional and used mostly for HTTP-based routing of messages and by WS-Addressing. In this example, the protocol is SOAP 1.1 RPC encoding. More recent uses of SOAP focus on document/literal style messaging, which is also declared with directives without affecting the rest of the interface header file. For `//gsoap` directive details, see Section \ref directives . Run `soapcpp2 -j` on this interface header file with the calculator service specification to generate `soapcalcProxy.cpp` and `soapcalcProxy.h` with the proxy class declaration: ~~~{.cpp} #include "soapH.h" class SOAP_CMAC calcProxy { public: // Context to manage proxy IO and data struct soap *soap; // flag indicating that this context is owned by this proxy when context is shared bool soap_own; // Endpoint URL of service 'calcProxy' (change as needed) const char *soap_endpoint; // Variables globally declared in calc.h, if any // Construct a proxy with new managing context calcProxy(); // Copy constructor calcProxy(const calcProxy& rhs); // Construct proxy given a shared managing context calcProxy(struct soap*); // Construct proxy given a shared managing context and endpoint URL calcProxy(struct soap*, const char *endpoint); // Constructor taking an endpoint URL calcProxy(const char *endpoint); // Constructor taking input and output mode flags for the new managing context calcProxy(soap_mode iomode); // Constructor taking endpoint URL and input and output mode flags for the new managing context calcProxy(const char *endpoint, soap_mode iomode); // Constructor taking input and output mode flags for the new managing context calcProxy(soap_mode imode, soap_mode omode); // Destructor deletes non-shared managing context only (use destroy() to delete deserialized data) virtual ~calcProxy(); // Initializer used by constructors virtual void calcProxy_init(soap_mode imode, soap_mode omode); // Return a copy that has a new managing context with the same engine state virtual calcProxy *copy(); // Copy assignment calcProxy& operator=(const calcProxy&); // Delete all deserialized data (uses soap_destroy() and soap_end()) virtual void destroy(); // Delete all deserialized data and reset to default virtual void reset(); // Disables and removes SOAP Header from message by setting soap->header = NULL virtual void soap_noheader(); // Get SOAP Header structure (i.e. soap->header, which is NULL when absent) virtual SOAP_ENV__Header *soap_header(); // Get SOAP Fault structure (i.e. soap->fault, which is NULL when absent) virtual SOAP_ENV__Fault *soap_fault(); // Get SOAP Fault subcode QName string (NULL when absent) virtual const char *soap_fault_subcode(); // Get SOAP Fault string/reason (NULL when absent) virtual const char *soap_fault_string(); // Get SOAP Fault detail XML string (NULL when absent) virtual const char *soap_fault_detail(); // Close connection (normally automatic, except for send_X ops) virtual int soap_close_socket(); // Force close connection (can kill a thread blocked on IO) virtual int soap_force_close_socket(); // Print fault virtual void soap_print_fault(FILE*); #ifndef WITH_LEAN #ifndef WITH_COMPAT // Print fault to stream virtual void soap_stream_fault(std::ostream&); #endif // Write fault to buffer virtual char *soap_sprint_fault(char *buf, size_t len); #endif // Web service operation 'add' (returns SOAP_OK or error code) virtual int add(double a, double b, double *result) { return this->add(NULL, NULL, a, b, result); } virtual int add(const char *soap_endpoint, const char *soap_action, double a, double b, double *result); // Web service operation 'sub' (returns SOAP_OK or error code) virtual int sub(double a, double b, double *result) { return this->sub(NULL, NULL, a, b, result); } virtual int sub(const char *soap_endpoint, const char *soap_action, double a, double b, double *result); // Web service operation 'mul' (returns SOAP_OK or error code) virtual int mul(double a, double b, double *result) { return this->mul(NULL, NULL, a, b, result); } virtual int mul(const char *soap_endpoint, const char *soap_action, double a, double b, double *result); }; ~~~ The above shows the raw source code with comments generated by soapcpp2. To obtain an annotated markdown document with documented the proxy and service classes and documented data types used by the service operations, run `soapcpp2 -r` option `-r` to generate a `soapReadme.md` report. This markdown file can be converted to HTML or other document formats with tools such as [Doxygen](www.doxygen.org). This generated proxy class can be included into a client application together with the generated namespace table as shown in this example: ~~~{.cpp} #include "soapcalcProxy.h" #include "calc.nsmap" int main() { calcProxy calc(SOAP_XML_INDENT); double r; if (calc.add(1.0, 2.0, r) == SOAP_OK) std::cout << "Sum of 1.0 and 2.0 is " << r << std::endl; else calc.soap_stream_fault(std::cerr); return 0; } ~~~ The XML message sent by the client proxy:
~~~{.xml} 1.0 2.0 ~~~
The XML message returned by the service:
~~~{.xml} 3.0 ~~~
With `soapcpp2 -j` option `-j`, the constructor of the proxy class allocates and initializes a `::soap` context as a pointer member of the class. With `soapcpp2 -i` option `-i` the proxy class is derived from the `::soap` struct instead and this context is initialized when the proxy class constructor is invoked. To place the proxy class in a C++ namespace `name`, use `soapcpp2 -q name` option `-q name`. See Section \ref soapcpp2options. 🔝 [Back to table of contents](#) ### XSD type serialization {#encoding} XML Web services use XML schemas to define the data types of XML data structures in the XML message payloads. The default encoding assumed by soapcpp2 is SOAP 1.1 document/literal style messaging but this is easily changed using options, such as `-2` (SOAP 1.2), `-0` (non-SOAP XML REST), and `-e` (SOAP with RPC encoding). See Section \ref soapcpp2options. Primitive XSD types are mapped to C/C++ primitive types by means of `typedef` declarations in the interface header file for soapcpp2 to generate the XML data binding serialization code. A `typedef` binds an XML schema type name to a C/C++ type. For example: ~~~{.cpp} typedef char *xsd__anyURI; // encode xsd:anyURI values as a strings typedef std::string xsd__NMTOKEN; // encode xsd:NMTOKEN values as strings typedef float xsd__float; // encode xsd:float values as floats ~~~ This simple mechanism informs the soapcpp2 tool to generate serializers and deserializers that explicitly encode and decode the primitive C++ types as built-in primitive XSD types. At the same time, the use of `typedef` does not force any source code rewriting of a client or Web service application because the internal types used by the application are not required to be changed by using this `typedef` mechanism. The built-in XSD types are covered by `typedef` mappings and we could map XSD `xsd:base64Binary` and `xsd:hexBinary` to strings, but that would be cumbersome since the application should populate the strings properly. Instead, we can defined the following structs or classes to contain binary content that the generated serializers serialize in base64 and hexadecimal, respectively: ~~~{.cpp} struct xsd__base64Binary { unsigned char *__ptr; // points to raw binary data int __size; // length of raw binary data }; struct xsd__hexBinary { unsigned char *__ptr; // points to raw binary data int __size; // length of raw binary data }; ~~~ Also `xsd:boolean` in C can be mapped to a `enum`: ~~~{.cpp} enum xsd__boolean { false_, true_ }; ~~~ The trailing underscores are removed in XML payloads and are used here to avoid potential name clashes with C++ `false` and `true` keywords. Annotations with `typedef` types introduce validation constraints that are verified by the XML parser: ~~~{.cpp} typedef float ns__price "%.2g" ; // 2 fractional digits typedef int ns__percent 0:100 ; // integer between 0 and 100 typedef std::string ns__letter "[a-z]" 1:1 ; // string of length 1 with letter (using XSD regex) typedef unsigned long long xsd__positiveInteger 1: ; // positive integer ~~~ The soapcpp2 tool generates a schema with the following types (`xsd::positiveInteger` is a built-in XSD type and therefore omitted from the generated schema):
~~~{.xml} ~~~
For more details on mapping C/C++ data types with their value space constraints to XML schema and vice versa, see [C and C++ XML Data Bindings](../../databinding/html/index.html) documentation. 🔝 [Back to table of contents](#) ### Example {#example3} Reconsider the calculator example of the previous sections, now rewritten with an explicit XSD type for `double` to illustrate the effect: ~~~{.cpp} // Contents of file "calc.h": typedef double xsd__double; int ns2__add(xsd__double a, xsd__double b, xsd__double& result); ~~~ In C a pointer is used instead of a reference for the output parameter `result`. The soapcpp2 tool generates the client stub function: ~~~{.cpp} int soap_call_ns2__add(struct soap *soap, char *URL, char *action, double a, double b, double& result); ~~~ This means that the client application does not need to be rewritten and can still call the client stub or use the generated C++ proxy class as before. Likewise, `typedef` can be used to declare user-defined schema types: ~~~{.cpp} // Contents of file "calc.h": typedef double ns2__number; int ns2__add(ns2__number a, ns2__number b, ns2__number& result); ~~~ This lets soapcpp2 generate a WSDL and XML schema that declares the `ns2:number` type:
~~~{.xml} ~~~
🔝 [Back to table of contents](#) ### How to change the response element name {#response} There is no standardized convention for the response element name in a SOAP RPC encoded response message, although it is recommended that the response element name is the method name ending with "`Response`". For example, the response element of `add` is `addResponse`. The response element name can be specified explicitly using a `struct` or `class` declaration in the interface header file for soapcpp2. This name should be qualified by a namespace prefix, just as the operation name should use a namespace prefix. The `struct` or `class` name represents the SOAP response element name used by the service. Consequently, the output parameter of the service operation must be declared as a member of the `struct` or `class`. The use of a `struct` or a `class` for the service response is fully SOAP 1.1/1.2 compliant. In fact, the absence of a `struct` or `class` indicates to the soapcpp2 tool to automatically generate a `struct` for the response which is internally used by a stub. 🔝 [Back to table of contents](#) ### Example {#example4} Reconsider the calculator service operation specification which can be rewritten with an explicit declaration of a SOAP response element as follows: ~~~{.cpp} // Contents of file "calc.h": struct ns2__addResponse { double result; }; int ns2__add(double a, double b, struct ns2__addResponse& r); ~~~ This wraps the output parameters in a struct `ns2__addResponse`. Note that in C a pointer is used instead of a reference for the output wrapper parameter `r`. In this example we just made an explicit output parameter wrapper, meaning that SOAP request and response messages will be the same as before without this wrapper:
~~~{.xml} 3.0 ~~~
We can use any other name with a namespace prefix for the wrapper struct or class to change the response element name. 🔝 [Back to table of contents](#) ### How to specify multiple output parameters {#multiple} The soapcpp2 tool uses the convention that the last parameter of the function prototype declaration of a service operation in an interface header file is the output parameter of the service operation. All other parameters are considered input parameters of the service operation. To specify a service operation with multiple output parameters, a `struct` or `class` is declared to wrap the service operation response parameters, see also Section \ref response . The name of the `struct` or `class` should have a namespace prefix, just as the service method name. The members of the `struct` or `class` are the output parameters of the service operation. The order of the input parameters in the function prototype and the order of the output parameters (the members of the wrapper `struct` or `class`) is not significant. However, the SOAP 1.1 RPC encoding specification states that input and output parameters may be treated as anonymous parameter names, which requires a particular ordering of these parameters, see Section \ref anonymous . 🔝 [Back to table of contents](#) ### Example {#example5} As an example, consider a hypothetical service operation `getNames` with a single input parameter `SSN` and two output parameters `first` and `last`. This can be specified as: ~~~{.cpp} // Contents of file "getNames.h": int ns3__getNames(char *SSN, struct ns3__getNamesResponse { char *first; char *last; } &r); ~~~ The soapcpp2 tool takes this header file as input and generates source code for the function `soap_call_ns3__getNames`. When invoked by a client application, this stub function produces the XML request message:
~~~{.xml} 999 99 9999 ~~~
The response XML message:
~~~{.xml} John Doe ~~~
where `first` and `last` are the output parameters wrapped in the `getNamesResponse` struct. As another example, consider a service operation `copy` with an input parameter and an output parameter with identical parameter names (this is not prohibited by the SOAP 1.1/1.2 protocols). This can be specified using a wrapper struct for the output parameters, thus avoiding the name clash we would run into without this wrapper: ~~~{.cpp} // Content of file "copy.h": int X_rox__copy_name(char *name, struct X_rox__copy_nameResponse { char *name; } &r); ~~~ The use of a `struct` or `class` for the service operation response enables the declaration of service operations that have parameters that are passed both as input and output parameters. The soapcpp2 tool takes the `copy.h` header file as input and generates the `soap_call_X_rox__copy_name` stub function. When invoked by a client application, the stub function produces the XML request message:
~~~{.xml} hello ~~~
The response XML message:
~~~{.xml} SOAP ~~~
The name will be parsed and decoded by the stub function and returned as the `name` member of the `struct X_rox__copy_nameResponse &r` parameter. You can use the service operation name as a wrapper for the response: ~~~{.cpp} // Content of file "copy.h": int X_rox__copy_name(char *name, struct X_rox__copy_name &r); ~~~ where the struct `X_rox__copy_name` is generated by soapcpp2 automatically and does not need to be redeclared. The response XML message in this case would be:
~~~{.xml} SOAP ~~~
🔝 [Back to table of contents](#) ### How to specify output parameters with compound data types {#compound} If the single output parameter of a service operation is a compound data type such as a `struct` or `class` it is necessary to specify the response element of the service operation as a `struct` or `class` at all times. Otherwise, the output parameter will be considered the response element (!), because of the response element specification convention used by gSOAP, as discussed in Section \ref response . 🔝 [Back to table of contents](#) ### Example {#example6} This is best illustrated with an example. Suppose we have a Flighttracker service that provides real time flight information. It requires an airline code and flight number as parameters. The service operation name is `getFlightInfo` that has two string parameters: the airline code and flight number. The method returns a `getFlightResponse` response element with a `return` output parameter that is of a compound data type `FlightInfo`. The type `FlightInfo` is represented by a `class` in the header file: ~~~{.cpp} // Contents of file "flight.h": typedef char *xsd__string; class ns2__FlightInfo { public: xsd__string airline; xsd__string flightNumber; xsd__string altitude; xsd__string currentLocation; xsd__string equipment; xsd__string speed; }; struct ns1__getFlightInfoResponse { ns2__FlightInfo return_; }; int ns1__getFlightInfo(xsd__string param1, xsd__string param2, struct ns1__getFlightInfoResponse &r); ~~~ The response element `ns1__getFlightInfoResponse` is explicitly declared and it has one member: `return_` of type `ns2__FlightInfo`. Note that `return_` has a trailing underscore to avoid a name clash with the `return` keyword, see Section \ref idtrans for details on the translation of C/C++ identifiers to XML names. The soapcpp2 tool generates the `soap_call_ns1__getFlightInfo` stub function. Here is an example fragment of a client application that uses this proxy to request flight information: ~~~{.cpp} #include "soapH.h" #include "ns1.nsmap" int main() { struct soap soap; soap_init1(&soap, SOAP_XML_INDENT); ns2__FlightInfo flight; if (soap_call_ns1__getFlightInfo(&soap, "testvger.objectspace.com/soap/servlet/rpcrouter", "urn:galdemo:flighttracker", "UAL", "184", flight)) soap_print_fault(&soap, stderr); // nonzero return means that an error occurred else cout << flight.return_.equipment << " flight " << flight.return_.airline << flight.return_.flightNumber << " traveling " << flight.return_.speed << " mph " << " at " << flight.return_.altitude << " ft, is located " << flight.return_.currentLocation << endl; soap_destroy(&soap); // delete managed class instances soap_end(&soap); // delete managed data and temporaries soap_done(&soap); // finalize the context } struct Namespace namespaces[] = { { "SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/" }, { "SOAP-ENC","http://schemas.xmlsoap.org/soap/encoding/" }, { "xsi", "http://www.w3.org/2001/XMLSchema-instance" }, { "xsd", "http://www.w3.org/2001/XMLSchema" }, { "ns1", "urn:galdemo:flighttracker" }, { "ns2", "http://galdemo.flighttracker.com" }, { NULL, NULL } }; ~~~ When invoked by a client application, the stub function produces the XML request: POST /soap/servlet/rpcrouter HTTP/1.1 Host: testvger.objectspace.com Content-Type: text/xml Content-Length: 634 SOAPAction: "urn:galdemo:flighttracker"
~~~{.xml} UAL 184 ~~~
The service responds with: HTTP/1.1 200 OK Date: Thu, 30 Aug 2011 00:34:17 GMT Server: IBM_HTTP_Server/1.3.12.3 Apache/1.3.12 (Win32) Content-Length: 861 Content-Type: text/xml; charset=utf-8
~~~{.xml} A320 UAL 188 mi W of Lincoln, NE 37000 497 184 ~~~
The stub function returns the service response in variable `flight` of type `struct ns1__getFlightInfoResponse` and this information can be displayed by the client application: A320 flight UAL184 traveling 497 mph at 37000 ft, is located 188 mi W of Lincoln, NE Note that the response includes `xsi:type` attributes indicating the schema types of the elements in the XML message. This was common practice in earlier SOAP implementations and some SOAP implementations relied on it, but it was never mandated by the specifications. You can let soapcpp2 generate serializers that produce the `xsi:type` type information in XML messages with `soapcpp2 -t` option `-t`. Otherwise, the serializers will not include `xsi:type` attributes in the XML message payloads unless a derived type value is used in the XML payload in place of a base type, for example a derived class in place of a base class. In this way, SOAP/XML messaging implements object inheritance cleanly and efficiently because the leading `xsi:type` attribute value corresponding to the serialized derived class in an XML message lets an XML parser and deserializer instantiate the derived class to populate it immediately (something that can't be claimed of JSON since JSON has no attributes and object properties are unordered). @note: the flight tracker service is no longer available since 9/11/2001. It is kept in the documentation as an example to illustrate the use of structs/classes and response types. 🔝 [Back to table of contents](#) ### How to specify anonymous parameter names {#anonymous} The SOAP RPC encoding protocol allows parameter names to be anonymous. That is, the name(s) of the output parameters of a service operation are not strictly required to match a client's view of the parameters names. Also, the input parameter names of a service operation are not strictly required to match a service's view of the parameter names. The soapcpp2 tool can generate stub and skeleton functions that support anonymous parameters. Parameter names are implicitly anonymous by omitting the parameter names in the function prototype of the service operation. For example: ~~~{.cpp} // Contents of file "calc.h": int ns2__add(double, double, double&); ~~~ This enumerates the parameter names as `_param_1`, `_param_2`, and `_param_3`, where the leading underscore makes these names anonymous, meaning that the XML parser and deserializer will accept any parameter name to extract their values, that is, even when the name of the XML element representing the parameter differs. To make parameter names explicitly anonymous, specify parameter names that start with an underscore (`_`) in the function prototype in the header file. For example: ~~~{.cpp} // Contents of file "calc.h": int ns2__add(double _a, double _b, double& _return); ~~~ In this example, the `_a`, `_b`, and `_return` are anonymous parameters. @warning when anonymous parameter names are used, the order of the parameters in the function prototype of a service operation is significant. 🔝 [Back to table of contents](#) ### How to specify a service operation with no input parameters {#noinparam} To specify a service operation that has no input parameters, just provide a function prototype with one parameter which is the output parameter that is either a pointer or a reference, for example: ~~~{.cpp} int ns__getValue(double& value); ~~~ The soapcpp2 tool generates a struct for each service operation request message, which in this case is an empty struct. To prevent C compilers from throwing an error, the empty struct is patched at compile time with the compile-time flag `#WITH_NOEMPTYSTRUCT`. 🔝 [Back to table of contents](#) ### How to specify a service operation with no output parameters {#nooutparam} To specify a service operation that has no output parameters, just define a function prototype with a response struct that is empty, for example: ~~~{.cpp} enum ns__event { off, on, stand_by }; int ns__signal(enum ns__event in, struct ns__signalResponse { } *out); ~~~ Since the response struct is empty, no output parameters are specified. The SOAP response message has an empty response element `ns:signalResponse`. Specifying an empty response is not identical to SOAP one-way messaging, which is asynchronous and does not expect an XML response message to be transmitted at all, just an empty HTTP OK response to a HTTP POST request. See Section \ref oneway1 on one-way messaging. ### How to switch to REST from SOAP {#restclient} To switch to RESTful Web APIs from SOAP Web services APIs is simple, just use a directive. To declare HTTP POST as the default HTTP method to use with client-side calls for all service operations associated with the `ns` namespace prefix: ~~~{.cpp} //gsoap ns service protocol: POST ~~~ To declare the HTTP POST method for a specific service operation, use: ~~~{.cpp} //gsoap ns service protocol: POST int ns__webmethod(...); ~~~ You can specify `GET`, `PUT`, `POST`, and `DELETE`. With `GET` the input parameters of the service operations should be primitive types. See Section \ref directives-1. 🔝 [Back to table of contents](#) ## How to build Web services APIs {#services} The soapcpp2 tool generates skeleton functions in C or C++ source code for each of the service operations specified as function prototypes in the interface header file input to soapcpp2. The skeleton functions can be readily used to implement the service operations in a new Web service. The compound data types used by the input and output parameters of service operations must be declared in the interface header file, such as structs, classes, arrays, C++ containers, and pointer-based data structures (e.g. data structure trees and arbitrary operation. The soapcpp2 tool automatically generates serializers and deserializers for the data types to enable the generated skeleton functions to encode and decode the contents of the parameters of the service operations. The soapcpp2 tool also generates a service operation request dispatcher function `::soap_serve` that serves requests by calling the appropriate skeleton. 🔝 [Back to table of contents](#) ### Example {#example7} The following example specifies three service operations of a Web service: ~~~{.cpp} // Contents of file "calc.h": //gsoap ns service namespace: urn:simple-calc int ns__add(double a, double b, double& result); int ns__sub(double a, double b, double& result); int ns__sqrt(double a, double& result); ~~~ The `add` and `sub` methods are intended to add and subtract two double floating point numbers stored in input parameters `a` and `b` and should return the result of the operation in the `result` output parameter. The `sqrt` method is intended to take the square root of input parameter `a` and to return the result in the output parameter `result`. To generate the skeleton functions, the soapcpp2 tool is invoked from the command line with: soapcpp2 calc.h The soapcpp2 tool generates the skeleton functions in file `soapServer.cpp` for the `add`, `sub`, and `sqrt` service operations specified in the `calc.h` header file. The skeleton functions are respectively `soap_serve_ns__add`, `soap_serve_ns__sub`, and `soap_serve_ns__sqrt`. The generated file `soapC.cpp` contains serializers and deserializers for the skeleton. The soapcpp2 tool also generates a service dispatcher: the `::soap_serve` function handles client requests and dispatches the service operation requests to the appropriate skeleton functions to serve the requests. The skeleton in turn calls the service operation implementation function. The function prototype of the service operation implementation function is specified in the header file that is input to the soapcpp2 tool. Here is an example CGI service application that uses the generated `::soap_serve` skeleton function to handle client requests: ~~~{.cpp} // Contents of file "calc.cpp": #include "soapH.h" #include "ns.nsmap" #include // for sqrt() int main() { return soap_serve(soap_new()); } // Implementation of the "add" service operation: int ns__add(struct soap *soap, double a, double b, double& result) { result = a + b; return SOAP_OK; } // Implementation of the "sub" service operation: int ns__sub(struct soap *soap, double a, double b, double& result) { result = a - b; return SOAP_OK; } // Implementation of the "sqrt" service operation: int ns__sqrt(struct soap *soap, double a, double& result) { if (a < 0) return soap_receiver_fault(soap, "Square root of negative number", "I can only take the square root of a non-negative number"); result = sqrt(a); return SOAP_OK; } struct Namespace namespaces[] = { { "SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/" }, { "SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/" }, { "xsi", "http://www.w3.org/2001/XMLSchema-instance" }, { "xsd", "http://www.w3.org/2001/XMLSchema" }, { "ns", "urn:simple-calc" }, // binds "ns" namespace prefix to schema URI { NULL, NULL } }; ~~~ Note that the service operations have an extra input parameter which is a pointer to the `::soap` context. The implementation of the service operations must return `#SOAP_OK` or a nonzero error code. The code `#SOAP_OK` denotes success. A nonzero error code is returned with `::soap_receiver_fault` and `::soap_sender_fault`. These functions also set up a SOAP Fault structure with the details of the fault returned. This is done by setting the `::soap::fault` which points to `::SOAP_ENV__Fault` structure. Its `::SOAP_ENV__Fault::faultstring` string and `::SOAP_ENV__Fault::detail `details are populated with the fault string (XML text) and fault detail (XML string). SOAP 1.2 requires the `::SOAP_ENV__Fault::SOAP_ENV__Reason` and the `::SOAP_ENV__Fault::SOAP_ENV__Detail` strings to be assigned instead. This service application can be readily installed as a CGI application, which is a simple stateless way to deploy services. To deploy this service as a multi-threaded stand-alone server application see Sections \ref stand-alone and \ref mt. Besides generating the skeleton functions and serializers in source code, the soapcpp2 tool also generates a WSDL file for this service, see Section \ref wsdl for details on WSDL. As per SOAP protocol (when applicable), "SOAP actions" are HTTP headers that are specific to the SOAP protocol and provide a means for routing service requests and for security reasons, for example firewall software can inspect SOAP action headers to grant or deny the SOAP request. Use `soapcpp2 -a` option `-a` or `soapcpp2 -A` option `-A` to let the generated skeleton functions dispatch the requests based on the SOAP action HTTP header together with (or instead) the name of the XML request element. Note that soapcpp2 generates both clients and services based on the interface header file input. Which means that there is no need to modify the interface header file for client side or server side deployments. For example, the generated `soap_call_ns__add` stub function is saved to the `soapClient.cpp` file after invoking the soapcpp2 tool on the `calc.h` header file. 🔝 [Back to table of contents](#) ### MSVC++ builds {#msvc} * Win32 builds require winsock2 (MS Visual C++ `ws2_32.lib`) To do this in Visual C++, go to **Project**, **Properties**, select **Link** and add `ws2_32.lib` to the **Object library modules** entry. * Use files with extension `.cpp` only. This means that you may have to rename all `.c` files to `.cpp`. * Turn pre-compiled headers off. * When creating a new project, you can specify a custom build step to automatically invoke the soapcpp2 tool on a interface header file for soapcpp2. In this way you can incrementally build a new service by adding new operations and data types to the header file. For the latest instruction on how to specify a custom build step to run soapcpp2, see the gSOAP download and installation page . * You may want to use the ISAPI extension or WinInet plugin available in the `gsoap/mod_gsoap` directory of the gSOAP package to simplify Internet access and deal with encryption, proxies, and authentication. See the gSOAP [ISAPI extension](../../isapi/html/index.html) documentation and the gSOAP [WinInet plugin](../../wininet/html/index.html) documentation. 🔝 [Back to table of contents](#) ### How to create a stand-alone server {#stand-alone} The deployment of a Web service as a CGI application is an easy means to provide your service on the Internet. However, CGI is stateless and the performance of CGI is not great. Instead, gSOAP services can be run as stand-alone services on any port by using the built-in HTTP and TCP/IP stacks of the engine. The recommended mechanism to deploy a service is through the gSOAP Apache module or ISAPI extension. These servers and modules are designed for server load balancing and access control. See the gSOAP [Apache module](../../apache/html/index.html) documentation and the gSOAP [ISAPI extension](../../isapi/html/index.html) documentation for details. See also the getting started page and tutorial page to get started with developing client and stand-alone server applications using the gSOAP tools. To create a stand-alone service, the `main` function of the service application should call `::soap_bind` to bind a port and then loop over `::soap_accept` to accept requests to serve with `::soap_serve`. Also call `::soap_ssl_accept` when HTTPS is used, which is set up with `::soap_ssl_server_context`. For example: ~~~{.cpp} #include "soapH.h" #include "ns.nsmap" int main() { struct soap *soap = soap_new1(SOAP_XML_INDENT); soap->send_timeout = 10; // 10 seconds max socket delay soap->recv_timeout = 10; // 10 seconds max socket delay soap->accept_timeout = 3600; // server stops after 1 hour of inactivity soap->max_keep_alive = 100; // max keep-alive sequence // soap_ssl_server_context(soap, ...); // call this function when HTTPS is used SOAP_SOCKET m, s; // master and slave sockets m = soap_bind(soap, NULL, 18083, 10); // small BACKLOG for iterative servers if (!soap_valid_socket(m)) { soap_print_fault(soap, stderr); } else { fprintf(stderr, "Socket connection successful: master socket = %d\n", m); for (int i = 1; ; i++) { s = soap_accept(soap); if (!soap_valid_socket(s)) { soap_print_fault(soap, stderr); break; } // soap_ssl_accept(soap); // call when HTTPS is used fprintf(stderr, "%d: accepted connection from IP=%d.%d.%d.%d socket=%d", i, (soap->ip>>24)&0xFF, (soap->ip>>16)&0xFF, (soap->ip>>8)&0xFF, soap->ip&0xFF, s); if (soap_serve(soap)) soap_print_fault(soap, stderr); else fprintf(stderr, "request served\n"); soap_destroy(soap); // delete managed class instances soap_end(soap); // delete managed data and temporaries } } soap_free(soap); // finalize and delete the context } ~~~ The `::soap_serve` dispatcher handles one request or multiple requests when HTTP keep-alive is enabled with the `#SOAP_IO_KEEPALIVE` flag, which should only be used with client applications or with stand-alone multi-threaded services, see the next section and Section \ref keepalive. The gSOAP functions that are frequently used for server-side coding are: * `soap_bind(struct soap *soap, char *host, int port, int backlog)` binds `::soap::master` socket to the specified port and host name (or NULL for the current machine), using a backlog queue size of pending requests, returns master socket. We check the return value with `#soap_valid_socket`. The backlog queue size should be small, say 2 to 10, for iterative (not multi-threaded) stand-alone servers to ensure fairness among connecting clients. A smaller value increases fairness and defends against denial of service, but hampers performance because connection requests may be refused. * `soap_accept(struct soap *soap)` returns `#SOAP_SOCKET` socket `::soap::socket` when connected. We check the return value with `#soap_valid_socket`. * `soap_ssl_accept(struct soap *soap)` returns `#SOAP_OK` when the HTTPS handshake successfully completed. The IPv4 address is stored in `::soap::ip`. If IPv6 is enabled with `#WITH_IPV6` then `::soap::ip6` contains the IPv6 address. The `::soap::accept_timeout` context variable of the context specifies the timeout value for a non-blocking `::soap_accept` call. See Section \ref timeout for more details on timeout management. The `::soap_serve` function parses the inbound HTTP request and dispatches the request to the skeleton functions that call the service operations implemented. See Section \ref memory for more details on memory management. 🔝 [Back to table of contents](#) ### How to create a multi-threaded stand-alone service {#mt} Stand-alone multi-threading a Web Service is essential when the response times for handling requests by the service are long or when HTTP keep-alive is enabled, see also Section \ref keepalive . In case of long response times, the latencies introduced by the unrelated requests may become prohibitive for a successful deployment of a stand-alone service. When HTTP keep-alive is enabled, a client and server remain connected until 100 (`#SOAP_MAXKEEPALIVE`) request-response iterations later as specified by `::soap::max_keep_alive` or when a timeout occurred. Thereby preventing other clients from connecting. The recommended mechanism to deploy a service is through the gSOAP Apache module or ISAPI extension. These servers and modules are designed for server load balancing and access control. See the gSOAP [Apache module](../../apache/html/index.html) documentation and the gSOAP [ISAPI extension](../../isapi/html/index.html) documentation for details. See also the getting started page and tutorial page to get started with developing client and stand-alone server applications using the gSOAP tools. The following example illustrates the use of threads to improve the quality of service by handling new requests in separate threads: ~~~{.cpp} #include "soapH.h" #include "ns.nsmap" #include "plugin/threads.h" #define BACKLOG (100) // Max request backlog of pending requests int main(int argc, char **argv) { struct soap soap; soap_init(&soap); if (argc < 2) // no args: assume this is a CGI application { soap_serve(&soap); // serve request, one thread, CGI style soap_destroy(&soap); // delete managed class instances soap_end(&soap); // delete managed data and temporaries } else { void *process_request(void*); struct soap *tsoap; THREAD_TYPE tid; int port = atoi(argv[1]); // first command-line arg is port SOAP_SOCKET m, s; soap.send_timeout = 10; // 10 seconds max socket delay soap.recv_timeout = 10; // 10 seconds max socket delay soap.accept_timeout = 3600; // server stops after 1 hour of inactivity soap.max_keep_alive = 100; // max keep-alive sequence m = soap_bind(&soap, NULL, port, BACKLOG); if (!soap_valid_socket(m)) exit(EXIT_FAILURE); fprintf(stderr, "Socket connection successful %d\n", m); while (1) { s = soap_accept(&soap); if (soap_valid_socket(s)) { fprintf(stderr, "Thread %d accepts socket %d connection from IP %d.%d.%d.%d\n", i, s, (soap.ip>>24)&0xFF, (soap.ip>>16)&0xFF, (soap.ip>>8)&0xFF, soap.ip&0xFF); tsoap = soap_copy(&soap); // make a copy if (!tsoap) soap_force_closesock(soap); else while (THREAD_CREATE(&tid, (void*(*)(void*))process_request, (void*)tsoap)) sleep(1); // failed, try again } else if (soap.errnum) // accept failed, try again after 1 second { soap_print_fault(&soap, stderr); sleep(1); } else { fprintf(stderr, "server timed out\n"); break; } } } soap_done(&soap); // finalize context return 0; } void *process_request(struct soap *soap) { THREAD_DETACH(THREAD_ID); soap_serve(soap); soap_destroy(soap); // delete managed class instances soap_end(soap); // delete managed data and temporaries soap_free(soap); // finalize and delete the context return NULL; } // ... the service operations are defined here ... ~~~ For this multi-threaded application the `gsoap/plugin/threads.h` and `gsoap/plugin/threads.c` portable threads and mutex API is used. The server spawns a thread per request. Each thread executes a `::soap_serve` using a copy of the `::soap` context created with `::soap_copy` (if `::soap_copy` fails due to out of memory then we can still recover as shown, recovery from errors is an important aspect of gSOAP's design and API implementation). Note that the server does not wait for threads to join the main thread upon program termination. The `::soap_serve` dispatcher handles one request or multiple requests when HTTP keep-alive is set with `#SOAP_IO_KEEPALIVE`. The `::soap::max_keep_alive` value can be set to the maximum keep-alive calls allowed, which is important to avoid a client from holding a thread indefinitely. The send and receive timeouts are set to avoid (intentionally) slow clients from holding a socket connection too long. The accept timeout is used to let the server terminate automatically after a period of inactivity. The following example limits the number of concurrent threads to reduce the machine's CPU resource utilization: ~~~{.cpp} #include "soapH.h" #include "ns.nsmap" #include "plugin/threads.h" #define BACKLOG (100) // Max request backlog of pending requests #define MAX_THR (10) // Max threads to serve requests int main(int argc, char **argv) { struct soap soap; soap_init(&soap); if (argc < 2) // no args: assume this is a CGI application { soap_serve(&soap); // serve request, one thread, CGI style soap_destroy(&soap); // delete managed class instances soap_end(&soap); // delete managed data and temporaries } else { struct soap *soap_thr[MAX_THR]; // each thread needs a context THREAD_TYPE tid[MAX_THR]; // array of thread IDs int port = atoi(argv[1]); // first command-line arg is port SOAP_SOCKET m, s; int i; soap.send_timeout = 10; // 10 seconds max socket delay soap.recv_timeout = 10; // 10 seconds max socket delay soap.accept_timeout = 3600; // server stops after 1 hour of inactivity soap.max_keep_alive = 100; // max keep-alive sequence m = soap_bind(&soap, NULL, port, BACKLOG); if (!soap_valid_socket(m)) exit(EXIT_FAILURE); fprintf(stderr, "Socket connection successful %d\n", m); for (i = 0; i < MAX_THR; i++) soap_thr[i] = NULL; while (1) { for (i = 0; i < MAX_THR; i++) { s = soap_accept(&soap); if (soap_valid_socket(s)) { fprintf(stderr, "Thread %d accepts socket %d connection from IP %d.%d.%d.%d\n", i, s, (soap.ip>>24)&0xFF, (soap.ip>>16)&0xFF, (soap.ip>>8)&0xFF, soap.ip&0xFF); if (!soap_thr[i]) // first time around { soap_thr[i] = soap_copy(&soap); if (!soap_thr[i]) exit(EXIT_FAILURE); // could not allocate } else // recycle threaded soap contexts { // optionally, we can cancel the current thread when stuck on IO: // soap_close_connection(soap_thr[i]); // requires compiling 2.8.71 or greater with -DWITH_SELF_PIPE THREAD_JOIN(tid[i]); fprintf(stderr, "Thread %d completed\n", i); soap_destroy(soap_thr[i]); // delete managed class instances of thread soap_end(soap_thr[i]); // delete managed data and temporaries of thread soap_copy_stream(soap_thr[i], &soap); // pass the connection on to the thread } while (THREAD_CREATE(&tid[i], (void*(*)(void*))soap_serve, (void*)soap_thr[i])) sleep(1); // failed, try again } else if (soap.errnum) // accept failed, try again after 1 second { soap_print_fault(&soap, stderr); sleep(1); } else { fprintf(stderr, "Server timed out\n"); goto end; } } } end: for (i = 0; i < MAX_THR; i++) { if (soap_thr[i]) { THREAD_JOIN(tid[i]); soap_destroy(soap_thr[i]); soap_end(soap_thr[i]); soap_free(soap_thr[i]); } } } soap_destroy(&soap); soap_end(&soap); soap_done(&soap); return 0; } // ... the service operations are defined here ... ~~~ The advantage of the code shown above is that the machine cannot be overloaded with requests, since the number of active services is limited. However, threads are still started and terminated. This overhead can be eliminated using a queue of requests (a queue of accepted socket connections): ~~~{.cpp} #include "soapH.h" #include "ns.nsmap" #include "plugin/threads.h" #define BACKLOG (100) // Max. request backlog of pending requests #define MAX_THR (64) // Size of thread pool #define MAX_QUEUE (1000) // Max. size of request queue void *process_queue(void*); int enqueue(SOAP_SOCKET); SOAP_SOCKET dequeue(); static SOAP_SOCKET queue[MAX_QUEUE]; // The global request queue of sockets static int head = 0, tail = 0; static MUTEX_TYPE queue_lock; // mutex for queue ops critical sections static COND_TYPE queue_notempty; // condition variable when queue is empty static COND_TYPE queue_notfull; // condition variable when queue is full int main(int argc, char **argv) { struct soap soap; soap_init(&soap); if (argc < 2) // no args: assume this is a CGI application { soap_serve(&soap); // serve request, one thread, CGI style soap_destroy(&soap); // delete managed class instances soap_end(&soap); // delete managed data and temporaries } else { struct soap *soap_thr[MAX_THR]; // each thread needs a context THREAD_TYPE tid[MAX_THR]; int port = atoi(argv[1]); // first command-line arg is port SOAP_SOCKET m, s; int i; m = soap_bind(&soap, NULL, port, BACKLOG); if (!soap_valid_socket(m)) exit(EXIT_FAILURE); fprintf(stderr, "Socket connection successful %d\n", m); MUTEX_SETUP(queue_lock); COND_SETUP(queue_notempty); COND_SETUP(queue_notfull); for (i = 0; i < MAX_THR; i++) { soap_thr[i] = soap_copy(&soap); fprintf(stderr, "Starting thread %d\n", i); while (THREAD_CREATE(&tid[i], (void*(*)(void*))process_queue, (void*)soap_thr[i])) sleep(1); // failed, try again } while (1) { s = soap_accept(&soap); if (soap_valid_socket(s)) { fprintf(stderr, "Thread %d accepts socket %d connection from IP %d.%d.%d.%d\n", i, s, (soap.ip>>24)&0xFF, (soap.ip>>16)&0xFF, (soap.ip>>8)&0xFF, soap.ip&0xFF); enqueue(s); } else if (soap.errnum) // accept failed, try again after 1 second { soap_print_fault(&soap, stderr); sleep(1); } else { fprintf(stderr, "Server timed out\n"); break; } } for (i = 0; i < MAX_THR; i++) enqueue(SOAP_INVALID_SOCKET); for (i = 0; i < MAX_THR; i++) { fprintf(stderr, "Waiting for thread %d to terminate... ", i); THREAD_JOIN(tid[i]); fprintf(stderr, "terminated\n"); soap_free(soap_thr[i]); } COND_CLEANUP(queue_notfull); COND_CLEANUP(queue_notempty); MUTEX_CLEANUP(queue_lock); } soap_destroy(&soap); soap_end(&soap); soap_done(&soap); return 0; } void *process_queue(void *soap) { struct soap *tsoap = (struct soap*)soap; while (1) { tsoap->socket = dequeue(); if (!soap_valid_socket(tsoap->socket)) break; soap_serve(tsoap); soap_destroy(tsoap); soap_end(tsoap); fprintf(stderr, "served\n"); } return NULL; } /* add job (socket with pending request) to queue */ void enqueue(SOAP_SOCKET s) { int next; MUTEX_LOCK(queue_lock); next = (tail + 1) % MAX_QUEUE; if (next == head) COND_WAIT(queue_notfull, queue_lock); jobs[tail] = s; tail = next; COND_SIGNAL(queue_notempty); MUTEX_UNLOCK(queue_lock); } /* remove job (socket with request) from queue */ SOAP_SOCKET dequeue() { SOAP_SOCKET s; MUTEX_LOCK(queue_lock); if (head == tail) COND_WAIT(queue_notempty, queue_lock); s = jobs[head]; head = (head + 1) % MAX_QUEUE; COND_SIGNAL(queue_notfull); MUTEX_UNLOCK(queue_lock); return s; } // ... the service operations are defined here ... ~~~ For this multi-threaded application the `gsoap/plugin/threads.h` and `gsoap/plugin/threads.c` portable threads and mutex API is used. 🔝 [Back to table of contents](#) ### How to pass application state info to service operations {#user} The `void* ::soap::user` variable can be used to pass application state information to service operations and to plugins. This variable can be set before the `::soap_serve` call. The service method can access this variable to use the application-dependent data. The following example shows how a non-static database handle is initialized and passed to the service methods: ~~~{.cpp} int main() { struct soap soap; database_handle_type database_handle; soap_init(&soap); soap.user = (void*)database_handle; ... // if (soap_serve(&soap)) ... // error ... // } int ns__webmethod(struct soap *soap, ...) { fetch((database_handle_type*)soap->user); // use database handle ... // return SOAP_OK; } ~~~ Another way to maintain and pass state information with the context is done with plugins, see Section \ref plugins . 🔝 [Back to table of contents](#) ### How to generate C++ server classes {#object} Server object classes for C++ server applications are automatically generated by the soapcpp2 tool using `soapcpp2 -j` option `-j` or `soapcpp2 -i` option `-i`. Without these options the soapcpp2 tool generates C-based stub and skeleton functions. We illustrate the use of server classes with the following example interface header file: ~~~{.cpp} // Content of file "calc.h": //gsoap ns service name: Calculator //gsoap ns service protocol: SOAP1.2 //gsoap ns service style: document //gsoap ns service encoding: literal //gsoap ns service location: http://www.cs.fsu.edu/~engelen/calc.cgi //gsoap ns schema namespace: urn:calc int ns__add(double a, double b, double& result); int ns__sub(double a, double b, double& result); int ns__mul(double a, double b, double& result); int ns__div(double a, double b, double& result); ~~~ The directives provide the service name which is used to name the service class, the protocol (SOAP 1.2) and style (document/literal), service location (endpoint URL), and the schema namespace URI. We run `soapcpp2 -i calc.h` with option `-i` to generate `soapCalculatorService.h` which declares the C++ sever class that has the following structure: ~~~{.cpp} #include "soapH.h" class CalculatorService : public soap { public: Calculator() { soap_init(this); }; ... // more constructors, elided here for clarity ~Calculator() { soap_done(this); }; SOAP_SOCKET bind(const char *host, int port, int backlog) { return soap_bind(this, host, port, backlog); } SOAP_SOCKET accept() { return soap_accept(this); } int serve() { return soap_serve(this); }; void destroy() { soap_destroy(this); soap_end(this); } ... // more methods, elided here for clarity // user-defined service operations: int add(double a, double b, double& result); int sub(double a, double b, double& result); int mul(double a, double b, double& result); int div(double a, double b, double& result); }; ~~~ This generated server class `serve` method calls the `add`, `sub`, `mul`, and `div` methods upon receiving an XML request message. These methods should be implemented, for example as follows in a CGI-based service: ~~~{.cpp} #include "soapCalculatorService.h" #include "Calculator.nsmap" int main() { CalculatorService calc; calc.serve(); calc.destroy(); } int calc::add(double a, double b, double& result) { result = a + b; return SOAP_OK; } int calc::sub(double a, double b, double& result) { result = a - b; return SOAP_OK; } int calc::mul(double a, double b, double& result) { result = a * b; return SOAP_OK; } int calc::div(double a, double b, double& result) { if (b == 0.0) return soap_sender_fault(this, "Division by zero", NULL); result = a / b; return SOAP_OK; } ~~~ If we run `soapcpp2 -j calc.h` with option `-j` to generate `soapCalculatorService.h` then we get the same class as with option `-i` but the `::soap` context is not a base class but is a member of the service class: ~~~{.cpp} #include "soapH.h" class CalculatorService { public: struct soap *soap; Calculator() { soap = soap_new(); }; ... // more constructors, elided here for clarity ~Calculator() { soap_free(soap); }; SOAP_SOCKET bind(const char *host, int port, int backlog) { return soap_bind(soap, host, port, backlog); } SOAP_SOCKET accept() { return soap_accept(soap); } int serve() { return soap_serve(soap); }; void destroy() { soap_destroy(soap); soap_end(soap); } ... // more methods, elided here for clarity // user-defined service operations: int add(double a, double b, double& result); int sub(double a, double b, double& result); int mul(double a, double b, double& result); int div(double a, double b, double& result); }; ~~~ The only difference we make to implement the service application is to use the `::soap` member of the class instead of `this` when referring to the context, which in our example changes only one line of code in the `div` method: ~~~{.cpp} if (b == 0.0) return soap_sender_fault(soap, "Division by zero", NULL); } ~~~ In fact, the service classes have `soap_sender_fault` and `soap_receiver_fault` methods that can be used instead. You can declare a C++ namespace `name` with `soapcpp2 -q name` to create a server class in the `name` namespace, see Section \ref codenamespace . For more options, see also Sections \ref soapcpp2options and \ref dylibs. The example above serves CGI requests. The generated service classes also have `bind` and `accept` methods, which can be used to implement stand-alone services, see also Section \ref stand-alone . A better alternative is to use `soapcpp2 -j` option `-j` or option `-i`. With option `-j` the C++ proxy and service classes have a `soap` context pointer. This context pointer can be set and shared among many proxy and service classes. With option `-i` the C++ proxy and server classes are derived from the `::soap` context, which simplifies the proxy invocation and service operation implementations. Compilation of the above header file with `soapcpp2 -i` creates new files `soapCalculatorService.h` and `soapCalculatorService.cpp` (rather than the C-style `soapServer.cpp`). This generated server object class can be included into a server application together with the generated namespace table as shown in this example: ~~~{.cpp} #include "soapCalculatorService.h" // get server object #include "Calculator.nsmap" // include the generated namespace table int main() { soapCalculatorService c; return c.serve(); // calls soap_serve to serve as CGI application (using stdin/out) } // The 'add' service method (soapcpp2 w/ option -i) int soapCalculatorService::add(double a, double b, double &result) { result = a + b; return SOAP_OK; } ... // sub(), mul(), and div() implementations ~~~ Note that the service operation does not need a prefix (`ns__`) and there is no `::soap` context passed to the service operation since the service object itself is the context (it is derived from the `::soap` context struct). 🔝 [Back to table of contents](#) ### How to chain C++ server classes to accept messages on the same port {#chaining} When combining multiple services into one application, you can run wsdl2h on multiple WSDLs to generate the single all-inclusive service definitions interface header file for soapcpp2. This header file is then processed with soapcpp2 to generate skeleton functions in C or server classes in C++ when using `soapcpp2 -j` option `-j` (or option `-i`). This approach works well for C and C++ too, but the problem in C++ is that we end up with multiple service classes, each for a collection of service operations that the class is supposed to implement. But what if we need to provide one endpoint port for all services and operations? In this case invoking the server object's `serve` method is not sufficient, since only one service can accept requests while we want multiple services to listen to the same port. For example, say we have three service classes `soapABCService`, `soapUVWService`, and `soapXYZService`. We run `soapcpp2 -i -S -q name` three times (on the same interface file when applicable): soapcpp2 -i -S -qAbc file.h soapcpp2 -i -S -qUvw file.h soapcpp2 -i -S -qXyz file.h To generate the common `envH.h` file for SOAP Header and SOAP Fault definitions is done on a `env.h` file that is empty or has the SOAP Header and SOAP Fault detail structures `::SOAP_ENV__Header` and `::SOAP_ENV__Detail` specified: soapcpp2 -CSL -penv env.h The approach is to chain the service dispatchers, as shown below: ~~~{.cpp} #include "AbcABCService.h" #include "UvwUVWService.h" #include "XyzXYZService.h" #include "envH.h" // include this file last, if this file is needed int main() { Abc::soapABCService abc; // generated with soapcpp2 -i -S -qAbc Uvw::soapUVWService uvw; // generated with soapcpp2 -i -S -qUvw Xyz::soapXYZService xyz; // generated with soapcpp2 -i -S -qXyz if (!soap_valid_socket(abc.bind(NULL, 8080, 100))) exit(EXIT_FAILURE); while (1) { if (!soap_valid_socket(abc.accept())) exit(EXIT_FAILURE); // abc.ssl_accept(); // when HTTPS is used ... // if (soap_begin_serve(&abc)) // available in 2.8.2 and later { abc.soap_stream_fault(std::cerr); } else if (abc.dispatch() == SOAP_NO_METHOD) { soap_copy_stream(&uvw, &abc); soap_free_stream(&abc); // abc no longer uses this stream if (uvw.dispatch() == SOAP_NO_METHOD) { soap_copy_stream(&xyz, &uvw); soap_free_stream(&uvw); // uvw no longer uses this stream if (xyz.dispatch()) { soap_send_fault(&xyz); // send fault to client xyz.soap_stream_fault(std::cerr); } xyz.destroy(); } else { soap_send_fault(&uvw); // send fault to client uvw.soap_stream_fault(std::cerr); } uvw.destroy(); } else { abc.soap_stream_fault(std::cerr); } abc.destroy(); } } ~~~ The `dispatch` method parses the SOAP/XML request and invokes the service operations, unless there is no matching operation and `#SOAP_NO_METHOD` is returned. The `::soap_copy_stream` ensures that the service object uses the currently open socket. The copied streams are freed with `::soap_free_stream`. Do not enable keep-alive support, as the socket may stay open indefinitely afterwards as a consequence. Also, the `dispatch` method does not send a fault to the client, which has to be explicitly done with the `::soap_send_fault` operation when an error occurs. In this way, multiple services can be chained to accept messages on the same port. This approach also works with SSL for HTTPS services. However, this approach is not recommended for certain plugins, because plugins must be registered with all service objects and some plugins require state information to be used across the service objects, which will add significantly to the complexity. Therefore, it is best to have all services share the same context. This means that `soapcpp2 -j` with option `-j` should be used instead of option `-i`. As a result, we can make each service class instance to share the same `::soap` context and the same plugins. soapcpp2 -j -S -qAbc file.h soapcpp2 -j -S -qUvw file.h soapcpp2 -j -S -qXyz file.h Chaining the services is also simpler to implement since we use one `::soap` context: ~~~{.cpp} #include "AbcABCService.h" #include "UvwUVWService.h" #include "XyzXYZService.h" #include "envH.h" // include this file last, if it is needed int main() { struct soap *soap = soap_new(); Abc::soapABCService abc(soap); // generated with soapcpp2 -j -S -qAbc Uvw::soapUVWService uvw(soap); // generated with soapcpp2 -j -S -qUvw Xyz::soapXYZService xyz(soap); // generated with soapcpp2 -j -S -qXyz if (!soap_valid_socket(soap_bind(soap, NULL, 8080, BACKLOG))) exit(EXIT_FAILURE); while (1) { if (!soap_valid_socket(soap_accept(soap))) exit(EXIT_FAILURE); if (soap_begin_serve(soap)) { soap_stream_fault(soap, std::cerr); } else if (abc.dispatch() == SOAP_NO_METHOD) { if (uvw.dispatch() == SOAP_NO_METHOD) { if (xyz.dispatch() == SOAP_NO_METHOD) soap_send_fault(soap); // send fault to client } } soap_destroy(soap); soap_end(soap); } soap_free(soap); // safe to delete when abc, uvw, xyz are also deleted } ~~~ However, the while loop iterates for each new connection that is established with `::soap_accept` and does not allow for HTTP keep-alive connections to persist. For our final improvement we want to support HTTP keep-alive connections that require looping over the service dispatches until the connection closes on either end, after which we resume the outer loop. The resulting code is very close to the soapcpp2-generated `::soap_serve` code and the `serve` service class methods, with the addition of the chain of service dispatches in the loop body: ~~~{.cpp} #include "AbcABCService.h" #include "UvwUVWService.h" #include "XyzXYZService.h" #include "envH.h" // include this file last, if it is needed int main() { struct soap *soap = soap_new(); Abc::soapABCService abc(soap); // generated with soapcpp2 -j -S -qAbc Uvw::soapUVWService uvw(soap); // generated with soapcpp2 -j -S -qUvw Xyz::soapXYZService xyz(soap); // generated with soapcpp2 -j -S -qXyz if (!soap_valid_socket(soap_bind(soap, NULL, 8080, BACKLOG))) exit(EXIT_FAILURE); while (1) { if (!soap_valid_socket(soap_accept(soap))) exit(EXIT_FAILURE); soap->keep_alive = soap->max_keep_alive + 1; // max keep-alive iterations do { if ((soap->keep_alive > 0) && (soap->max_keep_alive > 0)) soap->keep_alive--; if (soap_begin_serve(soap)) { if (soap->error >= SOAP_STOP) // if a plugin has served the request continue; // then continue with the next request break; // an error occurred } if (abc.dispatch() == SOAP_NO_METHOD) { if (uvw.dispatch() == SOAP_NO_METHOD) { if (xyz.dispatch() == SOAP_NO_METHOD) soap_send_fault(soap); // send fault to client } } soap_destroy(soap); soap_end(soap); } while (soap->keep_alive); soap_destroy(soap); soap_end(soap); } soap_free(soap); // safe to delete when abc, uvw, xyz are also deleted } ~~~ 🔝 [Back to table of contents](#) ### How to generate WSDL service descriptions {#wsdl} The soapcpp2 tool generates WSDL (Web Service Description Language) service descriptions and XML schema files (XSDs) when processing an interface header file that wasn't generated with wsdl2h. The soapcpp2 tool produces one WSDL file for a set of service operations in the header file. If the header file has no service operations (i.e. no function prototypes) then no WSDL will be generated. The names of the function prototypes of the service operations must use the same namespace prefix and the namespace prefix is used to name the WSDL file. The WSDL file and services can be named with a `//gsoap service name:` directive to specify a service name for each namespace prefix. If multiple namespace prefixes are used to define service operations, then multiple WSDL files will be created and each file describes the set of service operations belonging to that namespace prefix. The soapcpp2 tool also generates XML schema files (XSD files) for all serializable C/C++ types declared in the interface header file input to soapcpp2. These XSD files do not have to be published as the WSDL file already contains the appropriate XML Schema definitions. To customize the WSDL output, use `//gsoap` directives to declare the service name, the endpoint port, and namespace etc: ~~~{.cpp} //gsoap ns service name: example //gsoap ns service type: examplePortType //gsoap ns service port: http://www.example.com/example //gsoap ns service namespace: urn:example ~~~ These are some examples and defaults will be used when directives are not specified. Recommended is to specify at least the service name and namespace URI. More details and settings for the service can be declared as well. See Section \ref directives for more details. In addition to the generation of the WSDL files, a file with a namespace mapping table is generated by the gSOAP soapcpp2 tool. An example mapping table is shown below: ~~~{.cpp} struct Namespace namespaces[] = { { "SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/" }, { "SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/" }, { "xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance" }, { "xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema" }, { "ns", "urn:example" }, // binds "ns" namespace prefix to schema URI { NULL, NULL } }; ~~~ This file should be included in the client or service application, see Section \ref nstable for details on namespace mapping tables. 🔝 [Back to table of contents](#) ### Example {#example8} For example, suppose the following service operations are defined in the `calc.h` header file: ~~~{.cpp} // Content of file "calc.h": //gsoap ns service name: calc int ns__add(double a, double b, double& result); int ns__sub(double a, double b, double& result); int ns__sqrt(double a, double& result); ~~~ One WSDL file `calc.wsdl` will be generated that describes the three service operations:
~~~{.xml} Service definition of function ns__add Service definition of function ns__sub Service definition of function ns__sqrt gSOAP 2.8.70 generated service definition ~~~
The above uses the default settings for the service name, port, and namespace which can be set in the header file with `//gsoap` directives, see Section \ref directives . 🔝 [Back to table of contents](#) ### How to make client-side calls within a service operation {#clientinservice} Invoking a server-side client call requires the use of a new `::soap` context in the service operation itself, which is best illustrated with an example. The following example combines the functionality of two Web services into one new SOAP Web service. The service provides a currency-converted stock quote. To serve a request, the service in turn requests the stock quote and the currency-exchange rate from two services. The currency-converted quote is then calculated and returned. In addition to being a client of two Web services, this service application can also be used as a client of itself to test the implementation. As a client invoked from the command-line, it will return a currency-converted stock quote by connecting to a copy of itself installed as a CGI application on the Web to retrieve the quote after which it will print the quote on the terminal. The header file input to the soapcpp2 tool is given below. The example is for illustrative purposes only because the XMethods stock quote and currency rate services are no longer operational: ~~~{.cpp} // Contents of file "quotex.h": // the first service: stock quotes //gsoap ns1 service namespace: urn:xmethods-delayed-quotes //gsoap ns1 service style: rpc //gsoap ns1 service encoding: encoded int ns1__getQuote(char *symbol, float& result); // the second service: currency exchange //gsoap ns2 service namespace: urn:xmethods-CurrencyExchange //gsoap ns2 service style: rpc //gsoap ns2 service encoding: encoded int ns2__getRate(char *country1, char *country2, float& result); // our new service operation: returns currency-converted stock quote //gsoap ns3 service name: quotex //gsoap ns3 service style: rpc //gsoap ns3 service encoding: encoded //gsoap ns3 schema namespace: urn:quotex int ns3__getQuote(char *symbol, char *country, float& result); ~~~ We run: soapcpp2 quotex.h This generates `soapStub.h`, `soapH.h`, `soapC.cpp` (serializers), `soapClient.cpp` (client stub functions), `soapServer.cpp` (server skeleton functions). The `quotex.cpp` CGI service application is (for source code to create a stand-alone service, see Section \ref stand-alone): ~~~{.cpp} // Contents of file "quotex.cpp": #include "soapH.h" #include "ns1.nsmap" int main() { struct soap soap; soap_init(&soap); soap_serve(&soap); soap_destroy(&soap); soap_end(&soap); soap_done(&soap); } int ns3__getQuote(struct soap *soap, char *symbol, char *country, float& result) { struct soap tsoap; float q, r; soap_init(&tsoap); if (soap_call_ns1__getQuote(tsoap, "http://services.xmethods.net/soap", "", symbol, &q) || soap_call_ns2__getRate(tsoap, "http://services.xmethods.net/soap", NULL, "us", country, &r) { soap_delegate_deletion(&tsoap, &soap); // move tsoap-deserialized data to the soap context if (tsoap->fault) { soap->fault = tsoap->fault; // if one of the calls returned a SOAP Fault, we use it soap_done(&tsoap); return SOAP_FAULT; } soap_done(&tsoap); return soap_receiver_fault(soap, "Cannot access services", NULL); } result = q * r; soap_delegate_deletion(&tsoap, &soap); // move tsoap-deserialized data to the soap context soap_done(&tsoap); return SOAP_OK; } /* Since this app is a combined client-server, it is put together with * one header file that describes all service operations. However, as a consequence we * have to implement the methods that are not ours. Since these implementations are * never called (this code is client-side), we can make them dummies as below. */ int ns1__getQuote(struct soap *soap, char *symbol, float &result) { // dummy: will never be called return SOAP_NO_METHOD; } int ns2__getRate(struct soap *soap, char *country1, char *country2, float &result) { // dummy: will never be called return SOAP_NO_METHOD; } struct Namespace namespaces[] = { { "SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/" }, { "SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/" }, { "xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance" }, { "xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema" }, { "ns1", "urn:xmethods-delayed-quotes" }, { "ns2", "urn:xmethods-CurrencyExchange" }, { "ns3", "urn:quotex" }, { NULL, NULL } }; ~~~ When combining clients and service functionalities, it is recommended to use a single interface header file input to the soapcpp2 tool, since this header file declares both client and server functionalities. As a consequence, however, stub and skeleton functions are generated for all service operations, while the client part will only use the stub functions and the service part will use the skeleton functions. Thus, dummy implementations of the unused service operations are implemented as shown in the example above, which are in fact never used. Three WSDL files are generated by soapcpp2: `ns1.wsdl`, `ns2.wsdl`, and `ns3.wsdl`. Only the `ns3.wsdl` file is required to be published as it contains the description of the combined service, while the others are generated as a side-effect. 🔝 [Back to table of contents](#) ### How to switch to REST from SOAP {#restservice} To switch to RESTful Web APIs from SOAP Web services APIs is simple, just use a directive. To declare HTTP POST as the default HTTP method to use with client-side calls for all service operations associated with the `ns` namespace prefix: ~~~{.cpp} //gsoap ns service protocol: POST ~~~ To declare the HTTP POST method for a specific service operation, use: ~~~{.cpp} //gsoap ns service protocol: POST int ns__webmethod(...); ~~~ You can specify `GET`, `PUT`, `POST`, and `DELETE`. With `GET` the input parameters of the service operations should be primitive types. See Section \ref directives-1. 🔝 [Back to table of contents](#) ## Asynchronous one-way message passing {#oneway1} SOAP messaging is typically synchronous: the client sends a HTTP POST and blocks until the server responds to the request. The gSOAP tools also support asynchronous one-way messaging over HTTP. One-way SOAP service operations are declared as function prototypes with the output parameter specified as a `void` type to indicate the absence of a return value, for example: ~~~{.cpp} int ns__event(int eventNo, void); ~~~ The soapcpp2 tool generates the following functions in `soapClient.cpp`: ~~~{.cpp} int soap_send_ns__event(struct soap *soap, const char URL, const char action, int event); int soap_recv_ns__event(struct soap *soap, struct ns__event *dummy); ~~~ The `soap_send_ns__event` function transmits the message to the destination URL by opening a socket and sending the SOAP encoded message. The socket will remain open after the send. To complete the HTTP POST operation we need to call `::soap_recv_empty_response` to accept the server's HTTP OK or Accept response message that should have an empty message body: ~~~{.cpp} if (soap_send_ns__event(soap, eventNo) || soap_recv_empty_response(soap) soap_print_fault(soap, stderr); ~~~ The generated `soap_recv_ns__event` function can be used to parse a SOAP message, e.g. on the server side. But it is not used on the client side. The `ns__event` structure is declared as: ~~~{.cpp} struct ns__event { int eventNo; } ~~~ The gSOAP generated `soapServer.cpp` code includes a skeleton function called by `::soap_serve` to process the one-way request message: ~~~{.cpp} int soap_serve_ns__event(struct soap *soap); ~~~ This skeleton function calls the user-defined `ns__event(struct soap *soap, int eventNo)` function (note the absence of the void parameter!). However, when this function returns, the skeleton function does not respond with a SOAP response message since no response data is specified. Instead, the user-defined `ns__event` function should call `::soap_send_empty_response` to return an empty response message. For example: ~~~{.cpp} int ns__event(struct soap *soap, int eventNo) { ... // handle event return soap_send_empty_response(soap, 202); // HTTP 202 Accepted } ~~~ 🔝 [Back to table of contents](#) ## How to use XML serializers to save and load application data {#bindings} The gSOAP XML databindings for C and C++ allow a seamless integration of XML in C and C++ applications. Data can be serialized in XML and vice versa. WSDL and XML schema files can be converted to C or C++ definitions. C and C++ definitions can be translated to WSDL and schemas to support legacy ANSI C applications for example. This section explains the basics of mapping XML schema types to C/C++ types using the wsdl2h tool. A more in-depth presentation of C/C++ XML data bindings in gSOAP is documented in [C and C++ XML data bindings](../../databinding/html/index.html). 🔝 [Back to table of contents](#) ### Converting WSDL, WADL, and XML schema to C/C++ with wsdl2h {#wsdl2h} The wsdl2h tool takes WSDL, WADL, and XSD files or URLs to WSDL, WADL, and XSD and generates an interface header file with the command: wsdl2h [options] WSDL WADL and XSD files or URLs... The WSDL 1.1 and 2.0 standards are supported and WADL. If you have any trouble with wsdl2h being able to process WSDLs and XSD files or URLs, then please contact Genivia technical support for assistance. The gSOAP tools support the entire XML schema 1.1 standard, except XPath expressions and assertions. This covers all of the following schema components with their optional attributes shown:
~~~{.xml} ~~~
The supported schema facets are:
~~~{.xml} maps to enum maps to primitive type or a typedef maps to a struct or class maps to enum* (bitmask) maps to extended struct or class with a base class maps to typedef, struct or class validates string lengths validates string lengths validates string lengths validates integer and float types validates integer and float types validates integer and float types validates integer and float types float with formatted output float with formatted output float with formatted output float with formatted output regex pattern, not automatically validated, see note below maps to string, content not validated ~~~
Also supported are:
~~~{.xml} ~~~
A subset of the default type mappings is shown below:
~~~{.xml} xsd:string maps to string (char* or std::string) xsd:boolean maps to bool (C++) or enum xsd__boolean (C) xsd:float maps to float xsd:double maps to double xsd:decimal maps to string, or use #import "custom/float128.h" xsd:duration maps to string, or use #import "custom/duration.h" xsd:dateTime maps to time_t, or use #import "custom/struct_tm.h" xsd:time maps to string (white space collapse applied) xsd:date maps to string (white space collapse applied) xsd:gYearMonth maps to string (white space collapse applied) xsd:gYear maps to string (white space collapse applied) xsd:gMonth maps to string (white space collapse applied) xsd:hexBinary maps to struct xsd__hexBinary xsd:base64Binary maps to struct xsd__base64Binary xsd:anyURI maps to string (white space collapse applied) xsd:anyType maps to an XML string or DOM with wsdl2h -d xsd:QName maps to _QName (QName normalization applied) xsd:NOTATION maps to string (white space collapse applied) ~~~
Automatic validation of `xsd:pattern`-restricted content is possible with a hook to a regex pattern matching engine, see the `::soap::fsvalidate` and `::soap::fwvalidate` callback documentation in Section \ref callback . User-defined mappings can be added to `typemap.dat`, which is used by wsdl2h to map schema types to C/C++ types. For example, the map `xsd:duration` to a custom serializer, add this line to `typemap.dat`: xsd__duration = #import "custom/duration.h" | xsd__duration Then run wsdl2h with the `typemap.dat` file in the current directory or use [`wsdl2h -t mapfile.dat` option `-t mapfile.dat`](#wsdl2h-t) to use `mapfile.dat` instead. This requires compiling `gsoap/custom/duration.c` with your build. Another example is `xsd:dateTime` which is mapped to `time_t`. To expand the range and precision of `xsd:dateTime` we can map `xsd:dateTime` to `struct tm`: xsd__dateTime = #import "custom/struct_tm.h" | xsd__dateTime or to `struct timeval`: xsd__dateTime = #import "custom/struct_timeval.h" | xsd__dateTime This requires compiling `gsoap/custom/struct_tm.c` or `gsoap/custom/struct_timeval.c`, respectively. Non-primitive XSD types are supported, with the default mapping shown below:
~~~{.xml} xsd:normalizedString maps to string xsd:token maps to string xsd:language maps to string xsd:IDREFS maps to string xsd:ENTITIES maps to string xsd:NMTOKEN maps to string xsd:NMTOKENS maps to string xsd:Name maps to string xsd:NCName maps to string xsd:ID maps to string xsd:IDREF maps to string xsd:ENTITY maps to string xsd:integer maps to string xsd:nonPositiveInteger maps to string xsd:negativeInteger maps to string xsd:long maps to LONG64 xsd:int maps to int xsd:short maps to short xsd:byte maps to byte xsd:nonNegativeInteger maps to string xsd:unsignedLong maps to ULONG64 xsd:unsignedInt maps to unsigned int xsd:unsignedShort maps to unsigned short xsd:unsignedByte maps to unsigned byte xsd:positiveInteger maps to string xsd:yearMonthDuration maps to string xsd:dayTimeDuration maps to string xsd:dateTimeStamp maps to string ~~~
String targets are defined in the `typemap.dat` file used by wsdl2h to map XSD types. This allows the use of `char*` and `std::string`. It is possible to map any string types to `wchar_t` and `std::wstring` by adding the following line to `typemap.dat`: xsd__string = | wchar_t* | wchar_t* and xsd__string = | std::wstring By default strings are either `char*` (for C) or `std::string` (for C++) which contain ASCII or UTF-8 content enabled with the runtime flag `#SOAP_C_UTFSTRING`. Note that the XSD types for unlimited numeric values such as `xsd:integer` and `xsd:decimal` are mapped to strings, to preserve the value in case it is too large to store in a 64-bit integer or float. The mapping can be redefined as follows in `typemap.dat`: xsd__decimal = | double xsd__integer = | LONG64 xsd__nonNegativeInteger = typedef xsd__integer xsd__nonNegativeInteger 0 : ; | xsd__nonNegativeInteger xsd__nonPositiveInteger = typedef xsd__integer xsd__nonPositiveInteger : 0 ; | xsd__nonPositiveInteger xsd__positiveInteger = typedef xsd__integer xsd__positiveInteger 1 : ; | xsd__positiveInteger xsd__negativeInteger = typedef xsd__integer xsd__negativeInteger : -1; | xsd__negativeInteger We can also use a `quadmath.h` 128 bit float to store `xsd:decimal`: xsd__decimal = #import "custom/float128.h" | xsd__decimal where `xsd__decimal` is a `__float128` `quadmath.h` type. There are several initialization flags to control XML serialization at run-time: * XML validation is more strictly enforced with `#SOAP_XML_STRICT`. * XML namespaces are enforced when parsing XML, unless disabled with `#SOAP_XML_IGNORENS`. * XML exclusive canonicalization is enabled with `#SOAP_XML_CANONICAL`. * XML default `xmlns="..."` namespace bindings are enforced with `#SOAP_XML_DEFAULTNS`. * XML is indented for enhanced readability with `#SOAP_XML_INDENT`. * XML `xsi:nil` for NULL struct and class members are serialized with `#SOAP_XML_NIL`. * UTF-8 is stored in `char*` and `std::string` with `#SOAP_C_UTFSTRING`. Strict validation catches all structural XML validation violations. For primitive type values it depends on the C/C++ target type that XSD types are mapped to, to catch primitive value content pattern violations. Primitive value content validation is performed on non-string types such as numerical and time values. String values are not automatically validated, unless a `xsd:pattern` is given and the `::soap::fsvalidate` and `::soap::fwvalidate` callbacks are implemented by the user. Alternatively, deserialized string content can be checked at the application level. To obtain C or C++ type definitions for XML schema components, run wsdl2h on the schemas to generate a data binding interface header file. This header file defines the C/C++ type representations of the XML schema components. The header file is then processed by the soapcpp2 tool to generate the serializers for these types. See Section \ref databindings for an overview to use wsdl2h and soapcpp2 to map schemas to C/C++ types to obtain XML data bindings. 🔝 [Back to table of contents](#) ### Mapping C/C++ to XML schema with soapcpp2 {#soapcpp2mapping} To generate serialization code, execute: soapcpp2 [options] file.h The following C/C++ types are supported in the data binding interface header file: ~~~{.cpp} bool enum, enum * (enum * is a "product enumeration" representing a bitmask) (signed or unsigned) char, int8_t, short, int16_t, int, int32_t, long, long long, int64_t, LONG64 size_t (transient, not serializable) float, double, long double (#import "custom/long_double.h") std::string, std::wstring, char[], char*, wchar_t* _XML (a char* type to hold literal XML string content) _QName (a char* type with normalized QName content of the form prefix:name) struct, class (with single inheritance) std::vector, std::list, std::deque, std::set union (requires preceding discriminant member) typedef time_t template <> class (containers require begin(), end(), size(), and insert() methods) void* (requires a preceding __type member to indicate the object pointed to) struct xsd__hexBinary (special pre-defined type to hold binary content) struct xsd__base64Binary (special pre-defined type to hold binary content) struct tm (#import "custom/struct_tm.h") struct timeval (#import "custom/struct_timeval.h") pointers to any of the above (any pointer-linked structures are serializable, including cyclic graphs) std::shared_ptr, std::unique_ptr, std::auto_ptr fixed-size arrays of all of the above ~~~ Additional features and C/C++ syntax requirements: * A header file should not include any code statements, only data type declarations. * Nested structs, classes, and unions are un-nested. * Use `#import "file.h"` instead of `#include` to import other header files. The `#include` and `#define` directives are fine to use, but these are moved into the generated code and then used by the C/C++ compiler. * C++ namespaces are supported, but must cover the entire header file content. * Optional DOM support can be used to store mixed content or literal XML content can be stored in `_XML` strings. Otherwise, mixed content may be lost. Use `soapcpp2 -d` option `-d` for DOM support. See the [XML DOM API](../../dom/html/index.html) documentation for details. * Types are denoted transient using the `extern` qualifier, which prevents serialization of types or struct and class members: ~~~{.cpp} extern class classname; // this class is not serializable struct structname { extern char *name; // this member is not serializable int num; }; ~~~ * Only public members of a class can be serialized: ~~~{.cpp} class name { private: char *secret; // private and protected members are not serializable }; ~~~ and members are public by default in the interface header file for soapcpp2. * Types may be declared `volatile` which means that they are declared elsewhere in the project's source code base and should not be redefined in the soapcpp2-generated code nor changed by the soapcpp2 tool, for example this makes `struct tm` of `time.h` serializable with a selection of its members specified, where `volatile` prevents soapcpp2 from declaring this struct again: ~~~{.cpp} volatile struct tm { int tm_sec; ///< seconds (0 - 60) int tm_min; ///< minutes (0 - 59) int tm_hour; ///< hours (0 - 23) int tm_mday; ///< day of month (1 - 31) int tm_mon; ///< month of year (0 - 11) int tm_year; ///< year - 1900 }; ~~~ * Classes and structs may be declared `mutable` means that they can be augmented with additional members using redefinitions of the struct or class: ~~~{.cpp} mutable class classname { public: int n; // classname has a member 'n' }; mutable class name { public: float x; // classname also has a member 'x' }; ~~~ The `::SOAP_ENV__Header` struct is mutable as well as the `::SOAP_ENV__Fault`, `::SOAP_ENV__Detail`, `::SOAP_ENV__Reason`, and `::SOAP_ENV__Code` structs. The reason is that these structures are augmented with additional members by plugins such as WS-Addressing `gsoap/plugin/wsaapi.h` to support these SOAP-based protocols. * Members of a struct or class are serialized as XML attributes when qualified with '@', for example: ~~~{.cpp} struct record { @ char *name; // XML attribute name int num; // XML element num }; ~~~ * Strings with 8-bit content hold ASCII by default or hold UTF-8 when enabled with runtime flag `#SOAP_C_UTFSTRING`. When enabled, all `std::string` and `char*` strings contain UTF-8. In this way the deserializers populate strings with UTF-8 content and serializers will output strings as holding UTF-8 content. The soapcpp2 tool generates serializers and deserializers for all wsdl2h-generated or user-defined data structures that are specified in the header file input to the soapcpp2 tool. The serializers and deserializers can be found in the soapcpp2-generated `soapC.cpp` file. These serializers and deserializers can be used separately by an application without the need to build a Web services client or service application. This is useful for applications that need to save or export their data in XML or need to import or load data stored in XML format. 🔝 [Back to table of contents](#) ### Serializing C/C++ data to XML {#serialize} The soapcpp2 tool generates the following readers and writers for each serializable data type defined in the data bindings interface file input to soapcpp2: * `int soap_read_T(struct soap*, T *data)` parse XML and deserialize into C/C++ data of type `T`, returns `#SOAP_OK` on success. * `int soap_write_T(struct soap* T *data)` serialize C/C++ data of type `T` into XML, returns `#SOAP_OK` on success. Where `T` is the name of the data type, such as the struct or class name. For other types, see the table further below for the naming conventions used by soapcpp2 to generate these functions. The following `::soap` context variables control the destination and source for XML serialization and deserialization: * `SOAP_SOCKET ::soap::socket` socket file descriptor for socket connection input and output (or `#SOAP_INVALID_SOCKET` when not set). * `ostream *::soap::os` C++ only: output stream used for send operations when non-NULL. * `const char **::soap::os` C only: points to a string pointer to be set with the string content produced, the saved string is allocated and managed by the `::soap` context. * `istream *::soap::is` C++ only: input stream used for receive operations when non-NULL. * `const char *::soap::is` C only: string with input to parse, this pointer advances over the string until a `\0` is found. * `int ::soap::sendfd` when `::soap::socket` = `#SOAP_INVALID_SOCKET`, this fd is used for send operations, default fd is 1 (stdout). * `int ::soap::recvfd` when `::soap::socket` = `#SOAP_INVALID_SOCKET`, this fd is used for receive operations, default fd is 0 (stdin). Additional functions are generated by soapcpp2 for each serializable data type `T` to dynamically allocate data of type `T` on the context-managed heap and to initialize data of type `T`: * `T * soap_new_T(struct soap*)` allocates and initializes data of type `T` in context-managed heap memory, managed data is deleted with `::soap_destroy` (deletes C++ objects) and `::soap_end` (deletes all other data), and you can also use `::soap_malloc` to allocate uninitialized context-managed memory. * `void soap_default_T(struct soap*, T*)` initializes data of type `T`, but C++ classes are augmented with a `soap_default(struct soap*)` method that should be called instead to (re)initialize the class instance. If the class has a `::soap` context pointer member then this member will be set to the first argument passed to this function. The following extra functions are generated by soapcpp2 for deep copying and deletion of entire data structures when using `soapcpp2 -Ecd` options `-Ec` (deep copy) and `-Ed` (deep deletion): - `T * soap_dup_T(struct soap*, T *dst, const T *src)` deep copy `src` into `dst`, replicating all deep cycles and shared pointers when a managing `::soap` context is provided. When `dst` is NULL, allocates space for `dst` and returns a pointer to the allocated copy. Deep copy results in a tree when the `::soap` context is NULL, but the presence of deep cycles will lead to non-termination. Use flag `SOAP_XML_TREE` with managing context to copy into a tree without cycles and pointers to shared objects. Returns `dst` or the allocated copy when `dst` is NULL. - `void soap_del_T(const T*)` deletes all heap-allocated members of this object by deep deletion ONLY IF this object and all of its (deep) members are not managed by a soap context AND the deep structure is a tree (no cycles and co-referenced objects by way of multiple (non-smart) pointers pointing to the same data). Can be safely used after `soap_dup(NULL)` to delete the deep copy. Does not delete the object itself. The following initializing and finalizing functions should be used before and after calling lower-level IO functions such as `::soap_send`, `::soap_send_raw`, `::soap_get0`, `::soap_get1`, and `::soap_http_get_body` (this is not needed when calling the `soap_read_T` and `soap_write_T` functions): * `int soap_begin_send(struct soap*)` start a sending phase. * `int soap_end_send(struct soap*)` flush the send buffer. * `int soap_begin_recv(struct soap*)` start a receiving phase, if an HTTP header is present, parse it first. * `int soap_end_recv(struct soap*)` finalize receiving, read attachments if any, perform SOAP id/href consistency check on deserialized data. These operations do not setup or open or close files or connections. The application should open and close connections or files and set the `::soap::socket`, `::soap::os` or `::soap::sendfd`, `::soap::is` or `::soap::recvfd` streams or descriptors. When `::soap::socket` is `#SOAP_INVALID_SOCKET` and none of the streams and descriptors are set, then the standard input and output will be used. The following options are available to control serialization: ~~~{.cpp} soap_set_mode(soap, SOAP_XML_TREE); // use this for XML without id-ref (no cycles!) soap_set_mode(soap, SOAP_XML_GRAPH); // or use this for XML with id-ref (including cycles) soap_set_namespaces(soap, struct Namespace *nsmap); // set a XML namespace table with xmlns bindings ~~~ See also Section \ref flags to control the I/O buffering and content encoding such as compression. To accurately and safely serialize data structures with cycles and co-referenced objects to an XML stream, two generated functions are called by `soap_write_T` to serialize data of type `T`: `soap_serialize_T` to perform a deep analysis of pointers to detect co-referenced data and cycles, and `soap_put_T` to output the data in XML with id-href (or id-ref) attributes for co-referenced data and cycles. Multi-references with id-href (and id-ref) are part of the SOAP protocol to serialize data accurately, i.e. retaining the structural integrity of the data sent and received. Flag `#SOAP_XML_TREE` turns id-href (id-ref) attributes off (makes `soap_serialize_T` a no-op and ignores them on the receiving end). Flag `#SOAP_XML_GRAPH` should be used with non-SOAP XML output to accurately and safely serialize data structure graphs with co-referenced objects and cycles. The `soap_serialize_T` and `soap_put_T` calls are performed by the generated `soap_write_T` functions, which also call `::soap_begin_send` and `::soap_end_send`. The following table lists the type naming conventions used by soapcpp2 to generate functions: type | name -------------------- | ---------- `char*` | `string` `wchar_t*` | `wstring` `std::string` | `std__string` `std::wstring` | `std__wstring` `char` | `byte` `bool` | `bool` `double` | `double` `int` | `int` `float` | `float` `long` | `long` `long long` | `LONG64` `short` | `short` `time_t` | `time` `unsigned char` | `unsignedByte` `unsigned int` | `unsignedInt` `unsigned long` | `unsignedLong` `unsigned long long` | `ULONG64` `unsigned short` | `unsignedShort` `T`[N] | `ArrayN`OfType where Type is the type name of T `T*` | `PointerToType` where Type is the type name of T `std::vector` | `TemplateOfType` where Type is the type name of T `struct Name` | `Name` `class Name` | `Name` `enum Name` | `Name` Consider for example the following interface header file for soapcpp2 declares a `struct ns__Person`: ~~~{.cpp} struct ns__Person { char *name; }; ~~~ To parse and deserialize a person variable `p` from XML: ~~~{.cpp} struct soap *soap = soap_new(); struct ns__Person *p = soap_new_ns__Person(soap, -1); // -1 is one (non-array) soap->recvfd = 0; // parse from stdout // soap->is = &std::in; // parse from stdin stream (C++ only) // soap->is = cs; // parse from a char *cs string (C only) if (soap_read_ns__Person(soap, p)) soap_print_fault(soap, stderr); ... // use value p soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~ To parse and deserialize XML from a file: ~~~{.cpp} soap->recvfd = open(file, O_RDONLY); if (soap->recvfd >= 0) if (soap_read_ns__Person(soap, p)) soap_print_fault(soap, stderr); close(soap->recvfd); soap->recvfd = 0; ~~~ To parse and deserialize XML from a C++ file stream: ~~~{.cpp} std::fstream fs; fs.open(file, std::ios::in); if (fs) { soap->is = &fs; if (soap_read_ns__Person(soap, p)) soap_print_fault(soap, stderr); fd.close(); soap->is = NULL; } ~~~ Or to parse and deserialize XML from a string stream in C++: ~~~{.cpp} std::stringstream ss; ... // populate stream ss soap->is = &ss; if (soap_read_ns__Person(soap, p)) soap_print_fault(soap, stderr); soap->is = NULL; ~~~ To parse and deserialize XML from a string `cs` in C: ~~~{.cpp} const char *cs = "..."; // populate string cs soap->is = &cs; if (soap_read_ns__Person(soap, p)) soap_print_fault(soap, stderr); soap->is = NULL; ~~~ To serialize a person variable `p` in XML: ~~~{.cpp} struct soap *soap = soap_new1(SOAP_XML_INDENT); struct ns__Person *p = soap_new_ns__Person(soap, -1); // -1 is one (non-array) p->name = "Joe"; soap->sendfd = 1; // send to stdout // soap->os = &std::cout; // send to stdout stream (C++ only) // soap->os = &cs; // send to a char *cs string (C only) if (soap_write_ns__Person(soap, p)) soap_print_fault(soap, stderr); soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~ This produces:
~~~{.xml} Joe ~~~
To send the output to a file: ~~~{.cpp} soap->sendfd = open(file, O_RDWR|O_CREAT, S_IWUSR|S_IRUSR); if (soap->sendfd >= 0) if (soap_write_ns__Person(soap, p)) soap_print_fault(soap, stderr); close(soap->sendfd); soap->sendfd = 1; ~~~ To send the output to a C++ file stream: ~~~{.cpp} std::fstream fs; fs.open(file, std::ios::out); if (fs) { soap->os = &fs; if (soap_write_ns__Person(soap, p)) soap_print_fault(soap, stderr); fd.close(); soap->os = NULL; } ~~~ Or send the output to a C++ string stream to save XML in a string: ~~~{.cpp} std::stringstream ss; soap->os = &ss; if (soap_write_ns__Person(soap, p)) soap_print_fault(soap, stderr); std::strings s = ss.str(); soap->os = NULL; ~~~ To save the output to a string `cs` in C: ~~~{.cpp} char *cs; soap->os = &cs; if (soap_write_ns__Person(soap, p)) soap_print_fault(soap, stderr); soap->os = NULL; ~~~ The string `cs` is populated with XML when successful. This string is managed by the context and deleted with `::soap_end`. As we explained, the `soap_write_T` functions call `soap_serialize_T`, which must be called when the data structure graph to serialize contains co-referenced data and cycles. It must be called to preserve the logical coherence of pointer-based data structures, where pointers may refer to co-referenced objects. By calling `soap_serialize_T`, data structures shared through pointers are serialized only once and referenced in XML using id-refs attributes. The actual id-refs used depend on the SOAP encoding. To turn off SOAP encoding, remove or avoid using the SOAP-ENV and SOAP-ENC namespace bindings in the namespace table. In addition, the `#SOAP_XML_TREE` and `#SOAP_XML_GRAPH` flags can be used to control the output by restricting serialization to XML trees or by enabling multi-ref graph serialization with id-ref attributes. To save the data as an XML tree (with one root) without any id-ref attributes, use the `#SOAP_XML_TREE` flag. The data structure must not contain pointer-based cycles. This flag also instructs the XML parser and deserializer to ignore id-ref attributes. To preserve the exact structure of the data object graph and create XML with one root, use the `#SOAP_XML_GRAPH` output-mode flag (see Section \ref flags ). Using the `#SOAP_XML_GRAPH` flag assures the preservation of the logical structure of the data. Using `#SOAP_XML_TREE` means that no id-refs are output or parsed. With this flag the output will serialize nodes as a tree in XML, which means that nodes may be duplicated when shared by multiple pointers and cycles are broken to prevent infinite serialization. To preserve the graph structure of the nodes in the data structure, use `#SOAP_XML_GRAPH` or use SOAP 1.1 or 1.2 multi-reference serialization (this is the default mode with SOAP serialization). Consider for example the following `struct`: ~~~{.cpp} struct Tricky { int *p; int n; int *q; }; ~~~ The following fragment initializes the pointer members `p` and `q` to point to the value of member `n`: ~~~{.cpp} struct soap *soap = soap_new(); struct Tricky X; X.n = 123; X.p = &X.n; X.q = &X.n; soap_write_Tricky(soap, &X); soap_destroy(soap); soap_end(soap); ~~~ What is special about this data structure is that members `p` and `q` both point to member `n`. When using SOAP 1.1 with gSOAP, the serializers strategically place id elements (also called SOAP 1.1 independent elements) after the root element to identify shared values, where the href attributes of elements `p` and `q` point to:
~~~{.xml}

1 123 ~~~

The above is not valid as plain XML, because there is no single root element, but it is valid XML when placed in a SOAP Body element as intended with SOAP 1.1 messaging. When SOAP 1.2 is used with gSOAP, the output is more accurate, because now both elements `p` and `q` point to element `n`:
~~~{.xml}

123 ~~~

Without using SOAP encoding but using plain XML instead with the `#SOAP_XML_GRAPH` flag set, the output is also accurate with both elements `p` and `q` pointing to element `n`:
~~~{.xml}

123 ~~~

In the last two cases, the generated deserializer for this data type will be able to accurately reconstruct the instance with members `p` and `q` pointing to member `n`. Finally, serialization with `#SOAP_XML_TREE` produces XML trees, which may benefit interoperability but sacrifices the true meaning of serialization, giving three copies of the shared value `1`:
~~~{.xml}

123

123 123
~~~
With the soapcpp2-generated serializers you can define a C++ operator that serializes a specified class instance or type as follows, assuming the `ns__Person` class is declared in an interface header file for soapcpp2: ~~~{.cpp} class ns__Person { public: ns__Person(); ~ns__Person(); void set_name(const char *); const char *get_name(); const char *name; struct soap *soap; }; ~~~ Run `soapcpp2 -0` on this file to generate the serializers with non-SOAP XML namespaces, which we then use in our main program as follows: ~~~{.cpp} #include "soapH.h" #include "ns.nsmap" ns__Person::ns__Person() { name = NULL; soap = soap_new1(SOAP_XML_INDENT | SOAP_XML_TREE); // or SOAP_XML_GRAPH } ns__Person::~ns__Person() { soap_destroy(soap); soap_end(soap); soap_free(soap); } void ns__Person::set_name(const char *name) { this->name = soap_strdup(this->soap, name); } const char *ns__Person::get_name() { return this->name; } std::ostream& operator<<(std::ostream& o, ns__Person& p) { p.soap->os = &o; soap_write_ns__Person(p.soap, &p); p.soap->os = NULL; return o; } std::istream& operator>>(std::istream& i, ns__Person& p) { p.soap->is = &i; soap_read_ns__Person(p.soap, &p); p.soap->is = NULL; return i; } int main() { ns__Person p; p.set_name("Joe"); // serialize person p in XML to stdout: std::cout << p << std::endl; // then parse and deserialize XML from stdin into person p: std::cin >> p; // destructor cleans up person p and its deserialized data } ~~~ In this example we construct an instance of `ns__Person` by setting its `::soap` context struct pointer data member to a new valid context that is deleted by the destructor of this instance. @warning Deserialized class instances with a `::soap` context struct pointer member will have their `::soap` contexts set automatically by the deserializer's context, because `soap_default_T` (or `soap_default` class method) is called that sets the `::soap` context struct pointer of the instance. For example, `soap_read_ns__Person` sets the deserialized `ns__Person::soap` member to the first argument `soap` of `soap_read_ns__Person`, which happens to be `ns__Person::soap` anyway in the example shown above. See Section \ref classmemory . The output of this program is:
~~~{.xml} Joe ~~~
The `xsi` and `xsd` namespaces are used when attributes such as `xsi:nil` and `xsi:type` are serialized, where `xsi:type` may refer to a XSD type such as `xsd:string`. The `xsi:nil` attribute is output when an element is nillable but its corresponding pointer member is NULL and `xsi:type` is output for structs and classes with polymorphic members that are declared with `int __type` member and a `void*` pointer to serialize the value pointed to. Attribute `xsi:type` is also output to serialize derived instances in place of base class instances. Therefore, removing these namespaces from the XML namespace table (`ns.nsmap`) may cause XML parsing and validation issues. 🔝 [Back to table of contents](#) ### Example {#example9} As an example, consider the following data type declarations: ~~~{.cpp} // Contents of file "person.h": enum ns__Gender { male, female }; class ns__Address { public: const char *street; uint32_t number; const char *city; }; class ns__Person { public: const char *name; enum ns__Gender gender; ns__Address address; ns__Person *mother; ns__Person *father; }; ~~~ The following program uses these data types to write to standard output a data structure that contains the data of a person named "John" living at Downing st. 10 in Londen. He has a mother "Mary" and a father "Stuart". After initialization, the class instance for "John" is serialized and encoded in XML to the standard output stream using gzip compression (requires the Zlib library, compile sources with the compile-time flag `#WITH_GZIP`): ~~~{.cpp} // Contents of file "person.cpp": #include "soapH.h" #include "ns.nsmap" int main() { struct soap *soap = soap_new1(SOAP_XML_GRAPH); ns__Person mother, father, john; mother.soap_default(soap); father.soap_default(soap); john.soap_default(soap); mother.name = "Mary"; mother.gender = female; mother.address.street = "Downing st."; mother.address.number = 10; mother.address.city = "London"; mother.mother = NULL; mother.father = NULL; father.name = "Stuart"; father.gender = male; father.address.street = "Main st."; father.address.number = 5; father.address.city = "London"; father.mother = NULL; father.father = NULL; john.name = "John"; john.gender = male; john.address = mother.address; john.mother = &mother; john.father = &father; soap_write_ns__Person(soap, &john); soap_destroy(soap); soap_end(soap); soap_free(soap); } ~~~ The `person.h` interface header file is input to soapcpp2 and the generated code compiled together with `person.cpp`: soapcpp2 -0 person.h c++ -o person person.cpp soapC.cpp stdsoap2.cpp We run the application: ./person The output is:
~~~{.xml} John male
Dowling st. 10 London
Mary female
5
Stuart male
Main st. 13
~~~
Because the C++ compiler stores the constant strings `"Dowling st."` and `"London"` just once, references are included in the output with flag `#SOAP_XML_GRAPH` that preserves the original structure of the data structure serialized. The following program decodes this content from standard input and reconstructs the original data structure on the heap: ~~~{.cpp} #include "soapH.h" #include "ns.nsmap" int main() { struct soap *soap = soap_new(); ns__Person john; if (soap_read_ns__Person(soap, &john)) { soap_print_fault(soap, stderr); } else { ns__Person *mother = john->mother; ns__Person *father = john->father; ... // use the data } soap_destroy(soap); // deletes john, mother and father soap_end(soap); // deletes other managed data and temporaries soap_free(soap); // finalize and delete the context } ~~~ 🔝 [Back to table of contents](#) ### Default values for omitted XML elements and attributes {#default} The soapcpp2 tool generates `soap_default_T` functions for serializable types `T` specified in an interface header file for soapcpp2 The default values of primitive C/C++ types can be easily specified by defining any one or all of the following macros before including the `gsoap/stdsoap2.h` file or by using `#SOAPDEFS_H` or `#WITH_SOAPDEFS_H`: ~~~{.cpp} #define SOAP_DEFAULT_bool #define SOAP_DEFAULT_byte #define SOAP_DEFAULT_double #define SOAP_DEFAULT_float #define SOAP_DEFAULT_int #define SOAP_DEFAULT_long #define SOAP_DEFAULT_LONG64 #define SOAP_DEFAULT_short #define SOAP_DEFAULT_string #define SOAP_DEFAULT_time #define SOAP_DEFAULT_unsignedByte #define SOAP_DEFAULT_unsignedInt #define SOAP_DEFAULT_unsignedLong #define SOAP_DEFAULT_unsignedLONG64 #define SOAP_DEFAULT_unsignedShort #define SOAP_DEFAULT_wstring ~~~ The absence of a data value in a receiving SOAP message will result in the assignment of a default value to a primitive type upon deserialization. Default values can also be assigned to individual `struct` and `class` members of primitive type or pointers to primitive types. For example: ~~~{.cpp} struct MyRecord { char *name = "Unknown"; // optional int value = 9999; enum Status { active, passive } status = passive; } ~~~ Default values are assigned to the members of a struct or class when parsing and deserializing XML into data when XML elements or attributes with the respective values are absent. Assigning default values to members makes these members optional elements and attributes in the corresponding XML schema. Because service operation requests and responses are essentially structs (internally they are structs), default values can also be assigned to service operation parameters. These default parameter values do not specify optional parameters as we normally see with C/C++ function calls. Rather, the default parameter values are used in case an inbound request or response message lacks the XML elements that comprise these parameters. For example, a Web service can use default values to fill-in absent parameters in a SOAP request as follows: ~~~{.cpp} int ns__login(char *uid = "anonymous", char *pwd = "guest", bool granted = true); ~~~ When the request message lacks `uid` or `pwd` elements then the default values are assigned instead. In addition, the default values will show up in the SOAP or XML request and response message examples generated by the soapcpp2 tool. 🔝 [Back to table of contents](#) # The wsdl2h tool {#wsdlin} The wsdl2h tool is an advanced XML data binding tool to convert WSDLs and XML schemas (XSD files) to C or C++. The tool takes WSDL and XSD files or URLs to WSDLs and XSDs, then converts these to a C or C++ interface header file that specifies the properties of the WSDLs and XSDs in a familiar C/C++ syntax. This header file is not intended to be included in your code directly. It should be converted by soapcpp2 to generate the logic for the data bindings. It can however be safely converted by a documentation tool such as Doxygen to analyze and represent the service operations and data in a convenient layout. To this end, the generated interface header file is self-explanatory. The wsdl2h tool can also be used without WSDLs to convert XML schemas (XSDs) to C/C++ to implement XML data bindings in C and C++. The wsdl2h tool generates the XML data binding interface header file with the C/C++ data type equivalents to the XML schema types and components. The soapcpp2 tool then generates the XML data binding implementation source code from the data binding interface header file, meaning the serialization source code to serialize C/C++ data in XML and the client-side stub functions to invoke remote service operations and the server-side skeleton functions to implement XML Web services. Therefore, the creation of C and C++ applications from one of more WSDLs or XSDs is a two-step process. First, to convert a WSDL to C++ we use: wsdl2h file.wsdl This generates an interface header file `file.h`. When using a URL to the WSDL we use [`wsdl2h -o file.h` option `-o file.h`](#wsdl2h-o) to save the file: wsdl2h -ofile.h http://www.example.com/file.wsdl Web service operations in the generated `file.h` header file are converted to function prototypes. Schema types are converted to the equivalent C/C++ types, using file `typemap.dat` to map XML schema types to C/C++ types. The generated header file also contains instructions for the user and has documentation copies from the WSDL as well as various directives related to the Web service properties defined in the WSDL. Multiple WSDL specifications can be processed at once and saved to one interface header file with [`wsdl2h -o file.h` option `-o file.h`](#wsdl2h-o): wsdl2h -o file.h file1.wsdl file2.wsdl file3.wsdl To generate C source code, use [`wsdl2h -c` option `-c`](#wsdl2h-c): wsdl2h -c file.wsdl The wsdl2h tool does not require WSDLs, it also works for XSDs: wsdl2h -o file.h file1.xsd file2.xsd file3.xsd In this case no service operations are found and therefore the interface header file generated does not contain function prototypes representing service operations. When upgrading gSOAP to a newer version it is often not necessary to perform this first step again, since newer versions are backward compatible to previous interface header files generated by wsdl2h. Next, the wsdl2h-generated interface header file `file.h` is input to the soapcpp2 tool to generate the XML data binding implementation logic in C or C++: soapcpp2 file.h You can use soapcpp2 without wsdl2h, by specifying an input interface header file that is not generated by wsdl2h but written by hand for example, see \ref soapcpp2. There are many cases when wsdl2h generates code with `#import` directives, such as `#import "stlvector.h"`, that requires the soapcpp2 tool to import definitions from the `gsoap/import` directory, which can be specified as follows: soapcpp2 -I some_path_to/gsoap/import file.h When WSDLs are converted to C++ source code, you may want to use [`wsdl2h -j` option `-j`](#wsdl2h-j) (or [`wsdl2h -j` option `-i`](#wsdl2h-i)) to generate proxy and service classes: soapcpp2 -j file.h This command generates a couple of C++ source files, more details will follow in Section \ref soapcpp2. Consider for example the following commands to implement a C++ client application: wsdl2h -o calc.h http://www.genivia.com/calc.wsdl soapcpp2 -C -j -I path_to/gsoap/import calc.h The first command generates `calc.h` from the WSDL at the specified URL. The header file is then processed by the soapcpp2 tool to generate the proxy class declared in `soapcalcProxy.h` class and defined in `soapcalcProxy.cpp`. It also generates a file `calc.nsmap` with a XML namespace table which should be included in our source code. The tool also generates `soapStub`, `soapH.h`, and `soapC.cpp`. The latter is also compiled with our application together with `gsoap/stdsoap2.cpp`. 🔝 [Back to table of contents](#) ## wsdl2h options {#wsdl2hoptions} The wsdl2h tool generates one XML data binding interface header file, a file that includes all of the information gathered from the WSDLs and XSDs input to the wsdl tool as command-line arguments. The default output file name of wsdl2h is the first WSDL/schema input file name but with extension `.h` that replaces `.wsdl` (or replaces `.xsd` in case of XSD files specified). When an input file is absent or a WSDL file is loaded from a Web URL, the header output will be produced on the standard output unless [`wsdl2h -o file.h` option `-o file.h`](#wsdl2h-o) is used to save the output to `file.h` (or any other file name specified). The wsdl2h command-line options are: option | result ----------------------------------------- | ------ [`-a`](#wsdl2h-a) | generate indexed struct names for local elements with anonymous types [`-b`](#wsdl2h-b) | generate bi-directional operations to serve one-way response messages (duplex) [`-c`](#wsdl2h-c) | generate C source code [`-c++`](#wsdl2h-c) | generate C++ source code (default) [`-c++11`](#wsdl2h-c) | generate C++11 source code [`-D`](#wsdl2h-D) | make attribute members with default/fixed values optional with pointers [`-d`](#wsdl2h-d) | generate DOM code for xsd:any and xsd:anyType elements [`-e`](#wsdl2h-e) | don't qualify enum names [`-F`](#wsdl2h-F) | add transient members to structs to simulate struct-type derivation in C [`-f`](#wsdl2h-f) | generate flat C++ class hierarchy by removing inheritance [`-g`](#wsdl2h-g) | generate global top-level element and attribute declarations [`-h`](#wsdl2h-h) | display help info and exit [`-I`](#wsdl2h-I) `path` | use `path` to locate WSDL and XSD files [`-i`](#wsdl2h-i) | don't import (advanced option) [`-j`](#wsdl2h-j) | don't generate `::SOAP_ENV__Header` and `::SOAP_ENV__Detail` definitions [`-k`](#wsdl2h-k) | don't generate `::SOAP_ENV__Header` `mustUnderstand` qualifiers [`-L`](#wsdl2h-L) | generate less documentation by removing generic `@note` comments [`-l`](#wsdl2h-l) | display license information [`-M`](#wsdl2h-M) | suppress error "must understand element with wsdl:required='true'" [`-m`](#wsdl2h-m) | use xsd.h module to import primitive types [`-N`](#wsdl2h-N) `name` | use `name` for service prefixes to produce a service for each binding [`-n`](#wsdl2h-n) `name` | use `name` as the base namespace prefix name instead of `ns` [`-O1`](#wsdl2h-O) | optimize by omitting duplicate choice/sequence members [`-O2`](#wsdl2h-O) | optimize `-O1` and omit unused schema types (unreachable from roots) [`-O3`](#wsdl2h-O) | optimize `-O2` and omit unused schema root attributes [`-O4`](#wsdl2h-O) | optimize `-O3` and omit unused schema root elements (use only with WSDLs) [`-Ow2`](#wsdl2h-O) | optimize `-O2` while retaining all derived types of used base types [`-Ow3`](#wsdl2h-O) | optimize `-O3` while retaining all derived types of used base types [`-Ow4`](#wsdl2h-O) | optimize `-O4` while retaining all derived types of used base types [`-o`](#wsdl2h-o) `file` | output to file [`-P`](#wsdl2h-P) | don't create polymorphic types inherited from `xsd__anyType` [`-p`](#wsdl2h-p) | create polymorphic types inherited from base `xsd__anyType` (automatic when the WSDL or XSD contains polymorphic definitions) [`-Q`](#wsdl2h-Q) | make `xsd__anySimpleType` equal to `xsd__anyType` to use as the base type [`-q`](#wsdl2h-q) `name` | use `name` for the C++ namespace of all declarations [`-R`](#wsdl2h-R) | generate REST operations for REST bindings in the WSDL [`-r`](#wsdl2h-r) `host[:port[:uid:pwd]]` | connect via proxy `host`, `port`, and proxy credentials `uid` and `pwd` [`-r`](#wsdl2h-r) `:uid:pwd` | connect with authentication credentials `uid` and `pwd` [`-S`](#wsdl2h-S) `name` | use `name` instead of `soap` for the soap context included in C++ classes as a member variable or use `-S ""` to remove it [`-s`](#wsdl2h-s) | don't generate STL code (no std::string and no std::vector) [`-t`](#wsdl2h-t) `file` | use type map file instead of the default file typemap.dat [`-U`](#wsdl2h-U) | map Unicode XML names to UTF-8-encoded Unicode C/C++ identifiers [`-u`](#wsdl2h-u) | don't generate unions [`-V`](#wsdl2h-V) | display the current version and exit [`-v`](#wsdl2h-v) | verbose output [`-W`](#wsdl2h-W) | suppress warnings [`-w`](#wsdl2h-w) | always wrap response parameters in a response struct [`-X`](#wsdl2h-X) | don't qualify part names to disambiguate doc/lit wrapped patterns [`-x`](#wsdl2h-x) | don't generate `_XML any` and `_XML anyAttribute` extensibility elements [`-y`](#wsdl2h-y) | generate typedef synonyms for structs and enums [`-z1`](#wsdl2h-z) | compatibility with 2.7.6e: generate pointer-based arrays [`-z2`](#wsdl2h-z) | compatibility with 2.7.15: qualify element/attribute referenced members [`-z3`](#wsdl2h-z) | compatibility with 2.7.16 to 2.8.7: qualify element/attribute references [`-z4`](#wsdl2h-z) | compatibility up to 2.8.11: don't generate union structs in std::vector [`-z5`](#wsdl2h-z) | compatibility up to 2.8.15: don't include minor improvements [`-z6`](#wsdl2h-z) | compatibility up to 2.8.17: don't include minor improvements [`-z7`](#wsdl2h-z) | compatibility up to 2.8.59: don't generate `std::vector` of class of union [`-z8`](#wsdl2h-z) | compatibility up to 2.8.74: don't generate qualifiers for doc/lit wrapped patterns [`-_`](#wsdl2h-_) | don't generate `_USCORE` (replace with Unicode `_x005f`) The following subsections explain the options in detail. The source code examples generated by wsdl2h are slightly simplified by removing comments and some other details without changing their meaning to improve readability. 🔝 [Back to table of contents](#) ### wsdl2h -a {#wsdl2h-a} This option generates indexed identifier names for structs, classes, unions, and enums declared for local elements with local (i.e. anonymous) types. When local elements and attributes have local types that are mapped to a struct, class, union, or enum, the generated type name is normally the outer struct/class name concatenated with the element/attribute name. For example:
~~~{.xml} ~~~
By default without this option, this schema is translated by wsdl2h to the following interface header file declaration: ~~~{.cpp} class ns__TypeWithNestedType // complexType { public: class ns__TypeWithNestedType_element // local complexType { public: std::string nested_element; // nested required element } element; // required element }; ~~~ By contrast, with `wsdl2h -a` option `-a` we obtain an indexed local class `_ns__struct_1` in the generated interface header file for soapcpp2: ~~~{.cpp} class ns__TypeWithNestedType // complexType { public: class _ns__struct_1 // local complexType { public: std::string nested_element; // nested required element } element; // required element }; ~~~ The next local struct or class is named `_ns__struct_2` and so on. The same indexing applies to local unions and enums. @note The soapcpp2 tool always un-nests nested struct, class, union and enum declarations, which means that the above eventially results in the following source code generated by soapcpp2: ~~~{.cpp} class _ns__struct_1 { public: std::string nested_element; }; class ns__TypeWithNestedType { public: _ns__struct_1 element; }; ~~~ 🔝 [Back to table of contents](#) ### wsdl2h -b {#wsdl2h-b} This option generates bi-directional operations (duplex operations) intended for asynchrounous server operations. The bi-directional operations for server response messages are generated in addition to the request-response operations. For example, the wsdl2h tool generates the following declaration of a service operation `ns__add` for a hypothetical calculator Web service: ~~~{.cpp} int ns__add( double a, double b, double& result ); ~~~ By contrast, with this option `-b` we obtain an additional one-way operation `ns__addResponse` to send and receive one-way response messages: ~~~{.cpp} int ns__addResponse( double result, void ); int ns__add( double a, double b, double& result ); ~~~ Where `void` as a result parameter means that the operation uses "one-way" messaging, in this case to send and receive response messages one-way asynchronously: - `int soap_send_ns__addResponse(struct soap *soap, const char *endpoint, const char *action, double& result)` - `int soap_recv_ns__addResponse(struct soap *soap, double& result)` At the sender side use `soap_send_ns__addResponse` to send the message one-way, followed by `::soap_recv_empty_response` to receive the HTTP acknowledgment. At the receiver side use `soap_recv_ns__addResponse`. To develop a server, simply implement `soap_ns__addResponse` to handle the service operation and in this function call `::soap_send_empty_response` to send the HTTP acknowledgment. The same applies to C++ proxy classes generated by soapcpp2. @note Version 2.8.75 of gSOAP and greater generate send and receive functions for each client-side call function. This means that a client application can simply call `soap_send_ns__add` to send the request and then call `soap_recv_ns__add` to receive the response after polling the server connection with `::soap_ready` to check if the server is ready (`::soap_ready` returns `#SOAP_OK`) to send the response message as a reply message to be received by the client. Therefore, this option `-b` is not required to implement asynchronous request-response messaging but rather adds one-way asynchronous response messaging as well. 🔝 [Back to table of contents](#) ### wsdl2h -c -c++ -c++11 {#wsdl2h-c} This option sets the source code output to C, C++, or C++11, respectively. For C++ and C++11 you can also use [`wsdl2h -s` option `-s`](#wsdl2h-s) to replace `std::vector` by arrays and replaces `std::string` by `char*`. Use a [`typemap.dat` file](#typemap) to specify further details for the source code output generated by wsdl2h. 🔝 [Back to table of contents](#) ### wsdl2h -D {#wsdl2h-D} This option makes attribute members of a struct or class with default or fixed values optional with pointers. Elements with default and fixed values are not affected by this option. Without this option, optional attributes with default or fixed values are always output in XML, because the struct/class attribute member is not a pointer. This does not negatively affect the meaning of the XML produced, because omitted attributes are replaced by their default or fixed value. For example:
~~~{.xml} ~~~
By default without this option, this schema is translated by wsdl2h to the following interface header file declaration: ~~~{.cpp} class ns__data { public: std::string* foo 0 = "abc"; // optional element with default value "abc" @ int bar 0 = 123; // optional with default value 123 }; ~~~ The deserializer populates the attribute value with the default or fixed value when the attribute is omitted from XML. The element is populated when the element is empty, i.e. `` or ``, but not when it is omitted, as per the W3C XML Schema standards. This option forces the optional attributes to be pointer-based members, meaning that their output can be turned on or off by setting the pointer to a value or to NULL: ~~~{.cpp} class ns__data { public: std::string* foo 0 = "abc"; // optional element with default value "abc" @ int* bar 0 = 123; // optional with default value 123 }; ~~~ @warning In this case the deserializer will not populate the attribute value with the default or fixed value when the attribute is omitted from XML, which differs from the W3C XML schema standards. 🔝 [Back to table of contents](#) ### wsdl2h -d {#wsdl2h-d} This option replaces literal XML strings `_XML` (a `char*` string with XML content) with DOM nodes that are used to store the content of `xsd:any`, `xsd:anyAttribute` `xsd:anyType`, and mixed content values. The [DOM API](#dom) offers more features to manipulate XML content compared to the literal `_XML` string type. The DOM node type `xsd__anyType` of the gSOAP [DOM API](#dom) is imported in the wsdl2h-generated interface header file with `#import "dom.h"` where `dom.h` is located in the `gsoap/import` directory. This requires compiling `gsoap/dom.c` in C and `gsoap/dom.cpp` in C++. For example:
~~~{.xml} ~~~
By default without this option, this schema is translated by wsdl2h to the following interface header file declarations: ~~~{.cpp} class xsd__anyType { public: _XML __item; // XML string content }; class ns__data : public xsd__anyType { public: xsd__anyType* foo; _XML __any; // Store any element content in XML string @ _XML __anyAttribute; // A placeholder that has no effect }; ~~~ The `xsd__anyType` type has `_XML` simpleContent stored in `__item`. Names starting with double underscores have no representation in XML as elements or attribute names, meaning that only their values matter. Therefore, `_XML __any` holds the element and its content in a string. With `wsdl2h -d` option `-d` we obtain: ~~~{.cpp} #import "dom.h" // imports xsd__anyType as a DOM node class ns__data : public xsd__anyType { public: xsd__anyType* foo; // Store element in DOM soap_dom_element xsd__anyType __any; // Store any element content in DOM soap_dom_element @ xsd__anyAttribute __anyAttribute; // Store anyAttribute content in DOM soap_dom_attribute linked node structure }; ~~~ See [DOM API](#dom) for details on how to use the `xsd__anyType` and `xsd__anyAttribute`. 🔝 [Back to table of contents](#) ### wsdl2h -e {#wsdl2h-e} This option removes the prefix qualifier from enumeration names. Without this option all enumeration names are prefixed by their `enum` name to ensure that enumeration names do not clash with other constants and enumeration names. For example:
~~~{.xml} ~~~
By default without this option, this schema is translated by wsdl2h to the following interface header file declarations: ~~~{.cpp} enum ns__engine { ns__engine__ON, ns__engine__OFF }; enum ns__light { ns__light__ON, ns__light__OFF, ns__light__BROKEN }; ~~~ By contrast, with `wsdl2h -e` option `-e` we obtain: ~~~{.cpp} enum ns__engine { ON, OFF }; enum ns__light { ON_, OFF_, BROKEN }; ~~~ Where enumeration names are suffixed with underscores to make them unique. Note that C++11 scoped enumerations can be used with [`wsdl2h -c++11` option `-c++11`](#wsdl2h-c), which makes option `-e` useless. 🔝 [Back to table of contents](#) ### wsdl2h -F {#wsdl2h-F} This option produces interface header files with struct/class declarations that simulate inheritance using transient pointer members to derived types. This option is particularly useful for C source code generation when derived types are required by the application. Derived type values are indicated by `xsi:type` attributes in XML with the derived type name. This option can also be used for C++ to replace class inheritance by simulated inheritance using transient pointer members in base classes that point to the value of a derived type, meaning that the base class instance is replaced by the derived class instance. This option also removes pointers from array and container item types. These pointers are normally added to ensure containers can contain derived type values, but pointers are no longer needed by the simulated approach that add pointer members to the base classes. For example:
~~~{.xml} ~~~
By default without this option, this schema is translated by `wsdl2h -c` option `-c` to the following interface header file declaration in C that lacks inheritance: ~~~{.cpp} struct ns__base { int value; }; struct ns__derived1 { int value; // base type value of ns__base char *name; // extension }; struct ns__derived2 { int value; // base type value of ns__base float x; // extension }; struct ns__derived3 { int value; // derived1 type value of ns__base char *name; // derived1 type float x; // extension }; ~~~ By contrast, with `wsdl2h -c -F` option `-F` we obtain an interface header file with simulated inheritance using transient pointer members of base types pointing to derived types: ~~~{.cpp} struct ns__base { [ struct ns__derived1 *ns__derived1; ] // points to derived type [ struct ns__derived2 *ns__derived2; ] // points to derived type int value; }; struct ns__derived1 { int value; // base type value of ns__base char *name; // extension [ struct ns__derived3 *ns__derived3; ] // points to derived type }; struct ns__derived2 { int value; // base type value of ns__base float x; // extension }; struct ns__derived3 { int value; // derived1 type value of ns__base char *name; // derived1 type float x; // extension }; ~~~ Each transient pointer member name that is used to point to a derived type must match the type name as shown, but trailing underscores are allowed in the member name and type name, to prevent name clashes. This latter form supports `xsi:type` attributes in XML with the derived type name to replace base type values by derived type values at runtime by setting one of the transient pointer members to non-NULL. For example, assume `ns:data` has a base type `ns__base` (i.e. declared as `struct ns__base data`) then the following is legal and serializable:
~~~{.xml} 123 ~~~
This is serialized XML for `data.value` with `data.ns__derived1` and `data.ns__derived2` both set to NULL.
~~~{.xml} 123 abc ~~~
This is serialized XML for `data.ns__derived1->value` and `data.ns__derived1->name` where `data.ns__derived1` is non-NULL, for example allocated and set with `data.ns__derived1 = soap_new_ns__derived1(soap)`.
~~~{.xml} 123 3.14 ~~~
This is serialized XML for `data.ns__derived2->value` and `data.ns__derived2->x` where `data.ns__derived1` is NULL and `data.ns__derived2` is non-NULL, for example allocated and set with `data.ns__derived2 = soap_new_ns__derived2(soap)`.
~~~{.xml} 123 abc 3.14 ~~~
This is serialized XML for `data.ns__derived1->ns__derived3->value`, `data.ns__derived1->ns__derived3->name`, and `data.ns__derived1->ns__derived3->x` where `data.ns__derived1` and `data.ns__derived1->ns__derived3` are non-NULL. Note that C++ class inheritance achieves the same results for base and derived types, but without the use of transient pointer members. However, this requires container values to be pointers to support type derivation (class members are already pointers), as generated by wsdl2h for C++. 🔝 [Back to table of contents](#) ### wsdl2h -f {#wsdl2h-f} This option removes C++ class inheritance to produce a flat C++ class hierarchy similar to structs in C as generated by wsdl2h. As a side effect, derived type values can no longer be serialized in place of base type values, see also [`wsdl2h -F` option `-F`](#wsdl2h-F). Basically this option removes support for `xsi:type` in XML that indicates a derived type that is restricted or extended from its base type. This option also removes pointers from array and container item types, because there are no derived types that could extend the item value types. These pointers are normally added to ensure containers can contain derived type values in addition to the base type values. For example:
~~~{.xml} ~~~
By default without this option, this schema is translated to the following interface header file declaration in C++ with base and derived classes: ~~~{.cpp} class ns__base { public: int value; }; class ns__derived1 : public ns__base { public: char *name; // extension }; class ns__derived2 : public ns__base { public: float x; // extension }; class ns__derived3 : public ns__derived1 { public: float x; // extension }; ~~~ By contrast, with `wsdl2h -f` option `-f` we obtain an interface header file without inheritance but with classes that are extended with the base class members: ~~~{.cpp} class ns__base { public: int value; }; class ns__derived1 { public: int value; // base type value of ns__base char *name; // extension }; class ns__derived2 { public: int value; // base type value of ns__base float x; // extension }; class ns__derived3 { public: int value; // derived1 type value of ns__base char *name; // derived1 type float x; // extension }; ~~~ This former form supports `xsi:type` attributes in XML with the derived type name to replace base type values by derived type values at runtime. But this latter form does not support `xsi:type` attributes in XML and only the base class can be serialized, for example `ns__base data`:
~~~{.xml} 123 ~~~
This is serialized XML for `data.value`.
~~~{.xml} 123 abc ~~~
This example can be deserialized when `#SOAP_XML_STRICT` is not enabled, but only the `value` is retained in `data.value`. However, when `#SOAP_XML_STRICT` is enabled, deserialization fails due to the additional element `name` that is rejected. 🔝 [Back to table of contents](#) ### wsdl2h -g {#wsdl2h-g} This option adds global top-level element and attribute declarations to the interface header file generated by wsdl2h. For example:
~~~{.xml} ~~~
By default without this option, this schema is translated to the following C++ interface header file (the C interface header file is similar) that declares the `ns__record` type for `tns:record` but does not declare attribute `tns:type` and element `tns:data`: ~~~{.cpp} typedef std::string xsd__QName; class ns__record { public: std::string name; int value; }; ~~~ By contrast, with `wsdl2h -g` option `-g` we obtain an interface header file with the attribute and element declarations: ~~~{.cpp} typedef std::string xsd__QName; class ns__record { public: std::string name; int value; }; typedef ns__record _ns__data; typedef xsd__QName _ns__type; ~~~ This defines `_ns__type` and `_ns__data`, where the latter can be used as a root element to serialize its content with the soapcpp2-generated readers and writers: ~~~{.cpp} struct soap *soap = soap_new(); _ns__data data; if (soap_read__ns__data(soap, &data)) ... // error if (soap_write__ns__data(soap, &data)) ... // error ~~~ which parses and re-writes the XML fragment:
~~~{.xml} abc 123 ~~~
Note that top-level element and attribute type names start with an underscore to distinguish them from types. This convention is also used by soapcpp2 to generate schemas that define top-level attributes and elements. Note that a schema may define a global top-level element with a local type, for example:
~~~{.xml} ~~~
This schema is translated to the following C++ interface header file (the C interface header file is simular) that declares the `_ns__record` type and element for the `tns:record` top-level element: ~~~{.cpp} class _ns__record { public: std::string name; int value; }; ~~~ In this case option `-g` has no effect, because `tns:record` has a local type that may be used elsewhere in the schema. 🔝 [Back to table of contents](#) ### wsdl2h -h {#wsdl2h-h} This option displays help info and then exits. 🔝 [Back to table of contents](#) ### wsdl2h -I {#wsdl2h-I} This option specifies a directory path to search for WSDL and XSD files. For example: wsdl2h -I path file.wsdl This searches `path` for `.wsdl` and `.xsd` files that are imported by `file.wsdl` and by other imported files. When a WSDL or XSD file imports another file then: - a file name referenced by `http://` or by `https://` is retrieved from the specified URL. - a file name referenced by `file://` is retrieved from the path specified relative to the directory in which `wsdl2h` is run and the `-I` option can be used to change that location to import from. - a file name without a path (i.e. has no `/`) or a file name with path stating with `../` are considered files located at relative path locations with respect to the current WSDL and XSD that is importing this file - otherwise, imported files are considered relative to the directory in which `wsdl2h` is run and the `-I` option can be used to change that location to import from. WSDL and XSD files that import other WSDL and XSD files typically use relative paths, at least that is recommended by best practices. If absolute paths are used then wsdl2h may fail to find the imported WSDLs and XSDs. This option resolves relative paths but does not help to resolve absolute paths. In the worst case one must edit the WSDLs and XSDs to refer to proper file locations. 🔝 [Back to table of contents](#) ### wsdl2h -i {#wsdl2h-i} This option skips over schema `import` and as a result none of the imported schemas and their components are imported. There are two reasons to use this option: - when imported components are already declared in interface header files that are imported into the main interface header file with `#import`, and - when imported schemas are explicitly provided with the wsdl2h command as command line arguments, which means that the specified schemas will be used instead of the imported schemas. This may help to resolve issues when imported files are not found by wsdl2h. The schema `targetNamespace` namespace names are relevant when schemas reference imported schemas by their namespace, not the schema file name. 🔝 [Back to table of contents](#) ### wsdl2h -j {#wsdl2h-j} This option skips the generation of `::SOAP_ENV__Header` and `::SOAP_ENV__Detail` structure definitions, assuming that these are manually replaced in the generated interface header file for soapcpp2. 🔝 [Back to table of contents](#) ### wsdl2h -k {#wsdl2h-k} This option skips the generation of `mustUnderstand` qualifiers for `::SOAP_ENV__Header` members. This removes the `mustUnderstand="true"` XML attributes from SOAP Headers in SOAP messages. As per SOAP standard, SOAP Headers with `mustUnderstand="true"` must not be ignored by receivers. 🔝 [Back to table of contents](#) ### wsdl2h -L {#wsdl2h-L} This option generates less documentation by removing generic `@note` comments from the interface header file output, thereby reducing the size of the output without removing critical information. 🔝 [Back to table of contents](#) ### wsdl2h -l {#wsdl2h-l} This option displays license information. 🔝 [Back to table of contents](#) ### wsdl2h -M {#wsdl2h-M} This option suppresses the wsdl2h error message "must understand element with wsdl:required='true'" This error indicates that a (special) WSDL construct was used that is marked `wsdl:required="true"`, meaning that must not be ignored by the WSDL processor (unless the developer knows what he or she is doing). 🔝 [Back to table of contents](#) ### wsdl2h -m {#wsdl2h-m} This option tells wsdl2h to use `xsd.h` to define the primitive XSD types instead of generating them in the interface header file for soapcpp2. This option offers an alternative to the use of `typemap.dat` to redefine primitive XSD types by defining them all together instead of on a type-by-type basis. The interface header file output by wsdl2h includes `#import "xsd.h"`. 🔝 [Back to table of contents](#) ### wsdl2h -N {#wsdl2h-N} This option specifies a name to be used as a service namespace prefix for each WSDL binding. By default without this option, the wsdl2h tool warns when it reads one or more WSDLs that define multiple bindings: Warning: 3 service bindings found, but collected as one service (use option -Nname to produce a separate service for each binding) This means that all 3 services will be collected under one name. When proxy and service classes are generated with `soapcpp2 -i` option `-i` or with `soapcpp2 -j` option `-j` then the service operations are collected into one proxy and service class. Essentially only one namespace is used. This may lead to clashes when multiple bindings define the same Web service operations (name clashes are resolved by wsdl2h by adding trailing underscores). By contrast, with `wsdl2h -N name` option `-N name` we obtain an interface header file that uses the specified name as a prefix to define the service bindings and service operations. For example: wsdl2h -N foo file.wsdl If `file.wsdl` has multiple bindings, then the Web service operations associated with each binding are identified by their prefix `foo1`, `foo2`, `foo3`, and so on. As a result, we obtain more than one proxy and service class generated by soapcpp2, one for each binding. 🔝 [Back to table of contents](#) ### wsdl2h -n {#wsdl2h-n} This option changes the default `ns` namespace prefix to the specified prefix name. By default without this option, the XML namespace prefix is `ns` which results in the generation of prefixes `ns1`, `ns2`, `ns3`, and so on. For example: wsdl2h -n foo file.wsdl This generates namespace prefixes `foo1`, `foo2`, `foo3`, and so on. @warning It is strongly recommended to define namespace prefixes in the [`typemap.dat` file](#typemap) to prevent future runs of wsdl2h to produce namespace prefixes that are not in the same original order. For example when the order of WSDLs and XSDs changes or if new WSDLs and XSDs are added. Therefore, do not use this option unless the single WSDL processed by wsdl2h is relatively simple and does not import WSDLs and XSDs. 🔝 [Back to table of contents](#) ### wsdl2h -O {#wsdl2h-O} This option optimizes the generated interface header file: - `-O1` removes duplicate choice/sequence members; - `-O2` optimize with `-O1` and remove unused schema types (types that are unreachable from top-level schema element and attribute roots); - `-O3` optimize with `-O2` and remove unused schema top-level root attributes; - `-O4` optimize with `-O3` and remove unused schema top-level root elements, only retain the root elements used by WSDLs. Use this option only when converting WSDLs (and their associated XSD schemas) to source code, not when solely converting XSD schemas to source code. Option `-O4` is the most aggressive. When used only for one or more XSDs as input to wsdl2h, the output will be empty because removing the root elements (and attributes) results in removing all types from the schema. However, this option is safe to use with WSDLs to aggressively remove all unused schema components that are unreachable from the Web service operation parameter elements and types. Option `-O3` is safe to use with one or more XSDs as input to wsdl2h instead of WSDLs, for example when developing an XML application that serializes data as XML root elements (`wsdl2h -g` [option `-g`](#wsdl2h-g) is recommended in this case). Optimization by schema slicing removes unused types, which are types that are unreachable from top-level schema element and attribute roots. A type is marked as *used* when: - it is explicitly used by one or more top-level elements and attributes; - it is used as a type by a child element or attribute of a complexType that is marked as *used*; - it is used as the base type of an extension or restriction of a simpleType or complexType that is marked as *used*. Marking proceeds recursively until no more types can be marked. All remaining unused types are removed. Top-level elements and attributes are selectively marked unused and removed depending on the level of optimization applied, with `-O3` removing unused top-level attributes and `-O4` removing unused top-level elements except for all elements used in the specified WSDLs. Aggressive optimization with options `-O2`, `-O3`, and `-O4` removes derived type extensions of a base type when the derived types are not marked as *used*. However, in certain messaging scenarios this may have the undesired effect that this limits the choice of derived types that can be used to replace a base type in XML messages, because a derived type may have been removed when it is not marked as *used* elsewhere in the WSDLs and XSD schemas. A derived type that replaces a base type in an XML message is indicated by a `xsi:type` attribute with the QName value of the derived type. The wsdl2h tool generates a C++ class hierarchy to support type derivation, so assigning a derived type value instead of a base type value to a pointer member is automatically serialized in XML with the specified derived value (which is indicated by `xsi:type` attribute in the XML message). For C applications, we should use `wsdl2h -c -F` [option `-c`](#wsdl2h-c) and [option `-F`](#wsdl2h-F) to simulate inheritance in C. In both cases it is recommended to use the following options to retain all derived type extensions of a base type that is marked as *used*: - `-Ow2` optimize with `-O2` to remove unused schema types, but retain types that are derived types of base types that are marked as used. . - `-Ow3` optimize with `-O3` to remove unused schema top-level root attributes, but retain types that are derived types of base types that are marked as used.. - `-Ow4` optimize with `-O4` to remove unused schema top-level root elements, but retain types that are derived types of base types that are marked as used. This permits a base type value (typically a struct or class member that is a pointer to a base type) to be assigned a derived type in C++, which is serialized in XML with a `xsi:type` attribute to indicate the type of the derived value. Likewise, XML data with derived type values are deserialized to C/C++ data automatically. Inheritance is simulated in C, see [option `-F`](#wsdl2h-F). 🔝 [Back to table of contents](#) ### wsdl2h -o {#wsdl2h-o} This option specifies a file name for the wsdl2h interface header file output. By default without this option, the wsdl2h tool writes the interface header file to the file named after the first file name input at the command line, but using `.h` as the file name extension. When the input to the wsdl2h tool consists of URLs, the wsdl2h tool writes its output to standard output (usually the screen). Use this option to specify a file instead. For example: wsdl2h calc.wsdl This saves `calc.h` because the first file specified on the command line is `calc.wsdl`. Option `-o` should be used when a URL is specified on the command line: wsdl2h -o calc.h http://www.genivia.com/calc.wsdl This saves the interface header file `calc.h`. 🔝 [Back to table of contents](#) ### wsdl2h -P {#wsdl2h-P} This option disables the generation of types inherited from the `xsd__anyType` base type. This option has effect only when [`wsdl2h -p` option `-p`](#wsld2h-p) is used or when the wsdl2h tool detects that `xsd:anyType` is used (thereby implicitly and automatically enabling option `-p`), which means that `xsd__anyType` should be a base type for all possible types defined in the schemas. 🔝 [Back to table of contents](#) ### wsdl2h -p {#wsdl2h-p} This option makes all types inherit `xsd__anyType` to support full polymorphism. This option is automatically enabled when the wsld2h tool detects that `xsd:anyType` is used, which means that `xsd__anyType` should be a base type for all possible types defined in the schemas. To disable, use [`wsdl2h -P` option `-P`](#wsld2h-P). For example:
~~~{.xml} ~~~
This schema is translated to the following C++ interface header file that declares the `xsd__anyType` type with `_XML` simpleContent (meaning that `__item` contains element content as per gSOAP convention) and the `ns__data` class: ~~~{.cpp} class xsd__anyType { public: _XML __item; }; class xsd__string_ : public xsd__anyType { public: std::string __item; }; class ns__data : public xsd__anyType { public: std::string value; std::vector item; }; ~~~ The `xsd__anyType` pointer values of the items of the vector can be assigned derived class instances to serialize any type of value declared in the interface header file, including the `xsd__string_` wrapper class with simpleContent and the `ns__data` class with complexContent. This schema is translated to the following C interface header file with `wsdl2h -c -F` [option `-c`](#wsdl2h-c) and [option `-F`](#wsdl2h-F) to simulate inheritance in C: ~~~{.cpp} struct xsd__string_ { char* __item; }; struct xsd__anyType_ { _XML __item; [ struct xsd__string_ *xsd__string; ] [ struct ns__data *ns__data; ] }; struct ns__data { char* value; $ int __sizeitem; struct xsd__anyType_* item; }; ~~~ The `xsd__anyType_` values of items of the dynamic array (`item` points to an array of size `__sizeitem` which is a special member to indicate dynamic arrays) can be assigned base `xsd__anyType_` and derived types, see [`wsdlh2 -F` option `-F`](#wsdl2h-F). 🔝 [Back to table of contents](#) ### wsdl2h -Q {#wsdl2h-Q} This option makes `xsd__anySimpleType` equal to `xsd__anyType` to use as the base type for derivation. This option is more effective when used with [`wsdl2h -p` option `-p`](#wsdl2h-p) for C++ applications and [`wsdl2h -F` option `-F`](#wsdl2h-F) for C applications. This option can also be used with [`wsdl2h -d` option `-d`](#wsdl2h-d) to make `xsd__anySimpleType` equal to a DOM node. Without option `-Q`, the `xsd__anySimpleType` type is just a C/C++ string generated by wsdl2h: ~~~{.cpp} typedef char* xsd__anySimpleType; // in case of C typedef std::string xsd__anySimpleType; // in case of C++ ~~~ The reason for this choice is that some WSDLs and XSD schemas use `xsd:anySimpleType` to declare XML attributes of any type (because XML attributes must be simple types `xsd:anyType` is invalid to use for attributes). The values of XML attributes of type `xsd:anySimpleType` can be any character data essentially. There is no mechanism to indicate the actual type of the attribute value used, unlike elements that are annotated with `xsi:type` attribute with the derived type as its QName value. Therefore, by considering `xsd__anySimpleType` just strings we can provide any value for XML attributes of type `xsd:anySimpleType`. However, there are other uses of `xsd__anySimpleType` in XSD schemas, where essentially `xsd__anySimpleType` serves the same purpose as `xsd__anyType` to provide a base type for derived types, but restricts the derived types to simple types. Unfortunately, these two cases clash: we want to use C/C++ strings for XML attributes of type `xsd:anySimpleType` and also use `xsd:anySimpleType` as a base class for derived types. Option `-Q` enables the latter case by making `xsd__anySimpleType` equal to `xsd__anyType` so that elements of type `xsd:anySimpleType` can be serialized with a derived type, using inheritance in C++ and by using simulated inheritance in C using [`wsdl2h -F` option `-F`](#wsdl2h-F). For example, option `-Q` changes this generated code for C++ applications: ~~~{.cpp} class xsd__anyType { public: _XML __item; struct soap *soap; }; typedef std::string xsd__anySimpleType; class ns__record : public xsd__anyType { public: xsd__anySimpleType value; // non-polymorphic xsd:anySimpleType value } ~~~ into: ~~~{.cpp} class xsd__anyType { public: _XML __item; struct soap *soap; }; class ns__record : public xsd__anyType { public: xsd__anyType *value; // polymorphic xsd:anySimpleType value } ~~~ where all other classes generated by wsdl2h [option `-p`](#wsdl2h-p) are derived from `xsd__anyType`, meaning that `value` can be assigned any one of these classes as long as the class is a simple type wrapper (wsdl2h generates comments to indicate that the polymorhpic value should be a `xsd:anySimpleType`). Similar code is generated by wsdl2h [option `-F`](#wsdl2h-F) for C applications. On the other hand this option invalidates XML attributes of type `xsd:anySimpleType`. The soapcpp2 tool warns about this invalid attribute type as a result. 🔝 [Back to table of contents](#) ### wsdl2h -q {#wsdl2h-q} This option specifies a C++ namespace name. The interface header file declarations are placed in the given C++ namespace. For example: wsdl2h -q api file.wsdl The generated interface header file for soapcpp2 places all declarations in the `api` C++ namespace: ~~~{.cpp} namespace api { ... } ~~~ @warning It is more difficult to use SOAP Headers and SOAP Faults when C++ namespaces are used. When wsdl2h finds SOAP Headers and SOAP Fault Details it collects these into `::SOAP_ENV__Header` and `::SOAP_ENV__Detail` structures, which become part of the given C++ namespace. However, to use the `::SOAP_ENV__Header` and `::SOAP_ENV__Detail` structures these should be declared at the global scope. This option places these structures with the types used by their members in the given C++ namespace, making them unavailable to the global scope. See \ref codenamespace for details on using C++ namespaces to build client and server applications, which requires a `env.h` file with SOAP Header and Fault definitions to be compiled with: soapcpp2 -penv env.h The generated `envC.cpp` file holds the SOAP Header and Fault serializers and you can link this file with your client and server applications. This option has no effect for C source code output. 🔝 [Back to table of contents](#) ### wsdl2h -R {#wsdl2h-R} This option enables the generation of REST service operations in the interface header file saved by wsdl2h for soapcpp2. By default without this option, REST service operations defined in one or more WSDLs are ignored. With this option, both REST and SOAP service operations are declared in the interface header file. 🔝 [Back to table of contents](#) ### wsdl2h -r {#wsdl2h-r} This option specifies a proxy host name and port number with proxy credentials to connect to web sites through a proxy server. This option can also be used to specify credentials to access a web site that requires authentication (HTTP basic or digest authentication). For example: wsdl2h -r proxy.example.org:80:proxyuserid:proxypasswd -r userid:passwd 🔝 [Back to table of contents](#) ### wsdl2h -S {#wsdl2h-S} This option renames the `soap` members of the generated C++ classes in the interface header file for soapcpp2. By default without this option, wsdl2h adds `struct soap *soap` members to classes and structs. This member points to the `::soap` context that manages the instance, when the instance was allocated by the gSOAP engine. To remove the `struct soap *soap` members use this option with an empty name: wsdl2h -S '' file.wsdl To rename the `struct soap *soap` members, specify a name for the member, for example `ctx`: wsdl2h -S ctx file.wsdl This option has no effect for C source code output. 🔝 [Back to table of contents](#) ### wsdl2h -s {#wsdl2h-s} This option replaces STL `std::vector` and `std::string` by C-like equivalents and is intended for systems with limited support for C++ libraries. The `std::vector` struct/class member is replaced by a dynamic array, declared with a `__size` member followed by a pointer member to the array items. The `std::string` is replaced by `char*`. This option has no effect for C source code output. 🔝 [Back to table of contents](#) ### wsdl2h -t {#wsdl2h-t} This option specifies an alternate file or path for `typemap.dat`. See [`typemap.dat` file](#typemap). For example: wsdl2h -t $GSOAP/gsoap/typemap.dat file.wsdl 🔝 [Back to table of contents](#) ### wsdl2h -U {#wsdl2h-U} This option allows UTF-8-encoded Unicode C/C++ identifier names in the generated interface header file for soapcpp2. This assumes that the C/C++ compiler that is used to compile a gSOAP client or server application supports Unicode identifier names. By default without this option, Unicode XML names in WSDLs and XSDs are preserved using the gSOAP convention for UCS-2 characters in identifier names with `_xHHHH` where `HHHH` is a hexadecimal Unicode character code point. With this option, Unicode XML names in WSDLs and XSDs are preserved "as is" in C/C++ identifier names. 🔝 [Back to table of contents](#) ### wsdl2h -u {#wsdl2h-u} This option replaces unions with structs/classes in the generated interface header file for soapcpp2. Union members are used to represent `xsd:choice` of elements. A choice of elements can also be represented by pointer members of a struct/class such that only one member is non-NULL. However, when using a struct/class instead of a union, the deserialization validator will not reject additional elements when present. For example:
~~~{.xml} ~~~
By default without this option, wsdl2h generates a tagged `union` for the `xsd:choice`, where the tag is a special member `int __union_data` that is set to `SOAP_UNION__ns__union_data_string` when the `string` union member is valid or `SOAP_UNION__ns__union_data_number` when the `number` union member is valid: ~~~{.cpp} class ns__data { public: std::string value; $ int __union_data; union _ns__union_data { std::string* string; float number; } union_data; }; ~~~ With this option, wsdl2h removes the `union` and replaces it with pointer members to produce a simpler structure: ~~~{.cpp} class ns__data { public: std::string value; // BEGIN CHOICE std::string* string; // Choice of element (one of multiple choices) float* number; // Choice of element (one of multiple choices) // END OF CHOICE }; ~~~ @warning This option removes the uniqueness check on choices from the deserialization validator. When serializing data, only one of the choice pointer members should be non-NULL. 🔝 [Back to table of contents](#) ### wsdl2h -V {#wsdl2h-V} This option displays the current wsdl2h tool version and then exits. 🔝 [Back to table of contents](#) ### wsdl2h -v {#wsdl2h-v} This option enables verbose output to assist in debugging the wsdl2h tool. 🔝 [Back to table of contents](#) ### wsdl2h -W {#wsdl2h-W} This option suppresses all warnings produced by wsdl2h. Errors are not suppressed. 🔝 [Back to table of contents](#) ### wsdl2h -w {#wsdl2h-w} This option wraps response parameters in a response struct. The last parameter of a service operation declared as a function in the interface header file is the response parameter. When multiple response parameters are returned by the service operation or if the response parameter is a complexType (a struct or class), then the parameters should be wrapped in a special "response struct". However, if a single response parameter is a primitive type value then this parameter does not need to be wrapped in a response struct. This option consistently wraps response parameters in a response struct, even when a single response parameter is a primitive type value. 🔝 [Back to table of contents](#) ### wsdl2h -X {#wsdl2h-X} Document/literal wrapped patterns may cause ambiguities with respect to message namespace qualification. A `part` name associated with a `type` is implicitly qualified by the targetNamespace of the WSDL but may also be associated with the namespace of the type. By default, the wsdl2h tool uses the namespace of the type when the type is not a primitive XSD type, otherwise the WSDL targetNamespace is used. As an example of a document/literal wrapped pattern message, consider:
~~~{.xml} ... ... ... ... ... ~~~
Note that `message name="Message"` has two parts with both a type, which makes these part namespaces amiguous. The generated interface header file declares a wrapper for the `Name` request message and the `Info` response message: ~~~{.cpp} int __ns1__Operation( std::string Name, ns1__Record ns2__Info ); ~~~ Here, `Name` belongs to the `ns1` namespace, i.e. by the `__ns1__Operation`, whereas `Info` belongs to the `ns2` namespace. The `__ns1__Operation` is just a wrapper for the operation and is not visible in XML. Only `Name` and `Info` are serialized in XML as the request and response message, respectively. With option `-X` the `ns2` qualifier is removed: ~~~{.cpp} int __ns1__Operation( std::string Name, ns1__Record Info ); ~~~ Now both `Name` and `Info` belong to the `ns1` namespace, i.e. by the `__ns1__Operation`. However, best practices for document/literal messaging recommend to avoid this wrapped pattern construct in favor of using elements defined in schemas:
~~~{.xml} ... ... ... ... ... ... ~~~
The elements `Name` and `Record` are the actual message names, qualified by the schema's targetNamespace: ~~~{.cpp} int __ns1__Operation( std::string ns2__Name, ns1__Record ns2__Info ); ~~~ See also wsdl2h [option `-z7`](#wsdl2h-z). 🔝 [Back to table of contents](#) ### wsdl2h -x {#wsdl2h-x} This option removes `_XML` type members of structs and classes that are generated for `xsd:any` and `xsd:anyAttribute` components. There are two options to represent `xsd:any` and `xsd:anyAttribute` components: the literal `_XML` string type with XML content (a `char*` string) or a DOM node. DOM nodes are generated for `xsd:any` and `xsd:anyAttribute` components with [`wsdl2h -d` option `-d`](#wsdl2h-d), which also defines `xsd:anyType` as the DOM node `xsd__anyType` in C and C++. 🔝 [Back to table of contents](#) ### wsdl2h -y {#wsdl2h-y} This option adds typedef synonyms for structs and enums to the interface header file, which is useful for C source code. A typedef synonym for a struct is declared by `typedef struct name name;` and for an enum is declared by `typedef enum name name;`. 🔝 [Back to table of contents](#) ### wsdl2h -z {#wsdl2h-z} These options are for backward compatiility with older gSOAP releases: - `-z1` compatibility with 2.7.6e: generate pointer-based arrays. - `-z2` compatibility with 2.7.7 to 2.7.15: qualify element/attribute references. - `-z3` compatibility with 2.7.16 to 2.8.7: qualify element/attribute references. - `-z4` compatibility up to 2.8.11: don't generate union structs in std::vector. - `-z5` compatibility up to 2.8.15: don't include minor improvements. - `-z6` compatibility up to 2.8.17: don't include minor improvements. - `-z7` compatibility up to 2.8.59: don't generate std::vector of class of union. - `-z8` compatibility up to 2.8.74: don't gen quals for doc/lit wrapped patterns. 🔝 [Back to table of contents](#) ### wsdl2h -_ {#wsdl2h-_} This option replaces `_USCORE` by the Unicode `_x005f` character code point in identifier names in C and C++ in the generated interface header file. 🔝 [Back to table of contents](#) ## Customizing XML data bindings with the typemap.dat file {#typemap} The `typemap.dat` file for the wsdl2h tool can be used to customize or optimize the type bindings by mapping schema types to C/C++ types. This file contains custom XML schema to C/C++ type bindings and XML namespace bindings for namespace prefixes to be generated by the wsdl2h tool. You can edit this file to enable features such as custom serializers for schema types, C++11 smart pointers to replace regular pointers, bind XML namespace prefixes to XML namespace URIs, and specify bindings for schema types. Here is a simple example of a `typemap.dat` file: # This file contains custom definitions of the XML Schema types and # C/C++ types for your project, and XML namespace prefix definitions. # The wsdl2h WSDL importer consults this file to determine bindings. [ // This comment will be included in the generated .h file // You can include any additional declarations, includes, imports, etc. // within [ ] sections. The brackets must appear at the start of a line ] # XML namespace prefix definitions can be provided to override the # default choice of ns1, ns2, ... prefixes. For example: i = "http://www.soapinterop.org/" s = "http://www.soapinterop.org/xsd" The `i` and `s` prefixes are declared such that the header file output by wsdl2h uses these prefixes instead of the default `ns1`, `ns2`, etc. It is strongly recommended to name the prefixes in this way, because future runs of wsdl2h may result in a different assignment of the default `ns1`, `ns2`, ... prefixes. Therefore, it is recommended that application code should not rely on the default prefixes. Type bindings can be provided to bind XML schema types to C/C++ types for your project. These type bindings have four parts: prefix__type = declaration | use | ptr-use where `prefix__type` is the C/C++ type name of the schema type (using gSOAP's type naming conventions), the `declaration` part declares the C/C++ type in the generated header file which may be empty to omit, the optional `use` part specifies how the type is used by other types such as by member declarations and as function parameters, and the optional `ptr-use` part specifies how the type is used as a pointer type by other types and as function parameters. # Example XML Schema and C/C++ type bindings: xsd__int = | int xsd__string = | char* | char* xsd__boolean = enum xsd__boolean { false_, true_ }; | enum xsd__boolean xsd__base64Binary = class xsd__base64Binary { unsigned char *__ptr; int __size; }; | xsd__base64Binary | xsd__base64Binary # You can extend structs and classes with member data and functions. # For example, adding a constructor to ns__myClass: ns__myClass = $ ns__myClass(); # The general form is # class_name = $ member; XML Schema types are associated with an optional C/C++ type declaration, a use reference, and a pointer-use reference. The pointer-use reference of the `xsd__byte` type for example, is `int*` because `char*` is reserved for strings. For example, you can replace the `std::string` that used by default for C++ with a wide string: xsd__string = | std::wstring Or replace the `char*` strings that are used by default for C with `wchar_t*`: xsd__string = | wchar_t* | wchar_t* When a type binding requires only the usage to be changed, the declaration part can be an ellipsis `...`, as in: prefix__type = ... | use | ptr-use The `...` ellipsis ensures that the wsdl2h-generated type definition is preserved, while the `use` and `ptr-use` parts are amended as specified. This method is useful to serialize types dynamically, when XML elements carry the `xsi:type` attribute indicating the type of element content. The following illustrates an "any" type mapping for the `ns:sometype` XSD type in a schema. This type will be replaced with a "any" type wrapper that supports dynamic serialization of element types indicated by the `xsi:type` attribute: [ struct __any { int __type; // set to a SOAP_TYPE_T value void *__item; // points to data of type T as serialized per SOAP_TYPE_T } ] xsd__anyType = ... | struct __any | struct __any where `__type` and `__item` are used to serialize any data type in the wrapper. The `__item` member points to the value (de)serialized, with the type of this value indicated by `__type` which is a `SOAP_TYPE_T` value for type named `T`. To match an element with content to (de)serialize, rename the `__item` member to the XML element name, as usual. Additional members can be specified to extend a generated struct or class. Class and struct extensions are of the form: prefix__type = $ member-declaration For example, to add getter and setter methods to class `myns__record` (see also Section \ref gettersetter): myns__record = $ int get(struct soap *soap) const; myns__record = $ int set(struct soap *soap); Another way to use `typemap.dat` is to remap one C/C++ type to another type: prefix__type1 == prefix__type2 This replaces `prefix__type1` by `prefix__type2` in the wsdl2h output. For example: SOAP_ENC__boolean == xsd__boolean where `SOAP_ENC__boolean` is replaced by `xsd__boolean`, which in turn may be mapped to a C `enum xsd__boolean` type or C++ `bool` type. The `$CONTAINER` variable defines the container type to use in the wsdl2h-generated declarations for C++, which is `std::vector` by default. For example, to use `std::list` as the container in the wsdl2h-generated declarations we add the following line to `typemap.dat`: $CONTAINER = std::list Also a Qt container can be used instead of the default `std::vector`, for example `QVector`: [ #include ] $CONTAINER = QVector To remove containers, use `wsdl2h -s`. This also removes `std::string`, but you can re-introduce `std::string` with xsd__string = | std::string The `typemap.dat` `$POINTER` variable defines the smart pointer to use in the wsdl2h-generated declarations for C++, which replaces the use of `*` pointers. For example: $POINTER = std::shared_ptr Not all pointers in the generated output are replaced by smart pointers by wsdl2h, such as pointers as union members and pointers as struct/class members that point to arrays of values. The variable `$SIZE` defines the type of array sizes, which is `int` by default. For example, to change array size types to `size_t`: $SIZE = size_t Permissible types are `int` and `size_t`. This variable does not affect the size of dynamic arrays, `xsd__hexBinary` and `xsd__base64Binary` types, which is always `int`. 🔝 [Back to table of contents](#) # The soapcpp2 tool {#soapcpp2} The soapcpp2 tool is invoked from the command line and optionally takes the name of a header file as an argument or, when the file name is absent, parses the standard input: soapcpp2 file.h where `file.h` is an interface header file generated by wsdl2h or developed manually to specify the service operations as function prototypes and C/C++ data types to serialize in XML. The soapcpp2 tool produces the XML data binding implementation source code, client-side stub functions, and server-side skeleton functions. The type of files generated by soapcpp2 are: * `soapStub.h` a modified and annotated header file produced from the input interface header file, this file is compilable by C/C++ compilers while the input interface header file is not. * `soapH.h` the main header file to be included by the application source code, this file also includes `soapStub.h`. * `soapC.cpp` (or `.c` for C) the serializers for the C/C++ types specified in the interface header file. * `soapClient.cpp` (or `.c` for C) the client-side stub functions to invoke remote service operations. * `soapServer.cpp` (or `.c` for C) the server-side skeleton functions to dispatch service requests to user-define service functions. * `soapClientLib.cpp` (or `.c` for C) the client-side stub functions combined with local static serializers to be integrated as one big "library". * `soapServerLib.cpp` (or `.c` for C) the service-side skeleton functions combined with local static serializers to be integrated as one big "library" * `soapXYZProxy.h` the C++ proxy class declaration generated with `soapcpp2 -i` or `soapcpp2 -j` * `soapXYZProxy.cpp` the C++ proxy class implementation generated with `soapcpp2 -i` or `soapcpp2 -j` * `soapXYZService.h` the C++ service class declaration generated with `soapcpp2 -i` or `soapcpp2 -j` * `soapXYZService.cpp` the C++ service class implementation generated with `soapcpp2 -i` or `soapcpp2 -j` * `*.xsd` files are generated containing XML schemas for each namespace prefix `ns` used in the interface header file input to the soapcpp2 tool, see also Section \ref wsdl . Not applicable when the interface header file was generated with wsdl2h. * `*.wsdl` files are generated containing WSDL descriptions for each namespace prefix `ns` used by service operations in the interface header file input to the soapcpp2 tool, see also Section \ref wsdl . Not applicable when the interface header file was generated with wsdl2h. * `*.xml` files with SOAP or XML request and response messages are generated. * `*.nsmap` the XML namespace mapping table, generated for the first namespace prefix `ns` found in the interface header file input to the soapcpp2 tool. If client and service applications are to be developed for the same Web services API then the same interface header file can be used to generate the source code for both the client and the service. There is no need to generate a WSDL with soapcpp2 and then use that WSDL to generate a new interface header file with wsdl2h. The new header file generated by this approach will not be identical to the original header file. The `soapClientLib.cpp` and `soapServerLib.cpp` can be used to build client and server libraries. The serialization functions are declared static to avoid link symbol conflicts. For this approach to compile, we also should create a separate interface header file `env.h` with SOAP Header and Fault structures with serializers that are non-static, i.e. globally declared and implemented, as described in Section \ref dylibs . The following files are part of the gSOAP source code package and are required to build gSOAP applications: * `gsoap/stdsoap2.h` the header file to include in your source code, but already included when including `soapH.h`. * `gsoap/stdsoap2.c` the C source code of the entire gSOAP engine. * `gsoap/stdsoap2.cpp` (or `.c` for C) the source code of the entire gSOAP engine. * `gsoap/dom.cpp` (or `.c` for C) the source code of the DOM parser, which is optional and only required when using DOM such as with WS-Security. 🔝 [Back to table of contents](#) ## soapcpp2 options {#soapcpp2options} The soapcpp2 tool supports the following command-line options: option | result -------------------------- | ------ [`-0`](#soapcpp2-0) | no SOAP, generate REST source code [`-1`](#soapcpp2-1) | generate SOAP 1.1 source code [`-2`](#soapcpp2-2) | generate SOAP 1.2 source code [`-A`](#soapcpp2-A) | require HTTP SOAPAction headers to invoke server-side operations [`-a`](#soapcpp2-a) | use HTTP SOAPAction headers with WS-Addressing to invoke server-side operations [`-b`](#soapcpp2-b) | serialize byte arrays `char[N]` as string [`-C`](#soapcpp2-C) | generate client-side source code only [`-c`](#soapcpp2-c) | generate C source code [`-c++`](#soapcpp2-c) | generate C++ source code (default) [`-c++11`](#soapcpp2-c) | generate C++ source code optimized for C++11 (compile with `-std=c++11`) [`-d`](#soapcpp2-d) `path` | use `path` to save files [`-Ec`](#soapcpp2-E) | generate extra functions for deep copying [`-Ed`](#soapcpp2-E) | generate extra functions for deep deletion [`-Et`](#soapcpp2-E) | generate extra functions for data traversals with callback functions [`-e`](#soapcpp2-e) | generate SOAP RPC encoding style bindings (also use `-1` or `-2`) [`-f`](#soapcpp2-f) `N` | multiple `soapC` files, with `N` serializer definitions per file (N>=10) [`-g`](#soapcpp2-g) | generate XML sample messages in template format for [testmsgr](../../testmsgr/html/index.html) [`-h`](#soapcpp2-h) | display help info and exit [`-I`](#soapcpp2-I) `path` | use `path`(s) for `#import` (paths separated with `:`) [`-i`](#soapcpp2-i) | generate C++ service proxies and objects inherited from soap struct [`-j`](#soapcpp2-j) | generate C++ service proxies and objects that share a soap struct [`-L`](#soapcpp2-L) | don't generate `soapClientLib` and `soapServerLib` [`-l`](#soapcpp2-l) | generate linkable modules (experimental) [`-m`](#soapcpp2-m) | generate source code for the Matlab(tm) MEX compiler (deprecated) [`-n`](#soapcpp2-n) | use service name to rename service functions and namespace table [`-p`](#soapcpp2-p) `name` | save files with new prefix `name` instead of `soap` [`-Q`](#soapcpp2-Q) `name` | use `name` as the C++ namespace, including custom serializers [`-q`](#soapcpp2-q) `name` | use `name` as the C++ namespace, excluding custom serializers [`-r`](#soapcpp2-r) | generate soapReadme.md report [`-S`](#soapcpp2-S) | generate server-side source code only [`-s`](#soapcpp2-s) | generate stub and skeleton functions with strict XML validation checks [`-T`](#soapcpp2-T) | generate server auto-test source code [`-t`](#soapcpp2-t) | generate source code for fully `xsi:type` typed SOAP/XML messages [`-u`](#soapcpp2-u) | uncomment WSDL/schema output by suppressing XML comments [`-V`](#soapcpp2-V) | display the current version and exit [`-v`](#soapcpp2-v) | verbose output [`-w`](#soapcpp2-w) | don't generate WSDL and schema files [`-x`](#soapcpp2-x) | don't generate sample XML message files [`-y`](#soapcpp2-y) | include C/C++ type access information in sample XML messages [`-z1`](#soapcpp2-z) | compatibility: generate old-style C++ service proxies and objects [`-z2`](#soapcpp2-z) | compatibility with 2.7.x: omit XML output for NULL pointers [`-z3`](#soapcpp2-z) | compatibility up to 2.8.30: `_param_N` indexing and nillable pointers For example soapcpp2 -L -c -d projects -p my -x file.h This saves the following source code files: - `projects/myH.h` serialization functions, this file should be included in projects. - `projects/myC.c` serialization functions - `projects/myClient.c` client call stub functions - `projects/myServer.c` server request dispatcher - `projects/myStub.h` annotated copy of the source interface header file - `projects/ns.nsmap` namespace table, this file should be included or used in projects. - `projects/ns.wsdl` WSDL with Web service definitions - `projects/ns.xsd` XML schema Windows users can use the usual `/` for compile-time flags as well as `-`, for example: soapcpp2 -L -c /d projects /p my /x file.h Options `-A`, `-a`, `-c`, `-c++`, `-c++11`, `-e`, `-i`, `-j`, `-n`, `-s`, `-t`, `-w`, and `-x` can also be specified in the interface header file for soapcpp2 using the `//gsoapopt` directive, for example: ~~~{.cpp} // Generate pure C and do not produce WSDL output: //gsoapopt cw int ns__webmethod(char *in, char **out); ~~~ 🔝 [Back to table of contents](#) ### soapcpp2 -0 {#soapcpp2-0} This option generates XML REST source code by disabling SOAP bindings, essentially disabling the SOAP protocol and replacing it by direct XML REST messaging. This option uses `::soap_set_version` at the client side in the generated source code to enable XML REST messaging, disabling SOAP. In addition, the soapcpp2 tool nullifies the SOAP namespaces from the the generated namespace table file to force a server application that uses this table to use XML REST only: ~~~{.cpp} struct Namespace namespaces[] = { { "SOAP-ENV", NULL, NULL, NULL }, { "SOAP-ENC", NULL, NULL, 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 }, ... { NULL, NULL, NULL, NULL} }; ~~~ @note Web services applications developed with gSOAP support both REST and SOAP messaging automatically when the namespace table is left intact (i.e. generated without option `-0`) with the SOAP namespaces present in the table. XML REST request messages are served and REST messages returned. Likewise, SOAP 1.1 request messages are served and SOAP 1.1 messages returned, SOAP 1.2 request messages are served and SOAP 1.2 messages returned. For example, the following example calculator service SOAP and XML REST request messages are served by a gSOAP service developed with SOAP 1.1 as the default protocol:
~~~{.xml} 2 3 ~~~
~~~{.xml} 2 3 ~~~
The server returns the following XML SOAP 1.1 and XML REST responses:
~~~{.xml} 5 ~~~
~~~{.xml} 0 ~~~
By default all XML namespaces are included with the root element, which improves messaging performance at the sending and receiving sides, because a stack of `xmlns` binding scopes does not need to be maintained. Use `#SOAP_XML_CANONICAL` to emit `xmlns` binding pairs when the XML namespace prefix is used. This is slower but may or may not reduce the message size. 🔝 [Back to table of contents](#) ### soapcpp2 -1 {#soapcpp2-1} This option forces SOAP 1.1 bindings globally in the generated source code, thereby overriding the SOAP protocol version used in the interface header file input. This option uses `::soap_set_version` at the client to enable SOAP 1.1 request and response messages, disallowing SOAP 1.2. In addition, the soapcpp2 tool saves the SOAP 1.1 namespaces in the second column of the generated namespace table file and the SOAP 1.2 in the third column to allow the server to accept SOAP 1.1 and SOAP 1.2 requests: ~~~{.cpp} 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 }, ... { NULL, NULL, NULL, NULL} }; ~~~ 🔝 [Back to table of contents](#) ### soapcpp2 -2 {#soapcpp2-2} This option forces SOAP 1.2 bindings globally in the generated source code, thereby overriding the SOAP protocol version used in the interface header file input. This option uses `::soap_set_version` at the client to enable SOAP 1.2 request and response messages, disallowing SOAP 1.1. In addition, the soapcpp2 tool saves the SOAP 1.2 namespaces in the second column of the generated namespace table file and the SOAP 1.1 in the third column to allow the server to accept SOAP 1.1 and SOAP 1.2 requests: ~~~{.cpp} struct Namespace namespaces[] = { { "SOAP-ENV", "http://www.w3.org/2003/05/soap-envelope", "http://schemas.xmlsoap.org/soap/envelope/", NULL }, { "SOAP-ENC", "http://www.w3.org/2003/05/soap-encoding", "http://schemas { "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 }, ... { NULL, NULL, NULL, NULL} }; ~~~ 🔝 [Back to table of contents](#) ### soapcpp2 -A {#soapcpp2-A} This option generates server-side source code that requires HTTP SOAPAction headers to be present. The server invokes server-side operations based on the SOAPAction header value in request messages, instead of the SOAP/XML request message name which is ignored. This option is used with WS-Addressing, WS-ReliableMessaging, and WS-Discovery servers to relay messages based on HTTP SOAPAction headers and/or the SOAP Header `wsa:Action` when present (the latter requires the [WS-Addressing plugin](wsaplugin)). Alternatively, use [`soapcpp2 -a` option `-a`](#soapcpp2-a) to let the server invoke server-side operations based on the SOAPAction header value in request messages when present, otherwise when not present this lets the server invoke server-side operations based on the SOAP/XML request message name as usual. This option can also be specified by the `//gsoapopt A` directive in the interface header file. 🔝 [Back to table of contents](#) ### soapcpp2 -a {#soapcpp2-a} This option generates server-side source code that uses HTTP SOAPAction headers when present to invoke server-side operations based on the SOAPAction header value in request messages, otherwise when not present lets the server invoke server-side operations based on the SOAP/XML request message name as usual. This option is used with WS-Addressing, WS-ReliableMessaging, and WS-Discovery servers to relay messages based on HTTP SOAPAction headers and/or the SOAP Header `wsa:Action` when present (the latter requires the [WS-Addressing plugin](wsaplugin)). Alternatively, use [`soapcpp2 -A` option `-A`](#soapcpp2-A) to require HTTP SOAPAction headers to be present in SOAP request messages to invoke server-side operations. This option can also be specified by the `//gsoapopt a` directive in the interface header file. 🔝 [Back to table of contents](#) ### soapcpp2 -b {#soapcpp2-b} This option serializes byte arrays specified as `char[N]` as strings. Without this option `char[N]` is serialized as an array of bytes. Fixed-size arrays specified in the interface header file input are generally serialized as arrays in XML using `item` elements. For example: ~~~{.cpp} struct ns__record { char bytes[3]; int ints[2]; }; ~~~ By default without this option the `ns__record` struct is serialized as:
~~~{.xml} 65 66 0 1 2 ~~~
With this option, the `ns__record` struct is serialized as:
~~~{.xml} AB 1 2 ~~~
🔝 [Back to table of contents](#) ### soapcpp2 -C {#soapcpp2-C} This option restricts soapcpp2 to generate client-side source code only. When this option is combined with [`soapcpp2 -CS` option `-S`](#soapcpp2-S), no client and server source code is generated. 🔝 [Back to table of contents](#) ### soapcpp2 -c -c++ -c++11 {#soapcpp2-c} Option `-c` generates C source code, `-c++` generates C++ source code, and `-c++11` generates C++11 source code. @note The `//gsoapopt` directive in the interface header file takes priority over this option, when `c`, `c++`, or `c++11` is declared with this directive in the interface header file. 🔝 [Back to table of contents](#) ### soapcpp2 -d {#soapcpp2-d} This option specifies a path to save the generated files. For example: soapcpp2 -d source file.h This saves files to the `source/` directory located within the current directory, which should exist and should be writable. 🔝 [Back to table of contents](#) ### soapcpp2 -Ec -Ed -Et {#soapcpp2-E} These options generate extra functions for deep copying of serializable C/C++ data, deep deletion of serializable C/C++ data, and deep data traversals with user-defined callback functions over serializable C/C++ data. For a serializable type `T` declared in the interface header file for soapcpp2, option `-Ec` generates: - `virtual T * T::soap_dup(struct soap*) const` where `T` is a class, returns a duplicate of this object by deep copying, replicating all deep cycles and shared pointers when a managing `soap` context is provided as argument. Deep copy is a tree when argument is NULL, but the presence of deep cycles will lead to non-termination. Use flag `SOAP_XML_TREE` with the managing context to copy into a tree without cycles and pointers to shared objects. - `T * soap_dup_T(struct soap*, T *dst, const T *src)` where `T` is not a class, deep copy `src` into `dst`, replicating all deep cycles and shared pointers when a managing `soap` context is provided as argument. When `dst` is NULL, allocates space for `dst` and returns a pointer to the allocated copy. Deep copy results in a tree when the `soap` context is NULL, but the presence of deep cycles will lead to non-termination. Use flag `SOAP_XML_TREE` with managing context to copy into a tree without cycles and pointers to shared objects. Returns `dst` or allocated copy when `dst` is NULL. For a serializable type `T` declared in the interface header file for soapcpp2, option `-Ed` generates: - `virtual void T::soap_del() const` where `T` is a class, deletes all heap-allocated members of this object by deep deletion ONLY IF this object and all of its (deep) members are not managed by a `soap` context AND the deep structure is a tree (no cycles and co-referenced objects by way of multiple (non-smart) pointers pointing to the same data). Can be safely used after `T::soap_dup(NULL)` to delete the deep copy. Does not delete the object itself. - `void soap_del_T(const T*)` where `T` is not a class, deletes all heap-allocated members of this object by deep deletion ONLY IF this object and all of its (deep) members are not managed by a `soap` context AND the deep structure is a tree (no cycles and co-referenced objects by way of multiple (non-smart) pointers pointing to the same data). Can be safely used after `soap_dup_T(NULL, NULL, const T*)` to delete the deep copy returned. Does not delete the object itself. For a serializable type `T` declared in the interface header file for soapcpp2, option `-Et` generates: - `virtual void T::soap_traverse(struct soap *soap, const char *tag, soap_walker p, soap_walker q)` where `T` is a class, uses function callbacks `p` and `q` to traverse this object by deep ordered tree traversals over its members when non-NULL. Function `p` is a pre-order function that is called before objects and data are visited recursively and function `q` is a post-order function that is called after objects and data are visited recursively. Either `p` or `q` may be NULL. The `tag` string is passed to `p` and `q` and should not be NULL. Cyclic graphs are treated as trees by pruning pointer back-edges, though this method does not always prevent a data node from being visited twice. - `void soap_traverse_T(struct soap *soap, T *data, const char *tag, soap_walker p, soap_walker q)` where `T` is not a class, uses function callbacks `p` and `q` to traverse this data by deep ordered tree traversals over its members when present and non-NULL. Function `p` is a pre-order function that is called before objects and data are visited recursively and function `q` is a post-order function that is called after objects and data are visited recursively. Either `p` or `q` may be NULL. The `tag` string is passed to `p` and `q` and should not be NULL. Cyclic graphs are treated as trees by pruning pointer back-edges. though this method does not always prevent a data node from being visited twice. The pre-order `p` and post-order `q` callback functions should be declared as a `soap_walker` function, which has the following function signature: ~~~{.cpp} void soap_walker(struct soap *soap, void *data, int soap_type, const char *tag, const char *type) ~~~ where `data` points to the data node visited which is of type `soap_type` (a `SOAP_TYPE_T` constant), `tag` is the non-NULL element or attribute tag name (qualified or unqualified), and `type` is the non-NULL C/C++ type of the data. The `void* ::soap::user` member can be used to pass user-defined data to the callbacks. For example: ~~~{.cpp} // file: record.h //gsoap ns schema namespace: urn:example struct ns__record { @ char *name; int value; struct ns__record *subrecord; }; ~~~ soapcpp2 -Ecdt record.h The main program: ~~~{.cpp} #include "soapH.h" #include "ns.nsmap" int main() { struct soap *soap = soap_new(); ns__record record; // a serializable type ns__record rec_dup; int indent = 0; soap->recvfd = open(file, O_RDONLY); if (soap->recvfd < 0) ... // error if (soap_read_ns__record(soap, &record)) // deserialize from file into managed memory ... // error close(soap->recvfd); if (soap_write_ns__record(soap, &record)) // serialize to standard output ... // error soap->user = (void*)&indent; soap_traverse_ns__record(soap, record, "record", pre, post); soap_dup_ns__record(NULL, &rec_dup, &record); // deep copy the record to unmanaged memory soap_destroy(soap); // delete managed objects soap_end(soap); // delete managed data and temporaries soap_free(soap); // free the context soap_del_ns__record(&rec_dup) // deep delete unmanaged record } void pre(struct soap *soap, void *a, int n, const char *s, const char *t) { printf("\n%*s%s %s = {", (*(int*)soap->user)++, "", t, s); if (n == SOAP_TYPE_int) printf(" %d", *(int*)a); else if (n == SOAP_TYPE_string) printf(" %s", *(char**)a ? *(char**)a : "(n/a)"); } void post(struct soap *soap, void *a, int n, const char *s, const char *t) { printf(" }"); (*(int*)soap->user)--; } ~~~ The `soap_read_ns__record` deserializes the following XML:
~~~{.xml} 123 456 ~~~
Then `soap_traverse_ns__record` call displays the contenst of `record` using the `pre` and `post` walker functions: struct ns__record record = { char * name = { foo } int value = { 123 } struct ns__record subrecord = { char * name = { bar } int value = { 456 } } } 🔝 [Back to table of contents](#) ### soapcpp2 -e {#soapcpp2-e} This option forces SOAP RPC encoding bindings globally in the generated source code, when the SOAP messaging style is not declared in the interface header file with directives. SOAP document/literal style messaging it the default messaging style. The messaging style can be specified with the `//gsoap service style:` and `//gsoap service encoding:` [directives](#directives). See also [SOAP RPC encoded versus document/literal style](#literal). This option can also be specified by the `//gsoapopt e` directive in the interface header file. 🔝 [Back to table of contents](#) ### soapcpp2 -f {#soapcpp2-f} This option splits the serialization source code saved to `soapC.c` and `soapC.cpp` files into multiple `soapC_NNN` files as specified by the numeric parameter. This option alleviates compilation issues with very large source code files. For example: soapcpp2 -f40 file.h This generates multiple `soapC_NNN.cpp` files each with 40 serializers, with `NNN` counting from `001` onward. The value of this option must be larger or equal to 10. 🔝 [Back to table of contents](#) ### soapcpp2 -g {#soapcpp2-g} This option generates XML sample messages in template format for the gSOAP Test Messenger [testmsgr](../../testmsgr/html/index.html) tool to test SOAP and REST XML clients and servers. By default without this option, soapcpp2 generates sample XML messages with the proper XML structure but without useful data. The Test Messenger tool generates random messages directed by the template parameters included by `soapcpp2 -g` option `-g`. This option only has effect when [`soapcpp2 -x` option `-x`](#soapcpp2-x) is not used, which skips the generation of sample messages. 🔝 [Back to table of contents](#) ### soapcpp2 -h {#soapcpp2-h} This option displays help info and then exits. 🔝 [Back to table of contents](#) ### soapcpp2 -I {#soapcpp2-I} This option specifies one or more directory paths to search for imported interface header files. Multiple paths are separated by a colon. For example: soapcpp2 -I path1:path2 file.h This searches `path1` and then `path2` for files that are imported with `#import` in `file.h`. 🔝 [Back to table of contents](#) ### soapcpp2 -i {#soapcpp2-i} This option generates C++ client-side proxy classes and server-side service classes, where the classes inherit the `::soap` context struct with the engine state to handle communications and manage memory independently of other class instances. By contrast, [`soapcpp2 -j` option `-j`](#soapcpp2-j) allows a `::soap` context to be used and reused for multiple proxy and server instances. This option can also be specified by the `//gsoapopt i` directive in the interface header file. This option has no effect for C source code output. 🔝 [Back to table of contents](#) ### soapcpp2 -j {#soapcpp2-j} This option generates C++ client-side proxy classes and server-side service classes, where the classes have a pointer member `soap` to a `::soap` context struct that handles communications and manages memory. By contrast to [`soapcpp2 -i` option `-i`](#soapcpp2-i), this option allows a `::soap` context to be used and reused for multiple proxy and server instances. This option can also be specified by the `//gsoapopt j` directive in the interface header file. This option has no effect for C source code output. 🔝 [Back to table of contents](#) ### soapcpp2 -L {#soapcpp2-L} This option skips the generation of the `soapClientLib` and `soapServerLib` files. These files are generally not needed to build client and server applications. These files are useful to compile multiple "libraries" of client and server applications, such that all serialization source code is declared static and kept hidden from the global scope, which makes the serialization functions inaccessible to the global scope to prevent global name clashes. Alternatively, use `soapcpp2 -q name` option `-q name` to develop C++ applications with C++ namespaces to prevent global name clashes. 🔝 [Back to table of contents](#) ### soapcpp2 -l {#soapcpp2-l} This option is experimental and should only be used to generate source code for modules. This option is auto-enabled when a `#module` directive is found in an interface header file for soapcpp2, see [how to build modules and libraries with the #module directive](#module). 🔝 [Back to table of contents](#) ### soapcpp2 -m {#soapcpp2-m} This option to generate source code for the Matlab(tm) MEX compiler is deprecated. 🔝 [Back to table of contents](#) ### soapcpp2 -n {#soapcpp2-n} This option renames the generated service functions `::soap_serve` to `name_serve` and the generated namespace table `::namespaces` to `name_namespaces` to the `name` specified with the [`soapcpp2 -n -p name` option `-p name`](#soapcpp2-p). This option is useful to prevent name clashes when soapcpp2 is invoked multiple times to generate source code for different parts of an application. See also [how to create client/server libraries](#dylibs). This option can also be specified by the `//gsoapopt n` directive in the interface header file. 🔝 [Back to table of contents](#) ### soapcpp2 -p {#soapcpp2-p} This option saves source code files with the specified file name prefix `name` with `soapcpp2 -p name` instead of `soap` as the file name prefix. This option is useful to prevent name clashes when soapcpp2 is invoked multiple times to generate source code for different parts of an application. See also [how to create client/server libraries](#dylibs). For example: soapcpp2 -p foo file.h This saves `fooStub.h`, `fooH.h`, `fooC.cpp`, and so on. When the main application is build from the renamed `name`-prefixed source code files, plugins and custom serializers that are compiled and linked with the application should include `nameH.h` instead of `soapH.h`. This can be done with the `-D SOAP_H_FILE=nameH.h` option to the C/C++ compiler to rename this file to include instead of `soapH.h`. 🔝 [Back to table of contents](#) ### soapcpp2 -Q {#soapcpp2-Q} This option specifies a C++ namespace name for the generated source code, including for the custom serializers when used. See also [`soapcpp2 -q name` option `-q name`](#soapcpp2-q) for details on specifying C++ namespaces. The source code files are saved with `name` as prefix instead of `soap`. This means that all plugins and custom serializers that are compiled and linked with the application should include `nameH.h` instead of `soapH.h`. This can be done with the `-D SOAP_H_FILE=nameH.h` option to the C/C++ compiler to rename this file to include instead of `soapH.h`. This option has no effect for C source code output. 🔝 [Back to table of contents](#) ### soapcpp2 -q {#soapcpp2-q} This option specifies a C++ namespace name for the generated source code, excluding the custom serializers when used. See also [`soapcpp2 -Q name` option `-Q name`](#soapcpp2-Q). This option is the same as specifying a C++ namespace in the interface header file that encapsulates all declarations: ~~~{.cpp} namespace name { ... // all of the interface header file content goes here } ~~~ This interface header file format is generated with [`wsdl2h -q name` option `-q name`](#wsdl2h-q). The source code files are saved with `name` as prefix instead of `soap`. This means that all plugins and custom serializers that are compiled and linked with the application should include `nameH.h` instead of `soapH.h`. This can be done with the `-D SOAP_H_FILE=nameH.h` option to the C/C++ compiler to rename this file to include instead of `soapH.h`. See \ref codenamespace for details on using C++ namespaces to build client and server applications, which requires a `env.h` file with SOAP Header and Fault definitions to be compiled with: soapcpp2 -penv env.h The generated `envC.cpp` file holds the SOAP Header and Fault serializers and you can link this file with your client and server applications. This option has no effect for C source code output. 🔝 [Back to table of contents](#) ### soapcpp2 -r {#soapcpp2-r} This option generates a `soapReadme.md` markdown report. This report includes details pertaining the serializable data types and Web client and service operations, covering XML type details, serialization functions, and SOAP/REST API programming details. The markdown report is readable as it is, but can be converted to HTML for improved readability with Doxygen or with pandoc, or can be browsed in Firefox with [https://www.genivia.com/files/readmeviewer.html.zip](readmeviewer.html). 🔝 [Back to table of contents](#) ### soapcpp2 -S {#soapcpp2-S} This option restricts soapcpp2 to generate server-side source code only. When this option is combined with [`soapcpp2 -CS` option `-C`](#soapcpp2-C), no client and server source code is generated. 🔝 [Back to table of contents](#) ### soapcpp2 -s {#soapcpp2-s} This option generates client-side stub functions and proxy classes, server-side skeleton functions and service classes with strict XML validation checks enabled. This option effectively hard-codes the `#SOAP_XML_STRICT` run time mode flag. This option can also be specified by the `//gsoapopt s` directive in the interface header file. @warning This option is not recommended for SOAP RPC encoding style messaging, but XML REST and SOAP/XML document/literal style messages can be validated. 🔝 [Back to table of contents](#) ### soapcpp2 -T {#soapcpp2-T} This option generates server auto-test source code. The generated source code implements a test server `soapTester.c` (for C) or `soapTester.cpp` (for C++) that can be deployed to echo client requests, for example for testing purposes. For example: soapcpp2 -T file.h c++ -o tester soapTester.cpp soapServer.cpp soapC.cpp stdsoap2.cpp ./tester 8192 8080 This runs the `tester` server on port 8080 with `::soap` context initialization mode flag 8192 = 0x2000 = `#SOAP_XML_INDENT`. See [generating an auto test server for client testing](#autotest) for more details. More advanced servers for testing are available with the gSOAP Test Messenger [testmsgr](../../testmsgr/html/index.html) tool to test SOAP and REST XML clients and servers. 🔝 [Back to table of contents](#) ### soapcpp2 -t {#soapcpp2-t} This option generates source code to fully annotate SOAP/XML messages with `xsi:type` attribute values. This option is useful for SOAP RPC encoded messaging with SOAP applications that require `xsi:type` attributes for all XML elements in SOAP messages. This option can also be specified by the `//gsoapopt t` directive in the interface header file. 🔝 [Back to table of contents](#) ### soapcpp2 -u {#soapcpp2-u} This option uncomments WSDL and XSD files generated by soapcpp2 by supressing the inclusion of `` comments to annotate WSDL and XSD files. 🔝 [Back to table of contents](#) ### soapcpp2 -V {#soapcpp2-V} This option displays the current soapcpp2 tool version and then exits. 🔝 [Back to table of contents](#) ### soapcpp2 -v {#soapcpp2-v} This option enables verbose output to assist in debugging the soapcpp2 tool. 🔝 [Back to table of contents](#) ### soapcpp2 -w {#soapcpp2-w} This option skips the generation of WSDL and XSD files. This option can also be specified by the `//gsoapopt w` directive in the interface header file. 🔝 [Back to table of contents](#) ### soapcpp2 -x {#soapcpp2-x} This option skips the generation of sample XML message files. This option can also be specified by the `//gsoapopt x` directive in the interface header file. 🔝 [Back to table of contents](#) ### soapcpp2 -y {#soapcpp2-y} This option adds C/C++ type information to the sample XML message files generated by soapcpp2. 🔝 [Back to table of contents](#) ### soapcpp2 -z {#soapcpp2-z} These options are for backward compatiility with older gSOAP releases: - `-z1` compatibility: generate old-style C++ service proxies and objects - `-z2` compatibility with 2.7.x: omit XML output for NULL pointers - `-z3` compatibility up to 2.8.30: `_param_N` indexing; nillable pointers 🔝 [Back to table of contents](#) ## The #import directive {#import} The `#import` directive is used to include interface header files into other interface header files for soapcpp2. By contrast, the `#include` directive (and `#define` directive for that matter) is moved by the soapcpp2 tool into the generated source code file `soapStub`, see Section \ref pragmas . The `#import` directive is used for two purposes: we use it to include the contents of one interface header file into another interface header file and to import a module, see Section \ref module . An example of the `#import` directive: ~~~{.cpp} #import "mydefs.h" int ns__webmethod(ns__record *in, struct ns__webmethodResponse { ns__record out; } *out); ~~~ where `"mydefs.h"` is an interface header file that defines `ns__record`: ~~~{.cpp} struct ns__record { const char *name; const char *address; }; typedef struct ns__record ns__record; ~~~ 🔝 [Back to table of contents](#) ## The #include and #define directives {#pragmas} The `#include` and `#define` directives are copied by the soapcpp2 tool into the generated source code. These directives are added to the top of the generated `soapStub.h` before any other header file is included. Therefore, `#include` and `#define` directives can be used to influence the generated source code files. The following example interface header file for soapcpp2 refers to `std::ostream`: ~~~{.cpp} #include #define SOME_VALUE 123 // std::ostream can't be serialized, but need to be declared to make it visible: extern class std::ostream; class ns__myClass { public: virtual void print(std::ostream &s) const; // we need std::ostream here ... // }; ~~~ This example also uses an `#include` and a `#define` directive that will be added to the top of `soapStub.h` before `gsoap/stdsoap2.h` is included. @warning Using `#define` to override `WITH_MACRO` and `SOAP_MACRO` compile-time flags is not recommended because the `gsoap/stdsoap2.cpp` (`gsoap/stdsoap2.c` for C) is used to build the `-lgsoap++` (and `-lgsoap` for C) library, which is not affected by these macros whereas the `::soap` context is, as used by the application, leading to predictable crashes. Use `#SOAPDEFS_H` or `#WITH_SOAPDEFS_H` to define macros that are visible to all source code compiled. 🔝 [Back to table of contents](#) ## Service operation specification format {#specformat} A service operation is specified as a function prototype in an interface header file for soapcpp2. For the function prototypes specified, the soapcpp2 tool generates client stub functions to invoke remote services and generates server skeleton functions to implement services. The service operation specified by a function prototype should return `int`, which is either `#SOAP_OK` for success and a `::soap_status` error code for failure, see Section \ref errcodes . The general format of a service operation specification is: ~~~{.cpp} int prefix__method_name(inparam1, inparam2, ..., inparamn, outparam); ~~~ where * `prefix__` is the XML namespace prefix of the method * `method_name` is the service operation name * `inparam1`, ..., `inparamn` are the input parameters to the service operation, which are either values or pointer types, but not references * `outparam` is the single output parameter of the service operation, which must be a pointer or a reference type. A single output parameter is specified and multiple output parameters should be wrapped in a struct or class, see Section \ref param . The fully qualified name of the function `namespace_prefix__method_name` must be unique and cannot match the name of a `struct`, `class`, or `enum` declared in the same header file. The method request is send as an XML message using the qualified function name with the input parameters in XML:
~~~{.xml} ... ... ... ... ~~~
where the `inparam1`, ..., `inparamn` elements are the XML element representations of the `inparam` parameter name declarations. The XML response by the Web service is of the form:
~~~{.xml} ... ~~~
where the `outparam` element is the XML element representation of the `outparam` parameter name declaration, see Section \ref idtrans . By convention, the response element name is the method name ending in `Response`. See Section \ref param on how to change the declaration if the service response element name is different. With SOAP messaging the request and response XML messages are placed in the `SOAP-ENV:Envelope` and `SOAP-ENV:Body` elements. SOAP 1.1 document/literal messaging is the default messaging mode in gSOAP, which are modified to SOAP or REST with `//gsoap service method-protocol:` directives, see Section \ref directives. The soapcpp2 tool generates a client stub function for the service operation. This stub is of the form: ~~~{.cpp} int soap_call_prefix__method_name(struct soap *soap, char *endpoint, char *action, inparam1, inparam2, ..., outparam); ~~~ This stub is called by a client application to perform the service operation call. The soapcpp2 tool generates a skeleton functions for the service operation. The skeleton function called by `::soap_serve` is: ~~~{.cpp} int soap_serve_prefix__method_name(struct soap *soap); ~~~ which after deserializing the XML request message calls the `prefix__method_name` service operation defined by the service application and serializes the XML response message when the service operation returns `#SOAP_OK`. Alternatively, `soapcpp2 -j` option `-j` or option `-i` generates a C++ client proxy class and a service class. These classes have methods corresponding to the service operations, which on the client side can be invoked to invoke remote service operations and on the server side are implemented by the service application to execute the service operations. 🔝 [Back to table of contents](#) ### Service operation parameter passing {#param} The input parameters of a service operation must be passed by value or by pointer. Input parameters cannot be passed by reference. Passing a pointer to the data is preferred when the size of the data of the parameter is non trivial such as values of primitive type. The output parameter must be passed by pointer or by reference. The input and output parameter types must be serializable, which means that there are some limitations on the types of data that can be passed, see Section \ref limitations . If the output parameter is a pointer or reference to a `struct` or `class` type, it is considered a service operation response element instead of a simple output parameter value. That is, the name of the `struct` or `class` is the name of the response element and the `struct` or `class` members are the output parameters of the service operation, see also Section \ref response . Therefore, if the output parameter has to be a `struct` or `class`, a response `struct` or `class` must be declared to wrap that `struct` or `class` type parameter. Likewise, if a service operation returns multiple output parameters then a response `struct` or `class` should be used to wrap the output parameters. By SOAP conventions, the response element is the service operation name ending with "`Response`". The general form of a response struct or class wrapper is: ~~~{.cpp} struct prefix__method_nameResponse { outparam1; outparam2; ... // outparamn; }; ~~~ where * `prefix__` is the optional namespace prefix of the response element. * `response_element_name` it the name of the response element. * `outparam1`, ..., `outparamn` are the output parameters of the service operation. The general form of a service operation specification with a response element declaration is: ~~~{.cpp} int prefix__method_name(inparam1, inparam2, ..., inparamn, struct prefix__method_nameResponse { outparam1; outparam2; ...; outparamn; } *anyname); ~~~ The choice of name for `anyname` has no effect on the SOAP encoding and decoding and is only used as a place holder for the response. In C++ this parameter can be passed by reference instead of by pointer. The request message is:
~~~{.xml} ... ... ... ... ~~~
where the `inparam1`, ..., `inparamn` elements are the XML element representations of the `inparam` parameters. The response message is of the form:
~~~{.xml} ... ... ... ... ~~~
where the `outparam1`, ..., `outparamn` elements are the XML element representations of the `outparam` parameters. The input and output parameters can be made anonymous, which allows the deserialization of requests/responses with different parameter names as is endorsed by the SOAP 1.1 specification, see Section \ref anonymous . 🔝 [Back to table of contents](#) ## C/C++ identifier name to XML tag name translation {#idtrans} One of the nice aspects of gSOAP is its powerful C/C++ XML data binding and the flexibility to specify names for XML, such as service operation names, class names, type identifiers, and struct or class members. The first aspect is the use of namespace prefixes with C/C++ names to qualify the names with XML namespaces, which is specified with a `prefix__` or as we will see later can be specified with a colon `prefix:` in the C/C++ name. A C/C++ identifier name of the form ~~~{.cpp} prefix__element_name ~~~ is be encoded in XML as
~~~{.xml} prefix:element-name ~~~
The underscore pair (`__`) separates the namespace prefix from the element name. Each namespace prefix has a namespace URI specified by a `//gsoap schema namespace: ` directive that is saved to the soapcpp2-generated namespace mapping table, see Sections \ref nstable and \ref namespace . The namespace URI is a unique identification that can be associated with the service operations and data types. The namespace URI disambiguates potentially identical service operation names and data type names used by disparate organizations. XML element names are XSD NCNames (non-colon names) that may contain letters, digits, underscores, hyphens, dots, and other special characters except reserved characters and colon. To add non-element names of service operations, structs, classes, typedefs, and members can be A single underscore `_` in a C/C++ prefix or identifier name is replaced by a hyphen `-` in the XML encoding. For example, the identifier name `SOAP_ENC__ur_type` is represented in XML as `SOAP-ENC:ur-type`. A `_DOT` is replaced by a dot `.` in XML, and `_USCORE` is replaced by an underscore `_` in XML. For example: ~~~{.cpp} class n_s__biz_DOTcom { char * n_s__biz_USCOREname; }; ~~~ is serialized in XML as:
~~~{.xml} Bizybiz ~~~
Other special characters are added to C/C++ names as `_xHHHH` where `HHHH` is the hexadecimal code of a Unicode character code point. Trailing underscores in an identifier name are stripped from the XML encoding. This is useful when an identifier name clashes with a C++ keyword. For example, `return` may be used as an XML element. This `return` element can be specified as `return_`, for example as a struct or class member or function parameter. By default the soapcpp2 tool generates data binding source code in which all local XML elements are and attributes are unqualified: ~~~{.cpp} //gsoap x schema namespace: urn:x struct x__record { @ char * type; // maps to unqualified type attribute char * name; // maps to unqualified name element }; ~~~ where the `name` element and the `type` attribute are unqualified in the XML content (for example to facilitate SOAP RPC encoding). To force qualification of elements and attributes, use the "form" directive: ~~~{.cpp} //gsoap x schema namespace: urn:x //gsoap x schema form: qualified struct x__record { @ char * type; // maps to qualified x:type attribute char * name; // maps to qualified x:name element }; ~~~ You can also use "elementForm" and "attributeForm" directives to (un)qualify local element and attributes, respectively. Because the soapcpp2-generated serializers follow the qualified/unqualified forms of the schemas, there is normally no need to explicitly qualify struct/class members because automatic encoding rules will be used. If explicit qualification is needed, this can be done using the prefix convention: ~~~{.cpp} //gsoap x schema namespace: urn:x //gsoap y schema namespace: urn:y struct x__record { @ char * xsi__type; // maps to qualified xsi:type attribute char * y__name; // maps to qualified y:name element }; ~~~ which ensures that there cannot be any name clashes between members of the same name defined in different schemas (consider for example `name` and `y__name`), but this can clutter the representation when clashes do not occur. An alternative to the prefix convention is the use of "colon notation" in the interface header file for soapcpp2. This extra addition to the the C/C++ syntax allows you to bind type names and struct and class members to qualified and unqualified XML tag names explicitly, thus bypassing the default mechanism that automatically qualifies or unqualifies element and attribute tag names based on the schema element or attribute forms. The colon notation for type names, struct and class names, and members overrides the prefix qualification rules explicitly: ~~~{.cpp} //gsoap x schema namespace: urn:x //gsoap y schema namespace: urn:y struct x:record { @ char * xsi:type; // maps to qualified xsi:type attribute char * y:name; // maps to qualified y:name element }; ~~~ where `x` and `y` are namespace prefixes that are declared with a directive. The `xsi:type` member is an XML attribute in the `xsi` namespace. The soapcpp2 tool generates data binding implementation source code with the following cleaned-up struct without the annotations: ~~~{.cpp} // This code is generated in soapStub.h: struct record { char * type; /* optional attribute of type xsd:string */ char * name; /* optional element of type xsd:string */ }; ~~~ The soapcpp2 tool also generates XML schemas with element and attribute references. That is, `y:name` is referenced from the `y` schema by the `x:record` complexType defined in the `x` schema. The colon notation also allows you to override the element and attribute forms to unqualified for qualified schemas: ~~~{.cpp} //gsoap x schema namespace: urn:x //gsoap x schema form: qualified struct x:record { @ char * :type; // maps to unqualified type attribute char * :name; // maps to unqualified name element }; ~~~ where the colon notation ensures that both `type` and `name` are unqualified in the XML content, which overrides the default qualified forms of the `x` schema. Note that the use of colon notation to bind namespace prefixes to type names (typedef, enum, struct, and class names) translates to code without the prefixes. This means that name clashes can occur between types with identical unqualified names: ~~~{.cpp} enum x:color { RED, WHITE, BLUE }; enum y:color { YELLOW, ORANGE }; // illegal enum name: name clash with x:color ~~~ while prefixing with double underscores never lead to clashes: ~~~{.cpp} enum x__color { RED, WHITE, BLUE }; enum y__color { YELLOW, ORANGE }; // no name clash ~~~ Also note that colon notation has a very different role than the C++ scope operator `::`. The scope operator cannot be used in places where we need colon notation, such as struct and class member members. The default mechanism that associates XML tag names with the names of struct and class member members can be overridden by "re-tagging" names with the annotation of a tag placed next to the member member name. This is particularly useful to support legacy code for which the fixed naming of member members cannot be easily changed. For example: ~~~{.cpp} //gsoap x schema namespace: urn:x //gsoap x schema form: qualified struct x:record { @ char * t `:type`; // maps to unqualified type attribute char * s `name`; // maps to qualified x:name element }; ~~~ This maps the `t` member to the `type` XML attribute tag and `s` member to the `x:name` XML element tag. Tags will be namespace qualified as per schema element and attribute forms, unless preceded by a colon. As of gSOAP 2.8.23 and greater, Unicode characters in C/C++ identifiers are accepted by soapcpp2 when the source file is encoded in UTF-8. C/C++ Unicode names are mapped to Unicode XML tags. For C/C++ source code portability reasons, the wsdl2h tool still converts Unicode XML tag names to ASCII C/C++ identifiers using the `_xHHHH` naming convention for `HHHH` character code points. Use [`wsdl2h -U` option `-U`](#wsdl2h-U) to map Unicode letters in XML tag names to UTF-8-encoded Unicode letters in C/C++ identifiers. 🔝 [Back to table of contents](#) ## Generating a SOAP/XML client application with soapcpp2 {#compilingclient} After invoking the soapcpp2 tool on an interface header file description of a service to generate `soapStub`, `soapH.h`, and `soapC.cpp` for the XML serializers, and `soapClient.cpp` for the client stub functions, the client application is compiled in C++ as follows: c++ -o myclient myclient.cpp stdsoap2.cpp soapC.cpp soapClient.cpp For C we use `soapcpp2 -c` option `-c` to generate C source code that is compiled with: cc -o myclient myclient.c stdsoap2.c soapC.c soapClient.c Depending on your system configuration, such as with Unix, linking with `-lsocket`, `-lxnet`, and `-lnsl` may be required. The `myclient.cpp` file should include `soapH.h` and must include or define a global namespace mapping table, unless `#WITH_NONAMESPACES` is used. For examples of SOAP and REST client applications, see `gsoap/samples` in the gSOAP source code package. The online getting-started guide covers example client and server applications in C and C++, visit to read more. Various examples ranging from simple calculator service APIs to very large protocols spanning dozens of WSDLs can be found at To test client applications using an auto-generated echo test server, use `soapcpp2 -T` option `-T`, see the next section. You can also test a client application with the gSOAP [Test Messenger](../../testmsgr/html/index.html). 🔝 [Back to table of contents](#) ## Generating a SOAP/XML Web service application with soapcpp2 {#compilingservice} After invoking the soapcpp2 tool on an interface header file description of a service to generate `soapStub`, `soapH.h`, and `soapC.cpp` for the XML serializers, and `soapServer.cpp` for the server skeleton functions, the service application is compiled in C++ as follows: c++ -o myserver myserver.cpp stdsoap2.cpp soapC.cpp soapServer.cpp For C we use `soapcpp2 -c` option `-c` to generate C source code that is compiled with: cc -o myserver myserver.c stdsoap2.c soapC.c soapServer.c Depending on your system configuration, such as with Unix, linking with `-lsocket`, `-lxnet`, and `-lnsl` may be required. The `myserver.cpp` file should include `soapH.h` and should include or define a global namespace mapping table, unless `#WITH_NONAMESPACES` is used. A gSOAP service can be installed as: * A simple stateless CGI application where the application just calls `::soap_serve` to serve requests on standard input and output. * A FastCGI application, see Section \ref fastcgi. * A stand-alone server, see Section \ref stand-alone. * A stand-alone multi-threaded server, see Section \ref mt. * An Apache module, see the gSOAP [Apache module](../../apache/html/index.html) documentation. * An ISAPI extension running in IIS, see the gSOAP [ISAPI extension](../../isapi/html/index.html) documentation. To test a service, see the gSOAP [Test Messenger](../../testmsgr/html/index.html). Furthermore, an echo test server application `soapTester.cpp` is generated with `soapcpp2 -T` option `-T`, which is a stand-alone iterative test server that echos SOAP/XML requests and runs on the specified port. Compile this with: c++ -o testserver soapTester.cpp stdsoap2.cpp soapC.cpp soapServer.cpp Then run on a port, say 8080: ./testServer 12288 8080 The 12288 value is a combination of the `#SOAP_XML_INDENT` (0x2000) and `#SOAP_XML_STRICT` (0x1000) integer flag values (8192 + 4096 = 12288). For examples of SOAP and REST Web service applications, see `gsoap/samples` in the gSOAP source code package. The online getting-started guide covers example client and server applications in C and C++, visit to read more. Various examples ranging from simple calculator service APIs to very large protocols spanning dozens of WSDLs can be found at 🔝 [Back to table of contents](#) ## Generating an auto test server for client testing {#autotest} The `soapcpp2 -T` option `-T` generates an echo test server application source code `soapTester.cpp`, which is to be compiled and linked with the code generated for a server implementation `soapServer.cpp` (or with the generated service class file) and `soapC.cpp`. The feature also supports C source code, use the `soapcpp2 -c -T` options `-c` and `-T` to generate a C test server. The echo test server can be used to test a client application, by the client sending messages to the echo test server that echos responses back to the client. These responses are structurally valid but may lack sufficient details to consider the response messages useful. The generated source code is compiled with: c++ -o tester soapTester.cpp soapServer.cpp soapC.cpp stdsoap2.cpp To run the `tester` auto-test service on a port to test a client against, use two command-line arguments: the first argument is a combined integer of OR-ed values of the context flags such as 12288 which is a combination of `#SOAP_XML_INDENT` (0x1000 = 4096) and `#SOAP_XML_STRICT` (0x1000 = 8196) and the second argument is the port number: ./tester 12288 8080 This starts an iterative stand-alone server on port 8080. Messages can be sent to `http://localhost:8080` to test a client application against the echo test server. The data in the response messages are copied from the request messages when possible, or XML default values, or empty otherwise. More advanced servers for testing are available with the gSOAP Test Messenger [testmsgr](../../testmsgr/html/index.html) tool to test SOAP and REST XML clients and servers. 🔝 [Back to table of contents](#) ## Generating deep copy and deletion functions {#deep} The [`soapcpp2 -Ec` option `-Ec`](#soapcpp2-E) generates deep copy code for each serializable type `T` declared in an interface header file for soapcpp2. The [`soapcpp2 -Ed` option `-Ed`](#soapcpp2-E) generates deep deletion code. For a serializable type `T` declared in the interface header file for soapcpp2, option `-Ec` generates: - `virtual T * T::soap_dup(struct soap*) const` where `T` is a class, returns a duplicate of this object by deep copying, replicating all deep cycles and shared pointers when a managing `soap` context is provided as argument. Deep copy is a tree when argument is NULL, but the presence of deep cycles will lead to non-termination. Use flag `SOAP_XML_TREE` with the managing context to copy into a tree without cycles and pointers to shared objects. - `T * soap_dup_T(struct soap*, T *dst, const T *src)` where `T` is not a class, deep copy `src` into `dst`, replicating all deep cycles and shared pointers when a managing `soap` context is provided as argument. When `dst` is NULL, allocates space for `dst` and returns a pointer to the allocated copy. Deep copy results in a tree when the `soap` context is NULL, but the presence of deep cycles will lead to non-termination. Use flag `SOAP_XML_TREE` with managing context to copy into a tree without cycles and pointers to shared objects. Returns `dst` or allocated copy when `dst` is NULL. For a serializable type `T` declared in the interface header file for soapcpp2, option `-Ed` generates: - `virtual void T::soap_del() const` where `T` is a class, deletes all heap-allocated members of this object by deep deletion ONLY IF this object and all of its (deep) members are not managed by a `soap` context AND the deep structure is a tree (no cycles and co-referenced objects by way of multiple (non-smart) pointers pointing to the same data). Can be safely used after `T::soap_dup(NULL)` to delete the deep copy. Does not delete the object itself. - `void soap_del_T(const T*)` where `T` is not a class, deletes all heap-allocated members of this object by deep deletion ONLY IF this object and all of its (deep) members are not managed by a `soap` context AND the deep structure is a tree (no cycles and co-referenced objects by way of multiple (non-smart) pointers pointing to the same data). Can be safely used after `soap_dup_T(NULL, NULL, const T*)` to delete the deep copy returned. Does not delete the object itself. For example: ~~~{.cpp} #include "soapH.h" #include "ns.nsmap" int main() { struct soap *soap = soap_new(); ns__record record; // a serializable type ns__record rec_dup; soap->recvfd = open(file, O_RDONLY); if (soap->recvfd < 0) ... // error if (soap_read_ns__record(soap, &record)) // deserialize from file into managed memory ... // error close(soap->recvfd); soap_dup_ns__record(NULL, &rec_dup, &record); // deep copy the record to unmanaged memory soap_destroy(soap); // delete managed objects soap_end(soap); // delete managed data and temporaries soap_free(soap); // free the context soap_del_ns__record(&rec_dup) // deep delete unmanaged record } ~~~ 🔝 [Back to table of contents](#) # Serialization and deserialization rules {#rules} This section describes the serialization and deserialization of C and C++ data types in XML, and therefore by implication in SOAP 1.1 and 1.2. First, the difference between SOAP RPC encoding and document/literal style is explained and how to switch between SOAP 1.1 and 1.2 or support both in applications. Then the general XML representations of C/C++ data in XML and XML schema is explained. To obtain more information about the code generated by soapcpp2 for the data types specified in an interface header file for soapcpp2, use `soapcpp2 -r` option `-r` to generate a `soapReadme.md` report with all the details. For additional details on serialization of data types in XML, see the [C and C++ XML Data Bindings](../../databinding/html/index.html) documentation. 🔝 [Back to table of contents](#) ## SOAP RPC encoding versus document/literal style messaging {#rpcversusdoclit} The serialization and deserialization rules is almost identical for these two different styles, except for the following: * With SOAP RPC encoding, generic `complexTypes` with `maxOccurs="unbounded"` are not allowed and SOAP-encoded arrays must be used instead. * XML attributes and unions (XML schema `choice`) are not allowed with SOAP RPC encoding. * In XML messages conforming to SOAP RPC encoding we often see `xsi:type` attributed messages although the `xsi:type` attribute is not required and the gSOAP engine does not produce `xsi:type` attributes unless required, e.g. to identify derived classes from base classes serialized. Use `soapcpp2 -t` option `-t` to force `xsi:type` attributes in the XML output. * In XML messages conforming to SOAP RPC encoding, multi-reference accessors using id-href/ref attributes are common to encode co-referenced data. By contrast, multi-referenced data is not accurately represented in document/literal style, which means that data structure graphs cannot be accurately serialized. Document/literal is strictly "tree shaped". The soapcpp2 tool uses SOAP 1.1 document/literal style by default. Use the `//gsoap` directives to control the SOAP protocol version and messaging style, see Section \ref directives, or use `soapcpp2` options `-2` (SOAP 1.2), `-e` (encoding style), and `-t` (add `xsi:type` attributes). 🔝 [Back to table of contents](#) ## SOAP 1.1 versus SOAP 1.2 and dynamic switching {#switching} SOAP 1.1 is the default protocol. SOAP 1.2 support is automatically turned on when the appropriate SOAP 1.2 namespace is used in the WSDL input to wsdl2h, which then generates `#import "soap12.h"` in the interface header file: ~~~{.cpp} #import "soap12.h" ~~~ This interface header file when input to soapcpp2 results in a XML namespace mapping table with SOAP 1.2 namespaces: ~~~{.cpp} struct Namespace namespaces[] = { { "SOAP-ENV", "http://www.w3.org/2003/05/soap-envelope" }, { "SOAP-ENC", "http://www.w3.org/2003/05/soap-encoding" }, ... // { NULL, NULL } } ~~~ The soapcpp2-generated default SOAP 1.1 namespace table allow for dynamic switching between SOAP 1.1 to SOAP 1.2 by providing the SOAP 1.2 namespace as a pattern in the third column of a namespace table: ~~~{.cpp} struct Namespace namespaces[] = { { "SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/*/soap-encoding" }, { "SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/*/soap-envelope" }, ... // { NULL, NULL } } ~~~ where the `*` in the third column of the namespace URI pattern is a wildcard for any sequence of character. This is used to match inbound `xmlns` XML namespace bindings that are then associated with the prefix in the table. For example, when the inbound XML contains a `xmlsn:soap="http://www.w3.org/2003/05/soap-envelope"` binding then the `soap` prefix used in the inbound XML is actually equivalent to `SOAP-ENV` used in gSOAP as determined by the matching pattern in the third column of the XML namespace table shown above. In this way, gSOAP Web services can respond to both SOAP 1.1 or SOAP 1.2 requests. Moreover, the gSOAP engine will automatically return a SOAP 1.2 message response to a SOAP 1.2 message request when the XML namespace table shown above is used. This works by using the specified pattern in the third column, when it matches the namespace URI of the inbound XML request message of course. However, the use of SOAP 1.1 or 1.2 is overridden for one or more service operations with the `//gsoap service method-protocol:` directive. A gSOAP client that sends a request message will always send it using the SOAP protocol specified by the namespace in the second column, unless this is overridden with a `//gsoap service method-protocol:` directive. To make the XML namespace table available to the developer, the soapcpp2 tool generates a `.nsmap` file with the `SOAP-ENV` and `SOAP-ENC` namespaces and patterns as shown in the example above. To use SOAP 1.2 by default and accept SOAP 1.1 messages to be received, use the `soapcpp2 -2` option `-2` to generate SOAP 1.2 `.nsmap` and `.wsdl` files. Alternatively, add the following line to your interface header file (generated by wsdl2h) for soapcpp2: ~~~{.cpp} #import "soap12.h" ~~~ The `soap12.h` file is located in `gsoap/import`. @warning SOAP 1.2 does not support SOAP "partially transmitted arrays". So the `__offset` member of a dynamic array is meaningless in SOAP 1.2. @warning SOAP 1.2 uses `::SOAP_ENV__Code`, `::SOAP_ENV__Reason`, and `::SOAP_ENV__Detail` members of a `::SOAP_ENV__Fault` fault struct, while SOAP 1.1 uses `faultcode`, `faultstring`, and `detail` members. 🔝 [Back to table of contents](#) ## Primitive type serialization {#primtype} The default encoding rules for primitive C and C++ data types in XML are given in the table below: C/C++ type | XSD type ------------------------------------------------ | --------------- `bool` | `xsd:boolean` `char` and `int8_t` | `xsd:byte` `short` and `int16_t` | `xsd:short` `int`, `long`, and `int32_t` | `xsd:int` `LONG64`, `long long` and `int64_t` | `xsd:long` `unsigned char` and `uint8_t` | `xsd:unsignedByte` `unsigned short` and `uint16_t` | `xsd:unsignedShort` `unsigned int`, `unsigned long` and `uint32_t` | `xsd:unsignedInt` `ULONG64`, `long long`, and `uint64_t` | `xsd:unsignedLong` `float` | `xsd:float` `double` | `xsd:double` `long double` | `xsd:decimal` with `#import "custom/long_double.h"` `time_t` | `xsd:dateTime` `struct tm` | `xsd:dateTime` with `#import "custom/struct_tm.h"` `struct timeval` | `xsd:dateTime` with `#import "custom/struct_timeval.h"` `char*`, `const char*`, and `std::string` | `xsd:string` `wchar_t*`, `const wchar_t*`, and `std::wstring` | `xsd:string` Enumerations and bit masks are also supported, see Section \ref enum . Custom serializers for `long double`, `struct tm`, and `struct timeval` and many other specialized C and C++ types are available, see the [C and C++ XML Data Bindings](../../databinding/html/index.html) documentation for details. The previous table shows how C/C++ primitive types are mapped to XSD types. To define and use the full range of XSD types is done with typedefs to define namespace-qualified types in C/C++ corresponding to the XSD types (or to any schema type for that matter). XSD types such as `xsd:positiveInteger`, `xsd:anyURI`, and `xsd:date` for which no built-in data structures in C and C++ exist can always be represented by strings and some can be represented by integers or floats. Validation constraints can be added to validate the XSD type values as explained further below. A `typedef` in an interface header file for soapcpp2 declares a schema type name. The soapcpp2 tool interprets `typedef` declarations the same way as a regular C compiler interprets them. However, the soapcpp2 tool also uses the type name when generating WSDLs and XSD files and in `xsi:type` attributes when present. For example, the declaration: ~~~{.cpp} typedef uint64_t xsd__positiveInteger; ~~~ creates a named type `xsd__positiveInteger` represented by `ulong64_t` and serialized as XSD type `xsd:positiveInteger`. The built-in primitive and derived numerical XSD types are listed below together with their recommended `typedef` declarations. Note that the SOAP encoding schemas for primitive types are derived from the built-in XML Schema types, so `SOAP_ENC__` can be used as a namespace prefix instead of `xsd__`. However, the use of `SOAP_ENC` XML types is obsolete and redundant because XSD primitive types can be used instead. Other XSD types not mentioned in this section, such as `gYearMonth`, `gYear`, `gMonthDay`, `gDay`, `xsd:gMonth`, `QName`, `NOTATION`, etc., can be encoded similarly using a `typedef` declaration with a string type. For additional in-depth details, see the [C and C++ XML Data Bindings](../../databinding/html/index.html) documentation. ### `xsd:anyURI` Represents a Uniform Resource Identifier Reference (URI). Each URI scheme imposes specialized syntax rules for URIs in that scheme, including restrictions on the syntax of allowed fragment identifiers. It is recommended to use strings to store `xsd:anyURI` XML Schema types. The recommended type declaration is: ~~~{.cpp} typedef char *xsd__anyURI; ~~~ or ~~~{.cpp} typedef std::string xsd__anyURI; ~~~ ### `xsd:base64Binary` Represents Base64-encoded arbitrary binary data. For using the `xsd:base64Binary` XSD type, the use of the base64Binary representation of a dynamic array is strongly recommended, see Section \ref base64binary . However, the type can also be declared as a string and the encoding will be string-based: ~~~{.cpp} typedef char *xsd__base64Binary; ~~~ or ~~~{.cpp} typedef std::string xsd__base64Binary; ~~~ However, it is the responsibility of the application to make sure the string content is according to the Base64 Content-Transfer-Encoding defined in Section 6.8 of RFC 2045. Better is to use the base64 serializer that serializes binary data as `xsd:base64Binary`: ~~~{.cpp} struct xsd__base64Binary { unsigned char *__ptr; // point to data to serialize int __size; // length of the data to serialize }; ~~~ ### `xsd:boolean` For declaring an `xsd:boolean` XSD type, the use of a bool is recommended in C++. For C, see Section \ref boolean . The corresponding type declaration is: ~~~{.cpp} typedef bool xsd__boolean; ~~~ ### `xsd:byte` Represents a byte (-128...127). The corresponding type declaration is: ~~~{.cpp} typedef char xsd__byte; ~~~ ### `xsd:dateTime` Represents a date and time. The lexical representation is according to the ISO 8601 extended format CCYY-MM-DDThh:mm:ss where "CC" represents the century, "YY" the year, "MM" the month and "DD" the day, preceded by an optional leading "-" sign to indicate a negative number. If the sign is omitted, "+" is assumed. The letter "T" is the date/time separator and "hh", "mm", "ss" represent hour, minute and second respectively. It is recommended to use the `time_t` type to store `xsd:dateTime` XSD types and the type declaration is: ~~~{.cpp} typedef time_t xsd__dateTime; ~~~ However, note that calendar times before the year 1902 or after the year 2037 cannot be represented. Upon receiving a date outside this range, the `time_t` value will be set to -1. Also strings can be used to store `xsd:dateTime` types: ~~~{.cpp} typedef char *xsd__dateTime; ~~~ Best is to use a custom serializer `struct tm`, `struct timeval`, or `std::chrono::system_clock::time_point` defined by `gsoap/custom/struct_tm.h`, `gsoap/custom/struct_timeval.h`, and `gsoap/custom/chrono_timepoint.h` to represent `xsd:dateTime` accurately. ### `xsd:date` Represents a date. The lexical representation for date is the reduced (right truncated) lexical representation for dateTime: CCYY-MM-DD. It is recommended to use strings (`char*`) to store `xsd:date` XSD types. The type declaration is: ~~~{.cpp} typedef char *xsd__date; ~~~ Best is to use a custom serializer `struct tm` defined by `gsoap/custom/struct_tm_date.h` to represent `xsd:date` accurately. ### `xsd:decimal` Represents arbitrary precision decimal numbers. It is recommended to use the {double} type to store `xsd:decimal` XSD types and the type declaration is: ~~~{.cpp} typedef double xsd__decimal; ~~~ Better is to use a custom serializer `gsoap/custom/long_double.h` to represent `xsd:decimal` or a string to avoid losing accuracy of very large numbers. ### `xsd:double` Corresponds to the IEEE double-precision 64-bit floating point type. The type declaration is: ~~~{.cpp} typedef double xsd__double; ~~~ ### `xsd:duration` Represents a duration of time. The lexical representation for duration is the ISO 8601 extended format PnYn MnDTnH nMnS, where nY represents the number of years, nM the number of months, nD the number of days, T is the date/time separator, nH the number of hours, nM the number of minutes and nS the number of seconds. The number of seconds can include decimal digits to arbitrary precision. It is recommended to use strings (`char*`) to store `xsd:duration` XSD types. The type declaration is: ~~~{.cpp} typedef char *xsd__duration; ~~~ Better is to use a custom serializer `gsoap/custom/duration.h` or `gsoap/custom/chrono_duration.h` to represent `xsd:duration` or a string to avoid losing accuracy of very large numbers. ### `xsd:float` Corresponds to the IEEE single-precision 32-bit floating point type. The type declaration is: ~~~{.cpp} typedef float xsd__float; ~~~ ### `xsd:hexBinary` Represents arbitrary hex-encoded binary data. It has a lexical representation where each binary octet is encoded as a character tuple, consisting of two hexadecimal digits ([0-9a-fA-F]) representing the octet code. For example, "0FB7" is a hex encoding for the 16-bit integer 4023 (binary representation is 111110110111. For using the `xsd:hexBinary` XSD type, the use of the hexBinary representation of a dynamic array is strongly recommended, see Section \ref hexbinary . However, the type can also be declared as a string and the encoding will be string-based: ~~~{.cpp} typedef char *xsd__hexBinary; ~~~ or ~~~{.cpp} typedef std::string xsd__hexBinary; ~~~ However, it is the responsibility of the application to make sure the string content is hex formatted. Better is to use the hex serializer that serializes binary data as `xsd:hexBinary`: ~~~{.cpp} struct xsd__hexBinary { unsigned char *__ptr; // point to data to serialize int __size; // length of the data to serialize }; ~~~ ### `xsd:int` Corresponds to a 32-bit integer in the range -2147483648 to 2147483647. ~~~{.cpp} typedef int xsd__int; ~~~ ### `xsd:integer` Corresponds to an unbounded integer. C/C++ does not support unbounded integers as a standard feature. The recommended type declaration is: ~~~{.cpp} typedef int64_t xsd__integer; ~~~ Another possibility is to use strings to represent unbounded integers and do the translation in the application itself. ### `xsd:long` Corresponds to a 64-bit integer in the range -9223372036854775808 to 9223372036854775807. The type declaration is: ~~~{.cpp} typedef int64_t xsd__long; ~~~ ### `xsd:negativeInteger` Corresponds to a negative unbounded integer. C/C++ does not support unbounded integers as a standard feature. The recommended type declaration is: ~~~{.cpp} typedef int64_t xsd__negativeInteger : -1 ; ~~~ Another possibility is to use strings to represent unbounded integers and do the translation in the application itself. ### `xsd:nonNegativeInteger` Corresponds to a non-negative unbounded integer. Since C++ does not support unbounded integers as a standard feature, the recommended type declaration is: ~~~{.cpp} typedef uint64_t xsd__nonNegativeInteger 0 : ; ~~~ Another possibility is to use strings to represent unbounded integers and do the translation in the application itself. ### `xsd:nonPositiveInteger` Corresponds to a non-positive unbounded integer. Since C++ does not support unbounded integers as a standard feature, the recommended type declaration is: ~~~{.cpp} typedef int64_t xsd__nonPositiveInteger : 0 ; ~~~ Another possibility is to use strings to represent unbounded integers and do the translation in code. ### `xsd:normalizedString` Represents normalized character strings. Normalized character strings do not contain the carriage return (#xD), line feed (#xA) nor tab (#x9) characters. It is recommended to use strings to store `xsd:normalizedString` XSD types. The type declaration is: ~~~{.cpp} typedef char *xsd__normalizedString; ~~~ or ~~~{.cpp} typedef std::string xsd__normalizedString; ~~~ ### `xsd:positiveInteger` Corresponds to a positive unbounded integer. C/C++ does not support unbounded integers as a standard feature. The recommended type declaration is: ~~~{.cpp} typedef uint64_t xsd__positiveInteger 1 : ; ~~~ Another possibility is to use strings to represent unbounded integers and do the translation in the application itself. ### `xsd:short` Corresponds to a 16-bit integer in the range -32768 to 32767. The type declaration is: ~~~{.cpp} typedef short xsd__short; ~~~ ### `xsd:string` Represents character strings. The type declaration is: ~~~{.cpp} typedef char *xsd__string; ~~~ or ~~~{.cpp} typedef std::string xsd__string; ~~~ The type declaration for wide character strings is: ~~~{.cpp} typedef wchar_t *xsd__string; ~~~ or ~~~{.cpp} typedef std::wstring xsd__string; ~~~ Both types of regular and wide strings can be used at the same time, by using a typedef name with a trailing underscore as follows: ~~~{.cpp} typedef wchar_t *xsd__string_; ~~~ or ~~~{.cpp} typedef std::wstring xsd__string_; ~~~ ### `xsd:time` Represents a time. The lexical representation for time is the left truncated lexical representation for dateTime: hh:mm:ss.sss with optional following time zone indicator. It is recommended to use strings (`char*`) to store `xsd:time` XSD types. The type declaration is: ~~~{.cpp} typedef char *xsd__time; ~~~ or ~~~{.cpp} typedef std::string xsd__time; ~~~ Better is to use a custom serializer `gsoap/custom/long_time.h` to represent `xsd:time` or a string to avoid losing accuracy. ### `xsd:token` Represents tokenized strings. Tokens are strings that do not contain the line feed (#xA) nor tab (#x9) characters, that have no leading or trailing spaces (#x20) and that have no internal sequences of two or more spaces. It is recommended to use strings to store `xsd:token` XSD types. The type declaration is: ~~~{.cpp} typedef char *xsd__token; ~~~ ### `xsd:unsignedByte` Corresponds to an 8-bit unsigned integer in the range 0 to 255. The type declaration is: ~~~{.cpp} typedef uint8_t xsd__unsignedByte; ~~~ ### `xsd:unsignedInt` Corresponds to a 32-bit unsigned integer in the range 0 to 4294967295. The type declaration is: ~~~{.cpp} typedef uint32_t xsd__unsignedInt; ~~~ ### `xsd:unsignedLong` Corresponds to a 64-bit unsigned integer in the range 0 to 18446744073709551615. The type declaration is: ~~~{.cpp} typedef uint64_t xsd__unsignedLong; ~~~ ### `xsd:unsignedShort` Corresponds to a 16-bit unsigned integer in the range 0 to 65535. The type declaration is: ~~~{.cpp} typedef uint16_t xsd__unsignedShort; ~~~ 🔝 [Back to table of contents](#) ### How to use multiple C/C++ types for a single primitive XSD type {#multiprim} As explained in Section \ref idtrans, trailing underscores in a type name are not relevant in XML and in the XML schemas generated by soapcpp2. Therefore, we can map multiple C/C++ types to XSD types (or any XML schema type). For example, the following declaration in the interface header file for soapcpp2 permits us to use regular strings and wide strings while mapping these both to the XSD `xsd:string` type: ~~~{.cpp} typedef char *xsd__string; typedef wchar_t *xsd__string_; ~~~ 🔝 [Back to table of contents](#) ### How to use C++ wrapper classes to specify polymorphic primitive types {#primclass} XSD schema types form a hierarchy of types, with `xsd:anyType` at the root. A container or array of `xsd:anyType` may actually contain any mix of types, i.e. this container or array is polymorphic. On the one hand, the `typedef` construct provides a convenient way to associate existing C/C++ types with XML schema types and makes it easy to incorporate these types in a (legacy) C/C++ application without having to replace application types in the source code. On the other hand the `typedef` declarations cannot be used to support polymorphic types. To create a derivable primitive type `T`, a wrapper class is declared as follows: ~~~{.cpp} class prefix__type_name : public xsd__super_type_name { public: T __item; ... // other members, see note below }; ~~~ where `T` is a primitive C/C++ type. The `__item` member must be the first member of the wrapper class and all other members are not serialized. For example, the a large portion of the XML type hierarchy can be implemented in C++ as follows: ~~~{.cpp} class xsd__anyType { }; class xsd__anySimpleType : public xsd__anyType { }; typedef char *xsd__string; class xsd__string_ : public xsd__anySimpleType { public: xsd__string __item; }; typedef xsd__string xsd__anyURI; class xsd__anyURI_ : public xsd__anySimpleType { public: xsd__anyURI __item; }; typedef bool xsd__boolean; class xsd__boolean_ : public xsd__anySimpleType { public: xsd__boolean __item; }; typedef xsd__string xsd__date; class xsd__date_ : public xsd__anySimpleType { public: xsd__date __item; }; typedef time_t xsd__dateTime; class xsd__dateTime_ : public xsd__anySimpleType { public: xsd__dateTime __item; }; typedef double xsd__double; class xsd__double_ : public xsd__anySimpleType { public: xsd__double __item; }; typedef xsd__string xsd__duration; class xsd__duration_ : public xsd__anySimpleType { public: xsd__duration __item; }; typedef float xsd__float; class xsd__float_ : public xsd__anySimpleType { public: xsd__float __item; }; typedef xsd__string xsd__time; class xsd__time_ : public xsd__anySimpleType { public: xsd__time __item; }; typedef xsd__string xsd__decimal; class xsd__decimal_ : public xsd__anySimpleType { public: xsd__decimal __item; }; typedef xsd__string xsd__integer; class xsd__integer_ : public xsd__decimal_ { public: xsd__integer __item; }; typedef LONG64 xsd__long; class xsd__long_ : public xsd__integer_ { public: xsd__long __item; }; typedef long xsd__int; class xsd__int_ : public xsd__long_ { public: xsd__int __item; }; typedef short xsd__short; class xsd__short_ : public xsd__int_ { public: xsd__short __item; }; typedef char xsd__byte; class xsd__byte_ : public xsd__short_ { public: xsd__byte __item; }; typedef xsd__string xsd__nonPositiveInteger; class xsd__nonPositiveInteger_ : public xsd__integer_ { public: xsd__nonPositiveInteger __item; }; typedef xsd__string xsd__negativeInteger; class xsd__negativeInteger_ : public xsd__nonPositiveInteger_ { public: xsd__negativeInteger __item; }; typedef xsd__string xsd__nonNegativeInteger; class xsd__nonNegativeInteger_ : public xsd__integer_ { public: xsd__nonNegativeInteger __item; }; typedef xsd__string xsd__positiveInteger; class xsd__positiveInteger_ : public xsd__nonNegativeInteger_ { public: xsd__positiveInteger __item; }; typedef ULONG64 xsd__unsignedLong; class xsd__unsignedLong_ : public xsd__nonNegativeInteger_ { public: xsd__unsignedLong __item; }; typedef unsigned long xsd__unsignedInt; class xsd__unsignedInt_ : public xsd__unsignedLong_ { public: xsd__unsignedInt __item; }; typedef unsigned short xsd__unsignedShort; class xsd__unsignedShort_ : public xsd__unsignedInt_ { public: xsd__unsignedShort __item; }; typedef unsigned char xsd__unsignedByte; class xsd__unsignedByte_ : public xsd__unsignedShort_ { public: xsd__unsignedByte __item; }; typedef xsd__string xsd__normalizedString; class xsd__normalizedString_ : public xsd__string_ { public: xsd__normalizedString __item; }; typedef xsd__string xsd__token; class xsd__token_ : public xsd__normalizedString_ { public: xsd__token __item; }; ~~~ Note the use of the trailing underscores for the `class` names to distinguish the `typedef` type names from the `class` names. The `char*` type of `xsd__string` can be replaced with `std::string` or a wide string type. We can also add the `xsd:base64Binary` and `xsd:hexBinary` types that serialize raw binary data in the hierarchy as follows: ~~~{.cpp} class xsd__base64Binary : public xsd__anySimpleType { public: unsigned char *__ptr; int __size; }; class xsd__hexBinary : public xsd__anySimpleType { public: unsigned char *__ptr; int __size; }; ~~~ See Sections \ref base64binary and \ref hexbinary . Methods can be added to these classes, such as constructors and getter/setter methods, see Section \ref gettersetter . Wrapper structs are supported as well, similar to wrapper classes. But they cannot be used to implement polymorphism. Rather, the wrapper structs are used to represent a `xsd:sequence` of elements or to add attributes to primitive types as explained in Section \ref attributes . For additional details, see the [C and C++ XML Data Bindings](../../databinding/html/index.html) documentation. 🔝 [Back to table of contents](#) ### Multi-reference strings {#multirefstrings} If more than one `char` pointer points to the same string, the string is encoded as a multi-reference value, unless `#SOAP_XML_TREE` is used or the `#WITH_NOIDREF` compile-time flag. Consider for example: ~~~{.cpp} class ns__record { public: const char *s; const char *t; }; ~~~ A record instance is populated as follows and then serialized: ~~~{.cpp} struct soap *soap = soap_new1(SOAP_XML_GRAPH); ns__record record; record.s = "hello"; record.t = s; soap_write_ns__record(soap, &record); ~~~ The `s` and `t` variables are assigned the same string. When serialized, `t` refers to the content of `s`:
~~~{.xml} hello ~~~
However, strings declared with different typedef names will never be considered multi-reference even when they point to the same string. For example: ~~~{.cpp} typedef char *xsd__string; typedef char *ns__string; class ns__record { public: const xsd__string s; const ns__string t; }; ~~~ This avoids type conflicts when a receiver considers these types incompatible. To enable multi-references in XML use `#SOAP_XML_GRAPH`. To disable multi-references in SOAP 1.1 and 1.2 RPC encoded messages, use `#SOAP_XML_TREE`. 🔝 [Back to table of contents](#) ### Smart string mixed-content deserialization {#smart} The implementation of string deserialization permits mixed content. When XML contains mixed text and tags when a string is expected, the text with tags are collected into the deserialized string. For example, suppose the `getInfo` service operation returns some detailed information. The service operation is declared as: ~~~{.cpp} // Contents of file "getInfo.h": getInfo(char *detail); ~~~ The proxy of the service is used by a client to request a piece of information and the service responds with: HTTP/1.1 200 OK Content-Type: text/xml Content-Length: nnn
~~~{.xml} Mona Lisa by Leonardo da Vinci ~~~
The `detail` string will contain `"Mona Lisa by Leonardo da Vinci"`. Note that serialization of this string will not produce mixed content but rather the XML output:
~~~{.xml} Mona Lisa by <i>Leonardo da Vinci</i> ~~~
To serialize XML stored in strings, use the `_XML` type (a `char*`) in the interface header file for soapcpp2. For example: ~~~{.cpp} // Contents of file "getInfo.h": getInfo(_XML detail); ~~~ In C++ you can use a `std::string` instead, as follows: ~~~{.cpp} // Contents of file "getInfo.h": typedef std::string XML; getInfo(XML detail); ~~~ The `_XML` and typedef `XML` are literal XML strings, see also Section \ref literal2. 🔝 [Back to table of contents](#) ### Changing the precision of float and double types {#precision} The format used to output double precision floating point values in XML is by default set to "`%.17lG`", which means that at most 17 digits of precision are output. The format used by the gSOAP engine to output single precision floating point values is by default "`%.9G`". The format of a double can be set by assigning a format string to `::soap::double_format`. For example: ~~~{.cpp} struct soap soap; soap_init(&soap); // sets double_format = "%.18G" soap.double_format = "%e"; // redefine ~~~ which causes all doubles to be output in XML and JSON in scientific notation. Likewise, the encoding format of a float type can be set by assigning a format string to the `::soap::float_format` string variable. For example: ~~~{.cpp} struct soap soap; soap_init(&soap); // sets float_format = "%.9G" soap.float_format = "%.4f"; // redefine ~~~ which causes all floats to be output in XML and JSON with four digits precision. A new feature to specify format patterns was introduced in gSOAP 2.8.18. A format string can be used as a pattern for a typedef float or double in the interface header file for soapcpp2 to specify the representation in XML. For example: ~~~{.cpp} typedef float time__ratio "%5.2f"; ~~~ This will output the float in XML with 5 digits total and 2 digits after the decimal point. The soapcpp2 tool also generates an XML schema with `xsd:totalDigits` and `xsd:fractionDigits` for this type:
~~~{.xml} ~~~
The wsdl2h tool converts WSDLs and XSDs with `xsd:totalDigits` and `xsd:fractionDigits` to typedefs with format patterns. 🔝 [Back to table of contents](#) ### INF, -INF, and NaN values of float and double types {#floatinfnan} IEEE INF, -INF, and NaN values of floats are output in XML as `INF`, `-INF`, and `NaN`, respectively, as supported by the XML schema standards. For portability, the following macros can be used containing the float and double values `INF`, `-INF`, and `NaN`: ~~~{.cpp} float x = FLT_PINFTY; float x = FLT_NINFTY; float x = FLT_NAN; double x = DBL_PINFTY; double x = DBL_NINFT; double x = DBL_NAN; ~~~ To check for `INF`, `-INF`, and `NaN` use: ~~~{.cpp} soap_isinf(x) && x > 0 // x is INF soap_isinf(x) && x < 0 // x is -INF soap_isnan(x) // x is NaN ~~~ 🔝 [Back to table of contents](#) ## Enumeration serialization {#enum} Enumerations are generally useful for the declaration of named integer-valued constants. For additional details, see the [C and C++ XML Data Bindings](../../databinding/html/index.html) documentation. 🔝 [Back to table of contents](#) ### Serialization of symbolic enumeration constants {#enumserialization} The soapcpp2 tool encodes the constants of enumeration-typed variables in symbolic form using the names of the constants when possible to comply to SOAP's enumeration encoding style. Consider for example the following enumeration of weekdays: ~~~{.cpp} enum weekday { Mon, Tue, Wed, Thu, Fri, Sat, Sun }; ~~~ The enumeration-constant `Mon`, for example, is encoded as
~~~{.xml} Mon ~~~
An XML namespace prefix can be specified as part of the enumeration-type identifier's name, with the usual namespace prefix conventions for identifiers. For example: ~~~{.cpp} enum ns__weekday { Mon, Tue, Wed, Thu, Fri, Sat, Sun }; ~~~ The `ns__weekday` type with enumeration-constant `Sat`, for example, is output in XML as:
~~~{.xml} Sat ~~~
The corresponding XML schema type for this enumeration type is:
~~~{.xml} ~~~
C++11 scoped enumerations are supported by soapcpp2 with option `-c++11`: ~~~{.cpp} enum class ns__weekday : int { Mon, Tue, Wed, Thu, Fri, Sat, Sun }; ~~~ Enumeration constants can be initialized, for example: ~~~{.cpp} enum ns__relation { LESS = -1, EQUAL = 0, GREATER = 1 }; ~~~ The symbolic names `LESS`, `EQUAL`, and `GREATER` will appear in the XML output. If the value of an enumeration-typed variable has no corresponding named constant, the value is encoded as a signed integer literal. For example, the following declaration of a `workday` enumeration type lacks named constants for Saturday and Sunday: ~~~{.cpp} enum ns__workday { Mon, Tue, Wed, Thu, Fri }; ~~~ If the constant `5` (Saturday) or `6` (Sunday) is assigned to a variable of the `workday` enumeration type, the variable will be encoded with the integer literals `5` and `6`, respectively. For example:
~~~{.xml} 5 ~~~
Since this is legal in C/C++ and in SOAP RPC encoding, but not XML validators, we cam transmit integer literals as well as enumeration constants with an enumeration type. When enumeration constants are numeric, we can use the following simple trick: ~~~{.cpp} enum ns__nums { _1 = 1, _2 = 2, _3 = 3 }; ~~~ The corresponding XML schema type for this enumeration type is:
~~~{.xml} ~~~
🔝 [Back to table of contents](#) ### How to reuse symbolic enumeration constants {#enumreuse} A well-known deficiency of C and C++ enumeration types before C++11 scoped enumerations is the lack of a mechanism to reuse symbolic names by multiple enumerations. This issue is largely resolved with scoped enumerations in C++11, which the soapcpp2 tool supports. In plain C and C++ we can use trailing underscores to avoid name clashes, for example: Consider for example: ~~~{.cpp} enum ns__workday { Mon, Tue, Wed, Thu, Fri }; enum ns__weekday { Mon_, Tue_, Wed_, Thu_, Fri_, Sat_, Sun_ }; ~~~ which will result in the encoding of the constants of `enum ns__weekday` without the underscore, for example as `Mon`. However, the soapcpp2 tool is a bit smarter than your average C/C++ compiler and also permits the following declarations that reuse enumeration constants, because the enumeration constants have the same enumerating integer values: ~~~{.cpp} enum ns__workday { Mon, Tue, Wed, Thu, Fri }; enum ns__weekday { Mon, Tue, Wed, Thu, Fri, Sat, Sun }; ~~~ The soapcpp2 tool generates `soapStub.h` with amended enumeration definitions that the C/C++ compiler can handle, so you can still use the shared enumeration constants in your application code. To avoid name clashes with enumeration constants, you can use the following convention with double underscores to add the enum name to the enum constants: ~~~{.cpp} enum prefix__name { prefix__name__enumconst1, prefix__name__enumconst2, ... }; ~~~ where the type name of the enumeration `prefix__name` is a prefixed name, such as: ~~~{.cpp} enum ns__workday { ns__workday__Mon, ns__workday__Tue, ns__workday__Wed, ns__workday__Thu, ns__workday__Fri }; enum ns__weekday { ns__workday__Mon, ns__workday__Tue, ns__workday__Wed, ns__workday__Thu, ns__workday__Fri, ns__workday__Sat, ns__workday__Sun }; ~~~ This ensures that the XML schema enumeration values are still simply `Mon`, `Tue`, `Wed`, `Thu`, `Fri`, `Sat`, and `Sun`. @warning The following declaration: ~~~{.cpp} enum ns__workday { Mon, Tue, Wed, Thu, Fri }; enum ns__weekday { Sat = 5, Sun = 6}; ~~~ will not properly encode the `weekday` enumeration when you assume that workdays are part of weekdays, because it lacks the named constants for `workday` in its enumeration list. All enumerations must be self-contained and cannot use enum constants of other enumerations. 🔝 [Back to table of contents](#) ### Boolean enumeration serialization for C {#boolean} The C++ `bool` type that is serialized as `xsd:boolean` XSD type cannot be used in C. Instead, an enumeration type should be used to serialize true and false values as `xsd:boolean` XSD type values. The `xsd:boolean` XSD type is defined as an enumeration in C as: ~~~{.cpp} enum xsd__boolean { false_, true_ }; ~~~ The value `false_`, for example, is output in XML as:
~~~{.xml} false ~~~
Peculiar of the SOAP encoding boolean type is that it only defines the values `0` and `1`, while the XSD `xsd:boolean` type defines `false` and `true` as valid values. While SOAP encoding types are rarely used since almost all SOAP/XML Web services rely on XSD types for primitive values, we can still define the following: ~~~{.cpp} typedef int SOAP_ENC__boolean; ~~~ 🔝 [Back to table of contents](#) ### Bitmask enumeration serialization {#bitmask} A bitmask is an enumeration of power-of-two flags. The soapcpp2 tool makes it easy to define bitmasks using an annotated `enum` with a `*`: ~~~{.cpp} enum * name { enum-constant, enum-constant, ... }; ~~~ This declares a regular `enum` but enumerates the enumeration constants as a series of powers of 2 starting with 1. This means that the enumeration constants can be bitwise or-ed with the `|` operator to form a bitvector (bitmask) which is serialized in XML as a list of symbolic values. For example: ~~~{.cpp} enum * ns__machineStatus { ON, BELT, VALVE, HATCH}; int ns__setMachineStatus(enum ns__machineStatus status, enum ns__machineStatus *result); ~~~ Note that the use of the `enum` name as a parameter does not require the asterisk, only the definition does. The soapcpp2 tool generates a proper C/C++ enumeration in `soapStub.h` that is included by `soapH.h` by your application: ~~~{.cpp} enum ns__machineStatus { ON=1, BELT=2, VALVE=4, HATCH=8 }; ~~~ The corresponding XML schema type for this enumeration type is:
~~~{.xml} ~~~
The values of `enum ns__machineStatus` can be or-ed, for example `ON|VALVE` is output in XML as:
~~~{.xml} ON VALVE ~~~
C++11 scoped enumerations for bitmasks are supported by soapcpp2, for example: ~~~{.cpp} enum * class ns__machineStatus { ON, BELT, VALVE, HATCH}; int ns__setMachineStatus(ns__machineStatus status, ns__machineStatus *result); ~~~ 🔝 [Back to table of contents](#) ## Struct and class serialization {#struct} This section gives a brief overview of struct and class serialization. Structs do not support inheritance when declared in an interface header file for soapcpp2. This makes serialization of structs is more efficient compared to classes. Serialization functions for structs are global functions. By contrast, soapcpp2 augments classes with serialization methods and `soap_type()` method that returns the type of the class instance, which is necessary to distinguish base class instances from derived class instances for (smart) pointers to base class instances. For additional details not covered here, see the [C and C++ XML Data Bindings](../../databinding/html/index.html) documentation. A class and struct instance is serialized as an XML element with attributes and sub-elements, which is represented in XML schema as a `complexType`. The class name is the XML schema type name and the member variables of the class are the type's accessors. Consider the general declaration of an inherited class: ~~~{.cpp} class prefix__class_name1 : public prefix__class_name2 { public: field1; field2; ... // more fields method1; method2; ... // more methods }; ~~~ then * `prefix__` is the optional namespace prefix associated with the class. * `class_name1` is the name of the `complexType` for this class. * `class_name2` is an optional base class. * `field` is a member variable that is serialized when public and non-const. * `method` is a method declaration. Abstract methods are not allowed for serializable classes. A class name is required to be unique and cannot have the same name as a `struct`, `enum`, or a service operation name specified in the interface header file for soapcpp2. Only single inheritance is supported by the soapcpp2 tool. Multiple inheritance is not supported because of the limitations of the XML schema extensibility. If a constructor is present, there must also be a constructor declaration with an empty parameter list. If no constructors are present, then soapcpp2 generates constructors to initialize the members with the generated `soap_default` method of this class. To obtain more information about the code generated by soapcpp2 for a struct or class, use `soapcpp2 -r` option `-r` to generate a `soapReadme.md` report with all the details. Classes and structs may be declared `volatile` if you don't want soapcpp2 to generate the class definition, see Section \ref volatile for more details. Class templates are supported with only one template argument, see Section \ref templates . Member variables of a class can be serialized as XML attributes using the `@` type qualifier, if the member is a primitive type or pointer to a primitive type. See Section \ref attributes for more details. See Section \ref idtrans for more details on the struct/class member serialization and the resulting element and attribute qualified forms. Arrays may be embedded within a class and a struct using a pointer member and size information, see Section \ref list . Void pointers may be used in a class or a struct, but you have to add a type field so the engine can determine the type of object pointed to, see Section \ref void . A class instance is output in XML as:
~~~{.xml} ... ... ... ... ... ... ~~~
where the `field` accessors have element-name representations of the class members and the `basefield` accessors have element-name representations of the base class members. If a derived class instance is used in place of a base class instance, then the serialized XML form carries a `xsi:type` attribute with the derived class type to distinguish it from the base class type:
~~~{.xml} ... ... ... ... ... ... ~~~
The deserialization of a class instance allows any ordering of the accessors in the XML message. However, if a base class member name is identical to a derived class member name, because the member is overloaded, the base class member name must precede the derived class member name in the XML message. For additional details, see the [C and C++ XML Data Bindings](../../databinding/html/index.html) documentation. 🔝 [Back to table of contents](#) ### Example {#example10} The following example declares a base class `ns__Object` and a derived class `ns__Shape`: ~~~{.cpp} // Contents of file "shape.h": class ns__Object { public: @ char *name; }; class ns__Shape : public ns__Object { public: @ int sides; @ enum ns__Color { Red, Green, Blue } color; std::string description; ns__Shape(); ns__Shape(int sides, enum ns__Color color, std::string& description); ~ns__Shape(); }; ~~~ The implementation of the `class ns__Shape` methods cannot be part of the interface header file for soapcpp2 and are defined in a separate `shape.cpp` C++ source code file. An instance of `class ns__Shape` with name Triangle, 3 sides, and color Green is output in XML as:
~~~{.xml} This is a green triangle ~~~
🔝 [Back to table of contents](#) ### Class methods {#methods} A class declaration in the interface header file for soapcpp2 may include method declarations. The method implementations must not be part of the header file but should be defined in another C++ source file, because soapcpp2 parses C/C++ type declarations but does not parse C/C++ code statements and constructor initializer lists. If constructors are not defined, then soapcpp2 generates constructors for the class to initialize the class with default values for member variables or the initialization values for member variables given in the class declaration. If destructors are not defined, then soapcpp2 generates destructors for the class. To obtain more information about the code generated by soapcpp2 for a class, use `soapcpp2 -r` option `-r` to generate a `soapReadme.md` report with all the details. 🔝 [Back to table of contents](#) ### Get and set methods {#gettersetter} Setter and getter methods are invoked at run time upon serialization and deserialization of class instances, respectively. The use of setter and getter methods adds more flexibility to the serialization and deserialization process. A setter method is called by the serializer. You can use setter methods to update a class instance just before it is serialized. For example, you can use setter methods to update a class instance right before serialization. Setters are methods for "set to serialize" operations. Getter methods are immediately invoked after deserialization of a class instance. You can use them to adjust the contents of class instances right after the instance was populated by the deserializer Getter and setter methods have the following class method signature: ~~~{.cpp} int get(struct soap *soap); int set(struct soap *soap); ~~~ These methods may be declared `virtual` and may be declared `const`. The active `::soap` context will be passed to the `get` and `set` methods. The methods should return `#SOAP_OK` when successful. A setter method should prepare the contents of the class instance for serialization. A getter method should process the instance after deserialization. Here is an example of a base64 binary class: ~~~{.cpp} class xsd__base64Binary { public: unsigned char *__ptr; int __size; int get(struct soap *soap); int set(struct soap *soap); }; ~~~ Suppose that the type and options members of the attachment should be set when the class is about to be serialized. This can be accomplished with the `set` method from the information provided by the `__ptr` to the data and the `::soap` context passed to the `set` method (you can pass data via the `void* ::soap::user` member). The `get` method is invoked after the base64 data has been processed. You can use it for post-processing purposes. Here is another example. It defines a primitive `update` type. The class is a wrapper for the `time_t` type, see Section \ref primclass . Therefore, elements of this type contain `xsd:dateType` data. ~~~{.cpp} class update { public: time_t __item; int set(struct soap *soap); }; ~~~ The setter method assigns the current time just before the instance is serialized: ~~~{.cpp} int update::set(struct soap *soap) { this->__item = time(NULL); return SOAP_OK; } ~~~ This means that serialization in XML results in the inclusion of an up-to-date time stamp. A `get` method is invoked immediately after the instance is populated by the deserializer. The method is not invoked when the element is an `xsi:nil` element or has a SOAP `href` or `ref` attribute referencing a value located elsewhere in the XML message or document. @note The `soap_out` method of a class calls the setter method However, the `soap_out` method is declared `const` while the setter should be allowed to modify the contents of the class instance. Therefore, the soapcpp2-generated code recasts the instance and the `const` is removed when invoking the setter. 🔝 [Back to table of contents](#) ### Updating and checking instances with get and set methods {#streaming} Getter methods enable streaming XML operations. A getter method is invoked when the object is deserialized and the rest of the XML message has not been parsed yet. For example, you can add a getter method to the SOAP Header class to implement header processing logic that is activated as soon as the SOAP Header is received. An example is shown below: ~~~{.cpp} class h__Authentication { public: char *id; int get(struct soap *soap); }; class SOAP_ENV__Header { public: h__Authentication *h__authentication; }; ~~~ The `Authentication` SOAP Header member is instantiated and decoded. After decoding, the getter method is invoked, which can be used to check the `id` before the rest of the SOAP message is parsed. 🔝 [Back to table of contents](#) ### Polymorphism, derived types, and dynamic binding in C++ {#polymorph} Polymorphism through C++ inheritance is supported by the gSOAP tools, which means that derived XML schema types are (de)serialized when an `xsi:type` attribute is present. Because C does not support inheritance, a different approach is use for C code, see Section \ref polymorphC for details. Base and derived C++ classes can be used anywhere, including service operation parameters and in struct and class members, provided that parameters and members are pointers to classes to allow dynamic binding at run time. Base and derived classes can also be used with containers such as `std::vector` and smart pointers such as `std::shared_ptr`. The following example interface header file for soapcpp2 declares `ns__Base` and `ns__Derived` classes and a service operation that takes a pointer to a `ns__Base` class instance and returns a `ns__Base` class instance: ~~~{.cpp} // Contents of file "derived.h" class ns__Base { public: char *name; ns__Base(); virtual void print(); }; class ns__Derived : public ns__Base { public: int num; ns__Derived(); virtual void print(); }; int ns__webmethod(ns__Base *in, struct ns__webmethodResponse { ns__Base *out; } & result); ~~~ The service operation input parameter may point to a `ns__Derived` class instance that will be serialized as `ns__Derived` class instance instead of a `ns__Base` class instance. Likewise, the service operation output parameter that is placed in a wrapper struct (because structs and classes are always considered wrappers to define the response message with output parameters) may point to a `ns__Derived` class instance. The `ns__Base` and `ns__Derived` class method implementations are: ~~~{.cpp} // Method implementations of the ns__Base and ns__Derived classes: #include "soapH.h" ns__Base::ns__Base() { std::cout << "created a Base class instance" << std::endl; } ns__Derived::ns__Derived() { std::cout << "created a Derived class instance" << std::endl; } ns__Base::print() { std::cout << "print(): Base class instance " << name << std::endl; } ns__Derived::print() { std::cout << "print(): Derived class instance " << name << " " << num << std::endl; } ~~~ Below is an example client application that creates a `ns__Derived` class instance that is passed as the input parameter of the `ns__webmethod` service operation: ~~~{.cpp} // CLIENT #include "soapH.h" int main() { struct soap soap; soap_init(&soap); ns__Derived obj; struct ns__webmethodResponse r; soap_default_ns__Derived(&soap, &obj); obj.name = "X"; obj.num = 3; if (soap_call_ns__webmethod(&soap, endpoint, NULL, &obj, r) == SOAP_OK) if (r.out) r.out->print(); soap_destroy(&soap); soap_end(&soap); soap_done(&soap); } ~~~ The following example server application copies a class instance (`ns__Base` or `ns__Derived`) from the input to the output parameter: ~~~{.cpp} // SERVER #include "soapH.h" int main() { struct soap soap; soap_init(&soap); soap_serve(&soap); soap_destroy(&soap); soap_end(&soap); soap_done(&soap); } int ns__webmethod(struct soap *soap, ns__Base *in, struct ns__webmethodResponse &result) { if (in) in->print(); result.out = in; return SOAP_OK; } ~~~ The following messages are produced by the client and server applications: CLIENT: created a Derived class instance SERVER: print(): Derived class instance X 3 CLIENT: created a Derived class instance CLIENT: print(): Derived class instance X 3 This shows that the `Derived` class instance kept its identity as it passed through the server. Another way to serialize polymorphic values in XML that are indicated with `xsi:type` attributes is with `void*` members that point to a serializable value. See Section \ref void for details. 🔝 [Back to table of contents](#) ### Polymorphism, derived types, and dynamic binding in C {#polymorphC} Because C does not support object-oriented inheritance, derived types are obviously not declared as base structs or classes as in C++. Instead, we add the derived type structs to the base structs as members that point to the derived type value when the base type is dynamically overridden by one of the derived types. In this way we can (de)serialize a base type struct as usual or one of the derived structs when the base type is overridden. To serialize a derived type struct in place of the base struct, we set its corresponding member point to the derived struct value, which is serialized with the `xsi:type` attribute to indicate a derived type is used in XML. Deserialization of a derived type struct is done automatically when the `xsi:type` attribute is present. This approach with additional members pointing to derived types was introduced with gSOAP 2.8.75. This approach has the benefit of type safety compared to attempts to replicate C++ inheritance by trying to overlay derived types with base types in memory, which would be fragile. This method is fully automated for the wsdl2h tool to generate an interface header file for soapcpp2 with the type derivations in C. To use this method to generate code from WSDLs and XSDs, use [`wsdl2h -F` option `-F`](#wsdl2h-F). This also works in C++, but C++ inheritance works fine without this method. Using this method with soapcpp2 alone using a manually-specified interface header file produces the specified type inheritance in the soapcpp2-generated WSDL and XML schema files as complexType extensions. The soapcpp2 tool warns if a derived type has multiple base types. At most one base type for a derived type may be specified. To illustrate this method, consider the following interface header file example for soapcpp2 based on \ref polymorph. This example declares `ns__Base` and `ns__Derived` structs and a service operation that takes a pointer to a `ns__Base` value and returns a `ns__Base` value: ~~~{.cpp} // Contents of file "derived.h" struct ns__Base { char *name; [ struct ns__Derived *ns__Derived; ] // points to derived type when non-NULL }; struct ns__Derived { char *name; int num; }; int ns__webmethod(struct ns__Base *in, struct ns__webmethodResponse { struct ns__Base *out; } *result); ~~~ The `ns__Base` struct includes the special member `ns__Derived` that points to a `ns__Derived` value. This special member must be: - a transient member (i.e. non-serializable) by placing the declaration within `[` and `]`, and - the member name must match the type name (to be more precise, at least the initial part of the member name must match the type name as in the example `ns__Derived_` works too). To serialize the `ns__Base` value make sure to set the `ns__Derived` member to NULL. The soapcpp2-generated `soap_default_ns__Base()` function default initializes a given `ns__Base` value for you. To serialize the `ns__Derived` value make sure to set the `ns__Derived` member to point to the address of a `ns__Derived` value. This is easy by calling `soap_new_ns__Derived()` that allocates and default initializes a `ns__Derived` value, whose address is returned by this function. When multiple derived types are declared for a base type, all immediately derived struct types are added as transient pointer members to the base type. Indirectly derived types do not need to be added to the base type as members, but it is perfectly fine to do so. To properly declare derived types, make sure to include all base type members in the derived type. In our example the `ns__Derived` struct contains the `ns__Base` struct members (except for the `ns__Derived` member) and adds additional members as extensions. Below is an example client application based on the example in Section \ref polymorph that creates a `ns__Derived` value that is passed as the input parameter of the `ns__webmethod` service operation: ~~~{.cpp} // CLIENT #include "soapH.h" int main() { struct soap soap; soap_init(&soap); struct ns__Base obj; struct ns__Derived der; struct ns__webmethodResponse r; soap_default_ns__Base(&soap, &obj); soap_default_ns__Derived(&soap, &der); obj.ns__Derived = &der; der.name = "X"; der.num = 3; if (soap_call_ns__webmethod(&soap, endpoint, NULL, &obj, &r) == SOAP_OK) { if (r->out && r.out->ns__Derived) printf("print(): Derived class instance %s %d\n", r.out->ns__Derived->name, r.out->ns__Derived->num); else if (r->out) printf("print(): Base class instance %s\n", r.out->name); } soap_destroy(&soap); soap_end(&soap); soap_done(&soap); } ~~~ The following example server application copies a class instance (`ns__Base` or `ns__Derived` class) from the input to the output parameter: ~~~{.cpp} // SERVER #include "soapH.h" int main() { struct soap soap; soap_init(&soap); soap_serve(&soap); soap_destroy(&soap); soap_end(&soap); soap_done(&soap); } int ns__webmethod(struct soap *soap, struct ns__Base *in, struct ns__webmethodResponse *result) { if (in && in->ns__Derived) printf("print(): Derived class instance %s %d\n", in->ns__Derived->name, in->ns__Derived->num); else if (in) printf("print(): ns__Base class instance %s\n", in->name); result.out = in; return SOAP_OK; } ~~~ The following messages are produced by the client and server applications: SERVER: print(): Derived class instance X 3 CLIENT: print(): Derived class instance X 3 This shows that the `Derived` class instance kept its identity as it passed through the server. Another way to serialize polymorphic values in XML that are indicated with `xsi:type` attributes is with `void*` members that point to a serializable value. See \ref void for details. Deeper levels of simulated inheritance are possible, for example: ~~~{.cpp} // Contents of file "derived.h" struct ns__Base { char *name; [ struct ns__Derived *ns__Derived; ] // points to derived type when non-NULL }; struct ns__Derived { char *name; int num; [ struct ns__Derived2 *ns__Derived2; ] // points to derived type when non-NULL }; struct ns__Derived2 { char *name; int num; char *value; }; int ns__webmethod(struct ns__Base *in, struct ns__webmethodResponse { struct ns__Base *out; } *result); ~~~ This requires two pointer traversals from the base type `ns__Base` via `ns__Derived` to reach `ns__Derived2`: ~~~{.cpp} int ns__webmethod(struct soap *soap, struct ns__Base *in, struct ns__webmethodResponse *result) { if (in && in->ns__Derived && in->ns__Derived->ns__Derived2) printf("print(): Derived2 class instance %s %d %s\n", in->ns__Derived->ns__Derived2->name, in->ns__Derived->ns__Derived2->num, in->ns__Derived->ns__Derived2->value); else if (in && in->ns__Derived) printf("print(): Derived class instance %s %d\n", in->ns__Derived->name, in->ns__Derived->num); else if (in) printf("print(): ns__Base class instance %s\n", in->name); result.out = in; return SOAP_OK; } ~~~ 🔝 [Back to table of contents](#) ### How to declare XML attributes {#attributes} The gSOAP tools support the full XML schema standards, so XML attributes are nothing special. However, with respect to SOAP standards it is important to note that SOAP RPC/literal and SOAP document/literal styles support XML attributes in SOAP messages, but SOAP RPC with "Section 5" encoding does not support XML attributes other than some built-in attributes. The idea behind SOAP RPC Section 5 encoding was to keep SOAP as simple as possible as a limited subset of XML, while offering advantages for cross-language interoperability of data types, including data structure graph serialization with multi-referenced data. Attributes are primitive XSD types, such as strings, enumerations, boolean, and numeric types. To declare an XML attribute in a struct or class, the qualifier `@` is used with the type of the attribute. The type must be primitive type or a pointer to a primitive type, including enumerations and `::xsd__base64Binary` and `::xsd__hexBinary` structures. For example: ~~~{.cpp} typedef char *xsd__string; typedef bool *xsd__boolean; enum ns__state { _0, _1, _2 }; struct ns__myStruct { @ std::string *type; @ bool flag = false; @ enum ns__state state = _2; struct ns__myStruct *next; }; ~~~ The `@` qualifier declares an XML attribute for the `type`, `flag`, and `state` members. Default values can be associated with any member that has a primitive type in a struct or class, as is illustrated in this example. The default values are used when the receiving message does not contain the corresponding values. Pointers make the members optional. So `type` is an optional attribute. Because a service operation request and response message is essentially a struct, XML attributes can also be associated with method requests and responses. For example: ~~~{.cpp} int ns__webmethod(@ char *ns__name, ...); ~~~ Attributes can also be attached to the dynamic arrays, binary types, and wrapper classes and structs of primitive types. Wrapper classes are described in Section \ref primclass . For example: ~~~{.cpp} class xsd__string { public: char * __item; @ bool flag; }; ~~~ and ~~~{.cpp} class xsd__base64Binary { public: unsigned char *__ptr; int __size; @ bool flag; }; ~~~ The attribute declarations must be placed after the special `__item`, `__ptr`, and `__size` members. For additional details, see the [C and C++ XML Data Bindings](../../databinding/html/index.html) documentation. 🔝 [Back to table of contents](#) ### How to use QName attributes and elements {#qname} An element or attribute with type QName (Qualified Name) contains a namespace prefix and a local name. We can explicitly declare a QName as a string type with `typedef char *xsd__QName` and the serializer recognizes the `QName` type as a special type that requires QName normalization. A built-in QName type `_QName` is recognized by soapcpp2, which is a `char*` type with QName content. QName normalization by the deserializer is applied to convert the prefix in the inbound XML message to the corresponding prefix defined in the XML namespace table, which means that the QName string is always received in normalized form. For example: ~~~{.cpp} //gsoap ns schema namespace: urn:example typedef char *xsd__QName; struct ns__myStruct { xsd__QName elt = "ns:xyz"; // QName element with default value "ns:xyz" @ xsd__QName att = "ns:abc"; // QName attribute with default value "ns:abc" }; ~~~ When the `elt` and `att` members are serialized, their string contents are just output. When the members are deserialized however, the deserializer converts the prefix in the parsed QName to the prefix defined in the namespace table that corresponds to the same namespace URI. For example, suppose that the inbound XML message contains `x:def`. The prefix `x` matches the namespace URI `urn:example` of prefix `ns` as declared by the `//gsoap ns schema namespace: urn:example` directive, which populates the namespace table `ns.nsmap` generated by soapcpp2. Therefore, the `x:def` QName value is converted to `ns:def` and saved in the `elt` member of `ns__myStruct`. If the namespace URI used in the inbound XML message is not in the namespace table, for example when `x:def` is parsed, then `x:def` is converted to `"URI":def` where `"URI"` is the namespace URI bound to `x`, which is `"urn:x"` in this case. This value `"urn:x":def`is saved in the `elt` member of `ns__myStruct`. For additional details, see the [C and C++ XML Data Bindings](../../databinding/html/index.html) documentation. 🔝 [Back to table of contents](#) ## Union serialization {#union} A union is only serialized if the union is used within a struct or class declaration that includes an `int __union` member that acts as a selector (also called discriminant) for the union members. The selector stores run-time usage information about the union member that is activated. A union within a struct or class with a selector member represents `xsd:choice` XML schema component. For example: ~~~{.cpp} struct ns__PO { ... // members of ns__PO }; struct ns__Invoice { ... // members of ns__Invoice }; union ns__PO_or_Invoice { struct ns__PO po; struct ns__Invoice invoice; }; struct ns__composite { char *name; int __union; union ns__PO_or_Invoice value; }; ~~~ The `union ns__PO_or_Invoice` appears as a `xsd:choice` in the generated XML schema:
~~~{.xml} ~~~
The union name should be qualified, as shown in the example, to ensure correct serialization when the XML schemas is declared with `elementFormDefault="qualified"`, with `//gsoap ns schema elementForm: qualified`. The `int __union` member selector's values are generated by the soapcpp2 tool. Each union member name has a selector value defined by: ~~~{.cpp} SOAP_UNION_unionname_fieldname ~~~ These selector values enumerate the union members. The special value 0 (or any negative value) can be assigned to omit the serialization of the union altogether, but only if explicitly allowed by validation rules, which requires `minOccurs="0"` for the `xsd:choice`: ~~~{.cpp} struct ns__composite { char *name; int __union 0; // declares union ns__PO_or_Invoice value; }; ~~~ This way we can treat the union as an optional data item by setting `__union = 0`. Since 2.7.16 it is also possible to use a '`$`' as a special marker to annotate a selector member that must be of type `int` and the member name can be chosen arbitrarily: ~~~{.cpp} struct ns__composite { char *name; $ int select 0; // declares union ns__PO_or_Invoice value; }; ~~~ The following example shows how the `struct ns__composite` instance is initialized for serialization using the above declaration: ~~~{.cpp} struct ns__composite data; data.name = "..."; data.select = SOAP_UNION_ns__PO_or_Invoice_po; // select ns__PO_or_Invoice::po union member data.value.po.number = ...; // populate the PO ~~~ While the gSOAP serializers are designed to be robust, failing to set the selector to a valid union member can lead to a crash of the serializer, because it will attempt to serialize an invalid union member. The deserializer of a union type sets the selector value to the currently active union member that was deserialized. The selector will be set to a non-positive value (0 or -1) when no union member was deserialized, if permitted by the validator, where -1 indicates that a member was required by validation rules, if the validator was non-strict. Strict validation enabled with `#SOAP_XML_STRICT` results in a validation fault in this case. When more than one union is used in a struct or class, the `__union` selectors should use `$` to identify them and named to avoid name clashes, for example: ~~~{.cpp} struct ns__composite { char *name; $ int sel_value; // = SOAP_UNION_ns__PO_or_Invoice_[po|invoice] union ns__PO_or_Invoice value; $ int sel_data; // = SOAP_UNION_ns__Email_or_Fax_[email|fax] union ns__Email_or_Fax data; }; ~~~ For additional details, see the [C and C++ XML Data Bindings](../../databinding/html/index.html) documentation. 🔝 [Back to table of contents](#) ## Pointer type serialization {#pointer} Basically, the serialization of a pointer amounts to the serialization of the data pointed to. However, if more than one pointer points to a node in a data structure to serialize, the node is either duplicated in the serialized output meaning the data is serialized as a tree, or the node is output only once in the serialized output meaning that the data is serialized as a graph. The latter is referred to as multi-reference encoding in SOAP 1.1/1.2 RPC encoding style. This style ensures that data structures maintain their structural integrity when transmitted, as intended by the true meaning of serialization. The `#SOAP_XML_GRAPH` runtime flag can be used with plain non-SOAP XML to achieve the same. To achieve this, the gSOAP serializers for SOAP RPC encoding and the `#SOAP_XML_GRAPH` flag check for multi-referenced data in the data structure to serialize, i.e. the data nodes that are co-referenced by other nodes, by adding id-ref/href attributes to the XML output that refer to the co-referenced data. The soapcpp2 tool generates serializers that perform this check automatically on C/C++ pointers and smart pointers, such as `std::shared_ptr`. Furthermore, the soapcpp2 tool generates serializers that prevent infinite serialization when a cyclic data structure is serialized as a tree, by breaking the cycles, when using the SOAP document/literal style or when `#SOAP_XML_TREE` is enabled with the SOAP RPC encoding style. For additional details on the use of C/C++ pointers and smart pointers, see the [C and C++ XML Data Bindings](../../databinding/html/index.html) documentation. 🔝 [Back to table of contents](#) ### Multi-referenced data serialization {#multiref} A node in the data structure that is pointed to by more than one pointer is serialized as multi-reference data when the SOAP RPC encoding style is used or when `#SOAP_XML_GRAPH` is enabled. This means that co-referenced data is identified in XML with a unique `id` attribute. References in XML are made with `href` (SOAP 1.1 RPC encoding), `SOAP-ENC:ref` (SOAP 1.2 RPC encoding), or `ref` (`#SOAP_XML_GRAPH`) attributes to refer to the co-referenced data. See Section \ref flags on options to control the serialization of multi-reference data. To turn multi-ref off, use `#SOAP_XML_TREE` to process plain tree-based XML. To completely eliminate multi-ref serialization use the `#WITH_NOIDREF` compile-time flag with all source code (including `gsoap/stdsoap2.c` and `gsoap/stdsoap2.cpp`) to permanently disable id-href processing. Consider for example the following a linked list data structure: ~~~{.cpp} typedef char *xsd__string; struct ns__list { xsd__string value; struct ns__list *next; }; ~~~ Suppose a cyclic linked list is created. The first node contains the value "abc" and points to a node with value "def" which in turn points to the first node. This is encoded as:
~~~{.xml} abc def ~~~
In case multi-referenced data is received that "does not fit in a pointer-based structure", the data is copied. For example, the following two structs are similar, except that the first uses pointer-based members while the other uses non-pointer-based members: ~~~{.cpp} typedef long xsd__int; struct ns__record { xsd__int *a; xsd__int *b; } P; struct ns__record { xsd__int a; xsd__int b; } R; int main() { P.a = &n; P.b = &n; ... // } ~~~ Since both `a` and `b` members of `P` point to the same integer, the serialization of `P` produces a multi-reference in SOAP 1.1 RPC encoding:
~~~{.xml} 123 ~~~
The deserialization of the content in the `R` data structure that does not use pointers to integers results in a copy of each multi-reference integer. Note that the two structs resemble the same XML data type because the trailing underscore will be ignored in XML encoding and decoding. 🔝 [Back to table of contents](#) ### NULL pointers and nil elements {#null} A NULL pointer is not serialized, unless the pointer member of a struct or class is declared in the interface header file as nillable with `nullptr` or in the unlikely case the pointer itself is pointed to by another pointer (but see Section \ref flags to control the serialization of NULLs), for example: ~~~{.cpp} struct X { int *p; int **q; int *r nullptr 1; } ~~~ The types section of a WSDL description contains information on the "nillability" of data, which is declared as `nullptr` members where the `1` indicates that the member is required (`minOccurs` and `maxOccurs` are 1 set with `1:1` or simply `1`). Suppose pointer `q` points to pointer `p` and suppose `p` and `r` are NULL. In that case the `X` struct is serialized with `#SOAP_XML_GRAPH` as:
~~~{.xml}

~~~

The deserializer reconstructs the struct `X` from this form of XML, thereby preserving the integrity of the data structure serialized. When the deserializer encounters an XML element that has a `xsi:nil="true"` attribute but the corresponding C/C++ data is not a pointer or reference, the deserializer will terminate with a `#SOAP_NULL` fault when the `#SOAP_XML_STRICT` flag is set. 🔝 [Back to table of contents](#) ## Void pointer serialization {#void} Void pointers (`void*`) cannot be serialized in XML because the type of data referred to is untyped. To enable the serialization of void pointers that are members of structs and classes, you can insert a `int __type` member right before the void pointer member. The `int __type` member contains run time information on the type of the data pointed to by `void*` member in a struct/class to enable the serialization of this data. The `int __type` member is set to a `SOAP_TYPE_T` value, where `T` is the name of a type. The soapcpp2 tool generates the `SOAP_TYPE_T` definitions in `soapH.h` and uses them internally to uniquely identify the type of each object. The type naming conventions outlined in Section \ref serialize are used to determine the type name for `T`. Values serialized in XML with this approach always carry the `xsi:type` attribute in XML to indicate the type of content serialized. Here is an example to illustrate the serialization of a `void*` member in a struct/class: ~~~{.cpp} struct ns__record { int __type; // the SOAP_TYPE_T pointed to by val void *val; // serialize any type in element }; ~~~ The `__type` integer can be set to 0 at run time to omit the serialization of the void pointer member. The following example illustrates the initialization of `myStruct` with a void pointer to an int: ~~~{.cpp} struct ns__record S; int n = 123; S.val = (void*)&n; S.__type = SOAP_TYPE_int; ~~~ The serialized output of `S` contains the integer in its `val` element:
~~~{.xml} 123 ~~~
The deserializer for `ns__record` will automatically set the `__type` field and void pointer when deserializing the data, provided that the XML element `val` carries the `xsi:type` attribute from which it can determine the type. @note when serializing strings via a `void*` member, the `void*` pointer must directly point to the string value rather than indirectly as with all other types. For example: ~~~{.cpp} struct ns__record S; S.val = (void*)"Hello"; S.__type = SOAP_TYPE_string; ~~~ This is the case for all string-based types, including types defined with `typedef char*`. You may use an arbitrary suffix with the `__type` members to handle multiple void pointers in structs/classes. For example: ~~~{.cpp} struct ns__record { int __typeOfp; // the SOAP_TYPE_T pointed to by p void *p; // element

int __typeOfq; // the SOAP_TYPE_T pointed to by q void *q; // element }; ~~~ Because service method parameters are stored within structs, you can use `__type` and `void*` parameters to pass polymorphic arguments without having to define a C++ class hierarchy (Section \ref polymorph ), provided that `xsi:type` attributes are present in the XML elements. For example: ~~~{.cpp} typedef char *xsd__string; typedef int xsd__int; typedef float xsd__float; enum ns__status { on, off }; struct ns__widget { char *name; int part; }; int ns__webmethod(int __type, void *data, struct ns__webmethodResponse { int __type; void *return_; } *out); ~~~ This method has a polymorphic input parameter `data` and a polymorphic output parameter `return_`. The `__type` parameters can be one of `SOAP_TYPE_xsd__string`, `SOAP_TYPE_xsd__int`, `SOAP_TYPE_xsd__float`, `SOAP_TYPE_ns__status`, or `SOAP_TYPE_ns__widget`. The WSDL and XSD files produced by the soapcpp2 tool declare the `void*` polymorphic members as `xsd:anyType` elements. To declare a wrapper struct/class for `void*` pointers allows us to reuse this mechanism when we use `__self` as a member name that refers to the current XML element tag name: ~~~{.cpp} struct __any { int __type; // the SOAP_TYPE_T pointed to by __self void *__self; // serialize any type of content of the current element }; struct ns__record { __any val; }; ~~~ The following example illustrates the initialization of `__ns__record` with a void pointer to an int: ~~~{.cpp} struct ns__record S; int n = 123; S.val.__item = (void*)&n; S.val.__type = SOAP_TYPE_int; ~~~ The serialized output of `S` contains the integer:

~~~{.xml} 123 ~~~
🔝 [Back to table of contents](#) ## Fixed-size array serialization {#fixedarrays} Fixed size arrays are serialized as repetitions of `item` elements with the array values in XML. Multi-dimensional fixed size arrays are serialized as nested `item` elements, where the outer elements are arrays. The serialization of fixed-size arrays supports the SOAP RPC encoding multi-dimensional array format as well as partially transmitted and sparse array formats standardized in SOAP 1.1 and 1.2. For example: ~~~{.cpp} // Contents of file "fixed.h": struct Example { float a[3]; }; ~~~ This specifies a fixed-size array part of the `struct Example`. The serialized output of array `a` is:
Any deserialized items of an array that do not fit in the fixed size array, i.e. are out of bounds, are ignored by the deserializer when the `#SOAP_C_NOIOB` flag is set, otherwise `#SOAP_IOB` errors will be generated by the deserializer. 🔝 [Back to table of contents](#) ## Dynamic array serialization {#dynarray} Dynamic arrays are much more flexible than fixed-size arrays. Dynamic arrays declared in the interface header file for soapcpp2 are a special struct or class or are part of a struct or class with a member pointing to an array of elements and a member that stores the size of the array. Dynamic array allocations are easy using the soapcpp-generated `soap_new_T` functions for type `T`. This function is used to allocate an array of values which can then be assigned to the pointer member of the struct/class that stores the array pointer with its size. To facilitate SOAP RPC encoding, SOAP-encoded arrays require special treatment. SOAP-encoded arrays are single- or multi-dimensional arrays with bounds that appear in XML. These arrays may also have offsets that differ from zero. The intent of SOAP-encoded arrays is to replicate multi-dimensional arrays commonly found in programming languages. However, XML also provides a simple way to represent a sequence of values with a sequence of XML elements. This differs from SOAP-encoded arrays in that SOAP-encoded arrays are elements with nested `item` elements with values, though SOAP deserializers may ignore the name of these elements when parsing XML as stated in the SOAP specifications. Both SOAP-encoded arrays and sequences of XML elements are supported in gSOAP, using dynamic arrays and containers. The basics will be described next. For additional details, see the [C and C++ XML Data Bindings](../../databinding/html/index.html) documentation. 🔝 [Back to table of contents](#) ### SOAP-encoded array bounds {#arraybounds} SOAP-encoded arrays use the `SOAP-ENC:Array` attribute in XML to identify the array and the `SOAP-ENC:arrayType` attribute to identify the array dimensionality and its size. As a security measure to avoid denial of service attacks based on sending a huge array size value using the `SOAP-ENC:arrayType` attribute, requiring the allocation of large chunks of memory, the total number of array elements set by the `SOAP-ENC:arrayType` attribute cannot exceed `#SOAP_MAXARRAYSIZE`, which is set to 100000 by default. This limit is not a hard limit on the number of array elements, but rather to avoid pre-allocating large arrays as stated. The hard limit on the number of array elements received is `::soap::maxoccurs` which is set to `#SOAP_MAXOCCURS` by default. By contrast, the `#SOAP_MAXARRAYSIZE` limit only negatively affects multi-dimensional arrays because the dimensionality of the receiving array may be lost when the number of elements exceeds 100000. One-dimensional arrays are not affected and populated after this limit by simply deserializing the array elements received. 🔝 [Back to table of contents](#) ### One-dimensional dynamic SOAP-encoded arrays {#oned} A special form of struct or class is used to define one-dimensional dynamic SOAP-encoded arrays in an interface header file for soapcpp2. Each array has a pointer variable and a member that records the number of elements the pointer points to in memory. The general form of the struct or class declaration that contains a one-dimensional dynamic SOAP-encoded array is: ~~~{.cpp} struct array_name { Type *__ptr; // pointer to array of elements in memory int __size; // number of elements pointed to int __offset; // optional SOAP 1.1 array offset ... // anything that follows here will be ignored }; ~~~ where the `array_name` must be a non-qualified name and `Type` is the type for the elements of the array. The `__ptr` member points to the array values and `__size` is the array size. The `__offset` member specifies an optional array offset, when nonzero, see Section \ref onedoffset. If the `array_name` is qualified with a namespace prefix then the array is not a SOAP-encoded array but rather represents a sequence of XML elements, see Section \ref list. The soapcpp2-generated deserializer of a one-dimensional dynamic array can deserialize partially transmitted and/or SOAP-encoded sparse arrays, and even multi-dimensional arrays which will be collapsed into a one-dimensional array with row-major ordering. @warning SOAP 1.2 does not support partially transmitted arrays and the `__offset` member of a dynamic array is ignored. 🔝 [Back to table of contents](#) ### One-dimensional dynamic SOAP-encoded arrays with non-zero offsets {#onedoffset} The declaration of a dynamic array as described in Section \ref oned may include an `int __offset` member. When set to an integer value, the serializer of the dynamic array will use this member as the start index of the array and the SOAP-encoded array offset attribute `SOAP-ENC:offset` will appear in the XML message. Note that array offsets is a SOAP 1.1 specific feature which is not supported in SOAP 1.2. For example, the following header file declares a numeric `Vector` class, which is a dynamic array of floating point values with an index that starts at 1: ~~~{.cpp} // Contents of file "vector.h": class Vector { public: float *__ptr; int __size; int __offset; Vector(); Vector(struct soap *, int n); float& operator[](int i); struct soap *soap; }; ~~~ The implementations of the `Vector` methods are: ~~~{.cpp} Vector::Vector() { this->soap_default(NULL); } Vector::Vector(struct soap *soap, int n) { this->soap = soap; __ptr = soap_new_float(soap, n); __size = n; __offset = 1; } float& Vector::operator[](int i) { return __ptr[i - __offset]; } ~~~ An example program fragment that serializes a vector of 3 elements: ~~~{.cpp} struct soap *soap = soap_new(); Vector v(soap, 3); v[1] = 1.0; v[2] = 2.0; v[3] = 3.0; soap_write_Vector(soap, &v); soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~ The output is a partially transmitted array:
~~~{.xml} 1 2 3 ~~~
Note that `xsd:float[4]` is the type and shape of the encoded array, which starts at offset 1 and therefore the element at 0 is omitted. 🔝 [Back to table of contents](#) ### Nested one-dimensional dynamic SOAP-encoded arrays {#nested} One-dimensional SOAP-encoded dynamic arrays may be nested. For example, using `class Vector` declared in the previous section, `class Matrix` is declared: ~~~{.cpp} // Contents of file "matrix.h": class Matrix { public: Vector *__ptr; int __size; int __offset; Matrix(); Matrix(struct soap *soap, int n, int m); Vector& operator[](int i); struct soap *soap; }; ~~~ The Matrix type is essentially an array of pointers to arrays which make up the rows of a matrix. The serialization of the two-dimensional dynamic array in is nested form in XML. 🔝 [Back to table of contents](#) ### Multi-dimensional dynamic SOAP-encoded arrays {#multid} A special form of `struct` or `class` is used to define multi-dimensional dynamic SOAP-encoded arrays. Each array has a pointer variable and a member that records the number of elements per dimension. A `K`-dimensional array is declared as: ~~~{.cpp} struct array_name { Type *__ptr; // pointer to array of elements in memory int __size[K]; // number of elements per dimension int __offset[K]; // optional SOAP 1.1 array offset ... // anything that follows here will be ignored }; ~~~ where the `array_name` must be a non-qualified name and `Type` is the type for the elements of the array. The `__ptr` member points to the array values. The `__size` array specifies the number of array elements per dimension. The `__offset` array specifies an optional offset per dimension. For example, the following declaration specifies a matrix class: ~~~{.cpp} class Matrix { public: float *__ptr; int __size[2]; int __offset[2]; }; ~~~ By contrast to the matrix class of Section \ref nested that defines a matrix as an array of pointers to matrix rows, this class has one pointer to a matrix stored in row-major order. The size of the matrix is determined by the `__size` member: `__size[0]` holds the number of rows and `__size[1]` holds the number of columns of the matrix. Likewise, `__offset[0]` is the row offset and `__offset[1]` is the columns offset. @warning SOAP 1.2 does not support partially transmitted arrays and the `__offset` member of a dynamic array is ignored. 🔝 [Back to table of contents](#) ### Non-SOAP dynamic arrays {#list} An array is serialized as a sequence of XML elements. By contrast, a SOAP-encoded array is serialized as an element with a sequence of sub-elements, whose tag names are irrelevant to the SOAP processor, see \ref oned. An array is declared in an interface header file for soapcpp2 as a struct or class with a name that is qualified with a namespace prefix. There are two forms. The first form is similar to the SOAP-encoded array declaration that wraps the `__ptr` and `__size` members: ~~~{.cpp} struct prefix__array_name { Type *__ptr; // pointer to array of elements in memory int __size; // number of elements pointed to ... // anything that follows here will be ignored }; ~~~ The second form is more generic, because the array can be declared anywhere in the struct or class and multiple arrays can be used as members, each with a `__size` member (`__sizeName` is also allowed) that precedes a pointer member: ~~~{.cpp} struct prefix__array_name { ... // other members that are serialized int __size_of_array1; // number of elements pointed to Type1 *array1; // pointer to array of elements in memory ... // other members that are serialized int __size_of_array1; // number of elements pointed to Type2 *array2; // pointer to array of elements in memory ... // other members that are serialized }; ~~~ The `__size` member should be an `int` type and cannot be a `size_t` type or other integer type. For example, we define a Map structure that contains a sequence of key-val pairs: ~~~{.cpp} struct ns__Map { int __size; // number of pairs struct ns__Pair { char *key; char *val; } *pair; // array of pairs }; ~~~ Since 2.7.16 it is also possible to use a '`$`' as a special marker to annotate a size member instead of requiring these members to start with `__size`: ~~~{.cpp} struct ns__Map { $ int size; // number of pairs struct ns__Pair { char *key; char *val; } *pair; // array of pairs }; ~~~ The array will be serialized in XML as a sequence of pairs:
~~~{.xml} Joe 555 77 1234 Susan 555 12 6725 Pete 555 99 4321 ~~~
Deserialization is less efficient compared to a SOAP-encoded array, because the size of the sequence is not part of the SOAP encoding. Buffering is used by the deserializer to collect the elements in memory. When the end of the list is reached, the buffered elements are copied to a newly allocated managed space on the heap for the dynamic array. Multiple arrays can be part of a struct or class. For example: ~~~{.cpp} struct ns__Contact { char *firstName; char *lastName; $ int nPhones; // number of Phones ULONG64 *phoneNumber; // array of phone numbers $ int nEmails; // number of emails char **emailAddress; // array of email addresses }; ~~~ The XML serialization of an example `ns__Contact` is:
~~~{.xml} Joe Smith 5551112222 5551234567 5552348901 Joe.Smith@mail.com Joe@Smith.com ~~~
For C++, a better alternative to arrays are containers, which are described next. 🔝 [Back to table of contents](#) ### STL containers {#templates} The STL containers `std::deque`, `std::list`, `std::set`, and `std::vector` are serializable in XML by the soapcpp2-generated serializers. In order to use containers in an interface header file for soapcpp2, import `stldeque.h`, `stllist.h`, `stlset.h`, or `stlvector.h` to enable `std::deque`, `std::list`, `std::set`, and `std::vector`, respectively. For example: ~~~{.cpp} #import "stlvector.h" class ns__myClass { public: std::vector number 1:10; // 1 to 10 numbers std::vector *name 2; // more than 2 names }; ~~~ The use of pointer members such as for `name` shown above is possible, but not required. Also `minOccurs : maxOccurs` and `minOccurs` length constraints can be specified as shown in the example above. The XML schema that corresponds to the `ns__myClass` type is:
~~~{.xml} ~~~
You can also implement your own containers. The containers must be class templates and should define a forward iterator type, and provide the following methods: * `void clear()` empty the container; * `iterator begin()` return iterator to beginning; * `const_iterator begin() const` return const iterator to beginning; * `iterator end()` return iterator to end; * `const_iterator end() const` return const iterator to end; * `size_t size()` return size; * `iterator insert(iterator pos, const_reference val)` insert element. The `iterator` should be a forward iterator with a dereference operator to access the container's elements, it must be comparable (equal/unequal), and be pre-incrementable (`++it`). The const iterator is used by its soapcpp2-generated serializer to send a sequence of XML element values. The `insert` method is used to populate a container with `Container::iterator i = container.insert(container.end(), val)`. Here is in example container template class: ~~~{.cpp} // simple_vector.h template class simple_vector { public: typedef T value_type; typedef value_type * pointer; typedef const value_type * const_pointer; typedef value_type & reference; typedef const value_type & const_reference; typedef pointer iterator; typedef const_pointer const_iterator; protected: iterator head; iterator tail; size_t capacity; public: simple_vector() { head = tail = NULL; } simple_vector(const simple_vector& v) { operator=(v); } ~simple_vector() { if (head) delete[] head; } void clear() { tail = head; } /* the member functions below are required for serialization of templates */ iterator begin() { return head; } const_iterator begin() const { return head; } iterator end() { return tail; } const_iterator end() const { return tail; } size_t size() const { return tail - head; } iterator insert(iterator pos, const_reference val) { if (!head) head = tail = new value_type[capacity = 1]; else if (tail >= head + capacity) { iterator i = head; iterator j = new value_type[capacity *= 2]; iterator k = j; while (i < tail) *k++ = *i++; if (pos) pos = j + (pos - head); tail = j + (tail - head); delete[] head; head = j; } if (pos && pos >= head && pos < tail) { iterator i = tail; iterator j = i - 1; while (j != pos) *i-- = *j--; *pos = val; } else { pos = tail; *tail++ = val; } return pos; } simple_vector& operator=(const simple_vector& v) { head = tail = NULL; capacity = v.capacity; if (v.head) { head = tail = new value_type[capacity]; iterator i = v.head; while (i != v.tail) *tail++ = *i++; } return *this; } }; ~~~ To enable the container, we add the following two lines to the interface header file for soapcpp2: ~~~{.cpp} #include "simpleVector.h" template class simpleVector; ~~~ The container class itself should not be defined in the interface header file, only the template declaration suffices for soapcpp2 to generate serializers. Recall that the `#include` directives are not executed by soapcpp2 but simply passed on to the generated source code. This include specifies in the generated source code where the container is actually defined. 🔝 [Back to table of contents](#) ### Polymorphic dynamic arrays and lists {#polymorphicarrays} Polymorphic arrays, that is, arrays of values of any type, can be serialized in XML when declared as an array of pointers to a base class. For example: ~~~{.cpp} class ns__Object { public: ... // members of ns__Object }; class ns__Data : public ns__Object { public: ... // members of ns__Data }; class ArrayOfObject { public: ns__Object **__ptr; // pointer to array of pointers to base or derived objects int __size; // size of the array }; class ns__Objects { public: std::vector objects; // vector of base or derived objects }; ~~~ The pointers in the array can point to the `ns__Object` base instances or `ns__Data` derived instances, which will be serialized accordingly in XML. Derived instances are indicated by `xsi:type` attribute in XML with the qualified name of the class, to distinguish derived instances from the base instances. Without this attribute the deserializer will not instantiate the derived instance but a base instance since there is no identifying information to distinguish the XML forms except for the `xsi:type` attribute. Since we cannot use dynamic binding to support polymorphism in C, another mechanism we can use is void pointers . Here is an example of a polymorphic SOAP-encoded array `ArrayOfObject` and a non-SOAP dynamic array `ns__Objects` that hold values of any serializable type: ~~~{.cpp} struct __wrapper { int __type; // identify the type below by SOAP_TYPE_T void *__item; // pointer to data of type T }; struct ArrayOfObject { struct __wrapper *__ptr; // pointer to array int __size; // size of the array }; struct ns__Objects { int __size; // size of the array struct __wrapper *objects; // pointer to array }; ~~~ This example uses an "invisible" type `__wrapper` and member `__array`, which start with a double underscore. These names are never visible in serialized XML. The `__type` member of `__wrapper` is a `SOAP_TYPE_T` value that identifies the type `T` that `__item` points to, see Section \ref void. 🔝 [Back to table of contents](#) ### How to change the tag names of array item elements {#arrayitems} The default XML element tag name for array elements is `item`, which can be changed. The `__ptr` member in a struct or class of a dynamic array may have an optional suffix part that specifies the name of the element tag in XML. That is, the suffix is part of the `__ptr` member name: ~~~{.cpp} Type *__ptrarray_elt_name ~~~ Consider for example: ~~~{.cpp} struct ArrayOfstring { char* *__ptrstring; int __size; }; ~~~ The array is serialized as:
~~~{.xml} Hello World ~~~
SOAP 1.1/1.2 does not mandate a specific tag name for SOAP-encoded array elements and the soapcpp2-generated serializers will ignore the name used to itemize SOAP-encoded array values. 🔝 [Back to table of contents](#) ## base64Binary serialization {#base64binary} The `base64Binary` XSD type is introduced in an interface header file for soapcpp2 using a struct or class that contains an array of `unsigned char` values: ~~~{.cpp} struct xsd__base64Binary { unsigned char *__ptr; int __size; }; ~~~ The advantage of this struct or class is the ability to serializer raw binary data from memory, since the soapcpp2-generated serializer converts the binary data to/from base64 in XML. To introduce a new XML schema type derived from `base64Binary` use the same struct or class structure, but with another name. For example: ~~~{.cpp} struct ns__binary { unsigned char *__ptr; int __size; }; ~~~ The resulting XML schema type is:
~~~{.xml} ~~~
🔝 [Back to table of contents](#) ## hexBinary serialization {#hexbinary} The `base64Binary` XSD type is introduced in an interface header file for soapcpp2 using a struct or class that contains an array of `unsigned char` values: ~~~{.cpp} struct xsd__hexBinary { unsigned char *__ptr; int __size; }; ~~~ The advantage of this struct or class is the ability to serializer raw binary data from memory, since the soapcpp2-generated serializer converts the binary data to/from hexadecimal in XML. If a binary type such as `xsd__base64Binary` is already defined, then we can simply use a `typedef` to introduce the hex variant: ~~~{.cpp} class xsd__base64Binary { public: unsigned char *__ptr; int __size; }; typedef xsd__base64Binary xsd__hexBinary; // serializes into hex content ~~~ This lets soapcpp2 generate `xsd:base64Binary` and `xsd:hexBinary` serializers. 🔝 [Back to table of contents](#) ## SOAP RPC encoded versus document/literal style {#literal} SOAP has several styles: * SOAP RPC encoding uses XML that is restricted to SOAP structures to ensure programming-language interoperability. Not allowed are values serialized as XML attributes, arrays should be serialized as SOAP-encoded arrays instead of XML element repetitions (i.e. `xsd:sequence maxOccurs="unbounded"` is not allowed), and `xsd:choice` components are not allowed. Multi-referenced elements are used to serialize data structure graphs. Because additional SOAP-encoding specific attributes are present that are not defined in the XML schema (of the WSDL), strict XML schema validators may reject SOAP-encoded content. The SOAP Body contains at most one service operation request element or at most one service operation response element and the encoding style is indicated with the `SOAP-ENV:encodingStyle="..."` attribute in the SOAP Body or one or more of its sub-elements. This style is specified for the entire service declared under namespace prefix `ns` with: ~~~{.cpp} //gsoap ns service style: rpc //gsoap ns service encoding: encoded ~~~ * SOAP document/literal uses XML constrained to the XML schema that defines the XML content. The serialization of tree-based data structures is accurate in XML. The serialization of digraph-shaped data structures results in the duplication of data nodes that are co-references. Cyclic data structures cannot be accurately serialized, but you can use `#SOAP_XML_GRAPH` to force the use of id-ref to accurately serialize digraphs and cyclic data structures. The SOAP Body may contain any number of XML elements, as if the SOAP Body is the root of an XML document. No `SOAP-ENV:encodingStyle="..."` attribute should appear in literal content. This style is specified for the entire service declared under namespace prefix `ns` with: ~~~{.cpp} //gsoap ns service style: document //gsoap ns service encoding: literal ~~~ * SOAP RPC literal also uses XML constrained to the XML schema that defines the XML content. The difference with document/literal is that the SOAP Body contains at most one service operation request element or at most one service operation response element. No `SOAP-ENV:encodingStyle="..."` attribute should appear in literal content. This style is specified for the entire service declared under namespace prefix `ns` with: ~~~{.cpp} //gsoap ns service style: rpc //gsoap ns service encoding: literal ~~~ Besides `//gsoap ns service style` and `//gsoap ns service encoding` there are also the service operation specific versions `//gsoap ns service method-style`, `//gsoap ns service method-response-style`, `//gsoap ns service method-encoding`, and `//gsoap ns service method-response-encoding` that explicitly specify SOAP RPC encoded, document/literal, or RPC literal style messages for the indicated service operation methods. To enable SOAP RPC encoding for a particular service operation, use: ~~~{.cpp} //gsoap ns service method-style: webmethod rpc //gsoap ns service method-encoding: webmethod encoded int ns__webmethod(...) ~~~ To enable SOAP RPC encoding for a particular service operation response, use: ~~~{.cpp} //gsoap ns service method-response-style: webmethod rpc //gsoap ns service method-response-encoding: webmethod encoded int ns__webmethod(...) ~~~ Likewise, you can specify document/literal and RPC literal messages. The default style is document/literal, unless `soapcpp2 -e` option `-e` is used to set SOAP RPC encoding by default. For the `style` directives you can specify `rpc` or `document`. For the `encoding` directives you can specify `literal`, `encoded`, or even a custom URI that indicates some custom or proprietary encoding format in XML which will not interoperate with SOAP processors that are not compatible with the specified encoding format. See also Section \ref directives. See also [C and C++ XML data bindings](../../databinding/html/index.html) documentation for differences in XML serialization when using the SOAP RPC encoded and document/literal messaging styles. 🔝 [Back to table of contents](#) ### Serializing mixed content with literal XML strings {#literal2} XML is stored in "literal" XML strings which are the built-in `_XML` type that is a regular `char*` string or you can declare a wide character string in an interface header file for soapcpp2 as follows: ~~~{.cpp} typedef wchar_t *XML; ~~~ To declare a C++ `std::string` literal XML type: ~~~{.cpp} typedef std::string XML; ~~~ Or use a wide character string: ~~~{.cpp} typedef std::wstring XML; ~~~ To use both at the same time: ~~~{.cpp} typedef std::string XML; typedef std::wstring XML_; ~~~ The differences between the use of regular 8-bit strings versus wide character strings for XML documents are: * XML literal strings must hold UTF-8 XML content. * Wide character XML literal strings are converted to and from UTF-8. 🔝 [Back to table of contents](#) # XML validation {#validation} Some XML validation constraints are not automatically verified unless explicitly set using the `#SOAP_XML_STRICT` flag. SOAP RPC encoding is an XML format that does not afford strict XML validation, because of the addition of SOAP-specific attributes and other small deviations that will be detected by an aggressive XML validator, leading the messaging failures. By toning XML validation down, it helps to improve SOAP RPC encoding interoperability. Strict validation constraints are enabled with the `#SOAP_XML_STRICT` mode flag set, e.g. with `soap_set_imode(soap, SOAP_XML_STRICT)` or `soap_new(SOAP_XML_STRICT)`, see Section \ref flags for the complete list of flags. The next sections describe the type of constraints validated when `#SOAP_XML_STRICT` is enabled and validation constraints are specified in the interface header file. Use compiler flag `#WITH_REPLACE_ILLEGAL_UTF8` to force strict UTF-8 text conversions, which replaces invalid UTF-8 with U+FFFD. See also [C and C++ XML data bindings](../../databinding/html/index.html) documentation for more details. 🔝 [Back to table of contents](#) ## Default values {#defaultvalues} Default values can be defined for optional elements and attributes, which means that the default value will be used when the element or attribute value is not present in the parsed XML. See also Section \ref default and examples in subsequent subsections below. Default values must be primitive types, integer, float, string, etc. or pointers to primitive types. Default values can be specified for struct and class members, as shown in the example below: ~~~{.cpp} struct ns__MyRecord { int n = 5; // optional element with default value 5 char *name = "none"; // optional element with default value "none" @ enum ns__color { RED, WHITE, BLUE } color = RED; // optional attribute with default value RED }; ~~~ Upon deserialization of absent data, these members will be set accordingly. When classes are instantiated with `soap_new_ClassName` the instance will be initialized with default values. See also [C and C++ XML data bindings](../../databinding/html/index.html) documentation for more details. 🔝 [Back to table of contents](#) ## Occurrence constraints {#occurrence} Occurrence constraints specify the minimum and/or maximum frequency or optionality of of attributes and elements. 🔝 [Back to table of contents](#) ### Elements with minOccurs and maxOccurs restrictions {#occurs} To force the validation of minOccurs and maxOccurs constraints the `#SOAP_XML_STRICT` input mode flag must be set. The minOccurs and maxOccurs constraints are specified for members of a struct and members of a class in a header file using the following syntax: ~~~{.cpp} Type membername nullptr minOccurs : maxOccurs = value; ~~~ The `nullptr` is optional and indicates that the member is nillable (gSOAP version 2.8.24 or greater), which means that when NULL an empty element with `xsi:nil="true"` is added in the serialized XML. The `minOccurs` and `maxOccurs` are optional values that must be integer literals. When `maxOccurs` is not specified then the colon can be omitted. When `minOccurs` is not specified it is assumed to be one (1) for non-pointer members that are elements and zero (0) for members that are pointers or are attributes (i.e. have a `@` qualifier). A default initialization `value` may be provided and is optional. A fixed initialization value can be specified with `==` (gSOAP version 2.8.48 or greater). For example ~~~{.cpp} struct ns__MyRecord { int n 0 = 5; // element with default value 5, minOccurs=0, maxOccurs=1 int m; // element with minOccurs=1 int *k nullptr 1; // element with minOccurs=1 and nillable=true int v == 2; // element with minOccurs=1 and fixed value 2 int __size 0:10; // sequence with minOccurs=0, maxOccurs=10 int *item; std::vector nums 2; // sequence with minOccurs=2, maxOccurs=unbounded }; struct arrayOfint { int *__ptr 1:100; // minOccurs=1, maxOccurs=100 int size; }; ~~~ See also [C and C++ XML data bindings](../../databinding/html/index.html) documentation for more details. 🔝 [Back to table of contents](#) ### Required and prohibited attributes {#requiredandprohibited} Similar to the minOccurs and maxOccurs annotations defined in the previous section, attributes in a struct or class can be annotated with occurrence constraints to make them optional (0), required (1), or prohibited (0:0). Default values can be assigned to optional attributes. For example ~~~{.cpp} struct ns__MyRecord { @ int m 1; // required attribute (occurs at least once) @ int n = 5; // optional attribute with default value 5 @ int o 0; // optional attribute (may or may not occur) @ int p 0:0; // prohibited attribute }; ~~~ Remember to set the `#SOAP_XML_STRICT` input mode flag to enable the validation of attribute occurrence constraints. See also [C and C++ XML data bindings](../../databinding/html/index.html) documentation for more details. 🔝 [Back to table of contents](#) ## Value constraints {#valueconstraints} Value constraints restrict the length of strings and the range of values of numeric types. 🔝 [Back to table of contents](#) ### Data length restrictions {#lengthconstraints} A schema simpleType is defined with a `typedef` by taking a base primitive to defined a derived simpleType. For example: ~~~{.cpp} typedef int time__seconds; ~~~ This defines the following schema type in `time.xsd`:
~~~{.xml} ~~~
A complexType with simpleContent is defined with a wrapper struct/class: ~~~{.cpp} struct time__date { char *__item; // some custom format date (restriction of string) @ enum time__zone { EST, GMT, ... } zone; } ~~~ This defines the following schema type in `time.xsd`:
~~~{.xml} ... ~~~
Data value length constraints of simpleTypes and complexTypes with simpleContent are defined as follows: ~~~{.cpp} typedef char *ns__string256 0:256; // simpleType restriction of string with max length 256 characters typedef char *ns__string10 10:10; // simpleType restriction of string with length of 10 characters typedef std::string *ns__string8 8; // simpleType restriction of string with at least 8 characters struct ns__data // simpleContent wrapper { char *__item :256; // simpleContent with at most 256 characters @ char *name 1; // required name attribute }; struct time__date // simpleContent wrapper { char *__item :100; @ enum time__zone { EST, GMT, ... } zone = GMT; } ~~~ Set the `#SOAP_XML_STRICT` mode flag to enable the validation of value length constraints. See also [C and C++ XML data bindings](../../databinding/html/index.html) documentation for more details. 🔝 [Back to table of contents](#) ### Value range restrictions {#valuerangeconstraints} Similar to data length constraints for string-based data, integer and floating point value range constraints on numeric simpleTypes and complexTypes with simpleContent are declared with `low : high`, where `low` and `high` are optional. As of gSOAP 2.8.26, floating point value ranges and integer ranges can be exclusive by adding `<` on either side of the `:` range operator: range | validation check -------------- | ------------------ `1 ` | 1 <= x `1 : ` | 1 <= x ` : 10 ` | x <= 10 `1 : 10 ` | 1 <= x <= 10 `1 < : < 10 ` | 1 < x < 10 `1 < 10 ` | 1 < x < 10 `1 : < 10` | 1 <= x < 10 ` : < 10` | x < 10 ` < 10` | x < 10 `1 < : ` | 1 < x `1 < ` | 1 < x `1 < : 10 ` | 1 < x <= 10 For example: ~~~{.cpp} typedef int ns__int10 0:10; // simpleType restriction of int 0..10 typedef LONG64 ns__long -1000000:1000000; // simpleType restriction of long64 -1000000..1000000 typedef float ns__float -1.0 <:< 10.5; // simpleType restriction of float in (-1,10.5) struct ns__data // simpleContent wrapper { int __item 0:10; // simpleContent range 0..10 @ char *name 1; // required name attribute }; ~~~ Set the `#SOAP_XML_STRICT` mode flag to enable the validation of value range constraints. See also [C and C++ XML data bindings](../../databinding/html/index.html) documentation for more details. 🔝 [Back to table of contents](#) ### Pattern restrictions {#patternconstraints} Patterns can be defined for simpleType content. However, pattern validation is not enforced unless the `::soap::fsvalidate` and `::soap::fwvalidate` callbacks are set to a regex matcher. To associate a pattern with a simpleType, you can define a simpleType with a `typedef` and a pattern string: ~~~{.cpp} typedef int time__second "[1-5]?[0-9]|60"; ~~~ This defines the following schema type in `time.xsd`:
~~~{.xml} ~~~
The pattern string must contain a valid regular expression. A special case for C format string patterns is introduced in gSOAP 2.8.18. When `xsd:totalDigits` and `xsd:fractionDigits` are given in a XSD file, then a C format string is produced to output floating point values with the proper precision and scale. For example:
~~~{.xml} ~~~
produces: ~~~{.cpp} typedef float time__ratio "%5.2f"; ~~~ The format string is used to format the output the floating point value in XML. See also [C and C++ XML data bindings](../../databinding/html/index.html) documentation for more details. 🔝 [Back to table of contents](#) ## Element and attribute qualified/unqualified forms {#qualified} Struct, class, and union members represent elements and attributes that are automatically qualified or unqualified depending on the schema element and attribute default forms specified. The engine always validates the prefixes of elements and attributes. When a namespace mismatch occurs, the element or attribute is not consumed which can lead to a validation error (unless the complexType is extensible or when `#SOAP_XML_STRICT` is turned off). Consider for example: ~~~{.cpp} //gsoap ns schema elementForm: qualified //gsoap ns schema attributeForm: unqualified struct ns__record { @ char * type; char * name; }; ~~~ Here, the `ns__record` struct is serialized with qualified element `name` and unqualified attribute `type`:
~~~{.xml} ... ~~~
The "colon notation" for struct/class/union member names is used to override element and attribute qualified or unqualified forms. To override the form for individual members that represent elements and attributes, use a namespace prefix and colon with the member name: ~~~{.cpp} //gsoap ns schema elementForm: qualified //gsoap ns schema attributeForm: unqualified struct ns__record { @ char * ns:type; char * :name; }; ~~~ where `name` is unqualified and `type` is qualified:
~~~{.xml} ... ~~~
The colon notation is a syntactic notation used only in the interface header file syntax, it is not translated to the C/C++ output. The colon notation does not avoid name clashes between members. For example: ~~~{.cpp} struct x__record { @ char * name; char * x:name; }; ~~~ results in a redefinition error, since both members have the same name. To avoid name clashes, use a underscore suffix: ~~~{.cpp} struct x__record { @ char * name; char * x:name_; }; ~~~ Not that the namespace prefix convention can be used instead: ~~~{.cpp} struct x__record { @ char * name; char * x__name; }; ~~~ which avoids the name clash. However, the resulting schema is different since the last example generates a global `name` element definition that is referenced by the local element. More specifically, the difference between the namespace prefix convention with double underscores and colon notation is that the namespace prefix convention generates schema element/attribute references to elements/attributes at the top level, while the colon notation only affects the local element/attribute namespace qualification by form overriding. This is best illustrated by an example: ~~~{.cpp} struct x__record { char * :name; char * x:phone; char * x__fax; char * y__zip; }; ~~~ which generates the following `x.xsd`schema:
~~~{.xml} ~~~
and the `y.xsd` schema defines contains:
~~~{.xml} ~~~
See also [C and C++ XML data bindings](../../databinding/html/index.html) documentation for more details. 🔝 [Back to table of contents](#) # XML namespaces and the namespace mapping table {#nstable} A namespace mapping table should be included in the source code of client and service applications. The mapping table is used by the serializers and deserializers of the stub and skeleton functions to produce valid XML messages and to parse and validate XML messages. A typical mapping table is shown below: ~~~{.cpp} struct Namespace namespaces[] = { // { "prefix", "URI", "URI-pattern" (optional) } { "SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/" }, // must be first { "SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/" }, // must be second { "xsi", "http://www.w3.org/2001/XMLSchema-instance" }, // must be third { "xsd", "http://www.w3.org/2001/XMLSchema" }, // must be fourth { "ns", "urn:my-service-URI" }, // binds "ns" namespace prefix to schema URI { NULL, NULL } // end of table }; ~~~ Each namespace prefix used by a identifier name in the header file specification, see Section \ref idtrans, must have a binding to a namespace URI in the mapping table. The end of the namespace mapping table must be indicated by the NULL pair. The namespace URI matching is case insensitive. A namespace prefix is distinguished by the occurrence of a pair of underscores (`__`) in an identifier or by using colon notation, see Section \ref idtrans. An optional third column in the namespace mapping table may be specified that contains a namespace URI pattern. The patterns provide an alternative namespace for the validation of parsed XML messages. In this pattern, dashes (`-`) are single-character wildcards and asterisks (`*`) are multi-character wildcards. For example, to accept alternative versions of XML schemas with different authoring dates, four dashes can be used in place of the specific dates in the namespace mapping table pattern: ~~~{.cpp} struct Namespace namespaces[] = { // { "prefix", "URI", "URI-pattern" (optional) } { "SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/" }, // must be first { "SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/" }, // must be second { "xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/----/XMLSchema-instance" }, { "xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/----/XMLSchema" }, ... // { NULL, NULL } // end of table }; ~~~ Or alternatively, asterisks can be used as wildcards for multiple characters: ~~~{.cpp} struct Namespace namespaces[] = { // { "prefix", "URI", "URI-pattern" (optional) } { "SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/" }, // must be first { "SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/" }, // must be second { "xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance" }, { "xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema" }, ... // { NULL, NULL} // end of table }; ~~~ A namespace mapping table is automatically generated with prefixes and URIs in the table that are declared with `//gsoap schema namespace:` directives in the interface header file, see Section \ref directives. If directives are not provided in the header file then default URIs of the form `http://tempuri.org/prefix.xsd` for each namespace `prefix`. The soapcpp2 tool also generates a WSDL and one or more XSD files, one for each XML namespace. When parsing XML and deserializing data, namespace URIs in the XML messages are matched against the second and third column of the namespace mapping table, searching from the top to the bottom of the table. The actual prefix used in the XML message is irrelevant as the URI associated with the prefix is relevant to define the XML namespace to which a qualified element or attribute belongs. When a match is found, the namespace prefix in the first column of the table is considered semantically identical to the namespace prefix used by the qualified XML element and attribute parsed, even when the prefix names differ. This normalization of prefixes is invisible to the user of gSOAP and makes coding with XML easier. For example, when XSD QNames are parsed into strings using the built-in soapcpp2 `_QName` type or a QName declared with `typedef std::string xsd__QName`, then this QName string will always contain qualified names with normalized prefixes, i.e. prefixes defined in the namespace mapping table, unless the table has no entry, see Section \ref qname. For example, let's say we have the following structs: ~~~{.cpp} struct a__elt { ... }; struct b__elt { ... }; struct k__elt { ... }; ~~~ The namespace mapping table generated by soapcpp2 has the following entries: ~~~{.cpp} struct Namespace namespaces[] = { // { "prefix", "URI", "URI-pattern" (optional) } ... // the four SOAP and XSD namespace bindings { "a", "http://tempuri.org/a.xsd" }, { "b", "http://tempuri.org/b.xsd" }, { "c", "http://tempuri.org/c.xsd" }, ... // { NULL, NULL } }; ~~~ Then, the following XML elements will match these structs:
~~~{.xml} ... ... ... ~~~
Instead of one big namespace table that contains all XML namespace prefixes with their URIs, there are cases when it is desirable to use multiple namespace tables, one for each service. This avoids leaking namespace prefixes in XML messages that have nothing to do with the service invoked. In principle there is no harm to leak these namespace prefixes, but the messages are less compact and not as clean. To use multiple namespace tables at the client side is done as follows: ~~~{.cpp} struct Namespace namespacesTable1[] = { ... }; struct Namespace namespacesTable2[] = { ... }; struct Namespace namespacesTable3[] = { ... }; struct Namespace *namespaces; ... // struct soap *soap = soap_new(); soap_set_namespaces(soap, namespaceTable1); // use the first namespace table if (soap_call_remote_method(soap, endpoint, Action, ...)) ... // error ~~~ Likewise, on the server side call `::soap_set_namespaces` before calling `::soap_serve`. Changing the namespaces table in service operations has no effect. The XML messages produced by the gSOAP engine include all `xmlsn` namespace bindings in the root element, which is generally more efficient for larger XML documents in which otherwise the `xmlsn` namespace bindings will be sprinkled throughout. By contrast, canonical XML requires `xmlsn` namespace bindings only to be included when utilized. Therefore, the `#SOAP_XML_CANONICAL` context flag produces C14N exclusive XML messages and documents, which eliminates unused `xmlsn` namespace bindings from XML. Unfortunately, the current C14N standard is buggy with respect to XSD QName content, because prefixes used in QName content are not considered utilized. The gSOAP engine considers QName content prefixes utilized and therefore produces corrected canonicalized XML output that prevents the loss of namespace information for QNames. 🔝 [Back to table of contents](#) # SOAP Header processing {#header} A built-in SOAP Header data structure `::SOAP_ENV__Header` is generated by the soapcpp2 tool for exchanging SOAP headers in SOAP messages. This structure is empty unless headers are added by plugins and headers specified by WSDL specifications (i.e. wsdl2h adds SOAP Headers). You can create your own SOAP Header struct simply by declaring it in an interface header file for soapcpp2 and by adding members that must be qualified with namespace prefixes to conform to the SOAP Header processing requirements that SOAP Header elements must be namespace qualified. For example, assume that transaction data should be piggy-backed with SOAP messages in SOAP Header: ~~~{.cpp} struct t__transaction { int number; const char *dscription; }; struct SOAP_ENV__Header { mustUnderstand struct t__transaction *t__transaction; }; //gsoap ns service method-input-header-part: webmethod t__transaction int ns__webmethod(...); ~~~ The `mustUnderstand` qualifier specifies that the element must be processed by the SOAP processor and cannot be ignored if the processor has no logic in place for this SOAP header, which is done by adding a `SOAP-ENV:mustUnderstand="true"` attribute to the `t:transaction` element. The soapcpp2-generated serializers obey this safety principle. This declares a service operation that sends messages with an input SOAP header `t__transaction`, as can be seen in the generated WSDL binding:
~~~{.xml} ~~~
Likewise, you can specify that both input and output messages have the same header with `//gsoap ns service method-header-part:` or the output message has a header with `//gsoap ns service method-output-header-part:`. Multiple headers can be specified this way. To set up a SOAP Header at the client side that contains the `t__transaction` member: ~~~{.cpp} struct soap *soap = soap_new(); ... // soap.header = NULL; // erase any SOAP Header we have so far soap_header(soap); // allocate and initialize a new SOAP Header soap->header->t__transaction = soap_new_t__transaction(soap, -1); soap->header->t__transaction->number = num; soap->header->t__transaction->description = "Transactional data"; if (soap_call_webmethod(soap, endpoint, NULL, ...)) ... // error ~~~ The SOAP Web service request includes the SOAP Header with the transaction data:
~~~{.xml} 12345 Transactional data ... ~~~
At the receiving side, a SOAP Header can be inspected by checking for a non-NULL `::soap::header`. @warning When SOAP Headers are used, you must make sure to set `::soap::header` to NULL when no SOAP Header should be sent, otherwise any SOAP Headers currently present in the `::SOAP_ENV__Header` struct pointed to by `::soap::header` will be included in the message. At the client side, the `::soap::actor` string variable can be set to set the SOAP `SOAP-ENV:actor` attribute. The `SOAP-ENV:mustUnderstand="true"` attribute then indicates the requirement that the recipient corresponding to the `SOAP-ENV:actor` attribute value is responsible to process the SOAP Header element. The details of which can be found in the SOAP 1.1/1.2 specifications that the gSOAP tools conform to. The SOAP Header structure `::SOAP_ENV__Header` is declared `mutable`, which means that re-declarations of the structures are permitted and additional members are collected into one final structure by the soapcpp2 tool. For another example, consider: ~~~{.cpp} struct SOAP_ENV__Header { char *h__transaction; struct UserAuth *h__authentication; }; ~~~ Suppose method `ns__login` uses both header parts (at most), then this is declared as: ~~~{.cpp} //gsoap ns service method-header-part: login h__transaction //gsoap ns service method-header-part: login h__authentication int ns__login(...); ~~~ Suppose method `ns__search` uses only the first header part, then this is declared as: ~~~{.cpp} //gsoap ns service method-header-part: search h__transaction int ns__search(...); ~~~ Note that the method name and header part names must be namespace qualified. The headers must be present in all operations that declared the header parts. To specify the header parts for the method input (method request message), use: ~~~{.cpp} //gsoap namespace-prefix service method-input-header-part: method-name header-part ~~~ Similarly, to specify the header parts for the method output (method response message), use: ~~~{.cpp} //gsoap namespace-prefix service method-output-header-part: method-name header-part ~~~ The declarations only affect the WSDL. For example: ~~~{.cpp} struct SOAP_ENV__Header { char *h__transaction; struct UserAuth *h__authentication; }; //gsoap ns service method-input-header-part: login h__authentication //gsoap ns service method-input-header-part: login h__transaction //gsoap ns service method-output-header-part: login h__transaction int ns__login(...); ~~~ The headers must be present in all operations that declared the header parts. See also API documentation Module \ref group_header. 🔝 [Back to table of contents](#) # SOAP Fault processing {#fault} A built-in SOAP Fault data structure `::SOAP_ENV__Fault` is generated by the soapcpp2 tool for exchanging exception messages. This structure has the general form: ~~~{.cpp} struct SOAP_ENV__Fault { _QName faultcode; // _QName is built-in char *faultstring; char *faultactor; struct SOAP_ENV__Detail *detail; struct SOAP_ENV__Code *SOAP_ENV__Code; // must be a SOAP_ENV__Code struct defined below char *SOAP_ENV__Reason; char *SOAP_ENV__Node; char *SOAP_ENV__Role; struct SOAP_ENV__Detail *SOAP_ENV__Detail; // SOAP 1.2 detail member }; struct SOAP_ENV__Code { _QName SOAP_ENV__Value; struct SOAP_ENV__Code *SOAP_ENV__Subcode; }; struct SOAP_ENV__Detail { int __type; // The SOAP_TYPE_ of the object serialized as Fault detail void *fault; // pointer to the fault object, or NULL _XML __any; // any other detail element content (stored in XML format) }; ~~~ The first four members in `::SOAP_ENV__Fault` are SOAP 1.1 specific. The last five members are SOAP 1.2 specific. You can redefine these structures in the interface header file for soapcpp2. For example, you can use a `class` for the `::SOAP_ENV__Fault` and add methods for convenience. The `::SOAP_ENV__Detail` structure can be changed to the needs of Web service application to communicate specific fault data structures, but this is generally not necessary because the application-specific SOAP Fault details can be serialized via the `__type` and `fault` members in the `::SOAP_ENV__Detail` member, see Section \ref void on the serialization of data referred to by `__type` and `fault`. When a user-define service operation function returns an error with `::soap_sender_fault` or `::soap_receiver_fault`, then the SOAP Fault structure is populated and `::soap::fault` points to this SOAP Fault. The SOAP Fault is sent to the client. The client populates a SOAP Fault structure that contains the SOAP Fault message with details. Server-side faults are raised with `::soap_sender_fault` or `::soap_receiver_fault`. The `::soap_sender_fault` call should be used to inform that the sender is at fault and the sender (client) should not re-send the request. The `::soap_receiver_fault` call should be used to indicate a temporary server-side problem, so a sender (client) can re-send the request later. For example: ~~~{.cpp} int ns1__myMethod(struct soap *soap, ...) { ... // return soap_receiver_fault(soap, "Resource temporarily unavailable", NULL); // return fault to sender } ~~~ In the example, the SOAP Fault details were empty (NULL). You may pass an XML fragment, which will be literally included in the SOAP Fault message. For WS-I Basic Profile compliance, you must pass an XML string with one or more namespace qualified elements, such as: ~~~{.cpp} return soap_receiver_fault(soap, "Resource temporarily unavailable", "123abc"); ~~~ When a service operation needs to populate SOAP Fault details with a application-specific data, it does so by assigning the `::soap::fault` member of the current reference to the context with appropriate data associated with the exception and by returning the error `#SOAP_FAULT`. For example: ~~~{.cpp} soap_receiver_fault(soap, "Error message", NULL); if (soap->version == 2) // SOAP 1.2 is used { soap->fault->SOAP_ENV__Detail = soap_new_SOAP_ENV__Detail(soap, -1); soap->fault->SOAP_ENV__Detail->__type = SOAP_TYPE_ns1__myStackDataType; // stack type soap->fault->SOAP_ENV__Detail->fault = sp; // point to stack soap->fault->SOAP_ENV__Detail->__any = NULL; // no other XML data } else { soap->fault->detail = soap_new_SOAP_ENV__Detail(soap, -1); soap->fault->detail->__type = SOAP_TYPE_ns1__myStackDataType; // stack type soap->fault->detail->fault = sp; // point to stack soap->fault->detail->__any = NULL; // no other XML data } return SOAP_FAULT; // return from service operation call with the fault ~~~ Here, `::soap_receiver_fault` allocates a fault struct then we set the SOAP Fault details as shown. Note that SOAP 1.2 supports nested fault sub-codes. These can be set as follows: ~~~{.cpp} struct SOAP_ENV__Code *subcode1 = soap_new_SOAP_ENV__Code(soap); struct SOAP_ENV__Code *subcode2 = soap_new_SOAP_ENV__Code(soap); soap_sender_fault(soap, "The requested profile token ProfileToken does not exist.", NULL); subcode1->SOAP_ENV__Value = (char*)"ter:InvalidArgs"; // a QName value subcode1->SOAP_ENV__Subcode = subcode2; subcode2->SOAP_ENV__Value = (char*)"ter:NoProfile"; // a QName value subcode2->SOAP_ENV__Subcode = NULL; soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode = subcode1; return SOAP_FAULT; ~~~ This produces:
~~~{.xml} SOAP-ENV:Sender ter:InvalidArgs ter:NoProfile The requested profile token ProfileToken does not exist. ~~~
Service operations implementation in a Web service application can return various SOAP Faults customized in this way. SOAP Fault structures are declared `mutable`, which means that re-declarations of the structures are permitted and additional members are collected into one final structure by the soapcpp2 tool. For an example that used the SOAP Fault detail structure: ~~~{.cpp} struct SOAP_ENV__Detail { const char *f__invalid; const char *f__unavailable; int __type; void *fault; _XML __any; }; //gsoap ns service method-fault: login f__invalid //gsoap ns service method-fault: login f__unavailable int ns__login(...); ~~~ See also API documentation Module \ref group_fault. 🔝 [Back to table of contents](#) # MIME attachments {#MIME} The gSOAP toolkit supports MIME attachments as per SOAP with Attachments (SwA) specification . MTOM attachments that are essentially MIME attachments that conform to the MTOM specification are also supported which are the preferred way to include MIME attachments with SOAP messages, see Section \ref MTOM. In the following discussion, MIME attachment data is assumed to be resident in memory for sending operations and MIME attachments received will be stored in memory managed by the context. MTOM and DIME attachments on the other hand can be streamed and therefore MTOM/DIME attachment data does not need to be stored in memory, see Sections \ref DIME and \ref MTOM . Transmitting multipart/related MIME attachments with a SOAP/XML message is accomplished with two functions, `::soap_set_mime` and `::soap_set_mime_attachment`. The first function is for initialization purposes and the latter function is used to specify meta data and content data for each attachment. See also API documentation Module \ref group_mime. 🔝 [Back to table of contents](#) ## Sending a collection of MIME attachments (SwA) {#SWAsending} The following functions are used to set up a collection of multipart/related MIME attachments for transmission with a SOAP or XML message. * `void soap_set_mime(struct soap *soap, const char *boundary, const char *start)` This function enables sending MIME attachments. This function is generally not required when the context is initialized with `#SOAP_ENC_MIME`, because MIME attachments are automatically detected as `::xsd__base64Binary` and `::_xop__Include` structures in the data to serialize as an XML message with the attachments automatically added or MIME attachments can be explicitly added with `::soap_set_mime_attachment`. Parameter `boundary` specifies a MIME boundary string or NULL to have the engine generate a MIME boundary string. Parameter `start` specifies the start content ID for the first MIME body containing the SOAP or XML message. When NULL, the start ID of the SOAP message is ``. * `int 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)` This function adds a MIME attachment to a SOAP/XML message to send. The specified `ptr` points to the data to send of length specified by `size`. The `encoding` parameter is a `::soap_mime_encoding` value that is recommended to be specified as `#SOAP_MIME_NONE` to specify that the MIME data content is not encoded in any way (the MIME attachment function simply copies the raw data to the MIME block without encoding). The `type` parameter is required and indicates the MIME type of the data, such as "image/jpg". The `id` parameter uniquely identifies the attachment in the message, which can be omitted by specifying NULL. The `location` parameter specifies a location string or NULL. The `description` parameter is a string that describes the data or NULL. Returns `#SOAP_OK` or a `::soap_status` error code. * `void soap_clr_mime(struct soap *soap)` This function disables MIME attachments such as after sending a multipart-related message with attachments to switch back to non-multipart-related messaging, unless the data to serialize as a message contains attachments such as `::xsd__base64Binary` for MIME attachments and `::_xop__Include` for MTOM attachments. When providing a MIME boundary with `::soap_set_mime`, you have to make sure the boundary cannot match any parts of the message and attachments that you are sending, because the boundary delineates the attachments. The internal list of attachments specified with `::soap_set_mime_attachment` is destroyed with `::soap_end` or when a message is received. Therefore, call `::soap_set_mime_attachment` to set attachments before sending a message. The following example shows how a multipart/related HTTP message with three MIME attachments is set up and transmitted to a server. In this example we let the message body refer to the attachments using XML `href` attributes. The `struct claim__form` data type includes a definition of a `href` attribute for this purpose. ~~~{.cpp} struct claim__form form1, form2; form1.href = "cid:claim061400a.tiff@claiming-it.com"; form2.href = "cid:claim061400a.jpeg@claiming-it.com"; /* initialize and enable MIME */ soap_set_mime(soap, NULL, ""); /* add a base64 encoded tiff image (tiffImage points to base64 data) */ soap_set_mime_attachment(soap, tiffImage, tiffLen, SOAP_MIME_BASE64, "image/tiff", "", NULL, NULL); /* add a raw binary jpeg image (jpegImage points to raw data) */ soap_set_mime_attachment(soap, jpegImage, jpegLen, SOAP_MIME_BINARY, "image/jpeg", "", NULL, NULL); /* send the forms as MIME attachments with this invocation */ if (soap_call_claim__insurance_claim_auto(soap, form1, form2, ...)) ... // an error occurred else ... // process the response soap_clr_mime(soap); ~~~ The `claim__form` struct is declared in the interface header file as: ~~~{.cpp} struct claim__form { @ char *href; }; ~~~ The claim forms in the message consist of `href`s to the claim forms attached. The use of `href` or other attributes for referring to the MIME attachments is optional according to the SwA standard. MTOM on the other hand mandates the use of `href` with XOP elements. To associate MIME attachments with the request and response of a service operation in the generated WSDL, please see Section \ref MIMEWSDL . The server-side code to transmit MIME attachments back to a client: ~~~{.cpp} int claim__insurance_claim_auto(struct soap *soap, ...) { const char *htmlDoc = ...; // an HTML message to send as an attachment soap_set_mime(soap, NULL, NULL); // enable MIME // add a HTML document (htmlDoc points to data, where the HTML doc is stored in compliance with 7bit encoding RFC2045) if (soap_set_mime_attachment(soap, htmlDoc, strlen(htmlDoc), SOAP_MIME_7BIT, "text/html", "", NULL, NULL)) { soap_clr_mime(soap); // don't want fault with attachments return soap->error; } return SOAP_OK; } ~~~ 🔝 [Back to table of contents](#) ## Retrieving a collection of MIME attachments (SwA) {#SWAreceiving} MIME attachments are automatically parsed and stored in memory managed by the `::soap` context. After receiving a set of MIME attachments, either at the client-side or the server-side, the list of MIME attachments can be traversed to extract meta data and the attachment content. The first attachment in the collection of MIME attachments always contains meta data about the SOAP message itself (because the SOAP message was processed the attachment does not contain any useful data). To traverse the list of MIME attachments in C, you use a loop similar to: ~~~{.cpp} int n = 0; struct soap_multipart *attachment; for (attachment = soap->mime.list; attachment; attachment = attachment->next) { ++n; printf("Part %d:\n", n); printf("ptr =%p\n", attachment->ptr); printf("size =%ul\n", attachment->size); printf("id =%s\n", attachment->id ? attachment->id : ""); printf("type =%s\n", attachment->type ? attachment->type : ""); printf("location =%s\n", attachment->location ? attachment->location : ""); printf("description=%s\n", attachment->description ? attachment->description : ""); } ~~~ C++ programmers can use an iterator instead: ~~~{.cpp} int n = 0; for (soap_multipart::iterator i = soap->mime.begin(); i != soap->mime.end(); ++i) { ++n; printf("Part %d:\n", n); printf("ptr =%p\n", i->ptr); ... // etc } ~~~ Note: keep in mind that the first attachment is associated with the SOAP message and you may want to ignore it. A call to `::soap_end` removes all of the received MIME data. To preserve an attachment in memory, use `::soap_unlink` on the `ptr` member of the `::soap_multipart` struct. The `::soap_unlink` function can be used to prevent deallocation of deserialized data. 🔝 [Back to table of contents](#) # DIME attachments {#DIME} Applications developed with the gSOAP tools can transmit binary DIME attachments stored in memory or in streaming mode by fetching data from a resource or sending data to a resource using callback functions. The maximum DIME attachment size is limited to 8 MB by default as set with `#SOAP_MAXDIMESIZE`. This limit can be changed as needed. With streaming DIME using callback functions, data handlers are used to pass the data to and from a resource from which to fetch the data to send or data to store, such as a file or device. See Section \ref DIMEstreaming . For details on DIME attachments, see See also API documentation Module \ref group_dime. 🔝 [Back to table of contents](#) ## Sending a collection of DIME attachments {#DIMEsending} The following functions can be used to explicitly set up a collection of DIME attachments for transmission with a message. These attachments can be streamed, as described in Section \ref DIMEstreaming . Without streaming, each attachment must refer to a block of data in memory. * `void soap_set_dime(struct soap *soap)` This function enables sending DIME attachments. This function is generally not required because DIME attachments are automatically detected as `::xsd__base64Binary` and `::_xop__Include` structures in the data to serialize as an XML message with the attachments automatically added or DIME attachments can be explicitly added with `::soap_set_dime_attachment`. * `int soap_set_dime_attachment(struct soap *soap, char *ptr, size_t size, const char *type, const char *id, unsigned short optype, const char *option)` This function adds a DIME attachment to the XML message to send. The specified `ptr` points to the data to send of length specified by `size`. The `type` parameter indicates the MIME type of the data or can be NULL. The `id` parameter uniquely identifies the attachment in the message, which can be omitted by specifying NULL. The `option` parameter is an option such as a description of the data and `optype` is a user-defined option type (as per DIME option specification format). The `ptr` parameter must be persistent. The `ptr` parameter passed to this function must be persistent in memory until the attachment was sent. Returns `#SOAP_OK` or a `::soap_status` error code. * `void soap_clr_dime(struct soap *soap)` This function disables DIME attachments, unless the data to serialize as an XML message contains attachments defined by `::xsd__base64Binary` and `::_xop__Include` structures. These functions allow DIME attachments to be added to SOAP messages without requiring message body references. This is also referred to as the open DIME attachment style. The closed attachment style requires all DIME attachments to be referenced from the SOAP message body with `href` (or similar) references. For the closed style, gSOAP supports an automatic binary data serialization method, see Section \ref DIMEbinary . 🔝 [Back to table of contents](#) ## Retrieving a collection of DIME attachments {#DIMEreceiving} DIME attachments are automatically parsed and stored in memory (or passed to the streaming handlers via the DIME callback functions when defined). After receiving a set of DIME attachments, either at the client-side or the server-side, the list of DIME attachments can be traversed to extract meta data and the attachment content. To traverse the list of DIME attachments in C, you use a loop similar to: ~~~{.cpp} int n = 0; struct soap_multipart *attachment; for (attachment = soap->dime.list; attachment; attachment = attachment->next) { ++n; printf("Part %d:\n", n); printf("ptr =%p\n", attachment->ptr); printf("size =%ul\n", attachment->size); printf("id =%s\n", attachment->id ? attachment->id : ""); printf("type =%s\n", attachment->type ? attachment->type : ""); } ~~~ C++ programmers can use an iterator instead: ~~~{.cpp} int n = 0; for (soap_multipart::iterator i = soap->dime.begin(); i != soap->dime.end(); ++i) { ++n; printf("Part %d:\n", n); printf("ptr =%p\n", i->ptr); ... // etc } ~~~ The `options` member is available as well, but not shown in the code above. The `options` content is formatted according to the DIME specification: the first two bytes are reserved for the option type, the next two bytes store the size of the option data, followed by the (binary) option data. A call to `::soap_end` removes all of the received DIME data. To preserve an attachment in memory, use `::soap_unlink` on the `ptr` member of the `::soap_multipart` struct. The `::soap_unlink` function can be used to prevent deallocation of deserialized data. 🔝 [Back to table of contents](#) ## Serializing binary data with DIME attachments {#DIMEbinary} Binary data stored in extended `::xsd__base64Binary` and `::xsd__hexBinary` types can be serialized and deserialized as DIME attachments when one or more of the extra members `id`, `type`, and `options` are non-NULL. These attachments will be automatically transmitted prior to the sequence of secondary DIME attachments defined by the user with `::soap_set_dime_attachment` as explained in the previous section. The serialization process is automated for SOAP encoded messages and DIME attachments will be send even when `::soap_set_dime` or `::soap_set_dime_attachment` are not used. For non-SOAP-encoded messages such as document/literal messages you must still call `::soap_set_dime` to enable sending messages with attachments. To enable serialization of the data as DIME attachments instead of inline base64, we extend the `::xsd__base64Binary` type with three additional members: ~~~{.cpp} struct xsd__base64Binary { unsigned char *__ptr; int __size; char *id; char *type; char *options; }; ~~~ The `id` member is for attachment referencing, typically a content id (CID) or a UUID which can be obtained with `::soap_rand_uuid`, a `type` member is used to specify the MIME type of the data, the `options` member is used to piggy-back additional information with a DIME attachment. The order of the declaration of the members is significant. In addition, no other members or methods may be declared before any of these members in the struct/class, but additional members and methods may appear after the member declarations. The extended `::xsd__hexBinary` type is similar. The `id` and `type` members contain text. The set the DIME-specific options member, you can use the `::soap_dime_option` function `char *soap_dime_option(struct soap *soap, unsigned short type, const char *option)`. This function returns a string with this encoding. For example ~~~{.cpp} struct xsd__base64Binary image; image.__ptr = ...; image.__size = ...; image.id = "uuid:09233523-345b-4351-b623-5dsf35sgs5d6"; image.type = "image/jpeg"; image.options = soap_dime_option(soap, 0, "My wedding picture"); ~~~ When either the `id` or `type` member values are non-NULL at run time, the data will be serialized as a DIME attachment. The SOAP/XML message refers to the attachments using `href` attributes. This generally works will with SOAP RPC encoded messaging, because `href` attributes are permitted. However, with document/literal style the referencing mechanism must be explicitly defined in the schema of the binary type. Therefore, MTOM is the preferred attachment mechanism for document/literal style messaging. The declaration of an extended binary type in the interface header file for soapcpp2 is: ~~~{.cpp} struct ns__myBinaryDataType { unsigned char *__ptr; int __size; char *id; char *type; char *options; }; ~~~ C++ programmers can use inheritance instead of textual extension required in C: ~~~{.cpp} class xsd__base64Binary { public: unsigned char *__ptr; int __size; }; class ns__myBinaryDataType : public xsd__base64Binary { public: char *id; char *type; char *options; }; ~~~ This defines an extension of `xsd:base64Binary`, such that the data can be serialized as DIME attachments using `href` attributes for referencing. When a different attribute is to be used, this must be explicitly defined: ~~~{.cpp} //gsoap WSref schema import: http://schemas.xmlsoap.org/ws/2002/04/reference/ struct ns__myBinaryDataType { unsigned char *__ptr; int __size; char *id; char *type; char *options; @ char *WSref__location; }; ~~~ The example above uses the `location` attribute defined in the content reference schema, as defined in one of the vendor's specific WSDL extensions for DIME . When receiving DIME attachments, the DIME meta data and binary content are stored in the specified `::xsd__base64Binary` and `::xsd__hexBinary` binary data types only when the XML parts of the message uses `href` attributes to refer to these attachments. If so, the binary data type `__ptr` and `__size` members are set to the location in memory of the attachment data and length, respectively. Messages may contain binary data that references external resources not provided as attachments. In that case, the `__ptr` member is NULL and the `id` member refers to the external data source. The `dime_id_format` attribute of the current context can be set to the default format of DIME id members. The format string must contain a `%d` format specifier (or any other `int`-based format specifier). The value of this specifier is a non-negative integer, with zero being the value of the DIME attachment id for the SOAP message. For example, ~~~{.cpp} struct soap *soap = soap_new(); soap->dime_id_format = "id-%x"; ~~~ As a result, all attachments with a NULL `id` member will use a auto-generated id value based on the format string. @warning Care must be taken not to introduce duplicate content id values, when assigning content id values to the id members of DIME extended binary data types. Content ids must be unique. 🔝 [Back to table of contents](#) ## Streaming DIME {#DIMEstreaming} Streaming DIME is achieved with callback functions to fetch and store data during transmission. Three function callbacks for streaming DIME output and three callbacks for streaming DIME input are available. * `void *(*soap.fdimereadopen)(struct soap *soap, void *handle, const char *id, const char *type, const char *options)` This callback is called by the engine to start sending a streaming DIME attachment. This callback opens a stream to start reading the attachment data to send. The actual data stream will be read in chunks using the `::soap::fdimeread` callback until no more data is available and the `::soap::fdimereadclose` callback is called to close the stream. The `handle` parameter contains the value of the `__ptr` member variable of the attachment struct/class with data (e.g. `::xsd__base64Binary` or `::_xop__Include` with `__ptr`, `__size`, `id`, `type` and `options` members), which should be a pointer to specific information such as a file descriptor or a pointer to a some application-specific data to be passed to this callback. Both the `__ptr` and `__size` members of the attachment struct/class should have been set by the application prior to the serialization of the message with attachments. If the `__size` is zero and HTTP chunking is enabled (with `#SOAP_IO_CHUNK`), then chunked DIME attachments are sent, see `::soap::fdimeread`. The `id`, `type` and `options` parameters are the `id` (optional ID), `type` (a MIME type) and `options` (DIME options are set with `::soap_dime_option`) of the attachment struct/class, respectively, of which at least one member should be non-NULL. The callback should return the `handle` parameter value or another pointer value, which is passed as the new `handle` parameter to `::soap::fdimeread` and `::soap::fdimereadclose` callbacks. When an error occurred in this callback, the callback should return NULL and set `::soap::error` to an error code, e.g. using `::soap_receiver_fault`. The callback may return NULL and set `::soap::error` to `#SOAP_OK` when this specific DIME attachment should not to be streamed and the engine will simply skip it. * `size_t (*soap.fdimeread)(struct soap *soap, void *handle, char *buf, size_t len)` This callback is called by the engine to read a chunk of attachment data to transmit. The `handle` parameter contains the handle returned by the `::soap::fdimereadopen` callback. The `buf` parameter is the buffer of length `len` into which a chunk of data should be written by the callback. The actual amount of data written into the buffer may be less than `len` and this actual amount should be returned by the callback. A return value of zero indicates an error and `::soap::error` should be set. The `__size` member variable of the attachment struct/class with data (e.g. `::xsd__base64Binary` or `::_xop__Include` with `__ptr`, `__size`, `id`, `type` and `options` members) should be set by the application prior to the serialization of the message with attachments. The value of `__size` indicates the total size of the attachment data to be transmitted. If the `__size` member variable is zero and HTTP chunking is enabled (with `#SOAP_IO_CHUNK`), then DIME chunked transfers are activated by the engine, which is more flexible since the attachment data size does not need to be determined in advance. To use DIME chunked transfers, enable HTTP chunking with `#SOAP_IO_CHUNK` (also `#SOAP_IO_STORE` can be used, but this buffers the entire message in memory before transmission) and set the `__size` member variable of the attachment struct/class to zero. When DIME attachment chunking is enabled, this callback should completely fill the `buf` buffer with `len` bytes unless the last data chunk is reached and fewer bytes are returned. * `void (*soap.fdimereadclose)(struct soap *soap, void *handle)` This callback is called by the engine to close the DIME attachment stream after reading. The `handle` parameter contains the handle returned by the `::soap::fdimereadopen` callback. * `void *(*soap.fdimewriteopen)(struct soap *soap, const char *id, const char *type, const char *options)` Called by the to start receiving a streaming DIME attachment. This callback opens a stream to start writing the attachment data received. The actual data stream will be written in chunks using the `::soap::fdimewrite` callback until no more data is available and the `::soap::fdimewriteclose` callback is called to close the stream. The `id`, `type` and `options` parameters are the `id`, `type` and `options` of the attachment struct/class (e.g. `::xsd__base64Binary` or `::_xop__Include` with `__ptr`, `__size`, `id`, `type` and `options` members), respectively. The callback should return a handle, which is passed to the `::soap::fdimewrite` and `::soap::fdimewriteclose` callbacks. The `__ptr` member variable of the attachment struct/class is set by the engine to the value of this handle. The `__size` member variable is set to the size of the attachment received. The maximum DIME attachment size received is limited by `#SOAP_MAXDIMESIZE`. * `int (*soap.fdimewrite)(struct soap *soap, void *handle, const char *buf, size_t len)` This callback is called by the engine to write a chunk of attachment data received. The `handle` parameter contains the handle returned by the `::soap::fdimewriteopen` callback. The `buf` parameter contains the data of length `len`. Returns `#SOAP_OK` or a `::soap_status` (int) error code. * `void (*soap.fdimewriteclose)(struct soap *soap, void *handle)` This callback is called by the engine to close the DIME attachment stream after writing. The `handle` parameter contains the handle returned by the `::soap::fdimewriteopen` callback. In addition, a `void* ::soap::user` member is available to pass user-defined data to the callbacks. This way, you can set `void* ::soap::user` to point to application data that the callbacks need such as a file name for example. The following example illustrates the client-side initialization of an image attachment struct to stream a file into a DIME attachment: ~~~{.cpp} int main() { struct soap soap; struct xsd__base64Binary image; FILE *fd; struct stat sb; soap_init(&soap); if (!fstat(fileno(fd), &sb) && sb.st_size > 0) { // because we can get the length of the file, we can stream it soap.fdimereadopen = dime_read_open; soap.fdimereadclose = dime_read_close; soap.fdimeread = dime_read; image.__ptr = (unsigned char*)fd; // must set to non-NULL (this is our fd handle which we need in the callbacks) image.__size = sb.st_size; // must set size } else { // don't know the size, so buffer it size_t i; int c; image.__ptr = (unsigned char*)soap_malloc(&soap, MAX_FILE_SIZE); for (i = 0; i < MAX_FILE_SIZE; i++) { if ((c = fgetc(fd)) == EOF) break; image.__ptr[i] = c; } fclose(fd); image.__size = i; } image.type = "image/jpeg"; image.options = soap_dime_option(&soap, 0, "My picture"); if (soap_call_ns__webmethod(&soap, ...)) ... // error else ... // success } void *dime_read_open(struct soap *soap, void *handle, const char *id, const char *type, const char *options) { return handle; } void dime_read_close(struct soap *soap, void *handle) { fclose((FILE*)handle); } size_t dime_read(struct soap *soap, void *handle, char *buf, size_t len) { return fread(buf, 1, len, (FILE*)handle); } ~~~ The following example illustrates the streaming of a DIME attachment into a file by a client: ~~~{.cpp} int main() { struct soap soap; soap_init(&soap); soap.fdimewriteopen = dime_write_open; soap.fdimewriteclose = dime_write_close; soap.fdimewrite = dime_write; if (soap_call_ns__webmethod(&soap, ...)) ... // error else ... // success } void *dime_write_open(struct soap *soap, const char *id, const char *type, const char *options) { FILE *handle = fopen("somefile", "wb"); if (!handle) { soap->error = SOAP_EOF; soap->errnum = errno; // get reason } return (void*)handle; } void dime_write_close(struct soap *soap, void *handle) { fclose((FILE*)handle); } int dime_write(struct soap *soap, void *handle, const char *buf, size_t len) { size_t nwritten; while (len) { nwritten = fwrite(buf, 1, len, (FILE*)handle); if (!nwritten) { soap->errnum = errno; // get reason return SOAP_EOF; } len -= nwritten; buf += nwritten; } return SOAP_OK; } ~~~ Message compression with `#SOAP_ENC_ZLIB` can be used with DIME to compress the entire message. However, compression requires buffering to determine the HTTP content length header, which cancels the benefits of streaming DIME. To avoid this, you should use chunked HTTP (with the output-mode `#SOAP_IO_CHUNK` flag) with compression and streaming DIME. At the server side, when you set `#SOAP_IO_CHUNK` before calling `::soap_serve`, the engine will automatically revert to buffering (`#SOAP_IO_STORE` flag is set). You can check this flag with `(soap->omode & SOAP_IO) == SOAP_IO_CHUNK` to see if the client accepts chunking. More information about streaming chunked DIME can be found in Section \ref dimechunking . @warning The `options` member is a DIME-specific data structure, consisting of a 4 byte header containing the option type info (hi byte, lo byte), option string length (hi byte, lo byte), followed by a non-'\0' terminated string. The DIME handler recognizes one option at most. 🔝 [Back to table of contents](#) ## Streaming chunked DIME {#dimechunking} To send DIME attachments, the attachment sizes must be determined in advance to calculate HTTP message length required to stream DIME over HTTP. However, chunked DIME together with chunked HTTP can be used to omit this step. First set the `#SOAP_IO_CHUNK` flag. Then, to stream chunked DIME, set the `__size` member of an attachment to zero and enable DIME chunking. The DIME `::soap::fdimeread` callback then fetches data in chunks and it is important to fill the entire buffer unless the end of the data has been reached and the last chunk is to be send. That is, `::soap::fdimeread` should return the value of the last `len` parameter and fill the entire buffer `buf` for all chunks except the last. For the last it returns 0. You can also use the `#SOAP_IO_STORE` flag, but that cancels the benefits of streaming DIME. 🔝 [Back to table of contents](#) ## WSDL bindings for DIME attachments {#DIMEWSDL} The wsdl2h tool recognizes DIME attachments and produces an annotated header file. Both open and closed layouts are supported for transmitting DIME attachments. For closed formats, all DIME attachments must be referenced from the SOAP message, e.g. using hrefs with SOAP encoding and using the application-specific reference attribute included in the `::xsd__base64Binary` struct or class for document/literal messaging. The soapcpp2 tool does not produce a WSDL with DIME extensions. DIME is an older binary format that has no WSDL protocol support, unlike MIME and MTOM. 🔝 [Back to table of contents](#) # MTOM attachments {#MTOM} MTOM (Message Transmission Optimization Mechanism) is a relatively new format for transmitting attachments with SOAP messages (see ). MTOM attachments are essentially MIME attachments with standardized mechanisms for cross referencing attachments from the SOAP body, which is absent in (plain) MIME attachments and optional with DIME attachments. Unlike the name suggests, the speed by which attached data is transmitted is not increased compared to MIME, DIME, or even XML encoded base64 data, because the performance differences when using gSOAP will be small. The advantage of the format is the standardized attachment reference mechanism, which should improve interoperability. The MTOM specification mandates SOAP 1.2 and the use of the XOP namespace. The XOP Include element `xop:Include` is defined in the interface header file as a `::_xop__Include` struct or class, that is used to reference attachment(s) from the SOAP message body. Because references from within the SOAP message body to attachments are mandatory with MTOM, the implementation of the serialization and deserialization of MTOM MIME attachments uses the extended binary type comparable to DIME support. This binary type is predefined in the `import/xop.h` file: ~~~{.cpp} //gsoap xop schema import: http://www.w3.org/2004/08/xop/include struct _xop__Include { unsigned char *__ptr; int __size; char *id; char *type; char *options; }; typedef struct _xop__Include _xop__Include; ~~~ The additional `id`, `type`, and `option` members enable MTOM attachments for the data pointed to by `__ptr` of size `__size`. The process for sending and receiving MTOM XOP attachments is fully automated. The `id` member references the attachment, typically a content id CID or UUID which can be obtained with `::soap_rand_uuid`. When set to NULL, a unique CID is automatically used. The `type` field specifies the required MIME type of the binary data, and the optional `options` member can be used to piggy-back descriptive text with an attachment. The order of the declaration of the members is significant. You can import `xop.h` in your interface header file to use the MTOM attachments, for example: ~~~{.cpp} #import "import/xop.h" #import "import/xmime5.h" #import "import/soap12.h" /* alternatively, without the import above, use: //gsoap SOAP-ENV schema namespace: http://www.w3.org/2003/05/soap-envelope //gsoap SOAP-ENC schema namespace: http://www.w3.org/2003/05/soap-encoding */ //gsoap x schema namespace: http://my.first.mtom.net struct x__myData { _xop__Include xop__Include; // attachment @ char *xmime5__contentType; // and its contentType }; int x__myMTOMtest(struct x__myData *in, struct x__myData *out); ~~~ When an instance of `x__myDataType` is serialized and either or both the `id` and `type` members are non-NULL, the data is transmitted as MTOM MIME attachment if the `#SOAP_ENC_MTOM` flag is set in the gSOAP's soap struct context: ~~~{.cpp} struct soap *soap = soap_new1(SOAP_ENC_MTOM); ~~~ Without this flag, the attachments will be transmitted in DIME format, which is not what we want. If your current clients and services are based on non-streaming DIME attachments using the SOAP body reference mechanism (thus, without using the `::soap_set_dime_attachment` function) or plain base64 binary XML data elements, it is very easy to adopt MTOM by renaming the binary types to `xop__Include` and using the `#SOAP_ENC_MTOM` flag with the SOAP 1.2 namespace. See also API documentation Module \ref group_mime. 🔝 [Back to table of contents](#) ## Generating MultipartRelated MIME attachment bindings in WSDL {#MIMEWSDL} To generate multipartRelated bindings in the WSDL file indicating the use of MIME attachments, use: ~~~{.cpp} //gsoap service method-mime-type: ... ~~~ This directive directive can be repeated for each attachment you want to associate with a method's request and response message. see also Section \ref directives . For example: ~~~{.cpp} #import "import/xop.h" #import "import/xmime5.h" #import "import/soap12.h" //gsoap x schema namespace: http://my.first.mtom.net struct x__myData { _xop__Include xop__Include; // attachment @ char *xmime5__contentType; // and its contentType }; //gsoap x service method-mime-type: myMTOMtest text/xml int x__myMTOMtest(struct x__myData *in, struct x__myData *out); ~~~ The `//gsoap x service method-mime-type:` directive indicates that this operation accepts `text/xml` MIME attachments. See the SOAP-with-Attachment specification for the MIME types to use (for example, `*/*` is a wildcard). If the operation has more than one attachment, just repeat this directive for each attachment you want to bind to the operation. To bind attachments only to the request message of an operation, use ~~~{.cpp} //gsoap service method-input-mime-type: ... ~~~ Similarly, to bind attachments only to the response message of an operation, use: ~~~{.cpp} //gsoap service method-output-mime-type: ... ~~~ The wsdl2h tool recognizes MIME attachments and produces an annotated header file. You can repeat these directives for all multipartRelated MIME attachments you want to associate with the service operation input and output. 🔝 [Back to table of contents](#) ## Sending and receiving MTOM attachments {#MTOMsendingreceiving} A receiver must be informed to recognize MTOM attachments by setting the `#SOAP_ENC_MTOM` flag of the `::soap` context. Otherwise, the regular MIME attachment mechanism (SwA) will be used to store attachments. When using wsdl2h to build clients and/or services, you should use the `typemap.dat` file included in the gSOAP source code package. The `typemap.dat` file defines the XOP namespace and XML MIME namespaces as imported namespaces: xop = xmime5 = xmime4 = The wsdl2h tool uses the `typemap.dat` file to convert WSDL into an interface header file. In this case we don't want the wsdl2h tool to read the XOP schema and translate it, since we have a pre-defined `::_xop__Include` element to handle XOP for MTOM. This `::_xop__Include` element is defined in `xop.h`. Therefore, the bindings shown above will not translate the XOP and XML MIME schemas to code, but generates `#import` statements instead in the generated interface header file: ~~~{.cpp} #import "xop.h" #import "xmime5.h" ~~~ The `#import` statements are only added for those namespaces that are actually used. Let's take a look at an example. The wsdl2h importer generates a header file with `#import "xop.h"` from a WSDL that references XOP, for example: ~~~{.cpp} #import "xop.h" #import "xmime5.h" struct ns__Data { _xop__Include xop__Include; @ char *xmime5__contentType; }; ~~~ Suppose the WSDL defines an operation: ~~~{.cpp} int ns__echoData(struct ns__Data *in, struct ns__Data *out); ~~~ After generating the stub functions with the soapcpp2 tool, we can invoke the stub at the client side with: ~~~{.cpp} struct soap *soap = soap_new1(SOAP_ENC_MTOM); struct ns__Data data; data.xop__Include.__ptr = (unsigned char*)"Hello world!"; data.xop__Include.__size = 20; data.xop__Include.id = NULL; // CID automatically generated by engine data.xop__Include.type = "text/html"; // MIME type data.xop__Include.options = NULL; // no descriptive info added data.xmime5__contentType = "text/html"; // MIME type if (soap_call_ns__echoData(soap, endpoint, action, &data, &data)) soap_print_fault(soap, stderr); else printf("Got data\n"); soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~ Note that the `xop__Include.type` member must be set to transmit MTOM attachments, otherwise inline base64 XML will be sent. At the server side, we show an example of an operation handler that just copies the input data to output: ~~~{.cpp} int ns__echoData(struct soap *soap, struct ns__Data *in, struct ns__data *out) { *out = *in; return SOAP_OK; } ~~~ The server must use the `#SOAP_ENC_MTOM` flag to initialize the `::soap` context to receive and send MTOM attachments. 🔝 [Back to table of contents](#) ## Streaming MIME/MTOM {#MTOMstreaming} Streaming MIME/MTOM is achieved with callback functions to fetch and store data during transmission. Three function callbacks for streaming MIME/MTOM output and three callbacks for streaming MIME/MTOM input are available. * `void *(*soap.fmimereadopen)(struct soap *soap, void *handle, const char *id, const char *type, const char *description)` This callback is called by the engine to start sending a streaming MIME/MTOM attachment. This callback opens a stream to start reading the attachment data to send. The actual data stream will be read in chunks using the `::soap::fmimeread` callback until no more data is available and the `::soap::fmimereadclose` callback is called to close the stream. The `handle` parameter contains the value of the `__ptr` member variable of the attachment struct/class with data (e.g. `::xsd__base64Binary` or `::_xop__Include` with `__ptr`, `__size`, `id`, `type` and `options` members), which should be a pointer to specific information such as a file descriptor or a pointer to a some application-specific data to be passed to this callback. Both the `__ptr` and `__size` members of the attachment struct/class should have been set by the application prior to the serialization of the message with attachments. If the `__size` is zero and HTTP chunking is enabled (with `#SOAP_IO_CHUNK`), then chunked MIME/MTOM attachments are sent, see `::soap::fmimeread`. The `id`, `type` and `options` parameters are the `id` (an optional ID), `type` (a MIME type) and `options` (a descriptive string) of the attachment struct/class, respectively, of which at least one member should be non-NULL. The callback should return the `handle` parameter value or another pointer value, which is passed as the new `handle` parameter to `::soap::fmimeread` and `::soap::fmimereadclose` callbacks. When an error occurred in this callback, the callback should return NULL and set `::soap::error` to an error code, e.g. using `::soap_receiver_fault`. The callback may return NULL and set `::soap::error` to `#SOAP_OK` when this specific MIME/MTOM attachment should not to be streamed and the engine will simply skip it. * `size_t (*soap.fmimeread)(struct soap *soap, void *handle, char *buf, size_t len)` This callback is called by the engine to read a chunk of attachment data to transmit. The `handle` parameter contains the handle returned by the `::soap::fmimereadopen` callback. The `buf` parameter is the buffer of length `len` into which a chunk of data should be written by the callback. The actual amount of data written into the buffer may be less than `len` and this actual amount should be returned by the callback. A return value of zero indicates an error and `::soap::error` should be set. The `__size` member variable of the attachment struct/class with data (e.g. `::xsd__base64Binary` or `::_xop__Include` with `__ptr`, `__size`, `id`, `type` and `options` members) should be set by the application prior to the serialization of the message with attachments. The value of `__size` indicates the total size of the attachment data to be transmitted. If the `__size` member variable is zero and HTTP chunking is enabled (with `#SOAP_IO_CHUNK`), then MIME/MTOM chunked transfers are activated by the engine, which is more flexible since the attachment data size does not need to be determined in advance. To use MIME/MTOM chunked transfers, enable HTTP chunking with `#SOAP_IO_CHUNK` (also `#SOAP_IO_STORE` can be used, but this buffers the entire message in memory before transmission) and set the `__size` member variable of the attachment struct/class to zero. When MIME/MTOM attachment chunking is enabled, this callback should completely fill the `buf` buffer with `len` bytes unless the last data chunk is reached and fewer bytes are returned. * `void (*soap.fmimereadclose)(struct soap *soap, void *handle)` This callback is called by the engine to close the MIME/MTOM attachment stream after reading. The `handle` parameter contains the handle returned by the `::soap::fmimereadopen` callback. * `void *(*soap.fmimewriteopen)(struct soap *soap, void *handle, const char *id, const char *type, const char *description, enum soap_mime_encoding encoding)` Called by the to start receiving a streaming MIME/MTOM attachment. This callback opens a stream to start writing the attachment data received. The actual data stream will be written in chunks using the `::soap::fmimewrite` callback until no more data is available and the `::soap::fmimewriteclose` callback is called to close the stream. The `id`, `type` and `options` parameters are the `id`, `type` and `options` of the attachment struct/class (e.g. `::xsd__base64Binary` or `::_xop__Include` with `__ptr`, `__size`, `id`, `type` and `options` members), respectively. The callback should return a handle, which is passed to the `::soap::fmimewrite` and `::soap::fmimewriteclose` callbacks. The `__ptr` member variable of the attachment struct/class is set by the engine to the value of this handle. The `__size` member variable is set to the size of the attachment received. * `int (*soap.fmimewrite)(struct soap *soap, void *handle, const char *buf, size_t len)` This callback is called by the engine to write a chunk of attachment data received. The `handle` parameter contains the handle returned by the `::soap::fmimewriteopen` callback. The `buf` parameter contains the data of length `len`. Returns `#SOAP_OK` or a `::soap_status` (int) error code. * `void (*soap.fmimewriteclose)(struct soap *soap, void *handle)` This callback is called by the engine to close the MIME/MTOM attachment stream after writing. The `handle` parameter contains the handle returned by the `::soap::fmimewriteopen` callback. In addition, a `void* ::soap::user` member is available to pass user-defined data to the callbacks. This way, you can set `void* ::soap::user` to point to application data that the callbacks need such as a file name for example. The following example illustrates the client-side initialization of an image attachment struct to stream a file into a MTOM attachment without HTTP chunking (HTTP streaming chunked MTOM transfer is presented in Section \ref mimechunking ): ~~~{.cpp} int main() { struct soap soap; struct xsd__base64Binary image; FILE *fd; struct stat sb; soap_init1(&soap, SOAP_ENC_MTOM); // mandatory to enable MTOM if (!fstat(fileno(fd), &sb) && sb.st_size > 0) { // because we can get the length of the file, we can stream it without chunking soap.fmimereadopen = mime_read_open; soap.fmimereadclose = mime_read_close; soap.fmimeread = mime_read; image.__ptr = (unsigned char*)fd; // must set to non-NULL (this is our fd handle which we need in the callbacks) image.__size = sb.st_size; // must set size } else { // don't know the size, so buffer it size_t i; int c; image.__ptr = (unsigned char*)soap_malloc(&soap, MAX_FILE_SIZE); for (i = 0; i < MAX_FILE_SIZE; i++) { if ((c = fgetc(fd)) == EOF) break; image.__ptr[i] = c; } fclose(fd); image.__size = i; } image.type = "image/jpeg"; // MIME type image.options = "This is my picture"; // description of object if (soap_call_ns__webmethod(&soap, ...)) ... // error else ... // success } void *mime_read_open(struct soap *soap, void *handle, const char *id, const char *type, const char *description) { return handle; } void mime_read_close(struct soap *soap, void *handle) { fclose((FILE*)handle); } size_t mime_read(struct soap *soap, void *handle, char *buf, size_t len) { return fread(buf, 1, len, (FILE*)handle); } ~~~ The following example illustrates the streaming of a MIME/MTOM attachment into a file by a client: ~~~{.cpp} int main() { struct soap soap; soap_init(&soap); soap.fmimewriteopen = mime_write_open; soap.fmimewriteclose = mime_write_close; soap.fmimewrite = mime_write; if (soap_call_ns__webmethod(&soap, ...)) ... // error else ... // success } void *mime_write_open(struct soap *soap, const char *id, const char *type, const char *description, enum soap_mime_encoding encoding) { FILE *handle = fopen("somefile", "wb"); // We ignore the MIME content transfer encoding here, but should check if (!handle) { soap->error = SOAP_EOF; soap->errnum = errno; // get reason } return (void*)handle; } void mime_write_close(struct soap *soap, void *handle) { fclose((FILE*)handle); } int mime_write(struct soap *soap, void *handle, const char *buf, size_t len) { size_t nwritten; while (len) { nwritten = fwrite(buf, 1, len, (FILE*)handle); if (!nwritten) { soap->errnum = errno; // get reason return SOAP_EOF; } len -= nwritten; buf += nwritten; } return SOAP_OK; } ~~~ Message compression with `#SOAP_ENC_ZLIB` can be used with MIME to compress the entire message. However, compression requires buffering to determine the HTTP content length header, which cancels the benefits of streaming MIME. To avoid this, you should use chunked HTTP (with the output-mode `#SOAP_IO_CHUNK` flag) with compression and streaming MIME. At the server side, when you set `#SOAP_IO_CHUNK` before calling `::soap_serve`, the engine will automatically revert to buffering (`#SOAP_IO_STORE` flag is set). You can check this flag with `(soap->omode & SOAP_IO) == SOAP_IO_CHUNK` to see if the client accepts chunking. More information about streaming chunked MIME can be found in Section \ref mimechunking .. Note that the example above for `mime_read` uses a handle that points to the open file `FILE*`. The simple example above is not recommended when the platform imposes a limit on the number of open file descriptors. You can use the handle to pass along more information than just the file descriptor. So for example, when the number of open file descriptors is limited on your platform, you should let the handle point to a structure with file-related information. The C++ example below illustrates this: ~~~{.cpp} file.xop__Include = soap_new__xop__Include(soap); file.xop__Include->id = NULL; file.xop__Include->type = type; file.xop__Include->options = NULL; file.xmime5__contentType = type; file.filename = filename; // The object holding all information to read data FileStreamIn *ins = new FileStreamIn(errorhandler); ins->setFilePath(path); ins->setFileName(filename); file.xop__Include->__size = size; file.xop__Include->__ptr = (unsigned char*)ins; ~~~ To read the MTOM data for transmission: ~~~{.cpp} void *mime_read_open(struct soap *soap, void *handle, const char *id, const char *type, const char *description) { if (!handle) return NULL; FileStreamIn *ins = (FileStreamIn*)handle; if (!ins->open()) { soap->error = SOAP_ERR; return NULL; } return handle; } void mime_read_close(struct soap *soap, void *handle) { if (!handle) return; FileStreamIn *ins = (FileStreamIn*)handle; delete ins; } size_t mime_read(struct soap *soap, void *handle, char *buf, size_t len) { if (!handle) return 0; FileStreamIn *ins = (FileStreamIn*)handle; size_t nread = ins->read(buf, len); if (ins->streamError()) { soap->error = ins->streamError(); return 0; } return nread; } ~~~ 🔝 [Back to table of contents](#) ## Redirecting inbound MIME/MTOM streams based on SOAP body content {#MTOMpoststreaming} When it is preferable or required to redirect inbound MIME/MTOM attachment streams based on SOAP message body content, where for example the names of the resources are listed in the SOAP message body, an alternative mechanism must be used to handle the attachments. This mechanism can be used at the client and server side. Because the routing of the streams is accomplished with explicit function calls, this method should only be used when required and should not be considered optional. That is, when you enable this method, you must check for pending MIME/MTOM attachments and handle them appropriately. This is true even when you don't expect MIME/MTOM attachments in the payload, because the peer may trick you by sending attachments anyway and you should be prepared to accept or reject them. The explicit MIME/MTOM streaming mechanism consists of three API functions: * `void soap_post_check_mime_attachments(struct soap *soap)` This function enables post-processing of MIME/MTOM attachments received. This means that the presence of MIME/MTOM attachments must be explicitly checked and retrieved by calling `::soap_check_mime_attachments` and when successful `::soap_recv_mime_attachment` should be called to retrieve each attachment. * `int soap_check_mime_attachments(struct soap *soap)` This function checks the presence of a MIME/MTOM attachment after calling a service operation by returning nonzero when attachments are present. Returns nonzero if attachments are present. Requires `::soap_post_check_mime_attachments`. * `struct soap_multipart *soap_recv_mime_attachment(struct soap *soap, void *handle)` This function parses an attachment and invokes the MIME callbacks when set. The `handle` parameter is passed to `fmimewriteopen`. The handle may contain any data that is extracted from the SOAP message body to guide the redirection of the stream in the callbacks. Returns a struct with a `char *ptr` member that contains the handle value returned by the `fmimewriteopen` callback, and `char *id`, `char *type`, and `char *description` member variables with the MIME id, type, and description info when present in the attachment. Example client in C: ~~~{.cpp} struct soap *soap = soap_new1(SOAP_ENC_MTOM); soap_post_check_mime_attachments(soap); if (soap_call_ns__myMethod(soap, ...)) { soap_print_fault(soap, stderr); // an error occurred } else { if (soap_check_mime_attachments(soap)) { // attachments are present, channel is still open do { ... // get data 'handle' from SOAP response and pass to callbacks ... // set the fmime callbacks, if needed struct soap_multipart *content = soap_recv_mime_attachment(soap, (void*)handle); printf("Received attachment with id=%s and type=%s\n", content->id?content->id:"", content->type?content->type:""); } while (content); if (soap->error) soap_print_fault(soap, stderr); } } soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~ The server-side service operations are implemented as usual, but with additional checks for MIME/MTOM attachments: ~~~{.cpp} int main() { struct soap *soap = soap_new1(SOAP_ENC_MTOM); soap_post_check_mime_attachments(soap); soap_serve(soap); } int ns__myMethod(struct soap *soap, ...) { ... // server-side processing logic if (soap_check_mime_attachments(soap)) { // attachments are present, channel is still open do { ... // get data 'handle' from SOAP request and pass to callbacks ... // set the fmime callbacks, if needed struct soap_multipart *content = soap_recv_mime_attachment(soap, (void*)handle); printf("Received attachment with id=%s and type=%s\n", content->id?content->id:"", content->type?content->type:""); } while (content); if (soap->error) return soap->error; } ... // server-side processing logic return SOAP_OK; } ~~~ 🔝 [Back to table of contents](#) ## Streaming chunked MIME/MTOM {#mimechunking} To send MIME/MTOM attachments, the attachment sizes must be determined in advance to calculate HTTP message length required to stream MIME/MTOM over HTTP. However, chunked MIME/MTOM together with chunked HTTP can be used to omit this step. First set the `#SOAP_IO_CHUNK` flag. Then, to stream chunked MIME/MTOM, set the `__size` member of an attachment to zero and enable MIME/MTOM chunking. The MIME/MTOM `::soap::fmimeread` callback then fetches data in chunks and it is important to fill the entire buffer unless the end of the data has been reached and the last chunk is to be send. That is, `::soap::fmimeread` should return the value of the last `len` parameter and fill the entire buffer `buf` for all chunks except the last. For the last it returns 0. 🔝 [Back to table of contents](#) # SOAP/XML over UDP {#UDP} UDP is a simple, unreliable datagram protocol: UDP sockets are connectionless. UDP address formats are identical to those used by TCP. In particular UDP provides a port identifier in addition to the normal Internet address format. The UDP port space is separate from the TCP port space (i.e. a UDP port may not be "connected" to a TCP port). In addition broadcast packets may be sent (assuming the underlying network supports this) by using a reserved "broadcast address"; this address is network interface dependent. Client-side messages with SOAP-over-UDP endpoint URLs (`soap.udp://...`) are automatically transmitted as datagrams. Server-side applications should set the `#SOAP_IO_UDP` mode flag to accept UDP requests, e.g. using `::soap_new1`, `::soap_init1`, or `::soap_set_mode`. The maximum message length for datagram packets is restricted by the buffer size `#SOAP_BUFLEN`, which is 65536 by default, unless compiled with `#WITH_LEAN` to support small-scale embedded systems. For UDP transport `#SOAP_BUFLEN` must not exceed the maximum UDP packet size 65536 (the size of datagram messages is constrained by the UDP packet size 2^16=65536 as per UDP standard). You can use compression with `#SOAP_ENC_ZLIB` to reduce the message size, but note that compressed SOAP-over-UDP is a gSOAP-specific feature because it is not part of the SOAP-over-UDP specification. The SOAP-over-UDP specification relies on WS-Addressing. The `wsa.h` file in the `import` directory defines the WS-Addressing elements for client and server applications. The gSOAP implementation conforms to the SOAP-over-UDP requirements: * SOAP-over-UDP server endpoint URL format: `soap.udp://host:port/path` * Support one-way message-exchange pattern (MEP) where a SOAP envelope is carried in a user datagram. * Support request-response message-exchange pattern (MEP) where SOAP envelopes are carried in user datagrams. * Support multicast transmission of SOAP envelopes carried in user datagrams. * Support both SOAP 1.1 and SOAP 1.2 envelopes. The following additional features are also available, but are not supported by the SOAP-over-UDP specification: * Zlib/gzip message compression (use compile-time flag `#WITH_GZIP`). * SOAP with DIME attachments over UDP. * SOAP with MIME/MTOM attachments over UDP. * Support for IPv6 (use compile-time flag `#WITH_IPV6`) 🔝 [Back to table of contents](#) ## Using WS-Addressing with SOAP-over-UDP {#wsaudp} A SOAP-over-UDP application may use WS-Addressing to control message delivery as per SOAP-over-UDP specification. The `wsa.h` file in the `import` directory defines the WS-Addressing elements. To include the WS-Addressing elements in the SOAP Header for messaging, a WS-Addressing capable `::SOAP_ENV__Header` struct should be defined in your header file by importing `gsoap/import/wsa.h` or `gsoap/import/wsa5.h`: ~~~{.cpp} #import "wsa.h" ~~~ We also included a `//gsoap wsa schema import:` directive in the `wsa.h` file to enable the generation of WSDL specifications that import (instead of includes) the WS-Addressing elements. Note that the `//gsoapopt w` directive (which adds option `-w` to run `soapcpp2 -w`) must not be present in your header file to enable WSDL generation. One-way SOAP-over-UDP messages (see Section \ref oneway1 ) should be declared to include the `wsa:MessageID`, `wsa:To`, and `wsa:Action` elements in the SOAP Header of the request message as follows: ~~~{.cpp} //gsoap ns service method-header-part: sendString wsa__MessageID //gsoap ns service method-header-part: sendString wsa__To //gsoap ns service method-header-part: sendString wsa__Action int ns__sendString(char *str, void); ~~~ Request-response SOAP-over-UDP messages should be declared to include the `wsa:MessageID`, `wsa:To`, `wsa:Action`, and `wsa:ReplyTo` elements in the SOAP Header of the request message, and the the `wsa:MessageID`, `wsa:To`, `wsa:Action`, and `wsa:RelatesTo` elements in the SOAP Header of the response message: ~~~{.cpp} //gsoap ns service method-header-part: echoString wsa__MessageID //gsoap ns service method-header-part: echoString wsa__To //gsoap ns service method-header-part: echoString wsa__Action //gsoap ns service method-input-header-part: echoString wsa__ReplyTo //gsoap ns service method-output-header-part: echoString wsa__RelatesTo int ns__echoString(char *str, char **res); ~~~ For the content requirements of these elements, please consult the SOAP-over-UDP specification and/or read the next sections explaining SOAP-over-UDP unicast, multicast, one-way, and request-response client and server applications. 🔝 [Back to table of contents](#) ### Client-side one-way UDP unicast {#unicast} This example assumes that the interface header file includes the SOAP Header with WS-Addressing elements, see \ref wsaplugin, and the `ns__sendString` function discussed in Section \ref wsaudp. ~~~{.cpp} #include "plugin/wsaapi.h" struct soap soap; soap_init(&soap); soap_register_plugin(&soap, soap_wsa); soap.send_timeout = 5; // 5 seconds max socket delay // set up WS-Addressing header soap_wsa_request(&soap, "message ID", "endpoint", "SOAP action"); // Send the message over UDP: if (soap_send_ns__echoString(&soap, "soap.udp://endpoint", "SOAP action", "hello world!")) soap_print_fault(&soap, stderr); // error soap_end(&soap); soap_destroy(&soap); soap_done(&soap); ~~~ 🔝 [Back to table of contents](#) ### Client-side one-way UDP multicast {#multicast} This example is similar to the one-way unicast example discussed above, but uses a broadcast address and the `SO_BROADCAST` socket option: ~~~{.cpp} #include "plugin/wsaapi.h" struct soap soap; in_addr_t addr = inet_addr("1.2.3.4"); // optional soap_init(&soap); soap_register_plugin(&soap, soap_wsa); soap.send_timeout = 5; // 5 seconds max socket delay soap.connect_flags = SO_BROADCAST; // required for broadcast soap.ipv4_multicast_if = &addr; // optional for IPv4: see setsockopt IPPROTO_IP IP_MULTICAST_IF soap.ipv6_multicast_if = addr; // optional for IPv6: multicast sin6_scope_id soap.ipv4_multicast_ttl = 1; // optional, see setsockopt IPPROTO_IP, IP_MULTICAST_TTL // set up WS-Addressing header soap_wsa_request(&soap, "message ID", "endpoint", "SOAP action"); // Send the message over UDP to a broadcast address: if (soap_send_ns__echoString(&soap, "soap.udp://endpoint", "SOAP action", "hello world!")) soap_print_fault(&soap, stderr); // report error soap_destroy(&soap); soap_end(&soap); soap_done(&soap); ~~~ Please refer to the socket options for `IPPROTO_IP` `IP_MULTICAST_IF` to specify the default interface for multicast datagrams to be sent from. This is a `struct in_addr` (`in_addr_t` for `sin6_scope_id`) interface value. Otherwise, the default interface set by the system administrator will be used (if any). Please refer to the socket options for `IPPROTO_IP` `IP_MULTICAST_TTL` to limit the lifetime of the packet. Multicast datagrams are sent with a default value of 1, to prevent them to be forwarded beyond the local network. This parameter can be set between 1 to 255. 🔝 [Back to table of contents](#) ### Client-side request-response UDP unicast {#requestresponseunicast} This example assumes that the interface header file for soapcpp2 includes the SOAP Header with WS-Addressing elements imported with `#import "wsa.h"` and the `ns__echoString` function discussed in Section \ref wsaudp . ~~~{.cpp} #include "plugin/wsaapi.h" struct soap soap; struct wsa__EndpointReferenceType replyTo; // (anonymous) reply address char *res; // server response soap_init(&soap); soap_register_plugin(&soap, soap_wsa); soap.send_timeout = 5; // 5 seconds max socket delay soap.recv_timeout = 5; // 5 seconds max socket delay // set up WS-Addressing header soap_wsa_request(&soap, "message ID", "endpoint", "SOAP action"); soap_wsa_add_ReplyTo(&soap, NULL); // anonymous ReplyTo address // Send and receive messages over UDP: if (soap_call_ns__echoString(&soap, "soap.udp://endpoint "SOAP action", "hello world!", &res)) { if (soap.error == SOAP_EOF && soap.errnum == 0) ... // Timeout: no response from server (message already delivered?) else soap_print_fault(&soap, stderr); } else ... // UDP server response is stored in 'res' // check SOAP header received, if applicable check_header(&soap.header); soap_destroy(&soap); soap_end(&soap); soap_done(&soap); ~~~ 🔝 [Back to table of contents](#) ### Client-side request-response multicast {#requestresponsemulticast} This example is similar to the request-response unicast example discussed above, but uses a broadcast address and the `SO_BROADCAST` socket option. Because we expect to receive multiple responses, we also need to use separate request-response messages to send one request and consume multiple responses. In this example we defined a `bcastString` request and a `bcastStringResponse` response message, which are essentially declared as one-way messages in the header file: ~~~{.cpp} //gsoap ns service method-header-part: bcastString wsa__MessageID //gsoap ns service method-header-part: bcastString wsa__To //gsoap ns service method-header-part: bcastString wsa__Action //gsoap ns service method-header-part: bcastString wsa__ReplyTo int ns__bcastString(char *str, void); //gsoap ns service method-header-part: bcastStringResponse wsa__MessageID //gsoap ns service method-header-part: bcastStringResponse wsa__To //gsoap ns service method-header-part: bcastStringResponse wsa__Action //gsoap ns service method-header-part: bcastStringResponse wsa__RelatesTo int ns__bcastStringResponse(char *res, void); ~~~ To obtain response one-way operations, use [`wsdl2h -b` option `-b`](#wsdl2h-b). The client code includes a loop to receive response messages until a timeout occurs: ~~~{.cpp} #include "plugin/wsaapi.h" struct soap soap; struct SOAP_ENV__Header header; struct wsa__EndpointReferenceType replyTo; char *res; soap_init(&soap); soap_register_plugin(&soap, soap_wsa); soap.connect_flags = SO_BROADCAST; soap.send_timeout = 5; // 5 seconds max socket delay soap.recv_timeout = 5; // 5 seconds max socket delay // set up WS-Addressing header soap_wsa_request(&soap, "message ID", "endpoint", "SOAP action"); soap_wsa_add_ReplyTo(&soap, NULL); // anonymous ReplyTo address if (soap_send_ns__bcastString(&soap, "soap.udp://endpoint", "SOAP action", "hello world!")) { soap_print_fault(&soap, stderr); } else { while (1) { if (soap_recv_ns__bcastStringResponse(&soap, &res)) break; ... // Got response 'res' from a server } if (soap.error == SOAP_EOF && soap.errnum == 0) ... // Timeout: no more messages received else soap_print_fault(&soap, stderr); } soap_destroy(&soap); soap_end(&soap); soap_done(&soap); ~~~ Note that a server for the `bcastString` does not need to use two-one way messages. Thus, multicast request-response message pattern can be declared and implemented as request-response operations at the server side. 🔝 [Back to table of contents](#) ## SOAP-over-UDP server {#soapoverudp} The following example code illustrates a SOAP-over-UDP server for one-way `sendString` and request-response `echoString` messages. This example assumes that the interface header file includes the SOAP Header with WS-Addressing elements imported with `#import "wsa.h"` and the `ns__echoString` function discussed in Section \ref wsaudp . ~~~{.cpp} #include "plugin/wsaapi.h" int main() { struct soap soap; soap_init1(&soap, SOAP_IO_UDP); // must set UDP flag soap_register_plugin(&soap, soap_wsa); // bind to host (NULL = current host) and port: if (!soap_valid_socket(soap_bind(&soap, host, port, BACKLOG))) { soap_print_fault(&soap, stderr); exit(EXIT_FAILURE); } while (1) { if (soap_serve(&soap)) soap_print_fault(&soap, stderr); // report the problem soap_destroy(&soap); soap_end(&soap); } soap_done(&soap); // close connection } int ns__echoString(struct soap *soap, char *str, char **res) { // check if WS-Addressing headers are present and correct if (soap_wsa_check(soap)) return soap->error; // should check for duplicate messages (something that WS-ReliableMessaging does too) if (check_received(soap->header->wsa__MessageID)) { // Request message already received return SOAP_STOP; // don't return response } *res = str; // return OK with WS-Addressing reply headers, message ID is id_count+1 return soap_wsa_reply(soap, soap_int2s(soap, id_count++), "http://genivia.com/udp/echoStringResponse"); } int ns__sendString(struct soap *soap, char *str) { if (soap_wsa_check(soap)) return soap->error; // should check for duplicate messages if (check_received(soap->header->wsa__MessageID)) { // Request message already received return SOAP_STOP; } return SOAP_OK; } int ns__sendStringResponse(struct soap *soap, char *res) { return SOAP_NO_METHOD; // we don't serve this operation } ~~~ The server binds to a host and port and accepts messages in a loop. Because UDP does not have the equivalent of an accept, the messages cannot be dispatched to threads. Instead the `::soap_serve` waits for a message and immediately accepts it. You can use a receive timeout value for `::soap::recv_timeout` to make `::soap_serve` non-blocking. To obtain response one-way operations from a WSDL, use [`wsdl2h -b` option `-b`](#wsdl2h-b). This produces additional one-way operations to support asynchronous handling of response messages in the same way requests are handled. 🔝 [Back to table of contents](#) ### SOAP-over-UDP multicast receiving server {#soapoverudpmulticast} For UDP multicast support, follow the suggestions in Section \ref soapoverudp and change the initialization parts of the code to enable UDP multicast port binding by to telling the kernel which multicast groups you are interested in: ~~~{.cpp} #include "plugin/wsaapi.h" int main() { struct soap soap; struct ip_mreq mcast; soap_init1(&soap, SOAP_IO_UDP); soap_register_plugin(&soap, soap_wsa); if (!soap_valid_socket(soap_bind(&soap, host, port, BACKLOG))) { soap_print_fault(&soap, stderr); exit(EXIT_FAILURE); } mcast.imr_multiaddr.s_addr = inet_addr(put IP multicast address of group here); mcast.imr_interface.s_addr = htonl(INADDR_ANY); if (setsockopt(soap.master, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mcast, sizeof(mcast))<0) ... // error ... // soap_destroy(&soap); soap_end(&soap); soap_done(&soap); } ~~~ 🔝 [Back to table of contents](#) # Compile-time flags {#compilerflags} The following macros are defined in the API documentation Module \ref group_with. These macros are used to enable or disable features as specified below, by compiling source code files with compiler option `-D` to set the macro: define | result ----------------------------- | ------ `#SOAPDEFS_H` | the header file to include, if different from `soapdefs.h` `#WITH_SOAPDEFS_H` | includes the `soapdefs.h` file for custom settings, see Section \ref soapdefs `#WITH_COMPAT` | removes dependency on C++ stream libraries and C++ exceptions `#WITH_LEAN` | creates a small-footprint executable, see Section \ref lean `#WITH_LEANER` | creates an even smaller footprint executable, see Section \ref lean `#WITH_FAST` | use faster memory allocation when used with `#WITH_LEAN` or `#WITH_LEANER` `#WITH_COOKIES` | enables HTTP cookies, see Sections \ref clientcookie and \ref servercookie `#WITH_INSECURE_COOKIES` | enables HTTP cookies and allows cookies with their Secure flag set to be sent over insecure channels `#WITH_IPV6` | enables IPv6 support `#WITH_IPV6_V6ONLY` | enables IPv6 support with IPv6-only server option `#WITH_OPENSSL` | enables OpenSSL, see Sections \ref clientopenssl and \ref serveropenssl `#WITH_GNUTLS` | enables GNUTLS, see Sections \ref clientopenssl and \ref serveropenssl `#WITH_GZIP` | enables gzip and deflate compression, see Section \ref compression `#WITH_ZLIB` | enables deflate compression only, see Section \ref compression `#WITH_NTLM` | enables NTLM support `#WITH_C_LOCALE` | force the use locale functions when available to ensure locale-independent number conversions `#WITH_NO_C_LOCALE` | remove the use of locale functions to improve portability `#WITH_INCLUDE_XLOCALE_H` | force the inclusion of `` to define `locale_t` and `_l` functions, to improve portability `#WITH_DOM` | enable DOM parsing in the engine, required by the WS-Security plugin `#WITH_REPLACE_ILLEGAL_UTF8` | enable strict UTF-8, replaces UTF-8 content that is outside the allowed range with U+FFFD `#WITH_FASTCGI` | enables FastCGI, see Section \ref fastcgi `#WITH_NOIO` | removes IO operations, to eliminate the use of BSD sockets, see Section \ref noio `#WITH_NOIDREF` | removes id and href/ref multi-reference data, more aggressive than using the `#SOAP_XML_TREE` runtime flag `#WITH_NOHTTP` | removes the HTTP stack to reduce code size `#WITH_NOZONE` | disables and ignores the timezone in `xsd:dateTime` values `#WITH_NOEMPTYNAMESPACES` | disables xmlns="" default empty namespaces from XML messages `#WITH_NOEMPTYSTRUCT` | inserts a dummy member in empty structs to allow compilation `#WITH_NOGLOBAL` | omit SOAP Header and Fault serialization code, prevents duplicate definitions with generated soapXYZLib code `#WITH_NONAMESPACES` | disables dependence on global `namespaces` table, a table must be set explicitly with `::soap_set_namespaces` see also Section \ref nstable `#WITH_CDATA` | retains the parsed CDATA sections in literal XML strings `#WITH_PURE_VIRTUAL` | enables C++ abstract service classes with pure virtual methods, requires soapcpp2 option `-i` or `-j` `#WITH_DEFAULT_VIRTUAL` | enables C++ base service classes with default virtual methods returning fault `#SOAP_NO_METHOD`, requires soapcpp2 option `-i` or `-j` `#WITH_CASEINSENSITIVETAGS` | enables case insensitive XML parsing `#WITH_SOCKET_CLOSE_ON_EXIT` | prevents a server port from staying in listening mode after exit by internally setting `fcntl(sock, F_SETFD, FD_CLOEXEC)` `#WITH_TCPFIN` | enables TCP FIN after sends when socket is ready to close `#WITH_SELF_PIPE` | enables a "self pipe" to enable the `::soap_close_connection` function (gSOAP 2.8.71 or greater) The following subset of macros are defined in the API documentation Module \ref group_soap. These macros are used to enable or disable features as specified below, by compiling source code files with compiler option `-D` to set the macro: define | result ---------------------------- | ------ `#SOAP_NOTHROW` | expands to `(std::nothrow)` to prevent memory allocation exceptions (`#SOAP_EOM` is used instead), this macro can be changed `#SOAP_BUFLEN` | the length of the internal message buffer, impacts communications performance `#SOAP_HDRLEN` | the maximum length of HTTP headers `#SOAP_TAGLEN` | the maximum length of XML tags and URLs `#SOAP_TMPLEN` | the maximum length of temporary string values, short strings and brief error messages `#SOAP_MAXALLOCSIZE` | the maximum size of a block of memory that `malloc` can allocate `#SOAP_MAXARRAYSIZE` | the maximum allocation threshold to pre-allocate SOAP arrays in memory `#SOAP_MAXDIMESIZE` | the maximum DIME attachment size allowed to receive `#SOAP_MAXEINTR` | maximum number of EINTR interrupts to ignore while polling a socket for pending activity `#SOAP_MAXINFLATESIZE` | trusted inflated content size (1 MB by default) `#SOAP_MAXKEEPALIVE` | maximum iterations in the `::soap_serve` loop on HTTP keep-alive connections `#SOAP_MAXLENGTH` | maximum string content length for strings not already constrained by XML schema validation constraints `#SOAP_MAXLEVEL` | maximum XML nesting depth level permitted by the XML parser `#SOAP_MAXOCCURS` | maximum number of array or container elements for containers that are not already constrained by XML schema validation constraints `#SOAP_MINDEFLATERATIO` | trusted deflation ratio after `#SOAP_MAXINFLATESIZE` is reached `#SOAP_PURE_VIRTUAL` | set to `= 0` when `#WITH_PURE_VIRTUAL` is defined `#SOAP_SSL_RSA_BITS` | length of the RSA key (2048 by default) `#SOAP_UNKNOWN_CHAR` | an 8 bit integer that represents a character that could not be converted to an ASCII char, i.e. when converting an XML Unicode character `#SOAP_UNKNOWN_UNICODE_CHAR` | integer Unicode value representing a character that replaces an invalid Unicode code point `#SOAP_LONG_FORMAT` | macro that represents the `#LONG64` printf %-format `#SOAP_ULONG_FORMAT` | macro that represents the `#ULONG64` printf %-format `#SOAP_INVALID_SOCKET` | portable invalid socket value, can also use `#soap_valid_socket(sock)` to check if `sock` is valid @warning It is important that any of these macros when defined should be consistently defined when compiling source code files, such as `gsoap/stdsoap2.cpp`, `soapC.cpp`, `soapClient.cpp`, `soapServer.cpp`, and all application source code files that include `gsoap/stdsoap2.h` or `soapH.h`. If the macros are not consistently defined at compile time then the application will likely crash due to a mismatches in the declaration and use of the `::soap` context that is customized by these flags. 🔝 [Back to table of contents](#) ## Using the soapdefs.h header file {#soapdefs} The `soapdefs.h` header file is included in `gsoap/stdsoap2.h` when compiling with compile-time flag `#WITH_SOAPDEFS_H`: c++ -D WITH_SOAPDEFS_H -c stdsoap2.cpp The `soapdefs.h` file allows users to include definitions and add includes without requiring changes to `gsoap/stdsoap2.h`. You can also specify the header file name to include as a macro `SOAPDEFS_H` to override the name `soapdefs.h`: c++ -D SOAPDEFS_H=mydefs.h -c stdsoap2.cpp For example, ~~~{.cpp} // Contents of file "soapdefs.h" #include ~~~ The following header file for soapcpp2 refers to `std::ostream` without soapcpp2 throwing errors, by using `extern` to declare `class std::ostream`: ~~~{.cpp} // std::ostream can't be serialized, but need to be declared to make it visible to gSOAP extern class std::ostream; class ns__myClass { public: virtual void print(std::ostream &s) const; // we need std::ostream here ... // }; ~~~ See also Section \ref transient , non-serializable data types. 🔝 [Back to table of contents](#) # Run-time flags {#flags} The gSOAP engine state is stored in the `::soap` context that is initialized and controlled by various optional runtime flags. Most flags are applicable to either processing input or to processing output, but some are applicable to both input and output message and document processing. Furthermore, these flags are divided into four categories: transport (IO), content encoding (ENC), XML parsing and generation (XML), and C/C++ usage (C). The input-mode and output-mode flags for inbound (in) and outbound (out) message processing are: mode flag | in/out | result --------------------- | ------ | ------ `#SOAP_IO_FLUSH` | out | flush output immediately `#SOAP_IO_BUFFER` | out | enable output buffering, the default mode for socket connections `#SOAP_IO_STORE` | out | store the entire outbound message to calculate HTTP content length `#SOAP_IO_CHUNK` | out | enable HTTP chunking `#SOAP_IO_LENGTH` | out | used with two-phase serialization, first phase with this flag to calculate HTTP content length `#SOAP_IO_KEEPALIVE` | in+out | keep socket connections alive, when supported by the HTTP peer `#SOAP_IO_UDP` | in+out | use UDP (datagram) transport, maximum message length is `#SOAP_BUFLEN` `#SOAP_ENC_PLAIN` | in+out | use plain messages without parsing or emitting HTTP headers `#SOAP_ENC_XML` | | alias for `#SOAP_ENC_PLAIN` `#SOAP_ENC_DIME` | out | use DIME encoding, automatic when DIME attachments are used `#SOAP_ENC_MIME` | out | use MIME encoding instead of DIME, activated using `::soap_set_mime` `#SOAP_ENC_MTOM` | out | use MTOM XOP attachments instead of DIME and MIME `#SOAP_ENC_ZLIB` | out | compress output with Zlib, using deflate or gzip format `#SOAP_ENC_SSL` | in+out | use SSL/TLS, automatic when connecting "https:" endpoints `#SOAP_XML_INDENT` | out | output indented XML and JSON `#SOAP_XML_CANONICAL` | out | output canonical XML `#SOAP_XML_DEFAULTNS` | out | output XML with default namespace bindings `xmlns="..."` `#SOAP_XML_IGNORENS` | in | ignores XML namespaces in XML input `#SOAP_XML_STRICT` | in | apply strict validation of XML input `#SOAP_XML_TREE` | in+out | out: serialize data as XML trees (no multi-ref, duplicate data when necessary); in: ignore id attributes (do not resolve id-ref) `#SOAP_XML_GRAPH` | out | serialize application data as an XML graph with multi-ref id/ref attributes `#SOAP_XML_NIL` | out | serialize NULL data as xsi:nil attributed elements `#SOAP_XML_NOTYPE` | out | disable `xsi:type` attributes `#SOAP_C_NOIOB` | in | do not fault with `#SOAP_IOB` `#SOAP_C_UTFSTRING` | in+out | serialize 8-bit character strings "as is", meaning 8-bit strings have UTF-8 content `#SOAP_C_MBSTRING` | in+out | enable multibyte character support for 8-bit character strings `#SOAP_C_NILSTRING` | out | serialize empty strings as xsi:nil attributed elements All flags are independent and can be combined using a bitwise or (`|`), except for `#SOAP_IO_FLUSH`, `#SOAP_IO_BUFFER`, `#SOAP_IO_STORE`, and `#SOAP_IO_CHUNK` which are enumerations and only one of these I/O flags can be used. Also the XML serialization flags `#SOAP_XML_TREE` and `#SOAP_XML_GRAPH` should not be mixed. To allocate and initialize a `::soap` context with input and output mode flags: ~~~{.cpp} struct soap * soap_new1(soap_mode iomode); struct soap * soap_new2(soap_mode imode, soap_mode omode); ~~~ To initialize a stack-allocated `::soap` context with input and output mode flags: ~~~{.cpp} void soap_init1(struct soap *soap, soap_mode iomode); void soap_init2(struct soap *soap, soap_mode imode, soap_mode omode); ~~~ To set and clear mode flags use: ~~~{.cpp} void soap_set_mode(struct soap *soap, soap_mode iomode); // set input and output mode flags void soap_set_imode(struct soap *soap, soap_mode imode); // set input mode flags void soap_set_omode(struct soap *soap, soap_mode omode); // set output mode flags void soap_clr_mode(struct soap *soap, soap_mode iomode); // clear input and output mode flags void soap_clr_imode(struct soap *soap, soap_mode imode); // clear input mode flags void soap_clr_omode(struct soap *soap, soap_mode omode); // clear output mode flags ~~~ @note The `#SOAP_XML_TREE` mode flag can be used to improve interoperability with SOAP implementations that are not fully SOAP 1.1/1.2 RPC encoding compliant with respect to processing id-href/ref attributes. However, tree serialization will duplicate data when this data is co-referenced. Cycles are detected and broken to avoid infinite serialization. In addition to the context mode flags, the following context flags can be used to set `setsockopt` level `SOL_SOCKET` options when sockets are created, though some options may not be applicable to your operating system: context flag with setsockopt option | result ---------------------------------------- | ------ `::soap::connect_flags` = `SO_NOSIGPIPE` | disables SIGPIPE `::soap::connect_flags` = `SO_DEBUG` | turns on recording of debugging information in the underlying protocol modules `::soap::connect_flags` = `SO_BROADCAST` | permits sending of broadcast messages, for example with UDP, when permitted `::soap::connect_flags` = `SO_LINGER` | sets client-side linger time to the value of `::soap::linger_time` `::soap::connect_flags` = `SO_DONTROUTE` | enables routing bypass for outgoing messages `::soap::accept_flags` = `SO_NOSIGPIPE` | disables SIGPIPE (check your OS, this is not portable) `::soap::accept_flags` = `SO_DEBUG` | turns on recording of debugging information in the underlying protocol modules `::soap::accept_flags` = `SO_LINGER` | sets server-side linger time to the value of `::soap::linger_time` `::soap::accept_flags` = `SO_DONTROUTE` | enables routing bypass for outgoing messages `::soap::bind_flags` = `SO_REUSEADDR` | enables local address reuse immediately, use with caution `::soap::bind_flags` = `SO_REUSEPORT` | enables duplicate address and port bindings For example, when `::soap::accept_flags` is set to `(SO_NOSIGPIPE | SO_LINGER)` this disables SIGPIPE signals and set linger time value given by `::soap::linger_time`, which is zero by default. The `::soap::socket_flags` context flag can be used to pass options to the `` `send`, `sendto`, `recv`, and `recvfrom` calls made by the engine, though some options may not be applicable to your operating system: context flag with sent/recv flags | result ---------------------------------------- | ------ `::soap::socket_flags` = `MSG_NOSIGNAL` | disables SIGPIPE `::soap::socket_flags` = `MSG_DONTROUTE` | enables routing bypass for outgoing messages Furthermore, the `setsockopt` level `SOL_SOCKET` options `SO_SNDBUF` and `SO_RCVBUF` are set the engine when `::soap::sndbuf` and `::soap::rcvbuf` are set to a nonzero value. The default value is `#SOAP_BUFLEN`, which is the same size used by the internal buffer `::soap::buf` to send and receive messages. A zero value omits the internal `setsockopt` call to set these options. Setting these values to zero activates auto-tuning with Linux 2.4 and greater. The `setsockopt` level `SOL_SOCKET` option `SO_KEEPALIVE` is set when keep-alive is enabled with context flag `#SOAP_IO_KEEPALIVE` or when `::soap::tcp_keep_alive` is nonzero. With `::soap::tcp_keep_alive` additional options can be specified with `::soap::tcp_keep_idle`, `::soap::tcp_keep_intvl`, and `::soap::tcp_keep_cnt`. For example: ~~~{.cpp} struct soap *soap = soap_new(); soap->tcp_keep_alive = 1; // setsockopt SO_KEEPALIVE soap->tcp_keep_idle = 30; // time in seconds the connection needs to remain idle before TCP starts sending keepalive probes soap->tcp_keep_intvl = 120; // time in seconds between individual keepalive probes soap->tcp_keep_cnt = 5; // maximum number of keepalive probes TCP should send before dropping the connection ~~~ For UDP messaging, use `#SOAP_IO_UDP`. See also Section \ref UDP. The context flags that can be set at the client side for UDP messaging are `::soap::ipv4_multicast_if`, `::soap::ipv4_multicast_ttl`, and `::soap::ipv6_multicast_if`: context flag | result ---------------------------- | ------ `::soap::ipv4_multicast_if` | set `setsockopt` level `IPPROTO_IP` to `IP_MULTICAST_IF` with value `::soap::ipv4_multicast_if` when non-NULL `::soap::ipv4_multicast_ttl` | set `setsockopt` level `IPPROTO_IP` to `IP_MULTICAST_TTL` with value `::soap::ipv4_multicast_ttl` when nonzero `::soap::ipv6_multicast_if` | set `sockaddr_in6::sin6_scope_id` to `::soap::ipv6_multicast_if` when nonzero 🔝 [Back to table of contents](#) # Run-time error codes {#errcodes} Status error codes are integer values, which are returned by the gSOAP API functions. The full list of `::soap_status` error codes is listed below: Error code | Description --------------------------- | ----------- `#SOAP_OK` | No error (zero) `#SOAP_CLI_FAULT` | The service returned a SOAP 1.1 client fault / SOAP 1.2 sender fault to the client `#SOAP_DATAENCODINGUNKNOWN` | SOAP 1.2 DataEncodingUnknown fault `#SOAP_DEL_METHOD` | An HTTP DELETE request was received by the service but the DELETE request callback `soap::fdel` is not implemented, see Section \ref callback `#SOAP_DIME_END` | End of DIME attachments protocol error `#SOAP_DIME_ERROR` | DIME formatting error or DIME attachment size exceeds `#SOAP_MAXDIMESIZE` `#SOAP_DIME_HREF` | DIME attachment has no href from SOAP body and no DIME callbacks were defined to save the attachment `#SOAP_DIME_MISMATCH` | DIME version error `#SOAP_DUPLICATE_ID` | XML element has duplicate id attribute value (applicable to SOAP multi-ref encoding and `#SOAP_XML_GRAPH` serialization) `#SOAP_EMPTY` | XML element or attribute is empty when a value is required `#SOAP_EOF` | Unexpected end of file, no input, transmission interrupted or timed out, same as `EOF` `#SOAP_EOM` | Out of memory `#SOAP_ERR` | Same as `EOF`, but indicates an unspecified error `#SOAP_FAULT` | The fault code to be returned by a service operation when calling `::soap_sender_fault` (client is at fault) or `::soap_receiver_fault` (server is at fault), clients receive the fault as `#SOAP_CLI_FAULT` or `#SOAP_SVR_FAULT` respectively `#SOAP_FD_EXCEEDED` | Too many open sockets `#SOAP_FIXED` | XML element or attribute value is fixed and the parsed value does not match the fixed value `#SOAP_GET_METHOD` | An HTTP GET request was received by the service but the GET request callback `soap::fget` is not implemented, see Sections \ref get and \ref callback `#SOAP_HREF` | Reference to object in XML identified by its id attribute is incompatible with the object referred to by the ref or href attribute (applicable to SOAP multi-ref encoding and `#SOAP_XML_GRAPH` serialization) `#SOAP_HTTP_ERROR` | An unspecified HTTP error occurred `#SOAP_HTTP_METHOD` | An HTTP request was received by the service that cannot be handled `#SOAP_IOB` | SOAP array index out of bounds `#SOAP_LENGTH` | XML element or attribute length validation error or `#SOAP_MAXLENGTH` exceeded `#SOAP_LEVEL` | XML nesting depth level exceeds `#SOAP_MAXLEVEL` `#SOAP_MIME_END` | End of MIME attachments protocol error `#SOAP_MIME_ERROR` | MIME attachment parsing error `#SOAP_MIME_HREF` | MIME attachment has no href from SOAP body and no MIME callbacks were defined to save the attachment `#SOAP_MISSING_ID` | An XML element with id attribute is missing that should match the element with href/ref attribute (applicable to SOAP multi-ref encoding and `#SOAP_XML_GRAPH` serialization) `#SOAP_MOE` | Memory overflow or memory corruption error (applicable in `#DEBUG` mode only) `#SOAP_MUSTUNDERSTAND` | An XML element is present with a mustUnderstand attribute which must be understood but is not deserialized `#SOAP_NAMESPACE` | XML namespace name mismatch validation error `#SOAP_NO_DATA` | No data in the HTTP body of the message received `#SOAP_NO_METHOD` | The service request dispatcher did not find a matching service operation for a service request `#SOAP_NO_TAG` | No XML element tag was found when one was expected `#SOAP_NTLM_ERROR` | An NTLM authentication handshake error occurred `#SOAP_NULL` | XML element has an `xsi:nil` attribute when the element is not nillable, causing a validation error `#SOAP_OCCURS` | XML element minOccurs or maxOccurs validation error or `#SOAP_MAXOCCURS` exceeded `#SOAP_PATCH_METHOD` | An HTTP PATCH request was received by the service but the PATCH request callback `soap::fpatch` is not implemented, see Section \ref callback `#SOAP_PATTERN` | XML element or attribute value pattern mismatch `#SOAP_PLUGIN_ERROR` | Failed to register plugin `#SOAP_PROHIBITED` | XML attribute is prohibited but present `#SOAP_PUT_METHOD` | An HTTP PUT request was received by the service but the PUT request callback `soap::fput` is not implemented, see Section \ref callback `#SOAP_REQUIRED` | XML attribute is required but not present `#SOAP_SSL_ERROR` | An SSL error occurred `#SOAP_SVR_FAULT` | The service returned a SOAP 1.1 server fault or SOAP 1.2 receiver fault to the client `#SOAP_SYNTAX_ERROR` | An XML syntax error occurred while parsing the input `#SOAP_TAG_MISMATCH` | XML element tag parsed does not match anything that is expected `#SOAP_TCP_ERROR` | A TCP/IP connection error occurred `#SOAP_TYPE` | XML element or attribute has a mismatching type or value that is causing a validation error `#SOAP_UDP_ERROR` | A UDP/IP connection error occurred or the message too large to store in a UDP packet `#SOAP_USER_ERROR` | soap::user not set to non-NULL `#SOAP_UTF_ERROR` | An UTF-8 decoding error occurred `#SOAP_VERSIONMISMATCH` | SOAP version mismatch or no SOAP message is received `#SOAP_ZLIB_ERROR` | A zlib error occurred A status code of `#SOAP_OK` (zero) is returned by a gSOAP API function when the function call was successful, otherwise a non-zero error code is returned. The status error code is also stored in the current `::soap` context as `::soap::error`. For IO and socket-related errors, also the `::soap::errnum` variable is set to the `errno` value of the system error for example when a `#SOAP_EOF` error occurred. To display the error, use `soap_print_fault(struct soap *soap, FILE *fd)` where the current value of `::soap::error` is used by the function to print the error to the specified `fd` file. Alternatively, in C++ you can use `soap_stream_fault(struct soap *soap, std::ostream& os)` to print the error on the specified `os` output stream. To display the location of an XML parsing and validation error, use `soap_print_fault_location(struct soap *soap, FILE *fd)` or `soap_stream_fault_location(struct soap *soap, std::ostream& os)` to print part of the XML with the error location marked in the XML output. To save the error in a string buffer `buf[0...len-1]`, use `soap_sprint_fault(struct soap*, char *buf, size_t len)`, where `buf` is populated with the fault message terminating with a `\0`. To determine the type of error that occurred, use: - `#soap_xml_error_check(soap_status e)` checks for XML parsing and validation errors, returns true if the specified error code is an XML error. - `#soap_soap_error_check(soap_status e)` checks for SOAP protocol faults and errors, returns true if the specified error code is a SOAP protocol error. - `#soap_http_error_check(soap_status e)` checks for HTTP protocol errors, returns true if the specified error code is an HTTP protocol error or a HTTP status code between 100 and 599 returned by an HTTP server. - `#soap_tcp_error_check(soap_status e)` checks for TCP protocol errors, returns true if the specified error code is a TCP error, when true use `::soap::errnum` to retrieve the `errno` value to determine the cause. - `#soap_udp_error_check(soap_status e)` checks for UDP protocol errors, returns true if the specified error code is a UDP error, when true use `::soap::errnum` to retrieve the `errno` value to determine the cause. - `#soap_ssl_error_check(soap_status e)` checks for SSL/TLS protocol errors, returns true if the specified error code is a SSL/TLS error, when true use `::soap::errnum` to retrieve the `errno` value to determine the cause. - `#soap_zlib_error_check(soap_status e)` checks for zlib library errors, returns true if the specified error code is a zlib error. An HTTP status code is returned when the client fails to connect to an HTTP server and the HTTP server response with an error. The list of HTTP status codes is given below: Code | Description ---- | ----------- 200 | OK (no error) 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 HTTP status code 200 is not flagged as an error by the engine. Status codes 201 and 202 are informative and should not be considered errors by the application logic. Server-side implementations of service operations should return `#SOAP_OK` when the operation was successful, which returns a "200 OK" HTTP header with the XML response message. Server-side implementations of service operations in gSOAP may directly return an HTTP status code when an HTTP-related error should be returned. For example, `return 404` returns "404 Not Found" to the client and the `::soap::error` variable is set to 404 at the client side. To return a SOAP Fault from a server-side implementation of a service operation, use one of the following functions to populate the SOAP Fault message: - `int soap_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail)` returns `#SOAP_FAULT` and populates a SOAP Fault message indicating a SOAP 1.1 client fault / SOAP 1.2 sender fault that is populated with the text `faultstring` and an XML fragment `faultdetail` or NULL when omitted. - `int soap_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail)` same as `::soap_sender_fault` with the addition of a QName-formatted string `faultsubcode`. - `int soap_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail)` returns `#SOAP_FAULT` and populates a SOAP Fault message indicating a SOAP 1.1 server fault / SOAP 1.2 receiver fault that is populated with the text `faultstring` and an XML fragment `faultdetail` or NULL when omitted. - `int soap_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail)` same as `::soap_receiver_fault` with the addition of a QName-formatted string `faultsubcode`. A receiver error indicates that the service could not handle the client request, but it can possibly recover from the error later, for example when resources are temporarily unavailable. A sender error indicates that the client request is faulty and s rejected by the service. See Section \ref fault for more details on how to use these functions. 🔝 [Back to table of contents](#) # Memory management {#memory} Memory management with gSOAP is automatic. The engine context manages all memory allocated to serialize data and for temporary storage. Deserialized data is allocated in managed memory and data structures can be allocated in managed memory by the user when desired using `soap_new_T` functions generated by soapcpp2 for each serializable type `T`. All memory managed by a context is deallocated with `::soap_destroy` to destroy managed C++ objects and `::soap_end` to delete all other managed data. When a context is finalized or freed with `soap_done(struct soap*)` and `soap_free(struct soap*)` then managed memory is not released, so it is important to call the deallocation functions first. This was done to allow managed data to outlive the context, such as deserialized objects, but this is rarely if ever used because deleting the outlived data explicitly is prone to mistakes. If you want to let deserialized data outlive a `::soap` context that you are about to free, then you can delegate management of the data to another `::soap` context with `soap_delegate_deletion(struct soap *soap_from, struct soap *soap_to)`. This moves all deserialized and temporary data to the other `::soap` context `soap_to`, which will delete its data and all the delegated data it is responsible for when you call `::soap_destroy` and `::soap_end`. This can be particularly useful for making client calls inside a server operation, i.e. a mixed server and client. The client call inside the server operation requires a new `::soap` context, e.g. copied from the server's with `::soap_copy`. Before destroying the client context with `::soap_free`, the data can be delegated to the server's context with `::soap_delegate_deletion`. See for example `gsoap/samples/mashup/mashupserver.c` in the gSOAP source code package. The functions related to memory management by the context are: * `void * soap_malloc(struct soap *soap, size_t n)` return pointer to `n` bytes of managed memory. * `char * soap_strdup(struct soap *soap, const char *s)` return pointer to duplicate of string `s` in managed memory. * `char * soap_wstrdup(struct soap *soap, const wchar_t *s)` return pointer to duplicate of string `s` in managed memory. * `T * soap_new_T(struct soap *soap)` allocates and default-initializes data of type `T`, C++ only. * `T * soap_new_T(struct soap *soap, int n)` allocates and default-initializes and array of type `T`, where `n` = -1 allocates a single non-array value. * `T * soap_new_set_T(struct soap *soap, m1, ..., mn)` allocates a struct or class `T` and initializes its members with the values `m1` to `mn`. * `T * soap_new_req_T(struct soap *soap, m1, ..., mn)` allocates a struct or class `T` and initializes its required members with the values `m1` to `mn`, required means non-optional member as required by XML validation when this data is serialized in XML. * `void soap_destroy(struct soap *soap)` deletes all context-managed C++ objects and must be called before `::soap_end`. * `void soap_end(struct soap *soap)` deletes temporary data and all deserialized data except C++ objects, see above. * `void soap_free_temp(struct soap *soap)` deletes temporary data but leaves deserialized context-managed data intact. * `void soap_dealloc(struct soap *soap, void *p)` deallocates context-managed objects or data at location `p` in memory. * `int soap_unlink(struct soap *soap, const void *p)` unlink object or data at location `p` from management by the context, this object or data must be deallocated by the user. * `void soap_done(struct soap *soap)` finalizes the context but does not delete any managed objects or data. * `void soap_free(struct soap *soap)` finalizes and frees the context (contexts allocated with `::soap_new` or `::soap_copy`) but does not delete any managed objects or data. * `void soap_delegate_deletion(struct soap *soap_from, struct soap *soap_to)` moves all C++ objects, data, and temporary data managed by the `soap_from` context to another context `soap_to`, which manages the data until deleted with `::soap_destroy` and `::soap_end`. To help understand the differences between managed objects, managed data, and managed temporary data: temporary data is created by the engine to keep track of things, such as hash tables to keep pointer reference information for serialization and hash tables to keep XML id/href information for multi-reference object deserialization. Deserialized data is allocated by the context in managed memory when constructing data structures by deserializing XML and JSON messages. Data is stored in memory managed by the context using calls to `::soap_malloc` to allocate heap space with `malloc`. A tiny bit more space is allocated to keep track of the allocations and to add a "canary" word to detect heap memory overflows. Heap memory overflows are detected when context-managed data is deallocated with `::soap_end`. C++ objects are allocated with `new` instead of `malloc` and are tracked as well. These objects are deallocated with `::soap_destroy`. When the gSOAP application is compiled with `-DDEBUG` using the compile-time flag `#DEBUG`, the engine reports memory leaks which are detected by `::soap_done` and `::soap_free`. To improve the accuracy of detection, no memory is actually freed until `::soap_done` or `::soap_free` are called to detect memory issues, so any calls to `::soap_destroy` and `::soap_end` are actually deferred to be executed when the context finalizes. While memory management in gSOAP is automatic, it does not enforce its own memory management policy on the user. To move managed objects and data into unmanaged heap space, the `soap_dup_T` deep copy functions generated by `soapcpp2 -Ec` option `-Ec` can be used. To delete deep copies, the `soap_del_T` deep deletion functions generated by `soapcpp2 -Ed` option `-Ed` can be used. After copying the usual `::soap_destroy` and `::soap_end` functions remove the managed originals. See also Section \ref deep. Furthermore, the memory allocation functions `malloc` and `new` used by the engine internally can be replaced with other allocators by defining `SOAP_MALLOC` and `SOAP_FREE` to replace `malloc` and `free`, and define `SOAP_NEW`, `SOAP_NEW_ARRAY`, `SOAP_PLACEMENT_NEW`, and `SOAP_DELETE`, `SOAP_DELETE_ARRAY` to replace `new` and `delete` used by the engine to allocate managed memory. One can for example use a garbage collector with gSOAP by defining suitable replacements. More information on memory management can be found in the [C and C++ XML Data Bindings](../../databinding/html/index.html) documentation that has separate sections on memory management in C and in C++. 🔝 [Back to table of contents](#) # Intra-class memory management {#classmemory} When a class `T` has a `struct soap * T::soap` member declared in an interface header file for soapcpp2, then this member will be set to point to the current context by the deserializers and by the `soap_default` method of the class and by the `soap_default_T` and `soap_new_T` functions for this class named `T`. This simplifies memory management by class methods that allocate data associated with the class instance that must be managed by the context. Consider for example the following class declaration: ~~~{.cpp} class Class { public: Class(); ~Class(); struct soap *soap; char *name; void setName(const char *s); char *getName(); }; ~~~ Since the `name` member is a character pointer to a string, where should we allocate this string? In most cases we will add a constructor that initially sets `name` to NULL and a destructor that deletes `name` when non-NULL, like so: ~~~{.cpp} Class::Class() { soap = NULL; name = NULL; } Class::~Class() { if (name) free(name); } ~~~ However, when instances of `Class` are deserialized we have a problem with this approach because `free(name)` deletes a managed string, which is managed by the context. Because the deserializer also sets the `soap` member of this class, there is an easy solution to this problem: ~~~{.cpp} Class::~Class() { if (!soap && name) free(name); } ~~~ This only frees `name` if the `soap` context pointer member is NULL, meaning that a managed string `name` will be deleted as usual with the deserialized class using `::soap_destroy` and `::soap_end`. The other methods are also made cognizant of the presence of a context: ~~~{.cpp} void Class::setName(const char *s) { if (soap) name = soap_strdup(soap, s); else name = strdup(s); } const char *getName() { return name; } ~~~ Another approach is to use `::soap_unlink` to unlink data managed by the context and make all allocations explicitly: ~~~{.cpp} Class::~Class() { if (name) { soap_unlink(soap, name); // unlinks the name if soap is non-NULL free(name); } } void Class::setName(const char *s) { name = strdup(s); } const char *getName() { return name; } ~~~ The `::soap_unlink` call unlinks data and objects from managed memory. In this way `::soap_destroy` and `::soap_end` can be called later even when this class was deserialized. 🔝 [Back to table of contents](#) # Debugging {#debugging} To activate debugging and message logging compile the source code with compile-time flag `#DEBUG`. Or when using `-lgsoap` or `-lgsoap++` then reinstall gSOAP with `./configure --enable-debug` and `make`. When your gSOAP client or server applications run, they will log their activity in three separate files: * `SENT.log` a concatenation of all messages sent * `RECV.log` a concatenation of all messages received * `TEST.log` a log of the engine's operations @warning The gSOAP client and server applications will run slow due to debugging and message logging. You can set macro `#DEBUG_STAMP` instead of `#DEBUG` to add time stamps to `TEST.log`. This works on all operating systems supporting the `gettimeofday` function. When installing a CGI service application compiled with debugging enabled, the log files may sometimes not be created due to file access permission restrictions imposed on CGI applications. To get around this, create empty log files with universal write permissions. Be careful about the security implication of this. You can actually test a CGI service application without deploying it on the Web. To do this, create the CGI service application and send it a request message using redirection as follows: ./service.cgi < ns.add.req.xml this should display the service response on the terminal, where `ns.add.req.xml` was generated by soapcpp2 or a modified version of this file. You can also use a `SENT.log` file produced by a client application to redirect to the CGI service application. You can also use the gSOAP [Test Messenger](../../testmsgr/html/index.html) application to generate randomized messages to test your servers. The file names of the log files and the logging activity can be controlled at the application level. This allows the creation of separate log files by separate services, clients, and threads. For example, the following service logs all messages (but no debug messages) in separate directories: ~~~{.cpp} struct soap *soap = soap_new(); soap_set_recv_logfile(soap, "logs/recv/service12.log"); // append all messages received in /logs/recv/service12.log soap_set_sent_logfile(soap, "logs/sent/service12.log"); // append all messages sent in /logs/sent/service12.log soap_set_test_logfile(soap, NULL); // no file name: do not save debug messages ... // soap_serve(soap); ... // soap_free(soap); ~~~ Likewise, messages can be logged for individual client-side service operation calls in a client application. To log messages more efficiently, use the `::logging` plugin. 🔝 [Back to table of contents](#) # Limitations {#limitations} From the perspective of the C/C++ language, a few C/C++ language features are not supported by gSOAP and these features cannot be used in an interface header file for soapcpp2. * STL: the soapcpp2 tool supports the serialization of C++ strings `std::string` and `std::wstring` and the containers `std::deque`, `std::list`, `std::vector`, and `std::set`, (see Section \ref templates ). Also `std::shared_ptr`, `std::unique_ptr`, and `std::auto_ptr` are supported. Other STL types are not serializable. * Templates: the soapcpp2 tool assumes that templates classes have only one template parameter type and these templates are containers of values of this template parameter type. This template class should define `begin()`, `end()`, `size()`, `clear()`, and `insert()` methods. * Inheritance: single class inheritance is supported. * Abstract methods: a class must be instantiable to support serialization of that class. An abstract class when used should be declared transient, see Section \ref transient. * Directives: directives and pragmas such as `#include` and `#define` are moved to the generated `soapStub.h` source code by soapcpp2. These directives are all placed at the top of that file, see \ref pragmas. Use the `#import` directive to import interface header files into other interface header files, see Section \ref import . * C and C++ code statements: no code statements are allows in interface header files. Class methods should be declared without code in `{` and `}`. Also constructor initializers are not allowed. Class method implementations should be defined in a separate C++ source file. * C++ references: these cannot be serialized, use pointers instead. The following C/C++ data types require some attention to ensure they can be serialized: * Union types: a union data type can not be serialized unless run-time information is associated with a union for the serializer to determine which union member is valid. To serialize a union, place the union in a struct or class as a member and precede this member with an integer member that serves as a selector. See Section \ref union for details. * `void*` types: the `void*` data type cannot be serialized unless run-time type information is associated with the pointer using a `int __type` member in the struct or class that contains the `void*` member. See Section \ref void for details. * Pointers to arrays: any pointer, except for C strings which are pointers to an array of characters, are treated by the soapcpp2 tool as if the pointer points to only one value. Consequently, the serialization functions for pointers only serialize the first value pointed to, when the pointer is non-NULL. To declare pointers to arrays as struct and class members, a size member is included in the struct or class, see Section \ref dynarray for details. * Constant values: `const` constant values such as `const` members of a struct or class cannot be serialized except for `const char*` and `const wchar_t*` strings. * Uninitialized pointers: Obviously, all pointers that are part of a data structure to serialize must be valid or NULL. Otherwise the serializer will crash. 🔝 [Back to table of contents](#) # Advanced features {#advanced} 🔝 [Back to table of contents](#) ## Internationalization {#internationalization} Regular 8-bit strings cannot hold wide characters outside of the character range [1,255]. Of course you can use wide strings instead of 8-bit strings in the interface header file for soapcpp2. Alternatively, set the `#SOAP_C_UTFSTRING` mode flag to encode wide characters in 8-bit strings in UTF-8 format. For example, the `xsd:string` string schema type can be declared as a wide-character string and used subsequently: ~~~{.cpp} typedef wchar_t *xsd__string; int ns__myMethod(xsd__string input, xsd__string *output); ~~~ To do so automatically with wsdl2h, edit `typemap.dat` and add the line: xsd__string = | wchar_t* | wchar_t* or for C++: xsd__string = | std::wstring | std::wstring* Alternatively, 8-bit strings can hold UTF-8 formatted wide characters when the `#SOAP_C_UTFSTRING` flag is enabled, see Section \ref flags . The application is responsible for filling regular strings with UTF-8 content. Also the `#SOAP_C_MBSTRING` flag can be used to activate multibyte character support. Multibyte support depends on the locale settings for dealing with extended natural language encodings. Both 8-bit strings and wide-character strings can be used together within an application. For example, the following header file declaration introduces two string schema types: ~~~{.cpp} typedef wchar_t *xsd__string; typedef char *xsd__string_; // trailing '_' avoids name clash int ns__myMethod(xsd__string input, xsd__string_ *output); ~~~ Please consult the UTF-8 specification for details on the UTF-8 format when processing 8-bit strings with UTF-8 content. Note that the ASCII character set [1-127] is a subset of UTF-8. Therefore, with the `#SOAP_C_UTFSTRING` flag set, strings may hold ASCII character data and UTF-8 extensions. See also [C and C++ XML data bindings](../../databinding/html/index.html) documentation for more details on using `typemap.dat` for wsdl2h. 🔝 [Back to table of contents](#) ## Directives {#directives} An interface header file for soapcpp2 may include `//gsoap` directives to configure messaging protocols such as SOAP or REST, to associate SOAP Headers and Faults with messages, and to set properties of the Web service defined in the soapcpp2-generated WSDL and XSD files. Directives for soapcpp2 are specified as `//gsoap`-comments that are processed by soapcpp2. ### Service directives {#directives-1} A service directive must start at a new line and is of the form: ~~~{.cpp} //gsoap service : ~~~ where `` is the XML namespace prefix of a service binding. The `` and `` fields are one of the following: property | value --------------- | ----- `name` | name of the service, optionally followed by text describing the service `namespace` | URI of the WSDL targetNamespace `documentation` | text describing the service (see also the `name` property), multiple permitted `doc` | an alias for the `documentation` property `style` | `document` (default) SOAP messaging style or `rpc` for SOAP RPC `encoding` | `literal` (default), `encoded` for SOAP encoding, or a custom URI `protocol` | specifies SOAP or REST, see below `port` | URL of the service endpoint, usually an http or https address, to use in the WSDL definitions/service/port/address/\@location `location` | an alias for the `port` property `endpoint` | an alias for the `port` property `transport` | URI declaration of the transport, usually `http://schemas.xmlsoap.org/soap/http` `definitions` | name of the WSDL definitions/\@name `type` | name of the WSDL definitions/portType/\@name (WSDL2.0 interface/\@name) `portType` | an alias for the `type` property (`portType` follows SOAP 1.1 naming conventions) `interface` | an alias for the `type` property (`interface` follows SOAP 1.2 naming conventions) `binding` | name of the WSDL definitions/binding/\@name `portName` | name of the WSDL definitions/service/port/\@name `executable` | name of the "executable" to use in the WSDL definitions/service/port/address/\@location The service `name` and `namespace` properties are required in order to generate a valid WSDL with soapcpp2. The other properties are optional. The `style` and `encoding` property defaults are changed with `soapcpp2 -e` option `-e` to `rpc` and `encoded`. You can override the `port` endpoint URL at runtime in the auto-generated `soap_call_prefix__func` service call (C/C++ client side) and in the C++ proxy class service call. Protocol property values are: protocol value | description -------------- | ----------- `SOAP` | SOAP transport, supporting both SOAP 1.1 and 1.2 `SOAP1.1` | SOAP 1.1 transport (same as `soapcpp2 -1`) `SOAP1.2` | SOAP 1.2 transport (same as `soapcpp2 -2`) `SOAP-GET` | one-way SOAP 1.1 or 1.2 with HTTP GET `SOAP1.1-GET` | one-way SOAP 1.1 with HTTP GET `SOAP1.2-GET` | one-way SOAP 1.2 with HTTP GET `HTTP` | an alias for `POST` (same as `soapcpp2 -0`) `POST` | non-SOAP REST protocol with HTTP POST `GET` | non-SOAP REST protocol with HTTP GET `PUT` | non-SOAP REST protocol with HTTP PUT `DELETE` | non-SOAP REST protocol with HTTP DELETE The `protocol` property is `SOAP` by default. The default is changed with `soapcpp2 -1` option `-1` to SOAP 1.1, `soapcpp2 -2` option `-2` to SOAP 1.2, and non-SOAP REST with `soapcpp2 -0` option `-0` The `GET` protocols for SOAP and REST require that the service operations only use primitive types with their input parameters, because these parameters are encoded with the URL as URL query values. To let directives take effect with service operations, you should bind the service operations to the WSDL namespace of a service by using the namespace prefix as part of the identifier name of the function that defines the service operation: ~~~{.cpp} int prefix__func(arg1, arg2, ..., argn, result); ~~~ where `prefix` can now be used to let directives take effect on this service operation. 🔝 [Back to table of contents](#) ### Service method directives {#directives-2} Service properties are applicable to a service and to all of its operations. Service method directives are specifically applicable to a service operation. A service method directive is of the form: ~~~{.cpp} //gsoap service method-: ~~~ where `` is the XML namespace prefix of a service binding and `` is the unqualified name of a service operation. The `` and `` fields are one of the following: method property | value --------------------------- | ----- `method-documentation` | text describing the service operation `method` | same as above, shorthand form `method-action` | `""` or URI SOAPAction HTTP header, or URL query string for REST protocols `method-input-action` | `""` or URI SOAPAction HTTP header of service request messages `method-output-action` | `""` or URI SOAPAction HTTP header of service response messages `method-fault-action` | `""` or URI SOAPAction HTTP header of service fault messages `method-header-part` | member name of the `SOAP_ENV__Header` struct used in SOAP Header `method-input-header-part` | member name of the `SOAP_ENV__Header` struct used in SOAP Headers of requests `method-output-header-part` | member name of the `SOAP_ENV__Header` struct used in SOAP Headers of responses `method-fault` | type name of a struct or class member used in `SOAP_ENV__Details` struct `method-mime-type` | REST content type or SOAP MIME attachment content type(s) `method-input-mime-type` | REST content type or SOAP MIME attachment content type(s) of request message `method-output-mime-type` | REST content type or SOAP MIME attachment content type(s) of response message `method-style` | `document` or `rpc` `method-encoding` | `literal`, `encoded`, or a custom URI for encodingStyle of messages `method-response-encoding` | `literal`, `encoded`, or a custom URI for encodingStyle of response messages `method-protocol` | SOAP or REST, see \ref directives-1 The `method-header-part` properties can be repeated for a service operation to declare multiple SOAP Header parts that the service operation requires. You can use `method-input-header-part` and `method-output-header-part` to differentiate between request and response messages. The `method-fault` property can be repeated for a service operation to declare multiple faults that the service operation may return. The `method-action` property serves two purposes: -# To set the SOAPAction header for SOAP protocols, i.e. sets the definitions/binding/operation/SOAP:operation/\@soapAction. -# To set the URL query string for endpoints with REST protocols, i.e. sets the definitions/binding/operation/HTTP:operation/\@location, which specifies a URL query string (starts with a `?`) to complete the service endpoint URL or extends the endpoint URL with a local path (starts with a `/`). Use `method-input-action` and `method-output-action` to differentiate the SOAPAction between SOAP request and response messages. You can always override the port endpoint URL and action values at runtime in the auto-generated `soap_call_prefix__func` service call (C/C++ client side) and in the auto-generated C++ proxy class service calls. A runtime NULL endpoint URL and/or action uses the defaults set by these directives. The `method-mime-type` property serves two purposes: -# To set the type of MIME/MTOM attachments used with SOAP protocols. Multiple attachment types can be declared for a SOAP service operation, i.e. adds definitions/binding/operation/input/MIME:multipartRelated/MIME:part/MIME:content/\@type for each type specified. -# To set the MIME type of a REST operation. This replaces XML declared in WSDL by definitions/binding/operation/(input|output)/MIME:mimeXml with MIME:content/\@type. Use `application/x-www-form-urlencoded` with REST POST and PUT protocols to send encoded form data automatically instead of XML. Only primitive type values can be transmitted with form data, such as numbers and strings, i.e. only types that are legal to use as attributes members. Use `method-input-mime-type` and `method-output-mime-type` to differentiate the attachment types between request and response messages. 🔝 [Back to table of contents](#) ### Schema directives {#directives-3} A schema directive is of the form: ~~~{.cpp} //gsoap schema : ~~~ where `` is the XML namespace prefix of a schema. The `` and `` fields are one of the following: property | value --------------- | ----- `namespace` | URI of the XSD targetNamespace `namespace2` | alternate URI pattern for the XSD namespace (i.e. URI is also accepted by the XML parser) `import` | URI of an imported namespace, as an alternative or in addition to `namespace`, adds `xsd:import` to the generated WSDL and XSD files `form` | `unqualified` (default) or `qualified` local element and attribute form defaults `elementForm` | `unqualified` (default) or `qualified` local element form default `attributeForm` | `unqualified` (default) or `qualified` local attribute form default `typed` | `no` (default) or `yes` for serializers to add `xsi:type` attributes to XML The `namespace2` URI is a pattern with `*` matching any sequence of characters and `-` matching any character. This pattern instructs the XML parser and validator to also accept the URI pattern as a valid namespace for the specified ``. The `typed` property is `no` by default and can be changed to `yes` with `soapcpp2 -t` option `-t`. 🔝 [Back to table of contents](#) ### Schema type directives {#directives-4} A schema type directive is of the form: ~~~{.cpp} //gsoap schema type-: //gsoap schema type-: :: ~~~ where `` is the XML namespace prefix of a schema and `` is an unqualified name of a C/C++ type, and the optional `` is a class/struct members or enum constant. You can describe a type with one of the following: type property | value -------------------- | ----- `type-documentation` | text describing the schema type `type` | an alias for the `type-documentation` property For example, you can add a description to an enumeration: ~~~{.cpp} //gsoap ns schema type: Vowels The letters A, E, I, O, U, and sometimes Y //gsoap ns schema type: Vowels::Y A vowel, sometimes enum class ns__Vowels : char { A = 'A', E = 'E', I = 'I', O = 'O', U = 'U', Y = 'Y' }; ~~~ This documented enumeration maps to a simpleType restriction of `xsd:string` in the soapcpp2-generated schema:
~~~{.xml} The letters A, E, I, O, U, and sometimes Y A vowel, sometimes ~~~
🔝 [Back to table of contents](#) ### Example {#example12} The use of directives is best illustrated with an example. The example uses a hypothetical stock quote service and exchange rate service, actual services such as these are available for free on the web. ~~~{.cpp} //gsoap ns1 service namespace: urn:GetQuote int ns1__getQuote(char *symbol, float &result); //gsoap ns2 service namespace: urn:CurrencyExchange int ns2__getRate(char *country1, char *country2, float &result); //gsoap ns3 service name: quotex //gsoap ns3 service style: rpc //gsoap ns3 service encoding: encoded //gsoap ns3 service port: http://www.mydomain.com/quotex.cgi //gsoap ns3 service namespace: urn:quotex int ns3__getQuote(char *symbol, char *country, float &result); ~~~ The `quotex.h` example is a new Web Service created by combining two existing Web Services: a Stock Quote service and a Currency Exchange service. The namespace prefix `ns3` is used for the new `quotex` Web Service with namespace URI `urn:quotex`, service name `quotex`, and endpoint port `http://www.mydomain.com/quotex.cgi`. Since the new Web Service invokes the `ns1__getQuote` and `ns2__getRate` service operations, the service namespaces and other details such as style and encoding of these methods are given by directives. After invoking the soapcpp2 tool on the `quotex.h` header file: soapcpp2 quotex.h the WSDL of the new `quotex` Web Service is saved as `quotex.wsdl`. Since the service name, endpoint port, and namespace URI were provided in the header file, the generated WSDL file can be published together with the compiled Web Service installed as a CGI application. The namespace mapping table for the `quotex.cpp` Web Service implementation is saved as `quotex.nsmap`. This file can be directly included in `quotex.cpp` instead of specified by hand in the source of `quotex.cpp`. 🔝 [Back to table of contents](#) ## Transient data types {#transient} There are situations when certain types have to be used in an interface header file, but the types are not serializable and therefore have to be "invisible" to the soapcpp2 tool. These types are called transient. This feature is useful when a library type is used in the interface header file as part of a struct or class, for example the `FILE` type or `std::ostream` that are clearly not serializable. If these types are introduced in an interface header file then these types must be declared transient. Otherwise, soapcpp2 will throw an error. To declare a transient type use `extern`. For example: ~~~{.cpp} extern class FILE; ~~~ Even though `FILE` is not a class, this declaration merely introduces the `FILE` type name without specifying its details. In C we can still use the class keyword, because no code is generated by soapcpp2 for this transient type. We can then use this type elsewhere, for example: ~~~{.cpp} struct ns__record { FILE *fd; const char *name; }; ~~~ Only the `name` member is serialized of `ns__record`. Another example: ~~~{.cpp} extern class std::ostream; // std::ostream can't be serialized, but need to be declared class ns__myClass { public: virtual void print(std::ostream &s) const; // need ostream here ... // }; ~~~ In other cases we do want to declare a type that soapcpp2 should copy into `soapStub.h` for the application source code, but which should not be serializable. We can use `extern` for this or put the declaration in `[` and `]` brackets: ~~~{.cpp} [ class ns__myBase // base class need not be serializable { ... // members }; ] class ns__myDerived : ns__myBase { ... // members }; ~~~ We can use `[` and `]` brackets for parts of the code, for example to make several class members transient: ~~~{.cpp} [ typedef int transientInt; ] class ns__myClass { int a; // will be serialized [ int b; // transient member char s[256]; // transient member ] extern float d; // transient type float and member char *t; // will be serialized transientInt *n; // transient type int and member [ virtual void method(char buf[1024]); // does not create a char[1024] serializer ] }; ~~~ In this example, `ns__myClass` has three transient members: `b`, `s`, and `n` which will not be serialized. Member `n` is transient because the type is declared within a transient block. Pointers, references, and arrays of transient types are transient. The single class method is encapsulated within `[` and `]` to prevent soapcpp2 from creating serializers for the `char[1024]` type. We also use `[` and `]` brackets to introduce a transient integer type `transientInt` using a typedef. We cannot use `extern` with `typedef` because this construct is reserved for custom serializers. 🔝 [Back to table of contents](#) ## Serialization "as is" of volatile data types {#volatile} Types declared `volatile` in an interface header file are serializable but not copied by soapcpp2 to `soapStub.h`. These types are typically library types that are included in the source code and should not be redefined in the application source code. We want to serialize these library types "as is" without redefining them. Consider for example `struct tm`, declared in `time.h`. The structure may actually vary between platforms, but the `tm` structure includes at least the following members as declared in the following interface header file for soapcpp2: ~~~{.cpp} #include volatile struct tm { int tm_sec; /* seconds (0 - 60) */ int tm_min; /* minutes (0 - 59) */ int tm_hour; /* hours (0 - 23) */ int tm_mday; /* day of month (1 - 31) */ int tm_mon; /* month of year (0 - 11) */ int tm_year; /* year - 1900 */ int tm_wday; /* day of week (Sunday = 0) */ int tm_yday; /* day of year (0 - 365) */ int tm_isdst; /* is summer time in effect? */ char *tm_zone; /* abbreviation of timezone name */ long tm_gmtoff; /* offset from UTC in seconds */ }; ~~~ By declaring struct `tm` volatile, soapcpp2 does not redefine it in the output source code. The `#include ` is copied to the source code output. We can now serialize the `tm` structure. The following example serializes the local time stored in a `tm` structure to stdout: ~~~{.cpp} struct soap *soap = soap_new(); time_t T = time(NULL); struct tm *t = localtime(&T); soap_write_tm(soap, t); soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~ It is also possible to serialize the `tm` members as XML attributes by declaring the members as attributes with the `@` qualifier, see Section \ref attributes . If you want to produce a schema file, say `time.xsd`, that defines an XML schema and namespace for the `tm` struct, you can add a `typedef` declaration to the header file: ~~~{.cpp} #include volatile struct tm { ... // see above }; typedef struct tm time__struct_tm; ~~~ or simply use colon notation since we keep the `tm` name: ~~~{.cpp} #include volatile struct time:tm { int tm_sec; /* seconds (0 - 60) */ int tm_min; /* minutes (0 - 59) */ int tm_hour; /* hours (0 - 23) */ int tm_mday; /* day of month (1 - 31) */ int tm_mon; /* month of year (0 - 11) */ int tm_year; /* year - 1900 */ int tm_wday; /* day of week (Sunday = 0) */ int tm_yday; /* day of year (0 - 365) */ int tm_isdst; /* is summer time in effect? */ char *tm_zone; /* abbreviation of timezone name */ long tm_gmtoff; /* offset from UTC in seconds */ }; ~~~ We used the typedef name `time__struct_tm` rather than `time__tm`, because a schema name clash will occur for the first example above that has `tm` already declared as serializable type in the schema of the generated WSDL. The second example with the colon notation avoids this altogether. 🔝 [Back to table of contents](#) ## How to declare custom serializers and deserializers {#extern} You can implement your own custom serializers for data types. A custom serializer is declared in an interface header file for soapcpp2 using the pair of keywords `extern typedef`. For example: ~~~{.cpp} extern typedef char *MyData; struct Sample { MyData s; // use custom serializer for this member char *t; // use auto-generated serializer }; ~~~ Then provide the following functions for each `extern typedef` declares type `T`: ~~~{.cpp} int soap_serialize_T(struct soap *soap, const T *a); void soap_default_T(struct soap *soap, T *a); int soap_out_T(struct soap *soap, const char *tag, int id, const T *a, const char *type); T *soap_in_T(struct soap *soap, const char *tag, T *a, const char *type); ~~~ The function prototypes of these functions can be found in the soapcpp2-generated `soapH.h` file. For example, the serialization of `MyData` can be done with the following code: ~~~{.cpp} int soap_serialize_MyData(struct soap *soap, MyData const*a) { // no need to mark this node (for multi-ref and cycle detection) return SOAP_OK; } void soap_default_MyData(struct soap *soap, MyData *a) { *a = NULL; } int soap_out_MyData(struct soap *soap, const char *tag, int id, MyData const*a, const char *type) { if (soap_element_begin_out(soap, tag, id, type) // print XML beginning tag || soap_send(soap, *a) // just print the string (no XML conversion) || soap_element_end_out(soap, tag)) // print XML ending tag return soap->error; return SOAP_OK; } MyData **soap_in_MyData(struct soap *soap, const char *tag, MyData *a, const char *type) { if (soap_element_begin_in(soap, tag)) return NULL; if (!a) a = (MyData*)soap_malloc(soap, sizeof(MyData)); if (soap->null) *a = NULL; // xsi:nil element if (*soap->type && soap_match_tag(soap, soap->type, type)) { soap->error = SOAP_TYPE; return NULL; // type mismatch } if (*soap->href) a = (MyData**)soap_id_forward(soap, soap->href, a, 0, SOAP_TYPE_MyData, 0, sizeof(MyData), 0, NULL, NULL) else if (soap->body) { char *s = soap_value(soap); // fill buffer *a = (char*)soap_malloc(soap, strlen(s)+1); strcpy(*a, s); } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return a; } ~~~ More information on custom serialization is available in the gSOAP source code package in the `gsoap/custom` directory, where you can also find several custom serializers to use with your projects. 🔝 [Back to table of contents](#) ## Function callbacks for customized I/O and HTTP handling {#callback} The following list of functions can be used for customized HTTP handling and I/O. See also API documentation Module \ref group_callbacks. To reset the callback functions to the internal functions of the engine, use `::soap_done` followed by `::soap_init`. This re-initializes the `::soap` context, removes all plugins, and resets function callbacks. ### fpost `int (soap::fpost)(struct soap *soap, const char *endpoint, const char *host, int port, const char *path, const char *action, ULONG64 count)` This callback is called at the server side by the engine to send the HTTP headers to the connected client. The parameter `status` should be an HTTP status error code or `#SOAP_OK` (200 OK) or `#SOAP_HTML` or `#SOAP_FILE`. Using `#SOAP_HTML` sets the content-type header to `text/html; charset=utf-8`. Using `#SOAP_FILE` sets the content-type header to the value of `::soap::http_content`. Extra HTTP headers are added when `::soap::http_extra_header` is set to one or more header lines separated by CRLF. When redefining this callback, use function `::soap_send` to write the header contents. Returns `#SOAP_OK` or a `::soap_status` error code. The built-in function assigned to `::soap::fresponse` is `http_response`. ### fresponse `int (soap::fresponse)(struct soap *soap, int soap_error_code, ULONG64 count)` This callback is called at the server side by the engine to send the HTTP headers to the connected client. The parameter `status` should be an HTTP status error code or `#SOAP_OK` (200 OK) or `#SOAP_HTML` or `#SOAP_FILE`. Using `#SOAP_HTML` sets the content-type header to `text/html; charset=utf-8`. Using `#SOAP_FILE` sets the content-type header to the value of `::soap::http_content`. Extra HTTP headers are added when `::soap::http_extra_header` is set to one or more header lines separated by CRLF. When redefining this callback, use function `::soap_send` to write the header contents. Returns `#SOAP_OK` or a `::soap_status` error code. The built-in function assigned to `::soap::fresponse` is `http_response`. ### fposthdr `int (soap::fposthdr)(struct soap *soap, const char *key, const char *val)` This callback is called by `::soap::fpost` and `::soap::fresponse` to send an HTTP header with a key and an optional value. Returns `#SOAP_OK` or a `::soap_status` (int) error code. The built-in function assigned to `::soap::fposthdr` is `http_post_header`. ### fparse `int (soap::fparse)(struct soap *soap)` This callback is called by the engine (as a client or server) to read and parse HTTP headers or MIME headers. When redefined, this function should at read or skip the entire HTTP header to reach the message body. Function `::soap_getline` is used by this callback to read each header line into an internal buffer `::soap::msgbuf` with `::soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf))`. Returns `#SOAP_OK`, or a gSOAP error code. The built-in function assigned to `::soap::fparse` is `http_parse`. ### fparsehdr `int (soap::fparsehdr)(struct soap *soap, const char *key, const char *val)` This callback is called by `::soap::fparse`, consumes an HTTP header that is split in a key-value pair and updates the `::soap` context state accordingly. The context is updated with the HTTP header information received, but HTTP headers are not literally retained by the engine. Returns `#SOAP_OK` or `#SOAP_STOP` to prevent further reading of the HTTP body, or a `::soap_status` (int) error code. The built-in function assigned to `::soap::fparsehdr` is `http_parse_header`. ### fget `int (soap::fget)(struct soap *soap)` This callback is called by the service dispatcher when an HTTP GET request is pending. Redefine this callback to respond to HTTP GET requests with content, see the `::http_get` HTTP GET plugin for more details. Returns `#SOAP_OK` or a `::soap_status` (int) error code. The built-in function assigned to `::soap::fget` is the internal static function `http_get` that returns the `#SOAP_GET_METHOD` error. ### fput `int (soap::fput)(struct soap *soap)` This callback is called by the service dispatcher when an HTTP PUT request is pending. Redefine this callback to respond to HTTP PUT requests, see the `::http_post` HTTP POST plugin for more details. Returns `#SOAP_OK` or a `::soap_status` error code. The built-in function assigned to `::soap::fput` is the internal static function `http_put` that returns the `#SOAP_PUT_METHOD` error. ### fpatch `int (soap::fpatch)(struct soap *soap)` This callback is called by the service dispatcher when an HTTP PATCH request is pending. Redefine this callback to respond to HTTP PATCH requests, see the `::http_post` HTTP POST plugin for more details. Returns `#SOAP_OK` or a `::soap_status` error code. The built-in function assigned to `::soap::fpatch` is the internal static function `http_patch` that returns the `#SOAP_PATCH_METHOD` error. ### fdel `int (soap::fdel)(struct soap *soap)` This callback is called by the service dispatcher when an HTTP DELETE request is pending. Redefine this callback to respond to HTTP DELETE requests, see the `::http_post` HTTP POST plugin for more details. Returns `#SOAP_OK` or a `::soap_status` (int) error code. The built-in function assigned to `::soap::fdel` is the internal static function `http_del` that returns the `#SOAP_DEL_METHOD` error. ### fopt `int (soap::fopt)(struct soap *soap)` Called by the service dispatcher when an HTTP OPTION request is pending. Redefine this callback to respond to HTTP OPTION requests, see the `::http_post` HTTP POST plugin for more details. Returns `#SOAP_OK` or a `::soap_status` (int) error code. The built-in function assigned to `::soap::fopt` is the internal static function `http_200` that returns HTTP 200 OK. ### fhead `int (soap::fhead)(struct soap *soap)` This callback is called by the service dispatcher when an HTTP HEAD request is pending. Redefine this callback to respond to HTTP HEAD requests more specifically. Returns `#SOAP_OK` or a `::soap_status` (int) error code. The built-in function assigned to `::soap::fhead` is the internal static function `http_200` that returns HTTP 200 OK. ### fform `int (soap::fform)(struct soap *soap)` This callback is called by the HTTP FORM handler plugin to parse HTML forms received with HTTP POST and PUT requests, see the `;:http_form` HTTP FORM plugin for more details. The HTTP body with the form data should be parsed by this callback, otherwise HTTP keep-alive messages will end up out of sync as a result of the current position not being advanced to the end of the HTTP body. Returns `#SOAP_OK` or a `::soap_status` (int) error code. No built-in function is assigned to `::soap::fform`. ### fheader `int (soap::fheader)(struct soap *soap)` This callback is called immediately after parsing a SOAP Header into the `::soap::header` structure. The SOAP Header structure `::soap::header` can be inspected by this function and verified or rejected before the rest of the message with the SOAP Body is consumed. Returns `#SOAP_OK` or a `::soap_status` (int) error code. No built-in function is assigned to `::soap::fheader`. ### fignore `int (soap::fignore)(struct soap *soap, const char *tag)` This callback is called when an unrecognized XML element was encountered on the input that could be ignored depending on some specified logic. The `tag` parameter is the offending XML element tag name string. The callback should return `#SOAP_OK` to ignore the element or return an `::soap_status` error code such as `#SOAP_TAG_MISMATCH` to trigger a validation error. This callback also overrides `mustUnderstand` attributes on unrecognized SOAP Header elements that normally raise faults. It is strongly recommended that the callback returns `#SOAP_MUSTUNDERSTAND` when `::soap::mustUnderstand` != `0`. Returns `#SOAP_OK` or a `::soap_status` (int) error code. No built-in function is assigned to `::soap::fignore`. ### fsvalidate `int (soap::fsvalidate)(struct soap *soap, const char *pattern, const char *string)` This callback is called to validate a string against an XML regex pattern. Patterns use XML schema regex syntax. This callback allows user-defined pattern validation that is normally disabled. Returns `#SOAP_OK` when the string matches the pattern or `#SOAP_TYPE` when the string does not match. No built-in function is assigned to `::soap::fsvalidate`. ### fwvalidate `int (soap::fwvalidate)(struct soap *soap, const char *pattern, const wchar_t *string)` This callback is called to validate a wide string against an XML regex pattern. Patterns use XML schema regex syntax. This callback allows user-defined pattern validation that is normally disabled. Returns `#SOAP_OK` when the string matches the pattern or `#SOAP_TYPE` when the string does not match. No built-in function is assigned to `::soap::fwvalidate`. ### fseterror `void (soap::fseterror)(struct soap *soap, const char **code, const char **string)` This callback is called by the engine when an error is raised to allow inspection or overriding of the fault code or fault string messages before the error is reported or transmitted. No built-in function is assigned to `::soap::fseterror`. ### fopen `SOAP_SOCKET (soap::fopen)(struct soap *soap, const char *endpoint, const char *host, int port)` This callback is called by the engine at the client-side by `::soap_connect` or `::soap_connect_command` to open a TCP or UDP connection to a server specified at an endpoint. Parameters `host` and `port` are micro-parsed from `endpoint` before being passed to `::soap::fopen`. Returns a valid socket or `#SOAP_INVALID_SOCKET` with a `::soap::error` set to a `::soap_status` (int) error code and `::soap::errnum` set to `errno` of the connection failure. The built-in function assigned to `::soap::fopen` is `tcp_connect`. ### faccept `SOAP_SOCKET (soap::faccept)(struct soap *soap, SOAP_SOCKET s, struct sockaddr *a, int *n)` This callback is called by `::soap_accept` (or the C++ service class `accept` method) to wait for and accept a socket connection requested by a client. Returns a valid socket or `#SOAP_INVALID_SOCKET` when an error occurred and sets `::soap::error` to a `::soap_status` value. The built-in function assigned to `::soap::faccept` is `tcp_accept`. ### fclose `int (soap::fclose)(struct soap *soap)` This callback is called by the engine at the client-side to close the current socket connection before a new socket connection is established. This callback may be called multiple times (e.g. by the engine and by plugins) to close the same socket `::soap::socket`. Checks internally if `::soap::socket` == `#SOAP_INVALID_SOCKET` before closing, which means that the socket was already closed. Returns `#SOAP_OK` or a `::soap_status` (int) error code. The built-in function assigned to `::soap::fclose` is `tcp_disconnect`. ### fresolve `int (soap::fresolve)(struct soap *soap, const char *addr, struct in_addr *inaddr)` This callback is called by `::soap_bind` (or the C++ service class `bind` method) at the server-side and by `::soap_connect` or `::soap_connect_command` at the client-side with a host `name` parameter to resolve to address `inaddr` by address translation. When successful sets parameter `inaddr` and returns `#SOAP_OK` or a `::soap_status` (int) error code. The built-in function assigned to `::soap::fresolve` is `tcp_gethost`. ### fconnect `int (soap::fconnect)(struct soap *soap, const char *endpoint, const char *host, int port)` This callback is called by the engine to optionally override client-side connecting. The parameters `host` and `port` were micro-parsed from the `endpoint` prior to passing them to this callback. Returns `#SOAP_OK` or a `::soap_status` (int) error code. No built-in function is assigned to `::soap::fconnect`. ### fdisconnect `int (soap::fdisconnect)(struct soap *soap)` This callback is called by the engine `::soap_closesock` before the `::soap::fclose` callback is called to shutdown/disconnect. Returns `#SOAP_OK` or a `::soap_status` (int) error code. No built-in function is assigned to `::soap::fdisconnect`. ### fclosesocket `int (soap::fclosesocket)(struct soap *soap, SOAP_SOCKET sock)` This callback is called to close a socket by the engine. Returns `#SOAP_OK` or a `::soap_status` (int) error code. The built-in function assigned to `::soap::fclosesocket` is `tcp_closesocket`. ### fshutdownsocket `int (soap::fshutdownsocket)(struct soap *soap, SOAP_SOCKET sock, int how)` This callback is called to shut down a socket by the engine. Returns `#SOAP_OK` or a `::soap_status` (int) error code. The built-in function assigned to `::soap::fshutdownsocket` is `tcp_shutdownsocket`. ### fpoll `int (soap::fpoll)(struct soap *soap)` This callback is called by the engine to wait for activity on the `::soap::socket` or `::soap::master` socket using `poll` or `select`. Times out when `::soap::send_timeout` or `::soap::recv_timeout` are nonzero. Returns `#SOAP_OK` or a `::soap_status` (int) error code. The built-in function assigned to `::soap::fpoll` is `soap_poll`. ### frecv `size_t (soap::frecv)(struct soap *soap, char *buf, size_t len)` This callback is called by the engine to receive (or read) data into a specified buffer `buf` and `len`. The source for the data to read by this callback is `::soap::is` when non-NULL, `::soap::socket` when valid, or `::soap::recvfd`. Returns `#SOAP_OK` or a `::soap_status` (int) error code. The built-in function assigned to `::soap::frecv` is `frecv`. ### fsend `int (soap::fsend)(struct soap *soap, const char *buf, size_t len)` This callback is called by the engine to send (or write) data specified by `data` bytes of length `len`. The sink for the data to be sent to is typically `::soap::socket`, `::soap::sendfd` or `::soap::os`. Returns `#SOAP_OK` or a `::soap_status` (int) error code. The built-in function assigned to `::soap::fsend` is `fsend`. ### fserverloop `int (soap::fserveloop)(struct soap *soap)` This callback is called after each successful completion of a server operation in the server loop. Executes immediately after sending the response to a client and before the next keep-alive server loop iteration when enabled with `#SOAP_IO_KEEPALIVE`. This callback can be used to reclaim resources in the keep-alive server loop, for example managed memory can be reclaimed by calling `::soap_destroy` and `::soap_end` in that order and all deserialized and other dynamically-allocated data managed by the context will be deallocated. Returns `#SOAP_OK` or a `::soap_status` (int) error code. No built-in function is assigned to `::soap::fserveloop`. ### fmalloc `void (soap::fmalloc)(struct soap *soap, size_t size)` This callback can be used to override memory allocation and management done by `::soap_malloc` in C. Memory allocated via this callback will not be managed and not be automatically released by the engine. Instead, the application using this callback should release allocated memory. All allocations done by `::soap_malloc` are replaced with a call to `::soap::fmalloc`. However, no other allocations, such as `::soap_new` and `soap_new_T` for C++ classes `T` are affected, because objects are allocated differently. This callback is therefore not useful for C++ applications. Returns a pointer to dynamically allocated memory or NULL on failure to allocate. No built-in function is assigned to `::soap::fmalloc`. @warning Deprecated since 2.8.72. Define `#SOAP_MALLOC` and `#SOAP_FREE` instead. ### user variable A `void* ::soap::user` variable is available to pass user-defined data to the callbacks. ### Examples The following example uses I/O callbacks for customized serialization of data into a fixed-size buffer and deserialization back into a data structure: ~~~{.cpp} char buf[10000]; // XML buffer int len1 = 0; // #chars written int len2 = 0; // #chars read // mysend: put XML in buf[] int mysend(struct soap *soap, const char *s, size_t n) { if (len1 + n > sizeof(buf)) return SOAP_EOF; strcpy(buf + len1, s); len1 += n; return SOAP_OK; } // myrecv: get XML from buf[] size_t myrecv(struct soap *soap, char *s, size_t n) { if (len2 + n > len1) n = len1 - len2; strncpy(s, buf + len2, n); len2 += n; return n; } int main() { struct soap soap; struct ns__person p; soap_init1(&soap, SOAP_XML_TREE); len1 = len2 = 0; // reset buffer pointers p.name = "John Doe"; p.age = 25; soap.fsend = mysend; // assign callback soap.frecv = myrecv; // assign callback if (soap_write_ns__person(&soap, &p)) { soap_print_fault(&soap, stdout); exit(EXIT_FAILURE); } if (soap_read_ns__Person(&soap, &p)) { soap_print_fault(&soap, stdout); exit(EXIT_FAILURE); } soap_destroy(&soap); soap_end(&soap); soap_done(&soap); } ~~~ A fixed-size buffer to store the outbound message sent is not flexible to handle large content. To store the message in an expanding buffer: ~~~{.cpp} struct buffer { size_t len; size_t max; char *buf; }; int main() { struct soap soap; struct ns__person p; struct buffer *h = malloc(sizeof(struct buffer)); h->len = 0; h->max = 0; h->buf = NULL; soap_init1(&soap, SOAP_XML_TREE); soap.user = (void*)h; // pass buffer as a handle to the callback soap.fsend = mysend; // assign callback if (soap_write_ns__person(&soap, &p)) { soap_print_fault(&soap, stdout); exit(EXIT_FAILURE); } if (h->len) { ... // use h->buf[0..h->len-1] content // then cleanup: h->len = 0; h->max = 0; free(h->buf); h->buf = NULL; } soap_destroy(&soap); soap_end(&soap); soap_done(&soap); } int mysend(struct soap *soap, const char *s, size_t n) { struct buffer *h = (struct buffer*)soap->user; // get buffer through handle int m = h->max, k = h->len + n; // need to increase space? if (m == 0) m = 1024; else while (k >= m) m *= 2; if (m != h->max) { char *buf = malloc(m); memcpy(buf, h->buf, h->len); h->max = m; if (h->buf) free(h->buf); h->buf = buf; } memcpy(h->buf + h->len, s, n); h->len += n; return SOAP_OK; } ~~~ The following example illustrates customized I/O and HTTP header handling. The XML message is saved to a file to demonstrate I/O and HTTP callbacks. The client proxy then reads the file contents as the service response. To perform this trick, the service response has exactly the same structure as the request. This is declared by the `struct ns__test` output parameter part of the service operation declaration. This struct resembles the service request (see the generated `soapStub.h` file generated by soapcpp2 from the interface header file input). The interface header file for soapcpp2 is: ~~~{.cpp} //gsoap ns service name: callback //gsoap ns service namespace: urn:callback struct ns__person { char *name; int age; }; int ns__test(struct ns__person in, struct ns__test &out); ~~~ The client program is: ~~~{.cpp} #include "soapH.h" #include "ns.nsmap" SOAP_SOCKET myopen(struct soap *soap, const char *endpoint, const char *host, int port) { if (strncmp(endpoint, "file:", 5)) { printf("File name expected\n"); return SOAP_INVALID_SOCKET; } if ((soap->sendfd = soap->recvfd = open(host, O_RDWR|O_CREAT, S_IWUSR|S_IRUSR)) < 0) return SOAP_INVALID_SOCKET; return soap->sendfd; } void myclose(struct soap *soap) { if (soap->sendfd > 2) // still open? close(soap->sendfd); // then close it soap->recvfd = 0; // set back to stdin soap->sendfd = 1; // set back to stdout } int mypost(struct soap *soap, const char *endpoint, const char *host, const char *path, const char *action, ULONG64 count) { return soap_send(soap, "Custom-generated file\n"); // writes to soap->sendfd } int myparse(struct soap *soap) { char buf[256]; if (lseek(soap->recvfd, 0, SEEK_SET) < 0 || soap_getline(soap, buf, 256)) // go to begin and skip custom header return SOAP_EOF; return SOAP_OK; } int main() { struct soap soap; struct ns__test r; struct ns__person p; soap_init(&soap); p.name = "John Doe"; p.age = 99; soap.fopen = myopen; // use custom open soap.fpost = mypost; // use custom post soap.fparse = myparse; // use custom response parser soap.fclose = myclose; // use custom close soap_call_ns__test(&soap, "file://test.xml", "", p, r); if (soap.error) { soap_print_fault(&soap, stdout); exit(EXIT_FAILURE); } soap_destroy(&soap); soap_end(&soap); soap_done(&soap); } ~~~ SOAP 1.1/1.2 RPC encoding specifies that SOAP/XML elements may be ignored when present in a SOAP payload on the receiving side. However, document/literal style messaging validates XML messages and extra elements cannot just be ignored as such. With SOAP document/literal style it is recommended to enable the `#SOAP_XML_STRICT` mode flag. With SOAP RPC encoding, the engine ignores XML elements that are unknown by default, unless the XML attribute `mustUnderstand="true"` is present in the XML element. It may be undesirable for elements to be ignored when the outcome of the omission is uncertain. The `::soap::fignore` callback can be set to a function that returns `#SOAP_OK` in case the element can be safely ignored, or `#SOAP_MUSTUNDERSTAND` to throw an exception, or to perform some application-specific action. For example, to throw an exception as soon as an unknown element is encountered on the input, use: ~~~{.cpp} int main() { struct soap *soap = soap_new(); soap->fignore = myignore; ... // soap_call_ns__webmethod(soap, ...) or soap_serve(soap) } int myignore(struct soap *soap, const char *tag) { return SOAP_MUSTUNDERSTAND; // never skip elements (secure) } ~~~ To selectively throw an exception when `mustUnderstand="true"` SOAP Header element is encountered or when an unknown element is encountered except for element `ns:xyz`, use: ~~~{.cpp} int main() { struct soap *soap = soap_new(); soap->fignore = ignore; ... // soap_call_ns__webmethod(soap, ...) or soap_serve(soap) } int ignore(struct soap *soap, const char *tag) { // do not ignore mustUnderstand="true" if (!soap->mustUnderstand) { // tags can be safely ignored if (soap_match_tag(soap, tag, "ns:someElement") == SOAP_OK) return SOAP_OK; } return SOAP_MUSTUNDERSTAND; } struct Namespace namespaces[] = { { "SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/" }, { "SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/" }, { "xsi", "http://www.w3.org/2001/XMLSchema-instance" }, { "xsd", "http://www.w3.org/2001/XMLSchema" }, { "ns", "some-URI"}, // binds "ns" namespace prefix to schema URI { NULL, NULL} ]; ~~~ Function `::soap_match_tag` compares two tags. The third parameter may be a pattern where `*` is a wildcard and `-` is a single character wildcard. So for example `soap_match_tag(soap, tag, "ns:*")` will match any element in namespace `ns` or when no namespace prefix is present in the XML message. The callback can also be used to keep track of unknown elements in an internal data structure such as a list: ~~~{.cpp} struct Unknown { char *tag; struct Unknown *next; }; int myignore(struct soap *soap, const char *tag) { char *s = (char*)soap_malloc(soap, strlen(tag)+1); struct Unknown *u = (struct Unknown*)soap_malloc(soap, sizeof(struct Unknown)); if (s && u) { strcpy(s, tag); u->tag = s; u->next = ulist; ulist = u; } } int main() { struct soap *soap; struct Unknown *ulist = NULL; soap_init(&soap); soap.fignore = myignore; ... // soap_call_ns__webmethod(soap, ...) or soap_serve(soap) ... // print the list of unknown elements stored in ulist soap_destroy(&soap); soap_end(&soap); soap_done(&soap); } ~~~ 🔝 [Back to table of contents](#) ## How to handle HTTP 307 temporary redirect {#http307} The client-side handling of HTTP 307 code "Temporary Redirect" and any of the redirect codes 301, 302, and 303 are not automated. Client application developers may want to consider adding a few lines of code to support redirects. It was decided not to automatically support redirects for the following reasons: * Redirecting a secure HTTPS address to a non-secure HTTP address via 307 creates a security vulnerability. * Cyclic redirects must be detected (e.g. allowing only a limited number of redirect levels). * Redirecting HTTP POST will result in re-serialization and re-post of the entire SOAP request. The SOAP request message must be re-posted in its entirety when re-issuing the SOAP operation to a new address. To implement client-side 307 redirect, add the following lines of code: ~~~{.cpp} const char *endpoint = NULL; // use default endpoint given in WSDL or specify one here int redirects = 10; // max redirect count while (redirects--) { if (soap_call_ns1__myMethod(soap, endpoint, ...)) { if ((soap->error >= 301 && soap->error <= 303) || soap->error == 307) { endpoint = soap_strdup(soap, soap->endpoint); // endpoint from HTTP 301, 302, 303, 307 Location header } else { ... // handle error break; } } else { break; // all OK now } } ~~~ 🔝 [Back to table of contents](#) ## How to implement HTTP GET, PUT, and PATCH services {#get} To implement HTTP GET request responses, define the `::soap::fget` callback function. The callback is required to produce a response to the request in textual form, such as a Web page or an XML or JSON response. You can also use the `::http_get` plugin which essentially sets the `::soap::fget` callback and also keeps track of the number of HTTP GET and POST requests made at the server side. The following example produces a Web page upon a HTTP GET request (e.g. from a browser): ~~~{.cpp} int main() { struct soap *soap = soap_new(); soap->fget = http_get; ... // soap_serve(soap); ... // } int http_get(struct soap *soap) { if (soap_response(soap, SOAP_HTML) // HTTP response header with text/html || soap_send(soap, "My Web server is operational.") || soap_end_send(soap)) return soap_closesock(soap); return soap_closesock(soap); } ~~~ The example below produces a WSDL file upon a HTTP GET with path `?wsdl`: ~~~{.cpp} int http_get(struct soap *soap) { FILE *fd = NULL; char *s = strchr(soap->path, '?'); if (!s || strcmp(s, "?wsdl")) return SOAP_GET_METHOD; fd = fopen("myservice.wsdl", "rb"); // open WSDL file to copy if (!fd) return 404; // return HTTP not found error soap->http_content = "text/xml"; // HTTP header with text/xml content if (soap_response(soap, SOAP_FILE) == SOAP_OK) { while (1) { size_t r = fread(soap->tmpbuf, 1, sizeof(soap->tmpbuf), fd); if (!r || soap_send_raw(soap, soap->tmpbuf, r)) break; } } fclose(fd); soap_end_send(soap); return soap_closesock(soap); } ~~~ For a one-way SOAP/XML message, you can also return a SOAP/XML response: ~~~{.cpp} int http_get(struct soap *soap) { soap_response(soap, SOAP_OK); return soap_send_ns1__mySendMethodResponse(soap, "", NULL, ... params ...); } ~~~ where `ns1__mySendMethodResponse` is a one-way message declared in a interface header file as: ~~~{.cpp} int ns1__mySendMethodResponse(... params ..., void); ~~~ The generated `soapClient.cpp` includes the sending-side stub function. The examples above are for HTTP GET. To implement HTTP PUT and PATCH set the `::soap::fput` and `::soap::fpatch` callback functions or use the `::http_post` plugin which is more capable. 🔝 [Back to table of contents](#) ## TCP and HTTP keep-alive {#keepalive} To activate HTTP keep-alive, set the `#SOAP_IO_KEEPALIVE` flag for both input and output modes, see Section \ref flags . For example ~~~{.cpp} struct soap soap; soap_init1(&soap, SOAP_IO_KEEPALIVE); ~~~ When a client or a service communicates with another client or service that supports keep alive, the `::soap::keep_alive` variable will be set to 1, otherwise it is reset to 0 indicating that the other party wants to close the connection. The connection maybe terminated on either end before the communication completed, for example when the server keep-alive connection has timed out. This may generate a "Broken Pipe" signal on Unix/Linux platforms. This signal can be caught with a signal handler: ~~~{.cpp} signal(SIGPIPE, sigpipe_handle); ~~~ where, for example: ~~~{.cpp} void sigpipe_handle(int x) { } ~~~ Alternatively, broken pipes can be kept silent by setting: ~~~{.cpp} soap.socket_flags = MSG_NOSIGNAL; ~~~ This setting will not generate a SIGPIPE but read/write operations return `#SOAP_EOF` instead. Note that Windows does not support signals and lack the `MSG_NOSIGNAL` flag. If the client does not close the connection, the server will wait forever when no `::soap::recv_timeout` is specified, so be careful to set timeouts, See Section \ref timeout. In addition, other clients will be denied service as long as a client keeps the connection to the server open. To prevent this from happening, the service should be multi-threaded such that each thread handles the client connection: ~~~{.cpp} int main(int argc, char **argv) { struct soap soap, *tsoap; THREAD_TYPE tid; int m, s; soap_init2(&soap, SOAP_IO_KEEPALIVE, SOAP_IO_KEEPALIVE); soap.max_keep_alive = 100; // at most 100 calls per keep-alive session soap.accept_timeout = 600; // optional: let server time out after ten minutes of inactivity m = soap_bind(&soap, NULL, 18000, BACKLOG); // use port 18000 on the current machine if (!soap_valid_socket(m)) { soap_print_fault(&soap, stderr); exit(EXIT_FAILURE); } fprintf(stderr, "Socket connection successful %d\n", m); for (count = 0; count >= 0; count++) { soap.socket_flags = MSG_NOSIGNAL; // use this soap.accept_flags = SO_NOSIGPIPE; // or this to prevent SIGPIPE s = soap_accept(&soap); if (soap_valid_socket(s)) { fprintf(stderr, "Accepts socket %d connection from IP %d.%d.%d.%d\n", s, (int)(soap.ip>>24)&0xFF, (int)(soap.ip>>16)&0xFF, (int)(soap.ip>>8)&0xFF, (int)soap.ip&0xFF); tsoap = soap_copy(&soap); if (!tsoap) soap_force_closesock(soap); else while (THREAD_CREATE(&tid, (void*(*)(void*))process_request, (void*)tsoap)) sleep(1); // failed, try again } else if (soap.errnum) // accept failed, try again after 1 second { soap_print_fault(&soap, stderr); sleep(1); } else { fprintf(stderr, "Server timed out\n"); break; } } return 0; } void *process_request(void *soap) { THREAD_DETACH(THREAD_ID); ((struct soap*)soap)->recv_timeout = 60; // Timeout after 1 minute stall on recv ((struct soap*)soap)->send_timeout = 10; // Timeout after 10 second stall on send soap_serve((struct soap*)soap); soap_destroy((struct soap*)soap); soap_end((struct soap*)soap); soap_free((struct soap*)soap); return NULL; } ~~~ A client call will automatically attempt to re-establish a connection to a server when the server has terminated the connection for any reason. This way, a sequence of calls can be made to the server while keeping the connection open. Client stub functions poll the server to check if the connection is still open. When the connection was terminated by the server, the client will automatically reconnect. A client may clear the `#SOAP_IO_KEEPALIVE` flag just before the last call to a server to let the server know it wants to close the connection after this last call. This will close the socket after the call and also informs the server to gracefully close the connection. The client-side can also set the TCP keep-alive socket properties, using the `::soap::tcp_keep_alive` flag (set to 1 to enable), `::soap::tcp_keep_idle` to set the `TCP_KEEPIDLE` value, `::soap::tcp_keep_intvl` to set the `TCP_KEEPINTVL` value, and `::soap::tcp_keep_cnt` to set the `TCP_KEEPCNT` value. If a client is in the middle of soap call that might take a long time and the server goes away/down the caller does not get any feedback until the `::soap::recv_timeout` is reached. Enabling TCP keep alive on systems that support it allows for a faster connection teardown detection for applications that need it. 🔝 [Back to table of contents](#) ## HTTP chunked transfer encoding {#chunked} Outbound HTTP messages are not chunked unless the `#SOAP_IO_CHUNK` flag is enabled. Chunking may improve the speed of message sending with HTTP, because the message length does not need to be determined in advance for the HTTP content length header. 🔝 [Back to table of contents](#) ## HTTP buffered sends {#buffered} The entire outbound message can be stored in a buffer to determine the HTTP content length rather than the two-phase encoding used by gSOAP client-side stub functions and server-side skeleton functions generated by soapcpp2, which perform a separate pass over the data to determine the length of the outbound message. Setting the flag `#SOAP_IO_STORE` for the output mode will buffer the entire message. This may or may not speed up the transmission of messages, depending on the content, but may require significant storage space to hold large messages temporarily. 🔝 [Back to table of contents](#) ## HTTP authentication {#authentication} The following sections explain how to authenticate with HTTP bearer, basic, digest, and NTLM. Proxy authentication is also covered. You could also use the WinInet plugin available in the `gsoap/mod_gsoap` directory of the gSOAP source code package to simplify Internet access for gSOAP client applications and deal with encryption, proxies, and authentication, see the gSOAP [WinInet plugin](../../wininet/html/index.html) documentation. The gSOAP CURL plugin can also be used to develop gSOAP client applications and CURL implements various HTTP authentication methods, see the gSOAP [CURL plugin](../../curl/html/index.html) documentation. 🔝 [Back to table of contents](#) ### HTTP bearer authentication {#bearerauthentication} HTTP bearer authentication is enabled at the client-side by setting the `::soap::bearer` string to the bearer token: ~~~{.cpp} struct soap *soap = soap_new(); soap->bearer = "..."; if (soap_call_ns__webmethod(soap, ...)) ... // error else ... // OK ~~~ 🔝 [Back to table of contents](#) ### HTTP basic authentication {#basicauthentication} HTTP basic authentication is enabled at the client-side by setting the `const char* ::soap::userid` and `const char* ::soap::passwd` strings to a username and password, respectively. A server may request user authentication and denies access (HTTP 401 error) when the client tries to connect without HTTP authentication (or with the wrong authentication information). Basic authentication should only be used over HTTPS, because the credentials are sent in the clear with HTTP. See Section \ref httpdaplugin to use the HTTP digest plugin that is safe for authentication over HTTP. Here is an example client code fragment to set the HTTP authentication username and password: ~~~{.cpp} struct soap *soap = soap_new(); soap->userid = "guest"; soap->passwd = "visit"; if (soap_call_ns__webmethod(soap, ...)) ... // error else ... // success ~~~ A client SOAP request will have the following HTTP header: POST /XXX HTTP/1.1 Host: YYY User-Agent: gSOAP/2.8 Content-Type: text/xml; charset=utf-8 Content-Length: ZZZ Authorization: Basic Z3Vlc3Q6Z3Vlc3Q= A client must set the `const char* ::soap::userid` and `const char* ::soap::passwd` strings for each call that requires client authentication. The strings are reset after each successful or unsuccessful call. When present, the `WWW-Authenticate` HTTP header returned by the server with the authentication realm is stored in the the `::soap::authrealm` string. This is useful for clients to use this domain information to respond to authentication requests. A stand-alone gSOAP Web Service application can enforce HTTP authentication on clients by checking the `const char* ::soap::userid` and `const char* ::soap::passwd` strings. These strings are set when a client request contains HTTP authentication headers. The strings should be checked in each service method (that requires authentication to execute). Here is an example service method implementation that enforced client authentication: ~~~{.cpp} int ns__webmethod(struct soap *soap, ...) { if (!soap->userid || !soap->passwd || strcmp(soap->userid, "guest") || strcmp(soap->passwd, "visit")) { soap->authrealm = "..."; // domain realm accessed (optional, NULL to omit) return 401; } ... // webmethod logic return SOAP_OK; } ~~~ When the authentication fails, the service response with a SOAP Fault message and a HTTP error code "401 Unauthorized". The HTTP error codes are described in Section \ref errcodes . To return a non-SOAP error, use: ~~~{.cpp} return soap_send_empty_response(soap, 401); ~~~ 🔝 [Back to table of contents](#) ### HTTP NTLM authentication {#NTLMauthentication} HTTP NTLM authentication is enabled at the client-side by installing `libntlm` from and compiling all project source codes with the compile-time flag `#WITH_NTLM`. In your application code set the `const char* ::soap::userid` and `const char* ::soap::passwd` strings to a username and password. A server may request NTLM authentication and denies access (HTTP 401 authentication required or HTTP 407 HTTP proxy authentication required) when the client tries to connect without HTTP authentication (or with the wrong authentication information). Here is an example client code fragment to set the NTLM authentication username and password: ~~~{.cpp} struct soap *soap = soap_new1(SOAP_IO_KEEPALIVE); if (soap_call_ns__webmethod(soap, ...)) { if (soap->error == 401) { soap->userid = "Zaphod"; soap->passwd = "Beeblebrox"; if (soap_call_ns__webmethod(soap, ...)) ... // error else ... // success } } ~~~ The following NTLM handshake between the client C and server S is performed: 1: C --> S & POST ... & Content-Type: text/xml; charset=utf-8 2: C <-- S & 401 Unauthorized & WWW-Authenticate: NTLM 3: C --> S & GET ... & Authorization: NTLM 4: C <-- S & 401 Unauthorized & WWW-Authenticate: NTLM 5: C --> S & POST ... & Content-Type: text/xml; charset=utf-8 & Authorization: NTLM 6: C <-- S & 200 OK where stages 1 and 2 indicates a client attempting to connect without authorization information, which is the first method call in the code above. Stage 3 to 6 happen with the proper client authentication set with `const char* ::soap::userid` and `const char* ::soap::passwd`. Optionally, the `const char* ::soap::authrealm` string should be set as well to indicate the domain accessed (this string is normally set when the server responds with HTTP 401 so the client receives this server domain information). NTLM authenticates connections, not requests. When the connection is kept alive, subsequent messages can be exchanged without re-authentication. To avoid the overhead of the first rejected call, use: ~~~{.cpp} struct soap *soap = soap_new1(SOAP_IO_KEEPALIVE); soap->ntlm_challenge = ""; soap->userid = "Zaphod"; soap->passwd = "Beeblebrox"; soap->authrealm = "Ursa-Minor"; if (soap_call_ns__webmethod(soap, ...)) ... // error else ... // success ~~~ When the authentication fails (stage 1 and 2), the service response with HTTP error code "401 Unauthorized" and `::soap::error` is set to HTTP code 401. 🔝 [Back to table of contents](#) ### HTTP proxy NTLM authentication {#NTLMproxyauthentication} For HTTP 407 Proxy Authentication Required set the `::soap::proxy_userid` and `::soap::proxy_passwd`: ~~~{.cpp} struct soap *soap = soap_new1(SOAP_IO_KEEPALIVE); soap->proxy_host = "..."; soap->proxy_port = ...; if (soap_call_ns__webmethod(soap, ...)) { if (soap->error == 407) { soap->proxy_userid = "Zaphod"; soap->proxy_passwd = "Beeblebrox"; soap->authrealm = "Ursa-Minor"; if (soap_call_ns__webmethod(soap, ...)) ... // error else ... // success ~~~ To avoid the overhead of the first rejected call, use: ~~~{.cpp} struct soap *soap = soap_new1(SOAP_IO_KEEPALIVE); soap->proxy_host = "..."; soap->proxy_port = ...; soap->proxy_userid = "Zaphod"; soap->proxy_passwd = "Beeblebrox"; soap->authrealm = "Ursa-Minor"; soap->ntlm_challenge = ""; if (soap_call_ns__webmethod(soap, ...)) ... // error else ... // success ~~~ 🔝 [Back to table of contents](#) ### HTTP proxy basic authentication {#proxyauthentication} HTTP proxy authentication (basic) is enabled at the client-side by setting the `::soap::proxy_userid` and `::soap::proxy_passwd` strings to a username and password, respectively. For example, a proxy server may request user authentication. Otherwise, access is denied by the proxy (HTTP 407 error). Example client code fragment to set proxy server, username, and password: ~~~{.cpp} struct soap *soap = soap_new(); soap->proxy_host = "xx.xx.xx.xx"; // IP or domain soap->proxy_port = 8080; soap->proxy_userid = "guest"; soap->proxy_passwd = "guest"; ~~~ A client SOAP request will have the following HTTP header: POST /XXX HTTP/1.1 Host: YYY User-Agent: gSOAP/2.8 Content-Type: text/xml; charset=utf-8 Content-Length: ZZZ Proxy-Authorization: Basic Z3Vlc3Q6Z3Vlc3Q= When X-Forwarded-For headers are returned by the proxy, the header can be accessed in the `::soap::proxy_from` string. The CONNECT method is used for HTTP proxy authentication: CONNECT server.example.com:80 HTTP/1.1 In some cases, you will notice that the Host HTTP header uses the CONNECT protocol: CONNECT server.example.com:80 HTTP/1.1 Host: server.example.com:80 🔝 [Back to table of contents](#) ## Performance improvement tips {#tips} Here are some tips you can use to speed up gSOAP. The default settings are chosen to maximize portability and compatibility. The settings can be tweaked to optimize the performance as follows: * Increase the buffer size `#SOAP_BUFLEN` by changing the `#SOAP_BUFLEN` macro in `gsoap/stdsoap2.h`. Use buffer size 2^18=262144 for example. * Use HTTP keep-alive at the client-side, see Section \ref keepalive , when the client needs to make a series of calls to the same server. Server-side keep-alive support can greatly improve performance of both client and server. But be aware that clients and services under Unix/Linux require signal handlers to catch dropped connections. * Use HTTP chunked transfers, see Section \ref chunked . * Do not use gzip compression, since the overhead of compression is typically higher than the bandwidth gains. * Set the `#SOAP_XML_TREE` flag to disable id-ref multi-ref object serialization. This boosts performance significantly and works with SOAP document/literal style (i.e. no id-ref graph serialization as required with SOAP encoding style). Do not use this for SOAP RPC encoded messaging. * Compile `gsoap/stdsoap2.c` and `gsoap/stdsoap2.cpp` and all other source codes with the compile time flag `#WITH_NOIDREF` to improve performance even better by permanently disabling id-ref multi-ref object serialization. Do not use this for SOAP RPC encoded messaging. * Do not use DEBUG mode, since the overhead of logging is significant. 🔝 [Back to table of contents](#) ## Safety guards {#safety} The following settings are important to ensure that XML messaging is safe by defining reasonable XML message restrictions. Also messaging timeouts should be set as explained in Section \ref timeout. The XML parser is configured to restrict the XML nesting depth level to `#SOAP_MAXLEVEL` and restricts the repeated occurrence of elements that are deserialized into arrays and containers by `#SOAP_MAXOCCURS`. These macros can be changed, but you can also change the following context attributes at run-time, e.g. to enhance the safety for specific service and/or client operations: * `::soap::maxlevel` restricts the XML nesting depth level, where the default value is `#SOAP_MAXLEVEL` = 10000. * `::soap::maxoccurs` restricts the number of repeated occurrences of elements that are deserialized into arrays and structs, where the default value is `#SOAP_MAXOCCURS` = 100000. * `::soap::maxlength` restricts the length of strings deserialized from XML. A zero or negative value is unrestricted length. When restricted, the XML schema validation maxLength takes precedence over this length restriction. So setting a smaller value will not interfere with the XML validation rules. The default value is `#SOAP_MAXLENGTH` = 0. Note that string length is expressed in number of characters, not bytes. So UTF-8 encodings are not truncated. * `::soap::recv_maxlength` the maximum length of messages received, 2GB by default. XML schema validation constraints are enforced with the `#SOAP_XML_STRICT` context flag. The schema maxLength validation constraint overrules the `::soap::maxlength` guard. The schema maxOccurs validation constraint does not overrule the `::soap::maxoccurs` guard, so arrays and containers are always restricted in length by this guard. Other compile-time configuration settings are: * `#SOAP_MAXALLOCSIZE` the maximum size of a block of memory that `malloc` can allocate. * `#SOAP_MAXARRAYSIZE` the maximum allocation threshold to pre-allocate SOAP arrays in memory. * `#SOAP_MAXDIMESIZE` the maximum DIME attachment size allowed to receive. * `#SOAP_MAXEINTR` maximum number of EINTR interrupts to ignore while polling a socket for pending activity. 🔝 [Back to table of contents](#) ## Timeout management for non-blocking operations {#timeout} Socket connect, accept, send, and receive timeout values can be set to manage socket communication timeouts. The `::soap::connect_timeout`, `::soap::accept_timeout`, `::soap::send_timeout`, `::soap::recv_timeout` and `::soap::transfer_timeout` context attributes of the current context `::soap` can be set to the appropriate user-defined socket send, receive, and accept timeout values. A positive value measures the timeout in seconds. A negative timeout value measures the timeout in microseconds (10^-6 sec). The `::soap::connect_timeout` specifies the timeout for `soap_call_ns__webmethod` stub function calls and for C++ proxy class calls. The `::soap::accept_timeout` specifies the timeout for `::soap_accept` calls. The `::soap::send_timeout` and `::soap::recv_timeout` specify the timeout for non-blocking socket I/O operations. This is the maximum delay on the socket operation permitted. The `::soap::transfer_timeout` is new since 2.8.48 and limits the time a message send and a message receive operation can take. This value should be used in combination with `::soap::send_timeout` and `::soap::recv_timeout` for accurate timeout control. The `::soap::recv_maxlength` value when non-zero limits the length of messages that can be received in bytes in total in decompressed form (message length includes HTTP headers and HTTP chunk size fields). The value of `::soap::recv_maxlength` is 2GB by default. Example: ~~~{.cpp} struct soap *soap = soap_new(); soap->send_timeout = 10; soap->recv_timeout = 10; soap->recv_timeout = 60; ~~~ This will result in a timeout if no data can be send in 10 seconds and no data is received within 10 seconds after initiating a send or receive operation over the socket. A value of zero disables timeout, for example: ~~~{.cpp} struct soap *soap = soap_new(); soap->send_timeout = 0; soap->recv_timeout = 0; soap->recv_timeout = 0; ~~~ When a timeout occurs in the send or receive operations, a `#SOAP_EOF` exception will be raised ("end of file or no input"). Negative timeout values measure timeouts in microseconds, for example: ~~~{.cpp} #define uSec *-1 #define mSec *-1000 struct soap *soap = soap_new(); soap->accept_timeout = 10 uSec; soap->send_timeout = 20 mSec; soap->recv_timeout = 20 mSec; soap->recv_timeout = 10; ~~~ @warning many Linux versions do not support non-blocking `connect()`. Therefore, setting `::soap::connect_timeout` for non-blocking `soap_call_ns__webmethod` calls may not work under Linux. @warning interrupts (EINTR) can affect the blocking time in I/O operations. The maximum number of EINTR that will not trigger an error is set by `#SOAP_MAXEINTR` in `gsoap/stdsoap2.h`, which is 10 by default. Each EINTR may increase the blocking time by up to one second, up to `#SOAP_MAXEINTR` seconds total. 🔝 [Back to table of contents](#) ## Closing connections by force {#forceclose} To close a socket connection by force, you can use `soap_force_closesock(soap)`, which closes the connection regardless if keep-alive is active. By contrast, `soap_closesock(soap)` only closes the connection when keep-alive is not active. To force-close a connection from another thread, compile stdsoap2.c or stdsoap2.cpp and your project source code with `#WITH_SELF_PIPE` to enable this feature. Use `soap_close_connection(soap)` on the `::soap` context that must close. You can make this call from another thread and pass the `::soap` context to this function of the thread that must close connections. 🔝 [Back to table of contents](#) ## Socket options and flags {#socketopt} Socket communications can be controlled with socket options and flags. The `::soap` context flags are: * `::soap::socket_flags` to set flags for the socket `send` and `recv` calls. * `::soap::connect_flags` to set client-side `setsockopt` `SOL_SOCKET` socket options when connecting. * `::soap::bind_flags` to set server-side `setsockopt` `SOL_SOCKET` socket options when executing `::soap_bind`. * `::soap::bind_v6only` set to 1 to set `setsockopt` `IPPROTO_IPV6` `IPV6_V6ONLY`. * `::soap::accept_flags` to set flags to the `setsockopt` socket options when executing `::soap_accept`. See the operating system manual pages of `send` and `recv` for `::soap::socket_flags` values and see the operating system manual pages of `setsockopt` for `::soap::connect_flags`, `::soap::bind_flags`, and `::soap::accept_flags` (level `SOL_SOCKET`) values. These `SO_` socket option flags (see `setsockopt` manual pages) can be bit-wise or-ed to set multiple socket options at once. The client-side flag `::soap::connect_flags` = `SO_LINGER` is supported with values `l_onoff` = 1 and `l_linger` = `::soap::linger_time`. The `::soap::linger_time` determines the wait time (the time resolution is system dependent, though according to some experts only zero and nonzero values matter). The linger option can be used to manage the number of connections that remain in `TIME_WAIT` state at the server side. For example, to disable SIGPIPE signals on Unix/Linux platforms use: `::soap::socket_flags` = `MSG_NOSIGNAL` and/or `::soap::connect_flags` = `SO_NOSIGPIPE` (i.e. client-side connect) depending on your platform. Use `::soap::bind_flags` = `SO_REUSEADDR` to enable server-side port reuse and local port sharing (but be aware of the possible security implications such as port hijacking). Note that you have access to the `::soap->master` socket value returned by `::soap_bind` so you can set multiple socket options by calling `setsockopt` as follows: ~~~{.cpp} int sock = soap_bind(soap, host, port, backlog); if (soap_valid_socket(sock)) { setsockopt(sock, ..., ..., ..., ...); setsockopt(sock, ..., ..., ..., ...); ~~~ 🔝 [Back to table of contents](#) ## Overriding the host and port to connect {#hostportconnect} To override the host and port of the client connecting to a server, set `::soap::override_host` and `::soap::override_port`: ~~~{.cpp} soap->override_host = "example.com"; // host name or IP address soap->override_port = 80; // port number to use when overriding the address ~~~ 🔝 [Back to table of contents](#) ## Secure Web services with HTTPS {#serveropenssl} To enable SSL for stand-alone gSOAP Web servers, first install OpenSSL and use option the compile-time flag `#WITH_OPENSSL` to compile the sources with your C or C++ compiler (or use the compile-time flag `#WITH_GNUTLS` if you prefer GNUTLS), for example: c++ -DWITH_OPENSSL -o myprog myprog.cpp stdsoap2.cpp soapC.cpp soapServer.cpp -lssl -lcrypto With GNUTLS: c++ -DWITH_GNUTLS -o myprog myprog.cpp stdsoap2.cpp soapC.cpp soapServer.cpp -lgnutls -lgcrypt -lgpg-error SSL support for stand-alone gSOAP Web services is enabled by calling `::soap_ssl_accept` to perform the SSL/TLS handshake after `::soap_accept`. In addition, a key file, a CA file (or path to certificates), DH file (if RSA is not used), and password need to be supplied. Instructions on how to do this can be found in the OpenSSL documentation . See also Section \ref ssl . Let's take a look at an example SSL secure multi-threaded stand-alone SOAP Web Service: ~~~{.cpp} int main() { SOAP_SOCKET m, s; THREAD_TYPE tid; struct soap *soap, *tsoap; soap_ssl_init(); /* init OpenSSL (skipping this or calling multiple times is OK, since the engine will init SSL automatically) */ /* soap_ssl_noinit(); */ /* do not init OpenSSL (if SSL is already initialized elsewhere in this application) */ if (CRYPTO_thread_setup()) /* OpenSSL thread mutex setup */ { fprintf(stderr, "Cannot setup thread mutex\n"); exit(EXIT_FAILURE); } soap = soap_new(); if (soap_ssl_server_context(soap, SOAP_SSL_DEFAULT, "server.pem", /* keyfile: required when server must authenticate to clients (see SSL docs on how to obtain this file) */ "password", /* password to read the key file (not used with GNUTLS) */ "cacert.pem", /* optional cacert file to store trusted certificates */ NULL, /* optional capath to directory with trusted certificates */ "dh512.pem", /* DH file name or DH key len bits (minimum is 512, e.g. "512") to generate DH param, if NULL use RSA */ NULL, /* if randfile!=NULL: use a file with random data to seed randomness */ NULL /* optional server identification to enable SSL session caching to speed up TLS (must be a unique name) */ )) { soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } m = soap_bind(soap, NULL, 18000, BACKLOG); /* use port 18000 */ if (!soap_valid_socket(m)) { soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } fprintf(stderr, "Socket connection successful: master socket = %d\n", m); while (1) { s = soap_accept(soap); fprintf(stderr, "Socket connection successful: slave socket = %d\n", s); if (!soap_valid_socket(s)) { if (soap->errnum) /* accept failed, try again after 1 second */ { soap_print_fault(soap, stderr); sleep(1); continue; /* retry */ } fprintf(stderr, "Server timed out\n"); break; } tsoap = soap_copy(soap); if (!tsoap) soap_force_closesock(soap); else while (THREAD_CREATE(&tid, (void*(*)(void*))&process_request, (void*)tsoap)) sleep(1); /* failed, try again */ } soap_free(soap); /* deallocates SSL context */ CRYPTO_thread_cleanup(); /* OpenSSL thread mutex cleanup */ return 0; } void *process_request(struct soap *soap) { THREAD_DETACH(THREAD_ID); if (soap_ssl_accept(soap)) soap_print_fault(soap, stderr); else soap_serve(soap); soap_destroy(soap); soap_end(soap); soap_free(soap); return NULL; } ~~~ The `::soap_ssl_server_context` function initializes the server-side SSL context. The `server.pem` key file is the server's private key concatenated with its certificate. The `cacert.pem` is used to authenticate clients and contains the client certificates. Alternatively a directory name can be specified. This directory is assumed to contain the certificates. The `dh512.pem` file specifies that DH will be used for key agreement instead of RSA. A numeric value greater than 512 can be provided instead as a string constant (e.g. `"512"`) to allow the engine to generate the DH parameters on the fly (this can take a while) rather than retrieving them from a file. The randfile entry can be used to seed the PRNG. The last entry enable server-side session caching to speed up TLS. A unique server name is required. You can set a specific cipher list with `SSL_CTX_set_cipher_list(soap->ctx, "...")` where `::soap::ctx` is the SSL context created by `::soap_ssl_server_context`. The GNUTLS mutex lock setup is automatically performed in the engine, but only when POSIX threads are detected and available. All OpenSSL versions prior to 1.1.0 require mutex locks to be explicitly set up in your code for multi-threaded applications by calling `CRYPTO_thread_setup()` and `CRYPTO_thread_cleanup()` as was shown in the code above. OpenSSL 1.1.0 and greater does not require these locks to be set up. If you are not sure which version of OpenSSL you may be using with your multi-threaded application, then set up the locks. For Unix and Linux, make sure you have signal handlers set in your service and/or client applications to catch broken connections (`SIGPIPE`): ~~~{.cpp} signal(SIGPIPE, sigpipe_handle); ~~~ where, for example: ~~~{.cpp} void sigpipe_handle(int x) { } ~~~ By default, clients are not required to authenticate. To require client authentication use the following: ~~~{.cpp} if (soap_ssl_server_context(&soap, SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION, "server.pem", "password", "cacert.pem", NULL, "dh512.pem", NULL, NULL)) { soap_print_fault(&soap, stderr); exit(EXIT_FAILURE); } ~~~ This requires each client to authenticate with its certificate, in addition for the server to authenticate to the client. Since release version 2.8.20, SSL v3 is disabled. To enable SSL v3 together with TLS 1.0 and higher, use `#SOAP_SSLv3_TLSv1` with `::soap_ssl_server_context`. To use TLS 1.1 and 1.2 use `SOAP_TLSv1_1 | SOAP_TLSv1_2`. To use TLS 1.2 only use `#SOAP_TLSv1_2`. To use SSL v3 only use `#SOAP_SSLv3`. The `cacert` file and `capath` are optional. Either one can be specified when clients must run on non-trusted systems (`capath` is not used with GNUTLS). We want to avoid storing trusted certificates in the default location on the file system when that is not secure. Therefore, a flat `cacert.pem` file or directory can be specified to store trusted certificates. The gSOAP package includes a `cacerts.pem` file with the certificates of all certificate authorities. You can use this file to verify the authentication of servers that provide certificates issued by these CAs. The `cacert.pem`, `client.pem`, and `server.pem` files in the gSOAP package are examples of self-signed certificates. The `client.pem` and `server.pem` contain the client/server private key concatenated with the certificate. The keyfiles (`client.pem` and `server.pem`) are created by concatenating the private key PEM with the certificate PEM. The keyfile should not be shared with any party. With OpenSSL, you can encrypt the keyfiles with a password to offer some protection and the password is used in the client/server code to read the keyfile. GNUTLS does not support this feature and cannot encrypt or decrypt a keyfile. @warning it is important that the `#WITH_OPENSSL` macro must be consistently defined to compile the sources, such as `gsoap/stdsoap2.cpp`, `soapC.cpp`, `soapClient.cpp`, `soapServer.cpp`, and all application sources that include `gsoap/stdsoap2.h` or `soapH.h`. If the macros are not consistently used, the application will crash due to a mismatches in the declaration and access of the `::soap` context. See also API documentation Module \ref group_ssl for more details on the SSL/TLS functions. 🔝 [Back to table of contents](#) ## Secure clients with HTTPS {#clientopenssl} To utilize HTTPS/SSL, you need to install the OpenSSL library on your platform or GNUTLS for a light-weight SSL/TLS library. After installation, compile all the sources of your application with compile-time flag `#WITH_OPENSSL` (or `#WITH_GNUTLS` when using GNUTLS). For example on Linux: c++ -DWITH_OPENSSL myclient.cpp stdsoap.cpp soapC.cpp soapClient.cpp -lssl -lcrypto or Unix: c++ -DWITH_OPENSSL myclient.cpp stdsoap.cpp soapC.cpp soapClient.cpp -lxnet -lsocket -lnsl -lssl -lcrypto or you can add the following line to `soapdefs.h`: ~~~{.cpp} #define WITH_OPENSSL ~~~ and compile with compile-time flag `#WITH_SOAPDEFS_H` to include `soapdefs.h` in your project. Alternatively, compile with GNUTLS: c++ -DWITH_GNUTLS myclient.cpp stdsoap.cpp soapC.cpp soapClient.cpp -lgnutls -lgcrypt -lgpg-error A client program simply uses the prefix `https:` instead of `http:` in the endpoint URL of a service operation call to a Web Service to use encrypted transfers (if the service supports HTTPS). You need to specify the client-side key file and password of the keyfile: ~~~{.cpp} struct soap soap; soap_ssl_init(); /* init OpenSSL (skipping this or calling multiple times is OK, since the engine will init SSL automatically) */ /* soap_ssl_noinit(); */ /* do not init OpenSSL (if SSL is already initialized elsewhere in this application) */ soap_init(&soap); if (soap_ssl_client_context(&soap, SOAP_SSL_DEFAULT, "client.pem", /* keyfile: required only when client must authenticate to server (see SSL docs on how to obtain this file) */ "password", /* password to read the key file (not used with GNUTLS) */ "cacerts.pem", /* cacert file to store trusted certificates (needed to verify server) */ NULL, /* capath to directory with trusted certificates */ NULL /* if randfile!=NULL: use a file with random data to seed randomness */ )) { soap_print_fault(&soap, stderr); exit(EXIT_FAILURE); } soap_call_ns__mymethod(&soap, "https://domain/path/secure.cgi", "", ...); ~~~ By default, server authentication is enabled and the `cacerts.pem` or `capath` (not used with GNUTLS) must be set so that the CA certificates of the server(s) are accessible at run time. The `cacerts.pem` file included in the gSOAP source code package contains the certificates of common CAs. This file must be supplied with the client, if server authentication is required. Alternatively, you can use the `gsoap/plugin/cacerts.h` and `gsoap/plugin/cacerts.c` code to embed CA certificates in your client code. You can set a specific cipher list with `SSL_CTX_set_cipher_list(soap->ctx, "...")` where `::soap::ctx` is the SSL context created by `::soap_ssl_client_context`. Other client-side SSL options are `#SOAP_SSL_SKIP_HOST_CHECK` to skip the host name verification check and `#SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE` to allow connecting to a host with an expired certificate. For example, ~~~{.cpp} struct soap soap; soap_ssl_init(); /* init OpenSSL (skipping this or calling multiple times is OK, since the engine will init SSL automatically) */ /* soap_ssl_noinit(); */ /* do not init OpenSSL (if SSL is already initialized elsewhere in this application) */ soap_init(&soap); if (soap_ssl_client_context(&soap, SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION | SOAP_SSL_SKIP_HOST_CHECK, | SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE, "client.pem", /* keyfile: required only when client must authenticate to server (see SSL docs on how to obtain this file) */ "password", /* password to read the key file (not used with GNUTLS) */ "cacerts.pem", /* cacert file to store trusted certificates (needed to verify server) */ NULL, /* capath to directory with trusted certificates */ NULL /* if randfile!=NULL: use a file with random data to seed randomness */ )) { soap_print_fault(&soap, stderr); exit(EXIT_FAILURE); } soap_call_ns__mymethod(&soap, "https://domain/path/secure.cgi", "", ...); ~~~ For systems based on Microsoft windows, the WinInet module can be used instead, see `mod_gsoap/gsoap_win/wininet`. Since release version 2.8.20 SSL v3 is disabled. To enable SSL v3 together with TLS 1.0 and higher, use `#SOAP_SSLv3_TLSv1` with `::soap_ssl_server_context`. To use TLS 1.1 and 1.2 use `SOAP_TLSv1_1 | SOAP_TLSv1_2`. To use TLS 1.2 only use `#SOAP_TLSv1_2`. To use SSL v3 only use `#SOAP_SSLv3`. To disable server authentication for testing purposes, use the following: ~~~{.cpp} if (soap_ssl_client_context(&soap, SOAP_SSL_NO_AUTHENTICATION, NULL, NULL, NULL, NULL, NULL )) { soap_print_fault(&soap, stderr); exit(EXIT_FAILURE); } ~~~ This also assumes that the server does not require clients to authenticate (the keyfile is absent). Make sure you have signal handlers set in your application to catch broken connections (`SIGPIPE`): ~~~{.cpp} signal(SIGPIPE, sigpipe_handle); ~~~ where, for example: ~~~{.cpp} void sigpipe_handle(int x) { } ~~~ @warning It is important that the `#WITH_OPENSSL` macro is consistently defined to compile the sources, such as `gsoap/stdsoap2.cpp`, `soapC.cpp`, `soapClient.cpp`, `soapServer.cpp`, and all application sources that include `gsoap/stdsoap2.h` or `soapH.h`. If the macros are not consistently used, the application will crash due to a mismatches in the declaration and access of the `::soap` context. Alternatively, use library `-lgsoapssl` or `-lgsoapssl++` and compile everything else with `#WITH_OPENSSL`. @warning Concurrent client calls with threads should use separate `::soap` contexts In addition, the thread initialization code discussed in Section \ref serveropenssl must be used to properly setup OpenSSL in a multi-threaded client application. See also API documentation Module \ref group_ssl for more details on the SSL/TLS functions. You can also use the WinInet interface to establish secure HTTPS connections on Windows machines, available in the `gsoap/mod_gsoap` directory of the gSOAP source code package, see also Section \ref wininetplugin. Or you can use the CURL plugin to use CURL to establish secure HTTPS connections, see Section \ref curlplugin. 🔝 [Back to table of contents](#) ## SSL authentication callbacks {#sslauthenticationcallbacks} The `fsslauth` callback function controls OpenSSL/GNUTLS authentication initialization: * `int (soap::fsslauth)(struct soap *soap)` This callback is called to initialize the OpenSSL or GNUTLS context for HTTPS connections configured with the parameters passed to `::soap_ssl_client_context` and `::soap_ssl_server_context`. Returns `#SOAP_OK` or a `::soap_status` (int) error code. The built-in function assigned to `::soap::fsslauth` is `ssl_auth_init`. The `fsslverify` callback function controls OpenSSL peer certificate verification, via internally invoking `SSL_CTX_set_verify`: * `int (soap::fssverify)(int ok, X509_STORE_CTX *store` This callback is called by the engine to manage the verification of the certificate provided by a peer, such as the certificate provided by a server connected over HTTPS or to verify the certificate included with a WS-Security message. To require certificate verification of a server connected via HTTPS, use `::soap_ssl_client_context` with `#SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION`. To require certificate verification of a client connected to a server, use `::soap_ssl_server_context` with `#SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION`. The `ok` parameter of this callback indicates whether the verification of the certificate in question passed (`ok` == 1) or failed (`ok` == 0) as determined by the OpenSSL library based on the `::soap_ssl_client_context` or `::soap_ssl_server_context` configuration. If the callback returns 1 then the handshake is continued and the connection maybe established. To return 1 when `ok` == 0 requires resetting the error state with `X509_STORE_CTX_set_error(store, X509_V_OK)`. If the callback returns 0 then the handshake is immediately terminated with "verification failed" and a verification failure alert is sent to the peer. The built-in function assigned to `::soap::fsslverify` is `ssl_verify_callback` or when `#SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE` is used `ssl_verify_callback_allow_expired_certificate`. 🔝 [Back to table of contents](#) ## SSL certificates and key files {#ssl} The gSOAP package includes a `cacerts.pem` file with the certificates of all certificate authorities. You can use this file to verify the authentication of servers that provide certificates issued by these CAs. Just set the `cafile` parameter to the location of this file on your file system. Therefore, when you obtain a certificate signed by a trusted CA you can simply use the `cacerts.pem` file to develop client applications that can verify the authenticity of your server. Alternatively, you can use the `gsoap/plugin/cacerts.h` and `gsoap/plugin/cacerts.c` code to embed CA certificates in your client code. For systems based on Microsoft windows, the WinInet module can be used instead, see the `README.txt` located in the gSOAP source code package under `mod_gsoap/gsoap_win/wininet`, see the gSOAP [WinInet plugin](../../wininet/html/index.html) documentation. The other `.pem` files in the gSOAP package are examples of self-signed certificates for testing purposes (`cacert.pem`, `client.pem`, `server.pem`). The `client.pem` and `server.pem` contain the private key and certificate of the client or server, respectively. The keyfiles (`client.pem` and `server.pem`) are created by concatenating the private key PEM with the certificate PEM. The keyfile should not be shared with any party. With OpenSSL, you can encrypt the keyfiles with a password to offer some protection and the password is used in the client/server code to read the keyfile. GNUTLS does not support this feature and cannot encrypt or decrypt a keyfile. You can also create your own self-signed certificates. There is more than one way to generate the necessary files for clients and servers. See for information on OpenSSL and on how to setup and manage a local CA and on how to setup self-signed test certificates. It is possible to convert IIS-generated certificates to PEM format with the openssl library and openssl command-line tool: openssl x509 -in mycert.cer -inform DER -out mycert.pem -outform PEM This converts the CRT-formatted mycert.cer to PEM-formatted mycert.pem. Here is the simplest way to setup self-signed certificates. First you need to create a private Certificate Authority (CA). The CA is used in SSL to verify the authenticity of a given certificate. The CA acts as a trusted third party who has authenticated the user of the signed certificate as being who they say. The certificate is signed by the CA, and if the client trusts the CA, it will trust your certificate. For use within your organization, a private CA will probably serve your needs. However, if you intend use your certificates for a public service, you should probably obtain a certificate from a known CA. In addition to identification, your certificate is also used for encryption. Creating certificates should be done through a CA to obtain signed certificates. But you can create your own certificates for testing purposes as follows. * Go to the OpenSSL bin directory (`/usr/local/ssl` by default and `/System/Library/OpenSSL` on Mac OS X) * There should be a file called openssl.cnf * Create a new directory in your home account, e.g. $HOME/CA, and copy the openssl.cnf file to this directory * Modify openssl.cnf by changing the 'dir' value to HOME/CA * Copy the README.txt, root.sh, and cert.sh scripts from the gSOAP source code package located in the `gsoap/samples/ssl` directory to HOME/CA * Follow the README.txt instructions You now have a self-signed CA root certificate cacert.pem and a server.pem (or client.pem) certificate in PEM format. The cacert.pem certificate is used in the `cafile` parameter of the `::soap_ssl_client_context` (or `::soap_ssl_server_context`) at the client (or server) side to verify the authenticity of the peer. You can also provide a capath parameter to these trusted certificates. The server.pem (or client.pem) must be provided with the `::soap_ssl_server_context` at the server side (or `::soap_ssl_client_context` at the client side) together with the password you entered when generating the certificate using cert.sh to access the file. These certificates must be present to grant authentication requests by peers. In addition, the server.pem (and client.pem) include the host name of the machine on which the application runs (e.g. localhost), so you need to generate new certificates when migrating a server (or client). Finally, you need to generate Diffie-Helmann (DH) parameters for the server if you wish to use DH instead of RSA. There are two options: * Set the `dhfile` parameter to the numeric DH prime length in bits required (for example "1024") to let the engine generate DH parameters at initialization. This can be time consuming. * Provide a file name for the `dhfile` parameter of `::soap_ssl_server_context`. The file should be generated beforehand. To do so with the OpenSSL command line tool, use: openssl dhparam -outform PEM -out dh.pem 512 File `dh512.pem` is the output file and 512 is the number of bits used. 🔝 [Back to table of contents](#) ## SSL hardware acceleration {#sslhw} You can specify a hardware engine to enable hardware support for cryptographic acceleration. This can be done once in a server or client with the following statements: ~~~{.cpp} static const char *engine = "cswift"; /* engine name */ int main() { ENGINE *e; if (!(e = ENGINE_by_id(engine))) fprintf(stderr, "Error finding engine %s\n", engine); else if (!ENGINE_set_default(e, ENGINE_METHOD_ALL)) fprintf(stderr, "Error using engine %s\n", engine); ... // } ~~~ The following table lists the names of the hardware and software engines: engine | result -------------------- | ------ `openssl` | The default software engine for cryptographic operations `openbsd_dev_crypto` | OpenBSD supports kernel level cryptography `cswift` | CryptoSwift acceleration hardware `chil` | nCipher CHIL acceleration hardware `atalla` | Compaq Atalla acceleration hardware `nuron` | Nuron acceleration hardware `ubsec` | Broadcom uBSec acceleration hardware `aep` | Aep acceleration hardware `sureware` | SureWare acceleration hardware 🔝 [Back to table of contents](#) ## SSL on Windows {#sslwin} Set the full path to `libssl.lib` and `libcrypto.lib` under the MSVC++ "Projects" menu, then choose "Link": "Object/Modules". Please make sure `libssl32.dll` and `libeay32.dll` can be loaded by your applications, thus they must be installed properly on the target machine. If you're using compilation settings such as `/MTd` then link to the correct `libeay32MTd.lib` and `ssleay32MTd.lib` libraries. Alternatively, you can use the WinInet interface for secure connections, available in the `gsoap/mod_gsoap` directory of the gSOAP package, see also Section \ref wininetplugin. Or you can use the CURL plugin to use CURL for secure connections, see Section \ref curlplugin. 🔝 [Back to table of contents](#) ## Zlib compression {#compression} To enable deflate and gzip compression with Zlib, install Zlib from if not already installed on your system. Compile `gsoap/stdsoap2.cpp` (or `gsoap/stdsoap2.c`) and all your sources that include `gsoap/stdsoap2.h` or `soapH.h` with compile-time flag `#WITH_GZIP` and link your code with the Zlib library, e.g. `-lz` on Unix/Linux platforms. The gzip compression is orthogonal to all transport encodings such as HTTP, SSL, DIME, and can be used with other transport layers. You can even save and load compressed XML data to/from files. Two compression formats are supported by the engine: deflate and gzip. The gzip format is used by default. The gzip format has several benefits over deflate. Firstly, the engine automatically detects gzip compressed inbound messages, even without HTTP headers, by checking for the presence of a gzip header in the message content. Secondly, gzip includes a CRC32 checksum to ensure messages have been correctly received. Thirdly, gzip compressed content can be decompressed with other compression software, so you can decompress XML data saved by a gSOAP application in gzip format. Gzip compression is enabled by compiling the sources with compile-time flag `#WITH_GZIP`. To transmit gzip compressed SOAP/XML data, set the output mode flags to `#SOAP_ENC_ZLIB`. For example: ~~~{.cpp} soap_init(&soap); soap_set_omode(&soap, SOAP_ENC_ZLIB); // enable Zlib's gzip if (soap_call_ns__myMethod(&soap, ...)) ... // error else ... // success soap_clr_omode(&soap, SOAP_ENC_ZLIB); // disable Zlib's gzip ~~~ This will send a compressed SOAP/XML request to a service, provided that Zlib is installed and linked with the application and the compile-time flag `#WITH_GZIP` option was used to compile the sources. Receiving compressed SOAP/XML over HTTP either in gzip or deflate formats is automatic. The `#SOAP_ENC_ZLIB` flag does not have to be set at the server side to accept compressed messages. Reading and receiving gzip compressed SOAP/XML without HTTP headers (e.g. with other transport protocols) is also automatic. To control the level of compression for outbound messages, you can set the `::soap::z_level` to a value between 1 and 9, where 1 is the best speed and 9 is the best compression (default is 6). For example ~~~{.cpp} soap_init(&soap); soap_set_omode(&soap, SOAP_ENC_ZLIB); soap.z_level = 9; // best compression ~~~ To verify and monitor compression rates, you can use the values `::soap::z_ratio_in` and `::soap::z_ratio_out`. These two float values lie between 0.0 and 1.0 and express the ratio of the compressed message length over uncompressed message length. ~~~{.cpp} if (soap_call_ns__myMethod(&soap, ...)) { ... // error } else { printf("Compression ratio: %f%% (in) %f%% (out)\n", 100*soap.z_ratio_out, 100*soap.z_ratio_in); ... // success } ~~~ Note: lower ratios mean higher compression rates. Compressed transfers require buffering the entire output message to determine HTTP message length. This means that the `#SOAP_IO_STORE` flag is automatically set when the `#SOAP_ENC_ZLIB` flag is set to send compressed messages. The use of HTTP chunking significantly reduces memory usage and may speed up the transmission of compressed SOAP/XML messages. This is accomplished by setting the `#SOAP_IO_CHUNK` flag with `#SOAP_ENC_ZLIB` for the output mode. However, some Web servers do not accept HTTP chunked request messages (even when they return HTTP chunked messages!). Stand-alone gSOAP services always accept chunked request messages. To restrict the compression to the deflate format only, compile the sources with the compile-time flag `#WITH_ZLIB`. This limits compression and decompression to the deflate format. Only plain and deflated messages can be exchanged, gzip is not supported with this option. Receiving gzip compressed content is automatic, even in the absence of HTTP headers. Receiving deflate compressed content is not automatic in the absence of HTTP headers and requires the flag `#SOAP_ENC_ZLIB` to be set for the input mode to decompress deflated data. @warning it is important that the `#WITH_GZIP` and `#WITH_ZLIB` macros must be consistently defined to compile the sources, such as `gsoap/stdsoap2.cpp`, `soapC.cpp`, `soapClient.cpp`, `soapServer.cpp`, and all application sources that include `gsoap/stdsoap2.h` or `soapH.h`. If the macros are not consistently used, the application will crash due to a mismatches in the declaration and access of the `::soap` context. 🔝 [Back to table of contents](#) ## Client-side cookie support {#clientcookie} Client-side cookie support is optional. To enable cookie support, compile all sources with the compile-time flag `#WITH_COOKIES`, for example: c++ -DWITH_COOKIES -o myclient stdsoap2.cpp soapC.cpp soapClient.cpp or add the following line to `stdsoap.h`: ~~~{.cpp} #define WITH_COOKIES ~~~ Client-side cookie support is fully automatic. So just compile `gsoap/stdsoap2.cpp` with the compile-time flag `#WITH_COOKIES` to enable cookie-based session control in your client. A cookie store with cookies is kept and returned to the appropriate servers when the client connects to these servers. Cookies are not automatically saved to a file by a client. An example cookie file manager is included as an extras in the gSOAP package. You can remove all cookies from a `::soap` context by calling `soap_free_cookies(soap)`, which also happens when you call `soap_done(soap)`. To avoid "cookie storms" caused by malicious servers that return an unreasonable amount of cookies, gSOAP clients/servers are limited to a cookie store size of `::soap::cookie_max` that the user can change, for example: ~~~{.cpp} struct soap *soap = soap_new(); soap->cookie_max = 10; ~~~ The cookie store is a linked list of `::soap_cookie` structures pointed to by `::soap::cookies`. Since the cookie store is linked to the current `::soap` context, and each thread must use its own context, each thread also has its own cookie store. 🔝 [Back to table of contents](#) ## Server-side cookie support {#servercookie} Server-side cookie support is optional. To enable cookie support, compile all sources with compile-time flag `#WITH_COOKIES`: c++ -DWITH_COOKIES -o myserver ... See API documentation Module \ref group_cookies for the cookie API functions. See the [HTTP sessions plugin](../../sessions/html/index.html) for HTTP session management with cookies. Here is an overview of the cookie API functions: * `struct soap_cookie *soap_set_cookie(struct soap *soap, const char *name, const char *value, const char *domain, const char *path);` This function adds a cookie to the cookie store at the server side, if not already there, with the specified `name` and `value`. The `domain` and `path` parameters can be specified or can be NULL to use the current domain and path given by `::soap::cookie_domain` and `::soap::cookie_path`. Returns pointer to the cookie structure in the database or NULL when an error occurred. * `int soap_set_cookie_expire(struct soap *soap, const char *name, long expire, const char *domain, const char *path);` This function sets the expiration of the specified cookie `name` in seconds and updates the cookie store at the server side. The `domain` and `path` parameters can be specified or can be NULL to use the current domain and path given by `::soap::cookie_domain` and `::soap::cookie_path`. Returns `#SOAP_OK` or a `::soap_status` error code. * `int soap_set_cookie_secure(struct soap *soap, const char *name, const char *domain, const char *path);` This function sets the "secure" property of the specified cookie `name` and updates the cookie store at the server side. The "secure" property means that this cookie should be sent by the client to the server only when a secure HTTPS connection can be established. When HTTPS is enabled all cookies are sent by the server to the client with the "secure" property set, which means that this function is generally not needed unless the server is not HTTPS-enabled but cookies must be secure. The `domain` and `path` parameters can be specified or can be NULL to use the current domain and path given by `::soap::cookie_domain` and `::soap::cookie_path`. Returns `#SOAP_OK` or a `::soap_status` error code. * `int soap_set_cookie_session(struct soap *soap, const char *name, const char *domain, const char *path);` This function makes the specified cookie `name` a "session cookie" and updates the cookie store at the server side by marking the cookie as a session cookie. This means that the cookie will be sent to clients that connect to the server. This function is not needed when a cookie is modified with `::soap_set_cookie_expire`, for example, because modified cookies are always sent back to the client. The `domain` and `path` parameters can be specified or can be NULL to use the current domain and path given by `::soap::cookie_domain` and `::soap::cookie_path`. Returns `#SOAP_OK` or a `::soap_status` error code. * `void soap_clr_cookie(struct soap *soap, const char *name, const char *domain, const char *path);` This function deletes the specified cookie `name` from the cookie store at the server side. The `domain` and `path` parameters can be specified or can be NULL to use the current domain and path given by `::soap::cookie_domain` and `::soap::cookie_path`. * `int soap_clr_cookie_session(struct soap *soap, const char *name, const char *domain, const char *path);` This function clears the session property of the specified cookie `name` and updates the cookie store at the server side. The `domain` and `path` parameters can be specified or can be NULL to use the current domain and path given by `::soap::cookie_domain` and `::soap::cookie_path`. Returns `#SOAP_OK` or a `::soap_status` error code. * `struct soap_cookie *soap_cookie(struct soap *soap, const char *name, const char *domain, const char *path);` This function returns the cookie structure of the specified cookie `name` or NULL when not found by searching the cookie store at the server side. The `domain` and `path` parameters can be specified or can be NULL to use the current domain and path given by `::soap::cookie_domain` and `::soap::cookie_path`. * `const char *soap_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path);` This function returns the cookie value of the specified cookie `name` or NULL when not found by searching the cookie store at the server side. The `domain` and `path` parameters can be specified or can be NULL to use the current domain and path given by `::soap::cookie_domain` and `::soap::cookie_path`. * `time_t soap_cookie_expire(struct soap *soap, const char *name, const char *domain, const char *path);` This function returns the cookie expiration time `time_t` of the specified cookie `name` or -1 when not found by searching the cookie store at the server side. The `domain` and `path` parameters can be specified or can be NULL to use the current domain and path given by `::soap::cookie_domain` and `::soap::cookie_path`. * `int soap_getenv_cookies(struct soap *soap);` This function initializes the cookie store at the server side by reading the `HTTP_COOKIE` environment variable. This provides a means for a CGI application to read cookies sent by a client. Returns `#SOAP_OK` or a `::soap_status` error code when the `HTTP_COOKIE` variable was not found. * `void soap_free_cookies(struct soap *soap);` This function frees the cookie store and deletes all cookies. The following variables of the `::soap` context are used to define the current domain and path: * `const char * soap::cookie_domain` should be set to the domain (host) of the service * `const char * soap::cookie_path` may be set to the default path to the service * `int soap::cookie_max` maximum cookie database size (default=32) The `::soap::cookie_path` value is used to filter cookies intended for this service according to the path prefix rules outlined in RFC2109. The following example server adopts cookies for session control: ~~~{.cpp} int main() { struct soap soap; int m, s; soap_init(&soap); soap.cookie_domain = "..."; soap.cookie_path = "/"; // the path which is used to filter/set cookies with this destination if (argc < 2) { soap_getenv_cookies(&soap); // CGI app: grab cookies from 'HTTP_COOKIE' env var soap_serve(&soap); } else { m = soap_bind(&soap, NULL, atoi(argv[1]), 10); // small BACKLOG for iterative servers if (!soap_valid_socket(m)) exit(EXIT_FAILURE); for (int i = 1; ; i++) { s = soap_accept(&soap); if (!soap_valid_socket(s)) exit(EXIT_FAILURE); soap_serve(&soap); soap_end(&soap); soap_free_cookies(&soap); // remove all old cookies from database so no interference occurs with the arrival of new cookies } } return 0; } int ns__webmethod(struct soap *soap, ...) { const char *cookie_value = soap_cookie_value(soap, "cookie_name", NULL, NULL); if (!cookie_value) // cookie returned by client? cookie_value = "initial_value"; // no: set initial cookie value else ... // yes: modify the cookie value to reflect the new state soap_set_cookie(soap, "cookie_name", cookie_value, NULL, NULL); soap_set_cookie_expire(soap, "cookie_name", 60, NULL, NULL); // cookie expires in 60 seconds return SOAP_OK; } ~~~ 🔝 [Back to table of contents](#) ## Connecting clients through proxy servers {#proxyservers} When a client needs to connect to a Web Service through a proxy server, set the `::soap::proxy_host` string and `::soap::proxy_port` integer attributes of the current `::soap` context to the proxy's host name and port, respectively. For example: ~~~{.cpp} struct soap soap; soap_init(&soap); soap.proxy_host = "proxyhostname"; soap.proxy_port = 8080; if (soap_call_ns__webmethod(&soap, "http://host:port/path", "action", ...)) soap_print_fault(&soap, stderr); else ... // success ~~~ The context attributes `::soap::proxy_host` and `::soap::proxy_port` keep their values through a sequence of service operation calls, so they only need to be set once. When X-Forwarded-For headers are returned by the proxy, the header can be accessed in the `::soap::proxy_from` string. See also Sections \ref proxyauthentication and \ref NTLMproxyauthentication. 🔝 [Back to table of contents](#) ## Bind before connect and setting the client interface address {#bindbeforeconnect} To bind the client to a port before connect, set the `::soap::client_port` to a non-negative port number: ~~~{.cpp} struct soap *soap = soap_new(); soap->client_port = ...; // non-negative port number if (soap_call_ns__webmethod(soap, "http://host:port/path", "action", ...)) ... // error else ... // success ~~~ This port number is used only once and reset to -1 (disabled). Set it again for the next call. To set a client interface address for the connection that is an IP address of the client: ~~~{.cpp} struct soap *soap = soap_new(); soap->client_interface = "..."; // IP address if (soap_call_ns__webmethod(soap, "http://host:port/path", "action", ...)) ... // error else ... // success ~~~ This client interface address string is used only once and reset to NULL (disabled). Set it again for the next call. This feature is not available when compiling the code on windows. 🔝 [Back to table of contents](#) ## FastCGI {#fastcgi} To enable FastCGI support, install FastCGI and compile all soapcpp2-generated source code files and your application sources with the compile-time flag `#WITH_FASTCGI` or add: ~~~{.cpp} #define WITH_FASTCGI ~~~ to `gsoap/stdsoap2.h` and recompile the project code. @warning Do not link against the `gsoap/libgsoap*` libraries as these are not suitable for FastCGI. Compile `gsoap/stdsoap2.c` (or `gsoap/stdsoap2.cpp`) instead. 🔝 [Back to table of contents](#) ## How to minimize application memory footprint {#lean} To compile gSOAP applications intended for small memory devices, you may want to remove all non-essential features that consume precious code and data space. To do this, compile the source code files with the compile-time flag `#WITH_LEAN` (i.e. `#define WITH_LEAN`) to remove many non-essential features. The features that will be disabled are: * No UDP support * No HTTP keep alive support * No HTTP bearer, basic, and digest authentication * No HTTP chunked output with `#SOAP_IO_CHUNK`, but chunked HTTP input is accepted * No HTTP compressed output with `#SOAP_ENC_ZLIB`, but compressed input is accepted * No canonical XML output with `#SOAP_XML_CANONICAL` * No `::soap::connect_timeout`, `::soap::send_timeout`, `::soap::recv_timeout` and `::soap::transfer_timeout` timeouts * No support for socket flags, no `::soap::socket_flags`, `::soap::connect_flags`, `::soap::bind_flags`, `::soap::accept_flags` * No support for `time_t` serialization with the `xsd__dateTime` type, use a string to store the date and time instead. Use the compile-time flag `#WITH_LEANER` to make the executable even smaller by removing DIME and MIME attachment handling, `#LONG64` (64 bit) serialization, `wchar_t*` serialization, and support for XML DOM operations. Note that DIME/MIME attachments are not essential to achieve SOAP/XML interoperability. DIME attachments are a convenient way to exchange non-text-based (i.e. binary) content, but are not required for basic SOAP/XML interoperability. Attachment requirements are predictable. That is, applications won't suddenly decide to use DIME or MIME instead of XML to exchange content. It is safe to try to compile your application with the compile-time flag `#WITH_LEAN`, provided that your application does not rely on I/O timeouts. When no linkage error occurs in the compilation process, it is safe to assume that your application will run just fine. 🔝 [Back to table of contents](#) ## How to remove the BSD socket library requirement {#noio} The `gsoap/stdsoap2.c` and `gsoap/stdsoap2.cpp` libraries should be linked with a BSD socket library in the project build. To remove the need to link a socket library, you can compile `gsoap/stdsoap2.c` (for C) and `gsoap/stdsoap2.cpp` (for C++) with the the compile-time flag `#WITH_NOIO` macro set (i.e. `#define WITH_NOIO`). This removes the dependency on the BSD socket API, IO streams, `FILE` type, and `errno`. You should define callbacks to replace the missing socket stack. To do so, add to your code the following definitions: ~~~{.cpp} struct soap soap; soap_init(&soap); /* fsend is used to transmit data in blocks */ soap.fsend = my_send; /* frecv is used to receive data in blocks */ soap.frecv = my_recv; /* fopen is used to connect */ soap.fopen = my_tcp_connect; /* fclose is used to disconnect */ soap.fclose = my_tcp_disconnect; /* fclosesocket is used only to close the master socket in a server upon soap_done() */ soap.fclosesocket = my_tcp_closesocket; /* fshutdownsocket is used after completing a send operation to send TCP FIN */ soap.fshutdownsocket = my_tcp_shutdownsocket; /* setting fpoll is optional, leave it NULL to omit polling the server */ soap.fpoll = my_poll; /* faccept is used only by a server application */ soap.faccept = my_accept; ~~~ These functions should provide a minimal input/output stack (`::soap::frecv` and `::soap::fsend`) to read/write XML and socket-like stack (the other functions) when developing client and server applications. See Section \ref callback for more details on the use of these callbacks. All callback function pointers should be non-NULL, except `::soap::fpoll`. You cannot use `::soap_print_fault` and `::soap_print_fault_location` to print error diagnostics. Instead, the value of `::soap::error`, which contains the gSOAP error code, can be used to determine the cause of a fault. 🔝 [Back to table of contents](#) ## How to combine multiple client and server implementations into one executable {#combine} The wsdl2h tool can be used to import multiple WSDLs and schemas at once. The service definitions are combined in one header file to be parsed by soapcpp2. It is important to assign namespace prefixes to namespace URIs using the `typemap.dat` file. Otherwise, wsdl2h will assign namespace prefixes `ns1`, `ns2`, and so on to the service operations and schema types. Thus, any change to a WSDL or schema may result in a new prefix assignment. For more details, please see Section \ref typemap . Another approach to combine multiple client and service applications into one executable is by using C++ namespaces to structurally separate the definitions. This is automated with [`wsdl2h -q name` option `-q name`](#wsdl2h-q). Or by creating libraries in C for the client/server objects as explained in subsequent sections Both approaches are demonstrated by examples in the gSOAP source code package, the `gsoap/samples/link` (C only) and `gsoap/samples/link++` (C++ with C++ namespaces) examples. 🔝 [Back to table of contents](#) ## How to build a client or server in a C++ code namespace {#codenamespace} You can use a C++ code namespace of your choice in your interface header file to build a client or server in that C++ namespace. In this way, you can create multiple clients and servers that can be combined and linked together without conflicts, which is explained in more detail in the next section (which also shows an example combining two client libraries defined in two C++ code namespaces). Use [`wsdl2h -q name` option `-q name`](#wsdl2h-q) to generate definitions in the C++ `name` namespace. This option can also be used in combination with C++ proxy and server object generation, using `soapcpp2 -j` option `-j` or option `-i`). At most one namespace can be defined for the entire interface header file for soapcpp2. The C++ namespace must completely encapsulate the entire contents of the header file: ~~~{.cpp} namespace NamespaceName { ... interface header file contents ... } ~~~ When compiling this interface header file with the soapcpp2 tool, all type definitions, the serializers for these types, and the stub and skeleton functions will be placed in this namespace. The XML namespace mapping table (saved in a `.nsmap` file) will not be placed in the code namespace to allow it to be linked as a global object. You can use `soapcpp2 -n` option `-n` to create local XML namespace tables, see Section \ref soapcpp2options (but remember that you explicitly need to initialize the namespaces to point to a table at run time using `::soap_set_namespaces`). The generated files are prefixed with the code namespace name instead of the usual `soap` file name prefix to enable multiple client/server codes to be build in the same project directory. Because the SOAP Header and Fault serializers will also be placed in the namespace, they cannot be called from the `gsoap/stdsoap2.cpp` run time library code and are therefore rendered unusable. Therefore, these serializers are not compiled at all (enforced with `#define WITH_NOGLOBAL`). To add SOAP Header and Fault serializers, you must compile them separately as follows. First, create a new header file `env.h` with the SOAP Header `::SOAP_ENV__Header` and SOAP Fault `::SOAP_ENV__Fault` structures, including `::SOAP_ENV__Detail` if this structure contains members that are serialized as fault details. You can leave this header file empty if you want to use the default SOAP Header and Fault. However, if SOAP Headers are required then you cannot leave the `::SOAP_ENV__Header` structure empty. For example, the WS-Addressing and WS-Security plugins require SOAP Headers which can be imported by adding `#import "wsa5.h"` and `#import "wsse.h"`, respectively to `env.h`. Then compile this header file with: soapcpp2 -penv env.h The generated `envC.cpp` file holds the SOAP Header and Fault serializers and you can link this file with your client and server applications. 🔝 [Back to table of contents](#) ## How to create client/server libraries {#dylibs} The soapcpp2 tool produces `soapClientLib.cpp` and `soapServerLib.cpp` source code files that are specifically intended for building static or dynamic client and server libraries in C or C++. These files export the stub and skeleton functions, but keep all serialization code static, thus hidden to avoid link symbol conflicts when combining multiple clients and services into one executable. Note that it is far simpler to use the wsdl2h tool on multiple WSDL files to generate a header file that combines all service definitions. However, the approach presented in this section is useful when creating (dynamic) libraries for client and server objects, such as DLLs as described in Section \ref dll . @note One major disadvantage of the approach presented here is that the serializer functions are no longer accessible in the user's source code, because serializers will be converted to static functions (to be used by the generated stub and skeleton functions only). For example, functions such as `soap_new_T`, `soap_default_T`, `soap_write_T`, `soap_read_T`, `soap_put_T`, and `soap_get_T` cannot be used any longer. Using C++ namespaces is a better alternative when building applications in C++ that combine multiple clients and services. To build multiple libraries, you can define a C++ namespace in your header file with `soapcpp2 -qname` option `-qname`, see Section \ref codenamespace for details. For C, you can use `soapcpp2 -c -p name` option `-p name` to rename the generated `soapClientLib.c` and `soapServerLib.c` (and associated) files. The `-p name` option specifies the file `name` prefix to replace the `soap` file name prefix. The engine does not define SOAP Header and Fault serializers that the engine needs. We therefore add SOAP Header and Fault serializers, which are compiled separately as follows. First, create a new header file `env.h` with the SOAP Header `::SOAP_ENV__Header` and SOAP Fault `::SOAP_ENV__Fault` structures, including `::SOAP_ENV__Detail` if this structure contains members that are serialized as fault details. You can leave this header file empty if you want to use the default SOAP Header and Fault. However, if SOAP Headers are required then you cannot leave the `::SOAP_ENV__Header` structure empty. For example, the WS-Addressing and WS-Security plugins require SOAP Headers which can be imported by adding `#import "wsa5.h"` and `#import "wsse.h"`, respectively to `env.h`. Then compile this header file with: soapcpp2 -penv env.h The generated `envC.cpp` file holds the SOAP Header and Fault serializers and you can create a (dynamic) library for it to link it with your client and server applications. You should then compile the `gsoap/stdsoap2.cpp` library with the compile-time `#WITH_NONAMESPACES` flag: c++ -DWITH_NONAMESPACES -c stdsoap2.cpp This omits the reference to the global namespaces table, which is nowhere to be defined since we will use XML namespaces for each client/service separately. Therefore, you must explicitly set the namespaces value of the `::soap` context in your code every time after initialization of the `::soap` context with the `soap_set_namespaces(struct soap*, const struct Namespace*)` function. For example, suppose we have two clients defined in header files `client1.h` and `client2.h`. We first generate the `envH.h` file for the SOAP Header and Fault definitions: soapcpp2 -c -penv env.h Then we generate the code for client1 and client2: soapcpp2 -c -n -pmyClient1 client1.h soapcpp2 -c -n -pmyClient2 client2.h This generates `myClient1ClientLib.c` and `myClient2ClientLib.c` (among several other files). These two files should be compiled and linked with your application. The source code of your application should include the generated `envH.h`, `myClient1H.h`, `myClient2.h` files and `myClient1.nsmap`, `myClient2.nsmap` files: ~~~{.cpp} #include "myClient1H.h" // include client 1 stubs #include "myClient2H.h" // include client 2 stubs #include "envH.h" ... // #include "myClient1H.nsmap" // include client 1 nsmap #include "myClient2H.nsmap" // include client 2 nsmap struct soap *soap = soap_new(); soap_set_namespaces(soap, myClient1_namespaces); ... // make Client 1 invocations ... // soap_set_namespaces(soap, myClient2_namespaces); ... // make Client 2 invocations ~~~ It is important to use `soapcpp2 -n` option `-n`, see Section \ref soapcpp2options, to rename the namespace tables so we can include them all without running into redefinitions. @note Link conflicts may still occur in the unlikely situation that identical service operation names are defined in two or more stub or skeleton functions when these methods share the same XML namespace prefix. 🔝 [Back to table of contents](#) ### C++ examples {#example13} As an example we will build a Delayed Stock Quote client library and a Currency Exchange Rate client library. First, we create an empty header file `env.h`, which may be empty or should contain SOAP Header and Fault definitions as explained in Section \ref dylibs, and compile it as follows: soapcpp2 -penv env.h c++ -c envC.cpp We also compile `gsoap/stdsoap2.cpp` without namespaces: c++ -c -DWITH_NONAMESPACES stdsoap2.cpp If you do not use `#WITH_NONAMESPACES` then you will get an unresolved link error for the global `namespaces` table. You can define a dummy table to avoid having to recompile `gsoap/stdsoap2.cpp`. Second, we create the Delayed Stock Quote header file specification, which may be obtained using the WSDL importer. If you want to use C++ namespaces then you need to manually add the `namespace` declaration to the generated header file: ~~~{.cpp} namespace quote { //gsoap ns service name: Service //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service location: http://services.xmethods.net/soap //gsoap ns schema namespace: urn:xmethods-delayed-quotes //gsoap ns service method-action: getQuote "" int ns__getQuote(char *symbol, float &Result); } // namespace quote ~~~ We then compile it as a library and we use option `-n` to prefix the generated files and to rename the namespace table to avoid link conflicts later: soapcpp2 -n quote.h c++ -c quoteClientLib.cpp If you don't want to use a C++ code namespace, you should compile `quote.h` "as is" with option `-pquote`: soapcpp2 -n -pquote quote.h c++ -c quoteClientLib.cpp Third, we create the Currency Exchange Rate header file specification: ~~~{.cpp} namespace rate { //gsoap ns service name: Service //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service location: http://services.xmethods.net/soap //gsoap ns schema namespace: urn:xmethods-CurrencyExchange //gsoap ns service method-action: getRate "" int ns__getRate(char *country1, char *country2, float &Result); } // namespace rate ~~~ Similar to the Quote example above, we generate source code using option `-n` to prefix the generated files and to rename the namespace table to avoid link conflicts: soapcpp2 -n rate.h Fourth, we use the generated source code libraries with the main program. ~~~{.cpp} #include "quoteH.h.h" #include "rateH.h.h" #include "quote.nsmap" #include "rate.nsmap" int main(int argc, char *argv[]) { if (argc <= 1) { std::cerr << "Usage: main ticker [currency]" << std::endl exit(EXIT_FAILURE); } struct soap *soap = soap_new(); float q; soap_set_namespaces(soap, quote_namespaces); if (soap_call_ns__getQuote(soap, NULL, NULL, argv[1], q)) // get quote { soap_print_fault(soap, stderr); } else { if (argc > 2) { float r; soap_set_namespaces(soap, rate_namespaces); if (soap_call_ns__getRate(soap, NULL, NULL, "us", argv[2], r)) // get rate in US dollars soap_print_fault(soap, stderr); else q *= r; // convert the quote } std::cout << argv[1] << ": " << q << std::endl; } soap_destroy(soap); soap_end(soap); soap_free(soap); return 0; } ~~~ Compile and link this application with `stdsoap2.o`, `envC.o`, `quoteServerProxy.o`, and `rateServerProxy.o`. Instead of the generated `soap_call_webmethod` stub functions you can also use `soapcpp2 -j` option `-j` or option `-i` to generate C++ proxy classes. To compile server is very similar. For example, assume that we need to implement a calculator service and we want to create a library for it. ~~~{.cpp} namespace calc { //gsoap ns service name: Calc //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service location: http://www.cs.fsu.edu/~engelen/calc.cgi //gsoap ns schema namespace: urn:calc int ns__add(double a, double b, double &result); int ns__sub(double a, double b, double &result); int ns__mul(double a, double b, double &result); int ns__div(double a, double b, double &result); } // namespace calc ~~~ We generate code: soapcpp2 -j -n calc.h Here we used option `-j` to generate a C++ service class `calcCalcService.h` and `calcCalcService.cpp`. The effect of the `-n` option is that it creates local namespace tables and uses `calc` to prefix the generated files. ~~~{.cpp} #include "calcCalcService.h" #include "calc.nsmap" int main() { calc::Calc calc; ... // calc.serve(); // calls request dispatcher to invoke one of the functions below ... // } int calc::Calc::add(double a, double b, double &result) { result = a + b; return SOAP_OK; } int calc::Calc::sub(double a, double b, double &result) { result = a - b; return SOAP_OK; } int calc::Calc::mul(double a, double b, double &result) { result = a * b; return SOAP_OK; } int calc::Calc::div(double a, double b, double &result) { result = a / b; return SOAP_OK; } ~~~ The example above serves requests over stdin/out. Use the bind and accept calls to create a stand-alone server to service inbound requests over sockets, see Section \ref stand-alone . 🔝 [Back to table of contents](#) ### C examples {#example14} This is the same example as above, but the clients are build in C. We create a `env.h` that contains the joint SOAP Header and SOAP Fault definitions. You may have to copy-paste these from the other header files. Then, compile it as follows: soapcpp2 -c -penv env.h cc -c envC.c We also compile `gsoap/stdsoap2.c` without namespaces: cc -c -DWITH_NONAMESPACES stdsoap2.c Second, we create the Delayed Stock Quote header file specification, which may be obtained using the WSDL importer. ~~~{.cpp} //gsoap ns service name: Service //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service location: http://services.xmethods.net/soap //gsoap ns schema namespace: urn:xmethods-delayed-quotes //gsoap ns service method-action: getQuote "" int ns__getQuote(char *symbol, float *Result); ~~~ We compile it as a library and we use options `-n` and `-pquote` to prefix the generated files and to rename the namespace table to avoid link conflicts: soapcpp2 -c -n -pquote quote.h cc -c quoteClientLib.c Third, we create the Currency Exchange Rate header file specification: ~~~{.cpp} //gsoap ns service name: Service //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service location: http://services.xmethods.net/soap //gsoap ns schema namespace: urn:xmethods-CurrencyExchange //gsoap ns service method-action: getRate "" int ns__getRate(char *country1, char *country2, float *Result); ~~~ We compile it as a library and we use options `-n` and `-prate` to prefix the generated files and to rename the namespace table to avoid link conflicts: soapcpp2 -c -n -prate rate.h cc -c rateClientLib.c The main program is: ~~~{.cpp} #include "quoteH.h" #include "rateH.h" #include "quote.nsmap" #include "rate.nsmap" int main(int argc, char *argv[]) { if (argc <= 1) { fprintf(stderr, "Usage: main ticker [currency]\n"); exit(EXIT_FAILURE); } struct soap *soap = soap_new(); float q; soap_set_namespaces(soap, quote_namespaces); if (soap_call_ns__getQuote(soap, NULL, NULL, argv[1], &q)) // get quote soap_print_fault(soap, stderr); else { if (argc > 2) { soap_set_namespaces(soap, rate_namespaces); float r; if (soap_call_ns__getRate(soap, NULL, NULL, "us", argv[2], &r)) // get rate in US dollars soap_print_fault(soap, stderr); else q *= r; // convert the quote } printf("%s: %f \n", argv[1], q); } soap_destroy(soap); soap_end(soap); soap_free(soap); return 0; } ~~~ Compile and link this application with `stdsoap2.o`, `envC.o`, `quoteClientLib.o`, and `rateClientLib.o`. 🔝 [Back to table of contents](#) ### How to chain C services to accept messages on the same port {#example15} When combining multiple services into one application, you can run wsdl2h on multiple WSDLs to generate the single all-inclusive service definitions interface header file for soapcpp2. This header file is then processed with soapcpp2 to generate skeleton functions in C. What if we generate multiple services, each from a WSDL separately, and want to deploy them on the same port? This requires listening to the same port and then chaining the service dispatches so that each service can serve a request. First we create a `env.h` that contains the joint SOAP Header and SOAP Fault definitions, for example by copy-pasting these from the other header files generated by wsdl2h. Or this file is empty if no specialized SOAP Headers and Faults are used. We compile it as follows: soapcpp2 -c -penv env.h cc -c envC.c We also compile `gsoap/stdsoap2.c` without namespaces: cc -c -DWITH_NONAMESPACES stdsoap2.c Say for example that we have a service definition in `quote.h`. We compile it as a library and we use options `-n` and `-pquote` to prefix the generated files and to rename the namespace table to avoid link conflicts: soapcpp2 -c -n -pquote quote.h cc -c quoteClientLib.c We do the same for a service definition in `rate.h`: soapcpp2 -c -n -prate rate.h cc -c rateClientLib.c To serve both the quote and rate services on the same port, we chain the service dispatchers as follows: ~~~{.cpp} #include "quoteH.h" #include "rateH.h" #include "quote.nsmap" #include "rate.nsmap" struct soap *soap = soap_new(); if (soap_valid_socket(soap_bind(soap, NULL, 8080, 10))) // small BACKLOG for iterative servers { while (1) { if (soap_valid_socket(soap_accept(soap))) { if (soap_begin_serve(soap)) { soap_print_fault(soap, stderr); continue; } soap_set_namespaces(soap, quote_namespaces); if (quote_serve_request(soap) == SOAP_NO_METHOD) { soap_set_namespaces(soap, rate_namespaces); if (rate_serve_request(soap)) soap_send_fault(soap); // send fault to client } else if (soap->error) { soap_send_fault(soap); // send fault to client } } else if (soap->errnum) // accept failed, try again after 1 second { soap_print_fault(soap, stderr); sleep(1); } else { fprintf(stderr, "server timed out\n"); break; } soap_destroy(soap); soap_end(soap); } } soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~ This chaining can be arbitrarily deep. When the previous request fails with a `#SOAP_NO_METHOD` then next request dispatcher can be tried. The server should also define the service operations: ~~~{.cpp} int ns__getQuote(struct soap *soap, char *symbol, float *Result); { *Result = ... ; return SOAP_OK; } int ns__getRate(struct soap *soap, char *country1, char *country2, float *Result); { *Result = ... ; return SOAP_OK; } ~~~ However, the while loop iterates for each new connection that is established with `::soap_accept` and does not allow for HTTP keep-alive connections to persist. For our final improvement we want to support HTTP keep-alive connections that require looping over the service dispatches until the connection closes on either end, after which we resume the outer loop. The resulting code is very close to the soapcpp2-generated `::soap_serve` code and the `serve` service class methods, with the addition of the chain of service dispatches in the loop body: ~~~{.cpp} #include "quoteH.h" #include "rateH.h" #include "quote.nsmap" #include "rate.nsmap" struct soap *soap = soap_new(); if (soap_valid_socket(soap_bind(soap, NULL, 8080, 10))) // small BACKLOG for iterative servers { while (1) { if (soap_valid_socket(soap_accept(soap))) { soap->keep_alive = soap->max_keep_alive + 1; // max keep-alive iterations do { if ((soap->keep_alive > 0) && (soap->max_keep_alive > 0)) soap->keep_alive--; if (soap_begin_serve(soap)) { if (soap->error >= SOAP_STOP) // if a plugin has served the request continue; // then continue with the next request break; // an error occurred } soap_set_namespaces(soap, quote_namespaces); if (quote_serve_request(soap) == SOAP_NO_METHOD) { soap_set_namespaces(soap, rate_namespaces); if (rate_serve_request(soap)) soap_send_fault(soap); // send fault to client } else if (soap->error) { soap_send_fault(soap); // send fault to client } soap_destroy(soap); soap_end(soap); } while (soap->keep_alive); } else if (soap->errnum) // accept failed, try again after 1 second { soap_print_fault(soap, stderr); sleep(1); } else { fprintf(stderr, "server timed out\n"); break; } soap_destroy(soap); soap_end(soap); } } soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~ 🔝 [Back to table of contents](#) ## How to create DLLs {#dll} 🔝 [Back to table of contents](#) ### Creating the base stdsoap2.dll {#basedll} The engine does not define SOAP Header and Fault serializers that the engine needs when installed as a library. We therefore add SOAP Header and Fault serializers, which are compiled separately as follows. First, create a new header file `env.h` with the SOAP Header `::SOAP_ENV__Header` and SOAP Fault `::SOAP_ENV__Fault` structures, including `::SOAP_ENV__Detail` if this structure contains members that are serialized as fault details. You can leave this header file empty if you want to use the default SOAP Header and Fault. However, if SOAP Headers are required then you cannot leave the `::SOAP_ENV__Header` structure empty. For example, the WS-Addressing and WS-Security plugins require SOAP Headers which can be imported by adding `#import "wsa5.h"` and `#import "wsse.h"`, respectively to `env.h`. Then compile this header file with: soapcpp2 -penv env.h The generated `envC.cpp` file holds the SOAP Header and Fault serializers. We can either create a separate `envC.dll` DLL for this that all clients and service applications will use, or combine `envC.cpp` with the `stdsoap2.dll` we create, which we will explain further. The next step is to create `stdsoap2.dll` which consists of the file `gsoap/stdsoap2.cpp` and `envC.cpp` and optionally the plugins you want to use such as `wsseapi.cpp` (we need to rename all `.c` files to `.cpp` files to avoid issues with MSVC++). This DLL contains all common functions needed for all other clients and servers based on gSOAP. Compile `envC.cpp` and `gsoap/stdsoap2.cpp` into `stdsoap2.dll` using the compiler option `/D` `#WITH_NONAMESPACES` and the MSVC Pre-Processor definitions `SOAP_FMAC1=__declspec(dllexport)`, `SOAP_FMAC3=__declspec(dllexport)`, and the `#SOAP_STD_EXPORTS` macro set as shown below from the MSVC command prompt: C:> cl /c /I. /EHsc /DWITH_NONAMESPACES /DSOAP_FMAC1=__declspec(dllexport) /DSOAP_FMAC3=__declspec(dllexport) /DSOAP_STD_EXPORTS envC.cpp stdsoap2.cpp C:> link /LIBPATH ws2_32.lib /OUT:mygsoap.dll /DLL envC.obj stdsoap2.obj Note: as of gSOAP 2.8.30 and later, the DLL export macros shown here are all set with one pre-processor definition `#SOAP_STD_EXPORTS`. Alternatively, you can compile with `/D` `#WITH_SOAPDEFS_H` and put the macro definitions in `soapdefs.h`. This exports all functions which are preceded by the macro `#SOAP_FMAC1` in the `soapcpp2.cpp` source file and macro `#SOAP_FMAC3` in the `envC.cpp` source file. Finally, note that the gSOAP source code package contains a lot of `.c` source code files. Mixing C with C++ files is not recommended with Visual Studio and will lead to run-time errors when building DLLs. Therefore, always rename `.c` source code files to `.cpp` source code files when creating DLLs. 🔝 [Back to table of contents](#) ### Creating client and server DLLs {#clientserverdll} Compile the `soapClientLib.cpp` and `soapServerLib.cpp` sources as DLLs by using the MSVC Pre-Processor definitions `SOAP_FMAC5=__declspec(dllexport)` and `SOAP_CMAC=__declspec(dllexport)`, and by using the C++ compiler option `/D` `#WITH_NONAMESPACES`. All of these macros are set as a shorthand with one pre-processor definition `#SOAP_STD_EXPORTS` (requires gSOAP 2.8.30 or later). This DLL links to `stdsoap2.dll` we created in Section \ref basedll. To create multiple DLLs in the same project directory, you should use `soapcpp2 -p name` option `-p name` to rename the generated `soapClientLib.cpp` and `soapServerLib.cpp` (and associated) files. The `-p name` option specifies a `name` prefix to replace the `soap` file name prefix. Another way is to use C++ namespaces with `soapcpp2 -q name` option `-q name`, if the interface header file input to soapcpp2 does not already declare a C++ namespace. A clean separation of libraries can also be achieved with C++ namespaces, see Section \ref codenamespace . Unless you use the client proxy and server object classes (`soapXYZProxy.h` and `soapXYZService.h`), all client and server applications must explicitly set the namespaces value of the `::soap` context with: ~~~{.cpp} soap_set_namespaces(soap, namespaces); ~~~ where the `namespaces[]` table should be defined in the client/server source. These tables are generated in the `.nsmap` files. The tables are renamed for convenience using `soapcpp2 -n` option `-n`, see Section \ref soapcpp2options . 🔝 [Back to table of contents](#) ## How to build modules and libraries with the #module directive {#module} The `#module` directive is used to build modules with soapcpp2. A library can be built from a module and linked with multiple Web services applications. The directive should appear at the top of the interface header file for soapcpp2 and has the following formats: ~~~{.cpp} #module "name" ~~~ and ~~~{.cpp} #module "name" "fullname" ~~~ where the `name` must be a unique short name for the module. The name is case insensitive and must not exceed 4 characters in length. The `fullname`, when present, represents the full name of the module and is used to prefix the function names of the generated serializers replacing the usual `soap` prefix. If absent, the short name is used to prefix the function names of the serializers. The rest of the content of the interface header file includes type declarations and optionally the declarations of service operations and SOAP Headers and Faults that are universally used by SOAP services, when applicable. When the soapcpp2 tool processes the header file module, it will generate the source codes for a library. The Web services application that uses the library should use a header file that imports the module with the `#import` directive, for example: ~~~{.cpp} /* Contents of file "module.h" */ #module "test" // types and typedefs become module-specific typedef LONG64 xsd__long; char*; // a module-specific struct struct ns__S { ... // members }; ~~~ The `module.h` data binding interface header file for soapcpp2 declares module-specific serializable types `LONG64`, `xsd__long`, `char*`, and a `struct ns__S`. The module name is "test", so the soapcpp2 tool produces a `testC.cpp` file with the XML serializers for these types. The `testC.cpp` data binding implementation source code can be separately compiled and linked with an application. If service operations are declared in the interface header file as function prototypes, we also get `testClient.cpp` client stub functions and `testServer.cpp` server skeleton functions. There are some limitations for module imports: - A module must be imported into another interface header to use the module's type definitions. - When multiple modules are imported, the types that they declare must be declared in one module only to avoid name clashes and link errors. You cannot create two modules that declare or use the same type and import these modules separately into another header file. When using modules, consider creating a module hierarchy such that types are declared only once and by only one module when these modules must be linked. With modules, the source code serializers for the types defined in the modules are generated with soapcpp2 separately. For example, assume that we have a module `module.h`: ~~~{.cpp} /* Contents of file "module.h" */ #module "test" struct ns__S { char *name; int amount; }; ~~~ and a header file `example.h` that uses it: ~~~{.cpp} /* Contents of file "example.h" */ #import "module.h" int ns__webmethod(const char *code, struct ns__S *record, int *result); ~~~ The module is compiled as follows: soapcpp2 module1.h This generates the files `testStub.h`, `testH.h`, and `testC.cpp` with serializers for `struct ns__S` but also for `char*` and `int`. Running soapcpp2 on `example.h` imports the module definitions, but does not generate serializers for `struct ns__S`, `char*` and `int` since these are defined by `module.h`: soapcpp2 -CL example.h An example client application that calls the client stub function: ~~~{.cpp} #include "soapH.h" #include "ns.nsmap" int main() { struct soap *soap = soap_new(); struct ns__S s; soap_default_ns__S(soap, &s); s.name = soap_strdup(soap, "name"); s.amount = 124; int n; if (soap_call_ns__webmethod(soap, endpoint, NULL, "code", &s, &n)) soap_print_fault(soap, stderr); else printf("OK n = %d\n", n); soap_destroy(soap); soap_end(soap); soap_free(soap); } ~~~ We compile this example as follows: c++ -o example example.cpp testC.cpp soapC.cpp soapClient.cpp stdsoap2.cpp Modules may help to define a modular hierarchy of libraries with reusable serializable types. 🔝 [Back to table of contents](#) ## Plugins, modules, and extensions {#plugins} Plugins offer a convenient extension mechanism for the gSOAP toolkit by extending the capabilities of its engine. When the plugin registers with the gSOAP engine, it has full access to the run-time settings and the engine's function callbacks. Upon registry, the plugin's local data is associated with the `::soap` context. By overriding the callbacks with the plugin's callbacks, the plugin extends or modifies the engine's capabilities. The local plugin data can be accessed through a lookup function, usually invoked within a callback function to access the plugin data. The registry and lookup functions are: ~~~{.cpp} int soap_register_plugin_arg(struct soap *soap, int (*fcreate)(struct soap *soap, struct soap_plugin *p, void *arg), void *arg) ~~~ ~~~{.cpp} void* soap_lookup_plugin(struct soap*, const char*); ~~~ The `::soap_copy` function returns a new dynamically allocated `::soap` context that is a copy of another, such that no data is shared between the copy and the original context. The `::soap_copy` function invokes the copy functions of the registered plugins to copy the plugins' local data. The `::soap_done` and `::soap_free` functions de-registers all plugin. The follow example overrides the send and receive callbacks to copy all messages that are sent and received to the terminal (stderr). First, we write a header file `plugin.h` to define the local plugin data structure(s) and we define a global name to identify the plugin: ~~~{.cpp} #include "stdsoap2.h" #define PLUGIN_ID "PLUGIN-1.0" // some name to identify plugin struct plugin_data // local plugin data { int (*fsend)(struct soap*, const char*, size_t); // to save and use send callback size_t (*frecv)(struct soap*, char*, size_t); // to save and use recv callback }; int plugin(struct soap *soap, struct soap_plugin *plugin, void *arg); ~~~ Then, we write the plugin registry function and the callbacks: ~~~{.cpp} #include "plugin.h" static const char plugin_id[] = PLUGIN_ID; // the plugin id static int plugin_init(struct soap *soap, struct plugin_data *data); static int plugin_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src); static void plugin_delete(struct soap *soap, struct soap_plugin *p); static int plugin_send(struct soap *soap, const char *buf, size_t len); static size_t plugin_recv(struct soap *soap, char *buf, size_t len); // the registry function: int plugin(struct soap *soap, struct soap_plugin *p, void *arg) { p->id = plugin_id; p->data = (void*)malloc(sizeof(struct plugin_data)); p->fcopy = plugin_copy; /* optional: when set the plugin must copy its local data */ p->fdelete = plugin_delete; if (p->data) { if (plugin_init(soap, (struct plugin_data*)p->data)) { free(p->data); // error: could not init return SOAP_EOM; // return error } } return SOAP_OK; } static int plugin_init(struct soap *soap, struct plugin_data *data) { data->fsend = soap->fsend; // save old recv callback data->frecv = soap->frecv; // save old send callback soap->fsend = plugin_send; // replace send callback with new soap->frecv = plugin_recv; // replace recv callback with new return SOAP_OK; } // copy plugin data, called by soap_copy() // This is important: we need a deep copy to avoid data sharing by two contexts static int plugin_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) { if (!(dst->data = (struct plugin_data*)malloc(sizeof(struct plugin_data)))) return SOAP_EOM; *dst->data = *src->data; return SOAP_OK; } // plugin deletion, called by soap_done() static void plugin_delete(struct soap *soap, struct soap_plugin *p) { free(p->data); // free allocated plugin data } // the new send callback static int plugin_send(struct soap *soap, const char *buf, size_t len) { struct plugin_data *data = (struct plugin_data*)soap_lookup_plugin(soap, plugin_id); // fetch plugin's local data fwrite(buf, len, 1, stderr); // write message to stderr return data->fsend(soap, buf, len); // pass data on to old send callback } // the new receive callback static size_t plugin_recv(struct soap *soap, char *buf, size_t len) { struct plugin_data *data = (struct plugin_data*)soap_lookup_plugin(soap, plugin_id); // fetch plugin's local data size_t res = data->frecv(soap, buf, len); // get data from old recv callback fwrite(buf, res, 1, stderr); return res; } ~~~ It is the responsibility of the plugin to handle registry (init), copy, and deletion of the plugin data and reset callbacks. The `fdelete` callback of `struct soap_plugin` must be set to de-register the plugin and let it delete its resources. A plugin is copied along with its corresponding `::soap` context with the `::soap_copy` call. This function copies a `::soap` context and the chain of plugins. It is up to the plugin implementation to share the plugin data or not as follows: * if the `fcopy()` callback is set by the plugin initialization, this callback will be called to allow the plugin to copy its local data upon a `::soap_copy` call. When `::soap_done` or `::soap_free` is called on this `::soap` context copy, the `fdelete()` callback is called for deallocation and cleanup of the local data. * if the `fcopy()` callback is not set, then the plugin data will be shared (i.e. the data pointer points to the same address). The `fdelete()` callback will not be called upon a `::soap_done` on a copy of the `::soap` context . The `fdelete()` callback will be called for the original `::soap` context with which the plugin was registered. The example plugin should be used as follows: ~~~{.cpp} struct soap *soap = soap_new(); soap_register_plugin(soap, plugin); ~~~ To pass a `void*` argument to the plugin's registry function use: ~~~{.cpp} struct soap *soap = soap_new(); soap_register_plugin_arg(soap, plugin, arg); ~~~ Additional documentation for the growing number of gSOAP plugins can be found at . A number of example plugins are included in the gSOAP source code package's `gsoap/plugin` directory. Some of these plugins are discussed in the next sections. See also API documentation Module \ref group_plugin . 🔝 [Back to table of contents](#) ### DOM API overview {#dom} The DOM API is not a plugin, but an extension that provides a DOM API as a separate source code file to compile and link with gSOAP applications to enabled the gSOAP DOM. XML DOM processing is optional, and enabled with [`wsdl2h -d` option `-d`](#wsdl2h-d) to generate DOM structures for `xsd:anyType`, `xsd:any`, and `xsd:anyAttribute` schema components, which are enabled with `#import "dom.h"` in an interface header file for soapcpp2. This imports `gsoap/import/dom.h`. Then compile `gsoap/dom.c` for C or `gsoap/dom.cpp` for C++ with your application. To use the DOM API with Web services, add `#import "dom.h"` to the interface header file or use [`wsdl2h -d` option `-d`](#wsdl2h-d): ~~~{.cpp} #import "dom.h" ~~~ This declares `xsd__anyType` and `xsd__anyAttribute` types. A DOM element node is serialized with the `xsd__anyType` serializable type. The underlying implementation type of `xsd__anyType` is `soap_dom_element`. One or more DOM attribute nodes are serialized with the `xsd__anyAttribute` serializable type. The underlying implementation type of `xsd__anyAttribute` is `soap_dom_attribute`, which is a linked list. ~~~{.cpp} #import "dom.h" // imports xsd__anyType as a DOM node class ns__data : public xsd__anyType { public: xsd__anyType* foo; // Store element in DOM soap_dom_element xsd__anyType __any; // Store any element content in DOM soap_dom_element @ xsd__anyAttribute __anyAttribute; // Store anyAttribute content in DOM soap_dom_attribute linked node structure }; ~~~ To manipulate the DOM elements and attributes we use the DOM API functions documented in the gSOAP [XML DOM API documentation](../../dom/html/index.html). 🔝 [Back to table of contents](#) ### The message logging plugin {#loggingplugin} The message `::logging` plugin can be used to selectively log inbound and outbound messages to a file or stream. It also keeps access statistics to log the total number of bytes sent and received. To use the plugin, compile and link your application with `logging.c` located in the `gsoap/plugin` directory of the gSOAP package. To enable the plugin in your code, register the plugin and set the streams as follows: ~~~{.cpp} #include "logging.h" struct soap *soap = soap_new(); size_t bytes_in; size_t bytes_out; if (soap_register_plugin(soap, logging)) ... // failed to register ... // soap_set_logging_inbound(soap, stdout); soap_set_logging_outbound(soap, stdout); ... // process messages soap_set_logging_inbound(soap, NULL); // disable logging soap_set_logging_outbound(soap, NULL); // disable logging soap_logging_stats(soap, &bytes_out, &bytes_in); ... // soap_reset_logging_stats(soap); ~~~ If you use `::soap_copy` to copy the `::soap` context with the plugin, the plugin's state will be shared by the copy. The plugin is thread-safe, but does not use a lock to protect the internal statistics counters to ensure the speed of messaging is not compromised, meaning that you should not fully rely on the statistics to be 100% accurate for multi-threaded services. See also `::logging`. 🔝 [Back to table of contents](#) ### RESTful server-side API with the HTTP GET plugin {#RESTfulserverGET} Server-side use of RESTful HTTP GET operations is supported with the `::http_get` HTTP GET plugin `gsoap/plugin/httpget.c`. The HTTP GET plugin allows your server to handle RESTful HTTP GET requests and at the same time still serve SOAP-based POST requests. The plugin provides support to client applications to issue HTTP GET operations to a server. Note that HTTP GET requests can also be handled at the server side with the `::soap::fget` callback, see Section \ref callback . However, the HTTP GET plugin also keeps statistics on the number of successful POST and GET exchanges and failed operations (HTTP faults, SOAP Faults, etc.). It also keeps hit histograms accumulated for up to a year of running time. To use the `::http_get` plugin, compile and link your application with `httpget.c` located in the `gsoap/plugin` directory of the gSOAP package. To enable the plugin in your code, register the plugin with your HTTP GET handler function as follows: ~~~{.cpp} #include "httpget.h" int main() { struct soap *soap = soap_new(); if (soap_register_plugin_arg(soap, http_get, (void*)my_http_get_handler)) soap_print_fault(soap, stderr); // failed to register ... // struct http_get_data *httpgetdata; httpgetdata = (struct http_get_data*)soap_lookup_plugin(soap, http_get_id); if (!httpgetdata) ... // if the plugin registered OK, there is certainly data but can't hurt to check ... // process messages size_t get_ok = httpgetdata->stat_get; size_t post_ok = httpgetdata->stat_post; size_t errors = httpgetdata->stat_fail; time_t now = time(NULL); struct tm *T; T = localtime(&now); size_t hitsthisminute = httpgetdata->hist_min[T->tm_min]; size_t hitsthishour = httpgetdata->hist_hour[T->tm_hour]; size_t hitstoday = httpgetdata->hist_day[T->tm_yday]; } ~~~ An HTTP GET handler can simply produce some HTML content, or any other type of content by sending data using `::soap_response`: ~~~{.cpp} int my_http_get_handler(struct soap *soap) { soap->http_content = "text/html"; if (soap_response(soap, SOAP_FILE) || soap_send(soap, "Hello") || soap_end_send(soap) return soap_closesock(soap); return SOAP_OK; // return SOAP_OK or HTTP error code, e.g. 404 } ~~~ If you use `::soap_copy` to copy the `::soap` context with the plugin, the plugin's data will be shared by the copy. Therefore, the statistics are not 100% guaranteed to be accurate for multi-threaded services since race conditions on the counters may occur. Mutex is not used to update the counters to avoid introducing expensive synchronization points. If 100% server-side accuracy is required, add mutex at the points indicated in the `httpget.c` code. The client-side use of HTTP GET is provided by the `::soap_GET` operation. To receive a SOAP/XML (response) message `ns:methodResponse`, use: ~~~{.cpp} int main() { struct soap *soap = soap_new(); if (soap_GET(soap, endpoint, NULL)) ... // error else if (soap_recv_ns__webmethodResponse(soap, ...)) ... // error else ... // success soap_destroy(soap); soap_end(soap); soap_done(soap); ~~~ To receive any HTTP Body data into a buffer, use: ~~~{.cpp} int main() { struct soap *soap = soap_new(); char *response = NULL; size_t response_len; if (soap_GET(soap, endpoint, NULL) || (response = soap_http_get_body(soap, &response_len)) == NULL || soap_end_recv(&soap)) ... // error else ... // use the response string (NULL indicates no body or error) soap_destroy(&soap); soap_end(&soap); soap_done(&soap); } ~~~ See also `::http_get`. 🔝 [Back to table of contents](#) ### RESTful server-side API with the HTTP POST plugin {#RESTfulservicePOST} Server-side use of RESTful HTTP POST, PUT, PATCH, and DELETE operations are supported with the `::http_post` HTTP POST plugin `gsoap/plugin/httppost.c`. The `::http_post` HTTP POST plugin allows your server to handle RESTful HTTP POST requests and at the same time still serve SOAP-based POST requests. The plugin also provides support for client applications to issue HTTP POST operations to a server. To simplify the server-side handling of POST requests, handlers can be associated with media types: ~~~{.cpp} struct http_post_handlers my_handlers[] = { { "image/jpg", jpeg_handler }, { "image/*", image_handler }, { "text/html", html_handler }, { "text/*", text_handler }, { "POST", generic_POST_handler }, { "PUT", generic_PUT_handler }, { "PATCH", generic_PATCH_handler }, { "DELETE", generic_DELETE_handler }, { NULL } }; ~~~ Note that `*` and `-` can be used as wildcards to match any text and any character, respectively. Media types may have optional parameters after `;` such as `charset` and `boundary`. These parameters can be matched by the media type patterns in the table. Patterns that are more specific must precede patterns that are less specific in the table. For example, `"text/xml;*charset=utf-8*"` must precede `"text/xml"` which must precede `"text/*"`. Note that `"text/xml"` also matches any parameters of the media type of the message reveived, such as `"text/xml; charset=utf-8"` (only since gSOAP version 2.8.75). The handlers are functions that will be invoked when a POSTed request message matching media type is sent to the server. An example image handler that checks the specific image type: ~~~{.cpp} int image_handler(struct soap *soap) { const char *buf; size_t len; // if necessary, check type in soap->http_content if (soap->http_content && !soap_tag_cmp(soap->http_content, "image/gif") return 404; // HTTP error 404 if ((buf = soap_http_get_body(soap, &len)) == NULL) return soap->error; // ... now process image in buf // reply with empty HTTP 200 OK response: return soap_send_empty_response(soap, 200); } ~~~ The above example returns HTTP OK. If content is supposed to be returned, then use: ~~~{.cpp} struct soap *soap = soap_new(); ... // soap->http_content = "image/jpeg"; // a jpeg image to return back if (soap_response(soap, SOAP_FILE)) // SOAP_FILE sets custom http content || soap_send_raw(soap, buf, len) // send image || soap_end_send(soap) return soap_closesock(soap); return SOAP_OK; ~~~ For client applications to use HTTP POST, use the `::soap_POST` operation: ~~~{.cpp} struct soap *soap = soap_new(); ... // char *buf; // holds the HTTP request/response body data size_t len; // length of data ... // populate buf and len with message to send if (soap_POST(soap, "URL", "SOAP action or NULL", "media type") || soap_send_raw(soap, buf, len); || soap_end_send(soap)) ... // error if (soap_begin_recv(&soap) || (buf = soap_http_get_body(soap, &len)) == NULL || soap_end_recv(&soap)) ... // error // ... use buf[0..len-1] soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~ Similarly, `::soap_PUT`, `::soap_PATCH`, and `::soap_DELETE` commands are provided for PUT, PATCH, and DELETE handling. To support HTTP pipelining we use the `::http_pipe` plugin, which can be used at the server side to enable HTTP pipelining automatically, when registered. The plugin can also be used at the client side, though this is only necessary in scenarios that require the client to receive multiple messages without intermittend sends, i.e. multiple sends followed by multiple receives by the same thread using the same `::soap` context. However, clients should use multiple threads when HTTP pipelining is used to prevent blocking. See the `gsoap/samples/async` folder in the gSOAP package for explanation and examples. See also `::http_post` and `::http_pipe`. 🔝 [Back to table of contents](#) ### The HTTP digest authentication plugin {#httpdaplugin} The HTTP digest authentication plugin enables a more secure authentication scheme compared to basic authentication. HTTP basic authentication sends unencrypted userids and passwords over the net, while digest authentication does not exchange passwords but exchanges checksums of passwords (and other data such as nonces to avoid replay attacks). For more details, please see RFC 2617. The HTTP digest authentication can be used next to the built-in basic authentication, or basic authentication can be rejected to tighten security. The server must have a database with userid's and passwords (in plain text form). The client, when challenged by the server, checks the authentication realm provided by the server and sets the userid and passwords for digest authentication. The client application can temporarily store the userid and password for a sequence of message exchanges with the server, which is faster than repeated authorization challenges and authentication responses. At the client side, the plugin is registered and service invocations are checked for authorization challenges (HTTP error code 401). When the server challenges the client, the client should set the userid and password and retry the invocation. The client can determine the userid and password based on the authentication realm part of the server's challenge. The authentication information can be temporarily saved for multiple invocations. Client-side example: ~~~{.cpp} #include "httpda.h" int main() { struct soap *soap = soap_new(); if soap_register_plugin(soap, http_da)) exit(EXIT_FAILURE); // failed to register if (soap_call_ns__webmethod(soap, ...)) { if (soap->error == 401) // challenge: HTTP authentication required { if (!strcmp(soap->authrealm, authrealm)) // optionally determine authentication realm { struct http_da_info info; // to store userid and passwd http_da_save(soap, &info, authrealm, userid, passwd); // set userid and passwd for this realm if (soap_call_ns__webmethod(soap, ...)) // retry { ... // soap_end(soap); // userid and passwd were deallocated http_da_restore(soap, &info); // restore userid and passwd if (!soap_call_ns__webmethod(soap, ...)) // another call ... // } } } } http_da_release(soap, &info); // to remove all userid and passwd soap_destroy(soap); soap_end(soap); soap_free(soap); } ~~~ This code supports both basic and digest authentication. The server can challenge a client using HTTP code 401. With the plugin, HTTP digest authentication challenges are send. Without the plugin, basic authentication challenges are send. Each server method can implement authentication as desired and may enforce digest authentication or may also accept basic authentication responses. To verify digest authentication responses, the server should compute and compare the checksums using the plugin's `http_da_verify_post` function for HTTP POST requests (and `http_da_verify_get` for HTTP GET requests with the HTTP GET plugin) as follows: ~~~{.cpp} #include "httpda.h" int main() { struct soap *soap = soap_new(); if (soap_register_plugin(soap, http_da)) exit(EXIT_FAILURE); // failed to register ... // use soap_bind and soap_accept in a (multi-threaded) service loop if (soap_serve(soap)) soap_print_fault(soap, stderr); ... // soap_destroy(soap); soap_end(soap); soap_free(soap); } int ns__webmethod(struct soap *soap, ...) { if (soap->userid && soap->passwd) // client used basic authentication { // may decide not to handle, but if ok then go ahead and compare info: if (!strcmp(soap->userid, userid) && !strcmp(soap->passwd, passwd)) { ... // handle request return SOAP_OK; } } else if (soap->authrealm && soap->userid) // Digest authentication { passwd = ...; // database lookup on userid and authrealm to find passwd if (!strcmp(soap->authrealm, authrealm) && !strcmp(soap->userid, userid)) { if (!http_da_verify_post(soap, passwd)) { ... // handle request return SOAP_OK; } } } soap->authrealm = authrealm; // set realm for challenge return 401; // Not authorized, challenge digest authentication } ~~~ For more details, including how to configure HTTP Digest authentication for proxies, see the [HTTP digest authentication plugin](../../httpda/html/httpda.html) documentation. 🔝 [Back to table of contents](#) ### The HTTP sessions plugin {#sessionsplugin} The plugin code is located in the `gsoap/plugin` directory containing `sessions.h` and `sessions.c`. For more details, see the [HTTP sessions plugin](../../sessions/html/index.html) documentation. 🔝 [Back to table of contents](#) ### The Apache module plugin {#apacheplugin} The plugin code is located in the `gsoap/mod_gsoap/mod_gsoap-0.9/apache_20` directory. For more details, see the [Apache module](../../apache/html/index.html) documentation. 🔝 [Back to table of contents](#) ### The ISAPI extension plugin {#isapiplugin} The plugin code is located in the `gsoap/mod_gsoap/gsoap_win/isapi` directory. For more details, see the [ISAPI extension](../../isapi/html/index.html) documentation. 🔝 [Back to table of contents](#) ### The CURL plugin {#curlplugin} The plugin code is located in the `gsoap/plugin` directory containing `curlapi.h` and `curlapi.c`. For more details, see the [CURL plugin](../../curl/html/index.html) documentation. 🔝 [Back to table of contents](#) ### The WinInet plugin {#wininetplugin} The plugin code is located in the `gsoap/mod_gsoap/gsoap_win/wininet` directory. For more details, see the [WinInet plugin](../../wininet/html/index.html) documentation. 🔝 [Back to table of contents](#) ### The WS-Addressing plugin {#wsaplugin} The plugin code is located in the `gsoap/plugin` directory containing `wsaapi.h` and `wsaapi.c` (to be used in C and C++). To enable WS-Addressing 2005 (and support for 8/2004), the service definitions header file for soapcpp2 should include the following imports: ~~~{.cpp} #import "import/wsa5.h" ~~~ This imports the SOAP header elements required by WS-Addressing. For more details, see the [WS-Addressing plugin](../../wsa/html/wsa_0.html) documentation. 🔝 [Back to table of contents](#) ### The WS-ReliableMessaging plugin {#wsrmplugin} The plugin code is located in the `gsoap/plugin` directory containing `wsrmapi.h` and `wsrmapi.c` (to be used in C and C++). Also needed are `threads.h` and `threads.c` for multi-threading and locking support. To enable WS-ReliableMessaging, the service definitions header file for soapcpp2 should include the following imports: ~~~{.cpp} #import "import/wsrm.h" #import "import/wsa5.h" ~~~ This imports the SOAP header elements required by WS-ReliableMessaging. For more details, see the [WS-ReliableMessaging plugin](../../wsrm/html/wsrm_0.html) documentation. 🔝 [Back to table of contents](#) ### The WS-Security plugin {#wsseplugin} The plugin code is located in the `gsoap/plugin` directory containing `wsseapi.h` and `wsseapi.c` (to be used in C and C++). Also needed are: `smdevp.h` and `smdevp.c` for streaming XML signature and message digest engine, `mecevp.h` and `mecevp.c` for the streaming XML encryption engine, `threads.h` and `threads.c` for multi-threading and locking support. To enable WS-Security, the service definitions header file for soapcpp2 should include the following imports: ~~~{.cpp} #import "import/wsse.h" ~~~ This imports the SOAP header elements required by WS-Security. For more details, see the [WS-Security plugin](../../wsse/html/wsse.html) documentation. 🔝 [Back to table of contents](#) ### The WS-Discovery plugin {#wsddplugin} Basically, to add WS-Discovery support the following event handlers must be defined and linked: ~~~{.cpp} void wsdd_event_Hello(struct soap *soap, unsigned int InstanceId, const char *SequenceId, unsigned int MessageNumber, const char *MessageID, const char *RelatesTo, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion) ~~~ ~~~{.cpp} void wsdd_event_Bye(struct soap *soap, unsigned int InstanceId, const char *SequenceId, unsigned int MessageNumber, const char *MessageID, const char *RelatesTo, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion) ~~~ ~~~{.cpp} soap_wsdd_mode wsdd_event_Probe(struct soap *soap, const char *MessageID, const char *ReplyTo, const char *Types, const char *Scopes, const char *MatchBy, struct wsdd__ProbeMatchesType *ProbeMatches) ~~~ ~~~{.cpp} void wsdd_event_ProbeMatches(struct soap *soap, unsigned int InstanceId, const char *SequenceId, unsigned int MessageNumber, const char *MessageID, const char *RelatesTo, struct wsdd__ProbeMatchesType *ProbeMatches) ~~~ ~~~{.cpp} soap_wsdd_mode wsdd_event_Resolve(struct soap *soap, const char *MessageID, const char *ReplyTo, const char *EndpointReference, struct wsdd__ResolveMatchesType *ResolveMatches) ~~~ ~~~{.cpp} void wsdd_event_ResolveMatches(struct soap *soap, unsigned int InstanceId, const char *SequenceId, unsigned int MessageNumber, const char *MessageID, const char *RelatesTo, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion) ~~~ These event handlers will be invoked when inbound WS-Discovery messages arrive using: ~~~{.cpp} if (!soap_valid_socket(soap_bind(soap, NULL, port, BACKLOG))) ... // error if (soap_wsdd_listen(soap, timeout)) ... // error ~~~ which will listen for `timeout` seconds to inbound WS-Discovery messages on a port and dispatches them to the event handlers. A negative `timeout` value specifies the timeout in microseconds. For more details, see the [WS-Discovery plugin](../../wsdd/html/wsdd_0.html) documentation. Copyright {#copyright} ========= Copyright (c) 2000-2019, Robert A. van Engelen, Genivia Inc.
All rights reserved.
gsoap-2.8.91/gsoap/doc/guide/stdsoap2.h0000644000175000017500000163516213525245160017170 0ustar ellertellert/* Annotated and simplified stdsoap2.h to generate the user guide gSOAP XML Web services tools Copyright (C) 2000-2018, 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. -------------------------------------------------------------------------------- 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-2018, 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 -------------------------------------------------------------------------------- */ /** @file stdsoap2.h @brief This file defines the common macros, types and functions of the gSOAP API grouped by [modules](modules.html) The API features are grouped by the following [modules](modules.html): - \ref group_debug - \ref group_with - \ref group_soap - \ref group_flags - \ref group_errors - \ref group_context - \ref group_callbacks - \ref group_ssl - \ref group_io - \ref group_cookies - \ref group_s2s - \ref group_namespace - \ref group_header - \ref group_fault - \ref group_dime - \ref group_mime - \ref group_plugin - \ref group_misc */ /** \defgroup group_debug Debugging and logging @brief This module defines compile-time flags and functions for run-time debugging and logging This module defines the following compile-time flags and functions to specify log files: - `#DEBUG` - `#SOAP_DEBUG` - `#DEBUG_STAMP` - `#SOAP_MEM_DEBUG` - `::soap_set_recv_logfile` - `::soap_set_sent_logfile` - `::soap_set_test_logfile` Alternatively, the `::logging` plugin can be used without setting `#DEBUG` to efficiently log messages and collect statistics: - `::soap_set_logging_inbound` - `::soap_set_logging_outbound` - `::soap_logging_stats` - `::soap_reset_logging_stats` @{ */ /// User-definable macro to enable debugging and logging /** When this macro is defined at compile time (undefined by default), the engine runs in debug mode to produce `RECV.log`, `SENT.log`, and `TEST.log` files for debugging purposes: - `RECV.log` contains messages received, concatenated - `SENT.log` contains messages sent, concatenated - `TEST.log` contains debugging information to identify issues Debugging with `#DEBUG` incurs significant run-time overhead and should only be used for debugging purposes. @par Example: c++ -D DEBUG -o client stdsoap2.cpp soapC.cpp soapClient.cpp client.cpp ./client ls *.log RECV.log SENT.log TEST.log @see `#SOAP_DEBUG`, `#DEBUG_STAMP`, `#SOAP_MEM_DEBUG`, `::soap_set_recv_logfile`, `::soap_set_sent_logfile`, `::soap_set_test_logfile` and the message logging plugin `gsoap/plugin/logging.c` as a faster alternative. @note The libgsoap, libgsoap++, libgsoapssl and libgsoapssl++ libraries should not be used when a project is (re)compiled with `#DEBUG`, because these libraries are built by default without debugging enabled. Use `./configure --enable-debug` to rebuild the libraries with `-D DEBUG`. */ #define DEBUG /// User-definable macro, identical behavior as `#DEBUG` but more portable /** This macro should be used when the `#DEBUG` macro is reserved by the IDE for other purposes. @see `#DEBUG`, `#DEBUG_STAMP`, `#SOAP_MEM_DEBUG`, `::soap_set_recv_logfile`, `::soap_set_sent_logfile`, `::soap_set_test_logfile`. */ #define SOAP_DEBUG /// User-definable macro to enable debugging and logging with time stamps /** When this macro is defined at compile time (undefined by default), the engine runs in debug mode to produce `RECV.log`, `SENT.log`, and `TEST.log` files with time stamps for debugging purposes: - `RECV.log` contains messages received, concatenated - `SENT.log` contains messages sent, concatenated - `TEST.log` contains debugging information with time stamps to identify issues This incurs significant run-time overhead and should only be used for debugging purposes. @par Example: c++ -D DEBUG_STAMP -o client stdsoap2.cpp soapC.cpp soapClient.cpp client.cpp ./client ls *.log RECV.log SENT.log TEST.log @see `#DEBUG`, `#SOAP_DEBUG`, `#SOAP_MEM_DEBUG`, `::soap_set_recv_logfile`, `::soap_set_sent_logfile`, `::soap_set_test_logfile` and the message logging plugin `gsoap/plugin/logging.c` as a faster alternative. @note The libgsoap, libgsoap++, libgsoapssl and libgsoapssl++ libraries should not be used when a project is (re)compiled with `#DEBUG_STAMP`, because these libraries are built by default without debugging enabled. */ #define DEBUG_STAMP /// User-definable macro to enable memory debugging without logging /** When this macro is defined at compile time (undefined by default), the engine runs in debug mode to detect memory corruption errors but does not produce `RECV.log`, `SENT.log` and `TEST.log` files and avoids the significant run-time overhead of logging. Use this macro when memory debugging is required without logging overhead. @par Example: c++ -D SOAP_MEM_DEBUG -o client stdsoap2.cpp soapC.cpp soapClient.cpp client.cpp ./client ls *.log ls: No match. @see `#DEBUG`, `#SOAP_DEBUG`, `#DEBUG_STAMP`. @note The libgsoap, libgsoap++, libgsoapssl and libgsoapssl++ libraries should not be used when a project is (re)compiled with `#SOAP_MEM_DEBUG`, because these libraries are built by default without debugging enabled. */ #define SOAP_MEM_DEBUG /// Specify a file name to save messages received /** This function sets the specified file path name `logfile` to save all messages received. Messages are appended to the specified file. Disables logging when `logfile` is NULL. This function requires compilation with `#DEBUG`. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); soap_set_recv_logfile(soap, "logs/thread_1_recv.log"); soap_set_sent_logfile(soap, "logs/thread_1_sent.log"); soap_set_test_logfile(soap, "logs/thread_1_test.log"); ~~~ @note Requires compilation with `#DEBUG`. @see `::soap_set_sent_logfile` and the message logging plugin `gsoap/plugin/logging.c` as a faster alternative. */ void soap_set_recv_logfile( struct soap *soap, ///< `::soap` context const char *logfile) ///< path name of the log file or NULL to disable logging ; /// Specify a file name to save messages sent /** This function sets the specified file path name `logfile` to save the messages sent. Messages are appended to the specified file. Disables logging when `logfile` is NULL. This function requires compilation with `#DEBUG`. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); soap_set_recv_logfile(soap, "logs/thread_1_recv.log"); soap_set_sent_logfile(soap, "logs/thread_1_sent.log"); soap_set_test_logfile(soap, "logs/thread_1_test.log"); ~~~ @note Requires compilation with `#DEBUG`. @see `::soap_set_recv_logfile` and the message logging plugin `gsoap/plugin/logging.c` as a faster alternative. */ void soap_set_sent_logfile( struct soap *soap, ///< `::soap` context const char *logfile) ///< path name of the log file or NULL to disable logging ; /// Specify a file name to save debugging info /** This function sets the specified file path name `logfile` to save debugging info generated by the engine and by the generated code. Disables logging when `logfile` is NULL. This function requires compilation with `#DEBUG`. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); soap_set_recv_logfile(soap, "logs/thread_1_recv.log"); soap_set_sent_logfile(soap, "logs/thread_1_sent.log"); soap_set_test_logfile(soap, "logs/thread_1_test.log"); ~~~ @note Requires compilation with `#DEBUG`. */ void soap_set_test_logfile( struct soap *soap, ///< `::soap` context const char *logfile) ///< path name of the log file or NULL to disable logging ; /// Specify inbound message logging with the `::logging` plugin /** This function enables inbound message logging. Inbound messages are recorded to the specified file descriptor. Logging is disabled by passing a NULL file descriptor parameter. @par Example: ~~~{.cpp} #include "soapH.h" #include "plugin/logging.h" struct soap *soap = soap_new(); FILE *fd = fopen("logs/recv.log", "w"); soap_register_plugin(soap, logging); soap_set_logging_inbound(soap, fd); ... // send and receive messages soap_set_logging_inbound(soap, NULL); fclose(fd); ~~~ @note This function is declared and defined in `gsoap/plugin/logging.h` and `gsoap/plugin/logging.c` and requires the `::logging` plugin and does not require `#DEBUG`. @see `::soap_set_logging_outbound`, `::soap_logging_stats`, `::soap_reset_logging_stats`. */ void soap_set_logging_inbound( struct soap *soap, ///< `::soap` context FILE *fd) ///< file descriptor to record inbound messages ; /// Specify outbound message logging with the `::logging` plugin /** This function enables outbound message logging. Outbound messages are recorded to the specified file descriptor. Logging is disabled by passing a NULL file descriptor parameter. @par Example: ~~~{.cpp} #include "soapH.h" #include "plugin/logging.h" struct soap *soap = soap_new(); FILE *fd = fopen("logs/sent.log", "w"); soap_register_plugin(soap, logging); soap_set_logging_outbound(soap, fd); ... // send and receive messages soap_set_logging_outbound(soap, NULL); fclose(fd); ~~~ @note This function is declared and defined in `gsoap/plugin/logging.h` and `gsoap/plugin/logging.c` and requires the `::logging` plugin and does not require `#DEBUG`. @see `::soap_set_logging_inbound`, `::soap_logging_stats`, `::soap_reset_logging_stats`. */ void soap_set_logging_outbound( struct soap *soap, ///< `::soap` context FILE *fd) ///< file descriptor to record outbound messages ; /// Collect messaging statistics with the `::logging` plugin /** This function collects the recorded messaging statistics, namely the number of bytes received from inbound messages and the number of bytes sent to outbound messages. @par Example: ~~~{.cpp} #include "soapH.h" #include "plugin/logging.h" struct soap *soap = soap_new(); soap_register_plugin(soap, logging); ... // send and receive messages size_t sent, recv; soap_logging_stats(soap, &sent, &recv); printf("Bytes sent = %zu bytes received = %zu\n", sent, recv); soap_reset_logging_stats(soap); ~~~ @note This function is declared and defined in `gsoap/plugin/logging.h` and `gsoap/plugin/logging.c` and requires the `::logging` plugin and does not require `#DEBUG`. @see `::soap_set_logging_inbound`, `::soap_set_logging_outbound`, `::soap_reset_logging_stats`. */ void soap_logging_stats( struct soap *soap, ///< `::soap` context size_t *sent, ///< pointer to variable to assign size_t *recv) ///< pointer to variable to assign ; /// Reset messaging statistics with the `::logging` plugin /** This function resets the recorded messaging statistics. @note This function is declared and defined in `gsoap/plugin/logging.h` and `gsoap/plugin/logging.c` and requires the `::logging` plugin and does not require `#DEBUG`. @see `::soap_set_logging_inbound`, `::soap_set_logging_outbound`, `::soap_logging_stats`. */ void soap_reset_logging_stats(struct soap *soap) ///< `::soap` context ; /// The logging plugin registration function /** The logging plugin API is declared and defined in `gsoap/plugin/logging.h` and `gsoap/plugin/logging.c`. @see `::soap_set_logging_inbound`, `::soap_set_logging_outbound`, `::soap_logging_stats`, `::soap_reset_logging_stats`. */ int logging(struct soap*, struct soap_plugin*, void*); /** @} */ /** \defgroup group_with WITH_MACRO compile-time flags @brief This module defines the `WITH_MACRO` compile-time flags to configure the engine build This module defines the following compile-time flags to configure the engine build: - `#SOAPDEFS_H` - `#WITH_SOAPDEFS_H` - `#WITH_COMPAT` - `#WITH_LEAN` - `#WITH_LEANER` - `#WITH_FAST` - `#WITH_COOKIES` - `#WITH_INSECURE_COOKIES` - `#WITH_IPV6` - `#WITH_IPV6_V6ONLY` - `#WITH_OPENSSL` - `#WITH_GNUTLS` - `#WITH_GZIP` - `#WITH_ZLIB` - `#WITH_NTLM` - `#WITH_C_LOCALE` - `#WITH_NO_C_LOCALE` - `#WITH_INCLUDE_XLOCALE_H` - `#WITH_DOM` - `#WITH_REPLACE_ILLEGAL_UTF8` - `#WITH_FASTCGI` - `#WITH_NOIO` - `#WITH_NOIDREF` - `#WITH_NOHTTP` - `#WITH_NOZONE` - `#WITH_NOEMPTYNAMESPACES` - `#WITH_NOEMPTYSTRUCT` - `#WITH_NOGLOBAL` - `#WITH_NONAMESPACES` - `#WITH_CDATA` - `#WITH_PURE_VIRTUAL` - `#WITH_DEFAULT_VIRTUAL` - `#WITH_CASEINSENSITIVETAGS` - `#WITH_SOCKET_CLOSE_ON_EXIT` - `#WITH_TCPFIN` - `#WITH_SELF_PIPE` @{ */ /// When this macro is defined at compile time (undefined by default) then the header file specified by this macro is included in the build via stdsoap2.h /** This macro specifies the name of a header file to include and can be used to configure the engine build by defining \ref group_with and \ref group_soap. @par Example: cat mydefs.h #define WITH_OPENSSL #define WITH_DOM c++ -D SOAPDEFS_H=mydefs.h -o client stdsoap2.cpp dom.cpp soapC.cpp soapClient.cpp client.cpp -lcrypto -lssl @see `#WITH_SOAPDEFS_H`. */ #define SOAPDEFS_H /// When this macro is defined at compile time (undefined by default), a user-supplied file named soapdefs.h is included in the build, i.e. soapdefs.h can be used to configure the build by defining compile-time macros and flags /** @par Example: cat soapdefs.h #define WITH_OPENSSL #define WITH_DOM c++ -D WITH_SOAPDEFS_H -o client stdsoap2.cpp dom.cpp soapC.cpp soapClient.cpp client.cpp -lcrypto -lssl Alternatively, set `#SOAPDEFS_H` to the header file name to include in your build. For example: cat mydefs.h #define WITH_OPENSSL #define WITH_DOM c++ -D SOAPDEFS_H=mydefs.h -o client stdsoap2.cpp dom.cpp soapC.cpp soapClient.cpp client.cpp -lcrypto -lssl */ #define WITH_SOAPDEFS_H /// When this macro is defined at compile time (undefined by default), removes dependency on C++ `std::string` and `std::iostream` libraries /** @par Example: c++ -D WITH_COMPAT -c stdsoap2.cpp */ #define WITH_COMPAT /// When this macro is defined at compile time (undefined by default), memory footprint is significantly reduced by removing non-essential features from the engine and from the generated code /** @warning `#WITH_LEAN` disables the following features: - UDP `#SOAP_IO_UDP` - HTTP keep-alive `#SOAP_IO_KEEPALIVE` - HTTP authentication with `::soap::userid` and `::soap::passwd` - HTTP chunked transfers `#SOAP_IO_CHUNK` except HTTP chunked input - HTTP compression `#SOAP_ENC_ZLIB` except HTTP compressed input - canonical XML `#SOAP_XML_CANONICAL`, `#SOAP_XML_CANONICAL_NA` - timeouts `::soap::connect_timeout`, `::soap::send_timeout`, `::soap::recv_timeout` and `::soap::transfer_timeout` - socket flags `::soap::socket_flags`, `::soap::connect_flags`, `::soap::bind_flags`, `::soap::accept_flags` - `time_t` serialization as `xsd__dateTime` (use a string to store the date and time instead) - `::soap_poll` always returns `#SOAP_OK` @warning When this macro is define at the compiler's command line or in an IDE or by specifying `#SOAPDEFS_H`, then all source code files of an application's project must be recompiled. Otherwise, `::soap` context corruption errors may occur in the non-recompiled parts of the application, because the size of the `::soap` context has changed. @par Examples: c++ -D WITH_LEAN -o client stdsoap2.cpp soapC.cpp soapClient.cpp client.cpp c++ -D WITH_LEAN -o server stdsoap2.cpp soapC.cpp soapServer.cpp server.cpp */ #define WITH_LEAN /// When this macro is defined at compile time (undefined by default), memory footprint is further reduced from `#WITH_LEAN` by removing non-essential features from the engine and from the generated code /** @warning `#WITH_LEANER` disables the following features: - UDP `#SOAP_IO_UDP` - HTTP keep-alive `#SOAP_IO_KEEPALIVE` - HTTP authentication with `::soap::userid` and `::soap::passwd` - HTTP chunked transfers `#SOAP_IO_CHUNK` except HTTP chunked input - HTTP compression `#SOAP_ENC_ZLIB` except HTTP compressed input - canonical XML `#SOAP_XML_CANONICAL`, `#SOAP_XML_CANONICAL_NA` - timeouts `::soap::connect_timeout`, `::soap::send_timeout`, `::soap::recv_timeout` and `::soap::transfer_timeout` - socket flags `::soap::socket_flags`, `::soap::connect_flags`, `::soap::bind_flags`, `::soap::accept_flags` - `time_t` serialization as `xsd__dateTime` (use a string to store the date and time instead) - `::soap_poll` always returns `#SOAP_OK` - wide string serializers - DIME and MIME/MTOM attachments - XML DOM operations with the DOM API @warning When this macro is define at the compiler's command line or in an IDE or by specifying `#SOAPDEFS_H`, then all source code files of an application's project must be recompiled. Otherwise, `::soap` context corruption errors may occur in the non-recompiled parts of the application, because the size of the `::soap` context has changed. @par Examples: c++ -D WITH_LEANER -o client stdsoap2.cpp soapC.cpp soapClient.cpp client.cpp c++ -D WITH_LEANER -o server stdsoap2.cpp soapC.cpp soapServer.cpp server.cpp */ #define WITH_LEANER /// When this macro is defined at compile time uses faster memory allocation at a cost of larger memory blocks allocated (defined by default except with `#WITH_LEAN` and `#WITH_LEANER)` /** @par Examples: c++ -D WITH_FAST -D WITH_LEANER -o client stdsoap2.cpp soapC.cpp soapClient.cpp client.cpp c++ -D WITH_FAST -D WITH_LEAN -o server stdsoap2.cpp soapC.cpp soapServer.cpp server.cpp */ #define WITH_FAST /// When this macro is defined at compile time (undefined by default), HTTP cookie support is enabled in the engine /** Use the following functions to set and get HTTP cookie values: - `::soap_set_cookie` - `::soap_set_cookie_expire` - `::soap_set_cookie_secure` - `::soap_set_cookie_session` - `::soap_clr_cookie` - `::soap_clr_cookie_session` - `::soap_cookie` - `::soap_cookie_value` - `::soap_cookie_expire` - `::soap_getenv_cookies` - `::soap_free_cookies` @par Examples: c++ -D WITH_COOKIES -o client stdsoap2.cpp soapC.cpp soapClient.cpp client.cpp c++ -D WITH_COOKIES -o server stdsoap2.cpp soapC.cpp soapServer.cpp server.cpp @see The [HTTP Server Session Management plugin](../../sessions/html/index.html) documentation to use the HTTP session plugin to store a database of sessions to keep track of client data across multiple requests. */ #define WITH_COOKIES /// When this macro is defined at compile time (undefined by default), HTTP cookie support is enabled (as `#WITH_COOKIES`) but allows cookies with their Secure flag set to be sent over insecure channels /** Use the following functions to set and get HTTP cookie values: - `::soap_set_cookie` - `::soap_set_cookie_expire` - `::soap_set_cookie_secure` - `::soap_set_cookie_session` - `::soap_clr_cookie` - `::soap_clr_cookie_session` - `::soap_cookie` - `::soap_cookie_value` - `::soap_cookie_expire` - `::soap_getenv_cookies` - `::soap_free_cookies` @par Examples: c++ -D WITH_INSECURE_COOKIES -o client stdsoap2.cpp soapC.cpp soapClient.cpp client.cpp c++ -D WITH_INSECURE_COOKIES -o server stdsoap2.cpp soapC.cpp soapServer.cpp server.cpp @see The [HTTP Server Session Management plugin](../../sessions/html/index.html) documentation to use the HTTP session plugin to store a database of sessions to keep track of client data across multiple requests. */ #define WITH_INSECURE_COOKIES /// When this macro is defined at compile time (undefined by default), IPv6 support is enabled and both IPv4 and IPv6 connections are supported by the engine /** Use `::soap::bind_inet6` and `::soap::bind_v6only` at runtime to configure port bindings at the server side: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); soap->bind_inet6 = 1; // to use AF_INET6 instead of PF_UNSPEC soap->bind_v6only = 1; // to setsockopt IPPROTO_IPV6 IPV6_V6ONLY if (soap_valid_socket(soap_bind(soap, NULL, PORTNUM, BACKLOG))) ... ~~~ @par Example: c++ -D WITH_IPV6 -o server stdsoap2.cpp soapC.cpp soapServer.cpp server.cpp */ #define WITH_IPV6 /// When this macro is defined at compile time (undefined by default), IPv6-only is enabled for port binding at the server side by the engine to ensure that a socket will only use IPv6 without mapping IPv4 to IPv6 /** Alternatively, compile with `#WITH_IPV6` and set `::soap::bind_v6only` at runtime to do the same as `#WITH_IPV6_V6ONLY`: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); soap->bind_inet6 = 1; // to use AF_INET6 instead of PF_UNSPEC soap->bind_v6only = 1; // to setsockopt IPPROTO_IPV6 IPV6_V6ONLY if (soap_valid_socket(soap_bind(soap, NULL, PORTNUM, BACKLOG))) ... ~~~ @par Example: c++ -D WITH_IPV6_ONLY -o server stdsoap2.cpp soapC.cpp soapServer.cpp server.cpp */ #define WITH_IPV6_V6ONLY /// When this macro is defined at compile time (undefined by default), enables linkage with OpenSSL for HTTPS and WS-Security (this macro should also be defined when using plugins that rely on OpenSSL) /** Use the following functions to configure SSL/TLS connections and to accept SSL/TLS connections: - `::soap_ssl_init` - `::soap_ssl_noinit` - `::soap_ssl_client_context` - `::soap_ssl_server_context` - `::soap_ssl_crl` - `::soap_ssl_accept` @par Examples: c++ -D WITH_OPENSSL -D WITH_DOM -o client stdsoap2.cpp dom.cpp soapC.cpp soapClient.cpp client.cpp plugin/smdevp.c plugin/mecevp.c plugin/wsseapi.c plugin/threads.c -lcrypto -lssl c++ -D WITH_OPENSSL -D WITH_DOM -o server stdsoap2.cpp dom.cpp soapC.cpp soapServer.cpp server.cpp plugin/smdevp.c plugin/mecevp.c plugin/wsseapi.c plugin/threads.c -lcrypto -lssl */ #define WITH_OPENSSL /// When this macro is defined at compile time (undefined by default), enables linking the GNUTLS library to enable HTTPS in the engine /** Use the following functions to configure SSL/TLS connections and to accept SSL/TLS connections: - `::soap_ssl_init` - `::soap_ssl_noinit` - `::soap_ssl_client_context` - `::soap_ssl_server_context` - `::soap_ssl_crl` - `::soap_ssl_accept` @par Examples: c++ -D WITH_GNUTLS -o client stdsoap2.cpp soapC.cpp soapClient.cpp client.cpp -lgnutls c++ -D WITH_GNUTLS -o server stdsoap2.cpp soapC.cpp soapServer.cpp server.cpp -lgnutls */ #define WITH_GNUTLS /// When this macro is defined at compile time (undefined by default), enables linkage with the zlib library for HTTP message compression (using compress and gzip methods) when the `#SOAP_ENC_ZLIB` mode flag is enabled at runtime /** To enable compression with the gzip method and decompression with the compress and gzip methods, use `#SOAP_ENC_ZLIB`: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_ENC_ZLIB); ~~~ @par Examples: c++ -D WITH_GZIP -o client stdsoap2.cpp soapC.cpp soapClient.cpp client.cpp -lz c++ -D WITH_GZIP -o server stdsoap2.cpp soapC.cpp soapServer.cpp server.cpp -lz @see `#WITH_ZLIB` to only enable compress but not gzip compression. */ #define WITH_GZIP /// When this macro is defined at compile time (undefined by default), enables linking the zlib library for HTTP message compression when the `#SOAP_ENC_ZLIB` mode flag is enabled at runtime /** To enable (de)compression with the compress method use `#SOAP_ENC_ZLIB`: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_ENC_ZLIB); ~~~ @par Examples: c++ -D WITH_ZLIB -o client stdsoap2.cpp soapC.cpp soapClient.cpp client.cpp -lz c++ -D WITH_ZLIB -o server stdsoap2.cpp soapC.cpp soapServer.cpp server.cpp -lz @see `#WITH_GZIP` to also enable the gzip compression method in addition to compress. */ #define WITH_ZLIB /// When this macro is defined at compile time (undefined by default), enables linkage with the ntlm library for HTTP NTLM authentication /** The libntlm library is available at http://www.nongnu.org/libntlm and required for non-Windows platforms. @par Examples: c++ -D WITH_NTLM -o client stdsoap2.cpp soapC.cpp soapClient.cpp client.cpp -lntlm c++ -D WITH_NTLM -o server stdsoap2.cpp soapC.cpp soapServer.cpp server.cpp -lntlm @see `::soap::ntlm_challenge`. */ #define WITH_NTLM /// When this macro is defined at compile time (defined by default for most platforms), the C locale is enabled in the engine, opposite of `#WITH_NO_C_LOCALE` /** This macro prevents floating point values from getting garbled by the standard locale-dependent `strtod` and `sprintf` functions used by the engine, for example when the current locale of the machine redefines the decimal point. */ #define WITH_C_LOCALE /// When this macro is defined at compile time (undefined by default), the use of the C locale is disabled in the engine, the opposite of `#WITH_C_LOCALE` /** Defining this macro improves portability of the engine's source code on older platforms that do not have working versions of locale.h and xlocale.h. @warning When the current locale of the machine redefines the decimal point, floating point values may be rejected by the XML validator and may be garbled in XML and JSON output due to the standard locale-dependent `strtod` and `sprintf` functions. @par Example: c++ -D WITH_NO_C_LOCALE -c stdsoap2.cpp */ #define WITH_NO_C_LOCALE /// When this macro is defined at compile time (defined by default for most platforms), include xlocale.h to define `locale_t` and the `_l` locale-specific functions #define WITH_INCLUDE_XLOCALE_H /// When this macro is defined at compile time (undefined by default), enables WS-Security signature verification and XML re-canonicalization, i.e. this macro must be defined when using the gSOAP WSSE plugin for WS-Security /** To enable DOM parsing use `#SOAP_XML_DOM`, for example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_XML_DOM); ... // call an XML service operation that deserializes the response if (soap->dom) // we also got a DOM { const struct soap_dom_element *elt = soap->dom; ... // inspect the DOM using the DOM API functions } ~~~ @par Examples: c++ -D WITH_OPENSSL -D WITH_DOM -o client stdsoap2.cpp dom.cpp soapC.cpp soapClient.cpp client.cpp plugin/smdevp.c plugin/mecevp.c plugin/wsseapi.c plugin/threads.c -lcrypto -lssl c++ -D WITH_OPENSSL -D WITH_DOM -o server stdsoap2.cpp dom.cpp soapC.cpp soapServer.cpp server.cpp plugin/smdevp.c plugin/mecevp.c plugin/wsseapi.c plugin/threads.c -lcrypto -lssl @see `#SOAP_XML_DOM` and the gSOAP [XML DOM API documentation](../../dom/html/index.html). */ #define WITH_DOM /// When this macro is defined at compile time (undefined by default), replaces UTF-8 content that is outside the Unicode range with the value of `#SOAP_UNKNOWN_UNICODE_CHAR` (Unicode FFFD) to indicate illegal UTF-8, set `#SOAP_UNKNOWN_UNICODE_CHAR` to another integer code if desired (the value is 0xFFFD by default) /** @warning Without this macro the engine silently accepts UTF-8 content that is outside the Unicode character ranges U+0000 to U+D7FF, U+E000 to U+FFFD, U+10000 to U+10FFFF. @par Example: c++ -D WITH_REPLACE_ILLEGAL_UTF8 -c stdsoap2.cpp @see `#SOAP_UNKNOWN_UNICODE_CHAR`. */ #define WITH_REPLACE_ILLEGAL_UTF8 /// When this macro is defined at compile time (undefined by default), enables and configures the engine and generated code to use FastCGI at the server side /** Call `::soap_serve` (or the C++ service class `serve` method) to serve CGI and FastCGI requests (only FastCGI requires `#WITH_FASTCGI` but CGI works without this configuration). @par Example: soapcpp2 myservice.h c++ -D WITH_FASTCGI -o server stdsoap2.cpp soapC.cpp soapServer.cpp server.cpp ~~~{.cpp} // example server.cpp #include "soapH.h" int main() { struct soap *soap = soap_new(); soap_serve(soap); soap_destroy(soap); soap_end(soap); soap_free(soap); } ... // web method implementations ~~~ */ #define WITH_FASTCGI /// When this macro is defined at compile time (undefined by default), removes all IO and socket library calls to replace these with user-supplied callback functions, see the IO callbacks in the user guide /** The following IO and socket-related functions should be defined by callbacks implemented by the user as follows: ~~~{.cpp} #include "soapH.h" int my_accept(struct soap *soap, SOAP_SOCKET sock, struct sockaddr *addr, int *len) { ... } int my_connect(struct soap *soap, const char *endpoint, const char *host, int port) { ... } int my_disconnect(struct soap *soap) { ... } int my_closesocket(struct soap *soap, SOAP_SOCKET sock) { ... } int my_shutdownsocket(struct soap *soap, SOAP_SOCKET sock, int how) { ... } int my_send(struct soap *soap, const char *data, size_t len) { ... } size_t my_recv(struct soap *soap, char *buf, size_t len) { ... } int my_poll(struct soap *soap) { ... } struct soap *soap = soap_new(); soap->faccept = my_accept; soap->fopen = my_connect; soap->fclose = my_disconnect; soap->fclosesocket = my_close; soap->fshutdownsocket = my_shutdown; soap->fsend = my_send; soap->frecv = my_recv; soap->fpoll = my_poll; ~~~ The socket-related callbacks can be omitted when only basic IO operations are needed to read/write XML with the `::soap::frecv` and `::soap::fsend` callbacks. @warning When this macro is define at the compiler's command line or in an IDE or by specifying `#SOAPDEFS_H`, then all source code files of an application's project must be recompiled. Otherwise, `::soap` context corruption errors may occur in the non-recompiled parts of the application, because the size of the `::soap` context has changed. @par Examples: c++ -D WITH_NOIO -o client stdsoap2.cpp soapC.cpp soapClient.cpp client.cpp c++ -D WITH_NOIO -o server stdsoap2.cpp soapC.cpp soapServer.cpp server.cpp @see `::soap::faccept`, `::soap::fopen`, `::soap::fclose`, `::soap::fclosesocket`, `::soap::fshutdownsocket`, `::soap::fsend`, `::soap::frecv`, `::soap::fpoll`. */ #define WITH_NOIO /// When this macro is defined at compile time (undefined by default), permanently disables XML ID (`id` attribute) and REF (`href` or `ref` attribute) processing rules associated with SOAP 1.1 and SOAP 1.2 "multi-reference" data to serialize object graphs, this is a more aggressive optimization option than the runtime `#SOAP_XML_TREE` flag /** Alternatively, set `#SOAP_XML_TREE` at runtime: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_XML_TREE); ~~~ @par Examples: c++ -D WITH_NOIDREF -o client stdsoap2.cpp soapC.cpp soapClient.cpp client.cpp c++ -D WITH_NOIDREF -o server stdsoap2.cpp soapC.cpp soapServer.cpp server.cpp @see `#SOAP_XML_TREE`, `#SOAP_XML_GRAPH`. */ #define WITH_NOIDREF /// When this macro is defined at compile time (undefined by default), permanently removes the HTTP stack to reduce code size /** @par Example: c++ -D WITH_NOHTTP -o xmlapp stdsoap2.cpp soapC.cpp xmlapp.cpp */ #define WITH_NOHTTP /// When this macro is defined at compile time (undefined by default), removes and ignores the timezone in `xsd:dateTime` values /** @par Examples: c++ -D WITH_NOZONE -o client stdsoap2.cpp soapC.cpp soapClient.cpp client.cpp c++ -D WITH_NOZONE -o server stdsoap2.cpp soapC.cpp soapServer.cpp server.cpp */ #define WITH_NOZONE /// When this macro is defined at compile time, default empty namespaces are not required to parse XML and are disabled from XML messages when the `#SOAP_XML_DEFAULTNS` mode flag is used /** This macro is intended for backward compatibility with old XML parsers and old gSOAP versions that do not support `xmlns=""` empty default namespaces. When used with the runtime `#SOAP_XML_DEFAULTNS` mode flag, produces XML that lacks `xmlns=""` which should only be used for special cases and is not recommended in general. @warning This macro should only be used to resolve issues with older tools that do not support `xmlns=""` in XML messages or when XML messages should be parsed and validated that do not include `xmlns=""` that are normally expected in valid XML. */ #define WITH_NOEMPTYNAMESPACES /// When this macro is defined at compile time (undefined by default), omits SOAP Header and Fault serialization code, this flag prevents duplicate definitions in the source code generated by soapcpp2 /// When this macro is defined at compile time (defined for C but undefined for C++), the generated code by the soapcpp2 tool inserts a dummy member in empty structs to allow compilation to succeed with compilers that reject empty structs and unions #define WITH_NOEMPTYSTRUCT /// When this macro is defined at compile time (undefined by default), omits SOAP Header and Fault serialization code, this flag prevents duplicate definitions in the source code generated by soapcpp2 /** This macro is used in the generated files when `soapcpp2 -pname` option `-pname` is used. */ #define WITH_NOGLOBAL /// When this macro is defined at compile time (undefined by default), removes dependence on the global `::namespaces` table, rather users must set the XML namespaces explicitly by calling `::soap_set_namespaces` /** Applications developed with soapcpp2 options `-i` or `-j` assign a namespace table automatically to the `::soap` context when the proxy or service object is instantiated. Other applications must set the namespace table explicitly, before processing XML, for example: ~~~{.cpp} #include "soapH.h" struct Namespace my_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 }, { "ns", "http://tempuri.org/ns.xsd", NULL, NULL }, { NULL, NULL, NULL, NULL } }; struct soap *soap = soap_new(); soap_set_namespaces(soap, my_namespaces); ~~~ This example defines SOAP 1.1 namespaces (`SOAP-ENV` and `SOAP-ENC`) to be used by default, but also accepts SOAP 1.2 because of the second URI in the third column. XML schema instance namespace `xsi` is used with `xsi:type` and `xsi:nil` and the XML schema namespace `xsd` is used with XSD types such as `xsd:string`, which may be used in XML messages. URI patterns in the third column may contain wildcard strings `*` and wildcard characters `-`. @par Examples: c++ -D WITH_NONAMESPACES -o client stdsoap2.cpp soapC.cpp soapClient.cpp client.cpp c++ -D WITH_NONAMESPACES -o server stdsoap2.cpp soapC.cpp soapServer.cpp server.cpp */ #define WITH_NONAMESPACES /// When this macro is defined at compile time (undefined by default), retains the parsed CDATA sections in literal XML strings /** Literal XML strings are built-in `_XML` types (a typedef of `char*`) in the .h file for soapcpp2, or a user-defined `typedef std::string XML` to define a `XML` literal string. Literal XML strings contain XML, but CDATA sections are stripped by the XML parser unless this macro is enabled. @par Example: soapcpp2 -C myservice.h c++ -D WITH_CDATA -o client stdsoap2.cpp soapC.cpp soapClient.cpp client.cpp ~~~{.cpp} // example myservice.h file for soapcpp2 //gsoap ns service name: example //gsoap ns service namespace: urn:example int ns__webmethod(_XML string, _XML *response); // _XML is a literal XML string (a char* type) ~~~ ~~~{.cpp} // example client.cpp file #include "soapH.h" #include "example.nsmap" struct soap *soap = soap_new1(SOAP_XML_INDENT); if (soap_call_ns__webmethod(soap, endpoint, NULL, "Some text", &r)) soap_print_fault(soap, stderr); else printf("XML = %s\n", response); soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~ Request and response messages: ~~~{.xml} Some text ~~~ ~~~{.xml} Some text]]> ~~~ Output with `#WITH_CDATA`: XML = Some text]]> Output without `#WITH_CDATA`: XML = Some text */ #define WITH_CDATA /// When this macro is defined at compile time (undefined by default), makes C++ service class operation methods and the copy method pure virtual by defining `#SOAP_PURE_VIRTUAL` = 0 /** Alternatively, use `#WITH_DEFAULT_VIRTUAL` to make C++ service class operation methods return `#SOAP_NO_METHOD` for rapid Web API prototyping and development. @note Requires `soapcpp2 -j` option `-j` or option `-i` to generate C++ service classes. @par Example: soapcpp2 -j myservice.h c++ -D WITH_PURE_VIRTUAL -o server stdsoap2.cpp soapC.cpp soapexampleService.cpp server.cpp ~~~{.cpp} // example myservice.h file for soapcpp2 //gsoap ns service name: example //gsoap ns service namespace: urn:example struct ns__webmethodResponse { char *string; }; int ns__webmethod(char *string, struct ns__webmethodResponse *response); ~~~ ~~~{.cpp} // example server.cpp file #include "soapexampleService.h" #include "example.nsmap" class MyService : public exampleService { public: virtual int webmethod(char *string, struct ns__webmethodResponse *response) { response->string = string; return SOAP_OK; } virtual MyService *copy() { return new MyService(); // new instance, nothing shared or copied } }; int main() { return MyService().run(PORTNUM); } ~~~ @see `#WITH_DEFAULT_VIRTUAL`. */ #define WITH_PURE_VIRTUAL /// When this macro is defined at compile time (undefined by default), enables C++ base service classes with default virtual methods returning fault `#SOAP_NO_METHOD` /** Use `#WITH_DEFAULT_VIRTUAL` to make C++ service class operation methods return `#SOAP_NO_METHOD` for rapid Web API prototyping and development. @note Requires `soapcpp2 -j` option `-j` or option `-i` to generate C++ service classes. @par Example: soapcpp2 -j myservice.h c++ -D WITH_DEFAULT_VIRTUAL -o server stdsoap2.cpp soapC.cpp soapMyService.cpp server.cpp ~~~{.cpp} // example myservice.h file for soapcpp2 //gsoap ns service name: example //gsoap ns service namespace: urn:example struct ns__webmethodResponse { char *string; }; int ns__webmethod(char *string, struct ns__webmethodResponse *response); ~~~ ~~~{.cpp} // example server.cpp file #include "soapexampleService.h" #include "example.nsmap" class MyService : public exampleService { public: virtual int webmethod(char *string, struct ns__webmethodResponse *response) { response->string = string; return SOAP_OK; } // note: other methods (if any) will return SOAP_NO_METHOD }; int main() { return MyService().run(PORTNUM); } ~~~ */ #define WITH_DEFAULT_VIRTUAL /// When this macro is defined at compile time (undefined by default), enables case insensitive XML tag name parsing and validation /** XML is case sensitive, whereas HTML is case insensitive. XML parsing is always case insensitive unless overruled by thie macro. @par Example: c++ -D WITH_CASEINSENSITIVETAGS -c stdsoap2.cpp */ #define WITH_CASEINSENSITIVETAGS /// When this macro is defined at compile time (undefined by default), prevents a server port from staying in listening mode after exit by internally setting `fcntl(sock, F_SETFD, FD_CLOEXEC)` /** @par Example: c++ -D WITH_SOCKET_CLOSE_ON_EXIT -c stdsoap2.cpp */ #define WITH_SOCKET_CLOSE_ON_EXIT /// When this macro is defined at compile time (undefined by default), the engine transmits TCP FIN using `shutdown(sock, SHUT_WR)` after all sends are completed and just before the socket closes /** @par Example: c++ -D WITH_TCPFIN -c stdsoap2.cpp */ #define WITH_TCPFIN /// When this macro is defined at compile time (undefined by default), the engine is configured to enable `::soap_close_connection` using a "self-pipe" /** To use `::soap_close_connection` from another thread to terminate a thread that is blocked on socket IO requires `::soap::recv_timeout` and `::soap::send_timeout` set to nonzero timeout values. @warning When this macro is define at the compiler's command line or in an IDE or by specifying `#SOAPDEFS_H`, then all source code files of an application's project must be recompiled. Otherwise, `::soap` context corruption errors may occur in the non-recompiled parts of the application, because the size of the `::soap` context has changed. @par Example: c++ -D WITH_SELF_PIPE -o server stdsoap2.cpp soapC.cpp soapMyService.cpp server.cpp @see `::soap_close_connection`. */ #define WITH_SELF_PIPE /** @} */ /** \defgroup group_soap SOAP_MACRO compile-time values @brief This module defines the `SOAP_MACRO` compile-time values to configure the engine build This module defines the following macros with values to configure the engine build: - `#SOAP_NOTHROW` - `#SOAP_BUFLEN` - `#SOAP_HDRLEN` - `#SOAP_TAGLEN` - `#SOAP_TMPLEN` - `#SOAP_MAXALLOCSIZE` - `#SOAP_MAXARRAYSIZE` - `#SOAP_MAXDIMESIZE` - `#SOAP_MAXEINTR` - `#SOAP_MAXINFLATESIZE` - `#SOAP_MAXKEEPALIVE` - `#SOAP_MAXLENGTH` - `#SOAP_MAXLEVEL` - `#SOAP_MAXOCCURS` - `#SOAP_MINDEFLATERATIO` - `#SOAP_PURE_VIRTUAL` - `#SOAP_SSL_RSA_BITS` - `#SOAP_UNKNOWN_CHAR` - `#SOAP_UNKNOWN_UNICODE_CHAR` - `#SOAP_LONG_FORMAT` - `#SOAP_ULONG_FORMAT` - `#SOAP_SOCKET` - `#SOAP_SOCKLEN_T` - `#SOAP_INVALID_SOCKET` - `#soap_valid_socket` Integer and float type macros: - `#LONG64` - `#ULONG64` - `#FLT_NAN` - `#FLT_PINFTY` - `#FLT_NINFTY` - `#DBL_NAN` - `#DBL_PINFTY` - `#DBL_NINFTY` - `#soap_isnan` - `#soap_isinf` Macros for heap allocation: - `#SOAP_MALLOC` - `#SOAP_FREE` - `#SOAP_NEW` - `#SOAP_NEW_ARRAY` - `#SOAP_PLACEMENT_NEW` - `#SOAP_DELETE` - `#SOAP_DELETE_ARRAY` - `#SOAP_MALLOC_UNMANAGED` - `#SOAP_FREE_UNMANAGED` - `#SOAP_NEW_UNMANAGED` - `#SOAP_DELETE_UNMANAGED` DLL and API export related macros: - `#SOAP_STD_EXPORTS` - `#SOAP_FMAC1` - `#SOAP_FMAC2` - `#SOAP_FMAC3` - `#SOAP_FMAC4` - `#SOAP_FMAC5` - `#SOAP_FMAC6` - `#SOAP_CMAC` - `#SOAP_NMAC` @{ */ /// Macro expands to `(std::nothrow)` to prevent the deserializer's memory allocator from throwing an exception but return `#SOAP_EOM` instead, this macro is empty when `#WITH_COMPAT` is enabled or when `#WITH_LEAN` or `#WITH_LEANER` are enabled which means that exceptions may be thrown /** It is possible to enable C++ exceptions without detrimental effects by compiling the source code with `#SOAP_NOTHROW` set to an empty value and in that case C++ exception handlers should be used to catch `std::bad_alloc`. By default, `::soap_new` and the soapcpp2-generated `soap_new_T` functions return NULL when allocation failed. @warning `::soap_malloc` never throws `std::bad_alloc`, which means that parsing and deserialization of C++ data may not throw `std::bad_alloc` in some cases, but rather the functions called will return `#SOAP_EOM` and `::soap::error` is set to `#SOAP_EOM`. `::soap_malloc` also returns `#SOAP_EOM` when `#SOAP_MAXALLOCSIZE` is exceeded. @par Example: c++ -D SOAP_NOTHROW="" -o client stdsoap2.cpp soapC.cpp soapClient.cpp client.cpp ~~~{.cpp} // compiled with compile-time flag -D SOAP_NOTHROW="" #include "soapH.h" try { // soap_new() may cause a std::bad_alloc exception struct soap *soap = soap_new(); // MyClass is declared in soapH.h generated by soapcpp2 from a .h file with MyClass MyClass *obj = soap_new_MyClass(soap); ... // use obj } catch (std::bad_alloc) { ... // out of memory error } ~~~ */ #define SOAP_NOTHROW (std::nothrow) /// User-definable size of the input and output message buffer `::soap::buf` (the value is 65536 by default) /** This macro defines the size of the input and output message buffer, which is 65536 by default unless the `#WITH_LEAN` or `#WITH_LEANER` compile-time flags are used and the buffer size is 2048. The size of the buffer affects the performance of socket communications, with larger sizes above 8192 generally improving the performance at the cost of the extra memory required to store the larger `::soap` context. A default value of 65535 was chosen for OpenVMS TCP/IP stacks that cannot handle 65536 bytes. A default value of 2048 is used for WinCE platforms. A default value of 32767 is used for Tandom NonStop platforms. @warning When the value of this macro is assigned at the compiler's command line or in an IDE or by specifying `#SOAPDEFS_H`, then all source code files of an application's project must be recompiled. Otherwise, `::soap` context corruption errors may occur in the non-recompiled parts of the application, because the size of the `::soap` context has changed. */ #define SOAP_BUFLEN (65536) /// User-definable maximum length of HTTP headers (the value is 8192 by default) /** @warning When the value of this macro is assigned at the compiler's command line or in an IDE or by specifying `#SOAPDEFS_H`, then all source code files of an application's project must be recompiled. Otherwise, `::soap` context corruption errors may occur in the non-recompiled parts of the application, because the size of the `::soap` context has changed. */ #define SOAP_HDRLEN (8192) /// User-definable maximum length of XML tags and URLs (the value is 1024 by default) /** @warning When the value of this macro is assigned at the compiler's command line or in an IDE or by specifying `#SOAPDEFS_H`, then all source code files of an application's project must be recompiled. Otherwise, `::soap` context corruption errors may occur in the non-recompiled parts of the application, because the size of the `::soap` context has changed. */ #define SOAP_TAGLEN (1024) /// User-definable maximum length of temporary string values stored in `::soap::msgbuf` and `::soap::tmpbuf`, e.g. to hold short strings and brief error messages (1024 by default, must not be less than 1024) /** @warning When the value of this macro is assigned at the compiler's command line or in an IDE or by specifying `#SOAPDEFS_H`, then all source code files of an application's project must be recompiled. Otherwise, `::soap` context corruption errors may occur in the non-recompiled parts of the application, because the size of the `::soap` context has changed. */ #define SOAP_TMPLEN (1024) /// User-definable maximum size of a block of memory that `malloc` can allocate or 0 for no limit (the value is 0 by default) #define SOAP_MAXALLOCSIZE (0) /// User-definable macro to protect excessive SOAP array allocation requests by defining a maximum allocation threshold /** Deserialized SOAP arrays larger in size than `#SOAP_MAXARRAYSIZE` are not pre-allocated in memory, but deserialized on an element-by-element basis until XML validation contrains kick in (the value is 100000 by default) */ #define SOAP_MAXARRAYSIZE (100000) /// User-definable maximum length of DIME attachments received (the value is 8 MB by default) /** DIME attachments sizes are limited to `#SOAP_MAXDIMESIZE`. Increase this value to allow larger attachments or decrease when resources are limited, this limit is to deny senders to pre-allocate excessive memory at the receiver side without actually sending the whole message, i.e. this threshold protects against DIME-based memory resource usage attacks. */ #define SOAP_MAXDIMESIZE (8*1048576) /// User-definable maximum number of EINTR interrupts to ignore while polling a socket for pending activity, each EINTR ignored may increase the I/O blocking time by at most one second (the value is 10 by default) #define SOAP_MAXEINTR (10) /// Trusted inflated content size (1 MB by default), larger content is subject to the `#SOAP_MINDEFLATERATIO` constraint, i.e. if `#SOAP_MINDEFLATERATIO` is 1.0, `#SOAP_MAXINFLATESIZE` is always the max size of uncompressed content #define SOAP_MAXINFLATESIZE (1*1048576) /// User-definable maximum iterations in the server-side `::soap_serve` loop (or the C++ service class `serve` method) on HTTP keep-alive connections, assigned to `::soap::max_keep_alive` which can be altered at runtime (the value is 100 by default) #define SOAP_MAXKEEPALIVE (100) /// User-definable maximum string content length for strings not already constrained by XML schema validation constraints, zero or negative means unlimited string lengths are allowed (the value is 0 by default) #define SOAP_MAXLENGTH (0) /// User-definable maximum XML nesting depth level permitted by the XML parser, must be greater than zero (the value is 10000 by default) #define SOAP_MAXLEVEL (10000) /// User-definable maximum number of array or container elements for containers that are not already constrained by XML schema validation constraints, must be greater than zero (the value is 100000 by default) #define SOAP_MAXOCCURS (100000) /// Trusted deflation ratio after `#SOAP_MAXINFLATESIZE` is reached, trust when compressed / deflated > `#SOAP_MINDEFLATERATIO` (default is 0.00096899224806 or 1032:1, which is according to the zlib site: "The limit (1032:1) comes from the fact that one length/distance pair can represent at most 258 output bytes. A length requires at least one bit and a distance requires at least one bit, so two bits in can give 258 bytes out, or eight bits in give 1032 bytes out. A dynamic block has no length restriction, so you could get arbitrarily close to the limit of 1032:1." #define SOAP_MINDEFLATERATIO (1.0/1032.0) /// Macro is set to `#SOAP_PURE_VIRTUAL` = 0 at compile time when macro `#WITH_PURE_VIRTUAL` is defined #define SOAP_PURE_VIRTUAL = 0 /// User-definable length of RSA keys used for https connections (the value is 2048 by default) #define SOAP_SSL_RSA_BITS (2048) /// User-definable 8 bit integer that represents a character that could not be converted to an ASCII char, i.e. when converting an XML Unicode character (typically UTF-8), this is applicable when the runtime flag `#SOAP_C_UTFSTRING` is not used (the value is 0x7F by default) #define SOAP_UNKNOWN_CHAR (0x7F) /// A user-definable integer Unicode value representing a character that replaces an invalid Unicode code point, i.e. when converting an XML invalid Unicode character from UTF-8 (the value is 0xFFFD by default) #define SOAP_UNKNOWN_UNICODE_CHAR (0xFFFD) /// User-definable macro that represents the `#LONG64` printf %-format /** This macro is "%lld" or "%I64d" on Windows. */ #define SOAP_LONG_FORMAT "%lld" /// User-definable macro that represents the `#ULONG64` printf %-format /** This macro is "%llu" or "%I64u" on Windows. */ #define SOAP_ULONG_FORMAT "%llu" /// Macro that defines a portable socket type, usually `int`, but the type may depend on the platform being used #define SOAP_SOCKET int /// Macro that defines a portable invalid socket value (usually -1, but the value depends on the OS) /** @see `#soap_valid_socket`. */ #define SOAP_INVALID_SOCKET (-1) /// Macro that defines a portable socklen_t type (usually `size_t`, but type depends on the OS) #define SOAP_SOCKLEN_T size_t /// Function macro to check if a socket is valid, i.e. not equal to `#SOAP_INVALID_SOCKET` #define soap_valid_socket(sock) ((sock) != SOAP_INVALID_SOCKET) /// User-definable macro that represents a portable signed 64 bit integer type /** Legacy platforms that do not support 64 bit types can still be used by redefining `#LONG64` to `int`. For example: cc -D LONG64=int -D ULONG64="unsigned int" -D SOAP_LONG_FORMAT='"%d"' -D SOAP_ULONG_FORMAT='"%u"' -o client stdsoap2.c soapC.c soapClient.c client.c This type is also available as a valid type to use in the .h file for soapcpp2. @see `#ULONG64`, `#SOAP_LONG_FORMAT`, `#SOAP_ULONG_FORMAT`. */ #define LONG64 int64_t /// User-definable macro that represents a portable unsigned 64 bit integer type /** Legacy platforms that do not support 64 bit types can still be used by redefining `#LONG64` to `int`. For example: cc -D LONG64=int -D ULONG64="unsigned int" -D SOAP_LONG_FORMAT='"%d"' -D SOAP_ULONG_FORMAT='"%u"' -o client stdsoap2.c soapC.c soapClient.c client.c This type is also available as a valid type to use in the .h file for soapcpp2. @see `#LONG64`, `#SOAP_LONG_FORMAT`, `#SOAP_ULONG_FORMAT`. */ #define ULONG64 uint64_t /// User-definable macro that represents a portable single floating point NaN value (defined by default to a platform-specific NaN value) #define FLT_NAN /// User-definable macro that represents a portable single floating point positive infinite value (defined by default to a platform-specific value) #define FLT_PINFTY /// User-definable macro that represents a portable single floating point negative infinite value (defined by default to a platform-specific value) #define FLT_NINFTY /// User-definable macro that represents a portable double floating point NaN value (defined by default to a platform-specific NaN value) #define DBL_NAN /// User-definable macro that represents a portable double floating point positive infinite value (defined by default to a platform-specific value) #define DBL_PINFTY /// User-definable macro that represents a portable double floating point negative infinite value (defined by default to a platform-specific value) #define DBL_NINFTY /// Macro that returns true if the floating point value is NaN #define soap_isnan(x) /// Macro that returns true if the floating point value is infinity #define soap_isinf(x) /// User-definable macro to override malloc() for context-managed heap allocation (excluding C++ class instances, see `#SOAP_NEW`) #define SOAP_MALLOC(soap, size) malloc((size)) /// User-definable macro to override free() for context-managed heap allocation (excluding C++ class instances, see `#SOAP_DELETE`) #define SOAP_FREE(soap, ptr) free((void*)(ptr)) /// User-definable macro to override malloc() for unmanaged heap allocation #define SOAP_MALLOC_UNMANAGED(soap, size) malloc((size)) /// User-definable macro to override free() for unmanaged heap allocation #define SOAP_FREE_UNMANAGED(soap, ptr) free((void*)(ptr)) /// User-definable macro to override C++ new #define SOAP_NEW(soap, type) new SOAP_NOTHROW (type) /// User-definable macro to override C++ new for arrays #define SOAP_NEW_ARRAY(soap, type, n) new SOAP_NOTHROW type[n] /// User-definable macro to override C++ placement new #define SOAP_PLACEMENT_NEW(soap, buf, type) new (buf) (type) /// User-definable macro to override C++ delete #define SOAP_DELETE(soap, obj, type) delete obj /// User-definable macro to override C++ delete for arrays #define SOAP_DELETE_ARRAY(soap, obj, type) delete[] obj /// User-definable macro to override C++ new for unmanaged allocation of the soap context #define SOAP_NEW_UNMANAGED(soap) new SOAP_NOTHROW soap /// User-definable macro to override C++ delete for unmanaged deallocation of the soap context #define SOAP_DELETE_UNMANAGED(soap) delete soap /// User-definable macro to enable Windows DLL builds /** This macro when set exports global functions and classes by defining `#SOAP_FMAC1`, `#SOAP_FMAC3`, `#SOAP_FMAC5`, and `#SOAP_CMAC` to `__declspec(dllexport)`. @par Example: C:> soapcpp2.exe -penv env.h C:> cl /c /I. /EHsc /DWITH_NONAMESPACES /DSOAP_STD_EXPORTS envC.cpp stdsoap2.cpp C:> link /LIBPATH ws2_32.lib /OUT:mygsoap.dll /DLL envC.obj stdsoap2.obj */ #define SOAP_STD_EXPORTS /// User-definable macro to annotate global functions /** @see `#SOAP_STD_EXPORTS`, `#SOAP_FMAC2`. */ #define SOAP_FMAC1 /// User-definable macro to annotate global functions /** This macro is used in combination with `#SOAP_FMAC1`. @see `#SOAP_FMAC1`. */ #define SOAP_FMAC2 /// User-definable macro to annotate global serialization functions generated by soapcpp2 /** The soapcpp2 tool generates serialization functions as follows: ~~~{.cpp} SOAP_FMAC3 int SOAP_FMAC4 soap_out_int(struct soap *soap, const char *tag, int id, const int *ptr, const char *type); SOAP_FMAC3 int * SOAP_FMAC4 soap_in_int(struct soap *soap, const char *tag, int *ptr, const char *type); SOAP_FMAC3 int * SOAP_FMAC4 soap_new_int(struct soap *soap, int num); SOAP_FMAC3 int SOAP_FMAC4 soap_put_int(struct soap *soap, const int *ptr, const char *tag, const char *type); SOAP_FMAC3 int * SOAP_FMAC4 soap_get_int(struct soap *soap, int *ptr, const char *tag, const char *type); ~~~ Other serialization functions are generated as well, either as C++ inlines or C defines. @see `#SOAP_STD_EXPORTS`, `#SOAP_FMAC4`. */ #define SOAP_FMAC3 /// User-definable macro to annotate global serialization functions generated by soapcpp2 /** This macro is used in combination with `#SOAP_FMAC3`. @see `#SOAP_FMAC3`. */ #define SOAP_FMAC4 /// User-definable macro to annotate global service functions generated by soapcpp2 /** The soapcpp2 tool generates service functions as follows at the client and service sides, respectively: ~~~{.cpp} SOAP_FMAC5 int SOAP_FMAC6 soap_call_ns__webmethod(struct soap *soap, ...) { ... } ~~~ ~~~{.cpp} SOAP_FMAC5 int SOAP_FMAC6 soap_serve_ns__webmethod(struct soap *soap) ~~~ @see `#SOAP_STD_EXPORTS`, `#SOAP_FMAC6`. */ #define SOAP_FMAC5 /// User-definable macro to annotate global service functions generated by soapcpp2 /** This macro is used in combination with `#SOAP_FMAC5`. @see `#SOAP_FMAC5`. */ #define SOAP_FMAC6 /// User-definable macro to annotate class definitions /** The soapcpp2 tool generates struct and class definitions as follows: ~~~{.cpp} class SOAP_CMAC name { ... }; ~~~ */ #define SOAP_CMAC /// User-definable macro to annotate namespace table definitions /** The soapcpp2 tool generates `::Namespace` tables with XML namespace bindings which are declared as follows: ~~~{.cpp} SOAP_NMAC struct Namespace namespaces[] = { ... }; ~~~ */ #define SOAP_NMAC /** @} */ /** \defgroup group_flags SOAP_MACRO run-time flags @brief This module defines the `SOAP_MACRO` run-time `::soap_mode` flags to set the engine mode This module defines the following `::soap_mode` flags: - `#SOAP_C_MBSTRING` - `#SOAP_C_NILSTRING` - `#SOAP_C_NOIOB` - `#SOAP_C_UTFSTRING` - `#SOAP_DOM_ASIS` - `#SOAP_DOM_NODE` - `#SOAP_DOM_TREE` - `#SOAP_ENC` - `#SOAP_ENC_DIME` - `#SOAP_ENC_LATIN` - `#SOAP_ENC_MIME` - `#SOAP_ENC_MTOM` - `#SOAP_ENC_PLAIN` - `#SOAP_ENC_SSL` - `#SOAP_ENC_XML` - `#SOAP_ENC_ZLIB` - `#SOAP_IO` - `#SOAP_IO_BUFFER` - `#SOAP_IO_CHUNK` - `#SOAP_IO_FLUSH` - `#SOAP_IO_KEEPALIVE` - `#SOAP_IO_LENGTH` - `#SOAP_IO_STORE` - `#SOAP_IO_UDP` - `#SOAP_MIME_POSTCHECK` - `#SOAP_SEC_WSUID` - `#SOAP_XML_CANONICAL` - `#SOAP_XML_CANONICAL_NA` - `#SOAP_XML_DEFAULTNS` - `#SOAP_XML_DOM` - `#SOAP_XML_GRAPH` - `#SOAP_XML_IGNORENS` - `#SOAP_XML_INDENT` - `#SOAP_XML_NIL` - `#SOAP_XML_NOTYPE` - `#SOAP_XML_STRICT` - `#SOAP_XML_TREE` @{ */ /// The `::soap_mode` flags to initialize the `::soap` context, flags can be combined with `|` (bit-wise or) /** The `::soap_mode` flags are: - `#SOAP_C_MBSTRING` - `#SOAP_C_NILSTRING` - `#SOAP_C_NOIOB` - `#SOAP_C_UTFSTRING` - `#SOAP_DOM_ASIS` - `#SOAP_DOM_NODE` - `#SOAP_DOM_TREE` - `#SOAP_ENC` - `#SOAP_ENC_DIME` - `#SOAP_ENC_LATIN` - `#SOAP_ENC_MIME` - `#SOAP_ENC_MTOM` - `#SOAP_ENC_PLAIN` - `#SOAP_ENC_SSL` - `#SOAP_ENC_XML` - `#SOAP_ENC_ZLIB` - `#SOAP_IO` - `#SOAP_IO_BUFFER` - `#SOAP_IO_CHUNK` - `#SOAP_IO_FLUSH` - `#SOAP_IO_KEEPALIVE` - `#SOAP_IO_LENGTH` - `#SOAP_IO_STORE` - `#SOAP_IO_UDP` - `#SOAP_MIME_POSTCHECK` - `#SOAP_SEC_WSUID` - `#SOAP_XML_CANONICAL` - `#SOAP_XML_CANONICAL_NA` - `#SOAP_XML_DEFAULTNS` - `#SOAP_XML_DOM` - `#SOAP_XML_GRAPH` - `#SOAP_XML_IGNORENS` - `#SOAP_XML_INDENT` - `#SOAP_XML_NIL` - `#SOAP_XML_NOTYPE` - `#SOAP_XML_STRICT` - `#SOAP_XML_TREE` */ typedef int soap_mode; /// `::soap_mode` IO flags mask to check for `#SOAP_IO_FLUSH`, `#SOAP_IO_BUFFER`, `#SOAP_IO_STORE`, `#SOAP_IO_CHUNK` (for internal use only) /** @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_IO_CHUNK); if ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK) ... // HTTP chunking is enabled ~~~ */ #define SOAP_IO 0x00000003 /// `::soap_mode` IO output flag value to flush the message sent immediately without buffering (the default mode), do not combine this flag with `#SOAP_IO_BUFFER`, `#SOAP_IO_STORE`, `#SOAP_IO_CHUNK` #define SOAP_IO_FLUSH 0x00000000 /// `::soap_mode` IO output flag value to buffer the message sent in packets of size `#SOAP_BUFLEN`, do not combine this flag with `#SOAP_IO_FLUSH`, `#SOAP_IO_STORE`, `#SOAP_IO_CHUNK` #define SOAP_IO_BUFFER 0x00000001 /// `::soap_mode` IO output flag value to store messages temporarily before transmission, e.g. to determine message length for transmission over HTTP instead of chunking or two-phase message sends, do not combine this flag with `#SOAP_IO_FLUSH`, `#SOAP_IO_BUFFER`, `#SOAP_IO_CHUNK` /** When set as input-mode flag, forces all messages sent to be temporarily stored before transmission. When set as output-mode flag, forces only the next message to be temporarily stored before transmission. @note `#SOAP_IO_CHUNK` is preferable over `#SOAP_IO_STORE`, because `#SOAP_IO_STORE` requires more memory and increases response time latency due to the overhead of storing the entire message before transmission. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_IO_STORE); // store messages temporarily before transmission ~~~ */ #define SOAP_IO_STORE 0x00000002 /// `::soap_mode` IO output flag value to send HTTP chunked messages, buffers the message in packets of size `#SOAP_BUFLEN`, do not combine this flag with `#SOAP_IO_FLUSH`, `#SOAP_IO_BUFFER`, `#SOAP_IO_STORE` /** @note `#SOAP_IO_CHUNK` is preferable to use compared to `#SOAP_IO_STORE`, because `#SOAP_IO_STORE` requires more memory and increases response time latency due to the overhead of storing the entire message before transmission. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_IO_CHUNK); // enable HTTP chunking ~~~ */ #define SOAP_IO_CHUNK 0x00000003 /// `::soap_mode` IO input/output flag value to use UDP datagrams, message size is limited to UDP packet size /** @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_IO_UDP); // use UDP ~~~ @see \ref UDP. */ #define SOAP_IO_UDP 0x00000004 /// `::soap_mode` IO output flag value to calculate message length when sending a message without transmission (for internal use only) /** @see `::soap_begin_count`, `::soap_end_count`. */ #define SOAP_IO_LENGTH 0x00000008 /// `::soap_mode` IO input and output flag value to keep the socket connection alive for `#SOAP_MAXKEEPALIVE` message exchanges per connection (100 by default), enabling HTTP keep-alive connection persistence /** This flag activates HTTP connection persistence for client and server applications. The input and output mode flags should both be set to enable HTTP connection persistance. Client applications can request HTTP persistance with this flag enabled and may indicate the end of a sequence of messages by disabling this flag immediately prior to the last message exchange with a server, which allows the server to gracefully close the connection. If the client does not disable this flag, the server will keep the connection open until the connection is reset or times out. Stand-alone server applications should be multi-threaded to use this flag, because iterative servers cannot serve other clients while connected to one client. Stand-alone multi-threaded server applications should also use timeouts and limit the number of messages exchanged in a keep-alive connection with `soap::max_keep_alive`, which is set to `#SOAP_MAXKEEPALIVE` (the value is 100 by default). @warning Do not use `#SOAP_IO_KEEPALIVE` with CGI and FastCGI applications. @par Examples: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_IO_KEEPALIVE); // enable HTTP keep-alive soap->max_keep_alive = 50; // serve 50 max keep-alive exchanges (SOAP_MAXKEEPALIVE by default) ... // serve requests with soap_bind, soap_accept, soap_ssl_accept, and soap_serve ~~~ ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); soap_set_mode(soap, SOAP_IO_KEEPALIVE); // keep connection to the server open if (soap_call_ns__webmethod(soap, endpoint, NULL, ...)) soap_print_fault(soap, stderr); else ... // success soap_clr_mode(soap, SOAP_IO_KEEPALIVE); // connection is still open, but close it afterwards if (soap_call_ns__webmethod(soap, endpoint, NULL, ...)) soap_print_fault(soap, stderr); else ... // success ~~~ @see `::soap::keep_alive`, `::soap::max_keep_alive`, `#SOAP_MAXKEEPALIVE`. */ #define SOAP_IO_KEEPALIVE 0x00000010 /// `::soap_mode` ENC flags mask (for internal use only) #define SOAP_ENC 0x00000FFF /// `::soap_mode` ENC input flag value to receive ISO-8859-1 encoded messages (automatically detected when receiving XML) #define SOAP_ENC_LATIN 0x00000020 /// `::soap_mode` ENC input/output flag value to omit the HTTP headers from messages sent and disable detection and parsing of HTTP headers in messages received /** @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_ENC_PLAIN); // no HTTP ~~~ */ #define SOAP_ENC_PLAIN 0x00000040 /// `::soap_mode` ENC input/output flag (deprecated, same as `#SOAP_ENC_PLAIN` for backward compatibility) #define SOAP_ENC_XML /// `::soap_mode` ENC output flag value to enable DIME attachments (for internal use only) /** @par Examples: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); struct _xop__Include data; // here we're using gsoap/import/xop.h to store a blob of raw data data.__ptr = (unsigned char*)soap_malloc(soap, 1024); // allocate 1024 bytes on the managed heap memcpy(data.__ptr, image_data); // copy an image (or we could just assign to data.__ptr) data.__size = 1024; // 1024 bytes of data data.id = soap_strdup(soap, soap_rand_uuid(soap, "uuid:")); // attachment id (optional, can use NULL) data.type = "image/png"; // attachment type data.options = soap_dime_option(soap, 0, "Picture.png"); // DIME option 0 = "Picture.png" to store file name ... // add data to the message and then send it, which will transmit the data as an attachment ~~~ ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); unsigned char *ptr = (unsigned char*)image_data; // image data to attach size_t size = 1024; // 1024 bytes of data const char *id = soap_strdup(soap, soap_rand_uuid(soap, "uuid:")); // attachment id (optional, can use NULL) const char *type = "image/png"; // attachment type if (soap_set_dime_attachment(soap, ptr, size, type, id, 0, "Picture.png")) ... // error attaching ... // send a message, image is attached ~~~ The `#SOAP_ENC_DIME` flag is automatically set when attachments are present in the message to be sent or when a message with DIME attachments is received and does not need to be set explicitly. DIME attachment sizes are limited to `#SOAP_MAXDIMESIZE`, which is a compile-time constant that can be changed. @see `#SOAP_ENC_MIME`, `#SOAP_ENC_DIME`, \ref DIME. */ #define SOAP_ENC_DIME 0x00000080 /// `::soap_mode` ENC output flag value to enable MIME attachments in messages to be sent, receiving is automatic /** The MTOM specification requires SOAP 1.2. @par Examples: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_ENC_MIME); // enable MIME attachments, not DIME or MTOM struct _xop__Include data; // here we're using gsoap/import/xop.h to store a blob of raw data data.__ptr = (unsigned char*)soap_malloc(soap, 1024); // allocate 1024 bytes on the managed heap memcpy(data.__ptr, image_data); // copy an image (or we could just assign to data.__ptr) data.__size = 1024; // 1024 bytes of data data.id = soap_strdup(soap, soap_rand_uuid(soap, "uuid:")); // attachment id (optional, can use NULL) data.type = "image/png"; // attachment type data.options = "Picture"; // attachment description ... // add data to the message and then send it ~~~ ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_ENC_MIME); // enable MIME attachments, not DIME or MTOM unsigned char *ptr = (unsigned char*)image_data; // image data to attach size_t size = 1024; // 1024 bytes of data const char *id = soap_strdup(soap, soap_rand_uuid(soap, "uuid:")); // attachment id (optional, can use NULL) const char *type = "image/png"; // attachment type if (soap_set_mime_attachment(soap, ptr, size, SOAP_MIME_BINARY, type, id, "No location", "Picture)) ... // error attaching ... // send a message, image is attached soap_clr_mime(soap); ~~~ @see `#SOAP_ENC_DIME`, `#SOAP_ENC_MTOM`, \ref MIME. */ #define SOAP_ENC_MIME 0x00000100 /// `::soap_mode` ENC output flag value to enable MTOM XOP attachments in messages to be sent, receiving is automatic /** @par Examples: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_ENC_MTOM); // enable MTOM attachments, not DIME struct _xop__Include data; // here we're using gsoap/import/xop.h to store a blob of raw data data.__ptr = (unsigned char*)soap_malloc(soap, 1024); // allocate 1024 bytes on the managed heap memcpy(data.__ptr, image_data); // copy an image (or we could just assign to data.__ptr) data.__size = 1024; // 1024 bytes of data data.id = soap_strdup(soap, soap_rand_uuid(soap, "uuid:")); // attachment id (optional, can use NULL) data.type = "image/png"; // attachment type data.options = "Picture"; // attachment description ... // add data to the message and then send it ~~~ ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_ENC_MTOM); // enable MTOM attachments, not DIME unsigned char *ptr = (unsigned char*)image_data; // image data to attach size_t size = 1024; // 1024 bytes of data const char *id = soap_strdup(soap, soap_rand_uuid(soap, "uuid:")); // attachment id (optional, can use NULL) const char *type = "image/png"; // attachment type if (soap_set_mime_attachment(soap, ptr, size, SOAP_MIME_BINARY, type, id, "No location", "Picture)) ... // error attaching ... // send a message, image is attached soap_clr_mime(soap); ~~~ @see `#SOAP_ENC_DIME`, `#SOAP_ENC_MIME`, \ref MTOM. */ #define SOAP_ENC_MTOM 0x00000200 /// `::soap_mode` ENC output flag value to compress messages sent, requires zlib enabled with compile-time flag `#WITH_GZIP` (or `#WITH_ZLIB` for compression limited to "compress"), detection of compressed messages received and decompression of the messages is automatic /** @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_ENC_ZLIB); // HTTP compression ~~~ */ #define SOAP_ENC_ZLIB 0x00000400 /// `::soap_mode` ENC input/output flag value to enable TLS/SSL, e.g. HTTPS, requires OpenSSL or GNUTLS enabled with compile-time flag `#WITH_OPENSSL` or `#WITH_GNUTLS` (for internal use only) #define SOAP_ENC_SSL 0x00000800 /// `::soap_mode` XML input flag value to enable strict XML validation of messages received /** @warning This mode is not recommended for SOAP RPC encoding style messaging. XML, XML REST, and SOAP/XML document/literal style messages can be validated. Alternatively, use `soapcpp2 -s` to generate stub and skeleton functions that perform strict XML validation checks. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_XML_STRICT); // strict XML validation ~~~ @see `#WITH_REPLACE_ILLEGAL_UTF8`, `#SOAP_UNKNOWN_UNICODE_CHAR`. */ #define SOAP_XML_STRICT 0x00001000 /// `::soap_mode` XML output flag value to enable XML (and JSON) message indentation in messages sent /** @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_XML_INDENT); // indent XML ~~~ */ #define SOAP_XML_INDENT 0x00002000 /// `::soap_mode` XML input flag value to ignore XML namespaces in messages received /** @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_XML_IGNORENS); // ignore xmlns bindings in XML ~~~ */ #define SOAP_XML_IGNORENS 0x00004000 /// `::soap_mode` XML output flag value to send XML messages with XML default namespaces for elements instead of namespace-qualified elements /** @warning This mode is not recommended for SOAP RPC encoding style messaging. Optionally use this mode with XML, XML REST, and SOAP/XML document/literal style messages. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_XML_DEFAULTNS); // use XML default namespaces with xmlns="..." ~~~ This flag changes the following example XML fragment:
~~~{.xml} y z ~~~
into the following fragment with default namespaces for XML elements:
~~~{.xml} y z ~~~
Qualified XML element names are replaced by unqualified element names. Qualified XML attribute names are not affected and require a prefix with an XML namespace binding. The `#SOAP_XML_DEFAULTNS` mode flag affects serialization performance somewhat negatively. To produce normalized cleaner XML use the `#SOAP_XML_CANONICAL` mode flag, but this further negatively affects serialization performance. @see `#WITH_NOEMPTYNAMESPACES`, `#SOAP_XML_CANONICAL`. */ #define SOAP_XML_DEFAULTNS 0x00008000 /// `::soap_mode` XML output flag value to send XML messages in exclusive canonical format as per W3C XML C14N standards, use with the `::soap::c14ninclude` and `::soap::c14nexclude` strings to control the prefixes that are subject to canonicalization by including or excluding specific prefixes /** @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_XML_CANONICAL); // XML canonicalization, exclusive by default soap->c14ninclude = "*"; // optional: make all prefixes inclusive, i.e. inclusive canonicalization ~~~ This flag changes the following example XML fragment:
~~~{.xml} ~~~
into the following exclusive C14N fragment:
~~~{.xml} ~~~
Sending XML is slowed down by canonicalization. Furthermore, messages may or may not be reduced in size, depending on the additional `xmlns` bindings generated for local element scopes. Consider for example the following message:
~~~{.xml} 1 2 3 ~~~
The message is larger when canonicalized:
~~~{.xml} 1 2 3 ~~~
@note Because the W3C XML C14N (canonicalization) standards do not cover QName values, inclusive and exclusive C14N appear to be broken when QNames are used. XML C14N retains xmlns bindings of utilized elements and attributes only, which means that xmlns bindings for prefixes in QNames may be lost in the canonicalization process. The gSOAP toolkit implements XML C14N with QName normalization to prevent this loss. Losing xmlns bindings for QName prefixes not only invalidates XML messages, but may also lead to incorrectly bound prefixes to xmlns bindings used in the outer scope of the canonicalized XML. This poses a security threat when malicious xmlns bindings are placed in the outer scope to capture unbound QName prefix bindings. The `#SOAP_XML_CANONICAL_NA` mode flag omits QName canonicalization. @par Example:
~~~{.xml} ~~~
This example XML fragment is canonicalized with `#SOAP_XML_CANONICAL` as:
~~~{.xml} ~~~
The example XML fragment is canonicalized with `#SOAP_XML_CANONICAL | #SOAP_XML_CANONICAL_NA` as per W3C XML exclusive C14N as:
~~~{.xml} ~~~
Note that prefix `a` in `"a:Bar"` is now bound to `"http://www.w3.org"` captured by the outer `xmlns:a="http://www.w3.org"`. XML libraries may rename prefixes to prevent capturing. The gSOAP serializers do not reuse prefixes, meaning that this problem cannot occur. However, this does not prevent the namespace prefix to become lost when exclusive C14N is used and namespace bindings are removed because prefixes are not visibly utilized. @see `#SOAP_XML_CANONICAL_NA`. */ #define SOAP_XML_CANONICAL 0x00010000 /// `::soap_mode` XML output flag value to send XML messages in exclusive canonical format as per W3C XML C14N standards, use with the `::soap::c14ninclude` and `::soap::c14nexclude` strings to control the prefixes that are subject to canonicalization by including or excluding specific prefixes /** Must be used in combination with `#SOAP_XML_CANONICAL_NA` to emit XML in canonical form such that namespace prefixes in QName values are ignored. Recommended is to only use `#SOAP_XML_CANONICAL` which is more secure, see the `#SOAP_XML_CANONICAL` notes. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_XML_CANONICAL | SOAP_XML_CANONICAL_NA); soap->c14ninclude = "*"; // make all prefixes inclusive, i.e. inclusive canonicalization ~~~ @see `#SOAP_XML_CANONICAL`. */ #define SOAP_XML_CANONICAL_NA 0x00800000 /// `::soap_mode` XML input/output flag value to serialize C/C++ data structures as XML trees without id-href or id-ref multi-references, duplicates co-referenced data in the XML output and automatically breaks data structure cycles to prevent infinite serialization loops, ignores id and href/ref reference attributes in messages received, this flag is the opposite of `#SOAP_XML_GRAPH` /** @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_XML_TREE); // no id-href and id-ref multi-reference serialization ~~~ @note This mode flag is always active when the engine is compiled with `#WITH_NOIDREF`. @see `#SOAP_XML_GRAPH`, `#WITH_NOIDREF`. */ #define SOAP_XML_TREE 0x00020000 /// `::soap_mode` XML input/output flag value to serialize C/C++ (cyclic) data structures in XML with id-ref references for co-referenced data and to accurately serialize data structure cycles, accept id-ref references in XML received to (re)construct the C/C++ (co-referenced and cyclic) data structures, this flag is the opposite of `#SOAP_XML_TREE` /** @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_XML_GRAPH); // id-ref multi-reference serialization ~~~ @note This mode flag is not usable when the engine is compiled with `#WITH_NOIDREF`. @see `#SOAP_XML_TREE`. */ #define SOAP_XML_GRAPH 0x00020000 /// `::soap_mode` XML output flag value to serialize C/C++ NULL pointers in XML as elements with attribute `xsi:nil="true"` /** @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_XML_NIL); // emit NULL pointers as empty elements with xsi:nil="true" ~~~ */ #define SOAP_XML_NIL 0x00040000 /// `::soap_mode` XML output flag value to serialize C/C++ data structures in XML without `xsi:type` attributes, even when this may be necessary to distinguish base from derived data types /** @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_XML_NOTYPE); // no xsi:type attributes ever ~~~ */ #define SOAP_XML_NOTYPE 0x00080000 /// `::soap_mode` XML input/output flag value to enable DOM node tree construction of the XML received and sent, requires compile-time flag `#WITH_DOM` /** @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_XML_DOM); ... // call an XML service operation that deserializes the response if (soap->dom) // we also got a DOM { const struct soap_dom_element *elt = soap->dom; ... // inspect the DOM using the DOM API functions (see the gSOAP [XML DOM API documentation](../../dom/html/index.html)) } ~~~ */ #define SOAP_XML_DOM 0x10000000 /// `::soap_mode` DOM output flag value to disable reformatting of the DOM node tree in XML, displaying the DOM in XML exactly as is /** @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_DOM_ASIS); soap_dom_element *dom = soap_new_xsd__anyType(soap); // allocate dom if ((soap->recvfd = open("doc1.xml", O_RDONLY)) == 0 || soap_read_xsd__anyType(soap, dom)) ... // an error occurred if ((soap->sendfd = open("doc2.xml", O_CREAT | O_RDWR, 0644)) == 0 || soap_write_xsd__anyType(soap, dom)) ... // an error occurred close(soap->recvfd); soap->recvfd = 0; close(soap->sendfd); soap->sendfd = 1; ~~~ This example requires the soapC.cpp source code generated with soapcpp2 from `gsoap/import/dom.h` as (imported) input in order to use `soap_new_xsd__anyType` and `soap_write_xsd__anyType`. @see `#SOAP_DOM_NODE`, `#SOAP_DOM_TREE` and the gSOAP [XML DOM API documentation](../../dom/html/index.html). */ #define SOAP_DOM_ASIS 0x00400000 /// `::soap_mode` DOM input flag value to always attempt to deserialize embedded serializable C/C++ data structures into the DOM node tree based on matching element name to C/C++ type names and by matching `xsi:type` attributes when present, the opposite of `#SOAP_DOM_TREE` /** @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_DOM_NODE); soap_dom_element *dom = soap_new_xsd__anyType(soap); // allocate dom soap_dom_element *elt = soap_new_xsd__anyType(soap); // allocate child element int num = 123; soap_elt(dom, NULL, "data"); // create element soap_elt_node(elt, (void*)&num, SOAP_TYPE_int)); // with value 123 serialized as child soap_add_elt(dom, elt); if (soap_write_xsd__anyType(soap, dom)) ... // error, could not write ~~~ This example requires the soapC.cpp source code generated with soapcpp2 from `gsoap/import/dom.h` as (imported) input in order to use `soap_new_xsd__anyType` and `soap_write_xsd__anyType`. @see `#SOAP_DOM_ASIS`, `#SOAP_DOM_TREE` and the gSOAP [XML DOM API documentation](../../dom/html/index.html). */ #define SOAP_DOM_NODE 0x00200000 /// `::soap_mode` DOM input flag value to ignore `id` and `xsi:type` XML attributes and disables deserialization of serializable C/C++ data structures into the DOM node tree, the opposite of `#SOAP_DOM_NODE` /** @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_DOM_TREE); soap_dom_element *dom = soap_new_xsd__anyType(soap); // allocate dom if ((soap->recvfd = open("doc.xml", O_RDONLY)) == 0 || soap_read_xsd__anyType(soap, dom)) ... // an error occurred close(soap->recvfd); soap->recvfd = 0; ~~~ This example requires the soapC.cpp source code generated with soapcpp2 from `gsoap/import/dom.h` as (imported) input in order to use `soap_new_xsd__anyType`, `soap_read_xsd__anyType` and `soap_write_xsd__anyType`. @see `#SOAP_DOM_ASIS`, `#SOAP_DOM_NODE` and the gSOAP [XML DOM API documentation](../../dom/html/index.html). */ #define SOAP_DOM_TREE 0x00100000 /// `::soap_mode` C-related input flag value to ignore array items that are out of bounds when deserializing fixed-size arrays, instead of producing `#SOAP_IOB` errors /** @par Example: ~~~{.cpp} struct ns__webmethodResponse { float coordinates[3]; }; int ns__webmethod(float x, struct ns__webmethodResponse *out); ~~~ ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_C_NOIOB); struct ns__webmethodResponse result; ... // if (soap_call_ns__webmethod(soap, 3, &result)) ... // deserializing more than 3 array items does not produce a SOAP_IOB error here ~~~ */ #define SOAP_C_NOIOB 0x01000000 /// `::soap_mode` C-related input/output flag value to serialize and deserialize 8-bit C/C++ strings containing UTF-8 encoded wide characters /** @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_C_UTFSTRING); ~~~ */ #define SOAP_C_UTFSTRING 0x02000000 /// `::soap_mode` C-related input/output flag value to serialize and deserialize 8-bit multibyte C/C++ strings using `mbtowc` and `wctomb` #define SOAP_C_MBSTRING 0x04000000 /// `::soap_mode` C-related input/output flag value to serialize empty strings as elements with attribute `xsi:nil="true"` /** @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_C_NILSTRING); // elements with empty strings have `xsi:nil="true"` ~~~ */ #define SOAP_C_NILSTRING 0x08000000 /// `::soap_mode` MIME input flag value to check and process additional MIME attachments (for internal use only) /** Used by `::soap_post_check_mime_attachments` and `::soap_check_mime_attachments`. */ #define SOAP_MIME_POSTCHECK 0x40000000 /// `::soap_mode` SEC output flag value to add wsu:Id attributes to signed parts of messages sent and signed with WS-Security (for internal use only) #define SOAP_SEC_WSUID 0x80000000 /** @} */ /** \defgroup group_errors SOAP_MACRO run-time error codes @brief This module defines the `SOAP_MACRO` run-time `::soap_status` error codes returned by functions and stored in `::soap::error` @{ */ /// Status and error codes are int values, a zero value or `#SOAP_OK` (0) means no error, nonzero means error /** The `#SOAP_OK` (zero) and nonzero error codes are returned by functions and are also stored in `::soap::error` (`::soap::errnum` stores the value of errno for system-related errors). A nonzero error code is one of the following error codes or a HTTP error code between 100 and 599 returned by the server when a client connects: `#SOAP_CLI_FAULT` `#SOAP_DATAENCODINGUNKNOWN` `#SOAP_DEL_METHOD` `#SOAP_DIME_END` `#SOAP_DIME_ERROR` `#SOAP_DIME_HREF` `#SOAP_DIME_MISMATCH` `#SOAP_DUPLICATE_ID` `#SOAP_EMPTY` `#SOAP_END_TAG` `#SOAP_EOF` (same as EOF) `#SOAP_EOM` `#SOAP_ERR` (same as EOF) `#SOAP_FAULT` `#SOAP_FD_EXCEEDED` `#SOAP_FIXED` `#SOAP_GET_METHOD` `#SOAP_HDR` `#SOAP_HREF` `#SOAP_HTTP_ERROR` `#SOAP_HTTP_METHOD` `#SOAP_IOB` `#SOAP_LENGTH` `#SOAP_LEVEL` `#SOAP_MIME_END` `#SOAP_MIME_ERROR` `#SOAP_MIME_HREF` `#SOAP_MISSING_ID` `#SOAP_MOE` `#SOAP_MUSTUNDERSTAND` `#SOAP_NAMESPACE` `#SOAP_NO_DATA` `#SOAP_NO_METHOD` `#SOAP_NO_TAG` `#SOAP_NTLM_ERROR` `#SOAP_NULL` `#SOAP_OCCURS` `#SOAP_PATCH_METHOD` `#SOAP_PATTERN` `#SOAP_PLUGIN_ERROR` `#SOAP_PROHIBITED` `#SOAP_PUT_METHOD` `#SOAP_REQUIRED` `#SOAP_SSL_ERROR` `#SOAP_SVR_FAULT` `#SOAP_SYNTAX_ERROR` `#SOAP_TAG_MISMATCH` `#SOAP_TCP_ERROR` `#SOAP_TYPE` `#SOAP_UDP_ERROR` `#SOAP_USER_ERROR` `#SOAP_UTF_ERROR` `#SOAP_VERSIONMISMATCH` `#SOAP_ZLIB_ERROR` @see `::soap::error`, `::soap_xml_error_check`, `::soap_soap_error_check`, `::soap_http_error_check`, `::soap_dime_error_check`, `::soap_mime_error_check`, `::soap_tcp_error_check`, `::soap_udp_error_check`, `::soap_ssl_error_check`, `soap_zlib_error_check`. */ typedef int soap_status; /// The `::soap_status` code for no error (zero) #define SOAP_OK /// A `::soap_status` error code: the service returned a SOAP 1.1 client fault / SOAP 1.2 sender fault to the client /** The `::soap::fault` is non-NULL and points to a `::SOAP_ENV__Fault` structure. Use `::soap_fault_string`, `::soap_fault_subcode` and `::soap_fault_detail` to extract the SOAP Fault string/reason, subcode and the detail XML string (when non-NULL). @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); ... // call a Web service here if (soap->error == SOAP_CLI_FAULT) { // The server responded with a SOAP 1.1 client fault / SOAP 1.2 sender fault const char *s = soap_fault_string(soap); const char *d = soap_fault_detail(soap); printf("Client fault: %s detail: %s\n", s, d ? d : "(none)"); } ~~~ This error code is also caught by `::soap_soap_error_check`. */ #define SOAP_CLI_FAULT /// A `::soap_status` error code: SOAP 1.2 DataEncodingUnknown fault (unused in practice) /** This error code is also caught by `::soap_soap_error_check`. */ #define SOAP_DATAENCODINGUNKNOWN /// A `::soap_status` error code: DIME formatting error or DIME attachment size exceeds `#SOAP_MAXDIMESIZE` /** This error code is also caught by `::soap_dime_error_check`. */ #define SOAP_DIME_ERROR /// A `::soap_status` error code: DIME attachment has no href from SOAP body and no DIME callbacks were defined to save the attachment /** This error code is also caught by `::soap_dime_error_check`. */ #define SOAP_DIME_HREF /// A `::soap_status` error code: DIME version error /** This error code is also caught by `::soap_dime_error_check`. */ #define SOAP_DIME_MISMATCH /// A `::soap_status` error code: end of DIME attachments protocol error /** This error code is also caught by `::soap_dime_error_check`. */ #define SOAP_DIME_END /// A `::soap_status` error code: XML element has duplicate id attribute value (applicable to SOAP multi-ref encoding and `#SOAP_XML_GRAPH` serialization) /** This error code is also caught by `::soap_xml_error_check`. */ #define SOAP_DUPLICATE_ID /// A `::soap_status` error code: XML element or attribute is empty when a value is required /** This error code is also caught by `::soap_xml_error_check`. */ #define SOAP_EMPTY /// A `::soap_status` error code: XML ending tag found when none was expected /** This error code is also caught by `::soap_xml_error_check`. */ #define SOAP_END_TAG /// A `::soap_status` error code: unexpected end of file, no input, transmission interrupted or timed out (same value as EOF) /** The `#SOAP_EOF` error indicates a transmission error. Use `::soap::errnum` to determine the source of the error, which is set to the value of `errno` of the failure when the error occurred. When a transmission timeout occurred, because `::soap::recv_timeout` and/or `::soap::send_timeout` are nonzero, the value of `::soap::errnum` was set to zero to distinguish timeouts from errors. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); ... // call a Web service here if (soap->error == SOAP_EOF) { if (soap->errnum) printf("A transmission error occurred: %s\n", strerror_r(soap->errnum, soap->msgbuf, sizeof(soap->msgbuf))); else printf("A transmission timeout occurred\n"); } ~~~ This error code is also caught by `::soap_tcp_error_check` and by `::soap_udp_error_check`. */ #define SOAP_EOF /// A `::soap_status` error code: out of memory /** This error indicates that a dynamic memory allocation request failed. The engine does not raise C++ exceptions when allocating memory for objects, but `#SOAP_EOM` is returned (from a function) instead and `::soap::error` is set to `#SOAP_EOM`. It is possible to enable C++ exceptions without detrimental effects by compiling the source code with `#SOAP_NOTHROW` set to an empty value and in that case C++ exception handlers should be used to catch `std::bad_alloc`. */ #define SOAP_EOM /// A `::soap_status` error code: an unspecified error occurred #define SOAP_ERR /// A `::soap_status` error code: the fault code to be returned by a service operation when calling `::soap_sender_fault` (client is at fault) or `::soap_receiver_fault` (server is at fault), and when received, clients set the `::soap::error` code to `#SOAP_CLI_FAULT` or `#SOAP_SVR_FAULT` respectively /** This error code is also caught by `::soap_soap_error_check`. */ #define SOAP_FAULT /// A `::soap_status` error code: too many open sockets #define SOAP_FD_EXCEEDED /// A `::soap_status` error code: XML element or attribute value is fixed and the parsed value does not match the fixed value /** This error code is also caught by `::soap_xml_error_check`. */ #define SOAP_FIXED /// A `::soap_status` error code: an HTTP GET request was received by the service but the GET request callback `::soap::fget` is not implemented /** This error code is also caught by `::soap_http_error_check`. @see `::soap::fget`. */ #define SOAP_GET_METHOD /// A `::soap_status` error code: an HTTP PUT request was received by the service but the PUT request callback `::soap::fput` is not implemented /** This error code is also caught by `::soap_http_error_check`. @see `::soap::fput`. */ #define SOAP_PUT_METHOD /// A `::soap_status` error code: an HTTP PATCH request was received by the service but the PATCH request callback `::soap::fpatch` is not implemented /** This error code is also caught by `::soap_http_error_check`. @see `::soap::fpatch`. */ #define SOAP_PATCH_METHOD /// A `::soap_status` error code: an HTTP DELETE request was received by the service but the DELETE request callback `::soap::fdel` is not implemented /** This error code is also caught by `::soap_http_error_check`. @see `::soap::fdel`. */ #define SOAP_DEL_METHOD /// A `::soap_status` error code: an HTTP request was received by the service that cannot be handled. #define SOAP_HTTP_METHOD /// A `::soap_status` error code: HTTP header line is too long, exceeding `#SOAP_HDRLEN` size #define SOAP_HDR /// A `::soap_status` error code: reference to object in XML identified by its id attribute is incompatible with the object refered to by the ref or href attribute (applicable to SOAP multi-ref encoding and `#SOAP_XML_GRAPH` serialization) /** This error code is also caught by `::soap_xml_error_check`. */ #define SOAP_HREF /// A `::soap_status` error code: an unspecified HTTP error occured /** This error code is also caught by `::soap_http_error_check`. */ #define SOAP_HTTP_ERROR /// A `::soap_status` error code: SOAP array index out of bounds /** This error code is also caught by `::soap_xml_error_check`. */ #define SOAP_IOB /// A `::soap_status` error code: XML element or attribute value length validation error or `#SOAP_MAXLENGTH` exceeded /** This error code is also caught by `::soap_xml_error_check`. */ #define SOAP_LENGTH /// A `::soap_status` error code: XML nesting depth level when parsing XML exceeds `#SOAP_MAXLEVEL` /** This error code is also caught by `::soap_xml_error_check`. */ #define SOAP_LEVEL /// A `::soap_status` error code: end of MIME/MTOM attachments protocol error /** This error code is also caught by `::soap_mime_error_check`. */ #define SOAP_MIME_END /// A `::soap_status` error code: MIME/MTOM attachment parsing error /** This error code is also caught by `::soap_mime_error_check`. */ #define SOAP_MIME_ERROR /// A `::soap_status` error code: MIME/MTOM attachment has no href from SOAP body and no MIME callbacks were defined to save the attachment /** This error code is also caught by `::soap_mime_error_check`. */ #define SOAP_MIME_HREF /// A `::soap_status` error code: an XML element with id attribute is missing that should match the element with href/ref attribute (applicable to SOAP multi-ref encoding and `#SOAP_XML_GRAPH` serialization) /** This error code is also caught by `::soap_xml_error_check`. */ #define SOAP_MISSING_ID /// A `::soap_status` error code: memory overflow or memory corruption error (applicable in `#DEBUG` mode only) #define SOAP_MOE /// A `::soap_status` error code: an XML element is present with a mustUnderstand attribute which must be understood but is not deserialized /** This error code is also caught by `::soap_soap_error_check`. */ #define SOAP_MUSTUNDERSTAND /// A `::soap_status` error code: XML namespace name mismatch validation error /** This error code is also caught by `::soap_xml_error_check`. */ #define SOAP_NAMESPACE /// A `::soap_status` error code: no data in the HTTP body of the message received #define SOAP_NO_DATA /// A `::soap_status` error code: the service request dispatcher did not find a matching service operation for a service request /** This error code is also caught by `::soap_soap_error_check`. */ #define SOAP_NO_METHOD /// A `::soap_status` error code: no XML element tag was found when one was expected /** This error code is also caught by `::soap_xml_error_check`. */ #define SOAP_NO_TAG /// A `::soap_status` error code: an NTLM authentication handshake error occured #define SOAP_NTLM_ERROR /// A `::soap_status` error code: XML element has an `xsi:nil` attribute when the element is not nillable, causing a validation error /** This error code is also caught by `::soap_xml_error_check`. */ #define SOAP_NULL /// A `::soap_status` error code: XML element has a minOccurs or maxOccurs constraint validation error or `#SOAP_MAXOCCURS` was exceeded /** This error code is also caught by `::soap_xml_error_check`. */ #define SOAP_OCCURS /// A `::soap_status` error code: XML element or attribute value pattern mismatch causes a validation error /** This error code is also caught by `::soap_xml_error_check`. */ #define SOAP_PATTERN /// A `::soap_status` error code: failed to register plugin #define SOAP_PLUGIN_ERROR /// A `::soap_status` error code: attribute is prohibited but present /** This error code is also caught by `::soap_xml_error_check`. */ #define SOAP_PROHIBITED /// A `::soap_status` error code: an HTTP PUT request was received by the service but the PUT request callback `::soap::fput` is not implemented /** This error code is also caught by `::soap_http_error_check`. */ #define SOAP_PUT_METHOD /// A `::soap_status` error code: attribute is required but not present /** This error code is also caught by `::soap_xml_error_check`. */ #define SOAP_REQUIRED /// A `::soap_status` error code: an SSL error occured /** This error code is also caught by `::soap_ssl_error_check`. */ #define SOAP_SSL_ERROR /// A `::soap_status` error code: service returned a SOAP 1.1 server fault / SOAP 1.2 receiver fault to the client /** The `::soap::fault` is non-NULL and points to a `::SOAP_ENV__Fault` structure. Use `::soap_fault_string`, `::soap_fault_subcode` and `::soap_fault_detail` to extract the SOAP Fault string/reason, subcode and the detail XML string (when non-NULL). @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); ... // call a Web service here if (soap->error == SOAP_SVR_FAULT) { // The server responded with a SOAP 1.1 server fault / SOAP 1.2 receiver fault const char *s = soap_fault_string(soap); const char *d = soap_fault_detail(soap); printf("Server fault: %s detail: %s\n", s, d ? d : "(none)"); } ~~~ This error code is also caught by `::soap_soap_error_check`. */ #define SOAP_SVR_FAULT /// A `::soap_status` error code: an XML syntax error occurred while parsing the input /** This error code is also caught by `::soap_xml_error_check`. */ #define SOAP_SYNTAX_ERROR /// A `::soap_status` error code: XML element tag parsed does not match anything that is expected /** This error code is also caught by `::soap_xml_error_check`. */ #define SOAP_TAG_MISMATCH /// A `::soap_status` error code: a TCP/IP connection error occured /** This error code is also caught by `::soap_tcp_error_check`. */ #define SOAP_TCP_ERROR /// A `::soap_status` error code: XML element or attribute has a mismatching type or value that is causing a validation error /** This error code is also caught by `::soap_xml_error_check`. */ #define SOAP_TYPE /// A `::soap_status` error code: a UDP/IP connection error occured or the message too large to store in a UDP packet /** This error code is also caught by `::soap_udp_error_check`. */ #define SOAP_UDP_ERROR /// A `::soap_status` error code: soap::user not set to non-NULL #define SOAP_USER_ERROR /// A `::soap_status` error code: a UTF-8 decoding error occured /** This error code is also caught by `::soap_xml_error_check`. */ #define SOAP_UTF_ERROR /// A `::soap_status` error code: SOAP version mismatch or no SOAP message is received /** This error code is also caught by `::soap_soap_error_check`. */ #define SOAP_VERSIONMISMATCH /// A `::soap_status` error code: a zlib error occured /** This error code is also caught by `::soap_zlib_error_check`. */ #define SOAP_ZLIB_ERROR /// Check for XML parsing and validation errors, returns true if the specified error code is an XML error #define soap_xml_error_check(e) \ ((e) == SOAP_TAG_MISMATCH || \ (e) == SOAP_NO_TAG || \ (e) == SOAP_IOB || \ (e) == SOAP_SYNTAX_ERROR || \ (e) == SOAP_NAMESPACE || \ (e) == SOAP_TYPE || \ (e) == SOAP_DUPLICATE_ID || \ (e) == SOAP_MISSING_ID || \ (e) == SOAP_REQUIRED || \ (e) == SOAP_PROHIBITED || \ (e) == SOAP_OCCURS || \ (e) == SOAP_LENGTH || \ (e) == SOAP_LEVEL || \ (e) == SOAP_PATTERN || \ (e) == SOAP_NULL || \ (e) == SOAP_HREF || \ (e) == SOAP_FIXED || \ (e) == SOAP_EMPTY || \ (e) == SOAP_END_TAG || \ (e) == SOAP_UTF_ERROR) /// Check for SOAP protocol faults and errors, returns true if the specified error code is a SOAP protocol error #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 || \ (e) == SOAP_DATAENCODINGUNKNOWN) /// Check for HTTP protocol errors, returns true if the specified error code is an HTTP protocol error or an HTTP status code between 100 and 599 returned by an HTTP server, but note that HTTP status 100 to 202 should not be considered errors but informative codes #define soap_http_error_check(e) \ ((e) == SOAP_HTTP_ERROR || \ (e) == SOAP_NO_DATA || \ ((e) >= SOAP_GET_METHOD && (e) <= SOAP_HTTP_METHOD) || \ ((e) >= 100 && (e) < 600)) /// Check for DIME protocol errors, returns true if the specified `::soap_status` error code is a DIME protocol error #define soap_dime_error_check(e) \ ((e) == SOAP_DIME_ERROR || \ (e) == SOAP_DIME_HREF || \ (e) == SOAP_DIME_MISMATCH || \ (e) == SOAP_DIME_END) /// Check for MIME/MTOM protocol errors, returns true if the specified `::soap_status` error code is a MIME/MTOM protocol error #define soap_mime_error_check(e) \ ((e) == SOAP_MIME_ERROR || \ (e) == SOAP_MIME_HREF || \ (e) == SOAP_MIME_END) /// Check for TCP protocol errors, returns true if the specified error code is a TCP error, when true use `::soap::errnum` to retrieve the `errno` value of the failure to determine the cause #define soap_tcp_error_check(e) ((e) == SOAP_EOF || (e) == SOAP_TCP_ERROR) /// Check for UDP protocol errors, returns true if the specified error code is a UDP error, when true use `::soap::errnum` to retrieve the `errno` value of the failure to determine the cause #define soap_udp_error_check(e) ((e) == SOAP_EOF || (e) == SOAP_UDP_ERROR) /// Check for SSL/TLS protocol errors, returns true if the specified error code is a SSL/TLS error, when true use `::soap::errnum` to retrieve the `errno` value of the failure to determine the cause #define soap_ssl_error_check(e) ((e) == SOAP_SSL_ERROR) /// Check for zlib library errors, returns true if the specified error code is a zlib error #define soap_zlib_error_check(e) ((e) == SOAP_ZLIB_ERROR) /// An internal `::soap_status` error code to signal that an HTTP response must not be produced #define SOAP_STOP /// An internal `::soap_status` error code to signal that an HTTP form is present and no HTTP response must be produced #define SOAP_FORM /// A special `::soap_status` error code to signal that a custom HTTP response is present and no HTTP response must be produced /** @ingroup group_io This code is used with `::soap_response` to return a HTML response message with a HTTP content type "text/html". */ #define SOAP_HTML /// A special `::soap_status` error code to signal that a custom file-based HTTP response is present and no HTTP response must be produced /** @ingroup group_io This code is used with `::soap_response` to return a file-based response message with a HTTP content type specified by the `::soap::http_content` string variable. The `::soap_response` function normally returns HTTP 200 OK, but the HTTP status code can be specified as `#SOAP_FILE + status` where `status` is a HTTP status code between 200 and 599. */ #define SOAP_FILE /** @} */ /** \defgroup group_context Context with engine state @brief This module defines the `::soap` context structure with the engine state and functions to allocate, initialize, copy and delete contexts @{ */ /// Context with the engine state /** The `::soap` context should be passed as the first parameter to all gSOAP functions and should only be used by a single thread at a time. Each thread should use a copy of the context created with `::soap_copy` or with the `::soap::soap` copy constructor. To allocate a new `::soap` context, use one of these three allocators that take `::soap_mode` parameters: ~~~{.cpp} struct soap *soap1 = soap_new(); struct soap *soap2 = soap_new1(input_and_output_mode); struct soap *soap3 = soap_new2(input_mode, output_mode); ~~~ Alternatively, use contructors in C++ as follows: ~~~{.cpp} struct soap *soap1(); struct soap *soap2(input_and_output_mode); struct soap *soap3(input_mode, output_mode); ~~~ To copy the `::soap` context, for example to be used by another thread, use: ~~~{.cpp} struct soap *soap2 = soap_copy(soap1); ~~~ Alternatively, use the copy constructor in C++ as follows: ~~~{.cpp} struct soap *soap2 = new soap(soap1); ~~~ To free the `::soap` context or a copy of a `::soap` context, use: ~~~{.cpp} soap_free(soap1); ~~~ To stack-allocate a `::soap` context (i.e. as opposed to heap-allocating it as shown above), initialize the `::soap` context with one of these three initializers that take `::soap_mode` parameters: ~~~{.cpp} struct soap soap1, soap2, soap3; soap_init(&soap1); soap_init1(&soap2, input_and_output_mode); soap_init2(&soap3, input_mode, output_mode); ~~~ Alternatively, use contructors in C++: ~~~{.cpp} struct soap soap1(); struct soap soap2(input_and_output_mode); struct soap soap3(input_mode, output_mode); ~~~ Finalization of the `::soap` context is automatically done by the C++ destructor. In C, you should finalize a stack-allocated `::soap` context before it is reclaimed by the stack: ~~~{.cpp} soap_done(&soap1); ~~~ Before freeing or finalizating a `::soap` context, you may want to delete all data allocated in managed heap memory with these two calls in this specific order: ~~~{.cpp} soap_destroy(soap1); soap_end(soap1); ~~~ Alternatively, in C++ you can simply invoke one method to perform both calls at once: ~~~{.cpp} soap1.destroy(); ~~~ */ struct soap { /// Construct a `::soap` context (C++ only, in C use `::soap_new` or `::soap_init`) soap(); /// Construct a `::soap` context with the specified input and output `::soap_mode` flags (C++ only, in C use `::soap_new1` or `::soap_init1`)) soap(soap_mode input_and_output_mode) ///< input and output `::soap_mode` flags ; /// Construct a `::soap` context with the specified input and output `::soap_mode` flags (C++ only, in C use `::soap_new2` or `::soap_init2`)) soap( soap_mode input_mode, ///< input `::soap_mode` flags soap_mode output_mode) ///< output `::soap_mode` flags ; /// Copy constructor (C++ only, in C use `::soap_copy` or `::soap_copy_context`) soap(const struct soap &) ///< the `::soap` context to copy ; /// Assignment constructor (C++ only, in C use `::soap_copy` or `::soap_copy_context`) struct soap& operator=(const struct soap &) ///< the `::soap` context to copy /// @returns this `::soap` context ; /// Delete all dynamically-allocated objects and data managed by this `::soap` context (C++ only, in C use `::soap_end`) void destroy(); /// Finalize and delete the `::soap` context by finalizing with soap_done(this) (C++ only, in C use `::soap_free` or `::soap_done`) ~soap(); /// The `::soap` context input `::soap_mode` flags that are set at context initialization and set or cleared with `::soap_set_imode` or `::soap_clr_imode`, respectively /** @see `::soap::omode`, `::soap_set_omode`, `::soap_set_mode`, `::soap_clr_omode`, `::soap_clr_mode`. */ soap_mode imode; /// The `::soap` context output `::soap_mode` flags that are set at context initialization and set or cleared with `::soap_set_omode` or `::soap_clr_omode`, respectively /** @see `::soap::imode`, `::soap_set_omode`, `::soap_set_mode`, `::soap_clr_omode`, `::soap_clr_mode`. */ soap_mode omode; /// OpenSSL context pointer /** This pointer is non-NULL after calling `::soap_ssl_server_context` or `::soap_ssl_client_context` and points to the OpenSSL context which can be configured with OpenSSL API functions such as `SSL_CTX_set_cipher_list`. @note Requires compilation with `#WITH_OPENSSL`. @see `::soap_ssl_server_context`, `::soap_ssl_client_context`. */ SSL_CTX *ctx; /// SOAP version (0 = no SOAP, 1 = SOAP 1.1, 2 = SOAP 1.2) /** The SOAP version is determined from the SOAP or XML message received. The version is automatically set before sending messages when SOAP 1.1 or SOAP 1.2 namespaces are defined in the `::Namespace` table or when SOAP namespaces are omitted from the table. The version can be explicitly set or overruled by calling `::soap_set_version`. @see `::soap::encodingStyle`, `::soap_set_version`. */ short version; /// User-definable `SOAP-ENV:encodingStyle` URI value /** This URI string value is pre-defined by the engine depending on the SOAP protocol version used, setting this to NULL means no SOAP encodingStyle, setting this to "" means that the engine will set the encodingStyle URI according to the SOAP version used. @see `::soap::version`, `::soap_set_version`. */ const char *encodingStyle; /// User-definable `SOAP-ENV:actor` (SOAP 1.1) or `SOAP-ENV:role` (SOAP 1.2) attribute value of all `SOAP-ENV:mustUnderstand` attributed header elements /** @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); ... // context initializations // add a SOAP Header to the message SOAP_ENV__Header header; header->ns__required_value = 123; // a header element marked mustUnderstand soap->header = &header; // add SOAP-ENV:role="http://www.w3.org/2002/06/soap-envelope/role/next"; soap->actor = "http://www.w3.org/2002/06/soap-envelope/role/next"; if (soap_call_ns__webmethod(soap, endpoint, NULL, ...)) soap_print_fault(soap, stderr); else ... // success soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~ @see `::SOAP_ENV__Header`. */ const char *actor; /// User-definable `xml:lang` attribute value of `SOAP-ENV:Text` to output the SOAP Fault string/reason (the value is `en` by default) /** @see `::SOAP_ENV__Reason`. */ const char *lang; /// User-definable maximum number of keep-alive message exchanges per connection (the value is `#SOAP_MAXKEEPALIVE` by default) /** @par Example: ~~~{.cpp} struct soap *soap = soap_new1(SOAP_IO_KEEPALIVE); // enable HTTP keep-alive soap->max_keep_alive = 50; // 50 max keep-alive exchanges (SOAP_MAXKEEPALIVE by default) ~~~ @see `#SOAP_IO_KEEPALIVE`, `::soap_serve`, `::soap::keep_alive`. */ int max_keep_alive; /// HTTP keep-alive flag (try to enable when -1, disabled when 0) and counter (enabled when >0) /** @see `#SOAP_IO_KEEPALIVE`, `::soap_serve`, `::soap_closesock`, `::soap::max_keep_alive`. */ int keep_alive; /// User-definable string to control the XML namespace prefixes that are subject to XML canonicalization with the `#SOAP_XML_CANONICAL` output mode flag, specified by space-separated prefixes in the string, or `*` to specify that all prefixes are inclusive, or NULL when unused const char *c14ninclude; /// User-definable string to control the XML namespace prefixes that are subject to XML canonicalization with `#SOAP_XML_CANONICAL` output mode flag, specified by space-separated prefixes in the string, or NULL when unused const char *c14nexclude; /// The `::soap` context HTTP status code received at the client side (100 to 599), HTTP header method received at the server side (`#SOAP_POST`, `#SOAP_PATCH`, `#SOAP_GET`, `#SOAP_PUT`, `#SOAP_DEL`, `#SOAP_HEAD`, `#SOAP_OPTIONS`), or the HTTP method to use for sending a message with `::soap_connect_command` or with `::soap_response` (`#SOAP_POST`, `#SOAP_POST_FILE`, `#SOAP_PATCH`, `#SOAP_GET`, `#SOAP_PUT`, `#SOAP_PUT`, `#SOAP_DEL`, `#SOAP_CONNECT`, `#SOAP_HEAD`, `#SOAP_OPTIONS`) /** @see `::soap_connect_command`, `::soap_GET`, `::soap_PUT`, `::soap_PATCH`, `::soap_POST`, `::soap_DELETE`, `::soap_response`. */ int status; /// The `::soap` context `::soap_status` (int) error code of the last operation or `#SOAP_OK` (zero) /** @see `::soap_status`, `::soap::errnum`. */ int error; /// The `errno` value of the last failed IO operation /** The `::soap::errnum` value is set to the value or `errno` when a `#SOAP_EOF` or `#SOAP_TCP_ERROR` error occurred. This allows for reporting the error condition with `::soap_print_fault`, `::soap_stream_fault`, and `::soap_sprint_fault`. For the `#SOAP_EOF` error, `::soap::errnum` is set to zero when IO operations timed out, when a client's connection attempt to a server timed out, or when a server-side `::soap_accept` timed out. @see `::soap::error`, `::soap::connect_timeout`, `::soap::accept_timeout`, `::soap::recv_timeout`, `::soap::send_timeout`. */ int errnum; /// The `::soap::header` points to a `::SOAP_ENV__Header` structure with the SOAP Header that was received or that can be populated by the user to be sent, or NULL when no SOAP Header is present /** @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); ... // context initializations // add a SOAP Header to the message SOAP_ENV__Header header; header->ns__someHeaderValue = 123; if (soap_call_ns__webmethod(soap, endpoint, NULL, ...)) { soap_print_fault(soap, stderr); } else { if (soap->header) // received a SOAP_ENV__Header? ... // yes, inspect SOAP_ENV__Header headers } soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~ @see `::SOAP_ENV__Header`, `::soap::actor`. */ struct SOAP_ENV__Header *header; /// The `::soap::fault` points to a `::SOAP_ENV__Fault` structure with the SOAP Fault that was received or that can be populated by the user to be sent, or NULL when no SOAP Fault is present struct SOAP_ENV__Fault *fault; /// User-definable variable that may point to user-specified data to pass the data through callbacks and plugins to the user's code void *user; /// The `::soap::mustUnderstand` flag is set when a SOAP Header element carries a `SOAP-ENV:mustUnderstand` attribute that is true short mustUnderstand; /// The `::soap::null` flag is set when an element carries a `xsi:nil` attribute that is true short null; /// The `::soap::body` flag is set when an element has element content during XML parsing or when a HTTP message has a body when parsing an HTTP header short body; /// User-definable XML declaration prolog (`` by default) const char *prolog; /// User-definable string that specifies the HTTP cookie domain of the running server const char *cookie_domain; /// User-definable string that specifies the HTTP cookie path of the running server const char *cookie_path; /// User-definable maximum number of active cookies allowed to be set with `::soap_set_cookie` before cookie memory is reused (the value is 32 by default) int cookie_max; /// The cookie store is a linked list of cookies struct soap_cookie *cookies; /// String with HTTP content type header value received, can also be assigned to specify a content type header when using `::soap_connect_command` with `#SOAP_POST_FILE`, `#SOAP_PUT` and `#SOAP_PATCH` or when using `::soap_response` with `#SOAP_FILE`. /** @see `::soap_connect_command`, `::soap_PUT`, `::soap_PATCH`, `::soap_POST`, `::soap_response`. */ const char *http_content; /// User-definable string that specifies an extra HTTP header or headers when separated by CRLF, to include in the next HTTP request (client side) or to include with the HTTP response (server side) /** @par Examples: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); ... // context initializations soap->http_extra_header = "X-CUSTOM-RequestMessageNumber: 1\r\nX-CUSTOM-TotalRequests: 5"; if (soap_call_ns__webmethod(soap, endpoint, NULL, ...)) soap_print_fault(soap, stderr); else ... // success soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~ ~~~{.cpp} #include "soapH.h" int main() { struct soap *soap = soap_new(); if (soap_ssl_server_context(soap, ...)) exit(EXIT_FAILURE); ... // serve requests with soap_bind, soap_accept, soap_ssl_accept, and soap_serve } int ns__webmethod(struct soap *soap, ...) { ... // process the request data and populate the response data soap->http_extra_header = "X-CUSTOM-ResponseMessageNumber: 1"; return SOAP_OK; } ~~~ @see `::soap_GET`, `::soap_PUT`, `::soap_PATCH`, `::soap_POST`, `::soap_DELETE`, `::soap::fparsehdr`. */ const char *http_extra_header; /// The socket set by `::soap_bind` (or the C++ service class `bind` method) to serve as the master socket bound to a specified port, or `#SOAP_INVALID_SOCKET` when unassigned /** @see `::soap_bind`, `::soap_valid_socket`. */ SOAP_SOCKET master; /// The socket set by `::soap_accept` (or the C++ service class `accept` method) or `::soap_connect` or `::soap_connect_command` (or the C++ proxy methods) when successful, or `#SOAP_INVALID_SOCKET` when unassigned /** @see `::soap_accept`, `::soap_connect`, `::soap_connect_command`, `::soap_valid_socket`. */ SOAP_SOCKET socket; /// The file descriptor to read data from when no socket communications are set (`::soap::socket` == `#SOAP_INVALID_SOCKET`) and `::soap:is` == NULL, default value is 0 (stdin) /** @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_DOM_TREE); struct ns__someElement data; if ((soap->recvfd = open("doc.xml", O_RDONLY)) == 0) ... // an error occurred // parse and deserialize XML into a ns__someElement structure if (soap_read_ns__someElement(soap, &data)) ... // an error occurred close(soap->recvfd); soap->recvfd = 0; ~~~ */ int recvfd; /// The file descriptor to write data to when no socket communications are set (`::soap::socket` == `#SOAP_INVALID_SOCKET`) and `::soap:os` == NULL, default value is 1 (stdout) /** @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_DOM_TREE); struct ns__someElement data; ... // populate the data if ((soap->sendfd = open("doc.xml", O_CREAT | O_RDWR, 0644)) == 0) ... // an error occurred // serialize ns__someElement structure as XML if (soap_write_ns__someElement(soap, &data)) ... // an error occurred close(soap->sendfd); soap->sendfd = 1; ~~~ */ int sendfd; /// The source to read data from when non-NULL, which in C++ is a `std::istream` object and in C is a 0-terminated string to be read, default value is NULL /** @par Examples: ~~~{.cpp} // C example #include "soapH.h" struct soap *soap = soap_new1(SOAP_DOM_TREE); struct ns__someElement data; soap->is = "example\n"; // parse and deserialize XML into a ns__someElement structure if (soap_read_ns__someElement(soap, &data)) ... // an error occurred soap->is = NULL; ~~~ ~~~{.cpp} // C++ example #include "soapH.h" struct soap *soap = soap_new1(SOAP_DOM_TREE); struct ns__someElement data; std::stringstream ss("example\n"); soap->is = &ss; // parse and deserialize XML into a ns__someElement structure if (soap_read_ns__someElement(soap, &data)) ... // an error occurred soap->is = NULL; ~~~ */ SOAP_SOURCE *is; /// The sink to write data to when non-NULL, which in C++ is a `std::ostream` object and in C is a pointer to a `char*` string variable that will be set to point to a managed 0-terminated string with the data, default value is NULL /** @par Examples: ~~~{.cpp} // C example #include "soapH.h" struct soap *soap = soap_new1(SOAP_DOM_TREE); struct ns__someElement data; char *cs = NULL; ... // populate the data soap->os = &cs; // serialize ns__someElement structure as XML if (soap_write_ns__someElement(soap, &data)) ... // an error occurred soap->os = NULL; const char *xml = cs; // string allocated and managed by the context ~~~ ~~~{.cpp} // C++ example #include "soapH.h" struct soap *soap = soap_new1(SOAP_DOM_TREE); struct ns__someElement data; ... // populate the data std::stringstream ss; soap->os = &ss; // serialize ns__someElement structure as XML if (soap_write_ns__someElement(soap, &data)) ... // an error occurred soap->os = NULL; std::string xml = ss.str(); ~~~ */ SOAP_SINK *os; /// User-definable maximum message length that is permitted to be received, zero means unlimited (the value is 2GB by default) /** @par Example: ~~~{.cpp} struct soap *soap = soap_new(); soap->send_timeout = soap_recv_timeout = 5; // 5 seconds max socket stall time (unlimited by default) soap->transfer_timeout = 30; // 30 seconds max message transfer time (unlimited by default) soap->recv_maxlength = 1048576; // limit messages received to 1MB (2GB by default) ~~~ */ ULONG64 recv_maxlength; /// User-definable timeout to send or receive an entire message, positive timeout values are seconds, negative timeout values are microseconds, zero means no timeout (the value is 0 by default) /** @par Example: ~~~{.cpp} struct soap *soap = soap_new(); soap->send_timeout = soap_recv_timeout = 5; // 5 seconds max socket stall time (unlimited by default) soap->transfer_timeout = 30; // 30 seconds max message transfer time (unlimited by default) soap->recv_maxlength = 1048576; // limit messages received to 1MB (2GB by default) ~~~ @see `::soap::error`, `::soap::errnum`, `::soap::connect_timeout`, `::soap::accept_timeout`, `::soap::recv_timeout`, `::soap::send_timeout`, `::soap::recv_maxlength`. */ int transfer_timeout; /* user-definable, when > 0, sets socket total transfer timeout in seconds, < 0 in usec */ /// User-definable timeout to receive a packet of data, positive timeout values are seconds, negative timeout values are microseconds, zero means no timeout (the value is 0 by default) /** @par Example: ~~~{.cpp} struct soap *soap = soap_new(); soap->send_timeout = soap_recv_timeout = 5; // 5 seconds max socket stall time (unlimited by default) soap->transfer_timeout = 30; // 30 seconds max message transfer time (unlimited by default) soap->recv_maxlength = 1048576; // limit messages received to 1MB (2GB by default) ~~~ @see `::soap::error`, `::soap::errnum`, `::soap::connect_timeout`, `::soap::accept_timeout`, `::soap::send_timeout`, `::soap::transfer_timeout`, `::soap::recv_maxlength`. */ int recv_timeout; /// User-definable timeout to send a packet of data, positive timeout values are seconds, negative timeout values are microseconds, zero means no timeout (the value is 0 by default) /** @par Example: ~~~{.cpp} struct soap *soap = soap_new(); soap->send_timeout = soap_recv_timeout = 5; // 5 seconds max socket stall time (unlimited by default) soap->transfer_timeout = 30; // 30 seconds max message transfer time (unlimited by default) soap->recv_maxlength = 1048576; // limit messages received to 1MB (2GB by default) ~~~ @see `::soap::error`, `::soap::errnum`, `::soap::connect_timeout`, `::soap::accept_timeout`, `::soap::recv_timeout`, `::soap::transfer_timeout`, `::soap::recv_maxlength`. */ int send_timeout; /// User-definable timeout when waiting to accept a request from a client at the server-side with `::soap_accept` (or the C++ service class `accept` method), positive timeout values are seconds, negative timeout values are microseconds, zero means no timeout (the value is 0 by default) /** @par Example: ~~~{.cpp} #include "soapH.h" int main() { struct soap *soap = soap_new(); soap->accept_timeout = 3600; // exit loop when no request arrives in one hour soap->send_timeout = soap_recv_timeout = 5; // 5 seconds max socket stall time (unlimited by default) soap->transfer_timeout = 30; // 30 seconds max message transfer time (unlimited by default) soap->recv_maxlength = 1048576; // limit messages received to 1MB (2GB by default) if (soap_valid_socket(soap_bind(soap, NULL, PORTNUM, BACKLOG))) { while (1) { if (soap_valid_socket(soap_accept(soap))) { if (soap_serve(soap)) soap_print_fault(soap, stderr); } else if (soap->errnum) // accept failed, try again after 1 second { soap_print_fault(soap, stderr); sleep(1); } else // accept timed out, quit looping { break; } soap_destroy(soap); soap_end(soap); } } soap_free(soap); } ~~~ @see `::soap::error`, `::soap::errnum`, `::soap::connect_timeout`, `::soap::recv_timeout`, `::soap::send_timeout`, `::soap::transfer_timeout`, `::soap::recv_maxlength`. */ int accept_timeout; /// User-definable timeout when waiting to connect to a server at the client-side, positive timeout values are seconds, negative timeout values are microseconds, zero means no timeout (the value is 0 by default) /** @par Example: ~~~{.cpp} #include "soapH.h" int main() { struct soap *soap = soap_new(); soap->connect_timeout = 30; // 30 seconds max connect stall time soap->connect_retry = 4; // retry 4 more times (waiting 1, 2, 4, 8 seconds between retries) soap->send_timeout = soap_recv_timeout = 5; // 5 seconds max socket stall time (unlimited by default) soap->transfer_timeout = 30; // 30 seconds max message transfer time (unlimited by default) soap->recv_maxlength = 1048576; // limit messages received to 1MB (2GB by default) if (soap_call_ns__webmethod(soap, endpoint, NULL, ...)) { soap_print_fault(soap, stderr); if (soap->errnum == 0) // timed out, exit program exit(EXIT_FAILURE); } else { ... // success } soap_destroy(soap); soap_end(soap); soap_free(soap); } ~~~ @see `::soap::error`, `::soap::errnum`, `::soap::connect_retry`, `::soap::accept_timeout`, `::soap::recv_timeout`, `::soap::send_timeout`, `::soap::transfer_timeout`, `::soap::recv_maxlength`. */ int connect_timeout; /// User-definable number of retries to attempt at the client side when connecting to a server fails with `::SOAP_TCP_ERROR`, using exponential backoff delays between reconnects, maxed at 32 seconds: 1, 2, 4, 8, 16, 32, 32, 32, ... seconds for retry values 1 to 8 respectively (the retry value is 0 by default, meaning no retry) /** @par Example: ~~~{.cpp} #include "soapH.h" int main() { struct soap *soap = soap_new(); soap->connect_timeout = 30; // 30 seconds max connect stall time soap->connect_retry = 4; // retry 4 more times (waiting 1, 2, 4, 8 seconds between retries) soap->send_timeout = soap_recv_timeout = 5; // 5 seconds max socket stall time (unlimited by default) soap->transfer_timeout = 30; // 30 seconds max message transfer time (unlimited by default) soap->recv_maxlength = 1048576; // limit messages received to 1MB (2GB by default) if (soap_call_ns__webmethod(soap, endpoint, NULL, ...)) { soap_print_fault(soap, stderr); if (soap->errnum == 0) // timed out, exit program exit(EXIT_FAILURE); } else { ... // success } soap_destroy(soap); soap_end(soap); soap_free(soap); } ~~~ @see `::soap::error`, `::soap::errnum`, `::soap::connect_timeout`, `::soap::recv_timeout`, `::soap::send_timeout`, `::soap::transfer_timeout`, `::soap::recv_maxlength`, `::SOAP_TCP_ERROR`. */ int connect_retry; /// User-definable maximum XML and JSON nesting level permitted, initially set to `#SOAP_MAXLEVEL` (the value is 10000 by default) /** @par Example: ~~~{.cpp} struct soap *soap = soap_new(); soap->maxlevel = 10; // limit XML nesting depth to 10 (10000 by default) ~~~ @see `::soap::recv_maxlength`, `::soap::maxlength`, `::soap::maxoccurs`. */ unsigned int maxlevel; /// User-definable maximum string length parsed from XML and JSON, initially set to `#SOAP_MAXLENGTH`, zero or negative means unlimited (0 by default) /** The length of a string is the number of characters it contains. Multi-byte strings with UTF-8 content (enabled with `#SOAP_C_UTFSTRING`) contain up to the specified number of multi-byte characters. The byte length depends on the UTF-8 encoding. The specified limit applies to strings that are not subject to string length schema validation constraints, to ensure that schema validation is not affected. @par Example: ~~~{.cpp} struct soap *soap = soap_new(); soap->maxlength = 256; // limit string lengths to 256 characters (unlimited by default) ~~~ @see `::soap::recv_maxlength`, `::soap::maxlevel`, `::soap::maxoccurs`. */ long maxlength; /// User-definable maximum array and container size (maximum item occurrence constraint) as parsed from XML and JSON, except when specifie XML schema validation constraints permit greater sizes, initially set to `#SOAP_MAXOCCURS` (the value is 100000 by default) /** The specified occurrence limit applies to arrays and containers that are not subject to occurrence validation constraints (`minOccurs` and `maxOccurs`, to ensure that schema validation is not affected. @par Example: ~~~{.cpp} struct soap *soap = soap_new(); soap->maxoccurs = 100; // limit arrays and containers to 100 items (100000 by default) ~~~ @see `::soap::recv_maxlength`, `::soap::maxlevel`, `::soap::maxlength`. */ size_t maxoccurs; /// User-definable socket `send` and `recv` flags, for example assign `MSG_NOSIGNAL` to disable sigpipe (the value is 0 by default) /** @par Example: ~~~{.cpp} struct soap *soap = soap_new(); soap->socket_flags = MSG_NOSIGNAL; // no sigpipe (this is not portable) ~~~ Other ways to disable sigpipe: ~~~{.cpp} struct soap *soap = soap_new(); soap->connect_flags = SO_NOSIGPIPE; soap->bind_flags = SO_NOSIGPIPE; ~~~ ~~~{.cpp} #include void sigpipe_handle(int) { } signal(SIGPIPE, sigpipe_handle); ~~~ @see `::soap::connect_flags`, `::soap::bind_flags`, `::soap::accept_flags`. */ int socket_flags; /// User-definable `setsockopt` level `SOL_SOCKET` flags when connecting `::soap::socket` to a server (the value is 0 by default) /** @par Examples: ~~~{.cpp} struct soap *soap = soap_new(); soap->connect_flags = SO_LINGER; soap->linger_time = 5; ~~~ ~~~{.cpp} struct soap *soap = soap_new(); soap->connect_flags = SO_BROADCAST; ~~~ @see `::soap::socket_flags`, `::soap::bind_flags`, `::soap::accept_flags`. */ int connect_flags; /// User-definable `setsockopt` level `SOL_SOCKET` flags when binding `::soap::master` socket (the value is 0 by default) /** @par Example ~~~{.cpp} struct soap *soap = soap_new(); soap->bind_flags = SO_REUSEADDR; // immediate port reuse when binding if (soap_valid_socket(soap_bind(soap, NULL, PORTNUM, BACKLOG)) ... // success ~~~ @see `::soap::socket_flags`, `::soap::connect_flags`, `::soap::accept_flags`, `#WITH_IPV6`, `#WITH_IPV6_V6ONLY`, `#SOAP_IO_UDP`, `::soap::bind_inet6`, `::soap::bind_v6only`, `::soap::rcvbuf`, `::soap::sndbuf`, `::soap::master`. */ int bind_flags; /// User-definable flag, when nonzero uses `AF_INET6` instead of `PF_UNSPEC` when binding the `::soap::master` socket in `::soap_bind` (or the C++ service class `bind` method), to remap IPv4 to IPv6 addresses, meaningful only when used with `#WITH_IPV6` /** @par Example: ~~~{.cpp} // requires compilation with compile-time flag -D WITH_IPV6 struct soap *soap = soap_new(); soap->bind_inet6 = 1; soap->bind_v6only = 1; if (soap_valid_socket(soap_bind(soap, NULL, PORTNUM, BACKLOG)) // IPv6 address binding ... // success ~~~ @see `::soap::bind_v6only`. @note Requires compilation with `#WITH_IPV6`. */ short bind_inet6; /// User-definable flag, when nonzero enables `IPPROTO_IPV6` `setsockopt` `IPV6_V6ONLY` when binding the `::soap::master` socket with `::soap_bind` (or the C++ service class `bind` method), meaningful only when used with `#WITH_IPV6` /** @par Example: ~~~{.cpp} // requires compilation with compile-time flag -D WITH_IPV6 struct soap *soap = soap_new(); soap->bind_inet6 = 1; soap->bind_v6only = 1; if (soap_valid_socket(soap_bind(soap, NULL, PORTNUM, BACKLOG)) // IPv6 address binding ... // success ~~~ @see `::soap::bind_inet6`. @note Requires compilation with `#WITH_IPV6`. */ short bind_v6only; /// User-definable `setsockopt` level `SOL_SOCKET` flags (0 by default), when nonzero sets the `::soap::socket` flags when accepting a request with `::soap_accept` (or the C++ service class `accept` method) /** @par Example: ~~~{.cpp} struct soap *soap = soap_new(); soap->accept_flags = SO_NOSIGPIPE; // no sigpipe (this is not portable) ~~~ Other ways to disable sigpipe: ~~~{.cpp} struct soap *soap = soap_new(); soap->socket_flags = MSG_NOSIGNAL; ~~~ ~~~{.cpp} #include void sigpipe_handle(int) { } signal(SIGPIPE, sigpipe_handle); ~~~ @see `::soap::socket_flags`, `::soap::connect_flags`, `::soap::bind_flags`. */ int accept_flags; /// User-definable linger time value, requires the `SO_LINGER` `setsockopt` flag value to be assigned to `::soap::socket_flags` /** @par Example: ~~~{.cpp} struct soap *soap = soap_new(); soap->connect_flags = SO_LINGER; soap->linger_time = 5; ~~~ */ unsigned short linger_time; /// User-definable value to set `SO_RCVBUF` `setsockopt` (the value is `#SOAP_BUFLEN` by default) /** @par Example: ~~~{.cpp} struct soap *soap = soap_new(); soap->rcvbuf = 32768; // setsockopt SO_RCVBUF size ~~~ */ int rcvbuf; /// User-definable value to set `SO_SNDBUF` `setsockopt` (the value is `#SOAP_BUFLEN` by default) /** @par Example: ~~~{.cpp} struct soap *soap = soap_new(); soap->sndbuf = 32768; // setsockopt SO_SNDBUF size ~~~ */ int sndbuf; /// User-definable value to set `SO_KEEPALIVE` `setsockopt` (0 by default unless the `#SOAP_IO_KEEPALIVE` mode flag is set) /** @par Example: ~~~{.cpp} struct soap *soap = soap_new(); soap->tcp_keep_alive = 1; // setsockopt SO_KEEPALIVE soap->tcp_keep_idle = 30; // time in seconds the connection needs to remain idle before TCP starts sending keepalive probes soap->tcp_keep_intvl = 120; // time in seconds between individual keepalive probes soap->tcp_keep_cnt = 5; // maximum number of keepalive probes TCP should send before dropping the connection ~~~ HTTP keep-alive together with TCP `SO_KEEPALIVE` is enabled with: ~~~{.cpp} struct soap *soap = soap_new1(SOAP_IO_KEEPALIVE); // enable HTTP keep-alive soap->max_keep_alive = 50; // 50 max keep-alive exchanges for SOAP_IO_KEEPALIVE (SOAP_MAXKEEPALIVE by default) soap->tcp_keep_idle = 30; // time in seconds the connection needs to remain idle before TCP starts sending keepalive probes soap->tcp_keep_intvl = 120; // time in seconds between individual keepalive probes soap->tcp_keep_cnt = 5; // maximum number of keepalive probes TCP should send before dropping the connection ~~~ @see `#SOAP_IO_KEEPALIVE`, `::soap::tcp_keep_idle`, `::soap::tcp_keep_intvl` and `::soap::tcp_keep_cnt`. */ int tcp_keep_alive; /// User-definable value to set `TCP_KEEPIDLE` `setsockopt` (the value is 0 by default) /** @par Example: ~~~{.cpp} struct soap *soap = soap_new(); soap->tcp_keep_alive = 1; // setsockopt SO_KEEPALIVE soap->tcp_keep_idle = 30; // time in seconds the connection needs to remain idle before TCP starts sending keepalive probes soap->tcp_keep_intvl = 120; // time in seconds between individual keepalive probes soap->tcp_keep_cnt = 5; // maximum number of keepalive probes TCP should send before dropping the connection ~~~ HTTP keep-alive with TCP `SO_KEEPALIVE` is enabled with: ~~~{.cpp} struct soap *soap = soap_new1(SOAP_IO_KEEPALIVE); // enable HTTP keep-alive soap->max_keep_alive = 50; // 50 max keep-alive exchanges (SOAP_MAXKEEPALIVE by default) soap->tcp_keep_idle = 30; // time in seconds the connection needs to remain idle before TCP starts sending keepalive probes soap->tcp_keep_intvl = 120; // time in seconds between individual keepalive probes soap->tcp_keep_cnt = 5; // maximum number of keepalive probes TCP should send before dropping the connection ~~~ @see `::soap::tcp_keep_alive`, `::soap::tcp_keep_intvl` and `::soap::tcp_keep_cnt`. */ unsigned int tcp_keep_idle; /// User-definable value to set `TCP_KEEPINTVL` `setsockopt` (the value is 0 by default) /** @par Example: ~~~{.cpp} struct soap *soap = soap_new(); soap->tcp_keep_alive = 1; // setsockopt SO_KEEPALIVE soap->tcp_keep_idle = 30; // time in seconds the connection needs to remain idle before TCP starts sending keepalive probes soap->tcp_keep_intvl = 120; // time in seconds between individual keepalive probes soap->tcp_keep_cnt = 5; // maximum number of keepalive probes TCP should send before dropping the connection ~~~ HTTP keep-alive with TCP `SO_KEEPALIVE` is enabled with: ~~~{.cpp} struct soap *soap = soap_new1(SOAP_IO_KEEPALIVE); // enable HTTP keep-alive soap->max_keep_alive = 50; // 50 max keep-alive exchanges (SOAP_MAXKEEPALIVE by default) soap->tcp_keep_idle = 30; // time in seconds the connection needs to remain idle before TCP starts sending keepalive probes soap->tcp_keep_intvl = 120; // time in seconds between individual keepalive probes soap->tcp_keep_cnt = 5; // maximum number of keepalive probes TCP should send before dropping the connection ~~~ @see `::soap::tcp_keep_alive`, `::soap::tcp_keep_idle` and `::soap::tcp_keep_cnt`. */ unsigned int tcp_keep_intvl; /// User-definable value to set `TCP_KEEPCNT` `setsockopt` (the value is 0 by default) /** @par Example: ~~~{.cpp} struct soap *soap = soap_new(); soap->tcp_keep_alive = 1; // setsockopt SO_KEEPALIVE soap->tcp_keep_idle = 30; // time in seconds the connection needs to remain idle before TCP starts sending keepalive probes soap->tcp_keep_intvl = 120; // time in seconds between individual keepalive probes soap->tcp_keep_cnt = 5; // maximum number of keepalive probes TCP should send before dropping the connection ~~~ HTTP keep-alive with TCP `SO_KEEPALIVE` is enabled with: ~~~{.cpp} struct soap *soap = soap_new1(SOAP_IO_KEEPALIVE); // enable HTTP keep-alive soap->max_keep_alive = 50; // 50 max keep-alive exchanges (SOAP_MAXKEEPALIVE by default) soap->tcp_keep_idle = 30; // time in seconds the connection needs to remain idle before TCP starts sending keepalive probes soap->tcp_keep_intvl = 120; // time in seconds between individual keepalive probes soap->tcp_keep_cnt = 5; // maximum number of keepalive probes TCP should send before dropping the connection ~~~ @see `::soap::tcp_keep_alive`, `::soap::tcp_keep_idle` and `::soap::tcp_keep_intvl`. */ unsigned int tcp_keep_cnt; /* in_addr_t in6addr->sin6_scope_id IPv6 value */ /// User-definable value to set `sockaddr_in6::sin6_scope_id` when nonzero /** This value is used by the engine for UDP multicast messaging at the client side, sets `sockaddr_in6::sin6_scope_id` to `::soap::ipv6_multicast_if` when nonzero. @see `#SOAP_IO_UDP`, `::soap::ipv4_multicast_if`, `::soap::ipv4_multicast_ttl`. */ unsigned int ipv6_multicast_if; /// User-definable value to set `setsockopt` level `IPPROTO_IP` to `IP_MULTICAST_IF` when non-NULL /** This value is used by the engine for UDP multicast messaging at the client side, sets `setsockopt` level `IPPROTO_IP` to `IP_MULTICAST_IF` with value `::soap::ipv4_multicast_if` when non-NULL. @see `#SOAP_IO_UDP`, `::soap::ipv6_multicast_if`, `::soap::ipv4_multicast_ttl`. */ char* ipv4_multicast_if; /// User-definable value to set `setsockopt` level `IPPROTO_IP` to `IP_MULTICAST_TTL` when nonzero /** This value is used by the engine for UDP multicast messaging at the client side, sets `setsockopt` level `IPPROTO_IP` to `IP_MULTICAST_TTL` with value `::soap::ipv4_multicast_ttl` when nonzero. @par Example: ~~~{.cpp} struct soap *soap = soap_new(); in_addr_t addr = inet_addr("1.2.3.4"); // optional soap->send_timeout = 5; // 5 seconds max socket delay soap->connect_flags = SO_BROADCAST; // required for broadcast soap->ipv4_multicast_if = &addr; // optional for IPv4, see setsockopt IPPROTO_IP IP_MULTICAST_IF soap->ipv6_multicast_if = addr; // optional for IPv6, multicast sin6_scope_id soap->ipv4_multicast_ttl = 1; // optional, see setsockopt IPPROTO_IP, IP_MULTICAST_TTL ~~~ Refer to the socket options for `IPPROTO_IP` `IP_MULTICAST_TTL` to limit the lifetime of the packet. Multicast datagrams are sent with a default value of 1, to prevent them to be forwarded beyond the local network. This parameter can be set between 1 to 255. @see `#SOAP_IO_UDP`, `::soap::ipv6_multicast_if`, `::soap::ipv4_multicast_if`. */ unsigned char ipv4_multicast_ttl; /// User-definable client address to bind to before connecting to a server, when non-NULL (Windows: n/a) /** When non-NULL, sets the client address specified as IPv4 or IPv6 or as a host address to bind to before connecting to a server. The value is reset to NULL after connecting successfully or unsuccessfully to the server. @par Example: ~~~{.cpp} struct soap *soap = soap_new(); soap->client_addr = "12.34.56.78"; // client binds to 12.34.56.78 when connecting to endpoint soap->client_port = 8080; // optional, to also specify a port to bind to if (soap_call_ns__webmethod(soap, endpoint, NULL, ...)) soap_print_fault(soap, stderr); else ... // success soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~ @note: cannot be used on Windows platforms. @see `::soap::client_addr_ipv6`, `::soap::client_port`, `::soap::client_interface`. */ const char *client_addr; /// User-definable client address to bind to before connecting to a server, when non-NULL, requires `#WITH_IPV6` /** When non-NULL and `soap::client_addr` is non-NULL and when connecting to a IPv6 server, sets the client address specified as IPv6 or as a host address to bind to before connecting to the server. The value is reset to NULL after connecting successfully or unsuccessfully to the server. @par Example: ~~~{.cpp} struct soap *soap = soap_new(); soap->client_addr = "12.34.56.78"; // client binds to 12.34.56.78 when connecting to a IPv4 endpoint soap->client_addr_ipv6 = "2001:db8:0:1; // but the client binds 2001:db8:0:1 when connecting to a IPv6 endpoint soap->client_port = 8080; // optional, to also specify a port to bind to if (soap_call_ns__webmethod(soap, endpoint, NULL, ...)) soap_print_fault(soap, stderr); else ... // success soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~ @note Requires compilation with `#WITH_IPV6` or `#WITH_IPV6_V6ONLY`. @see `::soap::client_addr`, `::soap::client_port`, `::soap::client_interface`. */ const char *client_addr_ipv6; /// User-definable client port to bind to before connecting to a server, when non-negative /** When non-negative, executes a `bind` with this port number before connecting to a server. The value is reset to -1 after connecting successfully or unsuccessfully to the server. @par Example: ~~~{.cpp} struct soap *soap = soap_new(); soap->client_port = 18000; // client binds to port 18000 when connecting to endpoint if (soap_call_ns__webmethod(soap, endpoint, NULL, ...)) soap_print_fault(soap, stderr); else ... // success soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~ @see `::soap::client_addr`, `::soap::client_addr_ipv6`, `::soap::client_interface`. */ int client_port; /// User-definable client interface address to override when connecting to a server, when non-NULL (Windows: n/a) /** When non-NULL, sets the client address before connecting to a server. The value is reset to NULL after connecting successfully or unsuccessfully to the server. Does not bind the address, unlike `::soap::client_addr` and `::soap::client_addr_ipv6`. @note: cannot be used on Windows platforms. @see `::soap::client_addr`, `::soap::client_addr_ipv6`, `::soap::client_addr_ipv6`. */ const char *client_interface; /// User-definable compression level for gzip compression (0=none, 1=fast to 9=best) default level is 6 /** @see `#WITH_GZIP`, `#WITH_ZLIB`, `#SOAP_ENC_ZLIB`, `::soap::z_ratio_in`, `::soap::z_ratio_out`. */ unsigned short z_level; /// The compression ratio = compressed.size/uncompressed.size of the compressed message received /** @see `#WITH_GZIP`, `#WITH_ZLIB`, `#SOAP_ENC_ZLIB`, `::soap::z_level`, `::soap::z_ratio_out`. */ float z_ratio_in; /// The compression ratio = compressed.size/uncompressed.size of the compressed message sent /** @see `#WITH_GZIP`, `#WITH_ZLIB`, `#SOAP_ENC_ZLIB`, `::soap::z_level`, `::soap::z_ratio_in`. */ float z_ratio_out; /// User-definable HTTP authorization bearer token value to be sent by the client, server side receives this string when the client sends authorization bearer /** @par Example: ~~~{.cpp} struct soap *soap = soap_new(); if (soap_ssl_client_context(soap, ...)) exit(EXIT_FAILURE); soap->bearer = "bearer-token"; if (soap_call_ns__webmethod(soap, endpoint, NULL, ...)) soap_print_fault(soap, stderr); else ... // success soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~ ~~~{.cpp} int main() { struct soap *soap = soap_new(); if (soap_ssl_server_context(soap, ...)) exit(EXIT_FAILURE); ... // serve requests with soap_bind, soap_accept, soap_ssl_accept, and soap_serve } int ns__webmethod(struct soap *soap, ...) { if (!soap->bearer || strcmp(soap->bearer, "bearer-token")) return 401; // Unauthorized ... // process the request data and populate the response data return SOAP_OK; } ~~~ @see `::soap_ssl_client_context`, `::soap_ssl_server_context`, `::soap::userid`, `::soap::passwd`, `::soap::ntlm_challenge` and the [HTTP digest plugin](../../httpda/html/httpda.html) documentation. */ const char *bearer; /// User-definable HTTP and NTLM authorization user id string for HTTP basic and NTLM authentication by the client, server side receives this string when the client uses HTTP basic authentication, for HTTP digest authentication see the gSOAP HTTP digest authentication plugin /** @par Examples: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); if (soap_ssl_client_context(soap, ...)) exit(EXIT_FAILURE); soap->userid = "user-id"; // HTTP basic auth credential soap->passwd = "user-pw"; // HTTP basic auth credential soap->authrealm = "server-domain"; // if known in advance, see example below if (soap_call_ns__webmethod(soap, endpoint, NULL, ...)) soap_print_fault(soap, stderr); else ... // success soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~ ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); if (soap_ssl_client_context(soap, ...)) exit(EXIT_FAILURE); if (soap_call_ns__webmethod(soap, endpoint, NULL, ...) == 401) // Unauthorized, got soap->authrealm { soap->userid = "user-id"; // HTTP basic auth credential soap->passwd = "user-pw"; // HTTP basic auth credential if (soap_call_ns__webmethod(soap, endpoint, NULL, ...)) // try again soap_print_fault(soap, stderr); else ... // success } else { ... // success } soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~ ~~~{.cpp} #include "soapH.h" int main() { struct soap *soap = soap_new(); if (soap_ssl_server_context(soap, ...)) exit(EXIT_FAILURE); ... // serve requests with soap_bind, soap_accept, soap_ssl_accept, and soap_serve } int ns__webmethod(struct soap *soap, ...) { if (!soap->userid || !soap->passwd || !soap->authrealm || strcmp(soap->userid, "user-id") || strcmp(soap->passwd, "user-pw") || strcmp(soap->authrealm, "server-domain")) return 401; // Unauthorized ... // process the request data and populate the response data return SOAP_OK; } ~~~ @see `::soap::passwd`, `::soap::authrealm`, `::soap_ssl_client_context`, `::soap::bearer`, `::soap::ntlm_challenge`, `::soap::http_extra_header`, `::soap::proxy_userid`, `::soap::proxy_passwd` and the [HTTP digest plugin](../../httpda/html/httpda.html) documentation. */ const char *userid; /// User-definable HTTP and NTLM authorization password string required for HTTP basic and NTLM authentication by the client, server side receives this string when the client uses HTTP basic authentication /** @see `::soap::userid`, `::soap::authrealm`. */ const char *passwd; /// The HTTP and NTLM authorization realm/domain string received by the client with the `WWW-Authenticate` or `Proxy-Authenticate` HTTP headers, user-definable on the server side to send a `WWW-Authenticate` header to require authentication (service operation should return 401 to respond with "Unauthorized"), also serves as NTLM domain value /** @see `::soap::userid`, `::soap::passwd`. */ const char *authrealm; /// User-definable NTLM authentication challenge key string /** @par Examples: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); if (soap_call_ns__webmethod(soap, endpoint, NULL, ...) == 401) // Unauthorized, got soap->authrealm with NTLM domain { soap->userid = "user-id"; // NTLM auth credential soap->passwd = "user-pw"; // NTLM auth credential if (soap_call_ns__webmethod(soap, endpoint, NULL, ...)) // try again soap_print_fault(soap, stderr); else ... // success } else { ... // success } soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~ ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); soap->ntlm_challenge = ""; // pretend we've been challenged soap->userid = "user-id"; // NTLM credential soap->passwd = "user-pw"; // NTLM credential soap->authrealm = "server-domain"; // NTLM domain if (soap_call_ns__webmethod(soap, endpoint, NULL, ...)) soap_print_fault(soap, stderr); else ... // success soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~ @note Requires compilation with `#WITH_NTLM` and linking libntlm available at http://www.nongnu.org/libntlm for non-Windows platforms. @see `::soap::bearer`, `::soap::userid`, `::soap::passwd`, `::soap::proxy_userid`, `::soap::proxy_passwd`. */ const char *ntlm_challenge; /// User-definable proxy host name string which should be set to connect through an HTTP proxy /** @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); soap->proxy_host = "proxy-domain-or-IP"; soap->proxy_port = 3128; soap->proxy_userid = "proxy-id"; soap->proxy_passwd = "proxy-pw"; if (soap_call_ns__webmethod(soap, endpoint, NULL, ...)) soap_print_fault(soap, stderr); else ... // success soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~ @see `::soap::bearer`, `::soap::userid`, `::soap::passwd`, `::soap::ntlm_challenge`, `::soap::http_extra_header`, and the [HTTP digest plugin](../../httpda/html/httpda.html) documentation. */ const char *proxy_host; /// User-definable proxy port which should be set to connect through an HTTP proxy (the value is 8080 by default) /** @see `::soap::proxy_host`. */ int proxy_port; /// User-definable proxy authorization user id string to authenticate and connect to an HTTP proxy /** @see `::soap::proxy_host`. */ const char *proxy_userid; /// User-definable proxy authorization password string to authenticate and connect to an HTTP proxy /** @see `::soap::proxy_host`. */ const char *proxy_passwd; /// The `X-Forwarding-For` HTTP header string value received const char *proxy_from; /// The IPv4 address in numeric form of the client as received on the server side by `::soap_accept` (or the C++ service class `accept` method), possibly set to zero when `#WITH_IPV6` is used /** @par Example: ~~~{.cpp} #include "soapH.h" int main() { struct soap *soap = soap_new(); soap->accept_timeout = 3600; // exit loop when no request arrives in one hour ... // context initializations if (soap_valid_socket(soap_bind(soap, NULL, PORTNUM, BACKLOG))) { while (1) { if (soap_valid_socket(soap_accept(soap))) { printf("Client host = %s port = %d path = %s ip = %d.%d.%d.%d\n", soap->host, soap->port, soap->path, soap->ip >> 24, (soap->ip >> 16) & 0xFF, (soap->ip >> 8) & 0xFF, soap->ip & 0xFF); if (soap_serve(soap)) soap_print_fault(soap, stderr); } else if (soap->errnum) // accept failed, try again after 1 second { soap_print_fault(soap, stderr); sleep(1); } else // accept timed out, quit looping { break; } soap_destroy(soap); soap_end(soap); } } soap_free(soap); } ~~~ @see `::soap::ip6`, `::soap_bind`, `::soap_accept`, `::soap_ssl_accept`, `::soap_serve`. */ unsigned int ip; /// The IPv6 address in numeric form (upper ip6[0] to lower ip6[3]) of the client as received on the server side by `::soap_accept` (or the C++ service class `accept` method), requires `#WITH_IPV6` /** @par Example: ~~~{.cpp} #include "soapH.h" int main() { struct soap *soap = soap_new(); soap->accept_timeout = 3600; // exit loop when no request arrives in one hour ... // context initializations if (soap_valid_socket(soap_bind(soap, NULL, PORTNUM, BACKLOG))) { while (1) { if (soap_valid_socket(soap_accept(soap))) { printf("Client host = %s port = %d path = %s ", soap->host, soap->port, soap->path); if (soap->ip) printf("ip4 = %d.%d.%d.%d\n", soap->ip >> 24, (soap->ip >> 16) & 0xFF, (soap->ip >> 8) & 0xFF, soap->ip & 0xFF); else printf("ip6 = %.8x%.8x%.8x%.8x\n", soap->ip6[0], soap->ip6[1], soap->ip6[2], soap->ip6[3]); if (soap_serve(soap)) soap_print_fault(soap, stderr); } else if (soap->errnum) // accept failed, try again after 1 second { soap_print_fault(soap, stderr); sleep(1); } else // accept timed out, quit looping { break; } soap_destroy(soap); soap_end(soap); } } soap_free(soap); } ~~~ @note Requires compilation with `#WITH_IPV6` or `#WITH_IPV6_V6ONLY`. @see `::soap::host`, `::soap::port`, `::soap::ip6`, `::soap_bind`, `::soap_accept`, `::soap_ssl_accept`, `::soap_serve`. */ unsigned int ip6[4]; /// The client port connected to as received on the server side by `::soap_accept` (or the C++ service class `accept` method) /** @see `::soap::ip`, `::soap::ip6`. */ int port; /// The endpoint string as received on the server side /** The URL endpoint string is extracted from the HTTP header by `::soap::fparse` called by `::soap_begin_recv` and consists of `::soap::host`, `::soap::port`, and `::soap::path` concatenated. @see `::soap::ip`, `::soap::ip6`, `::soap::host`, `::soap::port`, `::soap::path`. */ char endpoint[SOAP_TAGLEN]; /// The client host name or IP address as received on the server side /** The URL host string is extracted from the HTTP header by `::soap::fparse` called by `::soap_begin_recv`. @see `::soap::ip`, `::soap::ip6`, `::soap::endpoint`, `::soap::port`, `::soap::path`. */ char host[SOAP_TAGLEN]; /// The client request path as received on the server side /** The URL path string is extracted from the HTTP header by `::soap::fparse` called by `::soap_begin_recv` and starts with a "/". @see `::soap::ip`, `::soap::ip6`, `::soap::endpoint`, `::soap::host`, `::soap::port`, `::soap_query`. */ char path[SOAP_TAGLEN]; /// User-definable string to override the host name or IP address in the HTTP header when connecting at the client side /** @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_IO_CHUNK); ... // initializations soap->override_host = "server-domain-or-IP"; soap->override_port = 1234; if (soap_call_ns__webmethod(soap, endpoint, NULL, ...)) soap_print_fault(soap, stderr); else ... // success soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~ @see `::soap::override_port`. */ const char *override_host; /// User-definable port number to override the port address in the HTTP header when connecting at the client side /** @see `::soap::override_host`. */ int override_port; /// The CORS Origin HTTP header string value received /** CORS is automatic at the server side. The server internally calls the `::soap::fopt` callback to serve the OPTION method CORS request, which returns HTTP 200 OK with CORS headers. The default value of the CORS Access-Control-Allow-Origin header is "*". At the client side, CORS requires the HTTP OPTIONS method with CORS headers. Use the following code to send HTTP OPTIONS with CORS headers to a server: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); soap->origin = "http://example.com"; soap->cors_method = "POST"; // request method is POST soap->cors_header = "..."; // list of comma-separated request headers (may be omitted) if (soap_connect_command(soap, SOAP_OPTIONS, endpoint, NULL) || soap_end_send(soap) || soap_recv_empty_response(soap)) soap_print_fault(soap, stderr); else if (soap_call_ns__webmethod(soap, endpoint, NULL, ...)) soap_print_fault(soap, stderr); else ... // success ~~~ @see `::soap::cors_origin`, `::soap::cors_allow`, `::soap::cors_method`, `::soap::cors_header`, `::soap::cors_methods`, `::soap::cors_header`. */ const char *origin; /// The CORS Access-Control-Allow-Origin HTTP header string value received or the user-definable value to be returned by the server when set /** @see `::soap::origin`. */ const char *cors_origin; /// User-definable CORS Access-Control-Allow-Origin HTTP header string default value (the value is `*` by default) /** CORS is automatic at the server side. At the client side, CORS requires the HTTP OPTIONS method with CORS headers. @see `::soap::origin`. */ const char *cors_allow; /// The CORS Access-Control-Request-Method HTTP header string received /** CORS is automatic at the server side. At the client side, CORS requires the HTTP OPTIONS method with CORS headers. @see `::soap::origin`. */ const char *cors_method; /// The CORS Access-Control-Request-Headers HTTP header string received /** CORS is automatic at the server side. At the client side, CORS requires the HTTP OPTIONS method with CORS headers. @see `::soap::origin`. */ const char *cors_header; /// User-definable CORS Access-Control-Request-Methods HTTP header string to be returned by the server /** CORS is automatic at the server side. At the client side, CORS requires the HTTP OPTIONS method with CORS headers. @see `::soap::origin`. */ const char *cors_methods; /// User-definable CORS Access-Control-Request-Headers HTTP header string to be returned by the server /** CORS is automatic at the server side. At the client side, CORS requires the HTTP OPTIONS method with CORS headers. @see `::soap::origin`. */ const char *cors_headers; /// User-definable floating point format string (`%.9G` by default, the printed format should not exceed 1023 bytes) /** @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); soap->float_format = "%g"; soap->double_format = "%g"; soap->long_double_format = "%Lg"; ~~~ */ const char *float_format; /// User-definable double floating point format string (`%.17lG` by default, the printed format should not exceed 1023 bytes) /** @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); soap->float_format = "%g"; soap->double_format = "%g"; soap->long_double_format = "%Lg"; ~~~ */ const char *double_format; /// User-definable long double floating point format string (NULL by default and defined by the long_double.c custom serializer, the printed format should not exceed 1023 bytes) /** @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); soap->float_format = "%g"; soap->double_format = "%g"; soap->long_double_format = "%Lg"; ~~~ @note Requires `#import "custom/long_double.h" in the .h file for soapcpp2 to generate code that supports `long double` and compiling `gsoap/custom/long_double.c` to serialize `long double`. */ const char *long_double_format; /// User-definable format string to generate DIME content IDs /** The format string should contain a `%d` or `%x`. The default format string is "cid:id%d". */ const char *dime_id_format; /// DOM tree received /** This pointer points to the DOM tree received when `#SOAP_XML_DOM` mode is enabled and the engine is configured with `#WITH_DOM`. @see `#WITH_DOM`, `#SOAP_XML_DOM`. */ struct soap_dom_element *dom; /// DIME attachments received /** This structure contains a linked list of DIME attachments received. */ struct soap_dime dime; /// MIME attachments received /** This structure contains a linked list of MIME attachments received. */ struct soap_mime mime; /// Internal index that keeps track of the current position in the `::soap::buf` buffer after receiving data into the buffer size_t bufidx; /// Internal index that keeps track of the length of the data available in the `::soap::buf` buffer, does not exceed `#SOAP_BUFLEN` size_t buflen; /// Internal buffer with partial data received or partial data to be sent, where the data occupies `::soap::buflen` bytes char buf[SOAP_BUFLEN]; /// Internal buffer to hold short messages, URLs and HTTP/MIME header lines, must have at least `#SOAP_TMPLEN` = 1024 bytes of space allocated char msgbuf[SOAP_TMPLEN]; /// Internal buffer to hold temporary strings such as string representations of primitive values, XML tag names, HTTP header lines and so on, must have at least `#SOAP_TMPLEN` = 1024 bytes of space allocated char tmpbuf[SOAP_TMPLEN]; /// Message length counter value of the message received and counter value of the HTTP content length header to send a message /** @see `::soap_begin_count`, `::soap_end_count`, `#SOAP_IO_LENGTH`, `#SOAP_IO_CHUNK`. */ ULONG64 count; /// The HTTP content length header value received or 0 when HTTP transfer encoding is chunked ULONG64 length; /// Callback that populates and then sends HTTP headers from the client-side to a connected HTTP server /** @ingroup group_callbacks This callback is called at the client side by the engine to send HTTP headers to the connected server. The parameters `host`, `port`, and `path` were micro-parsed from the `endpoint` prior to passing them to this callback. Parameter `action` is the SOAP Action header. Parameter `count` is the length of the HTTP body with the message or 0 when HTTP chunking is used. This callback sends the headers with POST by default, or when `::soap::status` == `#SOAP_POST` or `::soap::status` == `#SOAP_POST_FILE`. Alternatively, sends the HTTP headers with GET when `::soap::status` == `#SOAP_GET`, PATCH when `::soap::status` == `#SOAP_PATCH`, PUT when `::soap::status` == `#SOAP_PUT`, DELETE when `::soap::status` == `#SOAP_DEL`, CONNECT when `::soap::status` == `#SOAP_CONNECT`, HEAD when `::soap::status` == `#SOAP_HEAD` or OPTIONS when `::soap::status` == `#SOAP_OPTIONS`. Extra HTTP headers are added when `::soap::http_extra_header` is set to one or more header lines separated by CRLF. When redefining this callback, use function `::soap_send` to write the header contents. Returns `#SOAP_OK` or a `::soap_status` (int) error code. The built-in function assigned to `::soap:fpost` is `http_post`. @param soap `::soap` context @param endpoint URL of the endpoint connected to (string) @param host URL host of the endpoint connected to (string) @param port URL port of the endpoint connected to (int) @param path URL path of the endpoint connected to (string) @param action SOAP Action or NULL (string) @param count HTTP content-length or 0 for HTTP chunked transfers (size_t) @returns `#SOAP_OK` or a `::soap_status` error code */ int (*fpost)(struct soap *soap, const char *endpoint, const char *host, int port, const char *path, const char *action, ULONG64 count); /// Callback that populates and then sends HTTP headers from the server-side to a connected client /** @ingroup group_callbacks This callback is called at the server side by the engine to send the HTTP headers to the connected client. The parameter `status` should be an HTTP status error code or `#SOAP_OK` (200 OK) or `#SOAP_HTML` or `#SOAP_FILE`. Using `#SOAP_HTML` sets the content-type header to `text/html; charset=utf-8`. Using `#SOAP_FILE` sets the content-type header to the value of `::soap::http_content`. Extra HTTP headers are added when `::soap::http_extra_header` is set to one or more header lines separated by CRLF. When redefining this callback, use function `::soap_send` to write the header contents. Returns `#SOAP_OK` or a `::soap_status` error code. The built-in function assigned to `::soap::fresponse` is `http_response`. @param soap `::soap` context @param status HTTP status code (> 100) or `#SOAP_OK` (200 OK), or `#SOAP_HTML` or `#SOAP_FILE` @param count HTTP content-length or 0 for HTTP chunked transfers @returns `#SOAP_OK` or a `::soap_status` error code */ int (*fresponse)(struct soap *soap, int status, ULONG64 count); /// Callback that sends a single HTTP header given a key-value pair /** @ingroup group_callbacks This callback is called by `::soap::fpost` and `::soap::fresponse` to send an HTTP header with a key and an optional value. Returns `#SOAP_OK` or a `::soap_status` (int) error code. The built-in function assigned to `::soap::fposthdr` is `http_post_header`. @param soap `::soap` context @param key HTTP header key (string) @param val optional HTTP header value (string), omitted when NULL @returns `#SOAP_OK` or a `::soap_status` error code */ int (*fposthdr)(struct soap *soap, const char *key, const char *val); /// Callback that reads and parses HTTP and MIME headers /** @ingroup group_callbacks This callback is called by the engine (as a client or server) to read and parse HTTP headers or MIME headers. When redefined, this function should at read or skip the entire HTTP header to reach the message body. Function `::soap_getline` is used by this callback to read each header line into an internal buffer `::soap::msgbuf` with `::soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf))`. Returns `#SOAP_OK`, or a gSOAP error code. The built-in function assigned to `::soap::fparse` is `http_parse`. @param soap `::soap` context @returns `#SOAP_OK` or a `::soap_status` error code */ int (*fparse)(struct soap *soap); /// Callback that consumes an HTTP header that consists of a key-value pair /** @ingroup group_callbacks This callback is called by `::soap::fparse`, consumes an HTTP header that is split in a key-value pair and updates the `::soap` context state accordingly. The context is updated with the HTTP header information received, but HTTP headers are not literally retained by the engine. Returns `#SOAP_OK` or `#SOAP_STOP` to prevent further reading of the HTTP body, or a `::soap_status` (int) error code. The built-in function assigned to `::soap::fparsehdr` is `http_parse_header`. @note This callback can be used to parse (custom) HTTP headers, which is typically done by plugins. @param soap `::soap` context @param key HTTP header key received (string) @param val optional HTTP header value received (string), or NULL @returns `#SOAP_OK`, `#SOAP_STOP` or a `::soap_status` error code */ int (*fparsehdr)(struct soap *soap, const char *key, const char *val); /// Callback to implement logic at the server-side to serve responses to HTTP GET requests from clients /** @ingroup group_callbacks This callback is called by the service dispatcher when an HTTP GET request is pending. Redefine this callback to respond to HTTP GET requests with content, see the `::http_get` HTTP GET plugin for more details. Returns `#SOAP_OK` or a `::soap_status` (int) error code. The built-in function assigned to `::soap::fget` is the internal static function `http_get` that returns the `#SOAP_GET_METHOD` error. @see `::http_get`. @param soap `::soap` context @returns `#SOAP_OK` or a `::soap_status` error code */ int (*fget)(struct soap *soap); /// Callback to implement logic at the server-side to serve responses to HTTP PUT requests from clients /** @ingroup group_callbacks This callback is called by the service dispatcher when an HTTP PUT request is pending. Redefine this callback to respond to HTTP PUT requests, see the `::http_post` HTTP POST plugin for more details. Returns `#SOAP_OK` or a `::soap_status` error code. The built-in function assigned to `::soap::fput` is the internal static function `http_put` that returns the `#SOAP_PUT_METHOD` error. @see `::http_post`. @param soap `::soap` context @returns `#SOAP_OK` or a `::soap_status` error code */ int (*fput)(struct soap *soap); /// Callback to implement logic at the server-side to serve responses to HTTP PATCH requests from clients /** @ingroup group_callbacks This callback is called by the service dispatcher when an HTTP PATCH request is pending. Redefine this callback to respond to HTTP PATCH requests, see the `::http_post` HTTP POST plugin for more details. Returns `#SOAP_OK` or a `::soap_status` error code. The built-in function assigned to `::soap::fpatch` is the internal static function `http_patch` that returns the `#SOAP_PATCH_METHOD` error. @see `::http_post`. @param soap `::soap` context @returns `#SOAP_OK` or a `::soap_status` error code */ int (*fpatch)(struct soap *soap); /// Callback to implement logic at the server-side to serve responses to HTTP DELETE requests from clients /** @ingroup group_callbacks This callback is called by the service dispatcher when an HTTP DELETE request is pending. Redefine this callback to respond to HTTP DELETE requests, see the `::http_post` HTTP POST plugin for more details. Returns `#SOAP_OK` or a `::soap_status` (int) error code. The built-in function assigned to `::soap::fdel` is the internal static function `http_del` that returns the `#SOAP_DEL_METHOD` error. @see `::http_post`. @param soap `::soap` context @returns `#SOAP_OK` or a `::soap_status` error code */ int (*fdel)(struct soap *soap); /// Callback to implement logic at the server-side to serve responses to HTTP OPTION requests from clients /** @ingroup group_callbacks Called by the service dispatcher when an HTTP OPTION request is pending. Redefine this callback to respond to HTTP OPTION requests, see the `::http_post` HTTP POST plugin for more details. Returns `#SOAP_OK` or a `::soap_status` (int) error code. The built-in function assigned to `::soap::fopt` is the internal static function `http_200` that returns HTTP 200 OK. @param soap `::soap` context @returns `#SOAP_OK` or a `::soap_status` error code */ int (*fopt)(struct soap *soap); /// Callback to implement logic at the server-side to serve responses to HTTP HEAD requests from clients /** @ingroup group_callbacks This callback is called by the service dispatcher when an HTTP HEAD request is pending. Redefine this callback to respond to HTTP HEAD requests more specifically. Returns `#SOAP_OK` or a `::soap_status` (int) error code. The built-in function assigned to `::soap::fhead` is the internal static function `http_200` that returns HTTP 200 OK. @param soap `::soap` context @returns `#SOAP_OK` or a `::soap_status` error code */ int (*fhead)(struct soap *soap); /// Callback to implement logic at the server-side to handle HTML forms, such as done by the callbacks provided by the HTTP FORM handler plugin /** @ingroup group_callbacks This callback is called by the HTTP FORM handler plugin to parse HTML forms received with HTTP POST and PUT requests, see the `;:http_form` HTTP FORM plugin for more details. The HTTP body with the form data should be parsed by this callback, otherwise HTTP keep-alive messages will end up out of sync as a result of the current position not being advanced to the end of the HTTP body. Returns `#SOAP_OK` or a `::soap_status` (int) error code. No built-in function is assigned to `::soap::fform`. @param soap `::soap` context @returns `#SOAP_OK` or a `::soap_status` error code */ int (*fform)(struct soap *soap); /// Callback to inspect the SOAP Header received before the rest of the message with the SOAP Body is consumed /** @ingroup group_callbacks This callback is called immediately after parsing a SOAP Header into the `::soap::header` structure. The SOAP Header structure `::soap::header` can be inspected by this function and verified or rejected before the rest of the message with the SOAP Body is consumed. Returns `#SOAP_OK` or a `::soap_status` (int) error code. No built-in function is assigned to `::soap::fheader`. @see `::http_form`. @param soap `::soap` context @returns `#SOAP_OK` or a `::soap_status` error code */ int (*fheader)(struct soap *soap); /// Callback to catch unrecognized XML elements and overrides `#SOAP_XML_STRICT` validation errors for these /** @ingroup group_callbacks This callback is called when an unrecognized XML element was encountered on the input that could be ignored depending on some specified logic. The `tag` parameter is the offending XML element tag name string. The callback should return `#SOAP_OK` to ignore the element or return an `::soap_status` error code such as `#SOAP_TAG_MISMATCH` to trigger a validation error. This callback also overrides `mustUnderstand` attributes on unrecognized SOAP Header elements that normally raise faults. It is strongly recommended that the callback returns `#SOAP_MUSTUNDERSTAND` when `::soap::mustUnderstand` != `0`. Returns `#SOAP_OK` or a `::soap_status` (int) error code. No built-in function is assigned to `::soap::fignore`. @note This callback was not called in gSOAP versions prior to 2.8.54 when `#SOAP_XML_STRICT` is set. @par Example: ~~~{.cpp} int main() { struct soap *soap = soap_new(); soap->fignore = ignore; ... // } int ignore(struct soap *soap, const char *tag) { // do not ignore mustUnderstand="true" if (!soap->mustUnderstand) { // tags can be safely ignored if (soap_match_tag(soap, tag, "ns:someElement") == SOAP_OK) return SOAP_OK; } return SOAP_MUSTUNDERSTAND; } ~~~ @param soap `::soap` context @returns `#SOAP_OK` or a `::soap_status` error code */ int (*fignore)(struct soap *soap, const char *tag); /// Callback to validate strings against XML regex patterns /** @ingroup group_callbacks This callback is called to validate a string against an XML regex pattern. Patterns use XML schema regex syntax. This callback allows user-defined pattern validation that is normally disabled. Returns `#SOAP_OK` when the string matches the pattern or `#SOAP_TYPE` when the string does not match. No built-in function is assigned to `::soap::fsvalidate`. @param soap `::soap` context @param pattern regex in XML schema syntax @param string to match pattern against @returns `#SOAP_OK` (match) or `#SOAP_TYPE` (mismatch) or a `::soap_status` error code */ int (*fsvalidate)(struct soap *soap, const char *pattern, const char *string); /// Callback to validate wide strings against XML regex patterns /** @ingroup group_callbacks This callback is called to validate a wide string against an XML regex pattern. Patterns use XML schema regex syntax. This callback allows user-defined pattern validation that is normally disabled. Returns `#SOAP_OK` when the string matches the pattern or `#SOAP_TYPE` when the string does not match. No built-in function is assigned to `::soap::fwvalidate`. @param soap `::soap` context @param pattern regex in XML schema syntax @param string to match pattern against @returns `#SOAP_OK` (match) or `#SOAP_TYPE` (mismatch) or a `::soap_status` error code */ int (*fwvalidate)(struct soap *soap, const char *pattern, const wchar_t *string); /// Callback to inspect or override fault code or fault string messages /** @ingroup group_callbacks This callback is called by the engine when an error is raised to allow inspection or overriding of the fault code or fault string messages before the error is reported or transmitted. No built-in function is assigned to `::soap::fseterror`. @param soap `::soap` context @param faultcode pointer to a string with the fault code message or NULL, can be reassigned @param faultstring pointer to a string with the fault string message or NULL, can be reassigned */ void (*fseterror)(struct soap *soap, const char **faultcode, const char **faultstring); /// Callback that opens a socket connection to a server endpoint /** @ingroup group_callbacks This callback is called by the engine at the client-side by `::soap_connect` or `::soap_connect_command` to open a TCP or UDP connection to a server specified at an endpoint. Parameters `host` and `port` are micro-parsed from `endpoint` before being passed to `::soap::fopen`. Returns a valid socket or `#SOAP_INVALID_SOCKET` with a `::soap::error` set to a `::soap_status` (int) error code and `::soap::errnum` set to `errno` of the connection failure. The built-in function assigned to `::soap::fopen` is `tcp_connect`. @param soap `::soap` context @param endpoint URL of the endpoint to connect to (string) @param host URL host of the endpoint to connect to (string) @param port URL port of the endpoint to connect to (int) @returns `#SOAP_OK` or a `::soap_status` error code */ SOAP_SOCKET (*fopen)(struct soap *soap, const char *endpoint, const char *host, int port); /// Callback that waits for and accepts a socket connection requested by a client /** @ingroup group_callbacks This callback is called by `::soap_accept` (or the C++ service class `accept` method) to wait for and accept a socket connection requested by a client. Returns a valid socket or `#SOAP_INVALID_SOCKET` when an error occurred and sets `::soap::error` to a `::soap_status` value. The built-in function assigned to `::soap::faccept` is `tcp_accept`. @param soap `::soap` context @param sock master socket @param addr points to a `sockaddr` structure to be populated @param len points to the length of the `sockaddr` structure, the length may be reduced by the callback function with the actual size of the `sockaddr` structure populated @returns socket or `#SOAP_INVALID_SOCKET` if an error occurred */ SOAP_SOCKET (*faccept)(struct soap *soap, SOAP_SOCKET sock, struct sockaddr *addr, int *len); /// Callback that closes the current socket connection /** @ingroup group_callbacks This callback is called by the engine at the client-side to close the current socket connection before a new socket connection is established. This callback may be called multiple times (e.g. by the engine and by plugins) to close the same socket `::soap::socket`. Checks internally if `::soap::socket` == `#SOAP_INVALID_SOCKET` before closing, which means that the socket was already closed. Returns `#SOAP_OK` or a `::soap_status` (int) error code. The built-in function assigned to `::soap::fclose` is `tcp_disconnect`. @param soap `::soap` context @returns socket or `#SOAP_INVALID_SOCKET` if an error occurred */ int (*fclose)(struct soap *soap); /// Callback that resolves a host name by address translation /** @ingroup group_callbacks This callback is called by `::soap_bind` (or the C++ service class `bind` method) at the server-side and by `::soap_connect` or `::soap_connect_command` at the client-side with a host `name` parameter to resolve to address `inaddr` by address translation. When successful sets parameter `inaddr` and returns `#SOAP_OK` or a `::soap_status` (int) error code. The built-in function assigned to `::soap::fresolve` is `tcp_gethost`. @param soap `::soap` context @param name host name (string) @param inaddr points to in_addr structure to set @returns `#SOAP_OK` or a `::soap_status` error code */ int (*fresolve)(struct soap *soap, const char *name, struct in_addr *inaddr); /// Callback that overrides the client-side connecting operations /** @ingroup group_callbacks This callback is called by the engine to optionally override client-side connecting. The parameters `host` and `port` were micro-parsed from the `endpoint` prior to passing them to this callback. Returns `#SOAP_OK` or a `::soap_status` (int) error code. No built-in function is assigned to `::soap::fconnect`. @param soap `::soap` context @param endpoint URL of the endpoint connected to (string) @param host URL host of the endpoint connected to (string) @param port URL port of the endpoint connected to (int) @returns `#SOAP_OK` or a `::soap_status` error code */ int (*fconnect)(struct soap *soap, const char *endpoint, const char *host, int port); /// Callback that executes disconnect logic before closing /** @ingroup group_callbacks This callback is called by the engine `::soap_closesock` before the `::soap::fclose` callback is called to shutdown/disconnect. Returns `#SOAP_OK` or a `::soap_status` (int) error code. No built-in function is assigned to `::soap::fdisconnect`. @param soap `::soap` context @returns `#SOAP_OK` or a `::soap_status` error code */ int (*fdisconnect)(struct soap *soap); /// Callback that closes a given socket /** @ingroup group_callbacks This callback is called to close a socket by the engine. Returns `#SOAP_OK` or a `::soap_status` (int) error code. The built-in function assigned to `::soap::fclosesocket` is `tcp_closesocket`. @param soap `::soap` context @param sock socket to close @returns `#SOAP_OK` or a `::soap_status` error code */ int (*fclosesocket)(struct soap *soap, SOAP_SOCKET sock); /// Callback that shuts down a given socket /** @ingroup group_callbacks This callback is called to shut down a socket by the engine. Returns `#SOAP_OK` or a `::soap_status` (int) error code. The built-in function assigned to `::soap::fshutdownsocket` is `tcp_shutdownsocket`. @param soap `::soap` context @param sock socket to shut down @param how `SHUT_RD` (=0), `SHUT_WR` (=1) or `SHUT_RDWR` (=2) @returns `#SOAP_OK` or a `::soap_status` error code */ int (*fshutdownsocket)(struct soap *soap, SOAP_SOCKET sock, int how); /// Callback that blocks until activity is detected on the `::soap::socket` or `::soap::master` socket, times out when `::soap::send_timeout` or `::soap::recv_timeout` are set. /** @ingroup group_callbacks This callback is called by the engine to wait for activity on the `::soap::socket` or `::soap::master` socket using `poll` or `select`. Times out when `::soap::send_timeout` or `::soap::recv_timeout` are nonzero. Returns `#SOAP_OK` or a `::soap_status` (int) error code. The built-in function assigned to `::soap::fpoll` is `::soap_poll`. @param soap `::soap` context @returns `#SOAP_OK` or a `::soap_status` error code */ int (*fpoll)(struct soap *soap); /// Callback that receives bytes of data into the given buffer /** @ingroup group_callbacks This callback is called by the engine to receive (or read) data into a specified buffer `buf` and `len`. The source for the data to read by this callback is `::soap::is` when non-NULL, `::soap::socket` when valid, or `::soap::recvfd`. Returns `#SOAP_OK` or a `::soap_status` (int) error code. The built-in function assigned to `::soap::frecv` is `frecv`. @param soap `::soap` context @param buf buffer to fill with bytes to be read (string) @param len maximum size of the buffer (size_t) @returns the nonzero number of bytes that were placed in the buffer or 0 to indicate EOF was reached (size_t) */ size_t (*frecv)(struct soap *soap, char *buf, size_t len); /// Callback that sends the given bytes of data /** @ingroup group_callbacks This callback is called by the engine to send (or write) data specified by `data` bytes of length `len`. The sink for the data to be sent to is typically `::soap::socket`, `::soap::sendfd` or `::soap::os`. Returns `#SOAP_OK` or a `::soap_status` (int) error code. The built-in function assigned to `::soap::fsend` is `fsend`. @param soap `::soap` context @param data bytes to be send (string) @param len number of bytes to be send (size_t) @returns `#SOAP_OK` or a `::soap_status` error code */ int (*fsend)(struct soap *soap, const char *data, size_t len); /// Callback executed by the engine at the server side immediately after a server operation successfully completed /** @ingroup group_callbacks This callback is called after each successful completion of a server operation in the server loop. Executes immediately after sending the response to a client and before the next keep-alive server loop iteration when enabled with `#SOAP_IO_KEEPALIVE`. This callback can be used to reclaim resources in the keep-alive server loop, for example managed memory can be reclaimed by calling `::soap_destroy` and `::soap_end` in that order and all deserialized and other dynamically-allocated data managed by the context will be deallocated. Returns `#SOAP_OK` or a `::soap_status` (int) error code. No built-in function is assigned to `::soap::fserveloop`. @param soap `::soap` context @returns `#SOAP_OK` or a `::soap_status` error code */ int (*fserveloop)(struct soap *soap); /// Callback to override dynamic memory allocation and management /** @ingroup group_callbacks This callback can be used to override memory allocation and management done by `::soap_malloc` in C. Memory allocated via this callback will not be managed and not be automatically released by the engine. Instead, the application using this callback should release allocated memory. All allocations done by `::soap_malloc` are replaced with a call to `::soap::fmalloc`. However, no other allocations, such as `::soap_new` and `soap_new_T` for C++ classes, are affected. This callback is therefore not useful for C++ applications. Returns a pointer to dynamically allocated memory or NULL on failure to allocate. No built-in function is assigned to `::soap::fmalloc`. @warning Deprecated since 2.8.72. Define `#SOAP_MALLOC` and `#SOAP_FREE` instead. @param soap `::soap` context @param size number of bytes to allocate @returns pointer to allocated memory or NULL on failure to allocate (out of memory) */ void *(*fmalloc)(struct soap *soap, size_t size); /// Callback to open a streaming DIME attachment for reading /** @ingroup group_callbacks This callback is called by the engine to start sending a streaming DIME attachment. This callback opens a stream to start reading the attachment data to send. The actual data stream will be read in chunks using the `::soap::fdimeread` callback until no more data is available and the `::soap::fdimereadclose` callback is called to close the stream. The `handle` parameter contains the value of the `__ptr` member variable of the attachment struct/class with data (e.g. `::xsd__base64Binary` or `::_xop__Include` with `__ptr`, `__size`, `id`, `type` and `options` members), which should be a pointer to specific information such as a file descriptor or a pointer to a some application-specific data to be passed to this callback. Both the `__ptr` and `__size` members of the attachment struct/class should have been set by the application prior to the serialization of the message with attachments. If the `__size` is zero and HTTP chunking is enabled (with `#SOAP_IO_CHUNK`), then chunked DIME attachments are sent, see `::soap::fdimeread`. The `id`, `type` and `options` parameters are the `id` (optional ID), `type` (a MIME type) and `options` (DIME options are set with `::soap_dime_option`) of the attachment struct/class, respectively, of which at least one member should be non-NULL. The callback should return the `handle` parameter value or another pointer value, which is passed as the new `handle` parameter to `::soap::fdimeread` and `::soap::fdimereadclose` callbacks. When an error occurred in this callback, the callback should return NULL and set `::soap::error` to an error code, e.g. using `::soap_receiver_fault`. The callback may return NULL and set `::soap::error` to `#SOAP_OK` when this specific DIME attachment should not to be streamed and the engine will simply skip it. @par Example: ~~~{.cpp} void * dime_read_open(struct soap *soap, void *handle, const char *id, const char *type, const char *options) { return (void*)fopen((char*)handle, "rb"); } size_t dime_read(struct soap *soap, void *handle, char *buf, size_t len) { return fread(buf, 1, len, (FILE*)handle); } void dime_read_close(struct soap *soap, void *handle) { fclose((FILE*)handle); } struct soap *soap = soap_new(); soap->fdimereadopen = dime_read_open; soap->fdimeread = dime_read; soap->fdimereadclose = dime_read_close; struct _xop__Include data; // here we're using gsoap/import/xop.h to store a blob of raw data data.__ptr = "Picture.png"; // file name to open for streaming with dime_read_open data.__size = 1024; // file has 1024 bytes of data data.id = soap_strdup(soap, soap_rand_uuid(soap, "uuid:")); // attachment id (optional, can use NULL) data.type = "image/png"; // attachment type data.options = soap_dime_option(soap, 0, "Picture.png"); // DIME option 0 = "Picture.png" to store file name ... // add data to the message and then send it, which will stream the DIME attachment content from Picture.png ~~~ This mechanism also works for DIME attachments attached with `::soap_set_dime_attachment`. The maximum size of DIME attachments that the engine allows to be received is limited to `#SOAP_MAXDIMESIZE`. Increase this size as necessary. @see `#SOAP_ENC_DIME`. @param soap `::soap` context @param handle the value of the `__ptr` member variable of the attachment struct/class with data @param id the value of the `id` member variable of the attachment struct/class with data @param type the value of the `type` member variable of the attachment struct/class with data @param options the value of the `options` member variable of the attachment struct/class with data @returns a handle or NULL when an error occurred (`::soap::error` is nonzero) or when the attachment should be skipped (`::soap::error` is `#SOAP_OK`) */ void *(*fdimereadopen)(struct soap *soap, void *handle, const char *id, const char *type, const char *options); /// Callback to read data in a DIME attachment stream /** @ingroup group_callbacks This callback is called by the engine to read a chunk of attachment data to transmit. The `handle` parameter contains the handle returned by the `::soap::fdimereadopen` callback. The `buf` parameter is the buffer of length `len` into which a chunk of data should be written by the callback. The actual amount of data written into the buffer may be less than `len` and this actual amount should be returned by the callback. A return value of zero indicates an error and `::soap::error` should be set. The `__size` member variable of the attachment struct/class with data (e.g. `::xsd__base64Binary` or `::_xop__Include` with `__ptr`, `__size`, `id`, `type` and `options` members) should be set by the application prior to the serialization of the message with attachments. The value of `__size` indicates the total size of the attachment data to be transmitted. If the `__size` member variable is zero and HTTP chunking is enabled (with `#SOAP_IO_CHUNK`), then DIME chunked transfers are activated by the engine, which is more flexible since the attachment data size does not need to be determined in adance. To use DIME chunked transfers, enable HTTP chunking with `#SOAP_IO_CHUNK` (also `#SOAP_IO_STORE` can be used, but this buffers the entire message in memory before transmission) and set the `__size` member variable of the attachment struct/class to zero. When DIME attachment chunking is enabled, this callback should completely fill the `buf` buffer with `len` bytes unless the last data chunk is reached and fewer bytes are returned. @par Example: See the example provided with the documentation for `::soap::fdimereadopen`. To enable chunked DIME attachments, replace the last part of the example with: ~~~{.cpp} struct soap *soap = soap_new1(SOAP_IO_CHUNK); struct _xop__Include data; // here we're using gsoap/import/xop.h to store a blob of raw data data.__ptr = "Picture.png"; // file name to open for streaming with dime_read_open data.__size = 0; // zero size means chunked DIME attachments are sent data.id = soap_strdup(soap, soap_rand_uuid(soap, "uuid:")); // attachment id (optional, can use NULL) data.type = "image/png"; // attachment type data.options = soap_dime_option(soap, 0, "Picture.png"); // DIME option 0 = "Picture.png" to store file name ... // add data to the message and then send it, which will stream the DIME attachment content from Picture.png ~~~ @param soap `::soap` context @param handle the value of the handle returned by `::soap::fdimereadopen` @param buf buffer to fill @param len length of the buffer in bytes @returns the number of bytes written to the buffer */ size_t (*fdimeread)(struct soap *soap, void *handle, char *buf, size_t len); /// Callback to close a DIME attachment stream after reading /** @ingroup group_callbacks This callback is called by the engine to close the DIME attachment stream after reading. The `handle` parameter contains the handle returned by the `::soap::fdimereadopen` callback. See the examples provided with the documentation for `::soap::fdimereadopen` and `::soap::fdimeread`. @param soap `::soap` context @param handle the value of the of the handle returned by `::soap::fdimereadopen` */ void (*fdimereadclose)(struct soap *soap, void *handle); /// Callback to open a streaming DIME attachment for writing /** @ingroup group_callbacks Called by the to start receiving a streaming DIME attachment. This callback opens a stream to start writing the attachment data received. The actual data stream will be written in chunks using the `::soap::fdimewrite` callback until no more data is available and the `::soap::fdimewriteclose` callback is called to close the stream. The `id`, `type` and `options` parameters are the `id`, `type` and `options` of the attachment struct/class (e.g. `::xsd__base64Binary` or `::_xop__Include` with `__ptr`, `__size`, `id`, `type` and `options` members), respectively. The callback should return a handle, which is passed to the `::soap::fdimewrite` and `::soap::fdimewriteclose` callbacks. The `__ptr` member variable of the attachment struct/class is set by the engine to the value of this handle. The `__size` member variable is set to the size of the attachment received. The maximum DIME attachment size received is limited by `#SOAP_MAXDIMESIZE`. @par Example: ~~~{.cpp} void * dime_write_open(struct soap *soap, const char *id, const char *type, const char *options) { if (options) { FILE *handle = NULL; char *name; size_t len = ((unsigned char)options[2] << 8) | ((unsigned char)options[3]); // get option string length name = (char*)soap_malloc(soap, len + 1); strncpy(name, options + 4, len); // get file name from options (as an example) name[len] = '\0'; handle = fopen(name, "wb"); if (!handle) { soap->error = SOAP_EOF; // could not open file for writing soap->errnum = errno; // to report errno value return NULL; } } else { soap->error = soap_receiver_fault(soap, "Cannot save to file: no file name was present in the attachment", NULL); } return (void*)handle; } int dime_write(struct soap *soap, void *handle, const char *buf, size_t len) { while (len) { size_t nwritten = fwrite(buf, 1, len, (FILE*)handle); if (!nwritten) { soap->errnum = errno; return SOAP_EOF; } len -= nwritten; buf += nwritten; } return SOAP_OK; } void dime_write_close(struct soap *soap, void *handle) { fclose((FILE*)handle); } struct soap *soap = soap_new(); soap->fdimewriteopen = dime_write_open; soap->fdimewrite = dime_write; soap->fdimewriteclose = dime_write_close; ... // when a service responds to the client request with DIME attachment(s), the attachment data is saved via the callbacks ~~~ The maximum size of DIME attachments that the engine allows to be received is limited to `#SOAP_MAXDIMESIZE`. Increase this size as necessary. @param soap `::soap` context @param id the value of the `id` member variable of the attachment struct/class with data @param type the value of the `type` member variable of the attachment struct/class with data @param options the value of the `options` member variable of the attachment struct/class with data @returns a handle or NULL when an error occurred (`::soap::error` should be nonzero) */ void *(*fdimewriteopen)(struct soap *soap, const char *id, const char *type, const char *options); /// Callback to write data in a DIME attachment stream /** @ingroup group_callbacks This callback is called by the engine to write a chunk of attachment data received. The `handle` parameter contains the handle returned by the `::soap::fdimewriteopen` callback. The `buf` parameter contains the data of length `len`. Returns `#SOAP_OK` or a `::soap_status` (int) error code. @param soap `::soap` context @param handle the value of the handle returned by `::soap::fdimewriteopen` @returns `#SOAP_OK` or a `::soap_status` error code */ int (*fdimewrite)(struct soap *soap, void*, const char*, size_t); /// Callback to close a DIME attachment stream after writing /** @ingroup group_callbacks This callback is called by the engine to close the DIME attachment stream after writing. The `handle` parameter contains the handle returned by the `::soap::fdimewriteopen` callback. @param soap `::soap` context @param handle the value of the of the handle returned by `::soap::fdimewriteopen` */ void (*fdimewriteclose)(struct soap *soap, void *handle); /// Callback to open a streaming MIME/MTOM attachment for reading /** @ingroup group_callbacks This callback is called by the engine to start sending a streaming MIME/MTOM attachment. This callback opens a stream to start reading the attachment data to send. The actual data stream will be read in chunks using the `::soap::fmimeread` callback until no more data is available and the `::soap::fmimereadclose` callback is called to close the stream. The `handle` parameter contains the value of the `__ptr` member variable of the attachment struct/class with data (e.g. `::xsd__base64Binary` or `::_xop__Include` with `__ptr`, `__size`, `id`, `type` and `options` members), which should be a pointer to specific information such as a file descriptor or a pointer to a some application-specific data to be passed to this callback. Both the `__ptr` and `__size` members of the attachment struct/class should have been set by the application prior to the serialization of the message with attachments. If the `__size` is zero and HTTP chunking is enabled (with `#SOAP_IO_CHUNK`), then chunked MIME/MTOM attachments are sent, see `::soap::fmimeread`. The `id`, `type` and `options` parameters are the `id` (an optional ID), `type` (a MIME type) and `options` (a descriptive string) of the attachment struct/class, respectively, of which at least one member should be non-NULL. The callback should return the `handle` parameter value or another pointer value, which is passed as the new `handle` parameter to `::soap::fmimeread` and `::soap::fmimereadclose` callbacks. When an error occurred in this callback, the callback should return NULL and set `::soap::error` to an error code, e.g. using `::soap_receiver_fault`. The callback may return NULL and set `::soap::error` to `#SOAP_OK` when this specific MIME/MTOM attachment should not to be streamed and the engine will simply skip it. @par Example: ~~~{.cpp} void * mime_read_open(struct soap *soap, void *handle, const char *id, const char *type, const char *options) { return (void*)fopen((char*)handle, "rb"); } size_t mime_read(struct soap *soap, void *handle, char *buf, size_t len) { return fread(buf, 1, len, (FILE*)handle); } void mime_read_close(struct soap *soap, void *handle) { fclose((FILE*)handle); } struct soap *soap = soap_new1(SOAP_ENC_MTOM); soap->fmimereadopen = mime_read_open; soap->fmimeread = mime_read; soap->fmimereadclose = mime_read_close; struct _xop__Include data; // here we're using gsoap/import/xop.h to store a blob of raw data data.__ptr = "Picture.png"; // file name to open for streaming with mime_read_open data.__size = 1024; // file has 1024 bytes of data data.id = soap_strdup(soap, soap_rand_uuid(soap, "uuid:")); // attachment id (optional, can use NULL) data.type = "image/png"; // attachment type data.options = "Picture.png"; // we store the file name with the attachment description ... // add data to the message and then send it, which will stream the MIME/MTOM attachment content from Picture.png ~~~ To enable chunked MIME/MTOM attachments, replace the last part of the example with: ~~~{.cpp} struct soap *soap = soap_new1(SOAP_IO_CHUNK); struct _xop__Include data; // here we're using gsoap/import/xop.h to store a blob of raw data data.__ptr = "Picture.png"; // file name to open for streaming with dime_read_open data.__size = 0; // zero size means chunked MIME/MTOM attachments are sent data.id = soap_strdup(soap, soap_rand_uuid(soap, "uuid:")); // attachment id (optional, can use NULL) data.type = "image/png"; // attachment type data.options = "Picture.png"; // we store the file name with the attachment description ... // add data to the message and then send it, which will stream the MIME/MTOM attachment content from Picture.png ~~~ This mechanism also works for MIME/MTOM attachments that are explicitly attached with `::soap_set_mime_attachment`. @see `#SOAP_ENC_MIME`, `#SOAP_ENC_MTOM`, `::soap_set_mime_attachment`. @param soap `::soap` context @param handle the value of the `__ptr` member variable of the attachment struct/class with data @param id the value of the `id` member variable of the attachment struct/class with data @param type the value of the `type` member variable of the attachment struct/class with data @param options the value of the `options` member variable of the attachment struct/class with data @returns a handle or NULL when an error occurred (`::soap::error` is nonzero) or when the attachment should be skipped (`::soap::error` is `#SOAP_OK`) */ void *(*fmimereadopen)(struct soap *soap, void*, const char*, const char*, const char*); /// Callback to read data in a MIME/MTOM attachment stream /** @ingroup group_callbacks This callback is called by the engine to read a chunk of attachment data to transmit. The `handle` parameter contains the handle returned by the `::soap::fmimereadopen` callback. The `buf` parameter is the buffer of length `len` into which a chunk of data should be written by the callback. The actual amount of data written into the buffer may be less than `len` and this actual amount should be returned by the callback. A return value of zero indicates an error and `::soap::error` should be set. The `__size` member variable of the attachment struct/class with data (e.g. `::xsd__base64Binary` or `::_xop__Include` with `__ptr`, `__size`, `id`, `type` and `options` members) should be set by the application prior to the serialization of the message with attachments. The value of `__size` indicates the total size of the attachment data to be transmitted. If the `__size` member variable is zero and HTTP chunking is enabled (with `#SOAP_IO_CHUNK`), then MIME/MTOM chunked transfers are activated by the engine, which is more flexible since the attachment data size does not need to be determined in advance. To use MIME/MTOM chunked transfers, enable HTTP chunking with `#SOAP_IO_CHUNK` (also `#SOAP_IO_STORE` can be used, but this buffers the entire message in memory before transmission) and set the `__size` member variable of the attachment struct/class to zero. When MIME/MTOM attachment chunking is enabled, this callback should completely fill the `buf` buffer with `len` bytes unless the last data chunk is reached and fewer bytes are returned. @see The example provided with the documentation for `::soap::fmimereadopen`. @param soap `::soap` context @param handle the value of the handle returned by `::soap::fmimereadopen` @param buf buffer to fill @param len length of the buffer in bytes @returns the number of bytes written to the buffer */ size_t (*fmimeread)(struct soap *soap, void *handle, char *buf, size_t len); /// Callback to close a MIME/MTOM attachment stream after reading /** @ingroup group_callbacks This callback is called by the engine to close the MIME/MTOM attachment stream after reading. The `handle` parameter contains the handle returned by the `::soap::fmimereadopen` callback. @see The example provided with the documentation for `::soap::fmimereadopen`. @param soap `::soap` context @param handle the value of the of the handle returned by `::soap::fmimereadopen` */ void (*fmimereadclose)(struct soap *soap, void *handle); /// Callback to open a streaming MIME/MTOM attachment for writing /** @ingroup group_callbacks Called by the to start receiving a streaming MIME/MTOM attachment. This callback opens a stream to start writing the attachment data received. The actual data stream will be written in chunks using the `::soap::fmimewrite` callback until no more data is available and the `::soap::fmimewriteclose` callback is called to close the stream. The `id`, `type` and `options` parameters are the `id`, `type` and `options` of the attachment struct/class (e.g. `::xsd__base64Binary` or `::_xop__Include` with `__ptr`, `__size`, `id`, `type` and `options` members), respectively. The callback should return a handle, which is passed to the `::soap::fmimewrite` and `::soap::fmimewriteclose` callbacks. The `__ptr` member variable of the attachment struct/class is set by the engine to the value of this handle. The `__size` member variable is set to the size of the attachment received. @par Example: ~~~{.cpp} void * mime_write_open(struct soap *soap, const char *id, const char *type, const char *options) { if (options) { FILE *handle = NULL; char *name; size_t len = ((unsigned char)options[2] << 8) | ((unsigned char)options[3]); // get option string length name = (char*)soap_malloc(soap, len + 1); strncpy(name, options + 4, len); // get file name from options (as an example) name[len] = '\0'; handle = fopen(name, "wb"); if (!handle) { soap->error = SOAP_EOF; // could not open file for writing soap->errnum = errno; // to report errno value return NULL; } } else { soap->error = soap_receiver_fault(soap, "Cannot save to file: no file name was present in the attachment", NULL); } return (void*)handle; } int mime_write(struct soap *soap, void *handle, const char *buf, size_t len) { while (len) { size_t nwritten = fwrite(buf, 1, len, (FILE*)handle); if (!nwritten) { soap->errnum = errno; return SOAP_EOF; } len -= nwritten; buf += nwritten; } return SOAP_OK; } void mime_write_close(struct soap *soap, void *handle) { fclose((FILE*)handle); } struct soap *soap = soap_new(); soap->fmimewriteopen = mime_write_open; soap->fmimewrite = mime_write; soap->fmimewriteclose = mime_write_close; ... // when a service responds to the client request with MIME/MTOM attachment(s), the attachment data is saved via the callbacks ~~~ @param soap `::soap` context @param id the value of the `id` member variable of the attachment struct/class with data @param type the value of the `type` member variable of the attachment struct/class with data @param options the value of the `options` member variable of the attachment struct/class with data @returns a handle or NULL when an error occurred (`::soap::error` should be nonzero) */ void *(*fmimewriteopen)(struct soap *soap, void *handle, const char *id, const char *type, const char *description, enum soap_mime_encoding encoding); /// Callback to write data in a MIME attachment stream /** @ingroup group_callbacks This callback is called by the engine to write a chunk of attachment data received. The `handle` parameter contains the handle returned by the `::soap::fmimewriteopen` callback. The `buf` parameter contains the data of length `len`. Returns `#SOAP_OK` or a `::soap_status` (int) error code. @param soap `::soap` context @param handle the value of the handle returned by `::soap::fmimewriteopen` @returns `#SOAP_OK` or a `::soap_status` error code */ int (*fmimewrite)(struct soap *soap, void *handle, const char *buf, size_t len); /// Callback to close a MIME/MTOM attachment stream after writing /** @ingroup group_callbacks This callback is called by the engine to close the MIME/MTOM attachment stream after writing. The `handle` parameter contains the handle returned by the `::soap::fmimewriteopen` callback. @param soap `::soap` context @param handle the value of the of the handle returned by `::soap::fmimewriteopen` */ void (*fmimewriteclose)(struct soap *soap, void *handle); /// Callback to initialize the OpenSSL library /** @ingroup group_callbacks This callback is called to initialize the OpenSSL or GNUTLS context for HTTPS connections configured with the parameters passed to `::soap_ssl_client_context` and `::soap_ssl_server_context`. Returns `#SOAP_OK` or a `::soap_status` (int) error code. The built-in function assigned to `::soap::fsslauth` is `ssl_auth_init`. @param soap `::soap` context @returns `#SOAP_OK` or a `::soap_status` error code */ int (*fsslauth)(struct soap *soap); /// Callback to manage the verification of the certificate provided by a peer (typically a server) /** @ingroup group_callbacks This callback is called by the engine to manage the verification of the certificate provided by a peer, such as the certificate provided by a server connected over HTTPS or to verify the certificate included with a WS-Security message. To require certificate verification of a server connected via HTTPS, use `::soap_ssl_client_context` with `#SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION`. To require certificate verification of a client connected to a server, use `::soap_ssl_server_context` with `#SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION`. The `ok` parameter of this callback indicates whether the verification of the certificate in question passed (`ok` == 1) or failed (`ok` == 0) as determined by the OpenSSL library based on the `::soap_ssl_client_context` or `::soap_ssl_server_context` configuration. If the callback returns 1 then the handshake is continued and the connection maybe established. To return 1 when `ok` == 0 requires resetting the error state with `X509_STORE_CTX_set_error(store, X509_V_OK)`. If the callback returns 0 then the handshake is immediately terminated with "verification failed" and a verification failure alert is sent to the peer. The built-in function assigned to `::soap::fsslverify` is `ssl_verify_callback` or when `#SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE` is used `ssl_verify_callback_allow_expired_certificate`. @par Example: ~~~{.cpp} int ssl_verify_callback_allow_self_signed_cert(int ok, X509_STORE_CTX *store) { if (!ok && X509_STORE_CTX_get_error(store) == X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN) { X509_STORE_CTX_set_error(store, X509_V_OK); ok = 1; } return ok; } struct soap *soap = soap_new(); soap->fsslverify = ssl_verify_callback_allow_self_signed_cert; ~~~ @param ok when 1: the certificate passed, when 0: the certificate did not pass @returns 1 to pass and 0 to fail @see '::soap_ssl_client_context`. */ int (*fsslverify)(int ok, X509_STORE_CTX *store); }; /// Allocate and initialize a new `::soap` context /** This function allocates and initializes a new context. There is no need to call `::soap_init` to initialize the context allocated with `::soap_new`, since `::soap_new` initializes the allocated context. To change the input/output mode flags, use `::soap_set_mode` and `::soap_clr_mode`. @note C++ proxy and service classes generated by `soapcpp2 -j` option `-j` or option `-i` have an internal `::soap` context that is either a base class (option `-i`) or a member variable pointing to a `::soap` context (option `-j`). The C++ proxy and service classes allocate and deallocate this context, which means that `::soap_new` and `::soap_free` are not required. For example: ~~~{.cpp} #include "soapexampleProxy.h" exampleProxy proxy(SOAP_XML_INDENT); ... // use proxy or proxy.soap (option -j) proxy.destroy(); // delete managed C++ objects and memory ~~~ ~~~{.cpp} #include "soapexampleService.h" exampleService service(SOAP_XML_INDENT); ... // use service or service.soap (option -j) service.destroy(); // delete managed C++ objects and memory ~~~ @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); ... // send and receive messages etc. soap_destroy(soap); // delete managed C++ objects soap_end(soap); // delete managed memory soap_free(soap); // free the context ~~~ @see `::soap_new1`, `::soap_new2`, `::soap_copy`, `::soap_destroy`, `::soap_end`, `::soap_free`. */ struct soap *soap_new() /// @returns pointer to allocated and initialized `::soap` context or NULL when out of heap memory ; /// Allocate and initialize a new `::soap` context with input and output `::soap_mode` flags /** This function allocates and initializes a new context with the specified input and output `::soap_mode` flags. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_XML_INDENT); ... // send and receive messages etc. soap_destroy(soap); // delete managed C++ objects soap_end(soap); // delete managed memory soap_free(soap); // free the context ~~~ @note There is no need to call `::soap_init` to initialize the context allocated with `::soap_new1`. To change the input/output mode flags, use `::soap_set_mode` and `::soap_clr_mode`. @see `::soap_new`, `::soap_new2`, `::soap_copy`, `::soap_destroy`, `::soap_end`, `::soap_free`. */ struct soap *soap_new1(soap_mode input_and_output_mode) ///< input and output `::soap_mode` flags /// @returns pointer to allocated and initialized `::soap` context or NULL when out of heap memory ; /// Allocate and initialize a new `::soap` context with separate input and output `::soap_mode` flags /** This function allocates and initializes a new context with the specified input and output `::soap_mode` flags. The separation of input and output mode flags is only useful for the `::SOAP_XML_TREE` flag that affects both input and output behaviors. @note There is no need to call `::soap_init` to initialize the context allocated with `::soap_new2`. @see `::soap_new`, `::soap_new1`, `::soap_copy`, `::soap_destroy`, `::soap_end`, `::soap_free`. */ struct soap *soap_new2( soap_mode input_mode, ///< input `::soap_mode` flags soap_mode output_mode) ///< output `::soap_mode` flags /// @returns pointer to allocated and initialized `::soap` context or NULL when out of heap memory ; /// Initialize a stack-allocated `::soap` context /** This function initializes a context. @par Examples: ~~~{.cpp} #include "soapH.h" struct soap soap; soap_init(&soap); ... // send and receive messages etc. soap_destroy(&soap); // delete managed C++ objects soap_end(s&oap); // delete managed memory soap_done(&soap); // finalize the context ~~~ The context can be re-initialized for reuse after `::soap_done` by calling `::soap_init`. @note Initialization should be done at most once before calling `::soap_done`. To change the input/output mode flags, use `::soap_set_mode` and `::soap_clr_mode`. @see `::soap_init1`, `::soap_new`, `::soap_copy`, `::soap_destroy`, `::soap_end`, `::soap_done`. */ void soap_init(struct soap *soap) ///< `::soap` context to initialize ; /// Initialize a stack-allocated `::soap` context with input and output `::soap_mode` flags /** This function initializes a context with the specified input and output `::soap_mode` flags. @par Examples: ~~~{.cpp} #include "soapH.h" struct soap soap; soap_init1(&soap, SOAP_XML_INDENT); ... // send and receive messages etc. soap_destroy(&soap); // delete managed C++ objects soap_end(s&oap); // delete managed memory soap_done(&soap); // finalize the context ~~~ The context can be re-initialized for reuse after `::soap_done` by calling `::soap_init`. @note Initialization should be done at most once before calling `::soap_done`. To change the input/output mode flags, use `::soap_set_mode` and `::soap_clr_mode`. @see `::soap_init`, `::soap_new`, `::soap_copy`, `::soap_destroy`, `::soap_end`, `::soap_done`. */ void soap_init1( struct soap *soap, ///< `::soap` context to initialize soap_mode input_and_output_mode) ///< input and output `::soap_mode` flags ; /// Initialize a stack-allocated `::soap` context with input and output `::soap_mode` flags /** This function initializes a context with the specified input and output `::soap_mode` flags. @note Initialization should be done at most once before calling `::soap_done`. To change the input/output mode flags, use `::soap_set_mode` and `::soap_clr_mode`. @see `::soap_init`, `::soap_new`, `::soap_copy`, `::soap_destroy`, `::soap_end`, `::soap_done`. */ void soap_init2( struct soap *soap, ///< `::soap` context to initialize soap_mode input_mode, ///< input `::soap_mode` flags soap_mode output_mode) ///< output `::soap_mode` flags ; /// Set input and output `::soap_mode` flags of the given `::soap` context void soap_set_mode( struct soap *soap, ///< `::soap` context soap_mode input_and_output_mode) ///< input and output `::soap_mode` flags ; /// Set input `::soap_mode` flags of the given `::soap` context void soap_set_imode( struct soap *soap, ///< `::soap` context soap_mode input_mode) ///< input `::soap_mode` flags ; /// Set output `::soap_mode` flags of the given `::soap` context void soap_set_omode( struct soap *soap, ///< `::soap` context soap_mode output_mode) ///< output `::soap_mode` flags ; /// Clear input and output `::soap_mode` flags of the given `::soap` context void soap_clr_mode( struct soap *soap, ///< `::soap` context soap_mode input_and_output_mode) ///< input and output `::soap_mode` flags ; /// Clear input `::soap_mode` flags of the given `::soap` context void soap_clr_imode( struct soap *soap, ///< `::soap` context soap_mode input_mode) ///< input `::soap_mode` flags ; /// Clear output `::soap_mode` flags of the given `::soap` context void soap_clr_omode( struct soap *soap, ///< `::soap` context soap_mode output_mode) ///< output `::soap_mode` flags ; /// Allocate and initialize a new `::soap` context as a copy of the given `::soap` context /** This function allocates a new context and copies the state of the specified context except for the heap-allocated data managed by the specified context. After the copy the contexts do not share any data and can therefore be used by separate threads without requiring synchronization or mutex locking. @note C++ proxy and service classes generated by `soapcpp2 -j` option `-j` or option `-i` have an internal `::soap` context that is either a base class (option `-i`) or a member variable pointing to a `::soap` context (option `-j`). For convenience, use the `copy` member function instead of `::soap_copy` and delete the copied instance with `delete`. For example: ~~~{.cpp} #include "soapexampleService.h" // generated by soapcpp2 option -j int main() { exampleService service(SOAP_XML_INDENT); service.soap->bind_flags = SO_REUSEADDR; // immediate port reuse service.soap->accept_timeout = 3600; // let soap_accept time out after 1 hour ... // further initialize service.soap if (soap_valid_socket(service.bind(NULL, PORTNUM, BACKLOG))) { while (1) { if (soap_valid_socket(service.accept())) { THREAD_TYPE tid; exampleService *tservice = service.copy(); if (!tservice) soap_closesock(service.soap); else while (THREAD_CREATE(&tid, (void*(*)(void*))&process_request, (void*)tservice)) sleep(1); // failed, try again } else if (service.soap->errnum) // accept failed, try again after 1 second { service.soap_print_fault(stderr); sleep(1); } else // accept timed out, quit looping { break; } service.destroy(); } } } void *process_request(exampleService *service) { THREAD_DETACH(THREAD_ID); service.serve(); service.destroy(); delete service; return NULL; } ~~~ @par Example: ~~~{.cpp} #include "soapH.h" #include "plugin/threads.h" int main() { struct soap *soap = soap_new1(SOAP_XML_INDENT); soap->bind_flags = SO_REUSEADDR; // immediate port reuse soap->accept_timeout = 3600; // exit loop when no request arrives in one hour soap->send_timeout = soap_recv_timeout = 5; // 5 seconds max socket stall time (unlimited by default) soap->transfer_timeout = 30; // 30 seconds max message transfer time (unlimited by default) soap->recv_maxlength = 1048576; // limit messages received to 1MB (2GB by default) if (soap_valid_socket(soap_bind(soap, NULL, PORTNUM, BACKLOG))) { while (1) { if (soap_valid_socket(soap_accept(soap))) { THREAD_TYPE tid; struct soap *tsoap = soap_copy(soap); if (!tsoap) soap_force_closesock(soap); else while (THREAD_CREATE(&tid, (void*(*)(void*))&process_request, (void*)tsoap)) sleep(1); // failed, try again } else // accept failed, try again after 1 second { soap_print_fault(soap, stderr); sleep(1); } else // accept timed out, quit looping { break; } soap_destroy(soap); soap_end(soap); } } soap_free(soap); } void *process_request(struct soap *soap) { THREAD_DETACH(THREAD_ID); soap_serve(soap); soap_destroy(soap); soap_end(soap); soap_free(soap); return NULL; } ~~~ @see `::soap_copy_context`, `::soap_copy_stream`, `::soap_free_stream`, `::soap_delegate_deletion`, `::soap_destroy`, `::soap_end`, `::soap_free`. */ struct soap *soap_copy(struct soap *soap) ///< `::soap` context to copy /// @returns pointer to allocated and initialized `::soap` context or NULL when out of heap memory ; /// Copy a given `::soap` context to an uninitialized destination `::soap` context /** This function copies the state of the specified context to another uninitialized context (i.e. overriding it). If the destination context is initialized or active then call `::soap_done` first to clean it up before overriding it. The entire state is copied except for the heap-allocated data managed by the specified context. After the copy the contexts do not share any data and can therefore be used by separate threads without requiring synchronization or mutex locking. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); ... // send and receive messages etc. struct soap temp; soap_copy_context(&temp, soap); ... ~~~ @see `::soap_copy`, `::soap_copy_stream`, `::soap_free_stream`, `::soap_delegate_deletion`, `::soap_destroy`, `::soap_end`, `::soap_free`. */ void soap_copy_context( struct soap *soap_destination, ///< destination `::soap` context to initialize struct soap *soap_source) ///< source `::soap` context to copy ; /// Copy the input/output stream state of the given `::soap` context to another context /** This function copies the input/output state of the specified source context to the specified destination context. Both contexts will share the same input/output streams , i.e. `::soap::is`, `::soap::os`, `::soap::socket`, `::soap::recvfd` and `::soap::sendfd` are shared and the current message buffer `::soap::buf` content is copied. The destination context is set to the source context `::soap_mode` flags and timeouts. To move the input/output state of one context to another, use this function and then call `::soap_free_stream` on the source context to clear its input/output state. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); struct soap *temp = soap_new(); ... // send and receive messages etc. // move the input/output state to another context soap_copy_stream(temp, soap); soap_free_stream(soap); soap_closesock(soap); // has no effect ... // send and receive messages etc. soap_closesock(temp); // closes socket, if open ~~~ @see `::soap_free_stream`. */ void soap_copy_stream( struct soap *soap_destination, ///< destination `::soap` context struct soap *soap_source) ///< source `::soap` context ; /// Free the input/output stream state of the given `::soap` context /** @see `::soap_copy_stream`. */ void soap_free_stream(struct soap *soap) ///< `::soap` context ; /// Finalize and free the given `::soap` context from unmanaged heap memory /** This function finalizes and frees the specified context. The finalization is done with `::soap_done` before releasing its memory. This function does not free memory managed by the context. To free memory managed by the context use `::soap_destroy` and `::soap_end`, or `::soap::destroy` to call both. @note C++ proxy and service classes generated by `soapcpp2 -j` option `-j` or option `-i` have an internal `::soap` context that is either a base class (option `-i`) or a member variable pointing to a `::soap` context (option `-j`). The C++ proxy and service classes allocate and deallocate this context, which means that `::soap_new` and `::soap_free` are not required. For example: ~~~{.cpp} #include "soapexampleProxy.h" exampleProxy proxy(SOAP_XML_INDENT); ... // use proxy or proxy.soap (option -j) proxy.destroy(); // delete managed C++ objects and memory ~~~ ~~~{.cpp} #include "soapexampleService.h" exampleService service(SOAP_XML_INDENT); ... // use service or service.soap (option -j) service.destroy(); // delete managed C++ objects and memory ~~~ @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); ... // send and receive messages etc. soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~ @see `::soap_new`, `::soap_new1`, `::soap_new2`, `::soap_done`, `::soap_destroy`, `::soap_end`, `::soap::destroy`. */ void soap_free(struct soap *soap) ///< `::soap` context to free ; /// Finalize the given `::soap` context, i.e. when the `::soap` context is stack allocated, automatically invoked in C++ by the `::soap` destructor on the `::soap` context to delete /** This function finalizes the specified context. This function does not free memory managed by the context. To free memory managed by the context use `::soap_destroy` and `::soap_end`, or `::soap::destroy` to call both. @par Example: ~~~{.cpp} #include "soapH.h" struct soap soap; soap_init(&soap); ... // send and receive messages etc. soap_destroy(&soap); soap_end(&soap); soap_done(&soap); ~~~ @see `::soap_free`, `::soap_destroy`, `::soap_end`, `::soap::destroy`. */ void soap_done(struct soap *soap) ///< `::soap` context to finalize ; /// Allocate a block of heap memory managed by the specified `::soap` context /** This function allocates a block of memory from the heap managed by the specified `::soap` context. All such blocks allocated are deleted with a single call to `::soap_end`. Returns a pointer to the allocated block of memory or NULL when out of memory without setting `::soap::error`. @note The soapcpp2 tool generates `soap_new_T` functions for all serialiable types `T`. The `soap_new_T` functions allocate and default initializes the type `T` or an array of items of type `T`. Recommended is to use these more powerful `soap_new_T` functions instead of `::soap_malloc`. For example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); struct ns__someElement *data = soap_new_ns__someElement(soap); // allocate managed object struct ns__someElement *array = soap_new_ns__someElement(soap, 100); // allocate array of 100 managed objects ... // send and receive messages etc. soap_destroy(soap); // deletes data, array, and other managed C++ objects soap_end(soap); // delete managed memory soap_free(soap); // free the context ~~~ The soapcpp2 tool also generates `soap_default_T` functions to default initialize the type `T`. For example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); struct ns__someElement data; soap_default_ns__someElement(soap, &data); // default initializes all public members ... ~~~ but objects of classes should use their `soap_default` method instead of the `soap_default_T` function. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); char *s = (char*)soap_malloc(soap, 80); // allocate 80 bytes of memory managed by the context strcpy(s, "Hello"); // copy a string into it ... // send and receive messages etc. soap_destroy(soap); // delete managed C++ objects soap_end(soap); // delete managed memory soap_free(soap); // free the context ~~~ @see `::soap_strdup`, `::soap_wstrdup`, `::soap_unlink`, `::soap_delegate_deletion`, `::soap_destroy`, `::soap_end`, and the [C and C++ XML data bindings](../../databinding/html/index.html) documentation. */ void * soap_malloc( struct soap *soap, ///< `::soap` context size_t len) ///< length of the block to allocate in number of bytes /// @returns pointer to the allocated block of memory or NULL on failure to allocate (out of memory) ; /// Copy a string to managed memory /** This function copies the specified wide string to memory managed by the specified context. Returns a copy of the string or NULL when the specified string is NULL or when the function failed to allocate memory. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); // allocate and assign a string in memory managed by the context char *s = soap_strdup(soap, "Hello"); ... // send and receive messages etc. soap_destroy(soap); // delete managed C++ objects soap_end(soap); // delete managed memory soap_free(soap); // free the context ~~~ @see `::soap_malloc`, `::soap_wstrdup`, `::soap_unlink`, `::soap_delegate_deletion`, `::soap_destroy`, `::soap_end`. */ char * soap_strdup( struct soap *soap, ///< `::soap` context const char *string) ///< string to copy to managed memory /// @returns copy of string or NULL when the specified string is NULL or on failure to allocate (out of memory) ; /// Copy a wide string to managed memory /** This function copies the specified wide string to managed memory. Returns a copy of the wide string or NULL when the specified wide string is NULL or when the function failed to allocate memory. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); // allocate and assign a wide string in memory managed by the context wchar_t *s = soap_wstrdup(soap, L"Hello"); ... // send and receive messages etc. soap_destroy(soap); // delete managed C++ objects soap_end(soap); // delete managed memory soap_free(soap); // free the context ~~~ @see `::soap_malloc`, `::soap_strdup`, `::soap_unlink`, `::soap_delegate_deletion`, `::soap_destroy`, `::soap_end`. */ wchar_t * soap_wstrdup( struct soap *soap, ///< `::soap` context const wchar_t *string) ///< wide string to copy to managed memory or NULL /// @returns copy of wide string or NULL when the specified wide string is NULL or on failure to allocate (out of memory) ; /// Unlink a block of heap memory managed by the specified `::soap` context, to release the memory explicitly later /** This function removes a managed block of memory from the managing `::soap` context. This memory is not released but rather should be released explicitly later by the application logic using `free` or `delete`. Returns `#SOAP_OK` when successful or `#SOAP_ERR` when the block is not managed by the specified context. */ int soap_unlink( struct soap *soap, ///< `::soap` context const void *ptr) ///< pointer to the block of managed heap memory to unlink /// @returns `#SOAP_OK` when successful or `#SOAP_ERR` when the block is not managed by the specified context ; /// Delete all dynamically-allocated C++ objects managed by the specified `::soap` context /** This function deletes all dynamically-allocated C++ objects managed by the specified `::soap` context, i.e. data allocated with `soap_new_T` calls. This call should be followed by `::soap_end` to delete all other dynamically-allocated data managed by the `::soap` context. Or just invoke `::soap::destroy` to delete objects and data and release the freed memory back to the heap. @note C++ proxy and service classes generated by `soapcpp2 -j` option `-j` or option `-i` have an internal `::soap` context that is either a base class (option `-i`) or a member variable pointing to a `::soap` context (option `-j`). For convenience, use the `destroy` member function instead of `::soap_destroy` and `::soap_end`. For example: ~~~{.cpp} #include "soapexampleProxy.h" exampleProxy proxy(SOAP_XML_INDENT); ... // use proxy or proxy.soap (option -j) proxy.destroy(); // delete managed C++ objects and memory ~~~ ~~~{.cpp} #include "soapexampleService.h" exampleService service(SOAP_XML_INDENT); ... // use service or service.soap (option -j) service.destroy(); // delete managed C++ objects and memory ~~~ @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); ... // send and receive messages etc. soap_destroy(soap); // delete managed C++ objects soap_end(soap); // delete managed memory soap_free(soap); // free the context ~~~ @see `::soap_malloc`, `::soap_end`, `::soap::destroy`. */ void soap_destroy(struct soap *soap) ///< `::soap` context ; /// Explicitly dealllocates a block of managed memory that is managed by the specified `::soap` context and release the free memory back to the heap /** This function deallocates a managed block of memory from the managing `::soap` context and releases the free memory back to the heap. This frees data allocated with `::soap_malloc` and C++ objects allocated and instantiated with the `soap_new_T` functions. Normally this function should not be used to individually deallocate managed objects and data but rather `::soap_destroy` and `::soap_end` should be used to deallocate all objects and data managed by the context, which is much more efficient. */ void soap_dealloc( struct soap *soap, ///< `::soap` context void *ptr) ///< pointer to the block of managed heap memory to deallocate ; /// Delete temporary data /** This function deallocates temporary data such as buffers and hash tables but leaves deserialized managed data intact. */ void soap_free_temp(struct soap *soap) ///< `::soap` context ; /// Delete all data from heap memory managed by the specified `::soap` context and release the freed memory back to the heap /** This function deletes all dynamically-allocated data managed by the specified `::soap` context, i.e. data allocated with `::soap_malloc`. This call suffices to delete all managed data from C applications and release the freed memory back to the heap. C++ applications however should call `::soap_destroy` first before `::soap_end` or just invoke `::soap::destroy` (or C++ proxy and service class member function `destroy`) to delete objects and data and release the freed memory back to the heap. @note C++ proxy and service classes generated by `soapcpp2 -j` option `-j` or option `-i` have an internal `::soap` context that is either a base class (option `-i`) or a member variable pointing to a `::soap` context (option `-j`). For convenience, use the `destroy` member function instead of `::soap_destroy` and `::soap_end`. For example: ~~~{.cpp} #include "soapexampleProxy.h" exampleProxy proxy(SOAP_XML_INDENT); ... // use proxy or proxy.soap (option -j) proxy.destroy(); // delete managed C++ objects and memory ~~~ ~~~{.cpp} #include "soapexampleService.h" exampleService service(SOAP_XML_INDENT); ... // use service or service.soap (option -j) service.destroy(); // delete managed C++ objects and memory ~~~ @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); ... // send and receive messages etc. soap_destroy(soap); // delete managed C++ objects soap_end(soap); // delete managed memory soap_free(soap); // free the context ~~~ @see `::soap_malloc`, `::soap_destroy`, `::soap::destroy`. */ void soap_end(struct soap *soap) ///< `::soap` context ; /// Delegate the deletion of all managed objects and data from the specified `::soap` context to another `::soap` context /** This function moves all dynamically-allocated data managed by the specified `::soap` context to the target context `soap_to` for deletion by the target context using `::soap_destroy` and `::soap_end`. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); struct soap *temp = soap_new(); // temp context to manage data if (soap_call_ns__webmethod(soap, endpoint, NULL, ...)) { soap_print_fault(soap, stderr); } else { // success, response contains deserialized data soap_delegate_deletion(soap, temp); // deserialized data is managed by temp context } soap_destroy(soap); // clean up 'soap' context soap_end(soap); // clean up 'soap' context ... // use deserialized data managed by 'temp' context, reuse 'soap' context as needed soap_destroy(temp); // clean up 'temp' context, deletes deserialized data soap_end(temp); // clean up 'temp' context, deletes deserialized data soap_free(temp); soap_free(soap); ~~~ @see `::soap_copy`, `::soap_copy_context`, `::soap_destroy`, `::soap_end`. */ void soap_delegate_deletion( struct soap *soap, ///< source `::soap` context struct soap *soap_to) ///< target `::soap` context ; /// Set SOAP version (0 = no SOAP, 1 = SOAP 1.1, 2 = SOAP 1.2) /** This function sets (or overrides) the SOAP version to use when sending a message. This function can be used prior to a client-side call to select the SOAP version to use for the request message (assuming the generated code does not fix the version already) or in a service operation to select the SOAP version of the response message. The response message of a service operation normally uses the same SOAP version of the SOAP request message received. */ void soap_set_version( struct soap *soap, ///< `::soap` contexr short version) ///< SOAP version (0 = REST (no SOAP), 1 = SOAP 1.1, 2 = SOAP 1.2) ; /** @} */ /** \defgroup group_callbacks Callback functions @brief This module defines the callback functions of the `::soap` context to modify its behavior, as is done by plugins HTTP callbacks: - `::soap::fpost` - `::soap::fresponse` - `::soap::fposthdr` - `::soap::fparse` - `::soap::fparsehdr` - `::soap::fget` - `::soap::fput` - `::soap::fdel` - `::soap::fopt` - `::soap::fhead` - `::soap::fform` XML and SOAP callbacks: - `::soap::fheader` - `::soap::fignore` - `::soap::fsvalidate` - `::soap::fwvalidate` - `::soap::fseterror` Socket connection callbacks: - `::soap::fopen` - `::soap::faccept` - `::soap::fclose` - `::soap::fresolve` - `::soap::fconnect` - `::soap::fdisconnect` - `::soap::fclosesocket` - `::soap::fshutdownsocket` - `::soap::fpoll` IO callbacks: - `::soap::frecv` - `::soap::fsend` Server keep-alive loop callback: - `::soap::fserveloop` Memory allocation callback: - `::soap::fmalloc` Streaming DIME attachment callbacks: - `::soap::fdimereadopen` - `::soap::fdimeread` - `::soap::fdimereadclose` - `::soap::fdimewriteopen` - `::soap::fdimewrite` - `::soap::fdimewriteclose` Streaming MIME/MTOM attachment callbacks: - `::soap::fmimereadopen` - `::soap::fmimeread` - `::soap::fmimereadclose` - `::soap::fmimewriteopen` - `::soap::fmimewrite` - `::soap::fmimewriteclose` OpenSSL and GNUTLS SSL/TLS callbacks: - `::soap::fsslauth` - `::soap::fsslverify` To pass user-specified data to callbacks and plugins, assign a value to the `::soap::user` variable of the context which can be accessed within the callback or plugin. @{ */ /** @} */ /** \defgroup group_ssl SSL/TLS context and functions @brief This module defines functions to set the SSL/TLS context for HTTPS and WS-Security @{ */ /// SSL/TLS (HTTPS) client and server context flags for `::soap_ssl_client_context` and `::soap_ssl_server_context`, respectively, flags can be combined with `|` (bit-wise or) /** The SSL/TLS flags are: - `#SOAP_SSL_DEFAULT` - `#SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE` - `#SOAP_SSL_NO_AUTHENTICATION` - `#SOAP_SSL_NO_DEFAULT_CA_PATH` - `#SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION` - `#SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION` - `#SOAP_SSL_RSA` - `#SOAP_SSL_SKIP_HOST_CHECK` - `#SOAP_SSLv3_TLSv1` - `#SOAP_SSLv3` - `#SOAP_TLSv1` - `#SOAP_TLSv1_0` - `#SOAP_TLSv1_1` - `#SOAP_TLSv1_2` - `#SOAP_TLSv1_3` */ typedef unsigned short soap_ssl_flags; /// `::soap_ssl_flags` flag with `#SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION` and `#SOAP_TLSv1` enabled by default /** @see `::soap_ssl_server_context`, `::soap_ssl_client_context`. */ #define SOAP_SSL_DEFAULT (SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION | SOAP_TLSv1) /// `::soap_ssl_flags` flag value to allow self-signed and expired certificates and those without CRL to be used for authentication /** @see `::soap_ssl_server_context`, `::soap_ssl_client_context`. */ #define SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE /// `::soap_ssl_flags` flag value to disable authentication of the peer /** This flag should be used sparingly such as for testing only. @see `::soap_ssl_server_context`, `::soap_ssl_client_context`. */ #define SOAP_SSL_NO_AUTHENTICATION /// `::soap_ssl_flags` flag value to prevent OpenSSL from calling `SSL_CTX_set_default_verify_paths` /** @see `::soap_ssl_server_context`, `::soap_ssl_client_context`. */ #define SOAP_SSL_NO_DEFAULT_CA_PATH /// `::soap_ssl_flags` flag for servers to require clients to authenticate to servers during the HTTPS handshake /** This flag requires clients connected to the server to authenticate to the server. The `::soap_ssl_server_context` must specify `cafile` and/or `capath` parameters with certificates (CA root and/or server certificates) to authenticate clients. @see `::soap_ssl_server_context`. */ #define SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION /// `::soap_ssl_flags` flag for clients to require servers to authenticate to clients during the HTTPS handshake /** This flag requires connected servers to authenticate to the client. The `::soap_ssl_client_context` must specify `cafile` and/or `capath` parameters with certificates (CA root and/or server certificates) to authenticate the server. @see `::soap_ssl_client_context`. */ #define SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION /// `::soap_ssl_flags` flag value to use RSA instead of DH (automatically set when no DH parameter is specified) #define SOAP_SSL_RSA /// `::soap_ssl_flags` flag for clients to allow clients to skip common name checks against the host name of the server #define SOAP_SSL_SKIP_HOST_CHECK /// `::soap_ssl_flags` flag value to enable SSL v3 but disable TLS, should be used for legacy purposes only /** This flag can be used in combination with other SSL and TLS protocol flags, using `|` (bit-wise or). @see `#SOAP_SSLv3`, `#SOAP_SSLv3_TLSv1`, `#SOAP_TLSv1`, `#SOAP_TLSv1_0`, `#SOAP_TLSv1_1`, `#SOAP_TLSv1_2`, `#SOAP_TLSv1_3`. */ #define SOAP_SSLv3 /// `::soap_ssl_flags` flag value to enable both SSL v3 and TLS 1 (TLS 1.0 to max) /** This flag can be used in combination with other SSL and TLS protocol flags, using `|` (bit-wise or). @see `#SOAP_SSLv3`, `#SOAP_SSLv3_TLSv1`, `#SOAP_TLSv1`, `#SOAP_TLSv1_0`, `#SOAP_TLSv1_1`, `#SOAP_TLSv1_2`, `#SOAP_TLSv1_3`. */ #define SOAP_SSLv3_TLSv1 /// `::soap_ssl_flags` flag value to enable TLS v1 (TLS 1.0 and higher) and to disable SSL v3 /** This flag can be used in combination with other SSL and TLS protocol flags, using `|` (bit-wise or). @see `#SOAP_SSLv3`, `#SOAP_SSLv3_TLSv1`, `#SOAP_TLSv1`, `#SOAP_TLSv1_0`, `#SOAP_TLSv1_1`, `#SOAP_TLSv1_2`, `#SOAP_TLSv1_3`. */ #define SOAP_TLSv1 /// `::soap_ssl_flags` flag value to enable TLS 1.0 /** This flag can be used in combination with other SSL and TLS protocol flags, using `|` (bit-wise or). @see `#SOAP_SSLv3`, `#SOAP_SSLv3_TLSv1`, `#SOAP_TLSv1`, `#SOAP_TLSv1_0`, `#SOAP_TLSv1_1`, `#SOAP_TLSv1_2`, `#SOAP_TLSv1_3`. */ #define SOAP_TLSv1_0 /// `::soap_ssl_flags` flag value to enable TLS 1.1 /** This flag can be used in combination with other SSL and TLS protocol flags, using `|` (bit-wise or). @see `#SOAP_SSLv3`, `#SOAP_SSLv3_TLSv1`, `#SOAP_TLSv1`, `#SOAP_TLSv1_0`, `#SOAP_TLSv1_1`, `#SOAP_TLSv1_2`, `#SOAP_TLSv1_3`. */ #define SOAP_TLSv1_1 /// `::soap_ssl_flags` flag value to enable TLS 1.2 /** This flag can be used in combination with other SSL and TLS protocol flags, using `|` (bit-wise or). @see `#SOAP_SSLv3`, `#SOAP_SSLv3_TLSv1`, `#SOAP_TLSv1`, `#SOAP_TLSv1_0`, `#SOAP_TLSv1_1`, `#SOAP_TLSv1_2`, `#SOAP_TLSv1_3`. */ #define SOAP_TLSv1_2 /// `::soap_ssl_flags` flag value to enable TLS 1.3 /** This flag can be used in combination with other SSL and TLS protocol flags, using `|` (bit-wise or). @see `#SOAP_SSLv3`, `#SOAP_SSLv3_TLSv1`, `#SOAP_TLSv1`, `#SOAP_TLSv1_0`, `#SOAP_TLSv1_1`, `#SOAP_TLSv1_2`, `#SOAP_TLSv1_3`. */ #define SOAP_TLSv1_3 /// Initialize the SSL/TLS library /** This function initializes the SSL/TLS library's global state and should be called just once per application. This function is called by the engine when the SSL/TLS library is used but not yet initialized. It is strongly recommended to call `::soap_ssl_init` once in a multi-threaded application before any threads are started. Furthermore, all OpenSSL versions prior to 1.1.0 require mutex locks to be explicitly set up in your code for multi-threaded applications by calling `CRYPTO_thread_setup()` and `CRYPTO_thread_cleanup()`. @warning If an application initializes the SSL/TLS library such as OpenSSL by loading algorithms, then `::soap_ssl_noinit` should be used instead before a `::soap` context is used to ensure that OpenSSL is not initialized twice. @see `::soap_ssl_init`, `::CRYPTO_thread_setup, `::CRYPTO_thread_cleanup`. */ void soap_ssl_init(void) ; /// Do not initalized the SSL/TLS library /** This function prevents (re)initialization of the SSL/TLS library's global state and should be called when an application initializes the SSL/TLS library such as OpenSSL by loading algorithms. OpenSSL may misbehave when `SSL_library_init` and `OpenSSL_add_all_algorithms` are called more than once, e.g. by the application and again by the gSOAP engine. The latter is avoided by calling `::soap_ssl_noinit` before threads are started and before a `::soap` context is created. */ void soap_ssl_noinit(void) ; /// Initialize the server-side SSL/TLS context /** This function initializes the server-side SSL/TLS context of OpenSSL or GNUTLS library. The `flags` parameter initializes the context with a combination of `::soap_ssl_flags`. The `keyfile` parameter when non-NULL is the server's private key PEM file, typically concatenated with its certificate in the PEM file. The `password` parameter when non-NULL is used to unlock the password-protected private key in the key file. The `cafile` parameter when non-NULL is used to authenticate clients when the `#SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION` flag is used and contains the client or CA certificate(s). Alternatively, a directory name `capath` can be specified to point to a directory with the certificate(s). The `dhfile` parameter when non-NULL is a file with DH parameters to use DH instead of RSA. Alternatively, the `dhfile` parameter can be a numeric string value greater than 512 to let the engine generate the DH parameters, but beware this can take a while to execute. The `randfile` parameter when non-NULL can be used to seed the PRNG using the specified file with random data. The `sid` parameter when non-NULL is used for server-side session caching using a specified unique name per server. Returns `#SOAP_OK` or a `::soap_status` error code. All strings passed to this function except `sid` must be persistent in memory until the SSL/TLS context is implicitly deleted when the `::soap` context is deleted. All OpenSSL versions prior to 1.1.0 require mutex locks to be explicitly set up in your code for multi-threaded applications by calling `CRYPTO_thread_setup()` and `CRYPTO_thread_cleanup()`. After `::soap_ssl_server_context` initialization you can select a specific cipher list using OpenSSL function `SSL_CTX_set_cipher_list(soap->ctx, "...")`. When client authentication is required with CRLs, you can use `::soap_ssl_crl` to specify a CRL file and to use any CRLs provided with SSL/TLS handshakes. @par Examples: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); if (soap_ssl_server_context(soap, SOAP_SSL_DEFAULT, // authenticate, use TLSv1.0 to 1.3 "server.pem", // private key and certificate "password", // password to read server.pem NULL, NULL, NULL, NULL, "my_unique_server_id123" // server identification to enable SSL session caching to speed up TLS )) { soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } ~~~ ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); if (soap_ssl_server_context(soap, SOAP_TLSv1_1 | SOAP_TLSv1_2, // authenticate, use TLSv1.1 or TLSv1.2 only "server.pem", // private key and certificate "password", // password to read server.pem NULL, NULL, "dh1024.pem", // use DH with 1024 bits NULL, "my_unique_server_id123" // identification to enable SSL session caching to speed up TLS )) { soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } ~~~ ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); if (soap_ssl_server_context(soap, SOAP_TLSv1_1 | SOAP_TLSv1_2, // authenticate, use TLSv1.1 or TLSv1.2 only "server.pem", // private key and certificate "password", // password to read server.pem NULL, NULL, "1024", // generate DH with 1024 bits (takes a while to execute) NULL, "my_unique_server_id123" // identification to enable SSL session caching to speed up TLS )) { soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } ~~~ ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); if (soap_ssl_server_context(soap, SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION, // require clients to authenticate "server.pem", // private key and certificate "password", // password to read server.pem "cacert.pem", // certificate to authenticate clients NULL, NULL, NULL, soap_rand_uuid(soap, NULL) // identification to enable SSL session caching to speed up TLS ) || soap_ssl_crl(soap, "crl.pem")) // specify CRLs { soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } // specify a cipher list SSL_CTX_set_cipher_list(soap->ctx, "HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4:!DH"); ~~~ @note Requires compilation with `#WITH_OPENSSL` or `#WITH_GNUTLS`. @see `#SOAP_SSL_RSA_BITS`, `::soap_ssl_client_context`, `::soap_ssl_crl`. */ int soap_ssl_server_context( struct soap *soap, ///< `::soap` context soap_ssl_flags flags, ///< SSL/TLS context initialization flags const char *keyfile, ///< private key file in PEM format or NULL const char *password, ///< password to unlock the private key or NULL const char *cafile, ///< file with certificates in PEM format or NULL const char *capath, ///< directory to certificates const char *dhfile, ///< file with DH parameters or numeric string value to generate DH parameters or NULL const char *randfile, ///< file to see the PRNG or NULL const char *sid) ///< a unique server id for session caching or NULL /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Initialize the client-side SSL/TLS context /** This function initializes the client-side SSL/TLS context of the OpenSSL or GNUTLS library. The `flags` parameter initializes the context with a combination of `::soap_ssl_flags`. The `keyfile` parameter when non-NULL is the server's private key PEM file, typically concatenated with its certificate in the PEM file. The `password` parameter when non-NULL is used to unlock the password-protected private key in the key file. The `cafile` parameter when non-NULL is used to authenticate clients when the `#SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION` flag is used and contains the client or CA certificate(s). Alternatively, a directory name `capath` can be specified to point to a directory with the certificate(s). The `randfile` parameter when non-NULL can be used to seed the PRNG using the specified file with random data. Returns `#SOAP_OK` or a `::soap_status` error code. All strings passed to this function must be persistent in memory until the SSL/TLS context is implicitly deleted when the `::soap` context is deleted. After `::soap_ssl_client_context` initialization you can select a specific cipher list using OpenSSL function `SSL_CTX_set_cipher_list(soap->ctx, "...")`. When authentication requires the use of CRLs, you can use `::soap_ssl_crl` to specify a CRL file and to use any CRLs provided with SSL/TLS handshakes. All OpenSSL versions prior to 1.1.0 require mutex locks to be explicitly set up in your code for multi-threaded applications by calling `CRYPTO_thread_setup()` and `CRYPTO_thread_cleanup()`. @par Examples: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); if (soap_ssl_client_context(soap, SOAP_SSL_NO_AUTHENTICATION, // do not authenticate the server NULL, NULL, NULL, NULL, NULL )) { soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } ~~~ ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); if (soap_ssl_client_context(soap, SOAP_SSL_DEFAULT, // authenticate, use TLSv1.0 to 1.3 NULL, NULL, "cacerts.pem", // certificates to authenticate servers NULL, NULL )) { soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } ~~~ ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); if (soap_ssl_client_context(soap, SOAP_SSLv3_TLSv1 | // authenticate, use SSLv3, TLSv1.0 to 1.3 SOAP_SSL_SKIP_HOST_CHECK | // but skip host name checking SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE, // and allow expired certificates NULL, NULL, "cacerts.pem", // certificates to authenticate servers NULL, NULL )) { soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } ~~~ ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); if (soap_ssl_client_context(soap, SOAP_TLSv1_1 | SOAP_TLSv1_2, // authenticate, use TLSv1.1 or 1.2 "client.pem", // private key and certificate (allowing server to authenticate the client) "password", // password to read client.pem "cacerts.pem", // certificates to authenticate servers NULL, NULL )) { soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } ~~~ ~~~{.cpp} #include "soapH.h" // define a verification callback that allows self-signed certificates int ssl_verify_callback_allow_self_signed_cert(int ok, X509_STORE_CTX *store) { if (!ok && X509_STORE_CTX_get_error(store) == X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN) { X509_STORE_CTX_set_error(store, X509_V_OK); ok = 1; } return ok; } struct soap *soap = soap_new(); soap->fsslverify = ssl_verify_callback_allow_self_signed_cert; if (soap_ssl_client_context(soap, SOAP_SSL_DEFAULT, // authenticate, use TLSv1.0 to 1.3 "client.pem", // private key and certificate (allowing server to authenticate the client) "password", // password to read client.pem "cacerts.pem", // certificates to authenticate servers NULL, NULL )) { soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } ~~~ @note Requires compilation with `#WITH_OPENSSL` or `#WITH_GNUTLS`. @see `#SOAP_SSL_RSA_BITS`, `::soap_ssl_server_context`, `::soap_ssl_crl`, ::soap::fsslverify`. */ int soap_ssl_client_context( struct soap *soap, ///< `::soap` context soap_ssl_flags flags, ///< SSL/TLS context initialization flags const char *keyfile, ///< private key file in PEM format or NULL const char *password, ///< password to unlock the private key or NULL const char *cafile, ///< file with certificates in PEM format or NULL const char *capath, ///< directory to certificates const char *randfile) ///< file to see the PRNG or NULL /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Enable SSL/TLS CRLs /** This function enables SSL/TLS CRL checking during the SSL/TLS handshake. The `crlfile` when non-NULL specifies a file with CRLs in PEM format. Returns `#SOAP_OK` or a `::soap_status` error code. @note Requires compilation with `#WITH_OPENSSL` or `#WITH_GNUTLS`. @see `::soap_ssl_server_context`, `::soap_ssl_client_context`, `::soap_ssl_crl`. */ int soap_ssl_crl( struct soap *soap, ///< `::soap` context const char *crlfile) ///< CRL file in PEM format or NULL /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Accept SSL/TLS connection /** This function should be called after calling `::soap_accept` to perform the SSL/TLS handshake with a connected client. This function enforces HTTPS connections that are initialized with `::soap_ssl_server_context`. Returns `#SOAP_OK` or a `::soap_status` error code. @par Examples: ~~~{.cpp} #include "soapH.h" int main() { struct soap *soap = soap_new(); if (soap_ssl_server_context(soap, SOAP_SSL_DEFAULT, "server.pem", "password", NULL, NULL, NULL, NULL, NULL)) exit(EXIT_FAILURE); soap->accept_timeout = 3600; // exit loop when no request arrives in one hour soap->send_timeout = soap_recv_timeout = 5; // 5 seconds max socket stall time (unlimited by default) soap->transfer_timeout = 30; // 30 seconds max message transfer time (unlimited by default) soap->recv_maxlength = 1048576; // limit messages received to 1MB (2GB by default) if (soap_valid_socket(soap_bind(soap, NULL, PORTNUM, BACKLOG))) { while (1) { if (soap_valid_socket(soap_accept(soap))) { if (soap_ssl_accept(soap) || soap_serve(soap)) soap_print_fault(soap, stderr); } else if (soap->errnum) // accept failed, try again after 1 second { soap_print_fault(soap, stderr); sleep(1); } else // accept timed out, quit looping { break; } soap_destroy(soap); soap_end(soap); } } soap_free(soap); } ~~~ ~~~{.cpp} #include "soapH.h" #include "plugin/threads.h" int main() { struct soap *soap = soap_new(); soap->bind_flags = SO_REUSEADDR; // immediate port reuse soap->accept_timeout = 3600; // exit loop when no request arrives in one hour soap->send_timeout = soap_recv_timeout = 5; // 5 seconds max socket stall time (unlimited by default) soap->transfer_timeout = 30; // 30 seconds max message transfer time (unlimited by default) soap->recv_maxlength = 1048576; // limit messages received to 1MB (2GB by default) if (soap_valid_socket(soap_bind(soap, NULL, PORTNUM, BACKLOG))) { while (1) { if (soap_valid_socket(soap_accept(soap))) { THREAD_TYPE tid; struct soap *tsoap = soap_copy(soap); if (!tsoap) soap_force_closesock(soap); else while (THREAD_CREATE(&tid, (void*(*)(void*))&process_request, (void*)tsoap)) sleep(1); // failed, try again } else if (soap->errnum) // accept failed, try again after 1 second { soap_print_fault(soap, stderr); sleep(1); } else // accept timed out, quit looping { break; } soap_destroy(soap); soap_end(soap); } } soap_free(soap); } void *process_request(struct soap *soap) { THREAD_DETACH(THREAD_ID); if (soap_ssl_accept(soap) == SOAP_OK) soap_serve(soap); soap_destroy(soap); soap_end(soap); soap_free(soap); return NULL; } ~~~ @note Requires compilation with `#WITH_OPENSSL` or `#WITH_GNUTLS` and SSL server context initialization with `::soap_ssl_server_context`. @see `#WITH_OPENSSL`, `#WITH_GNUTLS`, `::soap_ssl_server_context`, `::soap_ssl_crl`, `::soap_bind`, `::soap_accept`. */ int soap_ssl_accept(struct soap *soap) /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Setup function for OpenSSL versions prior to 1.1.1 to set locks for multi-threaded SSL/TLS applications /** The `CRYPTO_thread_setup()` and `CRYPTO_thread_setup` cleanup functions should be defined in the source code of a multi-threaded SSL/TLS application as follows, requiring gsoap/plugin/threads.h: ~~~{.cpp} #include "plugin/threads.h" struct CRYPTO_dynlock_value { MUTEX_TYPE mutex; }; static MUTEX_TYPE *mutex_buf = NULL; static struct CRYPTO_dynlock_value *dyn_create_function(const char *file, int line) { struct CRYPTO_dynlock_value *value; (void)file; (void)line; value = (struct CRYPTO_dynlock_value*)OPENSSL_malloc(sizeof(struct CRYPTO_dynlock_value)); if (value) MUTEX_SETUP(value->mutex); return value; } static void dyn_lock_function(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line) { (void)file; (void)line; if (mode & CRYPTO_LOCK) MUTEX_LOCK(l->mutex); else MUTEX_UNLOCK(l->mutex); } static void dyn_destroy_function(struct CRYPTO_dynlock_value *l, const char *file, int line) { (void)file; (void)line; MUTEX_CLEANUP(l->mutex); OPENSSL_free(l); } static void locking_function(int mode, int n, const char *file, int line) { (void)file; (void)line; if (mode & CRYPTO_LOCK) MUTEX_LOCK(mutex_buf[n]); else MUTEX_UNLOCK(mutex_buf[n]); } static unsigned long id_function() { return (unsigned long)THREAD_ID; } int CRYPTO_thread_setup() { int i; mutex_buf = (MUTEX_TYPE*)OPENSSL_malloc(CRYPTO_num_locks() * sizeof(MUTEX_TYPE)); if (!mutex_buf) return SOAP_EOM; for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_SETUP(mutex_buf[i]); CRYPTO_set_id_callback(id_function); CRYPTO_set_locking_callback(locking_function); CRYPTO_set_dynlock_create_callback(dyn_create_function); CRYPTO_set_dynlock_lock_callback(dyn_lock_function); CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function); return SOAP_OK; } void CRYPTO_thread_cleanup() { int i; if (!mutex_buf) return; CRYPTO_set_id_callback(NULL); CRYPTO_set_locking_callback(NULL); CRYPTO_set_dynlock_create_callback(NULL); CRYPTO_set_dynlock_lock_callback(NULL); CRYPTO_set_dynlock_destroy_callback(NULL); for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_CLEANUP(mutex_buf[i]); OPENSSL_free(mutex_buf); mutex_buf = NULL; } ~~~ @par Example: ~~~{.cpp} int main() { soap_ssl_init(); if (CRYPTO_thread_setup()) exit(EXIT_FAILURE); ... // run the application CRYPTO_thread_cleanup(); } ~~~ @see `::soap_ssl_init`, `::CRYPTO_thread_cleanup`. */ int CRYPTO_thread_setup(); /// Cleanup function for OpenSSL versions prior to 1.1.1 /** @see `::soap_ssl_init`, `::CRYPTO_thread_setup`. */ int CRYPTO_thread_cleanup(); /** @} */ /** \defgroup group_io HTTP and IO functions @brief This module defines functions for HTTP operations and functions for receiving and sending data This module defines the following client-side functions: - `::soap_GET` - `::soap_PUT` - `::soap_PATCH` - `::soap_POST` - `::soap_DELETE` - `::soap_connect_command` - `::soap_connect` - `::soap_recv_empty_response` This module defines the following server-side functions: - `::soap_bind` - `::soap_accept` - `::soap_ssl_accept` (defined in the \ref group_ssl module) - `::soap_serve` (generated by soapcpp2) - `::soap_begin_serve` - `::soap_serve_request` (generated by soapcpp2) - `::soap_response` - `::soap_send_empty_response` This module defines the following input/output functions: - `::soap_begin_recv` - `::soap_end_recv` - `::soap_begin_send` - `::soap_end_send` - `::soap_begin_count` - `::soap_end_count` - `::soap_closesock` - `::soap_force_closesock` - `::soap_close_connection` - `::soap_send` - `::soap_send_raw` - `::soap_http_has_body` - `::soap_http_get_body` - `::soap_getline` - `::soap_get0` - `::soap_get1` - `::soap_poll` - `::soap_ready` This module defines the following SOAP message input/output functions: - `::soap_envelope_begin_in` - `::soap_envelope_end_in` - `::soap_envelope_begin_out` - `::soap_envelope_end_out` - `::soap_body_begin_in` - `::soap_body_end_in` - `::soap_body_begin_out` - `::soap_body_end_out` - `::soap_recv_fault` - `::soap_send_fault` - `::soap_recv_header` - `::soap_putheader` - `::soap_serializeheader` This module defines three HTTP-related plugins; - `::http_get` HTTP GET plugin for server-side handling of HTTP GET requests by stand-alone servers as a more capable alternative to setting the `::soap::fget` callback. - `::http_post` HTTP POST plugin for server-side handling of HTTP POST, PUT, PATCH, and DELETE request by stand-alone servers as a more capable alternative to setting the `::soap::fput`, `::soap::fpatch`, and `::soap::fdel` callbacks. - `::http_form` HTTP POST form plugin for server-side handling of HTTP application/x-www-form-urlencoded data. - `::http_pipe` HTTP pipelining plugin to support server-side and client-side pipelined HTTP messages. @{ */ /// HTTP GET content from server /** This function connects to the server specified by the `endpoint` URL string, using HTTP GET and the HTTP SOAP Action header specified by the `action` string (or NULL). This call should be followed by `::soap_end_send` to send an empty HTTP body. Upon successful completion, messages can be received from the server. Returns `#SOAP_OK` or a `::soap_status` error code. This function is used by the soapcpp2-generated `soap_GET_T` functions for types `T` to HTTP GET the XML deserialized value of type `T` from a server. To implement server-side HTTP GET handling use `::soap::fget`. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); char *response = NULL; size_t response_len; if (soap_GET(soap, "http://www.example.com/API/GET", NULL) || soap_begin_recv(soap) || (response = soap_http_get_body(soap, &response_len)) != NULL || soap_end_recv(soap)) soap_print_fault(soap, stderr); else printf("%s", response); soap_closesock(soap); ~~~ @see `::soap::connect_flags`, `::soap::connect_timeout`, `::soap::recv_timeout`, `::soap::send_timeout`, `::soap::transfer_timeout`, `::soap::recv_maxlength`, `::soap_PUT`, `::soap_PATCH`, `::soap_POST`, `::soap_DELETE`. */ int soap_GET(struct soap *soap, ///< `::soap` context const char *endpoint, ///< URL string const char *action) ///< SOAP Action string or NULL /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// HTTP PUT content to server /** This function connects to the server specified by the `endpoint` URL string, using HTTP PUT and the HTTP SOAP Action header specified by the `action` string (or NULL). The HTTP content type of the data sent to the server is specified by `type`. If the mode is not `#SOAP_IO_CHUNK` (preferred) or `#SOAP_IO_STORE` then this function temporarily sets the mode of the context to `#SOAP_IO_STORE` to compute the HTTP content length. Upon successful completion, messages can be sent to the server and an empty response should be received by calling `::soap_recv_empty_response`. Returns `#SOAP_OK` or a `::soap_status` error code. This function is used by the soapcpp2-generated `soap_PUT_T` functions for types `T` to HTTP PUT the XML serialized value of type `T` to a server. To implement server-side HTTP PUT handling use `::soap::fput`. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_IO_CHUNK); // use SOAP_IO_CHUNK (preferred) or SOAP_IO_STORE if (soap_PUT(soap, "http://www.example.com/API/PUT", NULL, "text/xml; charset=utf-8") || soap_send(soap, "Some text\n") || soap_end_send(soap) || soap_recv_empty_response(soap)) soap_print_fault(soap, stderr); soap_closesock(soap); ~~~ @see `::soap::connect_flags`, `::soap::connect_timeout`, `::soap::recv_timeout`, `::soap::send_timeout`, `::soap::transfer_timeout`, `::soap::recv_maxlength`, `::soap_GET`, `::soap_PATCH`, `::soap_POST`, `::soap_DELETE`. */ int soap_PUT( struct soap *soap, ///< `::soap` context const char *endpoint, ///< URL string const char *action, ///< SOAP Action string or NULL const char *type) ///< HTTP content type string /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// HTTP PATCH content to server /** This function connects to the server specified by the `endpoint` URL string, using HTTP PATCH and the HTTP SOAP Action header specified by the `action` string (or NULL). The HTTP content type of the data sent to the server is specified by `type`. If the mode is not `#SOAP_IO_CHUNK` (preferred) or `#SOAP_IO_STORE` then this function temporarily sets the mode of the context to `#SOAP_IO_STORE` to compute the HTTP content length. Upon successful completion, messages can be sent to the server and an empty response should be received by calling `::soap_recv_empty_response`. Returns `#SOAP_OK` or a `::soap_status` error code. This function is used by the soapcpp2-generated `soap_PATCH_T` functions for types `T` to HTTP PATCH the XML serialized value of type `T` to a server. To implement server-side HTTP PATCH handling use `::soap::fpatch`. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_IO_CHUNK); // use SOAP_IO_CHUNK (preferred) or SOAP_IO_STORE if (soap_PATCH(soap, "http://www.example.com/API/PATCH", NULL, "application/json; charset=utf-8") || soap_send(soap, "{ \"title\": \"Example\", \"doc\": \"Some text\" }\n") || soap_end_send(soap) || soap_recv_empty_response(soap)) soap_print_fault(soap, stderr); soap_closesock(soap); ~~~ @see `::soap::connect_flags`, `::soap::connect_timeout`, `::soap::recv_timeout`, `::soap::send_timeout`, `::soap::transfer_timeout`, `::soap::recv_maxlength`, `::soap_GET`, `::soap_PUT`, `::soap_POST`, `::soap_DELETE`. */ int soap_PATCH( struct soap *soap, ///< `::soap` context const char *endpoint, ///< URL string const char *action, ///< SOAP Action string or NULL const char *type) ///< HTTP content type string /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// HTTP POST content to server /** This function connects to the server specified by the `endpoint` URL string, using HTTP POST and the HTTP SOAP Action header specified by the `action` string (or NULL). The HTTP content type of the data sent to the server is specified by `type`. If the mode is not `#SOAP_IO_CHUNK` (preferred) or `#SOAP_IO_STORE` then this function temporarily sets the mode of the context to `#SOAP_IO_STORE` to compute the HTTP content length. Upon successful completion, messages can be sent to and received from the server. Returns `#SOAP_OK` or a `::soap_status` error code. This function is used by the soapcpp2-generated `soap_POST_send_T` functions for types `T` to HTTP POST the XML serialized value of type `T` to a server. Use `soap_POST_recv_T` to receive a HTTP POST response deserialized into a value of (another) type `T`. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_IO_CHUNK); // use SOAP_IO_CHUNK (preferred) or SOAP_IO_STORE char *response = NULL; size_t response_len; if (soap_POST(soap, "http://www.example.com/API/POST", NULL, "application/json; charset=utf-8") || soap_send(soap, "{ \"title\": \"Example\", \"doc\": \"Some text\" }\n") || soap_end_send(soap) || soap_begin_recv(soap) || (response = soap_http_get_body(soap, &response_len)) != NULL || soap_end_recv(soap)) soap_print_fault(soap, stderr); else printf("%s", response); soap_closesock(soap); ~~~ @see `::soap::connect_flags`, `::soap::connect_timeout`, `::soap::recv_timeout`, `::soap::send_timeout`, `::soap::transfer_timeout`, `::soap::recv_maxlength`, `::soap_GET`, `::soap_PUT`, `::soap_PATCH`, `::soap_DELETE`. */ int soap_POST( struct soap *soap, ///< `::soap` context const char *endpoint, ///< URL string const char *action, ///< SOAP Action string or NULL const char *type) ///< HTTP content type string /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// HTTP DELETE content from server /** This function connects to the server specified by the `endpoint` URL string, using HTTP DELETE. No messages are sent and received. Returns `#SOAP_OK` or a `::soap_status` error code. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); if (soap_DELETE(soap, "http://www.example.com/API/DELETE")) soap_print_fault(soap, stderr); ~~~ To implement server-side HTTP DELETE handling use `::soap::fdel`. @see `::soap::connect_flags`, `::soap::connect_timeout`, `::soap::recv_timeout`, `::soap::send_timeout`, `::soap::transfer_timeout`, `::soap::recv_maxlength`, `::soap_GET`, `::soap_PUT`, `::soap_PATCH`, `::soap_POST`. */ int soap_DELETE( struct soap *soap, ///< `::soap` context const char *endpoint) ///< URL string /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// HTTP command methods for `::soap_connect_command` /** The choice of options are: `#SOAP_CONNECT` `#SOAP_DEL` `#SOAP_GET` `#SOAP_HEAD` `#SOAP_OPTIONS` `#SOAP_PATCH` `#SOAP_POST_FILE` `#SOAP_POST` `#SOAP_PUT` */ typedef int soap_http_command; /// HTTP POST command code /** This code is to be used with `::soap_connect_command` and produces HTTP content type `text/xml; charset=utf-8`. Use code `#SOAP_POST_FILE` to customize the content type by setting `::soap::http_content`. Before calling `::soap_connect_command`, either the HTTP content length `::soap::count` must be determined with `::soap_begin_count` and `::soap_end_count`, or the mode of the context should be set to `#SOAP_IO_CHUNK` (preferred) or `#SOAP_IO_STORE`. The `::soap_POST` function performs the same operation as `::soap_connect_command` with `#SOAP_POST_FILE` and sets the context mode to `#SOAP_IO_STORE` when required. `::soap_POST` is recommended. @par Examples: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); char *response = NULL; size_t response_len; // HTTP GET if (soap_connect_command(soap, SOAP_GET, endpoint, NULL) || soap_begin_recv(soap) || (response = soap_http_get_body(soap, &response_len)) != NULL || soap_end_recv(soap)) soap_print_fault(soap, stderr); else printf("%s", response); soap_closesock(soap); ~~~ ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_IO_CHUNK); // must use SOAP_IO_CHUNK or SOAP_IO_STORE char *response = NULL; size_t response_len; // HTTP POST request with chunked transfer if (soap_connect_command(soap, SOAP_POST, endpoint, NULL) || soap_send(soap, "Some text\n") || soap_end_send(soap) || soap_begin_recv(soap) || (response = soap_http_get_body(soap, &response_len)) != NULL || soap_end_recv(soap)) soap_print_fault(soap, stderr); else printf("%s", response); soap_closesock(soap); ~~~ ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); // no SOAP_IO_CHUNK or SOAP_IO_STORE, see below const char *request = "Some text\n"; char *response = NULL; size_t response_len; // HTTP POST request, here we compute the content length instead of chunked transfer with SOAP_IO_CHUNK or storing the entire message with SOAP_IO_STORE if (soap_begin_count(soap) || soap_send(soap, request) || soap_end_count(soap) || soap_connect_command(soap, SOAP_POST, endpoint, NULL) || soap_send(soap, request) || soap_end_send(soap) || soap_begin_recv(soap) || (response = soap_http_get_body(soap, &response_len)) != NULL || soap_end_recv(soap)) soap_print_fault(soap, stderr); else printf("%s", response); soap_closesock(soap); ~~~ @see `::soap_connect_command`, `::soap_POST` */ #define SOAP_POST /// HTTP POST command code with custom content type /** This code is to be used with `::soap_connect_command` and requires `::soap::http_content` to be set to the content type of the data to be sent. Before calling `::soap_connect_command`, either the HTTP content length `::soap::count` must be determined with `::soap_begin_count` and `::soap_end_count`, or the mode of the context should be set to `#SOAP_IO_CHUNK` (preferred) or `#SOAP_IO_STORE`. The `::soap_POST` function performs the same operation as `::soap_connect_command` with `#SOAP_POST_FILE` and sets the context mode to `#SOAP_IO_STORE` when required. `::soap_POST` is recommended. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_IO_CHUNK); // use SOAP_IO_CHUNK (preferred) or SOAP_IO_STORE char *response = NULL; size_t response_len; soap->http_content = "application/json; charset=utf-8"; if (soap_connect_command(soap, "http://www.example.com/API/POST", NULL, SOAP_POST_FILE) || soap_send(soap, "{ \"title\": \"Example\", \"doc\": \"Some text\" }\n") || soap_end_send(soap) || soap_begin_recv(soap) || (response = soap_http_get_body(soap, &response_len)) != NULL || soap_end_recv(soap)) soap_print_fault(soap, stderr); else printf("%s", response); soap_closesock(soap); ~~~ */ #define SOAP_POST_FILE /// HTTP GET command code /** This code is to be used with `::soap_connect_command`. The `::soap_GET` performs the same operation as `::soap_connect_command` with `#SOAP_GET`. `::soap_GET` is recommended. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_IO_CHUNK); // use SOAP_IO_CHUNK or SOAP_IO_STORE char *response = NULL; size_t response_len; if (soap_connect_command(soap, "http://www.example.com/API/GET", NULL, SOAP_GET) || soap_begin_recv(soap) || (response = soap_http_get_body(soap, &response_len)) != NULL || soap_end_recv(soap)) soap_print_fault(soap, stderr); else printf("%s", response); soap_closesock(soap); ~~~ */ #define SOAP_GET /// HTTP PUT command code with custom content type /** This code is to be used with `::soap_connect_command` and requires `::soap::http_content` to be set to the content type of the data to be sent. The `::soap_PUT` performs the same operation as `::soap_connect_command` with `#SOAP_PUT` and is recommended. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_IO_CHUNK); // use SOAP_IO_CHUNK or SOAP_IO_STORE soap->http_content = "text/xml; charset=utf-8"; if (soap_connect_command(soap, "http://www.example.com/API/PUT", NULL, SOAP_PUT) || soap_send(soap, "Some text\n") || soap_end_send(soap) || soap_recv_empty_response(soap)) soap_print_fault(soap, stderr); soap_closesock(soap); ~~~ */ #define SOAP_PUT /// HTTP DEL command code /** This code is to be used with `::soap_connect_command`. The `::soap_DELETE` performs the same operation as `::soap_connect_command` with `#SOAP_DEL`. `::soap_DELETE` is recommended. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_IO_CHUNK); // use SOAP_IO_CHUNK or SOAP_IO_STORE if (soap_connect_command(soap, "http://www.example.com/API/DELETE", NULL, SOAP_DEL) || soap_recv_empty_response(soap)) soap_print_fault(soap, stderr); soap_closesock(soap); ~~~ */ #define SOAP_DEL /// HTTP CONNECT command code /** This code is to be used with `::soap_connect_command`. */ #define SOAP_CONNECT /// HTTP HEAD command code /** This code is to be used with `::soap_connect_command`. */ #define SOAP_HEAD /// HTTP OPTIONS command code /** This code is to be used with `::soap_connect_command`. */ #define SOAP_OPTIONS /// HTTP PATCH command code with custom content type /** This code is to be used with `::soap_connect_command` and requires `::soap::http_content` to be set to the content type of the data to be sent. The `::soap_PATCH` function performs the same operation as `::soap_connect_command` with `#SOAP_PATCH`. `::soap_PATCH` is recommended. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_IO_CHUNK); // use SOAP_IO_CHUNK or SOAP_IO_STORE soap->http_content = "application/json; charset=utf-8"; if (soap_connect_command(soap, "http://www.example.com/API/PATCH", NULL, SOAP_PATCH) || soap_send(soap, "{ \"title\": \"Example\", \"doc\": \"Some text\" }\n") || soap_end_send(soap) || soap_recv_empty_response(soap)) soap_print_fault(soap, stderr); soap_closesock(soap); ~~~ */ #define SOAP_PATCH /// Connect to a server /** This function connects to the server specified by the `endpoint` URL string, using the HTTP method specified by the `http_command` with a `::soap_http_command` value and using the HTTP SOAP Action header specified by the `action` string (or NULL). Before calling `::soap_connect_command` with `#SOAP_POST`, `#SOAP_POST_FILE`, `#SOAP_PATCH` or `#SOAP_PUT`, either the HTTP content length `::soap::count` must be determined with `::soap_begin_count` and `::soap_end_count`, or the mode of the context should be set to `#SOAP_IO_CHUNK` (preferred) or `#SOAP_IO_STORE`. ALso for HTTP methods `#SOAP_POST`, `#SOAP_POST_FILE`, `#SOAP_PATCH` and `#SOAP_PUT` the `::soap::http_content` string should be set before calling `::soap_connect_command`. Upon successful completion of this function, messages can be sent to and/or received from the server. Returns `#SOAP_OK` or a `::soap_status` error code. @par Examples: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_IO_CHUNK); // use SOAP_IO_CHUNK or SOAP_IO_STORE char *response = NULL; size_t response_len; soap->http_content = "application/json; charset=utf-8"; // HTTP POST request with chunked transfer if (soap_connect_command(soap, "http://www.example.com/API/POST", NULL, SOAP_POST_FILE) || soap_send(soap, "{ \"title\": \"Example\", \"doc\": \"Some text\" }\n") || soap_end_send(soap) || soap_begin_recv(soap) || (response = soap_http_get_body(soap, &response_len)) != NULL || soap_end_recv(soap)) soap_print_fault(soap, stderr); else printf("%s", response); soap_closesock(soap); ~~~ ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); const char *request = "{ \"title\": \"Example\", \"doc\": \"Some text\" }\n"; char *response = NULL; size_t response_len; soap->http_content = "application/json; charset=utf-8"; // HTTP POST request, here we compute the content length instead of chunked transfer with SOAP_IO_CHUNK or storing the entire message with SOAP_IO_STORE if (soap_begin_count(soap) || soap_send(soap, request) || soap_end_count(soap) || soap_connect_command(soap, "http://www.example.com/API/POST", NULL, SOAP_POST_FILE) || soap_send(soap, request) || soap_end_send(soap) || soap_begin_recv(soap) || (response = soap_http_get_body(soap, &response_len)) != NULL || soap_end_recv(soap)) soap_print_fault(soap, stderr); else printf("%s", response); soap_closesock(soap); ~~~ @see `#SOAP_GET`, `#SOAP_POST`, `#SOAP_POST_FILE`, `#SOAP_PATCH`, `#SOAP_PUT`, `::soap::connect_flags`, `::soap::connect_timeout`, `::soap_GET`, `::soap_POST`, `::soap_PUT`, `::soap_PATCH`. */ int soap_connect_command( struct soap *soap, ///< `::soap` context soap_http_command http_command, ///< `::soap_http_command` with HTTP method code const char *endpoint, ///< URL string const char *action) ///< SOAP Action string or NULL /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Connect to a server using HTTP POST /** This function connects to the server specified by the `endpoint` URL string, using HTTP POST and the HTTP SOAP Action header specified by the `action` string (or NULL). Upon successful completion, messages can be sent to and/or received from the server. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_IO_CHUNK); // use SOAP_IO_CHUNK or SOAP_IO_STORE char *response = NULL; size_t response_len; if (soap_connect(soap, endpoint, NULL) || soap_send(soap, "Some text\n") || soap_end_send(soap) || soap_begin_recv(soap) || (response = soap_http_get_body(soap, &response_len)) != NULL || soap_end_recv(soap)) soap_print_fault(soap, stderr); else printf("%s", response); soap_closesock(soap); ~~~ @see `::soap::connect_flags`, `::soap::connect_timeout`. */ int soap_connect( struct soap *soap, ///< `::soap` context const char *endpoint, ///< URL string const char *action) ///< SOAP Action string or NULL /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Bind and listen to a port /** This function binds to the specified port and starts listening for client requests. The `host` parameter when non-NULL is the name of the host on which this service runs. The `port` parameter is the port number to bind, which must not be in use by another service. The call may also fail if the port was recently in use by this service. Use `SO_REUSEADDR` with `::soap::bind_flags` to immediately reuse the port, but use this option with caution to prevent "port stealing" attacks. The `backlog` parameter is used with `listen`, which defines the maximum length for the queue of pending connections. If a connection request arrives with the queue full, the client may receive an error with an indication of `ECONNREFUSED` or a connection reset. Alternatively, if the underlying protocol supports retransmission, the request may be ignored so that retries may succeed. Returns the `::soap::master` socket bound to the port or the invalid socket handle `#SOAP_INVALID_SOCKET` when an error occurred. @note A small `backlog` value should be used with iterative (i.e. non-multi-threaded) servers to improve fairness among connecting clients, recommended is a `backlog` value between 2 and 10. A smaller value increases fairness and defends against denial of service, but hampers performance because connection requests may be refused when the queue is full. Also short `::soap::recv_timeout` and `::soap::send_timeout` values of a few seconds at the most should be used to prevent clients from using connections for long by terminating unacceptably slow message exchanges that exceed the timeout thresholds. In the worst case, a connecting client may have to wait `backlog` * (`::soap::recv_timeout` + `::soap::send_timeout`) seconds to have the connection accepted by an iterative server when the backlog queue is full, or even longer when message sizes are very large, e.g. several MBs, requiring multiple message data packet exchanges. Larger `backlog` values can be safely used with multi-threaded servers, such as 50 to 128, where 128 is a typical maximum on most operating systems. The actual value does not matter when connections are accepted as soon as they arrive by `::soap_accept` and then handled by threads executing `::soap_ssl_accept` (for HTTPS) and `::soap_serve`. This function effectively deployes a stand-alone server on the specified port. There are three other alternatives for deploying services: - CGI and FastCGI, see `#WITH_FASTCGI`. - IIS web server, see the [ISAPI extension](../../isapi/html/index.html) for gSOAP. - Apache web server, see the [Apache module](../../apache/html/index.html) for gSOAP. @par Examples: ~~~{.cpp} #include "soapH.h" int main() { struct soap *soap = soap_new(); soap->bind_flags = SO_REUSEADDR; // immediate port reuse soap->accept_timeout = 3600; // exit loop when no request arrives in one hour soap->send_timeout = soap_recv_timeout = 5; // 5 seconds max socket stall time (unlimited by default) soap->transfer_timeout = 30; // 30 seconds max message transfer time (unlimited by default) soap->recv_maxlength = 1048576; // limit messages received to 1MB (2GB by default) if (soap_valid_socket(soap_bind(soap, NULL, PORTNUM, BACKLOG))) { while (1) { if (soap_valid_socket(soap_accept(soap))) { if (soap_serve(soap)) soap_print_fault(soap, stderr); } else if (soap->errnum) // accept failed, try again after 1 second { soap_print_fault(soap, stderr); sleep(1); } else // accept timed out, quit looping { break; } soap_destroy(soap); soap_end(soap); } } soap_free(soap); } ~~~ ~~~{.cpp} #include "soapH.h" #include "plugin/threads.h" int main() { struct soap *soap = soap_new(); soap->bind_flags = SO_REUSEADDR; // immediate port reuse soap->accept_timeout = 3600; // exit loop when no request arrives in one hour soap->send_timeout = soap_recv_timeout = 5; // 5 seconds max socket stall time (unlimited by default) soap->transfer_timeout = 30; // 30 seconds max message transfer time (unlimited by default) soap->recv_maxlength = 1048576; // limit messages received to 1MB (2GB by default) if (soap_valid_socket(soap_bind(soap, NULL, PORTNUM, BACKLOG))) { while (1) { if (soap_valid_socket(soap_accept(soap))) { THREAD_TYPE tid; struct soap *tsoap = soap_copy(soap); if (!tsoap) soap_force_closesock(soap); else while (THREAD_CREATE(&tid, (void*(*)(void*))&process_request, (void*)tsoap)) sleep(1); // failed, try again } else if (soap->errnum) // accept failed, try again after 1 second { soap_print_fault(soap, stderr); sleep(1); } else // accept timed out, quit looping { break; } soap_destroy(soap); soap_end(soap); } } soap_free(soap); } void *process_request(struct soap *soap) { THREAD_DETACH(THREAD_ID); soap_serve(soap); soap_destroy(soap); soap_end(soap); soap_free(soap); return NULL; } ~~~ @see `#WITH_IPV6`, `#WITH_IPV6_V6ONLY`, `#SOAP_IO_UDP`, `::soap::bind_flags`, `::soap::bind_inet6`, `::soap::bind_v6only`, `::soap::rcvbuf`, `::soap::sndbuf`, `::soap::master`, `::soap_accept`, `::soap_ssl_accept`. */ SOAP_SOCKET soap_bind( struct soap *soap, ///< `::soap` context const char *host, ///< name of the host or NULL int port, ///< port number to bind int backlog) ///< maximum queue length of pending requests /// @returns the `::soap::master` socket value or `#SOAP_INVALID_SOCKET` when an error occurred (check the return value with `#soap_valid_socket`) ; /// Accept a connection with a client /** This function accepts a connection requested by a client on a given port that is bound with `::soap_bind` first to set `::soap::master`. To accept HTTPS connections, call `::soap_ssl_accept` after this function to perform the HTTPS handshake with the client. Returns the `::soap::socket` connected to the client or the invalid socket handle `#SOAP_INVALID_SOCKET` when an error occurred. @par Examples: ~~~{.cpp} #include "soapH.h" int main() { struct soap *soap = soap_new(); soap->accept_timeout = 3600; // exit loop when no request arrives in one hour soap->send_timeout = soap_recv_timeout = 5; // 5 seconds max socket stall time (unlimited by default) soap->transfer_timeout = 30; // 30 seconds max message transfer time (unlimited by default) soap->recv_maxlength = 1048576; // limit messages received to 1MB (2GB by default) if (soap_valid_socket(soap_bind(soap, NULL, PORTNUM, BACKLOG))) { while (1) { if (soap_valid_socket(soap_accept(soap))) { if (soap_serve(soap)) soap_print_fault(soap, stderr); } else if (soap->errnum) // accept failed, try again after 1 second { soap_print_fault(soap, stderr); sleep(1); } else // accept timed out, quit looping { break; } soap_destroy(soap); soap_end(soap); } } soap_free(soap); } ~~~ ~~~{.cpp} #include "soapH.h" #include "plugin/threads.h" int main() { struct soap *soap = soap_new(); soap->bind_flags = SO_REUSEADDR; // immediate port reuse soap->accept_timeout = 3600; // exit loop when no request arrives in one hour soap->send_timeout = soap_recv_timeout = 5; // 5 seconds max socket stall time (unlimited by default) soap->transfer_timeout = 30; // 30 seconds max message transfer time (unlimited by default) soap->recv_maxlength = 1048576; // limit messages received to 1MB (2GB by default) if (soap_valid_socket(soap_bind(soap, NULL, PORTNUM, BACKLOG))) { while (1) { if (soap_valid_socket(soap_accept(soap))) { THREAD_TYPE tid; struct soap *tsoap = soap_copy(soap); if (!tsoap) soap_force_closesock(soap); else while (THREAD_CREATE(&tid, (void*(*)(void*))&process_request, (void*)tsoap)) sleep(1); // failed, try again } else if (soap->errnum) // accept failed, try again after 1 second { soap_print_fault(soap, stderr); sleep(1); } else // accept timed out, quit looping { break; } soap_destroy(soap); soap_end(soap); } } soap_free(soap); } void *process_request(struct soap *soap) { THREAD_DETACH(THREAD_ID); soap_serve(soap); soap_destroy(soap); soap_end(soap); soap_free(soap); return NULL; } ~~~ ~~~{.cpp} // alternative process_request function to accept HTTPS connections void *process_request(struct soap *soap) { THREAD_DETACH(THREAD_ID); if (soap_ssl_accept(soap) == SOAP_OK) soap_serve(soap); soap_destroy(soap); soap_end(soap); soap_free(soap); return NULL; } ~~~ @see `#WITH_IPV6`, `#WITH_IPV6_V6ONLY`, `#SOAP_IO_UDP`, `::soap::accept_flags`, `::soap::bind_flags`, `::soap::bind_inet6`, `::soap::bind_v6only`, `::soap::rcvbuf`, `::soap::sndbuf`, `::soap::master`, `::soap_bind`, `::soap_ssl_accept`. */ SOAP_SOCKET soap_accept(struct soap *soap) ///< `::soap` context /// @returns the `::soap::socket` value or `#SOAP_INVALID_SOCKET` when an error occurred (check the return value with `#soap_valid_socket`) ; /// Serve a pending request /** This function is auto-generated by soapcpp2 and serves the pending request on `::soap::socket` or on standard input/output `::soap::recvfd` and `::soap::sendfd`, e.g. for CGI and FastCGI services. Returns `#SOAP_OK` or a `::soap_status` error code. This auto-generated function implements the following behavior: ~~~{.cpp} #include "soapH.h" int soap_serve(struct soap *soap) { // keep socket open for HTTP keep-alive for maximum of soap->max_keep_alive iterations when nonzero soap->keep_alive = soap->max_keep_alive + 1; do { if (soap->keep_alive > 0 && soap->max_keep_alive > 0) soap->keep_alive--; // parse HTTP headers and call GET, PUT, PATCH or DELETE callback when set if (soap_begin_serve(soap)) { if (soap->error >= SOAP_STOP) // request was handled by plugin handler continue; // so continue the keep-alive loop return soap->error; } // call soap_serve_request generated by soapcpp2 to dispatch the SOAP/XML request if ((soap_serve_request(soap) || (soap->fserveloop && soap->fserveloop(soap))) && soap->error && soap->error < SOAP_STOP) return soap_send_fault(soap); } while (soap->keep_alive); return SOAP_OK; } ~~~ The `::soap_begin_serve` function processes the HTTP headers and XML SOAP headers if present. The `::soap_serve_request` function is auto-generated by soapcpp2, when applicable, and parses the SOAP/XML request element to dispatch the SOAP/XML request to a service operation. If soapcpp2 is not used or does not generate `::soap_serve` but `::soap_serve` is required to serve non-SOAP requests, for example to serve JSON or GET/PUT/PATCH/DELETE requests, then the following simplified `::soap_serve` implementation works just fine: ~~~{.cpp} #include "soapH.h" int soap_serve(struct soap *ctx) { soap->keep_alive = soap->max_keep_alive + 1; do { if (soap->keep_alive > 0 && soap->max_keep_alive > 0) soap->keep_alive--; // parse HTTP headers and call GET, PUT, PATCH or DELETE callback when set if (soap_begin_serve(soap)) { if (soap->error >= SOAP_STOP) // request was handled by plugin handler continue; // so continue the keep-alive loop return soap->error; } soap->error = 400; // Bad Request because we aren't serving anything else return soap_send_fault(soap); // so we report an error } while (soap->keep_alive); return SOAP_OK; } ~~~ @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); soap->accept_timeout = 3600; // exit loop when no request arrives in one hour soap->send_timeout = soap_recv_timeout = 5; // 5 seconds max socket stall time (unlimited by default) soap->transfer_timeout = 30; // 30 seconds max message transfer time (unlimited by default) soap->recv_maxlength = 1048576; // limit messages received to 1MB (2GB by default) if (soap_valid_socket(soap_bind(soap, NULL, PORTNUM, BACKLOG))) { while (1) { if (soap_valid_socket(soap_accept(soap))) { if (soap_serve(soap)) soap_print_fault(soap, stderr); } else if (soap->errnum) // accept failed, try again after 1 second { soap_print_fault(soap, stderr); sleep(1); } else // accept timed out, quit looping { break; } soap_destroy(soap); soap_end(soap); } } soap_free(soap); ~~~ @see `#WITH_IPV6`, `#WITH_IPV6_V6ONLY`, `#SOAP_IO_UDP`, `::soap::accept_flags`, `::soap::bind_flags`, `::soap::bind_inet6`, `::soap::bind_v6only`, `::soap::rcvbuf`, `::soap::sndbuf`, `::soap::master`, `::soap_bind`, `::soap_accept`, `::soap_ssl_accept`, `::soap::keep_alive`, `::soap::max_keep_alive`. */ int soap_serve(struct soap *soap) ///< `::soap` context /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Initiates serving a pending client request /** This function processes the HTTP headers and XML SOAP headers if present of the pending request on `::soap::socket` or on standard input/output `::soap::recvfd` and `::soap::sendfd`, e.g. for CGI and FastCGI services. Returns `#SOAP_OK` or a `::soap_status` error code. @see `::soap_serve`, `::soap_serve_request`. */ int soap_begin_serve(struct soap *soap) ///< `::soap` context /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Process a pending request /** This function is auto-generated by soapcpp2 and parses the SOAP/XML request element to dispatch the SOAP/XML request to a service operation. Returns `#SOAP_OK` or a `::soap_status` error code. @see `::soap_serve`, `::soap_begin_serve`. */ int soap_serve_request(struct soap *soap) ///< `::soap` context /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Initialize the context for server-side sending and send a HTTP response header /** This function initializes the context for sending at the server side and sends a HTTP response header with the specified `status` code. The `status` code parameter controls the behavior of the HTTP header sent and how the message should be send after calling this function: - `#SOAP_OK` sends a HTTP 200 OK header with HTTP content type "text/xml" and the HTTP content length value of `::soap::count` or chunked transfer encoding if the `#SOAP_IO_CHUNK` mode is set, i.e. chunked transfers avoid having to compute `::soap::count` such as by sending the message twice, the first time to compute the message length using `::soap_begin_count` and `::soap_end_count`. - HTTP codes 200 to 599 sends the corresponding HTTP header with HTTP content type "text/xml" and the HTTP content length value of `::soap::count` or chunked transfer encoding if the `#SOAP_IO_CHUNK` mode is set. - `#SOAP_HTML` sends a HTTP 200 OK header with HTTP content type "text/html" and sets the context to `#SOAP_IO_STORE` to accumulate the message in memory to determine the HTTP content length. - `#SOAP_FILE` sends a HTTP 200 OK header with HTTP content type `::soap::http_content` and if the `#SOAP_IO_CHUNK` mode is not set, sets the context to `#SOAP_IO_STORE` to accumulate the message in memory to determine the HTTP content length. - `#SOAP_FILE + status` where `status` is a HTTP status code between 200 and 599, sends the corresponding HTTP header with HTTP content type `::soap::http_content` and f the `#SOAP_IO_CHUNK` mode is not set, sets the context to `#SOAP_IO_STORE` to accumulate the message in memory to determine the HTTP content length. This function returns `#SOAP_OK` or a `::soap_status` error code when an error occurred. Besides `::soap_response`, other options to return a HTTP status code are: - Return the value of `::soap_send_empty_response` to produce an empty HTTP response message with the specified HTTP status code. - Likewise, return a HTTP status code between 200 and 299 directly to produce an empty HTTP response message with the given HTTP status code. - Return a HTTP status code between 300 and 599 directly to produce an HTTP response message with the given HTTP status code and a SOAP Fault message body. @par Examples: ~~~{.cpp} #include "soapH.h" int main() { struct soap *soap = soap_new(); soap->fget = my_get; // HTTP GET handler to serve HTTP GET ... // serve requests with soap_bind, soap_accept, soap_ssl_accept, and soap_serve } int my_get(struct soap *soap) { soap_set_omode(SOAP_IO_CHUNK); // make sure to chunk the transfers because we do not compute the content length // serve HTTP GET request that has path /xml so in this example we respond with XML if (strcmp(soap->path, "/xml") == 0) { if (soap_response(soap, SOAP_OK) || soap_send(soap, "Some text\n") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } // serve HTTP GET request that has path /html so in this example we respond with HTML if (strcmp(soap->path, "/html") == 0) { if (soap_response(soap, SOAP_HTML) || soap_send(soap, "ExampleSome text\n") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } // serve HTTP GET request that has path /json so in this example we respond with JSON if (strcmp(soap->path, "/json") == 0) { soap->http_content = "application/json; charset=utf-8"; if (soap_response(soap, SOAP_FILE) || soap_send(soap, "{ \"title\": \"Example\", \"doc\": \"Some text\" }\n") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } // respond with HTTP 400 Bad Request and HTML message soap->http_content = "text/html; charset=utf-8"; if (soap_response(soap, SOAP_FILE + 400) || soap_send(soap, "Bad Request\n") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } ~~~ ~~~{.cpp} #include "soapH.h" int main() { struct soap *soap = soap_new(); soap->fget = my_get; // HTTP GET handler to serve HTTP GET ... // serve requests with soap_bind, soap_accept, soap_ssl_accept, and soap_serve } int my_get(struct soap *soap) { // serve HTTP GET request, here we compute the content length instead of chunked transfer if (soap_begin_count(soap) || soap_send(soap, "Some text\n") || soap_end_count(soap) || soap_response(soap, SOAP_OK) || soap_send(soap, "Some text\n") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } ~~~ ~~~{.cpp} #include "soapH.h" int main() { struct soap *soap = soap_new(); soap->fget = my_get; // HTTP GET handler to serve HTTP GET ... // serve requests with soap_bind, soap_accept, soap_ssl_accept, and soap_serve } int my_get(struct soap *soap) { FILE *fd = NULL; char *s = strchr(soap->path, '?'); if (!s || strcmp(s, "?wsdl")) return SOAP_GET_METHOD; fd = fopen("myservice.wsdl", "rb"); if (!fd) return 404; // return HTTP 404 Not Found soap->http_content = "text/xml"; soap_set_omode(SOAP_IO_CHUNK); if (soap_response(soap, SOAP_FILE) == SOAP_OK) { while (1) { size_t r = fread(soap->tmpbuf, 1, sizeof(soap->tmpbuf), fd); if (!r || soap_send_raw(soap, soap->tmpbuf, r)) break; } } fclose(fd); soap_end_send(soap); return soap_closesock(soap); } ~~~ @see `::soap_bind`, `::soap_accept`, `::soap_serve`, `::soap_send_empty_response`, `::soap::fget`, `::soap::fput`, `::soap::fpatch`, `::soap::fdel`, `::soap::fopt`, `::soap::fhead`, `::soap::http_extra_header`. */ int soap_response( struct soap *soap, ///< `::soap` context int status) ///< HTTP status code 200 to 599 or `#SOAP_OK` (same as 200 OK) or `#SOAP_HTML` or `#SOAP_FILE` /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Initialize the context for receiving /** This function should be called to initialize the context for receiving a message or to begin parsing a document. This function is called in the server and client-side code generated by soapcpp2, and in the generated `soap_T_read` functions to deserialize data of type `T`. For example, it is called by `::soap_serve` (via `::soap_begin_serve`) at the server side when a client request is pending. This function parses HTTP, DIME, MIME and SOAP headers if present and updates the context with the engine state. Therefore, this function should not be called more than once to initialize the context for receiving. The source of the data read is `::soap::is` when non-NULL, or `::soap::socket` when valid, or `::soap::recvfd`. Returns `#SOAP_OK` or a `::soap_status` error code. @see `::soap::socket`, `::soap::recvfd`, `::soap::is`, `::soap_end_recv`. */ int soap_begin_recv(struct soap *soap) ///< `::soap` context /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Finalize the context after receiving /** This function should be called to finalize the context after receiving a message or to end parsing a document. This function is called in the server and client-side code generated by soapcpp2, and in the generated `soap_T_read` functions to deserialize data of type `T`. Returns `#SOAP_OK` or a `::soap_status` error code. @see `::soap_begin_recv`. */ int soap_end_recv(struct soap *soap) ///< `::soap` context /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Initialize the context for sending /** This function should be called to initialize the context for sending a message or to write a document. This function is called in the server and client-side code generated by soapcpp2, and in the generated `soap_T_write` functions to serialize data of type `T`. For example, it is called by `::soap_connect` (via `::soap_connect_command`) at the client side when a client connects to a server to send the HTTP headers and message body. The destination of the data to be send is `::soap::socket` when valid, or `::soap::sendfd` when nonzero or `::soap::os` when non-NULL. Returns `#SOAP_OK` or a `::soap_status` error code. @see `::soap::socket`, `::soap::sendfd`, `::soap::os`, `::soap_end_send`. */ int soap_begin_send(struct soap *soap) ///< `::soap` context /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Finalize the context after sending /** This function should be called to finalize the context after sending a message or to end writing a document. This function is called in the server and client-side code generated by soapcpp2, and in the generated `soap_T_write` functions to serialize data of type `T`. Returns `#SOAP_OK` or a `::soap_status` error code. @see `::soap_begin_send`. */ int soap_end_send(struct soap *soap) ///< `::soap` context /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Initialize context to count message length for sending /** This function is used to determine the HTTP content length. This is done by sending the message after calling this function to update `::soap::count`. To activate message length counting the `#SOAP_IO_LENGTH` mode is enabled, which prevents the message from being sent by not passing the data to the (internal) `::soap::fsend` callback. HTTP requires either the HTTP content length header or HTTP transfer encoding chunked with `#SOAP_IO_CHUNK`. Alternatively, the mode of the context can be set to `#SOAP_IO_STORE` to buffer the entire message in memory to determine the message content length. @par Examples: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); char *response = NULL; size_t response_len; const char *request = "{ \"title\": \"Example\", \"doc\": \"Some text\" }\n"; // HTTP POST request, soap_POST stores the entire message with SOAP_IO_STORE to determine HTTP content length if (soap_POST(soap, "http://www.example.com/API/POST", NULL, "application/json; charset=utf-8") || soap_send(soap, request) || soap_end_send(soap) || soap_begin_recv(soap) || (response = soap_http_get_body(soap, &response_len)) != NULL || soap_end_recv(soap)) soap_print_fault(soap, stderr); else printf("%s", response); soap_closesock(soap); ~~~ ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); soap->fget = my_get; // HTTP GET handler to serve HTTP GET ... // serve requests with soap_bind, soap_accept, soap_ssl_accept, and soap_serve int my_get(struct soap *soap) { // serve HTTP GET request, here we compute the content length instead of chunked transfer with SOAP_IO_CHUNK or storing the entire message with SOAP_IO_STORE const char *response = "Some text\n"; if (soap_begin_count(soap) || soap_send(soap, response) || soap_end_count(soap) || soap_response(soap, SOAP_OK) || soap_send(soap, response) || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } ~~~ Same examples but using HTTP transfer encoding chunked: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_IO_CHUNK); char *response = NULL; size_t response_len; const char *request = "{ \"title\": \"Example\", \"doc\": \"Some text\" }\n"; if (soap_POST(soap, "http://www.example.com/API/POST", NULL, "application/json; charset=utf-8") || soap_send(soap, request) || soap_end_send(soap) || soap_begin_recv(soap) || (response = soap_http_get_body(soap, &response_len)) != NULL || soap_end_recv(soap)) soap_print_fault(soap, stderr); else printf("%s", response); soap_closesock(soap); ~~~ ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_IO_CHUNK); soap->fget = my_get; // HTTP GET handler to serve HTTP GET ... // serve requests with soap_bind, soap_accept, soap_ssl_accept, and soap_serve int my_get(struct soap *soap) { const char *response = "Some text\n"; if (soap_response(soap, SOAP_OK) || soap_send(soap, response) || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } ~~~ @see `::soap_end_count`, `#SOAP_IO_LENGTH`, `#SOAP_IO_CHUNK`, `#SOAP_IO_STORE`. */ int soap_begin_count(struct soap *soap) ///< `::soap` context /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Finalize context to count message length for sending /** This function is used to determine the HTTP content length. This is done by sending the message after calling this function to update `::soap::count`. HTTP requires either the HTTP content length header or HTTP transfer encoding chunked with `#SOAP_IO_CHUNK`. Alternatively, the mode of the context can be set to `#SOAP_IO_STORE` to buffer the entire message in memory to determine the message content length. @see `::soap_begin_count`, `#SOAP_IO_LENGTH`, `#SOAP_IO_CHUNK`, `#SOAP_IO_STORE`. */ int soap_end_count(struct soap *soap) ///< `::soap` context /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Close the socket connection /** This function should be called to close `::soap::socket`. The socket is closed and `::soap::socket` is set to `#SOAP_INVALID_SOCKET` if the socket is valid, keep-alive is not enabled and not currently active, i.e. the socket is closed when `::soap::socket` != `#SOAP_INVALID_SOCKET` and `::soap::keep_alive` == 0. Therefore, this function keeps the socket connection open when keep-alive is currently active. This function may be called multiple times but closes the socket just once if the socket connection was open. This function is called in the server and client-side code generated by soapcpp2. Returns the current value of `::soap::error` to propagate the error state when used as `return soap_closesock(soap);`. @see `::soap_force_closesock`, `::soap_close_connection`. */ int soap_closesock(struct soap *soap) ///< `::soap` context /// @returns the value of `::soap::error` (`#SOAP_OK` or a `::soap_status` error code) ; /// Forcibly close the socket connection /** This function immediately closes `::soap::socket` and should only be used when `::soap_closesock` does not suffice. By contrast, `::soap_closesock` gently finalizes the SSL connection, and when `::soap::keep_alive` == 0 calls `shutdown` and `close` on `::soap::socket`. By calling `::soap_force_closesock` the socket is forcibly closed immediately and `::soap::socket` is set to `#SOAP_INVALID_SOCKET`, even when keep-alive is currently active. This function may be called multiple times but closes the socket just once if the socket connection was open. Returns the current value of `::soap::error` to propagate the error state when used as `return soap_force_closesock(soap);`. @see `::soap_closesock`, `::soap_close_connection`. */ int soap_force_closesock(struct soap *soap) ///< `::soap` context /// @returns the value of `::soap::error` (`#SOAP_OK` or a `::soap_status` error code) ; /// Close the connection of the specified context using a self-pipe /** This function closes the connection of the specified context, i.e. when it hangs on socket IO and the specified `::soap::recv_timeout` and `::soap::send_timeout` timeouts are not sufficient to release the blocking socket IO. This function force-closes a connection, which is typically done by another thread that detects a termination condition. Requires compilation with `#WITH_SELF_PIPE` and requires `::soap::recv_timeout` set to a nonzero timeout value. Alternatively, `#THREAD_CANCEL` can be used with a thread cleanup function added with `pthread_cleanup_push`. See `#THREAD_CANCEL` for details. @par Example: ~~~{.cpp} #include "soapH.h" #include "plugin/threads.h" struct soap *soap = soap_new(); soap->bind_flags = SO_REUSEADDR; // immediate port reuse soap->accept_timeout = 3600; // exit loop when no request arrives in one hour soap->send_timeout = soap_recv_timeout = 5; // 5 seconds max socket stall time (unlimited by default) soap->transfer_timeout = 30; // 30 seconds max message transfer time (unlimited by default) soap->recv_maxlength = 1048576; // limit messages received to 1MB (2GB by default) if (soap_valid_socket(soap_bind(soap, NULL, PORTNUM, BACKLOG))) { while (1) { if (soap_valid_socket(soap_accept(soap))) { THREAD_TYPE tid; struct soap *tsoap = soap_copy(soap); if (!tsoap) soap_force_closesock(soap); else while (THREAD_CREATE(&tid, (void*(*)(void*))&accept_request, (void*)tsoap)) sleep(1); // failed, try again } else if (soap->errnum) // accept failed, try again after 1 second { soap_print_fault(soap, stderr); sleep(1); } else // accept timed out, quit looping { break; } soap_destroy(soap); soap_end(soap); } } soap_free(soap); void *accept_request(struct soap *soap) { THREAD_TYPE tid; struct soap *tsoap; THREAD_DETACH(THREAD_ID); // create a new thread that is timed to execute for max 10 seconds tsoap = soap_copy(soap); if (!tsoap) { soap_force_closesock(soap); } else { while (THREAD_CREATE(&tid, (void*(*)(void*))&process_request, (void*)tsoap)) sleep(1); // failed, try again // allow serving the request by the new thread for up to 30 seconds max sleep(30); // terminate soap_serve in process_request then wait for it to join soap_close_connection(tsoap); THREAD_JOIN(tid); // clean up the terminated thread context soap_free(tsoap); } // clean up soap_destroy(soap); soap_end(soap); soap_free(soap); return NULL; } void *process_request(struct soap *soap) { soap_serve(soap); soap_destroy(soap); soap_end(soap); return NULL; } ~~~ @note Requires gSOAP 2.8.71 or greater, compilation with `#WITH_SELF_PIPE`, and nonzero `::soap::recv_timeout` and `::soap::send_timeout` timeout values. @see `::soap_closesock`, `::soap_force_closesock`, `::soap::recv_timeout`, `::soap::send_timeout`, `::soap::transfer_timeout`. */ void soap_close_connection(struct soap *soap) ///< `::soap` context ; /// Send a string /** This function sends a 0-terminated string to `::soap::os` when non-NULL, or to `::soap::socket` when valid, or or to `::soap::sendfd` when nonzero. @see `::soap_begin_count`, `::soap_end_count`, `::soap_begin_send`, `::soap_end_send`, `::soap_send_raw`. */ int soap_send( struct soap *soap, ///< `::soap` context const char *s) ///< 0-terminated string to send /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Send raw bytes /** This function sends raw bytes of data to `::soap::os` when non-NULL, or to `::soap::socket` when valid, or or to `::soap::sendfd` when nonzero. @see `::soap_begin_count`, `::soap_end_count`, `::soap_begin_send`, `::soap_end_send`, `::soap_send_raw`. */ int soap_send_raw( struct soap *soap, ///< `::soap` context const char *s, ///< data to send size_t n) ///< length of data to send /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Check if HTTP body message is not empty /** This function returns nonzero if an HTTP message body is present, zero otherwise. This function should be called immediately after calling `::soap_begin_recv`. Note that `::soap_begin_recv` is called at the server side before a HTTP callback is called, such as `::soap::fput` and `::soap::fpatch`. Callbacks and the `::http_post` HTTP POST plugin handlers should therefore not call `::soap_begin_recv`. Also, `::soap_begin_recv` is called at the client side by HTTP functions such as `::soap_GET`, after which the HTTP body can then be checked with `::soap_http_has_body` and retrieved with `::soap_http_get_body`. @see \ref group_callbacks, `::soap_begin_recv`, `::soap_end_recv`, `::soap_http_get_body`, `::soap_GET`, `::soap_POST`, `::soap::fput`, `::soap::fpatch`, `::http_post`. */ int soap_http_has_body(struct soap *soap) ///< `::soap` context /// @returns nonzero if an HTTP body is present, zero otherwise ; /// Get the HTTP body message as a string /** This function parses an HTTP body message into a string, whether or not an HTTP body message is present. This function should be called immediately after calling `::soap_begin_recv`. Note that `::soap_begin_recv` is called at the server side before a HTTP callback is called, such as `::soap::fput` and `::soap::fpatch`. Callbacks and the `::http_post` HTTP POST plugin handlers should therefore not call `::soap_begin_recv`. Also, `::soap_begin_recv` is called at the client side by HTTP functions such as `::soap_GET`, after which the HTTP body can then be then be checked with `::soap_http_has_body` and retrieved with `::soap_http_get_body`. This function reads input from from `::soap::is` when non-NULL, or `::soap::socket` when valid, or from `::soap::recvfd`, and sets the `len` pointer parameter to the length of the string read if `len` is not NULL. After calling this function, `::soap_end_recv` should be called. Returns the HTTP body as a string allocated in managed memory or returns "" (empty string, since version 2.8.71 or returns NULL for previous versions) when no HTTP message body is present or NULL when an error occurred and sets `::soap::error`. @par Examples: ~~~{.cpp} #include "soapH.h" int main() { struct soap *soap = soap_new1(SOAP_IO_CHUNK); // use SOAP_IO_CHUNK or SOAP_IO_STORE char *response = NULL; size_t response_len; if (soap_GET(soap, "http://www.example.com/API/GET", NULL) || soap_begin_recv(soap) || (response = soap_http_get_body(soap, &response_len)) != NULL || soap_end_recv(soap)) soap_print_fault(soap, stderr); else fwrite(response, 1, response_len, stdout); soap_closesock(soap); } ~~~ ~~~{.cpp} #include "soapH.h" int main() { struct soap *soap = soap_new(); soap->fput = my_put; // HTTP PUT handler to serve HTTP PUT ... // serve requests with soap_bind, soap_accept, soap_ssl_accept, and soap_serve } int my_put(struct soap *soap) { size_t len; char *message = soap_http_get_body(soap, &len); soap_end_recv(soap); ... // use the message data return soap_send_empty_response(soap, 202); // HTTP 202 Accepted } ~~~ @see \ref group_callbacks, `::soap_begin_recv`, `::soap_end_recv`, `::soap_http_has_body`, `::soap_GET`, `::soap_POST`, `::soap::fput`, `::soap::fpatch`, `::http_post`. */ char * soap_http_get_body( struct soap *soap, ///< `::soap` context size_t *len) ///< pointer to the length variable to assign or NULL /// @returns HTTP body as a string or NULL when an error occurred ; /// Get a header line /** This function stores a header line into the specified buffer `buf` of maxiumum length `len`. This function should be used to read HTTP and MIME headers, which end with CRLF or LF. The function handles header continuations (indents). This function reads input from `::soap::is` when non-NULL, or from `::soap::socket` when valid, or from `::soap::recvfd`. Returns `#SOAP_OK` or a `::soap_status` error code. */ int soap_getline( struct soap *soap, ///< `::soap` context char *buf, ///< buffer to fill (string) int len) ///< maximum size of the buffer (int) /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Wide char type typedef int32_t soap_wchar; /// Get next byte without consuming it /** This function returns the next byte on the input without consuming it, i.e. peeks one byte ahead. Reads a byte from `::soap::is` when non-NULL, or from `::soap::socket` when valid, or from `::soap::recvfd`. Returns the next byte or EOF when an error occurred and sets `::soap::error` to a `::soap_status` value and `::soap::errnum` to the `errno` value of the failure. */ soap_wchar soap_get0(struct soap *soap) ///< `::soap` context /// @returns byte read or EOF when an error occurred ; /// Get next byte /** This function returns the next byte on the input. Reads a byte from `::soap::is` when non-NULL, or from `::soap::socket` when valid, or from `::soap::recvfd`. Returns the next byte or EOF when an error occurred and sets `::soap::error` to a `::soap_status` value and `::soap::errnum` to the `errno` value of the failure. */ soap_wchar soap_get1(struct soap *soap) ///< `::soap` context /// @returns byte read or EOF when an error occurred ; /// Poll the connection /** This function returns `#SOAP_OK` if the connection is ready to send and receive data, `#SOAP_EOF` otherwise. Also returns `#SOAP_OK` if the socket connection is closed but data can still be read or written from/to other streams. @see `::soap_ready`. */ int soap_poll(struct soap *soap) ///< `::soap` context /// @returns `#SOAP_OK` (ready), `#SOAP_EOF` (not ready), or `#SOAP_TCP_ERROR` (error) ; /// Check if the connection is ready to receive pending data /** This function returns `#SOAP_OK` if the connection is ready to receive pending data, `#SOAP_EOF` otherwise. Also returns `#SOAP_OK` if the socket connection is closed but data can still be read from other streams. @par Examples: ~~~{.cpp} // file.h interface header file for soapcpp2 // REST request data struct ns__request { int SKU; }; // REST response data struct ns__response { char *product_name; }; // SOAP web method response data struct ns__webmethodResponse { char *string; int number; }; // SOAP web method int ns__webmethod(char *string, int number, struct ns__webmethodResponse *response); ~~~ soapcpp2 -c file.h ~~~{.cpp} // SOAP client application (requires 2.8.75 or greater) #include "soapH.h" #include "ns.nsmap" int main() { struct soap *soap = soap_new(); struct ns__webmethodResponse response; // send the SOAP request message of ns__webmethod declared in a .h file for soapcpp2 if (soap_send_ns__webmethod(soap, endpoint, NULL, "hello", 123)) ... // error // wait on message ready to receive from server while (soap_ready(soap) == SOAP_EOF) { // do some more work here (or sleep 1ms as below) usleep(1000); } if (soap->error) ... // error // receive the SOAP response message of ns__webmethod declared in a .h file for soapcpp2 if (soap_recv_ns__webmethod(soap, &response)) ... // error ... // process the response soap_destroy(soap); soap_end(soap); soap_free(soap); } ~~~ ~~~{.cpp} // REST POST client application #include "soapH.h" #include "ns.nsmap" int main() { struct soap *soap = soap_new(); struct ns__request request; // serializable type declared in a .h file for soapcpp2 struct ns__response response; // serializable type declared in a .h file for soapcpp2 soap_default_ns__request(soap, &request); ... // populate request data // POST the REST request message using the ns__request serializer if (soap_POST_send_ns__request(soap, endpoint, &request)) ... // error // wait on message ready to receive from server while (soap_ready(soap) == SOAP_EOF) { // do some more work here (or sleep 1ms as below) usleep(1000); } if (soap->error) ... // error // receive the REST response message using the ns__response serializer if (soap_POST_recv_ns__response(soap, &response)) ... // error ... // process the response data soap_destroy(soap); soap_end(soap); soap_free(soap); } ~~~ ~~~{.cpp} // REST GET client application #include "soapH.h" #include "ns.nsmap" int main() { struct soap *soap = soap_new(); struct ns__response response; // serializable type declared in a .h file for soapcpp2 // HTTP GET if (soap_GET(soap, "http://www.exanple.org/get?SKU=123", NULL)) ... // error // wait on message ready to receive from server while (soap_ready(soap) == SOAP_EOF) { // do some more work here (or sleep 1ms as below) usleep(1000); } if (soap->error) ... // error // receive the response message using the ns__response serializer if (soap_read_ns__response(soap, &response)) { soap_closesock(soap); ... // error } soap_closesock(soap); ... // process the response data soap_destroy(soap); soap_end(soap); soap_free(soap); } ~~~ @see `::soap_poll`. */ int soap_ready(struct soap *soap) ///< `::soap` context /// @returns `#SOAP_OK` (ready), `#SOAP_EOF` (not ready), or `#SOAP_TCP_ERROR` (error) ; /// Receive an HTTP response message from the server that is assumed to be empty /** This function receives an HTTP response message from the server and is typically used when HTTP 202 Accepted or HTTP 200 OK is expected without data. Therefore the HTTP response message body is assumed to be empty. If the message is not empty then a fault message with the HTTP body as the fault string will be produced and the `::soap::error` is set to the HTTP status code received. This function reads input from `::soap::is` when non-NULL, or from `::soap::socket` when valid, or from `::soap::recvfd`. Returns `#SOAP_OK` or a `::soap_status` error code such as the HTTP status code received. */ int soap_recv_empty_response(struct soap *soap) ///< `::soap` context /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Return an HTTP response message with an empty HTTP body from a service back to the client or peer /** This function sends an empty response back to the client. The response includes the specified `status` HTTP status code in the HTTP header but the HTTP body is empty. This function should be used with HTTP PUT or PATCH requests and "one-way" SOAP messaging with HTTP POST. This function sends to `::soap::socket` when valid, or to `::soap::os` when non-NULL, or to `::soap::sendfd`. Returns `#SOAP_STOP` and sets `::soap::error` to `#SOAP_STOP` to halt further response messaging to the client or a `::soap_status` error code when the message could not be sent. Besides `::soap_send_empty_response`, other options to return an HTTP status code are: - Use `::soap_response` using `#SOAP_FILE + status` to produce an HTTP response message with the specified HTTP status code. - Return a HTTP status code between 200 and 299 directly to produce an empty HTTP response message with the given HTTP status code. - Return a HTTP status code between 300 and 599 directly to produce an HTTP response message with the given HTTP status code and a SOAP Fault message body. @par Examples: ~~~{.cpp} #include "soapH.h" int main() { struct soap *soap = soap_new(); soap->fput = my_put; // HTTP PUT handler to serve HTTP PUT ... // serve requests with soap_bind, soap_accept, soap_ssl_accept, and soap_serve } int my_put(struct soap *soap) { size_t len; char *message = soap_http_get_body(soap, &len); soap_end_recv(soap); ... // use the message data return soap_send_empty_response(soap, 202); // HTTP 202 Accepted } ~~~ ~~~{.cpp} #include "soapH.h" int main() { struct soap *soap = soap_new(); soap->fput = my_put; // HTTP PUT handler to serve HTTP PUT ... // serve requests with soap_bind, soap_accept, soap_ssl_accept, and soap_serve } int my_put(struct soap *soap) { if (soap->http_content && soap_tag_cmp(soap->http_content, "text/xml*") == 0) { soap_dom_element *dom = soap_new_xsd__anyType(soap); // get dom, don't use soap_read_xsd__anyType because we are already reading from a socket if (soap_in_xsd__anyType(soap, "doc", dom, NULL) == SOAP_OK) { ... // inspect the DOM using the DOM API functions return soap_send_empty_response(soap, 202); // HTTP 202 Accepted } } return soap_send_empty_response(soap, 400); // HTTP 400 Bad Request } ~~~ @see `::soap_bind`, `::soap_accept`, `::soap_serve`, `::soap_response`, `::soap::fget`, `::soap::fput`, `::soap::fpatch`, `::soap::fdel`, `::soap::fopt`, `::soap::fhead`. */ int soap_send_empty_response( struct soap *soap, ///< `::soap` context int status) ///< HTTP status code 200 to 599 or `#SOAP_OK` (same as 200 OK) /// @returns `#SOAP_STOP` ; /// Parse the XML `` element opening tag if present int soap_envelope_begin_in(struct soap *soap) ///< `::soap` context ; /// Parse the XML `` element closing tag if present int soap_envelope_end_in(struct soap *soap) ///< `::soap` context /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Emit the XML `` element opening tag if `::soap::version` is nonzero int soap_envelope_begin_out(struct soap *soap) ///< `::soap` context /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Emit the XML `` element closing tag if `::soap::version` is nonzero int soap_envelope_end_out(struct soap *soap) ///< `::soap` context /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Parse the XML `` element opening tag if present int soap_body_begin_in(struct soap *soap) ///< `::soap` context /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Parse the XML `` element closing tag if present int soap_body_end_in(struct soap *soap) ///< `::soap` context /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Emit the XML `` element opening tag if `::soap::version` is nonzero int soap_body_begin_out(struct soap *soap) ///< `::soap` context /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Emit the XML `` element closing tag if `::soap::version` is nonzero int soap_body_end_out(struct soap *soap) ///< `::soap` context /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Parse and deserialize the SOAP Fault /** This function parses and deserializes the SOAP Fault such that `::soap::fault` points to a `::SOAP_ENV__Fault` structure. If the specified `check` parameter is nonzero, this function attempts to parse the SOAP Fault that may be present (it checks), but if no `SOAP-ENV:Fault` element is present returns `#SOAP_OK`. If the specified `check` parameter is zero, this function parses the SOAP Fault that is expected to be present, but if `SOAP-ENV:Fault` element is present returns the HTTP error code received (when between 300 and 599) or the `::soap::error` code. */ int soap_recv_fault( struct soap *soap, ///< `::soap` context int check) ///< flag to check or expect a SOAP Fault /// @returns a nonzero `::soap_status` error code ; /// Return an HTTP error with a SOAP Fault message from a service /** This function sends an error response back to the client and is used at the server side by `::soap_serve` after an error occurred to propagate the fault to the client. This function sends to `::soap::socket` when valid, or to `::soap::os` when non-NULL, or to `::soap::sendfd`. */ int soap_send_fault(struct soap *soap) ///< `::soap` context /// @returns the value of `::soap::error`, a nonzero error code ; /// Parse and deserialize the SOAP Header /** This function parses and deserializes the SOAP Header such that `::soap::header` points to a `::SOAP_ENV__Header` structure. */ int soap_recv_header(struct soap *soap) ///< `::soap` context /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Emit the SOAP Header pointed to by `::soap::header` int soap_putheader(struct soap *soap) ///< `::soap` context /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Serialize the SOAP Header pointed to by `::soap::header` before emitting it with `::soap_putheader` void soap_serializeheader(struct soap *soap) ///< `::soap` context ; /// The HTTP GET plugin registration function /** This function is used to register the `::http_get` HTTP GET plugin with `soap_register_plugin_arg(soap, http_get, http_get_handler)` where the `http_get_handler` is a user-defined function to handle HTTP GET requests. The HTTP GET plugin API is declared and defined in `gsoap/plugin/httpget.h` and `gsoap/plugin/httpget.c`. @par Example: ~~~{.cpp} #include "soapH.h" #include "plugin/httpget.h" int main() { struct soap *soap = soap_new(); soap_register_plugin_arg(soap, http_get, http_get_handler); ... // serve requests with soap_bind, soap_accept, soap_ssl_accept, and soap_serve } int http_get_handler(struct soap *soap) { if (!strncmp(soap->path, "/API/GET", 8)) { // get the query key=val pairs from soap->path char *query = soap_query(soap); while (query) { // get next key=val pair char *key = soap_query_key(soap, &query); char *val = soap_query_key(soap, &query); ... // use key and val (key is non-NULL, val may be NULL) } // return a response message soap->http_content = "application/json; charset=utf-8"; if (soap_response(soap, SOAP_FILE) || soap_send(soap, "{ \"title\": \"Example\", \"doc\": \"Some text\" }\n") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } return 404; // HTTP 404 Not Found } ~~~ @see `::soap_http_get_stats`, `::soap_query`. */ int http_get(struct soap*, struct soap_plugin*, void*); /// Collect access statistics with the `::http_get` plugin /** This function sets the specified minutes, hour, and day parameters to point to an array of requests per minute, an array of request per hour, and an array of requests per day of the year. The minutes array has 60 entries, the hour array has 24 entries, and the day array has 365 entries (a leap year will roll over). The plugin will collect the stats among a set of server threads if the spawned thread contexts are created with `::soap_copy`. @note This function is declared and defined in `gsoap/plugin/httpget.h` and `gsoap/plugin/httpget.c` and requires the `::http_get` plugin. @par Example: ~~~{.cpp} #include "soapH.h" #include "plugin/httpget.h" int main() { struct soap *soap = soap_new(); soap_register_plugin_arg(soap, http_get, http_get_handler); if (soap_valid_socket(soap_bind(soap, NULL, PORTNUM, BACKLOG))) { while (1) { size_t stat_get, stat_post, stat_fail, *hist_min, *hist_hour, *hist_day; if (soap_valid_socket(soap_accept(soap))) { if (soap_serve(soap)) soap_print_fault(soap, stderr); } else if (soap->errnum) // accept failed, try again after 1 second { soap_print_fault(soap, stderr); sleep(1); } else // accept timed out, quit looping { break; } soap_http_get_stats(soap, &stat_get, &stat_post, &stat_fail, &hist_min, &hist_hour, &hist_day); // show the number of GET, POST, and failures printf("\n#GET = %d #POST = %d failures = %d", stat_get, stat_post, stat_fail); // show the stats collected per hour printf("\nBy hour: "); for (i = 0; i < 24; i++) printf("%8d", i); printf("\nRequests:"); for (i = 0; i < 24; i++) printf("%8d", hist_hour[i]); soap_destroy(soap); soap_end(soap); } } soap_free(soap); } ~~~ */ void soap_http_get_stats( struct soap *soap, ///< `::soap` context size_t *stat_get, ///< points to a variable to assign the number of GET requests size_t *stat_post, ///< points to a variable to assign the number of POST requests size_t *stat_fail, ///< points to a variable to assign the number of failed requests size_t **hist_min, ///< points to a pointer to an array of 60 entries with histogram of requests per minute size_t **hist_hour, ///< points to a pointer to an array of 24 entries with histogram of requests per hour size_t **hist_day) ///< points to a pointer to an array of 365 entries with histogram of requests per day ; /// Extract the query string from the URL path at the server side with the `::http_get` plugin /** At the server side the value `::soap::path` is set to the URL's path string which may include a query string of the form "?key=val&key=val" with a sequence of key=val pairs, where the value is optional. Returns the query string or NULL when none is present. To extract the keys and values from the string returned by this function, use `::soap_query_key` and `::soap_query_val`. The `::http_get` plugin sets a HTTP GET handler function to serve HTTP GET requests (or NULL to remove a handler) with `soap_register_plugin_arg(soap, http_get, http_get_handler)` and keeps track of the number of GET and POST invocations made and the number of server requests by the minute, by the hour, and by the day. @note This function is declared and defined in `gsoap/plugin/httpget.h` and `gsoap/plugin/httpget.c` and requires the `::http_get` plugin. @par Example: ~~~{.cpp} #include "soapH.h" #include "plugin/httpget.h" int main() { struct soap *soap = soap_new(); soap_register_plugin_arg(soap, http_get, http_get_handler); if (soap_valid_socket(soap_bind(soap, NULL, PORTNUM, BACKLOG))) { while (1) { size_t *min, *hour, *day; if (soap_valid_socket(soap_accept(soap))) { if (soap_serve(soap)) soap_print_fault(soap, stderr); } else if (soap->errnum) // accept failed, try again after 1 second { soap_print_fault(soap, stderr); sleep(1); } else // accept timed out, quit looping { break; } soap_destroy(soap); soap_end(soap); } } soap_free(soap); } int http_get_handler(struct soap *soap) { if (!strncmp(soap->path, "/API/GET", 8)) { // get the query key=val pairs from soap->path char *query = soap_query(soap); while (query) { // get next key=val pair char *key = soap_query_key(soap, &query); char *val = soap_query_key(soap, &query); ... // use key and val (key is non-NULL, val may be NULL) } // return a response message soap->http_content = "application/json; charset=utf-8"; if (soap_response(soap, SOAP_FILE) || soap_send(soap, "{ \"title\": \"Example\", \"doc\": \"Some text\" }\n") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } return 404; // HTTP 404 Not Found } int ns__webmethod(struct soap *soap, ...) { char *query = soap_query(soap); while (query) { // get next key=val pair char *key = soap_query_key(soap, &query); char *val = soap_query_key(soap, &query); ... // use key and val (key is non-NULL, val may be NULL) } ... } ~~~ @see `::soap_query_key`, `::soap_query_val`, `::soap_http_get_stats`. */ char * soap_query(struct soap *soap) ///< `::soap` context ; /// Extract the next query string key at the server side with the `::http_get` plugin /** This function takes a pointer to the string variable returned by `::soap_query` and updates it to point to the value (if present), then returns the query key or NULL if no more query key-value pairs are present in the query string. @note This function is declared and defined in `gsoap/plugin/httpget.h` and `gsoap/plugin/httpget.c` and requires the `::http_get` plugin. @par Example: ~~~{.cpp} // get the query key=val pairs from soap->path char *query = soap_query(soap); while (query) { // get next key=val pair char *key = soap_query_key(soap, &query); char *val = soap_query_key(soap, &query); ... // use key and val (key is non-NULL, val may be NULL) } ~~~ @see `::soap_query`, `::soap_query_val`. */ char * soap_query_key( struct soap *soap, ///< `::soap` context char **query) ///< points to the string returned by soap_query and soap_query_val /// @returns query string key ; /// Extract the next query string value at the server side with the `::http_get` plugin /** This function takes a pointer to the string variable returned by `::soap_query` and updates it to point to the next key (if present), then returns the query value or NULL if no value is bound to the key. @note This function is declared and defined in `gsoap/plugin/httpget.h` and `gsoap/plugin/httpget.c` and requires the `::http_get` plugin. @par Example: ~~~{.cpp} // get the query key=val pairs from soap->path char *query = soap_query(soap); while (query) { // get next key=val pair char *key = soap_query_key(soap, &query); char *val = soap_query_key(soap, &query); ... // use key and val (key is non-NULL, val may be NULL) } ~~~ @see `::soap_query`, `::soap_query_key`. */ char * soap_query_val( struct soap *soap, ///< `::soap` context char **query) ///< points to the string returned by soap_query and soap_query_key /// @returns query string value or NULL ; /// The HTTP POST plugin registration function /** This function is used to register the `::http_post` HTTP POST plugin with `soap_register_plugin_arg(soap, http_post, http_post_handler)` where the `http_post_handler` is a table of HTTP POST handler functions and generic POST, PUT, PATCH, and DELETE handler functions. The HTTP POST plugin API is declared and defined in `gsoap/plugin/httppost.h` and `gsoap/plugin/httppost.c`. @par Example: ~~~{.cpp} #include "soapH.h" #include "plugin/httppost.h" int main() { struct soap *soap = soap_new(); soap_register_plugin_arg(soap, http_post, http_post_handlers); ... // serve requests with soap_bind, soap_accept, soap_ssl_accept, and soap_serve } struct http_post_handlers http_post_handlers[] = { { "application/json", json_post_handler }, { "image/*", image_post_handler }, { "text/*", text_post_handler }, { "POST", generic_POST_handler }, { "PUT", generic_PUT_handler }, { "PATCH", generic_PATCH_handler }, { "DELETE", generic_DELETE_handler }, { NULL } }; // example image/* POST handler // note: json_post_handler and text_post_handler are similar to this example int image_post_handler(struct soap *soap) { const char *buf; size_t len; // for example, only handle /API/POST paths and content type image/gif if (!strncmp(soap->path, "/API/POST", 9)) || (soap->http_content && soap_tag_cmp(soap->http_content, "image/gif"))) return 404; // get HTTP POST message body buf = soap_http_get_body(soap, &len); if (!buf) return 400; // HTTP 400 Bad Request (void)soap_end_recv(soap); ... // process image in buf[0..len-1] // for example, send image back (HTTP POST returns a response message) soap->http_content = "image/gif"; if (soap_response(soap, SOAP_FILE) || soap_send_raw(soap, buf, len) || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } // example generic PUT handler int generic_PUT_handler(struct soap *soap) { const char *buf; size_t len; // for example, only handle /API/PUT paths and content type image/gif if (!strncmp(soap->path, "/API/PUT", 8)) || (soap->http_content && soap_tag_cmp(soap->http_content, "image/gif"))) return 404; // get HTTP PUT message body buf = soap_http_get_body(soap, &len); if (!buf) return 400; // HTTP 400 Bad Request (void)soap_end_recv(soap); ... // process image in buf[0..len-1] return soap_send_empty_response(soap, 200); // HTTP 200 OK } ~~~ */ int http_post(struct soap*, struct soap_plugin*, void*); /// The HTTP POST form plugin registration function /** This function is used to register the `::http_form` HTTP POST form plugin to handle application/x-www-form-urlencoded data with `soap_register_plugin_arg(soap, http_form, http_form_handler)` where the `http_form_handler` is a function to parse the application/x-www-form-urlencoded data received by the server. The HTTP POST form plugin API is declared and defined in `gsoap/plugin/httpform.h` and `gsoap/plugin/httpform.c`. Handling multipart/related and multipart/form-data at the server side is done by iterating over the `::soap_multipart` linked list containing the MIME attachments received, see the detailed description of \ref group_mime. @note This plugin requires the `::http_get` plugin for the `::soap_query_key` and `::soap_query_val` functions. @par Example: ~~~{.cpp} #include "soapH.h" #include "plugin/httpform.h" int main() { struct soap *soap = soap_new(); soap_register_plugin_arg(soap, http_form, http_form_handler); ... // serve requests with soap_bind, soap_accept, soap_ssl_accept, and soap_serve } int http_form_handler(struct soap *soap) { if (!strncmp(soap->path, "/API/FORM", 9)) { // get the application/x-www-form-urlencoded data char *form = soap_http_get_form(soap); while (form) { // get next key=val pair char *key = soap_query_key(soap, &form); char *val = soap_query_key(soap, &form); ... // use key and val (key is non-NULL, val may be NULL) } // return a response message if (soap_response(soap, SOAP_HTML) || soap_send(soap, "Thank you for submitting\n") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } return 404; // HTTP 404 Not Found } ~~~ @see `::soap_http_get_form`, `::http_get`, `::soap_query_key`, `::soap_query_val`. */ int http_form(struct soap*, struct soap_plugin*, void*); /// Get the HTTP POST application/x-www-form-urlencoded data as a string /** This function parses an HTTP body with application/x-www-form-urlencoded data into a string, prepends a `?`, and returns this string allocated in managed memory or NULL when an error occurred and sets `::soap::error`. @note This function is declared and defined in `gsoap/plugin/httpform.h` and `gsoap/plugin/httpform.c` and requires the `::http_form` plugin. @see `::http_form`. */ char * soap_http_get_form(struct soap *soap) ///< `::soap` context ; /// The HTTP pipelining plugin registration function /** This function is used to register the `::http_pipe` HTTP pipelining plugin to support HTTP pipelining. HTTP pipelining requires `#SOAP_IO_KEEPALIVE` enabled. At the server side, multiple threads should be used to serve requests, such as with a gSOAP multi-threaded stand-alone server. HTTP pipelining at the client side requires two threads, one to send request messages and one to receive the response messages, with logic to handle transmission errors and to resend failed request messages until all responses have been received. @par Example: ~~~{.cpp} #include "soapH.h" #include "plugin/httppipe.h" #include "plugin/threads.h" int main() { struct soap *soap = soap_new1(SOAP_IO_KEEPALIVE); // HTTP keep-alive soap_register_plugin(soap, http_pipe); // HTTP pipelining soap->bind_flags = SO_REUSEADDR; // immediate port reuse soap->accept_timeout = 3600; // exit loop when no request arrives in one hour soap->send_timeout = soap_recv_timeout = 5; // 5 seconds max socket stall time (unlimited by default) soap->transfer_timeout = 30; // 30 seconds max message transfer time (unlimited by default) soap->recv_maxlength = 1048576; // limit messages received to 1MB (2GB by default) if (soap_valid_socket(soap_bind(soap, NULL, PORTNUM, BACKLOG))) { while (1) { if (soap_valid_socket(soap_accept(soap))) { THREAD_TYPE tid; struct soap *tsoap = soap_copy(soap); if (!tsoap) soap_force_closesock(soap); else while (THREAD_CREATE(&tid, (void*(*)(void*))&process_request, (void*)tsoap)) sleep(1); // failed, try again } else if (soap->errnum) // accept failed, try again after 1 second { soap_print_fault(soap, stderr); sleep(1); } else // accept timed out, quit looping { break; } soap_destroy(soap); soap_end(soap); } } soap_free(soap); } void *process_request(struct soap *soap) { THREAD_DETACH(THREAD_ID); soap_serve(soap); soap_destroy(soap); soap_end(soap); soap_free(soap); return NULL; } ~~~ */ int http_pipe(struct soap*, struct soap_plugin*, void*); /** @} */ /** \defgroup group_cookies HTTP cookie functions @brief This module defines functions to set and get HTTP cookies at the server side This module defines the cookie structure of cookies stored in the cookie store and server-side functions to set and inspect cookies. Cookie handling is fully automatic on the client side, when the engine is compiled with `#WITH_COOKIES`. To avoid "cookie storms" caused by malicious servers that return an unreasonable amount of cookies, the size of the cookie store is limited to `::soap::cookie_max` cookies. Each `::soap` context has its own independent cookie store. To enable HTTP cookies, the engine must be compiled with `#WITH_COOKIES`. @see The [HTTP Server Session Management plugin](../../sessions/html/index.html) documentation to use the HTTP session plugin to store a database of sessions to keep track of client data across multiple requests. @{ */ /// Cookie structure /** Each `::soap` context has its own independent cookie store with up to `::soap::cookie_max` cookies. */ struct soap_cookie { struct soap_cookie *next; ///< next cookie in linked list or NULL char *name; ///< cookie name char *value; ///< cookie value char *domain; ///< cookie domain char *path; ///< cookie path ULONG64 expire; ///< local time to expire (value cast to time_t) long maxage; ///< server-side: seconds to expire unsigned int version; ///< cookie version value short secure; ///< HTTPS secure cookie short session; ///< server-side: this is session cookie short env; ///< server-side: got cookie from a client, do not sent to clients short modified; ///< server-side: client cookie was modified and should be sent to clients }; /// Add a cookie /** This function adds a cookie to the cookie store at the server side, if not already there, with the specified `name` and `value`. The `domain` and `path` parameters can be specified or can be NULL to use the current domain and path given by `::soap::cookie_domain` and `::soap::cookie_path`. Returns pointer to the cookie structure in the database or NULL when an error occurred. @par Example: ~~~{.cpp} // A CGI service with `::soap_serve` function generated by soapcpp2 from an interface file declaring a ns__webmethod function #include "soapH.h" int main() { struct soap *soap = soap_new(); soap->cookie_domain = "example.com"; soap->cookie_path = "/"; soap_getenv_cookies(soap); return soap_serve(soap); } // Define a ns__webmethod service operation with parameters that uses HTTP cookies to control state int ns__webmethod(struct soap *soap, ...) { const char *cookie_value = soap_cookie_value(soap, "cookie_name", NULL, NULL); if (cookie_value) ... // modify the cookie value to advance the state of this (otherwise stateless CGI) service else cookie_value = "initial_value"; soap_set_cookie(soap, "cookie_name", cookie_value, NULL, NULL); soap_set_cookie_expire(soap, "cookie_name", 60, NULL, NULL); // cookie expires in 60 seconds ... // other webmethod logic return SOAP_OK; } ~~~ To enable HTTP cookies, the engine must be compiled with `#WITH_COOKIES`. @see `::soap::cookie_domain`, `::soap::cookie_path`, `::soap::cookie_max`. */ struct soap_cookie * soap_set_cookie( struct soap *soap, ///< `::soap` context const char *name, ///< cookie name const char *value, ///< cookie value to set const char *domain, ///< cookie domain or NULL const char *path) ///< cookie path or NULL /// @returns pointer to cookie or NULL when an error occurred ; /// Set cookie expiration /** This function sets the expiration of the specified cookie `name` in seconds and updates the cookie store at the server side. The `domain` and `path` parameters can be specified or can be NULL to use the current domain and path given by `::soap::cookie_domain` and `::soap::cookie_path`. Returns `#SOAP_OK` or a `::soap_status` error code. @see `::soap::cookie_domain`, `::soap::cookie_path`. To enable HTTP cookies, the engine must be compiled with `#WITH_COOKIES`. */ int soap_set_cookie_expire( struct soap *soap, ///< `::soap` context const char *name, ///< cookie name long maxage, ///< the age to live in seconds const char *domain, ///< cookie domain or NULL const char *path) ///< cookie path or NULL /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Set cookie secure /** This function sets the "secure" property of the specified cookie `name` and updates the cookie store at the server side. The "secure" property means that this cookie should be sent by the client to the server only when a secure HTTPS connection can be established. When HTTPS is enabled all cookies are sent by the server to the client with the "secure" property set, which means that this function is generally not needed unless the server is not HTTPS-enabled but cookies must be secure. The `domain` and `path` parameters can be specified or can be NULL to use the current domain and path given by `::soap::cookie_domain` and `::soap::cookie_path`. Returns `#SOAP_OK` or a `::soap_status` error code. To enable HTTP cookies, the engine must be compiled with `#WITH_COOKIES`. @see `::soap::cookie_domain`, `::soap::cookie_path`. */ int soap_set_cookie_secure( struct soap *soap, ///< `::soap` context const char *name, ///< cookie name const char *domain, ///< cookie domain or NULL const char *path) ///< cookie path or NULL /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Set session cookie /** This function makes the specified cookie `name` a "session cookie" and updates the cookie store at the server side by marking the cookie as a session cookie. This means that the cookie will be sent to clients that connect to the server. This function is not needed when a cookie is modified with `::soap_set_cookie_expire`, for example, because modified cookies are always sent back to the client. The `domain` and `path` parameters can be specified or can be NULL to use the current domain and path given by `::soap::cookie_domain` and `::soap::cookie_path`. Returns `#SOAP_OK` or a `::soap_status` error code. To enable HTTP cookies, the engine must be compiled with `#WITH_COOKIES`. @see `::soap::cookie_domain`, `::soap::cookie_path`. */ int soap_set_cookie_session( struct soap *soap, ///< `::soap` context const char *name, ///< cookie name const char *domain, ///< cookie domain or NULL const char *path) ///< cookie path or NULL /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Clear cookie /** This function deletes the specified cookie `name` from the cookie store at the server side. The `domain` and `path` parameters can be specified or can be NULL to use the current domain and path given by `::soap::cookie_domain` and `::soap::cookie_path`. To enable HTTP cookies, the engine must be compiled with `#WITH_COOKIES`. @see `::soap::cookie_domain`, `::soap::cookie_path`. */ void soap_clr_cookie( struct soap *soap, ///< `::soap` context const char *name, ///< cookie name const char *domain, ///< cookie domain or NULL const char *path) ///< cookie path or NULL ; /// Clear session cookie /** This function clears the session property of the specified cookie `name` and updates the cookie store at the server side. The `domain` and `path` parameters can be specified or can be NULL to use the current domain and path given by `::soap::cookie_domain` and `::soap::cookie_path`. Returns `#SOAP_OK` or a `::soap_status` error code. To enable HTTP cookies, the engine must be compiled with `#WITH_COOKIES`. @see `::soap::cookie_domain`, `::soap::cookie_path`. */ int soap_clr_cookie_session( struct soap *soap, ///< `::soap` context const char *name, ///< cookie name const char *domain, ///< cookie domain or NULL const char *path) ///< cookie path or NULL /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Find a cookie /** This function returns the cookie structure of the specified cookie `name` or NULL when not found by searching the cookie store at the server side. The `domain` and `path` parameters can be specified or can be NULL to use the current domain and path given by `::soap::cookie_domain` and `::soap::cookie_path`. To enable HTTP cookies, the engine must be compiled with `#WITH_COOKIES`. @see `::soap::cookie_domain`, `::soap::cookie_path`. */ struct soap_cookie * soap_cookie( struct soap *soap, ///< `::soap` context const char *name, ///< cookie name const char *domain, ///< cookie domain or NULL const char *path) ///< cookie path or NULL /// @returns pointer to a `::soap_cookie` structure or NULL when not found ; /// Get cookie value /** This function returns the cookie value of the specified cookie `name` or NULL when not found by searching the cookie store at the server side. The `domain` and `path` parameters can be specified or can be NULL to use the current domain and path given by `::soap::cookie_domain` and `::soap::cookie_path`. To enable HTTP cookies, the engine must be compiled with `#WITH_COOKIES`. @see `::soap::cookie_domain`, `::soap::cookie_path`. */ const char * soap_cookie_value( struct soap *soap, ///< `::soap` context const char *name, ///< cookie name const char *domain, ///< cookie domain or NULL const char *path) ///< cookie path or NULL /// @returns cookie value or NULL when not found ; /// Get cookie expiration /** This function returns the cookie expiration time `time_t` of the specified cookie `name` or -1 when not found by searching the cookie store at the server side. The `domain` and `path` parameters can be specified or can be NULL to use the current domain and path given by `::soap::cookie_domain` and `::soap::cookie_path`. To enable HTTP cookies, the engine must be compiled with `#WITH_COOKIES`. @see `::soap::cookie_domain`, `::soap::cookie_path`. */ time_t soap_cookie_expire( struct soap *soap, ///< `::soap` context const char *name, ///< cookie name const char *domain, ///< cookie domain or NULL const char *path) ///< cookie path or NULL /// @returns cookie expiration time ; /// Get cookies from the `HTTP_COOKIE` environment variable /** This function initializes the cookie store at the server side by reading the `HTTP_COOKIE` environment variable. This provides a means for a CGI application to read cookies sent by a client. Returns `#SOAP_OK` or a `::soap_status` error code when the `HTTP_COOKIE` variable was not found. To enable HTTP cookies, the engine must be compiled with `#WITH_COOKIES`. */ int soap_getenv_cookies(struct soap *soap) ///< `::soap` context /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Free cookies /** This function frees the cookie store and deletes all cookies. To enable HTTP cookies, the engine must be compiled with `#WITH_COOKIES`. */ void soap_free_cookies(struct soap *soap) ///< `::soap` context ; /** @} */ /** \defgroup group_s2s Conversion functions @brief This module defines conversion functions of values of various types to and from strings @{ */ /// Convert a decimal string to a signed 8 bit byte (char) integer value /** This function converts the specified decimal string to a signed 8 bit byte (char) integer value. Returns `#SOAP_OK` or a `::soap_status` error code such as `#SOAP_TYPE` when the string could not be converted. */ int soap_s2byte( struct soap *soap, ///< `::soap` context const char *string, ///< string to convert char *value) ///< pointer to a variable to assign the converted value to /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Convert a decimal string to a signed 16 bit integer value /** This function converts the specified decimal string to a signed 16 bit integer value. Returns `#SOAP_OK` or a `::soap_status` error code such as `#SOAP_TYPE` when the string could not be converted. */ int soap_s2short( struct soap *soap, ///< `::soap` context const char *string, ///< string to convert short *value) ///< pointer to a variable to assign the converted value to /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Convert a decimal string to a signed 32 bit integer value /** This function converts the specified decimal string to a signed 32 bit integer value. Returns `#SOAP_OK` or a `::soap_status` error code such as `#SOAP_TYPE` when the string could not be converted. */ int soap_s2int( struct soap *soap, ///< `::soap` context const char *string, ///< string to convert int *value) ///< pointer to a variable to assign the converted value to /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Convert a decimal string to a signed `long` integer value /** This function converts the specified decimal string to a signed `long` integer value. Returns `#SOAP_OK` or a `::soap_status` error code such as `#SOAP_TYPE` when the string could not be converted. */ int soap_s2long( struct soap *soap, ///< `::soap` context const char *string, ///< string to convert long *value) ///< pointer to a variable to assign the converted value to /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Convert a decimal string to a signed 64 bit integer value /** This function converts the specified decimal string to a signed 64 bit integer value. Returns `#SOAP_OK` or a `::soap_status` error code such as `#SOAP_TYPE` when the string could not be converted. */ int soap_s2LONG64( struct soap *soap, ///< `::soap` context const char *string, ///< string to convert LONG64 *value) ///< pointer to a variable to assign the converted value to /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Convert a decimal string to a float value /** This function converts the specified decimal string to a single precision float value. Also converts `NaN` and `Inf`. Returns `#SOAP_OK` or a `::soap_status` error code such as `#SOAP_TYPE` when the string could not be converted. */ int soap_s2float( struct soap *soap, ///< `::soap` context const char *string, ///< string to convert float *value) ///< pointer to a variable to assign the converted value to /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Convert a decimal string to a double float value /** This function converts the specified decimal string to a double precision float value. Also converts `NaN` and `Inf`. Returns `#SOAP_OK` or a `::soap_status` error code such as `#SOAP_TYPE` when the string could not be converted. */ int soap_s2double( struct soap *soap, ///< `::soap` context const char *string, ///< string to convert double *value) ///< pointer to a variable to assign the converted value to /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Convert a decimal string to an unsigned 8 bit byte (unsigned char) integer value /** This function converts the specified decimal string to an unsigned 8 bit byte (unsigned char) integer value. Returns `#SOAP_OK` or a `::soap_status` error code such as `#SOAP_TYPE` when the string could not be converted. */ int soap_s2unsignedByte( struct soap *soap, ///< `::soap` context const char *string, ///< string to convert unsigned char *value) ///< pointer to a variable to assign the converted value to /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Convert a decimal string to an unsigned 16 bit integer value /** This function converts the specified decimal string to an unsigned 16 bit integer value. Returns `#SOAP_OK` or a `::soap_status` error code such as `#SOAP_TYPE` when the string could not be converted. */ int soap_s2unsignedShort( struct soap *soap, ///< `::soap` context const char *string, ///< string to convert unsigned short *value) ///< pointer to a variable to assign the converted value to /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Convert a decimal string to an unsigned 32 bit integer value /** This function converts the specified decimal string to an unsigned 32 bit integer value. Returns `#SOAP_OK` or a `::soap_status` error code such as `#SOAP_TYPE` when the string could not be converted. */ int soap_s2unsignedInt( struct soap *soap, ///< `::soap` context const char *string, ///< string to convert unsigned int *value) ///< pointer to a variable to assign the converted value to /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Convert a decimal string to an unsigned `long` integer value /** This function converts the specified decimal string to an unsigned `long` integer value. Returns `#SOAP_OK` or a `::soap_status` error code such as `#SOAP_TYPE` when the string could not be converted. */ int soap_s2unsignedLong( struct soap *soap, ///< `::soap` context const char *string, ///< string to convert unsigned long *value) ///< pointer to a variable to assign the converted value to /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Convert a decimal string to an unsigned 64 bit integer value /** This function converts the specified decimal string to an unsigned 64 bit integer value. Returns `#SOAP_OK` or a `::soap_status` error code such as `#SOAP_TYPE` when the string could not be converted. */ int soap_s2ULONG64( struct soap *soap, ///< `::soap` context const char *string, ///< string to convert ULONG64 *value) ///< pointer to a variable to assign the converted value to /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Copy a string (ASCII or UTF-8) to a new string while converting and validating the string contents /** This function copies the specified string to a new string allocated in managed memory. The specified string is validated against the `minlen` and `maxlen` constraints and against the `pattern` XSD regex when non-NULL and when the `::soap::fsvalidate` callback is assigned to perform this check. The minimum and maximum length constraints are 0 and `::soap::maxlength`, respectively, when `minlen` or `maxlen` are specified as negative values. The string length verification takes UTF-8 multi-byte encoding into account when the `#SOAP_C_UTFSTRING` mode flag is enabled. The `flag` parameter controls the conversion as follows: 0 = no conversion, 4 = collapse white space and normalize white space with blanks, 5 = collapse white space. Returns `#SOAP_OK` or a `::soap_status` error code. */ int soap_s2char( struct soap *soap, ///< `::soap` context const char *string, ///< string to convert char **value, ///< pointer to a variable to assign the new string to int flag, ///< controls conversion (0, 4 or 5) long minlen, ///< minimum string length constraint, when non-negative long maxlen, ///< maximum string length constraint, when non-negative const char *pattern) ///< XSD regex pattern constraint, when non-NULL /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Copy a string (ASCII or UTF-8) to a new string while converting and validating the string contents /** This function copies the specified string to a new string allocated in managed memory. The specified string is validated against the `minlen` and `maxlen` constraints and against the `pattern` XSD regex when non-NULL and when the `::soap::fsvalidate` callback is assigned to perform this check. The minimum and maximum length constraints are 0 and `::soap::maxlength`, respectively, when `minlen` or `maxlen` are specified as negative values. The string length verification takes UTF-8 multi-byte encoding into account when the `#SOAP_C_UTFSTRING` mode flag is enabled. The `flag` parameter controls the conversion as follows: 0 = no conversion, 4 = collapse white space and normalize white space with blanks, 5 = collapse white space. Returns `#SOAP_OK` or a `::soap_status` error code. */ int soap_s2stdchar( struct soap *soap, ///< `::soap` context const char *string, ///< string to convert std::string *value, ///< pointer to a variable to assign the new string to int flag, ///< controls conversion (0, 4 or 5) long minlen, ///< minimum string length constraint, when non-negative long maxlen, ///< maximum string length constraint, when non-negative const char *pattern) ///< XSD regex pattern constraint, when non-NULL /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Copy a string (ASCII or UTF-8) to a new wide string while converting and validating the string contents /** This function copies the specified string to a new wide string allocated in managed memory. When the `#SOAP_C_UTFSTRING` mode flag is enabled the specified string should contain UTF-8 contents or ASCII otherwise. The specified string is validated against the `minlen` and `maxlen` constraints and against the `pattern` XSD regex when non-NULL and when the `::soap::fsvalidate` callback is assigned to perform this check. The minimum and maximum length constraints are 0 and `::soap::maxlength`, respectively, when `minlen` or `maxlen` are specified as negative values. The `flag` parameter controls the conversion as follows: 0 = no conversion, 4 = collapse white space and normalize white space with blanks, 5 = collapse white space. Returns `#SOAP_OK` or a `::soap_status` error code. @see `#SOAP_C_UTFSTRING`, `#WITH_REPLACE_ILLEGAL_UTF8`, `#SOAP_UNKNOWN_UNICODE_CHAR`. */ int soap_s2wchar( struct soap *soap, ///< `::soap` context const char *string, ///< string to convert wchar_t **value, ///< pointer to a variable to assign the new string to int flag, ///< controls conversion (0, 4 or 5) long minlen, ///< minimum string length constraint, when non-negative long maxlen, ///< maximum string length constraint, when non-negative const char *pattern) ///< XSD regex pattern constraint, when non-NULL /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Copy a string (ASCII or UTF-8) to a new wide string while converting and validating the string contents /** This function copies the specified string to a new wide string allocated in managed memory. When the `#SOAP_C_UTFSTRING` mode flag is enabled the specified string should contain UTF-8 contents or ASCII otherwise. The specified string is validated against the `minlen` and `maxlen` constraints and against the `pattern` XSD regex when non-NULL and when the `::soap::fsvalidate` callback is assigned to perform this check. The minimum and maximum length constraints are 0 and `::soap::maxlength`, respectively, when `minlen` or `maxlen` are specified as negative values. The `flag` parameter controls the conversion as follows: 0 = no conversion, 4 = collapse white space and normalize white space with blanks, 5 = collapse white space. Returns `#SOAP_OK` or a `::soap_status` error code. @see `#SOAP_C_UTFSTRING`, `#WITH_REPLACE_ILLEGAL_UTF8`, `#SOAP_UNKNOWN_UNICODE_CHAR`. */ int soap_s2stdwchar( struct soap *soap, ///< `::soap` context const char *string, ///< string to convert std::wstring *value, ///< pointer to a variable to assign the new string to int flag, ///< controls conversion (0, 4 or 5) long minlen, ///< minimum string length constraint, when non-negative long maxlen, ///< maximum string length constraint, when non-negative const char *pattern) ///< XSD regex pattern constraint, when non-NULL /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Copy a string (ASCII or UTF-8) to a new QName string while normalizing and validating the string contents /** This function copies the specified string to a new QName string allocated in managed memory. The specified string should be a QName or a space-separated list of QNames. A given QName is of the form `prefix:suffix` or `"URI":suffix`, where the latter is converted to the former form by this function by replacing the quoted URIs by prefixes using the `::namespaces` table. The specified string is validated against the `minlen` and `maxlen` constraints and against the `pattern` XSD regex when non-NULL and when the `::soap::fsvalidate` callback is assigned to perform this check. The minimum and maximum length constraints are 0 and `::soap::maxlength`, respectively, when `minlen` or `maxlen` are specified as negative values. The string length verification takes UTF-8 multi-byte encoding into account when the `#SOAP_C_UTFSTRING` mode flag is enabled. Returns `#SOAP_OK` or a `::soap_status` error code. */ int soap_s2QName( struct soap *soap, ///< `::soap` context const char *string, ///< string to convert char **value, ///< pointer to a variable to assign the new string to long minlen, ///< minimum string length constraint, when non-negative long maxlen, ///< maximum string length constraint, when non-negative const char *pattern) ///< XSD regex pattern constraint, when non-NULL /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Copy a string (ASCII or UTF-8) to a new QName string while normalizing and validating the string contents /** This function copies the specified string to a new QName string allocated in managed memory. The specified string should be a QName or a space-separated list of QNames. A given QName is of the form `prefix:suffix` or `"URI":suffix`, where the latter is converted to the former form by this function by replacing the quoted URIs by prefixes using the `::namespaces` table. The specified string is validated against the `minlen` and `maxlen` constraints and against the `pattern` XSD regex when non-NULL and when the `::soap::fsvalidate` callback is assigned to perform this check. The minimum and maximum length constraints are 0 and `::soap::maxlength`, respectively, when `minlen` or `maxlen` are specified as negative values. The string length verification takes UTF-8 multi-byte encoding into account when the `#SOAP_C_UTFSTRING` mode flag is enabled. Returns `#SOAP_OK` or a `::soap_status` error code. */ int soap_s2stdQName( struct soap *soap, ///< `::soap` context const char *string, ///< string to convert std::string *value, ///< pointer to a variable to assign the new string to long minlen, ///< minimum string length constraint, when non-negative long maxlen, ///< maximum string length constraint, when non-negative const char *pattern) ///< XSD regex pattern constraint, when non-NULL /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Convert a string with `xsd:dateTime` contents to a `time_t` value /** This function converts the specified string with `xsd:dateTime` contents to a `time_t` value. Returns `#SOAP_OK` or a `::soap_status` error code such as `#SOAP_TYPE` when the string could not be converted. @see `#WITH_NOZONE`. */ int soap_s2dateTime( struct soap *soap, ///< `::soap` context const char *string, ///< string to convert time_t *value) ///< pointer to a variable to assign the converted value to /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Encode binary data as a base64-formatted string /** This function encodes the specified binary `data` of length `len` as a base64-formatted string stored in the specified `base64` buffer or allocated in managed memory when `base64` is NULL. Note that `base64` should be large enough to store the encoded string, i.e. (`len` + 2) / 3 * 4 + 1 bytes. Returns the string or NULL when an error occurred and sets `::soap::error` to a `::soap_status` value. */ char * soap_s2base64( struct soap *soap, ///< `::soap` context const unsigned char *data, ///< data to encode char *base64, ///< buffer to store base64 string or NULL int len) ///< length of the data to encode /// @returns the converted string or NULL when an error occurred ; /// Encode binary data as a hex-formatted string /** This function encodes the specified binary `data` of length `len` as a hex-formatted string stored in the specified `hex` buffer or allocated in managed memory when `hex` is NULL. Note that `hex` should be large enough to store the encoded string, i.e. 2 * `len` + 1 bytes. Returns the string or NULL when an error occurred and sets `::soap::error` to a `::soap_status` value. */ char * soap_s2hex( struct soap *soap, ///< `::soap` context const unsigned char *data, ///< data to encode char *hex, ///< buffer to store hex string or NULL int len) ///< length of the data to encode /// @returns the converted string or NULL when an error occurred ; /// Convert a signed 8 bit byte (char) integer to a decimal string /** This function converts the specified signed 8 bit byte (char) integer to a decimal string stored in the temporary buffer `::soap::tmpbuf`. Returns `::soap::tmpbuf`. */ const char * soap_byte2s( struct soap *soap, ///< `::soap` context char value) ///< integer value to convert to decimal string /// @returns the decimal number stored in the `::soap::tmpbuf` string buffer ; /// Convert a signed 16 bit integer to a decimal string /** This function converts the specified signed 16 bit integer to a decimal string stored in the temporary buffer `::soap::tmpbuf`. Returns `::soap::tmpbuf`. */ const char * soap_short2s( struct soap *soap, ///< `::soap` context short value) ///< integer value to convert to decimal string /// @returns the decimal number stored in the `::soap::tmpbuf` string buffer ; /// Convert a signed 32 bit integer to a decimal string /** This function converts the specified signed 32 bit integer to a decimal string stored in the temporary buffer `::soap::tmpbuf`. Returns `::soap::tmpbuf`. */ const char * soap_int2s( struct soap *soap, ///< `::soap` context int value) ///< integer value to convert to decimal string /// @returns the decimal number stored in the `::soap::tmpbuf` string buffer ; /// Convert a signed `long` integer to a decimal string /** This function converts the specified signed `long` integer to a decimal string stored in the temporary buffer `::soap::tmpbuf`. Returns `::soap::tmpbuf`. */ const char * soap_long2s( struct soap *soap, ///< `::soap` context long value) ///< integer value to convert to decimal string /// @returns the decimal number stored in the `::soap::tmpbuf` string buffer ; /// Convert a signed 64 bit integer to a decimal string /** This function converts the specified signed 64 bit integer to a decimal string stored in the temporary buffer `::soap::tmpbuf`. Returns `::soap::tmpbuf`. */ const char * soap_LONG642s( struct soap *soap, ///< `::soap` context LONG64 value) ///< integer value to convert to decimal string /// @returns the decimal number stored in the `::soap::tmpbuf` string buffer ; /// Convert a float value to a decimal string /** This function converts the specified single precision floating point value to a decimal string stored in the temporary buffer `::soap::tmpbuf`. Returns `::soap::tmpbuf`. */ const char * soap_float2s( struct soap *soap, ///< `::soap` context float value) ///< float value to convert to decimal string /// @returns the decimal number stored in the `::soap::tmpbuf` string buffer ; /// Convert a double float value to a decimal string /** This function converts the specified double precision floating point value to a decimal string stored in the temporary buffer `::soap::tmpbuf`. Returns `::soap::tmpbuf`. */ const char * soap_double2s( struct soap *soap, ///< `::soap` context double value) ///< double float value to convert to decimal string /// @returns the decimal number stored in the `::soap::tmpbuf` string buffer ; /// Convert an unsigned 8 bit byte (char) integer to a decimal string /** This function converts the specified unsigned 8 bit byte (char) integer to a decimal string stored in the temporary buffer `::soap::tmpbuf`. Returns `::soap::tmpbuf`. */ const char * soap_unsignedByte2s( struct soap *soap, ///< `::soap` context unsigned char value) ///< integer value to convert to decimal string /// @returns the decimal number stored in the `::soap::tmpbuf` string buffer ; /// Convert an unsigned 16 bit integer to a decimal string /** This function converts the specified unsigned 16 bit integer to a decimal string stored in the temporary buffer `::soap::tmpbuf`. Returns `::soap::tmpbuf`. */ const char * soap_unsignedShort2s( struct soap *soap, ///< `::soap` context unsigned short value) ///< integer value to convert to decimal string /// @returns the decimal number stored in the `::soap::tmpbuf` string buffer ; /// Convert an unsigned 32 bit integer to a decimal string /** This function converts the specified unsigned 32 bit integer to a decimal string stored in the temporary buffer `::soap::tmpbuf`. Returns `::soap::tmpbuf`. */ const char * soap_unsignedInt2s( struct soap *soap, ///< `::soap` context unsigned int value) ///< integer value to convert to decimal string /// @returns the decimal number stored in the `::soap::tmpbuf` string buffer ; /// Convert an unsigned `long` integer to a decimal string /** This function converts the specified unsigned `long` integer to a decimal string stored in the temporary buffer `::soap::tmpbuf`. Returns `::soap::tmpbuf`. */ const char * soap_unsignedLong2s( struct soap *soap, ///< `::soap` context unsigned long value) ///< integer value to convert to decimal string /// @returns the decimal number stored in the `::soap::tmpbuf` string buffer ; /// Convert an unsigned 64 bit integer to a decimal string /** This function converts the specified unsigned 64 bit integer to a decimal string stored in the temporary buffer `::soap::tmpbuf`. Returns `::soap::tmpbuf`. */ const char * soap_ULONG642s( struct soap *soap, ///< `::soap` context ULONG64 value) ///< integer value to convert to decimal string /// @returns the decimal number stored in the `::soap::tmpbuf` string buffer ; /// Convert a wide string to a UTF-8 encoded string /** This function converts the specified wide string to a UTF-8 encoded string allocated in managed memory. Returns the resulting string or NULL when an error occurred and sets `::soap::error` to a `::soap_status` value. @see `#WITH_REPLACE_ILLEGAL_UTF8`, `#SOAP_UNKNOWN_UNICODE_CHAR`. */ const char * soap_wchar2s( struct soap *soap, ///< `::soap` context const wchar_t *value) ///< wide string to convert /// @returns UTF-8 encoded string allocated in managed memory or NULL when an error occurred ; /// Convert a `time_t` value to a string with `xsd:dateTime` contents /** This function converts the specified `time_t` value to a string with `xsd:dateTime` contents stored in the temporary buffer `::soap::tmpbuf`. Returns `::soap::tmpbuf`. @see `#WITH_NOZONE`. */ const char * soap_dateTime2s( struct soap *soap, ///< `::soap` context time_t value) ///< value to convert /// @returns the `xsd:dateTime` string stored in the `::soap::tmpbuf` string buffer ; /// Decode a base64-formatted string to binary data /** This function decodes the specified `base64` string to binary data. The `data` parameter is a buffer of length `maxdatalen` to store the decoded data or NULL to dynamically allocate the decoded data in managed memory which is returned. The length of the decoded data is stored in the length variable pointed to by `datalen` when non-NULL. Returns the decoded binary string that is 0-terminated if `maxdatalen` is sufficiently large, or returns NULL if an error occurred. */ const char * soap_base642s( struct soap *soap, ///< `::soap` context const char *base64, ///< base64 string char *data, ///< buffer to store the decoded data or NULL to allocate one size_t maxdatalen, ///< size of the buffer int *datalen) ///< pointer to the length variable to assign or NULL /// @returns decoded string or NULL when an error occurred ; /// Decode a hex-formatted string to binary data /** This function decodes the specified `hex` string to binary data. The `data` parameter is a buffer of length `maxdatalen` to store the decoded data or NULL to dynamically allocate the decoded data in managed memory which is returned. The length of the decoded data is stored in the length variable pointed to by `datalen` when non-NULL. Returns the decoded binary string that is 0-terminated if `maxdatalen` is sufficiently large, or returns NULL if an error occurred. */ const char * soap_hex2s( struct soap *soap, ///< `::soap` context const char *hex, ///< hex string char *data, ///< buffer to store the decoded data or NULL to allocate one size_t maxdatalen, ///< size of the buffer int *datalen) ///< pointer to the length variable to assign or NULL /// @returns decoded string or NULL when an error occurred ; /** @} */ /** \defgroup group_namespace XML namespace tables @brief This module defines the `::Namespace` XML namespace structure and function to activate a table @{ */ /// Structure of each row in a namespace table /** XML namespaces tables define XML namespace prefix-URI pairs for XML generation, parsing and validation. Each row in the table is defined by this structure. The last row in the table must be followed by a row with a NULL value to indicate the end of the table. The first four rows are reserved for the namespaces of `SOAP-ENV`, `SOAP-ENC`, `xsi` and `xsd`. One or more of these entries can be omitted by using `""` in the first column for the prefix, but beware that XML generation and parsing may fail when an omitted namespace prefix or URI is still used in the XML text. This structure defines the rows the namespace table `::namespaces` and the namespace table parameter of `::soap_set_namespaces`. @par Example: ~~~{.cpp} #include "soapH.h" 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}, {"ns", "http://tempuri.org/ns.xsd", NULL, NULL}, {NULL, NULL, NULL, NULL} }; ~~~ This example defines SOAP 1.1 namespaces (`SOAP-ENV` and `SOAP-ENC`) to be used by default, but also accepts SOAP 1.2 because of the second URI in the third column. XML schema instance namespace `xsi` is used with `xsi:type` and `xsi:nil` and the XML schema namespace `xsd` is used with XSD types such as `xsd:string`, which may be used in XML messages. URI patterns in the third column may contain wildcard strings `*` and wildcard characters `-`. */ struct Namespace { /// XML namespace prefix identifier string, use NULL to indicate the end of the namespaces table const char *id; /// XML namespace URI string const char *ns; /// an optional XML namespace URI string pattern (`*` is a wildcard string and `-` is a wildcard character) that is permitted to match a parsed URI in place of the first URI, or NULL when not applicable const char *in; /// Reserved for internal use by the engine only, to switch between URIs such as SOAP 1.1 and 1.2 namespaces based on the URI string pattern when provided in the table char *out; }; /// The global XML namespaces table with entries defined by the `::Namespace` structure and populated in an .nsmap file generated by soapcpp2 /** This XML namespaces table defines XML namespace prefix-URI pairs for XML generation, parsing and validation. The last row in the table must be followed by a row with a NULL value to indicate the end of the table. The requirement to link this global table can be removed at compile time with `#WITH_NONAMESPACES`. */ struct Namespace namespaces[]; /// Activates an XML namespace table to generate and resolve xmlns namespace prefixes in XML messages /** This function sets the XML namespace table to be used by the engine to generate and resolve xmlns namespace prefixes in XML messages. Different tables can be set at any time, depending on the XML messaging requirements. However, XML generation and parsing may fail if prefix-URI bindings are missing in the table. Tables are generated by soapcpp2 in .nsmap files, which defines a global table `::namespaces` that is used by default by the engines, but can be replaced by the XML namespace table specified with this function. Returns `#SOAP_OK` or a `::soap_status` error code. */ int soap_set_namespaces( struct soap *soap, ///< `::soap` context const struct Namespace *namespaces) ///< the XML namespace table to activate /// @returns `#SOAP_OK` or a `::soap_status` error code ; /** @} */ /** \defgroup group_header Header structure and functions @brief This module defines the `::SOAP_ENV__Header` structure and `::soap_header` function to allocate the header @{ */ /// SOAP Header structure /** This structure is generated by the wsdl2h tool from a WSDL with SOAP Header definitions and/or by soapcpp2 to complete the SOAP Header definitions. The SOAP Header definitions can also be specified manually in the interface header file for soapcpp2. If no SOAP Header structure is declared in the interface header file input to soapcpp2 then the soapcpp2 tool will generate an empty structure. A SOAP Header contains meta-data, such as WS-Addressing and WS-Security headers, associated with messages. SOAP Header elements may be marked with `mustUnderstand` which produces and recognizes `SOAP_ENV:mustUnderstand="true"` in XML to force the receiver to produce an error if the header element was not recognized. The `//gsoap service method-input-header-part:` and `//gsoap service method-output-header-part:` directives indicates which member (i.e. XML element) of `::SOAP_ENV__Header` is relevant to the input and output SOAP Headers associated with a service operation. Because this structure is declared `mutable` (which is a C/C++ extension that only soapcpp2 understands), multiple `::SOAP_ENV__Header` structures in the interface header file input are combined into one structure generated by soapcpp2 for C/C++ compilation. @par Example: ~~~{.cpp} // example .h file for soapcpp2 //gsoap ns service name: example //gsoap ns service namespace: urn:example struct SOAP_ENV__Header { mustUnderstand int *ns__someHeaderValue; // optional element with SOAP_ENV:mustUnderstand="true" attribute }; //gsoap ns service method-input-header-part: webmethod ns__someHeaderValue //gsoap ns service method-output-header-part: webmethod ns__someHeaderValue int ns__webmethod(...); ~~~ ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); ... // context initializations // add a SOAP Header to the message soap->header = NULL; // make sure we allocate a new header soap_header(soap); // allocate SOAP_ENV__Header and set soap->header to point to it int num = 123; soap->header->ns__someHeaderValue = # if (soap_call_ns__webmethod(soap, endpoint, NULL, ...)) { soap_print_fault(soap, stderr); } else { if (soap->header) // received a SOAP_ENV__Header? ... // yes, inspect SOAP_ENV__Header ns__someHeaderValue } soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~ @see `::soap::header`, `::soap::actor`, `::soap_header`. */ struct SOAP_ENV__Header { }; /// If `::soap::header` is NULL then allocate `::SOAP_ENV__Header` header and set `::soap::header` to point to it /** If `::soap::header` is NULL then this function allocates a `::SOAP_ENV__Header` structure in memory managed by the context, default initializes its members, and sets `::soap::header` to point to the allocated structure. @see `::SOAP_ENV__Header`. */ void soap_header(struct soap *soap) ///< `::soap` context ; /** @} */ /** \defgroup group_fault Fault structure and functions @brief This module defines the `::SOAP_ENV__Fault` structure and functions to set and get fault information @{ */ /// SOAP Fault structure /** This structure is generated by the wsdl2h tool from a WSDL with SOAP Fault definitions and/or by soapcpp2 to complete the SOAP Fault definitions. The SOAP Fault definitions can also be specified manually in the interface header file for soapcpp2. If no SOAP Fault structure is declared in the interface header file input to soapcpp2 then the soapcpp2 tool will generate an empty structure. A SOAP Fault contains error information specified by the `::SOAP_ENV__Fault::faultstring` (SOAP 1,1) or `::SOAP_ENV__Fault::SOAP_ENV__Reason` (SOAP 1.2). The SOAP Fault detail `::SOAP_ENV__Fault::SOAP_ENV__Detail` may include specific elements related to the fault. The `::SOAP_ENV__Detail` sub-structure of a SOAP Fault is customizable with members that are part of a SOAP Fault that is specific to a service operation. This structure is generated and populated by wsdl2h with service-specific SOAP Fault details. The `//gsoap service method-fault:` directive indicates which member (i.e. XML element) of `::SOAP_ENV__Detail` is relevant to the SOAP Faults associated with a service operation. Because the `::SOAP_ENV__Detail` substructure is declared `mutable` (which is a C/C++ extension that only soapcpp2 understands), multiple `struct SOAP_ENV__Detail` structures in the interface header file input are combined into one structure generated by soapcpp2 for C/C++ compilation. @par Examples: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); ... // call a Web service here if (soap->error) { const char *s = soap_fault_string(soap); const char *d = soap_fault_detail(soap); printf("Server fault: %s detail: %s\n", s, d ? d : "(none)"); } ~~~ ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new(); ... // context initializations if (soap_call_ns__webmethod(soap, endpoint, NULL, ...)) { if (soap->fault->detail && soap->fault->detail->__type == SOAP_TYPE_ns__someElement) { struct ns__someElement *element = (struct ns__someElement*)soap->fault->detail->fault; ... // inspect the SOAP Fault detail element } } else { ... // success } soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~ ~~~{.cpp} // example .h file for soapcpp2 //gsoap ns service name: example //gsoap ns service namespace: urn:example struct ns__someElement { char *text; }; struct SOAP_ENV__Detail { char *__any; int __type; void *fault; struct ns__someElement *ns__someElement; // a service-operation specific fault detail }; //gsoap ns service method-fault: webmethod ns__someElement int ns__webmethod(...); ~~~ ~~~{.cpp} // example service implementation based on the above example .h file for soapcpp2 #include "soapH.h" int main() { struct soap *soap = soap_new(); ... // serve requests with soap_bind, soap_accept, soap_ssl_accept, and soap_serve } int ns__webmethod(struct soap *soap, ...) { int err = soap_sender_fault(soap, "Invalid request", NULL, NULL); // this is a sender fault to return to the client soap_faultdetail(soap); // allocate SOAP Fault detail soap->fault->detail->ns__someElement = (struct ns__someElement*)soap_malloc(soap, sizeof(struct ns__someElement)); soap_default_ns__someElement(soap, soap->fault->detail->ns__someElement); soap->fault->detail->ns__someElement->text = "..."; #if 0 // an alternative way to include the ns__someElement in the SOAP Fault detail can be done as follows: soap->fault->detail->__type = SOAP_TYPE_ns__someElement; soap->fault->detail->fault = (void*)soap_malloc(soap, sizeof(struct ns__someElement)); soap_default_ns__someElement(soap, (struct ns__someElement*)soap->fault->detail->fault); ((struct ns__someElement*)soap->fault->detail->fault)->text = "..."; #endif return err; } ~~~ @see `#SOAP_CLI_FAULT`, `#SOAP_SVR_FAULT`, `::soap::fault`, `::soap_sender_fault`, `::soap_sender_fault_subcode`, `::soap_receiver_fault`, `::soap_receiver_fault_subcode`, `::soap_print_fault`, `::soap_stream_fault`, `::soap_sprint_fault`, `::soap_print_fault_location`, `::soap_stream_fault_location`, `::soap_fault_string`, `::soap_fault_subcode`, `::soap_fault_detail`, `::soap::lang`. */ struct SOAP_ENV__Fault { /// Optional element `faultcode` of XSD type `xsd:QName` _QName faultcode; /// Optional element `faultstring` of XSD type `xsd:string` char *faultstring; /// Optional element `faultactor` of XSD type `xsd:string` char *faultactor; /// Optional element `detail` of XSD type `SOAP-ENV:Detail` struct SOAP_ENV__Detail *detail; /// Optional element `SOAP-ENV:Code` of XSD type `SOAP-ENV:Code` struct SOAP_ENV__Code *SOAP_ENV__Code; /// Optional element `SOAP-ENV:Reason` of XSD type `SOAP-ENV:Reason` struct SOAP_ENV__Reason *SOAP_ENV__Reason; /// Optional element `SOAP-ENV:Node` of XSD type `xsd:string` char *SOAP_ENV__Node; /// Optional element `SOAP-ENV:Role` of XSD type `xsd:string` char *SOAP_ENV__Role; /// Optional element `SOAP-ENV:Detail` of XSD type `SOAP-ENV:Detail` struct SOAP_ENV__Detail *SOAP_ENV__Detail; }; /// SOAP Fault Code structure /** @see `::SOAP_ENV__Fault`. */ struct SOAP_ENV__Code { /// Optional element `SOAP-ENV:Value` of XSD type `xsd:QName` _QName SOAP_ENV__Value; /// Optional element `SOAP-ENV:Subcode` of XSD type `SOAP-ENV:Code` struct SOAP_ENV__Code *SOAP_ENV__Subcode; }; /// SOAP Fault Detail structure /** @see `::SOAP_ENV__Fault`. */ struct SOAP_ENV__Detail { /// Any data of some type `T` serialized as `fault` element when its `SOAP_TYPE_T` is assigned to `__type` int __type; /// Any data of some type `T` serialized as `fault` element when its `SOAP_TYPE_T` is assigned to `__type` void *fault; /// Any XML content _XML __any; }; /// SOAP Fault Reason structure generated by soapcpp2 /** @see `::SOAP_ENV__Fault`, `::soap::lang`. */ struct SOAP_ENV__Reason { /// Optional element `SOAP-ENV:Text` of XSD type `xsd:string` char *SOAP_ENV__Text; }; /// A built-in string type containing literal XML content in UTF-8 format typedef char *_XML; /// A built-in string type containing normalized QName contents typedef char *_QName; /// If `::soap::fault` is NULL then allocate `::SOAP_ENV__Fault` header and set `::soap::fault` to point to it /** If `::soap::fault` is NULL then this function allocates a `::SOAP_ENV__Fault` structure in memory managed by the context, default initializes its members, and sets `::soap::fault` to point to the allocated structure. If `::soap::version` == 2 (SOAP 1.2) then also allocates and default initializes `::SOAP_ENV__Fault::SOAP_ENV__Code` and `::SOAP_ENV__Fault::SOAP_ENV__Reason`. This function is used by `::soap_sender_fault`, `::soap_sender_fault_subcode`, `::soap_receiver_fault` and `::soap_receiver_fault_subcode` to allocate and set a SOAP Fault. @see `::SOAP_ENV__Fault`, `::soap_sender_fault`, `::soap_sender_fault_subcode`, `::soap_receiver_fault`, `::soap_receiver_fault_subcode`. */ void soap_fault(struct soap *soap) ///< `::soap` context ; /// Set SOAP 1.1 client fault / SOAP 1.2 sender fault string and detail /** This function assigns a SOAP 1.1 server fault / SOAP 1.2 receiver fault to the `::soap::fault` structure and sets `::soap::error` to `#SOAP_FAULT`, indicating an invalid request by the sender, which the receiver cannot recover from. The `faultstring` parameter is a human-readable message with the reason of the error. The `faultdetail` parameter is an XML-formatted string with details or NULL when omitted. Returns `#SOAP_FAULT`. */ int soap_sender_fault( struct soap *soap, ///< `::soap` context const char *faultstring, ///< SOAP Fault string with reason const char *faultdetail) ///< SOAP Fault detail with XML or NULL /// @returns `#SOAP_FAULT` ; /// Set SOAP 1.1 client fault / SOAP 1.2 sender fault subcode, string and detail /** This function assigns a SOAP 1.1 server fault / SOAP 1.2 receiver fault to the `::soap::fault` structure and sets `::soap::error` to `#SOAP_FAULT`, indicating an invalid request by the sender, which the receiver cannot recover from. The `faultcode` parameter is a QName specific to the protocol associated with the fault. The `faultstring` parameter is a human-readable message with the reason of the error. The `faultdetail` parameter is an XML-formatted string with details or NULL when omitted. Returns `#SOAP_FAULT`. */ int soap_sender_fault_subcode( struct soap *soap, ///< `::soap` context const char *faultsubcode, ///< SOAP Fault subcode with QName const char *faultstring, ///< SOAP Fault string with reason const char *faultdetail) ///< SOAP Fault detail with XML or NULL /// @returns `#SOAP_FAULT` ; /// Set SOAP 1.1 server fault / SOAP 1.2 receiver fault string and detail /** This function assigns a SOAP 1.1 server fault / SOAP 1.2 receiver fault to the `::soap::fault` structure and sets `::soap::error` to `#SOAP_FAULT`, indicating that the receiver encountered an error in processing the request and may recover from the error later. The `faultstring` parameter is a human-readable message with the reason of the error. The `faultdetail` parameter is an XML-formatted string with details or NULL when omitted. Returns `#SOAP_FAULT`. */ int soap_receiver_fault( struct soap *soap, ///< `::soap` context const char *faultstring, ///< SOAP Fault string with reason const char *faultdetail) ///< SOAP Fault detail with XML or NULL /// @returns `#SOAP_FAULT` ; /// Set SOAP 1.1 server fault / SOAP 1.2 receiver fault subcode, string and detail /** This function assigns a SOAP 1.1 server fault / SOAP 1.2 receiver fault to the `::soap::fault` structure and sets `::soap::error` to `#SOAP_FAULT`, indicating that the receiver encountered an error in processing the request and may recover from the error later. The `faultcode` parameter is a QName specific to the protocol associated with the fault. The `faultstring` parameter is a human-readable message with the reason of the error. The `faultdetail` parameter is an XML-formatted string with details or NULL when omitted. Returns `#SOAP_FAULT`. */ int soap_receiver_fault_subcode( struct soap *soap, ///< `::soap` context const char *faultsubcode, ///< SOAP Fault subcode with QName const char *faultstring, ///< SOAP Fault string with reason const char *faultdetail) ///< SOAP Fault detail with XML or NULL /// @returns `#SOAP_FAULT` ; /// Print error message on the specified output /** This function prints the error message of the nonzero `::soap::error` value. The `fd` parameter specifies the output file descriptor, such as stderr. This function has no effect when `::soap:error` is `#SOAP_OK` (zero). */ void soap_print_fault( struct soap *soap, ///< `::soap` context FILE *fd) ///< output file descriptor to print to ; /// Print error message on the specified output stream /** This function prints the error message of the nonzero `::soap::error` value. The `os` parameter specifies the output stream such as std::cerr. This function has no effect when `::soap:error` is `#SOAP_OK` (zero). */ void soap_stream_fault( struct soap *soap, ///< `::soap` context std::ostream& os) ///< output stream to print to ; /// Print error message to the specified string buffer /** This function prints the error message of the nonzero `::soap::error` value to the string buffer specified by the `buf` and `len` parameters. This function has no effect when `::soap:error` is `#SOAP_OK` (zero). */ char * soap_sprint_fault( struct soap *soap, ///< `::soap` context char *buf, ///< string buffer to store the message, 0-terminated size_t len) ///< buffer length /// @returns the `buf` parameter ; /// Print the location in the message where and when the error occurred /** This function prints the location in the inbound message being parsed where the error occurred. Only part of the message will be printed, depending on the `#SOAP_BUFLEN` size and the size of the actual data packet received into the `::soap::buf` buffer. This function is usually used after calling `::soap_print_fault` which makes sense when a message processing error occurred such as when `::soap_xml_error_check(soap->error)` is true. This function has no effect when `::soap:error` is `#SOAP_OK` (zero). */ void soap_print_fault_location( struct soap *soap, ///< `::soap` context FILE *fd) ///< output file descriptor to print to ; /// Print the location in the message where and when the error occurred /** This function prints the location in the inbound message being parsed where the error occurred. Only part of the message will be printed, depending on the `#SOAP_BUFLEN` size and the size of the actual data packet received into the `::soap::buf` buffer. This function is usually used after calling `::soap_stream_fault` which makes sense when a message processing error occurred such as when `::soap_xml_error_check(soap->error)` is true. This function has no effect when `::soap:error` is `#SOAP_OK` (zero). */ void soap_stream_fault_location( struct soap *soap, ///< `::soap` context std::ostream& os) ///< output stream to print to ; /// Returns the SOAP Fault subcode QName string or NULL when absent const char * soap_fault_subcode(struct soap *soap) /// @returns string or NULL ; /// Returns the SOAP Fault string/reason or NULL when absent const char * soap_fault_string(struct soap *soap) ///< `::soap` context /// @returns string or NULL ; /// Returns the SOAP Fault detail XML string or NULL when absent const char * soap_fault_detail(struct soap *soap) ///< `::soap` context /// @returns string or NULL ; /// Allocates and returns a pointer to the SOAP Fault subcode QName string to set this string const char ** soap_faultsubcode(struct soap *soap) ///< `::soap` context /// @returns pointer to string ; /// Allocates and returns a pointer to the SOAP Fault string/reason to set this string const char ** soap_faultstring(struct soap *soap) ///< `::soap` context /// @returns pointer to string ; /// Allocates and returns a pointer to the SOAP Fault detail XML string to set this string or NULL when not accessible const char ** soap_faultdetail(struct soap *soap) ///< `::soap` context /// @returns pointer to string or NULL ; /** @} */ /** \defgroup group_dime DIME attachment functions @brief This module defines functions to set and get DIME attachments For more information on the DIME protocol, see for example https://msdn.microsoft.com/en-us/library/aa480488.aspx There are two ways to add DIME attachments to SOAP/XML messages for sending: - use `::soap_set_dime_attachment` to explicitly add an attachment that contains the specified source of data; - use `::xsd__base64Binary` or `::_xop__Include` structures in the serializable data of a SOAP/XML message, where the specified data is serialized in DIME attachments automatically when one of the `id`, `type` or `options` member variables are non-NULL. Both methods also support streaming DIME attachments to send using the `::soap::fdimereadopen`, `::soap::fdimeread`, and `::soap::fdimereadclose` callbacks that fetch the data to send, where a user-defined handle should be specified for the `ptr` parameter of `::soap_set_dime_attachment` or the `::xsd__base64Binary::__ptr` member variable instead of a pointer to the actual data. This handle can be used by the callbacks to fetch the specific data to transmit. Receiving DIME attachments attached to SOAP/XML messages is automatic. The DIME attachments are converted to binary data and stored in the `::xsd__base64Binary` structures that reference the DIME attachments via the `::xsd__base64Binary::id` string, meaning that the `::xsd__base64Binary::__ptr` (points to the data) and `::xsd__base64Binary::__size` (data length) are populated automatically with the DIME binary data. However, if the streaming DIME callbacks `::soap::fdimewriteopen`, `::soap::fdimewrite`, and `::soap::fdimewriteclose` are defined then the attachments are streamed to these callbacks instead. For example, to send and receive a SOAP/XML message with DIME attachments using a serializable `::xsd__base64Binary` structure: ~~~{.cpp} // example .h file for soapcpp2 //gsoap ns service name: example //gsoap ns service namespace: urn:example struct xsd__base64Binary { unsigned char *__ptr; // pointer to binary data int __size; // size of the binary data char *id; // NULL to generate an id or assign this member variable a unique UUID char *type; // MIME type of the data char *options; // DIME options }; int ns__webmethod(struct xsd__base64Binary *data, struct xsd__base64Binary *result); ~~~ ~~~{.cpp} // example client implementation based on the above example .h file for soapcpp2 #include "soapH.h" int main() { struct soap *soap = soap_new(); struct xsd__base64Binary data, result; data.__ptr = ...; // points to binary image data to send data.__size = ...; // size of the image data to send data.id = NULL; // this will be assigned by the engine data.type = "image/jpg"; data.options = soap_dime_option(soap, 0, "Picture.png"); // DIME option 0 = "Picture.png" to store file name if (soap_call_ns__webmethod(soap, endpoint, NULL, &data, &result)) soap_print_fault(soap, stderr); else ... // success, use the result soap_destroy(soap); soap_end(soap); soap_free(soap); } ~~~ ~~~{.cpp} // example service implementation based on the above example .h file for soapcpp2 #include "soapH.h" int main() { struct soap *soap = soap_new(); ... // serve requests with soap_bind, soap_accept, soap_ssl_accept, and soap_serve } int ns__webmethod(struct soap *soap, struct xsd__base64Binary *data, struct xsd__base64Binary *result) { // echo back the structure (as a DIME attachment) result->__ptr = data->__ptr; result->__size = data->__size; retult->id = data->id; retult->type = data->type; retult->options = data->options; return SOAP_OK; } ~~~ Besides receiving the attachments in `::xsd__base64Binary` structures, on the receiving side you can also iterate over the DIME attachments received as follows: ~~~{.cpp} #include "soapH.h" int main() { struct soap *soap = soap_new(); ... // call soap_call_ns__webmethod etc. { int n = 0; struct soap_multipart *attachment; for (attachment = soap->dime.list; attachment; attachment = attachment->next) { ++n; printf("Part %d:\n", n); printf("ptr =%p\n", attachment->ptr); printf("size =%ul\n", attachment->size); printf("id =%s\n", attachment->id ? attachment->id : ""); printf("type =%s\n", attachment->type ? attachment->type : ""); // DIME options are formatted according to the DIME protocol if (attachment->options) { // extract length of first option size_t len = ((unsigned char)attachment->options[2] << 8) | ((unsigned char)attachment->options[3]); // allocate and copy the first option, which is assumed to be a name char *name = (char*)soap_malloc(soap, len + 1); strncpy(name, attachment->options + 4, len); name[len] = '\0'; printf("option=%s\n", name); } } } } ~~~ In C++ you can use an iterator for the last part of this example: ~~~{.cpp} struct soap *soap = soap_new(); ... // call soap_call_ns__webmethod etc. int n = 0; for (soap_multipart::iterator i = soap->dime.begin(); i != soap->dime.end(); ++i) { ++n; printf("Part %d:\n", n); printf("ptr =%p\n", i->ptr); ... // etc } ~~~ At the server side the code to retrieve the DIME attachments is the same. @{ */ /// XSD base64Binary structure with attachment data /** @ingroup mime This structure may be declared in the interface header file for soapcpp2 and defines a XSD base64Binary type with optional DIME/MIME/MTOM attachment data. This structure is auto-generated by wsdl2h for the XSD base64Binary type to serialize binary data in base64 or as a DIME/MIME/MTOM attachment. An attachment is serialized when either `id`, `type` or `options` member variables are non-NULL. @par Example: ~~~{.cpp} // example .h file for soapcpp2 //gsoap ns service name: example //gsoap ns service namespace: urn:example struct xsd__base64Binary { unsigned char *__ptr; // pointer to binary data int __size; // size of the binary data char *id; // NULL to generate an id or assign this member variable a unique UUID char *type; // MIME type of the data char *options; // DIME options or an optional description of the MIME attachment }; int ns__webmethod(struct xsd__base64Binary *data, struct xsd__base64Binary *result); ~~~ ~~~{.cpp} // example client implementation based on the above example .h file for soapcpp2 #include "soapH.h" int main() { struct soap *soap = soap_new(); struct xsd__base64Binary data, result; data.__ptr = ...; // points to binary image data to send data.__size = ...; // size of the image data to send data.id = soap_strdup(soap, soap_rand_uuid(soap, NULL)); data.type = "image/jpg"; data.options = "A picture"; if (soap_call_ns__webmethod(soap, endpoint, NULL, &data, &result)) soap_print_fault(soap, stderr); else ... // success, use the result soap_destroy(soap); soap_end(soap); soap_free(soap); } ~~~ ~~~{.cpp} // example service implementation based on the above example .h file for soapcpp2 #include "soapH.h" int main() { struct soap *soap = soap_new(); ... // serve requests with soap_bind, soap_accept, soap_ssl_accept, and soap_serve } int ns__webmethod(struct soap *soap, struct xsd__base64Binary *data, struct xsd__base64Binary *result) { // echo back the structure (as a MIME attachment) result->__ptr = data->__ptr; result->__size = data->__size; retult->id = data->id; retult->type = data->type; retult->options = data->options; return SOAP_OK; } ~~~ @see `::xsd__hexBinary`, `::_xop__Include`. */ struct xsd__base64Binary { unsigned char *__ptr; ///< pointer to binary data int __size; ///< size of the binary data char *id; ///< extra member: NULL to generate an id or assign this member variable a unique UUID char *type; ///< extra member: MIME type of the data char *options; ///< extra member: DIME options or a description of the MIME attachment or NULL }; /// XOP include structure with attachment data /** @ingroup mime This structure may be declared in the interface header file for soapcpp2 and defines a XOP type with optional MTOM attachment data to support the XML-binary optimized packaging https://www.w3.org/TR/xop10 format. This structure is pre-defined in `gsoap/import/xop.h` and is used to serialize binary data in base64 or as a DIME/MIME/MTOM attachment. An attachment is serialized when either `id`, `type` or `options` member variables are non-NULL. @par Example: ~~~{.cpp} // example .h file for soapcpp2 //gsoap ns service name: example //gsoap ns service namespace: urn:example #import "import/xop.h" int ns__webmethod(struct _xop__Include *data, struct _xop__Include *result); ~~~ ~~~{.cpp} // example service implementation based on the above example .h file for soapcpp2 #include "soapH.h" int main() { struct soap *soap = soap_new(); ... // serve requests with soap_bind, soap_accept, soap_ssl_accept, and soap_serve } int ns__webmethod(struct soap *soap, struct _xop__Include *data, struct _xop__Include *result) { // strip id, type and options to return base64 data in XML result->__ptr = data->__ptr; result->__size = data->__size; retult->id = NULL; retult->type = NULL; retult->options = NULL; return SOAP_OK; } ~~~ @see `::xsd__base64Binary`, `::xsd__hexBinary`. */ struct _xop__Include { unsigned char *__ptr; ///< pointer to binary data int __size; ///< size of the binary data char *id; ///< NULL to generate an id or assign this member variable a unique UUID char *type; ///< MIME type of the data char *options; ///< description of the MIME/MTOM attachment or NULL }; /// XSD hexBinary structure with attachment data /** @ingroup mime This structure may be declared in the interface header file for soapcpp2 and defines a XSD hexBinary type with optional DIME/MIME/MTOM attachment data. This structure is auto-generated by wsdl2h for the XSD hexBinary type to serialize binary data in hex or as a DIME/MIME/MTOM attachment. An attachment is serialized when either `id`, `type` or `options` member variables are non-NULL. @par Example: ~~~{.cpp} // example .h file for soapcpp2 //gsoap ns service name: example //gsoap ns service namespace: urn:example struct xsd__hexBinary { unsigned char *__ptr; // pointer to binary data int __size; // size of the binary data char *id; // NULL to generate an id or assign this member variable a unique UUID char *type; // MIME type of the data char *options; // DIME options or an optional description of the MIME attachment }; int ns__webmethod(struct xsd__hexBinary *data, struct xsd__hexBinary *result); ~~~ ~~~{.cpp} // example client implementation based on the above example .h file for soapcpp2 #include "soapH.h" int main() { struct soap *soap = soap_new(); struct xsd__hexBinary data, result; data.__ptr = ...; // points to binary image data to send data.__size = ...; // size of the image data to send data.id = soap_strdup(soap, soap_rand_uuid(soap, NULL)); data.type = "image/jpg"; data.options = "A picture"; if (soap_call_ns__webmethod(soap, endpoint, NULL, &data, &result)) soap_print_fault(soap, stderr); else ... // success, use the result soap_destroy(soap); soap_end(soap); soap_free(soap); } ~~~ ~~~{.cpp} // example service implementation based on the above example .h file for soapcpp2 #include "soapH.h" int main() { struct soap *soap = soap_new(); ... // serve requests with soap_bind, soap_accept, soap_ssl_accept, and soap_serve } int ns__webmethod(struct soap *soap, struct xsd__hexBinary *data, struct xsd__hexBinary *result) { // echo back the structure (as a MIME attachment) result->__ptr = data->__ptr; result->__size = data->__size; retult->id = data->id; retult->type = data->type; retult->options = data->options; return SOAP_OK; } ~~~ @see `::xsd__base64Binary`, `::_xop__Include`. */ struct xsd__hexBinary { unsigned char *__ptr; ///< pointer to binary data int __size; ///< size of the binary data char *id; ///< extra member: NULL to generate an id or assign this member variable a unique UUID char *type; ///< extra member: MIME type of the data char *options; ///< extra member: DIME options or a description of the MIME attachment or NULL }; /// Stores a linked list of DIME attachments received /** This structure's `::soap_mime::list` member points to a linked list of DIME attachments received. Other data in this structure (not shown) is used to manage the state of the engine's DIME processing. The `begin` and `end` member functions return an iterator to iterate over attachments in C++. */ struct soap_dime { struct soap_multipart *list; ///< list of DIME attachments received soap_multipart::iterator begin(); ///< C++ only: an iterator over soap_multipart attachments soap_multipart::iterator end(); ///< C++ only: an iterator over soap_multipart attachments }; /// Enable DIME attachments /** This function enables sending DIME attachments. This function is generally not required because DIME attachments are automatically detected as `::xsd__base64Binary` and `::_xop__Include` structures in the data to serialize as an XML message with the attachments automatically added or DIME attachments can be explicitly added with `::soap_set_dime_attachment`. */ int soap_set_dime(struct soap *soap) ; /// Disable DIME attachments /** This function disables DIME attachments, unless the data to serialize as an XML message contains attachments defined by `::xsd__base64Binary` and `::_xop__Include` structures. */ void soap_clr_dime(struct soap *soap) ; /// Add a DIME attachment to the SOAP/XML message /** This function adds a DIME attachment to the XML message to send. The specified `ptr` points to the data to send of length specified by `size`. The `type` parameter indicates the MIME type of the data or can be NULL. The `id` parameter uniquely identifies the attachment in the message, which can be omitted by specifying NULL. The `option` parameter is an option such as a description of the data and `optype` is a user-defined option type (as per DIME option specification format). The `ptr` parameter must be persistent. The `ptr` parameter passed to this function must be persistent in memory until the attachment was sent. Returns `#SOAP_OK` or a `::soap_status` error code. When streaming DIME attachments are enabled by defining the `::soap::fdimereadopen`, `::soap::fdimeread`, `::soap::fdimereadclose` then the `ptr` parameter should point to a user-defined structure that is passed to `::soap::fdimereadopen` as the `handle` parameter. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_IO_CHUNK); const char *data = ...; // points to data to send size_t size = ...; // length of the data soap->connect_timeout = 30; // 30 seconds max connect stall time soap->send_timeout = soap_recv_timeout = 5; // 5 seconds max socket stall time (unlimited by default) soap->transfer_timeout = 30; // 30 seconds max message transfer time (unlimited by default) soap->recv_maxlength = 1048576; // limit messages received to 1MB (2GB by default) soap_set_dime_attachment(soap, data, size, "image/jpg", NULL, 0, "Picture"); if (soap_call_ns__webmethod(soap, endpoint, NULL, ...)) { soap_print_fault(soap, stderr); if (soap->errnum == 0) // timed out, exit program exit(EXIT_FAILURE); } else { ... // success } soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~ @see `::xsd__base64Binary`, `::_xop__Include`, `::soap_rand_uuid`, `::soap::fdimereadopen`, `::soap::fdimeread`, `::soap::fdimereadclose`. */ int soap_set_dime_attachment( struct soap *soap, ///< `::soap` context const char *ptr, ///< pointer to data size_t size, ///< length of the data const char *type, ///< MIME type of the data or NULL const char *id, ///< content ID of the data or NULL unsigned short optype, ///< a 16 bit DIME option type const char *option) ///< one DIME option as a text string or NULL /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Creates a DIME option /** This function creates a DIME option-formatted string for the `::xsd__base64Binary::options` member variable or `::_xop__Include::options` member variable. */ char * soap_dime_option( struct soap *soap, ///< `::soap` context unsigned short optype, ///< a 16 bit DIME option type const char *option) ///< one DIME option as a text string /// @returns a DIME option-formatted string ; /** @} */ /** \defgroup group_mime MIME attachment functions @brief This module defines functions to set and get MIME/MTOM attachments To enable MIME or MTOM, first initialize the `::soap` context with `#SOAP_ENC_MIME` (for MIME) or `#SOAP_ENC_MTOM` (for MTOM) using `::soap_new1`, `::soap_init1`, `::soap_set_mode`, or `::soap_set_mime` to enable MIME and also to set a start id. To disable MIME use `::soap_clr_mime`. There are two ways to add MIME/MTOM attachments to SOAP/XML messages for sending: - use `::soap_set_mime_attachment` to explicitly add an attachment that contains the specified source of data; - use `::xsd__base64Binary` (MIME and MTOM) or `::_xop__Include` (MTOM) structures in the serializable data of a SOAP/XML message, where the specified data is serialized in MIME/MTOM attachments automatically when one of the `id`, `type` or `options` member variables are non-NULL. Both methods also support streaming MIME attachments to send using the `::soap::fmimereadopen`, `::soap::fmimeread`, and `::soap::fmimereadclose` callbacks that fetch the data to send, where a user-defined handle should be specified for the `ptr` parameter of `::soap_set_mime_attachment` or the `::xsd__base64Binary::__ptr` member variable instead of a pointer to the actual data. This handle can be used by the callbacks to fetch the specific data to transmit. Receiving MIME/MTOM attachments attached to SOAP/XML messages is automatic. The MIME/MTOM attachments are converted to binary data and stored in the `::xsd__base64Binary` structures that reference the MIME/MTOM attachments via the `::xsd__base64Binary::id` string, meaning that the `::xsd__base64Binary::__ptr` (points to the data) and `::xsd__base64Binary::__size` (data length) are populated automatically with the MIME/MTOM binary data. However, if the streaming MIME callbacks `::soap::fmimewriteopen`, `::soap::fmimewrite`, and `::soap::fmimewriteclose` are defined then the attachments are streamed to these callbacks instead. For example, to send and receive a SOAP/XML message with MIME attachments using a serializable `::xsd__base64Binary` structure: ~~~{.cpp} // example .h file for soapcpp2 //gsoap ns service name: example //gsoap ns service namespace: urn:example struct xsd__base64Binary { unsigned char *__ptr; // pointer to binary data int __size; // size of the binary data char *id; // NULL to generate an id or assign this member variable a unique UUID char *type; // MIME type of the data char *options; // DIME options or an optional description of the MIME attachment }; int ns__webmethod(struct xsd__base64Binary *data, struct xsd__base64Binary *result); ~~~ ~~~{.cpp} // example client implementation based on the above example .h file for soapcpp2 #include "soapH.h" int main() { struct soap *soap = soap_new(); struct xsd__base64Binary data, result; data.__ptr = ...; // points to binary image data to send data.__size = ...; // size of the image data to send data.id = soap_strdup(soap, soap_rand_uuid(soap, NULL)); data.type = "image/jpg"; data.options = "A picture"; if (soap_call_ns__webmethod(soap, endpoint, NULL, &data, &result)) soap_print_fault(soap, stderr); else ... // success, use the result soap_destroy(soap); soap_end(soap); soap_free(soap); } ~~~ ~~~{.cpp} // example service implementation based on the above example .h file for soapcpp2 #include "soapH.h" int main() { struct soap *soap = soap_new(); ... // serve requests with soap_bind, soap_accept, soap_ssl_accept, and soap_serve } int ns__webmethod(struct soap *soap, struct xsd__base64Binary *data, struct xsd__base64Binary *result) { // echo back the structure (as a MIME attachment) result->__ptr = data->__ptr; result->__size = data->__size; retult->id = data->id; retult->type = data->type; retult->options = data->options; return SOAP_OK; } ~~~ To send MIME attachments without SOAP/XML (i.e. with REST methods), simply add attachments with `::soap_set_mime_attachment`. The `::soap_end_send` function then adds the attachments before finalizing the message transmission. To receive MIME attachments without SOAP/XML (i.e. with REST methods), simply call `::soap_begin_recv` (not needed at the server side since this is already called to parse the HTTP header) and `::soap_end_recv`. For example a client-side multipart-related POST operation that sends a multipart-related message with one MIME attachment and receives a message consisting of multipart-related MIME attachments: ~~~{.cpp} #include "soapH.h" int main() { struct soap *soap = soap_new(); const char *ptr = "Some attached text"; size_t size = strlen(ptr); soap_set_mime(soap, NULL, "body"); soap_set_mime_attachment(soap, ptr, size, SOAP_MIME_NONE, "text/xml", "attach1", NULL, NULL); if (soap_POST(soap, "http://", NULL, "text/xml") || soap_send(soap, "Some text") || soap_end_send(soap) || soap_begin_recv(soap) || soap_end_recv(soap)) { soap_print_fault(soap, stderr); } else { int n = 0; struct soap_multipart *attachment; for (attachment = soap->mime.list; attachment; attachment = attachment->next) { ++n; printf("Part %d:\n", n); printf("ptr =%p\n", attachment->ptr); printf("size =%ul\n", attachment->size); printf("id =%s\n", attachment->id ? attachment->id : ""); printf("type =%s\n", attachment->type ? attachment->type : ""); printf("location =%s\n", attachment->location ? attachment->location : ""); printf("description=%s\n", attachment->description ? attachment->description : ""); } } soap_clr_mime(soap); } ~~~ In C++ you can use an iterator for the last part of this example: ~~~{.cpp} struct soap *soap = soap_new(); ... // call soap_POST etc int n = 0; for (soap_multipart::iterator i = soap->mime.begin(); i != soap->mime.end(); ++i) { ++n; printf("Part %d:\n", n); printf("ptr =%p\n", i->ptr); ... // etc } ~~~ At the server side the code to retrieve the REST message sent consisting of a set of multipart-related MIME attachments is the same. To respond with multipart-related MIME attachments use `::soap_set_mime` and use `::soap_set_mime_attachment` to add attachments. For example: ~~~{.cpp} #include "soapH.h" int main() { struct soap *soap = soap_new(); soap->fget = my_get; // HTTP GET handler to serve HTTP GET ... // serve requests with soap_bind, soap_accept, soap_ssl_accept, and soap_serve } int my_get(struct soap *soap) { const char *ptr = "Some attached text"; size_t size = strlen(ptr); soap_set_mime(soap, NULL, "body"); soap_set_mime_attachment(soap, ptr, size, SOAP_MIME_NONE, "text/xml", "attach1", NULL, NULL); soap->http_content = "text/xml"; if (soap_response(soap, SOAP_FILE) || soap_send(soap, "Some text\n") || soap_end_send(soap)) return soap_closesock(soap); soap_clr_mime(soap); return SOAP_OK; } ~~~ To disable MIME again, use `::soap_clr_mime`. @{ */ /// RFC2045 MIME content transfer encodings /** These values are used by the `::soap_set_mime_attachment` function parameter `encoding`. @warning You are responsible to ensure that the MIME/MTOM content conforms to the encoding specified. We recommend `#SOAP_MIME_NONE` to transmit any data of any type which is usually the purpose of MIME/MTOM attachments to SOAP/XML. @see `::soap_set_mime_attachment`. */ enum soap_mime_encoding { SOAP_MIME_NONE, ///< no encoding, raw data content (recommended) SOAP_MIME_7BIT, ///< 7 bit data content SOAP_MIME_8BIT, ///< 8 bit data content SOAP_MIME_BINARY, ///< binary raw data content SOAP_MIME_QUOTED_PRINTABLE, ///< data is formatted as quoted printable SOAP_MIME_BASE64, ///< data is formatted in base64 SOAP_MIME_IETF_TOKEN, ///< data is an IETF token SOAP_MIME_X_TOKEN ///< data is an X-token }; /// Add a MIME attachment to the SOAP/XML message /** This function adds a MIME attachment to a SOAP/XML message to send. The specified `ptr` points to the data to send of length specified by `size`. The `encoding` parameter is a `::soap_mime_encoding` value that is recommended to be specified as `#SOAP_MIME_NONE` to specify that the MIME data content is not encoded in any way (the MIME attachment function simply copies the raw data to the MIME block without encoding). The `type` parameter is required and indicates the MIME type of the data, such as "image/jpg". The `id` parameter uniquely identifies the attachment in the message, which can be omitted by specifying NULL. The `location` parameter specifies a location string or NULL. The `description` parameter is a string that describes the data or NULL. Returns `#SOAP_OK` or a `::soap_status` error code. There are two ways to add MIME/MTOM attachments to SOAP/XML: - use `::soap_set_mime_attachment` to explicitly add an attachment that contains the specified source of data; - use `::xsd__base64Binary` or `_xop__Include` structures in the serializable data of a SOAP/XML message, where the specified data is serialized in MIME/MTOM attachments automatically when one of the `id`, `type` or `options` member variables are non-NULL. This option requires `#SOAP_ENC_MIME` or `#SOAP_ENC_MTOM`. Both methods support streaming MIME/MTOM attachments, where a user-defined handle instead of the actual data is specified for the `ptr` parameter or the `__ptr` member variable. @par Example: ~~~{.cpp} #include "soapH.h" struct soap *soap = soap_new1(SOAP_IO_CHUNK); const char *data = ...; // points to data to send size_t size = ...; // length of the data soap->connect_timeout = 30; // 30 seconds max connect stall time soap->send_timeout = soap_recv_timeout = 5; // 5 seconds max socket stall time (unlimited by default) soap->transfer_timeout = 30; // 30 seconds max message transfer time (unlimited by default) soap->recv_maxlength = 1048576; // limit messages received to 1MB (2GB by default) soap_set_mime_attachment(soap, data, size, SOAP_MIME_NONE, "image/jpg", NULL, NULL, "Picture"); if (soap_call_ns__webmethod(soap, endpoint, NULL, ...)) { soap_print_fault(soap, stderr); if (soap->errnum == 0) // timed out, exit program exit(EXIT_FAILURE); } else { ... // success } soap_clr_mime(soap); soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~ @see `::xsd__base64Binary`, `::_xop__Include`, `::soap_rand_uuid`, `::soap::fmimereadopen`, `::soap::fmimeread`, `::soap::fmimereadclose`. */ int soap_set_mime_attachment( struct soap *soap, ///< `::soap` context const char *ptr, ///< pointer to data size_t size, ///< length of the data enum soap_mime_encoding encoding, ///< encoding of the data const char *type, ///< MIME type of the data const char *id, ///< content ID of the data or NULL const char *location, ///< location of the data or NULL const char *description) ///< description of the data or NULL /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Enable MIME attachments /** This function enables sending MIME attachments. This function is generally not required when the context is initialized with `#SOAP_ENC_MIME`, because MIME attachments are automatically detected as `::xsd__base64Binary` and `::_xop__Include` structures in the data to serialize as an XML message with the attachments automatically added or MIME attachments can be explicitly added with `::soap_set_mime_attachment`. Parameter `boundary` specifies a MIME boundary string or NULL to have the engine generate a MIME boundary string. Parameter `start` specifiesthe start content ID for the first MIME body containing the SOAP or XML message. When NULL, the start ID of the SOAP message is ``. @see `::soap_set_mime_attachment`, `::soap_clr_mime`, `#SOAP_ENC_MIME`, `#SOAP_ENC_MTOM`. */ int soap_set_mime( struct soap *soap, ///< `::soap` context const char *boundary, ///< MIME boundary string to use or NULL to generate a random boundary const char *start) ///< string id of the first MIME attachment with the SOAP/XML message or NULL ; /// Disable MIME attachments /** This function disables MIME attachments such as after sending a multipart-related message with attachments to switch back to non-multipart-related messaging, unless the data to serialize as a message contains attachments such as `::xsd__base64Binary` for MIME attachments and `::_xop__Include` for MTOM attachments. @see `::soap_set_mime`, `::soap_set_mime_attachment`, `#SOAP_ENC_MIME`, `#SOAP_ENC_MTOM`. */ void soap_clr_mime(struct soap *soap) ///< `::soap` context ; /// Enable post-processing of MIME/MTOM attachments /** This function enables post-processing of MTOM/MIME attachments received. This means that the presence of MIME/MTOM attachments must be explicitly checked and retrieved by calling `::soap_check_mime_attachments` and when successul `::soap_recv_mime_attachment` should be called to retrieve each attachment. If attachments are not referenced by the SOAP/XML message received, then normallly an error will be produced to indicate that attachments exist that were not converted into binary `::xsd__base64Binary` or `::_xop__Include` structures (i.e. deserialized from the message by resolving references to MIME/MTOM attachments). This error can be avoided by using `::soap_post_check_mime_attachments` to indicate that attachments may appear that cannot be automatically resolved and should be handled explicitly by calling `::soap_check_mime_attachments` and `::soap_recv_mime_attachment`. @par Examples: ~~~{.cpp} #include "soapH.h" int main() { struct soap *soap = soap_new(); soap_post_check_mime_attachments(soap); if (soap_call_ns__webmethod(soap, ...)) { soap_print_fault(soap, stderr); // an error occurred } else { if (soap_check_mime_attachments(soap)) { // attachments are present, channel is still open int n = 0; do { struct soap_multipart *attachment = soap_recv_mime_attachment(soap, NULL); ++n; printf("Part %d:\n", n); printf("ptr =%p\n", attachment->ptr); printf("size =%ul\n", attachment->size); printf("id =%s\n", attachment->id ? attachment->id : ""); printf("type =%s\n", attachment->type ? attachment->type : ""); printf("location =%s\n", attachment->location ? attachment->location : ""); printf("description=%s\n", attachment->description ? attachment->description : ""); } while (attachment); if (soap->error) soap_print_fault(soap, stderr); } } soap_destroy(soap); soap_end(soap); soap_free(soap); } ~~~ ~~~{.cpp} #include "soapH.h" int main() { struct soap *soap = soap_new(); soap->fmimewriteopen = mime_write_open; soap->fmimewrite = mime_write; soap->fmimewriteclose = mime_write_close; soap_post_check_mime_attachments(soap); if (soap_call_ns__webmethod(soap, ...)) { soap_print_fault(soap, stderr); // an error occurred } else { if (soap_check_mime_attachments(soap)) { // attachments are present, channel is still open int n = 0; do { handle = ...; // a 'handle' to pass to the MIME/MTOM callbacks that process the attachment content ++n; printf("Part %d:\n", n); printf("ptr =%p\n", attachment->ptr); printf("size =%ul\n", attachment->size); printf("id =%s\n", attachment->id ? attachment->id : ""); printf("type =%s\n", attachment->type ? attachment->type : ""); printf("location =%s\n", attachment->location ? attachment->location : ""); printf("description=%s\n", attachment->description ? attachment->description : ""); } while (attachment); if (soap->error) soap_print_fault(soap, stderr); } } soap_destroy(soap); soap_end(soap); soap_free(soap); } ~~~ @see `::soap_check_mime_attachments`, `::soap_recv_mime_attachment`, `::soap::fmimewriteopen`, `::soap::fmimewrite`, `::soap::fmimewriteclose`. */ int soap_post_check_mime_attachments(struct soap *soap) ///< `::soap` context /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Check for a MIME/MTOM attachment /** This function checks the presence of a MIME/MTOM attachment after calling a service operation by returning nonzero when attachments are present. Returns nonzero if attachments are present. Requires `::soap_post_check_mime_attachments`. @see `::soap_post_check_mime_attachments`. */ int soap_check_mime_attachments(struct soap *soap) ///< `::soap` context /// @returns nonzero if MIME/MTOM attachments are present ; /// Stores a linked list of MIME attachments received /** This structure's `::soap_mime::list` member points to a linked list of MIME attachments received. Other data in this structure (not shown) is used to manage the state of the engine's MIME processing. The `begin` and `end` member functions return an iterator to iterate over attachments in C++. */ struct soap_mime { struct soap_multipart *list; ///< list of MIME attachments received soap_multipart::iterator begin(); ///< C++ only: an iterator over soap_multipart attachments soap_multipart::iterator end(); ///< C++ only: an iterator over soap_multipart attachments }; /// DIME/MIME/MTOM attachment data received by the engine /** @see `::soap_post_check_mime_attachments`, `::soap_check_mime_attachments`, `::soap_recv_mime_attachment`. */ struct soap_multipart { struct soap_multipart *next; ///< next attachment in the linked list const char *ptr; ///< points to raw data content size_t size; ///< size of data content const char *id; ///< DIME/MIME/MTOM content ID or form data name const char *type; ///< DIME/MIME/MTOM 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) typedef soap_multipart_iterator iterator; ///< C++ only: an iterator over soap_multipart attachments }; /// Get a MIME/MTOM attachment /** This function parses an attachment and invokes the MIME callbacks when set. The `handle` parameter is passed to `fmimewriteopen`. The handle may contain any data that is extracted from the SOAP message body to guide the redirection of the stream in the callbacks. Returns a struct with a `char *ptr` member that contains the handle value returned by the `fmimewriteopen` callback, and `char *id`, `char *type`, and `char *description` member variables with the MIME id, type, and description info when present in the attachment. @see `::soap_post_check_mime_attachments`, `::soap_check_mime_attachments`. */ struct soap_multipart * soap_recv_mime_attachment( struct soap *soap, ///< `::soap` context void *handle) ///< a handle to pass to the callbacks /// @returns MIME attachment data or NULL if no more attachments were found ; /** @} */ /** \defgroup group_plugin Plugins and plugin registry functions @brief This module defines plugin registry functions to register plugins Available plugins: - `::logging` plugin - `::http_get` HTTP GET plugin - `::http_post` HTTP POST plugin - [HTTP digest authentication plugin](../../httpda/html/httpda.html) - [HTTP sessions plugin](../../sessions/html/index.html) - [CURL plugin](../../curl/html/index.html) - [WinInet plugin](../../wininet/html/index.html) - [WS-Security plugin](../../wsse/html/wsse.html) - [WS-Addressing plugin](../../wsa/html/wsa_0.html) - [WS-ReliableMessaging plugin](../../wsrm/html/wsrm_0.html) - [WS-Discovery plugin](../../wsdd/html/wsdd_0.html) Modules and extensions: - [ISAPI extension](../../isapi/html/index.html) - [Apache module](../../apache/html/index.html) Threads and mutex: - \ref group_threads Other: - [XML DOM](../../dom/html/index.html) - [XML-RPC and JSON](../../xml-rpc-json/html/index.html) @{ */ /// Register a plugin /** This function registers the specified plugin with the specified engine's context. The `fcreate` parameter is defined by the plugin library as a plugin registration function that when called initializes the plugin state. Returns `#SOAP_OK` or a `::soap_status` error code such as `#SOAP_PLUGIN_ERROR`. @see `::soap_register_plugin_arg`, `::http_get`, `::http_post`, `::logging`. */ int soap_register_plugin( struct soap *soap, ///< `::soap` context int (*fcreate)(struct soap*, struct soap_plugin*, void*)) ///< plugin registration function /// @returns `#SOAP_OK` or a `::soap_status` error code ; /// Register a plugin with an argument /** This function registers the specified plugin with the specified engine's context. The `fcreate` parameter is defined by the plugin library as a plugin registration function that when called initializes the plugin state. The argument `arg` is passed to the plugin registration function. Returns `#SOAP_OK` or a `::soap_status` error code such as `#SOAP_PLUGIN_ERROR`. @see `::soap_register_plugin`, `::http_get`, `::http_post`, `::logging`. */ int soap_register_plugin_arg( struct soap *soap, ///< `::soap` context int (*fcreate)(struct soap*, struct soap_plugin*, void*), ///< plugin registration function void *arg) ///< argument passed to the plugin registration function /// @returns `#SOAP_OK` or a `::soap_status` error code ; /** @} */ /** \defgroup group_threads Thread and mutex functions @brief This module defines portable thread and mutex functions - `#THREAD_TYPE` - `#THREAD_ID` - `#THREAD_CREATE(tidptr, funcptr, argptr)` - `#THREAD_CREATEX(tidptr, funcptr, argptr)` (for Windows) - `#THREAD_CLOSE(tid)` (for Windows) - `#THREAD_DETACH(tid)` - `#THREAD_JOIN(tid)` - `#THREAD_EXIT` - `#THREAD_CANCEL(tid)` - `#MUTEX_TYPE` - `#MUTEX_INITIALIZER` - `#MUTEX_SETUP(mx)` - `#MUTEX_CLEANUP(mx)` - `#MUTEX_LOCK(mx)` - `#MUTEX_UNLOCK(mx)` - `#COND_TYPE` - `#COND_SETUP(cv)` - `#COND_CLEANUP(cv)` - `#COND_SIGNAL(cv)` - `#COND_WAIT(mx, cv)` @{ */ /// Type of a thread (thread ID) /** This macro represents a portable thread ID type. @note This macro is declared in `gsoap/plugin/threads.h` and requires compilation of `gsoap/plugin/threads.c` on Windows platforms. @par Example: ~~~{.cpp} THREAD_TYPE tid; while (THREAD_CREATE(&tid, (void*(*)(void*))&process_request, (void*)tsoap))) sleep(1); // failed, try again ~~~ */ #define THREAD_TYPE /// The thread ID of self /** This macro represents the current thread ID, i.e. self. @note This macro is declared in `gsoap/plugin/threads.h` and requires compilation of `gsoap/plugin/threads.c` on Windows platforms. */ #define THREAD_ID /// Create a new thread /** This macro creates a new thread and runs the specified function with the argument parameter passed to this function. @warning On Windows platforms `#THREAD_CREATE` uses `_beginthread` which returns a thread ID handle that cannot be joined. To join a thread use `THREAD_CREATEX(&tid, func, arg)` then `#THREAD_JOIN`. Don't forget to `THREAD_CLOSE(tid)` afterwards: ~~~{.cpp} #include "plugin/threads.h" THREAD_TYPE tid; while (THREAD_CREATEX(&tid, (void*(*)(void*))&process_request, (void*)tsoap))) sleep(1); // failed, try again ... // some other work to do THREAD_JOIN(tid); // wait for the thread to terminate and join THREAD_CLOSE(tid); // close handle ... // some other work to do ~~~ @note This macro is declared in `gsoap/plugin/threads.h` and requires compilation of `gsoap/plugin/threads.c` on Windows platforms. @par Example: ~~~{.cpp} #include "plugin/threads.h" THREAD_TYPE tid; while (THREAD_CREATE(&tid, (void*(*)(void*))&process_request, (void*)tsoap))) sleep(1); // failed, try again ... // some other work to do THREAD_JOIN(tid); // optional: to wait for the thread to terminate and join (see warning) ... // some other work to do ~~~ @param tidptr pointer to `#THREAD_TYPE` thread ID to assign @param funcptr function to run by the new thread @param argptr the argument (a pointer) to pass to the function when called @returns zero on success and nonzero on failure */ #define THREAD_CREATE(tidptr, funcptr, argptr) /// Create a new joinable thread (Windows only) /** On Windows platforms `#THREAD_CREATE` uses `_beginthread` which returns a thread ID handle that cannot be joined. To join a thread use `THREAD_CREATEX(&tid, func, arg)` then `#THREAD_JOIN`. Don't forget to `THREAD_CLOSE(tid)` afterwards. */ #define THREAD_CREATEX(tidptr, funcptr, argptr) /// Close the thread ID handle created by `#THREAD_CREATEX` (Windows only) #define THREAD_CLOSE(tid) /// Detach a thread /** This macro detaches the specified thread. A detached thread cannot be joined back with the thread that created it. When a detached thread terminates, its resources are automatically released back to the system without the need for another thread to join with the terminated thread. This macro has no effect on Windows platforms, see `#THREAD_CREATE`. @note This macro is declared in `gsoap/plugin/threads.h` and requires compilation of `gsoap/plugin/threads.c` on Windows platforms. @par Example: ~~~{.cpp} #include "plugin/threads.h" THREAD_DETACH(THREAD_ID); // detach self ~~~ @param tid `#THREAD_TYPE` thread ID to detach */ #define THREAD_DETACH(tid) /// Join a thread /** This macro waits for the termination of the specified thread to join it. This macro requires `#THREAD_CREATEX` and `#THREAD_CLOSE` on Windows plaforms. @note This macro is declared in `gsoap/plugin/threads.h` and requires compilation of `gsoap/plugin/threads.c` on Windows platforms. @param tid `#THREAD_TYPE` thread ID to join */ #define THREAD_JOIN(tid) /// Exit the current thread /** This macro terminates the current thread. @note This macro is declared in `gsoap/plugin/threads.h` and requires compilation of `gsoap/plugin/threads.c` on Windows platforms. */ #define THREAD_EXIT /// Cancel a thread /** This macro requests that the specified thread be cancelled. POSIX threads can be cancelled when currently in a cancellation point, which are certain functions that will terminate the thread when the thread is cancelled. @warning Cancelling a thread may lead to resource leaks when the thread has no mechanism to clean up its state (memory allocated, files and sockets opened etc.), unless cleanup handlers are defined for each thread, e.g. with `pthread_cleanup_push`. Even when defining a cleanup function, care must be taken to prevent resource leaks that may be caused by cancellation points that sit between a resouce acquisition operation and its release operation, e.g. between a file open and close operation some read/write functions may be called that are cancellation points. The gSOAP engine and plugins are designed to maintain the engine state using resource pointers to resources (memory, files, sockets etc.) in the `::soap` context. The context should be passed to the cleanup function when added with `pthread_cleanup_push` to cleanup the context. This cleanup function should call `::soap_destroy`, `::soap_end`, and `::soap_free` (in that order). However, use `#THREAD_CANCEL` at your own risk. User-defined service operations and other non-gSOAP code may not meet the requirements to perform a safe `#THREAD_CANCEL` unless the cleanup functions are carefully designed. Alternatively, a simpler approach with a global flag (a flag per thread) may suffice: set the flag by the main thread to indicate termination is requested of the specific thread and check this flag in the user-defined service operations to terminate the service operation with an error, e.g. `return 500`. @note This macro is declared in `gsoap/plugin/threads.h` and requires compilation of `gsoap/plugin/threads.c` on Windows platforms. @par Example: ~~~{.cpp} #include "soapH.h" #include "plugin/threads.h" struct soap *soap = soap_new(); soap->bind_flags = SO_REUSEADDR; // immediate port reuse soap->accept_timeout = 3600; // exit loop when no request arrives in one hour soap->send_timeout = soap_recv_timeout = 5; // 5 seconds max socket stall time (unlimited by default) soap->transfer_timeout = 30; // 30 seconds max message transfer time (unlimited by default) soap->recv_maxlength = 1048576; // limit messages received to 1MB (2GB by default) if (soap_valid_socket(soap_bind(soap, NULL, PORTNUM, BACKLOG))) { while (1) { if (soap_valid_socket(soap_accept(soap))) { THREAD_TYPE tid; struct soap *tsoap = soap_copy(soap); if (!tsoap) soap_force_closesock(soap); else while (THREAD_CREATE(&tid, (void*(*)(void*))&accept_request, (void*)tsoap)) sleep(1); // failed, try again } else if (soap->errnum) // accept failed, try again after 1 second { soap_print_fault(soap, stderr); sleep(1); } else // accept_timeout timed out, quit looping { break; } soap_destroy(soap); soap_end(soap); } } soap_free(soap); void *accept_request(struct soap *soap) { THREAD_TYPE tid; struct soap *tsoap; THREAD_DETACH(THREAD_ID); // create a new thread that is timed to execute for max 10 seconds tsoap = soap_copy(soap); if (!tsoap) { soap_force_closesock(soap); } else { while (THREAD_CREATE(&tid, (void*(*)(void*))&process_request, (void*)tsoap)) sleep(1); // failed, try again // allow serving the request by the new thread for up to 30 seconds max sleep(30); // terminate process_request thread THREAD_CANCEL(tid); } // clean up soap_destroy(soap); soap_end(soap); soap_free(soap); return NULL; } void *process_request(struct soap *soap) { // add the cleanup function pthread_cleanup_push((void(*)(void*))&cleanup, (void*)soap); soap_serve(soap); // remove the cleanup function and call it to cleanup the context pthread_cleanup_pop(1); return NULL; } void cleanup(struct soap *soap) { soap_destroy(soap); soap_end(soap); soap_free(soap); } ~~~ @param tid `#THREAD_TYPE` thread ID to cancel */ #define THREAD_CANCEL(tid) /// Type of a mutex object /** This macro represents a portable mutex object type. To declare and initialize static mutex objects, see `#MUTEX_INITIALIZER`. @par Example: ~~~{.cpp} #include "plugin/threads.h" MUTEX_TYPE lock; MUTEX_SETUP(lock); ... // some other work to do MUTEX_LOCK(lock); ... // critical section MUTEX_UNLOCK(lock); ... // some other work to do MUTEX_CLEANUP(lock); ~~~ @note This macro is declared in `gsoap/plugin/threads.h` and requires compilation of `gsoap/plugin/threads.c` on Windows platforms. */ #define MUTEX_TYPE /// Mutex initializer object /** @note This macro is declared in `gsoap/plugin/threads.h` and requires compilation of `gsoap/plugin/threads.c` on Windows platforms. @par Example: ~~~{.cpp} #include "plugin/threads.h" static MUTEX_TYPE lock = MUTEX_INITIALIZER; int main() { ... // some other work to do MUTEX_LOCK(lock); ... // critical section MUTEX_UNLOCK(lock); ... } ~~~ */ #define MUTEX_INITIALIZER /// Mutex object initialization /** This macro initializes a mutex object. To declare and initialize static mutex objects, see `#MUTEX_INITIALIZER`. @note This macro is declared in `gsoap/plugin/threads.h` and requires compilation of `gsoap/plugin/threads.c` on Windows platforms. @par Example: ~~~{.cpp} #include "plugin/threads.h" MUTEX_TYPE lock; MUTEX_SETUP(lock); ... // some other work to do MUTEX_LOCK(lock); ... // critical section MUTEX_UNLOCK(lock); ... // some other work to do MUTEX_CLEANUP(lock); ~~~ @param mx `#MUTEX_TYPE` mutex object */ #define MUTEX_SETUP(mx) /// Mutex object finalization /** This macro finalizes a mutex object. @note This macro is declared in `gsoap/plugin/threads.h` and requires compilation of `gsoap/plugin/threads.c` on Windows platforms. @par Example: ~~~{.cpp} #include "plugin/threads.h" MUTEX_TYPE lock; MUTEX_SETUP(lock); ... // some other work to do MUTEX_LOCK(lock); ... // critical section MUTEX_UNLOCK(lock); ... // some other work to do MUTEX_CLEANUP(lock); ~~~ @param mx `#MUTEX_TYPE` mutex object */ #define MUTEX_CLEANUP(mx) /// Mutex object lock /** This macro acquires mutex. @note This macro is declared in `gsoap/plugin/threads.h` and requires compilation of `gsoap/plugin/threads.c` on Windows platforms. @par Example: ~~~{.cpp} #include "plugin/threads.h" MUTEX_TYPE lock; MUTEX_SETUP(lock); ... // some other work to do MUTEX_LOCK(lock); ... // critical section MUTEX_UNLOCK(lock); ... // some other work to do MUTEX_CLEANUP(lock); ~~~ @param mx `#MUTEX_TYPE` mutex object */ #define MUTEX_LOCK(mx) /// Mutex object unlock /** This macro releases mutex. @note This macro is declared in `gsoap/plugin/threads.h` and requires compilation of `gsoap/plugin/threads.c` on Windows platforms. @par Example: ~~~{.cpp} #include "plugin/threads.h" MUTEX_TYPE lock; MUTEX_SETUP(lock); ... // some other work to do MUTEX_LOCK(lock); ... // critical section MUTEX_UNLOCK(lock); ... // some other work to do MUTEX_CLEANUP(lock); ~~~ @param mx `#MUTEX_TYPE` mutex object */ #define MUTEX_UNLOCK(mx) /// The type of a condition variable /** This macro represents a portable condition variable @note This macro is declared in `gsoap/plugin/threads.h` and requires compilation of `gsoap/plugin/threads.c` on Windows platforms. */ #define COND_TYPE /// Condition variable initialization /** This macro initializes the specified condition variable. @note This macro is declared in `gsoap/plugin/threads.h` and requires compilation of `gsoap/plugin/threads.c` on Windows platforms. @param cv `#COND_TYPE` condition variable */ #define COND_SETUP(cv) /// Condition variable finalization /** This macro finalizes the specified condition variable. @note This macro is declared in `gsoap/plugin/threads.h` and requires compilation of `gsoap/plugin/threads.c` on Windows platforms. @param cv `#COND_TYPE` condition variable */ #define COND_CLEANUP(cv) /// Condition variable signal operation /** This macro signals the specified condition variable. @note This macro is declared in `gsoap/plugin/threads.h` and requires compilation of `gsoap/plugin/threads.c` on Windows platforms. @param cv `#COND_TYPE` condition variable */ #define COND_SIGNAL(cv) /// Condition variable wait operation /** This macro waits on the specified condition variable and releases the mutex while waiting. @note This macro is declared in `gsoap/plugin/threads.h` and requires compilation of `gsoap/plugin/threads.c` on Windows platforms. @param mx `#MUTEX_TYPE` mutex object @param cv `#COND_TYPE` condition variable */ #define COND_WAIT(mx, cv) /** @} */ /** \defgroup group_misc Miscellaneous functions @brief This module defines other useful functions @{ */ /// Reset context /** This function resets the context to start serialization with the `serialize` functions. Alternatively, `::soap_begin_send` can be used before calling the `serialize` functions, but this is sometimes not possible so this function can be used instead. @par Example: ~~~{.cpp} struct soap *soap = soap_new1(SOAP_XML_GRAPH); ... // further initializations struct ns__someElement elt; ... // populate elt soap_begin(soap); // reset context before calling serialize functions soap_serialize_ns__someElement(soap, &elt); // analyze pointers for multi-ref serialization ~~~ @see `::soap_begin_send`. */ void soap_begin(struct soap *soap) ///< `::soap` context ; /// Returns a randomized unique UUID string /** This function returns a randomized unique UUID string stored in a temporary buffer. The UUID string starts with the specified prefix if non-NULL. @par Example: ~~~{.cpp} struct soap *soap = soap_new(); const char *uuid = soap_strdup(soap, soap_rand_uuid(soap, NULL)); ... ~~~ */ const char * soap_rand_uuid( struct soap *soap, ///< `::soap` context const char *prefix) ///< prefix string or NULL /// @returns randomized UUID string stored in a temporary buffer ; /// Compare string to a pattern /** This function returns zero when the specified string matches the given pattern, nonzero otherwise. A pattern consists of two types of wildcard meta-characters: `*` matches any text of any length and `-` matches any single character. This function is commonly used to match XML tags and XML namespace URIs, such as the URI pattern in the third column of the `::namespaces` table. */ int soap_tag_cmp( const char *string, ///< string to match const char *pattern) ///< pattern to match /// @returns zero (match) or nonzero (no match) ; /// Match an XML tag name /** This function returns `#SOAP_OK` when the two specified XML tag names match. The first tag name is a qualified or unqualified parsed tag name when the parser is pulling XML tags. The second tag name is an unqualified or namespace-normalized qualified tag name or pattern to match. A namespace-normalized qualified tag name uses a prefix defined in the `::namespaces` table. A pattern consists of two types of wildcard meta-characters: `*` matches any text of any length and `-` matches any single character. Returns `#SOAP_OK` when the tags are matching or `#SOAP_TAG_MISMATCH` when the tags are non-matching. @warning This function should only be used while the XML parser is actively parsing input, for example in the `::soap::fignore` callback. */ int soap_match_tag( struct soap *soap, ///< `::soap` context const char *tag1, ///< parsed (un)qualified tag name string to match const char *tag2) ///< (namespace-normalized qualified) tag name string or pattern to match /// @returns `#SOAP_OK` (match) or `#SOAP_TAG_MISMATCH` (no match) ; /** @} */ gsoap-2.8.91/gsoap/doc/GeniviaLogo2_trans_noslogan.png0000644000175000017500000002372613525245160022261 0ustar ellertellertPNG  IHDR- 0 DiCCPICC ProfileH wTl/]"e齷.H& KYe7D"V$(bh(+X "J F;'Nw>}w(!a@P"f'0D6p(h@_63u_ -Z[3C+K;?r!YLD)c#c1 ʪ2N|bO h{yIHD.VV>RV:|{ [RF ”"MF1L1[Te'Jx%C%_%RJ#4GcӸu:(G73%Ie%e{SC add1T4UT*TTTUzUUUoScemUkS{Q7UPWߣ~A}b}9Հ5L5"5iјi<9Ъ:5MvhWh~Tfz1U.椎NTgNΌ|ݵͺHz,T NI}mPw ,tӆF -5j4oL50^l\k|g24mr6u0M713fͱBZA EEŰ%2res+}VV(٬Ԗk[c{Îjgʮ=~mCNNb&q'}d]N,:+Uʺuv^|o]5˟[7wM׍mȝ}CǃQSϓY9eu빷ػ{^>*}7l6 8`k`f 7!p2)hEPW0%8*:Qi8# z<ἶ0-AQ#p5#m"GvGѢG.7xt~g|LbLCtOlyPU܊|BLB}&:$%Zh`EꋲJO$O&&N~ rRSvLrgIsKۖ6^>!` /22fLge̜͊j&d'g* 3]9Z99"3Qhh'\(wanLHyy5yoc( z.ٴdloaqu.Yf WB+SVv[UjtCkHk2zmWbuj.Y￾HH\4uލ6W|ĺ})76T}39usocٞ---zl=TX|d[ fEqūI/WWA!1TRվS疝ӫox4صin={j-n`[k k+x\S-ۆzEjpjh8qn6Ik:8w7ޜw[nn?uݼ3V/~ڟM~nr:53(ѽȳ_ry?ZrL{퓓~מ.x:LlfW_w=7~oLM˃_uNO=|zfڛCoYož_Cggg` pHYs  8IDATx=XTs6:*EbƠшԧ(XE F3jĵk'cH5h,o5*"ҤK]ʶ{wYRļ˿L;s̙3gf\qDM!R@ w[7A_߰> uUakBsO(9<޽{}R =0q=qRäE8G|x@Z6}pxr?tk4/P7wu)}ɖh MsΎE!/t'rZw{}37lږ'B)i[q#h##88!ƍ7 "N }tc\kTBXV#qyN#yAĠGs6Wvg+UrSy"M?C 9okk˹WH$'a[l92l(!>,tKn3[/dʅ0Gc8 -xzRB1(0_$GpZN&J(Tqz7BAS|._}t!] ĵx{醃^lH7=Tcf7E/!.土uw=^͘1[#(U>\n%LL'NjQ}=ö,w;2C?_0LYudsQQQANO)0h|X,?xAxqk\k2|ʤ9erMXG0Z3 Qt'Bo(mqjeZC!DvmG~ը0@Pb+!:;}8rfsz jcgm^ ϤV3[fyƒpP :rL]Ouzm 7q`F j'g-|P媚!Xo%imlCtEQ_s~-:v^ "͸.#f۾-α,cYAPk >Y! @ɲ7/wKcX38.KrAPqBU1̝;imhuZTuCZ Ԝ8I셽a}QPuR/Y2ohl|Ar}9͇8~âHnQȷf|$@ r#90q OORsvv{l!mMJo0k[cC2&yyy\rrr|ZZ x ̹8!¶MĩmE"~\BxX:'V;;hjՠˮGiJ-UjjPu}m#Grޱ t#I=8CBI)ZjvZ1¿ZIoe3/ 0$z؅ũS?ynZ:!$ P5>r`Y 0 j ;2NFf)㋙x <NIQ%c(f5/OPBB9%w]bbaBsY=S&z|9qy1s$,,:8Xc7Maov,c?F*`䖪,M2O)ᄋ F~7>.Tq'4>S@l+Yy8W"K'CްkF vԨQӯ\MsM9xx΂׸-i6"-E`=c9ϧyDѵk3ѹdt0 Kp=gnXZæh !ثQkzmINiհr`@/\`u">ImaJ<>ݸ\>u2خ璎ˇ1s*n*RÆtL`P凷ҍisi9vL7`wp:uARFfT2MZ|R!u:Dru|7(ZBҠ..^W@X}y#Lf9to93[)ƆԩSIǎe:OqWhƀ:L-X@4r*8)@nnn༊`n(U_m8-fVǖ 'Ɉ}bۺ}hQn ]ïMP1oC<9Kvۅ`3( ,k 0B`n2˿lwڷZa><6]~;EL%m| ߩO<_x%hUM>Jӡ%Kx>~ =XknqHmp 60@P ?7WҐrb$X.~Q0s`y sv}E`vFGh\Po񧻻(Uio\*a qɅ]-ƌQ 0vz xpG@\k#gUE3pD dΝ98_@S ;ҦM3`iHԘ {c66nOzaWUjeNU#ps|zt0r"[iލM|o8k0Nêg@'eU%0}I3Bu@W'>P@fi sr}ם^\_HN a!tuuϩj_PΑnaUA2H19.*MIHb"GgHtELĕED]^cJ\\'YieK!1ԙieuqp_+h  )B` ;Ǡo~OOOeU9'M {rw䝟e.PQzp|OB0!b'|<8d'o\9{& 3 &4u~8ySvR~n H*RO^{\LgRKʫ4 J18ZRK5]OTԨ#F,?}&| +T?ԡCtNlAF*! f$p.Z `e98OAD)ޱ?_ͺ/& :PcH <E0V r*RGbG apCU$FJ׺pI 9`G /rҥKWn޼FFAjn[?PV X8b/[%r]l*5 zKG;MN΁l(3ZQ:9%d0/ەU wO>֡mKYPgP..[g4Tuou LKtW1''.=и,BCCBux8׭7&͌P=4LS`bH'470{Xkr(ea6΍JDS&K?, ;w(.[5fvtT0;/i,#Rk:7uIlmZ#s@>j{{r*e*5hdIwzjJf;dZNcgDS).1xUj OYCR6%I.?]%*u=#t0 Rʞ=׿Iq "$Ӽ렴A-z:X.8cvihsN8w[H2f9`怙f9`怙f@M>s5l ӦMOL{9jm۶ypPJh\zUFbP@=ZfehmYT* lTCr˜ޖS%˫Ѐ!%47OWj腖_~g ;:tP5bs!xlL 1&0M,󡭮aSuKl0>H(%fOoBKH%h$bAdtħCLC>~GCˣV@CƅEʒs{^p(1QiI S傡C%`h[ 1P)xt8h4 ˋ>y];>vNe>"+&F`/ 41l& tep8ܼ6!}xo1 :`HHH˗'!xQdWXLsرk L0bz|<ƚ%9!r8e6)'tG`<8'ULj.-ɛo^]ğpzS}n'GQTMXͿ nlgR",g#1/ezz} فѐb8NEE]aXurW6;IB5hk;h^p7 /))b $-i YL&1=Hb?IVi,K:;X?xS"(n@q0ּ>>ecƌ{ 80CAD33q޽M+ws7|w0c b_ _ .A Xl-!YP(F1 ju Ӫ"]E qʗ ӑ4OW9VX%GJyk5Ps2:.gܑGݾQH+fm:>C 4*߰0MDOG^L9UE."oZpf"83VczceQ;zrouulkg}zz2g-w<$XxQPPxx wŠAaUg B5| VYձp?et!d `ɍ=:υAn8 c-#?xNHAz!w,وHQ7%HvD+ٍp6_GjBBtg#@^'I_xQLW NdOUC[7FpIX c"R,Yò& VqJ`7~fh@1z4>y?hy? ֎mO4T͈>$G$fmaa'"Ic/++91ܘ^{DL}oONΪ,)^`ʸ>}ߝ6 `w-iZ'4r HS*qARiA*t@^'>'>~VIz޻wovXXXwܹszzz΄oHYG&.֭[_>޻f_ AX:`İM95/he8{۬ofw |3KAޠ34 nY!_z8b-&"շb_ =`i,d%d.s?$*I]"=pZ+?ԍGOxO@ś&-ܓ|7*d/$0/9 KZ5 a)4U 6Ƽecq4],A%grTHO!" 5n#sUKT<çot‚]ӏ@# 2Q AW"]va`2_2???~k+ٳᠽ! z7Rb PWf*bF{KSp:]k |f܉x-d DH?Ti[f/#/x藫6]F;R wttb~TBA!ɑM@g.v*sPC!Hܭ4'߬i[؛ @'Ze%\J$_IZ 9doc%9BeҜ*_!by?_ ;tWk%H`BZqy<_no2,:.#Ws'Vi'TXja|+Zd HS`+Os kwUTV6RA]#s i!]Fy;xsn#eYz`›6`ցCI Gy>)i#&|)zQHn]ryx\\(W}.5 &׼%DȾvk“{)7s30s30s30s3?ͭF" IENDB`gsoap-2.8.91/gsoap/doc/soapdoc2.html0000644000175000017500000000061113525245160016543 0ustar ellertellert Redirect
The contents you are looking for have moved. You will be redirected to the new location automatically.
gsoap-2.8.91/gsoap/doc/dom/0000755000175000017500000000000013525564137014734 5ustar ellertellertgsoap-2.8.91/gsoap/doc/dom/Doxyfile0000644000175000017500000002325713525245160016443 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "Level-2 DOM v5" PROJECT_NUMBER = "2.8 Stable" PROJECT_LOGO = "../GeniviaLogo2_trans_noslogan.png" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../import/dom.h ../../dom.cpp ../../samples/dom/dom2calc.cpp ../../samples/dom/README.md FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = ../doxygen_header.html HTML_FOOTER = ../doxygen_footer.html HTML_STYLESHEET = HTML_EXTRA_STYLESHEET = ../genivia_content.css ../genivia_tabs.css HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = NO MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /opt/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.91/gsoap/doc/README.txt0000644000175000017500000000026313525245160015644 0ustar ellertellert To browse the documentation, open the index.html file in a browser. Or you can navigate to https://www.genivia.com/docs.html for the latest documentation and software updates. gsoap-2.8.91/gsoap/doc/ios/0000755000175000017500000000000013525564137014747 5ustar ellertellertgsoap-2.8.91/gsoap/doc/ios/Doxyfile0000644000175000017500000002324313525245160016451 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "gSOAP iOS" PROJECT_NUMBER = "2.8 Stable" OUTPUT_DIRECTORY = PROJECT_LOGO = "../GeniviaLogo2_trans_noslogan.png" CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../ios_plugin/README.md ../../ios_plugin/gsoapios.h ../../ios_plugin/gsoapios.mm FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = ../doxygen_header.html HTML_FOOTER = ../doxygen_footer.html HTML_STYLESHEET = HTML_EXTRA_STYLESHEET = ../genivia_content.css ../genivia_tabs.css HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /opt/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.91/gsoap/doc/genivia_tabs.css0000644000175000017500000000320113525245160017306 0ustar ellertellert.tab_home { text-align: center; padding-top: 5px; padding-right: 10px; padding-left: 10px; font-size: 18px; } .tab_home a { color: #808080; text-decoration: none; } .tab_home a:hover { color: #D71E1E; text-decoration: none; } .tabs, .tabs2, .tabs3 { /* background-image: url('tab_b.png'); */ background: #c0504d; width: 90%; z-index: 101; font-size: 16px; font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; padding-left: 10%; } .tabs2 { font-size: 12px; } .tabs3 { font-size: 10px; } .tablist { margin: 0; padding: 0; display: table; } .tablist li { float: left; display: table-cell; /* background-image: url('tab_b.png'); */ line-height: 36px; list-style: none; } .tablist a { display: block; /* padding: 0 20px; */ padding: 6px 20px 6px 20px; /* background-image:url('tab_s.png'); font-weight: bold; background-repeat:no-repeat; background-position:right; color: #283A5D; */ color: rgba(255, 255, 255, 0.9); /* text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); */ text-decoration: none; outline: none; } .tabs3 .tablist a { padding: 0 10px; } .tablist a:hover { /* background-image: url('tab_h.png'); background-repeat:repeat-x; */ background: #E23232; color: #fff; /* text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); */ text-decoration: none; } .tablist li.current a { color: #ffffff; background: #E23232; /* background-image: url('tab_a.png'); background-repeat:repeat-x; color: #fff; text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); */ } gsoap-2.8.91/gsoap/doc/doxygen_footer.html0000644000175000017500000000055713525245160020075 0ustar ellertellert
gsoap-2.8.91/gsoap/doc/testmsgr/0000755000175000017500000000000013525564137016025 5ustar ellertellertgsoap-2.8.91/gsoap/doc/testmsgr/Doxyfile0000644000175000017500000002316413525245160017531 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "Test Messenger" PROJECT_NUMBER = "2.8 Stable" PROJECT_LOGO = "../GeniviaLogo2_trans_noslogan.png" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../samples/testmsgr/README.md FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = ../doxygen_header.html HTML_FOOTER = ../doxygen_footer.html HTML_STYLESHEET = HTML_EXTRA_STYLESHEET = ../genivia_content.css ../genivia_tabs.css HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = NO MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /opt/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.91/gsoap/doc/httpda/0000755000175000017500000000000013525564137015441 5ustar ellertellertgsoap-2.8.91/gsoap/doc/httpda/Doxyfile0000644000175000017500000002327213525245160017145 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "HTTP Digest Authentication" PROJECT_NUMBER = "2.8 Stable" PROJECT_LOGO = "../GeniviaLogo2_trans_noslogan.png" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../plugin/httpda.h ../../plugin/httpda.c ../../plugin/threads.h ../../plugin/threads.c FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = ../doxygen_header.html HTML_FOOTER = ../doxygen_footer.html HTML_STYLESHEET = HTML_EXTRA_STYLESHEET = ../genivia_content.css ../genivia_tabs.css HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /opt/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.91/gsoap/doc/index.html0000644000175000017500000002442313525245160016147 0ustar ellertellert Genivia gSOAP Documentation User guide --- ![Download](https://www.genivia.com/images/html.png) [the gSOAP user guide](guide/html/index.html) XML data bindings --- ![Download](https://www.genivia.com/images/html.png) [XML data binding documentation with examples](doc/databinding/html/index.html) describes the WSDL/XSD mapping tools to and from C/C++ types and QT C++ types. Explains the use of typemap.dat for wsdl2h with an explanation of the gSOAP C/C++ type and name binding conventions. Also describes memory management of objects and C/C++ data serialization. Includes an "Address Book" and a data structure "Graph" data binding example. XML DOM API and the domcpp tool --- ![Download](https://www.genivia.com/images/html.png) [XML DOM API and domcpp](doc/dom/html/index.html) presents the DOM API with the updated XML DOM library v5 for C/C++, and the domcpp code generation tool to simplify DOM API coding. XML-RPC, JSON, and the jsoncpp tool --- ![Download](https://www.genivia.com/images/html.png) [XML-RPC/JSON and jsoncpp](doc/xml-rpc-json/html/index.html) presents the XML-RPC and JSON/JSONPath library for C/C++, and the jsoncpp code generator to simplify JSON coding. JSON-RPC/REST client/server examples are included. cURL and WinInet for gSOAP --- ![Download](https://www.genivia.com/images/html.png) [the CURL plugin](doc/curl/html/index.html) enables [cURL](http://curl.haxx.se) with gSOAP for client applications. Examples are included. ![Download](https://www.genivia.com/images/html.png) [WinInet plugin for gSOAP](doc/wininet/html/index.html) describes the use of WinInet for gSOAP client applications. Apache, ISAPI, and WinInet for gSOAP --- ![Download](https://www.genivia.com/images/html.png) [Apache module for gSOAP](doc/apache/html/index.html) describes the deployment of gSOAP services in Apache Web servers as Apache modules. ![Download](https://www.genivia.com/images/html.png) [ISAPI extension for gSOAP](doc/isapi/html/index.html) describes the deployment of gSOAP services in Microsoft IIS as ISAPI extensions. iOS for gSOAP --- ![Download](https://www.genivia.com/images/html.png) [iOS for gSOAP](doc/ios/html/index.html) describes the use of our iOS plugin for gSOAP to develop apps. Four example iOS apps are explained. Security and authentication --- ![Download](https://www.genivia.com/images/html.png) [WS-Trust](doc/wst/html/index.html) describes the WS-Trust extensible framework. Includes SAML token creation, signing, verification, PSHA1, and more. Requires the WS-Security plugin. ![Download](https://www.genivia.com/images/html.png) [WS-Security](doc/wsse/html/wsse.html) describes the WSSE plugin for WS-Security authentication, digital signatures, and encryption. ![Download](https://www.genivia.com/images/html.png) [WS-Security lite](doc/wsse-lite/html/wsse.html) describes client-server authentication with a light-weight implementation of WS-Security. Use this plugin for username authentication tokens and timestamps over HTTPS. Does not support signature and encryption. ![Download](https://www.genivia.com/images/html.png) [WSSE smdevp signed message digest engine](doc/wsse/html/smdevp.html) describes the digest engine of the WSSE plugin. ![Download](https://www.genivia.com/images/html.png) [WSSE mecevp streaming message encryption and decryption engine](doc/wsse/html/mecevp.html) describes the encryption engine of the WSSE plugin. ![Download](https://www.genivia.com/images/html.png) [HTTP digest authentication](doc/httpda/html/httpda.html) describes the httpda plugin for secure HTTP authentication to replace HTTP basic authentication that is not secure over non-encrypted channels. ![Download](https://www.genivia.com/images/html.png) [HTTP server session management](doc/sessions/html/index.html) describes the HTTP server session management plugin for secure server-side HTTP sessions with cookies. Reliable messaging and message addressing --- ![Download](https://www.genivia.com/images/html.png) [WS-Addressing](doc/wsa/html/wsa_0.html) describes the WSA plugin for WS-Addressing of messages and message (re)routing. ![Download](https://www.genivia.com/images/html.png) [WS-ReliableMessaging](doc/wsrm/html/wsrm_0.html) describes the WSRM plugin for WS-ReliableMessaging message sequence creation and message sequence assured delivery with (optional) message resends. ![Download](https://www.genivia.com/images/html.png) [WSRM mq plugin for inbound message queueing and message replay](doc/wsrm/html/mq_0.html) describes the MQ plugin for message queueing in support of WS-RM NoDiscard behavior. Service discovery gSOAP plugin --- ![Download](https://www.genivia.com/images/html.png) [WS-Discovery](doc/wsdd/html/wsdd_0.html) describes the WSDD plugin for service discovery with WS-Discovery. Legacy gSOAP UDDI v2 API --- ![Download](https://www.genivia.com/images/html.png) [UDDI v2 API](doc/uddi2/html/index.html) describes the gSOAP UDDI v2 API. [![To top](https://www.genivia.com/images/go-up.png) To top](#) gsoap-2.8.91/gsoap/doc/xml-rpc-json/0000755000175000017500000000000013525564137016506 5ustar ellertellertgsoap-2.8.91/gsoap/doc/xml-rpc-json/Doxyfile0000644000175000017500000002336413525245161020215 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "XML-RPC & JSON/JSONPath" PROJECT_NUMBER = "2.8 Stable" PROJECT_LOGO = "../GeniviaLogo2_trans_noslogan.png" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../samples/xml-rpc-json/README.md ../../samples/xml-rpc-json/xml-rpc.h ../../samples/xml-rpc-json/xml-rpc-iters.h ../../samples/xml-rpc-json/json.h FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = ../doxygen_header.html HTML_FOOTER = ../doxygen_footer.html HTML_STYLESHEET = HTML_EXTRA_STYLESHEET = ../genivia_content.css ../genivia_tabs.css HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /opt/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.91/gsoap/doc/wsse-lite/0000755000175000017500000000000013525564137016071 5ustar ellertellertgsoap-2.8.91/gsoap/doc/wsse-lite/Doxyfile0000644000175000017500000002324313525245161017574 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "WS-Security Lite" PROJECT_NUMBER = "2.8 Stable" PROJECT_LOGO = "../GeniviaLogo2_trans_noslogan.png" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../plugin/wsseapi-lite.h ../../plugin/wsseapi-lite.c ../../import/wsse.h FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = ../doxygen_header.html HTML_FOOTER = ../doxygen_footer.html HTML_STYLESHEET = HTML_EXTRA_STYLESHEET = ../genivia_content.css ../genivia_tabs.css HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /opt/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.91/gsoap/doc/doxygen_header.html0000644000175000017500000000240513525245160020021 0ustar ellertellert Genivia - $title
  Genivia Home Documentation
$title

updated $date by Robert van Engelen
 
gsoap-2.8.91/gsoap/samples/0000755000175000017500000000000013525245205015044 5ustar ellertellertgsoap-2.8.91/gsoap/samples/dime/0000755000175000017500000000000013525245172015765 5ustar ellertellertgsoap-2.8.91/gsoap/samples/dime/.deps/0000755000175000017500000000000013525245172016776 5ustar ellertellertgsoap-2.8.91/gsoap/samples/dime/Makefile.in0000644000175000017500000005152113525245172020036 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = dimeclient$(EXEEXT) dimeserver$(EXEEXT) subdir = gsoap/samples/dime ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am_dimeclient_OBJECTS = dimeclient.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) dimeclient_OBJECTS = $(am_dimeclient_OBJECTS) am__DEPENDENCIES_1 = dimeclient_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) am__objects_4 = soapServer.$(OBJEXT) $(am__objects_2) am_dimeserver_OBJECTS = dimeserver.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) dimeserver_OBJECTS = $(am_dimeserver_OBJECTS) dimeserver_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/dimeclient.Po \ ./$(DEPDIR)/dimeserver.Po ./$(DEPDIR)/soapC.Po \ ./$(DEPDIR)/soapClient.Po ./$(DEPDIR)/soapServer.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(dimeclient_SOURCES) $(dimeserver_SOURCES) DIST_SOURCES = $(dimeclient_SOURCES) $(dimeserver_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.cpp_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = dime.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = dime.nsmap dime.wsdl dimeclient_SOURCES = dimeclient.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) dimeclient_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) dimeserver_SOURCES = dimeserver.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) dimeserver_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/dime/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/dime/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) dimeclient$(EXEEXT): $(dimeclient_OBJECTS) $(dimeclient_DEPENDENCIES) $(EXTRA_dimeclient_DEPENDENCIES) @rm -f dimeclient$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(dimeclient_OBJECTS) $(dimeclient_LDADD) $(LIBS) dimeserver$(EXEEXT): $(dimeserver_OBJECTS) $(dimeserver_DEPENDENCIES) $(EXTRA_dimeserver_DEPENDENCIES) @rm -f dimeserver$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(dimeserver_OBJECTS) $(dimeserver_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dimeclient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dimeserver.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/dimeclient.Po -rm -f ./$(DEPDIR)/dimeserver.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/dimeclient.Po -rm -f ./$(DEPDIR)/dimeserver.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/dime/dimeserver.cpp0000644000175000017500000004076213525245162020646 0ustar ellertellert/* dimeserver.cpp Example streaming DIME server. Supports three methods: putData stores multiple data sets on the server and returns named keys to each data set. The keys are unique and provide access to the data. Once data is stored, it cannot be removed. getData retrieves data sets given a set of named keys. getImage is an example file-based image retrieval method Data is stored in the current directory or the directory specified by the TMPDIR environment variable. Runs as CGI (not multi-threaded) or multi-threaded stand-alone Web service Copyright (C) 2000-2003 Robert A. van Engelen, Genivia, Inc. All Rights Reserved. NOTE: THE SERVER WILL ONLY SEND FILES THAT ARE IN THE CURRENT DIR FOR SECURITY REASONS. HOWEVER, THE AUTHOR IS NOT RESPONSIBLE FOR ANY DAMAGES THAT MAY RESULT FROM THE USE OF THIS PROGRAM. Usage: For stand-alone Web service functionality, run from the command line with port number as command line argument, e.g. > dimeserver 8085 & Use port 80 to run as HTTP Web server accessible over the Web Change the 'endpoint' in 'dimeclient.cpp' to endpoint="http://machine:8085" where 'machine' is the host name of the machine on which the service runs, or 'localhost' if the server runs on the same machine. Be careful to run the client in a separate directory from the server. Otherwise, the client and server may interfere in their file access. The service is multi-threaded. Multi-threading is not required, but can improve QoS. Remove the pthread code to obtain a non-multi-threaded service. Unix/Linux: add a sigpipe handler to avoid broken pipes with stand-alone server. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "dime.nsmap" #include // use fstat() for streaming DIME #include #include #ifdef _POSIX_THREADS #include // use Pthreads #endif #define BACKLOG (100) // max request backlog #define MAX_FILE_SIZE (10000) // max file size when buffering file for HTTP 1.0 and file size cannot be determined //////////////////////////////////////////////////////////////////////////////// // // Forward decls // //////////////////////////////////////////////////////////////////////////////// static void *process_request(void*); static int getdata(struct soap*, const char*, ns__Data&); static void saveData(ns__Data&, const char*); static void sigpipe_handle(int); //////////////////////////////////////////////////////////////////////////////// // // Streaming DIME attachment content handlers // //////////////////////////////////////////////////////////////////////////////// static void *dime_read_open(struct soap*, void*, const char*, const char*, const char*); static void dime_read_close(struct soap*, void*); static size_t dime_read(struct soap*, void*, char*, size_t); static void *dime_write_open(struct soap*, const char*, const char*, const char*); static void dime_write_close(struct soap*, void*); static int dime_write(struct soap*, void*, const char*, size_t); //////////////////////////////////////////////////////////////////////////////// // // Data for streaming DIME write handler // //////////////////////////////////////////////////////////////////////////////// struct dime_write_handle { char *name; // file name FILE *fd; // file fd }; //////////////////////////////////////////////////////////////////////////////// // // Static data // //////////////////////////////////////////////////////////////////////////////// static const char *TMPDIR = "."; //////////////////////////////////////////////////////////////////////////////// // // Main // //////////////////////////////////////////////////////////////////////////////// int main(int argc, char **argv) { struct soap soap; char *s = getenv("TMPDIR"); if (s) TMPDIR = s; // use HTTP chunking when possible // chunking allows streaming of DIME content without requiring DIME attachment size to be set // DIME attachments can be streamed without chunking only if the attachment size is set soap_init1(&soap, SOAP_IO_KEEPALIVE | SOAP_IO_CHUNK); // set DIME callbacks soap.fdimereadopen = dime_read_open; soap.fdimereadclose = dime_read_close; soap.fdimeread = dime_read; soap.fdimewriteopen = dime_write_open; soap.fdimewriteclose = dime_write_close; soap.fdimewrite = dime_write; if (argc < 2) { // no args: assume this is a CGI application // serve request soap_serve(&soap); // cleanup class instances soap_destroy(&soap); // cleanup soap_end(&soap); } else { #ifdef _POSIX_THREADS pthread_t tid; #endif struct soap *tsoap; int port; int m, s, i; // Unix SIGPIPE, this is OS dependent: // soap.accept_flags = SO_NOSIGPIPE; // some systems like this // soap.socket_flags = MSG_NOSIGNAL; // others need this // signal(SIGPIPE, sigpipe_handle); // or a sigpipe handler (portable) // port is first command line argument port = atoi(argv[1]); // bind to current host and specified port m = soap_bind(&soap, NULL, port, BACKLOG); // if we could not bind, exit if (m < 0) { soap_print_fault(&soap, stderr); exit(1); } fprintf(stderr, "Socket connection successful %d\n", m); // die after 24 hrs waiting for activity on port soap.accept_timeout = 24*60*60; // IO timeouts soap.send_timeout = 30; soap.recv_timeout = 30; // loop through requests for (i = 1; ; i++) { // accept request s = soap_accept(&soap); // if timeout or error, report if (s < 0) { if (soap.errnum) soap_print_fault(&soap, stderr); else fprintf(stderr, "Server timed out\n"); break; } fprintf(stderr, "Thread %d accepts socket %d connection from IP %d.%d.%d.%d\n", i, s, (int)(soap.ip>>24)&0xFF, (int)(soap.ip>>16)&0xFF, (int)(soap.ip>>8)&0xFF, (int)soap.ip&0xFF); // copy soap environment and spawn thread (if Pthreads is installed) tsoap = soap_copy(&soap); #ifdef _POSIX_THREADS while (pthread_create(&tid, NULL, (void*(*)(void*))process_request, (void*)tsoap)) sleep(1); #else process_request((void*)tsoap); #endif } } soap_destroy(&soap); soap_end(&soap); soap_done(&soap); return 0; } void *process_request(void *soap) { #ifdef _POSIX_THREADS pthread_detach(pthread_self()); #endif // serve request (or multiple requests with keep-alive enabled) soap_serve((struct soap*)soap); // cleanup class instances soap_destroy((struct soap*)soap); // cleanup soap_end((struct soap*)soap); // detach and free thread's copy of soap environment soap_free((struct soap*)soap); return NULL; } //////////////////////////////////////////////////////////////////////////////// // // Server methods // //////////////////////////////////////////////////////////////////////////////// int ns__putData(struct soap *soap, arrayOfData *data, arrayOfName *names) { // gSOAP switches to SOAP_IO_STORE when SOAP_IO_CHUNK (HTTP chunking) is not supported by the client // Since it is undesirable to use SOAP_IO_STORE with streaming, we reset it to SOAP_IO_BUFFER if ((soap->omode & SOAP_IO) == SOAP_IO_STORE) soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_BUFFER; // return name (key) for each data item names->resize(data->size()); for (int i = 0; i < data->size(); i++) { char *s, *name; // the id field is set when DIME was used so the dime_write callbacks already saved the file if ((*data)[i].id) { assert((*data)[i].__ptr); name = ((struct dime_write_handle*)(*data)[i].__ptr)->name; } else { name = tempnam(TMPDIR, "data"); fprintf(stderr, "Saving file %s\n", name); saveData((*data)[i], name); } s = strrchr(name, '/'); if (!s) s = strrchr(name, '\\'); if (!s) s = name; else s++; (*names)[i] = soap_strdup(soap, s); if (!(*data)[i].id) { // free data alloced with tempnam() free(name); } } return SOAP_OK; } int ns__getData(struct soap *soap, arrayOfName *names, arrayOfData *data) { // gSOAP switches to SOAP_IO_STORE when SOAP_IO_CHUNK (HTTP chunking) is not supported by the client. // Since it is undesirable to use SOAP_IO_STORE, we reset it to SOAP_IO_BUFFER if ((soap->omode & SOAP_IO) == SOAP_IO_STORE) soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_BUFFER; if (!names) return soap_sender_fault(soap, "Names required", NULL); data->resize(names->size()); for (int i = 0; i < names->__size; i++) { if (!(*names)[i]) return soap_sender_fault(soap, "Name required", NULL); if (getdata(soap, (*names)[i], (*data)[i])) return soap_sender_fault(soap, "Access denied", NULL); } return SOAP_OK; } int ns__getImage(struct soap *soap, char *name, ns__Data& image) { if (!name) return soap_sender_fault(soap, "Name required", NULL); if (getdata(soap, name, image)) return soap_sender_fault(soap, "Access denied", NULL); image.type = (char*)"image/jpeg"; image.options = soap_dime_option(soap, 0, name); return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // Helper functions // //////////////////////////////////////////////////////////////////////////////// static int getdata(struct soap *soap, const char *name, ns__Data& data) { struct stat sb; FILE *fd = NULL; if (name && !strchr(name, '/') && !strchr(name, '\\') && !strchr(name, ':')) { char *s = (char*)soap_malloc(soap, strlen(TMPDIR) + strlen(name) + 2); strcpy(s, TMPDIR); strcat(s, "/"); strcat(s, name); fd = fopen(s, "rb"); if (!fd) { strcpy(s, name); fd = fopen(s, "rb"); } } if (!fd) return SOAP_EOF; if ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK) // chunked response is possible { data.__ptr = (unsigned char*)fd; // must set to non-NULL (this is our fd handle which we need in the callbacks) data.__size = 0; // zero size streams data with HTTP chunking } else if (!fstat(fileno(fd), &sb) && sb.st_size > 0) { // since we can get the length of the file, we can stream it data.__ptr = (unsigned char*)fd; // must set to non-NULL (this is our fd handle which we need in the callbacks) data.__size = sb.st_size; } else // we can't use HTTP chunking and we don't know the size, so buffer it { int i; data.__ptr = (unsigned char*)soap_malloc(soap, MAX_FILE_SIZE); for (i = 0; i < MAX_FILE_SIZE; i++) { int c; if ((c = fgetc(fd)) == EOF) break; data.__ptr[i] = c; } fclose(fd); data.__size = i; } data.type = (char*)""; // specify non-NULL id or type to enable DIME data.options = soap_dime_option(soap, 0, name); return SOAP_OK; } static void saveData(ns__Data& data, const char *name) { char *buf = (char*)data.__ptr; int len = data.__size; FILE *fd = fopen(name, "wb"); if (!fd) { fprintf(stderr, "Cannot save file %s\n", name); return; } while (len) { size_t nwritten = fwrite(buf, 1, len, fd); if (!nwritten) { fprintf(stderr, "Cannot write to %s\n", name); return; } len -= nwritten; buf += nwritten; } fclose(fd); } static void sigpipe_handle(int x) { } //////////////////////////////////////////////////////////////////////////////// // // Streaming DIME attachment content handlers // //////////////////////////////////////////////////////////////////////////////// static void *dime_read_open(struct soap *soap, void *handle, const char *id, const char *type, const char *options) { // we should return NULL without setting soap->error if we don't want to use the streaming callback for this DIME attachment. The handle contains the non-NULL __ptr field value which should have been set in the application. // return value of this function will be passed on to the fdimeread and fdimereadclose callbacks. The return value will not affect the __ptr field. return handle; } static void dime_read_close(struct soap *soap, void *handle) { fclose((FILE*)handle); } static size_t dime_read(struct soap *soap, void *handle, char *buf, size_t len) { return fread(buf, 1, len, (FILE*)handle); } static void *dime_write_open(struct soap *soap, const char *id, const char *type, const char *options) { // we can return NULL without setting soap->error if we don't want to use the streaming callback for this DIME attachment struct dime_write_handle *handle = (struct dime_write_handle*)soap_malloc(soap, sizeof(struct dime_write_handle)); if (!handle) { soap->error = SOAP_EOM; return NULL; } char *name = tempnam(TMPDIR, "data"); fprintf(stderr, "Saving file %s\n", name); handle->name = soap_strdup(soap, name); free(name); handle->fd = fopen(handle->name, "wb"); if (!handle->fd) { soap->error = SOAP_EOF; // could not open file for writing soap->errnum = errno; // get reason return NULL; } return (void*)handle; } static void dime_write_close(struct soap *soap, void *handle) { fclose(((struct dime_write_handle*)handle)->fd); } static int dime_write(struct soap *soap, void *handle, const char *buf, size_t len) { while (len) { size_t nwritten = fwrite(buf, 1, len, ((struct dime_write_handle*)handle)->fd); if (!nwritten) { soap->errnum = errno; // get reason return SOAP_EOF; } len -= nwritten; buf += nwritten; } return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // ns__Data class // //////////////////////////////////////////////////////////////////////////////// ns__Data::ns__Data() { __ptr = NULL; __size = 0; id = NULL; type = NULL; options = NULL; soap = NULL; } //////////////////////////////////////////////////////////////////////////////// // // arrayOfData class // //////////////////////////////////////////////////////////////////////////////// arrayOfData::arrayOfData() { __ptr = NULL; __size = 0; soap = NULL; } arrayOfData::arrayOfData(struct soap *soap, int n) { __ptr = NULL; __size = 0; this->soap = soap; resize(n); } arrayOfData::~arrayOfData() { resize(0); } int arrayOfData::size() { return __size; } void arrayOfData::resize(int n) { if (__ptr) { if (soap) // if created by soap environment soap_delete(soap, __ptr); // then delete else delete[] __ptr; } __size = n; if (n <= 0) __ptr = NULL; else if (soap) __ptr = soap_new_ns__Data(soap, n); else __ptr = new ns__Data[n]; } ns__Data& arrayOfData::operator[](int i) const { assert(__ptr && i >= 0 && i < __size); return __ptr[i]; } //////////////////////////////////////////////////////////////////////////////// // // arrayOfName class // //////////////////////////////////////////////////////////////////////////////// arrayOfName::arrayOfName() { __ptr = NULL; __size = 0; soap = NULL; } arrayOfName::arrayOfName(struct soap *soap, int n) { __ptr = NULL; __size = 0; this->soap = soap; resize(n); } arrayOfName::~arrayOfName() { resize(0); } int arrayOfName::size() { return __size; } void arrayOfName::resize(int n) { if (__ptr) { if (soap) // if created by soap environment soap_delete(soap, __ptr); // then delete else free(__ptr); } __size = n; if (n <= 0) __ptr = NULL; else { if (soap) __ptr = (char**)soap_malloc(soap, sizeof(char*) * n); else __ptr = (char**)malloc(sizeof(char*) * n); memset(__ptr, 0, n); } } char*& arrayOfName::operator[](int i) const { assert(__ptr && i >= 0 && i < __size); return __ptr[i]; } gsoap-2.8.91/gsoap/samples/dime/README.txt0000644000175000017500000000264613525245162017472 0ustar ellertellertExample DIME attachment processing. Note: DIME attachments are deprecated in favor of MTOM attachments. This demo illustrates streaming DIME attachments. DIME is an efficient binary attachment format. DIME has been deprecated by the DIME authors in favor of MTOM MIME-based attachments. Client and server examples are included. Both use streaming DIME attachment processing using data handlers. The service implements three streaming operations: putData stores multiple data sets on the server and returns named references to each data set getData retrieves data sets given named references. getImage is an example file-based image retrieval method Usage (server side): For stand-alone Web service functionality, run from the command line with port number as command line argument: dimeserver 8085 & Usage (client side): dimeclient dimeclient name dimeclient [-p] [-g] name ... dimeclient Without args retrieves image.jpg dimeclient name Retrieves image stored under name dimeclient -p name1 name2 ... Stores files name1, name2, etc. The storage keys are printed. The keys provide access to the data on the server. dimeclient -g name1 name2 ... Retrieves files stored under keys name1, name2, etc. The keys must correspond to the keys returned when storing files. Files are stored locally under the key name. All files are stored and retrieved in the current directory. gsoap-2.8.91/gsoap/samples/dime/Makefile.am0000644000175000017500000000121613525245162020020 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = dimeclient dimeserver SOAPHEADER = dime.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = dime.nsmap dime.wsdl dimeclient_SOURCES = dimeclient.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) dimeclient_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) dimeserver_SOURCES = dimeserver.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) dimeserver_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread gsoap-2.8.91/gsoap/samples/dime/dimeclient.cpp0000644000175000017500000003030613525245162020607 0ustar ellertellert/* dimeclient.cpp Example streaming DIME client for DIME server (dimeserver.cpp). Supports three methods: putData stores multiple data sets on the server and returns named references to each data set getData retrieves data sets given named references. getImage is an example file-based image retrieval method Change the endpoint in dime.h to your needs. Copyright (C) 2000-2003 Robert A. van Engelen, Genivia, Inc. All Rights Reserved. Usage (server): Start dimeserver on your host at port 8085 (see dimeserver.cpp): dimeserver 8085 & Usage (client): dimeclient dimeclient name dimeclient [-p] [-g] name ... dimeclient Without args retrieves image.jpg dimeclient name Retrieves image stored under name dimeclient -p name1 name2 ... Stores files name1, name2, etc. The storage keys are printed. The keys provide access to the data on the server. dimeclient -g name1 name2 ... Retrieves files stored under keys name1, name2, etc. The keys must correspond to the keys returned when storing files. Files are stored locally under the key name. Unix/Linux: add a sigpipe handler to avoid broken pipes. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "dime.nsmap" #include // use the default endpoint set in dime.h for demo: const char *endpoint = NULL; // use the localhost for -p and -g (put and get): const char *localhost = "http://localhost:8085"; //////////////////////////////////////////////////////////////////////////////// // // Forward decls // //////////////////////////////////////////////////////////////////////////////// static void putData(struct soap*, int, char**); static void getData(struct soap*, int, char**); static void getImage(struct soap*, char*); static void saveData(ns__Data&, const char*); //////////////////////////////////////////////////////////////////////////////// // // Streaming DIME attachment content handlers // //////////////////////////////////////////////////////////////////////////////// static void *dime_read_open(struct soap*, void*, const char*, const char*, const char*); static void dime_read_close(struct soap*, void*); static size_t dime_read(struct soap*, void*, char*, size_t); static void *dime_write_open(struct soap*, const char*, const char*, const char*); static void dime_write_close(struct soap*, void*); static int dime_write(struct soap*, void*, const char*, size_t); //////////////////////////////////////////////////////////////////////////////// // // Main // //////////////////////////////////////////////////////////////////////////////// int main(int argc, char **argv) { struct soap soap; // use HTTP 1.1 chunking // HTTP chunking allows streaming of DIME content without requiring DIME attachment size to be set // DIME attachments can be streamed without chunking ONLY if the attachment size is set soap_init1(&soap, SOAP_IO_CHUNK); // set DIME callbacks soap.fdimereadopen = dime_read_open; soap.fdimereadclose = dime_read_close; soap.fdimeread = dime_read; soap.fdimewriteopen = dime_write_open; soap.fdimewriteclose = dime_write_close; soap.fdimewrite = dime_write; // connect timeout value (not supported by Linux) soap.connect_timeout = 10; // IO timeouts soap.send_timeout = 5; soap.recv_timeout = 5; soap.transfer_timeout = 30; // Unix/Linux SIGPIPE, this is OS dependent: // soap.accept_flags = SO_NOSIGPIPE; // some systems like this // soap.socket_flags = MSG_NOSIGNAL; // others need this // signal(SIGPIPE, sigpipe_handle); // or a sigpipe handler (portable) if (argc < 3) { char *name; if (argc < 2) name = (char*)"image.jpg"; else name = argv[1]; getImage(&soap, name); } else { switch (argv[1][1]) { case 'p': endpoint = localhost; putData(&soap, argc, argv); break; case 'g': endpoint = localhost; getData(&soap, argc, argv); break; default: fprintf(stderr, "Usage: [-p] [-g] name ...\n"); exit(0); } } soap_destroy(&soap); soap_end(&soap); soap_done(&soap); return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // Helper functions // //////////////////////////////////////////////////////////////////////////////// static void putData(struct soap *soap, int argc, char **argv) { arrayOfData data; arrayOfName names; data.resize(argc - 2); for (int i = 2; i < argc; i++) { data[i - 2].__ptr = (unsigned char*)argv[i]; // MUST set id or type to enable DIME // zero size indicates streaming DIME (this requires HTTP chunking) data[i - 2].type = (char*)""; } if (soap_call_ns__putData(soap, endpoint, NULL, &data, &names)) soap_print_fault(soap, stderr); else { printf("Data stored with keys:\n"); for (int j = 0; j < names.size(); j++) printf("\t%s\n", names[j]); printf("Use these keys to retrieve the data\n"); } } static void getData(struct soap *soap, int argc, char **argv) { arrayOfData data; arrayOfName names; names.resize(argc - 2); for (int i = 2; i < argc; i++) names[i - 2] = argv[i]; soap->user = (void*)names.__ptr; if (soap_call_ns__getData(soap, endpoint, NULL, &names, &data)) soap_print_fault(soap, stderr); else { for (int j = 0; j < data.size(); j++) if (!data[j].id) saveData(data[j], argv[j + 2]); printf("Data retrieved\n"); } } static void getImage(struct soap *soap, char *name) { ns__Data image; arrayOfName temp; temp.resize(1); temp[0] = name; soap->user = (void*)temp.__ptr; if (soap_call_ns__getImage(soap, endpoint, NULL, name, image)) soap_print_fault(soap, stderr); else if (image.id) { if (image.__size) printf("Got image %s size=%d type=%s through streaming DIME\n", name, image.__size, image.type?image.type:""); else printf("Got image %s type=%s through chunked streaming DIME\n", name, image.type?image.type:""); } else { printf("Got image %s\n", name); saveData(image, name); } } static void saveData(ns__Data& data, const char *name) { char *buf = (char*)data.__ptr; int len = data.__size; FILE *fd = fopen(name, "wb"); if (!fd) { fprintf(stderr, "Cannot save file %s\n", name); return; } while (len) { size_t nwritten = fwrite(buf, 1, len, fd); if (!nwritten) { fprintf(stderr, "Cannot write to %s\n", name); return; } len -= nwritten; buf += nwritten; } printf("Saved file %s\n", name); } //////////////////////////////////////////////////////////////////////////////// // // Streaming DIME attachment content handlers // //////////////////////////////////////////////////////////////////////////////// static void *dime_read_open(struct soap *soap, void *handle, const char *id, const char *type, const char *options) { FILE *fd; (void)soap; (void)id; (void)type; (void)options; // we should return NULL without setting soap->error if we don't want to use the streaming callback for this DIME attachment. The handle contains the non-NULL __ptr field value which should have been set in the application. // return value of this function will be passed on to the fdimeread and fdimereadclose callbacks. The return value will not affect the __ptr field. fd = fopen((char*)handle, "rb"); return (void*)fd; } static void dime_read_close(struct soap *soap, void *handle) { (void)soap; fclose((FILE*)handle); } static size_t dime_read(struct soap *soap, void *handle, char *buf, size_t len) { (void)soap; return fread(buf, 1, len, (FILE*)handle); } static void *dime_write_open(struct soap *soap, const char *id, const char *type, const char *options) { // we can return NULL without setting soap->error if we don't want to use the streaming callback for this DIME attachment FILE *handle = NULL; char *name; (void)id; (void)type; // get file name from options (here we assume it's not '\0' terminated), but the gsoap engine adds NULs to DIME options after reading content if (options) { size_t len = ((unsigned char)options[2] << 8) | ((unsigned char)options[3]); // option string length name = (char*)soap_malloc(soap, len + 1); strncpy(name, options + 4, len); name[len] = '\0'; handle = fopen(name, "wb"); if (!handle) { soap->error = SOAP_EOF; // could not open file for writing soap->errnum = errno; // get reason return NULL; } } else soap->error = soap_receiver_fault(soap, "Cannot save to file, because no file name was present in attachment", NULL); return (void*)handle; } static void dime_write_close(struct soap *soap, void *handle) { (void)soap; fclose((FILE*)handle); } static int dime_write(struct soap *soap, void *handle, const char *buf, size_t len) { while (len) { size_t nwritten = fwrite(buf, 1, len, (FILE*)handle); if (!nwritten) { soap->errnum = errno; // get reason return SOAP_EOF; } len -= nwritten; buf += nwritten; } return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // ns__Data class // //////////////////////////////////////////////////////////////////////////////// ns__Data::ns__Data() { __ptr = NULL; __size = 0; id = NULL; type = NULL; options = NULL; soap = NULL; } //////////////////////////////////////////////////////////////////////////////// // // arrayOfData class // //////////////////////////////////////////////////////////////////////////////// arrayOfData::arrayOfData() { __ptr = NULL; __size = 0; soap = NULL; } arrayOfData::arrayOfData(struct soap *soap, int n) { __ptr = NULL; __size = 0; this->soap = soap; resize(n); } arrayOfData::~arrayOfData() { resize(0); } int arrayOfData::size() { return __size; } void arrayOfData::resize(int n) { if (__ptr) { if (soap) // if created by soap environment soap_delete(soap, __ptr); // then delete else delete[] __ptr; } __size = n; if (n <= 0) __ptr = NULL; else if (soap) __ptr = soap_new_ns__Data(soap, n); else __ptr = new ns__Data[n]; } ns__Data& arrayOfData::operator[](int i) const { assert(__ptr && i >= 0 && i < __size); return __ptr[i]; } //////////////////////////////////////////////////////////////////////////////// // // arrayOfName class // //////////////////////////////////////////////////////////////////////////////// arrayOfName::arrayOfName() { __ptr = NULL; __size = 0; soap = NULL; } arrayOfName::arrayOfName(struct soap *soap, int n) { __ptr = NULL; __size = 0; this->soap = soap; resize(n); } arrayOfName::~arrayOfName() { resize(0); } int arrayOfName::size() { return __size; } void arrayOfName::resize(int n) { if (__ptr) { if (soap) // if created by soap environment soap_delete(soap, __ptr); // then delete else free(__ptr); } __size = n; if (n <= 0) __ptr = NULL; else { if (soap) __ptr = (char**)soap_malloc(soap, sizeof(char*) * n); else __ptr = (char**)malloc(sizeof(char*) * n); memset(__ptr, 0, n); } } char*& arrayOfName::operator[](int i) const { assert(__ptr && i >= 0 && i < __size); return __ptr[i]; } gsoap-2.8.91/gsoap/samples/dime/dime.h0000644000175000017500000000530113525245162017052 0ustar ellertellert/* -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: dime //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/dime.wsdl //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/dimesrv.cgi //gsoap ns schema namespace: urn:dime //gsoap ns schema type-documentation: Data contains DIME attachment data class ns__Data { unsigned char *__ptr; /* points to data */ int __size; /* size of data */ char *id; /* dime attachment ID (set to NULL to obtain unique cid) */ char *type; /* dime attachment content type */ char *options; /* dime attachment options (optional) */ ns__Data(); struct soap *soap; /* soap context that created this instance */ }; class arrayOfData /* SOAP array of data */ { ns__Data *__ptr; int __size; arrayOfData(); arrayOfData(struct soap*, int); virtual ~arrayOfData(); int size(); void resize(int); ns__Data& operator[](int) const; struct soap *soap; }; class arrayOfName /* SOAP array of strings */ { char **__ptr; int __size; arrayOfName(); arrayOfName(struct soap*, int); virtual ~arrayOfName(); int size(); void resize(int); char*& operator[](int) const; struct soap *soap; }; int ns__putData(arrayOfData *data, arrayOfName *names); int ns__getData(arrayOfName *names, arrayOfData *data); int ns__getImage(char *name, ns__Data &image); gsoap-2.8.91/gsoap/samples/udp/0000755000175000017500000000000013525245202015631 5ustar ellertellertgsoap-2.8.91/gsoap/samples/udp/.deps/0000755000175000017500000000000013525245202016642 5ustar ellertellertgsoap-2.8.91/gsoap/samples/udp/.deps/stdsoap2.Po0000644000175000017500000000001013525245163020676 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/samples/udp/udp.wsdl0000644000175000017500000001177513525245163017335 0ustar ellertellert Demo (anonymous) request-response MEP over UDP Demo one-way MEP over UDP gSOAP 2.8.91 generated service definition gsoap-2.8.91/gsoap/samples/udp/Makefile.in0000644000175000017500000005013413525245163017707 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = udpclient$(EXEEXT) udpserver$(EXEEXT) subdir = gsoap/samples/udp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am_udpclient_OBJECTS = udpclient.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) udpclient_OBJECTS = $(am_udpclient_OBJECTS) udpclient_LDADD = $(LDADD) am__DEPENDENCIES_1 = udpclient_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) am__objects_4 = soapServer.$(OBJEXT) $(am__objects_2) am_udpserver_OBJECTS = udpserver.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) udpserver_OBJECTS = $(am_udpserver_OBJECTS) udpserver_LDADD = $(LDADD) udpserver_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/soapC.Po ./$(DEPDIR)/soapClient.Po \ ./$(DEPDIR)/soapServer.Po ./$(DEPDIR)/udpclient.Po \ ./$(DEPDIR)/udpserver.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(udpclient_SOURCES) $(udpserver_SOURCES) DIST_SOURCES = $(udpclient_SOURCES) $(udpserver_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.c_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = udp.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = udp.nsmap udpclient_SOURCES = udpclient.c $(SOAPHEADER) $(SOAP_C_CLIENT) udpserver_SOURCES = udpserver.c $(SOAPHEADER) $(SOAP_C_SERVER) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/udp/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/udp/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) udpclient$(EXEEXT): $(udpclient_OBJECTS) $(udpclient_DEPENDENCIES) $(EXTRA_udpclient_DEPENDENCIES) @rm -f udpclient$(EXEEXT) $(AM_V_CCLD)$(LINK) $(udpclient_OBJECTS) $(udpclient_LDADD) $(LIBS) udpserver$(EXEEXT): $(udpserver_OBJECTS) $(udpserver_DEPENDENCIES) $(EXTRA_udpserver_DEPENDENCIES) @rm -f udpserver$(EXEEXT) $(AM_V_CCLD)$(LINK) $(udpserver_OBJECTS) $(udpserver_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/udpclient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/udpserver.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f ./$(DEPDIR)/udpclient.Po -rm -f ./$(DEPDIR)/udpserver.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f ./$(DEPDIR)/udpclient.Po -rm -f ./$(DEPDIR)/udpserver.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/udp/udpclient.c0000644000175000017500000000727113525245163020001 0ustar ellertellert/* udpclient.c SOAP-over-UDP demo client with zlib compression and WS-Addressing -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "udp.nsmap" #define SERVER "soap.udp://localhost:10000" int main(int argc, char **argv) { struct soap soap; struct SOAP_ENV__Header header; struct wsa__EndpointReferenceType replyTo; char *res; char *mid1 = "id1"; char *mid2 = "id2"; if (argc > 1) mid1 = argv[1]; if (argc > 2) mid2 = argv[2]; soap_init(&soap); soap.send_timeout = 1; soap.recv_timeout = 1; /* To compress the request message (compile with -DWITH_GZIP): */ #ifdef WITH_GZIP soap_set_omode(&soap, SOAP_ENC_ZLIB); #endif /* To transmit MIME attachments: soap_set_mime(&soap, NULL, NULL); soap_set_mime_attachment(&soap, "abc", 3, SOAP_MIME_7BIT, "text/xml", "cid:abc", NULL, NULL); */ /* To transmit DIME attachments: soap_set_dime(&soap); soap_set_dime_attachment(&soap, "abc", 3, "cid:abc", "text/xml", 0, NULL); */ /* Prepare SOAP Header */ soap_default_SOAP_ENV__Header(&soap, &header); soap.header = &header; soap_default_wsa__EndpointReferenceType(&soap, &replyTo); replyTo.Address = "http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous"; /* Set WS-Addressing elements for request-response unicast */ header.wsa__MessageID = mid1; /* or use soap_wsa_rand_uuid(soap) for UUID */ header.wsa__To = "http://genivia.com/udp/server"; header.wsa__Action = "http://genivia.com/udp/echoString"; header.wsa__ReplyTo = &replyTo; /* Make request-response call */ if (soap_call_ns__echoString(&soap, SERVER, NULL, "hello world!", &res)) { if (soap.error == SOAP_EOF && soap.errnum == 0) printf("Timeout: message probably already delivered\n"); else soap_print_fault(&soap, stderr); } else printf("UDP server response: %s\n", res); /* Reset the SOAP Header */ soap_default_SOAP_ENV__Header(&soap, &header); soap.header = &header; /* Set WS-Addressing elements for one-way unicast */ header.wsa__MessageID = mid2; /* or use soap_wsa_rand_uuid(soap) for UUID */ header.wsa__To = "http://genivia.com/udp/server"; header.wsa__Action = "http://genivia.com/udp/sendString"; /* Send one-way message */ if (soap_send_ns__sendString(&soap, NULL, NULL, "hello world!")) soap_print_fault(&soap, stderr); soap_destroy(&soap); soap_end(&soap); soap_done(&soap); return 0; } gsoap-2.8.91/gsoap/samples/udp/udp.h0000644000175000017500000001044713525245163016606 0ustar ellertellert/* udp.h SOAP-over-UDP demo specification for udpclient and udpserver examples Requires WS-Addressing from import/wsa.h -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //////////////////////////////////////////////////////////////////////////////// // // Import WS-Addressing // //////////////////////////////////////////////////////////////////////////////// //gsoap wsa schema import: http://schemas.xmlsoap.org/ws/2004/08/addressing #import "wsa.h" // wsa.h is in the import directory //////////////////////////////////////////////////////////////////////////////// // // Demo UDP service // //////////////////////////////////////////////////////////////////////////////// //gsoap ns service name: udp //gsoap ns service namespace: urn:gsoap-udp-demo //gsoap ns service location: soap.udp://localhost:10000 // I would have assumed UDP transport to be defined in the WSDL bindings, // but this doesn't appear to be possible, so we will use the default HTTP // transport binding and omit the transport directive below. // ---> //gsoap ns service transport: ... ??? //////////////////////////////////////////////////////////////////////////////// // // SOAP-over-UDP SOAP Headers with WS-Addressing // //////////////////////////////////////////////////////////////////////////////// struct SOAP_ENV__Header { mustUnderstand _wsa__MessageID wsa__MessageID 0; ///< WS-Addressing mustUnderstand _wsa__RelatesTo *wsa__RelatesTo 0; ///< WS-Addressing mustUnderstand _wsa__From *wsa__From 0; ///< WS-Addressing mustUnderstand _wsa__ReplyTo *wsa__ReplyTo 0; ///< WS-Addressing mustUnderstand _wsa__FaultTo *wsa__FaultTo 0; ///< WS-Addressing mustUnderstand _wsa__To wsa__To 0; ///< WS-Addressing mustUnderstand _wsa__Action wsa__Action 0; ///< WS-Addressing }; //////////////////////////////////////////////////////////////////////////////// // // echoString (anonymous) request-response MEP over UDP // //////////////////////////////////////////////////////////////////////////////// //gsoap ns service method-documentation: echoString Demo (anonymous) request-response MEP over UDP //gsoap ns service method-header-part: echoString wsa__MessageID //gsoap ns service method-header-part: echoString wsa__To //gsoap ns service method-header-part: echoString wsa__Action //gsoap ns service method-input-header-part: sendString wsa__ReplyTo //gsoap ns service method-output-header-part: echoString wsa__RelatesTo int ns__echoString(char *str, char **res); //////////////////////////////////////////////////////////////////////////////// // // sendString one-way MEP over UDP // //////////////////////////////////////////////////////////////////////////////// //gsoap ns service method-documentation: sendString Demo one-way MEP over UDP //gsoap ns service method-header-part: sendString wsa__MessageID //gsoap ns service method-header-part: sendString wsa__To //gsoap ns service method-header-part: sendString wsa__Action int ns__sendString(char *str, void); gsoap-2.8.91/gsoap/samples/udp/README.txt0000644000175000017500000002137513525245163017345 0ustar ellertellert SOAP-over-UDP Conformance ----------- The SOAP-over-UDP specification relies on WS-Addressing. The WS-Addressing.h file defines the WS-Addressing elements for client and server applications. The implementation conforms to the SOAP-over-UDP requirements: * SOAP-over-UDP server endpoint URL format: soap.udp://host:port/path * Support one-way message-exchange pattern (MEP) where a SOAP envelope is carried in a user datagram. * Support request-response message-exchange pattern (MEP) where SOAP envelopes are carried in user datagrams. * Support multicast transmission of SOAP envelopes carried in user datagrams. * Support both SOAP 1.1 and SOAP 1.2 envelopes. The SOAP-over-UDP specification can be found at: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnglobspec/html/soap-over-udp.asp Features -------- The following additional features are also available: * Zlib/gzip message compression (compile -DWITH_GZIP and link with -lgsoapssl). * SOAP with DIME attachments over UDP. * SOAP with MIME attachments (SwA) over UDP. * Support for IPv6 (compile -DWITH_IPV6) Message retransmission ---------------------- Retransmission is implemented using a retry and exponential back-off algorithm as per SOAP-over-UDP retransmission requirements, see SOAP-over-UDP Appendix I. Duplicate message detection --------------------------- The user is responsible for implementing a duplicate message detection algorithm, see SOAP-over-UDP Appendix II. An example algorithm is given in udpserver.c Closing the socket ------------------ The socket is not automatically closed. At the server side the socket should never be closed (its bound). At the client side the socket is closed with soap_done() or soap_free(). Or close the socket explicitly with soap_closesocket(soap.socket). Usage ----- * Header file: //gsoap wsa schema import: http://schemas.xmlsoap.org/ws/2004/08/addressing #import "was.h" struct SOAP_ENV__Header { mustUnderstand wsa__AttributedURI wsa__MessageID 0; mustUnderstand struct wsa__Relationship *wsa__RelatesTo 0; mustUnderstand struct wsa__EndpointReferenceType *wsa__From 0; mustUnderstand struct wsa__EndpointReferenceType *wsa__ReplyTo 0; mustUnderstand struct wsa__EndpointReferenceType *wsa__FaultTo 0; mustUnderstand struct wsa__EndpointReferenceType *wsa__Recipient 0; mustUnderstand wsa__AttributedURI wsa__To 0; mustUnderstand wsa__AttributedURI wsa__Action 0; }; ... your declarations go here (request-response and one-way) ... ... for example: int ns__echoString(char *str, char **res); int ns__sendString(char *str, void); int ns__sendStringResponse(char *res, void); * Client-side one-way unicast/multicast: struct soap soap; struct SOAP_ENV__Header header; soap_init(&soap); if (multicast) soap.connect_flags = SO_BROADCAST; soap.send_timeout = 1; // 1s timeout soap_default_SOAP_ENV__Header(&soap, &header); soap.header = &header; header.wsa__MessageID = ""; header.wsa__To = ""; header.wsa__Action = ""; if (soap_send_ns__echoString(&soap, "soap.udp://...", NULL, "hello world!")) soap_print_fault(&soap, stderr); soap_destroy(&soap); // cleanup soap_end(&soap); // cleanup soap_done(&soap); // close connection (should not use soap struct after this) * Client-side request-response unicast: struct soap soap; struct SOAP_ENV__Header header; struct wsa__EndpointReferenceType replyTo; char *res; soap_init(&soap); soap.send_timeout = 1; // 1s timeout soap.recv_timeout = 1; // 1s timeout soap_default_SOAP_ENV__Header(&soap, &header); soap.header = &header; soap_default_wsa__EndpointReferenceType(&soap, &replyTo); replyTo.Address = "http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous"; header.wsa__MessageID = ""; header.wsa__To = ""; header.wsa__Action = ""; header.wsa__ReplyTo = &replyTo; if (soap_call_ns__echoString(&soap, "soap.udp://...", NULL, "hello world!", &res)) { if (soap.error == SOAP_EOF && soap.errnum == 0) printf("Timeout: message probably already delivered\n"); else soap_print_fault(&soap, stderr); } else printf("UDP server response: %s\n", res); soap_destroy(&soap); // cleanup soap_end(&soap); // cleanup soap_done(&soap); // close connection (should not use soap struct after this) * Client-side request-response multicast: struct soap soap; struct SOAP_ENV__Header header; struct wsa__EndpointReferenceType replyTo; char *res; soap_init(&soap); soap.connect_flags = SO_BROADCAST; soap.send_timeout = 1; // 1s timeout soap.recv_timeout = 1; // 1s timeout soap_default_SOAP_ENV__Header(&soap, &header); soap.header = &header; soap_default_wsa__EndpointReferenceType(&soap, &replyTo); replyTo.Address = "http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous"; header.wsa__MessageID = ""; header.wsa__To = ""; header.wsa__Action = ""; header.wsa__ReplyTo = &replyTo; if (soap_send_ns__echoString(&soap, "soap.udp://...", NULL, "hello world!")) soap_print_fault(&soap, stderr); else { for (;;) { if (soap_recv_ns__sendStringResponse(&soap, &res)) break; printf("Multicast response: %s\n", res); } if (soap.error == SOAP_EOF && soap.errnum == 0) printf("Timeout: no more messages received\n"); else soap_print_fault(&soap, stderr); } soap_destroy(&soap); // cleanup soap_end(&soap); // cleanup soap_done(&soap); // close connection (should not use soap struct after this) * Server-side struct soap soap; soap_init1(&soap, SOAP_IO_UDP); // must set UDP flag if (!soap_valid_socket(soap_bind(&soap, host, port, 100))) { soap_print_fault(&soap, stderr); exit(1); } for (;;) { if (soap_serve(&soap)) soap_print_fault(&soap, stderr); // just report the problem soap_destroy(&soap); soap_end(&soap); } soap_done(&soap); ... int ns__echoString(struct soap *soap, char *str, char **res) { if (!soap->header) return soap_sender_fault(soap, "No SOAP header", NULL); if (!soap->header->wsa__MessageID) return soap_sender_fault(soap, "No WS-Addressing MessageID", NULL); soap->header->wsa__RelatesTo = (struct wsa__Relationship*)soap_malloc(soap, sizeof(struct wsa__Relationship)); soap_default_wsa__Relationship(soap, soap->header->wsa__RelatesTo); soap->header->wsa__RelatesTo->__item = soap->header->wsa__MessageID; // must check for duplicate messages if (check_received(soap->header->wsa__MessageID)) { printf("Request message %s already received\n", soap->header->wsa__MessageID); return SOAP_STOP; // don't return response } if (!soap->header->wsa__ReplyTo || !soap->header->wsa__ReplyTo->Address) return soap_sender_fault(soap, "No WS-Addressing ReplyTo address", NULL); soap->header->wsa__To = soap->header->wsa__ReplyTo->Address; soap->header->wsa__MessageID = soap_strdup(soap, soap_int2s(soap, id_count++)) ; soap->header->wsa__Action = "http://genivia.com/udp/echoStringResponse"; *res = str; return SOAP_OK; } ... int ns__sendString(struct soap *soap, char *str) { if (!soap->header) return SOAP_STOP; if (!soap->header->wsa__MessageID) return SOAP_STOP; // must check for duplicate messages if (check_received(soap->header->wsa__MessageID)) return SOAP_STOP; return SOAP_OK; } ... int ns__sendStringResponse(struct soap *soap, char *res) { return SOAP_NO_METHOD; } // we don't expect to serve this message Built steps ----------- A Makefile is included to build client and server applications. To build the example client: make udpclient To build the example server: make udpserver To generate the wsa.h file: wsdl2h -c -t ../../WS/WS-typemap.dat -o wsa.h http://schemas.xmlsoap.org/ws/2004/08/addressing Then manually replace in WS-Addressing.h //gsoapopt cw with //gsoapopt c to ensure .wsdl and .xsd files are generated for your Web service applications. Example run ----------- Start udpserver in a shell window (window 1): $ ./udpserver Execute udpclient in another shell window (window 2): $ ./udpclient Window 1 displays (server): Accepting requests... Request message id1 accepted Response message 1 returned Accepting requests... One-way message id2 accepted and serviced Accepting requests... Window 2 displays (client): UDP server response: hello world! Re-execute the udpclient (window 2): $ ./udpclient Window 1 displays (server): Request message id1 already received SOAP FAULT: SOAP-ENV:Client "Stopped: no response sent" Accepting requests... One-way message id2 already received Accepting requests... Window 2 displays (client): Timeout: message probably already delivered gsoap-2.8.91/gsoap/samples/udp/udpserver.c0000644000175000017500000001500213525245163020020 0ustar ellertellert/* udpserver.c SOAP-over-UDP demo server with zlib compression and WS-Addressing -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2011, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "udp.nsmap" #define MAX_HISTORY (1000) char *received_id[MAX_HISTORY]; int last_received; void init_received(); int check_received(const char *id); int id_count = 1; #define MULTICAST_GROUP (NULL) /* use a group IP such as "225.0.0.37" */ #define PORT 10000 int main() { struct soap soap; init_received(); soap_init1(&soap, SOAP_IO_UDP); /* reuse address */ soap.bind_flags = SO_REUSEADDR; /* bind */ if (!soap_valid_socket(soap_bind(&soap, NULL, PORT, 100))) { soap_print_fault(&soap, stderr); exit(1); } /* optionally join a multicast group */ if (MULTICAST_GROUP) { struct ip_mreq mreq; mreq.imr_multiaddr.s_addr = inet_addr(MULTICAST_GROUP); mreq.imr_interface.s_addr = htonl(INADDR_ANY); if (setsockopt(soap.socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) exit(1); } /* serve requests */ for (;;) { printf("Accepting requests\n"); /* accept (not really needed for UDP, so can be omitted) */ if (!soap_valid_socket(soap_accept(&soap))) { soap_print_fault(&soap, stderr); exit(1); } if (soap_serve(&soap)) soap_print_fault(&soap, stderr); soap_destroy(&soap); soap_end(&soap); } soap_done(&soap); return 0; } void init_received() { int i; for (i = 0; i < MAX_HISTORY; i++) received_id[i] = NULL; last_received = 0; } int check_received(const char *id) { int i; if (!id) return 1; /* Check if Message ID already received */ for (i = 0; i < MAX_HISTORY; i++) { if (received_id[i] && !strcmp(id, received_id[i])) return 1; } if (received_id[last_received]) free(received_id[last_received]); received_id[last_received++] = strdup(id); /* Wrap to overwrite old IDs */ if (last_received >= MAX_HISTORY) last_received = 0; return 0; } int check_header(struct soap *soap) { /* MUST have received a SOAP Header */ if (!soap->header) return soap_sender_fault(soap, "No SOAP header", NULL); /* ... with a Message ID */ if (!soap->header->wsa__MessageID) return soap_sender_fault(soap, "No WS-Addressing MessageID", NULL); soap->header->wsa__RelatesTo = (struct wsa__Relationship*)soap_malloc(soap, sizeof(struct wsa__Relationship)); soap_default_wsa__Relationship(soap, soap->header->wsa__RelatesTo); soap->header->wsa__RelatesTo->__item = soap->header->wsa__MessageID; return SOAP_OK; } int ns__echoString(struct soap *soap, char *str, char **res) { char port[16]; /* Get Header info and setup response Header */ if (check_header(soap)) { printf("Malformed header\n"); return SOAP_FAULT; /* there was a problem */ } /* If message with MessageID already received, ignore it */ if (check_received(soap->header->wsa__MessageID)) { printf("Request message %s already received\n", soap->header->wsa__MessageID); return SOAP_STOP; } /* Get name of client */ getnameinfo((struct sockaddr*)&soap->peer, soap->peerlen, soap->host, sizeof(soap->host), port, 16, NI_DGRAM | NI_NAMEREQD | NI_NUMERICSERV); printf("Request message %s from %s:%s accepted\n", soap->header->wsa__MessageID, soap->host, port); /* Check ReplyTo has Address */ if (!soap->header->wsa__ReplyTo || !soap->header->wsa__ReplyTo->Address) return soap_sender_fault(soap, "No WS-Addressing ReplyTo address", NULL); /* Copy Header info into response Header */ soap->header->wsa__To = soap->header->wsa__ReplyTo->Address; /* Add info to response Header */ soap->header->wsa__MessageID = soap_strdup(soap, soap_int2s(soap, id_count++)); soap->header->wsa__Action = "http://genivia.com/udp/echoStringResponse"; /* Copy request string into response string */ printf("Response message %s returned\n", soap->header->wsa__MessageID); *res = str; return SOAP_OK; } int ns__sendString(struct soap *soap, char *str) { if (check_header(soap)) printf("Malformed header\n"); else if (check_received(soap->header->wsa__MessageID)) printf("One-way message %s already received\n", soap->header->wsa__MessageID); else printf("One-way message %s accepted and serviced\n", soap->header->wsa__MessageID); return SOAP_OK; } int SOAP_ENV__Fault(struct soap *soap, char *faultcode, char *faultstring, char *faultactor, struct SOAP_ENV__Detail *detail, struct SOAP_ENV__Code *SOAP_ENV__Code, struct SOAP_ENV__Reason *SOAP_ENV__Reason, char *SOAP_ENV__Node, char *SOAP_ENV__Role, struct SOAP_ENV__Detail *SOAP_ENV__Detail) { printf("Received one-way SOAP Fault message:\n"); /* populate the fault struct from the operation arguments to print it */ soap_fault(soap); /* SOAP 1.1 */ soap->fault->faultcode = faultcode; soap->fault->faultstring = faultstring; soap->fault->faultactor = faultactor; soap->fault->detail = detail; /* SOAP 1.2 */ soap->fault->SOAP_ENV__Code = SOAP_ENV__Code; soap->fault->SOAP_ENV__Reason = SOAP_ENV__Reason; soap->fault->SOAP_ENV__Node = SOAP_ENV__Node; soap->fault->SOAP_ENV__Role = SOAP_ENV__Role; soap->fault->SOAP_ENV__Detail = SOAP_ENV__Detail; /* set error */ soap->error = SOAP_FAULT; soap_print_fault(soap, stdout); return soap_send_empty_response(soap, SOAP_OK); /* HTTP 202 Accepted */ } gsoap-2.8.91/gsoap/samples/udp/Makefile.am0000644000175000017500000000077013525245163017677 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = udpclient udpserver SOAPHEADER = udp.h include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = udp.nsmap udpclient_SOURCES = udpclient.c $(SOAPHEADER) $(SOAP_C_CLIENT) udpserver_SOURCES = udpserver.c $(SOAPHEADER) $(SOAP_C_SERVER) gsoap-2.8.91/gsoap/samples/template/0000755000175000017500000000000013525245202016654 5ustar ellertellertgsoap-2.8.91/gsoap/samples/template/primes.cpp0000644000175000017500000000556613525245163020701 0ustar ellertellert/* primes.cpp Prime sieve example that demsontrates the use of a user-defined simple_vector container and auto-generated code to display the container contents in XML. Build: > soapcpp2 -CS primes.h > c++ -o primes primes.cpp soapC.cpp stdsoap2.cpp Usage: > ./primes -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2011, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ // include all generated header files: #include "soapH.h" #include int main() { primes p; // also instantiates the 'soap' context p.sieve(100); // sieve primes primes q; q = p; // to show that copy constructor and assignment are OK q.write(); // write primes in XML return 0; } // sieving primes in the simple_vector<> container: void primes::sieve(int n) { prime.clear(); prime.insert(prime.end(), 1); prime.insert(prime.end(), 2); for (int i = 3; i <= n; i += 2) { bool composite = false; for (simple_vector::const_iterator j = prime.begin(); j != prime.end(); ++j) { if (*j != 1 && i % *j == 0) { composite = true; break; } } if (!composite) prime.insert(prime.end(), i); } } // the writer uses the fact that the primes class inherits the context: void primes::write() { soap_set_omode(this, SOAP_XML_INDENT); // show with indentation please soap_write_primes(this, this); // soap_write_prime is generated } // the destructor cleans up the 'soap' context primes::~primes() { soap_destroy(this); soap_end(this); } // we need a dummy namespace table, even though we don't use XML namespaces: SOAP_NMAC struct Namespace namespaces[] = { {NULL, NULL, NULL, NULL} }; gsoap-2.8.91/gsoap/samples/template/.deps/0000755000175000017500000000000013525245202017665 5ustar ellertellertgsoap-2.8.91/gsoap/samples/template/Makefile.in0000644000175000017500000004700113525245163020731 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = primes$(EXEEXT) subdir = gsoap/samples/template ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am_primes_OBJECTS = primes.$(OBJEXT) $(am__objects_1) $(am__objects_2) primes_OBJECTS = $(am_primes_OBJECTS) primes_LDADD = $(LDADD) am__DEPENDENCIES_1 = primes_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/primes.Po ./$(DEPDIR)/soapC.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(primes_SOURCES) DIST_SOURCES = $(primes_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.cpp_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = primes.h SOAP_FLAGS = -CS AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = $(SOAP_NS_DEF) primes_SOURCES = primes.cpp $(SOAPHEADER) simple_vector.h $(SOAP_CPP_CORE) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/template/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/template/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) primes$(EXEEXT): $(primes_OBJECTS) $(primes_DEPENDENCIES) $(EXTRA_primes_DEPENDENCIES) @rm -f primes$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(primes_OBJECTS) $(primes_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/primes.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/primes.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/primes.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/template/simple_vector.h0000644000175000017500000001042513525245163021710 0ustar ellertellert/* simple_vector.h Defines the simple_vector<> template as an example on how to define custom containers that can be auto-serialized in XML with gSOAP. In order for the auto-generated XML serializers to work for templates, we must define at least these methods: void clear() iterator begin() const_iterator begin() const iterator end() const_iterator end() const size_t size() const iterator insert(iterator pos, const_reference val) where begin() gives a forward iterator over the container. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ // declare the simple_vector<> template: #include template class simple_vector { public: typedef T value_type; typedef value_type * pointer; typedef const value_type * const_pointer; typedef value_type & reference; typedef const value_type & const_reference; typedef pointer iterator; typedef const_pointer const_iterator; protected: iterator head; iterator tail; size_t capacity; public: simple_vector() { head = tail = NULL; } simple_vector(const simple_vector& v) { operator=(v); } ~simple_vector() { if (head) delete[] head; } void clear() { tail = head; } /* the member functions below are required for (de)serialization of templates */ iterator begin() { return head; } const_iterator begin() const { return head; } iterator end() { return tail; } const_iterator end() const { return tail; } size_t size() const { return tail - head; } iterator insert(iterator pos, const_reference val) { if (!head) head = tail = new value_type[capacity = 1]; else if (tail >= head + capacity) { iterator i = head; iterator j = new value_type[capacity *= 2]; iterator k = j; while (i < tail) *k++ = *i++; if (pos) pos = j + (pos - head); tail = j + (tail - head); delete[] head; head = j; } if (pos && pos >= head && pos < tail) { iterator i = tail; iterator j = i - 1; while (j != pos) *i-- = *j--; *pos = val; } else { pos = tail; *tail++ = val; } return pos; } simple_vector& operator=(const simple_vector& v) { head = tail = NULL; capacity = v.capacity; if (v.head) { head = tail = new value_type[capacity]; iterator i = v.head; while (i != v.tail) *tail++ = *i++; } return *this; } }; gsoap-2.8.91/gsoap/samples/template/primes.h0000644000175000017500000000370013525245163020332 0ustar ellertellert/* primes.h Declarations for the soapcpp2 compiler to define a primes class derived from the 'soap' context and to define a simple_vector template. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ // declare the simple_vector<> template: template class simple_vector; // declare a primes class that inherits a context for SOAP/XML serialization: class primes: struct soap { public: simple_vector prime; // container of ints void sieve(int n); void write(); virtual ~primes(); }; // #include is deferred to the generated code, which will then include the defs: #include "simple_vector.h" // defines simple_vector<> gsoap-2.8.91/gsoap/samples/template/README.txt0000644000175000017500000000551213525245163020363 0ustar ellertellert How container templates are serialized ====================================== In the gSOAP header file (the file processed by soapcpp2) a container template can be declared as follows: template class mycontainer; and mycontainer can be used as needed in the same gSOAP header file to serialize mycontainers of values in XML similar to std::vector: mycontainer ... mycontainer ... etc Compare this to: std::vector Note that the template class code itself should NOT be defined anywhere in the header file, but separately in a header file. You can include this header file with (not import): #include "mycontainer.h" // do not use #import: need mycontainer.h later That is, The "real" container template must be defined in a regular header file and implemented. For XML serialization to work with the template, the template class C container must define at least the following public members: void C::clear() C::iterator C::begin() C::const_iterator C::begin() const C::iterator C::end() C::const_iterator C::end() const size_t C::size() const C::iterator C::insert(C::iterator pos, const T& val) These members allow the gSOAP serializers to read and write the container content from/to XML. Of course, how you define these is up to you. A container can also store just one value, or you can use it to serialize trees and graphs, or even produce and consume content dynamically. You could define the templates as processors of (de)serialized XML content embedded in XML messages. Because the serializers are invoked twice to send a message over HTTP (one pass to compute the content length when chunking is off, then to send the HTTP body), you MUST ensure that the template instance's iterator produces the same content in the two-phase HTTP count/send (or use chunking). Example ------- The example code in this directory is kept small to highlight the basic features. The possibilities are endless. In order to use container templates, you need at least one file that defines the container and its implementation. In the example code here, we defined the container template in: simple_vector.h The application is a prime sieve: primes.cpp which computes primes and stores them in the container. The primes application uses the 'primes' class defined in the gSOAP header file: primes.h which is parsed by soapcpp2 to generate all the 'primes' class serialization routines to dump the XML content of the container, i.e. the list of primes. Note that the 'primes' class is derived from the soap struct, which means that a soap struct is associated with the class to allow a serialization context to be carried along with it. This also minimizes the need to write code to setup the soap context for XML serialization etc. gsoap-2.8.91/gsoap/samples/template/Makefile.am0000644000175000017500000000072213525245163020717 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = primes SOAPHEADER = primes.h SOAP_FLAGS = -CS include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = $(SOAP_NS_DEF) primes_SOURCES = primes.cpp $(SOAPHEADER) simple_vector.h $(SOAP_CPP_CORE) gsoap-2.8.91/gsoap/samples/Makefile.c_rules0000644000175000017500000000073713525245163020151 0ustar ellertellert## common Makefile rules for building the C - soap samples ## SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ gsoap-2.8.91/gsoap/samples/wsa/0000755000175000017500000000000013525245202015633 5ustar ellertellertgsoap-2.8.91/gsoap/samples/wsa/.deps/0000755000175000017500000000000013525245202016644 5ustar ellertellertgsoap-2.8.91/gsoap/samples/wsa/Makefile.in0000644000175000017500000007165713525245163017726 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = wsademo$(EXEEXT) subdir = gsoap/samples/wsa ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = wsademo-soapC.$(OBJEXT) am__objects_3 = wsademo-soapClient.$(OBJEXT) $(am__objects_2) am__objects_4 = $(am__objects_3) wsademo-soapServer.$(OBJEXT) \ $(am__objects_1) $(am__objects_1) am_wsademo_OBJECTS = wsademo-wsademo.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) wsademo-wsaapi.$(OBJEXT) wsademo_OBJECTS = $(am_wsademo_OBJECTS) am__DEPENDENCIES_1 = wsademo_DEPENDENCIES = $(SOAP_C_LIB_SSL) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) wsademo_LINK = $(CCLD) $(wsademo_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/wsademo-soapC.Po \ ./$(DEPDIR)/wsademo-soapClient.Po \ ./$(DEPDIR)/wsademo-soapServer.Po \ ./$(DEPDIR)/wsademo-wsaapi.Po ./$(DEPDIR)/wsademo-wsademo.Po am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(wsademo_SOURCES) DIST_SOURCES = $(wsademo_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.c_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = foreign 1.4 SOAPHEADER = wsademo.h SOAP_FLAGS = -a AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = wsademo.nsmap wsademo.wsdl wsademo_CFLAGS = -DWITH_OPENSSL -DWITH_GZIP wsademo_SOURCES = wsademo.c $(SOAPHEADER) $(SOAP_C_SRC) ../../plugin/wsaapi.c wsademo_LDADD = $(SOAP_C_LIB_SSL) $(SAMPLE_SSL_LIBS) $(SAMPLE_EXTRA_LIBS) -lssl -lcrypto -lz all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/wsa/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/wsa/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) wsademo$(EXEEXT): $(wsademo_OBJECTS) $(wsademo_DEPENDENCIES) $(EXTRA_wsademo_DEPENDENCIES) @rm -f wsademo$(EXEEXT) $(AM_V_CCLD)$(wsademo_LINK) $(wsademo_OBJECTS) $(wsademo_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsademo-soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsademo-soapClient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsademo-soapServer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsademo-wsaapi.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsademo-wsademo.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` wsademo-wsademo.o: wsademo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -MT wsademo-wsademo.o -MD -MP -MF $(DEPDIR)/wsademo-wsademo.Tpo -c -o wsademo-wsademo.o `test -f 'wsademo.c' || echo '$(srcdir)/'`wsademo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsademo-wsademo.Tpo $(DEPDIR)/wsademo-wsademo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wsademo.c' object='wsademo-wsademo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -c -o wsademo-wsademo.o `test -f 'wsademo.c' || echo '$(srcdir)/'`wsademo.c wsademo-wsademo.obj: wsademo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -MT wsademo-wsademo.obj -MD -MP -MF $(DEPDIR)/wsademo-wsademo.Tpo -c -o wsademo-wsademo.obj `if test -f 'wsademo.c'; then $(CYGPATH_W) 'wsademo.c'; else $(CYGPATH_W) '$(srcdir)/wsademo.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsademo-wsademo.Tpo $(DEPDIR)/wsademo-wsademo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wsademo.c' object='wsademo-wsademo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -c -o wsademo-wsademo.obj `if test -f 'wsademo.c'; then $(CYGPATH_W) 'wsademo.c'; else $(CYGPATH_W) '$(srcdir)/wsademo.c'; fi` wsademo-soapClient.o: soapClient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -MT wsademo-soapClient.o -MD -MP -MF $(DEPDIR)/wsademo-soapClient.Tpo -c -o wsademo-soapClient.o `test -f 'soapClient.c' || echo '$(srcdir)/'`soapClient.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsademo-soapClient.Tpo $(DEPDIR)/wsademo-soapClient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapClient.c' object='wsademo-soapClient.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -c -o wsademo-soapClient.o `test -f 'soapClient.c' || echo '$(srcdir)/'`soapClient.c wsademo-soapClient.obj: soapClient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -MT wsademo-soapClient.obj -MD -MP -MF $(DEPDIR)/wsademo-soapClient.Tpo -c -o wsademo-soapClient.obj `if test -f 'soapClient.c'; then $(CYGPATH_W) 'soapClient.c'; else $(CYGPATH_W) '$(srcdir)/soapClient.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsademo-soapClient.Tpo $(DEPDIR)/wsademo-soapClient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapClient.c' object='wsademo-soapClient.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -c -o wsademo-soapClient.obj `if test -f 'soapClient.c'; then $(CYGPATH_W) 'soapClient.c'; else $(CYGPATH_W) '$(srcdir)/soapClient.c'; fi` wsademo-soapC.o: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -MT wsademo-soapC.o -MD -MP -MF $(DEPDIR)/wsademo-soapC.Tpo -c -o wsademo-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsademo-soapC.Tpo $(DEPDIR)/wsademo-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='wsademo-soapC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -c -o wsademo-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c wsademo-soapC.obj: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -MT wsademo-soapC.obj -MD -MP -MF $(DEPDIR)/wsademo-soapC.Tpo -c -o wsademo-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsademo-soapC.Tpo $(DEPDIR)/wsademo-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='wsademo-soapC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -c -o wsademo-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` wsademo-soapServer.o: soapServer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -MT wsademo-soapServer.o -MD -MP -MF $(DEPDIR)/wsademo-soapServer.Tpo -c -o wsademo-soapServer.o `test -f 'soapServer.c' || echo '$(srcdir)/'`soapServer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsademo-soapServer.Tpo $(DEPDIR)/wsademo-soapServer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapServer.c' object='wsademo-soapServer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -c -o wsademo-soapServer.o `test -f 'soapServer.c' || echo '$(srcdir)/'`soapServer.c wsademo-soapServer.obj: soapServer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -MT wsademo-soapServer.obj -MD -MP -MF $(DEPDIR)/wsademo-soapServer.Tpo -c -o wsademo-soapServer.obj `if test -f 'soapServer.c'; then $(CYGPATH_W) 'soapServer.c'; else $(CYGPATH_W) '$(srcdir)/soapServer.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsademo-soapServer.Tpo $(DEPDIR)/wsademo-soapServer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapServer.c' object='wsademo-soapServer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -c -o wsademo-soapServer.obj `if test -f 'soapServer.c'; then $(CYGPATH_W) 'soapServer.c'; else $(CYGPATH_W) '$(srcdir)/soapServer.c'; fi` wsademo-wsaapi.o: ../../plugin/wsaapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -MT wsademo-wsaapi.o -MD -MP -MF $(DEPDIR)/wsademo-wsaapi.Tpo -c -o wsademo-wsaapi.o `test -f '../../plugin/wsaapi.c' || echo '$(srcdir)/'`../../plugin/wsaapi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsademo-wsaapi.Tpo $(DEPDIR)/wsademo-wsaapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsaapi.c' object='wsademo-wsaapi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -c -o wsademo-wsaapi.o `test -f '../../plugin/wsaapi.c' || echo '$(srcdir)/'`../../plugin/wsaapi.c wsademo-wsaapi.obj: ../../plugin/wsaapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -MT wsademo-wsaapi.obj -MD -MP -MF $(DEPDIR)/wsademo-wsaapi.Tpo -c -o wsademo-wsaapi.obj `if test -f '../../plugin/wsaapi.c'; then $(CYGPATH_W) '../../plugin/wsaapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsaapi.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsademo-wsaapi.Tpo $(DEPDIR)/wsademo-wsaapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsaapi.c' object='wsademo-wsaapi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsademo_CFLAGS) $(CFLAGS) -c -o wsademo-wsaapi.obj `if test -f '../../plugin/wsaapi.c'; then $(CYGPATH_W) '../../plugin/wsaapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsaapi.c'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/wsademo-soapC.Po -rm -f ./$(DEPDIR)/wsademo-soapClient.Po -rm -f ./$(DEPDIR)/wsademo-soapServer.Po -rm -f ./$(DEPDIR)/wsademo-wsaapi.Po -rm -f ./$(DEPDIR)/wsademo-wsademo.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/wsademo-soapC.Po -rm -f ./$(DEPDIR)/wsademo-soapClient.Po -rm -f ./$(DEPDIR)/wsademo-soapServer.Po -rm -f ./$(DEPDIR)/wsademo-wsaapi.Po -rm -f ./$(DEPDIR)/wsademo-wsademo.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/wsa/wsademo.c0000644000175000017500000002056713525245163017456 0ustar ellertellert/* wsademo.c WS-Addressing demo service. See the wsademo.h header file for details. 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, 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-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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "wsademo.nsmap" #include "wsaapi.h" /* from plugin/wsaapi.h */ /******************************************************************************\ * * Common Constants * \******************************************************************************/ const char *FromAddress = "http://localhost:11000"; const char *ToAddress = "http://localhost:11001"; const char *ReplyToAddress = "http://localhost:11002"; const char *FaultToAddress = "http://localhost:11003"; /* the SOAP and WSA actions, as defined in wsdldemo.h service definitions */ const char *RequestAction = "urn:wsademo/wsademoPort/wsademo"; const char *ResponseAction = "urn:wsademo/wsademoPort/wsademoResponse"; /******************************************************************************\ * * Main * \******************************************************************************/ int main(int argc, char **argv) { struct soap *soap = soap_new1(SOAP_XML_INDENT); soap_register_plugin(soap, soap_wsa); if (argc < 2) { /* no args: act as CGI service over stdin/out */ if (soap_serve(soap)) { soap_print_fault(soap, stderr); soap_print_fault_location(soap, stderr); } } else { int port = atoi(argv[1]); if (port) { /* stand-alone server serving messages over port */ soap->bind_flags = SO_REUSEADDR; if (!soap_valid_socket(soap_bind(soap, NULL, port, 100))) { soap_print_fault(soap, stderr); exit(1); } printf("Server is running\n"); while (soap_valid_socket(soap_accept(soap))) { if (soap_serve(soap)) { soap_print_fault(soap, stderr); soap_print_fault_location(soap, stderr); } printf("Request served\n"); soap_destroy(soap); soap_end(soap); } } else { /* client */ struct ns__wsademoResult res; const char *RequestMessageID; RequestMessageID = soap_wsa_rand_uuid(soap); soap_wsa_request(soap, RequestMessageID, ToAddress, RequestAction); if (argc >= 3) { if (strchr(argv[2], 'f')) soap_wsa_add_From(soap, FromAddress); if (strchr(argv[2], 'r')) soap_wsa_add_ReplyTo(soap, ReplyToAddress); if (strchr(argv[2], 'n')) { #ifdef SOAP_WSA_2005 soap_wsa_add_NoReply(soap); #else printf("'NoReply' feature not available with WS-Addressing 2003/2004\n"); #endif } if (strchr(argv[2], 'e')) soap_wsa_add_FaultTo(soap, FaultToAddress); } if (soap_call_ns__wsademo(soap, ToAddress, NULL, argv[1], &res)) { #ifdef SOAP_WSA_2005 wsa5__FaultCodesType fault; const char *info; if (soap->error == 202) /* HTTP ACCEPTED */ printf("Request was accepted\n"); else if (soap_wsa_check_fault(soap, &fault, &info)) { switch (fault) { case wsa5__EndpointUnavailable: fprintf(stderr, "Server %s is currently not available.\n", info?info:""); break; default: fprintf(stderr, "A wsa fault %d occurred:\n", (int)fault); soap_print_fault(soap, stderr); break; } } else soap_print_fault(soap, stderr); #else if (soap->error == 202) /* HTTP ACCEPTED */ printf("Request was accepted\n"); else soap_print_fault(soap, stderr); #endif } else if (res.out) printf("Result = %s\n", res.out); } } soap_destroy(soap); soap_end(soap); soap_done(soap); free(soap); return 0; } /******************************************************************************\ * * Service Operation of Main Server * \******************************************************************************/ int ns__wsademo(struct soap *soap, char *in, struct ns__wsademoResult *result) { const char *ResponseMessageID; if (soap_wsa_check(soap)) return soap->error; printf("Received '%s'\n", in?in:"(null)"); /* simulate a wsa Fault */ if (in && !strcmp(in, "error")) { printf("Simulating WS-Addressing Fault\n"); #if defined(SOAP_WSA_2005) return soap_wsa_error(soap, SOAP_WSA(EndpointUnavailable), ToAddress); #elif defined(SOAP_WSA_2003) return soap_wsa_error(soap, "Endpoint is not available"); #else return soap_wsa_error(soap, SOAP_WSA(EndpointUnavailable)); #endif } /* simulate a user-defined SOAP Fault */ if (in && !strcmp(in, "fault")) { printf("Simulating Server Operation Fault\n"); return soap_wsa_sender_fault(soap, "The demo service wsademo() operation returned a fault", NULL); } result->out = in; ResponseMessageID = soap_wsa_rand_uuid(soap); return soap_wsa_reply(soap, ResponseMessageID, ResponseAction); } /******************************************************************************\ * * Relayed Response Handler for ReplyTo Server * \******************************************************************************/ int ns__wsademoResult(struct soap *soap, char *out) { if (soap_wsa_check(soap)) return soap_send_empty_response(soap, 500); /* HTTP 500 error */ printf("Received Result = %s\n", out?out:""); return soap_send_empty_response(soap, SOAP_OK); /* HTTP 202 */ } /******************************************************************************\ * * Relayed SOAP-ENV:Fault Handler for FaultTo Server * \******************************************************************************/ int SOAP_ENV__Fault(struct soap *soap, char *faultcode, char *faultstring, char *faultactor, struct SOAP_ENV__Detail *detail, struct SOAP_ENV__Code *SOAP_ENV__Code, struct SOAP_ENV__Reason *SOAP_ENV__Reason, char *SOAP_ENV__Node, char *SOAP_ENV__Role, struct SOAP_ENV__Detail *SOAP_ENV__Detail) { printf("Received Fault:\n"); /* populate the fault struct from the operation arguments to print it */ soap_fault(soap); /* SOAP 1.1 */ soap->fault->faultcode = faultcode; soap->fault->faultstring = faultstring; soap->fault->faultactor = faultactor; soap->fault->detail = detail; /* SOAP 1.2 */ soap->fault->SOAP_ENV__Code = SOAP_ENV__Code; soap->fault->SOAP_ENV__Reason = SOAP_ENV__Reason; soap->fault->SOAP_ENV__Node = SOAP_ENV__Node; soap->fault->SOAP_ENV__Role = SOAP_ENV__Role; soap->fault->SOAP_ENV__Detail = SOAP_ENV__Detail; /* set error */ soap->error = SOAP_FAULT; soap_print_fault(soap, stdout); return soap_send_empty_response(soap, SOAP_OK); /* HTTP 202 Accepted */ } gsoap-2.8.91/gsoap/samples/wsa/wsademo.h0000644000175000017500000001646113525245163017461 0ustar ellertellert/* wsademo.h WS-Addressing demo service. See usage comments below. 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, 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-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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- This example application demonstrates server-side and client-side logic for services based on WS-Addressing. At the server side, WS-Addressing enables forwarding/relaying of service responses and faults to other services. At the client side, a relayed response or fault will not be received and an HTTP ACCEPTED (code 202) is delivered instead, assuming that the relay was successful. This header file illustrates two gSOAP soapcpp2 tooling tricks to enable services to accept SOAP Fault messages and to create a one-way service operation to handle responses. Compile with (note the use of soapcpp2 -a to handle http action header): soapcpp2 -a -c -Iimport wsademo.h cc -Iplugin -o wsademo wsademo.c stdsoap2.c soapC.c soapClient.c soapServer.c plugin/wsaapi.c Usage: After compilation, start the main server at port 11001: > ./wsademo 11001 In a new window, start a return service at port 11002: > ./wsademo 11002 This service handles response messages from the main service. In a new window, start a fault service at port 11003: > ./wsademo 11003 This service handles faults from the main service. In a new window, run the client: > ./wsademo hello This example shows the server returning "hello" to the client. > ./wsademo fault This example shows the server returning a SOAP fault to the client: "The demo service wsademo() operation returned a fault". > ./wsademo hello r This example shows the server returning "hello" to the return service. > ./wsademo hello n This example shows the server accepting the message without reply. > ./wsademo error e This example shows the server returning a wsa fault to fault service: "The endpoint is unable to process the message at this time". > ./wsademo fault e This example shows the server returning a SOAP fault to fault service. "The demo service wsademo() operation returned a fault". Note: when the response service is down, the response cannot be relayed and the client (or fault service) will be informed about the failure. */ #import "soap12.h" #import "wsa5.h" //gsoap ns service name: wsademo demonstrates WS-Addressing capabilities //gsoap ns service port: http://localhost:11001 //gsoap ns service type: wsademoPort //gsoap ns service namespace: urn:wsademo /* To generate SOAP-ENV:Fault struct via a one-way service operation. * This allows us to implement a one-way service operation that accepts Faults. * Because a service operation input parameters has a corresponding struct, we * automatically generate the (original) SOAP_ENV__Fault struct on the fly! * Note: it is important to associate the wsa fault action with this operation * as defined below. The action is version-dependent, here we use 2005/08. * This declaration is now part of the wsa5.h imported specification and hereby * removed from this code. //gsoap SOAP_ENV service method-action: Fault http://www.w3.org/2005/08/addressing/soap/fault int SOAP_ENV__Fault ( _QName faultcode, // SOAP 1.1 char *faultstring, // SOAP 1.1 char *faultactor, // SOAP 1.1 struct SOAP_ENV__Detail *detail, // SOAP 1.1 struct SOAP_ENV__Code *SOAP_ENV__Code, // SOAP 1.2 struct SOAP_ENV__Reason *SOAP_ENV__Reason, // SOAP 1.2 char *SOAP_ENV__Node, // SOAP 1.2 char *SOAP_ENV__Role, // SOAP 1.2 struct SOAP_ENV__Detail *SOAP_ENV__Detail, // SOAP 1.2 void ); */ /* For the server side we need to generate a response struct for each * operation to implement one-way service response operations that can be * relayed. Because the service operation has a corresponding struct, we can * use that struct as a response parameter for the second two-way service * operation. This step is required to implement a wsa-capable server. */ //gsoap ns service method-header-part: wsademoResult wsa5__MessageID //gsoap ns service method-header-part: wsademoResult wsa5__RelatesTo //gsoap ns service method-header-part: wsademoResult wsa5__From //gsoap ns service method-header-part: wsademoResult wsa5__ReplyTo //gsoap ns service method-header-part: wsademoResult wsa5__FaultTo //gsoap ns service method-header-part: wsademoResult wsa5__To //gsoap ns service method-header-part: wsademoResult wsa5__Action //gsoap ns service method-action: wsademoResult urn:wsademo/wsademoPort/wsademoResponse //gsoap ns service method-documentation: wsademoResult accepts a string value from a relayed response int ns__wsademoResult(char *out, void); //gsoap ns service method-header-part: wsademo wsa5__MessageID //gsoap ns service method-header-part: wsademo wsa5__RelatesTo //gsoap ns service method-header-part: wsademo wsa5__From //gsoap ns service method-header-part: wsademo wsa5__ReplyTo //gsoap ns service method-header-part: wsademo wsa5__FaultTo //gsoap ns service method-header-part: wsademo wsa5__To //gsoap ns service method-header-part: wsademo wsa5__Action //gsoap ns service method-action: wsademo urn:wsademo/wsademoPort/wsademo //gsoap ns service method-output-action: wsademo urn:wsademo/wsademoPort/wsademoResponse //gsoap ns service method-documentation: wsademo echos a string value and relays the response to the wsa replyTo address (if present) int ns__wsademo(char *in, struct ns__wsademoResult *result); gsoap-2.8.91/gsoap/samples/wsa/README.txt0000644000175000017500000000072513525245163017343 0ustar ellertellert This application demonstrates server-side and client-side logic for services based on WS-Addressing. At the server side, WS-Addressing enables forwarding/relaying of service responses and faults to other services. At the client side, a relayed response or fault will not be received and an HTTP ACCEPTED (code 202) is delivered instead, assuming that the relay was successful. For more details, please see wsademo.h. Instructions about the demo are included therein. gsoap-2.8.91/gsoap/samples/wsa/Makefile.am0000644000175000017500000000113313525245163017673 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = foreign 1.4 noinst_PROGRAMS = wsademo SOAPHEADER = wsademo.h SOAP_FLAGS = -a include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = wsademo.nsmap wsademo.wsdl wsademo_CFLAGS = -DWITH_OPENSSL -DWITH_GZIP wsademo_SOURCES = wsademo.c $(SOAPHEADER) $(SOAP_C_SRC) ../../plugin/wsaapi.c wsademo_LDADD = $(SOAP_C_LIB_SSL) $(SAMPLE_SSL_LIBS) $(SAMPLE_EXTRA_LIBS) -lssl -lcrypto -lz gsoap-2.8.91/gsoap/samples/rss/0000755000175000017500000000000013525245202015650 5ustar ellertellertgsoap-2.8.91/gsoap/samples/rss/.deps/0000755000175000017500000000000013525245202016661 5ustar ellertellertgsoap-2.8.91/gsoap/samples/rss/Makefile.in0000644000175000017500000004543613525245163017737 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = rss$(EXEEXT) subdir = gsoap/samples/rss ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am_rss_OBJECTS = rss.$(OBJEXT) $(am__objects_1) $(am__objects_2) rss_OBJECTS = $(am_rss_OBJECTS) rss_LDADD = $(LDADD) am__DEPENDENCIES_1 = rss_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/rss.Po ./$(DEPDIR)/soapC.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(rss_SOURCES) DIST_SOURCES = $(rss_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.c_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = rss.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = $(SOAP_NS_DEF) rss_SOURCES = rss.c $(SOAPHEADER) $(SOAP_C_CORE) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/rss/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/rss/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) rss$(EXEEXT): $(rss_OBJECTS) $(rss_DEPENDENCIES) $(EXTRA_rss_DEPENDENCIES) @rm -f rss$(EXEEXT) $(AM_V_CCLD)$(LINK) $(rss_OBJECTS) $(rss_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rss.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/rss.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/rss.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/rss/rss.h0000644000175000017500000000554013525245163016642 0ustar ellertellert/* rss.h Supports RSS 0.91, 0.92 and 2.0 Retrieve RSS feeds and formats the messages in HTML. Use CSS to format the HTML layout. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap dc schema namespace: http://purl.org/dc/elements/1.1/ /// Container for mixed XML content (XML gSOAP built-in) typedef char *XML; /// element struct channel { char *title; ///< channel title element char *link; ///< channel link element char *language; char *copyright; XML description; ///< description may contain XHTML that is preserved in XML struct image *image; ///< optional image element int __size; ///< an array of items of size __size struct item *item; ///< an array of item elements time_t *dc__date; ///< RSS 2.0 dc schema element (optional) }; /// element struct item { char *title; ///< item title element char *link; ///< item link element XML description; ///< description may contain XHTML that is preserved in XML char *pubDate; time_t *dc__date; ///< RSS 2.0 dc schema element }; /// element struct image { char *title; ///< image title element char *url; ///< image URL element char *link; ///< image link element int width 0:1 = 0; ///< optional, default value = 0 int height 0:1 = 0; ///< optional, default value = 0 XML description; ///< description may contain XHTML that is preserved in XML }; /// element struct rss { @char *version = "2.0"; ///< version attribute (optional, default="2.0") struct channel channel; ///< channel element }; gsoap-2.8.91/gsoap/samples/rss/README.txt0000644000175000017500000000305113525245163017353 0ustar ellertellert RSS Support =========== The gSOAP RSS library supports RSS 0.91, 0.92, and 2.0 Examples -------- An example RSS client and server are included. As a command-line client displays RSS feeds in text format. As a server reformats formats RSS feeds in HTML to be displayed in your web pages via a JavaScript (see below). Usage (client) -------------- > rss [maxitems] URL Prints RSS content in text format. Examples: > rss 10 http://newsrss.bbc.co.uk/rss/newsonline_world_edition/front_page/rss.xml > rss 10 http:// < your_rss_file.xml Usage (server) -------------- Installed as CGI application prints Javascript code to view RSS feeds in Web pages. The Javascript code produced by this application is executed with the following example script embedded in the Web page, e.g. to display BBC news: To control the appearance with cascading style sheets: rss_box the bounding div for the entire display rss_table the table with title, image, and items rss_title the title of the feed and link style if displayed rss_image the image rss_bar the dividing bar rss_item the title of the item rss_desc the description of the item Enabling HTTPS -------------- To enable HTTPS you should install OpenSSL, then compile with: $ cc -DWITH_OPENSSL -o rss rss.c stdsoap2.c soapC.c -lssl -lcrypto gsoap-2.8.91/gsoap/samples/rss/rsstest.html0000644000175000017500000000052613525245163020256 0ustar ellertellert

BBC World News

gsoap-2.8.91/gsoap/samples/rss/Makefile.am0000644000175000017500000000063713525245163017720 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = rss SOAPHEADER = rss.h include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = $(SOAP_NS_DEF) rss_SOURCES = rss.c $(SOAPHEADER) $(SOAP_C_CORE) gsoap-2.8.91/gsoap/samples/rss/rss.c0000644000175000017500000003136113525245163016635 0ustar ellertellert/* rss.c Supports RSS 0.91, 0.92, and 2.0 Server to retrieve RSS feeds and format the messages in HTML. Compile: $ soapcpp2 -c -CSL rss.h $ cc -o rss rss.c stdsoap2.c soapC.c Usage (client): $ rss [maxitems] URL Prints RSS content in text format. Examples: rss 10 http://newsrss.bbc.co.uk/rss/newsonline_world_edition/front_page/rss.xml rss 10 http:// < your_rss_file.xml Usage (server): Installed as CGI application prints Javascript code to view RSS feeds in Web pages. The Javascript code produced by this application is executed with the following example script embedded in the Web page, e.g. to display BBC news: To control the appearance with cascading style sheets: rss_box the bounding div for the entire display rss_table the table with title, image, and items rss_title the title of the feed and link style if displayed rss_image the image of the feed rss_bar the dividing bar between items rss_item the title of the item rss_date the date of the item rss_desc the description of the item To enable HTTPS, compile with: $ cc -DWITH_OPENSSL -o rss rss.c stdsoap2.c soapC.c -lssl -lcrypto -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #define STR(s) ((s)?(s):"") /* Maximum number of HTTP redirects */ #define MAX_REDIRECTS 10 static void docwrite0(struct soap *soap, const char *s); static void docwrite1(struct soap *soap, const char *s1, const char *s2, const char *s3); static void docwrite2(struct soap *soap, const char *s1, const char *s2, const char *s3, const char *s4, const char *s5); static void docerror(struct soap *soap, const char *s); static void strwrite(struct soap *soop, const char *s); static char *query_key(char *buf, size_t len, char **s); static char *query_val(char *buf, size_t len, char **s); int main(int argc, char **argv) { struct soap *soap = soap_new1(SOAP_C_UTFSTRING); /* preserve UTF8 string content */ const char *endpoint = NULL; struct rss *rss; int maxitems = 10; /* max items to show */ int show_date = 1; /* show date yes/no */ int i; /* RSS has no encoding style */ soap->encodingStyle = NULL; /* get URL of RSS feed or run as CGI app */ if (argc >= 3) { maxitems = atoi(argv[1]); endpoint = argv[2]; } else if (argc >= 2) endpoint = argv[1]; else { char *query = getenv("QUERY_STRING"); /* CGI app: get query string */ char *keybuf; char *valbuf; int len; if (query) { len = strlen(query); keybuf = (char*)soap_malloc(soap, len + 1); valbuf = (char*)soap_malloc(soap, len + 1); while (query) { char *key = query_key(keybuf, len, &query); /* decode next query string key */ char *val = query_val(valbuf, len, &query); /* decode next query string value (if any) */ /* get endpoint and max number of items to display */ if (key && val) { if (!strcmp(key, "rss")) endpoint = soap_strdup(soap, val); else if (!strcmp(key, "max")) maxitems = atoi(val); else if (!strcmp(key, "date")) show_date = (*val == 'y'); } } } if (!endpoint) { docerror(soap, "No RSS URL"); exit(0); } } /* connect and parse HTTP header (max HTTP redirects) */ for (i = 0; i < MAX_REDIRECTS; i++) { /* HTTP GET and parse HTTP header */ if (soap_connect_command(soap, SOAP_GET, endpoint, NULL) || soap_begin_recv(soap)) { if ((soap->error >= 301 && soap->error <= 303) || soap->error == 307) endpoint = soap_strdup(soap, soap->endpoint); /* HTTP redirects */ else { soap_print_fault(soap, stderr); exit(soap->error); } } else break; } /* parse RSS */ rss = soap_get_rss(soap, NULL, "rss", NULL); /* close connection */ soap_end_recv(soap); soap_closesock(soap); if (argc < 2) { /* CGI application: produce Javascript */ if (rss && (!strcmp(rss->version, "0.91") || !strcmp(rss->version, "0.92") || !strcmp(rss->version, "2.0"))) { soap_begin_send(soap); soap->http_content = "application/javascript"; soap_response(soap, SOAP_FILE); /* SOAP_FILE specifies http_content should be used */ docwrite0(soap, "
"); docwrite0(soap, ""); if (rss->channel.title) { if (rss->channel.link) docwrite2(soap, ""); else docwrite1(soap, ""); } if (rss->channel.image && rss->channel.image->url) { struct image *image = rss->channel.image; if (image->link) docwrite2(soap, ""); else if (rss->channel.link) docwrite2(soap, ""); else docwrite1(soap, ""); if (!rss->channel.title && image->title) docwrite1(soap, ""); if (!rss->channel.description && image->description) docwrite1(soap, ""); } if (rss->channel.description) docwrite1(soap, ""); if (rss->channel.copyright) docwrite1(soap, ""); if (rss->channel.__size < maxitems) maxitems = rss->channel.__size; for (i = 0; i < maxitems; i++) { struct item *item = &rss->channel.item[i]; docwrite0(soap, ""); if (item->title) { if (item->link) docwrite2(soap, ""); else docwrite1(soap, ""); if (show_date && item->pubDate) docwrite1(soap, ""); else if (show_date && item->dc__date) docwrite1(soap, ""); if (item->description) docwrite1(soap, ""); } } docwrite0(soap, "
", rss->channel.title, "
", rss->channel.title, "
Channel Image
Channel Image
Channel Image
", image->title, "
", image->description, "
", rss->channel.description, "
", rss->channel.copyright, "
", item->title, "
", item->title, "
Posted ", item->pubDate, "
Posted ", ctime(item->dc__date), "
", item->description, "
"); docwrite0(soap, "
"); soap_end_send(soap); } else { docerror(soap, "No RSS 0.91, 0.92, or 2.0 data"); exit(0); } } else if (rss) { /* Interactive: produce text output */ if (!strcmp(rss->version, "0.91") || !strcmp(rss->version, "0.92") || !strcmp(rss->version, "2.0")) { printf("Title: %s\n", STR(rss->channel.title)); printf("Link: %s\n", STR(rss->channel.link)); printf("Language: %s\n", STR(rss->channel.language)); printf("Description: %s\n", STR(rss->channel.description)); if (rss->channel.image) { printf("Image title: %s\n", STR(rss->channel.image->title)); printf("Image url: %s\n", STR(rss->channel.image->url)); printf("Image link: %s\n", STR(rss->channel.image->link)); printf("Image dimensions: %d x %d\n", rss->channel.image->width, rss->channel.image->height); printf("Image description: %s\n", STR(rss->channel.image->description)); } if (rss->channel.__size < maxitems) maxitems = rss->channel.__size; for (i = 0; i < maxitems; i++) { printf("\n%3d Title: %s\n", i+1, STR(rss->channel.item[i].title)); printf(" Link: %s\n", STR(rss->channel.item[i].link)); printf(" Description: %s\n", STR(rss->channel.item[i].description)); if (rss->channel.item[i].pubDate) printf(" Posted: %s\n", rss->channel.item[i].pubDate); else if (rss->channel.item[i].dc__date) printf(" Posted: %s\n", ctime(rss->channel.item[i].dc__date)); } printf("\nCopyright: %s\n", STR(rss->channel.copyright)); } else fprintf(stderr, "RSS 0.91, 0.92, or 2.0 content expected\n"); } else soap_print_fault(soap, stderr); soap_end(soap); soap_done(soap); soap_free(soap); return 0; } static void docwrite0(struct soap *soap, const char *s) { soap_send3(soap, "document.write(\"", s, "\");\n"); } static void docwrite1(struct soap *soap, const char *s1, const char *s2, const char *s3) { soap_send2(soap, "document.write(\"", s1); strwrite(soap, s2); soap_send2(soap, s3, "\");\n"); } static void docwrite2(struct soap *soap, const char *s1, const char *s2, const char *s3, const char *s4, const char *s5) { soap_send2(soap, "document.write(\"", s1); strwrite(soap, s2); soap_send(soap, s3); strwrite(soap, s4); soap_send2(soap, s5, "\");\n"); } static void docerror(struct soap *soap, const char *s) { soap_begin_send(soap); soap->http_content = "application/javascript"; soap_response(soap, SOAP_FILE); soap_send(soap, s); soap_end_send(soap); } static void strwrite(struct soap *soap, const char *s) { while (*s) { const char *t; for (t = s; *t; t++) if (*t == '\\' || *t == '"' || *t == '\n') break; soap_send_raw(soap, s, t - s); if (*t == '\\') { soap_send(soap, "\\\\"); t++; } else if (*t == '"') { soap_send(soap, "\\\""); t++; } else if (*t == '\n') { t++; if (*t == '\n') { soap_send(soap, "

"); /* two line breaks? Probably a new paragraph was intended */ t++; } else soap_send(soap, " "); } s = t; } } static const char *decode_url(char *buf, size_t len, const char *val) { const char *s; char *t; if (!buf) return NULL; for (s = val; *s; s++) if (*s != ' ' && *s != '=') break; if (*s == '"') { t = buf; s++; while (*s && *s != '"' && --len) *t++ = *s++; *t = '\0'; do s++; while (*s && *s != '&' && *s != '='); } else { t = buf; while (*s && *s != '&' && *s != '=' && --len) { switch (*s) { case '+': *t++ = ' '; case ' ': s++; break; case '%': *t++ = ((s[1] >= 'A' ? (s[1]&0x7) + 9 : s[1] - '0') << 4) + (s[2] >= 'A' ? (s[2]&0x7) + 9 : s[2] - '0'); s += 3; break; default: *t++ = *s++; } } *t = '\0'; } if (*s == '&') s++; return s; } static char *query_key(char *buf, size_t len, char **s) { char *t = *s; if (t && *t) { *s = (char*)decode_url(buf, len, t); return buf; } return *s = NULL; } static char *query_val(char *buf, size_t len, char **s) { char *t = *s; if (t && *t == '=') { *s = (char*)decode_url(buf, len, t); return buf; } return NULL; } /* RSS 0.91 doesn't use namespaces, but RSS 2.0 does, which means that soap->namespace=NULL when serializing RSS 0.91 feeds */ struct Namespace namespaces[] = { { "dc", "http://purl.org/dc/elements/1.1/" }, { NULL, NULL } }; gsoap-2.8.91/gsoap/samples/link/0000755000175000017500000000000013525245163016004 5ustar ellertellertgsoap-2.8.91/gsoap/samples/link/gmt.h0000644000175000017500000000055713525245163016753 0ustar ellertellert//gsoap t service name: gmt Get current time client code: `#include "soapH.h" #include "gmt.nsmap" int main() { time_t t; struct soap *soap = soap_new(); soap_call_t__gmt(soap, "http://www.cs.fsu.edu/~engelen/gmtlitserver.cgi", "", &t); printf("The current time is %s\n", ctime(&t)); soap_destroy(soap); soap_end(soap); soap_free(soap); return 0; }` t__gmt(time_t*); gsoap-2.8.91/gsoap/samples/link/xmas.h0000644000175000017500000001515113525245163017130 0ustar ellertellert// Reminder: Modify typemap.dat to customize the header file generated by wsdl2h /* xmas.h Generated by wsdl2h 1.2.9l from xmas.wsdl and typemap.dat 2007-12-30 21:53:07 GMT Copyright (C) 2001-2007 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 schema 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 /******************************************************************************\ * * * http://www.genivia.com/mashup.wsdl * * * \******************************************************************************/ /******************************************************************************\ * * * 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: ns1 = "http://www.genivia.com/mashup.wsdl" ns2 = "urn:daystoxmas" */ //gsoap ns2 schema namespace: urn:daystoxmas //gsoap ns2 schema form: qualified /******************************************************************************\ * * * Schema Types * * * \******************************************************************************/ /// Element "urn:daystoxmas":daystoxmas. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "urn:daystoxmas":commingtotown of complexType. /// "urn:daystoxmas":commingtotown is a complexType. struct _ns2__commingtotown { /// Element days of type xs:int. int days 1; ///< Required element. }; /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap ns1 service name: mashup //gsoap ns1 service type: PortType //gsoap ns1 service port: http://www.cs.fsu.edu/~engelen/mashup.cgi //gsoap ns1 service namespace: http://www.genivia.com/mashup.wsdl //gsoap ns1 service transport: http://schemas.xmlsoap.org/soap/http /** @mainpage Service Definitions @section Service_bindings Bindings - @ref mashup */ /** @page mashup Binding "mashup" @section mashup_operations Operations of Binding "mashup" - @ref __ns1__dtx @section mashup_ports Endpoints of Binding "mashup" - http://www.cs.fsu.edu/~engelen/mashup.cgi Note: use wsdl2h option -N to change the service binding prefix name */ /******************************************************************************\ * * * mashup * * * \******************************************************************************/ /******************************************************************************\ * * * __ns1__dtx * * * \******************************************************************************/ /// Operation "__ns1__dtx" of service binding "mashup" /** Operation details: - SOAP document/literal style C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__dtx( 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: _XML ns2__daystoxmas, // response parameters: struct _ns2__commingtotown* ns2__commingtotown ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__dtx( struct soap *soap, // request parameters: _XML ns2__daystoxmas, // response parameters: struct _ns2__commingtotown* ns2__commingtotown ); @endcode */ //gsoap ns1 service method-style: dtx document //gsoap ns1 service method-encoding: dtx literal //gsoap ns1 service method-action: dtx "" int __ns1__dtx( _XML ns2__daystoxmas, ///< Request parameter struct _ns2__commingtotown* ns2__commingtotown ///< Response parameter ); /* End of xmas.h */ gsoap-2.8.91/gsoap/samples/link/env.h0000644000175000017500000000213413525245163016745 0ustar ellertellert/* env.h Defines SOAP-ENV Header and Fault global structures shared by client and service modules to process SOAP headers and faults when combining multiple client and/or services into one executable. Defines SOAP Fault and SOAP Header structures, which will be shared by client and service modules. The Header structure should contain all fields required by the clients and services. To obtain these, look into the wsdl2h-generated .h files for struct SOAP_ENV__Header and struct SOAP_ENV__Detail. Copy these below to make them globally visible to the gSOAP engine and plugins. Copyright (C) 2000-2016 Robert A. van Engelen, Genivia inc. All Rights Reserved. Compile in C: soapcpp2 -c -penv env.h then compile and link envC.c with your project Compile in C++ with C++ namespaces: soapcpp2 -qenv env.h then compile and link envC.cpp with your project When including envH.h in your project, include envH.h as the last: #include "abcH.h" #include "xyzH.h" #include "envH.h" */ #import "header.h" // optional user-defined headers #import "fault.h" // optional user-defined fault details gsoap-2.8.91/gsoap/samples/link/Makefile0000644000175000017500000000302413525245163017443 0ustar ellertellert# Simple Makefile for C example with muliple client linkage WSDL2H=../../wsdl/wsdl2h GSOAP=../../src/soapcpp2 SOAPH=../../stdsoap2.h SOAPC=../../stdsoap2.c SOAPCPP=../../stdsoap2.cpp SOAPDOMC=../../dom.c SOAPDOMCPP=../../dom.cpp CC=gcc CPP=g++ LIBS= COFLAGS=-O2 CWFLAGS=-Wall CIFLAGS=-I.. -I../.. CMFLAGS= CFLAGS= $(CWFLAGS) $(COFLAGS) $(CIFLAGS) $(CMFLAGS) all: xmas xmas: xmas.c envC.o stdsoap2.o gmtClientLib.o calcClientLib.o xmasServerLib.o $(CC) $(CFLAGS) -o xmas xmas.c envC.o stdsoap2.o gmtClientLib.o calcClientLib.o xmasServerLib.o stdsoap2.o: $(SOAPH) $(SOAPC) $(CC) $(CFLAGS) -DWITH_NONAMESPACES -c $(SOAPC) envC.o: env.h header.h fault.h $(GSOAP) -c -CS -penv env.h $(CC) $(CFLAGS) -c envC.c gmtClientLib.c: gmt.h $(GSOAP) -c -C -n -pgmt gmt.h gmtClientLib.o: gmtClientLib.c $(CC) $(CFLAGS) -c gmtClientLib.c calcClientLib.c:calc.h $(GSOAP) -c -C -n -pcalc calc.h calcClientLib.o:calcClientLib.c $(CC) $(CFLAGS) -c calcClientLib.c xmasServerLib.c:xmas.h $(GSOAP) -c -S -n -pxmas xmas.h xmasServerLib.o:xmasServerLib.c $(CC) $(CFLAGS) -c xmasServerLib.c xmas.h: xmas.wsdl $(WSDL2H) -c xmas.wsdl .PHONY: clean distclean clean: rm -f *.o soapH.h soapStub.h soapC.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp soap*Proxy.h soap*Proxy.cpp soap*Service.h soap*Service.cpp distclean: rm -f *.o soapH.h soapStub.h soapC.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp soap*Proxy.h soap*Proxy.cpp soap*Service.h soap*Service.cpp rm -f *.xsd *.xml *.nsmap *.log rm -f xmas gsoap-2.8.91/gsoap/samples/link/xmas.wsdl0000644000175000017500000000426613525245163017657 0ustar ellertellert gsoap-2.8.91/gsoap/samples/link/xmas.c0000644000175000017500000000720413525245163017123 0ustar ellertellert/* xmas.c Example CGI service with multiple C client static linkage To generate non-client-server header and fault handlers: $ soapcpp2 -c -CS -penv env.h The gmt client: $ soapcpp2 -c -C -n -pgmt gmt.h The calc client: $ soapcpp2 -c -C -n -pcalc calc.h The xmas server: $ soapcpp2 -c -S -n -pxmas xmas.h cc -o xmas.cgi xmas.c stdsoap2.c envC.c xmasServerLib.c gmtClientLib.c calcClientLib.c The namespace table must include all proper namespace bindings. When multiple namespace tables are used, then the namespace tables can be reset using soap_set_namespaces() -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "envH.h" #include "gmtH.h" #include "calcH.h" #include "xmasH.h" #include "gmt.nsmap" #include "calc.nsmap" #include "xmas.nsmap" int main() { struct soap soap; soap_init(&soap); soap_set_namespaces(&soap, xmas_namespaces); return xmas_serve(&soap); } /******************************************************************************\ * * Server operation * \******************************************************************************/ int __ns1__dtx(struct soap *soap, _XML x, struct _ns2__commingtotown *response) { struct soap *csoap = soap_copy(soap); struct tm tm; time_t now, xmas; double sec, days; soap_set_namespaces(csoap, gmt_namespaces); if (soap_call_t__gmt(csoap, "http://www.cs.fsu.edu/~engelen/gmtlitserver.cgi", NULL, &now)) { soap_end(csoap); soap_free(csoap); return soap_receiver_fault(soap, "Cannot connect to GMT server", NULL); } tm.tm_sec = 0; tm.tm_min = 0; tm.tm_hour = 0; tm.tm_mday = 25; tm.tm_mon = 11; tm.tm_year = gmtime(&now)->tm_year; /* this year */ tm.tm_isdst = 0; tm.tm_zone = NULL; xmas = soap_timegm(&tm); if (xmas < now) { tm.tm_year++; /* xmas just passed, go to next year */ xmas = soap_timegm(&tm); } sec = difftime(xmas, now); soap_set_namespaces(csoap, calc_namespaces); if (soap_call_ns__add(csoap, NULL, NULL, sec, 86400, &days)) { soap_end(csoap); soap_free(csoap); return soap_receiver_fault(soap, "Cannot connect to calc server", NULL); } soap_end(csoap); soap_free(csoap); response->days = (int)days; return SOAP_OK; } /* dummy namespaces to prevent link errors when not using WITH_NONAMSPACES */ SOAP_NMAC struct Namespace namespaces[] = { {NULL, NULL, NULL, NULL} }; gsoap-2.8.91/gsoap/samples/link/README.txt0000644000175000017500000000330113525245163017477 0ustar ellertellert How to combine multiple clients and servers into one executable? 1. Run wsdl2h once on all WSDLs together. The wsdl2h tool can import multiple WSDL files at once to combine multiple clients and service into one executable. See the samples/mashup and samples/mashup++ examples. 2. Run wsdl2h on each WSDL and use soapcpp2 compiler options. If there is a need to build clients and services from multiple gSOAP header files, then an alternative approach is required demonstrated by the material included in this part of the gSOAP package. The advantages of #1 is that you end up with smaller code, because redundant definitions are eliminated. The advantage of #2 is a more modular setup, thus supporting dynamic linking of separately compiled service modules. However, the build process requires additional steps depending on C or C++. The C++ project build process is simpler, because C++ namespaces can be used to separate the definitions as is shown in the samples/link++ example. The C examples in this directory illustrate how multiple clients and services can be compiled and linked into one executable from multiple gSOAP header files. The C examples accomplish this by static linkage. When linking multiple soapcpp2-generated files, a single file with shared SOAP Header definitions is required. This means that all SOAP Header members must be collected into a single SOAP Header definition. Similar requirements are needed for SOAP Faults (SOAP Fault details to be more precise). So the first step is to generate header and fault handlers: $ soapcpp2 -c -CS -penv env.h Then each file.h is compiled with: $ soapcp2 -c -p .h Compile the ClientLib.c or ServerLib.c code. gsoap-2.8.91/gsoap/samples/link/header.h0000644000175000017500000000120413525245163017402 0ustar ellertellert/* header.h Example SOAP Header definitions, to demonstrate the use of env.h. This file defines the SOAP Header data structure shared by client and service modules Copyright (C) 2000-2002 Robert A. van Engelen. All Rights Reserved. */ //gsoap h schema namespace: http://websrv.cs.fsu.edu/~engelen/h.xsd // h:authentication type of SOAP Header element struct h__authentication { @char *userid; // userid XML attribute @char *passwd; // passwd XML attribute }; // add the above to the SOAP Header elements: struct SOAP_ENV__Header { struct h__authentication *h__credentials; // rendered as XML }; gsoap-2.8.91/gsoap/samples/link/calc.h0000644000175000017500000001054613525245163017065 0ustar ellertellert/* calc.h This is a gSOAP header file with a calculator data binding and Web service interface to implement clients and services The service operations and type definitions use familiar C/C++ syntax. The following methods are defined by this gSOAP service definition: add(a,b) sub(a,b) mul(a,b) div(a,b) pow(a,b) Build steps for C (see samples/calc): $ soapcpp2 -c -r calc.h $ cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c $ cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c Build steps for C++ (see samples/calc++): $ soapcpp2 -j -r calc.h $ c++ -o calcclient++ calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp $ c++ -o calcserver++ calcserver.cpp stdsoap2.cpp soapC.cpp soapcalcService.cpp Option -r generates a soapReadme.md report. Note that soapcpp2 option -j generates proxy and service classes, which encapsulate the method operations in the class instead of defining them as global functions as in C. The //gsoap directives are used to bind XML namespaces and to define Web service properties: //gsoap service name: //gsoap service style: [rpc|document] //gsoap service encoding: [literal|encoded] //gsoap service namespace: //gsoap service location: Web service operation properties: //gsoap service method-style: [rpc|document] //gsoap service method-encoding: [literal|encoded] //gsoap service method-action: //gsoap service method-documentation: and type schema properties: //gsoap schema namespace: //gsoap schema elementForm: [qualified|unqualified] //gsoap schema attributeForm: [qualified|unqualified] //gsoap schema documentation: //gsoap schema type-documentation: where is an XML namespace prefix, which is used in C/C++ operation names, e.g. ns__add(), and type names, e.g. xsd__int. See the documentation for the full list of //gsoap directives. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: calc Simple calculator service described at https://www.genivia.com/dev.html //gsoap ns service protocol: SOAP //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns schema namespace: urn:calc //gsoap ns service method: add Sums two values int ns__add(double a, double b, double *result); //gsoap ns service method: sub Subtracts two values int ns__sub(double a, double b, double *result); //gsoap ns service method: mul Multiplies two values int ns__mul(double a, double b, double *result); //gsoap ns service method: div Divides two values int ns__div(double a, double b, double *result); //gsoap ns service method: pow Raises a to b int ns__pow(double a, double b, double *result); gsoap-2.8.91/gsoap/samples/link/fault.h0000644000175000017500000000234613525245163017275 0ustar ellertellert/* fault.h Example SOAP Fault detail definitions, to demonstrate the use of env.h. Defines optional SOAP Fault derail data structures Copyright (C) 2000-2004 Robert A. van Engelen. All Rights Reserved. */ /* Add any data structure you want to serialize as part of the SOAP Fault detail element. The detail element '__type' and 'value' fields should be set to transmit data. The fields are set when data of corresponding types are received. For example, we define an of name with a string vector (note the leading _ in the following declaration): class _f__myData { public: std::vector *data; }; To return a fault from your service application: soap_sender_fault(soap, "An error occurred", NULL)); // set soap fault soap->fault->detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail)); soap->fault->detail->__type = SOAP_TYPE__f__myData; soap->fault->detail->value = soap_new__f__myData(soap, -1); return SOAP_FAULT; In addition, you can modify the SOAP_ENV__Detail struct and add your own set of fields, as in: struct SOAP_ENV__Detail { struct f__myDataType f__myData; int __type; void *value; char *__any; // or use '_XML __any' to store literal XML content }; */ gsoap-2.8.91/gsoap/samples/polytest/0000755000175000017500000000000013525245200016722 5ustar ellertellertgsoap-2.8.91/gsoap/samples/polytest/.deps/0000755000175000017500000000000013525245200017733 5ustar ellertellertgsoap-2.8.91/gsoap/samples/polytest/Makefile.in0000644000175000017500000005016513525245163021006 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = polytest.cgi$(EXEEXT) subdir = gsoap/samples/polytest ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am__objects_4 = $(am__objects_3) soapServer.$(OBJEXT) $(am__objects_1) \ $(am__objects_1) am_polytest_cgi_OBJECTS = polymorph.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) polytest_cgi_OBJECTS = $(am_polytest_cgi_OBJECTS) polytest_cgi_LDADD = $(LDADD) am__DEPENDENCIES_1 = polytest_cgi_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/polymorph.Po ./$(DEPDIR)/soapC.Po \ ./$(DEPDIR)/soapClient.Po ./$(DEPDIR)/soapServer.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(polytest_cgi_SOURCES) DIST_SOURCES = $(polytest_cgi_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.cpp_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = polymorph.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = polymorph.nsmap polymorph.wsdl polytest_cgi_SOURCES = polymorph.cpp $(SOAPHEADER) $(SOAP_CPP_SRC) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/polytest/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/polytest/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) polytest.cgi$(EXEEXT): $(polytest_cgi_OBJECTS) $(polytest_cgi_DEPENDENCIES) $(EXTRA_polytest_cgi_DEPENDENCIES) @rm -f polytest.cgi$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(polytest_cgi_OBJECTS) $(polytest_cgi_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/polymorph.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/polymorph.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/polymorph.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/polytest/polymorph.cpp0000644000175000017500000001175213525245163021475 0ustar ellertellert/* polymorph.cpp Polymorphic object exchange example. This application is both a client and CGI-based server to demonstrate object exchange (derived types + overriding) Server: install as CGI. Client: invoke from the command line, for example: $ polytest.cgi o $ polytest.cgi s $ polytest.cgi q $ polytest.cgi l Modify the server string below to target your server URL endpoint. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" const char *server = "http://www.cs.fsu.edu/~engelen/polytest2.cgi"; using namespace std; int main(int argc, char **argv) { struct soap soap; ns__polytestResponse r; soap_init(&soap); if (argc <= 1) soap_serve(&soap); // if no args, act as a CGI Web service else { switch (*argv[1]) { case 'o': { ns__Object o("SOAP"); cout << "Sending: "; o.print(); soap_call_ns__polytest(&soap, server, "", &o, r); break; } case 's': { ns__Shape s("Triangle", 3); cout << "Sending: "; s.print(); soap_call_ns__polytest(&soap, server, "", &s, r); break; } case 'q': { ns__Shape q("Cubicle", 2); cout << "Sending: "; q.print(); soap_call_ns__polytest(&soap, server, "", &q, r); break; } case 'l': { ns__List l(4); l[0] = new ns__Object("SOAP"); l[1] = new ns__Shape("Triangle", 3); l[2] = new ns__Square("Cubicle", 2); ns__List l2(1); l[3] = &l2; l2[0] = new ns__Object("End"); cout << "Sending: "; l.print(); soap_call_ns__polytest(&soap, server, "", &l, r); break; } default: fprintf(stderr, "Unknown command\nPlease use 'o', 's', 'q', or 'l'\n"); return -1; } if (soap.error) soap_print_fault(&soap, stderr); else { cout << "Received: "; r.out->print(); } } return 0; } ns__Object::ns__Object() { name = (char*)"Object"; } ns__Object::ns__Object(const char *name) { this->name = (char*)name; } ns__Object::~ns__Object() { } void ns__Object::print() { cout << "Object: " << (name?name:"") << endl; } ns__Shape::ns__Shape() { name = (char*)"Shape"; sides = 0; } ns__Shape::ns__Shape(const char *name, int sides) { this->name = (char*)name; this->sides = sides; } ns__Shape::~ns__Shape() { } void ns__Shape::print() { cout << "Shape: " << (name?name:"") << " sides=" << sides << endl; } ns__Square::ns__Square() { name = (char*)"Square"; ns__Shape::sides = 4; } ns__Square::ns__Square(const char *name, int size) { this->name = (char*)name; this->size = size; ns__Shape::sides = 4; } ns__Square::~ns__Square() { } void ns__Square::print() { cout << "Square: " << (name?name:"") << " size=" << size << endl; } ns__List::ns__List() { __ptr = 0; __size = 0; } ns__List::ns__List(int size) { __ptr = (ns__Object**)malloc(size*sizeof(ns__Object*)); __size = size; } ns__List::~ns__List() { } ns__Object*& ns__List::operator[](int i) { return __ptr[i]; } void ns__List::print() { cout << "List: [" << endl; for (int i = 0; i < __size; i++) __ptr[i]->print(); cout << "]" << endl; } // Web service remote method implementation: int ns__polytest(struct soap *soap, ns__Object *in, struct ns__polytestResponse &result) { result.out = in; return SOAP_OK; } 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/2000/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL}, {"xsd", "http://www.w3.org/2000/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL}, {"ns", "urn:copy"}, {NULL, NULL} }; gsoap-2.8.91/gsoap/samples/polytest/polymorph.h0000644000175000017500000000530213525245163021134 0ustar ellertellert/* polymorph.h Polymorphic object exchange example. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: polymorph //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/polymorph.wsdl //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/polytest.cgi //gsoap ns schema namespace: urn:copy class ns__Object { public: char *name; ns__Object(); ns__Object(const char *name); virtual ~ns__Object(); virtual void print(); }; class ns__Shape: public ns__Object { public: char *name; // test overriding, both the ns__Object:name and ns__Shape:name are encoded int sides; ns__Shape(); ns__Shape(const char *name, int sides); virtual ~ns__Shape(); virtual void print(); }; class ns__Square: public ns__Shape { public: char *name; // test overriding static const int sides = 4; // will not be endoded and decoded int size; ns__Square(); ns__Square(const char *name, int size); virtual ~ns__Square(); virtual void print(); }; class ns__List: public ns__Object // ns__List is a dynamic array { public: ns__Object **__ptr; // array of pointers to objects int __size; ns__List(); ns__List(int size); virtual ~ns__List(); virtual ns__Object*& operator[](int i); virtual void print(); }; ns__polytest(ns__Object *in, struct ns__polytestResponse { ns__Object *out; } &result); gsoap-2.8.91/gsoap/samples/polytest/Makefile.am0000644000175000017500000000072213525245163020767 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = polytest.cgi SOAPHEADER = polymorph.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = polymorph.nsmap polymorph.wsdl polytest_cgi_SOURCES = polymorph.cpp $(SOAPHEADER) $(SOAP_CPP_SRC) gsoap-2.8.91/gsoap/samples/Makefile.in0000644000175000017500000004536313525245163017127 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gsoap/samples ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir distdir-am am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = foreign 1.4 SUBDIRS = \ autotest aws calc calc++ databinding dime dom oneway oneway++ \ factory factorytest \ gmt googleapi hello httpcookies lu magic mashup mashup++ \ chaining chaining++ primes \ mtom mtom-stream polytest roll router atom rss ssl template udp varparam \ wsa wsrm wsse wst xml-rpc-json rest testmsgr async all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic cscopelist-am ctags ctags-am \ distclean distclean-generic distclean-tags distdir dvi dvi-am \ html html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/Makefile.cpp_proxy_rules_j0000644000175000017500000000102613525245163022253 0ustar ellertellert## common Makefile rules for building the C++ - soap samples ## SOAP_CPP_SRC = $(SOAP_H_FILES) $(SOAP_NS) $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -j -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ gsoap-2.8.91/gsoap/samples/hello/0000755000175000017500000000000013525245174016154 5ustar ellertellertgsoap-2.8.91/gsoap/samples/hello/.deps/0000755000175000017500000000000013525245174017165 5ustar ellertellertgsoap-2.8.91/gsoap/samples/hello/Makefile.in0000644000175000017500000005156113525245163020227 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = helloclient$(EXEEXT) helloserver$(EXEEXT) subdir = gsoap/samples/hello ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am_helloclient_OBJECTS = helloclient.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) helloclient_OBJECTS = $(am_helloclient_OBJECTS) am__DEPENDENCIES_1 = helloclient_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) am__objects_4 = soapServer.$(OBJEXT) $(am__objects_2) am_helloserver_OBJECTS = helloserver.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) helloserver_OBJECTS = $(am_helloserver_OBJECTS) helloserver_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/helloclient.Po \ ./$(DEPDIR)/helloserver.Po ./$(DEPDIR)/soapC.Po \ ./$(DEPDIR)/soapClient.Po ./$(DEPDIR)/soapServer.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(helloclient_SOURCES) $(helloserver_SOURCES) DIST_SOURCES = $(helloclient_SOURCES) $(helloserver_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.cpp_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = hello.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = h.nsmap h.wsdl helloclient_SOURCES = helloclient.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) helloclient_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) helloserver_SOURCES = helloserver.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) helloserver_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/hello/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/hello/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) helloclient$(EXEEXT): $(helloclient_OBJECTS) $(helloclient_DEPENDENCIES) $(EXTRA_helloclient_DEPENDENCIES) @rm -f helloclient$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(helloclient_OBJECTS) $(helloclient_LDADD) $(LIBS) helloserver$(EXEEXT): $(helloserver_OBJECTS) $(helloserver_DEPENDENCIES) $(EXTRA_helloserver_DEPENDENCIES) @rm -f helloserver$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(helloserver_OBJECTS) $(helloserver_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/helloclient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/helloserver.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/helloclient.Po -rm -f ./$(DEPDIR)/helloserver.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/helloclient.Po -rm -f ./$(DEPDIR)/helloserver.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/hello/helloclient.cpp0000644000175000017500000000040713525245163021161 0ustar ellertellert#include "soapH.h" #include "h.nsmap" int main() { char *s; struct soap *soap = soap_new(); soap_call_h__hello(soap, "http://www.cs.fsu.edu/~engelen/hellolitserver.cgi", "", s); printf("%s\n", s); soap_destroy(soap); soap_end(soap); soap_free(soap); return 0; } gsoap-2.8.91/gsoap/samples/hello/helloserver.cpp0000644000175000017500000000027113525245163021210 0ustar ellertellert#include "soapH.h" #include "h.nsmap" int main() { return soap_serve(soap_new()); } int h__hello(struct soap *soap, char *&s) { s = soap_strdup(soap, "Hello World!"); return SOAP_OK; } gsoap-2.8.91/gsoap/samples/hello/README.txt0000644000175000017500000000103113525245163017643 0ustar ellertellertThis directory contains a "one-liner" service: gSOAP Web service and client applications that are only one line long (not counting the usual #includes). The oneliners are small, but they can do a number of useful things. The complete list of oneliners is: samples/gmt return current time in GMT samples/hello "Hello World!" samples/roll rolling a die You can use the client programs right away after compilation since they connect to our server. To run the server examples you have to install them as CGI applications. gsoap-2.8.91/gsoap/samples/hello/Makefile.am0000644000175000017500000000120613525245163020205 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = helloclient helloserver SOAPHEADER = hello.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = h.nsmap h.wsdl helloclient_SOURCES = helloclient.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) helloclient_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) helloserver_SOURCES = helloserver.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) helloserver_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) gsoap-2.8.91/gsoap/samples/hello/hello.h0000644000175000017500000000002213525245163017420 0ustar ellertellerth__hello(char*&); gsoap-2.8.91/gsoap/samples/varparam/0000755000175000017500000000000013525245202016652 5ustar ellertellertgsoap-2.8.91/gsoap/samples/varparam/.deps/0000755000175000017500000000000013525245202017663 5ustar ellertellertgsoap-2.8.91/gsoap/samples/varparam/Makefile.in0000644000175000017500000004777013525245163020744 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = varparam$(EXEEXT) subdir = gsoap/samples/varparam ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am_varparam_OBJECTS = varparam.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) soapServer.$(OBJEXT) varparam_OBJECTS = $(am_varparam_OBJECTS) varparam_LDADD = $(LDADD) am__DEPENDENCIES_1 = varparam_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/soapC.Po ./$(DEPDIR)/soapClient.Po \ ./$(DEPDIR)/soapServer.Po ./$(DEPDIR)/varparam.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(varparam_SOURCES) DIST_SOURCES = $(varparam_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.cpp_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = varparam.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = varparam.nsmap varparam.wsdl varparam_SOURCES = varparam.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) soapServer.cpp all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/varparam/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/varparam/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) varparam$(EXEEXT): $(varparam_OBJECTS) $(varparam_DEPENDENCIES) $(EXTRA_varparam_DEPENDENCIES) @rm -f varparam$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(varparam_OBJECTS) $(varparam_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/varparam.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f ./$(DEPDIR)/varparam.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f ./$(DEPDIR)/varparam.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/varparam/README.txt0000644000175000017500000000032513525245163020356 0ustar ellertellertVariable polymorphic parameter passing example. The SOAP specification supports variable parameter lists. In addition, parameters can be polymorphic. Both features are demonstrated in this example in C and C++. gsoap-2.8.91/gsoap/samples/varparam/varparam.h0000644000175000017500000002076713525245163020656 0ustar ellertellert/* varparam.h Example use of variable parameter lists with the full XML schema type hierarchy implemented as a C++ class hierarchy. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: varparam //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: urn:varparam //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/varparam.cgi #include extern class std::ostream; // transient (external) type class xsd__anyType { public: char *__item; // default is string, also to hold mixed-content struct soap *soap; // points to current gSOAP environment that created this object xsd__anyType(); virtual ~xsd__anyType(); virtual xsd__anyType*& operator[](int i); virtual void print(std::ostream &s) const; }; class xsd__anySimpleType: public xsd__anyType { public: xsd__anySimpleType(); virtual ~xsd__anySimpleType(); virtual void print(std::ostream &s) const; }; class xsd__anyURI: public xsd__anySimpleType { public: xsd__anyURI(); virtual ~xsd__anyURI(); xsd__anyURI(char *s); virtual void print(std::ostream &s) const; }; class xsd__boolean: public xsd__anySimpleType { public: bool __item; xsd__boolean(); virtual ~xsd__boolean(); xsd__boolean(bool b); virtual void print(std::ostream &s) const; }; class xsd__date: public xsd__anySimpleType // requires "CCYY-MM-DD" string values { public: xsd__date(); virtual ~xsd__date(); xsd__date(char *s); virtual void print(std::ostream &s) const; }; class xsd__dateTime: public xsd__anySimpleType { public: time_t __item; // remove time_t __item to use char*__item with "CCYY-MM-DDThh:mm:ssi" for dates outside the range 1902-2037 xsd__dateTime(); virtual ~xsd__dateTime(); xsd__dateTime(time_t t); virtual void print(std::ostream &s) const; }; class xsd__double: public xsd__anySimpleType { public: double __item; xsd__double(); virtual ~xsd__double(); xsd__double(double d); virtual void print(std::ostream &s) const; }; class xsd__duration: public xsd__anySimpleType // requires "PnYnMnDTnHnMnS" string values { public: xsd__duration(); virtual ~xsd__duration(); xsd__duration(char *s); virtual void print(std::ostream &s) const; }; class xsd__float: public xsd__anySimpleType { public: float __item; xsd__float(); virtual ~xsd__float(); xsd__float(float f); virtual void print(std::ostream &s) const; }; class xsd__time: public xsd__anySimpleType // requires "hh:mm:ss" string values { public: xsd__time(); virtual ~xsd__time(); xsd__time(char *s); virtual void print(std::ostream &s) const; }; class xsd__string: public xsd__anySimpleType { public: xsd__string(); xsd__string(char *s); virtual ~xsd__string(); virtual void print(std::ostream &s) const; }; class xsd__normalizedString: public xsd__string // requires strings without CR, LF, TAB { public: xsd__normalizedString(); xsd__normalizedString(char *s); virtual ~xsd__normalizedString(); virtual void print(std::ostream &s) const; }; class xsd__token: public xsd__normalizedString // requires strings without CR, LF, TAB, no leading/trailing spaces, and no sequences of more than one space { public: xsd__token(); xsd__token(char *s); virtual ~xsd__token(); virtual void print(std::ostream &s) const; }; class xsd__decimal: public xsd__anySimpleType // requires decimal as string values, can use double, but possible loss of precision { public: xsd__decimal(); virtual ~xsd__decimal(); xsd__decimal(char *s); virtual void print(std::ostream &s) const; }; class xsd__integer: public xsd__decimal // requires integer as string values, can use loong long, but possible loss of data { public: xsd__integer(); virtual ~xsd__integer(); xsd__integer(char *s); virtual void print(std::ostream &s) const; }; class xsd__nonPositiveInteger: public xsd__integer // requires non-positive integer as string values { public: xsd__nonPositiveInteger(); virtual ~xsd__nonPositiveInteger(); xsd__nonPositiveInteger(char *s); virtual void print(std::ostream &s) const; }; class xsd__negativeInteger: public xsd__nonPositiveInteger // requires negative integer as string values { public: xsd__negativeInteger(); virtual ~xsd__negativeInteger(); xsd__negativeInteger(char *s); virtual void print(std::ostream &s) const; }; class xsd__nonNegativeInteger: public xsd__integer // requires non-negative integer as string values { public: xsd__nonNegativeInteger(); virtual ~xsd__nonNegativeInteger(); xsd__nonNegativeInteger(char *s); virtual void print(std::ostream &s) const; }; class xsd__positiveInteger: public xsd__nonNegativeInteger // requires positive integer as string values { public: xsd__positiveInteger(); virtual ~xsd__positiveInteger(); xsd__positiveInteger(char *s); virtual void print(std::ostream &s) const; }; class xsd__long: public xsd__integer { public: LONG64 __item; xsd__long(); virtual ~xsd__long(); xsd__long(LONG64 ll); virtual void print(std::ostream &s) const; }; class xsd__int: public xsd__long { public: int __item; xsd__int(); virtual ~xsd__int(); xsd__int(int i); virtual void print(std::ostream &s) const; }; class xsd__short: public xsd__int { public: short __item; xsd__short(); virtual ~xsd__short(); xsd__short(short h); virtual void print(std::ostream &s) const; }; class xsd__byte: public xsd__short { public: char __item; xsd__byte(); virtual ~xsd__byte(); xsd__byte(char c); virtual void print(std::ostream &s) const; }; class xsd__unsignedLong: public xsd__nonNegativeInteger { public: ULONG64 __item; xsd__unsignedLong(); virtual ~xsd__unsignedLong(); xsd__unsignedLong(ULONG64 ull); virtual void print(std::ostream &s) const; }; class xsd__unsignedInt: public xsd__unsignedLong { public: unsigned int __item; xsd__unsignedInt(); virtual ~xsd__unsignedInt(); xsd__unsignedInt(unsigned int ui); virtual void print(std::ostream &s) const; }; class xsd__unsignedShort: public xsd__unsignedInt { public: unsigned short __item; xsd__unsignedShort(); virtual ~xsd__unsignedShort(); xsd__unsignedShort(unsigned short uh); virtual void print(std::ostream &s) const; }; class xsd__unsignedByte: public xsd__unsignedShort { public: unsigned char __item; xsd__unsignedByte(); virtual ~xsd__unsignedByte(); xsd__unsignedByte(unsigned char uc); virtual void print(std::ostream &s) const; }; class xsd__base64Binary: public xsd__anySimpleType { public: unsigned char *__ptr; int __size; xsd__base64Binary(); virtual ~xsd__base64Binary(); xsd__base64Binary(char *s); virtual void print(std::ostream &s) const; }; class xsd__hexBinary: public xsd__anySimpleType { public: unsigned char *__ptr; int __size; xsd__hexBinary(); virtual ~xsd__hexBinary(); xsd__hexBinary(char *s); virtual void print(std::ostream &s) const; }; class array: public xsd__anyType { public: xsd__anyType **__ptr; int __size; array(); virtual ~array(); array(int n); virtual xsd__anyType*& operator[](int i); virtual void print(std::ostream &s) const; }; int ns__varStringParamTest(int __size, char **param, int &return_); int ns__varPolyParamTest(int __size, xsd__anyType **param, struct ns__varPolyParamTestResponse { int __size; xsd__anyType **param; } &out); gsoap-2.8.91/gsoap/samples/varparam/Makefile.am0000644000175000017500000000073013525245163020714 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = varparam SOAPHEADER = varparam.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = varparam.nsmap varparam.wsdl varparam_SOURCES = varparam.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) soapServer.cpp gsoap-2.8.91/gsoap/samples/varparam/varparam.cpp0000644000175000017500000002747513525245163021214 0ustar ellertellert/* varparam.cpp Example use of variable parameter lists with the full XML schema type hierarchy implemented as a C++ class hierarchy. Demonstrates the use of variable number of parameters and polymorphic parameters. The 'trick' is to use __size parameters. The __size fields can be used in structs/classes to embed arrays. Because a request message of a remote method is essentially a struct, the use of __size in parameters of a method has the effect of sending a variable number of parameters. Run the executable as client from the command line with one argument to test the polymorphic parameter exchange. Run with more arguments to send the arguments as a variable parameter list to the server. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "varparam.nsmap" const char *endpoint = "http://websrv.cs.fsu.edu/~engelen/varparam.cgi"; #define N 100 // max number of parameters int main(int argc, char **argv) { struct soap soap; int n; soap_init(&soap); if (argc < 2) { soap_serve(&soap); soap_destroy(&soap); soap_end(&soap); return 0; } if (argc < 3) { struct ns__varPolyParamTestResponse r; xsd__anyType *p[N]; // array of polymorphic parameters p[0] = new xsd__anyURI((char*)endpoint); p[1] = new xsd__string(argv[1]); p[2] = new xsd__boolean(true); p[3] = new xsd__dateTime(time(NULL)); p[4] = new xsd__double(1234567.89); p[5] = new xsd__base64Binary((char*)"encoded in base64"); p[6] = new xsd__hexBinary((char*)"encoded in hex"); p[7] = new array(4); (*p[7])[0] = new xsd__int(7); (*p[7])[1] = NULL; (*p[7])[2] = new xsd__token((char*)"x"); (*p[7])[3] = p[1]; p[8] = p[1]; n = 9; // actual number of parameters if (soap_call_ns__varPolyParamTest(&soap, endpoint, NULL, n, p, r)) { soap_print_fault(&soap, stderr); } else { std::cout << "Server has echoed:" << std::endl; for (int i = 0; i < r.__size; i++) r.param[i]->print(std::cout); std::cout << std::endl; } delete (*p[7])[0]; delete (*p[7])[2]; for (int i = 0; i <= 7; i++) delete p[i]; } else { if (soap_call_ns__varStringParamTest(&soap, endpoint, "", argc, argv, n)) soap_print_fault(&soap, stderr); else printf("Server has responded to %d strings\n", n); } soap_destroy(&soap); soap_end(&soap); soap_done(&soap); return 0; } //////////////////////////////////////////////////////////////////////////////// // // Remote method implementations // //////////////////////////////////////////////////////////////////////////////// int ns__varStringParamTest(struct soap *soap, int __size, char **param, int &return_) { return_ = __size; return SOAP_OK; } int ns__varPolyParamTest(struct soap *soap, int __size, xsd__anyType **param, struct ns__varPolyParamTestResponse &out) { out.__size = __size; out.param = param; return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // XSD schema class hierarchy // //////////////////////////////////////////////////////////////////////////////// xsd__anyType::xsd__anyType() { soap = NULL; // This will be set by gSOAP environment later (upon deserialization or calling soap_new_X() } xsd__anyType::~xsd__anyType() { soap_unlink(soap, this); // Let gSOAP not deallocate this object again if this object was explicitly removed } xsd__anyType*& xsd__anyType::operator[](int i) { static xsd__anyType *p = this; // trick: we don't expect the operator to be applied, but we need a method return p; } void xsd__anyType::print(std::ostream &s) const { s << ""; } xsd__anySimpleType::xsd__anySimpleType() { } xsd__anySimpleType::~xsd__anySimpleType() { } void xsd__anySimpleType::print(std::ostream &s) const { s << ""; } xsd__anyURI::xsd__anyURI() { } xsd__anyURI::~xsd__anyURI() { } xsd__anyURI::xsd__anyURI(char *s) { __item = s; } void xsd__anyURI::print(std::ostream &s) const { s << ""; } xsd__boolean::xsd__boolean() { } xsd__boolean::~xsd__boolean() { } xsd__boolean::xsd__boolean(bool b) { __item = b; } void xsd__boolean::print(std::ostream &s) const { s << ""; } xsd__date::xsd__date() { } xsd__date::~xsd__date() { } xsd__date::xsd__date(char *s) { __item = s; } void xsd__date::print(std::ostream &s) const { s << ""; } xsd__dateTime::xsd__dateTime() { } xsd__dateTime::~xsd__dateTime() { } xsd__dateTime::xsd__dateTime(time_t t) { __item = t; } void xsd__dateTime::print(std::ostream &s) const { s << ""; } xsd__double::xsd__double() { } xsd__double::~xsd__double() { } xsd__double::xsd__double(double d) { __item = d; } void xsd__double::print(std::ostream &s) const { s << ""; } xsd__duration::xsd__duration() { } xsd__duration::~xsd__duration() { } xsd__duration::xsd__duration(char *s) { __item = s; } void xsd__duration::print(std::ostream &s) const { s << ""; } xsd__float::xsd__float() { } xsd__float::~xsd__float() { } xsd__float::xsd__float(float f) { __item = f; } void xsd__float::print(std::ostream &s) const { s << ""; } xsd__time::xsd__time() { } xsd__time::~xsd__time() { } xsd__time::xsd__time(char *s) { __item = s; } void xsd__time::print(std::ostream &s) const { s << ""; } xsd__string::xsd__string() { } xsd__string::~xsd__string() { } xsd__string::xsd__string(char *s) { __item = s; } void xsd__string::print(std::ostream &s) const { s << ""; } xsd__normalizedString::xsd__normalizedString() { } xsd__normalizedString::~xsd__normalizedString() { } xsd__normalizedString::xsd__normalizedString(char *s) { __item = s; } void xsd__normalizedString::print(std::ostream &s) const { s << ""; } xsd__token::xsd__token() { } xsd__token::~xsd__token() { } xsd__token::xsd__token(char *s) { __item = s; } void xsd__token::print(std::ostream &s) const { s << ""; } xsd__decimal::xsd__decimal() { } xsd__decimal::~xsd__decimal() { } xsd__decimal::xsd__decimal(char *s) { __item = s; } void xsd__decimal::print(std::ostream &s) const { s << ""; } xsd__integer::xsd__integer() { } xsd__integer::~xsd__integer() { } xsd__integer::xsd__integer(char *s) { __item = s; } void xsd__integer::print(std::ostream &s) const { s << ""; } xsd__nonPositiveInteger::xsd__nonPositiveInteger() { } xsd__nonPositiveInteger::~xsd__nonPositiveInteger() { } xsd__nonPositiveInteger::xsd__nonPositiveInteger(char *s) { __item = s; } void xsd__nonPositiveInteger::print(std::ostream &s) const { s << ""; } xsd__negativeInteger::xsd__negativeInteger() { } xsd__negativeInteger::~xsd__negativeInteger() { } xsd__negativeInteger::xsd__negativeInteger(char *s) { __item = s; } void xsd__negativeInteger::print(std::ostream &s) const { s << ""; } xsd__nonNegativeInteger::xsd__nonNegativeInteger() { } xsd__nonNegativeInteger::~xsd__nonNegativeInteger() { } xsd__nonNegativeInteger::xsd__nonNegativeInteger(char *s) { __item = s; } void xsd__nonNegativeInteger::print(std::ostream &s) const { s << ""; } xsd__positiveInteger::xsd__positiveInteger() { } xsd__positiveInteger::~xsd__positiveInteger() { } xsd__positiveInteger::xsd__positiveInteger(char *s) { __item = s; } void xsd__positiveInteger::print(std::ostream &s) const { s << ""; } xsd__long::xsd__long() { } xsd__long::~xsd__long() { } xsd__long::xsd__long(LONG64 ll) { __item = ll; } void xsd__long::print(std::ostream &s) const { s << ""; } xsd__int::xsd__int() { } xsd__int::~xsd__int() { } xsd__int::xsd__int(int i) { __item = i; } void xsd__int::print(std::ostream &s) const { s << ""; } xsd__short::xsd__short() { } xsd__short::~xsd__short() { } xsd__short::xsd__short(short h) { __item = h; } void xsd__short::print(std::ostream &s) const { s << ""; } xsd__byte::xsd__byte() { } xsd__byte::~xsd__byte() { } xsd__byte::xsd__byte(char c) { __item = c; } void xsd__byte::print(std::ostream &s) const { s << ""; } xsd__unsignedLong::xsd__unsignedLong() { } xsd__unsignedLong::~xsd__unsignedLong() { } xsd__unsignedLong::xsd__unsignedLong(ULONG64 ull) { __item = ull; } void xsd__unsignedLong::print(std::ostream &s) const { s << ""; } xsd__unsignedInt::xsd__unsignedInt() { } xsd__unsignedInt::~xsd__unsignedInt() { } xsd__unsignedInt::xsd__unsignedInt(unsigned int ui) { __item = ui; } void xsd__unsignedInt::print(std::ostream &s) const { s << ""; } xsd__unsignedShort::xsd__unsignedShort() { } xsd__unsignedShort::~xsd__unsignedShort() { } xsd__unsignedShort::xsd__unsignedShort(unsigned short uh) { __item = uh; } void xsd__unsignedShort::print(std::ostream &s) const { s << ""; } xsd__unsignedByte::xsd__unsignedByte() { } xsd__unsignedByte::~xsd__unsignedByte() { } xsd__unsignedByte::xsd__unsignedByte(unsigned char uc) { __item = uc; } void xsd__unsignedByte::print(std::ostream &s) const { s << ""; } xsd__base64Binary::xsd__base64Binary() { } xsd__base64Binary::~xsd__base64Binary() { } xsd__base64Binary::xsd__base64Binary(char *s) { __size = strlen(s)+1; __ptr = (unsigned char*)s; } void xsd__base64Binary::print(std::ostream &s) const { s << ""; } xsd__hexBinary::xsd__hexBinary() { } xsd__hexBinary::~xsd__hexBinary() { } xsd__hexBinary::xsd__hexBinary(char *s) { __size = strlen(s)+1; __ptr = (unsigned char*)s; } void xsd__hexBinary::print(std::ostream &s) const { s << ""; } array::array() { } array::~array() { } array::array(int n) { __size = n; __ptr = (xsd__anyType**)soap_malloc(soap, n*sizeof(xsd__anyType*)); } xsd__anyType*& array::operator[](int i) { return __ptr[i]; } void array::print(std::ostream &s) const { s << "print(s); else s << "<[none]>"; s << ">"; } gsoap-2.8.91/gsoap/samples/wsse/0000755000175000017500000000000013525245203016023 5ustar ellertellertgsoap-2.8.91/gsoap/samples/wsse/.deps/0000755000175000017500000000000013525245203017034 5ustar ellertellertgsoap-2.8.91/gsoap/samples/wsse/Makefile.in0000644000175000017500000012571113525245163020104 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = wssedemo$(EXEEXT) wsselite$(EXEEXT) subdir = gsoap/samples/wsse ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = wssedemo-soapC.$(OBJEXT) am__objects_3 = wssedemo-soapClient.$(OBJEXT) $(am__objects_2) am__objects_4 = $(am__objects_3) wssedemo-soapServer.$(OBJEXT) \ $(am__objects_1) $(am__objects_1) am_wssedemo_OBJECTS = wssedemo-wssedemo.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) wssedemo-stdsoap2.$(OBJEXT) \ wssedemo-dom.$(OBJEXT) wssedemo-wsseapi.$(OBJEXT) \ wssedemo-smdevp.$(OBJEXT) wssedemo-mecevp.$(OBJEXT) wssedemo_OBJECTS = $(am_wssedemo_OBJECTS) am__DEPENDENCIES_1 = wssedemo_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) wssedemo_LINK = $(CCLD) $(wssedemo_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ am__objects_5 = soapC.$(OBJEXT) am__objects_6 = soapClient.$(OBJEXT) $(am__objects_5) am__objects_7 = $(am__objects_6) soapServer.$(OBJEXT) $(am__objects_1) \ $(am__objects_1) am_wsselite_OBJECTS = wsselite.$(OBJEXT) $(am__objects_1) \ $(am__objects_7) stdsoap2.$(OBJEXT) wsseapi-lite.$(OBJEXT) wsselite_OBJECTS = $(am_wsselite_OBJECTS) wsselite_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/soapC.Po ./$(DEPDIR)/soapClient.Po \ ./$(DEPDIR)/soapServer.Po ./$(DEPDIR)/stdsoap2.Po \ ./$(DEPDIR)/wsseapi-lite.Po ./$(DEPDIR)/wssedemo-dom.Po \ ./$(DEPDIR)/wssedemo-mecevp.Po ./$(DEPDIR)/wssedemo-smdevp.Po \ ./$(DEPDIR)/wssedemo-soapC.Po \ ./$(DEPDIR)/wssedemo-soapClient.Po \ ./$(DEPDIR)/wssedemo-soapServer.Po \ ./$(DEPDIR)/wssedemo-stdsoap2.Po \ ./$(DEPDIR)/wssedemo-wsseapi.Po \ ./$(DEPDIR)/wssedemo-wssedemo.Po ./$(DEPDIR)/wsselite.Po am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(wssedemo_SOURCES) $(wsselite_SOURCES) DIST_SOURCES = $(wssedemo_SOURCES) $(wsselite_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.c_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = foreign 1.4 SOAPHEADER = wssedemo.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = wssedemo.nsmap wssedemo_CFLAGS = -DWITH_DOM -DWITH_OPENSSL -DWITH_GZIP wssedemo_SOURCES = wssedemo.c $(SOAPHEADER) $(SOAP_C_SRC) ../../stdsoap2.c ../../dom.c ../../plugin/wsseapi.c ../../plugin/smdevp.c ../../plugin/mecevp.c wssedemo_LDADD = $(SAMPLE_SSL_LIBS) $(SAMPLE_EXTRA_LIBS) -lssl -lcrypto -lz wsselite_SOURCES = wsselite.c $(SOAPHEADER) $(SOAP_C_SRC) ../../stdsoap2.c ../../plugin/wsseapi-lite.c wsselite_LDADD = $(SAMPLE_SSL_LIBS) $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/wsse/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/wsse/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) wssedemo$(EXEEXT): $(wssedemo_OBJECTS) $(wssedemo_DEPENDENCIES) $(EXTRA_wssedemo_DEPENDENCIES) @rm -f wssedemo$(EXEEXT) $(AM_V_CCLD)$(wssedemo_LINK) $(wssedemo_OBJECTS) $(wssedemo_LDADD) $(LIBS) wsselite$(EXEEXT): $(wsselite_OBJECTS) $(wsselite_DEPENDENCIES) $(EXTRA_wsselite_DEPENDENCIES) @rm -f wsselite$(EXEEXT) $(AM_V_CCLD)$(LINK) $(wsselite_OBJECTS) $(wsselite_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stdsoap2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsseapi-lite.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wssedemo-dom.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wssedemo-mecevp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wssedemo-smdevp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wssedemo-soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wssedemo-soapClient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wssedemo-soapServer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wssedemo-stdsoap2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wssedemo-wsseapi.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wssedemo-wssedemo.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsselite.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` wssedemo-wssedemo.o: wssedemo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-wssedemo.o -MD -MP -MF $(DEPDIR)/wssedemo-wssedemo.Tpo -c -o wssedemo-wssedemo.o `test -f 'wssedemo.c' || echo '$(srcdir)/'`wssedemo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-wssedemo.Tpo $(DEPDIR)/wssedemo-wssedemo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wssedemo.c' object='wssedemo-wssedemo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-wssedemo.o `test -f 'wssedemo.c' || echo '$(srcdir)/'`wssedemo.c wssedemo-wssedemo.obj: wssedemo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-wssedemo.obj -MD -MP -MF $(DEPDIR)/wssedemo-wssedemo.Tpo -c -o wssedemo-wssedemo.obj `if test -f 'wssedemo.c'; then $(CYGPATH_W) 'wssedemo.c'; else $(CYGPATH_W) '$(srcdir)/wssedemo.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-wssedemo.Tpo $(DEPDIR)/wssedemo-wssedemo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wssedemo.c' object='wssedemo-wssedemo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-wssedemo.obj `if test -f 'wssedemo.c'; then $(CYGPATH_W) 'wssedemo.c'; else $(CYGPATH_W) '$(srcdir)/wssedemo.c'; fi` wssedemo-soapClient.o: soapClient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-soapClient.o -MD -MP -MF $(DEPDIR)/wssedemo-soapClient.Tpo -c -o wssedemo-soapClient.o `test -f 'soapClient.c' || echo '$(srcdir)/'`soapClient.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-soapClient.Tpo $(DEPDIR)/wssedemo-soapClient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapClient.c' object='wssedemo-soapClient.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-soapClient.o `test -f 'soapClient.c' || echo '$(srcdir)/'`soapClient.c wssedemo-soapClient.obj: soapClient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-soapClient.obj -MD -MP -MF $(DEPDIR)/wssedemo-soapClient.Tpo -c -o wssedemo-soapClient.obj `if test -f 'soapClient.c'; then $(CYGPATH_W) 'soapClient.c'; else $(CYGPATH_W) '$(srcdir)/soapClient.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-soapClient.Tpo $(DEPDIR)/wssedemo-soapClient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapClient.c' object='wssedemo-soapClient.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-soapClient.obj `if test -f 'soapClient.c'; then $(CYGPATH_W) 'soapClient.c'; else $(CYGPATH_W) '$(srcdir)/soapClient.c'; fi` wssedemo-soapC.o: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-soapC.o -MD -MP -MF $(DEPDIR)/wssedemo-soapC.Tpo -c -o wssedemo-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-soapC.Tpo $(DEPDIR)/wssedemo-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='wssedemo-soapC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c wssedemo-soapC.obj: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-soapC.obj -MD -MP -MF $(DEPDIR)/wssedemo-soapC.Tpo -c -o wssedemo-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-soapC.Tpo $(DEPDIR)/wssedemo-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='wssedemo-soapC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` wssedemo-soapServer.o: soapServer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-soapServer.o -MD -MP -MF $(DEPDIR)/wssedemo-soapServer.Tpo -c -o wssedemo-soapServer.o `test -f 'soapServer.c' || echo '$(srcdir)/'`soapServer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-soapServer.Tpo $(DEPDIR)/wssedemo-soapServer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapServer.c' object='wssedemo-soapServer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-soapServer.o `test -f 'soapServer.c' || echo '$(srcdir)/'`soapServer.c wssedemo-soapServer.obj: soapServer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-soapServer.obj -MD -MP -MF $(DEPDIR)/wssedemo-soapServer.Tpo -c -o wssedemo-soapServer.obj `if test -f 'soapServer.c'; then $(CYGPATH_W) 'soapServer.c'; else $(CYGPATH_W) '$(srcdir)/soapServer.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-soapServer.Tpo $(DEPDIR)/wssedemo-soapServer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapServer.c' object='wssedemo-soapServer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-soapServer.obj `if test -f 'soapServer.c'; then $(CYGPATH_W) 'soapServer.c'; else $(CYGPATH_W) '$(srcdir)/soapServer.c'; fi` wssedemo-stdsoap2.o: ../../stdsoap2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-stdsoap2.o -MD -MP -MF $(DEPDIR)/wssedemo-stdsoap2.Tpo -c -o wssedemo-stdsoap2.o `test -f '../../stdsoap2.c' || echo '$(srcdir)/'`../../stdsoap2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-stdsoap2.Tpo $(DEPDIR)/wssedemo-stdsoap2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../stdsoap2.c' object='wssedemo-stdsoap2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-stdsoap2.o `test -f '../../stdsoap2.c' || echo '$(srcdir)/'`../../stdsoap2.c wssedemo-stdsoap2.obj: ../../stdsoap2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-stdsoap2.obj -MD -MP -MF $(DEPDIR)/wssedemo-stdsoap2.Tpo -c -o wssedemo-stdsoap2.obj `if test -f '../../stdsoap2.c'; then $(CYGPATH_W) '../../stdsoap2.c'; else $(CYGPATH_W) '$(srcdir)/../../stdsoap2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-stdsoap2.Tpo $(DEPDIR)/wssedemo-stdsoap2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../stdsoap2.c' object='wssedemo-stdsoap2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-stdsoap2.obj `if test -f '../../stdsoap2.c'; then $(CYGPATH_W) '../../stdsoap2.c'; else $(CYGPATH_W) '$(srcdir)/../../stdsoap2.c'; fi` wssedemo-dom.o: ../../dom.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-dom.o -MD -MP -MF $(DEPDIR)/wssedemo-dom.Tpo -c -o wssedemo-dom.o `test -f '../../dom.c' || echo '$(srcdir)/'`../../dom.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-dom.Tpo $(DEPDIR)/wssedemo-dom.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../dom.c' object='wssedemo-dom.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-dom.o `test -f '../../dom.c' || echo '$(srcdir)/'`../../dom.c wssedemo-dom.obj: ../../dom.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-dom.obj -MD -MP -MF $(DEPDIR)/wssedemo-dom.Tpo -c -o wssedemo-dom.obj `if test -f '../../dom.c'; then $(CYGPATH_W) '../../dom.c'; else $(CYGPATH_W) '$(srcdir)/../../dom.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-dom.Tpo $(DEPDIR)/wssedemo-dom.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../dom.c' object='wssedemo-dom.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-dom.obj `if test -f '../../dom.c'; then $(CYGPATH_W) '../../dom.c'; else $(CYGPATH_W) '$(srcdir)/../../dom.c'; fi` wssedemo-wsseapi.o: ../../plugin/wsseapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-wsseapi.o -MD -MP -MF $(DEPDIR)/wssedemo-wsseapi.Tpo -c -o wssedemo-wsseapi.o `test -f '../../plugin/wsseapi.c' || echo '$(srcdir)/'`../../plugin/wsseapi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-wsseapi.Tpo $(DEPDIR)/wssedemo-wsseapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsseapi.c' object='wssedemo-wsseapi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-wsseapi.o `test -f '../../plugin/wsseapi.c' || echo '$(srcdir)/'`../../plugin/wsseapi.c wssedemo-wsseapi.obj: ../../plugin/wsseapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-wsseapi.obj -MD -MP -MF $(DEPDIR)/wssedemo-wsseapi.Tpo -c -o wssedemo-wsseapi.obj `if test -f '../../plugin/wsseapi.c'; then $(CYGPATH_W) '../../plugin/wsseapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsseapi.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-wsseapi.Tpo $(DEPDIR)/wssedemo-wsseapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsseapi.c' object='wssedemo-wsseapi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-wsseapi.obj `if test -f '../../plugin/wsseapi.c'; then $(CYGPATH_W) '../../plugin/wsseapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsseapi.c'; fi` wssedemo-smdevp.o: ../../plugin/smdevp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-smdevp.o -MD -MP -MF $(DEPDIR)/wssedemo-smdevp.Tpo -c -o wssedemo-smdevp.o `test -f '../../plugin/smdevp.c' || echo '$(srcdir)/'`../../plugin/smdevp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-smdevp.Tpo $(DEPDIR)/wssedemo-smdevp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/smdevp.c' object='wssedemo-smdevp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-smdevp.o `test -f '../../plugin/smdevp.c' || echo '$(srcdir)/'`../../plugin/smdevp.c wssedemo-smdevp.obj: ../../plugin/smdevp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-smdevp.obj -MD -MP -MF $(DEPDIR)/wssedemo-smdevp.Tpo -c -o wssedemo-smdevp.obj `if test -f '../../plugin/smdevp.c'; then $(CYGPATH_W) '../../plugin/smdevp.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/smdevp.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-smdevp.Tpo $(DEPDIR)/wssedemo-smdevp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/smdevp.c' object='wssedemo-smdevp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-smdevp.obj `if test -f '../../plugin/smdevp.c'; then $(CYGPATH_W) '../../plugin/smdevp.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/smdevp.c'; fi` wssedemo-mecevp.o: ../../plugin/mecevp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-mecevp.o -MD -MP -MF $(DEPDIR)/wssedemo-mecevp.Tpo -c -o wssedemo-mecevp.o `test -f '../../plugin/mecevp.c' || echo '$(srcdir)/'`../../plugin/mecevp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-mecevp.Tpo $(DEPDIR)/wssedemo-mecevp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/mecevp.c' object='wssedemo-mecevp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-mecevp.o `test -f '../../plugin/mecevp.c' || echo '$(srcdir)/'`../../plugin/mecevp.c wssedemo-mecevp.obj: ../../plugin/mecevp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -MT wssedemo-mecevp.obj -MD -MP -MF $(DEPDIR)/wssedemo-mecevp.Tpo -c -o wssedemo-mecevp.obj `if test -f '../../plugin/mecevp.c'; then $(CYGPATH_W) '../../plugin/mecevp.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/mecevp.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wssedemo-mecevp.Tpo $(DEPDIR)/wssedemo-mecevp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/mecevp.c' object='wssedemo-mecevp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wssedemo_CFLAGS) $(CFLAGS) -c -o wssedemo-mecevp.obj `if test -f '../../plugin/mecevp.c'; then $(CYGPATH_W) '../../plugin/mecevp.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/mecevp.c'; fi` stdsoap2.o: ../../stdsoap2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT stdsoap2.o -MD -MP -MF $(DEPDIR)/stdsoap2.Tpo -c -o stdsoap2.o `test -f '../../stdsoap2.c' || echo '$(srcdir)/'`../../stdsoap2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/stdsoap2.Tpo $(DEPDIR)/stdsoap2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../stdsoap2.c' object='stdsoap2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o stdsoap2.o `test -f '../../stdsoap2.c' || echo '$(srcdir)/'`../../stdsoap2.c stdsoap2.obj: ../../stdsoap2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT stdsoap2.obj -MD -MP -MF $(DEPDIR)/stdsoap2.Tpo -c -o stdsoap2.obj `if test -f '../../stdsoap2.c'; then $(CYGPATH_W) '../../stdsoap2.c'; else $(CYGPATH_W) '$(srcdir)/../../stdsoap2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/stdsoap2.Tpo $(DEPDIR)/stdsoap2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../stdsoap2.c' object='stdsoap2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o stdsoap2.obj `if test -f '../../stdsoap2.c'; then $(CYGPATH_W) '../../stdsoap2.c'; else $(CYGPATH_W) '$(srcdir)/../../stdsoap2.c'; fi` wsseapi-lite.o: ../../plugin/wsseapi-lite.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wsseapi-lite.o -MD -MP -MF $(DEPDIR)/wsseapi-lite.Tpo -c -o wsseapi-lite.o `test -f '../../plugin/wsseapi-lite.c' || echo '$(srcdir)/'`../../plugin/wsseapi-lite.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsseapi-lite.Tpo $(DEPDIR)/wsseapi-lite.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsseapi-lite.c' object='wsseapi-lite.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wsseapi-lite.o `test -f '../../plugin/wsseapi-lite.c' || echo '$(srcdir)/'`../../plugin/wsseapi-lite.c wsseapi-lite.obj: ../../plugin/wsseapi-lite.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wsseapi-lite.obj -MD -MP -MF $(DEPDIR)/wsseapi-lite.Tpo -c -o wsseapi-lite.obj `if test -f '../../plugin/wsseapi-lite.c'; then $(CYGPATH_W) '../../plugin/wsseapi-lite.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsseapi-lite.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsseapi-lite.Tpo $(DEPDIR)/wsseapi-lite.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsseapi-lite.c' object='wsseapi-lite.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wsseapi-lite.obj `if test -f '../../plugin/wsseapi-lite.c'; then $(CYGPATH_W) '../../plugin/wsseapi-lite.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsseapi-lite.c'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f ./$(DEPDIR)/stdsoap2.Po -rm -f ./$(DEPDIR)/wsseapi-lite.Po -rm -f ./$(DEPDIR)/wssedemo-dom.Po -rm -f ./$(DEPDIR)/wssedemo-mecevp.Po -rm -f ./$(DEPDIR)/wssedemo-smdevp.Po -rm -f ./$(DEPDIR)/wssedemo-soapC.Po -rm -f ./$(DEPDIR)/wssedemo-soapClient.Po -rm -f ./$(DEPDIR)/wssedemo-soapServer.Po -rm -f ./$(DEPDIR)/wssedemo-stdsoap2.Po -rm -f ./$(DEPDIR)/wssedemo-wsseapi.Po -rm -f ./$(DEPDIR)/wssedemo-wssedemo.Po -rm -f ./$(DEPDIR)/wsselite.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f ./$(DEPDIR)/stdsoap2.Po -rm -f ./$(DEPDIR)/wsseapi-lite.Po -rm -f ./$(DEPDIR)/wssedemo-dom.Po -rm -f ./$(DEPDIR)/wssedemo-mecevp.Po -rm -f ./$(DEPDIR)/wssedemo-smdevp.Po -rm -f ./$(DEPDIR)/wssedemo-soapC.Po -rm -f ./$(DEPDIR)/wssedemo-soapClient.Po -rm -f ./$(DEPDIR)/wssedemo-soapServer.Po -rm -f ./$(DEPDIR)/wssedemo-stdsoap2.Po -rm -f ./$(DEPDIR)/wssedemo-wsseapi.Po -rm -f ./$(DEPDIR)/wssedemo-wssedemo.Po -rm -f ./$(DEPDIR)/wsselite.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/wsse/wssedemo.h0000644000175000017500000002715613525245163020042 0ustar ellertellert// Reminder: Modify typemap.dat to customize the header file generated by wsdl2h /* wssedemo.h Generated by wsdl2h 1.2.6 from wssedemo.wsdl and typemap.dat 2005-08-26 12:54:17 GMT Copyright (C) 2001-2005 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 schema 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. */ /******************************************************************************\ * * * http://www.genivia.com/wsdl/wssetest.wsdl * * * \******************************************************************************/ //gsoapopt cw /******************************************************************************\ * * * Import * * * \******************************************************************************/ #import "wsse.h" // wsse = /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Types * * * \******************************************************************************/ // Imported element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":Security declared as _wsse__Security /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap ns1 service name: wssetest //gsoap ns1 service type: wssetestPortType //gsoap ns1 service port: http://localhost:80 //gsoap ns1 service namespace: http://www.genivia.com/schemas/wssetest.xsd //gsoap ns1 service transport: http://schemas.xmlsoap.org/soap/http /** @mainpage wssetest Definitions @section wssetest_bindings Bindings - @ref wssetest */ /** @page wssetest Binding "wssetest" @section wssetest_operations Operations of Binding "wssetest" - @ref ns1__add - @ref ns1__sub - @ref ns1__mul - @ref ns1__div @section wssetest_ports Endpoints of Binding "wssetest" - http://localhost:80 */ /******************************************************************************\ * * * SOAP Header * * * \******************************************************************************/ /** The SOAP Header is part of the gSOAP context and its content is accessed through the soap.header variable. You may have to set the soap.actor variable to serialize SOAP Headers with SOAP-ENV:actor or SOAP-ENV:role attributes. */ struct SOAP_ENV__Header { mustUnderstand // must be understood by receiver _wsse__Security *wsse__Security ; ///< TODO: Check element type (imported type) }; /******************************************************************************\ * * * wssetest * * * \******************************************************************************/ /******************************************************************************\ * * * ns1__add * * * \******************************************************************************/ /// Operation "ns1__add" of service binding "wssetest" /** Operation details: - SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" - Request message has mandatory header part(s): - wsse__Security - Response message has mandatory header part(s): - wsse__Security C stub function (defined in soapClient.c[pp]): @code int soap_call_ns1__add(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: double a, double b, // response parameters: double *result ); @endcode */ //gsoap ns1 service method-style: add rpc //gsoap ns1 service method-encoding: add http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns1 service method-action: add "" //gsoap ns1 service method-input-header-part: add wsse__Security //gsoap ns1 service method-output-header-part: add wsse__Security int ns1__add( double a, double b, double *result ///< response parameter ); /******************************************************************************\ * * * ns1__sub * * * \******************************************************************************/ /// Operation "ns1__sub" of service binding "wssetest" /** Operation details: - SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" - Request message has mandatory header part(s): - wsse__Security - Response message has mandatory header part(s): - wsse__Security C stub function (defined in soapClient.c[pp]): @code int soap_call_ns1__sub(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: double a, double b, // response parameters: double *result ); @endcode */ //gsoap ns1 service method-style: sub rpc //gsoap ns1 service method-encoding: sub http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns1 service method-action: sub "" //gsoap ns1 service method-input-header-part: sub wsse__Security //gsoap ns1 service method-output-header-part: sub wsse__Security int ns1__sub( double a, double b, double *result ///< response parameter ); /******************************************************************************\ * * * ns1__mul * * * \******************************************************************************/ /// Operation "ns1__mul" of service binding "wssetest" /** Operation details: - SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" - Request message has mandatory header part(s): - wsse__Security - Response message has mandatory header part(s): - wsse__Security C stub function (defined in soapClient.c[pp]): @code int soap_call_ns1__mul(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: double a, double b, // response parameters: double *result ); @endcode */ //gsoap ns1 service method-style: mul rpc //gsoap ns1 service method-encoding: mul http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns1 service method-action: mul "" //gsoap ns1 service method-input-header-part: mul wsse__Security //gsoap ns1 service method-output-header-part: mul wsse__Security int ns1__mul( double a, double b, double *result ///< response parameter ); /******************************************************************************\ * * * ns1__div * * * \******************************************************************************/ /// Operation "ns1__div" of service binding "wssetest" /** Operation details: - SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" - Request message has mandatory header part(s): - wsse__Security - Response message has mandatory header part(s): - wsse__Security C stub function (defined in soapClient.c[pp]): @code int soap_call_ns1__div(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: double a, double b, // response parameters: double *result ); @endcode */ //gsoap ns1 service method-style: div rpc //gsoap ns1 service method-encoding: div http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns1 service method-action: div "" //gsoap ns1 service method-input-header-part: div wsse__Security //gsoap ns1 service method-output-header-part: div wsse__Security int ns1__div( double a, double b, double *result ///< response parameter ); /* End of wssedemo.h */ gsoap-2.8.91/gsoap/samples/wsse/wssedemo.c0000644000175000017500000007400313525245163020026 0ustar ellertellert/* wssedemo.c WS-Security plugin demo application. See comments below. gSOAP XML Web services tools Copyright (C) 2000-2018, 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. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- This application demonstrates the use of the wsse plugin. Compile in C: soapcpp2 -c -I import wssedemo.h cc -DWITH_OPENSSL -DWITH_DOM -o wssedemo wssedemo.c wsseapi.c smdevp.c mecevp.c dom.c stdsoap2.c soapC.c soapClient.c soapServer.c -lcrypto -lssl Compile in C++ (assuming .c files treated as .cpp files): soapcpp2 -I import wssedemo.h c++ -DWITH_OPENSSL -DWITH_DOM -o wssedemo wssedemo.c wsseapi.c smdevp.c mecevp.c dom.cpp stdsoap2.cpp soapC.cpp soapClient.cpp soapServer.cpp -lcrypto -lssl Other required files: server.pem server private key and certificate (do not distrubute) servercert.pem server public certificate for public distribution cacert.pem root CA certificate for public distribution Notes: The wsse.h, wsu.h, ds.h, xenc.h c14n.h files are located in 'import'. The smdevp.*, mecevp.* and wsseapi.* files are located in 'plugin'. This demo uses SHA1 as an example, which is chosen to ensure that OpenSSL 0.9.7 and earlier can handle the signed messages. Recommended is SHA256 or greater. Just change SOAP_XYZ_SHA1 to SOAP_XYZ_SHA256 in the source code below, except in the token_handler() function. Usage: wssedemo abcdefghiklmnopqstxyz [port] with options: a sign the ns1:add operation in the SOAP Body (use option b to remove Body sig) b don't sign the entire SOAP Body (signed by default) c enable chunked HTTP d use triple DES secret key for encryption instead of RSA e encrypt the SOAP Body only f encrypt the signature and the operation in the Body, rather than entire SOAP Body g sign parts instead of the entire SOAP Body h use hmac shared secret key for digital signatures instead of RSA keys i indent XML k don't put signature keys in the WS-Security header l inclusive canonicalization (when used with 'n') m use GCM with AES n canonicalize XML (exclusive C14N, recommended!) o use rsa-oaep-mgf1p with AES256 CBC p add prefixlist for c14n:InclusiveNamespaces/PrefixList for canonical XML interop q add prefixlist for c14n:InclusiveNamespaces/PrefixList with all namespace prefixes to thwart attacks on prefix bindings s server (stand-alone) t use plain-text passwords (password digest by default) u use MTOM format with one MIME attachment x use plain XML (no HTTP header), client only y buffered sends (experimental, disabled - not critical to use) z enable compression For example, to generate a request message and store it in file 'wssedemo.xml': ./wssedemo n > wssedemo.xml < /dev/null To parse and verify this request message: ./wssedemo ns < wssedemo.xml Alternatively, using HMAC (fast but uses shared symmetric keys): ./wssedemo hn > wssedemo.xml < /dev/null ./wssedemo hns < wssedemo.xml To run a stand-alone server: ./wssedemo ns 8080 And invoking it with a client: ./wssedemo n 8080 To test multiple calls using HTTP keep-alive, add a single digit number of runs at the end of the options: ./wssedemo n4 8080 */ #include "wsseapi.h" #include "wssetest.nsmap" /* The client and server side use the same certificates and keys for demonstration purposes */ X509 *cert = NULL; EVP_PKEY *rsa_privk = NULL, *rsa_pubk = NULL; /* The secret HMAC key is shared between client and server */ static char hmac_key[16] = /* Dummy HMAC key for signature test */ { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; /* The WS-SecureConversation Context Token ID we pick for the HMAC key, here we use a fake one to demo */ const char *contextId = "uuid:secure-conversation-context-token"; /* The secret triple DES key shared between client and server for message encryption */ static char des_key[20] = /* Dummy 160-bit triple DES key for encryption test */ { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }; /* The secret AES key shared between client and server for message encryption */ static char aes_key[32] = /* Dummy 256-bit AES256 key for encryption test */ { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }; int addsig = 0; int addenc = 0; int nobody = 0; /* do not sign the SOAP Body */ int hmac = 0; /* symmetric signature */ int nokey = 0; /* do not include signer's public key in message */ int nohttp = 0; int sym = 0; /* symmetric encryption */ int enc = 0; /* encryption */ int oaep = 0; /* use Rsa-oaep-mgf1p with AES256 CBC */ int aes = 0; /* use AES256 instead of DES */ int gcm = 0; /* use AES with GCM instead of CBC mode (requires OpenSSL 1.0.2) */ int mtom = 0; /* use MTOM format with attachment (not signed or encrypted) */ /** Optional user-defined key lookup function, see WSSE docs */ static const void *token_handler(struct soap *soap, int *alg, const char *keyname, const unsigned char *keyid, int keyidlen, int *keylen) { const char *ctxId; /* we're not using keyname or other info, which is from the ds:KeyInfo/KeyName content */ (void)keyname; (void)keyid; (void)keyidlen; switch (*alg) { case SOAP_SMD_VRFY_DSA_SHA1: case SOAP_SMD_VRFY_DSA_SHA256: case SOAP_SMD_VRFY_RSA_SHA1: case SOAP_SMD_VRFY_RSA_SHA224: case SOAP_SMD_VRFY_RSA_SHA256: case SOAP_SMD_VRFY_RSA_SHA384: case SOAP_SMD_VRFY_RSA_SHA512: case SOAP_SMD_VRFY_ECDSA_SHA1: case SOAP_SMD_VRFY_ECDSA_SHA224: case SOAP_SMD_VRFY_ECDSA_SHA256: case SOAP_SMD_VRFY_ECDSA_SHA384: case SOAP_SMD_VRFY_ECDSA_SHA512: return (const void*)cert; /* signature verification with public cert */ case SOAP_SMD_HMAC_SHA1: /* Optional: WS-SecureConversation: get & check context token ID of HMAC key */ ctxId = soap_wsse_get_SecurityContextToken(soap); if (!ctxId || strcmp(ctxId, contextId)) return NULL; *keylen = sizeof(hmac_key); return (const void*)hmac_key; /* signature verification with secret key */ case SOAP_MEC_ENV_DEC_DES_CBC: case SOAP_MEC_ENV_DEC_AES256_CBC: case SOAP_MEC_ENV_DEC_AES256_GCM: if (keyname) { /* use this to get private key from one of these keyname values: 1. keyname is set to the subject name of the certificate, if a certificate is present in the SecurityTokenReference/KeyIdentifier when ValueType is http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3 2. keyname is set to the string concatenation of "{X509IssuerName}#{X509SerialNumber}" of the X509IssuerName and X509SerialNumber present in X509Data/X509IssuerSerial 3. keyname is set to X509Data/X509SubjectName */ } else if (keyid) { /* use this to get private key from: 1. keyid and keyidlen are set to the data in SecurityTokenReference/KeyIdentifier when the ValueType is http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509SubjectKeyIdentifier */ } return (const void*)rsa_privk; /* envelope decryption with private key */ case SOAP_MEC_DEC_DES_CBC: /* should inquire keyname (contains key name or subject name/key id) */ *keylen = sizeof(des_key); return (const void*)des_key; /* decryption with secret key */ case SOAP_MEC_DEC_AES256_CBC: case SOAP_MEC_DEC_AES256_GCM: /* should inquire keyname (contains key name or subject name/key id) */ *keylen = sizeof(aes_key); return (const void*)aes_key; /* decryption with secret key */ } fprintf(stderr, "Could not return a key from token handler for '%s'\n", keyname ? keyname : ""); return NULL; /* fail */ } /* server-side settings before soap_serve() to verify signatures and decrypt messages */ static int set_verify_decrypt_auto(struct soap *soap) { int err; /* auto-verify signature options */ if (hmac) err = soap_wsse_verify_auto(soap, SOAP_SMD_HMAC_SHA1, (void*)hmac_key, sizeof(hmac_key)); else if (nokey) err = soap_wsse_verify_auto(soap, SOAP_SMD_VRFY_RSA_SHA1, (void*)rsa_pubk, 0); else err = soap_wsse_verify_auto(soap, SOAP_SMD_NONE, NULL, 0); if (err) return soap->error; /* auto-decrypt options */ if (sym) { if (aes) { if (gcm) err = soap_wsse_decrypt_auto(soap, SOAP_MEC_DEC_AES256_GCM, aes_key, sizeof(aes_key)); else err = soap_wsse_decrypt_auto(soap, SOAP_MEC_DEC_AES256_CBC, aes_key, sizeof(aes_key)); } else err = soap_wsse_decrypt_auto(soap, SOAP_MEC_DEC_DES_CBC, des_key, sizeof(des_key)); } else if (enc) err = soap_wsse_decrypt_auto(soap, SOAP_MEC_ENV_DEC_DES_CBC, rsa_privk, 0); return err; } int main(int argc, char **argv) { struct soap *soap; int server = 0; int text = 0; int port = 0; FILE *fd; double result; char *user; int runs = 1; /* create context */ soap = soap_new(); /* register wsse plugin and set the optional security token handler callback */ soap_register_plugin(soap, soap_wsse); soap_wsse_set_security_token_handler(soap, token_handler); /* options */ if (argc >= 2) { if (strchr(argv[1], 'c')) soap_set_omode(soap, SOAP_IO_CHUNK); else if (strchr(argv[1], 'y')) soap_set_omode(soap, SOAP_IO_STORE); if (strchr(argv[1], 'i')) soap_set_omode(soap, SOAP_XML_INDENT); if (strchr(argv[1], 'n')) soap_set_omode(soap, SOAP_XML_CANONICAL); if (strchr(argv[1], 'p')) soap_wsse_set_InclusiveNamespaces(soap, "ns1"); if (strchr(argv[1], 'q')) soap_wsse_set_InclusiveNamespaces(soap, "+"); if (strchr(argv[1], 'l')) soap_wsse_set_InclusiveNamespaces(soap, "*"); if (strchr(argv[1], 'a')) aes = 1; if (strchr(argv[1], 'm')) gcm = 1; if (strchr(argv[1], 'o')) oaep = 1; if (strchr(argv[1], 'd')) sym = 1; if (strchr(argv[1], 'e')) enc = 1; if (strchr(argv[1], 'f')) addenc = 1; if (strchr(argv[1], 'h')) hmac = 1; if (strchr(argv[1], 'k')) nokey = 1; if (strchr(argv[1], 's')) server = 1; if (strchr(argv[1], 't')) text = 1; if (strchr(argv[1], 'g')) addsig = 1; if (strchr(argv[1], 'b')) nobody = 1; if (strchr(argv[1], 'u')) { soap_set_omode(soap, SOAP_ENC_MTOM | SOAP_ENC_DIME); /* this forces MTOM attachment format, to test */ mtom = 1; } if (strchr(argv[1], 'x')) nohttp = 1; if (strchr(argv[1], 'z')) soap_set_mode(soap, SOAP_ENC_ZLIB); if (isdigit(argv[1][strlen(argv[1])-1])) { runs = argv[1][strlen(argv[1])-1] - '0'; soap_set_mode(soap, SOAP_IO_KEEPALIVE); } } /* soap->actor = "..."; */ /* set only when required by peer */ user = getenv("USER"); if (!user) user = (char*)"anyone"; /* read RSA private key for signing */ if ((fd = fopen("server.pem", "r"))) { rsa_privk = PEM_read_PrivateKey(fd, NULL, NULL, (void*)"password"); fclose(fd); if (!rsa_privk) { fprintf(stderr, "Could not read private RSA key from server.pem\n"); exit(1); } } else { fprintf(stderr, "Could not read server.pem\n"); exit(1); } /* read certificate (more efficient is to keep certificate in memory) to obtain public key for encryption and signature verification */ if ((fd = fopen("servercert.pem", "r"))) { cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); if (!cert) { fprintf(stderr, "Could not read certificate from servercert.pem\n"); exit(1); } } else { fprintf(stderr, "Could not read servercert.pem\n"); exit(1); } rsa_pubk = X509_get_pubkey(cert); if (!rsa_pubk) { fprintf(stderr, "Could not get public key from certificate\n"); exit(1); } /* port argument */ if (argc >= 3) port = atoi(argv[2]); /* need cacert to verify certificates with CA (cacert.pem for testing and cacerts.pem for production, which contains the trusted CA certificates) */ soap->cafile = "cacert.pem"; /* server / */ if (server) { if (port) { /* stand-alone server serving messages over port */ if (!soap_valid_socket(soap_bind(soap, NULL, port, 100))) { soap_print_fault(soap, stderr); exit(1); } printf("Server started at port %d\n", port); /* HTTP keep-alive is not trivial to support because we need to set soap_wsse_verify_auto and soap_wsse_decrypt_auto */ if (soap->mode & SOAP_IO_KEEPALIVE) { /* set the serverloop callback to call soap_wsse_verify_auto and soap_wsse_decrypt_auto etc. for each next iteration */ soap->fserveloop = set_verify_decrypt_auto; } while (soap_valid_socket(soap_accept(soap))) { fprintf(stderr, "Accepting connection from IP %d.%d.%d.%d\n", (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF); if (set_verify_decrypt_auto(soap) || soap_serve(soap)) { soap_wsse_delete_Security(soap); soap_print_fault(soap, stderr); soap_print_fault_location(soap, stderr); } soap_destroy(soap); soap_end(soap); } soap_print_fault(soap, stderr); exit(1); } else /* CGI-style server serving messages over stdin/out */ { if (set_verify_decrypt_auto(soap) || soap_serve(soap)) { soap_wsse_delete_Security(soap); soap_print_fault(soap, stderr); soap_print_fault_location(soap, stderr); exit(1); } soap_destroy(soap); soap_end(soap); } } else /* client */ { int run; char endpoint[80]; /* client sends messages to stdout or to a server port */ if (port) (SOAP_SNPRINTF(endpoint, sizeof(endpoint), 37), "http://localhost:%d", port); else if (nohttp) soap_strcpy(endpoint, sizeof(endpoint), ""); else soap_strcpy(endpoint, sizeof(endpoint), "http://"); /* run */ for (run = 0; run < runs; run++) { /* message lifetime of 60 seconds */ soap_wsse_add_Timestamp(soap, "Time", 60); /* add user name with text password (unsafe unless over HTTPS) or digest password */ if (text) soap_wsse_add_UsernameTokenText(soap, "User", user, "userPass"); else soap_wsse_add_UsernameTokenDigest(soap, "User", user, "userPass"); /* symmetric encryption option */ if (sym) { if (aes) { /* symmetric encryption with AES CBC/GCM */ soap_wsse_add_EncryptedData_KeyInfo_KeyName(soap, "My AES Key"); if (gcm) { if (soap_wsse_encrypt_body(soap, SOAP_MEC_ENC_AES256_GCM, aes_key, sizeof(aes_key))) soap_print_fault(soap, stderr); soap_wsse_decrypt_auto(soap, SOAP_MEC_DEC_AES256_GCM, aes_key, sizeof(aes_key)); } else { if (soap_wsse_encrypt_body(soap, SOAP_MEC_ENC_AES256_CBC, aes_key, sizeof(aes_key))) soap_print_fault(soap, stderr); soap_wsse_decrypt_auto(soap, SOAP_MEC_DEC_AES256_CBC, aes_key, sizeof(aes_key)); } } else { /* symmetric encryption with DES */ soap_wsse_add_EncryptedData_KeyInfo_KeyName(soap, "My DES Key"); if (soap_wsse_encrypt_body(soap, SOAP_MEC_ENC_DES_CBC, des_key, sizeof(des_key))) soap_print_fault(soap, stderr); soap_wsse_decrypt_auto(soap, SOAP_MEC_DEC_DES_CBC, des_key, sizeof(des_key)); } } else if (addenc) /* RSA encryption option of specific XML element */ { /* RSA encryption of the element option */ const char *SubjectKeyId = NULL; /* set to non-NULL to use SubjectKeyIdentifier in Header rather than a full cert key */ /* MUST set wsu:Id of the elements to encrypt */ soap_wsse_set_wsu_id(soap, "ns1:add"); if (soap_wsse_add_EncryptedKey_encrypt_only(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, SubjectKeyId, NULL, NULL, "ds:Signature ns1:add")) soap_print_fault(soap, stderr); soap_wsse_decrypt_auto(soap, SOAP_MEC_ENV_DEC_DES_CBC, rsa_privk, 0); } else if (enc) /* RSA encryption of the SOAP Body option */ { const char *SubjectKeyId = NULL; /* set to non-NULL to use SubjectKeyIdentifier in Header rather than a full cert key */ if (oaep) { if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_AES256_CBC | SOAP_MEC_OAEP, "Cert", cert, SubjectKeyId, NULL, NULL)) soap_print_fault(soap, stderr); } else if (aes) { if (gcm) { if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_AES256_GCM, "Cert", cert, SubjectKeyId, NULL, NULL)) soap_print_fault(soap, stderr); } else { if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_AES256_CBC, "Cert", cert, SubjectKeyId, NULL, NULL)) soap_print_fault(soap, stderr); } } else { if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, SubjectKeyId, NULL, NULL)) soap_print_fault(soap, stderr); } soap_wsse_decrypt_auto(soap, SOAP_MEC_ENV_DEC_DES_CBC, rsa_privk, 0); } /* HMAC signature */ if (hmac) { if (nobody) soap_wsse_sign(soap, SOAP_SMD_HMAC_SHA1, hmac_key, sizeof(hmac_key)); else soap_wsse_sign_body(soap, SOAP_SMD_HMAC_SHA1, hmac_key, sizeof(hmac_key)); /* WS-SecureConversation contect token */ soap_wsse_add_SecurityContextToken(soap, "SCT", contextId); } else /* RSA signature verification */ { if (nokey) soap_wsse_add_KeyInfo_KeyName(soap, "MyKey"); else { soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert); soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token"); } if (nobody || addsig) /* do not sign body */ soap_wsse_sign(soap, SOAP_SMD_SIGN_RSA_SHA1, rsa_privk, 0); else soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA1, rsa_privk, 0); } /* auto-verification of signatures in server responses */ if (hmac) soap_wsse_verify_auto(soap, SOAP_SMD_HMAC_SHA1, hmac_key, sizeof(hmac_key)); else if (nokey) soap_wsse_verify_auto(soap, SOAP_SMD_VRFY_RSA_SHA1, rsa_pubk, 0); else soap_wsse_verify_auto(soap, SOAP_SMD_NONE, NULL, 0); /* sign message parts inside unsigned body? If so, set wsu:Id of those */ if (addsig) { soap_wsse_set_wsu_id(soap, "ns1:add"); /* should sign the timestamp, usernameToken, certificate, and ns1:add */ soap_wsse_sign_only(soap, "Time User X509Token ns1:add"); } /* optionally use mtom attachments, which are not signed or encypted, here we add a simple message */ if (mtom) soap_set_mime_attachment(soap, "Hello World", 11, SOAP_MIME_NONE, "text/text", "ID", "location", "description"); /* invoke the server. You can choose add, sub, mul, or div operations * that show different security aspects (intentional message rejections) * for demonstration purposes (see server operations below) */ if (!soap_call_ns1__add(soap, endpoint, NULL, 1.0, 2.0, &result)) { if (!soap_wsse_verify_Timestamp(soap)) { const char *servername = soap_wsse_get_Username(soap); if (servername && !strcmp(servername, "server") && !soap_wsse_verify_Password(soap, "serverPass")) fprintf(stderr, "Result = %g\n", result); else { fprintf(stderr, "Server authentication failed\n"); soap_print_fault(soap, stderr); } } else { fprintf(stderr, "Server response expired\n"); soap_print_fault(soap, stderr); } } else { soap_print_fault(soap, stderr); soap_print_fault_location(soap, stderr); if (soap->error != SOAP_EOF) exit(1); } /* clean up security header */ soap_wsse_delete_Security(soap); /* disable soap_wsse_verify_auto */ soap_wsse_verify_done(soap); } /* run */ } /* clean up keys */ if (rsa_privk) EVP_PKEY_free(rsa_privk); if (rsa_pubk) EVP_PKEY_free(rsa_pubk); if (cert) X509_free(cert); /* clean up gSOAP engine */ soap_destroy(soap); soap_end(soap); soap_done(soap); free(soap); /* done */ return 0; } int ns1__add(struct soap *soap, double a, double b, double *result) { const char *username = soap_wsse_get_Username(soap); if (username) fprintf(stderr, "Hello %s, want to add %g + %g = ?\n", username, a, b); if (soap_wsse_verify_Timestamp(soap) || soap_wsse_verify_Password(soap, "userPass")) { int err = soap->error; /* preserve error code */ soap_wsse_delete_Security(soap); /* remove WS-Security information */ /* the above suffices to return an unsigned fault, but here we show how to return a signed fault: */ soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert); soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token"); soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA1, rsa_privk, 0); return err; } if (soap_wsse_verify_element(soap, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "Timestamp") == 0 || soap_wsse_verify_element(soap, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "UsernameToken") == 0) { soap_wsse_delete_Security(soap); return soap_sender_fault(soap, "Timestamp and/or usernameToken not signed", NULL); } if (soap_wsse_verify_element(soap, "http://www.genivia.com/schemas/wssetest.xsd", "add") == 0) { soap_wsse_delete_Security(soap); return soap_sender_fault(soap, "Service operation not signed", NULL); } soap_wsse_delete_Security(soap); /* remove WS-Security before setting new security information */ soap_wsse_add_Timestamp(soap, "Time", 10); /* lifetime of 10 seconds */ soap_wsse_add_UsernameTokenDigest(soap, "User", "server", "serverPass"); if (hmac) { if (nobody || addsig) soap_wsse_sign(soap, SOAP_SMD_HMAC_SHA1, hmac_key, sizeof(hmac_key)); else soap_wsse_sign_body(soap, SOAP_SMD_HMAC_SHA1, hmac_key, sizeof(hmac_key)); /* WS-SecureConversation context token */ soap_wsse_add_SecurityContextToken(soap, "SCT", contextId); } else { if (nokey) soap_wsse_add_KeyInfo_KeyName(soap, "MyKey"); else { soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert); soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token"); } if (nobody || addsig) soap_wsse_sign(soap, SOAP_SMD_SIGN_RSA_SHA1, rsa_privk, 0); else soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA1, rsa_privk, 0); } /* sign the response message inside the unsigned enveloping body? If so, set wsu:Id of the response */ if (addsig) soap_wsse_set_wsu_id(soap, "ns1:addResponse"); if (sym) { if (aes) { soap_wsse_add_EncryptedData_KeyInfo_KeyName(soap, "My AES Key"); if (gcm) { if (soap_wsse_encrypt_body(soap, SOAP_MEC_ENC_AES256_GCM, aes_key, sizeof(aes_key))) soap_print_fault(soap, stderr); } else { if (soap_wsse_encrypt_body(soap, SOAP_MEC_ENC_AES256_CBC, aes_key, sizeof(aes_key))) soap_print_fault(soap, stderr); } } else { soap_wsse_add_EncryptedData_KeyInfo_KeyName(soap, "My DES Key"); if (soap_wsse_encrypt_body(soap, SOAP_MEC_ENC_DES_CBC, des_key, sizeof(des_key))) soap_print_fault(soap, stderr); } } else if (addenc) { /* MUST set wsu:Id of the elements to encrypt */ soap_wsse_set_wsu_id(soap, "ns1:addResponse"); if (soap_wsse_add_EncryptedKey_encrypt_only(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, NULL, NULL, "ds:Signature ns1:addResponse")) soap_print_fault(soap, stderr); } else if (enc) { if (oaep) { if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_AES256_CBC | SOAP_MEC_OAEP, "Cert", cert, NULL, NULL, NULL)) soap_print_fault(soap, stderr); } else if (aes) { if (gcm) { if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_AES256_GCM, "Cert", cert, NULL, NULL, NULL)) soap_print_fault(soap, stderr); } else { if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_AES256_CBC, "Cert", cert, NULL, NULL, NULL)) soap_print_fault(soap, stderr); } } else { if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, NULL, NULL)) soap_print_fault(soap, stderr); } } *result = a + b; return SOAP_OK; } int ns1__sub(struct soap *soap, double a, double b, double *result) { const char *username = soap_wsse_get_Username(soap); if (username) fprintf(stderr, "Hello %s, want to subtract %g - %g = ?\n", username, a, b); if (soap_wsse_verify_Timestamp(soap) || soap_wsse_verify_Password(soap, "userPass")) { soap_wsse_delete_Security(soap); return soap->error; } if (soap_wsse_verify_element(soap, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "Timestamp") == 0 || soap_wsse_verify_element(soap, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "UsernameToken") == 0) { soap_wsse_delete_Security(soap); return soap_sender_fault(soap, "Timestamp and/or usernameToken not signed", NULL); } if (soap_wsse_verify_element(soap, "http://www.genivia.com/schemas/wssetest.xsd", "sub") == 0) { soap_wsse_delete_Security(soap); return soap_sender_fault(soap, "Service operation not signed", NULL); } soap_wsse_delete_Security(soap); /* In this case we leave out the timestamp, which is the sender's * responsibility to add. The receiver only complains if the timestamp is out * of date, not that it is absent. */ if (hmac) { soap_wsse_sign_body(soap, SOAP_SMD_HMAC_SHA1, hmac_key, sizeof(hmac_key)); /* WS-SecureConversation contect token */ soap_wsse_add_SecurityContextToken(soap, "SCT", contextId); } else { if (nokey) soap_wsse_add_KeyInfo_KeyName(soap, "MyKey"); else { soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert); soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token"); } soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA1, rsa_privk, 0); } *result = a - b; return SOAP_OK; } int ns1__mul(struct soap *soap, double a, double b, double *result) { const char *username = soap_wsse_get_Username(soap); if (username) fprintf(stderr, "Hello %s, want to multiply %g * %g = ?\n", username, a, b); if (soap_wsse_verify_Timestamp(soap) || soap_wsse_verify_Password(soap, "userPass")) { soap_wsse_delete_Security(soap); return soap->error; } if (soap_wsse_verify_element(soap, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "Timestamp") == 0 || soap_wsse_verify_element(soap, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "UsernameToken") == 0) { soap_wsse_delete_Security(soap); return soap_sender_fault(soap, "Timestamp and/or usernameToken not signed", NULL); } if (soap_wsse_verify_element(soap, "http://www.genivia.com/schemas/wssetest.xsd", "mul") == 0) { soap_wsse_delete_Security(soap); return soap_sender_fault(soap, "Service operation not signed", NULL); } soap_wsse_delete_Security(soap); soap_wsse_add_Timestamp(soap, "Time", 10); /* lifetime of 10 seconds */ /* In this case we leave out the server name and password. Because the * client receiver requires the presence of authentication information, the * client will reject the response. */ if (hmac) { soap_wsse_sign_body(soap, SOAP_SMD_HMAC_SHA1, hmac_key, sizeof(hmac_key)); /* WS-SecureConversation contect token */ soap_wsse_add_SecurityContextToken(soap, "SCT", contextId); } else { if (nokey) soap_wsse_add_KeyInfo_KeyName(soap, "MyKey"); else { soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert); soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token"); } soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA1, rsa_privk, 0); } *result = a * b; return SOAP_OK; } int ns1__div(struct soap *soap, double a, double b, double *result) { const char *username = soap_wsse_get_Username(soap); if (username) fprintf(stderr, "Hello %s, want to divide %g / %g = ?\n", username, a, b); if (soap_wsse_verify_Timestamp(soap) || soap_wsse_verify_Password(soap, "userPass")) { soap_wsse_delete_Security(soap); return soap->error; } if (soap_wsse_verify_element(soap, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "Timestamp") == 0 || soap_wsse_verify_element(soap, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "UsernameToken") == 0) { soap_wsse_delete_Security(soap); return soap_sender_fault(soap, "Timestamp and/or usernameToken not signed", NULL); } if (soap_wsse_verify_element(soap, "http://www.genivia.com/schemas/wssetest.xsd", "div") == 0) { soap_wsse_delete_Security(soap); return soap_sender_fault(soap, "Service operation not signed", NULL); } soap_wsse_delete_Security(soap); soap_wsse_add_Timestamp(soap, "Time", 10); /* lifetime of 10 seconds */ soap_wsse_add_UsernameTokenDigest(soap, "User", "server", "serverPass"); /* In this case we leave out the signature and the receiver will reject this unsigned message. */ if (b == 0.0) return soap_sender_fault(soap, "Division by zero", NULL); *result = a / b; return SOAP_OK; } gsoap-2.8.91/gsoap/samples/wsse/server.pem0000644000175000017500000000724213525245163020046 0ustar ellertellert-----BEGIN ENCRYPTED PRIVATE KEY----- MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIQcdZuFt0YzgCAggA MBQGCCqGSIb3DQMHBAig/PutfpxHfwSCAoCSsevV3jWwaMLqzkz4FtHPPKI9Guiz y3HjO4uHUnTZNyHA87ukCBYcn06fj4lLsdzShC4PKq1us9WlPgp7iXjS3HxvSNkV JaKfZ1W0LtNnY5BJvp+rFgmrO0/FWwVBuCg4yQCO0PtREif5Sf47qMn/uQI+G9K9 nZcav3w+nI6p9pwUcyFEpKFMLixCFNBHnQCO0SA7PsSHcHe8vntvMXGYnnEjjSq7 pjD2eIV0A5lDYn/u0HQasY0FvLqbDWblZtcI2DAAbwzq0YPK3kPYEKUe/9r3JT5o kRsVak7ZOao1Xfd4c57QrRk4zNuPLDmQJFi3FhtScMGB2de5QIKnzvAyjU2TMhKK xezFZ173p6wNO7+xTmurZ5wfgZQ9EbbaGzdFMhH+IZA0NEVogZn40fjoWKR0Xhwc FfQUuCraq9O7V6xmR19vJNzGGD5WljzTaHPdqlJiBof9L32IfJnEMelr4wf/kZFq VMYieFjB8GZslZEKJC3Y3r+4KOZwdPz3fPCTyYcYt13TFRc+ffE632GHZr4LRrJD +Gy8QHxkA1veyeh+2U52lJylzK2JKQ2nqcIk0d5AIizAf4e6Ow2NXmUgUpirJgUH hfI4Ejed8zgoqk5T2k1jj8zY7I7lpHo4V5Fi5lwc3ubzKZi6lD/Rdqcz3uZUN8gQ 8ZQe4XHtImsS9QkgdAeVgzLW5rKrx5UKYI2z7538YAanSJGX0N2c6Fsd0rx4sFkx HqVgwy0JEZT2ajwdkVOXIEnVZ7/immdAyddeYnxnHl6GnKP6i7vN8/9jCu/VSSzt HECoqQ7eu0j+PsAN0N0JVbTJMEgWwkKc7RG+4M4MNIbTbLJn16KEfCxD -----END ENCRYPTED PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIID4TCCA0qgAwIBAgIBITANBgkqhkiG9w0BAQUFADCBjTELMAkGA1UEBhMCVVMx CzAJBgNVBAgTAkZMMRQwEgYDVQQHEwtUYWxsYWhhc3NlZTEWMBQGA1UEChMNR2Vu aXZpYSwgSW5jLjELMAkGA1UECxMCSVQxEjAQBgNVBAMTCWxvY2FsaG9zdDEiMCAG CSqGSIb3DQEJARYTY29udGFjdEBnZW5pdmlhLmNvbTAeFw0xODA4MjUxNzU4Mzda Fw0yMTA4MjQxNzU4MzdaMIGNMQswCQYDVQQGEwJVUzELMAkGA1UECBMCRkwxFDAS BgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJbmMuMQswCQYD VQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcNAQkBFhNjb250 YWN0QGdlbml2aWEuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDsMNey f1zqU26XTAYsjsHVfSzuQcHX7H6rVDej4i+syy7JF198AlZXKNyx+lDbDzTWmEJM wJtelxoVmnnIJPYTxWlWYCXc+9QwopQ4Jm0rANdfTujDDHug2uMxfTiJNJGq4eOm VrghruL6l96H5aHveauzUh7XiEbcFSL9+1h8twIDAQABo4IBTTCCAUkwCQYDVR0T BAIwADALBgNVHQ8EBAMCBPAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd BgNVHQ4EFgQUl21S3PtNIU5VptaFc0rS21mVve4wgcIGA1UdIwSBujCBt4AUVixg D6n5N0NNc/tWvNSYuhDTKkmhgZOkgZAwgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb22CCQCG9y4FBiOi4zANBgkqhkiG9w0BAQUF AAOBgQBE4Swc3a+wyEXqXGB753H10PmpqpcmpUaLmTfBKvgl1WeLhAZqcpKiKWnH s2BNKE68Ndlopo4ttP3DIkf69vKrUrTANzui5pdShdEom6SJ1yjm/mTFSXNOxAs7 kkbwMTnYltSLvNLdBV22pVmHbRP0G6xwTi7Br5ZIGcQGEQDaDw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJAIb3LgUGI6LjMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE4MDgy NTE3NTczNloXDTIxMDgyNDE3NTczNlowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBAMXNOWKaNVtyWpWa/5/mNXZ7cgv+v5B1RL0OoOwvoQ5dHhc4KycDPAtiiV+I AoZy7bLbARWJboLPo3JnOf3Mc0aQjVFXz+X8eVhEseCIP4HAWSGa5ISDVDdxj4Nh RfwlVtrmLdL08HkTr+f3scHRvtvtmAtTFeT9FOCzttMpBRTXAgMBAAGjgfUwgfIw HQYDVR0OBBYEFFYsYA+p+TdDTXP7VrzUmLoQ0ypJMIHCBgNVHSMEgbowgbeAFFYs YA+p+TdDTXP7VrzUmLoQ0ypJoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkAhvcuBQYjouMwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQA1xebtW3G5e9Xfz2zys4d+628r2qy4ov0ggGS5 WmrBhyIFCE+xW1bj5waLMOt0e4+yfODMTcVKArrrthJdHm5YFILT9ZU2hOEOZw5P Dizc3Q34yzQxXrpsaHri5OfM0wgiIJOynz/YbX2f46YpqhMT7VvNoI8sR+OIydcY mi3qVQ== -----END CERTIFICATE----- gsoap-2.8.91/gsoap/samples/wsse/servercert.pem0000644000175000017500000000522113525245163020717 0ustar ellertellert-----BEGIN CERTIFICATE----- MIID4TCCA0qgAwIBAgIBITANBgkqhkiG9w0BAQUFADCBjTELMAkGA1UEBhMCVVMx CzAJBgNVBAgTAkZMMRQwEgYDVQQHEwtUYWxsYWhhc3NlZTEWMBQGA1UEChMNR2Vu aXZpYSwgSW5jLjELMAkGA1UECxMCSVQxEjAQBgNVBAMTCWxvY2FsaG9zdDEiMCAG CSqGSIb3DQEJARYTY29udGFjdEBnZW5pdmlhLmNvbTAeFw0xODA4MjUxNzU4Mzda Fw0yMTA4MjQxNzU4MzdaMIGNMQswCQYDVQQGEwJVUzELMAkGA1UECBMCRkwxFDAS BgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJbmMuMQswCQYD VQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcNAQkBFhNjb250 YWN0QGdlbml2aWEuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDsMNey f1zqU26XTAYsjsHVfSzuQcHX7H6rVDej4i+syy7JF198AlZXKNyx+lDbDzTWmEJM wJtelxoVmnnIJPYTxWlWYCXc+9QwopQ4Jm0rANdfTujDDHug2uMxfTiJNJGq4eOm VrghruL6l96H5aHveauzUh7XiEbcFSL9+1h8twIDAQABo4IBTTCCAUkwCQYDVR0T BAIwADALBgNVHQ8EBAMCBPAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd BgNVHQ4EFgQUl21S3PtNIU5VptaFc0rS21mVve4wgcIGA1UdIwSBujCBt4AUVixg D6n5N0NNc/tWvNSYuhDTKkmhgZOkgZAwgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb22CCQCG9y4FBiOi4zANBgkqhkiG9w0BAQUF AAOBgQBE4Swc3a+wyEXqXGB753H10PmpqpcmpUaLmTfBKvgl1WeLhAZqcpKiKWnH s2BNKE68Ndlopo4ttP3DIkf69vKrUrTANzui5pdShdEom6SJ1yjm/mTFSXNOxAs7 kkbwMTnYltSLvNLdBV22pVmHbRP0G6xwTi7Br5ZIGcQGEQDaDw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJAIb3LgUGI6LjMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE4MDgy NTE3NTczNloXDTIxMDgyNDE3NTczNlowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBAMXNOWKaNVtyWpWa/5/mNXZ7cgv+v5B1RL0OoOwvoQ5dHhc4KycDPAtiiV+I AoZy7bLbARWJboLPo3JnOf3Mc0aQjVFXz+X8eVhEseCIP4HAWSGa5ISDVDdxj4Nh RfwlVtrmLdL08HkTr+f3scHRvtvtmAtTFeT9FOCzttMpBRTXAgMBAAGjgfUwgfIw HQYDVR0OBBYEFFYsYA+p+TdDTXP7VrzUmLoQ0ypJMIHCBgNVHSMEgbowgbeAFFYs YA+p+TdDTXP7VrzUmLoQ0ypJoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkAhvcuBQYjouMwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQA1xebtW3G5e9Xfz2zys4d+628r2qy4ov0ggGS5 WmrBhyIFCE+xW1bj5waLMOt0e4+yfODMTcVKArrrthJdHm5YFILT9ZU2hOEOZw5P Dizc3Q34yzQxXrpsaHri5OfM0wgiIJOynz/YbX2f46YpqhMT7VvNoI8sR+OIydcY mi3qVQ== -----END CERTIFICATE----- gsoap-2.8.91/gsoap/samples/wsse/cacerts.pem0000644000175000017500000062777613525245163020210 0ustar ellertellert# Part of the source for this file is provided by Mozilla: # http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 # This file was converted to PEM format with tools provided by OpenSSL. # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. GlobalSign Root CA ================== -----BEGIN CERTIFICATE----- MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== -----END CERTIFICATE----- GlobalSign Root CA - R2 ======================= -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp 9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu 01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== -----END CERTIFICATE----- Verisign Class 3 Public Primary Certification Authority - G3 ============================================================ -----BEGIN CERTIFICATE----- MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== -----END CERTIFICATE----- Entrust.net Premium 2048 Secure Server CA ========================================= -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= -----END CERTIFICATE----- Baltimore CyberTrust Root ========================= -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp -----END CERTIFICATE----- AddTrust External Root ====================== -----BEGIN CERTIFICATE----- MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= -----END CERTIFICATE----- Entrust Root Certification Authority ==================================== -----BEGIN CERTIFICATE----- MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 -----END CERTIFICATE----- GeoTrust Global CA ================== -----BEGIN CERTIFICATE----- MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet 8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm Mw== -----END CERTIFICATE----- GeoTrust Universal CA ===================== -----BEGIN CERTIFICATE----- MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs 7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d 8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI P/rmMuGNG2+k5o7Y+SlIis5z/iw= -----END CERTIFICATE----- GeoTrust Universal CA 2 ======================= -----BEGIN CERTIFICATE----- MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP 20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG 8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 +/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ 4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS -----END CERTIFICATE----- Visa eCommerce Root =================== -----BEGIN CERTIFICATE----- MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI /k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt 398znM/jra6O1I7mT1GvFpLgXPYHDw== -----END CERTIFICATE----- Comodo AAA Services root ======================== -----BEGIN CERTIFICATE----- MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== -----END CERTIFICATE----- QuoVadis Root CA ================ -----BEGIN CERTIFICATE----- MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi 5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi 5nrQNiOKSnQ2+Q== -----END CERTIFICATE----- QuoVadis Root CA 2 ================== -----BEGIN CERTIFICATE----- MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt 66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK +JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II 4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u -----END CERTIFICATE----- QuoVadis Root CA 3 ================== -----BEGIN CERTIFICATE----- MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= -----END CERTIFICATE----- Security Communication Root CA ============================== -----BEGIN CERTIFICATE----- MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw 8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX 5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g 0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ 6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi FL39vmwLAw== -----END CERTIFICATE----- Sonera Class 2 Root CA ====================== -----BEGIN CERTIFICATE----- MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 /Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt 0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH llpwrN9M -----END CERTIFICATE----- XRamp Global CA Root ==================== -----BEGIN CERTIFICATE----- MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc /Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz 8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= -----END CERTIFICATE----- Go Daddy Class 2 CA =================== -----BEGIN CERTIFICATE----- MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b vZ8= -----END CERTIFICATE----- Starfield Class 2 CA ==================== -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 QBFGmh95DmK/D5fs4C8fF5Q= -----END CERTIFICATE----- Taiwan GRCA =========== -----BEGIN CERTIFICATE----- MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O 1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk 7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy +fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS -----END CERTIFICATE----- DigiCert Assured ID Root CA =========================== -----BEGIN CERTIFICATE----- MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== -----END CERTIFICATE----- DigiCert Global Root CA ======================= -----BEGIN CERTIFICATE----- MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- DigiCert High Assurance EV Root CA ================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K -----END CERTIFICATE----- Certplus Class 2 Primary CA =========================== -----BEGIN CERTIFICATE----- MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR 5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ 7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW //1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 l7+ijrRU -----END CERTIFICATE----- DST Root CA X3 ============== -----BEGIN CERTIFICATE----- MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ -----END CERTIFICATE----- SwissSign Gold CA - G2 ====================== -----BEGIN CERTIFICATE----- MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR 7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm 5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr 44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ -----END CERTIFICATE----- SwissSign Silver CA - G2 ======================== -----BEGIN CERTIFICATE----- MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG 9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm +/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH 6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P 4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L 3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx /uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u -----END CERTIFICATE----- GeoTrust Primary Certification Authority ======================================== -----BEGIN CERTIFICATE----- MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG 1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= -----END CERTIFICATE----- thawte Primary Root CA ====================== -----BEGIN CERTIFICATE----- MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ 1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== -----END CERTIFICATE----- VeriSign Class 3 Public Primary Certification Authority - G5 ============================================================ -----BEGIN CERTIFICATE----- MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq -----END CERTIFICATE----- SecureTrust CA ============== -----BEGIN CERTIFICATE----- MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= -----END CERTIFICATE----- Secure Global CA ================ -----BEGIN CERTIFICATE----- MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW -----END CERTIFICATE----- COMODO Certification Authority ============================== -----BEGIN CERTIFICATE----- MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== -----END CERTIFICATE----- Network Solutions Certificate Authority ======================================= -----BEGIN CERTIFICATE----- MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc /Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q 4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey -----END CERTIFICATE----- COMODO ECC Certification Authority ================================== -----BEGIN CERTIFICATE----- MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X 4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= -----END CERTIFICATE----- OISTE WISeKey Global Root GA CA =============================== -----BEGIN CERTIFICATE----- MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ /yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 +vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= -----END CERTIFICATE----- Certigna ======== -----BEGIN CERTIFICATE----- MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY 1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== -----END CERTIFICATE----- Deutsche Telekom Root CA 2 ========================== -----BEGIN CERTIFICATE----- MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU Cm26OWMohpLzGITY+9HPBVZkVw== -----END CERTIFICATE----- Cybertrust Global Root ====================== -----BEGIN CERTIFICATE----- MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW 0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin 89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT 8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi 5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW WL1WMRJOEcgh4LMRkWXbtKaIOM5V -----END CERTIFICATE----- ePKI Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX 12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= -----END CERTIFICATE----- certSIGN ROOT CA ================ -----BEGIN CERTIFICATE----- MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD 0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD -----END CERTIFICATE----- GeoTrust Primary Certification Authority - G3 ============================================= -----BEGIN CERTIFICATE----- MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr 2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt -----END CERTIFICATE----- thawte Primary Root CA - G2 =========================== -----BEGIN CERTIFICATE----- MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== -----END CERTIFICATE----- thawte Primary Root CA - G3 =========================== -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC +BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY 7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC 8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= -----END CERTIFICATE----- GeoTrust Primary Certification Authority - G2 ============================================= -----BEGIN CERTIFICATE----- MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 npaqBA+K -----END CERTIFICATE----- VeriSign Universal Root Certification Authority =============================================== -----BEGIN CERTIFICATE----- MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj 1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 mJO37M2CYfE45k+XmCpajQ== -----END CERTIFICATE----- VeriSign Class 3 Public Primary Certification Authority - G4 ============================================================ -----BEGIN CERTIFICATE----- MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB /zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== -----END CERTIFICATE----- NetLock Arany (Class Gold) Főtanúsítvány ======================================== -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu 0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw /HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= -----END CERTIFICATE----- Staat der Nederlanden Root CA - G2 ================================== -----BEGIN CERTIFICATE----- MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ 5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65 48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737 qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz +51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm 66+KAQ== -----END CERTIFICATE----- Hongkong Post Root CA 1 ======================= -----BEGIN CERTIFICATE----- MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== -----END CERTIFICATE----- SecureSign RootCA11 =================== -----BEGIN CERTIFICATE----- MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= -----END CERTIFICATE----- Microsec e-Szigno Root CA 2009 ============================== -----BEGIN CERTIFICATE----- MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG 0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm 1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi LXpUq3DDfSJlgnCW -----END CERTIFICATE----- GlobalSign Root CA - R3 ======================= -----BEGIN CERTIFICATE----- MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ 0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r kpeDMdmztcpHWD9f -----END CERTIFICATE----- Autoridad de Certificacion Firmaprofesional CIF A62634068 ========================================================= -----BEGIN CERTIFICATE----- MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx 51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi 6Et8Vcad+qMUu2WFbm5PEn4KPJ2V -----END CERTIFICATE----- Izenpe.com ========== -----BEGIN CERTIFICATE----- MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ 03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU +zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK 0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ 0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== -----END CERTIFICATE----- Chambers of Commerce Root - 2008 ================================ -----BEGIN CERTIFICATE----- MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ 0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH 3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF 9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ -----END CERTIFICATE----- Global Chambersign Root - 2008 ============================== -----BEGIN CERTIFICATE----- MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB /gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp 1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG /5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg 9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z 09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B -----END CERTIFICATE----- Go Daddy Root Certificate Authority - G2 ======================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq 9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD +qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r 5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 -----END CERTIFICATE----- Starfield Root Certificate Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx 4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 -----END CERTIFICATE----- Starfield Services Root Certificate Authority - G2 ================================================== -----BEGIN CERTIFICATE----- MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 -----END CERTIFICATE----- AffirmTrust Commercial ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv 0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= -----END CERTIFICATE----- AffirmTrust Networking ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 /PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 /ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= -----END CERTIFICATE----- AffirmTrust Premium =================== -----BEGIN CERTIFICATE----- MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV 5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs +7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 /bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo +Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC 6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK +4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== -----END CERTIFICATE----- AffirmTrust Premium ECC ======================= -----BEGIN CERTIFICATE----- MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X 57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM eQ== -----END CERTIFICATE----- Certum Trusted Network CA ========================= -----BEGIN CERTIFICATE----- MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= -----END CERTIFICATE----- TWCA Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP 4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG 9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== -----END CERTIFICATE----- Security Communication RootCA2 ============================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ +T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R 3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk 3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 -----END CERTIFICATE----- EC-ACC ====== -----BEGIN CERTIFICATE----- MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw 0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D 5EI= -----END CERTIFICATE----- Hellenic Academic and Research Institutions RootCA 2011 ======================================================= -----BEGIN CERTIFICATE----- MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI 1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa 71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u 8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH 3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD /md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N 7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 -----END CERTIFICATE----- Actalis Authentication Root CA ============================== -----BEGIN CERTIFICATE----- MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC 4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo 2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== -----END CERTIFICATE----- Trustis FPS Root CA =================== -----BEGIN CERTIFICATE----- MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P 8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl iB6XzCGcKQENZetX2fNXlrtIzYE= -----END CERTIFICATE----- Buypass Class 2 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn 9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b /+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN rJgWVqA= -----END CERTIFICATE----- Buypass Class 3 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR 5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh 7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH 2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV /afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz 6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi Cp/HuZc= -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 3 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK 9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W 0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== -----END CERTIFICATE----- EE Certification Centre Root CA =============================== -----BEGIN CERTIFICATE----- MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw 93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU 3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM dcGWxZ0= -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 2009 ============================== -----BEGIN CERTIFICATE----- MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ 4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm 2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 EV 2009 ================================= -----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T 7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv w9y4AyHqnxbxLFS1 -----END CERTIFICATE----- CA Disig Root R2 ================ -----BEGIN CERTIFICATE----- MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa 5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV 7+ZtsH8tZ/3zbBt1RqPlShfppNcL -----END CERTIFICATE----- ACCVRAIZ1 ========= -----BEGIN CERTIFICATE----- MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ 0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR 5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J 9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd 3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p EfbRD0tVNEYqi4Y7 -----END CERTIFICATE----- TWCA Global Root CA =================== -----BEGIN CERTIFICATE----- MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M 8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg /eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= -----END CERTIFICATE----- TeliaSonera Root CA v1 ====================== -----BEGIN CERTIFICATE----- MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ 6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA 3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx 0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= -----END CERTIFICATE----- E-Tugra Certification Authority =============================== -----BEGIN CERTIFICATE----- MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB /wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G C7TbO6Orb1wdtn7os4I07QZcJA== -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 2 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR 3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN 9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== -----END CERTIFICATE----- Atos TrustedRoot 2011 ===================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr 54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G 3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed -----END CERTIFICATE----- QuoVadis Root CA 1 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV 7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX 9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP +V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh 3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV hMJKzRwuJIczYOXD -----END CERTIFICATE----- QuoVadis Root CA 2 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD 6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr O3jtZsSOeWmD3n+M -----END CERTIFICATE----- QuoVadis Root CA 3 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe 6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX 0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 PpxxVJkES/1Y+Zj0 -----END CERTIFICATE----- DigiCert Assured ID Root G2 =========================== -----BEGIN CERTIFICATE----- MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH 35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv 0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo IhNzbM8m9Yop5w== -----END CERTIFICATE----- DigiCert Assured ID Root G3 =========================== -----BEGIN CERTIFICATE----- MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy 1vUhZscv6pZjamVFkpUBtA== -----END CERTIFICATE----- DigiCert Global Root G2 ======================= -----BEGIN CERTIFICATE----- MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO 3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu 5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl MrY= -----END CERTIFICATE----- DigiCert Global Root G3 ======================= -----BEGIN CERTIFICATE----- MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y 3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 VOKa5Vt8sycX -----END CERTIFICATE----- DigiCert Trusted Root G4 ======================== -----BEGIN CERTIFICATE----- MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy 7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN 5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb /UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa 5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP 82Z+ -----END CERTIFICATE----- COMODO RSA Certification Authority ================================== -----BEGIN CERTIFICATE----- MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+ 5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX 2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3 sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5 WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+ nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52 7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I LaZRfyHBNVOFBkpdn627G190 -----END CERTIFICATE----- USERTrust RSA Certification Authority ===================================== -----BEGIN CERTIFICATE----- MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz 0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O +T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq /nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8 yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+ eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ 7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM 8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 -----END CERTIFICATE----- USERTrust ECC Certification Authority ===================================== -----BEGIN CERTIFICATE----- MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu 9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= -----END CERTIFICATE----- GlobalSign ECC Root CA - R4 =========================== -----BEGIN CERTIFICATE----- MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q= -----END CERTIFICATE----- GlobalSign ECC Root CA - R5 =========================== -----BEGIN CERTIFICATE----- MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 -----END CERTIFICATE----- Staat der Nederlanden Root CA - G3 ================================== -----BEGIN CERTIFICATE----- MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5 1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp 07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE 41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1 v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA 8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b 8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq 1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk= -----END CERTIFICATE----- Staat der Nederlanden EV Root CA ================================ -----BEGIN CERTIFICATE----- MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r 0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8 Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr 08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV 0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd 74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq 5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi 5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4 WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg== -----END CERTIFICATE----- IdenTrust Commercial Root CA 1 ============================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi 1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl 3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH 6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe 2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R cGzM7vRX+Bi6hG6H -----END CERTIFICATE----- IdenTrust Public Sector Root CA 1 ================================= -----BEGIN CERTIFICATE----- MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL 4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ 3Wl9af0AVqW3rLatt8o+Ae+c -----END CERTIFICATE----- Entrust Root Certification Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP /vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO e4pIb4tF9g== -----END CERTIFICATE----- Entrust Root Certification Authority - EC1 ========================================== -----BEGIN CERTIFICATE----- MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef 9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G -----END CERTIFICATE----- CFCA EV ROOT ============ -----BEGIN CERTIFICATE----- MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD 7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB /wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua 4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su -----END CERTIFICATE----- Certinomis - Root CA ==================== -----BEGIN CERTIFICATE----- MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjETMBEGA1UEChMK Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAbBgNVBAMTFENlcnRpbm9taXMg LSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMzMTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIx EzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRD ZXJ0aW5vbWlzIC0gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQos P5L2fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJflLieY6pOo d5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQVWZUKxkd8aRi5pwP5ynap z8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDFTKWrteoB4owuZH9kb/2jJZOLyKIOSY00 8B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09x RLWtwHkziOC/7aOgFLScCbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE 6OXWk6RiwsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJwx3t FvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SGm/lg0h9tkQPTYKbV PZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4F2iw4lNVYC2vPsKD2NkJK/DAZNuH i5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZngWVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGj YzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I 6tNxIqSSaHh02TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/0KGRHCwPT5iV WVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWwF6YSjNRieOpWauwK0kDDPAUw Pk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZSg081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAX lCOotQqSD7J6wWAsOMwaplv/8gzjqh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJ y29SWwNyhlCVCNSNh4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9 Iff/ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8Vbtaw5Bng DwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwjY/M50n92Uaf0yKHxDHYi I0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nM cyrDflOR1m749fPH0FFNjkulW+YZFzvWgQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVr hkIGuUE= -----END CERTIFICATE----- OISTE WISeKey Global Root GB CA =============================== -----BEGIN CERTIFICATE----- MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk 9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB /zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= -----END CERTIFICATE----- SZAFIR ROOT CA2 =============== -----BEGIN CERTIFICATE----- MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE 2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5 O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67 oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul 4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6 +/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw== -----END CERTIFICATE----- Certum Trusted Network CA 2 =========================== -----BEGIN CERTIFICATE----- MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1 bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9 7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130 GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ 9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 zAYspsbiDrW5viSP -----END CERTIFICATE----- Hellenic Academic and Research Institutions RootCA 2015 ======================================================= -----BEGIN CERTIFICATE----- MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0 aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+ 6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2 fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+ D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn 82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q p/UsQu0yrbYhnr68 -----END CERTIFICATE----- Hellenic Academic and Research Institutions ECC RootCA 2015 =========================================================== -----BEGIN CERTIFICATE----- MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0 aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290 Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR -----END CERTIFICATE----- ISRG Root X1 ============ -----BEGIN CERTIFICATE----- MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ 4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf 1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY 9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV 0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ m+kXQ99b21/+jh5Xos1AnX5iItreGCc= -----END CERTIFICATE----- AC RAIZ FNMT-RCM ================ -----BEGIN CERTIFICATE----- MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou 08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ 47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW +YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d 8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm 5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM= -----END CERTIFICATE----- Amazon Root CA 1 ================ -----BEGIN CERTIFICATE----- MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB /zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy 8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa 2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 -----END CERTIFICATE----- Amazon Root CA 2 ================ -----BEGIN CERTIFICATE----- MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ 3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY +gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= -----END CERTIFICATE----- Amazon Root CA 3 ================ -----BEGIN CERTIFICATE----- MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== -----END CERTIFICATE----- Amazon Root CA 4 ================ -----BEGIN CERTIFICATE----- MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN /sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri 83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== -----END CERTIFICATE----- LuxTrust Global Root 2 ====================== -----BEGIN CERTIFICATE----- MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQELBQAwRjELMAkG A1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNVBAMMFkx1eFRydXN0IEdsb2Jh bCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUwMzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEW MBQGA1UECgwNTHV4VHJ1c3QgUy5BLjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCC AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wm Kb3FibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTemhfY7RBi2 xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1EMShduxq3sVs35a0VkBC wGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsnXpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm 1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkm FRseTJIpgp7VkoGSQXAZ96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niF wpN6cj5mj5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4gDEa/ a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+8kPREd8vZS9kzl8U ubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2jX5t/Lax5Gw5CMZdjpPuKadUiDTSQ MC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmHhFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB /zBCBgNVHSAEOzA5MDcGByuBKwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5 Lmx1eHRydXN0Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT +Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQELBQADggIBAGoZ FO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9BzZAcg4atmpZ1gDlaCDdLnIN H2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTOjFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW 7MM3LGVYvlcAGvI1+ut7MV3CwRI9loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIu ZY+kt9J/Z93I055cqqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWA VWe+2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/JEAdemrR TxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKrezrnK+T+Tb/mjuuqlPpmt /f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQfLSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc 7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31I iyBMz2TWuJdGsE7RKlY6oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr -----END CERTIFICATE----- TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 ============================================= -----BEGIN CERTIFICATE----- MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11 IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8 6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0 3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9 WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= -----END CERTIFICATE----- GDCA TrustAUTH R5 ROOT ====================== -----BEGIN CERTIFICATE----- MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ 9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4 oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx 9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9 H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35 6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd +PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ 8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv /EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== -----END CERTIFICATE----- TrustCor RootCert CA-1 ====================== -----BEGIN CERTIFICATE----- MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYDVQQGEwJQQTEP MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkx MjMxMTcyMzE2WjCBpDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFu YW1hIENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUGA1UECwwe VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZUcnVzdENvciBSb290Q2Vy dCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv463leLCJhJrMxnHQFgKq1mq jQCj/IDHUHuO1CAmujIS2CNUSSUQIpidRtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4 pQa81QBeCQryJ3pS/C3Vseq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0 JEsq1pme9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CVEY4h gLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorWhnAbJN7+KIor0Gqw /Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/DeOxCbeKyKsZn3MzUOcwHwYDVR0j BBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AYYwDQYJKoZIhvcNAQELBQADggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5 mDo4Nvu7Zp5I/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZyonnMlo2HD6C qFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djtsL1Ac59v2Z3kf9YKVmgenFK+P 3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdNzl/HHk484IkzlQsPpTLWPFp5LBk= -----END CERTIFICATE----- TrustCor RootCert CA-2 ====================== -----BEGIN CERTIFICATE----- MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNVBAYTAlBBMQ8w DQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQwIgYDVQQKDBtUcnVzdENvciBT eXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0 eTEfMB0GA1UEAwwWVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEy MzExNzI2MzlaMIGkMQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5h bWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0 IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnIG7CKqJiJJWQdsg4foDSq8Gb ZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9Nk RvRUqdw6VC0xK5mC8tkq1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1 oYxOdqHp2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nKDOOb XUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hapeaz6LMvYHL1cEksr1 /p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF3wP+TfSvPd9cW436cOGlfifHhi5q jxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQP eSghYA2FFn3XVDjxklb9tTNMg9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+Ctg rKAmrhQhJ8Z3mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh 8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAdBgNVHQ4EFgQU 2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6UnrybPZx9mCAZ5YwwYrIwDwYD VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/h Osh80QA9z+LqBrWyOrsGS2h60COXdKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnp kpfbsEZC89NiqpX+MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv 2wnL/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RXCI/hOWB3 S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYaZH9bDTMJBzN7Bj8RpFxw PIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dv DDqPys/cA8GiCcjl/YBeyGBCARsaU1q7N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYU RpFHmygk71dSTlxCnKr3Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANE xdqtvArBAs8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp5KeX RKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu1uwJ -----END CERTIFICATE----- TrustCor ECA-1 ============== -----BEGIN CERTIFICATE----- MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYDVQQGEwJQQTEP MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkxFzAVBgNVBAMMDlRydXN0Q29yIEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3Mjgw N1owgZwxCzAJBgNVBAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5 MSQwIgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29y IENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3IgRUNBLTEwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb3w9U73NjKYKtR8aja+3+XzP4Q1HpGjOR MRegdMTUpwHmspI+ap3tDvl0mEDTPwOABoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23 xFUfJ3zSCNV2HykVh0A53ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmc p0yJF4OuowReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/wZ0+ fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZFZtS6mFjBAgMBAAGj YzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAfBgNVHSMEGDAWgBREnkj1zG1I1KBL f/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF AAOCAQEABT41XBVwm8nHc2FvcivUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u /ukZMjgDfxT2AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50soIipX1TH0Xs J5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BIWJZpTdwHjFGTot+fDz2LYLSC jaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1WitJ/X5g== -----END CERTIFICATE----- SSL.com Root Certification Authority RSA ======================================== -----BEGIN CERTIFICATE----- MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxDjAM BgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24x MTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYw MjEyMTczOTM5WhcNNDEwMjEyMTczOTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NM LmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2RxFdHaxh3a3by/ZPkPQ/C Fp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aXqhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8 P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcCC52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/ge oeOy3ZExqysdBP+lSgQ36YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkp k8zruFvh/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrFYD3Z fBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93EJNyAKoFBbZQ+yODJ gUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVcUS4cK38acijnALXRdMbX5J+tB5O2 UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi8 1xtZPCvM8hnIk2snYxnP/Okm+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4s bE6x/c+cCbqiM+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4GA1UdDwEB/wQE AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGVcpNxJK1ok1iOMq8bs3AD/CUr dIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBcHadm47GUBwwyOabqG7B52B2ccETjit3E+ZUf ijhDPwGFpUenPUayvOUiaPd7nNgsPgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAsl u1OJD7OAUN5F7kR/q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjq erQ0cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jra6x+3uxj MxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90IH37hVZkLId6Tngr75qNJ vTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/YK9f1JmzJBjSWFupwWRoyeXkLtoh/D1JI Pb9s2KJELtFOt3JY04kTlf5Eq/jXixtunLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406y wKBjYZC6VWg3dGq2ktufoYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NI WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k= -----END CERTIFICATE----- SSL.com Root Certification Authority ECC ======================================== -----BEGIN CERTIFICATE----- MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+ 8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z 5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl -----END CERTIFICATE----- SSL.com EV Root Certification Authority RSA R2 ============================================== -----BEGIN CERTIFICATE----- MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+ B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim 9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48 +qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1 ++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7 CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1 hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX 9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== -----END CERTIFICATE----- SSL.com EV Root Certification Authority ECC =========================================== -----BEGIN CERTIFICATE----- MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy 3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe 5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== -----END CERTIFICATE----- GlobalSign Root CA - R6 ======================= -----BEGIN CERTIFICATE----- MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE 3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+ azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP 0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0 lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr 3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1 0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= -----END CERTIFICATE----- OISTE WISeKey Global Root GC CA =============================== -----BEGIN CERTIFICATE----- MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 -----END CERTIFICATE----- gsoap-2.8.91/gsoap/samples/wsse/Makefile.am0000644000175000017500000000146113525245163020066 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = foreign 1.4 noinst_PROGRAMS = wssedemo wsselite SOAPHEADER = wssedemo.h include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = wssedemo.nsmap wssedemo_CFLAGS = -DWITH_DOM -DWITH_OPENSSL -DWITH_GZIP wssedemo_SOURCES = wssedemo.c $(SOAPHEADER) $(SOAP_C_SRC) ../../stdsoap2.c ../../dom.c ../../plugin/wsseapi.c ../../plugin/smdevp.c ../../plugin/mecevp.c wssedemo_LDADD = $(SAMPLE_SSL_LIBS) $(SAMPLE_EXTRA_LIBS) -lssl -lcrypto -lz wsselite_SOURCES = wsselite.c $(SOAPHEADER) $(SOAP_C_SRC) ../../stdsoap2.c ../../plugin/wsseapi-lite.c wsselite_LDADD = $(SAMPLE_SSL_LIBS) $(SAMPLE_EXTRA_LIBS) gsoap-2.8.91/gsoap/samples/wsse/cacert.pem0000644000175000017500000000242213525245163017774 0ustar ellertellert-----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJAIb3LgUGI6LjMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE4MDgy NTE3NTczNloXDTIxMDgyNDE3NTczNlowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBAMXNOWKaNVtyWpWa/5/mNXZ7cgv+v5B1RL0OoOwvoQ5dHhc4KycDPAtiiV+I AoZy7bLbARWJboLPo3JnOf3Mc0aQjVFXz+X8eVhEseCIP4HAWSGa5ISDVDdxj4Nh RfwlVtrmLdL08HkTr+f3scHRvtvtmAtTFeT9FOCzttMpBRTXAgMBAAGjgfUwgfIw HQYDVR0OBBYEFFYsYA+p+TdDTXP7VrzUmLoQ0ypJMIHCBgNVHSMEgbowgbeAFFYs YA+p+TdDTXP7VrzUmLoQ0ypJoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkAhvcuBQYjouMwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQA1xebtW3G5e9Xfz2zys4d+628r2qy4ov0ggGS5 WmrBhyIFCE+xW1bj5waLMOt0e4+yfODMTcVKArrrthJdHm5YFILT9ZU2hOEOZw5P Dizc3Q34yzQxXrpsaHri5OfM0wgiIJOynz/YbX2f46YpqhMT7VvNoI8sR+OIydcY mi3qVQ== -----END CERTIFICATE----- gsoap-2.8.91/gsoap/samples/wsse/wsselite.c0000644000175000017500000001732113525245163020037 0ustar ellertellert/* wsselite.c WS-Security lite demo application. See comments below. gSOAP XML Web services tools Copyright (C) 2000-2015, 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. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- This application demonstrates the use of the wsse plugin. Compile: soapcpp2 -I import wssedemo.h cc -o wsselite wsselite.c wsseapi.c stdsoap2.c soapC.c soapClient.c soapServer.c Note: The wsse.h, wsu.h, ds.h, xenc.h c14n.h files are located in 'import'. The wsseapi-lite.* files are located in 'plugin'. Usage: wsselite s [port] with options: s server (stand-alone) To run a stand-alone server: ./wssedemo s 8080 And invoking it with a client: ./wssedemo c 8080 */ #include "wsseapi-lite.h" #include "wssetest.nsmap" int main(int argc, char **argv) { struct soap *soap; int server = 0; int port = 0; double result; char *user; /* create context */ soap = soap_new(); /* options */ if (argc >= 2) { if (strchr(argv[1], 'c')) soap_set_omode(soap, SOAP_IO_CHUNK); soap_set_omode(soap, SOAP_XML_INDENT); if (strchr(argv[1], 's')) server = 1; } /* soap->actor = "..."; */ /* set only when required */ user = getenv("USER"); if (!user) user = "anyone"; /* port argument */ if (argc >= 3) port = atoi(argv[2]); /* server or client/ */ if (server) { if (port) { /* stand-alone server serving messages over port */ if (!soap_valid_socket(soap_bind(soap, NULL, port, 100))) { soap_print_fault(soap, stderr); exit(1); } printf("Server started at port %d\n", port); while (soap_valid_socket(soap_accept(soap))) { if (soap_serve(soap)) { soap_wsse_delete_Security(soap); soap_print_fault(soap, stderr); soap_print_fault_location(soap, stderr); } soap_destroy(soap); soap_end(soap); } soap_print_fault(soap, stderr); exit(1); } else { /* CGI-style server serving messages over stdin/out */ if (soap_serve(soap)) { soap_wsse_delete_Security(soap); soap_print_fault(soap, stderr); soap_print_fault_location(soap, stderr); } soap_destroy(soap); soap_end(soap); } } else /* client */ { char endpoint[80]; /* ns1:test data */ struct ns1__add a; struct ns1__sub b; a.a = 123; a.b = 456; b.a = 789; b.b = -99999; /* client sending messages to stdout or over port */ if (port) sprintf(endpoint, "http://localhost:%d", port); else strcpy(endpoint, "http://"); /* message lifetime of 60 seconds */ soap_wsse_add_Timestamp(soap, NULL, 60); /* add user name with text or digest password */ soap_wsse_add_UsernameTokenText(soap, NULL, user, "userPass"); /* invoke the server. You can choose add, sub, mul, or div operations * that show different security aspects (intentional message rejections) * for demonstration purposes (see server operations below) */ if (!soap_call_ns1__add(soap, endpoint, NULL, 1.0, 2.0, &result)) { if (!soap_wsse_verify_Timestamp(soap)) { const char *servername = soap_wsse_get_Username(soap); if (servername && !strcmp(servername, "server") && !soap_wsse_verify_Password(soap, "serverPass")) printf("Result = %g\n", result); else { fprintf(stderr, "Server authentication failed\n"); soap_print_fault(soap, stderr); } } else { fprintf(stderr, "Server response expired\n"); soap_print_fault(soap, stderr); } } else { soap_print_fault(soap, stderr); soap_print_fault_location(soap, stderr); } /* clean up security header */ soap_wsse_delete_Security(soap); } /* clean up gSOAP engine */ soap_destroy(soap); soap_end(soap); soap_done(soap); free(soap); /* done */ return 0; } int ns1__add(struct soap *soap, double a, double b, double *result) { const char *username = soap_wsse_get_Username(soap); if (username) fprintf(stderr, "Hello %s, want to add %g + %g = ?\n", username, a, b); if (soap_wsse_verify_Timestamp(soap) || soap_wsse_verify_Password(soap, "userPass")) { int err = soap->error; /* preserve error code */ soap_wsse_delete_Security(soap); /* remove WS-Security information */ return err; } soap_wsse_delete_Security(soap); /* remove WS-Security before setting new security information */ soap_wsse_add_Timestamp(soap, NULL, 10); /* lifetime of 10 seconds */ soap_wsse_add_UsernameTokenText(soap, NULL, "server", "serverPass"); *result = a + b; return SOAP_OK; } int ns1__sub(struct soap *soap, double a, double b, double *result) { const char *username = soap_wsse_get_Username(soap); if (username) fprintf(stderr, "Hello %s, want to subtract %g - %g = ?\n", username, a, b); if (soap_wsse_verify_Timestamp(soap) || soap_wsse_verify_Password(soap, "userPass")) { soap_wsse_delete_Security(soap); return soap->error; } soap_wsse_delete_Security(soap); /* In this case we leave out the timestamp, which is the sender's * responsibility to add. The receiver only complains if the timestamp is out * of date, not that it is absent. */ *result = a - b; return SOAP_OK; } int ns1__mul(struct soap *soap, double a, double b, double *result) { const char *username = soap_wsse_get_Username(soap); if (username) fprintf(stderr, "Hello %s, want to multiply %g * %g = ?\n", username, a, b); if (soap_wsse_verify_Timestamp(soap) || soap_wsse_verify_Password(soap, "userPass")) { soap_wsse_delete_Security(soap); return soap->error; } soap_wsse_delete_Security(soap); soap_wsse_add_Timestamp(soap, NULL, 10); /* lifetime of 10 seconds */ /* In this case we leave out the server name and password. Because the * client receiver requires the presence of authentication information, the * client will reject the response. */ *result = a * b; return SOAP_OK; } int ns1__div(struct soap *soap, double a, double b, double *result) { const char *username = soap_wsse_get_Username(soap); if (username) fprintf(stderr, "Hello %s, want to divide %g / %g = ?\n", username, a, b); if (soap_wsse_verify_Timestamp(soap) || soap_wsse_verify_Password(soap, "userPass")) { soap_wsse_delete_Security(soap); return soap->error; } soap_wsse_delete_Security(soap); soap_wsse_add_Timestamp(soap, NULL, 10); /* lifetime of 10 seconds */ soap_wsse_add_UsernameTokenText(soap, NULL, "server", "serverPass"); /* In this case we leave out the signature and the receiver will reject this unsigned message. */ if (b == 0.0) return soap_sender_fault(soap, "Division by zero", NULL); *result = a / b; return SOAP_OK; } gsoap-2.8.91/gsoap/samples/wst/0000755000175000017500000000000013525245203015657 5ustar ellertellertgsoap-2.8.91/gsoap/samples/wst/.deps/0000755000175000017500000000000013525245203016670 5ustar ellertellertgsoap-2.8.91/gsoap/samples/wst/.deps/wsselite.Po0000644000175000017500000000001013525245163021023 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/samples/wst/wstdemo.h0000644000175000017500000000015013525245163017513 0ustar ellertellert #import "wst.h" // use this for 2005/12 WS-Trust // #import "wst2.h" // use this for 2005/02 WS-Trust gsoap-2.8.91/gsoap/samples/wst/Makefile.in0000644000175000017500000012272613525245163017743 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = wstdemo$(EXEEXT) subdir = gsoap/samples/wst ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = wstdemo-soapC.$(OBJEXT) am__objects_3 = wstdemo-soapClient.$(OBJEXT) $(am__objects_2) am__objects_4 = $(am__objects_3) wstdemo-soapServer.$(OBJEXT) \ $(am__objects_1) $(am__objects_1) am_wstdemo_OBJECTS = wstdemo-wstdemo.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) wstdemo-stdsoap2.$(OBJEXT) \ wstdemo-dom.$(OBJEXT) wstdemo-wstapi.$(OBJEXT) \ wstdemo-wsseapi.$(OBJEXT) wstdemo-wsaapi.$(OBJEXT) \ wstdemo-smdevp.$(OBJEXT) wstdemo-mecevp.$(OBJEXT) wstdemo_OBJECTS = $(am_wstdemo_OBJECTS) am__DEPENDENCIES_1 = wstdemo_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) wstdemo_LINK = $(CCLD) $(wstdemo_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/wstdemo-dom.Po \ ./$(DEPDIR)/wstdemo-mecevp.Po ./$(DEPDIR)/wstdemo-smdevp.Po \ ./$(DEPDIR)/wstdemo-soapC.Po ./$(DEPDIR)/wstdemo-soapClient.Po \ ./$(DEPDIR)/wstdemo-soapServer.Po \ ./$(DEPDIR)/wstdemo-stdsoap2.Po ./$(DEPDIR)/wstdemo-wsaapi.Po \ ./$(DEPDIR)/wstdemo-wsseapi.Po ./$(DEPDIR)/wstdemo-wstapi.Po \ ./$(DEPDIR)/wstdemo-wstdemo.Po am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(wstdemo_SOURCES) DIST_SOURCES = $(wstdemo_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.c_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = foreign 1.4 SOAPHEADER = wstdemo.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = wstdemo.nsmap wstdemo_CFLAGS = -DWITH_DOM -DWITH_OPENSSL -DWITH_GZIP -DSKIP_CERTIFICATE_VERIFICATION wstdemo_SOURCES = wstdemo.c $(SOAPHEADER) $(SOAP_C_SRC) ../../stdsoap2.c ../../dom.c ../../plugin/wstapi.c ../../plugin/wsseapi.c ../../plugin/wsaapi.c ../../plugin/smdevp.c ../../plugin/mecevp.c wstdemo_LDADD = $(SAMPLE_SSL_LIBS) $(SAMPLE_EXTRA_LIBS) -lssl -lcrypto -lz all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/wst/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/wst/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) wstdemo$(EXEEXT): $(wstdemo_OBJECTS) $(wstdemo_DEPENDENCIES) $(EXTRA_wstdemo_DEPENDENCIES) @rm -f wstdemo$(EXEEXT) $(AM_V_CCLD)$(wstdemo_LINK) $(wstdemo_OBJECTS) $(wstdemo_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wstdemo-dom.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wstdemo-mecevp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wstdemo-smdevp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wstdemo-soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wstdemo-soapClient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wstdemo-soapServer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wstdemo-stdsoap2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wstdemo-wsaapi.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wstdemo-wsseapi.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wstdemo-wstapi.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wstdemo-wstdemo.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` wstdemo-wstdemo.o: wstdemo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -MT wstdemo-wstdemo.o -MD -MP -MF $(DEPDIR)/wstdemo-wstdemo.Tpo -c -o wstdemo-wstdemo.o `test -f 'wstdemo.c' || echo '$(srcdir)/'`wstdemo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wstdemo-wstdemo.Tpo $(DEPDIR)/wstdemo-wstdemo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wstdemo.c' object='wstdemo-wstdemo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -c -o wstdemo-wstdemo.o `test -f 'wstdemo.c' || echo '$(srcdir)/'`wstdemo.c wstdemo-wstdemo.obj: wstdemo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -MT wstdemo-wstdemo.obj -MD -MP -MF $(DEPDIR)/wstdemo-wstdemo.Tpo -c -o wstdemo-wstdemo.obj `if test -f 'wstdemo.c'; then $(CYGPATH_W) 'wstdemo.c'; else $(CYGPATH_W) '$(srcdir)/wstdemo.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wstdemo-wstdemo.Tpo $(DEPDIR)/wstdemo-wstdemo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wstdemo.c' object='wstdemo-wstdemo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -c -o wstdemo-wstdemo.obj `if test -f 'wstdemo.c'; then $(CYGPATH_W) 'wstdemo.c'; else $(CYGPATH_W) '$(srcdir)/wstdemo.c'; fi` wstdemo-soapClient.o: soapClient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -MT wstdemo-soapClient.o -MD -MP -MF $(DEPDIR)/wstdemo-soapClient.Tpo -c -o wstdemo-soapClient.o `test -f 'soapClient.c' || echo '$(srcdir)/'`soapClient.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wstdemo-soapClient.Tpo $(DEPDIR)/wstdemo-soapClient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapClient.c' object='wstdemo-soapClient.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -c -o wstdemo-soapClient.o `test -f 'soapClient.c' || echo '$(srcdir)/'`soapClient.c wstdemo-soapClient.obj: soapClient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -MT wstdemo-soapClient.obj -MD -MP -MF $(DEPDIR)/wstdemo-soapClient.Tpo -c -o wstdemo-soapClient.obj `if test -f 'soapClient.c'; then $(CYGPATH_W) 'soapClient.c'; else $(CYGPATH_W) '$(srcdir)/soapClient.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wstdemo-soapClient.Tpo $(DEPDIR)/wstdemo-soapClient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapClient.c' object='wstdemo-soapClient.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -c -o wstdemo-soapClient.obj `if test -f 'soapClient.c'; then $(CYGPATH_W) 'soapClient.c'; else $(CYGPATH_W) '$(srcdir)/soapClient.c'; fi` wstdemo-soapC.o: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -MT wstdemo-soapC.o -MD -MP -MF $(DEPDIR)/wstdemo-soapC.Tpo -c -o wstdemo-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wstdemo-soapC.Tpo $(DEPDIR)/wstdemo-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='wstdemo-soapC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -c -o wstdemo-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c wstdemo-soapC.obj: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -MT wstdemo-soapC.obj -MD -MP -MF $(DEPDIR)/wstdemo-soapC.Tpo -c -o wstdemo-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wstdemo-soapC.Tpo $(DEPDIR)/wstdemo-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='wstdemo-soapC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -c -o wstdemo-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` wstdemo-soapServer.o: soapServer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -MT wstdemo-soapServer.o -MD -MP -MF $(DEPDIR)/wstdemo-soapServer.Tpo -c -o wstdemo-soapServer.o `test -f 'soapServer.c' || echo '$(srcdir)/'`soapServer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wstdemo-soapServer.Tpo $(DEPDIR)/wstdemo-soapServer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapServer.c' object='wstdemo-soapServer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -c -o wstdemo-soapServer.o `test -f 'soapServer.c' || echo '$(srcdir)/'`soapServer.c wstdemo-soapServer.obj: soapServer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -MT wstdemo-soapServer.obj -MD -MP -MF $(DEPDIR)/wstdemo-soapServer.Tpo -c -o wstdemo-soapServer.obj `if test -f 'soapServer.c'; then $(CYGPATH_W) 'soapServer.c'; else $(CYGPATH_W) '$(srcdir)/soapServer.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wstdemo-soapServer.Tpo $(DEPDIR)/wstdemo-soapServer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapServer.c' object='wstdemo-soapServer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -c -o wstdemo-soapServer.obj `if test -f 'soapServer.c'; then $(CYGPATH_W) 'soapServer.c'; else $(CYGPATH_W) '$(srcdir)/soapServer.c'; fi` wstdemo-stdsoap2.o: ../../stdsoap2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -MT wstdemo-stdsoap2.o -MD -MP -MF $(DEPDIR)/wstdemo-stdsoap2.Tpo -c -o wstdemo-stdsoap2.o `test -f '../../stdsoap2.c' || echo '$(srcdir)/'`../../stdsoap2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wstdemo-stdsoap2.Tpo $(DEPDIR)/wstdemo-stdsoap2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../stdsoap2.c' object='wstdemo-stdsoap2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -c -o wstdemo-stdsoap2.o `test -f '../../stdsoap2.c' || echo '$(srcdir)/'`../../stdsoap2.c wstdemo-stdsoap2.obj: ../../stdsoap2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -MT wstdemo-stdsoap2.obj -MD -MP -MF $(DEPDIR)/wstdemo-stdsoap2.Tpo -c -o wstdemo-stdsoap2.obj `if test -f '../../stdsoap2.c'; then $(CYGPATH_W) '../../stdsoap2.c'; else $(CYGPATH_W) '$(srcdir)/../../stdsoap2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wstdemo-stdsoap2.Tpo $(DEPDIR)/wstdemo-stdsoap2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../stdsoap2.c' object='wstdemo-stdsoap2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -c -o wstdemo-stdsoap2.obj `if test -f '../../stdsoap2.c'; then $(CYGPATH_W) '../../stdsoap2.c'; else $(CYGPATH_W) '$(srcdir)/../../stdsoap2.c'; fi` wstdemo-dom.o: ../../dom.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -MT wstdemo-dom.o -MD -MP -MF $(DEPDIR)/wstdemo-dom.Tpo -c -o wstdemo-dom.o `test -f '../../dom.c' || echo '$(srcdir)/'`../../dom.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wstdemo-dom.Tpo $(DEPDIR)/wstdemo-dom.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../dom.c' object='wstdemo-dom.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -c -o wstdemo-dom.o `test -f '../../dom.c' || echo '$(srcdir)/'`../../dom.c wstdemo-dom.obj: ../../dom.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -MT wstdemo-dom.obj -MD -MP -MF $(DEPDIR)/wstdemo-dom.Tpo -c -o wstdemo-dom.obj `if test -f '../../dom.c'; then $(CYGPATH_W) '../../dom.c'; else $(CYGPATH_W) '$(srcdir)/../../dom.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wstdemo-dom.Tpo $(DEPDIR)/wstdemo-dom.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../dom.c' object='wstdemo-dom.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -c -o wstdemo-dom.obj `if test -f '../../dom.c'; then $(CYGPATH_W) '../../dom.c'; else $(CYGPATH_W) '$(srcdir)/../../dom.c'; fi` wstdemo-wstapi.o: ../../plugin/wstapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -MT wstdemo-wstapi.o -MD -MP -MF $(DEPDIR)/wstdemo-wstapi.Tpo -c -o wstdemo-wstapi.o `test -f '../../plugin/wstapi.c' || echo '$(srcdir)/'`../../plugin/wstapi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wstdemo-wstapi.Tpo $(DEPDIR)/wstdemo-wstapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wstapi.c' object='wstdemo-wstapi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -c -o wstdemo-wstapi.o `test -f '../../plugin/wstapi.c' || echo '$(srcdir)/'`../../plugin/wstapi.c wstdemo-wstapi.obj: ../../plugin/wstapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -MT wstdemo-wstapi.obj -MD -MP -MF $(DEPDIR)/wstdemo-wstapi.Tpo -c -o wstdemo-wstapi.obj `if test -f '../../plugin/wstapi.c'; then $(CYGPATH_W) '../../plugin/wstapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wstapi.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wstdemo-wstapi.Tpo $(DEPDIR)/wstdemo-wstapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wstapi.c' object='wstdemo-wstapi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -c -o wstdemo-wstapi.obj `if test -f '../../plugin/wstapi.c'; then $(CYGPATH_W) '../../plugin/wstapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wstapi.c'; fi` wstdemo-wsseapi.o: ../../plugin/wsseapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -MT wstdemo-wsseapi.o -MD -MP -MF $(DEPDIR)/wstdemo-wsseapi.Tpo -c -o wstdemo-wsseapi.o `test -f '../../plugin/wsseapi.c' || echo '$(srcdir)/'`../../plugin/wsseapi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wstdemo-wsseapi.Tpo $(DEPDIR)/wstdemo-wsseapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsseapi.c' object='wstdemo-wsseapi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -c -o wstdemo-wsseapi.o `test -f '../../plugin/wsseapi.c' || echo '$(srcdir)/'`../../plugin/wsseapi.c wstdemo-wsseapi.obj: ../../plugin/wsseapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -MT wstdemo-wsseapi.obj -MD -MP -MF $(DEPDIR)/wstdemo-wsseapi.Tpo -c -o wstdemo-wsseapi.obj `if test -f '../../plugin/wsseapi.c'; then $(CYGPATH_W) '../../plugin/wsseapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsseapi.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wstdemo-wsseapi.Tpo $(DEPDIR)/wstdemo-wsseapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsseapi.c' object='wstdemo-wsseapi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -c -o wstdemo-wsseapi.obj `if test -f '../../plugin/wsseapi.c'; then $(CYGPATH_W) '../../plugin/wsseapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsseapi.c'; fi` wstdemo-wsaapi.o: ../../plugin/wsaapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -MT wstdemo-wsaapi.o -MD -MP -MF $(DEPDIR)/wstdemo-wsaapi.Tpo -c -o wstdemo-wsaapi.o `test -f '../../plugin/wsaapi.c' || echo '$(srcdir)/'`../../plugin/wsaapi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wstdemo-wsaapi.Tpo $(DEPDIR)/wstdemo-wsaapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsaapi.c' object='wstdemo-wsaapi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -c -o wstdemo-wsaapi.o `test -f '../../plugin/wsaapi.c' || echo '$(srcdir)/'`../../plugin/wsaapi.c wstdemo-wsaapi.obj: ../../plugin/wsaapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -MT wstdemo-wsaapi.obj -MD -MP -MF $(DEPDIR)/wstdemo-wsaapi.Tpo -c -o wstdemo-wsaapi.obj `if test -f '../../plugin/wsaapi.c'; then $(CYGPATH_W) '../../plugin/wsaapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsaapi.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wstdemo-wsaapi.Tpo $(DEPDIR)/wstdemo-wsaapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsaapi.c' object='wstdemo-wsaapi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -c -o wstdemo-wsaapi.obj `if test -f '../../plugin/wsaapi.c'; then $(CYGPATH_W) '../../plugin/wsaapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsaapi.c'; fi` wstdemo-smdevp.o: ../../plugin/smdevp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -MT wstdemo-smdevp.o -MD -MP -MF $(DEPDIR)/wstdemo-smdevp.Tpo -c -o wstdemo-smdevp.o `test -f '../../plugin/smdevp.c' || echo '$(srcdir)/'`../../plugin/smdevp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wstdemo-smdevp.Tpo $(DEPDIR)/wstdemo-smdevp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/smdevp.c' object='wstdemo-smdevp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -c -o wstdemo-smdevp.o `test -f '../../plugin/smdevp.c' || echo '$(srcdir)/'`../../plugin/smdevp.c wstdemo-smdevp.obj: ../../plugin/smdevp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -MT wstdemo-smdevp.obj -MD -MP -MF $(DEPDIR)/wstdemo-smdevp.Tpo -c -o wstdemo-smdevp.obj `if test -f '../../plugin/smdevp.c'; then $(CYGPATH_W) '../../plugin/smdevp.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/smdevp.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wstdemo-smdevp.Tpo $(DEPDIR)/wstdemo-smdevp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/smdevp.c' object='wstdemo-smdevp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -c -o wstdemo-smdevp.obj `if test -f '../../plugin/smdevp.c'; then $(CYGPATH_W) '../../plugin/smdevp.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/smdevp.c'; fi` wstdemo-mecevp.o: ../../plugin/mecevp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -MT wstdemo-mecevp.o -MD -MP -MF $(DEPDIR)/wstdemo-mecevp.Tpo -c -o wstdemo-mecevp.o `test -f '../../plugin/mecevp.c' || echo '$(srcdir)/'`../../plugin/mecevp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wstdemo-mecevp.Tpo $(DEPDIR)/wstdemo-mecevp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/mecevp.c' object='wstdemo-mecevp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -c -o wstdemo-mecevp.o `test -f '../../plugin/mecevp.c' || echo '$(srcdir)/'`../../plugin/mecevp.c wstdemo-mecevp.obj: ../../plugin/mecevp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -MT wstdemo-mecevp.obj -MD -MP -MF $(DEPDIR)/wstdemo-mecevp.Tpo -c -o wstdemo-mecevp.obj `if test -f '../../plugin/mecevp.c'; then $(CYGPATH_W) '../../plugin/mecevp.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/mecevp.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wstdemo-mecevp.Tpo $(DEPDIR)/wstdemo-mecevp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/mecevp.c' object='wstdemo-mecevp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wstdemo_CFLAGS) $(CFLAGS) -c -o wstdemo-mecevp.obj `if test -f '../../plugin/mecevp.c'; then $(CYGPATH_W) '../../plugin/mecevp.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/mecevp.c'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/wstdemo-dom.Po -rm -f ./$(DEPDIR)/wstdemo-mecevp.Po -rm -f ./$(DEPDIR)/wstdemo-smdevp.Po -rm -f ./$(DEPDIR)/wstdemo-soapC.Po -rm -f ./$(DEPDIR)/wstdemo-soapClient.Po -rm -f ./$(DEPDIR)/wstdemo-soapServer.Po -rm -f ./$(DEPDIR)/wstdemo-stdsoap2.Po -rm -f ./$(DEPDIR)/wstdemo-wsaapi.Po -rm -f ./$(DEPDIR)/wstdemo-wsseapi.Po -rm -f ./$(DEPDIR)/wstdemo-wstapi.Po -rm -f ./$(DEPDIR)/wstdemo-wstdemo.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/wstdemo-dom.Po -rm -f ./$(DEPDIR)/wstdemo-mecevp.Po -rm -f ./$(DEPDIR)/wstdemo-smdevp.Po -rm -f ./$(DEPDIR)/wstdemo-soapC.Po -rm -f ./$(DEPDIR)/wstdemo-soapClient.Po -rm -f ./$(DEPDIR)/wstdemo-soapServer.Po -rm -f ./$(DEPDIR)/wstdemo-stdsoap2.Po -rm -f ./$(DEPDIR)/wstdemo-wsaapi.Po -rm -f ./$(DEPDIR)/wstdemo-wsseapi.Po -rm -f ./$(DEPDIR)/wstdemo-wstapi.Po -rm -f ./$(DEPDIR)/wstdemo-wstdemo.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/wst/wstdemo.c0000644000175000017500000006311213525245163017515 0ustar ellertellert/* wstdemo.c WS-Trust demo application. gSOAP XML Web services tools Copyright (C) 2000-2016, 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. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- This application demonstrates the wst WS-Trust extensible framework. Compile in C: soapcpp2 -c -I import wstdemo.h cc -DSKIP_CERTIFICATE_VERIFICATION -DWITH_DOM -DWITH_OPENSSL -DWITH_GZIP -o wstdemo wstdemo.c stdsoap2.c dom.c wstapi.c wsaapi.c wsseapi.c smdevp.c mecevp.c soapC.c soapClient.c soapServer.c -lcrypto -lssl -lz Compile in C++ (assuming .c files treated as .cpp files): soapcpp2 -I import wstdemo.h c++ -DSKIP_CERTIFICATE_VERIFICATION -DWITH_DOM -DWITH_OPENSSL -DWITH_GZIP -o wstdemo wstdemo.c stdsoap2.cpp dom.cpp wstapi.c wsaapi.c wsseapi.c smdevp.c mecevp.c soapC.cpp soapClient.cpp soapServer.cpp -lcrypto -lssl -lz Other required files: server.pem server private key and certificate (do not distrubute) servercert.pem server public certificate for public distribution cacert.pem root CA certificate for public distribution Note: The wsse.h, wsu.h, ds.h, xenc.h c14n.h files are located in 'import'. The smdevp.*, mecevp.*, wstapi.*, wsaapi.*, and wsseapi.* files are located in 'plugin'. Usage: wstdemo cinsz [port] with options: c enable chunked HTTP i indent XML n canonicalize XML (recommended!) s server (stand-alone) z enable compression For example, to generate a SAML 2.0 request message and store it in file 'wstdemo.xml': ./wstdemo n > wstdemo.xml < /dev/null To parse and verify this request message: ./wstdemo ns < wstdemo.xml To run a stand-alone server: ./wstdemo ns 8080 And invoking it with a client: ./wstdemo n 8080 To test multiple calls using HTTP keep-alive, add a single digit number of runs at the end of the options: ./wstdemo n4 8080 */ #include "wstapi.h" #include "wsaapi.h" #include "wsseapi.h" #include "wst.nsmap" static int ssl_verify(int ok, X509_STORE_CTX *store); #define SERVER "http://localhost:8080" #define PORT 8080 #define APPLIESTO "mycompany.com" #define USERNAME "Username" #define PASSWORD "Password" EVP_PKEY *rsa_privk = NULL; /* server-side settings before soap_serve() to verify signatures and decrypt messages */ static int set_verify_decrypt_auto(struct soap *soap) { /* verify signatures and enable decryption */ if (soap_wsse_verify_auto(soap, SOAP_SMD_NONE, NULL, 0) || soap_wsse_decrypt_auto(soap, SOAP_MEC_ENV_ENC_AES256_CBC, rsa_privk, 0)) return soap->error; return SOAP_OK; } int main(int argc, char **argv) { int server = 0; int port = 0; int runs = 1; struct soap *soap = soap_new(); /* register wsa plugin (optional, only if the client requires WS-Addressing rerouted messaging) */ soap_register_plugin(soap, soap_wsa); /* register wsse plugin */ soap_register_plugin(soap, soap_wsse); /* options */ if (argc >= 2) { if (strchr(argv[1], 's')) server = 1; if (strchr(argv[1], 'c')) soap_set_omode(soap, SOAP_IO_CHUNK); else if (strchr(argv[1], 'y')) soap_set_omode(soap, SOAP_IO_STORE); if (strchr(argv[1], 'i')) soap_set_omode(soap, SOAP_XML_INDENT); if (strchr(argv[1], 'n')) soap_set_omode(soap, SOAP_XML_CANONICAL); if (strchr(argv[1], 'z')) soap_set_mode(soap, SOAP_ENC_ZLIB); if (isdigit(argv[1][strlen(argv[1])-1])) { runs = argv[1][strlen(argv[1])-1] - '0'; soap_set_mode(soap, SOAP_IO_KEEPALIVE); } } /* port argument */ if (argc >= 3) port = atoi(argv[2]); if (server) { FILE *fd; /* Get private key, certificate, and public key */ fd = fopen("server.pem", "r"); if (!fd) return soap_receiver_fault(soap, "Could not read server.pem", NULL); rsa_privk = PEM_read_PrivateKey(fd, NULL, NULL, (void*)"password"); fclose(fd); if (!rsa_privk) return soap_receiver_fault(soap, "Could not read private RSA key from server.pem", NULL); /* HTTPS settings */ if (soap_ssl_server_context(soap, SOAP_SSL_DEFAULT, "server.pem", "password", "cacert.pem", NULL, NULL, NULL, NULL)) { soap_print_fault(soap, stderr); exit(1); } /* HTTPS and SAML certificate verification callback */ soap->fsslverify = ssl_verify; if (port) { /* bind port */ if (!soap_valid_socket(soap_bind(soap, NULL, port, 100))) { soap_print_fault(soap, stderr); exit(1); } printf("Server started at port %d\n", port); /* HTTP keep-alive is not trivial to support when we need to set soap_wsse_verify_auto and soap_wsse_decrypt_auto */ if (soap->mode & SOAP_IO_KEEPALIVE) { /* set the serverloop callback to call soap_wsse_verify_auto and soap_wsse_decrypt_auto etc. for each next iteration */ soap->fserveloop = set_verify_decrypt_auto; } while (soap_valid_socket(soap_accept(soap))) { fprintf(stderr, "Accepting connection from IP %d.%d.%d.%d\n", (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF); /* init verify/decrypt and serve request */ if (set_verify_decrypt_auto(soap) || soap_serve(soap)) { soap_wsse_delete_Security(soap); soap_print_fault(soap, stderr); soap_print_fault_location(soap, stderr); } soap_destroy(soap); soap_end(soap); } soap_print_fault(soap, stderr); exit(1); } else /* CGI-style server serving messages over stdin/out */ { /* init verify/decrypt and serve request */ if (set_verify_decrypt_auto(soap) || soap_serve(soap)) { soap_wsse_delete_Security(soap); soap_print_fault(soap, stderr); soap_print_fault_location(soap, stderr); } soap_destroy(soap); soap_end(soap); } } else /* client */ { X509 *cert = NULL; FILE *fd; int soapver = 2; /* SOAP 1.2 */ char endpoint[80]; const char *to = endpoint; const char *appliesto = APPLIESTO; const char *username = USERNAME; const char *password = PASSWORD; int i; /* HTTPS settings */ if (soap_ssl_client_context(soap, SOAP_SSL_DEFAULT, NULL, NULL, "cacert.pem", NULL, NULL)) { soap_print_fault(soap, stderr); exit(1); } /* HTTPS and SAML certificate verification callback */ soap->fsslverify = ssl_verify; /* Get private key, certificate, and public key */ fd = fopen("server.pem", "r"); if (!fd) return soap_receiver_fault(soap, "Could not read server.pem", NULL); rsa_privk = PEM_read_PrivateKey(fd, NULL, NULL, (void*)"password"); fclose(fd); if (!rsa_privk) return soap_receiver_fault(soap, "Could not read private RSA key from server.pem", NULL); fd = fopen("servercert.pem", "r"); if (!fd) return soap_receiver_fault(soap, "Could not read servercert.pem", NULL); cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); if (!cert) soap_receiver_fault(soap, "Could not read certificate from servercert.pem", NULL); /* client sends messages to stdout or to a server port */ if (port) (SOAP_SNPRINTF(endpoint, sizeof(endpoint), 37), "http://localhost:%d", port); else soap_strcpy(endpoint, sizeof(endpoint), "http://"); /* run one or more times */ for (i = 0; i < runs; ++i) { saml2__AssertionType *saml2; /* sign the request message */ soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert); soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token"); soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_privk, 0); /* init verify/decrypt of responses and make the call to request a SAML 2.0 token */ if (set_verify_decrypt_auto(soap) || soap_wst_request_saml_token(soap, to, soapver, appliesto, username, password, NULL, &saml2)) { soap_print_fault(soap, stderr); } else if (i == 0) { /* display some of the assertion information */ if (saml2) { int i; fprintf(stderr, "SAML 2.0 received and verified OK:\n"); for (i = 0; i < saml2->__size_AssertionType; i++) { if (saml2->__union_AssertionType[i].saml2__Statement) { /* left out SAML statements from being displayed */ } if (saml2->__union_AssertionType[i].saml2__AuthnStatement) { if (saml2->__union_AssertionType[i].saml2__AuthnStatement->saml2__AuthnContext) { if (saml2->__union_AssertionType[i].saml2__AuthnStatement->saml2__AuthnContext->saml2__AuthnContextClassRef) fprintf(stderr, "AuthnStatement Context: %s\n", saml2->__union_AssertionType[i].saml2__AuthnStatement->saml2__AuthnContext->saml2__AuthnContextClassRef); } } if (saml2->__union_AssertionType[i].saml2__AuthzDecisionStatement) { /* left out SAML decision statements from being displayed */ } if (saml2->__union_AssertionType[i].saml2__AttributeStatement) { int j; for (j = 0; j < saml2->__union_AssertionType[i].saml2__AttributeStatement->__size_AttributeStatementType; j++) { if (saml2->__union_AssertionType[i].saml2__AttributeStatement->__union_AttributeStatementType[j].saml2__Attribute) { int k; for (k = 0; k < saml2->__union_AssertionType[i].saml2__AttributeStatement->__union_AttributeStatementType[j].saml2__Attribute->__sizeAttributeValue; k++) fprintf(stderr, "Type: %s\nValue: %s\n", saml2->__union_AssertionType[i].saml2__AttributeStatement->__union_AttributeStatementType[j].saml2__Attribute->Name, saml2->__union_AssertionType[i].saml2__AttributeStatement->__union_AttributeStatementType[j].saml2__Attribute->saml2__AttributeValue[k]); } } } } if (saml2->saml2__Conditions) { if (saml2->saml2__Conditions->NotBefore) fprintf(stderr, "Not before %s\n", soap_dateTime2s(soap, *saml2->saml2__Conditions->NotBefore)); if (saml2->saml2__Conditions->NotOnOrAfter) fprintf(stderr, "Not on or after %s\n", soap_dateTime2s(soap, *saml2->saml2__Conditions->NotOnOrAfter)); } fprintf(stderr, "\nAssertion data:\n\n"); soap_set_omode(soap, SOAP_XML_INDENT); soap->sendfd = 2; soap_write_saml2__AssertionType(soap, saml2); fprintf(stderr, "\n\nOK\n\n"); } else { fprintf(stderr, "No SAML 2.0 received!\n"); } } soap_destroy(soap); soap_end(soap); } } soap_free(soap); } /******************************************************************************\ * * Server-side WS-Trust Operations * \******************************************************************************/ SOAP_FMAC5 int SOAP_FMAC6 __wst__RequestSecurityToken(struct soap *soap, struct wst__RequestSecurityTokenType *request, struct wst__RequestSecurityTokenResponseType *response) { DBGFUN("__wst__RequestSecurityToken"); /* Check WS-Addressing */ if (soap_wsa_check(soap)) return soap->error; /* Check if RequestSecurityToken was signed (as required) */ if (soap_wsse_verify_element(soap, SOAP_NAMESPACE_OF_wst, "RequestSecurityToken") == 0) { soap_wsse_delete_Security(soap); return soap_sender_fault_subcode(soap, "wst:InvalidRequest", "The request was invalid or malformed", NULL); } /* Check request */ if (!request || !request->TokenType || !request->RequestType || strcmp(request->RequestType, SOAP_NAMESPACE_OF_wst "/Issue")) return soap_sender_fault_subcode(soap, "wst:InvalidRequest", "The request was invalid or malformed", NULL); /* Request SAML 2.0 token? */ if (!strcmp(request->TokenType, "urn:oasis:names:tc:SAML:2.0:assertion")) { saml2__AssertionType *assertion; X509 *cert = NULL; char buf[1024]; FILE *fd; time_t now = time(NULL), expires = now + 60*60; /* one hour */ const char *appliesto = NULL; const char *username; /* Check Username and Password */ username = soap_wsse_get_Username(soap); if (!username) { soap_wsse_delete_Security(soap); return soap->error; } if (strcmp(username, USERNAME) || soap_wsse_verify_Password(soap, PASSWORD)) { soap_wsse_delete_Security(soap); return soap_wsse_fault(soap, wsse__FailedAuthentication, "Username authentication required"); } soap_wsse_delete_Security(soap); /* Check AppliesTo */ if (request->wsp__AppliesTo && request->wsp__AppliesTo->SOAP_WSA(EndpointReference)) appliesto = request->wsp__AppliesTo->SOAP_WSA(EndpointReference)->Address; if (!appliesto || strcmp(appliesto, APPLIESTO)) return soap_sender_fault_subcode(soap, "wst:InvalidRequest", "The request was invalid or malformed", NULL); if (strcmp(request->KeyType, SOAP_NAMESPACE_OF_wst "/Bearer")) return soap_sender_fault_subcode(soap, "wst:InvalidRequest", "The request was invalid or malformed", request->KeyType); /* Get private key, certificate, and public key */ fd = fopen("server.pem", "r"); if (!fd) return soap_receiver_fault(soap, "Could not read server.pem", NULL); rsa_privk = PEM_read_PrivateKey(fd, NULL, NULL, (void*)"password"); fclose(fd); if (!rsa_privk) return soap_receiver_fault(soap, "Could not read private RSA key from server.pem", NULL); fd = fopen("servercert.pem", "r"); if (!fd) return soap_receiver_fault(soap, "Could not read servercert.pem", NULL); cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); if (!cert) soap_receiver_fault(soap, "Could not read certificate from servercert.pem", NULL); /* Create SAML 2.0 Assertion */ assertion = (saml2__AssertionType*)soap_malloc(soap, sizeof(saml2__AssertionType)); if (!assertion) return soap->error = SOAP_EOM; soap_default_saml2__AssertionType(soap, assertion); assertion->Version = (char*)"2.0"; assertion->IssueInstant = now; /* Issuer = certificate issuer */ assertion->saml2__Issuer = (struct saml2__NameIDType*)soap_malloc(soap, sizeof(struct saml2__NameIDType)); if (!assertion->saml2__Issuer) return soap->error = SOAP_EOM; soap_default_saml2__NameIDType(soap, assertion->saml2__Issuer); X509_NAME_oneline(X509_get_issuer_name(cert), buf, sizeof(buf)-1); assertion->saml2__Issuer->__item = soap_strdup(soap, buf); /* Conditions */ assertion->saml2__Conditions = (struct saml2__ConditionsType*)soap_malloc(soap, sizeof(struct saml2__ConditionsType)); if (!assertion->saml2__Conditions) return soap->error = SOAP_EOM; soap_default_saml2__ConditionsType(soap, assertion->saml2__Conditions); assertion->saml2__Conditions->NotBefore = (time_t*)soap_malloc(soap, sizeof(time_t)); if (!assertion->saml2__Conditions->NotBefore) return soap->error = SOAP_EOM; *assertion->saml2__Conditions->NotBefore = now; assertion->saml2__Conditions->NotOnOrAfter = (time_t*)soap_malloc(soap, sizeof(time_t)); if (!assertion->saml2__Conditions->NotOnOrAfter) return soap->error = SOAP_EOM; *assertion->saml2__Conditions->NotOnOrAfter = expires; /* Conditions/AudienceRestriction = wsp:AppliesTo */ assertion->saml2__Conditions->__size_ConditionsType = 1; assertion->saml2__Conditions->__union_ConditionsType = (struct __saml2__union_ConditionsType*)soap_malloc(soap, sizeof(struct __saml2__union_ConditionsType)); if (!assertion->saml2__Conditions->__union_ConditionsType) return soap->error = SOAP_EOM; soap_default___saml2__union_ConditionsType(soap, assertion->saml2__Conditions->__union_ConditionsType); assertion->saml2__Conditions->__union_ConditionsType->saml2__AudienceRestriction = (struct saml2__AudienceRestrictionType*)soap_malloc(soap, sizeof(struct saml2__AudienceRestrictionType)); if (!assertion->saml2__Conditions->__union_ConditionsType->saml2__AudienceRestriction) return soap->error = SOAP_EOM; soap_default_saml2__AudienceRestrictionType(soap, assertion->saml2__Conditions->__union_ConditionsType->saml2__AudienceRestriction); assertion->saml2__Conditions->__union_ConditionsType->saml2__AudienceRestriction->__sizeAudience = 1; assertion->saml2__Conditions->__union_ConditionsType->saml2__AudienceRestriction->saml2__Audience = &request->wsp__AppliesTo->SOAP_WSA(EndpointReference)->Address; /* AuthnStatement and AttributeStatement */ assertion->__size_AssertionType = 2; assertion->__union_AssertionType = (struct __saml2__union_AssertionType*)soap_malloc(soap, 2 * sizeof(struct __saml2__union_AssertionType)); if (!assertion->__union_AssertionType) return soap->error = SOAP_EOM; soap_default___saml2__union_AssertionType(soap, &assertion->__union_AssertionType[0]); soap_default___saml2__union_AssertionType(soap, &assertion->__union_AssertionType[1]); assertion->__union_AssertionType[0].saml2__AuthnStatement = (struct saml2__AuthnStatementType*)soap_malloc(soap, sizeof(struct saml2__AuthnStatementType)); if (!assertion->__union_AssertionType[0].saml2__AuthnStatement) return soap->error = SOAP_EOM; soap_default_saml2__AuthnStatementType(soap, assertion->__union_AssertionType[0].saml2__AuthnStatement); assertion->__union_AssertionType[0].saml2__AuthnStatement->AuthnInstant = now; assertion->__union_AssertionType[0].saml2__AuthnStatement->saml2__AuthnContext = (struct saml2__AuthnContextType*)soap_malloc(soap, sizeof(struct saml2__AuthnContextType)); if (!assertion->__union_AssertionType[0].saml2__AuthnStatement->saml2__AuthnContext) return soap->error = SOAP_EOM; soap_default_saml2__AuthnContextType(soap, assertion->__union_AssertionType[0].saml2__AuthnStatement->saml2__AuthnContext); assertion->__union_AssertionType[0].saml2__AuthnStatement->saml2__AuthnContext->saml2__AuthnContextClassRef = (char*)"urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport"; assertion->__union_AssertionType[1].saml2__AttributeStatement = (struct saml2__AttributeStatementType*)soap_malloc(soap, sizeof(struct saml2__AttributeStatementType)); if (!assertion->__union_AssertionType[1].saml2__AttributeStatement) return soap->error = SOAP_EOM; soap_default_saml2__AttributeStatementType(soap, assertion->__union_AssertionType[1].saml2__AttributeStatement); assertion->__union_AssertionType[1].saml2__AttributeStatement->__size_AttributeStatementType = 1; assertion->__union_AssertionType[1].saml2__AttributeStatement->__union_AttributeStatementType = (struct __saml2__union_AttributeStatementType*)soap_malloc(soap, sizeof(struct __saml2__union_AttributeStatementType)); if (!assertion->__union_AssertionType[1].saml2__AttributeStatement->__union_AttributeStatementType) return soap->error = SOAP_EOM; soap_default___saml2__union_AttributeStatementType(soap, assertion->__union_AssertionType[1].saml2__AttributeStatement->__union_AttributeStatementType); assertion->__union_AssertionType[1].saml2__AttributeStatement->__union_AttributeStatementType->saml2__Attribute = (struct saml2__AttributeType*)soap_malloc(soap, sizeof(struct saml2__AttributeType)); if (!assertion->__union_AssertionType[1].saml2__AttributeStatement->__union_AttributeStatementType->saml2__Attribute) return soap->error = SOAP_EOM; soap_default_saml2__AttributeType(soap, assertion->__union_AssertionType[1].saml2__AttributeStatement->__union_AttributeStatementType->saml2__Attribute); assertion->__union_AssertionType[1].saml2__AttributeStatement->__union_AttributeStatementType->saml2__Attribute->Name = (char*)username; /* more logic can go here to populate SAML 2.0 assertion subject, conditions, statements, and attributes */ /* sign the SAML token */ if (soap_wsse_sign_saml2(soap, assertion, SOAP_SMD_SIGN_RSA_SHA256, rsa_privk, 0, cert)) return soap->error; /* this part if for testing the validity of the SAML token only and can be omitted */ /* assumes soap->cacert = "cacert.pem"; */ /* already set with soap_ssl_server_context() */ if (soap_wsse_verify_saml2(soap, assertion)) return soap_receiver_fault(soap, "Cannot sign SAML token (invalid key or certificate)", NULL); response->RequestedSecurityToken = (wst__RequestedSecurityTokenType*)soap_malloc(soap, sizeof(wst__RequestedSecurityTokenType)); if (!response->RequestedSecurityToken) return soap->error = SOAP_EOM; soap_default_wst__RequestedSecurityTokenType(soap, response->RequestedSecurityToken); response->RequestedSecurityToken->saml2__Assertion = assertion; /* sign */ if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_privk, 0)) { soap_wsse_delete_Security(soap); return soap->error; } } /* other WS-Trust logic goes here to populate RSTR */ response->Context = request->Context; response->TokenType = request->TokenType; response->RequestType = request->RequestType; response->KeyType = request->KeyType; return soap_wsa_reply(soap, NULL, soap_wst_rstr_action); } SOAP_FMAC5 int SOAP_FMAC6 __wst__RequestSecurityTokenResponse(struct soap *soap, struct wst__RequestSecurityTokenResponseType *request, struct wst__RequestSecurityTokenResponseCollectionType *response) { (void)soap; (void)request; (void)response; /* service logic goes here to populate RSTRC */ return soap_wsa_reply(soap, NULL, soap_wst_rstrc_action); } SOAP_FMAC5 int SOAP_FMAC6 __wst__RequestSecurityTokenCollection(struct soap *soap, struct wst__RequestSecurityTokenCollectionType *request, struct wst__RequestSecurityTokenResponseCollectionType *response) { (void)soap; (void)request; (void)response; /* service logic goes here to populate RSTRC */ return soap_wsa_reply(soap, NULL, soap_wst_rstrc_action); } /******************************************************************************\ * * WS-Addressing relayed SOAP-ENV:Fault Handler for FaultTo Server * \******************************************************************************/ SOAP_FMAC5 int SOAP_FMAC6 SOAP_ENV__Fault(struct soap *soap, char *faultcode, char *faultstring, char *faultactor, struct SOAP_ENV__Detail *detail, struct SOAP_ENV__Code *SOAP_ENV__Code, struct SOAP_ENV__Reason *SOAP_ENV__Reason, char *SOAP_ENV__Node, char *SOAP_ENV__Role, struct SOAP_ENV__Detail *SOAP_ENV__Detail) { /* populate the fault struct from the operation arguments to print it */ soap_fault(soap); /* SOAP 1.1 */ soap->fault->faultcode = faultcode; soap->fault->faultstring = faultstring; soap->fault->faultactor = faultactor; soap->fault->detail = detail; /* SOAP 1.2 */ soap->fault->SOAP_ENV__Code = SOAP_ENV__Code; soap->fault->SOAP_ENV__Reason = SOAP_ENV__Reason; soap->fault->SOAP_ENV__Node = SOAP_ENV__Node; soap->fault->SOAP_ENV__Role = SOAP_ENV__Role; soap->fault->SOAP_ENV__Detail = SOAP_ENV__Detail; /* set error */ soap->error = SOAP_FAULT; return soap_send_empty_response(soap, SOAP_OK); /* HTTP 202 Accepted */ } /******************************************************************************\ * * Callbacks * \******************************************************************************/ static int ssl_verify(int ok, X509_STORE_CTX *store) { #ifdef SKIP_CERTIFICATE_VERIFICATION ok = 1; (void)store; #else /* HTTPS and SAML certificate verification, return 0 when fails 1 when ok */ if (!ok) { char buf[1024]; int err = X509_STORE_CTX_get_error(store); X509 *cert = X509_STORE_CTX_get_current_cert(store); switch (err) { /* these may be tolerable exceptions: case X509_V_ERR_CERT_NOT_YET_VALID: case X509_V_ERR_CERT_HAS_EXPIRED: case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: case X509_V_ERR_UNABLE_TO_GET_CRL: case X509_V_ERR_CRL_NOT_YET_VALID: case X509_V_ERR_CRL_HAS_EXPIRED: X509_STORE_CTX_set_error(store, X509_V_OK); ok = 1; break; */ default: fprintf(stderr, "SSL verify error %d or warning with certificate at depth %d: %s\n", err, X509_STORE_CTX_get_error_depth(store), X509_verify_cert_error_string(err)); X509_NAME_oneline(X509_get_issuer_name(cert), buf, sizeof(buf)); fprintf(stderr, " certificate issuer: %s\n", buf); X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)); fprintf(stderr, " certificate subject: %s\n", buf); } } #endif return ok; } gsoap-2.8.91/gsoap/samples/wst/server.pem0000644000175000017500000000724213525245163017702 0ustar ellertellert-----BEGIN ENCRYPTED PRIVATE KEY----- MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIQcdZuFt0YzgCAggA MBQGCCqGSIb3DQMHBAig/PutfpxHfwSCAoCSsevV3jWwaMLqzkz4FtHPPKI9Guiz y3HjO4uHUnTZNyHA87ukCBYcn06fj4lLsdzShC4PKq1us9WlPgp7iXjS3HxvSNkV JaKfZ1W0LtNnY5BJvp+rFgmrO0/FWwVBuCg4yQCO0PtREif5Sf47qMn/uQI+G9K9 nZcav3w+nI6p9pwUcyFEpKFMLixCFNBHnQCO0SA7PsSHcHe8vntvMXGYnnEjjSq7 pjD2eIV0A5lDYn/u0HQasY0FvLqbDWblZtcI2DAAbwzq0YPK3kPYEKUe/9r3JT5o kRsVak7ZOao1Xfd4c57QrRk4zNuPLDmQJFi3FhtScMGB2de5QIKnzvAyjU2TMhKK xezFZ173p6wNO7+xTmurZ5wfgZQ9EbbaGzdFMhH+IZA0NEVogZn40fjoWKR0Xhwc FfQUuCraq9O7V6xmR19vJNzGGD5WljzTaHPdqlJiBof9L32IfJnEMelr4wf/kZFq VMYieFjB8GZslZEKJC3Y3r+4KOZwdPz3fPCTyYcYt13TFRc+ffE632GHZr4LRrJD +Gy8QHxkA1veyeh+2U52lJylzK2JKQ2nqcIk0d5AIizAf4e6Ow2NXmUgUpirJgUH hfI4Ejed8zgoqk5T2k1jj8zY7I7lpHo4V5Fi5lwc3ubzKZi6lD/Rdqcz3uZUN8gQ 8ZQe4XHtImsS9QkgdAeVgzLW5rKrx5UKYI2z7538YAanSJGX0N2c6Fsd0rx4sFkx HqVgwy0JEZT2ajwdkVOXIEnVZ7/immdAyddeYnxnHl6GnKP6i7vN8/9jCu/VSSzt HECoqQ7eu0j+PsAN0N0JVbTJMEgWwkKc7RG+4M4MNIbTbLJn16KEfCxD -----END ENCRYPTED PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIID4TCCA0qgAwIBAgIBITANBgkqhkiG9w0BAQUFADCBjTELMAkGA1UEBhMCVVMx CzAJBgNVBAgTAkZMMRQwEgYDVQQHEwtUYWxsYWhhc3NlZTEWMBQGA1UEChMNR2Vu aXZpYSwgSW5jLjELMAkGA1UECxMCSVQxEjAQBgNVBAMTCWxvY2FsaG9zdDEiMCAG CSqGSIb3DQEJARYTY29udGFjdEBnZW5pdmlhLmNvbTAeFw0xODA4MjUxNzU4Mzda Fw0yMTA4MjQxNzU4MzdaMIGNMQswCQYDVQQGEwJVUzELMAkGA1UECBMCRkwxFDAS BgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJbmMuMQswCQYD VQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcNAQkBFhNjb250 YWN0QGdlbml2aWEuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDsMNey f1zqU26XTAYsjsHVfSzuQcHX7H6rVDej4i+syy7JF198AlZXKNyx+lDbDzTWmEJM wJtelxoVmnnIJPYTxWlWYCXc+9QwopQ4Jm0rANdfTujDDHug2uMxfTiJNJGq4eOm VrghruL6l96H5aHveauzUh7XiEbcFSL9+1h8twIDAQABo4IBTTCCAUkwCQYDVR0T BAIwADALBgNVHQ8EBAMCBPAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd BgNVHQ4EFgQUl21S3PtNIU5VptaFc0rS21mVve4wgcIGA1UdIwSBujCBt4AUVixg D6n5N0NNc/tWvNSYuhDTKkmhgZOkgZAwgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb22CCQCG9y4FBiOi4zANBgkqhkiG9w0BAQUF AAOBgQBE4Swc3a+wyEXqXGB753H10PmpqpcmpUaLmTfBKvgl1WeLhAZqcpKiKWnH s2BNKE68Ndlopo4ttP3DIkf69vKrUrTANzui5pdShdEom6SJ1yjm/mTFSXNOxAs7 kkbwMTnYltSLvNLdBV22pVmHbRP0G6xwTi7Br5ZIGcQGEQDaDw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJAIb3LgUGI6LjMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE4MDgy NTE3NTczNloXDTIxMDgyNDE3NTczNlowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBAMXNOWKaNVtyWpWa/5/mNXZ7cgv+v5B1RL0OoOwvoQ5dHhc4KycDPAtiiV+I AoZy7bLbARWJboLPo3JnOf3Mc0aQjVFXz+X8eVhEseCIP4HAWSGa5ISDVDdxj4Nh RfwlVtrmLdL08HkTr+f3scHRvtvtmAtTFeT9FOCzttMpBRTXAgMBAAGjgfUwgfIw HQYDVR0OBBYEFFYsYA+p+TdDTXP7VrzUmLoQ0ypJMIHCBgNVHSMEgbowgbeAFFYs YA+p+TdDTXP7VrzUmLoQ0ypJoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkAhvcuBQYjouMwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQA1xebtW3G5e9Xfz2zys4d+628r2qy4ov0ggGS5 WmrBhyIFCE+xW1bj5waLMOt0e4+yfODMTcVKArrrthJdHm5YFILT9ZU2hOEOZw5P Dizc3Q34yzQxXrpsaHri5OfM0wgiIJOynz/YbX2f46YpqhMT7VvNoI8sR+OIydcY mi3qVQ== -----END CERTIFICATE----- gsoap-2.8.91/gsoap/samples/wst/servercert.pem0000644000175000017500000000522113525245163020553 0ustar ellertellert-----BEGIN CERTIFICATE----- MIID4TCCA0qgAwIBAgIBITANBgkqhkiG9w0BAQUFADCBjTELMAkGA1UEBhMCVVMx CzAJBgNVBAgTAkZMMRQwEgYDVQQHEwtUYWxsYWhhc3NlZTEWMBQGA1UEChMNR2Vu aXZpYSwgSW5jLjELMAkGA1UECxMCSVQxEjAQBgNVBAMTCWxvY2FsaG9zdDEiMCAG CSqGSIb3DQEJARYTY29udGFjdEBnZW5pdmlhLmNvbTAeFw0xODA4MjUxNzU4Mzda Fw0yMTA4MjQxNzU4MzdaMIGNMQswCQYDVQQGEwJVUzELMAkGA1UECBMCRkwxFDAS BgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJbmMuMQswCQYD VQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcNAQkBFhNjb250 YWN0QGdlbml2aWEuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDsMNey f1zqU26XTAYsjsHVfSzuQcHX7H6rVDej4i+syy7JF198AlZXKNyx+lDbDzTWmEJM wJtelxoVmnnIJPYTxWlWYCXc+9QwopQ4Jm0rANdfTujDDHug2uMxfTiJNJGq4eOm VrghruL6l96H5aHveauzUh7XiEbcFSL9+1h8twIDAQABo4IBTTCCAUkwCQYDVR0T BAIwADALBgNVHQ8EBAMCBPAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd BgNVHQ4EFgQUl21S3PtNIU5VptaFc0rS21mVve4wgcIGA1UdIwSBujCBt4AUVixg D6n5N0NNc/tWvNSYuhDTKkmhgZOkgZAwgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb22CCQCG9y4FBiOi4zANBgkqhkiG9w0BAQUF AAOBgQBE4Swc3a+wyEXqXGB753H10PmpqpcmpUaLmTfBKvgl1WeLhAZqcpKiKWnH s2BNKE68Ndlopo4ttP3DIkf69vKrUrTANzui5pdShdEom6SJ1yjm/mTFSXNOxAs7 kkbwMTnYltSLvNLdBV22pVmHbRP0G6xwTi7Br5ZIGcQGEQDaDw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJAIb3LgUGI6LjMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE4MDgy NTE3NTczNloXDTIxMDgyNDE3NTczNlowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBAMXNOWKaNVtyWpWa/5/mNXZ7cgv+v5B1RL0OoOwvoQ5dHhc4KycDPAtiiV+I AoZy7bLbARWJboLPo3JnOf3Mc0aQjVFXz+X8eVhEseCIP4HAWSGa5ISDVDdxj4Nh RfwlVtrmLdL08HkTr+f3scHRvtvtmAtTFeT9FOCzttMpBRTXAgMBAAGjgfUwgfIw HQYDVR0OBBYEFFYsYA+p+TdDTXP7VrzUmLoQ0ypJMIHCBgNVHSMEgbowgbeAFFYs YA+p+TdDTXP7VrzUmLoQ0ypJoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkAhvcuBQYjouMwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQA1xebtW3G5e9Xfz2zys4d+628r2qy4ov0ggGS5 WmrBhyIFCE+xW1bj5waLMOt0e4+yfODMTcVKArrrthJdHm5YFILT9ZU2hOEOZw5P Dizc3Q34yzQxXrpsaHri5OfM0wgiIJOynz/YbX2f46YpqhMT7VvNoI8sR+OIydcY mi3qVQ== -----END CERTIFICATE----- gsoap-2.8.91/gsoap/samples/wst/cacerts.pem0000644000175000017500000062777613525245163020044 0ustar ellertellert# Part of the source for this file is provided by Mozilla: # http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 # This file was converted to PEM format with tools provided by OpenSSL. # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. GlobalSign Root CA ================== -----BEGIN CERTIFICATE----- MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== -----END CERTIFICATE----- GlobalSign Root CA - R2 ======================= -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp 9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu 01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== -----END CERTIFICATE----- Verisign Class 3 Public Primary Certification Authority - G3 ============================================================ -----BEGIN CERTIFICATE----- MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== -----END CERTIFICATE----- Entrust.net Premium 2048 Secure Server CA ========================================= -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= -----END CERTIFICATE----- Baltimore CyberTrust Root ========================= -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp -----END CERTIFICATE----- AddTrust External Root ====================== -----BEGIN CERTIFICATE----- MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= -----END CERTIFICATE----- Entrust Root Certification Authority ==================================== -----BEGIN CERTIFICATE----- MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 -----END CERTIFICATE----- GeoTrust Global CA ================== -----BEGIN CERTIFICATE----- MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet 8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm Mw== -----END CERTIFICATE----- GeoTrust Universal CA ===================== -----BEGIN CERTIFICATE----- MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs 7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d 8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI P/rmMuGNG2+k5o7Y+SlIis5z/iw= -----END CERTIFICATE----- GeoTrust Universal CA 2 ======================= -----BEGIN CERTIFICATE----- MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP 20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG 8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 +/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ 4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS -----END CERTIFICATE----- Visa eCommerce Root =================== -----BEGIN CERTIFICATE----- MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI /k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt 398znM/jra6O1I7mT1GvFpLgXPYHDw== -----END CERTIFICATE----- Comodo AAA Services root ======================== -----BEGIN CERTIFICATE----- MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== -----END CERTIFICATE----- QuoVadis Root CA ================ -----BEGIN CERTIFICATE----- MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi 5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi 5nrQNiOKSnQ2+Q== -----END CERTIFICATE----- QuoVadis Root CA 2 ================== -----BEGIN CERTIFICATE----- MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt 66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK +JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II 4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u -----END CERTIFICATE----- QuoVadis Root CA 3 ================== -----BEGIN CERTIFICATE----- MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= -----END CERTIFICATE----- Security Communication Root CA ============================== -----BEGIN CERTIFICATE----- MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw 8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX 5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g 0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ 6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi FL39vmwLAw== -----END CERTIFICATE----- Sonera Class 2 Root CA ====================== -----BEGIN CERTIFICATE----- MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 /Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt 0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH llpwrN9M -----END CERTIFICATE----- XRamp Global CA Root ==================== -----BEGIN CERTIFICATE----- MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc /Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz 8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= -----END CERTIFICATE----- Go Daddy Class 2 CA =================== -----BEGIN CERTIFICATE----- MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b vZ8= -----END CERTIFICATE----- Starfield Class 2 CA ==================== -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 QBFGmh95DmK/D5fs4C8fF5Q= -----END CERTIFICATE----- Taiwan GRCA =========== -----BEGIN CERTIFICATE----- MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O 1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk 7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy +fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS -----END CERTIFICATE----- DigiCert Assured ID Root CA =========================== -----BEGIN CERTIFICATE----- MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== -----END CERTIFICATE----- DigiCert Global Root CA ======================= -----BEGIN CERTIFICATE----- MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- DigiCert High Assurance EV Root CA ================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K -----END CERTIFICATE----- Certplus Class 2 Primary CA =========================== -----BEGIN CERTIFICATE----- MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR 5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ 7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW //1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 l7+ijrRU -----END CERTIFICATE----- DST Root CA X3 ============== -----BEGIN CERTIFICATE----- MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ -----END CERTIFICATE----- SwissSign Gold CA - G2 ====================== -----BEGIN CERTIFICATE----- MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR 7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm 5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr 44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ -----END CERTIFICATE----- SwissSign Silver CA - G2 ======================== -----BEGIN CERTIFICATE----- MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG 9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm +/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH 6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P 4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L 3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx /uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u -----END CERTIFICATE----- GeoTrust Primary Certification Authority ======================================== -----BEGIN CERTIFICATE----- MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG 1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= -----END CERTIFICATE----- thawte Primary Root CA ====================== -----BEGIN CERTIFICATE----- MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ 1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== -----END CERTIFICATE----- VeriSign Class 3 Public Primary Certification Authority - G5 ============================================================ -----BEGIN CERTIFICATE----- MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq -----END CERTIFICATE----- SecureTrust CA ============== -----BEGIN CERTIFICATE----- MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= -----END CERTIFICATE----- Secure Global CA ================ -----BEGIN CERTIFICATE----- MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW -----END CERTIFICATE----- COMODO Certification Authority ============================== -----BEGIN CERTIFICATE----- MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== -----END CERTIFICATE----- Network Solutions Certificate Authority ======================================= -----BEGIN CERTIFICATE----- MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc /Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q 4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey -----END CERTIFICATE----- COMODO ECC Certification Authority ================================== -----BEGIN CERTIFICATE----- MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X 4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= -----END CERTIFICATE----- OISTE WISeKey Global Root GA CA =============================== -----BEGIN CERTIFICATE----- MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ /yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 +vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= -----END CERTIFICATE----- Certigna ======== -----BEGIN CERTIFICATE----- MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY 1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== -----END CERTIFICATE----- Deutsche Telekom Root CA 2 ========================== -----BEGIN CERTIFICATE----- MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU Cm26OWMohpLzGITY+9HPBVZkVw== -----END CERTIFICATE----- Cybertrust Global Root ====================== -----BEGIN CERTIFICATE----- MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW 0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin 89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT 8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi 5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW WL1WMRJOEcgh4LMRkWXbtKaIOM5V -----END CERTIFICATE----- ePKI Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX 12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= -----END CERTIFICATE----- certSIGN ROOT CA ================ -----BEGIN CERTIFICATE----- MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD 0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD -----END CERTIFICATE----- GeoTrust Primary Certification Authority - G3 ============================================= -----BEGIN CERTIFICATE----- MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr 2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt -----END CERTIFICATE----- thawte Primary Root CA - G2 =========================== -----BEGIN CERTIFICATE----- MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== -----END CERTIFICATE----- thawte Primary Root CA - G3 =========================== -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC +BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY 7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC 8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= -----END CERTIFICATE----- GeoTrust Primary Certification Authority - G2 ============================================= -----BEGIN CERTIFICATE----- MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 npaqBA+K -----END CERTIFICATE----- VeriSign Universal Root Certification Authority =============================================== -----BEGIN CERTIFICATE----- MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj 1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 mJO37M2CYfE45k+XmCpajQ== -----END CERTIFICATE----- VeriSign Class 3 Public Primary Certification Authority - G4 ============================================================ -----BEGIN CERTIFICATE----- MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB /zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== -----END CERTIFICATE----- NetLock Arany (Class Gold) Főtanúsítvány ======================================== -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu 0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw /HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= -----END CERTIFICATE----- Staat der Nederlanden Root CA - G2 ================================== -----BEGIN CERTIFICATE----- MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ 5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65 48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737 qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz +51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm 66+KAQ== -----END CERTIFICATE----- Hongkong Post Root CA 1 ======================= -----BEGIN CERTIFICATE----- MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== -----END CERTIFICATE----- SecureSign RootCA11 =================== -----BEGIN CERTIFICATE----- MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= -----END CERTIFICATE----- Microsec e-Szigno Root CA 2009 ============================== -----BEGIN CERTIFICATE----- MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG 0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm 1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi LXpUq3DDfSJlgnCW -----END CERTIFICATE----- GlobalSign Root CA - R3 ======================= -----BEGIN CERTIFICATE----- MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ 0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r kpeDMdmztcpHWD9f -----END CERTIFICATE----- Autoridad de Certificacion Firmaprofesional CIF A62634068 ========================================================= -----BEGIN CERTIFICATE----- MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx 51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi 6Et8Vcad+qMUu2WFbm5PEn4KPJ2V -----END CERTIFICATE----- Izenpe.com ========== -----BEGIN CERTIFICATE----- MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ 03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU +zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK 0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ 0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== -----END CERTIFICATE----- Chambers of Commerce Root - 2008 ================================ -----BEGIN CERTIFICATE----- MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ 0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH 3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF 9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ -----END CERTIFICATE----- Global Chambersign Root - 2008 ============================== -----BEGIN CERTIFICATE----- MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB /gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp 1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG /5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg 9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z 09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B -----END CERTIFICATE----- Go Daddy Root Certificate Authority - G2 ======================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq 9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD +qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r 5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 -----END CERTIFICATE----- Starfield Root Certificate Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx 4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 -----END CERTIFICATE----- Starfield Services Root Certificate Authority - G2 ================================================== -----BEGIN CERTIFICATE----- MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 -----END CERTIFICATE----- AffirmTrust Commercial ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv 0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= -----END CERTIFICATE----- AffirmTrust Networking ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 /PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 /ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= -----END CERTIFICATE----- AffirmTrust Premium =================== -----BEGIN CERTIFICATE----- MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV 5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs +7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 /bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo +Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC 6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK +4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== -----END CERTIFICATE----- AffirmTrust Premium ECC ======================= -----BEGIN CERTIFICATE----- MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X 57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM eQ== -----END CERTIFICATE----- Certum Trusted Network CA ========================= -----BEGIN CERTIFICATE----- MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= -----END CERTIFICATE----- TWCA Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP 4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG 9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== -----END CERTIFICATE----- Security Communication RootCA2 ============================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ +T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R 3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk 3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 -----END CERTIFICATE----- EC-ACC ====== -----BEGIN CERTIFICATE----- MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw 0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D 5EI= -----END CERTIFICATE----- Hellenic Academic and Research Institutions RootCA 2011 ======================================================= -----BEGIN CERTIFICATE----- MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI 1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa 71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u 8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH 3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD /md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N 7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 -----END CERTIFICATE----- Actalis Authentication Root CA ============================== -----BEGIN CERTIFICATE----- MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC 4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo 2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== -----END CERTIFICATE----- Trustis FPS Root CA =================== -----BEGIN CERTIFICATE----- MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P 8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl iB6XzCGcKQENZetX2fNXlrtIzYE= -----END CERTIFICATE----- Buypass Class 2 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn 9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b /+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN rJgWVqA= -----END CERTIFICATE----- Buypass Class 3 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR 5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh 7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH 2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV /afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz 6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi Cp/HuZc= -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 3 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK 9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W 0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== -----END CERTIFICATE----- EE Certification Centre Root CA =============================== -----BEGIN CERTIFICATE----- MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw 93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU 3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM dcGWxZ0= -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 2009 ============================== -----BEGIN CERTIFICATE----- MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ 4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm 2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 EV 2009 ================================= -----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T 7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv w9y4AyHqnxbxLFS1 -----END CERTIFICATE----- CA Disig Root R2 ================ -----BEGIN CERTIFICATE----- MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa 5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV 7+ZtsH8tZ/3zbBt1RqPlShfppNcL -----END CERTIFICATE----- ACCVRAIZ1 ========= -----BEGIN CERTIFICATE----- MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ 0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR 5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J 9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd 3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p EfbRD0tVNEYqi4Y7 -----END CERTIFICATE----- TWCA Global Root CA =================== -----BEGIN CERTIFICATE----- MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M 8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg /eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= -----END CERTIFICATE----- TeliaSonera Root CA v1 ====================== -----BEGIN CERTIFICATE----- MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ 6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA 3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx 0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= -----END CERTIFICATE----- E-Tugra Certification Authority =============================== -----BEGIN CERTIFICATE----- MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB /wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G C7TbO6Orb1wdtn7os4I07QZcJA== -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 2 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR 3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN 9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== -----END CERTIFICATE----- Atos TrustedRoot 2011 ===================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr 54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G 3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed -----END CERTIFICATE----- QuoVadis Root CA 1 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV 7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX 9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP +V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh 3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV hMJKzRwuJIczYOXD -----END CERTIFICATE----- QuoVadis Root CA 2 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD 6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr O3jtZsSOeWmD3n+M -----END CERTIFICATE----- QuoVadis Root CA 3 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe 6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX 0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 PpxxVJkES/1Y+Zj0 -----END CERTIFICATE----- DigiCert Assured ID Root G2 =========================== -----BEGIN CERTIFICATE----- MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH 35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv 0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo IhNzbM8m9Yop5w== -----END CERTIFICATE----- DigiCert Assured ID Root G3 =========================== -----BEGIN CERTIFICATE----- MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy 1vUhZscv6pZjamVFkpUBtA== -----END CERTIFICATE----- DigiCert Global Root G2 ======================= -----BEGIN CERTIFICATE----- MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO 3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu 5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl MrY= -----END CERTIFICATE----- DigiCert Global Root G3 ======================= -----BEGIN CERTIFICATE----- MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y 3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 VOKa5Vt8sycX -----END CERTIFICATE----- DigiCert Trusted Root G4 ======================== -----BEGIN CERTIFICATE----- MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy 7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN 5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb /UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa 5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP 82Z+ -----END CERTIFICATE----- COMODO RSA Certification Authority ================================== -----BEGIN CERTIFICATE----- MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+ 5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX 2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3 sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5 WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+ nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52 7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I LaZRfyHBNVOFBkpdn627G190 -----END CERTIFICATE----- USERTrust RSA Certification Authority ===================================== -----BEGIN CERTIFICATE----- MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz 0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O +T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq /nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8 yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+ eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ 7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM 8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 -----END CERTIFICATE----- USERTrust ECC Certification Authority ===================================== -----BEGIN CERTIFICATE----- MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu 9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= -----END CERTIFICATE----- GlobalSign ECC Root CA - R4 =========================== -----BEGIN CERTIFICATE----- MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q= -----END CERTIFICATE----- GlobalSign ECC Root CA - R5 =========================== -----BEGIN CERTIFICATE----- MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 -----END CERTIFICATE----- Staat der Nederlanden Root CA - G3 ================================== -----BEGIN CERTIFICATE----- MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5 1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp 07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE 41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1 v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA 8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b 8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq 1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk= -----END CERTIFICATE----- Staat der Nederlanden EV Root CA ================================ -----BEGIN CERTIFICATE----- MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r 0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8 Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr 08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV 0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd 74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq 5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi 5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4 WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg== -----END CERTIFICATE----- IdenTrust Commercial Root CA 1 ============================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi 1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl 3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH 6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe 2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R cGzM7vRX+Bi6hG6H -----END CERTIFICATE----- IdenTrust Public Sector Root CA 1 ================================= -----BEGIN CERTIFICATE----- MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL 4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ 3Wl9af0AVqW3rLatt8o+Ae+c -----END CERTIFICATE----- Entrust Root Certification Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP /vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO e4pIb4tF9g== -----END CERTIFICATE----- Entrust Root Certification Authority - EC1 ========================================== -----BEGIN CERTIFICATE----- MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef 9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G -----END CERTIFICATE----- CFCA EV ROOT ============ -----BEGIN CERTIFICATE----- MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD 7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB /wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua 4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su -----END CERTIFICATE----- Certinomis - Root CA ==================== -----BEGIN CERTIFICATE----- MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjETMBEGA1UEChMK Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAbBgNVBAMTFENlcnRpbm9taXMg LSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMzMTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIx EzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRD ZXJ0aW5vbWlzIC0gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQos P5L2fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJflLieY6pOo d5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQVWZUKxkd8aRi5pwP5ynap z8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDFTKWrteoB4owuZH9kb/2jJZOLyKIOSY00 8B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09x RLWtwHkziOC/7aOgFLScCbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE 6OXWk6RiwsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJwx3t FvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SGm/lg0h9tkQPTYKbV PZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4F2iw4lNVYC2vPsKD2NkJK/DAZNuH i5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZngWVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGj YzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I 6tNxIqSSaHh02TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/0KGRHCwPT5iV WVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWwF6YSjNRieOpWauwK0kDDPAUw Pk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZSg081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAX lCOotQqSD7J6wWAsOMwaplv/8gzjqh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJ y29SWwNyhlCVCNSNh4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9 Iff/ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8Vbtaw5Bng DwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwjY/M50n92Uaf0yKHxDHYi I0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nM cyrDflOR1m749fPH0FFNjkulW+YZFzvWgQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVr hkIGuUE= -----END CERTIFICATE----- OISTE WISeKey Global Root GB CA =============================== -----BEGIN CERTIFICATE----- MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk 9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB /zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= -----END CERTIFICATE----- SZAFIR ROOT CA2 =============== -----BEGIN CERTIFICATE----- MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE 2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5 O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67 oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul 4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6 +/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw== -----END CERTIFICATE----- Certum Trusted Network CA 2 =========================== -----BEGIN CERTIFICATE----- MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1 bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9 7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130 GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ 9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 zAYspsbiDrW5viSP -----END CERTIFICATE----- Hellenic Academic and Research Institutions RootCA 2015 ======================================================= -----BEGIN CERTIFICATE----- MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0 aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+ 6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2 fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+ D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn 82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q p/UsQu0yrbYhnr68 -----END CERTIFICATE----- Hellenic Academic and Research Institutions ECC RootCA 2015 =========================================================== -----BEGIN CERTIFICATE----- MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0 aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290 Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR -----END CERTIFICATE----- ISRG Root X1 ============ -----BEGIN CERTIFICATE----- MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ 4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf 1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY 9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV 0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ m+kXQ99b21/+jh5Xos1AnX5iItreGCc= -----END CERTIFICATE----- AC RAIZ FNMT-RCM ================ -----BEGIN CERTIFICATE----- MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou 08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ 47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW +YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d 8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm 5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM= -----END CERTIFICATE----- Amazon Root CA 1 ================ -----BEGIN CERTIFICATE----- MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB /zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy 8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa 2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 -----END CERTIFICATE----- Amazon Root CA 2 ================ -----BEGIN CERTIFICATE----- MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ 3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY +gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= -----END CERTIFICATE----- Amazon Root CA 3 ================ -----BEGIN CERTIFICATE----- MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== -----END CERTIFICATE----- Amazon Root CA 4 ================ -----BEGIN CERTIFICATE----- MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN /sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri 83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== -----END CERTIFICATE----- LuxTrust Global Root 2 ====================== -----BEGIN CERTIFICATE----- MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQELBQAwRjELMAkG A1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNVBAMMFkx1eFRydXN0IEdsb2Jh bCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUwMzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEW MBQGA1UECgwNTHV4VHJ1c3QgUy5BLjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCC AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wm Kb3FibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTemhfY7RBi2 xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1EMShduxq3sVs35a0VkBC wGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsnXpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm 1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkm FRseTJIpgp7VkoGSQXAZ96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niF wpN6cj5mj5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4gDEa/ a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+8kPREd8vZS9kzl8U ubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2jX5t/Lax5Gw5CMZdjpPuKadUiDTSQ MC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmHhFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB /zBCBgNVHSAEOzA5MDcGByuBKwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5 Lmx1eHRydXN0Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT +Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQELBQADggIBAGoZ FO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9BzZAcg4atmpZ1gDlaCDdLnIN H2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTOjFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW 7MM3LGVYvlcAGvI1+ut7MV3CwRI9loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIu ZY+kt9J/Z93I055cqqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWA VWe+2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/JEAdemrR TxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKrezrnK+T+Tb/mjuuqlPpmt /f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQfLSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc 7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31I iyBMz2TWuJdGsE7RKlY6oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr -----END CERTIFICATE----- TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 ============================================= -----BEGIN CERTIFICATE----- MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11 IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8 6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0 3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9 WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= -----END CERTIFICATE----- GDCA TrustAUTH R5 ROOT ====================== -----BEGIN CERTIFICATE----- MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ 9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4 oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx 9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9 H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35 6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd +PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ 8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv /EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== -----END CERTIFICATE----- TrustCor RootCert CA-1 ====================== -----BEGIN CERTIFICATE----- MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYDVQQGEwJQQTEP MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkx MjMxMTcyMzE2WjCBpDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFu YW1hIENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUGA1UECwwe VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZUcnVzdENvciBSb290Q2Vy dCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv463leLCJhJrMxnHQFgKq1mq jQCj/IDHUHuO1CAmujIS2CNUSSUQIpidRtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4 pQa81QBeCQryJ3pS/C3Vseq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0 JEsq1pme9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CVEY4h gLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorWhnAbJN7+KIor0Gqw /Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/DeOxCbeKyKsZn3MzUOcwHwYDVR0j BBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AYYwDQYJKoZIhvcNAQELBQADggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5 mDo4Nvu7Zp5I/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZyonnMlo2HD6C qFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djtsL1Ac59v2Z3kf9YKVmgenFK+P 3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdNzl/HHk484IkzlQsPpTLWPFp5LBk= -----END CERTIFICATE----- TrustCor RootCert CA-2 ====================== -----BEGIN CERTIFICATE----- MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNVBAYTAlBBMQ8w DQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQwIgYDVQQKDBtUcnVzdENvciBT eXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0 eTEfMB0GA1UEAwwWVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEy MzExNzI2MzlaMIGkMQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5h bWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0 IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnIG7CKqJiJJWQdsg4foDSq8Gb ZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9Nk RvRUqdw6VC0xK5mC8tkq1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1 oYxOdqHp2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nKDOOb XUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hapeaz6LMvYHL1cEksr1 /p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF3wP+TfSvPd9cW436cOGlfifHhi5q jxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQP eSghYA2FFn3XVDjxklb9tTNMg9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+Ctg rKAmrhQhJ8Z3mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh 8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAdBgNVHQ4EFgQU 2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6UnrybPZx9mCAZ5YwwYrIwDwYD VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/h Osh80QA9z+LqBrWyOrsGS2h60COXdKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnp kpfbsEZC89NiqpX+MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv 2wnL/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RXCI/hOWB3 S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYaZH9bDTMJBzN7Bj8RpFxw PIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dv DDqPys/cA8GiCcjl/YBeyGBCARsaU1q7N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYU RpFHmygk71dSTlxCnKr3Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANE xdqtvArBAs8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp5KeX RKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu1uwJ -----END CERTIFICATE----- TrustCor ECA-1 ============== -----BEGIN CERTIFICATE----- MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYDVQQGEwJQQTEP MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkxFzAVBgNVBAMMDlRydXN0Q29yIEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3Mjgw N1owgZwxCzAJBgNVBAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5 MSQwIgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29y IENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3IgRUNBLTEwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb3w9U73NjKYKtR8aja+3+XzP4Q1HpGjOR MRegdMTUpwHmspI+ap3tDvl0mEDTPwOABoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23 xFUfJ3zSCNV2HykVh0A53ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmc p0yJF4OuowReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/wZ0+ fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZFZtS6mFjBAgMBAAGj YzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAfBgNVHSMEGDAWgBREnkj1zG1I1KBL f/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF AAOCAQEABT41XBVwm8nHc2FvcivUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u /ukZMjgDfxT2AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50soIipX1TH0Xs J5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BIWJZpTdwHjFGTot+fDz2LYLSC jaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1WitJ/X5g== -----END CERTIFICATE----- SSL.com Root Certification Authority RSA ======================================== -----BEGIN CERTIFICATE----- MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxDjAM BgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24x MTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYw MjEyMTczOTM5WhcNNDEwMjEyMTczOTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NM LmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2RxFdHaxh3a3by/ZPkPQ/C Fp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aXqhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8 P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcCC52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/ge oeOy3ZExqysdBP+lSgQ36YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkp k8zruFvh/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrFYD3Z fBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93EJNyAKoFBbZQ+yODJ gUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVcUS4cK38acijnALXRdMbX5J+tB5O2 UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi8 1xtZPCvM8hnIk2snYxnP/Okm+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4s bE6x/c+cCbqiM+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4GA1UdDwEB/wQE AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGVcpNxJK1ok1iOMq8bs3AD/CUr dIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBcHadm47GUBwwyOabqG7B52B2ccETjit3E+ZUf ijhDPwGFpUenPUayvOUiaPd7nNgsPgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAsl u1OJD7OAUN5F7kR/q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjq erQ0cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jra6x+3uxj MxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90IH37hVZkLId6Tngr75qNJ vTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/YK9f1JmzJBjSWFupwWRoyeXkLtoh/D1JI Pb9s2KJELtFOt3JY04kTlf5Eq/jXixtunLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406y wKBjYZC6VWg3dGq2ktufoYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NI WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k= -----END CERTIFICATE----- SSL.com Root Certification Authority ECC ======================================== -----BEGIN CERTIFICATE----- MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+ 8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z 5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl -----END CERTIFICATE----- SSL.com EV Root Certification Authority RSA R2 ============================================== -----BEGIN CERTIFICATE----- MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+ B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim 9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48 +qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1 ++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7 CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1 hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX 9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== -----END CERTIFICATE----- SSL.com EV Root Certification Authority ECC =========================================== -----BEGIN CERTIFICATE----- MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy 3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe 5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== -----END CERTIFICATE----- GlobalSign Root CA - R6 ======================= -----BEGIN CERTIFICATE----- MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE 3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+ azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP 0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0 lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr 3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1 0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= -----END CERTIFICATE----- OISTE WISeKey Global Root GC CA =============================== -----BEGIN CERTIFICATE----- MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 -----END CERTIFICATE----- gsoap-2.8.91/gsoap/samples/wst/Makefile.am0000644000175000017500000000131313525245163017716 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = foreign 1.4 noinst_PROGRAMS = wstdemo SOAPHEADER = wstdemo.h include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = wstdemo.nsmap wstdemo_CFLAGS = -DWITH_DOM -DWITH_OPENSSL -DWITH_GZIP -DSKIP_CERTIFICATE_VERIFICATION wstdemo_SOURCES = wstdemo.c $(SOAPHEADER) $(SOAP_C_SRC) ../../stdsoap2.c ../../dom.c ../../plugin/wstapi.c ../../plugin/wsseapi.c ../../plugin/wsaapi.c ../../plugin/smdevp.c ../../plugin/mecevp.c wstdemo_LDADD = $(SAMPLE_SSL_LIBS) $(SAMPLE_EXTRA_LIBS) -lssl -lcrypto -lz gsoap-2.8.91/gsoap/samples/wst/wstdemo.cpp0000644000175000017500000006263013525245163020061 0ustar ellertellert/* wstdemo.cpp WS-Trust demo application (C++ version with server object). gSOAP XML Web services tools Copyright (C) 2000-2016, 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. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- This application demonstrates the wst WS-Trust extensible framework. Compile in C++ (assuming .c files treated as .cpp files): soapcpp2 -CL -pwst -Iimport import/wst.h soapcpp2 -j -Iimport wstdemo.h c++ -DSKIP_CERTIFICATE_VERIFICATION -DWITH_DOM -DWITH_OPENSSL -DWITH_GZIP -o wstdemo wstdemo.c stdsoap2.cpp dom.cpp wstapi.c wsaapi.c wsseapi.c smdevp.c mecevp.c soapC.cpp soapwstProxy.cpp soapwstService.cpp wstClient.cpp -lcrypto -lssl -lz Other required files: server.pem server private key and certificate (do not distrubute) servercert.pem server public certificate for public distribution cacert.pem root CA certificate for public distribution Note: The wsse.h, wsu.h, ds.h, xenc.h c14n.h files are located in 'import'. The smdevp.*, mecevp.*, wstapi.*, wsaapi.*, and wsseapi.* files are located in 'plugin'. Usage: wstdemo cinsz [port] with options: c enable chunked HTTP i indent XML n canonicalize XML (recommended!) s server (stand-alone) z enable compression For example, to generate a SAML 2.0 request message and store it in file 'wstdemo.xml': ./wstdemo n > wstdemo.xml < /dev/null To parse and verify this request message: ./wstdemo ns < wstdemo.xml To run a stand-alone server: ./wstdemo ns 8080 And invoking it with a client: ./wstdemo n 8080 To test multiple calls using HTTP keep-alive, add a single digit number of runs at the end of the options: ./wstdemo n4 8080 */ #include "wsaapi.h" #include "wstapi.h" #include "wsseapi.h" #include "wst.nsmap" #include "soapwstProxy.h" #include "soapwstService.h" static int ssl_verify(int ok, X509_STORE_CTX *store); #define SERVER "http://localhost:8080" #define PORT 8080 #define APPLIESTO "mycompany.com" #define USERNAME "Username" #define PASSWORD "Password" EVP_PKEY *rsa_privk = NULL; /* server-side settings before soap_serve() to verify signatures and decrypt messages */ static int set_verify_decrypt_auto(struct soap *soap) { /* verify signatures and enable decryption */ if (soap_wsse_verify_auto(soap, SOAP_SMD_NONE, NULL, 0) || soap_wsse_decrypt_auto(soap, SOAP_MEC_ENV_ENC_AES256_CBC, rsa_privk, 0)) return soap->error; return SOAP_OK; } int main(int argc, char **argv) { int server = 0; int port = 0; int runs = 1; struct soap *soap = soap_new(); /* register wsa plugin (optional, only if the client requires WS-Addressing rerouted messaging) */ soap_register_plugin(soap, soap_wsa); /* register wsse plugin */ soap_register_plugin(soap, soap_wsse); /* options */ if (argc >= 2) { if (strchr(argv[1], 's')) server = 1; if (strchr(argv[1], 'c')) soap_set_omode(soap, SOAP_IO_CHUNK); else if (strchr(argv[1], 'y')) soap_set_omode(soap, SOAP_IO_STORE); if (strchr(argv[1], 'i')) soap_set_omode(soap, SOAP_XML_INDENT); if (strchr(argv[1], 'n')) soap_set_omode(soap, SOAP_XML_CANONICAL); if (strchr(argv[1], 'z')) soap_set_mode(soap, SOAP_ENC_ZLIB); if (isdigit(argv[1][strlen(argv[1])-1])) { runs = argv[1][strlen(argv[1])-1] - '0'; soap_set_mode(soap, SOAP_IO_KEEPALIVE); } } /* port argument */ if (argc >= 3) port = atoi(argv[2]); if (server) { wstService service(soap); FILE *fd; /* Get private key, certificate, and public key */ fd = fopen("server.pem", "r"); if (!fd) return soap_receiver_fault(soap, "Could not read server.pem", NULL); rsa_privk = PEM_read_PrivateKey(fd, NULL, NULL, (void*)"password"); fclose(fd); if (!rsa_privk) return soap_receiver_fault(soap, "Could not read private RSA key from server.pem", NULL); /* HTTPS settings */ if (soap_ssl_server_context(soap, SOAP_SSL_DEFAULT, "server.pem", "password", "cacert.pem", NULL, NULL, NULL, NULL)) { soap_print_fault(soap, stderr); exit(1); } /* HTTPS and SAML certificate verification callback */ soap->fsslverify = ssl_verify; if (port) { /* bind port */ if (!soap_valid_socket(soap_bind(soap, NULL, port, 100))) { soap_print_fault(soap, stderr); exit(1); } printf("Server started at port %d\n", port); /* HTTP keep-alive is not trivial to support when we need to set soap_wsse_verify_auto and soap_wsse_decrypt_auto */ if (soap->mode & SOAP_IO_KEEPALIVE) { /* set the serverloop callback to call soap_wsse_verify_auto and soap_wsse_decrypt_auto etc. for each next iteration */ soap->fserveloop = set_verify_decrypt_auto; } while (soap_valid_socket(soap_accept(soap))) { fprintf(stderr, "Accepting connection from IP %d.%d.%d.%d\n", (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF); /* init verify/decrypt and serve request */ if (set_verify_decrypt_auto(soap) || service.serve()) { soap_wsse_delete_Security(soap); soap_print_fault(soap, stderr); soap_print_fault_location(soap, stderr); } soap_destroy(soap); soap_end(soap); } soap_print_fault(soap, stderr); exit(1); } else /* CGI-style server serving messages over stdin/out */ { /* init verify/decrypt and serve request */ if (set_verify_decrypt_auto(soap) || service.serve()) { soap_wsse_delete_Security(soap); soap_print_fault(soap, stderr); soap_print_fault_location(soap, stderr); } soap_destroy(soap); soap_end(soap); } } else /* client */ { X509 *cert = NULL; FILE *fd; int soapver = 2; /* SOAP 1.2 */ char endpoint[80]; const char *to = endpoint; const char *appliesto = APPLIESTO; const char *username = USERNAME; const char *password = PASSWORD; int i; /* HTTPS settings */ if (soap_ssl_client_context(soap, SOAP_SSL_DEFAULT, NULL, NULL, "cacert.pem", NULL, NULL)) { soap_print_fault(soap, stderr); exit(1); } /* HTTPS and SAML certificate verification callback */ soap->fsslverify = ssl_verify; /* Get private key, certificate, and public key */ fd = fopen("server.pem", "r"); if (!fd) return soap_receiver_fault(soap, "Could not read server.pem", NULL); rsa_privk = PEM_read_PrivateKey(fd, NULL, NULL, (void*)"password"); fclose(fd); if (!rsa_privk) return soap_receiver_fault(soap, "Could not read private RSA key from server.pem", NULL); fd = fopen("servercert.pem", "r"); if (!fd) return soap_receiver_fault(soap, "Could not read servercert.pem", NULL); cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); if (!cert) soap_receiver_fault(soap, "Could not read certificate from servercert.pem", NULL); /* client sends messages to stdout or to a server port */ if (port) (SOAP_SNPRINTF(endpoint, sizeof(endpoint), 37), "http://localhost:%d", port); else soap_strcpy(endpoint, sizeof(endpoint), "http://"); /* run one or more times */ for (i = 0; i < runs; ++i) { saml2__AssertionType *saml2; /* sign the request message */ soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert); soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token"); soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_privk, 0); /* init verify/decrypt of responses and make the call to request a SAML 2.0 token */ if (set_verify_decrypt_auto(soap) || soap_wst_request_saml_token(soap, to, soapver, appliesto, username, password, NULL, &saml2)) { soap_print_fault(soap, stderr); } else if (i == 0) { /* display some of the assertion information */ if (saml2) { int i; fprintf(stderr, "SAML 2.0 received and verified OK:\n"); for (i = 0; i < saml2->__size_AssertionType; i++) { if (saml2->__union_AssertionType[i].saml2__Statement) { /* left out SAML statements from being displayed */ } if (saml2->__union_AssertionType[i].saml2__AuthnStatement) { if (saml2->__union_AssertionType[i].saml2__AuthnStatement->saml2__AuthnContext) { if (saml2->__union_AssertionType[i].saml2__AuthnStatement->saml2__AuthnContext->saml2__AuthnContextClassRef) fprintf(stderr, "AuthnStatement Context: %s\n", saml2->__union_AssertionType[i].saml2__AuthnStatement->saml2__AuthnContext->saml2__AuthnContextClassRef); } } if (saml2->__union_AssertionType[i].saml2__AuthzDecisionStatement) { /* left out SAML decision statements from being displayed */ } if (saml2->__union_AssertionType[i].saml2__AttributeStatement) { int j; for (j = 0; j < saml2->__union_AssertionType[i].saml2__AttributeStatement->__size_AttributeStatementType; j++) { if (saml2->__union_AssertionType[i].saml2__AttributeStatement->__union_AttributeStatementType[j].saml2__Attribute) { int k; for (k = 0; k < saml2->__union_AssertionType[i].saml2__AttributeStatement->__union_AttributeStatementType[j].saml2__Attribute->__sizeAttributeValue; k++) fprintf(stderr, "Type: %s\nValue: %s\n", saml2->__union_AssertionType[i].saml2__AttributeStatement->__union_AttributeStatementType[j].saml2__Attribute->Name, saml2->__union_AssertionType[i].saml2__AttributeStatement->__union_AttributeStatementType[j].saml2__Attribute->saml2__AttributeValue[k]); } } } } if (saml2->saml2__Conditions) { if (saml2->saml2__Conditions->NotBefore) fprintf(stderr, "Not before %s\n", soap_dateTime2s(soap, *saml2->saml2__Conditions->NotBefore)); if (saml2->saml2__Conditions->NotOnOrAfter) fprintf(stderr, "Not on or after %s\n", soap_dateTime2s(soap, *saml2->saml2__Conditions->NotOnOrAfter)); } fprintf(stderr, "\nAssertion data:\n\n"); soap_set_omode(soap, SOAP_XML_INDENT); soap->sendfd = 2; soap_write_saml2__AssertionType(soap, saml2); fprintf(stderr, "\n\nOK\n\n"); } else { fprintf(stderr, "No SAML 2.0 received!\n"); } } soap_destroy(soap); soap_end(soap); } } soap_free(soap); } /******************************************************************************\ * * Server-side WS-Trust Operations * \******************************************************************************/ int wstService::RequestSecurityToken(struct wst__RequestSecurityTokenType *request, struct wst__RequestSecurityTokenResponseType *response) { DBGFUN("__wst__RequestSecurityToken"); /* Check WS-Addressing */ if (soap_wsa_check(soap)) return soap->error; /* Check if RequestSecurityToken was signed (as required) */ if (soap_wsse_verify_element(soap, SOAP_NAMESPACE_OF_wst, "RequestSecurityToken") == 0) { soap_wsse_delete_Security(soap); return soap_sender_fault_subcode(soap, "wst:InvalidRequest", "The request was invalid or malformed", NULL); } /* Check request */ if (!request || !request->TokenType || !request->RequestType || strcmp(request->RequestType, SOAP_NAMESPACE_OF_wst "/Issue")) return soap_sender_fault_subcode(soap, "wst:InvalidRequest", "The request was invalid or malformed", NULL); /* Request SAML 2.0 token? */ if (!strcmp(request->TokenType, "urn:oasis:names:tc:SAML:2.0:assertion")) { saml2__AssertionType *assertion; X509 *cert = NULL; char buf[1024]; FILE *fd; time_t now = time(NULL), expires = now + 60*60; /* one hour */ const char *appliesto = NULL; const char *username; /* Check Username and Password */ username = soap_wsse_get_Username(soap); if (!username) { soap_wsse_delete_Security(soap); return soap->error; } if (strcmp(username, USERNAME) || soap_wsse_verify_Password(soap, PASSWORD)) { soap_wsse_delete_Security(soap); return soap_wsse_fault(soap, wsse__FailedAuthentication, "Username authentication required"); } soap_wsse_delete_Security(soap); /* Check AppliesTo */ if (request->wsp__AppliesTo && request->wsp__AppliesTo->SOAP_WSA(EndpointReference)) appliesto = request->wsp__AppliesTo->SOAP_WSA(EndpointReference)->Address; if (!appliesto || strcmp(appliesto, APPLIESTO)) return soap_sender_fault_subcode(soap, "wst:InvalidRequest", "The request was invalid or malformed", NULL); if (strcmp(request->KeyType, SOAP_NAMESPACE_OF_wst "/Bearer")) return soap_sender_fault_subcode(soap, "wst:InvalidRequest", "The request was invalid or malformed", request->KeyType); /* Get private key, certificate, and public key */ fd = fopen("server.pem", "r"); if (!fd) return soap_receiver_fault(soap, "Could not read server.pem", NULL); rsa_privk = PEM_read_PrivateKey(fd, NULL, NULL, (void*)"password"); fclose(fd); if (!rsa_privk) return soap_receiver_fault(soap, "Could not read private RSA key from server.pem", NULL); fd = fopen("servercert.pem", "r"); if (!fd) return soap_receiver_fault(soap, "Could not read servercert.pem", NULL); cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); if (!cert) soap_receiver_fault(soap, "Could not read certificate from servercert.pem", NULL); /* Create SAML 2.0 Assertion */ assertion = (saml2__AssertionType*)soap_malloc(soap, sizeof(saml2__AssertionType)); if (!assertion) return soap->error = SOAP_EOM; soap_default_saml2__AssertionType(soap, assertion); assertion->Version = (char*)"2.0"; assertion->IssueInstant = now; /* Issuer = certificate issuer */ assertion->saml2__Issuer = (struct saml2__NameIDType*)soap_malloc(soap, sizeof(struct saml2__NameIDType)); if (!assertion->saml2__Issuer) return soap->error = SOAP_EOM; soap_default_saml2__NameIDType(soap, assertion->saml2__Issuer); X509_NAME_oneline(X509_get_issuer_name(cert), buf, sizeof(buf)-1); assertion->saml2__Issuer->__item = soap_strdup(soap, buf); /* Conditions */ assertion->saml2__Conditions = (struct saml2__ConditionsType*)soap_malloc(soap, sizeof(struct saml2__ConditionsType)); if (!assertion->saml2__Conditions) return soap->error = SOAP_EOM; soap_default_saml2__ConditionsType(soap, assertion->saml2__Conditions); assertion->saml2__Conditions->NotBefore = (time_t*)soap_malloc(soap, sizeof(time_t)); if (!assertion->saml2__Conditions->NotBefore) return soap->error = SOAP_EOM; *assertion->saml2__Conditions->NotBefore = now; assertion->saml2__Conditions->NotOnOrAfter = (time_t*)soap_malloc(soap, sizeof(time_t)); if (!assertion->saml2__Conditions->NotOnOrAfter) return soap->error = SOAP_EOM; *assertion->saml2__Conditions->NotOnOrAfter = expires; /* Conditions/AudienceRestriction = wsp:AppliesTo */ assertion->saml2__Conditions->__size_ConditionsType = 1; assertion->saml2__Conditions->__union_ConditionsType = (struct __saml2__union_ConditionsType*)soap_malloc(soap, sizeof(struct __saml2__union_ConditionsType)); if (!assertion->saml2__Conditions->__union_ConditionsType) return soap->error = SOAP_EOM; soap_default___saml2__union_ConditionsType(soap, assertion->saml2__Conditions->__union_ConditionsType); assertion->saml2__Conditions->__union_ConditionsType->saml2__AudienceRestriction = (struct saml2__AudienceRestrictionType*)soap_malloc(soap, sizeof(struct saml2__AudienceRestrictionType)); if (!assertion->saml2__Conditions->__union_ConditionsType->saml2__AudienceRestriction) return soap->error = SOAP_EOM; soap_default_saml2__AudienceRestrictionType(soap, assertion->saml2__Conditions->__union_ConditionsType->saml2__AudienceRestriction); assertion->saml2__Conditions->__union_ConditionsType->saml2__AudienceRestriction->__sizeAudience = 1; assertion->saml2__Conditions->__union_ConditionsType->saml2__AudienceRestriction->saml2__Audience = &request->wsp__AppliesTo->SOAP_WSA(EndpointReference)->Address; /* AuthnStatement and AttributeStatement */ assertion->__size_AssertionType = 2; assertion->__union_AssertionType = (struct __saml2__union_AssertionType*)soap_malloc(soap, 2 * sizeof(struct __saml2__union_AssertionType)); if (!assertion->__union_AssertionType) return soap->error = SOAP_EOM; soap_default___saml2__union_AssertionType(soap, &assertion->__union_AssertionType[0]); soap_default___saml2__union_AssertionType(soap, &assertion->__union_AssertionType[1]); assertion->__union_AssertionType[0].saml2__AuthnStatement = (struct saml2__AuthnStatementType*)soap_malloc(soap, sizeof(struct saml2__AuthnStatementType)); if (!assertion->__union_AssertionType[0].saml2__AuthnStatement) return soap->error = SOAP_EOM; soap_default_saml2__AuthnStatementType(soap, assertion->__union_AssertionType[0].saml2__AuthnStatement); assertion->__union_AssertionType[0].saml2__AuthnStatement->AuthnInstant = now; assertion->__union_AssertionType[0].saml2__AuthnStatement->saml2__AuthnContext = (struct saml2__AuthnContextType*)soap_malloc(soap, sizeof(struct saml2__AuthnContextType)); if (!assertion->__union_AssertionType[0].saml2__AuthnStatement->saml2__AuthnContext) return soap->error = SOAP_EOM; soap_default_saml2__AuthnContextType(soap, assertion->__union_AssertionType[0].saml2__AuthnStatement->saml2__AuthnContext); assertion->__union_AssertionType[0].saml2__AuthnStatement->saml2__AuthnContext->saml2__AuthnContextClassRef = (char*)"urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport"; assertion->__union_AssertionType[1].saml2__AttributeStatement = (struct saml2__AttributeStatementType*)soap_malloc(soap, sizeof(struct saml2__AttributeStatementType)); if (!assertion->__union_AssertionType[1].saml2__AttributeStatement) return soap->error = SOAP_EOM; soap_default_saml2__AttributeStatementType(soap, assertion->__union_AssertionType[1].saml2__AttributeStatement); assertion->__union_AssertionType[1].saml2__AttributeStatement->__size_AttributeStatementType = 1; assertion->__union_AssertionType[1].saml2__AttributeStatement->__union_AttributeStatementType = (struct __saml2__union_AttributeStatementType*)soap_malloc(soap, sizeof(struct __saml2__union_AttributeStatementType)); if (!assertion->__union_AssertionType[1].saml2__AttributeStatement->__union_AttributeStatementType) return soap->error = SOAP_EOM; soap_default___saml2__union_AttributeStatementType(soap, assertion->__union_AssertionType[1].saml2__AttributeStatement->__union_AttributeStatementType); assertion->__union_AssertionType[1].saml2__AttributeStatement->__union_AttributeStatementType->saml2__Attribute = (struct saml2__AttributeType*)soap_malloc(soap, sizeof(struct saml2__AttributeType)); if (!assertion->__union_AssertionType[1].saml2__AttributeStatement->__union_AttributeStatementType->saml2__Attribute) return soap->error = SOAP_EOM; soap_default_saml2__AttributeType(soap, assertion->__union_AssertionType[1].saml2__AttributeStatement->__union_AttributeStatementType->saml2__Attribute); assertion->__union_AssertionType[1].saml2__AttributeStatement->__union_AttributeStatementType->saml2__Attribute->Name = (char*)username; /* more logic can go here to populate SAML 2.0 assertion subject, conditions, statements, and attributes */ /* sign the SAML token */ if (soap_wsse_sign_saml2(soap, assertion, SOAP_SMD_SIGN_RSA_SHA256, rsa_privk, 0, cert)) return soap->error; /* this part if for testing the validity of the SAML token only and can be omitted */ /* assumes soap->cacert = "cacert.pem"; */ /* already set with soap_ssl_server_context() */ if (soap_wsse_verify_saml2(soap, assertion)) return soap_receiver_fault(soap, "Cannot sign SAML token with outdated key and/or certificate", NULL); response->RequestedSecurityToken = (wst__RequestedSecurityTokenType*)soap_malloc(soap, sizeof(wst__RequestedSecurityTokenType)); if (!response->RequestedSecurityToken) return soap->error = SOAP_EOM; soap_default_wst__RequestedSecurityTokenType(soap, response->RequestedSecurityToken); response->RequestedSecurityToken->saml2__Assertion = assertion; /* sign */ if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_privk, 0)) { soap_wsse_delete_Security(soap); return soap->error; } } /* other WS-Trust logic goes here to populate RSTR */ response->Context = request->Context; response->TokenType = request->TokenType; response->RequestType = request->RequestType; response->KeyType = request->KeyType; return soap_wsa_reply(soap, NULL, soap_wst_rstr_action); } int wstService::RequestSecurityTokenResponse(struct wst__RequestSecurityTokenResponseType *request, struct wst__RequestSecurityTokenResponseCollectionType *response) { (void)soap; (void)request; (void)response; /* service logic goes here to populate RSTRC */ return soap_wsa_reply(soap, NULL, soap_wst_rstrc_action); } int wstService::RequestSecurityTokenCollection(struct wst__RequestSecurityTokenCollectionType *request, struct wst__RequestSecurityTokenResponseCollectionType *response) { (void)soap; (void)request; (void)response; /* service logic goes here to populate RSTRC */ return soap_wsa_reply(soap, NULL, soap_wst_rstrc_action); } /******************************************************************************\ * * WS-Addressing relayed SOAP-ENV:Fault Handler for FaultTo Server * \******************************************************************************/ SOAP_FMAC5 int SOAP_FMAC6 SOAP_ENV__Fault(struct soap *soap, char *faultcode, char *faultstring, char *faultactor, struct SOAP_ENV__Detail *detail, struct SOAP_ENV__Code *SOAP_ENV__Code, struct SOAP_ENV__Reason *SOAP_ENV__Reason, char *SOAP_ENV__Node, char *SOAP_ENV__Role, struct SOAP_ENV__Detail *SOAP_ENV__Detail) { /* populate the fault struct from the operation arguments to print it */ soap_fault(soap); /* SOAP 1.1 */ soap->fault->faultcode = faultcode; soap->fault->faultstring = faultstring; soap->fault->faultactor = faultactor; soap->fault->detail = detail; /* SOAP 1.2 */ soap->fault->SOAP_ENV__Code = SOAP_ENV__Code; soap->fault->SOAP_ENV__Reason = SOAP_ENV__Reason; soap->fault->SOAP_ENV__Node = SOAP_ENV__Node; soap->fault->SOAP_ENV__Role = SOAP_ENV__Role; soap->fault->SOAP_ENV__Detail = SOAP_ENV__Detail; /* set error */ soap->error = SOAP_FAULT; return soap_send_empty_response(soap, SOAP_OK); /* HTTP 202 Accepted */ } /******************************************************************************\ * * Callbacks * \******************************************************************************/ static int ssl_verify(int ok, X509_STORE_CTX *store) { #ifdef SKIP_CERTIFICATE_VERIFICATION ok = 1; (void)store; #else /* HTTPS and SAML certificate verification, return 0 when fails 1 when ok */ if (!ok) { char buf[1024]; int err = X509_STORE_CTX_get_error(store); X509 *cert = X509_STORE_CTX_get_current_cert(store); switch (err) { /* these may be tolerable exceptions: case X509_V_ERR_CERT_NOT_YET_VALID: case X509_V_ERR_CERT_HAS_EXPIRED: case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: case X509_V_ERR_UNABLE_TO_GET_CRL: case X509_V_ERR_CRL_NOT_YET_VALID: case X509_V_ERR_CRL_HAS_EXPIRED: X509_STORE_CTX_set_error(store, X509_V_OK); ok = 1; break; */ default: fprintf(stderr, "SSL verify error %d or warning with certificate at depth %d: %s\n", err, X509_STORE_CTX_get_error_depth(store), X509_verify_cert_error_string(err)); X509_NAME_oneline(X509_get_issuer_name(cert), buf, sizeof(buf)); fprintf(stderr, " certificate issuer: %s\n", buf); X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)); fprintf(stderr, " certificate subject: %s\n", buf); } } #endif return ok; } gsoap-2.8.91/gsoap/samples/wst/cacert.pem0000644000175000017500000000242213525245163017630 0ustar ellertellert-----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJAIb3LgUGI6LjMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE4MDgy NTE3NTczNloXDTIxMDgyNDE3NTczNlowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBAMXNOWKaNVtyWpWa/5/mNXZ7cgv+v5B1RL0OoOwvoQ5dHhc4KycDPAtiiV+I AoZy7bLbARWJboLPo3JnOf3Mc0aQjVFXz+X8eVhEseCIP4HAWSGa5ISDVDdxj4Nh RfwlVtrmLdL08HkTr+f3scHRvtvtmAtTFeT9FOCzttMpBRTXAgMBAAGjgfUwgfIw HQYDVR0OBBYEFFYsYA+p+TdDTXP7VrzUmLoQ0ypJMIHCBgNVHSMEgbowgbeAFFYs YA+p+TdDTXP7VrzUmLoQ0ypJoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkAhvcuBQYjouMwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQA1xebtW3G5e9Xfz2zys4d+628r2qy4ov0ggGS5 WmrBhyIFCE+xW1bj5waLMOt0e4+yfODMTcVKArrrthJdHm5YFILT9ZU2hOEOZw5P Dizc3Q34yzQxXrpsaHri5OfM0wgiIJOynz/YbX2f46YpqhMT7VvNoI8sR+OIydcY mi3qVQ== -----END CERTIFICATE----- gsoap-2.8.91/gsoap/samples/mashup/0000755000175000017500000000000013525245175016347 5ustar ellertellertgsoap-2.8.91/gsoap/samples/mashup/.deps/0000755000175000017500000000000013525245175017360 5ustar ellertellertgsoap-2.8.91/gsoap/samples/mashup/Makefile.in0000644000175000017500000005041713525245163020420 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = mashupclient$(EXEEXT) mashupserver$(EXEEXT) subdir = gsoap/samples/mashup ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am_mashupclient_OBJECTS = mashupclient.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) mashupclient_OBJECTS = $(am_mashupclient_OBJECTS) am__DEPENDENCIES_1 = mashupclient_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) am_mashupserver_OBJECTS = mashupserver.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) soapServer.$(OBJEXT) mashupserver_OBJECTS = $(am_mashupserver_OBJECTS) mashupserver_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/mashupclient.Po \ ./$(DEPDIR)/mashupserver.Po ./$(DEPDIR)/soapC.Po \ ./$(DEPDIR)/soapClient.Po ./$(DEPDIR)/soapServer.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(mashupclient_SOURCES) $(mashupserver_SOURCES) DIST_SOURCES = $(mashupclient_SOURCES) $(mashupserver_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.c_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = mashup.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = mashup.nsmap mashupclient_SOURCES = mashupclient.c $(SOAPHEADER) $(SOAP_C_CLIENT) mashupclient_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) mashupserver_SOURCES = mashupserver.c $(SOAPHEADER) $(SOAP_C_CLIENT) soapServer.c mashupserver_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/mashup/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/mashup/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) mashupclient$(EXEEXT): $(mashupclient_OBJECTS) $(mashupclient_DEPENDENCIES) $(EXTRA_mashupclient_DEPENDENCIES) @rm -f mashupclient$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mashupclient_OBJECTS) $(mashupclient_LDADD) $(LIBS) mashupserver$(EXEEXT): $(mashupserver_OBJECTS) $(mashupserver_DEPENDENCIES) $(EXTRA_mashupserver_DEPENDENCIES) @rm -f mashupserver$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mashupserver_OBJECTS) $(mashupserver_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mashupclient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mashupserver.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/mashupclient.Po -rm -f ./$(DEPDIR)/mashupserver.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/mashupclient.Po -rm -f ./$(DEPDIR)/mashupserver.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/mashup/calc.wsdl0000644000175000017500000001326213525245163020145 0ustar ellertellert Sums two values Subtracts two values Multiplies two values Divides two values Raises a to b Simple calculator service described at https://www.genivia.com/dev.html gsoap-2.8.91/gsoap/samples/mashup/mashupclient.c0000644000175000017500000000355613525245163021215 0ustar ellertellert/* mashupclient.c Example mashup service client in C soapcpp2 -c mashup.h cc -o mashupclient mashupclient.c stdsoap2.c soapC.c soapClient.c -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "mashup.nsmap" int main() { struct soap *soap = soap_new(); struct _ns3__commingtotown response; if (soap_call___ns5__dtx(soap, NULL, NULL, "", &response)) soap_print_fault(soap, stderr); else if (response.days == 0) printf("Today is the day!\n"); else printf("Wait %d more days to xmas\n", response.days); return 0; } gsoap-2.8.91/gsoap/samples/mashup/mashup.h0000644000175000017500000012115013525245163020012 0ustar ellertellert// Reminder: Modify typemap.dat to customize the header file generated by wsdl2h /* mashup.h Generated by wsdl2h 2.8.88 from gmt.wsdl calc.wsdl mashup.wsdl and typemap.dat 2019-07-25 20:25:44 GMT DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS USE THE soapcpp2-GENERATED SOURCE CODE FILES FOR YOUR PROJECT BUILDS gSOAP XML Web services tools Copyright (C) 2000-2018, Robert van Engelen, Genivia Inc. All Rights Reserved. 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 -------------------------------------------------------------------------------- */ /** @page page_notes Notes @note HINTS: - Run soapcpp2 on mashup.h to generate the SOAP/XML processing logic: Use soapcpp2 -I to specify paths for #import Use soapcpp2 -j to generate improved proxy and server classes. Use soapcpp2 -r to generate a report. - Edit '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. - Run Doxygen (www.doxygen.org) on this file to generate documentation. - Use wsdl2h -c to generate pure C code. - Use wsdl2h -R to include the REST operations defined by the WSDLs. - Use wsdl2h -O3 or -O4 to optimize by removing unused schema components. - Use wsdl2h -d to enable DOM support for xsd:any and xsd:anyType. - Use wsdl2h -F to simulate struct-type derivation in C (also works in C++). - Use wsdl2h -f to generate flat C++ class hierarchy, removes type derivation. - Use wsdl2h -g to generate top-level root elements with readers and writers. - Use wsdl2h -U to map XML names to C++ Unicode identifiers instead of _xNNNN. - Use wsdl2h -u to disable the generation of unions. - Use wsdl2h -L to remove this @note and all other @note comments. - Use wsdl2h -nname to use name as the base namespace prefix instead of 'ns'. - Use wsdl2h -Nname for service prefix and produce multiple service bindings - Struct/class members serialized as XML attributes are annotated with a '@'. - Struct/class members that have a special role are annotated with a '$'. @warning DO NOT INCLUDE THIS ANNOTATED FILE DIRECTLY IN YOUR PROJECT SOURCE CODE. USE THE FILES GENERATED BY soapcpp2 FOR YOUR PROJECT'S SOURCE CODE: THE GENERATED soapStub.h FILE CONTAINS THIS CONTENT WITHOUT ANNOTATIONS. @copyright LICENSE: @verbatim -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2019, Robert van Engelen, Genivia Inc. All Rights Reserved. The wsdl2h tool and its generated software are released under the GPL. This software is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- @endverbatim */ //gsoapopt c,w /******************************************************************************\ * * * Definitions * * * * * \******************************************************************************/ /******************************************************************************\ * * * 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' then rerun wsdl2h (use wsdl2h -t typemap.dat): ns1 = "http://tempuri.org/t.xsd" ns2 = "urn:calc" ns3 = "urn:daystoxmas" */ #define SOAP_NAMESPACE_OF_ns1 "http://tempuri.org/t.xsd" //gsoap ns1 schema namespace: http://tempuri.org/t.xsd //gsoap ns1 schema form: unqualified #define SOAP_NAMESPACE_OF_ns2 "urn:calc" //gsoap ns2 schema namespace: urn:calc //gsoap ns2 schema form: unqualified #define SOAP_NAMESPACE_OF_ns3 "urn:daystoxmas" //gsoap ns3 schema namespace: urn:daystoxmas //gsoap ns3 schema form: qualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ /// @brief Top-level root element "urn:daystoxmas":daystoxmas. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration. /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://tempuri.org/t.xsd * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * urn:calc * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * urn:daystoxmas * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://tempuri.org/t.xsd * * * \******************************************************************************/ /// @brief Top-level root element "http://tempuri.org/t.xsd":gmt /// @brief "http://tempuri.org/t.xsd":gmt is a complexType. /// /// @note struct _ns1__gmt operations: /// - _ns1__gmt* soap_new__ns1__gmt(struct soap*, int num) allocate and default initialize one or more values (an array) /// - soap_default__ns1__gmt(struct soap*, _ns1__gmt*) default initialize members /// - int soap_read__ns1__gmt(struct soap*, _ns1__gmt*) deserialize from a source /// - int soap_write__ns1__gmt(struct soap*, _ns1__gmt*) serialize to a sink /// - _ns1__gmt* soap_dup__ns1__gmt(struct soap*, _ns1__gmt* dst, _ns1__gmt *src) returns deep copy of _ns1__gmt src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del__ns1__gmt(_ns1__gmt*) deep deletes _ns1__gmt data members, use only on dst after soap_dup__ns1__gmt(NULL, _ns1__gmt *dst, _ns1__gmt *src) (use soapcpp2 -Ed) struct _ns1__gmt { }; /// @brief Top-level root element "http://tempuri.org/t.xsd":gmtResponse /// @brief "http://tempuri.org/t.xsd":gmtResponse is a complexType. /// /// @note struct _ns1__gmtResponse operations: /// - _ns1__gmtResponse* soap_new__ns1__gmtResponse(struct soap*, int num) allocate and default initialize one or more values (an array) /// - soap_default__ns1__gmtResponse(struct soap*, _ns1__gmtResponse*) default initialize members /// - int soap_read__ns1__gmtResponse(struct soap*, _ns1__gmtResponse*) deserialize from a source /// - int soap_write__ns1__gmtResponse(struct soap*, _ns1__gmtResponse*) serialize to a sink /// - _ns1__gmtResponse* soap_dup__ns1__gmtResponse(struct soap*, _ns1__gmtResponse* dst, _ns1__gmtResponse *src) returns deep copy of _ns1__gmtResponse src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del__ns1__gmtResponse(_ns1__gmtResponse*) deep deletes _ns1__gmtResponse data members, use only on dst after soap_dup__ns1__gmtResponse(NULL, _ns1__gmtResponse *dst, _ns1__gmtResponse *src) (use soapcpp2 -Ed) struct _ns1__gmtResponse { /// Element "param-1" of type xs:dateTime. time_t param_1 1; ///< Required element. }; /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * urn:calc * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * urn:daystoxmas * * * \******************************************************************************/ /// @brief Top-level root element "urn:daystoxmas":commingtotown /// @brief "urn:daystoxmas":commingtotown is a complexType. /// /// @note struct _ns3__commingtotown operations: /// - _ns3__commingtotown* soap_new__ns3__commingtotown(struct soap*, int num) allocate and default initialize one or more values (an array) /// - soap_default__ns3__commingtotown(struct soap*, _ns3__commingtotown*) default initialize members /// - int soap_read__ns3__commingtotown(struct soap*, _ns3__commingtotown*) deserialize from a source /// - int soap_write__ns3__commingtotown(struct soap*, _ns3__commingtotown*) serialize to a sink /// - _ns3__commingtotown* soap_dup__ns3__commingtotown(struct soap*, _ns3__commingtotown* dst, _ns3__commingtotown *src) returns deep copy of _ns3__commingtotown src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del__ns3__commingtotown(_ns3__commingtotown*) deep deletes _ns3__commingtotown data members, use only on dst after soap_dup__ns3__commingtotown(NULL, _ns3__commingtotown *dst, _ns3__commingtotown *src) (use soapcpp2 -Ed) struct _ns3__commingtotown { /// Element "days" of type xs:int. int days 1; ///< Required element. }; /******************************************************************************\ * * * Additional Top-Level Elements * * http://tempuri.org/t.xsd * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * http://tempuri.org/t.xsd * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Elements * * urn:calc * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * urn:calc * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Elements * * urn:daystoxmas * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * urn:daystoxmas * * * \******************************************************************************/ /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap ns2 service name: calc //gsoap ns2 service type: calcPortType //gsoap ns2 service port: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns2 service namespace: urn:calc //gsoap ns2 service transport: http://schemas.xmlsoap.org/soap/http //gsoap ns4 service name: gmt //gsoap ns4 service type: gmtPortType //gsoap ns4 service port: http://localhost:80 //gsoap ns4 service namespace: http://tempuri.org/t.xsd/gmt.wsdl //gsoap ns4 service transport: http://schemas.xmlsoap.org/soap/http //gsoap ns5 service name: mashup //gsoap ns5 service type: PortType //gsoap ns5 service port: http://www.cs.fsu.edu/~engelen/mashup.cgi //gsoap ns5 service namespace: http://www.genivia.com/mashup.wsdl //gsoap ns5 service transport: http://schemas.xmlsoap.org/soap/http /** @mainpage WSDL Definitions @section WSDL_bindings Service Bindings - @ref calc - @ref gmt - @ref mashup @section WSDL_more More Information - @ref page_notes "Notes" - @ref page_XMLDataBinding "XML Data Binding" - @ref SOAP_ENV__Header "SOAP Header Content" (when applicable) - @ref SOAP_ENV__Detail "SOAP Fault Detail Content" (when applicable) */ /** @page calc Binding "calc" @section calc_service Service Documentation "calc" Simple calculator service described at https://www.genivia.com/dev.html @section calc_operations Operations of Binding "calc" - @ref ns2__add - @ref ns2__sub - @ref ns2__mul - @ref ns2__div - @ref ns2__pow @section calc_ports Default endpoints of Binding "calc" - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi @note Use wsdl2h option -Nname to change the service binding prefix name */ /** @page gmt Binding "gmt" @section gmt_service Service Documentation "gmt" Get current time client code: `#include "soapH.h" #include "gmt.nsmap" int main() { time_t t; struct soap *soap = soap_new(); soap_call_t__gmt(soap, "http://www.cs.fsu.edu/~engelen/gmtlitserver.cgi", "", &t); printf("The current time is %s\\n", ctime(&t)); soap_destroy(soap); soap_end(soap); soap_free(soap); return 0; }` @section gmt_operations Operations of Binding "gmt" - @ref __ns4__gmt @section gmt_ports Default endpoints of Binding "gmt" - http://localhost:80 @note Use wsdl2h option -Nname to change the service binding prefix name */ /** @page mashup Binding "mashup" @section mashup_operations Operations of Binding "mashup" - @ref __ns5__dtx @section mashup_ports Default endpoints of Binding "mashup" - http://www.cs.fsu.edu/~engelen/mashup.cgi @note Use wsdl2h option -Nname to change the service binding prefix name */ /******************************************************************************\ * * * Service Binding * * calc * * * \******************************************************************************/ /******************************************************************************\ * * * Service Operation * * ns2__add * * * \******************************************************************************/ /** Operation "ns2__add" of service binding "calc". Sums two values - SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" - Default endpoints: - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call_ns2__add( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: double a, double b, // output parameters: double *result ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int ns2__add( struct soap *soap, // input parameters: double a, double b, // output parameters: double *result ); @endcode */ //gsoap ns2 service method-protocol: add SOAP //gsoap ns2 service method-style: add rpc //gsoap ns2 service method-encoding: add http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: add "" //gsoap ns2 service method-output-action: add Response int ns2__add( double :a, ///< Input parameter, :unqualified name as per RPC encoding double :b, ///< Input parameter, :unqualified name as per RPC encoding double *:result ///< Output parameter, :unqualified name as per RPC encoding ); /******************************************************************************\ * * * Service Operation * * ns2__sub * * * \******************************************************************************/ /** Operation "ns2__sub" of service binding "calc". Subtracts two values - SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" - Default endpoints: - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call_ns2__sub( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: double a, double b, // output parameters: double *result ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int ns2__sub( struct soap *soap, // input parameters: double a, double b, // output parameters: double *result ); @endcode */ //gsoap ns2 service method-protocol: sub SOAP //gsoap ns2 service method-style: sub rpc //gsoap ns2 service method-encoding: sub http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: sub "" //gsoap ns2 service method-output-action: sub Response int ns2__sub( double :a, ///< Input parameter, :unqualified name as per RPC encoding double :b, ///< Input parameter, :unqualified name as per RPC encoding double *:result ///< Output parameter, :unqualified name as per RPC encoding ); /******************************************************************************\ * * * Service Operation * * ns2__mul * * * \******************************************************************************/ /** Operation "ns2__mul" of service binding "calc". Multiplies two values - SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" - Default endpoints: - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call_ns2__mul( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: double a, double b, // output parameters: double *result ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int ns2__mul( struct soap *soap, // input parameters: double a, double b, // output parameters: double *result ); @endcode */ //gsoap ns2 service method-protocol: mul SOAP //gsoap ns2 service method-style: mul rpc //gsoap ns2 service method-encoding: mul http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: mul "" //gsoap ns2 service method-output-action: mul Response int ns2__mul( double :a, ///< Input parameter, :unqualified name as per RPC encoding double :b, ///< Input parameter, :unqualified name as per RPC encoding double *:result ///< Output parameter, :unqualified name as per RPC encoding ); /******************************************************************************\ * * * Service Operation * * ns2__div * * * \******************************************************************************/ /** Operation "ns2__div" of service binding "calc". Divides two values - SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" - Default endpoints: - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call_ns2__div( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: double a, double b, // output parameters: double *result ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int ns2__div( struct soap *soap, // input parameters: double a, double b, // output parameters: double *result ); @endcode */ //gsoap ns2 service method-protocol: div SOAP //gsoap ns2 service method-style: div rpc //gsoap ns2 service method-encoding: div http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: div "" //gsoap ns2 service method-output-action: div Response int ns2__div( double :a, ///< Input parameter, :unqualified name as per RPC encoding double :b, ///< Input parameter, :unqualified name as per RPC encoding double *:result ///< Output parameter, :unqualified name as per RPC encoding ); /******************************************************************************\ * * * Service Operation * * ns2__pow * * * \******************************************************************************/ /** Operation "ns2__pow" of service binding "calc". Raises a to b - SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" - Default endpoints: - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call_ns2__pow( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: double a, double b, // output parameters: double *result ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int ns2__pow( struct soap *soap, // input parameters: double a, double b, // output parameters: double *result ); @endcode */ //gsoap ns2 service method-protocol: pow SOAP //gsoap ns2 service method-style: pow rpc //gsoap ns2 service method-encoding: pow http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: pow "" //gsoap ns2 service method-output-action: pow Response int ns2__pow( double :a, ///< Input parameter, :unqualified name as per RPC encoding double :b, ///< Input parameter, :unqualified name as per RPC encoding double *:result ///< Output parameter, :unqualified name as per RPC encoding ); /** @page calc Binding "calc" @section calc_policy_enablers Policy Enablers of Binding "calc" None specified. */ /******************************************************************************\ * * * Service Binding * * gmt * * * \******************************************************************************/ /******************************************************************************\ * * * Service Operation * * __ns4__gmt * * * \******************************************************************************/ /** Operation "__ns4__gmt" of service binding "gmt". Service definition of function t__gmt - SOAP document/literal style messaging - Default endpoints: - http://localhost:80 - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns4__gmt( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: struct _ns1__gmt* ns1__gmt, // output parameters: struct _ns1__gmtResponse *ns1__gmtResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns4__gmt( struct soap *soap, // input parameters: struct _ns1__gmt* ns1__gmt, // output parameters: struct _ns1__gmtResponse *ns1__gmtResponse ); @endcode */ //gsoap ns4 service method-protocol: gmt SOAP //gsoap ns4 service method-style: gmt document //gsoap ns4 service method-encoding: gmt literal //gsoap ns4 service method-action: gmt "" //gsoap ns4 service method-output-action: gmt Response int __ns4__gmt( struct _ns1__gmt* ns1__gmt, ///< Input parameter struct _ns1__gmtResponse *ns1__gmtResponse ///< Output parameter ); /** @page gmt Binding "gmt" @section gmt_policy_enablers Policy Enablers of Binding "gmt" None specified. */ /******************************************************************************\ * * * Service Binding * * mashup * * * \******************************************************************************/ /******************************************************************************\ * * * Service Operation * * __ns5__dtx * * * \******************************************************************************/ /** Operation "__ns5__dtx" of service binding "mashup". - SOAP document/literal style messaging - Default endpoints: - http://www.cs.fsu.edu/~engelen/mashup.cgi - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns5__dtx( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _XML ns3__daystoxmas, // output parameters: struct _ns3__commingtotown *ns3__commingtotown ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns5__dtx( struct soap *soap, // input parameters: _XML ns3__daystoxmas, // output parameters: struct _ns3__commingtotown *ns3__commingtotown ); @endcode */ //gsoap ns5 service method-protocol: dtx SOAP //gsoap ns5 service method-style: dtx document //gsoap ns5 service method-encoding: dtx literal //gsoap ns5 service method-action: dtx "" //gsoap ns5 service method-output-action: dtx Response int __ns5__dtx( _XML ns3__daystoxmas, ///< Input parameter struct _ns3__commingtotown *ns3__commingtotown ///< Output parameter ); /** @page mashup Binding "mashup" @section mashup_policy_enablers Policy Enablers of Binding "mashup" None specified. */ /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings that are contractually bound by WSDL and are auto-generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. @note The following readers and writers are C/C++ data type (de)serializers auto-generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. @note Data can be read and deserialized from: - an int file descriptor, using soap->recvfd = fd - a socket, using soap->socket = (int)... - a C++ stream (istream, stringstream), using soap->is = (istream*)... - a C string, using soap->is = (const char*)... - any input, using the soap->frecv() callback @note Data can be serialized and written to: - an int file descriptor, using soap->sendfd = (int)... - a socket, using soap->socket = (int)... - a C++ stream (ostream, stringstream), using soap->os = (ostream*)... - a C string, using soap->os = (const char**)... - any output, using the soap->fsend() callback @note The following options are available for (de)serialization control: - soap->encodingStyle = NULL; to remove SOAP 1.1/1.2 encodingStyle - soap_set_mode(soap, SOAP_XML_TREE); XML without id-ref (no cycles!) - soap_set_mode(soap, SOAP_XML_GRAPH); XML with id-ref (including cycles) - soap_set_namespaces(soap, struct Namespace *nsmap); to set xmlns bindings @section ns1 Top-level root elements of schema "http://tempuri.org/t.xsd" - @ref _ns1__gmt @code // Reader (returns SOAP_OK on success): soap_read__ns1__gmt(struct soap*, struct _ns1__gmt*); // Writer (returns SOAP_OK on success): soap_write__ns1__gmt(struct soap*, struct _ns1__gmt*); // REST GET (returns SOAP_OK on success): soap_GET__ns1__gmt(struct soap*, const char *URL, struct _ns1__gmt*); // REST PUT (returns SOAP_OK on success): soap_PUT__ns1__gmt(struct soap*, const char *URL, struct _ns1__gmt*); // REST POST (returns SOAP_OK on success): soap_POST_send__ns1__gmt(struct soap*, const char *URL, struct _ns1__gmt*); soap_POST_recv__ns1__gmt(struct soap*, struct _ns1__gmt*); @endcode - @ref _ns1__gmtResponse @code // Reader (returns SOAP_OK on success): soap_read__ns1__gmtResponse(struct soap*, struct _ns1__gmtResponse*); // Writer (returns SOAP_OK on success): soap_write__ns1__gmtResponse(struct soap*, struct _ns1__gmtResponse*); // REST GET (returns SOAP_OK on success): soap_GET__ns1__gmtResponse(struct soap*, const char *URL, struct _ns1__gmtResponse*); // REST PUT (returns SOAP_OK on success): soap_PUT__ns1__gmtResponse(struct soap*, const char *URL, struct _ns1__gmtResponse*); // REST POST (returns SOAP_OK on success): soap_POST_send__ns1__gmtResponse(struct soap*, const char *URL, struct _ns1__gmtResponse*); soap_POST_recv__ns1__gmtResponse(struct soap*, struct _ns1__gmtResponse*); @endcode @section ns2 Top-level root elements of schema "urn:calc" @section ns3 Top-level root elements of schema "urn:daystoxmas" - @ref _ns3__daystoxmas @code // Reader (returns SOAP_OK on success): soap_read__ns3__daystoxmas(struct soap*, _XML); // Writer (returns SOAP_OK on success): soap_write__ns3__daystoxmas(struct soap*, _XML); // REST GET (returns SOAP_OK on success): soap_GET__ns3__daystoxmas(struct soap*, const char *URL, _XML); // REST PUT (returns SOAP_OK on success): soap_PUT__ns3__daystoxmas(struct soap*, const char *URL, _XML); // REST POST (returns SOAP_OK on success): soap_POST_send__ns3__daystoxmas(struct soap*, const char *URL, _XML); soap_POST_recv__ns3__daystoxmas(struct soap*, _XML); @endcode - @ref _ns3__commingtotown @code // Reader (returns SOAP_OK on success): soap_read__ns3__commingtotown(struct soap*, struct _ns3__commingtotown*); // Writer (returns SOAP_OK on success): soap_write__ns3__commingtotown(struct soap*, struct _ns3__commingtotown*); // REST GET (returns SOAP_OK on success): soap_GET__ns3__commingtotown(struct soap*, const char *URL, struct _ns3__commingtotown*); // REST PUT (returns SOAP_OK on success): soap_PUT__ns3__commingtotown(struct soap*, const char *URL, struct _ns3__commingtotown*); // REST POST (returns SOAP_OK on success): soap_POST_send__ns3__commingtotown(struct soap*, const char *URL, struct _ns3__commingtotown*); soap_POST_recv__ns3__commingtotown(struct soap*, struct _ns3__commingtotown*); @endcode */ /* End of mashup.h */ gsoap-2.8.91/gsoap/samples/mashup/gmt.wsdl0000644000175000017500000000574413525245163020040 0ustar ellertellert Service definition of function t__gmt Get current time client code: `#include "soapH.h" #include "gmt.nsmap" int main() { time_t t; struct soap *soap = soap_new(); soap_call_t__gmt(soap, "http://www.cs.fsu.edu/~engelen/gmtlitserver.cgi", "", &t); printf("The current time is %s\n", ctime(&t)); soap_destroy(soap); soap_end(soap); soap_free(soap); return 0; }` gsoap-2.8.91/gsoap/samples/mashup/README.txt0000644000175000017500000000223413525245163020043 0ustar ellertellert A simple example "mashup" service. The service computes the number of days to christmas using the GMT time service and calculator service. The wsdl2h tool accepts multiple WSDLs and generates one gSOAP definitions file to implement clients and/or services. If necessary, use wsdl2h -Nname to generate bindings for the separate WSDL services. In this mashup example we create a new service to compute the days to christmas by invoking the GMT and calc services within a service operation. A client for the mashup service is also included. The mashup.h gSOAP definitions file is generated from the GMT and calculator WSDLs using: wsdl2h -c -o mashup.h gmt.wsdl calc.wsdl mashup.wsdl where gmt.wsdl is generated in samples/gmt, calc.wsdl is generated in samples/calc, and mashup.wsdl is a new WSDL to expose the new "daystoxmas" service operation. The mashupserver is a CGI application, which can be easily changed into a (multi-threaded) stand-alone Web server as per online tutorials and shown in other examples. The mashupclient is a stand-alone client for the service. Invoking mashupclient will connect to the service, which returns the number of days to christmas. gsoap-2.8.91/gsoap/samples/mashup/mashupserver.c0000644000175000017500000000735513525245163021246 0ustar ellertellert/* mashupserver.c Example mashup CGI service in C soapcpp2 -c mashup.h cc -o mashupserver mashupserver.c stdsoap2.c soapC.c soapClient.c soapServer.c -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "mashup.nsmap" int main(int argc, char **argv) { return soap_serve(soap_new()); } /******************************************************************************\ * * Server operation * \******************************************************************************/ int __ns5__dtx(struct soap *soap, _XML x, struct _ns3__commingtotown *response) { struct soap *csoap = soap_copy(soap); struct _ns1__gmt gmt; struct _ns1__gmtResponse gmtResponse; struct tm tm, ptm; time_t now, xmas; double sec, days; if (soap_call___ns4__gmt(csoap, "http://www.cs.fsu.edu/~engelen/gmtlitserver.cgi", NULL, &gmt, &gmtResponse)) { soap_end(csoap); soap_free(csoap); return soap_receiver_fault(soap, "Cannot connect to GMT server", NULL); } now = gmtResponse.param_1; memset(&tm, 0, sizeof(struct tm)); tm.tm_mday = 25; tm.tm_mon = 11; tm.tm_year = gmtime(&now)->tm_year; /* this year */ xmas = soap_timegm(&tm); if (xmas < now) { tm.tm_year++; /* xmas just passed, go to next year */ xmas = soap_timegm(&tm); } sec = difftime(xmas, now); if (soap_call_ns2__div(csoap, NULL, NULL, sec, 86400, &days)) { soap_end(csoap); soap_free(csoap); return soap_receiver_fault(soap, "Cannot connect to calc server", NULL); } soap_delegate_deletion(csoap, soap); /* server should delete data */ soap_end(csoap); soap_free(csoap); response->days = (int)days; return SOAP_OK; } /******************************************************************************\ * * Dummy operations (these are implemented in the calc and gmt servers * \******************************************************************************/ int ns2__add(struct soap *soap, double a, double b, double *r) { return SOAP_NO_METHOD; } int ns2__sub(struct soap *soap, double a, double b, double *r) { return SOAP_NO_METHOD; } int ns2__mul(struct soap *soap, double a, double b, double *r) { return SOAP_NO_METHOD; } int ns2__div(struct soap *soap, double a, double b, double *r) { return SOAP_NO_METHOD; } int ns2__pow(struct soap *soap, double a, double b, double *r) { return SOAP_NO_METHOD; } int __ns4__gmt(struct soap *soap, struct _ns1__gmt *a, struct _ns1__gmtResponse *r) { return SOAP_NO_METHOD; } gsoap-2.8.91/gsoap/samples/mashup/Makefile.am0000644000175000017500000000121413525245163020376 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = mashupclient mashupserver SOAPHEADER = mashup.h include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = mashup.nsmap mashupclient_SOURCES = mashupclient.c $(SOAPHEADER) $(SOAP_C_CLIENT) mashupclient_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) mashupserver_SOURCES = mashupserver.c $(SOAPHEADER) $(SOAP_C_CLIENT) soapServer.c mashupserver_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) gsoap-2.8.91/gsoap/samples/mashup/mashup.wsdl0000644000175000017500000000426613525245163020544 0ustar ellertellert gsoap-2.8.91/gsoap/samples/roll/0000755000175000017500000000000013525245200016007 5ustar ellertellertgsoap-2.8.91/gsoap/samples/roll/.deps/0000755000175000017500000000000013525245200017020 5ustar ellertellertgsoap-2.8.91/gsoap/samples/roll/Makefile.in0000644000175000017500000005150113525245163020066 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = rollclient$(EXEEXT) rollserver$(EXEEXT) subdir = gsoap/samples/roll ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am_rollclient_OBJECTS = rollclient.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) rollclient_OBJECTS = $(am_rollclient_OBJECTS) am__DEPENDENCIES_1 = rollclient_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) am__objects_4 = soapServer.$(OBJEXT) $(am__objects_2) am_rollserver_OBJECTS = rollserver.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) rollserver_OBJECTS = $(am_rollserver_OBJECTS) rollserver_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/rollclient.Po \ ./$(DEPDIR)/rollserver.Po ./$(DEPDIR)/soapC.Po \ ./$(DEPDIR)/soapClient.Po ./$(DEPDIR)/soapServer.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(rollclient_SOURCES) $(rollserver_SOURCES) DIST_SOURCES = $(rollclient_SOURCES) $(rollserver_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.cpp_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = roll.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = r.nsmap r.wsdl rollclient_SOURCES = rollclient.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) rollclient_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) rollserver_SOURCES = rollserver.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) rollserver_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/roll/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/roll/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) rollclient$(EXEEXT): $(rollclient_OBJECTS) $(rollclient_DEPENDENCIES) $(EXTRA_rollclient_DEPENDENCIES) @rm -f rollclient$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(rollclient_OBJECTS) $(rollclient_LDADD) $(LIBS) rollserver$(EXEEXT): $(rollserver_OBJECTS) $(rollserver_DEPENDENCIES) $(EXTRA_rollserver_DEPENDENCIES) @rm -f rollserver$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(rollserver_OBJECTS) $(rollserver_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rollclient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rollserver.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/rollclient.Po -rm -f ./$(DEPDIR)/rollserver.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/rollclient.Po -rm -f ./$(DEPDIR)/rollserver.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/roll/rollclient.cpp0000644000175000017500000000040313525245163020667 0ustar ellertellert#include "soapH.h" #include "r.nsmap" int main() { int d; struct soap *soap = soap_new(); soap_call_r__roll(soap, "http://www.cs.fsu.edu/~engelen/rolllitserver.cgi", "", d); printf("%d\n", d); soap_destroy(soap); soap_end(soap); soap_free(soap); return 0; } gsoap-2.8.91/gsoap/samples/roll/README.txt0000644000175000017500000000103113525245163017510 0ustar ellertellertThis directory contains a "one-liner" service: gSOAP Web service and client applications that are only one line long (not counting the usual #includes). The oneliners are small, but they can do a number of useful things. The complete list of oneliners is: samples/gmt return current time in GMT samples/hello "Hello World!" samples/roll rolling a die You can use the client programs right away after compilation since they connect to our server. To run the server examples you have to install them as CGI applications. gsoap-2.8.91/gsoap/samples/roll/Makefile.am0000644000175000017500000000117513525245163020057 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = rollclient rollserver SOAPHEADER = roll.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = r.nsmap r.wsdl rollclient_SOURCES = rollclient.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) rollclient_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) rollserver_SOURCES = rollserver.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) rollserver_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) gsoap-2.8.91/gsoap/samples/roll/roll.h0000644000175000017500000000001713525245163017136 0ustar ellertellertr__roll(int&); gsoap-2.8.91/gsoap/samples/roll/rollserver.cpp0000644000175000017500000000026013525245163020720 0ustar ellertellert#include "soapH.h" #include "r.nsmap" int main() { return soap_serve(soap_new()); } int r__roll(struct soap *soap, int &r) { srand(time(0)); r = rand()%6+1; return SOAP_OK; } gsoap-2.8.91/gsoap/samples/calc_vs2005/0000755000175000017500000000000013525245162016767 5ustar ellertellertgsoap-2.8.91/gsoap/samples/calc_vs2005/calc_vs2005.sln0000644000175000017500000000160713525245162021432 0ustar ellertellert Microsoft Visual Studio Solution File, Format Version 9.00 # Visual C++ Express 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "calc_vs2005", "calc_vs2005\calc_vs2005.vcproj", "{61B4085F-9AF4-44D0-9489-3CD86101AB83}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {61B4085F-9AF4-44D0-9489-3CD86101AB83}.Debug|Win32.ActiveCfg = Debug|Win32 {61B4085F-9AF4-44D0-9489-3CD86101AB83}.Debug|Win32.Build.0 = Debug|Win32 {61B4085F-9AF4-44D0-9489-3CD86101AB83}.Release|Win32.ActiveCfg = Release|Win32 {61B4085F-9AF4-44D0-9489-3CD86101AB83}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal gsoap-2.8.91/gsoap/samples/calc_vs2005/calc_vs2005/0000755000175000017500000000000013525564137020716 5ustar ellertellertgsoap-2.8.91/gsoap/samples/calc_vs2005/calc_vs2005/calc_vs2005.vcproj0000644000175000017500000001163013525245162024057 0ustar ellertellert gsoap-2.8.91/gsoap/samples/calc_vs2005/calc_vs2005/soapC.cpp0000644000175000017500000030411113525245162022461 0ustar ellertellert/* soapC.cpp Generated by gSOAP 2.8.91 for calc.h gSOAP XML Web services tools Copyright (C) 2000-2018, Robert van Engelen, Genivia Inc. All Rights Reserved. The soapcpp2 tool and its generated software are released under the GPL. 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 -------------------------------------------------------------------------------- */ #if defined(__BORLANDC__) #pragma option push -w-8060 #pragma option push -w-8004 #endif #include "soapH.h" SOAP_SOURCE_STAMP("@(#) soapC.cpp ver 2.8.91 2019-08-15 12:02:55 GMT") #ifndef WITH_NOGLOBAL 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", soap->header, NULL); soap->part = SOAP_END_HEADER; return soap->header == NULL; } SOAP_FMAC3 int SOAP_FMAC4 soap_putheader(struct soap *soap) { if (soap->version && soap->header) { soap->part = SOAP_IN_HEADER; if (soap_out_SOAP_ENV__Header(soap, "SOAP-ENV:Header", 0, soap->header, "")) return soap->error; soap->part = SOAP_END_HEADER; } return SOAP_OK; } SOAP_FMAC3 void SOAP_FMAC4 soap_serializeheader(struct soap *soap) { if (soap->version && soap->header) soap_serialize_SOAP_ENV__Header(soap, soap->header); } SOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap *soap) { if (soap->header == NULL) { if ((soap->header = soap_new_SOAP_ENV__Header(soap))) soap_default_SOAP_ENV__Header(soap, soap->header); } } SOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap *soap) { if (soap->fault == NULL) { soap->fault = soap_new_SOAP_ENV__Fault(soap, -1); if (soap->fault == NULL) return; } if (soap->version == 2 && soap->fault->SOAP_ENV__Code == NULL) soap->fault->SOAP_ENV__Code = soap_new_SOAP_ENV__Code(soap, -1); if (soap->version == 2 && soap->fault->SOAP_ENV__Reason == NULL) soap->fault->SOAP_ENV__Reason = soap_new_SOAP_ENV__Reason(soap, -1); } 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", ""); 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->fault == NULL) return NULL; if (soap->version == 2 && soap->fault->SOAP_ENV__Code) return (const char**)(void*)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Value; return (const char**)(void*)&soap->fault->faultcode; } SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultsubcode(struct soap *soap) { soap_fault(soap); if (soap->fault == NULL) return NULL; if (soap->version == 2 && soap->fault->SOAP_ENV__Code) { if (soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode == NULL) { soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode = soap_new_SOAP_ENV__Code(soap, -1); if (soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode == NULL) return NULL; } return (const char**)(void*)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode->SOAP_ENV__Value; } return (const char**)(void*)&soap->fault->faultcode; } SOAP_FMAC3 const char * SOAP_FMAC4 soap_fault_subcode(struct soap *soap) { const char **s = soap_faultsubcode(soap); return s ? *s : NULL; } SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultstring(struct soap *soap) { soap_fault(soap); if (soap->fault == NULL) return NULL; if (soap->version == 2 && soap->fault->SOAP_ENV__Reason) return (const char**)(void*)&soap->fault->SOAP_ENV__Reason->SOAP_ENV__Text; return (const char**)(void*)&soap->fault->faultstring; } SOAP_FMAC3 const char * SOAP_FMAC4 soap_fault_string(struct soap *soap) { const char **s = soap_faultstring(soap); return s ? *s : NULL; } SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultdetail(struct soap *soap) { soap_fault(soap); if (soap->fault == NULL) return NULL; if (soap->version == 2) { if (soap->fault->SOAP_ENV__Detail == NULL) soap->fault->SOAP_ENV__Detail = soap_new_SOAP_ENV__Detail(soap, -1); return (const char**)(void*)&soap->fault->SOAP_ENV__Detail->__any; } if (soap->fault->detail == NULL) soap->fault->detail = soap_new_SOAP_ENV__Detail(soap, -1); return (const char**)(void*)&soap->fault->detail->__any; } SOAP_FMAC3 const char * SOAP_FMAC4 soap_fault_detail(struct soap *soap) { const char **s = soap_faultdetail(soap); return s ? *s : NULL; } #endif #ifndef WITH_NOIDREF SOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap *soap) { int t; if (soap->version == 1) { for (;;) { if (!soap_getelement(soap, NULL, &t)) if ((soap->error && soap->error != SOAP_TAG_MISMATCH) || soap_ignore_element(soap)) break; } } if (soap->error == SOAP_NO_TAG || soap->error == SOAP_EOF) soap->error = SOAP_OK; return soap->error; } #endif #ifdef __cplusplus extern "C" { #endif SOAP_FMAC3 void * SOAP_FMAC4 soap_getelement(struct soap *soap, const char *tag, int *type) { (void)type; if (soap_peek_element(soap)) return NULL; #ifndef WITH_NOIDREF 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, tag, NULL, "xsd:byte"); case SOAP_TYPE_int: return soap_in_int(soap, tag, NULL, "xsd:int"); case SOAP_TYPE_double: return soap_in_double(soap, tag, NULL, "xsd:double"); case SOAP_TYPE_ns__pow: return soap_in_ns__pow(soap, tag, NULL, "ns:pow"); case SOAP_TYPE_ns__powResponse: return soap_in_ns__powResponse(soap, tag, NULL, "ns:powResponse"); case SOAP_TYPE_ns__div: return soap_in_ns__div(soap, tag, NULL, "ns:div"); case SOAP_TYPE_ns__divResponse: return soap_in_ns__divResponse(soap, tag, NULL, "ns:divResponse"); case SOAP_TYPE_ns__mul: return soap_in_ns__mul(soap, tag, NULL, "ns:mul"); case SOAP_TYPE_ns__mulResponse: return soap_in_ns__mulResponse(soap, tag, NULL, "ns:mulResponse"); case SOAP_TYPE_ns__sub: return soap_in_ns__sub(soap, tag, NULL, "ns:sub"); case SOAP_TYPE_ns__subResponse: return soap_in_ns__subResponse(soap, tag, NULL, "ns:subResponse"); case SOAP_TYPE_ns__add: return soap_in_ns__add(soap, tag, NULL, "ns:add"); case SOAP_TYPE_ns__addResponse: return soap_in_ns__addResponse(soap, tag, NULL, "ns:addResponse"); case SOAP_TYPE_PointerTodouble: return soap_in_PointerTodouble(soap, tag, NULL, "xsd:double"); case SOAP_TYPE__QName: { char **s; s = soap_in__QName(soap, tag, NULL, "xsd:QName"); return s ? *s : NULL; } case SOAP_TYPE_string: { char **s; s = soap_in_string(soap, tag, NULL, "xsd:string"); return s ? *s : NULL; } default: #else *type = 0; #endif { 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, tag, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:int")) { *type = SOAP_TYPE_int; return soap_in_int(soap, tag, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:double")) { *type = SOAP_TYPE_double; return soap_in_double(soap, tag, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:pow")) { *type = SOAP_TYPE_ns__pow; return soap_in_ns__pow(soap, tag, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:powResponse")) { *type = SOAP_TYPE_ns__powResponse; return soap_in_ns__powResponse(soap, tag, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:div")) { *type = SOAP_TYPE_ns__div; return soap_in_ns__div(soap, tag, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:divResponse")) { *type = SOAP_TYPE_ns__divResponse; return soap_in_ns__divResponse(soap, tag, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:mul")) { *type = SOAP_TYPE_ns__mul; return soap_in_ns__mul(soap, tag, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:mulResponse")) { *type = SOAP_TYPE_ns__mulResponse; return soap_in_ns__mulResponse(soap, tag, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:sub")) { *type = SOAP_TYPE_ns__sub; return soap_in_ns__sub(soap, tag, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:subResponse")) { *type = SOAP_TYPE_ns__subResponse; return soap_in_ns__subResponse(soap, tag, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:add")) { *type = SOAP_TYPE_ns__add; return soap_in_ns__add(soap, tag, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:addResponse")) { *type = SOAP_TYPE_ns__addResponse; return soap_in_ns__addResponse(soap, tag, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:QName")) { char **s; *type = SOAP_TYPE__QName; s = soap_in__QName(soap, tag, 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, tag, NULL, NULL); return s ? *s : NULL; } t = soap->tag; #ifndef WITH_NOIDREF } #endif } soap->error = SOAP_TAG_MISMATCH; return NULL; } #ifdef __cplusplus } #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 (soap->mustUnderstand && !soap->other && !soap->fignore) return soap->error = SOAP_MUSTUNDERSTAND; if (((soap->mode & SOAP_XML_STRICT) && !soap->fignore && 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, NULL, &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_ignore(soap)) return soap->error; } } 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, SOAP_MULTIREFTAG, pp->id, pp->type)) return soap->error; return SOAP_OK; } #endif #ifdef __cplusplus extern "C" { #endif SOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap *soap, const void *ptr, const char *tag, int id, int type) { (void)tag; 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_double: return soap_out_double(soap, tag, id, (const double *)ptr, "xsd:double"); case SOAP_TYPE_ns__pow: return soap_out_ns__pow(soap, tag, id, (const struct ns__pow *)ptr, "ns:pow"); case SOAP_TYPE_ns__powResponse: return soap_out_ns__powResponse(soap, tag, id, (const struct ns__powResponse *)ptr, "ns:powResponse"); case SOAP_TYPE_ns__div: return soap_out_ns__div(soap, tag, id, (const struct ns__div *)ptr, "ns:div"); case SOAP_TYPE_ns__divResponse: return soap_out_ns__divResponse(soap, tag, id, (const struct ns__divResponse *)ptr, "ns:divResponse"); case SOAP_TYPE_ns__mul: return soap_out_ns__mul(soap, tag, id, (const struct ns__mul *)ptr, "ns:mul"); case SOAP_TYPE_ns__mulResponse: return soap_out_ns__mulResponse(soap, tag, id, (const struct ns__mulResponse *)ptr, "ns:mulResponse"); case SOAP_TYPE_ns__sub: return soap_out_ns__sub(soap, tag, id, (const struct ns__sub *)ptr, "ns:sub"); case SOAP_TYPE_ns__subResponse: return soap_out_ns__subResponse(soap, tag, id, (const struct ns__subResponse *)ptr, "ns:subResponse"); case SOAP_TYPE_ns__add: return soap_out_ns__add(soap, tag, id, (const struct ns__add *)ptr, "ns:add"); case SOAP_TYPE_ns__addResponse: return soap_out_ns__addResponse(soap, tag, id, (const struct ns__addResponse *)ptr, "ns:addResponse"); case SOAP_TYPE_PointerTodouble: return soap_out_PointerTodouble(soap, tag, id, (double *const*)ptr, "xsd:double"); case SOAP_TYPE__QName: return soap_out_string(soap, tag, id, (char*const*)(void*)&ptr, "xsd:QName"); case SOAP_TYPE_string: return soap_out_string(soap, tag, id, (char*const*)(void*)&ptr, "xsd:string"); case 0: return SOAP_OK; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_putelement '%s' failed for type %d in soapC.cpp\n", tag ? tag : "", type)); return soap_element_empty(soap, tag); /* unknown type to serialize */ } #ifdef __cplusplus } #endif #ifndef WITH_NOIDREF #ifdef __cplusplus extern "C" { #endif 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_ns__pow: soap_serialize_ns__pow(soap, (const struct ns__pow *)ptr); break; case SOAP_TYPE_ns__powResponse: soap_serialize_ns__powResponse(soap, (const struct ns__powResponse *)ptr); break; case SOAP_TYPE_ns__div: soap_serialize_ns__div(soap, (const struct ns__div *)ptr); break; case SOAP_TYPE_ns__divResponse: soap_serialize_ns__divResponse(soap, (const struct ns__divResponse *)ptr); break; case SOAP_TYPE_ns__mul: soap_serialize_ns__mul(soap, (const struct ns__mul *)ptr); break; case SOAP_TYPE_ns__mulResponse: soap_serialize_ns__mulResponse(soap, (const struct ns__mulResponse *)ptr); break; case SOAP_TYPE_ns__sub: soap_serialize_ns__sub(soap, (const struct ns__sub *)ptr); break; case SOAP_TYPE_ns__subResponse: soap_serialize_ns__subResponse(soap, (const struct ns__subResponse *)ptr); break; case SOAP_TYPE_ns__add: soap_serialize_ns__add(soap, (const struct ns__add *)ptr); break; case SOAP_TYPE_ns__addResponse: soap_serialize_ns__addResponse(soap, (const struct ns__addResponse *)ptr); break; case SOAP_TYPE_PointerTodouble: soap_serialize_PointerTodouble(soap, (double *const*)ptr); break; case SOAP_TYPE__QName: soap_serialize_string(soap, (char*const*)(void*)&ptr); break; case SOAP_TYPE_string: soap_serialize_string(soap, (char*const*)(void*)&ptr); break; } } #ifdef __cplusplus } #endif #endif #ifdef __cplusplus extern "C" { #endif SOAP_FMAC3 void * SOAP_FMAC4 soap_dupelement(struct soap *soap, const void *ptr, int type) {(void)soap; (void)ptr; (void)type; /* appease -Wall -Werror */ return NULL; } #ifdef __cplusplus } #endif #ifdef __cplusplus extern "C" { #endif SOAP_FMAC3 void SOAP_FMAC4 soap_delelement(const void *ptr, int type) {(void)ptr; (void)type; /* appease -Wall -Werror */ } #ifdef __cplusplus } #endif SOAP_FMAC3 void * SOAP_FMAC4 soap_instantiate(struct soap *soap, int t, const char *type, const char *arrayType, size_t *n) { (void)type; switch (t) { case SOAP_TYPE_ns__addResponse: return (void*)soap_instantiate_ns__addResponse(soap, -1, type, arrayType, n); case SOAP_TYPE_ns__add: return (void*)soap_instantiate_ns__add(soap, -1, type, arrayType, n); case SOAP_TYPE_ns__subResponse: return (void*)soap_instantiate_ns__subResponse(soap, -1, type, arrayType, n); case SOAP_TYPE_ns__sub: return (void*)soap_instantiate_ns__sub(soap, -1, type, arrayType, n); case SOAP_TYPE_ns__mulResponse: return (void*)soap_instantiate_ns__mulResponse(soap, -1, type, arrayType, n); case SOAP_TYPE_ns__mul: return (void*)soap_instantiate_ns__mul(soap, -1, type, arrayType, n); case SOAP_TYPE_ns__divResponse: return (void*)soap_instantiate_ns__divResponse(soap, -1, type, arrayType, n); case SOAP_TYPE_ns__div: return (void*)soap_instantiate_ns__div(soap, -1, type, arrayType, n); case SOAP_TYPE_ns__powResponse: return (void*)soap_instantiate_ns__powResponse(soap, -1, type, arrayType, n); case SOAP_TYPE_ns__pow: return (void*)soap_instantiate_ns__pow(soap, -1, type, arrayType, n); #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Header: return (void*)soap_instantiate_SOAP_ENV__Header(soap, -1, type, arrayType, n); #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Code: return (void*)soap_instantiate_SOAP_ENV__Code(soap, -1, type, arrayType, n); #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Detail: return (void*)soap_instantiate_SOAP_ENV__Detail(soap, -1, type, arrayType, n); #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Reason: return (void*)soap_instantiate_SOAP_ENV__Reason(soap, -1, type, arrayType, n); #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Fault: return (void*)soap_instantiate_SOAP_ENV__Fault(soap, -1, type, arrayType, n); #endif } return NULL; } SOAP_FMAC3 int SOAP_FMAC4 soap_fdelete(struct soap *soap, struct soap_clist *p) { (void)soap; /* appease -Wall -Werror */ if (!p->ptr) return SOAP_OK; switch (p->type) { case SOAP_TYPE_ns__addResponse: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct ns__addResponse); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct ns__addResponse); break; case SOAP_TYPE_ns__add: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct ns__add); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct ns__add); break; case SOAP_TYPE_ns__subResponse: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct ns__subResponse); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct ns__subResponse); break; case SOAP_TYPE_ns__sub: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct ns__sub); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct ns__sub); break; case SOAP_TYPE_ns__mulResponse: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct ns__mulResponse); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct ns__mulResponse); break; case SOAP_TYPE_ns__mul: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct ns__mul); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct ns__mul); break; case SOAP_TYPE_ns__divResponse: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct ns__divResponse); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct ns__divResponse); break; case SOAP_TYPE_ns__div: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct ns__div); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct ns__div); break; case SOAP_TYPE_ns__powResponse: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct ns__powResponse); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct ns__powResponse); break; case SOAP_TYPE_ns__pow: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct ns__pow); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct ns__pow); break; #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Header: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct SOAP_ENV__Header); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct SOAP_ENV__Header); break; #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Code: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct SOAP_ENV__Code); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct SOAP_ENV__Code); break; #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Detail: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct SOAP_ENV__Detail); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct SOAP_ENV__Detail); break; #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Reason: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct SOAP_ENV__Reason); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct SOAP_ENV__Reason); break; #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Fault: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct SOAP_ENV__Fault); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct SOAP_ENV__Fault); break; #endif default: return SOAP_ERR; } return SOAP_OK; } #ifdef WIN32 #pragma warning(push) // do not warn on switch w/o cases #pragma warning(disable:4065) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_fbase(int t, int b) { (void)t; (void)b; /* appease -Wall -Werror */ return 0; } #ifdef WIN32 #pragma warning(pop) #endif #ifndef WITH_NOIDREF #ifdef WIN32 #pragma warning(push) // do not warn on switch w/o cases #pragma warning(disable:4065) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_finsert(struct soap *soap, int t, int tt, void *p, size_t index, const void *q, void **x) { (void)soap; (void)t; (void)p; (void)index; (void)q; (void)x; /* appease -Wall -Werror */ switch (tt) { case SOAP_TYPE_ns__addResponse: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__addResponse type=%d location=%p object=%p\n", t, p, q)); *(struct ns__addResponse*)p = *(struct ns__addResponse*)q; break; case SOAP_TYPE_ns__add: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__add type=%d location=%p object=%p\n", t, p, q)); *(struct ns__add*)p = *(struct ns__add*)q; break; case SOAP_TYPE_ns__subResponse: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__subResponse type=%d location=%p object=%p\n", t, p, q)); *(struct ns__subResponse*)p = *(struct ns__subResponse*)q; break; case SOAP_TYPE_ns__sub: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__sub type=%d location=%p object=%p\n", t, p, q)); *(struct ns__sub*)p = *(struct ns__sub*)q; break; case SOAP_TYPE_ns__mulResponse: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__mulResponse type=%d location=%p object=%p\n", t, p, q)); *(struct ns__mulResponse*)p = *(struct ns__mulResponse*)q; break; case SOAP_TYPE_ns__mul: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__mul type=%d location=%p object=%p\n", t, p, q)); *(struct ns__mul*)p = *(struct ns__mul*)q; break; case SOAP_TYPE_ns__divResponse: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__divResponse type=%d location=%p object=%p\n", t, p, q)); *(struct ns__divResponse*)p = *(struct ns__divResponse*)q; break; case SOAP_TYPE_ns__div: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__div type=%d location=%p object=%p\n", t, p, q)); *(struct ns__div*)p = *(struct ns__div*)q; break; case SOAP_TYPE_ns__powResponse: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__powResponse type=%d location=%p object=%p\n", t, p, q)); *(struct ns__powResponse*)p = *(struct ns__powResponse*)q; break; case SOAP_TYPE_ns__pow: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__pow type=%d location=%p object=%p\n", t, p, q)); *(struct ns__pow*)p = *(struct ns__pow*)q; break; #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Header: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct SOAP_ENV__Header type=%d location=%p object=%p\n", t, p, q)); *(struct SOAP_ENV__Header*)p = *(struct SOAP_ENV__Header*)q; break; #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Code: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct SOAP_ENV__Code type=%d location=%p object=%p\n", t, p, q)); *(struct SOAP_ENV__Code*)p = *(struct SOAP_ENV__Code*)q; break; #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Detail: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct SOAP_ENV__Detail type=%d location=%p object=%p\n", t, p, q)); *(struct SOAP_ENV__Detail*)p = *(struct SOAP_ENV__Detail*)q; break; #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Reason: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct SOAP_ENV__Reason type=%d location=%p object=%p\n", t, p, q)); *(struct SOAP_ENV__Reason*)p = *(struct SOAP_ENV__Reason*)q; break; #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Fault: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct SOAP_ENV__Fault type=%d location=%p object=%p\n", t, p, q)); *(struct SOAP_ENV__Fault*)p = *(struct SOAP_ENV__Fault*)q; break; #endif default: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not insert type=%d in %d\n", t, tt)); } } #ifdef WIN32 #pragma warning(pop) #endif #endif 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_in_byte(struct soap *soap, const char *tag, char *a, const char *type) { a = soap_inbyte(soap, tag, a, type, SOAP_TYPE_byte); return a; } SOAP_FMAC3 char * SOAP_FMAC4 soap_new_byte(struct soap *soap, int n) { char *a = static_cast(soap_malloc(soap, (n = (n < 0 ? 1 : n)) * sizeof(char))); for (char *p = a; p && n--; ++p) soap_default_byte(soap, p); return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_byte(struct soap *soap, const char *a, const char *tag, const char *type) { if (soap_out_byte(soap, tag ? tag : "byte", -2, a, type)) return soap->error; return soap_putindependent(soap); } 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 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_in_int(struct soap *soap, const char *tag, int *a, const char *type) { a = soap_inint(soap, tag, a, type, SOAP_TYPE_int); return a; } SOAP_FMAC3 int * SOAP_FMAC4 soap_new_int(struct soap *soap, int n) { int *a = static_cast(soap_malloc(soap, (n = (n < 0 ? 1 : n)) * sizeof(int))); for (int *p = a; p && n--; ++p) soap_default_int(soap, p); return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_int(struct soap *soap, const int *a, const char *tag, const char *type) { if (soap_out_int(soap, tag ? tag : "int", -2, a, type)) return soap->error; return soap_putindependent(soap); } 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_out_double(struct soap *soap, const char *tag, int id, const double *a, const char *type) { return soap_outdouble(soap, tag, id, a, type, SOAP_TYPE_double); } SOAP_FMAC3 double * SOAP_FMAC4 soap_in_double(struct soap *soap, const char *tag, double *a, const char *type) { a = soap_indouble(soap, tag, a, type, SOAP_TYPE_double); return a; } SOAP_FMAC3 double * SOAP_FMAC4 soap_new_double(struct soap *soap, int n) { double *a = static_cast(soap_malloc(soap, (n = (n < 0 ? 1 : n)) * sizeof(double))); for (double *p = a; p && n--; ++p) soap_default_double(soap, p); return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_double(struct soap *soap, const double *a, const char *tag, const char *type) { if (soap_out_double(soap, tag ? tag : "double", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 double * SOAP_FMAC4 soap_get_double(struct soap *soap, double *p, const char *tag, const char *type) { if ((p = soap_in_double(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #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 */ #ifndef WITH_NOIDREF soap_serialize__QName(soap, (char*const*)&a->faultcode); soap_serialize_string(soap, (char*const*)&a->faultstring); soap_serialize_string(soap, (char*const*)&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, (char*const*)&a->SOAP_ENV__Node); soap_serialize_string(soap, (char*const*)&a->SOAP_ENV__Role); soap_serialize_PointerToSOAP_ENV__Detail(soap, &a->SOAP_ENV__Detail); #endif } 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_tmp_faultcode = soap_QName2s(soap, a->faultcode); (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ 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*)(void*)&soap_tmp_faultcode, "")) return soap->error; if (soap_out_string(soap, "faultstring", -1, (char*const*)&a->faultstring, "")) return soap->error; if (soap_out_string(soap, "faultactor", -1, (char*const*)&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, (char*const*)&a->SOAP_ENV__Node, "")) return soap->error; if (soap_out_string(soap, "SOAP-ENV:Role", -1, (char*const*)&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_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, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct SOAP_ENV__Fault*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Fault, sizeof(struct SOAP_ENV__Fault), NULL, 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", (char**)&a->faultcode, "xsd:QName")) { soap_flag_faultcode--; continue; } } if (soap_flag_faultstring && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) { if (soap_in_string(soap, "faultstring", (char**)&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", (char**)&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", (char**)&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", (char**)&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, SOAP_TYPE_SOAP_ENV__Fault, sizeof(struct SOAP_ENV__Fault), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct SOAP_ENV__Fault * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Fault(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_SOAP_ENV__Fault(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct SOAP_ENV__Fault *p; size_t k = sizeof(struct SOAP_ENV__Fault); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_SOAP_ENV__Fault, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct SOAP_ENV__Fault); } else { p = SOAP_NEW_ARRAY(soap, struct SOAP_ENV__Fault, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct SOAP_ENV__Fault location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } 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) { if (soap_out_SOAP_ENV__Fault(soap, tag ? tag : "SOAP-ENV:Fault", -2, a, type)) return soap->error; return soap_putindependent(soap); } 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; } #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 */ #ifndef WITH_NOIDREF soap_serialize_string(soap, (char*const*)&a->SOAP_ENV__Text); #endif } 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) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ 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, 1); if (soap_out_string(soap, "SOAP-ENV:Text", -1, (char*const*)&a->SOAP_ENV__Text, "")) return soap->error; return soap_element_end_out(soap, tag); } 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, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct SOAP_ENV__Reason*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Reason, sizeof(struct SOAP_ENV__Reason), NULL, 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", (char**)&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, SOAP_TYPE_SOAP_ENV__Reason, sizeof(struct SOAP_ENV__Reason), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct SOAP_ENV__Reason * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Reason(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_SOAP_ENV__Reason(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct SOAP_ENV__Reason *p; size_t k = sizeof(struct SOAP_ENV__Reason); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_SOAP_ENV__Reason, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct SOAP_ENV__Reason); } else { p = SOAP_NEW_ARRAY(soap, struct SOAP_ENV__Reason, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct SOAP_ENV__Reason location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } 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) { if (soap_out_SOAP_ENV__Reason(soap, tag ? tag : "SOAP-ENV:Reason", -2, a, type)) return soap->error; return soap_putindependent(soap); } 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; } #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->__any = NULL; a->__type = 0; a->fault = 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 */ #ifndef WITH_NOIDREF soap_markelement(soap, a->fault, a->__type); #endif } 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) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Detail), type)) return soap->error; if (soap_outliteral(soap, "-any", (char*const*)&a->__any, NULL)) return soap->error; if (soap_putelement(soap, a->fault, "fault", -1, a->__type)) return soap->error; return soap_element_end_out(soap, tag); } 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___any = 1; size_t soap_flag_fault = 1; if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct SOAP_ENV__Detail*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Detail, sizeof(struct SOAP_ENV__Detail), NULL, 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, "fault", &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", (char**)&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, SOAP_TYPE_SOAP_ENV__Detail, sizeof(struct SOAP_ENV__Detail), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct SOAP_ENV__Detail * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Detail(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_SOAP_ENV__Detail(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct SOAP_ENV__Detail *p; size_t k = sizeof(struct SOAP_ENV__Detail); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_SOAP_ENV__Detail, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct SOAP_ENV__Detail); } else { p = SOAP_NEW_ARRAY(soap, struct SOAP_ENV__Detail, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct SOAP_ENV__Detail location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } 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) { if (soap_out_SOAP_ENV__Detail(soap, tag ? tag : "SOAP-ENV:Detail", -2, a, type)) return soap->error; return soap_putindependent(soap); } 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; } #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 */ #ifndef WITH_NOIDREF soap_serialize__QName(soap, (char*const*)&a->SOAP_ENV__Value); soap_serialize_PointerToSOAP_ENV__Code(soap, &a->SOAP_ENV__Subcode); #endif } 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_tmp_SOAP_ENV__Value = soap_QName2s(soap, a->SOAP_ENV__Value); (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ 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*)(void*)&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_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, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct SOAP_ENV__Code*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Code, sizeof(struct SOAP_ENV__Code), NULL, 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", (char**)&a->SOAP_ENV__Value, "xsd:QName")) { 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, SOAP_TYPE_SOAP_ENV__Code, sizeof(struct SOAP_ENV__Code), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct SOAP_ENV__Code * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Code(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_SOAP_ENV__Code(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct SOAP_ENV__Code *p; size_t k = sizeof(struct SOAP_ENV__Code); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_SOAP_ENV__Code, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct SOAP_ENV__Code); } else { p = SOAP_NEW_ARRAY(soap, struct SOAP_ENV__Code, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct SOAP_ENV__Code location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } 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) { if (soap_out_SOAP_ENV__Code(soap, tag ? tag : "SOAP-ENV:Code", -2, a, type)) return soap->error; return soap_putindependent(soap); } 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; } #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 */ #ifndef WITH_NOIDREF #endif } 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) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Header), type)) return soap->error; return soap_element_end_out(soap, tag); } 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, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct SOAP_ENV__Header*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Header, sizeof(struct SOAP_ENV__Header), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_SOAP_ENV__Header(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 SOAP_ENV__Header *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Header, SOAP_TYPE_SOAP_ENV__Header, sizeof(struct SOAP_ENV__Header), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct SOAP_ENV__Header * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Header(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_SOAP_ENV__Header(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct SOAP_ENV__Header *p; size_t k = sizeof(struct SOAP_ENV__Header); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_SOAP_ENV__Header, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct SOAP_ENV__Header); } else { p = SOAP_NEW_ARRAY(soap, struct SOAP_ENV__Header, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct SOAP_ENV__Header location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } 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) { if (soap_out_SOAP_ENV__Header(soap, tag ? tag : "SOAP-ENV:Header", -2, a, type)) return soap->error; return soap_putindependent(soap); } 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; } #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__pow(struct soap *soap, struct ns__pow *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_double(soap, &a->a); soap_default_double(soap, &a->b); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__pow(struct soap *soap, const struct ns__pow *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_embedded(soap, &a->a, SOAP_TYPE_double); soap_embedded(soap, &a->b, SOAP_TYPE_double); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__pow(struct soap *soap, const char *tag, int id, const struct ns__pow *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__pow), type)) return soap->error; if (soap_out_double(soap, "a", -1, &a->a, "")) return soap->error; if (soap_out_double(soap, "b", -1, &a->b, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__pow * SOAP_FMAC4 soap_in_ns__pow(struct soap *soap, const char *tag, struct ns__pow *a, const char *type) { size_t soap_flag_a = 1; size_t soap_flag_b = 1; if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct ns__pow*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__pow, sizeof(struct ns__pow), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__pow(soap, a); if (soap->body && *soap->href != '#') { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_a && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_double(soap, "a", &a->a, "xsd:double")) { soap_flag_a--; continue; } } if (soap_flag_b && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_double(soap, "b", &a->b, "xsd:double")) { soap_flag_b--; 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; if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_a > 0 || soap_flag_b > 0)) { soap->error = SOAP_OCCURS; return NULL; } } else if ((soap->mode & SOAP_XML_STRICT) && *soap->href != '#') { soap->error = SOAP_OCCURS; return NULL; } else { a = (struct ns__pow *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__pow, SOAP_TYPE_ns__pow, sizeof(struct ns__pow), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__pow * SOAP_FMAC2 soap_instantiate_ns__pow(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__pow(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__pow *p; size_t k = sizeof(struct ns__pow); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_ns__pow, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct ns__pow); } else { p = SOAP_NEW_ARRAY(soap, struct ns__pow, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__pow location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__pow(struct soap *soap, const struct ns__pow *a, const char *tag, const char *type) { if (soap_out_ns__pow(soap, tag ? tag : "ns:pow", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__pow * SOAP_FMAC4 soap_get_ns__pow(struct soap *soap, struct ns__pow *p, const char *tag, const char *type) { if ((p = soap_in_ns__pow(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__powResponse(struct soap *soap, struct ns__powResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->result = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__powResponse(struct soap *soap, const struct ns__powResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_serialize_PointerTodouble(soap, &a->result); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__powResponse(struct soap *soap, const char *tag, int id, const struct ns__powResponse *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__powResponse), type)) return soap->error; if (soap_out_PointerTodouble(soap, "result", -1, &a->result, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__powResponse * SOAP_FMAC4 soap_in_ns__powResponse(struct soap *soap, const char *tag, struct ns__powResponse *a, const char *type) { size_t soap_flag_result = 1; if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct ns__powResponse*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__powResponse, sizeof(struct ns__powResponse), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__powResponse(soap, a); if (soap->body && *soap->href != '#') { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_PointerTodouble(soap, "result", &a->result, "xsd:double")) { soap_flag_result--; 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 ns__powResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__powResponse, SOAP_TYPE_ns__powResponse, sizeof(struct ns__powResponse), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__powResponse * SOAP_FMAC2 soap_instantiate_ns__powResponse(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__powResponse(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__powResponse *p; size_t k = sizeof(struct ns__powResponse); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_ns__powResponse, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct ns__powResponse); } else { p = SOAP_NEW_ARRAY(soap, struct ns__powResponse, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__powResponse location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__powResponse(struct soap *soap, const struct ns__powResponse *a, const char *tag, const char *type) { if (soap_out_ns__powResponse(soap, tag ? tag : "ns:powResponse", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__powResponse * SOAP_FMAC4 soap_get_ns__powResponse(struct soap *soap, struct ns__powResponse *p, const char *tag, const char *type) { if ((p = soap_in_ns__powResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__div(struct soap *soap, struct ns__div *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_double(soap, &a->a); soap_default_double(soap, &a->b); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__div(struct soap *soap, const struct ns__div *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_embedded(soap, &a->a, SOAP_TYPE_double); soap_embedded(soap, &a->b, SOAP_TYPE_double); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__div(struct soap *soap, const char *tag, int id, const struct ns__div *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__div), type)) return soap->error; if (soap_out_double(soap, "a", -1, &a->a, "")) return soap->error; if (soap_out_double(soap, "b", -1, &a->b, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__div * SOAP_FMAC4 soap_in_ns__div(struct soap *soap, const char *tag, struct ns__div *a, const char *type) { size_t soap_flag_a = 1; size_t soap_flag_b = 1; if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct ns__div*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__div, sizeof(struct ns__div), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__div(soap, a); if (soap->body && *soap->href != '#') { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_a && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_double(soap, "a", &a->a, "xsd:double")) { soap_flag_a--; continue; } } if (soap_flag_b && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_double(soap, "b", &a->b, "xsd:double")) { soap_flag_b--; 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; if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_a > 0 || soap_flag_b > 0)) { soap->error = SOAP_OCCURS; return NULL; } } else if ((soap->mode & SOAP_XML_STRICT) && *soap->href != '#') { soap->error = SOAP_OCCURS; return NULL; } else { a = (struct ns__div *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__div, SOAP_TYPE_ns__div, sizeof(struct ns__div), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__div * SOAP_FMAC2 soap_instantiate_ns__div(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__div(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__div *p; size_t k = sizeof(struct ns__div); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_ns__div, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct ns__div); } else { p = SOAP_NEW_ARRAY(soap, struct ns__div, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__div location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__div(struct soap *soap, const struct ns__div *a, const char *tag, const char *type) { if (soap_out_ns__div(soap, tag ? tag : "ns:div", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__div * SOAP_FMAC4 soap_get_ns__div(struct soap *soap, struct ns__div *p, const char *tag, const char *type) { if ((p = soap_in_ns__div(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__divResponse(struct soap *soap, struct ns__divResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->result = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__divResponse(struct soap *soap, const struct ns__divResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_serialize_PointerTodouble(soap, &a->result); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__divResponse(struct soap *soap, const char *tag, int id, const struct ns__divResponse *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__divResponse), type)) return soap->error; if (soap_out_PointerTodouble(soap, "result", -1, &a->result, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__divResponse * SOAP_FMAC4 soap_in_ns__divResponse(struct soap *soap, const char *tag, struct ns__divResponse *a, const char *type) { size_t soap_flag_result = 1; if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct ns__divResponse*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__divResponse, sizeof(struct ns__divResponse), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__divResponse(soap, a); if (soap->body && *soap->href != '#') { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_PointerTodouble(soap, "result", &a->result, "xsd:double")) { soap_flag_result--; 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 ns__divResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__divResponse, SOAP_TYPE_ns__divResponse, sizeof(struct ns__divResponse), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__divResponse * SOAP_FMAC2 soap_instantiate_ns__divResponse(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__divResponse(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__divResponse *p; size_t k = sizeof(struct ns__divResponse); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_ns__divResponse, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct ns__divResponse); } else { p = SOAP_NEW_ARRAY(soap, struct ns__divResponse, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__divResponse location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__divResponse(struct soap *soap, const struct ns__divResponse *a, const char *tag, const char *type) { if (soap_out_ns__divResponse(soap, tag ? tag : "ns:divResponse", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__divResponse * SOAP_FMAC4 soap_get_ns__divResponse(struct soap *soap, struct ns__divResponse *p, const char *tag, const char *type) { if ((p = soap_in_ns__divResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__mul(struct soap *soap, struct ns__mul *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_double(soap, &a->a); soap_default_double(soap, &a->b); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__mul(struct soap *soap, const struct ns__mul *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_embedded(soap, &a->a, SOAP_TYPE_double); soap_embedded(soap, &a->b, SOAP_TYPE_double); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__mul(struct soap *soap, const char *tag, int id, const struct ns__mul *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__mul), type)) return soap->error; if (soap_out_double(soap, "a", -1, &a->a, "")) return soap->error; if (soap_out_double(soap, "b", -1, &a->b, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__mul * SOAP_FMAC4 soap_in_ns__mul(struct soap *soap, const char *tag, struct ns__mul *a, const char *type) { size_t soap_flag_a = 1; size_t soap_flag_b = 1; if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct ns__mul*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__mul, sizeof(struct ns__mul), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__mul(soap, a); if (soap->body && *soap->href != '#') { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_a && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_double(soap, "a", &a->a, "xsd:double")) { soap_flag_a--; continue; } } if (soap_flag_b && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_double(soap, "b", &a->b, "xsd:double")) { soap_flag_b--; 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; if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_a > 0 || soap_flag_b > 0)) { soap->error = SOAP_OCCURS; return NULL; } } else if ((soap->mode & SOAP_XML_STRICT) && *soap->href != '#') { soap->error = SOAP_OCCURS; return NULL; } else { a = (struct ns__mul *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__mul, SOAP_TYPE_ns__mul, sizeof(struct ns__mul), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__mul * SOAP_FMAC2 soap_instantiate_ns__mul(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__mul(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__mul *p; size_t k = sizeof(struct ns__mul); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_ns__mul, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct ns__mul); } else { p = SOAP_NEW_ARRAY(soap, struct ns__mul, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__mul location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__mul(struct soap *soap, const struct ns__mul *a, const char *tag, const char *type) { if (soap_out_ns__mul(soap, tag ? tag : "ns:mul", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__mul * SOAP_FMAC4 soap_get_ns__mul(struct soap *soap, struct ns__mul *p, const char *tag, const char *type) { if ((p = soap_in_ns__mul(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__mulResponse(struct soap *soap, struct ns__mulResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->result = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__mulResponse(struct soap *soap, const struct ns__mulResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_serialize_PointerTodouble(soap, &a->result); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__mulResponse(struct soap *soap, const char *tag, int id, const struct ns__mulResponse *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__mulResponse), type)) return soap->error; if (soap_out_PointerTodouble(soap, "result", -1, &a->result, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__mulResponse * SOAP_FMAC4 soap_in_ns__mulResponse(struct soap *soap, const char *tag, struct ns__mulResponse *a, const char *type) { size_t soap_flag_result = 1; if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct ns__mulResponse*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__mulResponse, sizeof(struct ns__mulResponse), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__mulResponse(soap, a); if (soap->body && *soap->href != '#') { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_PointerTodouble(soap, "result", &a->result, "xsd:double")) { soap_flag_result--; 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 ns__mulResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__mulResponse, SOAP_TYPE_ns__mulResponse, sizeof(struct ns__mulResponse), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__mulResponse * SOAP_FMAC2 soap_instantiate_ns__mulResponse(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__mulResponse(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__mulResponse *p; size_t k = sizeof(struct ns__mulResponse); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_ns__mulResponse, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct ns__mulResponse); } else { p = SOAP_NEW_ARRAY(soap, struct ns__mulResponse, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__mulResponse location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__mulResponse(struct soap *soap, const struct ns__mulResponse *a, const char *tag, const char *type) { if (soap_out_ns__mulResponse(soap, tag ? tag : "ns:mulResponse", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__mulResponse * SOAP_FMAC4 soap_get_ns__mulResponse(struct soap *soap, struct ns__mulResponse *p, const char *tag, const char *type) { if ((p = soap_in_ns__mulResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__sub(struct soap *soap, struct ns__sub *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_double(soap, &a->a); soap_default_double(soap, &a->b); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__sub(struct soap *soap, const struct ns__sub *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_embedded(soap, &a->a, SOAP_TYPE_double); soap_embedded(soap, &a->b, SOAP_TYPE_double); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__sub(struct soap *soap, const char *tag, int id, const struct ns__sub *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__sub), type)) return soap->error; if (soap_out_double(soap, "a", -1, &a->a, "")) return soap->error; if (soap_out_double(soap, "b", -1, &a->b, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__sub * SOAP_FMAC4 soap_in_ns__sub(struct soap *soap, const char *tag, struct ns__sub *a, const char *type) { size_t soap_flag_a = 1; size_t soap_flag_b = 1; if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct ns__sub*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__sub, sizeof(struct ns__sub), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__sub(soap, a); if (soap->body && *soap->href != '#') { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_a && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_double(soap, "a", &a->a, "xsd:double")) { soap_flag_a--; continue; } } if (soap_flag_b && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_double(soap, "b", &a->b, "xsd:double")) { soap_flag_b--; 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; if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_a > 0 || soap_flag_b > 0)) { soap->error = SOAP_OCCURS; return NULL; } } else if ((soap->mode & SOAP_XML_STRICT) && *soap->href != '#') { soap->error = SOAP_OCCURS; return NULL; } else { a = (struct ns__sub *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__sub, SOAP_TYPE_ns__sub, sizeof(struct ns__sub), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__sub * SOAP_FMAC2 soap_instantiate_ns__sub(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__sub(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__sub *p; size_t k = sizeof(struct ns__sub); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_ns__sub, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct ns__sub); } else { p = SOAP_NEW_ARRAY(soap, struct ns__sub, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__sub location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__sub(struct soap *soap, const struct ns__sub *a, const char *tag, const char *type) { if (soap_out_ns__sub(soap, tag ? tag : "ns:sub", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__sub * SOAP_FMAC4 soap_get_ns__sub(struct soap *soap, struct ns__sub *p, const char *tag, const char *type) { if ((p = soap_in_ns__sub(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__subResponse(struct soap *soap, struct ns__subResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->result = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__subResponse(struct soap *soap, const struct ns__subResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_serialize_PointerTodouble(soap, &a->result); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__subResponse(struct soap *soap, const char *tag, int id, const struct ns__subResponse *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__subResponse), type)) return soap->error; if (soap_out_PointerTodouble(soap, "result", -1, &a->result, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__subResponse * SOAP_FMAC4 soap_in_ns__subResponse(struct soap *soap, const char *tag, struct ns__subResponse *a, const char *type) { size_t soap_flag_result = 1; if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct ns__subResponse*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__subResponse, sizeof(struct ns__subResponse), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__subResponse(soap, a); if (soap->body && *soap->href != '#') { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_PointerTodouble(soap, "result", &a->result, "xsd:double")) { soap_flag_result--; 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 ns__subResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__subResponse, SOAP_TYPE_ns__subResponse, sizeof(struct ns__subResponse), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__subResponse * SOAP_FMAC2 soap_instantiate_ns__subResponse(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__subResponse(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__subResponse *p; size_t k = sizeof(struct ns__subResponse); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_ns__subResponse, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct ns__subResponse); } else { p = SOAP_NEW_ARRAY(soap, struct ns__subResponse, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__subResponse location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__subResponse(struct soap *soap, const struct ns__subResponse *a, const char *tag, const char *type) { if (soap_out_ns__subResponse(soap, tag ? tag : "ns:subResponse", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__subResponse * SOAP_FMAC4 soap_get_ns__subResponse(struct soap *soap, struct ns__subResponse *p, const char *tag, const char *type) { if ((p = soap_in_ns__subResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__add(struct soap *soap, struct ns__add *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_double(soap, &a->a); soap_default_double(soap, &a->b); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__add(struct soap *soap, const struct ns__add *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_embedded(soap, &a->a, SOAP_TYPE_double); soap_embedded(soap, &a->b, SOAP_TYPE_double); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__add(struct soap *soap, const char *tag, int id, const struct ns__add *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__add), type)) return soap->error; if (soap_out_double(soap, "a", -1, &a->a, "")) return soap->error; if (soap_out_double(soap, "b", -1, &a->b, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__add * SOAP_FMAC4 soap_in_ns__add(struct soap *soap, const char *tag, struct ns__add *a, const char *type) { size_t soap_flag_a = 1; size_t soap_flag_b = 1; if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct ns__add*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__add, sizeof(struct ns__add), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__add(soap, a); if (soap->body && *soap->href != '#') { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_a && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_double(soap, "a", &a->a, "xsd:double")) { soap_flag_a--; continue; } } if (soap_flag_b && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_double(soap, "b", &a->b, "xsd:double")) { soap_flag_b--; 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; if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_a > 0 || soap_flag_b > 0)) { soap->error = SOAP_OCCURS; return NULL; } } else if ((soap->mode & SOAP_XML_STRICT) && *soap->href != '#') { soap->error = SOAP_OCCURS; return NULL; } else { a = (struct ns__add *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__add, SOAP_TYPE_ns__add, sizeof(struct ns__add), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__add * SOAP_FMAC2 soap_instantiate_ns__add(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__add(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__add *p; size_t k = sizeof(struct ns__add); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_ns__add, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct ns__add); } else { p = SOAP_NEW_ARRAY(soap, struct ns__add, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__add location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__add(struct soap *soap, const struct ns__add *a, const char *tag, const char *type) { if (soap_out_ns__add(soap, tag ? tag : "ns:add", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__add * SOAP_FMAC4 soap_get_ns__add(struct soap *soap, struct ns__add *p, const char *tag, const char *type) { if ((p = soap_in_ns__add(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__addResponse(struct soap *soap, struct ns__addResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->result = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__addResponse(struct soap *soap, const struct ns__addResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_serialize_PointerTodouble(soap, &a->result); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__addResponse(struct soap *soap, const char *tag, int id, const struct ns__addResponse *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__addResponse), type)) return soap->error; if (soap_out_PointerTodouble(soap, "result", -1, &a->result, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__addResponse * SOAP_FMAC4 soap_in_ns__addResponse(struct soap *soap, const char *tag, struct ns__addResponse *a, const char *type) { size_t soap_flag_result = 1; if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct ns__addResponse*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__addResponse, sizeof(struct ns__addResponse), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__addResponse(soap, a); if (soap->body && *soap->href != '#') { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_PointerTodouble(soap, "result", &a->result, "xsd:double")) { soap_flag_result--; 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 ns__addResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__addResponse, SOAP_TYPE_ns__addResponse, sizeof(struct ns__addResponse), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__addResponse * SOAP_FMAC2 soap_instantiate_ns__addResponse(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__addResponse(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__addResponse *p; size_t k = sizeof(struct ns__addResponse); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_ns__addResponse, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct ns__addResponse); } else { p = SOAP_NEW_ARRAY(soap, struct ns__addResponse, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__addResponse location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__addResponse(struct soap *soap, const struct ns__addResponse *a, const char *tag, const char *type) { if (soap_out_ns__addResponse(soap, tag ? tag : "ns:addResponse", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__addResponse * SOAP_FMAC4 soap_get_ns__addResponse(struct soap *soap, struct ns__addResponse *p, const char *tag, const char *type) { if ((p = soap_in_ns__addResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *const*a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF if (!soap_reference(soap, *a, SOAP_TYPE_SOAP_ENV__Reason)) soap_serialize_SOAP_ENV__Reason(soap, *a); #endif } 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, NULL); 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_in_PointerToSOAP_ENV__Reason(struct soap *soap, const char *tag, struct SOAP_ENV__Reason **a, const char *type) { (void)type; /* appease -Wall -Werror */ 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, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return 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) { if (soap_out_PointerToSOAP_ENV__Reason(soap, tag ? tag : "SOAP-ENV:Reason", -2, a, type)) return soap->error; return soap_putindependent(soap); } 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; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *const*a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF if (!soap_reference(soap, *a, SOAP_TYPE_SOAP_ENV__Detail)) soap_serialize_SOAP_ENV__Detail(soap, *a); #endif } 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, NULL); 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_in_PointerToSOAP_ENV__Detail(struct soap *soap, const char *tag, struct SOAP_ENV__Detail **a, const char *type) { (void)type; /* appease -Wall -Werror */ 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, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return 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) { if (soap_out_PointerToSOAP_ENV__Detail(soap, tag ? tag : "SOAP-ENV:Detail", -2, a, type)) return soap->error; return soap_putindependent(soap); } 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; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *const*a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF if (!soap_reference(soap, *a, SOAP_TYPE_SOAP_ENV__Code)) soap_serialize_SOAP_ENV__Code(soap, *a); #endif } 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) { char *mark; id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_SOAP_ENV__Code, &mark); if (id < 0) return soap->error; (void)soap_out_SOAP_ENV__Code(soap, tag, id, *a, type); soap_unmark(soap, mark); return soap->error; } 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) { (void)type; /* appease -Wall -Werror */ 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, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return 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) { if (soap_out_PointerToSOAP_ENV__Code(soap, tag ? tag : "SOAP-ENV:Code", -2, a, type)) return soap->error; return soap_putindependent(soap); } 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; } #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTodouble(struct soap *soap, double *const*a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF (void)soap_reference(soap, *a, SOAP_TYPE_double); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTodouble(struct soap *soap, const char *tag, int id, double *const*a, const char *type) { id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_double, NULL); if (id < 0) return soap->error; return soap_out_double(soap, tag, id, *a, type); } SOAP_FMAC3 double ** SOAP_FMAC4 soap_in_PointerTodouble(struct soap *soap, const char *tag, double **a, const char *type) { (void)type; /* appease -Wall -Werror */ if (soap_element_begin_in(soap, tag, 1, NULL)) return NULL; if (!a) if (!(a = (double **)soap_malloc(soap, sizeof(double *)))) return NULL; *a = NULL; if (!soap->null && *soap->href != '#') { soap_revert(soap); if (!(*a = soap_in_double(soap, tag, *a, type))) return NULL; } else { a = (double **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_double, sizeof(double), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTodouble(struct soap *soap, double *const*a, const char *tag, const char *type) { if (soap_out_PointerTodouble(soap, tag ? tag : "double", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 double ** SOAP_FMAC4 soap_get_PointerTodouble(struct soap *soap, double **p, const char *tag, const char *type) { if ((p = soap_in_PointerTodouble(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__QName(struct soap *soap, char *const*a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF (void)soap_reference(soap, *a, SOAP_TYPE__QName); #endif } 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_in__QName(struct soap *soap, const char *tag, char **a, const char *type) { a = soap_instring(soap, tag, a, type, SOAP_TYPE__QName, 2, 0, -1, NULL); return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put__QName(struct soap *soap, char *const*a, const char *tag, const char *type) { if (soap_out__QName(soap, tag ? tag : "QName", -2, a, type)) return soap->error; return soap_putindependent(soap); } 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 void SOAP_FMAC4 soap_serialize_string(struct soap *soap, char *const*a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF (void)soap_reference(soap, *a, SOAP_TYPE_string); #endif } 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_in_string(struct soap *soap, const char *tag, char **a, const char *type) { a = soap_instring(soap, tag, a, type, SOAP_TYPE_string, 1, 0, -1, NULL); return a; } SOAP_FMAC3 char * * SOAP_FMAC4 soap_new_string(struct soap *soap, int n) { char * *a = static_cast(soap_malloc(soap, (n = (n < 0 ? 1 : n)) * sizeof(char *))); for (char * *p = a; p && n--; ++p) soap_default_string(soap, p); return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_string(struct soap *soap, char *const*a, const char *tag, const char *type) { if (soap_out_string(soap, tag ? tag : "string", -2, a, type)) return soap->error; return soap_putindependent(soap); } 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; } #if defined(__BORLANDC__) #pragma option pop #pragma option pop #endif /* End of soapC.cpp */ gsoap-2.8.91/gsoap/samples/calc_vs2005/calc_vs2005/soapStub.h0000644000175000017500000004572213525245162022673 0ustar ellertellert/* soapStub.h Generated by gSOAP 2.8.91 for calc.h gSOAP XML Web services tools Copyright (C) 2000-2018, Robert van Engelen, Genivia Inc. All Rights Reserved. The soapcpp2 tool and its generated software are released under the GPL. 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 soapStub_H #define soapStub_H #include "stdsoap2.h" #if GSOAP_VERSION != 20891 # error "GSOAP VERSION 20891 MISMATCH IN GENERATED CODE VERSUS LIBRARY CODE: PLEASE REINSTALL PACKAGE" #endif /******************************************************************************\ * * * Types with Custom Serializers * * * \******************************************************************************/ /******************************************************************************\ * * * Classes, Structs and Unions * * * \******************************************************************************/ struct ns__addResponse; /* calc.h:100 */ struct ns__add; /* calc.h:100 */ struct ns__subResponse; /* calc.h:103 */ struct ns__sub; /* calc.h:103 */ struct ns__mulResponse; /* calc.h:106 */ struct ns__mul; /* calc.h:106 */ struct ns__divResponse; /* calc.h:109 */ struct ns__div; /* calc.h:109 */ struct ns__powResponse; /* calc.h:112 */ struct ns__pow; /* calc.h:112 */ /* calc.h:100 */ #ifndef SOAP_TYPE_ns__addResponse #define SOAP_TYPE_ns__addResponse (10) /* complex XML schema type 'ns:addResponse': */ struct SOAP_CMAC ns__addResponse { public: /** Optional element 'result' of XML schema type 'xsd:double' */ double *result; public: /** Return unique type id SOAP_TYPE_ns__addResponse */ long soap_type() const { return SOAP_TYPE_ns__addResponse; } /** Constructor with member initializations */ ns__addResponse() : result() { } /** Friend allocator */ friend SOAP_FMAC1 ns__addResponse * SOAP_FMAC2 soap_instantiate_ns__addResponse(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:100 */ #ifndef SOAP_TYPE_ns__add #define SOAP_TYPE_ns__add (11) /* complex XML schema type 'ns:add': */ struct SOAP_CMAC ns__add { public: /** Required element 'a' of XML schema type 'xsd:double' */ double a; /** Required element 'b' of XML schema type 'xsd:double' */ double b; public: /** Return unique type id SOAP_TYPE_ns__add */ long soap_type() const { return SOAP_TYPE_ns__add; } /** Constructor with member initializations */ ns__add() : a(), b() { } /** Friend allocator */ friend SOAP_FMAC1 ns__add * SOAP_FMAC2 soap_instantiate_ns__add(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:103 */ #ifndef SOAP_TYPE_ns__subResponse #define SOAP_TYPE_ns__subResponse (13) /* complex XML schema type 'ns:subResponse': */ struct SOAP_CMAC ns__subResponse { public: /** Optional element 'result' of XML schema type 'xsd:double' */ double *result; public: /** Return unique type id SOAP_TYPE_ns__subResponse */ long soap_type() const { return SOAP_TYPE_ns__subResponse; } /** Constructor with member initializations */ ns__subResponse() : result() { } /** Friend allocator */ friend SOAP_FMAC1 ns__subResponse * SOAP_FMAC2 soap_instantiate_ns__subResponse(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:103 */ #ifndef SOAP_TYPE_ns__sub #define SOAP_TYPE_ns__sub (14) /* complex XML schema type 'ns:sub': */ struct SOAP_CMAC ns__sub { public: /** Required element 'a' of XML schema type 'xsd:double' */ double a; /** Required element 'b' of XML schema type 'xsd:double' */ double b; public: /** Return unique type id SOAP_TYPE_ns__sub */ long soap_type() const { return SOAP_TYPE_ns__sub; } /** Constructor with member initializations */ ns__sub() : a(), b() { } /** Friend allocator */ friend SOAP_FMAC1 ns__sub * SOAP_FMAC2 soap_instantiate_ns__sub(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:106 */ #ifndef SOAP_TYPE_ns__mulResponse #define SOAP_TYPE_ns__mulResponse (16) /* complex XML schema type 'ns:mulResponse': */ struct SOAP_CMAC ns__mulResponse { public: /** Optional element 'result' of XML schema type 'xsd:double' */ double *result; public: /** Return unique type id SOAP_TYPE_ns__mulResponse */ long soap_type() const { return SOAP_TYPE_ns__mulResponse; } /** Constructor with member initializations */ ns__mulResponse() : result() { } /** Friend allocator */ friend SOAP_FMAC1 ns__mulResponse * SOAP_FMAC2 soap_instantiate_ns__mulResponse(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:106 */ #ifndef SOAP_TYPE_ns__mul #define SOAP_TYPE_ns__mul (17) /* complex XML schema type 'ns:mul': */ struct SOAP_CMAC ns__mul { public: /** Required element 'a' of XML schema type 'xsd:double' */ double a; /** Required element 'b' of XML schema type 'xsd:double' */ double b; public: /** Return unique type id SOAP_TYPE_ns__mul */ long soap_type() const { return SOAP_TYPE_ns__mul; } /** Constructor with member initializations */ ns__mul() : a(), b() { } /** Friend allocator */ friend SOAP_FMAC1 ns__mul * SOAP_FMAC2 soap_instantiate_ns__mul(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:109 */ #ifndef SOAP_TYPE_ns__divResponse #define SOAP_TYPE_ns__divResponse (19) /* complex XML schema type 'ns:divResponse': */ struct SOAP_CMAC ns__divResponse { public: /** Optional element 'result' of XML schema type 'xsd:double' */ double *result; public: /** Return unique type id SOAP_TYPE_ns__divResponse */ long soap_type() const { return SOAP_TYPE_ns__divResponse; } /** Constructor with member initializations */ ns__divResponse() : result() { } /** Friend allocator */ friend SOAP_FMAC1 ns__divResponse * SOAP_FMAC2 soap_instantiate_ns__divResponse(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:109 */ #ifndef SOAP_TYPE_ns__div #define SOAP_TYPE_ns__div (20) /* complex XML schema type 'ns:div': */ struct SOAP_CMAC ns__div { public: /** Required element 'a' of XML schema type 'xsd:double' */ double a; /** Required element 'b' of XML schema type 'xsd:double' */ double b; public: /** Return unique type id SOAP_TYPE_ns__div */ long soap_type() const { return SOAP_TYPE_ns__div; } /** Constructor with member initializations */ ns__div() : a(), b() { } /** Friend allocator */ friend SOAP_FMAC1 ns__div * SOAP_FMAC2 soap_instantiate_ns__div(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:112 */ #ifndef SOAP_TYPE_ns__powResponse #define SOAP_TYPE_ns__powResponse (22) /* complex XML schema type 'ns:powResponse': */ struct SOAP_CMAC ns__powResponse { public: /** Optional element 'result' of XML schema type 'xsd:double' */ double *result; public: /** Return unique type id SOAP_TYPE_ns__powResponse */ long soap_type() const { return SOAP_TYPE_ns__powResponse; } /** Constructor with member initializations */ ns__powResponse() : result() { } /** Friend allocator */ friend SOAP_FMAC1 ns__powResponse * SOAP_FMAC2 soap_instantiate_ns__powResponse(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:112 */ #ifndef SOAP_TYPE_ns__pow #define SOAP_TYPE_ns__pow (23) /* complex XML schema type 'ns:pow': */ struct SOAP_CMAC ns__pow { public: /** Required element 'a' of XML schema type 'xsd:double' */ double a; /** Required element 'b' of XML schema type 'xsd:double' */ double b; public: /** Return unique type id SOAP_TYPE_ns__pow */ long soap_type() const { return SOAP_TYPE_ns__pow; } /** Constructor with member initializations */ ns__pow() : a(), b() { } /** Friend allocator */ friend SOAP_FMAC1 ns__pow * SOAP_FMAC2 soap_instantiate_ns__pow(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:113 */ #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Header #define SOAP_TYPE_SOAP_ENV__Header (24) /* SOAP_ENV__Header: */ struct SOAP_CMAC SOAP_ENV__Header { public: /** Return unique type id SOAP_TYPE_SOAP_ENV__Header */ long soap_type() const { return SOAP_TYPE_SOAP_ENV__Header; } /** Constructor with member initializations */ SOAP_ENV__Header() { } /** Friend allocator */ friend SOAP_FMAC1 SOAP_ENV__Header * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Header(struct soap*, int, const char*, const char*, size_t*); }; #endif #endif /* calc.h:113 */ #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Code #define SOAP_TYPE_SOAP_ENV__Code (25) /* Type SOAP_ENV__Code is a recursive data type, (in)directly referencing itself through its (base or derived class) members */ /* SOAP_ENV__Code: */ struct SOAP_CMAC SOAP_ENV__Code { public: /** Optional element 'SOAP-ENV:Value' of XML schema type 'xsd:QName' */ char *SOAP_ENV__Value; /** Optional element 'SOAP-ENV:Subcode' of XML schema type 'SOAP-ENV:Code' */ struct SOAP_ENV__Code *SOAP_ENV__Subcode; public: /** Return unique type id SOAP_TYPE_SOAP_ENV__Code */ long soap_type() const { return SOAP_TYPE_SOAP_ENV__Code; } /** Constructor with member initializations */ SOAP_ENV__Code() : SOAP_ENV__Value(), SOAP_ENV__Subcode() { } /** Friend allocator */ friend SOAP_FMAC1 SOAP_ENV__Code * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Code(struct soap*, int, const char*, const char*, size_t*); }; #endif #endif /* calc.h:113 */ #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Detail #define SOAP_TYPE_SOAP_ENV__Detail (27) /* SOAP_ENV__Detail: */ struct SOAP_CMAC SOAP_ENV__Detail { public: char *__any; /** Any type of element 'fault' assigned to fault with its SOAP_TYPE_ assigned to __type */ /** Do not create a cyclic data structure through this member unless SOAP encoding or SOAP_XML_GRAPH are used for id-ref serialization */ int __type; void *fault; public: /** Return unique type id SOAP_TYPE_SOAP_ENV__Detail */ long soap_type() const { return SOAP_TYPE_SOAP_ENV__Detail; } /** Constructor with member initializations */ SOAP_ENV__Detail() : __any(), __type(), fault() { } /** Friend allocator */ friend SOAP_FMAC1 SOAP_ENV__Detail * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Detail(struct soap*, int, const char*, const char*, size_t*); }; #endif #endif /* calc.h:113 */ #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Reason #define SOAP_TYPE_SOAP_ENV__Reason (30) /* SOAP_ENV__Reason: */ struct SOAP_CMAC SOAP_ENV__Reason { public: /** Optional element 'SOAP-ENV:Text' of XML schema type 'xsd:string' */ char *SOAP_ENV__Text; public: /** Return unique type id SOAP_TYPE_SOAP_ENV__Reason */ long soap_type() const { return SOAP_TYPE_SOAP_ENV__Reason; } /** Constructor with member initializations */ SOAP_ENV__Reason() : SOAP_ENV__Text() { } /** Friend allocator */ friend SOAP_FMAC1 SOAP_ENV__Reason * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Reason(struct soap*, int, const char*, const char*, size_t*); }; #endif #endif /* calc.h:113 */ #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Fault #define SOAP_TYPE_SOAP_ENV__Fault (31) /* SOAP_ENV__Fault: */ struct SOAP_CMAC SOAP_ENV__Fault { public: /** Optional element 'faultcode' of XML schema type 'xsd:QName' */ char *faultcode; /** Optional element 'faultstring' of XML schema type 'xsd:string' */ char *faultstring; /** Optional element 'faultactor' of XML schema type 'xsd:string' */ char *faultactor; /** Optional element 'detail' of XML schema type 'SOAP-ENV:Detail' */ struct SOAP_ENV__Detail *detail; /** Optional element 'SOAP-ENV:Code' of XML schema type 'SOAP-ENV:Code' */ struct SOAP_ENV__Code *SOAP_ENV__Code; /** Optional element 'SOAP-ENV:Reason' of XML schema type 'SOAP-ENV:Reason' */ struct SOAP_ENV__Reason *SOAP_ENV__Reason; /** Optional element 'SOAP-ENV:Node' of XML schema type 'xsd:string' */ char *SOAP_ENV__Node; /** Optional element 'SOAP-ENV:Role' of XML schema type 'xsd:string' */ char *SOAP_ENV__Role; /** Optional element 'SOAP-ENV:Detail' of XML schema type 'SOAP-ENV:Detail' */ struct SOAP_ENV__Detail *SOAP_ENV__Detail; public: /** Return unique type id SOAP_TYPE_SOAP_ENV__Fault */ long soap_type() const { return SOAP_TYPE_SOAP_ENV__Fault; } /** Constructor with member initializations */ SOAP_ENV__Fault() : faultcode(), faultstring(), faultactor(), detail(), SOAP_ENV__Code(), SOAP_ENV__Reason(), SOAP_ENV__Node(), SOAP_ENV__Role(), SOAP_ENV__Detail() { } /** Friend allocator */ friend SOAP_FMAC1 SOAP_ENV__Fault * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Fault(struct soap*, int, const char*, const char*, size_t*); }; #endif #endif /******************************************************************************\ * * * Typedefs * * * \******************************************************************************/ /* (built-in):0 */ #ifndef SOAP_TYPE__XML #define SOAP_TYPE__XML (5) typedef char *_XML; #endif /* (built-in):0 */ #ifndef SOAP_TYPE__QName #define SOAP_TYPE__QName (6) typedef char *_QName; #endif /******************************************************************************\ * * * Serializable Types * * * \******************************************************************************/ /* char has binding name 'byte' for type 'xsd:byte' */ #ifndef SOAP_TYPE_byte #define SOAP_TYPE_byte (3) #endif /* int has binding name 'int' for type 'xsd:int' */ #ifndef SOAP_TYPE_int #define SOAP_TYPE_int (1) #endif /* double has binding name 'double' for type 'xsd:double' */ #ifndef SOAP_TYPE_double #define SOAP_TYPE_double (7) #endif /* struct SOAP_ENV__Fault has binding name 'SOAP_ENV__Fault' for type '' */ #ifndef SOAP_TYPE_SOAP_ENV__Fault #define SOAP_TYPE_SOAP_ENV__Fault (31) #endif /* struct SOAP_ENV__Reason has binding name 'SOAP_ENV__Reason' for type '' */ #ifndef SOAP_TYPE_SOAP_ENV__Reason #define SOAP_TYPE_SOAP_ENV__Reason (30) #endif /* struct SOAP_ENV__Detail has binding name 'SOAP_ENV__Detail' for type '' */ #ifndef SOAP_TYPE_SOAP_ENV__Detail #define SOAP_TYPE_SOAP_ENV__Detail (27) #endif /* struct SOAP_ENV__Code has binding name 'SOAP_ENV__Code' for type '' */ #ifndef SOAP_TYPE_SOAP_ENV__Code #define SOAP_TYPE_SOAP_ENV__Code (25) #endif /* struct SOAP_ENV__Header has binding name 'SOAP_ENV__Header' for type '' */ #ifndef SOAP_TYPE_SOAP_ENV__Header #define SOAP_TYPE_SOAP_ENV__Header (24) #endif /* struct ns__pow has binding name 'ns__pow' for type 'ns:pow' */ #ifndef SOAP_TYPE_ns__pow #define SOAP_TYPE_ns__pow (23) #endif /* struct ns__powResponse has binding name 'ns__powResponse' for type 'ns:powResponse' */ #ifndef SOAP_TYPE_ns__powResponse #define SOAP_TYPE_ns__powResponse (22) #endif /* struct ns__div has binding name 'ns__div' for type 'ns:div' */ #ifndef SOAP_TYPE_ns__div #define SOAP_TYPE_ns__div (20) #endif /* struct ns__divResponse has binding name 'ns__divResponse' for type 'ns:divResponse' */ #ifndef SOAP_TYPE_ns__divResponse #define SOAP_TYPE_ns__divResponse (19) #endif /* struct ns__mul has binding name 'ns__mul' for type 'ns:mul' */ #ifndef SOAP_TYPE_ns__mul #define SOAP_TYPE_ns__mul (17) #endif /* struct ns__mulResponse has binding name 'ns__mulResponse' for type 'ns:mulResponse' */ #ifndef SOAP_TYPE_ns__mulResponse #define SOAP_TYPE_ns__mulResponse (16) #endif /* struct ns__sub has binding name 'ns__sub' for type 'ns:sub' */ #ifndef SOAP_TYPE_ns__sub #define SOAP_TYPE_ns__sub (14) #endif /* struct ns__subResponse has binding name 'ns__subResponse' for type 'ns:subResponse' */ #ifndef SOAP_TYPE_ns__subResponse #define SOAP_TYPE_ns__subResponse (13) #endif /* struct ns__add has binding name 'ns__add' for type 'ns:add' */ #ifndef SOAP_TYPE_ns__add #define SOAP_TYPE_ns__add (11) #endif /* struct ns__addResponse has binding name 'ns__addResponse' for type 'ns:addResponse' */ #ifndef SOAP_TYPE_ns__addResponse #define SOAP_TYPE_ns__addResponse (10) #endif /* struct SOAP_ENV__Reason * has binding name 'PointerToSOAP_ENV__Reason' for type '' */ #ifndef SOAP_TYPE_PointerToSOAP_ENV__Reason #define SOAP_TYPE_PointerToSOAP_ENV__Reason (33) #endif /* struct SOAP_ENV__Detail * has binding name 'PointerToSOAP_ENV__Detail' for type '' */ #ifndef SOAP_TYPE_PointerToSOAP_ENV__Detail #define SOAP_TYPE_PointerToSOAP_ENV__Detail (32) #endif /* struct SOAP_ENV__Code * has binding name 'PointerToSOAP_ENV__Code' for type '' */ #ifndef SOAP_TYPE_PointerToSOAP_ENV__Code #define SOAP_TYPE_PointerToSOAP_ENV__Code (26) #endif /* double * has binding name 'PointerTodouble' for type 'xsd:double' */ #ifndef SOAP_TYPE_PointerTodouble #define SOAP_TYPE_PointerTodouble (8) #endif /* _QName has binding name '_QName' for type 'xsd:QName' */ #ifndef SOAP_TYPE__QName #define SOAP_TYPE__QName (6) #endif /* _XML has binding name '_XML' for type '' */ #ifndef SOAP_TYPE__XML #define SOAP_TYPE__XML (5) #endif /* char * has binding name 'string' for type 'xsd:string' */ #ifndef SOAP_TYPE_string #define SOAP_TYPE_string (4) #endif /******************************************************************************\ * * * Externals * * * \******************************************************************************/ #endif /* End of soapStub.h */ gsoap-2.8.91/gsoap/samples/calc_vs2005/calc_vs2005/soapcalcProxy.cpp0000644000175000017500000003356213525245162024254 0ustar ellertellert/* soapcalcProxy.cpp Generated by gSOAP 2.8.91 for calc.h gSOAP XML Web services tools Copyright (C) 2000-2018, Robert van Engelen, Genivia Inc. All Rights Reserved. The soapcpp2 tool and its generated software are released under the GPL. 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 "soapcalcProxy.h" calcProxy::calcProxy() : soap(SOAP_IO_DEFAULT) { calcProxy_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); } calcProxy::calcProxy(const calcProxy& rhs) { soap_copy_context(this, &rhs); this->soap_endpoint = rhs.soap_endpoint; } calcProxy::calcProxy(const struct soap &_soap) : soap(_soap) { } calcProxy::calcProxy(const struct soap &_soap, const char *soap_endpoint_url) : soap(_soap) { soap_endpoint = soap_endpoint_url; } calcProxy::calcProxy(const char *soap_endpoint_url) : soap(SOAP_IO_DEFAULT) { calcProxy_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); soap_endpoint = soap_endpoint_url; } calcProxy::calcProxy(soap_mode iomode) : soap(iomode) { calcProxy_init(iomode, iomode); } calcProxy::calcProxy(const char *soap_endpoint_url, soap_mode iomode) : soap(iomode) { calcProxy_init(iomode, iomode); soap_endpoint = soap_endpoint_url; } calcProxy::calcProxy(soap_mode imode, soap_mode omode) : soap(imode, omode) { calcProxy_init(imode, omode); } calcProxy::~calcProxy() { this->destroy(); } void calcProxy::calcProxy_init(soap_mode imode, soap_mode omode) { soap_imode(this, imode); soap_omode(this, omode); soap_endpoint = NULL; static const 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 }, { "ns", "urn:calc", NULL, NULL }, { NULL, NULL, NULL, NULL} }; soap_set_namespaces(this, namespaces); } calcProxy *calcProxy::copy() { calcProxy *dup = SOAP_NEW_UNMANAGED(calcProxy(*(struct soap*)this)); return dup; } calcProxy& calcProxy::operator=(const calcProxy& rhs) { soap_done(this); soap_copy_context(this, &rhs); this->soap_endpoint = rhs.soap_endpoint; return *this; } void calcProxy::destroy() { soap_destroy(this); soap_end(this); } void calcProxy::reset() { this->destroy(); soap_done(this); soap_initialize(this); calcProxy_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); } void calcProxy::soap_noheader() { this->header = NULL; } ::SOAP_ENV__Header *calcProxy::soap_header() { return this->header; } ::SOAP_ENV__Fault *calcProxy::soap_fault() { return this->fault; } const char *calcProxy::soap_fault_subcode() { return ::soap_fault_subcode(this); } const char *calcProxy::soap_fault_string() { return ::soap_fault_string(this); } const char *calcProxy::soap_fault_detail() { return ::soap_fault_detail(this); } int calcProxy::soap_close_socket() { return ::soap_closesock(this); } int calcProxy::soap_force_close_socket() { return ::soap_force_closesock(this); } void calcProxy::soap_print_fault(FILE *fd) { ::soap_print_fault(this, fd); } #ifndef WITH_LEAN #ifndef WITH_COMPAT void calcProxy::soap_stream_fault(std::ostream& os) { ::soap_stream_fault(this, os); } #endif char *calcProxy::soap_sprint_fault(char *buf, size_t len) { return ::soap_sprint_fault(this, buf, len); } #endif int calcProxy::send_add(const char *soap_endpoint_url, const char *soap_action, double a, double b) { struct soap *soap = this; struct ns__add soap_tmp_ns__add; if (soap_endpoint_url != NULL) soap_endpoint = soap_endpoint_url; if (soap_endpoint == NULL) soap_endpoint = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; soap_tmp_ns__add.a = a; soap_tmp_ns__add.b = b; soap_begin(soap); soap->encodingStyle = ""; /* use SOAP encoding style */ soap_serializeheader(soap); soap_serialize_ns__add(soap, &soap_tmp_ns__add); if (soap_begin_count(soap)) return soap->error; if ((soap->mode & SOAP_IO_LENGTH)) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__add(soap, &soap_tmp_ns__add, "ns:add", "") || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; } if (soap_end_count(soap)) return soap->error; if (soap_connect(soap, soap_endpoint, soap_action) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__add(soap, &soap_tmp_ns__add, "ns:add", "") || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } int calcProxy::recv_add(double *result) { struct soap *soap = this; struct ns__addResponse *soap_tmp_ns__addResponse; if (!result) return soap_closesock(soap); soap_default_double(soap, result); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) return soap_closesock(soap); if (soap_recv_fault(soap, 1)) return soap->error; soap_tmp_ns__addResponse = soap_get_ns__addResponse(soap, NULL, "", NULL); if (!soap_tmp_ns__addResponse || soap->error) return soap_recv_fault(soap, 0); if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap_closesock(soap); if (result && soap_tmp_ns__addResponse->result) *result = *soap_tmp_ns__addResponse->result; return soap_closesock(soap); } int calcProxy::send_sub(const char *soap_endpoint_url, const char *soap_action, double a, double b) { struct soap *soap = this; struct ns__sub soap_tmp_ns__sub; if (soap_endpoint_url != NULL) soap_endpoint = soap_endpoint_url; if (soap_endpoint == NULL) soap_endpoint = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; soap_tmp_ns__sub.a = a; soap_tmp_ns__sub.b = b; soap_begin(soap); soap->encodingStyle = ""; /* use SOAP encoding style */ soap_serializeheader(soap); soap_serialize_ns__sub(soap, &soap_tmp_ns__sub); if (soap_begin_count(soap)) return soap->error; if ((soap->mode & SOAP_IO_LENGTH)) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__sub(soap, &soap_tmp_ns__sub, "ns:sub", "") || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; } if (soap_end_count(soap)) return soap->error; if (soap_connect(soap, soap_endpoint, soap_action) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__sub(soap, &soap_tmp_ns__sub, "ns:sub", "") || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } int calcProxy::recv_sub(double *result) { struct soap *soap = this; struct ns__subResponse *soap_tmp_ns__subResponse; if (!result) return soap_closesock(soap); soap_default_double(soap, result); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) return soap_closesock(soap); if (soap_recv_fault(soap, 1)) return soap->error; soap_tmp_ns__subResponse = soap_get_ns__subResponse(soap, NULL, "", NULL); if (!soap_tmp_ns__subResponse || soap->error) return soap_recv_fault(soap, 0); if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap_closesock(soap); if (result && soap_tmp_ns__subResponse->result) *result = *soap_tmp_ns__subResponse->result; return soap_closesock(soap); } int calcProxy::send_mul(const char *soap_endpoint_url, const char *soap_action, double a, double b) { struct soap *soap = this; struct ns__mul soap_tmp_ns__mul; if (soap_endpoint_url != NULL) soap_endpoint = soap_endpoint_url; if (soap_endpoint == NULL) soap_endpoint = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; soap_tmp_ns__mul.a = a; soap_tmp_ns__mul.b = b; soap_begin(soap); soap->encodingStyle = ""; /* use SOAP encoding style */ soap_serializeheader(soap); soap_serialize_ns__mul(soap, &soap_tmp_ns__mul); if (soap_begin_count(soap)) return soap->error; if ((soap->mode & SOAP_IO_LENGTH)) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__mul(soap, &soap_tmp_ns__mul, "ns:mul", "") || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; } if (soap_end_count(soap)) return soap->error; if (soap_connect(soap, soap_endpoint, soap_action) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__mul(soap, &soap_tmp_ns__mul, "ns:mul", "") || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } int calcProxy::recv_mul(double *result) { struct soap *soap = this; struct ns__mulResponse *soap_tmp_ns__mulResponse; if (!result) return soap_closesock(soap); soap_default_double(soap, result); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) return soap_closesock(soap); if (soap_recv_fault(soap, 1)) return soap->error; soap_tmp_ns__mulResponse = soap_get_ns__mulResponse(soap, NULL, "", NULL); if (!soap_tmp_ns__mulResponse || soap->error) return soap_recv_fault(soap, 0); if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap_closesock(soap); if (result && soap_tmp_ns__mulResponse->result) *result = *soap_tmp_ns__mulResponse->result; return soap_closesock(soap); } int calcProxy::send_div(const char *soap_endpoint_url, const char *soap_action, double a, double b) { struct soap *soap = this; struct ns__div soap_tmp_ns__div; if (soap_endpoint_url != NULL) soap_endpoint = soap_endpoint_url; if (soap_endpoint == NULL) soap_endpoint = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; soap_tmp_ns__div.a = a; soap_tmp_ns__div.b = b; soap_begin(soap); soap->encodingStyle = ""; /* use SOAP encoding style */ soap_serializeheader(soap); soap_serialize_ns__div(soap, &soap_tmp_ns__div); if (soap_begin_count(soap)) return soap->error; if ((soap->mode & SOAP_IO_LENGTH)) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__div(soap, &soap_tmp_ns__div, "ns:div", "") || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; } if (soap_end_count(soap)) return soap->error; if (soap_connect(soap, soap_endpoint, soap_action) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__div(soap, &soap_tmp_ns__div, "ns:div", "") || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } int calcProxy::recv_div(double *result) { struct soap *soap = this; struct ns__divResponse *soap_tmp_ns__divResponse; if (!result) return soap_closesock(soap); soap_default_double(soap, result); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) return soap_closesock(soap); if (soap_recv_fault(soap, 1)) return soap->error; soap_tmp_ns__divResponse = soap_get_ns__divResponse(soap, NULL, "", NULL); if (!soap_tmp_ns__divResponse || soap->error) return soap_recv_fault(soap, 0); if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap_closesock(soap); if (result && soap_tmp_ns__divResponse->result) *result = *soap_tmp_ns__divResponse->result; return soap_closesock(soap); } int calcProxy::send_pow(const char *soap_endpoint_url, const char *soap_action, double a, double b) { struct soap *soap = this; struct ns__pow soap_tmp_ns__pow; if (soap_endpoint_url != NULL) soap_endpoint = soap_endpoint_url; if (soap_endpoint == NULL) soap_endpoint = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; soap_tmp_ns__pow.a = a; soap_tmp_ns__pow.b = b; soap_begin(soap); soap->encodingStyle = ""; /* use SOAP encoding style */ soap_serializeheader(soap); soap_serialize_ns__pow(soap, &soap_tmp_ns__pow); if (soap_begin_count(soap)) return soap->error; if ((soap->mode & SOAP_IO_LENGTH)) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__pow(soap, &soap_tmp_ns__pow, "ns:pow", "") || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; } if (soap_end_count(soap)) return soap->error; if (soap_connect(soap, soap_endpoint, soap_action) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__pow(soap, &soap_tmp_ns__pow, "ns:pow", "") || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } int calcProxy::recv_pow(double *result) { struct soap *soap = this; struct ns__powResponse *soap_tmp_ns__powResponse; if (!result) return soap_closesock(soap); soap_default_double(soap, result); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) return soap_closesock(soap); if (soap_recv_fault(soap, 1)) return soap->error; soap_tmp_ns__powResponse = soap_get_ns__powResponse(soap, NULL, "", NULL); if (!soap_tmp_ns__powResponse || soap->error) return soap_recv_fault(soap, 0); if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap_closesock(soap); if (result && soap_tmp_ns__powResponse->result) *result = *soap_tmp_ns__powResponse->result; return soap_closesock(soap); } /* End of client proxy code */ gsoap-2.8.91/gsoap/samples/calc_vs2005/calc_vs2005/soapcalcProxy.h0000644000175000017500000002166413525245162023721 0ustar ellertellert/* soapcalcProxy.h Generated by gSOAP 2.8.91 for calc.h gSOAP XML Web services tools Copyright (C) 2000-2018, Robert van Engelen, Genivia Inc. All Rights Reserved. The soapcpp2 tool and its generated software are released under the GPL. 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 soapcalcProxy_H #define soapcalcProxy_H #include "soapH.h" class SOAP_CMAC calcProxy : public soap { public: /// Endpoint URL of service 'calcProxy' (change as needed) const char *soap_endpoint; /// Variables globally declared in calc.h, if any /// Construct a proxy with new managing context calcProxy(); /// Copy constructor calcProxy(const calcProxy& rhs); /// Construct proxy given a managing context calcProxy(const struct soap&); /// Construct proxy given a managing context and endpoint URL calcProxy(const struct soap&, const char *soap_endpoint_url); /// Constructor taking an endpoint URL calcProxy(const char *soap_endpoint_url); /// Constructor taking input and output mode flags for the new managing context calcProxy(soap_mode iomode); /// Constructor taking endpoint URL and input and output mode flags for the new managing context calcProxy(const char *soap_endpoint_url, soap_mode iomode); /// Constructor taking input and output mode flags for the new managing context calcProxy(soap_mode imode, soap_mode omode); /// Destructor deletes deserialized data and its managing context virtual ~calcProxy(); /// Initializer used by constructors virtual void calcProxy_init(soap_mode imode, soap_mode omode); /// Return a copy that has a new managing context with the same engine state virtual calcProxy *copy(); /// Copy assignment calcProxy& operator=(const calcProxy&); /// Delete all deserialized data (uses soap_destroy() and soap_end()) virtual void destroy(); /// Delete all deserialized data and reset to default virtual void reset(); /// Disables and removes SOAP Header from message by setting soap->header = NULL virtual void soap_noheader(); /// Get SOAP Header structure (i.e. soap->header, which is NULL when absent) virtual ::SOAP_ENV__Header *soap_header(); /// Get SOAP Fault structure (i.e. soap->fault, which is NULL when absent) virtual ::SOAP_ENV__Fault *soap_fault(); /// Get SOAP Fault subcode QName string (NULL when absent) virtual const char *soap_fault_subcode(); /// Get SOAP Fault string/reason (NULL when absent) virtual const char *soap_fault_string(); /// Get SOAP Fault detail XML string (NULL when absent) virtual const char *soap_fault_detail(); /// Close connection (normally automatic, except for send_X ops) virtual int soap_close_socket(); /// Force close connection (can kill a thread blocked on IO) virtual int soap_force_close_socket(); /// Print fault virtual void soap_print_fault(FILE*); #ifndef WITH_LEAN #ifndef WITH_COMPAT /// Print fault to stream virtual void soap_stream_fault(std::ostream&); #endif /// Write fault to buffer virtual char *soap_sprint_fault(char *buf, size_t len); #endif // /// Web service synchronous operation 'add' with default endpoint and default SOAP Action header, returns SOAP_OK or error code virtual int add(double a, double b, double *result) { return this->add(NULL, NULL, a, b, result); } /// Web service synchronous operation 'add' to the specified endpoint and SOAP Action header, returns SOAP_OK or error code virtual int add(const char *soap_endpoint_url, const char *soap_action, double a, double b, double *result) { return this->send_add(soap_endpoint_url, soap_action, a, b) || this->recv_add(result) ? this->error : SOAP_OK; } /// Web service asynchronous operation 'send_add' to send a request message to the specified endpoint and SOAP Action header, returns SOAP_OK or error code virtual int send_add(const char *soap_endpoint_url, const char *soap_action, double a, double b); /// Web service asynchronous operation 'recv_add' to receive a response message from the connected endpoint, returns SOAP_OK or error code virtual int recv_add(double *result); // /// Web service synchronous operation 'sub' with default endpoint and default SOAP Action header, returns SOAP_OK or error code virtual int sub(double a, double b, double *result) { return this->sub(NULL, NULL, a, b, result); } /// Web service synchronous operation 'sub' to the specified endpoint and SOAP Action header, returns SOAP_OK or error code virtual int sub(const char *soap_endpoint_url, const char *soap_action, double a, double b, double *result) { return this->send_sub(soap_endpoint_url, soap_action, a, b) || this->recv_sub(result) ? this->error : SOAP_OK; } /// Web service asynchronous operation 'send_sub' to send a request message to the specified endpoint and SOAP Action header, returns SOAP_OK or error code virtual int send_sub(const char *soap_endpoint_url, const char *soap_action, double a, double b); /// Web service asynchronous operation 'recv_sub' to receive a response message from the connected endpoint, returns SOAP_OK or error code virtual int recv_sub(double *result); // /// Web service synchronous operation 'mul' with default endpoint and default SOAP Action header, returns SOAP_OK or error code virtual int mul(double a, double b, double *result) { return this->mul(NULL, NULL, a, b, result); } /// Web service synchronous operation 'mul' to the specified endpoint and SOAP Action header, returns SOAP_OK or error code virtual int mul(const char *soap_endpoint_url, const char *soap_action, double a, double b, double *result) { return this->send_mul(soap_endpoint_url, soap_action, a, b) || this->recv_mul(result) ? this->error : SOAP_OK; } /// Web service asynchronous operation 'send_mul' to send a request message to the specified endpoint and SOAP Action header, returns SOAP_OK or error code virtual int send_mul(const char *soap_endpoint_url, const char *soap_action, double a, double b); /// Web service asynchronous operation 'recv_mul' to receive a response message from the connected endpoint, returns SOAP_OK or error code virtual int recv_mul(double *result); // /// Web service synchronous operation 'div' with default endpoint and default SOAP Action header, returns SOAP_OK or error code virtual int div(double a, double b, double *result) { return this->div(NULL, NULL, a, b, result); } /// Web service synchronous operation 'div' to the specified endpoint and SOAP Action header, returns SOAP_OK or error code virtual int div(const char *soap_endpoint_url, const char *soap_action, double a, double b, double *result) { return this->send_div(soap_endpoint_url, soap_action, a, b) || this->recv_div(result) ? this->error : SOAP_OK; } /// Web service asynchronous operation 'send_div' to send a request message to the specified endpoint and SOAP Action header, returns SOAP_OK or error code virtual int send_div(const char *soap_endpoint_url, const char *soap_action, double a, double b); /// Web service asynchronous operation 'recv_div' to receive a response message from the connected endpoint, returns SOAP_OK or error code virtual int recv_div(double *result); // /// Web service synchronous operation 'pow' with default endpoint and default SOAP Action header, returns SOAP_OK or error code virtual int pow(double a, double b, double *result) { return this->pow(NULL, NULL, a, b, result); } /// Web service synchronous operation 'pow' to the specified endpoint and SOAP Action header, returns SOAP_OK or error code virtual int pow(const char *soap_endpoint_url, const char *soap_action, double a, double b, double *result) { return this->send_pow(soap_endpoint_url, soap_action, a, b) || this->recv_pow(result) ? this->error : SOAP_OK; } /// Web service asynchronous operation 'send_pow' to send a request message to the specified endpoint and SOAP Action header, returns SOAP_OK or error code virtual int send_pow(const char *soap_endpoint_url, const char *soap_action, double a, double b); /// Web service asynchronous operation 'recv_pow' to receive a response message from the connected endpoint, returns SOAP_OK or error code virtual int recv_pow(double *result); }; #endif gsoap-2.8.91/gsoap/samples/calc_vs2005/calc_vs2005/Debug/0000755000175000017500000000000013525245162021736 5ustar ellertellertgsoap-2.8.91/gsoap/samples/calc_vs2005/calc_vs2005/calc.nsmap0000644000175000017500000000122113525245162022646 0ustar ellertellert #include "stdsoap2.h" /* This defines the global XML namespaces[] table to #include and compile */ 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 }, { "ns", "urn:calc", NULL, NULL }, { NULL, NULL, NULL, NULL} }; gsoap-2.8.91/gsoap/samples/calc_vs2005/calc_vs2005/calc.h0000644000175000017500000001054613525245162021771 0ustar ellertellert/* calc.h This is a gSOAP header file with a calculator data binding and Web service interface to implement clients and services The service operations and type definitions use familiar C/C++ syntax. The following methods are defined by this gSOAP service definition: add(a,b) sub(a,b) mul(a,b) div(a,b) pow(a,b) Build steps for C (see samples/calc): $ soapcpp2 -c -r calc.h $ cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c $ cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c Build steps for C++ (see samples/calc++): $ soapcpp2 -j -r calc.h $ c++ -o calcclient++ calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp $ c++ -o calcserver++ calcserver.cpp stdsoap2.cpp soapC.cpp soapcalcService.cpp Option -r generates a soapReadme.md report. Note that soapcpp2 option -j generates proxy and service classes, which encapsulate the method operations in the class instead of defining them as global functions as in C. The //gsoap directives are used to bind XML namespaces and to define Web service properties: //gsoap service name: //gsoap service style: [rpc|document] //gsoap service encoding: [literal|encoded] //gsoap service namespace: //gsoap service location: Web service operation properties: //gsoap service method-style: [rpc|document] //gsoap service method-encoding: [literal|encoded] //gsoap service method-action: //gsoap service method-documentation: and type schema properties: //gsoap schema namespace: //gsoap schema elementForm: [qualified|unqualified] //gsoap schema attributeForm: [qualified|unqualified] //gsoap schema documentation: //gsoap schema type-documentation: where is an XML namespace prefix, which is used in C/C++ operation names, e.g. ns__add(), and type names, e.g. xsd__int. See the documentation for the full list of //gsoap directives. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: calc Simple calculator service described at https://www.genivia.com/dev.html //gsoap ns service protocol: SOAP //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns schema namespace: urn:calc //gsoap ns service method: add Sums two values int ns__add(double a, double b, double *result); //gsoap ns service method: sub Subtracts two values int ns__sub(double a, double b, double *result); //gsoap ns service method: mul Multiplies two values int ns__mul(double a, double b, double *result); //gsoap ns service method: div Divides two values int ns__div(double a, double b, double *result); //gsoap ns service method: pow Raises a to b int ns__pow(double a, double b, double *result); gsoap-2.8.91/gsoap/samples/calc_vs2005/calc_vs2005/calcclient.cpp0000644000175000017500000000520013525245162023512 0ustar ellertellert/* calcclient.cpp Example calculator service client in C++ Service definitions in calc.h (not generated by wsdl2h, but similar) $ soapcpp2 -i calc.h $ c++ -o calcclient calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp where stdsoap2.cpp is in the 'gsoap' directory, or use libgsoap++: $ c++ -o calcclient calcclient.cpp soapC.cpp soapcalcProxy.cpp -lgsoap++ -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapcalcProxy.h" #include "calc.nsmap" const char server[] = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; int main(int argc, char **argv) { if (argc < 4) { fprintf(stderr, "Usage: [add|sub|mul|div|pow] num num\n"); exit(0); } double a, b, result; a = strtod(argv[2], NULL); b = strtod(argv[3], NULL); calcProxy calc; calc.soap_endpoint = server; switch (*argv[1]) { case 'a': calc.add(a, b, &result); break; case 's': calc.sub(a, b, &result); break; case 'm': calc.mul(a, b, &result); break; case 'd': calc.div(a, b, &result); break; case 'p': calc.pow(a, b, &result); break; default: fprintf(stderr, "Unknown command\n"); exit(0); } if (calc.error) calc.soap_stream_fault(std::cerr); else printf("result = %g\n", result); calc.destroy(); /* clean up mem */ return 0; } gsoap-2.8.91/gsoap/samples/calc_vs2005/calc_vs2005/stdsoap2.cpp0000644000175000017500000233054313525245162023165 0ustar ellertellert/* stdsoap2.c[pp] 2.8.91 gSOAP runtime engine gSOAP XML Web services tools Copyright (C) 2000-2019, 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 addition licensed under the gSOAP public license: - vxWorks compatible, enabled with compiler option -DVXWORKS -------------------------------------------------------------------------------- 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-2019, 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 -------------------------------------------------------------------------------- */ #define GSOAP_LIB_VERSION 20891 #ifdef AS400 # pragma convert(819) /* EBCDIC to ASCII */ #endif #if defined(__gnu_linux__) && !defined(_GNU_SOURCE) # define _GNU_SOURCE 1 #endif #include "stdsoap2.h" #if GSOAP_VERSION != GSOAP_LIB_VERSION # error "GSOAP VERSION MISMATCH IN LIBRARY: PLEASE REINSTALL PACKAGE" #endif #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) # include /* vxWorks compatible */ #endif #ifdef __BORLANDC__ # pragma warn -8060 #else # ifdef WIN32 # ifdef UNDER_CE # pragma comment(lib, "ws2.lib") /* WinCE */ # else # pragma comment(lib, "Ws2_32.lib") # endif # pragma warning(disable : 4996) /* disable deprecation warnings */ # endif #endif #ifdef __cplusplus SOAP_SOURCE_STAMP("@(#) stdsoap2.cpp ver 2.8.91 2019-08-15 00:00:00 GMT") extern "C" { #else SOAP_SOURCE_STAMP("@(#) stdsoap2.c ver 2.8.91 2019-08-15 00:00:00 GMT") #endif /* 8bit character representing unknown character entity or multibyte data */ #ifndef SOAP_UNKNOWN_CHAR # define SOAP_UNKNOWN_CHAR (0x7F) #endif /* unicode character representing unknown characters outside the XML 1.0 UTF8 unicode space */ #ifdef WITH_REPLACE_ILLEGAL_UTF8 # ifndef SOAP_UNKNOWN_UNICODE_CHAR # define SOAP_UNKNOWN_UNICODE_CHAR (0xFFFD) # endif #endif /* EOF=-1 */ #define SOAP_LT (soap_wchar)(-2) /* XML-specific '<' */ #define SOAP_TT (soap_wchar)(-3) /* XML-specific '' */ #define SOAP_QT (soap_wchar)(-5) /* XML-specific '"' */ #define SOAP_AP (soap_wchar)(-6) /* XML-specific ''' */ #define soap_coblank(c) ((c)+1 > 0 && (c) <= 32) #if defined(WIN32) && !defined(UNDER_CE) #define soap_hash_ptr(p) ((size_t)((PtrToUlong(p) >> 3) & (SOAP_PTRHASH - 1))) #else #define soap_hash_ptr(p) ((size_t)(((unsigned long)(p) >> 3) & (SOAP_PTRHASH-1))) #endif #ifdef SOAP_DEBUG static void soap_init_logs(struct soap*); 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 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); static void soap_version(struct soap*); static void soap_free_ns(struct soap*); static soap_wchar soap_char(struct soap*); static soap_wchar soap_getpi(struct soap*); static int soap_isxdigit(int); static void *fplugin(struct soap*, const char*); static ULONG64 soap_count_attachments(struct soap*); static int soap_try_connect_command(struct soap*, int http_command, const char *endpoint, const char *action); static int soap_init_send(struct soap*); #ifdef WITH_NTLM static int soap_ntlm_handshake(struct soap *soap, int command, const char *endpoint, const char *host, int port); #endif #ifndef WITH_NOIDREF static int soap_has_copies(struct soap*, const char*, const char*); static int soap_type_punned(struct soap*, const struct soap_ilist*); static int soap_is_shaky(struct soap*, void*); static void soap_init_iht(struct soap*); static void soap_free_iht(struct soap*); #endif static void soap_init_pht(struct soap*); static void soap_free_pht(struct soap*); #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, short isearly); static void soap_utilize_ns(struct soap *soap, const char *tag, short isearly); static const wchar_t* soap_wstring(struct soap *soap, const char *s, int flag, long minlen, long maxlen, const char *pattern); static wchar_t* soap_wcollapse(struct soap *soap, wchar_t *s, int flag, int insitu); #endif static const char* soap_string(struct soap *soap, const char *s, int flag, long minlen, long maxlen, const char *pattern); static char* soap_collapse(struct soap *soap, char *s, int flag, int insitu); static const char* soap_QName(struct soap *soap, const char *s, long minlen, long maxlen, const char *pattern); #ifndef WITH_LEANER static int soap_begin_attachments(struct soap*); static int soap_end_attachments(struct soap *soap); static struct soap_multipart *soap_alloc_multipart(struct soap*, struct soap_multipart**, struct soap_multipart**, const 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 #ifdef WITH_GZIP static int soap_getgziphdr(struct soap*); #endif #ifdef WITH_OPENSSL # ifndef SOAP_SSL_RSA_BITS # define SOAP_SSL_RSA_BITS 2048 # endif static 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 *); #endif #ifdef WITH_GNUTLS # ifndef SOAP_SSL_RSA_BITS # define SOAP_SSL_RSA_BITS 2048 # endif static int soap_ssl_init_done = 0; static int ssl_auth_init(struct soap*); static const char *ssl_verify(struct soap *soap, const char *host); # if GNUTLS_VERSION_NUMBER < 0x020b00 # if defined(HAVE_PTHREAD_H) # include /* make GNUTLS thread safe with pthreads */ GCRY_THREAD_OPTION_PTHREAD_IMPL; # elif defined(HAVE_PTH_H) #include /* make GNUTLS thread safe with PTH */ GCRY_THREAD_OPTION_PTH_IMPL; # endif # endif #endif #ifdef WITH_SYSTEMSSL static int ssl_auth_init(struct soap*); static int ssl_recv(int sk, void *s, int n, char *user); static int ssl_send(int sk, void *s, int n, char *user); #endif #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) static const char * soap_decode(char*, size_t, const char*, const char*); #endif #ifndef WITH_NOHTTP static soap_wchar soap_getchunkchar(struct soap*); static const char *http_error(struct soap*, int); static int http_get(struct soap*); static int http_put(struct soap*); static int http_patch(struct soap*); static int http_del(struct soap*); static int http_200(struct soap*); static int http_post(struct soap*, const char*, const char*, int, const char*, const char*, ULONG64); 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, ULONG64); static int http_parse(struct soap*); static int http_parse_header(struct soap*, const char*, const char*); #endif #ifndef WITH_NOIO 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*); #if !defined(WITH_IPV6) static int tcp_gethost(struct soap*, const char *addr, struct in_addr *inaddr); #endif #if !defined(WITH_IPV6) || defined(WITH_COOKIES) static int tcp_gethostbyname(struct soap*, const char *addr, struct hostent *hostent, 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_select(struct soap*, SOAP_SOCKET, int, 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*); #define SOAP_TCP_SELECT_RCV 0x1 #define SOAP_TCP_SELECT_SND 0x2 #define SOAP_TCP_SELECT_ERR 0x4 #define SOAP_TCP_SELECT_ALL 0x7 #define SOAP_TCP_SELECT_PIP 0x8 #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(__VMS) #define SOAP_SOCKBLOCK(fd) \ { \ int blocking = 0; \ ioctl(fd, FIONBIO, &blocking); \ } #define SOAP_SOCKNONBLOCK(fd) \ { \ int nonblocking = 1; \ ioctl(fd, FIONBIO, &nonblocking); \ } #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 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"; const union soap_double_nan soap_double_nan = {{0xFFFFFFFF, 0xFFFFFFFF}}; const char soap_base64o[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 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"; #ifndef WITH_LEAN static const char soap_indent[21] = "\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"; /* Alternative indentation form for SOAP_XML_INDENT with spaces instead of tabs: static const char soap_indent[41] = "\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[] = { { 100, "Continue" }, { 101, "Switching Protocols" }, { 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" }, { 422, "Unprocessable Entity" }, { 426, "Upgrade Required" }, { 428, "Precondition Required" }, { 429, "Too Many Requests" }, { 431, "Request Header Fields Too Large" }, { 500, "Internal Server Error" }, { 501, "Not Implemented" }, { 502, "Bad Gateway" }, { 503, "Service Unavailable" }, { 504, "Gateway Time-out" }, { 505, "HTTP Version not supported" }, { 511, "Network Authentication Required" }, { 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(_AIX43) || defined(TRU64) || defined(HP_UX)) && defined(HAVE_GETHOSTBYNAME_R) #ifndef h_errno extern int h_errno; #endif #endif /******************************************************************************/ #ifndef WITH_NOIO static int fsend(struct soap *soap, const char *s, size_t n) { int nwritten, err; SOAP_SOCKET sk; soap->errnum = 0; #if defined(__cplusplus) && !defined(WITH_COMPAT) if (soap->os) { soap->os->write(s, (std::streamsize)n); if (soap->os->good()) return SOAP_OK; return SOAP_EOF; } #endif sk = soap->sendsk; if (!soap_valid_socket(sk)) sk = soap->socket; while (n) { if (soap_valid_socket(sk)) { if (soap->send_timeout) { for (;;) { int r; #ifdef WITH_SELF_PIPE #ifdef WITH_OPENSSL if (soap->ssl) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL | SOAP_TCP_SELECT_PIP, soap->send_timeout); else #endif #ifdef WITH_GNUTLS if (soap->session) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL | SOAP_TCP_SELECT_PIP, soap->send_timeout); else #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL | SOAP_TCP_SELECT_PIP, soap->send_timeout); else #endif r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR | SOAP_TCP_SELECT_PIP, soap->send_timeout); if ((r & SOAP_TCP_SELECT_PIP)) /* abort if data is pending on pipe */ { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connection closed by self pipe\n")); return SOAP_EOF; } #else #ifdef WITH_OPENSSL if (soap->ssl) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL, soap->send_timeout); else #endif #ifdef WITH_GNUTLS if (soap->session) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL, soap->send_timeout); else #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL, soap->send_timeout); else #endif r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->send_timeout); #endif if (r > 0) break; if (!r) return SOAP_EOF; err = soap->errnum; if (!err) return soap->error; if (err != SOAP_EAGAIN && err != SOAP_EWOULDBLOCK) return SOAP_EOF; } } #ifndef WITH_LEAN if (soap->transfer_timeout) { time_t now = time(NULL); if ((soap->transfer_timeout > 0 && difftime(now, (time_t)soap->start) > (double)soap->transfer_timeout) || (soap->transfer_timeout < 0 && difftime(now, (time_t)soap->start) > -1000000.0 * (double)soap->transfer_timeout)) 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 #ifdef WITH_GNUTLS if (soap->session) nwritten = gnutls_record_send(soap->session, s, n); else #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) { err = gsk_secure_socket_write(soap->ssl, (char*)s, n, &nwritten); if (err != GSK_OK) nwritten = 0; } else #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) { if (soap->peerlen) nwritten = sendto(sk, (char*)s, (SOAP_WINSOCKINT)n, soap->socket_flags, &soap->peer.addr, (SOAP_WINSOCKINT)soap->peerlen); else nwritten = send(sk, 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) { int udp_repeat; int udp_delay; if ((soap->connect_flags & SO_BROADCAST)) udp_repeat = 2; /* SOAP-over-UDP MULTICAST_UDP_REPEAT - 1 */ else udp_repeat = 1; /* SOAP-over-UDP UNICAST_UDP_REPEAT - 1 */ udp_delay = ((unsigned int)soap_random % 201) + 50; /* UDP_MIN_DELAY .. UDP_MAX_DELAY */ do { tcp_select(soap, sk, SOAP_TCP_SELECT_ERR, -1000 * udp_delay); if (soap->peerlen) nwritten = sendto(sk, (char*)s, (SOAP_WINSOCKINT)n, soap->socket_flags, &soap->peer.addr, (SOAP_WINSOCKINT)soap->peerlen); else nwritten = send(sk, 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); } if (nwritten < 0) { err = soap_socket_errno(sk); if (err && err != SOAP_EINTR) { soap->errnum = err; return SOAP_EOF; } nwritten = 0; /* and call write() again */ } } else #endif #if !defined(AS400) nwritten = send(sk, s, (int)n, soap->socket_flags); #else nwritten = send(sk, (void*)s, n, soap->socket_flags); #endif if (nwritten <= 0) { int r = 0; err = soap_socket_errno(sk); #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 #ifdef WITH_GNUTLS if (soap->session) { if (nwritten == GNUTLS_E_INTERRUPTED) err = SOAP_EINTR; else if (nwritten == GNUTLS_E_AGAIN) err = SOAP_EAGAIN; } #endif if (err == SOAP_EWOULDBLOCK || err == SOAP_EAGAIN) { #if defined(WITH_OPENSSL) if (soap->ssl && r == SSL_ERROR_WANT_READ) r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); else #elif defined(WITH_GNUTLS) if (soap->session && !gnutls_record_get_direction(soap->session)) r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); else #endif r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); if (!r && soap->send_timeout) return SOAP_EOF; if (r < 0) return SOAP_EOF; } 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 WMW_RPM_IO /* vxWorks compatible */ if (soap->rpmreqid) nwritten = (httpBlockPut(soap->rpmreqid, (char*)s, n) == 0) ? n : -1; else #endif #ifdef WIN32 nwritten = _write(soap->sendfd, s, (unsigned int)n); #else nwritten = write(soap->sendfd, s, (unsigned int)n); #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 /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_send_raw(struct soap *soap, const char *s, size_t n) { if (!s || !n) return SOAP_OK; #ifndef WITH_LEANER if (soap->fpreparesend && (soap->mode & SOAP_IO) != SOAP_IO_STORE && (soap->mode & SOAP_IO_LENGTH) && (soap->error = soap->fpreparesend(soap, s, n)) != SOAP_OK) return soap->error; if (soap->ffiltersend && (soap->error = soap->ffiltersend(soap, &s, &n)) != SOAP_OK) return soap->error; #endif if ((soap->mode & SOAP_IO_LENGTH)) { soap->count += n; } else if ((soap->mode & SOAP_IO)) { size_t i = sizeof(soap->buf) - soap->bufidx; while (n >= i) { (void)soap_memcpy((void*)(soap->buf + soap->bufidx), i, (const void*)s, i); soap->bufidx = sizeof(soap->buf); if (soap_flush(soap)) return soap->error; s += i; n -= i; i = sizeof(soap->buf); } (void)soap_memcpy((void*)(soap->buf + soap->bufidx), sizeof(soap->buf) - soap->bufidx, (const void*)s, n); soap->bufidx += n; } else { return soap_flush_raw(soap, s, n); } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_flush(struct soap *soap) { size_t n = soap->bufidx; if (!n) return soap->error = soap->fsend(soap, SOAP_STR_EOS, 0); /* force a zero send for HTTP GET and DELETE */ #ifndef WITH_LEANER if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) { int r; if (soap->fpreparesend && (r = soap->fpreparesend(soap, soap->buf, n)) != SOAP_OK) return soap->error = r; } #endif soap->bufidx = 0; #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && soap->d_stream) { 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, sizeof(soap->buf))) return soap->error; soap->d_stream->next_out = (Byte*)soap->z_buf; soap->d_stream->avail_out = sizeof(soap->buf); } } while (soap->d_stream->avail_in); return SOAP_OK; } #endif return soap_flush_raw(soap, soap->buf, n); } /******************************************************************************/ 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) { void *t; t = soap_push_block(soap, NULL, n); if (!t) return soap->error = SOAP_EOM; (void)soap_memcpy(t, n, (const void*)s, n); return SOAP_OK; } #ifndef WITH_LEANER if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { char t[24]; (SOAP_SNPRINTF(t, sizeof(t), 20), &"\r\n%lX\r\n"[soap->chunksize ? 0 : 2], (unsigned long)n); DBGMSG(SENT, t, strlen(t)); soap->error = soap->fsend(soap, t, strlen(t)); if (soap->error) return soap->error; soap->chunksize += n; } DBGMSG(SENT, s, n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Send %u bytes to socket=%d/fd=%d\n", (unsigned int)n, (int)soap->socket, soap->sendfd)); #endif return soap->error = soap->fsend(soap, s, n); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_send(struct soap *soap, const char *s) { if (!s) return SOAP_OK; return soap_send_raw(soap, s, strlen(s)); } /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_query_send_key(struct soap *soap, const char *s) { if (!s) return SOAP_OK; if (!soap->body && soap_send_raw(soap, "&", 1)) return soap->error; soap->body = 0; (void)soap_encode_url(s, soap->msgbuf, (int)sizeof(soap->msgbuf)); /* msgbuf length is max SOAP_TMPLEN or just 1024 bytes */ return soap_send(soap, soap->msgbuf); } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_query_send_val(struct soap *soap, const char *s) { if (!s) return SOAP_OK; if (soap_send_raw(soap, "=", 1)) return soap->error; (void)soap_encode_url(s, soap->msgbuf, (int)sizeof(soap->msgbuf)); /* msgbuf length is max SOAP_TMPLEN or just 1024 bytes */ return soap_send(soap, soap->msgbuf); } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 char * SOAP_FMAC2 soap_query(struct soap *soap) { return strchr(soap->path, '?'); } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 char * SOAP_FMAC2 soap_query_key(struct soap *soap, char **s) { char *t = *s; (void)soap; if (t && *t) { *s = (char*)soap_query_decode(t, strlen(t), t + 1); return t; } return *s = NULL; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 char * SOAP_FMAC2 soap_query_val(struct soap *soap, char **s) { char *t = *s; (void)soap; if (t && *t == '=') { *s = (char*)soap_query_decode(t, strlen(t), t + 1); return t; } return NULL; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 const char * SOAP_FMAC2 soap_query_decode(char *buf, size_t len, const char *val) { const char *s; char *t; for (s = val; *s; s++) if (*s != ' ' && *s != '=') break; if (*s == '"') { t = buf; s++; while (*s && *s != '"' && --len) *t++ = *s++; *t = '\0'; do s++; while (*s && *s != '&' && *s != '='); } else { t = buf; while (*s && *s != '&' && *s != '=' && --len) { switch (*s) { case '+': *t++ = ' '; s++; break; case '\t': case '\n': case '\r': case ' ': s++; break; case '%': *t++ = ((s[1] >= 'A' ? (s[1]&0x7) + 9 : s[1] - '0') << 4) + (s[2] >= 'A' ? (s[2]&0x7) + 9 : s[2] - '0'); s += 3; break; default: *t++ = *s++; } } *t = '\0'; } return s; } #endif /******************************************************************************/ #ifndef WITH_NOIO static size_t frecv(struct soap *soap, char *s, size_t n) { int r; int retries = 100; /* max 100 retries with non-blocking sockets */ SOAP_SOCKET sk; soap->errnum = 0; #if defined(__cplusplus) && !defined(WITH_COMPAT) if (soap->is) /* recv from C++ stream */ { if (soap->is->good()) return (size_t)soap->is->read(s, (std::streamsize)n).gcount(); /* downcast to std::streamsize is OK: gcount() returns how much we got in s[] */ return 0; } #else if (soap->is) /* recv from C buffer until NUL */ { size_t l = strlen(soap->is); if (l > n) l = n; (void)soap_memcpy((void*)s, n, soap->is, l); soap->is += l; return l; } #endif sk = soap->recvsk; if (!soap_valid_socket(sk)) sk = soap->socket; if (soap_valid_socket(sk)) { for (;;) { #if defined(WITH_OPENSSL) || defined(WITH_SYSTEMSSL) int err = 0; #endif #ifdef WITH_OPENSSL if (soap->recv_timeout && !soap->ssl) /* OpenSSL: sockets are nonblocking so go ahead to read */ #else if (soap->recv_timeout) #endif { for (;;) { #ifdef WITH_SELF_PIPE r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR | SOAP_TCP_SELECT_PIP, soap->recv_timeout); if ((r & SOAP_TCP_SELECT_PIP)) /* abort if data is pending on pipe */ { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connection closed by self pipe\n")); return 0; } #else r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->recv_timeout); #endif if (r > 0) break; if (!r) return 0; r = soap->errnum; if (r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) return 0; } } #ifndef WITH_LEAN if (soap->transfer_timeout) { time_t now = time(NULL); if ((soap->transfer_timeout > 0 && difftime(now, (time_t)soap->start) > (double)soap->transfer_timeout) || (soap->transfer_timeout < 0 && difftime(now, (time_t)soap->start) > -1000000.0 * (double)soap->transfer_timeout)) 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 #ifdef WITH_GNUTLS if (soap->session) { r = (int)gnutls_record_recv(soap->session, s, n); if (r >= 0) return (size_t)r; } else #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) { err = gsk_secure_socket_read(soap->ssl, s, n, &r); if (err == GSK_OK && r > 0) return (size_t)r; if (err != GSK_OK && err != GSK_WOULD_BLOCK && err != GSK_WOULD_BLOCK_WRITE) 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(sk, s, (SOAP_WINSOCKINT)n, soap->socket_flags, &soap->peer.addr, &k); /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h, SOAP_WINSOCKINT cast is safe due to limited range of n in the engine (64K) */ soap->peerlen = (size_t)k; #ifdef WITH_IPV6 soap->ip = 0; soap->ip6[0] = 0; soap->ip6[1] = 0; soap->ip6[2] = 0; soap->ip6[3] = 0; #else soap->ip = ntohl(soap->peer.in.sin_addr.s_addr); soap->ip6[0] = 0; soap->ip6[1] = 0; soap->ip6[2] = 0xFFFF; soap->ip6[3] = soap->ip; #endif } else #endif r = recv(sk, s, (SOAP_WINSOCKINT)n, soap->socket_flags); /* SOAP_WINSOCKINT cast is safe due to limited range of n in the engine (64K) */ if (r >= 0) return (size_t)r; r = soap_socket_errno(sk); if (r != SOAP_EINTR && r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) { soap->errnum = r; return 0; } } #if defined(WITH_OPENSSL) if (soap->ssl && err == SSL_ERROR_WANT_WRITE) r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); else #elif defined(WITH_GNUTLS) if (soap->session && gnutls_record_get_direction(soap->session)) r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); else #elif defined(WITH_SYSTEMSSL) if (soap->ssl && err == GSK_WOULD_BLOCK_WRITE) r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); else #endif r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); if (!r && soap->recv_timeout) return 0; if (r < 0) { r = soap->errnum; if (r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) return 0; } if (retries-- <= 0) return 0; } } #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, n); #endif if (r >= 0) return (size_t)r; soap->errnum = soap_errno; return 0; #endif #endif } #endif /******************************************************************************/ #ifndef WITH_NOHTTP 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, sizeof(soap->buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket=%d/fd=%d\n", (unsigned int)soap->buflen, (int)soap->socket, soap->recvfd)); DBGMSG(RECV, soap->buf, soap->buflen); if (soap->buflen) return soap->buf[soap->bufidx++]; return EOF; } #endif /******************************************************************************/ static int soap_isxdigit(int c) { return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_recv_raw(struct soap *soap) { size_t ret; #if !defined(WITH_LEANER) || defined(WITH_ZLIB) int r; #endif #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && soap->d_stream) { if (soap->d_stream->next_out == Z_NULL) { soap->bufidx = soap->buflen = 0; return EOF; } if (soap->d_stream->avail_in || !soap->d_stream->avail_out) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflating\n")); soap->d_stream->next_out = (Byte*)soap->buf; soap->d_stream->avail_out = sizeof(soap->buf); r = inflate(soap->d_stream, Z_NO_FLUSH); if (r == Z_NEED_DICT && soap->z_dict) r = inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len); if (r == Z_OK || r == Z_STREAM_END) { soap->bufidx = 0; ret = soap->buflen = sizeof(soap->buf) - 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->d_stream->next_out = Z_NULL; } if (ret) { if (soap->count + ret < soap->count) return soap->error = SOAP_EOF; soap->count += ret; if (soap->recv_maxlength && soap->count > soap->recv_maxlength) return soap->error = SOAP_EOF; soap->z_ratio_in = (float)soap->d_stream->total_in / (float)soap->d_stream->total_out; if (soap->count > SOAP_MAXINFLATESIZE && soap->z_ratio_in < SOAP_MINDEFLATERATIO) { soap->d_stream->msg = (char*)"caught SOAP_MINDEFLATERATIO explosive decompression guard (remedy: increase SOAP_MAXINFLATESIZE and/or decrease SOAP_MINDEFLATERATIO)"; return soap->error = SOAP_ZLIB_ERROR; } DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- decompressed ----\n")); DBGMSG(RECV, soap->buf, ret); DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n----\n")); #ifndef WITH_LEANER if (soap->fpreparerecv && (r = soap->fpreparerecv(soap, soap->buf, ret)) != SOAP_OK) return soap->error = r; #endif 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; return soap->error = SOAP_ZLIB_ERROR; } } zlib_again: if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK && !soap->chunksize) { (void)soap_memcpy((void*)soap->buf, sizeof(soap->buf), (const void*)soap->z_buf, sizeof(soap->buf)); 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 (;;) { soap_wchar c; char *t, tmp[17]; if (soap->chunksize) { soap->buflen = ret = soap->frecv(soap, soap->buf, soap->chunksize > sizeof(soap->buf) ? sizeof(soap->buf) : soap->chunksize); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk: read %u bytes\n", (unsigned int)ret)); DBGMSG(RECV, soap->buf, ret); soap->bufidx = 0; if (!ret) { soap->ahead = EOF; return EOF; } soap->chunksize -= ret; break; } if (!soap->chunkbuflen) { soap->chunkbuflen = ret = soap->frecv(soap, soap->buf, sizeof(soap->buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes (chunked) from socket=%d\n", (unsigned int)ret, (int)soap->socket)); DBGMSG(RECV, soap->buf, ret); soap->bufidx = 0; if (!ret) { soap->ahead = EOF; return 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) { soap->ahead = EOF; return EOF; } } t = tmp; do { *t++ = (char)c; } while (soap_isxdigit((int)(c = soap_getchunkchar(soap))) && (size_t)(t - tmp) < sizeof(tmp)-1); while ((int)c != EOF && c != '\n') c = soap_getchunkchar(soap); if ((int)c == EOF) { soap->ahead = EOF; return EOF; } *t = '\0'; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunk size = %s (hex)\n", tmp)); soap->chunksize = (size_t)soap_strtoul(tmp, &t, 16); if (!soap->chunksize) { soap->bufidx = soap->buflen = soap->chunkbuflen = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of chunked message\n")); 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, sizeof(soap->buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket=%d/fd=%d\n", (unsigned int)ret, (int)soap->socket, soap->recvfd)); DBGMSG(RECV, soap->buf, ret); } #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB)) { (void)soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)soap->buf, sizeof(soap->buf)); 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 = sizeof(soap->buf); r = inflate(soap->d_stream, Z_NO_FLUSH); if (r == Z_NEED_DICT && soap->z_dict) r = inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len); if (r == Z_OK || r == Z_STREAM_END) { soap->bufidx = 0; soap->z_buflen = soap->buflen; soap->buflen = sizeof(soap->buf) - 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 && r != Z_STREAM_END) 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->d_stream->next_out = Z_NULL; } soap->z_ratio_in = (float)soap->d_stream->total_in / (float)soap->d_stream->total_out; if (soap->count + ret > SOAP_MAXINFLATESIZE && soap->z_ratio_in < SOAP_MINDEFLATERATIO) { soap->d_stream->msg = (char*)"caught SOAP_MINDEFLATERATIO explosive decompression guard (remedy: increase SOAP_MAXINFLATESIZE and/or decrease SOAP_MINDEFLATERATIO)"; return soap->error = SOAP_ZLIB_ERROR; } DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- decompressed ----\n")); DBGMSG(RECV, soap->buf, ret); #ifndef WITH_LEANER if (soap->fpreparerecv && (r = soap->fpreparerecv(soap, soap->buf, ret)) != SOAP_OK) return soap->error = r; #endif } 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; return soap->error = SOAP_ZLIB_ERROR; } } #endif #ifndef WITH_LEANER if (soap->fpreparerecv #ifdef WITH_ZLIB && soap->zlib_in == SOAP_ZLIB_NONE #endif && (r = soap->fpreparerecv(soap, soap->buf + soap->bufidx, ret))) return soap->error = r; #endif if (ret) { if (soap->count + ret < soap->count) return EOF; soap->count += ret; if (soap->recv_maxlength && soap->count > soap->recv_maxlength) return EOF; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read count=" SOAP_ULONG_FORMAT " (+%lu)\n", soap->count, (unsigned long)ret)); return SOAP_OK; } return EOF; } /******************************************************************************/ 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 SOAP in DIME is in buffer\n")); soap->buflen = soap->dime.buflen; soap->dime.buflen = 0; soap->dime.chunksize = 0; 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; } if (!(soap->dime.flags & SOAP_DIME_CF)) return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME hdr for next SOAP in DIME 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; } if ((tmp[0] & 0xF8) != SOAP_DIME_VERSION) return soap->error = SOAP_DIME_MISMATCH; soap->dime.flags = (tmp[0] & 0x7) | (tmp[1] & 0xF0); 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 SOAP in DIME chunk (%u bytes)\n", (unsigned int)soap->dime.size)); soap->dime.chunksize = soap->dime.size; if (soap->buflen - soap->bufidx >= soap->dime.size) { if ((soap->dime.flags & SOAP_DIME_ME)) { soap->mode &= ~SOAP_ENC_DIME; } else { soap->dime.buflen = soap->buflen; soap->buflen = soap->bufidx + soap->dime.chunksize; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked SOAP in DIME (%u bytes buffered)\n", (unsigned int)soap->buflen)); } } else { soap->dime.chunksize -= soap->buflen - soap->bufidx; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked SOAP in DIME (%u bytes in chunk left)\n", (unsigned int)soap->dime.chunksize)); } return SOAP_OK; } if (soap->dime.chunksize) { if (soap_recv_raw(soap)) return EOF; if (soap->buflen - soap->bufidx >= soap->dime.chunksize) { if ((soap->dime.flags & SOAP_DIME_ME)) { soap->dime.chunksize = 0; soap->mode &= ~SOAP_ENC_DIME; } else { soap->dime.buflen = soap->buflen; soap->buflen = soap->bufidx + soap->dime.chunksize; soap->dime.chunksize = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked SOAP in DIME (%u bytes buffered)\n", (unsigned int)soap->buflen)); } } else { soap->dime.chunksize -= soap->buflen - soap->bufidx; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked SOAP in DIME (%u bytes in chunk left)\n", (unsigned int)soap->dime.chunksize)); } return SOAP_OK; } } if (soap->ffilterrecv) { int err; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Filter recverror = %d bufidx = %lu buflen = %lu\n", soap->recverror, (unsigned long)soap->bufidx, (unsigned long)soap->buflen)); if (soap->recverror) { soap->bufidx = soap->buflen = 0; } else { soap->bufidx = soap->buflen = 0; err = soap->ffilterrecv(soap, soap->buf, &soap->buflen, sizeof(soap->buf)); if (err) { if (err == SOAP_EOF) return SOAP_EOF; return soap->error = err; } if (soap->buflen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Filtered output continued %lu bytes\n", (unsigned long)soap->buflen)); return SOAP_OK; } soap->recverror = soap_recv_raw(soap); soap->buflen -= soap->bufidx; /* chunked may set bufidx > 0 to skip hex chunk length */ } while (soap->ffilterrecv) { err = soap->ffilterrecv(soap, soap->buf + soap->bufidx, &soap->buflen, sizeof(soap->buf) - soap->bufidx); if (err) { if (err == SOAP_EOF) return SOAP_EOF; return soap->error = err; } if (soap->buflen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Filtered output %lu bytes\n", (unsigned long)soap->buflen)); soap->buflen += soap->bufidx; return SOAP_OK; } if (soap->recverror) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Returning postponed error %d\n", soap->recverror)); return soap->recverror; } soap->recverror = soap_recv_raw(soap); soap->buflen -= soap->bufidx; /* chunked may set bufidx > 0 to skip hex chunk length */ } } return soap->recverror = soap_recv_raw(soap); #else return soap_recv_raw(soap); #endif } /******************************************************************************/ SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getchar(struct soap *soap) { soap_wchar c; c = soap->ahead; if (c) { if ((int)c != EOF) soap->ahead = 0; return c; } return soap_get1(soap); } /******************************************************************************/ 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; } /******************************************************************************/ SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_code_int(const struct soap_code_map *code_map, const char *str, LONG64 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; } /******************************************************************************/ 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; } /******************************************************************************/ SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_code_bits(const struct soap_code_map *code_map, const char *str) { LONG64 bits = 0; if (code_map) { while (str && *str) { const struct soap_code_map *p; for (p = code_map; p->string; p++) { size_t n = strlen(p->string); if (!strncmp(p->string, str, n) && soap_coblank((soap_wchar)str[n])) { bits |= p->code; str += n; while (*str > 0 && *str <= 32) str++; break; } } if (!p->string) return 0; } } return bits; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_list(struct soap *soap, const struct soap_code_map *code_map, long code) { char *t = soap->tmpbuf; if (code_map) { while (code_map->string) { if ((code_map->code & code)) { 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; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_binary_search_string(const char **a, int n, const char *s) { int min = 0, max = n-1; while (min <= max) { int mid = (min+max)/2; int r = strcmp(s, a[mid]); if (r < 0) max = mid - 1; else if (r > 0) min = mid + 1; else return mid; } return -1; } /******************************************************************************/ static soap_wchar soap_char(struct soap *soap) { char tmp[8]; int i; soap_wchar c; char *s = tmp; for (i = 0; i < (int)sizeof(tmp)-1; 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_wchar)soap_strtol(tmp + 2, NULL, 16); return (soap_wchar)soap_strtol(tmp + 1, NULL, 10); } 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, (LONG64)SOAP_UNKNOWN_CHAR); #else return SOAP_UNKNOWN_CHAR; /* use this to represent unknown code */ #endif } /******************************************************************************/ #ifdef WITH_LEAN 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 /******************************************************************************/ #ifdef WITH_LEAN 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 /******************************************************************************/ SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_get(struct soap *soap) { 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; c = 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_coblank(c)); if (c == '!' || c == '?' || c == '%') { 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_getpi(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; } /******************************************************************************/ static soap_wchar soap_getpi(struct soap *soap) { char buf[64]; char *s = buf; size_t i = sizeof(buf); soap_wchar c; while ((int)(c = soap_getchar(soap)) != EOF && c != '?') { if (i > 1) { if (soap_coblank(c)) c = ' '; *s++ = (char)c; i--; } } *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; } /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_move(struct soap *soap, ULONG64 n) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving " SOAP_ULONG_FORMAT " bytes forward\n", n)); for (; n; n--) if ((int)soap_getchar(soap) == EOF) return SOAP_EOF; return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 ULONG64 SOAP_FMAC2 soap_tell(struct soap *soap) { return soap->count - soap->buflen + soap->bufidx - (soap->ahead != 0); } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_pututf8(struct soap *soap, unsigned long c) { char tmp[24]; if ((c < 0x7F && c > 0x1F)) { *tmp = (char)c; return soap_send_raw(soap, tmp, 1); } #ifdef WITH_REPLACE_ILLEGAL_UTF8 if (!(c == 0x09 || c == 0x0A || c == 0x0D || (c >= 0x80 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD) || (c >= 0x10000 && c <= 0x10FFFF))) c = SOAP_UNKNOWN_UNICODE_CHAR; #endif #ifndef WITH_LEAN if (c > 0x9F) { 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 #endif (SOAP_SNPRINTF(tmp, sizeof(tmp), 20), "&#x%lX;", c); return soap_send(soap, tmp); } /******************************************************************************/ SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getutf8(struct soap *soap) { #ifdef WITH_REPLACE_ILLEGAL_UTF8 soap_wchar c, c1, c2, c3; #else soap_wchar c, c1, c2, c3, c4; #endif c = soap->ahead; if (c >= 0x80) soap->ahead = 0; else c = (soap_wchar)soap_get(soap); if (c < 0x80 || c > 0xFF || (soap->mode & SOAP_ENC_LATIN)) return c; #ifdef WITH_REPLACE_ILLEGAL_UTF8 c1 = (soap_wchar)soap_get1(soap); if (c <= 0xC1 || (c1 & 0xC0) != 0x80) { soap_revget1(soap); return SOAP_UNKNOWN_UNICODE_CHAR; } c1 &= 0x3F; if (c < 0xE0) return (((c & 0x1F) << 6) | c1); c2 = (soap_wchar)soap_get1(soap); if ((c == 0xE0 && c1 < 0x20) || (c2 & 0xC0) != 0x80) { soap_revget1(soap); return SOAP_UNKNOWN_UNICODE_CHAR; } c2 &= 0x3F; if (c < 0xF0) return (((c & 0x0F) << 12) | (c1 << 6) | c2); c3 = (soap_wchar)soap_get1(soap); if ((c == 0xF0 && c1 < 0x10) || (c == 0xF4 && c1 >= 0x10) || c >= 0xF5 || (c3 & 0xC0) != 0x80) { soap_revget1(soap); return SOAP_UNKNOWN_UNICODE_CHAR; } return (((c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | (c3 & 0x3F)); #else c1 = (soap_wchar)soap_get1(soap); if (c < 0xC0 || (c1 & 0xC0) != 0x80) { soap_revget1(soap); /* doesn't look like this is UTF-8, try continue as if ISO-8859-1 */ return c; } c1 &= 0x3F; if (c < 0xE0) return ((soap_wchar)(c & 0x1F) << 6) | c1; c2 = (soap_wchar)soap_get1(soap) & 0x3F; 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 } /******************************************************************************/ SOAP_FMAC1 size_t SOAP_FMAC2 soap_utf8len(const char *s) { size_t l = 0; while (*s) if ((*s++ & 0xC0) != 0x80) l++; return l; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_puthex(struct soap *soap, const unsigned char *s, int n) { char d[2 * SOAP_BINARY_BUFLEN], *p = d; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_s2hex(soap, s, NULL, n); if (!soap->dom->text) return soap->error; return SOAP_OK; } #endif for (; n > 0; n--) { int m = *s++; p[0] = (char)((m >> 4) + (m > 159 ? '7' : '0')); m &= 0x0F; p[1] = (char)(m + (m > 9 ? '7' : '0')); p += 2; if (p - d == sizeof(d)) { if (soap_send_raw(soap, d, sizeof(d))) return soap->error; p = d; } } if (p != d && soap_send_raw(soap, d, p - d)) return soap->error; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_gethex(struct soap *soap, int *n) { size_t l = 0; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_string_in(soap, 0, -1, -1, NULL); return (unsigned char*)soap_hex2s(soap, soap->dom->text, NULL, 0, n); } #endif #ifdef WITH_FAST soap->labidx = 0; for (;;) { char *s; 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++) { char d1, d2; 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 = NULL; l = soap->lablen + i - k; soap_unget(soap, c); if (n) *n = (int)l; if (soap->maxlength > 0 && l > (size_t)soap->maxlength) { soap->error = SOAP_LENGTH; } else { p = (unsigned char*)soap_malloc(soap, l); if (p) (void)soap_memcpy((void*)p, l, (const void*)soap->labbuf, l); } return p; } *s++ = (char)(((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0')); } l = soap->lablen; if (soap->maxlength > 0 && l > (size_t)soap->maxlength) { soap->error = SOAP_LENGTH; return NULL; } } #else if (soap_alloc_block(soap) == NULL) return NULL; for (;;) { int i; 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++) { char d1, d2; 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 (soap->maxlength > 0 && l > (size_t)soap->maxlength) { soap->error = SOAP_LENGTH; soap_end_block(soap, NULL); return NULL; } if (n) *n = (int)soap_size_block(soap, NULL, i); p = (unsigned char*)soap_save_block(soap, NULL, NULL, 0); return p; } *s++ = ((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0'); l++; } if (soap->maxlength > 0 && l > (size_t)soap->maxlength) { soap->error = SOAP_LENGTH; soap_end_block(soap, NULL); return NULL; } } #endif } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_putbase64(struct soap *soap, const unsigned char *s, int n) { char d[4 * SOAP_BINARY_BUFLEN], *p = d; if (!s) return SOAP_OK; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_s2base64(soap, s, NULL, n); if (!soap->dom->text) return soap->error; return SOAP_OK; } #endif for (; n > 2; n -= 3, s += 3) { p[0] = soap_base64o[(s[0] & 0xFC) >> 2]; p[1] = soap_base64o[((s[0] & 0x03) << 4) | ((s[1] & 0xF0) >> 4)]; p[2] = soap_base64o[((s[1] & 0x0F) << 2) | ((s[2] & 0xC0) >> 6)]; p[3] = soap_base64o[s[2] & 0x3F]; p += 4; if (p - d == sizeof(d)) { if (soap_send_raw(soap, d, sizeof(d))) return soap->error; p = d; } } if (n == 2) { p[0] = soap_base64o[(s[0] & 0xFC) >> 2]; p[1] = soap_base64o[((s[0] & 0x03) << 4) | ((s[1] & 0xF0) >> 4)]; p[2] = soap_base64o[(s[1] & 0x0F) << 2]; p[3] = '='; p += 4; } else if (n == 1) { p[0] = soap_base64o[(s[0] & 0xFC) >> 2]; p[1] = soap_base64o[(s[0] & 0x03) << 4]; p[2] = '='; p[3] = '='; p += 4; } if (p != d && soap_send_raw(soap, d, p - d)) return soap->error; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_getbase64(struct soap *soap, int *n, int malloc_flag) { size_t l = 0; (void)malloc_flag; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_string_in(soap, 0, -1, -1, NULL); return (unsigned char*)soap_base642s(soap, soap->dom->text, NULL, 0, n); } #endif #ifdef WITH_FAST soap->labidx = 0; for (;;) { size_t i, k; 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 (k > 2) { for (i = 0; i < k - 2; i += 3) { unsigned long m = 0; int j = 0; do { soap_wchar c = soap_get(soap); if (c < SOAP_AP) c &= 0x7FFFFFFF; if (c == '=' || c < 0) { unsigned char *p = NULL; 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; } l = soap->lablen + i - k; if (n) *n = (int)l; if (soap->maxlength > 0 && l > (size_t)soap->maxlength) soap->error = SOAP_LENGTH; else { p = (unsigned char*)soap_malloc(soap, l); if (p) (void)soap_memcpy((void*)p, l, (const void*)soap->labbuf, l); } if (c >= 0) { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT) continue; } 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_coblank(c + '+')) { soap->error = SOAP_TYPE; return NULL; } } while (j < 4); *s++ = (char)((m >> 16) & 0xFF); *s++ = (char)((m >> 8) & 0xFF); *s++ = (char)(m & 0xFF); } l = soap->lablen; if (soap->maxlength > 0 && l > (size_t)soap->maxlength) { soap->error = SOAP_LENGTH; return NULL; } } } #else if (soap_alloc_block(soap) == NULL) return NULL; for (;;) { int i; 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++) { unsigned long m = 0; int j = 0; do { soap_wchar c = soap_get(soap); if (c < SOAP_AP) c &= 0x7FFFFFFF; if (c == '=' || c < 0) { unsigned char *p; i *= 3; switch (j) { case 2: *s++ = (char)((m >> 4) & 0xFF); i++; l++; break; case 3: *s++ = (char)((m >> 10) & 0xFF); *s++ = (char)((m >> 2) & 0xFF); l += 2; i += 2; } if (n) *n = (int)soap_size_block(soap, NULL, i); if (soap->maxlength > 0 && l > (size_t)soap->maxlength) { soap->error = SOAP_LENGTH; soap_end_block(soap, NULL); return NULL; } p = (unsigned char*)soap_save_block(soap, NULL, NULL, 0); if (c >= 0) { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT) continue; } 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_coblank(c + '+')) { soap->error = SOAP_TYPE; return NULL; } } while (j < 4); *s++ = (char)((m >> 16) & 0xFF); *s++ = (char)((m >> 8) & 0xFF); *s++ = (char)(m & 0xFF); l += 3; } if (soap->maxlength > 0 && l > (size_t)soap->maxlength) { soap->error = SOAP_LENGTH; soap_end_block(soap, NULL); return NULL; } } #endif } /******************************************************************************/ #ifndef WITH_LEANER 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 */ short body = soap->body; /* should save type too? */ if (!soap_peek_element(soap)) { if (!soap_element_begin_in(soap, ":Include", 0, NULL)) { if (soap_attachment_forward(soap, ptr, size, id, type, options) || (soap->body && soap_element_end_in(soap, ":Include"))) return soap->error; } else if (soap->error == SOAP_TAG_MISMATCH) soap_retry(soap); else return soap->error; } soap->body = body; return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_attachment_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 /******************************************************************************/ SOAP_FMAC1 void * SOAP_FMAC2 soap_memdup(struct soap *soap, const void *s, size_t n) { void *t = NULL; if (s) { t = soap_malloc(soap, n); if (t) (void)soap_memcpy(t, n, s, n); } return t; } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_strdup(struct soap *soap, const char *s) { char *t = NULL; if (s) { size_t n = strlen(s) + 1; if (n > 0) { t = (char*)soap_malloc(soap, n); if (t) { (void)soap_memcpy((void*)t, n, (const void*)s, n); t[n - 1] = '\0'; } } } return t; } /******************************************************************************/ 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, m; while (s[n]) n++; n++; m = sizeof(wchar_t) * n; if (n > 0) { t = (wchar_t*)soap_malloc(soap, m); if (t) { (void)soap_memcpy((void*)t, m, (const void*)s, m); t[n - 1] = L'\0'; } } } return t; } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_strtrim(struct soap *soap, char *s) { (void)soap; if (s) { char *t; while ((*s >= 9 && *s <= 13) || *s == 32) s++; t = s; while (*t) t++; while (--t > s && ((*t >= 9 && *t <= 13) || *t == 32)) continue; t[1] = '\0'; } return s; } /******************************************************************************/ SOAP_FMAC1 wchar_t * SOAP_FMAC2 soap_wstrtrim(struct soap *soap, wchar_t *s) { (void)soap; if (s) { wchar_t *t; while ((*s >= 9 && *s <= 13) || *s == 32) s++; t = s; while (*t) t++; while (--t > s && ((*t >= 9 && *t <= 13) || *t == 32)) continue; t[1] = L'\0'; } return s; } /******************************************************************************/ SOAP_FMAC1 struct soap_blist* SOAP_FMAC2 soap_alloc_block(struct soap *soap) { struct soap_blist *p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New block sequence (prev=%p)\n", (void*)soap->blist)); p = (struct soap_blist*)SOAP_MALLOC(soap, sizeof(struct soap_blist)); if (!p) { soap->error = SOAP_EOM; return NULL; } p->next = soap->blist; p->head = NULL; p->size = 0; p->item = 0; soap->blist = p; return p; } /******************************************************************************/ SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block(struct soap *soap, struct soap_blist *b, size_t n) { struct soap_bhead *p; if (!b) b = soap->blist; if (!b || b->size + n < b->size || sizeof(struct soap_bhead) + n < n || (SOAP_MAXALLOCSIZE > 0 && sizeof(struct soap_bhead) + n > SOAP_MAXALLOCSIZE)) { soap->error = SOAP_EOM; return NULL; } p = (struct soap_bhead*)SOAP_MALLOC(soap, sizeof(struct soap_bhead) + n); if (!p) { soap->error = SOAP_EOM; return NULL; } p->next = b->head; b->head = p; p->size = n; b->size += n; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push block %p of %u bytes on %lu previous blocks (%lu bytes total)\n", (void*)p, (unsigned int)n, (unsigned long)b->item, (unsigned long)b->size)); b->item++; return (void*)(p + 1); /* skip block header and point to n allocated bytes */ } /******************************************************************************/ SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block_max(struct soap *soap, struct soap_blist *b, size_t n) { if (b && b->item >= soap->maxoccurs) /* restrict block array length */ { soap->error = SOAP_OCCURS; return NULL; } return soap_push_block(soap, b, n); } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_pop_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *p; if (!b) b = soap->blist; if (!b || !b->head) return; p = b->head; b->size -= p->size; b->head = p->next; b->item--; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pop block %p (%lu items of %lu bytes total)\n", (void*)p, (unsigned long)b->item, (unsigned long)b->size)); SOAP_FREE(soap, p); } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_update_pointers(struct soap *soap, const char *dst, const char *src, size_t len) { const void *start = src, *end = src + len; #ifndef WITH_LEANER struct soap_xlist *xp; #endif #ifndef WITH_NOIDREF if ((soap->version && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH)) { int i; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update pointers %p (%lu bytes) -> %p\n", (void*)src, (unsigned long)len, (void*)dst)); for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { struct soap_flist *fp; void *p, **q; if (ip->shaky) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update shaky id='%s'\n", ip->id)); if (ip->ptr && ip->ptr >= start && ip->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update ptr %p -> %p\n", ip->ptr, (void*)((const char*)ip->ptr + (dst-src)))); ip->ptr = (void*)((const char*)ip->ptr + (dst-src)); } for (q = &ip->link; q; q = (void**)p) { p = *q; if (p && p >= start && p < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Link update id='%s' %p -> %p\n", ip->id, p, (void*)((const char*)p + (dst-src)))); *q = (void*)((const char*)p + (dst-src)); } } for (q = &ip->copy; q; q = (void**)p) { p = *q; if (p && p >= start && p < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy chain update id='%s' %p -> %p\n", ip->id, p, (void*)((const char*)p + (dst-src)))); *q = (void*)((const char*)p + (dst-src)); } } for (fp = ip->flist; fp; fp = fp->next) { if (fp->ptr >= start && fp->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy list update id='%s' target type=%d %p -> %p\n", ip->id, fp->type, fp->ptr, (void*)((char*)fp->ptr + (dst-src)))); fp->ptr = (void*)((const char*)fp->ptr + (dst-src)); } } if (ip->smart && ip->smart >= start && ip->smart < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Smart shared pointer update %p -> %p\n", ip->smart, (void*)((const char*)ip->smart + (dst-src)))); ip->smart = (void*)((const char*)ip->smart + (dst-src)); } } } } } #else (void)soap; (void)start; (void)end; (void)dst; (void)src; #endif #ifndef WITH_LEANER for (xp = soap->xlist; xp; xp = xp->next) { if (xp->ptr && (void*)xp->ptr >= start && (void*)xp->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update attachment id='%s' %p -> %p\n", xp->id ? xp->id : SOAP_STR_EOS, (void*)xp->ptr, (void*)((char*)xp->ptr + (dst-src)))); xp->ptr = (unsigned char**)((char*)xp->ptr + (dst-src)); xp->size = (int*)((char*)xp->size + (dst-src)); xp->type = (char**)((char*)xp->type + (dst-src)); xp->options = (char**)((char*)xp->options + (dst-src)); } } #endif } /******************************************************************************/ #ifndef WITH_NOIDREF static int soap_has_copies(struct soap *soap, const char *start, const char *end) { int i; struct soap_ilist *ip = NULL; struct soap_flist *fp = NULL; 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 (fp->type == ip->type && (const char*)fp->ptr >= start && (const char*)fp->ptr < end) return SOAP_ERR; } } return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_resolve(struct soap *soap) { int i; short flag; const char *id; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded refs\n")); for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { if (ip->ptr) { void **q; struct soap_flist *fp, **fpp = &ip->flist; if (ip->spine) ip->spine[0] = ip->ptr; q = (void**)ip->link; ip->link = NULL; DBGLOG(TEST, if (q) SOAP_MESSAGE(fdebug, "Traversing link chain to resolve id='%s' type=%d\n", ip->id, ip->type)); while (q) { void *p = *q; *q = ip->ptr; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... link %p -> %p\n", (void*)q, ip->ptr)); q = (void**)p; } while ((fp = *fpp)) { if (fp->level > 0 && fp->finsert) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... insert type=%d link %p -> %p\n", fp->type, fp->ptr, ip->ptr)); if (ip->spine && fp->level <= SOAP_MAXPTRS) fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, &ip->spine[fp->level - 1], &ip->smart); else if (fp->level == 1) fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, &ip->ptr, &ip->smart); else if (fp->level <= SOAP_MAXPTRS) { int i; ip->spine = (void**)soap_malloc(soap, SOAP_MAXPTRS * sizeof(void*)); if (!ip->spine) return soap->error = SOAP_EOM; ip->spine[0] = ip->ptr; for (i = 1; i < SOAP_MAXPTRS; i++) ip->spine[i] = &ip->spine[i - 1]; fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, &ip->spine[fp->level - 1], &ip->smart); } *fpp = fp->next; SOAP_FREE(soap, fp); } else fpp = &fp->next; } } else if (*ip->id == '#') { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Missing id='%s'\n", ip->id)); soap_strcpy(soap->id, sizeof(soap->id), ip->id + 1); return soap->error = SOAP_MISSING_ID; } } } do { flag = 0; id = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution phase\n")); for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { if (ip->copy || ip->flist) { if (ip->ptr && !soap_has_copies(soap, (const char*)ip->ptr, (const char*)ip->ptr + ip->size)) { struct soap_flist *fp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving id='%s' type=%d ptr=%p size=%lu ...\n", ip->id, ip->type, ip->ptr, (unsigned long)ip->size)); if (ip->copy) { 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, (void*)q, (unsigned int)ip->size)); p = *q; (void)soap_memcpy((void*)q, ip->size, (const void*)ip->ptr, ip->size); q = (void**)p; } while (q); flag = 1; } while ((fp = ip->flist)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded data type=%d target type=%d location=%p level=%u id='%s'\n", ip->type, fp->type, ip->ptr, fp->level, ip->id)); if (fp->level == 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... copy %p -> %p (%lu bytes)\n", ip->ptr, fp->ptr, (unsigned long)ip->size)); if (fp->finsert) fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, ip->ptr, &ip->smart); else (void)soap_memcpy((void*)fp->ptr, ip->size, (const void*)ip->ptr, ip->size); } ip->flist = fp->next; SOAP_FREE(soap, fp); flag = 1; } } else if (*ip->id == '#') id = ip->id; } } } } while (flag); if (id) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution error: forwarded data for id='%s' could not be propagated, please report this problem to the gSOAP developers\n", id)); return soap_id_nullify(soap, id); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution done\n")); return SOAP_OK; } #endif /******************************************************************************/ 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->head) { b->size -= b->head->size - n; b->head->size = n; } return b->size; } /******************************************************************************/ SOAP_FMAC1 char* SOAP_FMAC2 soap_first_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *p, *q, *r; if (!b) b = soap->blist; p = b->head; if (!p) return NULL; r = NULL; do { q = p->next; p->next = r; r = p; p = q; } while (p); b->head = r; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "First block %p\n", (void*)(r + 1))); return (char*)(r + 1); } /******************************************************************************/ SOAP_FMAC1 char* SOAP_FMAC2 soap_next_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *p; if (!b) b = soap->blist; p = b->head; if (p) { b->head = p->next; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Next block %p, deleting current block\n", (void*)(b->head ? b->head + 1 : NULL))); SOAP_FREE(soap, p); if (b->head) return (char*)(b->head + 1); } return NULL; } /******************************************************************************/ SOAP_FMAC1 size_t SOAP_FMAC2 soap_block_size(struct soap *soap, struct soap_blist *b) { if (!b) b = soap->blist; return b->head->size; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_end_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *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->head; p; p = q) { q = p->next; 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, "Restored previous block sequence\n")); #ifndef WITH_NOIDREF if (!soap->blist && ((soap->version && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH))) { int i; struct soap_ilist *ip = NULL; for (i = 0; i < SOAP_IDHASH; i++) for (ip = soap->iht[i]; ip; ip = ip->next) ip->shaky = 0; } #endif } /******************************************************************************/ SOAP_FMAC1 char* SOAP_FMAC2 soap_save_block(struct soap *soap, struct soap_blist *b, char *p, int flag) { size_t n; char *q, *s; if (!b) b = soap->blist; if (b->size) { if (!p) p = (char*)soap_malloc(soap, b->size); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Save all %lu blocks in contiguous memory space of %u bytes (%p->%p)\n", (unsigned long)b->item, (unsigned int)b->size, (void*)b->head, (void*)p)); if (p) { s = p; for (q = soap_first_block(soap, b); q; q = soap_next_block(soap, b)) { n = soap_block_size(soap, b); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy %u bytes from %p to %p\n", (unsigned int)n, (void*)q, (void*)s)); if (flag) soap_update_pointers(soap, s, q, n); (void)soap_memcpy((void*)s, n, (const void*)q, n); s += n; } } else soap->error = SOAP_EOM; } soap_end_block(soap, b); return p; } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_putsizesoffsets(struct soap *soap, const char *type, const int *size, const int *offset, int dim) { int i; const char *t = ",%d"; if (!type) return NULL; if (soap->version == 2) t = " %d"; if (soap->version != 2 && offset) { (SOAP_SNPRINTF(soap->type, sizeof(soap->type) - 1, strlen(type) + 20), "%s[%d", type, size[0] + offset[0]); for (i = 1; i < dim; i++) { size_t l = strlen(soap->type); (SOAP_SNPRINTF(soap->type + l, sizeof(soap->type) - l - 1, 20), t, size[i] + offset[i]); } } else { (SOAP_SNPRINTF(soap->type, sizeof(soap->type) - 1, strlen(type) + 20), "%s[%d", type, size[0]); for (i = 1; i < dim; i++) { size_t l = strlen(soap->type); (SOAP_SNPRINTF(soap->type + l, sizeof(soap->type) - l - 1, 20), t, size[i]); } } soap_strcat(soap->type, sizeof(soap->type), "]"); return soap->type; } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_putoffsets(struct soap *soap, const int *offset, int dim) { int i; soap->arrayOffset[0] = '\0'; if (soap->version == 1) { (SOAP_SNPRINTF(soap->arrayOffset, sizeof(soap->arrayOffset) - 1, 20), "[%d", offset[0]); for (i = 1; i < dim; i++) { size_t l = strlen(soap->arrayOffset); (SOAP_SNPRINTF(soap->arrayOffset + l, sizeof(soap->arrayOffset) - l - 1, 20), ",%d", offset[i]); } soap_strcat(soap->arrayOffset, sizeof(soap->arrayOffset), "]"); } return soap->arrayOffset; } /******************************************************************************/ SOAP_FMAC1 size_t SOAP_FMAC2 soap_size(const int *size, int dim) { int i; size_t n = 0; if (size[0] <= 0) return 0; n = (size_t)size[0]; for (i = 1; i < dim; i++) { if (size[i] <= 0) return 0; n *= (size_t)size[i]; } return (size_t)n; } /******************************************************************************/ SOAP_FMAC1 size_t SOAP_FMAC2 soap_getsizes(const char *attr, int *size, int dim) { size_t i, k, n; if (!*attr) return 0; i = strlen(attr); n = 1; do { for (; i > 0; i--) if (attr[i - 1] == '[' || attr[i - 1] == ',' || attr[i - 1] == ' ') break; n *= k = (size_t)soap_strtoul(attr + i, NULL, 10); size[--dim] = (int)k; if (n > SOAP_MAXARRAYSIZE) return 0; } while (dim > 0 && --i > 0 && attr[i] != '['); return n; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_getoffsets(const char *attr, const int *size, int *offset, int dim) { int i, j = 0; if (offset) { for (i = 0; i < dim && attr && *attr; i++) { attr++; j *= size[i]; j += offset[i] = (int)soap_strtol(attr, NULL, 10); attr = strchr(attr, ','); } } else { for (i = 0; i < dim && attr && *attr; i++) { attr++; j *= size[i]; j += (int)soap_strtol(attr, NULL, 10); attr = strchr(attr, ','); } } return j; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_getposition(const char *attr, int *pos) { int i, n; if (!*attr) return -1; n = 0; i = 1; do { pos[n++] = (int)soap_strtol(attr + i, NULL, 10); while (attr[i] && attr[i] != ',' && attr[i] != ']') i++; if (attr[i] == ',') i++; } while (n < SOAP_MAXDIMS && attr[i] && attr[i] != ']'); return n; } /******************************************************************************/ SOAP_FMAC1 struct soap_nlist * SOAP_FMAC2 soap_push_namespace(struct soap *soap, const char *id, const char *ns) { struct soap_nlist *np = NULL; struct Namespace *p; short i = -1; size_t n, k; n = strlen(id); k = strlen(ns) + 1; p = soap->local_namespaces; if (p) { for (i = 0; p->id; p++, i++) { if (p->ns && !strcmp(ns, p->ns)) break; if (p->out) { if (!strcmp(ns, p->out)) break; } else if (p->in) { if (!soap_tag_cmp(ns, p->in)) { if (SOAP_MAXALLOCSIZE <= 0 || k <= SOAP_MAXALLOCSIZE) p->out = (char*)SOAP_MALLOC(soap, k); if (p->out) soap_strcpy(p->out, k, ns); break; } } } if (!p->id) i = -1; } if (i >= 0) k = 0; if (sizeof(struct soap_nlist) + n + k > n && (SOAP_MAXALLOCSIZE <= 0 || sizeof(struct soap_nlist) + n + k <= SOAP_MAXALLOCSIZE)) np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k); if (!np) { soap->error = SOAP_EOM; return NULL; } np->next = soap->nlist; soap->nlist = np; np->level = soap->level; np->index = i; soap_strcpy((char*)np->id, n + 1, 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; soap_strcpy((char*)np->ns, k, 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 np; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_pop_namespace(struct soap *soap) { 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' level=%u\n", soap->level, np->id, np->level)); SOAP_FREE(soap, np); } soap->nlist = np; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_match_namespace(struct soap *soap, const char *id1, const char *id2, size_t n1, size_t n2) { struct soap_nlist *np = soap->nlist; const char *s; while (np && (strncmp(np->id, id1, n1) || np->id[n1])) np = np->next; if (np) { if (!(soap->mode & SOAP_XML_IGNORENS) && (n2 > 0 || !np->ns || *np->ns)) { if (np->index < 0 || ((s = soap->local_namespaces[np->index].id) && (strncmp(s, id2, n2) || (s[n2] && s[n2] != '_')))) return SOAP_NAMESPACE; } return SOAP_OK; } if (n1 == 0) return n2 == 0 || (soap->mode & SOAP_XML_IGNORENS) ? SOAP_OK : SOAP_NAMESPACE; if ((n1 == 3 && n1 == n2 && !strncmp(id1, "xml", 3) && !strncmp(id1, id2, 3)) || (soap->mode & SOAP_XML_IGNORENS)) return SOAP_OK; return soap->error = SOAP_SYNTAX_ERROR; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_current_namespace_tag(struct soap *soap, const char *tag) { struct soap_nlist *np; const char *s; if (!tag || !strncmp(tag, "xml", 3)) return NULL; np = soap->nlist; s = strchr(tag, ':'); if (!s) { 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) { s = np->ns; if (*s) return soap_strdup(soap, s); do np = np->next; while (np && *np->id); /* find if there is any other default namespace */ if (np) return soap_strdup(soap, s); } } return NULL; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_current_namespace_att(struct soap *soap, const char *tag) { struct soap_nlist *np; const char *s; if (!tag || !strncmp(tag, "xml", 3)) return NULL; s = strchr(tag, ':'); if (!s) return NULL; np = soap->nlist; 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 && *np->ns) return soap_strdup(soap, np->ns); } return NULL; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_tag_cmp(const char *s, const char *t) { const char *a = NULL; const char *b = NULL; for (;;) { int c1 = *s; int c2 = *t; if (!c1 || c1 == '"') break; if (c2 != '-') { if (c1 < c2) { if (c1 >= 'A' && c1 <= 'Z') c1 += 'a' - 'A'; } else if (c1 > c2) { if (c2 >= 'A' && c2 <= 'Z') c2 += 'a' - 'A'; } if (c2 == '*') { c2 = *++t; if (!c2) return 0; a = s; b = t; continue; } if (c1 != c2) { if (!a) return 1; s = ++a; t = b; continue; } } s++; t++; } if (*t == '*' && !t[1]) return 0; return *t; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_match_tag(struct soap *soap, const char *tag1, const char *tag2) { const char *s, *t; 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; if (t != tag2 && !(soap->mode & SOAP_XML_IGNORENS)) { err = soap_match_namespace(soap, tag1, tag2, s - tag1, t - tag2); if (err) { 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 (!t[1]) { if ((soap->mode & SOAP_XML_IGNORENS) || soap_match_namespace(soap, tag1, tag2, 0, t - tag2)) return SOAP_TAG_MISMATCH; } 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); if (err) { 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->mode & SOAP_XML_IGNORENS) || SOAP_STRCMP(s + 1, tag2)) /* always fails (except when ignoring ns) */ return SOAP_TAG_MISMATCH; } else if (SOAP_STRCMP(tag1, tag2) #ifndef WITH_NOEMPTYNAMESPACES || ((soap->mode & SOAP_XML_STRICT) && !(soap->mode & SOAP_XML_IGNORENS) && soap_match_namespace(soap, tag1, tag2, 0, 0)) /* strict checking: default namespace must be null namespace */ #endif ) { return SOAP_TAG_MISMATCH; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags match: '%s' '%s'\n", tag1, tag2)); return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_match_att(struct soap *soap, const char *tag1, const char *tag2) { const char *s, *t; 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; if (t != tag2 && !(soap->mode & SOAP_XML_IGNORENS)) { err = soap_match_namespace(soap, tag1, tag2, s - tag1, t - tag2); if (err) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Atts '%s' and '%s' match but namespaces differ\n", tag1, tag2)); if (err == SOAP_NAMESPACE) return SOAP_TAG_MISMATCH; return err; } } } else if (!t[1] || t != tag2 || SOAP_STRCMP(tag1, t + 1)) return SOAP_TAG_MISMATCH; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Atts and (default) namespaces match: '%s' '%s'\n", tag1, tag2)); return SOAP_OK; } if (s) { if (!(soap->mode & SOAP_XML_IGNORENS) || SOAP_STRCMP(s + 1, tag2)) /* always fails (except when ignoring ns) */ return SOAP_TAG_MISMATCH; } else if (SOAP_STRCMP(tag1, tag2)) return SOAP_TAG_MISMATCH; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Atts match: '%s' '%s'\n", tag1, tag2)); return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_match_array(struct soap *soap, const char *type) { if (type && *soap->arrayType) { if (soap->version == 1 || !strchr(type, '[')) { 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, "SOAP array type mismatch: '%s' '%s'\n", soap->arrayType, type)); return SOAP_TAG_MISMATCH; } } } return SOAP_OK; } /******************************************************************************\ * * SSL/TLS * \******************************************************************************/ #ifdef WITH_OPENSSL SOAP_FMAC1 int SOAP_FMAC2 soap_rand() { int r; if (!soap_ssl_init_done) soap_ssl_init(); #if OPENSSL_VERSION_NUMBER < 0x10100000L RAND_pseudo_bytes((unsigned char*)&r, sizeof(int)); #else RAND_bytes((unsigned char*)&r, sizeof(int)); #endif return r; } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) SOAP_FMAC1 int SOAP_FMAC2 #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid) #else 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) #endif { int err; soap->keyfile = keyfile; #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap->keyid = keyid; /* vxWorks compatible */ #endif soap->password = password; soap->cafile = cafile; soap->capath = capath; #ifdef WITH_OPENSSL soap->dhfile = dhfile; soap->randfile = randfile; if (!soap->fsslverify) soap->fsslverify = ssl_verify_callback; #endif soap->ssl_flags = flags | (dhfile == NULL ? SOAP_SSL_RSA : 0); #ifdef WITH_GNUTLS (void)randfile; (void)sid; if (dhfile) { char *s; int n = (int)soap_strtoul(dhfile, &s, 10); if (!soap->dh_params) gnutls_dh_params_init(&soap->dh_params); /* if dhfile is numeric, treat it as a key length to generate DH params which can take a while */ if (n >= 512 && s && *s == '\0') gnutls_dh_params_generate2(soap->dh_params, (unsigned int)n); else { unsigned int dparams_len; unsigned char dparams_buf[1024]; FILE *fd = fopen(dhfile, "r"); if (!fd) return soap_set_receiver_error(soap, "SSL/TLS error", "Invalid DH file", SOAP_SSL_ERROR); dparams_len = (unsigned int)fread(dparams_buf, 1, sizeof(dparams_buf), fd); fclose(fd); gnutls_datum_t dparams = { dparams_buf, dparams_len }; if (gnutls_dh_params_import_pkcs3(soap->dh_params, &dparams, GNUTLS_X509_FMT_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Invalid DH file", SOAP_SSL_ERROR); } } else { #if GNUTLS_VERSION_NUMBER < 0x030300 if (!soap->rsa_params) gnutls_rsa_params_init(&soap->rsa_params); gnutls_rsa_params_generate2(soap->rsa_params, SOAP_SSL_RSA_BITS); #endif } if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } #endif #ifdef WITH_SYSTEMSSL (void)randfile; (void)sid; if (soap->ctx) gsk_environment_close(&soap->ctx); #endif err = soap->fsslauth(soap); #ifdef WITH_OPENSSL if (!err) { if (sid) SSL_CTX_set_session_id_context(soap->ctx, (unsigned char*)sid, (unsigned int)strlen(sid)); else SSL_CTX_set_session_cache_mode(soap->ctx, SSL_SESS_CACHE_OFF); } #endif return err; } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) SOAP_FMAC1 int SOAP_FMAC2 #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *randfile) #else 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) #endif { soap->keyfile = keyfile; #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap->keyid = keyid; /* vxWorks compatible */ #endif soap->password = password; soap->cafile = cafile; soap->capath = capath; soap->ssl_flags = SOAP_SSL_CLIENT | flags; #ifdef WITH_OPENSSL soap->dhfile = NULL; soap->randfile = randfile; if (!soap->fsslverify) soap->fsslverify = (flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) == 0 ? ssl_verify_callback : ssl_verify_callback_allow_expired_certificate; #endif #ifdef WITH_GNUTLS (void)randfile; if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } #endif #ifdef WITH_SYSTEMSSL (void)randfile; if (soap->ctx) gsk_environment_close(&soap->ctx); #endif return soap->fsslauth(soap); } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_crl(struct soap *soap, const char *crlfile) { #ifdef WITH_OPENSSL if (crlfile && soap->ctx) { #if OPENSSL_VERSION_NUMBER > 0x00907000L X509_STORE *store = SSL_CTX_get_cert_store(soap->ctx); if (*crlfile) { int ret; X509_LOOKUP *lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file()); if (!lookup) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't create X509_LOOKUP object", SOAP_SSL_ERROR); ret = X509_load_crl_file(lookup, crlfile, X509_FILETYPE_PEM); if (ret <= 0) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CRL PEM file", SOAP_SSL_ERROR); } X509_STORE_set_flags(store, X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL); #endif } else soap->crlfile = crlfile; /* activate later when store is available */ #endif #ifdef WITH_GNUTLS if (crlfile && soap->xcred) { if (*crlfile) if (gnutls_certificate_set_x509_crl_file(soap->xcred, crlfile, GNUTLS_X509_FMT_PEM) < 0) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CRL PEM file", SOAP_SSL_ERROR); } else { soap->crlfile = crlfile; /* activate later when xcred is available */ } #endif return SOAP_OK; } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) SOAP_FMAC1 void SOAP_FMAC2 soap_ssl_init() { /* Note: for multi-threaded applications, the main program should call soap_ssl_init() before any threads are started */ if (!soap_ssl_init_done) { soap_ssl_init_done = 1; #ifdef WITH_OPENSSL SSL_library_init(); OpenSSL_add_all_algorithms(); /* we keep ciphers and digests for the program's lifetime */ #ifndef WITH_LEAN SSL_load_error_strings(); #endif #if !defined(WIN32) && !defined(CYGWIN) && !defined(__MINGW32__) && !defined(__MINGW64__) if (!RAND_load_file("/dev/urandom", 1024)) #else if (1) #endif { /* if /dev/urandom does not exist we need to do at least some pertubations to seed the OpenSSL PRNG */ char buf[1024]; RAND_seed(buf, sizeof(buf)); #ifdef HAVE_RANDOM srandom((unsigned long)time(NULL)); #else srand((unsigned int)time(NULL)); #endif do { #ifdef HAVE_RANDOM long r = random(); /* we actually do no use random() anywhere, except to help seed the OpenSSL PRNG */ RAND_seed(&r, sizeof(long)); #else int r = rand(); /* we actually do no use rand() anywhere, except to help seed the OpenSSL PRNG */ RAND_seed(&r, sizeof(int)); #endif } while (!RAND_status()); } #endif #ifdef WITH_GNUTLS # if GNUTLS_VERSION_NUMBER < 0x020b00 # if defined(HAVE_PTHREAD_H) gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread); # elif defined(HAVE_PTH_H) gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pth); # endif gcry_control(GCRYCTL_ENABLE_QUICK_RANDOM, 0); gcry_control(GCRYCTL_DISABLE_SECMEM, 0); gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); /* libgcrypt init done */ # endif # if GNUTLS_VERSION_NUMBER < 0x030300 gnutls_global_init(); # endif #endif } } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) SOAP_FMAC1 void SOAP_FMAC2 soap_ssl_noinit() { /* Call this first to bypass SSL init is SSL is already initialized elsewhere */ soap_ssl_init_done = 1; } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) SOAP_FMAC1 const char * SOAP_FMAC2 soap_ssl_error(struct soap *soap, int ret, int err) { #ifdef WITH_OPENSSL const char *msg = soap_code_str(h_ssl_error_codes, err); if (!msg) return ERR_error_string(err, soap->msgbuf); (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(msg) + 1), "%s\n", msg); if (ERR_peek_error()) { unsigned long r; while ((r = ERR_get_error())) { size_t l = strlen(soap->msgbuf); ERR_error_string_n(r, soap->msgbuf + l, sizeof(soap->msgbuf) - l); l = strlen(soap->msgbuf); if (l + 1 < sizeof(soap->msgbuf)) { soap->msgbuf[l++] = '\n'; soap->msgbuf[l] = '\0'; } if (ERR_GET_REASON(r) == SSL_R_CERTIFICATE_VERIFY_FAILED && l < sizeof(soap->msgbuf)) { const char *s = X509_verify_cert_error_string(SSL_get_verify_result(soap->ssl)); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, strlen(s)), "%s", s); } } } else { size_t l = strlen(soap->msgbuf); switch (ret) { case 0: soap_strcpy(soap->msgbuf + l, sizeof(soap->msgbuf) - l, "EOF was observed that violates the SSL/TLS protocol. The client probably provided invalid authentication information."); break; case -1: { const char *s = strerror(soap_errno); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, strlen(s) + 42), "Error observed by underlying SSL/TLS BIO: %s", s); } break; } } ERR_clear_error(); return soap->msgbuf; #endif #ifdef WITH_GNUTLS (void)soap; (void)err; return gnutls_strerror(ret); #endif } #endif /******************************************************************************/ #ifdef WITH_SYSTEMSSL static int ssl_recv(int sk, void *s, int n, char *user) { (void)user; return recv(sk, s, n, 0); } #endif /******************************************************************************/ #ifdef WITH_SYSTEMSSL static int ssl_send(int sk, void *s, int n, char *user) { (void)user; return send(sk, s, n, 0); } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) static int ssl_auth_init(struct soap *soap) { #ifdef WITH_OPENSSL #if OPENSSL_VERSION_NUMBER >= 0x10101000L int minv = 0, maxv = 0; #endif long flags = SSL_OP_ALL; int mode; #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) EVP_PKEY* pkey; /* vxWorks compatible */ #endif if (!soap_ssl_init_done) soap_ssl_init(); ERR_clear_error(); if (!soap->ctx) { #if OPENSSL_VERSION_NUMBER >= 0x10100000L /* TLS_method: a TLS/SSL connection established may understand the SSLv3, TLSv1, TLSv1.1 and TLSv1.2 protocols. */ soap->ctx = SSL_CTX_new(TLS_method()); #else /* SSLv23_method: a TLS/SSL connection established may understand the SSLv3, TLSv1, TLSv1.1 and TLSv1.2 protocols. */ soap->ctx = SSL_CTX_new(SSLv23_method()); #endif if (!soap->ctx) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't setup context", SOAP_SSL_ERROR); /* The following alters the behavior of SSL read/write: */ #if 0 SSL_CTX_set_mode(soap->ctx, SSL_MODE_ENABLE_PARTIAL_WRITE | SSL_MODE_AUTO_RETRY); #endif } if (soap->randfile) { if (!RAND_load_file(soap->randfile, -1)) return soap_set_receiver_error(soap, "SSL/TLS 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/TLS error", "Can't read CA PEM file", 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/TLS error", "Can't read default CA PEM file and/or directory", SOAP_SSL_ERROR); } if (soap->crlfile) { if (soap_ssl_crl(soap, soap->crlfile)) return soap->error; } /* This code assumes a typical scenario with key and cert in one PEM file, see alternative code below */ #if 1 if (soap->keyfile) { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't find or read certificate in private key PEM 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); } #ifndef WM_SECURE_KEY_STORAGE if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read private key PEM file", SOAP_SSL_ERROR); #endif } #else /* Suggested alternative approach to check the key file for cert only when 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) { if (soap->keyfile) { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't find or read certificate in private key PEM file", SOAP_SSL_ERROR); if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read private key PEM file", SOAP_SSL_ERROR); } } else /* use cafile for (server) cert and keyfile for (server) key */ { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->cafile)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CA PEM file", SOAP_SSL_ERROR); if (soap->keyfile) if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read private key PEM file", SOAP_SSL_ERROR); } #endif #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) /* vxWorks compatible */ pkey = ipcom_key_db_pkey_get(soap->keyid); if (!pkey) return soap_set_receiver_error(soap, "SSL error", "Can't find key", SOAP_SSL_ERROR); if (!SSL_CTX_use_PrivateKey(soap->ctx, pkey)) return soap_set_receiver_error(soap, "SSL error", "Can't read key", SOAP_SSL_ERROR); #endif if ((soap->ssl_flags & SOAP_SSL_RSA)) { #if OPENSSL_VERSION_NUMBER >= 0x10002000L if (SSL_CTX_need_tmp_RSA(soap->ctx)) { unsigned long e = RSA_F4; BIGNUM *bne = BN_new(); RSA *rsa = RSA_new(); if (!bne || !rsa || !BN_set_word(bne, e) || !RSA_generate_key_ex(rsa, SOAP_SSL_RSA_BITS, bne, NULL) || !SSL_CTX_set_tmp_rsa(soap->ctx, rsa)) { if (bne) BN_free(bne); if (rsa) RSA_free(rsa); return soap_set_receiver_error(soap, "SSL/TLS error", "Can't generate RSA key", SOAP_SSL_ERROR); } BN_free(bne); RSA_free(rsa); } #else RSA *rsa = RSA_generate_key(SOAP_SSL_RSA_BITS, RSA_F4, NULL, NULL); if (!rsa || !SSL_CTX_set_tmp_rsa(soap->ctx, rsa)) { if (rsa) RSA_free(rsa); return soap_set_receiver_error(soap, "SSL/TLS error", "Can't generate RSA key", SOAP_SSL_ERROR); } RSA_free(rsa); #endif } else if (soap->dhfile) { DH *dh = NULL; char *s; int n = (int)soap_strtoul(soap->dhfile, &s, 10); /* if dhfile is numeric, treat it as a key length to generate DH params which can take a while */ if (n >= 512 && s && *s == '\0') { #if OPENSSL_VERSION_NUMBER >= 0x10002000L dh = DH_new(); if (!DH_generate_parameters_ex(dh, n, 2/*or 5*/, NULL)) { DH_free(dh); return soap_set_receiver_error(soap, "SSL/TLS error", "Can't generate DH parameters", SOAP_SSL_ERROR); } #elif defined(VXWORKS) dh = DH_new(); DH_generate_parameters_ex(dh, n, 2/*or 5*/, NULL); #else dh = DH_generate_parameters(n, 2/*or 5*/, NULL, NULL); #endif } else { BIO *bio; bio = BIO_new_file(soap->dhfile, "r"); if (!bio) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read DH PEM file", SOAP_SSL_ERROR); dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL); BIO_free(bio); } if (!dh || DH_check(dh, &n) != 1 || SSL_CTX_set_tmp_dh(soap->ctx, dh) < 0) { if (dh) DH_free(dh); return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set DH parameters", SOAP_SSL_ERROR); } DH_free(dh); } /* enable all TSLv1 protocols and disable SSLv3 by default if no SSL/TLS flags are set */ if ((soap->ssl_flags & SOAP_SSLv3_TLSv1) == 0) soap->ssl_flags |= SOAP_TLSv1; #if OPENSSL_VERSION_NUMBER >= 0x10101000L if ((soap->ssl_flags & SOAP_SSLv3)) minv = SSL3_VERSION; else if ((soap->ssl_flags & SOAP_TLSv1_0)) minv = TLS1_VERSION; else if ((soap->ssl_flags & SOAP_TLSv1_1)) minv = TLS1_1_VERSION; else if ((soap->ssl_flags & SOAP_TLSv1_2)) minv = TLS1_2_VERSION; else if ((soap->ssl_flags & SOAP_TLSv1_3)) minv = TLS1_3_VERSION; if ((soap->ssl_flags & SOAP_TLSv1_3) && OpenSSL_version_num() >= 0x10101000L) maxv = TLS1_3_VERSION; else if ((soap->ssl_flags & SOAP_TLSv1_2)) maxv = TLS1_2_VERSION; else if ((soap->ssl_flags & SOAP_TLSv1_1)) maxv = TLS1_1_VERSION; else if ((soap->ssl_flags & SOAP_TLSv1_0)) maxv = TLS1_VERSION; else maxv = SSL3_VERSION; if (!SSL_CTX_set_min_proto_version(soap->ctx, minv) || !SSL_CTX_set_max_proto_version(soap->ctx, maxv)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set protocol version", SOAP_SSL_ERROR); #else /* disable SSL v2 by default and enable specific protos */ flags = SSL_OP_NO_SSLv2; if (!(soap->ssl_flags & SOAP_SSLv3)) flags |= SSL_OP_NO_SSLv3; #if OPENSSL_VERSION_NUMBER >= 0x10001000L if (!(soap->ssl_flags & SOAP_TLSv1_0)) flags |= SSL_OP_NO_TLSv1; if (!(soap->ssl_flags & SOAP_TLSv1_1)) flags |= SSL_OP_NO_TLSv1_1; if (!(soap->ssl_flags & SOAP_TLSv1_2)) flags |= SSL_OP_NO_TLSv1_2; #endif #endif #ifdef SSL_OP_NO_TICKET /* TLS extension is enabled by default in OPENSSL v0.9.8k disable it by */ flags |= SSL_OP_NO_TICKET; #endif 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 #endif #ifdef WITH_GNUTLS int ret; char priority[80]; soap_strcpy(priority, sizeof(priority), "PERFORMANCE"); if (!soap_ssl_init_done) soap_ssl_init(); if (!soap->xcred) { if (gnutls_certificate_allocate_credentials(&soap->xcred) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't allocate credentials or trust", SOAP_SSL_ERROR); #if GNUTLS_VERSION_NUMBER >= 0x030300 gnutls_certificate_set_x509_system_trust(soap->xcred); #endif if (soap->cafile) { if (gnutls_certificate_set_x509_trust_file(soap->xcred, soap->cafile, GNUTLS_X509_FMT_PEM) < 0) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CA PEM file", SOAP_SSL_ERROR); } if (soap->crlfile) { if (soap_ssl_crl(soap, soap->crlfile)) return soap->error; } if (soap->keyfile) { if (gnutls_certificate_set_x509_key_file2(soap->xcred, soap->keyfile, soap->keyfile, GNUTLS_X509_FMT_PEM, soap->password, GNUTLS_PKCS_PKCS12_3DES | GNUTLS_PKCS_PKCS12_ARCFOUR | GNUTLS_PKCS_PKCS12_RC2_40 | GNUTLS_PKCS_PBES2_AES_128 | GNUTLS_PKCS_PBES2_AES_192 | GNUTLS_PKCS_PBES2_AES_256 | GNUTLS_PKCS_PBES2_DES) < 0) /* Assumes that key and cert(s) are concatenated in the keyfile and the key is encrypted with one of these algorithms */ return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read private key PEM file", SOAP_SSL_ERROR); } } if ((soap->ssl_flags & SOAP_SSL_CLIENT)) { gnutls_init(&soap->session, GNUTLS_CLIENT); if (soap->cafile || soap->crlfile || soap->keyfile) { ret = gnutls_priority_set_direct(soap->session, "PERFORMANCE", NULL); if (ret != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, soap_ssl_error(soap, ret, 0), "SSL/TLS set priority error", SOAP_SSL_ERROR); gnutls_credentials_set(soap->session, GNUTLS_CRD_CERTIFICATE, soap->xcred); } else { if (!soap->acred) gnutls_anon_allocate_client_credentials(&soap->acred); ret = gnutls_priority_set_direct(soap->session, "PERFORMANCE:+ANON-DH:!ARCFOUR-128", NULL); if (ret != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, soap_ssl_error(soap, ret, 0), "SSL/TLS set priority error", SOAP_SSL_ERROR); gnutls_credentials_set(soap->session, GNUTLS_CRD_ANON, soap->acred); } } else if (!soap->keyfile) { return soap_set_receiver_error(soap, "SSL/TLS error", "No key file: anonymous server authentication not supported in this release", SOAP_SSL_ERROR); } else { #if GNUTLS_VERSION_NUMBER < 0x030300 int protocol_priority[] = { 0, 0, 0, 0, 0 }; int *protocol = protocol_priority; if ((soap->ssl_flags & SOAP_SSL_RSA) && soap->rsa_params) gnutls_certificate_set_rsa_export_params(soap->xcred, soap->rsa_params); #endif if (!(soap->ssl_flags & SOAP_SSL_RSA) && soap->dh_params) gnutls_certificate_set_dh_params(soap->xcred, soap->dh_params); if (!soap->cache) gnutls_priority_init(&soap->cache, "NORMAL", NULL); gnutls_init(&soap->session, GNUTLS_SERVER); gnutls_priority_set(soap->session, soap->cache); gnutls_credentials_set(soap->session, GNUTLS_CRD_CERTIFICATE, soap->xcred); if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) gnutls_certificate_server_set_request(soap->session, GNUTLS_CERT_REQUEST); gnutls_session_enable_compatibility_mode(soap->session); /* enable all TSLv1 protocols and disable SSLv3 by default if no SSL/TLS flags are set */ if ((soap->ssl_flags & SOAP_SSLv3_TLSv1) == 0) soap->ssl_flags |= SOAP_TLSv1; #if GNUTLS_VERSION_NUMBER < 0x030300 if ((soap->ssl_flags & SOAP_SSLv3)) *protocol++ = GNUTLS_SSL3; if ((soap->ssl_flags & SOAP_TLSv1_0)) *protocol++ = GNUTLS_TLS1_0; if ((soap->ssl_flags & SOAP_TLSv1_1)) *protocol++ = GNUTLS_TLS1_1; if ((soap->ssl_flags & SOAP_TLSv1_2)) *protocol++ = GNUTLS_TLS1_2; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set protocol", SOAP_SSL_ERROR); #else soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "NORMAL:+VERS-ALL"); if (!(soap->ssl_flags & SOAP_TLSv1_0)) soap_strcat(soap->tmpbuf, sizeof(soap->tmpbuf), ":-VERS-TLS1.0"); if (!(soap->ssl_flags & SOAP_TLSv1_1)) soap_strcat(soap->tmpbuf, sizeof(soap->tmpbuf), ":-VERS-TLS1.1"); if (!(soap->ssl_flags & SOAP_TLSv1_2)) soap_strcat(soap->tmpbuf, sizeof(soap->tmpbuf), ":-VERS-TLS1.2"); if (gnutls_priority_set_direct(soap->session, soap->tmpbuf, NULL) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set protocol priority", SOAP_SSL_ERROR); #endif } #endif #ifdef WITH_SYSTEMSSL if (!soap->ctx) { int err; err = gsk_environment_open(&soap->ctx); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_SSLV2, GSK_PROTOCOL_SSLV2_OFF); /* enable all TSLv1 protocols and disable SSLv3 by default if no SSL/TLS flags are set */ if ((soap->ssl_flags & SOAP_SSLv3_TLSv1) == 0) soap->ssl_flags |= SOAP_TLSv1; if (err == GSK_OK) { if ((soap->ssl_flags & SOAP_SSLv3)) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_SSLV3, GSK_PROTOCOL_SSLV3_ON); else err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_SSLV3, GSK_PROTOCOL_SSLV3_OFF); } if (err == GSK_OK) { if ((soap->ssl_flags & SOAP_TLSv1_0)) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_ON); else err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_OFF); } if (err == GSK_OK) { if ((soap->ssl_flags & SOAP_TLSv1_1)) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_1_ON); else err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_1_OFF); } if (err == GSK_OK) { if ((soap->ssl_flags & SOAP_TLSv1_2)) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_2_ON); else err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_2_OFF); } if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ctx, GSK_KEYRING_FILE, soap->keyfile, 0); /* keyfile is a keyring .kdb file */ if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ctx, GSK_KEYRING_PW, soap->password, 0); /* locked by password */ if (err == GSK_OK) err = gsk_environment_init(soap->ctx); if (err != GSK_OK) return soap_set_receiver_error(soap, gsk_strerror(err), "SYSTEM SSL error in ssl_auth_init()", SOAP_SSL_ERROR); } #endif return SOAP_OK; } #endif /******************************************************************************/ #ifdef WITH_OPENSSL static int ssl_password(char *buf, int num, int rwflag, void *userdata) { (void)rwflag; if (!buf || !userdata) return 0; soap_strcpy(buf, (size_t)num, (char*)userdata); return (int)strlen(buf); } #endif /******************************************************************************/ #ifdef WITH_OPENSSL static int ssl_verify_callback(int ok, X509_STORE_CTX *store) { (void)store; #ifdef SOAP_DEBUG if (!ok) { char buf[1024]; int err = X509_STORE_CTX_get_error(store); X509 *cert = X509_STORE_CTX_get_current_cert(store); fprintf(stderr, "\nDEBUG mode TLS/SSL warnings:\nSSL verify error %d or warning with certificate at depth %d: %s\n", err, X509_STORE_CTX_get_error_depth(store), X509_verify_cert_error_string(err)); X509_NAME_oneline(X509_get_issuer_name(cert), buf, sizeof(buf)-1); fprintf(stderr, " certificate issuer: %s\n", buf); X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)-1); fprintf(stderr, " certificate subject: %s\n", buf); /* accept self-signed certificates and certificates out of date */ switch (err) { case X509_V_ERR_CERT_NOT_YET_VALID: case X509_V_ERR_CERT_HAS_EXPIRED: case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: case X509_V_ERR_UNABLE_TO_GET_CRL: case X509_V_ERR_CRL_NOT_YET_VALID: case X509_V_ERR_CRL_HAS_EXPIRED: X509_STORE_CTX_set_error(store, X509_V_OK); ok = 1; fprintf(stderr, "Initialize soap_ssl_client_context with SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE to allow this verification error to pass without DEBUG mode enabled\n"); } } #endif /* Note: return 1 to try to continue, but unsafe progress will be terminated by OpenSSL */ return ok; } #endif /******************************************************************************/ #ifdef WITH_OPENSSL static int ssl_verify_callback_allow_expired_certificate(int ok, X509_STORE_CTX *store) { ok = ssl_verify_callback(ok, store); if (!ok) { /* accept self signed certificates, expired certificates, and certficiates w/o CRL */ switch (X509_STORE_CTX_get_error(store)) { case X509_V_ERR_CERT_NOT_YET_VALID: case X509_V_ERR_CERT_HAS_EXPIRED: case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: case X509_V_ERR_UNABLE_TO_GET_CRL: case X509_V_ERR_CRL_NOT_YET_VALID: case X509_V_ERR_CRL_HAS_EXPIRED: 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 /******************************************************************************/ #ifdef WITH_GNUTLS static const char * ssl_verify(struct soap *soap, const char *host) { unsigned int status; const char *err = NULL; int r = gnutls_certificate_verify_peers2(soap->session, &status); if (r < 0) err = "Certificate verify error"; else if ((status & GNUTLS_CERT_INVALID)) err = "The certificate is not trusted"; else if ((status & GNUTLS_CERT_SIGNER_NOT_FOUND)) err = "The certificate hasn't got a known issuer"; else if ((status & GNUTLS_CERT_REVOKED)) err = "The certificate has been revoked"; else if (gnutls_certificate_type_get(soap->session) == GNUTLS_CRT_X509) { gnutls_x509_crt_t cert; const gnutls_datum_t *cert_list; unsigned int cert_list_size; if (gnutls_x509_crt_init(&cert) < 0) err = "Could not get X509 certificates"; else if ((cert_list = gnutls_certificate_get_peers(soap->session, &cert_list_size)) == NULL) err = "Could not get X509 certificates"; else if (gnutls_x509_crt_import(cert, &cert_list[0], GNUTLS_X509_FMT_DER) < 0) err = "Error parsing X509 certificate"; else if (!(soap->ssl_flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) && gnutls_x509_crt_get_expiration_time(cert) < time(NULL)) err = "The certificate has expired"; else if (!(soap->ssl_flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) && gnutls_x509_crt_get_activation_time(cert) > time(NULL)) err = "The certificate is not yet activated"; else if (host && !(soap->ssl_flags & SOAP_SSL_SKIP_HOST_CHECK)) { if (!gnutls_x509_crt_check_hostname(cert, host)) err = "Certificate host name mismatch"; } gnutls_x509_crt_deinit(cert); } return err; } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef WITH_NOIO SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_accept(struct soap *soap) { SOAP_SOCKET sk = soap->socket; #ifdef WITH_OPENSSL BIO *bio; int err = SSL_ERROR_NONE; int retries, r, s; ERR_clear_error(); if (!soap_valid_socket(sk)) return soap_set_receiver_error(soap, "SSL/TLS error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR); soap->ssl_flags &= ~SOAP_SSL_CLIENT; if (!soap->ctx && (soap->error = soap->fsslauth(soap)) != SOAP_OK) return soap_closesock(soap); if (!soap->ssl) { soap->ssl = SSL_new(soap->ctx); if (!soap->ssl) { soap_closesock(soap); return soap_set_receiver_error(soap, "SSL/TLS error", "SSL_new() failed in soap_ssl_accept()", SOAP_SSL_ERROR); } } else { SSL_clear(soap->ssl); } bio = BIO_new_socket((int)sk, BIO_NOCLOSE); SSL_set_bio(soap->ssl, bio, bio); /* Default timeout: 10 sec retries, 100 times 0.1 sec */ retries = 100; if (soap->recv_timeout || soap->send_timeout) { int t = soap->recv_timeout > soap->send_timeout ? soap->recv_timeout : soap->send_timeout; if (t > 0) retries = 10 * t; else if (t > -100000) retries = 1; else retries = t/-100000; } SOAP_SOCKNONBLOCK(sk) while ((r = SSL_accept(soap->ssl)) <= 0) { err = SSL_get_error(soap->ssl, r); if (err == SSL_ERROR_WANT_ACCEPT || err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) { if (err == SSL_ERROR_WANT_READ) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; } else { soap->errnum = soap_socket_errno(sk); break; } if (retries-- <= 0) break; } if (!soap->recv_timeout && !soap->send_timeout) SOAP_SOCKBLOCK(sk) if (r <= 0) { soap_set_receiver_error(soap, soap_ssl_error(soap, r, err), "SSL_accept() failed in soap_ssl_accept()", SOAP_SSL_ERROR); return soap_closesock(soap); } 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/TLS error", "No SSL certificate was presented by the peer in soap_ssl_accept()", SOAP_SSL_ERROR); } X509_free(peer); } #endif #ifdef WITH_GNUTLS int retries, r, s; if (!soap_valid_socket(sk)) return soap_set_receiver_error(soap, "SSL/TLS error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR); soap->ssl_flags &= ~SOAP_SSL_CLIENT; if (!soap->session && (soap->error = soap->fsslauth(soap)) != SOAP_OK) return soap_closesock(soap); gnutls_transport_set_ptr(soap->session, (gnutls_transport_ptr_t)(long)sk); /* default timeout: 10 sec retries, 100 times 0.1 sec */ retries = 100; if (soap->recv_timeout || soap->send_timeout) { int t = soap->recv_timeout > soap->send_timeout ? soap->recv_timeout : soap->send_timeout; if (t > 0) retries = 10 * t; else if (t > -100000) retries = 1; else retries = t/-100000; } SOAP_SOCKNONBLOCK(sk) while ((r = gnutls_handshake(soap->session))) { /* GNUTLS repeat handhake when GNUTLS_E_AGAIN */ if (r == GNUTLS_E_AGAIN || r == GNUTLS_E_INTERRUPTED) { if (!gnutls_record_get_direction(soap->session)) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; } else { soap->errnum = soap_socket_errno(sk); break; } if (retries-- <= 0) break; } if (!soap->recv_timeout && !soap->send_timeout) SOAP_SOCKBLOCK(sk) if (r) { soap_set_receiver_error(soap, soap_ssl_error(soap, r, 0), "SSL/TLS handshake failed", SOAP_SSL_ERROR); return soap_closesock(soap); } if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) { const char *err = ssl_verify(soap, NULL); if (err) { soap_closesock(soap); return soap_set_receiver_error(soap, "SSL/TLS error", err, SOAP_SSL_ERROR); } } #endif #ifdef WITH_SYSTEMSSL gsk_iocallback local_io = { ssl_recv, ssl_send, NULL, NULL, NULL, NULL }; int retries, r, s; if (!soap_valid_socket(sk)) return soap_set_receiver_error(soap, "SSL/TLS error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR); soap->ssl_flags &= ~SOAP_SSL_CLIENT; /* default timeout: 10 sec retries, 100 times 0.1 sec */ retries = 100; if (soap->recv_timeout || soap->send_timeout) { int t = soap->recv_timeout > soap->send_timeout ? soap->recv_timeout : soap->send_timeout; if (t > 0) retries = 10 * t; else if (t > -100000) retries = 1; else retries = t/-100000; } SOAP_SOCKNONBLOCK(sk) r = gsk_secure_socket_open(soap->ctx, &soap->ssl); if (r == GSK_OK) r = gsk_attribute_set_numeric_value(soap->ssl, GSK_FD, sk); if (r == GSK_OK) r = gsk_attribute_set_buffer(soap->ssl, GSK_KEYRING_LABEL, soap->cafile, 0); if (r == GSK_OK) r = gsk_attribute_set_enum(soap->ssl, GSK_SESSION_TYPE, GSK_SERVER_SESSION); if (r == GSK_OK) r = gsk_attribute_set_buffer(soap->ssl, GSK_V3_CIPHER_SPECS_EXPANDED, "0035002F000A", 0); if (r == GSK_OK) r = gsk_attribute_set_enum(soap->ssl, GSK_V3_CIPHERS, GSK_V3_CIPHERS_CHAR4); if (r == GSK_OK) r = gsk_attribute_set_callback(soap->ssl, GSK_IO_CALLBACK, &local_io); if (r != GSK_OK) return soap_set_receiver_error(soap, gsk_strerror(r), "SYSTEM SSL error in soap_ssl_accept()", SOAP_SSL_ERROR); while ((r = gsk_secure_socket_init(soap->ssl)) != GSK_OK) { if (r == GSK_WOULD_BLOCK_READ || r == GSK_WOULD_BLOCK_WRITE) { if (r == GSK_WOULD_BLOCK_READ) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; } else { soap->errnum = soap_socket_errno(sk); break; } if (retries-- <= 0) break; } if (!soap->recv_timeout && !soap->send_timeout) SOAP_SOCKBLOCK(sk) if (r != GSK_OK) { soap_set_receiver_error(soap, gsk_strerror(r), "gsk_secure_socket_init() failed in soap_ssl_accept()", SOAP_SSL_ERROR); return soap_closesock(soap); } #endif soap->imode |= SOAP_ENC_SSL; soap->omode |= SOAP_ENC_SSL; return SOAP_OK; } #endif #endif /******************************************************************************\ * * TCP/UDP [SSL/TLS] IPv4 and IPv6 * \******************************************************************************/ #ifndef WITH_NOIO 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 /******************************************************************************/ #ifndef WITH_NOIO static const char* tcp_error(struct soap *soap) { 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 { (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), 37), "TCP/UDP IP error %d", soap->errnum); msg = soap->msgbuf; } } } return msg; } #endif /******************************************************************************/ #if !defined(WITH_IPV6) || defined(WITH_COOKIES) #ifndef WITH_NOIO static int tcp_gethostbyname(struct soap *soap, const char *addr, struct hostent *hostent, struct in_addr *inaddr) { #if (defined(_AIX43) || defined(TRU64) || defined(HP_UX)) && defined(HAVE_GETHOSTBYNAME_R) struct hostent_data ht_data; #elif (!defined(__GLIBC__) || !defined(_GNU_SOURCE) || (!_GNU_SOURCE && !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || defined(__ANDROID__) || defined(FREEBSD) || defined(__FreeBSD__)) && defined(HAVE_GETHOSTBYNAME_R) int r; char *tmpbuf = soap->tmpbuf; size_t tmplen = sizeof(soap->tmpbuf); #elif defined(HAVE_GETHOSTBYNAME_R) char *tmpbuf = soap->tmpbuf; size_t tmplen = sizeof(soap->tmpbuf); #endif #ifdef VXWORKS int hostint; /* vxWorks compatible */ #endif if (inaddr) { soap_int32 iadd = -1; #ifdef AS400 iadd = inet_addr((void*)addr); #else iadd = inet_addr((char*)addr); #endif if (iadd != -1) { if (soap_memcpy((void*)inaddr, sizeof(struct in_addr), (const void*)&iadd, sizeof(iadd))) return soap->error = SOAP_EOM; return SOAP_OK; } } #if (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) { hostent = NULL; soap->errnum = h_errno; } #elif (!defined(__GLIBC__) || !defined(_GNU_SOURCE) || (!_GNU_SOURCE && !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || defined(__ANDROID__) || defined(FREEBSD) || defined(__FreeBSD__)) && defined(HAVE_GETHOSTBYNAME_R) while ((r = gethostbyname_r(addr, hostent, tmpbuf, tmplen, &hostent, &soap->errnum)) < 0) { if (tmpbuf != soap->tmpbuf) SOAP_FREE(soap, tmpbuf); if (r != SOAP_ERANGE) { hostent = NULL; break; } tmplen *= 2; tmpbuf = (char*)SOAP_MALLOC(soap, tmplen); if (!tmpbuf) break; } #elif defined(HAVE_GETHOSTBYNAME_R) hostent = gethostbyname_r(addr, hostent, tmpbuf, tmplen, &soap->errnum); #elif defined(VXWORKS) /* vxWorks compatible */ /* 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) { hostent = NULL; soap->errnum = soap_errno; } #else #ifdef AS400 hostent = gethostbyname((void*)addr); #else hostent = gethostbyname((char*)addr); #endif if (!hostent) soap->errnum = h_errno; #endif if (!hostent) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Host name not found\n")); return SOAP_ERR; } if (inaddr) { #ifdef VXWORKS inaddr->s_addr = hostint; /* vxWorks compatible */ #else if (soap_memcpy((void*)inaddr, sizeof(struct in_addr), (const void*)hostent->h_addr, (size_t)hostent->h_length)) { #if (!defined(__GLIBC__) || !defined(_GNU_SOURCE) || (!_GNU_SOURCE && !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || defined(__ANDROID__) || defined(FREEBSD) || defined(__FreeBSD__)) && defined(HAVE_GETHOSTBYNAME_R) if (tmpbuf && tmpbuf != soap->tmpbuf) SOAP_FREE(soap, tmpbuf); #endif return soap->error = SOAP_EOM; } #endif } #if (!defined(__GLIBC__) || !defined(_GNU_SOURCE) || (!_GNU_SOURCE && !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || defined(__ANDROID__) || defined(FREEBSD) || defined(__FreeBSD__)) && defined(HAVE_GETHOSTBYNAME_R) if (tmpbuf && tmpbuf != soap->tmpbuf) SOAP_FREE(soap, tmpbuf); #endif return SOAP_OK; } #endif #endif /******************************************************************************/ #if !defined(WITH_IPV6) #ifndef WITH_NOIO static int tcp_gethost(struct soap *soap, const char *addr, struct in_addr *inaddr) { struct hostent hostent; return tcp_gethostbyname(soap, addr, &hostent, inaddr); } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO 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 sk; int err = 0; #ifndef WITH_LEAN int set = 1; #endif #if !defined(WITH_LEAN) || defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) int retries; #endif soap->errnum = 0; soap->errmode = 0; if (soap_valid_socket(soap->socket)) { if ((soap->omode & SOAP_IO_UDP) && soap->socket == soap->master) { #ifdef IP_MULTICAST_TTL #ifndef WITH_IPV6 soap->errmode = 2; if (soap->fresolve(soap, host, &soap->peer.in.sin_addr)) { soap_set_receiver_error(soap, tcp_error(soap), "get host by name failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, soap->socket); return soap->socket = SOAP_INVALID_SOCKET; } soap->peer.in.sin_port = htons((short)port); soap->errmode = 0; #else if (getaddrinfo(host, soap_int2s(soap, port), &hints, &res) || !res) { soap_set_receiver_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, soap->socket); return soap->socket = SOAP_INVALID_SOCKET; } if (soap_memcpy((void*)&soap->peer.storage, sizeof(soap->peer.storage), (const void*)res->ai_addr, res->ai_addrlen)) { soap->error = SOAP_EOM; soap->fclosesocket(soap, soap->socket); freeaddrinfo(res); return soap->socket = SOAP_INVALID_SOCKET; } soap->peerlen = res->ai_addrlen; freeaddrinfo(res); #endif if (soap->ipv4_multicast_ttl) { unsigned char ttl = soap->ipv4_multicast_ttl; if (setsockopt(soap->socket, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl, sizeof(ttl))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_TTL failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, soap->socket); return soap->socket = SOAP_INVALID_SOCKET; } } if (soap->ipv4_multicast_if && !soap->ipv6_multicast_if) { if (setsockopt(soap->socket, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) #ifndef WINDOWS { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, soap->socket); return soap->socket = SOAP_INVALID_SOCKET; } #else #ifndef IP_MULTICAST_IF #define IP_MULTICAST_IF 2 #endif if (setsockopt(soap->socket, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, soap->socket); return soap->socket = SOAP_INVALID_SOCKET; } #endif } #endif return soap->socket; } soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; } if (tcp_init(soap)) { soap_set_receiver_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 || !res) { soap_set_receiver_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in tcp_connect()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } ressave = res; again: sk = soap->socket = socket(res->ai_family, res->ai_socktype, res->ai_protocol); soap->error = SOAP_OK; soap->errmode = 0; #else #ifndef WITH_LEAN again: #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) sk = soap->socket = socket(AF_INET, SOCK_DGRAM, 0); else #endif sk = soap->socket = socket(AF_INET, SOCK_STREAM, 0); #endif if (!soap_valid_socket(sk)) { #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } #endif soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "socket failed in tcp_connect()", SOAP_TCP_ERROR); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #ifdef WITH_SOCKET_CLOSE_ON_EXIT #ifdef WIN32 #ifndef UNDER_CE SetHandleInformation((HANDLE)sk, HANDLE_FLAG_INHERIT, 0); #endif #else fcntl(sk, 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(sk, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_LINGER failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return soap->socket = SOAP_INVALID_SOCKET; } } if ((soap->connect_flags & ~SO_LINGER) && setsockopt(sk, SOL_SOCKET, soap->connect_flags & ~SO_LINGER, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #ifndef UNDER_CE if ((soap->keep_alive || soap->tcp_keep_alive) && setsockopt(sk, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } if (soap->sndbuf > 0 && setsockopt(sk, SOL_SOCKET, SO_SNDBUF, (char*)&soap->sndbuf, sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } if (soap->rcvbuf > 0 && setsockopt(sk, SOL_SOCKET, SO_RCVBUF, (char*)&soap->rcvbuf, sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #ifdef TCP_KEEPIDLE if (soap->tcp_keep_idle && setsockopt(sk, IPPROTO_TCP, TCP_KEEPIDLE, (char*)&(soap->tcp_keep_idle), sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_KEEPIDLE failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #endif #ifdef TCP_KEEPINTVL if (soap->tcp_keep_intvl && setsockopt(sk, IPPROTO_TCP, TCP_KEEPINTVL, (char*)&(soap->tcp_keep_intvl), sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_KEEPINTVL failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #endif #ifdef TCP_KEEPCNT if (soap->tcp_keep_cnt && setsockopt(sk, IPPROTO_TCP, TCP_KEEPCNT, (char*)&(soap->tcp_keep_cnt), sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_KEEPCNT failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #endif #ifdef TCP_NODELAY if (!(soap->omode & SOAP_IO_UDP) && setsockopt(sk, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = 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; } #endif #endif #ifdef IP_MULTICAST_TTL if ((soap->omode & SOAP_IO_UDP)) { if (soap->ipv4_multicast_ttl) { unsigned char ttl = soap->ipv4_multicast_ttl; if (setsockopt(sk, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl, sizeof(ttl))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_TTL failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } } if ((soap->omode & SOAP_IO_UDP) && soap->ipv4_multicast_if && !soap->ipv6_multicast_if) { if (setsockopt(sk, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) #ifndef WINDOWS { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #else #ifndef IP_MULTICAST_IF #define IP_MULTICAST_IF 2 #endif if (setsockopt(sk, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #endif } } #endif #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Opening socket=%d to host='%s' port=%d\n", (int)sk, host, port)); #ifndef WITH_IPV6 soap->peerlen = sizeof(soap->peer.in); memset((void*)&soap->peer.in, 0, sizeof(soap->peer.in)); soap->peer.in.sin_family = AF_INET; #ifndef WIN32 if (soap->client_addr) { struct sockaddr_in addr; memset((void*)&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; if (soap->client_port >= 0) addr.sin_port = htons(soap->client_port); if (inet_pton(AF_INET, soap->client_addr, (void*)&addr.sin_addr) != 1 || bind(sk, (struct sockaddr*)&addr, sizeof(addr))) { soap->errnum = soap_socket_errno(sk); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind before connect\n")); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); soap->client_addr = NULL; soap->client_port = -1; return soap->socket = SOAP_INVALID_SOCKET; } soap->client_addr = NULL; /* disable bind before connect, so need to set it again before the next connect */ soap->client_port = -1; /* disable bind before connect, so need to set it again before the next connect */ } else #endif if (soap->client_port >= 0) { struct sockaddr_in addr; memset((void*)&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(soap->client_port); if (bind(sk, (struct sockaddr*)&addr, sizeof(addr))) { soap->errnum = soap_socket_errno(sk); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind before connect\n")); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); soap->client_port = -1; return soap->socket = SOAP_INVALID_SOCKET; } soap->client_port = -1; /* disable bind before connect, so need to set it again before the next connect */ } #ifndef WIN32 if (soap->client_interface) { if (inet_pton(AF_INET, soap->client_interface, &soap->peer.in.sin_addr) != 1) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "inet_pton() failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); soap->client_interface = NULL; return soap->socket = SOAP_INVALID_SOCKET; } soap->client_interface = NULL; /* disable client interface, so need to set it again before the next connect */ } #endif soap->errmode = 2; if (soap->proxy_host) { if (soap->fresolve(soap, soap->proxy_host, &soap->peer.in.sin_addr)) { soap_set_receiver_error(soap, tcp_error(soap), "get proxy host by name failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } soap->peer.in.sin_port = htons((short)soap->proxy_port); } else { if (soap->fresolve(soap, host, &soap->peer.in.sin_addr)) { soap_set_receiver_error(soap, tcp_error(soap), "get host by name failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } soap->peer.in.sin_port = htons((short)port); } soap->errmode = 0; #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) return sk; #endif #else #ifndef WIN32 if (soap->client_addr) { struct sockaddr_in6 addr; memset((void*)&addr, 0, sizeof(addr)); addr.sin6_family = AF_INET6; if ((soap->client_addr_ipv6 && res->ai_family == AF_INET6 && inet_pton(AF_INET6, soap->client_addr_ipv6, (void*)&addr.sin6_addr.s6_addr) == 1) || (!soap->client_addr_ipv6 && inet_pton(AF_INET6, soap->client_addr, (void*)&addr.sin6_addr.s6_addr) == 1) ) { if (soap->client_port >= 0) addr.sin6_port = htons(soap->client_port); if (bind(sk, (struct sockaddr*)&addr, sizeof(addr))) { soap->errnum = soap_socket_errno(sk); freeaddrinfo(ressave); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind before connect\n")); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); soap->client_addr = NULL; soap->client_addr_ipv6 = NULL; soap->client_port = -1; return soap->socket = SOAP_INVALID_SOCKET; } } else /* not an IPv6 address, must be IPv4 */ { struct sockaddr_in addr; memset((void*)&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; if (soap->client_port >= 0) addr.sin_port = htons(soap->client_port); if (inet_pton(AF_INET, soap->client_addr, (void*)&addr.sin_addr) != 1 || bind(sk, (struct sockaddr*)&addr, sizeof(addr))) { soap->errnum = soap_socket_errno(sk); freeaddrinfo(ressave); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind before connect\n")); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); soap->client_addr = NULL; soap->client_addr_ipv6 = NULL; soap->client_port = -1; return soap->socket = SOAP_INVALID_SOCKET; } } soap->client_addr = NULL; /* disable bind before connect, so need to set it again before the next connect */ soap->client_addr_ipv6 = NULL; /* disable bind before connect, so need to set it again before the next connect */ soap->client_port = -1; /* disable bind before connect, so need to set it again before the next connect */ } else #endif if (soap->client_port >= 0) { struct sockaddr_in6 addr; memset((void*)&addr, 0, sizeof(addr)); addr.sin6_family = AF_INET6; addr.sin6_port = htons(soap->client_port); if (bind(sk, (struct sockaddr*)&addr, sizeof(addr))) { soap->errnum = soap_socket_errno(sk); freeaddrinfo(ressave); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind before connect\n")); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); soap->client_port = -1; return soap->socket = SOAP_INVALID_SOCKET; } soap->client_port = -1; /* disable bind before connect, so need to set it again before the next connect */ } #ifndef WIN32 if (soap->client_interface) { if (inet_pton(AF_INET6, soap->client_interface, res->ai_addr) != 1) { if (inet_pton(AF_INET, soap->client_interface, res->ai_addr) != 1) { soap->errnum = soap_socket_errno(sk); freeaddrinfo(ressave); soap_set_receiver_error(soap, tcp_error(soap), "inet_pton() failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); soap->client_interface = NULL; return soap->socket = SOAP_INVALID_SOCKET; } } soap->client_interface = NULL; /* disable client interface, so need to set it again before the next connect */ } #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) { if (soap_memcpy((void*)&soap->peer.storage, sizeof(soap->peer.storage), (const void*)res->ai_addr, res->ai_addrlen)) { soap->error = SOAP_EOM; soap->fclosesocket(soap, sk); soap->socket = sk = SOAP_INVALID_SOCKET; } soap->peerlen = res->ai_addrlen; freeaddrinfo(ressave); return sk; } #endif #endif #ifndef WITH_LEAN if (soap->connect_timeout) SOAP_SOCKNONBLOCK(sk) else SOAP_SOCKBLOCK(sk) retries = 10; #endif for (;;) { #ifdef WITH_IPV6 if (connect(sk, res->ai_addr, (int)res->ai_addrlen)) #else if (connect(sk, &soap->peer.addr, sizeof(soap->peer.in))) #endif { err = soap_socket_errno(sk); #ifdef WITH_IPV6 if (err == SOAP_ECONNREFUSED && res->ai_next) { soap->fclosesocket(soap, sk); res = res->ai_next; goto again; } #endif #ifndef WITH_LEAN if (err == SOAP_EADDRINUSE) { soap->fclosesocket(soap, sk); if (retries-- > 0) goto again; } else if (soap->connect_timeout && (err == SOAP_EINPROGRESS || err == SOAP_EAGAIN || err == SOAP_EWOULDBLOCK)) { SOAP_SOCKLEN_T k; for (;;) { int r; #ifdef WITH_SELF_PIPE r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_PIP, soap->connect_timeout); if ((r & SOAP_TCP_SELECT_PIP)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connection closed by self pipe\n")); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #else r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND, soap->connect_timeout); #endif if (r > 0) break; if (!r) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connect timeout\n")); soap_set_receiver_error(soap, "Timeout", "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } freeaddrinfo(ressave); #endif return soap->socket = SOAP_INVALID_SOCKET; } r = soap->errnum = soap_socket_errno(sk); if (r != SOAP_EINTR) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); soap_set_receiver_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } freeaddrinfo(ressave); #endif return soap->socket = SOAP_INVALID_SOCKET; } } k = (SOAP_SOCKLEN_T)sizeof(soap->errnum); if (!getsockopt(sk, 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(sk); soap_set_receiver_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } freeaddrinfo(ressave); #endif return soap->socket = SOAP_INVALID_SOCKET; } #endif #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; soap->fclosesocket(soap, sk); goto again; } #endif if (err && err != SOAP_EINTR) { soap->errnum = err; #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); soap_set_receiver_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } } else { break; } } #ifdef WITH_IPV6 soap->peerlen = 0; /* IPv6: already connected so use send() */ freeaddrinfo(ressave); #endif soap->imode &= ~SOAP_ENC_SSL; soap->omode &= ~SOAP_ENC_SSL; if (endpoint && !soap_tag_cmp(endpoint, "https:*")) { #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) #ifdef WITH_OPENSSL BIO *bio; #endif #ifdef WITH_SYSTEMSSL gsk_iocallback local_io = { ssl_recv, ssl_send, NULL, NULL, NULL, NULL }; #endif int r; if (soap->proxy_host) { soap_mode m = soap->mode; /* preserve settings */ soap_mode om = soap->omode; /* make sure we only parse HTTP */ ULONG64 n = soap->count; /* save the content length */ const char *userid, *passwd; int status = soap->status; /* save the current status/command */ int keep_alive = soap->keep_alive; /* save the KA status */ soap->omode &= ~SOAP_ENC; /* mask IO and ENC */ soap->omode |= SOAP_IO_BUFFER; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connecting to %s proxy server %s for destination endpoint %s\n", soap->proxy_http_version, soap->proxy_host, endpoint)); #ifdef WITH_NTLM if (soap->ntlm_challenge && soap_ntlm_handshake(soap, SOAP_CONNECT, endpoint, host, port)) { soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #endif if (soap_init_send(soap)) { soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } soap->status = SOAP_CONNECT; if (!soap->keep_alive) soap->keep_alive = -1; /* must keep alive */ soap->error = soap->fpost(soap, endpoint, host, port, NULL, NULL, 0); if (soap->error || soap_end_send_flush(soap)) { soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } soap->keep_alive = keep_alive; soap->omode = om; om = soap->imode; soap->imode &= ~SOAP_ENC; /* mask IO and ENC */ userid = soap->userid; /* preserve */ passwd = soap->passwd; /* preserve */ soap->error = soap->fparse(soap); if (soap->error) { soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } soap->status = status; /* restore */ soap->userid = userid; /* restore */ soap->passwd = passwd; /* restore */ soap->imode = om; /* restore */ soap->count = n; /* restore */ if (soap_init_send(soap)) { soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } if (endpoint) soap_strcpy(soap->endpoint, sizeof(soap->endpoint), endpoint); /* restore */ soap->mode = m; } #ifdef WITH_OPENSSL ERR_clear_error(); soap->ssl_flags |= SOAP_SSL_CLIENT; if (!soap->ctx && (soap->error = soap->fsslauth(soap)) != SOAP_OK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL required, but no ctx set\n")); soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return soap->socket = SOAP_INVALID_SOCKET; } if (!soap->ssl) { soap->ssl = SSL_new(soap->ctx); if (!soap->ssl) { soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return soap->socket = 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; } #if OPENSSL_VERSION_NUMBER >= 0x1000000aL if (!(soap->ssl_flags & SOAP_SSLv3) && !SSL_set_tlsext_host_name(soap->ssl, host)) { soap_set_receiver_error(soap, "SSL/TLS error", "SNI failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #elif (OPENSSL_VERSION_NUMBER >= 0x0090800fL) && defined(SSL_CTRL_SET_TLSEXT_HOSTNAME) if (!SSL_ctrl(soap->ssl, SSL_CTRL_SET_TLSEXT_HOSTNAME, TLSEXT_NAMETYPE_host_name, (void*)host)) { soap_set_receiver_error(soap, "SSL/TLS error", "SNI failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #endif bio = BIO_new_socket((int)sk, BIO_NOCLOSE); SSL_set_bio(soap->ssl, bio, bio); if (soap->connect_timeout || soap->recv_timeout || soap->send_timeout) { /* Set SSL connect timeout and set SSL sockets to non-blocking */ int t = soap->recv_timeout > soap->send_timeout ? soap->recv_timeout : soap->send_timeout; if (soap->connect_timeout > 0 && t < soap->connect_timeout) t = soap->connect_timeout; if (t > 0) retries = 10 * t; else if (t > -100000) retries = 1; else retries = t/-100000; SOAP_SOCKNONBLOCK(sk) } else { /* Set sockets to blocking */ retries = 1; SOAP_SOCKBLOCK(sk) } err = SSL_ERROR_NONE; /* Try connecting until success or timeout */ do { if ((r = SSL_connect(soap->ssl)) <= 0) { err = SSL_get_error(soap->ssl, r); if (err == SSL_ERROR_WANT_CONNECT || err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) { int s; if (err == SSL_ERROR_WANT_READ) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; if (s == 0 && retries-- <= 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL/TLS connect timeout\n")); soap_set_receiver_error(soap, "Timeout", "SSL_connect() failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } } else { soap->errnum = soap_socket_errno(sk); break; } } } while (!SSL_is_init_finished(soap->ssl)); if (r <= 0) { soap_set_sender_error(soap, soap_ssl_error(soap, r, err), "SSL/TLS handshake failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } /* Check server credentials when required */ if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) { if ((err = SSL_get_verify_result(soap->ssl)) != X509_V_OK) { soap_set_sender_error(soap, X509_verify_cert_error_string(err), "SSL/TLS certificate presented by peer cannot be verified in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } if (!(soap->ssl_flags & SOAP_SSL_SKIP_HOST_CHECK)) { X509_NAME *subj; STACK_OF(CONF_VALUE) *val = NULL; #if OPENSSL_VERSION_NUMBER >= 0x0090800fL GENERAL_NAMES *names = NULL; #else int ext_count; #endif int ok = 0; X509 *peer = SSL_get_peer_certificate(soap->ssl); if (!peer) { soap_set_sender_error(soap, "SSL/TLS error", "No SSL/TLS certificate was presented by the peer in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #if OPENSSL_VERSION_NUMBER < 0x0090800fL 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_METHOD*)X509V3_EXT_get(ext); unsigned char *data; if (!meth) break; data = ext->value->data; if (data) { #if OPENSSL_VERSION_NUMBER > 0x00907000L void *ext_data; if (meth->it) ext_data = ASN1_item_d2i(NULL, &data, ext->value->length, ASN1_ITEM_ptr(meth->it)); else { #if OPENSSL_VERSION_NUMBER > 0x0090800fL ext_data = meth->d2i(NULL, (const unsigned char **)&data, ext->value->length); #else ext_data = meth->d2i(NULL, &data, ext->value->length); #endif } if (ext_data) val = meth->i2v(meth, ext_data, NULL); else val = NULL; if (meth->it) ASN1_item_free((ASN1_VALUE*)ext_data, ASN1_ITEM_ptr(meth->it)); else meth->ext_free(ext_data); #else void *ext_data = meth->d2i(NULL, &data, ext->value->length); if (ext_data) val = meth->i2v(meth, ext_data, NULL); meth->ext_free(ext_data); #endif if (val) { int j; 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->name, "IP Address")) && !soap_tag_cmp(host, nval->value)) { ok = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s match with certificate %s %s\n", host, nval->name, nval->value)); break; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s mismatch with certificate %s %s\n", host, nval->name, nval->value)); } } sk_CONF_VALUE_pop_free(val, X509V3_conf_free); } } } if (ok) break; } } #else names = (GENERAL_NAMES*)X509_get_ext_d2i(peer, NID_subject_alt_name, NULL, NULL); if (names) { val = i2v_GENERAL_NAMES(NULL, names, val); sk_GENERAL_NAME_pop_free(names, GENERAL_NAME_free); } if (val) { int j; 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->name, "IP Address")) && !soap_tag_cmp(host, nval->value)) { ok = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s match with certificate %s %s\n", host, nval->name, nval->value)); break; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s mismatch with certificate %s %s\n", host, nval->name, nval->value)); } } sk_CONF_VALUE_pop_free(val, X509V3_conf_free); } #endif if (!ok && (subj = X509_get_subject_name(peer)) != 0) { 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 OPENSSL_VERSION_NUMBER < 0x10100000L const char *tmp = (const char*)ASN1_STRING_data(name); #else const char *tmp = (const char*)ASN1_STRING_get0_data(name); #endif if (!soap_tag_cmp(host, tmp)) { ok = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s match with certificate subject %s\n", host, tmp)); } else { unsigned char *tmp = NULL; ASN1_STRING_to_UTF8(&tmp, name); if (tmp) { if (!soap_tag_cmp(host, (const char*)tmp)) { ok = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s match with certificate subject %s\n", host, tmp)); } else if (tmp[0] == '*') /* wildcard domain */ { const char *t = strchr(host, '.'); if (t && !soap_tag_cmp(t, (const char*)tmp + 1)) { ok = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s match with certificate subject %s\n", host, tmp)); } } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s mismatch with certificate %s\n", host, tmp)); } OPENSSL_free(tmp); } } } } while (!ok); } X509_free(peer); if (!ok) { soap_set_sender_error(soap, "SSL/TLS error", "SSL/TLS certificate host name mismatch in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } } } #endif #ifdef WITH_GNUTLS soap->ssl_flags |= SOAP_SSL_CLIENT; if (!soap->session && (soap->error = soap->fsslauth(soap)) != SOAP_OK) { soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } gnutls_transport_set_ptr(soap->session, (gnutls_transport_ptr_t)(long)sk); if (soap->connect_timeout || soap->recv_timeout || soap->send_timeout) { /* Set SSL connect timeout and set SSL sockets to non-blocking */ int t = soap->recv_timeout > soap->send_timeout ? soap->recv_timeout : soap->send_timeout; if (soap->connect_timeout > 0 && t < soap->connect_timeout) t = soap->connect_timeout; if (t > 0) retries = 10 * t; else if (t > -100000) retries = 1; else retries = t/-100000; SOAP_SOCKNONBLOCK(sk) } else { /* Set sockets to blocking */ retries = 1; SOAP_SOCKBLOCK(sk) } /* Try connecting until success or timeout */ while ((r = gnutls_handshake(soap->session))) { /* GNUTLS repeat handhake when GNUTLS_E_AGAIN */ if (r == GNUTLS_E_AGAIN || r == GNUTLS_E_INTERRUPTED) { int s; if (!gnutls_record_get_direction(soap->session)) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; if (s == 0 && retries-- <= 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL/TLS connect timeout\n")); soap_set_receiver_error(soap, "Timeout", "SSL_connect() failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } } else { soap->errnum = soap_socket_errno(sk); break; } } if (r) { soap_set_sender_error(soap, soap_ssl_error(soap, r, 0), "SSL/TLS handshake failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) { const char *s = ssl_verify(soap, host); if (s) { soap->fclosesocket(soap, sk); soap->error = soap_set_sender_error(soap, "SSL/TLS verify error", s, SOAP_SSL_ERROR); return soap->socket = SOAP_INVALID_SOCKET; } } #endif #ifdef WITH_SYSTEMSSL soap->ssl_flags |= SOAP_SSL_CLIENT; if (!soap->ctx && (soap->error = soap->fsslauth(soap)) != SOAP_OK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL required, but no ctx set\n")); soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return soap->socket = SOAP_INVALID_SOCKET; } if (soap->connect_timeout || soap->recv_timeout || soap->send_timeout) { /* Set SSL connect timeout and set SSL sockets to non-blocking */ int t = soap->recv_timeout > soap->send_timeout ? soap->recv_timeout : soap->send_timeout; if (soap->connect_timeout > 0 && t < soap->connect_timeout) t = soap->connect_timeout; if (t > 0) retries = 10 * t; else if (t > -100000) retries = 1; else retries = t/-100000; SOAP_SOCKNONBLOCK(sk) } else { /* Set sockets to blocking */ retries = 1; SOAP_SOCKBLOCK(sk) } r = gsk_secure_socket_open(soap->ctx, &soap->ssl); if (r == GSK_OK) r = gsk_attribute_set_numeric_value(soap->ssl, GSK_FD, sk); if (r == GSK_OK) r = gsk_attribute_set_buffer(soap->ssl, GSK_KEYRING_LABEL, soap->cafile, 0); /* Certificate label */ if (r == GSK_OK) r = gsk_attribute_set_enum(soap->ssl, GSK_SESSION_TYPE, GSK_CLIENT_SESSION); if (r == GSK_OK) r = gsk_attribute_set_buffer(soap->ssl, GSK_V3_CIPHER_SPECS_EXPANDED, "0035002F000A", 0); if (r == GSK_OK) r = gsk_attribute_set_enum(soap->ssl, GSK_V3_CIPHERS, GSK_V3_CIPHERS_CHAR4); if (r == GSK_OK) r = gsk_attribute_set_callback(soap->ssl, GSK_IO_CALLBACK, &local_io); if (r != GSK_OK) { soap_set_receiver_error(soap, gsk_strerror(r), "SYSTEM SSL error in tcp_connect()", SOAP_SSL_ERROR); return soap->socket = SOAP_INVALID_SOCKET; } /* Try connecting until success or timeout */ while ((r = gsk_secure_socket_init(soap->ssl)) != GSK_OK) { if (r == GSK_WOULD_BLOCK_READ || r == GSK_WOULD_BLOCK_WRITE) { int s; if (r == GSK_WOULD_BLOCK_READ) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; if (s == 0 && retries-- <= 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL/TLS connect timeout\n")); soap_set_receiver_error(soap, "Timeout", "SSL_connect() failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } } else { soap->errnum = soap_socket_errno(sk); break; } } if (r != GSK_OK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL_connect/select error in tcp_connect\n")); soap_set_receiver_error(soap, gsk_strerror(r), "SSL/TLS handshake failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #endif soap->imode |= SOAP_ENC_SSL; soap->omode |= SOAP_ENC_SSL; #else soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return soap->socket = SOAP_INVALID_SOCKET; #endif } if (soap->recv_timeout || soap->send_timeout) SOAP_SOCKNONBLOCK(sk) else SOAP_SOCKBLOCK(sk) return sk; } #endif /******************************************************************************/ #ifndef WITH_NOIO static int tcp_select(struct soap *soap, SOAP_SOCKET sk, int flags, int timeout) { int r; struct timeval tv; fd_set fd[3], *rfd, *sfd, *efd; int retries = 0; int eintr = SOAP_MAXEINTR; soap->errnum = 0; if (!soap_valid_socket(sk)) { soap->error = SOAP_EOF; return -1; } #ifndef WIN32 #if !defined(FD_SETSIZE) || defined(__QNX__) || defined(QNX) /* no FD_SETSIZE or select() is not MT safe on some QNX: always poll */ if (1) #else /* if fd max set size exceeded, use poll() when available */ if ((int)sk >= (int)FD_SETSIZE) #endif #ifdef HAVE_POLL { #ifdef WITH_SELF_PIPE struct pollfd pollfd[2]; pollfd[1].fd = soap->pipe_fd[0]; pollfd[1].events = POLLIN; #else struct pollfd pollfd[1]; #endif pollfd[0].fd = (int)sk; pollfd[0].events = 0; if ((flags & SOAP_TCP_SELECT_RCV)) pollfd[0].events |= POLLIN; if ((flags & SOAP_TCP_SELECT_SND)) pollfd[0].events |= POLLOUT; if ((flags & SOAP_TCP_SELECT_ERR)) pollfd[0].events |= POLLERR; if (timeout <= 0) timeout /= -1000; /* -usec -> ms */ else { retries = timeout - 1; timeout = 1000; } do { #ifdef WITH_SELF_PIPE r = poll(pollfd, 2, timeout); #else r = poll(pollfd, 1, timeout); #endif if (r < 0 && (soap->errnum = soap_socket_errno(sk)) == SOAP_EINTR && eintr > 0) { eintr--; r = 0; } else if (retries-- <= 0) { break; } } while (r == 0); if (r > 0) { r = 0; if ((flags & SOAP_TCP_SELECT_RCV) && (pollfd[0].revents & POLLIN)) r |= SOAP_TCP_SELECT_RCV; if ((flags & SOAP_TCP_SELECT_SND) && (pollfd[0].revents & POLLOUT)) r |= SOAP_TCP_SELECT_SND; if ((flags & SOAP_TCP_SELECT_ERR) && (pollfd[0].revents & POLLERR)) r |= SOAP_TCP_SELECT_ERR; #ifdef WITH_SELF_PIPE if ((flags & SOAP_TCP_SELECT_PIP) && (pollfd[1].revents & POLLIN)) { char ch; for (;;) { if (read(soap->pipe_fd[0], &ch, 1) == -1) { if (soap_socket_errno(soap->pipe_fd[0]) == SOAP_EAGAIN) break; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Self pipe read error\n")); return -1; } } r |= SOAP_TCP_SELECT_PIP; } #endif } else if (r == 0) { soap->errnum = 0; } return r; } #else { soap->error = SOAP_FD_EXCEEDED; return -1; } #endif #endif if (timeout > 0) retries = timeout - 1; do { rfd = sfd = efd = NULL; #ifdef WITH_SELF_PIPE if ((flags & SOAP_TCP_SELECT_PIP) || (flags & SOAP_TCP_SELECT_RCV)) { rfd = &fd[0]; FD_ZERO(rfd); if ((flags & SOAP_TCP_SELECT_PIP)) FD_SET(soap->pipe_fd[0], rfd); if ((flags & SOAP_TCP_SELECT_RCV)) FD_SET(sk, rfd); } #else if ((flags & SOAP_TCP_SELECT_RCV)) { rfd = &fd[0]; FD_ZERO(rfd); FD_SET(sk, rfd); } #endif if ((flags & SOAP_TCP_SELECT_SND)) { sfd = &fd[1]; FD_ZERO(sfd); FD_SET(sk, sfd); } if ((flags & SOAP_TCP_SELECT_ERR)) { efd = &fd[2]; FD_ZERO(efd); FD_SET(sk, efd); } if (timeout <= 0) { tv.tv_sec = -timeout / 1000000; tv.tv_usec = -timeout % 1000000; } else { tv.tv_sec = 1; tv.tv_usec = 0; } #ifdef WITH_SELF_PIPE r = select((int)(sk > soap->pipe_fd[0] ? sk : soap->pipe_fd[0]) + 1, rfd, sfd, efd, &tv); #else r = select((int)sk + 1, rfd, sfd, efd, &tv); #endif if (r < 0 && (soap->errnum = soap_socket_errno(sk)) == SOAP_EINTR && eintr > 0) { eintr--; r = 0; } else if (retries-- <= 0) { break; } } while (r == 0); if (r > 0) { r = 0; if ((flags & SOAP_TCP_SELECT_RCV) && FD_ISSET(sk, rfd)) r |= SOAP_TCP_SELECT_RCV; if ((flags & SOAP_TCP_SELECT_SND) && FD_ISSET(sk, sfd)) r |= SOAP_TCP_SELECT_SND; if ((flags & SOAP_TCP_SELECT_ERR) && FD_ISSET(sk, efd)) r |= SOAP_TCP_SELECT_ERR; #ifdef WITH_SELF_PIPE if ((flags & SOAP_TCP_SELECT_PIP) && FD_ISSET(soap->pipe_fd[0], rfd)) { char ch; for (;;) { if (read(soap->pipe_fd[0], &ch, 1) == -1) { if (soap_socket_errno(soap->pipe_fd[0]) == SOAP_EAGAIN) break; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Self pipe read error\n")); return -1; } } r |= SOAP_TCP_SELECT_PIP; } #endif } else if (r == 0) { soap->errnum = 0; } return r; } #endif /******************************************************************************/ #ifndef WITH_NOIO static SOAP_SOCKET tcp_accept(struct soap *soap, SOAP_SOCKET sk, struct sockaddr *addr, int *len) { SOAP_SOCKET s; (void)soap; s = accept(sk, addr, (SOAP_SOCKLEN_T*)len); /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ #ifdef WITH_SOCKET_CLOSE_ON_EXIT #ifdef WIN32 #ifndef UNDER_CE SetHandleInformation((HANDLE)s, HANDLE_FLAG_INHERIT, 0); #endif #else fcntl(s, F_SETFD, FD_CLOEXEC); #endif #endif return s; } #endif /******************************************************************************/ #ifndef WITH_NOIO static int tcp_disconnect(struct soap *soap) { #ifdef WITH_OPENSSL if (soap->ssl) { int r; if (soap->session) { SSL_SESSION_free(soap->session); soap->session = NULL; } if (*soap->host) { soap->session = SSL_get1_session(soap->ssl); if (soap->session) { soap_strcpy(soap->session_host, sizeof(soap->session_host), soap->host); soap->session_port = soap->port; } } r = SSL_shutdown(soap->ssl); /* SSL shutdown does not work when reads are pending, non-blocking */ if (r == 0) { while (SSL_want_read(soap->ssl)) { if (SSL_read(soap->ssl, NULL, 0) || soap_socket_errno(soap->socket) != SOAP_EAGAIN) { r = SSL_shutdown(soap->ssl); break; } } } if (r == 0) { if (soap_valid_socket(soap->socket)) { if (!soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_WR)) { #if !defined(WITH_LEAN) && !defined(WIN32) /* wait up to 5 seconds for close_notify to be sent by peer (if peer not present, this avoids calling SSL_shutdown() which has a lengthy return timeout) */ r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, 5); if (r <= 0) { soap->errnum = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connection lost...\n")); soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; ERR_clear_error(); SSL_free(soap->ssl); soap->ssl = NULL; return SOAP_OK; } #else r = SSL_shutdown(soap->ssl); if (r <= 0) { 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; } } #endif } } } SSL_free(soap->ssl); soap->ssl = NULL; ERR_clear_error(); } #endif #ifdef WITH_GNUTLS if (soap->session) { gnutls_bye(soap->session, GNUTLS_SHUT_RDWR); gnutls_deinit(soap->session); soap->session = NULL; } #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) { gsk_secure_socket_shutdown(soap->ssl); gsk_secure_socket_close(&soap->ssl); } #endif if (soap_valid_socket(soap->socket) && !(soap->omode & SOAP_IO_UDP)) { soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_RDWR); soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_NOIO static int tcp_closesocket(struct soap *soap, SOAP_SOCKET sk) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Close socket=%d\n", (int)sk)); return soap_closesocket(sk); } #endif /******************************************************************************/ #ifndef WITH_NOIO static int tcp_shutdownsocket(struct soap *soap, SOAP_SOCKET sk, int how) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shutdown socket=%d how=%d\n", (int)sk, how)); return shutdown(sk, how); } #endif /******************************************************************************/ #ifndef WITH_NOIO SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_bind(struct soap *soap, const char *host, int port, int backlog) { #if defined(WITH_IPV6) struct addrinfo *addrinfo = NULL; struct addrinfo hints; struct addrinfo res; int err; int set = 1; int unset = 0; #elif !defined(WITH_LEAN) 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->errnum = 0; 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 = soap->bind_inet6 ? AF_INET6 : 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 (err || !addrinfo) { soap_set_receiver_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in soap_bind()", SOAP_TCP_ERROR); if (addrinfo) freeaddrinfo(addrinfo); return SOAP_INVALID_SOCKET; } res = *addrinfo; if (soap_memcpy((void*)&soap->peer.storage, sizeof(soap->peer.storage), (const void*)addrinfo->ai_addr, addrinfo->ai_addrlen)) { freeaddrinfo(addrinfo); soap->error = SOAP_EOM; return SOAP_INVALID_SOCKET; } soap->peerlen = addrinfo->ai_addrlen; res.ai_addr = &soap->peer.addr; res.ai_addrlen = soap->peerlen; freeaddrinfo(addrinfo); 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; } soap->port = port; #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) soap->socket = soap->master; #endif #ifdef WITH_SOCKET_CLOSE_ON_EXIT #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; } #ifndef UNDER_CE if (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) && (!((soap->imode | soap->omode) & SOAP_IO_UDP)) && setsockopt(soap->master, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) { 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 (soap->sndbuf > 0 && setsockopt(soap->master, SOL_SOCKET, SO_SNDBUF, (char*)&soap->sndbuf, 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 (soap->rcvbuf > 0 && setsockopt(soap->master, SOL_SOCKET, SO_RCVBUF, (char*)&soap->rcvbuf, 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 #ifdef TCP_FASTOPEN if (!(soap->omode & SOAP_IO_UDP) && setsockopt(soap->master, IPPROTO_TCP, TCP_FASTOPEN, (char*)&set, sizeof(int))) { /* silently ignore */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "setsockopt TCP_FASTOPEN failed in soap_bind()\n")); } #endif #endif #endif #ifdef WITH_IPV6 if (res.ai_family == AF_INET6 && setsockopt(soap->master, IPPROTO_IPV6, IPV6_V6ONLY, soap->bind_v6only ? (char*)&set : (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; } 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, bind failed\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.in); memset((void*)&soap->peer.in, 0, sizeof(soap->peer.in)); soap->peer.in.sin_family = AF_INET; soap->errmode = 2; if (host) { if (soap->fresolve(soap, host, &soap->peer.in.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.in.sin_addr.s_addr = htonl(INADDR_ANY); soap->peer.in.sin_port = htons((short)port); soap->errmode = 0; if (bind(soap->master, &soap->peer.addr, (int)soap->peerlen)) { soap->errnum = soap_socket_errno(soap->master); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host, bind failed\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, listen failed\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 /******************************************************************************/ #ifndef WITH_NOIO SOAP_FMAC1 int SOAP_FMAC2 soap_poll(struct soap *soap) { #ifndef WITH_LEAN int r; if (soap_valid_socket(soap->socket)) { r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_ALL, 0); if (r > 0 && (r & SOAP_TCP_SELECT_ERR)) r = -1; } else if (soap_valid_socket(soap->master)) { r = tcp_select(soap, soap->master, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, 0); } else { return SOAP_OK; /* OK when no socket! */ } if (r > 0) { int t; #ifdef WITH_OPENSSL if ((soap->imode & SOAP_ENC_SSL) && soap->ssl) { if (soap_valid_socket(soap->socket) && (r & SOAP_TCP_SELECT_SND) && (!(r & SOAP_TCP_SELECT_RCV) || SSL_peek(soap->ssl, (char*)&t, 1) > 0)) return SOAP_OK; } else #endif { if (soap_valid_socket(soap->socket) && (r & SOAP_TCP_SELECT_SND) && (!(r & SOAP_TCP_SELECT_RCV) || recv(soap->socket, (char*)&t, 1, MSG_PEEK) > 0)) return SOAP_OK; } } else if (r < 0) { if ((soap_valid_socket(soap->master) && soap_socket_errno(soap->master) != SOAP_EINTR) || (soap_valid_socket(soap->socket) && soap_socket_errno(soap->socket) != SOAP_EINTR)) return soap_set_receiver_error(soap, tcp_error(soap), "select failed in soap_poll()", SOAP_TCP_ERROR); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_poll: other end down on socket=%d select=%d\n", (int)soap->socket, r)); return SOAP_EOF; #else (void)soap; return SOAP_OK; #endif } #endif /******************************************************************************/ #ifndef WITH_NOIO SOAP_FMAC1 int SOAP_FMAC2 soap_ready(struct soap *soap) { #ifndef WITH_LEAN int r; if (!soap_valid_socket(soap->socket)) return SOAP_OK; /* OK when no socket! */ r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, 0); if (r > 0 && (r & SOAP_TCP_SELECT_ERR)) r = -1; if (r < 0 && soap_socket_errno(soap->socket) != SOAP_EINTR) return soap_set_receiver_error(soap, tcp_error(soap), "select failed in soap_ready()", SOAP_TCP_ERROR); if (r > 0) { char t; #ifdef WITH_OPENSSL if ((soap->imode & SOAP_ENC_SSL) && soap->ssl) { if (SSL_peek(soap->ssl, &t, 1) > 0) return SOAP_OK; } else #endif { if (recv(soap->socket, &t, 1, MSG_PEEK) > 0) return SOAP_OK; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_ready: other end not ready to send on socket=%d select=%d\n", (int)soap->socket, r)); return SOAP_EOF; #else (void)soap; return SOAP_OK; #endif } #endif /******************************************************************************/ #ifndef WITH_NOIO SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_accept(struct soap *soap) { int n = (int)sizeof(soap->peer); int err; #ifndef WITH_LEAN int set = 1; #endif soap->error = SOAP_OK; memset((void*)&soap->peer, 0, sizeof(soap->peer)); soap->socket = SOAP_INVALID_SOCKET; soap->errmode = 0; soap->errnum = 0; soap->keep_alive = 0; if (!soap_valid_socket(soap->master)) { soap_set_receiver_error(soap, tcp_error(soap), "no master socket in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) return soap->socket = soap->master; #endif for (;;) { if (soap->accept_timeout) { for (;;) { int r; r = tcp_select(soap, soap->master, SOAP_TCP_SELECT_ALL, soap->accept_timeout); if (r > 0) break; if (!r) { soap_set_receiver_error(soap, "Timeout", "accept failed in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } if (r < 0) { r = soap->errnum; if (r != SOAP_EINTR) { soap_closesock(soap); soap_set_receiver_error(soap, tcp_error(soap), "accept failed in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } } } } n = (int)sizeof(soap->peer); soap->socket = soap->faccept(soap, soap->master, &soap->peer.addr, &n); soap->peerlen = (size_t)n; if (soap_valid_socket(soap->socket)) { #ifdef WITH_IPV6 char port[16]; struct addrinfo *res = NULL; struct addrinfo hints; memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_NUMERICHOST | AI_NUMERICSERV; getnameinfo(&soap->peer.addr, n, soap->host, sizeof(soap->host), port, sizeof(port), NI_NUMERICHOST | NI_NUMERICSERV); soap->ip = 0; soap->ip6[0] = 0; soap->ip6[1] = 0; soap->ip6[2] = 0; soap->ip6[3] = 0; if (getaddrinfo(soap->host, NULL, &hints, &res) == 0 && res) { struct sockaddr_storage result; (void)soap_memcpy(&result, sizeof(result), res->ai_addr, res->ai_addrlen); freeaddrinfo(res); if (result.ss_family == AF_INET6) { struct sockaddr_in6 *addr = (struct sockaddr_in6*)&result; struct in6_addr *inaddr = &addr->sin6_addr; int i; for (i = 0; i < 16; i++) soap->ip6[i/4] = (soap->ip6[i/4] << 8) + inaddr->s6_addr[i]; } else if (result.ss_family == AF_INET) { struct sockaddr_in *addr = (struct sockaddr_in*)&result; soap->ip = ntohl(addr->sin_addr.s_addr); soap->ip6[2] = 0xFFFF; soap->ip6[3] = soap->ip; } } soap->port = soap_strtol(port, NULL, 10); #else soap->ip = ntohl(soap->peer.in.sin_addr.s_addr); soap->ip6[0] = 0; soap->ip6[1] = 0; soap->ip6[2] = 0xFFFF; soap->ip6[3] = soap->ip; (SOAP_SNPRINTF(soap->host, sizeof(soap->host), 80), "%u.%u.%u.%u", (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF); soap->port = (int)ntohs(soap->peer.in.sin_port); /* does not return port number on some systems */ #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Accept socket=%d at port=%d from IP='%s'\n", (int)soap->socket, soap->port, soap->host)); #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; } } if ((soap->accept_flags & ~SO_LINGER) && setsockopt(soap->socket, SOL_SOCKET, soap->accept_flags & ~SO_LINGER, (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; } #ifndef UNDER_CE 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 (soap->sndbuf > 0 && setsockopt(soap->socket, SOL_SOCKET, SO_SNDBUF, (char*)&soap->sndbuf, 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 (soap->rcvbuf > 0 && setsockopt(soap->socket, SOL_SOCKET, SO_RCVBUF, (char*)&soap->rcvbuf, 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 (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 #endif soap->keep_alive = -(((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) != 0); if (soap->send_timeout || soap->recv_timeout) SOAP_SOCKNONBLOCK(soap->socket) else SOAP_SOCKBLOCK(soap->socket) 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; } } } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_closesock(struct soap *soap) { int status = soap->error; int err = SOAP_OK; soap->part = SOAP_END; #ifndef WITH_LEANER if (status && status < 200) /* attachment state is not to be trusted */ { soap->mime.first = NULL; soap->mime.last = NULL; soap->dime.first = NULL; soap->dime.last = NULL; } #endif if (soap->fdisconnect) err = soap->fdisconnect(soap); if (err || status == SOAP_EOF || status == SOAP_TCP_ERROR || status == SOAP_SSL_ERROR || !soap->keep_alive) { soap->keep_alive = 0; if (soap->fclose && (soap->error = soap->fclose(soap)) != SOAP_OK) return soap->error; if (err) return soap->error = err; } #ifdef WITH_ZLIB if (!(soap->mode & SOAP_MIME_POSTCHECK)) { 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; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_force_closesock(struct soap *soap) { soap->keep_alive = 0; if (soap_valid_socket(soap->socket) && soap->fclosesocket) { soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; } return soap->error; } /******************************************************************************/ #ifdef WITH_SELF_PIPE SOAP_FMAC1 void SOAP_FMAC2 soap_close_connection(struct soap *soap) { if (soap_valid_socket(soap->socket)) write(soap->pipe_fd[1], "1", 1); } #endif /******************************************************************************/ #ifndef WITH_NOIO 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 /******************************************************************************/ 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%s\n", soap->state == SOAP_COPY ? " copy" : "")); soap_free_temp(soap); while (soap->clist) { struct soap_clist *p = soap->clist->next; SOAP_FREE(soap, soap->clist); soap->clist = p; } if (soap->state == SOAP_INIT) soap->omode &= ~SOAP_IO_UDP; /* to force close the socket */ soap->keep_alive = 0; /* to force close the socket */ if (soap->master == soap->socket) /* do not close twice */ soap->master = SOAP_INVALID_SOCKET; soap_closesock(soap); #ifdef WITH_COOKIES soap_free_cookies(soap); #endif while (soap->plugins) { 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; #ifndef WITH_NOHTTP soap->fpost = http_post; soap->fget = http_get; soap->fput = http_put; soap->fpatch = http_patch; soap->fdel = http_del; soap->fopt = http_200; soap->fhead = http_200; 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->fsvalidate = NULL; soap->fwvalidate = NULL; soap->feltbegin = NULL; soap->feltendin = NULL; soap->feltbegout = NULL; soap->feltendout = NULL; soap->fprepareinitsend = NULL; soap->fprepareinitrecv = NULL; soap->fpreparesend = NULL; soap->fpreparerecv = NULL; soap->fpreparefinalsend = NULL; soap->fpreparefinalrecv = NULL; soap->ffiltersend = NULL; soap->ffilterrecv = 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; } } ERR_clear_error(); # if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER) /* OpenSSL libraries handle thread init and deinit */ # elif OPENSSL_VERSION_NUMBER >= 0x10000000L ERR_remove_thread_state(NULL); # else ERR_remove_state(0); # endif #endif #ifdef WITH_GNUTLS if (soap->state == SOAP_INIT) { if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } if (soap->acred) { gnutls_anon_free_client_credentials(soap->acred); soap->acred = NULL; } if (soap->cache) { gnutls_priority_deinit(soap->cache); soap->cache = NULL; } if (soap->dh_params) { gnutls_dh_params_deinit(soap->dh_params); soap->dh_params = NULL; } # if GNUTLS_VERSION_NUMBER < 0x030300 if (soap->rsa_params) { gnutls_rsa_params_deinit(soap->rsa_params); soap->rsa_params = NULL; } #endif } if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) gsk_secure_socket_close(&soap->ssl); if (soap->state == SOAP_INIT) if (soap->ctx) gsk_environment_close(&soap->ctx); #endif #ifdef WITH_C_LOCALE SOAP_FREELOCALE(soap); #endif #ifdef WITH_ZLIB if (soap->d_stream) { SOAP_FREE(soap, soap->d_stream); soap->d_stream = NULL; } if (soap->z_buf) { SOAP_FREE(soap, 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++) { soap_close_logfile(soap, i); if (soap->logfile[i]) { SOAP_FREE_UNMANAGED(soap->logfile[i]); soap->logfile[i] = NULL; } } #endif #ifdef WITH_SELF_PIPE close(soap->pipe_fd[0]); close(soap->pipe_fd[1]); #endif #ifdef SOAP_MEM_DEBUG soap_free_mht(soap); #endif soap->state = SOAP_NONE; } /******************************************************************************\ * * HTTP * \******************************************************************************/ #ifndef WITH_NOHTTP static int http_parse(struct soap *soap) { char header[SOAP_HDRLEN], *s; int err = SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Waiting for HTTP request/response...\n")); soap->fform = NULL; *soap->endpoint = '\0'; soap->bearer = NULL; #ifdef WITH_NTLM if (!soap->ntlm_challenge) #endif { soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; } #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif soap->proxy_from = NULL; soap->cors_origin = NULL; soap->cors_method = NULL; soap->cors_header = NULL; do { soap->length = 0; soap->http_content = NULL; soap->action = NULL; soap->status = 0; soap->body = 1; if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf))) { if (soap->error == SOAP_EOF) return SOAP_EOF; return soap->error = 414; } s = strchr(soap->msgbuf, ' '); if (s) { soap->status = (unsigned short)soap_strtoul(s, &s, 10); if (!soap_coblank((soap_wchar)*s)) soap->status = 0; } 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, try to 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'; soap->error = soap->fparsehdr(soap, header, s); if (soap->error) { if (soap->error < SOAP_STOP) return soap->error; err = soap->error; soap->error = SOAP_OK; } } } } while (soap->status == 100); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Finished HTTP header parsing, status = %d\n", soap->status)); s = strstr(soap->msgbuf, "HTTP/"); if (s && s[5] == '1' && s[6] == '.' && s[7] == '0') { soap->keep_alive = 0; /* HTTP 1.0 does not support keep-alive */ if (soap->status == 0 && (soap->omode & SOAP_IO) == SOAP_IO_CHUNK) /* soap->status == 0 for HTTP request */ soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE; /* HTTP 1.0 does not support chunked transfers */ } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Keep alive connection = %d\n", soap->keep_alive)); if (soap->status == 0) { size_t l = 0; if (s) { if (!strncmp(soap->msgbuf, "POST ", l = 5)) soap->status = SOAP_POST; else if (!strncmp(soap->msgbuf, "GET ", l = 4)) soap->status = SOAP_GET; else if (!strncmp(soap->msgbuf, "PUT ", l = 4)) soap->status = SOAP_PUT; else if (!strncmp(soap->msgbuf, "PATCH ", l = 4)) soap->status = SOAP_PATCH; else if (!strncmp(soap->msgbuf, "DELETE ", l = 7)) soap->status = SOAP_DEL; else if (!strncmp(soap->msgbuf, "HEAD ", l = 5)) soap->status = SOAP_HEAD; else if (!strncmp(soap->msgbuf, "OPTIONS ", l = 8)) soap->status = SOAP_OPTIONS; } if (s && soap->status) { size_t m, n, k; int r; while (soap->msgbuf[l] && soap_coblank((soap_wchar)soap->msgbuf[l])) l++; m = strlen(soap->endpoint); n = m + (s - soap->msgbuf) - l - 1; if (n >= sizeof(soap->endpoint)) n = sizeof(soap->endpoint) - 1; if (m > n) m = n; k = n - m + 1; if (k >= sizeof(soap->path)) k = sizeof(soap->path) - 1; while (k > 0 && soap_coblank((soap_wchar)soap->msgbuf[l + k - 1])) k--; if (soap_strncpy(soap->path, sizeof(soap->path), soap->msgbuf + l, k)) return soap->error = 414; if (*soap->path && *soap->path != '/') r = soap_strncpy(soap->endpoint, sizeof(soap->endpoint), soap->path, k); else r = soap_strncat(soap->endpoint, sizeof(soap->endpoint), soap->path, k); if (r) return soap->error = 414; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Target endpoint='%s' path='%s'\n", soap->endpoint, soap->path)); if (err) return soap->error = err; } else if (err) { return soap->error = err; } else if (s) { return soap->error = 405; } return SOAP_OK; } if ((soap->status >= 200 && soap->status <= 299) /* OK, Accepted, etc */ || soap->status == 400 /* Bad Request */ || soap->status == 500) /* Internal Server Error */ return soap->error = SOAP_OK; return soap->error = soap->status; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_parse_header(struct soap *soap, const char *key, const char *val) { if (!soap_tag_cmp(key, "Host")) { #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) if ((soap->imode & SOAP_ENC_SSL)) soap_strcpy(soap->endpoint, sizeof(soap->endpoint), "https://"); else #endif soap_strcpy(soap->endpoint, sizeof(soap->endpoint), "http://"); if (soap_strncat(soap->endpoint, sizeof(soap->endpoint), val, sizeof(soap->endpoint) - 9)) return soap->error = SOAP_HDR; } #ifndef WITH_LEANER else if (!soap_tag_cmp(key, "Content-Type")) { const char *action; soap->http_content = soap_strdup(soap, val); if (soap_http_header_attribute(soap, val, "application/dime")) soap->imode |= SOAP_ENC_DIME; else if (soap_http_header_attribute(soap, val, "multipart/related") || soap_http_header_attribute(soap, val, "multipart/form-data")) { const char *type; soap->mime.boundary = soap_strdup(soap, soap_http_header_attribute(soap, val, "boundary")); soap->mime.start = soap_strdup(soap, soap_http_header_attribute(soap, val, "start")); soap->imode |= SOAP_ENC_MIME; type = soap_http_header_attribute(soap, val, "type"); if (type && !strcmp(type, "application/xop+xml")) soap->imode |= SOAP_ENC_MTOM; } action = soap_http_header_attribute(soap, val, "action"); if (action) { if (*action == '"') { soap->action = soap_strdup(soap, action + 1); if (soap->action && *soap->action) 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_strtoull(val, NULL, 10); if (soap->length == 0) soap->body = 0; } 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_http_header_attribute(soap, val, "gzip")) soap->zlib_out = SOAP_ZLIB_GZIP; else #endif if (strchr(val, '*') || soap_http_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, "close")) soap->keep_alive = 0; } #if !defined(WITH_LEAN) || defined(WITH_NTLM) else if (!soap_tag_cmp(key, "Authorization") || !soap_tag_cmp(key, "Proxy-Authorization")) { #ifdef WITH_NTLM if (!soap_tag_cmp(val, "NTLM*")) { soap->ntlm_challenge = soap_strdup(soap, val + 4); } else #endif if (!soap_tag_cmp(val, "Bearer *")) { soap->bearer = soap_strdup(soap, val + 7); } else 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'; s = strchr(soap->tmpbuf, ':'); if (s) { *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_tag_cmp(key, "Proxy-Authenticate")) { #ifdef WITH_NTLM if (!soap_tag_cmp(val, "NTLM*")) soap->ntlm_challenge = soap_strdup(soap, val + 4); else #endif soap->authrealm = soap_strdup(soap, soap_http_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_OK || (soap->error = soap->fposthdr(soap, NULL, NULL)) != SOAP_OK) return soap->error; } } #endif else if (!soap_tag_cmp(key, "SOAPAction")) { if (*val == '"') { soap->action = soap_strdup(soap, val + 1); if (*soap->action) soap->action[strlen(soap->action) - 1] = '\0'; } else soap->action = soap_strdup(soap, val); } else if (!soap_tag_cmp(key, "Location")) { soap_strcpy(soap->endpoint, sizeof(soap->endpoint), val); } else if (!soap_tag_cmp(key, "X-Forwarded-For")) { soap->proxy_from = soap_strdup(soap, val); } else if (!soap_tag_cmp(key, "Origin")) { soap->origin = soap_strdup(soap, val); soap->cors_origin = soap->cors_allow; } else if (!soap_tag_cmp(key, "Access-Control-Request-Method")) { soap->cors_method = soap_strdup(soap, val); } else if (!soap_tag_cmp(key, "Access-Control-Request-Headers")) { soap->cors_header = 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 /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) SOAP_FMAC1 const char* SOAP_FMAC2 soap_http_header_attribute(struct soap *soap, const char *line, const char *key) { const char *s = line; if (s) { while (*s) { 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 /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_key(char *buf, size_t len, const char *val) { return soap_decode(buf, len, val, "=,;"); } #endif /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) 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 /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) static const char * soap_decode(char *buf, size_t len, const char *val, const char *sep) { const char *s; char *t = buf; size_t i = len; for (s = val; *s; s++) if (*s != ' ' && *s != '\t' && !strchr(sep, *s)) break; if (len > 0) { if (*s == '"') { s++; while (*s && *s != '"' && --i) *t++ = *s++; } else { while (*s && !strchr(sep, *s) && --i) { if (*s == '%' && s[1] && s[2]) { *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++; } } buf[len - 1] = '\0'; /* appease static checkers that get confused */ } *t = '\0'; while (*s && !strchr(sep, *s)) s++; return s; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static const char* http_error(struct soap *soap, int status) { const char *msg = SOAP_STR_EOS; (void)soap; (void)status; #ifndef WITH_LEAN msg = soap_code_str(h_http_error_codes, status); if (!msg) msg = SOAP_STR_EOS; #endif return msg; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_get(struct soap *soap) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP GET request\n")); return SOAP_GET_METHOD; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_put(struct soap *soap) { (void)soap; return SOAP_PUT_METHOD; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_patch(struct soap *soap) { (void)soap; return SOAP_PATCH_METHOD; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_del(struct soap *soap) { (void)soap; return SOAP_DEL_METHOD; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_200(struct soap *soap) { if (soap->origin && soap->cors_method) /* CORS Origin and Access-Control-Request-Method headers */ { soap->cors_origin = soap->cors_allow; /* modify this code or hook your own soap->fopt() callback with logic */ soap->cors_methods = "GET, PUT, PATCH, POST, HEAD, OPTIONS"; soap->cors_headers = soap->cors_header; } return soap_send_empty_response(soap, 200); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_post(struct soap *soap, const char *endpoint, const char *host, int port, const char *path, const char *action, ULONG64 count) { const char *s; int err; size_t l; switch (soap->status) { case SOAP_GET: s = "GET"; break; case SOAP_PUT: s = "PUT"; break; case SOAP_PATCH: s = "PATCH"; break; case SOAP_DEL: s = "DELETE"; break; case SOAP_CONNECT: s = "CONNECT"; break; case SOAP_HEAD: s = "HEAD"; break; case SOAP_OPTIONS: s = "OPTIONS"; break; default: s = "POST"; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP %s to %s\n", s, endpoint ? endpoint : "(null)")); if (!endpoint || (soap_tag_cmp(endpoint, "http:*") && soap_tag_cmp(endpoint, "https:*") && soap_tag_cmp(endpoint, "httpg:*"))) return SOAP_OK; /* set l to prevent overruns ('host' and 'soap->host' are substrings of 'endpoint') */ l = strlen(endpoint) + strlen(soap->http_version) + 80; if (l > sizeof(soap->tmpbuf)) return soap->error = SOAP_EOM; if (soap->status == SOAP_CONNECT) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s %s:%d HTTP/%s", s, soap->host, soap->port, soap->http_version); else if (soap->proxy_host && endpoint) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s %s HTTP/%s", s, endpoint, soap->http_version); else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s /%s HTTP/%s", s, (*path == '/' ? path + 1 : path), soap->http_version); err = soap->fposthdr(soap, soap->tmpbuf, NULL); if (err) return err; #ifdef WITH_OPENSSL if ((soap->ssl && port != 443) || (!soap->ssl && port != 80)) #else if (port != 80) #endif { #ifdef WITH_IPV6 if (*host != '[' && strchr(host, ':')) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "[%s]:%d", host, port); /* RFC 2732 */ else #endif (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s:%d", host, port); } else { #ifdef WITH_IPV6 if (*host != '[' && strchr(host, ':')) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "[%s]", host); /* RFC 2732 */ else #endif soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), host); } err = soap->fposthdr(soap, "Host", soap->tmpbuf); if (err) return err; err = soap->fposthdr(soap, "User-Agent", "gSOAP/2.8"); if (err) return err; if (soap->origin) { err = soap->fposthdr(soap, "Origin", soap->origin); if (err) return err; if (soap->status == SOAP_OPTIONS) { err = soap->fposthdr(soap, "Access-Control-Request-Method", soap->cors_method ? soap->cors_method : "POST"); if (err) return err; if (soap->cors_header) { err = soap->fposthdr(soap, "Access-Control-Request-Headers", soap->cors_header); if (err) return err; } } } err = soap_puthttphdr(soap, SOAP_OK, count); if (err) return err; #ifndef WITH_LEANER if ((soap->imode & SOAP_ENC_MTOM)) { err = soap->fposthdr(soap, "Accept", "multipart/related,application/xop+xml,*/*;q=0.8"); if (err) return err; } #endif #ifdef WITH_ZLIB #ifdef WITH_GZIP err = soap->fposthdr(soap, "Accept-Encoding", "gzip,deflate"); #else err = soap->fposthdr(soap, "Accept-Encoding", "deflate"); #endif if (err) return err; #endif #if !defined(WITH_LEAN) || defined(WITH_NTLM) if (soap->bearer) { l = strlen(soap->bearer); (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l + 1), "Bearer %s", soap->bearer); err = soap->fposthdr(soap, "Authorization", soap->tmpbuf); if (err) return err; } #ifdef WITH_NTLM if (soap->ntlm_challenge) { l = strlen(soap->ntlm_challenge); if (l) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l + 5), "NTLM %s", soap->ntlm_challenge); if (soap->proxy_host) { err = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf); if (err) return err; } else { err = soap->fposthdr(soap, "Authorization", soap->tmpbuf); if (err) return err; } } } else { #endif if (soap->userid && soap->passwd) { soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "Basic "); (SOAP_SNPRINTF(soap->tmpbuf + 262, sizeof(soap->tmpbuf) - 262, strlen(soap->userid) + strlen(soap->passwd) + 1), "%s:%s", soap->userid, soap->passwd); soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, (int)strlen(soap->tmpbuf + 262)); err = soap->fposthdr(soap, "Authorization", soap->tmpbuf); if (err) return err; } if (soap->proxy_userid && soap->proxy_passwd) { soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "Basic "); (SOAP_SNPRINTF(soap->tmpbuf + 262, sizeof(soap->tmpbuf) - 262, strlen(soap->proxy_userid) + strlen(soap->proxy_passwd) + 1), "%s:%s", soap->proxy_userid, soap->proxy_passwd); soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, (int)strlen(soap->tmpbuf + 262)); err = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf); if (err) return err; } #ifdef WITH_NTLM } #endif #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 (action && soap->status != SOAP_GET && soap->status != SOAP_DEL) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(action) + 2), "\"%s\"", action); err = soap->fposthdr(soap, "SOAPAction", soap->tmpbuf); if (err) return err; } return soap->fposthdr(soap, NULL, NULL); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_send_header(struct soap *soap, const char *s) { 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 /******************************************************************************/ #ifndef WITH_NOHTTP 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 /******************************************************************************/ #ifndef WITH_NOHTTP static int http_response(struct soap *soap, int status, ULONG64 count) { int err; char http[32]; int code = status; const char *line; #ifdef WMW_RPM_IO if (soap->rpmreqid) httpOutputEnable(soap->rpmreqid); if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket) || soap->recvfd != 0 || soap->sendfd != 1 || soap->os) /* RPM behaves as if standalone */ #else if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket) #ifndef UNDER_CE || soap->recvfd != 0 || soap->sendfd != 1 #else || soap->recvfd != stdin || soap->sendfd != stdout #endif || soap->os) /* standalone server application (over sockets), not CGI (over stdin/out) */ #endif (SOAP_SNPRINTF(http, sizeof(http), strlen(soap->http_version) + 5), "HTTP/%s", soap->http_version); else soap_strcpy(http, sizeof(http), "Status:"); if (status >= SOAP_FILE && status < SOAP_FILE + 600) { code = status - SOAP_FILE; if (code == 0) code = 200; } else if (!status || status == SOAP_HTML) { if (count || ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK)) code = 200; else code = 202; } else if (status < 200 || status >= 600) { const char *s = *soap_faultcode(soap); if (status >= SOAP_GET_METHOD && status <= SOAP_HTTP_METHOD) code = 405; else if (soap->version == 2 && (!s || !strcmp(s, "SOAP-ENV:Sender"))) code = 400; else code = 500; } line = http_error(soap, code); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP Status = %d %s\n", code, line)); (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), sizeof(http) + 22 + strlen(line)), "%s %d %s", http, code, line); err = soap->fposthdr(soap, soap->tmpbuf, NULL); if (err) return err; #ifndef WITH_LEAN if (status == 401) { (SOAP_SNPRINTF_SAFE(soap->tmpbuf, sizeof(soap->tmpbuf)), "Basic realm=\"%s\"", (soap->authrealm && strlen(soap->authrealm) + 14 < sizeof(soap->tmpbuf)) ? soap->authrealm : "gSOAP Web Service"); err = soap->fposthdr(soap, "WWW-Authenticate", soap->tmpbuf); if (err) return err; } else if ((status >= 301 && status <= 303) || status == 307) { err = soap->fposthdr(soap, "Location", soap->endpoint); if (err) return err; } #endif err = soap->fposthdr(soap, "Server", "gSOAP/2.8"); if (err) return err; if (soap->cors_origin) { err = soap->fposthdr(soap, "Access-Control-Allow-Origin", soap->cors_origin); if (err) return err; err = soap->fposthdr(soap, "Access-Control-Allow-Credentials", "true"); if (err) return err; if (soap->cors_methods) { err = soap->fposthdr(soap, "Access-Control-Allow-Methods", soap->cors_methods); if (err) return err; if (soap->cors_headers) { err = soap->fposthdr(soap, "Access-Control-Allow-Headers", soap->cors_headers); if (err) return err; } } } if (soap->x_frame_options) { err = soap->fposthdr(soap, "X-Frame-Options", soap->x_frame_options); if (err) return err; } soap->cors_origin = NULL; soap->cors_methods = NULL; soap->cors_headers = NULL; err = soap_puthttphdr(soap, status, count); if (err) return err; #ifdef WITH_COOKIES if (soap_putsetcookies(soap)) return soap->error; soap_free_cookies(soap); #endif return soap->fposthdr(soap, NULL, NULL); } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_response(struct soap *soap, int status) { ULONG64 count; if (!(soap->omode & (SOAP_ENC_PLAIN | SOAP_IO_STORE /* this tests for chunking too */)) && (status == SOAP_HTML || (status >= SOAP_FILE && status < SOAP_FILE + 600))) soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE; soap->status = status; count = soap_count_attachments(soap); if (soap_init_send(soap)) return soap->error; #ifndef WITH_NOHTTP if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_PLAIN)) { int k = soap->mode; soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB); if ((k & SOAP_IO) != SOAP_IO_FLUSH) soap->mode |= SOAP_IO_BUFFER; soap->error = soap->fresponse(soap, status, count); if (soap->error) return soap->error; #ifndef WITH_LEANER if ((k & SOAP_IO) == SOAP_IO_CHUNK) { if (soap_flush(soap)) return soap->error; } #endif soap->mode = k; } #endif #ifndef WITH_LEANER if (soap_begin_attachments(soap)) return soap->error; #endif return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_extend_url(struct soap *soap, const char *s, const char *t) { if (s) soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), s); else *soap->msgbuf = '\0'; if (t && (*t == '/' || *t == '?')) { char *r = strchr(soap->msgbuf, '?'); if (r) { if (*t == '?') { soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), "&"); soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), t + 1); } else /* *t == '/' */ { size_t l = r - soap->msgbuf; *r = '\0'; soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), t); if (s) soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), s + l); } } else { soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), t); } } return soap->msgbuf; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_extend_url_query(struct soap *soap, const char *s, const char *t) { (void)soap_extend_url(soap, s, t); /* fills and returns soap->msgbuf */ if (strchr(soap->msgbuf, '?')) soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), "&"); else soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), "?"); return soap->msgbuf; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_url_query(struct soap *soap, const char *s, const char *t) { size_t n = strlen(s); if (n) { char *r = soap->msgbuf; size_t k = n - (s[n-1] == '='); while ((r = strchr(r, '{')) != NULL) if (!strncmp(++r, s, k) && r[k] == '}') break; if (r) { size_t m = t ? strlen(t) : 0; (void)soap_memmove(r + m - 1, soap->msgbuf + sizeof(soap->msgbuf) - (r + n + 1), r + k + 1, strlen(r + k + 1) + 1); if (m) (void)soap_memmove(r - 1, soap->msgbuf + sizeof(soap->msgbuf) - (r - 1), t, m); } else { soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), s); if (t) { int m = (int)strlen(soap->msgbuf); /* msgbuf length is max SOAP_TMPLEN or just 1024 bytes */ (void)soap_encode_url(t, soap->msgbuf + m, (int)sizeof(soap->msgbuf) - m); } soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), "&"); } } } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_encode_url(const char *s, char *t, int len) { int c; int n = len; if (s && n > 0) { while ((c = *s++) && --n > 0) { if (c == '-' || c == '.' || (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || c == '_' || (c >= 'a' && c <= 'z') || 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 const char* SOAP_FMAC2 soap_encode_url_string(struct soap *soap, const char *s) { if (s) { int n = 3 * (int)strlen(s) + 1; char *t = (char*)soap_malloc(soap, n); if (t) { (void)soap_encode_url(s, t, n); return t; } } return SOAP_STR_EOS; } /******************************************************************************\ * * HTTP Cookies RFC 6265 * \******************************************************************************/ #ifdef WITH_COOKIES SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_cookie(struct soap *soap, const char *name, const char *domain, const char *path) { return soap_cookie_env(soap, name, domain, path, 0); } /******************************************************************************/ SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_cookie_env(struct soap *soap, const char *name, const char *domain, const char *path, short env) { struct soap_cookie *p; if (!domain && !env) domain = soap->cookie_domain; if (!path) path = soap->cookie_path; if (!path) path = SOAP_STR_EOS; else if (*path == '/') path++; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Search cookie='%s' domain='%s' path='%s' env=%hd\n", name, domain ? domain : "(null)", path ? path : "(null)", env)); 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 ((!env || p->env) && !strcmp(p->name, name) && (!domain || (domain && p->domain && !strcmp(p->domain, domain))) && (!path || (path && p->path && !strncmp(p->path, path, strlen(p->path))))) 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) { q = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie)); if (q) { size_t l = strlen(name) + 1; q->name = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) q->name = (char*)SOAP_MALLOC(soap, l); if (q->name) (void)soap_memcpy(q->name, l, name, l); 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) { if (!value || strcmp(value, q->value)) { SOAP_FREE(soap, q->value); q->value = NULL; } } if (value && *value && !q->value) { size_t l = strlen(value) + 1; q->value = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) q->value = (char*)SOAP_MALLOC(soap, l); if (q->value) soap_strcpy(q->value, l, value); } if (q->domain) { if (!domain || strcmp(domain, q->domain)) { SOAP_FREE(soap, q->domain); q->domain = NULL; } } if (domain && !q->domain) { size_t l = strlen(domain) + 1; q->domain = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) q->domain = (char*)SOAP_MALLOC(soap, l); if (q->domain) soap_strcpy(q->domain, l, domain); } if (q->path) { if (!path || strncmp(path, q->path, strlen(q->path))) { SOAP_FREE(soap, q->path); q->path = NULL; } } if (path && !q->path) { size_t l = strlen(path) + 1; q->path = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) q->path = (char*)SOAP_MALLOC(soap, l); if (q->path) soap_strcpy(q->path, l, 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) path = SOAP_STR_EOS; else if (*path == '/') path++; for (p = &soap->cookies, q = *p; q; q = *p) { if (!strcmp(q->name, name) && (!q->domain || !strcmp(q->domain, domain)) && (!q->path || !strncmp(q->path, path, strlen(q->path)))) { 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 p = &q->next; } } /******************************************************************************/ SOAP_FMAC1 const char * SOAP_FMAC2 soap_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; p = soap_cookie(soap, name, domain, path); if (p) return p->value; return NULL; } /******************************************************************************/ SOAP_FMAC1 const char * SOAP_FMAC2 soap_env_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; p = soap_cookie(soap, name, domain, path); if (p && 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; p = soap_cookie(soap, name, domain, path); if (p) return (time_t)p->expire; return -1; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_expire(struct soap *soap, const char *name, long maxage, const char *domain, const char *path) { struct soap_cookie *p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set cookie expiration max-age=%ld: cookie='%s' domain='%s' path='%s'\n", maxage, name, domain ? domain : "(null)", path ? path : "(null)")); p = soap_cookie(soap, name, domain, path); if (p) { p->maxage = maxage; p->modified = 1; return SOAP_OK; } return SOAP_ERR; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_secure(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set cookie secure: cookie='%s' domain='%s' path='%s'\n", name, domain ? domain : "(null)", path ? path : "(null)")); p = soap_cookie(soap, name, domain, path); if (p) { p->secure = 1; 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; p = soap_cookie(soap, name, domain, path); if (p) { 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; p = soap_cookie(soap, name, domain, path); if (p) { 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 ) && p->name && p->value && *p->name && *p->value) { s = tmp; s += soap_encode_url(p->name, s, 3967); *s++ = '='; s += soap_encode_url(p->value, s, 3968 - (int)(s-tmp)); t = p->domain ? p->domain : soap->cookie_domain; if (t && (int)strlen(t) < 3968 - (int)(s-tmp)) { soap_strcpy(s, 4096 - (s-tmp), ";Domain="); s += 8; soap_strcpy(s, 4096 - (s-tmp), t); s += strlen(s); } t = p->path ? p->path : soap->cookie_path; if (t && (int)strlen(t) < 3976 - (int)(s-tmp)) { soap_strcpy(s, 4096 - (s-tmp), ";Path=/"); s += 7; if (*t == '/') t++; if (strchr(t, '%')) /* already URL encoded? */ { soap_strcpy(s, 4096 - (s-tmp), t); s += strlen(s); } else { s += soap_encode_url(t, s, 4096 - (int)(s-tmp)); } } if (p->version > 0 && s-tmp < 3983) { (SOAP_SNPRINTF(s, 4096 - (s-tmp), 29), ";Version=%u", p->version); s += strlen(s); } if (p->maxage >= 0 && s-tmp < 4012) { (SOAP_SNPRINTF(s, 4096 - (s-tmp), 29), ";Max-Age=%ld", p->maxage); s += strlen(s); } #if !defined(WITH_LEAN) #if defined(HAVE_GMTIME_R) || defined(HAVE_GMTIME) if (p->maxage >= 0 && s-tmp < 4041) { time_t n = time(NULL) + p->maxage; struct tm T, *pT = &T; size_t l = 0; /* format is Wed, 09 Jun 2021 10:18:14 GMT */ #if defined(HAVE_GMTIME_R) if (gmtime_r(&n, pT) != SOAP_FUNC_R_ERR) l = strftime(s, 4096 - (s-tmp), ";Expires=%a, %d %b %Y %H:%M:%S GMT", pT); #else pT = gmtime(&n); if (pT) l = strftime(s, 4096 - (s-tmp), ";Expires=%a, %d %b %Y %H:%M:%S GMT", pT); #endif s += l; } #endif #endif if (s-tmp < 4079 && (p->secure #ifdef WITH_OPENSSL || soap->ssl #endif )) { soap_strcpy(s, 4096 - (s-tmp), ";Secure"); s += strlen(s); } if (s-tmp < 4086) soap_strcpy(s, 4096 - (s-tmp), ";HttpOnly"); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set-Cookie: %s\n", tmp)); soap->error = soap->fposthdr(soap, "Set-Cookie", tmp); if (soap->error) 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; char *s, tmp[4096]; unsigned int version = 0; time_t now = time(NULL); if (!domain || !path) return SOAP_OK; s = tmp; 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 >= (time_t)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; if (!tcp_gethostbyname(soap, (char*)domain, &hostent, NULL)) { const char *r = hostent.h_name; if (*t == '.') { size_t k = strlen(hostent.h_name); if (k >= n) r = hostent.h_name + k - n; } flag = !strncmp(t, r, n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Domain cookie %s host %s (match=%d)\n", t, r, flag)); } } #endif if (flag && (!q->path || !strncmp(q->path, path, strlen(q->path))) #ifndef WITH_INSECURE_COOKIES && (!q->secure || secure) #endif ) { size_t n = 12; if (q->name) n += 3*strlen(q->name); if (q->value && *q->value) n += 3*strlen(q->value) + 1; if (q->path && *q->path) n += strlen(q->path) + 9; if (q->domain) n += strlen(q->domain) + 11; if (s + n >= tmp + sizeof(tmp)) { if (s == tmp) return SOAP_OK; /* header too big, cannot split */ /* split up HTTP header */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie: %s\n", tmp)); soap->error = soap->fposthdr(soap, "Cookie", tmp); if (soap->error) return soap->error; s = tmp; } else if (s != tmp) { *s++ = ';'; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending cookie %s=%s path=\"/%s\" domain=\"%s\"\n", q->name ? q->name : "(null)", q->value ? q->value : "(null)", q->path ? q->path : "(null)", q->domain ? q->domain : "(null)")); if (q->version != version && (s-tmp) + (size_t)36 < sizeof(tmp)) { (SOAP_SNPRINTF_SAFE(s, sizeof(tmp) - (s-tmp)), "$Version=%u;", q->version); version = q->version; s += strlen(s); } if (q->name && (s-tmp) + strlen(q->name) + (size_t)15 < sizeof(tmp)) { s += soap_encode_url(q->name, s, (int)(tmp+sizeof(tmp)-s)-15); } if (q->value && *q->value && (s-tmp) + strlen(q->value) + (size_t)16 < sizeof(tmp)) { *s++ = '='; s += soap_encode_url(q->value, s, (int)(tmp+sizeof(tmp)-s)-16); } if (q->path && (s-tmp) + strlen(q->path) + (size_t)36 < sizeof(tmp)) { (SOAP_SNPRINTF_SAFE(s, sizeof(tmp) - (s-tmp)), ";$Path=\"/%s\"", (*q->path == '/' ? q->path + 1 : q->path)); s += strlen(s); } if (q->domain && (s-tmp) + strlen(q->domain) + (size_t)36 < sizeof(tmp)) { (SOAP_SNPRINTF_SAFE(s, sizeof(tmp) - (s-tmp)), ";$Domain=\"%s\"", q->domain); s += strlen(s); } } p = &q->next; } } if (s != tmp) { soap->error = soap->fposthdr(soap, "Cookie", tmp); if (soap->error) return soap->error; } 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")) { s = soap_decode_val(tmp, sizeof(tmp), s); if (s) { if (p) p->version = (int)soap_strtol(tmp, NULL, 10); else version = (int)soap_strtol(tmp, NULL, 10); } } else if (!soap_tag_cmp(tmp, "$Path")) { s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { size_t l = strlen(tmp) + 1; t = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) t = (char*)SOAP_MALLOC(soap, l); if (t) (void)soap_memcpy((void*)t, l, (const void*)tmp, l); } 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) { size_t l = strlen(tmp) + 1; t = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) t = (char*)SOAP_MALLOC(soap, l); if (t) (void)soap_memcpy((void*)t, l, (const void*)tmp, l); } 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) { size_t l = strlen(tmp) + 1; p->path = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) p->path = (char*)SOAP_MALLOC(soap, l); if (p->path) (void)soap_memcpy((void*)p->path, l, (const void*)tmp, l); } 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) { size_t l = strlen(tmp) + 1; p->domain = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) p->domain = (char*)SOAP_MALLOC(soap, l); if (p->domain) (void)soap_memcpy((void*)p->domain, l, (const void*)tmp, l); } else { p->domain = NULL; } } else if (p && !soap_tag_cmp(tmp, "Version")) { s = soap_decode_val(tmp, sizeof(tmp), s); p->version = (unsigned int)soap_strtoul(tmp, NULL, 10); } else if (p && !soap_tag_cmp(tmp, "Max-Age")) { s = soap_decode_val(tmp, sizeof(tmp), s); p->expire = (ULONG64)(now + soap_strtol(tmp, NULL, 10)); } else if (p && !soap_tag_cmp(tmp, "Expires")) { if (*s == '=') { s = soap_decode(tmp, sizeof(tmp), s + 1, ";"); if (!p->expire && strlen(tmp) >= 23) { char a[3]; struct tm T; static const char mns[] = "anebarprayunulugepctovec"; const char *t = strchr(tmp, ' '); if (t) { a[2] = '\0'; memset((void*)&T, 0, sizeof(T)); if (t[1] >= 'A') { /* format is Sun Nov 6 08:49:37 94 */ a[0] = t[2]; a[1] = t[3]; T.tm_mon = (int)(strstr(mns, a) - mns) / 2; a[0] = t[5]; a[1] = t[6]; T.tm_mday = (int)soap_strtol(a, NULL, 10); if (t[17] && t[18] && t[19] != ' ') t += 2; /* format is Sun Nov 6 08:49:37 2017 - ANSI-C */ a[0] = t[17]; a[1] = t[18]; T.tm_year = 100 + (int)soap_strtol(a, NULL, 10); t += 6; } else { /* format is Sunday, 06-Nov-17 08:49:37 GMT - RFC 850 */ a[0] = t[1]; a[1] = t[2]; T.tm_mday = (int)soap_strtol(a, NULL, 10); a[0] = t[5]; a[1] = t[6]; T.tm_mon = (int)(strstr(mns, a) - mns) / 2; if (t[10] != ' ') t += 2; /* format is Wed, 09 Jun 2021 10:18:14 GMT - RFC 822 */ a[0] = t[8]; a[1] = t[9]; T.tm_year = 100 + (int)soap_strtol(a, NULL, 10); t += 11; } a[0] = t[0]; a[1] = t[1]; T.tm_hour = (int)soap_strtol(a, NULL, 10); a[0] = t[3]; a[1] = t[4]; T.tm_min = (int)soap_strtol(a, NULL, 10); a[0] = t[6]; a[1] = t[7]; T.tm_sec = (int)soap_strtol(a, NULL, 10); p->expire = (ULONG64)soap_timegm(&T); } } } } else if (p && !soap_tag_cmp(tmp, "Secure")) { p->secure = 1; s = soap_decode_val(tmp, sizeof(tmp), s); } else if (p && !soap_tag_cmp(tmp, "HttpOnly")) { s = soap_decode_val(tmp, sizeof(tmp), s); } else if (p && !soap_tag_cmp(tmp, "Comment")) { s = soap_decode_val(tmp, sizeof(tmp), s); } else if (*tmp) { if (p) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie='%s' value='%s' domain='%s' path='%s' expire=" SOAP_ULONG_FORMAT " secure=%d\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->expire, p->secure)); q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path); if (q) { 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); } p = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie)); if (p) { size_t l = strlen(tmp) + 1; p->name = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) p->name = (char*)SOAP_MALLOC(soap, l); if (p->name) (void)soap_memcpy(p->name, l, tmp, l); s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { l = strlen(tmp) + 1; p->value = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) p->value = (char*)SOAP_MALLOC(soap, l); if (p->value) (void)soap_memcpy((void*)p->value, l, (const void*)tmp, l); } else { p->value = NULL; } if (domain) { p->domain = domain; } else { p->domain = NULL; } if (path) { p->path = path; } else if (*soap->path) { l = strlen(soap->path) + 1; p->path = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) p->path = (char*)SOAP_MALLOC(soap, l); if (p->path) (void)soap_memcpy((void*)p->path, l, (const void*)soap->path, l); } else { p->path = (char*)SOAP_MALLOC(soap, 2); if (p->path) (void)soap_memcpy((void*)p->path, 2, (const void*)"/", 2); } p->expire = 0; p->secure = 0; p->version = version; } } } if (p) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie='%s' value='%s' domain='%s' path='%s' expire=" SOAP_ULONG_FORMAT " secure=%d\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->expire, p->secure)); q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path); if (q) { 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] */ s = getenv("HTTP_COOKIE"); if (!s) 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; (void)copy; q = &r; for (p = soap->cookies; p; p = p->next) { *q = (struct soap_cookie*)SOAP_MALLOC(copy, sizeof(struct soap_cookie)); if (!*q) return r; **q = *p; if (p->name) { size_t l = strlen(p->name) + 1; (*q)->name = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) (*q)->name = (char*)SOAP_MALLOC(copy, l); if ((*q)->name) (void)soap_memcpy((*q)->name, l, p->name, l); } if (p->value) { size_t l = strlen(p->value) + 1; (*q)->value = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) (*q)->value = (char*)SOAP_MALLOC(copy, l); if ((*q)->value) (void)soap_memcpy((*q)->value, l, p->value, l); } if (p->domain) { size_t l = strlen(p->domain) + 1; (*q)->domain = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) (*q)->domain = (char*)SOAP_MALLOC(copy, l); if ((*q)->domain) (void)soap_memcpy((*q)->domain, l, p->domain, l); } if (p->path) { size_t l = strlen(p->path) + 1; (*q)->path = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) (*q)->path = (char*)SOAP_MALLOC(copy, l); if ((*q)->path) (void)soap_memcpy((*q)->path, l, p->path, l); } 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 */ /******************************************************************************/ SOAP_FMAC1 size_t SOAP_FMAC2 soap_hash(const char *s) { size_t h = 0; while (*s) h = 65599*h + *s++; return h % SOAP_IDHASH; } /******************************************************************************/ static void soap_init_pht(struct soap *soap) { int i; soap->pblk = NULL; soap->pidx = 0; for (i = 0; i < (int)SOAP_PTRHASH; i++) soap->pht[i] = NULL; } /******************************************************************************/ SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_versioning(soap_new)(soap_mode imode, soap_mode omode) { struct soap *soap; #ifdef __cplusplus soap = SOAP_NEW_UNMANAGED(struct soap); #else soap = (struct soap*)SOAP_MALLOC_UNMANAGED(sizeof(struct soap)); #endif if (soap) soap_versioning(soap_init)(soap, imode, omode); return soap; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_free(struct soap *soap) { soap_done(soap); #ifdef __cplusplus SOAP_DELETE_UNMANAGED(soap); #else SOAP_FREE_UNMANAGED(soap); #endif } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_del(struct soap *soap) { free(soap); } /******************************************************************************/ static void soap_free_pht(struct soap *soap) { struct soap_pblk *pb, *next; 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; } /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_embed(struct soap *soap, const void *p, const void *a, int n, int t) { int id; struct soap_plist *pp; if (soap->version == 2) soap->encoding = 1; if (!p || (!soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH)) || (soap->mode & SOAP_XML_TREE)) return 0; 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_is_single(soap, pp)) return 0; soap_set_embedded(soap, pp); } return id; } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup(struct soap *soap, const void *p, int type, struct soap_plist **ppp) { 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; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_enter(struct soap *soap, const void *p, const void *a, int n, int type, struct soap_plist **ppp) { size_t h; struct soap_plist *pp; (void)n; if (!soap->pblk || soap->pidx >= SOAP_PTRBLK) { 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); else h = soap_hash_ptr(p); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pointer enter location=%p array=%p size=%lu type=%d id=%d\n", p, a, (unsigned long)n, type, soap->idnum+1)); pp->next = soap->pht[h]; pp->type = type; pp->mark1 = 0; pp->mark2 = 0; pp->ptr = p; pp->dup = NULL; pp->array = a; pp->size = n; soap->pht[h] = pp; pp->id = ++soap->idnum; return pp->id; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_array_pointer_lookup(struct soap *soap, const void *p, const void *a, int n, int type, struct soap_plist **ppp) { struct soap_plist *pp; *ppp = NULL; if (!p || !a) return 0; for (pp = soap->pht[soap_hash_ptr(a)]; pp; pp = pp->next) { if (pp->type == type && pp->array == a && pp->size == n) { *ppp = pp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d id=%d\n", a, type, pp->id)); return pp->id; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d: not found\n", a, type)); return 0; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_begin_count(struct soap *soap) { soap_free_ns(soap); soap->error = SOAP_OK; #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_UDP)) { soap->mode &= SOAP_IO; soap->mode |= SOAP_IO_BUFFER | SOAP_ENC_PLAIN; } if ((soap->mode & SOAP_IO) == SOAP_IO_STORE || (((soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_ENC_PLAIN)) #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_PLAIN)) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } #endif #ifndef WITH_LEANER if ((soap->mode & SOAP_ENC_MTOM) && (soap->mode & SOAP_ENC_DIME)) soap->mode |= SOAP_ENC_MIME; else if (!(soap->mode & SOAP_ENC_MIME)) 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_SEND; soap->event = 0; soap->evlev = 0; soap->idnum = 0; soap->body = 1; soap->level = 0; soap_clr_attr(soap); soap_set_local_namespaces(soap); #ifndef WITH_LEANER soap->dime.size = 0; /* accumulate total size of attachments */ if (soap->fprepareinitsend && (soap->mode & SOAP_IO) != SOAP_IO_STORE && (soap->error = soap->fprepareinitsend(soap)) != SOAP_OK) return soap->error; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin count phase (socket=%d mode=0x%x count=" SOAP_ULONG_FORMAT ")\n", (int)soap->socket, (unsigned int)soap->mode, soap->count)); #ifndef WITH_LEANER if ((soap->mode & SOAP_IO_LENGTH)) return soap_begin_attachments(soap); #endif return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_end_count(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of count phase\n")); #ifndef WITH_LEANER if ((soap->mode & SOAP_IO_LENGTH)) { if (soap_end_attachments(soap)) return soap->error; if (soap->fpreparefinalsend && (soap->error = soap->fpreparefinalsend(soap)) != SOAP_OK) return soap->error; } #else (void)soap; #endif return SOAP_OK; } /******************************************************************************/ static int soap_init_send(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing for output to socket=%d/fd=%d\n", (int)soap->socket, soap->sendfd)); *soap->tag = '\0'; soap_free_ns(soap); soap->error = SOAP_OK; soap->mode = soap->omode | (soap->mode & (SOAP_IO_LENGTH | SOAP_ENC_DIME)); #ifndef WITH_LEAN if ((soap->mode & SOAP_IO_UDP)) { soap->mode &= ~SOAP_IO; soap->mode |= SOAP_IO_BUFFER | SOAP_ENC_PLAIN; if ((soap->mode & SOAP_IO_LENGTH) && soap->count > sizeof(soap->buf)) return soap->error = SOAP_UDP_ERROR; } #endif #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH) { if ((soap->mode & SOAP_ENC_PLAIN)) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } #endif #if !defined(__cplusplus) || defined(WITH_COMPAT) if (soap->os) { *soap->os = NULL; soap->mode = (soap->mode & ~SOAP_IO) | SOAP_IO_STORE; } else #endif if ((soap->mode & SOAP_IO) == SOAP_IO_FLUSH && soap_valid_socket(soap->socket)) { if ((soap->mode & SOAP_IO_LENGTH) || (soap->mode & SOAP_ENC_PLAIN)) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } soap->mode &= ~SOAP_IO_LENGTH; if ((soap->mode & SOAP_IO) == SOAP_IO_STORE && soap_alloc_block(soap) == NULL) return soap->error; if (!(soap->mode & SOAP_IO_KEEPALIVE)) soap->keep_alive = 0; #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 if (!(soap->mode & SOAP_ENC_MIME)) { 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) && !soap->os && soap->sendfd >= 0) /* Set win32 stdout or soap->sendfd to BINARY, e.g. to support DIME */ #ifdef __BORLANDC__ setmode(soap->sendfd, _O_BINARY); #else _setmode(soap->sendfd, _O_BINARY); #endif #endif #endif #endif #endif if ((soap->mode & SOAP_IO)) soap->buflen = soap->bufidx = 0; soap->chunksize = 0; soap->ns = 0; soap->null = 0; soap->position = 0; soap->mustUnderstand = 0; soap->encoding = 0; soap->event = 0; soap->evlev = 0; soap->idnum = 0; soap->body = 1; 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->d_stream) { soap->d_stream = (z_stream*)SOAP_MALLOC(soap, sizeof(z_stream)); if (!soap->d_stream) return soap->error = SOAP_EOM; soap->d_stream->zalloc = Z_NULL; soap->d_stream->zfree = Z_NULL; soap->d_stream->opaque = Z_NULL; soap->d_stream->next_in = Z_NULL; } if (!soap->z_buf) soap->z_buf = (char*)SOAP_MALLOC(soap, sizeof(soap->buf)); if (!soap->z_buf) return soap->error = SOAP_EOM; soap->d_stream->next_out = (Byte*)soap->z_buf; soap->d_stream->avail_out = sizeof(soap->buf); #ifdef WITH_GZIP if (soap->zlib_out != SOAP_ZLIB_DEFLATE) { (void)soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)"\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 = sizeof(soap->buf) - 10; soap->z_crc = crc32(0L, NULL, 0); soap->zlib_out = SOAP_ZLIB_GZIP; if (soap->z_dict) *((Byte*)soap->z_buf + 2) = 0xff; 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; if (soap->z_dict) { if (deflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != 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=" SOAP_ULONG_FORMAT ")\n", (int)soap->socket, soap->mode, soap->count)); soap->part = SOAP_BEGIN_SEND; #ifndef WITH_LEANER if (soap->fprepareinitsend && (soap->mode & SOAP_IO) == SOAP_IO_STORE && (soap->error = soap->fprepareinitsend(soap)) != SOAP_OK) return soap->error; #endif #ifndef WITH_LEAN soap->start = (ULONG64)time(NULL); #endif return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_begin_send(struct soap *soap) { #ifndef WITH_LEANER if (soap_init_send(soap)) return soap->error; return soap_begin_attachments(soap); #else return soap_init_send(soap); #endif } /******************************************************************************/ #ifndef WITH_NOIDREF 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 /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_reference(struct soap *soap, const void *p, int t) { struct soap_plist *pp; if (!p || (!soap->encodingStyle && !(soap->omode & (SOAP_ENC_DIME | SOAP_ENC_MIME | SOAP_ENC_MTOM | SOAP_XML_GRAPH))) || (soap->omode & 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)) { 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 /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_array_reference(struct soap *soap, const void *p, const void *a, int n, int t) { struct soap_plist *pp; if (!p || !a || (!soap->encodingStyle && !(soap->omode & SOAP_XML_GRAPH)) || (soap->omode & SOAP_XML_TREE)) return 1; if (soap_array_pointer_lookup(soap, p, a, n, t, &pp)) { if (pp->mark1 == 0) { pp->mark1 = 2; pp->mark2 = 2; } } else if (!soap_pointer_enter(soap, p, a, n, t, &pp)) { return 1; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array reference %p ptr=%p n=%lu t=%d (%d %d)\n", p, a, (unsigned long)n, t, (int)pp->mark1, (int)pp->mark2)); return pp->mark1; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_attachment_reference(struct soap *soap, const void *p, const void *a, int n, int t, const char *id, const char *type) { struct soap_plist *pp; if (!p || !a || (!soap->encodingStyle && !(soap->omode & SOAP_XML_GRAPH) && !id && !type) || (soap->omode & SOAP_XML_TREE)) return 1; if (soap_array_pointer_lookup(soap, p, a, n, t, &pp)) { if (pp->mark1 == 0) { pp->mark1 = 2; pp->mark2 = 2; } } else if (!soap_pointer_enter(soap, p, a, n, t, &pp)) { return 1; } if (id || type) soap->mode |= SOAP_ENC_DIME; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Attachment reference %p ptr=%p n=%lu t=%d (%d %d)\n", p, a, (unsigned long)n, t, (int)pp->mark1, (int)pp->mark2)); return pp->mark1; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_embedded_id(struct soap *soap, int id, const void *p, int t) { struct soap_plist *pp = NULL; if (id >= 0 || (!soap->encodingStyle && !(soap->omode & SOAP_XML_GRAPH)) || (soap->omode & SOAP_XML_TREE)) return id; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id %p type=%d id=%d\n", p, t, id)); if (id < -1) return soap_embed(soap, p, NULL, 0, t); if (id < 0) { id = soap_pointer_lookup(soap, p, t, &pp); if (soap->version == 1 && soap->part != SOAP_IN_HEADER) { 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; } else if (id) { 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 /******************************************************************************/ #ifndef WITH_NOIDREF 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->omode & 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 /******************************************************************************/ #ifndef WITH_NOIDREF 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 /******************************************************************************/ #ifndef WITH_NOIDREF 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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_attachment(struct soap *soap, const char *tag, int id, const void *p, const void *a, int n, const char *aid, const char *atype, const char *aoptions, const char *type, int t) { struct soap_plist *pp; int i; if (!p || !a || (!aid && !atype) || (!soap->encodingStyle && !(soap->omode & (SOAP_ENC_DIME | SOAP_ENC_MIME | SOAP_ENC_MTOM | SOAP_XML_GRAPH))) || (soap->omode & SOAP_XML_TREE)) return soap_element_id(soap, tag, id, p, a, n, type, t, NULL); 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) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(soap->dime_id_format) + 20), soap->dime_id_format, id); aid = soap_strdup(soap, soap->tmpbuf); if (!aid) return -1; } /* Add MTOM xop:Include element when necessary */ /* TODO: this code to be obsoleted with new import/xop.h conventions */ if ((soap->omode & SOAP_ENC_MTOM) && strcmp(tag, "xop:Include")) { if (soap_element_begin_out(soap, tag, 0, type) || soap_element_href(soap, "xop:Include", 0, "xmlns:xop=\"http://www.w3.org/2004/08/xop/include\" 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->omode & SOAP_ENC_MTOM)) content = soap_alloc_multipart(soap, &soap->mime.first, &soap->mime.last, (const char*)a, n); else content = soap_alloc_multipart(soap, &soap->dime.first, &soap->dime.last, (const char*)a, n); if (!content) { soap->error = SOAP_EOM; return -1; } if (!strncmp(aid, "cid:", 4)) /* RFC 2111 */ { if ((soap->omode & SOAP_ENC_MTOM)) { size_t l = strlen(aid) - 1; char *s = (char*)soap_malloc(soap, l); if (s) { s[0] = '<'; (void)soap_strncpy(s + 1, l - 1, aid + 4, l - 3); s[l - 2] = '>'; s[l - 1] = '\0'; 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; } return -1; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF static void soap_init_iht(struct soap *soap) { int i; for (i = 0; i < SOAP_IDHASH; i++) soap->iht[i] = NULL; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF static void soap_free_iht(struct soap *soap) { int i; struct soap_ilist *ip = NULL, *p = NULL; 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 /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 struct soap_ilist * SOAP_FMAC2 soap_lookup(struct soap *soap, const char *id) { 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 /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 struct soap_ilist * SOAP_FMAC2 soap_enter(struct soap *soap, const char *id, int t, size_t n) { size_t h; struct soap_ilist *ip = NULL; size_t l = strlen(id); if (sizeof(struct soap_ilist) + l > l && (SOAP_MAXALLOCSIZE <= 0 || sizeof(struct soap_ilist) + l <= SOAP_MAXALLOCSIZE)) ip = (struct soap_ilist*)SOAP_MALLOC(soap, sizeof(struct soap_ilist) + l); if (ip) { ip->type = t; ip->size = n; ip->ptr = NULL; ip->spine = NULL; ip->link = NULL; ip->copy = NULL; ip->flist = NULL; ip->smart = NULL; ip->shaky = 0; (void)soap_memcpy((char*)ip->id, l + 1, id, l + 1); h = soap_hash(id); /* h = (HASH(id) % SOAP_IDHASH) so soap->iht[h] is safe */ ip->next = soap->iht[h]; soap->iht[h] = ip; } return ip; } #endif /******************************************************************************/ SOAP_FMAC1 void* SOAP_FMAC2 soap_malloc(struct soap *soap, size_t n) { char *p; size_t k = n; if (SOAP_MAXALLOCSIZE > 0 && n > SOAP_MAXALLOCSIZE) { soap->error = SOAP_EOM; return NULL; } if (!soap) return SOAP_MALLOC(soap, n); n += sizeof(short); n += (~n+1) & (sizeof(void*)-1); /* align at 4-, 8- or 16-byte boundary by rounding up */ if (n + sizeof(void*) + sizeof(size_t) < k) { soap->error = SOAP_EOM; return NULL; } p = (char*)SOAP_MALLOC(soap, n + sizeof(void*) + sizeof(size_t)); if (!p) { soap->error = SOAP_EOM; return NULL; } /* set a canary word to detect memory overruns and data corruption */ *(unsigned short*)(p + n - sizeof(unsigned short)) = (unsigned 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; return p; } /******************************************************************************/ #ifdef SOAP_MEM_DEBUG static void soap_init_mht(struct soap *soap) { 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) { int i; 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) { void *p = malloc(size); if (soap) { size_t h = soap_hash_ptr(p); struct soap_mlist *mp = (struct soap_mlist*)malloc(sizeof(struct soap_mlist)); if (soap->fdebug[SOAP_INDEX_TEST]) { 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) { if (!soap) { free(p); } else { size_t h = soap_hash_ptr(p); struct soap_mlist *mp; for (mp = soap->mht[h]; mp; mp = mp->next) if (mp->ptr == p) break; if (mp) { if (mp->live) { if (soap->fdebug[SOAP_INDEX_TEST]) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): free(%p)\n", file, line, p)); } free(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) { size_t h = soap_hash_ptr(p); struct soap_mlist *mp; for (mp = soap->mht[h]; mp; mp = mp->next) if (mp->ptr == p) break; if (mp) mp->live = 0; } #endif /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_dealloc(struct soap *soap, void *p) { if (soap_check_state(soap)) return; if (p) { char **q; for (q = (char**)(void*)&soap->alist; *q; q = *(char***)q) { if (*(unsigned short*)(char*)(*q - sizeof(unsigned short)) != (unsigned 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 { char *q; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free all soap_malloc() data\n")); while (soap->alist) { q = (char*)soap->alist; if (*(unsigned short*)(char*)(q - sizeof(unsigned short)) != (unsigned 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); } /* assume these were deallocated: */ soap->http_content = NULL; soap->action = NULL; soap->fault = NULL; soap->header = NULL; soap->bearer = NULL; soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif #ifndef WITH_LEANER soap_clr_mime(soap); #endif } } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_delete(struct soap *soap, void *p) { struct soap_clist **cp; if (soap_check_state(soap)) return; cp = &soap->clist; if (p) { while (*cp) { if (p == (*cp)->ptr) { struct soap_clist *q = *cp; *cp = q->next; if (q->fdelete(soap, 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) { struct soap_clist *q = *cp; *cp = q->next; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Delete %p type=%d (cp=%p)\n", q->ptr, q->type, (void*)q)); if (q->fdelete(soap, 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; /* assume this was deallocated */ soap->header = NULL; /* assume this was deallocated */ } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_delegate_deletion(struct soap *soap, struct soap *soap_to) { struct soap_clist *cp; char **q; #ifdef SOAP_MEM_DEBUG void *p; struct soap_mlist **mp, *mq; size_t h; #endif for (q = (char**)(void*)&soap->alist; *q; q = *(char***)q) { if (*(unsigned short*)(char*)(*q - sizeof(unsigned short)) != (unsigned 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; } #ifdef SOAP_MEM_DEBUG p = (void*)(*q - *(size_t*)(*q + sizeof(void*))); h = soap_hash_ptr(p); for (mp = &soap->mht[h]; *mp; mp = &(*mp)->next) { if ((*mp)->ptr == p) { mq = *mp; *mp = mq->next; mq->next = soap_to->mht[h]; soap_to->mht[h] = mq; break; } } #endif } *q = (char*)soap_to->alist; soap_to->alist = soap->alist; soap->alist = NULL; #ifdef SOAP_MEM_DEBUG cp = soap->clist; while (cp) { h = soap_hash_ptr(cp); for (mp = &soap->mht[h]; *mp; mp = &(*mp)->next) { if ((*mp)->ptr == cp) { mq = *mp; *mp = mq->next; mq->next = soap_to->mht[h]; soap_to->mht[h] = mq; break; } } cp = cp->next; } #endif cp = soap_to->clist; if (cp) { while (cp->next) cp = cp->next; cp->next = soap->clist; } else { soap_to->clist = soap->clist; } soap->clist = NULL; } /******************************************************************************/ SOAP_FMAC1 struct soap_clist * SOAP_FMAC2 soap_link(struct soap *soap, int t, int n, int (*fdelete)(struct soap*, struct soap_clist*)) { struct soap_clist *cp = NULL; if (soap) { if (n != SOAP_NO_LINK_TO_DELETE) { cp = (struct soap_clist*)SOAP_MALLOC(soap, sizeof(struct soap_clist)); if (!cp) { soap->error = SOAP_EOM; } else { cp->next = soap->clist; cp->type = t; cp->size = n; cp->ptr = NULL; cp->fdelete = fdelete; soap->clist = cp; } } soap->alloced = t; } return cp; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_unlink(struct soap *soap, const void *p) { char **q; struct soap_clist **cp; if (soap && p) { for (q = (char**)(void*)&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 SOAP_OK; /* found and removed from dealloc chain */ } } 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 SOAP_OK; /* found and removed from dealloc chain */ } } } return SOAP_ERR; } /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_lookup_type(struct soap *soap, const char *id) { 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 /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 short SOAP_FMAC2 soap_begin_shaky(struct soap *soap) { short f = soap->shaky; soap->shaky = 1; return f; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 void SOAP_FMAC2 soap_end_shaky(struct soap *soap, short f) { soap->shaky = f; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF static int soap_is_shaky(struct soap *soap, void *p) { (void)p; if (!soap->blist && !soap->shaky) return 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shaky %p\n", p)); return 1; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 void* SOAP_FMAC2 soap_id_lookup(struct soap *soap, const char *id, void **p, int t, size_t n, unsigned int k, int (*fbase)(int, int)) { struct soap_ilist *ip; if (!p || !id || !*id) return p; ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */ if (!ip) { ip = soap_enter(soap, id, t, n); /* new hash table entry for string id */ if (!ip) return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding first href='%s' type=%d location=%p (%u bytes) level=%u\n", id, t, (void*)p, (unsigned int)n, k)); *p = NULL; if (k) { int i; if (k > SOAP_MAXPTRS) return NULL; ip->spine = (void**)soap_malloc(soap, SOAP_MAXPTRS * sizeof(void*)); if (!ip->spine) return NULL; ip->spine[0] = NULL; for (i = 1; i < SOAP_MAXPTRS; i++) ip->spine[i] = &ip->spine[i - 1]; *p = &ip->spine[k - 1]; } else { ip->link = p; ip->shaky = soap_is_shaky(soap, (void*)p); } } else if (ip->type != t && (!fbase || !fbase(ip->type, t)) && (!fbase || !fbase(t, ip->type) || soap_type_punned(soap, ip))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup type incompatibility: ref='%s' id-type=%d ref-type=%d\n", id, ip->type, t)); (void)soap_id_nullify(soap, id); return NULL; } else if (k == 0 && ip->ptr && !ip->shaky) /* when block lists are in use, ip->ptr will change */ { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolved href='%s' type=%d location=%p (%u bytes) level=%u\n", id, t, ip->ptr, (unsigned int)n, k)); *p = ip->ptr; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarded href='%s' type=%d location=%p (%u bytes) level=%u\n", id, t, (void*)p, (unsigned int)n, k)); if (fbase && fbase(t, ip->type) && !soap_type_punned(soap, ip)) { ip->type = t; ip->size = n; } *p = NULL; if (k) { if (!ip->spine) { int i; if (k > SOAP_MAXPTRS) return NULL; ip->spine = (void**)soap_malloc(soap, SOAP_MAXPTRS * sizeof(void*)); if (!ip->spine) return NULL; ip->spine[0] = NULL; for (i = 1; i < SOAP_MAXPTRS; i++) ip->spine[i] = &ip->spine[i - 1]; } *p = &ip->spine[k - 1]; if (ip->ptr && !ip->shaky) ip->spine[0] = ip->ptr; } else { void *q = ip->link; ip->link = p; ip->shaky = soap_is_shaky(soap, (void*)p); *p = q; } } return p; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 void* SOAP_FMAC2 soap_id_forward(struct soap *soap, const char *href, void *p, size_t i, int t, int tt, size_t n, unsigned int k, void (*finsert)(struct soap*, int, int, void*, size_t, const void*, void**), int (*fbase)(int, int)) { 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) { ip = soap_enter(soap, href, t, n); /* new hash table entry for string id */ if (!ip) return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New entry href='%s' type=%d size=%lu level=%d location=%p\n", href, t, (unsigned long)n, k, p)); } else if ((ip->type != t || ip->size != n) && k == 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forward 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, t, (unsigned long)n)); (void)soap_id_nullify(soap, href); return NULL; } if (finsert || n < sizeof(void*)) { struct soap_flist *fp = (struct soap_flist*)SOAP_MALLOC(soap, sizeof(struct soap_flist)); if (!fp) { soap->error = SOAP_EOM; return NULL; } if (fbase && fbase(t, ip->type) && !soap_type_punned(soap, ip)) { ip->type = t; ip->size = n; } if ((ip->type != t || ip->size != n) && (!fbase || !fbase(ip->type, t))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forward 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, t, (unsigned long)n)); SOAP_FREE(soap, fp); (void)soap_id_nullify(soap, href); return NULL; } fp->next = ip->flist; fp->type = tt; fp->ptr = p; fp->level = k; fp->index = i; fp->finsert = finsert; ip->flist = fp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding type=%d (target type=%d) size=%lu location=%p level=%u index=%lu href='%s'\n", t, tt, (unsigned long)n, p, k, (unsigned long)i, href)); } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding copying address %p for type=%d href='%s'\n", p, t, href)); *(void**)p = ip->copy; ip->copy = p; } ip->shaky = soap_is_shaky(soap, p); return p; } #endif /******************************************************************************/ SOAP_FMAC1 void* SOAP_FMAC2 soap_id_enter(struct soap *soap, const char *id, void *p, int t, size_t n, const char *type, const char *arrayType, void *(*finstantiate)(struct soap*, int, const char*, const char*, size_t*), int (*fbase)(int, int)) { #ifndef WITH_NOIDREF struct soap_ilist *ip; #endif (void)id; (void)fbase; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enter id='%s' type=%d location=%p size=%lu\n", id, t, p, (unsigned long)n)); soap->alloced = 0; if (!p) { if (finstantiate) { p = finstantiate(soap, t, type, arrayType, &n); /* soap->alloced is set in soap_link() */ t = soap->alloced; } else { p = soap_malloc(soap, n); soap->alloced = t; } } #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 type=%d\n", id, p, t)); if (!ip) { ip = soap_enter(soap, id, t, n); /* new hash table entry for string id */ if (!ip) return NULL; ip->ptr = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New entry id='%s' type=%d size=%lu location=%p\n", id, t, (unsigned long)n, p)); if (!soap->alloced) ip->shaky = soap_is_shaky(soap, p); } else if (ip->ptr) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Multiply defined id='%s'\n", id)); soap_strcpy(soap->id, sizeof(soap->id), id); soap->error = SOAP_DUPLICATE_ID; return NULL; } else if ((ip->type != t && (!fbase || !fbase(t, ip->type) || soap_type_punned(soap, ip))) || (ip->type == t && ip->size != n && soap_type_punned(soap, ip))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enter type incompatibility id='%s' expect type=%d size=%lu got type=%d size=%lu\n", id, ip->type, (unsigned long)ip->size, t, (unsigned long)n)); (void)soap_id_nullify(soap, id); return NULL; } else { ip->type = t; ip->size = n; ip->ptr = p; if (!soap->alloced) ip->shaky = soap_is_shaky(soap, p); if (soap->alloced || !ip->shaky) { void **q; /* ptr will not change later, so resolve links now */ if (ip->spine) ip->spine[0] = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Traversing link chain to resolve id='%s' type=%d\n", ip->id, ip->type)); q = (void**)ip->link; while (q) { void *r = *q; *q = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... link %p -> %p\n", (void*)q, p)); q = (void**)r; } ip->link = NULL; } } return ip->ptr; #endif } /******************************************************************************/ SOAP_FMAC1 void** SOAP_FMAC2 soap_id_smart(struct soap *soap, const char *id, int t, size_t n) { (void)soap; (void)id; (void)t; (void)n; #ifndef WITH_NOIDREF if (id && *id) { struct soap_ilist *ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */ if (!ip) { ip = soap_enter(soap, id, t, n); /* new hash table entry for string id */ if (!ip) return NULL; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New smart shared pointer entry id='%s' type=%d size=%lu smart=%p\n", id, t, (unsigned long)n, ip->smart)); return &ip->smart; } #endif return NULL; } /******************************************************************************/ #ifndef WITH_NOIDREF static int soap_type_punned(struct soap *soap, const struct soap_ilist *ip) { const struct soap_flist *fp; (void)soap; if (ip->ptr || ip->copy) return 1; for (fp = ip->flist; fp; fp = fp->next) if (fp->level == 0) return 1; return 0; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_id_nullify(struct soap *soap, const char *id) { int i; for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { void *p, *q; for (p = ip->link; p; p = q) { q = *(void**)p; *(void**)p = NULL; } ip->link = NULL; } } soap_strcpy(soap->id, sizeof(soap->id), id); return soap->error = SOAP_HREF; } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_end_send(struct soap *soap) { #ifndef WITH_LEANER int err; err = soap_end_attachments(soap); 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 (!err) err = soap_putdime(soap); if (!err) err = soap_putmime(soap); soap->mime.list = NULL; soap->mime.first = NULL; soap->mime.last = NULL; soap->dime.list = NULL; soap->dime.first = NULL; soap->dime.last = NULL; if (err) return err; #endif return soap_end_send_flush(soap); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_end_send_flush(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End send mode=0x%x\n", soap->mode)); 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) && soap->d_stream) { 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 != sizeof(soap->buf)) { if (soap_flush_raw(soap, soap->z_buf, sizeof(soap->buf) - 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 = sizeof(soap->buf); } } 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) { #if !defined(__cplusplus) || defined(WITH_COMPAT) if (soap->os) { char *b = (char*)soap_push_block(soap, NULL, 1); if (b) { *b = '\0'; *soap->os = soap_save_block(soap, NULL, NULL, 0); } } else #endif { char *p; #ifndef WITH_NOHTTP if (!(soap->mode & SOAP_ENC_PLAIN)) { 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)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Send %u bytes to socket=%d/fd=%d\n", (unsigned int)soap_block_size(soap, NULL), (int)soap->socket, soap->sendfd)); soap->error = soap->fsend(soap, p, soap_block_size(soap, NULL)); if (soap->error) { soap_end_block(soap, NULL); return soap->error; } } soap_end_block(soap, NULL); } #ifndef WITH_LEANER if (soap->fpreparefinalsend && (soap->error = soap->fpreparefinalsend(soap)) != SOAP_OK) return soap->error; #endif if ((soap->omode & SOAP_IO) == SOAP_IO_STORE && (soap->imode & SOAP_IO) != SOAP_IO_STORE) soap->omode = (soap->omode & ~SOAP_IO) | (soap->imode & SOAP_IO); } #ifndef WITH_LEANER else if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { DBGMSG(SENT, "\r\n0\r\n\r\n", 7); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Send 7 bytes to socket=%d/fd=%d\n", (int)soap->socket, soap->sendfd)); soap->error = soap->fsend(soap, "\r\n0\r\n\r\n", 7); if (soap->error) return soap->error; } #endif } #ifdef WITH_TCPFIN #if defined(WITH_OPENSSL) || defined(WITH_SYSTEMSSL) if (!soap->ssl) #endif if (soap_valid_socket(soap->socket) && !soap->keep_alive && !(soap->omode & SOAP_IO_UDP)) soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_WR); /* Send TCP FIN */ #endif #if defined(__cplusplus) && !defined(WITH_COMPAT) if (soap->os) soap->os->flush(); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of send phase\n")); soap->omode &= ~SOAP_SEC_WSUID; soap->count = 0; soap->part = SOAP_END; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_end_recv(struct soap *soap) { soap->part = SOAP_END; #ifndef WITH_LEAN soap->wsuid = NULL; /* reset before next send */ soap->c14nexclude = NULL; /* reset before next send */ soap->c14ninclude = NULL; /* reset before next send */ #endif #ifndef WITH_LEANER soap->ffilterrecv = NULL; 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 so call soap_resolve() and return */ if ((soap->mode & SOAP_ENC_MIME)) { if ((soap->mode & SOAP_MIME_POSTCHECK)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Post checking MIME attachments\n")); if (!soap->keep_alive) soap->keep_alive = -2; /* special case to keep alive */ #ifndef WITH_NOIDREF soap_resolve(soap); #endif return SOAP_OK; } 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) && soap->d_stream) { /* 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; (void)soap_memcpy((void*)soap->buf, sizeof(soap->buf), (const void*)soap->z_buf, sizeof(soap->buf)); 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) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Gzip error: unable to read crc value\n")); return soap->error = SOAP_ZLIB_ERROR; } 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 inflate 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 inflate 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->ahead != EOF && !soap_recv_raw(soap)) continue; #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); #ifndef WITH_LEANER if (soap->fpreparefinalrecv) return soap->error = soap->fpreparefinalrecv(soap); #endif return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_free_temp(struct soap *soap) { struct soap_attribute *tp, *tq; 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) { SOAP_FREE(soap, ns->out); ns->out = NULL; } } 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_iht(soap); #endif soap_free_pht(soap); } /******************************************************************************/ static void soap_free_ns(struct soap *soap) { 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; } /******************************************************************************/ #ifdef 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 /******************************************************************************/ #ifdef 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]; if (s) SOAP_FREE_UNMANAGED(s); if (logfile) { size_t l = strlen(logfile) + 1; t = (char*)SOAP_MALLOC_UNMANAGED(l); if (t) (void)soap_memcpy((void*)t, l, (const void*)logfile, l); } soap->logfile[i] = t; } #endif /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_recv_logfile(struct soap *soap, const char *logfile) { (void)soap; (void)logfile; #ifdef SOAP_DEBUG soap_set_logfile(soap, SOAP_INDEX_RECV, logfile); #endif } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_sent_logfile(struct soap *soap, const char *logfile) { (void)soap; (void)logfile; #ifdef SOAP_DEBUG soap_set_logfile(soap, SOAP_INDEX_SENT, logfile); #endif } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_test_logfile(struct soap *soap, const char *logfile) { (void)soap; (void)logfile; #ifdef SOAP_DEBUG soap_set_logfile(soap, SOAP_INDEX_TEST, logfile); #endif } /******************************************************************************/ SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_copy(const struct soap *soap) { struct soap *copy = soap_versioning(soap_new)(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); soap_done(copy); if (soap_copy_context(copy, soap) != NULL) return copy; soap_free(copy); return NULL; } /******************************************************************************/ SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_copy_context(struct soap *copy, const struct soap *soap) { if (copy == soap) return copy; if (soap_check_state(soap)) return NULL; if (copy) { struct soap_plugin *p = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying context\n")); (void)soap_memcpy((void*)copy, sizeof(struct soap), (const void*)soap, sizeof(struct soap)); copy->state = SOAP_COPY; copy->error = SOAP_OK; copy->bearer = NULL; copy->userid = NULL; copy->passwd = NULL; #ifdef WITH_NTLM copy->ntlm_challenge = NULL; #endif 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 #ifdef SOAP_DEBUG soap_init_logs(copy); 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 copy->namespaces = soap->local_namespaces; copy->local_namespaces = NULL; soap_set_local_namespaces(copy); /* copy content of soap->local_namespaces */ copy->namespaces = soap->namespaces; /* point to shared read-only namespaces table */ copy->c_locale = NULL; #ifdef WITH_OPENSSL copy->bio = NULL; copy->ssl = NULL; copy->session = NULL; copy->session_host[0] = '\0'; copy->session_port = 443; #endif #ifdef WITH_GNUTLS copy->session = NULL; #endif #ifdef WITH_ZLIB copy->d_stream = NULL; copy->z_buf = NULL; #endif #ifndef WITH_NOIDREF soap_init_iht(copy); #endif soap_init_pht(copy); 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) { struct soap_plugin *q = (struct soap_plugin*)SOAP_MALLOC(copy, sizeof(struct soap_plugin)); if (!q) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not allocate plugin '%s'\n", p->id)); soap_end(copy); soap_done(copy); return NULL; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying plugin '%s'\n", p->id)); *q = *p; if (p->fcopy && (copy->error = p->fcopy(copy, q, p)) != SOAP_OK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not copy plugin '%s' error = %d\n", p->id, copy->error)); SOAP_FREE(copy, q); soap_end(copy); soap_done(copy); return NULL; } q->next = copy->plugins; copy->plugins = q; } } #ifdef WITH_SELF_PIPE pipe(copy->pipe_fd); SOAP_SOCKNONBLOCK(copy->pipe_fd[0]) SOAP_SOCKNONBLOCK(copy->pipe_fd[1]) #endif return copy; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_copy_stream(struct soap *copy, struct soap *soap) { struct soap_attribute *tp = NULL, *tq; if (copy == soap) return; copy->header = soap->header; copy->mode = soap->mode; copy->imode = soap->imode; copy->omode = soap->omode; copy->socket = soap->socket; copy->sendsk = soap->sendsk; copy->recvsk = soap->recvsk; copy->transfer_timeout = soap->transfer_timeout; copy->recv_maxlength = soap->recv_maxlength; copy->recv_timeout = soap->recv_timeout; copy->send_timeout = soap->send_timeout; copy->connect_timeout = soap->connect_timeout; copy->accept_timeout = soap->accept_timeout; copy->socket_flags = soap->socket_flags; copy->connect_flags = soap->connect_flags; copy->connect_retry = soap->connect_retry; copy->bind_flags = soap->bind_flags; copy->bind_inet6 = soap->bind_inet6; copy->bind_v6only = soap->bind_v6only; copy->accept_flags = soap->accept_flags; copy->sndbuf = soap->sndbuf; copy->rcvbuf = soap->rcvbuf; copy->linger_time = soap->linger_time; copy->maxlevel = soap->maxlevel; copy->maxlength = soap->maxlength; copy->maxoccurs = soap->maxoccurs; copy->os = soap->os; copy->is = soap->is; 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; copy->ip = soap->ip; copy->ip6[0] = soap->ip6[0]; copy->ip6[1] = soap->ip6[1]; copy->ip6[2] = soap->ip6[2]; copy->ip6[3] = soap->ip6[3]; copy->port = soap->port; (void)soap_memcpy((void*)copy->host, sizeof(copy->host), (const void*)soap->host, sizeof(soap->host)); (void)soap_memcpy((void*)copy->endpoint, sizeof(copy->endpoint), (const void*)soap->endpoint, sizeof(soap->endpoint)); #endif #ifdef WITH_OPENSSL copy->bio = soap->bio; copy->ctx = soap->ctx; copy->ssl = soap->ssl; #endif #ifdef WITH_GNUTLS copy->session = soap->session; #endif #ifdef WITH_SYSTEMSSL copy->ctx = soap->ctx; copy->ssl = soap->ssl; #endif #ifdef WITH_ZLIB copy->zlib_state = soap->zlib_state; copy->zlib_in = soap->zlib_in; copy->zlib_out = soap->zlib_out; if (soap->d_stream && soap->zlib_state != SOAP_ZLIB_NONE) { if (!copy->d_stream) copy->d_stream = (z_stream*)SOAP_MALLOC(copy, sizeof(z_stream)); if (copy->d_stream) (void)soap_memcpy((void*)copy->d_stream, sizeof(z_stream), (const void*)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, sizeof(soap->buf)); if (copy->z_buf) (void)soap_memcpy((void*)copy->z_buf, sizeof(soap->buf), (const void*)soap->z_buf, sizeof(soap->buf)); } copy->z_dict = soap->z_dict; copy->z_dict_len = soap->z_dict_len; #endif (void)soap_memcpy((void*)copy->buf, sizeof(copy->buf), (const void*)soap->buf, sizeof(soap->buf)); /* copy XML parser state */ soap_free_ns(copy); soap_set_local_namespaces(copy); copy->version = soap->version; if (soap->nlist && soap->local_namespaces) { struct soap_nlist *np = NULL, *nq; /* copy reversed nlist */ for (nq = soap->nlist; nq; nq = nq->next) { struct soap_nlist *nr = np; size_t n = sizeof(struct soap_nlist) + strlen(nq->id); np = (struct soap_nlist*)SOAP_MALLOC(copy, n); if (!np) { np = nr; break; } (void)soap_memcpy((void*)np, n, (const void*)nq, n); np->next = nr; } while (np) { const char *s = np->ns; copy->level = np->level; /* preserve element nesting level */ if (!s && np->index >= 0) { s = soap->local_namespaces[np->index].out; if (!s) s = soap->local_namespaces[np->index].ns; } if (s) (void)soap_push_namespace(copy, np->id, s); nq = np; np = np->next; SOAP_FREE(copy, nq); } } (void)soap_memcpy((void*)copy->tag, sizeof(copy->tag), (const void*)soap->tag, sizeof(soap->tag)); (void)soap_memcpy((void*)copy->id, sizeof(copy->id), (const void*)soap->id, sizeof(soap->id)); (void)soap_memcpy((void*)copy->href, sizeof(copy->href), (const void*)soap->href, sizeof(soap->href)); (void)soap_memcpy((void*)copy->type, sizeof(copy->type), (const void*)soap->type, sizeof(soap->type)); copy->other = soap->other; copy->root = soap->root; copy->null = soap->null; copy->body = soap->body; copy->part = soap->part; copy->mustUnderstand = soap->mustUnderstand; copy->level = soap->level; copy->peeked = soap->peeked; /* copy attributes */ for (tq = soap->attributes; tq; tq = tq->next) { struct soap_attribute *tr = tp; size_t n = sizeof(struct soap_attribute) + strlen(tq->name); tp = (struct soap_attribute*)SOAP_MALLOC(copy, n); (void)soap_memcpy((void*)tp, n, (const void*)tq, n); if (tp->size) { tp->value = (char*)SOAP_MALLOC(copy, tp->size); if (tp->value) (void)soap_memcpy((void*)tp->value, tp->size, (const void*)tq->value, tp->size); } tp->ns = NULL; tp->next = tr; } copy->attributes = tp; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_free_stream(struct soap *soap) { soap->socket = SOAP_INVALID_SOCKET; soap->sendsk = SOAP_INVALID_SOCKET; soap->recvsk = SOAP_INVALID_SOCKET; #ifdef WITH_OPENSSL soap->bio = NULL; soap->ctx = NULL; soap->ssl = NULL; #endif #ifdef WITH_GNUTLS soap->xcred = NULL; soap->acred = NULL; soap->cache = NULL; soap->session = NULL; soap->dh_params = NULL; soap->rsa_params = NULL; #endif #ifdef WITH_SYSTEMSSL soap->ctx = (gsk_handle)NULL; soap->ssl = (gsk_handle)NULL; #endif #ifdef WITH_ZLIB if (soap->z_buf) SOAP_FREE(soap, soap->z_buf); soap->z_buf = NULL; #endif } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_initialize(struct soap *soap) { soap_versioning(soap_init)(soap, SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_versioning(soap_init)(struct soap *soap, soap_mode imode, soap_mode omode) { size_t i; soap->state = SOAP_INIT; #ifdef SOAP_MEM_DEBUG soap_init_mht(soap); #endif #ifdef SOAP_DEBUG soap_init_logs(soap); #endif #ifdef TANDEM_NONSTOP soap_set_test_logfile(soap, "TESTLOG"); soap_set_sent_logfile(soap, "SENTLOG"); soap_set_recv_logfile(soap, "RECVLOG"); #else soap_set_test_logfile(soap, "TEST.log"); soap_set_sent_logfile(soap, "SENT.log"); soap_set_recv_logfile(soap, "RECV.log"); #endif #ifdef WITH_SELF_PIPE pipe(soap->pipe_fd); SOAP_SOCKNONBLOCK(soap->pipe_fd[0]) SOAP_SOCKNONBLOCK(soap->pipe_fd[1]) #endif soap->version = 0; soap->imode = imode; soap->omode = omode; soap->mode = imode; soap->plugins = NULL; soap->user = NULL; for (i = 0; i < sizeof(soap->data)/sizeof(*soap->data); i++) soap->data[i] = NULL; soap->bearer = NULL; soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif #ifndef WITH_NOHTTP soap->fpost = http_post; soap->fget = http_get; soap->fput = http_put; soap->fpatch = http_patch; soap->fdel = http_del; soap->fopt = http_200; soap->fhead = http_200; 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; /* in_addr_t value */ soap->ipv4_multicast_if = NULL; /* points to struct in_addr or in_addr_t */ soap->ipv4_multicast_ttl = 0; /* 0: use default */ soap->client_addr = NULL; /* client address (IPv4 or IPv6 or host name) to bind before connect, NULL for none */ soap->client_addr_ipv6 = NULL; /* client address IPv6 or host name to bind before connect, NULL for none */ soap->client_port = -1; /* client port to bind before connect, -1 for none */ soap->client_interface = NULL; /* client interface address, NULL for none */ #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; #ifndef WITH_LEANER soap->fsvalidate = NULL; soap->fwvalidate = NULL; soap->feltbegin = NULL; soap->feltendin = NULL; soap->feltbegout = NULL; soap->feltendout = NULL; soap->fprepareinitsend = NULL; soap->fprepareinitrecv = NULL; soap->fpreparesend = NULL; soap->fpreparerecv = NULL; soap->fpreparefinalsend = NULL; soap->fpreparefinalrecv = NULL; soap->ffiltersend = NULL; soap->ffilterrecv = 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->long_double_format = NULL; /* Defined in custom serializer custom/long_double.c */ soap->dime_id_format = "cid:id%d"; /* default DIME id format for int id index */ soap->recv_maxlength = 0x7FFFFFFF; /* default max length of messages received (2GB) */ soap->recv_timeout = 0; soap->send_timeout = 0; soap->transfer_timeout = 0; soap->connect_timeout = 0; soap->accept_timeout = 0; soap->socket_flags = 0; soap->connect_flags = 0; soap->connect_retry = 0; soap->bind_flags = 0; #ifdef WITH_IPV6_V6ONLY soap->bind_inet6 = 1; soap->bind_v6only = 1; #else soap->bind_inet6 = 0; soap->bind_v6only = 0; #endif soap->accept_flags = 0; #ifdef WIN32 soap->sndbuf = SOAP_BUFLEN + 1; /* this size speeds up windows xfer */ soap->rcvbuf = SOAP_BUFLEN + 1; #else soap->sndbuf = SOAP_BUFLEN; soap->rcvbuf = SOAP_BUFLEN; #endif soap->linger_time = 0; soap->maxlevel = SOAP_MAXLEVEL; soap->maxlength = SOAP_MAXLENGTH; soap->maxoccurs = SOAP_MAXOCCURS; soap->http_version = "1.1"; soap->proxy_http_version = "1.0"; soap->http_content = NULL; soap->http_extra_header = 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->ip = 0; soap->ip6[0] = 0; soap->ip6[1] = 0; soap->ip6[2] = 0; soap->ip6[3] = 0; soap->labbuf = NULL; soap->lablen = 0; soap->labidx = 0; soap->encodingStyle = NULL; #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->shaky = 0; soap->attributes = NULL; soap->header = NULL; soap->fault = NULL; soap->master = SOAP_INVALID_SOCKET; soap->socket = SOAP_INVALID_SOCKET; soap->sendsk = SOAP_INVALID_SOCKET; soap->recvsk = 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->tag[0] = '\0'; 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->endpoint[0] = '\0'; soap->host[0] = '\0'; soap->path[0] = '\0'; soap->port = 0; soap->override_host = NULL; soap->override_port = 0; soap->action = NULL; soap->proxy_host = NULL; soap->proxy_port = 8080; soap->proxy_userid = NULL; soap->proxy_passwd = NULL; soap->proxy_from = NULL; soap->origin = NULL; soap->cors_origin = NULL; soap->cors_allow = "*"; soap->cors_method = NULL; soap->cors_header = NULL; soap->cors_methods = NULL; soap->cors_headers = NULL; soap->x_frame_options = "SAMEORIGIN"; soap->prolog = "\n"; soap->zlib_state = SOAP_ZLIB_NONE; soap->zlib_in = SOAP_ZLIB_NONE; soap->zlib_out = SOAP_ZLIB_NONE; soap->d_stream = NULL; soap->z_buf = NULL; soap->z_level = 6; soap->z_dict = NULL; soap->z_dict_len = 0; #ifndef WITH_LEAN soap->wsuid = NULL; soap->c14nexclude = NULL; soap->c14ninclude = 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 #ifndef WITH_NOIDREF soap_init_iht(soap); #endif soap_init_pht(soap); #ifdef WITH_OPENSSL if (!soap_ssl_init_done) soap_ssl_init(); soap->fsslauth = ssl_auth_init; soap->fsslverify = NULL; soap->bio = NULL; soap->ssl = NULL; soap->ctx = NULL; soap->session = NULL; soap->session_host[0] = '\0'; soap->session_port = 443; soap->ssl_flags = SOAP_SSL_DEFAULT; soap->keyfile = NULL; soap->keyid = NULL; soap->password = NULL; soap->cafile = NULL; soap->capath = NULL; soap->crlfile = NULL; soap->dhfile = NULL; soap->randfile = NULL; #endif #ifdef WITH_GNUTLS if (!soap_ssl_init_done) soap_ssl_init(); soap->fsslauth = ssl_auth_init; soap->fsslverify = NULL; soap->xcred = NULL; soap->acred = NULL; soap->cache = NULL; soap->session = NULL; soap->ssl_flags = SOAP_SSL_DEFAULT; soap->keyfile = NULL; soap->keyid = NULL; soap->password = NULL; soap->cafile = NULL; soap->capath = NULL; soap->crlfile = NULL; soap->dh_params = NULL; soap->rsa_params = NULL; #endif #ifdef WITH_SYSTEMSSL soap->fsslauth = ssl_auth_init; soap->fsslverify = NULL; soap->bio = NULL; soap->ssl = (gsk_handle)NULL; soap->ctx = (gsk_handle)NULL; soap->session = NULL; soap->ssl_flags = SOAP_SSL_DEFAULT; soap->keyfile = NULL; soap->keyid = NULL; soap->password = NULL; soap->cafile = NULL; soap->capath = NULL; soap->crlfile = NULL; soap->dhfile = NULL; soap->randfile = NULL; #endif soap->c_locale = NULL; soap->buflen = 0; soap->bufidx = 0; #ifndef WITH_LEANER soap->dime.chunksize = 0; soap->dime.buflen = 0; #endif soap->other = 0; soap->root = -1; soap->null = 0; soap->position = 0; soap->encoding = 0; soap->mustUnderstand = 0; soap->ns = 0; soap->part = SOAP_END; soap->event = 0; soap->evlev = 0; soap->alloced = 0; soap->count = 0; soap->length = 0; soap->cdata = 0; soap->peeked = 0; soap->ahead = 0; soap->idnum = 0; soap->level = 0; soap->status = 0; soap->error = SOAP_OK; soap->errmode = 0; soap->errnum = 0; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_begin(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Clean up for input/output\n")); soap->error = SOAP_OK; if (!soap->keep_alive) { soap->buflen = 0; soap->bufidx = 0; } soap->encoding = 0; soap->mode = 0; soap->part = SOAP_END; soap->peeked = 0; soap->ahead = 0; soap->level = 0; *soap->endpoint = '\0'; soap->encodingStyle = SOAP_STR_EOS; soap_free_temp(soap); } /******************************************************************************/ 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) { 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 } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_version(struct soap *soap, short version) { soap_set_local_namespaces(soap); if (soap->version != version && soap->local_namespaces && soap->local_namespaces[0].id && soap->local_namespaces[1].id) { if (version == 1) { soap->local_namespaces[0].ns = soap_env1; soap->local_namespaces[1].ns = soap_enc1; } else if (version == 2) { soap->local_namespaces[0].ns = soap_env2; soap->local_namespaces[1].ns = soap_enc2; } soap->version = version; } if (version == 0) soap->encodingStyle = SOAP_STR_EOS; else soap->encodingStyle = NULL; } /******************************************************************************/ static void soap_version(struct soap *soap) { struct Namespace *p = soap->local_namespaces; if (p) { const char *ns = p[0].out; if (!ns) ns = p[0].ns; if (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); p[1].out = (char*)SOAP_MALLOC(soap, sizeof(soap_enc1)); if (p[1].out) (void)soap_memcpy(p[1].out, sizeof(soap_enc1), soap_enc1, sizeof(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); p[1].out = (char*)SOAP_MALLOC(soap, sizeof(soap_enc2)); if (p[1].out) (void)soap_memcpy(p[1].out, sizeof(soap_enc2), soap_enc2, sizeof(soap_enc2)); } } } } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_set_namespaces(struct soap *soap, const struct Namespace *p) { struct Namespace *ns = soap->local_namespaces; struct soap_nlist *np, *nq, *nr; 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) { 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) (void)soap_push_namespace(soap, np->id, s); nq = np; np = np->next; SOAP_FREE(soap, nq); } if (ns) { 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; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_local_namespaces(struct soap *soap) { if (soap->namespaces && !soap->local_namespaces) { const struct Namespace *ns1; struct Namespace *ns2; 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) { (void)soap_memcpy((void*)ns2, n, (const void*)soap->namespaces, n); if (ns2[0].ns) { if (!strcmp(ns2[0].ns, soap_env1)) soap->version = 1; else if (!strcmp(ns2[0].ns, soap_env2)) soap->version = 2; } soap->local_namespaces = ns2; for (; ns2->id; ns2++) ns2->out = NULL; } } } /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char * SOAP_FMAC2 soap_tagsearch(const char *big, const char *little) { if (big && little) { size_t n = strlen(little); const char *s = big; while (s) { const char *t = s; size_t i; for (i = 0; i < n; i++, t++) { if (*t != little[i]) break; } if (*t == '\0' || *t == ' ') { if (i == n || (i > 0 && little[i-1] == ':')) return s; } s = strchr(t, ' '); if (s) s++; } } return NULL; } #endif /******************************************************************************/ SOAP_FMAC1 struct soap_nlist * SOAP_FMAC2 soap_lookup_ns(struct soap *soap, const char *tag, size_t n) { 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; } /******************************************************************************/ #ifndef WITH_LEAN static struct soap_nlist * soap_push_ns(struct soap *soap, const char *id, const char *ns, short utilized, short isearly) { struct soap_nlist *np = NULL; size_t n, k; unsigned int level = soap->level + isearly; if (soap_tagsearch(soap->c14nexclude, id)) return NULL; if (!utilized) { for (np = soap->nlist; np; np = np->next) { if (!strcmp(np->id, id) && ((!np->ns && *id) || (np->ns && !strcmp(np->ns, ns)))) break; } if (np) { if ((np->level < level || (!np->ns && *id)) && np->index == 1) utilized = 1; else return NULL; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Adding namespace binding (level=%u) '%s' '%s' utilized=%d\n", level, id, ns ? ns : "(null)", utilized)); n = strlen(id); if (ns) k = strlen(ns) + 1; else k = 0; if (sizeof(struct soap_nlist) + n + k > n && (SOAP_MAXALLOCSIZE <= 0 || sizeof(struct soap_nlist) + n + k <= SOAP_MAXALLOCSIZE)) np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k); if (!np) { soap->error = SOAP_EOM; return NULL; } np->next = soap->nlist; soap->nlist = np; soap_strcpy((char*)np->id, n + 1, id); if (ns) { np->ns = np->id + n + 1; soap_strcpy((char*)np->ns, k, ns); } else { np->ns = NULL; } np->level = level; np->index = utilized; return np; } #endif /******************************************************************************/ #ifndef WITH_LEAN static void soap_utilize_ns(struct soap *soap, const char *tag, short isearly) { struct soap_nlist *np; size_t n = 0; if (!strncmp(tag, "xmlns:", 6)) { tag += 6; n = strlen(tag); } else { const char *t = strchr(tag, ':'); if (t) n = t - tag; } np = soap_lookup_ns(soap, tag, n); if (np) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Utilizing namespace of '%s' at level %u utilized=%d at level=%u\n", tag, soap->level + isearly, np->index, np->level)); if (np->index <= 0) { if (np->level == soap->level + isearly) np->index = 1; else (void)soap_push_ns(soap, np->id, np->ns, 1, isearly); } } else if (strncmp(tag, "xml", 3)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Utilizing default namespace of '%s' at level %u\n", tag, soap->level + isearly)); (void)soap_strncpy(soap->tag, sizeof(soap->tag), tag, n); (void)soap_push_ns(soap, soap->tag, NULL, 1, isearly); } } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element(struct soap *soap, const char *tag, int id, const char *type) { #ifndef WITH_LEAN const char *s; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element begin tag='%s' level='%u' id='%d' type='%s'\n", tag, soap->level, id, type ? type : SOAP_STR_EOS)); #ifdef WITH_DOM #ifndef WITH_LEAN if (soap_tagsearch(soap->wsuid, tag)) { size_t i; for (s = tag, i = 0; *s && i < sizeof(soap->href) - 1; s++, i++) soap->href[i] = *s == ':' ? '-' : *s; soap->href[i] = '\0'; if (soap_set_attr(soap, "wsu:Id", soap->href, 1)) return soap->error; } #endif #endif soap->level++; if (soap->level > soap->maxlevel) return soap->error = SOAP_LEVEL; #ifdef WITH_DOM #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_DOM_ASIS)) { if (soap->evlev >= soap->level) soap->evlev = 0; if (soap->event == SOAP_SEC_BEGIN && !soap->evlev) { struct soap_nlist *np; /* non-nested wsu:Id found: clear xmlns, re-emit them for exc-c14n */ for (np = soap->nlist; np; np = np->next) { int p = soap->c14ninclude ? *soap->c14ninclude == '+' || soap_tagsearch(soap->c14ninclude, np->id) != NULL : 0; if (np->index == 2 || p) { struct soap_nlist *np1 = soap_push_ns(soap, np->id, np->ns, 1, 0); if (np1 && !p) np1->index = 0; } } soap->evlev = soap->level; } } #endif if ((soap->mode & SOAP_XML_DOM)) { struct soap_dom_element *elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element)); if (!elt) return soap->error = SOAP_EOM; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Adding DOM element tag='%s' %p (parent='%s' %p)\n", tag, elt, soap->dom ? soap->dom->name : "(null)", soap->dom)); elt->soap = soap; elt->next = NULL; elt->prnt = soap->dom; elt->elts = NULL; elt->atts = NULL; elt->nstr = NULL; elt->name = soap_strdup(soap, tag); elt->lead = NULL; elt->text = NULL; elt->code = NULL; elt->tail = NULL; elt->node = NULL; elt->type = 0; 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; if (!elt->name) return soap->error = SOAP_EOM; } else { #endif #ifndef WITH_LEAN if (!soap->ns) { if (!(soap->mode & SOAP_XML_CANONICAL) && soap_send(soap, soap->prolog)) 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; } if ((soap->mode & SOAP_XML_DEFAULTNS)) { size_t n = 0; s = strchr(tag, ':'); if (s) n = s++ - tag; else s = tag; if (soap_send_raw(soap, "<", 1) || soap_send(soap, s)) return soap->error; if (n) { struct Namespace *ns = soap->local_namespaces; for (; ns && ns->id; ns++) { if (*ns->id && ns->ns && !strncmp(ns->id, tag, n) && !ns->id[n]) { if (!soap->nlist || *soap->nlist->id || (soap->nlist->ns && strcmp(soap->nlist->ns, ns->ns))) { (void)soap_push_ns(soap, SOAP_STR_EOS, ns->out ? ns->out : ns->ns, 0, 0); if (soap_attribute(soap, "xmlns", ns->out ? ns->out : ns->ns)) return soap->error; } break; } } } #ifndef WITH_NOEMPTYNAMESPACES else if (!soap->nlist || *soap->nlist->id || (soap->nlist->ns && *soap->nlist->ns)) { (void)soap_push_ns(soap, SOAP_STR_EOS, SOAP_STR_EOS, 0, 0); if (soap_attribute(soap, "xmlns", SOAP_STR_EOS)) return soap->error; } #endif } 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 = soap->local_namespaces; int k = -1; if (ns) { while (k-- && ns->id) { const char *t = ns->out; if (!t) t = ns->ns; if (*ns->id && t && *t) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(ns->id) + 6), "xmlns:%s", ns->id); if (soap_attribute(soap, soap->tmpbuf, t)) return soap->error; } ns++; } } } 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)) { if ((soap->mode & SOAP_XML_DEFAULTNS)) soap_utilize_ns(soap, SOAP_STR_EOS, 0); else soap_utilize_ns(soap, tag, 0); } #endif if (id > 0) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), sizeof(SOAP_BASEREFNAME) + 20), SOAP_BASEREFNAME "%d", id); if (soap->version == 2) { if (soap_attribute(soap, "SOAP-ENC:id", soap->tmpbuf)) return soap->error; } else if (soap_attribute(soap, "id", soap->tmpbuf)) { return soap->error; } } if (type && *type && !(soap->mode & SOAP_XML_NOTYPE)) { #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_XML_CANONICAL_NA)) soap_utilize_ns(soap, type, 0); #endif if (soap_attribute(soap, "xsi:type", type)) return soap->error; } if (soap->null && soap->position > 0 && soap->version == 1) { int i; (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf) - 1, 20), "[%d", soap->positions[0]); for (i = 1; i < soap->position; i++) { size_t l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l - 1, 20), ",%d", soap->positions[i]); } soap_strcat(soap->tmpbuf, sizeof(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 && soap->local_namespaces[0].id && soap->local_namespaces[1].id) { 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->encodingStyle && soap_attribute(soap, "SOAP-ENV:encodingStyle", soap->encodingStyle)) return soap->error; } else { soap->encodingStyle = NULL; } soap->encoding = 0; } soap->null = 0; soap->position = 0; return SOAP_OK; } /******************************************************************************/ 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; #ifdef WITH_DOM if (soap->feltbegout) return soap->error = soap->feltbegout(soap, tag, id, type); #endif if (soap_element(soap, tag, id, type)) return soap->error; return soap_element_start_end_out(soap, NULL); } /******************************************************************************/ #if _MSC_VER < 1400 && !defined(HAVE_STRLCAT) /* concat string (truncating the result, strings must not be NULL) */ SOAP_FMAC1 void SOAP_FMAC2 soap_strcat(char *t, size_t n, const char *s) { size_t k = strlen(t); if (k < n) { t += k; n -= k; while (--n > 0 && *s) *t++ = *s++; *t = '\0'; } } #endif /******************************************************************************/ #if _MSC_VER < 1400 /* concat string up to m chars (leaves destination intact on overrun and returns nonzero, zero if OK) */ SOAP_FMAC1 int SOAP_FMAC2 soap_strncat(char *t, size_t n, const char *s, size_t m) { size_t k; if (!t || !s) return 1; k = strlen(t); if (n <= k + m) return 1; t += k; n -= k; while (--n > 0 && *s) *t++ = *s++; *t = '\0'; return 0; } #endif /******************************************************************************/ #ifndef HAVE_STRRCHR SOAP_FMAC1 char* SOAP_FMAC2 soap_strrchr(const char *s, int t) { char *r = NULL; while (*s) if (*s++ == t) r = (char*)s - 1; return r; } #endif /******************************************************************************/ #ifndef HAVE_STRTOL SOAP_FMAC1 long SOAP_FMAC2 soap_strtol(const char *s, char **t, int b) { long n = 0; 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')) { if (neg && n == 214748364 && c == '8') { if (t) *t = (char*)(s + 1); return -2147483648; } break; } n *= 10; n += c - '0'; s++; } if (neg) n = -n; } else /* assume 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 /******************************************************************************/ #ifndef HAVE_STRTOUL SOAP_FMAC1 unsigned long SOAP_FMAC2 soap_strtoul(const char *s, char **t, int b) { unsigned long n = 0; 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 >= 429496729 && (n > 429496729 || c >= '6')) break; n *= 10; n += c - '0'; s++; } if (neg && n > 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 /******************************************************************************/ #ifndef soap_strtoll SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_strtoll(const char *s, char **t, int b) { LONG64 n = 0LL; 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 >= 922337203685477580LL && (n > 922337203685477580LL || c >= '8')) { if (neg && n == 922337203685477580LL && c == '8') { if (t) *t = (char*)(s + 1); return -9223372036854775807LL - 1LL; /* appease compilers that complain */ } break; } n *= 10LL; n += c - '0'; s++; } if (neg) n = -n; } else /* assume 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 > 0x07FFFFFFFFFFFFFFLL) break; n <<= 4; n += c; s++; } } if (t) *t = (char*)s; return n; } #endif /******************************************************************************/ #ifndef soap_strtoull SOAP_FMAC1 ULONG64 SOAP_FMAC2 soap_strtoull(const char *s, char **t, int b) { ULONG64 n = 0UL; 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 >= 1844674407370955161ULL) break; n *= 10UL; n += c - '0'; s++; } if (neg && n > 0UL) 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 > 0x0FFFFFFFFFFFFFFFULL) break; n <<= 4; n += c; s++; } } if (t) *t = (char*)s; return n; } #endif /******************************************************************************/ 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 || soap->version == 0) return soap_element_begin_out(soap, tag, id, NULL); if (soap_element(soap, tag, id, NULL)) return soap->error; if (soap->version == 1) { if (offset && soap_attribute(soap, "SOAP-ENC:offset", offset)) return soap->error; if (soap_attribute(soap, "SOAP-ENC:arrayType", type)) return soap->error; } else { const char *s; s = strchr(type, '['); if (s && (size_t)(s - type) < sizeof(soap->tmpbuf)) { (void)soap_strncpy(soap->tmpbuf, sizeof(soap->tmpbuf), type, s - type); if (soap_attribute(soap, "SOAP-ENC:itemType", soap->tmpbuf)) return soap->error; s++; if (*s && *s != ']') { soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), s); soap->tmpbuf[strlen(soap->tmpbuf) - 1] = '\0'; if (soap_attribute(soap, "SOAP-ENC:arraySize", soap->tmpbuf)) return soap->error; } } } #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_XML_CANONICAL_NA)) soap_utilize_ns(soap, type, 0); #endif return soap_element_start_end_out(soap, NULL); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_start_end_out(struct soap *soap, const char *tag) { 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 && strchr(tp->name, ':')) soap_utilize_ns(soap, tp->name, 0); } if (soap->event == SOAP_SEC_BEGIN) { for (np = soap->nlist; np; np = np->next) if (soap_tagsearch(soap->c14ninclude, np->id)) (void)soap_push_ns(soap, np->id, np->ns, 1, 0); soap->event = 0; soap->evlev = 0; } for (np = soap->nlist; np; np = np->next) { if (np->ns && np->index == 1) { if (*np->id) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(np->id) + 6), "xmlns:%s", np->id); else soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "xmlns"); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enabling utilized binding (level=%u) %s='%s' SEC-BEGIN=%d c14ninclude='%s'\n", np->level, soap->tmpbuf, np->ns, soap->event == SOAP_SEC_BEGIN, soap->c14ninclude ? soap->c14ninclude : "(null)")); np->index = 2; soap->level--; if (*np->id || *np->ns || soap->level > 1) if (soap_set_attr(soap, soap->tmpbuf, np->ns, 1)) return soap->error; soap->level++; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Binding (level=%u) %s='%s' utilized=%d\n", np->level, np->id, np->ns, np->index)); } } } #endif #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { 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)->text = soap_strdup(soap, tp->value); (*att)->soap = soap; if (!(*att)->name || (tp->value && !(*att)->text)) return soap->error = SOAP_EOM; att = &(*att)->next; tp->visible = 0; } } return SOAP_OK; } #endif for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { if (soap_send_raw(soap, " ", 1) || 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, tp->flag) || soap_send_raw(soap, "\"", 1)) return soap->error; } else { if (soap_send_raw(soap, "=\"\"", 3)) 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 if (soap->nlist) soap_pop_namespace(soap); soap->level--; /* decrement level just before /> */ soap->body = 0; return soap_send_raw(soap, "/>", 2); } return soap_send_raw(soap, ">", 1); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_out(struct soap *soap, const char *tag) { if (*tag == '-') return SOAP_OK; #ifdef WITH_DOM if (soap->feltendout) return soap->error = soap->feltendout(soap, tag); #endif return soap_element_end(soap, tag); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_end(struct soap *soap, const char *tag) { #ifndef WITH_LEAN const char *s; #endif 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->nlist) soap_pop_namespace(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; } if ((soap->mode & SOAP_XML_DEFAULTNS) && (s = strchr(tag, ':')) != NULL) tag = s + 1; #endif if (soap_send_raw(soap, "error; soap->level--; /* decrement level just before > */ return soap_send_raw(soap, ">", 1); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_ref(struct soap *soap, const char *tag, int id, int href) { const char *s = "ref"; int n = 1; if (soap->version == 1) { s = "href"; n = 0; } else if (soap->version == 2) { s = "SOAP-ENC:ref"; } (SOAP_SNPRINTF(soap->href, sizeof(soap->href), sizeof(SOAP_BASEREFNAME) + 21), "#" SOAP_BASEREFNAME "%d", href); return soap_element_href(soap, tag, id, s, soap->href + n); } /******************************************************************************/ 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; soap->body = 0; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_null(struct soap *soap, const char *tag, int id, const char *type) { struct soap_attribute *tp = NULL; 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) || (!tp && soap_attribute(soap, "xsi:nil", "true")) || soap_element_start_end_out(soap, tag)) return soap->error; soap->body = 0; } else { soap->null = 1; soap->position = 0; soap->mustUnderstand = 0; } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_empty(struct soap *soap, const char *tag) { if (soap_element(soap, tag, -1, NULL)) return soap->error; return soap_element_start_end_out(soap, tag); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_nil(struct soap *soap, const char *tag) { if (soap_element(soap, tag, -1, NULL) || (soap_attribute(soap, "xsi:nil", "true"))) return soap->error; return soap_element_start_end_out(soap, tag); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_id(struct soap *soap, const char *tag, int id, const void *p, const void *a, int n, const char *type, int t, char **mark) { (void)a; (void)n; if (!p) { soap->error = soap_element_null(soap, tag, id, type); return -1; } #ifndef WITH_NOIDREF DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element_id %p type=%d id=%d\n", p, t, id)); if ((!soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH)) || (soap->mode & SOAP_XML_TREE)) return soap_check_and_mark(soap, p, t, mark); if (mark) *mark = NULL; if (id < -1) return soap_embed(soap, p, a, n, t); else 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 soap_check_and_mark(soap, p, t, mark); #endif } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_check_and_mark(struct soap *soap, const void *p, int t, char **mark) { if (mark) { struct soap_plist *pp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Check %p and mark %p\n", p, (void*)mark)); if (!soap_pointer_lookup(soap, p, t, &pp)) if (!soap_pointer_enter(soap, p, NULL, 0, t, &pp)) return -1; if ((soap->mode & SOAP_IO_LENGTH)) { if (pp->mark1 > 0) return -1; pp->mark1 = 1; *mark = &pp->mark1; } else { if (pp->mark2 > 0) return -1; pp->mark2 = 1; *mark = &pp->mark2; } } return 0; } /******************************************************************************/ SOAP_FMAC1 void * SOAP_FMAC2 soap_mark_lookup(struct soap *soap, const void *p, int t, struct soap_plist **ppp, char **mark) { if (!soap) return NULL; if (mark || !(soap->mode & SOAP_XML_TREE)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Mark lookup %p type=%d\n", p, t)); if (!soap_pointer_lookup(soap, p, t, ppp)) { if (!soap_pointer_enter(soap, p, NULL, 0, t, ppp)) return NULL; } else if (!(soap->mode & SOAP_XML_TREE)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Mark found %p\n", (*ppp)->dup)); return (*ppp)->dup; } if (mark) { if ((*ppp)->mark1 > 0) (*ppp)->mark1 = 2; /* cycle */ else (*ppp)->mark1 = 1; /* cycle detection */ *mark = &(*ppp)->mark1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Mark cycle %d\n", (*ppp)->mark1)); } } return NULL; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_mark_cycle(struct soap *soap, struct soap_plist *pp) { (void)soap; return pp && pp->mark1 == 2 && (soap->mode & SOAP_XML_TREE); } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_mark_dup(struct soap *soap, void *a, struct soap_plist *pp) { (void)soap; if (pp) pp->dup = a; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_unmark(struct soap *soap, char *mark) { (void)soap; if (mark) *mark = 0; /* release detection */ } /******************************************************************************/ 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; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_check_result(struct soap *soap, const char *tag) { (void)tag; if (soap->version == 2 && soap->encodingStyle) { soap_instring(soap, ":result", NULL, NULL, 0, 2, -1, -1, NULL); /* just ignore content for compliance reasons, but should compare tag to element's QName value? */ } } /******************************************************************************/ 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) { 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->text = soap_strdup(soap, value); a->soap = soap; soap->dom->atts = a; if (!a->name || (value && !a->text)) return soap->error = SOAP_EOM; return SOAP_OK; } #endif #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) { /* push namespace */ if (!strncmp(name, "xmlns", 5) && ((name[5] == ':') || name[5] == '\0')) { if (name[5] == ':' && soap->c14ninclude && ((*soap->c14ninclude == '*' || soap_tagsearch(soap->c14ninclude, name + 6)))) soap_utilize_ns(soap, name, 0); (void)soap_push_ns(soap, name + 5 + (name[5] == ':'), value, 0, 0); } else { soap->level--; if (soap_set_attr(soap, name, value, 1)) return soap->error; soap->level++; } } else #endif { if (soap_send_raw(soap, " ", 1) || 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; } /******************************************************************************/ 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; soap->error = soap_match_tag(soap, soap->tag, tag); if (!soap->error) { if (type && *soap->type && soap_match_tag(soap, soap->type, type)) return soap->error = SOAP_TYPE; soap->peeked = 0; if (!nillable && soap->null && (soap->mode & SOAP_XML_STRICT)) return soap->error = SOAP_NULL; if (soap->body) { soap->level++; if (soap->level > soap->maxlevel) return soap->error = SOAP_LEVEL; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin tag found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag ? tag : SOAP_STR_EOS)); soap->error = SOAP_OK; } } else if (soap->error == SOAP_NO_TAG && tag && *tag == '-') { soap->error = SOAP_OK; } return soap->error; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_in(struct soap *soap, const char *tag) { soap_wchar c; char *s = NULL; 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 significant for DOM "as-is" */ if ((soap->mode & SOAP_XML_DOM) && soap->dom) { const char *t = soap->dom->code; /* save XML code */ s = soap_string_in(soap, -1, -1, -1, NULL); if (!soap->peeked && !s) return soap->error; if (soap->dom->prnt) soap->dom = soap->dom->prnt; if (s && (soap->mode & SOAP_XML_STRICT)) { for (; *s; s++) if (!soap_coblank((soap_wchar)*s)) return soap->error = SOAP_END_TAG; /* reject mixed content before ending tag */ } soap->dom->code = t; /* restore XML code */ } #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_CHK_EOF; if (!soap_coblank(c)) { if ((soap->mode & SOAP_XML_STRICT)) return soap->error = SOAP_END_TAG; /* reject mixed content before ending tag */ if (c == SOAP_LT) n++; else if (c == '/') { c = soap_get(soap); if (c == SOAP_GT && n > 0) n--; else soap_unget(soap, c); } } } } while (n-- > 0); s = soap->tag; n = sizeof(soap->tag); while ((c = soap_get(soap)) > 32) { if (n > 1) { *s++ = (char)c; n--; } } *s = '\0'; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; while (soap_coblank(c)) c = soap_get(soap); if (c != SOAP_GT) return soap->error = SOAP_SYNTAX_ERROR; #ifndef WITH_LEAN #ifdef WITH_DOM if (soap->feltendin) { int err = soap->error; soap->error = soap->feltendin(soap, soap->tag, tag); if (soap->error) return soap->error; if (err) return soap->error = err; /* restore error */ } #endif #endif 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 tag '%s' does not match '%s'\n", soap->tag, tag ? tag : SOAP_STR_EOS)); return soap->error = SOAP_SYNTAX_ERROR; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End tag found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag ? tag : SOAP_STR_EOS)); soap->level--; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 const char * SOAP_FMAC2 soap_attr_value(struct soap *soap, const char *name, int flag, int occurs) { struct soap_attribute *tp; if (*name == '-') return SOAP_STR_EOS; for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible == 2 && !soap_match_att(soap, tp->name, name)) break; } if (tp) { if (occurs == 4 || (occurs == 2 && (soap->mode & SOAP_XML_STRICT))) soap->error = SOAP_PROHIBITED; else if (flag >= 4) return soap_collapse(soap, tp->value, flag, 1); else return tp->value; } else if (occurs == 3 || (occurs == 1 && (soap->mode & SOAP_XML_STRICT))) { soap->error = SOAP_REQUIRED; } else { soap->error = SOAP_OK; } return NULL; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_set_attr(struct soap *soap, const char *name, const char *value, int flag) { struct soap_attribute *tp, *tq; if (*name == '-') return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set attribute %s='%s'\n", name, value ? value : SOAP_STR_EOS)); tq = NULL; for (tp = soap->attributes; tp; tq = tp, tp = tp->next) { if (!strcmp(tp->name, name)) break; } if (!tp) { size_t l = strlen(name); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute %s\n", name)); if (sizeof(struct soap_attribute) + l > l && (SOAP_MAXALLOCSIZE <= 0 || sizeof(struct soap_attribute) + l <= SOAP_MAXALLOCSIZE)) tp = (struct soap_attribute*)SOAP_MALLOC(soap, sizeof(struct soap_attribute) + l); if (!tp) 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 { struct soap_nlist *np = soap_lookup_ns(soap, name, s - name); if (np) { tp->ns = np->ns; } else { struct soap_attribute *tq; for (tq = soap->attributes; tq; tq = tq->next) { if (!strncmp(tq->name, "xmlns:", 6) && !strncmp(tq->name + 6, name, s - name) && !tq->name[6 + s - name]) { tp->ns = tq->ns; break; } } } for (; *tpp; tpp = &(*tpp)->next) { int k; 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 if (tq) { tq->next = tp; tp->next = NULL; } else { tp->next = soap->attributes; soap->attributes = tp; } soap_strcpy((char*)tp->name, l + 1, 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, (void*)tp->value)); SOAP_FREE(soap, tp->value); tp->value = NULL; tp->ns = NULL; } if (value) { if (!tp->value) { tp->size = strlen(value) + 1; if (SOAP_MAXALLOCSIZE <= 0 || tp->size <= SOAP_MAXALLOCSIZE) tp->value = (char*)SOAP_MALLOC(soap, tp->size); if (!tp->value) return soap->error = SOAP_EOM; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute value for %s (%p)\n", tp->name, (void*)tp->value)); } soap_strcpy(tp->value, tp->size, value); if (!strncmp(tp->name, "xmlns:", 6)) tp->ns = tp->value; tp->visible = 2; tp->flag = (short)flag; #ifndef WITH_LEAN if (!strcmp(name, "wsu:Id")) { soap->event = SOAP_SEC_BEGIN; soap_strcpy(soap->id, sizeof(soap->id), value); } if ((soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_XML_CANONICAL_NA)) { const char *s = strchr(name, ':'); if (s && strchr(value, ':')) { struct soap_nlist *np = soap_lookup_ns(soap, name, s - name); if (np && np->ns && soap->local_namespaces) { if ((!strcmp(s + 1, "type") && !strcmp(np->ns, soap->local_namespaces[2].ns)) /* xsi:type QName */ || ((!strcmp(s + 1, "arrayType") || !strcmp(s + 1, "itemType")) && !strcmp(np->ns, soap->local_namespaces[1].ns))) /* SOAP-ENC:arrayType and SOAP-ENC:itemType QName */ soap_utilize_ns(soap, value, 1); } } } #endif } else { tp->visible = 1; } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_clr_attr(struct soap *soap) { 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; } } /******************************************************************************/ static int soap_getattrval(struct soap *soap, char *s, size_t *n, soap_wchar d) { char buf[8]; size_t i; size_t k = *n; size_t m = 0; char *t = buf; for (i = 0; i < k; i++) { soap_wchar c; if (m) { *s++ = *t++; m--; continue; } if ((soap->mode & SOAP_C_UTFSTRING)) { c = soap_get(soap); if ((c & 0x80000000) && c >= -0x7FFFFF80 && c < SOAP_AP) { t = buf; c &= 0x7FFFFFFF; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { #ifdef WITH_REPLACE_ILLEGAL_UTF8 if (!((c >= 0x80 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD) || (c >= 0x10000 && c <= 0x10FFFF))) c = SOAP_UNKNOWN_UNICODE_CHAR; #endif 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 = t - buf - 1; if (i + m >= k) { soap_unget(soap, c | 0x80000000); *n = i; return soap->error = SOAP_EOM; } t = buf; *s++ = *t++; continue; } } else { c = soap_getutf8(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'; *n = i + 1; return SOAP_OK; } *s++ = '>'; break; case SOAP_QT: if (c == d) { *s = '\0'; *n = i + 1; return SOAP_OK; } *s++ = '"'; break; case SOAP_AP: if (c == d) { *s = '\0'; *n = i + 1; return SOAP_OK; } *s++ = '\''; break; case '\t': case '\n': case '\r': case ' ': case '/': if (d == ' ') { soap_unget(soap, c); *s = '\0'; *n = i + 1; return SOAP_OK; } *s++ = (char)c; break; default: if ((int)c == EOF) { *s = '\0'; *n = i + 1; return soap->error = SOAP_CHK_EOF; } *s++ = (char)c; } } return soap->error = SOAP_EOM; } /******************************************************************************/ #ifdef WITH_FAST 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 /******************************************************************************/ #ifdef WITH_FAST SOAP_FMAC1 int SOAP_FMAC2 soap_append_lab(struct soap *soap, const char *s, size_t n) { if (soap->labidx + n < soap->labidx) return soap->error = SOAP_EOM; if (soap->labidx + n >= soap->lablen) { char *t = soap->labbuf; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enlarging look-aside buffer to append data, size=%lu\n", (unsigned long)soap->lablen)); if (soap->lablen == 0) soap->lablen = SOAP_LABLEN; while (soap->labidx + n >= soap->lablen) { if (soap->lablen << 1 < soap->lablen) return soap->error = SOAP_EOM; soap->lablen <<= 1; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New look-aside buffer size=%lu\n", (unsigned long)soap->lablen)); if (SOAP_MAXALLOCSIZE > 0 && soap->lablen > SOAP_MAXALLOCSIZE) return soap->error = SOAP_EOM; soap->labbuf = (char*)SOAP_MALLOC(soap, soap->lablen); if (!soap->labbuf) { if (t) SOAP_FREE(soap, t); return soap->error = SOAP_EOM; } if (t) { (void)soap_memcpy((void*)soap->labbuf, soap->lablen, (const void*)t, soap->labidx); SOAP_FREE(soap, t); } } if (s) { (void)soap_memcpy((void*)(soap->labbuf + soap->labidx), soap->lablen - soap->labidx, (const void*)s, n); soap->labidx += n; } return SOAP_OK; } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_peek_element(struct soap *soap) { #ifdef WITH_DOM struct soap_dom_attribute **att = NULL; char *lead = NULL; #endif struct soap_attribute *tp, *tq = NULL; const char *t; char *s; soap_wchar c; 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; /* UTF-8 BOM? */ c = soap_getchar(soap); if (c == 0xEF && soap_get0(soap) == 0xBB) { soap_get1(soap); c = soap_get1(soap); if (c == 0xBF) soap->mode &= ~SOAP_ENC_LATIN; else soap_unget(soap, (0x0F << 12) | (0xBB << 6) | (c & 0x3F)); /* UTF-8 */ } else if ((c == 0xFE && soap_get0(soap) == 0xFF) /* UTF-16 BE */ || (c == 0xFF && soap_get0(soap) == 0xFE)) /* UTF-16 LE */ { return soap->error = SOAP_UTF_ERROR; } else { soap_unget(soap, c); } c = soap_get(soap); #ifdef WITH_DOM /* whitespace leading up to the start tag is significant for DOM as-is (but comments and PIs are removed from this lead) */ if (soap_coblank(c)) { soap->labidx = 0; do { if (soap_append_lab(soap, NULL, 0)) return soap->error; s = soap->labbuf + soap->labidx; i = soap->lablen - soap->labidx; soap->labidx = soap->lablen; while (soap_coblank(c) && i-- > 0) { *s++ = c; c = soap_get(soap); } } while (soap_coblank(c) || i == 0); *s = '\0'; lead = soap->labbuf; } #else /* skip space */ while (soap_coblank(c)) c = soap_get(soap); #endif if (c != SOAP_LT) { *soap->tag = '\0'; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; soap_unget(soap, c); #ifdef WITH_DOM /* whitespace leading up to the end tag is significant for DOM as-is */ if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (lead && *lead) soap->dom->tail = soap_strdup(soap, lead); else soap->dom->tail = SOAP_STR_EOS; /* body with closing tag instead of */ } #endif return soap->error = SOAP_NO_TAG; } do { c = soap_get1(soap); } while (soap_coblank(c)); s = soap->tag; i = sizeof(soap->tag); while (c != '>' && c != '/' && c > 32 && (int)c != EOF) { if (i > 1) { *s++ = (char)c; i--; } c = soap_get1(soap); } *s = '\0'; while (soap_coblank(c)) c = soap_get1(soap); #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM)) { 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->prnt = soap->dom; elt->elts = NULL; elt->atts = NULL; elt->nstr = NULL; elt->name = soap_strdup(soap, soap->tag); elt->text = NULL; elt->code = NULL; elt->tail = NULL; elt->node = NULL; elt->type = 0; if (lead && *lead) elt->lead = soap_strdup(soap, lead); else elt->lead = 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; if (!elt->name) return soap->error = SOAP_EOM; } #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 != '/' && c > 32 && (int)c != EOF) { if (i > 1) { *s++ = (char)c; i--; } 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)->text = NULL; (*att)->soap = soap; if (!(*att)->name) return soap->error = SOAP_EOM; } #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) { size_t l = strlen(soap->tmpbuf); tp = (struct soap_attribute*)SOAP_MALLOC(soap, sizeof(struct soap_attribute) + l); if (!tp) return soap->error = SOAP_EOM; (void)soap_memcpy((char*)tp->name, l + 1, soap->tmpbuf, l + 1); tp->value = NULL; tp->size = 0; tp->ns = NULL; tp->visible = 0; /* append attribute to the end of the list */ if (tq) { tq->next = tp; tp->next = NULL; } else { tp->next = soap->attributes; soap->attributes = tp; } } while (soap_coblank(c)) c = soap_get1(soap); if (c == '=') { size_t k; do { c = soap_getutf8(soap); } while (soap_coblank(c)); if (c != SOAP_QT && c != SOAP_AP) { soap_unget(soap, c); c = ' '; /* blank delimiter */ } k = tp->size; if (soap_getattrval(soap, tp->value, &k, c)) { #ifdef WITH_FAST if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; if (soap_store_lab(soap, tp->value, k)) return soap->error; if (tp->value) SOAP_FREE(soap, tp->value); tp->value = NULL; for (;;) { k = soap->lablen - soap->labidx; if (soap_getattrval(soap, soap->labbuf + soap->labidx, &k, 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; } tp->value = (char*)SOAP_MALLOC(soap, tp->size); if (!tp->value) return soap->error = SOAP_EOM; soap_strcpy(tp->value, tp->size, soap->labbuf); #else tp->size = k; if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; if (soap_alloc_block(soap) == NULL) return soap->error; for (;;) { s = (char*)soap_push_block(soap, NULL, SOAP_BLKLEN); if (!s) return soap->error; k = SOAP_BLKLEN; if (soap_getattrval(soap, s, &k, c)) { if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; soap_size_block(soap, NULL, k); } else { break; } } k = tp->size + soap->blist->size; if (SOAP_MAXALLOCSIZE > 0 && k > SOAP_MAXALLOCSIZE) return soap->error = SOAP_EOM; s = (char*)SOAP_MALLOC(soap, k); if (!s) return soap->error = SOAP_EOM; if (tp->value) { (void)soap_memcpy((void*)s, k, (const void*)tp->value, tp->size); SOAP_FREE(soap, tp->value); } soap_save_block(soap, NULL, s + tp->size, 0); tp->value = s; tp->size = k; #endif } if (tp->visible) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Duplicate attribute in %s\n", soap->tag)); return soap->error = SOAP_SYNTAX_ERROR; /* redefined (duplicate) attribute */ } tp->visible = 2; /* seen this attribute w/ value */ do { c = soap_get1(soap); } while (soap_coblank(c)); #ifdef WITH_DOM if (att && tp->value) { (*att)->text = soap_strdup(soap, tp->value); if (!(*att)->text) return soap->error = SOAP_EOM; } #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) == NULL) return soap->error; } } #ifdef WITH_DOM if (att) { soap->dom->nstr = soap_current_namespace_tag(soap, soap->tag); for (att = &soap->dom->atts; *att; att = &(*att)->next) (*att)->nstr = soap_current_namespace_att(soap, (*att)->name); } #endif if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; soap->body = (c != '/'); if (!soap->body) { do { c = soap_get1(soap); } while (soap_coblank(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->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH)) { *soap->id = '#'; soap_strcpy(soap->id + 1, sizeof(soap->id) - 1, tp->value); } } else if (!strcmp(tp->name, "href")) { if ((soap->version == 1 && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH) || ((soap->mode & (SOAP_ENC_MTOM | SOAP_ENC_DIME)) && *tp->value != '#')) soap_strcpy(soap->href, sizeof(soap->href), tp->value); } else if (!strcmp(tp->name, "ref")) { if ((soap->version == 2 && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH)) { *soap->href = '#'; soap_strcpy(soap->href + (*tp->value != '#'), sizeof(soap->href) - 1, tp->value); } } #else if (!strcmp(tp->name, "href")) { if ((soap->mode & (SOAP_ENC_MTOM | SOAP_ENC_DIME)) && *tp->value != '#') soap_strcpy(soap->href, sizeof(soap->href), tp->value); } #endif else if (!soap_match_tag(soap, tp->name, "xsi:type")) { soap_strcpy(soap->type, sizeof(soap->type), tp->value); } 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_match_tag(soap, tp->name, "SOAP-ENV:encodingStyle")) { if (!soap->encodingStyle) soap->encodingStyle = SOAP_STR_EOS; soap_version(soap); } 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)) { (void)soap_strncpy(soap->arrayType, sizeof(soap->arrayType), tp->value, s - tp->value); soap_strcpy(soap->arraySize, sizeof(soap->arraySize), s); } else soap_strcpy(soap->arrayType, sizeof(soap->arrayType), tp->value); } else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:offset")) { soap_strcpy(soap->arrayOffset, sizeof(soap->arrayOffset), tp->value); } 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 (!soap_match_tag(soap, tp->name, "SOAP-ENC:id")) { *soap->id = '#'; soap_strcpy(soap->id + 1, sizeof(soap->id) - 1, tp->value); } else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:ref")) { *soap->href = '#'; soap_strcpy(soap->href + (*tp->value != '#'), sizeof(soap->href) - 1, tp->value); } else #endif if (!soap_match_tag(soap, tp->name, "SOAP-ENC:itemType")) { soap_strcpy(soap->arrayType, sizeof(soap->arrayType), tp->value); } else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:arraySize")) { soap_strcpy(soap->arraySize, sizeof(soap->arraySize), tp->value); } 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; } } else { if (!soap_match_tag(soap, tp->name, "wsdl:required") && !strcmp(tp->value, "true")) soap->mustUnderstand = 1; } } } #ifdef WITH_DOM if (soap->feltbegin) return soap->error = soap->feltbegin(soap, soap->tag); #endif return soap->error = SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_retry(struct soap *soap) { soap->error = SOAP_OK; soap_revert(soap); } /******************************************************************************/ 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 to last element '%s' (level=%u)\n", soap->tag, soap->level)); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_ignore(struct soap *soap) { int n = 0; soap_wchar c; soap->level++; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Ignoring XML content at level=%u\n", soap->level)); #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (!soap_string_in(soap, -1, -1, -1, NULL)) return soap->error; } else #endif { for (;;) { c = soap_get(soap); switch (c) { case SOAP_TT: if (n == 0) goto end; n--; break; case SOAP_LT: n++; break; case '/': if (n > 0) { c = soap_get0(soap); if (c == '>') n--; } break; default: if ((int)c == EOF) return soap->error = SOAP_EOF; } } end: soap_unget(soap, c); } return soap_element_end_in(soap, NULL); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_string_out(struct soap *soap, const char *s, int flag) { const char *t; soap_wchar c; soap_wchar mask = (soap_wchar)0xFFFFFF80UL; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_strdup(soap, s); if (!soap->dom->text) return soap->error = SOAP_EOM; return SOAP_OK; } #endif if (flag == 2 || (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 '&': 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; case 0x7F: 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; int m = mbtowc(&wc, t - 1, MB_CUR_MAX); if (m > 0 && !((soap_wchar)wc == c && m == 1 && c < 0x80)) { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, (unsigned long)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); } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_string_in(struct soap *soap, int flag, long minlen, long maxlen, const char *pattern) { char *s; char *t = NULL; size_t i; ULONG64 l = 0; int n = 0, f = 0, m = 0; 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 if (maxlen < 0 && soap->maxlength > 0) maxlen = soap->maxlength; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reading string content, flag=%d\n", flag)); if (flag <= 0 && soap->peeked && *soap->tag) { #ifndef WITH_LEAN struct soap_attribute *tp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String content includes tag '%s' and attributes\n", soap->tag)); t = soap->tmpbuf; *t = '<'; soap_strcpy(t + 1, sizeof(soap->tmpbuf) - 1, soap->tag); t += strlen(t); for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { size_t k = strlen(tp->name); if (t + k + 1 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; /* too many or attribute values to large */ *t++ = ' '; (void)soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->name, k); t += k; if (tp->value) { k = strlen(tp->value); if (t + k + 3 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; /* too many or attribute values to large */ *t++ = '='; *t++ = '"'; (void)soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->value, k); t += k; *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 <= 0) { int state = 0; #ifdef WITH_FAST soap->labidx = 0; /* use look-aside buffer */ #else if (soap_alloc_block(soap) == NULL) return NULL; #endif for (;;) { #ifdef WITH_FAST 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 size_t k = SOAP_BLKLEN; s = (char*)soap_push_block(soap, NULL, k); if (!s) 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 || c < SOAP_AP) && state != 1 && !(soap->mode & SOAP_ENC_LATIN)) { if ((c & 0x7FFFFFFF) >= 0x80) { soap_unget(soap, c); c = soap_getutf8(soap); } if ((c & 0x7FFFFFFF) >= 0x80 && (flag <= 0 || (soap->mode & SOAP_C_UTFSTRING))) { c &= 0x7FFFFFFF; t = buf; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { #ifdef WITH_REPLACE_ILLEGAL_UTF8 if (!((c >= 0x80 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD) || (c >= 0x10000 && c <= 0x10FFFF))) c = SOAP_UNKNOWN_UNICODE_CHAR; #endif 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++ = (char)c; continue; case 2: if (c == '-') state = 6; *s++ = (char)c; continue; case 3: if (c == '?') state = 8; *s++ = (char)c; continue; /* CDATA */ case 4: if (c == ']') state = 5; else state = 1; *s++ = (char)c; continue; case 5: if (c == '>') state = 0; else if (c != ']') state = 1; *s++ = (char)c; continue; /* comment */ case 6: if (c == '-') state = 7; else state = 2; *s++ = (char)c; continue; case 7: if (c == '>') state = 0; else if (c != '-') state = 2; *s++ = (char)c; continue; /* PI */ case 8: if (c == '>') state = 0; else if (c != '?') state = 3; *s++ = (char)c; continue; } switch (c) { case SOAP_TT: if (n == 0) goto end; n--; *s++ = '<'; t = (char*)"/"; m = 1; break; case SOAP_LT: if (flag == 3 || (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_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 == '-') { c = soap_getchar(soap); if (c == '-') 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 if (flag == 3 || (f && n == 0)) { soap_revget1(soap); c = '<'; goto end; } 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)) { #if defined(WIN32) && !defined(CYGWIN) && !defined(__MINGW32__) && !defined(__MINGW64__) && !defined(__BORLANDC__) m = 0; wctomb_s(&m, buf, sizeof(buf), (wchar_t)(c & 0x7FFFFFFF)); #else m = wctomb(buf, (wchar_t)(c & 0x7FFFFFFF)); #endif 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 (maxlen >= 0 && l > (size_t)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_alloc_block(soap) == NULL) return NULL; #endif for (;;) { #ifdef WITH_FAST 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 size_t k = SOAP_BLKLEN; s = (char*)soap_push_block(soap, NULL, k); if (!s) return NULL; #endif for (i = 0; i < k; i++) { if (m > 0) { *s++ = *t++; /* copy multibyte characters */ m--; continue; } #ifndef WITH_CDATA if (flag <= 0) c = soap_getchar(soap); else #endif { c = soap_getutf8(soap); if ((soap->mode & SOAP_C_UTFSTRING)) { if (c >= 0x80 || (c < SOAP_AP && c >= -0x7FFFFF80)) { c &= 0x7FFFFFFF; t = buf; if (c < 0x0800) { *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); } else { #ifdef WITH_REPLACE_ILLEGAL_UTF8 if (!((c >= 0x80 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD) || (c >= 0x10000 && c <= 0x10FFFF))) c = SOAP_UNKNOWN_UNICODE_CHAR; #endif 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++; l++; if (maxlen >= 0 && l > (size_t)maxlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); soap->error = SOAP_LENGTH; return NULL; } continue; } } } switch (c) { case SOAP_TT: if (n == 0) goto end; n--; *s++ = '<'; t = (char*)"/"; m = 1; break; case SOAP_LT: if (flag == 3 || (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) { if (flag > 0) { c = soap_get(soap); if (c == SOAP_GT) n--; } else { c = soap_getchar(soap); if (c == '>') n--; } soap_unget(soap, c); } *s++ = '/'; break; case (soap_wchar)('<' | 0x80000000): if (flag > 0) { *s++ = '<'; } else { *s++ = '&'; t = (char*)"lt;"; m = 3; } break; case (soap_wchar)('>' | 0x80000000): if (flag > 0) { *s++ = '>'; } else { *s++ = '&'; t = (char*)"gt;"; m = 3; } break; case (soap_wchar)('&' | 0x80000000): if (flag > 0) { *s++ = '&'; } else { *s++ = '&'; t = (char*)"amp;"; m = 4; } break; case (soap_wchar)('"' | 0x80000000): if (flag > 0) { *s++ = '"'; } else { *s++ = '&'; t = (char*)"quot;"; m = 5; } break; case (soap_wchar)('\'' | 0x80000000): if (flag > 0) { *s++ = '\''; } else { *s++ = '&'; t = (char*)"apos;"; m = 5; } break; default: if ((int)c == EOF) goto end; #ifndef WITH_CDATA if (c == '<') { c = soap_getchar(soap); soap_unget(soap, c); if (c == '/') { c = SOAP_TT; if (n == 0) goto end; n--; } else { n++; } *s++ = '<'; } else #endif #ifndef WITH_LEANER #ifdef HAVE_WCTOMB if ((soap->mode & SOAP_C_MBSTRING)) { #if defined(WIN32) && !defined(CYGWIN) && !defined(__MINGW32__) && !defined(__MINGW64__) && !defined(__BORLANDC__) m = 0; wctomb_s(&m, buf, sizeof(buf), (wchar_t)(c & 0x7FFFFFFF)); #else m = wctomb(buf, (wchar_t)(c & 0x7FFFFFFF)); #endif 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 (maxlen >= 0 && l > (size_t)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); if (!t) return NULL; #else soap_size_block(soap, NULL, i + 1); t = soap_save_block(soap, NULL, NULL, 0); #endif if (minlen > 0 && l < (size_t)minlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too short: %lu chars, minlen=%ld\n", (unsigned long)l, minlen)); soap->error = SOAP_LENGTH; return NULL; } #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom && *t) { if (flag > 0) soap->dom->text = t; else soap->dom->code = t; } #endif if (flag == 2) { if (soap_s2QName(soap, t, &t, minlen, maxlen, pattern)) return NULL; } else if (flag >= 4 && t) { t = soap_collapse(soap, t, flag, 1); } #ifndef WITH_LEANER else if (pattern && soap->fsvalidate) { soap->error = soap->fsvalidate(soap, pattern, t); if (soap->error) return NULL; } #endif return t; } /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_wstring_out(struct soap *soap, const wchar_t *s, int flag) { const char *t; char tmp; soap_wchar c; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_wchar2s(soap, 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 { /* check for UTF16 encoding when wchar_t is too small to hold UCS */ if (sizeof(wchar_t) < 4 && (c & 0xFC00) == 0xD800) { soap_wchar d = *s; if ((d & 0xFC00) == 0xDC00) { c = ((c - 0xD800) << 10) + (d - 0xDC00) + 0x10000; s++; } #ifdef WITH_REPLACE_ILLEGAL_UTF8 else { c = SOAP_UNKNOWN_UNICODE_CHAR; /* Malformed UTF-16 */ } #endif } if (soap_pututf8(soap, (unsigned long)c)) return soap->error; } continue; } if (soap_send(soap, t)) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 wchar_t * SOAP_FMAC2 soap_wstring_in(struct soap *soap, int flag, long minlen, long maxlen, const char *pattern) { wchar_t *s; int i, n = 0, f = 0; ULONG64 l = 0; soap_wchar c; char *t = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reading wide string content\n")); if (maxlen < 0 && soap->maxlength > 0) maxlen = soap->maxlength; if (flag <= 0 && soap->peeked && *soap->tag) { #ifndef WITH_LEAN struct soap_attribute *tp; t = soap->tmpbuf; *t = '<'; soap_strcpy(t + 1, sizeof(soap->tmpbuf) - 1, soap->tag); t += strlen(t); for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { size_t k = strlen(tp->name); if (t + k + 1 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; *t++ = ' '; (void)soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->name, k); t += k; if (tp->value) { k = strlen(tp->value); if (t + k + 3 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; *t++ = '='; *t++ = '"'; (void)soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->value, k); t += k; *t++ = '"'; } } } if (!soap->body) *t++ = '/'; *t++ = '>'; *t = '\0'; t = soap->tmpbuf; #endif if (soap->body) n = 1; f = 1; soap->peeked = 0; } if (soap_alloc_block(soap) == NULL) return NULL; for (;;) { s = (wchar_t*)soap_push_block(soap, NULL, sizeof(wchar_t)*SOAP_BLKLEN); if (!s) 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++ = L'<'; soap_unget(soap, '/'); break; case SOAP_LT: if (flag == 3 || (f && n == 0)) goto end; n++; *s++ = L'<'; break; case SOAP_GT: *s++ = L'>'; break; case SOAP_QT: *s++ = L'"'; break; case SOAP_AP: *s++ = L'\''; break; case '/': if (n > 0) { c = soap_getutf8(soap); if (c == SOAP_GT) n--; soap_unget(soap, c); } *s++ = L'/'; break; case '<': if (flag > 0) { *s++ = L'<'; } else { *s++ = L'&'; t = (char*)"lt;"; } break; case '>': if (flag > 0) { *s++ = L'>'; } else { *s++ = (wchar_t)'&'; t = (char*)"gt;"; } break; case '"': if (flag > 0) { *s++ = L'"'; } else { *s++ = L'&'; t = (char*)"quot;"; } break; default: if ((int)c == EOF) goto end; /* use UTF16 encoding when wchar_t is too small to hold UCS */ if (sizeof(wchar_t) < 4 && c > 0xFFFF) { soap_wchar c1, c2; c1 = 0xD800 - (0x10000 >> 10) + (c >> 10); c2 = 0xDC00 + (c & 0x3FF); c = c1; soap_unget(soap, c2); } *s++ = (wchar_t)(c & 0x7FFFFFFF); } l++; if (maxlen >= 0 && l > (size_t)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 = L'\0'; soap_size_block(soap, NULL, sizeof(wchar_t) * (i + 1)); if (minlen > 0 && l < (size_t)minlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too short: %lu chars, minlen=%ld\n", (unsigned long)l, minlen)); soap->error = SOAP_LENGTH; return NULL; } s = (wchar_t*)soap_save_block(soap, NULL, NULL, 0); #ifndef WITH_LEAN if (flag >= 4 && s) s = soap_wcollapse(soap, s, flag, 1); #endif #ifndef WITH_LEANER if (pattern && soap->fwvalidate) { soap->error = soap->fwvalidate(soap, pattern, s); if (soap->error) return NULL; } #endif #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) soap->dom->text = soap_wchar2s(soap, s); #endif return s; } #endif /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_int2s(struct soap *soap, int n) { return soap_long2s(soap, (long)n); } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2int(struct soap *soap, const char *s, int *p) { if (s) { long n; char *r; if (!*s) return soap->error = SOAP_EMPTY; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif n = soap_strtol(s, &r, 10); if (s == r || *r #ifndef WITH_LEAN || n != (int)n #endif #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; *p = (int)n; } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (int*)soap_id_enter(soap, soap->id, p, t, sizeof(int), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2int(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (int*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(int), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_long2s(struct soap *soap, long n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), "%ld", n); return soap->tmpbuf; } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2long(struct soap *soap, const char *s, long *p) { if (s) { char *r; if (!*s) return soap->error = SOAP_EMPTY; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = soap_strtol(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (long*)soap_id_enter(soap, soap->id, p, t, sizeof(long), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2long(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (long*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(long), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_LONG642s(struct soap *soap, LONG64 n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), SOAP_LONG_FORMAT, n); return soap->tmpbuf; } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2LONG64(struct soap *soap, const char *s, LONG64 *p) { if (s) { char *r; if (!*s) return soap->error = SOAP_EMPTY; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = soap_strtoll(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (LONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(LONG64), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2LONG64(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (LONG64*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(LONG64), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_byte2s(struct soap *soap, char n) { return soap_long2s(soap, (long)n); } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2byte(struct soap *soap, const char *s, char *p) { if (s) { long n; char *r; if (!*s) return soap->error = SOAP_EMPTY; n = soap_strtol(s, &r, 10); if (s == r || *r || n < -128 || n > 127) soap->error = SOAP_TYPE; *p = (char)n; } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (char*)soap_id_enter(soap, soap->id, p, t, sizeof(char), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2byte(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (char*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(char), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_short2s(struct soap *soap, short n) { return soap_long2s(soap, (long)n); } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2short(struct soap *soap, const char *s, short *p) { if (s) { long n; char *r; if (!*s) return soap->error = SOAP_EMPTY; n = soap_strtol(s, &r, 10); if (s == r || *r || n < -32768 || n > 32767) soap->error = SOAP_TYPE; *p = (short)n; } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (short*)soap_id_enter(soap, soap->id, p, t, sizeof(short), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2short(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (short*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(short), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_float2s(struct soap *soap, float n) { #if defined(WITH_C_LOCALE) # if !defined(WIN32) SOAP_LOCALE_T locale; # endif #else char *s; #endif if (soap_isnan((double)n)) return "NaN"; if (soap_ispinff(n)) return "INF"; if (soap_isninff(n)) return "-INF"; #if defined(WITH_C_LOCALE) # ifdef WIN32 _sprintf_s_l(soap->tmpbuf, _countof(soap->tmpbuf), soap->float_format, SOAP_LOCALE(soap), n); # else locale = uselocale(SOAP_LOCALE(soap)); (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), soap->float_format, n); uselocale(locale); # endif #else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), soap->float_format, n); s = strchr(soap->tmpbuf, ','); /* convert decimal comma to DP */ if (s) *s = '.'; #endif return soap->tmpbuf; } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2float(struct soap *soap, const char *s, float *p) { if (s) { if (!*s) return soap->error = SOAP_EMPTY; 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 strtod first */ #if defined(WITH_C_LOCALE) # if defined(HAVE_STRTOD_L) char *r; # ifdef WIN32 *p = (float)_strtod_l(s, &r, SOAP_LOCALE(soap)); # else *p = (float)strtod_l(s, &r, SOAP_LOCALE(soap)); # endif if (*r) soap->error = SOAP_TYPE; # elif defined(HAVE_STRTOF_L) char *r; *p = strtof_l((char*)s, &r, SOAP_LOCALE(soap)); if (*r) soap->error = SOAP_TYPE; # elif defined(HAVE_SSCANF_L) double n; if (sscanf_l(s, SOAP_LOCALE(soap), "%lf", &n) != 1) soap->error = SOAP_TYPE; *p = (float)n; # elif defined(HAVE_STRTOD) char *r; SOAP_LOCALE_T locale = uselocale(SOAP_LOCALE(soap)); *p = (float)strtod((char*)s, &r); uselocale(locale); if (*r) soap->error = SOAP_TYPE; # elif defined(HAVE_STRTOF) char *r; SOAP_LOCALE_T locale = uselocale(SOAP_LOCALE(soap)); *p = strtof((char*)s, &r); uselocale(locale); if (*r) soap->error = SOAP_TYPE; # elif defined(HAVE_SSCANF) double n; SOAP_LOCALE_T locale = uselocale(SOAP_LOCALE(soap)); if (sscanf(s, "%lf", &n) != 1) soap->error = SOAP_TYPE; uselocale(locale); *p = (float)n; # else soap->error = SOAP_TYPE; # endif #elif defined(HAVE_STRTOD) char *r; *p = (float)strtod(s, &r); if (*r) soap->error = SOAP_TYPE; #elif defined(HAVE_STRTOF) char *r; *p = strtof((char*)s, &r); if (*r) soap->error = SOAP_TYPE; #elif defined(HAVE_SSCANF) double n; if (sscanf(s, "%lf", &n) != 1) soap->error = SOAP_TYPE; *p = (float)n; #else soap->error = SOAP_TYPE; #endif } } return soap->error; } /******************************************************************************/ #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 /******************************************************************************/ 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; #else (void)type; #endif p = (float*)soap_id_enter(soap, soap->id, p, t, sizeof(float), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2float(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (float*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(float), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_double2s(struct soap *soap, double n) { #if defined(WITH_C_LOCALE) # if !defined(WIN32) SOAP_LOCALE_T locale; # endif #else char *s; #endif if (soap_isnan(n)) return "NaN"; if (soap_ispinfd(n)) return "INF"; if (soap_isninfd(n)) return "-INF"; #if defined(WITH_C_LOCALE) # ifdef WIN32 _sprintf_s_l(soap->tmpbuf, _countof(soap->tmpbuf), soap->double_format, SOAP_LOCALE(soap), n); # else locale = uselocale(SOAP_LOCALE(soap)); (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 40), soap->double_format, n); uselocale(locale); # endif #else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 40), soap->double_format, n); s = strchr(soap->tmpbuf, ','); /* convert decimal comma to DP */ if (s) *s = '.'; #endif return soap->tmpbuf; } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2double(struct soap *soap, const char *s, double *p) { if (s) { if (!*s) return soap->error = SOAP_EMPTY; 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(WITH_C_LOCALE) # if defined(HAVE_STRTOD_L) char *r; # ifdef WIN32 *p = _strtod_l(s, &r, SOAP_LOCALE(soap)); # else *p = strtod_l(s, &r, SOAP_LOCALE(soap)); # endif if (*r) soap->error = SOAP_TYPE; # elif defined(HAVE_STRTOD) char *r; SOAP_LOCALE_T locale = uselocale(SOAP_LOCALE(soap)); *p = strtod(s, &r); uselocale(locale); if (*r) soap->error = SOAP_TYPE; # elif defined(HAVE_SSCANF_L) SOAP_LOCALE_T locale = uselocale(SOAP_LOCALE(soap)); if (sscanf_l(s, SOAP_LOCALE(soap), "%lf", p) != 1) soap->error = SOAP_TYPE; uselocale(locale); # else soap->error = SOAP_TYPE; # endif #elif defined(HAVE_STRTOD) char *r; *p = strtod(s, &r); if (*r) soap->error = SOAP_TYPE; #elif defined(HAVE_SSCANF) if (sscanf(s, "%lf", p) != 1) soap->error = SOAP_TYPE; #else soap->error = SOAP_TYPE; #endif } } return soap->error; } /******************************************************************************/ 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; #else (void)type; #endif p = (double*)soap_id_enter(soap, soap->id, p, t, sizeof(double), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2double(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (double*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(double), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedByte2s(struct soap *soap, unsigned char n) { return soap_unsignedLong2s(soap, (unsigned long)n); } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedByte(struct soap *soap, const char *s, unsigned char *p) { if (s) { long n; char *r; if (!*s) return soap->error = SOAP_EMPTY; n = soap_strtol(s, &r, 10); if (s == r || *r || n < 0 || n > 255) soap->error = SOAP_TYPE; *p = (unsigned char)n; } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (unsigned char*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned char), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2unsignedByte(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (unsigned char*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned char), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedShort2s(struct soap *soap, unsigned short n) { return soap_unsignedLong2s(soap, (unsigned long)n); } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedShort(struct soap *soap, const char *s, unsigned short *p) { if (s) { long n; char *r; if (!*s) return soap->error = SOAP_EMPTY; n = soap_strtol(s, &r, 10); if (s == r || *r || n < 0 || n > 65535) soap->error = SOAP_TYPE; *p = (unsigned short)n; } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (unsigned short*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned short), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2unsignedShort(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (unsigned short*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned short), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedInt2s(struct soap *soap, unsigned int n) { return soap_unsignedLong2s(soap, (unsigned long)n); } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedInt(struct soap *soap, const char *s, unsigned int *p) { if (s) { char *r; if (!*s) return soap->error = SOAP_EMPTY; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = (unsigned int)soap_strtoul(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; #ifdef HAVE_STRTOUL if (*p > 0 && strchr(s, '-')) return soap->error = SOAP_TYPE; #endif } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (unsigned int*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned int), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2unsignedInt(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (unsigned int*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned int), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedLong2s(struct soap *soap, unsigned long n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), "%lu", n); return soap->tmpbuf; } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedLong(struct soap *soap, const char *s, unsigned long *p) { if (s) { char *r; if (!*s) return soap->error = SOAP_EMPTY; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = soap_strtoul(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; #ifdef HAVE_STRTOUL if (*p > 0 && strchr(s, '-')) return soap->error = SOAP_TYPE; #endif } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (unsigned long*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned long), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2unsignedLong(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (unsigned long*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned long), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_ULONG642s(struct soap *soap, ULONG64 n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), SOAP_ULONG_FORMAT, n); return soap->tmpbuf; } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2ULONG64(struct soap *soap, const char *s, ULONG64 *p) { if (s) { char *r; if (!*s) return soap->error = SOAP_EMPTY; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = soap_strtoull(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; if (*p > 0 && strchr(s, '-')) return soap->error = SOAP_TYPE; } return soap->error; } /******************************************************************************/ 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; #ifndef WITH_LEAN 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; } #else (void)type; #endif p = (ULONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(ULONG64), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2ULONG64(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (ULONG64*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(ULONG64), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2char(struct soap *soap, const char *s, char **t, int flag, long minlen, long maxlen, const char *pattern) { if (s) { const char *r = soap_string(soap, s, flag, minlen, maxlen, pattern); if (r && (*t = soap_strdup(soap, r)) == NULL) return soap->error = SOAP_EOM; } return soap->error; } /******************************************************************************/ #ifndef WITH_COMPAT #ifdef __cplusplus SOAP_FMAC1 int SOAP_FMAC2 soap_s2stdchar(struct soap *soap, const char *s, std::string *t, int flag, long minlen, long maxlen, const char *pattern) { if (s) { const char *r = soap_string(soap, s, flag, minlen, maxlen, pattern); if (r) t->assign(r); } return soap->error; } #endif #endif /******************************************************************************/ static const char* soap_string(struct soap *soap, const char *s, int flag, long minlen, long maxlen, const char *pattern) { if (s) { if (maxlen < 0 && soap->maxlength > 0) maxlen = soap->maxlength; if (minlen > 0 || maxlen >= 0) { size_t l; if ((soap->mode & SOAP_C_UTFSTRING)) l = soap_utf8len(s); else l = strlen(s); if ((maxlen >= 0 && l > (size_t)maxlen) || (minlen > 0 && l < (size_t)minlen)) { soap->error = SOAP_LENGTH; return NULL; } } if (flag >= 4) s = soap_collapse(soap, (char*)s, flag, 0); #ifndef WITH_LEANER if (pattern && soap->fsvalidate) { soap->error = soap->fsvalidate(soap, pattern, s); if (soap->error) return NULL; } #else (void)pattern; #endif } return s; } /******************************************************************************/ static char* soap_collapse(struct soap *soap, char *s, int flag, int insitu) { /* flag 4=normalizedString (replace), 5=token (collapse) */ char *t; size_t n; if (!s) return NULL; if (flag == 4) { for (t = s; *t && (!soap_coblank((soap_wchar)*t) || *t == 32); t++) continue; if (*t) { /* replace white space and control chars by blanks */ if (!insitu) s = soap_strdup(soap, s); for (t = s; *t; t++) if (soap_coblank((soap_wchar)*t)) *t = ' '; } return s; } /* collapse white space */ for (t = s; *t && soap_coblank((soap_wchar)*t); t++) continue; n = strlen(t); if (insitu && s < t) (void)soap_memmove(s, n + 1, t, n + 1); else s = t; if (n > 0) { if (!soap_coblank((soap_wchar)s[n-1])) { for (t = s; (*t && !soap_coblank((soap_wchar)*t)) || (*t == 32 && (!t[1] || !soap_coblank((soap_wchar)t[1]))); t++) continue; if (!*t) return s; } if (!insitu) s = soap_strdup(soap, s); for (t = s; *t; t++) { if (soap_coblank((soap_wchar)*t)) { char *r; *t = ' '; for (r = t + 1; *r && soap_coblank((soap_wchar)*r); r++) continue; if (r > t + 1) (void)soap_memmove(t + 1, n - (t-s), r, n - (r-s) + 1); } } t--; if (t >= s && *t == 32) *t = '\0'; } return s; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2QName(struct soap *soap, const char *s, char **t, long minlen, long maxlen, const char *pattern) { *t = NULL; if (s) { const char *r = soap_QName(soap, s, minlen, maxlen, pattern); if (r && (*t = soap_strdup(soap, r)) == NULL) return soap->error = SOAP_EOM; } return soap->error; } /******************************************************************************/ #ifndef WITH_COMPAT #ifdef __cplusplus SOAP_FMAC1 int SOAP_FMAC2 soap_s2stdQName(struct soap *soap, const char *s, std::string *t, long minlen, long maxlen, const char *pattern) { t->clear(); if (s) { const char *r = soap_QName(soap, s, minlen, maxlen, pattern); if (r) t->assign(r); } return soap->error; } #endif #endif /******************************************************************************/ static const char* soap_QName(struct soap *soap, const char *s, long minlen, long maxlen, const char *pattern) { if (s) { char *b; if (maxlen < 0 && soap->maxlength > 0) maxlen = soap->maxlength; if (minlen > 0 || maxlen >= 0) { size_t l; if ((soap->mode & SOAP_C_UTFSTRING)) l = soap_utf8len(s); else l = strlen(s); if ((maxlen >= 0 && l > (size_t)maxlen) || (minlen > 0 && l < (size_t)minlen)) { soap->error = SOAP_LENGTH; return NULL; } } #ifdef WITH_FAST soap->labidx = 0; #else if (soap_alloc_block(soap) == NULL) return NULL; #endif 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; const char *p = NULL; short flag = 0; const char *r = NULL; size_t m = 0; #ifndef WITH_FAST size_t k = 0; #endif /* skip blanks */ while (*s && soap_coblank((soap_wchar)*s)) s++; if (!*s) break; /* find next QName */ n = 1; while (s[n] && !soap_coblank((soap_wchar)s[n])) n++; np = soap->nlist; /* if there is no namespace stack, or prefix is "#" or "xml" then copy string */ if (!np || *s == '#' || !strncmp(s, "xml:", 4)) { r = s; m = n; } else /* we normalize the QName by replacing its prefix */ { const char *q; for (p = s; *p && p < s + n; p++) if (*p == ':') break; 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 && (q = soap->local_namespaces[np->index].id) != NULL) { size_t k = strlen(q); if (q[k-1] != '_') { r = q; m = k; } else { flag = 1; r = soap->local_namespaces[np->index].ns; m = strlen(r); } } else if (np->ns) { flag = 1; r = np->ns; m = strlen(r); } 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)); soap->error = SOAP_NAMESPACE; return NULL; } } else if (s[n]) /* no namespace, part of string */ { r = s; m = n; } else /* no namespace: assume "" namespace */ { flag = 1; } } #ifdef WITH_FAST if ((flag && soap_append_lab(soap, "\"", 1)) || (m && soap_append_lab(soap, r, m)) || (flag && soap_append_lab(soap, "\"", 1)) || (p && (soap_append_lab(soap, ":", 1) || soap_append_lab(soap, p, n - (p-s))))) return NULL; #else k = 2*flag + m + (p ? n - (p-s) + 1 : 0) + (s[n] != '\0'); b = (char*)soap_push_block(soap, NULL, k); if (!b) return NULL; if (flag) *b++ = '"'; if (m) { if (soap_memcpy((void*)b, k, (const void*)r, m)) { soap->error = SOAP_EOM; return NULL; } b += m; } if (flag) *b++ = '"'; if (p) { *b++ = ':'; if (soap_memcpy((void*)b, k - m - flag - 1, (const void*)p, n - (p-s))) { soap->error = SOAP_EOM; return NULL; } b += n - (p-s); } #endif /* advance to next and add spacing */ s += n; while (*s && soap_coblank(*s)) s++; if (*s) { #ifdef WITH_FAST if (soap_append_lab(soap, " ", 1)) return NULL; #else *b = ' '; #endif } } #ifdef WITH_FAST if (soap_append_lab(soap, SOAP_STR_EOS, 1)) return NULL; b = soap->labbuf; #else b = (char*)soap_push_block(soap, NULL, 1); if (!b) return NULL; *b = '\0'; b = (char*)soap_save_block(soap, NULL, NULL, 0); #endif #ifndef WITH_LEANER if (pattern && soap->fsvalidate) { soap->error = soap->fsvalidate(soap, pattern, b); if (soap->error) return NULL; } #else (void)pattern; #endif return b; } return NULL; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_QName2s(struct soap *soap, const char *s) { const char *t = NULL; if (s) { #ifdef WITH_FAST soap_store_lab(soap, SOAP_STR_EOS, 1); soap->labidx = 0; #else char *b = NULL; if (soap_alloc_block(soap) == NULL) return NULL; #endif for (;;) { size_t n; const char *q = NULL; const char *r = NULL; size_t m = 0; #ifndef WITH_FAST size_t k = 0; #endif /* skip blanks */ while (*s && soap_coblank((soap_wchar)*s)) s++; if (!*s) { #ifdef WITH_FAST soap->labbuf[soap->labidx > 0 ? soap->labidx - 1 : 0] = '\0'; #else if (!b) return soap_strdup(soap, SOAP_STR_EOS); --b; *b = '\0'; #endif break; } /* find next QName */ n = 0; while (s[n] && !soap_coblank((soap_wchar)s[n])) { if (s[n] == ':') r = s; n++; } if (*s != '"') /* non-quoted: pass string as is */ { #ifndef WITH_LEAN if (r && (soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_XML_CANONICAL_NA)) soap_utilize_ns(soap, s, 1); #endif r = s; m = n + 1; } else /* prefix quoted URI-based string */ { q = strchr(s + 1, '"'); if (q) { struct Namespace *p = soap->local_namespaces; if (p) { for (; p->id; p++) { if (p->ns) if (!soap_tag_cmp(s + 1, p->ns)) break; if (p->in) if (!soap_tag_cmp(s + 1, p->in)) break; } } q++; /* URL is in the namespace table? */ if (p && p->id) { r = p->id; m = strlen(r); } else /* not in namespace table: create xmlns binding */ { char *x = soap_strdup(soap, s + 1); if (!x) return NULL; x[q - s - 2] = '\0'; (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 27), "xmlns:_%d", soap->idnum++); soap_set_attr(soap, soap->tmpbuf, x, 1); r = soap->tmpbuf + 6; m = strlen(r); } } } /* copy normalized QName into buffer, including the ending blank or NUL */ #ifdef WITH_FAST if ((m && soap_append_lab(soap, r, m)) || (q && soap_append_lab(soap, q, n - (q - s) + 1))) return NULL; #else k = m + (q ? n - (q - s) + 1 : 0); b = (char*)soap_push_block(soap, NULL, k); if (!b) { soap->error = SOAP_EOM; return NULL; } if (soap_memcpy((void*)b, k, (const void*)r, m)) { soap->error = SOAP_EOM; return NULL; } b += m; if (q) { if (soap_memcpy((void*)b, k - m, (const void*)q, n - (q - s) + 1)) { soap->error = SOAP_EOM; return NULL; } b += n - (q - s) + 1; } #endif /* advance to next */ s += n; } #ifdef WITH_FAST t = soap_strdup(soap, soap->labbuf); if (!t) soap->error = SOAP_EOM; #else t = (char*)soap_save_block(soap, NULL, NULL, 0); #endif } return t; } /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2wchar(struct soap *soap, const char *s, wchar_t **t, int flag, long minlen, long maxlen, const char *pattern) { if (s) { const wchar_t *r = soap_wstring(soap, s, flag, minlen, maxlen, pattern); if (r && (*t = soap_wstrdup(soap, r)) == NULL) return soap->error = SOAP_EOM; } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_COMPAT #ifdef __cplusplus #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2stdwchar(struct soap *soap, const char *s, std::wstring *t, int flag, long minlen, long maxlen, const char *pattern) { if (s) { const wchar_t *r = soap_wstring(soap, s, flag, minlen, maxlen, pattern); if (r) t->assign(r); } return soap->error; } #endif #endif #endif /******************************************************************************/ #ifndef WITH_LEAN static const wchar_t* soap_wstring(struct soap *soap, const char *s, int flag, long minlen, long maxlen, const char *pattern) { if (s) { size_t l; soap_wchar c; wchar_t *t; if (maxlen < 0 && soap->maxlength > 0) maxlen = soap->maxlength; soap->labidx = 0; if ((soap->mode & SOAP_ENC_LATIN)) { wchar_t *r; if (soap_append_lab(soap, NULL, sizeof(wchar_t) * (strlen(s) + 1))) return NULL; r = (wchar_t*)soap->labbuf; while (*s) *r++ = (wchar_t)*s++; } else { /* Convert UTF8 to wchar_t */ while (*s) { c = (unsigned char)*s++; if (c >= 0x80) { #ifdef WITH_REPLACE_ILLEGAL_UTF8 soap_wchar c1, c2, c3; c1 = (unsigned char)*s; if (c <= 0xC1 || (c1 & 0xC0) != 0x80) { c = SOAP_UNKNOWN_UNICODE_CHAR; } else { ++s; c1 &= 0x3F; if (c < 0xE0) { c = (((c & 0x1F) << 6) | c1); } else { c2 = (unsigned char)*s; if ((c == 0xE0 && c1 < 0x20) || (c2 & 0xC0) != 0x80) { c = SOAP_UNKNOWN_UNICODE_CHAR; } else { ++s; c2 &= 0x3F; if (c < 0xF0) { c = (((c & 0x0F) << 12) | (c1 << 6) | c2); } else { c3 = (unsigned char)*s; if ((c == 0xF0 && c1 < 0x10) || (c == 0xF4 && c1 >= 0x10) || c >= 0xF5 || (c3 & 0xC0) != 0x80) { c = SOAP_UNKNOWN_UNICODE_CHAR; } else { ++s; c = (((c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | (c3 & 0x3F)); } } } } } #else soap_wchar c1, c2, c3, c4; c1 = (unsigned char)*s; if (c1) { s++; c1 &= 0x3F; if (c < 0xE0) { c = (wchar_t)(((soap_wchar)(c & 0x1F) << 6) | c1); } else { c2 = (unsigned char)*s; if (c2) { s++; c2 &= 0x3F; if (c < 0xF0) { c = (wchar_t)(((soap_wchar)(c & 0x0F) << 12) | (c1 << 6) | c2); } else { c3 = (unsigned char)*s; if (c3) { s++; c3 &= 0x3F; if (c < 0xF8) { c = (wchar_t)(((soap_wchar)(c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3); } else { c4 = (unsigned char)*s; if (c4) { s++; c4 &= 0x3F; if (c < 0xFC) { c = (wchar_t)(((soap_wchar)(c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4); } else { c = (wchar_t)(((soap_wchar)(c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (unsigned char)(*s & 0x3F)); if (*s) s++; } } } } } } } } #endif } /* use UTF16 encoding when wchar_t is too small to hold UCS */ if (sizeof(wchar_t) < 4 && c > 0xFFFF) { wchar_t c1, c2; c1 = 0xD800 - (0x10000 >> 10) + (c >> 10); c2 = 0xDC00 + (c & 0x3FF); if (soap_append_lab(soap, (const char*)&c1, sizeof(wchar_t)) || soap_append_lab(soap, (const char*)&c2, sizeof(wchar_t))) return NULL; } else if (soap_append_lab(soap, (const char*)&c, sizeof(wchar_t))) { return NULL; } } } l = soap->labidx / sizeof(wchar_t); c = L'\0'; if (soap_append_lab(soap, (const char*)&c, sizeof(wchar_t))) return NULL; if ((maxlen >= 0 && l > (size_t)maxlen) || (minlen > 0 && l < (size_t)minlen)) { soap->error = SOAP_LENGTH; return NULL; } t = (wchar_t*)soap->labbuf; #ifndef WITH_LEAN if (flag >= 4 && t) t = soap_wcollapse(soap, t, flag, 1); #endif #ifndef WITH_LEANER if (pattern && soap->fwvalidate) { soap->error = soap->fwvalidate(soap, pattern, t); if (soap->error) return NULL; } #endif return t; } return NULL; } #endif /******************************************************************************/ #ifndef WITH_LEAN static wchar_t* soap_wcollapse(struct soap *soap, wchar_t *s, int flag, int insitu) { /* flag 4=normalizedString (replace), 5=token (collapse) */ wchar_t *t; size_t n; if (!s) return NULL; if (flag == 4) { for (t = s; *t && (!soap_coblank((soap_wchar)*t) || *t == 32); t++) continue; if (*t) { /* replace blanks and control char by space */ if (!insitu) s = soap_wstrdup(soap, s); if (s) for (t = s; *t; t++) if (soap_coblank((soap_wchar)*t)) *t = L' '; } return s; } /* collapse white space */ for (t = s; *t && soap_coblank((soap_wchar)*t); t++) continue; n = 0; while (t[n]) n++; if (insitu && s < t) (void)soap_memmove(s, n + 1, t, n + 1); else s = t; if (n > 0) { if (!soap_coblank((soap_wchar)s[n-1])) { for (t = s; (*t && !soap_coblank((soap_wchar)*t)) || (*t == 32 && (!t[1] || !soap_coblank((soap_wchar)t[1]))); t++) continue; if (!*t) return s; } if (!insitu) s = soap_wstrdup(soap, s); if (s) { for (t = s; *t; t++) { if (soap_coblank((soap_wchar)*t)) { wchar_t *r; *t = L' '; for (r = t + 1; *r && soap_coblank((soap_wchar)*r); r++) continue; if (r > t + 1) (void)soap_memmove(t + 1, sizeof(wchar_t) * (n - (t-s)), r, sizeof(wchar_t) * (n - (r-s) + 1)); } } t--; if (t >= s && *t == 32) *t = L'\0'; } } return s; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_wchar2s(struct soap *soap, const wchar_t *s) { soap_wchar c; char *r, *t; const wchar_t *q = s; size_t n = 0; if (!s) return NULL; while ((c = *q++)) { if (c > 0 && c < 0x80) n++; else #ifdef WITH_REPLACE_ILLEGAL_UTF8 n += 4; #else n += 6; #endif } r = t = (char*)soap_malloc(soap, n + 1); if (r) { /* Convert wchar to UTF8 (chars above U+10FFFF are silently converted, but should not be used) */ while ((c = *s++)) { if (c > 0 && c < 0x80) { *t++ = (char)c; } else { /* check for UTF16 encoding when wchar_t is too small to hold UCS */ if (sizeof(wchar_t) < 4 && (c & 0xFC00) == 0xD800) { soap_wchar d = *s; if ((d & 0xFC00) == 0xDC00) { c = ((c - 0xD800) << 10) + (d - 0xDC00) + 0x10000; s++; } #ifdef WITH_REPLACE_ILLEGAL_UTF8 else { c = SOAP_UNKNOWN_UNICODE_CHAR; /* Malformed UTF-16 */ } #endif } if (c < 0x0800) { *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); } else { #ifdef WITH_REPLACE_ILLEGAL_UTF8 if (!((c >= 0x80 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD) || (c >= 0x10000 && c <= 0x10FFFF))) c = SOAP_UNKNOWN_UNICODE_CHAR; #endif 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 /******************************************************************************/ 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, NULL); 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; } /******************************************************************************/ 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, const char *pattern) { (void)type; 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) { p = (char**)soap_malloc(soap, sizeof(char*)); if (!p) return NULL; } if (soap->null) { *p = NULL; } else if (soap->body) { *p = soap_string_in(soap, flag, minlen, maxlen, pattern); if (!*p || !(char*)soap_id_enter(soap, soap->id, *p, t, sizeof(char*), NULL, 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->href != '#') { if (minlen > 0) { soap->error = SOAP_LENGTH; return NULL; } *p = soap_strdup(soap, SOAP_STR_EOS); if (!*p) return NULL; } if (*soap->href == '#') p = (char**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(char**), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } /******************************************************************************/ #ifndef WITH_LEANER 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, NULL); 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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 wchar_t ** SOAP_FMAC2 soap_inwstring(struct soap *soap, const char *tag, wchar_t **p, const char *type, int t, int flag, long minlen, long maxlen, const char *pattern) { (void)type; 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) { p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*)); if (!p) return NULL; } if (soap->null) { *p = NULL; } else if (soap->body) { *p = soap_wstring_in(soap, flag, minlen, maxlen, pattern); if (!*p || !(wchar_t*)soap_id_enter(soap, soap->id, *p, t, sizeof(wchar_t*), NULL, 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->href != '#') { if (minlen > 0) { soap->error = SOAP_LENGTH; return NULL; } *p = soap_wstrdup(soap, L""); } if (*soap->href == '#') p = (wchar_t**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(wchar_t**), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef WITH_LEAN #ifdef UNDER_CE /* WinCE mktime (based on the mingw-runtime, public domain) */ #define __FILETIME_to_ll(f) ((long long)(f).dwHighDateTime << 32 | (long long)(f).dwLowDateTime) static time_t mktime(struct tm *pt) { SYSTEMTIME s, s1, s2; FILETIME f, f1, f2; long long diff; GetSystemTime(&s1); GetLocalTime(&s2); SystemTimeToFileTime(&s1, &f1); SystemTimeToFileTime(&s2, &f2); diff = (__FILETIME_to_ll(f2) - __FILETIME_to_ll(f1)) / 10000000LL; s.wYear = pt->tm_year + 1900; s.wMonth = pt->tm_mon + 1; s.wDayOfWeek = pt->tm_wday; s.wDay = pt->tm_mday; s.wHour = pt->tm_hour; s.wMinute = pt->tm_min; s.wSecond = pt->tm_sec; s.wMilliseconds = 0; SystemTimeToFileTime(&s, &f); return (time_t)((__FILETIME_to_ll(f) - 116444736000000000LL) / 10000000LL) - (time_t)diff; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN #ifdef UNDER_CE /* WinCE gmtime_r (based on the mingw-runtime, public domain) */ #define HAVE_GMTIME_R static struct tm* gmtime_r(const time_t *t, struct tm *pt) { FILETIME f, f1, f2; SYSTEMTIME s, s1 = {0}; long long time = (long long)(*t) * 10000000LL + 116444736000000000LL; f.dwHighDateTime = (DWORD)((time >> 32) & 0x00000000FFFFFFFF); f.dwLowDateTime = (DWORD)(time & 0x00000000FFFFFFFF); FileTimeToSystemTime(&f, &s); pt->tm_year = s.wYear - 1900; pt->tm_mon = s.wMonth - 1; pt->tm_wday = s.wDayOfWeek; pt->tm_mday = s.wDay; s1.wYear = s.wYear; s1.wMonth = 1; s1.wDayOfWeek = 1; s1.wDay = 1; SystemTimeToFileTime(&s1, &f1); SystemTimeToFileTime(&s, &f2); pt->tm_yday = (((__FILETIME_to_ll(f2) - __FILETIME_to_ll(f1)) / 10000000LL) / (60 * 60 * 24)); pt->tm_hour = s.wHour; pt->tm_min = s.wMinute; pt->tm_sec = s.wSecond; pt->tm_isdst = 0; return pt; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN #ifdef UNDER_CE /* WinCE very simple strftime for format "%Y-%m-%dT%H:%M:%SZ", note: %F and %T not supported by MS */ static size_t strftime(char *buf, size_t len, const char *format, const struct tm *pT) { (void)len; (void)format; #ifndef WITH_NOZONE (SOAP_SNPRINTF(buf, len, 20), "%04d-%02d-%02dT%02d:%02d:%02dZ", pT->tm_year + 1900, pT->tm_mon + 1, pT->tm_mday, pT->tm_hour, pT->tm_min, pT->tm_sec); #else (SOAP_SNPRINTF(buf, len, 20), "%04d-%02d-%02dT%02d:%02d:%02d", pT->tm_year + 1900, pT->tm_mon + 1, pT->tm_mday, pT->tm_hour, pT->tm_min, pT->tm_sec); #endif return len; } #endif #endif /******************************************************************************/ #if !defined(WITH_LEAN) || defined(WITH_COOKIES) 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; #ifndef HAVE_GMTIME_R struct tm *tp; #endif t = mktime(T); if (t == (time_t)-1) return (time_t)-1; #ifdef HAVE_GMTIME_R if (gmtime_r(&t, &tm) == SOAP_FUNC_R_ERR) return (time_t)-1; #else tp = gmtime(&t); if (!tp) return (time_t)-1; tm = *tp; #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; size_t l = 0; #if defined(HAVE_GMTIME_R) && !defined(WITH_NOZONE) if (gmtime_r(&n, pT) != SOAP_FUNC_R_ERR) l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT); #elif defined(HAVE_GMTIME) && !defined(WITH_NOZONE) pT = gmtime(&n); if (pT) l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT); #elif (defined(HAVE_TM_GMTOFF) || defined(HAVE_STRUCT_TM_TM_GMTOFF) || defined(HAVE_STRUCT_TM___TM_GMTOFF)) && !defined(WITH_NOZONE) #if defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) { l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S%z", pT); if (l) { (void)soap_memmove(soap->tmpbuf + 23, sizeof(soap->tmpbuf) - 23, soap->tmpbuf + 22, 3); /* 2000-03-01T02:00:00+0300 */ soap->tmpbuf[22] = ':'; /* 2000-03-01T02:00:00+03:00 */ } } #else pT = localtime(&n); if (pT) { l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S%z", pT); if (l) { (void)soap_memmove(soap->tmpbuf + 23, sizeof(soap->tmpbuf) - 23, soap->tmpbuf + 22, 3); /* 2000-03-01T02:00:00+0300 */ soap->tmpbuf[22] = ':'; /* 2000-03-01T02:00:00+03:00 */ } } #endif #elif defined(HAVE_GETTIMEOFDAY) && !defined(WITH_NOZONE) #if defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) { struct timeval tv; struct timezone tz; memset((void*)&tz, 0, sizeof(tz)); gettimeofday(&tv, &tz); l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); if (l) (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -tz.tz_minuteswest/60+(pT->tm_isdst!=0), abs(tz.tz_minuteswest)%60); } #else pT = localtime(&n); if (pT) { struct timeval tv; struct timezone tz; memset((void*)&tz, 0, sizeof(tz)); gettimeofday(&tv, &tz); l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); if (l) (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -tz.tz_minuteswest/60+(pT->tm_isdst!=0), abs(tz.tz_minuteswest)%60); } #endif #elif defined(HAVE_FTIME) && !defined(WITH_NOZONE) #if defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) { struct timeb t; memset((void*)&t, 0, sizeof(t)); #ifdef __BORLANDC__ ::ftime(&t); #else ftime(&t); #endif l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); if (l) (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60); } #else pT = localtime(&n); if (pT) { struct timeb t; memset((void*)&t, 0, sizeof(t)); #ifdef __BORLANDC__ ::ftime(&t); #else ftime(&t); #endif l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); if (l) (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60); } #endif #elif defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); #else pT = localtime(&n); if (pT) l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); #endif if (!l) soap_strcpy(soap->tmpbuf, sizeof(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) { *p = 0; if (s) { char *t; unsigned long d; struct tm T; if (!*s) return soap->error = SOAP_EMPTY; memset((void*)&T, 0, sizeof(T)); d = soap_strtoul(s, &t, 10); if (*t == '-') { /* YYYY-MM-DD */ T.tm_year = (int)d; T.tm_mon = (int)soap_strtoul(t + 1, &t, 10); T.tm_mday = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* YYYYMMDD */ T.tm_year = (int)(d / 10000); T.tm_mon = (int)(d / 100 % 100); T.tm_mday = (int)(d % 100); } else { return soap->error = SOAP_TYPE; } if (*t == 'T' || ((*t == 't' || *t == ' ') && !(soap->mode & SOAP_XML_STRICT))) { d = soap_strtoul(t + 1, &t, 10); if (*t == ':') { /* Thh:mm:ss */ T.tm_hour = (int)d; T.tm_min = (int)soap_strtoul(t + 1, &t, 10); T.tm_sec = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* Thhmmss */ T.tm_hour = (int)(d / 10000); T.tm_min = (int)(d / 100 % 100); T.tm_sec = (int)(d % 100); } else { return soap->error = SOAP_TYPE; } } if (T.tm_year == 1) T.tm_year = 70; else T.tm_year -= 1900; T.tm_mon--; if (*t == '.') { for (t++; *t; t++) if (*t < '0' || *t > '9') break; } if (*t == ' ' && !(soap->mode & SOAP_XML_STRICT)) t++; if (*t) { #ifndef WITH_NOZONE if (*t == '+' || *t == '-') { int h, m; m = (int)soap_strtol(t, &t, 10); if (*t == ':') { /* +hh:mm */ h = m; m = (int)soap_strtol(t + 1, &t, 10); if (h < 0) m = -m; } else if (!(soap->mode & SOAP_XML_STRICT)) { /* +hhmm */ h = m / 100; m = m % 100; } else { /* +hh */ h = m; m = 0; } if (*t) return soap->error = SOAP_TYPE; 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_hour--; } T.tm_mday += T.tm_hour / 24; T.tm_hour %= 24; if (T.tm_hour < 0) { T.tm_hour += 24; T.tm_mday--; } /* note: day of the month may be out of range, timegm() handles it */ } else if (*t != 'Z') { return soap->error = SOAP_TYPE; } #endif *p = soap_timegm(&T); } else /* no UTC or timezone, so assume we got a localtime */ { T.tm_isdst = -1; *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), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2dateTime(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (time_t*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(time_t), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_outliteral(struct soap *soap, const char *tag, char *const*p, const char *type) { if (tag && *tag != '-') if (soap_element_begin_out(soap, tag, 0, type)) return soap->error; if (p && *p) if (soap_send(soap, *p)) /* send as-is */ return soap->error; if (tag && *tag != '-') return soap_element_end_out(soap, tag); return SOAP_OK; } /******************************************************************************/ 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_peek(soap) == SOAP_TT) return NULL; soap->error = SOAP_OK; } if (!p) { p = (char**)soap_malloc(soap, sizeof(char*)); if (!p) return NULL; } if (soap->body || (tag && *tag == '-')) { if (tag && *tag != '-') *p = soap_string_in(soap, -1, -1, -1, NULL); else *p = soap_string_in(soap, 0, -1, -1, NULL); 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; } /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_outwliteral(struct soap *soap, const char *tag, wchar_t *const*p, const char *type) { if (tag && *tag != '-') if (soap_element_begin_out(soap, tag, 0, type)) return soap->error; if (p) { wchar_t c; const wchar_t *s = *p; while ((c = *s++)) { if (soap_pututf8(soap, (unsigned long)c)) /* send as-is in UTF8 */ return soap->error; } } if (tag && *tag != '-') return soap_element_end_out(soap, tag); return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER 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_peek(soap) == SOAP_TT) return NULL; soap->error = SOAP_OK; } if (!p) { p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*)); if (!p) return NULL; } if (soap->body) { if (tag && *tag != '-') *p = soap_wstring_in(soap, -1, -1, -1, NULL); else *p = soap_wstring_in(soap, 0, -1, -1, NULL); 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, L""); } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ SOAP_FMAC1 const char * SOAP_FMAC2 soap_value(struct soap *soap) { size_t i; soap_wchar c = 0; char *s = soap->tmpbuf; if (!soap->body) return SOAP_STR_EOS; do { c = soap_get(soap); } while (soap_coblank(c)); for (i = 0; i < sizeof(soap->tmpbuf) - 1; i++) { if (c == SOAP_TT || c == SOAP_LT || (int)c == EOF) break; *s++ = (char)c; c = soap_get(soap); } for (s--; i > 0; i--, s--) { if (!soap_coblank((soap_wchar)*s)) break; } s[1] = '\0'; soap->tmpbuf[sizeof(soap->tmpbuf) - 1] = '\0'; /* appease */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element content value='%s'\n", soap->tmpbuf)); if (c == SOAP_TT || c == SOAP_LT || (int)c == EOF) { soap_unget(soap, c); } else { soap->error = SOAP_LENGTH; return NULL; } #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_strdup(soap, soap->tmpbuf); if (!soap->dom->text) return NULL; } #endif return soap->tmpbuf; /* return non-null pointer */ } /******************************************************************************/ #if !defined(WITH_LEANER) || !defined(WITH_NOHTTP) SOAP_FMAC1 int SOAP_FMAC2 soap_getline(struct soap *soap, char *buf, int len) { char *s = buf; int i = len; soap_wchar c = 0; for (;;) { while (i > 1) { c = soap_getchar(soap); if (c == '\r' || c == '\n') break; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; *s++ = (char)c; i--; } *s = '\0'; if (c != '\n') c = soap_getchar(soap); /* got \r or something else, now get \n */ if (c == '\n') { if (i == 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_CHK_EOF; } else if (i <= 1) { return soap->error = SOAP_HDR; } } return SOAP_OK; } #endif /******************************************************************************/ static ULONG64 soap_count_attachments(struct soap *soap) { #ifndef WITH_LEANER struct soap_multipart *content; ULONG64 count = soap->count; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the message size with attachments, current count=" SOAP_ULONG_FORMAT "\n", 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) { 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) { 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=" SOAP_ULONG_FORMAT "\n", count)); return count; #else return soap->count; #endif } /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER 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); soap_strcpy(s + 4, n + 1, option); } } return s; } #endif /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER 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)) != NULL || 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_PLAIN) || (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); bufsize = soap->fdimeread(soap, handle, soap->tmpbuf, bufsize); if (!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_CHK_EOF; break; } if (soap_send_raw(soap, soap->tmpbuf, bufsize)) break; size -= bufsize; } while (size); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadclose\n")); if (soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime.size&3)) return soap->error; } 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 /******************************************************************************/ #ifndef WITH_LEANER static char * soap_getdimefield(struct soap *soap, size_t n) { char *p = NULL; if (n > 0) { p = (char*)soap_malloc(soap, n + 1 > n ? n + 1 : n); if (p) { char *s = p; size_t i; for (i = n; i > 0; i--) { soap_wchar c = soap_get1(soap); if ((int)c == EOF) { soap->error = SOAP_CHK_EOF; return NULL; } *s++ = (char)c; } if (n + 1 > n) *s = '\0'; /* force NUL terminated */ soap->error = soap_move(soap, (size_t)(-(long)n&3)); if (soap->error) return NULL; } else { soap->error = SOAP_EOM; } } return p; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_getdimehdr(struct soap *soap) { soap_wchar c; char *s; 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")); s = (char*)tmp; for (i = 12; i > 0; i--) { c = soap_getchar(soap); if ((int)c == EOF) return soap->error = SOAP_CHK_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 = ((size_t)tmp[8] << 24) | ((size_t)tmp[9] << 16) | ((size_t)tmp[10] << 8) | ((size_t)tmp[11]); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME size=%lu flags=0x%X\n", (unsigned long)soap->dime.size, soap->dime.flags)); soap->dime.options = soap_getdimefield(soap, optlen); if (!soap->dime.options && soap->error) return soap->error; soap->dime.id = soap_getdimefield(soap, idlen); if (!soap->dime.id && soap->error) return soap->error; soap->dime.type = soap_getdimefield(soap, typelen); if (!soap->dime.type && soap->error) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME flags=%x id='%s', type='%s', options='%s'\n", soap->dime.flags, 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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_getdime(struct soap *soap) { if (soap->dime.buflen || soap->dime.chunksize) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Skip remainder of SOAP in DIME (%u bytes or %u bytes in chunk left)\n", (unsigned int)soap->dime.buflen, (unsigned int)soap->dime.chunksize)); do if (soap_get1(soap) == (int)EOF) return soap->error = SOAP_CHK_EOF; while (soap->dime.buflen || soap->dime.chunksize); if (soap_move(soap, (size_t)(-(long)soap->dime.size&3))) return soap->error = SOAP_CHK_EOF; if (!(soap->mode & SOAP_ENC_DIME)) return SOAP_OK; } else { if (soap_move(soap, (size_t)(((soap->dime.size+3)&(~3)) - soap_tell(soap)))) return soap->error = SOAP_CHK_EOF; } for (;;) { 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)) != NULL || 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; soap->error = soap->fdimewrite(soap, (void*)soap->dime.ptr, soap->buf + soap->bufidx, n); if (soap->error) break; size -= n; if (!size) { soap->bufidx += n; break; } if (soap_recv(soap)) { soap->error = SOAP_EOF; goto end; } } if (soap_move(soap, (size_t)(-(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_alloc_block(soap) == NULL) return soap->error = SOAP_EOM; for (;;) { soap_wchar c; size_t i; char *s; if (soap->dime.size > SOAP_MAXDIMESIZE) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME size=%lu exceeds SOAP_MAXDIMESIZE=%lu\n", (unsigned long)soap->dime.size, (unsigned long)SOAP_MAXDIMESIZE)); return soap->error = SOAP_DIME_ERROR; } 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--) { c = soap_get1(soap); if ((int)c == EOF) return soap->error = SOAP_EOF; *s++ = (char)c; } if (soap_move(soap, (size_t)(-(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; if (soap->dime.size + 1 > soap->dime.size) soap->blist->size++; /* allocate one more byte in blist for the terminating '\0' */ soap->dime.ptr = soap_save_block(soap, NULL, NULL, 0); if (!soap->dime.ptr) return soap->error; if (soap->dime.size + 1 > soap->dime.size) soap->dime.ptr[soap->dime.size] = '\0'; /* make 0-terminated, just in case even though this is binary data */ soap->dime.id = id; soap->dime.type = type; soap->dime.options = options; } else { soap->dime.ptr = soap_getdimefield(soap, soap->dime.size); } content = soap_alloc_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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_getmimehdr(struct soap *soap) { struct soap_multipart *content; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get MIME header\n")); 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_coblank((soap_wchar)*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->mime.boundary) return soap->error = SOAP_EOM; } 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 (;;) { char *key = soap->msgbuf; 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 (!content->id && !soap_tag_cmp(key, "Content-Disposition")) content->id = soap_strdup(soap, soap_http_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, (LONG64)SOAP_MIME_NONE); } if (soap_getline(soap, key, sizeof(soap->msgbuf))) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_getmime(struct soap *soap) { while (soap_recv_mime_attachment(soap, NULL)) continue; return soap->error; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 void SOAP_FMAC2 soap_post_check_mime_attachments(struct soap *soap) { soap->imode |= SOAP_MIME_POSTCHECK; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_check_mime_attachments(struct soap *soap) { if ((soap->mode & SOAP_MIME_POSTCHECK)) return soap_recv_mime_attachment(soap, NULL) != NULL; return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 struct soap_multipart * SOAP_FMAC2 soap_recv_mime_attachment(struct soap *soap, void *handle) { soap_wchar c = 0; size_t i, m = 0; char *s, *t = NULL; struct soap_multipart *content; short flag = 0; if (!(soap->mode & SOAP_ENC_MIME)) return NULL; content = soap->mime.last; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get MIME (%p)\n", (void*)content)); 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)) != NULL || 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_alloc_block(soap) == NULL) { soap->error = SOAP_EOM; return NULL; } for (;;) { if (content->ptr) { s = soap->tmpbuf; } else { s = (char*)soap_push_block(soap, NULL, sizeof(soap->tmpbuf)); if (!s) { 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_getchar(soap); if ((int)c == EOF) { if (content->ptr && soap->fmimewriteclose) soap->fmimewriteclose(soap, (void*)content->ptr); soap->error = SOAP_CHK_EOF; return NULL; } } if (flag || c == '\r') { memset((void*)soap->msgbuf, 0, sizeof(soap->msgbuf)); soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), "\n--"); if (soap->mime.boundary) { if (soap_strncat(soap->msgbuf, sizeof(soap->msgbuf), soap->mime.boundary, sizeof(soap->msgbuf) - 4)) { soap->error = SOAP_MIME_ERROR; return NULL; } } t = soap->msgbuf; do { c = soap_getchar(soap); } while (c == *t++); if ((int)c == EOF) { if (content->ptr && soap->fmimewriteclose) soap->fmimewriteclose(soap, (void*)content->ptr); soap->error = SOAP_CHK_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) { soap->error = soap->fmimewrite(soap, (void*)content->ptr, soap->tmpbuf, i); if (soap->error) break; } } end: 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 { *s = '\0'; /* make 0-terminated, just in case even though this is binary data */ content->size = soap_size_block(soap, NULL, i + 1) - 1; /* last block with '\0' */ 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)) { if (soap->keep_alive == -2) /* special case to keep alive */ soap->keep_alive = 0; soap_closesock(soap); return NULL; } } else { while (c != '\r' && (int)c != EOF && soap_coblank(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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_match_cid(struct soap *soap, const char *s, const char *t) { 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; (void)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 /******************************************************************************/ /* return UUID "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx" in a temporary buffer */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_rand_uuid(struct soap *soap, const char *prefix) { int r1, r2, r3, r4; #ifdef WITH_OPENSSL r1 = soap_random; r2 = soap_random; #else size_t i; static int k = 0xFACEB00C; int lo = k % 127773; int hi = k / 127773; # if defined(HAVE_GETTIMEOFDAY) struct timeval tv; gettimeofday(&tv, NULL); r1 = 10000000 * tv.tv_sec + tv.tv_usec; # elif defined(UNDER_CE) r1 = (int)Random(); # elif !defined(WITH_LEAN) r1 = (int)time(NULL); # else r1 = k; # endif k = 16807 * lo - 2836 * hi; if (k <= 0) k += 0x7FFFFFFF; r2 = k; /* k &= 0x8FFFFFFF; */ for (i = 0; i < (sizeof(soap->buf) < 16UL ? sizeof(soap->buf) : 16UL); i++) r2 += soap->buf[i]; #endif r3 = soap_random; r4 = soap_random; (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), prefix ? strlen(prefix) + 37 : 37), "%s%8.8x-%4.4hx-4%3.3hx-%4.4hx-%4.4hx%8.8x", prefix ? prefix : SOAP_STR_EOS, r1, (short)(r2 >> 16), (short)(((short)r2 >> 4) & 0x0FFF), (short)(((short)(r3 >> 16) & 0x3FFF) | 0x8000), (short)r3, r4); return soap->tmpbuf; } /******************************************************************************/ #ifndef WITH_LEANER static void soap_resolve_attachment(struct soap *soap, struct soap_multipart *content) { if (content->id) { struct soap_xlist **xp = &soap->xlist; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving attachment data for id='%s'\n", content->id)); while (*xp) { struct soap_xlist *xq = *xp; if (!soap_match_cid(soap, xq->id, content->id)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Found matching attachment id='%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 /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER 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)) != NULL || 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_PLAIN) || (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); bufsize = soap->fmimeread(soap, handle, soap->tmpbuf, bufsize); if (!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 /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER static int soap_begin_attachments(struct soap *soap) { if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary && soap->mime.start) { const char *s; if (strlen(soap->mime.boundary) + strlen(soap->mime.start) + 140 > sizeof(soap->tmpbuf)) return soap->error = SOAP_EOM; 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; charset=utf-8; type=\"text/xml\""; } else { s = "text/xml; charset=utf-8"; } (SOAP_SNPRINTF_SAFE(soap->tmpbuf, sizeof(soap->tmpbuf)), "--%s\r\nContent-Type: %s\r\nContent-Transfer-Encoding: binary\r\nContent-ID: %s\r\n\r\n", soap->mime.boundary, s, soap->mime.start); if (soap_send(soap, soap->tmpbuf)) return soap->error; } if ((soap->mode & SOAP_IO_LENGTH)) soap->dime.size = (size_t)soap->count; /* DIME in MIME correction, soap->count is small */ if (!(soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME)) { if (soap_putdimehdr(soap)) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER static int soap_end_attachments(struct soap *soap) { if ((soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) { if (soap->count > 0xFFFFFFFF) return soap->error = SOAP_DIME_ERROR; soap->dime.size = (size_t)soap->count - soap->dime.size; /* DIME in MIME correction */ (SOAP_SNPRINTF(soap->id, sizeof(soap->id), strlen(soap->dime_id_format) + 20), soap->dime_id_format, 0); soap->dime.id = soap->id; if (soap->local_namespaces && soap->local_namespaces[0].id) { 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); return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER static struct soap_multipart* soap_alloc_multipart(struct soap *soap, struct soap_multipart **first, struct soap_multipart **last, const char *ptr, size_t size) { struct soap_multipart *content; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New DIME/MIME attachment %p (%lu)\n", (void*)ptr, (unsigned long)size)); 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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_set_dime_attachment(struct soap *soap, const char *ptr, size_t size, const char *type, const char *id, unsigned short optype, const char *option) { struct soap_multipart *content = soap_alloc_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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_set_mime_attachment(struct soap *soap, const 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_alloc_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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_next_multipart(struct soap_multipart *content) { if (content) return content->next; return NULL; } #endif /******************************************************************************/ #ifndef WITH_LEANER static void soap_select_mime_boundary(struct soap *soap) { while (!soap->mime.boundary || soap_valid_mime_boundary(soap)) { char *s = soap->mime.boundary; 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; } *s++ = '='; *s++ = '='; n -= 4; while (n) { *s++ = soap_base64o[soap_random & 0x3F]; n--; } *s++ = '='; *s++ = '='; *s = '\0'; } if (!soap->mime.start) soap->mime.start = ""; } #endif /******************************************************************************/ #ifndef WITH_LEANER static int soap_valid_mime_boundary(struct soap *soap) { struct soap_multipart *content; 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) { const char *p = (const char*)content->ptr; 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 /******************************************************************************/ #ifdef WITH_GZIP 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++) { c = soap_get1(soap); if (i == 1 && c == 8) soap->z_dict = 0; if (i == 2) f = c; } if (f & 0x04) /* FEXTRA */ { i = soap_get1(soap); i |= soap_get1(soap) << 8; while (i-- > 0) { if ((int)soap_get1(soap) == EOF) return soap->error = SOAP_ZLIB_ERROR; } } if (f & 0x08) /* skip FNAME */ { do { c = soap_get1(soap); } while (c && (int)c != EOF); } if ((int)c != EOF && (f & 0x10)) /* skip FCOMMENT */ { do { c = soap_get1(soap); } while (c && (int)c != EOF); } if ((int)c != EOF && (f & 0x02)) /* skip FHCRC (CRC32 is used) */ { c = soap_get1(soap); if ((int)c != EOF) c = soap_get1(soap); } if ((int)c == EOF) return soap->error = SOAP_ZLIB_ERROR; return SOAP_OK; } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_begin_serve(struct soap *soap) { #ifdef WITH_FASTCGI if (FCGI_Accept() < 0) { soap->error = SOAP_EOF; return soap_send_fault(soap); } #endif soap_begin(soap); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) { if (soap->error < SOAP_STOP) { #ifdef WITH_FASTCGI (void)soap_send_fault(soap); #else return soap_send_fault(soap); #endif } return soap_closesock(soap); } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_begin_recv(struct soap *soap) { soap_wchar c; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing for input from socket=%d/fd=%d\n", (int)soap->socket, soap->recvfd)); soap->error = SOAP_OK; #ifndef WITH_LEANER soap->recverror = SOAP_OK; #endif 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->imode &= ~SOAP_IO; soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_CHUNK; } soap->imode &= ~(SOAP_ENC_DIME | SOAP_ENC_MIME | SOAP_ENC_MTOM | SOAP_ENC_ZLIB); soap->mode = soap->imode; if (!(soap->mode & SOAP_IO_KEEPALIVE)) soap->keep_alive = 0; if (!soap->keep_alive) soap->buflen = soap->bufidx = 0; soap->null = 0; soap->position = 0; soap->mustUnderstand = 0; soap->shaky = 0; soap->ahead = 0; soap->peeked = 0; soap->level = 0; soap->part = SOAP_BEGIN_RECV; soap->count = 0; soap->length = 0; soap->cdata = 0; *soap->endpoint = '\0'; soap->action = NULL; soap->header = NULL; soap->fault = NULL; soap->status = 0; soap->fform = NULL; soap->body = 1; #ifndef WITH_LEANER soap->dom = NULL; soap->dime.count = 0; 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) && !soap->is && soap->recvfd >= 0) /* Set win32 stdin or soap->recvfd to BINARY, e.g. to support DIME */ #ifdef __BORLANDC__ setmode(soap->recvfd, _O_BINARY); #else _setmode(soap->recvfd, _O_BINARY); #endif #endif #endif #endif #ifdef WITH_ZLIB soap->zlib_in = SOAP_ZLIB_NONE; soap->zlib_out = SOAP_ZLIB_NONE; if (!soap->d_stream) { soap->d_stream = (z_stream*)SOAP_MALLOC(soap, sizeof(z_stream)); if (!soap->d_stream) return soap->error = SOAP_EOM; soap->d_stream->zalloc = Z_NULL; soap->d_stream->zfree = Z_NULL; soap->d_stream->opaque = Z_NULL; soap->d_stream->next_in = Z_NULL; soap->d_stream->msg = Z_NULL; } soap->d_stream->avail_in = 0; soap->d_stream->next_out = (Byte*)soap->buf; soap->d_stream->avail_out = sizeof(soap->buf); soap->z_ratio_in = 1.0; #endif #ifdef WITH_OPENSSL if (soap->ssl) ERR_clear_error(); #endif #ifndef WITH_LEAN soap->start = (ULONG64)time(NULL); #endif #ifndef WITH_LEANER if (soap->fprepareinitrecv && (soap->error = soap->fprepareinitrecv(soap)) != SOAP_OK) return soap->error; #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; if (soap->z_dict) { if (inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != 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, sizeof(soap->buf)); (void)soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)soap->buf, sizeof(soap->buf)); /* 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 = (unsigned int)(soap->buflen - soap->bufidx); soap->z_buflen = soap->buflen; soap->buflen = soap->bufidx; c = ' '; } #endif while (soap_coblank(c)) c = soap_getchar(soap); #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 { /* skip BOM */ if (c == 0xEF && soap_get0(soap) == 0xBB) { soap_get1(soap); c = soap_get1(soap); if (c == 0xBF) { soap->mode &= ~SOAP_ENC_LATIN; c = soap_getchar(soap); } else { c = (0x0F << 12) | (0xBB << 6) | (c & 0x3F); /* UTF-8 */ } } else if ((c == 0xFE && soap_get0(soap) == 0xFF) /* UTF-16 BE */ || (c == 0xFF && soap_get0(soap) == 0xFE)) /* UTF-16 LE */ { return soap->error = SOAP_UTF_ERROR; } /* skip space */ while (soap_coblank(c)) c = soap_getchar(soap); } if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; soap_unget(soap, c); #ifndef WITH_NOHTTP /* if not XML/MIME/DIME/ZLIB, assume HTTP method or status line */ if (((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) && !(soap->mode & (SOAP_ENC_MIME | SOAP_ENC_DIME | SOAP_ENC_ZLIB | SOAP_ENC_PLAIN))) { soap_mode m = soap->imode; soap->error = soap->fparse(soap); soap->mode = soap->imode; /* if imode is changed, effectuate */ soap->imode = m; /* restore imode */ if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { soap->chunkbuflen = soap->buflen; soap->buflen = soap->bufidx; soap->chunksize = 0; } #ifdef WITH_ZLIB soap->mode &= ~SOAP_ENC_ZLIB; if (soap->zlib_in != SOAP_ZLIB_NONE) { #ifdef WITH_GZIP if (soap->zlib_in != SOAP_ZLIB_DEFLATE) { c = soap_get1(soap); if (c == (int)EOF) return soap->error = SOAP_EOF; 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; if (soap->z_dict) { if (inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != 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, sizeof(soap->buf)); (void)soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)soap->buf, sizeof(soap->buf)); soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx); soap->d_stream->avail_in = (unsigned int)(soap->buflen - soap->bufidx); soap->z_buflen = soap->buflen; soap->buflen = soap->bufidx; } #endif #ifndef WITH_LEANER if (soap->fpreparerecv && (soap->mode & SOAP_IO) != SOAP_IO_CHUNK && soap->buflen > soap->bufidx) { int r; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Invoking fpreparerecv\n")); r = soap->fpreparerecv(soap, soap->buf + soap->bufidx, soap->buflen - soap->bufidx); if (r) return soap->error = r; } #endif if (soap->error && soap->error < SOAP_STOP) { if (soap->status >= 200 && soap->status < 600) { const char *s = soap_http_get_body(soap, NULL); (void)soap_end_recv(soap); if (soap->status >= 300) soap->keep_alive = 0; /* to force close */ return soap_set_receiver_error(soap, "HTTP Error", s, soap->status); } return soap->error; } if (!soap->body && soap->status >= 200 && soap->status < 600) return soap->error = soap->status; /* client side received HTTP status code */ if (soap->status > SOAP_POST) { soap->fform = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Invoking http method handler\n")); switch (soap->status) { case SOAP_GET: if (soap_http_skip_body(soap) || soap_end_recv(soap)) return soap->error; soap->error = soap->fget(soap); break; case SOAP_PUT: soap->error = soap->fput(soap); break; case SOAP_PATCH: soap->error = soap->fpatch(soap); break; case SOAP_DEL: if (soap_http_skip_body(soap) || soap_end_recv(soap)) return soap->error; soap->error = soap->fdel(soap); break; case SOAP_HEAD: if (soap_http_skip_body(soap) || soap_end_recv(soap)) return soap->error; soap->error = soap->fhead(soap); break; case SOAP_OPTIONS: if (soap_http_skip_body(soap) || soap_end_recv(soap)) return soap->error; soap->error = soap->fopt(soap); break; default: if (soap_http_skip_body(soap) || soap_end_recv(soap)) return soap->error; return 405; } if (soap->error == SOAP_OK) return soap->error = SOAP_STOP; /* prevents further processing */ if (soap->error != SOAP_FORM || !soap->fform) /* continue if handler returned SOAP_FORM */ return soap->error; soap->error = SOAP_OK; } if (soap->fform) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Invoking http form handler\n")); soap->error = soap->fform(soap); if (soap->error == SOAP_OK) return soap->error = SOAP_STOP; /* prevents further processing */ if (soap->status != SOAP_POST || soap->error != 404) /* continue with POST if handler returned HTTP not found */ return soap->error; soap->error = SOAP_OK; } if (!soap->body) return soap->error = SOAP_NO_DATA; } #endif #ifndef WITH_LEANER if ((soap->mode & SOAP_ENC_MIME)) { do /* skip preamble */ { c = soap_getchar(soap); if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; } while (c != '-' || soap_get0(soap) != '-'); soap_unget(soap, c); 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_recv_mime_attachment(soap, NULL)); } if (soap_http_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 SOAP in DIME 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; if (soap->recv_maxlength && soap->count > soap->recv_maxlength) return soap->error = SOAP_EOF; } #endif return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_out(struct soap *soap) { if (soap->version == 0) return SOAP_OK; soap->part = SOAP_IN_ENVELOPE; return soap_element_begin_out(soap, "SOAP-ENV:Envelope", 0, NULL); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_out(struct soap *soap) { if (soap->version == 0) return SOAP_OK; if (soap_element_end_out(soap, "SOAP-ENV:Envelope") || soap_send_raw(soap, "\r\n", 2)) /* 2.8: always emit \r\n */ return soap->error; soap->part = SOAP_END_ENVELOPE; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_http_has_body(struct soap *soap) { return soap->length || (soap->mode & SOAP_ENC_ZLIB) || (soap->mode & SOAP_IO) == SOAP_IO_CHUNK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_http_skip_body(struct soap *soap) { ULONG64 k = soap->length; /* check HTTP body, return "" if none */ if (!k && !(soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) != SOAP_IO_CHUNK) return SOAP_OK; /* do not consume DIME or MIME attachments, leave this to soap_end_recv */ if ((soap->mode & SOAP_ENC_DIME) || (soap->mode & SOAP_ENC_MIME)) return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Skipping HTTP body (mode=0x%x)\n", soap->mode)); if (k && !(soap->mode & SOAP_ENC_ZLIB)) { size_t i; soap->length = 0; for (i = 0; i < k; i++) { soap_wchar c = soap_get1(soap); if ((int)c == EOF) break; } } else { for (;;) { soap_wchar c = soap_get1(soap); if ((int)c == EOF) break; } } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_http_get_body(struct soap *soap, size_t *len) { return soap_http_get_body_prefix(soap, len, NULL); } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_http_get_form(struct soap *soap) { return soap_http_get_body_prefix(soap, NULL, "?"); } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_http_get_body_prefix(struct soap *soap, size_t *len, const char *prefix) { char *s; ULONG64 k = soap->length; size_t n = 0; if (!prefix) prefix = SOAP_STR_EOS; else n = strlen(prefix); if (len) *len = 0; /* check HTTP body, return "" if none */ if (!k && !(soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) != SOAP_IO_CHUNK) return soap_strdup(soap, prefix); /* do not consume DIME or MIME attachments, leave this to soap_end_recv */ if ((soap->mode & SOAP_ENC_DIME) || (soap->mode & SOAP_ENC_MIME)) return soap_strdup(soap, prefix); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Parsing HTTP body, prefixed with '%s' (mode=0x%x)\n", prefix, soap->mode)); if (k && !(soap->mode & SOAP_ENC_ZLIB)) { char *t; soap->length = 0; /* http content length != 0 and uncompressed body */ if ((SOAP_MAXALLOCSIZE != 0 && n + k > SOAP_MAXALLOCSIZE) || n + k > (ULONG64)((size_t)-2)) { soap->error = SOAP_EOM; return NULL; } s = t = (char*)soap_malloc(soap, (size_t)k + n + 1); if (s) { size_t i; soap_strcpy(t, n + 1, prefix); t += n; for (i = 0; i < k; i++) { soap_wchar c = soap_get1(soap); if ((int)c == EOF) break; *t++ = (char)(c & 0xFF); } *t = '\0'; if (len) *len = n + i; } else { soap->error = SOAP_EOM; return NULL; } } else { size_t i, l = 0; if (soap_alloc_block(soap) == NULL) return NULL; if (n) { s = (char*)soap_push_block(soap, NULL, n); if (!s) return NULL; soap_strcpy(s, n + 1, prefix); l += n; } for (;;) { size_t k = SOAP_BLKLEN; s = (char*)soap_push_block(soap, NULL, k); if (!s) return NULL; for (i = 0; i < k; i++) { soap_wchar c; l++; if (l == 0) { soap->error = SOAP_EOM; return NULL; } c = soap_get1(soap); if ((int)c == EOF) goto end; *s++ = (char)(c & 0xFF); } } end: *s = '\0'; if (len) *len = l - 1; soap_size_block(soap, NULL, i + 1); s = soap_save_block(soap, NULL, NULL, 0); } return s; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_in(struct soap *soap) { soap->part = SOAP_IN_ENVELOPE; if (soap_element_begin_in(soap, "SOAP-ENV:Envelope", 0, NULL)) { if (soap->error == SOAP_TAG_MISMATCH) { if (!soap_element_begin_in(soap, "Envelope", 0, NULL)) soap->error = SOAP_VERSIONMISMATCH; else if (soap->status == 0 || (soap->status >= 200 && soap->status <= 299) || soap->status == 400 || soap->status == 500) return SOAP_OK; /* allow non-SOAP (REST) XML content to be captured */ soap->error = soap->status; } else if (soap->status) { soap->error = soap->status; } return soap->error; } soap_version(soap); return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_in(struct soap *soap) { if (soap->version == 0) return SOAP_OK; soap->part = SOAP_END_ENVELOPE; return soap_element_end_in(soap, "SOAP-ENV:Envelope"); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_out(struct soap *soap) { if (soap->version == 1) soap->encoding = 1; #ifndef WITH_LEAN if ((soap->mode & SOAP_SEC_WSUID) && soap_set_attr(soap, "wsu:Id", "Body", 1)) return soap->error; #endif if (soap->version == 0) return SOAP_OK; soap->part = SOAP_IN_BODY; return soap_element_begin_out(soap, "SOAP-ENV:Body", 0, NULL); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_out(struct soap *soap) { if (soap->version == 0) return SOAP_OK; if (soap_element_end_out(soap, "SOAP-ENV:Body")) return soap->error; soap->part = SOAP_END_BODY; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_in(struct soap *soap) { if (soap->version == 0) return SOAP_OK; 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; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_in(struct soap *soap) { if (soap->version == 0) return SOAP_OK; if (soap->part == SOAP_NO_BODY) return soap->error = SOAP_OK; soap->part = SOAP_END_BODY; return soap_element_end_in(soap, "SOAP-ENV:Body"); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_recv_header(struct soap *soap) { if (soap_getheader(soap) && soap->error == SOAP_TAG_MISMATCH) soap->error = SOAP_OK; if (soap->error == SOAP_OK && soap->fheader) soap->error = soap->fheader(soap); return soap->error; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_endpoint(struct soap *soap, const char *endpoint) { const char *s, *t; 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 soap_strcpy(soap->endpoint, sizeof(soap->endpoint), endpoint); s = strchr(endpoint, ':'); if (s && s[1] == '/' && s[2] == '/') s += 3; else s = endpoint; #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) t = strchr(s, '@'); if (t && *s != ':' && *s != '@') { size_t l = t - s + 1; char *r = (char*)soap_malloc(soap, l); n = s - endpoint; if (r) { s = soap_decode(r, l, s, ":@"); soap->userid = r; soap->passwd = SOAP_STR_EOS; if (*s == ':') { s++; if (*s != '@') { l = t - s + 1; r = r + strlen(r) + 1; s = soap_decode(r, l, s, "@"); soap->passwd = r; } } } s++; soap_strcpy(soap->endpoint + n, sizeof(soap->endpoint) - n, s); } #endif 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] == ':' || s[i] == '?') break; } } #else for (i = 0; i < n; i++) { soap->host[i] = s[i]; if (s[i] == '/' || s[i] == ':' || s[i] == '?') break; } #endif soap->host[i] = '\0'; if (s[i] == ':') { soap->port = (int)soap_strtol(s + i + 1, NULL, 10); for (i++; i < n; i++) if (s[i] == '/') break; } if (i < n && s[i]) soap_strcpy(soap->path, sizeof(soap->path), s + i); if (soap->override_host && *soap->override_host) { soap_strcpy(soap->host, sizeof(soap->host), soap->override_host); if (soap->override_port) soap->port = soap->override_port; } if (soap->userid && !soap->authrealm) soap->authrealm = soap->host; } /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_GET(struct soap *soap, const char *endpoint, const char *action) { return soap_connect_command(soap, SOAP_GET, endpoint, action); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_PUT(struct soap *soap, const char *endpoint, const char *action, const char *type) { soap->http_content = type; if ((soap->omode & SOAP_IO) != SOAP_IO_CHUNK) { soap->omode &= ~SOAP_IO; soap->omode |= SOAP_IO_STORE; } return soap_connect_command(soap, SOAP_PUT, endpoint, action); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_POST(struct soap *soap, const char *endpoint, const char *action, const char *type) { soap->http_content = type; if ((soap->omode & SOAP_IO) != SOAP_IO_CHUNK) { soap->omode &= ~SOAP_IO; soap->omode |= SOAP_IO_STORE; } return soap_connect_command(soap, SOAP_POST_FILE, endpoint, action); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_PATCH(struct soap *soap, const char *endpoint, const char *action, const char *type) { soap->http_content = type; if ((soap->omode & SOAP_IO) != SOAP_IO_CHUNK) { soap->omode &= ~SOAP_IO; soap->omode |= SOAP_IO_STORE; } return soap_connect_command(soap, SOAP_PATCH, endpoint, action); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_DELETE(struct soap *soap, const char *endpoint) { if (soap_connect_command(soap, SOAP_DEL, endpoint, NULL) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } #endif /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_connect_command(struct soap *soap, int http_command, const char *endpoints, const char *action) { if (endpoints) { int retry = soap->connect_retry; unsigned int backoff = 1; for (;;) { struct timeval tv; const char *s; s = strchr(endpoints, ' '); if (s) { size_t l = strlen(endpoints); char *endpoint = NULL; if (SOAP_MAXALLOCSIZE == 0 || l <= SOAP_MAXALLOCSIZE) endpoint = (char*)SOAP_MALLOC(soap, l + 1); if (!endpoint) return soap->error = SOAP_EOM; for (;;) { (void)soap_strncpy(endpoint, l + 1, endpoints, s - endpoints); endpoint[s - endpoints] = '\0'; if (soap_try_connect_command(soap, http_command, endpoint, action) != SOAP_TCP_ERROR) break; while (*s == ' ') s++; if (!*s) break; soap->error = SOAP_OK; 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); } if (soap->error != SOAP_TCP_ERROR || retry <= 0) break; soap->error = SOAP_OK; tv.tv_sec = backoff; tv.tv_usec = 0; select(0, NULL, NULL, NULL, &tv); if (backoff < 32) backoff *= 2; --retry; } } return soap->error; } /******************************************************************************/ 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; ULONG64 count; soap->error = SOAP_OK; (void)soap_memcpy(host, sizeof(host), soap->host, sizeof(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); soap->action = soap_strdup(soap, action); #ifndef WITH_LEANER if (soap->fconnect) { soap->error = soap->fconnect(soap, endpoint, soap->host, soap->port); if (soap->error) 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->error = SOAP_OK; #ifndef WITH_LEAN if (!strncmp(endpoint, "soap.udp:", 9) || !strncmp(endpoint, "udp:", 4)) { soap->omode |= SOAP_IO_UDP; } else #endif { 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 '%s' host='%s' path='%s' port=%d\n", endpoint?endpoint:"(null)", soap->host, soap->path, soap->port)); if (!soap->keep_alive || !soap_valid_socket(soap->socket)) { soap->socket = soap->fopen(soap, endpoint, soap->host, soap->port); if (!soap_valid_socket(soap->socket) || soap->error) { if (soap->error) return soap->error; return soap->error = SOAP_TCP_ERROR; } soap->keep_alive = -((soap->omode & SOAP_IO_KEEPALIVE) != 0); } } } #ifdef WITH_NTLM if (soap_ntlm_handshake(soap, SOAP_GET, endpoint, soap->host, soap->port)) return soap->error; #endif count = soap_count_attachments(soap); if (soap_init_send(soap)) return soap->error; #ifndef WITH_NOHTTP if (http_command == SOAP_GET || http_command == SOAP_DEL || http_command == SOAP_HEAD || http_command == SOAP_OPTIONS) { soap->mode &= ~SOAP_IO; soap->mode |= SOAP_IO_BUFFER; } if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_PLAIN) && endpoint) { soap_mode k = soap->mode; soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB); if ((k & SOAP_IO) != SOAP_IO_FLUSH) soap->mode |= SOAP_IO_BUFFER; soap->error = soap->fpost(soap, endpoint, soap->host, soap->port, soap->path, action, count); if (soap->error) return soap->error; if ((k & SOAP_IO) == SOAP_IO_CHUNK) { if (soap_flush(soap)) return soap->error; } soap->mode = k; } if (http_command == SOAP_GET || http_command == SOAP_DEL || http_command == SOAP_HEAD || http_command == SOAP_OPTIONS) return soap_end_send_flush(soap); #endif #ifndef WITH_LEANER if (soap_begin_attachments(soap)) return soap->error; #endif return SOAP_OK; } /******************************************************************************/ #ifdef WITH_NTLM static int soap_ntlm_handshake(struct soap *soap, int command, const char *endpoint, const char *host, int port) { /* requires libntlm from http://www.nongnu.org/libntlm/ */ const char *userid = (soap->proxy_userid ? soap->proxy_userid : soap->userid); const char *passwd = (soap->proxy_passwd ? soap->proxy_passwd : soap->passwd); struct SOAP_ENV__Header *oldheader; if (soap->ntlm_challenge && userid && passwd && soap->authrealm) { tSmbNtlmAuthRequest req; tSmbNtlmAuthResponse res; tSmbNtlmAuthChallenge ch; int k = soap->keep_alive; ULONG64 l = soap->length; ULONG64 c = soap->count; soap_mode m = soap->mode, o = soap->omode; int s = soap->status; char *a = soap->action; short v = soap->version; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM '%s'\n", soap->ntlm_challenge)); if (!*soap->ntlm_challenge) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM S->C Type 1: received NTLM authentication challenge from server\n")); /* S -> C 401 Unauthorized WWW-Authenticate: NTLM */ buildSmbNtlmAuthRequest(&req, userid, soap->authrealm); soap->ntlm_challenge = soap_s2base64(soap, (unsigned char*)(void*)&req, NULL, SmbLength(&req)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM C->S Type 2: sending NTLM authorization to server\nAuthorization: NTLM %s\n", soap->ntlm_challenge)); /* C -> S GET ... Authorization: NTLM TlRMTVNTUAABAAAAA7IAAAoACgApAAAACQAJACAAAABMSUdIVENJVFlVUlNBLU1JTk9S */ soap->omode = SOAP_IO_BUFFER; if (soap_init_send(soap)) return soap->error; if (!soap->keep_alive) soap->keep_alive = -1; /* client keep alive */ soap->status = command; if (soap->fpost(soap, endpoint, host, port, soap->path, soap->action, 0) || soap_end_send_flush(soap)) return soap->error; soap->mode = m; soap->keep_alive = k; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM S->C Type 2: waiting on server NTLM response\n")); oldheader = soap->header; if (soap_begin_recv(soap)) if (soap->error == SOAP_EOF) return soap->error; (void)soap_end_recv(soap); soap->header = oldheader; soap->length = l; if (soap->status != 401 && soap->status != 407) return soap->error = SOAP_NTLM_ERROR; soap->error = SOAP_OK; } /* S -> C 401 Unauthorized WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAAAAACgAAAABggAAU3J2Tm9uY2UAAAAAAAAAAA== */ soap_base642s(soap, soap->ntlm_challenge, (char*)&ch, sizeof(tSmbNtlmAuthChallenge), NULL); buildSmbNtlmAuthResponse(&ch, &res, userid, passwd); soap->ntlm_challenge = soap_s2base64(soap, (unsigned char*)(void*)&res, NULL, SmbLength(&res)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM C->S Type 3: sending NTLM authorization to server\nAuthorization: NTLM %s\n", soap->ntlm_challenge)); /* C -> S GET ... Authorization: NTLM TlRMTVNTUAADAAAAGAAYAHIAAAAYABgAigAAABQAFABAAAAADAAMAFQAAAASABIAYAAAAAAAAACiAAAAAYIAAFUAUgBTAEEALQBNAEkATgBPAFIAWgBhAHAAaABvAGQATABJAEcASABUAEMASQBUAFkArYfKbe/jRoW5xDxHeoxC1gBmfWiS5+iX4OAN4xBKG/IFPwfH3agtPEia6YnhsADT */ soap->userid = NULL; soap->passwd = NULL; soap->proxy_userid = NULL; soap->proxy_passwd = NULL; soap->keep_alive = k; soap->length = l; soap->count = c; soap->mode = m; soap->omode = o; soap->status = s; soap->action = a; soap->version = v; } return SOAP_OK; } #endif /******************************************************************************/ SOAP_FMAC1 char* SOAP_FMAC2 soap_s2base64(struct soap *soap, const unsigned char *s, char *t, int n) { int i; unsigned long m; 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) /* 0 < n <= 2 implies that t[0..4] is allocated (base64 scaling formula) */ { m = 0; for (i = 0; i < n; i++) m = (m << 8) | *s++; for (; i < 3; i++) m <<= 8; for (i = 4; i > 0; m >>= 6) t[--i] = soap_base64o[m & 0x3F]; for (i = 3; i > n; i--) t[i] = '='; t[4] = '\0'; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_base642s(struct soap *soap, const char *s, char *t, size_t l, int *n) { size_t i, j; soap_wchar c; unsigned long m; 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 + 1; /* space for raw binary and \0 */ t = (char*)soap_malloc(soap, l); } if (!t) return NULL; p = t; if (n) *n = 0; for (i = 0; ; i += 3, l -= 3) { m = 0; j = 0; while (j < 4) { c = *s++; if (c == '=' || !c) { if (l >= j - 1) { switch (j) { case 2: *t++ = (char)((m >> 4) & 0xFF); i++; l--; break; case 3: *t++ = (char)((m >> 10) & 0xFF); *t++ = (char)((m >> 2) & 0xFF); i += 2; l -= 2; } } if (n) *n = (int)i; if (l) *t = '\0'; 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_coblank(c + '+')) { soap->error = SOAP_TYPE; return NULL; } } if (l < 3) { if (n) *n = (int)i; if (l) *t = '\0'; return p; } *t++ = (char)((m >> 16) & 0xFF); *t++ = (char)((m >> 8) & 0xFF); *t++ = (char)(m & 0xFF); } } /******************************************************************************/ SOAP_FMAC1 char* SOAP_FMAC2 soap_s2hex(struct soap *soap, const unsigned char *s, char *t, int n) { 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--) { 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; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_hex2s(struct soap *soap, const char *s, char *t, size_t l, int *n) { 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 + 1; /* make sure enough space for \0 */ t = (char*)soap_malloc(soap, l); } if (!t) return NULL; p = t; while (l) { int d1, d2; d1 = *s++; if (!d1) break; d2 = *s++; if (!d2) break; *t++ = (char)(((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0')); l--; } if (n) *n = (int)(t - p); if (l) *t = '\0'; return p; } /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 const char * SOAP_FMAC2 soap_http_content_type(struct soap *soap, int status) { if (soap->status != SOAP_GET && soap->status != SOAP_DEL && soap->status != SOAP_CONNECT) { const char *s = "text/xml; charset=utf-8"; #ifndef WITH_LEANER const char *r = NULL; size_t n; #endif if (((status >= SOAP_FILE && status < SOAP_FILE + 600) || soap->status == SOAP_PUT || soap->status == SOAP_POST_FILE || soap->status == SOAP_PATCH) && soap->http_content && *soap->http_content && !strchr(soap->http_content, 10) && !strchr(soap->http_content, 13)) s = soap->http_content; else if (status == SOAP_HTML) s = "text/html; charset=utf-8"; else if (soap->version == 2) s = "application/soap+xml; charset=utf-8"; soap->http_content = NULL; /* use http_content once (assign new value before each call) */ #ifndef WITH_LEANER if (soap->mode & (SOAP_ENC_DIME | SOAP_ENC_MTOM)) { if ((soap->mode & SOAP_ENC_MTOM)) { if (soap->version == 2) r = "application/soap+xml"; else r = "text/xml"; s = "application/xop+xml"; } else { s = "application/dime"; } } if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary) { const char *t; size_t l; (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(soap->mime.boundary) + 53), "multipart/related; charset=utf-8; boundary=\"%s\"; type=\"", soap->mime.boundary); t = strchr(s, ';'); if (t) n = t - s; else n = strlen(s); l = strlen(soap->tmpbuf); if (sizeof(soap->tmpbuf) > l + n) (void)soap_strncpy(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, s, n); if (soap->mime.start) { l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, strlen(soap->mime.start) + 10), "\"; start=\"%s", soap->mime.start); } if (r) { l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, strlen(r) + 15), "\"; start-info=\"%s", r); } l = strlen(soap->tmpbuf); if (sizeof(soap->tmpbuf) > l) soap_strcpy(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, "\""); } else { soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), s); } if (status == SOAP_OK && soap->version == 2 && soap->action) { size_t l = strlen(soap->tmpbuf); n = strlen(soap->action); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, n + 11), "; action=\"%s\"", soap->action); } #else soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), s); #endif return soap->tmpbuf; } return NULL; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_puthttphdr(struct soap *soap, int status, ULONG64 count) { int err = SOAP_OK; if (soap_http_content_type(soap, status)) { err = soap->fposthdr(soap, "Content-Type", soap->tmpbuf); if (err) 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 { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), SOAP_ULONG_FORMAT, count); err = soap->fposthdr(soap, "Content-Length", soap->tmpbuf); } if (err) return err; } if (soap->http_extra_header) { err = soap_send(soap, soap->http_extra_header); soap->http_extra_header = NULL; /* use http_extra_header once (assign new value before each call) */ if (err) return err; err = soap_send_raw(soap, "\r\n", 2); if (err) return err; } if (soap->keep_alive) { if (soap->keep_alive > 0 && soap->recv_timeout) { int t = soap->recv_timeout; if (t < 0) t = 1; (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), "timeout=%d, max=%d", soap->recv_timeout, soap->keep_alive); err = soap->fposthdr(soap, "Keep-Alive", soap->tmpbuf); if (err) return err; } return soap->fposthdr(soap, "Connection", "keep-alive"); } return soap->fposthdr(soap, "Connection", "close"); } #endif /******************************************************************************/ #ifndef WITH_LEAN static const char* soap_set_validation_fault(struct soap *soap, const char *s, const char *t) { if (!t) t = SOAP_STR_EOS; if (*soap->tag) (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(s) + strlen(t) + strlen(soap->tag) + 47), "Validation constraint violation: %s%s in element '%s'", s, t, soap->tag); else (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(s) + strlen(t) + 33), "Validation constraint violation: %s%s", s, t); return soap->msgbuf; } #endif /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_fault(struct soap *soap) { const char **c; const char **s; if (soap->version == 0) soap_version(soap); c = soap_faultcode(soap); s = soap_faultstring(soap); if (soap->fseterror) soap->fseterror(soap, c, s); if (!*c) { if (soap->version == 2) *c = "SOAP-ENV:Sender"; else if (soap->version == 1) *c = "SOAP-ENV:Client"; else *c = ""; } if (*s) return; if (soap->error >= SOAP_POST) soap->error = SOAP_HTTP_METHOD; 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: if (*soap->type) *s = soap_set_validation_fault(soap, "type mismatch ", soap->type); else if (*soap->arrayType) *s = soap_set_validation_fault(soap, "array type mismatch", NULL); else *s = soap_set_validation_fault(soap, "invalid value", NULL); break; case SOAP_SYNTAX_ERROR: *s = soap_set_validation_fault(soap, "syntax error", NULL); break; case SOAP_NO_TAG: if (soap->version == 0 && soap->level == 0) *s = soap_set_validation_fault(soap, "root element expected", NULL); else if (soap->level == 0) *s = soap_set_validation_fault(soap, "SOAP message expected", NULL); else *s = soap_set_validation_fault(soap, "element tag expected", NULL); break; case SOAP_END_TAG: *s = soap_set_validation_fault(soap, "closing tag expected", NULL); break; case SOAP_MUSTUNDERSTAND: *c = "SOAP-ENV:MustUnderstand"; (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(soap->tag) + 65), "The data in element '%s' must be understood but cannot be processed", 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 data access error"; break; case SOAP_NO_METHOD: (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(soap->tag) + 66), "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_PATCH_METHOD: *s = "HTTP PATCH method not implemented"; break; case SOAP_DEL_METHOD: *s = "HTTP DELETE method not implemented"; break; case SOAP_HTTP_METHOD: *s = "HTTP method error"; 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 elements (use the SOAP_XML_TREE flag) with duplicate 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 id-ref ", 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_NTLM_ERROR: *s = "An HTTP NTLM authentication error occurred"; break; case SOAP_SSL_ERROR: #ifdef WITH_OPENSSL *s = "SSL/TLS 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 or max DIME size exceeds SOAP_MAXDIMESIZE currently set to " SOAP_XSTRINGIFY(SOAP_MAXDIMESIZE); 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 (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), (soap->d_stream && soap->d_stream->msg ? strlen(soap->d_stream->msg) : 0) + 19), "Zlib/gzip error: '%s'", soap->d_stream && 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_LEVEL: *s = "Maximum XML nesting depth level exceeded: increase maxlevel"; break; case SOAP_LENGTH: *s = soap_set_validation_fault(soap, "value range or content length violation", NULL); break; case SOAP_OCCURS: *s = soap_set_validation_fault(soap, "occurrence constraint violation", NULL); break; case SOAP_FIXED: *s = soap_set_validation_fault(soap, "value does not match the fixed value required", NULL); break; case SOAP_EMPTY: *s = soap_set_validation_fault(soap, "empty value provided where a value is required", NULL); break; case SOAP_FD_EXCEEDED: *s = "Maximum number of open connections was reached: increase FD_SETSIZE or define HAVE_POLL"; break; case SOAP_UTF_ERROR: *s = "UTF content encoding error"; break; case SOAP_STOP: *s = "Stopped: service request already handled by plugin (informative)"; break; #endif case SOAP_EOF: #ifndef WITH_NOIO *s = soap_strerror(soap); /* *s = soap->msgbuf */ #ifndef WITH_LEAN if (strlen(soap->msgbuf) + 25 < sizeof(soap->msgbuf)) { (void)soap_memmove((void*)(soap->msgbuf + 25), sizeof(soap->tmpbuf) - 25, (const void*)soap->msgbuf, strlen(soap->msgbuf) + 1); if (soap->is) #if defined(__cplusplus) && !defined(WITH_COMPAT) (void)soap_memcpy((void*)soap->msgbuf, sizeof(soap->msgbuf), (const void*)"End or bad std::istream: ", 25); #else (void)soap_memcpy((void*)soap->msgbuf, sizeof(soap->msgbuf), (const void*)"End at NUL buffer input: ", 25); #endif else (void)soap_memcpy((void*)soap->msgbuf, sizeof(soap->msgbuf), (const void*)"End of file or no input: ", 25); } #endif break; #else *s = "End of file or no input"; break; #endif case SOAP_ERR: *s = "An unspecified error occurred"; break; default: #ifndef WITH_NOHTTP #ifndef WITH_LEAN if (soap->error >= 200 && soap->error < 600) { const char *t = http_error(soap, soap->error); (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(t) + 54), "Error %d: HTTP %d %s", soap->error, soap->error, t); *s = soap->msgbuf; } else #endif #endif { (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), 26), "Error %d", soap->error); *s = soap->msgbuf; } } } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_send_fault(struct soap *soap) { int status = soap->error; if (status == SOAP_OK || status == SOAP_STOP) return soap_closesock(soap); #ifndef WITH_NOHTTP if (status >= 200 && status <= 299) return soap_send_empty_response(soap, status); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending back fault struct for error code %d\n", soap->error)); soap->keep_alive = 0; /* error: close connection later by disabling keep-alive here */ soap_set_fault(soap); if (soap->error < 200 && soap->error != SOAP_FAULT) soap->header = NULL; 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)) { r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_SND, 0); if (r > 0) { int t; if (!(r & SOAP_TCP_SELECT_SND) || ((r & SOAP_TCP_SELECT_RCV) && recv(soap->socket, (char*)&t, 1, MSG_PEEK) < 0)) r = 0; } } #endif #endif if (r > 0) { soap->error = SOAP_OK; if (soap->version > 0) { soap->encodingStyle = NULL; /* no encodingStyle in Faults */ soap_serializeheader(soap); soap_serializefault(soap); (void)soap_begin_count(soap); if ((soap->mode & SOAP_IO_LENGTH)) { if (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); } (void)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) || soap_end_send(soap)) return soap_closesock(soap); } else { const char *s = *soap_faultstring(soap); const char **d = soap_faultdetail(soap); (void)soap_begin_count(soap); if ((soap->mode & SOAP_IO_LENGTH)) if (soap_element_begin_out(soap, "fault", 0, NULL) || soap_outstring(soap, "reason", 0, (char*const*)&s, NULL, 0) || soap_outliteral(soap, "detail", (char*const*)d, NULL) || soap_element_end_out(soap, "fault")) return soap_closesock(soap); (void)soap_end_count(soap); if (soap_response(soap, status) || soap_element_begin_out(soap, "fault", 0, NULL) || soap_outstring(soap, "reason", 0, (char*const*)&s, NULL, 0) || soap_outliteral(soap, "detail", (char*const*)d, NULL) || soap_element_end_out(soap, "fault") || soap_end_send(soap)) return soap_closesock(soap); } } } soap->error = status; return soap_closesock(soap); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_recv_fault(struct soap *soap, int check) { int status = soap->status; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Check (%d) if receiving SOAP Fault (status = %d)\n", check, status)); if (!check) { /* try getfault when no tag or tag mismatched at level 2, otherwise close and return SOAP_TAG_MISMATCH or HTTP error code */ if (soap->error != SOAP_NO_TAG && (soap->error != SOAP_TAG_MISMATCH || soap->level != 2)) { if (soap->error == SOAP_TAG_MISMATCH && soap->level == 0) { soap->error = SOAP_OK; if (!soap_element_begin_in(soap, "fault", 0, NULL)) { char *s = NULL, *d = NULL; (void)soap_instring(soap, "reason", &s, NULL, 0, 1, 0, -1, NULL); (void)soap_inliteral(soap, "detail", &d); if (!soap_element_end_in(soap, "fault") && !soap_end_recv(soap)) { *soap_faultstring(soap) = s; *soap_faultdetail(soap) = d; if (status) soap->error = status; else soap->error = SOAP_FAULT; soap_set_fault(soap); return soap_closesock(soap); } } soap->error = SOAP_TAG_MISMATCH; } if (status && (status < 200 || status > 299)) soap->error = status; return soap_closesock(soap); } } soap->error = SOAP_OK; if (soap_getfault(soap)) { /* if check>0 and no SOAP Fault is present and no HTTP error then just return to parse request */ if (check && (status == 0 || (status >= 200 && status <= 299)) && ((soap->error == SOAP_TAG_MISMATCH && soap->level == 2) || soap->error == SOAP_NO_TAG)) return soap->error = SOAP_OK; /* if check=0 and empty SOAP Body and encodingStyle is NULL and no HTTP error then just return */ if (!check && (status == 0 || (status >= 200 && status <= 299)) && !soap->encodingStyle && (soap->error == SOAP_NO_TAG && soap->level <= 2)) return soap->error = SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error: soap_get_soapfault() failed with error %d at level %u tag '%s'\n", soap->error, soap->level, soap->tag)); *soap_faultcode(soap) = (soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client"); if (status) soap->error = status; else soap->error = status = SOAP_NO_DATA; soap_set_fault(soap); } else { 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, "Received SOAP Fault code %s\n", s)); status = SOAP_FAULT; } if (!soap_body_end_in(soap)) soap_envelope_end_in(soap); } (void)soap_end_recv(soap); soap->error = status; return soap_closesock(soap); } /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_send_empty_response(struct soap *soap, int httpstatuscode) { soap_mode m = soap->omode; if (!(m & SOAP_IO_UDP)) { soap->count = 0; if ((m & SOAP_IO) == SOAP_IO_CHUNK) soap->omode = (m & ~SOAP_IO) | SOAP_IO_BUFFER; (void)soap_response(soap, httpstatuscode); (void)soap_end_send(soap); /* force end of sends */ soap->error = SOAP_STOP; /* stops the server from returning another response */ soap->omode = m; } return soap_closesock(soap); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_recv_empty_response(struct soap *soap) { soap->error = SOAP_OK; if (!(soap->omode & SOAP_IO_UDP) && !(soap->omode & SOAP_ENC_PLAIN)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Receiving empty response\n")); if (soap_begin_recv(soap) == SOAP_OK) { if (soap_http_skip_body(soap) || soap_end_recv(soap)) return soap_closesock(soap); } else if (soap->error == 200 || soap->error == 201 || soap->error == 202) { soap->error = SOAP_OK; } } #ifndef WITH_LEANER else if ((soap->fprepareinitrecv && (soap->error = soap->fprepareinitrecv(soap))) || (soap->fpreparefinalrecv && (soap->error = soap->fpreparefinalrecv(soap)))) { return soap->error; } #endif return soap_closesock(soap); } #endif /******************************************************************************/ #ifndef WITH_NOIO static const char* soap_strerror(struct soap *soap) { int err = soap->errnum; *soap->msgbuf = '\0'; if (err) { #ifndef WIN32 # ifdef HAVE_STRERROR_R # if !defined(_GNU_SOURCE) || (!_GNU_SOURCE && ((!defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || (_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600)) || defined(__ANDROID__) || !defined(__GLIBC__)) err = strerror_r(err, soap->msgbuf, sizeof(soap->msgbuf)); /* XSI-compliant */ if (err != 0) soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), "unknown error"); # else return strerror_r(err, soap->msgbuf, sizeof(soap->msgbuf)); /* GNU-specific */ # endif # else return strerror(err); # endif #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 #endif } else { if (soap->recv_maxlength && soap->count > soap->recv_maxlength) { soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), "max message length exceeded"); } else { int tt = soap->transfer_timeout, rt = soap->recv_timeout, st = soap->send_timeout; #ifndef WITH_LEAN int tu = ' ', ru = ' ', su = ' '; #endif soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), "message transfer interrupted"); if (tt | rt || st) soap_strcpy(soap->msgbuf + 28, sizeof(soap->msgbuf) - 28, " or timed out"); #ifndef WITH_LEAN if (tt < 0) { tt = -tt; tu = 'u'; } if (rt < 0) { rt = -rt; ru = 'u'; } if (st < 0) { st = -st; su = 'u'; } if (tt) { size_t l = strlen(soap->msgbuf); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, 43), " (%d%csec max transfer time)", tt, tu); } if (rt) { size_t l = strlen(soap->msgbuf); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, 40), " (%d%csec max recv delay)", rt, ru); } if (st) { size_t l = strlen(soap->msgbuf); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, 40), " (%d%csec max send delay)", st, su); } #endif } } return soap->msgbuf; } #endif /******************************************************************************/ 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) { const char **s = soap_faultdetail(soap); if (s) *s = faultdetailXML; } return soap->error = soaperror; } /******************************************************************************/ 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->version == 1 ? "SOAP-ENV:Client" : "at sender", NULL, faultstring, faultdetailXML, soaperror); } /******************************************************************************/ 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->version == 1 ? "SOAP-ENV:Server" : "detected", NULL, faultstring, faultdetailXML, soaperror); } /******************************************************************************/ 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; DBGFUN2("soap_copy_fault", "code=%s", faultcode ? faultcode : "(null)", "string=%s", faultstring ? faultstring : "(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); } /******************************************************************************/ 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); } /******************************************************************************/ 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->version == 1 ? "SOAP-ENV:Client" : "at source", faultsubcodeQName, faultstring, faultdetailXML); } /******************************************************************************/ 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); } /******************************************************************************/ 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->version == 1 ? "SOAP-ENV:Server" : "is internal", faultsubcodeQName, faultstring, faultdetailXML); } /******************************************************************************/ #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; c = soap_faultcode(soap); if (!*c) { soap_set_fault(soap); c = soap_faultcode(soap); } if (soap->version == 2) v = soap_fault_subcode(soap); s = soap_fault_string(soap); d = soap_fault_detail(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 : "[no detail]"); } } #endif /******************************************************************************/ #ifdef __cplusplus #ifndef WITH_LEAN #ifndef WITH_NOSTDLIB #ifndef WITH_COMPAT 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; c = soap_faultcode(soap); if (!*c) { soap_set_fault(soap); c = soap_faultcode(soap); } if (soap->version == 2) v = soap_fault_subcode(soap); s = soap_fault_string(soap); d = soap_fault_detail(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 : "[no detail]") << std::endl; } } #endif #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)) { soap_strcpy(buf, len, "Error: soap struct not initialized"); } else if (soap->error) { const char **c, *v = NULL, *s, *d; c = soap_faultcode(soap); if (!*c) { soap_set_fault(soap); c = soap_faultcode(soap); } if (soap->version == 2) v = soap_fault_subcode(soap); if (!v) v = "no subcode"; s = soap_fault_string(soap); if (!s) s = "[no reason]"; d = soap_fault_detail(soap); if (!d) d = "[no detail]"; (SOAP_SNPRINTF(buf, len, strlen(*c) + strlen(v) + strlen(s) + strlen(d) + 72), "%s%d fault %s [%s]\n\"%s\"\nDetail: %s\n", soap->version ? "SOAP 1." : "Error ", soap->version ? (int)soap->version : soap->error, *c, v, s, d); } else if (len > 0) { *buf = '\0'; } return buf; } #endif #endif /******************************************************************************/ #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_check_state(soap) == SOAP_OK && soap->error && soap->error != SOAP_STOP && soap->bufidx <= soap->buflen && soap->buflen > 0 && soap->buflen <= sizeof(soap->buf)) { 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] = (char)c1; soap->buf[j] = (char)c2; } #else (void)soap; (void)fd; #endif } #endif /******************************************************************************/ #ifdef __cplusplus #ifndef WITH_LEAN #ifndef WITH_NOSTDLIB #ifndef WITH_COMPAT SOAP_FMAC1 void SOAP_FMAC2 soap_stream_fault_location(struct soap *soap, std::ostream& os) { int i, j, c1, c2; if (soap_check_state(soap) == SOAP_OK && soap->error && soap->error != SOAP_STOP && soap->bufidx <= soap->buflen && soap->buflen > 0 && soap->buflen <= sizeof(soap->buf)) { 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'; os << soap->buf << (char)c1 << std::endl << "" << std::endl; if (soap->bufidx < soap->buflen) os << soap->buf + soap->bufidx << std::endl; soap->buf[i] = (char)c1; soap->buf[j] = (char)c2; } } #endif #endif #endif #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_register_plugin_arg(struct soap *soap, int (*fcreate)(struct soap*, struct soap_plugin*, void*), void *arg) { struct soap_plugin *p; int err; p = (struct soap_plugin*)SOAP_MALLOC(soap, sizeof(struct soap_plugin)); if (!p) return soap->error = SOAP_EOM; p->id = NULL; p->data = NULL; p->fcopy = NULL; p->fdelete = NULL; err = fcreate(soap, p, arg); if (!err && p->fdelete && p->id) { if (!soap_lookup_plugin(soap, p->id)) { 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 with the same ID already registered\n", p->id)); SOAP_FREE(soap, p); return SOAP_OK; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not register plugin '%s': plugin returned error %d or plugin ID not set or fdelete callback not set\n", p->id ? p->id : "plugin ID not set", err)); SOAP_FREE(soap, p); soap->error = err ? err : SOAP_PLUGIN_ERROR; return soap->error; } /******************************************************************************/ static void * fplugin(struct soap *soap, const char *id) { 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; } /******************************************************************************/ SOAP_FMAC1 void * SOAP_FMAC2 soap_lookup_plugin(struct soap *soap, const char *id) { return soap->fplugin(soap, id); } /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************\ * * C++ soap struct methods * \******************************************************************************/ #ifdef __cplusplus soap::soap() { soap_init(this); /* no logs to prevent DEBUG mode leaks when the user calls a soap_init() on this context */ soap_set_test_logfile(this, NULL); soap_set_sent_logfile(this, NULL); soap_set_recv_logfile(this, NULL); } #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(const struct soap& soap) { soap_copy_context(this, &soap); } #endif /******************************************************************************/ #ifdef __cplusplus struct soap& soap::operator=(const struct soap& soap) { soap_done(this); soap_copy_context(this, &soap); return *this; } #endif /******************************************************************************/ #ifdef __cplusplus void soap::destroy() { soap_destroy(this); soap_end(this); } #endif /******************************************************************************/ #ifdef __cplusplus soap::~soap() { soap_done(this); } #endif /******************************************************************************/ gsoap-2.8.91/gsoap/samples/calc_vs2005/calc_vs2005/soapH.h0000644000175000017500000022065413525245162022144 0ustar ellertellert/* soapH.h Generated by gSOAP 2.8.91 for calc.h gSOAP XML Web services tools Copyright (C) 2000-2018, Robert van Engelen, Genivia Inc. All Rights Reserved. The soapcpp2 tool and its generated software are released under the GPL. 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 soapH_H #define soapH_H #include "soapStub.h" #ifndef WITH_NOIDREF #ifdef __cplusplus extern "C" { #endif SOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap*, const void*, int); #ifdef __cplusplus } #endif SOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap*); SOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap*); #endif #ifdef __cplusplus extern "C" { #endif SOAP_FMAC3 void * SOAP_FMAC4 soap_getelement(struct soap*, const char*, int*); SOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap*, const void*, const char*, int, int); SOAP_FMAC3 void * SOAP_FMAC4 soap_dupelement(struct soap*, const void*, int); SOAP_FMAC3 void SOAP_FMAC4 soap_delelement(const void*, int); #ifdef __cplusplus } #endif SOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap*); SOAP_FMAC3 void * SOAP_FMAC4 soap_instantiate(struct soap*, int, const char*, const char*, size_t*); SOAP_FMAC3 int SOAP_FMAC4 soap_fdelete(struct soap *soap, struct soap_clist*); SOAP_FMAC3 int SOAP_FMAC4 soap_fbase(int, int); SOAP_FMAC3 void SOAP_FMAC4 soap_finsert(struct soap*, int, int, void*, size_t, const void*, void**); #ifndef SOAP_TYPE_byte_DEFINED #define SOAP_TYPE_byte_DEFINED inline void 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_out_byte(struct soap*, const char*, int, const char *, const char*); SOAP_FMAC3 char * SOAP_FMAC4 soap_in_byte(struct soap*, const char*, char *, const char*); SOAP_FMAC3 char * SOAP_FMAC4 soap_new_byte(struct soap *soap, int n = -1); SOAP_FMAC3 int SOAP_FMAC4 soap_put_byte(struct soap*, const char *, const char*, const char*); inline int soap_write_byte(struct soap *soap, char const*p) { soap_free_temp(soap); if (p) { if (soap_begin_send(soap) || ::soap_put_byte(soap, p, "byte", "") || soap_end_send(soap)) return soap->error; } return SOAP_OK; } inline int soap_PUT_byte(struct soap *soap, const char *URL, char const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put_byte(soap, p, "byte", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_byte(struct soap *soap, const char *URL, char const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put_byte(soap, p, "byte", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_byte(struct soap *soap, const char *URL, char const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put_byte(soap, p, "byte", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 char * SOAP_FMAC4 soap_get_byte(struct soap*, char *, const char*, const char*); inline int soap_read_byte(struct soap *soap, char *p) { if (p) { if (soap_begin_recv(soap) || ::soap_get_byte(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_byte(struct soap *soap, const char *URL, char *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_byte(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_byte(struct soap *soap, char *p) { if (::soap_read_byte(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #ifndef SOAP_TYPE_int_DEFINED #define SOAP_TYPE_int_DEFINED inline void 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_out_int(struct soap*, const char*, int, const int *, const char*); SOAP_FMAC3 int * SOAP_FMAC4 soap_in_int(struct soap*, const char*, int *, const char*); SOAP_FMAC3 int * SOAP_FMAC4 soap_new_int(struct soap *soap, int n = -1); SOAP_FMAC3 int SOAP_FMAC4 soap_put_int(struct soap*, const int *, const char*, const char*); inline int soap_write_int(struct soap *soap, int const*p) { soap_free_temp(soap); if (p) { if (soap_begin_send(soap) || ::soap_put_int(soap, p, "int", "") || soap_end_send(soap)) return soap->error; } return SOAP_OK; } inline int soap_PUT_int(struct soap *soap, const char *URL, int const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put_int(soap, p, "int", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_int(struct soap *soap, const char *URL, int const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put_int(soap, p, "int", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_int(struct soap *soap, const char *URL, int const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put_int(soap, p, "int", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 int * SOAP_FMAC4 soap_get_int(struct soap*, int *, const char*, const char*); inline int soap_read_int(struct soap *soap, int *p) { if (p) { if (soap_begin_recv(soap) || ::soap_get_int(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_int(struct soap *soap, const char *URL, int *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_int(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_int(struct soap *soap, int *p) { if (::soap_read_int(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #ifndef SOAP_TYPE_double_DEFINED #define SOAP_TYPE_double_DEFINED inline void soap_default_double(struct soap *soap, double *a) { (void)soap; /* appease -Wall -Werror */ #ifdef SOAP_DEFAULT_double *a = SOAP_DEFAULT_double; #else *a = (double)0; #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_double(struct soap*, const char*, int, const double *, const char*); SOAP_FMAC3 double * SOAP_FMAC4 soap_in_double(struct soap*, const char*, double *, const char*); SOAP_FMAC3 double * SOAP_FMAC4 soap_new_double(struct soap *soap, int n = -1); SOAP_FMAC3 int SOAP_FMAC4 soap_put_double(struct soap*, const double *, const char*, const char*); inline int soap_write_double(struct soap *soap, double const*p) { soap_free_temp(soap); if (p) { if (soap_begin_send(soap) || ::soap_put_double(soap, p, "double", "") || soap_end_send(soap)) return soap->error; } return SOAP_OK; } inline int soap_PUT_double(struct soap *soap, const char *URL, double const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put_double(soap, p, "double", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_double(struct soap *soap, const char *URL, double const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put_double(soap, p, "double", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_double(struct soap *soap, const char *URL, double const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put_double(soap, p, "double", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 double * SOAP_FMAC4 soap_get_double(struct soap*, double *, const char*, const char*); inline int soap_read_double(struct soap *soap, double *p) { if (p) { if (soap_begin_recv(soap) || ::soap_get_double(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_double(struct soap *soap, const char *URL, double *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_double(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_double(struct soap *soap, double *p) { if (::soap_read_double(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Fault_DEFINED #define SOAP_TYPE_SOAP_ENV__Fault_DEFINED 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_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_in_SOAP_ENV__Fault(struct soap*, const char*, struct SOAP_ENV__Fault *, const char*); SOAP_FMAC1 struct SOAP_ENV__Fault * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Fault(struct soap*, int, const char*, const char*, size_t*); inline struct SOAP_ENV__Fault * soap_new_SOAP_ENV__Fault(struct soap *soap, int n = -1) { return soap_instantiate_SOAP_ENV__Fault(soap, n, NULL, NULL, NULL); } inline struct SOAP_ENV__Fault * soap_new_req_SOAP_ENV__Fault( struct soap *soap) { struct SOAP_ENV__Fault *_p = ::soap_new_SOAP_ENV__Fault(soap); if (_p) { ::soap_default_SOAP_ENV__Fault(soap, _p); } return _p; } inline struct SOAP_ENV__Fault * soap_new_set_SOAP_ENV__Fault( struct soap *soap, char *faultcode, char *faultstring, char *faultactor, struct SOAP_ENV__Detail *detail, struct SOAP_ENV__Code *SOAP_ENV__Code, struct SOAP_ENV__Reason *SOAP_ENV__Reason, char *SOAP_ENV__Node, char *SOAP_ENV__Role, struct SOAP_ENV__Detail *SOAP_ENV__Detail) { struct SOAP_ENV__Fault *_p = ::soap_new_SOAP_ENV__Fault(soap); if (_p) { ::soap_default_SOAP_ENV__Fault(soap, _p); _p->faultcode = faultcode; _p->faultstring = faultstring; _p->faultactor = faultactor; _p->detail = detail; _p->SOAP_ENV__Code = SOAP_ENV__Code; _p->SOAP_ENV__Reason = SOAP_ENV__Reason; _p->SOAP_ENV__Node = SOAP_ENV__Node; _p->SOAP_ENV__Role = SOAP_ENV__Role; _p->SOAP_ENV__Detail = SOAP_ENV__Detail; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Fault(struct soap*, const struct SOAP_ENV__Fault *, const char*, const char*); inline int soap_write_SOAP_ENV__Fault(struct soap *soap, struct SOAP_ENV__Fault const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_SOAP_ENV__Fault(soap, p), 0) || ::soap_put_SOAP_ENV__Fault(soap, p, "SOAP-ENV:Fault", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_SOAP_ENV__Fault(struct soap *soap, const char *URL, struct SOAP_ENV__Fault const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Fault(soap, p), 0) || ::soap_put_SOAP_ENV__Fault(soap, p, "SOAP-ENV:Fault", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_SOAP_ENV__Fault(struct soap *soap, const char *URL, struct SOAP_ENV__Fault const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Fault(soap, p), 0) || ::soap_put_SOAP_ENV__Fault(soap, p, "SOAP-ENV:Fault", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_SOAP_ENV__Fault(struct soap *soap, const char *URL, struct SOAP_ENV__Fault const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Fault(soap, p), 0) || ::soap_put_SOAP_ENV__Fault(soap, p, "SOAP-ENV:Fault", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct SOAP_ENV__Fault * SOAP_FMAC4 soap_get_SOAP_ENV__Fault(struct soap*, struct SOAP_ENV__Fault *, const char*, const char*); inline int soap_read_SOAP_ENV__Fault(struct soap *soap, struct SOAP_ENV__Fault *p) { if (p) { ::soap_default_SOAP_ENV__Fault(soap, p); if (soap_begin_recv(soap) || ::soap_get_SOAP_ENV__Fault(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_SOAP_ENV__Fault(struct soap *soap, const char *URL, struct SOAP_ENV__Fault *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_SOAP_ENV__Fault(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_SOAP_ENV__Fault(struct soap *soap, struct SOAP_ENV__Fault *p) { if (::soap_read_SOAP_ENV__Fault(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Reason_DEFINED #define SOAP_TYPE_SOAP_ENV__Reason_DEFINED 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_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_in_SOAP_ENV__Reason(struct soap*, const char*, struct SOAP_ENV__Reason *, const char*); SOAP_FMAC1 struct SOAP_ENV__Reason * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Reason(struct soap*, int, const char*, const char*, size_t*); inline struct SOAP_ENV__Reason * soap_new_SOAP_ENV__Reason(struct soap *soap, int n = -1) { return soap_instantiate_SOAP_ENV__Reason(soap, n, NULL, NULL, NULL); } inline struct SOAP_ENV__Reason * soap_new_req_SOAP_ENV__Reason( struct soap *soap) { struct SOAP_ENV__Reason *_p = ::soap_new_SOAP_ENV__Reason(soap); if (_p) { ::soap_default_SOAP_ENV__Reason(soap, _p); } return _p; } inline struct SOAP_ENV__Reason * soap_new_set_SOAP_ENV__Reason( struct soap *soap, char *SOAP_ENV__Text) { struct SOAP_ENV__Reason *_p = ::soap_new_SOAP_ENV__Reason(soap); if (_p) { ::soap_default_SOAP_ENV__Reason(soap, _p); _p->SOAP_ENV__Text = SOAP_ENV__Text; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Reason(struct soap*, const struct SOAP_ENV__Reason *, const char*, const char*); inline int soap_write_SOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_SOAP_ENV__Reason(soap, p), 0) || ::soap_put_SOAP_ENV__Reason(soap, p, "SOAP-ENV:Reason", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_SOAP_ENV__Reason(struct soap *soap, const char *URL, struct SOAP_ENV__Reason const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Reason(soap, p), 0) || ::soap_put_SOAP_ENV__Reason(soap, p, "SOAP-ENV:Reason", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_SOAP_ENV__Reason(struct soap *soap, const char *URL, struct SOAP_ENV__Reason const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Reason(soap, p), 0) || ::soap_put_SOAP_ENV__Reason(soap, p, "SOAP-ENV:Reason", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_SOAP_ENV__Reason(struct soap *soap, const char *URL, struct SOAP_ENV__Reason const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Reason(soap, p), 0) || ::soap_put_SOAP_ENV__Reason(soap, p, "SOAP-ENV:Reason", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_get_SOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *, const char*, const char*); inline int soap_read_SOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *p) { if (p) { ::soap_default_SOAP_ENV__Reason(soap, p); if (soap_begin_recv(soap) || ::soap_get_SOAP_ENV__Reason(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_SOAP_ENV__Reason(struct soap *soap, const char *URL, struct SOAP_ENV__Reason *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_SOAP_ENV__Reason(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_SOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *p) { if (::soap_read_SOAP_ENV__Reason(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Detail_DEFINED #define SOAP_TYPE_SOAP_ENV__Detail_DEFINED 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_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_in_SOAP_ENV__Detail(struct soap*, const char*, struct SOAP_ENV__Detail *, const char*); SOAP_FMAC1 struct SOAP_ENV__Detail * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Detail(struct soap*, int, const char*, const char*, size_t*); inline struct SOAP_ENV__Detail * soap_new_SOAP_ENV__Detail(struct soap *soap, int n = -1) { return soap_instantiate_SOAP_ENV__Detail(soap, n, NULL, NULL, NULL); } inline struct SOAP_ENV__Detail * soap_new_req_SOAP_ENV__Detail( struct soap *soap, int __type, void *fault) { struct SOAP_ENV__Detail *_p = ::soap_new_SOAP_ENV__Detail(soap); if (_p) { ::soap_default_SOAP_ENV__Detail(soap, _p); _p->__type = __type; _p->fault = fault; } return _p; } inline struct SOAP_ENV__Detail * soap_new_set_SOAP_ENV__Detail( struct soap *soap, char *__any, int __type, void *fault) { struct SOAP_ENV__Detail *_p = ::soap_new_SOAP_ENV__Detail(soap); if (_p) { ::soap_default_SOAP_ENV__Detail(soap, _p); _p->__any = __any; _p->__type = __type; _p->fault = fault; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Detail(struct soap*, const struct SOAP_ENV__Detail *, const char*, const char*); inline int soap_write_SOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_SOAP_ENV__Detail(soap, p), 0) || ::soap_put_SOAP_ENV__Detail(soap, p, "SOAP-ENV:Detail", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_SOAP_ENV__Detail(struct soap *soap, const char *URL, struct SOAP_ENV__Detail const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Detail(soap, p), 0) || ::soap_put_SOAP_ENV__Detail(soap, p, "SOAP-ENV:Detail", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_SOAP_ENV__Detail(struct soap *soap, const char *URL, struct SOAP_ENV__Detail const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Detail(soap, p), 0) || ::soap_put_SOAP_ENV__Detail(soap, p, "SOAP-ENV:Detail", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_SOAP_ENV__Detail(struct soap *soap, const char *URL, struct SOAP_ENV__Detail const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Detail(soap, p), 0) || ::soap_put_SOAP_ENV__Detail(soap, p, "SOAP-ENV:Detail", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_get_SOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *, const char*, const char*); inline int soap_read_SOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *p) { if (p) { ::soap_default_SOAP_ENV__Detail(soap, p); if (soap_begin_recv(soap) || ::soap_get_SOAP_ENV__Detail(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_SOAP_ENV__Detail(struct soap *soap, const char *URL, struct SOAP_ENV__Detail *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_SOAP_ENV__Detail(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_SOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *p) { if (::soap_read_SOAP_ENV__Detail(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Code_DEFINED #define SOAP_TYPE_SOAP_ENV__Code_DEFINED 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_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_in_SOAP_ENV__Code(struct soap*, const char*, struct SOAP_ENV__Code *, const char*); SOAP_FMAC1 struct SOAP_ENV__Code * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Code(struct soap*, int, const char*, const char*, size_t*); inline struct SOAP_ENV__Code * soap_new_SOAP_ENV__Code(struct soap *soap, int n = -1) { return soap_instantiate_SOAP_ENV__Code(soap, n, NULL, NULL, NULL); } inline struct SOAP_ENV__Code * soap_new_req_SOAP_ENV__Code( struct soap *soap) { struct SOAP_ENV__Code *_p = ::soap_new_SOAP_ENV__Code(soap); if (_p) { ::soap_default_SOAP_ENV__Code(soap, _p); } return _p; } inline struct SOAP_ENV__Code * soap_new_set_SOAP_ENV__Code( struct soap *soap, char *SOAP_ENV__Value, struct SOAP_ENV__Code *SOAP_ENV__Subcode) { struct SOAP_ENV__Code *_p = ::soap_new_SOAP_ENV__Code(soap); if (_p) { ::soap_default_SOAP_ENV__Code(soap, _p); _p->SOAP_ENV__Value = SOAP_ENV__Value; _p->SOAP_ENV__Subcode = SOAP_ENV__Subcode; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Code(struct soap*, const struct SOAP_ENV__Code *, const char*, const char*); inline int soap_write_SOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_SOAP_ENV__Code(soap, p), 0) || ::soap_put_SOAP_ENV__Code(soap, p, "SOAP-ENV:Code", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_SOAP_ENV__Code(struct soap *soap, const char *URL, struct SOAP_ENV__Code const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Code(soap, p), 0) || ::soap_put_SOAP_ENV__Code(soap, p, "SOAP-ENV:Code", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_SOAP_ENV__Code(struct soap *soap, const char *URL, struct SOAP_ENV__Code const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Code(soap, p), 0) || ::soap_put_SOAP_ENV__Code(soap, p, "SOAP-ENV:Code", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_SOAP_ENV__Code(struct soap *soap, const char *URL, struct SOAP_ENV__Code const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Code(soap, p), 0) || ::soap_put_SOAP_ENV__Code(soap, p, "SOAP-ENV:Code", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_get_SOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *, const char*, const char*); inline int soap_read_SOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *p) { if (p) { ::soap_default_SOAP_ENV__Code(soap, p); if (soap_begin_recv(soap) || ::soap_get_SOAP_ENV__Code(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_SOAP_ENV__Code(struct soap *soap, const char *URL, struct SOAP_ENV__Code *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_SOAP_ENV__Code(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_SOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *p) { if (::soap_read_SOAP_ENV__Code(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Header_DEFINED #define SOAP_TYPE_SOAP_ENV__Header_DEFINED 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_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_in_SOAP_ENV__Header(struct soap*, const char*, struct SOAP_ENV__Header *, const char*); SOAP_FMAC1 struct SOAP_ENV__Header * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Header(struct soap*, int, const char*, const char*, size_t*); inline struct SOAP_ENV__Header * soap_new_SOAP_ENV__Header(struct soap *soap, int n = -1) { return soap_instantiate_SOAP_ENV__Header(soap, n, NULL, NULL, NULL); } inline struct SOAP_ENV__Header * soap_new_req_SOAP_ENV__Header( struct soap *soap) { struct SOAP_ENV__Header *_p = ::soap_new_SOAP_ENV__Header(soap); if (_p) { ::soap_default_SOAP_ENV__Header(soap, _p); } return _p; } inline struct SOAP_ENV__Header * soap_new_set_SOAP_ENV__Header( struct soap *soap) { struct SOAP_ENV__Header *_p = ::soap_new_SOAP_ENV__Header(soap); if (_p) { ::soap_default_SOAP_ENV__Header(soap, _p); } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Header(struct soap*, const struct SOAP_ENV__Header *, const char*, const char*); inline int soap_write_SOAP_ENV__Header(struct soap *soap, struct SOAP_ENV__Header const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_SOAP_ENV__Header(soap, p), 0) || ::soap_put_SOAP_ENV__Header(soap, p, "SOAP-ENV:Header", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_SOAP_ENV__Header(struct soap *soap, const char *URL, struct SOAP_ENV__Header const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Header(soap, p), 0) || ::soap_put_SOAP_ENV__Header(soap, p, "SOAP-ENV:Header", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_SOAP_ENV__Header(struct soap *soap, const char *URL, struct SOAP_ENV__Header const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Header(soap, p), 0) || ::soap_put_SOAP_ENV__Header(soap, p, "SOAP-ENV:Header", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_SOAP_ENV__Header(struct soap *soap, const char *URL, struct SOAP_ENV__Header const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Header(soap, p), 0) || ::soap_put_SOAP_ENV__Header(soap, p, "SOAP-ENV:Header", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_get_SOAP_ENV__Header(struct soap*, struct SOAP_ENV__Header *, const char*, const char*); inline int soap_read_SOAP_ENV__Header(struct soap *soap, struct SOAP_ENV__Header *p) { if (p) { ::soap_default_SOAP_ENV__Header(soap, p); if (soap_begin_recv(soap) || ::soap_get_SOAP_ENV__Header(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_SOAP_ENV__Header(struct soap *soap, const char *URL, struct SOAP_ENV__Header *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_SOAP_ENV__Header(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_SOAP_ENV__Header(struct soap *soap, struct SOAP_ENV__Header *p) { if (::soap_read_SOAP_ENV__Header(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #endif #ifndef SOAP_TYPE_ns__pow_DEFINED #define SOAP_TYPE_ns__pow_DEFINED SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__pow(struct soap*, struct ns__pow *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__pow(struct soap*, const struct ns__pow *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__pow(struct soap*, const char*, int, const struct ns__pow *, const char*); SOAP_FMAC3 struct ns__pow * SOAP_FMAC4 soap_in_ns__pow(struct soap*, const char*, struct ns__pow *, const char*); SOAP_FMAC1 struct ns__pow * SOAP_FMAC2 soap_instantiate_ns__pow(struct soap*, int, const char*, const char*, size_t*); inline struct ns__pow * soap_new_ns__pow(struct soap *soap, int n = -1) { return soap_instantiate_ns__pow(soap, n, NULL, NULL, NULL); } inline struct ns__pow * soap_new_req_ns__pow( struct soap *soap, double a, double b) { struct ns__pow *_p = ::soap_new_ns__pow(soap); if (_p) { ::soap_default_ns__pow(soap, _p); _p->a = a; _p->b = b; } return _p; } inline struct ns__pow * soap_new_set_ns__pow( struct soap *soap, double a, double b) { struct ns__pow *_p = ::soap_new_ns__pow(soap); if (_p) { ::soap_default_ns__pow(soap, _p); _p->a = a; _p->b = b; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__pow(struct soap*, const struct ns__pow *, const char*, const char*); inline int soap_write_ns__pow(struct soap *soap, struct ns__pow const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_ns__pow(soap, p), 0) || ::soap_put_ns__pow(soap, p, "ns:pow", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_ns__pow(struct soap *soap, const char *URL, struct ns__pow const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__pow(soap, p), 0) || ::soap_put_ns__pow(soap, p, "ns:pow", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_ns__pow(struct soap *soap, const char *URL, struct ns__pow const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__pow(soap, p), 0) || ::soap_put_ns__pow(soap, p, "ns:pow", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_ns__pow(struct soap *soap, const char *URL, struct ns__pow const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__pow(soap, p), 0) || ::soap_put_ns__pow(soap, p, "ns:pow", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct ns__pow * SOAP_FMAC4 soap_get_ns__pow(struct soap*, struct ns__pow *, const char*, const char*); inline int soap_read_ns__pow(struct soap *soap, struct ns__pow *p) { if (p) { ::soap_default_ns__pow(soap, p); if (soap_begin_recv(soap) || ::soap_get_ns__pow(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_ns__pow(struct soap *soap, const char *URL, struct ns__pow *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_ns__pow(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_ns__pow(struct soap *soap, struct ns__pow *p) { if (::soap_read_ns__pow(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #ifndef SOAP_TYPE_ns__powResponse_DEFINED #define SOAP_TYPE_ns__powResponse_DEFINED SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__powResponse(struct soap*, struct ns__powResponse *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__powResponse(struct soap*, const struct ns__powResponse *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__powResponse(struct soap*, const char*, int, const struct ns__powResponse *, const char*); SOAP_FMAC3 struct ns__powResponse * SOAP_FMAC4 soap_in_ns__powResponse(struct soap*, const char*, struct ns__powResponse *, const char*); SOAP_FMAC1 struct ns__powResponse * SOAP_FMAC2 soap_instantiate_ns__powResponse(struct soap*, int, const char*, const char*, size_t*); inline struct ns__powResponse * soap_new_ns__powResponse(struct soap *soap, int n = -1) { return soap_instantiate_ns__powResponse(soap, n, NULL, NULL, NULL); } inline struct ns__powResponse * soap_new_req_ns__powResponse( struct soap *soap) { struct ns__powResponse *_p = ::soap_new_ns__powResponse(soap); if (_p) { ::soap_default_ns__powResponse(soap, _p); } return _p; } inline struct ns__powResponse * soap_new_set_ns__powResponse( struct soap *soap, double *result) { struct ns__powResponse *_p = ::soap_new_ns__powResponse(soap); if (_p) { ::soap_default_ns__powResponse(soap, _p); _p->result = result; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__powResponse(struct soap*, const struct ns__powResponse *, const char*, const char*); inline int soap_write_ns__powResponse(struct soap *soap, struct ns__powResponse const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_ns__powResponse(soap, p), 0) || ::soap_put_ns__powResponse(soap, p, "ns:powResponse", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_ns__powResponse(struct soap *soap, const char *URL, struct ns__powResponse const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__powResponse(soap, p), 0) || ::soap_put_ns__powResponse(soap, p, "ns:powResponse", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_ns__powResponse(struct soap *soap, const char *URL, struct ns__powResponse const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__powResponse(soap, p), 0) || ::soap_put_ns__powResponse(soap, p, "ns:powResponse", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_ns__powResponse(struct soap *soap, const char *URL, struct ns__powResponse const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__powResponse(soap, p), 0) || ::soap_put_ns__powResponse(soap, p, "ns:powResponse", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct ns__powResponse * SOAP_FMAC4 soap_get_ns__powResponse(struct soap*, struct ns__powResponse *, const char*, const char*); inline int soap_read_ns__powResponse(struct soap *soap, struct ns__powResponse *p) { if (p) { ::soap_default_ns__powResponse(soap, p); if (soap_begin_recv(soap) || ::soap_get_ns__powResponse(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_ns__powResponse(struct soap *soap, const char *URL, struct ns__powResponse *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_ns__powResponse(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_ns__powResponse(struct soap *soap, struct ns__powResponse *p) { if (::soap_read_ns__powResponse(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #ifndef SOAP_TYPE_ns__div_DEFINED #define SOAP_TYPE_ns__div_DEFINED SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__div(struct soap*, struct ns__div *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__div(struct soap*, const struct ns__div *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__div(struct soap*, const char*, int, const struct ns__div *, const char*); SOAP_FMAC3 struct ns__div * SOAP_FMAC4 soap_in_ns__div(struct soap*, const char*, struct ns__div *, const char*); SOAP_FMAC1 struct ns__div * SOAP_FMAC2 soap_instantiate_ns__div(struct soap*, int, const char*, const char*, size_t*); inline struct ns__div * soap_new_ns__div(struct soap *soap, int n = -1) { return soap_instantiate_ns__div(soap, n, NULL, NULL, NULL); } inline struct ns__div * soap_new_req_ns__div( struct soap *soap, double a, double b) { struct ns__div *_p = ::soap_new_ns__div(soap); if (_p) { ::soap_default_ns__div(soap, _p); _p->a = a; _p->b = b; } return _p; } inline struct ns__div * soap_new_set_ns__div( struct soap *soap, double a, double b) { struct ns__div *_p = ::soap_new_ns__div(soap); if (_p) { ::soap_default_ns__div(soap, _p); _p->a = a; _p->b = b; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__div(struct soap*, const struct ns__div *, const char*, const char*); inline int soap_write_ns__div(struct soap *soap, struct ns__div const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_ns__div(soap, p), 0) || ::soap_put_ns__div(soap, p, "ns:div", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_ns__div(struct soap *soap, const char *URL, struct ns__div const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__div(soap, p), 0) || ::soap_put_ns__div(soap, p, "ns:div", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_ns__div(struct soap *soap, const char *URL, struct ns__div const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__div(soap, p), 0) || ::soap_put_ns__div(soap, p, "ns:div", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_ns__div(struct soap *soap, const char *URL, struct ns__div const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__div(soap, p), 0) || ::soap_put_ns__div(soap, p, "ns:div", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct ns__div * SOAP_FMAC4 soap_get_ns__div(struct soap*, struct ns__div *, const char*, const char*); inline int soap_read_ns__div(struct soap *soap, struct ns__div *p) { if (p) { ::soap_default_ns__div(soap, p); if (soap_begin_recv(soap) || ::soap_get_ns__div(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_ns__div(struct soap *soap, const char *URL, struct ns__div *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_ns__div(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_ns__div(struct soap *soap, struct ns__div *p) { if (::soap_read_ns__div(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #ifndef SOAP_TYPE_ns__divResponse_DEFINED #define SOAP_TYPE_ns__divResponse_DEFINED SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__divResponse(struct soap*, struct ns__divResponse *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__divResponse(struct soap*, const struct ns__divResponse *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__divResponse(struct soap*, const char*, int, const struct ns__divResponse *, const char*); SOAP_FMAC3 struct ns__divResponse * SOAP_FMAC4 soap_in_ns__divResponse(struct soap*, const char*, struct ns__divResponse *, const char*); SOAP_FMAC1 struct ns__divResponse * SOAP_FMAC2 soap_instantiate_ns__divResponse(struct soap*, int, const char*, const char*, size_t*); inline struct ns__divResponse * soap_new_ns__divResponse(struct soap *soap, int n = -1) { return soap_instantiate_ns__divResponse(soap, n, NULL, NULL, NULL); } inline struct ns__divResponse * soap_new_req_ns__divResponse( struct soap *soap) { struct ns__divResponse *_p = ::soap_new_ns__divResponse(soap); if (_p) { ::soap_default_ns__divResponse(soap, _p); } return _p; } inline struct ns__divResponse * soap_new_set_ns__divResponse( struct soap *soap, double *result) { struct ns__divResponse *_p = ::soap_new_ns__divResponse(soap); if (_p) { ::soap_default_ns__divResponse(soap, _p); _p->result = result; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__divResponse(struct soap*, const struct ns__divResponse *, const char*, const char*); inline int soap_write_ns__divResponse(struct soap *soap, struct ns__divResponse const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_ns__divResponse(soap, p), 0) || ::soap_put_ns__divResponse(soap, p, "ns:divResponse", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_ns__divResponse(struct soap *soap, const char *URL, struct ns__divResponse const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__divResponse(soap, p), 0) || ::soap_put_ns__divResponse(soap, p, "ns:divResponse", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_ns__divResponse(struct soap *soap, const char *URL, struct ns__divResponse const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__divResponse(soap, p), 0) || ::soap_put_ns__divResponse(soap, p, "ns:divResponse", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_ns__divResponse(struct soap *soap, const char *URL, struct ns__divResponse const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__divResponse(soap, p), 0) || ::soap_put_ns__divResponse(soap, p, "ns:divResponse", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct ns__divResponse * SOAP_FMAC4 soap_get_ns__divResponse(struct soap*, struct ns__divResponse *, const char*, const char*); inline int soap_read_ns__divResponse(struct soap *soap, struct ns__divResponse *p) { if (p) { ::soap_default_ns__divResponse(soap, p); if (soap_begin_recv(soap) || ::soap_get_ns__divResponse(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_ns__divResponse(struct soap *soap, const char *URL, struct ns__divResponse *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_ns__divResponse(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_ns__divResponse(struct soap *soap, struct ns__divResponse *p) { if (::soap_read_ns__divResponse(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #ifndef SOAP_TYPE_ns__mul_DEFINED #define SOAP_TYPE_ns__mul_DEFINED SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__mul(struct soap*, struct ns__mul *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__mul(struct soap*, const struct ns__mul *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__mul(struct soap*, const char*, int, const struct ns__mul *, const char*); SOAP_FMAC3 struct ns__mul * SOAP_FMAC4 soap_in_ns__mul(struct soap*, const char*, struct ns__mul *, const char*); SOAP_FMAC1 struct ns__mul * SOAP_FMAC2 soap_instantiate_ns__mul(struct soap*, int, const char*, const char*, size_t*); inline struct ns__mul * soap_new_ns__mul(struct soap *soap, int n = -1) { return soap_instantiate_ns__mul(soap, n, NULL, NULL, NULL); } inline struct ns__mul * soap_new_req_ns__mul( struct soap *soap, double a, double b) { struct ns__mul *_p = ::soap_new_ns__mul(soap); if (_p) { ::soap_default_ns__mul(soap, _p); _p->a = a; _p->b = b; } return _p; } inline struct ns__mul * soap_new_set_ns__mul( struct soap *soap, double a, double b) { struct ns__mul *_p = ::soap_new_ns__mul(soap); if (_p) { ::soap_default_ns__mul(soap, _p); _p->a = a; _p->b = b; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__mul(struct soap*, const struct ns__mul *, const char*, const char*); inline int soap_write_ns__mul(struct soap *soap, struct ns__mul const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_ns__mul(soap, p), 0) || ::soap_put_ns__mul(soap, p, "ns:mul", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_ns__mul(struct soap *soap, const char *URL, struct ns__mul const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__mul(soap, p), 0) || ::soap_put_ns__mul(soap, p, "ns:mul", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_ns__mul(struct soap *soap, const char *URL, struct ns__mul const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__mul(soap, p), 0) || ::soap_put_ns__mul(soap, p, "ns:mul", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_ns__mul(struct soap *soap, const char *URL, struct ns__mul const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__mul(soap, p), 0) || ::soap_put_ns__mul(soap, p, "ns:mul", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct ns__mul * SOAP_FMAC4 soap_get_ns__mul(struct soap*, struct ns__mul *, const char*, const char*); inline int soap_read_ns__mul(struct soap *soap, struct ns__mul *p) { if (p) { ::soap_default_ns__mul(soap, p); if (soap_begin_recv(soap) || ::soap_get_ns__mul(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_ns__mul(struct soap *soap, const char *URL, struct ns__mul *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_ns__mul(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_ns__mul(struct soap *soap, struct ns__mul *p) { if (::soap_read_ns__mul(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #ifndef SOAP_TYPE_ns__mulResponse_DEFINED #define SOAP_TYPE_ns__mulResponse_DEFINED SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__mulResponse(struct soap*, struct ns__mulResponse *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__mulResponse(struct soap*, const struct ns__mulResponse *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__mulResponse(struct soap*, const char*, int, const struct ns__mulResponse *, const char*); SOAP_FMAC3 struct ns__mulResponse * SOAP_FMAC4 soap_in_ns__mulResponse(struct soap*, const char*, struct ns__mulResponse *, const char*); SOAP_FMAC1 struct ns__mulResponse * SOAP_FMAC2 soap_instantiate_ns__mulResponse(struct soap*, int, const char*, const char*, size_t*); inline struct ns__mulResponse * soap_new_ns__mulResponse(struct soap *soap, int n = -1) { return soap_instantiate_ns__mulResponse(soap, n, NULL, NULL, NULL); } inline struct ns__mulResponse * soap_new_req_ns__mulResponse( struct soap *soap) { struct ns__mulResponse *_p = ::soap_new_ns__mulResponse(soap); if (_p) { ::soap_default_ns__mulResponse(soap, _p); } return _p; } inline struct ns__mulResponse * soap_new_set_ns__mulResponse( struct soap *soap, double *result) { struct ns__mulResponse *_p = ::soap_new_ns__mulResponse(soap); if (_p) { ::soap_default_ns__mulResponse(soap, _p); _p->result = result; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__mulResponse(struct soap*, const struct ns__mulResponse *, const char*, const char*); inline int soap_write_ns__mulResponse(struct soap *soap, struct ns__mulResponse const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_ns__mulResponse(soap, p), 0) || ::soap_put_ns__mulResponse(soap, p, "ns:mulResponse", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_ns__mulResponse(struct soap *soap, const char *URL, struct ns__mulResponse const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__mulResponse(soap, p), 0) || ::soap_put_ns__mulResponse(soap, p, "ns:mulResponse", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_ns__mulResponse(struct soap *soap, const char *URL, struct ns__mulResponse const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__mulResponse(soap, p), 0) || ::soap_put_ns__mulResponse(soap, p, "ns:mulResponse", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_ns__mulResponse(struct soap *soap, const char *URL, struct ns__mulResponse const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__mulResponse(soap, p), 0) || ::soap_put_ns__mulResponse(soap, p, "ns:mulResponse", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct ns__mulResponse * SOAP_FMAC4 soap_get_ns__mulResponse(struct soap*, struct ns__mulResponse *, const char*, const char*); inline int soap_read_ns__mulResponse(struct soap *soap, struct ns__mulResponse *p) { if (p) { ::soap_default_ns__mulResponse(soap, p); if (soap_begin_recv(soap) || ::soap_get_ns__mulResponse(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_ns__mulResponse(struct soap *soap, const char *URL, struct ns__mulResponse *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_ns__mulResponse(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_ns__mulResponse(struct soap *soap, struct ns__mulResponse *p) { if (::soap_read_ns__mulResponse(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #ifndef SOAP_TYPE_ns__sub_DEFINED #define SOAP_TYPE_ns__sub_DEFINED SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__sub(struct soap*, struct ns__sub *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__sub(struct soap*, const struct ns__sub *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__sub(struct soap*, const char*, int, const struct ns__sub *, const char*); SOAP_FMAC3 struct ns__sub * SOAP_FMAC4 soap_in_ns__sub(struct soap*, const char*, struct ns__sub *, const char*); SOAP_FMAC1 struct ns__sub * SOAP_FMAC2 soap_instantiate_ns__sub(struct soap*, int, const char*, const char*, size_t*); inline struct ns__sub * soap_new_ns__sub(struct soap *soap, int n = -1) { return soap_instantiate_ns__sub(soap, n, NULL, NULL, NULL); } inline struct ns__sub * soap_new_req_ns__sub( struct soap *soap, double a, double b) { struct ns__sub *_p = ::soap_new_ns__sub(soap); if (_p) { ::soap_default_ns__sub(soap, _p); _p->a = a; _p->b = b; } return _p; } inline struct ns__sub * soap_new_set_ns__sub( struct soap *soap, double a, double b) { struct ns__sub *_p = ::soap_new_ns__sub(soap); if (_p) { ::soap_default_ns__sub(soap, _p); _p->a = a; _p->b = b; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__sub(struct soap*, const struct ns__sub *, const char*, const char*); inline int soap_write_ns__sub(struct soap *soap, struct ns__sub const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_ns__sub(soap, p), 0) || ::soap_put_ns__sub(soap, p, "ns:sub", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_ns__sub(struct soap *soap, const char *URL, struct ns__sub const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__sub(soap, p), 0) || ::soap_put_ns__sub(soap, p, "ns:sub", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_ns__sub(struct soap *soap, const char *URL, struct ns__sub const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__sub(soap, p), 0) || ::soap_put_ns__sub(soap, p, "ns:sub", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_ns__sub(struct soap *soap, const char *URL, struct ns__sub const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__sub(soap, p), 0) || ::soap_put_ns__sub(soap, p, "ns:sub", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct ns__sub * SOAP_FMAC4 soap_get_ns__sub(struct soap*, struct ns__sub *, const char*, const char*); inline int soap_read_ns__sub(struct soap *soap, struct ns__sub *p) { if (p) { ::soap_default_ns__sub(soap, p); if (soap_begin_recv(soap) || ::soap_get_ns__sub(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_ns__sub(struct soap *soap, const char *URL, struct ns__sub *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_ns__sub(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_ns__sub(struct soap *soap, struct ns__sub *p) { if (::soap_read_ns__sub(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #ifndef SOAP_TYPE_ns__subResponse_DEFINED #define SOAP_TYPE_ns__subResponse_DEFINED SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__subResponse(struct soap*, struct ns__subResponse *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__subResponse(struct soap*, const struct ns__subResponse *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__subResponse(struct soap*, const char*, int, const struct ns__subResponse *, const char*); SOAP_FMAC3 struct ns__subResponse * SOAP_FMAC4 soap_in_ns__subResponse(struct soap*, const char*, struct ns__subResponse *, const char*); SOAP_FMAC1 struct ns__subResponse * SOAP_FMAC2 soap_instantiate_ns__subResponse(struct soap*, int, const char*, const char*, size_t*); inline struct ns__subResponse * soap_new_ns__subResponse(struct soap *soap, int n = -1) { return soap_instantiate_ns__subResponse(soap, n, NULL, NULL, NULL); } inline struct ns__subResponse * soap_new_req_ns__subResponse( struct soap *soap) { struct ns__subResponse *_p = ::soap_new_ns__subResponse(soap); if (_p) { ::soap_default_ns__subResponse(soap, _p); } return _p; } inline struct ns__subResponse * soap_new_set_ns__subResponse( struct soap *soap, double *result) { struct ns__subResponse *_p = ::soap_new_ns__subResponse(soap); if (_p) { ::soap_default_ns__subResponse(soap, _p); _p->result = result; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__subResponse(struct soap*, const struct ns__subResponse *, const char*, const char*); inline int soap_write_ns__subResponse(struct soap *soap, struct ns__subResponse const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_ns__subResponse(soap, p), 0) || ::soap_put_ns__subResponse(soap, p, "ns:subResponse", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_ns__subResponse(struct soap *soap, const char *URL, struct ns__subResponse const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__subResponse(soap, p), 0) || ::soap_put_ns__subResponse(soap, p, "ns:subResponse", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_ns__subResponse(struct soap *soap, const char *URL, struct ns__subResponse const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__subResponse(soap, p), 0) || ::soap_put_ns__subResponse(soap, p, "ns:subResponse", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_ns__subResponse(struct soap *soap, const char *URL, struct ns__subResponse const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__subResponse(soap, p), 0) || ::soap_put_ns__subResponse(soap, p, "ns:subResponse", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct ns__subResponse * SOAP_FMAC4 soap_get_ns__subResponse(struct soap*, struct ns__subResponse *, const char*, const char*); inline int soap_read_ns__subResponse(struct soap *soap, struct ns__subResponse *p) { if (p) { ::soap_default_ns__subResponse(soap, p); if (soap_begin_recv(soap) || ::soap_get_ns__subResponse(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_ns__subResponse(struct soap *soap, const char *URL, struct ns__subResponse *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_ns__subResponse(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_ns__subResponse(struct soap *soap, struct ns__subResponse *p) { if (::soap_read_ns__subResponse(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #ifndef SOAP_TYPE_ns__add_DEFINED #define SOAP_TYPE_ns__add_DEFINED SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__add(struct soap*, struct ns__add *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__add(struct soap*, const struct ns__add *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__add(struct soap*, const char*, int, const struct ns__add *, const char*); SOAP_FMAC3 struct ns__add * SOAP_FMAC4 soap_in_ns__add(struct soap*, const char*, struct ns__add *, const char*); SOAP_FMAC1 struct ns__add * SOAP_FMAC2 soap_instantiate_ns__add(struct soap*, int, const char*, const char*, size_t*); inline struct ns__add * soap_new_ns__add(struct soap *soap, int n = -1) { return soap_instantiate_ns__add(soap, n, NULL, NULL, NULL); } inline struct ns__add * soap_new_req_ns__add( struct soap *soap, double a, double b) { struct ns__add *_p = ::soap_new_ns__add(soap); if (_p) { ::soap_default_ns__add(soap, _p); _p->a = a; _p->b = b; } return _p; } inline struct ns__add * soap_new_set_ns__add( struct soap *soap, double a, double b) { struct ns__add *_p = ::soap_new_ns__add(soap); if (_p) { ::soap_default_ns__add(soap, _p); _p->a = a; _p->b = b; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__add(struct soap*, const struct ns__add *, const char*, const char*); inline int soap_write_ns__add(struct soap *soap, struct ns__add const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_ns__add(soap, p), 0) || ::soap_put_ns__add(soap, p, "ns:add", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_ns__add(struct soap *soap, const char *URL, struct ns__add const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__add(soap, p), 0) || ::soap_put_ns__add(soap, p, "ns:add", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_ns__add(struct soap *soap, const char *URL, struct ns__add const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__add(soap, p), 0) || ::soap_put_ns__add(soap, p, "ns:add", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_ns__add(struct soap *soap, const char *URL, struct ns__add const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__add(soap, p), 0) || ::soap_put_ns__add(soap, p, "ns:add", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct ns__add * SOAP_FMAC4 soap_get_ns__add(struct soap*, struct ns__add *, const char*, const char*); inline int soap_read_ns__add(struct soap *soap, struct ns__add *p) { if (p) { ::soap_default_ns__add(soap, p); if (soap_begin_recv(soap) || ::soap_get_ns__add(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_ns__add(struct soap *soap, const char *URL, struct ns__add *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_ns__add(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_ns__add(struct soap *soap, struct ns__add *p) { if (::soap_read_ns__add(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #ifndef SOAP_TYPE_ns__addResponse_DEFINED #define SOAP_TYPE_ns__addResponse_DEFINED SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__addResponse(struct soap*, struct ns__addResponse *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__addResponse(struct soap*, const struct ns__addResponse *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__addResponse(struct soap*, const char*, int, const struct ns__addResponse *, const char*); SOAP_FMAC3 struct ns__addResponse * SOAP_FMAC4 soap_in_ns__addResponse(struct soap*, const char*, struct ns__addResponse *, const char*); SOAP_FMAC1 struct ns__addResponse * SOAP_FMAC2 soap_instantiate_ns__addResponse(struct soap*, int, const char*, const char*, size_t*); inline struct ns__addResponse * soap_new_ns__addResponse(struct soap *soap, int n = -1) { return soap_instantiate_ns__addResponse(soap, n, NULL, NULL, NULL); } inline struct ns__addResponse * soap_new_req_ns__addResponse( struct soap *soap) { struct ns__addResponse *_p = ::soap_new_ns__addResponse(soap); if (_p) { ::soap_default_ns__addResponse(soap, _p); } return _p; } inline struct ns__addResponse * soap_new_set_ns__addResponse( struct soap *soap, double *result) { struct ns__addResponse *_p = ::soap_new_ns__addResponse(soap); if (_p) { ::soap_default_ns__addResponse(soap, _p); _p->result = result; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__addResponse(struct soap*, const struct ns__addResponse *, const char*, const char*); inline int soap_write_ns__addResponse(struct soap *soap, struct ns__addResponse const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_ns__addResponse(soap, p), 0) || ::soap_put_ns__addResponse(soap, p, "ns:addResponse", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_ns__addResponse(struct soap *soap, const char *URL, struct ns__addResponse const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__addResponse(soap, p), 0) || ::soap_put_ns__addResponse(soap, p, "ns:addResponse", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_ns__addResponse(struct soap *soap, const char *URL, struct ns__addResponse const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__addResponse(soap, p), 0) || ::soap_put_ns__addResponse(soap, p, "ns:addResponse", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_ns__addResponse(struct soap *soap, const char *URL, struct ns__addResponse const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__addResponse(soap, p), 0) || ::soap_put_ns__addResponse(soap, p, "ns:addResponse", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct ns__addResponse * SOAP_FMAC4 soap_get_ns__addResponse(struct soap*, struct ns__addResponse *, const char*, const char*); inline int soap_read_ns__addResponse(struct soap *soap, struct ns__addResponse *p) { if (p) { ::soap_default_ns__addResponse(soap, p); if (soap_begin_recv(soap) || ::soap_get_ns__addResponse(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_ns__addResponse(struct soap *soap, const char *URL, struct ns__addResponse *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_ns__addResponse(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_ns__addResponse(struct soap *soap, struct ns__addResponse *p) { if (::soap_read_ns__addResponse(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_PointerToSOAP_ENV__Reason_DEFINED #define SOAP_TYPE_PointerToSOAP_ENV__Reason_DEFINED SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *const*); 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_in_PointerToSOAP_ENV__Reason(struct soap*, const char*, struct SOAP_ENV__Reason **, const char*); SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *const*, const char*, 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*); #endif #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_PointerToSOAP_ENV__Detail_DEFINED #define SOAP_TYPE_PointerToSOAP_ENV__Detail_DEFINED SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *const*); 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_in_PointerToSOAP_ENV__Detail(struct soap*, const char*, struct SOAP_ENV__Detail **, const char*); SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *const*, const char*, 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*); #endif #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_PointerToSOAP_ENV__Code_DEFINED #define SOAP_TYPE_PointerToSOAP_ENV__Code_DEFINED SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *const*); 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_in_PointerToSOAP_ENV__Code(struct soap*, const char*, struct SOAP_ENV__Code **, const char*); SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *const*, const char*, 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*); #endif #endif #ifndef SOAP_TYPE_PointerTodouble_DEFINED #define SOAP_TYPE_PointerTodouble_DEFINED SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTodouble(struct soap*, double *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTodouble(struct soap*, const char *, int, double *const*, const char *); SOAP_FMAC3 double ** SOAP_FMAC4 soap_in_PointerTodouble(struct soap*, const char*, double **, const char*); SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTodouble(struct soap*, double *const*, const char*, const char*); SOAP_FMAC3 double ** SOAP_FMAC4 soap_get_PointerTodouble(struct soap*, double **, const char*, const char*); #endif #ifndef SOAP_TYPE__QName_DEFINED #define SOAP_TYPE__QName_DEFINED inline void soap_default__QName(struct soap *soap, char **a) { (void)soap; /* appease -Wall -Werror */ #ifdef SOAP_DEFAULT__QName *a = SOAP_DEFAULT__QName; #else *a = (char *)0; #endif } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__QName(struct soap*, char *const*); #define soap__QName2s(soap, a) soap_QName2s(soap, (a)) SOAP_FMAC3 int SOAP_FMAC4 soap_out__QName(struct soap*, const char*, int, char*const*, const char*); #define soap_s2_QName(soap, s, a) soap_s2QName((soap), (s), (char**)(a), 0, -1, NULL) SOAP_FMAC3 char * * SOAP_FMAC4 soap_in__QName(struct soap*, const char*, char **, const char*); #define soap_instantiate__QName soap_instantiate_string #define soap_new__QName soap_new_string SOAP_FMAC3 int SOAP_FMAC4 soap_put__QName(struct soap*, char *const*, const char*, const char*); inline int soap_write__QName(struct soap *soap, char *const*p) { soap_free_temp(soap); if (p) { if (soap_begin_send(soap) || ::soap_put__QName(soap, p, "QName", "") || soap_end_send(soap)) return soap->error; } return SOAP_OK; } inline int soap_PUT__QName(struct soap *soap, const char *URL, char *const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put__QName(soap, p, "QName", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH__QName(struct soap *soap, const char *URL, char *const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put__QName(soap, p, "QName", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send__QName(struct soap *soap, const char *URL, char *const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put__QName(soap, p, "QName", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 char ** SOAP_FMAC4 soap_get__QName(struct soap*, char **, const char*, const char*); inline int soap_read__QName(struct soap *soap, char **p) { if (p) { if (soap_begin_recv(soap) || ::soap_get__QName(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET__QName(struct soap *soap, const char *URL, char **p) { if (soap_GET(soap, URL, NULL) || ::soap_read__QName(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv__QName(struct soap *soap, char **p) { if (::soap_read__QName(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #ifndef SOAP_TYPE__XML_DEFINED #define SOAP_TYPE__XML_DEFINED #endif #ifndef SOAP_TYPE_string_DEFINED #define SOAP_TYPE_string_DEFINED inline void 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*, char *const*); #define soap_string2s(soap, a) (a) SOAP_FMAC3 int SOAP_FMAC4 soap_out_string(struct soap*, const char*, int, char*const*, const char*); #define soap_s2string(soap, s, a) soap_s2char((soap), (s), (char**)(a), 1, 0, -1, NULL) SOAP_FMAC3 char * * SOAP_FMAC4 soap_in_string(struct soap*, const char*, char **, const char*); SOAP_FMAC3 char * * SOAP_FMAC4 soap_new_string(struct soap *soap, int n = -1); SOAP_FMAC3 int SOAP_FMAC4 soap_put_string(struct soap*, char *const*, const char*, const char*); inline int soap_write_string(struct soap *soap, char *const*p) { soap_free_temp(soap); if (p) { if (soap_begin_send(soap) || ::soap_put_string(soap, p, "string", "") || soap_end_send(soap)) return soap->error; } return SOAP_OK; } inline int soap_PUT_string(struct soap *soap, const char *URL, char *const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put_string(soap, p, "string", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_string(struct soap *soap, const char *URL, char *const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put_string(soap, p, "string", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_string(struct soap *soap, const char *URL, char *const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put_string(soap, p, "string", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 char ** SOAP_FMAC4 soap_get_string(struct soap*, char **, const char*, const char*); inline int soap_read_string(struct soap *soap, char **p) { if (p) { if (soap_begin_recv(soap) || ::soap_get_string(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_string(struct soap *soap, const char *URL, char **p) { if (soap_GET(soap, URL, NULL) || ::soap_read_string(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_string(struct soap *soap, char **p) { if (::soap_read_string(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #endif /* End of soapH.h */ gsoap-2.8.91/gsoap/samples/calc_vs2005/calc_vs2005/stdsoap2.h0000644000175000017500000046012413525245162022627 0ustar ellertellert/* stdsoap2.h 2.8.91 gSOAP runtime engine gSOAP XML Web services tools Copyright (C) 2000-2019, 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 addition licensed under the gSOAP public license: - vxWorks compatible, enabled with compiler option -DVXWORKS -------------------------------------------------------------------------------- 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-2019, 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 -------------------------------------------------------------------------------- */ #define GSOAP_VERSION 20891 #ifdef WITH_SOAPDEFS_H # include "soapdefs.h" /* include user-defined stuff in soapdefs.h */ #endif #ifndef _THREAD_SAFE # define _THREAD_SAFE #endif #ifndef OPENSERVER # ifndef _REENTRANT # define _REENTRANT # endif #endif #ifdef _WIN32 # ifndef WIN32 # define WIN32 # endif #endif /* for legacy purposes we use WIN32 macro, even when WIN64 is supported */ #ifdef _WIN64 # ifndef WIN32 # define WIN32 # endif #endif #ifdef WIN32 # ifdef SOAP_STD_EXPORTS /* dllexport the API functions and classes */ # ifndef SOAP_STD_API # define SOAP_STD_API __declspec(dllexport) # endif # ifndef SOAP_CMAC # define SOAP_CMAC SOAP_STD_API /* export soap struct and generated classes */ # endif # ifndef SOAP_FMAC1 # define SOAP_FMAC1 SOAP_STD_API /* export stdsoap2.cpp API */ # endif # ifndef SOAP_FMAC3 # define SOAP_FMAC3 SOAP_STD_API /* export soapC.cpp serializers API */ # endif # ifndef SOAP_FMAC5 # define SOAP_FMAC5 SOAP_STD_API /* export soapClient.cpp and soapServer.cpp API */ # endif # 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 #ifndef STDSOAP_H #define STDSOAP_H #define SOAP_XSTRINGIFY(s) SOAP_STRINGIFY(s) #define SOAP_STRINGIFY(s) #s #if defined(SOAPDEFS_H) && !defined(WITH_SOAPDEFS_H) # include SOAP_XSTRINGIFY(SOAPDEFS_H) /* include user-defined "SOAPDEFS_H" */ #endif #if defined(__vxworks) || defined(__VXWORKS__) # ifndef VXWORKS # define VXWORKS # 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 __clang__ # ifdef _WIN32 # ifndef WIN32 # define WIN32 # endif # endif # else # ifdef __WIN32__ # ifndef WIN32 # define WIN32 # endif # endif # endif #endif #if defined(__CYGWIN__) || defined(__CYGWIN32__) # ifndef CYGWIN # define CYGWIN # endif #endif #ifdef __SYMBIAN32__ # define SYMBIAN # undef WIN32 #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 #if defined(__sun) && defined(__SVR4) # ifndef SUN_OS # define SUN_OS # endif #endif #ifdef HAVE_CONFIG_H # include "config.h" #else # if defined(UNDER_CE) # define SOAP_BUFLEN (2048) # define SOAP_PTRHASH (32) # define SOAP_IDHASH (19) # define SOAP_BLKLEN (32) # define SOAP_TAGLEN (256) # define SOAP_HDRLEN (1024) # define SOAP_MAXDIMS (4) # define HAVE_SSCANF # elif defined(CYGWIN) # define HAVE_POLL # define HAVE_SNPRINTF # 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_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_INTTYPES_H # define HAVE_LOCALE_H # define HAVE_SOCKLEN_T # elif defined(WIN32) # ifdef __BORLANDC__ # ifdef __clang__ # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_STRTOL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_GMTIME # define HAVE_WCTOMB # define HAVE_MBTOWC # define SOAP_LONG_FORMAT "%lld" # define SOAP_ULONG_FORMAT "%llu" # else # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_STRTOL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_GMTIME # define HAVE_WCTOMB # define HAVE_MBTOWC # define SOAP_LONG_FORMAT "%I64d" # define SOAP_ULONG_FORMAT "%I64u" # endif # else # if _MSC_VER >= 1400 # define HAVE_SNPRINTF # endif # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_STRTOL # define HAVE_STRTOUL # if _MSC_VER >= 1300 # define HAVE_STRTOLL /* use _strtoi64 */ # define HAVE_STRTOULL /* use _strtoui64 */ # endif # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_GMTIME # define HAVE_WCTOMB # define HAVE_MBTOWC # define SOAP_LONG_FORMAT "%I64d" # define SOAP_ULONG_FORMAT "%I64u" # define HAVE_LOCALE_H # endif # elif defined(__APPLE__) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRLCPY # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SSCANF_L # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_ASCTIME_R # define HAVE_TM_GMTOFF # define HAVE_GETTIMEOFDAY # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_TIMEGM # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_INTTYPES_H # define HAVE_LOCALE_H # define HAVE_XLOCALE_H # define HAVE_RANDOM # define HAVE_SOCKLEN_T # elif defined(_AIX43) # define HAVE_SNPRINTF # 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_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_LOCALE_H # define HAVE_SOCKLEN_T # elif defined(_AIX41) # define HAVE_SNPRINTF # 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 # define HAVE_LOCALE_H # elif defined(HP_UX) # include # if 0 /* enable if __strtoll and __strtoull are available */ extern intmax_t __strtoll(const char*, char**, int); extern intmax_t __strtoull(const char*, char**, int); # define strtoll __strtoll # define strtoull __strtoull # endif # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # 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_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_ISNAN # define HAVE_LOCALE_H # elif defined(FREEBSD) || defined(__FreeBSD__) || defined(OPENBSD) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRLCPY # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SSCANF_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_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define SOAP_LONG_FORMAT "%qd" # define SOAP_ULONG_FORMAT "%qu" # define HAVE_ISNAN # define HAVE_ISINF # define HAVE_LOCALE_H # define HAVE_XLOCALE_H # define HAVE_RANDOM # define HAVE_SOCKLEN_T # elif defined(__VMS) # include # define HAVE_SNPRINTF # 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_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(TRU64) # define HAVE_SNPRINTF # 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_ASCTIME_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" # define HAVE_LOCALE_H # elif defined(__GLIBC__) || defined(__GNU__) || defined(__GNUC__) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_SYS_TIMEB_H # define HAVE_GETTIMEOFDAY # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_TIMEGM # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_ISNAN # define HAVE_ISINF # if !defined(__GNUC__) || __GNUC__ >= 4 /* gcc 3 and earlier often refuse to compile _l functions */ # define HAVE_STRTOD_L # define HAVE_SSCANF_L # define HAVE_LOCALE_H # endif # define HAVE_SOCKLEN_T # elif defined(MAC_CARBON) # define WITH_NOIO # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # 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_SNPRINTF # 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_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_SOCKLEN_T # elif defined(AS400) # define HAVE_SNPRINTF # 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_ASCTIME_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_POLL # define HAVE_SNPRINTF # define HAVE_STRLCPY # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_GETTIMEOFDAY # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_SOCKLEN_T # elif defined(SUN_OS) # define HAVE_SNPRINTF # 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_ASCTIME_R # define HAVE_LOCALTIME_R # else /* Default assumptions for supported library functions when not including config.h */ # ifndef WITH_C_LOCALE # ifndef WITH_NO_C_LOCALE # define WITH_NO_C_LOCALE /* turn locale support off by default */ # endif # endif # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # 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_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_LOCALE_H # ifdef MB_LEN_MAX # define HAVE_WCTOMB # define HAVE_MBTOWC # endif # endif #endif #ifdef WITH_LEANER # ifndef WITH_LEAN # define WITH_LEAN # endif #endif /* gSOAP 2.7.15 and higher: always use FAST and retain CDATA in literal XML, unless WITH_LEAN or WITH_NOCDATA */ #ifndef WITH_LEAN # ifndef WITH_FAST # define WITH_FAST # endif # ifndef WITH_NOCDATA # ifndef WITH_CDATA # define WITH_CDATA # endif # endif #endif #if !defined(__cplusplus) /* allowing empty struct/union in C is a GNU extension */ # if !defined(__GNU__) && !defined(__GNUC__) # define WITH_NOEMPTYSTRUCT # endif #endif /* silence clang's C99 variadic macro warnings */ #ifdef __clang__ # pragma clang diagnostic ignored "-Wvariadic-macros" #endif #if defined(WITH_PURE_VIRTUAL) # define SOAP_PURE_VIRTUAL = 0 # define SOAP_PURE_VIRTUAL_COPY = 0 #elif defined(WITH_DEFAULT_VIRTUAL) # define SOAP_PURE_VIRTUAL { return SOAP_NO_METHOD; } # define SOAP_PURE_VIRTUAL_COPY #else # define SOAP_PURE_VIRTUAL # define SOAP_PURE_VIRTUAL_COPY #endif /* older OpenVMS TCP/IP stacks cannot handle 65536 bytes */ #ifdef __VMS # ifndef SOAP_BUFLEN # define SOAP_BUFLEN (65535) # endif #endif /* small buffer, to accelerate base64 and hex binary output */ #ifndef SOAP_BINARY_BUFLEN # define SOAP_BINARY_BUFLEN (128) #endif /* if we have locale.h then we should use it WITH_C_LOCALE enabled to avoid decimal point conversion issues */ #ifdef HAVE_LOCALE_H # ifndef WITH_NO_C_LOCALE # ifndef WITH_C_LOCALE # define WITH_C_LOCALE # endif # endif #endif /* MinGW does not support uselocale() and xlocale.h and gettimeofday() */ #if defined(__MINGW32__) || defined(__MINGW64__) # if !defined(WITH_NO_C_LOCALE) # define WITH_NO_C_LOCALE # endif # undef HAVE_GETTIMEOFDAY #endif /* user can set WITH_NO_C_LOCALE to force removal of locale (e.g. in case of compiler errors) */ #ifdef WITH_NO_C_LOCALE # undef WITH_C_LOCALE #endif #ifndef WITH_NOSTDLIB # include # include # include # if !defined(HAVE_CONFIG_H) || defined(HAVE_CTYPE_H) # include # endif # if !defined(HAVE_CONFIG_H) || defined(HAVE_LIMITS_H) # include /* for MB_LEN_MAX */ # endif # if !defined(HAVE_CONFIG_H) || defined(HAVE_FLOAT_H) # include /* for INFINITY */ # endif # if !defined(HAVE_CONFIG_H) || defined(HAVE_MATH_H) # include /* for isnan() and isinf() */ # endif #endif /* force inclusion of xlocale.h when WITH_INCLUDE_XLOCALE_H is defined by the user for systems that require xlocale.h */ #ifdef WITH_INCLUDE_XLOCALE_H # ifndef HAVE_XLOCALE_H # define HAVE_XLOCALE_H # endif #endif #ifdef WITH_C_LOCALE # include # if defined(WIN32) && !defined(CYGWIN) # define SOAP_LOCALE_T _locale_t # define SOAP_LOCALE(soap) ((soap)->c_locale ? (soap)->c_locale : ((soap)->c_locale = _create_locale(LC_ALL, "C"))) # define SOAP_FREELOCALE(soap) (void)((soap)->c_locale && (_free_locale((soap)->c_locale), ((soap)->c_locale = NULL))) # else # if defined(HAVE_XLOCALE_H) # include # endif # define SOAP_LOCALE_T locale_t # define SOAP_LOCALE(soap) ((soap)->c_locale ? (soap)->c_locale : ((soap)->c_locale = newlocale(LC_ALL_MASK, "C", NULL))) # define SOAP_FREELOCALE(soap) (void)((soap)->c_locale && (freelocale((soap)->c_locale), ((soap)->c_locale = NULL))) # if defined(CYGWIN) # undef HAVE_STRTOF_L /* Cygwin does not support strtof_l strtod_l */ # undef HAVE_STRTOD_L # endif # endif #else # undef HAVE_STRTOF_L # undef HAVE_STRTOD_L # undef HAVE_SSCANF_L #endif #ifdef TANDEM_NONSTOP /* Support for Guardian */ # define SOAP_BUFLEN (32767) /*# define WITH_NOSTDLIB */ /* uncommment to remove stdlib dependences */ # define WITH_NOIO /* no IO dependences, e.g. remove TCP/IP */ # define int32_t int # define int64_t long long # define LONG64 long long # define ULONG64 unsigned long long # define DBL_PINFTY (1.1579208923716189e77) # undef HAVE_WCTOMB # undef HAVE_MBTOWC # undef HAVE_GMTIME_R # undef HAVE_ASCTIME_R # undef HAVE_LOCALTIME_R # undef HAVE_SNPRINTF # define SOAP_BUFLEN (32767) # define SOAP_SOCKET short #pragma nolist # include # include # include # include # include # include # include # include # include # include # include # define INET_ERROR 4294967295 #pragma list #elif defined(__TANDEM) /* Support for OSS */ # define int32_t int # define SOAP_BUFLEN (32767) #endif #ifdef WITH_NTLM # include #endif #ifdef HAVE_POLL # include #endif #ifdef __cplusplus # include # include # ifndef WITH_COMPAT # include # include # endif #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 WITH_NOIO # include # include # endif # ifndef WITH_LEAN # ifdef HAVE_SYS_TIMEB_H # include /* for ftime() */ # endif # include # endif #endif #ifdef OPENSERVER # include # include # include extern int h_errno; #endif #ifdef HAVE_GETTIMEOFDAY # ifndef WIN32 # ifdef VXWORKS # ifdef _WRS_KERNEL # include # endif # else # include /* for timeval and gettimeofday() */ # endif # endif #endif #ifndef WITH_NOIO # ifndef WIN32 # include # ifdef VXWORKS # include # include # ifndef _WRS_KERNEL # include # endif # else # ifndef SYMBIAN # include # endif # endif # ifdef SUN_OS # include /* SUN */ # include /* only needed with SUN < 2.8 ? */ # endif # ifdef VXWORKS # ifdef _WRS_KERNEL # include # endif # endif # include # ifdef OS390 # include # else # include /* TCP_NODELAY, TCP_FASTOPEN */ # endif # include # endif #endif #ifdef WIN32 # define SOAP_WINSOCKINT int #else # define SOAP_WINSOCKINT size_t #endif #ifdef WIN32 # undef WITH_SELF_PIPE #endif #if defined(WITH_IPV6_V6ONLY) # ifndef WITH_IPV6 # define WITH_IPV6 # endif #endif #ifdef WIN32 # ifndef UNDER_CE # include # include # endif // When you get macro redefinition errors when compiling the code below, then: // a) try arrange your includes so is included after "stdsoap2.h" // b) or define _WINSOCKAPI_ first: // #define _WINSOCKAPI_ // stops windows.h including winsock.h // #include // #include "stdsoap2.h" // c) or compile with the -DWIN32_LEAN_AND_MEAN switch # include // Visual Studio 2005 users: install Platform SDK (R2) # include // # define _WSPIAPI_COUNTOF // DEV NOTE: enble to fix problems with VC6 // # include # include // DEV NOTE: replaces older wspiapi.h above # ifdef WITH_IPV6 # define SOAP_GAI_STRERROR gai_strerrorA # endif #else # ifdef VXWORKS # include # include # include # endif # ifndef WITH_NOIO # include # include # include # include # ifdef _AIX41 # include # endif # endif #endif #ifdef WITH_FASTCGI # include #endif #ifdef WITH_OPENSSL # ifdef __VMS # pragma names save # pragma names uppercase # endif # undef WITH_GNUTLS # define OPENSSL_NO_KRB5 # include # include # include # 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 # ifdef __VMS # pragma names restore # endif #endif #ifdef WITH_GNUTLS # include # include # if GNUTLS_VERSION_NUMBER < 0x020b00 /* deprecated since GNUTLS 2.11.0 */ # include # endif # ifndef HAVE_PTHREAD_H # ifdef _POSIX_THREADS # define HAVE_PTHREAD_H /* make GNUTLS thread safe */ # endif # endif #endif #ifdef WITH_SYSTEMSSL # include #endif #ifdef WITH_GZIP # ifndef WITH_ZLIB # define WITH_ZLIB # endif #endif #ifdef WITH_CASEINSENSITIVETAGS # define SOAP_STRCMP soap_tag_cmp /* case insensitive XML element/attribute names */ #else # define SOAP_STRCMP strcmp /* case sensitive XML element/attribute names */ #endif #ifdef WITH_ZLIB # include #endif /* #define DEBUG */ /* Uncomment to debug sending (in file SENT.log) receiving (in file RECV.log) and internal operations (in file TEST.log) */ /* #define DEBUG_STAMP */ /* Uncomment to debug sending (in file SENT.log) receiving (in file RECV.log) and time-stamped operations (in file TEST.log) */ #ifdef __cplusplus extern "C" { #endif /* Portability (X/Open, BSD sockets etc): define SOAP_SOCKLEN_T as socklen_t or int or ... */ #if defined(HAVE_SOCKLEN_T) # define SOAP_SOCKLEN_T socklen_t #elif defined(_AIX) || defined(AIX) || defined(HP_UX) # 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(__ANDROID__) || !defined(_GNU_SOURCE) || (!_GNU_SOURCE && !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 # define SOAP_SOCKLEN_T socklen_t #elif defined(IRIX) || defined(WIN32) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS) # define SOAP_SOCKLEN_T int #elif !defined(SOAP_SOCKLEN_T) # define SOAP_SOCKLEN_T socklen_t #endif /* AIX DCE threads portability: define SOAP_FUNC_R_ERR gmtime_r and localtime_r err ret val as -1 */ #ifdef _AIX32_THREADS # define SOAP_FUNC_R_ERR (-1) #elif !defined(SOAP_FUNC_R_ERR) # define SOAP_FUNC_R_ERR (NULL) #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(sk) ((sk) != SOAP_INVALID_SOCKET) #define SOAP_SHUT_WR (1) #define SOAP_SHUT_RDWR (2) #ifndef SOAP_GAI_STRERROR # define SOAP_GAI_STRERROR gai_strerror #endif #ifndef FD_SETSIZE # define FD_SETSIZE (1024) #endif #ifdef WITH_LEAN # define SOAP_CHK_EOF SOAP_EOF #else # define SOAP_CHK_EOF (soap->error ? soap->error : SOAP_EOF) #endif #ifdef __cplusplus # ifndef __STDC_FORMAT_MACROS # define __STDC_FORMAT_MACROS # endif #endif #if defined(SYMBIAN) # warning "Symbian build: removing 64 bit integer support" # define LONG64 long # define ULONG64 unsigned LONG64 # ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%ld" # endif # ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%lu" # endif #elif !defined(WIN32) || defined(CYGWIN) || defined(__GLIBC__) || defined(__GNU__) || defined(__GNUC__) # ifndef LONG64 # if defined(HAVE_INTTYPES_H) # include # define LONG64 int64_t # define ULONG64 uint64_t # if defined(PRId64) && defined(PRIu64) # ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%" PRId64 # endif # ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%" PRIu64 # endif # endif # elif defined(HAVE_SYS_INTTYPES_H) # include # define LONG64 int64_t # define ULONG64 uint64_t # if defined(PRId64) && defined(PRIu64) # ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%" PRId64 # endif # ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%" PRIu64 # endif # endif # elif defined(HAVE_STDINT_H) # include # define LONG64 int64_t # define ULONG64 uint64_t # if defined(PRId64) && defined(PRIu64) # ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%" PRId64 # endif # ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%" PRIu64 # endif # endif # elif defined(CYGWIN) || 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 long long ints */ #endif #ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%llu" /* printf format for unsigned 64 bit long long ints */ #endif #if defined(WIN32) && !defined(CYGWIN) # define soap_int32 __int32 #elif defined(SYMBIAN) # define soap_int32 long #elif defined(_AIX) || 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 # define SOAP_ECONNREFUSED WSAECONNREFUSED #else # ifdef ERANGE # define SOAP_ERANGE ERANGE # else # define SOAP_ERANGE (34) # endif # define SOAP_EINTR EINTR # define SOAP_EAGAIN EAGAIN # define SOAP_EADDRINUSE EADDRINUSE # define SOAP_ECONNREFUSED ECONNREFUSED # 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 # if !defined(WITH_LEAN) # define SOAP_BUFLEN (65536) /* buffer length for socket packets, so don't make this too small */ # else # define SOAP_BUFLEN (2048) /* lean size */ # 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 (4096) /* 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) /* 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 (256) # 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_TMPLEN # ifndef WITH_LEAN # define SOAP_TMPLEN (2048) /* maximum length of msgbuf and tmpbuf short message buffers, must be >=1024 */ # else # define SOAP_TMPLEN (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_MAXPTRS # ifndef WITH_LEAN # define SOAP_MAXPTRS (4) /* maximum depth + 1 of id-ref deserialized pointer types (int* has depth 0, int*** has depth 2) */ # else # define SOAP_MAXPTRS (2) # endif #endif #ifndef SOAP_MAXALLOCSIZE # define SOAP_MAXALLOCSIZE (0) /* max size that malloc() can handle, zero for no limit */ #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 /* Tag name of multiref elements in SOAP 1.1 encoding */ #ifndef SOAP_MULTIREFTAG # define SOAP_MULTIREFTAG "id" #endif /* href-id value base name in multiref SOAP encoding */ #ifndef SOAP_BASEREFNAME # define SOAP_BASEREFNAME "_" #endif /* Max number of EINTR interrupts to ignore while poll/select for pending activity on a socket */ /* Each EINTR ignored may increase the I/O blocking time by at most one second */ #ifndef SOAP_MAXEINTR # define SOAP_MAXEINTR (10) #endif /* SOAP_MAXKEEPALIVE: Max iterations in soap_serve() to keep server connection alive */ #ifndef SOAP_MAXKEEPALIVE # define SOAP_MAXKEEPALIVE (100) #endif /* SOAP_MAXARRAYSIZE: Trusted total max size of an inbound SOAP Array. Arrays of larger size are not pre-allocated, but deserialized on an element-by-element basis until XML validation contrains kick in. This macro only affects the efficiency of parsing SOAP arrays. */ #ifndef SOAP_MAXARRAYSIZE # define SOAP_MAXARRAYSIZE (100000) #endif /* SOAP_MAXDIMESIZE: Trusted max size of inbound DIME data. Increase if necessary to allow larger attachments, or decrease when server resources are limited. This is to deny senders to allocate more than 8 MB at the receiver without actually sending the whole message. */ #ifndef SOAP_MAXDIMESIZE # define SOAP_MAXDIMESIZE (8*1048576) /* 8 MB */ #endif /* SOAP_MAXINFLATESIZE: Trusted inflated content size. Larger content is subject to the SOAP_MINDEFLATERATIO constraint. If SOAP_MINDEFLATERATIO is 1.0, SOAP_MAXINFLATESIZE is always the max size of uncompressed content. */ #ifndef SOAP_MAXINFLATESIZE # define SOAP_MAXINFLATESIZE (1*1048576) /* 1 MB */ #endif /* SOAP_MINDEFLATERATIO: Trusted deflation ratio after SOAP_MAXINFLATESIZE is reached. Trust when compressed / deflated > SOAP_MINDEFLATERATIO Sets a ratio > 0.00096899224806 (1032:1) According to the zlib site: the limit (1032:1) comes from the fact that one length/distance pair can represent at most 258 output bytes. A length requires at least one bit and a distance requires at least one bit, so two bits in can give 258 bytes out, or eight bits in give 1032 bytes out. A dynamic block has no length restriction, so you could get arbitrarily close to the limit of 1032:1. */ #ifndef SOAP_MINDEFLATERATIO # define SOAP_MINDEFLATERATIO (1.0/1032.0) /* ratio of deflated/inflated */ #endif /* maximum XML nesting depth level allowed for inbound XML parsing, must be greater than zero (0) */ #ifndef SOAP_MAXLEVEL # define SOAP_MAXLEVEL (10000) #endif /* maximum string content length if not already constrained by XML schema validation maxLength constraints, zero or negative means unlimited string lengths are allowed unless restricted by XML schema maxLength */ #ifndef SOAP_MAXLENGTH # define SOAP_MAXLENGTH (0) #endif /* maximum number of array or container elements, must be greater than zero (0) */ #ifndef SOAP_MAXOCCURS # define SOAP_MAXOCCURS (100000) #endif #ifdef VXWORKS # ifdef WMW_RPM_IO # include "httpLib.h" # endif # ifdef __INCmathh # include # ifndef HAVE_ISNAN # define HAVE_ISNAN # endif # ifndef soap_isnan # define soap_isnan(num) isNan(num) # endif # endif # ifdef WM_SECURE_KEY_STORAGE # include # endif #endif #ifdef WIN32 # ifndef HAVE_ISNAN # define HAVE_ISNAN # endif # define soap_isnan(n) _isnan(n) # ifndef HAVE_ISINF # define HAVE_ISINF # endif # define soap_isinf(n) (!_finite(n)) #endif #ifdef SUN_OS # define HAVE_ISNAN #endif #ifdef __APPLE__ # ifndef HAVE_ISNAN # define HAVE_ISNAN # endif # ifndef HAVE_ISINF # define HAVE_ISINF # endif #endif #if !defined(HAVE_ISNAN) && (defined(_MATH_H) || defined(_MATH_INCLUDED)) # define HAVE_ISNAN #endif union soap_double_nan {struct {unsigned int n1, n2;} iv; double dv; float fv;}; extern const union soap_double_nan soap_double_nan; extern const char soap_base64o[], soap_base64i[]; #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 (soap_double_nan.fv) #endif #ifndef FLT_PINFTY # if defined(INFINITY) # define FLT_PINFTY INFINITY # elif 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 (soap_double_nan.dv) #endif #ifndef DBL_PINFTY # if defined(INFINITY) # define DBL_PINFTY INFINITY # elif 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) ((n) != (n)) # endif #endif #ifndef soap_isinf # ifdef HAVE_ISINF # define soap_isinf(n) isinf(n) # else # define soap_isinf(n) (!soap_isnan(n) && soap_isnan((n) - (n))) # endif #endif #define soap_ispinfd(n) ((n) > 0 && soap_isinf(n)) #define soap_ispinff(n) ((n) > 0 && soap_isinf(n)) #define soap_isninfd(n) ((n) < 0 && soap_isinf(n)) #define soap_isninff(n) ((n) < 0 && soap_isinf(n)) /* Safer str & mem functions */ /* The gSOAP code uses guards to ensure that these functions are well behaved and do not raise errors. Therefore, the WIN _s functions should never execute the "invalid parameter handler". */ /* use safer snprintf if possible or guard sprintf against overrun (assumes no variadic macros) */ # ifdef HAVE_SNPRINTF # if _MSC_VER >= 1400 # define SOAP_SNPRINTF(buf, len, num) void)_snprintf_s((buf), (len), _TRUNCATE # define SOAP_SNPRINTF_SAFE(buf, len) void)_snprintf_s((buf), (len), _TRUNCATE # else # define SOAP_SNPRINTF(buf, len, num) void)snprintf((buf), (len) # define SOAP_SNPRINTF_SAFE(buf, len) void)snprintf((buf), (len) # endif # else # define SOAP_SNPRINTF(buf, len, num) (len) <= (num)) ? (void)((buf)[0] = '\0') : (void)sprintf((buf) # define SOAP_SNPRINTF_SAFE(buf, len) void)sprintf((buf) # endif /* copy string (truncating the result, strings must not be NULL) */ #if _MSC_VER >= 1400 # define soap_strcpy(buf, len, src) (void)strncpy_s((buf), (len), (src), _TRUNCATE) #elif defined(HAVE_STRLCPY) # define soap_strcpy(buf, len, src) (void)strlcpy((buf), (src), (len)) #else # define soap_strcpy(buf, len, src) (void)(strncpy((buf), (src), (len)), (buf)[(len) - 1] = '\0') #endif /* concat string (truncating the result, strings must not be NULL) */ #if _MSC_VER >= 1400 # define soap_strcat(buf, len, src) (void)strncat_s((buf), (len), (src), _TRUNCATE) #elif defined(HAVE_STRLCAT) # define soap_strcat(buf, len, src) (void)strlcat((buf), (src), (len)) #else SOAP_FMAC1 void SOAP_FMAC2 soap_strcat(char *buf, size_t len, const char *src); #endif /* copy string up to num chars (sets string to empty on overrun and returns nonzero, zero if OK) */ #if _MSC_VER >= 1400 # define soap_strncpy(buf, len, src, num) ((buf) == NULL || ((size_t)(len) > (size_t)(num) ? strncpy_s((buf), (len), (src), (num)) : ((buf)[0] = '\0', 1))) #else # define soap_strncpy(buf, len, src, num) ((buf) == NULL || ((size_t)(len) > (size_t)(num) ? (strncpy((buf), (src), (num)), (buf)[(size_t)(num)] = '\0') : ((buf)[0] = '\0', 1))) #endif /* concat string up to n chars (leaves destination intact on overrun and returns nonzero, zero if OK) */ #if _MSC_VER >= 1400 # define soap_strncat(buf, len, src, num) ((buf) == NULL || ((size_t)(len) > strlen((buf)) + (size_t)(num) ? strncat_s((buf), (len), (src), (num)) : 1)) #else SOAP_FMAC1 int SOAP_FMAC2 soap_strncat(char *buf, size_t len, const char *src, size_t num); #endif /* copy memory (returns SOAP_ERANGE on overrun, zero if OK, pointers must not be NULL) */ #if _MSC_VER >= 1400 # define soap_memcpy(buf, len, src, num) ((size_t)(len) >= (size_t)(num) ? memcpy_s((buf), (len), (src), (num)) : SOAP_ERANGE) #else # define soap_memcpy(buf, len, src, num) ((size_t)(len) >= (size_t)(num) ? !memcpy((buf), (src), (num)) : SOAP_ERANGE) #endif /* move memory (returns SOAP_ERANGE on overrun, zero if OK, pointers must not be NULL) */ #if _MSC_VER >= 1400 # define soap_memmove(buf, len, src, num) ((size_t)(len) >= (size_t)(num) ? memmove_s((buf), (len), (src), (num)) : SOAP_ERANGE) #else # define soap_memmove(buf, len, src, num) ((size_t)(len) >= (size_t)(num) ? !memmove((buf), (src), (num)) : SOAP_ERANGE) #endif /* gSOAP status and error codes */ typedef soap_int32 soap_status; #define SOAP_EOF 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 /* deprecated */ #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_PATCH_METHOD 17 #define SOAP_DEL_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 /* unused */ #define SOAP_REQUIRED 42 #define SOAP_PROHIBITED 43 #define SOAP_OCCURS 44 #define SOAP_LENGTH 45 #define SOAP_PATTERN 46 #define SOAP_FD_EXCEEDED 47 #define SOAP_UTF_ERROR 48 #define SOAP_NTLM_ERROR 49 #define SOAP_LEVEL 50 #define SOAP_FIXED 51 #define SOAP_EMPTY 52 #define SOAP_END_TAG 53 #define SOAP_ERR 99 #define soap_xml_error_check(e) \ ((e) == SOAP_TAG_MISMATCH || \ (e) == SOAP_NO_TAG || \ (e) == SOAP_IOB || \ (e) == SOAP_SYNTAX_ERROR || \ (e) == SOAP_NAMESPACE || \ (e) == SOAP_TYPE || \ (e) == SOAP_DUPLICATE_ID || \ (e) == SOAP_MISSING_ID || \ (e) == SOAP_REQUIRED || \ (e) == SOAP_PROHIBITED || \ (e) == SOAP_OCCURS || \ (e) == SOAP_LENGTH || \ (e) == SOAP_LEVEL || \ (e) == SOAP_PATTERN || \ (e) == SOAP_NULL || \ (e) == SOAP_HREF || \ (e) == SOAP_FIXED || \ (e) == SOAP_EMPTY || \ (e) == SOAP_END_TAG || \ (e) == SOAP_UTF_ERROR) #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 || \ (e) == SOAP_DATAENCODINGUNKNOWN) #define soap_http_error_check(e) \ ((e) == SOAP_HTTP_ERROR || \ (e) == SOAP_NO_DATA || \ ((e) >= SOAP_GET_METHOD && (e) <= SOAP_HTTP_METHOD) || \ ((e) >= 100 && (e) < 600)) #define soap_dime_error_check(e) \ ((e) == SOAP_DIME_ERROR || \ (e) == SOAP_DIME_HREF || \ (e) == SOAP_DIME_MISMATCH || \ (e) == SOAP_DIME_END) #define soap_mime_error_check(e) \ ((e) == SOAP_MIME_ERROR || \ (e) == SOAP_MIME_HREF || \ (e) == SOAP_MIME_END) #define soap_tcp_error_check(e) \ ((e) == SOAP_EOF || \ (e) == SOAP_TCP_ERROR) #define soap_udp_error_check(e) \ ((e) == SOAP_EOF || \ (e) == SOAP_UDP_ERROR) #define soap_ssl_error_check(e) ((e) == SOAP_SSL_ERROR) #define soap_zlib_error_check(e) ((e) == SOAP_ZLIB_ERROR) /* gSOAP HTTP response status codes 100 to 599 are reserved */ /* Codes 600 to 999 are user definable */ /* Exceptional gSOAP HTTP server response status codes >= 1000 */ #define SOAP_STOP 1000 /* No HTTP response should follow after SOAP_STOP is issued */ #define SOAP_FORM 1001 /* Request (form) data is present, no HTTP response should follow */ #define SOAP_HTML 1002 /* Custom HTML response */ #define SOAP_FILE 1200 /* Custom file-based response with soap::http_content and optional http status */ /* gSOAP HTTP method codes (client) */ typedef int soap_http_command; #define SOAP_POST 2000 /* POST request */ #define SOAP_POST_FILE 2001 /* Custom file-based POST request */ #define SOAP_GET 2002 /* GET request */ #define SOAP_PUT 2003 /* PUT request */ #define SOAP_PATCH 2004 /* PATCH request */ #define SOAP_DEL 2005 /* DELETE request */ #define SOAP_HEAD 2006 /* HEAD request */ #define SOAP_OPTIONS 2007 /* OPTIONS request */ #define SOAP_CONNECT 2008 /* CONNECT request */ /* 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 /* out: flush output immediately, no buffering */ #define SOAP_IO_BUFFER 0x00000001 /* out: buffer output in packets of size SOAP_BUFLEN */ #define SOAP_IO_STORE 0x00000002 /* out: store entire output to determine length for transport */ #define SOAP_IO_CHUNK 0x00000003 /* out: use HTTP chunked transfer AND buffer packets */ #define SOAP_IO_UDP 0x00000004 /* in/out: enable UDP instead of TCP */ #define SOAP_IO_LENGTH 0x00000008 /* out: calc message length (internal) */ #define SOAP_IO_KEEPALIVE 0x00000010 /* out: keep connection alive */ #define SOAP_ENC 0x00000FFF /* IO and ENC mask */ #define SOAP_ENC_LATIN 0x00000020 /* in: accept iso-8859-1 */ #define SOAP_ENC_PLAIN 0x00000040 /* out: plain (XML or other) body, no HTTP header */ #define SOAP_ENC_XML 0x00000040 /* deprecated, alias for SOAP_ENC_PLAIN */ #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_XML_STRICT 0x00001000 /* in: strict validation */ #define SOAP_XML_INDENT 0x00002000 /* out: emit indented XML */ #define SOAP_XML_IGNORENS 0x00004000 /* in: ignore namespaces */ #define SOAP_XML_DEFAULTNS 0x00008000 /* out: emit xmlns="..." */ #define SOAP_XML_CANONICAL 0x00010000 /* out: exc-C14N exclusive canonical XML */ #define SOAP_XML_TREE 0x00020000 /* in/out: XML tree (no id/ref) */ #define SOAP_XML_NIL 0x00040000 /* out: all NULLs as xsi:nil */ #define SOAP_XML_NOTYPE 0x00080000 /* out: do not add xsi:type */ #define SOAP_DOM_TREE 0x00100000 /* see DOM manual */ #define SOAP_DOM_NODE 0x00200000 #define SOAP_DOM_ASIS 0x00400000 #define SOAP_XML_CANONICAL_NA 0x00800000 /* out: (exc) C14N not QName aware */ #define SOAP_C_NOIOB 0x01000000 /* don't fault on array index out of bounds (just ignore) */ #define SOAP_C_UTFSTRING 0x02000000 /* (de)serialize strings with UTF8 content */ #define SOAP_C_MBSTRING 0x04000000 /* (de)serialize strings with multi-byte content */ #define SOAP_C_NILSTRING 0x08000000 /* serialize empty strings as nil (omitted) */ #define SOAP_XML_DOM 0x10000000 /* enable internal DOM */ #define SOAP_XML_GRAPH 0x20000000 /* force id-ref XML graph */ #define SOAP_MIME_POSTCHECK 0x40000000 /* MIME flag (internal) */ #define SOAP_SEC_WSUID 0x80000000 /* Add Body wsu:Id flag (internal) */ /* WITH_XMLNS backward compatibility: always use XML default namespaces */ #ifdef WITH_XMLNS # define SOAP_IO_DEFAULT (SOAP_IO_FLUSH | SOAP_XML_DEFAULTNS) #else # define SOAP_IO_DEFAULT SOAP_IO_FLUSH #endif /* SSL client/server authentication settings */ #define SOAP_SSL_NO_AUTHENTICATION (0x0000) /* no authentication */ #define SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION (0x0001) /* client requires server to authenticate */ #define SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION (0x0002) /* server requires client to authenticate */ #define SOAP_SSL_SKIP_HOST_CHECK (0x0004) /* client skips common name check against host name */ #define SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE (0x0008) /* allow self-signed and expired certificates and those w/o CRL */ #define SOAP_SSL_NO_DEFAULT_CA_PATH (0x0010) /* don't use SSL_CTX_set_default_verify_paths */ #define SOAP_SSL_RSA (0x0020) /* use RSA */ #define SOAP_SSLv3 (0x0080) /* enable SSL v3 */ #define SOAP_TLSv1_0 (0x0100) /* enable TLS v1.0 */ #define SOAP_TLSv1_1 (0x0200) /* enable TLS v1.1 */ #define SOAP_TLSv1_2 (0x0400) /* enable TLS v1.2 */ #define SOAP_TLSv1_3 (0x0800) /* enable TLS v1.3 */ #define SOAP_TLSv1 (SOAP_TLSv1_0 | SOAP_TLSv1_1 | SOAP_TLSv1_2 | SOAP_TLSv1_3) #define SOAP_SSLv3_TLSv1 (SOAP_SSLv3 | SOAP_TLSv1) #define SOAP_SSL_CLIENT (0x8000) /* client context flag for internal use */ #define SOAP_SSL_DEFAULT SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION typedef unsigned short soap_ssl_flags; /* 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)) /* parts */ #define SOAP_END 0 #define SOAP_BEGIN_SEND 1 #define SOAP_BEGIN_RECV 2 #define SOAP_IN_ENVELOPE 3 #define SOAP_IN_HEADER 4 #define SOAP_END_HEADER 5 #define SOAP_NO_BODY 6 #define SOAP_IN_BODY 7 #define SOAP_END_BODY 8 #define SOAP_END_ENVELOPE 9 /* events */ #define SOAP_SEC_BEGIN 1 #define SOAP_SEC_SIGN 2 #define SOAP_SEC_DECRYPT 3 /* DEBUG macros */ #ifdef DEBUG_STAMP # ifndef DEBUG # define DEBUG # endif #endif #ifdef DEBUG # ifndef SOAP_DEBUG # define SOAP_DEBUG # endif # ifndef SOAP_MEM_DEBUG # define SOAP_MEM_DEBUG # 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__, (void*)(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((void*)(ptr)) #endif #ifndef SOAP_MALLOC_UNMANAGED /* use libc malloc to alloc soap context with soap_new() */ # define SOAP_MALLOC_UNMANAGED(size) malloc((size)) #endif #ifndef SOAP_FREE_UNMANAGED /* use libc free to free soap context with soap_free() */ # define SOAP_FREE_UNMANAGED(ptr) free((void*)(ptr)) #endif #ifndef SOAP_NOTHROW # if defined(__GNUC__) && (__GNUC__ <= 2) # define SOAP_NOTHROW # elif defined(WITH_LEAN) || defined(WITH_COMPAT) # define SOAP_NOTHROW # else # define SOAP_NOTHROW (std::nothrow) # endif #endif #if defined(__BORLANDC__) && !defined(__clang__) /* Embarcadero Classic compiler special case */ # ifndef SOAP_NEW # define SOAP_NEW(soap, type) new SOAP_NOTHROW (type) # endif # ifndef SOAP_NEW_ARRAY # define SOAP_NEW_ARRAY(soap, type, n) new SOAP_NOTHROW (type[n]) # endif # ifndef SOAP_PLACEMENT_NEW # define SOAP_PLACEMENT_NEW(soap, buf, type) new (buf) (type) # endif #elif (defined(__GNUC__) && (__GNUC__ <= 2)) || defined(__clang__) || defined(_AIX) || defined(AIX) /* old form w/o parenthesis, soap context may be NULL */ # ifndef SOAP_NEW # define SOAP_NEW(soap, type) new SOAP_NOTHROW type # endif # ifndef SOAP_NEW_ARRAY # define SOAP_NEW_ARRAY(soap, type, n) new SOAP_NOTHROW type[n] # endif # ifndef SOAP_PLACEMENT_NEW # define SOAP_PLACEMENT_NEW(soap, buf, type) new (buf) type # endif #else /* new form with parenthesis for (type) but not type[n], soap context may be NULL */ # ifndef SOAP_NEW # define SOAP_NEW(soap, type) new SOAP_NOTHROW (type) # endif # ifndef SOAP_NEW_ARRAY # define SOAP_NEW_ARRAY(soap, type, n) new SOAP_NOTHROW type[n] # endif # ifndef SOAP_PLACEMENT_NEW # define SOAP_PLACEMENT_NEW(soap, buf, type) new (buf) (type) # endif #endif #ifndef SOAP_DELETE /* use C++ delete operator, soap context may be NULL */ # define SOAP_DELETE(soap, obj, type) delete obj #endif #ifndef SOAP_DELETE_ARRAY /* use C++ delete[] operator, soap context may be NULL */ # define SOAP_DELETE_ARRAY(soap, obj, type) delete[] obj #endif #ifndef SOAP_NEW_UNMANAGED /* use C++ unmanaged new operator for soap_new() and soap::copy() */ # define SOAP_NEW_UNMANAGED(soap) new SOAP_NOTHROW soap #endif #ifndef SOAP_DELETE_UNMANAGED /* use C++ unmanaged delete operator for soap_free() */ # define SOAP_DELETE_UNMANAGED(soap) delete soap #endif #ifdef SOAP_DEBUG # ifndef SOAP_MESSAGE # define SOAP_MESSAGE fprintf # endif # ifndef DBGLOG # ifdef DEBUG_STAMP # ifdef WIN32 # 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];\ SYSTEMTIME _localTime;\ ::GetLocalTime(&_localTime); \ fprintf(fdebug, "%02d%02d%02d %02d:%02d:%02d.%03d|", (int)_localTime.wYear%100, (int)_localTime.wMonth, (int)_localTime.wDay, (int)_localTime.wHour, (int)_localTime.wMinute, (int)_localTime.wSecond, (int)_localTime.wMilliseconds);\ CMD;\ fflush(fdebug);\ }\ }\ } # else # 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];\ struct timeval _tv;\ struct tm _tm;\ gettimeofday(&_tv, NULL);\ localtime_r(&_tv.tv_sec, &_tm);\ fprintf(fdebug, "%02d%02d%02d %02d:%02d:%02d.%06ld|", (int)_tm.tm_year%100, (int)_tm.tm_mon+1, (int)_tm.tm_mday, (int)_tm.tm_hour, (int)_tm.tm_min, (int)_tm.tm_sec, (long)_tv.tv_usec);\ CMD;\ fflush(fdebug);\ }\ }\ } # endif # else # 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 # 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((void*)(MSG), 1, (size_t)(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))) # define DBGFUN4(FNAME, FMT1, ARG1, FMT2, ARG2, FMT3, ARG3, FMT4, ARG4) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s(" FMT1 ", " FMT2 ", " FMT3 ", " FMT4 ")\n", __FILE__, __LINE__, FNAME, (ARG1), (ARG2), (ARG3), (ARG4))) # 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 DBGFUN4(FNAME, FMT1, ARG1, FMT2, ARG2, FMT3, ARG3, FMT4, ARG4) # 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; /* forward declaration */ struct SOAP_CMAC soap; /* namespace table row */ struct SOAP_CMAC 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 */ const 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 id[0...] below this struct */ }; /* block header, the data flows into the allocated region below this struct */ struct soap_bhead { struct soap_bhead *next; size_t size; }; /* block stack for nested block allocations */ struct soap_blist { struct soap_blist *next; struct soap_bhead *head; size_t size; size_t item; }; /* pointer serialization management */ struct soap_plist { struct soap_plist *next; const void *ptr; void *dup; const void *array; /* array pointer */ int size; /* array size */ int type; int id; char mark1; /* 0=single-ref, 1=embedded-multi-ref (SOAP1.1), 2=multi-ref, 3=attachment */ 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; /* array size */ int (*fdelete)(struct soap*, struct soap_clist*); }; /* attributes */ struct soap_attribute { struct soap_attribute *next; short flag; /* soap_set_attr: 1 = normal, 2 = utf content */ char *value; size_t size; const char *ns; short visible; char name[1]; /* the actual name string flows into the allocated region below this struct */ }; #if !defined(WITH_LEAN) || defined(WITH_COOKIES) struct soap_cookie { struct soap_cookie *next; char *name; char *value; char *domain; char *path; ULONG64 expire; /* client-side: local time to expire (value cast to time_t) */ 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 SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_next_multipart(struct soap_multipart*); #ifdef __cplusplus 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; } struct soap_multipart *operator->() const { return content; } soap_multipart_iterator& operator++() { content = soap_next_multipart(content); return *this; } soap_multipart_iterator operator++(int) { soap_multipart_iterator iter(*this); content = soap_next_multipart(content); return iter; } 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; const 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 /* dom.c[pp] functions (optional, compile and link dom.c[pp] */ struct SOAP_CMAC soap_dom_element; struct SOAP_CMAC soap_dom_attribute; /* soap_dom_element construction */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_new(struct soap *soap, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_new_w(struct soap *soap, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_set(struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_set_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att(struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt(struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_nth_elt(struct soap_dom_element *elt, const char *ns, const char *tag, size_t n); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_nth_elt_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag, size_t n); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_nth(struct soap_dom_element *elt, size_t n); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_att(struct soap_dom_element *elt, const struct soap_dom_attribute *node); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_elt(struct soap_dom_element *elt, const struct soap_dom_element *node); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_atts(struct soap_dom_element *elt, const struct soap_dom_attribute *atts); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_elts(struct soap_dom_element *elt, const struct soap_dom_element *elts); /* soap_dom_element assignment */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_bool(struct soap_dom_element *elt, LONG64 b); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_int(struct soap_dom_element *elt, LONG64 n); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_double(struct soap_dom_element *elt, double x); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_text(struct soap_dom_element *elt, const char *text); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_text_w(struct soap_dom_element *elt, const wchar_t *text); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_node(struct soap_dom_element *elt, const void *node, int type); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_copy(struct soap_dom_element *elt, const struct soap_dom_element *node); /* soap_dom_element properties */ SOAP_FMAC1 int SOAP_FMAC2 soap_elt_match(const struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_match_w(const struct soap_dom_element *elt, const char *ns, const wchar_t *patt); SOAP_FMAC1 const char * SOAP_FMAC2 soap_elt_get_ns(const struct soap_dom_element *elt); SOAP_FMAC1 const char * SOAP_FMAC2 soap_elt_get_tag(const struct soap_dom_element *elt); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_is_true(const struct soap_dom_element *elt); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_is_false(const struct soap_dom_element *elt); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_get_int(const struct soap_dom_element *elt); SOAP_FMAC1 long SOAP_FMAC2 soap_elt_get_long(const struct soap_dom_element *elt); SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_elt_get_LONG64(const struct soap_dom_element *elt); SOAP_FMAC1 double SOAP_FMAC2 soap_elt_get_double(const struct soap_dom_element *elt); SOAP_FMAC1 const char * SOAP_FMAC2 soap_elt_get_text(const struct soap_dom_element *elt); SOAP_FMAC1 const void * SOAP_FMAC2 soap_elt_get_node(const struct soap_dom_element *elt, int type); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_get_type(const struct soap_dom_element *elt, const void **node); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_parent(const struct soap_dom_element *elt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_depth(const struct soap_dom_element *elt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_index(const struct soap_dom_element *elt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_len(const struct soap_dom_element *elt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_nth(const struct soap_dom_element *elt); /* soap_dom_attribute construction */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_new(struct soap *soap, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_new_w(struct soap *soap, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_set(struct soap_dom_attribute *att, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_set_w(struct soap_dom_attribute *att, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_add(struct soap_dom_attribute *att, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_add_w(struct soap_dom_attribute *att, const char *ns, const wchar_t *tag); /* soap_dom_attribute assignment */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_bool(struct soap_dom_attribute *att, LONG64 b); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_int(struct soap_dom_attribute *att, LONG64 n); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_double(struct soap_dom_attribute *att, double x); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_text(struct soap_dom_attribute *att, const char *text); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_text_w(struct soap_dom_attribute *att, const wchar_t *text); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_copy(struct soap_dom_attribute *att, const struct soap_dom_attribute *node); /* soap_dom_attribute properties */ SOAP_FMAC1 int SOAP_FMAC2 soap_att_match(const struct soap_dom_attribute *att, const char *ns, const char *patt); SOAP_FMAC1 int SOAP_FMAC2 soap_att_match_w(const struct soap_dom_attribute *att, const char *ns, const wchar_t *patt); SOAP_FMAC1 const char * SOAP_FMAC2 soap_att_get_ns(const struct soap_dom_attribute *att); SOAP_FMAC1 const char * SOAP_FMAC2 soap_att_get_tag(const struct soap_dom_attribute *att); SOAP_FMAC1 int SOAP_FMAC2 soap_att_is_true(const struct soap_dom_attribute *att); SOAP_FMAC1 int SOAP_FMAC2 soap_att_is_false(const struct soap_dom_attribute *att); SOAP_FMAC1 int SOAP_FMAC2 soap_att_get_int(const struct soap_dom_attribute *att); SOAP_FMAC1 long SOAP_FMAC2 soap_att_get_long(const struct soap_dom_attribute *att); SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_att_get_LONG64(const struct soap_dom_attribute *att); SOAP_FMAC1 double SOAP_FMAC2 soap_att_get_double(const struct soap_dom_attribute *att); SOAP_FMAC1 const char * SOAP_FMAC2 soap_att_get_text(const struct soap_dom_attribute *att); /* DOM local traversal */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_first(struct soap_dom_element *elt); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_next(const struct soap_dom_attribute *att); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_first(struct soap_dom_element *elt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_next(const struct soap_dom_element *elt); /* DOM local retrieval */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_get(const struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_get_w(const struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get(const struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get_w(const struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get_next(const struct soap_dom_element *elt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get_nth(struct soap_dom_element *elt, size_t n); /* DOM local search */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_find(struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_find_next(const struct soap_dom_attribute *att, const char *ns, const char *patt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find(struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find_next(const struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find_type(struct soap_dom_element *elt, const char *ns, const char *patt, int type); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find_next_type(const struct soap_dom_element *elt, const char *ns, const char *patt, int type); /* DOM size of local search results */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_att_size(struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_size(struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_size_type(struct soap_dom_element *elt, const char *ns, const char *patt, int type); /* DOM deep traversal */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_dom_next_attribute(const struct soap_dom_attribute *att); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_next_element(const struct soap_dom_element *elt, const struct soap_dom_element *end); /* DOM deep search */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_find(struct soap_dom_element *begin, const struct soap_dom_element *end, const char *ns, const char *patt, int type); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_find_next(const struct soap_dom_element *elt, const struct soap_dom_element *end, const char *ns, const char *patt, int type); #endif #if defined(__cplusplus) } /* extern "C" */ #endif #ifndef WITH_LEANER #ifdef __cplusplus class SOAP_CMAC soap_dom_attribute_iterator { public: struct soap_dom_attribute *iter; 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; struct soap_dom_attribute *operator->() const; soap_dom_attribute_iterator& operator++(); soap_dom_attribute_iterator operator++(int); soap_dom_attribute_iterator(); soap_dom_attribute_iterator(struct soap_dom_attribute*); ~soap_dom_attribute_iterator(); }; #endif #endif #ifndef WITH_LEANER struct SOAP_CMAC soap_dom_attribute { struct soap_dom_attribute *next; const char *nstr; const char *name; const char *text; struct soap *soap; #ifdef __cplusplus typedef soap_dom_attribute_iterator iterator; soap_dom_attribute(struct soap *soap = NULL); soap_dom_attribute(const soap_dom_attribute& att); soap_dom_attribute(struct soap *soap, const char *tag); soap_dom_attribute(struct soap *soap, const wchar_t *tag); soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const char *text); soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const wchar_t *text); soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const char *text); soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const wchar_t *text); soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const std::string& text); soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const std::wstring& text); soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const std::string& text); soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const std::wstring& text); ~soap_dom_attribute(); soap_dom_attribute& set(const char *ns, const char *tag) { return *soap_att_set(this, ns, tag); } soap_dom_attribute& set(const char *ns, const wchar_t *tag) { return *soap_att_set_w(this, ns, tag); } soap_dom_attribute& set(bool b) { return *soap_att_bool(this, b); } soap_dom_attribute& set(int n) { return *soap_att_int(this, n); } soap_dom_attribute& set(LONG64 n) { return *soap_att_int(this, n); } soap_dom_attribute& set(float x) { return *soap_att_double(this, x); } soap_dom_attribute& set(double x) { return *soap_att_double(this, x); } soap_dom_attribute& set(const char *text) { return *soap_att_text(this, text); } soap_dom_attribute& set(const wchar_t *text) { return *soap_att_text_w(this, text); } #ifndef WITH_COMPAT soap_dom_attribute& set(const std::string& text) { return *soap_att_text(this, text.c_str()); } soap_dom_attribute& set(const std::wstring& text) { return *soap_att_text_w(this, text.c_str()); } #endif soap_dom_attribute& operator=(bool b) { return *soap_att_bool(this, b); } soap_dom_attribute& operator=(int n) { return *soap_att_int(this, n); } soap_dom_attribute& operator=(LONG64 n) { return *soap_att_int(this, n); } soap_dom_attribute& operator=(float x) { return *soap_att_double(this, x); } soap_dom_attribute& operator=(double x) { return *soap_att_double(this, x); } soap_dom_attribute& operator=(const char *text) { return *soap_att_text(this, text); } soap_dom_attribute& operator=(const wchar_t *text) { return *soap_att_text_w(this, text); } #ifndef WITH_COMPAT soap_dom_attribute& operator=(const std::string& text) { return *soap_att_text(this, text.c_str()); } soap_dom_attribute& operator=(const std::wstring& text) { return *soap_att_text_w(this, text.c_str()); } #endif soap_dom_attribute& operator=(const soap_dom_attribute& att) { return *soap_att_copy(this, &att); } soap_dom_attribute& att(const char *tag) { return *soap_att_add(this, NULL, tag); } soap_dom_attribute& att(const wchar_t *tag) { return *soap_att_add_w(this, NULL, tag); } soap_dom_attribute& att(const char *ns, const char *tag) { return *soap_att_add(this, ns, tag); } soap_dom_attribute& att(const char *ns, const wchar_t *tag) { return *soap_att_add_w(this, ns, tag); } bool match(const char *patt) const { return soap_att_match(this, NULL, patt) != 0; } bool match(const wchar_t *patt) const { return soap_att_match_w(this, NULL, patt) != 0; } bool match(const char *ns, const char *patt) const { return soap_att_match(this, ns, patt) != 0; } bool match(const char *ns, const wchar_t *patt) const { return soap_att_match_w(this, ns, patt) != 0; } const char *ns() const { return this->nstr; } const char *tag() const { return this->name; } bool is_true() const { return soap_att_is_true(this) != 0; } bool is_false() const { return soap_att_is_false(this) != 0; } LONG64 get_int() const { return soap_att_get_LONG64(this); } double get_double() const { return soap_att_get_double(this); } const char *get_text() const { return this->text; } operator bool() const { return soap_att_is_true(this) != 0; } operator int() const { return soap_att_get_int(this); } operator LONG64() const { return soap_att_get_LONG64(this); } operator double() const { return soap_att_get_double(this); } operator const char*() const { return this->text; } soap_dom_attribute_iterator att_begin() { return soap_dom_attribute_iterator(this); } soap_dom_attribute_iterator att_end() { return soap_dom_attribute_iterator(NULL); } soap_dom_attribute_iterator att_find(const char *patt) { return att_find(NULL, patt); } soap_dom_attribute_iterator att_find(const wchar_t *patt) { return att_find(NULL, patt); } soap_dom_attribute_iterator att_find(const char *ns, const char *patt); soap_dom_attribute_iterator att_find(const char *ns, const wchar_t *patt); void unlink(); #endif }; #endif #ifndef WITH_LEANER #ifdef __cplusplus class SOAP_CMAC soap_dom_element_iterator { public: struct soap_dom_element *iter; struct soap_dom_element *stop; const char *nstr; const char *name; int type; bool deep; bool operator==(const soap_dom_element_iterator&) const; bool operator!=(const soap_dom_element_iterator&) const; struct soap_dom_element& operator*() const; struct soap_dom_element *operator->() const; soap_dom_element_iterator& operator++(); soap_dom_element_iterator operator++(int); soap_dom_element_iterator(); soap_dom_element_iterator(struct soap_dom_element*); ~soap_dom_element_iterator(); }; #endif #endif #ifndef WITH_LEANER struct SOAP_CMAC soap_dom_element { struct soap_dom_element *next; struct soap_dom_element *prnt; struct soap_dom_element *elts; struct soap_dom_attribute *atts; const char *nstr; const char *name; const char *lead; const char *text; const char *code; const char *tail; const void *node; int type; struct soap *soap; #ifdef __cplusplus typedef soap_dom_element_iterator iterator; soap_dom_element(struct soap *soap = NULL); soap_dom_element(const soap_dom_element& elt); soap_dom_element(struct soap *soap, const char *tag); soap_dom_element(struct soap *soap, const wchar_t *tag); soap_dom_element(struct soap *soap, const char *ns, const char *tag); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag); soap_dom_element(struct soap *soap, const char *ns, const char *tag, const char *text); soap_dom_element(struct soap *soap, const char *ns, const char *tag, const wchar_t *text); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const char *text); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const wchar_t *text); #ifndef WITH_COMPAT soap_dom_element(struct soap *soap, const char *ns, const char *tag, const std::string& text); soap_dom_element(struct soap *soap, const char *ns, const char *tag, const std::wstring& text); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const std::string& text); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const std::wstring& text); #endif soap_dom_element(struct soap *soap, const char *ns, const char *tag, const void *node, int type); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const void *node, int type); ~soap_dom_element(); soap_dom_element& set(const char *ns, const char *tag) { return *soap_elt_set(this, ns, tag); } soap_dom_element& set(const char *ns, const wchar_t *tag) { return *soap_elt_set_w(this, ns, tag); } soap_dom_element& set(bool b) { return *soap_elt_bool(this, b); } soap_dom_element& set(int n) { return *soap_elt_int(this, n); } soap_dom_element& set(LONG64 n) { return *soap_elt_int(this, n); } soap_dom_element& set(float x) { return *soap_elt_double(this, x); } soap_dom_element& set(double x) { return *soap_elt_double(this, x); } soap_dom_element& set(const char *text) { return *soap_elt_text(this, text); } soap_dom_element& set(const wchar_t *text) { return *soap_elt_text_w(this, text); } #ifndef WITH_COMPAT soap_dom_element& set(const std::string& text) { return *soap_elt_text(this, text.c_str()); } soap_dom_element& set(const std::wstring& text) { return *soap_elt_text_w(this, text.c_str()); } #endif soap_dom_element& set(const void *node, int type) { return *soap_elt_node(this, node, type); } soap_dom_element& add(soap_dom_element& elt) { return *soap_add_elt(this, &elt); } soap_dom_element& add(soap_dom_element *elt) { return *soap_add_elt(this, elt); } soap_dom_element& add(soap_dom_attribute& att) { return *soap_add_att(this, &att); } soap_dom_element& add(soap_dom_attribute *att) { return *soap_add_att(this, att); } soap_dom_element& adds(soap_dom_element& elts) { return *soap_add_elts(this, &elts); } soap_dom_element& adds(soap_dom_element *elts) { return *soap_add_elts(this, elts); } soap_dom_element& adds(soap_dom_attribute& atts) { return *soap_add_atts(this, &atts); } soap_dom_element& adds(soap_dom_attribute *atts) { return *soap_add_atts(this, atts); } soap_dom_element& operator=(bool b) { return *soap_elt_bool(this, b); } soap_dom_element& operator=(int n) { return *soap_elt_int(this, n); } soap_dom_element& operator=(LONG64 n) { return *soap_elt_int(this, n); } soap_dom_element& operator=(float x) { return *soap_elt_double(this, x); } soap_dom_element& operator=(double x) { return *soap_elt_double(this, x); } soap_dom_element& operator=(const char *text) { return *soap_elt_text(this, text); } soap_dom_element& operator=(const wchar_t *text) { return *soap_elt_text_w(this, text); } #ifndef WITH_COMPAT soap_dom_element& operator=(const std::string& text) { return *soap_elt_text(this, text.c_str()); } soap_dom_element& operator=(const std::wstring& text) { return *soap_elt_text_w(this, text.c_str()); } #endif soap_dom_element& operator=(const soap_dom_element& elt) { return *soap_elt_copy(this, &elt); } template soap_dom_element& operator=(const T& node) { return this->set(&node, node.soap_type()); } template soap_dom_element& operator=(const T *node) { return this->set(node, node->soap_type()); } template soap_dom_element& operator=(T *node) { return this->set(node, node->soap_type()); } soap_dom_attribute& att(const char *tag) { return *soap_att(this, NULL, tag); } soap_dom_attribute& att(const wchar_t *tag) { return *soap_att_w(this, NULL, tag); } soap_dom_attribute& att(const char *ns, const char *tag) { return *soap_att(this, ns, tag); } soap_dom_attribute& att(const char *ns, const wchar_t *tag) { return *soap_att_w(this, ns, tag); } soap_dom_element& elt() { return *soap_elt(this, NULL, NULL); } soap_dom_element& elt(const char *tag) { return *soap_elt(this, NULL, tag); } soap_dom_element& elt(const wchar_t *tag) { return *soap_elt_w(this, NULL, tag); } soap_dom_element& elt(const char *ns, const char *tag) { return *soap_elt(this, ns, tag); } soap_dom_element& elt(const char *ns, const wchar_t *tag) { return *soap_elt_w(this, ns, tag); } soap_dom_element& operator[](const char *tag) { return *soap_elt(this, NULL, tag); } soap_dom_element& operator[](const wchar_t *tag) { return *soap_elt_w(this, NULL, tag); } soap_dom_element& operator[](size_t n) { return *soap_nth(this, n); } soap_dom_attribute *att_get(const char *tag) const { return soap_att_get(this, NULL, tag); } soap_dom_attribute *att_get(const wchar_t *tag) const { return soap_att_get_w(this, NULL, tag); } soap_dom_attribute *att_get(const char *ns, const char *tag) const { return soap_att_get(this, ns, tag); } soap_dom_attribute *att_get(const char *ns, const wchar_t *tag) const { return soap_att_get_w(this, ns, tag); } soap_dom_element *elt_get() const { return soap_elt_get(this, NULL, NULL); } soap_dom_element *elt_get(const char *tag) const { return soap_elt_get(this, NULL, tag); } soap_dom_element *elt_get(const wchar_t *tag) const { return soap_elt_get_w(this, NULL, tag); } soap_dom_element *elt_get(const char *ns, const char *tag) const { return soap_elt_get(this, ns, tag); } soap_dom_element *elt_get(const char *ns, const wchar_t *tag) const { return soap_elt_get_w(this, ns, tag); } soap_dom_element *get_next() const { return soap_elt_get_next(this); } soap_dom_element *get_nth(size_t n) { return soap_elt_get_nth(this, n); } bool match(const char *patt) const { return soap_elt_match(this, NULL, patt) != 0; } bool match(const wchar_t *patt) const { return soap_elt_match_w(this, NULL, patt) != 0; } bool match(const char *ns, const char *patt) const { return soap_elt_match(this, ns, patt) != 0; } bool match(const char *ns, const wchar_t *patt) const { return soap_elt_match_w(this, ns, patt) != 0; } const char *ns() const { return this->nstr; } const char *tag() const { return this->name; } soap_dom_element *parent() { return this->prnt; } size_t depth() const { return soap_elt_depth(this); } size_t index() const { return soap_elt_index(this); } size_t len() const { return soap_elt_len(this); } size_t nth() const { return soap_elt_nth(this); } size_t elt_size() { return soap_elt_size(this, NULL, NULL); } size_t elt_size(const char *patt, int type = 0) { return elt_size(NULL, patt, type); } size_t elt_size(const char *ns, const char *patt, int type = 0) { return soap_elt_size_type(this, ns, patt, type); } size_t att_size() { return soap_att_size(this, NULL, NULL); } size_t att_size(const char *patt) { return att_size(NULL, patt); } #ifndef WITH_COMPAT size_t att_size(const std::string& patt) { return att_size(NULL, patt); } #endif size_t att_size(const char *ns, const char *patt) { return soap_att_size(this, ns, patt); } #ifndef WITH_COMPAT size_t att_size(const char *ns, const std::string& patt) { return soap_att_size(this, ns, patt.c_str()); } #endif bool is_true() const { return soap_elt_is_true(this) != 0; } bool is_false() const { return soap_elt_is_false(this) != 0; } LONG64 get_int() const { return soap_elt_get_LONG64(this); } double get_double() const { return soap_elt_get_double(this); } const char *get_text() const { return this->text; } const void *get_node(int type) const { return soap_elt_get_node(this, type); } int get_type(const void **node) const { return soap_elt_get_type(this, node); } operator bool() const { return soap_elt_is_true(this) != 0; } operator int() const { return soap_elt_get_int(this); } operator LONG64() const { return soap_elt_get_LONG64(this); } operator double() const { return soap_elt_get_double(this); } operator const char*() const { return this->text; } soap_dom_element_iterator begin(); soap_dom_element_iterator end() { return soap_dom_element_iterator(NULL); } soap_dom_element_iterator elt_begin() { return soap_dom_element_iterator(this->elts); } soap_dom_element_iterator elt_end() { return soap_dom_element_iterator(NULL); } soap_dom_attribute_iterator att_begin() { return soap_dom_attribute_iterator(this->atts); } soap_dom_attribute_iterator att_end() { return soap_dom_attribute_iterator(NULL); } soap_dom_element_iterator find(const char *patt, int type = 0) { return find(NULL, patt, type); } soap_dom_element_iterator find(const wchar_t *patt, int type = 0) { return find(NULL, patt, type); } soap_dom_element_iterator find(const char *ns, const char *patt, int type = 0); soap_dom_element_iterator find(const char *ns, const wchar_t *patt, int type = 0); soap_dom_element_iterator find(int type); soap_dom_element_iterator elt_find(const char *patt, int type = 0) { return elt_find(NULL, patt, type); } soap_dom_element_iterator elt_find(const wchar_t *patt, int type = 0) { return elt_find(NULL, patt, type); } soap_dom_element_iterator elt_find(const char *ns, const char *patt, int type = 0); soap_dom_element_iterator elt_find(const char *ns, const wchar_t *patt, int type = 0); soap_dom_element_iterator elt_find(int type); soap_dom_attribute_iterator att_find(const char *patt) { return att_find(NULL, patt); } soap_dom_attribute_iterator att_find(const wchar_t *patt) { return att_find(NULL, patt); } soap_dom_attribute_iterator att_find(const char *ns, const char *patt); soap_dom_attribute_iterator att_find(const char *ns, const wchar_t *patt); void unlink(); #endif }; #endif #ifndef WITH_LEANER SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dup_xsd__anyType(struct soap *soap, struct soap_dom_element *d, const struct soap_dom_element *a); SOAP_FMAC1 void SOAP_FMAC2 soap_del_xsd__anyType(const struct soap_dom_element *a); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_dup_xsd__anyAttribute(struct soap *soap, struct soap_dom_attribute *d, const struct soap_dom_attribute *a); SOAP_FMAC1 void SOAP_FMAC2 soap_del_xsd__anyAttribute(const struct soap_dom_attribute *a); SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element *in, struct soap_dom_element *out); #endif #ifndef WITH_LEANER #if defined(__cplusplus) && !defined(WITH_COMPAT) extern std::ostream &operator<<(std::ostream&, const struct soap_dom_element&); extern std::istream &operator>>(std::istream&, struct soap_dom_element&); SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element& in, struct soap_dom_element& out); SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element *in, struct soap_dom_element& out); SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element& in, struct soap_dom_element *out); #endif #endif #if defined(__cplusplus) extern "C" { #endif /******************************************************************************/ struct SOAP_CMAC 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), 0 indicates non-SOAP content */ soap_mode mode; /* internal mode flag, combines imode/omode */ soap_mode imode; /* input mode flag set with soap_init1(), soap_new1(), or soap_set_imode() */ soap_mode omode; /* ouput mode flag set with soap_init1(), soap_new1(), or soap_set_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 *long_double_format;/* user-definable format string for long doubles (<1024 chars) */ const char *dime_id_format; /* user-definable format string for integer DIME id ( 0, sets max message size that can be received */ int recv_timeout; /* user-definable, when > 0, sets socket recv stall timeout in seconds, < 0 in usec */ int send_timeout; /* user-definable, when > 0, sets socket send stall timeout in seconds, < 0 in usec */ int transfer_timeout; /* user-definable, when > 0, sets socket total transfer timeout in seconds, < 0 in usec */ int connect_timeout; /* user-definable, when > 0, sets socket connect() timeout in seconds, < 0 in usec */ int accept_timeout; /* user-definable, when > 0, sets socket accept() timeout in seconds, < 0 in usec */ int socket_flags; /* user-definable socket recv() and send() flags, e.g. set to MSG_NOSIGNAL to disable sigpipe */ int connect_flags; /* user-definable connect() SOL_SOCKET sockopt flags, e.g. set to SO_DEBUG to debug socket */ int connect_retry; /* number of times to retry connecting (exponential backoff), zero by default */ int bind_flags; /* user-definable bind() SOL_SOCKET sockopt flags, e.g. set to SO_REUSEADDR to enable reuse */ short bind_inet6; /* user-definable, when > 0 use AF_INET6 instead of PF_UNSPEC (only with -DWITH_IPV6) */ short bind_v6only; /* user-definable, when > 0 use IPPROTO_IPV6 sockopt IPV6_V6ONLY (only with -DWITH_IPV6) */ int accept_flags; /* user-definable accept() SOL_SOCKET sockopt flags */ #ifdef WITH_SELF_PIPE int pipe_fd[2]; /* self pipe trick file descriptors used to close the select call from another thread */ #endif int sndbuf; /* user-definable SO_SNDBUF setsockopt value */ int rcvbuf; /* user-definable SO_RCVBUF setsockopt value */ unsigned short linger_time; /* user-definable linger time for SO_LINGER option */ unsigned int maxlevel; /* user-definable max XML nesting depth levels, initialized to SOAP_MAXLEVEL */ long maxlength; /* user-definable max string length, initialized to SOAP_MAXLENGTH, maxlength<=0 is unbounded */ size_t maxoccurs; /* user-definable max array/container size, initialized to SOAP_MAXOCCURS */ const char *http_version; /* HTTP version used "1.0" or "1.1" */ const char *http_content; /* optional custom HTTP content type (with SOAP_PUT, SOAP_POST_FILE, SOAP_FILE) */ const char *http_extra_header;/* optional custom HTTP header of the form 'key: val' (multiple headers should be separated in the string by \r\n - crlf) */ const char *encodingStyle; /* default = "" which means that SOAP encoding is used */ const char *actor; /* SOAP-ENV:actor or role attribute value */ const char *lang; /* user-definable xml:lang attribute value of SOAP-ENV:Text */ 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 */ #if !defined(WITH_LEANER) || !defined(WITH_NOIDREF) struct soap_ilist *iht[SOAP_IDHASH]; #endif struct soap_plist *pht[SOAP_PTRHASH]; struct soap_pblk *pblk; /* plist block allocation */ short pidx; /* plist block allocation */ short shaky; /* objects in reallocatable containers are on shaky grounds */ struct SOAP_ENV__Header *header; struct SOAP_ENV__Fault *fault; int idnum; void *user; /* for user to pass user-defined data to callbacks */ void *data[4]; /* extension data = {smdevp, mecevp, ...} */ struct soap_plugin *plugins; /* linked list of plug-in data */ const char *bearer; /* HTTP authorization bearer token value */ const char *userid; /* HTTP Basic authorization userid */ const char *passwd; /* HTTP Basic authorization passwd */ const char *authrealm; /* HTTP authentication realm (and NTLM domain) */ #if !defined(WITH_LEAN) || defined(WITH_NTLM) const char *ntlm_challenge; /* HTTP NTLM challenge key string */ short ntlm_auth; /* HTTP NTLM authentication type */ #endif int (*fpost)(struct soap*, const char*, const char*, int, const char*, const char*, ULONG64); int (*fget)(struct soap*); /* HTTP GET hook (not set by default) */ int (*fput)(struct soap*); /* HTTP PUT hook (handled as POST by default) */ int (*fpatch)(struct soap*); /* HTTP PATCH hook (handled as POST by default) */ int (*fdel)(struct soap*); /* HTTP DELETE hook (not set by default) */ int (*fopt)(struct soap*); /* HTTP OPTIONS hook (not set by default) */ int (*fhead)(struct soap*); /* HTTP HEAD hook (not set by default) */ int (*fform)(struct soap*); /* HTTP/HTML form handler for plugins */ int (*fposthdr)(struct soap*, const char*, const char*); int (*fresponse)(struct soap*, int, ULONG64); 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*); #ifndef WITH_LEANER int (*fsvalidate)(struct soap*, const char*, const char*); int (*fwvalidate)(struct soap*, const char*, const wchar_t*); int (*feltbegin)(struct soap*, const char*); int (*feltendin)(struct soap*, const char*, const char*); int (*feltbegout)(struct soap*, const char*, int, const char*); int (*feltendout)(struct soap*, const char*); int (*fprepareinitsend)(struct soap*); int (*fprepareinitrecv)(struct soap*); int (*fpreparesend)(struct soap*, const char*, size_t); int (*fpreparerecv)(struct soap*, const char*, size_t); int (*fpreparefinalsend)(struct soap*); int (*fpreparefinalrecv)(struct soap*); int recverror; /* last soap_recv_raw error code for filterrecv */ int (*ffiltersend)(struct soap*, const char**, size_t*); int (*ffilterrecv)(struct soap*, char*, size_t*, size_t); 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; /* socket bound to TCP/IP port */ SOAP_SOCKET socket; /* socket to send and receive */ SOAP_SOCKET sendsk; /* socket to send (overrides ::socket) */ SOAP_SOCKET recvsk; /* socket to receive (overrides ::socket) */ #if defined(__cplusplus) && !defined(WITH_COMPAT) std::ostream *os; /* C++ only: ostream to send */ std::istream *is; /* C++ only: istream to receive */ #else const char **os; /* C only: pointer to a const char*, will be set to point to the string output */ const char *is; /* C only: a const char* to read from (soap->is will advance) */ #endif #ifndef UNDER_CE int sendfd; /* int file descriptor for sending */ int recvfd; /* int file descriptor for receiving */ #else FILE *sendfd; /* WinCE FILE* to send */ FILE *recvfd; /* WinCE FILE* to receive */ #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; /* HTTP or XML element has a body (1) or not (0) */ unsigned int level; /* XML nesting level */ #ifndef WITH_LEAN ULONG64 start; /* start time of send/recv (value cast to time_t) */ #endif ULONG64 count; /* message length counter */ ULONG64 length; /* message length as was set by HTTP header received */ 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[SOAP_TMPLEN]; /* in/out buffer for HTTP/MIME headers and short messages, must be >=1024 bytes */ char tmpbuf[SOAP_TMPLEN]; /* 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]; int position; int positions[SOAP_MAXDIMS]; struct soap_attribute *attributes; /* attribute list */ short other; short root; 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; /* zero to output all xmlns */ short part; /* SOAP part state (header or body) */ short event; /* engine events and states for use by plugins */ short peeked; unsigned int evlev; /* event level */ int alloced; size_t chunksize; size_t chunkbuflen; char endpoint[SOAP_TAGLEN]; char path[SOAP_TAGLEN]; char host[SOAP_TAGLEN]; char *action; /* SOAPAction string */ const char *prolog; /* XML declaration prolog */ unsigned int ip; /* IP number retrieved from request */ unsigned int ip6[4]; /* same for IPv6: upper in ip6[0] to lower in ip6[3] requires WITH_IPV6 */ int port; /* port number */ const char *override_host; /* to override the client-side host name/IP when connecting */ int override_port; /* to override client-side port number when connecting */ int keep_alive; /* connection should be kept open (-1, 0, or counts down) */ int 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 */ int max_keep_alive; /* maximum keep-alive session (default=100) 0 to always keep open */ 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 */ const char *origin; /* Origin header received */ const char *cors_origin; /* CORS Allow-Origin header returned by server */ const char *cors_allow; /* CORS Allow-Origin header default value of "*" */ const char *cors_method; /* CORS Request-Method header received */ const char *cors_header; /* CORS Request-Headers header received */ const char *cors_methods; /* CORS Allow-Methods header returned by server */ const char *cors_headers; /* CORS Allow-Headers header returned by server */ const char *x_frame_options; /* "DENY", "SAMEORIGIN" (default), or "ALLOW-FROM uri" */ int status; /* HTTP status code, HTTP method, or other error code */ 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 const char *logfile[SOAP_MAXLOGS]; FILE *fdebug[SOAP_MAXLOGS]; struct soap_mlist *mht[SOAP_PTRHASH]; #ifndef WITH_LEAN const char *wsuid; /* space-separated string of element tags */ const char *c14nexclude; /* space-separated string of prefixes for c14n exclusion */ const char *c14ninclude; /* space-separated string of prefixes for c14n inclusion */ #endif struct soap_cookie *cookies; const char *cookie_domain; const char *cookie_path; int cookie_max; #ifndef WITH_NOIO unsigned int ipv6_multicast_if; /* in_addr_t in6addr->sin6_scope_id IPv6 value */ char* ipv4_multicast_if; /* IP_MULTICAST_IF IPv4 setsockopt interface_addr */ unsigned char ipv4_multicast_ttl; /* IP_MULTICAST_TTL value 0..255 */ const char *client_addr; /* when non-NULL, client binds to this address before connect */ const char *client_addr_ipv6; /* WITH_IPV6: when non-NULL and client_addr is non-NULL and when connecting to a IPv6 server, client binds to this IPv6 address instead of client_addr */ int client_port; /* when nonnegative, client binds to this port before connect */ const char *client_interface; /* when non-NULL, override client-side interface address using this address */ union { struct sockaddr addr; struct sockaddr_in in; struct sockaddr_storage storage; } peer; /* set by soap_connect/soap_accept and by UDP recv */ size_t peerlen; #endif #if defined(WITH_OPENSSL) /* OpenSSL */ int (*fsslauth)(struct soap*); int (*fsslverify)(int, X509_STORE_CTX*); BIO *bio; SSL *ssl; SSL_CTX *ctx; SSL_SESSION *session; const char *dhfile; const char *randfile; #elif defined(WITH_GNUTLS) /* GNUTLS */ int (*fsslauth)(struct soap*); void *fsslverify; gnutls_certificate_credentials_t xcred; /* cert pointer */ gnutls_anon_client_credentials_t acred; /* anon pointer */ gnutls_priority_t cache; /* priority cache pointer */ gnutls_session_t session; /* session pointer */ gnutls_dh_params_t dh_params; gnutls_rsa_params_t rsa_params; #elif defined(WITH_SYSTEMSSL) /* SYSTEM SSL */ int (*fsslauth)(struct soap*); void *fsslverify; /* N/A */ void *bio; /* N/A */ gsk_handle ctx; /* environment */ gsk_handle ssl; /* ssl socket */ void *session; /* N/A */ const char *dhfile; /* N/A */ const char *randfile; /* N/A */ #else /* No SSL/TLS */ void *fsslauth; /* dummy members, to preserve struct size */ void *fsslverify; void *bio; void *ssl; void *ctx; void *session; void *dh_params; void *rsa_params; #endif unsigned short ssl_flags; const char *keyfile; const char *keyid; const char *password; const char *cafile; const char *capath; const char *crlfile; char session_host[SOAP_TAGLEN]; int session_port; #ifdef SOAP_LOCALE_T SOAP_LOCALE_T c_locale; /* if this does not compile, use ./configure --enable-xlocale or compile with -DWITH_INCLUDE_XLOCALE_H, or use -DWITH_NO_C_LOCALE to disable locale support */ #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 const char *z_dict; /* support for zlib static dictionaries */ unsigned int z_dict_len; 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 /* vxWorks compatibility */ void *rpmreqid; #endif #ifdef __cplusplus soap(); soap(soap_mode); soap(soap_mode, soap_mode); soap(const struct soap&); struct soap& operator=(const struct soap&); void destroy(); ~soap(); /* no virtual methods, so sizeof(soap) should be the same in C and C++ */ #endif }; struct soap_code_map { LONG64 code; const char *string; }; /* forwarding list */ struct soap_flist { struct soap_flist *next; int type; void *ptr; unsigned int level; size_t index; void (*finsert)(struct soap*, int, int, void*, size_t, const void*, void**); }; /* id-ref forwarding list */ struct soap_ilist { struct soap_ilist *next; int type; size_t size; void *ptr; void **spine; void *link; void *copy; struct soap_flist *flist; void *smart; short shaky; 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) */ }; extern SOAP_NMAC struct Namespace namespaces[]; #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_versioning_paste(name, ext) name##_REQUIRE_lib_v##ext #define soap_versioning_ext(name, ext) soap_versioning_paste(name, ext) #define soap_versioning(name) soap_versioning_ext(name, GSOAP_VERSION) #define soap_init(soap) soap_init1(soap, SOAP_IO_DEFAULT) #define soap_init1(soap, mode) soap_init2(soap, mode, mode) #define soap_init2(soap, imode, omode) soap_versioning(soap_init)(soap, imode, omode) #define soap_new() soap_new1(SOAP_IO_DEFAULT) #define soap_new1(mode) soap_new2(mode, mode) #define soap_new2(imode, omode) soap_versioning(soap_new)(imode, omode) #define soap_revget1(soap) ((soap)->bufidx--) #define soap_unget(soap, c) ((soap)->ahead = c) #define soap_peek(soap) ((soap)->ahead = soap_get(soap)) #define soap_register_plugin(soap, plugin) soap_register_plugin_arg(soap, plugin, NULL) #define soap_mode(soap, n) ((soap)->mode = (soap)->imode = (soap)->omode = (n)) #define soap_imode(soap, n) ((soap)->imode = (n)) #define soap_omode(soap, n) ((soap)->omode = (n)) #define soap_set_imode(soap, n) ((soap)->imode |= (n)) #define soap_clr_imode(soap, n) ((soap)->imode &= ~(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)->mode |= (n), (soap)->imode |= (n), (soap)->omode |= (n)) #define soap_clr_mode(soap, n) ((soap)->mode &= ~(n), (soap)->imode &= ~(n), (soap)->omode &= ~(n)) #define soap_destroy(soap) soap_delete((soap), NULL) #define SOAP_NO_LINK_TO_DELETE (-2) /* pass to soap_link() as size n: do not manage, smart pointers are self-managing */ #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*, char**, int); #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*, char**, int); #endif #if defined(WIN32) && !defined(__MINGW32__) && !defined(__MINGW64__) && !defined(__BORLANDC__) # define soap_strtoll _strtoi64 #elif defined(HAVE_STRTOLL) && !defined(soap_strtoll) # define soap_strtoll strtoll #elif !defined(soap_strtoll) SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_strtoll(const char*, char**, int); #endif #if defined(WIN32) && !defined(__MINGW32__) && !defined(__MINGW64__) && !defined(__BORLANDC__) # define soap_strtoull _strtoui64 #elif defined(HAVE_STRTOULL) && !defined(soap_strtoull) # define soap_strtoull strtoull #elif !defined(soap_strtoull) SOAP_FMAC1 ULONG64 SOAP_FMAC2 soap_strtoull(const char*, char**, int); #endif #if defined(WITH_OPENSSL) # define soap_random soap_rand() SOAP_FMAC1 int SOAP_FMAC2 soap_rand(void); #elif defined(UNDER_CE) # define soap_random (int)Random() #elif defined(HAVE_RANDOM) # define soap_random (int)random() #else # define soap_random rand() #endif #ifdef WITH_NOIDREF # define soap_embedded(s, p, t) ((void)(s), 0) # define soap_id_lookup(s, i, p, t, n, k, fb) ((void)(s), (p)) # define soap_id_forward(s, h, p, i, t, tt, n, k, fi, fb) ((void)(s), (p)) # define soap_id_nullify(s, i) ((void)(s), (i)) # define soap_reference(s, a, t) ((void)(s), 1) # define soap_array_reference(s, p, a, n, t) ((void)(s), 1) # define soap_attachment_reference(s, p, a, n, t, i, y) ((void)(s), 1) # define soap_embed(s, p, a, n, t) ((void)(s), 0) # define soap_embedded_id(s, i, p, t) ((void)(s), (void)(t), i) # define soap_is_embedded(s, p) ((void)(s), 0) # define soap_is_single(s, p) ((void)(s), 1) # define soap_lookup_type(s, i) ((void)(s), 0) # define soap_getindependent(s) ((void)(s), 0) # define soap_putindependent(s) ((void)(s), 0) # define soap_markelement(s, p, t) ((void)(s), 0) # define soap_begin_shaky(s) ((void)(s), 0) # define soap_end_shaky(s, f) ((void)(s), (void)(f), 0) #endif /* soap_traverse() traversal/walker routines take walker function arguments */ typedef void soap_walker(struct soap*, void*, int, const char*, const char*); SOAP_FMAC5 int SOAP_FMAC6 soap_serve(struct soap *soap); SOAP_FMAC5 int SOAP_FMAC6 soap_serve_request(struct soap *soap); SOAP_FMAC1 void SOAP_FMAC2 soap_ssl_init(void); SOAP_FMAC1 void SOAP_FMAC2 soap_ssl_noinit(void); SOAP_FMAC1 int SOAP_FMAC2 soap_GET(struct soap*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_PUT(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_PATCH(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_POST(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_DELETE(struct soap*, const char*); 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 ret, int err); SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_crl(struct soap*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_poll(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_ready(struct soap*); #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid); #else 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); #endif #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *randfile); #else 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); #endif SOAP_FMAC1 const char * SOAP_FMAC2 soap_http_content_type(struct soap *soap, int status); SOAP_FMAC1 int SOAP_FMAC2 soap_puthttphdr(struct soap*, int status, ULONG64 count); SOAP_FMAC1 const char* SOAP_FMAC2 soap_http_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*); #ifndef WITH_LEANER 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_query_send_key(struct soap*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_query_send_val(struct soap*, const char*); SOAP_FMAC1 char * SOAP_FMAC2 soap_query(struct soap*); SOAP_FMAC1 char * SOAP_FMAC2 soap_query_key(struct soap*, char**); SOAP_FMAC1 char * SOAP_FMAC2 soap_query_val(struct soap*, char**); SOAP_FMAC1 const char * SOAP_FMAC2 soap_query_decode(char*, size_t, const char*); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_pututf8(struct soap*, unsigned long); SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getutf8(struct soap*); SOAP_FMAC1 size_t SOAP_FMAC2 soap_utf8len(const char*); 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_attachment_forward(struct soap*, unsigned char**, int*, char**, char**, char**); #endif 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 void *a, int n, int t, struct soap_plist**); SOAP_FMAC1 int SOAP_FMAC2 soap_array_pointer_lookup(struct soap*, const void *p, const void *a, int n, int t, struct soap_plist**); #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_embed(struct soap *soap, const void *p, const void *a, int n, int t); 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*, int t, size_t n); 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 void *a, int n, int t); SOAP_FMAC1 int SOAP_FMAC2 soap_attachment_reference(struct soap *soap, const void *p, const void *a, int n, int t, const char *id, const char *type); 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_check_and_mark(struct soap *soap, const void *p, int t, char **mark); SOAP_FMAC1 void * SOAP_FMAC2 soap_mark_lookup(struct soap *soap, const void *p, int t, struct soap_plist **pp, char **mark); SOAP_FMAC1 int SOAP_FMAC2 soap_mark_cycle(struct soap *soap, struct soap_plist *pp); SOAP_FMAC1 void SOAP_FMAC2 soap_mark_dup(struct soap *soap, void *a, struct soap_plist *pp); SOAP_FMAC1 void SOAP_FMAC2 soap_unmark(struct soap *soap, char *mark); 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 int SOAP_FMAC2 soap_end_send_flush(struct soap*); SOAP_FMAC1 const struct soap_code_map* SOAP_FMAC2 soap_code(const struct soap_code_map*, const char*); SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_code_int(const struct soap_code_map*, const char*, LONG64); SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_str(const struct soap_code_map*, long); SOAP_FMAC1 LONG64 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_binary_search_string(const char**, int, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_getline(struct soap*, char*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_begin_serve(struct soap*); 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*, int, int, int (*fdelete)(struct soap*, struct soap_clist*)); SOAP_FMAC1 int 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 short SOAP_FMAC2 soap_begin_shaky(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_end_shaky(struct soap*, short); SOAP_FMAC1 void* SOAP_FMAC2 soap_id_lookup(struct soap*, const char *id, void **p, int t, size_t n, unsigned int k, int (*fbase)(int, int)); SOAP_FMAC1 void* SOAP_FMAC2 soap_id_forward(struct soap*, const char *id, void *p, size_t i, int t, int tt, size_t n, unsigned int k, void(*finsert)(struct soap*, int, int, void*, size_t, const void*, void**), int (*fbase)(int, int)); SOAP_FMAC1 int SOAP_FMAC2 soap_id_nullify(struct soap*, const char*); #endif SOAP_FMAC1 void* SOAP_FMAC2 soap_id_enter(struct soap*, const char *id, void *p, int t, size_t n, const char *type, const char *arrayType, void *(*finstantiate)(struct soap*, int, const char*, const char*, size_t*), int (*fbase)(int, int)); SOAP_FMAC1 void** SOAP_FMAC2 soap_id_smart(struct soap *soap, const char*, int t, size_t n); SOAP_FMAC1 size_t SOAP_FMAC2 soap_size(const int *, int); SOAP_FMAC1 size_t SOAP_FMAC2 soap_getsizes(const char *, int *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_getoffsets(const char *, const int *, int *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_getposition(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_putoffsets(struct soap*, const int *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_closesock(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_force_closesock(struct soap*); SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_versioning(soap_new)(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_free_stream(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_versioning(soap_init)(struct soap*, soap_mode, soap_mode); SOAP_FMAC1 void SOAP_FMAC2 soap_initialize(struct soap*); 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*); SOAP_FMAC1 void SOAP_FMAC2 soap_delegate_deletion(struct soap*, struct soap*); #ifdef WITH_SELF_PIPE SOAP_FMAC1 void SOAP_FMAC2 soap_close_connection(struct soap*); #endif /* API functions available with DEBUG or SOAP_DEBUG defined: */ 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); /* */ 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_att(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_start_end_out(struct soap*, const char *tag); 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_empty(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_element_nil(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_element_id(struct soap*, const char *tag, int id, const void *p, const void *a, int n, const char *type, int t, char **mark); 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_end(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 int SOAP_FMAC2 soap_ignore(struct soap*); SOAP_FMAC1 void* SOAP_FMAC2 soap_memdup(struct soap*, const void*, size_t); 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 char* SOAP_FMAC2 soap_strtrim(struct soap*, char*); SOAP_FMAC1 wchar_t* SOAP_FMAC2 soap_wstrtrim(struct soap*, wchar_t*); SOAP_FMAC1 const char * SOAP_FMAC2 soap_tagsearch(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, const char*); #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, const char*); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_match_namespace(struct soap*, const char *, const char*, size_t n1, size_t n2); SOAP_FMAC1 void SOAP_FMAC2 soap_set_version(struct soap*, short); 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 struct soap_nlist* SOAP_FMAC2 soap_push_namespace(struct soap*, const char *,const char *); SOAP_FMAC1 const char* SOAP_FMAC2 soap_current_namespace_tag(struct soap *soap, const char *tag); SOAP_FMAC1 const char* SOAP_FMAC2 soap_current_namespace_att(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_alloc_block(struct soap*); SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block(struct soap*, struct soap_blist*, size_t); SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block_max(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 void SOAP_FMAC2 soap_update_pointers(struct soap *soap, const char *dst, const char *src, size_t len); SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_out(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_out(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_http_has_body(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_http_skip_body(struct soap*); SOAP_FMAC1 char * SOAP_FMAC2 soap_http_get_body(struct soap*, size_t *len); SOAP_FMAC1 char * SOAP_FMAC2 soap_http_get_form(struct soap*); SOAP_FMAC1 char * SOAP_FMAC2 soap_http_get_body_prefix(struct soap*, size_t *len, const char *prefix); 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*, int check); #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 # ifndef WITH_COMPAT # ifdef __cplusplus SOAP_FMAC1 void SOAP_FMAC2 soap_stream_fault(struct soap*, std::ostream&); SOAP_FMAC1 void SOAP_FMAC2 soap_stream_fault_location(struct soap*, std::ostream&); # endif # 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_s2char(struct soap*, const char*, char**, int, long minlen, long maxlen, const char *pattern); SOAP_FMAC1 int SOAP_FMAC2 soap_s2QName(struct soap*, const char*, char**, long minlen, long maxlen, const char *pattern); #ifndef WITH_COMPAT #ifdef __cplusplus SOAP_FMAC1 int SOAP_FMAC2 soap_s2stdQName(struct soap*, const char*, std::string*, long minlen, long maxlen, const char *pattern); SOAP_FMAC1 int SOAP_FMAC2 soap_s2stdchar(struct soap*, const char*, std::string*, int, long minlen, long maxlen, const char *pattern); SOAP_FMAC1 int SOAP_FMAC2 soap_s2stdwchar(struct soap*, const char*, std::wstring*, int, long minlen, long maxlen, const char *pattern); #endif #endif #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2wchar(struct soap*, const char*, wchar_t**, int, long minlen, long maxlen, const char *pattern); SOAP_FMAC1 int SOAP_FMAC2 soap_s2dateTime(struct soap*, const char*, time_t*); #endif 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); 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); #endif 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*); 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, const char*); 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); #endif #if !defined(WITH_LEAN) || defined(WITH_COOKIES) 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, int, long, long, const char*); 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 void*, int, const char*, const char*, const char*, const char*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_move(struct soap*, ULONG64); SOAP_FMAC1 ULONG64 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*, const 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*, const 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_recv_mime_attachment(struct soap *soap, void *handle); SOAP_FMAC1 int SOAP_FMAC2 soap_match_cid(struct soap*, const char*, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_rand_uuid(struct soap*, 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, int occurs); SOAP_FMAC1 int SOAP_FMAC2 soap_set_attr(struct soap *soap, const char *name, const char *value, int flag); SOAP_FMAC1 void SOAP_FMAC2 soap_clr_attr(struct soap *soap); SOAP_FMAC1 const char* SOAP_FMAC2 soap_extend_url(struct soap *soap, const char*, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_extend_url_query(struct soap *soap, const char*, const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_url_query(struct soap *soap, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_encode_url(const char*, char*, int); SOAP_FMAC1 const char* SOAP_FMAC2 soap_encode_url_string(struct soap*, const char*); #ifdef WITH_COOKIES SOAP_FMAC1 void SOAP_FMAC2 soap_getcookies(struct soap *soap, const char *val); SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_set_cookie(struct soap*, const char*, const char*, const char*, const char*); SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_cookie(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_cookie_env(struct soap*, const char*, const char*, const char*, short); SOAP_FMAC1 const char* SOAP_FMAC2 soap_cookie_value(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_env_cookie_value(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 time_t SOAP_FMAC2 soap_cookie_expire(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_expire(struct soap*, const char*, long, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_secure(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_session(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_clr_cookie_session(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_clr_cookie(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_getenv_cookies(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_free_cookies(struct soap*); SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_copy_cookies(struct soap*, const struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putsetcookies(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_putcookies(struct soap *soap, const char *domain, const char *path, int secure); #endif #ifdef __cplusplus } /* extern "C" */ #endif SOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap*); SOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap*); SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultcode(struct soap*); SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultsubcode(struct soap*); SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultstring(struct soap*); SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultdetail(struct soap*); SOAP_FMAC3 const char * SOAP_FMAC4 soap_fault_subcode(struct soap*); SOAP_FMAC3 const char * SOAP_FMAC4 soap_fault_string(struct soap*); SOAP_FMAC3 const char * SOAP_FMAC4 soap_fault_detail(struct soap*); SOAP_FMAC3 void SOAP_FMAC4 soap_serializefault(struct soap*); SOAP_FMAC3 void SOAP_FMAC4 soap_serializeheader(struct soap*); SOAP_FMAC3 int SOAP_FMAC4 soap_getheader(struct soap*); SOAP_FMAC3 int SOAP_FMAC4 soap_putheader(struct soap*); SOAP_FMAC3 int SOAP_FMAC4 soap_getfault(struct soap*); SOAP_FMAC3 int SOAP_FMAC4 soap_putfault(struct soap*); #ifdef __cplusplus /* C++ templates (for generated C++ only, not needed nor used in generated C code) */ template struct soap_block { static T *push(struct soap *soap, struct soap_blist *b) { if (!b) b = soap->blist; if (!b) return NULL; T *p = (T*)soap_push_block_max(soap, b, sizeof(T)); if (p) SOAP_PLACEMENT_NEW(soap, p, T); return p; } static void pop(struct soap *soap, struct soap_blist *b) { if (!b) b = soap->blist; if (!b || !b->head) return; ((T*)(b->head + 1))->~T(); soap_pop_block(soap, b); } static void save(struct soap *soap, struct soap_blist *b, T *p) { if (!b) b = soap->blist; for (T *q = (T*)soap_first_block(soap, b); q; q = (T*)soap_next_block(soap, b)) { soap_update_pointers(soap, (const char*)p, (const char*)q, sizeof(T)); *p++ = *q; q->~T(); } soap_end_block(soap, b); } static void end(struct soap *soap, struct soap_blist *b) { if (!b) b = soap->blist; for (T *p = (T*)soap_first_block(soap, b); p; p = (T*)soap_next_block(soap, b)) p->~T(); soap_end_block(soap, b); } }; #endif #endif /* STDSOAP_H */ gsoap-2.8.91/gsoap/samples/calc_vs2005/README.txt0000644000175000017500000000201513525245162020463 0ustar ellertellertMicrosoft Visual Studio 2005 project example for the simple calculator service. To create a new gSOAP-based VS2005 project, follow these additional steps: Add a custom-build step to invoke soapcpp2 on the gSOAP header file (xyz.h): Right-button select xyz.h and select Properties In Configuration Propertes select Custom Build Step Command Line: soapcpp2.exe -i -wx -C $(InputFileName) Outputs: soapH.h soapStub.h soapC.cpp IMPORTANT: make sure to compile all sources in C++ compilation mode. If you migrate to a project file .vcproj, please set CompileAs="2" in your .vcproj file. Notes: 1. soapcpp2.exe must be installed as an executable, or you need to copy it to your project directory to enable custom-build step execution. 2. do not #include "xyz.h" in our source code directly, but #include the soapxyzProxy.h (for proxies) or soapH.h file and the .nsmap file The calc_vs2005 executable is a simple console application to invoke the calculator service from the DOS command line: $ calc_vs2005 add 3 4 result = 7 gsoap-2.8.91/gsoap/samples/calc_vs2005/debug/0000755000175000017500000000000013525245162020055 5ustar ellertellertgsoap-2.8.91/gsoap/samples/chaining++/0000755000175000017500000000000013525245200016745 5ustar ellertellertgsoap-2.8.91/gsoap/samples/chaining++/.deps/0000755000175000017500000000000013525245200017756 5ustar ellertellertgsoap-2.8.91/gsoap/samples/chaining++/.deps/soapC.Po0000644000175000017500000000001013525245162021321 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/samples/chaining++/quote.h0000644000175000017500000000046713525245162020271 0ustar ellertellert//gsoap ns service name: quote //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: urn:xmethods-delayed-quotes //gsoap ns service location: http://64.124.140.30:9090/soap //gsoap ns service method-action: getQuote "" int ns__getQuote(char *symbol, float *Result); gsoap-2.8.91/gsoap/samples/chaining++/Makefile.in0000644000175000017500000005112613525245177021034 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = chaining$(EXEEXT) subdir = gsoap/samples/chaining++ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_chaining_OBJECTS = chaining.$(OBJEXT) QuotequoteService.$(OBJEXT) \ CalccalcService.$(OBJEXT) QuoteC.$(OBJEXT) CalcC.$(OBJEXT) \ envC.$(OBJEXT) chaining_OBJECTS = $(am_chaining_OBJECTS) am__DEPENDENCIES_1 = chaining_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/CalcC.Po \ ./$(DEPDIR)/CalccalcService.Po ./$(DEPDIR)/QuoteC.Po \ ./$(DEPDIR)/QuotequoteService.Po ./$(DEPDIR)/chaining.Po \ ./$(DEPDIR)/envC.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(chaining_SOURCES) DIST_SOURCES = $(chaining_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a BUILT_SOURCES = QuotequoteService.cpp CalccalcService.cpp envC.cpp CLEANFILES = *.req.xml *.res.xml *.nsmap *.xsd *.wsdl envStub.h envH.h envC.cpp CalcStub.h CalcH.h CalcC.cpp Calc*Proxy.h Calc*Proxy.cpp Calc*Object.h Calc*Service.h Calc*Service.cpp CalcClient.cpp CalcServer.cpp CalcClientLib.cpp CalcServerLib.cpp QuoteStub.h QuoteH.h QuoteC.cpp Quote*Proxy.h Quote*Proxy.cpp Quote*Object.h Quote*Service.h Quote*Service.cpp QuoteClient.cpp QuoteServer.cpp QuoteClientLib.cpp QuoteServerLib.cpp *~ SOAP_NS = Calc.nsmap chaining_SOURCES = chaining.cpp quote.h calc.h env.h QuotequoteService.cpp CalccalcService.cpp QuoteC.cpp CalcC.cpp envC.cpp chaining_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) -lm all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/chaining++/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/chaining++/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) chaining$(EXEEXT): $(chaining_OBJECTS) $(chaining_DEPENDENCIES) $(EXTRA_chaining_DEPENDENCIES) @rm -f chaining$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(chaining_OBJECTS) $(chaining_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CalcC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CalccalcService.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QuoteC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QuotequoteService.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chaining.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/envC.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/CalcC.Po -rm -f ./$(DEPDIR)/CalccalcService.Po -rm -f ./$(DEPDIR)/QuoteC.Po -rm -f ./$(DEPDIR)/QuotequoteService.Po -rm -f ./$(DEPDIR)/chaining.Po -rm -f ./$(DEPDIR)/envC.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/CalcC.Po -rm -f ./$(DEPDIR)/CalccalcService.Po -rm -f ./$(DEPDIR)/QuoteC.Po -rm -f ./$(DEPDIR)/QuotequoteService.Po -rm -f ./$(DEPDIR)/chaining.Po -rm -f ./$(DEPDIR)/envC.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile envC.cpp: env.h $(SOAP) -CS -penv -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< QuotequoteService.cpp: quote.h $(SOAP) -iS -qQuote -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< CalccalcService.cpp: calc.h $(SOAP) -iS -qCalc -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/chaining++/env.h0000644000175000017500000000213413525245162017715 0ustar ellertellert/* env.h Defines SOAP-ENV Header and Fault global structures shared by client and service modules to process SOAP headers and faults when combining multiple client and/or services into one executable. Defines SOAP Fault and SOAP Header structures, which will be shared by client and service modules. The Header structure should contain all fields required by the clients and services. To obtain these, look into the wsdl2h-generated .h files for struct SOAP_ENV__Header and struct SOAP_ENV__Detail. Copy these below to make them globally visible to the gSOAP engine and plugins. Copyright (C) 2000-2016 Robert A. van Engelen, Genivia inc. All Rights Reserved. Compile in C: soapcpp2 -c -penv env.h then compile and link envC.c with your project Compile in C++ with C++ namespaces: soapcpp2 -qenv env.h then compile and link envC.cpp with your project When including envH.h in your project, include envH.h as the last: #include "abcH.h" #include "xyzH.h" #include "envH.h" */ #import "header.h" // optional user-defined headers #import "fault.h" // optional user-defined fault details gsoap-2.8.91/gsoap/samples/chaining++/README.txt0000644000175000017500000000431313525245162020453 0ustar ellertellert How to combine multiple C++ services into one server executable? The following method works well for all simple services, but not for plugin-based behaviors as plugin states are not propagated when chaining. In that case, please read suggestions further below to use a different option. Run wsdl2h on each WSDL, with "wsdl2h name.wsdl" to produce name.h Run "soapcpp2 -i -S -qName name.h" to produce a service class in a C++ namespace. The files generated by this command that you need are NamexxxService.h, NamexxxService.cpp, and NameC.cpp Run "soapcpp2 -CS -penv env.h" on an empty env.h (or an env.h with shared SOAP Header and SOAP Fault definitions) to produce envC.cpp for Header and Fault processing. Compile and link all these files together with libgsoap++ (or stdsoap2.cpp). Implement service chaining as follows: Name1::xxxService s1; Name2::yyyService s2; Name3::zzzService s3; s1.bind(NULL, 8080, 100); s1.accept(); if (soap_begin_serve(&s1)) ... error else if (s1.dispatch() == SOAP_NO_METHOD) { soap_copy_stream(&s2, &s1); if (s2.dispatch() == SOAP_NO_METHOD) { soap_copy_stream(&s3, &s2); if (s3.dispatch() == SOAP_NO_METHOD) ... error soap_free_stream(&s3); } soap_free_stream(&s2); } s1.destroy(); s2.desotry(); s3.destroy(); The above assumes soapcpp2 option -i is used, which means that each service object has its own engine state. This does not work well with plugins as it is tricky to ensure the plugin states are kept in sync. You can use soapcpp2 with option -j instead of -i: run "soapcpp2 -j -S -qName name.h" to produce a service class in a C++ namespace such that the instance has a soap context that can be shared. This allows plugins to be registered just once and shared across the services. The code is changed to: struct soap *soap = soap_new(); Name1::xxxService s1(soap); Name2::yyyService s2(soap); Name3::zzzService s3(soap); soap_bind(soap, NULL, 8080, 100); soap_accept(soap); if (soap_begin_serve(soap)) ... error else if (s1.dispatch() == SOAP_NO_METHOD) { if (s2.dispatch() == SOAP_NO_METHOD) { if (s3.dispatch() == SOAP_NO_METHOD) ... error } } soap_destroy(soap); soap_end(soap); soap_free(soap); // only safe when s1, s2, s3 are also deleted gsoap-2.8.91/gsoap/samples/chaining++/header.h0000644000175000017500000000120413525245162020352 0ustar ellertellert/* header.h Example SOAP Header definitions, to demonstrate the use of env.h. This file defines the SOAP Header data structure shared by client and service modules Copyright (C) 2000-2002 Robert A. van Engelen. All Rights Reserved. */ //gsoap h schema namespace: http://websrv.cs.fsu.edu/~engelen/h.xsd // h:authentication type of SOAP Header element struct h__authentication { @char *userid; // userid XML attribute @char *passwd; // passwd XML attribute }; // add the above to the SOAP Header elements: struct SOAP_ENV__Header { struct h__authentication *h__credentials; // rendered as XML }; gsoap-2.8.91/gsoap/samples/chaining++/chaining.cpp0000644000175000017500000000632413525245162021245 0ustar ellertellert/* chaining.cpp Example chaining of C++ service classes into one service application, assuming they are built with soapcpp2 option -i NOTE: option -j is preferred, see chaining2.cpp To generate non-client-server header and fault handlers: $ soapcpp2 -CS -penv env.h The quote service: $ soapcpp2 -i -S -qQuote quote.h The calc service: $ soapcpp2 -i -S -qCalc calc.h c++ -o chaining.cgi chaining.cpp stdsoap2.cpp envC.c QuotequoteService.cpp CalccalcService.cpp QuoteC.cpp CalcC.cpp -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2011, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "QuotequoteService.h" #include "CalccalcService.h" #include "envH.h" /* include envH.h as the last file, if this file is needed */ /* A dummy global table, to keep the linker happy */ struct Namespace namespaces[] = { {NULL} }; int main() { Quote::quoteService quote; Calc::calcService calc; /* serve over stdin/out, CGI style */ if (soap_begin_serve("e)) quote.soap_stream_fault(std::cerr); else if (quote.dispatch() == SOAP_NO_METHOD) { soap_copy_stream(&calc, "e); soap_free_stream("e); /* quote is no longer using this socket */ if (calc.dispatch()) soap_send_fault(&calc); } else if (quote.error) soap_send_fault("e); quote.destroy(); calc.destroy(); return 0; } int Quote::quoteService::getQuote(char *s, float *r) { *r = 123; /* a dummy service, these stocks don't move! */ return SOAP_OK; } int Calc::calcService::add(double a, double b, double *r) { *r = a + b; return SOAP_OK; } int Calc::calcService::sub(double a, double b, double *r) { *r = a - b; return SOAP_OK; } int Calc::calcService::mul(double a, double b, double *r) { *r = a * b; return SOAP_OK; } int Calc::calcService::div(double a, double b, double *r) { if (b == 0) return soap_sender_fault(this, "Division by zero", NULL); *r = a / b; return SOAP_OK; } int Calc::calcService::pow(double a, double b, double *r) { *r = ::pow(a, b); return SOAP_OK; } gsoap-2.8.91/gsoap/samples/chaining++/calc.h0000644000175000017500000001054613525245162020035 0ustar ellertellert/* calc.h This is a gSOAP header file with a calculator data binding and Web service interface to implement clients and services The service operations and type definitions use familiar C/C++ syntax. The following methods are defined by this gSOAP service definition: add(a,b) sub(a,b) mul(a,b) div(a,b) pow(a,b) Build steps for C (see samples/calc): $ soapcpp2 -c -r calc.h $ cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c $ cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c Build steps for C++ (see samples/calc++): $ soapcpp2 -j -r calc.h $ c++ -o calcclient++ calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp $ c++ -o calcserver++ calcserver.cpp stdsoap2.cpp soapC.cpp soapcalcService.cpp Option -r generates a soapReadme.md report. Note that soapcpp2 option -j generates proxy and service classes, which encapsulate the method operations in the class instead of defining them as global functions as in C. The //gsoap directives are used to bind XML namespaces and to define Web service properties: //gsoap service name: //gsoap service style: [rpc|document] //gsoap service encoding: [literal|encoded] //gsoap service namespace: //gsoap service location: Web service operation properties: //gsoap service method-style: [rpc|document] //gsoap service method-encoding: [literal|encoded] //gsoap service method-action: //gsoap service method-documentation: and type schema properties: //gsoap schema namespace: //gsoap schema elementForm: [qualified|unqualified] //gsoap schema attributeForm: [qualified|unqualified] //gsoap schema documentation: //gsoap schema type-documentation: where is an XML namespace prefix, which is used in C/C++ operation names, e.g. ns__add(), and type names, e.g. xsd__int. See the documentation for the full list of //gsoap directives. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: calc Simple calculator service described at https://www.genivia.com/dev.html //gsoap ns service protocol: SOAP //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns schema namespace: urn:calc //gsoap ns service method: add Sums two values int ns__add(double a, double b, double *result); //gsoap ns service method: sub Subtracts two values int ns__sub(double a, double b, double *result); //gsoap ns service method: mul Multiplies two values int ns__mul(double a, double b, double *result); //gsoap ns service method: div Divides two values int ns__div(double a, double b, double *result); //gsoap ns service method: pow Raises a to b int ns__pow(double a, double b, double *result); gsoap-2.8.91/gsoap/samples/chaining++/Makefile.am0000644000175000017500000000247413525245162021017 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = chaining include ../Makefile.defines envC.cpp: env.h $(SOAP) -CS -penv -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< QuotequoteService.cpp: quote.h $(SOAP) -iS -qQuote -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< CalccalcService.cpp: calc.h $(SOAP) -iS -qCalc -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< BUILT_SOURCES = QuotequoteService.cpp CalccalcService.cpp envC.cpp CLEANFILES = *.req.xml *.res.xml *.nsmap *.xsd *.wsdl envStub.h envH.h envC.cpp CalcStub.h CalcH.h CalcC.cpp Calc*Proxy.h Calc*Proxy.cpp Calc*Object.h Calc*Service.h Calc*Service.cpp CalcClient.cpp CalcServer.cpp CalcClientLib.cpp CalcServerLib.cpp QuoteStub.h QuoteH.h QuoteC.cpp Quote*Proxy.h Quote*Proxy.cpp Quote*Object.h Quote*Service.h Quote*Service.cpp QuoteClient.cpp QuoteServer.cpp QuoteClientLib.cpp QuoteServerLib.cpp *~ SOAP_NS = Calc.nsmap chaining_SOURCES = chaining.cpp quote.h calc.h env.h QuotequoteService.cpp CalccalcService.cpp QuoteC.cpp CalcC.cpp envC.cpp chaining_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) -lm gsoap-2.8.91/gsoap/samples/chaining++/chaining2.cpp0000644000175000017500000000604113525245162021323 0ustar ellertellert/* chaining2.cpp Example chaining of service classes into one service application Uses soapcpp2 option -j (preferred over -i) To generate non-client-server header and fault handlers: $ soapcpp2 -CS -penv env.h The quote service: $ soapcpp2 -j -S -qQuote quote.h The calc service: $ soapcpp2 -j -S -qCalc calc.h c++ -o chaining.cgi chaining.cpp stdsoap2.cpp envC.c QuoteServiceLib.cpp CalcServiceLib.cpp -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2011, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "QuotequoteService.h" #include "CalccalcService.h" /* A dummy global table, to keep the linker happy */ struct Namespace namespaces[] = { {NULL} }; int main() { struct soap *soap = soap_new(); Quote::quoteService quote(soap); Calc::calcService calc(soap); /* serve over stdin/out, CGI style */ if (soap_begin_serve(soap)) soap_stream_fault(soap, std::cerr); else if (quote.dispatch() == SOAP_NO_METHOD) { if (calc.dispatch() == SOAP_NO_METHOD || soap->error) soap_send_fault(soap); } else if (soap->error) soap_send_fault(soap); soap_destroy(soap); soap_end(soap); soap_free(soap); return 0; } int Quote::quoteService::getQuote(char *s, float *r) { *r = 123; /* a dummy service, stocks don't move */ return SOAP_OK; } int Calc::calcService::add(double a, double b, double *r) { *r = a + b; return SOAP_OK; } int Calc::calcService::sub(double a, double b, double *r) { *r = a - b; return SOAP_OK; } int Calc::calcService::mul(double a, double b, double *r) { *r = a * b; return SOAP_OK; } int Calc::calcService::div(double a, double b, double *r) { if (b == 0) return soap_sender_fault(soap, "Division by zero", NULL); *r = a / b; return SOAP_OK; } int Calc::calcService::pow(double a, double b, double *r) { *r = ::pow(a, b); return SOAP_OK; } gsoap-2.8.91/gsoap/samples/chaining++/fault.h0000644000175000017500000000234613525245162020245 0ustar ellertellert/* fault.h Example SOAP Fault detail definitions, to demonstrate the use of env.h. Defines optional SOAP Fault derail data structures Copyright (C) 2000-2004 Robert A. van Engelen. All Rights Reserved. */ /* Add any data structure you want to serialize as part of the SOAP Fault detail element. The detail element '__type' and 'value' fields should be set to transmit data. The fields are set when data of corresponding types are received. For example, we define an of name with a string vector (note the leading _ in the following declaration): class _f__myData { public: std::vector *data; }; To return a fault from your service application: soap_sender_fault(soap, "An error occurred", NULL)); // set soap fault soap->fault->detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail)); soap->fault->detail->__type = SOAP_TYPE__f__myData; soap->fault->detail->value = soap_new__f__myData(soap, -1); return SOAP_FAULT; In addition, you can modify the SOAP_ENV__Detail struct and add your own set of fields, as in: struct SOAP_ENV__Detail { struct f__myDataType f__myData; int __type; void *value; char *__any; // or use '_XML __any' to store literal XML content }; */ gsoap-2.8.91/gsoap/samples/webserver/0000755000175000017500000000000013525564140017052 5ustar ellertellertgsoap-2.8.91/gsoap/samples/webserver/opt.h0000644000175000017500000000271113525245163020027 0ustar ellertellert/* opt.h To generate serializers for options.c. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2004, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ struct t__Option { char *key; char *val; }; gsoap-2.8.91/gsoap/samples/webserver/dh512.pem0000644000175000017500000000023413525245163020400 0ustar ellertellert-----BEGIN DH PARAMETERS----- MEYCQQDYbhGNVV6GoxOPsX+rBNGmgfJqh7+e1PFj8IketLqWtA2gkXAB9PKxrkDQ jvuEoXE4A6PVPfstmP/Ef4uNfCqLAgEC -----END DH PARAMETERS----- gsoap-2.8.91/gsoap/samples/webserver/bt.gif0000644000175000017500000000056313525245163020153 0ustar ellertellertGIF89a ---PPPfff! AdobeGoLivexmQMO0 -@Sib*abguHi<%NΜqKW"%_?E~FLb$GSpe:KByWH6_oU!MX SwV43f/߄4옽v=6 L=ȋU+pR^XW(/g|&K^mmGp_5uO{,U;*Т`GBc7%}t=YK2խ,j+!."'VX іB8Ui2N_; ⵑ!, (@41$;gsoap-2.8.91/gsoap/samples/webserver/test.html0000644000175000017500000000122013525245163020713 0ustar ellertellert

Test Page

Text test.

Image test.

HTTP GET form test (HTML response).

HTTP POST form test (HTML response).

HTTP POST multipart/form-data test (HTML response).

HTTP POST multipart/form-data test (XML response).


Web server administration (logon to this demo with "admin" and "guest").


Powered by gSOAP.



Copyright (c) 2000-2018 Robert van Engelen, Genivia Inc. gsoap-2.8.91/gsoap/samples/webserver/btl.gif0000644000175000017500000000066613525245163020333 0ustar ellertellertGIF89a (((UUU???eeebbb,,,ggg---PPPfff! AdobeGoLivexmQ]N0 ;EdYATI n)\p;j)g+V_G)5/'[Q0p+$׹ODfTlc|;@7cIle^P䃭9ڐ6b8s8-E:U+ LKzg ܖ: > $O#֛W{V6GBeH5|?$S]ҡ2"$s9G-.HC}q//˵}!, /G+E)ƻSI'%3A6 ,K<6ƢanH;gsoap-2.8.91/gsoap/samples/webserver/checked.gif0000644000175000017500000000261313525245163021132 0ustar ellertellertGIF89ajfff@'''))),,,dk_q fȡm***ߐqm(3*>q6%EgXP|oDZq%}&222C-V{6^omW49W|u]wޥAң@J{D@BBs瀱f 999~MrQ ^YX:::rm`6]#6F"""׻".;Եtttpq]T~LL p+++q}N\rjjDDpR\{wӦ~[!,6i\ e=yډ摺C/AAEK[! AdobeGoLivexmQ]J1>'㻻 "Jm )lkWn^imH7ZoԕkZ2)u[>;W`6QyYf-\,]hSY-קtl 8e/ɿ eq5GF @c}B8ǎ|KQ@pE?⒞v#yO2ՙM,Z/cD}(^Z={[amc/,O)mEN/e}!,@ Hp`?ju+͕>f#,i x`|IJeRT( )HxZTbaX*Sla8 Z6=UFYFzC5K$ 4|aQ`Ce1B=$ `M_y)Ÿ1C8,(jA`J> 3jYE0(Akq"SQIEDY 6ƞ7m!GGCrVf\ᆲE\hcYja qĽ eqSa2`>"\ 'o  7)o-j/ / @ |D|QjDm3c5rj({ҡmmz^"꩚"4 kƒname; p++ ) { if (p->value) free(p->value); } free(options); } } int parse_options(int argc, char **argv, struct option *options) { int i; for (i = 1; i < argc; i++) { const char *key, *val; key = argv[i]; if (*key == OPTION_CHAR) { int flag = 1; while (flag && *++key) { if (*key == '?' || !strcmp(key, "help")) { print_usage(argc, argv, options); return 1; } if (i < argc) val = argv[i + 1]; else val = NULL; switch (set_option(key, val, options)) { case 2: i++; case 1: flag = 0; case 0: break; case -1: fprintf(stderr, "%s: missing argument value for option %c%s\n", argv[0], OPTION_CHAR, key); print_usage(argc, argv, options); return 1; case -2: fprintf(stderr, "%s: unknown option %c%s\n", argv[0], OPTION_CHAR, key); print_usage(argc, argv, options); return 1; } } } else if (set_option(NULL, key, options) < 0) fprintf(stderr, "%s: invalid argument %s\n", argv[0], key); } return 0; } void query_options(struct soap *soap, struct option *options) { char *s = soap_query(soap); /* get arguments from query string */ while (s) { char *key = soap_query_key(soap, &s); /* decode next query string key */ char *val = soap_query_val(soap, &s); /* decode next query string value */ if (key) set_option(key, val, options); } } int load_options(const char *file, const char *name, struct option *options) { struct soap soap; soap_init(&soap); if (file) { soap.recvfd = open(file, O_RDONLY); if (soap.recvfd < 0) { soap_done(&soap); return EOF; } } if (!soap_begin_recv(&soap) && !soap_element_begin_in(&soap, name, 1, NULL)) { struct t__Option t; while (soap_in_t__Option(&soap, "option", &t, NULL)) if (set_option(t.key, t.val, options) < 0) ; /* error, just ignore for now */ if (!soap_element_end_in(&soap, name)) soap_end_recv(&soap); } if (file) close(soap.recvfd); soap_end(&soap); soap_done(&soap); return soap.error; } int save_options(const char *file, const char *name, struct option *options) { struct soap soap; soap_init1(&soap, SOAP_XML_TREE); soap.namespaces = NULL; soap.encodingStyle = NULL; if (file) { soap.sendfd = open(file, O_CREAT | O_RDWR, 0644); if (soap.sendfd < 0) { soap_done(&soap); return EOF; } } if (!soap_begin_send(&soap) && !soap_element_begin_out(&soap, name, 0, NULL)) { struct option *p; struct t__Option t; for (p = options; p->name; p++) { t.val = NULL; if (!p->name[0]) { if (!p->value) continue; t.key = NULL; t.val = p->value; } else if (p->name[1] == '.') t.key = (char*)p->name + 2; else t.key = (char*)p->name; if (p->selections && strchr(p->selections, ' ')) { const char *s = p->selections - 1; char *r; int i; for (i = p->selected; i > 0; i--) { s = strchr(s + 1, ' '); if (!s) break; } if (s) { t.val = soap_strdup(&soap, s + 1); r = strchr(t.val, ' '); if (r) *r = '\0'; } } else if (p->value) t.val = p->value; else if (!p->selected) continue; if (soap_out_t__Option(&soap, "option", 0, &t, NULL)) break; } if (!soap_element_end_out(&soap, name)) soap_end_send(&soap); } if (file) close(soap.sendfd); soap_end(&soap); soap_done(&soap); return soap.error; } int html_options(struct soap *soap, struct option *options) { struct option *p; soap_send(soap, "\n"); soap_send(soap, ""); for (p = options; p->name; p++) { const char *s, *t, *n; int i; n = p->name; if (n[0] && n[1] == '.') n += 2; s = p->selections; soap_send(soap, ""); } else if (!s) { soap_send(soap, n); soap_send(soap, ""); else soap_send(soap, "'>"); } else if (strchr(s, ' ')) { soap_send(soap, n); soap_send(soap, ""); for (i = 0; ; i++) { t = strchr(s, ' '); if (i == 0) soap_send(soap, ""); if (!t) break; soap_send(soap, "\n"); s = t + 1; } } else { char buf[24]; soap_send(soap, n); soap_send(soap, ""); } soap_send(soap, "\n"); // \n"); } soap_send(soap, "\n\n
"); if (!n[0]) { if (s) soap_send(soap, s); soap_send(soap, ""); if (p->value) soap_send(soap, p->value); soap_send(soap, "onoff"); else soap_send(soap, "
"); if (i == p->selected) soap_send(soap, ""); else { soap_send(soap, ""); soap_send(soap, ""); } if (t) soap_send_raw(soap, s, t - s); else soap_send(soap, s); soap_send(soap, "
 
\n"); return SOAP_OK; } int html_form_options(struct soap *soap, struct option *options) { soap_send(soap, "

"); html_options(soap, options); return soap_send(soap, "
"); } static int set_option(const char *key, const char *val, struct option *options) { struct option *p; if (!key) { for (p = options; p->name; p++) { if (!p->name[0]) { if (p->value) { size_t l = strlen(p->value) + strlen(val); char *s = (char*)malloc(l + 2); if (s) { (SOAP_SNPRINTF(s, l + 2, l + 1), "%s %s", p->value, val); free((void*)p->value); p->value = s; } } else { size_t l = strlen(val); p->value = (char*)malloc(l + 1); if (p->value) soap_strcpy(p->value, l + 1, val); } return 2; } } return -2; } for (p = options; p->name; p++) { if (p->name[0] && ((p->name[1] == '.' && !strcmp(key, p->name + 2)) || (p->name[1] != '.' && !strcmp(key, p->name)))) { if (p->selections) { if (!val) return -1; if (set_selection(val, p) < 0) return -1; return 2; } if (val && !*val) { p->selected = 0; return 2; } p->selected = 1; return 1; } } for (p = options; p->name; p++) { if (p->name[0] == key[0] && p->name[1] == '.') { if (p->selections) { const char *s = key + 1; if (!s[0]) { s = val; if (!s) return -1; } if (set_selection(s, p) < 0) return -1; if (s == val) return 2; return 1; } p->selected = 1; return 0; } } return -2; } static int set_selection(const char *val, struct option *p) { size_t l; if (strchr(p->selections, ' ')) return p->selected = find_selection(val, p->selections); if (p->value) free(p->value); l = strlen(val); p->value = (char*)malloc(l + 1); if (p->value) soap_strcpy(p->value, l + 1, val); return 0; } static int find_selection(const char *val, const char *selections) { int i = 0; const char *s = selections; size_t n = strlen(val); for (;;) { if (!strncmp(s, val, n) && (s[n] == ' ' || s[n] == '\0')) return i; s = strchr(s, ' '); if (!s) break; s++; i++; } return -1; } static void print_usage(int argc, char **argv, struct option *options) { struct option *p; fprintf(stderr, "Usage: %s", argv[0]); for (p = options; p->name; p++) { if (p->name[0]) { int flag = (p->name[1] == '.'); if (p->selections) { if (strchr(p->selections, ' ')) { if (flag) fprintf(stderr, " %c%c[%s]", OPTION_CHAR, p->name[0], p->selections); else fprintf(stderr, " %c%s [%s]", OPTION_CHAR, p->name, p->selections); } else if (flag) fprintf(stderr, " %c%c<%s>", OPTION_CHAR, p->name[0], p->selections); else fprintf(stderr, " %c%s <%s>", OPTION_CHAR, p->name, p->selections); } else if (flag) fprintf(stderr, " %c%c", OPTION_CHAR, p->name[0]); else fprintf(stderr, " %c%s", OPTION_CHAR, p->name); } else if (p->selections) fprintf(stderr, " %s", p->selections); else fprintf(stderr, " ..."); } fprintf(stderr, "\n"); } gsoap-2.8.91/gsoap/samples/webserver/favicon.gif0000644000175000017500000000056613525245163021176 0ustar ellertellertGIF89a1rfzz發l#((uFUTɁf͒/9:ٜ٦_tvp ,@@p10$á! 0@*C%#D(pP1&, RTw  !TqgwXxqIudC!kceI !Sc !ã!b X !oI XTB ߛA;gsoap-2.8.91/gsoap/samples/webserver/otrs.gif0000644000175000017500000000116213525245163020531 0ustar ellertellertGIF89a 恁Ξyyy! AdobeGoLivexmQj0 }{)N+=^*Ү{=c)YZF瓔R߯[ԤgR;]|.9`$Q^!~-2[_,e*䳟 R:\Q kxYMҋp0>M@4E* bRҖItݸd!Zng0&i 6ǰ:f)P#].4 ÜBcX27!K;`|ܚ8hgó)h/R1(Ϥg|%GAM~ Simple Calculator Web Service Using HTTP POST multipart/form-data
=
gsoap-2.8.91/gsoap/samples/webserver/calcform2.html0000644000175000017500000000265513525245163021621 0ustar ellertellert Simple Calculator Web Service Using HTTP POST multipart/form-data
=
gsoap-2.8.91/gsoap/samples/webserver/itrs.gif0000644000175000017500000000116413525245163020525 0ustar ellertellertGIF89a {{{zzzkkkiii䲲mmmѓpppȤ؆vvvgggfff܂uuulllhhhjjjwwwooosssnnn! AdobeGoLivexmQj0 }vo;;)cXKXVuҞk׽,- `#}IJRj^3)u.>j0DK^tl(lm? b OzaIi(Ԇ5W&dN8&OJ"\Zaxrj (CM\Kzgr4ܭMQ$&o^UPMv\r}%mt9G2ԍ, 'KD1&VK^ɱOmYΆ`|cv"!, @[@0&N'i0D*Úl0HbHRN&  "8,! sXR$f !)( $,# (*A;gsoap-2.8.91/gsoap/samples/webserver/calcpost.html0000644000175000017500000000134313525245163021552 0ustar ellertellert Simple Calculator Web Service Using HTTP POST
=
gsoap-2.8.91/gsoap/samples/webserver/Makefile0000644000175000017500000000365113525245163020520 0ustar ellertellertGSOAP=../../src/soapcpp2 SOAPH=../../stdsoap2.h SOAPC=../../stdsoap2.c SOAPCPP=../../stdsoap2.cpp SOAPDOMC=../../dom.c SOAPDOMCPP=../../dom.cpp CC=gcc CPP=g++ LIBS=-lpthread -lz -lssl -lcrypto COFLAGS=-O2 CWFLAGS=-Wall -Wno-deprecated-declarations CIFLAGS=-I../.. -I../../plugin CMFLAGS=-DWITH_COOKIES -DWITH_GZIP -DWITH_OPENSSL CFLAGS= $(CWFLAGS) $(COFLAGS) $(CIFLAGS) $(CMFLAGS) all: webserver webserver: webserver.h webserver.c logging.o httpget.o httppost.o httpform.o httppipe.o httpda.o smdevp.o threads.o options.o $(SOAPH) $(SOAPC) $(GSOAP) -c -L webserver.h $(CC) $(CFLAGS) -o webserver webserver.c logging.o httpget.o httppost.o httpform.o httppipe.o httpda.o smdevp.o threads.o options.o soapC.c soapClient.c soapServer.c $(SOAPC) $(LIBS) options.o: opt.h options.h options.c $(GSOAP) -cnpopt opt.h $(CC) $(CFLAGS) -c options.c logging.o: ../../plugin/logging.h ../../plugin/logging.c $(CC) $(CFLAGS) -c ../../plugin/logging.c httpget.o: ../../plugin/httpget.h ../../plugin/httpget.c $(CC) $(CFLAGS) -c ../../plugin/httpget.c httppost.o: ../../plugin/httppost.h ../../plugin/httppost.c $(CC) $(CFLAGS) -c ../../plugin/httppost.c httpform.o: ../../plugin/httpform.h ../../plugin/httpform.c $(CC) $(CFLAGS) -c ../../plugin/httpform.c httppipe.o: ../../plugin/httppipe.h ../../plugin/httppipe.c $(CC) $(CFLAGS) -c ../../plugin/httppipe.c httpda.o: ../../plugin/httpda.h ../../plugin/httpda.c $(CC) $(CFLAGS) -c ../../plugin/httpda.c smdevp.o: ../../plugin/smdevp.h ../../plugin/smdevp.c $(CC) $(CFLAGS) -c ../../plugin/smdevp.c threads.o: ../../plugin/threads.h ../../plugin/threads.c $(CC) $(CFLAGS) -c ../../plugin/threads.c .PHONY: clean distclean clean: rm -f *.o soapH.h soapStub.h soapC.c soapClient.c soapServer.c soapClientLib.c soapServerLib.c distclean: rm -f *.o soapH.h soapStub.h soapC.c soapClient.c soapServer.c soapClientLib.c soapServerLib.c rm -f *.wsdl *.xsd *.xml *.nsmap *.log rm -f webserver gsoap-2.8.91/gsoap/samples/webserver/calcget.html0000644000175000017500000000134113525245163021342 0ustar ellertellert Simple Calculator Web Service Using HTTP GET
=
gsoap-2.8.91/gsoap/samples/webserver/server.pem0000644000175000017500000000724213525245163021071 0ustar ellertellert-----BEGIN ENCRYPTED PRIVATE KEY----- MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIQcdZuFt0YzgCAggA MBQGCCqGSIb3DQMHBAig/PutfpxHfwSCAoCSsevV3jWwaMLqzkz4FtHPPKI9Guiz y3HjO4uHUnTZNyHA87ukCBYcn06fj4lLsdzShC4PKq1us9WlPgp7iXjS3HxvSNkV JaKfZ1W0LtNnY5BJvp+rFgmrO0/FWwVBuCg4yQCO0PtREif5Sf47qMn/uQI+G9K9 nZcav3w+nI6p9pwUcyFEpKFMLixCFNBHnQCO0SA7PsSHcHe8vntvMXGYnnEjjSq7 pjD2eIV0A5lDYn/u0HQasY0FvLqbDWblZtcI2DAAbwzq0YPK3kPYEKUe/9r3JT5o kRsVak7ZOao1Xfd4c57QrRk4zNuPLDmQJFi3FhtScMGB2de5QIKnzvAyjU2TMhKK xezFZ173p6wNO7+xTmurZ5wfgZQ9EbbaGzdFMhH+IZA0NEVogZn40fjoWKR0Xhwc FfQUuCraq9O7V6xmR19vJNzGGD5WljzTaHPdqlJiBof9L32IfJnEMelr4wf/kZFq VMYieFjB8GZslZEKJC3Y3r+4KOZwdPz3fPCTyYcYt13TFRc+ffE632GHZr4LRrJD +Gy8QHxkA1veyeh+2U52lJylzK2JKQ2nqcIk0d5AIizAf4e6Ow2NXmUgUpirJgUH hfI4Ejed8zgoqk5T2k1jj8zY7I7lpHo4V5Fi5lwc3ubzKZi6lD/Rdqcz3uZUN8gQ 8ZQe4XHtImsS9QkgdAeVgzLW5rKrx5UKYI2z7538YAanSJGX0N2c6Fsd0rx4sFkx HqVgwy0JEZT2ajwdkVOXIEnVZ7/immdAyddeYnxnHl6GnKP6i7vN8/9jCu/VSSzt HECoqQ7eu0j+PsAN0N0JVbTJMEgWwkKc7RG+4M4MNIbTbLJn16KEfCxD -----END ENCRYPTED PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIID4TCCA0qgAwIBAgIBITANBgkqhkiG9w0BAQUFADCBjTELMAkGA1UEBhMCVVMx CzAJBgNVBAgTAkZMMRQwEgYDVQQHEwtUYWxsYWhhc3NlZTEWMBQGA1UEChMNR2Vu aXZpYSwgSW5jLjELMAkGA1UECxMCSVQxEjAQBgNVBAMTCWxvY2FsaG9zdDEiMCAG CSqGSIb3DQEJARYTY29udGFjdEBnZW5pdmlhLmNvbTAeFw0xODA4MjUxNzU4Mzda Fw0yMTA4MjQxNzU4MzdaMIGNMQswCQYDVQQGEwJVUzELMAkGA1UECBMCRkwxFDAS BgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJbmMuMQswCQYD VQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcNAQkBFhNjb250 YWN0QGdlbml2aWEuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDsMNey f1zqU26XTAYsjsHVfSzuQcHX7H6rVDej4i+syy7JF198AlZXKNyx+lDbDzTWmEJM wJtelxoVmnnIJPYTxWlWYCXc+9QwopQ4Jm0rANdfTujDDHug2uMxfTiJNJGq4eOm VrghruL6l96H5aHveauzUh7XiEbcFSL9+1h8twIDAQABo4IBTTCCAUkwCQYDVR0T BAIwADALBgNVHQ8EBAMCBPAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd BgNVHQ4EFgQUl21S3PtNIU5VptaFc0rS21mVve4wgcIGA1UdIwSBujCBt4AUVixg D6n5N0NNc/tWvNSYuhDTKkmhgZOkgZAwgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb22CCQCG9y4FBiOi4zANBgkqhkiG9w0BAQUF AAOBgQBE4Swc3a+wyEXqXGB753H10PmpqpcmpUaLmTfBKvgl1WeLhAZqcpKiKWnH s2BNKE68Ndlopo4ttP3DIkf69vKrUrTANzui5pdShdEom6SJ1yjm/mTFSXNOxAs7 kkbwMTnYltSLvNLdBV22pVmHbRP0G6xwTi7Br5ZIGcQGEQDaDw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJAIb3LgUGI6LjMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE4MDgy NTE3NTczNloXDTIxMDgyNDE3NTczNlowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBAMXNOWKaNVtyWpWa/5/mNXZ7cgv+v5B1RL0OoOwvoQ5dHhc4KycDPAtiiV+I AoZy7bLbARWJboLPo3JnOf3Mc0aQjVFXz+X8eVhEseCIP4HAWSGa5ISDVDdxj4Nh RfwlVtrmLdL08HkTr+f3scHRvtvtmAtTFeT9FOCzttMpBRTXAgMBAAGjgfUwgfIw HQYDVR0OBBYEFFYsYA+p+TdDTXP7VrzUmLoQ0ypJMIHCBgNVHSMEgbowgbeAFFYs YA+p+TdDTXP7VrzUmLoQ0ypJoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkAhvcuBQYjouMwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQA1xebtW3G5e9Xfz2zys4d+628r2qy4ov0ggGS5 WmrBhyIFCE+xW1bj5waLMOt0e4+yfODMTcVKArrrthJdHm5YFILT9ZU2hOEOZw5P Dizc3Q34yzQxXrpsaHri5OfM0wgiIJOynz/YbX2f46YpqhMT7VvNoI8sR+OIydcY mi3qVQ== -----END CERTIFICATE----- gsoap-2.8.91/gsoap/samples/webserver/client.pem0000644000175000017500000000724213525245163021041 0ustar ellertellert-----BEGIN ENCRYPTED PRIVATE KEY----- MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIaWE062ig1DwCAggA MBQGCCqGSIb3DQMHBAiV2CAcBIqLvgSCAoAb2rFc/f92WlyYUdMgbb1/DXzLve/T hH54rQiYOz0amfOReQGGxgSvatKRtSJY67fh8K5aoqqV+UKoXhYtb4jxAJtdszrM QlMKGVze2tsBCnjDYJf9aPVQFYDlRTcAqLYd6p+SScVHUaPNk0DND0qhvgN8bs31 QMiSFxZLEE5WJKBlIYiJ0JZSdNRMf+D7aZCe4fTJ+GHE8zQJ1DwvHE/4KKaUFNPS OMrAU2ew1WdjORP2uYKW+uur1IQOL0Op6+h2jGqvzeS1yTBOeaDP/qM0cS8u3wBH uRmE2RWpI69lgb8clsNlRpd8sod0q2K0RruwbHlzSS0f8YEYQDNMIaqFTOv2bDcB lMHa6UTzoacGTAhiaI9T9LwiHOQP7fmXMfQcSCXH/K6IO4A6pjcUW1ZntaNQzK0C fDR2iSEwUbJxlgoUmR9Knv15kMBlOs5kVvvlYYS/gDIoZP73kqDIntyjjnfgJCOu K/2JQ8VyPkeqZPzVR8BRUZ7VIH0AropEXZpFOHWL226ye7i6qHivA5ZEIOgPhKd9 PmbnHN3GDFnSDUNgj3ZS95XwJ+7rsF73NO9TzkUYcsktIaanc591SPFTDznB7AIE k280QJbGPJaM6B2bpFZHCHt53vdg2IeFcSQlBPASmySYFblhI8GH+wETuvb0I1GA ZsCb1H3jWflYW8Ma03ZiQ8Y28acGm/GjTYEXco5LNHXXMA6gYv1DFurfaa3jdU7K +JOyPHYdtJKKv9g+OVXG+MF8kRWX16U6SzS/0xFCYoXsHUVggzV+y1ssghPeAIL3 5sRXN+3GYkSi7e0hyp7Xn5QDcgeTxhsY/BPelhFRNwM1pt0UG1LiEr23 -----END ENCRYPTED PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIID4TCCA0qgAwIBAgIBIDANBgkqhkiG9w0BAQUFADCBjTELMAkGA1UEBhMCVVMx CzAJBgNVBAgTAkZMMRQwEgYDVQQHEwtUYWxsYWhhc3NlZTEWMBQGA1UEChMNR2Vu aXZpYSwgSW5jLjELMAkGA1UECxMCSVQxEjAQBgNVBAMTCWxvY2FsaG9zdDEiMCAG CSqGSIb3DQEJARYTY29udGFjdEBnZW5pdmlhLmNvbTAeFw0xODA4MjUxNzU4MDha Fw0yMTA4MjQxNzU4MDhaMIGNMQswCQYDVQQGEwJVUzELMAkGA1UECBMCRkwxFDAS BgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJbmMuMQswCQYD VQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcNAQkBFhNjb250 YWN0QGdlbml2aWEuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDPMEu7 ZzcMf8q9pswCg4IMsolqh9zAZxC/fWB+9bQLghD+wjfAna3BP2mvqx+TR0xS4Y/a yDo6yOddFJPujZa61c6wZQvSDhOYBpaQTQhh0XiXfWdVroIvZP0aHmdVzbUUi8IB DtXaOSZMAHALWr94JhcORxKmlpGxK6ldi7UuxQIDAQABo4IBTTCCAUkwCQYDVR0T BAIwADALBgNVHQ8EBAMCBPAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd BgNVHQ4EFgQURsvkJ2+Evc35UiOMgTjDPf3xItcwgcIGA1UdIwSBujCBt4AUVixg D6n5N0NNc/tWvNSYuhDTKkmhgZOkgZAwgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb22CCQCG9y4FBiOi4zANBgkqhkiG9w0BAQUF AAOBgQCstkf6RkWhM6XzS7e9sHQJc7t3ErT4m0+Py8MyApuX5Yx5/byhCGTRjotr qmWONRiathIRwhUPgi4DYqD2YnDZsmNWVgeeMubyzkXI+M2XBus2hQsSg49pgnm/ dYPoI3GtWYk7XK9LBaE4E5LC1aZO7JOrQHyZ5810K9qQEcs2Dg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJAIb3LgUGI6LjMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE4MDgy NTE3NTczNloXDTIxMDgyNDE3NTczNlowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBAMXNOWKaNVtyWpWa/5/mNXZ7cgv+v5B1RL0OoOwvoQ5dHhc4KycDPAtiiV+I AoZy7bLbARWJboLPo3JnOf3Mc0aQjVFXz+X8eVhEseCIP4HAWSGa5ISDVDdxj4Nh RfwlVtrmLdL08HkTr+f3scHRvtvtmAtTFeT9FOCzttMpBRTXAgMBAAGjgfUwgfIw HQYDVR0OBBYEFFYsYA+p+TdDTXP7VrzUmLoQ0ypJMIHCBgNVHSMEgbowgbeAFFYs YA+p+TdDTXP7VrzUmLoQ0ypJoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkAhvcuBQYjouMwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQA1xebtW3G5e9Xfz2zys4d+628r2qy4ov0ggGS5 WmrBhyIFCE+xW1bj5waLMOt0e4+yfODMTcVKArrrthJdHm5YFILT9ZU2hOEOZw5P Dizc3Q34yzQxXrpsaHri5OfM0wgiIJOynz/YbX2f46YpqhMT7VvNoI8sR+OIydcY mi3qVQ== -----END CERTIFICATE----- gsoap-2.8.91/gsoap/samples/webserver/unchecked.gif0000644000175000017500000000170613525245163021477 0ustar ellertellertGIF89aۻ𯯯rrrfff)))޴sss'''׾ooo󱱱,,,̢:::999+++***Аwww񍍍Θԁ븸҉~~~eee܆! AdobeGoLivexmQ]N0 [)~VJ]ɽ RvC5ߍa]+$[/Df뫘lB|;jCRZ3 a ٿ Y ^Ci\DSk Ϯ VcѳPKqIBY{ 8|S@IjFt(Va8Q$;\-׶c@ΑLua"Kx)(rZxgr,4ph((KG 0a!,@TTS8.?HH 7!TK  SQDJJAS*NGGG, CB2SH KKSSKKM+K@PQOQI S E%U<1QOPU;0Hp 3XĉÇ5i!I ac $l<I&RR8‹M| Bf5KD f@@ʑ LxHD r LgI(Or Sٸ* k_!_xn bF֬e&.G 6GyjU+ d+ͺ빦 bEjGeZ(t0](C侏N'kIՁCme<8Dץc"9$!R=0: current selection in selections list */ char *value; /* parsed value (when 'selections' is one name) */ }; extern struct option *copy_options(const struct option *options); extern void free_options(struct option *options); extern int parse_options(int argc, char **argv, struct option *options); extern void query_options(struct soap *soap, struct option *options); extern int save_options(const char *file, const char *name, struct option *options); extern int load_options(const char *file, const char *name, struct option *options); extern int html_options(struct soap *soap, struct option *options); extern int html_form_options(struct soap *soap, struct option *options); gsoap-2.8.91/gsoap/samples/webserver/deselected.gif0000644000175000017500000000172013525245163021643 0ustar ellertellertGIF89aůꚚDDD򏏏ⅅ󩩩zzzVVV說Ή쨨kkk:::lllYYYۃ|||pppд]]]IJ! AdobeGoLivexmQMk0 ;vv cn$*ҮS$$TCԍ[2)uξ0DK^fu˽B1,kdY&Tg?˹)$u\;`|ܚ>?h(pn* b5RD035P.WXM 'RQH X*X 4YR! @G !XXWWT/1'nA%T]IR$G\ "p2(@T`CdtB劉+@J("Á)T\˔$*$ b1CHXHP(`>,;gsoap-2.8.91/gsoap/samples/webserver/otls.gif0000644000175000017500000000116113525245163020522 0ustar ellertellertGIF89a ލ恁񺺺Ξyyy! AdobeGoLivexmQj0 }vi;=JG>(ilϟ~>I)U/~RҞItո!ZsXf4GydmXvl}M~rnV搔BcXfoB^섃qo4."܀+5WQɏR1T(ϥg|%GA?x^C=6=5, Xy'jDmZ3㈟ږ<P&4hL/ŸZ$ zw&BVXb webserver 8080 & Start a web browser and open a (localhost) location: http://127.0.0.1:8080 and type userid 'admin' and passwd 'guest' to gain access Open the location: http://127.0.0.1:8080/calc.html and enter an expression Open the locations: http://127.0.0.1:8080/test.html http://127.0.0.1:8081/webserver.wsdl Use (HTTPS GET): Create the SSL certificate (see samples/ssl README and scripts) Compile the web server with OpenSSL as explained above Start the web server on an odd numbered port (e.g. 8081) > webserver 8081 & Actually, you can start two servers, one on 8080 and a secure one on 8081 Start a web browser and open a (localhost) location: https://127.0.0.1:8081 and type userid 'admin' and passwd 'guest' to gain access Open the location: https://127.0.0.1:8081/calc.html and enter an expression Open the locations: https://127.0.0.1:8081/test.html https://127.0.0.1:8081/webserver.wsdl Use (HTTP POST): Serves SOAP/XML calculation requests Command-line options: -z enables compression -c enables chunking -k enables keep-alive -i enables non-threaded iterative server -v enables verbose mode -t sets I/O timeout value (seconds) -s sets server timeout value (seconds) -d sets cookie domain -p sets cookie path -l[none inbound outbound both] enables logging gsoap-2.8.91/gsoap/samples/webserver/ruler.gif0000644000175000017500000000063013525245163020672 0ustar ellertellertGIF89a PPPgggfff! AdobeGoLivexmQ=O05kg6iA)N:TBtc3%*R~3+;גFTK};f񫔺; RW?z19 &0GYv 5۲م:X#|=t3Е8X6g9ڐ66b(*9^c|5EE/)@3$O#mqP{V6GB-'j*8=T6th"\NPegaNŵ5!, +X୆`)@iibnpltmA^?6>~+bC!, @0;gsoap-2.8.91/gsoap/samples/webserver/bs.gif0000644000175000017500000000062013525245163020144 0ustar ellertellertGIF89a pppxxxн! AdobeGoLivexmQN0 .םyrtBLE;LB Bvxr܍vWi)g'IMF6BjΧ[(x|`VLUܗ[ m,rܢ] d6cIY1(M( 71T{;Y#?X@p\aۢiqM/B]9H-^)cWgU#zTll );X]#c|&IQAu:x+%ՌR\xo+ PdZ+p}c:!, @0dA;gsoap-2.8.91/gsoap/samples/webserver/webserver.h0000644000175000017500000000423613525245163021235 0ustar ellertellert/* webserver.h -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2004, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: webserver //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl //gsoap ns service location: http://localhost:8080 //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns schema namespace: urn:calc int ns__add(double a, double b, double *result); // HTTP POST request-response int ns__sub(double a, double b, double *result); // HTTP POST request-response int ns__mul(double a, double b, double *result); // HTTP POST request-response int ns__div(double a, double b, double *result); // HTTP POST request-response struct ns__record { int SKU; char *product_name; int in_store; }; //gsoap f schema namespace: urn:form int f__form1(void); // one-way message (HTTP form) int f__form2(struct f__formResponse { double result; } *); gsoap-2.8.91/gsoap/samples/webserver/obrs.gif0000644000175000017500000000115613525245163020512 0ustar ellertellertGIF89a э恁񺺺Ξyyy! AdobeGoLivexmQj0 ^A{o:{SJG c7Qc[eOӔ- `#]j~ORj_3)OK%e:y>buWH߆o1؄'Cw0WZ>֫n'{g qa.-7 V|b(гQIqIN@i_Q+$ˮ>TPMusqml6.9G2ԍ, '{D9|Ts!b;S`C',G1"i 0_5!, @Z@Y *rPqHhRu4"Σ 5Qu @P6),)  *$ ) ('  !A;gsoap-2.8.91/gsoap/samples/webserver/bbr.gif0000644000175000017500000000075113525245163020312 0ustar ellertellertGIF89a OOOeeekkk>>>~~~gggPPPfff! AdobeGoLivexmQN0 ]8q;Hpj:!&!uHi<%x-^]I糕R[UJMK;&n~W=hkx":+$oAf똥lB|Kw0s a o߄,섃qg⨡2."\K[ / VJyPgS?⒞ t }=6' jx|z$`Qو ݴLgʐ䀟?s$S]ҡq2""^L(cWe p}gnﴄ!, 4`1N$& 1pFpPf[ \d2Lt(6 0;gsoap-2.8.91/gsoap/samples/webserver/cacert.pem0000644000175000017500000000242213525245163021017 0ustar ellertellert-----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJAIb3LgUGI6LjMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE4MDgy NTE3NTczNloXDTIxMDgyNDE3NTczNlowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBAMXNOWKaNVtyWpWa/5/mNXZ7cgv+v5B1RL0OoOwvoQ5dHhc4KycDPAtiiV+I AoZy7bLbARWJboLPo3JnOf3Mc0aQjVFXz+X8eVhEseCIP4HAWSGa5ISDVDdxj4Nh RfwlVtrmLdL08HkTr+f3scHRvtvtmAtTFeT9FOCzttMpBRTXAgMBAAGjgfUwgfIw HQYDVR0OBBYEFFYsYA+p+TdDTXP7VrzUmLoQ0ypJMIHCBgNVHSMEgbowgbeAFFYs YA+p+TdDTXP7VrzUmLoQ0ypJoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkAhvcuBQYjouMwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQA1xebtW3G5e9Xfz2zys4d+628r2qy4ov0ggGS5 WmrBhyIFCE+xW1bj5waLMOt0e4+yfODMTcVKArrrthJdHm5YFILT9ZU2hOEOZw5P Dizc3Q34yzQxXrpsaHri5OfM0wgiIJOynz/YbX2f46YpqhMT7VvNoI8sR+OIydcY mi3qVQ== -----END CERTIFICATE----- gsoap-2.8.91/gsoap/samples/webserver/ibrs.gif0000644000175000017500000000116513525245163020504 0ustar ellertellertGIF89a {{{zzzkkkiii䲲mmmѓpppȤ؆vvvgggfff܂uuulllhhhjjjwwwooosssnnn! AdobeGoLivexmQ]N0 ;EeِOMih;Ah6RO1#SFJdJK)5.혔MK%nl lc? b OR :\Qh kx^MN8w&ϏJ"\cXXO~!GϦB&%=9 nW>msHmމTPMz9m6N9G2ԍ, '>'WV ՜X/Xh QǮ4K׳`|cn~p!, @[Q"L  ! ɤ(#* DHbI H!i0D*Ò08"+  +,')(+qS*,, 'TA;gsoap-2.8.91/gsoap/samples/webserver/top.gif0000644000175000017500000000011513525245163020341 0ustar ellertellertGIF89a1dFdV,q:@@@,pD;gsoap-2.8.91/gsoap/samples/webserver/btr.gif0000644000175000017500000000075413525245163020337 0ustar ellertellertGIF89a SSSaaa~~~mmm!!!VVVkkk@@@RRR}}}www^^^```---ggg݇PPPfff! AdobeGoLivexmQj0 }l┱CaO%Jjpb:{}vCLҐB 6O?|~RҖIlѺd!ZR,yd[iXl}Mh~r.RHj밠(MȳN8&/j"8 b<7 %z6 J/(h-NOD OvevT6CB7;ՙ2$9zck8T&th꺴#j,b;Sb5D;Ur\ٴ[I!, 6 &btdhFlfd\Z/!1ͥB 0a/ H0Fd;gsoap-2.8.91/gsoap/samples/webserver/bb.gif0000644000175000017500000000056213525245163020130 0ustar ellertellertGIF89a PPPgggfff! AdobeGoLivexmQN0 .=Ee 鄘vm#p<n٪MjD?EQmE7rc7[~v6ޣ" A^!|i-2ׄN+qBlu:7!NhCZوOpxj  75JC)._S4p;Ёfg^h= <<>XNYل[ ݶLG)^$I:CeM@4Epi* b5|CLJ f$^_%}Yѿ5"-O@i<ĝ߄"T؆:hWy[b:MrAl5 yb@huꅾ;Q#!ej{Q5Gvʶ2z9q=PW66hNLjRI! m^Yb< EE>764'I!, @QɄ;gsoap-2.8.91/gsoap/samples/webserver/webserver.c0000644000175000017500000015520313525245163021231 0ustar ellertellert/* webserver.c Example stand-alone gSOAP Web server based on gSOAP plugins. This is a small but fully functional (embedded) Web server for serving static and dynamic pages and SOAP/XML responses over HTTP/HTTPS. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL OR Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- The Web server handles HTTP GET requests to serve pages and HTTP POST reguests to handle SOAP/XML messages. This example only implements a simple calculator XML Web service for demonstration purposes (the service responds with SOAP/XML). HTTPS (SSL/TLS) connectivity is supported. However, some browsers do not allow self-signed certificates. The example certificate server.pem included here is self signed. You can import the cacert.pem certificate into the browser to validate the web server. This application requires Zlib and Pthreads (you can replace Pthreads with another thread library, but you need to study the OpenSSL thread changes in the OpenSSL documentation). On Unix/Linux, please enable SIGPIPE handling, see main function below. SIGPIPE handling will avoid your server from termination when sockets are disconnected by clients before the transaction was completed (aka broken pipe). Compile without OpenSSL: soapcpp2 -c -n -popt opt.h soapcpp2 -c webserver.h Customize your COOKIE_DOMAIN in this file gcc -DWITH_COOKIES -DWITH_ZLIB -o webserver webserver.c options.c plugin/httpget.c plugin/httpform.c plugin/logging.c stdsoap2.c soapC.c soapClient.c soapServer.c -lpthread -lz Compile with OpenSSL (also enables HTTP Digest Authentication): soapcpp2 -c -n -popt opt.h soapcpp2 -c webserver.h Customize your COOKIE_DOMAIN in this file gcc -DWITH_OPENSSL -DWITH_COOKIES -DWITH_ZLIB -o webserver webserver.c options.c plugin/httpget.c plugin/httpform.c plugin/logging.c plugin/threads.c plugin/httpda.c plugin/md5evp.c stdsoap2.c soapC.c soapClient.c soapServer.c -lpthread -lz -lssl -lcrypto Compile with GNUTLS: soapcpp2 -c -n -popt opt.h soapcpp2 -c webserver.h Customize your COOKIE_DOMAIN in this file gcc -DWITH_GNUTLS -DWITH_COOKIES -DWITH_ZLIB -o webserver webserver.c options.c plugin/httpget.c plugin/httpform.c plugin/logging.c stdsoap2.c soapC.c soapClient.c soapServer.c -lpthread -lz -lgnutls -lgcrypt Use (HTTP GET): Compile the web server as explained above Start the web server on an even numbered port (e.g. 8080): > webserver 8080 & Start a web browser and open a (localhost) location: http://localhost:8080 and type userid 'admin' and passwd 'guest' to gain access Open the location: http://localhost:8080/calc.html then enter an expression Open the locations: http://localhost:8080/test.html http://localhost:8081/webserver.wsdl Use (HTTPS GET): Create the SSL certificate (see samples/ssl README and scripts) Compile the web server with OpenSSL as explained above Start the web server on an odd numbered port (e.g. 8081) > webserver 8081 & Actually, you can start two servers, one on 8080 and a secure one on 8081 Start a web browser and open a (localhost) location: https://localhost:8081 and type userid 'admin' and passwd 'guest' to gain access Open the location: https://localhost:8081/calcform1.html and enter an expression to calculate Open the locations: https://localhost:8081/test.html https://localhost:8081/webserver.wsdl Use (HTTP POST): Serves SOAP/XML calculation requests Command-line options: -z enables compression -c enables chunking -k enables keep-alive -p enables HTTP pipelining -i enables non-threaded iterative server -v enables verbose mode -o pool of threads (cannot be used with option -i) Note: interactive chunking/keep-alive settings cannot be changed, unless the number of threads is interactively changed to restart the pool Note: =0 specifies unlimited threads -t sets I/O timeout value (seconds) -s sets server timeout value (seconds) -d sets cookie domain -p sets cookie path -l[none inbound outbound both] enables logging Requires options.h and options.c for command line option parsing and for parsing interactive Web page options settings. The default_options[] array defines application options, short-hands, selection lists, and default values. See options.h for more details. */ #include "soapH.h" #include "webserver.nsmap" /* namespaces updated 4/4/13 */ #include "options.h" #include "httpget.h" #include "httppost.h" #include "httpform.h" #include "httppipe.h" /* optionally enable HTTP pipelining at the cost of increased memory usage */ #include "logging.h" #include "threads.h" #ifdef WITH_OPENSSL #include "httpda.h" /* optionally enable HTTP Digest Authentication */ #endif #include /* need SIGPIPE */ #define BACKLOG (100) #define AUTH_REALM "gSOAP Web Server Admin demo login: admin guest" #define AUTH_USERID "admin" /* user ID to access admin pages */ #define AUTH_PASSWD "guest" /* user pw to access admin pages */ void sigpipe_handle(int x) { } /******************************************************************************\ * * Thread pool and request queue * \******************************************************************************/ #define MAX_THR (100) #define MAX_QUEUE (1000) static int poolsize = 0; static SOAP_SOCKET queue[MAX_QUEUE]; static int head = 0, tail = 0; static MUTEX_TYPE queue_lock; static COND_TYPE queue_notempty; static COND_TYPE queue_notfull; /******************************************************************************\ * * Program options * \******************************************************************************/ /* The options.c module parses command line options, HTTP form options, and options stored in a config file. Options are defined as follows: */ static const struct option default_options[] = { /* "key.fullname", "unit or selection list", text field width, "default value" */ { "z.compress", NULL, }, { "c.chunking", NULL, }, { "k.keepalive", NULL, }, { "e.pipeline", NULL, }, { "i.iterative", NULL, }, { "v.verbose", NULL, }, { "o.pool", "threads", 6, (char*)"none"}, { "t.ioTimeout", "seconds", 6, (char*)"5"}, { "s.serverTimeout", "seconds", 6, (char*)"3600"}, { "d.cookieDomain", "host", 20, (char*)"localhost"}, { "p.cookiePath", "path", 20, (char*)"/"}, { "l.logging", "none inbound outbound both", }, { "", "port", }, /* takes the rest of command line args */ { NULL }, /* must be NULL terminated */ }; /* The numbering of these defines must correspond to the option order above */ #define OPTION_z 0 #define OPTION_c 1 #define OPTION_k 2 #define OPTION_e 3 #define OPTION_i 4 #define OPTION_v 5 #define OPTION_o 6 #define OPTION_t 7 #define OPTION_s 8 #define OPTION_d 9 #define OPTION_p 10 #define OPTION_l 11 #define OPTION_port 12 /******************************************************************************\ * * Static * \******************************************************************************/ static struct option *options = NULL; static time_t start; static int secure = 0; /* =0: no SSL, =1: support SSL */ static int pipeline = 0; /* =0: no HTTP pipeline, =1: HTTP pipeline */ static const char *minutes[60] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }; static const char *hours[24] = {"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23"}; /******************************************************************************\ * * Forward decls * \******************************************************************************/ void server_loop(struct soap*); void *process_request(void*); /* multi-threaded request handler */ void *process_queue(void*); /* multi-threaded request handler for pool */ void enqueue(SOAP_SOCKET); SOAP_SOCKET dequeue(); int http_GET_handler(struct soap*); /* HTTP httpget plugin GET handler */ int http_PUT_handler(struct soap*); /* HTTP httpost plugin handler for PUT (see table below) */ int http_POST_handler(struct soap*); /* HTTP httpost plugin handler for POST (see table below) */ int http_DELETE_handler(struct soap*); /* HTTP httpost plugin handler for DELETE (see table below) */ int http_form_handler(struct soap*); /* HTTP form handler */ int check_authentication(struct soap*); /* HTTP authentication check */ int copy_file(struct soap*, const char*, const char*); /* copy file as HTTP response */ int calcget(struct soap*); int calcpost(struct soap*); int info(struct soap*); int html_hbar(struct soap*, const char*, size_t, size_t, unsigned long); int html_hist(struct soap*, const char*, size_t, size_t, size_t, const char**, size_t*, size_t); int CRYPTO_thread_setup(); void CRYPTO_thread_cleanup(); /******************************************************************************\ * * PUT/POST/DELETE handlers for httppost plugin * \******************************************************************************/ struct http_post_handlers http_handlers[] = { { "PUT", http_PUT_handler }, { "POST", http_POST_handler }, { "DELETE", http_DELETE_handler }, { NULL } }; /******************************************************************************\ * * Main * \******************************************************************************/ int main(int argc, char **argv) { struct soap soap; SOAP_SOCKET master; int port = 0; int backlog = BACKLOG; start = time(NULL); options = copy_options(default_options); /* must copy, so option values can be modified */ if (parse_options(argc, argv, options)) exit(0); if (options[OPTION_port].value) port = atol(options[OPTION_port].value); if (!port) port = 8080; if (options[OPTION_i].selected) backlog = 1; fprintf(stderr, "Starting Web server on port %d\n", port); /* if the port is an odd number, the Web server uses HTTPS only */ if (port % 2) secure = 1; if (secure) fprintf(stderr, "[Note: https://localhost:%d/test.html to test the server from browser]\n", port); else fprintf(stderr, "[Note: http://localhost:%d/test.html to test the server from browser]\n", port); fprintf(stderr, "[Note: http://localhost:%d for settings, login: '"AUTH_USERID"' and '"AUTH_PASSWD"']\n", port); fprintf(stderr, "[Note: you should enable Linux/Unix SIGPIPE handlers to avoid broken pipe]\n"); /* Init SSL (can skip or call multiple times, engine inits automatically) */ soap_ssl_init(); /* soap_ssl_noinit(); call this first if SSL is initialized elsewhere in an application */ soap_init(&soap); /* set up SSL locks */ if (CRYPTO_thread_setup()) { fprintf(stderr, "Cannot setup thread mutex\n"); exit(1); } #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) /* The supplied server certificate "server.pem" assumes that the server is running on 'localhost', so clients can only connect from the same host when verifying the server's certificate. To verify the certificates of third-party services, they must provide a certificate issued by Verisign or another trusted CA. At the client-side, the capath parameter should point to a directory that contains these trusted (root) certificates or the cafile parameter should refer to one file will all certificates. To help you out, the supplied "cacerts.pem" file contains the certificates issued by various CAs. You should use this file for the cafile parameter instead of "cacert.pem" to connect to trusted servers. Note that the client may fail to connect if the server's credentials have problems (e.g. expired). Note 1: the password and capath are not used with GNUTLS Note 2: setting capath may not work on Windows. */ if (secure && soap_ssl_server_context(&soap, SOAP_SSL_DEFAULT, "server.pem", /* keyfile: see SSL docs on how to obtain this file */ "password", /* password to read the key file */ NULL, /* cacert CA certificate, or ... */ NULL, /* capath CA certificate path */ NULL, /* DH file (e.g. "dh2048.pem") or numeric DH param key len bits in string (e.g. "2048"), if NULL then use RSA */ NULL, /* if randfile!=NULL: use a file with random data to seed randomness */ "webserver" /* server identification for SSL session cache (must be a unique name) */ )) { soap_print_fault(&soap, stderr); exit(1); } #endif /* Register HTTP GET plugin */ if (soap_register_plugin_arg(&soap, http_get, (void*)http_GET_handler)) soap_print_fault(&soap, stderr); /* Register HTTP POST plugin with the table of handlers */ if (soap_register_plugin_arg(&soap, http_post, (void*)http_handlers)) soap_print_fault(&soap, stderr); /* Register HTTP form POST plugin (MUST be registered AFTER the httppost plugin) */ if (soap_register_plugin_arg(&soap, http_form, (void*)http_form_handler)) soap_print_fault(&soap, stderr); #ifdef HTTPPIPE_H if (options[OPTION_e].selected) { /* Register HTTP PIPE plugin */ if (soap_register_plugin(&soap, http_pipe)) { soap_print_fault(&soap, stderr); } else { pipeline = 1; /* HTTP pipelining cannot be turned on/off while the webserver runs */ options[OPTION_k].selected = 1; /* also enable keep-alive */ } } #endif #ifdef LOGGING_H /* Register logging plugin */ if (soap_register_plugin(&soap, logging)) soap_print_fault(&soap, stderr); #endif #ifdef HTTPDA_H /* Register HTTP Digest Authentication plugin */ if (soap_register_plugin(&soap, http_da)) soap_print_fault(&soap, stderr); #endif /* Unix SIGPIPE, this is OS dependent (win does not need this) */ /* soap.accept_flags = SO_NOSIGPIPE; */ /* some systems like this */ /* soap.socket_flags = MSG_NOSIGNAL; */ /* others need this */ /* signal(SIGPIPE, sigpipe_handle); */ /* and some older Unix systems may require a sigpipe handler */ master = soap_bind(&soap, NULL, port, backlog); if (!soap_valid_socket(master)) { soap_print_fault(&soap, stderr); exit(1); } fprintf(stderr, "Port bind successful: master socket = %d\n", master); MUTEX_SETUP(queue_lock); COND_SETUP(queue_notempty); COND_SETUP(queue_notfull); server_loop(&soap); COND_CLEANUP(queue_notfull); COND_CLEANUP(queue_notempty); MUTEX_CLEANUP(queue_lock); free_options(options); soap_end(&soap); soap_done(&soap); CRYPTO_thread_cleanup(); THREAD_EXIT; return 0; } void server_loop(struct soap *soap) { struct soap *soap_thr[MAX_THR]; THREAD_TYPE tid, tids[MAX_THR]; int req; for (req = 1; ; req++) { SOAP_SOCKET sock; int newpoolsize; options[OPTION_e].selected = pipeline; /* HTTP pipelining cannot be turned on/off while the webserver runs */ if (options[OPTION_c].selected) soap_set_omode(soap, SOAP_IO_CHUNK); /* use chunked HTTP content (fast) */ if (options[OPTION_k].selected) soap_set_mode(soap, SOAP_IO_KEEPALIVE); /* HTTP persistent connections */ if (options[OPTION_t].value) soap->send_timeout = soap->recv_timeout = atol(options[OPTION_t].value); if (options[OPTION_s].value) soap->accept_timeout = atol(options[OPTION_s].value); if (options[OPTION_l].selected == 1 || options[OPTION_l].selected == 3) soap_set_logging_inbound(soap, stdout); else soap_set_logging_inbound(soap, NULL); if (options[OPTION_l].selected == 2 || options[OPTION_l].selected == 3) soap_set_logging_outbound(soap, stdout); else soap_set_logging_outbound(soap, NULL); newpoolsize = atol(options[OPTION_o].value); if (newpoolsize < 0) newpoolsize = 0; else if (newpoolsize > MAX_THR) newpoolsize = MAX_THR; if (poolsize > newpoolsize) { int job; for (job = 0; job < poolsize; job++) enqueue(SOAP_INVALID_SOCKET); for (job = 0; job < poolsize; job++) { fprintf(stderr, "Waiting for thread %d to terminate...\n", job); THREAD_JOIN(tids[job]); fprintf(stderr, "Thread %d has stopped\n", job); free(soap_thr[job]); } poolsize = 0; } if (poolsize < newpoolsize) { int job; for (job = poolsize; job < newpoolsize; job++) { soap_thr[job] = soap_copy(soap); if (!soap_thr[job]) break; soap_thr[job]->user = (void*)(long)job; /* int to ptr */ fprintf(stderr, "Starting thread %d\n", job); while (THREAD_CREATE(&tids[job], (void*(*)(void*))process_queue, (void*)soap_thr[job])) sleep(1); } poolsize = job; } /* to control the close behavior and wait states, use the following: soap->accept_flags |= SO_LINGER; soap->linger_time = 60; */ /* the time resolution of linger_time is system dependent, though according * to some experts only zero and nonzero values matter. */ sock = soap_accept(soap); if (!soap_valid_socket(sock)) { if (soap->errnum) { soap_print_fault(soap, stderr); fprintf(stderr, "Retry...\n"); continue; } fprintf(stderr, "gSOAP Web server timed out\n"); break; } if (options[OPTION_v].selected) { if (soap->ip) fprintf(stderr, "Request #%d accepted on socket %d connected from %s IPv4=%d.%d.%d.%d\n", req, sock, soap->host, (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF); else fprintf(stderr, "Request #%d accepted on socket %d connected from %s IPv6=%.8x%.8x%.8x%.8x\n", req, sock, soap->host, soap->ip6[0], soap->ip6[1], soap->ip6[2], soap->ip6[3]); } if (poolsize > 0) { enqueue(sock); } else { struct soap *tsoap = NULL; if (!options[OPTION_i].selected) tsoap = soap_copy(soap); if (tsoap) { tsoap->user = (void*)(long)req; while (THREAD_CREATE(&tid, (void*(*)(void*))process_request, (void*)tsoap)) sleep(1); } else { #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) if (secure && soap_ssl_accept(soap)) { soap_print_fault(soap, stderr); fprintf(stderr, "SSL request failed, continue with next call...\n"); soap_end(soap); continue; } #endif /* Keep-alive: frequent EOF faults occur related to KA-timeouts: timeout: soap->error == SOAP_EOF && soap->errnum == 0 error: soap->error != SOAP_OK */ if (soap_serve(soap) && (soap->error != SOAP_EOF || (soap->errnum != 0 && !(soap->omode & SOAP_IO_KEEPALIVE)))) { fprintf(stderr, "Request #%d completed with failure %d\n", req, soap->error); soap_print_fault(soap, stderr); } else if (options[OPTION_v].selected) fprintf(stderr, "Request #%d completed\n", req); soap_destroy(soap); soap_end(soap); } } } if (poolsize > 0) { int job; for (job = 0; job < poolsize; job++) { enqueue(SOAP_INVALID_SOCKET); } for (job = 0; job < poolsize; job++) { fprintf(stderr, "Waiting for thread %d to terminate... ", job); THREAD_JOIN(tids[job]); fprintf(stderr, "terminated\n"); soap_free(soap_thr[job]); } } } /******************************************************************************\ * * Process dispatcher * \******************************************************************************/ void *process_request(void *soap) { struct soap *tsoap = (struct soap*)soap; THREAD_DETACH(THREAD_ID); #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) if (secure && soap_ssl_accept(tsoap)) { soap_print_fault(tsoap, stderr); fprintf(stderr, "SSL request failed, continue with next call...\n"); soap_destroy(tsoap); soap_end(tsoap); soap_done(tsoap); free(tsoap); return NULL; } #endif if (soap_serve(tsoap) && (tsoap->error != SOAP_EOF || (tsoap->errnum != 0 && !(tsoap->omode & SOAP_IO_KEEPALIVE)))) { fprintf(stderr, "Thread %d completed with failure %d\n", (int)(long)tsoap->user, tsoap->error); soap_print_fault(tsoap, stderr); } else if (options[OPTION_v].selected) { fprintf(stderr, "Thread %d completed\n", (int)(long)tsoap->user); } soap_destroy(tsoap); soap_end(tsoap); soap_done(tsoap); free(soap); return NULL; } /******************************************************************************\ * * Thread pool (enabled with option -o) * \******************************************************************************/ void *process_queue(void *soap) { struct soap *tsoap = (struct soap*)soap; for (;;) { tsoap->socket = dequeue(); if (!soap_valid_socket(tsoap->socket)) { if (options[OPTION_v].selected) fprintf(stderr, "Thread %d terminating\n", (int)(long)tsoap->user); break; } #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) if (secure && soap_ssl_accept(tsoap)) { soap_print_fault(tsoap, stderr); fprintf(stderr, "SSL request failed, continue with next call...\n"); soap_destroy(tsoap); soap_end(tsoap); continue; } #endif if (options[OPTION_v].selected) fprintf(stderr, "Thread %d accepted a request\n", (int)(long)tsoap->user); if (soap_serve(tsoap) && (tsoap->error != SOAP_EOF || (tsoap->errnum != 0 && !(tsoap->omode & SOAP_IO_KEEPALIVE)))) { fprintf(stderr, "Thread %d finished serving request with failure %d\n", (int)(long)tsoap->user, tsoap->error); soap_print_fault(tsoap, stderr); } else if (options[OPTION_v].selected) fprintf(stderr, "Thread %d finished serving request\n", (int)(long)tsoap->user); soap_destroy(tsoap); soap_end(tsoap); } soap_destroy(tsoap); soap_end(tsoap); soap_done(tsoap); return NULL; } void enqueue(SOAP_SOCKET sock) { int next; int ret; if ((ret = MUTEX_LOCK(queue_lock)) != 0) fprintf(stderr, "MUTEX_LOCK error %d\n", ret); next = (tail + 1) % MAX_QUEUE; while (head == next) if ((ret = COND_WAIT(queue_notfull, queue_lock)) != 0) fprintf(stderr, "COND_WAIT error %d\n", ret); queue[tail] = sock; tail = next; if (options[OPTION_v].selected) fprintf(stderr, "enqueue(%d)\n", sock); if ((ret = COND_SIGNAL(queue_notempty)) != 0) fprintf(stderr, "COND_SIGNAL error %d\n", ret); if ((ret = MUTEX_UNLOCK(queue_lock))) fprintf(stderr, "MUTEX_UNLOCK error %d\n", ret); } SOAP_SOCKET dequeue() { SOAP_SOCKET sock; int ret; if ((ret = MUTEX_LOCK(queue_lock)) != 0) fprintf(stderr, "MUTEX_LOCK error %d\n", ret); while (head == tail) if ((ret = COND_WAIT(queue_notempty, queue_lock)) != 0) fprintf(stderr, "COND_WAIT error %d\n", ret); sock = queue[head]; head = (head + 1) % MAX_QUEUE; if (options[OPTION_v].selected) fprintf(stderr, "dequeue(%d)\n", sock); if ((ret = COND_SIGNAL(queue_notfull))) fprintf(stderr, "COND_SIGNAL error %d\n", ret); if ((ret = MUTEX_UNLOCK(queue_lock))) fprintf(stderr, "MUTEX_UNLOCK error %d\n", ret); return sock; } /******************************************************************************\ * * SOAP/XML handling: calculator example * \******************************************************************************/ int ns__add(struct soap *soap, double a, double b, double *c) { *c = a + b; return SOAP_OK; } int ns__sub(struct soap *soap, double a, double b, double *c) { *c = a - b; return SOAP_OK; } int ns__mul(struct soap *soap, double a, double b, double *c) { *c = a * b; return SOAP_OK; } int ns__div(struct soap *soap, double a, double b, double *c) { *c = a / b; return SOAP_OK; } /******************************************************************************\ * * Server dummy methods to avoid link errors * \******************************************************************************/ int ns__addResponse_(struct soap *soap, double a) { (void)soap; (void)a; return SOAP_NO_METHOD; /* we don't use this: we use soap_send_ns__addResponse instead */ } int ns__subResponse_(struct soap *soap, double a) { (void)soap; (void)a; return SOAP_NO_METHOD; /* we don't use this: we use soap_send_ns__subResponse instead */ } int ns__mulResponse_(struct soap *soap, double a) { (void)soap; (void)a; return SOAP_NO_METHOD; /* we don't use this: we use soap_send_ns__mulResponse instead */ } int ns__divResponse_(struct soap *soap, double a) { (void)soap; (void)a; return SOAP_NO_METHOD; /* we don't use this: we use soap_send_ns__divResponse instead */ } /******************************************************************************\ * * HTTP GET handler for httpget plugin * \******************************************************************************/ int http_GET_handler(struct soap *soap) { /* gSOAP >=2.5 soap_response() will do this automatically for us, when sending SOAP_HTML or SOAP_FILE: if ((soap->omode & SOAP_IO) != SOAP_IO_CHUNK) soap_set_omode(soap, SOAP_IO_STORE); */ /* if not chunking we MUST buffer entire content when returning HTML pages to determine content length */ #ifdef WITH_ZLIB if (options[OPTION_z].selected && soap->zlib_out == SOAP_ZLIB_GZIP) /* client accepts gzip */ { soap_set_omode(soap, SOAP_ENC_ZLIB); /* we can compress content (gzip) */ soap->z_level = 9; /* best compression */ } else soap_clr_omode(soap, SOAP_ENC_ZLIB); #endif /* Use soap->path (from request URL) to determine request: */ if (options[OPTION_v].selected) fprintf(stderr, "HTTP GET Request '%s' to host '%s' path '%s'\n", soap->endpoint, soap->host, soap->path); /* we don't like requests to snoop around in dirs, so we must reject request that have paths with a '/' or a '\'. You must at least check for .. to avoid request from snooping around in higher dirs!!! */ /* Note: soap->path always starts with '/' so we chech path + 1 */ if (strchr(soap->path + 1, '/') || strchr(soap->path + 1, '\\')) return 403; /* HTTP forbidden */ if (!soap_tag_cmp(soap->path, "*.html")) return copy_file(soap, soap->path + 1, "text/html"); if (!soap_tag_cmp(soap->path, "*.xml")) return copy_file(soap, soap->path + 1, "text/xml"); if (!soap_tag_cmp(soap->path, "*.jpg")) return copy_file(soap, soap->path + 1, "image/jpeg"); if (!soap_tag_cmp(soap->path, "*.gif")) return copy_file(soap, soap->path + 1, "image/gif"); if (!soap_tag_cmp(soap->path, "*.png")) return copy_file(soap, soap->path + 1, "image/png"); if (!soap_tag_cmp(soap->path, "*.ico")) return copy_file(soap, soap->path + 1, "image/ico"); if (!strncmp(soap->path, "/calc?", 6)) return calcget(soap); if (!strncmp(soap->path, "/genivia", 8)) { (SOAP_SNPRINTF(soap->endpoint, sizeof(soap->endpoint), strlen(soap->path) + 10), "http://genivia.com%s", soap->path + 8); /* redirect */ return 307; /* Temporary Redirect */ } if (!strncmp(soap->path, "/product?SKU=", 13)) { struct ns__record record; soap_default_ns__record(soap, &record); record.SKU = atoi(soap->path + 13); record.product_name = (char*)"widgets"; record.in_store = 42; soap->http_content = "text/xml"; if (soap_response(soap, SOAP_FILE) || soap_put_ns__record(soap, &record, "ns:record", NULL) || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } /* Check requestor's authentication: */ if (check_authentication(soap)) return 401; /* HTTP not authorized */ /* For example, we can put WSDL and XSD files behind authentication wall */ if (!soap_tag_cmp(soap->path, "*.xsd") || !soap_tag_cmp(soap->path, "*.wsdl")) return copy_file(soap, soap->path + 1, "text/xml"); /* Return Web server status */ if (soap->path[1] == '\0' || soap->path[1] == '?') return info(soap); return 404; /* HTTP not found */ } int check_authentication(struct soap *soap) { if (soap->userid && soap->passwd) { if (!strcmp(soap->userid, AUTH_USERID) && !strcmp(soap->passwd, AUTH_PASSWD)) return SOAP_OK; } #ifdef HTTPDA_H else if (soap->authrealm && soap->userid) { if (!strcmp(soap->authrealm, AUTH_REALM) && !strcmp(soap->userid, AUTH_USERID)) if (!http_da_verify_get(soap, (char*)AUTH_PASSWD)) return SOAP_OK; } #endif soap->authrealm = AUTH_REALM; return 401; } /******************************************************************************\ * * HTTP PUT handler for httppost plugin * \******************************************************************************/ int http_PUT_handler(struct soap *soap) { /* Use soap->path (from request URL) to determine request: */ if (options[OPTION_v].selected) fprintf(stderr, "HTTP PUT Request: %s\n", soap->endpoint); /* Note: soap->path always starts with '/' */ if (!strcmp(soap->path, "/person.xml")) { /* in this example we actually do not save the XML data as a file person.xml, but we could! */ const char *data = soap_http_get_body(soap, NULL); (void)soap_end_recv(soap); return data ? 202 : 500; /* HTTP accepted or error when no data was received */ } if (!strcmp(soap->path, "/product")) { /* in this example we actually do not save the record data, but we could! */ struct ns__record *record = soap_get_ns__record(soap, NULL, "ns:record", NULL); (void)soap_end_recv(soap); return record ? 202 : 500; /* HTTP accepted */ } return 404; /* HTTP not found */ } /******************************************************************************\ * * HTTP POST handler for httppost plugin * \******************************************************************************/ int http_POST_handler(struct soap *soap) { #ifdef WITH_ZLIB if (options[OPTION_z].selected && soap->zlib_out == SOAP_ZLIB_GZIP) /* client accepts gzip */ soap_set_omode(soap, SOAP_ENC_ZLIB); /* so we can compress content (gzip) */ soap->z_level = 9; /* best compression */ #endif /* Use soap->path (from request URL) to determine request: */ if (options[OPTION_v].selected) fprintf(stderr, "HTTP Request: %s\n", soap->endpoint); /* Note: soap->path always starts with '/' */ if (!strcmp(soap->path, "/person.xml")) { /* in this example we actually do not save the data as a file person.xml, but we could! */ const char *data = soap_http_get_body(soap, NULL); (void)soap_end_recv(soap); return copy_file(soap, "person.xml", "text/xml"); } if (!strcmp(soap->path, "/product")) { /* in this example we actually do not save the record data, but we could! */ struct ns__record *record = soap_get_ns__record(soap, NULL, "ns:record", NULL); if (!record || soap_end_recv(soap)) return 500; /* copy ns__record received to response message */ if (soap_response(soap, SOAP_FILE) || soap_put_ns__record(soap, record, "ns:record", NULL) || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } return 404; /* HTTP not found */ } /******************************************************************************\ * * HTTP DELETE handler for httppost plugin * \******************************************************************************/ int http_DELETE_handler(struct soap *soap) { /* Use soap->path (from request URL) to determine request: */ if (options[OPTION_v].selected) fprintf(stderr, "HTTP DELETE Request: %s\n", soap->endpoint); /* Note: soap->path always starts with '/' */ if (!strcmp(soap->path, "/person.xml")) return 202; /* HTTP accepted */ return 404; /* HTTP not found */ } /******************************************************************************\ * * HTTP POST application/x-www-form-urlencoded handler for httpform plugin * \******************************************************************************/ int http_form_handler(struct soap *soap) { #ifdef WITH_ZLIB if (options[OPTION_z].selected && soap->zlib_out == SOAP_ZLIB_GZIP) /* client accepts gzip */ soap_set_omode(soap, SOAP_ENC_ZLIB); /* so we can compress content (gzip) */ soap->z_level = 9; /* best compression */ #endif /* Use soap->path (from request URL) to determine request: */ if (options[OPTION_v].selected) fprintf(stderr, "HTTP POST Request: %s\n", soap->endpoint); /* Note: soap->path always starts with '/' */ if (!strcmp(soap->path, "/calc")) return calcpost(soap); return 404; /* HTTP not found */ } /******************************************************************************\ * * Copy static page * \******************************************************************************/ int copy_file(struct soap *soap, const char *name, const char *type) { FILE *fd; size_t r; fd = fopen(name, "rb"); /* open file to copy */ if (!fd) return 404; /* return HTTP not found */ soap->http_content = type; if (soap_response(soap, SOAP_FILE)) /* OK HTTP response header */ { soap_end_send(soap); fclose(fd); return soap->error; } for (;;) { r = fread(soap->tmpbuf, 1, sizeof(soap->tmpbuf), fd); if (!r) break; if (soap_send_raw(soap, soap->tmpbuf, r)) { soap_end_send(soap); fclose(fd); return soap->error; } } fclose(fd); return soap_end_send(soap); } /******************************************************************************\ * * Example dynamic HTTP GET application/x-www-form-urlencoded calculator * \******************************************************************************/ int calcget(struct soap *soap) { int o = 0, a = 0, b = 0, val; char buf[256]; char *s = soap_query(soap); /* get argument string from URL ?query string */ while (s) { char *key = soap_query_key(soap, &s); /* decode next query string key */ char *val = soap_query_val(soap, &s); /* decode next query string value (if any) */ if (key && val) { if (!strcmp(key, "o")) o = val[0]; else if (!strcmp(key, "a")) a = strtol(val, NULL, 10); else if (!strcmp(key, "b")) b = strtol(val, NULL, 10); } } switch (o) { case 'a': val = a + b; break; case 's': val = a - b; break; case 'm': val = a * b; break; case 'd': val = a / b; break; default: return soap_sender_fault(soap, "Unknown operation", NULL); } soap_response(soap, SOAP_HTML); (SOAP_SNPRINTF(buf, sizeof(buf), 40), "value=%d", val); soap_send(soap, buf); soap_end_send(soap); return SOAP_OK; } /******************************************************************************\ * * Example dynamic HTTP POST application/x-www-form-urlencoded calculator * \******************************************************************************/ int calcpost(struct soap *soap) { int o = 0, a = 0, b = 0, val; char buf[256]; char *s = soap_http_get_form(soap); /* get form data from body */ while (s) { char *key = soap_query_key(soap, &s); /* decode next key */ char *val = soap_query_val(soap, &s); /* decode next value (if any) */ if (key && val) { if (!strcmp(key, "o")) o = val[0]; else if (!strcmp(key, "a")) a = strtol(val, NULL, 10); else if (!strcmp(key, "b")) b = strtol(val, NULL, 10); } } switch (o) { case 'a': val = a + b; break; case 's': val = a - b; break; case 'm': val = a * b; break; case 'd': val = a / b; break; default: return soap_sender_fault(soap, "Unknown operation", NULL); } soap_response(soap, SOAP_HTML); (SOAP_SNPRINTF(buf, sizeof(buf), 40), "value=%d", val); soap_send(soap, buf); soap_end_send(soap); return SOAP_OK; } /******************************************************************************\ * * Example dynamic HTTP POST multipart/form-data form-based calculator * \******************************************************************************/ int f__form1(struct soap *soap) { int o = 0, a = 0, b = 0, val; char buf[256]; struct soap_multipart *content; for (content = soap->mime.list; content; content = content->next) { if (content->id && content->ptr) { /* may have to check content->encoding to convert data when necessary! */ if (!strcmp(content->id, "o")) o = content->ptr[0]; else if (!strcmp(content->id, "a")) a = strtol(content->ptr, NULL, 10); else if (!strcmp(content->id, "b")) b = strtol(content->ptr, NULL, 10); } } switch (o) { case 'a': val = a + b; break; case 's': val = a - b; break; case 'm': val = a * b; break; case 'd': val = a / b; break; default: return soap_sender_fault(soap, "Unknown operation", NULL); } soap_response(soap, SOAP_HTML); (SOAP_SNPRINTF(buf, sizeof(buf), 40), "value=%d", val); soap_send(soap, buf); soap_end_send(soap); return SOAP_OK; } int f__form2(struct soap *soap, struct f__formResponse *response) { int o = 0, a = 0, b = 0; struct soap_multipart *content; for (content = soap->mime.list; content; content = content->next) { if (content->id && content->ptr) { /* may have to check content->encoding to convert data when necessary! */ if (!strcmp(content->id, "o")) o = content->ptr[0]; else if (!strcmp(content->id, "a")) a = strtol(content->ptr, NULL, 10); else if (!strcmp(content->id, "b")) b = strtol(content->ptr, NULL, 10); } } switch (o) { case 'a': response->result = a + b; break; case 's': response->result = a - b; break; case 'm': response->result = a * b; break; case 'd': response->result = a / b; break; default: return soap_sender_fault(soap, "Unknown operation", NULL); } return SOAP_OK; } /******************************************************************************\ * * Dynamic Web server info page * \******************************************************************************/ int info(struct soap *soap) { size_t stat_get, stat_post, stat_fail, *hist_min, *hist_hour, *hist_day; size_t stat_sent, stat_recv; const char *t0, *t1, *t2, *t3, *t4, *t5, *t6, *t7, *t8; char buf[4096]; /* a small buffer that is large enough to hold parts of HTML content */ struct soap_plugin *p; time_t now = time(NULL), elapsed = now - start; struct tm T; options[OPTION_e].selected = pipeline; /* HTTP pipelining cannot be turned on/off while the webserver runs */ query_options(soap, options); if ((soap->omode & SOAP_IO_KEEPALIVE)) t0 = "YES"; else t0 = "NO"; if (pipeline) t1 = "YES"; else t1 = "NO"; #ifdef WITH_COOKIES t2 = "YES"; /* soap_env_cookie_value() returns value of a cookie received (from client) */ if (soap_env_cookie_value(soap, "visit", NULL, NULL)) t3 = "PASS"; else t3 = "WAIT"; #else t2 = "NO"; t3 = "N/A"; #endif if (secure) { t4 = "YES"; if (soap->imode & SOAP_ENC_SSL) t5 = "PASS"; else t5 = "FAIL"; } else { t4 = "NO"; t5 = "N/A"; } #ifdef WITH_ZLIB if (options[OPTION_z].selected) { t6 = "YES"; if (soap->omode & SOAP_ENC_ZLIB) t7 = "PASS"; else t7 = "WAIT"; } else { t6 = "NO"; t7 = "N/A"; } #else t6 = "NO"; t7 = "N/A"; #endif if (options[OPTION_c].selected || (soap->omode & SOAP_IO) == SOAP_IO_CHUNK) t8 = "YES"; else t8 = "NO"; #ifdef WITH_COOKIES soap->cookie_domain = options[OPTION_d].value; /* set domain of this server */ soap->cookie_path = options[OPTION_p].value; /* set root path of the cookies */ soap_set_cookie(soap, "visit", "true", NULL, NULL); /* use global domain/path */ soap_set_cookie_expire(soap, "visit", 600, NULL, NULL); /* max-age is 600 seconds to expire */ #endif if (soap_response(soap, SOAP_HTML)) return soap->error; if (soap_send(soap, "\ \ \ \ \ \ gSOAP Web Server Administration\ \ \

gSOAP Web Server Administration

")) return soap->error; if (soap->ip) (SOAP_SNPRINTF(buf, sizeof(buf), 4095), "

Server endpoint=%s client agent %s with IPv4=%d.%d.%d.%d", soap->endpoint, soap->host, (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF); else (SOAP_SNPRINTF(buf, sizeof(buf), 4095), "

Server endpoint=%s client agent %s with IPv6=%.8x%.8x%.8x%.8x", soap->endpoint, soap->host, soap->ip6[0], soap->ip6[1], soap->ip6[2], soap->ip6[3]); if (soap_send(soap, buf) || soap_send(soap, "

Registered Plugins

")) return soap->error; for (p = soap->plugins; p; p = p->next) { if (soap_send(soap, p->id) || soap_send(soap, "
")) return soap->error; } if (soap_send(soap, "

Elapsed Time

")) return soap->error; if (elapsed >= 86400) html_hbar(soap, "Days:", 100, elapsed/86400, 0x000000); if (elapsed >= 3600) html_hbar(soap, "Hours:", 100, elapsed/3600%24, 0x000000); html_hbar(soap, "Minutes:", 100, elapsed/60%60, 0x000000); soap_send(soap, "

Control Panel

"); if (html_form_options(soap, options)) return soap->error; (SOAP_SNPRINTF(buf, sizeof(buf), 4095), "\

HTTP Functional Tests

\ \ \ \ %s\ %s\ %s\ %s\ %s\ %s\ %s\ %s\ %s\ \
FunctionResult
HTTP operationalYES
HTTP keep alive enabled
HTTP pipeline enabled
HTTP cookies enabled
HTTP cookies test
HTTPS (OpenSSL) enabled
HTTPS (OpenSSL) test
HTTP compression enabled
HTTP compression test
HTTP chunking enabled
", t0, t1, t2, t3, t4, t5, t6, t7, t8); if (soap_send(soap, buf)) return soap->error; soap_http_get_stats(soap, &stat_get, &stat_post, &stat_fail, &hist_min, &hist_hour, &hist_day); soap_logging_stats(soap, &stat_sent, &stat_recv); soap_send(soap, "

Usage Statistics

"); html_hbar(soap, "HTTP GET", 120, stat_get, 0x0000FF); html_hbar(soap, "HTTP POST", 120, stat_post, 0x00FF00); html_hbar(soap, "HTTP FAIL", 120, stat_fail, 0xFF0000); html_hbar(soap, "SENT(kB)", 120, stat_sent/1024, 0x00FFFF); html_hbar(soap, "RECV(kB)", 120, stat_recv/1024, 0x00FFFF); if (elapsed > 0) { html_hbar(soap, "SENT(kB/s)", 120, stat_sent/elapsed/1024, 0x00FFFF); html_hbar(soap, "RECV(kB/s)", 120, stat_recv/elapsed/1024, 0x00FFFF); } T.tm_min = 99; T.tm_hour = 99; T.tm_yday = 999; #ifdef HAVE_LOCALTIME_R localtime_r(&now, &T); #else T = *localtime(&now); #endif soap_send(soap, "

Requests by the Minute

"); html_hist(soap, "Minute", 12, 0, 60, minutes, hist_min, T.tm_min); soap_send(soap, "

Requests by the Hour

"); html_hist(soap, "Hour", 30, 0, 24, hours, hist_hour, T.tm_hour); soap_send(soap, "

Requests by Day of the Year

"); html_hist(soap, "Day", 2, 0, 365, NULL, hist_day, T.tm_yday); soap_send(soap, "\

This page will automatically reload every minute to refresh the statistics.\


Powered by gSOAP\ \ "); return soap_end_send(soap); } static size_t html_scaled(char *buf, size_t max, size_t len) { if (len > 1000000) { (SOAP_SNPRINTF(buf, max, 39), "%.2f·106", (float)len/1000000.0); return len / 1000000; } if (len > 1000) { (SOAP_SNPRINTF(buf, max, 39), "%.2f·103", (float)len/1000.0); return len / 1000; } (SOAP_SNPRINTF(buf, max, 20), "%lu", (unsigned long)len); return len; } int html_hbar(struct soap *soap, const char *title, size_t pix, size_t len, unsigned long color) { char buf[4096]; /* buffer large enough to hold parts of HTML content */ char lab[40]; len = html_scaled(lab, sizeof(lab), len); (SOAP_SNPRINTF(buf, sizeof(buf), 4095), "\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
%s %s
", (unsigned long)pix, title && strlen(title) < 80 ? title : "", lab, color, (unsigned long)len * 2); return soap_send(soap, buf); } int html_hist(struct soap *soap, const char *title, size_t barwidth, size_t height, size_t num, const char **key, size_t *val, size_t highlight) { char buf[4096]; /* buffer large enough to hold HTML content */ char lab[40]; size_t i, max; float scale; max = 0; for (i = 0; i < num; i++) { if (val[i] > max) max = val[i]; } if (height < 20) { height = max; if (height < 20) height = 20; else if (height > 256) height = 256; } scale = (float)height / (float)max; html_scaled(lab, sizeof(lab), max); (SOAP_SNPRINTF(buf, sizeof(buf), 4095), "\ \ \ \ \ \ \ \ ", title && strlen(title) < 80 ? title : "", (unsigned long)height + 50, (unsigned long)num + 1, (unsigned long)height, (unsigned long)height, lab); if (soap_send(soap, buf)) return soap->error; for (i = 0; i < num; i++) { unsigned long bar = (scale * val[i] + 0.5); if (bar >= 1) (SOAP_SNPRINTF(buf, sizeof(buf), 4095), "\ ", (unsigned long)i, title && strlen(title) < 80 ? title : "", (unsigned long)barwidth, (unsigned long)barwidth, bar - 1); else (SOAP_SNPRINTF(buf, sizeof(buf), 4095), "\ ", (unsigned long)barwidth); if (soap_send(soap, buf)) return soap->error; } (SOAP_SNPRINTF(buf, sizeof(buf), 4095), "\ \ \ \ \ \ ", (unsigned long)height, (unsigned long)height, title && strlen(title) < 80 ? title : ""); if (soap_send(soap, buf)) return soap->error; for (i = 0; i < num; i++) { (SOAP_SNPRINTF(buf, sizeof(buf), 4095), "%s", (i == highlight) ? " bgcolor='#777777'" : "", key ? key[i] : ""); if (soap_send(soap, buf)) return soap->error; } if (soap_send(soap, "\ \ ")) return soap->error; (SOAP_SNPRINTF(buf, sizeof(buf), 4095), "\ \ \ \ \ \ \ \ \ \
%s
%s
", (unsigned long)num + 1, (unsigned long)num + 2); return soap_send(soap, buf); } /******************************************************************************\ * * OpenSSL * \******************************************************************************/ #if defined(WITH_OPENSSL) struct CRYPTO_dynlock_value { MUTEX_TYPE mutex; }; static MUTEX_TYPE *mutex_buf = NULL; static struct CRYPTO_dynlock_value *dyn_create_function(const char *file, int line) { struct CRYPTO_dynlock_value *value; (void)file; (void)line; value = (struct CRYPTO_dynlock_value*)OPENSSL_malloc(sizeof(struct CRYPTO_dynlock_value)); if (value) MUTEX_SETUP(value->mutex); return value; } static void dyn_lock_function(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line) { (void)file; (void)line; if (mode & CRYPTO_LOCK) MUTEX_LOCK(l->mutex); else MUTEX_UNLOCK(l->mutex); } static void dyn_destroy_function(struct CRYPTO_dynlock_value *l, const char *file, int line) { (void)file; (void)line; MUTEX_CLEANUP(l->mutex); OPENSSL_free(l); } static void locking_function(int mode, int n, const char *file, int line) { (void)file; (void)line; if (mode & CRYPTO_LOCK) MUTEX_LOCK(mutex_buf[n]); else MUTEX_UNLOCK(mutex_buf[n]); } static unsigned long id_function() { return (unsigned long)THREAD_ID; } int CRYPTO_thread_setup() { int i; mutex_buf = (MUTEX_TYPE*)OPENSSL_malloc(CRYPTO_num_locks() * sizeof(MUTEX_TYPE)); if (!mutex_buf) return SOAP_EOM; for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_SETUP(mutex_buf[i]); CRYPTO_set_id_callback(id_function); CRYPTO_set_locking_callback(locking_function); CRYPTO_set_dynlock_create_callback(dyn_create_function); CRYPTO_set_dynlock_lock_callback(dyn_lock_function); CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function); return SOAP_OK; } void CRYPTO_thread_cleanup() { int i; if (!mutex_buf) return; CRYPTO_set_id_callback(NULL); CRYPTO_set_locking_callback(NULL); CRYPTO_set_dynlock_create_callback(NULL); CRYPTO_set_dynlock_lock_callback(NULL); CRYPTO_set_dynlock_destroy_callback(NULL); for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_CLEANUP(mutex_buf[i]); OPENSSL_free(mutex_buf); mutex_buf = NULL; } #else /* OpenSSL not used or OpenSSL prior to 1.1.0 */ int CRYPTO_thread_setup() { return SOAP_OK; } void CRYPTO_thread_cleanup() { } #endif gsoap-2.8.91/gsoap/samples/calc_xcode/0000755000175000017500000000000013525245162017132 5ustar ellertellertgsoap-2.8.91/gsoap/samples/calc_xcode/soapC.cpp0000644000175000017500000030411113525245162020703 0ustar ellertellert/* soapC.cpp Generated by gSOAP 2.8.91 for calc.h gSOAP XML Web services tools Copyright (C) 2000-2018, Robert van Engelen, Genivia Inc. All Rights Reserved. The soapcpp2 tool and its generated software are released under the GPL. 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 -------------------------------------------------------------------------------- */ #if defined(__BORLANDC__) #pragma option push -w-8060 #pragma option push -w-8004 #endif #include "soapH.h" SOAP_SOURCE_STAMP("@(#) soapC.cpp ver 2.8.91 2019-08-15 12:02:55 GMT") #ifndef WITH_NOGLOBAL 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", soap->header, NULL); soap->part = SOAP_END_HEADER; return soap->header == NULL; } SOAP_FMAC3 int SOAP_FMAC4 soap_putheader(struct soap *soap) { if (soap->version && soap->header) { soap->part = SOAP_IN_HEADER; if (soap_out_SOAP_ENV__Header(soap, "SOAP-ENV:Header", 0, soap->header, "")) return soap->error; soap->part = SOAP_END_HEADER; } return SOAP_OK; } SOAP_FMAC3 void SOAP_FMAC4 soap_serializeheader(struct soap *soap) { if (soap->version && soap->header) soap_serialize_SOAP_ENV__Header(soap, soap->header); } SOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap *soap) { if (soap->header == NULL) { if ((soap->header = soap_new_SOAP_ENV__Header(soap))) soap_default_SOAP_ENV__Header(soap, soap->header); } } SOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap *soap) { if (soap->fault == NULL) { soap->fault = soap_new_SOAP_ENV__Fault(soap, -1); if (soap->fault == NULL) return; } if (soap->version == 2 && soap->fault->SOAP_ENV__Code == NULL) soap->fault->SOAP_ENV__Code = soap_new_SOAP_ENV__Code(soap, -1); if (soap->version == 2 && soap->fault->SOAP_ENV__Reason == NULL) soap->fault->SOAP_ENV__Reason = soap_new_SOAP_ENV__Reason(soap, -1); } 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", ""); 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->fault == NULL) return NULL; if (soap->version == 2 && soap->fault->SOAP_ENV__Code) return (const char**)(void*)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Value; return (const char**)(void*)&soap->fault->faultcode; } SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultsubcode(struct soap *soap) { soap_fault(soap); if (soap->fault == NULL) return NULL; if (soap->version == 2 && soap->fault->SOAP_ENV__Code) { if (soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode == NULL) { soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode = soap_new_SOAP_ENV__Code(soap, -1); if (soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode == NULL) return NULL; } return (const char**)(void*)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode->SOAP_ENV__Value; } return (const char**)(void*)&soap->fault->faultcode; } SOAP_FMAC3 const char * SOAP_FMAC4 soap_fault_subcode(struct soap *soap) { const char **s = soap_faultsubcode(soap); return s ? *s : NULL; } SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultstring(struct soap *soap) { soap_fault(soap); if (soap->fault == NULL) return NULL; if (soap->version == 2 && soap->fault->SOAP_ENV__Reason) return (const char**)(void*)&soap->fault->SOAP_ENV__Reason->SOAP_ENV__Text; return (const char**)(void*)&soap->fault->faultstring; } SOAP_FMAC3 const char * SOAP_FMAC4 soap_fault_string(struct soap *soap) { const char **s = soap_faultstring(soap); return s ? *s : NULL; } SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultdetail(struct soap *soap) { soap_fault(soap); if (soap->fault == NULL) return NULL; if (soap->version == 2) { if (soap->fault->SOAP_ENV__Detail == NULL) soap->fault->SOAP_ENV__Detail = soap_new_SOAP_ENV__Detail(soap, -1); return (const char**)(void*)&soap->fault->SOAP_ENV__Detail->__any; } if (soap->fault->detail == NULL) soap->fault->detail = soap_new_SOAP_ENV__Detail(soap, -1); return (const char**)(void*)&soap->fault->detail->__any; } SOAP_FMAC3 const char * SOAP_FMAC4 soap_fault_detail(struct soap *soap) { const char **s = soap_faultdetail(soap); return s ? *s : NULL; } #endif #ifndef WITH_NOIDREF SOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap *soap) { int t; if (soap->version == 1) { for (;;) { if (!soap_getelement(soap, NULL, &t)) if ((soap->error && soap->error != SOAP_TAG_MISMATCH) || soap_ignore_element(soap)) break; } } if (soap->error == SOAP_NO_TAG || soap->error == SOAP_EOF) soap->error = SOAP_OK; return soap->error; } #endif #ifdef __cplusplus extern "C" { #endif SOAP_FMAC3 void * SOAP_FMAC4 soap_getelement(struct soap *soap, const char *tag, int *type) { (void)type; if (soap_peek_element(soap)) return NULL; #ifndef WITH_NOIDREF 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, tag, NULL, "xsd:byte"); case SOAP_TYPE_int: return soap_in_int(soap, tag, NULL, "xsd:int"); case SOAP_TYPE_double: return soap_in_double(soap, tag, NULL, "xsd:double"); case SOAP_TYPE_ns__pow: return soap_in_ns__pow(soap, tag, NULL, "ns:pow"); case SOAP_TYPE_ns__powResponse: return soap_in_ns__powResponse(soap, tag, NULL, "ns:powResponse"); case SOAP_TYPE_ns__div: return soap_in_ns__div(soap, tag, NULL, "ns:div"); case SOAP_TYPE_ns__divResponse: return soap_in_ns__divResponse(soap, tag, NULL, "ns:divResponse"); case SOAP_TYPE_ns__mul: return soap_in_ns__mul(soap, tag, NULL, "ns:mul"); case SOAP_TYPE_ns__mulResponse: return soap_in_ns__mulResponse(soap, tag, NULL, "ns:mulResponse"); case SOAP_TYPE_ns__sub: return soap_in_ns__sub(soap, tag, NULL, "ns:sub"); case SOAP_TYPE_ns__subResponse: return soap_in_ns__subResponse(soap, tag, NULL, "ns:subResponse"); case SOAP_TYPE_ns__add: return soap_in_ns__add(soap, tag, NULL, "ns:add"); case SOAP_TYPE_ns__addResponse: return soap_in_ns__addResponse(soap, tag, NULL, "ns:addResponse"); case SOAP_TYPE_PointerTodouble: return soap_in_PointerTodouble(soap, tag, NULL, "xsd:double"); case SOAP_TYPE__QName: { char **s; s = soap_in__QName(soap, tag, NULL, "xsd:QName"); return s ? *s : NULL; } case SOAP_TYPE_string: { char **s; s = soap_in_string(soap, tag, NULL, "xsd:string"); return s ? *s : NULL; } default: #else *type = 0; #endif { 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, tag, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:int")) { *type = SOAP_TYPE_int; return soap_in_int(soap, tag, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:double")) { *type = SOAP_TYPE_double; return soap_in_double(soap, tag, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:pow")) { *type = SOAP_TYPE_ns__pow; return soap_in_ns__pow(soap, tag, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:powResponse")) { *type = SOAP_TYPE_ns__powResponse; return soap_in_ns__powResponse(soap, tag, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:div")) { *type = SOAP_TYPE_ns__div; return soap_in_ns__div(soap, tag, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:divResponse")) { *type = SOAP_TYPE_ns__divResponse; return soap_in_ns__divResponse(soap, tag, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:mul")) { *type = SOAP_TYPE_ns__mul; return soap_in_ns__mul(soap, tag, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:mulResponse")) { *type = SOAP_TYPE_ns__mulResponse; return soap_in_ns__mulResponse(soap, tag, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:sub")) { *type = SOAP_TYPE_ns__sub; return soap_in_ns__sub(soap, tag, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:subResponse")) { *type = SOAP_TYPE_ns__subResponse; return soap_in_ns__subResponse(soap, tag, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:add")) { *type = SOAP_TYPE_ns__add; return soap_in_ns__add(soap, tag, NULL, NULL); } if (!soap_match_tag(soap, t, "ns:addResponse")) { *type = SOAP_TYPE_ns__addResponse; return soap_in_ns__addResponse(soap, tag, NULL, NULL); } if (!soap_match_tag(soap, t, "xsd:QName")) { char **s; *type = SOAP_TYPE__QName; s = soap_in__QName(soap, tag, 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, tag, NULL, NULL); return s ? *s : NULL; } t = soap->tag; #ifndef WITH_NOIDREF } #endif } soap->error = SOAP_TAG_MISMATCH; return NULL; } #ifdef __cplusplus } #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 (soap->mustUnderstand && !soap->other && !soap->fignore) return soap->error = SOAP_MUSTUNDERSTAND; if (((soap->mode & SOAP_XML_STRICT) && !soap->fignore && 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, NULL, &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_ignore(soap)) return soap->error; } } 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, SOAP_MULTIREFTAG, pp->id, pp->type)) return soap->error; return SOAP_OK; } #endif #ifdef __cplusplus extern "C" { #endif SOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap *soap, const void *ptr, const char *tag, int id, int type) { (void)tag; 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_double: return soap_out_double(soap, tag, id, (const double *)ptr, "xsd:double"); case SOAP_TYPE_ns__pow: return soap_out_ns__pow(soap, tag, id, (const struct ns__pow *)ptr, "ns:pow"); case SOAP_TYPE_ns__powResponse: return soap_out_ns__powResponse(soap, tag, id, (const struct ns__powResponse *)ptr, "ns:powResponse"); case SOAP_TYPE_ns__div: return soap_out_ns__div(soap, tag, id, (const struct ns__div *)ptr, "ns:div"); case SOAP_TYPE_ns__divResponse: return soap_out_ns__divResponse(soap, tag, id, (const struct ns__divResponse *)ptr, "ns:divResponse"); case SOAP_TYPE_ns__mul: return soap_out_ns__mul(soap, tag, id, (const struct ns__mul *)ptr, "ns:mul"); case SOAP_TYPE_ns__mulResponse: return soap_out_ns__mulResponse(soap, tag, id, (const struct ns__mulResponse *)ptr, "ns:mulResponse"); case SOAP_TYPE_ns__sub: return soap_out_ns__sub(soap, tag, id, (const struct ns__sub *)ptr, "ns:sub"); case SOAP_TYPE_ns__subResponse: return soap_out_ns__subResponse(soap, tag, id, (const struct ns__subResponse *)ptr, "ns:subResponse"); case SOAP_TYPE_ns__add: return soap_out_ns__add(soap, tag, id, (const struct ns__add *)ptr, "ns:add"); case SOAP_TYPE_ns__addResponse: return soap_out_ns__addResponse(soap, tag, id, (const struct ns__addResponse *)ptr, "ns:addResponse"); case SOAP_TYPE_PointerTodouble: return soap_out_PointerTodouble(soap, tag, id, (double *const*)ptr, "xsd:double"); case SOAP_TYPE__QName: return soap_out_string(soap, tag, id, (char*const*)(void*)&ptr, "xsd:QName"); case SOAP_TYPE_string: return soap_out_string(soap, tag, id, (char*const*)(void*)&ptr, "xsd:string"); case 0: return SOAP_OK; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_putelement '%s' failed for type %d in soapC.cpp\n", tag ? tag : "", type)); return soap_element_empty(soap, tag); /* unknown type to serialize */ } #ifdef __cplusplus } #endif #ifndef WITH_NOIDREF #ifdef __cplusplus extern "C" { #endif 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_ns__pow: soap_serialize_ns__pow(soap, (const struct ns__pow *)ptr); break; case SOAP_TYPE_ns__powResponse: soap_serialize_ns__powResponse(soap, (const struct ns__powResponse *)ptr); break; case SOAP_TYPE_ns__div: soap_serialize_ns__div(soap, (const struct ns__div *)ptr); break; case SOAP_TYPE_ns__divResponse: soap_serialize_ns__divResponse(soap, (const struct ns__divResponse *)ptr); break; case SOAP_TYPE_ns__mul: soap_serialize_ns__mul(soap, (const struct ns__mul *)ptr); break; case SOAP_TYPE_ns__mulResponse: soap_serialize_ns__mulResponse(soap, (const struct ns__mulResponse *)ptr); break; case SOAP_TYPE_ns__sub: soap_serialize_ns__sub(soap, (const struct ns__sub *)ptr); break; case SOAP_TYPE_ns__subResponse: soap_serialize_ns__subResponse(soap, (const struct ns__subResponse *)ptr); break; case SOAP_TYPE_ns__add: soap_serialize_ns__add(soap, (const struct ns__add *)ptr); break; case SOAP_TYPE_ns__addResponse: soap_serialize_ns__addResponse(soap, (const struct ns__addResponse *)ptr); break; case SOAP_TYPE_PointerTodouble: soap_serialize_PointerTodouble(soap, (double *const*)ptr); break; case SOAP_TYPE__QName: soap_serialize_string(soap, (char*const*)(void*)&ptr); break; case SOAP_TYPE_string: soap_serialize_string(soap, (char*const*)(void*)&ptr); break; } } #ifdef __cplusplus } #endif #endif #ifdef __cplusplus extern "C" { #endif SOAP_FMAC3 void * SOAP_FMAC4 soap_dupelement(struct soap *soap, const void *ptr, int type) {(void)soap; (void)ptr; (void)type; /* appease -Wall -Werror */ return NULL; } #ifdef __cplusplus } #endif #ifdef __cplusplus extern "C" { #endif SOAP_FMAC3 void SOAP_FMAC4 soap_delelement(const void *ptr, int type) {(void)ptr; (void)type; /* appease -Wall -Werror */ } #ifdef __cplusplus } #endif SOAP_FMAC3 void * SOAP_FMAC4 soap_instantiate(struct soap *soap, int t, const char *type, const char *arrayType, size_t *n) { (void)type; switch (t) { case SOAP_TYPE_ns__addResponse: return (void*)soap_instantiate_ns__addResponse(soap, -1, type, arrayType, n); case SOAP_TYPE_ns__add: return (void*)soap_instantiate_ns__add(soap, -1, type, arrayType, n); case SOAP_TYPE_ns__subResponse: return (void*)soap_instantiate_ns__subResponse(soap, -1, type, arrayType, n); case SOAP_TYPE_ns__sub: return (void*)soap_instantiate_ns__sub(soap, -1, type, arrayType, n); case SOAP_TYPE_ns__mulResponse: return (void*)soap_instantiate_ns__mulResponse(soap, -1, type, arrayType, n); case SOAP_TYPE_ns__mul: return (void*)soap_instantiate_ns__mul(soap, -1, type, arrayType, n); case SOAP_TYPE_ns__divResponse: return (void*)soap_instantiate_ns__divResponse(soap, -1, type, arrayType, n); case SOAP_TYPE_ns__div: return (void*)soap_instantiate_ns__div(soap, -1, type, arrayType, n); case SOAP_TYPE_ns__powResponse: return (void*)soap_instantiate_ns__powResponse(soap, -1, type, arrayType, n); case SOAP_TYPE_ns__pow: return (void*)soap_instantiate_ns__pow(soap, -1, type, arrayType, n); #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Header: return (void*)soap_instantiate_SOAP_ENV__Header(soap, -1, type, arrayType, n); #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Code: return (void*)soap_instantiate_SOAP_ENV__Code(soap, -1, type, arrayType, n); #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Detail: return (void*)soap_instantiate_SOAP_ENV__Detail(soap, -1, type, arrayType, n); #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Reason: return (void*)soap_instantiate_SOAP_ENV__Reason(soap, -1, type, arrayType, n); #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Fault: return (void*)soap_instantiate_SOAP_ENV__Fault(soap, -1, type, arrayType, n); #endif } return NULL; } SOAP_FMAC3 int SOAP_FMAC4 soap_fdelete(struct soap *soap, struct soap_clist *p) { (void)soap; /* appease -Wall -Werror */ if (!p->ptr) return SOAP_OK; switch (p->type) { case SOAP_TYPE_ns__addResponse: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct ns__addResponse); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct ns__addResponse); break; case SOAP_TYPE_ns__add: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct ns__add); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct ns__add); break; case SOAP_TYPE_ns__subResponse: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct ns__subResponse); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct ns__subResponse); break; case SOAP_TYPE_ns__sub: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct ns__sub); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct ns__sub); break; case SOAP_TYPE_ns__mulResponse: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct ns__mulResponse); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct ns__mulResponse); break; case SOAP_TYPE_ns__mul: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct ns__mul); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct ns__mul); break; case SOAP_TYPE_ns__divResponse: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct ns__divResponse); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct ns__divResponse); break; case SOAP_TYPE_ns__div: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct ns__div); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct ns__div); break; case SOAP_TYPE_ns__powResponse: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct ns__powResponse); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct ns__powResponse); break; case SOAP_TYPE_ns__pow: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct ns__pow); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct ns__pow); break; #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Header: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct SOAP_ENV__Header); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct SOAP_ENV__Header); break; #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Code: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct SOAP_ENV__Code); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct SOAP_ENV__Code); break; #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Detail: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct SOAP_ENV__Detail); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct SOAP_ENV__Detail); break; #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Reason: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct SOAP_ENV__Reason); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct SOAP_ENV__Reason); break; #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Fault: if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), struct SOAP_ENV__Fault); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), struct SOAP_ENV__Fault); break; #endif default: return SOAP_ERR; } return SOAP_OK; } #ifdef WIN32 #pragma warning(push) // do not warn on switch w/o cases #pragma warning(disable:4065) #endif SOAP_FMAC3 int SOAP_FMAC4 soap_fbase(int t, int b) { (void)t; (void)b; /* appease -Wall -Werror */ return 0; } #ifdef WIN32 #pragma warning(pop) #endif #ifndef WITH_NOIDREF #ifdef WIN32 #pragma warning(push) // do not warn on switch w/o cases #pragma warning(disable:4065) #endif SOAP_FMAC3 void SOAP_FMAC4 soap_finsert(struct soap *soap, int t, int tt, void *p, size_t index, const void *q, void **x) { (void)soap; (void)t; (void)p; (void)index; (void)q; (void)x; /* appease -Wall -Werror */ switch (tt) { case SOAP_TYPE_ns__addResponse: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__addResponse type=%d location=%p object=%p\n", t, p, q)); *(struct ns__addResponse*)p = *(struct ns__addResponse*)q; break; case SOAP_TYPE_ns__add: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__add type=%d location=%p object=%p\n", t, p, q)); *(struct ns__add*)p = *(struct ns__add*)q; break; case SOAP_TYPE_ns__subResponse: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__subResponse type=%d location=%p object=%p\n", t, p, q)); *(struct ns__subResponse*)p = *(struct ns__subResponse*)q; break; case SOAP_TYPE_ns__sub: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__sub type=%d location=%p object=%p\n", t, p, q)); *(struct ns__sub*)p = *(struct ns__sub*)q; break; case SOAP_TYPE_ns__mulResponse: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__mulResponse type=%d location=%p object=%p\n", t, p, q)); *(struct ns__mulResponse*)p = *(struct ns__mulResponse*)q; break; case SOAP_TYPE_ns__mul: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__mul type=%d location=%p object=%p\n", t, p, q)); *(struct ns__mul*)p = *(struct ns__mul*)q; break; case SOAP_TYPE_ns__divResponse: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__divResponse type=%d location=%p object=%p\n", t, p, q)); *(struct ns__divResponse*)p = *(struct ns__divResponse*)q; break; case SOAP_TYPE_ns__div: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__div type=%d location=%p object=%p\n", t, p, q)); *(struct ns__div*)p = *(struct ns__div*)q; break; case SOAP_TYPE_ns__powResponse: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__powResponse type=%d location=%p object=%p\n", t, p, q)); *(struct ns__powResponse*)p = *(struct ns__powResponse*)q; break; case SOAP_TYPE_ns__pow: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct ns__pow type=%d location=%p object=%p\n", t, p, q)); *(struct ns__pow*)p = *(struct ns__pow*)q; break; #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Header: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct SOAP_ENV__Header type=%d location=%p object=%p\n", t, p, q)); *(struct SOAP_ENV__Header*)p = *(struct SOAP_ENV__Header*)q; break; #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Code: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct SOAP_ENV__Code type=%d location=%p object=%p\n", t, p, q)); *(struct SOAP_ENV__Code*)p = *(struct SOAP_ENV__Code*)q; break; #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Detail: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct SOAP_ENV__Detail type=%d location=%p object=%p\n", t, p, q)); *(struct SOAP_ENV__Detail*)p = *(struct SOAP_ENV__Detail*)q; break; #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Reason: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct SOAP_ENV__Reason type=%d location=%p object=%p\n", t, p, q)); *(struct SOAP_ENV__Reason*)p = *(struct SOAP_ENV__Reason*)q; break; #endif #ifndef WITH_NOGLOBAL case SOAP_TYPE_SOAP_ENV__Fault: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy struct SOAP_ENV__Fault type=%d location=%p object=%p\n", t, p, q)); *(struct SOAP_ENV__Fault*)p = *(struct SOAP_ENV__Fault*)q; break; #endif default: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not insert type=%d in %d\n", t, tt)); } } #ifdef WIN32 #pragma warning(pop) #endif #endif 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_in_byte(struct soap *soap, const char *tag, char *a, const char *type) { a = soap_inbyte(soap, tag, a, type, SOAP_TYPE_byte); return a; } SOAP_FMAC3 char * SOAP_FMAC4 soap_new_byte(struct soap *soap, int n) { char *a = static_cast(soap_malloc(soap, (n = (n < 0 ? 1 : n)) * sizeof(char))); for (char *p = a; p && n--; ++p) soap_default_byte(soap, p); return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_byte(struct soap *soap, const char *a, const char *tag, const char *type) { if (soap_out_byte(soap, tag ? tag : "byte", -2, a, type)) return soap->error; return soap_putindependent(soap); } 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 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_in_int(struct soap *soap, const char *tag, int *a, const char *type) { a = soap_inint(soap, tag, a, type, SOAP_TYPE_int); return a; } SOAP_FMAC3 int * SOAP_FMAC4 soap_new_int(struct soap *soap, int n) { int *a = static_cast(soap_malloc(soap, (n = (n < 0 ? 1 : n)) * sizeof(int))); for (int *p = a; p && n--; ++p) soap_default_int(soap, p); return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_int(struct soap *soap, const int *a, const char *tag, const char *type) { if (soap_out_int(soap, tag ? tag : "int", -2, a, type)) return soap->error; return soap_putindependent(soap); } 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_out_double(struct soap *soap, const char *tag, int id, const double *a, const char *type) { return soap_outdouble(soap, tag, id, a, type, SOAP_TYPE_double); } SOAP_FMAC3 double * SOAP_FMAC4 soap_in_double(struct soap *soap, const char *tag, double *a, const char *type) { a = soap_indouble(soap, tag, a, type, SOAP_TYPE_double); return a; } SOAP_FMAC3 double * SOAP_FMAC4 soap_new_double(struct soap *soap, int n) { double *a = static_cast(soap_malloc(soap, (n = (n < 0 ? 1 : n)) * sizeof(double))); for (double *p = a; p && n--; ++p) soap_default_double(soap, p); return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_double(struct soap *soap, const double *a, const char *tag, const char *type) { if (soap_out_double(soap, tag ? tag : "double", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 double * SOAP_FMAC4 soap_get_double(struct soap *soap, double *p, const char *tag, const char *type) { if ((p = soap_in_double(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #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 */ #ifndef WITH_NOIDREF soap_serialize__QName(soap, (char*const*)&a->faultcode); soap_serialize_string(soap, (char*const*)&a->faultstring); soap_serialize_string(soap, (char*const*)&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, (char*const*)&a->SOAP_ENV__Node); soap_serialize_string(soap, (char*const*)&a->SOAP_ENV__Role); soap_serialize_PointerToSOAP_ENV__Detail(soap, &a->SOAP_ENV__Detail); #endif } 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_tmp_faultcode = soap_QName2s(soap, a->faultcode); (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ 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*)(void*)&soap_tmp_faultcode, "")) return soap->error; if (soap_out_string(soap, "faultstring", -1, (char*const*)&a->faultstring, "")) return soap->error; if (soap_out_string(soap, "faultactor", -1, (char*const*)&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, (char*const*)&a->SOAP_ENV__Node, "")) return soap->error; if (soap_out_string(soap, "SOAP-ENV:Role", -1, (char*const*)&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_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, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct SOAP_ENV__Fault*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Fault, sizeof(struct SOAP_ENV__Fault), NULL, 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", (char**)&a->faultcode, "xsd:QName")) { soap_flag_faultcode--; continue; } } if (soap_flag_faultstring && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG)) { if (soap_in_string(soap, "faultstring", (char**)&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", (char**)&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", (char**)&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", (char**)&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, SOAP_TYPE_SOAP_ENV__Fault, sizeof(struct SOAP_ENV__Fault), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct SOAP_ENV__Fault * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Fault(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_SOAP_ENV__Fault(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct SOAP_ENV__Fault *p; size_t k = sizeof(struct SOAP_ENV__Fault); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_SOAP_ENV__Fault, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct SOAP_ENV__Fault); } else { p = SOAP_NEW_ARRAY(soap, struct SOAP_ENV__Fault, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct SOAP_ENV__Fault location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } 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) { if (soap_out_SOAP_ENV__Fault(soap, tag ? tag : "SOAP-ENV:Fault", -2, a, type)) return soap->error; return soap_putindependent(soap); } 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; } #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 */ #ifndef WITH_NOIDREF soap_serialize_string(soap, (char*const*)&a->SOAP_ENV__Text); #endif } 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) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ 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, 1); if (soap_out_string(soap, "SOAP-ENV:Text", -1, (char*const*)&a->SOAP_ENV__Text, "")) return soap->error; return soap_element_end_out(soap, tag); } 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, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct SOAP_ENV__Reason*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Reason, sizeof(struct SOAP_ENV__Reason), NULL, 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", (char**)&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, SOAP_TYPE_SOAP_ENV__Reason, sizeof(struct SOAP_ENV__Reason), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct SOAP_ENV__Reason * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Reason(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_SOAP_ENV__Reason(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct SOAP_ENV__Reason *p; size_t k = sizeof(struct SOAP_ENV__Reason); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_SOAP_ENV__Reason, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct SOAP_ENV__Reason); } else { p = SOAP_NEW_ARRAY(soap, struct SOAP_ENV__Reason, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct SOAP_ENV__Reason location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } 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) { if (soap_out_SOAP_ENV__Reason(soap, tag ? tag : "SOAP-ENV:Reason", -2, a, type)) return soap->error; return soap_putindependent(soap); } 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; } #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->__any = NULL; a->__type = 0; a->fault = 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 */ #ifndef WITH_NOIDREF soap_markelement(soap, a->fault, a->__type); #endif } 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) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Detail), type)) return soap->error; if (soap_outliteral(soap, "-any", (char*const*)&a->__any, NULL)) return soap->error; if (soap_putelement(soap, a->fault, "fault", -1, a->__type)) return soap->error; return soap_element_end_out(soap, tag); } 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___any = 1; size_t soap_flag_fault = 1; if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct SOAP_ENV__Detail*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Detail, sizeof(struct SOAP_ENV__Detail), NULL, 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, "fault", &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", (char**)&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, SOAP_TYPE_SOAP_ENV__Detail, sizeof(struct SOAP_ENV__Detail), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct SOAP_ENV__Detail * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Detail(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_SOAP_ENV__Detail(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct SOAP_ENV__Detail *p; size_t k = sizeof(struct SOAP_ENV__Detail); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_SOAP_ENV__Detail, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct SOAP_ENV__Detail); } else { p = SOAP_NEW_ARRAY(soap, struct SOAP_ENV__Detail, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct SOAP_ENV__Detail location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } 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) { if (soap_out_SOAP_ENV__Detail(soap, tag ? tag : "SOAP-ENV:Detail", -2, a, type)) return soap->error; return soap_putindependent(soap); } 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; } #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 */ #ifndef WITH_NOIDREF soap_serialize__QName(soap, (char*const*)&a->SOAP_ENV__Value); soap_serialize_PointerToSOAP_ENV__Code(soap, &a->SOAP_ENV__Subcode); #endif } 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_tmp_SOAP_ENV__Value = soap_QName2s(soap, a->SOAP_ENV__Value); (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ 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*)(void*)&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_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, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct SOAP_ENV__Code*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Code, sizeof(struct SOAP_ENV__Code), NULL, 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", (char**)&a->SOAP_ENV__Value, "xsd:QName")) { 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, SOAP_TYPE_SOAP_ENV__Code, sizeof(struct SOAP_ENV__Code), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct SOAP_ENV__Code * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Code(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_SOAP_ENV__Code(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct SOAP_ENV__Code *p; size_t k = sizeof(struct SOAP_ENV__Code); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_SOAP_ENV__Code, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct SOAP_ENV__Code); } else { p = SOAP_NEW_ARRAY(soap, struct SOAP_ENV__Code, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct SOAP_ENV__Code location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } 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) { if (soap_out_SOAP_ENV__Code(soap, tag ? tag : "SOAP-ENV:Code", -2, a, type)) return soap->error; return soap_putindependent(soap); } 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; } #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 */ #ifndef WITH_NOIDREF #endif } 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) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Header), type)) return soap->error; return soap_element_end_out(soap, tag); } 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, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct SOAP_ENV__Header*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_SOAP_ENV__Header, sizeof(struct SOAP_ENV__Header), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_SOAP_ENV__Header(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 SOAP_ENV__Header *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_SOAP_ENV__Header, SOAP_TYPE_SOAP_ENV__Header, sizeof(struct SOAP_ENV__Header), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct SOAP_ENV__Header * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Header(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_SOAP_ENV__Header(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct SOAP_ENV__Header *p; size_t k = sizeof(struct SOAP_ENV__Header); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_SOAP_ENV__Header, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct SOAP_ENV__Header); } else { p = SOAP_NEW_ARRAY(soap, struct SOAP_ENV__Header, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct SOAP_ENV__Header location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } 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) { if (soap_out_SOAP_ENV__Header(soap, tag ? tag : "SOAP-ENV:Header", -2, a, type)) return soap->error; return soap_putindependent(soap); } 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; } #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__pow(struct soap *soap, struct ns__pow *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_double(soap, &a->a); soap_default_double(soap, &a->b); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__pow(struct soap *soap, const struct ns__pow *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_embedded(soap, &a->a, SOAP_TYPE_double); soap_embedded(soap, &a->b, SOAP_TYPE_double); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__pow(struct soap *soap, const char *tag, int id, const struct ns__pow *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__pow), type)) return soap->error; if (soap_out_double(soap, "a", -1, &a->a, "")) return soap->error; if (soap_out_double(soap, "b", -1, &a->b, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__pow * SOAP_FMAC4 soap_in_ns__pow(struct soap *soap, const char *tag, struct ns__pow *a, const char *type) { size_t soap_flag_a = 1; size_t soap_flag_b = 1; if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct ns__pow*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__pow, sizeof(struct ns__pow), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__pow(soap, a); if (soap->body && *soap->href != '#') { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_a && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_double(soap, "a", &a->a, "xsd:double")) { soap_flag_a--; continue; } } if (soap_flag_b && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_double(soap, "b", &a->b, "xsd:double")) { soap_flag_b--; 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; if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_a > 0 || soap_flag_b > 0)) { soap->error = SOAP_OCCURS; return NULL; } } else if ((soap->mode & SOAP_XML_STRICT) && *soap->href != '#') { soap->error = SOAP_OCCURS; return NULL; } else { a = (struct ns__pow *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__pow, SOAP_TYPE_ns__pow, sizeof(struct ns__pow), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__pow * SOAP_FMAC2 soap_instantiate_ns__pow(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__pow(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__pow *p; size_t k = sizeof(struct ns__pow); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_ns__pow, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct ns__pow); } else { p = SOAP_NEW_ARRAY(soap, struct ns__pow, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__pow location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__pow(struct soap *soap, const struct ns__pow *a, const char *tag, const char *type) { if (soap_out_ns__pow(soap, tag ? tag : "ns:pow", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__pow * SOAP_FMAC4 soap_get_ns__pow(struct soap *soap, struct ns__pow *p, const char *tag, const char *type) { if ((p = soap_in_ns__pow(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__powResponse(struct soap *soap, struct ns__powResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->result = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__powResponse(struct soap *soap, const struct ns__powResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_serialize_PointerTodouble(soap, &a->result); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__powResponse(struct soap *soap, const char *tag, int id, const struct ns__powResponse *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__powResponse), type)) return soap->error; if (soap_out_PointerTodouble(soap, "result", -1, &a->result, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__powResponse * SOAP_FMAC4 soap_in_ns__powResponse(struct soap *soap, const char *tag, struct ns__powResponse *a, const char *type) { size_t soap_flag_result = 1; if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct ns__powResponse*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__powResponse, sizeof(struct ns__powResponse), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__powResponse(soap, a); if (soap->body && *soap->href != '#') { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_PointerTodouble(soap, "result", &a->result, "xsd:double")) { soap_flag_result--; 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 ns__powResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__powResponse, SOAP_TYPE_ns__powResponse, sizeof(struct ns__powResponse), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__powResponse * SOAP_FMAC2 soap_instantiate_ns__powResponse(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__powResponse(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__powResponse *p; size_t k = sizeof(struct ns__powResponse); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_ns__powResponse, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct ns__powResponse); } else { p = SOAP_NEW_ARRAY(soap, struct ns__powResponse, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__powResponse location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__powResponse(struct soap *soap, const struct ns__powResponse *a, const char *tag, const char *type) { if (soap_out_ns__powResponse(soap, tag ? tag : "ns:powResponse", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__powResponse * SOAP_FMAC4 soap_get_ns__powResponse(struct soap *soap, struct ns__powResponse *p, const char *tag, const char *type) { if ((p = soap_in_ns__powResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__div(struct soap *soap, struct ns__div *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_double(soap, &a->a); soap_default_double(soap, &a->b); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__div(struct soap *soap, const struct ns__div *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_embedded(soap, &a->a, SOAP_TYPE_double); soap_embedded(soap, &a->b, SOAP_TYPE_double); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__div(struct soap *soap, const char *tag, int id, const struct ns__div *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__div), type)) return soap->error; if (soap_out_double(soap, "a", -1, &a->a, "")) return soap->error; if (soap_out_double(soap, "b", -1, &a->b, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__div * SOAP_FMAC4 soap_in_ns__div(struct soap *soap, const char *tag, struct ns__div *a, const char *type) { size_t soap_flag_a = 1; size_t soap_flag_b = 1; if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct ns__div*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__div, sizeof(struct ns__div), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__div(soap, a); if (soap->body && *soap->href != '#') { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_a && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_double(soap, "a", &a->a, "xsd:double")) { soap_flag_a--; continue; } } if (soap_flag_b && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_double(soap, "b", &a->b, "xsd:double")) { soap_flag_b--; 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; if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_a > 0 || soap_flag_b > 0)) { soap->error = SOAP_OCCURS; return NULL; } } else if ((soap->mode & SOAP_XML_STRICT) && *soap->href != '#') { soap->error = SOAP_OCCURS; return NULL; } else { a = (struct ns__div *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__div, SOAP_TYPE_ns__div, sizeof(struct ns__div), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__div * SOAP_FMAC2 soap_instantiate_ns__div(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__div(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__div *p; size_t k = sizeof(struct ns__div); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_ns__div, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct ns__div); } else { p = SOAP_NEW_ARRAY(soap, struct ns__div, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__div location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__div(struct soap *soap, const struct ns__div *a, const char *tag, const char *type) { if (soap_out_ns__div(soap, tag ? tag : "ns:div", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__div * SOAP_FMAC4 soap_get_ns__div(struct soap *soap, struct ns__div *p, const char *tag, const char *type) { if ((p = soap_in_ns__div(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__divResponse(struct soap *soap, struct ns__divResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->result = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__divResponse(struct soap *soap, const struct ns__divResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_serialize_PointerTodouble(soap, &a->result); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__divResponse(struct soap *soap, const char *tag, int id, const struct ns__divResponse *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__divResponse), type)) return soap->error; if (soap_out_PointerTodouble(soap, "result", -1, &a->result, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__divResponse * SOAP_FMAC4 soap_in_ns__divResponse(struct soap *soap, const char *tag, struct ns__divResponse *a, const char *type) { size_t soap_flag_result = 1; if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct ns__divResponse*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__divResponse, sizeof(struct ns__divResponse), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__divResponse(soap, a); if (soap->body && *soap->href != '#') { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_PointerTodouble(soap, "result", &a->result, "xsd:double")) { soap_flag_result--; 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 ns__divResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__divResponse, SOAP_TYPE_ns__divResponse, sizeof(struct ns__divResponse), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__divResponse * SOAP_FMAC2 soap_instantiate_ns__divResponse(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__divResponse(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__divResponse *p; size_t k = sizeof(struct ns__divResponse); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_ns__divResponse, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct ns__divResponse); } else { p = SOAP_NEW_ARRAY(soap, struct ns__divResponse, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__divResponse location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__divResponse(struct soap *soap, const struct ns__divResponse *a, const char *tag, const char *type) { if (soap_out_ns__divResponse(soap, tag ? tag : "ns:divResponse", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__divResponse * SOAP_FMAC4 soap_get_ns__divResponse(struct soap *soap, struct ns__divResponse *p, const char *tag, const char *type) { if ((p = soap_in_ns__divResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__mul(struct soap *soap, struct ns__mul *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_double(soap, &a->a); soap_default_double(soap, &a->b); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__mul(struct soap *soap, const struct ns__mul *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_embedded(soap, &a->a, SOAP_TYPE_double); soap_embedded(soap, &a->b, SOAP_TYPE_double); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__mul(struct soap *soap, const char *tag, int id, const struct ns__mul *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__mul), type)) return soap->error; if (soap_out_double(soap, "a", -1, &a->a, "")) return soap->error; if (soap_out_double(soap, "b", -1, &a->b, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__mul * SOAP_FMAC4 soap_in_ns__mul(struct soap *soap, const char *tag, struct ns__mul *a, const char *type) { size_t soap_flag_a = 1; size_t soap_flag_b = 1; if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct ns__mul*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__mul, sizeof(struct ns__mul), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__mul(soap, a); if (soap->body && *soap->href != '#') { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_a && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_double(soap, "a", &a->a, "xsd:double")) { soap_flag_a--; continue; } } if (soap_flag_b && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_double(soap, "b", &a->b, "xsd:double")) { soap_flag_b--; 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; if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_a > 0 || soap_flag_b > 0)) { soap->error = SOAP_OCCURS; return NULL; } } else if ((soap->mode & SOAP_XML_STRICT) && *soap->href != '#') { soap->error = SOAP_OCCURS; return NULL; } else { a = (struct ns__mul *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__mul, SOAP_TYPE_ns__mul, sizeof(struct ns__mul), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__mul * SOAP_FMAC2 soap_instantiate_ns__mul(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__mul(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__mul *p; size_t k = sizeof(struct ns__mul); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_ns__mul, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct ns__mul); } else { p = SOAP_NEW_ARRAY(soap, struct ns__mul, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__mul location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__mul(struct soap *soap, const struct ns__mul *a, const char *tag, const char *type) { if (soap_out_ns__mul(soap, tag ? tag : "ns:mul", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__mul * SOAP_FMAC4 soap_get_ns__mul(struct soap *soap, struct ns__mul *p, const char *tag, const char *type) { if ((p = soap_in_ns__mul(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__mulResponse(struct soap *soap, struct ns__mulResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->result = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__mulResponse(struct soap *soap, const struct ns__mulResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_serialize_PointerTodouble(soap, &a->result); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__mulResponse(struct soap *soap, const char *tag, int id, const struct ns__mulResponse *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__mulResponse), type)) return soap->error; if (soap_out_PointerTodouble(soap, "result", -1, &a->result, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__mulResponse * SOAP_FMAC4 soap_in_ns__mulResponse(struct soap *soap, const char *tag, struct ns__mulResponse *a, const char *type) { size_t soap_flag_result = 1; if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct ns__mulResponse*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__mulResponse, sizeof(struct ns__mulResponse), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__mulResponse(soap, a); if (soap->body && *soap->href != '#') { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_PointerTodouble(soap, "result", &a->result, "xsd:double")) { soap_flag_result--; 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 ns__mulResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__mulResponse, SOAP_TYPE_ns__mulResponse, sizeof(struct ns__mulResponse), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__mulResponse * SOAP_FMAC2 soap_instantiate_ns__mulResponse(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__mulResponse(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__mulResponse *p; size_t k = sizeof(struct ns__mulResponse); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_ns__mulResponse, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct ns__mulResponse); } else { p = SOAP_NEW_ARRAY(soap, struct ns__mulResponse, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__mulResponse location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__mulResponse(struct soap *soap, const struct ns__mulResponse *a, const char *tag, const char *type) { if (soap_out_ns__mulResponse(soap, tag ? tag : "ns:mulResponse", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__mulResponse * SOAP_FMAC4 soap_get_ns__mulResponse(struct soap *soap, struct ns__mulResponse *p, const char *tag, const char *type) { if ((p = soap_in_ns__mulResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__sub(struct soap *soap, struct ns__sub *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_double(soap, &a->a); soap_default_double(soap, &a->b); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__sub(struct soap *soap, const struct ns__sub *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_embedded(soap, &a->a, SOAP_TYPE_double); soap_embedded(soap, &a->b, SOAP_TYPE_double); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__sub(struct soap *soap, const char *tag, int id, const struct ns__sub *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__sub), type)) return soap->error; if (soap_out_double(soap, "a", -1, &a->a, "")) return soap->error; if (soap_out_double(soap, "b", -1, &a->b, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__sub * SOAP_FMAC4 soap_in_ns__sub(struct soap *soap, const char *tag, struct ns__sub *a, const char *type) { size_t soap_flag_a = 1; size_t soap_flag_b = 1; if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct ns__sub*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__sub, sizeof(struct ns__sub), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__sub(soap, a); if (soap->body && *soap->href != '#') { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_a && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_double(soap, "a", &a->a, "xsd:double")) { soap_flag_a--; continue; } } if (soap_flag_b && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_double(soap, "b", &a->b, "xsd:double")) { soap_flag_b--; 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; if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_a > 0 || soap_flag_b > 0)) { soap->error = SOAP_OCCURS; return NULL; } } else if ((soap->mode & SOAP_XML_STRICT) && *soap->href != '#') { soap->error = SOAP_OCCURS; return NULL; } else { a = (struct ns__sub *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__sub, SOAP_TYPE_ns__sub, sizeof(struct ns__sub), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__sub * SOAP_FMAC2 soap_instantiate_ns__sub(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__sub(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__sub *p; size_t k = sizeof(struct ns__sub); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_ns__sub, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct ns__sub); } else { p = SOAP_NEW_ARRAY(soap, struct ns__sub, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__sub location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__sub(struct soap *soap, const struct ns__sub *a, const char *tag, const char *type) { if (soap_out_ns__sub(soap, tag ? tag : "ns:sub", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__sub * SOAP_FMAC4 soap_get_ns__sub(struct soap *soap, struct ns__sub *p, const char *tag, const char *type) { if ((p = soap_in_ns__sub(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__subResponse(struct soap *soap, struct ns__subResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->result = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__subResponse(struct soap *soap, const struct ns__subResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_serialize_PointerTodouble(soap, &a->result); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__subResponse(struct soap *soap, const char *tag, int id, const struct ns__subResponse *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__subResponse), type)) return soap->error; if (soap_out_PointerTodouble(soap, "result", -1, &a->result, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__subResponse * SOAP_FMAC4 soap_in_ns__subResponse(struct soap *soap, const char *tag, struct ns__subResponse *a, const char *type) { size_t soap_flag_result = 1; if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct ns__subResponse*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__subResponse, sizeof(struct ns__subResponse), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__subResponse(soap, a); if (soap->body && *soap->href != '#') { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_PointerTodouble(soap, "result", &a->result, "xsd:double")) { soap_flag_result--; 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 ns__subResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__subResponse, SOAP_TYPE_ns__subResponse, sizeof(struct ns__subResponse), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__subResponse * SOAP_FMAC2 soap_instantiate_ns__subResponse(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__subResponse(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__subResponse *p; size_t k = sizeof(struct ns__subResponse); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_ns__subResponse, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct ns__subResponse); } else { p = SOAP_NEW_ARRAY(soap, struct ns__subResponse, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__subResponse location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__subResponse(struct soap *soap, const struct ns__subResponse *a, const char *tag, const char *type) { if (soap_out_ns__subResponse(soap, tag ? tag : "ns:subResponse", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__subResponse * SOAP_FMAC4 soap_get_ns__subResponse(struct soap *soap, struct ns__subResponse *p, const char *tag, const char *type) { if ((p = soap_in_ns__subResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__add(struct soap *soap, struct ns__add *a) { (void)soap; (void)a; /* appease -Wall -Werror */ soap_default_double(soap, &a->a); soap_default_double(soap, &a->b); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__add(struct soap *soap, const struct ns__add *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_embedded(soap, &a->a, SOAP_TYPE_double); soap_embedded(soap, &a->b, SOAP_TYPE_double); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__add(struct soap *soap, const char *tag, int id, const struct ns__add *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__add), type)) return soap->error; if (soap_out_double(soap, "a", -1, &a->a, "")) return soap->error; if (soap_out_double(soap, "b", -1, &a->b, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__add * SOAP_FMAC4 soap_in_ns__add(struct soap *soap, const char *tag, struct ns__add *a, const char *type) { size_t soap_flag_a = 1; size_t soap_flag_b = 1; if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct ns__add*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__add, sizeof(struct ns__add), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__add(soap, a); if (soap->body && *soap->href != '#') { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_a && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_double(soap, "a", &a->a, "xsd:double")) { soap_flag_a--; continue; } } if (soap_flag_b && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_double(soap, "b", &a->b, "xsd:double")) { soap_flag_b--; 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; if ((soap->mode & SOAP_XML_STRICT) && (soap_flag_a > 0 || soap_flag_b > 0)) { soap->error = SOAP_OCCURS; return NULL; } } else if ((soap->mode & SOAP_XML_STRICT) && *soap->href != '#') { soap->error = SOAP_OCCURS; return NULL; } else { a = (struct ns__add *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__add, SOAP_TYPE_ns__add, sizeof(struct ns__add), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__add * SOAP_FMAC2 soap_instantiate_ns__add(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__add(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__add *p; size_t k = sizeof(struct ns__add); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_ns__add, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct ns__add); } else { p = SOAP_NEW_ARRAY(soap, struct ns__add, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__add location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__add(struct soap *soap, const struct ns__add *a, const char *tag, const char *type) { if (soap_out_ns__add(soap, tag ? tag : "ns:add", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__add * SOAP_FMAC4 soap_get_ns__add(struct soap *soap, struct ns__add *p, const char *tag, const char *type) { if ((p = soap_in_ns__add(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__addResponse(struct soap *soap, struct ns__addResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ a->result = NULL; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__addResponse(struct soap *soap, const struct ns__addResponse *a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF soap_serialize_PointerTodouble(soap, &a->result); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__addResponse(struct soap *soap, const char *tag, int id, const struct ns__addResponse *a, const char *type) { (void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_ns__addResponse), type)) return soap->error; if (soap_out_PointerTodouble(soap, "result", -1, &a->result, "")) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 struct ns__addResponse * SOAP_FMAC4 soap_in_ns__addResponse(struct soap *soap, const char *tag, struct ns__addResponse *a, const char *type) { size_t soap_flag_result = 1; if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; (void)type; /* appease -Wall -Werror */ a = (struct ns__addResponse*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_ns__addResponse, sizeof(struct ns__addResponse), NULL, NULL, NULL, NULL); if (!a) return NULL; soap_default_ns__addResponse(soap, a); if (soap->body && *soap->href != '#') { for (;;) { soap->error = SOAP_TAG_MISMATCH; if (soap_flag_result && soap->error == SOAP_TAG_MISMATCH) { if (soap_in_PointerTodouble(soap, "result", &a->result, "xsd:double")) { soap_flag_result--; 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 ns__addResponse *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_ns__addResponse, SOAP_TYPE_ns__addResponse, sizeof(struct ns__addResponse), 0, soap_finsert, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC1 struct ns__addResponse * SOAP_FMAC2 soap_instantiate_ns__addResponse(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_ns__addResponse(%p, %d, %s, %s)\n", (void*)soap, n, type?type:"", arrayType?arrayType:"")); (void)type; (void)arrayType; /* appease -Wall -Werror */ struct ns__addResponse *p; size_t k = sizeof(struct ns__addResponse); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_ns__addResponse, n, soap_fdelete); if (!cp && soap && n != SOAP_NO_LINK_TO_DELETE) return NULL; if (n < 0) { p = SOAP_NEW(soap, struct ns__addResponse); } else { p = SOAP_NEW_ARRAY(soap, struct ns__addResponse, n); k *= n; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated struct ns__addResponse location=%p n=%d\n", (void*)p, n)); if (size) *size = k; if (!p) soap->error = SOAP_EOM; else if (cp) cp->ptr = (void*)p; return p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__addResponse(struct soap *soap, const struct ns__addResponse *a, const char *tag, const char *type) { if (soap_out_ns__addResponse(soap, tag ? tag : "ns:addResponse", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 struct ns__addResponse * SOAP_FMAC4 soap_get_ns__addResponse(struct soap *soap, struct ns__addResponse *p, const char *tag, const char *type) { if ((p = soap_in_ns__addResponse(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *const*a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF if (!soap_reference(soap, *a, SOAP_TYPE_SOAP_ENV__Reason)) soap_serialize_SOAP_ENV__Reason(soap, *a); #endif } 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, NULL); 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_in_PointerToSOAP_ENV__Reason(struct soap *soap, const char *tag, struct SOAP_ENV__Reason **a, const char *type) { (void)type; /* appease -Wall -Werror */ 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, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return 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) { if (soap_out_PointerToSOAP_ENV__Reason(soap, tag ? tag : "SOAP-ENV:Reason", -2, a, type)) return soap->error; return soap_putindependent(soap); } 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; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *const*a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF if (!soap_reference(soap, *a, SOAP_TYPE_SOAP_ENV__Detail)) soap_serialize_SOAP_ENV__Detail(soap, *a); #endif } 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, NULL); 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_in_PointerToSOAP_ENV__Detail(struct soap *soap, const char *tag, struct SOAP_ENV__Detail **a, const char *type) { (void)type; /* appease -Wall -Werror */ 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, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return 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) { if (soap_out_PointerToSOAP_ENV__Detail(soap, tag ? tag : "SOAP-ENV:Detail", -2, a, type)) return soap->error; return soap_putindependent(soap); } 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; } #endif #ifndef WITH_NOGLOBAL SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *const*a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF if (!soap_reference(soap, *a, SOAP_TYPE_SOAP_ENV__Code)) soap_serialize_SOAP_ENV__Code(soap, *a); #endif } 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) { char *mark; id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_SOAP_ENV__Code, &mark); if (id < 0) return soap->error; (void)soap_out_SOAP_ENV__Code(soap, tag, id, *a, type); soap_unmark(soap, mark); return soap->error; } 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) { (void)type; /* appease -Wall -Werror */ 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, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return 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) { if (soap_out_PointerToSOAP_ENV__Code(soap, tag ? tag : "SOAP-ENV:Code", -2, a, type)) return soap->error; return soap_putindependent(soap); } 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; } #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTodouble(struct soap *soap, double *const*a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF (void)soap_reference(soap, *a, SOAP_TYPE_double); #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTodouble(struct soap *soap, const char *tag, int id, double *const*a, const char *type) { id = soap_element_id(soap, tag, id, *a, NULL, 0, type, SOAP_TYPE_double, NULL); if (id < 0) return soap->error; return soap_out_double(soap, tag, id, *a, type); } SOAP_FMAC3 double ** SOAP_FMAC4 soap_in_PointerTodouble(struct soap *soap, const char *tag, double **a, const char *type) { (void)type; /* appease -Wall -Werror */ if (soap_element_begin_in(soap, tag, 1, NULL)) return NULL; if (!a) if (!(a = (double **)soap_malloc(soap, sizeof(double *)))) return NULL; *a = NULL; if (!soap->null && *soap->href != '#') { soap_revert(soap); if (!(*a = soap_in_double(soap, tag, *a, type))) return NULL; } else { a = (double **)soap_id_lookup(soap, soap->href, (void**)a, SOAP_TYPE_double, sizeof(double), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTodouble(struct soap *soap, double *const*a, const char *tag, const char *type) { if (soap_out_PointerTodouble(soap, tag ? tag : "double", -2, a, type)) return soap->error; return soap_putindependent(soap); } SOAP_FMAC3 double ** SOAP_FMAC4 soap_get_PointerTodouble(struct soap *soap, double **p, const char *tag, const char *type) { if ((p = soap_in_PointerTodouble(soap, tag, p, type))) if (soap_getindependent(soap)) return NULL; return p; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__QName(struct soap *soap, char *const*a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF (void)soap_reference(soap, *a, SOAP_TYPE__QName); #endif } 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_in__QName(struct soap *soap, const char *tag, char **a, const char *type) { a = soap_instring(soap, tag, a, type, SOAP_TYPE__QName, 2, 0, -1, NULL); return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put__QName(struct soap *soap, char *const*a, const char *tag, const char *type) { if (soap_out__QName(soap, tag ? tag : "QName", -2, a, type)) return soap->error; return soap_putindependent(soap); } 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 void SOAP_FMAC4 soap_serialize_string(struct soap *soap, char *const*a) { (void)soap; (void)a; /* appease -Wall -Werror */ #ifndef WITH_NOIDREF (void)soap_reference(soap, *a, SOAP_TYPE_string); #endif } 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_in_string(struct soap *soap, const char *tag, char **a, const char *type) { a = soap_instring(soap, tag, a, type, SOAP_TYPE_string, 1, 0, -1, NULL); return a; } SOAP_FMAC3 char * * SOAP_FMAC4 soap_new_string(struct soap *soap, int n) { char * *a = static_cast(soap_malloc(soap, (n = (n < 0 ? 1 : n)) * sizeof(char *))); for (char * *p = a; p && n--; ++p) soap_default_string(soap, p); return a; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_string(struct soap *soap, char *const*a, const char *tag, const char *type) { if (soap_out_string(soap, tag ? tag : "string", -2, a, type)) return soap->error; return soap_putindependent(soap); } 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; } #if defined(__BORLANDC__) #pragma option pop #pragma option pop #endif /* End of soapC.cpp */ gsoap-2.8.91/gsoap/samples/calc_xcode/soapStub.h0000644000175000017500000004572213525245162021115 0ustar ellertellert/* soapStub.h Generated by gSOAP 2.8.91 for calc.h gSOAP XML Web services tools Copyright (C) 2000-2018, Robert van Engelen, Genivia Inc. All Rights Reserved. The soapcpp2 tool and its generated software are released under the GPL. 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 soapStub_H #define soapStub_H #include "stdsoap2.h" #if GSOAP_VERSION != 20891 # error "GSOAP VERSION 20891 MISMATCH IN GENERATED CODE VERSUS LIBRARY CODE: PLEASE REINSTALL PACKAGE" #endif /******************************************************************************\ * * * Types with Custom Serializers * * * \******************************************************************************/ /******************************************************************************\ * * * Classes, Structs and Unions * * * \******************************************************************************/ struct ns__addResponse; /* calc.h:100 */ struct ns__add; /* calc.h:100 */ struct ns__subResponse; /* calc.h:103 */ struct ns__sub; /* calc.h:103 */ struct ns__mulResponse; /* calc.h:106 */ struct ns__mul; /* calc.h:106 */ struct ns__divResponse; /* calc.h:109 */ struct ns__div; /* calc.h:109 */ struct ns__powResponse; /* calc.h:112 */ struct ns__pow; /* calc.h:112 */ /* calc.h:100 */ #ifndef SOAP_TYPE_ns__addResponse #define SOAP_TYPE_ns__addResponse (10) /* complex XML schema type 'ns:addResponse': */ struct SOAP_CMAC ns__addResponse { public: /** Optional element 'result' of XML schema type 'xsd:double' */ double *result; public: /** Return unique type id SOAP_TYPE_ns__addResponse */ long soap_type() const { return SOAP_TYPE_ns__addResponse; } /** Constructor with member initializations */ ns__addResponse() : result() { } /** Friend allocator */ friend SOAP_FMAC1 ns__addResponse * SOAP_FMAC2 soap_instantiate_ns__addResponse(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:100 */ #ifndef SOAP_TYPE_ns__add #define SOAP_TYPE_ns__add (11) /* complex XML schema type 'ns:add': */ struct SOAP_CMAC ns__add { public: /** Required element 'a' of XML schema type 'xsd:double' */ double a; /** Required element 'b' of XML schema type 'xsd:double' */ double b; public: /** Return unique type id SOAP_TYPE_ns__add */ long soap_type() const { return SOAP_TYPE_ns__add; } /** Constructor with member initializations */ ns__add() : a(), b() { } /** Friend allocator */ friend SOAP_FMAC1 ns__add * SOAP_FMAC2 soap_instantiate_ns__add(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:103 */ #ifndef SOAP_TYPE_ns__subResponse #define SOAP_TYPE_ns__subResponse (13) /* complex XML schema type 'ns:subResponse': */ struct SOAP_CMAC ns__subResponse { public: /** Optional element 'result' of XML schema type 'xsd:double' */ double *result; public: /** Return unique type id SOAP_TYPE_ns__subResponse */ long soap_type() const { return SOAP_TYPE_ns__subResponse; } /** Constructor with member initializations */ ns__subResponse() : result() { } /** Friend allocator */ friend SOAP_FMAC1 ns__subResponse * SOAP_FMAC2 soap_instantiate_ns__subResponse(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:103 */ #ifndef SOAP_TYPE_ns__sub #define SOAP_TYPE_ns__sub (14) /* complex XML schema type 'ns:sub': */ struct SOAP_CMAC ns__sub { public: /** Required element 'a' of XML schema type 'xsd:double' */ double a; /** Required element 'b' of XML schema type 'xsd:double' */ double b; public: /** Return unique type id SOAP_TYPE_ns__sub */ long soap_type() const { return SOAP_TYPE_ns__sub; } /** Constructor with member initializations */ ns__sub() : a(), b() { } /** Friend allocator */ friend SOAP_FMAC1 ns__sub * SOAP_FMAC2 soap_instantiate_ns__sub(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:106 */ #ifndef SOAP_TYPE_ns__mulResponse #define SOAP_TYPE_ns__mulResponse (16) /* complex XML schema type 'ns:mulResponse': */ struct SOAP_CMAC ns__mulResponse { public: /** Optional element 'result' of XML schema type 'xsd:double' */ double *result; public: /** Return unique type id SOAP_TYPE_ns__mulResponse */ long soap_type() const { return SOAP_TYPE_ns__mulResponse; } /** Constructor with member initializations */ ns__mulResponse() : result() { } /** Friend allocator */ friend SOAP_FMAC1 ns__mulResponse * SOAP_FMAC2 soap_instantiate_ns__mulResponse(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:106 */ #ifndef SOAP_TYPE_ns__mul #define SOAP_TYPE_ns__mul (17) /* complex XML schema type 'ns:mul': */ struct SOAP_CMAC ns__mul { public: /** Required element 'a' of XML schema type 'xsd:double' */ double a; /** Required element 'b' of XML schema type 'xsd:double' */ double b; public: /** Return unique type id SOAP_TYPE_ns__mul */ long soap_type() const { return SOAP_TYPE_ns__mul; } /** Constructor with member initializations */ ns__mul() : a(), b() { } /** Friend allocator */ friend SOAP_FMAC1 ns__mul * SOAP_FMAC2 soap_instantiate_ns__mul(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:109 */ #ifndef SOAP_TYPE_ns__divResponse #define SOAP_TYPE_ns__divResponse (19) /* complex XML schema type 'ns:divResponse': */ struct SOAP_CMAC ns__divResponse { public: /** Optional element 'result' of XML schema type 'xsd:double' */ double *result; public: /** Return unique type id SOAP_TYPE_ns__divResponse */ long soap_type() const { return SOAP_TYPE_ns__divResponse; } /** Constructor with member initializations */ ns__divResponse() : result() { } /** Friend allocator */ friend SOAP_FMAC1 ns__divResponse * SOAP_FMAC2 soap_instantiate_ns__divResponse(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:109 */ #ifndef SOAP_TYPE_ns__div #define SOAP_TYPE_ns__div (20) /* complex XML schema type 'ns:div': */ struct SOAP_CMAC ns__div { public: /** Required element 'a' of XML schema type 'xsd:double' */ double a; /** Required element 'b' of XML schema type 'xsd:double' */ double b; public: /** Return unique type id SOAP_TYPE_ns__div */ long soap_type() const { return SOAP_TYPE_ns__div; } /** Constructor with member initializations */ ns__div() : a(), b() { } /** Friend allocator */ friend SOAP_FMAC1 ns__div * SOAP_FMAC2 soap_instantiate_ns__div(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:112 */ #ifndef SOAP_TYPE_ns__powResponse #define SOAP_TYPE_ns__powResponse (22) /* complex XML schema type 'ns:powResponse': */ struct SOAP_CMAC ns__powResponse { public: /** Optional element 'result' of XML schema type 'xsd:double' */ double *result; public: /** Return unique type id SOAP_TYPE_ns__powResponse */ long soap_type() const { return SOAP_TYPE_ns__powResponse; } /** Constructor with member initializations */ ns__powResponse() : result() { } /** Friend allocator */ friend SOAP_FMAC1 ns__powResponse * SOAP_FMAC2 soap_instantiate_ns__powResponse(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:112 */ #ifndef SOAP_TYPE_ns__pow #define SOAP_TYPE_ns__pow (23) /* complex XML schema type 'ns:pow': */ struct SOAP_CMAC ns__pow { public: /** Required element 'a' of XML schema type 'xsd:double' */ double a; /** Required element 'b' of XML schema type 'xsd:double' */ double b; public: /** Return unique type id SOAP_TYPE_ns__pow */ long soap_type() const { return SOAP_TYPE_ns__pow; } /** Constructor with member initializations */ ns__pow() : a(), b() { } /** Friend allocator */ friend SOAP_FMAC1 ns__pow * SOAP_FMAC2 soap_instantiate_ns__pow(struct soap*, int, const char*, const char*, size_t*); }; #endif /* calc.h:113 */ #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Header #define SOAP_TYPE_SOAP_ENV__Header (24) /* SOAP_ENV__Header: */ struct SOAP_CMAC SOAP_ENV__Header { public: /** Return unique type id SOAP_TYPE_SOAP_ENV__Header */ long soap_type() const { return SOAP_TYPE_SOAP_ENV__Header; } /** Constructor with member initializations */ SOAP_ENV__Header() { } /** Friend allocator */ friend SOAP_FMAC1 SOAP_ENV__Header * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Header(struct soap*, int, const char*, const char*, size_t*); }; #endif #endif /* calc.h:113 */ #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Code #define SOAP_TYPE_SOAP_ENV__Code (25) /* Type SOAP_ENV__Code is a recursive data type, (in)directly referencing itself through its (base or derived class) members */ /* SOAP_ENV__Code: */ struct SOAP_CMAC SOAP_ENV__Code { public: /** Optional element 'SOAP-ENV:Value' of XML schema type 'xsd:QName' */ char *SOAP_ENV__Value; /** Optional element 'SOAP-ENV:Subcode' of XML schema type 'SOAP-ENV:Code' */ struct SOAP_ENV__Code *SOAP_ENV__Subcode; public: /** Return unique type id SOAP_TYPE_SOAP_ENV__Code */ long soap_type() const { return SOAP_TYPE_SOAP_ENV__Code; } /** Constructor with member initializations */ SOAP_ENV__Code() : SOAP_ENV__Value(), SOAP_ENV__Subcode() { } /** Friend allocator */ friend SOAP_FMAC1 SOAP_ENV__Code * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Code(struct soap*, int, const char*, const char*, size_t*); }; #endif #endif /* calc.h:113 */ #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Detail #define SOAP_TYPE_SOAP_ENV__Detail (27) /* SOAP_ENV__Detail: */ struct SOAP_CMAC SOAP_ENV__Detail { public: char *__any; /** Any type of element 'fault' assigned to fault with its SOAP_TYPE_ assigned to __type */ /** Do not create a cyclic data structure through this member unless SOAP encoding or SOAP_XML_GRAPH are used for id-ref serialization */ int __type; void *fault; public: /** Return unique type id SOAP_TYPE_SOAP_ENV__Detail */ long soap_type() const { return SOAP_TYPE_SOAP_ENV__Detail; } /** Constructor with member initializations */ SOAP_ENV__Detail() : __any(), __type(), fault() { } /** Friend allocator */ friend SOAP_FMAC1 SOAP_ENV__Detail * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Detail(struct soap*, int, const char*, const char*, size_t*); }; #endif #endif /* calc.h:113 */ #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Reason #define SOAP_TYPE_SOAP_ENV__Reason (30) /* SOAP_ENV__Reason: */ struct SOAP_CMAC SOAP_ENV__Reason { public: /** Optional element 'SOAP-ENV:Text' of XML schema type 'xsd:string' */ char *SOAP_ENV__Text; public: /** Return unique type id SOAP_TYPE_SOAP_ENV__Reason */ long soap_type() const { return SOAP_TYPE_SOAP_ENV__Reason; } /** Constructor with member initializations */ SOAP_ENV__Reason() : SOAP_ENV__Text() { } /** Friend allocator */ friend SOAP_FMAC1 SOAP_ENV__Reason * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Reason(struct soap*, int, const char*, const char*, size_t*); }; #endif #endif /* calc.h:113 */ #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Fault #define SOAP_TYPE_SOAP_ENV__Fault (31) /* SOAP_ENV__Fault: */ struct SOAP_CMAC SOAP_ENV__Fault { public: /** Optional element 'faultcode' of XML schema type 'xsd:QName' */ char *faultcode; /** Optional element 'faultstring' of XML schema type 'xsd:string' */ char *faultstring; /** Optional element 'faultactor' of XML schema type 'xsd:string' */ char *faultactor; /** Optional element 'detail' of XML schema type 'SOAP-ENV:Detail' */ struct SOAP_ENV__Detail *detail; /** Optional element 'SOAP-ENV:Code' of XML schema type 'SOAP-ENV:Code' */ struct SOAP_ENV__Code *SOAP_ENV__Code; /** Optional element 'SOAP-ENV:Reason' of XML schema type 'SOAP-ENV:Reason' */ struct SOAP_ENV__Reason *SOAP_ENV__Reason; /** Optional element 'SOAP-ENV:Node' of XML schema type 'xsd:string' */ char *SOAP_ENV__Node; /** Optional element 'SOAP-ENV:Role' of XML schema type 'xsd:string' */ char *SOAP_ENV__Role; /** Optional element 'SOAP-ENV:Detail' of XML schema type 'SOAP-ENV:Detail' */ struct SOAP_ENV__Detail *SOAP_ENV__Detail; public: /** Return unique type id SOAP_TYPE_SOAP_ENV__Fault */ long soap_type() const { return SOAP_TYPE_SOAP_ENV__Fault; } /** Constructor with member initializations */ SOAP_ENV__Fault() : faultcode(), faultstring(), faultactor(), detail(), SOAP_ENV__Code(), SOAP_ENV__Reason(), SOAP_ENV__Node(), SOAP_ENV__Role(), SOAP_ENV__Detail() { } /** Friend allocator */ friend SOAP_FMAC1 SOAP_ENV__Fault * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Fault(struct soap*, int, const char*, const char*, size_t*); }; #endif #endif /******************************************************************************\ * * * Typedefs * * * \******************************************************************************/ /* (built-in):0 */ #ifndef SOAP_TYPE__XML #define SOAP_TYPE__XML (5) typedef char *_XML; #endif /* (built-in):0 */ #ifndef SOAP_TYPE__QName #define SOAP_TYPE__QName (6) typedef char *_QName; #endif /******************************************************************************\ * * * Serializable Types * * * \******************************************************************************/ /* char has binding name 'byte' for type 'xsd:byte' */ #ifndef SOAP_TYPE_byte #define SOAP_TYPE_byte (3) #endif /* int has binding name 'int' for type 'xsd:int' */ #ifndef SOAP_TYPE_int #define SOAP_TYPE_int (1) #endif /* double has binding name 'double' for type 'xsd:double' */ #ifndef SOAP_TYPE_double #define SOAP_TYPE_double (7) #endif /* struct SOAP_ENV__Fault has binding name 'SOAP_ENV__Fault' for type '' */ #ifndef SOAP_TYPE_SOAP_ENV__Fault #define SOAP_TYPE_SOAP_ENV__Fault (31) #endif /* struct SOAP_ENV__Reason has binding name 'SOAP_ENV__Reason' for type '' */ #ifndef SOAP_TYPE_SOAP_ENV__Reason #define SOAP_TYPE_SOAP_ENV__Reason (30) #endif /* struct SOAP_ENV__Detail has binding name 'SOAP_ENV__Detail' for type '' */ #ifndef SOAP_TYPE_SOAP_ENV__Detail #define SOAP_TYPE_SOAP_ENV__Detail (27) #endif /* struct SOAP_ENV__Code has binding name 'SOAP_ENV__Code' for type '' */ #ifndef SOAP_TYPE_SOAP_ENV__Code #define SOAP_TYPE_SOAP_ENV__Code (25) #endif /* struct SOAP_ENV__Header has binding name 'SOAP_ENV__Header' for type '' */ #ifndef SOAP_TYPE_SOAP_ENV__Header #define SOAP_TYPE_SOAP_ENV__Header (24) #endif /* struct ns__pow has binding name 'ns__pow' for type 'ns:pow' */ #ifndef SOAP_TYPE_ns__pow #define SOAP_TYPE_ns__pow (23) #endif /* struct ns__powResponse has binding name 'ns__powResponse' for type 'ns:powResponse' */ #ifndef SOAP_TYPE_ns__powResponse #define SOAP_TYPE_ns__powResponse (22) #endif /* struct ns__div has binding name 'ns__div' for type 'ns:div' */ #ifndef SOAP_TYPE_ns__div #define SOAP_TYPE_ns__div (20) #endif /* struct ns__divResponse has binding name 'ns__divResponse' for type 'ns:divResponse' */ #ifndef SOAP_TYPE_ns__divResponse #define SOAP_TYPE_ns__divResponse (19) #endif /* struct ns__mul has binding name 'ns__mul' for type 'ns:mul' */ #ifndef SOAP_TYPE_ns__mul #define SOAP_TYPE_ns__mul (17) #endif /* struct ns__mulResponse has binding name 'ns__mulResponse' for type 'ns:mulResponse' */ #ifndef SOAP_TYPE_ns__mulResponse #define SOAP_TYPE_ns__mulResponse (16) #endif /* struct ns__sub has binding name 'ns__sub' for type 'ns:sub' */ #ifndef SOAP_TYPE_ns__sub #define SOAP_TYPE_ns__sub (14) #endif /* struct ns__subResponse has binding name 'ns__subResponse' for type 'ns:subResponse' */ #ifndef SOAP_TYPE_ns__subResponse #define SOAP_TYPE_ns__subResponse (13) #endif /* struct ns__add has binding name 'ns__add' for type 'ns:add' */ #ifndef SOAP_TYPE_ns__add #define SOAP_TYPE_ns__add (11) #endif /* struct ns__addResponse has binding name 'ns__addResponse' for type 'ns:addResponse' */ #ifndef SOAP_TYPE_ns__addResponse #define SOAP_TYPE_ns__addResponse (10) #endif /* struct SOAP_ENV__Reason * has binding name 'PointerToSOAP_ENV__Reason' for type '' */ #ifndef SOAP_TYPE_PointerToSOAP_ENV__Reason #define SOAP_TYPE_PointerToSOAP_ENV__Reason (33) #endif /* struct SOAP_ENV__Detail * has binding name 'PointerToSOAP_ENV__Detail' for type '' */ #ifndef SOAP_TYPE_PointerToSOAP_ENV__Detail #define SOAP_TYPE_PointerToSOAP_ENV__Detail (32) #endif /* struct SOAP_ENV__Code * has binding name 'PointerToSOAP_ENV__Code' for type '' */ #ifndef SOAP_TYPE_PointerToSOAP_ENV__Code #define SOAP_TYPE_PointerToSOAP_ENV__Code (26) #endif /* double * has binding name 'PointerTodouble' for type 'xsd:double' */ #ifndef SOAP_TYPE_PointerTodouble #define SOAP_TYPE_PointerTodouble (8) #endif /* _QName has binding name '_QName' for type 'xsd:QName' */ #ifndef SOAP_TYPE__QName #define SOAP_TYPE__QName (6) #endif /* _XML has binding name '_XML' for type '' */ #ifndef SOAP_TYPE__XML #define SOAP_TYPE__XML (5) #endif /* char * has binding name 'string' for type 'xsd:string' */ #ifndef SOAP_TYPE_string #define SOAP_TYPE_string (4) #endif /******************************************************************************\ * * * Externals * * * \******************************************************************************/ #endif /* End of soapStub.h */ gsoap-2.8.91/gsoap/samples/calc_xcode/calc_xcode.10000644000175000017500000000607013525245162021303 0ustar ellertellert.\"Modified from man(1) of FreeBSD, the NetBSD mdoc.template, and mdoc.samples. .\"See Also: .\"man mdoc.samples for a complete listing of options .\"man mdoc for the short list of editing options .\"/usr/share/misc/mdoc.template .Dd 12/31/07 \" DATE .Dt calc_xcode 1 \" Program name and manual section number .Os Darwin .Sh NAME \" Section Header - required - don't modify .Nm calc_xcode, .\" The following lines are read in generating the apropos(man -k) database. Use only key .\" words here as the database is built based on the words here and in the .ND line. .Nm Other_name_for_same_program(), .Nm Yet another name for the same program. .\" Use .Nm macro to designate other names for the documented program. .Nd This line parsed for whatis database. .Sh SYNOPSIS \" Section Header - required - don't modify .Nm .Op Fl abcd \" [-abcd] .Op Fl a Ar path \" [-a path] .Op Ar file \" [file] .Op Ar \" [file ...] .Ar arg0 \" Underlined argument - use .Ar anywhere to underline arg2 ... \" Arguments .Sh DESCRIPTION \" Section Header - required - don't modify Use the .Nm macro to refer to your program throughout the man page like such: .Nm Underlining is accomplished with the .Ar macro like this: .Ar underlined text . .Pp \" Inserts a space A list of items with descriptions: .Bl -tag -width -indent \" Begins a tagged list .It item a \" Each item preceded by .It macro Description of item a .It item b Description of item b .El \" Ends the list .Pp A list of flags and their descriptions: .Bl -tag -width -indent \" Differs from above in tag removed .It Fl a \"-a flag as a list item Description of -a flag .It Fl b Description of -b flag .El \" Ends the list .Pp .\" .Sh ENVIRONMENT \" May not be needed .\" .Bl -tag -width "ENV_VAR_1" -indent \" ENV_VAR_1 is width of the string ENV_VAR_1 .\" .It Ev ENV_VAR_1 .\" Description of ENV_VAR_1 .\" .It Ev ENV_VAR_2 .\" Description of ENV_VAR_2 .\" .El .Sh FILES \" File used or created by the topic of the man page .Bl -tag -width "/Users/joeuser/Library/really_long_file_name" -compact .It Pa /usr/share/file_name FILE_1 description .It Pa /Users/joeuser/Library/really_long_file_name FILE_2 description .El \" Ends the list .\" .Sh DIAGNOSTICS \" May not be needed .\" .Bl -diag .\" .It Diagnostic Tag .\" Diagnostic informtion here. .\" .It Diagnostic Tag .\" Diagnostic informtion here. .\" .El .Sh SEE ALSO .\" List links in ascending order by section, alphabetically within a section. .\" Please do not reference files that do not exist without filing a bug report .Xr a 1 , .Xr b 1 , .Xr c 1 , .Xr a 2 , .Xr b 2 , .Xr a 3 , .Xr b 3 .\" .Sh BUGS \" Document known, unremedied bugs .\" .Sh HISTORY \" Document history if command behaves in a unique manner gsoap-2.8.91/gsoap/samples/calc_xcode/calc_xcode.xcodeproj/0000755000175000017500000000000013525245162023212 5ustar ellertellertgsoap-2.8.91/gsoap/samples/calc_xcode/calc_xcode.xcodeproj/project.pbxproj0000644000175000017500000002453513525245162026277 0ustar ellertellert// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 44A340260D29680E003D1AA9 /* calc.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 44A340250D29680E003D1AA9 /* calc.h */; }; 44A340280D296817003D1AA9 /* calcclient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 44A340270D296817003D1AA9 /* calcclient.cpp */; }; 44A3402A0D296857003D1AA9 /* stdsoap2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 44A340290D296857003D1AA9 /* stdsoap2.cpp */; }; 44A3402C0D296861003D1AA9 /* stdsoap2.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 44A3402B0D296861003D1AA9 /* stdsoap2.h */; }; 44A340400D296B17003D1AA9 /* soapcalcProxy.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 44A3403F0D296B17003D1AA9 /* soapcalcProxy.h */; }; 44A340420D296B1B003D1AA9 /* soapcalcProxy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 44A340410D296B1B003D1AA9 /* soapcalcProxy.cpp */; }; 44A340440D296B27003D1AA9 /* soapH.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 44A340430D296B26003D1AA9 /* soapH.h */; }; 44A340460D296B2B003D1AA9 /* soapStub.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 44A340450D296B2B003D1AA9 /* soapStub.h */; }; 44A340480D296B2F003D1AA9 /* soapC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 44A340470D296B2F003D1AA9 /* soapC.cpp */; }; 8DD76F6A0486A84900D96B5E /* calc_xcode.1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = C6859E8B029090EE04C91782 /* calc_xcode.1 */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ 8DD76F690486A84900D96B5E /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 8; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( 8DD76F6A0486A84900D96B5E /* calc_xcode.1 in CopyFiles */, 44A340260D29680E003D1AA9 /* calc.h in CopyFiles */, 44A3402C0D296861003D1AA9 /* stdsoap2.h in CopyFiles */, 44A340400D296B17003D1AA9 /* soapcalcProxy.h in CopyFiles */, 44A340440D296B27003D1AA9 /* soapH.h in CopyFiles */, 44A340460D296B2B003D1AA9 /* soapStub.h in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 1; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 44A340250D29680E003D1AA9 /* calc.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = calc.h; sourceTree = ""; }; 44A340270D296817003D1AA9 /* calcclient.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = calcclient.cpp; sourceTree = ""; }; 44A340290D296857003D1AA9 /* stdsoap2.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = stdsoap2.cpp; path = ../../stdsoap2.cpp; sourceTree = SOURCE_ROOT; }; 44A3402B0D296861003D1AA9 /* stdsoap2.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = stdsoap2.h; path = ../../stdsoap2.h; sourceTree = SOURCE_ROOT; }; 44A3403F0D296B17003D1AA9 /* soapcalcProxy.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = soapcalcProxy.h; sourceTree = ""; }; 44A340410D296B1B003D1AA9 /* soapcalcProxy.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = soapcalcProxy.cpp; sourceTree = ""; }; 44A340430D296B26003D1AA9 /* soapH.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = soapH.h; sourceTree = ""; }; 44A340450D296B2B003D1AA9 /* soapStub.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = soapStub.h; sourceTree = ""; }; 44A340470D296B2F003D1AA9 /* soapC.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = soapC.cpp; sourceTree = ""; }; 8DD76F6C0486A84900D96B5E /* calc_xcode */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = calc_xcode; sourceTree = BUILT_PRODUCTS_DIR; }; C6859E8B029090EE04C91782 /* calc_xcode.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = calc_xcode.1; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 8DD76F660486A84900D96B5E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 08FB7794FE84155DC02AAC07 /* calc_xcode */ = { isa = PBXGroup; children = ( 08FB7795FE84155DC02AAC07 /* Source */, C6859E8C029090F304C91782 /* Documentation */, 1AB674ADFE9D54B511CA2CBB /* Products */, ); name = calc_xcode; sourceTree = ""; }; 08FB7795FE84155DC02AAC07 /* Source */ = { isa = PBXGroup; children = ( 44A340250D29680E003D1AA9 /* calc.h */, 44A340270D296817003D1AA9 /* calcclient.cpp */, 44A3402B0D296861003D1AA9 /* stdsoap2.h */, 44A340290D296857003D1AA9 /* stdsoap2.cpp */, 44A3403F0D296B17003D1AA9 /* soapcalcProxy.h */, 44A340410D296B1B003D1AA9 /* soapcalcProxy.cpp */, 44A340450D296B2B003D1AA9 /* soapStub.h */, 44A340430D296B26003D1AA9 /* soapH.h */, 44A340470D296B2F003D1AA9 /* soapC.cpp */, ); name = Source; sourceTree = ""; }; 1AB674ADFE9D54B511CA2CBB /* Products */ = { isa = PBXGroup; children = ( 8DD76F6C0486A84900D96B5E /* calc_xcode */, ); name = Products; sourceTree = ""; }; C6859E8C029090F304C91782 /* Documentation */ = { isa = PBXGroup; children = ( C6859E8B029090EE04C91782 /* calc_xcode.1 */, ); name = Documentation; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 8DD76F620486A84900D96B5E /* calc_xcode */ = { isa = PBXNativeTarget; buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "calc_xcode" */; buildPhases = ( 44A3405D0D296D65003D1AA9 /* ShellScript */, 8DD76F640486A84900D96B5E /* Sources */, 8DD76F660486A84900D96B5E /* Frameworks */, 8DD76F690486A84900D96B5E /* CopyFiles */, 44A340330D29697B003D1AA9 /* ShellScript */, ); buildRules = ( ); dependencies = ( ); name = calc_xcode; productInstallPath = "$(HOME)/bin"; productName = calc_xcode; productReference = 8DD76F6C0486A84900D96B5E /* calc_xcode */; productType = "com.apple.product-type.tool"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 08FB7793FE84155DC02AAC07 /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0460; }; buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "calc_xcode" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( en, ); mainGroup = 08FB7794FE84155DC02AAC07 /* calc_xcode */; projectDirPath = ""; projectRoot = ""; targets = ( 8DD76F620486A84900D96B5E /* calc_xcode */, ); }; /* End PBXProject section */ /* Begin PBXShellScriptBuildPhase section */ 44A340330D29697B003D1AA9 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = ""; }; 44A3405D0D296D65003D1AA9 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/calc.h", ); outputPaths = ( "$(DERIVED_FILE_DIR)/soapcalcProxy.h", "$(DERIVED_FILE_DIR)/soapcalcProxy.cpp", "$(DERIVED_FILE_DIR)/soapStub.h", "$(DERIVED_FILE_DIR)/soapH.h", "$(DERIVED_FILE_DIR)/soapC.cpp", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "../../src/soapcpp2 -i -wx -C calc.h"; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 8DD76F640486A84900D96B5E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 44A340280D296817003D1AA9 /* calcclient.cpp in Sources */, 44A3402A0D296857003D1AA9 /* stdsoap2.cpp in Sources */, 44A340420D296B1B003D1AA9 /* soapcalcProxy.cpp in Sources */, 44A340480D296B2F003D1AA9 /* soapC.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ 1DEB923208733DC60010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; INSTALL_PATH = "$(HOME)/bin"; PRODUCT_NAME = calc_xcode; SDKROOT = ""; ZERO_LINK = YES; }; name = Debug; }; 1DEB923308733DC60010E9CD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_MODEL_TUNING = G5; INSTALL_PATH = "$(HOME)/bin"; PRODUCT_NAME = calc_xcode; SDKROOT = ""; }; name = Release; }; 1DEB923608733DC60010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; SDKROOT = ""; }; name = Debug; }; 1DEB923708733DC60010E9CD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; SDKROOT = ""; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "calc_xcode" */ = { isa = XCConfigurationList; buildConfigurations = ( 1DEB923208733DC60010E9CD /* Debug */, 1DEB923308733DC60010E9CD /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "calc_xcode" */ = { isa = XCConfigurationList; buildConfigurations = ( 1DEB923608733DC60010E9CD /* Debug */, 1DEB923708733DC60010E9CD /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; } gsoap-2.8.91/gsoap/samples/calc_xcode/soapcalcProxy.cpp0000644000175000017500000003356213525245162022476 0ustar ellertellert/* soapcalcProxy.cpp Generated by gSOAP 2.8.91 for calc.h gSOAP XML Web services tools Copyright (C) 2000-2018, Robert van Engelen, Genivia Inc. All Rights Reserved. The soapcpp2 tool and its generated software are released under the GPL. 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 "soapcalcProxy.h" calcProxy::calcProxy() : soap(SOAP_IO_DEFAULT) { calcProxy_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); } calcProxy::calcProxy(const calcProxy& rhs) { soap_copy_context(this, &rhs); this->soap_endpoint = rhs.soap_endpoint; } calcProxy::calcProxy(const struct soap &_soap) : soap(_soap) { } calcProxy::calcProxy(const struct soap &_soap, const char *soap_endpoint_url) : soap(_soap) { soap_endpoint = soap_endpoint_url; } calcProxy::calcProxy(const char *soap_endpoint_url) : soap(SOAP_IO_DEFAULT) { calcProxy_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); soap_endpoint = soap_endpoint_url; } calcProxy::calcProxy(soap_mode iomode) : soap(iomode) { calcProxy_init(iomode, iomode); } calcProxy::calcProxy(const char *soap_endpoint_url, soap_mode iomode) : soap(iomode) { calcProxy_init(iomode, iomode); soap_endpoint = soap_endpoint_url; } calcProxy::calcProxy(soap_mode imode, soap_mode omode) : soap(imode, omode) { calcProxy_init(imode, omode); } calcProxy::~calcProxy() { this->destroy(); } void calcProxy::calcProxy_init(soap_mode imode, soap_mode omode) { soap_imode(this, imode); soap_omode(this, omode); soap_endpoint = NULL; static const 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 }, { "ns", "urn:calc", NULL, NULL }, { NULL, NULL, NULL, NULL} }; soap_set_namespaces(this, namespaces); } calcProxy *calcProxy::copy() { calcProxy *dup = SOAP_NEW_UNMANAGED(calcProxy(*(struct soap*)this)); return dup; } calcProxy& calcProxy::operator=(const calcProxy& rhs) { soap_done(this); soap_copy_context(this, &rhs); this->soap_endpoint = rhs.soap_endpoint; return *this; } void calcProxy::destroy() { soap_destroy(this); soap_end(this); } void calcProxy::reset() { this->destroy(); soap_done(this); soap_initialize(this); calcProxy_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); } void calcProxy::soap_noheader() { this->header = NULL; } ::SOAP_ENV__Header *calcProxy::soap_header() { return this->header; } ::SOAP_ENV__Fault *calcProxy::soap_fault() { return this->fault; } const char *calcProxy::soap_fault_subcode() { return ::soap_fault_subcode(this); } const char *calcProxy::soap_fault_string() { return ::soap_fault_string(this); } const char *calcProxy::soap_fault_detail() { return ::soap_fault_detail(this); } int calcProxy::soap_close_socket() { return ::soap_closesock(this); } int calcProxy::soap_force_close_socket() { return ::soap_force_closesock(this); } void calcProxy::soap_print_fault(FILE *fd) { ::soap_print_fault(this, fd); } #ifndef WITH_LEAN #ifndef WITH_COMPAT void calcProxy::soap_stream_fault(std::ostream& os) { ::soap_stream_fault(this, os); } #endif char *calcProxy::soap_sprint_fault(char *buf, size_t len) { return ::soap_sprint_fault(this, buf, len); } #endif int calcProxy::send_add(const char *soap_endpoint_url, const char *soap_action, double a, double b) { struct soap *soap = this; struct ns__add soap_tmp_ns__add; if (soap_endpoint_url != NULL) soap_endpoint = soap_endpoint_url; if (soap_endpoint == NULL) soap_endpoint = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; soap_tmp_ns__add.a = a; soap_tmp_ns__add.b = b; soap_begin(soap); soap->encodingStyle = ""; /* use SOAP encoding style */ soap_serializeheader(soap); soap_serialize_ns__add(soap, &soap_tmp_ns__add); if (soap_begin_count(soap)) return soap->error; if ((soap->mode & SOAP_IO_LENGTH)) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__add(soap, &soap_tmp_ns__add, "ns:add", "") || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; } if (soap_end_count(soap)) return soap->error; if (soap_connect(soap, soap_endpoint, soap_action) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__add(soap, &soap_tmp_ns__add, "ns:add", "") || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } int calcProxy::recv_add(double *result) { struct soap *soap = this; struct ns__addResponse *soap_tmp_ns__addResponse; if (!result) return soap_closesock(soap); soap_default_double(soap, result); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) return soap_closesock(soap); if (soap_recv_fault(soap, 1)) return soap->error; soap_tmp_ns__addResponse = soap_get_ns__addResponse(soap, NULL, "", NULL); if (!soap_tmp_ns__addResponse || soap->error) return soap_recv_fault(soap, 0); if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap_closesock(soap); if (result && soap_tmp_ns__addResponse->result) *result = *soap_tmp_ns__addResponse->result; return soap_closesock(soap); } int calcProxy::send_sub(const char *soap_endpoint_url, const char *soap_action, double a, double b) { struct soap *soap = this; struct ns__sub soap_tmp_ns__sub; if (soap_endpoint_url != NULL) soap_endpoint = soap_endpoint_url; if (soap_endpoint == NULL) soap_endpoint = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; soap_tmp_ns__sub.a = a; soap_tmp_ns__sub.b = b; soap_begin(soap); soap->encodingStyle = ""; /* use SOAP encoding style */ soap_serializeheader(soap); soap_serialize_ns__sub(soap, &soap_tmp_ns__sub); if (soap_begin_count(soap)) return soap->error; if ((soap->mode & SOAP_IO_LENGTH)) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__sub(soap, &soap_tmp_ns__sub, "ns:sub", "") || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; } if (soap_end_count(soap)) return soap->error; if (soap_connect(soap, soap_endpoint, soap_action) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__sub(soap, &soap_tmp_ns__sub, "ns:sub", "") || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } int calcProxy::recv_sub(double *result) { struct soap *soap = this; struct ns__subResponse *soap_tmp_ns__subResponse; if (!result) return soap_closesock(soap); soap_default_double(soap, result); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) return soap_closesock(soap); if (soap_recv_fault(soap, 1)) return soap->error; soap_tmp_ns__subResponse = soap_get_ns__subResponse(soap, NULL, "", NULL); if (!soap_tmp_ns__subResponse || soap->error) return soap_recv_fault(soap, 0); if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap_closesock(soap); if (result && soap_tmp_ns__subResponse->result) *result = *soap_tmp_ns__subResponse->result; return soap_closesock(soap); } int calcProxy::send_mul(const char *soap_endpoint_url, const char *soap_action, double a, double b) { struct soap *soap = this; struct ns__mul soap_tmp_ns__mul; if (soap_endpoint_url != NULL) soap_endpoint = soap_endpoint_url; if (soap_endpoint == NULL) soap_endpoint = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; soap_tmp_ns__mul.a = a; soap_tmp_ns__mul.b = b; soap_begin(soap); soap->encodingStyle = ""; /* use SOAP encoding style */ soap_serializeheader(soap); soap_serialize_ns__mul(soap, &soap_tmp_ns__mul); if (soap_begin_count(soap)) return soap->error; if ((soap->mode & SOAP_IO_LENGTH)) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__mul(soap, &soap_tmp_ns__mul, "ns:mul", "") || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; } if (soap_end_count(soap)) return soap->error; if (soap_connect(soap, soap_endpoint, soap_action) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__mul(soap, &soap_tmp_ns__mul, "ns:mul", "") || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } int calcProxy::recv_mul(double *result) { struct soap *soap = this; struct ns__mulResponse *soap_tmp_ns__mulResponse; if (!result) return soap_closesock(soap); soap_default_double(soap, result); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) return soap_closesock(soap); if (soap_recv_fault(soap, 1)) return soap->error; soap_tmp_ns__mulResponse = soap_get_ns__mulResponse(soap, NULL, "", NULL); if (!soap_tmp_ns__mulResponse || soap->error) return soap_recv_fault(soap, 0); if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap_closesock(soap); if (result && soap_tmp_ns__mulResponse->result) *result = *soap_tmp_ns__mulResponse->result; return soap_closesock(soap); } int calcProxy::send_div(const char *soap_endpoint_url, const char *soap_action, double a, double b) { struct soap *soap = this; struct ns__div soap_tmp_ns__div; if (soap_endpoint_url != NULL) soap_endpoint = soap_endpoint_url; if (soap_endpoint == NULL) soap_endpoint = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; soap_tmp_ns__div.a = a; soap_tmp_ns__div.b = b; soap_begin(soap); soap->encodingStyle = ""; /* use SOAP encoding style */ soap_serializeheader(soap); soap_serialize_ns__div(soap, &soap_tmp_ns__div); if (soap_begin_count(soap)) return soap->error; if ((soap->mode & SOAP_IO_LENGTH)) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__div(soap, &soap_tmp_ns__div, "ns:div", "") || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; } if (soap_end_count(soap)) return soap->error; if (soap_connect(soap, soap_endpoint, soap_action) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__div(soap, &soap_tmp_ns__div, "ns:div", "") || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } int calcProxy::recv_div(double *result) { struct soap *soap = this; struct ns__divResponse *soap_tmp_ns__divResponse; if (!result) return soap_closesock(soap); soap_default_double(soap, result); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) return soap_closesock(soap); if (soap_recv_fault(soap, 1)) return soap->error; soap_tmp_ns__divResponse = soap_get_ns__divResponse(soap, NULL, "", NULL); if (!soap_tmp_ns__divResponse || soap->error) return soap_recv_fault(soap, 0); if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap_closesock(soap); if (result && soap_tmp_ns__divResponse->result) *result = *soap_tmp_ns__divResponse->result; return soap_closesock(soap); } int calcProxy::send_pow(const char *soap_endpoint_url, const char *soap_action, double a, double b) { struct soap *soap = this; struct ns__pow soap_tmp_ns__pow; if (soap_endpoint_url != NULL) soap_endpoint = soap_endpoint_url; if (soap_endpoint == NULL) soap_endpoint = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; soap_tmp_ns__pow.a = a; soap_tmp_ns__pow.b = b; soap_begin(soap); soap->encodingStyle = ""; /* use SOAP encoding style */ soap_serializeheader(soap); soap_serialize_ns__pow(soap, &soap_tmp_ns__pow); if (soap_begin_count(soap)) return soap->error; if ((soap->mode & SOAP_IO_LENGTH)) { if (soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__pow(soap, &soap_tmp_ns__pow, "ns:pow", "") || soap_body_end_out(soap) || soap_envelope_end_out(soap)) return soap->error; } if (soap_end_count(soap)) return soap->error; if (soap_connect(soap, soap_endpoint, soap_action) || soap_envelope_begin_out(soap) || soap_putheader(soap) || soap_body_begin_out(soap) || soap_put_ns__pow(soap, &soap_tmp_ns__pow, "ns:pow", "") || soap_body_end_out(soap) || soap_envelope_end_out(soap) || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } int calcProxy::recv_pow(double *result) { struct soap *soap = this; struct ns__powResponse *soap_tmp_ns__powResponse; if (!result) return soap_closesock(soap); soap_default_double(soap, result); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) return soap_closesock(soap); if (soap_recv_fault(soap, 1)) return soap->error; soap_tmp_ns__powResponse = soap_get_ns__powResponse(soap, NULL, "", NULL); if (!soap_tmp_ns__powResponse || soap->error) return soap_recv_fault(soap, 0); if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap_closesock(soap); if (result && soap_tmp_ns__powResponse->result) *result = *soap_tmp_ns__powResponse->result; return soap_closesock(soap); } /* End of client proxy code */ gsoap-2.8.91/gsoap/samples/calc_xcode/soapcalcProxy.h0000644000175000017500000002166413525245162022143 0ustar ellertellert/* soapcalcProxy.h Generated by gSOAP 2.8.91 for calc.h gSOAP XML Web services tools Copyright (C) 2000-2018, Robert van Engelen, Genivia Inc. All Rights Reserved. The soapcpp2 tool and its generated software are released under the GPL. 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 soapcalcProxy_H #define soapcalcProxy_H #include "soapH.h" class SOAP_CMAC calcProxy : public soap { public: /// Endpoint URL of service 'calcProxy' (change as needed) const char *soap_endpoint; /// Variables globally declared in calc.h, if any /// Construct a proxy with new managing context calcProxy(); /// Copy constructor calcProxy(const calcProxy& rhs); /// Construct proxy given a managing context calcProxy(const struct soap&); /// Construct proxy given a managing context and endpoint URL calcProxy(const struct soap&, const char *soap_endpoint_url); /// Constructor taking an endpoint URL calcProxy(const char *soap_endpoint_url); /// Constructor taking input and output mode flags for the new managing context calcProxy(soap_mode iomode); /// Constructor taking endpoint URL and input and output mode flags for the new managing context calcProxy(const char *soap_endpoint_url, soap_mode iomode); /// Constructor taking input and output mode flags for the new managing context calcProxy(soap_mode imode, soap_mode omode); /// Destructor deletes deserialized data and its managing context virtual ~calcProxy(); /// Initializer used by constructors virtual void calcProxy_init(soap_mode imode, soap_mode omode); /// Return a copy that has a new managing context with the same engine state virtual calcProxy *copy(); /// Copy assignment calcProxy& operator=(const calcProxy&); /// Delete all deserialized data (uses soap_destroy() and soap_end()) virtual void destroy(); /// Delete all deserialized data and reset to default virtual void reset(); /// Disables and removes SOAP Header from message by setting soap->header = NULL virtual void soap_noheader(); /// Get SOAP Header structure (i.e. soap->header, which is NULL when absent) virtual ::SOAP_ENV__Header *soap_header(); /// Get SOAP Fault structure (i.e. soap->fault, which is NULL when absent) virtual ::SOAP_ENV__Fault *soap_fault(); /// Get SOAP Fault subcode QName string (NULL when absent) virtual const char *soap_fault_subcode(); /// Get SOAP Fault string/reason (NULL when absent) virtual const char *soap_fault_string(); /// Get SOAP Fault detail XML string (NULL when absent) virtual const char *soap_fault_detail(); /// Close connection (normally automatic, except for send_X ops) virtual int soap_close_socket(); /// Force close connection (can kill a thread blocked on IO) virtual int soap_force_close_socket(); /// Print fault virtual void soap_print_fault(FILE*); #ifndef WITH_LEAN #ifndef WITH_COMPAT /// Print fault to stream virtual void soap_stream_fault(std::ostream&); #endif /// Write fault to buffer virtual char *soap_sprint_fault(char *buf, size_t len); #endif // /// Web service synchronous operation 'add' with default endpoint and default SOAP Action header, returns SOAP_OK or error code virtual int add(double a, double b, double *result) { return this->add(NULL, NULL, a, b, result); } /// Web service synchronous operation 'add' to the specified endpoint and SOAP Action header, returns SOAP_OK or error code virtual int add(const char *soap_endpoint_url, const char *soap_action, double a, double b, double *result) { return this->send_add(soap_endpoint_url, soap_action, a, b) || this->recv_add(result) ? this->error : SOAP_OK; } /// Web service asynchronous operation 'send_add' to send a request message to the specified endpoint and SOAP Action header, returns SOAP_OK or error code virtual int send_add(const char *soap_endpoint_url, const char *soap_action, double a, double b); /// Web service asynchronous operation 'recv_add' to receive a response message from the connected endpoint, returns SOAP_OK or error code virtual int recv_add(double *result); // /// Web service synchronous operation 'sub' with default endpoint and default SOAP Action header, returns SOAP_OK or error code virtual int sub(double a, double b, double *result) { return this->sub(NULL, NULL, a, b, result); } /// Web service synchronous operation 'sub' to the specified endpoint and SOAP Action header, returns SOAP_OK or error code virtual int sub(const char *soap_endpoint_url, const char *soap_action, double a, double b, double *result) { return this->send_sub(soap_endpoint_url, soap_action, a, b) || this->recv_sub(result) ? this->error : SOAP_OK; } /// Web service asynchronous operation 'send_sub' to send a request message to the specified endpoint and SOAP Action header, returns SOAP_OK or error code virtual int send_sub(const char *soap_endpoint_url, const char *soap_action, double a, double b); /// Web service asynchronous operation 'recv_sub' to receive a response message from the connected endpoint, returns SOAP_OK or error code virtual int recv_sub(double *result); // /// Web service synchronous operation 'mul' with default endpoint and default SOAP Action header, returns SOAP_OK or error code virtual int mul(double a, double b, double *result) { return this->mul(NULL, NULL, a, b, result); } /// Web service synchronous operation 'mul' to the specified endpoint and SOAP Action header, returns SOAP_OK or error code virtual int mul(const char *soap_endpoint_url, const char *soap_action, double a, double b, double *result) { return this->send_mul(soap_endpoint_url, soap_action, a, b) || this->recv_mul(result) ? this->error : SOAP_OK; } /// Web service asynchronous operation 'send_mul' to send a request message to the specified endpoint and SOAP Action header, returns SOAP_OK or error code virtual int send_mul(const char *soap_endpoint_url, const char *soap_action, double a, double b); /// Web service asynchronous operation 'recv_mul' to receive a response message from the connected endpoint, returns SOAP_OK or error code virtual int recv_mul(double *result); // /// Web service synchronous operation 'div' with default endpoint and default SOAP Action header, returns SOAP_OK or error code virtual int div(double a, double b, double *result) { return this->div(NULL, NULL, a, b, result); } /// Web service synchronous operation 'div' to the specified endpoint and SOAP Action header, returns SOAP_OK or error code virtual int div(const char *soap_endpoint_url, const char *soap_action, double a, double b, double *result) { return this->send_div(soap_endpoint_url, soap_action, a, b) || this->recv_div(result) ? this->error : SOAP_OK; } /// Web service asynchronous operation 'send_div' to send a request message to the specified endpoint and SOAP Action header, returns SOAP_OK or error code virtual int send_div(const char *soap_endpoint_url, const char *soap_action, double a, double b); /// Web service asynchronous operation 'recv_div' to receive a response message from the connected endpoint, returns SOAP_OK or error code virtual int recv_div(double *result); // /// Web service synchronous operation 'pow' with default endpoint and default SOAP Action header, returns SOAP_OK or error code virtual int pow(double a, double b, double *result) { return this->pow(NULL, NULL, a, b, result); } /// Web service synchronous operation 'pow' to the specified endpoint and SOAP Action header, returns SOAP_OK or error code virtual int pow(const char *soap_endpoint_url, const char *soap_action, double a, double b, double *result) { return this->send_pow(soap_endpoint_url, soap_action, a, b) || this->recv_pow(result) ? this->error : SOAP_OK; } /// Web service asynchronous operation 'send_pow' to send a request message to the specified endpoint and SOAP Action header, returns SOAP_OK or error code virtual int send_pow(const char *soap_endpoint_url, const char *soap_action, double a, double b); /// Web service asynchronous operation 'recv_pow' to receive a response message from the connected endpoint, returns SOAP_OK or error code virtual int recv_pow(double *result); }; #endif gsoap-2.8.91/gsoap/samples/calc_xcode/README.txt0000644000175000017500000000165013525245162020632 0ustar ellertellertA MAC OS X Xcode example client for the simple calculator service. To create a new gSOAP-based Xcode project, follow these additional steps: Add a new run script to invoke soapcpp2: Project -> New Build Phase -> New Run Script Build Phase In the New script edit box: Script content: ./../src/soapcpp2 -i -wx -C calc.h Input files: $(SRCROOT)/calc.h Output files: $(DERIVED_FILE_DIR)/soapcalcProxy.h $(DERIVED_FILE_DIR)/soapcalcProxy.cpp $(DERIVED_FILE_DIR)/soapStub.h $(DERIVED_FILE_DIR)/soapH.h $(DERIVED_FILE_DIR)/soapC.cpp In the project overview move the new Run script to the start of the build: Groups & Files window pane: Targets -> calc_xcode -> Run script -> Compile Sources ... The calcclient application invokes the service and is used from the command line as follows: $ calcclient add 3 4 result = 7 The calcserver application is a CGI application that can be installed under the cgibin of your Web server. gsoap-2.8.91/gsoap/samples/calc_xcode/calc.nsmap0000644000175000017500000000122113525245162021070 0ustar ellertellert #include "stdsoap2.h" /* This defines the global XML namespaces[] table to #include and compile */ 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 }, { "ns", "urn:calc", NULL, NULL }, { NULL, NULL, NULL, NULL} }; gsoap-2.8.91/gsoap/samples/calc_xcode/calc.h0000644000175000017500000001054613525245162020213 0ustar ellertellert/* calc.h This is a gSOAP header file with a calculator data binding and Web service interface to implement clients and services The service operations and type definitions use familiar C/C++ syntax. The following methods are defined by this gSOAP service definition: add(a,b) sub(a,b) mul(a,b) div(a,b) pow(a,b) Build steps for C (see samples/calc): $ soapcpp2 -c -r calc.h $ cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c $ cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c Build steps for C++ (see samples/calc++): $ soapcpp2 -j -r calc.h $ c++ -o calcclient++ calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp $ c++ -o calcserver++ calcserver.cpp stdsoap2.cpp soapC.cpp soapcalcService.cpp Option -r generates a soapReadme.md report. Note that soapcpp2 option -j generates proxy and service classes, which encapsulate the method operations in the class instead of defining them as global functions as in C. The //gsoap directives are used to bind XML namespaces and to define Web service properties: //gsoap service name: //gsoap service style: [rpc|document] //gsoap service encoding: [literal|encoded] //gsoap service namespace: //gsoap service location: Web service operation properties: //gsoap service method-style: [rpc|document] //gsoap service method-encoding: [literal|encoded] //gsoap service method-action: //gsoap service method-documentation: and type schema properties: //gsoap schema namespace: //gsoap schema elementForm: [qualified|unqualified] //gsoap schema attributeForm: [qualified|unqualified] //gsoap schema documentation: //gsoap schema type-documentation: where is an XML namespace prefix, which is used in C/C++ operation names, e.g. ns__add(), and type names, e.g. xsd__int. See the documentation for the full list of //gsoap directives. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: calc Simple calculator service described at https://www.genivia.com/dev.html //gsoap ns service protocol: SOAP //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns schema namespace: urn:calc //gsoap ns service method: add Sums two values int ns__add(double a, double b, double *result); //gsoap ns service method: sub Subtracts two values int ns__sub(double a, double b, double *result); //gsoap ns service method: mul Multiplies two values int ns__mul(double a, double b, double *result); //gsoap ns service method: div Divides two values int ns__div(double a, double b, double *result); //gsoap ns service method: pow Raises a to b int ns__pow(double a, double b, double *result); gsoap-2.8.91/gsoap/samples/calc_xcode/calcclient.cpp0000644000175000017500000000520013525245162021734 0ustar ellertellert/* calcclient.cpp Example calculator service client in C++ Service definitions in calc.h (not generated by wsdl2h, but similar) $ soapcpp2 -i calc.h $ c++ -o calcclient calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp where stdsoap2.cpp is in the 'gsoap' directory, or use libgsoap++: $ c++ -o calcclient calcclient.cpp soapC.cpp soapcalcProxy.cpp -lgsoap++ -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapcalcProxy.h" #include "calc.nsmap" const char server[] = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; int main(int argc, char **argv) { if (argc < 4) { fprintf(stderr, "Usage: [add|sub|mul|div|pow] num num\n"); exit(0); } double a, b, result; a = strtod(argv[2], NULL); b = strtod(argv[3], NULL); calcProxy calc; calc.soap_endpoint = server; switch (*argv[1]) { case 'a': calc.add(a, b, &result); break; case 's': calc.sub(a, b, &result); break; case 'm': calc.mul(a, b, &result); break; case 'd': calc.div(a, b, &result); break; case 'p': calc.pow(a, b, &result); break; default: fprintf(stderr, "Unknown command\n"); exit(0); } if (calc.error) calc.soap_stream_fault(std::cerr); else printf("result = %g\n", result); calc.destroy(); /* clean up mem */ return 0; } gsoap-2.8.91/gsoap/samples/calc_xcode/soapH.h0000644000175000017500000022065413525245162020366 0ustar ellertellert/* soapH.h Generated by gSOAP 2.8.91 for calc.h gSOAP XML Web services tools Copyright (C) 2000-2018, Robert van Engelen, Genivia Inc. All Rights Reserved. The soapcpp2 tool and its generated software are released under the GPL. 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 soapH_H #define soapH_H #include "soapStub.h" #ifndef WITH_NOIDREF #ifdef __cplusplus extern "C" { #endif SOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap*, const void*, int); #ifdef __cplusplus } #endif SOAP_FMAC3 int SOAP_FMAC4 soap_putindependent(struct soap*); SOAP_FMAC3 int SOAP_FMAC4 soap_getindependent(struct soap*); #endif #ifdef __cplusplus extern "C" { #endif SOAP_FMAC3 void * SOAP_FMAC4 soap_getelement(struct soap*, const char*, int*); SOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap*, const void*, const char*, int, int); SOAP_FMAC3 void * SOAP_FMAC4 soap_dupelement(struct soap*, const void*, int); SOAP_FMAC3 void SOAP_FMAC4 soap_delelement(const void*, int); #ifdef __cplusplus } #endif SOAP_FMAC3 int SOAP_FMAC4 soap_ignore_element(struct soap*); SOAP_FMAC3 void * SOAP_FMAC4 soap_instantiate(struct soap*, int, const char*, const char*, size_t*); SOAP_FMAC3 int SOAP_FMAC4 soap_fdelete(struct soap *soap, struct soap_clist*); SOAP_FMAC3 int SOAP_FMAC4 soap_fbase(int, int); SOAP_FMAC3 void SOAP_FMAC4 soap_finsert(struct soap*, int, int, void*, size_t, const void*, void**); #ifndef SOAP_TYPE_byte_DEFINED #define SOAP_TYPE_byte_DEFINED inline void 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_out_byte(struct soap*, const char*, int, const char *, const char*); SOAP_FMAC3 char * SOAP_FMAC4 soap_in_byte(struct soap*, const char*, char *, const char*); SOAP_FMAC3 char * SOAP_FMAC4 soap_new_byte(struct soap *soap, int n = -1); SOAP_FMAC3 int SOAP_FMAC4 soap_put_byte(struct soap*, const char *, const char*, const char*); inline int soap_write_byte(struct soap *soap, char const*p) { soap_free_temp(soap); if (p) { if (soap_begin_send(soap) || ::soap_put_byte(soap, p, "byte", "") || soap_end_send(soap)) return soap->error; } return SOAP_OK; } inline int soap_PUT_byte(struct soap *soap, const char *URL, char const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put_byte(soap, p, "byte", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_byte(struct soap *soap, const char *URL, char const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put_byte(soap, p, "byte", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_byte(struct soap *soap, const char *URL, char const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put_byte(soap, p, "byte", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 char * SOAP_FMAC4 soap_get_byte(struct soap*, char *, const char*, const char*); inline int soap_read_byte(struct soap *soap, char *p) { if (p) { if (soap_begin_recv(soap) || ::soap_get_byte(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_byte(struct soap *soap, const char *URL, char *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_byte(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_byte(struct soap *soap, char *p) { if (::soap_read_byte(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #ifndef SOAP_TYPE_int_DEFINED #define SOAP_TYPE_int_DEFINED inline void 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_out_int(struct soap*, const char*, int, const int *, const char*); SOAP_FMAC3 int * SOAP_FMAC4 soap_in_int(struct soap*, const char*, int *, const char*); SOAP_FMAC3 int * SOAP_FMAC4 soap_new_int(struct soap *soap, int n = -1); SOAP_FMAC3 int SOAP_FMAC4 soap_put_int(struct soap*, const int *, const char*, const char*); inline int soap_write_int(struct soap *soap, int const*p) { soap_free_temp(soap); if (p) { if (soap_begin_send(soap) || ::soap_put_int(soap, p, "int", "") || soap_end_send(soap)) return soap->error; } return SOAP_OK; } inline int soap_PUT_int(struct soap *soap, const char *URL, int const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put_int(soap, p, "int", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_int(struct soap *soap, const char *URL, int const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put_int(soap, p, "int", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_int(struct soap *soap, const char *URL, int const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put_int(soap, p, "int", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 int * SOAP_FMAC4 soap_get_int(struct soap*, int *, const char*, const char*); inline int soap_read_int(struct soap *soap, int *p) { if (p) { if (soap_begin_recv(soap) || ::soap_get_int(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_int(struct soap *soap, const char *URL, int *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_int(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_int(struct soap *soap, int *p) { if (::soap_read_int(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #ifndef SOAP_TYPE_double_DEFINED #define SOAP_TYPE_double_DEFINED inline void soap_default_double(struct soap *soap, double *a) { (void)soap; /* appease -Wall -Werror */ #ifdef SOAP_DEFAULT_double *a = SOAP_DEFAULT_double; #else *a = (double)0; #endif } SOAP_FMAC3 int SOAP_FMAC4 soap_out_double(struct soap*, const char*, int, const double *, const char*); SOAP_FMAC3 double * SOAP_FMAC4 soap_in_double(struct soap*, const char*, double *, const char*); SOAP_FMAC3 double * SOAP_FMAC4 soap_new_double(struct soap *soap, int n = -1); SOAP_FMAC3 int SOAP_FMAC4 soap_put_double(struct soap*, const double *, const char*, const char*); inline int soap_write_double(struct soap *soap, double const*p) { soap_free_temp(soap); if (p) { if (soap_begin_send(soap) || ::soap_put_double(soap, p, "double", "") || soap_end_send(soap)) return soap->error; } return SOAP_OK; } inline int soap_PUT_double(struct soap *soap, const char *URL, double const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put_double(soap, p, "double", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_double(struct soap *soap, const char *URL, double const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put_double(soap, p, "double", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_double(struct soap *soap, const char *URL, double const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put_double(soap, p, "double", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 double * SOAP_FMAC4 soap_get_double(struct soap*, double *, const char*, const char*); inline int soap_read_double(struct soap *soap, double *p) { if (p) { if (soap_begin_recv(soap) || ::soap_get_double(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_double(struct soap *soap, const char *URL, double *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_double(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_double(struct soap *soap, double *p) { if (::soap_read_double(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Fault_DEFINED #define SOAP_TYPE_SOAP_ENV__Fault_DEFINED 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_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_in_SOAP_ENV__Fault(struct soap*, const char*, struct SOAP_ENV__Fault *, const char*); SOAP_FMAC1 struct SOAP_ENV__Fault * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Fault(struct soap*, int, const char*, const char*, size_t*); inline struct SOAP_ENV__Fault * soap_new_SOAP_ENV__Fault(struct soap *soap, int n = -1) { return soap_instantiate_SOAP_ENV__Fault(soap, n, NULL, NULL, NULL); } inline struct SOAP_ENV__Fault * soap_new_req_SOAP_ENV__Fault( struct soap *soap) { struct SOAP_ENV__Fault *_p = ::soap_new_SOAP_ENV__Fault(soap); if (_p) { ::soap_default_SOAP_ENV__Fault(soap, _p); } return _p; } inline struct SOAP_ENV__Fault * soap_new_set_SOAP_ENV__Fault( struct soap *soap, char *faultcode, char *faultstring, char *faultactor, struct SOAP_ENV__Detail *detail, struct SOAP_ENV__Code *SOAP_ENV__Code, struct SOAP_ENV__Reason *SOAP_ENV__Reason, char *SOAP_ENV__Node, char *SOAP_ENV__Role, struct SOAP_ENV__Detail *SOAP_ENV__Detail) { struct SOAP_ENV__Fault *_p = ::soap_new_SOAP_ENV__Fault(soap); if (_p) { ::soap_default_SOAP_ENV__Fault(soap, _p); _p->faultcode = faultcode; _p->faultstring = faultstring; _p->faultactor = faultactor; _p->detail = detail; _p->SOAP_ENV__Code = SOAP_ENV__Code; _p->SOAP_ENV__Reason = SOAP_ENV__Reason; _p->SOAP_ENV__Node = SOAP_ENV__Node; _p->SOAP_ENV__Role = SOAP_ENV__Role; _p->SOAP_ENV__Detail = SOAP_ENV__Detail; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Fault(struct soap*, const struct SOAP_ENV__Fault *, const char*, const char*); inline int soap_write_SOAP_ENV__Fault(struct soap *soap, struct SOAP_ENV__Fault const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_SOAP_ENV__Fault(soap, p), 0) || ::soap_put_SOAP_ENV__Fault(soap, p, "SOAP-ENV:Fault", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_SOAP_ENV__Fault(struct soap *soap, const char *URL, struct SOAP_ENV__Fault const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Fault(soap, p), 0) || ::soap_put_SOAP_ENV__Fault(soap, p, "SOAP-ENV:Fault", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_SOAP_ENV__Fault(struct soap *soap, const char *URL, struct SOAP_ENV__Fault const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Fault(soap, p), 0) || ::soap_put_SOAP_ENV__Fault(soap, p, "SOAP-ENV:Fault", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_SOAP_ENV__Fault(struct soap *soap, const char *URL, struct SOAP_ENV__Fault const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Fault(soap, p), 0) || ::soap_put_SOAP_ENV__Fault(soap, p, "SOAP-ENV:Fault", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct SOAP_ENV__Fault * SOAP_FMAC4 soap_get_SOAP_ENV__Fault(struct soap*, struct SOAP_ENV__Fault *, const char*, const char*); inline int soap_read_SOAP_ENV__Fault(struct soap *soap, struct SOAP_ENV__Fault *p) { if (p) { ::soap_default_SOAP_ENV__Fault(soap, p); if (soap_begin_recv(soap) || ::soap_get_SOAP_ENV__Fault(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_SOAP_ENV__Fault(struct soap *soap, const char *URL, struct SOAP_ENV__Fault *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_SOAP_ENV__Fault(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_SOAP_ENV__Fault(struct soap *soap, struct SOAP_ENV__Fault *p) { if (::soap_read_SOAP_ENV__Fault(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Reason_DEFINED #define SOAP_TYPE_SOAP_ENV__Reason_DEFINED 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_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_in_SOAP_ENV__Reason(struct soap*, const char*, struct SOAP_ENV__Reason *, const char*); SOAP_FMAC1 struct SOAP_ENV__Reason * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Reason(struct soap*, int, const char*, const char*, size_t*); inline struct SOAP_ENV__Reason * soap_new_SOAP_ENV__Reason(struct soap *soap, int n = -1) { return soap_instantiate_SOAP_ENV__Reason(soap, n, NULL, NULL, NULL); } inline struct SOAP_ENV__Reason * soap_new_req_SOAP_ENV__Reason( struct soap *soap) { struct SOAP_ENV__Reason *_p = ::soap_new_SOAP_ENV__Reason(soap); if (_p) { ::soap_default_SOAP_ENV__Reason(soap, _p); } return _p; } inline struct SOAP_ENV__Reason * soap_new_set_SOAP_ENV__Reason( struct soap *soap, char *SOAP_ENV__Text) { struct SOAP_ENV__Reason *_p = ::soap_new_SOAP_ENV__Reason(soap); if (_p) { ::soap_default_SOAP_ENV__Reason(soap, _p); _p->SOAP_ENV__Text = SOAP_ENV__Text; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Reason(struct soap*, const struct SOAP_ENV__Reason *, const char*, const char*); inline int soap_write_SOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_SOAP_ENV__Reason(soap, p), 0) || ::soap_put_SOAP_ENV__Reason(soap, p, "SOAP-ENV:Reason", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_SOAP_ENV__Reason(struct soap *soap, const char *URL, struct SOAP_ENV__Reason const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Reason(soap, p), 0) || ::soap_put_SOAP_ENV__Reason(soap, p, "SOAP-ENV:Reason", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_SOAP_ENV__Reason(struct soap *soap, const char *URL, struct SOAP_ENV__Reason const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Reason(soap, p), 0) || ::soap_put_SOAP_ENV__Reason(soap, p, "SOAP-ENV:Reason", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_SOAP_ENV__Reason(struct soap *soap, const char *URL, struct SOAP_ENV__Reason const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Reason(soap, p), 0) || ::soap_put_SOAP_ENV__Reason(soap, p, "SOAP-ENV:Reason", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct SOAP_ENV__Reason * SOAP_FMAC4 soap_get_SOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *, const char*, const char*); inline int soap_read_SOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *p) { if (p) { ::soap_default_SOAP_ENV__Reason(soap, p); if (soap_begin_recv(soap) || ::soap_get_SOAP_ENV__Reason(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_SOAP_ENV__Reason(struct soap *soap, const char *URL, struct SOAP_ENV__Reason *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_SOAP_ENV__Reason(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_SOAP_ENV__Reason(struct soap *soap, struct SOAP_ENV__Reason *p) { if (::soap_read_SOAP_ENV__Reason(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Detail_DEFINED #define SOAP_TYPE_SOAP_ENV__Detail_DEFINED 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_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_in_SOAP_ENV__Detail(struct soap*, const char*, struct SOAP_ENV__Detail *, const char*); SOAP_FMAC1 struct SOAP_ENV__Detail * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Detail(struct soap*, int, const char*, const char*, size_t*); inline struct SOAP_ENV__Detail * soap_new_SOAP_ENV__Detail(struct soap *soap, int n = -1) { return soap_instantiate_SOAP_ENV__Detail(soap, n, NULL, NULL, NULL); } inline struct SOAP_ENV__Detail * soap_new_req_SOAP_ENV__Detail( struct soap *soap, int __type, void *fault) { struct SOAP_ENV__Detail *_p = ::soap_new_SOAP_ENV__Detail(soap); if (_p) { ::soap_default_SOAP_ENV__Detail(soap, _p); _p->__type = __type; _p->fault = fault; } return _p; } inline struct SOAP_ENV__Detail * soap_new_set_SOAP_ENV__Detail( struct soap *soap, char *__any, int __type, void *fault) { struct SOAP_ENV__Detail *_p = ::soap_new_SOAP_ENV__Detail(soap); if (_p) { ::soap_default_SOAP_ENV__Detail(soap, _p); _p->__any = __any; _p->__type = __type; _p->fault = fault; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Detail(struct soap*, const struct SOAP_ENV__Detail *, const char*, const char*); inline int soap_write_SOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_SOAP_ENV__Detail(soap, p), 0) || ::soap_put_SOAP_ENV__Detail(soap, p, "SOAP-ENV:Detail", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_SOAP_ENV__Detail(struct soap *soap, const char *URL, struct SOAP_ENV__Detail const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Detail(soap, p), 0) || ::soap_put_SOAP_ENV__Detail(soap, p, "SOAP-ENV:Detail", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_SOAP_ENV__Detail(struct soap *soap, const char *URL, struct SOAP_ENV__Detail const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Detail(soap, p), 0) || ::soap_put_SOAP_ENV__Detail(soap, p, "SOAP-ENV:Detail", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_SOAP_ENV__Detail(struct soap *soap, const char *URL, struct SOAP_ENV__Detail const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Detail(soap, p), 0) || ::soap_put_SOAP_ENV__Detail(soap, p, "SOAP-ENV:Detail", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_get_SOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *, const char*, const char*); inline int soap_read_SOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *p) { if (p) { ::soap_default_SOAP_ENV__Detail(soap, p); if (soap_begin_recv(soap) || ::soap_get_SOAP_ENV__Detail(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_SOAP_ENV__Detail(struct soap *soap, const char *URL, struct SOAP_ENV__Detail *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_SOAP_ENV__Detail(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_SOAP_ENV__Detail(struct soap *soap, struct SOAP_ENV__Detail *p) { if (::soap_read_SOAP_ENV__Detail(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Code_DEFINED #define SOAP_TYPE_SOAP_ENV__Code_DEFINED 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_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_in_SOAP_ENV__Code(struct soap*, const char*, struct SOAP_ENV__Code *, const char*); SOAP_FMAC1 struct SOAP_ENV__Code * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Code(struct soap*, int, const char*, const char*, size_t*); inline struct SOAP_ENV__Code * soap_new_SOAP_ENV__Code(struct soap *soap, int n = -1) { return soap_instantiate_SOAP_ENV__Code(soap, n, NULL, NULL, NULL); } inline struct SOAP_ENV__Code * soap_new_req_SOAP_ENV__Code( struct soap *soap) { struct SOAP_ENV__Code *_p = ::soap_new_SOAP_ENV__Code(soap); if (_p) { ::soap_default_SOAP_ENV__Code(soap, _p); } return _p; } inline struct SOAP_ENV__Code * soap_new_set_SOAP_ENV__Code( struct soap *soap, char *SOAP_ENV__Value, struct SOAP_ENV__Code *SOAP_ENV__Subcode) { struct SOAP_ENV__Code *_p = ::soap_new_SOAP_ENV__Code(soap); if (_p) { ::soap_default_SOAP_ENV__Code(soap, _p); _p->SOAP_ENV__Value = SOAP_ENV__Value; _p->SOAP_ENV__Subcode = SOAP_ENV__Subcode; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Code(struct soap*, const struct SOAP_ENV__Code *, const char*, const char*); inline int soap_write_SOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_SOAP_ENV__Code(soap, p), 0) || ::soap_put_SOAP_ENV__Code(soap, p, "SOAP-ENV:Code", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_SOAP_ENV__Code(struct soap *soap, const char *URL, struct SOAP_ENV__Code const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Code(soap, p), 0) || ::soap_put_SOAP_ENV__Code(soap, p, "SOAP-ENV:Code", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_SOAP_ENV__Code(struct soap *soap, const char *URL, struct SOAP_ENV__Code const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Code(soap, p), 0) || ::soap_put_SOAP_ENV__Code(soap, p, "SOAP-ENV:Code", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_SOAP_ENV__Code(struct soap *soap, const char *URL, struct SOAP_ENV__Code const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Code(soap, p), 0) || ::soap_put_SOAP_ENV__Code(soap, p, "SOAP-ENV:Code", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct SOAP_ENV__Code * SOAP_FMAC4 soap_get_SOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *, const char*, const char*); inline int soap_read_SOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *p) { if (p) { ::soap_default_SOAP_ENV__Code(soap, p); if (soap_begin_recv(soap) || ::soap_get_SOAP_ENV__Code(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_SOAP_ENV__Code(struct soap *soap, const char *URL, struct SOAP_ENV__Code *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_SOAP_ENV__Code(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_SOAP_ENV__Code(struct soap *soap, struct SOAP_ENV__Code *p) { if (::soap_read_SOAP_ENV__Code(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_SOAP_ENV__Header_DEFINED #define SOAP_TYPE_SOAP_ENV__Header_DEFINED 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_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_in_SOAP_ENV__Header(struct soap*, const char*, struct SOAP_ENV__Header *, const char*); SOAP_FMAC1 struct SOAP_ENV__Header * SOAP_FMAC2 soap_instantiate_SOAP_ENV__Header(struct soap*, int, const char*, const char*, size_t*); inline struct SOAP_ENV__Header * soap_new_SOAP_ENV__Header(struct soap *soap, int n = -1) { return soap_instantiate_SOAP_ENV__Header(soap, n, NULL, NULL, NULL); } inline struct SOAP_ENV__Header * soap_new_req_SOAP_ENV__Header( struct soap *soap) { struct SOAP_ENV__Header *_p = ::soap_new_SOAP_ENV__Header(soap); if (_p) { ::soap_default_SOAP_ENV__Header(soap, _p); } return _p; } inline struct SOAP_ENV__Header * soap_new_set_SOAP_ENV__Header( struct soap *soap) { struct SOAP_ENV__Header *_p = ::soap_new_SOAP_ENV__Header(soap); if (_p) { ::soap_default_SOAP_ENV__Header(soap, _p); } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_SOAP_ENV__Header(struct soap*, const struct SOAP_ENV__Header *, const char*, const char*); inline int soap_write_SOAP_ENV__Header(struct soap *soap, struct SOAP_ENV__Header const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_SOAP_ENV__Header(soap, p), 0) || ::soap_put_SOAP_ENV__Header(soap, p, "SOAP-ENV:Header", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_SOAP_ENV__Header(struct soap *soap, const char *URL, struct SOAP_ENV__Header const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Header(soap, p), 0) || ::soap_put_SOAP_ENV__Header(soap, p, "SOAP-ENV:Header", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_SOAP_ENV__Header(struct soap *soap, const char *URL, struct SOAP_ENV__Header const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Header(soap, p), 0) || ::soap_put_SOAP_ENV__Header(soap, p, "SOAP-ENV:Header", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_SOAP_ENV__Header(struct soap *soap, const char *URL, struct SOAP_ENV__Header const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_SOAP_ENV__Header(soap, p), 0) || ::soap_put_SOAP_ENV__Header(soap, p, "SOAP-ENV:Header", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct SOAP_ENV__Header * SOAP_FMAC4 soap_get_SOAP_ENV__Header(struct soap*, struct SOAP_ENV__Header *, const char*, const char*); inline int soap_read_SOAP_ENV__Header(struct soap *soap, struct SOAP_ENV__Header *p) { if (p) { ::soap_default_SOAP_ENV__Header(soap, p); if (soap_begin_recv(soap) || ::soap_get_SOAP_ENV__Header(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_SOAP_ENV__Header(struct soap *soap, const char *URL, struct SOAP_ENV__Header *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_SOAP_ENV__Header(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_SOAP_ENV__Header(struct soap *soap, struct SOAP_ENV__Header *p) { if (::soap_read_SOAP_ENV__Header(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #endif #ifndef SOAP_TYPE_ns__pow_DEFINED #define SOAP_TYPE_ns__pow_DEFINED SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__pow(struct soap*, struct ns__pow *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__pow(struct soap*, const struct ns__pow *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__pow(struct soap*, const char*, int, const struct ns__pow *, const char*); SOAP_FMAC3 struct ns__pow * SOAP_FMAC4 soap_in_ns__pow(struct soap*, const char*, struct ns__pow *, const char*); SOAP_FMAC1 struct ns__pow * SOAP_FMAC2 soap_instantiate_ns__pow(struct soap*, int, const char*, const char*, size_t*); inline struct ns__pow * soap_new_ns__pow(struct soap *soap, int n = -1) { return soap_instantiate_ns__pow(soap, n, NULL, NULL, NULL); } inline struct ns__pow * soap_new_req_ns__pow( struct soap *soap, double a, double b) { struct ns__pow *_p = ::soap_new_ns__pow(soap); if (_p) { ::soap_default_ns__pow(soap, _p); _p->a = a; _p->b = b; } return _p; } inline struct ns__pow * soap_new_set_ns__pow( struct soap *soap, double a, double b) { struct ns__pow *_p = ::soap_new_ns__pow(soap); if (_p) { ::soap_default_ns__pow(soap, _p); _p->a = a; _p->b = b; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__pow(struct soap*, const struct ns__pow *, const char*, const char*); inline int soap_write_ns__pow(struct soap *soap, struct ns__pow const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_ns__pow(soap, p), 0) || ::soap_put_ns__pow(soap, p, "ns:pow", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_ns__pow(struct soap *soap, const char *URL, struct ns__pow const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__pow(soap, p), 0) || ::soap_put_ns__pow(soap, p, "ns:pow", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_ns__pow(struct soap *soap, const char *URL, struct ns__pow const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__pow(soap, p), 0) || ::soap_put_ns__pow(soap, p, "ns:pow", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_ns__pow(struct soap *soap, const char *URL, struct ns__pow const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__pow(soap, p), 0) || ::soap_put_ns__pow(soap, p, "ns:pow", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct ns__pow * SOAP_FMAC4 soap_get_ns__pow(struct soap*, struct ns__pow *, const char*, const char*); inline int soap_read_ns__pow(struct soap *soap, struct ns__pow *p) { if (p) { ::soap_default_ns__pow(soap, p); if (soap_begin_recv(soap) || ::soap_get_ns__pow(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_ns__pow(struct soap *soap, const char *URL, struct ns__pow *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_ns__pow(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_ns__pow(struct soap *soap, struct ns__pow *p) { if (::soap_read_ns__pow(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #ifndef SOAP_TYPE_ns__powResponse_DEFINED #define SOAP_TYPE_ns__powResponse_DEFINED SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__powResponse(struct soap*, struct ns__powResponse *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__powResponse(struct soap*, const struct ns__powResponse *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__powResponse(struct soap*, const char*, int, const struct ns__powResponse *, const char*); SOAP_FMAC3 struct ns__powResponse * SOAP_FMAC4 soap_in_ns__powResponse(struct soap*, const char*, struct ns__powResponse *, const char*); SOAP_FMAC1 struct ns__powResponse * SOAP_FMAC2 soap_instantiate_ns__powResponse(struct soap*, int, const char*, const char*, size_t*); inline struct ns__powResponse * soap_new_ns__powResponse(struct soap *soap, int n = -1) { return soap_instantiate_ns__powResponse(soap, n, NULL, NULL, NULL); } inline struct ns__powResponse * soap_new_req_ns__powResponse( struct soap *soap) { struct ns__powResponse *_p = ::soap_new_ns__powResponse(soap); if (_p) { ::soap_default_ns__powResponse(soap, _p); } return _p; } inline struct ns__powResponse * soap_new_set_ns__powResponse( struct soap *soap, double *result) { struct ns__powResponse *_p = ::soap_new_ns__powResponse(soap); if (_p) { ::soap_default_ns__powResponse(soap, _p); _p->result = result; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__powResponse(struct soap*, const struct ns__powResponse *, const char*, const char*); inline int soap_write_ns__powResponse(struct soap *soap, struct ns__powResponse const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_ns__powResponse(soap, p), 0) || ::soap_put_ns__powResponse(soap, p, "ns:powResponse", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_ns__powResponse(struct soap *soap, const char *URL, struct ns__powResponse const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__powResponse(soap, p), 0) || ::soap_put_ns__powResponse(soap, p, "ns:powResponse", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_ns__powResponse(struct soap *soap, const char *URL, struct ns__powResponse const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__powResponse(soap, p), 0) || ::soap_put_ns__powResponse(soap, p, "ns:powResponse", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_ns__powResponse(struct soap *soap, const char *URL, struct ns__powResponse const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__powResponse(soap, p), 0) || ::soap_put_ns__powResponse(soap, p, "ns:powResponse", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct ns__powResponse * SOAP_FMAC4 soap_get_ns__powResponse(struct soap*, struct ns__powResponse *, const char*, const char*); inline int soap_read_ns__powResponse(struct soap *soap, struct ns__powResponse *p) { if (p) { ::soap_default_ns__powResponse(soap, p); if (soap_begin_recv(soap) || ::soap_get_ns__powResponse(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_ns__powResponse(struct soap *soap, const char *URL, struct ns__powResponse *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_ns__powResponse(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_ns__powResponse(struct soap *soap, struct ns__powResponse *p) { if (::soap_read_ns__powResponse(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #ifndef SOAP_TYPE_ns__div_DEFINED #define SOAP_TYPE_ns__div_DEFINED SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__div(struct soap*, struct ns__div *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__div(struct soap*, const struct ns__div *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__div(struct soap*, const char*, int, const struct ns__div *, const char*); SOAP_FMAC3 struct ns__div * SOAP_FMAC4 soap_in_ns__div(struct soap*, const char*, struct ns__div *, const char*); SOAP_FMAC1 struct ns__div * SOAP_FMAC2 soap_instantiate_ns__div(struct soap*, int, const char*, const char*, size_t*); inline struct ns__div * soap_new_ns__div(struct soap *soap, int n = -1) { return soap_instantiate_ns__div(soap, n, NULL, NULL, NULL); } inline struct ns__div * soap_new_req_ns__div( struct soap *soap, double a, double b) { struct ns__div *_p = ::soap_new_ns__div(soap); if (_p) { ::soap_default_ns__div(soap, _p); _p->a = a; _p->b = b; } return _p; } inline struct ns__div * soap_new_set_ns__div( struct soap *soap, double a, double b) { struct ns__div *_p = ::soap_new_ns__div(soap); if (_p) { ::soap_default_ns__div(soap, _p); _p->a = a; _p->b = b; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__div(struct soap*, const struct ns__div *, const char*, const char*); inline int soap_write_ns__div(struct soap *soap, struct ns__div const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_ns__div(soap, p), 0) || ::soap_put_ns__div(soap, p, "ns:div", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_ns__div(struct soap *soap, const char *URL, struct ns__div const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__div(soap, p), 0) || ::soap_put_ns__div(soap, p, "ns:div", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_ns__div(struct soap *soap, const char *URL, struct ns__div const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__div(soap, p), 0) || ::soap_put_ns__div(soap, p, "ns:div", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_ns__div(struct soap *soap, const char *URL, struct ns__div const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__div(soap, p), 0) || ::soap_put_ns__div(soap, p, "ns:div", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct ns__div * SOAP_FMAC4 soap_get_ns__div(struct soap*, struct ns__div *, const char*, const char*); inline int soap_read_ns__div(struct soap *soap, struct ns__div *p) { if (p) { ::soap_default_ns__div(soap, p); if (soap_begin_recv(soap) || ::soap_get_ns__div(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_ns__div(struct soap *soap, const char *URL, struct ns__div *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_ns__div(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_ns__div(struct soap *soap, struct ns__div *p) { if (::soap_read_ns__div(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #ifndef SOAP_TYPE_ns__divResponse_DEFINED #define SOAP_TYPE_ns__divResponse_DEFINED SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__divResponse(struct soap*, struct ns__divResponse *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__divResponse(struct soap*, const struct ns__divResponse *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__divResponse(struct soap*, const char*, int, const struct ns__divResponse *, const char*); SOAP_FMAC3 struct ns__divResponse * SOAP_FMAC4 soap_in_ns__divResponse(struct soap*, const char*, struct ns__divResponse *, const char*); SOAP_FMAC1 struct ns__divResponse * SOAP_FMAC2 soap_instantiate_ns__divResponse(struct soap*, int, const char*, const char*, size_t*); inline struct ns__divResponse * soap_new_ns__divResponse(struct soap *soap, int n = -1) { return soap_instantiate_ns__divResponse(soap, n, NULL, NULL, NULL); } inline struct ns__divResponse * soap_new_req_ns__divResponse( struct soap *soap) { struct ns__divResponse *_p = ::soap_new_ns__divResponse(soap); if (_p) { ::soap_default_ns__divResponse(soap, _p); } return _p; } inline struct ns__divResponse * soap_new_set_ns__divResponse( struct soap *soap, double *result) { struct ns__divResponse *_p = ::soap_new_ns__divResponse(soap); if (_p) { ::soap_default_ns__divResponse(soap, _p); _p->result = result; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__divResponse(struct soap*, const struct ns__divResponse *, const char*, const char*); inline int soap_write_ns__divResponse(struct soap *soap, struct ns__divResponse const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_ns__divResponse(soap, p), 0) || ::soap_put_ns__divResponse(soap, p, "ns:divResponse", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_ns__divResponse(struct soap *soap, const char *URL, struct ns__divResponse const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__divResponse(soap, p), 0) || ::soap_put_ns__divResponse(soap, p, "ns:divResponse", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_ns__divResponse(struct soap *soap, const char *URL, struct ns__divResponse const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__divResponse(soap, p), 0) || ::soap_put_ns__divResponse(soap, p, "ns:divResponse", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_ns__divResponse(struct soap *soap, const char *URL, struct ns__divResponse const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__divResponse(soap, p), 0) || ::soap_put_ns__divResponse(soap, p, "ns:divResponse", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct ns__divResponse * SOAP_FMAC4 soap_get_ns__divResponse(struct soap*, struct ns__divResponse *, const char*, const char*); inline int soap_read_ns__divResponse(struct soap *soap, struct ns__divResponse *p) { if (p) { ::soap_default_ns__divResponse(soap, p); if (soap_begin_recv(soap) || ::soap_get_ns__divResponse(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_ns__divResponse(struct soap *soap, const char *URL, struct ns__divResponse *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_ns__divResponse(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_ns__divResponse(struct soap *soap, struct ns__divResponse *p) { if (::soap_read_ns__divResponse(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #ifndef SOAP_TYPE_ns__mul_DEFINED #define SOAP_TYPE_ns__mul_DEFINED SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__mul(struct soap*, struct ns__mul *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__mul(struct soap*, const struct ns__mul *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__mul(struct soap*, const char*, int, const struct ns__mul *, const char*); SOAP_FMAC3 struct ns__mul * SOAP_FMAC4 soap_in_ns__mul(struct soap*, const char*, struct ns__mul *, const char*); SOAP_FMAC1 struct ns__mul * SOAP_FMAC2 soap_instantiate_ns__mul(struct soap*, int, const char*, const char*, size_t*); inline struct ns__mul * soap_new_ns__mul(struct soap *soap, int n = -1) { return soap_instantiate_ns__mul(soap, n, NULL, NULL, NULL); } inline struct ns__mul * soap_new_req_ns__mul( struct soap *soap, double a, double b) { struct ns__mul *_p = ::soap_new_ns__mul(soap); if (_p) { ::soap_default_ns__mul(soap, _p); _p->a = a; _p->b = b; } return _p; } inline struct ns__mul * soap_new_set_ns__mul( struct soap *soap, double a, double b) { struct ns__mul *_p = ::soap_new_ns__mul(soap); if (_p) { ::soap_default_ns__mul(soap, _p); _p->a = a; _p->b = b; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__mul(struct soap*, const struct ns__mul *, const char*, const char*); inline int soap_write_ns__mul(struct soap *soap, struct ns__mul const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_ns__mul(soap, p), 0) || ::soap_put_ns__mul(soap, p, "ns:mul", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_ns__mul(struct soap *soap, const char *URL, struct ns__mul const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__mul(soap, p), 0) || ::soap_put_ns__mul(soap, p, "ns:mul", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_ns__mul(struct soap *soap, const char *URL, struct ns__mul const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__mul(soap, p), 0) || ::soap_put_ns__mul(soap, p, "ns:mul", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_ns__mul(struct soap *soap, const char *URL, struct ns__mul const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__mul(soap, p), 0) || ::soap_put_ns__mul(soap, p, "ns:mul", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct ns__mul * SOAP_FMAC4 soap_get_ns__mul(struct soap*, struct ns__mul *, const char*, const char*); inline int soap_read_ns__mul(struct soap *soap, struct ns__mul *p) { if (p) { ::soap_default_ns__mul(soap, p); if (soap_begin_recv(soap) || ::soap_get_ns__mul(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_ns__mul(struct soap *soap, const char *URL, struct ns__mul *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_ns__mul(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_ns__mul(struct soap *soap, struct ns__mul *p) { if (::soap_read_ns__mul(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #ifndef SOAP_TYPE_ns__mulResponse_DEFINED #define SOAP_TYPE_ns__mulResponse_DEFINED SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__mulResponse(struct soap*, struct ns__mulResponse *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__mulResponse(struct soap*, const struct ns__mulResponse *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__mulResponse(struct soap*, const char*, int, const struct ns__mulResponse *, const char*); SOAP_FMAC3 struct ns__mulResponse * SOAP_FMAC4 soap_in_ns__mulResponse(struct soap*, const char*, struct ns__mulResponse *, const char*); SOAP_FMAC1 struct ns__mulResponse * SOAP_FMAC2 soap_instantiate_ns__mulResponse(struct soap*, int, const char*, const char*, size_t*); inline struct ns__mulResponse * soap_new_ns__mulResponse(struct soap *soap, int n = -1) { return soap_instantiate_ns__mulResponse(soap, n, NULL, NULL, NULL); } inline struct ns__mulResponse * soap_new_req_ns__mulResponse( struct soap *soap) { struct ns__mulResponse *_p = ::soap_new_ns__mulResponse(soap); if (_p) { ::soap_default_ns__mulResponse(soap, _p); } return _p; } inline struct ns__mulResponse * soap_new_set_ns__mulResponse( struct soap *soap, double *result) { struct ns__mulResponse *_p = ::soap_new_ns__mulResponse(soap); if (_p) { ::soap_default_ns__mulResponse(soap, _p); _p->result = result; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__mulResponse(struct soap*, const struct ns__mulResponse *, const char*, const char*); inline int soap_write_ns__mulResponse(struct soap *soap, struct ns__mulResponse const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_ns__mulResponse(soap, p), 0) || ::soap_put_ns__mulResponse(soap, p, "ns:mulResponse", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_ns__mulResponse(struct soap *soap, const char *URL, struct ns__mulResponse const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__mulResponse(soap, p), 0) || ::soap_put_ns__mulResponse(soap, p, "ns:mulResponse", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_ns__mulResponse(struct soap *soap, const char *URL, struct ns__mulResponse const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__mulResponse(soap, p), 0) || ::soap_put_ns__mulResponse(soap, p, "ns:mulResponse", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_ns__mulResponse(struct soap *soap, const char *URL, struct ns__mulResponse const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__mulResponse(soap, p), 0) || ::soap_put_ns__mulResponse(soap, p, "ns:mulResponse", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct ns__mulResponse * SOAP_FMAC4 soap_get_ns__mulResponse(struct soap*, struct ns__mulResponse *, const char*, const char*); inline int soap_read_ns__mulResponse(struct soap *soap, struct ns__mulResponse *p) { if (p) { ::soap_default_ns__mulResponse(soap, p); if (soap_begin_recv(soap) || ::soap_get_ns__mulResponse(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_ns__mulResponse(struct soap *soap, const char *URL, struct ns__mulResponse *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_ns__mulResponse(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_ns__mulResponse(struct soap *soap, struct ns__mulResponse *p) { if (::soap_read_ns__mulResponse(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #ifndef SOAP_TYPE_ns__sub_DEFINED #define SOAP_TYPE_ns__sub_DEFINED SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__sub(struct soap*, struct ns__sub *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__sub(struct soap*, const struct ns__sub *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__sub(struct soap*, const char*, int, const struct ns__sub *, const char*); SOAP_FMAC3 struct ns__sub * SOAP_FMAC4 soap_in_ns__sub(struct soap*, const char*, struct ns__sub *, const char*); SOAP_FMAC1 struct ns__sub * SOAP_FMAC2 soap_instantiate_ns__sub(struct soap*, int, const char*, const char*, size_t*); inline struct ns__sub * soap_new_ns__sub(struct soap *soap, int n = -1) { return soap_instantiate_ns__sub(soap, n, NULL, NULL, NULL); } inline struct ns__sub * soap_new_req_ns__sub( struct soap *soap, double a, double b) { struct ns__sub *_p = ::soap_new_ns__sub(soap); if (_p) { ::soap_default_ns__sub(soap, _p); _p->a = a; _p->b = b; } return _p; } inline struct ns__sub * soap_new_set_ns__sub( struct soap *soap, double a, double b) { struct ns__sub *_p = ::soap_new_ns__sub(soap); if (_p) { ::soap_default_ns__sub(soap, _p); _p->a = a; _p->b = b; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__sub(struct soap*, const struct ns__sub *, const char*, const char*); inline int soap_write_ns__sub(struct soap *soap, struct ns__sub const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_ns__sub(soap, p), 0) || ::soap_put_ns__sub(soap, p, "ns:sub", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_ns__sub(struct soap *soap, const char *URL, struct ns__sub const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__sub(soap, p), 0) || ::soap_put_ns__sub(soap, p, "ns:sub", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_ns__sub(struct soap *soap, const char *URL, struct ns__sub const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__sub(soap, p), 0) || ::soap_put_ns__sub(soap, p, "ns:sub", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_ns__sub(struct soap *soap, const char *URL, struct ns__sub const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__sub(soap, p), 0) || ::soap_put_ns__sub(soap, p, "ns:sub", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct ns__sub * SOAP_FMAC4 soap_get_ns__sub(struct soap*, struct ns__sub *, const char*, const char*); inline int soap_read_ns__sub(struct soap *soap, struct ns__sub *p) { if (p) { ::soap_default_ns__sub(soap, p); if (soap_begin_recv(soap) || ::soap_get_ns__sub(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_ns__sub(struct soap *soap, const char *URL, struct ns__sub *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_ns__sub(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_ns__sub(struct soap *soap, struct ns__sub *p) { if (::soap_read_ns__sub(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #ifndef SOAP_TYPE_ns__subResponse_DEFINED #define SOAP_TYPE_ns__subResponse_DEFINED SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__subResponse(struct soap*, struct ns__subResponse *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__subResponse(struct soap*, const struct ns__subResponse *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__subResponse(struct soap*, const char*, int, const struct ns__subResponse *, const char*); SOAP_FMAC3 struct ns__subResponse * SOAP_FMAC4 soap_in_ns__subResponse(struct soap*, const char*, struct ns__subResponse *, const char*); SOAP_FMAC1 struct ns__subResponse * SOAP_FMAC2 soap_instantiate_ns__subResponse(struct soap*, int, const char*, const char*, size_t*); inline struct ns__subResponse * soap_new_ns__subResponse(struct soap *soap, int n = -1) { return soap_instantiate_ns__subResponse(soap, n, NULL, NULL, NULL); } inline struct ns__subResponse * soap_new_req_ns__subResponse( struct soap *soap) { struct ns__subResponse *_p = ::soap_new_ns__subResponse(soap); if (_p) { ::soap_default_ns__subResponse(soap, _p); } return _p; } inline struct ns__subResponse * soap_new_set_ns__subResponse( struct soap *soap, double *result) { struct ns__subResponse *_p = ::soap_new_ns__subResponse(soap); if (_p) { ::soap_default_ns__subResponse(soap, _p); _p->result = result; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__subResponse(struct soap*, const struct ns__subResponse *, const char*, const char*); inline int soap_write_ns__subResponse(struct soap *soap, struct ns__subResponse const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_ns__subResponse(soap, p), 0) || ::soap_put_ns__subResponse(soap, p, "ns:subResponse", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_ns__subResponse(struct soap *soap, const char *URL, struct ns__subResponse const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__subResponse(soap, p), 0) || ::soap_put_ns__subResponse(soap, p, "ns:subResponse", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_ns__subResponse(struct soap *soap, const char *URL, struct ns__subResponse const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__subResponse(soap, p), 0) || ::soap_put_ns__subResponse(soap, p, "ns:subResponse", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_ns__subResponse(struct soap *soap, const char *URL, struct ns__subResponse const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__subResponse(soap, p), 0) || ::soap_put_ns__subResponse(soap, p, "ns:subResponse", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct ns__subResponse * SOAP_FMAC4 soap_get_ns__subResponse(struct soap*, struct ns__subResponse *, const char*, const char*); inline int soap_read_ns__subResponse(struct soap *soap, struct ns__subResponse *p) { if (p) { ::soap_default_ns__subResponse(soap, p); if (soap_begin_recv(soap) || ::soap_get_ns__subResponse(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_ns__subResponse(struct soap *soap, const char *URL, struct ns__subResponse *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_ns__subResponse(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_ns__subResponse(struct soap *soap, struct ns__subResponse *p) { if (::soap_read_ns__subResponse(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #ifndef SOAP_TYPE_ns__add_DEFINED #define SOAP_TYPE_ns__add_DEFINED SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__add(struct soap*, struct ns__add *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__add(struct soap*, const struct ns__add *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__add(struct soap*, const char*, int, const struct ns__add *, const char*); SOAP_FMAC3 struct ns__add * SOAP_FMAC4 soap_in_ns__add(struct soap*, const char*, struct ns__add *, const char*); SOAP_FMAC1 struct ns__add * SOAP_FMAC2 soap_instantiate_ns__add(struct soap*, int, const char*, const char*, size_t*); inline struct ns__add * soap_new_ns__add(struct soap *soap, int n = -1) { return soap_instantiate_ns__add(soap, n, NULL, NULL, NULL); } inline struct ns__add * soap_new_req_ns__add( struct soap *soap, double a, double b) { struct ns__add *_p = ::soap_new_ns__add(soap); if (_p) { ::soap_default_ns__add(soap, _p); _p->a = a; _p->b = b; } return _p; } inline struct ns__add * soap_new_set_ns__add( struct soap *soap, double a, double b) { struct ns__add *_p = ::soap_new_ns__add(soap); if (_p) { ::soap_default_ns__add(soap, _p); _p->a = a; _p->b = b; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__add(struct soap*, const struct ns__add *, const char*, const char*); inline int soap_write_ns__add(struct soap *soap, struct ns__add const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_ns__add(soap, p), 0) || ::soap_put_ns__add(soap, p, "ns:add", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_ns__add(struct soap *soap, const char *URL, struct ns__add const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__add(soap, p), 0) || ::soap_put_ns__add(soap, p, "ns:add", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_ns__add(struct soap *soap, const char *URL, struct ns__add const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__add(soap, p), 0) || ::soap_put_ns__add(soap, p, "ns:add", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_ns__add(struct soap *soap, const char *URL, struct ns__add const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__add(soap, p), 0) || ::soap_put_ns__add(soap, p, "ns:add", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct ns__add * SOAP_FMAC4 soap_get_ns__add(struct soap*, struct ns__add *, const char*, const char*); inline int soap_read_ns__add(struct soap *soap, struct ns__add *p) { if (p) { ::soap_default_ns__add(soap, p); if (soap_begin_recv(soap) || ::soap_get_ns__add(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_ns__add(struct soap *soap, const char *URL, struct ns__add *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_ns__add(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_ns__add(struct soap *soap, struct ns__add *p) { if (::soap_read_ns__add(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #ifndef SOAP_TYPE_ns__addResponse_DEFINED #define SOAP_TYPE_ns__addResponse_DEFINED SOAP_FMAC3 void SOAP_FMAC4 soap_default_ns__addResponse(struct soap*, struct ns__addResponse *); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_ns__addResponse(struct soap*, const struct ns__addResponse *); SOAP_FMAC3 int SOAP_FMAC4 soap_out_ns__addResponse(struct soap*, const char*, int, const struct ns__addResponse *, const char*); SOAP_FMAC3 struct ns__addResponse * SOAP_FMAC4 soap_in_ns__addResponse(struct soap*, const char*, struct ns__addResponse *, const char*); SOAP_FMAC1 struct ns__addResponse * SOAP_FMAC2 soap_instantiate_ns__addResponse(struct soap*, int, const char*, const char*, size_t*); inline struct ns__addResponse * soap_new_ns__addResponse(struct soap *soap, int n = -1) { return soap_instantiate_ns__addResponse(soap, n, NULL, NULL, NULL); } inline struct ns__addResponse * soap_new_req_ns__addResponse( struct soap *soap) { struct ns__addResponse *_p = ::soap_new_ns__addResponse(soap); if (_p) { ::soap_default_ns__addResponse(soap, _p); } return _p; } inline struct ns__addResponse * soap_new_set_ns__addResponse( struct soap *soap, double *result) { struct ns__addResponse *_p = ::soap_new_ns__addResponse(soap); if (_p) { ::soap_default_ns__addResponse(soap, _p); _p->result = result; } return _p; } SOAP_FMAC3 int SOAP_FMAC4 soap_put_ns__addResponse(struct soap*, const struct ns__addResponse *, const char*, const char*); inline int soap_write_ns__addResponse(struct soap *soap, struct ns__addResponse const*p) { soap_free_temp(soap); if (soap_begin_send(soap) || (::soap_serialize_ns__addResponse(soap, p), 0) || ::soap_put_ns__addResponse(soap, p, "ns:addResponse", "") || soap_end_send(soap)) return soap->error; return SOAP_OK; } inline int soap_PUT_ns__addResponse(struct soap *soap, const char *URL, struct ns__addResponse const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__addResponse(soap, p), 0) || ::soap_put_ns__addResponse(soap, p, "ns:addResponse", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_ns__addResponse(struct soap *soap, const char *URL, struct ns__addResponse const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__addResponse(soap, p), 0) || ::soap_put_ns__addResponse(soap, p, "ns:addResponse", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_ns__addResponse(struct soap *soap, const char *URL, struct ns__addResponse const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || (::soap_serialize_ns__addResponse(soap, p), 0) || ::soap_put_ns__addResponse(soap, p, "ns:addResponse", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 struct ns__addResponse * SOAP_FMAC4 soap_get_ns__addResponse(struct soap*, struct ns__addResponse *, const char*, const char*); inline int soap_read_ns__addResponse(struct soap *soap, struct ns__addResponse *p) { if (p) { ::soap_default_ns__addResponse(soap, p); if (soap_begin_recv(soap) || ::soap_get_ns__addResponse(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_ns__addResponse(struct soap *soap, const char *URL, struct ns__addResponse *p) { if (soap_GET(soap, URL, NULL) || ::soap_read_ns__addResponse(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_ns__addResponse(struct soap *soap, struct ns__addResponse *p) { if (::soap_read_ns__addResponse(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_PointerToSOAP_ENV__Reason_DEFINED #define SOAP_TYPE_PointerToSOAP_ENV__Reason_DEFINED SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *const*); 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_in_PointerToSOAP_ENV__Reason(struct soap*, const char*, struct SOAP_ENV__Reason **, const char*); SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Reason(struct soap*, struct SOAP_ENV__Reason *const*, const char*, 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*); #endif #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_PointerToSOAP_ENV__Detail_DEFINED #define SOAP_TYPE_PointerToSOAP_ENV__Detail_DEFINED SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *const*); 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_in_PointerToSOAP_ENV__Detail(struct soap*, const char*, struct SOAP_ENV__Detail **, const char*); SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Detail(struct soap*, struct SOAP_ENV__Detail *const*, const char*, 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*); #endif #endif #ifndef WITH_NOGLOBAL #ifndef SOAP_TYPE_PointerToSOAP_ENV__Code_DEFINED #define SOAP_TYPE_PointerToSOAP_ENV__Code_DEFINED SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerToSOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *const*); 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_in_PointerToSOAP_ENV__Code(struct soap*, const char*, struct SOAP_ENV__Code **, const char*); SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerToSOAP_ENV__Code(struct soap*, struct SOAP_ENV__Code *const*, const char*, 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*); #endif #endif #ifndef SOAP_TYPE_PointerTodouble_DEFINED #define SOAP_TYPE_PointerTodouble_DEFINED SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTodouble(struct soap*, double *const*); SOAP_FMAC3 int SOAP_FMAC4 soap_out_PointerTodouble(struct soap*, const char *, int, double *const*, const char *); SOAP_FMAC3 double ** SOAP_FMAC4 soap_in_PointerTodouble(struct soap*, const char*, double **, const char*); SOAP_FMAC3 int SOAP_FMAC4 soap_put_PointerTodouble(struct soap*, double *const*, const char*, const char*); SOAP_FMAC3 double ** SOAP_FMAC4 soap_get_PointerTodouble(struct soap*, double **, const char*, const char*); #endif #ifndef SOAP_TYPE__QName_DEFINED #define SOAP_TYPE__QName_DEFINED inline void soap_default__QName(struct soap *soap, char **a) { (void)soap; /* appease -Wall -Werror */ #ifdef SOAP_DEFAULT__QName *a = SOAP_DEFAULT__QName; #else *a = (char *)0; #endif } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize__QName(struct soap*, char *const*); #define soap__QName2s(soap, a) soap_QName2s(soap, (a)) SOAP_FMAC3 int SOAP_FMAC4 soap_out__QName(struct soap*, const char*, int, char*const*, const char*); #define soap_s2_QName(soap, s, a) soap_s2QName((soap), (s), (char**)(a), 0, -1, NULL) SOAP_FMAC3 char * * SOAP_FMAC4 soap_in__QName(struct soap*, const char*, char **, const char*); #define soap_instantiate__QName soap_instantiate_string #define soap_new__QName soap_new_string SOAP_FMAC3 int SOAP_FMAC4 soap_put__QName(struct soap*, char *const*, const char*, const char*); inline int soap_write__QName(struct soap *soap, char *const*p) { soap_free_temp(soap); if (p) { if (soap_begin_send(soap) || ::soap_put__QName(soap, p, "QName", "") || soap_end_send(soap)) return soap->error; } return SOAP_OK; } inline int soap_PUT__QName(struct soap *soap, const char *URL, char *const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put__QName(soap, p, "QName", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH__QName(struct soap *soap, const char *URL, char *const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put__QName(soap, p, "QName", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send__QName(struct soap *soap, const char *URL, char *const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put__QName(soap, p, "QName", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 char ** SOAP_FMAC4 soap_get__QName(struct soap*, char **, const char*, const char*); inline int soap_read__QName(struct soap *soap, char **p) { if (p) { if (soap_begin_recv(soap) || ::soap_get__QName(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET__QName(struct soap *soap, const char *URL, char **p) { if (soap_GET(soap, URL, NULL) || ::soap_read__QName(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv__QName(struct soap *soap, char **p) { if (::soap_read__QName(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #ifndef SOAP_TYPE__XML_DEFINED #define SOAP_TYPE__XML_DEFINED #endif #ifndef SOAP_TYPE_string_DEFINED #define SOAP_TYPE_string_DEFINED inline void 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*, char *const*); #define soap_string2s(soap, a) (a) SOAP_FMAC3 int SOAP_FMAC4 soap_out_string(struct soap*, const char*, int, char*const*, const char*); #define soap_s2string(soap, s, a) soap_s2char((soap), (s), (char**)(a), 1, 0, -1, NULL) SOAP_FMAC3 char * * SOAP_FMAC4 soap_in_string(struct soap*, const char*, char **, const char*); SOAP_FMAC3 char * * SOAP_FMAC4 soap_new_string(struct soap *soap, int n = -1); SOAP_FMAC3 int SOAP_FMAC4 soap_put_string(struct soap*, char *const*, const char*, const char*); inline int soap_write_string(struct soap *soap, char *const*p) { soap_free_temp(soap); if (p) { if (soap_begin_send(soap) || ::soap_put_string(soap, p, "string", "") || soap_end_send(soap)) return soap->error; } return SOAP_OK; } inline int soap_PUT_string(struct soap *soap, const char *URL, char *const*p) { soap_free_temp(soap); if (soap_PUT(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put_string(soap, p, "string", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_PATCH_string(struct soap *soap, const char *URL, char *const*p) { soap_free_temp(soap); if (soap_PATCH(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put_string(soap, p, "string", "") || soap_end_send(soap) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } inline int soap_POST_send_string(struct soap *soap, const char *URL, char *const*p) { soap_free_temp(soap); if (soap_POST(soap, URL, NULL, "text/xml; charset=utf-8") || ::soap_put_string(soap, p, "string", "") || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } SOAP_FMAC3 char ** SOAP_FMAC4 soap_get_string(struct soap*, char **, const char*, const char*); inline int soap_read_string(struct soap *soap, char **p) { if (p) { if (soap_begin_recv(soap) || ::soap_get_string(soap, p, NULL, NULL) == NULL || soap_end_recv(soap)) return soap->error; } return SOAP_OK; } inline int soap_GET_string(struct soap *soap, const char *URL, char **p) { if (soap_GET(soap, URL, NULL) || ::soap_read_string(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } inline int soap_POST_recv_string(struct soap *soap, char **p) { if (::soap_read_string(soap, p)) return soap_closesock(soap); return soap_closesock(soap); } #endif #endif /* End of soapH.h */ gsoap-2.8.91/gsoap/samples/chaining/0000755000175000017500000000000013525245176016633 5ustar ellertellertgsoap-2.8.91/gsoap/samples/chaining/.deps/0000755000175000017500000000000013525245176017644 5ustar ellertellertgsoap-2.8.91/gsoap/samples/chaining/.deps/quoteServerLib.Po0000644000175000017500000000001013525245162023101 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/samples/chaining/.deps/calcServerLib.Po0000644000175000017500000000001013525245162022646 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/samples/chaining/quote.h0000644000175000017500000000046713525245162020143 0ustar ellertellert//gsoap ns service name: quote //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: urn:xmethods-delayed-quotes //gsoap ns service location: http://64.124.140.30:9090/soap //gsoap ns service method-action: getQuote "" int ns__getQuote(char *symbol, float *Result); gsoap-2.8.91/gsoap/samples/chaining/Makefile.in0000644000175000017500000004660413525245176020712 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = chaining$(EXEEXT) subdir = gsoap/samples/chaining ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_chaining_OBJECTS = chaining.$(OBJEXT) qServerLib.$(OBJEXT) \ cServerLib.$(OBJEXT) envC.$(OBJEXT) chaining_OBJECTS = $(am_chaining_OBJECTS) am__DEPENDENCIES_1 = chaining_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/cServerLib.Po \ ./$(DEPDIR)/chaining.Po ./$(DEPDIR)/envC.Po \ ./$(DEPDIR)/qServerLib.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(chaining_SOURCES) DIST_SOURCES = $(chaining_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a BUILT_SOURCES = qServerLib.c cServerLib.c envC.c CLEANFILES = *.req.xml *.res.xml *.nsmap *.xsd *.wsdl envStub.h envH.h envC.c cStub.h cH.h cC.c cClient.c cServer.c cClientLib.c cServerLib.c qStub.h qH.h qC.c qClient.c qServer.c qClientLib.c qServerLib.c *~ SOAP_NS = c.nsmap chaining_SOURCES = chaining.c quote.h calc.h env.h qServerLib.c cServerLib.c envC.c chaining_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lm all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/chaining/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/chaining/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) chaining$(EXEEXT): $(chaining_OBJECTS) $(chaining_DEPENDENCIES) $(EXTRA_chaining_DEPENDENCIES) @rm -f chaining$(EXEEXT) $(AM_V_CCLD)$(LINK) $(chaining_OBJECTS) $(chaining_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cServerLib.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chaining.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/envC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qServerLib.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/cServerLib.Po -rm -f ./$(DEPDIR)/chaining.Po -rm -f ./$(DEPDIR)/envC.Po -rm -f ./$(DEPDIR)/qServerLib.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/cServerLib.Po -rm -f ./$(DEPDIR)/chaining.Po -rm -f ./$(DEPDIR)/envC.Po -rm -f ./$(DEPDIR)/qServerLib.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # include ../Makefile.c_rules envC.c: env.h $(SOAP) -c -CS -penv -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< qServerLib.c: quote.h $(SOAP) -c -S -np q -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< cServerLib.c: calc.h $(SOAP) -c -S -np c -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/chaining/chaining.c0000644000175000017500000000620613525245162020556 0ustar ellertellert/* chaining.c Example chaining of C services into one service application, To generate non-client-server header and fault handlers: $ soapcpp2 -c -CS -penv env.h The quote service: $ soapcpp2 -c -S -np q quote.h The calc service: $ soapcpp2 -c -S -np c calc.h cc -o chaining.cgi chaining.c stdsoap2.c envC.c qServiceLib.c cServiceLib.c -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2011, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /* prevent duplicate declarations for global SOAP Header and Fault */ #define WITH_NOGLOBAL #include "envH.h" /* include only if this file is needed */ #include "cH.h" #include "qH.h" #include "q.nsmap" #include "c.nsmap" /* A dummy global table, to keep the linker happy */ struct Namespace namespaces[] = { {NULL} }; int main() { struct soap *soap = soap_new(); soap_set_namespaces(soap, q_namespaces); /* serve over stdin/out, CGI style, see the user manual for a port-based version */ if (soap_begin_serve(soap)) soap_print_fault(soap, stderr); else if (q_serve_request(soap) == SOAP_NO_METHOD) { soap_set_namespaces(soap, c_namespaces); if (c_serve_request(soap)) soap_send_fault(soap); } else if (soap->error) soap_send_fault(soap); soap_destroy(soap); soap_end(soap); soap_free(soap); return 0; } int ns__getQuote(struct soap *soap, char *s, float *r) { *r = 123; /* a dummy service, stocks don't move */ return SOAP_OK; } int ns__add(struct soap *soap, double a, double b, double *r) { *r = a + b; return SOAP_OK; } int ns__sub(struct soap *soap, double a, double b, double *r) { *r = a - b; return SOAP_OK; } int ns__mul(struct soap *soap, double a, double b, double *r) { *r = a * b; return SOAP_OK; } int ns__div(struct soap *soap, double a, double b, double *r) { *r = a / b; return SOAP_OK; } int ns__pow(struct soap *soap, double a, double b, double *r) { *r = pow(a, b); return SOAP_OK; } gsoap-2.8.91/gsoap/samples/chaining/env.h0000644000175000017500000000213413525245162017567 0ustar ellertellert/* env.h Defines SOAP-ENV Header and Fault global structures shared by client and service modules to process SOAP headers and faults when combining multiple client and/or services into one executable. Defines SOAP Fault and SOAP Header structures, which will be shared by client and service modules. The Header structure should contain all fields required by the clients and services. To obtain these, look into the wsdl2h-generated .h files for struct SOAP_ENV__Header and struct SOAP_ENV__Detail. Copy these below to make them globally visible to the gSOAP engine and plugins. Copyright (C) 2000-2016 Robert A. van Engelen, Genivia inc. All Rights Reserved. Compile in C: soapcpp2 -c -penv env.h then compile and link envC.c with your project Compile in C++ with C++ namespaces: soapcpp2 -qenv env.h then compile and link envC.cpp with your project When including envH.h in your project, include envH.h as the last: #include "abcH.h" #include "xyzH.h" #include "envH.h" */ #import "header.h" // optional user-defined headers #import "fault.h" // optional user-defined fault details gsoap-2.8.91/gsoap/samples/chaining/README.txt0000644000175000017500000000246713525245162020335 0ustar ellertellert How to combine multiple C services into one server executable and let the services listen to the same port (or serve over CGI)? Run wsdl2h on each WSDL, with "wsdl2h -c name.wsdl" to produce name.h Run "soapcpp2 -c -S -np name name.h" to produce nameServerLib.c Run "soapcpp2 -c -CS -penv env.h" on an empty env.h (or an env.h with shared SOAP Header and SOAP Fault definitions) to produce envC.c for Header and Fault processing. Say we have name1 and name2 services, each with different methods ns1__method1 and ns2__method2. Implement service chaining as follows: #include "name1.nsmap" #include "name2.nsmap" int main() { struct soap *soap = soap_new(); soap_set_namespaces(soap, name1_namespaces); /* serve over stdin/out, CGI style */ if (soap_begin_serve(soap)) soap_print_fault(soap, stderr); else if (name1_serve_request(soap) == SOAP_NO_METHOD) { soap_set_namespaces(soap, name2_namespaces); if (name2_serve_request(soap)) soap_print_fault(soap, stderr); } soap_destroy(soap); soap_end(soap); soap_free(soap); return 0; } int ns1__method1(struct soap *soap, ...) { ... return SOAP_OK; } int ns2__method2(struct soap *soap, ...) { ... return SOAP_OK; } gsoap-2.8.91/gsoap/samples/chaining/header.h0000644000175000017500000000120413525245162020224 0ustar ellertellert/* header.h Example SOAP Header definitions, to demonstrate the use of env.h. This file defines the SOAP Header data structure shared by client and service modules Copyright (C) 2000-2002 Robert A. van Engelen. All Rights Reserved. */ //gsoap h schema namespace: http://websrv.cs.fsu.edu/~engelen/h.xsd // h:authentication type of SOAP Header element struct h__authentication { @char *userid; // userid XML attribute @char *passwd; // passwd XML attribute }; // add the above to the SOAP Header elements: struct SOAP_ENV__Header { struct h__authentication *h__credentials; // rendered as XML }; gsoap-2.8.91/gsoap/samples/chaining/calc.h0000644000175000017500000001054613525245162017707 0ustar ellertellert/* calc.h This is a gSOAP header file with a calculator data binding and Web service interface to implement clients and services The service operations and type definitions use familiar C/C++ syntax. The following methods are defined by this gSOAP service definition: add(a,b) sub(a,b) mul(a,b) div(a,b) pow(a,b) Build steps for C (see samples/calc): $ soapcpp2 -c -r calc.h $ cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c $ cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c Build steps for C++ (see samples/calc++): $ soapcpp2 -j -r calc.h $ c++ -o calcclient++ calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp $ c++ -o calcserver++ calcserver.cpp stdsoap2.cpp soapC.cpp soapcalcService.cpp Option -r generates a soapReadme.md report. Note that soapcpp2 option -j generates proxy and service classes, which encapsulate the method operations in the class instead of defining them as global functions as in C. The //gsoap directives are used to bind XML namespaces and to define Web service properties: //gsoap service name: //gsoap service style: [rpc|document] //gsoap service encoding: [literal|encoded] //gsoap service namespace: //gsoap service location: Web service operation properties: //gsoap service method-style: [rpc|document] //gsoap service method-encoding: [literal|encoded] //gsoap service method-action: //gsoap service method-documentation: and type schema properties: //gsoap schema namespace: //gsoap schema elementForm: [qualified|unqualified] //gsoap schema attributeForm: [qualified|unqualified] //gsoap schema documentation: //gsoap schema type-documentation: where is an XML namespace prefix, which is used in C/C++ operation names, e.g. ns__add(), and type names, e.g. xsd__int. See the documentation for the full list of //gsoap directives. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: calc Simple calculator service described at https://www.genivia.com/dev.html //gsoap ns service protocol: SOAP //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns schema namespace: urn:calc //gsoap ns service method: add Sums two values int ns__add(double a, double b, double *result); //gsoap ns service method: sub Subtracts two values int ns__sub(double a, double b, double *result); //gsoap ns service method: mul Multiplies two values int ns__mul(double a, double b, double *result); //gsoap ns service method: div Divides two values int ns__div(double a, double b, double *result); //gsoap ns service method: pow Raises a to b int ns__pow(double a, double b, double *result); gsoap-2.8.91/gsoap/samples/chaining/Makefile.am0000644000175000017500000000205413525245162020663 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = chaining include ../Makefile.defines # include ../Makefile.c_rules envC.c: env.h $(SOAP) -c -CS -penv -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< qServerLib.c: quote.h $(SOAP) -c -S -np q -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< cServerLib.c: calc.h $(SOAP) -c -S -np c -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< BUILT_SOURCES = qServerLib.c cServerLib.c envC.c CLEANFILES = *.req.xml *.res.xml *.nsmap *.xsd *.wsdl envStub.h envH.h envC.c cStub.h cH.h cC.c cClient.c cServer.c cClientLib.c cServerLib.c qStub.h qH.h qC.c qClient.c qServer.c qClientLib.c qServerLib.c *~ SOAP_NS = c.nsmap chaining_SOURCES = chaining.c quote.h calc.h env.h qServerLib.c cServerLib.c envC.c chaining_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lm gsoap-2.8.91/gsoap/samples/chaining/fault.h0000644000175000017500000000234613525245162020117 0ustar ellertellert/* fault.h Example SOAP Fault detail definitions, to demonstrate the use of env.h. Defines optional SOAP Fault derail data structures Copyright (C) 2000-2004 Robert A. van Engelen. All Rights Reserved. */ /* Add any data structure you want to serialize as part of the SOAP Fault detail element. The detail element '__type' and 'value' fields should be set to transmit data. The fields are set when data of corresponding types are received. For example, we define an of name with a string vector (note the leading _ in the following declaration): class _f__myData { public: std::vector *data; }; To return a fault from your service application: soap_sender_fault(soap, "An error occurred", NULL)); // set soap fault soap->fault->detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail)); soap->fault->detail->__type = SOAP_TYPE__f__myData; soap->fault->detail->value = soap_new__f__myData(soap, -1); return SOAP_FAULT; In addition, you can modify the SOAP_ENV__Detail struct and add your own set of fields, as in: struct SOAP_ENV__Detail { struct f__myDataType f__myData; int __type; void *value; char *__any; // or use '_XML __any' to store literal XML content }; */ gsoap-2.8.91/gsoap/samples/curl/0000755000175000017500000000000013525245162016013 5ustar ellertellertgsoap-2.8.91/gsoap/samples/curl/curlrest.c0000644000175000017500000000774013525245162020032 0ustar ellertellert/* curlrest.c Example CURL-based HTTP REST client in C This example shows an XML REST PUT, GET, POST, DELETE client Uses the custom/struct_tm_date.c xsd:date serializer To run the client, first build and start the gSOAP webserver on port 8080 and make sure person.xml (in samples/webserver) is in the webserver's folder for the GET and POST operations to work. See samples/webserver. Compilation: $ soapcpp2 -c -0 person.h $ cc -Iplugin -Icustom -I. -o curlrest curlrest.c stdsoap2.c soapC.c custom/struct_tm_date.c plugin/curlapi.c -lcurl where stdsoap2.c is in the 'gsoap' directory, or use libgsoap: $ cc -Iplugin -Icustom -I. -o curlrest curlrest.c soapC.c custom/struct_tm_date.c plugin/curlapi.c -lcurl -lgsoap -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2017, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "soap.nsmap" #include "curlapi.h" int main(int argc, char **argv) { struct soap *ctx = soap_new1(SOAP_XML_INDENT | SOAP_XML_STRICT); CURL *curl; struct Person p; /* should init curl once - this call is not thread safe */ curl_global_init(CURL_GLOBAL_ALL); /* create curl handle and set options */ curl = curl_easy_init(); /* optionally use chunking (SOAP_IO_CHUNK) and compression (SOAP_ENC_ZLIB) though this will write_Person chunked and compressed too, so not enabled here */ /* soap_set_mode(ctx, SOAP_IO_CHUNK); */ /* register the soap_curl plugin */ soap_register_plugin_arg(ctx, soap_curl, curl); /* or you can simply call w/o setting up a curl handle (the plugin uses a temporary handle): soap_register_plugin(ctx, soap_curl); */ /* set timeouts, also used by the plugin */ ctx->connect_timeout = 60; ctx->send_timeout = 10; ctx->recv_timeout = 10; soap_set_version(ctx, 0); p.name = "John Doe"; p.dob.tm_year = 66; // 1966 (year since 1900) p.dob.tm_mon = 0; // month 0..11 p.dob.tm_mday = 31 ; p.gender = MALE; printf("\nPUT\n"); if (soap_PUT_Person(ctx, "http://localhost:8080/person.xml", &p)) soap_print_fault(ctx, stderr); printf("\nGET\n"); if (soap_GET_Person(ctx, "http://localhost:8080/person.xml", &p)) soap_print_fault(ctx, stderr); else soap_write_Person(ctx, &p); // default stdout printf("\nPOST\n"); if (soap_POST_send_Person(ctx, "http://localhost:8080/person.xml", &p) || soap_POST_recv_Person(ctx, &p)) soap_print_fault(ctx, stderr); else soap_write_Person(ctx, &p); // default stdout printf("\nDELETE\n"); if (soap_DELETE(ctx, "http://localhost:8080/person.xml")) soap_print_fault(ctx, stderr); soap_destroy(ctx); soap_end(ctx); soap_free(ctx); /* cleanup handle */ curl_easy_cleanup(curl); /* we're done so clean up curl */ curl_global_cleanup(); return 0; } gsoap-2.8.91/gsoap/samples/curl/Makefile0000644000175000017500000000304513525245162017455 0ustar ellertellertGSOAP=../../src/soapcpp2 SOAPH=../../stdsoap2.h SOAPC=../../stdsoap2.c SOAPCPP=../../stdsoap2.cpp CURLAPI=../../plugin/curlapi.c CUSTOMDATE=../../custom/struct_tm_date.c XMLRPC=../xml-rpc-json/xml-rpc.c JSONC=../xml-rpc-json/json.c CC=gcc CPP=g++ LIBS=-lcurl -lcrypto -lssl COFLAGS=-O2 CWFLAGS=-Wall -Wno-deprecated-declarations CIFLAGS=-I. -I../.. -I../../plugin -I../xml-rpc CMFLAGS=-DWITH_OPENSSL CFLAGS= $(CWFLAGS) $(COFLAGS) $(CIFLAGS) $(CMFLAGS) all: curlclient curlclient++ curlrest curl-json-currentTime curlclient: calc.h curlclient.c $(GSOAP) -c -CL calc.h $(CC) $(CFLAGS) -o curlclient curlclient.c soapC.c soapClient.c $(CURLAPI) $(SOAPC) $(LIBS) curlclient++: calc.h curlclient.cpp $(GSOAP) -j -C calc.h $(CPP) $(CFLAGS) -o curlclient++ curlclient.cpp soapC.cpp soapcalcProxy.cpp $(CURLAPI) $(SOAPCPP) $(LIBS) curlrest: calc.h curlrest.c $(GSOAP) -I../.. -c -CSL -0 person.h $(CC) $(CFLAGS) -o curlrest curlrest.c soapC.c $(CUSTOMDATE) $(CURLAPI) $(SOAPC) $(LIBS) curl-json-currentTime: curl-json-currentTime.c $(GSOAP) -c -CSL ../xml-rpc-json/xml-rpc.h $(CC) $(CFLAGS) -o curl-json-currentTime curl-json-currentTime.c soapC.c $(XMLRPC) $(JSONC) $(CURLAPI) $(SOAPC) $(LIBS) .PHONY: clean distclean clean: rm -f *.o soapH.h soapStub.h soapC.c soapC.cpp soapClient.c soapClient.cpp soapcalcProxy.h soapcalcProxy.cpp distclean: rm -f *.o soapH.h soapStub.h soapC.c soapC.cpp soapClient.c soapClient.cpp soapcalcProxy.h soapcalcProxy.cpp rm -f *.wsdl *.xsd *.xml *.nsmap *.log rm -f curlclient curlclient++ curlrest curl-json-currentTime gsoap-2.8.91/gsoap/samples/curl/curl-json-currentTime.c0000644000175000017500000000561413525245162022400 0ustar ellertellert/* json-currentTime.c JSON currenTime with the CURL plugin for gSOAP Prints current time. Requires the following files from samples/xml-rpc-json: xml-rpc.h xml-rpc.c json.h json.c Compile: soapcpp2 -c -CSL xml-rpc.h cc curl-json-currentTime.c xml-rpc.c json.c stdsoap2.c soapC.c plugin/curlapi.c -lcurl -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2017, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "json.h" #include "curlapi.h" int main() { struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); struct value *request = new_value(ctx); struct value response; curl_global_init(CURL_GLOBAL_ALL); soap_register_plugin(ctx, soap_curl); ctx->connect_timeout = 60; /* 60 sec, stop if server is not connecting */ ctx->send_timeout = 10; /* 10 sec, stop if server is not accepting msg */ ctx->recv_timeout = 10; /* 10 sec, stop if server does not respond in time */ /* make the JSON REST POST request and get response */ *string_of(request) = "getCurrentTime"; if (json_call(ctx, "http://www.cs.fsu.edu/~engelen/currentTimeJSON.cgi", request, &response)) { soap_curl_reset(ctx); soap_print_fault(ctx, stderr); } else if (is_string(&response)) /* JSON does not support a dateTime value: this is a string */ { printf("Time = %s\n", *string_of(&response)); } else /* error? */ { printf("Error: "); json_write(ctx, &response); } /* clean up */ soap_destroy(ctx); soap_end(ctx); soap_free(ctx); curl_global_cleanup(); return 0; } /* Don't need a namespace table. We put an empty one here to avoid link errors */ struct Namespace namespaces[] = { {NULL, NULL} }; gsoap-2.8.91/gsoap/samples/curl/curlclient.c0000644000175000017500000000714113525245162020326 0ustar ellertellert/* curlclient.c Example CURL-based calculator service client in C Compilation: $ soapcpp2 -c calc.h $ cc -Iplugin -I. -o curlclient curlclient.c stdsoap2.c soapC.c soapClient.c plugin/curlapi.c -lcurl where stdsoap2.c is in the 'gsoap' directory, or use libgsoap: $ cc -Iplugin -I. -o curlclient curlclient.c soapC.c soapClient.c plugin/curlapi.c -lcurl -lgsoap -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2017, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "calc.nsmap" #include "curlapi.h" const char server[] = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; /* = "http://localhost:8080"; to test against samples/webserver */ int main(int argc, char **argv) { struct soap soap; CURL *curl; double a, b, result; if (argc < 4) { fprintf(stderr, "Usage: [add|sub|mul|div|pow] num num\n"); exit(0); } /* should init curl once - this call is not thread safe */ curl_global_init(CURL_GLOBAL_ALL); /* create curl handle and set options */ curl = curl_easy_init(); /* init soap context (with mode parameter) */ soap_init1(&soap, SOAP_IO_CHUNK | SOAP_XML_INDENT); /* register the soap_curl plugin */ soap_register_plugin_arg(&soap, soap_curl, curl); /* or you can simply call w/o setting up a curl handle (the plugin uses a temporary handle): soap_register_plugin(&soap, soap_curl); */ /* set timeouts, also used by the plugin */ soap.connect_timeout = 60; soap.send_timeout = 10; soap.recv_timeout = 10; a = strtod(argv[2], NULL); b = strtod(argv[3], NULL); switch (*argv[1]) { case 'a': soap_call_ns__add(&soap, server, "", a, b, &result); break; case 's': soap_call_ns__sub(&soap, server, "", a, b, &result); break; case 'm': soap_call_ns__mul(&soap, server, "", a, b, &result); break; case 'd': soap_call_ns__div(&soap, server, "", a, b, &result); break; case 'p': soap_call_ns__pow(&soap, server, "", a, b, &result); break; default: fprintf(stderr, "Unknown command\n"); exit(0); } if (soap.error) { soap_curl_reset(&soap); soap_print_fault(&soap, stderr); } else printf("result = %g\n", result); soap_destroy(&soap); soap_end(&soap); soap_done(&soap); /* cleanup handle */ curl_easy_cleanup(curl); /* we're done so clean up curl */ curl_global_cleanup(); return 0; } gsoap-2.8.91/gsoap/samples/curl/README.txt0000644000175000017500000000542413525245162017516 0ustar ellertellertThis directory contains example client applications with CURL. The CURL plugin for gSOAP provides the bridge to libcurl. While gSOAP provides a full HTTP stack, libcurl can be used to support additional protocols and features. To use the CURL plugin with a C gSOAP client application generated with soapcpp2 with option -c, do the following: #include "soapH.h" #include "ns.nsmap" #include "plugin/curlapi.h" const char server[] = "server endpoint URL"; int main(int argc, char **argv) { struct soap *soap = soap_new1(SOAP_IO_CHUNK | SOAP_XML_INDENT); /* CURL global init */ curl_global_init(CURL_GLOBAL_ALL); /* create CURL handle */ curl = curl_easy_init(); /* set options */ curl_easy_setopt(data->curl, CURLOPT_CONNECTTIMEOUT, 60L); curl_easy_setopt(data->curl, CURLOPT_TIMEOUT, 10L); /* register plugin with CURL handle */ soap_register_plugin_arg(soap, soap_curl, curl); /* make calls */ if (soap_call_ns__some_method(soap, server, ...)) { soap_print_fault(soap, stderr); /* reset after errors, to ensure gSOAP IO works */ soap_curl_reset(soap); } else { printf("OK!\n"); } /* clean up gSOAP */ soap_destroy(soap); soap_end(soap); soap_free(soap); /* clean up CURL handle after deleting the soap context */ curl_easy_cleanup(curl); /* CURL global cleanup */ curl_global_cleanup(); return 0; } To use the CURL plugin with a C++ gSOAP client application that uses a proxy class generated with soapcpp2 with option -j, do the following: #include "soapProxy.h" #include "ns.nsmap" #include "plugin/curlapi.h" const char server[] = "server endpoint URL"; int main(int argc, char **argv) { Proxy proxy(server, SOAP_IO_CHUNK | SOAP_XML_INDENT); /* CURL global init */ curl_global_init(CURL_GLOBAL_ALL); /* create CURL handle */ curl = curl_easy_init(); /* set options */ curl_easy_setopt(data->curl, CURLOPT_CONNECTTIMEOUT, 60L); curl_easy_setopt(data->curl, CURLOPT_TIMEOUT, 10L); /* register plugin with CURL handle */ soap_register_plugin_arg(proxy.soap, soap_curl, curl); /* make calls */ if (proxy.call(...)) { proxy.soap_stream_fault(std:err); /* reset after errors, to ensure gSOAP IO works */ soap_curl_reset(proxy.soap); } else { printf("OK!\n"); } /* clean up gSOAP */ proxy.destroy(); /* clean up CURL handle after deleting the soap context */ curl_easy_cleanup(curl); /* CURL global cleanup */ curl_global_cleanup(); return 0; } For more information about the CURL plugin, see gsoap/doc/curl/html/index.html gsoap-2.8.91/gsoap/samples/curl/person.h0000644000175000017500000000020113525245162017463 0ustar ellertellert#import "custom/struct_tm_date.h" struct Person { const char *name; xsd__date dob; enum Gender { MALE, FEMALE } gender; }; gsoap-2.8.91/gsoap/samples/curl/calc.h0000644000175000017500000001054613525245162017074 0ustar ellertellert/* calc.h This is a gSOAP header file with a calculator data binding and Web service interface to implement clients and services The service operations and type definitions use familiar C/C++ syntax. The following methods are defined by this gSOAP service definition: add(a,b) sub(a,b) mul(a,b) div(a,b) pow(a,b) Build steps for C (see samples/calc): $ soapcpp2 -c -r calc.h $ cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c $ cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c Build steps for C++ (see samples/calc++): $ soapcpp2 -j -r calc.h $ c++ -o calcclient++ calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp $ c++ -o calcserver++ calcserver.cpp stdsoap2.cpp soapC.cpp soapcalcService.cpp Option -r generates a soapReadme.md report. Note that soapcpp2 option -j generates proxy and service classes, which encapsulate the method operations in the class instead of defining them as global functions as in C. The //gsoap directives are used to bind XML namespaces and to define Web service properties: //gsoap service name: //gsoap service style: [rpc|document] //gsoap service encoding: [literal|encoded] //gsoap service namespace: //gsoap service location: Web service operation properties: //gsoap service method-style: [rpc|document] //gsoap service method-encoding: [literal|encoded] //gsoap service method-action: //gsoap service method-documentation: and type schema properties: //gsoap schema namespace: //gsoap schema elementForm: [qualified|unqualified] //gsoap schema attributeForm: [qualified|unqualified] //gsoap schema documentation: //gsoap schema type-documentation: where is an XML namespace prefix, which is used in C/C++ operation names, e.g. ns__add(), and type names, e.g. xsd__int. See the documentation for the full list of //gsoap directives. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: calc Simple calculator service described at https://www.genivia.com/dev.html //gsoap ns service protocol: SOAP //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns schema namespace: urn:calc //gsoap ns service method: add Sums two values int ns__add(double a, double b, double *result); //gsoap ns service method: sub Subtracts two values int ns__sub(double a, double b, double *result); //gsoap ns service method: mul Multiplies two values int ns__mul(double a, double b, double *result); //gsoap ns service method: div Divides two values int ns__div(double a, double b, double *result); //gsoap ns service method: pow Raises a to b int ns__pow(double a, double b, double *result); gsoap-2.8.91/gsoap/samples/curl/curlclient.cpp0000644000175000017500000000737213525245162020674 0ustar ellertellert/* curlclient.cpp Example CURL-based calculator service client in C++ Service definitions in calc.h (not generated by wsdl2h, but similar) $ soapcpp2 -j calc.h $ c++ -Iplugin -I. -o curlclient curlclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp plugin/curlapi.c -lcurl where stdsoap2.cpp is in the 'gsoap' directory, or use libgsoap++: $ c++ -Iplugin -I. -o curlclient curlclient.cpp soapC.cpp soapcalcProxy.cpp plugin/curlapi.c -lcurl -lgsoap++ -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2017, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapcalcProxy.h" #include "calc.nsmap" #include "curlapi.h" const char server[] = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; int main(int argc, char **argv) { if (argc < 4) { fprintf(stderr, "Usage: [add|sub|mul|div|pow] num num\n"); exit(0); } /* should init curl once - this call is not thread safe */ curl_global_init(CURL_GLOBAL_ALL); /* create curl handle and set options */ CURL *curl = curl_easy_init(); /* init soap context (with mode parameter) */ calcProxy calc(SOAP_IO_CHUNK | SOAP_XML_INDENT); /* set endpoint URL */ calc.soap_endpoint = server; /* or you can set the CURL endpoint: calc.soap_endpoint = ""; curl_easy_setopt(curl, CURLOPT_URL, server); */ /* register the soap_curl plugin (-j option used, with -i option use &calc below) */ soap_register_plugin_arg(calc.soap, soap_curl, curl); /* or you can simply call w/o setting up a curl handle (the plugin uses a temporary handle): soap_register_plugin(&calc, soap_curl); */ /* set timeouts, also used by the plugin */ calc.soap->connect_timeout = 60; calc.soap->send_timeout = 10; calc.soap->recv_timeout = 10; double a, b, result; a = strtod(argv[2], NULL); b = strtod(argv[3], NULL); int res = SOAP_OK; switch (*argv[1]) { case 'a': res = calc.add(a, b, &result); break; case 's': res = calc.sub(a, b, &result); break; case 'm': res = calc.mul(a, b, &result); break; case 'd': res = calc.div(a, b, &result); break; case 'p': res = calc.pow(a, b, &result); break; default: fprintf(stderr, "Unknown command\n"); exit(0); } if (res != SOAP_OK) { soap_curl_reset(calc.soap); calc.soap_stream_fault(std::cerr); } else printf("result = %g\n", result); calc.destroy(); /* clean up mem */ /* cleanup handle */ curl_easy_cleanup(curl); /* we're done so clean up curl */ curl_global_cleanup(); return 0; } gsoap-2.8.91/gsoap/samples/Makefile.cpp_rules0000644000175000017500000000110213525245163020474 0ustar ellertellert## common Makefile rules for building the C++ - soap samples ## SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ gsoap-2.8.91/gsoap/samples/calc/0000755000175000017500000000000013525245167015755 5ustar ellertellertgsoap-2.8.91/gsoap/samples/calc/.deps/0000755000175000017500000000000013525245167016766 5ustar ellertellertgsoap-2.8.91/gsoap/samples/calc/Makefile.in0000644000175000017500000005031713525245167020030 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = calcclient$(EXEEXT) calcserver$(EXEEXT) subdir = gsoap/samples/calc ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am_calcclient_OBJECTS = calcclient.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) calcclient_OBJECTS = $(am_calcclient_OBJECTS) am__DEPENDENCIES_1 = calcclient_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) am__objects_4 = soapServer.$(OBJEXT) $(am__objects_2) am_calcserver_OBJECTS = calcserver.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) calcserver_OBJECTS = $(am_calcserver_OBJECTS) calcserver_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/calcclient.Po \ ./$(DEPDIR)/calcserver.Po ./$(DEPDIR)/soapC.Po \ ./$(DEPDIR)/soapClient.Po ./$(DEPDIR)/soapServer.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(calcclient_SOURCES) $(calcserver_SOURCES) DIST_SOURCES = $(calcclient_SOURCES) $(calcserver_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.c_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = calc.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = calc.nsmap calc.wsdl calcclient_SOURCES = calcclient.c $(SOAPHEADER) $(SOAP_C_CLIENT) calcclient_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) calcserver_SOURCES = calcserver.c $(SOAPHEADER) $(SOAP_C_SERVER) calcserver_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lm all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/calc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/calc/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) calcclient$(EXEEXT): $(calcclient_OBJECTS) $(calcclient_DEPENDENCIES) $(EXTRA_calcclient_DEPENDENCIES) @rm -f calcclient$(EXEEXT) $(AM_V_CCLD)$(LINK) $(calcclient_OBJECTS) $(calcclient_LDADD) $(LIBS) calcserver$(EXEEXT): $(calcserver_OBJECTS) $(calcserver_DEPENDENCIES) $(EXTRA_calcserver_DEPENDENCIES) @rm -f calcserver$(EXEEXT) $(AM_V_CCLD)$(LINK) $(calcserver_OBJECTS) $(calcserver_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/calcclient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/calcserver.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/calcclient.Po -rm -f ./$(DEPDIR)/calcserver.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/calcclient.Po -rm -f ./$(DEPDIR)/calcserver.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/calc/calcserver.c0000644000175000017500000000704013525245162020246 0ustar ellertellert/* calcserver.c Example calculator service in C Compilation in C (see samples/calc/calc.h): $ soapcpp2 -c calc.h $ cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c where stdsoap2.c is in the 'gsoap' directory, or use libgsoap: $ cc -o calcserver calcserver.c soapC.c soapServer.c -lgsoap -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "calc.nsmap" int main(int argc, char **argv) { SOAP_SOCKET m, s; /* sockets */ struct soap soap; soap_init(&soap); if (argc < 2) soap_serve(&soap); /* serve as CGI application */ else { m = soap_bind(&soap, NULL, atoi(argv[1]), 1); if (!soap_valid_socket(m)) { soap_print_fault(&soap, stderr); exit(1); } fprintf(stderr, "Socket connection successful: master socket = %d\n", m); for ( ; ; ) { s = soap_accept(&soap); fprintf(stderr, "Socket connection successful: slave socket = %d\n", s); if (!soap_valid_socket(s)) { soap_print_fault(&soap, stderr); exit(1); } soap_serve(&soap); soap_end(&soap); } } return 0; } int ns__add(struct soap *soap, double a, double b, double *result) { (void)soap; *result = a + b; return SOAP_OK; } int ns__sub(struct soap *soap, double a, double b, double *result) { (void)soap; *result = a - b; return SOAP_OK; } int ns__mul(struct soap *soap, double a, double b, double *result) { (void)soap; *result = a * b; return SOAP_OK; } int ns__div(struct soap *soap, double a, double b, double *result) { if (b) *result = a / b; else { char *s = (char*)soap_malloc(soap, 1024); (SOAP_SNPRINTF(s, 1024, 100), "Can't divide %f by %f", a, b); return soap_sender_fault(soap, "Division by zero", s); } return SOAP_OK; } int ns__pow(struct soap *soap, double a, double b, double *result) { *result = pow(a, b); if (soap_errno == EDOM) /* soap_errno is like errno, but compatible with Win32 */ { char *s = (char*)soap_malloc(soap, 1024); (SOAP_SNPRINTF(s, 1024, 100), "Can't raise %f to %f", a, b); return soap_sender_fault(soap, "Power function domain error", s); } return SOAP_OK; } gsoap-2.8.91/gsoap/samples/calc/README.txt0000644000175000017500000001333713525245162017455 0ustar ellertellertSimple calculator service implements: add(a,b) sub(a,b) mul(a,b) div(a,b) pow(a,b) Compilation in C (see samples/calc): soapcpp2 -c calc.h cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c Compilation in C++ (see samples/calc++): soapcpp2 -i calc.h cc -o calcclient++ calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp cc -o calcserver++ calcserver.cpp stdsoap2.cpp soapC.cpp soapcalcService.cpp For C++ development soapcpp2 option -i generates proxy and service classes, which encapsulate the method operations in the class instead of defining them as global functions as in C. The calcclient application invokes the service and is used from the command line as follows: $ calcclient add 3 4 result = 7 The calcserver application is a CGI application that can be installed under the cgibin of your Web server. The C client-side uses: Initialization of the runtime engine: soap_init(struct soap*) Invoking a call of xyz, this function is generated by soapcpp2: soap_call_ns__xyz(struct soap*, const char *endpoint, const char *action, double a, double b, double *result) Note: endpoint=NULL and action=NULL for defaults Print communication errors: soap_print_fault(struct soap*, FILE*) Allocate data, which stays alive until deallocated by soap_end() soap_malloc(struct soap*, size_t len) Delete deserialized data: soap_end(struct soap*) Finalize and detach the runtime engine: soap_done(struct soap*) The C server-side uses: Initialization of the runtime engine: soap_init(struct soap*) Binding the port: soap_bind(struct soap*, const char *host, int port, int backlog) Accepting a request: soap_accept(struct soap*); Invoking the service dispatcher, this function is generated by soapcpp2: soap_serve(struct soap*) Print communication errors: soap_print_fault(struct soap*, FILE*) Allocate data, which stays alive until deallocated by soap_end() soap_malloc(struct soap*, size_t len) Delete deserialized data: soap_end(struct soap*) Send back sender-related fault: soap_sender_fault(struct soap*, const char *string, const char *detailXML) Send back receiver-related fault: soap_receiver_fault(struct soap*, const char *string, const char *detailXML) Finalize and detach the runtime engine: soap_done(struct soap*) Service operations are not auto-generated (user-defined): ns__add(struct soap*, double a, double b, double *result) ns__sub(struct soap*, double a, double b, double *result) ns__mul(struct soap*, double a, double b, double *result) ns__div(struct soap*, double a, double b, double *result) ns__pow(struct soap*, double a, double b, double *result) The C++ client-side uses a proxy generated with soapcpp2 -i: class calcProxy The default endpoint can be changed: const char *calcProxxy::endpoint Invoke a call of xyz: calcProxy::xyz(double a, double b, double *result) Print communication errors: calcProxy::soap_stream_fault(std::ostream&) Error code (see list of error codes in documentation and stdsoap2.h): calcProxy::error Allocate data, deallocated by soap_end() or calcProxy destructor soap_malloc(calcProxy*, size_t len) Get new instance of class X, deallocated by soap_destroy() or calcProxy destructor soap_new_X(calcProxy*, -1) Get array of new instances of class X, deallocated by soap_destroy() or calcProxy destructor soap_new_X(calcProxy*, arraylen) Delete deserialized C++ class instances (also part of calcProxy destructor): soap_destroy(calcProxy*) Delete deserialized data (also part of calcProxy destructor): soap_end(calcProxy*) The C++ server-side uses a class generated with soapcpp2 -i: class calcService Serve requests over stdin/out (for CGI) calcService::serve() Serve multiple requests over port (iterative HTTP server): calcService::run() Print communication errors: calcService::soap_stream_fault(std::ostream&) Error code (see list of error codes in documentation and stdsoap2.h): calcService::error Send back sender-related fault: calcService::soap_senderfault(const char *string, const char *detailXML) Send back sender-related fault with subcode (SOAP 1.2): calcService::soap_senderfault(const char *subcodeQName, const char *string, const char *detailXML) Send back receiver-related fault: calcService::soap_receiver_fault(const char *string, const char *detailXML) Send back receiver-related fault with subcode (SOAP 1.2): calcService::soap_receiver_fault(const char *subcodeQName, const char *string, const char *detailXML) Service operations are user-defined (not auto-generated): calcService::add(double a, double b, double *result) calcService::sub(double a, double b, double *result) calcService::mul(double a, double b, double *result) calcService::div(double a, double b, double *result) calcService::pow(double a, double b, double *result) Allocate data, deallocated by soap_end() or calcService destructor soap_malloc(calcService*, size_t len) Get new instance of class X, deallocated by soap_destroy() or calcService destructor soap_new_X(calcService*, -1) Get array of new instances of class X, deallocated by soap_destroy() or calcService destructor soap_new_X(calcService*, arraylen) Delete deserialized C++ class instances (also part of calcService destructor): soap_destroy(calcService*) Delete deserialized data (also part of calcService destructor): soap_end(calcService*) Note: all soap_xyz(struct soap*, ...) gSOAP API functions are also available to the calcProxy and calcService classes by inheritance of the struct soap runtime engine state object. gsoap-2.8.91/gsoap/samples/calc/calcclient.c0000644000175000017500000000545513525245162020226 0ustar ellertellert/* calcclient.c Example calculator service client in C Compilation in C (see samples/calc/calc.h): $ soapcpp2 -c calc.h $ cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c where stdsoap2.c is in the 'gsoap' directory, or use libgsoap: $ cc -o calcclient calcclient.c soapC.c soapClient.c -lgsoap -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "calc.nsmap" const char server[] = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; /* = "http://localhost:8080"; to test against samples/webserver */ int main(int argc, char **argv) { struct soap soap; double a, b, result; if (argc < 4) { fprintf(stderr, "Usage: [add|sub|mul|div|pow] num num\n"); exit(0); } soap_init1(&soap, SOAP_XML_INDENT); a = strtod(argv[2], NULL); b = strtod(argv[3], NULL); switch (*argv[1]) { case 'a': soap_call_ns__add(&soap, server, "", a, b, &result); break; case 's': soap_call_ns__sub(&soap, server, "", a, b, &result); break; case 'm': soap_call_ns__mul(&soap, server, "", a, b, &result); break; case 'd': soap_call_ns__div(&soap, server, "", a, b, &result); break; case 'p': soap_call_ns__pow(&soap, server, "", a, b, &result); break; default: fprintf(stderr, "Unknown command\n"); exit(0); } if (soap.error) soap_print_fault(&soap, stderr); else printf("result = %g\n", result); soap_destroy(&soap); soap_end(&soap); soap_done(&soap); return 0; } gsoap-2.8.91/gsoap/samples/calc/calc.h0000644000175000017500000001054613525245162017031 0ustar ellertellert/* calc.h This is a gSOAP header file with a calculator data binding and Web service interface to implement clients and services The service operations and type definitions use familiar C/C++ syntax. The following methods are defined by this gSOAP service definition: add(a,b) sub(a,b) mul(a,b) div(a,b) pow(a,b) Build steps for C (see samples/calc): $ soapcpp2 -c -r calc.h $ cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c $ cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c Build steps for C++ (see samples/calc++): $ soapcpp2 -j -r calc.h $ c++ -o calcclient++ calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp $ c++ -o calcserver++ calcserver.cpp stdsoap2.cpp soapC.cpp soapcalcService.cpp Option -r generates a soapReadme.md report. Note that soapcpp2 option -j generates proxy and service classes, which encapsulate the method operations in the class instead of defining them as global functions as in C. The //gsoap directives are used to bind XML namespaces and to define Web service properties: //gsoap service name: //gsoap service style: [rpc|document] //gsoap service encoding: [literal|encoded] //gsoap service namespace: //gsoap service location: Web service operation properties: //gsoap service method-style: [rpc|document] //gsoap service method-encoding: [literal|encoded] //gsoap service method-action: //gsoap service method-documentation: and type schema properties: //gsoap schema namespace: //gsoap schema elementForm: [qualified|unqualified] //gsoap schema attributeForm: [qualified|unqualified] //gsoap schema documentation: //gsoap schema type-documentation: where is an XML namespace prefix, which is used in C/C++ operation names, e.g. ns__add(), and type names, e.g. xsd__int. See the documentation for the full list of //gsoap directives. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: calc Simple calculator service described at https://www.genivia.com/dev.html //gsoap ns service protocol: SOAP //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns schema namespace: urn:calc //gsoap ns service method: add Sums two values int ns__add(double a, double b, double *result); //gsoap ns service method: sub Subtracts two values int ns__sub(double a, double b, double *result); //gsoap ns service method: mul Multiplies two values int ns__mul(double a, double b, double *result); //gsoap ns service method: div Divides two values int ns__div(double a, double b, double *result); //gsoap ns service method: pow Raises a to b int ns__pow(double a, double b, double *result); gsoap-2.8.91/gsoap/samples/calc/Makefile.am0000644000175000017500000000117113525245162020004 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = calcclient calcserver SOAPHEADER = calc.h include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = calc.nsmap calc.wsdl calcclient_SOURCES = calcclient.c $(SOAPHEADER) $(SOAP_C_CLIENT) calcclient_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) calcserver_SOURCES = calcserver.c $(SOAPHEADER) $(SOAP_C_SERVER) calcserver_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lm gsoap-2.8.91/gsoap/samples/lu/0000755000175000017500000000000013525245175015472 5ustar ellertellertgsoap-2.8.91/gsoap/samples/lu/.deps/0000755000175000017500000000000013525245175016503 5ustar ellertellertgsoap-2.8.91/gsoap/samples/lu/.deps/luserver_cgi-luserver.Po0000644000175000017500000000001013525245163023325 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/samples/lu/.deps/luclient-luclient.Po0000644000175000017500000000001013525245163022423 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/samples/lu/.deps/luserver_cgi-lumat.Po0000644000175000017500000000001013525245163022600 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/samples/lu/.deps/luclient-soapC.Po0000644000175000017500000000001013525245163021651 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/samples/lu/.deps/luclient-lumat.Po0000644000175000017500000000001013525245163021726 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/samples/lu/.deps/luserver_cgi-soapC.Po0000644000175000017500000000001013525245163022523 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/samples/lu/.deps/luclient-soapClient.Po0000644000175000017500000000001013525245163022705 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/samples/lu/.deps/luserver_cgi-soapServer.Po0000644000175000017500000000001013525245163023607 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/samples/lu/Makefile.in0000644000175000017500000005200013525245163017531 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = luclient$(EXEEXT) luserver.cgi$(EXEEXT) subdir = gsoap/samples/lu ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am_luclient_OBJECTS = luclient.$(OBJEXT) lumat.$(OBJEXT) \ $(am__objects_1) $(am__objects_3) luclient_OBJECTS = $(am_luclient_OBJECTS) am__DEPENDENCIES_1 = luclient_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) am__objects_4 = soapServer.$(OBJEXT) $(am__objects_2) am_luserver_cgi_OBJECTS = luserver.$(OBJEXT) lumat.$(OBJEXT) \ $(am__objects_1) $(am__objects_4) luserver_cgi_OBJECTS = $(am_luserver_cgi_OBJECTS) luserver_cgi_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/luclient.Po ./$(DEPDIR)/lumat.Po \ ./$(DEPDIR)/luserver.Po ./$(DEPDIR)/soapC.Po \ ./$(DEPDIR)/soapClient.Po ./$(DEPDIR)/soapServer.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(luclient_SOURCES) $(luserver_cgi_SOURCES) DIST_SOURCES = $(luclient_SOURCES) $(luserver_cgi_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.cpp_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = lu.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = lu.nsmap lu.wsdl luclient_SOURCES = luclient.cpp lumat.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) luclient_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) luserver_cgi_SOURCES = luserver.cpp lumat.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) luserver_cgi_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/lu/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/lu/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) luclient$(EXEEXT): $(luclient_OBJECTS) $(luclient_DEPENDENCIES) $(EXTRA_luclient_DEPENDENCIES) @rm -f luclient$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(luclient_OBJECTS) $(luclient_LDADD) $(LIBS) luserver.cgi$(EXEEXT): $(luserver_cgi_OBJECTS) $(luserver_cgi_DEPENDENCIES) $(EXTRA_luserver_cgi_DEPENDENCIES) @rm -f luserver.cgi$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(luserver_cgi_OBJECTS) $(luserver_cgi_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/luclient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lumat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/luserver.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/luclient.Po -rm -f ./$(DEPDIR)/lumat.Po -rm -f ./$(DEPDIR)/luserver.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/luclient.Po -rm -f ./$(DEPDIR)/lumat.Po -rm -f ./$(DEPDIR)/luserver.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/lu/lu.h0000644000175000017500000001106113525245163016257 0ustar ellertellert/* lu.h LU factorization Web service -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns1 service name: lu //gsoap ns1 service style: rpc //gsoap ns1 service encoding: encoded //gsoap ns1 service namespace: http://websrv.cs.fsu.edu/~engelen/lu.wsdl //gsoap ns1 service location: http://websrv.cs.fsu.edu/~engelen/luserver.cgi //gsoap ns1 schema namespace: urn:lu typedef double xsd__double; typedef int xsd__int; class vector // dynamic array of type SOAP-ENC:Array with arrayType="double[]" { public: xsd__double *__ptr; // pointer to array of double int __size; // number of elements pointed to int __offset; struct soap *soap; // gSOAP env. instance was created vector(); vector(struct soap *env); vector(struct soap *env, int size); vector(struct soap *env, int start, int end); virtual ~vector(); virtual int start(); // index of first element (=__offset) virtual int end(); // index of last element virtual int size(); // vector size virtual void resize(int size); virtual void resize(int start, int end); virtual double& operator[](int i); virtual double operator()(int i); virtual void print(); }; class ivector // dynamic array of type SOAP-ENC:Array with arrayType="int[]" { public: xsd__int *__ptr; // pointer to array of int int __size; // number of elements pointed to int __offset; struct soap *soap; // gSOAP env. instance was created ivector(); ivector(struct soap *env); ivector(struct soap *env, int size); ivector(struct soap *env, int start, int end); virtual ~ivector(); virtual int start(); // index of first element (=__offset) virtual int end(); // index of last element virtual int size(); // vector size virtual void resize(int size); virtual void resize(int start, int end); virtual int& operator[](int i); virtual int operator()(int i); virtual void print(); }; class matrix // dynamic array of type SOAP-ENC:Array with arrayType="double[][]" { public: vector *__ptr; // pointer to array of vectors int __size; // number of vectors pointed to int __offset; struct soap *soap; // gSOAP env. instance was created matrix(); matrix(struct soap *env); matrix(struct soap *env, int rows); matrix(struct soap *env, int rows, int cols); matrix(struct soap *env, int rowstart, int rowend, int colstart, int colend); virtual ~matrix(); virtual int start(); virtual int end(); virtual int size(); virtual void resize(int rows, int cols); virtual void resize(int rowstart, int rowend, int colstart, int colend); virtual vector& operator[](int i); virtual double operator()(int i, int j); virtual void print(); }; // LU decomposition, see Numerical Recipies for C ns1__ludcmp(matrix *a, struct ns1__ludcmpResponse {matrix *a; ivector *i; xsd__double d;} &result); // backsubstitution, see Numerical Recipies for C ns1__lubksb(matrix *a, ivector *i, vector *b, vector *x); // Linear system solver using LU decomposition: solves ax=b ns1__lusol(matrix *a, vector *b, vector *x); // Linear systems solver using LU decomposition: solves ax=b for all rows in x and b ns1__lusols(matrix *a, matrix *b, matrix *x); // Matrix inversion using LU decomposition ns1__luinv(matrix *a, matrix *b); // Determinant of matrix ns1__ludet(matrix *a, xsd__double &d); gsoap-2.8.91/gsoap/samples/lu/lumat.cpp0000644000175000017500000002057613525245163017327 0ustar ellertellert/* lumat.cpp LU factorization vector and matrix operations. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" //////////////////////////////////////////////////////////////////////////////// // // vector // //////////////////////////////////////////////////////////////////////////////// vector::vector() { vector(NULL); } vector::vector(struct soap *env) { soap = env; __ptr = 0; __size = 0; __offset = 0; } vector::vector(struct soap *env, int size) { soap = env; __size = size; __offset = 1; __ptr = (double*)soap_malloc(soap, size*sizeof(double)); for (int i = 0; i < size; i++) __ptr[i] = 0.0; } vector::vector(struct soap *env, int start, int end) { soap = env; __size = end-start+1; __offset = start; __ptr = (double*)soap_malloc(soap, __size*sizeof(double)); for (int i = 0; i < __size; i++) __ptr[i] = 0.0; } vector::~vector() { // no deallocation: let gSOAP handle all dynamic allocation and deallocation } int vector::start() { return __offset; } int vector::end() { return __size+__offset-1; } int vector::size() { return __size; } void vector::resize(int size) { resize(1, size); } void vector::resize(int start, int end) { double *p; int n, size = end-start+1; if (__offset == start && __size == size) return; // nothing to do p = (double*)soap_malloc(soap, size*sizeof(double)); for (int i = 0; i < size; i++) p[i] = 0.0; if (__ptr) { if (start < __offset) { n = (size-__offset+start <= __size ? size-__offset+start : __size); for (int i = 0; i < n; i++) p[__offset-start+i] = __ptr[i]; } else { n = (__size-start+__offset <= size ? __size-start+__offset : size); for (int i = 0; i < n; i++) p[i] = __ptr[start-__offset+i]; } soap_dealloc(soap, __ptr); } __ptr = p; __size = size; __offset = start; } double& vector::operator[](int i) { return __ptr[i-__offset]; } double vector::operator()(int i) { if (i >= __offset && i < __size+__offset) return __ptr[i-__offset]; return 0.0; } void vector::print() { int i; for (i = 1; i <= end(); i++) printf("% f ", (*this)(i)); printf("\n"); } //////////////////////////////////////////////////////////////////////////////// // // ivector // //////////////////////////////////////////////////////////////////////////////// ivector::ivector() { ivector(NULL); } ivector::ivector(struct soap *env) { soap = env; __ptr = 0; __size = 0; } ivector::ivector(struct soap *env, int size) { soap = env; __size = size; __offset = 1; __ptr = (int*)soap_malloc(soap, size*sizeof(int)); for (int i = 0; i < size; i++) __ptr[i] = 0; } ivector::ivector(struct soap *env, int start, int end) { soap = env; __size = end-start+1; __offset = start; __ptr = (int*)soap_malloc(soap, __size*sizeof(int)); for (int i = 0; i < __size; i++) __ptr[i] = 0; } ivector::~ivector() { // no deallocation: let gSOAP handle all dynamic allocation and deallocation } int ivector::start() { return __offset; } int ivector::end() { return __size+__offset-1; } int ivector::size() { return __size; } void ivector::resize(int size) { resize(1, size); } void ivector::resize(int start, int end) { int *p; int n, size = end-start+1; if (__offset == start && __size == size) return; // nothing to do p = (int*)soap_malloc(soap, size*sizeof(int)); for (int i = 0; i < size; i++) p[i] = 0; if (__ptr) { if (start < __offset) { n = (size-__offset+start <= __size ? size-__offset+start : __size); for (int i = 0; i < n; i++) p[__offset-start+i] = __ptr[i]; } else { n = (__size-start+__offset <= size ? __size-start+__offset : size); for (int i = 0; i < n; i++) p[i] = __ptr[start-__offset+i]; } soap_dealloc(soap, __ptr); } __ptr = p; __size = size; __offset = start; } int& ivector::operator[](int i) { return __ptr[i-__offset]; } int ivector::operator()(int i) { if (i >= __offset && i < __size+__offset) return __ptr[i-__offset]; return 0; } void ivector::print() { int i; for (i = 1; i <= end(); i++) printf("%4d ", (*this)(i)); printf("\n"); } //////////////////////////////////////////////////////////////////////////////// // // matrix // //////////////////////////////////////////////////////////////////////////////// matrix::matrix() { matrix(NULL); } matrix::matrix(struct soap *env) { soap = env; __ptr = 0; __size = 0; __offset = 0; } matrix::matrix(struct soap *env, int rows) { soap = env; __ptr = soap_new_vector(soap, rows); __size = rows; __offset = 1; } matrix::matrix(struct soap *env, int rows, int cols) { soap = env; __size = rows; __offset = 1; __ptr = soap_new_vector(soap, __size); for (int i = 0; i < __size; i++) __ptr[i].resize(cols); } matrix::matrix(struct soap *env, int rowstart, int rowend, int colstart, int colend) { soap = env; __size = rowend-rowstart+1; __offset = rowstart; __ptr = soap_new_vector(soap, __size); for (int i = 0; i <= __size-__offset; i++) __ptr[i].resize(colstart, colend); } matrix::~matrix() { // no deallocation: let gSOAP handle all dynamic allocation and deallocation } int matrix::start() { return __offset; } int matrix::end() { return __size+__offset-1; } int matrix::size() { return __size; } void matrix::resize(int rows, int cols) { resize(1, rows, 1, cols); } void matrix::resize(int rowstart, int rowend, int colstart, int colend) { int i; vector *p; int n, size = rowend-rowstart+1; if (__offset != rowstart || __size != rowend-rowstart+1) { if (__ptr) { p = soap_new_vector(soap, size); if (rowstart < __offset) { for (i = 0; i < __offset-rowstart; i++) p[i].resize(colstart, colend); n = (size-__offset+rowstart <= __size ? size-__offset+rowstart : __size); for (i = 0; i < n; i++) { __ptr[i].resize(colstart, colend); p[__offset-rowstart+i] = __ptr[i]; } for (; i < size-__offset+rowstart; i++) p[i].resize(colstart, colend); } else { n = (__size-rowstart+__offset <= size ? __size-rowstart+__offset : size); for (i = 0; i < n; i++) { __ptr[i].resize(colstart, colend); p[i] = __ptr[rowstart-__offset+i]; } for (; i < size; i++) p[i].resize(colstart, colend); } __ptr = p; __size = size; __offset = rowstart; } else { __size = size; __offset = rowstart; __ptr = soap_new_vector(soap, size); for (i = 0; i < size; i++) __ptr[i].resize(colstart, colend); } } else for (i = 0; i < size; i++) __ptr[i].resize(colstart, colend); } vector& matrix::operator[](int i) { return __ptr[i-__offset]; } double matrix::operator()(int i, int j) { int s; if (i >= __offset && i < __size+__offset) { s = __ptr[i-__offset].__offset; if (j >= s && j < __ptr[i-__offset].__size+s) return __ptr[i-__offset].__ptr[j-s]; } return 0.0; } void matrix::print() { int i, j; for (i = start(); i <= end(); i++) { for (j = 1; j < (*this)[i].start(); j++) printf(" "); for (; j <= (*this)[i].end(); j++) printf("% f ", (*this)(i, j)); printf("\n"); } } gsoap-2.8.91/gsoap/samples/lu/Makefile.am0000644000175000017500000000121613525245163017523 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = luclient luserver.cgi SOAPHEADER = lu.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = lu.nsmap lu.wsdl luclient_SOURCES = luclient.cpp lumat.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) luclient_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) luserver_cgi_SOURCES = luserver.cpp lumat.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) luserver_cgi_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) gsoap-2.8.91/gsoap/samples/lu/luserver.cpp0000644000175000017500000002145213525245163020046 0ustar ellertellert/* luserver.h LU factorization Web service. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include //////////////////////////////////////////////////////////////////////////////// // // main // //////////////////////////////////////////////////////////////////////////////// int main(int argc, char **argv) { struct soap *soap; int m, s; soap = soap_new(); if (argc < 3) soap_serve(soap); // run as CGI application over the Web else // run as stand-alone server on machine given by argv[1] listening to port argv[2] { m = soap_bind(soap, argv[1], atoi(argv[2]), 100); if (m < 0) { soap_print_fault(soap, stderr); exit(-1); } fprintf(stderr, "Socket connection successful: master socket = %d\n", m); for (int i = 1; ; i++) { s = soap_accept(soap); if (s < 0) { soap_print_fault(soap, stderr); exit(-1); } fprintf(stderr, "%d: accepted connection from IP = %d.%d.%d.%d socket = %d ... ", i, (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF, s); soap_serve(soap); // process request fprintf(stderr, "request served\n"); soap_destroy(soap); // delete class instances soap_end(soap); // clean up everything and close socket } } soap_done(soap); return 0; } //////////////////////////////////////////////////////////////////////////////// // // LU decomposition: remote method interface // //////////////////////////////////////////////////////////////////////////////// int ludcmp(struct soap*, matrix&, ivector&, double&); int ns1__ludcmp(struct soap *soap, matrix *a, struct ns1__ludcmpResponse &result) { result.a = a; result.i = soap_new_ivector(soap, -1); if (ludcmp(soap, *result.a, *result.i, result.d)) return soap_sender_fault(soap, "Singular matrix in routine ludcmp", NULL); return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // LU decomposition: algorithm // //////////////////////////////////////////////////////////////////////////////// int ludcmp(struct soap *soap, matrix &a, ivector &indx, double &d) { int i, imax = 0, j, k, n; double big, dum, sum, temp; n = a.size(); vector vv(soap); vv.resize(n); indx.resize(n); d = 1.0; for (i = 1; i <= n; i++) { big = 0.0; a[i].resize(n); for (j = 1; j <= n; j++) if ((temp = fabs(a[i][j])) > big) big = temp; if (big == 0.0) return -1; vv[i] = 1.0/big; } for (j = 1; j <= n; j++) { for (i = 1; i < j; i++) { sum = a[i][j]; for (k = 1; k < i; k++) sum -= a[i][k]*a[k][j]; a[i][j] = sum; } big = 0.0; for (i = j; i <= n; i++) { sum = a[i][j]; for (k = 1; k < j; k++) sum -= a[i][k]*a[k][j]; a[i][j] = sum; if ((dum = vv[i]*fabs(sum)) >= big) { big = dum; imax = i; } } if (j != imax) { for (k = 1; k <= n; k++) { dum = a[imax][k]; a[imax][k] = a[j][k]; a[j][k] = dum; } d = -d; vv[imax] = vv[j]; } indx[j] = imax; if (a[j][j] == 0.0) a[j][j] = 1.0e-20; if (j != n) { dum = 1.0/a[j][j]; for (i = j+1; i <= n; i++) a[i][j] *= dum; } } for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) if (fabs(a[i][j]) > 1.0e-15) break; for (k = n; k > j; k--) if (fabs(a[i][k]) > 1.0e-15) break; a[i].resize(j, k); } return 0; } //////////////////////////////////////////////////////////////////////////////// // // Forward- and backsubstitution: remote method interface // //////////////////////////////////////////////////////////////////////////////// int lubksb(matrix&, ivector&, vector &b); int ns1__lubksb(struct soap *soap, matrix *a, ivector *i, vector *b, vector *x) { lubksb(*a, *i, *b); *x = *b; return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // Forward- and backsubstitution: algorithm // //////////////////////////////////////////////////////////////////////////////// int lubksb(matrix &a, ivector &indx, vector &b) { int i, j, k, ip, n, m, ii = 0; double sum; n = a.size(); b.resize(n); for (i = 1; i <= n; i++) { ip = indx[i]; sum = b[ip]; b[ip] = b[i]; if (ii) { k = a[i].start(); if (ii > k) k = ii; m = a[i].end(); if (i-1 < m) m = i-1; for (j = k; j <= m; j++) sum -= a[i][j]*b[j]; } else if (sum) ii = i; b[i] = sum; } for (i = n; i >= 1; i--) { sum = b[i]; k = a[i].start(); if (i+1 > k) k = i+1; m = a[i].end(); if (n < m) m = n; for (j = k; j <= m; j++) sum -= a[i][j]*b[j]; b[i] = sum/a[i][i]; } return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // LU solve: remote method interface // //////////////////////////////////////////////////////////////////////////////// int ns1__lusol(struct soap *soap, matrix *a, vector *b, vector *x) { ivector indx(soap); double d; if (ludcmp(soap, *a, indx, d)) return soap_sender_fault(soap, "Singular matrix in routine ludcmp", NULL); lubksb(*a, indx, *b); *x = *b; return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // LU solve multiple: remote method interface // //////////////////////////////////////////////////////////////////////////////// int ns1__lusols(struct soap *soap, matrix *a, matrix *b, matrix *x) { ivector indx(soap); double d; if (ludcmp(soap, *a, indx, d)) return soap_sender_fault(soap, "Singular matrix in routine ludcmp", NULL); for (int i = 1; i <= b->size(); i++) lubksb(*a, indx, (*b)[i]); *x = *b; return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // LU inverse: remote method interface // //////////////////////////////////////////////////////////////////////////////// int ns1__luinv(struct soap *soap, matrix *a, matrix *b) { vector col(soap); ivector indx(soap); double d; int i, j, k, n; if (ludcmp(soap, *a, indx, d)) return soap_sender_fault(soap, "Singular matrix in routine ludcmp", NULL); n = a->size(); col.resize(n); b->resize(n, n); for (j = 1; j <= n; j++) { for (i = 1; i <= n; i++) col[i] = 0.0; col[j] = 1.0; lubksb(*a, indx, col); for (i = 1; i <= n; i++) (*b)[i][j] = col[i]; } for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) if (fabs((*b)[i][j]) > 1.0e-15) break; for (k = n; k > j; k--) if (fabs((*b)[i][k]) > 1.0e-15) break; (*b)[i].resize(j, k); } return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // LU determinant: remote method interface // //////////////////////////////////////////////////////////////////////////////// int ns1__ludet(struct soap *soap, matrix *a, double &d) { ivector indx(soap); if (ludcmp(soap, *a, indx, d)) return soap_sender_fault(soap, "Singular matrix in routine ludcmp", NULL); for (int i = 1; i <= a->__size; i++) d *= (*a)[i][i]; return SOAP_OK; } struct Namespace namespaces[] = {// "ns-prefix", "ns-name", "ns-pattern" {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/"}, {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/"}, {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://wwww.w3.org/*/XMLSchema-instance"}, {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema"}, {"ns1", "urn:lu"}, {NULL, NULL} }; gsoap-2.8.91/gsoap/samples/lu/luclient.cpp0000644000175000017500000000643513525245163020022 0ustar ellertellert/* luclient.h LU factorization Web service client. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include const char luserver[] = "http://websrv.cs.fsu.edu/~engelen/luserver.cgi"; int main(int argc, char **argv) { struct soap *soap = soap_new(); const char *endpoint; matrix a(soap, 3); // matrix with 3 rows created in current soap env. // set up matrix by specifying non-zero elements only (this is optional) a[1].resize(1,2); // 2-element vector indexed from 1 to 2 a[1][1] = 2; a[1][2] = 1; a[2].resize(1,3); // 3-element vector a[2][1] = 1; a[2][2] = 2; a[2][3] = 1; a[3].resize(2,3); // 2-element vector indexed from 2 to 3 a[3][2] = 1; a[3][3] = 2; std::cout << "* Demonstration example *" << std::endl; std::cout << "Matrix:" << std::endl; a.print(); vector b(soap, 3); b[1] = 1; b[2] = 2; b[3] = 3; std::cout << "Vector:" << std::endl; b.print(); vector x(soap); if (argc < 2) endpoint = luserver; else endpoint = argv[1]; /* solve ax=b */ if (soap_call_ns1__lusol(soap, endpoint, "", &a, &b, &x)) { soap_print_fault(soap, stderr); soap_print_fault_location(soap, stderr); } else { std::cout << "Solution vector from service:" << std::endl; x.print(); } matrix a1(soap); if (soap_call_ns1__luinv(soap, endpoint, "", &a, &a1)) { soap_print_fault(soap, stderr); soap_print_fault_location(soap, stderr); } else { std::cout << "Inverse matrix matrix from service:" << std::endl; a1.print(); } soap_destroy(soap); soap_end(soap); soap_free(soap); return 0; } struct Namespace namespaces[] = {// "ns-prefix", "ns-name", "ns-pattern" {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/"}, {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/"}, {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance"}, {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema"}, {"ns1", "urn:lu"}, {NULL, NULL} }; gsoap-2.8.91/gsoap/samples/gmt/0000755000175000017500000000000013525245174015640 5ustar ellertellertgsoap-2.8.91/gsoap/samples/gmt/.deps/0000755000175000017500000000000013525245174016651 5ustar ellertellertgsoap-2.8.91/gsoap/samples/gmt/Makefile.in0000644000175000017500000005142513525245163017712 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = gmtclient$(EXEEXT) gmtserver$(EXEEXT) subdir = gsoap/samples/gmt ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am_gmtclient_OBJECTS = gmtclient.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) gmtclient_OBJECTS = $(am_gmtclient_OBJECTS) am__DEPENDENCIES_1 = gmtclient_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) am__objects_4 = soapServer.$(OBJEXT) $(am__objects_2) am_gmtserver_OBJECTS = gmtserver.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) gmtserver_OBJECTS = $(am_gmtserver_OBJECTS) gmtserver_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/gmtclient.Po \ ./$(DEPDIR)/gmtserver.Po ./$(DEPDIR)/soapC.Po \ ./$(DEPDIR)/soapClient.Po ./$(DEPDIR)/soapServer.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(gmtclient_SOURCES) $(gmtserver_SOURCES) DIST_SOURCES = $(gmtclient_SOURCES) $(gmtserver_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.cpp_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = gmt.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = gmt.nsmap gmt.wsdl gmtclient_SOURCES = gmtclient.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) gmtclient_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) gmtserver_SOURCES = gmtserver.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) gmtserver_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/gmt/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/gmt/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) gmtclient$(EXEEXT): $(gmtclient_OBJECTS) $(gmtclient_DEPENDENCIES) $(EXTRA_gmtclient_DEPENDENCIES) @rm -f gmtclient$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(gmtclient_OBJECTS) $(gmtclient_LDADD) $(LIBS) gmtserver$(EXEEXT): $(gmtserver_OBJECTS) $(gmtserver_DEPENDENCIES) $(EXTRA_gmtserver_DEPENDENCIES) @rm -f gmtserver$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(gmtserver_OBJECTS) $(gmtserver_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmtclient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmtserver.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/gmtclient.Po -rm -f ./$(DEPDIR)/gmtserver.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/gmtclient.Po -rm -f ./$(DEPDIR)/gmtserver.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/gmt/t.wsdl0000644000175000017500000000535613525245163017005 0ustar ellertellert Service definition of function t__gmt gSOAP 2.8.29 generated service definition gsoap-2.8.91/gsoap/samples/gmt/gmt.h0000644000175000017500000000055713525245163016605 0ustar ellertellert//gsoap t service name: gmt Get current time client code: `#include "soapH.h" #include "gmt.nsmap" int main() { time_t t; struct soap *soap = soap_new(); soap_call_t__gmt(soap, "http://www.cs.fsu.edu/~engelen/gmtlitserver.cgi", "", &t); printf("The current time is %s\n", ctime(&t)); soap_destroy(soap); soap_end(soap); soap_free(soap); return 0; }` t__gmt(time_t*); gsoap-2.8.91/gsoap/samples/gmt/README.txt0000644000175000017500000000103113525245163017327 0ustar ellertellertThis directory contains a "one-liner" service: gSOAP Web service and client applications that are only one line long (not counting the usual #includes). The oneliners are small, but they can do a number of useful things. The complete list of oneliners is: samples/gmt return current time in GMT samples/hello "Hello World!" samples/roll rolling a die You can use the client programs right away after compilation since they connect to our server. To run the server examples you have to install them as CGI applications. gsoap-2.8.91/gsoap/samples/gmt/Makefile.am0000644000175000017500000000117013525245163017671 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = gmtclient gmtserver SOAPHEADER = gmt.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = gmt.nsmap gmt.wsdl gmtclient_SOURCES = gmtclient.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) gmtclient_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) gmtserver_SOURCES = gmtserver.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) gmtserver_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) gsoap-2.8.91/gsoap/samples/gmt/gmtclient.cpp0000644000175000017500000000044213525245163020330 0ustar ellertellert#include "soapH.h" #include "gmt.nsmap" int main() { time_t t; struct soap *soap = soap_new(); soap_call_t__gmt(soap, "http://www.cs.fsu.edu/~engelen/gmtlitserver.cgi", "", &t); printf("The current time is %s\n", ctime(&t)); soap_destroy(soap); soap_end(soap); soap_free(soap); return 0; } gsoap-2.8.91/gsoap/samples/gmt/gmtserver.cpp0000644000175000017500000000024113525245163020355 0ustar ellertellert#include "soapH.h" #include "gmt.nsmap" int main() { return soap_serve(soap_new()); } int t__gmt(struct soap *soap, time_t *t) { *t = time(0); return SOAP_OK; } gsoap-2.8.91/gsoap/samples/autotest/0000755000175000017500000000000013525564137016724 5ustar ellertellertgsoap-2.8.91/gsoap/samples/autotest/.deps/0000755000175000017500000000000013525245164017731 5ustar ellertellertgsoap-2.8.91/gsoap/samples/autotest/test-self.sh0000755000175000017500000000054313525245162021165 0ustar ellertellert#!/bin/sh echo "test-self.log generated " `date` > test-self.log for req in *.req.xml; do echo "** $req" echo "" >> test-self.log echo "*** REQUEST $req ***" >> test-self.log cat $req >> test-self.log echo "" >> test-self.log echo "*** RESPONSE ***" >> test-self.log ./autotest 12288 < $req >> test-self.log || echo "\n>> ERROR $req\n" done gsoap-2.8.91/gsoap/samples/autotest/$(top_srcdir)/0000755000175000017500000000000013525245161021252 5ustar ellertellertgsoap-2.8.91/gsoap/samples/autotest/$(top_srcdir)/gsoap/0000755000175000017500000000000013525245161022363 5ustar ellertellertgsoap-2.8.91/gsoap/samples/autotest/$(top_srcdir)/gsoap/.deps/0000755000175000017500000000000013525245161023374 5ustar ellertellertgsoap-2.8.91/gsoap/samples/autotest/$(top_srcdir)/gsoap/.deps/autotest-dom.Po0000644000175000017500000000001013525245161026310 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/samples/autotest/$(top_srcdir)/gsoap/custom/0000755000175000017500000000000013525245161023675 5ustar ellertellertgsoap-2.8.91/gsoap/samples/autotest/$(top_srcdir)/gsoap/custom/.deps/0000755000175000017500000000000013525245161024706 5ustar ellertellertgsoap-2.8.91/gsoap/samples/autotest/$(top_srcdir)/gsoap/custom/.deps/autotest-struct_tm.Po0000644000175000017500000000001013525245161031067 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/samples/autotest/$(top_srcdir)/gsoap/custom/.deps/autotest-duration.Po0000644000175000017500000000001013525245161030670 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/samples/autotest/$(top_srcdir)/gsoap/custom/.deps/autotest-struct_tm_date.Po0000644000175000017500000000001013525245161032064 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/samples/autotest/$(top_srcdir)/gsoap/custom/.deps/autotest-long_time.Po0000644000175000017500000000001013525245161031020 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/samples/autotest/Makefile.in0000644000175000017500000010306013525245162020763 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ ####### This is the input file for automake, which will generate Makefile.in ########## VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = autotest$(EXEEXT) subdir = gsoap/samples/autotest ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = autotest-soapC.$(OBJEXT) autotest-soapServer.$(OBJEXT) am_autotest_OBJECTS = $(am__objects_1) autotest-soapTester.$(OBJEXT) \ autotest-duration.$(OBJEXT) autotest-long_time.$(OBJEXT) \ autotest-struct_tm.$(OBJEXT) autotest-struct_tm_date.$(OBJEXT) autotest_OBJECTS = $(am_autotest_OBJECTS) am__DEPENDENCIES_1 = autotest_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) autotest_LINK = $(CXXLD) $(autotest_CXXFLAGS) $(CXXFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/autotest-duration.Po \ ./$(DEPDIR)/autotest-long_time.Po \ ./$(DEPDIR)/autotest-soapC.Po \ ./$(DEPDIR)/autotest-soapServer.Po \ ./$(DEPDIR)/autotest-soapTester.Po \ ./$(DEPDIR)/autotest-struct_tm.Po \ ./$(DEPDIR)/autotest-struct_tm_date.Po am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(autotest_SOURCES) DIST_SOURCES = $(autotest_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 AM_LDFLAGS = $(CPPFLAGS) -I$(top_srcdir)/gsoap/samples/autotest -L$(top_srcdir)/gsoap/samples/autotest SOAP = $(top_srcdir)/gsoap/src/soapcpp2$(EXEEXT) WSDL = $(top_srcdir)/gsoap/wsdl/wsdl2h$(EXEEXT) WSDL_FLAGS = -d -P -t $(top_srcdir)/gsoap/samples/autotest/typemap.dat SOAP_FLAGS = -SL -T -I$(top_srcdir)/gsoap/import -I$(top_srcdir)/gsoap/custom WSDLINPUT = $(top_srcdir)/gsoap/samples/autotest/examples.wsdl SOAPHEADER = $(top_srcdir)/gsoap/samples/autotest/examples.h SOAP_CPP_SRC = soapC.cpp soapServer.cpp SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a autotest_CFLAGS = $(C_DEBUG_FLAGS) -D$(platform) autotest_CPPFLAGS = $(C_DEBUG_FLAGS) -D$(platform) autotest_CXXFLAGS = $(WSDL2H_EXTRA_FLAGS) autotest_SOURCES = $(SOAP_CPP_SRC) soapTester.cpp duration.cpp long_time.cpp struct_tm.cpp struct_tm_date.cpp autotest_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) CLEANFILES = *~ *.h *.cpp *.xml *.log *.nsmap all: all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/autotest/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/autotest/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) autotest$(EXEEXT): $(autotest_OBJECTS) $(autotest_DEPENDENCIES) $(EXTRA_autotest_DEPENDENCIES) @rm -f autotest$(EXEEXT) $(AM_V_CXXLD)$(autotest_LINK) $(autotest_OBJECTS) $(autotest_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/autotest-duration.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/autotest-long_time.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/autotest-soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/autotest-soapServer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/autotest-soapTester.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/autotest-struct_tm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/autotest-struct_tm_date.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` autotest-soapC.o: soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -MT autotest-soapC.o -MD -MP -MF $(DEPDIR)/autotest-soapC.Tpo -c -o autotest-soapC.o `test -f 'soapC.cpp' || echo '$(srcdir)/'`soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autotest-soapC.Tpo $(DEPDIR)/autotest-soapC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapC.cpp' object='autotest-soapC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -c -o autotest-soapC.o `test -f 'soapC.cpp' || echo '$(srcdir)/'`soapC.cpp autotest-soapC.obj: soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -MT autotest-soapC.obj -MD -MP -MF $(DEPDIR)/autotest-soapC.Tpo -c -o autotest-soapC.obj `if test -f 'soapC.cpp'; then $(CYGPATH_W) 'soapC.cpp'; else $(CYGPATH_W) '$(srcdir)/soapC.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autotest-soapC.Tpo $(DEPDIR)/autotest-soapC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapC.cpp' object='autotest-soapC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -c -o autotest-soapC.obj `if test -f 'soapC.cpp'; then $(CYGPATH_W) 'soapC.cpp'; else $(CYGPATH_W) '$(srcdir)/soapC.cpp'; fi` autotest-soapServer.o: soapServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -MT autotest-soapServer.o -MD -MP -MF $(DEPDIR)/autotest-soapServer.Tpo -c -o autotest-soapServer.o `test -f 'soapServer.cpp' || echo '$(srcdir)/'`soapServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autotest-soapServer.Tpo $(DEPDIR)/autotest-soapServer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapServer.cpp' object='autotest-soapServer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -c -o autotest-soapServer.o `test -f 'soapServer.cpp' || echo '$(srcdir)/'`soapServer.cpp autotest-soapServer.obj: soapServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -MT autotest-soapServer.obj -MD -MP -MF $(DEPDIR)/autotest-soapServer.Tpo -c -o autotest-soapServer.obj `if test -f 'soapServer.cpp'; then $(CYGPATH_W) 'soapServer.cpp'; else $(CYGPATH_W) '$(srcdir)/soapServer.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autotest-soapServer.Tpo $(DEPDIR)/autotest-soapServer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapServer.cpp' object='autotest-soapServer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -c -o autotest-soapServer.obj `if test -f 'soapServer.cpp'; then $(CYGPATH_W) 'soapServer.cpp'; else $(CYGPATH_W) '$(srcdir)/soapServer.cpp'; fi` autotest-soapTester.o: soapTester.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -MT autotest-soapTester.o -MD -MP -MF $(DEPDIR)/autotest-soapTester.Tpo -c -o autotest-soapTester.o `test -f 'soapTester.cpp' || echo '$(srcdir)/'`soapTester.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autotest-soapTester.Tpo $(DEPDIR)/autotest-soapTester.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapTester.cpp' object='autotest-soapTester.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -c -o autotest-soapTester.o `test -f 'soapTester.cpp' || echo '$(srcdir)/'`soapTester.cpp autotest-soapTester.obj: soapTester.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -MT autotest-soapTester.obj -MD -MP -MF $(DEPDIR)/autotest-soapTester.Tpo -c -o autotest-soapTester.obj `if test -f 'soapTester.cpp'; then $(CYGPATH_W) 'soapTester.cpp'; else $(CYGPATH_W) '$(srcdir)/soapTester.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autotest-soapTester.Tpo $(DEPDIR)/autotest-soapTester.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapTester.cpp' object='autotest-soapTester.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -c -o autotest-soapTester.obj `if test -f 'soapTester.cpp'; then $(CYGPATH_W) 'soapTester.cpp'; else $(CYGPATH_W) '$(srcdir)/soapTester.cpp'; fi` autotest-duration.o: duration.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -MT autotest-duration.o -MD -MP -MF $(DEPDIR)/autotest-duration.Tpo -c -o autotest-duration.o `test -f 'duration.cpp' || echo '$(srcdir)/'`duration.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autotest-duration.Tpo $(DEPDIR)/autotest-duration.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='duration.cpp' object='autotest-duration.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -c -o autotest-duration.o `test -f 'duration.cpp' || echo '$(srcdir)/'`duration.cpp autotest-duration.obj: duration.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -MT autotest-duration.obj -MD -MP -MF $(DEPDIR)/autotest-duration.Tpo -c -o autotest-duration.obj `if test -f 'duration.cpp'; then $(CYGPATH_W) 'duration.cpp'; else $(CYGPATH_W) '$(srcdir)/duration.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autotest-duration.Tpo $(DEPDIR)/autotest-duration.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='duration.cpp' object='autotest-duration.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -c -o autotest-duration.obj `if test -f 'duration.cpp'; then $(CYGPATH_W) 'duration.cpp'; else $(CYGPATH_W) '$(srcdir)/duration.cpp'; fi` autotest-long_time.o: long_time.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -MT autotest-long_time.o -MD -MP -MF $(DEPDIR)/autotest-long_time.Tpo -c -o autotest-long_time.o `test -f 'long_time.cpp' || echo '$(srcdir)/'`long_time.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autotest-long_time.Tpo $(DEPDIR)/autotest-long_time.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='long_time.cpp' object='autotest-long_time.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -c -o autotest-long_time.o `test -f 'long_time.cpp' || echo '$(srcdir)/'`long_time.cpp autotest-long_time.obj: long_time.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -MT autotest-long_time.obj -MD -MP -MF $(DEPDIR)/autotest-long_time.Tpo -c -o autotest-long_time.obj `if test -f 'long_time.cpp'; then $(CYGPATH_W) 'long_time.cpp'; else $(CYGPATH_W) '$(srcdir)/long_time.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autotest-long_time.Tpo $(DEPDIR)/autotest-long_time.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='long_time.cpp' object='autotest-long_time.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -c -o autotest-long_time.obj `if test -f 'long_time.cpp'; then $(CYGPATH_W) 'long_time.cpp'; else $(CYGPATH_W) '$(srcdir)/long_time.cpp'; fi` autotest-struct_tm.o: struct_tm.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -MT autotest-struct_tm.o -MD -MP -MF $(DEPDIR)/autotest-struct_tm.Tpo -c -o autotest-struct_tm.o `test -f 'struct_tm.cpp' || echo '$(srcdir)/'`struct_tm.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autotest-struct_tm.Tpo $(DEPDIR)/autotest-struct_tm.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='struct_tm.cpp' object='autotest-struct_tm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -c -o autotest-struct_tm.o `test -f 'struct_tm.cpp' || echo '$(srcdir)/'`struct_tm.cpp autotest-struct_tm.obj: struct_tm.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -MT autotest-struct_tm.obj -MD -MP -MF $(DEPDIR)/autotest-struct_tm.Tpo -c -o autotest-struct_tm.obj `if test -f 'struct_tm.cpp'; then $(CYGPATH_W) 'struct_tm.cpp'; else $(CYGPATH_W) '$(srcdir)/struct_tm.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autotest-struct_tm.Tpo $(DEPDIR)/autotest-struct_tm.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='struct_tm.cpp' object='autotest-struct_tm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -c -o autotest-struct_tm.obj `if test -f 'struct_tm.cpp'; then $(CYGPATH_W) 'struct_tm.cpp'; else $(CYGPATH_W) '$(srcdir)/struct_tm.cpp'; fi` autotest-struct_tm_date.o: struct_tm_date.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -MT autotest-struct_tm_date.o -MD -MP -MF $(DEPDIR)/autotest-struct_tm_date.Tpo -c -o autotest-struct_tm_date.o `test -f 'struct_tm_date.cpp' || echo '$(srcdir)/'`struct_tm_date.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autotest-struct_tm_date.Tpo $(DEPDIR)/autotest-struct_tm_date.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='struct_tm_date.cpp' object='autotest-struct_tm_date.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -c -o autotest-struct_tm_date.o `test -f 'struct_tm_date.cpp' || echo '$(srcdir)/'`struct_tm_date.cpp autotest-struct_tm_date.obj: struct_tm_date.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -MT autotest-struct_tm_date.obj -MD -MP -MF $(DEPDIR)/autotest-struct_tm_date.Tpo -c -o autotest-struct_tm_date.obj `if test -f 'struct_tm_date.cpp'; then $(CYGPATH_W) 'struct_tm_date.cpp'; else $(CYGPATH_W) '$(srcdir)/struct_tm_date.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autotest-struct_tm_date.Tpo $(DEPDIR)/autotest-struct_tm_date.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='struct_tm_date.cpp' object='autotest-struct_tm_date.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autotest_CPPFLAGS) $(CPPFLAGS) $(autotest_CXXFLAGS) $(CXXFLAGS) -c -o autotest-struct_tm_date.obj `if test -f 'struct_tm_date.cpp'; then $(CYGPATH_W) 'struct_tm_date.cpp'; else $(CYGPATH_W) '$(srcdir)/struct_tm_date.cpp'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/autotest-duration.Po -rm -f ./$(DEPDIR)/autotest-long_time.Po -rm -f ./$(DEPDIR)/autotest-soapC.Po -rm -f ./$(DEPDIR)/autotest-soapServer.Po -rm -f ./$(DEPDIR)/autotest-soapTester.Po -rm -f ./$(DEPDIR)/autotest-struct_tm.Po -rm -f ./$(DEPDIR)/autotest-struct_tm_date.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/autotest-duration.Po -rm -f ./$(DEPDIR)/autotest-long_time.Po -rm -f ./$(DEPDIR)/autotest-soapC.Po -rm -f ./$(DEPDIR)/autotest-soapServer.Po -rm -f ./$(DEPDIR)/autotest-soapTester.Po -rm -f ./$(DEPDIR)/autotest-struct_tm.Po -rm -f ./$(DEPDIR)/autotest-struct_tm_date.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_CPP_SRC) : $(WSDLINPUT) $(WSDL) $(WSDL_FLAGS) $(WSDLINPUT) $(SOAP) $(SOAP_FLAGS) $(SOAPHEADER) duration.cpp : ../../custom/duration.c ln -s ../../custom/duration.c duration.cpp long_time.cpp : ../../custom/long_time.c ln -s ../../custom/long_time.c long_time.cpp struct_tm.cpp : ../../custom/struct_tm.c ln -s ../../custom/struct_tm.c struct_tm.cpp struct_tm_date.cpp : ../../custom/struct_tm_date.c ln -s ../../custom/struct_tm_date.c struct_tm_date.cpp # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/autotest/typemap.dat0000644000175000017500000000177313525245162021077 0ustar ellertellert# typemap.dat for W3C basic and advanced XML schema pattern databindings xsd__duration = #import "duration.h" xsd__dateTime = #import "struct_tm.h" xsd__date = #import "struct_tm_date.h" xsd__time = #import "long_time.h" # xsd:integer and xsd:decimal have no value range restrictions, so we # CANNOT map them to C/C++ numerical types: # xsd__integer = typedef LONG64 xsd__integer; # xsd__decimal = typedef double xsd__decimal; # xsd__positiveInteger = typedef LONG64 xsd__positiveInteger 1 : ; # xsd__negativeInteger = typedef LONG64 xsd__negativeInteger : -1 ; # xsd__nonNegativeInteger = typedef LONG64 xsd__nonNegativeInteger 0 : ; # xsd__nonPositiveInteger = typedef LONG64 xsd__nonPositiveInteger : 0 ; # test/wsdl/typemap.dat ex = "http://www.w3.org/2002/ws/databinding/examples/6/09/" st = "http://www.w3.org/2002/ws/databinding/examples/6/09/strict/" # prevents importing from an non-existing site by making it a "built-in" # namespace using angle brackets: x = gsoap-2.8.91/gsoap/samples/autotest/test-patterns12.sh0000755000175000017500000000071613525245162022241 0ustar ellertellert#!/bin/sh echo "test-patterns12.log generated " `date` > test-patterns12.log for req in databinding/examples/6/09/*/*-soap12.xml; do name=`basename $req` echo "** $name" echo "" >> test-patterns12.log echo "*** REQUEST $name ***" >> test-patterns12.log cat $req >> test-patterns12.log echo "" >> test-patterns12.log echo "*** RESPONSE ***" >> test-patterns12.log ./autotest 12288 < $req >> test-patterns12.log || echo "\n>> SKIPPED $name\n" done gsoap-2.8.91/gsoap/samples/autotest/databinding/0000755000175000017500000000000013525245161021161 5ustar ellertellertgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/0000755000175000017500000000000013525245161022777 5ustar ellertellertgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/0000755000175000017500000000000013525245161023144 5ustar ellertellertgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/0000755000175000017500000000000013525245162023375 5ustar ellertellertgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeReference/0000755000175000017500000000000013525245161027156 5ustar ellertellert././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeReference/echoAttributeReference-AttributeReference01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeReference/echoAttributeRefere0000755000175000017500000000200413525245161033033 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeReference/echoAttributeReference-AttributeReference01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeReference/echoAttributeRefere0000755000175000017500000000242313525245161033040 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeReference/AttributeReference-AttributeReference01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeReference/AttributeReference-0000755000175000017500000000173313525245161032747 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeReference/echoAttributeReference-AttributeReference01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeReference/echoAttributeRefere0000755000175000017500000000242113525245161033036 0ustar ellertellert Bobby Sox gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormUnqualified/0000755000175000017500000000000013525245161030352 5ustar ellertellert././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormUnqualified/AttributeFormUnqualified-AttributeFormUnqualifiedExample01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormUnqualified/AttributeForm0000755000175000017500000000177713525245161033103 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000024100000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormUnqualified/echoAttributeFormUnqualified-AttributeFormUnqualifiedExample01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormUnqualified/echoAttribute0000755000175000017500000000242313525245161033103 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormUnqualified/echoAttributeFormUnqualified-AttributeFormUnqualifiedExample01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormUnqualified/echoAttribute0000755000175000017500000000204613525245161033104 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000024100000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormUnqualified/echoAttributeFormUnqualified-AttributeFormUnqualifiedExample01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormUnqualified/echoAttribute0000755000175000017500000000242513525245161033105 0ustar ellertellert 1175 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SchemaVersion/0000755000175000017500000000000013525245162026143 5ustar ellertellert././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SchemaVersion/echoSchemaVersion-SchemaVersion01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SchemaVersion/echoSchemaVersion-Schema0000755000175000017500000000217513525245162032701 0ustar ellertellert foo ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SchemaVersion/SchemaVersion-SchemaVersion01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SchemaVersion/SchemaVersion-SchemaVers0000755000175000017500000000155413525245162032702 0ustar ellertellert foo././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SchemaVersion/echoSchemaVersion-SchemaVersion01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SchemaVersion/echoSchemaVersion-Schema0000755000175000017500000000160513525245162032676 0ustar ellertellert foo ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SchemaVersion/echoSchemaVersion-SchemaVersion01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SchemaVersion/echoSchemaVersion-Schema0000755000175000017500000000217313525245162032677 0ustar ellertellert foo gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Id/0000755000175000017500000000000013525245162023731 5ustar ellertellertgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Id/echoId-IdExample01-soap12.xml0000755000175000017500000000215613525245162030767 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Id/Id-IdExample01.xml0000755000175000017500000000154013525245162027021 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Id/echoId-IdExample01-soap11.xml0000755000175000017500000000216013525245162030761 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Id/echoId-IdExample01.xml0000755000175000017500000000155213525245162027663 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenSimpleTypePattern/0000755000175000017500000000000013525245162030027 5ustar ellertellert././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenSimpleTypePattern/echoTokenSimpleTypePattern-TokenSimpleTypePattern01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenSimpleTypePattern/echoTokenSimple0000755000175000017500000000224613525245162033052 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenSimpleTypePattern/echoTokenSimpleTypePattern-TokenSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenSimpleTypePattern/echoTokenSimple0000755000175000017500000000170213525245162033046 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenSimpleTypePattern/echoTokenSimpleTypePattern-TokenSimpleTypePattern01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenSimpleTypePattern/echoTokenSimple0000755000175000017500000000225013525245162033045 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenSimpleTypePattern/TokenSimpleTypePattern-TokenSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenSimpleTypePattern/TokenSimpleType0000755000175000017500000000164013525245162033052 0ustar ellertellert 1gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/List/0000755000175000017500000000000013525245162024310 5ustar ellertellertgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/List/echoList-List01.xml0000755000175000017500000000153413525245162027664 0ustar ellertellert This is a list of strings gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/List/List-List01.xml0000755000175000017500000000151413525245162027023 0ustar ellertellert This is a list of stringsgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/List/echoList-List01-soap11.xml0000755000175000017500000000214613525245162030766 0ustar ellertellert This is a list of strings gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/List/echoList-List01-soap12.xml0000755000175000017500000000214413525245162030765 0ustar ellertellert This is a list of strings gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/0000755000175000017500000000000013525245162026642 5ustar ellertellert././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/echoUnionMemberTypes-UnionMemberTypes02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/echoUnionMemberTypes-0000755000175000017500000000164013525245162032752 0ustar ellertellert a string? ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/echoUnionMemberTypes-UnionMemberTypes01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/echoUnionMemberTypes-0000755000175000017500000000221113525245162032745 0ustar ellertellert 22 ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/UnionMemberTypes-UnionMemberTypes02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/UnionMemberTypes-Unio0000755000175000017500000000160413525245162032746 0ustar ellertellert a string?././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/echoUnionMemberTypes-UnionMemberTypes02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/echoUnionMemberTypes-0000755000175000017500000000222213525245162032747 0ustar ellertellert a string? ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/echoUnionMemberTypes-UnionMemberTypes02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/echoUnionMemberTypes-0000755000175000017500000000222013525245162032745 0ustar ellertellert a string? ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/echoUnionMemberTypes-UnionMemberTypes01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/echoUnionMemberTypes-0000755000175000017500000000163113525245162032752 0ustar ellertellert 22 ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/UnionMemberTypes-UnionMemberTypes01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/UnionMemberTypes-Unio0000755000175000017500000000157513525245162032755 0ustar ellertellert 22././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/echoUnionMemberTypes-UnionMemberTypes01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionMemberTypes/echoUnionMemberTypes-0000755000175000017500000000221313525245162032747 0ustar ellertellert 22 ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeEmptyExtension/gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeEmptyExtension0000755000175000017500000000000013525245162033136 5ustar ellertellert././@LongLink0000644000000000000000000000030400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeEmptyExtension/echoGlobalElementComplexTypeEmptyExtension-GlobalElementComplexTypeEmptyExtension01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeEmptyExtension0000755000175000017500000000231213525245162033141 0ustar ellertellert ././@LongLink0000644000000000000000000000030400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeEmptyExtension/echoGlobalElementComplexTypeEmptyExtension-GlobalElementComplexTypeEmptyExtension01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeEmptyExtension0000755000175000017500000000231413525245162033143 0ustar ellertellert ././@LongLink0000644000000000000000000000027500000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeEmptyExtension/echoGlobalElementComplexTypeEmptyExtension-GlobalElementComplexTypeEmptyExtension01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeEmptyExtension0000755000175000017500000000200613525245162033141 0ustar ellertellert ././@LongLink0000644000000000000000000000027100000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeEmptyExtension/GlobalElementComplexTypeEmptyExtension-GlobalElementComplexTypeEmptyExtension01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeEmptyExtension0000755000175000017500000000172413525245162033147 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/0000755000175000017500000000000013525245161031116 5ustar ellertellert././@LongLink0000644000000000000000000000023300000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/DecimalSimpleTypeTotalDigits-DecimalSimpleTypeTotalDigits02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/DecimalSi0000755000175000017500000000171013525245161032675 0ustar ellertellert 12345././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/echoDecimalSimpleTypeTotalDigits-DecimalSimpleTypeTotalDigits02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/echoDecim0000755000175000017500000000231013525245161032720 0ustar ellertellert 12345 ././@LongLink0000644000000000000000000000023300000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/DecimalSimpleTypeTotalDigits-DecimalSimpleTypeTotalDigits01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/DecimalSi0000755000175000017500000000170713525245161032703 0ustar ellertellert 1234././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/echoDecimalSimpleTypeTotalDigits-DecimalSimpleTypeTotalDigits02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/echoDecim0000755000175000017500000000231213525245161032722 0ustar ellertellert 12345 ././@LongLink0000644000000000000000000000023700000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/echoDecimalSimpleTypeTotalDigits-DecimalSimpleTypeTotalDigits01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/echoDecim0000755000175000017500000000175713525245161032736 0ustar ellertellert 1234 ././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/echoDecimalSimpleTypeTotalDigits-DecimalSimpleTypeTotalDigits01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/echoDecim0000755000175000017500000000230713525245161032726 0ustar ellertellert 1234 ././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/echoDecimalSimpleTypeTotalDigits-DecimalSimpleTypeTotalDigits01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/echoDecim0000755000175000017500000000231113525245161032721 0ustar ellertellert 1234 ././@LongLink0000644000000000000000000000023700000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/echoDecimalSimpleTypeTotalDigits-DecimalSimpleTypeTotalDigits02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeTotalDigits/echoDecim0000755000175000017500000000176013525245161032730 0ustar ellertellert 12345 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ImportSchemaNamespace/0000755000175000017500000000000013525245162027605 5ustar ellertellertgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/0000755000175000017500000000000013525245161026135 5ustar ellertellert././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000223113525245161032621 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000222513525245161032624 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000162713525245161032631 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/DateAttribute-DateAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/DateAttribute-DateAttrib0000755000175000017500000000157413525245161032654 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/DateAttribute-DateAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/DateAttribute-DateAttrib0000755000175000017500000000157313525245161032653 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000163013525245161032623 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000222313525245161032622 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute05-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000222413525245161032623 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000222413525245161032623 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000162713525245161032631 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/DateAttribute-DateAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/DateAttribute-DateAttrib0000755000175000017500000000160113525245161032643 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000223313525245161032623 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute05-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000222613525245161032625 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000222513525245161032624 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000222613525245161032625 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/DateAttribute-DateAttribute05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/DateAttribute-DateAttrib0000755000175000017500000000157413525245161032654 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000163013525245161032623 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000163513525245161032630 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAttribute02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/echoDateAttribute-DateAt0000755000175000017500000000222313525245161032622 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/DateAttribute-DateAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateAttribute/DateAttribute-DateAttrib0000755000175000017500000000157313525245161032653 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/0000755000175000017500000000000013525245162026455 5ustar ellertellert././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/GMonthAttribute-GMonthAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/GMonthAttribute-GMonth0000755000175000017500000000161113525245162032654 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GMonthAttribute03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GM0000755000175000017500000000223713525245162032627 0ustar ellertellert ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GMonthAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GM0000755000175000017500000000164713525245162032633 0ustar ellertellert ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GMonthAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GM0000755000175000017500000000164213525245162032626 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GMonthAttribute02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GM0000755000175000017500000000223213525245162032622 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GMonthAttribute04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GM0000755000175000017500000000223713525245162032627 0ustar ellertellert ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GMonthAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GM0000755000175000017500000000164313525245162032627 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GMonthAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GM0000755000175000017500000000223513525245162032625 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GMonthAttribute03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GM0000755000175000017500000000224113525245162032622 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GMonthAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GM0000755000175000017500000000223313525245162032623 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GMonthAttribute02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GM0000755000175000017500000000223413525245162032624 0ustar ellertellert ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/GMonthAttribute-GMonthAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/GMonthAttribute-GMonth0000755000175000017500000000161113525245162032654 0ustar ellertellert ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/GMonthAttribute-GMonthAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/GMonthAttribute-GMonth0000755000175000017500000000160413525245162032656 0ustar ellertellert ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GMonthAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GM0000755000175000017500000000164713525245162032633 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GMonthAttribute04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/echoGMonthAttribute-GM0000755000175000017500000000224113525245162032622 0ustar ellertellert ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/GMonthAttribute-GMonthAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthAttribute/GMonthAttribute-GMonth0000755000175000017500000000160513525245162032657 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementFinal/0000755000175000017500000000000013525245162027061 5ustar ellertellert././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementFinal/GlobalElementFinal-GlobalElementFinalExample01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementFinal/GlobalElementFinal-0000755000175000017500000000161413525245162032552 0ustar ellertellert Stuff././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementFinal/echoGlobalElementFinal-GlobalElementFinalExample01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementFinal/echoGlobalElementFi0000755000175000017500000000165213525245162032643 0ustar ellertellert Stuff ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementFinal/echoGlobalElementFinal-GlobalElementFinalExample01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementFinal/echoGlobalElementFi0000755000175000017500000000222613525245162032641 0ustar ellertellert Stuff ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementFinal/echoGlobalElementFinal-GlobalElementFinalExample01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementFinal/echoGlobalElementFi0000755000175000017500000000223013525245162032634 0ustar ellertellert Stuff gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalEnumerationType/0000755000175000017500000000000013525245161030003 5ustar ellertellert././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalEnumerationType/DecimalEnumerationType-DecimalEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalEnumerationType/DecimalEnumerat0000755000175000017500000000165013525245161032772 0ustar ellertellert 1000.0002././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalEnumerationType/echoDecimalEnumerationType-DecimalEnumerationType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalEnumerationType/echoDecimalEnum0000755000175000017500000000226013525245161032753 0ustar ellertellert 1000.0002 ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalEnumerationType/echoDecimalEnumerationType-DecimalEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalEnumerationType/echoDecimalEnum0000755000175000017500000000171213525245161032754 0ustar ellertellert 1000.0002 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalEnumerationType/echoDecimalEnumerationType-DecimalEnumerationType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalEnumerationType/echoDecimalEnum0000755000175000017500000000225613525245161032760 0ustar ellertellert 1000.0002 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFAttribute/0000755000175000017500000000000013525245162026112 5ustar ellertellert././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFAttribute/echoIDREFAttribute-IDREFAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFAttribute/echoIDREFAttribute-IDRE0000755000175000017500000000163013525245162032135 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFAttribute/IDREFAttribute-IDREFAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFAttribute/IDREFAttribute-IDREFAtt0000755000175000017500000000157313525245162032063 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFAttribute/echoIDREFAttribute-IDREFAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFAttribute/echoIDREFAttribute-IDRE0000755000175000017500000000222213525245162032133 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFAttribute/echoIDREFAttribute-IDREFAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFAttribute/echoIDREFAttribute-IDRE0000755000175000017500000000222413525245162032135 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/0000755000175000017500000000000013525245162026600 5ustar ellertellert././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/HexBinaryElement-HexBinaryElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/HexBinaryElement-HexB0000755000175000017500000000201513525245162032553 0ustar ellertellert 77696f646d6f6e7974637174716a7169696e6b65616f76786f746e66716b707875757261736e686469796b65706c656d7465626661637661646e6b65636662647669726d6f6e757361././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/echoHexBinaryElement-HexBinaryElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/echoHexBinaryElement-0000755000175000017500000000205113525245162032643 0ustar ellertellert 77696f646d6f6e7974637174716a7169696e6b65616f76786f746e66716b707875757261736e686469796b65706c656d7465626661637661646e6b65636662647669726d6f6e757361 ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/echoHexBinaryElement-HexBinaryElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/echoHexBinaryElement-0000755000175000017500000000163113525245162032646 0ustar ellertellert 76 ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/echoHexBinaryElement-HexBinaryElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/echoHexBinaryElement-0000755000175000017500000000243313525245162032647 0ustar ellertellert 77696f646d6f6e7974637174716a7169696e6b65616f76786f746e66716b707875757261736e686469796b65706c656d7465626661637661646e6b65636662647669726d6f6e757361 ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/echoHexBinaryElement-HexBinaryElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/echoHexBinaryElement-0000755000175000017500000000243113525245162032645 0ustar ellertellert 77696f646d6f6e7974637174716a7169696e6b65616f76786f746e66716b707875757261736e686469796b65706c656d7465626661637661646e6b65636662647669726d6f6e757361 ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/HexBinaryElement-HexBinaryElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/HexBinaryElement-HexB0000755000175000017500000000157513525245162032565 0ustar ellertellert 76././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/echoHexBinaryElement-HexBinaryElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/echoHexBinaryElement-0000755000175000017500000000221313525245162032643 0ustar ellertellert 76 ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/echoHexBinaryElement-HexBinaryElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryElement/echoHexBinaryElement-0000755000175000017500000000221113525245162032641 0ustar ellertellert 76 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/0000755000175000017500000000000013525245162030057 5ustar ellertellert././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/echoElementMinOccurs2orMore-ElementMinOccurs2orMore01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/echoElementMin0000755000175000017500000000251213525245162032701 0ustar ellertellert Red Black White Yellow ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/ElementMinOccurs2orMore-ElementMinOccurs2orMore02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/ElementMinOccu0000755000175000017500000000166413525245162032663 0ustar ellertellert Black White ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/echoElementMinOccurs2orMore-ElementMinOccurs2orMore01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/echoElementMin0000755000175000017500000000251013525245162032677 0ustar ellertellert Red Black White Yellow ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/echoElementMinOccurs2orMore-ElementMinOccurs2orMore02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/echoElementMin0000755000175000017500000000235313525245162032704 0ustar ellertellert Black White ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/echoElementMinOccurs2orMore-ElementMinOccurs2orMore01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/echoElementMin0000755000175000017500000000207113525245162032701 0ustar ellertellert Red Black White Yellow ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/ElementMinOccurs2orMore-ElementMinOccurs2orMore01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/ElementMinOccu0000755000175000017500000000201113525245162032646 0ustar ellertellert Red Black White Yellow ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/echoElementMinOccurs2orMore-ElementMinOccurs2orMore02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/echoElementMin0000755000175000017500000000235513525245162032706 0ustar ellertellert Black White ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/echoElementMinOccurs2orMore-ElementMinOccurs2orMore02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2orMore/echoElementMin0000755000175000017500000000174413525245162032707 0ustar ellertellert Black White gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/0000755000175000017500000000000013525245161026100 5ustar ellertellert././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/echoChoiceElement-ChoiceElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/echoChoiceElement-Choice0000755000175000017500000000167213525245161032567 0ustar ellertellert A ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/echoChoiceElement-ChoiceElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/echoChoiceElement-Choice0000755000175000017500000000227113525245161032563 0ustar ellertellert B ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/echoChoiceElement-ChoiceElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/echoChoiceElement-Choice0000755000175000017500000000227113525245161032563 0ustar ellertellert A ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/echoChoiceElement-ChoiceElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/echoChoiceElement-Choice0000755000175000017500000000226713525245161032570 0ustar ellertellert B ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/ChoiceElement-ChoiceElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/ChoiceElement-ChoiceElem0000755000175000017500000000164113525245161032527 0ustar ellertellert B ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/echoChoiceElement-ChoiceElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/echoChoiceElement-Choice0000755000175000017500000000226713525245161032570 0ustar ellertellert A ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/echoChoiceElement-ChoiceElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/echoChoiceElement-Choice0000755000175000017500000000167213525245161032567 0ustar ellertellert B ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/ChoiceElement-ChoiceElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceElement/ChoiceElement-ChoiceElem0000755000175000017500000000164113525245161032527 0ustar ellertellert A gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReferenceUnqualified/0000755000175000017500000000000013525245161032207 5ustar ellertellert././@LongLink0000644000000000000000000000025200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReferenceUnqualified/AttributeTypeReferenceUnqualified-AttributeTypeReferenceUnqualified01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReferenceUnqualified/Attr0000755000175000017500000000212513525245161033047 0ustar ellertellert String ././@LongLink0000644000000000000000000000026500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReferenceUnqualified/echoAttributeTypeReferenceUnqualified-AttributeTypeReferenceUnqualified01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReferenceUnqualified/echo0000755000175000017500000000254213525245161033056 0ustar ellertellert String ././@LongLink0000644000000000000000000000026500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReferenceUnqualified/echoAttributeTypeReferenceUnqualified-AttributeTypeReferenceUnqualified01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReferenceUnqualified/echo0000755000175000017500000000254013525245161033054 0ustar ellertellert String ././@LongLink0000644000000000000000000000025600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReferenceUnqualified/echoAttributeTypeReferenceUnqualified-AttributeTypeReferenceUnqualified01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReferenceUnqualified/echo0000755000175000017500000000220513525245161033052 0ustar ellertellert String gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/0000755000175000017500000000000013525245162027455 5ustar ellertellert././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/echoExtendedSequenceSkip-ExtendedSequenceSkip02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/echoExtendedSeque0000755000175000017500000000262513525245162033012 0ustar ellertellert Bobby Sox William Mr ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/ExtendedSequenceSkip-ExtendedSequenceSkip01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/ExtendedSequenceS0000755000175000017500000000175413525245162032766 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/echoExtendedSequenceSkip-ExtendedSequenceSkip01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/echoExtendedSeque0000755000175000017500000000201413525245162033002 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/echoExtendedSequenceSkip-ExtendedSequenceSkip02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/echoExtendedSeque0000755000175000017500000000262313525245162033010 0ustar ellertellert Bobby Sox William Mr ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/echoExtendedSequenceSkip-ExtendedSequenceSkip01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/echoExtendedSeque0000755000175000017500000000237713525245162033016 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/echoExtendedSequenceSkip-ExtendedSequenceSkip01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/echoExtendedSeque0000755000175000017500000000240113525245162033002 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/ExtendedSequenceSkip-ExtendedSequenceSkip02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/ExtendedSequenceS0000755000175000017500000000215613525245162032763 0ustar ellertellert Bobby Sox William Mr ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/echoExtendedSequenceSkip-ExtendedSequenceSkip02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkip/echoExtendedSeque0000755000175000017500000000221613525245162033006 0ustar ellertellert Bobby Sox William Mr gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/0000755000175000017500000000000013525245162026105 5ustar ellertellert././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAttribute02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAt0000755000175000017500000000221713525245162032513 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAt0000755000175000017500000000222013525245162032505 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAttribute04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAt0000755000175000017500000000222413525245162032511 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAttribute02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAt0000755000175000017500000000222113525245162032506 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAttribute04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAt0000755000175000017500000000222613525245162032513 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAt0000755000175000017500000000163013525245162032511 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAt0000755000175000017500000000163013525245162032511 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAt0000755000175000017500000000221613525245162032512 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/GDayAttribute-GDayAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/GDayAttribute-GDayAttrib0000755000175000017500000000156713525245162032544 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAttribute03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAt0000755000175000017500000000222613525245162032513 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/GDayAttribute-GDayAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/GDayAttribute-GDayAttrib0000755000175000017500000000157413525245162032542 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAt0000755000175000017500000000162213525245162032512 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/GDayAttribute-GDayAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/GDayAttribute-GDayAttrib0000755000175000017500000000157413525245162032542 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAt0000755000175000017500000000162313525245162032513 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAttribute03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/echoGDayAttribute-GDayAt0000755000175000017500000000222413525245162032511 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/GDayAttribute-GDayAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayAttribute/GDayAttribute-GDayAttrib0000755000175000017500000000156613525245162032543 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/0000755000175000017500000000000013525245161026402 5ustar ellertellert././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/DateTimeElement-DateTimeElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/DateTimeElement-DateTi0000755000175000017500000000161013525245161032504 0ustar ellertellert 2038-12-12T23:00:00././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/DateTimeElement-DateTimeElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/DateTimeElement-DateTi0000755000175000017500000000161613525245161032512 0ustar ellertellert 2000-03-04T23:00:00+03:00././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000164313525245161032523 0ustar ellertellert 0739-03-04T23:00:00 ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000223313525245161032517 0ustar ellertellert 2000-03-04T23:00:00+03:00 ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000165113525245161032522 0ustar ellertellert 1999-05-31T13:20:00-05:42 ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement06-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000223013525245161032514 0ustar ellertellert 10739-03-04T23:00:00 ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000222713525245161032522 0ustar ellertellert 2038-12-12T23:00:00 ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement05-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000222513525245161032520 0ustar ellertellert 0739-03-04T23:00:00 ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000223513525245161032521 0ustar ellertellert 1999-05-31T13:20:00-05:42 ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000164413525245161032524 0ustar ellertellert 2000-03-04T23:00:00Z ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000164313525245161032523 0ustar ellertellert 2038-12-12T23:00:00 ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/DateTimeElement-DateTimeElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/DateTimeElement-DateTi0000755000175000017500000000161613525245161032512 0ustar ellertellert 1999-05-31T13:20:00-05:42././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement06.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000164413525245161032524 0ustar ellertellert 10739-03-04T23:00:00 ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/DateTimeElement-DateTimeElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/DateTimeElement-DateTi0000755000175000017500000000161113525245161032505 0ustar ellertellert 2000-03-04T23:00:00Z././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/DateTimeElement-DateTimeElement05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/DateTimeElement-DateTi0000755000175000017500000000161013525245161032504 0ustar ellertellert 0739-03-04T23:00:00././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000222513525245161032520 0ustar ellertellert 2038-12-12T23:00:00 ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000223513525245161032521 0ustar ellertellert 2000-03-04T23:00:00+03:00 ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000223013525245161032514 0ustar ellertellert 2000-03-04T23:00:00Z ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement06-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000222613525245161032521 0ustar ellertellert 10739-03-04T23:00:00 ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000222613525245161032521 0ustar ellertellert 2000-03-04T23:00:00Z ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000223313525245161032517 0ustar ellertellert 1999-05-31T13:20:00-05:42 ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/DateTimeElement-DateTimeElement06.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/DateTimeElement-DateTi0000755000175000017500000000161113525245161032505 0ustar ellertellert 10739-03-04T23:00:00././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000165113525245161032522 0ustar ellertellert 2000-03-04T23:00:00+03:00 ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-DateTimeElement05-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeElement/echoDateTimeElement-Da0000755000175000017500000000222713525245161032522 0ustar ellertellert 0739-03-04T23:00:00 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IdentifierName/0000755000175000017500000000000013525245162026260 5ustar ellertellert././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IdentifierName/echoIdentifierName-IdentifierName02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IdentifierName/echoIdentifierName-Iden0000755000175000017500000000220213525245162032601 0ustar ellertellert Hello ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IdentifierName/IdentifierName-IdentifierName02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IdentifierName/IdentifierName-Identifi0000755000175000017500000000156413525245162032630 0ustar ellertellert Hello././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IdentifierName/echoIdentifierName-IdentifierName02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IdentifierName/echoIdentifierName-Iden0000755000175000017500000000220413525245162032603 0ustar ellertellert Hello ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IdentifierName/echoIdentifierName-IdentifierName02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IdentifierName/echoIdentifierName-Iden0000755000175000017500000000161613525245162032611 0ustar ellertellert Hello gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/0000755000175000017500000000000013525245162027414 5ustar ellertellert././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/GlobalElementDefault-GlobalElementDefault02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/GlobalElementDefa0000755000175000017500000000164213525245162032637 0ustar ellertellert theDefaultValue././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElementDefault-GlobalElementDefault02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElement0000755000175000017500000000225413525245162032716 0ustar ellertellert theDefaultValue ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElementDefault-GlobalElementDefault01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElement0000755000175000017500000000163213525245162032715 0ustar ellertellert ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElementDefault-GlobalElementDefault03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElement0000755000175000017500000000224713525245162032720 0ustar ellertellert anotherValue ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/GlobalElementDefault-GlobalElementDefault03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/GlobalElementDefa0000755000175000017500000000163713525245162032643 0ustar ellertellert anotherValue././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElementDefault-GlobalElementDefault01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElement0000755000175000017500000000220413525245162032711 0ustar ellertellert ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElementDefault-GlobalElementDefault02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElement0000755000175000017500000000225213525245162032714 0ustar ellertellert theDefaultValue ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElementDefault-GlobalElementDefault03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElement0000755000175000017500000000225113525245162032713 0ustar ellertellert anotherValue ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/GlobalElementDefault-GlobalElementDefault01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/GlobalElementDefa0000755000175000017500000000157213525245162032641 0ustar ellertellert ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElementDefault-GlobalElementDefault02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElement0000755000175000017500000000170213525245162032713 0ustar ellertellert theDefaultValue ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElementDefault-GlobalElementDefault03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElement0000755000175000017500000000167713525245162032726 0ustar ellertellert anotherValue ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElementDefault-GlobalElementDefault01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementDefault/echoGlobalElement0000755000175000017500000000220213525245162032707 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/0000755000175000017500000000000013525245162027313 5ustar ellertellert././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/echoRestrictedMinLength-RestrictedMinLength02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/echoRestrictedMinL0000755000175000017500000000165613525245162033000 0ustar ellertellert GB ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/echoRestrictedMinLength-RestrictedMinLength02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/echoRestrictedMinL0000755000175000017500000000223013525245162032765 0ustar ellertellert GB ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/echoRestrictedMinLength-RestrictedMinLength01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/echoRestrictedMinL0000755000175000017500000000223313525245162032770 0ustar ellertellert AUS ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/echoRestrictedMinLength-RestrictedMinLength01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/echoRestrictedMinL0000755000175000017500000000165713525245162033001 0ustar ellertellert AUS ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/echoRestrictedMinLength-RestrictedMinLength01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/echoRestrictedMinL0000755000175000017500000000223113525245162032766 0ustar ellertellert AUS ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/echoRestrictedMinLength-RestrictedMinLength02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/echoRestrictedMinL0000755000175000017500000000223213525245162032767 0ustar ellertellert GB ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/RestrictedMinLength-RestrictedMinLength01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/RestrictedMinLengt0000755000175000017500000000162013525245162033006 0ustar ellertellert AUS././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/RestrictedMinLength-RestrictedMinLength02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinLength/RestrictedMinLengt0000755000175000017500000000161713525245162033014 0ustar ellertellert GBgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReference/0000755000175000017500000000000013525245162027447 5ustar ellertellert././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReference/ElementTypeReference-ElementTypeReference01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReference/ElementTypeRefere0000755000175000017500000000175413525245162032770 0ustar ellertellert foo ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReference/echoElementTypeReference-ElementTypeReference01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReference/echoElementTypeRe0000755000175000017500000000201413525245162032753 0ustar ellertellert foo ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReference/echoElementTypeReference-ElementTypeReference01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReference/echoElementTypeRe0000755000175000017500000000240613525245162032760 0ustar ellertellert foo ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReference/echoElementTypeReference-ElementTypeReference01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReference/echoElementTypeRe0000755000175000017500000000240413525245162032756 0ustar ellertellert foo gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeConcrete/0000755000175000017500000000000013525245161027330 5ustar ellertellert././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeConcrete/ComplexTypeConcrete-ComplexTypeConcreteExample01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeConcrete/ComplexTypeConcret0000755000175000017500000000167213525245161033053 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeConcrete/echoComplexTypeConcrete-ComplexTypeConcreteExample01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeConcrete/echoComplexTypeCon0000755000175000017500000000231213525245161033024 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeConcrete/echoComplexTypeConcrete-ComplexTypeConcreteExample01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeConcrete/echoComplexTypeCon0000755000175000017500000000173113525245161033030 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeConcrete/echoComplexTypeConcrete-ComplexTypeConcreteExample01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeConcrete/echoComplexTypeCon0000755000175000017500000000231413525245161033026 0ustar ellertellert 1175 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LocalAttributeSimpleType/0000755000175000017500000000000013525245162030327 5ustar ellertellert././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LocalAttributeSimpleType/echoLocalAttributeSimpleType-LocalAttributeSimpleType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LocalAttributeSimpleType/echoLocalAttr0000755000175000017500000000254613525245162033010 0ustar ellertellert String String ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LocalAttributeSimpleType/echoLocalAttributeSimpleType-LocalAttributeSimpleType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LocalAttributeSimpleType/echoLocalAttr0000755000175000017500000000255013525245162033003 0ustar ellertellert String String ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LocalAttributeSimpleType/echoLocalAttributeSimpleType-LocalAttributeSimpleType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LocalAttributeSimpleType/echoLocalAttr0000755000175000017500000000216513525245162033005 0ustar ellertellert String String ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LocalAttributeSimpleType/LocalAttributeSimpleType-LocalAttributeSimpleType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LocalAttributeSimpleType/LocalAttribut0000755000175000017500000000211613525245162033026 0ustar ellertellert String String gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/0000755000175000017500000000000013525245162027126 5ustar ellertellert././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/echoSubstitutionGroup-SubstitutionGroup02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/echoSubstitutionGrou0000755000175000017500000000222413525245162033264 0ustar ellertellert String ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/SubstitutionGroup-SubstitutionGroup01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/SubstitutionGroup-Su0000755000175000017500000000162313525245162033174 0ustar ellertellert String././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/echoSubstitutionGroup-SubstitutionGroup02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/echoSubstitutionGrou0000755000175000017500000000164413525245162033271 0ustar ellertellert String ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/echoSubstitutionGroup-SubstitutionGroup02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/echoSubstitutionGrou0000755000175000017500000000222213525245162033262 0ustar ellertellert String ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/echoSubstitutionGroup-SubstitutionGroup01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/echoSubstitutionGrou0000755000175000017500000000165613525245162033274 0ustar ellertellert String ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/echoSubstitutionGroup-SubstitutionGroup01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/echoSubstitutionGrou0000755000175000017500000000223213525245162033263 0ustar ellertellert String ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/SubstitutionGroup-SubstitutionGroup02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/SubstitutionGroup-Su0000755000175000017500000000160713525245162033176 0ustar ellertellert String././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/echoSubstitutionGroup-SubstitutionGroup01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SubstitutionGroup/echoSubstitutionGrou0000755000175000017500000000223013525245162033261 0ustar ellertellert String gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/0000755000175000017500000000000013525245162030344 5ustar ellertellert././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/IntegerSimpleTypePattern-IntegerSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/IntegerSimple0000755000175000017500000000165613525245162033051 0ustar ellertellert 123././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/IntegerSimpleTypePattern-IntegerSimpleTypePattern02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/IntegerSimple0000755000175000017500000000165413525245162033047 0ustar ellertellert 9././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/echoIntegerSimpleTypePattern-IntegerSimpleTypePattern02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/echoIntegerSi0000755000175000017500000000226013525245162033022 0ustar ellertellert 9 ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/echoIntegerSimpleTypePattern-IntegerSimpleTypePattern02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/echoIntegerSi0000755000175000017500000000172013525245162033022 0ustar ellertellert 9 ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/echoIntegerSimpleTypePattern-IntegerSimpleTypePattern01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/echoIntegerSi0000755000175000017500000000226213525245162033024 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/echoIntegerSimpleTypePattern-IntegerSimpleTypePattern02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/echoIntegerSi0000755000175000017500000000226213525245162033024 0ustar ellertellert 9 ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/echoIntegerSimpleTypePattern-IntegerSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/echoIntegerSi0000755000175000017500000000172213525245162033024 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/echoIntegerSimpleTypePattern-IntegerSimpleTypePattern01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerSimpleTypePattern/echoIntegerSi0000755000175000017500000000226413525245162033026 0ustar ellertellert 123 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/0000755000175000017500000000000013525245161030023 5ustar ellertellert././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/AnySimpleTypeAttribute-AnySimpleTypeAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/AnySimpleTypeAt0000755000175000017500000000166513525245161033011 0ustar ellertellert ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/AnySimpleTypeAttribute-AnySimpleTypeAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/AnySimpleTypeAt0000755000175000017500000000166113525245161033005 0ustar ellertellert ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/echoAnySimpleTypeAttribute-AnySimpleTypeAttribute02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/echoAnySimpleTy0000755000175000017500000000230213525245161033023 0ustar ellertellert ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/echoAnySimpleTypeAttribute-AnySimpleTypeAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/echoAnySimpleTy0000755000175000017500000000230413525245161033025 0ustar ellertellert ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/echoAnySimpleTypeAttribute-AnySimpleTypeAttribute02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/echoAnySimpleTy0000755000175000017500000000230013525245161033021 0ustar ellertellert ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/echoAnySimpleTypeAttribute-AnySimpleTypeAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/echoAnySimpleTy0000755000175000017500000000230613525245161033027 0ustar ellertellert ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/echoAnySimpleTypeAttribute-AnySimpleTypeAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/echoAnySimpleTy0000755000175000017500000000173213525245161033031 0ustar ellertellert ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/echoAnySimpleTypeAttribute-AnySimpleTypeAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeAttribute/echoAnySimpleTy0000755000175000017500000000172613525245161033034 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/0000755000175000017500000000000013525245162025605 5ustar ellertellert././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000216613525245162032631 0ustar ellertellert 23:59:59 ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000157413525245162032633 0ustar ellertellert 12:00:01 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement05-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000217613525245162032632 0ustar ellertellert 13:21:03-04:32 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000217013525245162032624 0ustar ellertellert 23:59:59 ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000160213525245162032623 0ustar ellertellert 13:21:03-04:32 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/TimeElement-TimeElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/TimeElement-TimeElement02.0000755000175000017500000000154513525245162032376 0ustar ellertellert 12:00:01././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/TimeElement-TimeElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/TimeElement-TimeElement04.0000755000175000017500000000154613525245162032401 0ustar ellertellert 13:21:03Z././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000157413525245162032633 0ustar ellertellert 00:00:00 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000217013525245162032624 0ustar ellertellert 00:00:00 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000217113525245162032625 0ustar ellertellert 13:21:03Z ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/TimeElement-TimeElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/TimeElement-TimeElement03.0000755000175000017500000000154513525245162032377 0ustar ellertellert 23:59:59././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/TimeElement-TimeElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/TimeElement-TimeElement01.0000755000175000017500000000154513525245162032375 0ustar ellertellert 00:00:00././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000157413525245162032633 0ustar ellertellert 23:59:59 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000216613525245162032631 0ustar ellertellert 12:00:01 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000217013525245162032624 0ustar ellertellert 12:00:01 ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000157513525245162032634 0ustar ellertellert 13:21:03Z ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/TimeElement-TimeElement05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/TimeElement-TimeElement05.0000755000175000017500000000155313525245162032400 0ustar ellertellert 13:21:03-04:32././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000216613525245162032631 0ustar ellertellert 00:00:00 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000216713525245162032632 0ustar ellertellert 13:21:03Z ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElement05-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeElement/echoTimeElement-TimeElemen0000755000175000017500000000217413525245162032630 0ustar ellertellert 13:21:03-04:32 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/0000755000175000017500000000000013525245161027336 5ustar ellertellert././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/ComplexTypeSequence-ComplexTypeSequence02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/ComplexTypeSequenc0000755000175000017500000000210413525245161033056 0ustar ellertellert Widget Green 1233 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/echoComplexTypeSequence-ComplexTypeSequence02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/echoComplexTypeSeq0000755000175000017500000000256013525245161033050 0ustar ellertellert Widget Green 1233 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/echoComplexTypeSequence-ComplexTypeSequence01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/echoComplexTypeSeq0000755000175000017500000000256213525245161033052 0ustar ellertellert Widget Light Blue 33 ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/ComplexTypeSequence-ComplexTypeSequence01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/ComplexTypeSequenc0000755000175000017500000000211013525245161033053 0ustar ellertellert Widget Light Blue 33 ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/echoComplexTypeSequence-ComplexTypeSequence02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/echoComplexTypeSeq0000755000175000017500000000215113525245161033044 0ustar ellertellert Widget Green 1233 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/echoComplexTypeSequence-ComplexTypeSequence01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/echoComplexTypeSeq0000755000175000017500000000256413525245161033054 0ustar ellertellert Widget Light Blue 33 ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/echoComplexTypeSequence-ComplexTypeSequence01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/echoComplexTypeSeq0000755000175000017500000000215513525245161033050 0ustar ellertellert Widget Light Blue 33 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/echoComplexTypeSequence-ComplexTypeSequence02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequence/echoComplexTypeSeq0000755000175000017500000000255613525245161033055 0ustar ellertellert Widget Green 1233 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/0000755000175000017500000000000013525245162031655 5ustar ellertellert././@LongLink0000644000000000000000000000026300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/echoElementMinOccurs0MaxOccursFinite-ElementMinOccurs0MaxOccursFinite102-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/echoE0000755000175000017500000000237613525245162032636 0ustar ellertellert red green ././@LongLink0000644000000000000000000000025400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/echoElementMinOccurs0MaxOccursFinite-ElementMinOccurs0MaxOccursFinite102.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/echoE0000755000175000017500000000176313525245162032635 0ustar ellertellert red green ././@LongLink0000644000000000000000000000025400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/echoElementMinOccurs0MaxOccursFinite-ElementMinOccurs0MaxOccursFinite101.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/echoE0000755000175000017500000000160613525245162032631 0ustar ellertellert ././@LongLink0000644000000000000000000000025000000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/ElementMinOccurs0MaxOccursFinite-ElementMinOccurs0MaxOccursFinite102.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/Eleme0000755000175000017500000000166013525245162032635 0ustar ellertellert red green ././@LongLink0000644000000000000000000000025000000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/ElementMinOccurs0MaxOccursFinite-ElementMinOccurs0MaxOccursFinite101.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/Eleme0000755000175000017500000000150313525245162032631 0ustar ellertellert ././@LongLink0000644000000000000000000000026300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/echoElementMinOccurs0MaxOccursFinite-ElementMinOccurs0MaxOccursFinite102-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/echoE0000755000175000017500000000237413525245162032634 0ustar ellertellert red green ././@LongLink0000644000000000000000000000026300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/echoElementMinOccurs0MaxOccursFinite-ElementMinOccurs0MaxOccursFinite101-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/echoE0000755000175000017500000000220613525245162032626 0ustar ellertellert ././@LongLink0000644000000000000000000000026300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/echoElementMinOccurs0MaxOccursFinite-ElementMinOccurs0MaxOccursFinite101-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursFinite/echoE0000755000175000017500000000220413525245162032624 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteSimpleTypePattern/0000755000175000017500000000000013525245161027651 5ustar ellertellert././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteSimpleTypePattern/ByteSimpleTypePattern-ByteSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteSimpleTypePattern/ByteSimpleTypePa0000755000175000017500000000163213525245161033001 0ustar ellertellert 1././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteSimpleTypePattern/echoByteSimpleTypePattern-ByteSimpleTypePattern01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteSimpleTypePattern/echoByteSimpleTy0000755000175000017500000000224313525245161033031 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteSimpleTypePattern/echoByteSimpleTypePattern-ByteSimpleTypePattern01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteSimpleTypePattern/echoByteSimpleTy0000755000175000017500000000224113525245161033027 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteSimpleTypePattern/echoByteSimpleTypePattern-ByteSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteSimpleTypePattern/echoByteSimpleTy0000755000175000017500000000167313525245161033037 0ustar ellertellert 1 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDaySimpleTypePattern/0000755000175000017500000000000013525245162027573 5ustar ellertellert././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDaySimpleTypePattern/GDaySimpleTypePattern-GDaySimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDaySimpleTypePattern/GDaySimpleTypePa0000755000175000017500000000163613525245162032650 0ustar ellertellert ---01././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDaySimpleTypePattern/echoGDaySimpleTypePattern-GDaySimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDaySimpleTypePattern/echoGDaySimpleTy0000755000175000017500000000167713525245162032706 0ustar ellertellert ---01 ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDaySimpleTypePattern/echoGDaySimpleTypePattern-GDaySimpleTypePattern01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDaySimpleTypePattern/echoGDaySimpleTy0000755000175000017500000000224513525245162032676 0ustar ellertellert ---01 ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDaySimpleTypePattern/echoGDaySimpleTypePattern-GDaySimpleTypePattern01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDaySimpleTypePattern/echoGDaySimpleTy0000755000175000017500000000224713525245162032700 0ustar ellertellert ---01 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/0000755000175000017500000000000013525245162032502 5ustar ellertellert././@LongLink0000644000000000000000000000027300000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/echoNonNegativeIntegerSimpleTypePattern-NonNegativeIntegerSimpleTypePattern02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/ec0000755000175000017500000000235113525245162033020 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000026400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/echoNonNegativeIntegerSimpleTypePattern-NonNegativeIntegerSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/ec0000755000175000017500000000203713525245162033021 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000027300000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/echoNonNegativeIntegerSimpleTypePattern-NonNegativeIntegerSimpleTypePattern01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/ec0000755000175000017500000000235313525245162033022 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000026400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/echoNonNegativeIntegerSimpleTypePattern-NonNegativeIntegerSimpleTypePattern02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/ec0000755000175000017500000000203713525245162033021 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000026000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/NonNegativeIntegerSimpleTypePattern-NonNegativeIntegerSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/No0000755000175000017500000000176013525245162033010 0ustar ellertellert 123././@LongLink0000644000000000000000000000027300000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/echoNonNegativeIntegerSimpleTypePattern-NonNegativeIntegerSimpleTypePattern01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/ec0000755000175000017500000000235113525245162033020 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000027300000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/echoNonNegativeIntegerSimpleTypePattern-NonNegativeIntegerSimpleTypePattern02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/ec0000755000175000017500000000235313525245162033022 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000026000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/NonNegativeIntegerSimpleTypePattern-NonNegativeIntegerSimpleTypePattern02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerSimpleTypePattern/No0000755000175000017500000000176013525245162033010 0ustar ellertellert 009gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LocalElementComplexType/0000755000175000017500000000000013525245162030133 5ustar ellertellert././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LocalElementComplexType/LocalElementComplexType-LocalElementComplexType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LocalElementComplexType/LocalElementCo0000755000175000017500000000204713525245162032712 0ustar ellertellert Paul Paul ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LocalElementComplexType/echoLocalElementComplexType-LocalElementComplexType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LocalElementComplexType/echoLocalEleme0000755000175000017500000000211213525245162032716 0ustar ellertellert Paul Paul ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LocalElementComplexType/echoLocalElementComplexType-LocalElementComplexType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LocalElementComplexType/echoLocalEleme0000755000175000017500000000250313525245162032722 0ustar ellertellert Paul Paul ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LocalElementComplexType/echoLocalElementComplexType-LocalElementComplexType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LocalElementComplexType/echoLocalEleme0000755000175000017500000000250113525245162032720 0ustar ellertellert Paul Paul gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryAttribute/0000755000175000017500000000000013525245161027451 5ustar ellertellert././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryAttribute/echoBase64BinaryAttribute-Base64BinaryAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryAttribute/echoBase64Binary0000755000175000017500000000173513525245161032435 0ustar ellertellert ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryAttribute/Base64BinaryAttribute-Base64BinaryAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryAttribute/Base64BinaryAttr0000755000175000017500000000167113525245161032430 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryAttribute/echoBase64BinaryAttribute-Base64BinaryAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryAttribute/echoBase64Binary0000755000175000017500000000231313525245161032426 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryAttribute/echoBase64BinaryAttribute-Base64BinaryAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryAttribute/echoBase64Binary0000755000175000017500000000231113525245161032424 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDaySimpleTypePattern/0000755000175000017500000000000013525245162030601 5ustar ellertellert././@LongLink0000644000000000000000000000024000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDaySimpleTypePattern/echoGMonthDaySimpleTypePattern-GMonthDaySimpleTypePattern01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDaySimpleTypePattern/echoGMonthD0000755000175000017500000000230213525245162032663 0ustar ellertellert --12-01 ././@LongLink0000644000000000000000000000022500000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDaySimpleTypePattern/GMonthDaySimpleTypePattern-GMonthDaySimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDaySimpleTypePattern/GMonthDaySi0000755000175000017500000000167613525245162032667 0ustar ellertellert --12-01././@LongLink0000644000000000000000000000024000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDaySimpleTypePattern/echoGMonthDaySimpleTypePattern-GMonthDaySimpleTypePattern01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDaySimpleTypePattern/echoGMonthD0000755000175000017500000000230013525245162032661 0ustar ellertellert --12-01 ././@LongLink0000644000000000000000000000023100000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDaySimpleTypePattern/echoGMonthDaySimpleTypePattern-GMonthDaySimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDaySimpleTypePattern/echoGMonthD0000755000175000017500000000174413525245162032674 0ustar ellertellert --12-01 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/0000755000175000017500000000000013525245162032541 5ustar ellertellert././@LongLink0000644000000000000000000000027700000000000011611 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/echoSequenceMinOccurs0MaxOccursUnbounded-SequenceMinOccurs0MaxOccursUnbounded101-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/e0000755000175000017500000000301713525245162032714 0ustar ellertellert 44 33 24 45 64 22 ././@LongLink0000644000000000000000000000027700000000000011611 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/echoSequenceMinOccurs0MaxOccursUnbounded-SequenceMinOccurs0MaxOccursUnbounded102-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/e0000755000175000017500000000224413525245162032715 0ustar ellertellert ././@LongLink0000644000000000000000000000026400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/SequenceMinOccurs0MaxOccursUnbounded-SequenceMinOccurs0MaxOccursUnbounded102.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/S0000755000175000017500000000157213525245162032676 0ustar ellertellert ././@LongLink0000644000000000000000000000027000000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/echoSequenceMinOccurs0MaxOccursUnbounded-SequenceMinOccurs0MaxOccursUnbounded102.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/e0000755000175000017500000000167213525245162032721 0ustar ellertellert ././@LongLink0000644000000000000000000000027000000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/echoSequenceMinOccurs0MaxOccursUnbounded-SequenceMinOccurs0MaxOccursUnbounded101.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/e0000755000175000017500000000241413525245162032714 0ustar ellertellert 44 33 24 45 64 22 ././@LongLink0000644000000000000000000000027700000000000011611 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/echoSequenceMinOccurs0MaxOccursUnbounded-SequenceMinOccurs0MaxOccursUnbounded102-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/e0000755000175000017500000000224213525245162032713 0ustar ellertellert ././@LongLink0000644000000000000000000000026400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/SequenceMinOccurs0MaxOccursUnbounded-SequenceMinOccurs0MaxOccursUnbounded101.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/S0000755000175000017500000000231413525245162032671 0ustar ellertellert 44 33 24 45 64 22 ././@LongLink0000644000000000000000000000027700000000000011611 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/echoSequenceMinOccurs0MaxOccursUnbounded-SequenceMinOccurs0MaxOccursUnbounded101-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0MaxOccursUnbounded/e0000755000175000017500000000302113525245162032707 0ustar ellertellert 44 33 24 45 64 22 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/0000755000175000017500000000000013525245161031600 5ustar ellertellert././@LongLink0000644000000000000000000000025700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/echoDecimalSimpleTypeFractionDigits-DecimalSimpleTypeFractionDigits01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/echoDe0000755000175000017500000000233113525245161032714 0ustar ellertellert 1234.00 ././@LongLink0000644000000000000000000000025000000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/echoDecimalSimpleTypeFractionDigits-DecimalSimpleTypeFractionDigits01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/echoDe0000755000175000017500000000200713525245161032714 0ustar ellertellert 1234.00 ././@LongLink0000644000000000000000000000025700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/echoDecimalSimpleTypeFractionDigits-DecimalSimpleTypeFractionDigits02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/echoDe0000755000175000017500000000232613525245161032720 0ustar ellertellert 1234 ././@LongLink0000644000000000000000000000024400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/DecimalSimpleTypeFractionDigits-DecimalSimpleTypeFractionDigits02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/Decima0000755000175000017500000000173113525245161032712 0ustar ellertellert 1234././@LongLink0000644000000000000000000000025700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/echoDecimalSimpleTypeFractionDigits-DecimalSimpleTypeFractionDigits01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/echoDe0000755000175000017500000000233313525245161032716 0ustar ellertellert 1234.00 ././@LongLink0000644000000000000000000000024400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/DecimalSimpleTypeFractionDigits-DecimalSimpleTypeFractionDigits01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/Decima0000755000175000017500000000173413525245161032715 0ustar ellertellert 1234.00././@LongLink0000644000000000000000000000025000000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/echoDecimalSimpleTypeFractionDigits-DecimalSimpleTypeFractionDigits02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/echoDe0000755000175000017500000000200413525245161032711 0ustar ellertellert 1234 ././@LongLink0000644000000000000000000000025700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/echoDecimalSimpleTypeFractionDigits-DecimalSimpleTypeFractionDigits02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypeFractionDigits/echoDe0000755000175000017500000000233013525245161032713 0ustar ellertellert 1234 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/0000755000175000017500000000000013525245161027077 5ustar ellertellert././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/Base64BinaryElement-Base64BinaryElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/Base64BinaryElemen0000755000175000017500000000162513525245161032350 0ustar ellertellert eHdmb3Rh././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/Base64BinaryElement-Base64BinaryElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/Base64BinaryElemen0000755000175000017500000000162113525245161032344 0ustar ellertellert bQ==././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryElement-Base64BinaryElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryEl0000755000175000017500000000225013525245161032335 0ustar ellertellert cnRjbGNyZW9scg== ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryElement-Base64BinaryElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryEl0000755000175000017500000000224013525245161032334 0ustar ellertellert eHdmb3Rh ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryElement-Base64BinaryElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryEl0000755000175000017500000000223213525245161032335 0ustar ellertellert bQ== ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryElement-Base64BinaryElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryEl0000755000175000017500000000166013525245161032341 0ustar ellertellert bQ== ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryElement-Base64BinaryElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryEl0000755000175000017500000000167413525245161032346 0ustar ellertellert cnRjbGNyZW9scg== ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryElement-Base64BinaryElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryEl0000755000175000017500000000224613525245161032342 0ustar ellertellert cnRjbGNyZW9scg== ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/Base64BinaryElement-Base64BinaryElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/Base64BinaryElemen0000755000175000017500000000163513525245161032351 0ustar ellertellert cnRjbGNyZW9scg==././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryElement-Base64BinaryElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryEl0000755000175000017500000000223413525245161032337 0ustar ellertellert bQ== ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryElement-Base64BinaryElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryEl0000755000175000017500000000166413525245161032345 0ustar ellertellert eHdmb3Rh ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryElement-Base64BinaryElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Base64BinaryElement/echoBase64BinaryEl0000755000175000017500000000223613525245161032341 0ustar ellertellert eHdmb3Rh gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequence/0000755000175000017500000000000013525245162027600 5ustar ellertellert././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequence/GlobalElementSequence-GlobalElementSequence01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequence/GlobalElementSeq0000755000175000017500000000173213525245162032714 0ustar ellertellert one two ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequence/echoGlobalElementSequence-GlobalElementSequence01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequence/echoGlobalElemen0000755000175000017500000000235613525245162032721 0ustar ellertellert one two ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequence/echoGlobalElementSequence-GlobalElementSequence01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequence/echoGlobalElemen0000755000175000017500000000235413525245162032717 0ustar ellertellert one two ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequence/echoGlobalElementSequence-GlobalElementSequence01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequence/echoGlobalElemen0000755000175000017500000000177313525245162032723 0ustar ellertellert one two gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/0000755000175000017500000000000013525245162026647 5ustar ellertellert././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/RestrictedLength-RestrictedLength01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/RestrictedLength-Rest0000755000175000017500000000157513525245162032772 0ustar ellertellert en././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/RestrictedLength-RestrictedLength02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/RestrictedLength-Rest0000755000175000017500000000157513525245162032772 0ustar ellertellert FR././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/echoRestrictedLength-RestrictedLength01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/echoRestrictedLength-0000755000175000017500000000163113525245162032764 0ustar ellertellert en ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/echoRestrictedLength-RestrictedLength02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/echoRestrictedLength-0000755000175000017500000000221113525245162032757 0ustar ellertellert FR ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/echoRestrictedLength-RestrictedLength01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/echoRestrictedLength-0000755000175000017500000000221113525245162032757 0ustar ellertellert en ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/echoRestrictedLength-RestrictedLength02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/echoRestrictedLength-0000755000175000017500000000163113525245162032764 0ustar ellertellert FR ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/echoRestrictedLength-RestrictedLength02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/echoRestrictedLength-0000755000175000017500000000221313525245162032761 0ustar ellertellert FR ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/echoRestrictedLength-RestrictedLength01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedLength/echoRestrictedLength-0000755000175000017500000000221313525245162032761 0ustar ellertellert en gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthSimpleTypePattern/0000755000175000017500000000000013525245162030143 5ustar ellertellert././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthSimpleTypePattern/echoGMonthSimpleTypePattern-GMonthSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthSimpleTypePattern/echoGMonthSimp0000755000175000017500000000171413525245162032760 0ustar ellertellert --11 ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthSimpleTypePattern/echoGMonthSimpleTypePattern-GMonthSimpleTypePattern01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthSimpleTypePattern/echoGMonthSimp0000755000175000017500000000225613525245162032762 0ustar ellertellert --11 ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthSimpleTypePattern/echoGMonthSimpleTypePattern-GMonthSimpleTypePattern01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthSimpleTypePattern/echoGMonthSimp0000755000175000017500000000226013525245162032755 0ustar ellertellert --11 ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthSimpleTypePattern/GMonthSimpleTypePattern-GMonthSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthSimpleTypePattern/GMonthSimpleTy0000755000175000017500000000165113525245162032757 0ustar ellertellert --11gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleContentAnyAttribute/0000755000175000017500000000000013525245162030515 5ustar ellertellert././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleContentAnyAttribute/SimpleContentAnyAttribute-SimpleContentAnyAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleContentAnyAttribute/SimpleConten0000755000175000017500000000174613525245162033053 0ustar ellertellert string././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleContentAnyAttribute/echoSimpleContentAnyAttribute-SimpleContentAnyAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleContentAnyAttribute/echoSimpleCo0000755000175000017500000000236413525245162033022 0ustar ellertellert string ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleContentAnyAttribute/echoSimpleContentAnyAttribute-SimpleContentAnyAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleContentAnyAttribute/echoSimpleCo0000755000175000017500000000201613525245162033014 0ustar ellertellert string ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleContentAnyAttribute/echoSimpleContentAnyAttribute-SimpleContentAnyAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleContentAnyAttribute/echoSimpleCo0000755000175000017500000000236213525245162033020 0ustar ellertellert string gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITYAttribute/0000755000175000017500000000000013525245162026275 5ustar ellertellert././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITYAttribute/echoENTITYAttribute-ENTITYAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITYAttribute/echoENTITYAttribute-EN0000755000175000017500000000222713525245162032265 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITYAttribute/echoENTITYAttribute-ENTITYAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITYAttribute/echoENTITYAttribute-EN0000755000175000017500000000223113525245162032260 0ustar ellertellert ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITYAttribute/echoENTITYAttribute-ENTITYAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITYAttribute/echoENTITYAttribute-EN0000755000175000017500000000163713525245162032271 0ustar ellertellert ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITYAttribute/ENTITYAttribute-ENTITYAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITYAttribute/ENTITYAttribute-ENTITY0000755000175000017500000000160113525245162032133 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyURIElement/0000755000175000017500000000000013525245161026015 5ustar ellertellert././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyURIElement/echoAnyURIElement-AnyURIElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyURIElement/echoAnyURIElement-AnyURI0000755000175000017500000000165013525245161032332 0ustar ellertellert http://www.w3.org/2002/ws/databinding/ ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyURIElement/AnyURIElement-AnyURIElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyURIElement/AnyURIElement-AnyURIElem0000755000175000017500000000161713525245161032301 0ustar ellertellert http://www.w3.org/2002/ws/databinding/././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyURIElement/echoAnyURIElement-AnyURIElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyURIElement/echoAnyURIElement-AnyURI0000755000175000017500000000223613525245161032333 0ustar ellertellert http://www.w3.org/2002/ws/databinding/ ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyURIElement/echoAnyURIElement-AnyURIElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyURIElement/echoAnyURIElement-AnyURI0000755000175000017500000000224013525245161032326 0ustar ellertellert http://www.w3.org/2002/ws/databinding/ gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringAttribute/0000755000175000017500000000000013525245162030554 5ustar ellertellert././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringAttribute/echoNormalizedStringAttribute-NormalizedStringAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringAttribute/echoNormaliz0000755000175000017500000000177013525245162033141 0ustar ellertellert ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringAttribute/NormalizedStringAttribute-NormalizedStringAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringAttribute/NormalizedSt0000755000175000017500000000172013525245162033115 0ustar ellertellert ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringAttribute/echoNormalizedStringAttribute-NormalizedStringAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringAttribute/echoNormaliz0000755000175000017500000000233613525245162033140 0ustar ellertellert ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringAttribute/echoNormalizedStringAttribute-NormalizedStringAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringAttribute/echoNormaliz0000755000175000017500000000233413525245162033136 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenAttribute/0000755000175000017500000000000013525245162026341 5ustar ellertellert././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenAttribute/echoTokenAttribute-TokenAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenAttribute/echoTokenAttribute-Toke0000755000175000017500000000163213525245162032774 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenAttribute/echoTokenAttribute-TokenAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenAttribute/echoTokenAttribute-Toke0000755000175000017500000000222613525245162032774 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenAttribute/echoTokenAttribute-TokenAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenAttribute/echoTokenAttribute-Toke0000755000175000017500000000222413525245162032772 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenAttribute/TokenAttribute-TokenAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenAttribute/TokenAttribute-TokenAtt0000755000175000017500000000157513525245162032772 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeUnqualifiedType/0000755000175000017500000000000013525245162031512 5ustar ellertellert././@LongLink0000644000000000000000000000024500000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeUnqualifiedType/echoGlobalAttributeUnqualifiedType-GlobalAttributeUnqualifiedType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeUnqualifiedType/echoGlo0000755000175000017500000000230613525245162033021 0ustar ellertellert another string ././@LongLink0000644000000000000000000000025400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeUnqualifiedType/echoGlobalAttributeUnqualifiedType-GlobalAttributeUnqualifiedType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeUnqualifiedType/echoGlo0000755000175000017500000000265113525245162033024 0ustar ellertellert another string ././@LongLink0000644000000000000000000000025400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeUnqualifiedType/echoGlobalAttributeUnqualifiedType-GlobalAttributeUnqualifiedType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeUnqualifiedType/echoGlo0000755000175000017500000000264713525245162033031 0ustar ellertellert another string ././@LongLink0000644000000000000000000000024100000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeUnqualifiedType/GlobalAttributeUnqualifiedType-GlobalAttributeUnqualifiedType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeUnqualifiedType/GlobalA0000755000175000017500000000223113525245162032737 0ustar ellertellert another string gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/0000755000175000017500000000000013525245161026163 5ustar ellertellert././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAt0000755000175000017500000000162113525245161032725 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAttribute02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAt0000755000175000017500000000221413525245161032724 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAt0000755000175000017500000000221513525245161032725 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAttribute03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAt0000755000175000017500000000221513525245161032725 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAttribute03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAt0000755000175000017500000000221713525245161032727 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/ByteAttribute-ByteAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/ByteAttribute-ByteAttrib0000755000175000017500000000156313525245161032754 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAttribute02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAt0000755000175000017500000000221613525245161032726 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/ByteAttribute-ByteAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/ByteAttribute-ByteAttrib0000755000175000017500000000156513525245161032756 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAt0000755000175000017500000000221313525245161032723 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAt0000755000175000017500000000161713525245161032732 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/ByteAttribute-ByteAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/ByteAttribute-ByteAttrib0000755000175000017500000000156413525245161032755 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteAttribute/echoByteAttribute-ByteAt0000755000175000017500000000162013525245161032724 0ustar ellertellert ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeSequenceExtension/gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeSequenceExtens0000755000175000017500000000000013525245162033102 5ustar ellertellert././@LongLink0000644000000000000000000000030600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeSequenceExtension/echoGlobalElementComplexTypeSequenceExtension-GlobalElementComplexTypeSequenceExtension01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeSequenceExtens0000755000175000017500000000216413525245162033112 0ustar ellertellert some data ././@LongLink0000644000000000000000000000030200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeSequenceExtension/GlobalElementComplexTypeSequenceExtension-GlobalElementComplexTypeSequenceExtension01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeSequenceExtens0000755000175000017500000000207713525245162033115 0ustar ellertellert some data ././@LongLink0000644000000000000000000000031500000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeSequenceExtension/echoGlobalElementComplexTypeSequenceExtension-GlobalElementComplexTypeSequenceExtension01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeSequenceExtens0000755000175000017500000000247313525245162033115 0ustar ellertellert some data ././@LongLink0000644000000000000000000000031500000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeSequenceExtension/echoGlobalElementComplexTypeSequenceExtension-GlobalElementComplexTypeSequenceExtension01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementComplexTypeSequenceExtens0000755000175000017500000000247113525245162033113 0ustar ellertellert some data gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/0000755000175000017500000000000013525245162027136 5ustar ellertellert././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElement-UnsignedIntElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElem0000755000175000017500000000164713525245162032765 0ustar ellertellert -0 ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/UnsignedIntElement-UnsignedIntElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/UnsignedIntElement-0000755000175000017500000000161213525245162032702 0ustar ellertellert +42././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElement-UnsignedIntElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElem0000755000175000017500000000222213525245162032753 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElement-UnsignedIntElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElem0000755000175000017500000000222413525245162032755 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElement-UnsignedIntElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElem0000755000175000017500000000165013525245162032757 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElement-UnsignedIntElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElem0000755000175000017500000000164613525245162032764 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElement-UnsignedIntElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElem0000755000175000017500000000165713525245162032766 0ustar ellertellert 4294967295 ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElement-UnsignedIntElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElem0000755000175000017500000000222513525245162032756 0ustar ellertellert -0 ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElement-UnsignedIntElement04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElem0000755000175000017500000000223513525245162032757 0ustar ellertellert 4294967295 ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElement-UnsignedIntElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElem0000755000175000017500000000222313525245162032754 0ustar ellertellert -0 ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/UnsignedIntElement-UnsignedIntElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/UnsignedIntElement-0000755000175000017500000000161113525245162032701 0ustar ellertellert -0././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElement-UnsignedIntElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElem0000755000175000017500000000222413525245162032755 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElement-UnsignedIntElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElem0000755000175000017500000000222613525245162032757 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElement-UnsignedIntElement04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/echoUnsignedIntElem0000755000175000017500000000223313525245162032755 0ustar ellertellert 4294967295 ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/UnsignedIntElement-UnsignedIntElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/UnsignedIntElement-0000755000175000017500000000161013525245162032700 0ustar ellertellert 1././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/UnsignedIntElement-UnsignedIntElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntElement/UnsignedIntElement-0000755000175000017500000000162113525245162032702 0ustar ellertellert 4294967295gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatEnumerationType/0000755000175000017500000000000013525245162027513 5ustar ellertellert././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatEnumerationType/echoFloatEnumerationType-FloatEnumerationType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatEnumerationType/echoFloatEnumerat0000755000175000017500000000225013525245162033045 0ustar ellertellert 1267.43233E12 ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatEnumerationType/FloatEnumerationType-FloatEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatEnumerationType/FloatEnumerationT0000755000175000017500000000164013525245162033042 0ustar ellertellert 1267.43233E12././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatEnumerationType/echoFloatEnumerationType-FloatEnumerationType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatEnumerationType/echoFloatEnumerat0000755000175000017500000000225213525245162033047 0ustar ellertellert 1267.43233E12 ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatEnumerationType/echoFloatEnumerationType-FloatEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatEnumerationType/echoFloatEnumerat0000755000175000017500000000170013525245162033044 0ustar ellertellert 1267.43233E12 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMaxLength/0000755000175000017500000000000013525245162030504 5ustar ellertellert././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMaxLength/RestrictedStringMaxLength-RestrictedStringMaxLength01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMaxLength/RestrictedSt0000755000175000017500000000167513525245162033062 0ustar ellertellert String Value././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMaxLength/echoRestrictedStringMaxLength-RestrictedStringMaxLength01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMaxLength/echoRestrict0000755000175000017500000000174213525245162033074 0ustar ellertellert String Value ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMaxLength/echoRestrictedStringMaxLength-RestrictedStringMaxLength01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMaxLength/echoRestrict0000755000175000017500000000230213525245162033065 0ustar ellertellert String Value ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMaxLength/echoRestrictedStringMaxLength-RestrictedStringMaxLength01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMaxLength/echoRestrict0000755000175000017500000000230013525245162033063 0ustar ellertellert String Value gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/0000755000175000017500000000000013525245162026270 5ustar ellertellert././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000223313525245162032573 0ustar ellertellert ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000163113525245162032574 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000222313525245162032572 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute05-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000223313525245162032573 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000222513525245162032574 0ustar ellertellert ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000163713525245162032602 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000222513525245162032574 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute05-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000223113525245162032571 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/GYearAttribute-GYearAttribute06.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/GYearAttribute-GYearAtt0000755000175000017500000000157513525245162032577 0ustar ellertellert ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000163113525245162032574 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute06-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000222613525245162032575 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000223113525245162032571 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute07-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000222613525245162032575 0ustar ellertellert ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute06.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000163213525245162032575 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute07-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000222413525245162032573 0ustar ellertellert ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000163113525245162032574 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/GYearAttribute-GYearAttribute05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/GYearAttribute-GYearAtt0000755000175000017500000000160213525245162032566 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000222513525245162032574 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute06-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000222413525245162032573 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000222313525245162032572 0ustar ellertellert ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000163713525245162032602 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/GYearAttribute-GYearAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/GYearAttribute-GYearAtt0000755000175000017500000000157413525245162032576 0ustar ellertellert ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute07.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000163213525245162032575 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/GYearAttribute-GYearAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/GYearAttribute-GYearAtt0000755000175000017500000000157413525245162032576 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/GYearAttribute-GYearAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/GYearAttribute-GYearAtt0000755000175000017500000000160213525245162032566 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYearAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/echoGYearAttribute-GYea0000755000175000017500000000222313525245162032572 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/GYearAttribute-GYearAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/GYearAttribute-GYearAtt0000755000175000017500000000157413525245162032576 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/GYearAttribute-GYearAttribute07.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearAttribute/GYearAttribute-GYearAtt0000755000175000017500000000157513525245162032577 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/0000755000175000017500000000000013525245161030304 5ustar ellertellert././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/echoDecimalSimpleTypePattern-DecimalSimpleTypePattern02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/echoDecimalSi0000755000175000017500000000172613525245161032731 0ustar ellertellert 9898.00 ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/echoDecimalSimpleTypePattern-DecimalSimpleTypePattern01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/echoDecimalSi0000755000175000017500000000227013525245161032724 0ustar ellertellert 1234.12 ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/echoDecimalSimpleTypePattern-DecimalSimpleTypePattern01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/echoDecimalSi0000755000175000017500000000226613525245161032731 0ustar ellertellert 1234.12 ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/echoDecimalSimpleTypePattern-DecimalSimpleTypePattern02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/echoDecimalSi0000755000175000017500000000226613525245161032731 0ustar ellertellert 9898.00 ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/DecimalSimpleTypePattern-DecimalSimpleTypePattern02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/DecimalSimple0000755000175000017500000000166213525245161032747 0ustar ellertellert 9898.00././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/echoDecimalSimpleTypePattern-DecimalSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/echoDecimalSi0000755000175000017500000000172613525245161032731 0ustar ellertellert 1234.12 ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/DecimalSimpleTypePattern-DecimalSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/DecimalSimple0000755000175000017500000000166213525245161032747 0ustar ellertellert 1234.12././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/echoDecimalSimpleTypePattern-DecimalSimpleTypePattern02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalSimpleTypePattern/echoDecimalSi0000755000175000017500000000227013525245161032724 0ustar ellertellert 9898.00 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/0000755000175000017500000000000013525245161026644 5ustar ellertellert././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/AttributeDefault-AttributeDefault01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/AttributeDefault-Attr0000755000175000017500000000154613525245161032760 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-AttributeDefault03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-0000755000175000017500000000224213525245161032756 0ustar ellertellert ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-AttributeDefault03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-0000755000175000017500000000165413525245161032764 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-AttributeDefault01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-0000755000175000017500000000216413525245161032761 0ustar ellertellert ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-AttributeDefault04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-0000755000175000017500000000167013525245161032762 0ustar ellertellert ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-AttributeDefault01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-0000755000175000017500000000160213525245161032755 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-AttributeDefault01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-0000755000175000017500000000216213525245161032757 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-AttributeDefault04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-0000755000175000017500000000226013525245161032756 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-AttributeDefault04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-0000755000175000017500000000225613525245161032763 0ustar ellertellert ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/AttributeDefault-AttributeDefault03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/AttributeDefault-Attr0000755000175000017500000000161513525245161032755 0ustar ellertellert ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/AttributeDefault-AttributeDefault02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/AttributeDefault-Attr0000755000175000017500000000163413525245161032756 0ustar ellertellert ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-AttributeDefault02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-0000755000175000017500000000167313525245161032765 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-AttributeDefault03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-0000755000175000017500000000224413525245161032760 0ustar ellertellert ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/AttributeDefault-AttributeDefault04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/AttributeDefault-Attr0000755000175000017500000000163113525245161032753 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-AttributeDefault02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-0000755000175000017500000000226113525245161032757 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-AttributeDefault02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeDefault/echoAttributeDefault-0000755000175000017500000000226313525245161032761 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeEmptyExtension/0000755000175000017500000000000013525245162031703 5ustar ellertellert././@LongLink0000644000000000000000000000024400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeEmptyExtension/GlobalComplexTypeEmptyExtension-GlobalComplexTypeEmptyExtension01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeEmptyExtension/Global0000755000175000017500000000166113525245162033035 0ustar ellertellert ././@LongLink0000644000000000000000000000025700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeEmptyExtension/echoGlobalComplexTypeEmptyExtension-GlobalComplexTypeEmptyExtension01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeEmptyExtension/echoGl0000755000175000017500000000226013525245162033032 0ustar ellertellert ././@LongLink0000644000000000000000000000025700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeEmptyExtension/echoGlobalComplexTypeEmptyExtension-GlobalComplexTypeEmptyExtension01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeEmptyExtension/echoGl0000755000175000017500000000225613525245162033037 0ustar ellertellert ././@LongLink0000644000000000000000000000025000000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeEmptyExtension/echoGlobalComplexTypeEmptyExtension-GlobalComplexTypeEmptyExtension01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeEmptyExtension/echoGl0000755000175000017500000000173413525245162033037 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/0000755000175000017500000000000013525245162030636 5ustar ellertellert././@LongLink0000644000000000000000000000024000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/echoSequenceMaxOccursUnbounded-SequenceMaxOccursUnbounded02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/echoSequenc0000755000175000017500000000241013525245162033023 0ustar ellertellert 2006-01-26 1-44795-912-6 ././@LongLink0000644000000000000000000000024000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/echoSequenceMaxOccursUnbounded-SequenceMaxOccursUnbounded02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/echoSequenc0000755000175000017500000000241213525245162033025 0ustar ellertellert 2006-01-26 1-44795-912-6 ././@LongLink0000644000000000000000000000024000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/echoSequenceMaxOccursUnbounded-SequenceMaxOccursUnbounded01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/echoSequenc0000755000175000017500000000322413525245162033027 0ustar ellertellert 2002-09-24 1-55960-907-6 2003-04-14 1-25466-908-6 2004-03-31 1-35460-909-6 2005-06-04 1-54560-910-6 2006-07-03 1-74869-911-6 ././@LongLink0000644000000000000000000000023100000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/echoSequenceMaxOccursUnbounded-SequenceMaxOccursUnbounded02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/echoSequenc0000755000175000017500000000201513525245162033024 0ustar ellertellert 2006-01-26 1-44795-912-6 ././@LongLink0000644000000000000000000000024000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/echoSequenceMaxOccursUnbounded-SequenceMaxOccursUnbounded01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/echoSequenc0000755000175000017500000000322613525245162033031 0ustar ellertellert 2002-09-24 1-55960-907-6 2003-04-14 1-25466-908-6 2004-03-31 1-35460-909-6 2005-06-04 1-54560-910-6 2006-07-03 1-74869-911-6 ././@LongLink0000644000000000000000000000022500000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/SequenceMaxOccursUnbounded-SequenceMaxOccursUnbounded01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/SequenceMax0000755000175000017500000000251113525245162033001 0ustar ellertellert 2002-09-24 1-55960-907-6 2003-04-14 1-25466-908-6 2004-03-31 1-35460-909-6 2005-06-04 1-54560-910-6 2006-07-03 1-74869-911-6 ././@LongLink0000644000000000000000000000022500000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/SequenceMaxOccursUnbounded-SequenceMaxOccursUnbounded02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/SequenceMax0000755000175000017500000000173513525245162033010 0ustar ellertellert 2006-01-26 1-44795-912-6 ././@LongLink0000644000000000000000000000023100000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/echoSequenceMaxOccursUnbounded-SequenceMaxOccursUnbounded01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursUnbounded/echoSequenc0000755000175000017500000000257113525245162033033 0ustar ellertellert 2002-09-24 1-55960-907-6 2003-04-14 1-25466-908-6 2004-03-31 1-35460-909-6 2005-06-04 1-54560-910-6 2006-07-03 1-74869-911-6 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleContent/0000755000175000017500000000000013525245162027642 5ustar ellertellert././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleContent/echoExtendedSimpleContent-ExtendedSimpleContent01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleContent/echoExtendedSimp0000755000175000017500000000233613525245162033024 0ustar ellertellert string ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleContent/echoExtendedSimpleContent-ExtendedSimpleContent01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleContent/echoExtendedSimp0000755000175000017500000000176013525245162033024 0ustar ellertellert string ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleContent/echoExtendedSimpleContent-ExtendedSimpleContent01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleContent/echoExtendedSimp0000755000175000017500000000233413525245162033022 0ustar ellertellert string ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleContent/ExtendedSimpleContent-ExtendedSimpleContent01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleContent/ExtendedSimpleCo0000755000175000017500000000171413525245162032767 0ustar ellertellert stringgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/0000755000175000017500000000000013525245162030033 5ustar ellertellert././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/echoRestrictedMinInclusive-RestrictedMinInclusive02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/echoRestrictedM0000755000175000017500000000225013525245162033044 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/RestrictedMinInclusive-RestrictedMinInclusive02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/RestrictedMinIn0000755000175000017500000000164013525245162033025 0ustar ellertellert 2././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/echoRestrictedMinInclusive-RestrictedMinInclusive02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/echoRestrictedM0000755000175000017500000000170213525245162033045 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/echoRestrictedMinInclusive-RestrictedMinInclusive01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/echoRestrictedM0000755000175000017500000000225013525245162033044 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/echoRestrictedMinInclusive-RestrictedMinInclusive01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/echoRestrictedM0000755000175000017500000000170213525245162033045 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/echoRestrictedMinInclusive-RestrictedMinInclusive02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/echoRestrictedM0000755000175000017500000000224613525245162033051 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/echoRestrictedMinInclusive-RestrictedMinInclusive01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/echoRestrictedM0000755000175000017500000000224613525245162033051 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/RestrictedMinInclusive-RestrictedMinInclusive01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinInclusive/RestrictedMinIn0000755000175000017500000000164013525245162033025 0ustar ellertellert 1gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/0000755000175000017500000000000013525245162026674 5ustar ellertellert././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/echoElementMaxOccurs1-ElementMaxOccurs102-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/echoElementMaxOccurs0000755000175000017500000000227113525245162032701 0ustar ellertellert 4 ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/ElementMaxOccurs1-ElementMaxOccurs101.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/ElementMaxOccurs1-El0000755000175000017500000000165013525245162032461 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/echoElementMaxOccurs1-ElementMaxOccurs101.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/echoElementMaxOccurs0000755000175000017500000000170513525245162032702 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/echoElementMaxOccurs1-ElementMaxOccurs101-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/echoElementMaxOccurs0000755000175000017500000000227213525245162032702 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/echoElementMaxOccurs1-ElementMaxOccurs102-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/echoElementMaxOccurs0000755000175000017500000000227313525245162032703 0ustar ellertellert 4 ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/ElementMaxOccurs1-ElementMaxOccurs102.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/ElementMaxOccurs1-El0000755000175000017500000000164713525245162032467 0ustar ellertellert 4 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/echoElementMaxOccurs1-ElementMaxOccurs101-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/echoElementMaxOccurs0000755000175000017500000000227413525245162032704 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/echoElementMaxOccurs1-ElementMaxOccurs102.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccurs1/echoElementMaxOccurs0000755000175000017500000000170413525245162032701 0ustar ellertellert 4 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyURIAttribute/0000755000175000017500000000000013525245161026367 5ustar ellertellert././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyURIAttribute/echoAnyURIAttribute-AnyURIAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyURIAttribute/echoAnyURIAttribute-An0000755000175000017500000000226013525245161032503 0ustar ellertellert ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyURIAttribute/AnyURIAttribute-AnyURIAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyURIAttribute/AnyURIAttribute-AnyURI0000755000175000017500000000163213525245161032417 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyURIAttribute/echoAnyURIAttribute-AnyURIAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyURIAttribute/echoAnyURIAttribute-An0000755000175000017500000000226213525245161032505 0ustar ellertellert ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyURIAttribute/echoAnyURIAttribute-AnyURIAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyURIAttribute/echoAnyURIAttribute-An0000755000175000017500000000167013525245161032507 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeRenamed/0000755000175000017500000000000013525245162026764 5ustar ellertellert././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeRenamed/echoSimpleTypeRenamed-SimpleTypeRenamed01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeRenamed/echoSimpleTypeRename0000755000175000017500000000222213525245162032772 0ustar ellertellert String ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeRenamed/SimpleTypeRenamed-SimpleTypeRenamed01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeRenamed/SimpleTypeRenamed-Si0000755000175000017500000000160713525245162032656 0ustar ellertellert String././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeRenamed/echoSimpleTypeRenamed-SimpleTypeRenamed01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeRenamed/echoSimpleTypeRename0000755000175000017500000000222413525245162032774 0ustar ellertellert String ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeRenamed/echoSimpleTypeRenamed-SimpleTypeRenamed01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeRenamed/echoSimpleTypeRename0000755000175000017500000000164413525245162033001 0ustar ellertellert String gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationAttribute/0000755000175000017500000000000013525245161027045 5ustar ellertellert././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationAttribute/DurationAttribute-DurationAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationAttribute/DurationAttribute-Du0000755000175000017500000000162013525245161033011 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationAttribute/echoDurationAttribute-DurationAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationAttribute/echoDurationAttribut0000755000175000017500000000224413525245161033140 0ustar ellertellert ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationAttribute/echoDurationAttribute-DurationAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationAttribute/echoDurationAttribut0000755000175000017500000000166013525245161033141 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationAttribute/echoDurationAttribute-DurationAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationAttribute/echoDurationAttribut0000755000175000017500000000224613525245161033142 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceExtension/0000755000175000017500000000000013525245161031233 5ustar ellertellert././@LongLink0000644000000000000000000000023700000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceExtension/echoComplexTypeSequenceExtension-ComplexTypeSequenceExtension01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceExtension/echoCompl0000755000175000017500000000210013525245161033063 0ustar ellertellert Mary tall ././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceExtension/echoComplexTypeSequenceExtension-ComplexTypeSequenceExtension01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceExtension/echoCompl0000755000175000017500000000244513525245161033077 0ustar ellertellert Mary tall ././@LongLink0000644000000000000000000000023300000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceExtension/ComplexTypeSequenceExtension-ComplexTypeSequenceExtension01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceExtension/ComplexTy0000755000175000017500000000203013525245161033100 0ustar ellertellert Mary tall ././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceExtension/echoComplexTypeSequenceExtension-ComplexTypeSequenceExtension01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceExtension/echoCompl0000755000175000017500000000244313525245161033075 0ustar ellertellert Mary tall gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TargetNamespace/0000755000175000017500000000000013525245162026440 5ustar ellertellert././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TargetNamespace/echoTargetNamespace-TargetNamespace01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TargetNamespace/echoTargetNamespace-Ta0000755000175000017500000000162313525245162032634 0ustar ellertellert foo ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TargetNamespace/echoTargetNamespace-TargetNamespace01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TargetNamespace/echoTargetNamespace-Ta0000755000175000017500000000220513525245162032631 0ustar ellertellert foo ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TargetNamespace/echoTargetNamespace-TargetNamespace01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TargetNamespace/echoTargetNamespace-Ta0000755000175000017500000000220713525245162032633 0ustar ellertellert foo ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TargetNamespace/TargetNamespace-TargetNamespace01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TargetNamespace/TargetNamespace-Target0000755000175000017500000000157013525245162032660 0ustar ellertellert foogsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/0000755000175000017500000000000013525245161026754 5ustar ellertellert././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/DateTimeAttribute-DateTimeAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/DateTimeAttribute-Da0000755000175000017500000000164613525245161032613 0ustar ellertellert ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/DateTimeAttribute-DateTimeAttribute06.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/DateTimeAttribute-Da0000755000175000017500000000164113525245161032606 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute05-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000226613525245161032762 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000226613525245161032762 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000226413525245161032760 0ustar ellertellert ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000170013525245161032752 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute05-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000226413525245161032760 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000227213525245161032757 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute06-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000226713525245161032763 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000226713525245161032763 0ustar ellertellert ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/DateTimeAttribute-DateTimeAttribute05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/DateTimeAttribute-Da0000755000175000017500000000164013525245161032605 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000227213525245161032757 0ustar ellertellert ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/DateTimeAttribute-DateTimeAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/DateTimeAttribute-Da0000755000175000017500000000164113525245161032606 0ustar ellertellert ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/DateTimeAttribute-DateTimeAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/DateTimeAttribute-Da0000755000175000017500000000164013525245161032605 0ustar ellertellert ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000170013525245161032752 0ustar ellertellert ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000170613525245161032760 0ustar ellertellert ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000170613525245161032760 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute06-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000226513525245161032761 0ustar ellertellert ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000170113525245161032753 0ustar ellertellert ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute06.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000170113525245161032753 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000226513525245161032761 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000227413525245161032761 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribute-DateTimeAttribute02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/echoDateTimeAttribut0000755000175000017500000000227413525245161032761 0ustar ellertellert ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/DateTimeAttribute-DateTimeAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateTimeAttribute/DateTimeAttribute-Da0000755000175000017500000000164613525245161032613 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFElement/0000755000175000017500000000000013525245162025540 5ustar ellertellert././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFElement/echoIDREFElement-IDREFElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFElement/echoIDREFElement-IDREFEle0000755000175000017500000000217013525245162031745 0ustar ellertellert foo ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFElement/IDREFElement-IDREFElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFElement/IDREFElement-IDREFElement0000755000175000017500000000154613525245162032000 0ustar ellertellert foo././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFElement/echoIDREFElement-IDREFElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFElement/echoIDREFElement-IDREFEle0000755000175000017500000000157613525245162031756 0ustar ellertellert foo ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFElement/echoIDREFElement-IDREFElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFElement/echoIDREFElement-IDREFEle0000755000175000017500000000216613525245162031752 0ustar ellertellert foo gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/0000755000175000017500000000000013525245161026637 5ustar ellertellert././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/echoBooleanAttribute-BooleanAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/echoBooleanAttribute-0000755000175000017500000000164613525245161032753 0ustar ellertellert ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/BooleanAttribute-BooleanAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/BooleanAttribute-Bool0000755000175000017500000000160713525245161032725 0ustar ellertellert ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/BooleanAttribute-BooleanAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/BooleanAttribute-Bool0000755000175000017500000000161213525245161032721 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/echoBooleanAttribute-BooleanAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/echoBooleanAttribute-0000755000175000017500000000223713525245161032750 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/echoBooleanAttribute-BooleanAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/echoBooleanAttribute-0000755000175000017500000000224113525245161032743 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/echoBooleanAttribute-BooleanAttribute02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/echoBooleanAttribute-0000755000175000017500000000223613525245161032747 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/echoBooleanAttribute-BooleanAttribute02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/echoBooleanAttribute-0000755000175000017500000000223413525245161032745 0ustar ellertellert ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/echoBooleanAttribute-BooleanAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanAttribute/echoBooleanAttribute-0000755000175000017500000000165113525245161032747 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/0000755000175000017500000000000013525245162030027 5ustar ellertellert././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveIntegerElement-PositiveIntegerElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveInt0000755000175000017500000000224613525245162033075 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/PositiveIntegerElement-PositiveIntegerElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/PositiveInteger0000755000175000017500000000173013525245162033076 0ustar ellertellert 153452759384758934752984759387692835739846739486754598674././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveIntegerElement-PositiveIntegerElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveInt0000755000175000017500000000225213525245162033072 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveIntegerElement-PositiveIntegerElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveInt0000755000175000017500000000233613525245162033075 0ustar ellertellert 153452759384758934752984759387692835739846739486754598674 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/PositiveIntegerElement-PositiveIntegerElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/PositiveInteger0000755000175000017500000000164213525245162033100 0ustar ellertellert +42././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveIntegerElement-PositiveIntegerElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveInt0000755000175000017500000000170413525245162033073 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveIntegerElement-PositiveIntegerElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveInt0000755000175000017500000000234013525245162033070 0ustar ellertellert 153452759384758934752984759387692835739846739486754598674 ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveIntegerElement-PositiveIntegerElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveInt0000755000175000017500000000170213525245162033071 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveIntegerElement-PositiveIntegerElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveInt0000755000175000017500000000177213525245162033100 0ustar ellertellert 153452759384758934752984759387692835739846739486754598674 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveIntegerElement-PositiveIntegerElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveInt0000755000175000017500000000225013525245162033070 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/PositiveIntegerElement-PositiveIntegerElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/PositiveInteger0000755000175000017500000000164013525245162033076 0ustar ellertellert 1././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveIntegerElement-PositiveIntegerElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerElement/echoPositiveInt0000755000175000017500000000225013525245162033070 0ustar ellertellert 1 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenElement/0000755000175000017500000000000013525245162025767 5ustar ellertellert././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenElement/echoTokenElement-TokenElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenElement/echoTokenElement-TokenEle0000755000175000017500000000217713525245162032661 0ustar ellertellert tokenElement ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenElement/echoTokenElement-TokenElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenElement/echoTokenElement-TokenEle0000755000175000017500000000220113525245162032645 0ustar ellertellert tokenElement ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenElement/TokenElement-TokenElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenElement/TokenElement-TokenElement0000755000175000017500000000155713525245162032707 0ustar ellertellert tokenElement././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenElement/echoTokenElement-TokenElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenElement/echoTokenElement-TokenEle0000755000175000017500000000160713525245162032656 0ustar ellertellert tokenElement gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleAndMemberTypes/0000755000175000017500000000000013525245162030437 5ustar ellertellert././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleAndMemberTypes/UnionSimpleAndMemberTypes-UnionSimpleAndMemberTypes01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleAndMemberTypes/UnionSimpleA0000755000175000017500000000166713525245162032742 0ustar ellertellert string././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleAndMemberTypes/echoUnionSimpleAndMemberTypes-UnionSimpleAndMemberTypes01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleAndMemberTypes/echoUnionSim0000755000175000017500000000227413525245162032772 0ustar ellertellert string ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleAndMemberTypes/echoUnionSimpleAndMemberTypes-UnionSimpleAndMemberTypes01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleAndMemberTypes/echoUnionSim0000755000175000017500000000173413525245162032772 0ustar ellertellert string ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleAndMemberTypes/echoUnionSimpleAndMemberTypes-UnionSimpleAndMemberTypes01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleAndMemberTypes/echoUnionSim0000755000175000017500000000227213525245162032770 0ustar ellertellert string gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1/0000755000175000017500000000000013525245162026672 5ustar ellertellert././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1/ElementMinOccurs1-ElementMinOccurs101.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1/ElementMinOccurs1-El0000755000175000017500000000171313525245162032455 0ustar ellertellert item1 ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1/echoElementMinOccurs1-ElementMinOccurs101.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1/echoElementMinOccurs0000755000175000017500000000175013525245162032676 0ustar ellertellert item1 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1/echoElementMinOccurs1-ElementMinOccurs101-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1/echoElementMinOccurs0000755000175000017500000000233713525245162032700 0ustar ellertellert item1 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1/echoElementMinOccurs1-ElementMinOccurs101-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1/echoElementMinOccurs0000755000175000017500000000233513525245162032676 0ustar ellertellert item1 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/0000755000175000017500000000000013525245162027307 5ustar ellertellert././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteElement-UnsignedByteElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteEl0000755000175000017500000000223113525245162032753 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteElement-UnsignedByteElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteEl0000755000175000017500000000223013525245162032752 0ustar ellertellert -0 ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/UnsignedByteElement-UnsignedByteElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/UnsignedByteElemen0000755000175000017500000000162013525245162032762 0ustar ellertellert +42././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/UnsignedByteElement-UnsignedByteElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/UnsignedByteElemen0000755000175000017500000000162013525245162032762 0ustar ellertellert 255././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteElement-UnsignedByteElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteEl0000755000175000017500000000165613525245162032765 0ustar ellertellert -0 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteElement-UnsignedByteElement04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteEl0000755000175000017500000000223113525245162032753 0ustar ellertellert 255 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteElement-UnsignedByteElement04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteEl0000755000175000017500000000223313525245162032755 0ustar ellertellert 255 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteElement-UnsignedByteElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteEl0000755000175000017500000000223313525245162032755 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteElement-UnsignedByteElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteEl0000755000175000017500000000223213525245162032754 0ustar ellertellert -0 ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteElement-UnsignedByteElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteEl0000755000175000017500000000165713525245162032766 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteElement-UnsignedByteElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteEl0000755000175000017500000000222713525245162032760 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteElement-UnsignedByteElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteEl0000755000175000017500000000165513525245162032764 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteElement-UnsignedByteElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteEl0000755000175000017500000000223113525245162032753 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/UnsignedByteElement-UnsignedByteElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/UnsignedByteElemen0000755000175000017500000000161613525245162032767 0ustar ellertellert 1././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteElement-UnsignedByteElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/echoUnsignedByteEl0000755000175000017500000000165713525245162032766 0ustar ellertellert 255 ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/UnsignedByteElement-UnsignedByteElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteElement/UnsignedByteElemen0000755000175000017500000000161713525245162032770 0ustar ellertellert -0gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/0000755000175000017500000000000013525245162027526 5ustar ellertellert././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/echoTokenEnumerationType-TokenEnumerationType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/echoTokenEnumerat0000755000175000017500000000223613525245162033077 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/echoTokenEnumerationType-TokenEnumerationType02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/echoTokenEnumerat0000755000175000017500000000223413525245162033075 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/echoTokenEnumerationType-TokenEnumerationType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/echoTokenEnumerat0000755000175000017500000000223413525245162033075 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/echoTokenEnumerationType-TokenEnumerationType02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/echoTokenEnumerat0000755000175000017500000000166413525245162033103 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/echoTokenEnumerationType-TokenEnumerationType02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/echoTokenEnumerat0000755000175000017500000000223613525245162033077 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/echoTokenEnumerationType-TokenEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/echoTokenEnumerat0000755000175000017500000000166413525245162033103 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/TokenEnumerationType-TokenEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/TokenEnumerationT0000755000175000017500000000162413525245162033072 0ustar ellertellert 1././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/TokenEnumerationType-TokenEnumerationType02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TokenEnumerationType/TokenEnumerationT0000755000175000017500000000162413525245162033072 0ustar ellertellert 2gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/0000755000175000017500000000000013525245161026760 5ustar ellertellert././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoice-ComplexTypeChoice01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoic0000755000175000017500000000161113525245161032763 0ustar ellertellert 21 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoice-ComplexTypeChoice01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoic0000755000175000017500000000223013525245161032761 0ustar ellertellert 21 ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/ComplexTypeChoice-ComplexTypeChoice01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/ComplexTypeChoice-Co0000755000175000017500000000154013525245161032631 0ustar ellertellert 21 ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoice-ComplexTypeChoice02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoic0000755000175000017500000000162413525245161032767 0ustar ellertellert Two Hundred ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoice-ComplexTypeChoice03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoic0000755000175000017500000000223113525245161032762 0ustar ellertellert 329 ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/ComplexTypeChoice-ComplexTypeChoice02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/ComplexTypeChoice-Co0000755000175000017500000000155313525245161032635 0ustar ellertellert Two Hundred ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoice-ComplexTypeChoice01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoic0000755000175000017500000000222613525245161032766 0ustar ellertellert 21 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoice-ComplexTypeChoice02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoic0000755000175000017500000000224113525245161032763 0ustar ellertellert Two Hundred ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoice-ComplexTypeChoice03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoic0000755000175000017500000000161413525245161032766 0ustar ellertellert 329 ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/ComplexTypeChoice-ComplexTypeChoice03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/ComplexTypeChoice-Co0000755000175000017500000000154313525245161032634 0ustar ellertellert 329 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoice-ComplexTypeChoice02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoic0000755000175000017500000000224313525245161032765 0ustar ellertellert Two Hundred ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoice-ComplexTypeChoice03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeChoice/echoComplexTypeChoic0000755000175000017500000000223313525245161032764 0ustar ellertellert 329 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/0000755000175000017500000000000013525245162027276 5ustar ellertellert././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/GYearMonthAttribute-GYearMonthAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/GYearMonthAttribut0000755000175000017500000000164213525245162032763 0ustar ellertellert ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/GYearMonthAttribute-GYearMonthAttribute05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/GYearMonthAttribut0000755000175000017500000000165013525245162032762 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute05-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000227413525245162032740 0ustar ellertellert ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/GYearMonthAttribute-GYearMonthAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/GYearMonthAttribut0000755000175000017500000000164213525245162032763 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute06-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000226513525245162032740 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000227413525245162032740 0ustar ellertellert ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000170413525245162032735 0ustar ellertellert ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000171213525245162032734 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000227213525245162032736 0ustar ellertellert ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute06.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000170513525245162032736 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000226413525245162032737 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute05-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000227213525245162032736 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000226613525245162032741 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute06-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000226713525245162032742 0ustar ellertellert ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000170413525245162032735 0ustar ellertellert ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/GYearMonthAttribute-GYearMonthAttribute07.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/GYearMonthAttribut0000755000175000017500000000164313525245162032764 0ustar ellertellert ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000171213525245162032734 0ustar ellertellert ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/GYearMonthAttribute-GYearMonthAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/GYearMonthAttribut0000755000175000017500000000164213525245162032763 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000226613525245162032741 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute07-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000226513525245162032740 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000226413525245162032737 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute07-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000226713525245162032742 0ustar ellertellert ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/GYearMonthAttribute-GYearMonthAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/GYearMonthAttribut0000755000175000017500000000165013525245162032762 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000226413525245162032737 0ustar ellertellert ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute07.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000170513525245162032736 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000226613525245162032741 0ustar ellertellert ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/GYearMonthAttribute-GYearMonthAttribute06.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/GYearMonthAttribut0000755000175000017500000000164313525245162032764 0ustar ellertellert ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttribute-GYearMonthAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthAttribute/echoGYearMonthAttr0000755000175000017500000000170413525245162032735 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/0000755000175000017500000000000013525245161027552 5ustar ellertellert././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/ChoiceMaxOccursFinite-ChoiceMaxOccursFinite01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/ChoiceMaxOccursF0000755000175000017500000000175713525245161032637 0ustar ellertellert first second ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOccursFinite-ChoiceMaxOccursFinite03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOcc0000755000175000017500000000232613525245161032627 0ustar ellertellert only ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOccursFinite-ChoiceMaxOccursFinite02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOcc0000755000175000017500000000240313525245161032623 0ustar ellertellert first second ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/ChoiceMaxOccursFinite-ChoiceMaxOccursFinite02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/ChoiceMaxOccursF0000755000175000017500000000175713525245161032637 0ustar ellertellert first second ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOccursFinite-ChoiceMaxOccursFinite01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOcc0000755000175000017500000000240313525245161032623 0ustar ellertellert first second ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOccursFinite-ChoiceMaxOccursFinite02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOcc0000755000175000017500000000240113525245161032621 0ustar ellertellert first second ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOccursFinite-ChoiceMaxOccursFinite03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOcc0000755000175000017500000000174713525245161032635 0ustar ellertellert only ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOccursFinite-ChoiceMaxOccursFinite02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOcc0000755000175000017500000000202013525245161032616 0ustar ellertellert first second ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOccursFinite-ChoiceMaxOccursFinite01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOcc0000755000175000017500000000202013525245161032616 0ustar ellertellert first second ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOccursFinite-ChoiceMaxOccursFinite03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOcc0000755000175000017500000000232413525245161032625 0ustar ellertellert only ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/ChoiceMaxOccursFinite-ChoiceMaxOccursFinite03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/ChoiceMaxOccursF0000755000175000017500000000170613525245161032631 0ustar ellertellert only ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOccursFinite-ChoiceMaxOccursFinite01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursFinite/echoChoiceMaxOcc0000755000175000017500000000240113525245161032621 0ustar ellertellert first second gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/0000755000175000017500000000000013525245162026607 5ustar ellertellert././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-PrecisionDecimal02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-0000755000175000017500000000221213525245162032660 0ustar ellertellert NaN ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-PrecisionDecimal02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-0000755000175000017500000000163213525245162032665 0ustar ellertellert NaN ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/PrecisionDecimal-PrecisionDecimal03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/PrecisionDecimal-Prec0000755000175000017500000000157713525245162032650 0ustar ellertellert -INF././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/PrecisionDecimal-PrecisionDecimal02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/PrecisionDecimal-Prec0000755000175000017500000000157613525245162032647 0ustar ellertellert NaN././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-PrecisionDecimal03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-0000755000175000017500000000163313525245162032666 0ustar ellertellert -INF ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-PrecisionDecimal02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-0000755000175000017500000000221413525245162032662 0ustar ellertellert NaN ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-PrecisionDecimal03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-0000755000175000017500000000221513525245162032663 0ustar ellertellert -INF ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-PrecisionDecimal03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-0000755000175000017500000000221313525245162032661 0ustar ellertellert -INF ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/PrecisionDecimal-PrecisionDecimal01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/PrecisionDecimal-Prec0000755000175000017500000000160213525245162032635 0ustar ellertellert 1000.20././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-PrecisionDecimal01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-0000755000175000017500000000163613525245162032671 0ustar ellertellert 1000.20 ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-PrecisionDecimal01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-0000755000175000017500000000222013525245162032657 0ustar ellertellert 1000.20 ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-PrecisionDecimal01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PrecisionDecimal/echoPrecisionDecimal-0000755000175000017500000000221613525245162032664 0ustar ellertellert 1000.20 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFSElement/0000755000175000017500000000000013525245162025663 5ustar ellertellert././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFSElement/echoIDREFSElement-IDREFSElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFSElement/echoIDREFSElement-IDREFS0000755000175000017500000000217513525245162031715 0ustar ellertellert foo ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFSElement/echoIDREFSElement-IDREFSElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFSElement/echoIDREFSElement-IDREFS0000755000175000017500000000217313525245162031713 0ustar ellertellert foo ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFSElement/echoIDREFSElement-IDREFSElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFSElement/echoIDREFSElement-IDREFS0000755000175000017500000000160513525245162031712 0ustar ellertellert foo ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFSElement/IDREFSElement-IDREFSElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFSElement/IDREFSElement-IDREFSElem0000755000175000017500000000155413525245162031661 0ustar ellertellert foogsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/0000755000175000017500000000000013525245162025360 5ustar ellertellert././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/echoMinOccurs1-MinOccurs02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/echoMinOccurs1-MinOccurs02.0000755000175000017500000000166213525245162032255 0ustar ellertellert 4 8 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/echoMinOccurs1-MinOccurs02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/echoMinOccurs1-MinOccurs02-0000755000175000017500000000227113525245162032251 0ustar ellertellert 4 8 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/MinOccurs1-MinOccurs02.xml0000755000175000017500000000163413525245162032136 0ustar ellertellert 4 8 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/echoMinOccurs1-MinOccurs01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/echoMinOccurs1-MinOccurs01.0000755000175000017500000000162413525245162032252 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/echoMinOccurs1-MinOccurs02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/echoMinOccurs1-MinOccurs02-0000755000175000017500000000227313525245162032253 0ustar ellertellert 4 8 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/echoMinOccurs1-MinOccurs01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/echoMinOccurs1-MinOccurs01-0000755000175000017500000000223113525245162032244 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/echoMinOccurs1-MinOccurs01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/echoMinOccurs1-MinOccurs01-0000755000175000017500000000222713525245162032251 0ustar ellertellert 44 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MinOccurs1/MinOccurs1-MinOccurs01.xml0000755000175000017500000000157613525245162032142 0ustar ellertellert 44 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntEnumerationType/0000755000175000017500000000000013525245162027200 5ustar ellertellert././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntEnumerationType/echoIntEnumerationType-IntEnumerationType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntEnumerationType/echoIntEnumerationT0000755000175000017500000000222413525245162033052 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntEnumerationType/IntEnumerationType-IntEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntEnumerationType/IntEnumerationType-0000755000175000017500000000161013525245162033004 0ustar ellertellert 2././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntEnumerationType/echoIntEnumerationType-IntEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntEnumerationType/echoIntEnumerationT0000755000175000017500000000164613525245162033061 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntEnumerationType/echoIntEnumerationType-IntEnumerationType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntEnumerationType/echoIntEnumerationT0000755000175000017500000000222213525245162033050 0ustar ellertellert 2 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NotNillableElement/0000755000175000017500000000000013525245162027112 5ustar ellertellert././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NotNillableElement/echoNotNillableElement-NotNillableElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NotNillableElement/echoNotNillableElem0000755000175000017500000000175113525245162032711 0ustar ellertellert Stuff ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NotNillableElement/echoNotNillableElement-NotNillableElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NotNillableElement/echoNotNillableElem0000755000175000017500000000233413525245162032707 0ustar ellertellert Stuff ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NotNillableElement/echoNotNillableElement-NotNillableElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NotNillableElement/echoNotNillableElem0000755000175000017500000000233613525245162032711 0ustar ellertellert Stuff ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NotNillableElement/NotNillableElement-NotNillableElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NotNillableElement/NotNillableElement-0000755000175000017500000000171313525245162032634 0ustar ellertellert Stuff gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/0000755000175000017500000000000013525245162030171 5ustar ellertellert././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/echoLanguageEnumerationType-LanguageEnumerationType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/echoLanguageEn0000755000175000017500000000225613525245162032771 0ustar ellertellert en ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/echoLanguageEnumerationType-LanguageEnumerationType02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/echoLanguageEn0000755000175000017500000000225613525245162032771 0ustar ellertellert it ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/LanguageEnumerationType-LanguageEnumerationType02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/LanguageEnumer0000755000175000017500000000164713525245162033026 0ustar ellertellert it././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/echoLanguageEnumerationType-LanguageEnumerationType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/echoLanguageEn0000755000175000017500000000225413525245162032767 0ustar ellertellert en ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/echoLanguageEnumerationType-LanguageEnumerationType02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/echoLanguageEn0000755000175000017500000000171213525245162032765 0ustar ellertellert it ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/echoLanguageEnumerationType-LanguageEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/echoLanguageEn0000755000175000017500000000171213525245162032765 0ustar ellertellert en ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/LanguageEnumerationType-LanguageEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/LanguageEnumer0000755000175000017500000000164713525245162033026 0ustar ellertellert en././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/echoLanguageEnumerationType-LanguageEnumerationType02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageEnumerationType/echoLanguageEn0000755000175000017500000000225413525245162032767 0ustar ellertellert it gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENAttribute/0000755000175000017500000000000013525245162026374 5ustar ellertellert././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENAttribute/echoNMTOKENAttribute-NMTOKENAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENAttribute/echoNMTOKENAttribute-0000755000175000017500000000223513525245162032237 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENAttribute/echoNMTOKENAttribute-NMTOKENAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENAttribute/echoNMTOKENAttribute-0000755000175000017500000000223713525245162032241 0ustar ellertellert ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENAttribute/NMTOKENAttribute-NMTOKENAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENAttribute/NMTOKENAttribute-NMTO0000755000175000017500000000161013525245162032072 0ustar ellertellert ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENAttribute/echoNMTOKENAttribute-NMTOKENAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENAttribute/echoNMTOKENAttribute-0000755000175000017500000000164713525245162032245 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/0000755000175000017500000000000013525245162026103 5ustar ellertellert././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonthElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonth0000755000175000017500000000160713525245162032574 0ustar ellertellert --12Z ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonthElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonth0000755000175000017500000000161413525245162032572 0ustar ellertellert --12-01:33 ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonthElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonth0000755000175000017500000000217413525245162032574 0ustar ellertellert --02 ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/GMonthElement-GMonthElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/GMonthElement-GMonthElem0000755000175000017500000000155513525245162032542 0ustar ellertellert --02././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonthElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonth0000755000175000017500000000220213525245162032564 0ustar ellertellert --12-01:33 ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/GMonthElement-GMonthElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/GMonthElement-GMonthElem0000755000175000017500000000155613525245162032543 0ustar ellertellert --12Z././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonthElement04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonth0000755000175000017500000000217513525245162032575 0ustar ellertellert --12Z ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonthElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonth0000755000175000017500000000217613525245162032576 0ustar ellertellert --02 ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonthElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonth0000755000175000017500000000161413525245162032572 0ustar ellertellert --12+01:02 ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/GMonthElement-GMonthElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/GMonthElement-GMonthElem0000755000175000017500000000156313525245162032541 0ustar ellertellert --12-01:33././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonthElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonth0000755000175000017500000000220213525245162032564 0ustar ellertellert --12+01:02 ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonthElement04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonth0000755000175000017500000000217713525245162032577 0ustar ellertellert --12Z ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/GMonthElement-GMonthElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/GMonthElement-GMonthElem0000755000175000017500000000156313525245162032541 0ustar ellertellert --12+01:02././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonthElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonth0000755000175000017500000000220413525245162032566 0ustar ellertellert --12-01:33 ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonthElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonth0000755000175000017500000000160613525245162032573 0ustar ellertellert --02 ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonthElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthElement/echoGMonthElement-GMonth0000755000175000017500000000220413525245162032566 0ustar ellertellert --12+01:02 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Unique/0000755000175000017500000000000013525245162024643 5ustar ellertellertgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Unique/echoUnique-Unique01-soap12.xml0000755000175000017500000000234613525245162032212 0ustar ellertellert String String gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Unique/echoUnique-Unique01.xml0000755000175000017500000000171513525245162031106 0ustar ellertellert String String gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Unique/echoUnique-Unique01-soap11.xml0000755000175000017500000000235013525245162032204 0ustar ellertellert String String gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Unique/Unique-Unique01.xml0000755000175000017500000000167313525245162030252 0ustar ellertellert String String gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/0000755000175000017500000000000013525245162025533 5ustar ellertellert././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElemen0000755000175000017500000000157113525245162032432 0ustar ellertellert ---05 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElemen0000755000175000017500000000216513525245162032432 0ustar ellertellert ---05 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/GDayElement-GDayElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/GDayElement-GDayElement01.0000755000175000017500000000154213525245162032174 0ustar ellertellert ---05././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElemen0000755000175000017500000000217313525245162032431 0ustar ellertellert ---31-12:00 ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElemen0000755000175000017500000000157713525245162032440 0ustar ellertellert ---31-12:00 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/GDayElement-GDayElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/GDayElement-GDayElement03.0000755000175000017500000000155013525245162032175 0ustar ellertellert ---31-12:00././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElemen0000755000175000017500000000157713525245162032440 0ustar ellertellert ---05+01:00 ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElemen0000755000175000017500000000157213525245162032433 0ustar ellertellert ---12Z ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElemen0000755000175000017500000000216413525245162032431 0ustar ellertellert ---12Z ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/GDayElement-GDayElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/GDayElement-GDayElement04.0000755000175000017500000000155013525245162032176 0ustar ellertellert ---05+01:00././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElement04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElemen0000755000175000017500000000217313525245162032431 0ustar ellertellert ---05+01:00 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElemen0000755000175000017500000000217113525245162032427 0ustar ellertellert ---31-12:00 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElement04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElemen0000755000175000017500000000217113525245162032427 0ustar ellertellert ---05+01:00 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElemen0000755000175000017500000000216313525245162032430 0ustar ellertellert ---05 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/GDayElement-GDayElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/GDayElement-GDayElement02.0000755000175000017500000000154313525245162032176 0ustar ellertellert ---12Z././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GDayElement/echoGDayElement-GDayElemen0000755000175000017500000000216613525245162032433 0ustar ellertellert ---12Z gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NestedSequenceElementList/0000755000175000017500000000000013525245162030456 5ustar ellertellert././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NestedSequenceElementList/echoNestedSequenceElementList-NestedSequenceElementList01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NestedSequenceElementList/echoNestedSe0000755000175000017500000000325613525245162032763 0ustar ellertellert item onexone item onextwo item onexthree item onexfour item twoxone item twoxtwo item twoxthree item twoxfour ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NestedSequenceElementList/echoNestedSequenceElementList-NestedSequenceElementList01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NestedSequenceElementList/echoNestedSe0000755000175000017500000000326013525245162032756 0ustar ellertellert item onexone item onextwo item onexthree item onexfour item twoxone item twoxtwo item twoxthree item twoxfour ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NestedSequenceElementList/echoNestedSequenceElementList-NestedSequenceElementList01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NestedSequenceElementList/echoNestedSe0000755000175000017500000000262513525245162032762 0ustar ellertellert item onexone item onextwo item onexthree item onexfour item twoxone item twoxtwo item twoxthree item twoxfour ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NestedSequenceElementList/NestedSequenceElementList-NestedSequenceElementList01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NestedSequenceElementList/NestedSequen0000755000175000017500000000256013525245162033012 0ustar ellertellert item onexone item onextwo item onexthree item onexfour item twoxone item twoxtwo item twoxthree item twoxfour gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2MaxOccurs2/0000755000175000017500000000000013525245162030602 5ustar ellertellert././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2MaxOccurs2/echoElementMinOccurs2MaxOccurs2-ElementMinOccurs2MaxOccurs201-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2MaxOccurs2/echoElemen0000755000175000017500000000236513525245162032602 0ustar ellertellert Red Yellow ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2MaxOccurs2/echoElementMinOccurs2MaxOccurs2-ElementMinOccurs2MaxOccurs201.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2MaxOccurs2/echoElemen0000755000175000017500000000176013525245162032600 0ustar ellertellert Red Yellow ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2MaxOccurs2/echoElementMinOccurs2MaxOccurs2-ElementMinOccurs2MaxOccurs201-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2MaxOccurs2/echoElemen0000755000175000017500000000236713525245162032604 0ustar ellertellert Red Yellow ././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2MaxOccurs2/ElementMinOccurs2MaxOccurs2-ElementMinOccurs2MaxOccurs201.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs2MaxOccurs2/ElementMin0000755000175000017500000000167113525245162032572 0ustar ellertellert Red Yellow gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerEnumerationType/0000755000175000017500000000000013525245162030043 5ustar ellertellert././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerEnumerationType/echoIntegerEnumerationType-IntegerEnumerationType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerEnumerationType/echoIntegerEnum0000755000175000017500000000225613525245162033057 0ustar ellertellert 4000000 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerEnumerationType/echoIntegerEnumerationType-IntegerEnumerationType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerEnumerationType/echoIntegerEnum0000755000175000017500000000225413525245162033055 0ustar ellertellert 4000000 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerEnumerationType/IntegerEnumerationType-IntegerEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerEnumerationType/IntegerEnumerat0000755000175000017500000000164613525245162033076 0ustar ellertellert 4000000././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerEnumerationType/echoIntegerEnumerationType-IntegerEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerEnumerationType/echoIntegerEnum0000755000175000017500000000171013525245162033051 0ustar ellertellert 4000000 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttribute/0000755000175000017500000000000013525245162026461 5ustar ellertellert././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttribute/GlobalAttribute-GlobalAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttribute/GlobalAttribute-Global0000755000175000017500000000177313525245162032701 0ustar ellertellert another string ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttribute/echoGlobalAttribute-GlobalAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttribute/echoGlobalAttribute-Gl0000755000175000017500000000243013525245162032671 0ustar ellertellert another string ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttribute/echoGlobalAttribute-GlobalAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttribute/echoGlobalAttribute-Gl0000755000175000017500000000243213525245162032673 0ustar ellertellert another string ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttribute/echoGlobalAttribute-GlobalAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttribute/echoGlobalAttribute-Gl0000755000175000017500000000203113525245162032666 0ustar ellertellert another string gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/0000755000175000017500000000000013525245162026724 5ustar ellertellert././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/GYearMonthElement-GYearMonthElement06.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/GYearMonthElement-GY0000755000175000017500000000161113525245162032515 0ustar ellertellert 2007-05Z././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/GYearMonthElement-GYearMonthElement05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/GYearMonthElement-GY0000755000175000017500000000161613525245162032522 0ustar ellertellert 2007-05-01:00././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/GYearMonthElement-GYearMonthElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/GYearMonthElement-GY0000755000175000017500000000161613525245162032522 0ustar ellertellert 2007-05+01:00././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/GYearMonthElement-GYearMonthElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/GYearMonthElement-GY0000755000175000017500000000161013525245162032514 0ustar ellertellert 2038-02././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/GYearMonthElement-GYearMonthElement07.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/GYearMonthElement-GY0000755000175000017500000000161113525245162032515 0ustar ellertellert 10739-05././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000223313525245162032654 0ustar ellertellert 2007-05+01:00 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000223113525245162032652 0ustar ellertellert 2007-05+01:00 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000222513525245162032655 0ustar ellertellert 1999-05 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000222313525245162032653 0ustar ellertellert 0739-05 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement07-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000222613525245162032656 0ustar ellertellert 10739-05 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement07-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000222413525245162032654 0ustar ellertellert 10739-05 ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000164513525245162032662 0ustar ellertellert 2038-02 ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/GYearMonthElement-GYearMonthElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/GYearMonthElement-GY0000755000175000017500000000161013525245162032514 0ustar ellertellert 0739-05././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/GYearMonthElement-GYearMonthElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/GYearMonthElement-GY0000755000175000017500000000161013525245162032514 0ustar ellertellert 1999-05././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000164513525245162032662 0ustar ellertellert 1999-05 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000222513525245162032655 0ustar ellertellert 0739-05 ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000165313525245162032661 0ustar ellertellert 2007-05+01:00 ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000165313525245162032661 0ustar ellertellert 2007-05-01:00 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement05-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000223313525245162032654 0ustar ellertellert 2007-05-01:00 ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000164513525245162032662 0ustar ellertellert 0739-05 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000222313525245162032653 0ustar ellertellert 1999-05 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement06-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000222613525245162032656 0ustar ellertellert 2007-05Z ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000222513525245162032655 0ustar ellertellert 2038-02 ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement06.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000164613525245162032663 0ustar ellertellert 2007-05Z ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000222313525245162032653 0ustar ellertellert 2038-02 ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement07.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000164613525245162032663 0ustar ellertellert 10739-05 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement05-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000223113525245162032652 0ustar ellertellert 2007-05-01:00 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElement-GYearMonthElement06-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthElement/echoGYearMonthElemen0000755000175000017500000000222413525245162032654 0ustar ellertellert 2007-05Z gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NCNameElement/0000755000175000017500000000000013525245162026010 5ustar ellertellert././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NCNameElement/echoNCNameElement-NCNameElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NCNameElement/echoNCNameElement-NCName0000755000175000017500000000217313525245162032312 0ustar ellertellert foo ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NCNameElement/NCNameElement-NCNameElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NCNameElement/NCNameElement-NCNameElem0000755000175000017500000000155413525245162032260 0ustar ellertellert foo././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NCNameElement/echoNCNameElement-NCNameElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NCNameElement/echoNCNameElement-NCName0000755000175000017500000000160513525245162032311 0ustar ellertellert foo ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NCNameElement/echoNCNameElement-NCNameElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NCNameElement/echoNCNameElement-NCName0000755000175000017500000000217513525245162032314 0ustar ellertellert foo gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleType/0000755000175000017500000000000013525245162027151 5ustar ellertellert././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleType/echoExtendedSimpleType-ExtendedSimpleType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleType/echoExtendedSimpleT0000755000175000017500000000222613525245162032776 0ustar ellertellert hello ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleType/echoExtendedSimpleType-ExtendedSimpleType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleType/echoExtendedSimpleT0000755000175000017500000000223013525245162032771 0ustar ellertellert hello ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleType/ExtendedSimpleType-ExtendedSimpleType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleType/ExtendedSimpleType-0000755000175000017500000000161413525245162032732 0ustar ellertellert hello././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleType/echoExtendedSimpleType-ExtendedSimpleType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSimpleType/echoExtendedSimpleT0000755000175000017500000000165213525245162033000 0ustar ellertellert hello gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/0000755000175000017500000000000013525245162026452 5ustar ellertellert././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/UnionDateString-UnionDateString02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/UnionDateString-UnionD0000755000175000017500000000157713525245162032661 0ustar ellertellert 2006-06-06././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/echoUnionDateString-UnionDateString01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/echoUnionDateString-Un0000755000175000017500000000221313525245162032672 0ustar ellertellert Tonight ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/echoUnionDateString-UnionDateString01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/echoUnionDateString-Un0000755000175000017500000000221113525245162032670 0ustar ellertellert Tonight ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/UnionDateString-UnionDateString01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/UnionDateString-UnionD0000755000175000017500000000157413525245162032656 0ustar ellertellert Tonight././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/echoUnionDateString-UnionDateString02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/echoUnionDateString-Un0000755000175000017500000000221613525245162032675 0ustar ellertellert 2006-06-06 ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/echoUnionDateString-UnionDateString02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/echoUnionDateString-Un0000755000175000017500000000163213525245162032676 0ustar ellertellert 2006-06-06 ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/echoUnionDateString-UnionDateString01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/echoUnionDateString-Un0000755000175000017500000000162713525245162032702 0ustar ellertellert Tonight ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/echoUnionDateString-UnionDateString02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionDateString/echoUnionDateString-Un0000755000175000017500000000221413525245162032673 0ustar ellertellert 2006-06-06 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerEnumerationType/0000755000175000017500000000000013525245162032201 5ustar ellertellert././@LongLink0000644000000000000000000000026500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerEnumerationType/echoNonNegativeIntegerEnumerationType-NonNegativeIntegerEnumerationType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerEnumerationType/echo0000755000175000017500000000233613525245162033051 0ustar ellertellert 12 ././@LongLink0000644000000000000000000000025200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerEnumerationType/NonNegativeIntegerEnumerationType-NonNegativeIntegerEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerEnumerationType/NonN0000755000175000017500000000174313525245162033004 0ustar ellertellert 12././@LongLink0000644000000000000000000000026500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerEnumerationType/echoNonNegativeIntegerEnumerationType-NonNegativeIntegerEnumerationType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerEnumerationType/echo0000755000175000017500000000234013525245162033044 0ustar ellertellert 12 ././@LongLink0000644000000000000000000000025600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerEnumerationType/echoNonNegativeIntegerEnumerationType-NonNegativeIntegerEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerEnumerationType/echo0000755000175000017500000000202013525245162033037 0ustar ellertellert 12 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/0000755000175000017500000000000013525245162025362 5ustar ellertellert././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/echoMaxOccurs1-MaxOccurs01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/echoMaxOccurs1-MaxOccurs01.0000755000175000017500000000162413525245162032260 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/echoMaxOccurs1-MaxOccurs01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/echoMaxOccurs1-MaxOccurs01-0000755000175000017500000000223113525245162032252 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/echoMaxOccurs1-MaxOccurs02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/echoMaxOccurs1-MaxOccurs02.0000755000175000017500000000162313525245162032260 0ustar ellertellert 4 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/echoMaxOccurs1-MaxOccurs02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/echoMaxOccurs1-MaxOccurs02-0000755000175000017500000000223013525245162032252 0ustar ellertellert 4 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/MaxOccurs1-MaxOccurs02.xml0000755000175000017500000000157513525245162032150 0ustar ellertellert 4 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/echoMaxOccurs1-MaxOccurs02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/echoMaxOccurs1-MaxOccurs02-0000755000175000017500000000222613525245162032257 0ustar ellertellert 4 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/MaxOccurs1-MaxOccurs01.xml0000755000175000017500000000157613525245162032150 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/echoMaxOccurs1-MaxOccurs01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MaxOccurs1/echoMaxOccurs1-MaxOccurs01-0000755000175000017500000000222713525245162032257 0ustar ellertellert 44 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/0000755000175000017500000000000013525245162026360 5ustar ellertellert././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-ShortAttribute04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-Shor0000755000175000017500000000222713525245162033044 0ustar ellertellert ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-ShortAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-Shor0000755000175000017500000000163213525245162033043 0ustar ellertellert ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-ShortAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-Shor0000755000175000017500000000163013525245162033041 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-ShortAttribute04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-Shor0000755000175000017500000000222513525245162033042 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/ShortAttribute-ShortAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/ShortAttribute-ShortAtt0000755000175000017500000000157613525245162033050 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-ShortAttribute02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-Shor0000755000175000017500000000222413525245162033041 0ustar ellertellert ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-ShortAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-Shor0000755000175000017500000000163313525245162033044 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-ShortAttribute02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-Shor0000755000175000017500000000222213525245162033037 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-ShortAttribute03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-Shor0000755000175000017500000000222613525245162033043 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-ShortAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-Shor0000755000175000017500000000222313525245162033040 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-ShortAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-Shor0000755000175000017500000000222113525245162033036 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-ShortAttribute03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-Shor0000755000175000017500000000222413525245162033041 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/ShortAttribute-ShortAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/ShortAttribute-ShortAtt0000755000175000017500000000157213525245162033044 0ustar ellertellert ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-ShortAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/echoShortAttribute-Shor0000755000175000017500000000162713525245162033047 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/ShortAttribute-ShortAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/ShortAttribute-ShortAtt0000755000175000017500000000157513525245162033047 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/ShortAttribute-ShortAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortAttribute/ShortAttribute-ShortAtt0000755000175000017500000000157313525245162033045 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/0000755000175000017500000000000013525245162030127 5ustar ellertellert././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/echoSequenceMinOccursFinite-SequenceMinOccursFinite01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/echoSequenceMi0000755000175000017500000000313013525245162032747 0ustar ellertellert Red Bright Black Bright White Low Yellow Normal ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/echoSequenceMinOccursFinite-SequenceMinOccursFinite02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/echoSequenceMi0000755000175000017500000000215713525245162032757 0ustar ellertellert Black Normal White Bright ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/echoSequenceMinOccursFinite-SequenceMinOccursFinite01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/echoSequenceMi0000755000175000017500000000247513525245162032762 0ustar ellertellert Red Bright Black Bright White Low Yellow Normal ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/echoSequenceMinOccursFinite-SequenceMinOccursFinite01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/echoSequenceMi0000755000175000017500000000312613525245162032754 0ustar ellertellert Red Bright Black Bright White Low Yellow Normal ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/SequenceMinOccursFinite-SequenceMinOccursFinite01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/SequenceMinOcc0000755000175000017500000000242013525245162032714 0ustar ellertellert Red Bright Black Bright White Low Yellow Normal ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/echoSequenceMinOccursFinite-SequenceMinOccursFinite02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/echoSequenceMi0000755000175000017500000000257013525245162032756 0ustar ellertellert Black Normal White Bright ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/echoSequenceMinOccursFinite-SequenceMinOccursFinite02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/echoSequenceMi0000755000175000017500000000257213525245162032760 0ustar ellertellert Black Normal White Bright ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/SequenceMinOccursFinite-SequenceMinOccursFinite02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccursFinite/SequenceMinOcc0000755000175000017500000000210213525245162032711 0ustar ellertellert Black Normal White Bright gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/0000755000175000017500000000000013525245162026640 5ustar ellertellert././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-MixedContentType03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-0000755000175000017500000000201613525245162032744 0ustar ellertellert Tagged Value mixed text value Tagged Value mixed text value ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-MixedContentType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-0000755000175000017500000000235513525245162032752 0ustar ellertellert Tagged Value mixed value Tagged Value ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-MixedContentType02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-0000755000175000017500000000236313525245162032751 0ustar ellertellert some text Tagged Value more text Tagged Value ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/MixedContentType-MixedContentType02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/MixedContentType-Mixe0000755000175000017500000000174413525245162032737 0ustar ellertellert some text Tagged Value more text Tagged Value ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-MixedContentType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-0000755000175000017500000000235713525245162032754 0ustar ellertellert Tagged Value mixed value Tagged Value ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-MixedContentType04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-0000755000175000017500000000241313525245162032745 0ustar ellertellert text mixed value Tagged Value Tagged Value some more text in a mixed value ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-MixedContentType04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-0000755000175000017500000000241113525245162032743 0ustar ellertellert text mixed value Tagged Value Tagged Value some more text in a mixed value ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/MixedContentType-MixedContentType03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/MixedContentType-Mixe0000755000175000017500000000176213525245162032737 0ustar ellertellert Tagged Value mixed text value Tagged Value mixed text value ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/MixedContentType-MixedContentType04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/MixedContentType-Mixe0000755000175000017500000000177113525245162032737 0ustar ellertellert text mixed value Tagged Value Tagged Value some more text in a mixed value ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-MixedContentType02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-0000755000175000017500000000236513525245162032753 0ustar ellertellert some text Tagged Value more text Tagged Value ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-MixedContentType03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-0000755000175000017500000000240413525245162032745 0ustar ellertellert Tagged Value mixed text value Tagged Value mixed text value ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-MixedContentType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-0000755000175000017500000000176613525245162032757 0ustar ellertellert Tagged Value mixed value Tagged Value ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/MixedContentType-MixedContentType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/MixedContentType-Mixe0000755000175000017500000000173213525245162032734 0ustar ellertellert Tagged Value mixed value Tagged Value ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-MixedContentType03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-0000755000175000017500000000240213525245162032743 0ustar ellertellert Tagged Value mixed text value Tagged Value mixed text value ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-MixedContentType02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-0000755000175000017500000000200013525245162032735 0ustar ellertellert some text Tagged Value more text Tagged Value ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-MixedContentType04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedContentType/echoMixedContentType-0000755000175000017500000000202513525245162032744 0ustar ellertellert text mixed value Tagged Value Tagged Value some more text in a mixed value gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexType/0000755000175000017500000000000013525245162026767 5ustar ellertellert././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexType/GlobalComplexType-GlobalComplexTypeExample01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexType/GlobalComplexType-Gl0000755000175000017500000000165613525245162032657 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexType/echoGlobalComplexType-GlobalComplexTypeExample01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexType/echoGlobalComplexTyp0000755000175000017500000000230013525245162032774 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexType/echoGlobalComplexType-GlobalComplexTypeExample01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexType/echoGlobalComplexTyp0000755000175000017500000000171313525245162033003 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexType/echoGlobalComplexType-GlobalComplexTypeExample01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexType/echoGlobalComplexTyp0000755000175000017500000000230213525245162032776 0ustar ellertellert 1175 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/0000755000175000017500000000000013525245162026107 5ustar ellertellert././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-GlobalElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-Global0000755000175000017500000000220113525245162032577 0ustar ellertellert a value ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-GlobalElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-Global0000755000175000017500000000217713525245162032613 0ustar ellertellert a value ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-GlobalElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-Global0000755000175000017500000000220513525245162032603 0ustar ellertellert another Value ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/GlobalElement-GlobalElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/GlobalElement-GlobalElem0000755000175000017500000000156013525245162032552 0ustar ellertellert a value././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/GlobalElement-GlobalElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/GlobalElement-GlobalElem0000755000175000017500000000152713525245162032555 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-GlobalElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-Global0000755000175000017500000000156013525245162032606 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-GlobalElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-Global0000755000175000017500000000161113525245162032603 0ustar ellertellert a value ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-GlobalElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-Global0000755000175000017500000000161713525245162032611 0ustar ellertellert another Value ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-GlobalElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-Global0000755000175000017500000000220713525245162032605 0ustar ellertellert another Value ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-GlobalElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-Global0000755000175000017500000000214613525245162032607 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-GlobalElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/echoGlobalElement-Global0000755000175000017500000000215013525245162032602 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/GlobalElement-GlobalElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElement/GlobalElement-GlobalElem0000755000175000017500000000156613525245162032560 0ustar ellertellert another Valuegsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENEnumerationType/0000755000175000017500000000000013525245162027561 5ustar ellertellert././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENEnumerationType/NMTOKENEnumerationType-NMTOKENEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENEnumerationType/NMTOKENEnumerat0000755000175000017500000000164513525245162032331 0ustar ellertellert token1././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENEnumerationType/echoNMTOKENEnumerationType-NMTOKENEnumerationType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENEnumerationType/echoNMTOKENEnum0000755000175000017500000000225513525245162032312 0ustar ellertellert token1 ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENEnumerationType/echoNMTOKENEnumerationType-NMTOKENEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENEnumerationType/echoNMTOKENEnum0000755000175000017500000000170713525245162032313 0ustar ellertellert token1 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENEnumerationType/echoNMTOKENEnumerationType-NMTOKENEnumerationType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENEnumerationType/echoNMTOKENEnum0000755000175000017500000000225313525245162032310 0ustar ellertellert token1 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/0000755000175000017500000000000013525245162030035 5ustar ellertellert././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/echoRestrictedMaxInclusive-RestrictedMaxInclusive01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/echoRestrictedM0000755000175000017500000000170213525245162033047 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/RestrictedMaxInclusive-RestrictedMaxInclusive02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/RestrictedMaxIn0000755000175000017500000000164013525245162033031 0ustar ellertellert 3././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/echoRestrictedMaxInclusive-RestrictedMaxInclusive01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/echoRestrictedM0000755000175000017500000000225013525245162033046 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/RestrictedMaxInclusive-RestrictedMaxInclusive01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/RestrictedMaxIn0000755000175000017500000000164013525245162033031 0ustar ellertellert 1././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/echoRestrictedMaxInclusive-RestrictedMaxInclusive02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/echoRestrictedM0000755000175000017500000000225013525245162033046 0ustar ellertellert 3 ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/echoRestrictedMaxInclusive-RestrictedMaxInclusive02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/echoRestrictedM0000755000175000017500000000170213525245162033047 0ustar ellertellert 3 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/echoRestrictedMaxInclusive-RestrictedMaxInclusive01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/echoRestrictedM0000755000175000017500000000224613525245162033053 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/echoRestrictedMaxInclusive-RestrictedMaxInclusive02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxInclusive/echoRestrictedM0000755000175000017500000000224613525245162033053 0ustar ellertellert 3 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/0000755000175000017500000000000013525245162030457 5ustar ellertellert././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/ElementMaxOccursUnbounded-ElementMaxOccursUnbounded01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/ElementMaxOc0000755000175000017500000000203613525245162032727 0ustar ellertellert 2002-09-24 2003-04-14 2004-03-31 2005-06-04 2006-07-03 ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/ElementMaxOccursUnbounded-ElementMaxOccursUnbounded02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/ElementMaxOc0000755000175000017500000000161613525245162032732 0ustar ellertellert 2006-01-26 ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/echoElementMaxOccursUnbounded-ElementMaxOccursUnbounded01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/echoElementM0000755000175000017500000000212013525245162032745 0ustar ellertellert 2002-09-24 2003-04-14 2004-03-31 2005-06-04 2006-07-03 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/echoElementMaxOccursUnbounded-ElementMaxOccursUnbounded01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/echoElementM0000755000175000017500000000253713525245162032761 0ustar ellertellert 2002-09-24 2003-04-14 2004-03-31 2005-06-04 2006-07-03 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/echoElementMaxOccursUnbounded-ElementMaxOccursUnbounded02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/echoElementM0000755000175000017500000000230113525245162032746 0ustar ellertellert 2006-01-26 ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/echoElementMaxOccursUnbounded-ElementMaxOccursUnbounded02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/echoElementM0000755000175000017500000000170013525245162032750 0ustar ellertellert 2006-01-26 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/echoElementMaxOccursUnbounded-ElementMaxOccursUnbounded01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/echoElementM0000755000175000017500000000254113525245162032754 0ustar ellertellert 2002-09-24 2003-04-14 2004-03-31 2005-06-04 2006-07-03 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/echoElementMaxOccursUnbounded-ElementMaxOccursUnbounded02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursUnbounded/echoElementM0000755000175000017500000000227713525245162032762 0ustar ellertellert 2006-01-26 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/0000755000175000017500000000000013525245162027510 5ustar ellertellert././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAttribute-UnsignedIntAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAt0000755000175000017500000000227013525245162033012 0ustar ellertellert ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/UnsignedIntAttribute-UnsignedIntAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/UnsignedIntAttrib0000755000175000017500000000164413525245162033040 0ustar ellertellert ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAttribute-UnsignedIntAttribute04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAt0000755000175000017500000000227513525245162033017 0ustar ellertellert ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/UnsignedIntAttribute-UnsignedIntAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/UnsignedIntAttrib0000755000175000017500000000164713525245162033043 0ustar ellertellert ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAttribute-UnsignedIntAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAt0000755000175000017500000000171713525245162033017 0ustar ellertellert ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAttribute-UnsignedIntAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAt0000755000175000017500000000171013525245162033010 0ustar ellertellert ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAttribute-UnsignedIntAttribute03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAt0000755000175000017500000000226613525245162033017 0ustar ellertellert ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAttribute-UnsignedIntAttribute02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAt0000755000175000017500000000226713525245162033020 0ustar ellertellert ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/UnsignedIntAttribute-UnsignedIntAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/UnsignedIntAttrib0000755000175000017500000000165413525245162033041 0ustar ellertellert ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAttribute-UnsignedIntAttribute04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAt0000755000175000017500000000227713525245162033021 0ustar ellertellert ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/UnsignedIntAttribute-UnsignedIntAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/UnsignedIntAttrib0000755000175000017500000000164513525245162033041 0ustar ellertellert ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAttribute-UnsignedIntAttribute02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAt0000755000175000017500000000226513525245162033016 0ustar ellertellert ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAttribute-UnsignedIntAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAt0000755000175000017500000000170713525245162033016 0ustar ellertellert ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAttribute-UnsignedIntAttribute03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAt0000755000175000017500000000227013525245162033012 0ustar ellertellert ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAttribute-UnsignedIntAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAt0000755000175000017500000000227213525245162033014 0ustar ellertellert ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAttribute-UnsignedIntAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntAttribute/echoUnsignedIntAt0000755000175000017500000000171213525245162033012 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/0000755000175000017500000000000013525245162030046 5ustar ellertellert././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/echoShortSimpleTypePattern-ShortSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/echoShortSimple0000755000175000017500000000170413525245162033106 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/ShortSimpleTypePattern-ShortSimpleTypePattern02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/ShortSimpleType0000755000175000017500000000164213525245162033112 0ustar ellertellert 009././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/echoShortSimpleTypePattern-ShortSimpleTypePattern01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/echoShortSimple0000755000175000017500000000225013525245162033103 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/ShortSimpleTypePattern-ShortSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/ShortSimpleType0000755000175000017500000000164213525245162033112 0ustar ellertellert 123././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/echoShortSimpleTypePattern-ShortSimpleTypePattern02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/echoShortSimple0000755000175000017500000000225013525245162033103 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/echoShortSimpleTypePattern-ShortSimpleTypePattern02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/echoShortSimple0000755000175000017500000000225213525245162033105 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/echoShortSimpleTypePattern-ShortSimpleTypePattern01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/echoShortSimple0000755000175000017500000000225213525245162033105 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/echoShortSimpleTypePattern-ShortSimpleTypePattern02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortSimpleTypePattern/echoShortSimple0000755000175000017500000000170413525245162033106 0ustar ellertellert 009 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReference/0000755000175000017500000000000013525245161030020 5ustar ellertellert././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReference/echoAttributeTypeReference-AttributeTypeReference01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReference/echoAttributeTy0000755000175000017500000000227313525245161033071 0ustar ellertellert ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReference/echoAttributeTypeReference-AttributeTypeReference01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReference/echoAttributeTy0000755000175000017500000000172113525245161033066 0ustar ellertellert ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReference/echoAttributeTypeReference-AttributeTypeReference01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReference/echoAttributeTy0000755000175000017500000000227513525245161033073 0ustar ellertellert ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReference/AttributeTypeReference-AttributeTypeReference01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeTypeReference/AttributeTypeRe0000755000175000017500000000165413525245161033050 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherLax/0000755000175000017500000000000013525245161027456 5ustar ellertellert././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherLax/echoAnyAttributeOtherLax-AnyAttributeOtherLax01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherLax/echoAnyAttributeO0000755000175000017500000000256013525245161033000 0ustar ellertellert String String ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherLax/AnyAttributeOtherLax-AnyAttributeOtherLax01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherLax/AnyAttributeOther0000755000175000017500000000215313525245161033022 0ustar ellertellert String String ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherLax/echoAnyAttributeOtherLax-AnyAttributeOtherLax01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherLax/echoAnyAttributeO0000755000175000017500000000255613525245161033005 0ustar ellertellert String String ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherLax/echoAnyAttributeOtherLax-AnyAttributeOtherLax01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherLax/echoAnyAttributeO0000755000175000017500000000222113525245161032772 0ustar ellertellert String String gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/0000755000175000017500000000000013525245162025716 5ustar ellertellert././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000160513525245162032461 0ustar ellertellert 2007-13:00 ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/GYearElement-GYearElement07.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/GYearElement-GYearElement0000755000175000017500000000155013525245162032505 0ustar ellertellert 10739././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement07-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000217213525245162032461 0ustar ellertellert 10739 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000217513525245162032464 0ustar ellertellert 2007-13:00 ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/GYearElement-GYearElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/GYearElement-GYearElement0000755000175000017500000000154713525245162032513 0ustar ellertellert 2039././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000157713525245162032471 0ustar ellertellert 1999 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000157713525245162032471 0ustar ellertellert 0739 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000217113525245162032460 0ustar ellertellert 0739 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement06-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000217013525245162032457 0ustar ellertellert 2008Z ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000160513525245162032461 0ustar ellertellert 1999+02:00 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement06-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000217213525245162032461 0ustar ellertellert 2008Z ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/GYearElement-GYearElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/GYearElement-GYearElement0000755000175000017500000000155513525245162032512 0ustar ellertellert 2007-13:00././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000217113525245162032460 0ustar ellertellert 2039 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000157713525245162032471 0ustar ellertellert 2039 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000216713525245162032465 0ustar ellertellert 2039 ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/GYearElement-GYearElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/GYearElement-GYearElement0000755000175000017500000000154713525245162032513 0ustar ellertellert 0739././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000216713525245162032465 0ustar ellertellert 1999 ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/GYearElement-GYearElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/GYearElement-GYearElement0000755000175000017500000000154713525245162032513 0ustar ellertellert 1999././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000216713525245162032465 0ustar ellertellert 0739 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement07.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000160013525245162032454 0ustar ellertellert 10739 ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/GYearElement-GYearElement05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/GYearElement-GYearElement0000755000175000017500000000155513525245162032512 0ustar ellertellert 1999+02:00././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement05-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000217513525245162032464 0ustar ellertellert 1999+02:00 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement06.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000160013525245162032454 0ustar ellertellert 2008Z ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement07-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000217013525245162032457 0ustar ellertellert 10739 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000217113525245162032460 0ustar ellertellert 1999 ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/GYearElement-GYearElement06.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/GYearElement-GYearElement0000755000175000017500000000155013525245162032505 0ustar ellertellert 2008Z././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement05-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000217713525245162032466 0ustar ellertellert 1999+02:00 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearElement04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearElement/echoGYearElement-GYearEle0000755000175000017500000000217713525245162032466 0ustar ellertellert 2007-13:00 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/0000755000175000017500000000000013525245162026527 5ustar ellertellert././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/echoStringAttribute-StringAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/echoStringAttribute-St0000755000175000017500000000164713525245162033042 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/echoStringAttribute-StringAttribute02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/echoStringAttribute-St0000755000175000017500000000224113525245162033031 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/echoStringAttribute-StringAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/echoStringAttribute-St0000755000175000017500000000223213525245162033031 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/echoStringAttribute-StringAttribute02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/echoStringAttribute-St0000755000175000017500000000223713525245162033036 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/echoStringAttribute-StringAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/echoStringAttribute-St0000755000175000017500000000223413525245162033033 0ustar ellertellert ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/StringAttribute-StringAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/StringAttribute-String0000755000175000017500000000160413525245162033054 0ustar ellertellert ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/StringAttribute-StringAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/StringAttribute-String0000755000175000017500000000161113525245162033052 0ustar ellertellert ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/echoStringAttribute-StringAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringAttribute/echoStringAttribute-St0000755000175000017500000000164213525245162033035 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/0000755000175000017500000000000013525245162027315 5ustar ellertellert././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/echoRestrictedMaxLength-RestrictedMaxLength01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/echoRestrictedMaxL0000755000175000017500000000223713525245162033000 0ustar ellertellert AUSTRALIA ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/echoRestrictedMaxLength-RestrictedMaxLength02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/echoRestrictedMaxL0000755000175000017500000000223713525245162033000 0ustar ellertellert N AMERICA ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/RestrictedMaxLength-RestrictedMaxLength01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/RestrictedMaxLengt0000755000175000017500000000162613525245162033020 0ustar ellertellert AUSTRALIA././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/RestrictedMaxLength-RestrictedMaxLength02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/RestrictedMaxLengt0000755000175000017500000000162613525245162033020 0ustar ellertellert N AMERICA././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/echoRestrictedMaxLength-RestrictedMaxLength02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/echoRestrictedMaxL0000755000175000017500000000166513525245162033004 0ustar ellertellert N AMERICA ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/echoRestrictedMaxLength-RestrictedMaxLength01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/echoRestrictedMaxL0000755000175000017500000000166513525245162033004 0ustar ellertellert AUSTRALIA ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/echoRestrictedMaxLength-RestrictedMaxLength01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/echoRestrictedMaxL0000755000175000017500000000224113525245162032773 0ustar ellertellert AUSTRALIA ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/echoRestrictedMaxLength-RestrictedMaxLength02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxLength/echoRestrictedMaxL0000755000175000017500000000224113525245162032773 0ustar ellertellert N AMERICA gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LocalElementSimpleType/0000755000175000017500000000000013525245162027755 5ustar ellertellert././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LocalElementSimpleType/LocalElementSimpleType-LocalElementSimpleType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LocalElementSimpleType/LocalElementSim0000755000175000017500000000164413525245162032725 0ustar ellertellert First././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LocalElementSimpleType/echoLocalElementSimpleType-LocalElementSimpleType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LocalElementSimpleType/echoLocalElemen0000755000175000017500000000175213525245162032727 0ustar ellertellert First ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LocalElementSimpleType/echoLocalElementSimpleType-LocalElementSimpleType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LocalElementSimpleType/echoLocalElemen0000755000175000017500000000231613525245162032724 0ustar ellertellert First ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LocalElementSimpleType/echoLocalElementSimpleType-LocalElementSimpleType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LocalElementSimpleType/echoLocalElemen0000755000175000017500000000232013525245162032717 0ustar ellertellert First gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/0000755000175000017500000000000013525245162026656 5ustar ellertellert././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000164713525245162033011 0ustar ellertellert ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/IntegerAttribute-IntegerAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/IntegerAttribute-Inte0000755000175000017500000000161113525245162032761 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute06-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000232713525245162033005 0ustar ellertellert ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute06.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000174113525245162033004 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000224013525245162032777 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000224013525245162032777 0ustar ellertellert ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000165013525245162033003 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute05-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000232313525245162033001 0ustar ellertellert ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000165013525245162033003 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute06-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000233113525245162033000 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000223613525245162033004 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000224013525245162032777 0ustar ellertellert ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/IntegerAttribute-IntegerAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/IntegerAttribute-Inte0000755000175000017500000000161013525245162032760 0ustar ellertellert ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000165213525245162033005 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000224213525245162033001 0ustar ellertellert ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000173313525245162033005 0ustar ellertellert ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/IntegerAttribute-IntegerAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/IntegerAttribute-Inte0000755000175000017500000000161313525245162032763 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute05-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000232113525245162032777 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000223513525245162033003 0ustar ellertellert ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/IntegerAttribute-IntegerAttribute05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/IntegerAttribute-Inte0000755000175000017500000000167413525245162032772 0ustar ellertellert ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/IntegerAttribute-IntegerAttribute06.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/IntegerAttribute-Inte0000755000175000017500000000170213525245162032762 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000223713525245162033005 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-IntegerAttribute03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/echoIntegerAttribute-0000755000175000017500000000223613525245162033004 0ustar ellertellert ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/IntegerAttribute-IntegerAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerAttribute/IntegerAttribute-Inte0000755000175000017500000000161113525245162032761 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/0000755000175000017500000000000013525245161027200 5ustar ellertellert././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStrict-AnyAttributeStrict03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStr0000755000175000017500000000213213525245161033067 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/AnyAttributeStrict-AnyAttributeStrict03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/AnyAttributeStrict-0000755000175000017500000000206613525245161033013 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStrict-AnyAttributeStrict02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStr0000755000175000017500000000205313525245161033071 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStrict-AnyAttributeStrict03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStr0000755000175000017500000000253713525245161033100 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/AnyAttributeStrict-AnyAttributeStrict01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/AnyAttributeStrict-0000755000175000017500000000201213525245161033002 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStrict-AnyAttributeStrict01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStr0000755000175000017500000000245213525245161033074 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/AnyAttributeStrict-AnyAttributeStrict02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/AnyAttributeStrict-0000755000175000017500000000201213525245161033002 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStrict-AnyAttributeStrict02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStr0000755000175000017500000000245213525245161033074 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStrict-AnyAttributeStrict03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStr0000755000175000017500000000253513525245161033076 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStrict-AnyAttributeStrict01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStr0000755000175000017500000000205313525245161033071 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStrict-AnyAttributeStrict01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStr0000755000175000017500000000245013525245161033072 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStrict-AnyAttributeStrict02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeStrict/echoAnyAttributeStr0000755000175000017500000000245013525245161033072 0ustar ellertellert Bobby Sox gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/0000755000175000017500000000000013525245161026354 5ustar ellertellert././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/echoAttributeGroup-AttributeGroup01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/echoAttributeGroup-Attr0000755000175000017500000000237113525245161033034 0ustar ellertellert 12345678910 ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/echoAttributeGroup-AttributeGroup02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/echoAttributeGroup-Attr0000755000175000017500000000167613525245161033043 0ustar ellertellert 9876543210 ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/echoAttributeGroup-AttributeGroup01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/echoAttributeGroup-Attr0000755000175000017500000000176613525245161033043 0ustar ellertellert 12345678910 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/echoAttributeGroup-AttributeGroup02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/echoAttributeGroup-Attr0000755000175000017500000000227313525245161033035 0ustar ellertellert 9876543210 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/echoAttributeGroup-AttributeGroup02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/echoAttributeGroup-Attr0000755000175000017500000000227113525245161033033 0ustar ellertellert 9876543210 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/AttributeGroup-AttributeGroup01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/AttributeGroup-Attribut0000755000175000017500000000173113525245161033060 0ustar ellertellert 12345678910 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/AttributeGroup-AttributeGroup02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/AttributeGroup-Attribut0000755000175000017500000000164413525245161033063 0ustar ellertellert 9876543210 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/echoAttributeGroup-AttributeGroup01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeGroup/echoAttributeGroup-Attr0000755000175000017500000000236713525245161033041 0ustar ellertellert 12345678910 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptyComplexType/0000755000175000017500000000000013525245161030176 5ustar ellertellert././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptyComplexType/echoElementEmptyComplexType-ElementEmptyComplexType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptyComplexType/echoElementEmp0000755000175000017500000000222013525245161033012 0ustar ellertellert ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptyComplexType/echoElementEmptyComplexType-ElementEmptyComplexType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptyComplexType/echoElementEmp0000755000175000017500000000165413525245161033024 0ustar ellertellert ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptyComplexType/ElementEmptyComplexType-ElementEmptyComplexType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptyComplexType/ElementEmptyCo0000755000175000017500000000161113525245161033015 0ustar ellertellert ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptyComplexType/echoElementEmptyComplexType-ElementEmptyComplexType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptyComplexType/echoElementEmp0000755000175000017500000000221613525245161033017 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/0000755000175000017500000000000013525245162030541 5ustar ellertellert././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/echoSimpleTypeEnumerationType-SimpleTypeEnumerationType02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/echoSimpleTy0000755000175000017500000000173113525245162033076 0ustar ellertellert Two ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/echoSimpleTypeEnumerationType-SimpleTypeEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/echoSimpleTy0000755000175000017500000000173113525245162033076 0ustar ellertellert One ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/SimpleTypeEnumerationType-SimpleTypeEnumerationType02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/SimpleTypeEn0000755000175000017500000000166413525245162033054 0ustar ellertellert Two././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/echoSimpleTypeEnumerationType-SimpleTypeEnumerationType02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/echoSimpleTy0000755000175000017500000000227113525245162033076 0ustar ellertellert Two ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/SimpleTypeEnumerationType-SimpleTypeEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/SimpleTypeEn0000755000175000017500000000166413525245162033054 0ustar ellertellert One././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/echoSimpleTypeEnumerationType-SimpleTypeEnumerationType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/echoSimpleTy0000755000175000017500000000227113525245162033076 0ustar ellertellert One ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/echoSimpleTypeEnumerationType-SimpleTypeEnumerationType02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/echoSimpleTy0000755000175000017500000000226713525245162033103 0ustar ellertellert Two ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/echoSimpleTypeEnumerationType-SimpleTypeEnumerationType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeEnumerationType/echoSimpleTy0000755000175000017500000000226713525245162033103 0ustar ellertellert One gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/0000755000175000017500000000000013525245162027503 5ustar ellertellert././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShortElement-UnsignedShortElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShort0000755000175000017500000000223513525245162033066 0ustar ellertellert -0 ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShortElement-UnsignedShortElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShort0000755000175000017500000000223413525245162033065 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShortElement-UnsignedShortElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShort0000755000175000017500000000167013525245162033070 0ustar ellertellert 65535 ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShortElement-UnsignedShortElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShort0000755000175000017500000000224013525245162033062 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShortElement-UnsignedShortElement04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShort0000755000175000017500000000224213525245162033064 0ustar ellertellert 65535 ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/UnsignedShortElement-UnsignedShortElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/UnsignedShortElem0000755000175000017500000000162613525245162033035 0ustar ellertellert +42././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShortElement-UnsignedShortElement04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShort0000755000175000017500000000224013525245162033062 0ustar ellertellert 65535 ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/UnsignedShortElement-UnsignedShortElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/UnsignedShortElem0000755000175000017500000000162513525245162033034 0ustar ellertellert -0././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShortElement-UnsignedShortElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShort0000755000175000017500000000166613525245162033075 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShortElement-UnsignedShortElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShort0000755000175000017500000000166413525245162033073 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShortElement-UnsignedShortElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShort0000755000175000017500000000223613525245162033067 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShortElement-UnsignedShortElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShort0000755000175000017500000000223713525245162033070 0ustar ellertellert -0 ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShortElement-UnsignedShortElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShort0000755000175000017500000000166513525245162033074 0ustar ellertellert -0 ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/UnsignedShortElement-UnsignedShortElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/UnsignedShortElem0000755000175000017500000000163013525245162033030 0ustar ellertellert 65535././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShortElement-UnsignedShortElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/echoUnsignedShort0000755000175000017500000000223613525245162033067 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/UnsignedShortElement-UnsignedShortElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortElement/UnsignedShortElem0000755000175000017500000000162413525245162033033 0ustar ellertellert 1gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinLength/0000755000175000017500000000000013525245162030502 5ustar ellertellert././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinLength/echoRestrictedStringMinLength-RestrictedStringMinLength01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinLength/echoRestrict0000755000175000017500000000230013525245162033061 0ustar ellertellert String Value ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinLength/RestrictedStringMinLength-RestrictedStringMinLength01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinLength/RestrictedSt0000755000175000017500000000167513525245162033060 0ustar ellertellert String Value././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinLength/echoRestrictedStringMinLength-RestrictedStringMinLength01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinLength/echoRestrict0000755000175000017500000000230213525245162033063 0ustar ellertellert String Value ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinLength/echoRestrictedStringMinLength-RestrictedStringMinLength01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinLength/echoRestrict0000755000175000017500000000174213525245162033072 0ustar ellertellert String Value gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/0000755000175000017500000000000013525245162030123 5ustar ellertellert././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/echoGlobalElementSimpleType-GlobalElementSimpleType02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/echoGlobalElem0000755000175000017500000000226013525245162032713 0ustar ellertellert value2 ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/echoGlobalElementSimpleType-GlobalElementSimpleType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/echoGlobalElem0000755000175000017500000000226013525245162032713 0ustar ellertellert value1 ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/echoGlobalElementSimpleType-GlobalElementSimpleType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/echoGlobalElem0000755000175000017500000000171613525245162032720 0ustar ellertellert value1 ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/echoGlobalElementSimpleType-GlobalElementSimpleType02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/echoGlobalElem0000755000175000017500000000226213525245162032715 0ustar ellertellert value2 ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/echoGlobalElementSimpleType-GlobalElementSimpleType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/echoGlobalElem0000755000175000017500000000226213525245162032715 0ustar ellertellert value1 ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/echoGlobalElementSimpleType-GlobalElementSimpleType02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/echoGlobalElem0000755000175000017500000000171613525245162032720 0ustar ellertellert value2 ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/GlobalElementSimpleType-GlobalElementSimpleType02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/GlobalElementS0000755000175000017500000000165313525245162032713 0ustar ellertellert value2././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/GlobalElementSimpleType-GlobalElementSimpleType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSimpleType/GlobalElementS0000755000175000017500000000165313525245162032713 0ustar ellertellert value1gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/0000755000175000017500000000000013525245162027273 5ustar ellertellert././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/echoExtendedSequenceLax-ExtendedSequenceLax02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/echoExtendedSequen0000755000175000017500000000220713525245162033002 0ustar ellertellert Bobby Sox William Mr ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/ExtendedSequenceLax-ExtendedSequenceLax01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/ExtendedSequenceLa0000755000175000017500000000174613525245162032737 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/echoExtendedSequenceLax-ExtendedSequenceLax02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/echoExtendedSequen0000755000175000017500000000261613525245162033006 0ustar ellertellert Bobby Sox William Mr ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/echoExtendedSequenceLax-ExtendedSequenceLax01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/echoExtendedSequen0000755000175000017500000000200513525245162032776 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/echoExtendedSequenceLax-ExtendedSequenceLax01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/echoExtendedSequen0000755000175000017500000000237213525245162033005 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/echoExtendedSequenceLax-ExtendedSequenceLax02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/echoExtendedSequen0000755000175000017500000000262013525245162033001 0ustar ellertellert Bobby Sox William Mr ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/echoExtendedSequenceLax-ExtendedSequenceLax01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/echoExtendedSequen0000755000175000017500000000237413525245162033007 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/ExtendedSequenceLax-ExtendedSequenceLax02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLax/ExtendedSequenceLa0000755000175000017500000000215013525245162032725 0ustar ellertellert Bobby Sox William Mr gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/0000755000175000017500000000000013525245162030150 5ustar ellertellert././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSequenceElement-SequenceSequenceElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSe0000755000175000017500000000250213525245162032774 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/SequenceSequenceElement-SequenceSequenceElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/SequenceSequen0000755000175000017500000000172613525245162033035 0ustar ellertellert Paul ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/SequenceSequenceElement-SequenceSequenceElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/SequenceSequen0000755000175000017500000000200413525245162033023 0ustar ellertellert Paul Sumner ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/SequenceSequenceElement-SequenceSequenceElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/SequenceSequen0000755000175000017500000000205613525245162033032 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSequenceElement-SequenceSequenceElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSe0000755000175000017500000000250413525245162032776 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSequenceElement-SequenceSequenceElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSe0000755000175000017500000000242613525245162033001 0ustar ellertellert Paul Sumner ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSequenceElement-SequenceSequenceElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSe0000755000175000017500000000212113525245162032771 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSequenceElement-SequenceSequenceElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSe0000755000175000017500000000234213525245162032776 0ustar ellertellert Paul ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSequenceElement-SequenceSequenceElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSe0000755000175000017500000000242413525245162032777 0ustar ellertellert Paul Sumner ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSequenceElement-SequenceSequenceElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSe0000755000175000017500000000177113525245162033003 0ustar ellertellert Paul ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSequenceElement-SequenceSequenceElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSe0000755000175000017500000000234413525245162033000 0ustar ellertellert Paul ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSequenceElement-SequenceSequenceElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSequenceElement/echoSequenceSe0000755000175000017500000000204713525245162033000 0ustar ellertellert Paul Sumner gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementUnqualifiedType/0000755000175000017500000000000013525245162031140 5ustar ellertellert././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementUnqualifiedType/echoGlobalElementUnqualifiedType-GlobalElementUnqualifiedType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementUnqualifiedType/echoGloba0000755000175000017500000000245313525245162032755 0ustar ellertellert string1 string2 ././@LongLink0000644000000000000000000000023300000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementUnqualifiedType/GlobalElementUnqualifiedType-GlobalElementUnqualifiedType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementUnqualifiedType/GlobalEle0000755000175000017500000000204013525245162032710 0ustar ellertellert string1 string2 ././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementUnqualifiedType/echoGlobalElementUnqualifiedType-GlobalElementUnqualifiedType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementUnqualifiedType/echoGloba0000755000175000017500000000245513525245162032757 0ustar ellertellert string1 string2 ././@LongLink0000644000000000000000000000023700000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementUnqualifiedType/echoGlobalElementUnqualifiedType-GlobalElementUnqualifiedType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementUnqualifiedType/echoGloba0000755000175000017500000000211013525245162032743 0ustar ellertellert string1 string2 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/0000755000175000017500000000000013525245161026473 5ustar ellertellert././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-DurationElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-Du0000755000175000017500000000221113525245161032721 0ustar ellertellert -P1347M ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-DurationElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-Du0000755000175000017500000000221013525245161032720 0ustar ellertellert P1347Y ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-DurationElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-Du0000755000175000017500000000163613525245161032733 0ustar ellertellert P1Y2M3DT10H30M ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/DurationElement-DurationElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/DurationElement-Durati0000755000175000017500000000160313525245161032746 0ustar ellertellert P1Y2M3DT10H30M././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-DurationElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-Du0000755000175000017500000000162313525245161032727 0ustar ellertellert P1M ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/DurationElement-DurationElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/DurationElement-Durati0000755000175000017500000000157413525245161032755 0ustar ellertellert -P1347M././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-DurationElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-Du0000755000175000017500000000162713525245161032733 0ustar ellertellert -P1347M ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-DurationElement04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-Du0000755000175000017500000000220713525245161032726 0ustar ellertellert P1M ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-DurationElement04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-Du0000755000175000017500000000220513525245161032724 0ustar ellertellert P1M ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/DurationElement-DurationElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/DurationElement-Durati0000755000175000017500000000157013525245161032751 0ustar ellertellert P1M././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-DurationElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-Du0000755000175000017500000000222013525245161032721 0ustar ellertellert P1Y2M3DT10H30M ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-DurationElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-Du0000755000175000017500000000221213525245161032722 0ustar ellertellert P1347Y ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/DurationElement-DurationElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/DurationElement-Durati0000755000175000017500000000157313525245161032754 0ustar ellertellert P1347Y././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-DurationElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-Du0000755000175000017500000000222213525245161032723 0ustar ellertellert P1Y2M3DT10H30M ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-DurationElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-Du0000755000175000017500000000162613525245161032732 0ustar ellertellert P1347Y ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-DurationElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DurationElement/echoDurationElement-Du0000755000175000017500000000221313525245161032723 0ustar ellertellert -P1347M gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictOther/0000755000175000017500000000000013525245162031021 5ustar ellertellert././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictOther/ExtendedSequenceStrictOther-ExtendedSequenceStrictOther01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictOther/ExtendedSe0000755000175000017500000000231113525245162032774 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictOther/echoExtendedSequenceStrictOther-ExtendedSequenceStrictOther01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictOther/echoExtend0000755000175000017500000000236313525245162033041 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictOther/echoExtendedSequenceStrictOther-ExtendedSequenceStrictOther01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictOther/echoExtend0000755000175000017500000000270413525245162033040 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictOther/echoExtendedSequenceStrictOther-ExtendedSequenceStrictOther01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictOther/echoExtend0000755000175000017500000000270213525245162033036 0ustar ellertellert String String Stuff gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerEnumerationType/0000755000175000017500000000000013525245162031566 5ustar ellertellert././@LongLink0000644000000000000000000000024500000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerEnumerationType/echoPositiveIntegerEnumerationType-PositiveIntegerEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerEnumerationType/echoPos0000755000175000017500000000177313525245162033124 0ustar ellertellert 12 ././@LongLink0000644000000000000000000000025400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerEnumerationType/echoPositiveIntegerEnumerationType-PositiveIntegerEnumerationType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerEnumerationType/echoPos0000755000175000017500000000231713525245162033117 0ustar ellertellert 12 ././@LongLink0000644000000000000000000000024100000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerEnumerationType/PositiveIntegerEnumerationType-PositiveIntegerEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerEnumerationType/Positiv0000755000175000017500000000172113525245162033152 0ustar ellertellert 12././@LongLink0000644000000000000000000000025400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerEnumerationType/echoPositiveIntegerEnumerationType-PositiveIntegerEnumerationType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerEnumerationType/echoPos0000755000175000017500000000232113525245162033112 0ustar ellertellert 12 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/0000755000175000017500000000000013525245162027661 5ustar ellertellert././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByteAttribute-UnsignedByteAttribute04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByte0000755000175000017500000000227413525245162033053 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByteAttribute-UnsignedByteAttribute02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByte0000755000175000017500000000227313525245162033052 0ustar ellertellert ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByteAttribute-UnsignedByteAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByte0000755000175000017500000000172013525245162033046 0ustar ellertellert ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByteAttribute-UnsignedByteAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByte0000755000175000017500000000171713525245162033054 0ustar ellertellert ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/UnsignedByteAttribute-UnsignedByteAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/UnsignedByteAttr0000755000175000017500000000165313525245162033047 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByteAttribute-UnsignedByteAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByte0000755000175000017500000000227513525245162033054 0ustar ellertellert ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/UnsignedByteAttribute-UnsignedByteAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/UnsignedByteAttr0000755000175000017500000000165413525245162033050 0ustar ellertellert ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByteAttribute-UnsignedByteAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByte0000755000175000017500000000172013525245162033046 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByteAttribute-UnsignedByteAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByte0000755000175000017500000000227313525245162033052 0ustar ellertellert ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByteAttribute-UnsignedByteAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByte0000755000175000017500000000171713525245162033054 0ustar ellertellert ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/UnsignedByteAttribute-UnsignedByteAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/UnsignedByteAttr0000755000175000017500000000165313525245162033047 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByteAttribute-UnsignedByteAttribute03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByte0000755000175000017500000000227613525245162033055 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByteAttribute-UnsignedByteAttribute02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByte0000755000175000017500000000227513525245162033054 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByteAttribute-UnsignedByteAttribute04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByte0000755000175000017500000000227613525245162033055 0ustar ellertellert ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/UnsignedByteAttribute-UnsignedByteAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/UnsignedByteAttr0000755000175000017500000000165413525245162033050 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByteAttribute-UnsignedByteAttribute03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedByteAttribute/echoUnsignedByte0000755000175000017500000000227413525245162033053 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleEnumerationType/0000755000175000017500000000000013525245161027657 5ustar ellertellert././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleEnumerationType/echoDoubleEnumerationType-DoubleEnumerationType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleEnumerationType/echoDoubleEnumer0000755000175000017500000000225713525245161033040 0ustar ellertellert 1267.43233E12 ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleEnumerationType/echoDoubleEnumerationType-DoubleEnumerationType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleEnumerationType/echoDoubleEnumer0000755000175000017500000000225513525245161033036 0ustar ellertellert 1267.43233E12 ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleEnumerationType/echoDoubleEnumerationType-DoubleEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleEnumerationType/echoDoubleEnumer0000755000175000017500000000170713525245161033037 0ustar ellertellert 1267.43233E12 ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleEnumerationType/DoubleEnumerationType-DoubleEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleEnumerationType/DoubleEnumeratio0000755000175000017500000000164613525245161033057 0ustar ellertellert 1267.43233E12gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/0000755000175000017500000000000013525245162026260 5ustar ellertellert././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/echoSequenceChoice-SequenceChoice02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/echoSequenceChoice-Sequ0000755000175000017500000000232713525245162032647 0ustar ellertellert home home ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/echoSequenceChoice-SequenceChoice02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/echoSequenceChoice-Sequ0000755000175000017500000000173013525245162032644 0ustar ellertellert home home ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/echoSequenceChoice-SequenceChoice01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/echoSequenceChoice-Sequ0000755000175000017500000000232713525245162032647 0ustar ellertellert home home ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/echoSequenceChoice-SequenceChoice02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/echoSequenceChoice-Sequ0000755000175000017500000000233113525245162032642 0ustar ellertellert home home ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/echoSequenceChoice-SequenceChoice01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/echoSequenceChoice-Sequ0000755000175000017500000000233113525245162032642 0ustar ellertellert home home ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/echoSequenceChoice-SequenceChoice01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/echoSequenceChoice-Sequ0000755000175000017500000000173013525245162032644 0ustar ellertellert home home ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/SequenceChoice-SequenceChoice01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/SequenceChoice-Sequence0000755000175000017500000000167613525245162032651 0ustar ellertellert home home ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/SequenceChoice-SequenceChoice02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceChoice/SequenceChoice-Sequence0000755000175000017500000000167613525245162032651 0ustar ellertellert home home gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/0000755000175000017500000000000013525245161026276 5ustar ellertellert././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/echoComplexTypeAll-ComplexTypeAll01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/echoComplexTypeAll-Comp0000755000175000017500000000251713525245161032666 0ustar ellertellert Widget 33 Light Blue ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/echoComplexTypeAll-ComplexTypeAll01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/echoComplexTypeAll-Comp0000755000175000017500000000210013525245161032652 0ustar ellertellert Widget 33 Light Blue ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/echoComplexTypeAll-ComplexTypeAll02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/echoComplexTypeAll-Comp0000755000175000017500000000251413525245161032663 0ustar ellertellert Green 21 Widget ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/echoComplexTypeAll-ComplexTypeAll02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/echoComplexTypeAll-Comp0000755000175000017500000000207313525245161032663 0ustar ellertellert Green 21 Widget ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/ComplexTypeAll-ComplexTypeAll01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/ComplexTypeAll-ComplexT0000755000175000017500000000204013525245161032653 0ustar ellertellert Widget 33 Light Blue ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/ComplexTypeAll-ComplexTypeAll02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/ComplexTypeAll-ComplexT0000755000175000017500000000203313525245161032655 0ustar ellertellert Green 21 Widget ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/echoComplexTypeAll-ComplexTypeAll02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/echoComplexTypeAll-Comp0000755000175000017500000000251213525245161032661 0ustar ellertellert Green 21 Widget ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/echoComplexTypeAll-ComplexTypeAll01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAll/echoComplexTypeAll-Comp0000755000175000017500000000252113525245161032661 0ustar ellertellert Widget 33 Light Blue gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ImportTypesNamespace/0000755000175000017500000000000013525245162027511 5ustar ellertellertgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryAttribute/0000755000175000017500000000000013525245162027152 5ustar ellertellert././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryAttribute/echoHexBinaryAttribute-HexBinaryAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryAttribute/echoHexBinaryAttrib0000755000175000017500000000225713525245162033004 0ustar ellertellert ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryAttribute/HexBinaryAttribute-HexBinaryAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryAttribute/HexBinaryAttribute-0000755000175000017500000000163213525245162032734 0ustar ellertellert ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryAttribute/echoHexBinaryAttribute-HexBinaryAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryAttribute/echoHexBinaryAttrib0000755000175000017500000000225513525245162033002 0ustar ellertellert ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryAttribute/echoHexBinaryAttribute-HexBinaryAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/HexBinaryAttribute/echoHexBinaryAttrib0000755000175000017500000000167313525245162033005 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementFormQualified/0000755000175000017500000000000013525245161027435 5ustar ellertellert././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementFormQualified/echoElementFormQualified-ElementFormQualified01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementFormQualified/echoElementFormQu0000755000175000017500000000232113525245161032743 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementFormQualified/echoElementFormQualified-ElementFormQualified01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementFormQualified/echoElementFormQu0000755000175000017500000000174013525245161032747 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementFormQualified/ElementFormQualified-ElementFormQualified01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementFormQualified/ElementFormQualif0000755000175000017500000000170013525245161032740 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementFormQualified/echoElementFormQualified-ElementFormQualified01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementFormQualified/echoElementFormQu0000755000175000017500000000231713525245161032750 0ustar ellertellert 1175 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeAbstract/0000755000175000017500000000000013525245162030453 5ustar ellertellert././@LongLink0000644000000000000000000000023100000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeAbstract/GlobalComplexTypeAbstract-GlobalComplexTypeAbstractExample01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeAbstract/GlobalComple0000755000175000017500000000173613525245162032750 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000024400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeAbstract/echoGlobalComplexTypeAbstract-GlobalComplexTypeAbstractExample01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeAbstract/echoGlobalCo0000755000175000017500000000235013525245162032722 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000024400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeAbstract/echoGlobalComplexTypeAbstract-GlobalComplexTypeAbstractExample01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeAbstract/echoGlobalCo0000755000175000017500000000235213525245162032724 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeAbstract/echoGlobalComplexTypeAbstract-GlobalComplexTypeAbstractExample01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeAbstract/echoGlobalCo0000755000175000017500000000200313525245162032715 0ustar ellertellert 1175 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherStrict/0000755000175000017500000000000013525245161030202 5ustar ellertellert././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherStrict/AnyAttributeOtherStrict-AnyAttributeOtherStrict01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherStrict/AnyAttributeOt0000755000175000017500000000220313525245161033043 0ustar ellertellert String String ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherStrict/echoAnyAttributeOtherStrict-AnyAttributeOtherStrict01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherStrict/echoAnyAttribu0000755000175000017500000000260013525245161033047 0ustar ellertellert String String ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherStrict/echoAnyAttributeOtherStrict-AnyAttributeOtherStrict01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherStrict/echoAnyAttribu0000755000175000017500000000225413525245161033054 0ustar ellertellert String String ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherStrict/echoAnyAttributeOtherStrict-AnyAttributeOtherStrict01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherStrict/echoAnyAttribu0000755000175000017500000000260213525245161033051 0ustar ellertellert String String gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/0000755000175000017500000000000013525245162027655 5ustar ellertellert././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/UnsignedLongAttribute-UnsignedLongAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/UnsignedLongAttr0000755000175000017500000000165313525245162033037 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLongAttribute-UnsignedLongAttribute04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLong0000755000175000017500000000231713525245162033041 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLongAttribute-UnsignedLongAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLong0000755000175000017500000000227513525245162033044 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLongAttribute-UnsignedLongAttribute03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLong0000755000175000017500000000227613525245162033045 0ustar ellertellert ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLongAttribute-UnsignedLongAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLong0000755000175000017500000000172113525245162033037 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLongAttribute-UnsignedLongAttribute03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLong0000755000175000017500000000227413525245162033043 0ustar ellertellert ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/UnsignedLongAttribute-UnsignedLongAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/UnsignedLongAttr0000755000175000017500000000167513525245162033043 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLongAttribute-UnsignedLongAttribute02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLong0000755000175000017500000000227313525245162033042 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLongAttribute-UnsignedLongAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLong0000755000175000017500000000227713525245162033046 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLongAttribute-UnsignedLongAttribute04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLong0000755000175000017500000000231513525245162033037 0ustar ellertellert ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLongAttribute-UnsignedLongAttribute02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLong0000755000175000017500000000227513525245162033044 0ustar ellertellert ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/UnsignedLongAttribute-UnsignedLongAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/UnsignedLongAttr0000755000175000017500000000165513525245162033041 0ustar ellertellert ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/UnsignedLongAttribute-UnsignedLongAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/UnsignedLongAttr0000755000175000017500000000165413525245162033040 0ustar ellertellert ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLongAttribute-UnsignedLongAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLong0000755000175000017500000000171713525245162033044 0ustar ellertellert ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLongAttribute-UnsignedLongAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLong0000755000175000017500000000172013525245162033036 0ustar ellertellert ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLongAttribute-UnsignedLongAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongAttribute/echoUnsignedLong0000755000175000017500000000174113525245162033041 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/0000755000175000017500000000000013525245162030014 5ustar ellertellert././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/echoFloatSimpleTypePattern-FloatSimpleTypePattern02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/echoFloatSimple0000755000175000017500000000170413525245162033022 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/echoFloatSimpleTypePattern-FloatSimpleTypePattern02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/echoFloatSimple0000755000175000017500000000225213525245162033021 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/FloatSimpleTypePattern-FloatSimpleTypePattern02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/FloatSimpleType0000755000175000017500000000164213525245162033026 0ustar ellertellert 009././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/echoFloatSimpleTypePattern-FloatSimpleTypePattern01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/echoFloatSimple0000755000175000017500000000225213525245162033021 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/echoFloatSimpleTypePattern-FloatSimpleTypePattern02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/echoFloatSimple0000755000175000017500000000225013525245162033017 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/echoFloatSimpleTypePattern-FloatSimpleTypePattern01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/echoFloatSimple0000755000175000017500000000225013525245162033017 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/echoFloatSimpleTypePattern-FloatSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/echoFloatSimple0000755000175000017500000000170413525245162033022 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/FloatSimpleTypePattern-FloatSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatSimpleTypePattern/FloatSimpleType0000755000175000017500000000164213525245162033026 0ustar ellertellert 123gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongEnumerationType/0000755000175000017500000000000013525245162027345 5ustar ellertellert././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongEnumerationType/echoLongEnumerationType-LongEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongEnumerationType/echoLongEnumeratio0000755000175000017500000000166313525245162033070 0ustar ellertellert 9152052 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongEnumerationType/echoLongEnumerationType-LongEnumerationType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongEnumerationType/echoLongEnumeratio0000755000175000017500000000223713525245162033066 0ustar ellertellert 9152052 ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongEnumerationType/LongEnumerationType-LongEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongEnumerationType/LongEnumerationTyp0000755000175000017500000000162413525245162033101 0ustar ellertellert 9152052././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongEnumerationType/echoLongEnumerationType-LongEnumerationType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongEnumerationType/echoLongEnumeratio0000755000175000017500000000223513525245162033064 0ustar ellertellert 9152052 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/0000755000175000017500000000000013525245162026432 5ustar ellertellert././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/echoLanguageElement-LanguageElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/echoLanguageElement-La0000755000175000017500000000162213525245162032607 0ustar ellertellert fr ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/LanguageElement-LanguageElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/LanguageElement-Langua0000755000175000017500000000156713525245162032633 0ustar ellertellert en././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/echoLanguageElement-LanguageElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/echoLanguageElement-La0000755000175000017500000000220613525245162032606 0ustar ellertellert en ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/LanguageElement-LanguageElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/LanguageElement-Langua0000755000175000017500000000156713525245162032633 0ustar ellertellert fr././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/echoLanguageElement-LanguageElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/echoLanguageElement-La0000755000175000017500000000220413525245162032604 0ustar ellertellert fr ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/echoLanguageElement-LanguageElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/echoLanguageElement-La0000755000175000017500000000220413525245162032604 0ustar ellertellert en ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/echoLanguageElement-LanguageElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/echoLanguageElement-La0000755000175000017500000000220613525245162032606 0ustar ellertellert fr ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/echoLanguageElement-LanguageElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageElement/echoLanguageElement-La0000755000175000017500000000162213525245162032607 0ustar ellertellert en gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/0000755000175000017500000000000013525245161025611 5ustar ellertellert././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElemen0000755000175000017500000000216113525245161032642 0ustar ellertellert 127 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElemen0000755000175000017500000000216213525245161032643 0ustar ellertellert -128 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/ByteElement-ByteElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/ByteElement-ByteElement03.0000755000175000017500000000154113525245161032411 0ustar ellertellert -128././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElemen0000755000175000017500000000216313525245161032644 0ustar ellertellert 127 ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElemen0000755000175000017500000000157013525245161032645 0ustar ellertellert -128 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/ByteElement-ByteElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/ByteElement-ByteElement02.0000755000175000017500000000154013525245161032407 0ustar ellertellert 127././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElemen0000755000175000017500000000156713525245161032653 0ustar ellertellert 127 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/ByteElement-ByteElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/ByteElement-ByteElement01.0000755000175000017500000000153613525245161032413 0ustar ellertellert 1././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElemen0000755000175000017500000000156513525245161032651 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElemen0000755000175000017500000000215713525245161032647 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElemen0000755000175000017500000000216413525245161032645 0ustar ellertellert -128 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ByteElement/echoByteElement-ByteElemen0000755000175000017500000000216113525245161032642 0ustar ellertellert 1 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequenceAny/0000755000175000017500000000000013525245162030250 5ustar ellertellert././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequenceAny/echoGlobalElementSequenceAny-GlobalElementSequenceAny01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequenceAny/echoGlobalEle0000755000175000017500000000234413525245162032666 0ustar ellertellert some data ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequenceAny/echoGlobalElementSequenceAny-GlobalElementSequenceAny01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequenceAny/echoGlobalEle0000755000175000017500000000234613525245162032670 0ustar ellertellert some data ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequenceAny/echoGlobalElementSequenceAny-GlobalElementSequenceAny01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequenceAny/echoGlobalEle0000755000175000017500000000177513525245162032675 0ustar ellertellert some data ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequenceAny/GlobalElementSequenceAny-GlobalElementSequenceAny01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementSequenceAny/GlobalElement0000755000175000017500000000173113525245162032712 0ustar ellertellert some data gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalSimpleType/0000755000175000017500000000000013525245162026611 5ustar ellertellert././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalSimpleType/echoGlobalSimpleType-GlobalSimpleType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalSimpleType/echoGlobalSimpleType-0000755000175000017500000000221213525245162032664 0ustar ellertellert foo ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalSimpleType/echoGlobalSimpleType-GlobalSimpleType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalSimpleType/echoGlobalSimpleType-0000755000175000017500000000221413525245162032666 0ustar ellertellert foo ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalSimpleType/echoGlobalSimpleType-GlobalSimpleType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalSimpleType/echoGlobalSimpleType-0000755000175000017500000000163213525245162032671 0ustar ellertellert foo ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalSimpleType/GlobalSimpleType-GlobalSimpleType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalSimpleType/GlobalSimpleType-Glob0000755000175000017500000000157613525245162032645 0ustar ellertellert foogsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementReference/0000755000175000017500000000000013525245162026605 5ustar ellertellert././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementReference/echoElementReference-ElementReference01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementReference/echoElementReference-0000755000175000017500000000233713525245162032664 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementReference/echoElementReference-ElementReference01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementReference/echoElementReference-0000755000175000017500000000173413525245162032664 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementReference/echoElementReference-ElementReference01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementReference/echoElementReference-0000755000175000017500000000234113525245162032657 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementReference/ElementReference-ElementReference01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementReference/ElementReference-Elem0000755000175000017500000000167413525245162032633 0ustar ellertellert Bobby Sox gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITYElement/0000755000175000017500000000000013525245162025723 5ustar ellertellert././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITYElement/ENTITYElement-ENTITYElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITYElement/ENTITYElement-ENTITYElem0000755000175000017500000000155313525245162032020 0ustar ellertellert lt././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITYElement/echoENTITYElement-ENTITYElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITYElement/echoENTITYElement-ENTITY0000755000175000017500000000160413525245162032051 0ustar ellertellert lt ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITYElement/echoENTITYElement-ENTITYElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITYElement/echoENTITYElement-ENTITY0000755000175000017500000000217413525245162032054 0ustar ellertellert lt ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITYElement/echoENTITYElement-ENTITYElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITYElement/echoENTITYElement-ENTITY0000755000175000017500000000217213525245162032052 0ustar ellertellert lt gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/0000755000175000017500000000000013525245161026471 5ustar ellertellert././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-ChoiceMinOccurs003-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-0000755000175000017500000000216413525245161032433 0ustar ellertellert ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-ChoiceMinOccurs003.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-0000755000175000017500000000160213525245161032427 0ustar ellertellert ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-ChoiceMinOccurs001.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-0000755000175000017500000000172513525245161032435 0ustar ellertellert A ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/ChoiceMinOccurs0-ChoiceMinOccurs003.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/ChoiceMinOccurs0-Choi0000755000175000017500000000154613525245161032402 0ustar ellertellert ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-ChoiceMinOccurs002.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-0000755000175000017500000000172513525245161032435 0ustar ellertellert B ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/ChoiceMinOccurs0-ChoiceMinOccurs001.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/ChoiceMinOccurs0-Choi0000755000175000017500000000167113525245161032401 0ustar ellertellert A ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/ChoiceMinOccurs0-ChoiceMinOccurs002.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/ChoiceMinOccurs0-Choi0000755000175000017500000000167113525245161032401 0ustar ellertellert B ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-ChoiceMinOccurs001-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-0000755000175000017500000000231413525245161032430 0ustar ellertellert A ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-ChoiceMinOccurs002-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-0000755000175000017500000000231413525245161032430 0ustar ellertellert B ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-ChoiceMinOccurs003-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-0000755000175000017500000000216213525245161032431 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-ChoiceMinOccurs001-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-0000755000175000017500000000231613525245161032432 0ustar ellertellert A ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-ChoiceMinOccurs002-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccurs0/echoChoiceMinOccurs0-0000755000175000017500000000231613525245161032432 0ustar ellertellert B gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/0000755000175000017500000000000013525245162031543 5ustar ellertellert././@LongLink0000644000000000000000000000025400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/echoUnsignedShortSimpleTypePattern-UnsignedShortSimpleTypePattern02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/echoUns0000755000175000017500000000232213525245162033074 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000024500000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/echoUnsignedShortSimpleTypePattern-UnsignedShortSimpleTypePattern02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/echoUns0000755000175000017500000000177413525245162033106 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000024100000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/UnsignedShortSimpleTypePattern-UnsignedShortSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/Unsigne0000755000175000017500000000172213525245162033103 0ustar ellertellert 123././@LongLink0000644000000000000000000000025400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/echoUnsignedShortSimpleTypePattern-UnsignedShortSimpleTypePattern01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/echoUns0000755000175000017500000000232213525245162033074 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000024100000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/UnsignedShortSimpleTypePattern-UnsignedShortSimpleTypePattern02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/Unsigne0000755000175000017500000000172213525245162033103 0ustar ellertellert 009././@LongLink0000644000000000000000000000024500000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/echoUnsignedShortSimpleTypePattern-UnsignedShortSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/echoUns0000755000175000017500000000177413525245162033106 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000025400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/echoUnsignedShortSimpleTypePattern-UnsignedShortSimpleTypePattern01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/echoUns0000755000175000017500000000232013525245162033072 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000025400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/echoUnsignedShortSimpleTypePattern-UnsignedShortSimpleTypePattern02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortSimpleTypePattern/echoUns0000755000175000017500000000232013525245162033072 0ustar ellertellert 009 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/0000755000175000017500000000000013525245162030341 5ustar ellertellert././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/NegativeIntegerAttribute-NegativeIntegerAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/NegativeInteg0000755000175000017500000000175313525245162033026 0ustar ellertellert ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/echoNegativeIntegerAttribute-NegativeIntegerAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/echoNegativeI0000755000175000017500000000231713525245162033004 0ustar ellertellert ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/echoNegativeIntegerAttribute-NegativeIntegerAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/echoNegativeI0000755000175000017500000000202213525245162032775 0ustar ellertellert ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/echoNegativeIntegerAttribute-NegativeIntegerAttribute02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/echoNegativeI0000755000175000017500000000237013525245162033003 0ustar ellertellert ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/echoNegativeIntegerAttribute-NegativeIntegerAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/echoNegativeI0000755000175000017500000000175113525245162033005 0ustar ellertellert ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/echoNegativeIntegerAttribute-NegativeIntegerAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/echoNegativeI0000755000175000017500000000232113525245162032777 0ustar ellertellert ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/NegativeIntegerAttribute-NegativeIntegerAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/NegativeInteg0000755000175000017500000000170213525245162033020 0ustar ellertellert ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/echoNegativeIntegerAttribute-NegativeIntegerAttribute02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerAttribute/echoNegativeI0000755000175000017500000000237213525245162033005 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAbstract/0000755000175000017500000000000013525245162027573 5ustar ellertellert././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAbstract/echoGlobalElementAbstract-GlobalElementAbstract01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAbstract/echoGlobalElemen0000755000175000017500000000237213525245162032712 0ustar ellertellert String ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAbstract/GlobalElementAbstract-GlobalElementAbstract01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAbstract/GlobalElementAbs0000755000175000017500000000175213525245162032666 0ustar ellertellert String ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAbstract/echoGlobalElementAbstract-GlobalElementAbstract01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAbstract/echoGlobalElemen0000755000175000017500000000237013525245162032710 0ustar ellertellert String ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAbstract/echoGlobalElementAbstract-GlobalElementAbstract01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAbstract/echoGlobalElemen0000755000175000017500000000201313525245162032702 0ustar ellertellert String gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceAnyStrict/0000755000175000017500000000000013525245162027006 5ustar ellertellert././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceAnyStrict/echoSequenceAnyStrict-SequenceAnyStrict01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceAnyStrict/echoSequenceAnyStric0000755000175000017500000000230413525245162033017 0ustar ellertellert string ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceAnyStrict/echoSequenceAnyStrict-SequenceAnyStrict01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceAnyStrict/echoSequenceAnyStric0000755000175000017500000000171713525245162033026 0ustar ellertellert string ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceAnyStrict/echoSequenceAnyStrict-SequenceAnyStrict01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceAnyStrict/echoSequenceAnyStric0000755000175000017500000000230613525245162033021 0ustar ellertellert string ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceAnyStrict/SequenceAnyStrict-SequenceAnyStrict01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceAnyStrict/SequenceAnyStrict-Se0000755000175000017500000000166213525245162032717 0ustar ellertellert string gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/0000755000175000017500000000000013525245162030017 5ustar ellertellert././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/echoExtendedSequenceStrict-ExtendedSequenceStrict02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/echoExtendedSeq0000755000175000017500000000263713525245162033025 0ustar ellertellert Bobby Sox William Mr ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/echoExtendedSequenceStrict-ExtendedSequenceStrict02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/echoExtendedSeq0000755000175000017500000000223413525245162033016 0ustar ellertellert Bobby Sox William Mr ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/echoExtendedSequenceStrict-ExtendedSequenceStrict01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/echoExtendedSeq0000755000175000017500000000203213525245162033012 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/ExtendedSequenceStrict-ExtendedSequenceStrict02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/ExtendedSequenc0000755000175000017500000000217213525245162033033 0ustar ellertellert Bobby Sox William Mr ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/ExtendedSequenceStrict-ExtendedSequenceStrict01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/ExtendedSequenc0000755000175000017500000000177013525245162033036 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/echoExtendedSequenceStrict-ExtendedSequenceStrict02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/echoExtendedSeq0000755000175000017500000000263513525245162033023 0ustar ellertellert Bobby Sox William Mr ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/echoExtendedSequenceStrict-ExtendedSequenceStrict01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/echoExtendedSeq0000755000175000017500000000241313525245162033015 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/echoExtendedSequenceStrict-ExtendedSequenceStrict01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrict/echoExtendedSeq0000755000175000017500000000241113525245162033013 0ustar ellertellert Bobby Sox gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSElement/0000755000175000017500000000000013525245162026145 5ustar ellertellert././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSElement/echoNMTOKENSElement-NMTOKENSElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSElement/echoNMTOKENSElement-NM0000755000175000017500000000164313525245162032016 0ustar ellertellert a b c d e.b:s-w_x:q ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSElement/echoNMTOKENSElement-NMTOKENSElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSElement/echoNMTOKENSElement-NM0000755000175000017500000000222513525245162032013 0ustar ellertellert a b c d e.b:s-w_x:q ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSElement/echoNMTOKENSElement-NMTOKENSElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSElement/echoNMTOKENSElement-NM0000755000175000017500000000222713525245162032015 0ustar ellertellert a b c d e.b:s-w_x:q ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSElement/NMTOKENSElement-NMTOKENSElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSElement/NMTOKENSElement-NMTOKE0000755000175000017500000000161013525245162031634 0ustar ellertellert a b c d e.b:s-w_x:qgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceElement/0000755000175000017500000000000013525245162026457 5ustar ellertellert././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceElement/echoSequenceElement-SequenceElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceElement/echoSequenceElement-Se0000755000175000017500000000243613525245162032700 0ustar ellertellert element1 element2 element3 ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceElement/echoSequenceElement-SequenceElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceElement/echoSequenceElement-Se0000755000175000017500000000243413525245162032676 0ustar ellertellert element1 element2 element3 ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceElement/echoSequenceElement-SequenceElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceElement/echoSequenceElement-Se0000755000175000017500000000203313525245162032671 0ustar ellertellert element1 element2 element3 ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceElement/SequenceElement-SequenceElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceElement/SequenceElement-Sequen0000755000175000017500000000200013525245162032715 0ustar ellertellert element1 element2 element3 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/0000755000175000017500000000000013525245162026541 5ustar ellertellert././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-GMonthDayElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-0000755000175000017500000000164413525245162032554 0ustar ellertellert --12-31+01:00 ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-GMonthDayElement04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-0000755000175000017500000000222413525245162032547 0ustar ellertellert --12-31+01:00 ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-GMonthDayElement04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-0000755000175000017500000000222613525245162032551 0ustar ellertellert --12-31+01:00 ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-GMonthDayElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-0000755000175000017500000000164413525245162032554 0ustar ellertellert --12-31-05:00 ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/GMonthDayElement-GMonthDayElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/GMonthDayElement-GMon0000755000175000017500000000160313525245162032471 0ustar ellertellert --12-31Z././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-GMonthDayElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-0000755000175000017500000000222113525245162032544 0ustar ellertellert --12-31Z ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-GMonthDayElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-0000755000175000017500000000222013525245162032543 0ustar ellertellert --12-31 ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/GMonthDayElement-GMonthDayElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/GMonthDayElement-GMon0000755000175000017500000000160213525245162032470 0ustar ellertellert --12-31././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-GMonthDayElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-0000755000175000017500000000222613525245162032551 0ustar ellertellert --12-31-05:00 ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/GMonthDayElement-GMonthDayElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/GMonthDayElement-GMon0000755000175000017500000000161013525245162032467 0ustar ellertellert --12-31+01:00././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-GMonthDayElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-0000755000175000017500000000221613525245162032550 0ustar ellertellert --12-31 ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-GMonthDayElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-0000755000175000017500000000163613525245162032555 0ustar ellertellert --12-31 ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/GMonthDayElement-GMonthDayElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/GMonthDayElement-GMon0000755000175000017500000000161013525245162032467 0ustar ellertellert --12-31-05:00././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-GMonthDayElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-0000755000175000017500000000222413525245162032547 0ustar ellertellert --12-31-05:00 ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-GMonthDayElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-0000755000175000017500000000221713525245162032551 0ustar ellertellert --12-31Z ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-GMonthDayElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayElement/echoGMonthDayElement-0000755000175000017500000000163713525245162032556 0ustar ellertellert --12-31Z gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementBlock/0000755000175000017500000000000013525245162027062 5ustar ellertellert././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementBlock/GlobalElementBlock-GlobalElementBlockExample01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementBlock/GlobalElementBlock-0000755000175000017500000000161413525245162032554 0ustar ellertellert Stuff././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementBlock/echoGlobalElementBlock-GlobalElementBlockExample01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementBlock/echoGlobalElementBl0000755000175000017500000000165213525245162032643 0ustar ellertellert Stuff ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementBlock/echoGlobalElementBlock-GlobalElementBlockExample01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementBlock/echoGlobalElementBl0000755000175000017500000000223013525245162032634 0ustar ellertellert Stuff ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementBlock/echoGlobalElementBlock-GlobalElementBlockExample01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementBlock/echoGlobalElementBl0000755000175000017500000000222613525245162032641 0ustar ellertellert Stuff gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributes/0000755000175000017500000000000013525245161030556 5ustar ellertellert././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributes/echoComplexTypeOnlyAttributes-ComplexTypeOnlyAttributes01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributes/echoComplexT0000755000175000017500000000240013525245161033072 0ustar ellertellert ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributes/echoComplexTypeOnlyAttributes-ComplexTypeOnlyAttributes01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributes/echoComplexT0000755000175000017500000000237613525245161033106 0ustar ellertellert ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributes/ComplexTypeOnlyAttributes-ComplexTypeOnlyAttributes01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributes/ComplexTypeO0000755000175000017500000000175113525245161033100 0ustar ellertellert ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributes/echoComplexTypeOnlyAttributes-ComplexTypeOnlyAttributes01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributes/echoComplexT0000755000175000017500000000202413525245161033074 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/0000755000175000017500000000000013525245161026272 5ustar ellertellert././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/echoElementDefault-ElementDefault01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/echoElementDefault-Elem0000755000175000017500000000226613525245161032643 0ustar ellertellert default ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/ElementDefault-ElementDefault01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/ElementDefault-ElementD0000755000175000017500000000163713525245161032620 0ustar ellertellert default ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/echoElementDefault-ElementDefault02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/echoElementDefault-Elem0000755000175000017500000000167513525245161032646 0ustar ellertellert wrong value ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/echoElementDefault-ElementDefault01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/echoElementDefault-Elem0000755000175000017500000000167113525245161032642 0ustar ellertellert default ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/echoElementDefault-ElementDefault02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/echoElementDefault-Elem0000755000175000017500000000227213525245161032640 0ustar ellertellert wrong value ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/ElementDefault-ElementDefault02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/ElementDefault-ElementD0000755000175000017500000000164313525245161032615 0ustar ellertellert wrong value ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/echoElementDefault-ElementDefault02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/echoElementDefault-Elem0000755000175000017500000000227013525245161032636 0ustar ellertellert wrong value ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/echoElementDefault-ElementDefault01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementDefault/echoElementDefault-Elem0000755000175000017500000000226413525245161032641 0ustar ellertellert default gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/0000755000175000017500000000000013525245161027045 5ustar ellertellert././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/echoAttributeOptional-AttributeOptional02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/echoAttributeOptiona0000755000175000017500000000175413525245161033136 0ustar ellertellert 1250 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/echoAttributeOptional-AttributeOptional01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/echoAttributeOptiona0000755000175000017500000000242513525245161033132 0ustar ellertellert 1250 ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/AttributeOptional-AttributeOptional02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/AttributeOptional-At0000755000175000017500000000171413525245161033011 0ustar ellertellert 1250 ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/echoAttributeOptional-AttributeOptional01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/echoAttributeOptiona0000755000175000017500000000202413525245161033125 0ustar ellertellert 1250 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/echoAttributeOptional-AttributeOptional02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/echoAttributeOptiona0000755000175000017500000000235113525245161033130 0ustar ellertellert 1250 ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/AttributeOptional-AttributeOptional01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/AttributeOptional-At0000755000175000017500000000176113525245161033013 0ustar ellertellert 1250 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/echoAttributeOptional-AttributeOptional01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/echoAttributeOptiona0000755000175000017500000000242713525245161033134 0ustar ellertellert 1250 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/echoAttributeOptional-AttributeOptional02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeOptional/echoAttributeOptiona0000755000175000017500000000234713525245161033135 0ustar ellertellert 1250 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntEnumerationType/0000755000175000017500000000000013525245162030675 5ustar ellertellert././@LongLink0000644000000000000000000000022500000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntEnumerationType/UnsignedIntEnumerationType-UnsignedIntEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntEnumerationType/UnsignedInt0000755000175000017500000000170113525245162033051 0ustar ellertellert 3333333333././@LongLink0000644000000000000000000000024000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntEnumerationType/echoUnsignedIntEnumerationType-UnsignedIntEnumerationType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntEnumerationType/echoUnsigne0000755000175000017500000000230313525245162033070 0ustar ellertellert 3333333333 ././@LongLink0000644000000000000000000000024000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntEnumerationType/echoUnsignedIntEnumerationType-UnsignedIntEnumerationType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntEnumerationType/echoUnsigne0000755000175000017500000000230513525245162033072 0ustar ellertellert 3333333333 ././@LongLink0000644000000000000000000000023100000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntEnumerationType/echoUnsignedIntEnumerationType-UnsignedIntEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntEnumerationType/echoUnsigne0000755000175000017500000000174713525245162033103 0ustar ellertellert 3333333333 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BlockDefault/0000755000175000017500000000000013525245161025733 5ustar ellertellert././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BlockDefault/echoBlockDefault-BlockDefault01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BlockDefault/echoBlockDefault-BlockDef0000755000175000017500000000217013525245161032526 0ustar ellertellert foo ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BlockDefault/echoBlockDefault-BlockDefault01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BlockDefault/echoBlockDefault-BlockDef0000755000175000017500000000216613525245161032533 0ustar ellertellert foo ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BlockDefault/echoBlockDefault-BlockDefault01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BlockDefault/echoBlockDefault-BlockDef0000755000175000017500000000157613525245161032537 0ustar ellertellert foo ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BlockDefault/BlockDefault-BlockDefault01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BlockDefault/BlockDefault-BlockDefault0000755000175000017500000000154613525245161032563 0ustar ellertellert foogsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearSimpleTypePattern/0000755000175000017500000000000013525245162027756 5ustar ellertellert././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearSimpleTypePattern/GYearSimpleTypePattern-GYearSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearSimpleTypePattern/GYearSimpleType0000755000175000017500000000164313525245162032733 0ustar ellertellert 2009././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearSimpleTypePattern/echoGYearSimpleTypePattern-GYearSimpleTypePattern01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearSimpleTypePattern/echoGYearSimple0000755000175000017500000000225313525245162032726 0ustar ellertellert 2009 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearSimpleTypePattern/echoGYearSimpleTypePattern-GYearSimpleTypePattern01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearSimpleTypePattern/echoGYearSimple0000755000175000017500000000225113525245162032724 0ustar ellertellert 2009 ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearSimpleTypePattern/echoGYearSimpleTypePattern-GYearSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearSimpleTypePattern/echoGYearSimple0000755000175000017500000000170513525245162032727 0ustar ellertellert 2009 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/0000755000175000017500000000000013525245161025563 5ustar ellertellert././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000217313525245161032543 0ustar ellertellert 2038-05-31Z ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000217013525245161032540 0ustar ellertellert 0739-05-31 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/DateElement-DateElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/DateElement-DateElement03.0000755000175000017500000000155013525245161032307 0ustar ellertellert 2038-05-31Z././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000217613525245161032546 0ustar ellertellert 1999-05-31+05:43 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000220013525245161032532 0ustar ellertellert 1999-05-31+05:43 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/DateElement-DateElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/DateElement-DateElement02.0000755000175000017500000000154713525245161032314 0ustar ellertellert 0739-05-31././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000217213525245161032542 0ustar ellertellert 1999-05-31 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000217113525245161032541 0ustar ellertellert 2038-05-31Z ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/DateElement-DateElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/DateElement-DateElement01.0000755000175000017500000000154713525245161032313 0ustar ellertellert 1999-05-31././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000217013525245161032540 0ustar ellertellert 1999-05-31 ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000160413525245161032541 0ustar ellertellert 1999-05-31+05:43 ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000157713525245161032552 0ustar ellertellert 2038-05-31Z ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement05-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000217113525245161032541 0ustar ellertellert 10739-05-31 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement05-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000217313525245161032543 0ustar ellertellert 10739-05-31 ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000157713525245161032552 0ustar ellertellert 10739-05-31 ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000157613525245161032551 0ustar ellertellert 0739-05-31 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000217213525245161032542 0ustar ellertellert 0739-05-31 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/DateElement-DateElement05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/DateElement-DateElement05.0000755000175000017500000000155013525245161032311 0ustar ellertellert 10739-05-31././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/echoDateElement-DateElemen0000755000175000017500000000157613525245161032551 0ustar ellertellert 1999-05-31 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/DateElement-DateElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateElement/DateElement-DateElement04.0000755000175000017500000000155513525245161032315 0ustar ellertellert 1999-05-31+05:43gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/0000755000175000017500000000000013525245162027767 5ustar ellertellert././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/echoNegativeIntegerElement-NegativeIntegerElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/echoNegativeInt0000755000175000017500000000232213525245162032770 0ustar ellertellert -12343242342345345346453643564536543645363456 ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/echoNegativeIntegerElement-NegativeIntegerElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/echoNegativeInt0000755000175000017500000000170313525245162032772 0ustar ellertellert -1 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/NegativeIntegerElement-NegativeIntegerElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/NegativeInteger0000755000175000017500000000171413525245162033000 0ustar ellertellert -12343242342345345346453643564536543645363456././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/echoNegativeIntegerElement-NegativeIntegerElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/echoNegativeInt0000755000175000017500000000232413525245162032772 0ustar ellertellert -12343242342345345346453643564536543645363456 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/echoNegativeIntegerElement-NegativeIntegerElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/echoNegativeInt0000755000175000017500000000225113525245162032771 0ustar ellertellert -1 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/NegativeIntegerElement-NegativeIntegerElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/NegativeInteger0000755000175000017500000000164113525245162032777 0ustar ellertellert -1././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/echoNegativeIntegerElement-NegativeIntegerElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/echoNegativeInt0000755000175000017500000000175613525245162033002 0ustar ellertellert -12343242342345345346453643564536543645363456 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/echoNegativeIntegerElement-NegativeIntegerElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NegativeIntegerElement/echoNegativeInt0000755000175000017500000000224713525245162032776 0ustar ellertellert -1 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeElementNameClash/0000755000175000017500000000000013525245161030425 5ustar ellertellert././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeElementNameClash/echoAttributeElementNameClash-AttributeElementNameClash01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeElementNameClash/echoAttribut0000755000175000017500000000213013525245161033004 0ustar ellertellert Bobby Sox Mr ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeElementNameClash/echoAttributeElementNameClash-AttributeElementNameClash01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeElementNameClash/echoAttribut0000755000175000017500000000255113525245161033013 0ustar ellertellert Bobby Sox Mr ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeElementNameClash/AttributeElementNameClash-AttributeElementNameClash01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeElementNameClash/AttributeEle0000755000175000017500000000204113525245161032741 0ustar ellertellert Bobby Sox Mr ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeElementNameClash/echoAttributeElementNameClash-AttributeElementNameClash01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeElementNameClash/echoAttribut0000755000175000017500000000255313525245161033015 0ustar ellertellert Bobby Sox Mr gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeFixed/0000755000175000017500000000000013525245161026317 5ustar ellertellert././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeFixed/echoAttributeFixed-AttributeFixed01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeFixed/echoAttributeFixed-Attr0000755000175000017500000000237113525245161032742 0ustar ellertellert 500 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeFixed/AttributeFixed-AttributeFixed01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeFixed/AttributeFixed-Attribut0000755000175000017500000000172213525245161032766 0ustar ellertellert 500 ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeFixed/echoAttributeFixed-AttributeFixed01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeFixed/echoAttributeFixed-Attr0000755000175000017500000000176213525245161032745 0ustar ellertellert 500 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeFixed/echoAttributeFixed-AttributeFixed01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeFixed/echoAttributeFixed-Attr0000755000175000017500000000237313525245161032744 0ustar ellertellert 500 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/0000755000175000017500000000000013525245162030752 5ustar ellertellert././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/echoElementTypeDefaultNamespace-ElementTypeDefaultNamespace02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/echoElemen0000755000175000017500000000232713525245162032750 0ustar ellertellert This is a string! ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/echoElementTypeDefaultNamespace-ElementTypeDefaultNamespace02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/echoElemen0000755000175000017500000000177713525245162032760 0ustar ellertellert This is a string! ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/echoElementTypeDefaultNamespace-ElementTypeDefaultNamespace02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/echoElemen0000755000175000017500000000232513525245162032746 0ustar ellertellert This is a string! ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/echoElementTypeDefaultNamespace-ElementTypeDefaultNamespace01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/echoElemen0000755000175000017500000000224213525245162032744 0ustar ellertellert ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/echoElementTypeDefaultNamespace-ElementTypeDefaultNamespace01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/echoElemen0000755000175000017500000000171413525245162032747 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/echoElementTypeDefaultNamespace-ElementTypeDefaultNamespace01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/echoElemen0000755000175000017500000000224413525245162032746 0ustar ellertellert ././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/ElementTypeDefaultNamespace-ElementTypeDefaultNamespace01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/ElementTyp0000755000175000017500000000164713525245162032776 0ustar ellertellert ././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/ElementTypeDefaultNamespace-ElementTypeDefaultNamespace02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeDefaultNamespace/ElementTyp0000755000175000017500000000173213525245162032771 0ustar ellertellert This is a string!gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/0000755000175000017500000000000013525245161027451 5ustar ellertellert././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/echoAnySimpleTypeElement-AnySimpleTypeElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/echoAnySimpleType0000755000175000017500000000170513525245161033004 0ustar ellertellert anySimpleTypeValue ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/echoAnySimpleTypeElement-AnySimpleTypeElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/echoAnySimpleType0000755000175000017500000000225713525245161033007 0ustar ellertellert anySimpleTypeValue ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/echoAnySimpleTypeElement-AnySimpleTypeElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/echoAnySimpleType0000755000175000017500000000225513525245161033005 0ustar ellertellert anySimpleTypeValue ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/AnySimpleTypeElement-AnySimpleTypeElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/AnySimpleTypeElem0000755000175000017500000000157213525245161032752 0ustar ellertellert ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/echoAnySimpleTypeElement-AnySimpleTypeElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/echoAnySimpleType0000755000175000017500000000220413525245161032777 0ustar ellertellert ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/echoAnySimpleTypeElement-AnySimpleTypeElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/echoAnySimpleType0000755000175000017500000000163213525245161033003 0ustar ellertellert ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/echoAnySimpleTypeElement-AnySimpleTypeElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/echoAnySimpleType0000755000175000017500000000220213525245161032775 0ustar ellertellert ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/AnySimpleTypeElement-AnySimpleTypeElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnySimpleTypeElement/AnySimpleTypeElem0000755000175000017500000000164513525245161032753 0ustar ellertellert anySimpleTypeValuegsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/0000755000175000017500000000000013525245162026304 5ustar ellertellert././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000162713525245162032703 0ustar ellertellert 12678967543233 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement05-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000220313525245162032672 0ustar ellertellert +10000 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000221513525245162032675 0ustar ellertellert 12678967543233 ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000161213525245162032675 0ustar ellertellert 0 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000220213525245162032671 0ustar ellertellert -42 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000220013525245162032667 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000220013525245162032667 0ustar ellertellert -42 ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000161213525245162032675 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/IntegerElement-IntegerElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/IntegerElement-IntegerE0000755000175000017500000000157513525245162032651 0ustar ellertellert 12678967543233././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/IntegerElement-IntegerElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/IntegerElement-IntegerE0000755000175000017500000000156213525245162032645 0ustar ellertellert -42././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000161413525245162032677 0ustar ellertellert -42 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/IntegerElement-IntegerElement07.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/IntegerElement-IntegerE0000755000175000017500000000165513525245162032650 0ustar ellertellert -1234567891234567838475834753838887348573489123456789123456789././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement07.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000170713525245162032702 0ustar ellertellert -1234567891234567838475834753838887348573489123456789123456789 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000220013525245162032667 0ustar ellertellert 0 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/IntegerElement-IntegerElement06.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/IntegerElement-IntegerE0000755000175000017500000000165413525245162032647 0ustar ellertellert 1234567891234567838475834753838887348573489123456789123456789././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000221313525245162032673 0ustar ellertellert 12678967543233 ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement06.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000170613525245162032701 0ustar ellertellert 1234567891234567838475834753838887348573489123456789123456789 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement07-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000227313525245162032701 0ustar ellertellert -1234567891234567838475834753838887348573489123456789123456789 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement06-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000227413525245162032702 0ustar ellertellert 1234567891234567838475834753838887348573489123456789123456789 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement06-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000227213525245162032700 0ustar ellertellert 1234567891234567838475834753838887348573489123456789123456789 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/IntegerElement-IntegerElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/IntegerElement-IntegerE0000755000175000017500000000156013525245162032643 0ustar ellertellert 0././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000217613525245162032703 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000161713525245162032702 0ustar ellertellert +10000 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement07-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000227513525245162032703 0ustar ellertellert -1234567891234567838475834753838887348573489123456789123456789 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/IntegerElement-IntegerElement05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/IntegerElement-IntegerE0000755000175000017500000000156513525245162032650 0ustar ellertellert +10000././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement05-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000220513525245162032674 0ustar ellertellert +10000 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-IntegerElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/echoIntegerElement-Inte0000755000175000017500000000217613525245162032703 0ustar ellertellert 0 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/IntegerElement-IntegerElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntegerElement/IntegerElement-IntegerE0000755000175000017500000000156013525245162032643 0ustar ellertellert 1gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/0000755000175000017500000000000013525245162027501 5ustar ellertellert././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/echoIntSimpleTypePattern-IntSimpleTypePattern01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/echoIntSimpleType0000755000175000017500000000224013525245162033032 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/echoIntSimpleTypePattern-IntSimpleTypePattern02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/echoIntSimpleType0000755000175000017500000000166613525245162033045 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/echoIntSimpleTypePattern-IntSimpleTypePattern02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/echoIntSimpleType0000755000175000017500000000224013525245162033032 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/IntSimpleTypePattern-IntSimpleTypePattern02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/IntSimpleTypePatt0000755000175000017500000000162613525245162033033 0ustar ellertellert 009././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/IntSimpleTypePattern-IntSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/IntSimpleTypePatt0000755000175000017500000000162613525245162033033 0ustar ellertellert 123././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/echoIntSimpleTypePattern-IntSimpleTypePattern01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/echoIntSimpleType0000755000175000017500000000223613525245162033037 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/echoIntSimpleTypePattern-IntSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/echoIntSimpleType0000755000175000017500000000166613525245162033045 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/echoIntSimpleTypePattern-IntSimpleTypePattern02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntSimpleTypePattern/echoIntSimpleType0000755000175000017500000000223613525245162033037 0ustar ellertellert 009 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/0000755000175000017500000000000013525245161027040 5ustar ellertellert././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/echoAttributeRequired-AttributeRequired01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/echoAttributeRequire0000755000175000017500000000243213525245161033126 0ustar ellertellert 5 ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/echoAttributeRequired-AttributeRequired02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/echoAttributeRequire0000755000175000017500000000203013525245161033120 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/echoAttributeRequired-AttributeRequired02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/echoAttributeRequire0000755000175000017500000000243313525245161033127 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/echoAttributeRequired-AttributeRequired01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/echoAttributeRequire0000755000175000017500000000203113525245161033121 0ustar ellertellert 5 ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/AttributeRequired-AttributeRequired02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/AttributeRequired-At0000755000175000017500000000176513525245161033005 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/echoAttributeRequired-AttributeRequired02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/echoAttributeRequire0000755000175000017500000000243113525245161033125 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/AttributeRequired-AttributeRequired01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/AttributeRequired-At0000755000175000017500000000176613525245161033006 0ustar ellertellert 5 ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/echoAttributeRequired-AttributeRequired01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeRequired/echoAttributeRequire0000755000175000017500000000243413525245161033130 0ustar ellertellert 5 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/0000755000175000017500000000000013525245162032363 5ustar ellertellert././@LongLink0000644000000000000000000000027400000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/echoElementMinOccurs1MaxOccursUnbounded-ElementMinOccurs1MaxOccursUnbounded101-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/ec0000755000175000017500000000231013525245162032674 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000026100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/ElementMinOccurs1MaxOccursUnbounded-ElementMinOccurs1MaxOccursUnbounded101.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/El0000755000175000017500000000156213525245162032655 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000026500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/echoElementMinOccurs1MaxOccursUnbounded-ElementMinOccurs1MaxOccursUnbounded101.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/ec0000755000175000017500000000167513525245162032711 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000027400000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/echoElementMinOccurs1MaxOccursUnbounded-ElementMinOccurs1MaxOccursUnbounded101-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/ec0000755000175000017500000000230613525245162032701 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000026500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/echoElementMinOccurs1MaxOccursUnbounded-ElementMinOccurs1MaxOccursUnbounded102.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/ec0000755000175000017500000000201113525245162032672 0ustar ellertellert 24 34 44 ././@LongLink0000644000000000000000000000026100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/ElementMinOccurs1MaxOccursUnbounded-ElementMinOccurs1MaxOccursUnbounded102.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/El0000755000175000017500000000167613525245162032663 0ustar ellertellert 24 34 44 ././@LongLink0000644000000000000000000000027400000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/echoElementMinOccurs1MaxOccursUnbounded-ElementMinOccurs1MaxOccursUnbounded102-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/ec0000755000175000017500000000243413525245162032703 0ustar ellertellert 24 34 44 ././@LongLink0000644000000000000000000000027400000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/echoElementMinOccurs1MaxOccursUnbounded-ElementMinOccurs1MaxOccursUnbounded102-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs1MaxOccursUnbounded/ec0000755000175000017500000000243213525245162032701 0ustar ellertellert 24 34 44 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/0000755000175000017500000000000013525245162032067 5ustar ellertellert././@LongLink0000644000000000000000000000026200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/echoPositiveIntegerSimpleTypePattern-PositiveIntegerSimpleTypePattern02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/echoP0000755000175000017500000000233413525245162033055 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000025300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/echoPositiveIntegerSimpleTypePattern-PositiveIntegerSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/echoP0000755000175000017500000000201213525245162033046 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000026200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/echoPositiveIntegerSimpleTypePattern-PositiveIntegerSimpleTypePattern02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/echoP0000755000175000017500000000233213525245162033053 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000025300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/echoPositiveIntegerSimpleTypePattern-PositiveIntegerSimpleTypePattern02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/echoP0000755000175000017500000000201213525245162033046 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000024700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/PositiveIntegerSimpleTypePattern-PositiveIntegerSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/Posit0000755000175000017500000000173613525245162033122 0ustar ellertellert 123././@LongLink0000644000000000000000000000024700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/PositiveIntegerSimpleTypePattern-PositiveIntegerSimpleTypePattern02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/Posit0000755000175000017500000000173613525245162033122 0ustar ellertellert 009././@LongLink0000644000000000000000000000026200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/echoPositiveIntegerSimpleTypePattern-PositiveIntegerSimpleTypePattern01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/echoP0000755000175000017500000000233413525245162033055 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000026200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/echoPositiveIntegerSimpleTypePattern-PositiveIntegerSimpleTypePattern01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerSimpleTypePattern/echoP0000755000175000017500000000233213525245162033053 0ustar ellertellert 123 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalAttributes/0000755000175000017500000000000013525245162030322 5ustar ellertellert././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalAttributes/echoQualifiedLocalAttributes-QualifiedLocalAttributes01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalAttributes/echoQualified0000755000175000017500000000172513525245162033017 0ustar ellertellert string ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalAttributes/echoQualifiedLocalAttributes-QualifiedLocalAttributes01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalAttributes/echoQualified0000755000175000017500000000226713525245162033021 0ustar ellertellert string ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalAttributes/QualifiedLocalAttributes-QualifiedLocalAttributes01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalAttributes/QualifiedLoca0000755000175000017500000000166113525245162032756 0ustar ellertellert string././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalAttributes/echoQualifiedLocalAttributes-QualifiedLocalAttributes01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalAttributes/echoQualified0000755000175000017500000000226513525245162033017 0ustar ellertellert string gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalElements/0000755000175000017500000000000013525245162027750 5ustar ellertellert././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalElements/echoQualifiedLocalElements-QualifiedLocalElements01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalElements/echoQualifiedLo0000755000175000017500000000166513525245162032743 0ustar ellertellert bar ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalElements/QualifiedLocalElements-QualifiedLocalElements01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalElements/QualifiedLocalE0000755000175000017500000000162013525245162032660 0ustar ellertellert bar././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalElements/echoQualifiedLocalElements-QualifiedLocalElements01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalElements/echoQualifiedLo0000755000175000017500000000224113525245162032732 0ustar ellertellert bar ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalElements/echoQualifiedLocalElements-QualifiedLocalElements01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QualifiedLocalElements/echoQualifiedLo0000755000175000017500000000223713525245162032737 0ustar ellertellert bar gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeLax/0000755000175000017500000000000013525245161026454 5ustar ellertellert././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeLax/echoAnyAttributeLax-AnyAttributeLax01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeLax/echoAnyAttributeLax-An0000755000175000017500000000242513525245161032660 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeLax/echoAnyAttributeLax-AnyAttributeLax01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeLax/echoAnyAttributeLax-An0000755000175000017500000000242313525245161032656 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeLax/AnyAttributeLax-AnyAttributeLax01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeLax/AnyAttributeLax-AnyAtt0000755000175000017500000000176213525245161032666 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeLax/echoAnyAttributeLax-AnyAttributeLax01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeLax/echoAnyAttributeLax-An0000755000175000017500000000202013525245161032647 0ustar ellertellert Bobby Sox gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherSkip/0000755000175000017500000000000013525245161027640 5ustar ellertellert././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherSkip/echoAnyAttributeOtherSkip-AnyAttributeOtherSkip01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherSkip/echoAnyAttribute0000755000175000017500000000256413525245161033047 0ustar ellertellert String String ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherSkip/AnyAttributeOtherSkip-AnyAttributeOtherSkip01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherSkip/AnyAttributeOthe0000755000175000017500000000216313525245161033023 0ustar ellertellert String String ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherSkip/echoAnyAttributeOtherSkip-AnyAttributeOtherSkip01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherSkip/echoAnyAttribute0000755000175000017500000000256613525245161033051 0ustar ellertellert String String ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherSkip/echoAnyAttributeOtherSkip-AnyAttributeOtherSkip01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeOtherSkip/echoAnyAttribute0000755000175000017500000000223213525245161033037 0ustar ellertellert String String gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SOAPEncodedArray/0000755000175000017500000000000013525245162026420 5ustar ellertellert././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SOAPEncodedArray/echoSOAPEncodedArray-SOAPEncodedArray01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SOAPEncodedArray/echoSOAPEncodedArray-0000755000175000017500000000160213525245162032304 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SOAPEncodedArray/echoSOAPEncodedArray-SOAPEncodedArray01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SOAPEncodedArray/echoSOAPEncodedArray-0000755000175000017500000000216213525245162032306 0ustar ellertellert ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SOAPEncodedArray/SOAPEncodedArray-SOAPEncodedArray01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SOAPEncodedArray/SOAPEncodedArray-SOAP0000755000175000017500000000154613525245162032137 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SOAPEncodedArray/echoSOAPEncodedArray-SOAPEncodedArray01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SOAPEncodedArray/echoSOAPEncodedArray-0000755000175000017500000000216413525245162032310 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/0000755000175000017500000000000013525245162026157 5ustar ellertellert././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000222313525245162032706 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000222113525245162032704 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/TimeAttribute-TimeAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/TimeAttribute-TimeAttrib0000755000175000017500000000157213525245162032736 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000222213525245162032705 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000222313525245162032706 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/TimeAttribute-TimeAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/TimeAttribute-TimeAttrib0000755000175000017500000000157113525245162032735 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute05-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000223113525245162032705 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/TimeAttribute-TimeAttribute05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/TimeAttribute-TimeAttrib0000755000175000017500000000157713525245162032743 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000162613525245162032714 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/TimeAttribute-TimeAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/TimeAttribute-TimeAttrib0000755000175000017500000000157113525245162032735 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000222113525245162032704 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000162513525245162032713 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000163313525245162032712 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/TimeAttribute-TimeAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/TimeAttribute-TimeAttrib0000755000175000017500000000157113525245162032735 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000222413525245162032707 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute05-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000222713525245162032712 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000162513525245162032713 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000222113525245162032704 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000162513525245162032713 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TimeAttribute/echoTimeAttribute-TimeAt0000755000175000017500000000222313525245162032706 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/0000755000175000017500000000000013525245161030257 5ustar ellertellert././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/ChoiceMaxOccursUnbounded-ChoiceMaxOccursUnbounded01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/ChoiceMaxOccu0000755000175000017500000000204113525245161032654 0ustar ellertellert 1st 2nd 3rd ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMaxOccursUnbounded-ChoiceMaxOccursUnbounded03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMax0000755000175000017500000000246713525245161032715 0ustar ellertellert 1st second 3rd ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMaxOccursUnbounded-ChoiceMaxOccursUnbounded01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMax0000755000175000017500000000246613525245161032714 0ustar ellertellert 1st 2nd 3rd ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMaxOccursUnbounded-ChoiceMaxOccursUnbounded01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMax0000755000175000017500000000210513525245161032702 0ustar ellertellert 1st 2nd 3rd ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMaxOccursUnbounded-ChoiceMaxOccursUnbounded02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMax0000755000175000017500000000204513525245161032705 0ustar ellertellert first second ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMaxOccursUnbounded-ChoiceMaxOccursUnbounded01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMax0000755000175000017500000000246413525245161032712 0ustar ellertellert 1st 2nd 3rd ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMaxOccursUnbounded-ChoiceMaxOccursUnbounded02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMax0000755000175000017500000000242213525245161032704 0ustar ellertellert first second ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMaxOccursUnbounded-ChoiceMaxOccursUnbounded03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMax0000755000175000017500000000247113525245161032710 0ustar ellertellert 1st second 3rd ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/ChoiceMaxOccursUnbounded-ChoiceMaxOccursUnbounded03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/ChoiceMaxOccu0000755000175000017500000000204413525245161032657 0ustar ellertellert 1st second 3rd ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMaxOccursUnbounded-ChoiceMaxOccursUnbounded03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMax0000755000175000017500000000211013525245161032676 0ustar ellertellert 1st second 3rd ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/ChoiceMaxOccursUnbounded-ChoiceMaxOccursUnbounded02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/ChoiceMaxOccu0000755000175000017500000000200113525245161032650 0ustar ellertellert first second ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMaxOccursUnbounded-ChoiceMaxOccursUnbounded02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMaxOccursUnbounded/echoChoiceMax0000755000175000017500000000242013525245161032702 0ustar ellertellert first second gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/0000755000175000017500000000000013525245162027752 5ustar ellertellert././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/ElementMaxOccursFinite-ElementMaxOccursFinite01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/ElementMaxOccur0000755000175000017500000000170713525245162032740 0ustar ellertellert May June July August ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/echoElementMaxOccursFinite-ElementMaxOccursFinite02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/echoElementMaxO0000755000175000017500000000167713525245162032730 0ustar ellertellert August September ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/echoElementMaxOccursFinite-ElementMaxOccursFinite02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/echoElementMaxO0000755000175000017500000000232013525245162032712 0ustar ellertellert August September ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/ElementMaxOccursFinite-ElementMaxOccursFinite02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/ElementMaxOccur0000755000175000017500000000161513525245162032736 0ustar ellertellert August September ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/echoElementMaxOccursFinite-ElementMaxOccursFinite01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/echoElementMaxO0000755000175000017500000000177113525245162032723 0ustar ellertellert May June July August ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/echoElementMaxOccursFinite-ElementMaxOccursFinite01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/echoElementMaxO0000755000175000017500000000242213525245162032715 0ustar ellertellert May June July August ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/echoElementMaxOccursFinite-ElementMaxOccursFinite02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/echoElementMaxO0000755000175000017500000000231613525245162032717 0ustar ellertellert August September ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/echoElementMaxOccursFinite-ElementMaxOccursFinite01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMaxOccursFinite/echoElementMaxO0000755000175000017500000000242013525245162032713 0ustar ellertellert May June July August gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/0000755000175000017500000000000013525245161027623 5ustar ellertellert././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/echoDateSimpleTypePattern-DateSimpleTypePattern01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/echoDateSimpleTy0000755000175000017500000000225213525245161032755 0ustar ellertellert 2006-12-18 ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/echoDateSimpleTypePattern-DateSimpleTypePattern01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/echoDateSimpleTy0000755000175000017500000000225413525245161032757 0ustar ellertellert 2006-12-18 ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/echoDateSimpleTypePattern-DateSimpleTypePattern02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/echoDateSimpleTy0000755000175000017500000000225213525245161032755 0ustar ellertellert 2007-01-01 ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/echoDateSimpleTypePattern-DateSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/echoDateSimpleTy0000755000175000017500000000170413525245161032756 0ustar ellertellert 2006-12-18 ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/DateSimpleTypePattern-DateSimpleTypePattern02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/DateSimpleTypePa0000755000175000017500000000164313525245161032727 0ustar ellertellert 2007-01-01././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/DateSimpleTypePattern-DateSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/DateSimpleTypePa0000755000175000017500000000164313525245161032727 0ustar ellertellert 2006-12-18././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/echoDateSimpleTypePattern-DateSimpleTypePattern02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/echoDateSimpleTy0000755000175000017500000000225413525245161032757 0ustar ellertellert 2007-01-01 ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/echoDateSimpleTypePattern-DateSimpleTypePattern02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DateSimpleTypePattern/echoDateSimpleTy0000755000175000017500000000170413525245161032756 0ustar ellertellert 2007-01-01 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/0000755000175000017500000000000013525245162031273 5ustar ellertellert././@LongLink0000644000000000000000000000024200000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/echoSequenceSingleRepeatedElement-SequenceSingleRepeatedElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/echoSequ0000755000175000017500000000230613525245162032776 0ustar ellertellert element element element element element ././@LongLink0000644000000000000000000000023600000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/SequenceSingleRepeatedElement-SequenceSingleRepeatedElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/Sequence0000755000175000017500000000223513525245162032773 0ustar ellertellert element element element element element ././@LongLink0000644000000000000000000000023600000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/SequenceSingleRepeatedElement-SequenceSingleRepeatedElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/Sequence0000755000175000017500000000177113525245162032777 0ustar ellertellert element ././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/echoSequenceSingleRepeatedElement-SequenceSingleRepeatedElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/echoSequ0000755000175000017500000000266513525245162033006 0ustar ellertellert element element element element element ././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/echoSequenceSingleRepeatedElement-SequenceSingleRepeatedElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/echoSequ0000755000175000017500000000237713525245162033006 0ustar ellertellert element ././@LongLink0000644000000000000000000000024200000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/echoSequenceSingleRepeatedElement-SequenceSingleRepeatedElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/echoSequ0000755000175000017500000000204213525245162032773 0ustar ellertellert element ././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/echoSequenceSingleRepeatedElement-SequenceSingleRepeatedElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/echoSequ0000755000175000017500000000240113525245162032772 0ustar ellertellert element ././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/echoSequenceSingleRepeatedElement-SequenceSingleRepeatedElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceSingleRepeatedElement/echoSequ0000755000175000017500000000266313525245162033004 0ustar ellertellert element element element element element gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptySequence/0000755000175000017500000000000013525245161027475 5ustar ellertellert././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptySequence/echoElementEmptySequence-ElementEmptySequence01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptySequence/echoElementEmptyS0000755000175000017500000000163213525245161033017 0ustar ellertellert ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptySequence/ElementEmptySequence-ElementEmptySequence01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptySequence/ElementEmptySeque0000755000175000017500000000157213525245161033043 0ustar ellertellert ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptySequence/echoElementEmptySequence-ElementEmptySequence01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptySequence/echoElementEmptyS0000755000175000017500000000220413525245161033013 0ustar ellertellert ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptySequence/echoElementEmptySequence-ElementEmptySequence01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementEmptySequence/echoElementEmptyS0000755000175000017500000000220213525245161033011 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeBlock/0000755000175000017500000000000013525245162027742 5ustar ellertellert././@LongLink0000644000000000000000000000023300000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeBlock/echoGlobalComplexTypeBlock-GlobalComplexTypeBlockExample01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeBlock/echoGlobalCompl0000755000175000017500000000233113525245162032721 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeBlock/echoGlobalComplexTypeBlock-GlobalComplexTypeBlockExample01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeBlock/echoGlobalCompl0000755000175000017500000000175413525245162032731 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeBlock/GlobalComplexTypeBlock-GlobalComplexTypeBlockExample01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeBlock/GlobalComplexTy0000755000175000017500000000171213525245162032736 0ustar ellertellert 1175 ././@LongLink0000644000000000000000000000023300000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeBlock/echoGlobalComplexTypeBlock-GlobalComplexTypeBlockExample01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalComplexTypeBlock/echoGlobalCompl0000755000175000017500000000232713525245162032726 0ustar ellertellert 1175 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/0000755000175000017500000000000013525245161030451 5ustar ellertellert././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/echoComplexTypeSequenceChoice-ComplexTypeSequenceChoice01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/echoComplexT0000755000175000017500000000254413525245161032776 0ustar ellertellert 225000 20 6 5.25 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/echoComplexTypeSequenceChoice-ComplexTypeSequenceChoice02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/echoComplexT0000755000175000017500000000250013525245161032766 0ustar ellertellert 225000 25 5.50 ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/echoComplexTypeSequenceChoice-ComplexTypeSequenceChoice01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/echoComplexT0000755000175000017500000000210413525245161032766 0ustar ellertellert 225000 20 6 5.25 ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/echoComplexTypeSequenceChoice-ComplexTypeSequenceChoice02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/echoComplexT0000755000175000017500000000204713525245161032774 0ustar ellertellert 225000 25 5.50 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/echoComplexTypeSequenceChoice-ComplexTypeSequenceChoice01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/echoComplexT0000755000175000017500000000254213525245161032774 0ustar ellertellert 225000 20 6 5.25 ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/ComplexTypeSequenceChoice-ComplexTypeSequenceChoice01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/ComplexTypeS0000755000175000017500000000201613525245161032772 0ustar ellertellert 225000 20 6 5.25 ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/ComplexTypeSequenceChoice-ComplexTypeSequenceChoice02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/ComplexTypeS0000755000175000017500000000176113525245161033000 0ustar ellertellert 225000 25 5.50 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/echoComplexTypeSequenceChoice-ComplexTypeSequenceChoice02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeSequenceChoice/echoComplexT0000755000175000017500000000250213525245161032770 0ustar ellertellert 225000 25 5.50 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictAny/0000755000175000017500000000000013525245162030467 5ustar ellertellert././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictAny/echoExtendedSequenceStrictAny-ExtendedSequenceStrictAny01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictAny/echoExtended0000755000175000017500000000267713525245162033030 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictAny/echoExtendedSequenceStrictAny-ExtendedSequenceStrictAny01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictAny/echoExtended0000755000175000017500000000270113525245162033014 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictAny/ExtendedSequenceStrictAny-ExtendedSequenceStrictAny01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictAny/ExtendedSequ0000755000175000017500000000224413525245162033015 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictAny/echoExtendedSequenceStrictAny-ExtendedSequenceStrictAny01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceStrictAny/echoExtended0000755000175000017500000000231113525245162033011 0ustar ellertellert String String Stuff gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementConcrete/0000755000175000017500000000000013525245162027572 5ustar ellertellert././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementConcrete/GlobalElementConcrete-GlobalElementConcreteExample01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementConcrete/GlobalElementCon0000755000175000017500000000163613525245162032700 0ustar ellertellert Stuff././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementConcrete/echoGlobalElementConcrete-GlobalElementConcreteExample01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementConcrete/echoGlobalElemen0000755000175000017500000000224713525245162032712 0ustar ellertellert Stuff ././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementConcrete/echoGlobalElementConcrete-GlobalElementConcreteExample01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementConcrete/echoGlobalElemen0000755000175000017500000000224513525245162032710 0ustar ellertellert Stuff ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementConcrete/echoGlobalElementConcrete-GlobalElementConcreteExample01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementConcrete/echoGlobalElemen0000755000175000017500000000167713525245162032720 0ustar ellertellert Stuff gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleAttribute/0000755000175000017500000000000013525245161026472 5ustar ellertellert././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleAttribute/echoDoubleAttribute-DoubleAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleAttribute/echoDoubleAttribute-Do0000755000175000017500000000223513525245161032717 0ustar ellertellert ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleAttribute/echoDoubleAttribute-DoubleAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleAttribute/echoDoubleAttribute-Do0000755000175000017500000000164313525245161032721 0ustar ellertellert ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleAttribute/DoubleAttribute-DoubleAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleAttribute/DoubleAttribute-Double0000755000175000017500000000160513525245161032730 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleAttribute/echoDoubleAttribute-DoubleAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleAttribute/echoDoubleAttribute-Do0000755000175000017500000000223313525245161032715 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/0000755000175000017500000000000013525245161027550 5ustar ellertellert././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/echoChoiceMinOccursFinite-ChoiceMinOccursFinite02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/echoChoiceMinOcc0000755000175000017500000000210413525245161032615 0ustar ellertellert B BA ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/echoChoiceMinOccursFinite-ChoiceMinOccursFinite01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/echoChoiceMinOcc0000755000175000017500000000210413525245161032615 0ustar ellertellert A AA ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/echoChoiceMinOccursFinite-ChoiceMinOccursFinite01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/echoChoiceMinOcc0000755000175000017500000000246713525245161032631 0ustar ellertellert A AA ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/ChoiceMinOccursFinite-ChoiceMinOccursFinite01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/ChoiceMinOccursF0000755000175000017500000000204313525245161032620 0ustar ellertellert A AA ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/echoChoiceMinOccursFinite-ChoiceMinOccursFinite02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/echoChoiceMinOcc0000755000175000017500000000246513525245161032627 0ustar ellertellert B BA ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/ChoiceMinOccursFinite-ChoiceMinOccursFinite02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/ChoiceMinOccursF0000755000175000017500000000204313525245161032620 0ustar ellertellert B BA ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/echoChoiceMinOccursFinite-ChoiceMinOccursFinite02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/echoChoiceMinOcc0000755000175000017500000000246713525245161032631 0ustar ellertellert B BA ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/echoChoiceMinOccursFinite-ChoiceMinOccursFinite01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceMinOccursFinite/echoChoiceMinOcc0000755000175000017500000000246513525245161032627 0ustar ellertellert A AA gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/0000755000175000017500000000000013525245162030131 5ustar ellertellert././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/SequenceMaxOccursFinite-SequenceMaxOccursFinite01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/SequenceMaxOcc0000755000175000017500000000215513525245162032725 0ustar ellertellert November Rain December Snow January Snow February Rain ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/echoSequenceMaxOccursFinite-SequenceMaxOccursFinite01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/echoSequenceMa0000755000175000017500000000271013525245162032744 0ustar ellertellert November Rain December Snow January Snow February Rain ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/SequenceMaxOccursFinite-SequenceMaxOccursFinite02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/SequenceMaxOcc0000755000175000017500000000162013525245162032721 0ustar ellertellert December Snow ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/echoSequenceMaxOccursFinite-SequenceMaxOccursFinite02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/echoSequenceMa0000755000175000017500000000170413525245162032746 0ustar ellertellert December Snow ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/echoSequenceMaxOccursFinite-SequenceMaxOccursFinite01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/echoSequenceMa0000755000175000017500000000271213525245162032746 0ustar ellertellert November Rain December Snow January Snow February Rain ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/echoSequenceMaxOccursFinite-SequenceMaxOccursFinite02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/echoSequenceMa0000755000175000017500000000232513525245162032746 0ustar ellertellert December Snow ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/echoSequenceMaxOccursFinite-SequenceMaxOccursFinite01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/echoSequenceMa0000755000175000017500000000224113525245162032743 0ustar ellertellert November Rain December Snow January Snow February Rain ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/echoSequenceMaxOccursFinite-SequenceMaxOccursFinite02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccursFinite/echoSequenceMa0000755000175000017500000000232313525245162032744 0ustar ellertellert December Snow gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TypeSubstitutionUsingXsiType/0000755000175000017500000000000013525245162031307 5ustar ellertellert././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TypeSubstitutionUsingXsiType/echoTypeSubstitutionUsingXsiType-TypeSubstitutionUsingXsiType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TypeSubstitutionUsingXsiType/echoTypeS0000755000175000017500000000262113525245162033141 0ustar ellertellert p1 p2 extended part ././@LongLink0000644000000000000000000000023700000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TypeSubstitutionUsingXsiType/echoTypeSubstitutionUsingXsiType-TypeSubstitutionUsingXsiType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TypeSubstitutionUsingXsiType/echoTypeS0000755000175000017500000000215513525245162033143 0ustar ellertellert p1 p2 extended part ././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TypeSubstitutionUsingXsiType/echoTypeSubstitutionUsingXsiType-TypeSubstitutionUsingXsiType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TypeSubstitutionUsingXsiType/echoTypeS0000755000175000017500000000261713525245162033146 0ustar ellertellert p1 p2 extended part ././@LongLink0000644000000000000000000000023300000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TypeSubstitutionUsingXsiType/TypeSubstitutionUsingXsiType-TypeSubstitutionUsingXsiType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/TypeSubstitutionUsingXsiType/TypeSubst0000755000175000017500000000206113525245162033176 0ustar ellertellert p1 p2 extended part gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IncludeRelative/0000755000175000017500000000000013525245162026454 5ustar ellertellertgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/0000755000175000017500000000000013525245162030401 5ustar ellertellert././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveIntegerAttribute-PositiveIntegerAttribute02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveI0000755000175000017500000000232013525245162033076 0ustar ellertellert ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/PositiveIntegerAttribute-PositiveIntegerAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/PositiveInteg0000755000175000017500000000170113525245162033117 0ustar ellertellert ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveIntegerAttribute-PositiveIntegerAttribute03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveI0000755000175000017500000000240613525245162033103 0ustar ellertellert ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveIntegerAttribute-PositiveIntegerAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveI0000755000175000017500000000175013525245162033104 0ustar ellertellert ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/PositiveIntegerAttribute-PositiveIntegerAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/PositiveInteg0000755000175000017500000000176713525245162033133 0ustar ellertellert ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/PositiveIntegerAttribute-PositiveIntegerAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/PositiveInteg0000755000175000017500000000170113525245162033117 0ustar ellertellert ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveIntegerAttribute-PositiveIntegerAttribute03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveI0000755000175000017500000000240413525245162033101 0ustar ellertellert ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveIntegerAttribute-PositiveIntegerAttribute02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveI0000755000175000017500000000231613525245162033103 0ustar ellertellert ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveIntegerAttribute-PositiveIntegerAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveI0000755000175000017500000000231613525245162033103 0ustar ellertellert ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveIntegerAttribute-PositiveIntegerAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveI0000755000175000017500000000175013525245162033104 0ustar ellertellert ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveIntegerAttribute-PositiveIntegerAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveI0000755000175000017500000000203613525245162033102 0ustar ellertellert ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveIntegerAttribute-PositiveIntegerAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/PositiveIntegerAttribute/echoPositiveI0000755000175000017500000000232013525245162033076 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/0000755000175000017500000000000013525245161026120 5ustar ellertellert././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/DoubleElement-DoubleElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/DoubleElement-DoubleElem0000755000175000017500000000156113525245161032610 0ustar ellertellert 12.78e-2././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000217413525245161032645 0ustar ellertellert 12 ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000217613525245161032647 0ustar ellertellert -1E4 ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/DoubleElement-DoubleElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/DoubleElement-DoubleElem0000755000175000017500000000155513525245161032613 0ustar ellertellert -1E4././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000220213525245161032635 0ustar ellertellert 12.78e-2 ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement05-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000217513525245161032646 0ustar ellertellert INF ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000220013525245161032633 0ustar ellertellert 12.78e-2 ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000217413525245161032645 0ustar ellertellert -1E4 ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000221013525245161032634 0ustar ellertellert 1267.432233E12 ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement05-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000217313525245161032644 0ustar ellertellert INF ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/DoubleElement-DoubleElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/DoubleElement-DoubleElem0000755000175000017500000000156713525245161032616 0ustar ellertellert 1267.432233E12././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/DoubleElement-DoubleElement05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/DoubleElement-DoubleElem0000755000175000017500000000155413525245161032612 0ustar ellertellert INF././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000161213525245161032641 0ustar ellertellert 12.78e-2 ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000162013525245161032640 0ustar ellertellert 1267.432233E12 ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000220613525245161032641 0ustar ellertellert 1267.432233E12 ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000160413525245161032642 0ustar ellertellert 12 ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000217213525245161032643 0ustar ellertellert 12 ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/DoubleElement-DoubleElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/DoubleElement-DoubleElem0000755000175000017500000000155313525245161032611 0ustar ellertellert 12././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000160513525245161032643 0ustar ellertellert INF ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-DoubleElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleElement/echoDoubleElement-Double0000755000175000017500000000160613525245161032644 0ustar ellertellert -1E4 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/0000755000175000017500000000000013525245162031176 5ustar ellertellert././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/echoUnsignedIntSimpleTypePattern-UnsignedIntSimpleTypePattern02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/echoUnsig0000755000175000017500000000231013525245162033044 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/echoUnsignedIntSimpleTypePattern-UnsignedIntSimpleTypePattern01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/echoUnsig0000755000175000017500000000230613525245162033051 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000023300000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/UnsignedIntSimpleTypePattern-UnsignedIntSimpleTypePattern02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/UnsignedI0000755000175000017500000000170613525245162033015 0ustar ellertellert 009././@LongLink0000644000000000000000000000023300000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/UnsignedIntSimpleTypePattern-UnsignedIntSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/UnsignedI0000755000175000017500000000170613525245162033015 0ustar ellertellert 123././@LongLink0000644000000000000000000000023700000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/echoUnsignedIntSimpleTypePattern-UnsignedIntSimpleTypePattern02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/echoUnsig0000755000175000017500000000175613525245162033061 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000023700000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/echoUnsignedIntSimpleTypePattern-UnsignedIntSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/echoUnsig0000755000175000017500000000175613525245162033061 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/echoUnsignedIntSimpleTypePattern-UnsignedIntSimpleTypePattern01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/echoUnsig0000755000175000017500000000231013525245162033044 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/echoUnsignedIntSimpleTypePattern-UnsignedIntSimpleTypePattern02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedIntSimpleTypePattern/echoUnsig0000755000175000017500000000230613525245162033051 0ustar ellertellert 009 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/0000755000175000017500000000000013525245162027646 5ustar ellertellert././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/echoLongSimpleTypePattern-LongSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/echoLongSimpleTy0000755000175000017500000000167513525245162033032 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/echoLongSimpleTypePattern-LongSimpleTypePattern01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/echoLongSimpleTy0000755000175000017500000000224513525245162033024 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/LongSimpleTypePattern-LongSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/LongSimpleTypePa0000755000175000017500000000163413525245162032774 0ustar ellertellert 123././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/echoLongSimpleTypePattern-LongSimpleTypePattern02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/echoLongSimpleTy0000755000175000017500000000224513525245162033024 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/echoLongSimpleTypePattern-LongSimpleTypePattern02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/echoLongSimpleTy0000755000175000017500000000224313525245162033022 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/LongSimpleTypePattern-LongSimpleTypePattern02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/LongSimpleTypePa0000755000175000017500000000163413525245162032774 0ustar ellertellert 009././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/echoLongSimpleTypePattern-LongSimpleTypePattern02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/echoLongSimpleTy0000755000175000017500000000167513525245162033032 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/echoLongSimpleTypePattern-LongSimpleTypePattern01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongSimpleTypePattern/echoLongSimpleTy0000755000175000017500000000224313525245162033022 0ustar ellertellert 123 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/0000755000175000017500000000000013525245162026022 5ustar ellertellert././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/NMTOKENElement-NMTOKENElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/NMTOKENElement-NMTOKENE0000755000175000017500000000164613525245162031622 0ustar ellertellert vocabularies:that.as:clean:assuring-s_to:The_we:contain././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/echoNMTOKENElement-NMTOKENElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/echoNMTOKENElement-NMTO0000755000175000017500000000170013525245162032005 0ustar ellertellert vocabularies:that.as:clean:assuring-s_to:The_we:contain ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/echoNMTOKENElement-NMTOKENElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/echoNMTOKENElement-NMTO0000755000175000017500000000226613525245162032015 0ustar ellertellert vocabularies:that.as:clean:assuring-s_to:The_we:contain ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/echoNMTOKENElement-NMTOKENElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/echoNMTOKENElement-NMTO0000755000175000017500000000161313525245162032010 0ustar ellertellert id ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/echoNMTOKENElement-NMTOKENElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/echoNMTOKENElement-NMTO0000755000175000017500000000217713525245162032016 0ustar ellertellert id ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/NMTOKENElement-NMTOKENElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/NMTOKENElement-NMTOKENE0000755000175000017500000000156113525245162031616 0ustar ellertellert id././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/echoNMTOKENElement-NMTOKENElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/echoNMTOKENElement-NMTO0000755000175000017500000000226413525245162032013 0ustar ellertellert vocabularies:that.as:clean:assuring-s_to:The_we:contain ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/echoNMTOKENElement-NMTOKENElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENElement/echoNMTOKENElement-NMTO0000755000175000017500000000220113525245162032002 0ustar ellertellert id gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDAttribute/0000755000175000017500000000000013525245162025555 5ustar ellertellert././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDAttribute/IDAttribute-IDAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDAttribute/IDAttribute-IDAttribute01.0000755000175000017500000000154613525245162032266 0ustar ellertellert ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDAttribute/echoIDAttribute-IDAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDAttribute/echoIDAttribute-IDAttribut0000755000175000017500000000220213525245162032527 0ustar ellertellert ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDAttribute/echoIDAttribute-IDAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDAttribute/echoIDAttribute-IDAttribut0000755000175000017500000000220013525245162032525 0ustar ellertellert ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDAttribute/echoIDAttribute-IDAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDAttribute/echoIDAttribute-IDAttribut0000755000175000017500000000160013525245162032530 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NotMixed/0000755000175000017500000000000013525245162025124 5ustar ellertellert././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NotMixed/echoNotMixed-NotMixedExample01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NotMixed/echoNotMixed-NotMixedExample00000755000175000017500000000224413525245162032563 0ustar ellertellert Stuff ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NotMixed/NotMixed-NotMixedExample01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NotMixed/NotMixed-NotMixedExample01.xm0000755000175000017500000000161113525245162032425 0ustar ellertellert Stuff ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NotMixed/echoNotMixed-NotMixedExample01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NotMixed/echoNotMixed-NotMixedExample00000755000175000017500000000163513525245162032566 0ustar ellertellert Stuff ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NotMixed/echoNotMixed-NotMixedExample01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NotMixed/echoNotMixed-NotMixedExample00000755000175000017500000000224613525245162032565 0ustar ellertellert Stuff gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/0000755000175000017500000000000013525245162025754 5ustar ellertellert././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000216713525245162032617 0ustar ellertellert 12 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000217113525245162032612 0ustar ellertellert -1E4 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000157513525245162032621 0ustar ellertellert 12 ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/FloatElement-FloatElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/FloatElement-FloatElement0000755000175000017500000000154713525245162032645 0ustar ellertellert -1E4././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement05-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000217013525245162032611 0ustar ellertellert INF ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/FloatElement-FloatElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/FloatElement-FloatElement0000755000175000017500000000156013525245162032640 0ustar ellertellert 1267.43233E12././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/FloatElement-FloatElement05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/FloatElement-FloatElement0000755000175000017500000000154613525245162032644 0ustar ellertellert INF././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000220213525245162032605 0ustar ellertellert 1267.43233E12 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000157613525245162032622 0ustar ellertellert INF ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/FloatElement-FloatElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/FloatElement-FloatElement0000755000175000017500000000154513525245162032643 0ustar ellertellert 12././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000216513525245162032615 0ustar ellertellert 12 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement05-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000216613525245162032616 0ustar ellertellert INF ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000220013525245162032603 0ustar ellertellert 1267.43233E12 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000161013525245162032607 0ustar ellertellert 1267.43233E12 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000217513525245162032616 0ustar ellertellert 12.78e-2 ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/FloatElement-FloatElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/FloatElement-FloatElement0000755000175000017500000000155313525245162032642 0ustar ellertellert 12.78e-2././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000217313525245162032614 0ustar ellertellert 12.78e-2 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000216713525245162032617 0ustar ellertellert -1E4 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000157713525245162032623 0ustar ellertellert -1E4 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatElement/echoFloatElement-FloatEle0000755000175000017500000000160313525245162032611 0ustar ellertellert 12.78e-2 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatAttribute/0000755000175000017500000000000013525245162026326 5ustar ellertellert././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatAttribute/echoFloatAttribute-FloatAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatAttribute/echoFloatAttribute-Floa0000755000175000017500000000164013525245162032724 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatAttribute/echoFloatAttribute-FloatAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatAttribute/echoFloatAttribute-Floa0000755000175000017500000000223413525245162032724 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatAttribute/echoFloatAttribute-FloatAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatAttribute/echoFloatAttribute-Floa0000755000175000017500000000223213525245162032722 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatAttribute/FloatAttribute-FloatAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FloatAttribute/FloatAttribute-FloatAtt0000755000175000017500000000160313525245162032721 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccursFinite/0000755000175000017500000000000013525245162027750 5ustar ellertellert././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccursFinite/echoElementMinOccursFinite-ElementMinOccursFinite01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccursFinite/echoElementMinO0000755000175000017500000000264413525245162032717 0ustar ellertellert item1 item3 item2 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccursFinite/echoElementMinOccursFinite-ElementMinOccursFinite01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccursFinite/echoElementMinO0000755000175000017500000000264213525245162032715 0ustar ellertellert item1 item3 item2 ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccursFinite/echoElementMinOccursFinite-ElementMinOccursFinite01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccursFinite/echoElementMinO0000755000175000017500000000225713525245162032717 0ustar ellertellert item1 item3 item2 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccursFinite/ElementMinOccursFinite-ElementMinOccursFinite01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccursFinite/ElementMinOccur0000755000175000017500000000221513525245162032727 0ustar ellertellert item1 item3 item2 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttribute/0000755000175000017500000000000013525245161027531 5ustar ellertellert././@LongLink0000644000000000000000000000022500000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttribute/echoComplexTypeAttribute-ComplexTypeAttributeExample01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttribute/echoComplexTypeAt0000755000175000017500000000245713525245161033064 0ustar ellertellert a1250 ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttribute/echoComplexTypeAttribute-ComplexTypeAttributeExample01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttribute/echoComplexTypeAt0000755000175000017500000000206213525245161033054 0ustar ellertellert a1250 ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttribute/ComplexTypeAttribute-ComplexTypeAttributeExample01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttribute/ComplexTypeAttrib0000755000175000017500000000201413525245161033073 0ustar ellertellert a1250 ././@LongLink0000644000000000000000000000022500000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttribute/echoComplexTypeAttribute-ComplexTypeAttributeExample01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttribute/echoComplexTypeAt0000755000175000017500000000245513525245161033062 0ustar ellertellert a1250 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/0000755000175000017500000000000013525245162027053 5ustar ellertellert././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/echoSequenceMaxOccurs1-SequenceMaxOccurs101-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/echoSequenceMaxOccu0000755000175000017500000000225513525245162032674 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/SequenceMaxOccurs1-SequenceMaxOccurs101.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/SequenceMaxOccurs1-0000755000175000017500000000161213525245162032534 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/echoSequenceMaxOccurs1-SequenceMaxOccurs101.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/echoSequenceMaxOccu0000755000175000017500000000165613525245162032700 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/echoSequenceMaxOccurs1-SequenceMaxOccurs102-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/echoSequenceMaxOccu0000755000175000017500000000225413525245162032673 0ustar ellertellert 4 ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/echoSequenceMaxOccurs1-SequenceMaxOccurs102-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/echoSequenceMaxOccu0000755000175000017500000000225613525245162032675 0ustar ellertellert 4 ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/echoSequenceMaxOccurs1-SequenceMaxOccurs102.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/echoSequenceMaxOccu0000755000175000017500000000165513525245162032677 0ustar ellertellert 4 ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/echoSequenceMaxOccurs1-SequenceMaxOccurs101-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/echoSequenceMaxOccu0000755000175000017500000000225713525245162032676 0ustar ellertellert 44 ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/SequenceMaxOccurs1-SequenceMaxOccurs102.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMaxOccurs1/SequenceMaxOccurs1-0000755000175000017500000000161113525245162032533 0ustar ellertellert 4 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DocumentationElement/0000755000175000017500000000000013525245161027517 5ustar ellertellert././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DocumentationElement/DocumentationElement-DocumentationElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DocumentationElement/DocumentationElem0000755000175000017500000000163613525245161033067 0ustar ellertellert hello world././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DocumentationElement/echoDocumentationElement-DocumentationElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DocumentationElement/echoDocumentation0000755000175000017500000000167613525245161033127 0ustar ellertellert hello world ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DocumentationElement/echoDocumentationElement-DocumentationElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DocumentationElement/echoDocumentation0000755000175000017500000000225013525245161033114 0ustar ellertellert hello world ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DocumentationElement/echoDocumentationElement-DocumentationElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DocumentationElement/echoDocumentation0000755000175000017500000000224613525245161033121 0ustar ellertellert hello world gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/0000755000175000017500000000000013525245162026013 5ustar ellertellert././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000161713525245162032757 0ustar ellertellert ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000221013525245162032745 0ustar ellertellert ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/IntAttribute-IntAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/IntAttribute-IntAttribute0000755000175000017500000000155513525245162033001 0ustar ellertellert ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000221013525245162032745 0ustar ellertellert ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000220613525245162032752 0ustar ellertellert ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000221713525245162032754 0ustar ellertellert ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000161013525245162032750 0ustar ellertellert ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000220613525245162032752 0ustar ellertellert ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000161013525245162032750 0ustar ellertellert ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/IntAttribute-IntAttribute05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/IntAttribute-IntAttribute0000755000175000017500000000156513525245162033002 0ustar ellertellert ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000162013525245162032751 0ustar ellertellert ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000220713525245162032753 0ustar ellertellert ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/IntAttribute-IntAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/IntAttribute-IntAttribute0000755000175000017500000000155413525245162033000 0ustar ellertellert ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/IntAttribute-IntAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/IntAttribute-IntAttribute0000755000175000017500000000156413525245162033001 0ustar ellertellert ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute05-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000222013525245162032746 0ustar ellertellert ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000221513525245162032752 0ustar ellertellert ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute05-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000221613525245162032753 0ustar ellertellert ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000220513525245162032751 0ustar ellertellert ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/echoIntAttribute-IntAttri0000755000175000017500000000160713525245162032756 0ustar ellertellert ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/IntAttribute-IntAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntAttribute/IntAttribute-IntAttribute0000755000175000017500000000155513525245162033001 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/0000755000175000017500000000000013525245162025606 5ustar ellertellert././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/LongElement-LongElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/LongElement-LongElement02.0000755000175000017500000000153713525245162032402 0ustar ellertellert -1././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000216013525245162032626 0ustar ellertellert -1 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/LongElement-LongElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/LongElement-LongElement03.0000755000175000017500000000154013525245162032375 0ustar ellertellert +42././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000220213525245162032623 0ustar ellertellert -9223372036854775808 ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000160713525245162032633 0ustar ellertellert 9223372036854775807 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement05-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000220113525245162032622 0ustar ellertellert 9223372036854775807 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000216113525245162032627 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000216113525245162032627 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/LongElement-LongElement05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/LongElement-LongElement05.0000755000175000017500000000156013525245162032401 0ustar ellertellert 9223372036854775807././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000156613525245162032637 0ustar ellertellert -1 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/LongElement-LongElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/LongElement-LongElement04.0000755000175000017500000000156113525245162032401 0ustar ellertellert -9223372036854775808././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000215713525245162032634 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000220413525245162032625 0ustar ellertellert -9223372036854775808 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000216213525245162032630 0ustar ellertellert -1 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement05-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000220313525245162032624 0ustar ellertellert 9223372036854775807 ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/LongElement-LongElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/LongElement-LongElement01.0000755000175000017500000000153613525245162032400 0ustar ellertellert 1././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000156713525245162032640 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000216313525245162032631 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000156513525245162032636 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongElement/echoLongElement-LongElemen0000755000175000017500000000161013525245162032625 0ustar ellertellert -9223372036854775808 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAnyAttribute/0000755000175000017500000000000013525245161030201 5ustar ellertellert././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAnyAttribute/echoComplexTypeAnyAttribute-ComplexTypeAnyAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAnyAttribute/echoComplexTyp0000755000175000017500000000250613525245161033075 0ustar ellertellert string string ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAnyAttribute/ComplexTypeAnyAttribute-ComplexTypeAnyAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAnyAttribute/ComplexTypeAny0000755000175000017500000000205513525245161033052 0ustar ellertellert string string ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAnyAttribute/echoComplexTypeAnyAttribute-ComplexTypeAnyAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAnyAttribute/echoComplexTyp0000755000175000017500000000212313525245161033070 0ustar ellertellert string string ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAnyAttribute/echoComplexTypeAnyAttribute-ComplexTypeAnyAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAnyAttribute/echoComplexTyp0000755000175000017500000000251013525245161033070 0ustar ellertellert string string gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/0000755000175000017500000000000013525245161030160 5ustar ellertellert././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/echoDoubleSimpleTypePattern-DoubleSimpleTypePattern01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/echoDoubleSimp0000755000175000017500000000225513525245161033014 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/echoDoubleSimpleTypePattern-DoubleSimpleTypePattern01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/echoDoubleSimp0000755000175000017500000000225713525245161033016 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/echoDoubleSimpleTypePattern-DoubleSimpleTypePattern02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/echoDoubleSimp0000755000175000017500000000225513525245161033014 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/DoubleSimpleTypePattern-DoubleSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/DoubleSimpleTy0000755000175000017500000000165013525245161033011 0ustar ellertellert 123././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/echoDoubleSimpleTypePattern-DoubleSimpleTypePattern02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/echoDoubleSimp0000755000175000017500000000171313525245161033012 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/echoDoubleSimpleTypePattern-DoubleSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/echoDoubleSimp0000755000175000017500000000171313525245161033012 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/DoubleSimpleTypePattern-DoubleSimpleTypePattern02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/DoubleSimpleTy0000755000175000017500000000165013525245161033011 0ustar ellertellert 009././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/echoDoubleSimpleTypePattern-DoubleSimpleTypePattern02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DoubleSimpleTypePattern/echoDoubleSimp0000755000175000017500000000225713525245161033016 0ustar ellertellert 009 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttributeExtension/0000755000175000017500000000000013525245161031426 5ustar ellertellert././@LongLink0000644000000000000000000000024200000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttributeExtension/echoComplexTypeAttributeExtension-ComplexTypeAttributeExtension01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttributeExtension/echoComp0000755000175000017500000000206313525245161033112 0ustar ellertellert Mary ././@LongLink0000644000000000000000000000023600000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttributeExtension/ComplexTypeAttributeExtension-ComplexTypeAttributeExtension01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttributeExtension/ComplexT0000755000175000017500000000200713525245161033106 0ustar ellertellert Mary ././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttributeExtension/echoComplexTypeAttributeExtension-ComplexTypeAttributeExtension01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttributeExtension/echoComp0000755000175000017500000000242113525245161033110 0ustar ellertellert Mary ././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttributeExtension/echoComplexTypeAttributeExtension-ComplexTypeAttributeExtension01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeAttributeExtension/echoComp0000755000175000017500000000241713525245161033115 0ustar ellertellert Mary gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalAttributes/0000755000175000017500000000000013525245162030665 5ustar ellertellert././@LongLink0000644000000000000000000000022500000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalAttributes/UnqualifiedLocalAttributes-UnqualifiedLocalAttributes01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalAttributes/Unqualified0000755000175000017500000000167213525245162033067 0ustar ellertellert foo././@LongLink0000644000000000000000000000024000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalAttributes/echoUnqualifiedLocalAttributes-UnqualifiedLocalAttributes01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalAttributes/echoUnquali0000755000175000017500000000227613525245162033077 0ustar ellertellert foo ././@LongLink0000644000000000000000000000024000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalAttributes/echoUnqualifiedLocalAttributes-UnqualifiedLocalAttributes01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalAttributes/echoUnquali0000755000175000017500000000227413525245162033075 0ustar ellertellert foo ././@LongLink0000644000000000000000000000023100000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalAttributes/echoUnqualifiedLocalAttributes-UnqualifiedLocalAttributes01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalAttributes/echoUnquali0000755000175000017500000000174013525245162033072 0ustar ellertellert foo gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/0000755000175000017500000000000013525245162030202 5ustar ellertellert././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/echoNormalizedStringElement-NormalizedStringElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/echoNormalized0000755000175000017500000000222013525245162033067 0ustar ellertellert ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/echoNormalizedStringElement-NormalizedStringElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/echoNormalized0000755000175000017500000000165413525245162033101 0ustar ellertellert ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/echoNormalizedStringElement-NormalizedStringElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/echoNormalized0000755000175000017500000000221613525245162033074 0ustar ellertellert ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/NormalizedStringElement-NormalizedStringElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/NormalizedStri0000755000175000017500000000166713525245162033110 0ustar ellertellert How now brown cow.././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/echoNormalizedStringElement-NormalizedStringElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/echoNormalized0000755000175000017500000000173213525245162033076 0ustar ellertellert How now brown cow. ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/NormalizedStringElement-NormalizedStringElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/NormalizedStri0000755000175000017500000000161113525245162033075 0ustar ellertellert ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/echoNormalizedStringElement-NormalizedStringElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/echoNormalized0000755000175000017500000000227413525245162033100 0ustar ellertellert How now brown cow. ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/echoNormalizedStringElement-NormalizedStringElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NormalizedStringElement/echoNormalized0000755000175000017500000000227613525245162033102 0ustar ellertellert How now brown cow. gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/0000755000175000017500000000000013525245162027624 5ustar ellertellert././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/UnionSimpleDateString-UnionSimpleDateString01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/UnionSimpleDateS0000755000175000017500000000164513525245162032743 0ustar ellertellert Monday Night././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/UnionSimpleDateString-UnionSimpleDateString02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/UnionSimpleDateS0000755000175000017500000000164313525245162032741 0ustar ellertellert 2006-06-06././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/echoUnionSimpleDateString-UnionSimpleDateString01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/echoUnionSimpleD0000755000175000017500000000170613525245162032763 0ustar ellertellert Monday Night ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/echoUnionSimpleDateString-UnionSimpleDateString02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/echoUnionSimpleD0000755000175000017500000000225413525245162032762 0ustar ellertellert 2006-06-06 ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/echoUnionSimpleDateString-UnionSimpleDateString02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/echoUnionSimpleD0000755000175000017500000000170413525245162032761 0ustar ellertellert 2006-06-06 ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/echoUnionSimpleDateString-UnionSimpleDateString02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/echoUnionSimpleD0000755000175000017500000000225213525245162032760 0ustar ellertellert 2006-06-06 ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/echoUnionSimpleDateString-UnionSimpleDateString01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/echoUnionSimpleD0000755000175000017500000000225413525245162032762 0ustar ellertellert Monday Night ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/echoUnionSimpleDateString-UnionSimpleDateString01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnionSimpleDateString/echoUnionSimpleD0000755000175000017500000000225613525245162032764 0ustar ellertellert Monday Night gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/0000755000175000017500000000000013525245162026160 5ustar ellertellert././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000221413525245162032711 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000162113525245162032712 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000221613525245162032713 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000221513525245162032712 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/LongAttribute-LongAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/LongAttribute-LongAttrib0000755000175000017500000000156513525245162032743 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute05-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000223613525245162032715 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000162213525245162032713 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000223713525245162032716 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000162013525245162032711 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/LongAttribute-LongAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/LongAttribute-LongAttrib0000755000175000017500000000156413525245162032742 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000221613525245162032713 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000223513525245162032714 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000221713525245162032714 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000222013525245162032706 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000164013525245162032713 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute05-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000223413525245162032713 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/LongAttribute-LongAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/LongAttribute-LongAttrib0000755000175000017500000000160513525245162032736 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/LongAttribute-LongAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/LongAttribute-LongAttrib0000755000175000017500000000156613525245162032744 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/echoLongAttribute-LongAt0000755000175000017500000000164113525245162032714 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/LongAttribute-LongAttribute05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LongAttribute/LongAttribute-LongAttrib0000755000175000017500000000160413525245162032735 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/0000755000175000017500000000000013525245162030502 5ustar ellertellert././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPositiveIntegerElement-NonPositiveIntegerElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPosit0000755000175000017500000000202113525245162033033 0ustar ellertellert -1234324234532534254325234534252345342534253425324534253244 ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPositiveIntegerElement-NonPositiveIntegerElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPosit0000755000175000017500000000173013525245162033041 0ustar ellertellert +0 ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/NonPositiveIntegerElement-NonPositiveIntegerElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/NonPositiveI0000755000175000017500000000166313525245162033024 0ustar ellertellert -1././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPositiveIntegerElement-NonPositiveIntegerElement04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPosit0000755000175000017500000000236113525245162033042 0ustar ellertellert -1234324234532534254325234534252345342534253425324534253244 ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/NonPositiveIntegerElement-NonPositiveIntegerElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/NonPositiveI0000755000175000017500000000175413525245162033025 0ustar ellertellert -1234324234532534254325234534252345342534253425324534253244././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPositiveIntegerElement-NonPositiveIntegerElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPosit0000755000175000017500000000227013525245162033041 0ustar ellertellert +0 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPositiveIntegerElement-NonPositiveIntegerElement04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPosit0000755000175000017500000000235713525245162033047 0ustar ellertellert -1234324234532534254325234534252345342534253425324534253244 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPositiveIntegerElement-NonPositiveIntegerElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPosit0000755000175000017500000000226613525245162033046 0ustar ellertellert +0 ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPositiveIntegerElement-NonPositiveIntegerElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPosit0000755000175000017500000000173013525245162033041 0ustar ellertellert -1 ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/NonPositiveIntegerElement-NonPositiveIntegerElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/NonPositiveI0000755000175000017500000000166213525245162033023 0ustar ellertellert 0././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPositiveIntegerElement-NonPositiveIntegerElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPosit0000755000175000017500000000227013525245162033041 0ustar ellertellert -1 ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPositiveIntegerElement-NonPositiveIntegerElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPosit0000755000175000017500000000172713525245162033047 0ustar ellertellert 0 ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/NonPositiveIntegerElement-NonPositiveIntegerElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/NonPositiveI0000755000175000017500000000166313525245162033024 0ustar ellertellert +0././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPositiveIntegerElement-NonPositiveIntegerElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPosit0000755000175000017500000000226713525245162033047 0ustar ellertellert 0 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPositiveIntegerElement-NonPositiveIntegerElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPosit0000755000175000017500000000226613525245162033046 0ustar ellertellert -1 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPositiveIntegerElement-NonPositiveIntegerElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerElement/echoNonPosit0000755000175000017500000000226513525245162033045 0ustar ellertellert 0 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinMaxLength/0000755000175000017500000000000013525245162031150 5ustar ellertellert././@LongLink0000644000000000000000000000023300000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinMaxLength/RestrictedStringMinMaxLength-RestrictedStringMinMaxLength01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinMaxLength/Restricte0000755000175000017500000000172113525245162033043 0ustar ellertellert String Value 2././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinMaxLength/echoRestrictedStringMinMaxLength-RestrictedStringMinMaxLength01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinMaxLength/echoRestr0000755000175000017500000000232113525245162033032 0ustar ellertellert String Value 2 ././@LongLink0000644000000000000000000000023700000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinMaxLength/echoRestrictedStringMinMaxLength-RestrictedStringMinMaxLength01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinMaxLength/echoRestr0000755000175000017500000000177113525245162033042 0ustar ellertellert String Value 2 ././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinMaxLength/echoRestrictedStringMinMaxLength-RestrictedStringMinMaxLength01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedStringMinMaxLength/echoRestr0000755000175000017500000000232313525245162033034 0ustar ellertellert String Value 2 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NameElement/0000755000175000017500000000000013525245162025567 5ustar ellertellert././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NameElement/echoNameElement-NameElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NameElement/echoNameElement-NameElemen0000755000175000017500000000156713525245162032563 0ustar ellertellert foo ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NameElement/echoNameElement-NameElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NameElement/echoNameElement-NameElemen0000755000175000017500000000216113525245162032552 0ustar ellertellert foo ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NameElement/NameElement-NameElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NameElement/NameElement-NameElement01.0000755000175000017500000000154013525245162032316 0ustar ellertellert foo././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NameElement/echoNameElement-NameElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NameElement/echoNameElement-NameElemen0000755000175000017500000000216313525245162032554 0ustar ellertellert foo gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/0000755000175000017500000000000013525245162032542 5ustar ellertellert././@LongLink0000644000000000000000000000027700000000000011611 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/echoSequenceMinOccurs1MaxOccursUnbounded-SequenceMinOccurs1MaxOccursUnbounded101-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/e0000755000175000017500000000270613525245162032721 0ustar ellertellert 44 33 24 45 64 22 ././@LongLink0000644000000000000000000000027000000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/echoSequenceMinOccurs1MaxOccursUnbounded-SequenceMinOccurs1MaxOccursUnbounded101.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/e0000755000175000017500000000226713525245162032723 0ustar ellertellert 44 33 24 45 64 22 ././@LongLink0000644000000000000000000000027700000000000011611 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/echoSequenceMinOccurs1MaxOccursUnbounded-SequenceMinOccurs1MaxOccursUnbounded102-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/e0000755000175000017500000000242213525245162032714 0ustar ellertellert 44 33 ././@LongLink0000644000000000000000000000027700000000000011611 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/echoSequenceMinOccurs1MaxOccursUnbounded-SequenceMinOccurs1MaxOccursUnbounded101-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/e0000755000175000017500000000270413525245162032717 0ustar ellertellert 44 33 24 45 64 22 ././@LongLink0000644000000000000000000000026400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/SequenceMinOccurs1MaxOccursUnbounded-SequenceMinOccurs1MaxOccursUnbounded101.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/S0000755000175000017500000000216213525245162032673 0ustar ellertellert 44 33 24 45 64 22 ././@LongLink0000644000000000000000000000027700000000000011611 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/echoSequenceMinOccurs1MaxOccursUnbounded-SequenceMinOccurs1MaxOccursUnbounded102-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/e0000755000175000017500000000242013525245162032712 0ustar ellertellert 44 33 ././@LongLink0000644000000000000000000000027000000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/echoSequenceMinOccurs1MaxOccursUnbounded-SequenceMinOccurs1MaxOccursUnbounded102.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/e0000755000175000017500000000202313525245162032711 0ustar ellertellert 44 33 ././@LongLink0000644000000000000000000000026400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/SequenceMinOccurs1MaxOccursUnbounded-SequenceMinOccurs1MaxOccursUnbounded102.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1MaxOccursUnbounded/S0000755000175000017500000000171613525245162032677 0ustar ellertellert 44 33 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipOther/0000755000175000017500000000000013525245162030457 5ustar ellertellert././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipOther/echoExtendedSequenceSkipOther-ExtendedSequenceSkipOther01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipOther/echoExtended0000755000175000017500000000234313525245162033006 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipOther/ExtendedSequenceSkipOther-ExtendedSequenceSkipOther01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipOther/ExtendedSequ0000755000175000017500000000227313525245162033007 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipOther/echoExtendedSequenceSkipOther-ExtendedSequenceSkipOther01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipOther/echoExtended0000755000175000017500000000267013525245162033011 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipOther/echoExtendedSequenceSkipOther-ExtendedSequenceSkipOther01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipOther/echoExtended0000755000175000017500000000267213525245162033013 0ustar ellertellert String String Stuff gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/0000755000175000017500000000000013525245162031014 5ustar ellertellert././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/NonNegativeIntegerAttribute-NonNegativeIntegerAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/NonNegativ0000755000175000017500000000172513525245162033017 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000233713525245162032772 0ustar ellertellert ././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/NonNegativeIntegerAttribute-NonNegativeIntegerAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/NonNegativ0000755000175000017500000000172613525245162033020 0ustar ellertellert ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000177613525245162033000 0ustar ellertellert ././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/NonNegativeIntegerAttribute-NonNegativeIntegerAttribute05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/NonNegativ0000755000175000017500000000201213525245162033005 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000233713525245162032772 0ustar ellertellert ././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/NonNegativeIntegerAttribute-NonNegativeIntegerAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/NonNegativ0000755000175000017500000000172513525245162033017 0ustar ellertellert ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000177713525245162033001 0ustar ellertellert ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000177713525245162033001 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute05-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000242413525245162032767 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000234113525245162032765 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute05-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000242613525245162032771 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000234013525245162032764 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000233613525245162032771 0ustar ellertellert ././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/NonNegativeIntegerAttribute-NonNegativeIntegerAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/NonNegativ0000755000175000017500000000172413525245162033016 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000234213525245162032766 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000234013525245162032764 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000234113525245162032765 0ustar ellertellert ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000200013525245162032755 0ustar ellertellert ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNegativeIntegerAttribute-NonNegativeIntegerAttribute05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerAttribute/echoNonNeg0000755000175000017500000000206413525245162032767 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1/0000755000175000017500000000000013525245162027051 5ustar ellertellert././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1/SequenceMinOccurs1-SequenceMinOccurs101.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1/SequenceMinOccurs1-0000755000175000017500000000172313525245162032533 0ustar ellertellert item1 ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1/echoSequenceMinOccurs1-SequenceMinOccurs101-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1/echoSequenceMinOccu0000755000175000017500000000234613525245162032671 0ustar ellertellert item1 ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1/echoSequenceMinOccurs1-SequenceMinOccurs101-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1/echoSequenceMinOccu0000755000175000017500000000234413525245162032667 0ustar ellertellert item1 ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1/echoSequenceMinOccurs1-SequenceMinOccurs101.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs1/echoSequenceMinOccu0000755000175000017500000000176113525245162032671 0ustar ellertellert item1 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFSAttribute/0000755000175000017500000000000013525245162026235 5ustar ellertellert././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFSAttribute/echoIDREFSAttribute-IDREFSAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFSAttribute/echoIDREFSAttribute-ID0000755000175000017500000000164213525245162032157 0ustar ellertellert ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFSAttribute/IDREFSAttribute-IDREFSAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFSAttribute/IDREFSAttribute-IDREFS0000755000175000017500000000160413525245162031776 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFSAttribute/echoIDREFSAttribute-IDREFSAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFSAttribute/echoIDREFSAttribute-ID0000755000175000017500000000223413525245162032155 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFSAttribute/echoIDREFSAttribute-IDREFSAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDREFSAttribute/echoIDREFSAttribute-ID0000755000175000017500000000223213525245162032153 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/0000755000175000017500000000000013525245162026431 5ustar ellertellert././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/echoNillableElement-NillableElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/echoNillableElement-Ni0000755000175000017500000000244313525245162032621 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/echoNillableElement-NillableElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/echoNillableElement-Ni0000755000175000017500000000243713525245162032624 0ustar ellertellert Paul Downey ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/NillableElement-NillableElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/NillableElement-Nillab0000755000175000017500000000202013525245162032604 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/echoNillableElement-NillableElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/echoNillableElement-Ni0000755000175000017500000000243513525245162032622 0ustar ellertellert Paul Downey ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/echoNillableElement-NillableElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/echoNillableElement-Ni0000755000175000017500000000205013525245162032613 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/echoNillableElement-NillableElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/echoNillableElement-Ni0000755000175000017500000000244513525245162032623 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/NillableElement-NillableElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/NillableElement-Nillab0000755000175000017500000000201213525245162032605 0ustar ellertellert Paul Downey ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/echoNillableElement-NillableElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableElement/echoNillableElement-Ni0000755000175000017500000000204213525245162032614 0ustar ellertellert Paul Downey gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/0000755000175000017500000000000013525245161026277 5ustar ellertellert././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/echoAnyTypeElement-AnyTypeElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/echoAnyTypeElement-AnyT0000755000175000017500000000171113525245161032640 0ustar ellertellert cheese ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/AnyTypeElement-AnyTypeElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/AnyTypeElement-AnyTypeE0000755000175000017500000000153413525245161032627 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/AnyTypeElement-AnyTypeElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/AnyTypeElement-AnyTypeE0000755000175000017500000000165713525245161032635 0ustar ellertellert cheese ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/echoAnyTypeElement-AnyTypeElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/echoAnyTypeElement-AnyT0000755000175000017500000000231513525245161032641 0ustar ellertellert cheese ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/echoAnyTypeElement-AnyTypeElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/echoAnyTypeElement-AnyT0000755000175000017500000000215413525245161032642 0ustar ellertellert ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/echoAnyTypeElement-AnyTypeElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/echoAnyTypeElement-AnyT0000755000175000017500000000156613525245161032650 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/echoAnyTypeElement-AnyTypeElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/echoAnyTypeElement-AnyT0000755000175000017500000000231713525245161032643 0ustar ellertellert cheese ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/echoAnyTypeElement-AnyTypeElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyTypeElement/echoAnyTypeElement-AnyT0000755000175000017500000000215213525245161032640 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/0000755000175000017500000000000013525245162030043 5ustar ellertellert././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/echoRestrictedMaxExclusive-RestrictedMaxExclusive02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/echoRestrictedM0000755000175000017500000000170213525245162033055 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/echoRestrictedMaxExclusive-RestrictedMaxExclusive01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/echoRestrictedM0000755000175000017500000000225013525245162033054 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/RestrictedMaxExclusive-RestrictedMaxExclusive01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/RestrictedMaxEx0000755000175000017500000000164013525245162033045 0ustar ellertellert 1././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/echoRestrictedMaxExclusive-RestrictedMaxExclusive02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/echoRestrictedM0000755000175000017500000000224613525245162033061 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/echoRestrictedMaxExclusive-RestrictedMaxExclusive01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/echoRestrictedM0000755000175000017500000000170213525245162033055 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/echoRestrictedMaxExclusive-RestrictedMaxExclusive02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/echoRestrictedM0000755000175000017500000000225013525245162033054 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/RestrictedMaxExclusive-RestrictedMaxExclusive02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/RestrictedMaxEx0000755000175000017500000000164013525245162033045 0ustar ellertellert 2././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/echoRestrictedMaxExclusive-RestrictedMaxExclusive01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMaxExclusive/echoRestrictedM0000755000175000017500000000224613525245162033061 0ustar ellertellert 1 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AllElement/0000755000175000017500000000000013525245161025416 5ustar ellertellert././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AllElement/echoAllElement-AllElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AllElement/echoAllElement-AllElement010000755000175000017500000000254313525245161032412 0ustar ellertellert element1 element2 element3 element4 element5 ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AllElement/echoAllElement-AllElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AllElement/echoAllElement-AllElement010000755000175000017500000000212013525245161032401 0ustar ellertellert element1 element2 element3 element4 element5 ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AllElement/echoAllElement-AllElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AllElement/echoAllElement-AllElement010000755000175000017500000000254513525245161032414 0ustar ellertellert element1 element2 element3 element4 element5 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AllElement/AllElement-AllElement01.xml0000755000175000017500000000207213525245161032347 0ustar ellertellert element1 element2 element3 element4 element5 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/0000755000175000017500000000000013525245161026244 5ustar ellertellert././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000221413525245161032542 0ustar ellertellert 12678967.543233 ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000167213525245161032551 0ustar ellertellert +100000000000000000000000000000000000000000000.00 ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000161213525245161032543 0ustar ellertellert 0 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/DecimalElement-DecimalElement07.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/DecimalElement-DecimalE0000755000175000017500000000156513525245161032512 0ustar ellertellert 210.00././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000220213525245161032537 0ustar ellertellert -1.23 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/DecimalElement-DecimalElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/DecimalElement-DecimalE0000755000175000017500000000157213525245161032510 0ustar ellertellert +1000000.00././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement05-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000225613525245161032550 0ustar ellertellert +100000000000000000000000000000000000000000000.00 ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement06.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000161413525245161032545 0ustar ellertellert 210 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000220413525245161032541 0ustar ellertellert -1.23 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement06-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000220013525245161032535 0ustar ellertellert 210 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/DecimalElement-DecimalElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/DecimalElement-DecimalE0000755000175000017500000000157613525245161032514 0ustar ellertellert 12678967.543233././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000163013525245161032543 0ustar ellertellert 12678967.543233 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/DecimalElement-DecimalElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/DecimalElement-DecimalE0000755000175000017500000000156013525245161032505 0ustar ellertellert 0././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/DecimalElement-DecimalElement05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/DecimalElement-DecimalE0000755000175000017500000000164013525245161032504 0ustar ellertellert +100000000000000000000000000000000000000000000.00././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000161613525245161032547 0ustar ellertellert -1.23 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000221613525245161032544 0ustar ellertellert 12678967.543233 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/DecimalElement-DecimalElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/DecimalElement-DecimalE0000755000175000017500000000156413525245161032511 0ustar ellertellert -1.23././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000221213525245161032540 0ustar ellertellert +1000000.00 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement07-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000220313525245161032540 0ustar ellertellert 210.00 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement06-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000220213525245161032537 0ustar ellertellert 210 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement05-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000226013525245161032543 0ustar ellertellert +100000000000000000000000000000000000000000000.00 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement07-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000220513525245161032542 0ustar ellertellert 210.00 ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000162413525245161032546 0ustar ellertellert +1000000.00 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/DecimalElement-DecimalElement06.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/DecimalElement-DecimalE0000755000175000017500000000156213525245161032507 0ustar ellertellert 210././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000217613525245161032551 0ustar ellertellert 0 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000220013525245161032535 0ustar ellertellert 0 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000221013525245161032536 0ustar ellertellert +1000000.00 ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-DecimalElement07.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalElement/echoDecimalElement-Deci0000755000175000017500000000161713525245161032550 0ustar ellertellert 210.00 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributeGroup/0000755000175000017500000000000013525245161031410 5ustar ellertellert././@LongLink0000644000000000000000000000024200000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributeGroup/echoComplexTypeOnlyAttributeGroup-ComplexTypeOnlyAttributeGroup01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributeGroup/echoComp0000755000175000017500000000202613525245161033073 0ustar ellertellert ././@LongLink0000644000000000000000000000023600000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributeGroup/ComplexTypeOnlyAttributeGroup-ComplexTypeOnlyAttributeGroup01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributeGroup/ComplexT0000755000175000017500000000175213525245161033076 0ustar ellertellert ././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributeGroup/echoComplexTypeOnlyAttributeGroup-ComplexTypeOnlyAttributeGroup01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributeGroup/echoComp0000755000175000017500000000236213525245161033076 0ustar ellertellert ././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributeGroup/echoComplexTypeOnlyAttributeGroup-ComplexTypeOnlyAttributeGroup01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ComplexTypeOnlyAttributeGroup/echoComp0000755000175000017500000000236413525245161033100 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/0000755000175000017500000000000013525245162027714 5ustar ellertellert././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumerationType-StringEnumerationType03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumer0000755000175000017500000000156413525245162033131 0ustar ellertellert Ringo ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumerationType-StringEnumerationType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumer0000755000175000017500000000216713525245162033131 0ustar ellertellert John ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/StringEnumerationType-StringEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/StringEnumeratio0000755000175000017500000000150313525245162033140 0ustar ellertellert John././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/StringEnumerationType-StringEnumerationType03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/StringEnumeratio0000755000175000017500000000150413525245162033141 0ustar ellertellert Ringo././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumerationType-StringEnumerationType03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumer0000755000175000017500000000217213525245162033125 0ustar ellertellert Ringo ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumerationType-StringEnumerationType02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumer0000755000175000017500000000156313525245162033130 0ustar ellertellert Paul ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumerationType-StringEnumerationType02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumer0000755000175000017500000000217113525245162033124 0ustar ellertellert Paul ././@LongLink0000644000000000000000000000021200000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumerationType-StringEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumer0000755000175000017500000000156313525245162033130 0ustar ellertellert John ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumerationType-StringEnumerationType03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumer0000755000175000017500000000217013525245162033123 0ustar ellertellert Ringo ././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumerationType-StringEnumerationType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumer0000755000175000017500000000217113525245162033124 0ustar ellertellert John ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/StringEnumerationType-StringEnumerationType02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/StringEnumeratio0000755000175000017500000000150313525245162033140 0ustar ellertellert Paul././@LongLink0000644000000000000000000000022100000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumerationType-StringEnumerationType02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringEnumerationType/echoStringEnumer0000755000175000017500000000216713525245162033131 0ustar ellertellert Paul gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QNameAttribute/0000755000175000017500000000000013525245162026262 5ustar ellertellert././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QNameAttribute/echoQNameAttribute-QNameAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QNameAttribute/echoQNameAttribute-QNam0000755000175000017500000000224213525245162032566 0ustar ellertellert ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QNameAttribute/echoQNameAttribute-QNameAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QNameAttribute/echoQNameAttribute-QNam0000755000175000017500000000164613525245162032575 0ustar ellertellert ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QNameAttribute/echoQNameAttribute-QNameAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QNameAttribute/echoQNameAttribute-QNam0000755000175000017500000000224013525245162032564 0ustar ellertellert ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QNameAttribute/QNameAttribute-QNameAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QNameAttribute/QNameAttribute-QNameAtt0000755000175000017500000000161113525245162032544 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReferenceUnqualified/0000755000175000017500000000000013525245162031636 5ustar ellertellert././@LongLink0000644000000000000000000000025700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReferenceUnqualified/echoElementTypeReferenceUnqualified-ElementTypeReferenceUnqualified01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReferenceUnqualified/echoEl0000755000175000017500000000247613525245162032774 0ustar ellertellert String ././@LongLink0000644000000000000000000000025700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReferenceUnqualified/echoElementTypeReferenceUnqualified-ElementTypeReferenceUnqualified01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReferenceUnqualified/echoEl0000755000175000017500000000250013525245162032760 0ustar ellertellert String ././@LongLink0000644000000000000000000000024400000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReferenceUnqualified/ElementTypeReferenceUnqualified-ElementTypeReferenceUnqualified01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReferenceUnqualified/Elemen0000755000175000017500000000206113525245162032770 0ustar ellertellert String ././@LongLink0000644000000000000000000000025000000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReferenceUnqualified/echoElementTypeReferenceUnqualified-ElementTypeReferenceUnqualified01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementTypeReferenceUnqualified/echoEl0000755000175000017500000000213413525245162032763 0ustar ellertellert String gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/0000755000175000017500000000000013525245161026265 5ustar ellertellert././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-BooleanElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-Bool0000755000175000017500000000161213525245161032634 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/BooleanElement-BooleanElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/BooleanElement-BooleanE0000755000175000017500000000156313525245161032573 0ustar ellertellert true././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/BooleanElement-BooleanElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/BooleanElement-BooleanE0000755000175000017500000000156413525245161032574 0ustar ellertellert false././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-BooleanElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-Bool0000755000175000017500000000220113525245161032627 0ustar ellertellert true ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/BooleanElement-BooleanElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/BooleanElement-BooleanE0000755000175000017500000000156013525245161032570 0ustar ellertellert 0././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-BooleanElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-Bool0000755000175000017500000000220013525245161032626 0ustar ellertellert 0 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-BooleanElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-Bool0000755000175000017500000000220413525245161032632 0ustar ellertellert false ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-BooleanElement04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-Bool0000755000175000017500000000217613525245161032642 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-BooleanElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-Bool0000755000175000017500000000161513525245161032637 0ustar ellertellert true ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-BooleanElement04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-Bool0000755000175000017500000000220013525245161032626 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-BooleanElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-Bool0000755000175000017500000000220213525245161032630 0ustar ellertellert false ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/BooleanElement-BooleanElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/BooleanElement-BooleanE0000755000175000017500000000156013525245161032570 0ustar ellertellert 1././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-BooleanElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-Bool0000755000175000017500000000217613525245161032642 0ustar ellertellert 0 ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-BooleanElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-Bool0000755000175000017500000000220313525245161032631 0ustar ellertellert true ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-BooleanElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-Bool0000755000175000017500000000161213525245161032634 0ustar ellertellert 0 ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-BooleanElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BooleanElement/echoBooleanElement-Bool0000755000175000017500000000161613525245161032640 0ustar ellertellert false gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalAttribute/0000755000175000017500000000000013525245161026616 5ustar ellertellert././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalAttribute/echoDecimalAttribute-DecimalAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalAttribute/echoDecimalAttribute-0000755000175000017500000000171413525245161032705 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalAttribute/echoDecimalAttribute-DecimalAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalAttribute/echoDecimalAttribute-0000755000175000017500000000230413525245161032701 0ustar ellertellert ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalAttribute/DecimalAttribute-DecimalAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalAttribute/DecimalAttribute-Deci0000755000175000017500000000165513525245161032637 0ustar ellertellert ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalAttribute/echoDecimalAttribute-DecimalAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/DecimalAttribute/echoDecimalAttribute-0000755000175000017500000000230213525245161032677 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonIdentifierName/0000755000175000017500000000000013525245162026733 5ustar ellertellert././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonIdentifierName/echoNonIdentifierName-NonIdentifierName02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonIdentifierName/echoNonIdentifierNam0000755000175000017500000000223113525245162032707 0ustar ellertellert Hello ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonIdentifierName/NonIdentifierName-NonIdentifierName02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonIdentifierName/NonIdentifierName-No0000755000175000017500000000162213525245162032572 0ustar ellertellert Hello././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonIdentifierName/echoNonIdentifierName-NonIdentifierName02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonIdentifierName/echoNonIdentifierNam0000755000175000017500000000222713525245162032714 0ustar ellertellert Hello ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonIdentifierName/echoNonIdentifierName-NonIdentifierName02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonIdentifierName/echoNonIdentifierNam0000755000175000017500000000165513525245162032720 0ustar ellertellert Hello gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NullEnumerationType/0000755000175000017500000000000013525245162027360 5ustar ellertellert././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NullEnumerationType/echoNullEnumerationType-NullEnumerationType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NullEnumerationType/echoNullEnumeratio0000755000175000017500000000220013525245162033102 0ustar ellertellert ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NullEnumerationType/echoNullEnumerationType-NullEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NullEnumerationType/echoNullEnumeratio0000755000175000017500000000162413525245162033113 0ustar ellertellert ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NullEnumerationType/echoNullEnumerationType-NullEnumerationType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NullEnumerationType/echoNullEnumeratio0000755000175000017500000000217613525245162033116 0ustar ellertellert ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NullEnumerationType/NullEnumerationType-NullEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NullEnumerationType/NullEnumerationTyp0000755000175000017500000000156513525245162033133 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalElements/0000755000175000017500000000000013525245162030313 5ustar ellertellert././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalElements/echoUnqualifiedLocalElements-UnqualifiedLocalElements01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalElements/echoUnqualifi0000755000175000017500000000225413525245162033040 0ustar ellertellert string ././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalElements/UnqualifiedLocalElements-UnqualifiedLocalElements01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalElements/UnqualifiedLo0000755000175000017500000000163713525245162033011 0ustar ellertellert string././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalElements/echoUnqualifiedLocalElements-UnqualifiedLocalElements01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalElements/echoUnqualifi0000755000175000017500000000225613525245162033042 0ustar ellertellert string ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalElements/echoUnqualifiedLocalElements-UnqualifiedLocalElements01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnqualifiedLocalElements/echoUnqualifi0000755000175000017500000000170613525245162033041 0ustar ellertellert string gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/0000755000175000017500000000000013525245162030041 5ustar ellertellert././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/echoRestrictedMinExclusive-RestrictedMinExclusive01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/echoRestrictedM0000755000175000017500000000170213525245162033053 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/echoRestrictedMinExclusive-RestrictedMinExclusive01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/echoRestrictedM0000755000175000017500000000225013525245162033052 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/RestrictedMinExclusive-RestrictedMinExclusive01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/RestrictedMinEx0000755000175000017500000000164013525245162033041 0ustar ellertellert 2././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/echoRestrictedMinExclusive-RestrictedMinExclusive02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/echoRestrictedM0000755000175000017500000000224613525245162033057 0ustar ellertellert 3 ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/RestrictedMinExclusive-RestrictedMinExclusive02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/RestrictedMinEx0000755000175000017500000000164013525245162033041 0ustar ellertellert 3././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/echoRestrictedMinExclusive-RestrictedMinExclusive02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/echoRestrictedM0000755000175000017500000000170213525245162033053 0ustar ellertellert 3 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/echoRestrictedMinExclusive-RestrictedMinExclusive01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/echoRestrictedM0000755000175000017500000000224613525245162033057 0ustar ellertellert 2 ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/echoRestrictedMinExclusive-RestrictedMinExclusive02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/RestrictedMinExclusive/echoRestrictedM0000755000175000017500000000225013525245162033052 0ustar ellertellert 3 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChameleonInclude/0000755000175000017500000000000013525245161026573 5ustar ellertellert././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChameleonInclude/echoChameleonInclude-ChameleonInclude01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChameleonInclude/echoChameleonInclude-0000755000175000017500000000223213525245161032633 0ustar ellertellert a different color ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChameleonInclude/echoChameleonInclude-ChameleonInclude01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChameleonInclude/echoChameleonInclude-0000755000175000017500000000165013525245161032636 0ustar ellertellert a different color ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChameleonInclude/echoChameleonInclude-ChameleonInclude01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChameleonInclude/echoChameleonInclude-0000755000175000017500000000223013525245161032631 0ustar ellertellert a different color ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChameleonInclude/ChameleonInclude-ChameleonInclude01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChameleonInclude/ChameleonInclude-Cham0000755000175000017500000000161413525245161032570 0ustar ellertellert a different colorgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/0000755000175000017500000000000013525245162027050 5ustar ellertellert././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/SequenceMinOccurs0-SequenceMinOccurs001.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/SequenceMinOccurs0-0000755000175000017500000000202013525245162032520 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/echoSequenceMinOccurs0-SequenceMinOccurs001.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/echoSequenceMinOccu0000755000175000017500000000205613525245162032666 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/echoSequenceMinOccurs0-SequenceMinOccurs002-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/echoSequenceMinOccu0000755000175000017500000000217413525245162032667 0ustar ellertellert ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/SequenceMinOccurs0-SequenceMinOccurs002.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/SequenceMinOccurs0-0000755000175000017500000000156013525245162032530 0ustar ellertellert ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/echoSequenceMinOccurs0-SequenceMinOccurs001-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/echoSequenceMinOccu0000755000175000017500000000245113525245162032665 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/echoSequenceMinOccurs0-SequenceMinOccurs002.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/echoSequenceMinOccu0000755000175000017500000000161613525245162032667 0ustar ellertellert ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/echoSequenceMinOccurs0-SequenceMinOccurs002-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/echoSequenceMinOccu0000755000175000017500000000217213525245162032665 0ustar ellertellert ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/echoSequenceMinOccurs0-SequenceMinOccurs001-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SequenceMinOccurs0/echoSequenceMinOccu0000755000175000017500000000245313525245162032667 0ustar ellertellert Paul Sumner Downey gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortEnumerationType/0000755000175000017500000000000013525245162027545 5ustar ellertellert././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortEnumerationType/echoShortEnumerationType-ShortEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortEnumerationType/echoShortEnumerat0000755000175000017500000000166513525245162033142 0ustar ellertellert 11 ././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortEnumerationType/ShortEnumerationType-ShortEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortEnumerationType/ShortEnumerationT0000755000175000017500000000162513525245162033131 0ustar ellertellert 11././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortEnumerationType/echoShortEnumerationType-ShortEnumerationType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortEnumerationType/echoShortEnumerat0000755000175000017500000000223513525245162033134 0ustar ellertellert 11 ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortEnumerationType/echoShortEnumerationType-ShortEnumerationType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortEnumerationType/echoShortEnumerat0000755000175000017500000000223713525245162033136 0ustar ellertellert 11 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/0000755000175000017500000000000013525245162027113 5ustar ellertellert././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttribute-GMonthDayAttribute04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttrib0000755000175000017500000000226413525245162032704 0ustar ellertellert ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/GMonthDayAttribute-GMonthDayAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/GMonthDayAttribute-0000755000175000017500000000163313525245162032637 0ustar ellertellert ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/GMonthDayAttribute-GMonthDayAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/GMonthDayAttribute-0000755000175000017500000000163413525245162032640 0ustar ellertellert ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/GMonthDayAttribute-GMonthDayAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/GMonthDayAttribute-0000755000175000017500000000164113525245162032636 0ustar ellertellert ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttribute-GMonthDayAttribute04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttrib0000755000175000017500000000226613525245162032706 0ustar ellertellert ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttribute-GMonthDayAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttrib0000755000175000017500000000170213525245162032700 0ustar ellertellert ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttribute-GMonthDayAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttrib0000755000175000017500000000167413525245162032710 0ustar ellertellert ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttribute-GMonthDayAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttrib0000755000175000017500000000225613525245162032705 0ustar ellertellert ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttribute-GMonthDayAttribute02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttrib0000755000175000017500000000225713525245162032706 0ustar ellertellert ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttribute-GMonthDayAttribute03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttrib0000755000175000017500000000226613525245162032706 0ustar ellertellert ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttribute-GMonthDayAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttrib0000755000175000017500000000170213525245162032700 0ustar ellertellert ././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttribute-GMonthDayAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttrib0000755000175000017500000000167513525245162032711 0ustar ellertellert ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttribute-GMonthDayAttribute02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttrib0000755000175000017500000000226113525245162032701 0ustar ellertellert ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/GMonthDayAttribute-GMonthDayAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/GMonthDayAttribute-0000755000175000017500000000164113525245162032636 0ustar ellertellert ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttribute-GMonthDayAttribute03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttrib0000755000175000017500000000226413525245162032704 0ustar ellertellert ././@LongLink0000644000000000000000000000021000000000000011574 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttribute-GMonthDayAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GMonthDayAttribute/echoGMonthDayAttrib0000755000175000017500000000226013525245162032700 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NoTargetNamespace/0000755000175000017500000000000013525245162026735 5ustar ellertellert././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NoTargetNamespace/NoTargetNamespace-NoTargetNamespace01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NoTargetNamespace/NoTargetNamespace-No0000755000175000017500000000156213525245162032601 0ustar ellertellert foo././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NoTargetNamespace/echoNoTargetNamespace-NoTargetNamespace01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NoTargetNamespace/echoNoTargetNamespac0000755000175000017500000000162213525245162032716 0ustar ellertellert foo ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NoTargetNamespace/echoNoTargetNamespace-NoTargetNamespace01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NoTargetNamespace/echoNoTargetNamespac0000755000175000017500000000221013525245162032710 0ustar ellertellert foo ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NoTargetNamespace/echoNoTargetNamespace-NoTargetNamespace01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NoTargetNamespace/echoNoTargetNamespac0000755000175000017500000000220613525245162032715 0ustar ellertellert foo gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/Include/0000755000175000017500000000000013525245162024760 5ustar ellertellertgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QNameElement/0000755000175000017500000000000013525245162025710 5ustar ellertellert././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QNameElement/QNameElement-QNameElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QNameElement/QNameElement-QNameElement0000755000175000017500000000156213525245162032466 0ustar ellertellert ex:QNameElement././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QNameElement/echoQNameElement-QNameElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QNameElement/echoQNameElement-QNameEle0000755000175000017500000000220213525245162032431 0ustar ellertellert ex:QNameElement ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QNameElement/echoQNameElement-QNameElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QNameElement/echoQNameElement-QNameEle0000755000175000017500000000220413525245162032433 0ustar ellertellert ex:QNameElement ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QNameElement/echoQNameElement-QNameElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/QNameElement/echoQNameElement-QNameEle0000755000175000017500000000161213525245162032435 0ustar ellertellert ex:QNameElement gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/0000755000175000017500000000000013525245162027222 5ustar ellertellert././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/echoGlobalElementChoice-GlobalElementChoice01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/echoGlobalElementC0000755000175000017500000000234513525245162032630 0ustar ellertellert one ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/GlobalElementChoice-GlobalElementChoice01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/GlobalElementChoic0000755000175000017500000000172313525245162032633 0ustar ellertellert one ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/GlobalElementChoice-GlobalElementChoice02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/GlobalElementChoic0000755000175000017500000000172313525245162032633 0ustar ellertellert two ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/echoGlobalElementChoice-GlobalElementChoice02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/echoGlobalElementC0000755000175000017500000000234313525245162032626 0ustar ellertellert two ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/echoGlobalElementChoice-GlobalElementChoice01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/echoGlobalElementC0000755000175000017500000000176213525245162032632 0ustar ellertellert one ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/echoGlobalElementChoice-GlobalElementChoice02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/echoGlobalElementC0000755000175000017500000000176213525245162032632 0ustar ellertellert two ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/echoGlobalElementChoice-GlobalElementChoice01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/echoGlobalElementC0000755000175000017500000000234313525245162032626 0ustar ellertellert one ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/echoGlobalElementChoice-GlobalElementChoice02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementChoice/echoGlobalElementC0000755000175000017500000000234513525245162032630 0ustar ellertellert two gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringElement/0000755000175000017500000000000013525245162026155 5ustar ellertellert././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringElement/echoStringElement-StringElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringElement/echoStringElement-String0000755000175000017500000000162413525245162032771 0ustar ellertellert Hello cruel world. ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringElement/StringElement-StringElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringElement/StringElement-StringElem0000755000175000017500000000152713525245162032737 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringElement/echoStringElement-StringElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringElement/echoStringElement-String0000755000175000017500000000156013525245162032770 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringElement/echoStringElement-StringElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringElement/echoStringElement-String0000755000175000017500000000214613525245162032771 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringElement/echoStringElement-StringElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringElement/echoStringElement-String0000755000175000017500000000221413525245162032765 0ustar ellertellert Hello cruel world. ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringElement/StringElement-StringElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringElement/StringElement-StringElem0000755000175000017500000000157313525245162032740 0ustar ellertellert Hello cruel world.././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringElement/echoStringElement-StringElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringElement/echoStringElement-String0000755000175000017500000000221213525245162032763 0ustar ellertellert Hello cruel world. ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringElement/echoStringElement-StringElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringElement/echoStringElement-String0000755000175000017500000000215013525245162032764 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/0000755000175000017500000000000013525245161026257 5ustar ellertellert././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/ChoiceSequence-ChoiceSequence02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/ChoiceSequence-ChoiceSe0000755000175000017500000000167613525245161032562 0ustar ellertellert home home ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/echoChoiceSequence-ChoiceSequence01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/echoChoiceSequence-Choi0000755000175000017500000000225713525245161032615 0ustar ellertellert home ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/echoChoiceSequence-ChoiceSequence01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/echoChoiceSequence-Choi0000755000175000017500000000166413525245161032616 0ustar ellertellert home ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/echoChoiceSequence-ChoiceSequence02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/echoChoiceSequence-Choi0000755000175000017500000000233113525245161032606 0ustar ellertellert home home ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/echoChoiceSequence-ChoiceSequence02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/echoChoiceSequence-Choi0000755000175000017500000000232713525245161032613 0ustar ellertellert home home ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/echoChoiceSequence-ChoiceSequence01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/echoChoiceSequence-Choi0000755000175000017500000000226113525245161032610 0ustar ellertellert home ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/ChoiceSequence-ChoiceSequence01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/ChoiceSequence-ChoiceSe0000755000175000017500000000163213525245161032552 0ustar ellertellert home ././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/echoChoiceSequence-ChoiceSequence02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceSequence/echoChoiceSequence-Choi0000755000175000017500000000173013525245161032610 0ustar ellertellert home home gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormQualified/0000755000175000017500000000000013525245161030007 5ustar ellertellert././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormQualified/echoAttributeFormQualified-AttributeFormQualified01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormQualified/echoAttributeFo0000755000175000017500000000212013525245161033017 0ustar ellertellert string string ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormQualified/echoAttributeFormQualified-AttributeFormQualified01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormQualified/echoAttributeFo0000755000175000017500000000250713525245161033030 0ustar ellertellert string string ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormQualified/echoAttributeFormQualified-AttributeFormQualified01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormQualified/echoAttributeFo0000755000175000017500000000250513525245161033026 0ustar ellertellert string string ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormQualified/AttributeFormQualified-AttributeFormQualified01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeFormQualified/AttributeFormQu0000755000175000017500000000205313525245161033032 0ustar ellertellert string string gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ImportSchema/0000755000175000017500000000000013525245162025770 5ustar ellertellertgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESAttribute/0000755000175000017500000000000013525245162026505 5ustar ellertellert././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESAttribute/ENTITIESAttribute-ENTITIESAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESAttribute/ENTITIESAttribute-EN0000755000175000017500000000162213525245162032044 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESAttribute/echoENTITIESAttribute-ENTITIESAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESAttribute/echoENTITIESAttribut0000755000175000017500000000225013525245162032234 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESAttribute/echoENTITIESAttribute-ENTITIESAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESAttribute/echoENTITIESAttribut0000755000175000017500000000224613525245162032241 0ustar ellertellert ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESAttribute/echoENTITIESAttribute-ENTITIESAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESAttribute/echoENTITIESAttribut0000755000175000017500000000166213525245162032242 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NameAttribute/0000755000175000017500000000000013525245162026141 5ustar ellertellert././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NameAttribute/echoNameAttribute-NameAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NameAttribute/echoNameAttribute-NameAt0000755000175000017500000000221613525245162032636 0ustar ellertellert ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NameAttribute/echoNameAttribute-NameAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NameAttribute/echoNameAttribute-NameAt0000755000175000017500000000162013525245162032634 0ustar ellertellert ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NameAttribute/NameAttribute-NameAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NameAttribute/NameAttribute-NameAttrib0000755000175000017500000000156413525245162032665 0ustar ellertellert ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NameAttribute/echoNameAttribute-NameAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NameAttribute/echoNameAttribute-NameAt0000755000175000017500000000221413525245162032634 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/0000755000175000017500000000000013525245162025441 5ustar ellertellert././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement05-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement050000755000175000017500000000216613525245162032506 0ustar ellertellert -2147483648 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/IntElement-IntElement02.xml0000755000175000017500000000153213525245162032437 0ustar ellertellert -42././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement010000755000175000017500000000155613525245162032504 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement020000755000175000017500000000215413525245162032500 0ustar ellertellert -42 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/IntElement-IntElement04.xml0000755000175000017500000000154113525245162032441 0ustar ellertellert 2147483647././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement05-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement050000755000175000017500000000216413525245162032504 0ustar ellertellert -2147483648 ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement040000755000175000017500000000156713525245162032511 0ustar ellertellert 2147483647 ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement010000755000175000017500000000215413525245162032477 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement030000755000175000017500000000215613525245162032503 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement030000755000175000017500000000215413525245162032501 0ustar ellertellert +42 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/IntElement-IntElement03.xml0000755000175000017500000000153213525245162032440 0ustar ellertellert +42gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/IntElement-IntElement05.xml0000755000175000017500000000154213525245162032443 0ustar ellertellert -2147483648././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement020000755000175000017500000000156013525245162032500 0ustar ellertellert -42 ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement020000755000175000017500000000215613525245162032502 0ustar ellertellert -42 ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement010000755000175000017500000000215213525245162032475 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement030000755000175000017500000000156013525245162032501 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement040000755000175000017500000000216313525245162032502 0ustar ellertellert 2147483647 ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement050000755000175000017500000000157013525245162032504 0ustar ellertellert -2147483648 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/IntElement-IntElement01.xml0000755000175000017500000000153013525245162032434 0ustar ellertellert 1././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IntElement/echoIntElement-IntElement040000755000175000017500000000216513525245162032504 0ustar ellertellert 2147483647 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementFormUnqualified/0000755000175000017500000000000013525245161030000 5ustar ellertellert././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementFormUnqualified/echoElementFormUnqualified-ElementFormUnqualified01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementFormUnqualified/echoElementForm0000755000175000017500000000175213525245161033007 0ustar ellertellert string ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementFormUnqualified/echoElementFormUnqualified-ElementFormUnqualified01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementFormUnqualified/echoElementForm0000755000175000017500000000232713525245161033006 0ustar ellertellert string ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementFormUnqualified/ElementFormUnqualified-ElementFormUnqualified01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementFormUnqualified/ElementFormUnqu0000755000175000017500000000171013525245161033013 0ustar ellertellert string ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementFormUnqualified/echoElementFormUnqualified-ElementFormUnqualified01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementFormUnqualified/echoElementForm0000755000175000017500000000232513525245161033004 0ustar ellertellert string gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/0000755000175000017500000000000013525245162031343 5ustar ellertellert././@LongLink0000644000000000000000000000024200000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/echoUnsignedLongSimpleTypePattern-UnsignedLongSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/echoUnsi0000755000175000017500000000176513525245162033057 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/echoUnsignedLongSimpleTypePattern-UnsignedLongSimpleTypePattern02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/echoUnsi0000755000175000017500000000231313525245162033045 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/echoUnsignedLongSimpleTypePattern-UnsignedLongSimpleTypePattern01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/echoUnsi0000755000175000017500000000231313525245162033045 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/echoUnsignedLongSimpleTypePattern-UnsignedLongSimpleTypePattern02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/echoUnsi0000755000175000017500000000231513525245162033047 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000023600000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/UnsignedLongSimpleTypePattern-UnsignedLongSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/Unsigned0000755000175000017500000000171413525245162033050 0ustar ellertellert 123././@LongLink0000644000000000000000000000023600000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/UnsignedLongSimpleTypePattern-UnsignedLongSimpleTypePattern02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/Unsigned0000755000175000017500000000171413525245162033050 0ustar ellertellert 009././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/echoUnsignedLongSimpleTypePattern-UnsignedLongSimpleTypePattern01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/echoUnsi0000755000175000017500000000231513525245162033047 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000024200000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/echoUnsignedLongSimpleTypePattern-UnsignedLongSimpleTypePattern02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongSimpleTypePattern/echoUnsi0000755000175000017500000000176513525245162033057 0ustar ellertellert 009 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/0000755000175000017500000000000013525245162031054 5ustar ellertellert././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/NonPositiveIntegerAttribute-NonPositiveIntegerAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/NonPositiv0000755000175000017500000000172613525245162033120 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPositiveIntegerAttribute-NonPositiveIntegerAttribute03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPos0000755000175000017500000000233713525245162033062 0ustar ellertellert ././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/NonPositiveIntegerAttribute-NonPositiveIntegerAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/NonPositiv0000755000175000017500000000172413525245162033116 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPositiveIntegerAttribute-NonPositiveIntegerAttribute02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPos0000755000175000017500000000233613525245162033061 0ustar ellertellert ././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/NonPositiveIntegerAttribute-NonPositiveIntegerAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/NonPositiv0000755000175000017500000000172513525245162033117 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPositiveIntegerAttribute-NonPositiveIntegerAttribute04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPos0000755000175000017500000000241013525245162033052 0ustar ellertellert ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPositiveIntegerAttribute-NonPositiveIntegerAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPos0000755000175000017500000000205013525245162033052 0ustar ellertellert ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPositiveIntegerAttribute-NonPositiveIntegerAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPos0000755000175000017500000000177713525245162033071 0ustar ellertellert ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPositiveIntegerAttribute-NonPositiveIntegerAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPos0000755000175000017500000000177613525245162033070 0ustar ellertellert ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPositiveIntegerAttribute-NonPositiveIntegerAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPos0000755000175000017500000000200013525245162033045 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPositiveIntegerAttribute-NonPositiveIntegerAttribute02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPos0000755000175000017500000000234013525245162033054 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPositiveIntegerAttribute-NonPositiveIntegerAttribute03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPos0000755000175000017500000000234113525245162033055 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPositiveIntegerAttribute-NonPositiveIntegerAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPos0000755000175000017500000000234013525245162033054 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPositiveIntegerAttribute-NonPositiveIntegerAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPos0000755000175000017500000000234213525245162033056 0ustar ellertellert ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPositiveIntegerAttribute-NonPositiveIntegerAttribute04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/echoNonPos0000755000175000017500000000241213525245162033054 0ustar ellertellert ././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/NonPositiveIntegerAttribute-NonPositiveIntegerAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonPositiveIntegerAttribute/NonPositiv0000755000175000017500000000177613525245162033125 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/0000755000175000017500000000000013525245162030055 5ustar ellertellert././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedShortAttribute-UnsignedShortAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedSho0000755000175000017500000000230313525245162033066 0ustar ellertellert ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/UnsignedShortAttribute-UnsignedShortAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/UnsignedShortAt0000755000175000017500000000166513525245162033074 0ustar ellertellert ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedShortAttribute-UnsignedShortAttribute04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedSho0000755000175000017500000000230613525245162033071 0ustar ellertellert ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedShortAttribute-UnsignedShortAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedSho0000755000175000017500000000173013525245162033071 0ustar ellertellert ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedShortAttribute-UnsignedShortAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedSho0000755000175000017500000000172713525245162033077 0ustar ellertellert ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/UnsignedShortAttribute-UnsignedShortAttribute03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/UnsignedShortAt0000755000175000017500000000166313525245162033072 0ustar ellertellert ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedShortAttribute-UnsignedShortAttribute02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedSho0000755000175000017500000000230313525245162033066 0ustar ellertellert ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedShortAttribute-UnsignedShortAttribute03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedSho0000755000175000017500000000230213525245162033065 0ustar ellertellert ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedShortAttribute-UnsignedShortAttribute02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedSho0000755000175000017500000000230113525245162033064 0ustar ellertellert ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedShortAttribute-UnsignedShortAttribute04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedSho0000755000175000017500000000230413525245162033067 0ustar ellertellert ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedShortAttribute-UnsignedShortAttribute03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedSho0000755000175000017500000000230413525245162033067 0ustar ellertellert ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedShortAttribute-UnsignedShortAttribute04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedSho0000755000175000017500000000173213525245162033073 0ustar ellertellert ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/UnsignedShortAttribute-UnsignedShortAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/UnsignedShortAt0000755000175000017500000000166213525245162033071 0ustar ellertellert ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedShortAttribute-UnsignedShortAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedSho0000755000175000017500000000230113525245162033064 0ustar ellertellert ././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/UnsignedShortAttribute-UnsignedShortAttribute02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/UnsignedShortAt0000755000175000017500000000166213525245162033071 0ustar ellertellert ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedShortAttribute-UnsignedShortAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortAttribute/echoUnsignedSho0000755000175000017500000000172713525245162033077 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AppinfoElement/0000755000175000017500000000000013525245161026302 5ustar ellertellert././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AppinfoElement/echoAppinfoElement-AppinfoElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AppinfoElement/echoAppinfoElement-Appi0000755000175000017500000000220613525245161032664 0ustar ellertellert some info ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AppinfoElement/AppinfoElement-AppinfoElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AppinfoElement/AppinfoElement-AppinfoE0000755000175000017500000000157013525245161032640 0ustar ellertellert some info././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AppinfoElement/echoAppinfoElement-AppinfoElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AppinfoElement/echoAppinfoElement-Appi0000755000175000017500000000162213525245161032665 0ustar ellertellert some info ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AppinfoElement/echoAppinfoElement-AppinfoElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AppinfoElement/echoAppinfoElement-Appi0000755000175000017500000000221013525245161032657 0ustar ellertellert some info gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/0000755000175000017500000000000013525245162026671 5ustar ellertellert././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/echoElementMinOccurs0-ElementMinOccurs002-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/echoElementMinOccurs0000755000175000017500000000244413525245162032676 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/echoElementMinOccurs0-ElementMinOccurs002-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/echoElementMinOccurs0000755000175000017500000000244613525245162032700 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/echoElementMinOccurs0-ElementMinOccurs002.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/echoElementMinOccurs0000755000175000017500000000204713525245162032675 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/ElementMinOccurs0-ElementMinOccurs001.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/ElementMinOccurs0-El0000755000175000017500000000173413525245162032456 0ustar ellertellert Paul Downey ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/ElementMinOccurs0-ElementMinOccurs002.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/ElementMinOccurs0-El0000755000175000017500000000201213525245162032444 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/echoElementMinOccurs0-ElementMinOccurs001-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/echoElementMinOccurs0000755000175000017500000000236213525245162032675 0ustar ellertellert Paul Downey ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/echoElementMinOccurs0-ElementMinOccurs001.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/echoElementMinOccurs0000755000175000017500000000177113525245162032700 0ustar ellertellert Paul Downey ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/echoElementMinOccurs0-ElementMinOccurs001-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0/echoElementMinOccurs0000755000175000017500000000236413525245162032677 0ustar ellertellert Paul Downey gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeAttributes/0000755000175000017500000000000013525245162027537 5ustar ellertellert././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeAttributes/SimpleTypeAttributes-SimpleTypeAttributes01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeAttributes/SimpleTypeAttribu0000755000175000017500000000173413525245162033120 0ustar ellertellert hello././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeAttributes/echoSimpleTypeAttributes-SimpleTypeAttributes01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeAttributes/echoSimpleTypeAtt0000755000175000017500000000237013525245162033072 0ustar ellertellert hello ././@LongLink0000644000000000000000000000021600000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeAttributes/echoSimpleTypeAttributes-SimpleTypeAttributes01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeAttributes/echoSimpleTypeAtt0000755000175000017500000000236613525245162033077 0ustar ellertellert hello ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeAttributes/echoSimpleTypeAttributes-SimpleTypeAttributes01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/SimpleTypeAttributes/echoSimpleTypeAtt0000755000175000017500000000200213525245162033062 0ustar ellertellert hello gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthSimpleTypePattern/0000755000175000017500000000000013525245162030764 5ustar ellertellert././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthSimpleTypePattern/echoGYearMonthSimpleTypePattern-GYearMonthSimpleTypePattern01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthSimpleTypePattern/echoGYearM0000755000175000017500000000230713525245162032677 0ustar ellertellert 2001-12 ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthSimpleTypePattern/echoGYearMonthSimpleTypePattern-GYearMonthSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthSimpleTypePattern/echoGYearM0000755000175000017500000000175313525245162032703 0ustar ellertellert 2001-12 ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthSimpleTypePattern/echoGYearMonthSimpleTypePattern-GYearMonthSimpleTypePattern01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthSimpleTypePattern/echoGYearM0000755000175000017500000000230513525245162032675 0ustar ellertellert 2001-12 ././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthSimpleTypePattern/GYearMonthSimpleTypePattern-GYearMonthSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GYearMonthSimpleTypePattern/GYearMonth0000755000175000017500000000170413525245162032731 0ustar ellertellert 2001-12gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/0000755000175000017500000000000013525245162032362 5ustar ellertellert././@LongLink0000644000000000000000000000027400000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/echoElementMinOccurs0MaxOccursUnbounded-ElementMinOccurs0MaxOccursUnbounded101-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/ec0000755000175000017500000000222213525245162032675 0ustar ellertellert ././@LongLink0000644000000000000000000000027400000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/echoElementMinOccurs0MaxOccursUnbounded-ElementMinOccurs0MaxOccursUnbounded102-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/ec0000755000175000017500000000251113525245162032676 0ustar ellertellert 24 34 44 ././@LongLink0000644000000000000000000000026100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/ElementMinOccurs0MaxOccursUnbounded-ElementMinOccurs0MaxOccursUnbounded102.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/El0000755000175000017500000000177213525245162032657 0ustar ellertellert 24 34 44 ././@LongLink0000644000000000000000000000026500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/echoElementMinOccurs0MaxOccursUnbounded-ElementMinOccurs0MaxOccursUnbounded102.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/ec0000755000175000017500000000210013525245162032670 0ustar ellertellert 24 34 44 ././@LongLink0000644000000000000000000000027400000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/echoElementMinOccurs0MaxOccursUnbounded-ElementMinOccurs0MaxOccursUnbounded101-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/ec0000755000175000017500000000222013525245162032673 0ustar ellertellert ././@LongLink0000644000000000000000000000027400000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/echoElementMinOccurs0MaxOccursUnbounded-ElementMinOccurs0MaxOccursUnbounded102-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/ec0000755000175000017500000000250713525245162032703 0ustar ellertellert 24 34 44 ././@LongLink0000644000000000000000000000026100000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/ElementMinOccurs0MaxOccursUnbounded-ElementMinOccurs0MaxOccursUnbounded101.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/El0000755000175000017500000000152213525245162032650 0ustar ellertellert ././@LongLink0000644000000000000000000000026500000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/echoElementMinOccurs0MaxOccursUnbounded-ElementMinOccurs0MaxOccursUnbounded101.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementMinOccurs0MaxOccursUnbounded/ec0000755000175000017500000000163013525245162032677 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageAttribute/0000755000175000017500000000000013525245162027004 5ustar ellertellert././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageAttribute/echoLanguageAttribute-LanguageAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageAttribute/echoLanguageAttribut0000755000175000017500000000224313525245162033034 0ustar ellertellert ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageAttribute/LanguageAttribute-LanguageAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageAttribute/LanguageAttribute-La0000755000175000017500000000161713525245162032700 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageAttribute/echoLanguageAttribute-LanguageAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageAttribute/echoLanguageAttribut0000755000175000017500000000224513525245162033036 0ustar ellertellert ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageAttribute/echoLanguageAttribute-LanguageAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/LanguageAttribute/echoLanguageAttribut0000755000175000017500000000165713525245162033044 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FinalDefault/0000755000175000017500000000000013525245162025733 5ustar ellertellert././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FinalDefault/echoFinalDefault-FinalDefault01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FinalDefault/echoFinalDefault-FinalDef0000755000175000017500000000216613525245162032531 0ustar ellertellert foo ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FinalDefault/FinalDefault-FinalDefault01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FinalDefault/FinalDefault-FinalDefault0000755000175000017500000000154613525245162032561 0ustar ellertellert foo././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FinalDefault/echoFinalDefault-FinalDefault01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FinalDefault/echoFinalDefault-FinalDef0000755000175000017500000000157613525245162032535 0ustar ellertellert foo ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FinalDefault/echoFinalDefault-FinalDefault01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/FinalDefault/echoFinalDefault-FinalDef0000755000175000017500000000217013525245162032524 0ustar ellertellert foo gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/0000755000175000017500000000000013525245162030137 5ustar ellertellert././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOptionalElement-NillableOptionalElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOp0000755000175000017500000000250513525245162032747 0ustar ellertellert Paul Downey ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOptionalElement-NillableOptionalElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOp0000755000175000017500000000251313525245162032746 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOptionalElement-NillableOptionalElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOp0000755000175000017500000000243113525245162032745 0ustar ellertellert Paul Downey ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOptionalElement-NillableOptionalElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOp0000755000175000017500000000206213525245162032745 0ustar ellertellert Paul Downey ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOptionalElement-NillableOptionalElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOp0000755000175000017500000000214013525245162032742 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOptionalElement-NillableOptionalElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOp0000755000175000017500000000243313525245162032747 0ustar ellertellert Paul Downey ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/NillableOptionalElement-NillableOptionalElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/NillableOption0000755000175000017500000000207213525245162033001 0ustar ellertellert Paul Downey ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOptionalElement-NillableOptionalElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOp0000755000175000017500000000251513525245162032750 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOptionalElement-NillableOptionalElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOp0000755000175000017500000000250713525245162032751 0ustar ellertellert Paul Downey ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/NillableOptionalElement-NillableOptionalElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/NillableOption0000755000175000017500000000210013525245162032771 0ustar ellertellert Paul Sumner Downey ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/NillableOptionalElement-NillableOptionalElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/NillableOption0000755000175000017500000000202213525245162032774 0ustar ellertellert Paul Downey ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOptionalElement-NillableOptionalElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NillableOptionalElement/echoNillableOp0000755000175000017500000000213213525245162032743 0ustar ellertellert Paul Downey gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxOther/0000755000175000017500000000000013525245162030275 5ustar ellertellert././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxOther/ExtendedSequenceLaxOther-ExtendedSequenceLaxOther01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxOther/ExtendedSeque0000755000175000017500000000226413525245162032772 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxOther/echoExtendedSequenceLaxOther-ExtendedSequenceLaxOther01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxOther/echoExtendedS0000755000175000017500000000233313525245162032746 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxOther/echoExtendedSequenceLaxOther-ExtendedSequenceLaxOther01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxOther/echoExtendedS0000755000175000017500000000266313525245162032754 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000023200000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxOther/echoExtendedSequenceLaxOther-ExtendedSequenceLaxOther01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxOther/echoExtendedS0000755000175000017500000000266513525245162032756 0ustar ellertellert String String Stuff gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/0000755000175000017500000000000013525245162026006 5ustar ellertellert././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/ShortElement-ShortElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/ShortElement-ShortElement0000755000175000017500000000155113525245162032756 0ustar ellertellert -32768././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortEle0000755000175000017500000000217013525245162032727 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortEle0000755000175000017500000000160113525245162032725 0ustar ellertellert -32768 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortEle0000755000175000017500000000157613525245162032740 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortEle0000755000175000017500000000216613525245162032734 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortEle0000755000175000017500000000216613525245162032734 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortEle0000755000175000017500000000217213525245162032731 0ustar ellertellert 32767 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortEle0000755000175000017500000000157413525245162032736 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortEle0000755000175000017500000000160013525245162032724 0ustar ellertellert 32767 ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/ShortElement-ShortElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/ShortElement-ShortElement0000755000175000017500000000154413525245162032760 0ustar ellertellert 1././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/ShortElement-ShortElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/ShortElement-ShortElement0000755000175000017500000000154613525245162032762 0ustar ellertellert +42././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/ShortElement-ShortElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/ShortElement-ShortElement0000755000175000017500000000155013525245162032755 0ustar ellertellert 32767././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortElement04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortEle0000755000175000017500000000217113525245162032730 0ustar ellertellert -32768 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortEle0000755000175000017500000000216413525245162032732 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortEle0000755000175000017500000000217013525245162032727 0ustar ellertellert 32767 ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortElement04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ShortElement/echoShortElement-ShortEle0000755000175000017500000000217313525245162032732 0ustar ellertellert -32768 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/0000755000175000017500000000000013525245161025430 5ustar ellertellert././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector040000755000175000017500000000201713525245161032447 0ustar ellertellert item one item two item three item four gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/BareVector-BareVector01.xml0000755000175000017500000000210613525245161032403 0ustar ellertellert item one item two item three item four item five item six ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector020000755000175000017500000000244013525245161032445 0ustar ellertellert item one item two item three item four ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector040000755000175000017500000000243613525245161032454 0ustar ellertellert item one item two item three item four ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector030000755000175000017500000000256513525245161032456 0ustar ellertellert item one item two item three item four item five item six ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector040000755000175000017500000000244013525245161032447 0ustar ellertellert item one item two item three item four ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector030000755000175000017500000000213413525245161032446 0ustar ellertellert item one item two item three item four item five item six gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/BareVector-BareVector04.xml0000755000175000017500000000177113525245161032415 0ustar ellertellert item one item two item three item four ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector020000755000175000017500000000201713525245161032445 0ustar ellertellert item one item two item three item four ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector020000755000175000017500000000243613525245161032452 0ustar ellertellert item one item two item three item four ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector010000755000175000017500000000256513525245161032454 0ustar ellertellert item one item two item three item four item five item six gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/BareVector-BareVector03.xml0000755000175000017500000000210613525245161032405 0ustar ellertellert item one item two item three item four item five item six ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector010000755000175000017500000000256313525245161032452 0ustar ellertellert item one item two item three item four item five item six gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/BareVector-BareVector02.xml0000755000175000017500000000177113525245161032413 0ustar ellertellert item one item two item three item four ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector010000755000175000017500000000213413525245161032444 0ustar ellertellert item one item two item three item four item five item six ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/BareVector/echoBareVector-BareVector030000755000175000017500000000256313525245161032454 0ustar ellertellert item one item two item three item four item five item six gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESElement/0000755000175000017500000000000013525245162026133 5ustar ellertellert././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESElement/ENTITIESElement-ENTITIESElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESElement/ENTITIESElement-ENTITI0000755000175000017500000000160413525245162031612 0ustar ellertellert lt gt apos quot././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESElement/echoENTITIESElement-ENTITIESElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESElement/echoENTITIESElement-EN0000755000175000017500000000163713525245162031765 0ustar ellertellert lt gt apos quot ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESElement/echoENTITIESElement-ENTITIESElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESElement/echoENTITIESElement-EN0000755000175000017500000000222113525245162031753 0ustar ellertellert lt gt apos quot ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESElement/echoENTITIESElement-ENTITIESElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ENTITIESElement/echoENTITIESElement-EN0000755000175000017500000000222313525245162031755 0ustar ellertellert lt gt apos quot gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/0000755000175000017500000000000013525245162030442 5ustar ellertellert././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000201513525245162032736 0ustar ellertellert 3141592653531415926536106615151970884848347234273984723 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000226513525245162032745 0ustar ellertellert 0 ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/NonNegativeIntegerElement-NonNegativeIntegerElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/NonNegativeI0000755000175000017500000000166213525245162032723 0ustar ellertellert 0././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/NonNegativeIntegerElement-NonNegativeIntegerElement05.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/NonNegativeI0000755000175000017500000000175013525245162032721 0ustar ellertellert 3141592653531415926536106615151970884848347234273984723././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000226613525245162032746 0ustar ellertellert -0 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement05-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000235313525245162032743 0ustar ellertellert 3141592653531415926536106615151970884848347234273984723 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000226713525245162032747 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000172713525245162032747 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/NonNegativeIntegerElement-NonNegativeIntegerElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/NonNegativeI0000755000175000017500000000166413525245162032725 0ustar ellertellert +42././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000173013525245162032741 0ustar ellertellert -0 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000227013525245162032741 0ustar ellertellert -0 ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/NonNegativeIntegerElement-NonNegativeIntegerElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/NonNegativeI0000755000175000017500000000166313525245162032724 0ustar ellertellert -0././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000226513525245162032745 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000226713525245162032747 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000227113525245162032742 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000172713525245162032747 0ustar ellertellert 0 ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000173113525245162032742 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/NonNegativeIntegerElement-NonNegativeIntegerElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/NonNegativeI0000755000175000017500000000166213525245162032723 0ustar ellertellert 1././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement05-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000235513525245162032745 0ustar ellertellert 3141592653531415926536106615151970884848347234273984723 ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegativeIntegerElement-NonNegativeIntegerElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NonNegativeIntegerElement/echoNonNegat0000755000175000017500000000226713525245162032747 0ustar ellertellert 0 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipAny/0000755000175000017500000000000013525245162030125 5ustar ellertellert././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipAny/echoExtendedSequenceSkipAny-ExtendedSequenceSkipAny01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipAny/echoExtendedSe0000755000175000017500000000232313525245162032742 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipAny/ExtendedSequenceSkipAny-ExtendedSequenceSkipAny01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipAny/ExtendedSequen0000755000175000017500000000225513525245162033000 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipAny/echoExtendedSequenceSkipAny-ExtendedSequenceSkipAny01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipAny/echoExtendedSe0000755000175000017500000000266013525245162032746 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipAny/echoExtendedSequenceSkipAny-ExtendedSequenceSkipAny01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceSkipAny/echoExtendedSe0000755000175000017500000000265613525245162032753 0ustar ellertellert String String Stuff gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSAttribute/0000755000175000017500000000000013525245162026517 5ustar ellertellert././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSAttribute/NMTOKENSAttribute-NMTOKENSAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSAttribute/NMTOKENSAttribute-NM0000755000175000017500000000163613525245162032105 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSAttribute/echoNMTOKENSAttribute-NMTOKENSAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSAttribute/echoNMTOKENSAttribut0000755000175000017500000000226213525245162032263 0ustar ellertellert ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSAttribute/echoNMTOKENSAttribute-NMTOKENSAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSAttribute/echoNMTOKENSAttribut0000755000175000017500000000167613525245162032273 0ustar ellertellert ././@LongLink0000644000000000000000000000020500000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSAttribute/echoNMTOKENSAttribute-NMTOKENSAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NMTOKENSAttribute/echoNMTOKENSAttribut0000755000175000017500000000226413525245162032265 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NCNameAttribute/0000755000175000017500000000000013525245162026362 5ustar ellertellert././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NCNameAttribute/echoNCNameAttribute-NCNameAttribute01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NCNameAttribute/echoNCNameAttribute-NC0000755000175000017500000000223013525245162032427 0ustar ellertellert ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NCNameAttribute/echoNCNameAttribute-NCNameAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NCNameAttribute/echoNCNameAttribute-NC0000755000175000017500000000164013525245162032433 0ustar ellertellert ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NCNameAttribute/NCNameAttribute-NCNameAttribute01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NCNameAttribute/NCNameAttribute-NCName0000755000175000017500000000160213525245162032373 0ustar ellertellert ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NCNameAttribute/echoNCNameAttribute-NCNameAttribute01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/NCNameAttribute/echoNCNameAttribute-NC0000755000175000017500000000223213525245162032431 0ustar ellertellert gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDElement/0000755000175000017500000000000013525245162025203 5ustar ellertellert././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDElement/echoIDElement-IDElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDElement/echoIDElement-IDElement01-so0000755000175000017500000000214713525245162032166 0ustar ellertellert foo ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDElement/echoIDElement-IDElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDElement/echoIDElement-IDElement01-so0000755000175000017500000000215113525245162032161 0ustar ellertellert foo ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDElement/echoIDElement-IDElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDElement/echoIDElement-IDElement01.xm0000755000175000017500000000155113525245162032170 0ustar ellertellert foo gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/IDElement/IDElement-IDElement01.xml0000755000175000017500000000152413525245162031505 0ustar ellertellert foogsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongEnumerationType/0000755000175000017500000000000013525245162031042 5ustar ellertellert././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongEnumerationType/UnsignedLongEnumerationType-UnsignedLongEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongEnumerationType/UnsignedLo0000755000175000017500000000171313525245162033041 0ustar ellertellert 33333333333333././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongEnumerationType/echoUnsignedLongEnumerationType-UnsignedLongEnumerationType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongEnumerationType/echoUnsign0000755000175000017500000000231613525245162033074 0ustar ellertellert 33333333333333 ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongEnumerationType/echoUnsignedLongEnumerationType-UnsignedLongEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongEnumerationType/echoUnsign0000755000175000017500000000176213525245162033100 0ustar ellertellert 33333333333333 ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongEnumerationType/echoUnsignedLongEnumerationType-UnsignedLongEnumerationType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongEnumerationType/echoUnsign0000755000175000017500000000231413525245162033072 0ustar ellertellert 33333333333333 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ImportNamespace/0000755000175000017500000000000013525245162026464 5ustar ellertellertgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementReferenceUnqualified/0000755000175000017500000000000013525245162030774 5ustar ellertellert././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementReferenceUnqualified/echoElementReferenceUnqualified-ElementReferenceUnqualified01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementReferenceUnqualified/echoElemen0000755000175000017500000000262013525245162032766 0ustar ellertellert String String ././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementReferenceUnqualified/ElementReferenceUnqualified-ElementReferenceUnqualified01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementReferenceUnqualified/ElementRef0000755000175000017500000000220413525245162032746 0ustar ellertellert String String ././@LongLink0000644000000000000000000000024300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementReferenceUnqualified/echoElementReferenceUnqualified-ElementReferenceUnqualified01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementReferenceUnqualified/echoElemen0000755000175000017500000000262213525245162032770 0ustar ellertellert String String ././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementReferenceUnqualified/echoElementReferenceUnqualified-ElementReferenceUnqualified01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementReferenceUnqualified/echoElemen0000755000175000017500000000225313525245162032770 0ustar ellertellert String String gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementFixed/0000755000175000017500000000000013525245161025745 5ustar ellertellert././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementFixed/echoElementFixed-ElementFixed01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementFixed/echoElementFixed-ElementF0000755000175000017500000000217013525245161032600 0ustar ellertellert yes ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementFixed/ElementFixed-ElementFixed01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementFixed/ElementFixed-ElementFixed0000755000175000017500000000154613525245161032621 0ustar ellertellert yes././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementFixed/echoElementFixed-ElementFixed01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementFixed/echoElementFixed-ElementF0000755000175000017500000000216613525245161032605 0ustar ellertellert yes ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementFixed/echoElementFixed-ElementFixed01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementFixed/echoElementFixed-ElementF0000755000175000017500000000157613525245161032611 0ustar ellertellert yes gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/0000755000175000017500000000000013525245162026540 5ustar ellertellert././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/echoGlobalElementAll-GlobalElementAll02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/echoGlobalElementAll-0000755000175000017500000000241413525245162032546 0ustar ellertellert 42 douze ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/echoGlobalElementAll-GlobalElementAll02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/echoGlobalElementAll-0000755000175000017500000000202113525245162032540 0ustar ellertellert 42 douze ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/echoGlobalElementAll-GlobalElementAll01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/echoGlobalElementAll-0000755000175000017500000000241213525245162032544 0ustar ellertellert one 42 ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/echoGlobalElementAll-GlobalElementAll02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/echoGlobalElementAll-0000755000175000017500000000241613525245162032550 0ustar ellertellert 42 douze ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/echoGlobalElementAll-GlobalElementAll01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/echoGlobalElementAll-0000755000175000017500000000241413525245162032546 0ustar ellertellert one 42 ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/echoGlobalElementAll-GlobalElementAll01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/echoGlobalElementAll-0000755000175000017500000000201713525245162032545 0ustar ellertellert one 42 ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/GlobalElementAll-GlobalElementAll02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/GlobalElementAll-Glob0000755000175000017500000000176513525245162032523 0ustar ellertellert 42 douze ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/GlobalElementAll-GlobalElementAll01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalElementAll/GlobalElementAll-Glob0000755000175000017500000000176313525245162032521 0ustar ellertellert one 42 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/0000755000175000017500000000000013525245161025701 5ustar ellertellert././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceChoice03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceCh0000755000175000017500000000224713525245161032443 0ustar ellertellert home ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/ChoiceChoice-ChoiceChoice03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/ChoiceChoice-ChoiceChoice0000755000175000017500000000161613525245161032443 0ustar ellertellert home ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceChoice02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceCh0000755000175000017500000000164613525245161032445 0ustar ellertellert home ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceChoice01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceCh0000755000175000017500000000224513525245161032441 0ustar ellertellert home ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceChoice03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceCh0000755000175000017500000000224513525245161032441 0ustar ellertellert home ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/ChoiceChoice-ChoiceChoice02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/ChoiceChoice-ChoiceChoice0000755000175000017500000000161613525245161032443 0ustar ellertellert home ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceChoice02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceCh0000755000175000017500000000224513525245161032441 0ustar ellertellert home ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceChoice01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceCh0000755000175000017500000000164613525245161032445 0ustar ellertellert home ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceChoice02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceCh0000755000175000017500000000224713525245161032443 0ustar ellertellert home ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/ChoiceChoice-ChoiceChoice01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/ChoiceChoice-ChoiceChoice0000755000175000017500000000161613525245161032443 0ustar ellertellert home ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceChoice01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceCh0000755000175000017500000000224713525245161032443 0ustar ellertellert home ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceChoice03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ChoiceChoice/echoChoiceChoice-ChoiceCh0000755000175000017500000000164613525245161032445 0ustar ellertellert home gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementGroup/0000755000175000017500000000000013525245162026003 5ustar ellertellert././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementGroup/echoElementGroup-ElementGroup01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementGroup/echoElementGroup-ElementG0000755000175000017500000000231313525245162032673 0ustar ellertellert foo bar ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementGroup/ElementGroup-ElementGroup01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementGroup/ElementGroup-ElementGroup0000755000175000017500000000166013525245162032746 0ustar ellertellert foo bar ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementGroup/echoElementGroup-ElementGroup01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementGroup/echoElementGroup-ElementG0000755000175000017500000000231513525245161032674 0ustar ellertellert foo bar ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementGroup/echoElementGroup-ElementGroup01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ElementGroup/echoElementGroup-ElementG0000755000175000017500000000171013525245162032673 0ustar ellertellert foo bar gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeSkip/0000755000175000017500000000000013525245161026636 5ustar ellertellert././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeSkip/echoAnyAttributeSkip-AnyAttributeSkip01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeSkip/echoAnyAttributeSkip-0000755000175000017500000000243313525245161032744 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeSkip/AnyAttributeSkip-AnyAttributeSkip01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeSkip/AnyAttributeSkip-AnyA0000755000175000017500000000177113525245161032662 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeSkip/echoAnyAttributeSkip-AnyAttributeSkip01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeSkip/echoAnyAttributeSkip-0000755000175000017500000000203013525245161032735 0ustar ellertellert Bobby Sox ././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeSkip/echoAnyAttributeSkip-AnyAttributeSkip01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AnyAttributeSkip/echoAnyAttributeSkip-0000755000175000017500000000243113525245161032742 0ustar ellertellert Bobby Sox gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/0000755000175000017500000000000013525245162027303 5ustar ellertellert././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongElement-UnsignedLongElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongEl0000755000175000017500000000165613525245162032755 0ustar ellertellert -0 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongElement-UnsignedLongElement04-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongEl0000755000175000017500000000225413525245162032750 0ustar ellertellert 18446744073709551615 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongElement-UnsignedLongElement01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongEl0000755000175000017500000000222713525245162032750 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongElement-UnsignedLongElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongEl0000755000175000017500000000165713525245162032756 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongElement-UnsignedLongElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongEl0000755000175000017500000000170013525245162032743 0ustar ellertellert 18446744073709551615 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongElement-UnsignedLongElement02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongEl0000755000175000017500000000223013525245162032742 0ustar ellertellert -0 ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/UnsignedLongElement-UnsignedLongElement04.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/UnsignedLongElemen0000755000175000017500000000164113525245162032755 0ustar ellertellert 18446744073709551615././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongElement-UnsignedLongElement01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongEl0000755000175000017500000000223113525245162032743 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/UnsignedLongElement-UnsignedLongElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/UnsignedLongElemen0000755000175000017500000000161613525245162032757 0ustar ellertellert 1././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/UnsignedLongElement-UnsignedLongElement03.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/UnsignedLongElemen0000755000175000017500000000162013525245162032752 0ustar ellertellert +42././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/UnsignedLongElement-UnsignedLongElement02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/UnsignedLongElemen0000755000175000017500000000161713525245162032760 0ustar ellertellert -0././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongElement-UnsignedLongElement01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongEl0000755000175000017500000000165513525245162032754 0ustar ellertellert 1 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongElement-UnsignedLongElement04-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongEl0000755000175000017500000000225213525245162032746 0ustar ellertellert 18446744073709551615 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongElement-UnsignedLongElement03-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongEl0000755000175000017500000000223113525245162032743 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongElement-UnsignedLongElement03-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongEl0000755000175000017500000000223313525245162032745 0ustar ellertellert +42 ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongElement-UnsignedLongElement02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedLongElement/echoUnsignedLongEl0000755000175000017500000000223213525245162032744 0ustar ellertellert -0 gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/0000755000175000017500000000000013525245162030215 5ustar ellertellert././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/echoStringSimpleTypePattern-StringSimpleTypePattern02-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/echoStringSimp0000755000175000017500000000225513525245162033105 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/StringSimpleTypePattern-StringSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/StringSimpleTy0000755000175000017500000000165013525245162033102 0ustar ellertellert 123././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/echoStringSimpleTypePattern-StringSimpleTypePattern02-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/echoStringSimp0000755000175000017500000000225713525245162033107 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/echoStringSimpleTypePattern-StringSimpleTypePattern02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/echoStringSimp0000755000175000017500000000171313525245162033103 0ustar ellertellert 009 ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/echoStringSimpleTypePattern-StringSimpleTypePattern01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/echoStringSimp0000755000175000017500000000225713525245162033107 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/echoStringSimpleTypePattern-StringSimpleTypePattern01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/echoStringSimp0000755000175000017500000000225513525245162033105 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/echoStringSimpleTypePattern-StringSimpleTypePattern01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/echoStringSimp0000755000175000017500000000171313525245162033103 0ustar ellertellert 123 ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/StringSimpleTypePattern-StringSimpleTypePattern02.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/StringSimpleTypePattern/StringSimpleTy0000755000175000017500000000165013525245162033102 0ustar ellertellert 009gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxAny/0000755000175000017500000000000013525245162027743 5ustar ellertellert././@LongLink0000644000000000000000000000021100000000000011575 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxAny/ExtendedSequenceLaxAny-ExtendedSequenceLaxAny01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxAny/ExtendedSequenc0000755000175000017500000000224613525245162032761 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxAny/echoExtendedSequenceLaxAny-ExtendedSequenceLaxAny01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxAny/echoExtendedSeq0000755000175000017500000000265313525245162032747 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxAny/echoExtendedSequenceLaxAny-ExtendedSequenceLaxAny01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxAny/echoExtendedSeq0000755000175000017500000000265113525245162032745 0ustar ellertellert String String Stuff ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxAny/echoExtendedSequenceLaxAny-ExtendedSequenceLaxAny01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/ExtendedSequenceLaxAny/echoExtendedSeq0000755000175000017500000000231313525245162032740 0ustar ellertellert String String Stuff gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortEnumerationType/0000755000175000017500000000000013525245162031242 5ustar ellertellert././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortEnumerationType/echoUnsignedShortEnumerationType-UnsignedShortEnumerationType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortEnumerationType/echoUnsig0000755000175000017500000000230713525245162033116 0ustar ellertellert 3333 ././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortEnumerationType/echoUnsignedShortEnumerationType-UnsignedShortEnumerationType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortEnumerationType/echoUnsig0000755000175000017500000000231113525245162033111 0ustar ellertellert 3333 ././@LongLink0000644000000000000000000000023700000000000011605 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortEnumerationType/echoUnsignedShortEnumerationType-UnsignedShortEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortEnumerationType/echoUnsig0000755000175000017500000000175713525245162033126 0ustar ellertellert 3333 ././@LongLink0000644000000000000000000000023300000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortEnumerationType/UnsignedShortEnumerationType-UnsignedShortEnumerationType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/UnsignedShortEnumerationType/UnsignedS0000755000175000017500000000170713525245162033074 0ustar ellertellert 3333gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeReferenceUnqualified/0000755000175000017500000000000013525245161031345 5ustar ellertellert././@LongLink0000644000000000000000000000024200000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeReferenceUnqualified/echoAttributeReferenceUnqualified-AttributeReferenceUnqualified01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeReferenceUnqualified/echoAttr0000755000175000017500000000225513525245161033050 0ustar ellertellert String String ././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeReferenceUnqualified/echoAttributeReferenceUnqualified-AttributeReferenceUnqualified01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeReferenceUnqualified/echoAttr0000755000175000017500000000262613525245161033052 0ustar ellertellert String String ././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeReferenceUnqualified/echoAttributeReferenceUnqualified-AttributeReferenceUnqualified01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeReferenceUnqualified/echoAttr0000755000175000017500000000262413525245161033050 0ustar ellertellert String String ././@LongLink0000644000000000000000000000023600000000000011604 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeReferenceUnqualified/AttributeReferenceUnqualified-AttributeReferenceUnqualified01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/AttributeReferenceUnqualified/Attribut0000755000175000017500000000220113525245161033064 0ustar ellertellert String String gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeSimpleType/0000755000175000017500000000000013525245162030475 5ustar ellertellert././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeSimpleType/echoGlobalAttributeSimpleType-GlobalAttributeSimpleType01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeSimpleType/echoGlobalAt0000755000175000017500000000255213525245162032753 0ustar ellertellert string ././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeSimpleType/echoGlobalAttributeSimpleType-GlobalAttributeSimpleType01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeSimpleType/echoGlobalAt0000755000175000017500000000255413525245162032755 0ustar ellertellert string ././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeSimpleType/GlobalAttributeSimpleType-GlobalAttributeSimpleType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeSimpleType/GlobalAttrib0000755000175000017500000000212713525245162032773 0ustar ellertellert string ././@LongLink0000644000000000000000000000022600000000000011603 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeSimpleType/echoGlobalAttributeSimpleType-GlobalAttributeSimpleType01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/GlobalAttributeSimpleType/echoGlobalAt0000755000175000017500000000217713525245162032756 0ustar ellertellert string gsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedComplexContent/0000755000175000017500000000000013525245162027326 5ustar ellertellert././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedComplexContent/echoMixedComplexContent-MixedComplexContent01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedComplexContent/echoMixedComplexCo0000755000175000017500000000216313525245162032775 0ustar ellertellert string mixed content string mixed content string mixed content ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedComplexContent/echoMixedComplexContent-MixedComplexContent01-soap11.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedComplexContent/echoMixedComplexCo0000755000175000017500000000254313525245162032777 0ustar ellertellert string mixed content string mixed content string mixed content ././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedComplexContent/MixedComplexContent-MixedComplexContent01.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedComplexContent/MixedComplexConten0000755000175000017500000000212413525245162033020 0ustar ellertellert string mixed content string mixed content string mixed content ././@LongLink0000644000000000000000000000021300000000000011577 Lustar rootrootgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedComplexContent/echoMixedComplexContent-MixedComplexContent01-soap12.xmlgsoap-2.8.91/gsoap/samples/autotest/databinding/examples/6/09/MixedComplexContent/echoMixedComplexCo0000755000175000017500000000254113525245162032775 0ustar ellertellert string mixed content string mixed content string mixed content gsoap-2.8.91/gsoap/samples/autotest/README.txt0000644000175000017500000002265313525245162020424 0ustar ellertellert Autotest Server Feature Demonstration ===================================== The soapcpp2 option -T generates an autotest server soapTester.c[pp], which can be used to test a client application against, or to test messaging and XML databindings. Option -T can be used in combination with option -i to generate test server object classes, instead of C code. In this example an autotest server is generated and used to verify the schema mapping capability against 294 schema patterns published by the W3C Schema Patterns for Databinding Working Group. XML Schema Patterns for Databinding Interoperability Testing ------------------------------------------------------------ Both basic and advanced XML schema patterns test suite are passed by gSOAP. For more information about the W3C working group databinding test patterns, see http://www.w3.org/2002/ws/databinding/ Code is autogenerated from WSDL and XSD documents for interoperability testing. This example shows the auto test functionality for a large WSDL with 294 echo operations for basic and advanced XML schema patterns. The generated auto test server implements the echo operations where the echo operations are generated by soapcpp2 option -T based on the fact that the input and output operation types are identical. From the 294 test patterns, gSOAP passes all except for 10 that are deemed impossible to test because these 10 patterns in examples.xsd/examples.wsdl (provided by the working group) have errors due to skipped test patterns in the schemas. For details on errors and skipped tests, see further below. Acknowledgments and Licenses ---------------------------- W3C XML Schema Patterns for Databinding Working Group: http://www.w3.org/2002/ws/databinding/ Schemas and XML documents duplicated here with permission: examples.wsdl WSDL from the W3C (with some edits) examples.xsd the schema only, provided by the W3C ChameleonIncluded.xsd referenced in examples.wsdl Included.xsd referenced in examples.wsdl RelativeIncluded.xsd referenced in examples.wsdl redefineschema.xsd referenced in examples.wsdl strict.xsd referenced in examples.wsdl databinding/examples/6/09/.../ (copy of XML message files only) W3C copyright and document licensing: http://www.w3.org/Consortium/Legal/copyright-documents Introduction and Usage ---------------------- This example demonstrates the auto-test code generation features of gSOAP. An echo server is auto-generated and tested with auto-generated XML request messages and the W3C working group's databinding patterns. 1. Invoke the 'wsdl2h' tool to generate the C++ databindings: > wsdl2h -d examples.wsdl -d ensures we capture mixed content, anyType, anyAttribute. Other suggested options for databinding interoperability: -P to suppress anyType inheritance (to simplify code). -f to flatten type inheritance hierarchy, includes base members in classes. -c to generate ANSI C (but limits type inheritance). -s to remove STL dependence. typemap.dat addition to increase xsd:dateTime range (from time_t's limits): xsd__dateTime = #import "custom/struct_tm.h" | xsd__dateTime typemap.dat addition to map xsd:duration to a 64 bit long: xsd__duration = #import "custom/duration.h" | xsd__duration 2. Invoke the 'soapcpp2' tool to generate the C++ server logic and autotest: > soapcpp2 -SL -T -I../../import examples.wsdl -T to generate a test echo server. -S to generate server-side code only. -L to omit *Lib.cpp generation. This generates: soapStub.h copy of examples.h without annotations soapH.h serializers soapC.cpp serializers soapServer.cpp server operation dispatcher (RPC skeleton) soapTester.cpp echo server operation implementations (-T option) Other suggested options for databinding interoperability: -s to enforce strict validation. 3. Compile: > c++ -o autotest soapTester.cpp soapServer.cpp soapC.cpp -libgsoap++.a or compile with stdsoap2.cpp and dom.cpp: > c++ -o autotest soapTester.cpp soapServer.cpp soapC.cpp stdsoap2.cpp dom.cpp 4. Run the tests: > ./autotest < SoapBinding.echoXYZ.req.xml Note: XYZ is one of the patterns used in the databinding test suite. The autotest server can also run as a standalone application on port 8080: > ./autotest 0 8080 It will accept the test message over HTTP, e.g. using a router app. A shell script is included to test all gSOAP auto-generated XML request messages: > sh test-self.sh which generates a test-self.log with request-response messages. A shell script is included to test all W3C basic and advanced XML schema patterns with SOAP 1.1 and SOAP 1.2, respectively: > sh test-patterns11.sh > sh test-patterns12.sh which generate test-patterns11.log and test-patterns12.log with request-response messages. The faults are not filtered, so SKIPPED tests show up as faults in these log files (more details below). Corrected errors and skipped tests in databinding test suite ------------------------------------------------------------ Note: we changed in examples.wsdl to make all imported XSD files local (rather than http addresses to download). Some test patterns are "SKIPPED". These patterns are skipped due to the incomplete examples.xsd schema: 1. echoBlockDefault: SKIPPED 2. echoElementReferenceUnqualified: fixed in examples.wsdl: xmlns="http://www.w3.org/2002/ws/databinding/examples/6/09/" added 3. echoFinalDefault: SKIPPED 4. echoMinOccurs1: fixed in examples.wsdl: two value elements but maxOccurs=1, changed to 2 5. echoMixedComplexContent: requires DOM support to pass (wsdl2h option -d) and by treating all content with a DOM (thus, removing other class members). 6. echoMixedContentType: requires DOM support to pass (wsdl2h option -d) and by treating all content with a DOM (thus, removing other class members). 7. echoNoTargetNamespace: SKIPPED 8. echoQualifiedLocalAttributes: SKIPPED incomplete: 9. echoQualifiedLocalElements: SKIPPED 10. echoSOAPEncodedArray: SKIPPED 11. echoSchemaVersion: SKIPPED, because examples.xsd appears incomplete: 12. echoTargetNamespace: SKIPPED 13. echoUnqualifiedLocalAttributes: SKIPPED 14. echoUnqualifiedLocalElements: SKIPPED Fixed test patterns that did not conform to the pattern schemas: 1. echoComplexTypeAttributeExtension: fixed placement of gender attribute in test pattern databinding/examples/6/09/ComplexTypeAttributeExtension: Mary Correct: Mary 2. echoLocalElementSimpleType: fixed in test pattern examples/6/09/echoLocalElementSimpleType: gsoap-2.8.91/gsoap/samples/autotest/test-patterns11.sh0000755000175000017500000000071613525245162022240 0ustar ellertellert#!/bin/sh echo "test-patterns11.log generated " `date` > test-patterns11.log for req in databinding/examples/6/09/*/*-soap11.xml; do name=`basename $req` echo "** $name" echo "" >> test-patterns11.log echo "*** REQUEST $name ***" >> test-patterns11.log cat $req >> test-patterns11.log echo "" >> test-patterns11.log echo "*** RESPONSE ***" >> test-patterns11.log ./autotest 12288 < $req >> test-patterns11.log || echo "\n>> SKIPPED $name\n" done gsoap-2.8.91/gsoap/samples/autotest/LICENSE.txt0000644000175000017500000000051713525245162020544 0ustar ellertellert W3C copyright and document licensing: http://www.w3.org/Consortium/Legal/copyright-documents gSOAP software licensing: Copyright (C) 2001-2010 Robert van Engelen, Genivia Inc. All Rights Reserved. Part of this software is released under one of the following licenses: 1) GPL or 2) Genivia's license for commercial use. gsoap-2.8.91/gsoap/samples/autotest/Makefile.am0000644000175000017500000000324213525245162020753 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 CPPFLAGS=-I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin AM_LDFLAGS=$(CPPFLAGS) -I$(top_srcdir)/gsoap/samples/autotest -L$(top_srcdir)/gsoap/samples/autotest SOAP=$(top_srcdir)/gsoap/src/soapcpp2$(EXEEXT) WSDL=$(top_srcdir)/gsoap/wsdl/wsdl2h$(EXEEXT) WSDL_FLAGS=-d -P -t $(top_srcdir)/gsoap/samples/autotest/typemap.dat SOAP_FLAGS=-SL -T -I$(top_srcdir)/gsoap/import -I$(top_srcdir)/gsoap/custom WSDLINPUT=$(top_srcdir)/gsoap/samples/autotest/examples.wsdl SOAPHEADER=$(top_srcdir)/gsoap/samples/autotest/examples.h SOAP_CPP_SRC=soapC.cpp soapServer.cpp SOAP_CPP_LIB=$(top_builddir)/gsoap/libgsoap++.a $(SOAP_CPP_SRC) : $(WSDLINPUT) $(WSDL) $(WSDL_FLAGS) $(WSDLINPUT) $(SOAP) $(SOAP_FLAGS) $(SOAPHEADER) duration.cpp : ../../custom/duration.c ln -s ../../custom/duration.c duration.cpp long_time.cpp : ../../custom/long_time.c ln -s ../../custom/long_time.c long_time.cpp struct_tm.cpp : ../../custom/struct_tm.c ln -s ../../custom/struct_tm.c struct_tm.cpp struct_tm_date.cpp : ../../custom/struct_tm_date.c ln -s ../../custom/struct_tm_date.c struct_tm_date.cpp #LIBS= noinst_PROGRAMS=autotest autotest_CFLAGS=$(C_DEBUG_FLAGS) -D$(platform) autotest_CPPFLAGS=$(C_DEBUG_FLAGS) -D$(platform) autotest_CXXFLAGS=$(WSDL2H_EXTRA_FLAGS) autotest_SOURCES=$(SOAP_CPP_SRC) soapTester.cpp duration.cpp long_time.cpp struct_tm.cpp struct_tm_date.cpp autotest_LDADD=$(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) CLEANFILES= *~ *.h *.cpp *.xml *.log *.nsmap gsoap-2.8.91/gsoap/samples/rest/0000755000175000017500000000000013525564137016031 5ustar ellertellertgsoap-2.8.91/gsoap/samples/rest/person.cpp0000644000175000017500000000272113525245163020040 0ustar ellertellert/* This example shows a REST PUT, GET, POST, DELETE client Uses the custom/struct_tm_date.c xsd:date serializer To run the client, first build and start the gSOAP webserver on port 8080 and make sure person.xml (in samples/webserver) is in the webserver's folder for the GET and POST operations to work. See samples/webserver. Compile with: soapcpp2 -0 person.h c++ -o person person.cpp soapC.cpp stdsoap2.cpp custom/struct_tm_date.c */ #include "soapH.h" #include "soap.nsmap" int main() { soap *ctx = soap_new1(SOAP_XML_STRICT); Person p; p.name = "John Doe"; p.dob.tm_year = 66; // 1966 (year since 1900 p.dob.tm_mon = 0; // month 0..11 p.dob.tm_mday = 31 ; p.gender = MALE; std::cout << "\nPUT\n"; if (soap_PUT_Person(ctx, "http://localhost:8080/person.xml", &p)) soap_stream_fault(ctx, std::cerr); std::cout << "\nGET\n"; if (soap_GET_Person(ctx, "http://localhost:8080/person.xml", &p)) soap_stream_fault(ctx, std::cerr); else soap_write_Person(ctx, &p); // default stdout std::cout << "\nPOST\n"; if (soap_POST_send_Person(ctx, "http://localhost:8080/person.xml", &p) || soap_POST_recv_Person(ctx, &p)) soap_stream_fault(ctx, std::cerr); else soap_write_Person(ctx, &p); // default stdout std::cout << "\nDELETE\n"; if (soap_DELETE(ctx, "http://localhost:8080/person.xml")) soap_stream_fault(ctx, std::cerr); soap_destroy(ctx); soap_end(ctx); soap_free(ctx); return 0; } gsoap-2.8.91/gsoap/samples/rest/calcrest.wsdl0000644000175000017500000001022713525245163020521 0ustar ellertellert gsoap-2.8.91/gsoap/samples/rest/.deps/0000755000175000017500000000000013525245203017030 5ustar ellertellertgsoap-2.8.91/gsoap/samples/rest/.deps/struct_tm_date.Po0000644000175000017500000002465413525245163022371 0ustar ellertellertstruct_tm_date.o: ../../custom/struct_tm_date.c soapH.h soapStub.h \ /usr/include/time.h /usr/include/_types.h /usr/include/sys/_types.h \ /usr/include/sys/cdefs.h /usr/include/sys/_symbol_aliasing.h \ /usr/include/sys/_posix_availability.h /usr/include/machine/_types.h \ /usr/include/i386/_types.h /usr/include/_structs.h \ /usr/include/sys/_structs.h /usr/include/sys/_types/_timespec.h \ /usr/include/sys/_types/_null.h /usr/include/sys/_types/_clock_t.h \ /usr/include/sys/_types/_size_t.h /usr/include/sys/_types/_time_t.h \ ../../../gsoap/stdsoap2.h ../../../config.h /usr/include/stdlib.h \ /usr/include/Availability.h /usr/include/AvailabilityInternal.h \ /usr/include/sys/wait.h /usr/include/sys/_types/_pid_t.h \ /usr/include/sys/_types/_id_t.h /usr/include/sys/signal.h \ /usr/include/sys/appleapiopts.h /usr/include/machine/signal.h \ /usr/include/i386/signal.h /usr/include/machine/_mcontext.h \ /usr/include/i386/_mcontext.h /usr/include/mach/i386/_structs.h \ /usr/include/sys/_types/_sigaltstack.h \ /usr/include/sys/_types/_ucontext.h \ /usr/include/sys/_types/_pthread_attr_t.h \ /usr/include/sys/_types/_sigset_t.h /usr/include/sys/_types/_uid_t.h \ /usr/include/sys/resource.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.0/include/stdint.h \ /usr/include/stdint.h /usr/include/sys/_types/_int8_t.h \ /usr/include/sys/_types/_int16_t.h /usr/include/sys/_types/_int32_t.h \ /usr/include/sys/_types/_int64_t.h /usr/include/_types/_uint8_t.h \ /usr/include/_types/_uint16_t.h /usr/include/_types/_uint32_t.h \ /usr/include/_types/_uint64_t.h /usr/include/sys/_types/_intptr_t.h \ /usr/include/sys/_types/_uintptr_t.h /usr/include/_types/_intmax_t.h \ /usr/include/_types/_uintmax_t.h /usr/include/sys/_types/_timeval.h \ /usr/include/machine/endian.h /usr/include/i386/endian.h \ /usr/include/sys/_endian.h /usr/include/libkern/_OSByteOrder.h \ /usr/include/libkern/i386/_OSByteOrder.h /usr/include/alloca.h \ /usr/include/sys/_types/_ct_rune_t.h /usr/include/sys/_types/_rune_t.h \ /usr/include/sys/_types/_wchar_t.h /usr/include/machine/types.h \ /usr/include/i386/types.h /usr/include/sys/_types/___offsetof.h \ /usr/include/sys/_types/_dev_t.h /usr/include/sys/_types/_mode_t.h \ /usr/include/stdio.h /usr/include/sys/_types/_va_list.h \ /usr/include/sys/_types/_off_t.h /usr/include/sys/_types/_ssize_t.h \ /usr/include/secure/_stdio.h /usr/include/secure/_common.h \ /usr/include/string.h /usr/include/sys/_types/_rsize_t.h \ /usr/include/sys/_types/_errno_t.h /usr/include/strings.h \ /usr/include/secure/_string.h /usr/include/ctype.h \ /usr/include/runetype.h /usr/include/sys/_types/_wint_t.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.0/include/limits.h \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/i386/limits.h /usr/include/i386/_limits.h \ /usr/include/sys/syslimits.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.0/include/float.h \ /usr/include/math.h /usr/include/poll.h /usr/include/sys/poll.h \ /usr/include/errno.h /usr/include/sys/errno.h /usr/include/sys/types.h \ /usr/include/sys/_types/_blkcnt_t.h \ /usr/include/sys/_types/_blksize_t.h /usr/include/sys/_types/_gid_t.h \ /usr/include/sys/_types/_in_addr_t.h \ /usr/include/sys/_types/_in_port_t.h /usr/include/sys/_types/_ino_t.h \ /usr/include/sys/_types/_ino64_t.h /usr/include/sys/_types/_key_t.h \ /usr/include/sys/_types/_nlink_t.h \ /usr/include/sys/_types/_useconds_t.h \ /usr/include/sys/_types/_suseconds_t.h \ /usr/include/sys/_types/_fd_def.h \ /usr/include/sys/_types/_fd_setsize.h \ /usr/include/sys/_types/_fd_set.h /usr/include/sys/_types/_fd_clr.h \ /usr/include/sys/_types/_fd_zero.h /usr/include/sys/_types/_fd_isset.h \ /usr/include/sys/_types/_fd_copy.h \ /usr/include/sys/_types/_pthread_cond_t.h \ /usr/include/sys/_types/_pthread_condattr_t.h \ /usr/include/sys/_types/_pthread_mutex_t.h \ /usr/include/sys/_types/_pthread_mutexattr_t.h \ /usr/include/sys/_types/_pthread_once_t.h \ /usr/include/sys/_types/_pthread_rwlock_t.h \ /usr/include/sys/_types/_pthread_rwlockattr_t.h \ /usr/include/sys/_types/_pthread_t.h \ /usr/include/sys/_types/_pthread_key_t.h \ /usr/include/sys/_types/_fsblkcnt_t.h \ /usr/include/sys/_types/_fsfilcnt_t.h /usr/include/sys/timeb.h \ /usr/include/sys/socket.h /usr/include/machine/_param.h \ /usr/include/i386/_param.h /usr/include/sys/_types/_sa_family_t.h \ /usr/include/sys/_types/_socklen_t.h \ /usr/include/sys/_types/_iovec_t.h /usr/include/sys/time.h \ /usr/include/sys/_select.h /usr/include/netinet/in.h \ /usr/include/netinet6/in6.h /usr/include/netinet/tcp.h \ /usr/include/arpa/inet.h /usr/include/netdb.h /usr/include/unistd.h \ /usr/include/sys/unistd.h /usr/include/sys/_types/_posix_vdisable.h \ /usr/include/sys/_types/_seek_set.h /usr/include/sys/select.h \ /usr/include/sys/_types/_uuid_t.h /usr/include/gethostuuid.h \ /usr/include/fcntl.h /usr/include/sys/fcntl.h \ /usr/include/sys/_types/_o_sync.h /usr/include/sys/_types/_o_dsync.h \ /usr/include/sys/_types/_s_ifmt.h /usr/include/sys/_types/_filesec_t.h \ /usr/include/inttypes.h soapH.h: soapStub.h: /usr/include/time.h: /usr/include/_types.h: /usr/include/sys/_types.h: /usr/include/sys/cdefs.h: /usr/include/sys/_symbol_aliasing.h: /usr/include/sys/_posix_availability.h: /usr/include/machine/_types.h: /usr/include/i386/_types.h: /usr/include/_structs.h: /usr/include/sys/_structs.h: /usr/include/sys/_types/_timespec.h: /usr/include/sys/_types/_null.h: /usr/include/sys/_types/_clock_t.h: /usr/include/sys/_types/_size_t.h: /usr/include/sys/_types/_time_t.h: ../../../gsoap/stdsoap2.h: ../../../config.h: /usr/include/stdlib.h: /usr/include/Availability.h: /usr/include/AvailabilityInternal.h: /usr/include/sys/wait.h: /usr/include/sys/_types/_pid_t.h: /usr/include/sys/_types/_id_t.h: /usr/include/sys/signal.h: /usr/include/sys/appleapiopts.h: /usr/include/machine/signal.h: /usr/include/i386/signal.h: /usr/include/machine/_mcontext.h: /usr/include/i386/_mcontext.h: /usr/include/mach/i386/_structs.h: /usr/include/sys/_types/_sigaltstack.h: /usr/include/sys/_types/_ucontext.h: /usr/include/sys/_types/_pthread_attr_t.h: /usr/include/sys/_types/_sigset_t.h: /usr/include/sys/_types/_uid_t.h: /usr/include/sys/resource.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.0/include/stdint.h: /usr/include/stdint.h: /usr/include/sys/_types/_int8_t.h: /usr/include/sys/_types/_int16_t.h: /usr/include/sys/_types/_int32_t.h: /usr/include/sys/_types/_int64_t.h: /usr/include/_types/_uint8_t.h: /usr/include/_types/_uint16_t.h: /usr/include/_types/_uint32_t.h: /usr/include/_types/_uint64_t.h: /usr/include/sys/_types/_intptr_t.h: /usr/include/sys/_types/_uintptr_t.h: /usr/include/_types/_intmax_t.h: /usr/include/_types/_uintmax_t.h: /usr/include/sys/_types/_timeval.h: /usr/include/machine/endian.h: /usr/include/i386/endian.h: /usr/include/sys/_endian.h: /usr/include/libkern/_OSByteOrder.h: /usr/include/libkern/i386/_OSByteOrder.h: /usr/include/alloca.h: /usr/include/sys/_types/_ct_rune_t.h: /usr/include/sys/_types/_rune_t.h: /usr/include/sys/_types/_wchar_t.h: /usr/include/machine/types.h: /usr/include/i386/types.h: /usr/include/sys/_types/___offsetof.h: /usr/include/sys/_types/_dev_t.h: /usr/include/sys/_types/_mode_t.h: /usr/include/stdio.h: /usr/include/sys/_types/_va_list.h: /usr/include/sys/_types/_off_t.h: /usr/include/sys/_types/_ssize_t.h: /usr/include/secure/_stdio.h: /usr/include/secure/_common.h: /usr/include/string.h: /usr/include/sys/_types/_rsize_t.h: /usr/include/sys/_types/_errno_t.h: /usr/include/strings.h: /usr/include/secure/_string.h: /usr/include/ctype.h: /usr/include/runetype.h: /usr/include/sys/_types/_wint_t.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.0/include/limits.h: /usr/include/limits.h: /usr/include/machine/limits.h: /usr/include/i386/limits.h: /usr/include/i386/_limits.h: /usr/include/sys/syslimits.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.0/include/float.h: /usr/include/math.h: /usr/include/poll.h: /usr/include/sys/poll.h: /usr/include/errno.h: /usr/include/sys/errno.h: /usr/include/sys/types.h: /usr/include/sys/_types/_blkcnt_t.h: /usr/include/sys/_types/_blksize_t.h: /usr/include/sys/_types/_gid_t.h: /usr/include/sys/_types/_in_addr_t.h: /usr/include/sys/_types/_in_port_t.h: /usr/include/sys/_types/_ino_t.h: /usr/include/sys/_types/_ino64_t.h: /usr/include/sys/_types/_key_t.h: /usr/include/sys/_types/_nlink_t.h: /usr/include/sys/_types/_useconds_t.h: /usr/include/sys/_types/_suseconds_t.h: /usr/include/sys/_types/_fd_def.h: /usr/include/sys/_types/_fd_setsize.h: /usr/include/sys/_types/_fd_set.h: /usr/include/sys/_types/_fd_clr.h: /usr/include/sys/_types/_fd_zero.h: /usr/include/sys/_types/_fd_isset.h: /usr/include/sys/_types/_fd_copy.h: /usr/include/sys/_types/_pthread_cond_t.h: /usr/include/sys/_types/_pthread_condattr_t.h: /usr/include/sys/_types/_pthread_mutex_t.h: /usr/include/sys/_types/_pthread_mutexattr_t.h: /usr/include/sys/_types/_pthread_once_t.h: /usr/include/sys/_types/_pthread_rwlock_t.h: /usr/include/sys/_types/_pthread_rwlockattr_t.h: /usr/include/sys/_types/_pthread_t.h: /usr/include/sys/_types/_pthread_key_t.h: /usr/include/sys/_types/_fsblkcnt_t.h: /usr/include/sys/_types/_fsfilcnt_t.h: /usr/include/sys/timeb.h: /usr/include/sys/socket.h: /usr/include/machine/_param.h: /usr/include/i386/_param.h: /usr/include/sys/_types/_sa_family_t.h: /usr/include/sys/_types/_socklen_t.h: /usr/include/sys/_types/_iovec_t.h: /usr/include/sys/time.h: /usr/include/sys/_select.h: /usr/include/netinet/in.h: /usr/include/netinet6/in6.h: /usr/include/netinet/tcp.h: /usr/include/arpa/inet.h: /usr/include/netdb.h: /usr/include/unistd.h: /usr/include/sys/unistd.h: /usr/include/sys/_types/_posix_vdisable.h: /usr/include/sys/_types/_seek_set.h: /usr/include/sys/select.h: /usr/include/sys/_types/_uuid_t.h: /usr/include/gethostuuid.h: /usr/include/fcntl.h: /usr/include/sys/fcntl.h: /usr/include/sys/_types/_o_sync.h: /usr/include/sys/_types/_o_dsync.h: /usr/include/sys/_types/_s_ifmt.h: /usr/include/sys/_types/_filesec_t.h: /usr/include/inttypes.h: gsoap-2.8.91/gsoap/samples/rest/.deps/person.Tpo0000644000175000017500000012531513525245163021036 0ustar ellertellertperson.o: person.c soapH.h soapStub.h ../../../gsoap/stdsoap2.h \ ../../../config.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/locale.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/_locale.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/cdefs.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_symbol_aliasing.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_posix_availability.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/_types.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/machine/_types.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/i386/_types.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_pthread/_pthread_types.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_null.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/xlocale.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/_xlocale.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/stdlib.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/Availability.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/AvailabilityInternal.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/wait.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_pid_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_id_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/signal.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/appleapiopts.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/machine/signal.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/i386/signal.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/machine/_mcontext.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/i386/_mcontext.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/mach/i386/_structs.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_pthread/_pthread_attr_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_sigaltstack.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_ucontext.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_sigset_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_size_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_uid_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/resource.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.0.0/include/stdint.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/stdint.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_int8_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_int16_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_int32_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_int64_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/_types/_uint8_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/_types/_uint16_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/_types/_uint32_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/_types/_uint64_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_intptr_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_uintptr_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/_types/_intmax_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/_types/_uintmax_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_timeval.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/machine/endian.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/i386/endian.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_endian.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/libkern/_OSByteOrder.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/libkern/i386/_OSByteOrder.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/alloca.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_ct_rune_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_rune_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_wchar_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/machine/types.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/i386/types.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_u_int8_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_u_int16_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_u_int32_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_u_int64_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_dev_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_mode_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/xlocale/_stdlib.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/stdio.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_va_list.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/stdio.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_off_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_ssize_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/xlocale/_stdio.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/secure/_stdio.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/secure/_common.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/string.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_rsize_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_errno_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/strings.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/xlocale/_string.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/secure/_string.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/ctype.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/runetype.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_wint_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/xlocale/_ctype.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.0.0/include/limits.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/limits.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/machine/limits.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/i386/limits.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/i386/_limits.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/syslimits.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.0.0/include/float.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/math.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/poll.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/poll.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/errno.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/errno.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/types.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_blkcnt_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_blksize_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_gid_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_in_addr_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_in_port_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_ino_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_ino64_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_key_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_nlink_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_clock_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_time_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_useconds_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_suseconds_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_fd_def.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_fd_setsize.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_fd_set.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_fd_clr.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_fd_zero.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_fd_isset.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_fd_copy.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_pthread/_pthread_cond_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_pthread/_pthread_condattr_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_pthread/_pthread_mutex_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_pthread/_pthread_mutexattr_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_pthread/_pthread_once_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_pthread/_pthread_rwlock_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_pthread/_pthread_rwlockattr_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_pthread/_pthread_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_pthread/_pthread_key_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_fsblkcnt_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_fsfilcnt_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/timeb.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/time.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_timespec.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/xlocale/_time.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/socket.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/machine/_param.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/i386/_param.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/net/net_kev.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_sa_family_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_socklen_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_iovec_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/time.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_timeval64.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_select.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/netinet/in.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/netinet6/in6.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/netinet/tcp.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/arpa/inet.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/netdb.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/unistd.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/unistd.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_posix_vdisable.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_seek_set.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/select.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_uuid_t.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/gethostuuid.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/fcntl.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/fcntl.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_o_sync.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_o_dsync.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_s_ifmt.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_filesec_t.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.0.0/include/inttypes.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/inttypes.h \ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/xlocale/_inttypes.h \ soap.nsmap soapH.h: soapStub.h: ../../../gsoap/stdsoap2.h: ../../../config.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/locale.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/_locale.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/cdefs.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_symbol_aliasing.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_posix_availability.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/_types.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/machine/_types.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/i386/_types.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_pthread/_pthread_types.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_null.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/xlocale.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/_xlocale.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/stdlib.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/Availability.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/AvailabilityInternal.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/wait.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_pid_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_id_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/signal.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/appleapiopts.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/machine/signal.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/i386/signal.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/machine/_mcontext.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/i386/_mcontext.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/mach/i386/_structs.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_pthread/_pthread_attr_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_sigaltstack.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_ucontext.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_sigset_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_size_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_uid_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/resource.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.0.0/include/stdint.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/stdint.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_int8_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_int16_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_int32_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_int64_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/_types/_uint8_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/_types/_uint16_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/_types/_uint32_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/_types/_uint64_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_intptr_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_uintptr_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/_types/_intmax_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/_types/_uintmax_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_timeval.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/machine/endian.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/i386/endian.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_endian.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/libkern/_OSByteOrder.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/libkern/i386/_OSByteOrder.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/alloca.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_ct_rune_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_rune_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_wchar_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/machine/types.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/i386/types.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_u_int8_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_u_int16_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_u_int32_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_u_int64_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_dev_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_mode_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/xlocale/_stdlib.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/stdio.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_va_list.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/stdio.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_off_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_ssize_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/xlocale/_stdio.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/secure/_stdio.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/secure/_common.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/string.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_rsize_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_errno_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/strings.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/xlocale/_string.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/secure/_string.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/ctype.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/runetype.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_wint_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/xlocale/_ctype.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.0.0/include/limits.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/limits.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/machine/limits.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/i386/limits.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/i386/_limits.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/syslimits.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.0.0/include/float.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/math.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/poll.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/poll.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/errno.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/errno.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/types.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_blkcnt_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_blksize_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_gid_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_in_addr_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_in_port_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_ino_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_ino64_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_key_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_nlink_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_clock_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_time_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_useconds_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_suseconds_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_fd_def.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_fd_setsize.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_fd_set.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_fd_clr.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_fd_zero.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_fd_isset.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_fd_copy.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_pthread/_pthread_cond_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_pthread/_pthread_condattr_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_pthread/_pthread_mutex_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_pthread/_pthread_mutexattr_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_pthread/_pthread_once_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_pthread/_pthread_rwlock_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_pthread/_pthread_rwlockattr_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_pthread/_pthread_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_pthread/_pthread_key_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_fsblkcnt_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_fsfilcnt_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/timeb.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/time.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_timespec.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/xlocale/_time.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/socket.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/machine/_param.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/i386/_param.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/net/net_kev.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_sa_family_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_socklen_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_iovec_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/time.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_timeval64.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_select.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/netinet/in.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/netinet6/in6.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/netinet/tcp.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/arpa/inet.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/netdb.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/unistd.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/unistd.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_posix_vdisable.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_seek_set.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/select.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_uuid_t.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/gethostuuid.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/fcntl.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/fcntl.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_o_sync.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_o_dsync.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_s_ifmt.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sys/_types/_filesec_t.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.0.0/include/inttypes.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/inttypes.h: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/xlocale/_inttypes.h: soap.nsmap: gsoap-2.8.91/gsoap/samples/rest/.deps/person.Po0000644000175000017500000002464713525245163020660 0ustar ellertellertperson.o: person.c soapH.h soapStub.h /usr/include/time.h \ /usr/include/_types.h /usr/include/sys/_types.h \ /usr/include/sys/cdefs.h /usr/include/sys/_symbol_aliasing.h \ /usr/include/sys/_posix_availability.h /usr/include/machine/_types.h \ /usr/include/i386/_types.h /usr/include/_structs.h \ /usr/include/sys/_structs.h /usr/include/sys/_types/_timespec.h \ /usr/include/sys/_types/_null.h /usr/include/sys/_types/_clock_t.h \ /usr/include/sys/_types/_size_t.h /usr/include/sys/_types/_time_t.h \ ../../../gsoap/stdsoap2.h ../../../config.h /usr/include/stdlib.h \ /usr/include/Availability.h /usr/include/AvailabilityInternal.h \ /usr/include/sys/wait.h /usr/include/sys/_types/_pid_t.h \ /usr/include/sys/_types/_id_t.h /usr/include/sys/signal.h \ /usr/include/sys/appleapiopts.h /usr/include/machine/signal.h \ /usr/include/i386/signal.h /usr/include/machine/_mcontext.h \ /usr/include/i386/_mcontext.h /usr/include/mach/i386/_structs.h \ /usr/include/sys/_types/_sigaltstack.h \ /usr/include/sys/_types/_ucontext.h \ /usr/include/sys/_types/_pthread_attr_t.h \ /usr/include/sys/_types/_sigset_t.h /usr/include/sys/_types/_uid_t.h \ /usr/include/sys/resource.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.0/include/stdint.h \ /usr/include/stdint.h /usr/include/sys/_types/_int8_t.h \ /usr/include/sys/_types/_int16_t.h /usr/include/sys/_types/_int32_t.h \ /usr/include/sys/_types/_int64_t.h /usr/include/_types/_uint8_t.h \ /usr/include/_types/_uint16_t.h /usr/include/_types/_uint32_t.h \ /usr/include/_types/_uint64_t.h /usr/include/sys/_types/_intptr_t.h \ /usr/include/sys/_types/_uintptr_t.h /usr/include/_types/_intmax_t.h \ /usr/include/_types/_uintmax_t.h /usr/include/sys/_types/_timeval.h \ /usr/include/machine/endian.h /usr/include/i386/endian.h \ /usr/include/sys/_endian.h /usr/include/libkern/_OSByteOrder.h \ /usr/include/libkern/i386/_OSByteOrder.h /usr/include/alloca.h \ /usr/include/sys/_types/_ct_rune_t.h /usr/include/sys/_types/_rune_t.h \ /usr/include/sys/_types/_wchar_t.h /usr/include/machine/types.h \ /usr/include/i386/types.h /usr/include/sys/_types/___offsetof.h \ /usr/include/sys/_types/_dev_t.h /usr/include/sys/_types/_mode_t.h \ /usr/include/stdio.h /usr/include/sys/_types/_va_list.h \ /usr/include/sys/_types/_off_t.h /usr/include/sys/_types/_ssize_t.h \ /usr/include/secure/_stdio.h /usr/include/secure/_common.h \ /usr/include/string.h /usr/include/sys/_types/_rsize_t.h \ /usr/include/sys/_types/_errno_t.h /usr/include/strings.h \ /usr/include/secure/_string.h /usr/include/ctype.h \ /usr/include/runetype.h /usr/include/sys/_types/_wint_t.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.0/include/limits.h \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/i386/limits.h /usr/include/i386/_limits.h \ /usr/include/sys/syslimits.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.0/include/float.h \ /usr/include/math.h /usr/include/poll.h /usr/include/sys/poll.h \ /usr/include/errno.h /usr/include/sys/errno.h /usr/include/sys/types.h \ /usr/include/sys/_types/_blkcnt_t.h \ /usr/include/sys/_types/_blksize_t.h /usr/include/sys/_types/_gid_t.h \ /usr/include/sys/_types/_in_addr_t.h \ /usr/include/sys/_types/_in_port_t.h /usr/include/sys/_types/_ino_t.h \ /usr/include/sys/_types/_ino64_t.h /usr/include/sys/_types/_key_t.h \ /usr/include/sys/_types/_nlink_t.h \ /usr/include/sys/_types/_useconds_t.h \ /usr/include/sys/_types/_suseconds_t.h \ /usr/include/sys/_types/_fd_def.h \ /usr/include/sys/_types/_fd_setsize.h \ /usr/include/sys/_types/_fd_set.h /usr/include/sys/_types/_fd_clr.h \ /usr/include/sys/_types/_fd_zero.h /usr/include/sys/_types/_fd_isset.h \ /usr/include/sys/_types/_fd_copy.h \ /usr/include/sys/_types/_pthread_cond_t.h \ /usr/include/sys/_types/_pthread_condattr_t.h \ /usr/include/sys/_types/_pthread_mutex_t.h \ /usr/include/sys/_types/_pthread_mutexattr_t.h \ /usr/include/sys/_types/_pthread_once_t.h \ /usr/include/sys/_types/_pthread_rwlock_t.h \ /usr/include/sys/_types/_pthread_rwlockattr_t.h \ /usr/include/sys/_types/_pthread_t.h \ /usr/include/sys/_types/_pthread_key_t.h \ /usr/include/sys/_types/_fsblkcnt_t.h \ /usr/include/sys/_types/_fsfilcnt_t.h /usr/include/sys/timeb.h \ /usr/include/sys/socket.h /usr/include/machine/_param.h \ /usr/include/i386/_param.h /usr/include/sys/_types/_sa_family_t.h \ /usr/include/sys/_types/_socklen_t.h \ /usr/include/sys/_types/_iovec_t.h /usr/include/sys/time.h \ /usr/include/sys/_select.h /usr/include/netinet/in.h \ /usr/include/netinet6/in6.h /usr/include/netinet/tcp.h \ /usr/include/arpa/inet.h /usr/include/netdb.h /usr/include/unistd.h \ /usr/include/sys/unistd.h /usr/include/sys/_types/_posix_vdisable.h \ /usr/include/sys/_types/_seek_set.h /usr/include/sys/select.h \ /usr/include/sys/_types/_uuid_t.h /usr/include/gethostuuid.h \ /usr/include/fcntl.h /usr/include/sys/fcntl.h \ /usr/include/sys/_types/_o_sync.h /usr/include/sys/_types/_o_dsync.h \ /usr/include/sys/_types/_s_ifmt.h /usr/include/sys/_types/_filesec_t.h \ /usr/include/inttypes.h soap.nsmap soapH.h: soapStub.h: /usr/include/time.h: /usr/include/_types.h: /usr/include/sys/_types.h: /usr/include/sys/cdefs.h: /usr/include/sys/_symbol_aliasing.h: /usr/include/sys/_posix_availability.h: /usr/include/machine/_types.h: /usr/include/i386/_types.h: /usr/include/_structs.h: /usr/include/sys/_structs.h: /usr/include/sys/_types/_timespec.h: /usr/include/sys/_types/_null.h: /usr/include/sys/_types/_clock_t.h: /usr/include/sys/_types/_size_t.h: /usr/include/sys/_types/_time_t.h: ../../../gsoap/stdsoap2.h: ../../../config.h: /usr/include/stdlib.h: /usr/include/Availability.h: /usr/include/AvailabilityInternal.h: /usr/include/sys/wait.h: /usr/include/sys/_types/_pid_t.h: /usr/include/sys/_types/_id_t.h: /usr/include/sys/signal.h: /usr/include/sys/appleapiopts.h: /usr/include/machine/signal.h: /usr/include/i386/signal.h: /usr/include/machine/_mcontext.h: /usr/include/i386/_mcontext.h: /usr/include/mach/i386/_structs.h: /usr/include/sys/_types/_sigaltstack.h: /usr/include/sys/_types/_ucontext.h: /usr/include/sys/_types/_pthread_attr_t.h: /usr/include/sys/_types/_sigset_t.h: /usr/include/sys/_types/_uid_t.h: /usr/include/sys/resource.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.0/include/stdint.h: /usr/include/stdint.h: /usr/include/sys/_types/_int8_t.h: /usr/include/sys/_types/_int16_t.h: /usr/include/sys/_types/_int32_t.h: /usr/include/sys/_types/_int64_t.h: /usr/include/_types/_uint8_t.h: /usr/include/_types/_uint16_t.h: /usr/include/_types/_uint32_t.h: /usr/include/_types/_uint64_t.h: /usr/include/sys/_types/_intptr_t.h: /usr/include/sys/_types/_uintptr_t.h: /usr/include/_types/_intmax_t.h: /usr/include/_types/_uintmax_t.h: /usr/include/sys/_types/_timeval.h: /usr/include/machine/endian.h: /usr/include/i386/endian.h: /usr/include/sys/_endian.h: /usr/include/libkern/_OSByteOrder.h: /usr/include/libkern/i386/_OSByteOrder.h: /usr/include/alloca.h: /usr/include/sys/_types/_ct_rune_t.h: /usr/include/sys/_types/_rune_t.h: /usr/include/sys/_types/_wchar_t.h: /usr/include/machine/types.h: /usr/include/i386/types.h: /usr/include/sys/_types/___offsetof.h: /usr/include/sys/_types/_dev_t.h: /usr/include/sys/_types/_mode_t.h: /usr/include/stdio.h: /usr/include/sys/_types/_va_list.h: /usr/include/sys/_types/_off_t.h: /usr/include/sys/_types/_ssize_t.h: /usr/include/secure/_stdio.h: /usr/include/secure/_common.h: /usr/include/string.h: /usr/include/sys/_types/_rsize_t.h: /usr/include/sys/_types/_errno_t.h: /usr/include/strings.h: /usr/include/secure/_string.h: /usr/include/ctype.h: /usr/include/runetype.h: /usr/include/sys/_types/_wint_t.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.0/include/limits.h: /usr/include/limits.h: /usr/include/machine/limits.h: /usr/include/i386/limits.h: /usr/include/i386/_limits.h: /usr/include/sys/syslimits.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.0/include/float.h: /usr/include/math.h: /usr/include/poll.h: /usr/include/sys/poll.h: /usr/include/errno.h: /usr/include/sys/errno.h: /usr/include/sys/types.h: /usr/include/sys/_types/_blkcnt_t.h: /usr/include/sys/_types/_blksize_t.h: /usr/include/sys/_types/_gid_t.h: /usr/include/sys/_types/_in_addr_t.h: /usr/include/sys/_types/_in_port_t.h: /usr/include/sys/_types/_ino_t.h: /usr/include/sys/_types/_ino64_t.h: /usr/include/sys/_types/_key_t.h: /usr/include/sys/_types/_nlink_t.h: /usr/include/sys/_types/_useconds_t.h: /usr/include/sys/_types/_suseconds_t.h: /usr/include/sys/_types/_fd_def.h: /usr/include/sys/_types/_fd_setsize.h: /usr/include/sys/_types/_fd_set.h: /usr/include/sys/_types/_fd_clr.h: /usr/include/sys/_types/_fd_zero.h: /usr/include/sys/_types/_fd_isset.h: /usr/include/sys/_types/_fd_copy.h: /usr/include/sys/_types/_pthread_cond_t.h: /usr/include/sys/_types/_pthread_condattr_t.h: /usr/include/sys/_types/_pthread_mutex_t.h: /usr/include/sys/_types/_pthread_mutexattr_t.h: /usr/include/sys/_types/_pthread_once_t.h: /usr/include/sys/_types/_pthread_rwlock_t.h: /usr/include/sys/_types/_pthread_rwlockattr_t.h: /usr/include/sys/_types/_pthread_t.h: /usr/include/sys/_types/_pthread_key_t.h: /usr/include/sys/_types/_fsblkcnt_t.h: /usr/include/sys/_types/_fsfilcnt_t.h: /usr/include/sys/timeb.h: /usr/include/sys/socket.h: /usr/include/machine/_param.h: /usr/include/i386/_param.h: /usr/include/sys/_types/_sa_family_t.h: /usr/include/sys/_types/_socklen_t.h: /usr/include/sys/_types/_iovec_t.h: /usr/include/sys/time.h: /usr/include/sys/_select.h: /usr/include/netinet/in.h: /usr/include/netinet6/in6.h: /usr/include/netinet/tcp.h: /usr/include/arpa/inet.h: /usr/include/netdb.h: /usr/include/unistd.h: /usr/include/sys/unistd.h: /usr/include/sys/_types/_posix_vdisable.h: /usr/include/sys/_types/_seek_set.h: /usr/include/sys/select.h: /usr/include/sys/_types/_uuid_t.h: /usr/include/gethostuuid.h: /usr/include/fcntl.h: /usr/include/sys/fcntl.h: /usr/include/sys/_types/_o_sync.h: /usr/include/sys/_types/_o_dsync.h: /usr/include/sys/_types/_s_ifmt.h: /usr/include/sys/_types/_filesec_t.h: /usr/include/inttypes.h: soap.nsmap: gsoap-2.8.91/gsoap/samples/rest/Makefile.in0000644000175000017500000006163713525245163020106 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = calcrest$(EXEEXT) httpgettest$(EXEEXT) \ httpposttest$(EXEEXT) subdir = gsoap/samples/rest ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = soapC.$(OBJEXT) am__objects_2 = soapClient.$(OBJEXT) $(am__objects_1) am__objects_3 = am__objects_4 = $(am__objects_3) am__objects_5 = $(am__objects_2) soapServer.$(OBJEXT) $(am__objects_3) \ $(am__objects_4) am_calcrest_OBJECTS = calcrest.$(OBJEXT) $(am__objects_5) calcrest_OBJECTS = $(am_calcrest_OBJECTS) calcrest_LDADD = $(LDADD) am__DEPENDENCIES_1 = calcrest_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) am_httpgettest_OBJECTS = httpgettest.$(OBJEXT) $(am__objects_1) \ httpget.$(OBJEXT) httpgettest_OBJECTS = $(am_httpgettest_OBJECTS) httpgettest_LDADD = $(LDADD) httpgettest_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) am__objects_6 = soapServer.$(OBJEXT) $(am__objects_1) am_httpposttest_OBJECTS = httpposttest.$(OBJEXT) $(am__objects_6) \ httppost.$(OBJEXT) httpposttest_OBJECTS = $(am_httpposttest_OBJECTS) httpposttest_LDADD = $(LDADD) httpposttest_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/calcrest.Po ./$(DEPDIR)/httpget.Po \ ./$(DEPDIR)/httpgettest.Po ./$(DEPDIR)/httppost.Po \ ./$(DEPDIR)/httpposttest.Po ./$(DEPDIR)/soapC.Po \ ./$(DEPDIR)/soapClient.Po ./$(DEPDIR)/soapServer.Po am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(calcrest_SOURCES) $(httpgettest_SOURCES) \ $(httpposttest_SOURCES) DIST_SOURCES = $(calcrest_SOURCES) $(httpgettest_SOURCES) \ $(httpposttest_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.c_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = foreign 1.4 SOAPHEADER = calcrest.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = $(SOAP_NS_DEF) calcrest_SOURCES = calcrest.c calcrest.h $(SOAP_C_SRC) httpgettest_SOURCES = httpgettest.c httpgettest.h $(SOAP_C_CORE) ../../plugin/httpget.c httpposttest_SOURCES = httpposttest.c httpposttest.h $(SOAP_C_SERVER) ../../plugin/httppost.c all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/rest/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/rest/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) calcrest$(EXEEXT): $(calcrest_OBJECTS) $(calcrest_DEPENDENCIES) $(EXTRA_calcrest_DEPENDENCIES) @rm -f calcrest$(EXEEXT) $(AM_V_CCLD)$(LINK) $(calcrest_OBJECTS) $(calcrest_LDADD) $(LIBS) httpgettest$(EXEEXT): $(httpgettest_OBJECTS) $(httpgettest_DEPENDENCIES) $(EXTRA_httpgettest_DEPENDENCIES) @rm -f httpgettest$(EXEEXT) $(AM_V_CCLD)$(LINK) $(httpgettest_OBJECTS) $(httpgettest_LDADD) $(LIBS) httpposttest$(EXEEXT): $(httpposttest_OBJECTS) $(httpposttest_DEPENDENCIES) $(EXTRA_httpposttest_DEPENDENCIES) @rm -f httpposttest$(EXEEXT) $(AM_V_CCLD)$(LINK) $(httpposttest_OBJECTS) $(httpposttest_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/calcrest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/httpget.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/httpgettest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/httppost.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/httpposttest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` httpget.o: ../../plugin/httpget.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT httpget.o -MD -MP -MF $(DEPDIR)/httpget.Tpo -c -o httpget.o `test -f '../../plugin/httpget.c' || echo '$(srcdir)/'`../../plugin/httpget.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/httpget.Tpo $(DEPDIR)/httpget.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/httpget.c' object='httpget.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o httpget.o `test -f '../../plugin/httpget.c' || echo '$(srcdir)/'`../../plugin/httpget.c httpget.obj: ../../plugin/httpget.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT httpget.obj -MD -MP -MF $(DEPDIR)/httpget.Tpo -c -o httpget.obj `if test -f '../../plugin/httpget.c'; then $(CYGPATH_W) '../../plugin/httpget.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/httpget.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/httpget.Tpo $(DEPDIR)/httpget.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/httpget.c' object='httpget.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o httpget.obj `if test -f '../../plugin/httpget.c'; then $(CYGPATH_W) '../../plugin/httpget.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/httpget.c'; fi` httppost.o: ../../plugin/httppost.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT httppost.o -MD -MP -MF $(DEPDIR)/httppost.Tpo -c -o httppost.o `test -f '../../plugin/httppost.c' || echo '$(srcdir)/'`../../plugin/httppost.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/httppost.Tpo $(DEPDIR)/httppost.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/httppost.c' object='httppost.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o httppost.o `test -f '../../plugin/httppost.c' || echo '$(srcdir)/'`../../plugin/httppost.c httppost.obj: ../../plugin/httppost.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT httppost.obj -MD -MP -MF $(DEPDIR)/httppost.Tpo -c -o httppost.obj `if test -f '../../plugin/httppost.c'; then $(CYGPATH_W) '../../plugin/httppost.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/httppost.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/httppost.Tpo $(DEPDIR)/httppost.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/httppost.c' object='httppost.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o httppost.obj `if test -f '../../plugin/httppost.c'; then $(CYGPATH_W) '../../plugin/httppost.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/httppost.c'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/calcrest.Po -rm -f ./$(DEPDIR)/httpget.Po -rm -f ./$(DEPDIR)/httpgettest.Po -rm -f ./$(DEPDIR)/httppost.Po -rm -f ./$(DEPDIR)/httpposttest.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/calcrest.Po -rm -f ./$(DEPDIR)/httpget.Po -rm -f ./$(DEPDIR)/httpgettest.Po -rm -f ./$(DEPDIR)/httppost.Po -rm -f ./$(DEPDIR)/httpposttest.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/rest/calcrest.h0000644000175000017500000006133013525245163020000 0ustar ellertellert/* calcrest.h Generated by wsdl2h 2.8.37 from calcrest.wsdl and typemap.dat 2016-11-11 18:13:09 GMT DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS USE THE soapcpp2-GENERATED SOURCE CODE FILES FOR YOUR PROJECT BUILDS gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. 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 -------------------------------------------------------------------------------- */ /** @page page_notes Notes @note HINTS: - Run soapcpp2 on calcrest.h to generate the SOAP/XML processing logic. Use soapcpp2 -I to specify paths for #import To build with STL, 'stl.h' is imported from 'import' dir in package. Use soapcpp2 -j to generate improved proxy and server classes. Use soapcpp2 -r to generate a report. - Use wsdl2h -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. - Run Doxygen (www.doxygen.org) on this file to generate documentation. - Use wsdl2h -R to generate REST operations. - Use wsdl2h -nname to use name as the base namespace prefix instead of 'ns'. - Use wsdl2h -Nname for service prefix and produce multiple service bindings - Use wsdl2h -d to enable DOM support for xsd:anyType. - Use wsdl2h -g to auto-generate readers and writers for root elements. - Use wsdl2h -b to auto-generate bi-directional operations (duplex ops). - Use wsdl2h -U to map XML names to C++ Unicode identifiers instead of _xNNNN. - Use wsdl2h -u to disable the generation of unions. - Struct/class members serialized as XML attributes are annotated with a '@'. - Struct/class members that have a special role are annotated with a '$'. @warning DO NOT INCLUDE THIS ANNOTATED FILE DIRECTLY IN YOUR PROJECT SOURCE CODE. USE THE FILES GENERATED BY soapcpp2 FOR YOUR PROJECT'S SOURCE CODE: THE soapStub.h FILE CONTAINS THIS CONTENT WITHOUT ANNOTATIONS. @copyright LICENSE: @verbatim -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. The wsdl2h tool and its generated software are released under the GPL. This software is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- @endverbatim */ //gsoapopt c,w /******************************************************************************\ * * * Definitions * * http://websrv.cs.fsu.edu/~engelen/calc.wsdl * * * \******************************************************************************/ /******************************************************************************\ * * * 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: ns1 = "http://websrv.cs.fsu.edu/~engelen/calc.wsdl" ns2 = "urn:calc" */ #define SOAP_NAMESPACE_OF_ns2 "urn:calc" //gsoap ns2 schema namespace: urn:calc //gsoap ns2 schema form: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * urn:calc * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * urn:calc * * * \******************************************************************************/ /// @brief "urn:calc":pair is a complexType. /// /// struct ns2__pair operations: /// - ns2__pair* soap_new_ns2__pair(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_ns2__pair(struct soap*, ns2__pair*) default initialize members /// - int soap_read_ns2__pair(struct soap*, ns2__pair*) deserialize from a source /// - int soap_write_ns2__pair(struct soap*, ns2__pair*) serialize to a sink /// - ns2__pair* soap_dup_ns2__pair(struct soap*, ns2__pair* dst, ns2__pair *src) returns deep copy of ns2__pair src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_ns2__pair(ns2__pair*) deep deletes ns2__pair data members, use only on dst after soap_dup_ns2__pair(NULL, ns2__pair *dst, ns2__pair *src) (use soapcpp2 -Ed) struct ns2__pair { /// Element "a" of XSD type xs:double. double a 1; ///< Required element. /// Element "b" of XSD type xs:double. double b 1; ///< Required element. }; /******************************************************************************\ * * * Additional Top-Level Elements * * urn:calc * * * \******************************************************************************/ /// @brief Top-level root element "urn:calc":add of XSD type "urn:calc":pair. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:calc":sub of XSD type "urn:calc":pair. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:calc":mul of XSD type "urn:calc":pair. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:calc":div of XSD type "urn:calc":pair. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:calc":pow of XSD type "urn:calc":pair. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:calc":addResponse of XSD type xs:double. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:calc":subResponse of XSD type xs:double. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:calc":mulResponse of XSD type xs:double. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:calc":divResponse of XSD type xs:double. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:calc":powResponse of XSD type xs:double. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /******************************************************************************\ * * * Additional Top-Level Attributes * * urn:calc * * * \******************************************************************************/ /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap ns1 service name: calcPOST //gsoap ns1 service type: calcPortType //gsoap ns1 service port: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns1 service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl /** @mainpage calcPOST Definitions @section calcPOST_bindings Service Bindings - @ref calcPOST @section calcPOST_more More Information - @ref page_notes "Notes" - @ref page_XMLDataBinding "XML Data Binding" - @ref SOAP_ENV__Header "SOAP Header Content" (when applicable) - @ref SOAP_ENV__Detail "SOAP Fault Detail Content" (when applicable) */ /** @page calcPOST Binding "calcPOST" @section calcPOST_operations Operations of Binding "calcPOST" - @ref __ns1__add - @ref __ns1__sub - @ref __ns1__mul - @ref __ns1__div - @ref __ns1__pow @section calcPOST_ports Default endpoints of Binding "calcPOST" - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi @note Use wsdl2h option -Nname to change the service binding prefix name */ /******************************************************************************\ * * * Service Binding * * calcPOST * * * \******************************************************************************/ /******************************************************************************\ * * * Service Operation * * __ns1__add * * * \******************************************************************************/ /** Operation "__ns1__add" of service binding "calcPOST". - POST document/literal style messaging - Default endpoints: - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi - Addressing input action: "" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__add( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: struct ns2__pair* ns2__add, // output parameters: double *ns2__addResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__add( struct soap *soap, // input parameters: struct ns2__pair* ns2__add, // output parameters: double *ns2__addResponse ); @endcode */ //gsoap ns1 service method-protocol: add POST //gsoap ns1 service method-style: add document //gsoap ns1 service method-encoding: add literal //gsoap ns1 service method-action: add "" int __ns1__add( struct ns2__pair* ns2__add, ///< Input parameter double *ns2__addResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __ns1__sub * * * \******************************************************************************/ /** Operation "__ns1__sub" of service binding "calcPOST". - POST document/literal style messaging - Default endpoints: - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi - Addressing input action: "" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__sub( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: struct ns2__pair* ns2__sub, // output parameters: double *ns2__subResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__sub( struct soap *soap, // input parameters: struct ns2__pair* ns2__sub, // output parameters: double *ns2__subResponse ); @endcode */ //gsoap ns1 service method-protocol: sub POST //gsoap ns1 service method-style: sub document //gsoap ns1 service method-encoding: sub literal //gsoap ns1 service method-action: sub "" int __ns1__sub( struct ns2__pair* ns2__sub, ///< Input parameter double *ns2__subResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __ns1__mul * * * \******************************************************************************/ /** Operation "__ns1__mul" of service binding "calcPOST". - POST document/literal style messaging - Default endpoints: - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi - Addressing input action: "" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__mul( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: struct ns2__pair* ns2__mul, // output parameters: double *ns2__mulResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__mul( struct soap *soap, // input parameters: struct ns2__pair* ns2__mul, // output parameters: double *ns2__mulResponse ); @endcode */ //gsoap ns1 service method-protocol: mul POST //gsoap ns1 service method-style: mul document //gsoap ns1 service method-encoding: mul literal //gsoap ns1 service method-action: mul "" int __ns1__mul( struct ns2__pair* ns2__mul, ///< Input parameter double *ns2__mulResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __ns1__div * * * \******************************************************************************/ /** Operation "__ns1__div" of service binding "calcPOST". - POST document/literal style messaging - Default endpoints: - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi - Addressing input action: "" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__div( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: struct ns2__pair* ns2__div, // output parameters: double *ns2__divResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__div( struct soap *soap, // input parameters: struct ns2__pair* ns2__div, // output parameters: double *ns2__divResponse ); @endcode */ //gsoap ns1 service method-protocol: div POST //gsoap ns1 service method-style: div document //gsoap ns1 service method-encoding: div literal //gsoap ns1 service method-action: div "" int __ns1__div( struct ns2__pair* ns2__div, ///< Input parameter double *ns2__divResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __ns1__pow * * * \******************************************************************************/ /** Operation "__ns1__pow" of service binding "calcPOST". - POST document/literal style messaging - Default endpoints: - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi - Addressing input action: "" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__pow( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: struct ns2__pair* ns2__pow, // output parameters: double *ns2__powResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__pow( struct soap *soap, // input parameters: struct ns2__pair* ns2__pow, // output parameters: double *ns2__powResponse ); @endcode */ //gsoap ns1 service method-protocol: pow POST //gsoap ns1 service method-style: pow document //gsoap ns1 service method-encoding: pow literal //gsoap ns1 service method-action: pow "" int __ns1__pow( struct ns2__pair* ns2__pow, ///< Input parameter double *ns2__powResponse ///< Output parameter ); /** @page calcPOST Binding "calcPOST" @section calcPOST_policy_enablers Policy Enablers of Binding "calcPOST" None specified. */ /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. Data can be read and deserialized from: - an int file descriptor, using soap->recvfd = fd - a socket, using soap->socket = (int)... - a C++ stream (istream, stringstream), using soap->is = (istream*)... - a C string, using soap->is = (const char*)... - any input, using the soap->frecv() callback Data can be serialized and written to: - an int file descriptor, using soap->sendfd = (int)... - a socket, using soap->socket = (int)... - a C++ stream (ostream, stringstream), using soap->os = (ostream*)... - a C string, using soap->os = (const char**)... - any output, using the soap->fsend() callback The following options are available for (de)serialization control: - soap->encodingStyle = NULL; to remove SOAP 1.1/1.2 encodingStyle - soap_mode(soap, SOAP_XML_TREE); XML without id-ref (no cycles!) - soap_mode(soap, SOAP_XML_GRAPH); XML with id-ref (including cycles) - soap_set_namespaces(soap, struct Namespace *nsmap); to set xmlns bindings @section ns2 Top-level root elements of schema "urn:calc" - (use wsdl2h option -g to auto-generate type _ns2__add) - (use wsdl2h option -g to auto-generate type _ns2__sub) - (use wsdl2h option -g to auto-generate type _ns2__mul) - (use wsdl2h option -g to auto-generate type _ns2__div) - (use wsdl2h option -g to auto-generate type _ns2__pow) - (use wsdl2h option -g to auto-generate type _ns2__addResponse) - (use wsdl2h option -g to auto-generate type _ns2__subResponse) - (use wsdl2h option -g to auto-generate type _ns2__mulResponse) - (use wsdl2h option -g to auto-generate type _ns2__divResponse) - (use wsdl2h option -g to auto-generate type _ns2__powResponse) */ /* End of calcrest.h */ gsoap-2.8.91/gsoap/samples/rest/httpposttest.c0000644000175000017500000001540613525245163020763 0ustar ellertellert/* httpposttest.c gSOAP HTTP POST plugin client and server example application. gSOAP XML Web services tools Copyright (C) 2000-2009, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- 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-2009, 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. -------------------------------------------------------------------------------- Compile: soapcpp2 -S -c httpposttest.h cc -Iplugin -o httpposttest httpposttest.c soapC.c soapServer.c httppost.c stdsoap2.c To support https and compression, compile with: cc -DWITH_OPENSSL -DWITH_GZIP -Iplugin -o httpposttest httpposttest.c soapC.c soapServer.c httppost.c stdsoap2.c -lssl -lcrypto -lz */ #include "soapH.h" #include "httppost.h" int jpg_post_handler(struct soap *soap); int image_post_handler(struct soap *soap); int text_post_handler(struct soap *soap); int generic_POST_handler(struct soap *soap); int generic_PUT_handler(struct soap *soap); int generic_DELETE_handler(struct soap *soap); int main(int argc, char **argv) { char *buf; size_t len; struct soap soap; soap_init(&soap); /* chunking conserves memory and is generally faster: */ soap_set_omode(&soap, SOAP_IO_CHUNK); if (argc < 2) { /* CGI server */ struct http_post_handlers handlers[] = { { "image/jpg", jpg_post_handler }, { "image/*", image_post_handler }, { "image/*;*", image_post_handler }, { "text/*", text_post_handler }, { "text/*;*", text_post_handler }, { "POST", generic_POST_handler }, { "PUT", generic_PUT_handler }, { "DELETE", generic_DELETE_handler }, { NULL } }; soap_register_plugin_arg(&soap, http_post, handlers); /* register plugin (server only) */ soap_serve(&soap); exit(0); } /* HTTP POST client */ if (soap_post_connect(&soap, argv[1], NULL, "text/html") || soap_send(&soap, "") || soap_send(&soap, argc == 2 ? "Hello" : argv[2]) || soap_send(&soap, "") || soap_end_send(&soap)) { soap_print_fault(&soap, stderr); exit(1); } /* after sending POST content, receive body (note: POST handlers should not be set for client) */ if (soap_begin_recv(&soap) || soap_http_body(&soap, &buf, &len) || soap_end_recv(&soap)) { soap_print_fault(&soap, stderr); exit(1); } soap_closesock(&soap); /* close only when not keep-alive */ printf("Received %lu bytes of type %s:\n", (unsigned long)len, soap.http_content?soap.http_content:""); soap_end(&soap); soap_done(&soap); return 0; } /* Calculator service operations */ int __ns1__add(struct soap *soap, struct ns2__pair *in, double *out) { *out = in->a + in->b; return SOAP_OK; } int __ns1__sub(struct soap *soap, struct ns2__pair *in, double *out) { *out = in->a - in->b; return SOAP_OK; } int __ns1__mul(struct soap *soap, struct ns2__pair *in, double *out) { *out = in->a * in->b; return SOAP_OK; } int __ns1__div(struct soap *soap, struct ns2__pair *in, double *out) { *out = in->a / in->b; return SOAP_OK; } int __ns1__pow(struct soap *soap, struct ns2__pair *in, double *out) { *out = pow(in->a, in->b); return SOAP_OK; } /* the jpg handler just responds with HTTP OK */ int jpg_post_handler(struct soap *soap) { char *buf; size_t len; soap_http_body(soap, &buf, &len); soap_response(soap, SOAP_OK); soap_end_send(soap); return SOAP_OK; } /* the image handler responds with HTTP OK and a text/html body */ int image_post_handler(struct soap *soap) { char *buf; size_t len; soap_http_body(soap, &buf, &len); soap_response(soap, SOAP_HTML); soap_send(soap, "Image received"); soap_end_send(soap); return SOAP_OK; } /* the text handler copies the message back */ int text_post_handler(struct soap *soap) { char *buf; size_t len; soap_http_body(soap, &buf, &len); /* use current soap->http_content from HTTP header as return HTTP type */ soap_response(soap, SOAP_FILE); soap_send_raw(soap, buf, len); soap_end_send(soap); return SOAP_OK; } /* the generic POST handler */ int generic_POST_handler(struct soap *soap) { char *buf; size_t len; soap_http_body(soap, &buf, &len); fprintf(stderr, "Generic POST accepted URL=\"%s\" content=\"%s\"\n", soap->endpoint, soap->http_content); soap_response(soap, SOAP_HTML); soap_send(soap, "Data received"); soap_end_send(soap); return SOAP_OK; } /* the generic PUT handler */ int generic_PUT_handler(struct soap *soap) { char *buf; size_t len; soap_http_body(soap, &buf, &len); fprintf(stderr, "Generic PUT accepted URL=\"%s\" content=\"%s\"\n", soap->endpoint, soap->http_content); return 202; /* HTTP Accepted */ } /* the generic DELETE handler */ int generic_DELETE_handler(struct soap *soap) { fprintf(stderr, "Generic DELETE accepted URL=\"%s\"\n", soap->endpoint); return 202; /* HTTP Accepted */ } 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}, {NULL, NULL, NULL, NULL} }; gsoap-2.8.91/gsoap/samples/rest/calcrest.c0000644000175000017500000000657213525245163020002 0ustar ellertellert/* calcrest.c Example REST calculator service client in C Compilation in C (see samples/calc/calc.h): $ wsdl2h -R -c calcrest.wsdl $ soapcpp2 calcrest.h $ cc -o calcrest calcrest.c stdsoap2.c soapC.c soapClient.c where stdsoap2.c is in the 'gsoap' directory, or use libgsoap: $ cc -o calcrest calcrest.c soapC.c soapClient.c -lgsoap -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2013, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "calcPOST.nsmap" const char server[] = "http://websrv.cs.fsu.edu/~engelen/calcrest.cgi"; /* "http://"; */ /* to test with stdin/out */ int main(int argc, char **argv) { struct soap soap; struct ns2__pair in; double out; soap_init1(&soap, SOAP_XML_INDENT); if (argc < 4) return soap_serve(&soap); /* simple CGI server over stdin/out */ in.a = strtod(argv[2], NULL); in.b = strtod(argv[3], NULL); switch (*argv[1]) { case 'a': soap_call___ns1__add(&soap, server, "", &in, &out); break; case 's': soap_call___ns1__sub(&soap, server, "", &in, &out); break; case 'm': soap_call___ns1__mul(&soap, server, "", &in, &out); break; case 'd': soap_call___ns1__div(&soap, server, "", &in, &out); break; case 'p': soap_call___ns1__pow(&soap, server, "", &in, &out); break; default: fprintf(stderr, "Unknown command\n"); exit(0); } if (soap.error) { soap_print_fault(&soap, stderr); exit(1); } else printf("result = %g\n", out); soap_destroy(&soap); soap_end(&soap); soap_done(&soap); return 0; } int __ns1__add(struct soap *soap, struct ns2__pair *in, double *out) { *out = in->a + in->b; return SOAP_OK; } int __ns1__sub(struct soap *soap, struct ns2__pair *in, double *out) { *out = in->a - in->b; return SOAP_OK; } int __ns1__mul(struct soap *soap, struct ns2__pair *in, double *out) { *out = in->a * in->b; return SOAP_OK; } int __ns1__div(struct soap *soap, struct ns2__pair *in, double *out) { *out = in->a / in->b; return SOAP_OK; } int __ns1__pow(struct soap *soap, struct ns2__pair *in, double *out) { *out = pow(in->a, in->b); return SOAP_OK; } gsoap-2.8.91/gsoap/samples/rest/httpgettest.c0000644000175000017500000000602713525245163020554 0ustar ellertellert/* httpgettest.c gSOAP HTTP GET plugin client example application. For server example usage of the HTTP GET plugin, see samples/webserver gSOAP XML Web services tools Copyright (C) 2000-2006, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- 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-2004, 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. -------------------------------------------------------------------------------- Compile: soapcpp2 -CS -c httpgettest.h cc -DWITH_NONAMESPACES -Iplugin -o httpgettest httpgettest.c soapC.c soapClient.c httpget.c stdsoap2.c To support https and compression, compile with: cc -DWITH_NONAMESPACES -DWITH_OPENSSL -DWITH_GZIP -Iplugin -o httpgettest httpgettest.c soapC.c httpget.c stdsoap2.c -lssl -lcrypto -lz */ #include "soapH.h" #include "httpget.h" int main(int argc, char **argv) { struct soap soap; char *body; if (argc < 2) { fprintf(stderr, "Usage: httpgettest URL\n"); exit(0); } soap_init(&soap); soap_register_plugin(&soap, http_get); /* register plugin */ if (soap_http_get_connect(&soap, argv[1], NULL) || soap_begin_recv(&soap)) { soap_print_fault(&soap, stderr); exit(1); } if (soap.http_content) printf("HTTP Content Type: %s\n", soap.http_content); body = soap_http_get_body(&soap, NULL); soap_end_recv(&soap); if (body) printf("HTTP Body:\n%s\n", body); soap_end(&soap); soap_done(&soap); return 0; } SOAP_NMAC struct Namespace namespaces[] = { {NULL, NULL, NULL, NULL} }; gsoap-2.8.91/gsoap/samples/rest/README.txt0000644000175000017500000002453413525245163017532 0ustar ellertellert XML REST clients ================ Every type Type with data binding name Name has the following REST operations: int soap_GET_Name(struct soap *soap, const char *URL, Type *p) int soap_PUT_Name(struct soap *soap, const char *URL, const Type *p) int soap_PATCH_Name(struct soap *soap, const char *URL, const Type *p) int soap_POST_send_Name(struct soap *soap, const char *URL, const Type *p) int soap_POST_recv_Name(struct soap *soap, Type *p) These are GET and PUT/PATCH methods to read/write a value Type in XML. The POST method has a send phase and a receive phase. After a POST send, a POST receive MUST be executed (may be with a different type). There is also a DELETE: int soap_DELETE(struct soap *soap, const char *URL) These functions return SOAP_OK or error code. XML REST client examples: person.h Person struct uses custom/struct_tm_date.h person.c GET, PUT, POST, DELETE person (C) person.cpp GET, PUT, POST, DELETE person (C++) Additional REST Examples based on WSDL ====================================== calcrest.wsdl WSDL with REST calc operations calcrest.c REST-based calculator client and CGI server in C httpgettest.h demonstrates HTTP GET hook httpgettest.c httpposttest.h demonstrates HTTP POST/PUT/PATCH/DELETE hooks httpposttest.c REST-Based Calculator ===================== Build steps: $ wsdl2h -R -c calcrest.wsdl $ soapcpp2 -0 -L calcrest.h $ cc -o calcrest calcrest.c soapC.c soapClient.c soapServer.c stdsoap2.c Example run: $ ./calcrest add 1 2 HTTP REST Hooks =============== 1. HTTP REST via hooks: server-side hooks are provided with the gSOAP engine: soap::fget(struct soap*) HTTP GET soap::fput(struct soap*) HTTP PUT soap::fpatch(struct soap*) HTTP PATCH soap::fdel(struct soap*) HTTP DELETE soap::fopt(struct soap*) HTTP OPTIONS soap::fhead(struct soap*) HTTP HEAD The function being invoked uses the soap.endpoint string to parse the URL. The hook should return SOAP_OK or HTTP error code. 2. HTTP REST via plugins: plugins are available for enhanced support for HTTP REST GET and POST/PUT/PATCH/DELETE. See below. 3. In addition, XML can be serialized and deserialized over sockets, file FD, and C++ streams. See also the wsdl2h tool output .h file section "XML Data Binding" with readers/writers API calls for the XML root elements of a schema. REST support is provided by the following plugins (plugin directory): httpget.h HTTP GET httpget.c httppost.h HTTP POST/PUT/PATCH/DELETE httppost.c httpform.h HTTP POST application/x-www-form-urlencoded httpform.c httpda.h HTTP Digest authentication (default is basic authentication) httpda.c httpmd5.h HTTP MD5 checksum httpmd5.c threads.h portable threads threads.c See also the gSOAP documentation: Section "RESTful Interface: The HTTP GET Plug-in" Section "RESTful Interface: The HTTP POST Plug-in" The web server example implements GET, POST, and HTML form operations: samples/webserver XML-RPC and JSON examples with HTTP POST: samples/xml-rpc-json HTTP GET Hooks ============== The HTTP GET plug-in allows your server to handle RESTful HTTP GET requests and at the same time still serve SOAP-based POST requests. The plug-in provides support to client applications to issue HTTP GET operations to a server. Example Client with the GET Hook -------------------------------- To get the HTTP body as a string: #include "plugin/httpget.h" // also compile and link httpget.c ... char *body = NULL; struct soap *soap = soap_new(); soap_register_plugin(soap, http_get); ... if (soap_get_connect(soap, endpoint, NULL) || soap_begin_recv(soap) || !(body = soap_get_http_body(soap)) || soap_end_recv(soap)) ... // error soap_destroy(soap); soap_end(soap); soap_free(soap); To get an XML document and deserialize it using a "reader" generated by wsdl2h and soapcpp2 from an XML schema, say with as a root element represented by the struct ns__root (or class ns__root in C++): #include "plugin/httpget.h" // also compile and link httpget.c ... struct ns__root root; struct soap *soap = soap_new(); soap_register_plugin(soap, http_get); ... soap_default_ns__root(soap, &root); if (soap_get_connect(soap, endpoint, NULL) || soap_get_ns__root(soap, &root, "root", NULL)) ... // error soap_destroy(soap); soap_end(soap); soap_free(soap); To get a JSON response and convert to C++ (see samples/xml-rpc-json): #include "plugin/httpget.h" // also compile and link httpget.c #include "json.h" // also compile and link json.cpp ... struct soap *soap = soap_new(); soap_register_plugin(soap, http_get); value val(soap); ... if (soap_get_connect(soap, endpoint, NULL) || soap_begin_recv(soap) || json_recv(soap, val) || soap_end_recv(soap)) ... // error soap_destroy(soap); soap_end(soap); soap_free(soap); Note: after the call to soap_begin_recv(soap) the soap->http_content string contains the HTTP ContentType header, which can be used to determine the HTTP body content information. Note: if binary data is to be received in a buffer, rather than a string, use: soap_http_body(soap, &buf, &len) which is available in httppost.h and httppost.c Example Server with the GET Hook -------------------------------- To extend a SOAP server with GET capability (see also samples/webserver): #include "plugin/httpget.h" // also compile and link httpget.c ... soap_serve(soap) // run server, see below ... int my_http_get_handler(struct soap *soap) { // use soap_tag_cmp() for pattern matching: if (!soap_tag_cmp(soap->path, "*.html")) { soap->http_content = "text/html"; if (soap_response(soap, SOAP_FILE) || soap_send(soap, myhtml) || soap_end_send(soap)) return soap->error; return SOAP_OK; } if (!soap_tag_cmp(soap->path, "*.xml")) { struct ns__root root; ... // populate root XML element soap->http_content = "text/xml"; if (soap_response(soap, SOAP_FILE) || soap_put_ns__root(soap, root, NULL, NULL) || soap_end_send(soap)) return soap->error; return SOAP_OK; } return 404; // HTTP Not Found } ... struct soap *soap = soap_new(); soap_register_plugin_arg(soap, http_get, my_http_get_handler); To return JSON content, use: #include "json.h" // also compile and link json.cpp ... int my_http_get_handler(struct soap *soap) { ... if (!soap_tag_cmp(soap->path, "*.json")) { value val(soap); ... // populate root XML element soap->http_content = "application/json"; if (soap_response(soap, SOAP_FILE) || json_send(soap, val) || soap_end_send(soap)) return soap->error; return SOAP_OK; } HTTP POST Hooks =============== The HTTP POST plug-in allows your server to handle RESTful HTTP POST requests and at the same time still serve SOAP-based POST requests. The plug-in also provides support for client applications to issue HTTP POST operations to a server. Example Clients with the POST Hook ---------------------------------- To send and receive data over HTTP POST, say HTML content: #include "plugin/httppost.h" // also compile and link plugin/httppost.c ... struct soap *soap = soap_new(); char *buf; size_t len; if (soap_post_connect(soap, endpoint, NULL, "text/html") || soap_send(soap, myhtml) || soap_end_send(soap)) ... // error if (soap_begin_recv(soap) || soap_http_body(soap, &buf, &len) || soap_end_recv(soap)) ... // error ... // use data in buf[0..len-1] soap_destroy(soap); soap_end(soap); soap_free(soap); To send and receive JSON over HTTP (see samples/xml-rpc-json): #include "plugin/httppost.h" // also compile and link plugin/httppost.c #include "json.h" // also compile and link json.cpp ... soap *ctx = soap_new(); value request(ctx); // now populate the 'request' data to send ... if (soap_post_connect(ctx, endpoint, NULL, "application/json") || json_send(ctx, request) || soap_end_send(ctx)) ... // error value response(ctx); if (soap_begin_recv(ctx) || json_recv(ctx, response) || soap_end_recv(ctx)) ... // error // use the 'response' data response ... // dealloc objects and temp data soap_destroy(ctx); soap_end(ctx); // make other calls etc. ... // dealloc context soap_free(ctx); Example Server with the POST Hook --------------------------------- At the server side you need to register the plugin with handlers for MIME types: #include "plugin/httppost.h" // also compile and link plugin/httppost.c ... struct http_post_handlers handlers[] = { { "image/jpg", jpg_handler }, { "image/*", image_handler }, { "image/*;*", image_handler }, { "text/*", text_handler }, { "text/*;*", text_handler }, { NULL } }; struct soap *soap = soap_new(); soap_register_plugin_arg(&soap, http_post, handlers); ... soap_serve(soap); // run server, see below ... int jpg_handler(struct soap *soap) { char *buf; size_t len; if (soap_http_body(soap, &buf, &len) || soap_response(soap, SOAP_OK) || soap_end_send(soap)) return soap->error; return SOAP_OK; } int image_handler(struct soap *soap) { char *buf; size_t len; if (soap_http_body(soap, &buf, &len) || soap_response(soap, SOAP_HTML) || soap_send(soap, "Image received") || soap_end_send(soap)) return soap->error; return SOAP_OK; } int text_handler(struct soap *soap) { char *buf; size_t len; soap_http_body(soap, &buf, &len); // set HTTP content header: soap->http_content = "text/plain"; if (soap_response(soap, SOAP_FILE) || soap_send_raw(soap, "Thanks!", 6) || soap_end_send(soap)) return soap->error; return SOAP_OK; } If you do not use soapcpp2 to generate soap_serve(), then you will need the following replacement: soap_serve(struct soap *soap) { #ifndef WITH_FASTCGI soap->keep_alive = soap->max_keep_alive + 1; #endif do { #ifndef WITH_FASTCGI if (soap->keep_alive > 0 && soap->max_keep_alive > 0) soap->keep_alive--; #endif if (soap_begin_serve(soap)) { if (soap->error >= SOAP_STOP) continue; return soap->error; } soap_closesock(soap); #ifdef WITH_FASTCGI soap_destroy(soap); soap_end(soap); } while (1); #else } while (soap->keep_alive); #endif return SOAP_OK; } gsoap-2.8.91/gsoap/samples/rest/person.h0000644000175000017500000000020113525245163017474 0ustar ellertellert#import "custom/struct_tm_date.h" struct Person { const char *name; xsd__date dob; enum Gender { MALE, FEMALE } gender; }; gsoap-2.8.91/gsoap/samples/rest/person.c0000644000175000017500000000266613525245163017510 0ustar ellertellert/* This example shows a REST PUT, GET, POST, DELETE client Uses the custom/struct_tm_date.c xsd:date serializer To run the client, first build and start the gSOAP webserver on port 8080 and make sure person.xml (in samples/webserver) is in the webserver's folder for the GET and POST operations to work. See samples/webserver. Compile with: soapcpp2 -c -0 person.h cc -o person person.c soapC.c stdsoap2.c custom/struct_tm_date.c */ #include "soapH.h" #include "soap.nsmap" int main() { struct soap *ctx = soap_new1(SOAP_XML_STRICT); struct Person p; p.name = "John Doe"; p.dob.tm_year = 66; // 1966 (year since 1900 p.dob.tm_mon = 0; // month 0..11 p.dob.tm_mday = 31 ; p.gender = MALE; printf("\nPUT\n"); if (soap_PUT_Person(ctx, "http://localhost:8080/person.xml", &p)) soap_print_fault(ctx, stderr); printf("\nGET\n"); if (soap_GET_Person(ctx, "http://localhost:8080/person.xml", &p)) soap_print_fault(ctx, stderr); else soap_write_Person(ctx, &p); // default stdout printf("\nPOST\n"); if (soap_POST_send_Person(ctx, "http://localhost:8080/person.xml", &p) || soap_POST_recv_Person(ctx, &p)) soap_print_fault(ctx, stderr); else soap_write_Person(ctx, &p); // default stdout printf("\nDELETE\n"); if (soap_DELETE(ctx, "http://localhost:8080/person.xml")) soap_print_fault(ctx, stderr); soap_destroy(ctx); soap_end(ctx); soap_free(ctx); return 0; } gsoap-2.8.91/gsoap/samples/rest/Makefile.am0000644000175000017500000000115713525245163020064 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = foreign 1.4 noinst_PROGRAMS = calcrest httpgettest httpposttest SOAPHEADER = calcrest.h include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = $(SOAP_NS_DEF) calcrest_SOURCES = calcrest.c calcrest.h $(SOAP_C_SRC) httpgettest_SOURCES = httpgettest.c httpgettest.h $(SOAP_C_CORE) ../../plugin/httpget.c httpposttest_SOURCES = httpposttest.c httpposttest.h $(SOAP_C_SERVER) ../../plugin/httppost.c gsoap-2.8.91/gsoap/samples/rest/httpposttest.h0000644000175000017500000000440313525245163020763 0ustar ellertellert/* httpposttest.h gSOAP HTTP POST plugin example application. gSOAP XML Web services tools Copyright (C) 2000-2009, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- 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-2004, 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. -------------------------------------------------------------------------------- Compile: soapcpp2 -c httpposttest.h cc -o httpposttest httpposttest.c soapC.c soapServer.c httppost.c stdsoap2.c To support https and compression, compile with: cc -DWITH_OPENSSL -DWITH_GZIP -o httpposttest httpposttest.c soapC.c soapServer.c httppost.c stdsoap2.c -lssl -lcrypto -lz */ // Implements the REST calculator service #import "calcrest.h" gsoap-2.8.91/gsoap/samples/rest/httpgettest.h0000644000175000017500000000437213525245163020562 0ustar ellertellert/* httpgettest.h gSOAP HTTP GET plugin example application. gSOAP XML Web services tools Copyright (C) 2000-2006, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- 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-2004, 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. -------------------------------------------------------------------------------- Compile: soapcpp2 -c httpgettest.h cc -o httpgettest httpgettest.c soapC.c soapClient.c httpget.c stdsoap2.c To support https and compression, compile with: cc -DWITH_OPENSSL -DWITH_GZIP -o httpgettest httpgettest.c soapC.c soapClient.c httpget.c stdsoap2.c -lssl -lcrypto -lz */ // Intentionally left blank: there are no SOAP methods supported gsoap-2.8.91/gsoap/samples/databinding/0000755000175000017500000000000013525245171017312 5ustar ellertellertgsoap-2.8.91/gsoap/samples/databinding/README.md0000644000175000017500000072556113525245162020611 0ustar ellertellert C and C++ XML Data Bindings {#mainpage} =========================== [TOC] Introduction {#intro} ============ This article presents a detailed overview of the gSOAP XML data bindings for C and C++. The XML data bindings for C and C++ are extensively used with gSOAP Web services to serialize C and C++ data in XML as part of the SOAP/XML Web services payloads. Also REST XML with gSOAP relies on XML serialization of C and C++ data via XML data bindings. The major advantage of XML data bindings is that your application data is always **type safe** in C and C++ by binding XML schema types to C/C++ types. So integers in XML are bound to C integers, strings in XML are bound to C or C++ strings, complex types in XML are bound to C structs or C++ classes, and so on. The structured data you create and accept will fit the data model and is **static type safe**. In other words, by leveraging strong typing in C/C++, your XML data meets **XML schema validation requirements** and satisfies **XML interoperability requirements**. In fact, gSOAP data bindings are more powerful than simply representing C/C++ data in XML. The gSOAP tools implement true and tested **structure-preserving serialization** of C/C++ data in XML, including the serialization of cyclic graph structures with id-ref XML attributes. The gSOAP tools also generate routines for deep copying and deep deletion of C/C++ data structures to simplify memory management. In addition, C/C++ structures are deserialized into managed memory, managed by the gSOAP `soap` context. At the end of this article two examples are given to illustrate the application of XML data bindings. The first simple example `address.cpp` shows how to use wsdl2h to bind an XML schema to C++. The C++ application reads and writes an XML file into and from a C++ "address book" data structure as a simple example. The C++ data structure is an STL vector of address objects. The second example `graph.cpp` shows how C++ data can be accurately serialized as a tree, digraph, and cyclic graph in XML. The digraph and cyclic graph serialization rules implement SOAP 1.1/1.2 multi-ref encoding with id-ref attributes to link elements through IDREF XML references, creating a an XML graph with pointers to XML nodes that preserves the structural integrity of the serialized C++ data. These examples demonstrate XML data bindings only for relatively simple data structures and types. The gSOAP tools support more than just these type of structures to serialize in XML. There are practically no limits to the serialization of C and C++ data types in XML. Also the support for XML schema (XSD) components is unlimited. The wsdl2h tool maps schemas to C and C++ using built-in intuitive mapping rules, while allowing the mappings to be customized using a `typemap.dat` file with mapping instructions for wsdl2h. The information in this article is applicable to gSOAP 2.8.26 and greater that support C++11 features. However, C++11 is not required. The material and the examples in this article use plain C and C++, until the point where we introduce C++11 smart pointers and scoped enumerations. While most of the examples in this article are given in C++, the concepts also apply to C with the exception of containers, smart pointers, classes and their methods. None of these exceptions limit the use of the gSOAP tools for C in any way. The data binding concepts described in this article were first envisioned in 1999 by Prof. Robert van Engelen at the Florida State University. An implementation was created in 2000, named "stub/skeleton compiler". The first articles on its successor version "gSOAP" appeared in 2002. The principle of mapping XSD components to C/C++ types and vice versa is now widely adopted in systems and programming languages, including Java web services and by C# WCF. We continue to be committed to our goal to empower C/C++ developers with powerful autocoding tools for XML. Our commitment started in the very early days of SOAP by actively participating in [SOAP interoperability testing](http://www.whitemesa.com/interop.htm), participating in the development and testing of the [W3C XML Schema Patterns for Databinding Interoperability](http://www.w3.org/2002/ws/databinding), and continues by contributing to the development of [OASIS open standards](https://www.oasis-open.org) in partnership with leading IT companies in the world. 🔝 [Back to table of contents](#) Notational Conventions {#conventions} ====================== The typographical conventions used by this document are: * `Courier` denotes C and C++ source code. * `Courier` denotes XML content, JSON content, file and path names, and URIs. * `Courier` denotes HTTP content, text file content, and shell commands with command line options and arguments. The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC-2119. 🔝 [Back to table of contents](#) Mapping WSDL and XML schemas to C/C++ {#tocpp} ===================================== To convert WSDL and XML schemas (XSD files) to code, we use the wsdl2h command on the command line (or command prompt), after opening a terminal. The wsdl2h command generates the data binding interface code that is saved to a special Web services and data bindings interface header file with extension `.h` that contains the WSDL service declarations and the data binding interface declarations in a familiar C/C++ format: wsdl2h [options] -o file.h ... XSD and WSDL files ... This command converts WSDL and XSD files to C++ (or pure C with `wsdl2h -c`) and saves the data binding interface to a interface header file `file.h` that uses familiar C/C++ syntax extended with `//gsoap` [directives](#directives) and annotations. Notational conventions are used in the data binding interface to declare serializable C/C++ types and functions for Web service operations. The WSDL 1.1/2.0, SOAP 1.1/1.2, and XSD 1.0/1.1 standards are supported by the gSOAP tools. In addition, the most popular WS specifications are also supported, including WS-Addressing, WS-ReliableMessaging, WS-Discovery, WS-Security, WS-Policy, WS-SecurityPolicy, and WS-SecureConversation. This article focusses mainly on XML data bindings. XML data bindings for C/C++ bind XML schema types to C/C++ types. So integers in XML are bound to C integers, strings in XML are bound to C or C++ strings, complex types in XML are bound to C structs or C++ classes, and so on. A data binding is dual, meaning supporting a two way direction for development. Either you start with WSDLs and/or XML schemas that are mapped to equivalent C/C++ types, or you start with C/C++ types that are mapped to XSD types. Either way, the end result is that you can serialize C/C++ types in XML such that your XML is an instance of XML schema(s) and is validated against these schema(s). This covers all of the following standard XSD components with their optional attributes and properties: XSD component | attributes and properties -------------- | ------------------------- schema | targetNamespace, version, elementFormDefault, attributeFormDefault, defaultAttributes attribute | name, ref, type, use, default, fixed, form, targetNamespace, wsdl:arrayType element | name, ref, type, default, fixed, form, nillable, abstract, substitutionGroup, minOccurs, maxOccurs, targetNamespace simpleType | name complexType | name, abstract, mixed, defaultAttributesApply all | *n/a* choice | minOccurs, maxOccurs sequence | minOccurs, maxOccurs group | name, ref, minOccurs, maxOccurs attributeGroup | name, ref any | minOccurs, maxOccurs anyAttribute | *n/a* And also the following standard XSD directives are covered: directive | description ---------- | ----------- import | Imports a schema into the importing schema for referencing include | Include schema component definitions into a schema override | Override by replacing schema component definitions redefine | Extend or restrict schema component definitions annotation | Annotates a component The XSD facets and their mappings to C/C++ are: XSD facet | maps to -------------- | ------- enumeration | `enum` simpleContent | class/struct wrapper with `__item` member complexContent | class/struct list | `enum*` bitmask (`enum*` enumerates a bitmask up to 64 bits) extension | class/struct inheritance/extension restriction | `typedef` and class/struct inheritance/redeclaration length | `typedef` with restricted content length annotation minLength | `typedef` with restricted content length annotation maxLength | `typedef` with restricted content length annotation minInclusive | `typedef` with numerical value range restriction annotation maxInclusive | `typedef` with numerical value range restriction annotation minExclusive | `typedef` with numerical value range restriction annotation maxExclusive | `typedef` with numerical value range restriction annotation precision | `typedef` with pattern annotation (pattern used for output, but input is not validated) scale | `typedef` with pattern annotation (pattern used for output, but input is not validated) totalDigits | `typedef` with pattern annotation (pattern used for output, but input is not validated) fractionDigits | `typedef` with pattern annotation (pattern used for output, but input is not validated) pattern | `typedef` with pattern annotation (define `soap::fsvalidate` callback to validate patterns) union | string with union of value All primitive XSD types are supported, including but not limited to the following XSD types: XSD type | maps to ---------------- | ------- any/anyType | `_XML` string with literal XML content (or enable DOM with wsdl2h option `-d`) anyURI | string (i.e. `char*`, `wchar_t*`, `std::string`, `std::wstring`) string | string (i.e. `char*`, `wchar_t*`, `std::string`, `std::wstring`) boolean | `bool` (C++) or `enum xsd__boolean` (C) byte | `char` (i.e. `int8_t`) short | `short` (i.e. `int16_t`) int | `int` (i.e. `int32_t`) long | `LONG64` (i.e. `long long` and `int64_t`) unsignedByte | `unsigned char` (i.e. `uint8_t`) unsignedShort | `unsigned short` (i.e. `uint16_t`) unsignedInt | `unsigned int` (i.e. `uint32_t`) unsignedLong | `ULONG64` (i.e. `unsigned long long` and `uint64_t`) float | `float` double | `double` integer | string or `#import "custom/int128.h"` to use 128 bit `xsd__integer` decimal | string or `#import "custom/long_double.h"` to use `long double` precisionDecimal | string duration | string or `#import "custom/duration.h"` to use 64 bit `xsd__duration` dateTime | `time_t` or `#import "custom/struct_tm.h"` to use `struct tm` for `xsd__dateTime` time | string or `#import "custom/long_time.h"` to use 64 bit `xsd__time` date | string or `#import "custom/struct_tm_date.h"` to use `struct tm` for `xsd__date` hexBinary | special class/struct `xsd__hexBinary` base64Binary | special class/struct `xsd__base64Binary` QName | `_QName` string (URI normalization rules are applied) All other primitive XSD types not listed above are mapped to strings, by wsdl2h generating a `typedef` to string for these types. For example, `xsd:token` is bound to a C++ or C string: ~~~{.cpp} typedef std::string xsd__token; // C++ typedef char *xsd__token; // C (wsdl2h option -c) ~~~ This associates a compatible value space to the type with the appropriate XSD type name used by the soapcpp2-generated serializers. It is possible to remap types by adding the appropriate mapping rules to `typemap.dat` as we will explain in more detail in the next section. Imported custom serializers are intended to extend the C/C++ type bindings when the default binding to string is not satisfactory to your taste and if the target platform supports these C/C++ types. To add custom serializers to `typemap.dat` for wsdl2h, see [adding custom serializers](#custom) below. 🔝 [Back to table of contents](#) Using typemap.dat to customize data bindings {#typemap} ============================================ Use a `typemap.dat` file to redefine namespace prefixes and to customize type bindings for the the generated header files produced by the wsdl2h tool. The `typemap.dat` is the default file processed by wsdl2h. Use `wsdl2h -tfile.dat` option `-tfile.dat` to specify a different mapping file `file.dat`. Declarations in `typemap.dat` can be broken up over multiple lines by continuing on the next line by ending each line to be continued with a backslash `\`. The limit is 4095 characters per line, whether the line is broken up or not. 🔝 [Back to table of contents](#) XML namespace bindings {#typemap1} ---------------------- The wsdl2h tool generates C/C++ type declarations that use `ns1`, `ns2`, etc. as schema-binding URI prefixes. These default prefixes are generated somewhat arbitrarily for each schema targetNamespace URI, meaning that their ordering may change depending on the WSDL and XSD order of processing with wsdl2h. Therefore, it is **strongly recommended** to declare your own prefix for each schema URI in `typemap.dat` to reduce maintaince effort of your code. This is more robust when anticipating possible changes of the schema(s) and/or the binding URI(s) and/or the tooling algorithms. The first and foremost important thing to do is to define prefix-URI bindings for our C/C++ code by adding the following line(s) to our `typemap.dat` or make a copy of this file and add the line(s) that bind our choice of prefix name to each URI: prefix = "URI" For example, to use `g` as a prefix for the "urn:graph" XML namespace: g = "urn:graph" This produces `g__name` C/C++ type names that are bound to the "urn:graph" schema by association of `g` to the generated C/C++ types. This means that `` is parsed as an instance of a `g__name` C/C++ type. Also `` parses as an instance of `g__name`, because the prefix `x` has the same URI value `urn:graph`. Prefixes in XML have local scopes (like variables in a block). The first run of wsdl2h will reveal the XML namespace URIs, so you do not need to search WSDLs and XSD files for all of the target namespaces. Just copy them from the generated header file after the first run into `typemap.dat` for editing. @note Only define a namespace prefix once in `typemap.dat`. That is, do not use the same prefix for multiple XML namespace URIs. This is to avoid namespace conflicts that may cause failed builds and failures in XML parsing and XML schema validation. 🔝 [Back to table of contents](#) XSD type bindings {#typemap2} ----------------- Custom C/C++ type bindings can be declared in `typemap.dat` to associate C/C++ types with specific schema types. These type bindings have four parts: prefix__type = declaration | use | ptruse where - `prefix__type` is the schema type to be customized (the `prefix__type` name uses the common double underscore naming convention); - `declaration` declares the C/C++ type in the wsdl2h-generated header file. This part can be empty if no explicit declaration is needed; - `use` is an optional part that specifies how the C/C++ type is used in the code. When omitted, it is the same as `prefix__type`; - `ptruse` is an optional part that specifies how the type is used as a pointer type. By default it is the `use` type name with a `*` or C++11 `std::shared_ptr` when enabled (see further below). If `use` is already a pointer type by the presence of a `*` in the `use` part, then the default `ptruse` type is the same as the `use` type (that is, no double pointers `**` will be created in this case). For example, to map `xsd:duration` to a `long long` (`LONG64`) type that holds millisecond duration values, we can use the custom serializer declared in `gsoap/custom/duration.h` by adding the following line to `typemap.dat`: xsd__duration = #import "custom/duration.h" Here, we omitted the second and third parts, because `xsd__duration` is the name that wsdl2h uses for this type in our generated code so we should leave the `use` part unspecified. The third part is omitted to let wsdl2h use `xsd__duration *` for pointers or `std::shared_ptr` if smart pointers are enabled. To map `xsd:string` to `wchar_t*` wide strings for C source code output: xsd__string = | wchar_t* | wchar_t* For C++ we can use the `std::wstring` wide string: xsd__string = | std::wstring Note that the first part is empty, because these types do not require a declaration. A `ptruse` part is also defined for `wchar_t*`, but this is actually needed because the wsdl2h tool recognizes that the `use` part `wchar_t*` is already a pointer. By contrast, when using 8-bit strings, it is recommended to use the `SOAP_C_UTFSTRING` flag to enable UTF-8 formatted strings. When the auto-generated declaration should be preserved but the `use` or `ptruse` parts replaced, then we use an ellipsis for the declaration part: prefix__type = ... | use | ptruse This is useful to map schema polymorphic types to C types for example, where we need to be able to both handle a base type and its extensions as per schema extensibility. Say we have a base type called `ns:base` that is extended, then we can remap this to a C type that permits referening the extended types via a `void*` as follows: ns__base = ... | int __type_base; void* such that `__type_base` and `void*` will be used to (de)serialize any data type, including base and its derived types. The `__type_base` integer is set to a `SOAP_TYPE_T` value to indicate what type of data the `void*` pointer points to. 🔝 [Back to table of contents](#) Custom serializers for XSD types {#custom} -------------------------------- In the previous part we saw how a custom serializer is used to bind `xsd:duration` to a `long long` (`LONG64` or `int64_t`) type to store millisecond duration values: xsd__duration = #import "custom/duration.h" The `xsd__duration` type is an alias of `long long` (`LONG64` or `int64_t`). While wsdl2h will use this binding declared in `typemap.dat` automatically, you will also need to compile `gsoap/custom/duration.c`. Each custom serializer has an interface header file to be imported into another interface header file that declares the custom type for soapcpp2 and a serializer implementation file written in C, which should be compiled with the application. You can compile these in C++ (rename files to `.cpp` if needed). A custom serializer is declared in an interface header file for soapcpp2 using `extern typedef`. The typedef name declared is serializable, whereas the type on which it is based is not serializable. This declaration can be combined with `volatile` when the type should not be redeclared, see [volatile classes and structs](#toxsd9-2). For example, the custom serializer for `struct tm` is the type `xsd__datetime` declared as follows in `gsoap/custom/struct_tm.h`: ~~~{.cpp} extern typedef volatile struct tm { int tm_sec; ///< seconds (0 - 60) int tm_min; ///< minutes (0 - 59) int tm_hour; ///< hours (0 - 23) int tm_mday; ///< day of month (1 - 31) int tm_mon; ///< month of year (0 - 11) int tm_year; ///< year - 1900 int tm_wday; ///< day of week (Sunday = 0) (NOT USED) int tm_yday; ///< day of year (0 - 365) (NOT USED) int tm_isdst; ///< is summer time in effect? char* tm_zone; ///< abbreviation of timezone (NOT USED) } xsd__dateTime; ~~~ Another example is `xsd__duration` as a custom serializer for the C++11 type `std::chrono::nanoseconds`: ~~~{.cpp} extern typedef class std::chrono::nanoseconds xsd__duration; ~~~ Next, we present all pre-defined custom serializers that are available to you. 🔝 [Back to table of contents](#) ### xsd:integer {#custom-1} The wsdl2h tool maps `xsd:integer` to a string by default. To map `xsd:integer` to the 128 bit big int type `__int128_t`: xsd__integer = #import "custom/int128.h" The `xsd__integer` type is an alias of `__int128_t`. @warning Beware that the `xsd:integer` value space of integers is in principle unbounded and values can be of arbitrary length. A value range fault `SOAP_TYPE` (value exceeds native representation) or `SOAP_LENGTH` (value exceeds range bounds) will be thrown by the deserializer if the value is out of range. Other XSD integer types that are restrictions of `xsd:integer`, are `xsd:nonNegativeInteger` and `xsd:nonPositiveInteger`, which are further restricted by `xsd:positiveInteger` and `xsd:negativeInteger`. To bind these types to `__int128_t` add the following definitions to `typemap.dat`: xsd__nonNegativeInteger = typedef xsd__integer xsd__nonNegativeInteger 0 : ; xsd__nonPositiveInteger = typedef xsd__integer xsd__nonPositiveInteger : 0 ; xsd__positiveInteger = typedef xsd__integer xsd__positiveInteger 1 : ; xsd__negativeInteger = typedef xsd__integer xsd__negativeInteger : -1 ; Or simply uncomment these definitions in `typemap.dat` when you are using the latest gSOAP releases. @note If `__int128_t` 128 bit integers are not supported on your platform and if it is certain that `xsd:integer` values are within 64 bit value bounds for your application's use, then you can map this type to `LONG64`: xsd__integer = typedef LONG64 xsd__integer; @note Again, a value range fault `SOAP_TYPE` or `SOAP_LENGTH` will be thrown by the deserializer if the value is out of range. After running wsdl2h and soapcpp2, compile `gsoap/custom/int128.c` with your project. @see Section [numerical types](#toxsd5). 🔝 [Back to table of contents](#) ### xsd:decimal {#custom-2} The wsdl2h tool maps `xsd:decimal` to a string by default. To map `xsd:decimal` to extended precision floating point: xsd__decimal = #import "custom/long_double.h" | long double By contrast to all other custom serializers, this serializer enables `long double` natively without requiring a new binding name (`xsd__decimal` is NOT defined). If your system supports `quadmath.h` quadruple precision floating point `__float128`, you can map `xsd:decimal` to `xsd__decimal` that is an alias of `__float128`: xsd__decimal = #import "custom/float128.h" @warning Beware that `xsd:decimal` is in principle a decimal value with arbitraty lengths. A value range fault `SOAP_TYPE` will be thrown by the deserializer if the value is out of range. In the XML payload the special values `INF`, `-INF`, `NaN` represent plus or minus infinity and not-a-number, respectively. After running wsdl2h and soapcpp2, compile `gsoap/custom/long_double.c` with your project. @see Section [numerical types](#toxsd5). 🔝 [Back to table of contents](#) ### xsd:dateTime {#custom-3} The wsdl2h tool maps `xsd:dateTime` to `time_t` by default. The trouble with `time_t` when represented as 32 bit `long` integers is that it is limited to dates between 1970 and 2038. A 64 bit `time_t` is safe to use if the target platform supports it, but lack of 64 bit `time_t` portability may still cause date range issues. For this reason `struct tm` should be used to represent wider date ranges. This custom serializer avoids using date and time information in `time_t`. You get the raw date and time information. You only lose the day of the week information. It is always Sunday (`tm_wday=0`). To map `xsd:dateTime` to `xsd__dateTime` which is an alias of `struct tm`: xsd__dateTime = #import "custom/struct_tm.h" If the limited date range of `time_t` is not a problem but you want to increase the time precision with fractional seconds, then we suggest to map `xsd:dateTime` to `struct timeval`: xsd__dateTime = #import "custom/struct_timeval.h" If the limited date range of `time_t` is not a problem but you want to use the C++11 time point type `std::chrono::system_clock::time_point` (which internally uses `time_t`): xsd__dateTime = #import "custom/chrono_time_point.h" Again, we should make sure that the dates will not exceed the date range when using the default `time_t` binding for `xsd:dateTime` or when binding `xsd:dateTime` to `struct timeval` or to `std::chrono::system_clock::time_point`. These are safe to use in applications that use `xsd:dateTime` to record date stamps within a given window. Otherwise, we recommend the `struct tm` custom serializer. After running wsdl2h and soapcpp2, compile `gsoap/custom/struct_tm.c` with your project. You could even map `xsd:dateTime` to a plain string (use `char*` with C and `std::string` with C++). For example: xsd__dateTime = | char* @see Section [date and time types](#toxsd7). 🔝 [Back to table of contents](#) ### xsd:date {#custom-4} The wsdl2h tool maps `xsd:date` to a string by default. We can map `xsd:date` to `struct tm`: xsd__date = #import "custom/struct_tm_date.h" The `xsd__date` type is an alias of `struct tm`. The serializer ignores the time part and the deserializer only populates the date part of the struct, setting the time to 00:00:00. There is no unreasonable limit on the date range because the year field is stored as an integer (`int`). After running wsdl2h and soapcpp2, compile `gsoap/custom/struct_tm_date.c` with your project. @see Section [date and time types](#toxsd7). 🔝 [Back to table of contents](#) ### xsd:time {#custom-5} The wsdl2h tool maps `xsd:time` to a string by default. We can map `xsd:time` to an `unsigned long long` (`ULONG64` or `uint64_t`) integer with microsecond time precision: xsd__time = #import "custom/long_time.h" This type represents 00:00:00.000000 to 23:59:59.999999, from `0` to an upper bound of `86399999999`. A microsecond resolution means that a 1 second increment requires an increment of 1000000 in the integer value. The serializer adds a UTC time zone. After running wsdl2h and soapcpp2, compile `gsoap/custom/long_time.c` with your project. @see Section [date and time types](#toxsd7). 🔝 [Back to table of contents](#) ### xsd:duration {#custom-6} The wsdl2h tool maps `xsd:duration` to a string by default, unless `xsd:duration` is mapped to a `long long` (`LONG64` or `int64_t`) type with with millisecond (ms) time duration precision: xsd__duration = #import "custom/duration.h" The `xsd__duration` type is a 64 bit signed integer that can represent 106,751,991,167 days forwards (positive) and backwards (negative) in time in increments of 1 ms (1/1000 of a second). Rescaling of the duration value by may be needed when adding the duration value to a `time_t` value, because `time_t` may or may not have a seconds resolution, depending on the platform and possible changes to `time_t`. Rescaling is done automatically when you add a C++11 `std::chrono::nanoseconds` value to a `std::chrono::system_clock::time_point` value. To use `std::chrono::nanoseconds` as `xsd:duration`: xsd__duration = #import "custom/chrono_duration.h" This type can represent 384,307,168 days (2^63 nanoseconds) forwards and backwards in time in increments of 1 ns (1/1,000,000,000 of a second). Certain observations with respect to receiving durations in years and months apply to both of these serializer decoders for `xsd:duration`. After running wsdl2h and soapcpp2, compile `gsoap/custom/duration.c` with your project. @see Section [time duration types](#toxsd8). 🔝 [Back to table of contents](#) Custom Qt serializers for XSD types {#qt} ----------------------------------- The gSOAP distribution includes several custom serializers for Qt types. Also Qt container classes are supported, see [the built-in typemap.dat variables $CONTAINER, $POINTER and $SIZE](#typemap5). This feature requires gSOAP 2.8.34 or higher and Qt 4.8 or higher. Each Qt custom serializer has an interface header file for soapcpp2 and a C++ implementation file to be compiled with your project. Other Qt primitive types that are Qt `typedef`s of C/C++ types do not require a custom serializer. 🔝 [Back to table of contents](#) ### xsd:string {#qt-1} To use Qt strings instead of C++ strings, add the following definition to `typemap.dat`: xsd__string = #import "custom/qstring.h" After running wsdl2h and soapcpp2, compile `gsoap/custom/qstring.cpp` with your project. 🔝 [Back to table of contents](#) ### xsd:base64Binary {#qt-2} To use Qt byte arrays for `xsd:base64Binary` instead of the `xsd__base64Binary` class, add the following definition to `typemap.dat`: xsd__base64Binary = #import "custom/qbytearray_base64.h" After running wsdl2h and soapcpp2, compile `gsoap/custom/qbytearray_base64.cpp` with your project. 🔝 [Back to table of contents](#) ### xsd:hexBinary {#qt-3} To use Qt byte arrays for `xsd:hexBinary` instead of the `xsd__base64Binary` class, add the following definition to `typemap.dat`: xsd__hexBinary = #import "custom/qbytearray_hex.h" After running wsdl2h and soapcpp2, compile `gsoap/custom/qbytearray_hex.cpp` with your project. 🔝 [Back to table of contents](#) ### xsd:dateTime {#qt-4} To use Qt QDateTime for `xsd:dateTime`, add the following definition to `typemap.dat`: xsd__dateTime = #import "custom/datetime.h" After running wsdl2h and soapcpp2, compile `gsoap/custom/qdatetime.cpp` with your project. 🔝 [Back to table of contents](#) ### xsd:date {#qt-5} To use Qt QDate for `xsd:date`, add the following definition to `typemap.dat`: xsd__date = #import "custom/qdate.h" After running wsdl2h and soapcpp2, compile `gsoap/custom/qdate.cpp` with your project. 🔝 [Back to table of contents](#) ### xsd:time {#qt-6} To use Qt QDate for `xsd:time`, add the following definition to `typemap.dat`: xsd__time = #import "custom/qtime.h" After running wsdl2h and soapcpp2, compile `gsoap/custom/qtime.cpp` with your project. 🔝 [Back to table of contents](#) Class/struct member additions {#typemap3} ----------------------------- All generated classes and structs can be augmented with additional members such as methods, constructors and destructors, and private members: prefix__type = $ member-declaration For example, we can add method declarations and private members to a class, say `ns__record` as follows: ns__record = $ ns__record(const ns__record &); // copy constructor ns__record = $ void print(); // a print method ns__record = $ private: int status; // a private member Method declarations cannot include any code, because soapcpp2's input permits only type declarations, not code. 🔝 [Back to table of contents](#) Replacing XSD types by equivalent alternatives {#typemap4} ---------------------------------------------- Type replacements can be given to replace one type entirely with another given type: prefix__type1 == prefix__type2 This replaces all `prefix__type1` by `prefix__type2` in the wsdl2h output. @warning Do not agressively replace types, because this can cause XML schema validation to fail when a value-type mismatch is encountered in the XML input. Therefore, only replace similar types with other similar types that are wider (e.g. `short` by `int` and `float` by `double`). 🔝 [Back to table of contents](#) The built-in typemap.dat variables $CONTAINER, $POINTER and $SIZE {#typemap5} ----------------------------------------------------------------- The `typemap.dat` `$CONTAINER` variable defines the container type to use in the wsdl2h-generated declarations for C++, which is `std::vector` by default. For example, to use `std::list` as the container in the wsdl2h-generated declarations we add the following line to `typemap.dat`: $CONTAINER = std::list Also a Qt container can be used instead of the default `std::vector`, for example `QVector`: [ #include ] $CONTAINER = QVector To remove containers, use `wsdl2h -s`. This also removes `std::string`, but you can re-introduce `std::string` with `xsd__string = | std::string` in `typemap.dat`. The `typemap.dat` `$POINTER` variable defines the smart pointer to use in the wsdl2h-generated declarations for C++, which replaces the use of `*` pointers. For example: $POINTER = std::shared_ptr Not all pointers in the generated output are replaced by smart pointers by wsdl2h, such as pointers as union members and pointers as struct/class members that point to arrays of values. @note The standard smart pointer `std::shared_ptr` is generally safe to use. Other smart pointers such as `std::unique_ptr` and `std::auto_ptr` may cause compile-time errors when classes have smart pointer members but no copy constructor (a default copy constructor). A copy constructor is required for non-shared smart pointer copying or swapping. Alternatives to `std::shared_ptr` of the form `NAMESPACE::shared_ptr` can be assigned to `$POINTER` when the namespace `NAMESPACE` also implements `NAMESPACE::make_shared` and when the shared pointer class provides `reset()` and`get()` methods and the dereference operator. For example Boost `boost::shared_ptr`: [ #include ] $POINTER = boost::shared_ptr The user-defined content between `[` and `]` ensures that we include the Boost header files that are needed to support `boost::shared_ptr` and `boost::make_shared`. The variable `$SIZE` defines the type of array sizes, which is `int` by default. For example, to change array size types to `size_t`: $SIZE = size_t Permissible types are `int` and `size_t`. This variable does not affect the size of dynamic arrays, `xsd__hexBinary` and `xsd__base64Binary` types, which is always `int`. 🔝 [Back to table of contents](#) User-defined content {#typemap6} -------------------- Any other content to be generated by wsdl2h can be included in `typemap.dat` by enclosing it within brackets `[` and `]` anywhere in the `typemap.dat` file. Each of the two brackets must appear at the start of a new line. For example, we can add an `#import "wsa5.h"` to the wsdl2h-generated output as follows: [ #import "import/wsa5.h" ] which emits the `#import "import/wsa5.h"` literally at the start of the wsdl2h-generated header file. 🔝 [Back to table of contents](#) Mapping C/C++ to XML schema {#toxsd} =========================== The soapcpp2 command generates the data binding implementation code from a data binding interface `file.h`: soapcpp2 [options] file.h where `file.h` is a interface header file that declares the XML data binding interface. The `file.h` is typically generated by wsdl2h, but you can also declare one yourself. If so, add `//gsoap` [directives](#directives) and declare in this file all our C/C++ types you want to serialize in XML. You can also declare functions that will be converted to Web service operations by soapcpp2. Global function declarations define service operations, which are of the form: ~~~{.cpp} int prefix__func(arg1, arg2, ..., argn, result); ~~~ where `arg1`, `arg2`, ..., `argn` are formal argument declarations of the input and `result` is a formal argument for the output, which must be a pointer or reference to the result object to be populated. More information on declaring and implementing service operation functions can be found in the [gSOAP user guide.](../../guide/html/index.html) 🔝 [Back to table of contents](#) Overview of serializable C/C++ types {#toxsd1} ------------------------------------ The following C/C++ types are supported by soapcpp2 and mapped to XSD types and constructs. See the subsections below for more details or follow the links. 🔝 [Back to table of contents](#) ### List of Boolean types Boolean Type | Notes ----------------------------- | ----- `bool` | C++ bool `enum xsd__boolean` | C alternative to C++ `bool` with `false_` and `true_` @see Section [C++ bool and C alternative](#toxsd3). 🔝 [Back to table of contents](#) ### List of enumeration and bitmask types Enumeration Type | Notes ----------------------------- | ----- `enum` | enumeration `enum class` | C++11 scoped enumeration, requires `soapcpp2 -c++11` `enum*` | a bitmask that enumerates values 1, 2, 4, 8, ... `enum* class` | C++11 scoped enumeration bitmask, requires `soapcpp2 -c++11` @see Section [enumerations and bitmasks](#toxsd4). 🔝 [Back to table of contents](#) ### List of numerical types Numerical Type | Notes ----------------------------- | ----- `char` | byte `short` | 16 bit integer `int` | 32 bit integer `long` | 32 bit integer `LONG64` | 64 bit integer `xsd__integer` | 128 bit integer, use `#import "custom/int128.h"` `long long` | same as `LONG64` `unsigned char` | unsigned byte `unsigned short` | unsigned 16 bit integer `unsigned int` | unsigned 32 bit integer `unsigned long` | unsigned 32 bit integer `ULONG64` | unsigned 64 bit integer `unsigned long long` | same as `ULONG64` `int8_t` | same as `char` `int16_t` | same as `short` `int32_t` | same as `int` `int64_t` | same as `LONG64` `uint8_t` | same as `unsigned char` `uint16_t` | same as `unsigned short` `uint32_t` | same as `unsigned int` `uint64_t` | same as `ULONG64` `size_t` | transient type (not serializable) `float` | 32 bit float `double` | 64 bit float `long double` | extended precision float, use `#import "custom/long_double.h"` `xsd__decimal` | `quadmath.h` library 128 bit quadruple precision float, use `#import "custom/float128.h"` `typedef` | declares a type name, with optional value range and string length bounds @see Section [numerical types](#toxsd5). 🔝 [Back to table of contents](#) ### List of string types String Type | Notes ----------------------------- | ----- `char*` | string (may contain UTF-8 with flag `SOAP_C_UTFSTRING`) `wchar_t*` | wide string `std::string` | C++ string (may contain UTF-8 with flag `SOAP_C_UTFSTRING`) `std::wstring` | C++ wide string `char[N]` | fixed-size string, requires `soapcpp2 -b` `_QName` | normalized QName content `_XML` | literal XML string content with wide characters in UTF-8 `typedef` | declares a new string type name, may restrict string length @see Section [string types](#toxsd6). 🔝 [Back to table of contents](#) ### List of date and time types Date and Time Type | Notes --------------------------------------- | ----- `time_t` | date and time point since epoch `struct tm` | date and time point, use `#import "custom/struct_tm.h"` `struct tm` | date point, use `#import "custom/struct_tm_date.h"` `struct timeval` | date and time point, use `#import "custom/struct_timeval.h"` `unsigned long long` | time point in microseconds, use `#import "custom/long_time.h"` `std::chrono::system_clock::time_point` | date and time point, use `#import "custom/chrono_time_point.h"` @see Section [date and time types](#toxsd7). 🔝 [Back to table of contents](#) ### List of time duration types Time Duration Type | Notes ----------------------------- | ----- `long long` | duration in milliseconds, use `#import "custom/duration.h"` `std::chrono::nanoseconds` | duration in nanoseconds, use `#import "custom/chrono_duration.h"` @see Section [time duration types](#toxsd8). 🔝 [Back to table of contents](#) ### List of classes, structs, unions, pointers, containers, and arrays Classes, Structs, and Members | Notes ----------------------------- | ----- `class` | C++ class with single inheritance only `struct` | C struct or C++ struct without inheritance `std::shared_ptr` | C++11 smart shared pointer `std::unique_ptr` | C++11 smart pointer `std::auto_ptr` | C++ smart pointer `std::deque` | use `#import "import/stldeque.h"` `std::list` | use `#import "import/stllist.h"` `std::vector` | use `#import "import/stlvector.h"` `std::set` | use `#import "import/stlset.h"` `template class` | a container with `begin()`, `end()`, `size()`, `clear()`, and `insert()` methods `T*` | pointer to data of type `T` `T*` | as a class or struct member: points to data of type `T` or array of `T` with member `__size` `T[N]` | as a class or struct member: fixed-size array of type `T` `union` | as a class or struct member: requires a variant selector member `__union` `void*` | as a class or struct member: requires a `__type` member to indicate the type of object pointed to @see Section [classes and structs](#toxsd9). 🔝 [Back to table of contents](#) ### List of special classes and structs Special Classes and Structs | Notes ----------------------------- | ----- Special Array class/struct | single and multidimensional SOAP Arrays Special Wrapper class/struct | complexTypes with simpleContent, wraps `__item` member `xsd__hexBinary` | binary content `xsd__base64Binary` | binary content and optional DIME/MIME/MTOM attachments `xsd__anyType` | DOM elements, use `#import "dom.h"` `@xsd__anyAttribute` | DOM attributes, use `#import "dom.h"` @see Section [special classes and structs](#toxsd10). 🔝 [Back to table of contents](#) Colon notation versus name prefixing with XML tag name translation {#toxsd2} ------------------------------------------------------------------ To bind C/C++ type names to XSD types, a simple form of name prefixing is used by the gSOAP tools by prepending the XML namespace prefix to the C/C++ type name with a pair of undescrores. This also ensures that name clashes cannot occur when multiple WSDL and XSD files are converted to C/C++. Also, C++ namespaces are not sufficiently rich to capture XML schema namespaces accurately, for example when class members are associated with schema elements defined in another XML namespace and thus the XML namespace scope of the member's name is relevant, not just its type. However, from a C/C++ centric point of view this can be cumbersome. Therefore, colon notation is an alternative to physically augmenting C/C++ names with prefixes. For example, the following class uses colon notation to bind the `record` class to the `urn:types` schema: ~~~{.cpp} //gsoap ns schema namespace: urn:types class ns:record // binding 'ns:' to a type name { public: std::string name; uint64_t SSN; ns:record *spouse; // using 'ns:' with the type name ns:record(); // using 'ns:' here too ~ns:record(); // and here }; ~~~ The colon notation is stripped away by soapcpp2 when generating the data binding implementation code for our project. So the final code just uses `record` to identify this class and its constructor/destructor. When using colon notation make sure to be consistent and not use colon notation mixed with prefixed forms. The qualified name `ns:record` differs from `ns__record`, because `ns:record` is compiled to an unqualified `record` name in the source code output by the soapcpp2 tool. Colon notation also facilitates overruling the elementFormDefault and attributeFormDefault declaration that is applied to local elements and attributes, when declared as members of classes, structs, and unions. For more details, see [qualified and unqualified members](#toxsd9-6). A C/C++ identifier name (a type name, member name, function name, or parameter name) is translated to an XML tag name by the following rules: - Two leading underscores indicates that the identifier name has no XML tag name, i.e. this name is not visible in XML and is not translated. - A leading underscore is removed, but the underscore indicates that: **a**) a struct/class member name or parameter name has a wildcard XML tag name (i.e. matches any XML tag), or **b**) a type name that has a [document root element definition](#toxsd9-7). - Trailing underscores are removed (i.e. trailing underscores can be used to avoid name clashes with keywords). - Underscores within names are translated to hyphens (hyphens are more common in XML tag names). - `_USCORE` is translated to an underscore in the translated XML tag name. - `_DOT` is translated to a dot (`.`) in the translated XML tag name. - `_xHHHH` is translated to the Unicode character with code point HHHH (hex). - C++11 Unicode identifier name characters in UTF-8 are translated as-is. For example, the C/C++ namespace qualified identifier name `s_a__my_way` is translated to the XML tag name `s-a:my-way` by translating the prefix `s_a` and the local name `my_way`. Struct/class member and parameter name translation can be overruled by using [backtick XML tags](#toxsd9-5-1) (with gSOAP 2.8.30 and greater). 🔝 [Back to table of contents](#) C++ bool and C alternative {#toxsd3} -------------------------- The C++ `bool` type is bound to built-in XSD type `xsd:boolean`. The C alternative is to define an enumeration: ~~~{.cpp} enum xsd__boolean { false_, true_ }; ~~~ or by defining an enumeration in C with pseudo-scoped enumeration constants: ~~~{.cpp} enum xsd__boolean { xsd__boolean__false, xsd__boolean__true }; ~~~ The XML value space of these types is `false` and `true`, but also accepted are `0` and `1` values for `false` and `true`, respectively. To prevent name clashes, `false_` and `true_` have a trailing underscore in their `enum` symbols. Trailing underscores are removed from the XML value space. 🔝 [Back to table of contents](#) Enumerations and bitmasks {#toxsd4} ------------------------- Enumerations are mapped to XSD simpleType enumeration restrictions of `xsd:string`, `xsd:QName`, and `xsd:long`. Consider for example: ~~~{.cpp} enum ns__Color { RED, WHITE, BLUE }; ~~~ which maps to a simpleType restriction of `xsd:string` in the soapcpp2-generated schema:

~~~{.xml} ~~~
Enumeration name constants can be pseudo-scoped to prevent name clashes, because enumeration name constants have a global scope in C and C++: ~~~{.cpp} enum ns__Color { ns__Color__RED, ns__Color__WHITE, ns__Color__BLUE }; ~~~ You can also use C++11 scoped enumerations to prevent name clashes: ~~~{.cpp} enum class ns__Color : int { RED, WHITE, BLUE }; ~~~ Here, the enumeration class base type `: int` is optional. In place of `int` in the example above, we can also use `int8_t`, `int16_t`, `int32_t`, or `int64_t`. The XML value space of the enumertions defined above is `RED`, `WHITE`, and `BLUE`. Prefix-qualified enumeration name constants are mapped to simpleType restrictions of `xsd:QName`, for example: ~~~{.cpp} enum ns__types { xsd__int, xsd__float }; ~~~ which maps to a simpleType restriction of `xsd:QName` in the soapcpp2-generated schema:
~~~{.xml} ~~~
Enumeration name constants can be pseudo-numeric as follows: ~~~{.cpp} enum ns__Primes { _3 = 3, _5 = 5, _7 = 7, _11 = 11 }; ~~~ which maps to a simpleType restriction of `xsd:long`:
~~~{.xml} ~~~
The XML value space of this type is `3`, `5`, `7`, and `11`. Besides (pseudo-) scoped enumerations, another way to prevent name clashes accross enumerations is to start an enumeration name constant with one underscore or followed it by any number of underscores, which makes it unique. The leading and trailing underscores are removed from the XML value space. ~~~{.cpp} enum ns__ABC { A, B, C }; enum ns__BA { B, A }; // BAD: B = 1 but B is already defined as 2 enum ns__BA_ { B_, A_ }; // OK ~~~ The gSOAP soapcpp2 tool permits reusing enumeration name constants across (non-scoped) enumerations as long as these values are assigned the same constant. Therefore, the following is permitted: ~~~{.cpp} enum ns__Primes { _3 = 3, _5 = 5, _7 = 7, _11 = 11 }; enum ns__Throws { _1 = 1, _2 = 2, _3 = 3, _4 = 4, _5 = 5, _6 = 6 }; ~~~ A bitmask type is an `enum*` "product enumeration" with a geometric, power-of-two sequence of values assigned to the enumeration constants: ~~~{.cpp} enum* ns__Options { SSL3, TLS10, TLS11, TLS12, TLS13 }; ~~~ where the product enum assigns 1 to `SSL3`, 2 to `TLS10`, 4 to `TLS11`, 8 to `TLS12`, and 16 to `TLS13`, which allows these enumeration constants to be used in composing bitmasks with `|` (bitwise or) `&` (bitwise and), and `~` (bitwise not): ~~~{.cpp} enum ns__Options options = (enum ns__Options)(SSL3 | TLS10 | TLS11 | TLS12 | TLS13); if (options & SSL3) // if SSL3 is an option, warn and remove from options { warning(); options &= ~SSL3; } ~~~ The bitmask type maps to a simpleType list restriction of `xsd:string` in the soapcpp2-generated XML schema:
~~~{.xml} ~~~
The XML value space of this type consists of all 16 possible subsets of the four values, represented by an XML string with space-separated values. For example, the bitmask `TLS10 | TLS11 | TLS12` equals 14 and is represented by the XML text `TLS10 TLS11 TLS12`. You can also use C++11 scoped enumerations with bitmasks using `enum*` product enumerations: ~~~{.cpp} enum* class ns__Options { SSL3, TLS10, TLS11, TLS12, TLS13 }; ~~~ The base type of a scoped enumeration bitmask, when explicitly given, is ignored. The base type is either `int` or `int64_t`, depending on the number of constants enumerated in the bitmask. To convert `enum` name constants and bitmasks to a string, we use the auto-generated function for enum `T`: ~~~{.cpp} const char *soap_T2s(struct soap*, enum T val) ~~~ The string returned is stored in an internal buffer of the current `soap` context, so you should copy it to keep it from being overwritten. For example, use `char *soap_strdup(struct soap*, const char*)`. To convert a string to an `enum` constant or bitmask, we use the auto-generated function ~~~{.cpp} int soap_s2T(struct soap*, const char *str, enum T *val) ~~~ This function takes the name (or names, space-separated for bitmasks) of the enumeration constant in a string `str`. Names should be given without the pseudo-scope prefix and without trailing underscores. The function sets `val` to the corresponding integer enum constant or to a bitmask. The function returns `SOAP_OK` (zero) on success or an error if the string is not a valid enumeration name. 🔝 [Back to table of contents](#) Numerical types {#toxsd5} --------------- Integer and floating point types are mapped to the equivalent built-in XSD types with the same sign and bit width. The `size_t` type is transient (not serializable) because its width is platform dependent. We recommend to use `uint64_t` instead. The XML value space of integer types are their decimal representations without loss of precision. The XML value space of floating point types are their decimal representations. The decimal representations are formatted with the printf format string `"%.9G"` for floats and the printf format string `"%.17lG"` for double. To change the format strings, we can assign new strings to the following `soap` context members: ~~~{.cpp} soap.float_format = "%g"; soap.double_format = "%lg"; soap.long_double_format = "%Lg"; ~~~ Decimal representations may result in a loss of precision of the least significant decimal. Therefore, the format strings that are used by default are sufficiently precise to avoid loss, but this may result in long decimal fractions in the XML value space. The `long double` extended floating point type requires a custom serializer: ~~~{.cpp} #import "custom/long_double.h" ... // use long double ~~~ You can now use `long double`, which has a serializer that serializes this type as `xsd:decimal`. Compile and link your code with the file `gsoap/custom/long_double.c`. The value space of floating point values includes the special values `INF`, `-INF`, and `NaN`. You can check a value for plus or minus infinity and not-a-number as follows: ~~~{.cpp} soap_isinf(x) && x > 0 // is x INF? soap_isinf(x) && x < 0 // is x -INF? soap_isnan(x) // is x NaN? ~~~ To assign these values, use: ~~~{.cpp} // x is float // x is double, long double, or __float128 x = FLT_PINFY; x = DBL_PINFTY; x = FLT_NINFY; x = DBL_NINFTY; x = FLT_NAN; x = DBL_NAN; ~~~ If your system supports `__float128` then you can also use this 128 bit floating point type with a custom serializer: ~~~{.cpp} #import "custom/float128.h" ... // use xsd__decimal ~~~ Then use the `xsd__decimal` alias of `__float128`, which has a serializer. Do not use `__float128` directly, which is transient (not serializable). To check for `INF`, `-INF`, and `NaN` of a `__float128` value use: ~~~{.cpp} isinfq(x) && x > 0 // is x INF? isinfq(x) && x < 0 // is x -INF? isnanq(x) // is x NaN? ~~~ The range of a `typedef`-defined numerical type can be restricted using the range `:` operator with inclusive lower and upper bounds. For example: ~~~{.cpp} typedef int ns__narrow -10 : 10; ~~~ This maps to a simpleType restriction of `xsd:int` in the soapcpp2-generated schema:
~~~{.xml} ~~~
The lower and upper bound of a range are optional. When omitted, values are not bound from below or from above, respectively. The range of a floating point `typedef`-defined type can be restricted within floating point constant bounds. Also with a floating point `typedef` a `printf`-format pattern can be given of the form `"%[width][.precision]f"` to format decimal values using the given width and precision fields: ~~~{.cpp} typedef float ns__PH "%5.2f" 0.0 : 14.0; ~~~ This maps to a simpleType restriction of `xsd:float` in the soapcpp2-generated schema:
~~~{.xml} ~~~
For exclusive bounds, we use the `<` operator instead of the `:` range operator: ~~~{.cpp} typedef float ns__epsilon 0.0 < 1.0; ~~~ Values `eps` of `ns__epsilon` are restricted between `0.0 < eps < 1.0`. This maps to a simpleType restriction of `xsd:float` in the soapcpp2-generated schema:
~~~{.xml} ~~~
To make just one of the bounds exclusive, while keeping the other bound inclusive, we add a `<` on the left or on the right side of the range ':' operator. For example: ~~~{.cpp} typedef float ns__pos 0.0 < : ; // 0.0 < pos typedef float ns__neg : < 0.0 ; // neg < 0.0 ~~~ It is valid to make both left and right side exclusive with `< : <` which is in fact identical to the exlusive range `<` operator: ~~~{.cpp} typedef float ns__epsilon 0.0 < : < 1.0; // 0.0 < eps < 1.0 ~~~ It helps to think of the `:` as a placeholder of the value between the two bounds, which is easier to memorize than the shorthand forms of bounds from which the `:` is removed: | bounds | validation check | shorthand | | ------------ | ---------------- | ----------- | | `1 : ` | 1 <= x | `1 ` | | `1 : 10 ` | 1 <= x <= 10 | | | ` : 10 ` | x <= 10 | | | `1 < : < 10` | 1 < x < 10 | `1 < 10 ` | | `1 : < 10` | 1 <= x < 10 | | | ` : < 10` | x < 10 | ` < 10 ` | | `1 < : ` | 1 < x | `1 < ` | | `1 < : 10 ` | 1 < x <= 10 | | Besides `float`, also `double` and `long double` values can be restricted. For example, consider a nonzero probability extended floating point precision type: ~~~{.cpp} #import "custom/long_double.h" typedef long double ns__probability "%16Lg" 0.0 < : 1.0; ~~~ Value range restrictions are validated by the parser for all inbound XML data. A type fault `SOAP_TYPE` will be thrown by the deserializer if the value is out of range. Finally, if your system supports `__int128_t` then you can also use this 128 bit integer type with a custom serializer: ~~~{.cpp} #import "custom/int128.h" ... // use xsd__integer ~~~ Use the `xsd__integer` alias of `__int128_t`, which has a serializer. Do not use `__int128_t` directly, which is transient (not serializable). To convert numeric values to a string, we use the auto-generated function for numeric type `T`: ~~~{.cpp} const char *soap_T2s(struct soap*, T val) ~~~ For numeric types `T`, the string returned is stored in an internal buffer of the current `soap` context, so you should copy it to keep it from being overwritten. For example, use `char *soap_strdup(struct soap*, const char*)`. To convert a string to a numeric value, we use the auto-generated function ~~~{.cpp} int soap_s2T(struct soap*, const char *str, T *val) ~~~ where `T` is for example `int`, `LONG64`, `float`, `decimal` (the custom serializer name of `long double`) or `xsd__integer` (the custom serializer name of `__int128_t`). The function `soap_s2T` returns `SOAP_OK` on success or an error when the value is not numeric. For floating point types, `"INF"`, `"-INF"` and `"NaN"` are valid strings to convert to numbers. 🔝 [Back to table of contents](#) String types {#toxsd6} ------------ String types are mapped to the built-in `xsd:string` and `xsd:QName` XSD types. The wide strings `wchar_t*` and `std::wstring` may contain Unicode that is preserved in the XML value space. Strings `char*` and `std::string` can only contain extended Latin, but we can store UTF-8 content that is preserved in the XML value space when the `soap` context is initialized with the flag `SOAP_C_UTFSTRING`. @warning Beware that many XML 1.0 parsers reject all control characters (those between `#x1` and `#x1F`) except for `#x9`, `#xA`, and `#xD`. With the newer XML 1.1 version parsers (including gSOAP) you should be fine. The length of a string of a `typedef`-defined string type can be restricted: ~~~{.cpp} typedef std::string ns__password 6 : 16; ~~~ which maps to a simpleType restriction of `xsd:string` in the soapcpp2-generated schema:
~~~{.xml} ~~~
String length restrictions are validated by the parser for inbound XML data. A value length fault `SOAP_LENGTH` will be thrown by the deserializer if the string is too long or too short. In addition, an XSD regex pattern restriction can be associated with a string typedef: ~~~{.cpp} typedef std::string ns__password "([a-zA-Z]|[0-9]|-)+" 6 : 16; ~~~ which maps to a simpleType restriction of `xsd:string` in the soapcpp2-generated schema:
~~~{.xml} ~~~
Pattern restrictions are validated by the parser for inbound XML data only if the `soap::fsvalidate` and `soap::fwvalidate` callbacks are defined. Exclusive length bounds can be used with strings: ~~~{.cpp} typedef std::string ns__string255 : < 256; // same as 0 : 255 ~~~ Fixed-size strings (`char[N]`) are rare occurrences in the wild, but apparently still used in some projects to store strings. To facilitate fixed-size string serialization, use `soapcpp2 -b` option `-b`. For example: ~~~{.cpp} typedef char ns__buffer[10]; // requires soapcpp2 option -b ~~~ which maps to a simpleType restriction of `xsd:string` in the soapcpp2-generated schema:
~~~{.xml} ~~~
Fixed-size strings must contain NUL-terminated text and should not contain raw binary data. Also, the length limitation is more restrictive for UTF-8 content (enabled with the `SOAP_C_UTFSTRING`) that requires multibyte character encodings. As a consequence, UTF-8 content may be truncated to fit. Raw binary data can be stored in a `xsd__base64Binary` or `xsd__hexBinary` structure, or transmitted as a MIME attachment. The built-in `_QName` type is a regular C string type (`char*`) that maps to `xsd:QName` but has the added advantage that it holds normalized qualified names. There are actually two forms of normalized QName content, to ensure any QName is represented accurately: ~~~{.cpp} "prefix:name" "\"URI\":name" ~~~ The first form of string is used when the prefix (and the binding URI) is defined in the namespace table and is bound to a URI (see the .nsmap file). The second form is used when the URI is not defined in the namespace table and therefore no prefix is available to bind and normalize the URI to. A `_QName` string may contain a sequence of space-separated QName values, not just one, and all QName values are normalized to the format shown above. To define a `std::string` base type for `xsd:QName`, we use a `typedef`: ~~~{.cpp} typedef std::string xsd__QName; ~~~ The `xsd__QName` string content is normalized, just as with the `_QName` normalization. To serialize strings that contain literal XML content to be reproduced in the XML value space, use the built-in `_XML` string type, which is a regular C string type (`char*`) that maps to plain XML CDATA. To define a `std::string` base type for literal XML content, use a `typedef`: ~~~{.cpp} typedef std::string XML; ~~~ Strings can hold any of the values of the XSD built-in primitive types. We can use a string `typedef` to declare the use of the string type as a XSD built-in type: ~~~{.cpp} typedef std::string xsd__token; ~~~ You must ensure that the string values we populate in this type conform to the XML standard, which in case of `xsd:token` is the lexical and value spaces of `xsd:token` are the sets of all strings after whitespace replacement of any occurrence of `#x9`, `#xA` , and `#xD` by `#x20` and collapsing. As of version 2.8.49, the gSOAP parser will automatically collapse or replace the white space content when receiving data for XSD types that require white space collapsed or replaced. This normalization is applied to strings directly. The decision to collapse or replace is based on the `typedef` name corresponding to the built-in string-based XSD type. To copy `char*` or `wchar_t*` strings with a context that manages the allocated memory, use functions ~~~{.cpp} char *soap_strdup(struct soap*, const char*) wchar_t *soap_wstrdup(struct soap*, const wchar_t*) ~~~ To convert a wide string to a UTF-8 encoded string, use function ~~~{.cpp} const char* SOAP_FMAC2 soap_wchar2s(struct soap*, const wchar_t *s) ~~~ The function allocates and returns a string, with its memory being managed by the context. To convert a UTF-8 encoded string to a wide string, use function ~~~{.cpp} int soap_s2wchar(struct soap*, const char *from, wchar_t **to, long minlen, long maxlen) ~~~ where `to` is set to point to an allocated `wchar_t*` string. Pass `-1` for `minlen` and `maxlen` to ignore length constraints on the target string. The function returns `SOAP_OK` or an error when the length constraints are not met. 🔝 [Back to table of contents](#) Date and time types {#toxsd7} ------------------- The C/C++ `time_t` type is mapped to the built-in `xsd:dateTime` XSD type that represents a date and time within a time zone (typically UTC). The XML value space contains ISO 8601 Gregorian time instances of the form `[-]CCYY-MM-DDThh:mm:ss.sss[Z|(+|-)hh:mm]`, where `Z` is the UTC time zone or a time zone offset `(+|-)hh:mm]` from UTC is used. A `time_t` value is considered and represented in UTC by the serializer. Because the `time_t` value range is restricted to dates after 01/01/1970 and before 2038 assuming `time_t` is a `long` 32 bit, care must be taken to ensure the range of `xsd:dateTime` values in XML exchanges do not exceed the `time_t` range. This restriction does not hold for `struct tm` (`time.h` library), which we can use to store and exchange a date and time in UTC without date range restrictions. The serializer uses the `struct tm` members directly for the XML value space of `xsd:dateTime`: ~~~{.cpp} struct tm { int tm_sec; // seconds (0 - 60) int tm_min; // minutes (0 - 59) int tm_hour; // hours (0 - 23) int tm_mday; // day of month (1 - 31) int tm_mon; // month of year (0 - 11) int tm_year; // year - 1900 int tm_wday; // day of week (Sunday = 0) (NOT USED) int tm_yday; // day of year (0 - 365) (NOT USED) int tm_isdst; // is summer time in effect? char* tm_zone; // abbreviation of timezone (NOT USED) }; ~~~ You will lose the day of the week information. It is always Sunday (`tm_wday=0`) and the day of the year is not set either. The time zone is UTC. This `struct tm` type is mapped to the built-in `xsd:dateTime` XSD type and serialized with the custom serializer `gsoap/custom/struct_tm.h` that declares a `xsd__dateTime` type: ~~~{.cpp} #import "custom/struct_tm.h" // import typedef struct tm xsd__dateTime; ... // use xsd__dateTime ~~~ Compile and link your code with `gsoap/custom/struct_tm.c`. The `struct timeval` (`sys/time.h` library) type is mapped to the built-in `xsd:dateTime` XSD type and serialized with the custom serializer `gsoap/custom/struct_timeval.h` that declares a `xsd__dateTime` type: ~~~{.cpp} #import "custom/struct_timeval.h" // import typedef struct timeval xsd__dateTime; ... // use xsd__dateTime ~~~ Compile and link your code with `gsoap/custom/struct_timeval.c`. The same value range restrictions apply to `struct timeval` as they apply to `time_t`. The added benefit of `struct timeval` is the addition of a microsecond-precise clock: ~~~{.cpp} struct timeval { time_t tv_sec; // seconds since Jan. 1, 1970 suseconds_t tv_usec; // and microseconds }; ~~~ A C++11 `std::chrono::system_clock::time_point` type is mapped to the built-in `xsd:dateTime` XSD type and serialized with the custom serializer `gsoap/custom/chrono_time_point.h` that declares a `xsd__dateTime` type: ~~~{.cpp} #import "custom/chrono_time_point.h" // import typedef std::chrono::system_clock::time_point xsd__dateTime; ... // use xsd__dateTime ~~~ Compile and link your code with `gsoap/custom/chrono_time_point.cpp`. The `struct tm` type is mapped to the built-in `xsd:date` XSD type and serialized with the custom serializer `gsoap/custom/struct_tm_date.h` that declares a `xsd__date` type: ~~~{.cpp} #import "custom/struct_tm_date.h" // import typedef struct tm xsd__date; ... // use xsd__date ~~~ Compile and link your code with `gsoap/custom/struct_tm_date.c`. The XML value space of `xsd:date` are Gregorian calendar dates of the form `[-]CCYY-MM-DD[Z|(+|-)hh:mm]` with a time zone. The serializer ignores the time part and the deserializer only populates the date part of the struct, setting the time to 00:00:00. There is no unreasonable limit on the date range because the year field is stored as an integer (`int`). An `unsigned long long` (`ULONG64` or `uint64_t`) type that contains a 24 hour time in microseconds UTC is mapped to the built-in `xsd:time` XSD type and serialized with the custom serializer `gsoap/custom/long_time.h` that declares a `xsd__time` type: ~~~{.cpp} #import "custom/long_time.h" // import typedef unsigned long long xsd__time; ... // use xsd__time ~~~ Compile and link your code with `gsoap/custom/long_time.c`. This type represents `00:00:00.000000` to `23:59:59.999999`, from 0 to an upper bound of 86,399,999,999. A microsecond resolution means that a 1 second increment requires an increment of 1,000,000 in the integer value. The XML value space of `xsd:time` are points in time recurring each day of the form `hh:mm:ss.sss[Z|(+|-)hh:mm]`, where `Z` is the UTC time zone or a time zone offset from UTC is used. The `xsd__time` value is always considered and represented in UTC by the serializer. To convert date and/or time values to a string, we use the auto-generated function for type `T`: ~~~{.cpp} const char *soap_T2s(struct soap*, T val) ~~~ For date and time types `T`, the string returned is stored in an internal buffer of the current `soap` context, so you should copy it to keep it from being overwritten. For example, use `char *soap_strdup(struct soap*, const char*)`. To convert a string to a date/time value, we use the auto-generated function ~~~{.cpp} int soap_s2T(struct soap*, const char *str, T *val) ~~~ where `T` is for example `dateTime` (for `time_t`), `xsd__dateTime` (for `struct tm`, `struct timeval`, or `std::chrono::system_clock::time_point`). The function `soap_s2T` returns `SOAP_OK` on success or an error when the value is not a date/time. 🔝 [Back to table of contents](#) Time duration types {#toxsd8} ------------------- The XML value space of `xsd:duration` are values of the form `PnYnMnDTnHnMnS` where the capital letters are delimiters. Delimiters may be omitted when the corresponding member is not used. A `long long` (`LONG64` or `int64_t`) type that contains a duration (time lapse) in milliseconds is mapped to the built-in `xsd:duration` XSD type and serialized with the custom serializer `gsoap/custom/duration.h` that declares a `xsd__duration` type: ~~~{.cpp} #import "custom/duration.h" // import typedef long long xsd__duration; ... // use xsd__duration ~~~ Compile and link your code with `gsoap/custom/duration.c`. The duration type `xsd__duration` can represent 106,751,991,167 days forward and backward with millisecond precision. Durations that exceed a month are always output in days, rather than months to avoid days-per-month conversion inacurracies. Durations that are received in years and months instead of total number of days from a reference point are not well defined, since there is no accepted reference time point (it may or may not be the current time). The decoder simple assumes that there are 30 days per month. For example, conversion of "P4M" gives 120 days. Therefore, the durations "P4M" and "P120D" are assumed to be identical, which is not necessarily true depending on the reference point in time. Rescaling of the duration value by may be needed when adding the duration value to a `time_t` value, because `time_t` may or may not have a seconds resolution, depending on the platform and possible changes to `time_t`. Rescaling is done automatically when you add a C++11 `std::chrono::nanoseconds` value to a `std::chrono::system_clock::time_point` value. To use `std::chrono::nanoseconds` as `xsd:duration`: ~~~{.cpp} #import "custom/chrono_duration.h" // import typedef std::chrono::duration xsd__duration; ... // use xsd__duration ~~~ Compile and link your code with `gsoap/custom/chrono_duration.cpp`. This type can represent 384,307,168 days (2^63 nanoseconds) forwards and backwards in time in increments of 1 ns (1/1000000000 second). The same observations with respect to receiving durations in years and months apply to this serializer's decoder. To convert duration values to a string, we use the auto-generated function ~~~{.cpp} const char *soap_xsd__duration2s(struct soap*, xsd__duration val) ~~~ The string returned is stored in an internal buffer, so you should copy it to keep it from being overwritten, Use `soap_strdup(struct soap*, const char*)` for example to copy this string. To convert a string to a duration value, we use the auto-generated function ~~~{.cpp} int soap_s2xsd__dateTime(struct soap*, const char *str, xsd__dateTime *val) ~~~ The function returns `SOAP_OK` on success or an error when the value is not a duration. 🔝 [Back to table of contents](#) Classes and structs {#toxsd9} ------------------- Classes and structs are mapped to XSD complexTypes. The XML value space consists of XML elements with attributes and subelements, possibly constrained by XML schema validation rules that enforce element and attribute occurrence contraints, numerical value range constraints, and string length and pattern constraints. Classes that are declared with the gSOAP tools are limited to single inheritence only. The soapcpp2 tool does not allow structs to be inherited. The class and struct name is bound to an XML namespace by means of the prefix naming convention or by using [colon notation](#toxsd1): ~~~{.cpp} //gsoap ns schema namespace: urn:types class ns__record { public: std::string name; uint64_t SSN; ns__record *spouse; ns__record(); ~ns__record(); protected: struct soap *soap; }; ~~~ In the example above, we also added a context pointer to the `soap` context that manages this instance. It is set when the instance is created in the engine's context, for example when deserialized and populated by the engine. The class maps to a complexType in the soapcpp2-generated XML schema:
~~~{.xml} ~~~
The following sections apply to both structs and classes. Structs require the use of the `struct` keyword with the struct name, otherwise soapcpp2 will throw a syntax error. As is often done in C, use a `typedef` to declare a `struct` that can be used without the `struct` keyword. 🔝 [Back to table of contents](#) ### Serializable versus transient types and data members {#toxsd9-1} Public data members of a class or struct are serializable when their types are serializable. Private and protected members are transient and not serializable. Also `const` and `static` members are not serializable, with the exception of `const char*` and `const wchar_t*`. Types and specific class/struct members can be made transient with the `extern` qualifier for types and by marking members with `[` and `]`: ~~~{.cpp} extern class std::ostream; // declare std::ostream transient class ns__record { public: [ int num; ] // not serialized: member is marked transient with [ ] std::ostream out; // not serialized: std:ostream is transient static const int MAX = 1024; // not serialized: static const member private: std::string id; // not serialized: private member }; ~~~ By declaring `std::ostream` transient with `extern` you can use this type wherever you need it without soapcpp2 complaining that this class and any other class or type declared as `extern` is not defined. Do not use `extern` with `typedef`, because this declares a custom serializer, see [adding custom serializers](#custom). Marking members transient with `[` and `]` makes them transient (and visually makes them stand out). This has otherwise no effect on the generated code for the class or struct to be used in your application code. 🔝 [Back to table of contents](#) ### Derived types in C++ {#toxsd9-1-1} Extensible and restricted types in XML schemas are derived types from single simple and complex base types. XML schema derived types are naturally represented by C++ derived classes using single inheritance. Besides the concept of extensions versus restrictions, there are two kinds of derived types: complexTypes with simpleContent, meaning types with XML CDATA values, and complexTypes with complexContent, meaning types with sub-elements. Both are permitted to have one or more XML attributes. A complexType with simpleContent is defined as a wrapper to contain XML CDATA values and any number of attributes, see [wrapper class/struct with simpleContent](#toxsd10-4). Wrapper class/struct types can form a hierarchy of derived types in C++ using inheritance. For example: ~~~{.cpp} class xsd__anyType { public: std::string __item; // string to hold any simpleContent }; class ns__data : public xsd__anyType { public: @ std::string value 1; // extends xsd:anyType with a required attribute }; ~~~ The `ns__data` class maps to a complexType in the soapcpp2-generated XML schema:
~~~{.xml} ~~~
The XML value space consists of an element with the string contents an optional attribute:
~~~{.xml} xyz ~~~
By contrast, a complexType with complexContent typically extends a given base complexType. For example: ~~~{.cpp} class ns__base { public: std::string name 1; int number 1; }; class ns__derived : public ns__base { public: @ std::string value 1; // extends ns:base with an attribute std::string text 1; // extends ns:base with an element }; ~~~ The `ns__base` and `ns__derived` classes maps to complexTypes in the soapcpp2-generated XML schema:
~~~{.xml} ~~~
The XML value space of `ns__derived` consists of three requires child elements and an optional attribute:
~~~{.xml} def 123 xyz ~~~
Derived types can be used for two main purposes in XML schema by extending or restricting base types. One purpose is to reuse a base type when defining a derived type, such that common parts do not need to be replicated. The second purpose is to be able to use a derived type in place of a base type in XML, which is indicated by an `xsi:type` attribute with the qualified name of the derived type. Consider for example the following class that uses the previously declared base types `xsd__anyType` and `ns__base`: ~~~{.cpp} class ns__record { public: xsd__anyType *base1 1; // required element ns__base *base2 1; // required element }; ~~~ We can assign base type values to the `ns_record` members: ~~~{.cpp} ns__record record; record.base1 = soap_new_xsd__anyType(soap); record.base2 = soap_new_ns__base(soap); soap_write_ns__record(soap, &record); ~~~ This produces the following XML fragment populated with default values (empty text for strings and zeros for numbers), where element `base1` has a simpleContent value and element `base2` has two child elements:
~~~{.xml} 0 ~~~
We can also assign derived type values to the `ns_record` members: ~~~{.cpp} ns__record record; record.base1 = soap_new_ns__data(soap); record.base2 = soap_new_ns__derived(soap); soap_write_ns__record(soap, &record); ~~~ This produces the following XML fragment populated with default values (empty text for strings and zeros for numbers), where element `base1` has schema type `ns:data` with simpleContent and an attribute, and `base2` has schema type `ns:derived` with three child elements and an attribute:
~~~{.xml} 0 ~~~
Deserialization automatically allocates and assigns a `ns__base` class instance to a `ns__base` pointer when deserializing the `ns:base` schema type and allocates and assigns a `ns__derived` class instance to a `ns__base` pointer when deserializing the `ns:derived` type when an element with `xsi:type="ns:derived"` is parsed. All classes are extended by soapcpp2 by a `soap_type()` method that returns the unique `SOAP_TYPE_T` value of the class `T`. This makes it easy to check whether the deserialized data contains a derived type to implement type-safe code, for example: ~~~{.cpp} ns__record record; soap_read_ns__record(soap, &record); if (record.base1->soap_type() == SOAP_TYPE_ns__data) std::cout << "Derived ns:data " << dynamic_cast(record.base1)->value << std::endl; else std::cout << "Base xsd:anyType" << std::endl; if (record.base2->soap_type() == SOAP_TYPE_ns__derived) std::cout << "Derived ns:derived " << dynamic_cast(record.base2)->value << std::endl; else std::cout << "Base ns:base" << std::endl; ~~~ This example should use the `SOAP_XML_STRICT` mode flag to initialize the `soap` context to ensure that all required values are present in the deserialized structures. 🔝 [Back to table of contents](#) ### Derived types in C {#toxsd9-1-2} While single inheritance works well in C++ to represent derived types as we discussed in the previous section, this will obviously not work in C. Two methods to serialize derived types in C are presented here. The first method uses `void*` to serialize anything. The second method is more accurate and is relatively new in gSOAP. To serialize any type is possible with [tagged void pointer members](#toxsd9-12) to serialize data pointed to by a `void*` member, which can be any serializable type, such as derived types. For `void*` deserialization to work the XML parsed must contain an `xsi:type` attribute with a schema type. Only then can the deserializer instantiate the corresponding serializable C/C++ type. Base types serialized do not require an `xsi:type` to indicate the base schema type, so this approach is not guaranteed to work and requires a workaround with an anonymous wrapper struct/class that contains both the base type and a `void*`. For example: ~~~{.cpp} struct ns__base // a base type { char *name 1; int number 1; }; struct ns__derived // extends ns__base with two additional members { char *name 1; int number 1; char *text 1; @ char *value 1; }; struct __ns__base // a wrapper, not visible in XML { int __type; // the SOAP_TYPE_T pointed to by __self void *__self; // points to any type struct ns__base *__self; // wraps ns__base for the current element tag } class ns__record { struct __ns__base base; }; ~~~ The `__ns__base` wrapper wraps the `ns__base` type to (de)serialize the `base` element that has no `xsi:type` attribute and uses `void*` to (de)serialize the `base` element that has `xsi:type` attribute. This works fine at the XML parsing level, but the generated XML schema components do not accurately represent the derived type, because it lacks the extension/restriction of the derived type (and the `__ns__base` wrapper is invisible). Using `void*` to represent derived types in a base type wrapper is not very accurate because we can serialize anything, not just derived types of a given base type. The wrapper may also hold two values: the base type value and a derived type value. Furthermore, using arrays or containers that hold base and derived types becomes quite tricky because an array item could hold both the base and derived type. As of gSOAP version 2.8.75, `wsdl2h -F` option `-F` generates base type structs extended with transient pointer members to its derived types. To serialize the base type itself, all of the pointer members are NULL. If one of the pointer members points to a derived type the derived type is serialized instead. Deserialization is automatic, in that the base type is deserialized if the element has no `xsi:type` attribute or the attribute is the base schema type, and a derived type is deserialized if the element has an `xsi>type` attribute with the derived schema type. This method is fully automated for the wsdl2h tool to generate an interface header file for soapcpp2 with the type derivations in C. To use this method to generate code from WSDLs and XSDs, use `wsdl2h -F` option `-F`. This also works in C++ if desired, but C++ inheritance works fine without this method. Using this method with soapcpp2 alone using a manually-specified interface header file produces the specified type inheritance in the soapcpp2-generated WSDL and XML schema files as complexType extensions. The soapcpp2 tool warns if a derived type has multiple base types. At most one base type for a derived type may be specified. This method with transient pointers to derived types makes it easy to use base and derived types in C: ~~~{.cpp} struct ns__base // a base type { char *name 1; int number 1; [ struct ns__derived *ns__derived; ] // points to derived type if non-NULL }; struct ns__derived // extends ns__base with two additional members { char *name 1; int number 1; char *text 1; @ char *value 1; }; struct ns__record { struct ns__base base; // contains base type or derived type value }; ~~~ The `ns__base` struct includes the special member `ns__derived` that points to a `ns__derived` value. This special member must be: - a transient member (i.e. non-serializable) by placing the declaration within `[` and `]`, and - the member name must match the type name (to be more precise, at least the initial part of the member name must match the type name as in the example `ns__derived_` works too). To serialize the `ns__base` value requires the `ns__derived` member to be NULL. To serialize the `ns__derived` value requires the `ns__derived` member to point to the `ns__derived` value to serialize and the `ns__base` members are irrelevant. We can assign the base type value to the `ns_record::base` member: ~~~{.cpp} struct ns__record record; soap_default_ns__record(soap, &record); soap_write_ns__record(soap, &record); ~~~ This produces the following XML fragment populated with default values (empty text for strings and zeros for numbers), where element `base` has two child elements:
~~~{.xml} 0 ~~~
We can also assign the derived type value to the `ns_record::base` member: ~~~{.cpp} struct ns__record record; soap_default_ns__record(soap, &record); record.base.ns__derived = soap_new_ns__derived(soap, -1); soap_write_ns__record(soap, &record); ~~~ This produces the following XML fragment populated with default values (empty text for strings and zeros for numbers), where element `base` has schema type `ns:derived` with three child elements and an attribute:
~~~{.xml} 0 ~~~
Deserialization automatically assigns values to the base members for the `ns__base` type and populates the `ns__derived` member when a derived type with `xsi:type="ns:derived"` is parsed. This makes it easy to decompose the deserialized data: ~~~{.cpp} struct ns__record record; soap_read_ns__record(soap, &record); if (record.ns__derived) printf("Derived type with name=%s number=%d text=%s value=%s\n", record.ns__derived->name, record.ns__derived->number, record.ns__derived->text, record.ns__derived->value); else printf("Base type with name=%s number=%d\n", record.name, record.number); ~~~ This example requires the `SOAP_XML_STRICT` mode flag to initialize the `soap` context to ensure that all required values are present in the deserialized structures, otherwise the `char*` strings may be NULL since XML validation constraints are not enforced on the XML input. Deeper levels of simulated inheritance are possible, for example: ~~~{.cpp} struct ns__base // a base type { char *name 1; int number 1; [ struct ns__derived *ns__derived; ] // points to derived type if non-NULL }; struct ns__derived // extends ns__base with two additional members { char *name 1; int number 1; char *text 1; @ char *value 1; [ struct ns__derived_derived *ns__derived_derived; ] // points to derived_derived type if non-NULL }; struct ns__derived_derived // extends ns__derived with an additional member { char *name 1; int number 1; char *text 1; @ char *value 1; @ char *type 1; }; ~~~ This requires two pointer traversals from the base type `ns__base` via `ns__derived` to reach `ns__derived_derived`. 🔝 [Back to table of contents](#) ### Volatile classes and structs {#toxsd9-2} Classes and structs can be declared `volatile` in the interface header file for soapcpp2, which only has meaning for the gSOAP tools. This annotation means that these types are already declared elsewhere in your project's source code and you do not want soapcpp2 to generate code with a second declaration of these types. For example, `struct tm` is declared in the `time.h` library. You can make it serializable and include a partial list of data members that you want to serialize: ~~~{.cpp} volatile struct tm { int tm_sec; // seconds (0 - 60) int tm_min; // minutes (0 - 59) int tm_hour; // hours (0 - 23) int tm_mday; // day of month (1 - 31) int tm_mon; // month of year (0 - 11) int tm_year; // year - 1900 }; ~~~ You can declare classes and structs `volatile` for any such types you want to serialize by only providing the public data members you want to serialize. In addition, [colon notation](#toxsd2) is a simple and effective way to bind an existing class or struct to a schema. For example, you can change the `tm` name as follows without affecting the code that uses `struct tm` generated by soapcpp2: ~~~{.cpp} volatile struct ns:tm { ... } ~~~ This struct maps to a complexType in the soapcpp2-generated XML schema:
~~~{.xml} ~~~
🔝 [Back to table of contents](#) ### Mutable classes and structs {#toxsd9-3} Classes and structs can be declared `mutable` with the gSOAP tools. This means that their definition can be spread out over the source code. This promotes the concept of a class or struct as a *row of named values*, also known as a *named tuple*, that can be extended at compile time in your source code with additional members. Because these types differ from the traditional object-oriented principles and design concepts of classes and objects, constructors and destructors cannot be defined (also because we cannot guarantee merging these into one such that all members will be initialized). A default constructor, copy constructor, assignment operation, and destructor will be assigned automatically by soapcpp2. ~~~{.cpp} mutable struct ns__tuple { @ std::string id; }; mutable struct ns__tuple { std::string name; std::string value; }; ~~~ The members are collected into one definition generated by soapcpp2. Members may be repeated from one definition to another, but only if their associated types are identical. So, for example, a third extension with a `value` member with a different type fails: ~~~{.cpp} mutable struct ns__tuple { float value; // BAD: value is already declared std::string }; ~~~ The `mutable` concept has proven to be very useful when declaring and collecting SOAP Headers for multiple services, which are collected into one `struct SOAP_ENV__Header` by the soapcpp2 tool. 🔝 [Back to table of contents](#) ### Default and fixed member values {#toxsd9-4} Class and struct data members in C and C++ may be declared with an optional default initialization value that is provided "inline" with the declaration of the member: ~~~{.cpp} class ns__record { public: std::string name = "Joe"; ... }; ~~~ Alternatively, use C++11 default initialization syntax: ~~~{.cpp} class ns__record { public: std::string name { "Joe" }; ... }; ~~~ These initializations are made by the default constructor that is added by soapcpp2 to each class and struct (in C++ only). A constructor is only added when a default constructor is not already defined with the class declaration. You can explicitly (re)initialize an object with these initial values by using the soapcpp2 auto-generated functions: - `void T::soap_default(struct soap*)` for `class T` (C++ only) - `void soap_default_T(struct soap*, T*)` for `struct T` (C and C++). If `T` is a struct or class that has a `soap` pointer member to a `::soap` context then this pointer member will be set to the first argument passed to these functions to initialize their `soap` pointer member. Default value initializations can be provided for members that have primitive types (`bool`, `enum`, `time_t`, numeric and string types). Default value initializations of pointer members is permitted, but the effect is different. To conform to XML schema validation, an attribute member that is a pointer to a primitive type will be assigned the default value when parsed from XML. An element member that is a pointer to a primitive type will be assigned when the element is empty when parsed from XML. As of gSOAP 2.8.48 and greater, a fixed value can be assigned with a `==`. A fixed value is also verified by the parser's validator. Default and fixed values for members with or without pointers are best explained with the following two example fragments. A record class (can be a struct in C) with default values for attributes and elements is declared as follows: ~~~{.cpp} class ns__record_with_default { public: @ std::string a = "A"; // optional XML attribute with default value "A" @ std::string b 1 = "B"; // required XML attribute with default value "B" @ std::string *c = "C"; // optional XML attribute with default value "C" std::string d 0 = "D"; // optional XML element with default value "D" std::string e = "E"; // required XML element with default value "E" std::string *f = "F"; // optional XML element with default value "F" ... }; ~~~ Attributes are considered optional by default, unless marked as required with the occurrence constraint `1`. Elements are considered required unless the member type is a pointer or if the member is marked optional with occurrence constraint `0`. Instead of default values, fixed values indicate that the attribute or element must contain that value, and only that value, when provided in XML. A fixed value is specified with a `==`. Attributes with default or fixed values may be omitted in XML. When omitted, the default/fixed value is used at the receiving side, i.e. the deserializer assigns the default/fixed value when the attribute is absent. Therefore, there is no need to make attributes with default/fixed values pointer based, because there is no way to distinguish an omitted attribute from a populated attribute on the receiving side. The `c` member in the example above can be a non-pointer for this reason. The wsdl2h tool does not generate pointers for attributes with default/fixed values. Elements with default or fixed values may be optional and the use of default/fixed values with elements differs from attributes. The default/fixed value of an element is only used for elements that are empty. Omitted optional elements are simply absent. No default/fixed value is assigned. A record class (can be a struct in C) with fixed values for attributes and elements is declared as follows: ~~~{.cpp} class ns__record_with_fixed { public: @ std::string g == "G"; // optional XML attribute with fixed value "G" @ std::string h 1 == "H"; // required XML attribute with fixed value "H" @ std::string *i == "I"; // optional XML attribute with fixed value "I" std::string j 0 == "J"; // optional XML element with fixed value "J" std::string k == "K"; // required XML element with fixed value "K" std::string *l == "L"; // optional XML element with fixed value "L" ... }; ~~~ The XML schema validation rules for the two example classes above are as follows: Member | Notes ------ | --------------------------------------------------------------------- `a` | attribute may appear once; if it does not appear its value is "A", otherwise its value is that given (also note: instantiating `ns__record_with_default` assigns the default value "A") `b` | has no effect when parsing XML (but note: instantiating `ns__record_with_default` assigns the default value "B") `c` | attribute may appear once; if it does not appear its value is "C", otherwise its value is that given (also note: instantiating `ns__record_with_default` assigns NULL) `d` | element may appear once; if it does not appear or if it is empty, its value is "D"; otherwise its value is that given (also note: instantiating `ns__record_with_default` assigns the default value "D") `e` | has no effect when parsing XML (but note: instantiating `ns__record_with_default` assigns the default value "E") `f` | element may appear once; if it does not appear it is not provided; if it does appear and it is empty, its value is "F"; otherwise its value is that given (also note: instantiating `ns__record_with_default` assigns NULL) `g` | attribute may appear once; if it does not appear its value is "G", if it does not appear its value is "G" (also note: instantiating `ns__record_with_fixed` assigns the fixed value "G") `h` | attribute must appear once, its value must be "H" (also note: instantiating `ns__record_with_fixed` assigns the fixed value "H") `i` | attribute may appear once; if it does not appear its value is "I", if it does not appear its value is "I" (also note: instantiating `ns__record_with_fixed` assigns NULL) `j` | element may appear once, if it does not appear it is not provided; if it does appear and it is empty, its value is "J"; if it does appear and it is not empty, its value must be "J" (also note: instantiating `ns__record_with_fixed` assigns the fixed value "J") `k` | element must appear once, its value must be "K" (also note: instantiating `ns__record_with_fixed` assigns the fixed value "K") `l` | element may appear once, if it does not appear it is not provided; if it does appear and it is empty, its value is "J"; if it does appear and it is not empty, its value must be "J" (also note: instantiating `ns__record_with_fixed` assigns NULL) @see Section [operations on classes and structs](#toxsd9-14). 🔝 [Back to table of contents](#) ### Attribute members {#toxsd9-5} Class and struct data members are declared as XML attributes by annotating their type with a `@` qualifier: ~~~{.cpp} class ns__record { public: @ std::string name; // required (non-pointer means required) @ uint64_t SSN; // required (non-pointer means required) ns__record *spouse; // optional (pointer means minOccurs=0) }; ~~~ This class maps to a complexType in the soapcpp2-generated XML schema:
~~~{.xml} ~~~
An example XML instance of `ns__record` is:
~~~{.xml} ~~~
Attribute data members are restricted to primitive types (`bool`, `enum`, `time_t`, numeric and string types), `xsd__hexBinary`, `xsd__base64Binary`, and custom serializers, such as `xsd__dateTime`. Custom serializers for types that may be used as attributes should define `soap_s2T` and `soap_T2s` functions that convert values of type `T` to strings and back. Attribute data members can be pointers and smart pointers to these types, which permits attributes to be optional. 🔝 [Back to table of contents](#) ### Backtick XML tags {#toxsd9-5-1} The XML tag name of a class/struct member is the name of the member with the usual XML tag translation, see [colon notation](#toxsd2). To override the standard translation of identifier names to XML tag names of attributes and elements, add the XML tag name in backticks (requires gSOAP 2.8.30 or greater): ~~~{.cpp} class ns__record { public: @ std::string name `full-name`; @ uint64_t SSN `tax-id`; ns__record *spouse `married-to`; }; ~~~ This class maps to a complexType in the soapcpp2-generated XML schema:
~~~{.xml} ~~~
An example XML instance of `ns__record` is:
~~~{.xml} ~~~
A backtick XML tag name may contain any non-empty sequence of ASCII and UTF-8 characters except white space and the backtick character. A backtick tag can be combined with member constraints and default member initializers: ~~~{.cpp} @ uint64_t SSN `tax-id` 0:1 = 999; ~~~ 🔝 [Back to table of contents](#) ### Qualified and unqualified members {#toxsd9-6} Class, struct, and union data members are mapped to namespace qualified or unqualified tag names of local elements and attributes. If a data member has no prefix then the default form of qualification is applied based on the element/attribute form that is declared with the XML schema of the class, struct, or union type. If the member name has a namespace prefix by colon notation, then the prefix overrules the default (un)qualified form. Therefore, [colon notation](#toxsd2) is an effective mechanism to control qualification of tag names of individual members of classes, structs, and unions. The XML schema elementFormDefault and attributeFormDefault declarations control the tag name qualification of local elements and attributes, respectively. - "unqualified" indicates that local elements/attributes are not qualified with the namespace prefix. - "qualified" indicates that local elements/attributes must be qualified with the namespace prefix. Individual schema declarations of local elements and attributes may overrule this by using the form declaration in an XML schema and by using colon notation to add namespace prefixes to class, struct, and union members in the header file for soapcpp2. Consider for example an `ns__record` class in the `ns` namespace in which local elements are qualified and local attributes are unqualified by default: ~~~{.cpp} //gsoap ns schema namespace: urn:types //gsoap ns schema elementForm: qualified //gsoap ns schema attributeForm: unqualified class ns__record { public: @ std::string name; @ uint64_t SSN; ns__record *spouse; }; ~~~ This class maps to a complexType in the soapcpp2-generated XML schema with targetNamespace "urn:types", elementFormDefault qualified and attributeFormDefault unqualified:
~~~{.xml} ~~~
An example XML instance of `ns__record` is:
~~~{.xml} name="Jane" SSN="1987654320"> ~~~
Here the root element `` is qualified because it is a root element of the XML schema with target namespace "urn:types". Its local element `` is namespace qualified because the elementFormDefault of local elements is qualified. Attributes are unqualified. The default namespace (un)qualification of local elements and attributes can be overruled by adding a prefix to the member name by using colon notation: ~~~{.cpp} //gsoap ns schema namespace: urn:types //gsoap ns schema elementForm: qualified //gsoap ns schema attributeForm: unqualified class ns__record { public: @ std::string ns:name; // 'ns:' qualified @ uint64_t SSN; ns__record *:spouse; // ':' unqualified (empty prefix) }; ~~~ The colon notation for member `ns:name` forces qualification of its attribute tag in XML. The colon notation for member `:spouse` removes qualification from its local element tag:
~~~{.xml} ~~~
XML instances of `ns__record` have unqualified spouse elements and qualified ns:name attributes:
~~~{.xml} ns:name="Jane" SSN="1987654320"> ~~~
Members of a class or struct can also be prefixed using the `prefix__name` convention or using colon notation `prefix:name`. However, this has a different effect by referring to global (root) elements and attributes, see [document root element definitions](#toxsd9-7). [Backtick XML tags](#toxsd9-5-1) can be used in place of the member name annotations and will achieve the same effect as described when these tag names are (un)qualified (requires gSOAP 2.8.30 or greater). @note You must declare a target namespace with a `//gsoap ns schema namespace:` directive to enable the `elementForm` and `attributeForm` directives in order to generate valid XML schemas with soapcpp2. See [directives](#directives) for more details. 🔝 [Back to table of contents](#) ### Defining document root elements {#toxsd9-7} To define and reference XML document root elements we use type names that start with an underscore: ~~~{.cpp} class _ns__record ~~~ Alternatively, we can use a `typedef` to define a document root element with a given type: ~~~{.cpp} typedef ns__record _ns__record; ~~~ This `typedef` maps to a global root element that is added to the soapcpp2-generated XML schema:
~~~{.xml} ~~~
An example XML instance of `_ns__record` is:
~~~{.xml} Joe 1234567890 Jane 1987654320 ~~~
Global-level element/attribute definitions are also referenced and/or added to the generated XML schema when serializable data members reference these by their qualified name: ~~~{.cpp} typedef std::string _ns__name 1 : 100; class _ns__record { public: @ _QName xsi__type; // built-in XSD attribute xsi:type _ns__name ns__name; // ref to global ns:name element uint64_t SSN; _ns__record *spouse; }; ~~~ These types map to the following comonents in the soapcpp2-generated XML schema:
~~~{.xml} ~~~
Use only use qualified member names when their types match the global-level element types that they refer to. For example: ~~~{.cpp} typedef std::string _ns__name; // global element ns:name of type xsd:string class _ns__record { public: int ns__name; // BAD: global element ns:name is NOT type int _ns__record ns__record; // OK: ns:record is a global-level root element ... }; ~~~ Therefore, we recommend to use qualified member names only when necessary to refer to standard XSD elements and attributes, such as `xsi__type`, and `xsd__lang`. By contrast, colon notation has the desired effect to (un)qualify local tag names by overruling the default element/attribute namespace qualification, see [qualified and unqualified members](#toxsd9-6). As an alternative to prefixing member names, use the backtick tag (requires gSOAP 2.8.30 or greater): ~~~{.cpp} typedef std::string _ns__name 1 : 100; class _ns__record { public: @ _QName t `xsi:type`; // built-in XSD attribute xsi:type _ns__name s `ns:name`; // ref to global ns:name element uint64_t SSN; _ns__record *spouse; }; ~~~ 🔝 [Back to table of contents](#) ### (Smart) pointer members and their occurrence constraints {#toxsd9-8} A public pointer-typed data member is serialized by following its (smart) pointer(s) to the value pointed to. To serialize pointers to dynamic arrays of data, please see the next section on [container and array members and their occurrence constraints](#toxsd9-9). Pointers that are NULL and smart pointers that are empty are serialized to produce omitted element and attribute values, unless an element is required and is nillable (struct/class members marked with `nullptr`) in which case the element is rendered as an empty element with `xsi:nil="true"`. To control the occurrence requirements of pointer-based data members, occurrence constraints are associated with data members in the form of a range `minOccurs : maxOccurs`. For non-repeatable (meaning, not a container or array) data members, there are only three reasonable occurrence constraints: - `0:0` means that this element or attribute is prohibited. - `0:1` means that this element or attribute is optional. - `1:1` means that this element or attribute is required. Pointer-based data members have a default `0:1` occurrence constraint, making them optional, and their XML schema local element/attribute definition is marked as nillable. Non-pointer data members have a default `1:1` occurence constraint, making them required. A `nullptr` occurrence constraint may be applicable to required elements that are nillable pointer types, thus `nullptr 1:1`. This indicates that the element is nillable (can be `NULL` or `nullptr`). A pointer data member that is explicitly marked as required and nillable with `nullptr 1:1` will be serialized as an element with an `xsi:nil` attribute, thus effectively revealing the NULL property of its value. A non-pointer data member that is explicitly marked as optional with `0:1` will be set to its default value when no XML value is presented to the deserializer. A default value can be assigned to a data member that has a primitive type or is a (smart) pointer to primitive type. Consider for example: ~~~{.cpp} class ns__record { public: std::shared_ptr name; // optional (pointer means minOccurs=0) uint64_t SSN 0:1 = 999; // force optional with default 999 ns__record *spouse nullptr 1:1; // force required and nillabe when absent }; ~~~ This class maps to a complexType in the soapcpp2-generated XML schema:
~~~{.xml} ~~~
An example XML instance of `ns__record` with its `name` string value set to `Joe`, `SSN` set to its default, and `spouse` set to NULL:
~~~{.xml} Joe 999 ~~~
@note In general, a smart pointer is simply declared as a `volatile` template in a interface header file for soapcpp2: ~~~{.cpp} volatile template class NAMESPACE::shared_ptr; ~~~ @note The soapcpp2 tool generates code that uses `NAMESPACE::shared_ptr` and `NAMESPACE::make_shared` to create shared pointers to objects, where `NAMESPACE` is any valid C++ namespace such as `std` and `boost` if you have Boost installed. 🔝 [Back to table of contents](#) ### Container and array members and their occurrence constraints {#toxsd9-9} Class and struct data member types that are containers `std::deque`, `std::list`, `std::vector` and `std::set` are serialized as a collection of the values they contain. You can also serialize dynamic arrays, which is the alternative for C to store collections of data. Let's start with STL containers. You can use `std::deque`, `std::list`, `std::vector`, and `std::set` containers by importing: ~~~{.cpp} #import "import/stl.h" // import all containers #import "import/stldeque.h" // import deque #import "import/stllist.h" // import list #import "import/stlvector.h" // import vector #import "import/stlset.h" // import set ~~~ For example, to use a vector data mamber to store names in a record: ~~~{.cpp} #import "import/stlvector.h" class ns__record { public: std::vector names; uint64_t SSN; }; ~~~ To limit the number of names in the vector within reasonable bounds, occurrence constraints are associated with the container. Occurrence constraints are of the form `minOccurs : maxOccurs`: ~~~{.cpp} #import "import/stlvector.h" class ns__record { public: std::vector names 1:10; uint64_t SSN; }; ~~~ This class maps to a complexType in the soapcpp2-generated XML schema:
~~~{.xml} ~~~
@note In general, a container is simply declared as a template in an interface header file for soapcpp2. All class templates are considered containers (except when declared `volatile`, see smart pointers). For example, `std::vector` is declared in `gsoap/import/stlvector.h` as: ~~~{.cpp} template class std::vector; ~~~ @note You can define and use your own containers. The soapcpp2 tool generates code that uses the following members of the `template class C` container: ~~~{.cpp} void C::clear() C::iterator C::begin() C::const_iterator C::begin() const C::iterator C::end() C::const_iterator C::end() const size_t C::size() const C::iterator C::insert(C::iterator pos, const T& val) ~~~ @note For more details see the example `simple_vector` container with documentation in the package under `gsoap/samples/template`. Because C does not support a container template library, we can use a dynamically-sized array of values. This array is declared as a size-pointer pair of members within a struct or class. The array size information is stored in a special size tag member with the name `__size` or `__sizeX`, where `X` can be any name, or by an `$int` member to identify the member as a special size tag: ~~~{.cpp} struct ns__record { $ int sizeofnames; // array size char* *names; // array of char* names uint64_t SSN; }; ~~~ This struct maps to a complexType in the soapcpp2-generated XML schema:
~~~{.xml} ~~~
To limit the number of names in the array within reasonable bounds, occurrence constraints are associated with the array size member. Occurrence constraints are of the form `minOccurs : maxOccurs`: ~~~{.cpp} struct ns__record { $ int sizeofnames 1:10; // array size 1..10 char* *names; // array of one to ten char* names uint64_t SSN; }; ~~~ This struct maps to a complexType in the soapcpp2-generated XML schema:
~~~{.xml} ~~~
Arrays can also be declared as nested elements, similar to SOAP-encoded dynamic arrays, and these arrays can be used with or without SOAP applications. This requires a separate struct or class with the name of the SOAP array, which should not be qualified with a namespace prefix: ~~~{.cpp} struct ArrayOfstring { char* *__ptr 1:100; // array of 1..100 strings int __size; // array size }; struct ns__record { struct ArrayOfstring names; // array of char* names uint64_t SSN; }; ~~~ The `ns__record` struct maps to a complexType that references the `ArrayOfstring` complexType with an sequence of 1 to 100 `item` elements:
~~~{.xml} ~~~
To change the `item` element name in the WSDL, XML schema, and XML messages, use `__ptrName` where `Name` is the name you want to use. @note When `soapcpp2 -e` option `-e` is used, the `ArrayOfstring` becomes a SOAP-encoded array for SOAP 1.1/1.2 RPC encoded messaging:
~~~{.xml} ~~~
Fixed-size arrays can be used to store a fixed number of values: ~~~{.cpp} struct ns__record { char* names[10]; // array of 10 char* names uint64_t SSN; }; ~~~ The fixed-size array is similar to a SOAP-encoded array, which can be used with or without SOAP applications. This struct maps to a complexType that references a `Array10Ofstring` complexType with ten `item` elements:
~~~{.xml} ~~~
@note When `soapcpp2 -e` option `-e` is used, the `Array10Ofstring` becomes a SOAP-encoded array for SOAP 1.1/1.2 RPC encoded messaging, see previous note. 🔝 [Back to table of contents](#) ### Sequencing with hidden members {#toxsd9-10} A member becomes a hidden XML element, i.e. not visibly rendered in XML, when its name starts with a double underscore. This makes it possible to sequence a collection of data members, basically by forming a sequence of elements that can be optional or repeated together. To create a sequence of members that are optional, use a pointer-based hidden member that is a struct with the collection of members to sequence: ~~~{.cpp} struct ns__record { std::string name; // required name struct __ns__optional { uint64_t SSN; // SSN in optional group std::string phone; // phone number in optional group } *__optional; // optional group }; ~~~ Here we used a hidden struct type `__ns__optional` which starts with a double underscore, because we do not want to define a new global type for the XML schema we generate. We just need a unique name for a structure that sequences the two members. This struct maps to a complexType in the soapcpp2-generated XML schema:
~~~{.xml} ~~~
The `name` member is a required element of the `ns:record` complexType. The `ns:record` complexType has an optional sequence of `SSN` and `phone` elements. To create repetitions of a sequence of members, use an array as follows: ~~~{.cpp} struct ns__record { std::string name; // required name $ int sizeofarray; // size of group array struct __ns__array { uint64_t SSN; // SSN in group std::string phone; // phone number in group } *__array; // group array }; ~~~ This struct maps to a complexType in the soapcpp2-generated XML schema:
~~~{.xml} ~~~
The `name` member is a required element of the `ns:record` complexType. The `ns:record` complexType has a potentially unbounded sequence of `SSN` and `phone` elements. You can specify array bounds instead of zero to unbounded, see [container and array members and their occurrence constraints](#toxsd9-9). The XML value space consists of a sequence of SSN and phone elements:
~~~{.xml} numbers 1234567890 555-123-4567 1987654320 555-789-1234 2345678901 555-987-6543 ~~~
🔝 [Back to table of contents](#) ### Tagged union members {#toxsd9-11} A union member in a class or in a struct cannot be serialized unless a discriminating *variant selector* member is provided that tells the serializer which union field to serialize. This effectively creates a *tagged union*. The variant selector is associated with the union as a selector-union pair of members. The variant selector is a member with the name `__union` or `__unionX`, where `X` can be any name, or by an `$int` member to identify the member as a variant selector tag: ~~~{.cpp} class ns__record { public: $ int xORnORs; // variant selector with values SOAP_UNION_fieldname union ns__choice { float x; int n; char *s; } u; std::string name; }; ~~~ The variant selector values are auto-generated based on the union name `choice` and the names of its members `x`, `n`, and `s`: - `xORnORs = SOAP_UNION_ns__choice_x` when `u.x` is valid. - `xORnORs = SOAP_UNION_ns__choice_n` when `u.n` is valid. - `xORnORs = SOAP_UNION_ns__choice_s` when `u.s` is valid. - `xORnORs = 0` when none are valid (should only be used with great care, because XSD validation may fail when content is required but absent). This class maps to a complexType with a sequence and choice in the soapcpp2-generated XML schema:
~~~{.xml} ~~~
An STL container or dynamic array of a union requires wrapping the variant selector and union member in a struct: ~~~{.cpp} class ns__record { public: std::vector< struct ns__data // data with a choice of x, n, or s { $ int xORnORs; // variant selector with values SOAP_UNION_fieldname union ns__choice { float x; int n; char *s; } u; }> data; // vector with data }; ~~~ and an equivalent definition with a dynamic array instead of a `std::vector` (you can use this in C with structs): ~~~{.cpp} class ns__record { public: $ int sizeOfdata; // size of dynamic array struct ns__data // data with a choice of x, n, or s { $ int xORnORs; // variant selector with values SOAP_UNION_fieldname union ns__choice { float x; int n; char *s; } u; } *data; // points to the data array of length sizeOfdata }; ~~~ This maps to two complexTypes in the soapcpp2-generated XML schema:
~~~{.xml} ~~~
The XML value space consists of a sequence of item elements each wrapped in an data element:
~~~{.xml} 123 3.1 hello world ~~~
To remove the wrapping data element, simply rename the wrapping struct to `__ns__data` and the member to `__data` to make this member invisible to the serializer. The double underscore prefix naming convention is used for the struct name and member name. Also use a dynamic array instead of a STL container (so you can also use this approach in C with structs): ~~~{.cpp} class ns__record { public: $ int sizeOfdata; // size of dynamic array struct __ns__data // contains choice of x, n, or s { $ int xORnORs; // variant selector with values SOAP_UNION_fieldname union ns__choice { float x; int n; char *s; } u; } *__data; // points to the data array of length sizeOfdata }; ~~~ This maps to a complexType in the soapcpp2-generated XML schema:
~~~{.xml} ~~~
The XML value space consists of a sequence of ``, ``, and/or `` elements:
~~~{.xml} 123 3.1 hello world ~~~
Please note that structs, classes, and unions are unnested by soapcpp2 (as in the C standard of nested structs and unions). Therefore, the `ns__choice` union in the `ns__record` class is redeclared at the top level despite its nesting within the `ns__record` class. This means that you will have to choose a unique name for each nested struct, class, and union. 🔝 [Back to table of contents](#) ### Tagged void pointer members {#toxsd9-12} To serialize data pointed to by `void*` requires run-time type information that tells the serializer what type of data to serialize by means of a *tagged void pointer*. This type information is stored in a special type tag member of a struct/class with the name `__type` or `__typeX`, where `X` can be any name, or alternatively by an `$int` special member of any name as a type tag: ~~~{.cpp} class ns__record { public: $ int typeOfdata; // type tag with values SOAP_TYPE_T void *data; // points to some data of type T }; ~~~ A type tag member has nonzero values `SOAP_TYPE_T` where `T` is the name of a struct/class or the name of a primitive type, such as `int`, `std__string` (for `std::string`), `string` (for `char*`). This class maps to a complexType with a sequence in the soapcpp2-generated XML schema:
~~~{.xml} ~~~
The XML value space consists of the XML value space of the type with the addition of an `xsi:type` attribute to the enveloping element:
~~~{.xml} 123 ~~~
This `xsi:type` attribute is important for the receiving end to distinguish the type of data to instantiate. The receiver cannot deserialize the data without an `xsd:type` attribute. You can find the `SOAP_TYPE_T` name of each serializable type in the auto-generated `soapStub.h` file. Also all serializable C++ classes have a virtual `int T::soap_type()` member that returns their `SOAP_TYPE_T` value that you can use. When the `void*` pointer is NULL or when `typeOfdata` is zero, the data is not serialized. An STL container or dynamic array of `void*` pointers to `xsd:anyType` data requires wrapping the type tag and `void*` members in a struct: ~~~{.cpp} class ns__record { public: std::vector< struct ns__data // data with an xsd:anyType item { $ int typeOfitem; // type tag with values SOAP_TYPE_T void *item; // points to some item of type T }> data; // vector with data }; ~~~ and an equivalent definition with a dynamic array instead of a `std::vector` (you can use this in C with structs): ~~~{.cpp} class ns__record { public: $ int sizeOfdata; // size of dynamic array struct ns__data // data with an xsd:anyType item { $ int typeOfitem; // type tag with values SOAP_TYPE_T void *item; // points to some item of type T } *data; // points to the data array of length sizeOfdata }; ~~~ This maps to two complexTypes in the soapcpp2-generated XML schema:
~~~{.xml} ~~~
The XML value space consists of a sequence of item elements each wrapped in a data element:
~~~{.xml} 123 3.1 abc ~~~
To remove the wrapping data elements, simply rename the wrapping struct and member to `__data` to make this member invisible to the serializer with the double underscore prefix naming convention. Also use a dynamic array instead of a STL container (you can use this in C with structs): ~~~{.cpp} class ns__record { public: $ int sizeOfdata; // size of dynamic array struct __data // contains xsd:anyType item { $ int typeOfitem; // type tag with values SOAP_TYPE_T void *item; // points to some item of type T } *__data; // points to the data array of length sizeOfdata }; ~~~ This maps to a complexType in the soapcpp2-generated XML schema:
~~~{.xml} ~~~
The XML value space consists of a sequence of data elements:
~~~{.xml} 123 3.1 abc ~~~
Again, please note that structs, classes, and unions are unnested by soapcpp2 (as in the C standard of nested structs and unions). Therefore, the `__data` struct in the `ns__record` class is redeclared at the top level despite its nesting within the `ns__record` class. This means that you will have to choose a unique name for each nested struct, class, and union. @see Section [XSD type bindings](#typemap2). 🔝 [Back to table of contents](#) ### Adding get and set methods {#toxsd9-13} A public `get` method may be added to a class or struct, which will be triggered by the deserializer. This method will be invoked right after the instance is populated by the deserializer. The `get` method can be used to update or verify deserialized content. It should return `SOAP_OK` or set `soap::error` to a nonzero error code and return it. A public `set` method may be added to a class or struct, which will be triggered by the serializer. The method will be invoked just before the instance is serialized. Likewise, the `set` method should return `SOAP_OK` or set set `soap::error` to a nonzero error code and return it. For example, adding a `set` and `get` method to a class declaration: ~~~{.cpp} class ns__record { public: int set(struct soap*); // triggered before serialization int get(struct soap*); // triggered after deserialization ... }; ~~~ To add these and othe rmethods to classes and structs with wsdl2h and `typemap.dat`, please see [class/struct member additions](#typemap3). 🔝 [Back to table of contents](#) ### Operations on classes and structs {#toxsd9-14} The following functions/macros are generated by soapcpp2 for each type `T`, which should make it easier to send, receive, and copy XML data in C and in C++: - `int soap_write_T(struct soap*, T*)` writes an instance of `T` to a file via file descriptor `int soap::sendfd)` or to a stream via `std::ostream *soap::os` (C++ only) or saves into a NUL-terminated string by setting `const char **soap::os` to a string pointer to be set (C only). Returns `SOAP_OK` on success or an error code, also stored in `soap::error`. - `int soap_read_T(struct soap*, T*)` reads an instance of `T` from a file via file descriptor `int soap::recvfd)` or from a stream via `std::istream *soap::is` (C++ only) or reads from a NUL-termianted string `const char *soap::is` (C only). Returns `SOAP_OK` on success or an error code, also stored in `soap::error`. - `void soap_default_T(struct soap*, T*)` sets an instance `T` to its default value, resetting members of a struct to their initial values (for classes we use method `T::soap_default`, see below). If `T` is a struct that has a `soap` pointer member to a `::soap` context then this pointer member will be set to the first argument passed to this function to initialize its `soap` pointer member. - `T * soap_dup_T(struct soap*, T *dst, const T *src)` (requires `soapcpp2 -Ec`) deep copy `src` into `dst`, replicating all deep cycles and shared pointers when a managing `soap` context is provided as argument. When `dst` is NULL, allocates space for `dst` and returns a pointer to the allocated copy. Deep copy results in a tree when the `soap` context is NULL, but the presence of deep cycles will lead to non-termination. Use flag `SOAP_XML_TREE` with managing context to copy into a tree without cycles and pointers to shared objects. Returns `dst` or allocated copy when `dst` is NULL. - `void soap_del_T(const T*)` (requires `soapcpp2 -Ed`) deletes all heap-allocated members of this object by deep deletion ONLY IF this object and all of its (deep) members are not managed by a `soap` context AND the deep structure is a tree (no cycles and co-referenced objects by way of multiple (non-smart) pointers pointing to the same data). Can be safely used after `T * soap_dup_T(NULL, NULL, const T*)` to delete the deep copy returned. Does not delete the object itself. When in C++ mode, soapcpp2 tool adds several methods to classes in addition to adding a default constructor and destructor (when these were not explicitly declared). The public methods added to a class `T`: - `virtual int T::soap_type(void)` returns a unique type ID (`SOAP_TYPE_T`). This numeric ID can be used to distinguish base from derived instances. - `virtual void T::soap_default(struct soap*)` sets all data members to default values. If class `T` has a `soap` pointer member to a `::soap` context then this pointer member will be set to the argument passed to this function to initialize its `soap` pointer member. - `virtual void T::soap_serialize(struct soap*) const` serializes object to prepare for SOAP 1.1/1.2 encoded output (or with `SOAP_XML_GRAPH`) by analyzing its (cyclic) structures. - `virtual int T::soap_put(struct soap*, const char *tag, const char *type) const` emits object in XML, compliant with SOAP 1.1 encoding style, return error code or `SOAP_OK`. Requires `soap_begin_send(soap)` and `soap_end_send(soap)`. - `virtual int T::soap_out(struct soap*, const char *tag, int id, const char *type) const` emits object in XML, with tag and optional id attribute and `xsi:type`, return error code or `SOAP_OK`. Requires `soap_begin_send(soap)` and `soap_end_send(soap)`. - `virtual void * T::soap_get(struct soap*, const char *tag, const char *type)` Get object from XML, compliant with SOAP 1.1 encoding style, return pointer to object or NULL on error. Requires `soap_begin_recv(soap)` and `soap_end_recv(soap)`. - `virtual void *soap_in(struct soap*, const char *tag, const char *type)` Get object from XML, with matching tag and type (NULL matches any tag and type), return pointer to object or NULL on error. Requires `soap_begin_recv(soap)` and `soap_end_recv(soap)` - `virtual T * T::soap_alloc(void) const` returns a new object of type `T`, default initialized and not managed by a `soap` context. - `virtual T * T::soap_dup(struct soap*) const` (requires `soapcpp2 -Ec`) returns a duplicate of this object by deep copying, replicating all deep cycles and shared pointers when a managing `soap` context is provided as argument. Deep copy is a tree when argument is NULL, but the presence of deep cycles will lead to non-termination. Use flag `SOAP_XML_TREE` with the managing context to copy into a tree without cycles and pointers to shared objects. - `virtual void T::soap_del() const` (rquires `soapcpp2 -Ed`) deletes all heap-allocated members of this object by deep deletion ONLY IF this object and all of its (deep) members are not managed by a `soap` context AND the deep structure is a tree (no cycles and co-referenced objects by way of multiple (non-smart) pointers pointing to the same data). Can be safely used after `soap_dup(NULL)` to delete the deep copy. Does not delete the object itself. Also, there are four variations of `soap_new_T` for class/struct/template type `T` that soapcpp2 auto-generates to create instances on a context-managed heap: - `T * soap_new_T(struct soap*)` returns a new instance of `T` with default data member initializations that are set with the soapcpp2 auto-generated `void T::soap_default(struct soap*)` method), but ONLY IF the soapcpp2 auto-generated default constructor is used that invokes `soap_default()` and was not replaced by a user-defined default constructor. - `T * soap_new_T(struct soap*, int n)` returns an array of `n` new instances of `T`. Similar to the above, instances are initialized. - `T * soap_new_req_T(struct soap*, ...)` returns a new instance of `T` and sets the required data members to the values specified in `...`. The required data members are those with nonzero minOccurs, see the subsections on [(smart) pointer members and their occurrence constraints](#toxsd9-8) and [container and array members and their occurrence constraints](#toxsd9-9). - `T * soap_new_set_T(struct soap*, ...)` returns a new instance of `T` and sets the public/serializable data members to the values specified in `...`. The above functions can be invoked with a NULL `soap` context, but we will be responsible to use `delete T` to remove this instance from the unmanaged heap. 🔝 [Back to table of contents](#) Special classes and structs {#toxsd10} --------------------------- The following applies to both structs and classes. The examples show classes in C++. For C, use structs and omit the C++ features. Structs also require the use of the `struct` keyword, otherwise soapcpp2 will throw a syntax error. ### SOAP-encoded arrays {#toxsd10-1} A class or struct with the following layout is a one-dimensional SOAP-encoded array type: ~~~{.cpp} class ArrayOfT { public: T *__ptr; // array pointer int __size; // array size }; ~~~ where `T` is the array element type. A multidimensional SOAP Array is: ~~~{.cpp} class ArrayOfT { public: T *__ptr; // array pointer int __size[N]; // array size of each dimension }; ~~~ where `N` is the constant number of dimensions. The pointer points to an array of `__size[0]*__size[1]* ... * __size[N-1]` elements. This maps to a complexType restriction of SOAP-ENC:Array in the soapcpp2-generated XML schema:
~~~{.xml} ~~~
The name of the class can be arbitrary. We often use `ArrayOfT` without a prefix to distinguish arrays from other classes and structs. With SOAP 1.1 encoding, an optional offset member can be added that controls the start of the index range for each dimension: ~~~{.cpp} class ArrayOfT { public: T *__ptr; // array pointer int __size[N]; // array size of each dimension int __offset[N]; // array offsets to start each dimension }; ~~~ For example, we can define a matrix of floats as follows: ~~~{.cpp} class Matrix { public: double *__ptr; int __size[2]; }; ~~~ The following code populates the matrix and serializes it in XML: ~~~{.cpp} soap *soap = soap_new1(SOAP_XML_INDENT); Matrix A; double a[6] = { 1, 2, 3, 4, 5, 6 }; A.__ptr = a; A.__size[0] = 2; A.__size[1] = 3; soap_write_Matrix(soap, &A); ~~~ Matrix A is serialized as an array with 2x3 values:
~~~{.xml} 1 2 3 4 5 6 ~~~
🔝 [Back to table of contents](#) ### XSD hexBinary and base64Binary types {#toxsd10-2} A special case of a one-dimensional array is used to define `xsd:hexBinary` and `xsd:base64Binary` types when the pointer type is `unsigned char`: ~~~{.cpp} class xsd__hexBinary { public: unsigned char *__ptr; // points to raw binary data int __size; // size of data }; ~~~ and ~~~{.cpp} class xsd__base64Binary { public: unsigned char *__ptr; // points to raw binary data int __size; // size of data }; ~~~ To create a new binary type, use either one of the following three forms that declare a new `ns__binary` type that is a `simpleType` restriction of `xsd:base64Binary`: ~~~{.cpp} typedef xsd__base64Binary ns__binary; ~~~ ~~~{.cpp} class ns__binary : public xsd__base64Binary { ... // attribute members (@) and class methods }; ~~~ ~~~{.cpp} class ns__binary { public: unsigned char *__ptr; // points to raw binary data int __size; // size of data ... // attribute members (@) and class methods (optional) }; ~~~ Here, `xsd__base64Binary` is reused in the first two cases, where `xsd__base64Binary` is declared as shown above. @see [DIME/MIME/MTOM attachment binary types](#toxsd10-3) 🔝 [Back to table of contents](#) ### DIME/MIME/MTOM attachment binary types {#toxsd10-3} A class or struct with a binary content layout can be extended to support attachments. The following struct or class type can be used as DIME, MIME, and MTOM attachment and also be used for `xsd:base64Binary` type values: ~~~{.cpp} class xsd__base64Binary { public: unsigned char *__ptr; // points to raw binary data int __size; // size of data char *id; // NULL to generate an id, or set to a unique UUID char *type; // MIME type of the data char *options; // optional description of MIME attachment }; ~~~ When the `id`, `type`, or `options` members are non-NULL, an attachment will be used instead of base64 XML content. DIME attachments are the default. To switch to MIME use the `SOAP_ENC_MIME` context flag. To switch to MTOM use the `SOAP_ENC_MTOM` context flag. MTOM is typically used with XOP `` elements, which is preferred and declared as follows: ~~~{.cpp} //gsoap xop schema import: http://www.w3.org/2004/08/xop/include class _xop__Include { public: unsigned char *__ptr; // points to raw binary data int __size; // size of data char *id; // NULL to generate an id, or set to a unique UUID char *type; // MIME type of the data char *options; // optional description of MIME attachment }; ~~~ Attachments are beyond the scope of this article. See the [gSOAP user guide.](../../guide/html/index.html) for more details. 🔝 [Back to table of contents](#) ### Wrapper class/struct with simpleContent {#toxsd10-4} A class or struct with the following layout is a complexType that wraps simpleContent: ~~~{.cpp} class ns__simple { public: T __item; // primitive type for the simpleContent ... // attribute members (@) and class methods (optional) }; ~~~ The type `T` is a primitive type (`bool`, `enum`, `time_t`, numeric and string types), `xsd__hexBinary`, `xsd__base64Binary`, and custom serializers, such as `xsd__dateTime`. This maps to a complexType with simpleContent in the soapcpp2-generated XML schema:
~~~{.xml} ~~~
A wrapper class/struct may include any number of members that are declared as attributes with `@`, which should be placed after the `__item` member. 🔝 [Back to table of contents](#) ### DOM anyType and anyAttribute {#toxsd10-5} Use of a DOM is optional and enabled by `#import "dom.h"` to use the DOM `xsd__anyType` element node and `xsd__anyAttribute` attribute node: ~~~{.cpp} #import "dom.h" class ns__record { public: @ xsd__anyAttribute attributes; // optional DOM attributes xsd__anyType *name; // optional DOM element (pointer means minOccurs=0) xsd__anyType address; // required DOM element (minOccurs=1) xsd__anyType email 0; // optional DOM element (minOccurs=0) ... // other members }; ~~~ where `name` contains XML stored in a DOM node set and `attributes` is a list of all visibly rendered attributes. The name `attributes` is arbitrary and any name will suffice. You should place the `xsd__anyType` members at the end of the struct or class. This ensures that the DOM members are populated last as a "catch all". A member name starting with double underscore is a wildcard member. These members are placed at the end of a struct or class automatically by soapcpp2. An `#import "dom.h"` import is automatically added by `wsdl2h -d` with option `-d` to bind `xsd:anyType` to DOM nodes, and also to populate `xsd:any`, `xsd:anyAttribute` and `xsd:mixed` XML content: ~~~{.cpp} #import "dom.h" class ns__record { public: @ xsd__anyAttribute __anyAttribute; // optional DOM attributes std::vector __any 0; // optional DOM elements (minOccurs=0) xsd__anyType __mixed 0; // optional mixed content (minOccurs=0) ... // other members }; ~~~ where the members prefixed with `__` are "invisible" to the XML parser, meaning that these members are not bound to XML tag names. In C you can use a dynamic arrary instead of `std::vector`: ~~~{.cpp} #import "dom.h" struct ns__record { @ xsd__anyAttribute __anyAttribute; // optional DOM attributes $ int __sizeOfany; // size of the array xsd__anyType *__any; // optional DOM elements (pointer means minOccurs=0) xsd__anyType __mixed 0; // optional mixed content (minOccurs=0) ... // other members }; ~~~ Classes can inherit DOM, which enables full use of polymorphism with one base DOM class: ~~~{.cpp} #import "dom.h" class ns__record : public xsd__anyType { public: std::vector array; // array of objects of any class ... // other members }; ~~~ This permits an `xsd__anyType` pointer to refer to a derived class such as `ns__record`, which will be serialized with an `xsi:type` attribute that is set to "ns:record". The `xsi:type` attributes add the necessary type information to distinguish the XML content from the DOM base type. This is important for the receiving end: without `xsd:type` attributes with type names, only base DOM objects are recognized and instantiated. Because C lacks object-oriented programming concepts such as class inheritance and polymorphism, you should consider using [derived types in C and C++](#toxsd9-1-1). An alternative is to use the special [tagged void pointer members](#toxsd9-12) to serialize data pointed to by a `void*` member, which can be any serializable type, such as derived types. This approach uses `xsi:type` attributes to identify the type of value serialized. To ensure that wsdl2h generates pointer-based `xsd__anyType` DOM nodes with `wsdl2h -d` using option `-d` for `xsd:any`, add the following line to `typemap.dat`: xsd__any = | xsd__anyType* This lets wsdl2h produce class/struct members and containers with `xsd__anyType*` for `xsd:any` instead of `xsd__anyType`. To just force all `xsd:anyType` uses to be pointer-based, declare in `typemap.dat`: xsd__anyType = | xsd__anyType* If you use `wsdl2h -d -p` using options `-d` and `-p` then every class will inherit DOM as shown above. Without option `-d`, an `xsd__anyType` type is generated to serve as the root type in the type hierarchy: ~~~{.cpp} class xsd__anyType { _XML __item; struct soap *soap; }; class ns__record : public xsd__anyType { ... }; ~~~ where the `_XML __item` member holds any XML content as a literal XML string. To use the DOM API, compile `dom.c` (or `dom.cpp` for C++), or link the gSOAP library with `-lgsoapssl` (or `-lgsoapssl++` for C++). @see Documentation of [XML DOM and XPath](http://www.genivia.com/doc/dom/html) for more details. 🔝 [Back to table of contents](#) Directives {#directives} ========== You can use `//gsoap` directives in the interface header file with the data binding interface for soapcpp2. These directives are used to configure the code generated by soapcpp2 by declaring various. properties of Web services and XML schemas. When using the wsdl2h tool, you will notice that wsdl2h generates directives automatically based on the WSDL and XSD input. Service directives are applicable to service and operations described by WSDL. Schema directives are applicable to types, elements, and attributes defined by XML schemas. 🔝 [Back to table of contents](#) Service directives {#directives-1} ------------------ A service directive must start at a new line and is of the form: ~~~{.cpp} //gsoap service : ~~~ where `` is the XML namespace prefix of a service binding. The `` and `` fields are one of the following: property | value --------------- | ----- `name` | name of the service, optionally followed by text describing the service `namespace` | URI of the WSDL targetNamespace `documentation` | text describing the service (see also the `name` property), multiple permitted `doc` | an alias for the `documentation` property `style` | `document` (default) SOAP messaging style or `rpc` for SOAP RPC `encoding` | `literal` (default), `encoded` for SOAP encoding, or a custom URI `protocol` | specifies SOAP or REST, see below `port` | URL of the service endpoint, usually an http or https address, to use in the WSDL definitions/service/port/address/\@location `location` | an alias for the `port` property `endpoint` | an alias for the `port` property `transport` | URI declaration of the transport, usually `http://schemas.xmlsoap.org/soap/http` `definitions` | name of the WSDL definitions/\@name `type` | name of the WSDL definitions/portType/\@name (WSDL2.0 interface/\@name) `portType` | an alias for the `type` property (`portType` follows SOAP 1.1 naming conventions) `interface` | an alias for the `type` property (`interface` follows SOAP 1.2 naming conventions) `binding` | name of the WSDL definitions/binding/\@name `portName` | name of the WSDL definitions/service/port/\@name `executable` | name of the "executable" to use in the WSDL definitions/service/port/address/\@location The service `name` and `namespace` properties are required in order to generate a valid WSDL with soapcpp2. The other properties are optional. The `style` and `encoding` property defaults are changed with `soapcpp2 -e` option `-e` to `rpc` and `encoded`, respectively. The `protocol` property is `SOAP` by default (SOAP 1.1). Protocol property values are: protocol value | description -------------- | ----------- `SOAP` | SOAP transport, supporting both SOAP 1.1 and 1.2 `SOAP1.1` | SOAP 1.1 transport (same as `soapcpp2 -1`) `SOAP1.2` | SOAP 1.2 transport (same as `soapcpp2 -2`) `SOAP-GET` | one-way SOAP 1.1 or 1.2 with HTTP GET `SOAP1.1-GET` | one-way SOAP 1.1 with HTTP GET `SOAP1.2-GET` | one-way SOAP 1.2 with HTTP GET `HTTP` | non-SOAP REST protocol with HTTP POST `POST` | non-SOAP REST protocol with HTTP POST `GET` | non-SOAP REST protocol with HTTP GET `PUT` | non-SOAP REST protocol with HTTP PUT `DELETE` | non-SOAP REST protocol with HTTP DELETE You can bind service operations to the WSDL namespace of a service by using the namespace prefix as part of the identifier name of the function that defines the service operation: ~~~{.cpp} int prefix__func(arg1, arg2, ..., argn, result); ~~~ You can override the `port` endpoint URL at runtime in the auto-generated `soap_call_prefix__func` service call (C/C++ client side) and in the C++ proxy class service call. 🔝 [Back to table of contents](#) Service method directives {#directives-2} ------------------------- Service properties are applicable to a service and to all of its operations. Service method directives are specifically applicable to a service operation. A service method directive is of the form: ~~~{.cpp} //gsoap service method-: ~~~ where `` is the XML namespace prefix of a service binding and `` is the unqualified name of a service operation. The `` and `` fields are one of the following: method property | value --------------------------- | ----- `method-documentation` | text describing the service operation `method` | an alias for the `method-documentation` property `method-action` | `""` or URI SOAPAction HTTP header, or URL query string for REST protocols `method-input-action` | `""` or URI SOAPAction HTTP header of service request messages `method-output-action` | `""` or URI SOAPAction HTTP header of service response messages `method-fault-action` | `""` or URI SOAPAction HTTP header of service fault messages `method-header-part` | member name of the `SOAP_ENV__Header` struct used in SOAP Header `method-input-header-part` | member name of the `SOAP_ENV__Header` struct used in SOAP Headers of requests `method-output-header-part` | member name of the `SOAP_ENV__Header` struct used in SOAP Headers of responses `method-fault` | type name of a struct or class member used in `SOAP_ENV__Details` struct `method-mime-type` | REST content type or SOAP MIME attachment content type(s) `method-input-mime-type` | REST content type or SOAP MIME attachment content type(s) of request message `method-output-mime-type` | REST content type or SOAP MIME attachment content type(s) of response message `method-style` | `document` or `rpc` `method-encoding` | `literal`, `encoded`, or a custom URI for encodingStyle of messages `method-response-encoding` | `literal`, `encoded`, or a custom URI for encodingStyle of response messages `method-protocol` | SOAP or REST, see [service directives](#directives-1) The `method-header-part` properties can be repeated for a service operation to declare multiple SOAP Header parts that the service operation requires. You can use `method-input-header-part` and `method-output-header-part` to differentiate between request and response messages. The `method-fault` property can be repeated for a service operation to declare multiple faults that the service operation may return. The `method-action` property serves two purposes: -# To set the SOAPAction header for SOAP protocols, i.e. sets the definitions/binding/operation/SOAP:operation/\@soapAction. -# To set the URL query string for endpoints with REST protocols, i.e. sets the definitions/binding/operation/HTTP:operation/\@location, which specifies a URL query string (starts with a `?`) to complete the service endpoint URL or extends the endpoint URL with a local path (starts with a `/`). Use `method-input-action` and `method-output-action` to differentiate the SOAPAction between SOAP request and response messages. You can always override the port endpoint URL and action values at runtime in the auto-generated `soap_call_prefix__func` service call (C/C++ client side) and in the auto-generated C++ proxy class service calls. A runtime NULL endpoint URL and/or action uses the defaults set by these directives. The `method-mime-type` property serves two purposes: -# To set the type of MIME/MTOM attachments used with SOAP protocols. Multiple attachment types can be declared for a SOAP service operation, i.e. adds definitions/binding/operation/input/MIME:multipartRelated/MIME:part/MIME:content/\@type for each type specified. -# To set the MIME type of a REST operation. This replaces XML declared in WSDL by definitions/binding/operation/(input|output)/MIME:mimeXml with MIME:content/\@type. Use `application/x-www-form-urlencoded` with REST POST and PUT protocols to send encoded form data automatically instead of XML. Only primitive type values can be transmitted with form data, such as numbers and strings, i.e. only types that are legal to use as [attributes members](#toxsd9-5). Use `method-input-mime-type` and `method-output-mime-type` to differentiate the attachment types between request and response messages. 🔝 [Back to table of contents](#) Schema directives {#directives-3} ----------------- A schema directive is of the form: ~~~{.cpp} //gsoap schema : ~~~ where `` is the XML namespace prefix of a schema. The `` and `` fields are one of the following: property | value --------------- | ----- `namespace` | URI of the XSD targetNamespace `namespace2` | alternate URI pattern for the XSD namespace (i.e. URI is also accepted by the XML parser) `import` | URI of an imported namespace, as an alternative or in addition to `namespace`, adds `xsd:import` to the generated WSDL and XSD files `form` | `unqualified` (default) or `qualified` local element and attribute form defaults `elementForm` | `unqualified` (default) or `qualified` local element form default `attributeForm` | `unqualified` (default) or `qualified` local attribute form default `typed` | `no` (default) or `yes` for serializers to add `xsi:type` attributes to XML To learn more about the local form defaults, see [qualified and unqualified members.](#toxsd9-6) The `namespace2` URI is a pattern with `*` matching any sequence of characters and `-` matching any character. This pattern instructs the XML parser and validator to also accept the URI pattern as a valid namespace for the specified ``. The `typed` property is implicitly `yes` when `soapcpp2 -t` option `-t` is used. 🔝 [Back to table of contents](#) Schema type directives {#directives-4} ---------------------- A schema type directive is of the form: ~~~{.cpp} //gsoap schema type-: //gsoap schema type-: :: ~~~ where `` is the XML namespace prefix of a schema and `` is an unqualified name of a C/C++ type, and the optional `` is a class/struct members or enum constant. You can describe a type with one of the following: type property | value -------------------- | ----- `type-documentation` | text describing the schema type `type` | an alias for the `type-documentation` property For example, you can add a description to an enumeration: ~~~{.cpp} //gsoap ns schema type: Vowels The letters A, E, I, O, U, and sometimes Y //gsoap ns schema type: Vowels::Y A vowel, sometimes enum class ns__Vowels : char { A = 'A', E = 'E', I = 'I', O = 'O', U = 'U', Y = 'Y' }; ~~~ This documented enumeration maps to a simpleType restriction of `xsd:string` in the soapcpp2-generated schema:
~~~{.xml} The letters A, E, I, O, U, and sometimes Y A vowel, sometimes ~~~
🔝 [Back to table of contents](#) Serialization rules {#rules} =================== A presentation on XML data bindings is not complete without discussing the serialization rules and options that put your data in XML on the wire or store it a file or buffer. There are several options to choose from to serialize data in XML. The choice depends on the use of the SOAP protocol or if SOAP is not required. The wsdl2h tool automates this for you by taking the WSDL transport bindings into account when generating the service functions in C and C++ that use SOAP or REST. The gSOAP tools are not limited to SOAP. The tools implement generic XML data bindings for SOAP, REST, and other uses of XML. So you can read and write XML using the serializing [operations on classes and structs](#toxsd9-14). The following sections briefly explain the serialization rules with respect to the SOAP protocol for XML Web services. A basic understanding of the SOAP protocol is useful when developing client and server applications that must interoperate with other SOAP applications. SOAP/REST Web service client and service operations are represented as functions in your interface header file with the data binding interface for soapcpp2. The soapcpp2 tool will translate these function to client-side service invocation calls and server-side service operation dispatchers. A discussion of SOAP clients and servers is beyond the scope of this article. However, the SOAP options discussed here also apply to SOAP client and server development. 🔝 [Back to table of contents](#) SOAP document versus rpc style {#doc-rpc} ------------------------------ The `wsdl:binding/soap:binding/@style` attribute in the `` section of a WSDL is either "document" or "rpc". The "rpc" style refers to SOAP RPC (Remote Procedure Call), which is more restrictive than the "document" style by requiring one XML element in the SOAP Body to act as the procedure name with XML subelements as its parameters. For example, the following directives in the interface header file for soapcpp2 declare that `DBupdate` is a SOAP RPC encoding service method: ~~~{.cpp} //gsoap ns service namespace: urn:DB //gsoap ns service method-protocol: DBupdate SOAP //gsoap ns service method-style: DBupdate rpc int ns__DBupdate(...); ~~~ The XML payload has a SOAP envelope, optional SOAP header, and a SOAP body with one element representing the operation with the parameters as subelements:
~~~{.xml} ... ~~~
The "document" style puts no restrictions on the SOAP Body content. However, we recommend that the first element's tag name in the SOAP Body should be unique to each type of operation, so that the receiver can dispatch the operation based on this element's tag name. Alternatively, the HTTP URL path can be used to specify the operation, or the HTTP action header can be used to dispatch operations automatically on the server side (soapcpp2 options -a and -A). 🔝 [Back to table of contents](#) SOAP literal versus encoding {#lit-enc} ---------------------------- The `wsdl:operation/soap:body/@use` attribute in the `` section of a WSDL is either "literal" or "encoded". The "encoded" use refers to the SOAP encoding rules that support id-ref multi-referenced elements to serialize data as graphs. SOAP encoding is very useful if the data internally forms a graph (including cycles) and we want the graph to be serialized in XML in a format that ensures that its structure is preserved. In that case, SOAP 1.2 encoding is the best option. SOAP encoding also adds encoding rules for [SOAP arrays](#toxsd10) to serialize multi-dimensional arrays. The use of XML attributes to exchange XML data in SOAP encoding is not permitted. The only attributes permitted are the standard XSD attributes, SOAP encoding attributes (such as for arrays), and id-ref. For example, the following directives in the interface header file for soapcpp2 declare that `DBupdate` is a SOAP RPC encoding service method: ~~~{.cpp} //gsoap ns service namespace: urn:DB //gsoap ns service method-protocol: DBupdate SOAP //gsoap ns service method-style: DBupdate rpc //gsoap ns service method-encoding: DBupdate encoded int ns__DBupdate(...); ~~~ The XML payload has a SOAP envelope, optional SOAP header, and a SOAP body with an encodingStyle attribute for SOAP 1.1 encoding and an element representing the operation with parameters that are SOAP 1.1 encoded:
~~~{.xml} 1234567890 Jane 1987654320 2345678901 Joe ~~~
In the XML fragment shown above the name "Joe" is shared by two records and the string is referenced by SOAP 1.1 href and id attributes. While the soapcpp-generated serializers only introduce multi-referenced elements in the payload when they are actually multi-referenced in the data graph, other SOAP applications may render multi-referenced elements more aggressively. The example could also be rendered as:
~~~{.xml} 1234567890 1987654320 2345678901 Joe Jane ~~~
SOAP 1.2 encoding is cleaner and produces more accurate XML encodings of data graphs by setting the id attribute on the element that is referenced:
~~~{.xml} Joe 1234567890 Jane 1987654320 2345678901 ~~~
@note Some SOAP 1.2 applications consider the namespace `SOAP-ENC` of `SOAP-ENC:id` and `SOAP-ENC:ref` optional. With gSOAP, the SOAP 1.2 encoding serialization follows the 2007 standard, while accepting unqualified id and ref attributes. To remove all rendered id-ref multi-referenced elements, use the `SOAP_XML_TREE` flag to initialize the `soap` context. Some XSD validation rules are turned off with SOAP encoding, because of the presence of additional attributes, such as id and ref/href, SOAP arrays with arbitrary element tags for array elements, and the occurrence of additional multi-ref elements in the SOAP 1.1 Body. The use of "literal" puts no restrictions on the XML in the SOAP Body. Full XSD validation is possible, which can be enabled with the `SOAP_XML_STRICT` flag to initialize the `soap` context. However, data graphs will be serialized as trees and cycles in the data will be cut from the XML rendition. 🔝 [Back to table of contents](#) SOAP 1.1 versus SOAP 1.2 {#soap} ------------------------ There are two SOAP protocol versions: 1.1 and 1.2. The gSOAP tools can switch between the two versions seamlessly. You can declare the default SOAP version for a service operation as follows: ~~~{.cpp} //gsoap ns service method-protocol: DBupdate SOAP1.2 ~~~ Use `SOAP` (SOAP 1.1), `SOAP1.1`, `SOAP1.2`, and `HTTP` to switch SOAP versions or enable REST methods with HTTP POST. See [service directives](#directives-1) and [XML serialization](#non-soap). The soapcpp2 tool auto-generates client and server code. At the client side, this operation sends data with SOAP 1.2 but accepts responses also in SOAP 1.1. At the server side, this operation accepts requests in SOAP 1.1 and 1.2 and will return responses in the same SOAP version. As we discussed in the previous section, the SOAP 1.2 protocol has a cleaner multi-referenced element serialization format that greatly enhances the accuracy of data graph serialization with SOAP RPC encoding and is therefore recommended. The SOAP 1.2 protocol default can also be set by importing and loading `gsoap/import/soap12.h`: ~~~{.cpp} #import "soap12.h" ~~~ Finally, the soapcpp2 tool has options to force SOAP 1.1, SOAP 1.2, or remove SOAP altogether with `soapcpp2 -1` (SOAP 1.1), `soapcpp2 -2` (SOAP 1.2) and `soapcpp2 -0` (plain XML, no SOAP). 🔝 [Back to table of contents](#) XML serialization {#non-soap} ----------------- You can serialize data to XML that is stored on the heap, on the stack (locals), and static data as long as the serializable (i.e. non-transient) values are properly initialized and pointers in the data structures are either NULL or point to valid structures. When XML is deserialized into data, the data is put on the heap and managed by the `::soap` context, see also [memory management](#memory). You can read and write XML directly to a file or stream with the serializing [operations on classes and structs](#toxsd9-14). To define and use XML Web service client and service operations, we can declare these operations in your interface header file with the data binding interface for soapcpp2 as functions. The function are translated by soapcpp2 to client-side service invocation calls and server-side service operation dispatchers. The REST operations POST, GET, and PUT are declared with `//gsoap` directives in the interface header file for soapcpp2. For example, a REST HTTP POST operation is declared as follows: ~~~{.cpp} //gsoap ns service namespace: urn:DB //gsoap ns service method-protocol: DBupdate POST int ns__DBupdate(...); ~~~ There are no SOAP Envelope and SOAP Body elements in the payload for `DBupdate`. Also the XML serialization rules are identical to SOAP document/literal, meaning no SOAP RPC encoding XML structures are implicitly used. The XML payload only has the operation name as an element with its parameters serialized as subelements:
~~~{.xml} ... ~~~
To force id-ref serialization with REST similar to SOAP 1.2 multi-reference encoding, use the `SOAP_XML_GRAPH` flag to initialize the `soap` context. The XML serialization includes id and ref attributes for multi-referenced elements as follows:
~~~{.xml} Joe 1234567890 Jane 1987654320 2345678901 ~~~
🔝 [Back to table of contents](#) Input and output {#io} ================ Reading and writing XML from/to files, streams and string buffers is done via the managing `soap` context by setting one of the following context variables that control IO sources and sinks: ~~~{.cpp} soap->recvfd = fd; // an int file descriptor to read from (0 by default) soap->sendfd = fd; // an int file descriptor to write to (1 by default) soap->is = &is; // C++ only: a std::istream is object to read from soap->os = &os; // C++ only: a std::ostream os object to write to soap->is = cs; // C only: a const char* string to read from (soap->is will advance) soap->os = &cs; // C only: pointer to a const char*, will be set to point to the string output ~~~ Normally, all of these context variables are NULL, which is required to send and receive data over sockets by gSOAP client and server applications. Therefore, if you set any of these context variables in a client or server application then you should reset them to NULL to ensure that socket communications are not blocked. @note The use of `soap::is` and `soap::os` in C requires gSOAP 2.8.28 or greater. In the following sections, we present more details on how to read and write to files and streams, and use string buffers as sources and sinks for XML data. In addition, you can set IO callback functions to handle IO at a lower level. For more details on defining your own callback functions, see the [gSOAP user guide.](../../guide/html/index.html) 🔝 [Back to table of contents](#) Reading and writing from/to files and streams {#io1} --------------------------------------------- The default IO is standard input and output. Other sources and sinks (those listed above) will be used until you (re)set them. For example with file-based input and output: ~~~{.cpp} FILE *fp = fopen("record.xml", "r"); if (fp != NULL) { soap->recvfd = fileno(fp); // get file descriptor of file to read from if (soap_read_ns__record(soap, &pers1)) ... // handle IO error fclose(fp); soap->recvfd = 0; // read from stdin, or -1 to block reading } FILE *fp = fopen("record.xml", "w"); if (fp != NULL) { soap->sendfd = fileno(fp); // get file descriptor of file to write to if (soap_write_ns__record(soap, &pers1)) ... // handle IO error fclose(fp); soap->sendfd = 1; // write to stdout, or -1 to block writing } ~~~ Similar code with streams in C++: ~~~{.cpp} #include std::fstream fs; fs.open("record.xml", std::ios::in); if (fs) { soap->is = &fs; if (soap_read__ns__record(soap, &pers1)) ... // handle IO error fs.close(); soap->is = NULL; } fs.open("record.xml", std::ios::out); if (fs) { soap->os = &fs; if (soap_write__ns__record(soap, &pers1)) ... // handle IO error fs.close(); soap->os = NULL; } ~~~ 🔝 [Back to table of contents](#) Reading and writing from/to string buffers {#io2} ------------------------------------------ For C++ we recommend to use `std::stringstream` objects from the `sstream` C++ library as illustrated in the following example: ~~~{.cpp} #include std::stringstream ss; ss.str("..."); // XML to parse soap->is = &ss; if (soap_read__ns__record(soap, &pers1)) ... // handle IO error soap->is = NULL; soap->os = &ss; if (soap_write__ns__record(soap, &pers1)) ... // handle IO error soap->os = NULL; std::string s = ss.str(); // string with XML ~~~ For C we can use `soap::is` and `soap::os` to point to strings of XML content as follows (this requires gSOAP 2.8.28 or later): ~~~{.cpp} soap->is = "..."; // XML to parse if (soap_read__ns__record(soap, &pers1)) ... // handle IO error soap->is = NULL; const char *cs = NULL; soap->os = &cs; if (soap_write__ns__record(soap, &pers1)) ... // handle IO error soap->os = NULL; ... = cs; // string with XML (do not free(cs): managed by the context and freed with soap_end()) ~~~ The type of `soap::os` is a pointer to a `const char*` string. The pointer is set by the managing `soap` context to point to the XML data that is stored on the context-managed heap. For earlier gSOAP versions we recommend to use IO callbacks `soap::frecv` and `soap::fsend`, see the [gSOAP user guide.](../../guide/html/index.html). 🔝 [Back to table of contents](#) Memory management {#memory} ================= Memory management with the `soap` context enables us to allocate data in context-managed heap space that can be collectively deleted. All deserialized data is placed on the context-managed heap by the `soap` context of the engine. 🔝 [Back to table of contents](#) Memory management in C {#memory1} ---------------------- When working with gSOAP in C (i.e. using `wsdl2h -c` option `-c` or `soapcpp2 -c` option `-c`), data is allocated on the managed heap with: - `void *soap_malloc(struct soap*, size_t len)`. You can also make shallow copies of data with `soap_memdup` that uses `soap_malloc` and a safe version of `memcpy` to copy a chunk of data `src` with length `len` to the context-managed heap: - `void * soap_memdup(struct soap*, const void *src, size_t len)` This function returns a pointer to the copy. This function requires gSOAP 2.8.27 or later. In gSOAP 2.8.35 and greater versions, you can use an auto-generated function to allocate and initialize data of type `T` on the managed heap: - `T * soap_new_T(struct soap*, int n)` This function returns an array of length `n` of type `T` data that is default initialized (by internally calling `soap_malloc(soap, n * sizeof(T))` and then `soap_default_T(soap, T*)` on each array value). Use a negative value or `n=1` to allocate and initialize a single value. The `soap_malloc` function is a wrapper around `malloc`, but which also permits the `soap` context to track all heap allocations for collective deletion with `soap_end(soap)`: ~~~{.cpp} #include "soapH.h" #include "ns.nsmap" ... struct soap *soap = soap_new(); // new context ... struct ns__record *record = (struct ns__record*)soap_malloc(soap, sizeof(struct ns__record)); soap_default_ns__record(soap, record); // auto-generated struct initializer ... soap_destroy(soap); // only for C++, see section on C++ below soap_end(soap); // delete record and all other heap allocations soap_free(soap); // delete context ~~~ All data on the managed heap is mass-deleted with `soap_end(soap)` which must be called before `soap_done(soap)` or `soap_free(soap)`, which end the use of the `soap` context and free the context, respectively. Use `soap_free(soap)` only when the context is allocated with `soap_new()`. Use `soap_done(soap)` only when the context is stack allocated (so cannot be deleted from the heap). The managed heap is checked for memory leaks at run time when the source code is compiled with option `-DDEBUG`. The soapcpp2 auto-generated deserializers in C use `soap_malloc` to allocate and populate deserialized structures, which are managed by the context for collective deletion. To make `char*` and `wchar_t*` string copies to the context-managed heap, we can use the functions: - `char *soap_strdup(struct soap*, const char *str)` and - `wchar_t *soap_wstrdup(struct soap*, const wchar_t *wstr)`. If your C compiler supports `typeof` then you can use the following macro to simplify the managed heap allocation and initialization of primitive values: ~~~{.cpp} #define soap_assign(soap, lhs, rhs) (*(lhs = (typeof(lhs))soap_malloc(soap, sizeof(*lhs))) = rhs) ~~~ Pointers to primitive values are often used for optional members. For example, assume we have the following struct: ~~~{.cpp} struct ns__record { const char *name 1; // required (minOccurs=1) uint64_t *SSN; // optional (pointer means minOccurs=0) struct ns__record *spouse; // optional (pointer means minOccurs=0) }; ~~~ Use `soap_assign` to create a SSN value on the managed heap: ~~~{.cpp} struct soap *soap = soap_new(); // new context ... struct ns__record *record = (struct ns__record*)soap_malloc(soap, sizeof(struct ns__record)); soap_default_ns__record(soap, record); record->name = soap_strdup(soap, "Joe"); soap_assign(soap, record->SSN, 1234567890UL); ... soap_end(soap); // delete managed soap_malloc'ed heap data soap_free(soap); // delete context ~~~ Without the `soap_assign` macro, you will need two lines of code, one to allocate and one to assign (you should also use this if your system can run out of memory): ~~~{.cpp} assert((record->SSN = (uint64_t*)soap_malloc(soap, sizeof(utint64_t))) != NULL); *record->SSN = 1234567890UL; ~~~ The serializer can serialize any heap, stack, or static allocated data. So we can also create a new record as follows: ~~~{.cpp} struct soap *soap = soap_new(); // new context ... struct ns__record *record = (struct ns__record*)soap_malloc(soap, sizeof(struct ns__record)); static uint64_t SSN = 1234567890UL; soap_default_ns__record(soap, record); record->name = "Joe"; record->SSN = &SSN; // safe to use static values: the value of record->SSN is never changed ... soap_end(soap); // delete managed soap_malloc'ed heap data soap_free(soap); // delete context ~~~ Use the soapcpp2 auto-generated `soap_dup_T` functions to duplicate data into another `soap` context (this requires `soapcpp2 -Ec` option `-Ec` to generate), here shown for C with the second argument `dst` NULL because we want to allocate a new managed structure: ~~~{.cpp} struct soap *other_soap = soap_new(); // another context struct ns__record *other_record = soap_dup_ns__record(other_soap, NULL, record); ... soap_destroy(other_soap); // only for C++, see section on C++ below soap_end(other_soap); // delete other_record and all of its deep data soap_free(other_soap); // delete context ~~~ The only reason to use another `soap` context and not to use the primary `soap` context is when the primary context must be destroyed together with all of the objects it manages while some of the objects must be kept alive. If the objects that are kept alive contain deep cycles then this is the only option we have, because deep copy with a managing `soap` context detects and preserves these cycles unless the `SOAP_XML_TREE` flag is used with the `soap` context: ~~~{.cpp} struct soap *other_soap = soap_new1(SOAP_XML_TREE); // another context struct ns__record *other_record = soap_dup_ns__record(other_soap, NULL, record); ~~~ The resulting deep copy will be a full copy of the source data structure as a tree without co-referenced data (i.e. no digraph) and without cycles. Cycles are pruned and (one of the) pointers that forms a cycle is repaced by NULL. You can also deep copy into unmanaged space and use the auto-generated `soap_del_T()` function (requires `soapcpp2 -Ed` option `-Ed` to generate) to delete it later: ~~~{.cpp} struct ns__record *other_record = soap_dup_ns__record(NULL, NULL, record); ... soap_del_ns__record(other_record); // deep delete record data members free(other_record); // delete the record ~~~ But you should not do this for any data that has deep cycles in its runtime data structure. Cycles in the data structure will lead to non-termination when making unmanaged deep copies. Consider for example: ~~~{.cpp} struct ns__record { const char *name 1; // required (minOccurs=1) uint64_t SSN; // required (non-pointer means minOccurs=1) struct ns__record *spouse; // optional (pointer means minOccurs=0) }; ~~~ The code to populate a structure with a mutual spouse relationship: ~~~{.cpp} struct soap *soap = soap_new(); ... struct ns__record pers1, pers2; soap_default_ns__record(soap, &pers1); soap_default_ns__record(soap, &pers2); pers1.name = "Joe"; // OK to serialize static data pers1.SSN = 1234567890; pers1.spouse = &pers2; pers2.name = soap_strdup(soap, "Jane"); // allocates and copies a string pers2.SSN = 1987654320; pers2.spouse = &pers1; ... struct ns__record *pers3 = soap_dup_ns__record(NULL, NULL, &pers1); // BAD struct ns__record *pers4 = soap_dup_ns__record(soap, NULL, &pers1); // OK soap_set_mode(soap, SOAP_XML_TREE); struct ns__record *pers5 = soap_dup_ns__record(soap, NULL, &pers1); // OK ~~~ The bad case is where there is no context used in the first argument. The deep copy functions use a context to keep track of co-referenced data nodes and cycles in the data structure copies, to copy co-referenced nodes just once. Co-references in a data structure are formed by pointers and smart pointers such as `std::shared_ptr`, such that at least two pointers point to the same data. The serializer can serialize any heap, stack, or static allocated data, such as in the code shown above. So we can serialize the stack-allocated `pers1` record as follows: ~~~{.cpp} FILE *fp = fopen("record.xml", "w"); if (fp != NULL) { soap->sendfd = fileno(fp); // file descriptor to write to soap_set_mode(soap, SOAP_XML_GRAPH); // support id-ref w/o requiring SOAP soap_clr_mode(soap, SOAP_XML_TREE); // if set, clear soap_write_ns__record(soap, &pers1); fclose(fp); soap->sendfd = -1; // block further writing } ~~~ which produces an XML document record.xml that is similar to:
~~~{.xml} Joe 1234567890 Jane 1987654320 ~~~
Deserialization of an XML document with a SOAP 1.1/1.2 encoded id-ref graph leads to the same non-termination problem when we later try to copy the data into unmanaged memory heap space: ~~~{.cpp} struct soap *soap = soap_new1(SOAP_XML_GRAPH); // support id-ref w/o SOAP ... struct ns__record pers1; FILE *fp = fopen("record.xml", "r"); if (fp != NULL) { soap->recvfd = fileno(fp); if (soap_read_ns__record(soap, &pers1)) ... // handle IO error fclose(fp); soap->recvfd = -1; // blocks further reading } ... struct ns__record *pers3 = soap_dup_ns__record(NULL, NULL, &pers1); // BAD struct ns__record *pers4 = soap_dup_ns__record(soap, NULL, &pers1); // OK soap_set_mode(soap, SOAP_XML_TREE); struct ns__record *pers5 = soap_dup_ns__record(soap, NULL, &pers1); // OK ~~~ Copying data with `soap_dup_T(soap)` into managed heap memory space is always safe. Copying into unmanaged heap memory space requires diligence. But deleting unmanaged data is easy with `soap_del_T()`. You can also use `soap_del_T()` to delete structures that you created in C, but only if these structures are created with `malloc` and do NOT contain pointers to stack and static data. You can unlink one or more allocated objects from the managed heap to allow the object to live after `soap_end(soap)` by using: - `void soap_unlink(struct soap *soap, void *ptr)` The unlinked heap-allocated data pointed to by `ptr` can be accessed after `soap_end(soap)`. Do not forget to free the data with `free(ptr)`. Be aware that `soap_unlink(soap, ptr)` does not perform a deep unlinkage. If `ptr` is a struct, pointer members will become invalid when pointing to objects on the managed heap. Use `soap_unlink(soap, ptr->member)` to unlink `member` as well. Finally, when data is allocated in managed memory heap space, either explicitly with the allocation functions shown above or by the soapcpp2-generated deserializers, you can delegate the management and deletion of this data to another `soap` context. That context will be responsible to delete the data with `soap_end(soap)` later: - `void delegate_deletion(struct soap *soap_from, struct soap *soap_to)` This allows the `soap_from` context to be deleted with `soap_free(soap_from)` (assuming it is allocated with `soap_new()`, use `soap_done(soap_from)` when `soap_from` is stack-allocated) while the managed data remains intact. You can use this function any time, to delegate management and deletion to another context `soap_to` and then continue with the current context. You can also use different source `soap_from` contexts to delegate management and deletion to the other `soap_to` context. To mass delete all managed data, use `soap_end(soap_to)`. 🔝 [Back to table of contents](#) Memory management in C++ {#memory2} ------------------------ When working with gSOAP in C++, the engine allocates data on a managed heap using `soap_new_T(soap)` to allocate a type with type name `T`. Managed heap allocation is tracked by the `soap` context for collective deletion with `soap_destroy(soap)` for structs, classes, and templates and with `soap_end(soap)` for everything else. You should only use `soap_malloc(struct soap*, size_t len)` to allocate primitive types, but `soap_new_T` is preferred. The auto-generated `T * soap_new_T(struct soap*)` returns data allocated on the managed heap for type `T`. The data is mass-deleted with `soap_destroy(soap)` followed by `soap_end(soap)`. The `soap_new_T` functions return NULL when allocation fails. C++ exceptions are never raised by the engine and serializers when data is allocated, unless `SOAP_NOTHROW` (set to `(std::nothrow)`) is redefined to permit `new` to throw exceptions. There are four variations of `soap_new_T` functions to allocate data of type `T` that soapcpp2 auto-generates: - `T * soap_new_T(struct soap*)` returns a new instance of `T` that is default initialized. For classes, initialization is internally performed using the soapcpp2 auto-generated `void T::soap_default(struct soap*)` method of the class, but ONLY IF the soapcpp2 auto-generated default constructor is used that invokes `soap_default()` and was not replaced by a user-defined default constructor. - `T * soap_new_T(struct soap*, int n)` returns an array of `n` new instances of `T`. The instances in the array are default initialized as described above. - `T * soap_new_req_T(struct soap*, ...)` (structs and classes only) returns a new instance of `T` and sets the required data members to the values specified in `...`. The required data members are those with nonzero minOccurs, see the subsections on [(smart) pointer members and their occurrence constraints](#toxsd9-8) and [container and array members and their occurrence constraints](#toxsd9-9). - `T * soap_new_set_T(struct soap*, ...)` (structs and classes only) returns a new instance of `T` and sets the public/serializable data members to the values specified in `...`. The above functions can be invoked with a NULL `soap` context, but you are then responsible to use `delete T` to remove this instance from the unmanaged heap. For example, to allocate a managed `std::string` you can use: ~~~{.cpp} std::string *s = soap_new_std__string(soap); ~~~ Primitive types and arrays of these are allocated with `soap_malloc` (`soap_new_T` calls `soap_malloc` for primitive type `T`). All primitive types (i.e. no classes, structs, class templates, containers, and smart pointers) are allocated with `soap_malloc` for reasons of efficiency. You can use a C++ template to simplify the managed allocation and initialization of primitive values as follows (this is for primitive types only): ~~~{.cpp} template T * soap_make(struct soap *soap, T val) throw (std::bad_alloc) { T *p = (T*)soap_malloc(soap, sizeof(T)); if (p == NULL) throw std::bad_alloc(); *p = val; return p; } ~~~ For example, assuming we have the following class: ~~~{.cpp} class ns__record { public: std::string name; // required (non-pointer means minOccurs=1) uint64_t *SSN; // optional (pointer means minOccurs=0) ns__record *spouse; // optional (pointer means minOccurs=0) }; ~~~ You can instantiate a record by using the auto-generated `soap_new_set_ns__record` and use `soap_make` to create a SSN value on the managed heap as follows: ~~~{.cpp} soap *soap = soap_new(); // new context ... ns__record *record = soap_new_set_ns__record( soap, "Joe", soap_make(soap, 1234567890UL), NULL); ... soap_destroy(soap); // delete record and all other managed instances soap_end(soap); // delete managed soap_malloc'ed heap data soap_free(soap); // delete context ~~~ All data on the managed heap is mass-deleted with `soap_end(soap)` which must be called before `soap_done(soap)` or `soap_free(soap)`, which end the use of the `soap` context and free the context, respectively. Use `soap_free(soap)` only when the context is allocated with `soap_new()`. Use `soap_done(soap)` only when the context is stack allocated (so cannot be deleted from the heap). The managed heap is checked for memory leaks at run time when the source code is compiled with option `-DDEBUG`. However, the serializer can serialize any heap, stack, or static allocated data. So we can also create a new record as follows: ~~~{.cpp} uint64_t SSN = 1234567890UL; ns__record *record = soap_new_set_ns__record(soap, "Joe", &SSN, NULL); ~~~ which will be fine to serialize this record as long as the local `SSN` stack-allocated value remains in scope when invoking the serializer and/or using `record`. It does not matter if `soap_destroy` and `soap_end` are called beyond the scope of `SSN`. To facilitate class methods to access the managing context, we can add a soap context pointer to a class/struct: ~~~{.cpp} class ns__record { public: ... void create_more(); // needs a context to create more internal data protected: struct soap *soap; // the context that manages this instance, or NULL }; ~~~ The `soap` context pointer member of the class is set when invoking `soap_new_T` (and similar) with a non-NULL context argument that will be assigned to the `soap` member of the class. You can also use a template when an array of pointers to values is required. To create an array of pointers to values, define the following template: ~~~{.cpp} template T **soap_make_array(struct soap *soap, T* array, int n) throw (std::bad_alloc) { T **p = (T**)soap_malloc(soap, n * sizeof(T*)); if (p == NULL) throw std::bad_alloc(); for (int i = 0; i < n; ++i) p[i] = &array[i]; return p; } ~~~ The `array` parameter is a pointer to an array of `n` values. The template returns an array of `n` pointers that point to the values in that array: ~~~{.cpp} // create an array of 100 pointers to 100 records int n = 100; ns__record **precords = soap_make_array(soap, soap_new_ns__record(soap, n), n); for (int i = 0; i < n; ++i) { precords[i]->name = "..."; precords[i]->SSN = soap_make(1234567890UL + i); } ~~~ Note that `soap_new_ns__record(soap, n)` returns a pointer to an array of `n` records, which is then used to create an array of `n` pointers to these records. Use the soapcpp2 auto-generated `soap_dup_T` functions to duplicate data into another `soap` context (this requires `soapcpp2 -Ec` option `-Ec` to generate), here shown for C++ with the second argument `dst` NULL to allocate a new managed object: ~~~{.cpp} soap *other_soap = soap_new(); // another context ns__record *other_record = soap_dup_ns__record(other_soap, NULL, record); ... soap_destroy(other_soap); // delete record and other managed instances soap_end(other_soap); // delete other data (the SSNs on the heap) soap_free(other_soap); // delete context ~~~ To duplicate base and derived instances when a base class pointer or reference is provided, use the auto-generated method `T * T::soap_dup(struct soap*)`: ~~~{.cpp} soap *other_soap = soap_new(); // another context ns__record *other_record = record->soap_dup(other_soap); ... soap_destroy(other_soap); // delete record and other managed instances soap_end(other_soap); // delete other data (the SSNs on the heap) soap_free(other_soap); // delete context ~~~ The only reason to use another context and not to use the primary `soap` context is when the primary context must be destroyed together with all of the objects it manages while some of the objects must be kept alive. If the objects that are kept alive contain deep cycles then this is the only option we have, because deep copy with a managing `soap` context detects and preserves these cycles unless the `SOAP_XML_TREE` flag is used with the context: ~~~{.cpp} soap *other_soap = soap_new1(SOAP_XML_TREE); // another context ns__record *other_record = record->soap_dup(other_soap); // deep tree copy ~~~ The resulting deep copy will be a full copy of the source data structure as a tree without co-referenced data (i.e. no digraph) and without cycles. Cycles are pruned and (one of the) pointers that forms a cycle is repaced by NULL. You can also deep copy into unmanaged space and use the auto-generated `soap_del_T()` function or the `T::soap_del()` method (requires `soapcpp2 -Ec` option `-Ec` to generate) to delete it later, but we should not do this for any data that has deep cycles in its runtime data structure graph: ~~~{.cpp} ns__record *other_record = record->soap_dup(NULL); ... other_record->soap_del(); // deep delete record data members delete other_record; // delete the record ~~~ Cycles in the data structure will lead to non-termination when making unmanaged deep copies. Consider for example: ~~~{.cpp} class ns__record { public: const char *name 1; // required (minOccurs=1) uint64_t SSN; // required (non-pointer means minOccurs=1) ns__record *spouse; // optional (pointer means minOccurs=1) }; ~~~ The code to populate a structure with a mutual spouse relationship: ~~~{.cpp} soap *soap = soap_new(); ... ns__record pers1, pers2; pers1.name = "Joe"; pers1.SSN = 1234567890; pers1.spouse = &pers2; pers2.name = "Jane"; pers2.SSN = 1987654320; pers2.spouse = &pers1; ... ns__record *pers3 = soap_dup_ns__record(NULL, NULL, &pers1); // BAD ns__record *pers4 = soap_dup_ns__record(soap, NULL, &pers1); // OK soap_set_mode(soap, SOAP_XML_TREE); ns__record *pers5 = soap_dup_ns__record(soap, NULL, &pers1); // OK ~~~ The serializer can serialize any heap, stack, or static allocated data, such as shown in the code shown above. So we can serialize the stack-allocated `pers1` record as follows: ~~~{.cpp} FILE *fp = fopen("record.xml", "w"); if (fp != NULL) { soap->sendfd = fileno(fp); // file descriptor to write to soap_set_mode(soap, SOAP_XML_GRAPH); // support id-ref w/o requiring SOAP soap_clr_mode(soap, SOAP_XML_TREE); // if set, clear if (soap_write_ns__record(soap, &pers1)) ... // handle IO error fclose(fp); soap->sendfd = -1; // block further writing } ~~~ which produces an XML document record.xml that is similar to:
~~~{.xml} Joe 1234567890 Jane 1987654320 ~~~
Deserialization of an XML document with a SOAP 1.1/1.2 encoded id-ref graph leads to the same non-termination problem when we later try to copy the data into unmanaged space: ~~~{.cpp} soap *soap = soap_new1(SOAP_XML_GRAPH); // support id-ref w/o SOAP ... ns__record pers1; FILE *fp = fopen("record.xml", "r"); if (fp != NULL) { soap->recvfd = fileno(fp); // file descriptor to read from if (soap_read_ns__record(soap, &pers1)) ... // handle IO error fclose(fp); soap->recvfd = -1; // block further reading } ... ns__record *pers3 = soap_dup_ns__record(NULL, NULL, &pers1); // BAD ns__record *pers4 = soap_dup_ns__record(soap, NULL, &pers1); // OK soap_set_mode(soap, SOAP_XML_TREE); ns__record *pers5 = soap_dup_ns__record(soap, NULL, &pers1); // OK ~~~ Copying data with `soap_dup_T(soap)` into managed space is always safe. Copying into unmanaged space requires diligence. But deleting unmanaged data is easy with `soap_del_T()`. You can also use `soap_del_T()` to delete structures in C++, but only if these structures are created with `new` (and `new []` for arrays when applicable) for classes, structs, and class templates and with `malloc` for anything else, and the structures do NOT contain pointers to stack and static data. You can unlink one or more allocated objects from the managed heap to allow the object to live after `soap_destroy(soap)` and `soap_end(soap)` by using: - `void soap_unlink(struct soap *soap, void *ptr)` The unlinked heap-allocated data pointed to by `ptr` can be accessed after `soap_destroy(soap)` and `soap_end(soap)`. Do not forget to free the data with `delete ptr` (C++ class instance only) or with `free(ptr)` (non-class data). Be aware that `soap_unlink(soap, ptr)` does not perform a deep unlinkage. If `ptr` is a struct or class, pointer members will become invalid when pointing to objects on the managed heap. Use `soap_unlink(soap, ptr->member)` to unlink `member` as well. Finally, when data is allocated in managed memory heap space, either explicitly with the allocation functions shown above or by the soapcpp2-generated deserializers, you can delegate the management and deletion of this data to another `soap` context. That context will be responsible to delete the data with `soap_destroy(soap)` and `soap_end(soap)` later: - `void delegate_deletion(struct soap *soap_from, struct soap *soap_to)` This allows the `soap_from` context to be deleted with `soap_free(soap_from)` (assuming it is allocated with `soap_new()`, use `soap_done(soap_from)` when `soap_from` is stack-allocated) while the managed data remains intact. You can use this function any time, to delegate management and deletion to another context `soap_to` and then continue with the current context. You can also use different source `soap_from` contexts to delegate management and deletion to the other `soap_to` context. To mass delete all managed data, use `soap_destroy(soap_to)` followed by `soap_end(soap_to)`. 🔝 [Back to table of contents](#) Context flags to initialize the soap struct {#flags} =========================================== There are several `soap` context initialization flags and context mode flags to control XML serialization at runtime. The flags are set with `soap_new1()` to allocate and initialize a new context: ~~~{.cpp} struct soap *soap = soap_new1(flag1 | flag2 | ... | flagn); ... soap_destroy(soap); // delete objects soap_end(soap); // delete other data and temp data soap_free(soap); // free context ~~~ and with `soap_init1()` for stack-allocated contexts: ~~~{.cpp} struct soap soap; soap_init1(&soap, flag1 | flag2 | ... | flagn); ... soap_destroy(&soap); // delete objects soap_end(&soap); // delete other data and temp data soap_done(&soap); // clear context ~~~ where `flag1`, `flag2`, ..., `flagn` is one of: - `SOAP_C_UTFSTRING`: enables all `std::string` and `char*` strings to contain UTF-8 content. This option is recommended. - `SOAP_C_NILSTRING`: treat empty strings as if they were NULL pointers, i.e. omits elements and attributes when empty. - `SOAP_XML_STRICT`: strictly validates XML while deserializing. Should not be used together with SOAP 1.1/1.2 encoding style of messaging. Use `soapcpp2 -s` option `-s` to hard code `SOAP_XML_STRICT` in the generated serializers. Not recommended with SOAP 1.1/1.2 encoding style messaging. - `SOAP_XML_INDENT`: produces indented XML. - `SOAP_XML_CANONICAL`: c14n canonocalization, removes unused `xmlns` bindings and adds them to appropriate places by applying c14n normalization rules. Should not be used together with SOAP 1.1/1.2 encoding style messaging. - `SOAP_XML_TREE`: write tree XML without id-ref, while pruning data structure cycles to prevent nontermination of the serializer for cyclic structures. - `SOAP_XML_GRAPH`: write graph (digraph and cyclic graphs with shared pointers to objects) using id-ref attributes. That is, XML with SOAP multi-ref encoded id-ref elements. This is a structure-preserving serialization format, because co-referenced data and also cyclic relations are accurately represented. - `SOAP_XML_DEFAULTNS`: uses xmlns default namespace declarations, assuming that the schema attribute form is "qualified" by default (be warned if it is not, since attributes in the null namespace will get bound to namespaces!). - `SOAP_XML_NIL`: emit empty element with `xsi:nil` for all NULL pointers serialized. - `SOAP_XML_IGNORENS`: the XML parser ignores XML namespaces, i.e. element and attribute tag names match independent of their namespace. - `SOAP_XML_NOTYPE`: removes all `xsi:type` attribuation. This option is usually not needed unless the receiver rejects all `xsi:type` attributes. This option may affect the quality of the deserializer, which relies on `xsi:type` attributes to distinguish base class instances from derived class instances transported in the XML payloads. - `SOAP_IO_CHUNK`: to enable HTTP chunked transfers. - `SOAP_IO_STORE`: full buffering of outbound messages. - `SOAP_ENC_ZLIB`: compress messages, requires compiling with option `-DWITH_GZIP` and linking with zlib using option `-lz`. - `SOAP_ENC_MIME`: enable MIME attachments, see [DIME/MIME/MTOM attachment binary types](#toxsd10-3). - `SOAP_ENC_MTOM`: enable MTOM attachments, see [DIME/MIME/MTOM attachment binary types](#toxsd10-3). @note C++ Web service proxy and service classes have their own `soap` context, either as a base class (with `soapcpp2 -i` option `-i`) or as a pointer member `soap` that points to a context (with `soapcpp2 -j` option `-j`). These contexts are allocated when the proxy or service is instantiated with context flags that are passed to the constructor. 🔝 [Back to table of contents](#) Context parameter settings {#params} ========================== After allocation and initializtion of a `soap` context, several context parameters can be set (some parameters may require 2.8.31 or greater): - `unsigned int soap::maxlevel` is the maximum XML nesting depth levels that the parser permits. Default initialized to `SOAP_MAXLEVEL` (10000), which is a redefinable macro in `gsoap/stdsoap2.h`. Set `soap::maxlevel` to a lower value to restrict XML parsing nesting depth. - `long soap::maxlength` is the maximum string content length if not already constrained by an XML schema validation `maxLength` constraint. Zero means unlimited string lengths are permitted (unless restricted by XML schema `maxLength`). Default initialized to `SOAP_MAXLENGTH` (0), which is a redefinable macro in `gsoap/stdsoap2.h`. Set `soap::maxlength` to a positive value to restrict the number of (wide) characters in strings parsed, restrict hexBinary byte length, and restrict base64Binary byte length. - `size_t soap::maxoccurs` is the maximum number of array or container elements permitted by the parser. Must be greater than zero (0). Default initialized to `SOAP_MAXOCCURS` (100000), which is a redefinable macro in `gsoap/stdsoap2.h`. Set `soap::maxoccurs` to a positive value to restrict the number of array and container elements that can be parsed. - `soap::version` is the SOAP version used, with 0 for non-SOAP, 1 for SOAP1.1, and 2 for SOAP1.2. This value is normally set by web service operations, and is otherwise 0 (non-SOAP). Use `soap_set_version(struct soap*, short)` to set the value. This controls XML namespaces and SOAP id-ref serialization when applicable with an encodingStyle (see below). - `const char *soap::encodingStyle` is a string that is used with SOAP encoding, normally NULL for non-SOAP XML. Set this string to "" (empty string) to enable SOAP encoding style, which supports id-ref graph serialization (see also the `SOAP_XML_GRAPH` [context flag](#flags)). - `int soap::recvfd` is the file descriptor to read and parse source data from. Default initialized to 0 (stdin). See also [input and output](#io). - `int soap::sendfd` is the file descriptor to write data to. Default initialized to 1 (stdout). See also [input and output](#io). - `const char *is` for C: string to read and parse source data from, overriding the `recvfd` source. Normally NULL. This value must be reset to NULL or the parser will continue to read from this string content until the NUL character. See also [input and output](#io). - `std::istream *is` for C++: an input stream to read and parse source data from, overriding the `recvfd` source. Normally NULL. This value must be reset to NULL or the parser will continue to read from this stream until EOF. See also [input and output](#io). - `const char **os` for C: points to a string (a `const char *`) that will be set to point to the string output. Normally NULL. This value must be reset to NULL or the next output will result in reassigning the pointer to point to the next string that is output. The strings are automatically deallocated by `soap_end(soap)`. See also [input and output](#io). - `std::ostream *os` for C++: an output stream to write output to. Normally NULL. This value must be reste to NULL or the next output will be send to this stream. See also [input and output](#io). 🔝 [Back to table of contents](#) Error handling and reporting {#errors} ============================ The gSOAP API functions return `SOAP_OK` (zero) or a non-zero error code. The error code is stored in `int soap::error` of the current `soap` context. Error messages can be displayed with: - `void soap_stream_fault(struct soap*, std::ostream &os)` for C++ only, prints the error message to an output stream. - `void soap_print_fault(struct soap*, FILE *fd)` prints the error message to a FILE descriptor. - `void soap_sprint_fault(struct soap*, char *buf, size_t len)` saves the error message to a fixed-size buffer allocated with a maximum length. - `void soap_print_fault_location(struct soap*, FILE *fd)` prints the location and part of the XML where the parser encountered an error. C++ exceptions are never raised by the engine or serializers, even when data is allocated. (That is unless the `SOAP_NOTHROW` macro (set to `(std::nothrow)` by default) is redefined to permit `new` to throw exceptions.) A `SOAP_EOM` error code is returned when memory was exhausted during processing of input and/or output of data. An EOF (`SOAP_EOF` or -1) error code is returned when the parser has hit EOF but expected more input, or when socket communications timed out. In addition to the `SOAP_EOF` error, the `int soap::errnum` of the `soap` context is set to the `errno` value of the operation that failed. For timeouts, the `soap::ernum` value is always 0 instead of an `errno` error code. Use `soap_xml_error_check(soap->error)` to check for XML errors. This returns true (non-zero) when a parsing and validation error has occurred. For example: ~~~{.cpp} #include struct soap *soap = soap_new1(SOAP_XML_INDENT | SOAP_XML_STRICT | SOAP_XML_TREE); struct ns__record person; std::stringstream ss; ss.str("..."); // XML to parse soap->is = &ss; if (soap_read__ns__record(soap, &person)) { if (soap_xml_error_check(soap->error)) std::cerr << "XML parsing error!" << std::endl; else soap_stream_fault(soap, std::cerr); } else { ... // all OK, use person record } soap_destroy(soap); // delete objects soap_end(soap); // delete other data and temp data soap_free(soap); // free context ~~~ When deploying your application on UNIX and Linux systems, UNIX signal handlers should be added to your code handle signals, in particular `SIGPIPE`: ~~~{.cpp} signal(SIGPIPE, sigpipe_handler); ~~~ where the `sigpipe_handler` is a function: ~~~{.cpp} void sigpipe_handler(int x) { } ~~~ Other UNIX signals may have to be handled as well. The engine is designed for easy memory cleanup after being interrupted. Use `soap_destroy(soap)` and `soap_end(soap)`, after which the `soap` context can be reused. 🔝 [Back to table of contents](#) Features and limitations {#features} ======================== In general, to use the generated code: - Make sure to `#include "soapH.h"` in your code and also define a namespace table or `#include "ns.nsmap"` with the generated table, where `ns` is the namespace prefix for services. - Use `soapcpp2 -j` option `-j` (C++ only) to generate C++ proxy and service objects. The auto-generated files include documented inferfaces. Compile with `soapC.cpp` and link with `-lgsoap++`, or alternatively compile `gsoap/stdsoap2.cpp`. - Without `soapcpp2 -j` option `-j`: client-side uses the auto-generated `soapClient.cpp` and `soapC.cpp` (or C versions of those). Compile and link with `-lgsoap++` (`-lgsoap` for C), or alternatively compile `gsoap/stdsoap2.cpp` (`gsoap/stdsoap2.c` for C). - Without `soapcpp2 -j` option `-j`: server-side uses the auto-generated `soapServer.cpp` and `soapC.cpp` (or C versions of those). Compile and link with `-lgsoap++` (`-lgsoap` for C), or alternatively compile `gsoap/stdsoap2.cpp` (`stdsoap2.c` for C). - Use `soap_new()` or `soap_new1(int flags)` to allocate and initialize a heap-allocated `soap` context with or without flags. Delete this `soap` context with `soap_free(struct soap*)`, but only after `soap_destroy(struct soap*)` and `soap_end(struct soap*)`. - Use `soap_init(struct *soap)` or `soap_init1(struct soap*, int flags)` to initialize a stack-allocated `soap` context with or without flags. End the use of this context with `soap_done(struct soap*)`, but only after `soap_destroy(struct soap*)` and `soap_end(struct soap*)`. Additional notes with respect to the wsdl2h and soapcpp2 tools: - Nested classes, structs, and unions in a interface header file are unnested by soapcpp2. - Use `#import "file.h"` instead of `#include` to import other header files in a interface header file for soapcpp2. The `#include`, `#define`, and `#pragma` are accepted by soapcpp2, but are moved to the very start of the generated code for the C/C++ compiler to include before all generated definitions. Often it is useful to add an `#include` with a [volatile type](#toxsd9-2) that includes the actual type declaration, and to ensure transient types are declared when these are used in a data binding interface declared in a interface header file for soapcpp2. - To remove any SOAP-specific bindings, use `soapcpp2 -0` option `-0`. - A interface header file for soapcpp2 should not include any code statements, only data type declarations. This includes constructor initialization lists that are not permitted. Use member initializations instead. - C++ namespaces are supported. Use `wsdl2h -qname` option `-qname` to add C++ namespace `name`. Or add a `namespace name { ... }` to the header file, but the `{ ... }` must cover the entire header file content from begin to end. - Optional XML DOM support can be used to store mixed content or literal XML content. Otherwise, mixed content may be lost. Use `wsdl2h -d` option `-d` for XML DOM support and compile and link with `gsoap/dom.c` or `gsoap/dom.cpp`. For details, see [XML DOM and XPath](http://www.genivia.com/doc/dom/html). 🔝 [Back to table of contents](#) Removing SOAP namespaces from XML payloads {#nsmap} ========================================== The soapcpp2 tool generates a `.nsmap` file that includes two bindings for SOAP namespaces. We can remove all SOAP namespaces (and SOAP processing logic) with `soapcpp2 -0` option `-0` or by simply setting the two entries to NULL: ~~~{.cpp} struct Namespace namespaces[] = { {"SOAP-ENV", NULL, NULL, NULL}, {"SOAP-ENC", NULL, NULL, NULL}, ... }; ~~~ Once the `.nsmap` is generated, you can copy-paste the content into your project code. However, if we rerun wsdl2h on updated WSDL/XSD files or `typemap.dat` declarations then we need to use the updated table. In cases that no XML namespaces are used at all, for example with [XML-RPC](http://www.genivia.com/doc/xml-rpc-json/html), you may use an empty namespace table: ~~~{.cpp} struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; ~~~ However, beware that any built-in xsi attributes that are rendered will lack the proper namespace binding. At least we suggest to use `SOAP_XML_NOTYPE` for this reason. 🔝 [Back to table of contents](#) Examples {#examples} ======== Select the project files below to peruse the source code examples. 🔝 [Back to table of contents](#) Source files ------------ - `address.xsd` Address book schema - `address.cpp` Address book app (reads/writes address.xml file) - `addresstypemap.dat` Schema namespace prefix name preference for wsdl2h - `graph.h` Graph data binding (tree, digraph, cyclic graph) - `graph.cpp` Test graph serialization as tree, digraph, and cyclic 🔝 [Back to table of contents](#) Generated files --------------- - `address.h` data binding interface generated from address.xsd - `addressStub.h` C++ data binding definitions - `addressH.h` Serializers - `addressC.cpp` Serializers - `address.xml` Address book data generated by address app - `graphStub.h` C++ data binding definitions - `graphH.h` Serializers - `graphC.cpp` Serializers - `g.xsd` XSD schema with `g:Graph` complexType - `g.nsmap` xmlns bindings namespace mapping table 🔝 [Back to table of contents](#) Build steps ----------- Building the AddressBook example: wsdl2h -g -taddresstypemap.dat address.xsd soapcpp2 -0 -C -S -paddress -I../../import address.h c++ -I../.. address.cpp addressC.cpp -o address -lgsoap++ Using `wsdl2h -g -taddresstypemap.dat` option `-g` produces bindings for global (root) elements in addition to types and option `-taddresstypemap.dat` specifies a mapping file, see further below. In this case the root element `a:address-book` is bound to `_a__address_book`. The complexType `a:address` is bound to class `a__address`, which is also the type of `_a__address_book`. This option is not required, but allows you to use global element tag names when referring to their serializers, instead of their type name. Using `soapcpp2 -0 -C -S -paddress` option `-0` removes the SOAP protocol and the combination of the two options `-C` and `-S` removes client and server code generation (using option `-C` alone generates client code and using option `-S` alone generates server code). Option `-paddress` renames the output `soap`-prefixed files to `address`-prefixed files. See the `address.cpp` implementation and [related pages](pages.html). The `addresstypemap.dat` file specifies the XML namespace prefix for the bindings: # Bind the address book schema namespace to prefix 'a' a = "urn:address-book-example" # By default the xsd:dateTime schema type is translated to time_t # To map xsd:dateTime to struct tm, enable the following line: # xsd__dateTime = #import "../../custom/struct_tm.h" # ... and compile/link with custom/struct_tm.c The DOB field is a `xsd:dateTime`, which is bound to `time_t` by default. To change this to `struct tm`, enable the import of the `xsd__dateTime` custom serializer by uncommenting the definition of `xsd__dateTime` in `addresstypemap.dat`. Then change `soap_dateTime2s` to `soap_xsd__dateTime2s` in the code. Building the graph serialization example: soapcpp2 -C -S -pgraph -I../../import graph.h c++ -I../.. graph.cpp graphC.cpp -o graph -lgsoap++ To compile without using the `-lgsoap++` library: simply compile `stdsoap2.cpp` together with the above. 🔝 [Back to table of contents](#) Usage ----- To execute the AddressBook example: ./address To execute the Graph serialization example: ./graph gsoap-2.8.91/gsoap/samples/databinding/.deps/0000755000175000017500000000000013525245171020323 5ustar ellertellertgsoap-2.8.91/gsoap/samples/databinding/addresstypemap.dat0000644000175000017500000000057013525245162023033 0ustar ellertellert# Example typemap.dat file for the address book example # Bind the address book schema namespace to prefix 'a' a = "urn:address-book-example" # By default the xsd:dateTime schema type is translated to time_t # To map xsd:dateTime to struct tm, enable the following line: # xsd__dateTime = #import "../../custom/struct_tm.h" # ... and compile/link with custom/struct_tm.c gsoap-2.8.91/gsoap/samples/databinding/Makefile.in0000644000175000017500000005416613525245162021373 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ ####### This is the input file for automake, which will generate Makefile.in ########## VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = address$(EXEEXT) subdir = gsoap/samples/databinding ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = address-addressC.$(OBJEXT) am_address_OBJECTS = $(am__objects_1) address-address.$(OBJEXT) address_OBJECTS = $(am_address_OBJECTS) address_DEPENDENCIES = $(SOAP_CPP_LIB) address_LINK = $(CXXLD) $(address_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/address-address.Po \ ./$(DEPDIR)/address-addressC.Po am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(address_SOURCES) DIST_SOURCES = $(address_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 AM_LDFLAGS = $(AM_CPPFLAGS) -I$(top_srcdir)/gsoap/samples/databinding -L$(top_srcdir)/gsoap/samples/databinding SOAP = $(top_srcdir)/gsoap/src/soapcpp2$(EXEEXT) WSDL = $(top_srcdir)/gsoap/wsdl/wsdl2h$(EXEEXT) WSDL_FLAGS = -g -t $(top_srcdir)/gsoap/samples/databinding/addresstypemap.dat SOAP_FLAGS = -0 -CS -p address -I$(top_srcdir)/gsoap/import WSDLINPUT = $(top_srcdir)/gsoap/samples/databinding/address.xsd SOAPHEADER = $(top_srcdir)/gsoap/samples/databinding/address.h SOAP_CPP_SRC = addressC.cpp SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a address_CFLAGS = $(C_DEBUG_FLAGS) -D$(platform) address_CPPFLAGS = $(C_DEBUG_FLAGS) -D$(platform) address_CXXFLAGS = $(WSDL2H_EXTRA_FLAGS) address_SOURCES = $(SOAP_CPP_SRC) address.cpp address_LDADD = $(SOAP_CPP_LIB) CLEANFILES = *~ address.h *C.cpp *H.h *Stub.h *.nsmap all: all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/databinding/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/databinding/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) address$(EXEEXT): $(address_OBJECTS) $(address_DEPENDENCIES) $(EXTRA_address_DEPENDENCIES) @rm -f address$(EXEEXT) $(AM_V_CXXLD)$(address_LINK) $(address_OBJECTS) $(address_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/address-address.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/address-addressC.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` address-addressC.o: addressC.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(address_CPPFLAGS) $(CPPFLAGS) $(address_CXXFLAGS) $(CXXFLAGS) -MT address-addressC.o -MD -MP -MF $(DEPDIR)/address-addressC.Tpo -c -o address-addressC.o `test -f 'addressC.cpp' || echo '$(srcdir)/'`addressC.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/address-addressC.Tpo $(DEPDIR)/address-addressC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='addressC.cpp' object='address-addressC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(address_CPPFLAGS) $(CPPFLAGS) $(address_CXXFLAGS) $(CXXFLAGS) -c -o address-addressC.o `test -f 'addressC.cpp' || echo '$(srcdir)/'`addressC.cpp address-addressC.obj: addressC.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(address_CPPFLAGS) $(CPPFLAGS) $(address_CXXFLAGS) $(CXXFLAGS) -MT address-addressC.obj -MD -MP -MF $(DEPDIR)/address-addressC.Tpo -c -o address-addressC.obj `if test -f 'addressC.cpp'; then $(CYGPATH_W) 'addressC.cpp'; else $(CYGPATH_W) '$(srcdir)/addressC.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/address-addressC.Tpo $(DEPDIR)/address-addressC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='addressC.cpp' object='address-addressC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(address_CPPFLAGS) $(CPPFLAGS) $(address_CXXFLAGS) $(CXXFLAGS) -c -o address-addressC.obj `if test -f 'addressC.cpp'; then $(CYGPATH_W) 'addressC.cpp'; else $(CYGPATH_W) '$(srcdir)/addressC.cpp'; fi` address-address.o: address.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(address_CPPFLAGS) $(CPPFLAGS) $(address_CXXFLAGS) $(CXXFLAGS) -MT address-address.o -MD -MP -MF $(DEPDIR)/address-address.Tpo -c -o address-address.o `test -f 'address.cpp' || echo '$(srcdir)/'`address.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/address-address.Tpo $(DEPDIR)/address-address.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='address.cpp' object='address-address.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(address_CPPFLAGS) $(CPPFLAGS) $(address_CXXFLAGS) $(CXXFLAGS) -c -o address-address.o `test -f 'address.cpp' || echo '$(srcdir)/'`address.cpp address-address.obj: address.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(address_CPPFLAGS) $(CPPFLAGS) $(address_CXXFLAGS) $(CXXFLAGS) -MT address-address.obj -MD -MP -MF $(DEPDIR)/address-address.Tpo -c -o address-address.obj `if test -f 'address.cpp'; then $(CYGPATH_W) 'address.cpp'; else $(CYGPATH_W) '$(srcdir)/address.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/address-address.Tpo $(DEPDIR)/address-address.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='address.cpp' object='address-address.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(address_CPPFLAGS) $(CPPFLAGS) $(address_CXXFLAGS) $(CXXFLAGS) -c -o address-address.obj `if test -f 'address.cpp'; then $(CYGPATH_W) 'address.cpp'; else $(CYGPATH_W) '$(srcdir)/address.cpp'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/address-address.Po -rm -f ./$(DEPDIR)/address-addressC.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/address-address.Po -rm -f ./$(DEPDIR)/address-addressC.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_CPP_SRC) : $(WSDLINPUT) $(WSDL) $(WSDL_FLAGS) $(WSDLINPUT) $(SOAP) $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/databinding/address.xsd0000644000175000017500000000424313525245162021462 0ustar ellertellert An example address book schema ISO country codes (limited to just a few for this example) An address information item The root element of the address book schema gsoap-2.8.91/gsoap/samples/databinding/Makefile.am0000644000175000017500000000235013525245162021346 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 CPPFLAGS=$(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin AM_LDFLAGS=$(AM_CPPFLAGS) -I$(top_srcdir)/gsoap/samples/databinding -L$(top_srcdir)/gsoap/samples/databinding SOAP=$(top_srcdir)/gsoap/src/soapcpp2$(EXEEXT) WSDL=$(top_srcdir)/gsoap/wsdl/wsdl2h$(EXEEXT) WSDL_FLAGS=-g -t $(top_srcdir)/gsoap/samples/databinding/addresstypemap.dat SOAP_FLAGS=-0 -CS -p address -I$(top_srcdir)/gsoap/import WSDLINPUT=$(top_srcdir)/gsoap/samples/databinding/address.xsd SOAPHEADER=$(top_srcdir)/gsoap/samples/databinding/address.h SOAP_CPP_SRC=addressC.cpp SOAP_CPP_LIB=$(top_builddir)/gsoap/libgsoap++.a $(SOAP_CPP_SRC) : $(WSDLINPUT) $(WSDL) $(WSDL_FLAGS) $(WSDLINPUT) $(SOAP) $(SOAP_FLAGS) $(SOAPHEADER) #LIBS= noinst_PROGRAMS=address address_CFLAGS=$(C_DEBUG_FLAGS) -D$(platform) address_CPPFLAGS=$(C_DEBUG_FLAGS) -D$(platform) address_CXXFLAGS=$(WSDL2H_EXTRA_FLAGS) address_SOURCES=$(SOAP_CPP_SRC) address.cpp address_LDADD=$(SOAP_CPP_LIB) CLEANFILES= *~ address.h *C.cpp *H.h *Stub.h *.nsmap gsoap-2.8.91/gsoap/samples/databinding/address.cpp0000644000175000017500000001605213525245162021447 0ustar ellertellert/** address.cpp Address book example XML data binding application. Illustrates the gSOAP XML data binding with wsdl2h and soappcp2. Copyright (C) 2000-2015 Robert A. van Engelen. All Rights Reserved. Project Source Files - address.xsd Address book - address.cpp Address book app (reads/writes address.xml file) - addresstypemap.dat Schema namespace prefix name preference Generated Files - address.h gSOAP data binding definitions from address.xsd - addressStub.h C++ data binding definitions - addressH.h Serializers - addressC.cpp Serializers - a.nsmap XML namespace mapping file (binds 'a' URI) - address.xml Address book data generated by address app Build: > wsdl2h -g -t addresstypemap.dat address.xsd > soapcpp2 -2 -CS -I../../import -p address address.h > c++ -I../.. address.cpp addressC.cpp -o address ../../stdsoap2.cpp Run: > ./address */ /* -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ int main(); #include #include #include "addressH.h" // generated, also includes stdsoap2.h #include "a.nsmap" // generated /** @fn char *user_input(const char *prompt) @brief A quick-and-dirty user input function: reads string from stdin (up to 80 chars), trims leading and trailing blanks, and returns it @param prompt displays prompt to user @return string input */ char *user_input(const char *prompt); /** @brief Address book application: reads address.xml, displays its content, prompts the user for new contact, adds it, and saves the updated address.xml. */ int main() { // New soap struct engine context // Use strict validation and indented canonicalized output struct soap *soap = soap_new1(SOAP_XML_STRICT | SOAP_XML_INDENT | SOAP_XML_NOTYPE); _a__address_book *ab = soap_new__a__address_book(soap, -1); std::fstream fs; // Read the address book from address.xml (defined by address.xsd) fs.open("address.xml", std::ios::in); if (fs) { soap->is = &fs; if (soap_read__a__address_book(soap, ab) != SOAP_OK) { std::cerr << "Error reading address.xml file" << std::endl; soap_stream_fault(soap, std::cerr); exit(1); } fs.close(); } // Display the address book content std::cout << std::endl << "ADDRESS BOOK - An Example XML Data Binding Application" << std::endl << std::endl; for (std::vector::const_iterator i = ab->address.begin(); i != ab->address.end(); ++i) { if (*i) { std::cout << "Address entry " << (*i)->ID << std::endl; std::cout << "Name: " << (*i)->name << std::endl; std::cout << "Street: " << (*i)->street << std::endl; std::cout << "City: " << (*i)->city << std::endl; std::cout << "Zip: " << (*i)->zip << std::endl; // Advanced level: we use the soapcpp2-generated soap_a__ISO_country2s() // function to convert enum a__ISO_country values to strings. The strings // are allocated in the gSOAP engine and deleted with soap_end() std::cout << "Country: " << soap_a__ISO_country2s(soap, (*i)->country) << std::endl; if ((*i)->phone) std::cout << "Phone: " << *(*i)->phone << std::endl; if ((*i)->mobile) std::cout << "Mobile: " << *(*i)->mobile << std::endl; // Advanced level: use the soap_dateTime2s() from the stdsoap2.cpp engine if ((*i)->dob) std::cout << "DOB: " << soap_dateTime2s(soap, *(*i)->dob) << std::endl; std::cout << "---------" << std::endl; } } // Allocate a new address in the gSOAP engine's data space a__address *a = soap_new_a__address(soap, -1); // Set object's default values (soap_default is generated) a->soap_default(soap); a->ID = ab->address.size() + 1; std::cout << "Enter a new contact:" << std::endl; a->name = user_input("Name"); a->street = user_input("Street"); a->city = user_input("City"); a->zip = user_input("Zip"); char *s; do { s = user_input("Country"); // Advanced level: use the generated s2a__ISO_country() to convert string to // enum constant soap->error = SOAP_OK; if (soap_s2a__ISO_country(soap, s, &a->country) != SOAP_OK) std::cerr << "Not a valid country code" << std::endl; } while (soap->error); if (*(s = user_input("Phone"))) { // Allocate string in engine's data space: a->phone = soap_new_std__string(soap, -1); *a->phone = s; } if (*(s = user_input("Mobile"))) { // Allocate string in engine's data space: a->mobile = soap_new_std__string(soap, -1); *a->mobile = s; } // change soap_s2dateTime to soap_xsd__dateTime when overriding the default xsd:dateTime to time_t mapping if (*(s = user_input("DOB"))) if (soap_s2dateTime(soap, s, a->dob) != SOAP_OK) std::cerr << "Not a valid ISO 8601 date time (ignored)" << std::endl; soap->error = SOAP_OK; // Add contact to address book ab->address.push_back(a); std::cout << std::endl << "Contact information added." << std::endl; // Save updated address book to address.xml fs.open("address.xml", std::ios::out); if (!fs) { std::cerr << "Cannot create address.xml file" << std::endl; exit(1); } soap->os = &fs; if (soap_write__a__address_book(soap, ab) != SOAP_OK) { std::cerr << "Error writing address.xml file" << std::endl; soap_stream_fault(soap, std::cerr); exit(1); } fs.close(); // Delete instances soap_destroy(soap); // Delete data soap_end(soap); // Free soap struct engine context soap_free(soap); return 0; } char *user_input(const char *prompt) { static char buf[80]; char *s; printf("%-9s> ", prompt); fgets(buf, 80, stdin); // Strip trailing space for (s = buf + strlen(buf) - 1; s > buf; s--) { if (*s > ' ') break; } s[1] = '\0'; // Strip leading space for (s = buf; *s; s++) { if (*s > ' ') break; } return s; } gsoap-2.8.91/gsoap/samples/databinding/graph.h0000644000175000017500000000334513525245162020571 0ustar ellertellert/* graph.h Tree, digraph, and cyclic graph serialization example. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #import "stlvector.h" // a gSOAP directive to produce a xmlns:g="urn:graph" namespace binding: //gsoap g schema namespace: urn:graph /** A recursive data type that is (invisibly) bound to the 'g' XML namespace */ class g:Graph { public: std::vector edges; ///< public members are serializable }; gsoap-2.8.91/gsoap/samples/databinding/graph.cpp0000644000175000017500000001321113525245162021115 0ustar ellertellert/** graph.cpp Demonstrated tree, digraph, and cyclic graph serialization. Copyright (C) 2000-2015 Robert A. van Engelen. All Rights Reserved. Project Source Files - graph.h Graph (tree, digraph, cyclic graph) data binding - graph.cpp Test graph serialization as tree, digraph, and cyclic Generated Files - graphH.h Serializers - graphC.cpp Serializers Build: > soapcpp2 -CS -Iimport -p graph graph.h > c++ -o graph graph.cpp graphC.cpp stdsoap2.cpp Usage: > ./graph */ /* -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ int main(); // include all gSOAP header files: #include "graphH.h" #include "g.nsmap" /// Namespace mapping table for non-SOAP use static struct Namespace nosoap_nsmap[] = { {"SOAP-ENV", NULL, NULL, NULL}, {"SOAP-ENC", NULL, NULL, 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}, {"g", "urn:graph", NULL, NULL}, {NULL, NULL, NULL, NULL} }; /// Namespace mapping table for SOAP 1.1 static struct Namespace soap11_nsmap[] = { {"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}, {"g", "urn:graph", NULL, NULL}, {NULL, NULL, NULL, NULL} }; /// Namespace mapping table for SOAP 1.2 static struct Namespace soap12_nsmap[] = { {"SOAP-ENV", "http://www.w3.org/2003/05/soap-envelope", "http://schemas.xmlsoap.org/soap/envelope/", NULL}, {"SOAP-ENC", "http://www.w3.org/2003/05/soap-encoding", "http://schemas.xmlsoap.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}, {"g", "urn:graph", NULL, NULL}, {NULL, NULL, NULL, NULL} }; int main() { struct soap *ctx = soap_new1(SOAP_XML_INDENT); soap_set_namespaces(ctx, nosoap_nsmap); // a tree: Graph tree; // with 5 branches: for (int i = 0; i < 4; ++i) { Graph *branch = soap_new_Graph(ctx); tree.edges.push_back(branch); // each branch has a couple of leaves: for (int j = 0; j < i; ++j) branch->edges.push_back(soap_new_Graph(ctx)); } std::cout << "**** XML TREE FROM C++ TREE ****" << std::endl; soap_write_Graph(ctx, &tree); std::cout << std::endl << std::endl; std::cout << "**** XML TREE FROM C++ DIGRAPH ****" << std::endl; tree.edges[0] = tree.edges[1]; // first pair of edges point to shared node tree.edges[2] = tree.edges[3]; // second pair of edges point to shared node soap_write_Graph(ctx, &tree); std::cout << std::endl << std::endl; std::cout << "**** XML ID-REF DIGRAPH FROM C++ DIGRAPH ****" << std::endl; soap_set_omode(ctx, SOAP_XML_GRAPH); soap_write_Graph(ctx, &tree); std::cout << std::endl << std::endl; soap_clr_omode(ctx, SOAP_XML_GRAPH); std::cout << "**** XML ID-REF DIGRAPH FROM C++ CYCLIC GRAPH ****" << std::endl; tree.edges[0]->edges = tree.edges; // create cycle soap_set_omode(ctx, SOAP_XML_GRAPH); soap_write_Graph(ctx, &tree); std::cout << std::endl << std::endl; soap_clr_omode(ctx, SOAP_XML_GRAPH); std::cout << "**** XML TREE (PRUNED CYCLIC BRANCHES) FROM C++ CYCLIC GRAPH ****" << std::endl; soap_set_omode(ctx, SOAP_XML_TREE); soap_write_Graph(ctx, &tree); std::cout << std::endl << std::endl; soap_clr_omode(ctx, SOAP_XML_TREE); std::cout << "**** SOAP 1.1 ENCODED GRAPH FROM C++ CYCLIC GRAPH ****" << std::endl; soap_set_namespaces(ctx, soap11_nsmap); soap_set_version(ctx, 1); // enable SOAP 1.1 ctx->encodingStyle = ""; // encoded soap_write_Graph(ctx, &tree); std::cout << std::endl << std::endl; std::cout << "**** SOAP 1.2 ENCODED GRAPH FROM C++ CYCLIC GRAPH ****" << std::endl; soap_set_namespaces(ctx, soap12_nsmap); soap_set_version(ctx, 2); // enable SOAP 1.2 ctx->encodingStyle = ""; // encoded soap_write_Graph(ctx, &tree); std::cout << std::endl << std::endl; soap_destroy(ctx); // delete objects soap_end(ctx); // free temp data soap_free(ctx); // release context return 0; } gsoap-2.8.91/gsoap/samples/wsrm/0000755000175000017500000000000013525245203016032 5ustar ellertellertgsoap-2.8.91/gsoap/samples/wsrm/.deps/0000755000175000017500000000000013525245203017043 5ustar ellertellertgsoap-2.8.91/gsoap/samples/wsrm/.deps/wsademo.Po0000644000175000017500000000001013525245163020776 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/samples/wsrm/Makefile.in0000644000175000017500000022127713525245163020117 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = wsrmdemo$(EXEEXT) wsrmdemo_udp$(EXEEXT) \ wsrmdemo_ssl$(EXEEXT) subdir = gsoap/samples/wsrm ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = wsrmdemo-soapC.$(OBJEXT) am__objects_3 = wsrmdemo-soapClient.$(OBJEXT) $(am__objects_2) am__objects_4 = $(am__objects_3) wsrmdemo-soapServer.$(OBJEXT) \ $(am__objects_1) $(am__objects_1) am_wsrmdemo_OBJECTS = wsrmdemo-wsrmdemo.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) wsrmdemo-wsaapi.$(OBJEXT) \ wsrmdemo-wsrmapi.$(OBJEXT) wsrmdemo-threads.$(OBJEXT) \ wsrmdemo-duration.$(OBJEXT) wsrmdemo_OBJECTS = $(am_wsrmdemo_OBJECTS) am__DEPENDENCIES_1 = wsrmdemo_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) wsrmdemo_LINK = $(CCLD) $(wsrmdemo_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ am__objects_5 = wsrmdemo_ssl-soapC.$(OBJEXT) am__objects_6 = wsrmdemo_ssl-soapClient.$(OBJEXT) $(am__objects_5) am__objects_7 = $(am__objects_6) wsrmdemo_ssl-soapServer.$(OBJEXT) \ $(am__objects_1) $(am__objects_1) am_wsrmdemo_ssl_OBJECTS = wsrmdemo_ssl-wsrmdemo.$(OBJEXT) \ $(am__objects_1) $(am__objects_7) \ wsrmdemo_ssl-wsaapi.$(OBJEXT) wsrmdemo_ssl-wsrmapi.$(OBJEXT) \ wsrmdemo_ssl-threads.$(OBJEXT) wsrmdemo_ssl-duration.$(OBJEXT) wsrmdemo_ssl_OBJECTS = $(am_wsrmdemo_ssl_OBJECTS) wsrmdemo_ssl_DEPENDENCIES = $(SOAP_C_LIB_SSL) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) wsrmdemo_ssl_LINK = $(CCLD) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ am__objects_8 = wsrmdemo_udp-soapC.$(OBJEXT) am__objects_9 = wsrmdemo_udp-soapClient.$(OBJEXT) $(am__objects_8) am__objects_10 = $(am__objects_9) wsrmdemo_udp-soapServer.$(OBJEXT) \ $(am__objects_1) $(am__objects_1) am_wsrmdemo_udp_OBJECTS = wsrmdemo_udp-wsrmdemo.$(OBJEXT) \ $(am__objects_1) $(am__objects_10) \ wsrmdemo_udp-wsaapi.$(OBJEXT) wsrmdemo_udp-wsrmapi.$(OBJEXT) \ wsrmdemo_udp-threads.$(OBJEXT) wsrmdemo_udp-duration.$(OBJEXT) wsrmdemo_udp_OBJECTS = $(am_wsrmdemo_udp_OBJECTS) wsrmdemo_udp_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) wsrmdemo_udp_LINK = $(CCLD) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/wsrmdemo-duration.Po \ ./$(DEPDIR)/wsrmdemo-soapC.Po \ ./$(DEPDIR)/wsrmdemo-soapClient.Po \ ./$(DEPDIR)/wsrmdemo-soapServer.Po \ ./$(DEPDIR)/wsrmdemo-threads.Po ./$(DEPDIR)/wsrmdemo-wsaapi.Po \ ./$(DEPDIR)/wsrmdemo-wsrmapi.Po \ ./$(DEPDIR)/wsrmdemo-wsrmdemo.Po \ ./$(DEPDIR)/wsrmdemo_ssl-duration.Po \ ./$(DEPDIR)/wsrmdemo_ssl-soapC.Po \ ./$(DEPDIR)/wsrmdemo_ssl-soapClient.Po \ ./$(DEPDIR)/wsrmdemo_ssl-soapServer.Po \ ./$(DEPDIR)/wsrmdemo_ssl-threads.Po \ ./$(DEPDIR)/wsrmdemo_ssl-wsaapi.Po \ ./$(DEPDIR)/wsrmdemo_ssl-wsrmapi.Po \ ./$(DEPDIR)/wsrmdemo_ssl-wsrmdemo.Po \ ./$(DEPDIR)/wsrmdemo_udp-duration.Po \ ./$(DEPDIR)/wsrmdemo_udp-soapC.Po \ ./$(DEPDIR)/wsrmdemo_udp-soapClient.Po \ ./$(DEPDIR)/wsrmdemo_udp-soapServer.Po \ ./$(DEPDIR)/wsrmdemo_udp-threads.Po \ ./$(DEPDIR)/wsrmdemo_udp-wsaapi.Po \ ./$(DEPDIR)/wsrmdemo_udp-wsrmapi.Po \ ./$(DEPDIR)/wsrmdemo_udp-wsrmdemo.Po am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(wsrmdemo_SOURCES) $(wsrmdemo_ssl_SOURCES) \ $(wsrmdemo_udp_SOURCES) DIST_SOURCES = $(wsrmdemo_SOURCES) $(wsrmdemo_ssl_SOURCES) \ $(wsrmdemo_udp_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.c_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = foreign 1.4 SOAPHEADER = wsrmdemo.h SOAP_FLAGS = -a AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = wsrmdemo.nsmap wsrmdemo.wsdl wsrmdemo_CFLAGS = wsrmdemo_SOURCES = wsrmdemo.c $(SOAPHEADER) $(SOAP_C_SRC) ../../plugin/wsaapi.c ../../plugin/wsrmapi.c ../../plugin/threads.c ../../custom/duration.c wsrmdemo_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread wsrmdemo_udp_CFLAGS = -DWITH_UDP wsrmdemo_udp_SOURCES = wsrmdemo.c $(SOAPHEADER) $(SOAP_C_SRC) ../../plugin/wsaapi.c ../../plugin/wsrmapi.c ../../plugin/threads.c ../../custom/duration.c wsrmdemo_udp_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread wsrmdemo_ssl_CFLAGS = -DWITH_OPENSSL wsrmdemo_ssl_SOURCES = wsrmdemo.c $(SOAPHEADER) $(SOAP_C_SRC) ../../plugin/wsaapi.c ../../plugin/wsrmapi.c ../../plugin/threads.c ../../custom/duration.c wsrmdemo_ssl_LDADD = $(SOAP_C_LIB_SSL) $(SAMPLE_SSL_LIBS) $(SAMPLE_EXTRA_LIBS) -lssl -lcrypto -lz -lpthread all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/wsrm/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/wsrm/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) wsrmdemo$(EXEEXT): $(wsrmdemo_OBJECTS) $(wsrmdemo_DEPENDENCIES) $(EXTRA_wsrmdemo_DEPENDENCIES) @rm -f wsrmdemo$(EXEEXT) $(AM_V_CCLD)$(wsrmdemo_LINK) $(wsrmdemo_OBJECTS) $(wsrmdemo_LDADD) $(LIBS) wsrmdemo_ssl$(EXEEXT): $(wsrmdemo_ssl_OBJECTS) $(wsrmdemo_ssl_DEPENDENCIES) $(EXTRA_wsrmdemo_ssl_DEPENDENCIES) @rm -f wsrmdemo_ssl$(EXEEXT) $(AM_V_CCLD)$(wsrmdemo_ssl_LINK) $(wsrmdemo_ssl_OBJECTS) $(wsrmdemo_ssl_LDADD) $(LIBS) wsrmdemo_udp$(EXEEXT): $(wsrmdemo_udp_OBJECTS) $(wsrmdemo_udp_DEPENDENCIES) $(EXTRA_wsrmdemo_udp_DEPENDENCIES) @rm -f wsrmdemo_udp$(EXEEXT) $(AM_V_CCLD)$(wsrmdemo_udp_LINK) $(wsrmdemo_udp_OBJECTS) $(wsrmdemo_udp_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo-duration.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo-soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo-soapClient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo-soapServer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo-threads.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo-wsaapi.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo-wsrmapi.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo-wsrmdemo.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_ssl-duration.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_ssl-soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_ssl-soapClient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_ssl-soapServer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_ssl-threads.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_ssl-wsaapi.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_ssl-wsrmapi.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_ssl-wsrmdemo.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_udp-duration.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_udp-soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_udp-soapClient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_udp-soapServer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_udp-threads.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_udp-wsaapi.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_udp-wsrmapi.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsrmdemo_udp-wsrmdemo.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` wsrmdemo-wsrmdemo.o: wsrmdemo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-wsrmdemo.o -MD -MP -MF $(DEPDIR)/wsrmdemo-wsrmdemo.Tpo -c -o wsrmdemo-wsrmdemo.o `test -f 'wsrmdemo.c' || echo '$(srcdir)/'`wsrmdemo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-wsrmdemo.Tpo $(DEPDIR)/wsrmdemo-wsrmdemo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wsrmdemo.c' object='wsrmdemo-wsrmdemo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-wsrmdemo.o `test -f 'wsrmdemo.c' || echo '$(srcdir)/'`wsrmdemo.c wsrmdemo-wsrmdemo.obj: wsrmdemo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-wsrmdemo.obj -MD -MP -MF $(DEPDIR)/wsrmdemo-wsrmdemo.Tpo -c -o wsrmdemo-wsrmdemo.obj `if test -f 'wsrmdemo.c'; then $(CYGPATH_W) 'wsrmdemo.c'; else $(CYGPATH_W) '$(srcdir)/wsrmdemo.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-wsrmdemo.Tpo $(DEPDIR)/wsrmdemo-wsrmdemo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wsrmdemo.c' object='wsrmdemo-wsrmdemo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-wsrmdemo.obj `if test -f 'wsrmdemo.c'; then $(CYGPATH_W) 'wsrmdemo.c'; else $(CYGPATH_W) '$(srcdir)/wsrmdemo.c'; fi` wsrmdemo-soapClient.o: soapClient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-soapClient.o -MD -MP -MF $(DEPDIR)/wsrmdemo-soapClient.Tpo -c -o wsrmdemo-soapClient.o `test -f 'soapClient.c' || echo '$(srcdir)/'`soapClient.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-soapClient.Tpo $(DEPDIR)/wsrmdemo-soapClient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapClient.c' object='wsrmdemo-soapClient.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-soapClient.o `test -f 'soapClient.c' || echo '$(srcdir)/'`soapClient.c wsrmdemo-soapClient.obj: soapClient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-soapClient.obj -MD -MP -MF $(DEPDIR)/wsrmdemo-soapClient.Tpo -c -o wsrmdemo-soapClient.obj `if test -f 'soapClient.c'; then $(CYGPATH_W) 'soapClient.c'; else $(CYGPATH_W) '$(srcdir)/soapClient.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-soapClient.Tpo $(DEPDIR)/wsrmdemo-soapClient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapClient.c' object='wsrmdemo-soapClient.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-soapClient.obj `if test -f 'soapClient.c'; then $(CYGPATH_W) 'soapClient.c'; else $(CYGPATH_W) '$(srcdir)/soapClient.c'; fi` wsrmdemo-soapC.o: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-soapC.o -MD -MP -MF $(DEPDIR)/wsrmdemo-soapC.Tpo -c -o wsrmdemo-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-soapC.Tpo $(DEPDIR)/wsrmdemo-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='wsrmdemo-soapC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c wsrmdemo-soapC.obj: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-soapC.obj -MD -MP -MF $(DEPDIR)/wsrmdemo-soapC.Tpo -c -o wsrmdemo-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-soapC.Tpo $(DEPDIR)/wsrmdemo-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='wsrmdemo-soapC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` wsrmdemo-soapServer.o: soapServer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-soapServer.o -MD -MP -MF $(DEPDIR)/wsrmdemo-soapServer.Tpo -c -o wsrmdemo-soapServer.o `test -f 'soapServer.c' || echo '$(srcdir)/'`soapServer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-soapServer.Tpo $(DEPDIR)/wsrmdemo-soapServer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapServer.c' object='wsrmdemo-soapServer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-soapServer.o `test -f 'soapServer.c' || echo '$(srcdir)/'`soapServer.c wsrmdemo-soapServer.obj: soapServer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-soapServer.obj -MD -MP -MF $(DEPDIR)/wsrmdemo-soapServer.Tpo -c -o wsrmdemo-soapServer.obj `if test -f 'soapServer.c'; then $(CYGPATH_W) 'soapServer.c'; else $(CYGPATH_W) '$(srcdir)/soapServer.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-soapServer.Tpo $(DEPDIR)/wsrmdemo-soapServer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapServer.c' object='wsrmdemo-soapServer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-soapServer.obj `if test -f 'soapServer.c'; then $(CYGPATH_W) 'soapServer.c'; else $(CYGPATH_W) '$(srcdir)/soapServer.c'; fi` wsrmdemo-wsaapi.o: ../../plugin/wsaapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-wsaapi.o -MD -MP -MF $(DEPDIR)/wsrmdemo-wsaapi.Tpo -c -o wsrmdemo-wsaapi.o `test -f '../../plugin/wsaapi.c' || echo '$(srcdir)/'`../../plugin/wsaapi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-wsaapi.Tpo $(DEPDIR)/wsrmdemo-wsaapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsaapi.c' object='wsrmdemo-wsaapi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-wsaapi.o `test -f '../../plugin/wsaapi.c' || echo '$(srcdir)/'`../../plugin/wsaapi.c wsrmdemo-wsaapi.obj: ../../plugin/wsaapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-wsaapi.obj -MD -MP -MF $(DEPDIR)/wsrmdemo-wsaapi.Tpo -c -o wsrmdemo-wsaapi.obj `if test -f '../../plugin/wsaapi.c'; then $(CYGPATH_W) '../../plugin/wsaapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsaapi.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-wsaapi.Tpo $(DEPDIR)/wsrmdemo-wsaapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsaapi.c' object='wsrmdemo-wsaapi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-wsaapi.obj `if test -f '../../plugin/wsaapi.c'; then $(CYGPATH_W) '../../plugin/wsaapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsaapi.c'; fi` wsrmdemo-wsrmapi.o: ../../plugin/wsrmapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-wsrmapi.o -MD -MP -MF $(DEPDIR)/wsrmdemo-wsrmapi.Tpo -c -o wsrmdemo-wsrmapi.o `test -f '../../plugin/wsrmapi.c' || echo '$(srcdir)/'`../../plugin/wsrmapi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-wsrmapi.Tpo $(DEPDIR)/wsrmdemo-wsrmapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsrmapi.c' object='wsrmdemo-wsrmapi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-wsrmapi.o `test -f '../../plugin/wsrmapi.c' || echo '$(srcdir)/'`../../plugin/wsrmapi.c wsrmdemo-wsrmapi.obj: ../../plugin/wsrmapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-wsrmapi.obj -MD -MP -MF $(DEPDIR)/wsrmdemo-wsrmapi.Tpo -c -o wsrmdemo-wsrmapi.obj `if test -f '../../plugin/wsrmapi.c'; then $(CYGPATH_W) '../../plugin/wsrmapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsrmapi.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-wsrmapi.Tpo $(DEPDIR)/wsrmdemo-wsrmapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsrmapi.c' object='wsrmdemo-wsrmapi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-wsrmapi.obj `if test -f '../../plugin/wsrmapi.c'; then $(CYGPATH_W) '../../plugin/wsrmapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsrmapi.c'; fi` wsrmdemo-threads.o: ../../plugin/threads.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-threads.o -MD -MP -MF $(DEPDIR)/wsrmdemo-threads.Tpo -c -o wsrmdemo-threads.o `test -f '../../plugin/threads.c' || echo '$(srcdir)/'`../../plugin/threads.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-threads.Tpo $(DEPDIR)/wsrmdemo-threads.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/threads.c' object='wsrmdemo-threads.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-threads.o `test -f '../../plugin/threads.c' || echo '$(srcdir)/'`../../plugin/threads.c wsrmdemo-threads.obj: ../../plugin/threads.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-threads.obj -MD -MP -MF $(DEPDIR)/wsrmdemo-threads.Tpo -c -o wsrmdemo-threads.obj `if test -f '../../plugin/threads.c'; then $(CYGPATH_W) '../../plugin/threads.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/threads.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-threads.Tpo $(DEPDIR)/wsrmdemo-threads.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/threads.c' object='wsrmdemo-threads.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-threads.obj `if test -f '../../plugin/threads.c'; then $(CYGPATH_W) '../../plugin/threads.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/threads.c'; fi` wsrmdemo-duration.o: ../../custom/duration.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-duration.o -MD -MP -MF $(DEPDIR)/wsrmdemo-duration.Tpo -c -o wsrmdemo-duration.o `test -f '../../custom/duration.c' || echo '$(srcdir)/'`../../custom/duration.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-duration.Tpo $(DEPDIR)/wsrmdemo-duration.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../custom/duration.c' object='wsrmdemo-duration.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-duration.o `test -f '../../custom/duration.c' || echo '$(srcdir)/'`../../custom/duration.c wsrmdemo-duration.obj: ../../custom/duration.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -MT wsrmdemo-duration.obj -MD -MP -MF $(DEPDIR)/wsrmdemo-duration.Tpo -c -o wsrmdemo-duration.obj `if test -f '../../custom/duration.c'; then $(CYGPATH_W) '../../custom/duration.c'; else $(CYGPATH_W) '$(srcdir)/../../custom/duration.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo-duration.Tpo $(DEPDIR)/wsrmdemo-duration.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../custom/duration.c' object='wsrmdemo-duration.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_CFLAGS) $(CFLAGS) -c -o wsrmdemo-duration.obj `if test -f '../../custom/duration.c'; then $(CYGPATH_W) '../../custom/duration.c'; else $(CYGPATH_W) '$(srcdir)/../../custom/duration.c'; fi` wsrmdemo_ssl-wsrmdemo.o: wsrmdemo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-wsrmdemo.o -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-wsrmdemo.Tpo -c -o wsrmdemo_ssl-wsrmdemo.o `test -f 'wsrmdemo.c' || echo '$(srcdir)/'`wsrmdemo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-wsrmdemo.Tpo $(DEPDIR)/wsrmdemo_ssl-wsrmdemo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wsrmdemo.c' object='wsrmdemo_ssl-wsrmdemo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-wsrmdemo.o `test -f 'wsrmdemo.c' || echo '$(srcdir)/'`wsrmdemo.c wsrmdemo_ssl-wsrmdemo.obj: wsrmdemo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-wsrmdemo.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-wsrmdemo.Tpo -c -o wsrmdemo_ssl-wsrmdemo.obj `if test -f 'wsrmdemo.c'; then $(CYGPATH_W) 'wsrmdemo.c'; else $(CYGPATH_W) '$(srcdir)/wsrmdemo.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-wsrmdemo.Tpo $(DEPDIR)/wsrmdemo_ssl-wsrmdemo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wsrmdemo.c' object='wsrmdemo_ssl-wsrmdemo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-wsrmdemo.obj `if test -f 'wsrmdemo.c'; then $(CYGPATH_W) 'wsrmdemo.c'; else $(CYGPATH_W) '$(srcdir)/wsrmdemo.c'; fi` wsrmdemo_ssl-soapClient.o: soapClient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-soapClient.o -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-soapClient.Tpo -c -o wsrmdemo_ssl-soapClient.o `test -f 'soapClient.c' || echo '$(srcdir)/'`soapClient.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-soapClient.Tpo $(DEPDIR)/wsrmdemo_ssl-soapClient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapClient.c' object='wsrmdemo_ssl-soapClient.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-soapClient.o `test -f 'soapClient.c' || echo '$(srcdir)/'`soapClient.c wsrmdemo_ssl-soapClient.obj: soapClient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-soapClient.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-soapClient.Tpo -c -o wsrmdemo_ssl-soapClient.obj `if test -f 'soapClient.c'; then $(CYGPATH_W) 'soapClient.c'; else $(CYGPATH_W) '$(srcdir)/soapClient.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-soapClient.Tpo $(DEPDIR)/wsrmdemo_ssl-soapClient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapClient.c' object='wsrmdemo_ssl-soapClient.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-soapClient.obj `if test -f 'soapClient.c'; then $(CYGPATH_W) 'soapClient.c'; else $(CYGPATH_W) '$(srcdir)/soapClient.c'; fi` wsrmdemo_ssl-soapC.o: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-soapC.o -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-soapC.Tpo -c -o wsrmdemo_ssl-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-soapC.Tpo $(DEPDIR)/wsrmdemo_ssl-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='wsrmdemo_ssl-soapC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c wsrmdemo_ssl-soapC.obj: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-soapC.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-soapC.Tpo -c -o wsrmdemo_ssl-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-soapC.Tpo $(DEPDIR)/wsrmdemo_ssl-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='wsrmdemo_ssl-soapC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` wsrmdemo_ssl-soapServer.o: soapServer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-soapServer.o -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-soapServer.Tpo -c -o wsrmdemo_ssl-soapServer.o `test -f 'soapServer.c' || echo '$(srcdir)/'`soapServer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-soapServer.Tpo $(DEPDIR)/wsrmdemo_ssl-soapServer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapServer.c' object='wsrmdemo_ssl-soapServer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-soapServer.o `test -f 'soapServer.c' || echo '$(srcdir)/'`soapServer.c wsrmdemo_ssl-soapServer.obj: soapServer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-soapServer.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-soapServer.Tpo -c -o wsrmdemo_ssl-soapServer.obj `if test -f 'soapServer.c'; then $(CYGPATH_W) 'soapServer.c'; else $(CYGPATH_W) '$(srcdir)/soapServer.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-soapServer.Tpo $(DEPDIR)/wsrmdemo_ssl-soapServer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapServer.c' object='wsrmdemo_ssl-soapServer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-soapServer.obj `if test -f 'soapServer.c'; then $(CYGPATH_W) 'soapServer.c'; else $(CYGPATH_W) '$(srcdir)/soapServer.c'; fi` wsrmdemo_ssl-wsaapi.o: ../../plugin/wsaapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-wsaapi.o -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-wsaapi.Tpo -c -o wsrmdemo_ssl-wsaapi.o `test -f '../../plugin/wsaapi.c' || echo '$(srcdir)/'`../../plugin/wsaapi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-wsaapi.Tpo $(DEPDIR)/wsrmdemo_ssl-wsaapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsaapi.c' object='wsrmdemo_ssl-wsaapi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-wsaapi.o `test -f '../../plugin/wsaapi.c' || echo '$(srcdir)/'`../../plugin/wsaapi.c wsrmdemo_ssl-wsaapi.obj: ../../plugin/wsaapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-wsaapi.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-wsaapi.Tpo -c -o wsrmdemo_ssl-wsaapi.obj `if test -f '../../plugin/wsaapi.c'; then $(CYGPATH_W) '../../plugin/wsaapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsaapi.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-wsaapi.Tpo $(DEPDIR)/wsrmdemo_ssl-wsaapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsaapi.c' object='wsrmdemo_ssl-wsaapi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-wsaapi.obj `if test -f '../../plugin/wsaapi.c'; then $(CYGPATH_W) '../../plugin/wsaapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsaapi.c'; fi` wsrmdemo_ssl-wsrmapi.o: ../../plugin/wsrmapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-wsrmapi.o -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-wsrmapi.Tpo -c -o wsrmdemo_ssl-wsrmapi.o `test -f '../../plugin/wsrmapi.c' || echo '$(srcdir)/'`../../plugin/wsrmapi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-wsrmapi.Tpo $(DEPDIR)/wsrmdemo_ssl-wsrmapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsrmapi.c' object='wsrmdemo_ssl-wsrmapi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-wsrmapi.o `test -f '../../plugin/wsrmapi.c' || echo '$(srcdir)/'`../../plugin/wsrmapi.c wsrmdemo_ssl-wsrmapi.obj: ../../plugin/wsrmapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-wsrmapi.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-wsrmapi.Tpo -c -o wsrmdemo_ssl-wsrmapi.obj `if test -f '../../plugin/wsrmapi.c'; then $(CYGPATH_W) '../../plugin/wsrmapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsrmapi.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-wsrmapi.Tpo $(DEPDIR)/wsrmdemo_ssl-wsrmapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsrmapi.c' object='wsrmdemo_ssl-wsrmapi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-wsrmapi.obj `if test -f '../../plugin/wsrmapi.c'; then $(CYGPATH_W) '../../plugin/wsrmapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsrmapi.c'; fi` wsrmdemo_ssl-threads.o: ../../plugin/threads.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-threads.o -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-threads.Tpo -c -o wsrmdemo_ssl-threads.o `test -f '../../plugin/threads.c' || echo '$(srcdir)/'`../../plugin/threads.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-threads.Tpo $(DEPDIR)/wsrmdemo_ssl-threads.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/threads.c' object='wsrmdemo_ssl-threads.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-threads.o `test -f '../../plugin/threads.c' || echo '$(srcdir)/'`../../plugin/threads.c wsrmdemo_ssl-threads.obj: ../../plugin/threads.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-threads.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-threads.Tpo -c -o wsrmdemo_ssl-threads.obj `if test -f '../../plugin/threads.c'; then $(CYGPATH_W) '../../plugin/threads.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/threads.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-threads.Tpo $(DEPDIR)/wsrmdemo_ssl-threads.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/threads.c' object='wsrmdemo_ssl-threads.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-threads.obj `if test -f '../../plugin/threads.c'; then $(CYGPATH_W) '../../plugin/threads.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/threads.c'; fi` wsrmdemo_ssl-duration.o: ../../custom/duration.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-duration.o -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-duration.Tpo -c -o wsrmdemo_ssl-duration.o `test -f '../../custom/duration.c' || echo '$(srcdir)/'`../../custom/duration.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-duration.Tpo $(DEPDIR)/wsrmdemo_ssl-duration.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../custom/duration.c' object='wsrmdemo_ssl-duration.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-duration.o `test -f '../../custom/duration.c' || echo '$(srcdir)/'`../../custom/duration.c wsrmdemo_ssl-duration.obj: ../../custom/duration.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -MT wsrmdemo_ssl-duration.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_ssl-duration.Tpo -c -o wsrmdemo_ssl-duration.obj `if test -f '../../custom/duration.c'; then $(CYGPATH_W) '../../custom/duration.c'; else $(CYGPATH_W) '$(srcdir)/../../custom/duration.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_ssl-duration.Tpo $(DEPDIR)/wsrmdemo_ssl-duration.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../custom/duration.c' object='wsrmdemo_ssl-duration.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_ssl_CFLAGS) $(CFLAGS) -c -o wsrmdemo_ssl-duration.obj `if test -f '../../custom/duration.c'; then $(CYGPATH_W) '../../custom/duration.c'; else $(CYGPATH_W) '$(srcdir)/../../custom/duration.c'; fi` wsrmdemo_udp-wsrmdemo.o: wsrmdemo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-wsrmdemo.o -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-wsrmdemo.Tpo -c -o wsrmdemo_udp-wsrmdemo.o `test -f 'wsrmdemo.c' || echo '$(srcdir)/'`wsrmdemo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-wsrmdemo.Tpo $(DEPDIR)/wsrmdemo_udp-wsrmdemo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wsrmdemo.c' object='wsrmdemo_udp-wsrmdemo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-wsrmdemo.o `test -f 'wsrmdemo.c' || echo '$(srcdir)/'`wsrmdemo.c wsrmdemo_udp-wsrmdemo.obj: wsrmdemo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-wsrmdemo.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-wsrmdemo.Tpo -c -o wsrmdemo_udp-wsrmdemo.obj `if test -f 'wsrmdemo.c'; then $(CYGPATH_W) 'wsrmdemo.c'; else $(CYGPATH_W) '$(srcdir)/wsrmdemo.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-wsrmdemo.Tpo $(DEPDIR)/wsrmdemo_udp-wsrmdemo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wsrmdemo.c' object='wsrmdemo_udp-wsrmdemo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-wsrmdemo.obj `if test -f 'wsrmdemo.c'; then $(CYGPATH_W) 'wsrmdemo.c'; else $(CYGPATH_W) '$(srcdir)/wsrmdemo.c'; fi` wsrmdemo_udp-soapClient.o: soapClient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-soapClient.o -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-soapClient.Tpo -c -o wsrmdemo_udp-soapClient.o `test -f 'soapClient.c' || echo '$(srcdir)/'`soapClient.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-soapClient.Tpo $(DEPDIR)/wsrmdemo_udp-soapClient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapClient.c' object='wsrmdemo_udp-soapClient.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-soapClient.o `test -f 'soapClient.c' || echo '$(srcdir)/'`soapClient.c wsrmdemo_udp-soapClient.obj: soapClient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-soapClient.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-soapClient.Tpo -c -o wsrmdemo_udp-soapClient.obj `if test -f 'soapClient.c'; then $(CYGPATH_W) 'soapClient.c'; else $(CYGPATH_W) '$(srcdir)/soapClient.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-soapClient.Tpo $(DEPDIR)/wsrmdemo_udp-soapClient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapClient.c' object='wsrmdemo_udp-soapClient.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-soapClient.obj `if test -f 'soapClient.c'; then $(CYGPATH_W) 'soapClient.c'; else $(CYGPATH_W) '$(srcdir)/soapClient.c'; fi` wsrmdemo_udp-soapC.o: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-soapC.o -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-soapC.Tpo -c -o wsrmdemo_udp-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-soapC.Tpo $(DEPDIR)/wsrmdemo_udp-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='wsrmdemo_udp-soapC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c wsrmdemo_udp-soapC.obj: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-soapC.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-soapC.Tpo -c -o wsrmdemo_udp-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-soapC.Tpo $(DEPDIR)/wsrmdemo_udp-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='wsrmdemo_udp-soapC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` wsrmdemo_udp-soapServer.o: soapServer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-soapServer.o -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-soapServer.Tpo -c -o wsrmdemo_udp-soapServer.o `test -f 'soapServer.c' || echo '$(srcdir)/'`soapServer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-soapServer.Tpo $(DEPDIR)/wsrmdemo_udp-soapServer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapServer.c' object='wsrmdemo_udp-soapServer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-soapServer.o `test -f 'soapServer.c' || echo '$(srcdir)/'`soapServer.c wsrmdemo_udp-soapServer.obj: soapServer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-soapServer.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-soapServer.Tpo -c -o wsrmdemo_udp-soapServer.obj `if test -f 'soapServer.c'; then $(CYGPATH_W) 'soapServer.c'; else $(CYGPATH_W) '$(srcdir)/soapServer.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-soapServer.Tpo $(DEPDIR)/wsrmdemo_udp-soapServer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapServer.c' object='wsrmdemo_udp-soapServer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-soapServer.obj `if test -f 'soapServer.c'; then $(CYGPATH_W) 'soapServer.c'; else $(CYGPATH_W) '$(srcdir)/soapServer.c'; fi` wsrmdemo_udp-wsaapi.o: ../../plugin/wsaapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-wsaapi.o -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-wsaapi.Tpo -c -o wsrmdemo_udp-wsaapi.o `test -f '../../plugin/wsaapi.c' || echo '$(srcdir)/'`../../plugin/wsaapi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-wsaapi.Tpo $(DEPDIR)/wsrmdemo_udp-wsaapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsaapi.c' object='wsrmdemo_udp-wsaapi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-wsaapi.o `test -f '../../plugin/wsaapi.c' || echo '$(srcdir)/'`../../plugin/wsaapi.c wsrmdemo_udp-wsaapi.obj: ../../plugin/wsaapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-wsaapi.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-wsaapi.Tpo -c -o wsrmdemo_udp-wsaapi.obj `if test -f '../../plugin/wsaapi.c'; then $(CYGPATH_W) '../../plugin/wsaapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsaapi.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-wsaapi.Tpo $(DEPDIR)/wsrmdemo_udp-wsaapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsaapi.c' object='wsrmdemo_udp-wsaapi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-wsaapi.obj `if test -f '../../plugin/wsaapi.c'; then $(CYGPATH_W) '../../plugin/wsaapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsaapi.c'; fi` wsrmdemo_udp-wsrmapi.o: ../../plugin/wsrmapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-wsrmapi.o -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-wsrmapi.Tpo -c -o wsrmdemo_udp-wsrmapi.o `test -f '../../plugin/wsrmapi.c' || echo '$(srcdir)/'`../../plugin/wsrmapi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-wsrmapi.Tpo $(DEPDIR)/wsrmdemo_udp-wsrmapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsrmapi.c' object='wsrmdemo_udp-wsrmapi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-wsrmapi.o `test -f '../../plugin/wsrmapi.c' || echo '$(srcdir)/'`../../plugin/wsrmapi.c wsrmdemo_udp-wsrmapi.obj: ../../plugin/wsrmapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-wsrmapi.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-wsrmapi.Tpo -c -o wsrmdemo_udp-wsrmapi.obj `if test -f '../../plugin/wsrmapi.c'; then $(CYGPATH_W) '../../plugin/wsrmapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsrmapi.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-wsrmapi.Tpo $(DEPDIR)/wsrmdemo_udp-wsrmapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/wsrmapi.c' object='wsrmdemo_udp-wsrmapi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-wsrmapi.obj `if test -f '../../plugin/wsrmapi.c'; then $(CYGPATH_W) '../../plugin/wsrmapi.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/wsrmapi.c'; fi` wsrmdemo_udp-threads.o: ../../plugin/threads.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-threads.o -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-threads.Tpo -c -o wsrmdemo_udp-threads.o `test -f '../../plugin/threads.c' || echo '$(srcdir)/'`../../plugin/threads.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-threads.Tpo $(DEPDIR)/wsrmdemo_udp-threads.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/threads.c' object='wsrmdemo_udp-threads.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-threads.o `test -f '../../plugin/threads.c' || echo '$(srcdir)/'`../../plugin/threads.c wsrmdemo_udp-threads.obj: ../../plugin/threads.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-threads.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-threads.Tpo -c -o wsrmdemo_udp-threads.obj `if test -f '../../plugin/threads.c'; then $(CYGPATH_W) '../../plugin/threads.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/threads.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-threads.Tpo $(DEPDIR)/wsrmdemo_udp-threads.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/threads.c' object='wsrmdemo_udp-threads.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-threads.obj `if test -f '../../plugin/threads.c'; then $(CYGPATH_W) '../../plugin/threads.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/threads.c'; fi` wsrmdemo_udp-duration.o: ../../custom/duration.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-duration.o -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-duration.Tpo -c -o wsrmdemo_udp-duration.o `test -f '../../custom/duration.c' || echo '$(srcdir)/'`../../custom/duration.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-duration.Tpo $(DEPDIR)/wsrmdemo_udp-duration.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../custom/duration.c' object='wsrmdemo_udp-duration.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-duration.o `test -f '../../custom/duration.c' || echo '$(srcdir)/'`../../custom/duration.c wsrmdemo_udp-duration.obj: ../../custom/duration.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -MT wsrmdemo_udp-duration.obj -MD -MP -MF $(DEPDIR)/wsrmdemo_udp-duration.Tpo -c -o wsrmdemo_udp-duration.obj `if test -f '../../custom/duration.c'; then $(CYGPATH_W) '../../custom/duration.c'; else $(CYGPATH_W) '$(srcdir)/../../custom/duration.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsrmdemo_udp-duration.Tpo $(DEPDIR)/wsrmdemo_udp-duration.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../custom/duration.c' object='wsrmdemo_udp-duration.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(wsrmdemo_udp_CFLAGS) $(CFLAGS) -c -o wsrmdemo_udp-duration.obj `if test -f '../../custom/duration.c'; then $(CYGPATH_W) '../../custom/duration.c'; else $(CYGPATH_W) '$(srcdir)/../../custom/duration.c'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/wsrmdemo-duration.Po -rm -f ./$(DEPDIR)/wsrmdemo-soapC.Po -rm -f ./$(DEPDIR)/wsrmdemo-soapClient.Po -rm -f ./$(DEPDIR)/wsrmdemo-soapServer.Po -rm -f ./$(DEPDIR)/wsrmdemo-threads.Po -rm -f ./$(DEPDIR)/wsrmdemo-wsaapi.Po -rm -f ./$(DEPDIR)/wsrmdemo-wsrmapi.Po -rm -f ./$(DEPDIR)/wsrmdemo-wsrmdemo.Po -rm -f ./$(DEPDIR)/wsrmdemo_ssl-duration.Po -rm -f ./$(DEPDIR)/wsrmdemo_ssl-soapC.Po -rm -f ./$(DEPDIR)/wsrmdemo_ssl-soapClient.Po -rm -f ./$(DEPDIR)/wsrmdemo_ssl-soapServer.Po -rm -f ./$(DEPDIR)/wsrmdemo_ssl-threads.Po -rm -f ./$(DEPDIR)/wsrmdemo_ssl-wsaapi.Po -rm -f ./$(DEPDIR)/wsrmdemo_ssl-wsrmapi.Po -rm -f ./$(DEPDIR)/wsrmdemo_ssl-wsrmdemo.Po -rm -f ./$(DEPDIR)/wsrmdemo_udp-duration.Po -rm -f ./$(DEPDIR)/wsrmdemo_udp-soapC.Po -rm -f ./$(DEPDIR)/wsrmdemo_udp-soapClient.Po -rm -f ./$(DEPDIR)/wsrmdemo_udp-soapServer.Po -rm -f ./$(DEPDIR)/wsrmdemo_udp-threads.Po -rm -f ./$(DEPDIR)/wsrmdemo_udp-wsaapi.Po -rm -f ./$(DEPDIR)/wsrmdemo_udp-wsrmapi.Po -rm -f ./$(DEPDIR)/wsrmdemo_udp-wsrmdemo.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/wsrmdemo-duration.Po -rm -f ./$(DEPDIR)/wsrmdemo-soapC.Po -rm -f ./$(DEPDIR)/wsrmdemo-soapClient.Po -rm -f ./$(DEPDIR)/wsrmdemo-soapServer.Po -rm -f ./$(DEPDIR)/wsrmdemo-threads.Po -rm -f ./$(DEPDIR)/wsrmdemo-wsaapi.Po -rm -f ./$(DEPDIR)/wsrmdemo-wsrmapi.Po -rm -f ./$(DEPDIR)/wsrmdemo-wsrmdemo.Po -rm -f ./$(DEPDIR)/wsrmdemo_ssl-duration.Po -rm -f ./$(DEPDIR)/wsrmdemo_ssl-soapC.Po -rm -f ./$(DEPDIR)/wsrmdemo_ssl-soapClient.Po -rm -f ./$(DEPDIR)/wsrmdemo_ssl-soapServer.Po -rm -f ./$(DEPDIR)/wsrmdemo_ssl-threads.Po -rm -f ./$(DEPDIR)/wsrmdemo_ssl-wsaapi.Po -rm -f ./$(DEPDIR)/wsrmdemo_ssl-wsrmapi.Po -rm -f ./$(DEPDIR)/wsrmdemo_ssl-wsrmdemo.Po -rm -f ./$(DEPDIR)/wsrmdemo_udp-duration.Po -rm -f ./$(DEPDIR)/wsrmdemo_udp-soapC.Po -rm -f ./$(DEPDIR)/wsrmdemo_udp-soapClient.Po -rm -f ./$(DEPDIR)/wsrmdemo_udp-soapServer.Po -rm -f ./$(DEPDIR)/wsrmdemo_udp-threads.Po -rm -f ./$(DEPDIR)/wsrmdemo_udp-wsaapi.Po -rm -f ./$(DEPDIR)/wsrmdemo_udp-wsrmapi.Po -rm -f ./$(DEPDIR)/wsrmdemo_udp-wsrmdemo.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/wsrm/server.pem0000644000175000017500000000724213525245163020055 0ustar ellertellert-----BEGIN ENCRYPTED PRIVATE KEY----- MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIQcdZuFt0YzgCAggA MBQGCCqGSIb3DQMHBAig/PutfpxHfwSCAoCSsevV3jWwaMLqzkz4FtHPPKI9Guiz y3HjO4uHUnTZNyHA87ukCBYcn06fj4lLsdzShC4PKq1us9WlPgp7iXjS3HxvSNkV JaKfZ1W0LtNnY5BJvp+rFgmrO0/FWwVBuCg4yQCO0PtREif5Sf47qMn/uQI+G9K9 nZcav3w+nI6p9pwUcyFEpKFMLixCFNBHnQCO0SA7PsSHcHe8vntvMXGYnnEjjSq7 pjD2eIV0A5lDYn/u0HQasY0FvLqbDWblZtcI2DAAbwzq0YPK3kPYEKUe/9r3JT5o kRsVak7ZOao1Xfd4c57QrRk4zNuPLDmQJFi3FhtScMGB2de5QIKnzvAyjU2TMhKK xezFZ173p6wNO7+xTmurZ5wfgZQ9EbbaGzdFMhH+IZA0NEVogZn40fjoWKR0Xhwc FfQUuCraq9O7V6xmR19vJNzGGD5WljzTaHPdqlJiBof9L32IfJnEMelr4wf/kZFq VMYieFjB8GZslZEKJC3Y3r+4KOZwdPz3fPCTyYcYt13TFRc+ffE632GHZr4LRrJD +Gy8QHxkA1veyeh+2U52lJylzK2JKQ2nqcIk0d5AIizAf4e6Ow2NXmUgUpirJgUH hfI4Ejed8zgoqk5T2k1jj8zY7I7lpHo4V5Fi5lwc3ubzKZi6lD/Rdqcz3uZUN8gQ 8ZQe4XHtImsS9QkgdAeVgzLW5rKrx5UKYI2z7538YAanSJGX0N2c6Fsd0rx4sFkx HqVgwy0JEZT2ajwdkVOXIEnVZ7/immdAyddeYnxnHl6GnKP6i7vN8/9jCu/VSSzt HECoqQ7eu0j+PsAN0N0JVbTJMEgWwkKc7RG+4M4MNIbTbLJn16KEfCxD -----END ENCRYPTED PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIID4TCCA0qgAwIBAgIBITANBgkqhkiG9w0BAQUFADCBjTELMAkGA1UEBhMCVVMx CzAJBgNVBAgTAkZMMRQwEgYDVQQHEwtUYWxsYWhhc3NlZTEWMBQGA1UEChMNR2Vu aXZpYSwgSW5jLjELMAkGA1UECxMCSVQxEjAQBgNVBAMTCWxvY2FsaG9zdDEiMCAG CSqGSIb3DQEJARYTY29udGFjdEBnZW5pdmlhLmNvbTAeFw0xODA4MjUxNzU4Mzda Fw0yMTA4MjQxNzU4MzdaMIGNMQswCQYDVQQGEwJVUzELMAkGA1UECBMCRkwxFDAS BgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJbmMuMQswCQYD VQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcNAQkBFhNjb250 YWN0QGdlbml2aWEuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDsMNey f1zqU26XTAYsjsHVfSzuQcHX7H6rVDej4i+syy7JF198AlZXKNyx+lDbDzTWmEJM wJtelxoVmnnIJPYTxWlWYCXc+9QwopQ4Jm0rANdfTujDDHug2uMxfTiJNJGq4eOm VrghruL6l96H5aHveauzUh7XiEbcFSL9+1h8twIDAQABo4IBTTCCAUkwCQYDVR0T BAIwADALBgNVHQ8EBAMCBPAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd BgNVHQ4EFgQUl21S3PtNIU5VptaFc0rS21mVve4wgcIGA1UdIwSBujCBt4AUVixg D6n5N0NNc/tWvNSYuhDTKkmhgZOkgZAwgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb22CCQCG9y4FBiOi4zANBgkqhkiG9w0BAQUF AAOBgQBE4Swc3a+wyEXqXGB753H10PmpqpcmpUaLmTfBKvgl1WeLhAZqcpKiKWnH s2BNKE68Ndlopo4ttP3DIkf69vKrUrTANzui5pdShdEom6SJ1yjm/mTFSXNOxAs7 kkbwMTnYltSLvNLdBV22pVmHbRP0G6xwTi7Br5ZIGcQGEQDaDw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJAIb3LgUGI6LjMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE4MDgy NTE3NTczNloXDTIxMDgyNDE3NTczNlowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBAMXNOWKaNVtyWpWa/5/mNXZ7cgv+v5B1RL0OoOwvoQ5dHhc4KycDPAtiiV+I AoZy7bLbARWJboLPo3JnOf3Mc0aQjVFXz+X8eVhEseCIP4HAWSGa5ISDVDdxj4Nh RfwlVtrmLdL08HkTr+f3scHRvtvtmAtTFeT9FOCzttMpBRTXAgMBAAGjgfUwgfIw HQYDVR0OBBYEFFYsYA+p+TdDTXP7VrzUmLoQ0ypJMIHCBgNVHSMEgbowgbeAFFYs YA+p+TdDTXP7VrzUmLoQ0ypJoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkAhvcuBQYjouMwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQA1xebtW3G5e9Xfz2zys4d+628r2qy4ov0ggGS5 WmrBhyIFCE+xW1bj5waLMOt0e4+yfODMTcVKArrrthJdHm5YFILT9ZU2hOEOZw5P Dizc3Q34yzQxXrpsaHri5OfM0wgiIJOynz/YbX2f46YpqhMT7VvNoI8sR+OIydcY mi3qVQ== -----END CERTIFICATE----- gsoap-2.8.91/gsoap/samples/wsrm/wsrmdemo.c0000644000175000017500000007232113525245163020045 0ustar ellertellert/* wsrmdemo.c WS-ReliableMessaging 1.1 and WS-Addressing demo service and client. See the wsrmdemo.h header file for build and usage details. See gsoap/doc/wsrm for the WS-RM plugin user guide. gSOAP XML Web services tools Copyright (C) 2000-2012, 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-2010, 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 -------------------------------------------------------------------------------- */ /* This code auto-configures depending on the folling flags: -D WITH_UDP: enables UDP, disables multithreaded servicing -D WITH_OPENSSL: enables SSL transfers (transfer security) To use WS-ReliableMessaging 1.0, change wsrmdemo.h to import the 2005 protocol, then rerun soapcpp2 and compile: #import "wsrm5.h" */ #include "soapH.h" #include "wsrmdemo.nsmap" #include /* defines _POSIX_THREADS if pthreads are available */ #if defined(_POSIX_THREADS) || defined(_SC_THREADS) #include /* from plugin/threads.h */ #endif #include "wsaapi.h" /* from plugin/wsaapi.h */ #include "wsrmapi.h" /* from plugin/wsrmapi.h */ /* HTTP Basic Authentication is used by default, which is only secure over HTTPS. Use the HTTP Digest Authentication plugin for secure auth over HTTP by enabling this line: #include "httpda.h" Then compile and link with plugin/httpda.c and plugin/md5evp.c, Compile with -DWITH_OPENSSL to use SSL. */ /******************************************************************************\ * * Common Constants * \******************************************************************************/ #if defined(WITH_UDP) # define HTTP_TARGET "soap.udp:" /* Test WS-ReliableMessaging with SOAP-over-UDP */ #elif defined(WITH_OPENSSL) # define HTTP_TARGET "https:" /* Test HTTPS */ #else # define HTTP_TARGET "http:" #endif #if defined(WITH_OPENSSL) || defined(HTTPDA_H) # define HTTP_USERID "foo" # define HTTP_PASSWD "bar" # define HTTP_REALM "svc" #endif #if defined(HTTP_USERID) && defined(HTTP_PASSWD) const char *userid = HTTP_USERID; const char *passwd = HTTP_PASSWD; #else const char *userid = NULL; const char *passwd = NULL; #endif /* the matching SOAP/WSA actions, defined in wsdldemo.h service definitions */ const char *RequestAction = "urn:wsrmdemo/wsrmdemoPort/wsrmdemo"; const char *ResponseAction = "urn:wsrmdemo/wsrmdemoPort/wsrmdemoResponse"; const char *serverURI = HTTP_TARGET"//localhost:8000"; const char *clientURI = HTTP_TARGET"//localhost:8001"; int serverPort = 8000; int clientPort = 8001; /******************************************************************************\ * * Main Implements a Server and Client * \******************************************************************************/ int callback_poll(struct soap *soap, int timeout); void *callback_server(void *soap); void *process_request(void *soap); int CRYPTO_thread_setup(); void CRYPTO_thread_cleanup(); int main(int argc, char **argv) { struct soap *soap = soap_new1(SOAP_XML_INDENT | SOAP_XML_STRICT); #ifdef HTTPDA_H /* Use HTTP Digest Authentication, see gsoap/doc/httpda/html/index.html */ struct http_da_info info; soap_register_plugin(soap, http_da); http_da_save(soap, &info, HTTP_REALM, HTTP_USERID, HTTP_PASSWD); #endif soap_register_plugin(soap, soap_wsa); soap_register_plugin(soap, soap_wsrm); if (argc < 2) /* no args: server */ { soap_set_mode(soap, SOAP_IO_KEEPALIVE); #if !defined(WITH_UDP) && defined(THREADS_H) THREAD_TYPE tid; #endif /* TCP/IP and UDP timeouts + = seconds, - = microsecond*/ soap->send_timeout = soap->recv_timeout = 5; #if defined(WITH_UDP) /* UDP recv timeout is short to limit blocking time */ soap->recv_timeout = -200000; /* set UDP server, pure XML w/o HTTP headers */ soap_set_mode(soap, SOAP_IO_UDP); #elif defined(WITH_OPENSSL) if (CRYPTO_thread_setup()) { fprintf(stderr, "Cannot setup thread mutex for OpenSSL\n"); exit(1); } /* WS-Addressing server uses client-side sends, so init SSL for client+server: */ if (soap_ssl_server_context(soap, SOAP_SSL_DEFAULT, "server.pem", /* keyfile (server) */ "password", /* password to read the key file (server) */ "cacert.pem", /* cacert file to store trusted certificates (client) */ NULL, /* optional capath */ NULL, /* DH file name or DH param key len bits, NULL: RSA */ NULL, /* file with random data to seed randomness */ NULL /* unique server identification for SSL session cache */ )) { soap_print_fault(soap, stderr); exit(1); } #endif soap->bind_flags = SO_REUSEADDR; /* allow immediate port rebinding */ if (!soap_valid_socket(soap_bind(soap, NULL, serverPort, 100))) { soap_print_fault(soap, stderr); exit(1); } printf("**** Server Running\n"); soap->accept_timeout = -100000; /* 100ms timeout: do not block on accept */ for (;;) { /* TCP accept (for UDP simply returns current socket) */ #if !defined(WITH_UDP) && defined(THREADS_H) struct soap *tsoap; #endif if (!soap_valid_socket(soap_accept(soap))) { if (soap->errnum) soap_print_fault(soap, stderr); else /* timeout, send acknowledgements to all peers */ { soap_wsrm_pulse(soap, -10000); /* 10 ms */ #ifdef WITH_UDP sleep(1); /* optional, needed for UDP: accept() ruturns immediately */ #endif } continue; } /* do not spawn threads for UDP, since accept() is a no-op for UDP */ #if !defined(WITH_UDP) && defined(THREADS_H) tsoap = soap_copy(soap); while (THREAD_CREATE(&tid, (void*(*)(void*))process_request, (void*)tsoap)) sleep(1); #else #if !defined(WITH_UDP) && defined(WITH_OPENSSL) /* SSL accept */ if (soap_ssl_accept(soap)) { soap_print_fault(soap, stderr); fprintf(stderr, "SSL request failed, continue with next call...\n"); soap_destroy(soap); soap_end(soap); continue; } #endif if (soap_serve(soap) && soap->error != SOAP_STOP && soap->error != SOAP_EOF) soap_print_fault(soap, stderr); else if (soap->error != SOAP_EOF || soap->errnum) printf("\n**** Request served\n"); soap_wsrm_dump(soap, stdout); soap_destroy(soap); soap_end(soap); #endif } soap_destroy(soap); soap_end(soap); soap_done(soap); /* MUST call before CRYPTO_thread_cleanup */ CRYPTO_thread_cleanup(); } else /* client */ { xsd__duration expires = 30000; /* 30000 ms to expire */ soap_wsrm_sequence_handle seq; struct ns__wsrmdemoResponse res; int retry; const char *replyto = NULL; struct soap *callback = NULL; int duplex = 0; /* duplex mode */ int server = 0; /* use callback server with duplex mode */ int alive = 0; /* keep-alive callback port */ const char *to = NULL; /* service endpoint */ #ifdef THREADS_H THREAD_TYPE tid; #endif /* TCP/IP and UDP timeouts + = seconds, - = microsecond*/ soap->send_timeout = soap->recv_timeout = 5; #if defined(WITH_UDP) /* UDP recv timeout is short to limit blocking time */ soap->recv_timeout = -200000; /* "soap.udp:" endpoint specifies SOAP-over-UDP and should always be used for ReplyTo and FaultTo if these use UDP */ /* When the endpoint is an IP with a UDP destination, it is important to set UDP: */ soap_set_mode(soap, SOAP_IO_UDP); #elif defined(WITH_OPENSSL) CRYPTO_thread_setup(); if (soap_ssl_client_context(soap, SOAP_SSL_DEFAULT | SOAP_SSL_SKIP_HOST_CHECK, NULL, /* optional keyfile to authenticate to server */ NULL, /* password to read the keyfile */ "cacert.pem", /* cacert file to store trusted certificates */ NULL, /* capath to directory with trusted certificates */ NULL /* optional file with random data to seed randomness */ )) { soap_print_fault(soap, stderr); exit(1); } #endif /* Command-line options: d duplex mode with dual channels s callback server for duplex mode (default is callback polling) */ if (argc >= 3) { if (strchr(argv[2], 's')) { duplex = 1; server = 1; } else if (strchr(argv[2], 'd')) { duplex = 1; #ifdef WITH_OPENSSL fprintf(stderr, "Warning: SSL requires a callback server for duplex mode, because the client waits for the HTTP Accepted response while server is sending a message to the callback: deadlock will occur\n"); #endif } if (strchr(argv[2], 'a')) alive = 1; } if (alive) soap_set_mode(soap, SOAP_IO_KEEPALIVE); if (duplex) { /* set up the callback for duplex communication */ replyto = clientURI; callback = soap_new1(SOAP_XML_INDENT | SOAP_XML_STRICT); if (alive) soap_set_mode(callback, SOAP_IO_KEEPALIVE); soap_register_plugin(callback, soap_wsa); soap_register_plugin(callback, soap_wsrm); #if defined(WITH_UDP) /* "soap.udp:" endpoint specifies SOAP-over-UDP and should always be used for ReplyTo and FaultTo if these use UDP */ /* When the endpoint is an IP with a UDP destination, it is important to set UDP: */ soap_set_mode(callback, SOAP_IO_UDP); #elif defined(WITH_OPENSSL) if (soap_ssl_server_context(callback, SOAP_SSL_DEFAULT, "client.pem", /* keyfile (client) */ "password", /* password to read the key file (server) */ "cacert.pem", /* cacert file to store trusted certificates (client) */ NULL, /* optional capath */ NULL, /* DH file name or DH param key len bits, NULL: RSA */ NULL, /* file with random data to seed randomness */ NULL /* unique server identification for SSL session cache */ )) { soap_print_fault(soap, stderr); exit(1); } #endif callback->bind_flags = SO_REUSEADDR; /* allow immediate port rebinding */ if (!soap_valid_socket(soap_bind(callback, NULL, clientPort, 100))) { soap_print_fault(soap, stderr); exit(1); } } #ifdef THREADS_H if (server) THREAD_CREATE(&tid, (void*(*)(void*))callback_server, (void*)callback); #endif printf("\n**** Creating a Sequence\n"); #ifdef HTTPDA_H /* Digest Auth */ http_da_restore(soap, &info); #else /* Basic Auth */ soap->userid = userid; soap->passwd = passwd; #endif if (soap_wsrm_create_offer(soap, serverURI, replyto, NULL, expires, DiscardEntireSequence, NULL, &seq)) { if (soap->error == 202) printf("\n**** Create request was accepted\n"); else if (!duplex) /* if not duplex, error is fatal */ { soap_print_fault(soap, stderr); soap_wsrm_seq_free(soap, seq); return soap->error; } } if (duplex) { for (retry = 10; retry && !soap_wsrm_seq_created(soap, seq); retry--) { if (server) sleep(1); /* wait for callback server to receive response */ else if (callback_poll(callback, 1)) /* poll for 1 sec */ return callback->error; } if (!retry) { fprintf(stderr, "CANNOT CREATE SEQUENCE - SERVER NOT RESPONDING\n"); exit(1); } } soap_wsrm_dump(soap, stdout); printf("\n**** Sending first message\n"); #ifdef HTTPDA_H /* Digest Auth */ http_da_restore(soap, &info); #else /* Basic Auth */ soap->userid = userid; soap->passwd = passwd; #endif /* this shows how to use a retry loop to improve message delivery */ /* UDP may timeout when no UDP response message is sent by the server */ if (soap_wsrm_request(soap, seq, soap_wsa_rand_uuid(soap), RequestAction)) { soap_print_fault(soap, stderr); return soap->error; } while ((to = soap_wsrm_to(seq)) != NULL && soap_call_ns__wsrmdemo(soap, to, RequestAction, "First Message", &res)) { if (soap->error == 202) { printf("\n**** Request was accepted\n"); break; } else if (soap->error == SOAP_NO_TAG) /* empty */ { printf("\n**** Request was accepted, acks received\n"); break; } else if (duplex) /* duplex: we opt not to retry (could poll first) */ break; soap_print_fault(soap, stderr); /* only continue if retry is recommended */ if (soap_wsrm_check_retry(soap, seq)) break; /* wait a second to give network a chance to recover */ printf("\n**** Transmission failed: retrying after 1 second...\n"); sleep(1); } if (soap->error == SOAP_OK || soap->error == 202) printf("\n**** Response OK\n"); soap_wsrm_dump(soap, stdout); if (duplex) { if (server) sleep(1); else if (callback_poll(callback, -200000)) /* poll for 200 ms */ return callback->error; } printf("\n**** Sending second message, requesting acks\n"); #ifdef HTTPDA_H /* Digest Auth */ http_da_restore(soap, &info); #else /* Basic Auth */ soap->userid = userid; soap->passwd = passwd; #endif /* here we just send the message without retry loop */ /* UDP may timeout when no UDP response message is sent by the server */ to = soap_wsrm_to(seq); if (to) { if (soap_wsrm_request_acks(soap, seq, soap_wsa_rand_uuid(soap), RequestAction)) { soap_print_fault(soap, stderr); return soap->error; } if (soap_call_ns__wsrmdemo(soap, to, RequestAction, (char*)"Second Message", &res)) { if (soap->error == 202) printf("\n**** Request was accepted\n"); else if (soap->error == SOAP_NO_TAG) /* empty */ printf("\n**** Request was accepted, acks received\n"); else if (!duplex) soap_print_fault(soap, stderr); } else printf("\n**** Response OK\n"); if (duplex) { if (server) sleep(1); else if (callback_poll(callback, -200000)) /* poll for 200 ms */ return callback->error; } } /* check for any non-acked messages, and resend these */ if (soap_wsrm_nack(seq)) { printf("\n**** Resending "SOAP_ULONG_FORMAT" Non-Acked Messages\n", soap_wsrm_nack(seq)); soap_wsrm_resend(soap, seq, 0, 0); /* 0 0 means full range of msg nums of non-acked message to resend */ if (duplex) { if (server) sleep(1); else if (callback_poll(callback, 1)) /* poll for 1 sec */ return callback->error; } } soap_wsrm_dump(soap, stdout); printf("\n**** Sending third message\n"); #ifdef HTTPDA_H /* Digest Auth */ http_da_restore(soap, &info); #else /* Basic Auth */ soap->userid = userid; soap->passwd = passwd; #endif /* here we show how to just send the message without retry loop */ /* UDP may timeout when no UDP response message is sent by the server */ to = soap_wsrm_to(seq); if (to) { if (soap_wsrm_request(soap, seq, soap_wsa_rand_uuid(soap), RequestAction)) { soap_print_fault(soap, stderr); return soap->error; } if (soap_call_ns__wsrmdemo(soap, to, RequestAction, argv[1], &res)) { if (soap->error == 202) printf("\n**** Request was accepted\n"); else if (soap->error == SOAP_NO_TAG) /* empty */ printf("\n**** Request was accepted, acks received\n"); else if (!duplex) soap_print_fault(soap, stderr); } else printf("\n**** Response OK\n"); if (duplex) { if (server) sleep(1); /* allows to get messages before closing */ else if (callback_poll(callback, -200000)) /* poll for 200 ms */ return callback->error; } soap_wsrm_dump(soap, stdout); } printf("\n**** Closing the Sequence\n"); #ifdef HTTPDA_H /* Digest Auth */ http_da_restore(soap, &info); #else /* Basic Auth */ soap->userid = userid; soap->passwd = passwd; #endif /* close the sequence */ if (soap_wsrm_close(soap, seq, soap_wsa_rand_uuid(soap))) { if (soap->error == 202) printf("\n**** Close request was accepted\n"); else if (!duplex) { soap_print_fault(soap, stderr); soap_wsrm_seq_free(soap, seq); return soap->error; } } if (duplex) { if (server) sleep(1); /* still accept messages after close */ else if (callback_poll(callback, 1)) /* poll for 1 sec */ return callback->error; } soap_wsrm_dump(soap, stdout); /* Resend messages marked as non-acked (as an option) */ for (retry = 2; retry && soap_wsrm_nack(seq); retry--) { printf("\n**** Resending "SOAP_ULONG_FORMAT" Non-Acked Messages\n", soap_wsrm_nack(seq)); soap_wsrm_resend(soap, seq, 0, 0); /* 0 0 means full range of msg nums */ if (duplex) { if (server) sleep(1); else if (callback_poll(callback, 1)) /* poll for 1 sec */ return callback->error; } } printf("\n**** Terminating the Sequence\n"); #ifdef HTTPDA_H /* Digest Auth */ http_da_restore(soap, &info); #else /* Basic Auth */ soap->userid = userid; soap->passwd = passwd; #endif /* termination fails if the server did not get all messages */ if (soap_wsrm_terminate(soap, seq, soap_wsa_rand_uuid(soap))) { if (soap->error == 202) printf("\n**** Terminate request was accepted\n"); else if (!duplex || soap->error != SOAP_EOF) soap_print_fault(soap, stderr); } if (duplex) { if (server) sleep(1); else if (callback_poll(callback, 1)) /* poll for 1 sec */ return callback->error; } soap_wsrm_dump(soap, stdout); #ifdef THREADS_H if (server) THREAD_JOIN(tid); #endif /* delete the sequence */ soap_wsrm_seq_free(soap, seq); /* delete the callback */ if (callback) { soap_destroy(callback); soap_end(callback); soap_free(callback); } /* cleanup deserialized data, allowed at any time in/after sequence */ soap_destroy(soap); soap_end(soap); soap_free(soap); /* MUST call before CRYPTO_thread_cleanup */ CRYPTO_thread_cleanup(); } return 0; } /******************************************************************************\ * * Threaded Server * \******************************************************************************/ #ifdef THREADS_H void *process_request(void *ctx) { struct soap *soap = (struct soap*)ctx; pthread_detach(pthread_self()); #if !defined(WITH_UDP) && defined(WITH_OPENSSL) /* SSL accept */ if (soap_ssl_accept(soap)) { soap_print_fault(soap, stderr); fprintf(stderr, "SSL request failed\n"); soap_destroy(soap); soap_end(soap); soap_free(soap); return NULL; } #endif if (soap_serve(soap) && soap->error != SOAP_STOP && soap->error != SOAP_EOF) soap_print_fault(soap, stderr); else if (soap->error == SOAP_EOF && soap->errnum == 0) printf("\n**** Thread timed out\n"); else { printf("\n**** Request served by thread\n"); soap_wsrm_dump(soap, stdout); } soap_destroy(soap); soap_end(soap); soap_free(soap); return NULL; } #endif /******************************************************************************\ * * Optional Client-Side Threaded Callback Server * \******************************************************************************/ #ifdef THREADS_H void *callback_server(void *ctx) { struct soap *soap = (struct soap*)ctx; soap->accept_timeout = 10; /* server quits after 10 seconds of inactivity */ soap->recv_timeout = 10; soap->send_timeout = 1; /* 1 sec I/O timeout */ printf("\n**** Callback Server Running\n"); while (soap_valid_socket(soap_accept(soap))) { #if !defined(WITH_UDP) && defined(WITH_OPENSSL) if (soap_ssl_accept(soap)) { soap_print_fault(soap, stderr); fprintf(stderr, "SSL request failed, continue with next call...\n"); continue; } #endif if (soap_serve(soap) && soap->error != SOAP_STOP && soap->error != SOAP_EOF) soap_print_fault(soap, stderr); else if (soap->error == SOAP_EOF && !soap->errnum) continue; /* messaging IO timed out */ else soap_wsrm_dump(soap, stdout); } printf("\n**** Callback Server Terminated\n"); return NULL; } #endif /******************************************************************************\ * * Client-Side Callback Polling * \******************************************************************************/ int callback_poll(struct soap *soap, int timeout) { int poll = 5; /* 5 poll cycles max, ensures we make progress */ soap->accept_timeout = timeout; soap->recv_timeout = timeout; soap->send_timeout = 1; /* 1 sec I/O timeout */ printf("\n**** Callback Polling\n"); while (poll-- && soap_valid_socket(soap_accept(soap))) { #if !defined(WITH_UDP) && defined(WITH_OPENSSL) if (soap_ssl_accept(soap)) { soap_print_fault(soap, stderr); fprintf(stderr, "SSL request failed, continue with next call...\n"); continue; } #endif if (soap_serve(soap) && soap->error != SOAP_STOP) { if (soap->error == SOAP_EOF) /* timed out */ return SOAP_OK; soap_print_fault(soap, stderr); return soap->error; } soap_wsrm_dump(soap, stdout); } return SOAP_OK; } /******************************************************************************\ * * Service Operations * \******************************************************************************/ int ns__wsrmdemo(struct soap *soap, char *in, struct ns__wsrmdemoResponse *result) { /* check Basic/Digest Auth, when enabled */ if (userid && passwd) { if (!soap->userid || !soap->passwd || strcmp(userid, soap->userid) || strcmp(passwd, soap->passwd)) { #ifdef HTTPDA_H soap->authrealm = HTTP_REALM; #endif return 401; /* HTTP Unauthorized */ } } /* check for WS-RM/WSA and set WS-RM/WSA return headers */ if (soap_wsrm_check(soap)) return soap->error; printf("\n**** Received Request \"%s\"\n", in?in:"(null)"); /* simulate a fatal server error, which is possibly relayed */ /* for fatal errors that terminate the sequence, we must call soap_wsrm_sender_fault() before soap_wsrm_check() */ if (in && !strcmp(in, "error")) { /* this is fatal, we terminate the sequence */ int err; soap_wsrm_sequence_handle seq = soap_wsrm_seq(soap); err = soap_wsrm_error(soap, seq, wsrm__SequenceTerminated); soap_wsrm_seq_release(soap, seq); printf("\n**** Simulating Server Operation Fatal Error\n"); return err; } /* simulate a non-fatal user-defined error, which is can be relayed */ if (in && !strcmp(in, "fault")) { printf("\n**** Simulating Server Operation Fault\n"); return soap_wsrm_sender_fault(soap, "The demo service wsrmdemo() operation returned a fault", NULL); } result->out = in; #if 0 /* to just respond without requesting acks for response messages: */ return soap_wsrm_reply(soap, soap_wsa_rand_uuid(soap), ResponseAction); #else /* to request acks for response messages (only when WS-RM "create offer" was made): */ return soap_wsrm_reply_request_acks(soap, soap_wsa_rand_uuid(soap), ResponseAction); #endif } /******************************************************************************\ * * Client-Side Callback Operation to Receive Service Responses * \******************************************************************************/ int ns__wsrmdemoResponse(struct soap *soap, char *out) { /* check Basic Auth, when enabled */ if (userid && passwd) { if (!soap->userid || !soap->passwd || strcmp(userid, soap->userid) || strcmp(passwd, soap->passwd)) return soap_send_empty_response(soap, 401); /* HTTP Unauthorized */ } /* check for WS-RM/WSA and set WS-RM/WSA return headers */ if (soap_wsrm_check(soap)) return soap->error; printf("\n**** Received Response \"%s\"\n", out?out:"(null)"); return soap_send_empty_response(soap, 202); /* HTTP 202 Accepted */ } /******************************************************************************\ * * Relayed SOAP-ENV:Fault Handler for FaultTo Server * \******************************************************************************/ int SOAP_ENV__Fault(struct soap *soap, _QName faultcode, // SOAP 1.1 char *faultstring, // SOAP 1.1 char *faultactor, // SOAP 1.1 struct SOAP_ENV__Detail *detail, // SOAP 1.1 struct SOAP_ENV__Code *Code, // SOAP 1.2 struct SOAP_ENV__Reason *Reason, // SOAP 1.2 char *Node, // SOAP 1.2 char *Role, // SOAP 1.2 struct SOAP_ENV__Detail *Detail // SOAP 1.2 ) { soap_send_empty_response(soap, 202); /* HTTP 202 Accepted */ /* populate the fault struct from the operation arguments to print it */ soap_fault(soap); /* SOAP 1.1 */ soap->fault->faultcode = faultcode; soap->fault->faultstring = faultstring; soap->fault->faultactor = faultactor; soap->fault->detail = detail; /* SOAP 1.2 */ soap->fault->SOAP_ENV__Code = Code; soap->fault->SOAP_ENV__Reason = Reason; soap->fault->SOAP_ENV__Node = Node; soap->fault->SOAP_ENV__Role = Role; soap->fault->SOAP_ENV__Detail = Detail; /* set error and display */ soap->error = SOAP_FAULT; printf("\n**** Received Fault:\n"); soap_print_fault(soap, stdout); if (!detail) detail = Detail; if (detail && detail->__type == SOAP_TYPE__wsrm__Identifier) { /* the sequence id is in the Fault Detail __type and fault members */ char *id = (char*)detail->fault; /* we opt to treat all faults fatal, so let's terminate the sequence */ soap_wsrm_sequence_handle seq = soap_wsrm_seq_lookup_id(soap, id); if (seq) { soap_wsrm_error(soap, seq, wsrm__SequenceTerminated); soap_wsrm_seq_release(soap, seq); return soap->error; } } return SOAP_OK; } /******************************************************************************\ * * OpenSSL * \******************************************************************************/ #ifdef WITH_OPENSSL struct CRYPTO_dynlock_value { MUTEX_TYPE mutex; }; static MUTEX_TYPE *mutex_buf; static struct CRYPTO_dynlock_value *dyn_create_function(const char *file, int line) { struct CRYPTO_dynlock_value *value; value = (struct CRYPTO_dynlock_value*)malloc(sizeof(struct CRYPTO_dynlock_value)); if (value) MUTEX_SETUP(value->mutex); return value; } static void dyn_lock_function(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line) { if (mode & CRYPTO_LOCK) MUTEX_LOCK(l->mutex); else MUTEX_UNLOCK(l->mutex); } static void dyn_destroy_function(struct CRYPTO_dynlock_value *l, const char *file, int line) { MUTEX_CLEANUP(l->mutex); free(l); } void locking_function(int mode, int n, const char *file, int line) { if (mode & CRYPTO_LOCK) MUTEX_LOCK(mutex_buf[n]); else MUTEX_UNLOCK(mutex_buf[n]); } unsigned long id_function() { return (unsigned long)THREAD_ID; } int CRYPTO_thread_setup() { int i; mutex_buf = (MUTEX_TYPE*)malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t)); if (!mutex_buf) return SOAP_EOM; for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_SETUP(mutex_buf[i]); CRYPTO_set_id_callback(id_function); CRYPTO_set_locking_callback(locking_function); CRYPTO_set_dynlock_create_callback(dyn_create_function); CRYPTO_set_dynlock_lock_callback(dyn_lock_function); CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function); return SOAP_OK; } void CRYPTO_thread_cleanup() { int i; if (!mutex_buf) return; CRYPTO_set_id_callback(NULL); CRYPTO_set_locking_callback(NULL); CRYPTO_set_dynlock_create_callback(NULL); CRYPTO_set_dynlock_lock_callback(NULL); CRYPTO_set_dynlock_destroy_callback(NULL); for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_CLEANUP(mutex_buf[i]); free(mutex_buf); mutex_buf = NULL; } #else /* OpenSSL not used */ int CRYPTO_thread_setup() { return SOAP_OK; } void CRYPTO_thread_cleanup() { } #endif gsoap-2.8.91/gsoap/samples/wsrm/README.txt0000644000175000017500000000033513525245163017536 0ustar ellertellert This application demonstrates server-side and client-side logic for services based on WS-ReliableMessaging (and WS-Addressing). For more details, please see wsrmdemo.h. Instructions about the demo are included therein. gsoap-2.8.91/gsoap/samples/wsrm/wsrmdemo.h0000644000175000017500000002434713525245163020057 0ustar ellertellert/* wsrmdemo.h WS-ReliableMessaging and WS-Addressing demo service and client. This file is to be passed to soapcpp2 only. See usage comments below. gSOAP XML Web services tools Copyright (C) 2000-2012 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-2012, 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- This example application demonstrates server-side and client-side logic for services based on WS-ReliableMessaging (which uses WS-Addressing). WS-ReliableMessaging provides a reliable message sequence mechanism. A message sequence is created by the WS-RM source (e.g. client), the messages follow with possible acknowledgements and resends of unacknowledged messages in between, then the sequence is closed and finally terminated. Sequences can expire, to allow local resources to be reclaimed. WS-ReliableMessaging may not be useful to improve the reliability of request-response message exchanges between two parties over HTTP, since receiving a response obviously indicates successful delivery of the request. WS-ReliableMessaging is useful to improve the reliability of one-way asynchronous messaging, for unreliable data gram messaging (SOAP-over-UDP), or when responses are relayed to other destinations, such as response messages that are relayed to destinations indicated by the WS-Addressing ReplyTo header. It is also useful when multiple sources are sending messages that arrive in different order or must be flagged as an incomplete message assemble when messages are missing as defined by the notion of a sequence of related messages. WS-ReliableMessaging ensures that all messages must have been received for the message sequence to terminate normally (indicated by the DiscardEntireSequence behavior). Messages in a sequence are enumerated and message acknowledgements are message ranges received. Acknowledgements are normally sent to the source to help identify which messages should be resend. Acknowledgements can also be send to a destination, the AcksTo destination server. This header file illustrates two gSOAP soapcpp2 tooling tricks to enable services to accept SOAP Fault messages (the SOAP_ENV__Fault message definition below) and to create a one-way service operation to handle WS-Addressing relayed responses (the ns__wsrmdemoResponse one-way message definition below) to accept a response as a service request. Compile with (note the use of soapcpp2 -a to handle http action header): soapcpp2 -a -c -Iimport wsrmdemo.h cc -Iplugin -o wsrmdemo wsrmdemo.c stdsoap2.c soapC.c soapClient.c soapServer.c plugin/wsaapi.c plugin/wsrmapi.c custom/duration.c Alternative compile step, to use SOAP-over-UDP testing (no HTTP!): cc -Iplugin -DWITH_UDP -o wsrmdemo_udp wsrmdemo.c stdsoap2.c soapC.c soapClient.c soapServer.c plugin/wsaapi.c plugin/wsrmapi.c custom/duration.c Alternative compile step, to use OpenSSL for HTTPS: cc -Iplugin -DWITH_OPENSSL -o wsrmdemo_ssl wsrmdemo.c stdsoap2.c soapC.c soapClient.c soapServer.c plugin/wsaapi.c plugin/wsrmapi.c custom/duration.c -lssl -l crypto With SSL enabled, please make sure that server.pem, cacert.pem, and client.pem are copied with your executable. Usage: After compilation, start the main server: > ./wsrmdemo In a new window, run the client: > ./wsrmdemo hello This example shows the main server returning "hello" to the client. WS-RM message acknowledgements are also returned to the client as piggy-backed headers, so the client keeps track of ack'ed messages that do not need to be resend. > ./wsrmdemo hello d This example shows the main server returning "hello" to the client in duplex mode. The client uses a callback polling service to accept response messages on a port. > ./wsrmdemo hello ds This example shows the main server returning "hello" to the client in duplex mode. The client uses a stand-alone (non-polling) callback server to accept response messages on a port. > ./wsrmdemo fault Simulates a fault generated by the server. The fault is non-fatal and processing resumes until the sequence is terminated. > ./wsrmdemo fault d Same, in duplex mode with callback polling. > ./wsrmdemo fault ds Same, in duplex mode with callback server. > ./wsrmdemo error Simulates an error generated by the server. The error is fatal and further processing is refused by the server. > ./wsrmdemo error d Same, in duplex mode with callback polling. > ./wsrmdemo error ds Same, in duplex mode with callback server. Note 1: when the ReplyTo service is down, the response cannot be relayed and the client (or the fault service when FaultTo is set) will be informed about the failure. Note 2: HTTP Basic authentication can be enabled by setting the following values in wsrmdemo.c: const char *userid = "..."; const char *passwd = "..."; The client operations set HTTP Basic Auth while server operation check it. The WS-RM CreateSequence, CloseSequence, and TerminateSequence do NOT check the credentials of the client (only the sequence messages). Of course, and incomplete sequence abnormally terminates when the behavior is set to DiscardEntireSequence. To upgrade to HTTP Digest authentication, register the HTTP digest authentication plugin at the client and server sides. Note 3: HTTP compression can be enabled by compiling the sources with -DWITH_ZLIB. Then use SOAP_ENC_ZLIB flag to send compressed messages. Note 4: HTTPS can be enabled by compiling with -DWITH_OPENSSL. Note 5: The client is set-up for two-way messaging, so UDP one-way messaging is not demonstrated. This also leads to timeouts at the client side when no response is received (and no acks or faults). To implement one-way messaging, please refer to the documentation. */ #import "soap12.h" #import "wsrm.h" #import "wsa5.h" //gsoap ns service name: wsrmdemo demonstrates WS-ReliableMessaging capabilities //gsoap ns service port: http://localhost:11001 //gsoap ns service type: wsrmdemoPort //gsoap ns service namespace: urn:wsrmdemo /* We need to generate a response struct for each operation to implement * one-way service response operations that can be relayed. Because the service * operation has a corresponding struct, we can use that struct as a response * parameter for the second two-way service operation. This step is required to * implement a wsa-capable server. Future changes to wsdl2h will make manual * addition of these one-way operations unnecessary and automated. */ //gsoap ns service method-header-part: wsrmdemoResponse wsa5__MessageID //gsoap ns service method-header-part: wsrmdemoResponse wsa5__RelatesTo //gsoap ns service method-header-part: wsrmdemoResponse wsa5__From //gsoap ns service method-header-part: wsrmdemoResponse wsa5__ReplyTo //gsoap ns service method-header-part: wsrmdemoResponse wsa5__FaultTo //gsoap ns service method-header-part: wsrmdemoResponse wsa5__To //gsoap ns service method-header-part: wsrmdemoResponse wsa5__Action //gsoap ns service method-header-part: wsrmdemoResponse wsrm__Sequence //gsoap ns service method-header-part: wsrmdemoResponse wsrm__AckRequested //gsoap ns service method-header-part: wsrmdemoResponse wsrm__SequenceAcknowledgement //gsoap ns service method-action: wsademoResponse urn:wsrmdemo/wsrmdemoPort/wsrmdemoResponse //gsoap ns service method-documentation: wsrmdemoResponse accepts a string value from a relayed response int ns__wsrmdemoResponse(char *out, void); //gsoap ns service method-header-part: wsrmdemo wsa5__MessageID //gsoap ns service method-header-part: wsrmdemo wsa5__RelatesTo //gsoap ns service method-header-part: wsrmdemo wsa5__From //gsoap ns service method-header-part: wsrmdemo wsa5__ReplyTo //gsoap ns service method-header-part: wsrmdemo wsa5__FaultTo //gsoap ns service method-header-part: wsrmdemo wsa5__To //gsoap ns service method-header-part: wsrmdemo wsa5__Action //gsoap ns service method-header-part: wsrmdemo wsrm__Sequence //gsoap ns service method-header-part: wsrmdemo wsrm__AckRequested //gsoap ns service method-header-part: wsrmdemo wsrm__SequenceAcknowledgement //gsoap ns service method-action: wsrmdemo urn:wsrmdemo/wsrmdemoPort/wsrmdemo //gsoap ns service method-output-action: wsrmdemo urn:wsrmdemo/wsrmdemoPort/wsrmdemoResponse //gsoap ns service method-documentation: wsrmdemo echos a string value and relays the response to the wsa replyTo address (if present) int ns__wsrmdemo(char *in, struct ns__wsrmdemoResponse *result); gsoap-2.8.91/gsoap/samples/wsrm/Makefile.am0000644000175000017500000000226013525245163020073 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = foreign 1.4 noinst_PROGRAMS = wsrmdemo wsrmdemo_udp wsrmdemo_ssl SOAPHEADER = wsrmdemo.h SOAP_FLAGS = -a include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = wsrmdemo.nsmap wsrmdemo.wsdl wsrmdemo_CFLAGS = wsrmdemo_SOURCES = wsrmdemo.c $(SOAPHEADER) $(SOAP_C_SRC) ../../plugin/wsaapi.c ../../plugin/wsrmapi.c ../../plugin/threads.c ../../custom/duration.c wsrmdemo_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread wsrmdemo_udp_CFLAGS = -DWITH_UDP wsrmdemo_udp_SOURCES = wsrmdemo.c $(SOAPHEADER) $(SOAP_C_SRC) ../../plugin/wsaapi.c ../../plugin/wsrmapi.c ../../plugin/threads.c ../../custom/duration.c wsrmdemo_udp_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread wsrmdemo_ssl_CFLAGS = -DWITH_OPENSSL wsrmdemo_ssl_SOURCES = wsrmdemo.c $(SOAPHEADER) $(SOAP_C_SRC) ../../plugin/wsaapi.c ../../plugin/wsrmapi.c ../../plugin/threads.c ../../custom/duration.c wsrmdemo_ssl_LDADD = $(SOAP_C_LIB_SSL) $(SAMPLE_SSL_LIBS) $(SAMPLE_EXTRA_LIBS) -lssl -lcrypto -lz -lpthread gsoap-2.8.91/gsoap/samples/wsrm/cacert.pem0000644000175000017500000000242213525245163020003 0ustar ellertellert-----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJAIb3LgUGI6LjMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE4MDgy NTE3NTczNloXDTIxMDgyNDE3NTczNlowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBAMXNOWKaNVtyWpWa/5/mNXZ7cgv+v5B1RL0OoOwvoQ5dHhc4KycDPAtiiV+I AoZy7bLbARWJboLPo3JnOf3Mc0aQjVFXz+X8eVhEseCIP4HAWSGa5ISDVDdxj4Nh RfwlVtrmLdL08HkTr+f3scHRvtvtmAtTFeT9FOCzttMpBRTXAgMBAAGjgfUwgfIw HQYDVR0OBBYEFFYsYA+p+TdDTXP7VrzUmLoQ0ypJMIHCBgNVHSMEgbowgbeAFFYs YA+p+TdDTXP7VrzUmLoQ0ypJoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkAhvcuBQYjouMwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQA1xebtW3G5e9Xfz2zys4d+628r2qy4ov0ggGS5 WmrBhyIFCE+xW1bj5waLMOt0e4+yfODMTcVKArrrthJdHm5YFILT9ZU2hOEOZw5P Dizc3Q34yzQxXrpsaHri5OfM0wgiIJOynz/YbX2f46YpqhMT7VvNoI8sR+OIydcY mi3qVQ== -----END CERTIFICATE----- gsoap-2.8.91/gsoap/samples/primes/0000755000175000017500000000000013525245200016336 5ustar ellertellertgsoap-2.8.91/gsoap/samples/primes/primes.cpp0000644000175000017500000000556613525245163020365 0ustar ellertellert/* primes.cpp Prime sieve example that demsontrates the use of a user-defined simple_vector container and auto-generated code to display the container contents in XML. Build: > soapcpp2 -CS primes.h > c++ -o primes primes.cpp soapC.cpp stdsoap2.cpp Usage: > ./primes -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2011, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ // include all generated header files: #include "soapH.h" #include int main() { primes p; // also instantiates the 'soap' context p.sieve(100); // sieve primes primes q; q = p; // to show that copy constructor and assignment are OK q.write(); // write primes in XML return 0; } // sieving primes in the simple_vector<> container: void primes::sieve(int n) { prime.clear(); prime.insert(prime.end(), 1); prime.insert(prime.end(), 2); for (int i = 3; i <= n; i += 2) { bool composite = false; for (simple_vector::const_iterator j = prime.begin(); j != prime.end(); ++j) { if (*j != 1 && i % *j == 0) { composite = true; break; } } if (!composite) prime.insert(prime.end(), i); } } // the writer uses the fact that the primes class inherits the context: void primes::write() { soap_set_omode(this, SOAP_XML_INDENT); // show with indentation please soap_write_primes(this, this); // soap_write_prime is generated } // the destructor cleans up the 'soap' context primes::~primes() { soap_destroy(this); soap_end(this); } // we need a dummy namespace table, even though we don't use XML namespaces: SOAP_NMAC struct Namespace namespaces[] = { {NULL, NULL, NULL, NULL} }; gsoap-2.8.91/gsoap/samples/primes/.deps/0000755000175000017500000000000013525245200017347 5ustar ellertellertgsoap-2.8.91/gsoap/samples/primes/Makefile.in0000644000175000017500000004701413525245163020421 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = primes$(EXEEXT) subdir = gsoap/samples/primes ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am_primes_OBJECTS = $(am__objects_1) primes.$(OBJEXT) $(am__objects_2) primes_OBJECTS = $(am_primes_OBJECTS) am__DEPENDENCIES_1 = primes_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/primes.Po ./$(DEPDIR)/soapC.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(primes_SOURCES) DIST_SOURCES = $(primes_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.cpp_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = primes.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = SOAP_FLAGS = -0 -CS primes_SOURCES = $(SOAPHEADER) primes.cpp simple_vector.h $(SOAP_CPP_CORE) primes_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/primes/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/primes/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) primes$(EXEEXT): $(primes_OBJECTS) $(primes_DEPENDENCIES) $(EXTRA_primes_DEPENDENCIES) @rm -f primes$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(primes_OBJECTS) $(primes_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/primes.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/primes.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/primes.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/primes/simple_vector.h0000644000175000017500000001042513525245163021374 0ustar ellertellert/* simple_vector.h Defines the simple_vector<> template as an example on how to define custom containers that can be auto-serialized in XML with gSOAP. In order for the auto-generated XML serializers to work for templates, we must define at least these methods: void clear() iterator begin() const_iterator begin() const iterator end() const_iterator end() const size_t size() const iterator insert(iterator pos, const_reference val) where begin() gives a forward iterator over the container. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ // declare the simple_vector<> template: #include template class simple_vector { public: typedef T value_type; typedef value_type * pointer; typedef const value_type * const_pointer; typedef value_type & reference; typedef const value_type & const_reference; typedef pointer iterator; typedef const_pointer const_iterator; protected: iterator head; iterator tail; size_t capacity; public: simple_vector() { head = tail = NULL; } simple_vector(const simple_vector& v) { operator=(v); } ~simple_vector() { if (head) delete[] head; } void clear() { tail = head; } /* the member functions below are required for (de)serialization of templates */ iterator begin() { return head; } const_iterator begin() const { return head; } iterator end() { return tail; } const_iterator end() const { return tail; } size_t size() const { return tail - head; } iterator insert(iterator pos, const_reference val) { if (!head) head = tail = new value_type[capacity = 1]; else if (tail >= head + capacity) { iterator i = head; iterator j = new value_type[capacity *= 2]; iterator k = j; while (i < tail) *k++ = *i++; if (pos) pos = j + (pos - head); tail = j + (tail - head); delete[] head; head = j; } if (pos && pos >= head && pos < tail) { iterator i = tail; iterator j = i - 1; while (j != pos) *i-- = *j--; *pos = val; } else { pos = tail; *tail++ = val; } return pos; } simple_vector& operator=(const simple_vector& v) { head = tail = NULL; capacity = v.capacity; if (v.head) { head = tail = new value_type[capacity]; iterator i = v.head; while (i != v.tail) *tail++ = *i++; } return *this; } }; gsoap-2.8.91/gsoap/samples/primes/primes.h0000644000175000017500000000370013525245163020016 0ustar ellertellert/* primes.h Declarations for the soapcpp2 compiler to define a primes class derived from the 'soap' context and to define a simple_vector template. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ // declare the simple_vector<> template: template class simple_vector; // declare a primes class that inherits a context for SOAP/XML serialization: class primes: struct soap { public: simple_vector prime; // container of ints void sieve(int n); void write(); virtual ~primes(); }; // #include is deferred to the generated code, which will then include the defs: #include "simple_vector.h" // defines simple_vector<> gsoap-2.8.91/gsoap/samples/primes/README.txt0000644000175000017500000000064613525245163020052 0ustar ellertellert Demonstates the use of a user-defined C++ container simple_vector<> defined in simple_vector.h suitable for XML serialization. Elements contained can be automatically serialized to and from XML. This requires a container that supports at least these methods: iterator begin() const_iterator begin() const iterator end() const iterator end() const size_t size() const iterator insert(iterator, const_reference) gsoap-2.8.91/gsoap/samples/primes/Makefile.am0000644000175000017500000000076713525245163020414 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = primes SOAPHEADER = primes.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = SOAP_FLAGS=-0 -CS primes_SOURCES = $(SOAPHEADER) primes.cpp simple_vector.h $(SOAP_CPP_CORE) primes_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) gsoap-2.8.91/gsoap/samples/factory/0000755000175000017500000000000013525245174016520 5ustar ellertellertgsoap-2.8.91/gsoap/samples/factory/.deps/0000755000175000017500000000000013525245174017531 5ustar ellertellertgsoap-2.8.91/gsoap/samples/factory/Makefile.in0000644000175000017500000004742713525245163020601 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = factory$(EXEEXT) subdir = gsoap/samples/factory ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapServer.$(OBJEXT) $(am__objects_2) am_factory_OBJECTS = factory.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) factory_OBJECTS = $(am_factory_OBJECTS) am__DEPENDENCIES_1 = factory_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/factory.Po ./$(DEPDIR)/soapC.Po \ ./$(DEPDIR)/soapServer.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(factory_SOURCES) DIST_SOURCES = $(factory_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.cpp_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = factory.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = factory.nsmap factory.wsdl factory_SOURCES = factory.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) factory_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/factory/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/factory/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) factory$(EXEEXT): $(factory_OBJECTS) $(factory_DEPENDENCIES) $(EXTRA_factory_DEPENDENCIES) @rm -f factory$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(factory_OBJECTS) $(factory_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/factory.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/factory.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/factory.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/factory/factory.h0000644000175000017500000001332213525245163020337 0ustar ellertellert/* factory.h Server-side remote object factory definitions Server code: factory.cpp This header file contains all the class declarations of the remote objects to support serialization of these objects for server-side state management (simple save/load operations are implemented). The remote object factory uses a lease-based system. Remote objects are purged from the pool when the lease expires (see LEASETERM in factory.cpp). Supports inheritance. Compile: soapcpp2 factory.h c++ -o factory factory.cpp stdsoap2.cpp soapC.cpp soapServer.cpp Run (e.g. in the background) factory where is a available port number, e.g. 18085 -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: factory //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/factory.wsdl //gsoap ns service location: http://localhost:18085 //gsoap ns schema namespace: urn:factoryService //gsoap t schema namespace: urn:factoryTypes //gsoap h schema namespace: urn:factoryHandles //////////////////////////////////////////////////////////////////////////////// // // SOAP Header: used to exchange stateful object handles // //////////////////////////////////////////////////////////////////////////////// struct SOAP_ENV__Header { mustUnderstand unsigned int h__handle; }; //////////////////////////////////////////////////////////////////////////////// // // Server-side root class // //////////////////////////////////////////////////////////////////////////////// enum t__object // object types: { ROOT, // t__root object ADDER, // t__adder object COUNTER // t__counter object }; enum t__status // remote object status: { FACTORY_OK, // ok FACTORY_INVALID, // invalid handle (wrong type of object or lease expired) FACTORY_NOTFOUND, // lookup operation not successful FACTORY_RETRY // cannot create new object: try later }; class t__root { public: enum t__object object; // object type char *name; // object name for lookup operation (optional) unsigned int handle; // internal handle time_t lease; // lease expiration time t__root(); virtual ~t__root(); virtual void renew(); // to renew lease }; //////////////////////////////////////////////////////////////////////////////// // // Server-side adder class derived from root // //////////////////////////////////////////////////////////////////////////////// class t__adder: public t__root { public: double val; // current value of the adder void set(double val); // to set the adder double get(); // to get value of the adder void add(double val); // to add a value to the adder }; //////////////////////////////////////////////////////////////////////////////// // // Server-side counter class derived from adder // //////////////////////////////////////////////////////////////////////////////// class t__counter: public t__adder { public: void inc(); // to increment the counter }; //////////////////////////////////////////////////////////////////////////////// // // Remote factory method interfaces // //////////////////////////////////////////////////////////////////////////////// //gsoap ns service method-header-part: create h__handle int ns__create(enum t__object object, char *name, enum t__status &status); //gsoap ns service method-header-part: lookup h__handle int ns__lookup(enum t__object object, char *name, enum t__status &status); //gsoap ns service method-header-part: rename h__handle int ns__rename(char *name, enum t__status &status); //gsoap ns service method-header-part: release h__handle int ns__release(enum t__status &status); //////////////////////////////////////////////////////////////////////////////// // // Rewote adder method interfaces // //////////////////////////////////////////////////////////////////////////////// //gsoap ns service method-header-part: set h__handle int ns__set(double val, enum t__status &status); //gsoap ns service method-header-part: get h__handle int ns__get(double &val); //gsoap ns service method-header-part: add h__handle int ns__add(double val, enum t__status &status); //////////////////////////////////////////////////////////////////////////////// // // Remote counter method interfaces // //////////////////////////////////////////////////////////////////////////////// //gsoap ns service method-header-part: inc h__handle int ns__inc(enum t__status &status); gsoap-2.8.91/gsoap/samples/factory/README.txt0000644000175000017500000000056113525245163020216 0ustar ellertellert A remote object factory. Server objects are instantiated, manipulated, and destroyed remotely using SOAP messages. The objects are persistent and can be named. Objects are purged when their lease expires. A lease is renewed when the object is used. This example defines a root object, an adder object, and a counter object. See samples/factorytest for client code. gsoap-2.8.91/gsoap/samples/factory/factory.cpp0000644000175000017500000003440513525245162020676 0ustar ellertellert/* factory.cpp Remote object factory The remote object factory uses a lease-based system. Remote objects are purged from the pool when the lease expires. Supports inheritance. Compile: soapcpp2 factory.h c++ -o factory factory.cpp stdsoap2.cpp soapC.cpp soapServer.cpp Run (e.g. in the background) factory where is a available port number, e.g. 18085 -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include // for open() #include "soapH.h" #include "factory.nsmap" #define POOLSIZE 1000 // max number of remote objects that can be alive at any instance #define LEASETERM 60 // lease term (in seconds). Also the rate at which objects are purged //////////////////////////////////////////////////////////////////////////////// // // Factory class maintains pool of objects and can act as a simple ORB // //////////////////////////////////////////////////////////////////////////////// class Factory { public: t__root *ref[POOLSIZE]; // pool of objects (t__root is base class) unsigned int handle; // handle generation counter (is allowed to wrap around 32 bits) Factory(); ~Factory(); unsigned int create(struct soap *soap, enum t__object object, char *name); unsigned int lookup(enum t__object object, char *name); unsigned int rename(unsigned int handle, char *name); void release(unsigned int handle); void purge(struct soap* soap); t__root *get(unsigned int handle); t__root *root(unsigned int handle); t__adder *adder(unsigned int handle); t__counter *counter(unsigned int handle); int save(const char *file); int load(const char *file); }; // Initialize empty pool and set handle generation counter to 0 Factory::Factory() { for (int i = 0; i < POOLSIZE; i++) ref[i] = NULL; handle = 0; } // Remove all objects from pool Factory::~Factory() { for (int i = 0; i < POOLSIZE; i++) if (ref[i]) delete ref[i]; } // Create a new object, place it in the pool, and return handle unsigned int Factory::create(struct soap *soap, enum t__object object, char *name) { (void)soap; for (int i = 0; i < POOLSIZE; i++) if (!ref[++handle % POOLSIZE]) // succeeds if this slot is available { t__root *r = NULL; if (!handle) handle += POOLSIZE; // make sure handle is never 0 (0 indicates invalid handle) switch (object) // type of object to instantiate { case ROOT: r = new t__root(); break; case ADDER: r = new t__adder(); break; case COUNTER: r = new t__counter(); break; } if (r) { ref[handle % POOLSIZE] = r; // add object to the pool r->object = object; // save type if (name) // save name (if assigned) r->name = strdup(name); else r->name = NULL; r->handle = handle; // keep handle for verification r->renew(); // renew its lease return handle; } return 0; } return 0; } // Lookup the name of an object and return handle unsigned int Factory::lookup(enum t__object object, char *name) { for (int i = 0; i < POOLSIZE; i++) if (ref[i] && ref[i]->object == object && ref[i]->name && !strcmp(ref[i]->name, name)) { ref[i]->renew(); return ref[i]->handle; } return 0; } // Rename object and return handle if successful unsigned int Factory::rename(unsigned int handle, char *name) { t__root *r = get(handle); if (r) { size_t l = strlen(name); if (r->name) free(r->name); r->name = (char*)malloc(l + 1); soap_strcpy(r->name, l + 1, name); r->renew(); return handle; } return 0; } // get ref to object from handle t__root *Factory::get(unsigned int handle) { t__root *r = ref[handle % POOLSIZE]; if (r && r->handle == handle) return r; return NULL; } // get ref to root object from handle and renew lease t__root *Factory::root(unsigned int handle) { t__root *r = get(handle); if (r) r->renew(); return r; } // get ref to adder object from handle and renew lease t__adder *Factory::adder(unsigned int handle) { t__adder *a = (t__adder*)get(handle); if (a) { if (a->object == ADDER || a->object == COUNTER) a->renew(); else a = NULL; } return a; } // get ref to counter object from handle and renew lease t__counter *Factory::counter(unsigned int handle) { t__counter *c = (t__counter*)get(handle); if (c) { if (c->object == COUNTER) c->renew(); else c = NULL; } return c; } // remove all objects from pool whose lease has expired void Factory::purge(struct soap *soap) { time_t t = time(NULL); // current time int flag = 1; for (int i = 0; i < POOLSIZE; i++) { t__root *r = ref[i]; if (r && r->lease < t) // expired? { if (flag) fprintf(stderr, "\nPurging objects:"); if (r->name) fprintf(stderr, "%s(%u)\n", r->name, r->handle); else fprintf(stderr, "(%u)\n", r->handle); soap_delete(soap, r); ref[i] = NULL; flag = 0; } } } // remove object from pool and release slot void Factory::release(unsigned int handle) { t__root *r = get(handle); if (r) ref[handle % POOLSIZE] = NULL; } // save object pool to file (or stdout) int Factory::save(const char *file) { struct soap soap; // use a new local gSOAP environment soap_init(&soap); soap_begin(&soap); if (file) soap.sendfd = open(file, O_CREAT|O_TRUNC|O_WRONLY, S_IREAD|S_IWRITE); if (soap.sendfd < 0) return -1; soap_begin_send(&soap); for (int i = 0; i < POOLSIZE; i++) if (ref[i]) { ref[i]->soap_serialize(&soap); soap_begin_send(&soap); ref[i]->soap_put(&soap, "item", NULL); soap_end_send(&soap); } if (file) close(soap.sendfd); soap_end(&soap); soap_done(&soap); return 0; } // load object pool from file (or stdin) int Factory::load(const char *file) { struct soap soap; t__root *r; soap_init(&soap); if (file) soap.recvfd = open(file, O_RDONLY); if (soap.recvfd < 0) return -1; soap_begin_recv(&soap); for (int i = 0; i < POOLSIZE; i++) { if (ref[i]) { delete ref[i]; ref[i] = NULL; } } for (;;) { r = soap_in_t__root(&soap, "item", NULL, NULL); // use the 'in' routine ('get' will also attempt to parse the remaining XML) if (r) ref[r->handle % POOLSIZE] = r; else break; } if (file) close(soap.recvfd); if (soap.error != SOAP_OK && soap.error != SOAP_EOF) { soap_print_fault(&soap, stderr); soap_print_fault_location(&soap, stderr); } soap_free(&soap); // do not call soap_end: this would remove all deserialized data soap_done(&soap); return 0; } //////////////////////////////////////////////////////////////////////////////// // // Main server program // //////////////////////////////////////////////////////////////////////////////// int main(int argc, char **argv) { int m, s; struct soap soap; Factory factory; // create factory and simple ORB soap_init(&soap); soap.user = (void*)&factory; // associate factory with run-time soap.accept_timeout = 1; // check every second, if not too busy for purging objects if (argc < 2) { factory.load("factory.dat"); // if CGI is used, load the entire pool (not very efficient and there may be a competition for access to this file! This is just to demonstrate load/save of the entire pool) factory.purge(&soap); soap_serve(&soap); factory.save("factory.dat"); // ... and save afterwards } else { m = soap_bind(&soap, NULL, atoi(argv[1]), 100); // use command line argument as port number if (m < 0) { soap_print_fault(&soap, stderr); exit(1); } fprintf(stderr, "Socket connection successful %d\n", m); for (int i = 1; ; i++) { s = soap_accept(&soap); if (s < 0) { if (soap.errnum) soap_print_fault(&soap, stderr); else // errnum is 0, which means a timeout has occurred { factory.purge(&soap); // purge objects whose lease has ran out continue; } exit(1); } fprintf(stderr, "%d: accepted %d IP=%d.%d.%d.%d ... ", i, s, (int)(soap.ip>>24)&0xFF, (int)(soap.ip>>16)&0xFF, (int)(soap.ip>>8)&0xFF, (int)soap.ip&0xFF); soap_serve(&soap); fprintf(stderr, "served\n"); soap_end(&soap); // clean up: this will remove deserialized data } } return 0; } //////////////////////////////////////////////////////////////////////////////// // // Remote factory method implementations // //////////////////////////////////////////////////////////////////////////////// int ns__create(struct soap *soap, enum t__object object, char *name, enum t__status &status) { Factory *factory = (Factory*)soap->user; // get factory from gSOAP environment if (!soap->header) soap->header = (struct SOAP_ENV__Header*)soap_malloc(soap, sizeof(struct SOAP_ENV__Header)); if (soap->header) { soap->header->h__handle = factory->create(soap, object, name); if (soap->header->h__handle) status = FACTORY_OK; else status = FACTORY_INVALID; } else status = FACTORY_RETRY; return SOAP_OK; } int ns__lookup(struct soap *soap, enum t__object object, char *name, enum t__status &status) { Factory *factory = (Factory*)soap->user; // get factory from gSOAP environment if (!soap->header) soap->header = (struct SOAP_ENV__Header*)soap_malloc(soap, sizeof(struct SOAP_ENV__Header)); if (soap->header) { soap->header->h__handle = factory->lookup(object, name); if (soap->header->h__handle) status = FACTORY_OK; else status = FACTORY_NOTFOUND; } else status = FACTORY_RETRY; return SOAP_OK; } int ns__rename(struct soap *soap, char *name, enum t__status &status) { Factory *factory = (Factory*)soap->user; // get factory from gSOAP environment if (soap->header) { soap->header->h__handle = factory->rename(soap->header->h__handle, name); if (soap->header->h__handle) status = FACTORY_OK; else status = FACTORY_INVALID; } else status = FACTORY_INVALID; return SOAP_OK; } int ns__release(struct soap *soap, enum t__status &status) { Factory *factory = (Factory*)soap->user; // get factory from gSOAP environment if (soap->header && soap->header->h__handle) { factory->release(soap->header->h__handle); status = FACTORY_OK; } else status = FACTORY_INVALID; return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // Remote adder method implementations // //////////////////////////////////////////////////////////////////////////////// int ns__set(struct soap *soap, double val, enum t__status &status) { Factory *factory = (Factory*)soap->user; // get factory from gSOAP environment if (soap->header) { t__adder *adder = factory->adder(soap->header->h__handle); if (adder) { adder->set(val); status = FACTORY_OK; } else status = FACTORY_INVALID; } else status = FACTORY_INVALID; return SOAP_OK; } int ns__get(struct soap *soap, double &val) { Factory *factory = (Factory*)soap->user; // get factory from gSOAP environment val = DBL_NAN; if (soap->header) { t__adder *adder = factory->adder(soap->header->h__handle); if (adder) val = adder->get(); } return SOAP_OK; } int ns__add(struct soap *soap, double val, enum t__status &status) { Factory *factory = (Factory*)soap->user; // get factory from gSOAP environment if (soap->header) { t__adder *adder = factory->adder(soap->header->h__handle); if (adder) { adder->add(val); status = FACTORY_OK; } else status = FACTORY_INVALID; } else status = FACTORY_INVALID; return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // Remote counter method implementations // //////////////////////////////////////////////////////////////////////////////// int ns__inc(struct soap *soap, enum t__status &status) { Factory *factory = (Factory*)soap->user; // get factory from gSOAP environment if (soap->header) { t__counter *counter = factory->counter(soap->header->h__handle); if (counter) { counter->inc(); status = FACTORY_OK; } else status = FACTORY_INVALID; } else status = FACTORY_INVALID; return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // Server-side base factory class methods // //////////////////////////////////////////////////////////////////////////////// t__root::t__root() { } t__root::~t__root() { if (name) free(name); } void t__root::renew() { lease = time(NULL) + LEASETERM; // can adopt a leasing policy per class } //////////////////////////////////////////////////////////////////////////////// // // Server-side adder class methods // //////////////////////////////////////////////////////////////////////////////// void t__adder::set(double val) { this->val = val; // copy data to update state } double t__adder::get() { return val; } void t__adder::add(double val) { this->val += val; } //////////////////////////////////////////////////////////////////////////////// // // Server-side counter class methods // //////////////////////////////////////////////////////////////////////////////// void t__counter::inc() { add(1.0); } gsoap-2.8.91/gsoap/samples/factory/Makefile.am0000644000175000017500000000077013525245163020556 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = factory SOAPHEADER = factory.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = factory.nsmap factory.wsdl factory_SOURCES = factory.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) factory_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) gsoap-2.8.91/gsoap/samples/dom/0000755000175000017500000000000013525245174015630 5ustar ellertellertgsoap-2.8.91/gsoap/samples/dom/README.md0000644000175000017500000037003513525245162017114 0ustar ellertellert XML DOM API and domcpp {#mainpage} ====================== [TOC] Introduction {#intro} ============ XML data bindings provide a powerful mechanism to parse, validate, manipulate, and write XML data with ease as if we are working with native C and C++ data. Occasionally we will need to work with raw XML data. Raw XML can be parsed with a DOM parser and stored in a DOM node graph. The DOM (Document Object Model) node graph (actually a node tree) can be inspected to retrieve text and other values. We can iteratively and recursively traverse the XML tree via its DOM node graph at increasingly deeper levels to inspect and retrieve values of XML elements and attributes. We can also use XPath queries to locate data deep in the DOM node hierarchy to retrieve specific values. The gSOAP XML DOM API is compact in size but offers a wealth of operations to construct, inspect, traverse, and search data in DOM node graphs. The DOM API offers powerful constructors to construct a DOM node graph for XML with **smart XML namespace handling** to simplify coding. The DOM API also offers a hybrid **DOM + data binding approach** that allows you to embed serializable C/C++ data types including user-defined structs and classes. You can also search and retrieve values from XML and XML with namespaces using the DOM API's smart XML namespace handling. We also offer a new code generation tool, **domcpp**, that greatly simplifies writing DOM API code by generating DOM construction code, DOM inspection code, and XPath code to query a DOM. The generated code uses the DOM API transparently in C and C++ (C++ by default and pure C as an option). So it is easy to get familiar with the DOM API by using the domcpp tool. In the first part of this introduction we show how to effectively use the domcpp tool to get started. The **domcpp** application is located in the gSOAP distribution package under `gsoap/samples/dom` and is built with: cd gsoap/samples/dom make domcpp This document describes **domcpp** and the C and C++/C++11 DOM APIs of gSOAP, see table of contents. XML DOM and gSOAP {#intro-1} ----------------- To help you quickly develop C/C++ code to construct, inspect, and search DOM node graphs using the XML DOM API, we offer a new code generator **domcpp** with the gSOAP package (version 2.8.28 and up). You can find the domcpp tool with the DOM examples in `gsoap/samples/dom`. The domcpp command-line tool auto-generates C or C++ code from an XML fragment. The generated code creates a DOM node graph for this fragment, which can be further tweaked as necessary. Let's demonstrate this with an example `menu.xml` XML file, where we show each command executed in a command shell followed by the results displayed in the terminal: cat menu.xml
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
domcpp menu.xml ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" { struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); ctx->double_format = "%lG"; xsd__anyType dom(ctx, "menu"); dom.att("id") = "file"; dom.att("value") = "File"; dom["popup"]["menuitem"][1].att("value") = "New"; dom["popup"]["menuitem"][1].att("onclick") = "CreateNewDoc()"; dom["popup"]["menuitem"][2].att("value") = "Open"; dom["popup"]["menuitem"][2].att("onclick") = "OpenDoc()"; dom["popup"]["menuitem"][3].att("value") = "Close"; dom["popup"]["menuitem"][3].att("onclick") = "CloseDoc()"; std::cout << dom << std::endl; soap_destroy(ctx); // delete objects soap_end(ctx); // delete DOM data soap_free(ctx); // free context } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ When comparing this C++ source code to C source code generated by domcpp, you will notice that the generated source code for pure C is similar to the C++ source code, but uses the C DOM API functions directly instead of C++ methods: domcpp -c menu.xml ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" { struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); ctx->double_format = "%lG"; xsd__anyType *dom = soap_elt_new(ctx, NULL, "menu"); soap_att_text(soap_att(dom, NULL, "id"), "file"); soap_att_text(soap_att(dom, NULL, "value"), "File"); soap_att_text(soap_att(soap_nth_elt(soap_elt(dom, NULL, "popup"), NULL, "menuitem", 1), NULL, "value"), "New"); soap_att_text(soap_att(soap_nth_elt(soap_elt(dom, NULL, "popup"), NULL, "menuitem", 1), NULL, "onclick"), "CreateNewDoc()"); soap_att_text(soap_att(soap_nth_elt(soap_elt(dom, NULL, "popup"), NULL, "menuitem", 2), NULL, "value"), "Open"); soap_att_text(soap_att(soap_nth_elt(soap_elt(dom, NULL, "popup"), NULL, "menuitem", 2), NULL, "onclick"), "OpenDoc()"); soap_att_text(soap_att(soap_nth_elt(soap_elt(dom, NULL, "popup"), NULL, "menuitem", 3), NULL, "value"), "Close"); soap_att_text(soap_att(soap_nth_elt(soap_elt(dom, NULL, "popup"), NULL, "menuitem", 3), NULL, "onclick"), "CloseDoc()"); soap_write_xsd__anyType(ctx, dom), putchar('\n'); soap_end(ctx); /* delete DOM data */ soap_free(ctx); /* free context */ } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can use domcpp option `-M` to narrow the generated code down to the essentials, without the initialization and cleanup parts in the generated source code. This makes the generated code suitable for direct inclusion in your codebase. You can use domcpp option `-e` to add explanatory comments to the generated code, which explains what the code does to help you understand the DOM API by including XPath path locations and other details. In fact, the C++ DOM API is designed around the concept of XPath's path location to construct a node graph by aligning the C++ `[]` overloaded operator to XPath's path steps and position predicates. You can use domcpp option `-e` to reveal the XPath for each assignment statement. For example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} xsd__anyType dom(ctx, "menu"); // /menu/@id = file dom.att("id") = "file"; // /menu/@value = File dom.att("value") = "File"; // /menu/popup/menuitem[1]/@value = New dom["popup"]["menuitem"][1].att("value") = "New" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Generating code to populate a DOM node graph is one option. Another option is to generate code to inspect a DOM node graph. Use domcpp option `-i` to generate code to inspect the DOM node graph of XML parsed from input, given that the XML file provided with option `-i` serves as a generic template: domcpp -i menu.xml ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" { struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); ctx->double_format = "%lG"; xsd__anyType dom(ctx); std::cin >> dom; if (dom.soap->error) exit(EXIT_FAILURE); // error parsing XML xsd__anyAttribute *att; xsd__anyType *elt; #define USE_ATT(path, text) std::cout << path << " = " << text << std::endl #define USE_ELT(path, text) std::cout << path << " = " << text << std::endl if ((att = dom.att_get("id"))) USE_ATT("/menu/@id", att->get_text()); if ((att = dom.att_get("value"))) USE_ATT("/menu/@value", att->get_text()); if ((elt = dom.elt_get("popup"))) { xsd__anyType& dom_popup = *elt; for (xsd__anyType *it = dom_popup.elt_get("menuitem"); it; it = it->get_next()) { xsd__anyType& dom_popup_menuitem = *it; if ((att = dom_popup_menuitem.att_get("value"))) USE_ATT("/menu/popup/menuitem/@value", att->get_text()); if ((att = dom_popup_menuitem.att_get("onclick"))) USE_ATT("/menu/popup/menuitem/@onclick", att->get_text()); } } std::cout << dom << std::endl; soap_destroy(ctx); // delete objects soap_end(ctx); // delete DOM data soap_free(ctx); // free context } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can also use domcpp option `-p` to generate efficient XPath query code to query and retrieve specific XML values. For example, let's write an XPath query to display the authors of books in a store. We will read the XML data from `std:cin` and filter the authors with the query `/store/book/@author` to collect them in a DOM node graph `y` containing the query results with domcpp option `-y`. We generate the code from the command line with domcpp as follows: domcpp -M -p'/store/book/@author' -y ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} xsd__anyType dom(ctx); std::cin >> dom; // XPath: /store/book/@author xsd__anyAttribute *att; xsd__anyType *elt; xsd__anyType y(ctx, "results"); #define QUERY_YIELD_ATT(v) y.add(xsd__anyType(ctx, "result").add(v)); #define QUERY_YIELD_ELT(v) y.add(xsd__anyType(ctx, "result").add(v)); if (dom.match("store")) { size_t pos = 1; for (xsd__anyType *it = dom.elt_get("book"); it; it = it->get_next(), ++pos) { xsd__anyType& v = *it; if ((att = v.att_get("author"))) { xsd__anyAttribute& v = *att; QUERY_YIELD_ATT(v); } } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Let's apply this query to the `store.xml` file that you can find in section [XPath by example](#domcpp-4): ./query < store.xml
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
You can compile this example yourself with: domcpp -o query.cpp -m -p'/store/book/@author' -y soapcpp2 -CSL import/dom.h c++ -o query query.cpp soapC.cpp dom.cpp stdsoap2.cpp You can also embed C/C++ code in XPath queries to filter and select values from XML at runtime. The domcpp code generator aims to produce clean, high-quality and readable C and C++ code. You can also embed C/C++ code in XPath queries to filter and select values from XML data at runtime. We will present domcpp in more detail in the next section. The remainder of this document explains how you can use the DOM C and C++ APIs to create XML data, access XML data, send/recv data via REST, and to read/write XML data to files, streams, and string buffers. XML DOM versus XML data bindings {#intro-2} -------------------------------- XML data bindings greatly simplify the development of XML applications. Compared to DOM manipulation and search by DOM tree traversal, all that is needed are declarations of the C/C++ data types that need to be serializable in XML by using the soapcpp2 tool the generate the data binding implementation. Furthermore, XML parsing is much faster with XML data bindings. XML is efficiently pulled and converted by the C/C++ deserializers. For more details, see [XML Data Bindings](http://www.genivia.com/doc/databinding/html). On the other hand, you can use the XML DOM API to develop REST operations for SOAP and XML messaging by composing and decomposing the XML manually. For example in C++: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" struct Namespace namespaces[] = { {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/"}, {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/"}, {"xsi", "http://www.w3.org/2001/XMLSchema-instance"}, {"xsd", "http://www.w3.org/2001/XMLSchema"}, {"t", "http://tempuri.org/t.xsd"}, {NULL, NULL} }; int main() { soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); const char *endpoint = "http://www.cs.fsu.edu/~engelen/gmtlitserver.cgi"; xsd__anyType req(ctx, "SOAP-ENV:Envelope"); // DOM with SOAP envelope xsd__anyType res(ctx); // DOM for SOAP response req["SOAP-ENV:Body"]["t:gmt"] = ""; // SOAP Body with soap_dom_call(ctx, // make a call (POST) endpoint, // the service endpoint URL NULL, // no SOAPAction header req, // request t:gmt res); // response, if OK if (ctx->error) ... // handle IO error xsd__anyType::iterator i = res.find("param-1"); if (i != res.end()) // if found, display time cout << "Current time = " << i->get_text() << endl; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The `SOAP_DOM_TREE` context flag used here disables the deserialization of embedded objects and data, which will be discussed in the next section. Other REST methods can be used to manage the state of resources via URL references, allowing for the storage of data (HTTP PUT), retrieval of data (HTTP GET), and removal of data (HTTP DELETE) from a resource. The `soap_dom_call` function takes NULL as the service input request and service output response parameters to facilitate PUT (NULL for response), GET (NULL for request), and DELETE (both request and response are NULL). However, XML data bindings greatly simplify the development of XML applications such as client and server runtimes for XML messaging and message validation. Compared to DOM manipulation and search by DOM tree traversal, all that is needed are declarations of server operations as C functions and the C/C++ data types passed to these functions. For example, with XML data bindings it only takes one line to declare the SOAP/XML service operation: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} t__gmt(time_t*); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The soapcpp2 tool generates the data binding implementation such that `t__gmt` can be invoked as a function in a client-side C or C++ runtime: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" #include "t.nsmap" int main () { soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); time_t t; soap_call_t__gmt(ctx, endpoint, NULL, &t); if (ctx->error == SOAP_OK) cout << "Current time = " << ctime(t) << endl; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The gSOAP DOM API offers a hybrid **DOM + data binding approach** that allows you to use DOM nodes a members of serializable structs and classes (these DOM parts are auto-generated by wsdl2h with option `-d`). This hybrid approach also allows you to embed serializable C/C++ data into a DOM node graph. This way, you get the best of both XML DOM and XML data bindings. Embedding serializable objects and data in DOM element nodes {#intro-3} ------------------------------------------------------------ C and C++ objects and types can be serialized and deserialized when embedded in a DOM node. ### Defining serializable types {#intro-3-1} To embed serializable data types we first define these types in a header file for soapcpp2 to generate the data binding code. We also import `dom.h` from `gsoap/import` to use the DOM API: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #import "import/dom.h" //gsoap t schema namespace: urn:demotime typedef time_t _t__time; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This is a very small example to illustrate the concept. You can add declarations of data types to serialize. If XML namespaces are used in the XML document, then follow the naming conventions outlined in [XML Data Bindings: Colon notation versus name prefixing](http://www.genivia.com/doc/databinding/html/index.html#toxsd2). Importing `dom.h` is automated with wsdl2h option `-d` when running wsdl2h on WSDL and XSD files to produce a header file with the data binding interface for soapcpp2. Here, we assume you are starting with a header file for soapcpp2 with the declarations of C/C++ types to serialize. We use soapcpp2 to generate the data binding implementation code together with the DOM API in `soapStub.h`, `soapH.h`, `soapC.cpp` and a namespace table file `t.nsmap` and `t.xsd` schema that declares a `time` type (at line 11) and also an element (at line 15) because by convention the `_t__time` type name is prefixed with a `_`:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
For details on declaring C/C++ types for XML data bindings and serialization, see [XML Data Bindings: Defining document root elements](http://www.genivia.com/doc/databinding/html/index.html#toxsd9-7). You can use these serializable types declared in the header file as embedded serializable objects and data in DOM element nodes. The `SOAP_DOM_NODE` context flag should be set to enable this feature. In the following example we use `_t__time` to construct a DOM for an XML root element `` that contains an embedded serializable `time_t` value: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" #include "t.nsmap" int main() { soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_NODE); time_t t = time(0); xsd__anyType dom(ctx, NULL, "t:time", &t, SOAP_TYPE__t__time); cout << dom << endl; // write XML ... if (dom.soap->error) ... // handle IO error } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ and to parse and deserialize a `` into a `time_t` value: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" #include "t.nsmap" int main() { soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_NODE); xsd__anyType dom(ctx); cin >> dom; // parse XML ... if (dom.soap->error) ... // handle IO error const time_t *t = static_cast(dom.get_node(SOAP_TYPE__t__time)); if (t) cout << "Time = " << ctime(t) << endl; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ### Deserializing by XML element name or by type name {#intro-3-2} With the `SOAP_DOM_NODE` flag set, there are two ways the C/C++ types are deserialized into DOM elements: by element tag name matching or by xsi:type matching: 1. If an xsi:type attribute is present (which requires preparations on the sending side), then its value is matched against the names of the C/C++ types to select a deserializer to parse and deserialize the data into a DOM element node as embedded objects/data. If no xsi:type attribute is present or if no serializer is found, then: 2. The element tag is matched against the names of serializable C/C++ types to select a deserializer to deserialize the data into a DOM element node as embedded objects/data. If no deserializer is found then the XML element is parsed and stored as a DOM element node. While `SOAP_DOM_NODE` instructs the DOM parser to deserialize the values of C/C++ types that match element tags, the opposite, `SOAP_DOM_TREE` prevents deserialization, even when an `id` attribute is present in the XML payload. The default is to deserialze only when an `id` attribute is present in the XML payload. This is to ensure that the SOAP encoding protocol deos not break when id-ref attibutes are used for multireferenced objects. ### Using serializable types defined in C++ namespaces {#intro-3-3} The C++ DOM API is unaware of serializable C++ types defined in C++ namespaces. The DOM API only "sees" globally defined types to serialize and deserialize. This can lead to errors when trying to serialize or deserialize an object in a DOM node that is defined in a C++ namespace. When a client or service application is built with C++ namespaces, either using soapcpp2 with option `-q` or with a `namespace` declaration in the .h interface header file for soapcpp2, then you should take care to compile the source code of the DOM API to check for types defined in an external namespace by compiling `dom.cpp` using `-DSOAP_DOM_EXTERNAL_NAMESPACE=namespace_name`. Only one C++ namespace name can be provided with this option. If multiple C++ namespaces are used for serializable types then `dom.cpp` must be modified to invoke the following functions: - `name::soap_markelement()` - `name::soap_putelement()` - `name::soap_getelement()` - `name::soap_dupelement()` - `name::soap_delelement()` These should be added for each namespace `name` and added to the existing invocation of these with `SOAP_DOM_EXTERNAL_NAMESPACE::`. This feature is available for gSOAP 2.8.55 and greater. The domcpp command-line tool {#domcpp} ============================ The domcpp command produces high-quality, readable and reusable source code. The generated code can be readily used in your projects to populate XML data and retrieve XML data, thereby saving you substantial time and effort to write DOM API code in C or C++. The domcpp command-line tool generates C or C++ source code to populate a DOM node graph with the XML data given in an XML file. The command also has an option `-i` to generate source code to inspect parsed XML by using an XML file as a generic template for this code. And option `-p` generates efficient source code for XPath queries. Even stand-alone XPath query filter applications can be auto-generated with option `-m` (for main). Building and installing domcpp {#domcpp-1} ------------------------------ You will find domcpp and the XML DOM examples in the gSOAP package in `gsoap/samples/dom`. To build domcpp, [install gSOAP](http://www.genivia.com/downloads.html) and build domcpp as follows: cd gsoap/samples/dom make domcpp This builds the command-line tool domcpp in `gsoap/samples/dom` from where you can use it and/or copy it for use with your projects. If you do not have the samples built, you can use soapcpp2 from the command line to generate the C++ code required for domcpp: cd gsoap/samples/dom soapcpp2 -CSL ../../import/dom.h c++ -I../.. -o domcpp domcpp.cpp soapC.cpp ../../dom.cpp ../../stdsoap2.cpp This builds the domcpp command-line tool. For users of Windows, visit [download and installation](http://www.genivia.com/downloads.html) to download `domcpp.exe`. Command-line options {#domcpp-2} -------------------- The domcpp command takes several options and an optional XML input file: domcpp [-c] [-e] [-f%fmt] [-h] [-i] [-l] [-m] [-M] [-n] [-O] [-ofile] [-ppath] [-rroot] [-xcode] [-y] [infile] where the domcpp command-line options are: | Option | Description | | -------- | ----------------------------------------------------------------- | | `-c` | generate C code instead of C++ | | `-e` | add explanatory comments to the generated code | | `-f%%fmt`| use `%%fmt` to format double floats, e.g. `-f%%lG` | | `-h` | display help message | | `-i` | generate code to inspect DOM node graph parsed from XML input | | `-l` | generate code for option `-i` to store values in local variables | | `-m` | generate stand-alone code by adding `main()` | | `-M` | generate minimal code unadorned with initialization and cleanup | | `-n` | generate XML namespace table | | `-O` | optimize code by factoring common indices when applicable | | `-ofile` | save source code to `file` | | `-ppath` | generate XPath query code for `path` | | `-rroot` | use `root` instead of root value `dom` in the generated code | | `-xcode` | generate code that executes `code` for each XPath query result | | `-y` | generate code that yields an array `y` of XPath query results | | `infile` | optional XML file to parse | | `-` | read XML from standard input | The domcpp command takes an XML input file `infile` to generate code to construct a DOM node graph in C/C++ for this XML, or, with option `-i`, to generate code that reads XML from input and traverses it to inspect its value by using the XML input file `infile` as a template to match against. For option `-i`, if you want additional code that uses local variables to store boolean, integer, and floating point values retrieved from the DOM node graph, then also use option `-l` with option `-i`. Use option `-c` to generate C code instead of C++ and use option `-e` to add explanatory comments to the generated code. The domcpp command emits source code to standard output or to the file specified with option `-o`. Minimalistic code is generated with option `-M`, which is useful to automate pasting of the unadorned source code into the source code of your project. Optimized code is generated with option `-O` by factoring common array indices and object field names. This produces more elaborate code that is more efficient but may be harder to read and modify. This option has no effect on the code generated with option `-i`. The default name of the root value in the generated source code is `dom`. To change this name use option `-r`. Do not use the name `v`, which represents the current value in XPath query C/C++ code. Other variable names to avoid are `it`, `att`, `elt`, and `pos`, since these are internally used by the generated code. To include a namespace table in the generated code, use option `-n`. This option simplifies the use of the DOM API by removing namespace URIs passed to API functions, as the use of qualified tag names will suffice in most cases. Use option `-p` to generate code that filters XML data from a source of input with an XPath query `path`. Option `-x` specifies XPath query code to execute for each query result. The default action in the generated code is to print each query result value in XML separated by newlines. Option `-y` yields an XML DOM with root `results` and each query result stored in a `result` element. Option `-x` overrides option `-y`. To generate a stand-alone application use option `-m`. This option is useful for testing XPath query filters given with option `-p`. Option `-f%%fmt` sets the floating point double precision format to use in the generated code. By default, domcpp emits floating point numbers with up to 17 digit mantissas to preserve precision. Use `-f%%lG` for the shortest floating point representation. XPath syntax support for domcpp {#domcpp-3} ------------------------------- XPath (the XML Path Language), is a query language for selecting nodes from an XML document. A XPath query returns the XML elements and attributes of a DOM node structure of an XML document that match the selection criteria. An XPath expression specifies a data query to select elements and attributes (and their values) typically starting from the root node, and descending deeper into the node graph to match child nodes. For example, suppose we have a `` root element with a number of `` child elements. Each `` element has a `title` attribute with the title text and some other attributes which we will ignore for now. The following XPath query returns the titles of all books in the store: /store/book/@title This example illustrates the most important kind of expression in XPath, which is a **location path**. A location path consists of a sequence of **location steps**. Locations steps are separated by '/'. Each step consists of an **axis** followed by an optional **node test** and zero or more **predicates**. The axis, node tests, and predicates supported by domcpp XPath expressions are listed in the three tables below. | Axis | Nodes matched and returned | | ------------- | ------------------------------------------------------------ | | `/` | document root (when used at the start of the location path) | | `//` | descendant or self | | `.` | self | | `..` | parent node | | `@` | attribute node | | `tag` | tag name of attributes or elements in the null namespace | | `ns:tag` | tag name of attributes or elements in the `ns` namespace | | `*` or `*:*` | any tag name in any namespace | | `*:tag` | tag name in any namespace | | `ns:*` | all tags in the `ns` namespace | Note that domcpp XPath does not (yet) support the full XPath axis syntax. | Node test | Nodes matched and returned | | ------------- | ------------------------------------------------------------ | | `text()` | text-only child nodes | A `text()` node test is useful to select text-only child nodes when its siblings are a mix of text and elements. This mixed content of elements and text is more common in XHTML markup, but not in XML Web service messaging for example. Zero or more predicates may follow to filter nodes by position, by path, or by a C/C++ expression: | Predicate | Nodes filtered | | ------------- | ------------------------------------------------------------ | | `[n]` | select nodes that are at the n-th position | | `[path]` | select nodes if XPath `path` matches | | `[?expr]` | select nodes if C/C++ expression `expr` is true or nonzero | Note that domcpp XPath does not (yet) support functions and operators in predicates. Instead, you can use C/C++ expressions to filter nodes where variable `v` refers to the axis node (i.e. self, which is an `xsd__anyType` element node or an `xsd__anyAttribute` attribute node) and the integer variable `pos` that refers to the query position. Path subexpressions are grouped with `(` and `)`. Grouping is useful to apply predicates to a specific part of the location path. Without grouping, a predicate only applies to the axis that immediately preceeds it. For example, `x/y[1]` selects the first child element `y` of all `x` elements. By contrast, `(x/y)[1]` selects the first `y` child element of the first `x` element that has at least one `y` child element. XPath by example {#domcpp-4} ---------------- Consider the following XML document:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
To match the `title` of the first book in a `store`, starting at the root indicated by `/`, we use the following XPath query expression: /store/book[1]/@title This query returns `"Sayings of the Century"` when applied to the XML document. To try the XPath examples yourself, we suggest to create a `store.xml` file with the above XML and run domcpp from the command line to compile an XPath query as follows: cd gsoap/samples/dom soapcpp2 -CSL ../../import/dom.h domcpp -o test-dom.cpp -m -p'/store/book[1]/@title' c++ -I../.. -o test-dom test-dom.cpp soapC.cpp ../../dom.cpp ../../stdsoap2.cpp ./test-dom < store.xml The `soapC.cpp` file, and the header files `soapStub.h` and `soapH.h`, are generated with the command `soapcpp2 -CSL dom.h`, which is done just once for all C++ DOM applications. Use soapcpp2 option `-c` to generate `soapC.c` for C (with the corresponding `soapStub.h` and `soapH.h` in C). The compiled XPath query is applied to the `store.xml` document and returns the matches found. Use domcpp option `-y` to collect and return all matches in an XML document with root `results`: To match any tag name of an element or attribute, we use a wildcard `*`: /store/*/@price This matches and returns the prices of all items in the store. If we want to obtain all `price` attributes at any level of the node graph, we can also use `//` called "recursive descent" or simply "recurse" to select descendents (and self when used at the root): //@price This query selects all `price` attributes in an XML document at any level, including the `price` attribute of the document root if any. For our example XML store this query returns the prices of all items in the store. To select all attributes of a node we use a wildcard `@*`, for example to obtain all attributes of the first book in the store: /store/book[1]/@* We can predicate node selections with criteria based on path location matches. For example, to select items from the store that have an `isbn` attribute, and then obtain their price, we use a path location predicate `[@isbn]`: /store/*[@isbn]/@price If we only want to find the first result, we specify a position predicate `[1]` and apply it to all location steps in the XPath expression: /(store/*[@isbn]/@price)[1] A predicate applies to the axis and its predicates located to the left of the predicate as part of one location step, so we used parenthesis to group the location steps to apply the `[1]` position predicate. There can be several ways an XPath query can be formulated. Here is a different one without parenthesis to obtain the same result: /store/*[@isbn][@price][1]/@price This query matches books with both an isbn and price attribute and returns the price of the first match found. Because all store items are priced in our XML store example, we can also use the following XPath query: /store/*[@isbn][1]/@price However, it is generally better to use more robust XPath queries that are not based on assumptions, such as the previous queries for our XML store that cope with price omissions. More complex queries can be formulated by embedding C/C++ expressions in the query as predicates with `[?expr]`. This is an extension of domcpp and not standard XPath expression syntax. For example, the following XPath query with C++ predicate selects store items with prices under 10.0: /store//@price[?(double)v < 10.0] and in C: /store//@price[?soap_att_get_double(v) < 10.0] We can combine the C/C++ predicate with a path predicate to get books priced under 10.0: /store/book[@price[?(double)v < 10.0]] and to obtain the book titles of these books only: /store/book[@price[?(double)v < 10.0]]/@title XPath queries do not modify the node graph searched. So you do not need to worry about predicates with position indices that are out of bounds or about tag names that refer to non-existent attributes or elements. @warning In this respect we should caution you about using C/C++ expressions that modify DOM nodes, since this may affect the query results in unpredictable ways. For example: //[?(double)v.att("price") < 10.0] @warning The `att("price")` method sets an attribute, not just reads it, so disaster strikes as we visit every node in the DOM node graph to set a price attribute! As you can see, C/C++ predicates can inspect the current XPath node by accessing variable `v`. This variable is either an `xsd__anyType` DOM element node or an `xsd__anyAttribute` DOM attribute node, depending on the path. Variable `v` is a reference in C++ and a pointer in C. Besides the current node `v` you can also access the XPath root node `dom`. Instead of the default root name `dom`, you can change `dom` to another name with domcpp option `-r`. You can also access `pos` which corresponds to the XPath `position()` value. You can access variables and functions in C/C++ predicates, but do not modify the variables `it` and `pos` which are internally used by the generated XPath query code. For example, you can access variable `pos` (but you should not change it): /(store/*[@isbn]/@price)[?pos > 1] This XPath query returns the price of books with an `isbn`, but after the first match was discarded by the predicate. Other temporary variables used internally are a pointer to an attribute `att` and a pointer to an element `elt`. You may set and use these as temporaries in the scope of a C/C++ predicate. The C/C++ predicates are quite powerful and can be used to filter values as shown earlier but also to select attributes and elements by matching their tag name using `v,match(tag)` in C++ and `soap_att_match(v, NULL, tag)` or `soap_elt_match(v, NULL, tag)` in C: //book/@*[?v.match(argv[1])] This assumes that the command-line argument (`argv[1]`) of the application is a book attribute name. Otherwise, no results are returned. After compiling the XPath query with domcpp -o test-dom.cpp -m -p'//book/@*[?v.match(argv[1])]' c++ -I../.. -o test-dom test-dom.cpp soapC.cpp ../../dom.cpp ../../stdsoap2.cpp we can obtain the book titles with: ./test-dom title < store.xml Finally, let's use the value of `argv` to filter products in the store by a given command-line argument price: domcpp -m -p'//@price[?(double)v < strtod(argv[1], NULL))]' and in C: domcpp -c -m -p'//@price[?soap_att_get_double(v) < strtod(argv[1], NULL))]' Note that the `strtod` function returns the double float value of `argv[1]` and is repeately called. A more efficient implementation would store the value in a temporary variable and use the temporary in the C/C++ predicate. Understanding XML namespaces {#ns} ============================ XML namespaces are commonly used with XML documents that are instances of XML schemas. A full introduction is beyond the scope of this document. We instroduce the basics here to help you understand why XML namespaces are important and how they are used in the C/C++ DOM API of gSOAP. XML namespace are important when XML documents contain instances of multiple XML schemas. XML elements and attributes that are declared in separate schemas should be distinguishable and their content should be verifyable. Tag name conflicts that may be caused by combining multiple XML schemas to define an XML document can be resolved by binding elements and attributes to specific XML namespaces. XML elements and attributes are bound to an XML namespace by using a namespace prefix in qualified tag names of elements and attributes. A qualified tag is of the form `prefix:name`, such that the prefix is bound in the scope of the tag to a namespace URI with an `xmlns:prefix="URI"` declaration. Unqualified tags can be bound to a namesapce with a `xmlns="URI"` default namespace declaration. An XML namespace is a Uniform Resource Identifier (URI). There are two general forms of URI: Uniform Resource Locators (URL) and Uniform Resource Names (URN). Consider for example the XML document with elements and attributes in three distinct XML namespaces `"urn:one"`, `"urn:two"`, and `"urn:three"`:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Element `e1` is bound to `"urn:one"`, `e2` and `e3` are bound to `"urn:three"`. Attribute `a1` has no namespace (it is in the null namespace), `a2` is bound to `"urn:two"` and `a3` is bound to `"urn:three"`. A namespace declaration (`xmlns`) scope extends to all descendants or until redeclared. The `x` and `y` prefixes declared in element `e1` have a scope of visibility in all elements, since `e1` is the root. The default namespace declaration in element `e2` has a scope of visibility in element `e2` and extends to all of its attributes and all of its child elements. An XML namespace may refer to the defining XML schema by a URL, but often they do not. The URI string itself should be sufficiently unique, which is important to distinguish XML elements and attributes in different XML namespaces. This is similar to C++ namespaces. A unique c++ namespace name suffices (we do not need to know where the source files are located). The DOM API aims to simplify XML document construction and XML analysis by offering an API that does not require full namespace URIs to passed to the API functions when the URIs are defined in a namespace table. You can simply use qualified tag names to construct XML documents in a DOM and to analyze a DOM after XML parsing. This approach works on the basis of internal normalization so that two prefixes match when their associated URI matches (i.e. prefix names may differ but still match when their URIs match). Assume we have the following namespace table of `{"prefix", "URI"}` bindings that includes the three namespace URIs used in our example XML document, but we pick three different prefixes `a`, `b`, and `c`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} 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}, {"a", "urn:one"}, {"b", "urn:two"}, {"c", "urn:three"}, {NULL, NULL, NULL, NULL} }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ With this table defined globally (or by using `soap_set_namespaces()` see next section), we can conveniently use qualified tag names with the prefixes `a`, `b`, and `c` to construct and/or match XML elements and attributes in these namespaces, because namespace matching is based on the URI of a prefix. Therefore, the following qualified tag names match the following elements and attributes in the example XML document: | Tag name | Matches | | -------- | ------------------------------------------------------- | | `"a:e1"` | element `` in namespace scope `xmlns:x="urn:one"` | | `"a1"` | attribute `a1` in the null namespace | | `"b:a2"` | attribute `y:a2` in namespace scope `xmlns:y="urn:two"` | | `"c:e2"` | element `` in namespace scope `xmlns="urn:three"` | | `"c:a3"` | attribute `a3` in namespace scope `xmlns="urn:three"` | | `"c:e3"` | element `e3` in namespace scope `xmlns="urn:three"` | The choice of prefixes `a`, `b`, and `c` is rather arbitrary. We can pick prefix names for the table as long as they are unique and are valid names (we refer to the XML syntax of "colonized names" and "non-colonized names"). The domcpp option `-n` includes XML namespaces in a namespace table in the auto-generated code by copying namespace bindings from the XML document analyzed by the tool to a namespace table. @note You can also use the wsdl2h tool to retrieve namespaces and declare your own prefix names in `typemap.dat`. The soapcpp2 tool generates the data binding implementation and a `.nsmap` file with the namespace bindings. You can still use the DOM API without a namespace table or with an incomplete table, but the namespace URIs that are left out from the table must be specified as additional `ns` parameters in the DOM API functions. C++ XML DOM API {#cpp} =============== XML is represented as a DOM node graph internally consisting of values (text strings of character data in UTF-8), attribute nodes with tag name and optional namespace URI, and element nodes with optional tag names and optional namespace URI. Tag names are stored in strings of UTF-8. Tag names can be qualified of the form `q:tag` or unqualified. An element tag name that is NULL represents a text-only node, which will only be present in mixed content of elements and text character data (as in XHTML markup). XML namespace handling is "smart" in the gSOAP DOM API: the DOM engine matches and stores XML with namespace URIs to ensure that a prefix qualifier is always locally bound to a namespace URI in the node graph. Furthermore, you can use qualified tags when constructing a DOM node instead of the full namespace URI, but only if the prefix and URI are defined in the namespace table (global `struct Namespace namesapces[]`. When working with wsdl2h and soapcpp2 you should include the soapcpp2-generated `.nsmap` file with namespace bindings that are applicable to your XML tags. List of C++ files {#cpp-files} ----------------- The following files located in the package under `gsoap` are required to use the C++ DOM API: - `stdsoap2.h`: gSOAP engine - `stdsoap2.cpp`: gSOAP engine - `dom.cpp`: DOM parser and DOM C/C++ API implementation - `import/dom.h`: DOM import for data bindings in a .h file for soapcpp2 (do not #include this file in your project builds). Use soapcpp2 `-Iimport` to specify import path when `dom.h` is imported in a header file for soapcpp2. The gSOAP header file `dom.h` declares the DOM for use in data bindings and should generally be imported with `#import` in gSOAP header files for the soapcpp2 tool. You can also run soapcpp2 directly on `import/dom.h` for DOM-only projects. This generates `soapStub.h`, `soapH.h` and `soapC.cpp`. To auto-generate these files, execute: soapcpp2 -CSL import/dom.h Then compile and link the `dom.cpp` files listed above with the auto-generated `soapC.cpp` and `stdsoap2.cpp`: c++ -I../.. -o myapp myapp.cpp soapC.cpp ../../dom.cpp ../../stdsoap2.cpp Instead of `stdsoap2.cpp` you can link `-lgsoap++.a` when installed by the gSOAP package. Or link `-lgsoapssl++.a` to get both `stdsoap2.cpp` and `dom.cpp` with OpenSSL enabled for HTTPS: c++ -DWITH_OPENSSL -I../.. -o myapp myapp.cpp soapC.cpp -lgsoapssl++ -lssl -lcrypto Note that we compile with `-DWITH_OPENSSL` and link `-lssl`, and `-lcrypto`. Because XML namespaces are required except for the most simple plain XML applications, you should include the generated `.nsmap` file: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" #include "soap.nsmap" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Or define your own namespace table. For example, at a minimum you want a table with SOAP and XSD bindings: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" 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}, {NULL, NULL, NULL, NULL} }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Then also add entries of the form `{"prefix", "URI"}` before the last NULL entry to complete the table with xmlns prefix and URI bindings for your XML project. C++ DOM API functions {#cpp-api} --------------------- This overview of the DOM API functions refers to the following types of parameters and values, which are used throughout this section: | Name | Type and value | | ------ | ----------------------------------------------------------------- | | `ctx` | `struct soap *ctx` context pointer (manages memory and IO) | | `ns` | `const char *ns` XML namespace URI string or NULL | | `tag` | `const char *tag` or `const wchar_t *tag` (un)qualified tag name | | `utag` | `const char *utag` or `const wchar_t *utag` unqualified tag name | | `qtag` | `const char *qtag` or `const wchar_t *qtag` qualified tag name | | `patt` | (wide) string (un)qualified tag name pattern with `*` wildcard(s) | | `text` | (wide) string | | `node` | `const void *node` pointer to serializable C/C++ data object | | `type` | `SOAP_TYPE_T` type identifier of serializable C/C++ data type T | | `att` | `xsd__anyAttribute att` DOM attribute node | | `elt` | `xsd__anyType elt` DOM element node | | `dom` | a DOM node (an element or an attribute node) | | `val` | bool, integer, float, or (wide) string | | `pos` | element position > 0 (XPath position numbering) | The API includes functions that take wide strings and normalizes these internally to UTF-8 encoded strings. However, when retrieving tags and text you will only be able to obtain UTF-8 strings. You can convert UTF-8 strings to wide strings that are managed by the context by using: - `int soap_s2wchar(soap *ctx, const char *s, wchar_t **t, long minlen, long maxlen)` Convert string `s` with UTF-8 content to a `wchar_t` string and set `t` to point to this string. If no length restrictions are enforced, pass -1 for `minlen` and `maxlen`. Returns `SOAP_OK` (zero) if heap allocation succeeded, or an error code. - `int soap_s2std__wstring(soap *ctx, const char *s, std::wstring *t, long minlen, long maxlen)` Convert string `s` with UTF-8 content to `std::wstring` pointed to by `t`. If no length restrictions are enforced, pass -1 for `minlen` and `maxlen`. Returns `SOAP_OK` (zero) if heap allocation succeeded, or an error code. ### Creating a DOM root element node {#cpp-api1} Creating a DOM node graph starts with creating the root element node using one of the `xsd__anyType` constructors: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // 8 ways to create a root element node 'dom' xsd__anyType dom(ctx); // unnamed element node managed by context xsd__anyType dom(elt); // copy constructor (shares context and data) xsd__anyType dom(ctx, utag); // element node xsd__anyType dom(ctx, qtag); // element node xsd__anyType dom(ctx, ns, utag); // element node xsd__anyType dom(ctx, ns, qtag); // element node xsd__anyType dom(ctx, ns, tag, text); // element node as above with a text value xsd__anyType dom(ctx, ns, tag, node, type); // element node as above with serializable object ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The third and fourth constructors omit the `ns` parameter, which is the same as passing a NULL `ns` parameter. The fourth constructor is convenient to use to construct an element node that is bound to an XML namespace by using a qualified tag name `qtag` without specifying the namespace URI with the `ns` parameter. To use this approach, you should define the namespace prefix in `qtag` in a global namespace table, see [Understanding XML namespaces](#ns), and as shown below: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // a global namespace table with {"prefix", "URI"} xmlns bindings struct Namespace namespaces[] = { ... {"q", "urn:example"}, {NULL, NULL, NULL, NULL} }; xsd__anyType dom(ctx, "q:tag"); // OK: "q" is in the namespace table xsd__anyType dom(ctx, "bad:tag"); // BAD: "bad" is not in the namespace table xsd__anyType dom(ctx, "urn:ok", "ok:tag"); // OK: "ok" is locally scoped in the DOM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can also use multiple namespace tables and select the one you want to use with the `soap_set_namespaces()` function: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // a local (static) namespace table with {"prefix", "URI"} xmlns bindings struct Namespace my_dom_namespaces[] = { ... {"q", "urn:example"}, {NULL, NULL, NULL, NULL} }; soap_set_namespaces(ctx, my_dom_namespaces); // use namespace table for qualified tags xsd__anyType dom(ctx, "q:tag"); // OK: "q" is in the namespace table ... soap_set_namespaces(ctx, namespaces); // restore to global table ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To set or change the tag of an element, use: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} dom.set(ns, utag); // element node dom.set(ns, qtag); // element node ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ### Assigning child nodes and values to a DOM node {#cpp-api2} After creating a root element node we can start populating the root with attributes, child elements, and values. To assign a value to a DOM attribute node or element node `dom`, we can use the the `xsd__anyType::set()` and `xsd__anyAttribute::set()` methods or use the assignment operator as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // 4 ways to assign a value to an element node or to an attribute node dom.set(val); // set text character data from bool, integer, float, string value dom = val; // same as above dom = att; // copy attribute node to attribute dom node (shallow, shares data) dom = elt; // copy element node to element dom node (shallow, shares data) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In addition, element nodes can be assigned serializable objects and data as values, meaning that the object and data will be serialized in place of the element content: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // two ways to assign serializable data to an element node 'dom' dom.set(node, type); // assign serializable C/C++ object or data to element node dom = node; // assign serializable C/C++ object (object class must have soap_type() method) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To learn more about embedding serializable objects and data in DOM node graphs, see [Embedding serializable objects and data in DOM element nodes](#intro-3). To add attributes to the element node `xsd__anyType dom` we use one of the `xsd__anyType::att()` methods as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // 4 ways to add an attribute to an element node 'dom' or extend an attribute list 'dom' dom.att(utag) = val; // add attribute utag="val" dom.att(qtag) = val; // add attribute q:tag="val" xmlns:q="ns" dom.att(ns, utag) = val; // add attribute _1:utag="val" xmlns:_1="ns" with temporary _1, _2, _3, ... dom.att(ns, qtag) = val; // add attribute q:tag="val" xmlns:q="ns" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To add child elements to the element node `xsd__anyType dom` we use one of the `xsd__anyType::elt()` methods and the bracket operator as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // 7 ways to add a child element to an element node 'dom' xsd__anyType& elt = dom.elt(); // add text-only child, unnamed (no tags) xsd__anyType& elt = dom.elt(utag); // add child element xsd__anyType& elt = dom[utag]; // same as above xsd__anyType& elt = dom.elt(qtag); // add child element xsd__anyType& elt = dom[qtag]; // same as above xsd__anyType& elt = dom.elt(ns, utag); // add child xsd__anyType& elt = dom.elt(ns, qtag); // add child ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given the `elt` reference to a child element of the `dom` node above, you can use this reference to build more complex node graphs by assigning attributes, child elements, and values at increasingly deeper levels of the tree. Because element nodes can have multiple children with the same tag name, essentially representing an array, you can use the bracket operator to index the child elements at their relative position among its siblings that have the same tag name. Position indexing starts at one (i.e. `[1]` XPath style) and child elements are added up to the highest position index used: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // add 'array' of three child elements to an element node 'dom' xsd__anyType& elt = dom[tag]; // add child (using one of the methods above) elt[1] = val; // assign val to first child element elt[3] = val; // add children at positions 2 and 3, assign val to the 3rd ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Note that `elt[1]` refers to `elt` itself, because indexing starts at 1 (as in XPath). Thus, position index `[1]` is optional to use. You can combine these operations and methods in various ways to create more complex DOM node graphs. Let's illustrate this with an example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); xsd__anyType dom(ctx, "menu"); dom.att("id") = 7; dom.att("key") = L"⌘F"; dom["popup"]["menuitem"][1].att("value") = "New"; dom["popup"]["menuitem"][1].att("onclick") = "CreateNewDoc()"; dom["popup"]["menuitem"][2].att("value") = "Open"; dom["popup"]["menuitem"][2].att("onclick") = "OpenDoc()"; dom["popup"]["menuitem"][3].att("value") = "Close"; dom["popup"]["menuitem"][3].att("onclick") = "CloseDoc()"; std::cout << dom; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ When executed, this code emits the following XML output on the terminal: The `xsd__anyAttribute` DOM attribute node constructors are identical to the `xsd__anyType` DOM element node constructors and can be used to create an attribute node or to create a list of attributes. As an alternative to creating attributes and elements in place, you can also construct attribute and element nodes and add them to other element nodes by using the `xsd__anyType::add()` method. For example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // add an attribute 'att' and an element node 'elt' to another element node 'dom' xsd__anyAttribute att(ctx, NULL, "id", "7"); // id attribute xsd__anyType elt(ctx, "popup"); // popup element dom.add(att).add(elt); // add id attribute and popup as child element ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To create a list of two attributes and add them to an element node `dom`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // add a list of attributes 'atts' to an element node 'dom' xsd__anyAttribute atts(ctx); atts.att("id") = 7; atts.att("key") = L"⌘F"; dom.adds(atts); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Finally, you can use domcpp to generate DOM construction code from a sample XML document. ### Matching and retrieving DOM node values and properties {#cpp-api3} Given a DOM node graph parsed from an XML document, we can match its tag names and use methods to retrieve values, attribuets, child elements, and properties. Given a DOM attribute node `xsd__anyAttribute dom` or element node `xsd__anyType dom`, you can use the following methods to match and retrieve the node's namespace and tag name: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} bool b = dom.match(patt); // true if tag matches pattern bool b = dom.match(ns, patt); // true if ns and tag match the patterns const char *s = dom.ns(); // namespace URI string or NULL if none const char *t = dom.tag(); // (un)qualified tag name string, NULL if unnamed ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given a DOM attribute node `xsd__anyAttribute dom` or element node `xsd__anyType dom`, the following methods can be used to retrieve the value of the node's character data content: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} bool b = dom.is_true(); // true if text is "true" or "1" bool b = dom.is_false(); // true if text is "false" or "0" LONG64 n = dom.get_int(); // 64 bit integer value of text, or 0 double x = dom.get_double(); // double float value of text, or NaN const char *t = dom.get_text(); // text string in UTF-8, or NULL if none ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can also cast an element or attribute node to a bool, an int, a double, or a string to obtain its value. For example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} int n = dom; // integer value cast from text in DOM node, or 0 const char *t = dom; // text string in UTF-8 of the DOM node, or NULL if none ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Element nodes may contain deserialized objects and data as values, which can be retrieved with one of two methods: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} T *node = (T*)dom.get_node(SOAP_TYPE_T); // get deserialized C/C++ object or data of type T, NULL if none int type = dom.get_type(&node); // get deserialized C/C++ object or data of any type, 0 if none ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To learn more about embedding serializable objects and data in DOM node graphs, see [Embedding serializable objects and data in DOM element nodes](#intro-3). Given a DOM element node `xsd__anyType dom`, one of the following methods can be used to retrieve an attribute by its unqualfied tag name (default namespace), by qualified tag name (assuming the prefix is defined in the namespace table), or by namespace and unqualified tag name: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} xsd__anyAttribute *att = dom.att_get(utag); // get attribute utag, NULL if none xsd__anyAttribute *att = dom.att_get(qtag); // get attribute q:tag xsd__anyAttribute *att = dom.att_get(ns, utag); // get attribute utag in namespace ns, NULL if none ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The second form is convenient to use to retrieve attributes in namespaces by using a qualified tag name `qtag` without having to specify the `ns` namespace URI parameter. This requires the namespace prefix used in `qtag` to be defined in the global namespace table. Given a DOM element node `xsd__anyType dom`, one of the following methods can be used to retrieve a child element by its unqualfied tag name (default namespace), by qualified tag name (assuming the prefix is defined in the namespace table), or by namespace and unqualified tag name: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} xsd__anyType *elt = dom.elt_get(); // get first text-only child element, NULL if none xsd__anyType *elt = dom.elt_get(utag); // get first child element , NULL if none xsd__anyType *elt = dom.elt_get(qtag); // get first child element , NULL if none xsd__anyType *elt = dom.elt_get(ns, utag); // get first child element , NULL if none elt = elt.get_next(); // get next matching child element, NULL if none elt = elt.get_nth(pos); // get matching child element at pos counting from 1, NULL if none ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The `get_next()` method can be used in loops to iterate over child elements with the same namespace and tag, as if traversing an array. For example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // iterate over child elements of element node 'dom' for (xsd__anyType *it = dom.elt_get("menuitem"); it; it = it->get_next()) ... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To obtain various properties of an `xsd__anyType dom` element node: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} xsd__anyType *elt = dom.parent(); // parent node, or NULL when root size_t n = dom.depth(); // depth from the root node (0 is root) size_t n = dom.len(); // number of siblings that have the same tag name size_t pos = dom.nth(); // node is at pos with the same tag name as some siblings, or 0 if alone ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The following invariants hold (assuming that pointer dereferences (`->`) are verified and valid): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} dom[tag].match(tag) == dom.elt(tag).match(tag) == true dom[tag].parent() == dom.elt(tag).parent() == dom dom[tag].tag() == dom.elt(tag).tag() == tag dom.elt(ns, tag).match(ns, tag) == dom dom.elt(ns, tag).parent() == dom dom.elt(ns, tag).ns() == ns dom.elt(ns, tag).tag() == tag dom.att(tag).match(tag) == true dom.att(ns, tag).match(ns, tag) == true dom.att(ns, tag).ns() == ns dom.att(ns, tag).tag() == tag dom.set(val) == val // by casting to bool, int, float, string dom.elt_get(tag)->parent() == dom dom.elt_get(tag)->depth() == dom.depth() + 1 dom.elt_get(tag)->nth() <= dom.elt_get(tag)->len() dom.elt_get(tag)->nth() == 0 if dom.elt_get(tag)->len() == 1 dom.elt_get(tag)->nth() == 1 if dom.elt_get(tag)->len() > 1 dom.elt_get(tag)->get_next()->nth() == 2 dom.elt_get(tag)->get_nth(pos)->nth() == pos ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ### Traversing a DOM node graph {#cpp-api4} Given a DOM node graph, we can traverse its attribute list and its child elements by using the iterators `xsd__anyAttribute::iterator` and `xsd__anyType::iterator`, respectively: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // print attribute tags for (xsd__anyAttribute::iterator it = dom.att_begin(); it != dom.att_end(); ++it) std::cout << "@" << it->tag() << std::endl; // print child element tags for (xsd__anyType::iterator it = dom.elt_begin(); it != dom.elt_end(); ++it) std::cout << "<" << it->tag() << ">" << std::endl; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can also traverse the entire node graph below a certain DOM element node `xsd__anyType dom` in depth-first order starting with the current `dom` node: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // print all element tags in depth-first order for (xsd__anyType::iterator it = dom.begin(); it != dom.end(); ++it) std::cout << "<" << it->tag() << "> at depth " << it->depth() << std::endl; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ### Searching a DOM node graph {#cpp-api5} Given a DOM node graph, we can search its attribute list and its child elements by using a pattern with wildcards `*` to match namespace and/or tag names, similar to XPath `*` pattern matching: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // print attribute tags that match *:id (* matches any namespace, including default) for (xsd__anyAttribute::iterator it = dom.att_find("*:id"); it != dom.att_end(); ++it) std::cout << "@" << it->tag() << std::endl; // print element tags in namespace "urn:one" (assuming "x" is "urn:one" in the namespace table) for (xsd__anyType::iterator it = dom.elt_find("x:*"); it != dom.elt_end(); ++it) std::cout << "<" << it->tag() << ">" << std::endl; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The above assumes that a namespace table is used that defines namespace `x`. Alternatively, you can specify namespace parameters that can be NULL or `"*"` to match any namespace URI (NULL can be used in place of a `"*"` pattern): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // print attribute tags that match *:id for (xsd__anyAttribute::iterator it = dom.att_find("*", "id"); it != dom.att_end(); ++it) std::cout << "@" << it->tag() << std::endl; // print element tags in namespace "urn:one" for (xsd__anyType::iterator it = dom.elt_find("urn:one", "*"); it != dom.elt_end(); ++it) std::cout << "<" << it->tag() << "<" << std::endl; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Patterns for namespaces and tags are not restricted to wildcards `*`. You can specify parts of a namespace URI or tag name and use one or more `*` to match the rest. You can also search the entire node graph below a certain DOM element node in depth-first order starting with the current node: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // find all element nodes with attribute "id" deep in the node graph for (xsd__anyType::iterator it = dom.find("@*:id"); it != dom.end(); ++it) std::cout << "element " << it->tag() << " has an @id=" << it->att_get("*:id")->get_text() << std::endl; // print all element tags in namespace "urn:one" for (xsd__anyType::iterator it = dom.find("urn:one", "*"); it != dom.end(); ++it) std::cout << "<" << it->tag() << ">" << std::endl; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ### XML DOM parsing and writing from/to streams {#cpp-api6} To parse XML from a stream into a DOM node graph you can use the `>>` operator on an input stream and a DOM element node: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // create new context and parse XML from 'cin' into 'dom' soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); xsd__anyType dom(ctx); std::cin >> dom; if (dom.soap->error) ... // check for IO end parse errors ... soap_destroy(ctx); soap_end(ctx); soap_free(ctx); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To write a DOM node graph in XML to a stream, you can use the `<<` operator on an output stream and a DOM element node: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // create new context and create a 'dom', write its XML to 'cout' soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); xsd__anyType dom(ctx, "store"); ... std::cout << dom << std::endl; if (dom.soap->error) ... // check for IO errors ... soap_destroy(ctx); soap_end(ctx); soap_free(ctx); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can also parse XML from a string into a DOM node graph by using a `std::istringstream` object: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // create new context and parse XML from a string into 'dom' soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); std::istringstream in; in.str(""); xsd__anyType dom(ctx); in >> dom; // parse XML into DOM if (dom.soap->error) ... // check for IO and parse errors ... soap_destroy(ctx); soap_end(ctx); soap_free(ctx); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Likewise, you can write a DOM node graph in XML to a string by using a `std::ostringstream` object: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // create new context and create a 'dom', write its XML to a string soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); std::ostringstream out; xsd__anyType dom(ctx, "store"); ... out << dom; // convert DOM to XML string in UTF-8 ... soap_destroy(ctx); soap_end(ctx); soap_free(ctx); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ It is also possible to send and receive XML over HTTP as REST operations as was illustrated in the introduction. To make REST HTTP POST, GET, OUT, and DELETE calls, use: - `int soap_dom_call(soap *ctx, const char *URL, const char *action, const xsd__anyType *in, xsd__anyType *out)` Make a POST, GET, PUT, DELETE call. Connect to endpoint `URL` with HTTP SOAPAction `action` (or NULL) and send request `in` to server and receive response `out`. Returns `SOAP_OK` (zero) or an error code. POST method: pass both `in` and `out`. GET method: pass a NULL to `in`. PUT method: pass a NULL to `out`. DELETE method: pass both NULL to `in` and `out`. This function is overloaded to accept references to the `in` and `out` parameters in C++. C XML DOM API {#c} ============= XML is represented as a DOM node graph internally consisting of values (text strings of character data in UTF-8), attribute nodes with tag name and optional namespace URI, and element nodes with optional tag names and optional namespace URI. Tag names are stored in strings of UTF-8. Tag names can be qualified of the form `q:tag` or unqualified. An element tag name that is NULL represents a text-only node, which will only be present in mixed content of elements and text character data (as in XHTML markup). XML namespace handling is "smart" in the gSOAP DOM API: the DOM engine matches and stores XML with namespace URIs to ensure that a prefix qualifier is always locally bound to a namespace URI in the node graph. Furthermore, you can use qualified tags when constructing a DOM node instead of the full namespace URI, but only if the prefix and URI are defined in the namespace table (global `struct Namespace namesapces[]`. When working with wsdl2h and soapcpp2 you should include the soapcpp2-generated `.nsmap` file with namespace bindings that are applicable to your XML tags. List of C files {#c-files} --------------- The following files located in the package under `gsoap` are required to use the C DOM API: - `stdsoap2.h`: gSOAP engine - `stdsoap2.c`: gSOAP engine - `dom.c`: DOM parser and DOM C/C++ API implementation - `import/dom.h`: DOM import for data bindings in a .h file for soapcpp2 (do not #include this file in your project builds) Use soapcpp2 `-Iimport` to specify import path when `dom.h` is imported in a header file for soapcpp2. The gSOAP header file `dom.h` declares the DOM for use in data bindings and should generally be imported with `#import` in gSOAP header files for the soapcpp2 tool. You can also run soapcpp2 directly on `import/dom.h` for DOM-only projects. This generates `soapStub.h`, `soapH.h` and `soapC.cpp`. To auto-generate these files, execute: soapcpp2 -c -CSL import/dom.h Then compile and link the `dom.c` files listed above with the auto-generated `soapC.c` and `stdsoap2.c`: cc -I../.. -o myapp myapp.c soapC.c ../../dom.c ../../stdsoap2.c Instead of `stdsoap2.c` you can link `-lgsoap.a` when installed by the gSOAP package. Or link `-lgsoapssl.a` to get both `stdsoap2.c` and `dom.c` with OpenSSL enabled for HTTPS: cc -DWITH_OPENSSL -I../.. -o myapp myapp.c soapC.c -lgsoapssl -lssl -lcrypto Note that we compile with `-DWITH_OPENSSL` and link `-lssl`, and `-lcrypto`. Because XML namespaces are required except for the most simple plain XML applications, you should include the generated `.nsmap` file: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" #include "soap.nsmap" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Or define your own namespace table. For example, at a minimum you want a table with SOAP and XSD bindings: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" 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}, {NULL, NULL, NULL, NULL} }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Then also add entries of the form `{"prefix", "URI"}` before the last NULL entry to complete the table with xmlns prefix and URI bindings for your XML project. C DOM API functions {#c-api} ------------------- This overview of the DOM API functions refers to the following types of parameters and values, which are used throughout this section: | Name | Type and value | | ------ | ----------------------------------------------------------------- | | `ctx` | `struct soap *ctx` context pointer (manages memory and IO) | | `ns` | `const char *ns` XML namespace URI string or NULL | | `tag` | `const char *tag` or `const wchar_t *tag` (un)qualified tag name | | `utag` | `const char *utag` or `const wchar_t *utag` unqualified tag name | | `qtag` | `const char *qtag` or `const wchar_t *qtag` qualified tag name | | `patt` | (wide) string (un)qualified tag name pattern with `*` wildcard(s) | | `text` | (wide) string | | `node` | `const void *node` pointer to serializable C/C++ data object | | `type` | `SOAP_TYPE_T` type identifier of serializable C/C++ data type T | | `att` | `xsd__anyAttribute *att` DOM attribute node pointer | | `elt` | `xsd__anyType *elt` DOM element node pointer | | `dom` | a DOM node (a pointer to an element or an attribute node) | | `val` | bool, integer, float, or (wide) string | | `pos` | element position > 0 (XPath position numbering) | The API includes functions that take wide strings and normalizes these internally to UTF-8 encoded strings. However, when retrieving tags and text you will only be able to obtain UTF-8 strings. You can convert UTF-8 strings to wide strings that are managed by the context by using: - `int soap_s2wchar(struct soap *ctx, const char *s, wchar_t **t, long minlen, long maxlen)` Convert string `s` with UTF-8 content to a `wchar_t` string and set `t` to point to this string. If no length restrictions are enforced, pass -1 for `minlen` and `maxlen`. Returns `SOAP_OK` (zero) if heap allocation succeeded, or an error code. ### Creating a DOM root element node {#c-api1} Creating a DOM node graph starts with creating the root element node using one of the `xsd__anyType` allocators: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // 4 ways to create a root element node pointer 'dom' xsd__anyType *dom = soap_elt_new(ctx, NULL, utag); // element node xsd__anyType *dom = soap_elt_new(ctx, NULL, qtag); // element node xsd__anyType *dom = soap_elt_new(ctx, ns, utag); // element node xsd__anyType *dom = soap_elt_new(ctx, ns, qtag); // element node ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For wide string tags, use `soap_elt_new_w(ctx, ns, tag)`. All C API functions that support wide strings end in `_w` by convention. The second function call in the list is convenient to use to construct an element node that is bound to an XML namespace by using a qualified tag name `qtag` while specifying the namespace URI as NULL. To use this approach, you should define the namespace prefix in `qtag` in a global namespace table, see [Understanding XML namespaces](#ns), and as shown below: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // a global namespace table with {"prefix", "URI"} xmlns bindings struct Namespace namespaces[] = { ... {"q", "urn:example"}, {NULL, NULL, NULL, NULL} }; xsd__anyType *dom = soap_elt_new(ctx, NULL, "q:tag"); // OK: "q" is in the namespace table xsd__anyType *dom = soap_elt_new(ctx, NULL, "bad:tag"); // BAD: "bad" is not in the namespace table xsd__anyType *dom = soap_elt_new(ctx, "urn:ok", "ok:tag"); // OK: "ok" is locally scoped in the DOM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can also use multiple namespace tables and select the one you want to use with the `soap_set_namespaces()` function: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // a local (static) namespace table with {"prefix", "URI"} xmlns bindings struct Namespace my_dom_namespaces[] = { ... {"q", "urn:example"}, {NULL, NULL, NULL, NULL} }; soap_set_namespaces(ctx, my_dom_namespaces); // use namespace table for qualified tags xsd__anyType *dom = soap_elt_new(ctx, NULL, "q:tag"); // OK: "q" is in the namespace table ... soap_set_namespaces(ctx, namespaces); // restore to global table ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To set or change the tag of an element, use: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} soap_elt_set(dom, ns, utag); // element node soap_elt_set(dom, ns, qtag); // element node ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ### Assigning child nodes and values to a DOM node {#c-api2} After creating a root element node we can start populating the root with attributes, child elements, and values. To assign a value to a DOM element node `dom` you can use one the the following functions: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // 6 ways to assign a value to an element node 'dom' soap_elt_bool(dom, val); // set text to boolean "false" or "true" soap_elt_int(dom, val); // set text to integer (64 bit) soap_elt_double(dom, val); // set text to (double) float soap_elt_text(dom, val); // set text with UTF-8 string content soap_elt_text_w(dom, val); // set text with wide string content soap_elt_copy(dom, elt); // copy element node to element dom node (shallow, shares data) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can use similar functions for DOM attribute nodes, altough you do not need these to populate DOM element nodes because it is easier to use the `soap_att()` function shown further below: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // 6 ways to assign a value to an attribute node 'dom' soap_att_bool(dom, val); // set text to boolean "false" or "true" soap_att_int(dom, val); // set text to integer (64 bit) soap_att_double(dom, val); // set text to (double) float soap_att_text(dom, val); // set text with UTF-8 string content soap_att_text_w(dom, val); // set text with wide string content soap_att_copy(dom, elt); // copy attribute node to attribute dom node (shallow, shares data) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In addition, element nodes can be assigned serializable objects and data as values, meaning that the object and data will be serialized in place of the element content: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // assign serializable data to an element node 'dom' soap_elt_node(dom, node, type); // assign serializable C data to element node ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To learn more about embedding serializable objects and data in DOM node graphs, see [Embedding serializable objects and data in DOM element nodes](#intro-3). To add attributes to an element node `dom` you can use one of the following functions (use `soap_att_w` for wide string tags): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // 4 ways to add an attribute to an element node 'dom' or extend an attribute list 'dom' xsd__anyAttribute *att = soap_att(dom, NULL, utag); // add attribute utag="val" xsd__anyAttribute *att = soap_att(dom, NULL, qtag); // add attribute q:tag="val" xmlns:q="ns" xsd__anyAttribute *att = soap_att(dom, ns, utag); // add attribute _1:utag="val" xmlns:_1="ns" with temporary _1, _2, _3, ... xsd__anyAttribute *att = soap_att(dom, ns, qtag); // add attribute q:tag="val" xmlns:q="ns" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can then set the value of the attribute `att` as was shown earlier. To add child elements to the element node `dom` we use one of the following functions (use `soap_elt_w` for wide string tags): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // 5 ways to add a child element to an element node 'dom' xsd__anyType *elt = soap_elt(dom, NULL, NULL); // add text-only child, unnamed (no tags) xsd__anyType *elt = soap_elt(dom, NULL, utag); // add child element xsd__anyType *elt = soap_elt(dom, NULL, qtag); // add child element xsd__anyType *elt = soap_elt(dom, ns, utag); // add child xsd__anyType *elt = soap_elt(dom, ns, qtag); // add child ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given the `elt` pointer to a child element node of the `dom` node, you can use the pointer to build more complex node graphs by assigning attributes, child elements, and values at increasingly deeper levels of the tree. Because element nodes can have multiple children with the same tag name, essentially representing an array, you can index the child elements at their relative position among its siblings that have the same tag name. Position indexing starts at one (i.e. XPath style) and child elements are added up to the highest position index used: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // add 'array' of three child elements to an element node 'dom' xsd__anyType *elt = soap_elt(dom, NULL, tag); // add child (using one of the functions above) soap_elt_int(soap_nth(elt, 1), val); // assign val to first child element soap_elt_int(soap_nth(elt, 3), val); // add children at positions 2 and 3, assign val to the 3rd ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The combination `soap_nth(soap_elt(dom, ns, tag), pos)` can be shortend to `soap_nth_elt(dom, ns, tag, pos)`. Note that `soap_nth(elt, 1)` refers to `elt` itself, because indexing starts at 1 (as in XPath). You can combine these operations in various ways to create more complex DOM node graphs. Let's illustrate this with an example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); xsd__anyType *dom = soap_elt_new(ctx, NULL, "menu"); soap_att_int(soap_att(dom, NULL, "id"), 7); soap_att_text_w(soap_att(dom, NULL, "value"), "⌘F"); { xsd__anyType *dom_popup = soap_elt(dom, NULL, "popup"); { xsd__anyType *dom_popup_menuitem = soap_nth_elt(dom_popup, NULL, "menuitem", 1); soap_att_text(soap_att(dom_popup_menuitem, NULL, "value"), "New"); soap_att_text(soap_att(dom_popup_menuitem, NULL, "onclick"), "CreateNewDoc()"); } { xsd__anyType *dom_popup_menuitem = soap_nth_elt(dom_popup, NULL, "menuitem", 2); soap_att_text(soap_att(dom_popup_menuitem, NULL, "value"), "Open"); soap_att_text(soap_att(dom_popup_menuitem, NULL, "onclick"), "OpenDoc()"); } { xsd__anyType *dom_popup_menuitem = soap_nth_elt(dom_popup, NULL, "menuitem", 3); soap_att_text(soap_att(dom_popup_menuitem, NULL, "value"), "Close"); soap_att_text(soap_att(dom_popup_menuitem, NULL, "onclick"), "CloseDoc()"); } } soap_write_xsd__anyType(ctx, dom); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ When executed, this code emits the following XML output on the terminal: The `xsd__anyAttribute` DOM attribute node allocation functions are identical to the `xsd__anyType` DOM element node allocation functions and can be used to create an attribute node or to create a list of attributes. As an alternative to creating attributes and elements in place, you can also construct attribute and element nodes and add them to other element nodes: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // add an attribute 'att' and an element node 'elt' to another element node 'dom' xsd__anyAttribute *att = soap_att_new(ctx, NULL, "id"); xsd__anyType *elt = soap_elt_new(ctx, NULL, "popup"); soap_att_int(att, 7); soap_add_att(dom, att); soap_add_elt(dom, elt); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To create a list of two attributes and add them to an element node `dom`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // add a list of attributes 'atts' to an element node 'dom' xsd__anyAttribute *atts = soap_att_new(ctx, NULL, NULL); soap_att_int(soap_att_add(atts, NULL, "id"), 7); soap_att_text_w(soap_att_add(atts, NULL, "key"), L"⌘F"); soap_add_atts(dom, atts); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Finally, you can use domcpp to generate DOM construction code from a sample XML document. ### Matching and retrieving DOM node values and properties {#c-api3} Given a DOM node graph parsed from an XML document, we can match its tag names and use functions to retrieve values, attribuets, child elements, and properties. Given a DOM element node `dom`, you can use the following functions to match and retrieve the node's namespace and tag name: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} int b = soap_elt_match(dom, NULL, patt); // true if tag matches pattern int b = soap_elt_match(dom, ns, patt); // true if ns and tag match the patterns const char *s = soap_elt_get_ns(dom)); // namespace URI string or NULL if none const char *t = soap_elt_get_tag(dom); // (un)qualified tag name string, NULL if unnamed ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Similar for attribute node `dom`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} int b = soap_att_match(dom, NULL, patt); // true if tag matches pattern int b = soap_att_match(dom, ns, patt); // true if ns and tag match the patterns const char *s = soap_att_get_ns(dom)); // namespace URI string or NULL if none const char *t = soap_att_get_tag(dom); // (un)qualified tag name string, NULL if unnamed ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given a DOM element node `dom`, the following functions can be used to retrieve the value of the node's character data content: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} int b = soap_elt_is_true(dom); // true if text is "true" or "1" int b = soap_elt_is_false(dom); // true if text is "false" or "0" LONG64 n = soap_elt_get_int(dom)); // 64 bit integer value of text, or 0 double x = soap_elt_get_double(dom); // double float value of text, or NaN const char *t = soap_elt_get_text(dom)); // text string in UTF-8, or NULL if none ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Similar for attribute node `dom`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} int b = soap_att_is_true(dom); // true if text is "true" or "1" int b = soap_att_is_false(dom); // true if text is "false" or "0" LONG64 n = soap_att_get_int(dom)); // 64 bit integer value of text, or 0 double x = soap_att_get_double(dom); // double float value of text, or NaN const char *t = soap_att_get_text(dom)); // text string in UTF-8, or NULL if none ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Element nodes may contain deserialized objects and data as values, which can be retrieved with one of two methods: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} T *node = (T*)soap_elt_get_node(dom, SOAP_TYPE_T); // get deserialized C data of type T, NULL if none int type = soap_elt_get_type(dom, &node); // get deserialized C data of any type, 0 if none ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To learn more about embedding serializable objects and data in DOM node graphs, see [Embedding serializable objects and data in DOM element nodes](#intro-3). Given a DOM element node `dom`, one of the following methods can be used to retrieve an attribute by its unqualfied tag name (has no namespace), by qualified tag name (assuming the prefix is defined in the namespace table), or by namespace and unqualified tag name: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} xsd__anyAttribute *att = soap_att_get(dom, NULL, utag); // get attribute utag, NULL if none xsd__anyAttribute *att = soap_att_get(dom, NULL, qtag); // get attribute q:tag xsd__anyAttribute *att = soap_att_get(dom, ns, utag); // get attribute utag in namespace ns, NULL if none ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The second form is convenient to use to retrieve attributes in namespaces by using a qualified tag name `qtag` without having to specify the `ns` namespace URI parameter. This requires the namespace prefix used in `qtag` to be defined in the global namespace table. Given a DOM element node `dom`, one of the following functions can be used to retrieve a child element by its unqualfied tag name (has no namespace), by qualified tag name (assuming the prefix is defined in the namespace table), or by namespace and unqualified tag name: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} xsd__anyType *elt = soap_elt_get(dom, NULL, NULL); // get first text-only child element, NULL if none xsd__anyType *elt = soap_elt_get(dom, NULL, utag); // get first child element , NULL if none xsd__anyType *elt = soap_elt_get(dom, NULL, qtag); // get first child element , NULL if none xsd__anyType *elt = soap_elt_get(dom, ns, utag); // get first child element , NULL if none elt = soap_elt_get_next(elt); // get next matching child element, NULL if none elt = soap_elt_get_nth(elt, pos); // get matching child element at pos counting from 1, NULL if none ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The `soap_elt_get_next(elt)` function can be used in loops to iterate over child elements with the same namespace and tag, as if traversing an array. For example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // iterate over child elements of element node 'dom' xsd__anyType *it; for (it = soap_elt_get(dom, NULL, "menuitem"); it; it = soap_elt_get_next(it)) ... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To obtain various properties of a `dom` element node: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} xsd__anyType *elt = soap_elt_parent(dom); // parent node, or NULL when root size_t n = soap_elt_depth(dom); // depth from the root node (0 is root) size_t n = soap_elt_len(dom); // number of siblings that have the same tag name size_t pos = soap_elt_nth(dom); // node is at pos with the same tag name as some siblings, or 0 if alone ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The following invariants hold (assuming that `soap_elt_get(dom, ns, tag)` is not NULL and thus `dom` has a child element that matches namespace `ns` and `tag`): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} soap_elt_match(soap_elt(dom, NULL, tag), NULL, tag) == true (nonzero) soap_elt_parent(soap_elt(dom, NULL, tag)) == dom soap_elt_get_tag(soap_elt(dom, NULL, tag)) == tag soap_elt_match(soap_elt(dom, ns, tag), ns, tag) == true (nonzero) soap_elt_parent(soap_elt(dom, ns, tag)) == dom soap_elt_get_ns(soap_elt(dom, ns, tag)) == ns soap_elt_get_tag(soap_elt(dom, ns, tag)) == tag soap_att_match(soap_att(dom, ns, tag), ns, tag) == true (nonzero) soap_att_get_ns(soap_att(dom, ns, tag)) == ns soap_att_get_tag(soap_att(dom, ns, tag)) == tag soap_elt_get_int(soap_elt_int(dom, val)) == val // also holds for bool, double, string soap_att_get_int(soap_att_int(dom, val)) == val // also holds for bool, double, string soap_elt_parent(soap_elt_get(dom, ns, tag)) == dom soap_elt_depth(soap_elt_get(dom, ns, tag)) == soap_elt_depth(dom) + 1 soap_elt_nth(soap_elt_get(dom, ns, tag)) <= soap_elt_len(soap_elt_get(dom, ns, tag)) soap_elt_nth(soap_elt_get(dom, ns, tag)) == 0 if soap_elt_len(soap_elt_get(dom, ns, tag)) == 1 soap_elt_nth(soap_elt_get(dom, ns, tag)) == 1 if soap_elt_len(soap_elt_get(dom, ns, tag)) > 1 soap_elt_nth(soap_elt_get_next(soap_elt_get(dom, ns, tag))) == 2 soap_elt_nth(soap_elt_get_nth(soap_elt_get(dom, ns, tag), pos)) == pos ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ### Traversing a DOM node graph {#c-api4} Given a DOM node graph `dom`, we can traverse its attribute list `xsd__anyType::atts` and its child elements `xsd__anyType::elts` as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // print attribute tags xsd__anyAttribute *it; for (it = dom->atts; it; it = it->next) printf("@%s\n", soap_att_get_tag(it)); // print child element tags xsd__anyType *it; for (it = dom->elts; it; it = it->next) printf("<%s>\n", soap_elt_get_tag(it)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can also traverse the entire node graph below a certain DOM element node `dom` in depth-first order starting with the current `dom` and stepping through all element nodes with `soap_dom_next_element(elt, end)` where `end` is a pointer to the ending element node (exclusive), usually the starting node of the graph traversal: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // print all element tags in depth-first order xsd__anyType *it; for (it = dom; it; it = soap_dom_next_element(it, dom)) printf("<%s> at depth %zd\n", soap_elt_get_tag(it), soap_elt_depth(it)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ### Searching a DOM node graph {#c-api5} Given a DOM node graph, we can search its attribute list and its child elements by using a pattern with wildcards `*` to match namespace and/or tag names, similar to XPath `*` pattern matching: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // print attribute tags that match *:id (* matches any namespace, including default) xsd__anyAttribute *it; for (it = soap_att_find(dom, NULL, "*:id"); it; it = soap_att_find_next(it, NULL, "*:id")) printf("@%s\n", soap_att_get_tag(it)); // print element tags in namespace "urn:one" (assuming "x" is "urn:one" in the namespace table) xsd__anyType *it; for (it = soap_elt_find(dom, NULL, "x:*"); it; it = soap_elt_find_next(it, NULL, "x:*")) printf("<%s>\n", soap_elt_get_tag(it)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The above assumes that a namespace table is used that defines namespace `x`. Alternatively, you can specify namespace parameters that can be NULL or `"*"` to match any namespace URI (NULL can be used in place of a `"*"` pattern): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // print attribute tags that match *:id xsd__anyAttribute *it; for (it = soap_att_find(dom, "*", "id"); it; it = soap_att_find_next(it, "*", "id")) printf("@%s\n", soap_att_get_tag(it)); // print element tags in namespace "urn:one" xsd__anyType *it; for (it = soap_elt_find(dom, "urn:one", "*"); it; it = soap_elt_find_next(it, "urn:one", "*")) printf("<%s>\n", soap_elt_get_tag(it)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Patterns for namespaces and tags are not restricted to wildcards `*`. You can specify parts of a namespace URI or tag name and use one or more `*` to match the rest. You can also search the entire node graph below a certain DOM element node in depth-first order starting with the current node: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // find all element nodes with attribute "id" deep in the node graph xsd__anyType *it; for (it = soap_dom_find(dom, NULL, "@*:id"); it; it = soap_dom_find_next(it, dom, NULL, "@*:id") printf("element <%s> has an @id=%s\n", soap_elt_get_tag(it), soap_att_get_text(soap_att_find(it, NULL, "*:id"))); // print all element tags in namespace "urn:one" xsd__anyType *it; for (it = soap_dom_find(dom, "urn:one", "*"); it; it = soap_dom_find_next(it, dom, "urn:one", "*")) printf("<%s>\n", soap_elt_get_tag(it)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ### XML DOM parsing and writing from/to streams {#c-api6} Reading and writing XML from/to files, streams and string buffers is done via the managing context by setting one of the following context members that control IO sources and sinks: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} ctx->recvfd = fd; // an int file descriptor to read from (0 by default) ctx->sendfd = fd; // an int file descriptor to write to (1 by default) ctx->is = cs; // C only: a const char* string to read from (soap->is will advance) ctx->os = &cs; // C only: pointer to a const char*, will be set to point to the string output ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To parse XML from a file descriptor `ctx->recvfd` into a DOM node graph you can use to soapcpp2 auto-generated `soap_read_xsd__anyType(ctx, dom)` function: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // create new context and parse XML from 'cin' into 'dom' struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); xsd__anyType *dom = soap_elt_new(ctx, NULL, NULL); ctx->recvfd = stdin; if (soap_read_xsd__anyType(ctx, dom)) ... // check for IO end parse errors ... soap_end(ctx); soap_free(ctx); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To write a DOM node graph in XML to a file descriptor `ctx->sendfd` you can use the soapcpp2 auto-generated `soap_write_xsd__anyType(ctx, dom)` function: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // create new context and create a 'dom', write its XML to 'cout' struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); xsd__anyType *dom = soap_elt_new(ctx, NULL, "store"); ... ctx->sendfd = stdout; if (soap_write_xsd__anyType(ctx, dom)) ... // check for IO errors ... soap_end(ctx); soap_free(ctx); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can also parse XML from a string into a DOM node graph by using the `ctx->is` input string and the soapcpp2 auto-generated `soap_read_xsd__anyType(ctx, dom)` function: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // create new context and parse XML from a string into 'dom' struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); const char *in = ""; xsd__anyType *dom = soap_elt_new(ctx, NULL, NULL); ctx->is = in; if (soap_read_xsd__anyType(ctx, dom)) ... // check for IO end parse errors ctx->is = NULL; ... soap_end(ctx); soap_free(ctx); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Likewise, you can write a DOM node graph in XML to a string by using the `ctx->os` output string pointer and the soapcpp2 auto-generated `soap_write_xsd__anyType(ctx, dom)` function: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} // create new context and create a 'dom', write its XML to a string struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); const char *out = NULL; xsd__anyType *dom = soap_elt_new(ctx, NULL, "store"); ... ctx->os = &out; // string to set to point to the output soap_write_xsd__anyType(ctx, dom); // convert DOM to XML string in UTF-8 ctx->os = NULL; printf("%s\n", out); ... soap_end(ctx); soap_free(ctx); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The `soap_read_xsd__anyType(ctx, dom)` and `soap_write_xsd__anyType(ctx, dom)` functions return `SOAP_OK` (zero) or an error code in `ctx->error`. It is also possible to send and receive XML over HTTP as REST operations as was illustrated in the introduction. To make REST HTTP POST, GET, OUT, and DELETE calls, use: - `int soap_dom_call(struct soap *ctx, const char *URL, const char *action, const xsd__anyType *in, xsd__anyType *out)` Make a POST, GET, PUT, DELETE call. Connect to endpoint `URL` with HTTP SOAPAction `action` (or NULL) and send request `in` to server and receive response `out`. Returns `SOAP_OK` (zero) or an error code. POST method: pass both `in` and `out`. GET method: pass a NULL to `in`. PUT method: pass a NULL to `out`. DELETE method: pass both NULL to `in` and `out`. XML DOM parsing and display options {#opt} =================================== The soap context flags that control XML parsing and visual display are set when the context is created or with the `soap_set_mode` and `soap_clr_mode` functions: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_DOM_TREE); soap_set_mode(ctx, SOAP_XML_INDENT); // use indent soap_clr_mode(ctx, SOAP_XML_INDENT); // no indent ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Options to control XML parsing, object serialization, and XML rendition are: - (no flag): only elements with an `id` attribute are deserialized as C/C++ data types when a deserializer is available. This is to ensure that the SOAP encoding protocol deos not break when id-ref attibutes are used for multireferenced objects. - `SOAP_DOM_TREE`: prevents deserialization of C/C++ data structures into the DOM even when an `id` attribute is present. - `SOAP_DOM_NODE`: deserialize C/C++ data structures into the DOM. A deserializer is selected based on matching the element tag name or the xsi:type attribute value with the C/C++ type name. - `SOAP_DOM_ASIS`: render XML "as is", i.e. do not insert xmlns bindings for URIs internally stored with nodes. Assumes that the DOM is self-contained with respect to namespaces. - `SOAP_XML_INDENT`: render XML with indent. - `SOAP_XML_CANONICAL`: render XML in canonical (exc-c14n) form. - `SOAP_C_UTFSTRING`: the XML DOM always uses UTF-8, but embedded serializable objects only use UTF-8 when this flag is also set. Using DOM together with serializeble types in a gSOAP header file {#dom} ================================================================= To use DOM nodes with types declared in a gSOAP header file, import `dom.h` into your header file for processing with soapcpp2: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #import "dom.h" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The import is automatically added by wsdl2h with option `-d`. The wsdl2h tool binds xsd:anyType, xsd:any, xsd:anyAttribute and xsd:mixed XML content to DOM nodes instead of using XML literal strings. The `#import "dom.h"` enables us use the DOM `xsd__anyType` element node and `xsd__anyAttribute` attribute node in a gSOAP header file type declarations, such as: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #import "dom.h" class ns__record { public: @xsd__anyAttribute atts; // list of DOM attributes ... xsd__anyType __any; // xsd:any, consumes all other XML }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ where `__any` contains XML stored in a DOM node set and `atts` is a list of all visibly rendered attributes. The name `atts` is arbitrary and any name will suffice. We should place the `xsd__anyType` members at the end of the struct or class. This ensures that the DOM members are populated last as a "catch all". A member name starting with double underscore is a wildcard member name and matches any XML tag. These members are placed at the end of a struct or class automatically by soapcpp2. The soapcpp2 tool generates code that "serializes" the DOM nodes as part of the serialization of the C/C++ types in which they are used. @see Documentation of [XML Data Bindings: DOM anyType and anyAttribute](http://www.genivia.com/doc/databinding/html/index.html#toxsd10-5). Example {#example} ======= This example demonstrates the domcpp tool to generate code for a SOAP request message to send to a calculator service and to generate code to obtain the floating point value from the SOAP response returned. The generated code is copied and modified to create a DOM-based SOAP client application in C++ `dom2calc.cpp`. We use a very simple calculator service to demonstrate the C++ DOM API to populate a DOM node graph and to query a DOM node graph. The codes to accomplish both of these tasks can be generated with domcpp and modified as needed for our purposes. The SOAP calculator service and client on which this example is based are located in `gsoap/samples/calc` (for C) and `gsoap/samples/calc++` (for C++) in the gSOAP package. We use the SOAP calculator sample SOAP message `calc.add.req.xml` generated by soapcpp2 in `gsoap/samples/calc++`. This XML message contains a SOAP request to add two floating point values:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 0.0 0.0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
To generate code that populates this SOAP request message as a DOM node graph, we invoke: domcpp -M -n -rrequest calc.add.req.xml We copied the generated code into `dom2calc.cpp` as shown further below. A sample SOAP response message `calc.add.res.xml` from the calculator service is:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 0.0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
We want to generate code that inspects the SOAP response message to extract the value of ``. For this purpose we can use the XPath query `/SOAP-ENV:Envelope/SOAP-ENV:Body/ns:addResponse/result` and use this XPath with domcpp option `-p` and option `-x` to generate code that prints the `` value: domcpp -p'/SOAP-ENV:Envelope/SOAP-ENV:Body/ns:addResponse/result' \ -rresponse -x'std::cout << "Result = " << v << std::endl;' We copied the generated code into `dom2calc.cpp` as shown below: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" const char server[] = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; // copied from: // domcpp -M -n -rrequest calc.add.req.xml 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}, {"ns", "urn:calc", NULL, NULL }, {NULL, NULL, NULL, NULL} }; int main(int argc, char **argv) { struct soap *ctx = soap_new1(SOAP_DOM_TREE | SOAP_XML_INDENT); if (argc <= 3) { std::cerr << "Usage: dom2calc [add|sub|mul|div|pow] " << std::endl; exit(1); } // create command tag ns:add, ns:sub, ns:mul, ns:div, or ns:pow std::string command = std::string("ns:").append(argv[1]); // copied and modified from: // domcpp -M -n -rrequest calc.add.req.xml xsd__anyType request(ctx, "SOAP-ENV:Envelope"); request["SOAP-ENV:Body"].att("SOAP-ENV:encodingStyle") = "http://schemas.xmlsoap.org/soap/encoding/"; request["SOAP-ENV:Body"][command.c_str()]["a"] = strtod(argv[2], NULL); request["SOAP-ENV:Body"][command.c_str()]["b"] = strtod(argv[3], NULL); std::cout << "** Request message: " << std::endl << request << std::endl << std::endl; // create response xsd__anyType response(ctx); // invoke server: make POST XML request and receive XML response if (soap_dom_call(ctx, server, "", request, response)) { soap_stream_fault(ctx, std::cerr); } else { std::cout << "** Response message:" << std::endl << response << std::endl << std::endl; // copied from: // domcpp -p'/SOAP-ENV:Envelope/SOAP-ENV:Body/ns:addResponse/result' -rresponse -x'std::cout << "Result = " << v << std::endl;' if (response.match("SOAP-ENV:Envelope")) { size_t pos = 1; for (xsd__anyType *it = response.elt_get("SOAP-ENV:Body"); it; it = it->get_next(), ++pos) { xsd__anyType& v = *it; size_t pos = 1; for (xsd__anyType *it = v.elt_get("ns:addResponse"); it; it = it->get_next(), ++pos) { xsd__anyType& v = *it; size_t pos = 1; for (xsd__anyType *it = v.elt_get("result"); it; it = it->get_next(), ++pos) { xsd__anyType& v = *it; std::cout << "Result = " << v.get_double() << std::endl; } } } } } soap_destroy(ctx); // delete objects soap_end(ctx); // delete temp data soap_free(ctx); // free context return 0; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To compile `dom2calc.cpp` we first generate `soapC.cpp`, `soapStub.h` and `soapH.h` from the gSOAP header file `dom.h`: soapcpp2 dom.h c++ -o dom2calc dom2calc.cpp soapC.cpp dom.cpp stdsoap2.cpp Running the DOM-based calculator client gives: ./dom2calc add 3 4 ** Request message: 3 4 ** Response message: 7 Result = 7 Another way to extract the floating point value from the SOAP response is to use the `xsd__anyType::find()` method to search (and iterate) over `` elements: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} for (xsd__anyType::iterator it = response.find("result"); it != response.end(); ++it) std::cout << std::endl << "Result = " << it->get_double() << std::endl; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ where the `xsd__anyType::get_double()` method is used to cast the XML value to a `double`. Miscellaneous {#misc} ============= Floating point format {#fp} --------------------- The floating point format used to output values in XML-RPC and JSON is by default ".17lG' to ensure accuracy up to the last digit. The format can be set as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); ctx->double_format = "%lG"; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Copyright {#copyright} ========= Copyright (c) 2017, Robert van Engelen, Genivia Inc. All rights reserved. gsoap-2.8.91/gsoap/samples/dom/.deps/0000755000175000017500000000000013525245174016641 5ustar ellertellertgsoap-2.8.91/gsoap/samples/dom/.deps/dom.Po0000644000175000017500000002717713525245162017733 0ustar ellertellertdom.o dom.o: ../../dom.cpp ../../stdsoap2.h ../../../config.h \ /usr/include/stdlib.h /usr/include/Availability.h \ /usr/include/AvailabilityInternal.h /usr/include/_types.h \ /usr/include/sys/_types.h /usr/include/sys/cdefs.h \ /usr/include/machine/_types.h /usr/include/i386/_types.h \ /usr/include/sys/wait.h /usr/include/sys/signal.h \ /usr/include/sys/appleapiopts.h /usr/include/machine/signal.h \ /usr/include/i386/signal.h /usr/include/i386/_structs.h \ /usr/include/sys/_structs.h /usr/include/machine/_structs.h \ /usr/include/mach/i386/_structs.h /usr/include/sys/resource.h \ /usr/include/machine/endian.h /usr/include/i386/endian.h \ /usr/include/sys/_endian.h /usr/include/libkern/_OSByteOrder.h \ /usr/include/libkern/i386/_OSByteOrder.h /usr/include/alloca.h \ /usr/include/machine/types.h /usr/include/i386/types.h \ /usr/include/i386/_types.h /usr/include/stdio.h /usr/include/string.h \ /usr/include/ctype.h /usr/include/runetype.h \ /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/limits.h \ /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/syslimits.h \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/i386/limits.h /usr/include/i386/_limits.h \ /usr/include/sys/syslimits.h /usr/include/poll.h \ /usr/include/sys/poll.h /usr/include/c++/4.2.1/string \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++config.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/os_defines.h \ /usr/include/unistd.h /usr/include/sys/unistd.h \ /usr/include/sys/select.h /usr/include/sys/_select.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/cpu_defines.h \ /usr/include/c++/4.2.1/bits/stringfwd.h \ /usr/include/c++/4.2.1/bits/char_traits.h \ /usr/include/c++/4.2.1/cstring /usr/include/c++/4.2.1/cstddef \ /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/stddef.h \ /usr/include/c++/4.2.1/bits/stl_algobase.h \ /usr/include/c++/4.2.1/climits /usr/include/c++/4.2.1/cstdlib \ /usr/include/c++/4.2.1/iosfwd \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++locale.h \ /usr/include/c++/4.2.1/clocale /usr/include/locale.h \ /usr/include/_locale.h /usr/include/c++/4.2.1/cstdio \ /usr/include/c++/4.2.1/cstdarg \ /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/stdarg.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++io.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/gthr.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/gthr-default.h \ /usr/include/pthread.h /usr/include/pthread_impl.h /usr/include/sched.h \ /usr/include/time.h /usr/include/_structs.h \ /usr/include/c++/4.2.1/cctype /usr/include/c++/4.2.1/bits/postypes.h \ /usr/include/c++/4.2.1/cwchar /usr/include/c++/4.2.1/ctime \ /usr/include/wchar.h /usr/include/_wctype.h \ /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/stdint.h \ /usr/include/c++/4.2.1/bits/functexcept.h \ /usr/include/c++/4.2.1/exception_defines.h \ /usr/include/c++/4.2.1/bits/stl_pair.h \ /usr/include/c++/4.2.1/bits/cpp_type_traits.h \ /usr/include/c++/4.2.1/ext/type_traits.h /usr/include/c++/4.2.1/utility \ /usr/include/c++/4.2.1/bits/stl_relops.h \ /usr/include/c++/4.2.1/bits/stl_iterator_base_types.h \ /usr/include/c++/4.2.1/bits/stl_iterator_base_funcs.h \ /usr/include/c++/4.2.1/bits/concept_check.h \ /usr/include/c++/4.2.1/bits/stl_iterator.h \ /usr/include/c++/4.2.1/debug/debug.h /usr/include/c++/4.2.1/memory \ /usr/include/c++/4.2.1/bits/allocator.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++allocator.h \ /usr/include/c++/4.2.1/ext/new_allocator.h /usr/include/c++/4.2.1/new \ /usr/include/c++/4.2.1/exception \ /usr/include/c++/4.2.1/bits/stl_construct.h \ /usr/include/c++/4.2.1/bits/stl_uninitialized.h \ /usr/include/c++/4.2.1/bits/stl_raw_storage_iter.h \ /usr/include/c++/4.2.1/limits \ /usr/include/c++/4.2.1/bits/ostream_insert.h \ /usr/include/c++/4.2.1/bits/stl_function.h \ /usr/include/c++/4.2.1/bits/basic_string.h \ /usr/include/c++/4.2.1/ext/atomicity.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/atomic_word.h \ /usr/include/c++/4.2.1/algorithm /usr/include/c++/4.2.1/bits/stl_algo.h \ /usr/include/c++/4.2.1/bits/stl_heap.h \ /usr/include/c++/4.2.1/bits/stl_tempbuf.h \ /usr/include/c++/4.2.1/bits/basic_string.tcc \ /usr/include/c++/4.2.1/iostream /usr/include/c++/4.2.1/ostream \ /usr/include/c++/4.2.1/ios /usr/include/c++/4.2.1/bits/localefwd.h \ /usr/include/c++/4.2.1/bits/ios_base.h \ /usr/include/c++/4.2.1/bits/locale_classes.h \ /usr/include/c++/4.2.1/streambuf \ /usr/include/c++/4.2.1/bits/streambuf.tcc \ /usr/include/c++/4.2.1/bits/basic_ios.h \ /usr/include/c++/4.2.1/bits/streambuf_iterator.h \ /usr/include/c++/4.2.1/bits/locale_facets.h \ /usr/include/c++/4.2.1/cwctype /usr/include/wctype.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/ctype_base.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/ctype_inline.h \ /usr/include/c++/4.2.1/bits/codecvt.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/time_members.h \ /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/messages_members.h \ /usr/include/c++/4.2.1/bits/basic_ios.tcc \ /usr/include/c++/4.2.1/bits/ostream.tcc /usr/include/c++/4.2.1/locale \ /usr/include/c++/4.2.1/bits/locale_facets.tcc \ /usr/include/c++/4.2.1/typeinfo /usr/include/c++/4.2.1/istream \ /usr/include/c++/4.2.1/bits/istream.tcc /usr/include/errno.h \ /usr/include/sys/errno.h /usr/include/sys/types.h \ /usr/include/sys/timeb.h /usr/include/sys/socket.h \ /usr/include/machine/_param.h /usr/include/i386/_param.h \ /usr/include/strings.h /usr/include/sys/time.h \ /usr/include/netinet/in.h /usr/include/netinet6/in6.h \ /usr/include/netinet/tcp.h /usr/include/arpa/inet.h \ /usr/include/netdb.h /usr/include/fcntl.h /usr/include/sys/fcntl.h \ /usr/include/math.h /usr/include/architecture/i386/math.h \ /usr/include/AvailabilityMacros.h ../../stdsoap2.h: ../../../config.h: /usr/include/stdlib.h: /usr/include/Availability.h: /usr/include/AvailabilityInternal.h: /usr/include/_types.h: /usr/include/sys/_types.h: /usr/include/sys/cdefs.h: /usr/include/machine/_types.h: /usr/include/i386/_types.h: /usr/include/sys/wait.h: /usr/include/sys/signal.h: /usr/include/sys/appleapiopts.h: /usr/include/machine/signal.h: /usr/include/i386/signal.h: /usr/include/i386/_structs.h: /usr/include/sys/_structs.h: /usr/include/machine/_structs.h: /usr/include/mach/i386/_structs.h: /usr/include/sys/resource.h: /usr/include/machine/endian.h: /usr/include/i386/endian.h: /usr/include/sys/_endian.h: /usr/include/libkern/_OSByteOrder.h: /usr/include/libkern/i386/_OSByteOrder.h: /usr/include/alloca.h: /usr/include/machine/types.h: /usr/include/i386/types.h: /usr/include/i386/_types.h: /usr/include/stdio.h: /usr/include/string.h: /usr/include/ctype.h: /usr/include/runetype.h: /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/limits.h: /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/syslimits.h: /usr/include/limits.h: /usr/include/machine/limits.h: /usr/include/i386/limits.h: /usr/include/i386/_limits.h: /usr/include/sys/syslimits.h: /usr/include/poll.h: /usr/include/sys/poll.h: /usr/include/c++/4.2.1/string: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++config.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/os_defines.h: /usr/include/unistd.h: /usr/include/sys/unistd.h: /usr/include/sys/select.h: /usr/include/sys/_select.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/cpu_defines.h: /usr/include/c++/4.2.1/bits/stringfwd.h: /usr/include/c++/4.2.1/bits/char_traits.h: /usr/include/c++/4.2.1/cstring: /usr/include/c++/4.2.1/cstddef: /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/stddef.h: /usr/include/c++/4.2.1/bits/stl_algobase.h: /usr/include/c++/4.2.1/climits: /usr/include/c++/4.2.1/cstdlib: /usr/include/c++/4.2.1/iosfwd: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++locale.h: /usr/include/c++/4.2.1/clocale: /usr/include/locale.h: /usr/include/_locale.h: /usr/include/c++/4.2.1/cstdio: /usr/include/c++/4.2.1/cstdarg: /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/stdarg.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++io.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/gthr.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/gthr-default.h: /usr/include/pthread.h: /usr/include/pthread_impl.h: /usr/include/sched.h: /usr/include/time.h: /usr/include/_structs.h: /usr/include/c++/4.2.1/cctype: /usr/include/c++/4.2.1/bits/postypes.h: /usr/include/c++/4.2.1/cwchar: /usr/include/c++/4.2.1/ctime: /usr/include/wchar.h: /usr/include/_wctype.h: /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/stdint.h: /usr/include/c++/4.2.1/bits/functexcept.h: /usr/include/c++/4.2.1/exception_defines.h: /usr/include/c++/4.2.1/bits/stl_pair.h: /usr/include/c++/4.2.1/bits/cpp_type_traits.h: /usr/include/c++/4.2.1/ext/type_traits.h: /usr/include/c++/4.2.1/utility: /usr/include/c++/4.2.1/bits/stl_relops.h: /usr/include/c++/4.2.1/bits/stl_iterator_base_types.h: /usr/include/c++/4.2.1/bits/stl_iterator_base_funcs.h: /usr/include/c++/4.2.1/bits/concept_check.h: /usr/include/c++/4.2.1/bits/stl_iterator.h: /usr/include/c++/4.2.1/debug/debug.h: /usr/include/c++/4.2.1/memory: /usr/include/c++/4.2.1/bits/allocator.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/c++allocator.h: /usr/include/c++/4.2.1/ext/new_allocator.h: /usr/include/c++/4.2.1/new: /usr/include/c++/4.2.1/exception: /usr/include/c++/4.2.1/bits/stl_construct.h: /usr/include/c++/4.2.1/bits/stl_uninitialized.h: /usr/include/c++/4.2.1/bits/stl_raw_storage_iter.h: /usr/include/c++/4.2.1/limits: /usr/include/c++/4.2.1/bits/ostream_insert.h: /usr/include/c++/4.2.1/bits/stl_function.h: /usr/include/c++/4.2.1/bits/basic_string.h: /usr/include/c++/4.2.1/ext/atomicity.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/atomic_word.h: /usr/include/c++/4.2.1/algorithm: /usr/include/c++/4.2.1/bits/stl_algo.h: /usr/include/c++/4.2.1/bits/stl_heap.h: /usr/include/c++/4.2.1/bits/stl_tempbuf.h: /usr/include/c++/4.2.1/bits/basic_string.tcc: /usr/include/c++/4.2.1/iostream: /usr/include/c++/4.2.1/ostream: /usr/include/c++/4.2.1/ios: /usr/include/c++/4.2.1/bits/localefwd.h: /usr/include/c++/4.2.1/bits/ios_base.h: /usr/include/c++/4.2.1/bits/locale_classes.h: /usr/include/c++/4.2.1/streambuf: /usr/include/c++/4.2.1/bits/streambuf.tcc: /usr/include/c++/4.2.1/bits/basic_ios.h: /usr/include/c++/4.2.1/bits/streambuf_iterator.h: /usr/include/c++/4.2.1/bits/locale_facets.h: /usr/include/c++/4.2.1/cwctype: /usr/include/wctype.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/ctype_base.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/ctype_inline.h: /usr/include/c++/4.2.1/bits/codecvt.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/time_members.h: /usr/include/c++/4.2.1/i686-apple-darwin10/x86_64/bits/messages_members.h: /usr/include/c++/4.2.1/bits/basic_ios.tcc: /usr/include/c++/4.2.1/bits/ostream.tcc: /usr/include/c++/4.2.1/locale: /usr/include/c++/4.2.1/bits/locale_facets.tcc: /usr/include/c++/4.2.1/typeinfo: /usr/include/c++/4.2.1/istream: /usr/include/c++/4.2.1/bits/istream.tcc: /usr/include/errno.h: /usr/include/sys/errno.h: /usr/include/sys/types.h: /usr/include/sys/timeb.h: /usr/include/sys/socket.h: /usr/include/machine/_param.h: /usr/include/i386/_param.h: /usr/include/strings.h: /usr/include/sys/time.h: /usr/include/netinet/in.h: /usr/include/netinet6/in6.h: /usr/include/netinet/tcp.h: /usr/include/arpa/inet.h: /usr/include/netdb.h: /usr/include/fcntl.h: /usr/include/sys/fcntl.h: /usr/include/math.h: /usr/include/architecture/i386/math.h: /usr/include/AvailabilityMacros.h: gsoap-2.8.91/gsoap/samples/dom/Makefile.in0000644000175000017500000005031613525245173017701 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = domcpp$(EXEEXT) dom2calc$(EXEEXT) subdir = gsoap/samples/dom ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am_dom2calc_OBJECTS = $(am__objects_1) dom2calc.$(OBJEXT) \ $(am__objects_2) dom2calc_OBJECTS = $(am_dom2calc_OBJECTS) am__DEPENDENCIES_1 = dom2calc_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) am_domcpp_OBJECTS = domcpp.$(OBJEXT) $(am__objects_1) $(am__objects_2) domcpp_OBJECTS = $(am_domcpp_OBJECTS) domcpp_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/dom2calc.Po ./$(DEPDIR)/domcpp.Po \ ./$(DEPDIR)/soapC.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(dom2calc_SOURCES) $(domcpp_SOURCES) DIST_SOURCES = $(dom2calc_SOURCES) $(domcpp_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.cpp_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = dom2calc.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = $(SOAP_NS_DEF) domcpp_SOURCES = domcpp.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) domcpp_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) dom2calc_SOURCES = $(SOAPHEADER) dom2calc.cpp $(SOAP_CPP_CORE) dom2calc_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/dom/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/dom/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) dom2calc$(EXEEXT): $(dom2calc_OBJECTS) $(dom2calc_DEPENDENCIES) $(EXTRA_dom2calc_DEPENDENCIES) @rm -f dom2calc$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(dom2calc_OBJECTS) $(dom2calc_LDADD) $(LIBS) domcpp$(EXEEXT): $(domcpp_OBJECTS) $(domcpp_DEPENDENCIES) $(EXTRA_domcpp_DEPENDENCIES) @rm -f domcpp$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(domcpp_OBJECTS) $(domcpp_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dom2calc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/domcpp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/dom2calc.Po -rm -f ./$(DEPDIR)/domcpp.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/dom2calc.Po -rm -f ./$(DEPDIR)/domcpp.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/dom/build.bat0000644000175000017500000000064213525245162017416 0ustar ellertellertREM Copying stdsoap2.h and stdsoap2.cpp to source dir COPY /B ..\..\stdsoap2.h . COPY /B ..\..\stdsoap2.cpp . COPY /B ..\..\import\dom.h . COPY /B ..\..\dom.cpp . ..\..\soapcpp2\Release\soapcpp2.exe -CSL dom.h REM You need these header files to compile: REM stdsoap2.h REM soapH.h REM soapStub.h REM You need these source code files to compile: REM stdsoap2.cpp REM dom.cpp REM domcpp.cpp REM soapC.cpp gsoap-2.8.91/gsoap/samples/dom/domcpp.cpp0000644000175000017500000024374313525245162017630 0ustar ellertellert/* domcpp.cpp An XML DOM C/C++ code generator for the gSOAP DOM API. 1. Take an XML sample document and render it in DOM API code to construct this XML as a DOM object: echo '\ \ \ \ \ \ \ ' | ./domcpp #include "soapH.h" { struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); ctx->double_format = "%lG"; xsd__anyType dom(ctx, "menu"); dom.att("id") = "file"; dom.att("value") = "File"; dom["popup"]["menuitem"][1].att("value") = "New"; dom["popup"]["menuitem"][1].att("onclick") = "CreateNewDoc()"; dom["popup"]["menuitem"][2].att("value") = "Open"; dom["popup"]["menuitem"][2].att("onclick") = "OpenDoc()"; dom["popup"]["menuitem"][3].att("value") = "Close"; dom["popup"]["menuitem"][3].att("onclick") = "CloseDoc()"; std::cout << dom << std::endl; soap_destroy(ctx); // delete objects soap_end(ctx); // delete DOM data soap_free(ctx); // free context } 2. Take a XML sample document and render it in DOM API code to inspect and extract values from XML input, by using the XML sample document as a template: echo '\ { "menu": {\ "id": "file",\ "value": "File",\ "popup": {\ "menuitem": [\ {"value": "New", "onclick": "CreateNewDoc()"},\ {"value": "Open", "onclick": "OpenDoc()"},\ {"value": "Close", "onclick": "CloseDoc()"}\ ]\ }\ }\ }' | ./domcpp -i #include "soapH.h" { struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); ctx->double_format = "%lG"; xsd__anyType dom(ctx); std::cin >> dom; if (dom.soap->error) exit(EXIT_FAILURE); // error parsing XML xsd__anyAttribute *att; xsd__anyType *elt; #define USE_ATT(path, text) std::cout << path << " = " << text << std::endl #define USE_ELT(path, text) std::cout << path << " = " << text << std::endl if ((att = dom.att_get("id"))) USE_ATT("/menu/@id", att->get_text()); if ((att = dom.att_get("value"))) USE_ATT("/menu/@value", att->get_text()); if ((elt = dom.elt_get("popup"))) { xsd__anyType& dom_popup = *elt; for (xsd__anyType *it = dom_popup.elt_get("menuitem"); it; it = it->get_next()) { xsd__anyType& dom_popup_menuitem = *it; if ((att = dom_popup_menuitem.att_get("value"))) USE_ATT("/menu/popup/menuitem/@value", att->get_text()); if ((att = dom_popup_menuitem.att_get("onclick"))) USE_ATT("/menu/popup/menuitem/@onclick", att->get_text()); } } std::cout << dom << std::endl; soap_destroy(ctx); // delete objects soap_end(ctx); // delete DOM data soap_free(ctx); // free context } 3. Take an XPath to generate a stand-alone application that filters XML documents with a store of books to return their titles: ./domcpp -m -p'/store/book/@title' #include "soapH.h" struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; int main(int argc, char **argv) { struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE); ctx->double_format = "%lG"; xsd__anyType dom(ctx); std::cin >> dom; if (dom.soap->error) exit(EXIT_FAILURE); // error parsing XML // XPath: /store/book/@title xsd__anyAttribute *att; xsd__anyType *elt; #define QUERY_YIELD_ATT(v) std::cout << v.get_text() << std::endl #define QUERY_YIELD_ELT(v) std::cout << v << std::endl if (dom.match("store")) { size_t pos = 1; for (xsd__anyType *it = dom.elt_get("book"); it; it = it->get_next(), ++pos) { xsd__anyType& v = *it; if ((att = v.att_get("title"))) { xsd__anyAttribute& v = *att; QUERY_YIELD_ATT(v); } } } soap_destroy(ctx); // delete objects soap_end(ctx); // delete DOM data soap_free(ctx); // free context return 0; } 4. To build domcpp: cd gsoap/samples/dom soapcpp2 -CSL ../../import/dom.h c++ -I../.. -o domcpp domcpp.cpp soapC.cpp ../../dom.cpp ../../stdsoap2.cpp 5. To compile and link domcpp-generated C++ code: ./domcpp -o mydom.cpp ... soapcpp2 -CSL ../../import/dom.h c++ -I../.. -o mydom mydom.cpp soapC.cpp ../../dom.cpp ../../stdsoap2.cpp 6. To compile and link domcpp-generated C code: ./domcpp -c -o mydom.c ... soapcpp2 -c -CSL ../../import/dom.h cc -I../.. -o mydom mydom.c soapC.c ../../dom.c ../../stdsoap2.c -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" // generated by soapcpp2 -CSL import/dom.h #include #include #include #include #define DOM_ROOT "root" // unnamed root element is named "root" struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; //////////////////////////////////////////////////////////////////////////////// // // Command line options // //////////////////////////////////////////////////////////////////////////////// static bool coutput = false; // -c generate C code instead of C++ static bool explain = false; // -e add explanatory comments to the generated code static bool genread = false; // -i generate code to inspect DOM node graph parsed from XML input static bool genvars = false; // -l generate code for option -i to store values in local variables static bool genmain = false; // -m generate stand-alone code by adding main() static bool minimal = false; // -M generate minimal code unadorned with initialization and cleanup static bool nstable = false; // -n generate XML namespace table static bool optimal = false; // -O optimize code by factoring common indices when applicable static bool collect = false; // -y generate code that yields an array 'y' of XPath query results static const char *dform = NULL; // -f%fmt use %fmt to format double floats, e.g. -f%lG static const char *ofile = NULL; // -ofile save source code to file static const char *xpath = NULL; // -ppath generate XPath query code for 'path' static const char *xroot = "dom"; // -rroot use 'root' instead of root 'dom' in the generated code static const char *xcode = NULL; // -xcode generate code that executes 'code' for each XPath query result static const char *ifile = NULL; // [infile] //////////////////////////////////////////////////////////////////////////////// // // Proto // //////////////////////////////////////////////////////////////////////////////// static void out_gen_c(soap*, xsd__anyType&, const char*, const std::map&, const std::string&, const std::string&, int); static void in_gen_c(soap*, xsd__anyType&, const std::map&, const std::string&, const std::string&, int); static void out_gen_cpp(soap*, xsd__anyType&, const char*, const std::map&, const std::string&, const std::string&, int); static void in_gen_cpp(soap*, xsd__anyType&, const std::map&, const std::string&, const std::string&, int); static void path_gen_c(soap*, const char*, std::string&, bool, bool, int, size_t, size_t); static void path_exec_c(soap*, std::string&, bool, int); static void path_gen_cpp(soap*, const char*, std::string&, bool, bool, int, size_t, bool); static void path_exec_cpp(soap*, std::string&, bool, int); static std::ostream& indent(soap*, int); static bool is_bool(const char*); static bool is_int(soap*, const char*, LONG64&); static bool is_double(soap*, const char*, double&); static bool need_ns(const char*, const char*, const std::map&, const char*); static bool is_qualified(const char*); static bool is_current(const char*, const char*); static std::string prefix(const char*); static const char *name(const char*); static std::string gen_ident(const std::string&, const char*); static std::string putstrname(const char*); static std::string getname(const char**); static size_t getnth(const char**); //////////////////////////////////////////////////////////////////////////////// // // Pretty printer // //////////////////////////////////////////////////////////////////////////////// struct putstr { const char *str; int quote; putstr(const char *str, int quote = '"') : str(str), quote(quote) { } putstr(const std::string& str, int quote = '"') : str(str.c_str()), quote(quote) { } }; std::ostream& operator<<(std::ostream& os, const putstr& p) { if (p.str) { if (p.quote) os << (char)p.quote; for (const char *s = p.str; *s; ++s) { switch (*s) { case '\t': os << "\\t"; break; case '\n': os << "\\n"; break; case '\r': os << "\\r"; break; default: if (*s > 0 && *s < 0x10) os << "\\x0" << std::hex << *s << std::dec; else if (*s < 0x20 || *s >= 0x7f) os << "\\x" << std::hex << (*s & 0xff) << std::dec; else if (coutput && !p.quote && s[0] == '*' && s[1] == '/') os << "\\x2a"; else if (p.quote && s[0] == '?' && s[1] == '?') os << "?\\"; else { if (p.quote && (*s == '"' || *s == '\\')) os << "\\"; os << (char)*s; } } } if (p.quote) os << (char)p.quote; } else { os << DOM_ROOT; } return os; } //////////////////////////////////////////////////////////////////////////////// // // domcpp main // //////////////////////////////////////////////////////////////////////////////// int main(int argc, char **argv) { if (argc >= 2) { for (int i = 1; i < argc; i++) { const char *a = argv[i]; if ((a[0] == '-' && a[1]) #ifdef WIN32 || a[0] == '/' #endif ) { bool f = true; while (f && *++a) { switch (*a) { case 'c': coutput = true; break; case 'e': explain = true; break; case 'f': a++; f = false; if (*a) dform = a; else if (i < argc) dform = argv[++i]; break; case 'i': genread = true; if (!ifile) ifile = "-"; break; case 'l': genvars = true; break; case 'm': genmain = true; break; case 'M': minimal = true; break; case 'n': nstable = true; break; case 'O': optimal = true; break; case 'o': a++; f = false; if (*a) ofile = a; else if (i < argc) ofile = argv[++i]; break; case 'p': a++; f = false; if (*a) xpath = a; else if (i < argc) xpath = argv[++i]; break; case 'r': a++; f = false; if (*a) xroot = a; else if (i < argc) xroot = argv[++i]; break; case 'x': a++; f = false; if (*a) xcode = a; else if (i < argc) xcode = argv[++i]; break; case 'y': collect = true; break; case '?': case 'h': fprintf(stderr, "Usage: domcpp [-c] [-e] [-f%%fmt] [-h] [-i] [-l] [-m] [-M] [-n] [-O] [-ofile] [-ppath] [-rroot] [-xcode] [-y] [infile]\n\n" "-c generate C code instead of C++\n" "-e add explanatory comments to the generated code\n" "-f%%fmt use %%fmt to format double floats, e.g. -f%%lG\n" "-h display help message\n" "-i generate code to inspect DOM node graph parsed from XML input\n" "-l generate code for option -i to store values in local variables\n" "-m generate stand-alone code by adding main()\n" "-M generate minimal code unadorned with initialization and cleanup\n" "-n generate XML namespace table\n" "-O optimize code by factoring common indices when applicable\n" "-ofile save source code to file\n" "-ppath generate XPath query code for 'path'\n" "-rroot use 'root' instead of root 'x' in the generated code\n" "-xcode generate code that executes 'code' for each XPath query result\n" "-y generate code that yields an array 'y' of XPath query results\n" "infile optional XML file to parse\n" "- read XML from standard input\n\n"); exit(EXIT_SUCCESS); default: fprintf(stderr, "domcpp: Unknown option %s\n\n", a); exit(EXIT_FAILURE); } } } else { if (ifile && strcmp(ifile, "-")) fprintf(stderr, "domcpp: Input already specified as %s, ignoring %s\n\n", ifile, a); else ifile = argv[i]; } } } else { ifile = "-"; } if (genmain) minimal = false; soap *ctx = soap_new1(SOAP_C_UTFSTRING); if (dform && *dform == '%' && *(dform+1)) ctx->double_format = dform; std::ifstream ifs; if (ifile) { if (!strcmp(ifile, "-")) { ctx->is = &std::cin; } else { ifs.open(ifile, std::ifstream::in); if (!ifs.is_open()) { fprintf(stderr, "domcpp: Cannot open %s for reading\n", ifile); exit(EXIT_FAILURE); } ctx->is = &ifs; } } std::ofstream ofs; if (ofile) { ofs.open(ofile, std::ofstream::out); if (!ofs.is_open()) { fprintf(stderr, "domcpp: Cannot open %s for writing\n", ofile); exit(EXIT_FAILURE); } ctx->os = &ofs; } else { ctx->os = &std::cout; } xsd__anyType dom(ctx); if (ifile) { if (soap_read_xsd__anyType(ctx, &dom)) { soap_print_fault(ctx, stderr); soap_print_fault_location(ctx, stderr); exit(EXIT_FAILURE); } if (!dom.tag()) { fprintf(stderr, "domcpp: No root element in %s\n", ifile); exit(EXIT_FAILURE); } } else { nstable = false; } if (ifile && strcmp(ifile, "-")) ifs.close(); if (!minimal) { if (coutput) { *ctx->os << "/* Dependencies:\n" " dom.h stdsoap2.h\n" " dom.c stdsoap2.c\n" " Build:\n" " soapcpp2 -c -CSL dom.h (generates soapStub.h, soapH.h, soapC.c)\n" " cc ... soapC.c dom.c stdsoap2.c ...\n" "*/\n"; } else { *ctx->os << "// Dependencies:\n" "// dom.h stdsoap2.h\n" "// dom.cpp stdsoap2.cpp\n" "// Build:\n" "// soapcpp2 -CSL dom.h (generates soapStub.h, soapH.h, soapC.cpp)\n" "// c++ ... soapC.cpp dom.cpp stdsoap2.cpp ...\n"; } *ctx->os << "\n#include \"soapH.h\"\n"; if (!coutput && xpath && strstr(xpath, "..")) *ctx->os << "#include \n"; } std::map nsmap; if ((nstable || genmain) && explain) { *ctx->os << "/*\n" " Global namespace table with xmlns:prefix=\"URI\" bindings of the form:\n" " { \"prefix\", \"URI\", \"alt-URI\", NULL }\n" "\n" " When using qualified element and attribute tag names with the DOM API\n" " functions without setting the corresponding namespace URI as a function\n" " argument, you MUST include a global namespace table that defines the\n" " namespace prefixes and URIs that are used. This permits the DOM API engine\n" " to locate the URI that corresponds to each prefix in a qualified tag name.\n" "\n" " Use domcpp option -n with an XML file to collect the xmlns bindings from that\n" " file and generate the namespace table automatically.\n"; if (nstable) *ctx->os << "\n" " The first four entries are required in this order for gSOAP client/server\n" " applications. When combining this code with a gSOAP client/server\n" " application then use the soapcpp2-generated .nsmap file with namespace table\n" " for that application and add entries below that are missing from the table.\n"; *ctx->os << "*/\n"; } if (nstable) { for (xsd__anyType::iterator i = dom.begin(); i != dom.end(); ++i) { for (xsd__anyAttribute::iterator j = i->att_begin(); j != i->att_end(); ++j) { if (is_qualified(j->tag()) && strncmp(j->tag(), "SOAP-ENV:", 9) && strncmp(j->tag(), "SOAP-ENC:", 9) && strncmp(j->tag(), "xsi:", 4) && strncmp(j->tag(), "xsd:", 4) && strncmp(j->tag(), "xml", 3)) { std::string id = prefix(j->tag()); nsmap[id] = j->ns(); } } if (is_qualified(i->tag()) && strncmp(i->tag(), "SOAP-ENV:", 9) && strncmp(i->tag(), "SOAP-ENC:", 9) && strncmp(i->tag(), "xsi:", 4) && strncmp(i->tag(), "xsd:", 4) && strncmp(i->tag(), "xml", 3)) { std::string id = prefix(i->tag()); nsmap[id] = i->ns(); } } *ctx->os << "struct Namespace namespaces[] = {\n" " {\"SOAP-ENV\", \"http://schemas.xmlsoap.org/soap/envelope/\", \"http://www.w3.org/*/soap-envelope\", NULL},\n" " {\"SOAP-ENC\", \"http://schemas.xmlsoap.org/soap/encoding/\", \"http://www.w3.org/*/soap-encoding\", NULL},\n" " {\"xsi\", \"http://www.w3.org/2001/XMLSchema-instance\", \"http://www.w3.org/*/XMLSchema-instance\", NULL},\n" " {\"xsd\", \"http://www.w3.org/2001/XMLSchema\", \"http://www.w3.org/*/XMLSchema\", NULL},\n"; for (std::map::const_iterator i = nsmap.begin(); i != nsmap.end(); ++i) *ctx->os << " {\"" << i->first << "\", " << putstr(i->second) << ", NULL, NULL },\n"; *ctx->os << " {NULL, NULL, NULL, NULL}\n};\n\n"; nsmap["SOAP-ENV"] = "http://schemas.xmlsoap.org/soap/envelope/"; nsmap["SOAP-ENC"] = "http://schemas.xmlsoap.org/soap/encoding/"; nsmap["xsi"] = "http://www.w3.org/2001/XMLSchema-instance"; nsmap["xsd"] = "http://www.w3.org/2001/XMLSchema"; } if (genmain) { if (!nstable) *ctx->os << "struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}};\n\n"; *ctx->os << "int main(int argc, char **argv)\n"; } if (!minimal) { if (coutput) *ctx->os << "{ /* Generated by domcpp"; else *ctx->os << "{ // Generated by domcpp"; for (int i = 1; i < argc; ++i) *ctx->os << " " << putstr(argv[i], 0); if (coutput) *ctx->os << " */\n" " /* domcpp tool Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. */\n"; else *ctx->os << "\n" " // domcpp tool Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc.\n"; *ctx->os << " struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_DOM_TREE);\n" " ctx->double_format = \"" << (dform ? dform : "%lG") << "\";\n\n"; } if (coutput) { if (!genread && explain && dom.tag()) { *ctx->os << " /* <" << putstr(dom.tag(), 0); for (xsd__anyAttribute::iterator i = dom.att_begin(); i != dom.att_end(); ++i) *ctx->os << " " << putstr(i->tag(), 0) << "=" << putstr(*i); *ctx->os << "> */\n"; } if (genread || !ifile) *ctx->os << " xsd__anyType *" << xroot << " = soap_elt_new(ctx, NULL, NULL);\n"; else if (need_ns(dom.ns(), dom.tag(), nsmap, NULL)) *ctx->os << " xsd__anyType *" << xroot << " = soap_elt_new(ctx, " << putstr(dom.ns()) << ", " << putstr(dom.tag()) << ");\n"; else *ctx->os << " xsd__anyType *" << xroot << " = soap_elt_new(ctx, NULL, " << putstr(dom.tag()) << ");\n"; std::string path = "/"; if (dom.tag() != NULL) path.append(dom.tag()); else path.append(DOM_ROOT); if (ifile && !genread) { out_gen_c(ctx, dom, NULL, nsmap, xroot, path, 2); if (explain && dom.tag()) *ctx->os << " /* */\n"; } else { if (explain) *ctx->os << " /* parse XML into DOM object " << xroot << " */\n"; *ctx->os << " soap_read_xsd__anyType(ctx, " << xroot << ");\n"; if (!minimal) *ctx->os << " if (" << xroot << "->soap->error)\n" " exit(EXIT_FAILURE); /* error parsing XML */\n"; if (ifile) { if (explain) *ctx->os << " /* DOM attribute and element pointers to inspect DOM */\n"; *ctx->os << " xsd__anyAttribute *att;\n" " xsd__anyType *elt;\n"; if (genvars) *ctx->os << " #define USE_ATT(path, var, text) printf(\"%s = %s\\n\", path, text)\n" " #define USE_ELT(path, var, text) printf(\"%s = %s\\n\", path, text)\n"; else *ctx->os << " #define USE_ATT(path, text) printf(\"%s = %s\\n\", path, text)\n" " #define USE_ELT(path, text) printf(\"%s = %s\\n\", path, text)\n"; in_gen_c(ctx, dom, nsmap, xroot, path, 2); } } if (xpath) { *ctx->os << " /* XPath: " << putstr(xpath, 0) << " */\n"; if (!ifile || !genread) { if (explain) *ctx->os << " /* DOM attribute and element pointers to inspect DOM */\n"; *ctx->os << " xsd__anyAttribute *att;\n" " xsd__anyType *elt;\n"; } if (!xcode) { if (collect) { if (explain) *ctx->os << " /* XPath query yields an array 'y' of XPath query results: */\n"; *ctx->os << " xsd__anyType *y = soap_elt_new(ctx, NULL, \"results\");\n" " #define QUERY_YIELD_ATT(v) soap_add_elt(y, soap_add_att(soap_elt_new(ctx, NULL, \"result\"), v));\n" " #define QUERY_YIELD_ELT(v) soap_add_elt(y, soap_add_elt(soap_elt_new(ctx, NULL, \"result\"), v));\n"; } else { if (explain) *ctx->os << " /* XPath query yields are shown for each XPath result: */\n"; *ctx->os << " #define QUERY_YIELD_ATT(v) printf(\"%s\\n\", soap_att_get_text(v))\n" " #define QUERY_YIELD_ELT(v) soap_write_xsd__anyType(ctx, v), putchar('\\n')\n"; } } std::string root(xroot); if (explain) { *ctx->os << " /* Synopsis of variables used:\n" " " << root << "\troot element node pointer\n" << ( collect ? " y\tyield query results\n" : "" ) << " v\tcurrent element or attribute node pointer, to use in [?expr]\n" " att\tattribute node pointer\n" " elt\telement node pointer\n" " pos\tXPath position()\n" " */\n"; } path_gen_c(ctx, xpath, root, true, false, 2, 0, 0); if (!minimal && collect) *ctx->os << " soap_write_xsd__anyType(ctx, y), putchar('\\n');\n"; } else if (!minimal) { if (explain) *ctx->os << " /* output DOM " << xroot << " in XML */\n"; *ctx->os << " soap_write_xsd__anyType(ctx, " << xroot << "), putchar('\\n');\n"; } if (!minimal) { *ctx->os << "\n" " soap_end(ctx); /* delete DOM data */\n" " soap_free(ctx); /* free context */\n" << (genmain ? " return 0;\n" : "") << "}\n"; } } else { if (!genread && explain && dom.tag()) { *ctx->os << " // <" << putstr(dom.tag(), 0); for (xsd__anyAttribute::iterator i = dom.att_begin(); i != dom.att_end(); ++i) *ctx->os << " " << putstr(i->tag(), 0) << "=" << putstr(*i); *ctx->os << "> \n"; } if (genread || !ifile) *ctx->os << " xsd__anyType " << xroot << "(ctx);\n"; else if (need_ns(dom.ns(), dom.tag(), nsmap, NULL)) *ctx->os << " xsd__anyType " << xroot << "(ctx, " << putstr(dom.ns()) << ", " << putstr(dom.tag()) << ");\n"; else *ctx->os << " xsd__anyType " << xroot << "(ctx, " << putstr(dom.tag()) << ");\n"; std::string path = "/"; if (dom.tag() != NULL) path.append(dom.tag()); else path.append(DOM_ROOT); if (ifile && !genread) { out_gen_cpp(ctx, dom, NULL, nsmap, xroot, path, 2); if (explain && dom.tag()) *ctx->os << " // \n"; } else { if (explain) *ctx->os << " // parse XML into DOM object " << xroot << " \n"; *ctx->os << " std::cin >> " << xroot << ";\n"; if (!minimal) *ctx->os << " if (" << xroot << ".soap->error)\n" " exit(EXIT_FAILURE); // error parsing XML\n"; if (ifile) { if (explain) *ctx->os << " // DOM attribute and element pointers to inspect DOM\n"; *ctx->os << " xsd__anyAttribute *att;\n" " xsd__anyType *elt;\n"; if (genvars) *ctx->os << " #define USE_ATT(path, var, text) std::cout << path << \" = \" << text << std::endl\n" " #define USE_ELT(path, var, text) std::cout << path << \" = \" << text << std::endl\n"; else *ctx->os << " #define USE_ATT(path, text) std::cout << path << \" = \" << text << std::endl\n" " #define USE_ELT(path, text) std::cout << path << \" = \" << text << std::endl\n"; in_gen_cpp(ctx, dom, nsmap, xroot, path, 2); } } if (xpath) { *ctx->os << " // XPath: " << xpath << "\n"; if (!ifile || !genread) { if (explain) *ctx->os << " // DOM attribute and element pointers to inspect DOM\n"; *ctx->os << " xsd__anyAttribute *att;\n" " xsd__anyType *elt;\n"; } if (!xcode) { if (collect) { if (explain) *ctx->os << " // XPath query yields an array 'y' of XPath query results:\n"; *ctx->os << " xsd__anyType y(ctx, \"results\");\n" " #define QUERY_YIELD_ATT(v) y.add(xsd__anyType(ctx, \"result\").add(v));\n" " #define QUERY_YIELD_ELT(v) y.add(xsd__anyType(ctx, \"result\").add(v));\n"; } else { if (explain) *ctx->os << " // XPath query yields are shown for each XPath result:\n"; *ctx->os << " #define QUERY_YIELD_ATT(v) std::cout << v.get_text() << std::endl\n" " #define QUERY_YIELD_ELT(v) std::cout << v << std::endl\n"; } } std::string root(xroot); if (explain) { *ctx->os << " // Synopsis of variables used:\n" " // " << root << "\troot element node\n" << ( collect ? " // y\tyields query results\n" : "" ) << " // v\tcurrent element or attribute node reference, to use in [?expr]\n" " // it\tloop iterator or pointer over elements and attributes\n" " // att\tattribute node pointer\n" " // elt\telement node pointer\n" " // pos\tXPath position()\n"; } path_gen_cpp(ctx, xpath, root, true, false, 2, 0, false); if (!minimal && collect) *ctx->os << " std::cout << y << std::endl;\n"; } else if (!minimal) { if (explain) *ctx->os << " // output DOM " << xroot << " in XML\n"; *ctx->os << " std::cout << " << xroot << " << std::endl;\n"; } if (!minimal) { *ctx->os << "\n" " soap_destroy(ctx); // delete objects\n" " soap_end(ctx); // delete DOM data\n" " soap_free(ctx); // free context\n" << (genmain ? " return 0;\n" : "") << "}\n"; } } if (ofile) ofs.close(); soap_destroy(ctx); soap_end(ctx); soap_free(ctx); return 0; } //////////////////////////////////////////////////////////////////////////////// // // C gen DOM writer/reader from infile // //////////////////////////////////////////////////////////////////////////////// static void out_gen_c(soap *ctx, xsd__anyType& v, const char *current, const std::map& nsmap, const std::string& lhs, const std::string& path, int k) { for (xsd__anyAttribute::iterator i = v.att_begin(); i != v.att_end(); ++i) { if (i->tag()) { if (strncmp(i->tag(), "xmlns", 5)) { if (explain) indent(ctx, k) << "/* " << path << "/@" << putstr(i->tag(), 0) << " = " << putstr(*i, 0) << " */\n"; bool is_b, is_n, is_x; LONG64 n = 0; double x = 0.0; const char *text = *i; if (text) { if ((is_b = is_bool(text))) indent(ctx, k) << "soap_att_bool("; else if ((is_n = is_int(ctx, text, n))) indent(ctx, k) << "soap_att_int("; else if ((is_x = is_double(ctx, text, x))) indent(ctx, k) << "soap_att_double("; else indent(ctx, k) << "soap_att_text("; } else indent(ctx, k); if (need_ns(i->ns(), i->tag(), nsmap, current)) *ctx->os << "soap_att(" << lhs << ", " << putstr(i->ns()) << ", " << putstr(i->tag()) << ")"; else *ctx->os << "soap_att(" << lhs << ", NULL, " << putstr(i->tag()) << ")"; if (text) { *ctx->os << ", "; if (is_b) *ctx->os << (*text == 't'); else if (is_n) *ctx->os << n << "LL"; else if (is_x) *ctx->os << x; else *ctx->os << putstr(text); *ctx->os << ")"; } *ctx->os << ";\n"; } } } for (xsd__anyType::iterator i = v.elt_begin(); i != v.elt_end(); ++i) { size_t attno = 0; for (xsd__anyAttribute::iterator j = i->att_begin(); j != i->att_end(); ++j) if (j->tag() && strncmp(j->tag(), "xmlns", 5)) attno++; if (attno > 0 || i->elt_size() > 0) { if (i->tag() != NULL) { std::string newpath = path; newpath.append("/").append(i->tag()); int nth = i->nth(); if (explain) { indent(ctx, k) << "/* " << newpath << " */\n"; indent(ctx, k) << "/*" << std::setw(2*i->depth()) << "" << std::setw(0) << "<" << putstr(i->tag(), 0); for (xsd__anyAttribute::iterator j = i->att_begin(); j != i->att_end(); ++j) *ctx->os << " " << putstr(j->tag(), 0) << "=" << putstr(*j); if (i->elt_size() > 0 || i->get_text()) *ctx->os << "> */\n"; else *ctx->os << "/> */\n"; } std::string newlhs; if (optimal) { indent(ctx, k) << "{\n"; k += 2; newlhs = gen_ident(lhs, i->tag()); if (nth > 0) { if (need_ns(i->ns(), i->tag(), nsmap, current)) indent(ctx, k) << "xsd__anyType *" << newlhs << " = soap_nth_elt(" << lhs << ", " << putstr(i->ns()) << ", " << putstr(i->tag()) << ", " << nth << ");\n"; else indent(ctx, k) << "xsd__anyType *" << newlhs << " = soap_nth_elt(" << lhs << ", NULL, " << putstr(i->tag()) << ", " << nth << ");\n"; } else { if (need_ns(i->ns(), i->tag(), nsmap, current)) indent(ctx, k) << "xsd__anyType *" << newlhs << " = soap_elt(" << lhs << ", " << putstr(i->ns()) << ", " << putstr(i->tag()) << ");\n"; else indent(ctx, k) << "xsd__anyType *" << newlhs << " = soap_elt(" << lhs << ", NULL, " << putstr(i->tag()) << ");\n"; } } else { if (nth > 0) { newlhs = "soap_nth_elt("; newlhs.append(lhs); if (need_ns(i->ns(), i->tag(), nsmap, current)) newlhs.append(", ").append(putstrname(i->ns())).append(", ").append(putstrname(i->tag())).append(", ").append(soap_int2s(ctx, nth)).append(")"); else newlhs.append(", NULL, ").append(putstrname(i->tag())).append(", ").append(soap_int2s(ctx, nth)).append(")"); } else { newlhs = "soap_elt("; newlhs.append(lhs); if (need_ns(i->ns(), i->tag(), nsmap, current)) newlhs.append(", ").append(putstrname(i->ns())).append(", ").append(putstrname(i->tag())).append(")"); else newlhs.append(", NULL, ").append(putstrname(i->tag())).append(")"); } } if (nth == 0 && i->ns() && !is_qualified(i->tag())) out_gen_c(ctx, *i, i->ns(), nsmap, newlhs, newpath, k); else out_gen_c(ctx, *i, current, nsmap, newlhs, newpath, k); if (optimal) { k -= 2; indent(ctx, k) << "}\n"; } if (explain && (i->elt_size() > 0 || i->get_text())) indent(ctx, k) << "/*" << std::setw(2*i->depth()) << "" << std::setw(0) << "tag(), 0) << "> */\n"; } } else { const char *text = *i; int nth = i->nth(); if (explain) { if (i->tag() == NULL) { if (text && *text) indent(ctx, k) << "/* " << path << " = " << putstr(text, 0) << " */\n"; } else { indent(ctx, k) << "/* " << path << "/" << putstr(i->tag(), 0); if (nth > 0) *ctx->os << "[" << nth << "]"; if (text && *text) *ctx->os << " = " << putstr(text, 0) << "*/\n"; else *ctx->os << "*/\n"; if (i->att_size() > 0) { indent(ctx, k) << "/*" << std::setw(2*i->depth()) << "" << std::setw(0) << "<" << putstr(i->tag(), 0); for (xsd__anyAttribute::iterator j = i->att_begin(); j != i->att_end(); ++j) *ctx->os << " " << putstr(j->tag(), 0) << "=" << putstr(*j); if (text) *ctx->os << ">" << putstr(text, 0) << "tag(), 0) << "> */\n"; else *ctx->os << "/> */\n"; } } } bool is_b, is_n, is_x; LONG64 n = 0; double x = 0.0; if (text) { if ((is_b = is_bool(text))) indent(ctx, k) << "soap_elt_bool("; else if ((is_n = is_int(ctx, text, n))) indent(ctx, k) << "soap_elt_int("; else if ((is_x = is_double(ctx, text, x))) indent(ctx, k) << "soap_elt_double("; else indent(ctx, k) << "soap_elt_text("; } else indent(ctx, k); if (i->tag() == NULL) *ctx->os << "soap_elt(" << lhs << ", NULL, NULL)"; else { if (nth > 0) { if (need_ns(i->ns(), i->tag(), nsmap, current)) *ctx->os << "soap_nth_elt(" << lhs << ", " << putstr(i->ns()) << ", " << putstr(i->tag()) << ", " << nth << ")"; else *ctx->os << "soap_nth_elt(" << lhs << ", NULL, " << putstr(i->tag()) << ", " << nth << ")"; } else { if (need_ns(i->ns(), i->tag(), nsmap, current)) *ctx->os << "soap_elt(" << lhs << ", " << putstr(i->ns()) << ", " << putstr(i->tag()) << ")"; else *ctx->os << "soap_elt(" << lhs << ", NULL, " << putstr(i->tag()) << ")"; } } if (text) { *ctx->os << ", "; if (is_b) *ctx->os << (*text == 't'); else if (is_n) *ctx->os << n << "LL"; else if (is_x) *ctx->os << x; else *ctx->os << putstr(text); *ctx->os << ")"; } *ctx->os << ";\n"; } } const char *text = v; if (text) { if (explain && *text) indent(ctx, k) << "/* " << path << " = " << putstr(text, 0) << " */\n"; LONG64 n; double x; if (is_bool(text)) indent(ctx, k) << "soap_elt_bool(" << lhs << ", " << (*text == 't'); else if (is_int(ctx, text, n)) indent(ctx, k) << "soap_elt_int(" << lhs << ", " << n << "LL"; else if (is_double(ctx, text, x)) indent(ctx, k) << "soap_elt_double(" << lhs << ", " << x; else indent(ctx, k) << "soap_elt_text(" << lhs << ", " << putstr(text); *ctx->os << ");\n"; } } static void in_gen_c(soap *ctx, xsd__anyType& v, const std::map& nsmap, const std::string& lhs, const std::string& path, int k) { for (xsd__anyAttribute::iterator i = v.att_begin(); i != v.att_end(); ++i) { if (i->tag()) { if (strncmp(i->tag(), "xmlns", 5)) { if (explain) indent(ctx, k) << "/* " << path << "/@" << putstr(i->tag(), 0) << " = " << putstr(*i, 0) << " */\n"; if (genvars) { bool is_b = false; bool is_n = false; bool is_x = false; std::string newlhs = gen_ident(lhs, i->tag()); indent(ctx, k) << "{\n"; const char *text = *i; if (text && *text) { LONG64 n; double x; if ((is_b = is_bool(text))) indent(ctx, k + 2) << "short " << newlhs << "_att = " << (*text == 't') << "; /* a default bool value */\n"; else if ((is_n = is_int(ctx, text, n))) indent(ctx, k + 2) << "LONG64 " << newlhs << "_att = " << n << "LL; /* a default int value */\n"; else if ((is_x = is_double(ctx, text, x))) indent(ctx, k + 2) << "double " << newlhs << "_att = " << x << "; /* a default float value */\n"; else indent(ctx, k + 2) << "const char *" << newlhs << "_att = " << putstr(text) << "; /* a default string value */\n"; } else { indent(ctx, k + 2) << "const char *" << newlhs << "_att = NULL;\n"; } if (need_ns(i->ns(), i->tag(), nsmap, NULL)) indent(ctx, k + 2) << "if ((att = soap_att_get(" << lhs << ", " << putstr(i->ns()) << ", " << putstr(name(i->tag())) << ")))\n"; else indent(ctx, k + 2) << "if ((att = soap_att_get(" << lhs << ", NULL, " << putstr(i->tag()) << ")))\n"; if (is_b) indent(ctx, k + 4) << "USE_ATT(\"" << path << "/@" << putstr(i->tag(), 0) << "\", " << newlhs << "_att = soap_att_is_true(att), soap_att_get_text(att));\n"; else if (is_n) indent(ctx, k + 4) << "USE_ATT(\"" << path << "/@" << putstr(i->tag(), 0) << "\", " << newlhs << "_att = soap_att_get_LONG64(att), soap_att_get_text(att));\n"; else if (is_x) indent(ctx, k + 4) << "USE_ATT(\"" << path << "/@" << putstr(i->tag(), 0) << "\", " << newlhs << "_att = soap_att_get_double(att), soap_att_get_text(att));\n"; else indent(ctx, k + 4) << "USE_ATT(\"" << path << "/@" << putstr(i->tag(), 0) << "\", " << newlhs << "_att = soap_att_get_text(att), soap_att_get_text(att));\n"; indent(ctx, k + 2) << "(void)" << newlhs << "_att;\n"; indent(ctx, k) << "}\n"; } else { if (need_ns(i->ns(), i->tag(), nsmap, NULL)) indent(ctx, k) << "if ((att = soap_att_get(" << lhs << ", " << putstr(i->ns()) << ", " << putstr(name(i->tag())) << ")))\n"; else indent(ctx, k) << "if ((att = soap_att_get(" << lhs << ", NULL, " << putstr(i->tag()) << ")))\n"; indent(ctx, k + 2) << "USE_ATT(\"" << path << "/@" << putstr(i->tag(), 0) << "\", soap_att_get_text(att));\n"; } } } } for (xsd__anyType::iterator i = v.elt_begin(); i != v.elt_end(); ++i) { if (i->tag()) { bool is_done = true; bool is_repeat = false; for (xsd__anyType::iterator j = v.elt_begin(); j != v.elt_end(); ++j) { if (j->tag() && !strcmp(i->tag(), j->tag())) { if (i == j) is_done = false; else { if (!is_done) is_repeat = true; break; } } } if (!is_done) { std::string newpath = path; newpath.append("/").append(i->tag()); if (explain) { if (is_repeat) indent(ctx, k) << "/* a repetition of elements " << newpath << " */\n"; else indent(ctx, k) << "/* " << newpath << " */\n"; } std::string newlhs = gen_ident(lhs, i->tag()); if (is_repeat) { indent(ctx, k) << "xsd__anyType *" << newlhs << ";\n"; if (need_ns(i->ns(), i->tag(), nsmap, NULL)) indent(ctx, k) << "for (" << newlhs << " = soap_elt_get(" << lhs << ", " << putstr(i->ns()) << ", " << putstr(name(i->tag())) << "); " << newlhs << "; " << newlhs << " = soap_elt_get_next(" << newlhs << "))\n"; else indent(ctx, k) << "for (" << newlhs << " = soap_elt_get(" << lhs << ", NULL, " << putstr(i->tag()) << "); " << newlhs << "; " << newlhs << " = soap_elt_get_next(" << newlhs << "))\n"; } else { if (need_ns(i->ns(), i->tag(), nsmap, NULL)) indent(ctx, k) << "if ((elt = soap_elt_get(" << lhs << ", " << putstr(i->ns()) << ", " << putstr(name(i->tag())) << ")))\n"; else indent(ctx, k) << "if ((elt = soap_elt_get(" << lhs << ", NULL, " << putstr(i->tag()) << ")))\n"; } indent(ctx, k) << "{\n"; if (!is_repeat) indent(ctx, k + 2) << "xsd__anyType *" << newlhs << " = elt;\n"; in_gen_c(ctx, *i, nsmap, newlhs, newpath, k + 2); indent(ctx, k) << "}\n"; } } } const char *text = v; if (text) { if (explain && *text) indent(ctx, k) << "/* " << path << " = " << putstr(text, 0) << " */\n"; if (genvars) { bool is_b = false; bool is_n = false; bool is_x = false; indent(ctx, k) << "{\n"; if (*text) { LONG64 n; double x; if ((is_b = is_bool(text))) indent(ctx, k + 2) << "short " << lhs << "_elt = " << (*text == 't') << "; /* a default bool value */\n"; else if ((is_n = is_int(ctx, text, n))) indent(ctx, k + 2) << "LONG64 " << lhs << "_elt = " << n << "LL; /* a default int value */\n"; else if ((is_x = is_double(ctx, text, x))) indent(ctx, k + 2) << "double " << lhs << "_elt = " << x << "; /* a default float value */\n"; else indent(ctx, k + 2) << "const char *" << lhs << "_elt = " << putstr(text) << "; /* a default string value */\n"; } else { indent(ctx, k + 2) << "const char *" << lhs << "_elt = NULL;\n"; } indent(ctx, k + 2) << "if (soap_elt_get_text(" << lhs << "))\n"; if (is_b) indent(ctx, k + 4) << "USE_ELT(\"" << path << "\", " << lhs << "_elt = soap_elt_is_true(" << lhs << "), soap_elt_get_text(" << lhs << "));\n"; else if (is_n) indent(ctx, k + 4) << "USE_ELT(\"" << path << "\", " << lhs << "_elt = soap_elt_get_LONG64(" << lhs << "), soap_elt_get_text(" << lhs << "));\n"; else if (is_x) indent(ctx, k + 4) << "USE_ELT(\"" << path << "\", " << lhs << "_elt = soap_elt_get_double(" << lhs << "), soap_elt_get_text(" << lhs << "));\n"; else indent(ctx, k + 4) << "USE_ELT(\"" << path << "\", " << lhs << "_elt = soap_elt_get_text(" << lhs << "), soap_elt_get_text(" << lhs << "));\n"; indent(ctx, k + 2) << "(void)" << lhs << "_elt;\n"; indent(ctx, k) << "}\n"; } else { indent(ctx, k) << "if (soap_elt_get_text(" << lhs << "))\n"; indent(ctx, k + 2) << "USE_ELT(\"" << path << "\", soap_elt_get_text(" << lhs << "));\n"; } } } //////////////////////////////////////////////////////////////////////////////// // // C++ gen DOM writer/reader from infile // //////////////////////////////////////////////////////////////////////////////// static void out_gen_cpp(soap *ctx, xsd__anyType& v, const char *current, const std::map& nsmap, const std::string& lhs, const std::string& path, int k) { for (xsd__anyAttribute::iterator i = v.att_begin(); i != v.att_end(); ++i) { if (i->tag()) { if (strncmp(i->tag(), "xmlns", 5)) { if (explain) indent(ctx, k) << "// " << path << "/@" << putstr(i->tag(), 0) << " = " << putstr(*i, 0) << "\n"; if (need_ns(i->ns(), i->tag(), nsmap, current)) indent(ctx, k) << lhs << ".att(" << putstr(i->ns()) << ", " << putstr(i->tag()) << ")"; else indent(ctx, k) << lhs << ".att(" << putstr(i->tag()) << ")"; const char *text = *i; if (text) { *ctx->os << " = "; LONG64 n; double x; if (is_bool(text)) *ctx->os << text; else if (is_int(ctx, text, n)) *ctx->os << n << "LL"; else if (is_double(ctx, text, x)) *ctx->os << x; else *ctx->os << putstr(text); } *ctx->os << ";\n"; } } } for (xsd__anyType::iterator i = v.elt_begin(); i != v.elt_end(); ++i) { size_t attno = 0; for (xsd__anyAttribute::iterator j = i->att_begin(); j != i->att_end(); ++j) if (j->tag() && strncmp(j->tag(), "xmlns", 5)) attno++; if (attno > 0 || i->elt_size() > 0) { if (i->tag()) { std::string newpath = path; newpath.append("/").append(i->tag()); int nth = i->nth(); if (nth > 0) newpath.append("[").append(soap_int2s(ctx, nth)).append("]"); if (explain) { indent(ctx, k) << "// " << newpath << "\n"; indent(ctx, k) << "//" << std::setw(2*i->depth()) << "" << std::setw(0) << "<" << putstr(i->tag(), 0); for (xsd__anyAttribute::iterator j = i->att_begin(); j != i->att_end(); ++j) *ctx->os << " " << putstr(j->tag(), 0) << "=" << putstr(*j); if (i->elt_size() > 0 || i->get_text()) *ctx->os << ">\n"; else *ctx->os << "/>\n"; } std::string newlhs; if (optimal) { indent(ctx, k) << "{\n"; k += 2; newlhs = gen_ident(lhs, i->tag()); if (need_ns(i->ns(), i->tag(), nsmap, current)) indent(ctx, k) << "xsd__anyType& " << newlhs << " = " << lhs << ".elt(" << putstr(i->ns()) << ", " << putstr(i->tag()) << ")"; else indent(ctx, k) << "xsd__anyType& " << newlhs << " = " << lhs << "[" << putstr(i->tag()) << "]"; if (nth > 0) *ctx->os << "[" << nth << "]"; *ctx->os << ";\n"; } else { newlhs = lhs; if (need_ns(i->ns(), i->tag(), nsmap, current)) newlhs.append(".elt(").append(putstrname(i->ns())).append(", ").append(putstrname(i->tag())).append(")"); else newlhs.append("[").append(putstrname(i->tag())).append("]"); if (nth > 0) newlhs.append("[").append(soap_int2s(ctx, nth)).append("]"); } if (nth == 0 && i->ns() && !is_qualified(i->tag())) out_gen_cpp(ctx, *i, i->ns(), nsmap, newlhs, newpath, k); else out_gen_cpp(ctx, *i, current, nsmap, newlhs, newpath, k); if (optimal) { k -= 2; indent(ctx, k) << "}\n"; } if (explain && (i->elt_size() > 0 || i->get_text())) indent(ctx, k) << "//" << std::setw(2*i->depth()) << "" << std::setw(0) << "tag(), 0) << ">\n"; } } else { const char *text = *i; int nth = i->nth(); if (explain) { if (i->tag() == NULL) { if (text && *text) indent(ctx, k) << "// " << path << " = " << putstr(text, 0) << "\n"; } else { indent(ctx, k) << "// " << path << "/" << putstr(i->tag(), 0); if (nth > 0) *ctx->os << "[" << nth << "]"; if (text && *text) *ctx->os << " = " << putstr(text, 0) << "\n"; else *ctx->os << "\n"; if (i->att_size() > 0) { indent(ctx, k) << "//" << std::setw(2*i->depth()) << "" << std::setw(0) << "<" << putstr(i->tag(), 0); for (xsd__anyAttribute::iterator j = i->att_begin(); j != i->att_end(); ++j) *ctx->os << " " << putstr(j->tag(), 0) << "=" << putstr(*j); if (text) *ctx->os << ">" << putstr(text, 0) << "tag(), 0) << ">\n"; else *ctx->os << "/>\n"; } } } if (i->tag() == NULL) indent(ctx, k) << lhs << ".elt()"; else { if (need_ns(i->ns(), i->tag(), nsmap, current)) indent(ctx, k) << lhs << ".elt(" << putstr(i->ns()) << ", " << putstr(i->tag()) << ")"; else indent(ctx, k) << lhs << "[" << putstr(i->tag()) << "]"; if (nth > 0) *ctx->os << "[" << nth << "]"; } if (text) { *ctx->os << " = "; LONG64 n; double x; if (is_bool(text)) *ctx->os << text; else if (is_int(ctx, text, n)) *ctx->os << n << "LL"; else if (is_double(ctx, text, x)) *ctx->os << x; else *ctx->os << putstr(text); } *ctx->os << ";\n"; } } const char *text = v; if (text) { if (explain && *text) indent(ctx, k) << "// " << path << " = " << putstr(text, 0) << "\n"; indent(ctx, k) << lhs << " = "; LONG64 n; double x; if (is_bool(text)) *ctx->os << text; else if (is_int(ctx, text, n)) *ctx->os << n << "LL"; else if (is_double(ctx, text, x)) *ctx->os << x; else *ctx->os << putstr(text); *ctx->os << ";\n"; } } static void in_gen_cpp(soap *ctx, xsd__anyType& v, const std::map& nsmap, const std::string& lhs, const std::string& path, int k) { for (xsd__anyAttribute::iterator i = v.att_begin(); i != v.att_end(); ++i) { if (i->tag()) { if (strncmp(i->tag(), "xmlns", 5)) { if (explain) indent(ctx, k) << "// " << path << "/@" << putstr(i->tag(), 0) << " = " << putstr(*i, 0) << "\n"; if (genvars) { std::string newlhs = gen_ident(lhs, i->tag()); const char *text = *i; if (text && *text) { LONG64 n; double x; if (is_bool(text)) indent(ctx, k) << "bool " << newlhs << "_att = " << text << "; // a default bool value\n"; else if (is_int(ctx, text, n)) indent(ctx, k) << "LONG64 " << newlhs << "_att = " << n << "LL; // a default int value\n"; else if (is_double(ctx, text, x)) indent(ctx, k) << "double " << newlhs << "_att = " << x << "; // a default float value\n"; else indent(ctx, k) << "const char *" << newlhs << "_att = " << putstr(text) << "; // a default string value\n"; } else { indent(ctx, k) << "const char *" << newlhs << "_att = NULL;\n"; } if (need_ns(i->ns(), i->tag(), nsmap, NULL)) indent(ctx, k) << "if ((att = " << lhs << ".att_get(" << putstr(i->ns()) << ", " << putstr(name(i->tag())) << ")))\n"; else indent(ctx, k) << "if ((att = " << lhs << ".att_get(" << putstr(i->tag()) << ")))\n"; indent(ctx, k + 2) << "USE_ATT(\"" << path << "/@" << putstr(i->tag(), 0) << "\", " << newlhs << "_att = *att, att->get_text());\n"; indent(ctx, k) << "(void)" << newlhs << "_att;\n"; } else { if (need_ns(i->ns(), i->tag(), nsmap, NULL)) indent(ctx, k) << "if ((att = " << lhs << ".att_get(" << putstr(i->ns()) << ", " << putstr(name(i->tag())) << ")))\n"; else indent(ctx, k) << "if ((att = " << lhs << ".att_get(" << putstr(i->tag()) << ")))\n"; indent(ctx, k + 2) << "USE_ATT(\"" << path << "/@" << putstr(i->tag(), 0) << "\", att->get_text());\n"; } } } } for (xsd__anyType::iterator i = v.elt_begin(); i != v.elt_end(); ++i) { if (i->tag()) { bool is_done = true; bool is_repeat = false; for (xsd__anyType::iterator j = v.elt_begin(); j != v.elt_end(); ++j) { if (j->tag() && !strcmp(i->tag(), j->tag())) { if (i == j) is_done = false; else { if (!is_done) is_repeat = true; break; } } } if (!is_done) { std::string newpath = path; newpath.append("/").append(i->tag()); if (explain) { if (is_repeat) indent(ctx, k) << "// a repetition of elements " << newpath << "\n"; else indent(ctx, k) << "// " << newpath << "\n"; } std::string newlhs = gen_ident(lhs, i->tag()); if (is_repeat) { if (need_ns(i->ns(), i->tag(), nsmap, NULL)) indent(ctx, k) << "for (xsd__anyType *it = " << lhs << ".elt_get(" << putstr(i->ns()) << ", " << putstr(name(i->tag())) << "); it; it = it->get_next())\n"; else indent(ctx, k) << "for (xsd__anyType *it = " << lhs << ".elt_get(" << putstr(i->tag()) << "); it; it = it->get_next())\n"; } else { if (need_ns(i->ns(), i->tag(), nsmap, NULL)) indent(ctx, k) << "if ((elt = " << lhs << ".elt_get(" << putstr(i->ns()) << ", " << putstr(name(i->tag())) << ")))\n"; else indent(ctx, k) << "if ((elt = " << lhs << ".elt_get(" << putstr(i->tag()) << ")))\n"; } indent(ctx, k) << "{\n"; if (is_repeat) indent(ctx, k + 2) << "xsd__anyType& " << newlhs << " = *it;\n"; else indent(ctx, k + 2) << "xsd__anyType& " << newlhs << " = *elt;\n"; in_gen_cpp(ctx, *i, nsmap, newlhs, newpath, k + 2); indent(ctx, k) << "}\n"; } } } const char *text = v; if (text) { if (explain && *text) indent(ctx, k) << "// " << path << " = " << putstr(text, 0) << "\n"; if (genvars) { if (*text) { LONG64 n; double x; if (is_bool(text)) indent(ctx, k) << "bool " << lhs << "_elt = " << text << "; // a default bool value\n"; else if (is_int(ctx, text, n)) indent(ctx, k) << "LONG64 " << lhs << "_elt = " << n << "LL; // a default int value\n"; else if (is_double(ctx, text, x)) indent(ctx, k) << "double " << lhs << "_elt = " << x << "; // a default float value\n"; else indent(ctx, k) << "const char *" << lhs << "_elt = " << putstr(text) << "; // a default string value\n"; } else { indent(ctx, k) << "const char *" << lhs << "_elt = NULL;\n"; } indent(ctx, k) << "if (" << lhs << ".get_text())\n"; indent(ctx, k + 2) << "USE_ELT(\"" << path << "\", " << lhs << "_elt = " << lhs << ", " << lhs << ".get_text());\n"; indent(ctx, k) << "(void)" << lhs << "_elt;\n"; } else { indent(ctx, k) << "if (" << lhs << ".get_text())\n"; indent(ctx, k + 2) << "USE_ELT(\"" << path << "\", " << lhs << ".get_text());\n"; } } } //////////////////////////////////////////////////////////////////////////////// // // C gen XPath from -ppath // //////////////////////////////////////////////////////////////////////////////// static void path_gen_c(struct soap *ctx, const char *xpath, std::string& v, bool atroot, bool attrib, int k, size_t parens, size_t label) { if (*xpath == ')') // path: ...)... { if (parens == 0) { fprintf(stderr, "domcpp: XPath ')' without '(' ...->%s\n\n", xpath); exit(EXIT_FAILURE); } ++xpath; --parens; indent(ctx, k) << "size_t pos = ++pos" << parens << ";\n"; } if (*xpath == '/' && *(xpath + 1) != '/') // skip single / { if (attrib) { fprintf(stderr, "domcpp: XPath / follows attribute at ...->%s\n\n", xpath); exit(EXIT_FAILURE); } ++xpath; } if (*xpath == '(') // path: (... { ++xpath; indent(ctx, k) << "size_t pos" << parens << " = 0;\n"; ++parens; } if (*xpath == '.') { ++xpath; if (*xpath == '.') { if (atroot) { fprintf(stderr, "domcpp: XPath .. at root ...->%s\n\n", xpath); exit(EXIT_FAILURE); } indent(ctx, k) << "if ((elt = soap_elt_parent(" << v << ")))\n"; indent(ctx, k) << "{\n"; indent(ctx, k + 2) << "xsd__anyType *v = elt\n"; v = "v"; path_gen_c(ctx, xpath, v, false, attrib, k + 2, parens, label); indent(ctx, k) << "}\n"; } else { path_gen_c(ctx, xpath, v, false, attrib, k, parens, label); } } else if (*xpath == '/') // path: //... { ++xpath; if (*xpath == '/') { if (attrib) { fprintf(stderr, "domcpp: XPath // follows attribute at ...->%s\n\n", xpath); exit(EXIT_FAILURE); } ++xpath; if (explain) { if (atroot) indent(ctx, k) << "/* iterate over descendants and current node " << v << " to match " << putstr(xpath, 0) << " */\n"; else indent(ctx, k) << "/* iterate over descendants of current node " << v << " to match " << putstr(xpath, 0) << " */\n"; } indent(ctx, k) << "xsd__anyType *it;\n"; indent(ctx, k) << "for (it = " << v << "; it; it = soap_dom_next_element(it, " << v << "))\n"; indent(ctx, k) << "{\n"; indent(ctx, k + 2) << "xsd__anyType *v = it;\n"; v = "v"; path_gen_c(ctx, xpath, v, atroot, false, k + 2, parens, label); indent(ctx, k) << "}\n"; } else { fprintf(stderr, "domcpp: XPath unexpected end at '/'\n\n"); exit(EXIT_FAILURE); } } else if (*xpath == '[') // path: [...]... { size_t nth = getnth(&xpath); if (nth) // path: [n]... where n is an integer > 0 position { if (explain) indent(ctx, k) << "/* if position of current node " << v << " is " << nth << " then match " << putstr(xpath, 0) << " */\n"; indent(ctx, k) << "if (pos == " << nth << ")\n"; indent(ctx, k) << "{\n"; path_gen_c(ctx, xpath, v, false, attrib, k + 2, parens, label); indent(ctx, k) << "}\n"; } else { ++xpath; int nest = 0; const char *s; for (s = xpath; *s; ++s) { if (*s == ']') { if (nest == 0) break; --nest; } else if (*s == '[') ++nest; } if (*s != ']') { fprintf(stderr, "domcpp: XPath ']' expected at ...->%s\n\n", xpath); exit(EXIT_FAILURE); } if (*xpath == '?') // path: [?e]... where e is a C boolean (nonzero is true) expression { std::string code(xpath + 1, s - xpath - 1); xpath = s + 1; if (explain) indent(ctx, k) << "/* filter current node " << v << " with 'if (" << code << ")' to match " << putstr(xpath, 0) << " */\n"; if (v != "v") { if (attrib) indent(ctx, k) << "xsd__anyAttribute *v = " << v << ";\n"; else indent(ctx, k) << "xsd__anyType *v = " << v << ";\n"; } indent(ctx, k) << "if (" << code << ")\n"; indent(ctx, k) << "{\n"; path_gen_c(ctx, xpath, v, atroot, attrib, k + 2, parens, label); indent(ctx, k) << "}\n"; } else // path: [p]... where p is an XPath to match to continue { if (explain) indent(ctx, k) << "/* check current node " << v << " matches " << putstr(xpath, 0) << " */\n"; std::string u = v; static size_t state = 0; size_t found = ++state; if (*xpath == '/' && *(xpath + 1) != '/') { v = "dom"; path_gen_c(ctx, xpath, v, true, attrib, k, 0, found); } else { path_gen_c(ctx, xpath, v, atroot, attrib, k, 0, found); } indent(ctx, k) << "if (0)\n"; indent(ctx, 2) << "found" << found << ":\n"; indent(ctx, k) << "{\n"; xpath = s + 1; path_gen_c(ctx, xpath, u, atroot, attrib, k + 2, parens, label); indent(ctx, k) << "}\n"; } } } else if (*xpath == ']') { if (!label) { fprintf(stderr, "domcpp: XPath ']' without '[' ...->%s\n\n", xpath); exit(EXIT_FAILURE); } indent(ctx, k) << "(void)" << v << ";\n"; indent(ctx, k) << "goto found" << label << ";\n"; } else if (!*xpath) { if (parens) { fprintf(stderr, "domcpp: XPath ')' expected ...->%s\n\n", xpath); exit(EXIT_FAILURE); } path_exec_c(ctx, v, attrib, k); } else if (!strncmp(xpath, "text()", 6)) // path: text() { xpath += 6; size_t nth = getnth(&xpath); if (nth == 1) { if (explain) indent(ctx, k) << "/* if current node " << v << " has a text-only element then match " << putstr(xpath, 0) << " */\n"; indent(ctx, k) << "if ((elt = soap_elt_get(" << v << ", NULL, \"\")))\n"; } else if (nth > 1) { if (explain) indent(ctx, k) << "/* if current node " << v << " has a " << nth << "-th text-only element then match " << putstr(xpath, 0) << " */\n"; indent(ctx, k) << "if ((elt = soap_elt_get(" << v << ", NULL, \"\")) && (elt = soap_elt_get_nth(elt, " << nth << ")))\n"; } else { if (explain) indent(ctx, k) << "/* for each text-only element of current node " << v << " match " << putstr(xpath, 0) << " */\n"; indent(ctx, k) << "size_t pos = 1;\n"; indent(ctx, k) << "xsd__anyType *it;\n"; indent(ctx, k) << "for (it = soap_elt_get(" << v << ", NULL, \"\"); it; it = soap_elt_get_next(it), ++pos)\n"; } indent(ctx, k) << "{\n"; if (nth) indent(ctx, k + 2) << "xsd__anyType *v = elt;\n"; else indent(ctx, k + 2) << "xsd__anyType *v = it;\n"; v = "v"; path_gen_c(ctx, xpath, v, false, false, k + 2, parens, label); indent(ctx, k) << "}\n"; } else if (atroot && *xpath != '@') // path: /name... { const char *tag = getname(&xpath).c_str(); if (explain) indent(ctx, k) << "/* if node " << v << " is '" << tag << "' then match " << putstr(xpath, 0) << " */\n"; indent(ctx, k) << "if (soap_elt_match(" << v << ", NULL, " << putstr(tag) << "))\n"; indent(ctx, k) << "{\n"; path_gen_c(ctx, xpath, v, false, false, k + 2, parens, label); indent(ctx, k) << "}\n"; } else // path: name..., name[n]..., @name, *..., *:*..., @*..., @*:*... { const char *tag = getname(&xpath).c_str(); size_t nth = 0; bool is_att = (*tag == '@'); bool is_patt = strchr(tag, '*') != NULL; bool is_wild = !strcmp(tag + is_att, "*") || !strcmp(tag + is_att, "*:*"); if (!is_patt) nth = getnth(&xpath); if (is_att && is_wild) { if (explain) indent(ctx, k) << "/* for each attribute of current node " << v << " match " << putstr(xpath, 0) << " */\n"; indent(ctx, k) << "xsd__anyAttribute *it;\n"; indent(ctx, k) << "for (it = soap_att_first(" << v << "); it; it = soap_att_next(it))\n"; } else if (is_att && is_patt) { if (explain) indent(ctx, k) << "/* for each attribute '" << tag + 1 << "' of current node " << v << " match " << putstr(xpath, 0) << " */\n"; indent(ctx, k) << "xsd__anyAttribute *it;\n"; indent(ctx, k) << "for (it = soap_att_find(" << v << ", NULL, " << putstr(tag) << "); it; it = soap_att_find_next(it, NULL, " << putstr(tag) << "))\n"; } else if (is_att) { if (explain) indent(ctx, k) << "/* if current node " << v << " has an attribute '" << tag + 1 << "' then match " << putstr(xpath, 0) << " */\n"; indent(ctx, k) << "if ((att = soap_att_get(" << v << ", NULL, " << putstr(tag + 1) << ")))\n"; } else if (is_wild) { if (explain) indent(ctx, k) << "/* for each element of current node " << v << " match " << putstr(xpath, 0) << " */\n"; indent(ctx, k) << "size_t pos = 1;\n"; indent(ctx, k) << "xsd__anyType *it;\n"; indent(ctx, k) << "for (it = soap_elt_first(" << v << "); it; it = soap_elt_next(it), ++pos)\n"; } else if (is_patt) { if (explain) indent(ctx, k) << "/* for each element '" << tag << "' of current node " << v << " match " << putstr(xpath, 0) << " */\n"; indent(ctx, k) << "size_t pos = 1;\n"; indent(ctx, k) << "xsd__anyType *it;\n"; indent(ctx, k) << "for (it = soap_elt_find(" << v << ", NULL, " << putstr(tag) << "); it; it = soap_elt_find_next(it, NULL, " << putstr(tag) << ", ++pos)\n"; } else if (nth == 1) { if (explain) indent(ctx, k) << "/* if current node " << v << " has an element '" << tag << "' then match " << putstr(xpath, 0) << " */\n"; indent(ctx, k) << "if ((elt = soap_elt_get(" << v << ", NULL, " << putstr(tag) << ")))\n"; } else if (nth > 1) { if (explain) indent(ctx, k) << "/* if current node " << v << " has a " << nth << "-th element '" << tag << "' then match " << putstr(xpath, 0) << " */\n"; indent(ctx, k) << "if ((elt = soap_elt_get(" << v << ", NULL, " << putstr(tag) << ")) && (elt = soap_elt_get_nth(elt, " << nth << ")))\n"; } else { if (explain) indent(ctx, k) << "/* for each element '" << tag << "' of current node " << v << " match " << putstr(xpath, 0) << " */\n"; indent(ctx, k) << "size_t pos = 1;\n"; indent(ctx, k) << "xsd__anyType *it;\n"; indent(ctx, k) << "for (it = soap_elt_get(" << v << ", NULL, " << putstr(tag) << "); it; it = soap_elt_get_next(it), ++pos)\n"; } indent(ctx, k) << "{\n"; if (is_att && is_patt) indent(ctx, k + 2) << "xsd__anyAttribute *v = it;\n"; else if (is_att) indent(ctx, k + 2) << "xsd__anyAttribute *v = att;\n"; else if (nth) indent(ctx, k + 2) << "xsd__anyType *v = elt;\n"; else indent(ctx, k + 2) << "xsd__anyType *v = it;\n"; v = "v"; path_gen_c(ctx, xpath, v, false, is_att, k + 2, parens, label); indent(ctx, k) << "}\n"; } } static void path_exec_c(struct soap *ctx, std::string& v, bool attrib, int k) { if (xcode) { if (attrib) indent(ctx, k) << "xsd__anyAttribute *v = " << v << ";\n"; else indent(ctx, k) << "xsd__anyType *v = " << v << ";\n"; indent(ctx, k) << xcode << "\n"; } else { if (attrib) indent(ctx, k) << "QUERY_YIELD_ATT(" << v << ");\n"; else indent(ctx, k) << "QUERY_YIELD_ELT(" << v << ");\n"; } } //////////////////////////////////////////////////////////////////////////////// // // C++ gen XPath from -ppath // //////////////////////////////////////////////////////////////////////////////// static void path_gen_cpp(struct soap *ctx, const char *xpath, std::string& v, bool atroot, bool attrib, int k, size_t parens, bool throwup) { if (*xpath == ')') // path: ...)... { if (parens == 0) { fprintf(stderr, "domcpp: XPath ')' without '(' ...->%s\n\n", xpath); exit(EXIT_FAILURE); } ++xpath; --parens; indent(ctx, k) << "size_t pos = ++pos" << parens << ";\n"; } if (*xpath == '/' && *(xpath + 1) != '/') // skip single / { if (attrib) { fprintf(stderr, "domcpp: XPath / follows attribute at ...->%s\n\n", xpath); exit(EXIT_FAILURE); } ++xpath; } if (*xpath == '(') // path: (... { ++xpath; indent(ctx, k) << "size_t pos" << parens << " = 0;\n"; ++parens; } if (*xpath == '.') { ++xpath; if (*xpath == '.') { if (atroot) { fprintf(stderr, "domcpp: XPath .. at root ...->%s\n\n", xpath); exit(EXIT_FAILURE); } indent(ctx, k) << "if ((elt = " << v << ".parent()))\n"; indent(ctx, k) << "{\n"; indent(ctx, k + 2) << "xsd__anyType& v = *elt\n"; v = "v"; path_gen_cpp(ctx, xpath, v, false, attrib, k + 2, parens, throwup); indent(ctx, k) << "}\n"; } else { path_gen_cpp(ctx, xpath, v, false, attrib, k, parens, throwup); } } else if (*xpath == '/') // path: //... { ++xpath; if (*xpath == '/') { if (attrib) { fprintf(stderr, "domcpp: XPath // follows attribute at ...->%s\n\n", xpath); exit(EXIT_FAILURE); } ++xpath; if (explain) { if (atroot) indent(ctx, k) << "// iterate over descendants and current node " << v << " to match " << putstr(xpath, 0) << "\n"; else indent(ctx, k) << "// iterate over descendants of current node " << v << " to match " << putstr(xpath, 0) << "\n"; } indent(ctx, k) << "for (xsd__anyType::iterator it = " << v << ".begin(); it != " << v << ".end(); ++it)\n"; indent(ctx, k) << "{\n"; indent(ctx, k + 2) << "xsd__anyType& v = *it;\n"; v = "v"; path_gen_cpp(ctx, xpath, v, atroot, false, k + 2, parens, throwup); indent(ctx, k) << "}\n"; } else { fprintf(stderr, "domcpp: XPath unexpected end at '/'\n\n"); exit(EXIT_FAILURE); } } else if (*xpath == '[') // path: [...]... { size_t nth = getnth(&xpath); if (nth) // path: [n]... where n is an integer > 0 position { if (explain) indent(ctx, k) << "// if position of current node " << v << " is " << nth << " then match " << putstr(xpath, 0) << "\n"; indent(ctx, k) << "if (pos == " << nth << ")\n"; indent(ctx, k) << "{\n"; path_gen_cpp(ctx, xpath, v, false, attrib, k + 2, parens, throwup); indent(ctx, k) << "}\n"; } else { ++xpath; int nest = 0; const char *s; for (s = xpath; *s; ++s) { if (*s == ']') { if (nest == 0) break; --nest; } else if (*s == '[') ++nest; } if (*s != ']') { fprintf(stderr, "domcpp: XPath ']' expected at ...->%s\n\n", xpath); exit(EXIT_FAILURE); } if (*xpath == '?') // path: [?e]... where e is a C++ bool expression { std::string code(xpath + 1, s - xpath - 1); xpath = s + 1; if (explain) indent(ctx, k) << "// filter current node " << v << " with 'if (" << code << ")' to match " << putstr(xpath, 0) << "\n"; if (v != "v") { if (attrib) indent(ctx, k) << "xsd__anyAttribute& v = " << v << ";\n"; else indent(ctx, k) << "xsd__anyType& v = " << v << ";\n"; } indent(ctx, k) << "if (" << code << ")\n"; indent(ctx, k) << "{\n"; path_gen_cpp(ctx, xpath, v, atroot, attrib, k + 2, parens, throwup); indent(ctx, k) << "}\n"; } else // path: [p]... where p is an XPath to match to continue { if (explain) indent(ctx, k) << "// check current node " << v << " matches " << putstr(xpath, 0) << "\n"; indent(ctx, k) << "try\n"; indent(ctx, k) << "{\n"; std::string u = v; if (*xpath == '/' && *(xpath + 1) != '/') { v = "dom"; path_gen_cpp(ctx, xpath, v, true, attrib, k + 2, 0, true); } else { path_gen_cpp(ctx, xpath, v, atroot, attrib, k + 2, 0, true); } indent(ctx, k) << "}\n"; indent(ctx, k) << "catch (const bool&)\n"; indent(ctx, k) << "{\n"; xpath = s + 1; path_gen_cpp(ctx, xpath, u, atroot, attrib, k + 2, parens, throwup); indent(ctx, k) << "}\n"; } } } else if (*xpath == ']') { if (!throwup) { fprintf(stderr, "domcpp: XPath ']' without '[' ...->%s\n\n", xpath); exit(EXIT_FAILURE); } indent(ctx, k) << "(void)" << v << ";\n"; indent(ctx, k) << "throw true;\n"; } else if (!*xpath) { if (parens) { fprintf(stderr, "domcpp: XPath ')' expected ...->%s\n\n", xpath); exit(EXIT_FAILURE); } path_exec_cpp(ctx, v, attrib, k); } else if (!strncmp(xpath, "text()", 6)) // path: text() { xpath += 6; size_t nth = getnth(&xpath); if (nth == 1) { if (explain) indent(ctx, k) << "// if current node " << v << " has a text-only element then match " << putstr(xpath, 0) << "\n"; indent(ctx, k) << "if ((elt = " << v << ".elt_get()))\n"; } else if (nth > 1) { if (explain) indent(ctx, k) << "// if current node " << v << " has a " << nth << "-th text-only element then match " << putstr(xpath, 0) << "\n"; indent(ctx, k) << "if ((elt = " << v << ".elt_get()) && (elt = elt->get_nth(" << nth << ")))\n"; } else { if (explain) indent(ctx, k) << "// for each text-only element of current node " << v << " match " << putstr(xpath, 0) << "\n"; indent(ctx, k) << "size_t pos = 1;\n"; indent(ctx, k) << "for (xsd__anyType *it = " << v << ".elt_get(); it; it = it->get_next(), ++pos)\n"; } indent(ctx, k) << "{\n"; if (nth) indent(ctx, k + 2) << "xsd__anyType& v = *elt;\n"; else indent(ctx, k + 2) << "xsd__anyType& v = *it;\n"; v = "v"; path_gen_cpp(ctx, xpath, v, false, false, k + 2, parens, throwup); indent(ctx, k) << "}\n"; } else if (atroot && *xpath != '@') // path: /name... { const char *tag = getname(&xpath).c_str(); if (explain) indent(ctx, k) << "// if node " << v << " is '" << tag << "' then match " << putstr(xpath, 0) << "\n"; indent(ctx, k) << "if (" << v << ".match(" << putstr(tag) << "))\n"; indent(ctx, k) << "{\n"; path_gen_cpp(ctx, xpath, v, false, false, k + 2, parens, throwup); indent(ctx, k) << "}\n"; } else // path: name..., name[n]..., @name, *..., *:*..., @*..., @*:*... { const char *tag = getname(&xpath).c_str(); size_t nth = 0; bool is_att = (*tag == '@'); bool is_patt = strchr(tag, '*') != NULL; bool is_wild = !strcmp(tag + is_att, "*") || !strcmp(tag + is_att, "*:*"); if (!is_patt) nth = getnth(&xpath); if (is_att && is_wild) { if (explain) indent(ctx, k) << "// for each attribute of current node " << v << " match " << putstr(xpath, 0) << "\n"; indent(ctx, k) << "for (xsd__anyAttribute::iterator it = " << v << ".att_begin(); it != " << v << ".att_end(); ++it)\n"; } else if (is_att && is_patt) { if (explain) indent(ctx, k) << "// for each attribute '" << tag + 1 << "' of current node " << v << " match " << putstr(xpath, 0) << "\n"; indent(ctx, k) << "for (xsd__anyAttribute::iterator it = " << v << ".att_find(" << putstr(tag) << "); it != " << v << ".att_end(); ++it)\n"; } else if (is_att) { if (explain) indent(ctx, k) << "// if current node " << v << " has an attribute '" << tag + 1 << "' then match " << putstr(xpath, 0) << "\n"; indent(ctx, k) << "if ((att = " << v << ".att_get(" << putstr(tag + 1) << ")))\n"; } else if (is_wild) { if (explain) indent(ctx, k) << "// for each element of current node " << v << " match " << putstr(xpath, 0) << "\n"; indent(ctx, k) << "size_t pos = 1;\n"; indent(ctx, k) << "for (xsd__anyType::iterator it = " << v << ".elt_begin(); it != " << v << ".elt_end(); ++it, ++pos)\n"; } else if (is_patt) { if (explain) indent(ctx, k) << "// for each element '" << tag << "' of current node " << v << " match " << putstr(xpath, 0) << "\n"; indent(ctx, k) << "size_t pos = 1;\n"; indent(ctx, k) << "for (xsd__anyType::iterator it = " << v << ".elt_find(" << putstr(tag) << "); it != " << v << ".elt_end(); ++it, ++pos)\n"; } else if (nth == 1) { if (explain) indent(ctx, k) << "// if current node " << v << " has an element '" << tag << "' then match " << putstr(xpath, 0) << "\n"; indent(ctx, k) << "if ((elt = " << v << ".elt_get(" << putstr(tag) << ")))\n"; } else if (nth > 1) { if (explain) indent(ctx, k) << "// if current node " << v << " has a " << nth << "-th element '" << tag << "' then match " << putstr(xpath, 0) << "\n"; indent(ctx, k) << "if ((elt = " << v << ".elt_get(" << putstr(tag) << ")) && (elt = elt->get_nth(" << nth << ")))\n"; } else { if (explain) indent(ctx, k) << "// for each element '" << tag << "' of current node " << v << " match " << putstr(xpath, 0) << "\n"; indent(ctx, k) << "size_t pos = 1;\n"; indent(ctx, k) << "for (xsd__anyType *it = " << v << ".elt_get(" << putstr(tag) << "); it; it = it->get_next(), ++pos)\n"; } indent(ctx, k) << "{\n"; if (is_att && is_patt) indent(ctx, k + 2) << "xsd__anyAttribute& v = *it;\n"; else if (is_att) indent(ctx, k + 2) << "xsd__anyAttribute& v = *att;\n"; else if (nth) indent(ctx, k + 2) << "xsd__anyType& v = *elt;\n"; else indent(ctx, k + 2) << "xsd__anyType& v = *it;\n"; v = "v"; path_gen_cpp(ctx, xpath, v, false, is_att, k + 2, parens, throwup); indent(ctx, k) << "}\n"; } } static void path_exec_cpp(struct soap *ctx, std::string& v, bool attrib, int k) { if (xcode) { if (v != "v") { if (attrib) indent(ctx, k) << "xsd__anyAttribute& v = " << v << ";\n"; else indent(ctx, k) << "xsd__anyType& v = " << v << ";\n"; } indent(ctx, k) << xcode << "\n"; } else { if (attrib) indent(ctx, k) << "QUERY_YIELD_ATT(" << v << ");\n"; else indent(ctx, k) << "QUERY_YIELD_ELT(" << v << ");\n"; } } //////////////////////////////////////////////////////////////////////////////// // // Misc // //////////////////////////////////////////////////////////////////////////////// static std::ostream& indent(soap *ctx, int k) { *ctx->os << std::setw(k) << "" << std::setw(0); return *ctx->os; } static std::string gen_ident(const std::string& lhs, const char *tag) { std::string id = lhs; id.append("_"); if (tag == NULL) tag = DOM_ROOT; for (const char *s = tag; *s; tag = s) { while (isalnum(*s)) s++; id.append(tag, s - tag); if (*s) s++; } return id; } static bool is_bool(const char *text) { if (!text) return false; return !strcmp(text, "true") || !strcmp(text, "false"); } static bool is_int(soap *ctx, const char *text, LONG64& n) { if (!text) return false; if (soap_s2LONG64(ctx, text, &n)) { ctx->error = SOAP_OK; return false; } return true; } static bool is_double(soap *ctx, const char *text, double& x) { if (!text) return false; if (soap_s2double(ctx, text, &x)) { ctx->error = SOAP_OK; return false; } return !soap_isnan(x) && !soap_isinf(x); } static bool need_ns(const char *ns, const char *tag, const std::map& nsmap, const char *current) { if (ns == NULL || tag == NULL) return false; if (!is_qualified(tag) && is_current(ns, current)) return false; if (nstable && is_qualified(tag)) { std::map::const_iterator i = nsmap.find(prefix(tag)); if (i != nsmap.end() && !strcmp(ns, i->second)) return false; } return true; } static bool is_qualified(const char *tag) { return tag && strchr(tag, ':'); } static bool is_current(const char *ns, const char *current) { return ns && current && !strcmp(ns, current); } static std::string prefix(const char *tag) { const char *s; if (tag == NULL) return std::string(DOM_ROOT); s = strchr(tag, ':'); if (s) return std::string(tag, s - tag); return std::string(tag); } static const char *name(const char *tag) { const char *s; if (tag == NULL) return DOM_ROOT; s = strchr(tag, ':'); if (s) return s + 1; return tag; } static std::string putstrname(const char *name) { std::stringstream ss; ss << putstr(name); return ss.str(); } static std::string getname(const char **xpath) { const char *s = *xpath; const char *t = s; if (*t == '@') ++t; while (*t && (isalnum(*t) || *t == '_' || *t == '*' || *t == ':' || *t == '-' || *t == '.' || (*t & 0x80))) ++t; if (t == s) { fprintf(stderr, "domcpp: XPath empty field name at ...->%s\n\n", s); exit(EXIT_FAILURE); } *xpath = t; return std::string(s, t - s); } static size_t getnth(const char **xpath) { size_t nth = 0; if (**xpath == '[') { char *r; nth = soap_strtoul(*xpath + 1, &r, 10); if (*r == ']') *xpath = r + 1; } return nth; } gsoap-2.8.91/gsoap/samples/dom/dom2calc.cpp0000644000175000017500000001131013525245162020011 0ustar ellertellert/* dom2calc.cpp Example DOM processing with a calculator service This is version 2 based on the improved DOM API v5 gSOAP 2.8.28 This example is based on the calculator service (samples/calc) and implements a DOM-message-based calculator client. See gsoap/doc/dom/html/index.html for the DOM API documentation, including the domcpp tool that was used to generate the XPath code in this exampple. soapcpp2 -Iimport dom2calc.h cc -o dom2calc dom2calc.cpp stdsoap2.cpp soapC.cpp dom.cpp -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" const char server[] = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; // copied and modified from: // domcpp -M -n -rrequest calc.add.req.xml 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}, {"ns", "urn:calc", NULL, NULL }, {NULL, NULL, NULL, NULL} }; int main(int argc, char **argv) { struct soap *ctx = soap_new1(SOAP_DOM_TREE | SOAP_XML_INDENT); if (argc <= 3) { std::cerr << "Usage: dom2calc [add|sub|mul|div|pow] " << std::endl; exit(1); } // create command tag ns:add, ns:sub, ns:mul, ns:div, or ns:pow std::string command = std::string("ns:").append(argv[1]); // copied and modified from: // domcpp -M -n -rrequest calc.add.req.xml xsd__anyType request(ctx, "SOAP-ENV:Envelope"); request["SOAP-ENV:Body"].att("SOAP-ENV:encodingStyle") = "http://schemas.xmlsoap.org/soap/encoding/"; request["SOAP-ENV:Body"][command.c_str()]["a"] = strtod(argv[2], NULL); request["SOAP-ENV:Body"][command.c_str()]["b"] = strtod(argv[3], NULL); std::cout << "** Request message: " << std::endl << request << std::endl << std::endl; // create response xsd__anyType response(ctx); // invoke server: make POST XML request and receive XML response if (soap_dom_call(ctx, server, "", request, response)) { soap_stream_fault(ctx, std::cerr); } else { std::cout << "** Response message:" << std::endl << response << std::endl << std::endl; // copied from: // domcpp -p'/SOAP-ENV:Envelope/SOAP-ENV:Body/ns:addResponse/result' -rresponse -x'std::cout << "Result = " << v << std::endl;' if (response.match("SOAP-ENV:Envelope")) { size_t pos = 1; for (xsd__anyType *it = response.elt_get("SOAP-ENV:Body"); it; it = it->get_next(), ++pos) { xsd__anyType& v = *it; size_t pos = 1; for (xsd__anyType *it = v.elt_get("ns:addResponse"); it; it = it->get_next(), ++pos) { xsd__anyType& v = *it; size_t pos = 1; for (xsd__anyType *it = v.elt_get("result"); it; it = it->get_next(), ++pos) { xsd__anyType& v = *it; std::cout << "Result = " << v.get_double() << std::endl; } } } } // Here is another way to search DOM for element(s): // for (xsd__anyType::iterator it = response.find("result"); it != response.end(); ++it) // std::cout << std::endl << "Result = " << it->get_double() << std::endl; } soap_destroy(ctx); // delete objects soap_end(ctx); // delete temp data soap_free(ctx); // free context return 0; } gsoap-2.8.91/gsoap/samples/dom/Makefile.am0000644000175000017500000000114513525245162017662 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = domcpp dom2calc SOAPHEADER = dom2calc.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = $(SOAP_NS_DEF) domcpp_SOURCES = domcpp.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) domcpp_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) dom2calc_SOURCES = $(SOAPHEADER) dom2calc.cpp $(SOAP_CPP_CORE) dom2calc_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) gsoap-2.8.91/gsoap/samples/dom/dom2calc.h0000644000175000017500000000531113525245162017462 0ustar ellertellert/* dom2calc.h A gSOAP header file for the DOM example You can define C and C++ types to be serialized and deserialized automatically in a DOM object. To do this, enable the SOAP_DOM_NODE flag and make sure that either xsi:types attribute values or XML element/attribute tag names match the name of the type definition. The deserialization only works when xsi:type attributes are present in messages or when XML element or attribute tag names match the type name. A deserializer is chosen based on these tag names xsi:type attribute value. For example, when an element has an xsi:type="xsd:double" attribute and SOAP_DOM_NODE is set, then the xsd__double type is deserialized into the void *soap_dom_element::node (points to a double) and soap_dom_element::type==SOAP_TYPE_xsd__double. Likewise, when an element tag name is , then the 'result' deserializer is invoked to populate void *soap_dom_element::node (points to double) and soap_dom_element::type==SOAP_TYPE_result. When declaring types for elements and attributes, it is advised to use a leading '_' to prevent them from being (de)serialized as types. The leading '_' suppresses the rendering of xsi:type. See the '_result' example below. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #import "dom.h" typedef double xsd__double; /* matches xsi:type="xsd:double" */ typedef double _result; /* matches the unqualified tag */ gsoap-2.8.91/gsoap/samples/httpcookies/0000755000175000017500000000000013525245175017406 5ustar ellertellertgsoap-2.8.91/gsoap/samples/httpcookies/.deps/0000755000175000017500000000000013525245174020416 5ustar ellertellertgsoap-2.8.91/gsoap/samples/httpcookies/Makefile.in0000644000175000017500000010067013525245163021454 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = ck.cgi$(EXEEXT) ckclient$(EXEEXT) subdir = gsoap/samples/httpcookies ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = ck_cgi-soapC.$(OBJEXT) am__objects_3 = ck_cgi-soapServer.$(OBJEXT) $(am__objects_2) am_ck_cgi_OBJECTS = ck_cgi-ckserver.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) ck_cgi_OBJECTS = $(am_ck_cgi_OBJECTS) am__DEPENDENCIES_1 = ck_cgi_DEPENDENCIES = $(SOAP_CPP_LIB_CK) $(am__DEPENDENCIES_1) ck_cgi_LINK = $(CXXLD) $(ck_cgi_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ am__objects_4 = ckclient-soapC.$(OBJEXT) am__objects_5 = ckclient-soapClient.$(OBJEXT) $(am__objects_4) am_ckclient_OBJECTS = ckclient-ckclient.$(OBJEXT) $(am__objects_1) \ $(am__objects_5) ckclient_OBJECTS = $(am_ckclient_OBJECTS) ckclient_DEPENDENCIES = $(SOAP_CPP_LIB_CK) $(am__DEPENDENCIES_1) ckclient_LINK = $(CXXLD) $(ckclient_CXXFLAGS) $(CXXFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/ck_cgi-ckserver.Po \ ./$(DEPDIR)/ck_cgi-soapC.Po ./$(DEPDIR)/ck_cgi-soapServer.Po \ ./$(DEPDIR)/ckclient-ckclient.Po ./$(DEPDIR)/ckclient-soapC.Po \ ./$(DEPDIR)/ckclient-soapClient.Po am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(ck_cgi_SOURCES) $(ckclient_SOURCES) DIST_SOURCES = $(ck_cgi_SOURCES) $(ckclient_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.cpp_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = ck.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = ck.nsmap ck.wsdl ck_cgi_CXXFLAGS = -DWITH_COOKIES -D$(platform) ck_cgi_SOURCES = ckserver.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) ck_cgi_LDADD = $(SOAP_CPP_LIB_CK) $(SAMPLE_EXTRA_LIBS) ckclient_CXXFLAGS = -DWITH_COOKIES -D$(platform) ckclient_SOURCES = ckclient.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) ckclient_LDADD = $(SOAP_CPP_LIB_CK) $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/httpcookies/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/httpcookies/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) ck.cgi$(EXEEXT): $(ck_cgi_OBJECTS) $(ck_cgi_DEPENDENCIES) $(EXTRA_ck_cgi_DEPENDENCIES) @rm -f ck.cgi$(EXEEXT) $(AM_V_CXXLD)$(ck_cgi_LINK) $(ck_cgi_OBJECTS) $(ck_cgi_LDADD) $(LIBS) ckclient$(EXEEXT): $(ckclient_OBJECTS) $(ckclient_DEPENDENCIES) $(EXTRA_ckclient_DEPENDENCIES) @rm -f ckclient$(EXEEXT) $(AM_V_CXXLD)$(ckclient_LINK) $(ckclient_OBJECTS) $(ckclient_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ck_cgi-ckserver.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ck_cgi-soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ck_cgi-soapServer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ckclient-ckclient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ckclient-soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ckclient-soapClient.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ck_cgi-ckserver.o: ckserver.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ck_cgi_CXXFLAGS) $(CXXFLAGS) -MT ck_cgi-ckserver.o -MD -MP -MF $(DEPDIR)/ck_cgi-ckserver.Tpo -c -o ck_cgi-ckserver.o `test -f 'ckserver.cpp' || echo '$(srcdir)/'`ckserver.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ck_cgi-ckserver.Tpo $(DEPDIR)/ck_cgi-ckserver.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ckserver.cpp' object='ck_cgi-ckserver.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ck_cgi_CXXFLAGS) $(CXXFLAGS) -c -o ck_cgi-ckserver.o `test -f 'ckserver.cpp' || echo '$(srcdir)/'`ckserver.cpp ck_cgi-ckserver.obj: ckserver.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ck_cgi_CXXFLAGS) $(CXXFLAGS) -MT ck_cgi-ckserver.obj -MD -MP -MF $(DEPDIR)/ck_cgi-ckserver.Tpo -c -o ck_cgi-ckserver.obj `if test -f 'ckserver.cpp'; then $(CYGPATH_W) 'ckserver.cpp'; else $(CYGPATH_W) '$(srcdir)/ckserver.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ck_cgi-ckserver.Tpo $(DEPDIR)/ck_cgi-ckserver.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ckserver.cpp' object='ck_cgi-ckserver.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ck_cgi_CXXFLAGS) $(CXXFLAGS) -c -o ck_cgi-ckserver.obj `if test -f 'ckserver.cpp'; then $(CYGPATH_W) 'ckserver.cpp'; else $(CYGPATH_W) '$(srcdir)/ckserver.cpp'; fi` ck_cgi-soapServer.o: soapServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ck_cgi_CXXFLAGS) $(CXXFLAGS) -MT ck_cgi-soapServer.o -MD -MP -MF $(DEPDIR)/ck_cgi-soapServer.Tpo -c -o ck_cgi-soapServer.o `test -f 'soapServer.cpp' || echo '$(srcdir)/'`soapServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ck_cgi-soapServer.Tpo $(DEPDIR)/ck_cgi-soapServer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapServer.cpp' object='ck_cgi-soapServer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ck_cgi_CXXFLAGS) $(CXXFLAGS) -c -o ck_cgi-soapServer.o `test -f 'soapServer.cpp' || echo '$(srcdir)/'`soapServer.cpp ck_cgi-soapServer.obj: soapServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ck_cgi_CXXFLAGS) $(CXXFLAGS) -MT ck_cgi-soapServer.obj -MD -MP -MF $(DEPDIR)/ck_cgi-soapServer.Tpo -c -o ck_cgi-soapServer.obj `if test -f 'soapServer.cpp'; then $(CYGPATH_W) 'soapServer.cpp'; else $(CYGPATH_W) '$(srcdir)/soapServer.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ck_cgi-soapServer.Tpo $(DEPDIR)/ck_cgi-soapServer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapServer.cpp' object='ck_cgi-soapServer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ck_cgi_CXXFLAGS) $(CXXFLAGS) -c -o ck_cgi-soapServer.obj `if test -f 'soapServer.cpp'; then $(CYGPATH_W) 'soapServer.cpp'; else $(CYGPATH_W) '$(srcdir)/soapServer.cpp'; fi` ck_cgi-soapC.o: soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ck_cgi_CXXFLAGS) $(CXXFLAGS) -MT ck_cgi-soapC.o -MD -MP -MF $(DEPDIR)/ck_cgi-soapC.Tpo -c -o ck_cgi-soapC.o `test -f 'soapC.cpp' || echo '$(srcdir)/'`soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ck_cgi-soapC.Tpo $(DEPDIR)/ck_cgi-soapC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapC.cpp' object='ck_cgi-soapC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ck_cgi_CXXFLAGS) $(CXXFLAGS) -c -o ck_cgi-soapC.o `test -f 'soapC.cpp' || echo '$(srcdir)/'`soapC.cpp ck_cgi-soapC.obj: soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ck_cgi_CXXFLAGS) $(CXXFLAGS) -MT ck_cgi-soapC.obj -MD -MP -MF $(DEPDIR)/ck_cgi-soapC.Tpo -c -o ck_cgi-soapC.obj `if test -f 'soapC.cpp'; then $(CYGPATH_W) 'soapC.cpp'; else $(CYGPATH_W) '$(srcdir)/soapC.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ck_cgi-soapC.Tpo $(DEPDIR)/ck_cgi-soapC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapC.cpp' object='ck_cgi-soapC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ck_cgi_CXXFLAGS) $(CXXFLAGS) -c -o ck_cgi-soapC.obj `if test -f 'soapC.cpp'; then $(CYGPATH_W) 'soapC.cpp'; else $(CYGPATH_W) '$(srcdir)/soapC.cpp'; fi` ckclient-ckclient.o: ckclient.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ckclient_CXXFLAGS) $(CXXFLAGS) -MT ckclient-ckclient.o -MD -MP -MF $(DEPDIR)/ckclient-ckclient.Tpo -c -o ckclient-ckclient.o `test -f 'ckclient.cpp' || echo '$(srcdir)/'`ckclient.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ckclient-ckclient.Tpo $(DEPDIR)/ckclient-ckclient.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ckclient.cpp' object='ckclient-ckclient.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ckclient_CXXFLAGS) $(CXXFLAGS) -c -o ckclient-ckclient.o `test -f 'ckclient.cpp' || echo '$(srcdir)/'`ckclient.cpp ckclient-ckclient.obj: ckclient.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ckclient_CXXFLAGS) $(CXXFLAGS) -MT ckclient-ckclient.obj -MD -MP -MF $(DEPDIR)/ckclient-ckclient.Tpo -c -o ckclient-ckclient.obj `if test -f 'ckclient.cpp'; then $(CYGPATH_W) 'ckclient.cpp'; else $(CYGPATH_W) '$(srcdir)/ckclient.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ckclient-ckclient.Tpo $(DEPDIR)/ckclient-ckclient.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ckclient.cpp' object='ckclient-ckclient.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ckclient_CXXFLAGS) $(CXXFLAGS) -c -o ckclient-ckclient.obj `if test -f 'ckclient.cpp'; then $(CYGPATH_W) 'ckclient.cpp'; else $(CYGPATH_W) '$(srcdir)/ckclient.cpp'; fi` ckclient-soapClient.o: soapClient.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ckclient_CXXFLAGS) $(CXXFLAGS) -MT ckclient-soapClient.o -MD -MP -MF $(DEPDIR)/ckclient-soapClient.Tpo -c -o ckclient-soapClient.o `test -f 'soapClient.cpp' || echo '$(srcdir)/'`soapClient.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ckclient-soapClient.Tpo $(DEPDIR)/ckclient-soapClient.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapClient.cpp' object='ckclient-soapClient.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ckclient_CXXFLAGS) $(CXXFLAGS) -c -o ckclient-soapClient.o `test -f 'soapClient.cpp' || echo '$(srcdir)/'`soapClient.cpp ckclient-soapClient.obj: soapClient.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ckclient_CXXFLAGS) $(CXXFLAGS) -MT ckclient-soapClient.obj -MD -MP -MF $(DEPDIR)/ckclient-soapClient.Tpo -c -o ckclient-soapClient.obj `if test -f 'soapClient.cpp'; then $(CYGPATH_W) 'soapClient.cpp'; else $(CYGPATH_W) '$(srcdir)/soapClient.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ckclient-soapClient.Tpo $(DEPDIR)/ckclient-soapClient.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapClient.cpp' object='ckclient-soapClient.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ckclient_CXXFLAGS) $(CXXFLAGS) -c -o ckclient-soapClient.obj `if test -f 'soapClient.cpp'; then $(CYGPATH_W) 'soapClient.cpp'; else $(CYGPATH_W) '$(srcdir)/soapClient.cpp'; fi` ckclient-soapC.o: soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ckclient_CXXFLAGS) $(CXXFLAGS) -MT ckclient-soapC.o -MD -MP -MF $(DEPDIR)/ckclient-soapC.Tpo -c -o ckclient-soapC.o `test -f 'soapC.cpp' || echo '$(srcdir)/'`soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ckclient-soapC.Tpo $(DEPDIR)/ckclient-soapC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapC.cpp' object='ckclient-soapC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ckclient_CXXFLAGS) $(CXXFLAGS) -c -o ckclient-soapC.o `test -f 'soapC.cpp' || echo '$(srcdir)/'`soapC.cpp ckclient-soapC.obj: soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ckclient_CXXFLAGS) $(CXXFLAGS) -MT ckclient-soapC.obj -MD -MP -MF $(DEPDIR)/ckclient-soapC.Tpo -c -o ckclient-soapC.obj `if test -f 'soapC.cpp'; then $(CYGPATH_W) 'soapC.cpp'; else $(CYGPATH_W) '$(srcdir)/soapC.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ckclient-soapC.Tpo $(DEPDIR)/ckclient-soapC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapC.cpp' object='ckclient-soapC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ckclient_CXXFLAGS) $(CXXFLAGS) -c -o ckclient-soapC.obj `if test -f 'soapC.cpp'; then $(CYGPATH_W) 'soapC.cpp'; else $(CYGPATH_W) '$(srcdir)/soapC.cpp'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/ck_cgi-ckserver.Po -rm -f ./$(DEPDIR)/ck_cgi-soapC.Po -rm -f ./$(DEPDIR)/ck_cgi-soapServer.Po -rm -f ./$(DEPDIR)/ckclient-ckclient.Po -rm -f ./$(DEPDIR)/ckclient-soapC.Po -rm -f ./$(DEPDIR)/ckclient-soapClient.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/ck_cgi-ckserver.Po -rm -f ./$(DEPDIR)/ck_cgi-soapC.Po -rm -f ./$(DEPDIR)/ck_cgi-soapServer.Po -rm -f ./$(DEPDIR)/ckclient-ckclient.Po -rm -f ./$(DEPDIR)/ckclient-soapC.Po -rm -f ./$(DEPDIR)/ckclient-soapClient.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/httpcookies/ckserver.cpp0000644000175000017500000001243513525245163021740 0ustar ellertellert/* ckserver.cpp Example HTTP cookie-enabled server Run from command line to start a stand-alone server: $ ./ckserver 8080 where 8080 is a port number Then run the client in a new window: $ ./ckclient Please see the ckclient.cpp file for HTTP cookie-related details. Remember to change the soap.cookie_domain value to your host -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "ck.nsmap" int main(int argc, char **argv) { int m, s; struct soap soap; soap_init(&soap); #ifdef WITH_OPENSSL if (soap_ssl_server_context(&soap, SOAP_SSL_DEFAULT, /* use SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION to verify clients: client must provide a key file e.g. "client.pem" and "password" */ "server.pem", /* keyfile (cert+key): see README.txt to create this file */ "password", /* password to read the private key in the key file */ "cacert.pem", /* cacert file to store trusted certificates (to authenticate clients), see README.txt */ NULL, /* capath */ "dh2048.pem", /* DH file name or DH param key len bits in string (e.g. "2048"), if NULL then RSA with 2048 bits is used instead (bits defined by SOAP_SSL_RSA_BITS) */ NULL, /* if randfile!=NULL: use a file with random data to seed randomness */ "sslserver" /* server identification for SSL session cache (unique server name, e.g. use argv[0]) */ ) ) { soap_print_fault(&soap, stderr); exit(1); } #endif // cookie domain for CGI must be the current host name: // soap.cookie_domain = "www.cs.fsu.edu"; // Cookie domain for stand-alone server: soap.cookie_domain = "localhost:8080"; // the path which is used to filter/set cookies with this destination soap.cookie_path = "/"; if (argc < 2) { // CGI app: grab cookies from 'HTTP_COOKIE' env var soap_getenv_cookies(&soap); soap_serve(&soap); } else { int port; char buf[100]; port = atoi(argv[1]); m = soap_bind(&soap, NULL, port, 100); if (m < 0) { soap_print_fault(&soap, stderr); exit(1); } sprintf(buf, "localhost:%d", port); soap.cookie_domain = buf; fprintf(stderr, "Socket connection successful %d\n", m); for (int i = 1; ; i++) { s = soap_accept(&soap); if (s < 0) exit(1); fprintf(stderr, "%d: accepted %d IP=%d.%d.%d.%d ... ", i, s, (int)(soap.ip>>24)&0xFF, (int)(soap.ip>>16)&0xFF, (int)(soap.ip>>8)&0xFF, (int)soap.ip&0xFF); #ifdef WITH_OPENSSL if (soap_ssl_accept(&soap)) soap_print_fault(&soap, stderr); else #endif if (!soap_serve(&soap)) fprintf(stderr, "served\n"); else soap_print_fault(&soap, stderr); // clean up soap_destroy(&soap); soap_end(&soap); // remove all old cookies from database so no interference when new // requests with new cookies arrive soap_free_cookies(&soap); // Note: threads can have their own cookie DB which they need to cleanup // before they terminate } } return 0; } //////////////////////////////////////////////////////////////////////////////// // // Demo cookie // //////////////////////////////////////////////////////////////////////////////// int ck__demo(struct soap *soap, char **r) { int n; const char *s; char buf[16]; // The host and path are set by soap.cookie_domain and soap.cookie_path // which MUST be the current domain and path of the CGI app or stand-alone // server in order to accept cookies intended for this service s = soap_cookie_value(soap, "demo", NULL, NULL); // cookie was returned by client? if (s) n = atoi(s)+1; // yes: increment int value as demo example session else n = 1; // no: return cookie with value 1 to client to start session sprintf(buf, "%d", n); soap_set_cookie(soap, "demo", buf, NULL, NULL); // cookie expires in 5 seconds: soap_set_cookie_expire(soap, "demo", 5, NULL, NULL); #ifdef WITH_OPENSSL soap_set_cookie_secure(soap, "demo", NULL, NULL); #endif if ((*r = (char*)soap_malloc(soap, strlen(buf)+1))) strcpy(*r, buf); return SOAP_OK; } gsoap-2.8.91/gsoap/samples/httpcookies/ck.h0000644000175000017500000000540113525245163020151 0ustar ellertellert/* ck.h This is a gSOAP header file with web service definitions. This demo illustrates the use of HTTP cookies for stateful services. This code base can be used to implement your own cookie-based stateful services. gSOAP's cookie handling is fully automatic at the client-side. A database of cookies is kept and returned to the appropriate servers. In this demo, the value (int) of the (invisible) cookie is returned as an output parameter by the service to demonstrate that each call uses a unique and updated cookie. Cookies are not automatically saved to a file by the client. So the internal cookie database is discarded when the program terminates. The server runs as CGI or stand alone with: ./ckserver For example: ./ckserver 18000 The client runs from the command line with an optional endpoint: ./ckclient For example: ./ckclient http://localhost:18000 By default, the client connects to our CGI-based server. Compilation in C++: $ soapcpp2 ck.h $ cc -o ckclient ckclient.cpp stdsoap2.cpp soapC.cpp soapClient.cpp $ cc -o ckserver ckserver.cpp stdsoap2.cpp soapC.cpp soapServer.cpp -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ck service name: ck //gsoap ck service style: rpc //gsoap ck service encoding: encoded //gsoap ck service location: http://www.cs.fsu.edu/~engelen/ck.cgi //gsoap ck service namespace: http://www.cs.fsu.edu/~engelen/ck.wsdl //gsoap ck schema namespace: urn:ck int ck__demo(char **r); gsoap-2.8.91/gsoap/samples/httpcookies/README.txt0000644000175000017500000000152213525245163021101 0ustar ellertellertThis demo illustrates the use of HTTP cookies to implement stateful services. This code base can be used to implement your own cookie-based stateful services, even with CGI which is inherently stateless. gSOAP's cookie handling is fully automatic at the client-side. A database of cookies is kept and returned to the appropriate servers. In this demo, the value (int) of the (invisible) cookie is returned as an output parameter by the service to demonstrate that each call uses a unique and updated cookie. Cookies are not automatically saved to a file by the client. So the internal cookie database is discarded when the program terminates. The code is written in C++ and compiled with: soapcpp2 ck.h cc -o ckclient ckclient.cpp stdsoap2.cpp soapC.cpp soapClient.cpp cc -o ckserver ckserver.cpp stdsoap2.cpp soapC.cpp soapServer.cpp gsoap-2.8.91/gsoap/samples/httpcookies/Makefile.am0000644000175000017500000000131713525245163021441 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = ck.cgi ckclient SOAPHEADER = ck.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = ck.nsmap ck.wsdl ck_cgi_CXXFLAGS = -DWITH_COOKIES -D$(platform) ck_cgi_SOURCES = ckserver.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) ck_cgi_LDADD = $(SOAP_CPP_LIB_CK) $(SAMPLE_EXTRA_LIBS) ckclient_CXXFLAGS = -DWITH_COOKIES -D$(platform) ckclient_SOURCES = ckclient.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) ckclient_LDADD = $(SOAP_CPP_LIB_CK) $(SAMPLE_EXTRA_LIBS) gsoap-2.8.91/gsoap/samples/httpcookies/ckclient.cpp0000644000175000017500000001311013525245163021677 0ustar ellertellert/* ckclient.cpp Example HTTP cookie-enabled client See cookie processing details in the code below. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "ck.nsmap" //////////////////////////////////////////////////////////////////////////////// // // Example cookie client // //////////////////////////////////////////////////////////////////////////////// #ifdef WITH_OPENSSL static const char *ckserver = "https://localhost:8080"; #else static const char *ckserver = "http://localhost:8080"; #endif // To access a stand-alone server on a port, use: // const char ckserver[] = "IP:PORT"; // const char ckserver[] = "http://IP:PORT"; // include HTTP header in request // const char ckserver[] = "http://www.domain.com:8008"; // const char ckserver[] = ""; // use I/O redirect // const char ckserver[] = "http://"; // use I/O redirect (includes HTTP headers) int main(int argc, char **argv) { char *r; struct soap soap; if (argc >= 2) ckserver = argv[1]; soap_init(&soap); #ifdef WITH_OPENSSL if (soap_ssl_client_context(&soap, /* SOAP_SSL_NO_AUTHENTICATION, */ /* for encryption w/o authentication */ /* SOAP_SSL_DEFAULT | SOAP_SSL_SKIP_HOST_CHECK, */ /* if we don't want the host name checks since these will change from machine to machine */ SOAP_SSL_DEFAULT | SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE, /* allow self-signed, expired, and certificates w/o CRL */ /* SOAP_SSL_DEFAULT, */ /* use SOAP_SSL_DEFAULT in production code */ NULL, /* keyfile (cert+key): required only when client must authenticate to server (see SSL docs to create this file) */ NULL, /* password to read the keyfile */ "cacert.pem", /* optional cacert file to store trusted certificates, use cacerts.pem for all public certificates issued by common CAs */ NULL, /* optional capath to directory with trusted certificates */ NULL /* if randfile!=NULL: use a file with random data to seed randomness */ )) { soap_print_fault(&soap, stderr); exit(1); } #endif // gSOAP's cookie handling is fully automatic at the client-side. // A database of cookies is kept and returned to the appropriate servers. // In this demo, the value (int) of the (invisible) cookie is returned as // an output parameter by the service to demonstrate that each call uses // a unique and updated cookie. Cookies are not automatically saved to a // file by the client. So the internal cookie database is discarded when // the program terminates. // To avoid "cookie storms" caused by malicious servers that return an // unreasonable amount of cookies, gSOAP clients/servers are restricted to // a database size that the user can limit (32 cookies by default): soap.cookie_max = 10; // In case all three calls below return the same cookie value 1, the service // (ck.cgi) is unable to return cookies (e.g. because the Web server does // not allow CGI applications to handle cookies which the user need to fix // by reconfiguration and restart of the Web server). Or the // soap.cookie_domain value is not set in the ckserver code to the host on // which the service runs . // First call (no cookies returned to service, service will return a cookie): if (soap_call_ck__demo(&soap, ckserver, NULL, &r)) { soap_print_fault(&soap, stderr); soap_print_fault_location(&soap, stderr); exit(-1); } printf("The server responded with: %s\n", r); // Second call (return cookie to service indicating continuation of session): if (soap_call_ck__demo(&soap, ckserver, NULL, &r)) { soap_print_fault(&soap, stderr); soap_print_fault_location(&soap, stderr); exit(-1); } printf("The server responded with: %s\n", r); // Third call (return cookie to service indicating continuation of session): if (soap_call_ck__demo(&soap, ckserver, NULL, &r)) { soap_print_fault(&soap, stderr); soap_print_fault_location(&soap, stderr); exit(-1); } printf("The server responded with: %s\n", r); // Fourth call (let cookie expire) printf("Waiting 6 seconds to let cookie expire...\n"); sleep(6); // wait to let cookie expire if (soap_call_ck__demo(&soap, ckserver, NULL, &r)) { soap_print_fault(&soap, stderr); soap_print_fault_location(&soap, stderr); exit(-1); } printf("The server responded with: %s\n", r); soap_end(&soap); return 0; } gsoap-2.8.91/gsoap/samples/README.txt0000644000175000017500000001335713525245163016556 0ustar ellertellert GSOAP APPLICATION EXAMPLES To build the example services and clients, run 'make' in the 'samples' directory. The concurrent server examples require the Pthreads library. The SSL example requires OpenSSL. The webserver example also requires Zlib. async: Asynchronous messaging, optional HTTP pipelining (C) atom: Atom 1.0 reading and writing, REST GET/PUT (C++) autotest: Autotest code generation for XML databindings (C++) aws-s3: AWS S3 SOAP client (C++) calc: Simple calculator client and server (C) calc++: Simple calculator client and server (C++) calc_vs2005: VS2005 project calc client example (C++) calc_xcode: Mac OS X Xcode project calc client example (C++) chaining: Chaining multiple separately-compiled services (C) chaining++: Chaining multiple separately-compiled services (C++) curl: CURL plugin example (C/C++) databinding: Data binding example for address.xsd addressbook (C++) dime: DIME attachment client and server (C++,pthreads) dom: DOM-based calculator client (C++) factory: Remote object factory and simple ORB (C++) factorytest: Test client for remote object factory (C++) gmt: One-liner service to tell the time in GMT (C++) googleapi: Google Maps API (C++,OpenSSL) hello: One-liner greeting service (C++) httpcookies: HTTP cookie client and server (C++) link: Linking multiple clients/services (C) link++: Linking multiple clients/services (C++) lu: Linear solver client and server (C++) magic: Magic squares client and server (C++,pthreads) mashup: Combining two services into a new service (C) mashup++: Combining two services into a new service (C++) mtom: MTOM attachment client and server (C) mtom-stream: MTOM streaming attachment client and server (C) oneway: One-way SOAP messaging event handling (C,pthreads) oneway++: One-way SOAP messaging event handling (C++,pthreads) polytest: Polymorphic object exchange (C++) rest: REST clients and services examples (C/C++) roll: One-liner roll of a dice service (C++) router: Router of HTTP messages over TCP/IP (C,pthreads) rss: RSS 0.91, 0.92, and 2.0 server (C) ssl: HTTPS/SSL example (C,pthreads,OpenSSL) template: Shows how container templates can be serialized (C++) testmsgr: Test messenger app for server & client testing (C++) udp: SOAP-over-UDP example client and server (C) varparam: Variable polymorphic parameters (C++) wcf: Sample client/server interop with WCF (C++) webserver: Stand-alone Web server (C,pthreads,OpenSSL,Zlib) wsa: WS-Addressing demo (C) wsrm: WS-ReliableMessaging demo (C) wsse: WS-Security demo (C,OpenSSL) wst: WS-Trust, WS-Security, and SAML demo (C,OpenSSL) xml-rpc-json: XML-RPC and JSON support and examples (C/C++) LIBRARY AND GSOAP PLUGIN SUPPORT Some of the examples require the following support libraries and plugins: plugin/threads.h/.c Portable threads (Posix and MS Windows threads) plugin/cacerts.h/.c Hard-coded SSL public certificates plugin/wsaapi.h/.c WS-Addressing plugin plugin/wsseapi.h/.c WS-Security plugin plugin/wsrmeapi.h/.c WS-ReliableMessaging plugin plugin/httpda.h/.c HTTP digest authentication plugin/httpget.h/.c HTTP GET server support plugin plugin/httppost.h/.c HTTP POST/PUT/PATCH server support plugin plugin/httppipe.h/.c HTTP pipelining plugin DISCLAIMER WE DO OUR BEST TO PROVIDE YOU WITH REAL-WORLD EXAMPLES BUT WE CANNOT GUARANTEE THAT ALL CLIENT EXAMPLES CAN CONNECT TO THIRD PARTY WEB SERVICES WHEN THESE SERVICES ARE DOWN OR HAVE BEEN REMOVED. MAC OS X XCODE PROJECTS A Mac OS X Xcode project example is included in samples/calc_xcode. MS VS2005 PROJECTS A Visual Studio 2005 project example is included in samples/calc_vs2005. A custom build step is defined for the gSOAP header file calc.h. The custom build step invokes soapcpp2 to generate the source code for the project. Note that the step to obtain the gSOAP header file calc.h is intentionally omitted, e.g. wsdl2h is not part of this process. It is advised to run wsdl2h manually and try various wsdl2h options and typemap.dat definitions to customize the wsdl2h output. SSL WITH OPENSSL To try the SSL-secure SOAP server, install OpenSSL and change the occurrences of "linprog2.cs.fsu.edu" in sslclient.c and sslserver.c to the machine name (or machine IP) you are using. Example .pem files are included but you need to create your own .pem files (see OpenSSL documentation). The sslclient and sslserver codes can then be build as follows: soapcpp2 -c ssl.h gcc -DWITH_OPENSSL -o sslclient sslclient.c stdsoap2.c soapC.c soapClient.c -lssl -lcrypto gcc -DWITH_OPENSSL -o sslserver sslserver.c stdsoap2.c soapC.c soapServer.c -lssl -lcrypto -lpthread COPYRIGHT AND LICENSE Several examples in the 'samples' directory are distributed under GPL or commercial license. Please refer to the specific licensing comments provided in the source code files. A commercial license is available from Genivia, Inc. Please contact: contact@genivia.com gsoap-2.8.91/gsoap/samples/aws/0000755000175000017500000000000013525245166015644 5ustar ellertellertgsoap-2.8.91/gsoap/samples/aws/aws-s3.cpp0000644000175000017500000000754613525245162017475 0ustar ellertellert/* aws-s3.cpp Example AWS S3 service invocation Expects access key and signature to be provided as arguments Only one service operation is shown to demonstrate the API. Add AWS S3 methods as needed: http://docs.aws.amazon.com/AmazonS3/latest/API/APISoap.html http://www.genivia.com/examples/aws HTTPS is required. Build steps: $ wsdl2h -t typemap.dat -o aws-s3.h http://doc.s3.amazonaws.com/2006-03-01/AmazonS3.wsdl $ soapcpp2 -C -j -r aws-s3.h $ c++ -DWITH_OPENSSL -o aws-s3 aws-s3.cpp soapAmazonS3SoapBindingProxy.cpp soapC.cpp stdsoap2.cpp -lssl -lcrypto -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapAmazonS3SoapBindingProxy.h" #include "AmazonS3SoapBinding.nsmap" // Make allocation and assigment of primitive values quick and easy: template T * soap_make(struct soap *soap, T val) { T *p = (T*)soap_malloc(soap, sizeof(T)); *p = val; return p; } // Make allocation and assignment of std::string quick and easy: std::string * soap_make_string(struct soap *soap, const char *s) { std::string *p = soap_new_std__string(soap); *p = s; return p; } int main(int argc, char **argv) { // Create a proxy to invoke AWS S3 services AmazonS3SoapBindingProxy aws(SOAP_XML_INDENT); // Set the argument of the ListAllMyBuckets service operation _s3__ListAllMyBuckets arg; arg.AWSAccessKeyId = soap_make_string(aws.soap, argc > 1 ? argv[1] : "..."); // use your access key arg.Timestamp = soap_make(aws.soap, time(0)); arg.Signature = soap_make_string(aws.soap, argc > 2 ? argv[2] : "..."); // use your signature // Store the result of the service _s3__ListAllMyBucketsResponse response; // Get list of my buckets if (aws.ListAllMyBuckets(&arg, response)) aws.soap_stream_fault(std::cerr); else if (response.ListAllMyBucketsResponse) { s3__ListAllMyBucketsResult &result = *response.ListAllMyBucketsResponse; s3__CanonicalUser *owner = result.Owner; if (owner) std::cout << "ID = " << owner->ID << std::endl; if (owner && owner->DisplayName) std::cout << "DisplayName = " << *owner->DisplayName << std::endl; s3__ListAllMyBucketsList *buckets = result.Buckets; if (buckets) { for (std::vector::const_iterator it = buckets->Bucket.begin(); it != buckets->Bucket.end(); ++it) { s3__ListAllMyBucketsEntry *entry = *it; if (entry) std::cout << "Name = " << entry->Name << " created " << soap_dateTime2s(aws.soap, entry->CreationDate) << std::endl; } } } // Delete all managed data aws.destroy(); return 0; } gsoap-2.8.91/gsoap/samples/aws/.deps/0000755000175000017500000000000013525245166016655 5ustar ellertellertgsoap-2.8.91/gsoap/samples/aws/Makefile.in0000644000175000017500000006326613525245165017725 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = aws$(EXEEXT) subdir = gsoap/samples/aws ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = aws-soapC.$(OBJEXT) am_aws_OBJECTS = aws-aws-s3.$(OBJEXT) $(am__objects_1) \ $(am__objects_2) aws-soapAmazonS3SoapBindingProxy.$(OBJEXT) aws_OBJECTS = $(am_aws_OBJECTS) am__DEPENDENCIES_1 = aws_DEPENDENCIES = $(SOAP_CPP_LIB_SSL) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/aws-aws-s3.Po \ ./$(DEPDIR)/aws-soapAmazonS3SoapBindingProxy.Po \ ./$(DEPDIR)/aws-soapC.Po am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(aws_SOURCES) DIST_SOURCES = $(aws_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.cpp_proxy_rules_j \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = aws-s3.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = AmazonS3SoapBinding.nsmap aws_CPPFLAGS = -DWITH_OPENSSL aws_SOURCES = aws-s3.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) soapAmazonS3SoapBindingProxy.cpp aws_LDADD = $(SOAP_CPP_LIB_SSL) $(SAMPLE_EXTRA_LIBS) $(SAMPLE_SSL_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_proxy_rules_j $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/aws/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/aws/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_proxy_rules_j $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) aws$(EXEEXT): $(aws_OBJECTS) $(aws_DEPENDENCIES) $(EXTRA_aws_DEPENDENCIES) @rm -f aws$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(aws_OBJECTS) $(aws_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aws-aws-s3.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aws-soapAmazonS3SoapBindingProxy.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aws-soapC.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` aws-aws-s3.o: aws-s3.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(aws_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT aws-aws-s3.o -MD -MP -MF $(DEPDIR)/aws-aws-s3.Tpo -c -o aws-aws-s3.o `test -f 'aws-s3.cpp' || echo '$(srcdir)/'`aws-s3.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/aws-aws-s3.Tpo $(DEPDIR)/aws-aws-s3.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='aws-s3.cpp' object='aws-aws-s3.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(aws_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o aws-aws-s3.o `test -f 'aws-s3.cpp' || echo '$(srcdir)/'`aws-s3.cpp aws-aws-s3.obj: aws-s3.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(aws_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT aws-aws-s3.obj -MD -MP -MF $(DEPDIR)/aws-aws-s3.Tpo -c -o aws-aws-s3.obj `if test -f 'aws-s3.cpp'; then $(CYGPATH_W) 'aws-s3.cpp'; else $(CYGPATH_W) '$(srcdir)/aws-s3.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/aws-aws-s3.Tpo $(DEPDIR)/aws-aws-s3.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='aws-s3.cpp' object='aws-aws-s3.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(aws_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o aws-aws-s3.obj `if test -f 'aws-s3.cpp'; then $(CYGPATH_W) 'aws-s3.cpp'; else $(CYGPATH_W) '$(srcdir)/aws-s3.cpp'; fi` aws-soapC.o: soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(aws_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT aws-soapC.o -MD -MP -MF $(DEPDIR)/aws-soapC.Tpo -c -o aws-soapC.o `test -f 'soapC.cpp' || echo '$(srcdir)/'`soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/aws-soapC.Tpo $(DEPDIR)/aws-soapC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapC.cpp' object='aws-soapC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(aws_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o aws-soapC.o `test -f 'soapC.cpp' || echo '$(srcdir)/'`soapC.cpp aws-soapC.obj: soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(aws_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT aws-soapC.obj -MD -MP -MF $(DEPDIR)/aws-soapC.Tpo -c -o aws-soapC.obj `if test -f 'soapC.cpp'; then $(CYGPATH_W) 'soapC.cpp'; else $(CYGPATH_W) '$(srcdir)/soapC.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/aws-soapC.Tpo $(DEPDIR)/aws-soapC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapC.cpp' object='aws-soapC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(aws_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o aws-soapC.obj `if test -f 'soapC.cpp'; then $(CYGPATH_W) 'soapC.cpp'; else $(CYGPATH_W) '$(srcdir)/soapC.cpp'; fi` aws-soapAmazonS3SoapBindingProxy.o: soapAmazonS3SoapBindingProxy.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(aws_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT aws-soapAmazonS3SoapBindingProxy.o -MD -MP -MF $(DEPDIR)/aws-soapAmazonS3SoapBindingProxy.Tpo -c -o aws-soapAmazonS3SoapBindingProxy.o `test -f 'soapAmazonS3SoapBindingProxy.cpp' || echo '$(srcdir)/'`soapAmazonS3SoapBindingProxy.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/aws-soapAmazonS3SoapBindingProxy.Tpo $(DEPDIR)/aws-soapAmazonS3SoapBindingProxy.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapAmazonS3SoapBindingProxy.cpp' object='aws-soapAmazonS3SoapBindingProxy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(aws_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o aws-soapAmazonS3SoapBindingProxy.o `test -f 'soapAmazonS3SoapBindingProxy.cpp' || echo '$(srcdir)/'`soapAmazonS3SoapBindingProxy.cpp aws-soapAmazonS3SoapBindingProxy.obj: soapAmazonS3SoapBindingProxy.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(aws_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT aws-soapAmazonS3SoapBindingProxy.obj -MD -MP -MF $(DEPDIR)/aws-soapAmazonS3SoapBindingProxy.Tpo -c -o aws-soapAmazonS3SoapBindingProxy.obj `if test -f 'soapAmazonS3SoapBindingProxy.cpp'; then $(CYGPATH_W) 'soapAmazonS3SoapBindingProxy.cpp'; else $(CYGPATH_W) '$(srcdir)/soapAmazonS3SoapBindingProxy.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/aws-soapAmazonS3SoapBindingProxy.Tpo $(DEPDIR)/aws-soapAmazonS3SoapBindingProxy.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapAmazonS3SoapBindingProxy.cpp' object='aws-soapAmazonS3SoapBindingProxy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(aws_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o aws-soapAmazonS3SoapBindingProxy.obj `if test -f 'soapAmazonS3SoapBindingProxy.cpp'; then $(CYGPATH_W) 'soapAmazonS3SoapBindingProxy.cpp'; else $(CYGPATH_W) '$(srcdir)/soapAmazonS3SoapBindingProxy.cpp'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/aws-aws-s3.Po -rm -f ./$(DEPDIR)/aws-soapAmazonS3SoapBindingProxy.Po -rm -f ./$(DEPDIR)/aws-soapC.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/aws-aws-s3.Po -rm -f ./$(DEPDIR)/aws-soapAmazonS3SoapBindingProxy.Po -rm -f ./$(DEPDIR)/aws-soapC.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -j -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/aws/README.txt0000644000175000017500000000151713525245162017342 0ustar ellertellertExample AWS S3 service invocation Lists all S3 buckets of a user Other service invocations can be easily added. See this article for help: http://www.codeproject.com/Articles/1108296/How-to-Use-Amazon-Simple-Storage-Service-S-in-Cplu Build steps: 1. Make sure that typemap.dat has the following lines: aws = "urn:PI/DevCentral/SoapService" s3 = "http://s3.amazonaws.com/doc/2006-03-01/" _s3__CreateBucketResponse = $ s3__CreateBucketResult* CreateBucketResponse; _s3__CopyObjectResponse = $ s3__CopyObjectResult* CopyObjectResponse; 2. then execute: $ wsdl2h -t typemap.dat -o aws-s3.h http://doc.s3.amazonaws.com/2006-03-01/AmazonS3.wsdl $ soapcpp2 -C -j -r aws-s3.h $ c++ -DWITH_OPENSSL -o aws-s3 aws-s3.cpp soapAmazonS3SoapBindingProxy.cpp soapC.cpp stdsoap2.cpp -lssl -lcrypto A report is auto-generated in soapReadme.md gsoap-2.8.91/gsoap/samples/aws/Makefile.am0000644000175000017500000000110413525245162017670 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = aws SOAPHEADER = aws-s3.h include ../Makefile.defines include ../Makefile.cpp_proxy_rules_j SOAP_NS = AmazonS3SoapBinding.nsmap aws_CPPFLAGS = -DWITH_OPENSSL aws_SOURCES = aws-s3.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) soapAmazonS3SoapBindingProxy.cpp aws_LDADD = $(SOAP_CPP_LIB_SSL) $(SAMPLE_EXTRA_LIBS) $(SAMPLE_SSL_LIBS) gsoap-2.8.91/gsoap/samples/aws/aws-s3.h0000644000175000017500000064165113525245162017143 0ustar ellertellert// Reminder: Modify typemap.dat to customize the header file generated by wsdl2h /* aws-s3.h Generated by wsdl2h 2.8.28 from http://doc.s3.amazonaws.com/2006-03-01/AmazonS3.wsdl and typemap.dat 2016-02-22 17:18:44 GMT DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS USE THE soapcpp2-GENERATED SOURCE CODE FILES FOR YOUR PROJECT BUILDS gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. 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 -------------------------------------------------------------------------------- */ /** @page page_notes Notes @note HINTS: - Run soapcpp2 on aws-s3.h to generate the SOAP/XML processing logic. Use soapcpp2 -I to specify paths for #import To build with STL, 'stlvector.h' is imported from 'import' dir in package. Use soapcpp2 -j to generate improved proxy and server classes. - Use wsdl2h -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) on this file to generate documentation. - Use wsdl2h -R to generate REST operations. - Use wsdl2h -nname to use name as the base namespace prefix instead of 'ns'. - Use wsdl2h -Nname for service prefix and produce multiple service bindings - Use wsdl2h -d to enable DOM support for xsd:anyType. - Use wsdl2h -g to auto-generate readers and writers for root elements. - Use wsdl2h -b to auto-generate bi-directional operations (duplex ops). - Use wsdl2h -U to map XML names to C++ Unicode identifiers instead of _xNNNN. - Use wsdl2h -u to disable the generation of unions. - Struct/class members serialized as XML attributes are annotated with a '@'. - Struct/class members that have a special role are annotated with a '$'. @warning DO NOT INCLUDE THIS ANNOTATED FILE DIRECTLY IN YOUR PROJECT SOURCE CODE. USE THE FILES GENERATED BY soapcpp2 FOR YOUR PROJECT'S SOURCE CODE: THE soapStub.h FILE CONTAINS THIS CONTENT WITHOUT ANNOTATIONS. @copyright LICENSE: @verbatim -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. The wsdl2h tool and its generated software are released under the GPL. This software is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- @endverbatim */ //gsoapopt c++,w /******************************************************************************\ * * * Definitions * * http://s3.amazonaws.com/doc/2006-03-01/ * * * \******************************************************************************/ /******************************************************************************\ * * * $CONTAINER * * std::vector * * * \******************************************************************************/ template class std::vector; /******************************************************************************\ * * * Import * * * \******************************************************************************/ #import "stl.h" // enable STL containers when used (option -s removes STL dependency) /******************************************************************************\ * * * 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: s3 = "http://s3.amazonaws.com/doc/2006-03-01/" */ #define SOAP_NAMESPACE_OF_s3 "http://s3.amazonaws.com/doc/2006-03-01/" //gsoap s3 schema namespace: http://s3.amazonaws.com/doc/2006-03-01/ //gsoap s3 schema elementForm: qualified //gsoap s3 schema attributeForm: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ /// Built-in XSD type "xs:base64Binary". class xsd__base64Binary { unsigned char *__ptr; int __size; char *id, *type, *options; // NOTE: non-NULL for DIME/MIME/MTOM XOP attachments only struct soap *soap; }; /// Primitive built-in type "xs:anyURI". typedef std::string xsd__anyURI; /******************************************************************************\ * * * Forward Declarations * * * \******************************************************************************/ // Forward declaration of class s3__MetadataEntry. class s3__MetadataEntry; // Forward declaration of class s3__Status. class s3__Status; // Forward declaration of class s3__Result. class s3__Result; // Forward declaration of class s3__CreateBucketResult. class s3__CreateBucketResult; // Forward declaration of class s3__BucketLoggingStatus. class s3__BucketLoggingStatus; // Forward declaration of class s3__LoggingSettings. class s3__LoggingSettings; // Forward declaration of class s3__Grantee. class s3__Grantee; // Forward declaration of class s3__User. class s3__User; // Forward declaration of class s3__AmazonCustomerByEmail. class s3__AmazonCustomerByEmail; // Forward declaration of class s3__CanonicalUser. class s3__CanonicalUser; // Forward declaration of class s3__Group. class s3__Group; // Forward declaration of class s3__Grant. class s3__Grant; // Forward declaration of class s3__AccessControlList. class s3__AccessControlList; // Forward declaration of class s3__CreateBucketConfiguration. class s3__CreateBucketConfiguration; // Forward declaration of class s3__LocationConstraint. class s3__LocationConstraint; // Forward declaration of class s3__AccessControlPolicy. class s3__AccessControlPolicy; // Forward declaration of class s3__GetObjectResult. class s3__GetObjectResult; // Forward declaration of class s3__PutObjectResult. class s3__PutObjectResult; // Forward declaration of class s3__ListEntry. class s3__ListEntry; // Forward declaration of class s3__VersionEntry. class s3__VersionEntry; // Forward declaration of class s3__DeleteMarkerEntry. class s3__DeleteMarkerEntry; // Forward declaration of class s3__PrefixEntry. class s3__PrefixEntry; // Forward declaration of class s3__ListBucketResult. class s3__ListBucketResult; // Forward declaration of class s3__ListVersionsResult. class s3__ListVersionsResult; // Forward declaration of class s3__ListAllMyBucketsEntry. class s3__ListAllMyBucketsEntry; // Forward declaration of class s3__ListAllMyBucketsResult. class s3__ListAllMyBucketsResult; // Forward declaration of class s3__ListAllMyBucketsList. class s3__ListAllMyBucketsList; // Forward declaration of class s3__CopyObjectResult. class s3__CopyObjectResult; // Forward declaration of class s3__RequestPaymentConfiguration. class s3__RequestPaymentConfiguration; // Forward declaration of class s3__VersioningConfiguration. class s3__VersioningConfiguration; // Forward declaration of class s3__NotificationConfiguration. class s3__NotificationConfiguration; // Forward declaration of class s3__TopicConfiguration. class s3__TopicConfiguration; // Forward declaration of class _s3__CreateBucket. class _s3__CreateBucket; // Forward declaration of class _s3__CreateBucketResponse. class _s3__CreateBucketResponse; // Forward declaration of class _s3__DeleteBucket. class _s3__DeleteBucket; // Forward declaration of class _s3__DeleteBucketResponse. class _s3__DeleteBucketResponse; // Forward declaration of class _s3__GetBucketLoggingStatus. class _s3__GetBucketLoggingStatus; // Forward declaration of class _s3__GetBucketLoggingStatusResponse. class _s3__GetBucketLoggingStatusResponse; // Forward declaration of class _s3__SetBucketLoggingStatus. class _s3__SetBucketLoggingStatus; // Forward declaration of class _s3__SetBucketLoggingStatusResponse. class _s3__SetBucketLoggingStatusResponse; // Forward declaration of class _s3__GetObjectAccessControlPolicy. class _s3__GetObjectAccessControlPolicy; // Forward declaration of class _s3__GetObjectAccessControlPolicyResponse. class _s3__GetObjectAccessControlPolicyResponse; // Forward declaration of class _s3__GetBucketAccessControlPolicy. class _s3__GetBucketAccessControlPolicy; // Forward declaration of class _s3__GetBucketAccessControlPolicyResponse. class _s3__GetBucketAccessControlPolicyResponse; // Forward declaration of class _s3__SetObjectAccessControlPolicy. class _s3__SetObjectAccessControlPolicy; // Forward declaration of class _s3__SetObjectAccessControlPolicyResponse. class _s3__SetObjectAccessControlPolicyResponse; // Forward declaration of class _s3__SetBucketAccessControlPolicy. class _s3__SetBucketAccessControlPolicy; // Forward declaration of class _s3__SetBucketAccessControlPolicyResponse. class _s3__SetBucketAccessControlPolicyResponse; // Forward declaration of class _s3__GetObject. class _s3__GetObject; // Forward declaration of class _s3__GetObjectResponse. class _s3__GetObjectResponse; // Forward declaration of class _s3__GetObjectExtended. class _s3__GetObjectExtended; // Forward declaration of class _s3__GetObjectExtendedResponse. class _s3__GetObjectExtendedResponse; // Forward declaration of class _s3__PutObject. class _s3__PutObject; // Forward declaration of class _s3__PutObjectResponse. class _s3__PutObjectResponse; // Forward declaration of class _s3__PutObjectInline. class _s3__PutObjectInline; // Forward declaration of class _s3__PutObjectInlineResponse. class _s3__PutObjectInlineResponse; // Forward declaration of class _s3__DeleteObject. class _s3__DeleteObject; // Forward declaration of class _s3__DeleteObjectResponse. class _s3__DeleteObjectResponse; // Forward declaration of class _s3__ListBucket. class _s3__ListBucket; // Forward declaration of class _s3__ListBucketResponse. class _s3__ListBucketResponse; // Forward declaration of class _s3__ListVersionsResponse. class _s3__ListVersionsResponse; // Forward declaration of class _s3__ListAllMyBuckets. class _s3__ListAllMyBuckets; // Forward declaration of class _s3__ListAllMyBucketsResponse. class _s3__ListAllMyBucketsResponse; // Forward declaration of class _s3__PostResponse. class _s3__PostResponse; // Forward declaration of class _s3__CopyObject. class _s3__CopyObject; // Forward declaration of class _s3__CopyObjectResponse. class _s3__CopyObjectResponse; /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://s3.amazonaws.com/doc/2006-03-01/ * * * \******************************************************************************/ /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":Permission is a simpleType restriction of XSD type xs:string. /// /// @note The enum values are prefixed with "s3__Permission__" to prevent name clashes: use wsdl2h option -e to omit this prefix or use option -c++11 for scoped enumerations enum s3__Permission { s3__Permission__READ, ///< xs:string value="READ" s3__Permission__WRITE, ///< xs:string value="WRITE" s3__Permission__READ_USCOREACP, ///< xs:string value="READ_ACP" s3__Permission__WRITE_USCOREACP, ///< xs:string value="WRITE_ACP" s3__Permission__FULL_USCORECONTROL, ///< xs:string value="FULL_CONTROL" }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":StorageClass is a simpleType restriction of XSD type xs:string. /// /// @note The enum values are prefixed with "s3__StorageClass__" to prevent name clashes: use wsdl2h option -e to omit this prefix or use option -c++11 for scoped enumerations enum s3__StorageClass { s3__StorageClass__STANDARD, ///< xs:string value="STANDARD" s3__StorageClass__REDUCED_USCOREREDUNDANCY, ///< xs:string value="REDUCED_REDUNDANCY" s3__StorageClass__GLACIER, ///< xs:string value="GLACIER" s3__StorageClass__UNKNOWN, ///< xs:string value="UNKNOWN" }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":MetadataDirective is a simpleType restriction of XSD type xs:string. /// /// @note The enum values are prefixed with "s3__MetadataDirective__" to prevent name clashes: use wsdl2h option -e to omit this prefix or use option -c++11 for scoped enumerations enum s3__MetadataDirective { s3__MetadataDirective__COPY, ///< xs:string value="COPY" s3__MetadataDirective__REPLACE, ///< xs:string value="REPLACE" }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":Payer is a simpleType restriction of XSD type xs:string. /// /// @note The enum values are prefixed with "s3__Payer__" to prevent name clashes: use wsdl2h option -e to omit this prefix or use option -c++11 for scoped enumerations enum s3__Payer { s3__Payer__BucketOwner, ///< xs:string value="BucketOwner" s3__Payer__Requester, ///< xs:string value="Requester" }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":MfaDeleteStatus is a simpleType restriction of XSD type xs:string. /// /// @note The enum values are prefixed with "s3__MfaDeleteStatus__" to prevent name clashes: use wsdl2h option -e to omit this prefix or use option -c++11 for scoped enumerations enum s3__MfaDeleteStatus { s3__MfaDeleteStatus__Enabled, ///< xs:string value="Enabled" s3__MfaDeleteStatus__Disabled, ///< xs:string value="Disabled" }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":VersioningStatus is a simpleType restriction of XSD type xs:string. /// /// @note The enum values are prefixed with "s3__VersioningStatus__" to prevent name clashes: use wsdl2h option -e to omit this prefix or use option -c++11 for scoped enumerations enum s3__VersioningStatus { s3__VersioningStatus__Enabled, ///< xs:string value="Enabled" s3__VersioningStatus__Suspended, ///< xs:string value="Suspended" }; /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://s3.amazonaws.com/doc/2006-03-01/ * * * \******************************************************************************/ /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":MetadataEntry is a complexType. /// /// class s3__MetadataEntry operations: /// - s3__MetadataEntry* soap_new_s3__MetadataEntry(soap*) allocate /// - s3__MetadataEntry* soap_new_s3__MetadataEntry(soap*, int num) allocate array /// - s3__MetadataEntry* soap_new_req_s3__MetadataEntry(soap*, ...) allocate, set required members /// - s3__MetadataEntry* soap_new_set_s3__MetadataEntry(soap*, ...) allocate, set all public members /// - s3__MetadataEntry::soap_default(soap*) reset members to default /// - int soap_read_s3__MetadataEntry(soap*, s3__MetadataEntry*) deserialize from a stream /// - int soap_write_s3__MetadataEntry(soap*, s3__MetadataEntry*) serialize to a stream /// - s3__MetadataEntry* s3__MetadataEntry::soap_dup(soap*) returns deep copy of s3__MetadataEntry, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__MetadataEntry::soap_del() deep deletes s3__MetadataEntry data members, use only after s3__MetadataEntry::soap_dup(NULL) (use soapcpp2 -Ed) class s3__MetadataEntry { public: /// Element "Name" of XSD type xs:string. std::string Name 1; ///< Required element. /// Element "Value" of XSD type xs:string. std::string Value 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":Status is a complexType. /// /// class s3__Status operations: /// - s3__Status* soap_new_s3__Status(soap*) allocate /// - s3__Status* soap_new_s3__Status(soap*, int num) allocate array /// - s3__Status* soap_new_req_s3__Status(soap*, ...) allocate, set required members /// - s3__Status* soap_new_set_s3__Status(soap*, ...) allocate, set all public members /// - s3__Status::soap_default(soap*) reset members to default /// - int soap_read_s3__Status(soap*, s3__Status*) deserialize from a stream /// - int soap_write_s3__Status(soap*, s3__Status*) serialize to a stream /// - s3__Status* s3__Status::soap_dup(soap*) returns deep copy of s3__Status, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__Status::soap_del() deep deletes s3__Status data members, use only after s3__Status::soap_dup(NULL) (use soapcpp2 -Ed) class s3__Status { public: /// Element "Code" of XSD type xs:int. int Code 1; ///< Required element. /// Element "Description" of XSD type xs:string. std::string Description 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":Result is a complexType. /// /// class s3__Result operations: /// - s3__Result* soap_new_s3__Result(soap*) allocate /// - s3__Result* soap_new_s3__Result(soap*, int num) allocate array /// - s3__Result* soap_new_req_s3__Result(soap*, ...) allocate, set required members /// - s3__Result* soap_new_set_s3__Result(soap*, ...) allocate, set all public members /// - s3__Result::soap_default(soap*) reset members to default /// - int soap_read_s3__Result(soap*, s3__Result*) deserialize from a stream /// - int soap_write_s3__Result(soap*, s3__Result*) serialize to a stream /// - s3__Result* s3__Result::soap_dup(soap*) returns deep copy of s3__Result, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__Result::soap_del() deep deletes s3__Result data members, use only after s3__Result::soap_dup(NULL) (use soapcpp2 -Ed) class s3__Result { public: /// Element "Status" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":Status. s3__Status* Status 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":CreateBucketResult is a complexType. /// /// class s3__CreateBucketResult operations: /// - s3__CreateBucketResult* soap_new_s3__CreateBucketResult(soap*) allocate /// - s3__CreateBucketResult* soap_new_s3__CreateBucketResult(soap*, int num) allocate array /// - s3__CreateBucketResult* soap_new_req_s3__CreateBucketResult(soap*, ...) allocate, set required members /// - s3__CreateBucketResult* soap_new_set_s3__CreateBucketResult(soap*, ...) allocate, set all public members /// - s3__CreateBucketResult::soap_default(soap*) reset members to default /// - int soap_read_s3__CreateBucketResult(soap*, s3__CreateBucketResult*) deserialize from a stream /// - int soap_write_s3__CreateBucketResult(soap*, s3__CreateBucketResult*) serialize to a stream /// - s3__CreateBucketResult* s3__CreateBucketResult::soap_dup(soap*) returns deep copy of s3__CreateBucketResult, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__CreateBucketResult::soap_del() deep deletes s3__CreateBucketResult data members, use only after s3__CreateBucketResult::soap_dup(NULL) (use soapcpp2 -Ed) class s3__CreateBucketResult { public: /// Element "BucketName" of XSD type xs:string. std::string BucketName 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":BucketLoggingStatus is a complexType. /// /// class s3__BucketLoggingStatus operations: /// - s3__BucketLoggingStatus* soap_new_s3__BucketLoggingStatus(soap*) allocate /// - s3__BucketLoggingStatus* soap_new_s3__BucketLoggingStatus(soap*, int num) allocate array /// - s3__BucketLoggingStatus* soap_new_req_s3__BucketLoggingStatus(soap*, ...) allocate, set required members /// - s3__BucketLoggingStatus* soap_new_set_s3__BucketLoggingStatus(soap*, ...) allocate, set all public members /// - s3__BucketLoggingStatus::soap_default(soap*) reset members to default /// - int soap_read_s3__BucketLoggingStatus(soap*, s3__BucketLoggingStatus*) deserialize from a stream /// - int soap_write_s3__BucketLoggingStatus(soap*, s3__BucketLoggingStatus*) serialize to a stream /// - s3__BucketLoggingStatus* s3__BucketLoggingStatus::soap_dup(soap*) returns deep copy of s3__BucketLoggingStatus, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__BucketLoggingStatus::soap_del() deep deletes s3__BucketLoggingStatus data members, use only after s3__BucketLoggingStatus::soap_dup(NULL) (use soapcpp2 -Ed) class s3__BucketLoggingStatus { public: /// Element "LoggingEnabled" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":LoggingSettings. s3__LoggingSettings* LoggingEnabled 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":LoggingSettings is a complexType. /// /// class s3__LoggingSettings operations: /// - s3__LoggingSettings* soap_new_s3__LoggingSettings(soap*) allocate /// - s3__LoggingSettings* soap_new_s3__LoggingSettings(soap*, int num) allocate array /// - s3__LoggingSettings* soap_new_req_s3__LoggingSettings(soap*, ...) allocate, set required members /// - s3__LoggingSettings* soap_new_set_s3__LoggingSettings(soap*, ...) allocate, set all public members /// - s3__LoggingSettings::soap_default(soap*) reset members to default /// - int soap_read_s3__LoggingSettings(soap*, s3__LoggingSettings*) deserialize from a stream /// - int soap_write_s3__LoggingSettings(soap*, s3__LoggingSettings*) serialize to a stream /// - s3__LoggingSettings* s3__LoggingSettings::soap_dup(soap*) returns deep copy of s3__LoggingSettings, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__LoggingSettings::soap_del() deep deletes s3__LoggingSettings data members, use only after s3__LoggingSettings::soap_dup(NULL) (use soapcpp2 -Ed) class s3__LoggingSettings { public: /// Element "TargetBucket" of XSD type xs:string. std::string TargetBucket 1; ///< Required element. /// Element "TargetPrefix" of XSD type xs:string. std::string TargetPrefix 1; ///< Required element. /// Element "TargetGrants" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":AccessControlList. s3__AccessControlList* TargetGrants 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":Grantee is an abstract complexType. /// /// class s3__Grantee operations: /// - s3__Grantee* soap_new_s3__Grantee(soap*) allocate /// - s3__Grantee* soap_new_s3__Grantee(soap*, int num) allocate array /// - s3__Grantee* soap_new_req_s3__Grantee(soap*, ...) allocate, set required members /// - s3__Grantee* soap_new_set_s3__Grantee(soap*, ...) allocate, set all public members /// - s3__Grantee::soap_default(soap*) reset members to default /// - int soap_read_s3__Grantee(soap*, s3__Grantee*) deserialize from a stream /// - int soap_write_s3__Grantee(soap*, s3__Grantee*) serialize to a stream /// - s3__Grantee* s3__Grantee::soap_dup(soap*) returns deep copy of s3__Grantee, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__Grantee::soap_del() deep deletes s3__Grantee data members, use only after s3__Grantee::soap_dup(NULL) (use soapcpp2 -Ed) class s3__Grantee { public: /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":Grant is a complexType. /// /// class s3__Grant operations: /// - s3__Grant* soap_new_s3__Grant(soap*) allocate /// - s3__Grant* soap_new_s3__Grant(soap*, int num) allocate array /// - s3__Grant* soap_new_req_s3__Grant(soap*, ...) allocate, set required members /// - s3__Grant* soap_new_set_s3__Grant(soap*, ...) allocate, set all public members /// - s3__Grant::soap_default(soap*) reset members to default /// - int soap_read_s3__Grant(soap*, s3__Grant*) deserialize from a stream /// - int soap_write_s3__Grant(soap*, s3__Grant*) serialize to a stream /// - s3__Grant* s3__Grant::soap_dup(soap*) returns deep copy of s3__Grant, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__Grant::soap_del() deep deletes s3__Grant data members, use only after s3__Grant::soap_dup(NULL) (use soapcpp2 -Ed) class s3__Grant { public: /// Element "Grantee" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":Grantee. s3__Grantee* Grantee 1; ///< Required element. /// Element "Permission" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":Permission. enum s3__Permission Permission 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":AccessControlList is a complexType. /// /// class s3__AccessControlList operations: /// - s3__AccessControlList* soap_new_s3__AccessControlList(soap*) allocate /// - s3__AccessControlList* soap_new_s3__AccessControlList(soap*, int num) allocate array /// - s3__AccessControlList* soap_new_req_s3__AccessControlList(soap*, ...) allocate, set required members /// - s3__AccessControlList* soap_new_set_s3__AccessControlList(soap*, ...) allocate, set all public members /// - s3__AccessControlList::soap_default(soap*) reset members to default /// - int soap_read_s3__AccessControlList(soap*, s3__AccessControlList*) deserialize from a stream /// - int soap_write_s3__AccessControlList(soap*, s3__AccessControlList*) serialize to a stream /// - s3__AccessControlList* s3__AccessControlList::soap_dup(soap*) returns deep copy of s3__AccessControlList, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__AccessControlList::soap_del() deep deletes s3__AccessControlList data members, use only after s3__AccessControlList::soap_dup(NULL) (use soapcpp2 -Ed) class s3__AccessControlList { public: /// Vector of s3__Grant* of length 0..100. std::vector Grant 0:100; /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":CreateBucketConfiguration is a complexType. /// /// class s3__CreateBucketConfiguration operations: /// - s3__CreateBucketConfiguration* soap_new_s3__CreateBucketConfiguration(soap*) allocate /// - s3__CreateBucketConfiguration* soap_new_s3__CreateBucketConfiguration(soap*, int num) allocate array /// - s3__CreateBucketConfiguration* soap_new_req_s3__CreateBucketConfiguration(soap*, ...) allocate, set required members /// - s3__CreateBucketConfiguration* soap_new_set_s3__CreateBucketConfiguration(soap*, ...) allocate, set all public members /// - s3__CreateBucketConfiguration::soap_default(soap*) reset members to default /// - int soap_read_s3__CreateBucketConfiguration(soap*, s3__CreateBucketConfiguration*) deserialize from a stream /// - int soap_write_s3__CreateBucketConfiguration(soap*, s3__CreateBucketConfiguration*) serialize to a stream /// - s3__CreateBucketConfiguration* s3__CreateBucketConfiguration::soap_dup(soap*) returns deep copy of s3__CreateBucketConfiguration, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__CreateBucketConfiguration::soap_del() deep deletes s3__CreateBucketConfiguration data members, use only after s3__CreateBucketConfiguration::soap_dup(NULL) (use soapcpp2 -Ed) class s3__CreateBucketConfiguration { public: /// Element "LocationConstraint" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":LocationConstraint. s3__LocationConstraint* LocationConstraint 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":AccessControlPolicy is a complexType. /// /// class s3__AccessControlPolicy operations: /// - s3__AccessControlPolicy* soap_new_s3__AccessControlPolicy(soap*) allocate /// - s3__AccessControlPolicy* soap_new_s3__AccessControlPolicy(soap*, int num) allocate array /// - s3__AccessControlPolicy* soap_new_req_s3__AccessControlPolicy(soap*, ...) allocate, set required members /// - s3__AccessControlPolicy* soap_new_set_s3__AccessControlPolicy(soap*, ...) allocate, set all public members /// - s3__AccessControlPolicy::soap_default(soap*) reset members to default /// - int soap_read_s3__AccessControlPolicy(soap*, s3__AccessControlPolicy*) deserialize from a stream /// - int soap_write_s3__AccessControlPolicy(soap*, s3__AccessControlPolicy*) serialize to a stream /// - s3__AccessControlPolicy* s3__AccessControlPolicy::soap_dup(soap*) returns deep copy of s3__AccessControlPolicy, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__AccessControlPolicy::soap_del() deep deletes s3__AccessControlPolicy data members, use only after s3__AccessControlPolicy::soap_dup(NULL) (use soapcpp2 -Ed) class s3__AccessControlPolicy { public: /// Element "Owner" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":CanonicalUser. s3__CanonicalUser* Owner 1; ///< Required element. /// Element "AccessControlList" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":AccessControlList. s3__AccessControlList* AccessControlList 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":PutObjectResult is a complexType. /// /// class s3__PutObjectResult operations: /// - s3__PutObjectResult* soap_new_s3__PutObjectResult(soap*) allocate /// - s3__PutObjectResult* soap_new_s3__PutObjectResult(soap*, int num) allocate array /// - s3__PutObjectResult* soap_new_req_s3__PutObjectResult(soap*, ...) allocate, set required members /// - s3__PutObjectResult* soap_new_set_s3__PutObjectResult(soap*, ...) allocate, set all public members /// - s3__PutObjectResult::soap_default(soap*) reset members to default /// - int soap_read_s3__PutObjectResult(soap*, s3__PutObjectResult*) deserialize from a stream /// - int soap_write_s3__PutObjectResult(soap*, s3__PutObjectResult*) serialize to a stream /// - s3__PutObjectResult* s3__PutObjectResult::soap_dup(soap*) returns deep copy of s3__PutObjectResult, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__PutObjectResult::soap_del() deep deletes s3__PutObjectResult data members, use only after s3__PutObjectResult::soap_dup(NULL) (use soapcpp2 -Ed) class s3__PutObjectResult { public: /// Element "ETag" of XSD type xs:string. std::string ETag 1; ///< Required element. /// Element "LastModified" of XSD type xs:dateTime. time_t LastModified 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":ListEntry is a complexType. /// /// class s3__ListEntry operations: /// - s3__ListEntry* soap_new_s3__ListEntry(soap*) allocate /// - s3__ListEntry* soap_new_s3__ListEntry(soap*, int num) allocate array /// - s3__ListEntry* soap_new_req_s3__ListEntry(soap*, ...) allocate, set required members /// - s3__ListEntry* soap_new_set_s3__ListEntry(soap*, ...) allocate, set all public members /// - s3__ListEntry::soap_default(soap*) reset members to default /// - int soap_read_s3__ListEntry(soap*, s3__ListEntry*) deserialize from a stream /// - int soap_write_s3__ListEntry(soap*, s3__ListEntry*) serialize to a stream /// - s3__ListEntry* s3__ListEntry::soap_dup(soap*) returns deep copy of s3__ListEntry, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__ListEntry::soap_del() deep deletes s3__ListEntry data members, use only after s3__ListEntry::soap_dup(NULL) (use soapcpp2 -Ed) class s3__ListEntry { public: /// Element "Key" of XSD type xs:string. std::string Key 1; ///< Required element. /// Element "LastModified" of XSD type xs:dateTime. time_t LastModified 1; ///< Required element. /// Element "ETag" of XSD type xs:string. std::string ETag 1; ///< Required element. /// Element "Size" of XSD type xs:long. LONG64 Size 1; ///< Required element. /// Element "Owner" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":CanonicalUser. s3__CanonicalUser* Owner 0; ///< Optional element. /// Element "StorageClass" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":StorageClass. enum s3__StorageClass StorageClass 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":VersionEntry is a complexType. /// /// class s3__VersionEntry operations: /// - s3__VersionEntry* soap_new_s3__VersionEntry(soap*) allocate /// - s3__VersionEntry* soap_new_s3__VersionEntry(soap*, int num) allocate array /// - s3__VersionEntry* soap_new_req_s3__VersionEntry(soap*, ...) allocate, set required members /// - s3__VersionEntry* soap_new_set_s3__VersionEntry(soap*, ...) allocate, set all public members /// - s3__VersionEntry::soap_default(soap*) reset members to default /// - int soap_read_s3__VersionEntry(soap*, s3__VersionEntry*) deserialize from a stream /// - int soap_write_s3__VersionEntry(soap*, s3__VersionEntry*) serialize to a stream /// - s3__VersionEntry* s3__VersionEntry::soap_dup(soap*) returns deep copy of s3__VersionEntry, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__VersionEntry::soap_del() deep deletes s3__VersionEntry data members, use only after s3__VersionEntry::soap_dup(NULL) (use soapcpp2 -Ed) class s3__VersionEntry { public: /// Element "Key" of XSD type xs:string. std::string Key 1; ///< Required element. /// Element "VersionId" of XSD type xs:string. std::string VersionId 1; ///< Required element. /// Element "IsLatest" of XSD type xs:boolean. bool IsLatest 1; ///< Required element. /// Element "LastModified" of XSD type xs:dateTime. time_t LastModified 1; ///< Required element. /// Element "ETag" of XSD type xs:string. std::string ETag 1; ///< Required element. /// Element "Size" of XSD type xs:long. LONG64 Size 1; ///< Required element. /// Element "Owner" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":CanonicalUser. s3__CanonicalUser* Owner 0; ///< Optional element. /// Element "StorageClass" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":StorageClass. enum s3__StorageClass StorageClass 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":DeleteMarkerEntry is a complexType. /// /// class s3__DeleteMarkerEntry operations: /// - s3__DeleteMarkerEntry* soap_new_s3__DeleteMarkerEntry(soap*) allocate /// - s3__DeleteMarkerEntry* soap_new_s3__DeleteMarkerEntry(soap*, int num) allocate array /// - s3__DeleteMarkerEntry* soap_new_req_s3__DeleteMarkerEntry(soap*, ...) allocate, set required members /// - s3__DeleteMarkerEntry* soap_new_set_s3__DeleteMarkerEntry(soap*, ...) allocate, set all public members /// - s3__DeleteMarkerEntry::soap_default(soap*) reset members to default /// - int soap_read_s3__DeleteMarkerEntry(soap*, s3__DeleteMarkerEntry*) deserialize from a stream /// - int soap_write_s3__DeleteMarkerEntry(soap*, s3__DeleteMarkerEntry*) serialize to a stream /// - s3__DeleteMarkerEntry* s3__DeleteMarkerEntry::soap_dup(soap*) returns deep copy of s3__DeleteMarkerEntry, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__DeleteMarkerEntry::soap_del() deep deletes s3__DeleteMarkerEntry data members, use only after s3__DeleteMarkerEntry::soap_dup(NULL) (use soapcpp2 -Ed) class s3__DeleteMarkerEntry { public: /// Element "Key" of XSD type xs:string. std::string Key 1; ///< Required element. /// Element "VersionId" of XSD type xs:string. std::string VersionId 1; ///< Required element. /// Element "IsLatest" of XSD type xs:boolean. bool IsLatest 1; ///< Required element. /// Element "LastModified" of XSD type xs:dateTime. time_t LastModified 1; ///< Required element. /// Element "Owner" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":CanonicalUser. s3__CanonicalUser* Owner 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":PrefixEntry is a complexType. /// /// class s3__PrefixEntry operations: /// - s3__PrefixEntry* soap_new_s3__PrefixEntry(soap*) allocate /// - s3__PrefixEntry* soap_new_s3__PrefixEntry(soap*, int num) allocate array /// - s3__PrefixEntry* soap_new_req_s3__PrefixEntry(soap*, ...) allocate, set required members /// - s3__PrefixEntry* soap_new_set_s3__PrefixEntry(soap*, ...) allocate, set all public members /// - s3__PrefixEntry::soap_default(soap*) reset members to default /// - int soap_read_s3__PrefixEntry(soap*, s3__PrefixEntry*) deserialize from a stream /// - int soap_write_s3__PrefixEntry(soap*, s3__PrefixEntry*) serialize to a stream /// - s3__PrefixEntry* s3__PrefixEntry::soap_dup(soap*) returns deep copy of s3__PrefixEntry, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__PrefixEntry::soap_del() deep deletes s3__PrefixEntry data members, use only after s3__PrefixEntry::soap_dup(NULL) (use soapcpp2 -Ed) class s3__PrefixEntry { public: /// Element "Prefix" of XSD type xs:string. std::string Prefix 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":ListBucketResult is a complexType. /// /// class s3__ListBucketResult operations: /// - s3__ListBucketResult* soap_new_s3__ListBucketResult(soap*) allocate /// - s3__ListBucketResult* soap_new_s3__ListBucketResult(soap*, int num) allocate array /// - s3__ListBucketResult* soap_new_req_s3__ListBucketResult(soap*, ...) allocate, set required members /// - s3__ListBucketResult* soap_new_set_s3__ListBucketResult(soap*, ...) allocate, set all public members /// - s3__ListBucketResult::soap_default(soap*) reset members to default /// - int soap_read_s3__ListBucketResult(soap*, s3__ListBucketResult*) deserialize from a stream /// - int soap_write_s3__ListBucketResult(soap*, s3__ListBucketResult*) serialize to a stream /// - s3__ListBucketResult* s3__ListBucketResult::soap_dup(soap*) returns deep copy of s3__ListBucketResult, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__ListBucketResult::soap_del() deep deletes s3__ListBucketResult data members, use only after s3__ListBucketResult::soap_dup(NULL) (use soapcpp2 -Ed) class s3__ListBucketResult { public: /// Vector of s3__MetadataEntry* of length 0..unbounded. std::vector Metadata 0; /// Element "Name" of XSD type xs:string. std::string Name 1; ///< Required element. /// Element "Prefix" of XSD type xs:string. std::string Prefix 1; ///< Required element. /// Element "Marker" of XSD type xs:string. std::string Marker 1; ///< Required element. /// Element "NextMarker" of XSD type xs:string. std::string* NextMarker 0; ///< Optional element. /// Element "MaxKeys" of XSD type xs:int. int MaxKeys 1; ///< Required element. /// Element "Delimiter" of XSD type xs:string. std::string* Delimiter 0; ///< Optional element. /// Element "IsTruncated" of XSD type xs:boolean. bool IsTruncated 1; ///< Required element. /// Vector of s3__ListEntry* of length 0..unbounded. std::vector Contents 0; /// Vector of s3__PrefixEntry* of length 0..unbounded. std::vector CommonPrefixes 0; /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":ListVersionsResult is a complexType. /// /// class s3__ListVersionsResult operations: /// - s3__ListVersionsResult* soap_new_s3__ListVersionsResult(soap*) allocate /// - s3__ListVersionsResult* soap_new_s3__ListVersionsResult(soap*, int num) allocate array /// - s3__ListVersionsResult* soap_new_req_s3__ListVersionsResult(soap*, ...) allocate, set required members /// - s3__ListVersionsResult* soap_new_set_s3__ListVersionsResult(soap*, ...) allocate, set all public members /// - s3__ListVersionsResult::soap_default(soap*) reset members to default /// - int soap_read_s3__ListVersionsResult(soap*, s3__ListVersionsResult*) deserialize from a stream /// - int soap_write_s3__ListVersionsResult(soap*, s3__ListVersionsResult*) serialize to a stream /// - s3__ListVersionsResult* s3__ListVersionsResult::soap_dup(soap*) returns deep copy of s3__ListVersionsResult, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__ListVersionsResult::soap_del() deep deletes s3__ListVersionsResult data members, use only after s3__ListVersionsResult::soap_dup(NULL) (use soapcpp2 -Ed) class s3__ListVersionsResult { public: /// Vector of s3__MetadataEntry* of length 0..unbounded. std::vector Metadata 0; /// Element "Name" of XSD type xs:string. std::string Name 1; ///< Required element. /// Element "Prefix" of XSD type xs:string. std::string Prefix 1; ///< Required element. /// Element "KeyMarker" of XSD type xs:string. std::string KeyMarker 1; ///< Required element. /// Element "VersionIdMarker" of XSD type xs:string. std::string VersionIdMarker 1; ///< Required element. /// Element "NextKeyMarker" of XSD type xs:string. std::string* NextKeyMarker 0; ///< Optional element. /// Element "NextVersionIdMarker" of XSD type xs:string. std::string* NextVersionIdMarker 0; ///< Optional element. /// Element "MaxKeys" of XSD type xs:int. int MaxKeys 1; ///< Required element. /// Element "Delimiter" of XSD type xs:string. std::string* Delimiter 0; ///< Optional element. /// Element "IsTruncated" of XSD type xs:boolean. bool IsTruncated 1; ///< Required element. // BEGIN CHOICE $int __size_ListVersionsResult 0; class __s3__union_ListVersionsResult { $int __union_ListVersionsResult 0; ///< Union _s3__union_ListVersionsResult selector: set to SOAP_UNION__s3__union_ListVersionsResult_ or 0 to omit union _s3__union_ListVersionsResult { /// Element "Version" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":VersionEntry. s3__VersionEntry* Version 1; ///< Required element. /// Element "DeleteMarker" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":DeleteMarkerEntry. s3__DeleteMarkerEntry* DeleteMarker 1; ///< Required element. } union_ListVersionsResult ; } *__union_ListVersionsResult ; // END OF CHOICE /// Vector of s3__PrefixEntry* of length 0..unbounded. std::vector CommonPrefixes 0; /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":ListAllMyBucketsEntry is a complexType. /// /// class s3__ListAllMyBucketsEntry operations: /// - s3__ListAllMyBucketsEntry* soap_new_s3__ListAllMyBucketsEntry(soap*) allocate /// - s3__ListAllMyBucketsEntry* soap_new_s3__ListAllMyBucketsEntry(soap*, int num) allocate array /// - s3__ListAllMyBucketsEntry* soap_new_req_s3__ListAllMyBucketsEntry(soap*, ...) allocate, set required members /// - s3__ListAllMyBucketsEntry* soap_new_set_s3__ListAllMyBucketsEntry(soap*, ...) allocate, set all public members /// - s3__ListAllMyBucketsEntry::soap_default(soap*) reset members to default /// - int soap_read_s3__ListAllMyBucketsEntry(soap*, s3__ListAllMyBucketsEntry*) deserialize from a stream /// - int soap_write_s3__ListAllMyBucketsEntry(soap*, s3__ListAllMyBucketsEntry*) serialize to a stream /// - s3__ListAllMyBucketsEntry* s3__ListAllMyBucketsEntry::soap_dup(soap*) returns deep copy of s3__ListAllMyBucketsEntry, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__ListAllMyBucketsEntry::soap_del() deep deletes s3__ListAllMyBucketsEntry data members, use only after s3__ListAllMyBucketsEntry::soap_dup(NULL) (use soapcpp2 -Ed) class s3__ListAllMyBucketsEntry { public: /// Element "Name" of XSD type xs:string. std::string Name 1; ///< Required element. /// Element "CreationDate" of XSD type xs:dateTime. time_t CreationDate 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":ListAllMyBucketsResult is a complexType. /// /// class s3__ListAllMyBucketsResult operations: /// - s3__ListAllMyBucketsResult* soap_new_s3__ListAllMyBucketsResult(soap*) allocate /// - s3__ListAllMyBucketsResult* soap_new_s3__ListAllMyBucketsResult(soap*, int num) allocate array /// - s3__ListAllMyBucketsResult* soap_new_req_s3__ListAllMyBucketsResult(soap*, ...) allocate, set required members /// - s3__ListAllMyBucketsResult* soap_new_set_s3__ListAllMyBucketsResult(soap*, ...) allocate, set all public members /// - s3__ListAllMyBucketsResult::soap_default(soap*) reset members to default /// - int soap_read_s3__ListAllMyBucketsResult(soap*, s3__ListAllMyBucketsResult*) deserialize from a stream /// - int soap_write_s3__ListAllMyBucketsResult(soap*, s3__ListAllMyBucketsResult*) serialize to a stream /// - s3__ListAllMyBucketsResult* s3__ListAllMyBucketsResult::soap_dup(soap*) returns deep copy of s3__ListAllMyBucketsResult, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__ListAllMyBucketsResult::soap_del() deep deletes s3__ListAllMyBucketsResult data members, use only after s3__ListAllMyBucketsResult::soap_dup(NULL) (use soapcpp2 -Ed) class s3__ListAllMyBucketsResult { public: /// Element "Owner" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":CanonicalUser. s3__CanonicalUser* Owner 1; ///< Required element. /// Element "Buckets" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":ListAllMyBucketsList. s3__ListAllMyBucketsList* Buckets 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":ListAllMyBucketsList is a complexType. /// /// class s3__ListAllMyBucketsList operations: /// - s3__ListAllMyBucketsList* soap_new_s3__ListAllMyBucketsList(soap*) allocate /// - s3__ListAllMyBucketsList* soap_new_s3__ListAllMyBucketsList(soap*, int num) allocate array /// - s3__ListAllMyBucketsList* soap_new_req_s3__ListAllMyBucketsList(soap*, ...) allocate, set required members /// - s3__ListAllMyBucketsList* soap_new_set_s3__ListAllMyBucketsList(soap*, ...) allocate, set all public members /// - s3__ListAllMyBucketsList::soap_default(soap*) reset members to default /// - int soap_read_s3__ListAllMyBucketsList(soap*, s3__ListAllMyBucketsList*) deserialize from a stream /// - int soap_write_s3__ListAllMyBucketsList(soap*, s3__ListAllMyBucketsList*) serialize to a stream /// - s3__ListAllMyBucketsList* s3__ListAllMyBucketsList::soap_dup(soap*) returns deep copy of s3__ListAllMyBucketsList, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__ListAllMyBucketsList::soap_del() deep deletes s3__ListAllMyBucketsList data members, use only after s3__ListAllMyBucketsList::soap_dup(NULL) (use soapcpp2 -Ed) class s3__ListAllMyBucketsList { public: /// Vector of s3__ListAllMyBucketsEntry* of length 0..unbounded. std::vector Bucket 0; /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":CopyObjectResult is a complexType. /// /// class s3__CopyObjectResult operations: /// - s3__CopyObjectResult* soap_new_s3__CopyObjectResult(soap*) allocate /// - s3__CopyObjectResult* soap_new_s3__CopyObjectResult(soap*, int num) allocate array /// - s3__CopyObjectResult* soap_new_req_s3__CopyObjectResult(soap*, ...) allocate, set required members /// - s3__CopyObjectResult* soap_new_set_s3__CopyObjectResult(soap*, ...) allocate, set all public members /// - s3__CopyObjectResult::soap_default(soap*) reset members to default /// - int soap_read_s3__CopyObjectResult(soap*, s3__CopyObjectResult*) deserialize from a stream /// - int soap_write_s3__CopyObjectResult(soap*, s3__CopyObjectResult*) serialize to a stream /// - s3__CopyObjectResult* s3__CopyObjectResult::soap_dup(soap*) returns deep copy of s3__CopyObjectResult, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__CopyObjectResult::soap_del() deep deletes s3__CopyObjectResult data members, use only after s3__CopyObjectResult::soap_dup(NULL) (use soapcpp2 -Ed) class s3__CopyObjectResult { public: /// Element "LastModified" of XSD type xs:dateTime. time_t LastModified 1; ///< Required element. /// Element "ETag" of XSD type xs:string. std::string ETag 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":RequestPaymentConfiguration is a complexType. /// /// class s3__RequestPaymentConfiguration operations: /// - s3__RequestPaymentConfiguration* soap_new_s3__RequestPaymentConfiguration(soap*) allocate /// - s3__RequestPaymentConfiguration* soap_new_s3__RequestPaymentConfiguration(soap*, int num) allocate array /// - s3__RequestPaymentConfiguration* soap_new_req_s3__RequestPaymentConfiguration(soap*, ...) allocate, set required members /// - s3__RequestPaymentConfiguration* soap_new_set_s3__RequestPaymentConfiguration(soap*, ...) allocate, set all public members /// - s3__RequestPaymentConfiguration::soap_default(soap*) reset members to default /// - int soap_read_s3__RequestPaymentConfiguration(soap*, s3__RequestPaymentConfiguration*) deserialize from a stream /// - int soap_write_s3__RequestPaymentConfiguration(soap*, s3__RequestPaymentConfiguration*) serialize to a stream /// - s3__RequestPaymentConfiguration* s3__RequestPaymentConfiguration::soap_dup(soap*) returns deep copy of s3__RequestPaymentConfiguration, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__RequestPaymentConfiguration::soap_del() deep deletes s3__RequestPaymentConfiguration data members, use only after s3__RequestPaymentConfiguration::soap_dup(NULL) (use soapcpp2 -Ed) class s3__RequestPaymentConfiguration { public: /// Element "Payer" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":Payer. enum s3__Payer Payer 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":VersioningConfiguration is a complexType. /// /// class s3__VersioningConfiguration operations: /// - s3__VersioningConfiguration* soap_new_s3__VersioningConfiguration(soap*) allocate /// - s3__VersioningConfiguration* soap_new_s3__VersioningConfiguration(soap*, int num) allocate array /// - s3__VersioningConfiguration* soap_new_req_s3__VersioningConfiguration(soap*, ...) allocate, set required members /// - s3__VersioningConfiguration* soap_new_set_s3__VersioningConfiguration(soap*, ...) allocate, set all public members /// - s3__VersioningConfiguration::soap_default(soap*) reset members to default /// - int soap_read_s3__VersioningConfiguration(soap*, s3__VersioningConfiguration*) deserialize from a stream /// - int soap_write_s3__VersioningConfiguration(soap*, s3__VersioningConfiguration*) serialize to a stream /// - s3__VersioningConfiguration* s3__VersioningConfiguration::soap_dup(soap*) returns deep copy of s3__VersioningConfiguration, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__VersioningConfiguration::soap_del() deep deletes s3__VersioningConfiguration data members, use only after s3__VersioningConfiguration::soap_dup(NULL) (use soapcpp2 -Ed) class s3__VersioningConfiguration { public: /// Element "Status" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":VersioningStatus. enum s3__VersioningStatus* Status 0; ///< Optional element. /// Element "MfaDelete" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":MfaDeleteStatus. enum s3__MfaDeleteStatus* MfaDelete 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":NotificationConfiguration is a complexType. /// /// class s3__NotificationConfiguration operations: /// - s3__NotificationConfiguration* soap_new_s3__NotificationConfiguration(soap*) allocate /// - s3__NotificationConfiguration* soap_new_s3__NotificationConfiguration(soap*, int num) allocate array /// - s3__NotificationConfiguration* soap_new_req_s3__NotificationConfiguration(soap*, ...) allocate, set required members /// - s3__NotificationConfiguration* soap_new_set_s3__NotificationConfiguration(soap*, ...) allocate, set all public members /// - s3__NotificationConfiguration::soap_default(soap*) reset members to default /// - int soap_read_s3__NotificationConfiguration(soap*, s3__NotificationConfiguration*) deserialize from a stream /// - int soap_write_s3__NotificationConfiguration(soap*, s3__NotificationConfiguration*) serialize to a stream /// - s3__NotificationConfiguration* s3__NotificationConfiguration::soap_dup(soap*) returns deep copy of s3__NotificationConfiguration, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__NotificationConfiguration::soap_del() deep deletes s3__NotificationConfiguration data members, use only after s3__NotificationConfiguration::soap_dup(NULL) (use soapcpp2 -Ed) class s3__NotificationConfiguration { public: /// Vector of s3__TopicConfiguration* of length 0..unbounded. std::vector TopicConfiguration 0; /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":TopicConfiguration is a complexType. /// /// class s3__TopicConfiguration operations: /// - s3__TopicConfiguration* soap_new_s3__TopicConfiguration(soap*) allocate /// - s3__TopicConfiguration* soap_new_s3__TopicConfiguration(soap*, int num) allocate array /// - s3__TopicConfiguration* soap_new_req_s3__TopicConfiguration(soap*, ...) allocate, set required members /// - s3__TopicConfiguration* soap_new_set_s3__TopicConfiguration(soap*, ...) allocate, set all public members /// - s3__TopicConfiguration::soap_default(soap*) reset members to default /// - int soap_read_s3__TopicConfiguration(soap*, s3__TopicConfiguration*) deserialize from a stream /// - int soap_write_s3__TopicConfiguration(soap*, s3__TopicConfiguration*) serialize to a stream /// - s3__TopicConfiguration* s3__TopicConfiguration::soap_dup(soap*) returns deep copy of s3__TopicConfiguration, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__TopicConfiguration::soap_del() deep deletes s3__TopicConfiguration data members, use only after s3__TopicConfiguration::soap_dup(NULL) (use soapcpp2 -Ed) class s3__TopicConfiguration { public: /// Element "Topic" of XSD type xs:string. std::string Topic 1; ///< Required element. /// Vector of std::string of length 1..unbounded. std::vector Event 1; /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":CreateBucket /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":CreateBucket is a complexType. /// /// class _s3__CreateBucket operations: /// - _s3__CreateBucket* soap_new__s3__CreateBucket(soap*) allocate /// - _s3__CreateBucket* soap_new__s3__CreateBucket(soap*, int num) allocate array /// - _s3__CreateBucket* soap_new_req__s3__CreateBucket(soap*, ...) allocate, set required members /// - _s3__CreateBucket* soap_new_set__s3__CreateBucket(soap*, ...) allocate, set all public members /// - _s3__CreateBucket::soap_default(soap*) reset members to default /// - int soap_read__s3__CreateBucket(soap*, _s3__CreateBucket*) deserialize from a stream /// - int soap_write__s3__CreateBucket(soap*, _s3__CreateBucket*) serialize to a stream /// - _s3__CreateBucket* _s3__CreateBucket::soap_dup(soap*) returns deep copy of _s3__CreateBucket, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__CreateBucket::soap_del() deep deletes _s3__CreateBucket data members, use only after _s3__CreateBucket::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__CreateBucket { public: /// Element "Bucket" of XSD type xs:string. std::string Bucket 1; ///< Required element. /// Element "AccessControlList" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":AccessControlList. s3__AccessControlList* AccessControlList 0; ///< Optional element. /// Element "AWSAccessKeyId" of XSD type xs:string. std::string* AWSAccessKeyId 0; ///< Optional element. /// Element "Timestamp" of XSD type xs:dateTime. time_t* Timestamp 0; ///< Optional element. /// Element "Signature" of XSD type xs:string. std::string* Signature 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":CreateBucketResponse /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":CreateBucketResponse is a complexType. /// /// class _s3__CreateBucketResponse operations: /// - _s3__CreateBucketResponse* soap_new__s3__CreateBucketResponse(soap*) allocate /// - _s3__CreateBucketResponse* soap_new__s3__CreateBucketResponse(soap*, int num) allocate array /// - _s3__CreateBucketResponse* soap_new_req__s3__CreateBucketResponse(soap*, ...) allocate, set required members /// - _s3__CreateBucketResponse* soap_new_set__s3__CreateBucketResponse(soap*, ...) allocate, set all public members /// - _s3__CreateBucketResponse::soap_default(soap*) reset members to default /// - int soap_read__s3__CreateBucketResponse(soap*, _s3__CreateBucketResponse*) deserialize from a stream /// - int soap_write__s3__CreateBucketResponse(soap*, _s3__CreateBucketResponse*) serialize to a stream /// - _s3__CreateBucketResponse* _s3__CreateBucketResponse::soap_dup(soap*) returns deep copy of _s3__CreateBucketResponse, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__CreateBucketResponse::soap_del() deep deletes _s3__CreateBucketResponse data members, use only after _s3__CreateBucketResponse::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__CreateBucketResponse { public: /// Element "CreateBucketReturn" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":CreateBucketResult. s3__CreateBucketResult* CreateBucketReturn 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":DeleteBucket /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":DeleteBucket is a complexType. /// /// class _s3__DeleteBucket operations: /// - _s3__DeleteBucket* soap_new__s3__DeleteBucket(soap*) allocate /// - _s3__DeleteBucket* soap_new__s3__DeleteBucket(soap*, int num) allocate array /// - _s3__DeleteBucket* soap_new_req__s3__DeleteBucket(soap*, ...) allocate, set required members /// - _s3__DeleteBucket* soap_new_set__s3__DeleteBucket(soap*, ...) allocate, set all public members /// - _s3__DeleteBucket::soap_default(soap*) reset members to default /// - int soap_read__s3__DeleteBucket(soap*, _s3__DeleteBucket*) deserialize from a stream /// - int soap_write__s3__DeleteBucket(soap*, _s3__DeleteBucket*) serialize to a stream /// - _s3__DeleteBucket* _s3__DeleteBucket::soap_dup(soap*) returns deep copy of _s3__DeleteBucket, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__DeleteBucket::soap_del() deep deletes _s3__DeleteBucket data members, use only after _s3__DeleteBucket::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__DeleteBucket { public: /// Element "Bucket" of XSD type xs:string. std::string Bucket 1; ///< Required element. /// Element "AWSAccessKeyId" of XSD type xs:string. std::string* AWSAccessKeyId 0; ///< Optional element. /// Element "Timestamp" of XSD type xs:dateTime. time_t* Timestamp 0; ///< Optional element. /// Element "Signature" of XSD type xs:string. std::string* Signature 0; ///< Optional element. /// Element "Credential" of XSD type xs:string. std::string* Credential 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":DeleteBucketResponse /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":DeleteBucketResponse is a complexType. /// /// class _s3__DeleteBucketResponse operations: /// - _s3__DeleteBucketResponse* soap_new__s3__DeleteBucketResponse(soap*) allocate /// - _s3__DeleteBucketResponse* soap_new__s3__DeleteBucketResponse(soap*, int num) allocate array /// - _s3__DeleteBucketResponse* soap_new_req__s3__DeleteBucketResponse(soap*, ...) allocate, set required members /// - _s3__DeleteBucketResponse* soap_new_set__s3__DeleteBucketResponse(soap*, ...) allocate, set all public members /// - _s3__DeleteBucketResponse::soap_default(soap*) reset members to default /// - int soap_read__s3__DeleteBucketResponse(soap*, _s3__DeleteBucketResponse*) deserialize from a stream /// - int soap_write__s3__DeleteBucketResponse(soap*, _s3__DeleteBucketResponse*) serialize to a stream /// - _s3__DeleteBucketResponse* _s3__DeleteBucketResponse::soap_dup(soap*) returns deep copy of _s3__DeleteBucketResponse, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__DeleteBucketResponse::soap_del() deep deletes _s3__DeleteBucketResponse data members, use only after _s3__DeleteBucketResponse::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__DeleteBucketResponse { public: /// Element "DeleteBucketResponse" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":Status. s3__Status* DeleteBucketResponse 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":GetBucketLoggingStatus /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":GetBucketLoggingStatus is a complexType. /// /// class _s3__GetBucketLoggingStatus operations: /// - _s3__GetBucketLoggingStatus* soap_new__s3__GetBucketLoggingStatus(soap*) allocate /// - _s3__GetBucketLoggingStatus* soap_new__s3__GetBucketLoggingStatus(soap*, int num) allocate array /// - _s3__GetBucketLoggingStatus* soap_new_req__s3__GetBucketLoggingStatus(soap*, ...) allocate, set required members /// - _s3__GetBucketLoggingStatus* soap_new_set__s3__GetBucketLoggingStatus(soap*, ...) allocate, set all public members /// - _s3__GetBucketLoggingStatus::soap_default(soap*) reset members to default /// - int soap_read__s3__GetBucketLoggingStatus(soap*, _s3__GetBucketLoggingStatus*) deserialize from a stream /// - int soap_write__s3__GetBucketLoggingStatus(soap*, _s3__GetBucketLoggingStatus*) serialize to a stream /// - _s3__GetBucketLoggingStatus* _s3__GetBucketLoggingStatus::soap_dup(soap*) returns deep copy of _s3__GetBucketLoggingStatus, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__GetBucketLoggingStatus::soap_del() deep deletes _s3__GetBucketLoggingStatus data members, use only after _s3__GetBucketLoggingStatus::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__GetBucketLoggingStatus { public: /// Element "Bucket" of XSD type xs:string. std::string Bucket 1; ///< Required element. /// Element "AWSAccessKeyId" of XSD type xs:string. std::string* AWSAccessKeyId 0; ///< Optional element. /// Element "Timestamp" of XSD type xs:dateTime. time_t* Timestamp 0; ///< Optional element. /// Element "Signature" of XSD type xs:string. std::string* Signature 0; ///< Optional element. /// Element "Credential" of XSD type xs:string. std::string* Credential 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":GetBucketLoggingStatusResponse /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":GetBucketLoggingStatusResponse is a complexType. /// /// class _s3__GetBucketLoggingStatusResponse operations: /// - _s3__GetBucketLoggingStatusResponse* soap_new__s3__GetBucketLoggingStatusResponse(soap*) allocate /// - _s3__GetBucketLoggingStatusResponse* soap_new__s3__GetBucketLoggingStatusResponse(soap*, int num) allocate array /// - _s3__GetBucketLoggingStatusResponse* soap_new_req__s3__GetBucketLoggingStatusResponse(soap*, ...) allocate, set required members /// - _s3__GetBucketLoggingStatusResponse* soap_new_set__s3__GetBucketLoggingStatusResponse(soap*, ...) allocate, set all public members /// - _s3__GetBucketLoggingStatusResponse::soap_default(soap*) reset members to default /// - int soap_read__s3__GetBucketLoggingStatusResponse(soap*, _s3__GetBucketLoggingStatusResponse*) deserialize from a stream /// - int soap_write__s3__GetBucketLoggingStatusResponse(soap*, _s3__GetBucketLoggingStatusResponse*) serialize to a stream /// - _s3__GetBucketLoggingStatusResponse* _s3__GetBucketLoggingStatusResponse::soap_dup(soap*) returns deep copy of _s3__GetBucketLoggingStatusResponse, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__GetBucketLoggingStatusResponse::soap_del() deep deletes _s3__GetBucketLoggingStatusResponse data members, use only after _s3__GetBucketLoggingStatusResponse::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__GetBucketLoggingStatusResponse { public: /// Element "GetBucketLoggingStatusResponse" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":BucketLoggingStatus. s3__BucketLoggingStatus* GetBucketLoggingStatusResponse 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":SetBucketLoggingStatus /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":SetBucketLoggingStatus is a complexType. /// /// class _s3__SetBucketLoggingStatus operations: /// - _s3__SetBucketLoggingStatus* soap_new__s3__SetBucketLoggingStatus(soap*) allocate /// - _s3__SetBucketLoggingStatus* soap_new__s3__SetBucketLoggingStatus(soap*, int num) allocate array /// - _s3__SetBucketLoggingStatus* soap_new_req__s3__SetBucketLoggingStatus(soap*, ...) allocate, set required members /// - _s3__SetBucketLoggingStatus* soap_new_set__s3__SetBucketLoggingStatus(soap*, ...) allocate, set all public members /// - _s3__SetBucketLoggingStatus::soap_default(soap*) reset members to default /// - int soap_read__s3__SetBucketLoggingStatus(soap*, _s3__SetBucketLoggingStatus*) deserialize from a stream /// - int soap_write__s3__SetBucketLoggingStatus(soap*, _s3__SetBucketLoggingStatus*) serialize to a stream /// - _s3__SetBucketLoggingStatus* _s3__SetBucketLoggingStatus::soap_dup(soap*) returns deep copy of _s3__SetBucketLoggingStatus, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__SetBucketLoggingStatus::soap_del() deep deletes _s3__SetBucketLoggingStatus data members, use only after _s3__SetBucketLoggingStatus::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__SetBucketLoggingStatus { public: /// Element "Bucket" of XSD type xs:string. std::string Bucket 1; ///< Required element. /// Element "AWSAccessKeyId" of XSD type xs:string. std::string* AWSAccessKeyId 0; ///< Optional element. /// Element "Timestamp" of XSD type xs:dateTime. time_t* Timestamp 0; ///< Optional element. /// Element "Signature" of XSD type xs:string. std::string* Signature 0; ///< Optional element. /// Element "Credential" of XSD type xs:string. std::string* Credential 0; ///< Optional element. /// Element "BucketLoggingStatus" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":BucketLoggingStatus. s3__BucketLoggingStatus* BucketLoggingStatus 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":SetBucketLoggingStatusResponse /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":SetBucketLoggingStatusResponse is a complexType. /// /// class _s3__SetBucketLoggingStatusResponse operations: /// - _s3__SetBucketLoggingStatusResponse* soap_new__s3__SetBucketLoggingStatusResponse(soap*) allocate /// - _s3__SetBucketLoggingStatusResponse* soap_new__s3__SetBucketLoggingStatusResponse(soap*, int num) allocate array /// - _s3__SetBucketLoggingStatusResponse* soap_new_req__s3__SetBucketLoggingStatusResponse(soap*, ...) allocate, set required members /// - _s3__SetBucketLoggingStatusResponse* soap_new_set__s3__SetBucketLoggingStatusResponse(soap*, ...) allocate, set all public members /// - _s3__SetBucketLoggingStatusResponse::soap_default(soap*) reset members to default /// - int soap_read__s3__SetBucketLoggingStatusResponse(soap*, _s3__SetBucketLoggingStatusResponse*) deserialize from a stream /// - int soap_write__s3__SetBucketLoggingStatusResponse(soap*, _s3__SetBucketLoggingStatusResponse*) serialize to a stream /// - _s3__SetBucketLoggingStatusResponse* _s3__SetBucketLoggingStatusResponse::soap_dup(soap*) returns deep copy of _s3__SetBucketLoggingStatusResponse, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__SetBucketLoggingStatusResponse::soap_del() deep deletes _s3__SetBucketLoggingStatusResponse data members, use only after _s3__SetBucketLoggingStatusResponse::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__SetBucketLoggingStatusResponse { public: /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":GetObjectAccessControlPolicy /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":GetObjectAccessControlPolicy is a complexType. /// /// class _s3__GetObjectAccessControlPolicy operations: /// - _s3__GetObjectAccessControlPolicy* soap_new__s3__GetObjectAccessControlPolicy(soap*) allocate /// - _s3__GetObjectAccessControlPolicy* soap_new__s3__GetObjectAccessControlPolicy(soap*, int num) allocate array /// - _s3__GetObjectAccessControlPolicy* soap_new_req__s3__GetObjectAccessControlPolicy(soap*, ...) allocate, set required members /// - _s3__GetObjectAccessControlPolicy* soap_new_set__s3__GetObjectAccessControlPolicy(soap*, ...) allocate, set all public members /// - _s3__GetObjectAccessControlPolicy::soap_default(soap*) reset members to default /// - int soap_read__s3__GetObjectAccessControlPolicy(soap*, _s3__GetObjectAccessControlPolicy*) deserialize from a stream /// - int soap_write__s3__GetObjectAccessControlPolicy(soap*, _s3__GetObjectAccessControlPolicy*) serialize to a stream /// - _s3__GetObjectAccessControlPolicy* _s3__GetObjectAccessControlPolicy::soap_dup(soap*) returns deep copy of _s3__GetObjectAccessControlPolicy, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__GetObjectAccessControlPolicy::soap_del() deep deletes _s3__GetObjectAccessControlPolicy data members, use only after _s3__GetObjectAccessControlPolicy::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__GetObjectAccessControlPolicy { public: /// Element "Bucket" of XSD type xs:string. std::string Bucket 1; ///< Required element. /// Element "Key" of XSD type xs:string. std::string Key 1; ///< Required element. /// Element "AWSAccessKeyId" of XSD type xs:string. std::string* AWSAccessKeyId 0; ///< Optional element. /// Element "Timestamp" of XSD type xs:dateTime. time_t* Timestamp 0; ///< Optional element. /// Element "Signature" of XSD type xs:string. std::string* Signature 0; ///< Optional element. /// Element "Credential" of XSD type xs:string. std::string* Credential 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":GetObjectAccessControlPolicyResponse /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":GetObjectAccessControlPolicyResponse is a complexType. /// /// class _s3__GetObjectAccessControlPolicyResponse operations: /// - _s3__GetObjectAccessControlPolicyResponse* soap_new__s3__GetObjectAccessControlPolicyResponse(soap*) allocate /// - _s3__GetObjectAccessControlPolicyResponse* soap_new__s3__GetObjectAccessControlPolicyResponse(soap*, int num) allocate array /// - _s3__GetObjectAccessControlPolicyResponse* soap_new_req__s3__GetObjectAccessControlPolicyResponse(soap*, ...) allocate, set required members /// - _s3__GetObjectAccessControlPolicyResponse* soap_new_set__s3__GetObjectAccessControlPolicyResponse(soap*, ...) allocate, set all public members /// - _s3__GetObjectAccessControlPolicyResponse::soap_default(soap*) reset members to default /// - int soap_read__s3__GetObjectAccessControlPolicyResponse(soap*, _s3__GetObjectAccessControlPolicyResponse*) deserialize from a stream /// - int soap_write__s3__GetObjectAccessControlPolicyResponse(soap*, _s3__GetObjectAccessControlPolicyResponse*) serialize to a stream /// - _s3__GetObjectAccessControlPolicyResponse* _s3__GetObjectAccessControlPolicyResponse::soap_dup(soap*) returns deep copy of _s3__GetObjectAccessControlPolicyResponse, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__GetObjectAccessControlPolicyResponse::soap_del() deep deletes _s3__GetObjectAccessControlPolicyResponse data members, use only after _s3__GetObjectAccessControlPolicyResponse::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__GetObjectAccessControlPolicyResponse { public: /// Element "GetObjectAccessControlPolicyResponse" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":AccessControlPolicy. s3__AccessControlPolicy* GetObjectAccessControlPolicyResponse 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":GetBucketAccessControlPolicy /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":GetBucketAccessControlPolicy is a complexType. /// /// class _s3__GetBucketAccessControlPolicy operations: /// - _s3__GetBucketAccessControlPolicy* soap_new__s3__GetBucketAccessControlPolicy(soap*) allocate /// - _s3__GetBucketAccessControlPolicy* soap_new__s3__GetBucketAccessControlPolicy(soap*, int num) allocate array /// - _s3__GetBucketAccessControlPolicy* soap_new_req__s3__GetBucketAccessControlPolicy(soap*, ...) allocate, set required members /// - _s3__GetBucketAccessControlPolicy* soap_new_set__s3__GetBucketAccessControlPolicy(soap*, ...) allocate, set all public members /// - _s3__GetBucketAccessControlPolicy::soap_default(soap*) reset members to default /// - int soap_read__s3__GetBucketAccessControlPolicy(soap*, _s3__GetBucketAccessControlPolicy*) deserialize from a stream /// - int soap_write__s3__GetBucketAccessControlPolicy(soap*, _s3__GetBucketAccessControlPolicy*) serialize to a stream /// - _s3__GetBucketAccessControlPolicy* _s3__GetBucketAccessControlPolicy::soap_dup(soap*) returns deep copy of _s3__GetBucketAccessControlPolicy, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__GetBucketAccessControlPolicy::soap_del() deep deletes _s3__GetBucketAccessControlPolicy data members, use only after _s3__GetBucketAccessControlPolicy::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__GetBucketAccessControlPolicy { public: /// Element "Bucket" of XSD type xs:string. std::string Bucket 1; ///< Required element. /// Element "AWSAccessKeyId" of XSD type xs:string. std::string* AWSAccessKeyId 0; ///< Optional element. /// Element "Timestamp" of XSD type xs:dateTime. time_t* Timestamp 0; ///< Optional element. /// Element "Signature" of XSD type xs:string. std::string* Signature 0; ///< Optional element. /// Element "Credential" of XSD type xs:string. std::string* Credential 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":GetBucketAccessControlPolicyResponse /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":GetBucketAccessControlPolicyResponse is a complexType. /// /// class _s3__GetBucketAccessControlPolicyResponse operations: /// - _s3__GetBucketAccessControlPolicyResponse* soap_new__s3__GetBucketAccessControlPolicyResponse(soap*) allocate /// - _s3__GetBucketAccessControlPolicyResponse* soap_new__s3__GetBucketAccessControlPolicyResponse(soap*, int num) allocate array /// - _s3__GetBucketAccessControlPolicyResponse* soap_new_req__s3__GetBucketAccessControlPolicyResponse(soap*, ...) allocate, set required members /// - _s3__GetBucketAccessControlPolicyResponse* soap_new_set__s3__GetBucketAccessControlPolicyResponse(soap*, ...) allocate, set all public members /// - _s3__GetBucketAccessControlPolicyResponse::soap_default(soap*) reset members to default /// - int soap_read__s3__GetBucketAccessControlPolicyResponse(soap*, _s3__GetBucketAccessControlPolicyResponse*) deserialize from a stream /// - int soap_write__s3__GetBucketAccessControlPolicyResponse(soap*, _s3__GetBucketAccessControlPolicyResponse*) serialize to a stream /// - _s3__GetBucketAccessControlPolicyResponse* _s3__GetBucketAccessControlPolicyResponse::soap_dup(soap*) returns deep copy of _s3__GetBucketAccessControlPolicyResponse, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__GetBucketAccessControlPolicyResponse::soap_del() deep deletes _s3__GetBucketAccessControlPolicyResponse data members, use only after _s3__GetBucketAccessControlPolicyResponse::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__GetBucketAccessControlPolicyResponse { public: /// Element "GetBucketAccessControlPolicyResponse" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":AccessControlPolicy. s3__AccessControlPolicy* GetBucketAccessControlPolicyResponse 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":SetObjectAccessControlPolicy /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":SetObjectAccessControlPolicy is a complexType. /// /// class _s3__SetObjectAccessControlPolicy operations: /// - _s3__SetObjectAccessControlPolicy* soap_new__s3__SetObjectAccessControlPolicy(soap*) allocate /// - _s3__SetObjectAccessControlPolicy* soap_new__s3__SetObjectAccessControlPolicy(soap*, int num) allocate array /// - _s3__SetObjectAccessControlPolicy* soap_new_req__s3__SetObjectAccessControlPolicy(soap*, ...) allocate, set required members /// - _s3__SetObjectAccessControlPolicy* soap_new_set__s3__SetObjectAccessControlPolicy(soap*, ...) allocate, set all public members /// - _s3__SetObjectAccessControlPolicy::soap_default(soap*) reset members to default /// - int soap_read__s3__SetObjectAccessControlPolicy(soap*, _s3__SetObjectAccessControlPolicy*) deserialize from a stream /// - int soap_write__s3__SetObjectAccessControlPolicy(soap*, _s3__SetObjectAccessControlPolicy*) serialize to a stream /// - _s3__SetObjectAccessControlPolicy* _s3__SetObjectAccessControlPolicy::soap_dup(soap*) returns deep copy of _s3__SetObjectAccessControlPolicy, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__SetObjectAccessControlPolicy::soap_del() deep deletes _s3__SetObjectAccessControlPolicy data members, use only after _s3__SetObjectAccessControlPolicy::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__SetObjectAccessControlPolicy { public: /// Element "Bucket" of XSD type xs:string. std::string Bucket 1; ///< Required element. /// Element "Key" of XSD type xs:string. std::string Key 1; ///< Required element. /// Element "AccessControlList" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":AccessControlList. s3__AccessControlList* AccessControlList 1; ///< Required element. /// Element "AWSAccessKeyId" of XSD type xs:string. std::string* AWSAccessKeyId 0; ///< Optional element. /// Element "Timestamp" of XSD type xs:dateTime. time_t* Timestamp 0; ///< Optional element. /// Element "Signature" of XSD type xs:string. std::string* Signature 0; ///< Optional element. /// Element "Credential" of XSD type xs:string. std::string* Credential 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":SetObjectAccessControlPolicyResponse /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":SetObjectAccessControlPolicyResponse is a complexType. /// /// class _s3__SetObjectAccessControlPolicyResponse operations: /// - _s3__SetObjectAccessControlPolicyResponse* soap_new__s3__SetObjectAccessControlPolicyResponse(soap*) allocate /// - _s3__SetObjectAccessControlPolicyResponse* soap_new__s3__SetObjectAccessControlPolicyResponse(soap*, int num) allocate array /// - _s3__SetObjectAccessControlPolicyResponse* soap_new_req__s3__SetObjectAccessControlPolicyResponse(soap*, ...) allocate, set required members /// - _s3__SetObjectAccessControlPolicyResponse* soap_new_set__s3__SetObjectAccessControlPolicyResponse(soap*, ...) allocate, set all public members /// - _s3__SetObjectAccessControlPolicyResponse::soap_default(soap*) reset members to default /// - int soap_read__s3__SetObjectAccessControlPolicyResponse(soap*, _s3__SetObjectAccessControlPolicyResponse*) deserialize from a stream /// - int soap_write__s3__SetObjectAccessControlPolicyResponse(soap*, _s3__SetObjectAccessControlPolicyResponse*) serialize to a stream /// - _s3__SetObjectAccessControlPolicyResponse* _s3__SetObjectAccessControlPolicyResponse::soap_dup(soap*) returns deep copy of _s3__SetObjectAccessControlPolicyResponse, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__SetObjectAccessControlPolicyResponse::soap_del() deep deletes _s3__SetObjectAccessControlPolicyResponse data members, use only after _s3__SetObjectAccessControlPolicyResponse::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__SetObjectAccessControlPolicyResponse { public: /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":SetBucketAccessControlPolicy /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":SetBucketAccessControlPolicy is a complexType. /// /// class _s3__SetBucketAccessControlPolicy operations: /// - _s3__SetBucketAccessControlPolicy* soap_new__s3__SetBucketAccessControlPolicy(soap*) allocate /// - _s3__SetBucketAccessControlPolicy* soap_new__s3__SetBucketAccessControlPolicy(soap*, int num) allocate array /// - _s3__SetBucketAccessControlPolicy* soap_new_req__s3__SetBucketAccessControlPolicy(soap*, ...) allocate, set required members /// - _s3__SetBucketAccessControlPolicy* soap_new_set__s3__SetBucketAccessControlPolicy(soap*, ...) allocate, set all public members /// - _s3__SetBucketAccessControlPolicy::soap_default(soap*) reset members to default /// - int soap_read__s3__SetBucketAccessControlPolicy(soap*, _s3__SetBucketAccessControlPolicy*) deserialize from a stream /// - int soap_write__s3__SetBucketAccessControlPolicy(soap*, _s3__SetBucketAccessControlPolicy*) serialize to a stream /// - _s3__SetBucketAccessControlPolicy* _s3__SetBucketAccessControlPolicy::soap_dup(soap*) returns deep copy of _s3__SetBucketAccessControlPolicy, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__SetBucketAccessControlPolicy::soap_del() deep deletes _s3__SetBucketAccessControlPolicy data members, use only after _s3__SetBucketAccessControlPolicy::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__SetBucketAccessControlPolicy { public: /// Element "Bucket" of XSD type xs:string. std::string Bucket 1; ///< Required element. /// Element "AccessControlList" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":AccessControlList. s3__AccessControlList* AccessControlList 0; ///< Optional element. /// Element "AWSAccessKeyId" of XSD type xs:string. std::string* AWSAccessKeyId 0; ///< Optional element. /// Element "Timestamp" of XSD type xs:dateTime. time_t* Timestamp 0; ///< Optional element. /// Element "Signature" of XSD type xs:string. std::string* Signature 0; ///< Optional element. /// Element "Credential" of XSD type xs:string. std::string* Credential 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":SetBucketAccessControlPolicyResponse /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":SetBucketAccessControlPolicyResponse is a complexType. /// /// class _s3__SetBucketAccessControlPolicyResponse operations: /// - _s3__SetBucketAccessControlPolicyResponse* soap_new__s3__SetBucketAccessControlPolicyResponse(soap*) allocate /// - _s3__SetBucketAccessControlPolicyResponse* soap_new__s3__SetBucketAccessControlPolicyResponse(soap*, int num) allocate array /// - _s3__SetBucketAccessControlPolicyResponse* soap_new_req__s3__SetBucketAccessControlPolicyResponse(soap*, ...) allocate, set required members /// - _s3__SetBucketAccessControlPolicyResponse* soap_new_set__s3__SetBucketAccessControlPolicyResponse(soap*, ...) allocate, set all public members /// - _s3__SetBucketAccessControlPolicyResponse::soap_default(soap*) reset members to default /// - int soap_read__s3__SetBucketAccessControlPolicyResponse(soap*, _s3__SetBucketAccessControlPolicyResponse*) deserialize from a stream /// - int soap_write__s3__SetBucketAccessControlPolicyResponse(soap*, _s3__SetBucketAccessControlPolicyResponse*) serialize to a stream /// - _s3__SetBucketAccessControlPolicyResponse* _s3__SetBucketAccessControlPolicyResponse::soap_dup(soap*) returns deep copy of _s3__SetBucketAccessControlPolicyResponse, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__SetBucketAccessControlPolicyResponse::soap_del() deep deletes _s3__SetBucketAccessControlPolicyResponse data members, use only after _s3__SetBucketAccessControlPolicyResponse::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__SetBucketAccessControlPolicyResponse { public: /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":GetObject /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":GetObject is a complexType. /// /// class _s3__GetObject operations: /// - _s3__GetObject* soap_new__s3__GetObject(soap*) allocate /// - _s3__GetObject* soap_new__s3__GetObject(soap*, int num) allocate array /// - _s3__GetObject* soap_new_req__s3__GetObject(soap*, ...) allocate, set required members /// - _s3__GetObject* soap_new_set__s3__GetObject(soap*, ...) allocate, set all public members /// - _s3__GetObject::soap_default(soap*) reset members to default /// - int soap_read__s3__GetObject(soap*, _s3__GetObject*) deserialize from a stream /// - int soap_write__s3__GetObject(soap*, _s3__GetObject*) serialize to a stream /// - _s3__GetObject* _s3__GetObject::soap_dup(soap*) returns deep copy of _s3__GetObject, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__GetObject::soap_del() deep deletes _s3__GetObject data members, use only after _s3__GetObject::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__GetObject { public: /// Element "Bucket" of XSD type xs:string. std::string Bucket 1; ///< Required element. /// Element "Key" of XSD type xs:string. std::string Key 1; ///< Required element. /// Element "GetMetadata" of XSD type xs:boolean. bool GetMetadata 1; ///< Required element. /// Element "GetData" of XSD type xs:boolean. bool GetData 1; ///< Required element. /// Element "InlineData" of XSD type xs:boolean. bool InlineData 1; ///< Required element. /// Element "AWSAccessKeyId" of XSD type xs:string. std::string* AWSAccessKeyId 0; ///< Optional element. /// Element "Timestamp" of XSD type xs:dateTime. time_t* Timestamp 0; ///< Optional element. /// Element "Signature" of XSD type xs:string. std::string* Signature 0; ///< Optional element. /// Element "Credential" of XSD type xs:string. std::string* Credential 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":GetObjectResponse /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":GetObjectResponse is a complexType. /// /// class _s3__GetObjectResponse operations: /// - _s3__GetObjectResponse* soap_new__s3__GetObjectResponse(soap*) allocate /// - _s3__GetObjectResponse* soap_new__s3__GetObjectResponse(soap*, int num) allocate array /// - _s3__GetObjectResponse* soap_new_req__s3__GetObjectResponse(soap*, ...) allocate, set required members /// - _s3__GetObjectResponse* soap_new_set__s3__GetObjectResponse(soap*, ...) allocate, set all public members /// - _s3__GetObjectResponse::soap_default(soap*) reset members to default /// - int soap_read__s3__GetObjectResponse(soap*, _s3__GetObjectResponse*) deserialize from a stream /// - int soap_write__s3__GetObjectResponse(soap*, _s3__GetObjectResponse*) serialize to a stream /// - _s3__GetObjectResponse* _s3__GetObjectResponse::soap_dup(soap*) returns deep copy of _s3__GetObjectResponse, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__GetObjectResponse::soap_del() deep deletes _s3__GetObjectResponse data members, use only after _s3__GetObjectResponse::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__GetObjectResponse { public: /// Element "GetObjectResponse" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":GetObjectResult. s3__GetObjectResult* GetObjectResponse 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":GetObjectExtended /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":GetObjectExtended is a complexType. /// /// class _s3__GetObjectExtended operations: /// - _s3__GetObjectExtended* soap_new__s3__GetObjectExtended(soap*) allocate /// - _s3__GetObjectExtended* soap_new__s3__GetObjectExtended(soap*, int num) allocate array /// - _s3__GetObjectExtended* soap_new_req__s3__GetObjectExtended(soap*, ...) allocate, set required members /// - _s3__GetObjectExtended* soap_new_set__s3__GetObjectExtended(soap*, ...) allocate, set all public members /// - _s3__GetObjectExtended::soap_default(soap*) reset members to default /// - int soap_read__s3__GetObjectExtended(soap*, _s3__GetObjectExtended*) deserialize from a stream /// - int soap_write__s3__GetObjectExtended(soap*, _s3__GetObjectExtended*) serialize to a stream /// - _s3__GetObjectExtended* _s3__GetObjectExtended::soap_dup(soap*) returns deep copy of _s3__GetObjectExtended, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__GetObjectExtended::soap_del() deep deletes _s3__GetObjectExtended data members, use only after _s3__GetObjectExtended::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__GetObjectExtended { public: /// Element "Bucket" of XSD type xs:string. std::string Bucket 1; ///< Required element. /// Element "Key" of XSD type xs:string. std::string Key 1; ///< Required element. /// Element "GetMetadata" of XSD type xs:boolean. bool GetMetadata 1; ///< Required element. /// Element "GetData" of XSD type xs:boolean. bool GetData 1; ///< Required element. /// Element "InlineData" of XSD type xs:boolean. bool InlineData 1; ///< Required element. /// Element "ByteRangeStart" of XSD type xs:long. LONG64* ByteRangeStart 0; ///< Optional element. /// Element "ByteRangeEnd" of XSD type xs:long. LONG64* ByteRangeEnd 0; ///< Optional element. /// Element "IfModifiedSince" of XSD type xs:dateTime. time_t* IfModifiedSince 0; ///< Optional element. /// Element "IfUnmodifiedSince" of XSD type xs:dateTime. time_t* IfUnmodifiedSince 0; ///< Optional element. /// Vector of std::string of length 0..100. std::vector IfMatch 0:100; /// Vector of std::string of length 0..100. std::vector IfNoneMatch 0:100; /// Element "ReturnCompleteObjectOnConditionFailure" of XSD type xs:boolean. bool* ReturnCompleteObjectOnConditionFailure 0; ///< Optional element. /// Element "AWSAccessKeyId" of XSD type xs:string. std::string* AWSAccessKeyId 0; ///< Optional element. /// Element "Timestamp" of XSD type xs:dateTime. time_t* Timestamp 0; ///< Optional element. /// Element "Signature" of XSD type xs:string. std::string* Signature 0; ///< Optional element. /// Element "Credential" of XSD type xs:string. std::string* Credential 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":GetObjectExtendedResponse /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":GetObjectExtendedResponse is a complexType. /// /// class _s3__GetObjectExtendedResponse operations: /// - _s3__GetObjectExtendedResponse* soap_new__s3__GetObjectExtendedResponse(soap*) allocate /// - _s3__GetObjectExtendedResponse* soap_new__s3__GetObjectExtendedResponse(soap*, int num) allocate array /// - _s3__GetObjectExtendedResponse* soap_new_req__s3__GetObjectExtendedResponse(soap*, ...) allocate, set required members /// - _s3__GetObjectExtendedResponse* soap_new_set__s3__GetObjectExtendedResponse(soap*, ...) allocate, set all public members /// - _s3__GetObjectExtendedResponse::soap_default(soap*) reset members to default /// - int soap_read__s3__GetObjectExtendedResponse(soap*, _s3__GetObjectExtendedResponse*) deserialize from a stream /// - int soap_write__s3__GetObjectExtendedResponse(soap*, _s3__GetObjectExtendedResponse*) serialize to a stream /// - _s3__GetObjectExtendedResponse* _s3__GetObjectExtendedResponse::soap_dup(soap*) returns deep copy of _s3__GetObjectExtendedResponse, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__GetObjectExtendedResponse::soap_del() deep deletes _s3__GetObjectExtendedResponse data members, use only after _s3__GetObjectExtendedResponse::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__GetObjectExtendedResponse { public: /// Element "GetObjectResponse" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":GetObjectResult. s3__GetObjectResult* GetObjectResponse 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":PutObject /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":PutObject is a complexType. /// /// class _s3__PutObject operations: /// - _s3__PutObject* soap_new__s3__PutObject(soap*) allocate /// - _s3__PutObject* soap_new__s3__PutObject(soap*, int num) allocate array /// - _s3__PutObject* soap_new_req__s3__PutObject(soap*, ...) allocate, set required members /// - _s3__PutObject* soap_new_set__s3__PutObject(soap*, ...) allocate, set all public members /// - _s3__PutObject::soap_default(soap*) reset members to default /// - int soap_read__s3__PutObject(soap*, _s3__PutObject*) deserialize from a stream /// - int soap_write__s3__PutObject(soap*, _s3__PutObject*) serialize to a stream /// - _s3__PutObject* _s3__PutObject::soap_dup(soap*) returns deep copy of _s3__PutObject, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__PutObject::soap_del() deep deletes _s3__PutObject data members, use only after _s3__PutObject::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__PutObject { public: /// Element "Bucket" of XSD type xs:string. std::string Bucket 1; ///< Required element. /// Element "Key" of XSD type xs:string. std::string Key 1; ///< Required element. /// Vector of s3__MetadataEntry* of length 0..100. std::vector Metadata 0:100; /// Element "ContentLength" of XSD type xs:long. LONG64 ContentLength 1; ///< Required element. /// Element "AccessControlList" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":AccessControlList. s3__AccessControlList* AccessControlList 0; ///< Optional element. /// Element "StorageClass" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":StorageClass. enum s3__StorageClass* StorageClass 0; ///< Optional element. /// Element "AWSAccessKeyId" of XSD type xs:string. std::string* AWSAccessKeyId 0; ///< Optional element. /// Element "Timestamp" of XSD type xs:dateTime. time_t* Timestamp 0; ///< Optional element. /// Element "Signature" of XSD type xs:string. std::string* Signature 0; ///< Optional element. /// Element "Credential" of XSD type xs:string. std::string* Credential 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":PutObjectResponse /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":PutObjectResponse is a complexType. /// /// class _s3__PutObjectResponse operations: /// - _s3__PutObjectResponse* soap_new__s3__PutObjectResponse(soap*) allocate /// - _s3__PutObjectResponse* soap_new__s3__PutObjectResponse(soap*, int num) allocate array /// - _s3__PutObjectResponse* soap_new_req__s3__PutObjectResponse(soap*, ...) allocate, set required members /// - _s3__PutObjectResponse* soap_new_set__s3__PutObjectResponse(soap*, ...) allocate, set all public members /// - _s3__PutObjectResponse::soap_default(soap*) reset members to default /// - int soap_read__s3__PutObjectResponse(soap*, _s3__PutObjectResponse*) deserialize from a stream /// - int soap_write__s3__PutObjectResponse(soap*, _s3__PutObjectResponse*) serialize to a stream /// - _s3__PutObjectResponse* _s3__PutObjectResponse::soap_dup(soap*) returns deep copy of _s3__PutObjectResponse, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__PutObjectResponse::soap_del() deep deletes _s3__PutObjectResponse data members, use only after _s3__PutObjectResponse::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__PutObjectResponse { public: /// Element "PutObjectResponse" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":PutObjectResult. s3__PutObjectResult* PutObjectResponse 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":PutObjectInline /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":PutObjectInline is a complexType. /// /// class _s3__PutObjectInline operations: /// - _s3__PutObjectInline* soap_new__s3__PutObjectInline(soap*) allocate /// - _s3__PutObjectInline* soap_new__s3__PutObjectInline(soap*, int num) allocate array /// - _s3__PutObjectInline* soap_new_req__s3__PutObjectInline(soap*, ...) allocate, set required members /// - _s3__PutObjectInline* soap_new_set__s3__PutObjectInline(soap*, ...) allocate, set all public members /// - _s3__PutObjectInline::soap_default(soap*) reset members to default /// - int soap_read__s3__PutObjectInline(soap*, _s3__PutObjectInline*) deserialize from a stream /// - int soap_write__s3__PutObjectInline(soap*, _s3__PutObjectInline*) serialize to a stream /// - _s3__PutObjectInline* _s3__PutObjectInline::soap_dup(soap*) returns deep copy of _s3__PutObjectInline, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__PutObjectInline::soap_del() deep deletes _s3__PutObjectInline data members, use only after _s3__PutObjectInline::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__PutObjectInline { public: /// Element "Bucket" of XSD type xs:string. std::string Bucket 1; ///< Required element. /// Element "Key" of XSD type xs:string. std::string Key 1; ///< Required element. /// Vector of s3__MetadataEntry* of length 0..100. std::vector Metadata 0:100; /// Element "Data" of XSD type xs:base64Binary. xsd__base64Binary Data 1; ///< Required element. /// Element "ContentLength" of XSD type xs:long. LONG64 ContentLength 1; ///< Required element. /// Element "AccessControlList" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":AccessControlList. s3__AccessControlList* AccessControlList 0; ///< Optional element. /// Element "StorageClass" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":StorageClass. enum s3__StorageClass* StorageClass 0; ///< Optional element. /// Element "AWSAccessKeyId" of XSD type xs:string. std::string* AWSAccessKeyId 0; ///< Optional element. /// Element "Timestamp" of XSD type xs:dateTime. time_t* Timestamp 0; ///< Optional element. /// Element "Signature" of XSD type xs:string. std::string* Signature 0; ///< Optional element. /// Element "Credential" of XSD type xs:string. std::string* Credential 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":PutObjectInlineResponse /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":PutObjectInlineResponse is a complexType. /// /// class _s3__PutObjectInlineResponse operations: /// - _s3__PutObjectInlineResponse* soap_new__s3__PutObjectInlineResponse(soap*) allocate /// - _s3__PutObjectInlineResponse* soap_new__s3__PutObjectInlineResponse(soap*, int num) allocate array /// - _s3__PutObjectInlineResponse* soap_new_req__s3__PutObjectInlineResponse(soap*, ...) allocate, set required members /// - _s3__PutObjectInlineResponse* soap_new_set__s3__PutObjectInlineResponse(soap*, ...) allocate, set all public members /// - _s3__PutObjectInlineResponse::soap_default(soap*) reset members to default /// - int soap_read__s3__PutObjectInlineResponse(soap*, _s3__PutObjectInlineResponse*) deserialize from a stream /// - int soap_write__s3__PutObjectInlineResponse(soap*, _s3__PutObjectInlineResponse*) serialize to a stream /// - _s3__PutObjectInlineResponse* _s3__PutObjectInlineResponse::soap_dup(soap*) returns deep copy of _s3__PutObjectInlineResponse, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__PutObjectInlineResponse::soap_del() deep deletes _s3__PutObjectInlineResponse data members, use only after _s3__PutObjectInlineResponse::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__PutObjectInlineResponse { public: /// Element "PutObjectInlineResponse" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":PutObjectResult. s3__PutObjectResult* PutObjectInlineResponse 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":DeleteObject /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":DeleteObject is a complexType. /// /// class _s3__DeleteObject operations: /// - _s3__DeleteObject* soap_new__s3__DeleteObject(soap*) allocate /// - _s3__DeleteObject* soap_new__s3__DeleteObject(soap*, int num) allocate array /// - _s3__DeleteObject* soap_new_req__s3__DeleteObject(soap*, ...) allocate, set required members /// - _s3__DeleteObject* soap_new_set__s3__DeleteObject(soap*, ...) allocate, set all public members /// - _s3__DeleteObject::soap_default(soap*) reset members to default /// - int soap_read__s3__DeleteObject(soap*, _s3__DeleteObject*) deserialize from a stream /// - int soap_write__s3__DeleteObject(soap*, _s3__DeleteObject*) serialize to a stream /// - _s3__DeleteObject* _s3__DeleteObject::soap_dup(soap*) returns deep copy of _s3__DeleteObject, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__DeleteObject::soap_del() deep deletes _s3__DeleteObject data members, use only after _s3__DeleteObject::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__DeleteObject { public: /// Element "Bucket" of XSD type xs:string. std::string Bucket 1; ///< Required element. /// Element "Key" of XSD type xs:string. std::string Key 1; ///< Required element. /// Element "AWSAccessKeyId" of XSD type xs:string. std::string* AWSAccessKeyId 0; ///< Optional element. /// Element "Timestamp" of XSD type xs:dateTime. time_t* Timestamp 0; ///< Optional element. /// Element "Signature" of XSD type xs:string. std::string* Signature 0; ///< Optional element. /// Element "Credential" of XSD type xs:string. std::string* Credential 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":DeleteObjectResponse /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":DeleteObjectResponse is a complexType. /// /// class _s3__DeleteObjectResponse operations: /// - _s3__DeleteObjectResponse* soap_new__s3__DeleteObjectResponse(soap*) allocate /// - _s3__DeleteObjectResponse* soap_new__s3__DeleteObjectResponse(soap*, int num) allocate array /// - _s3__DeleteObjectResponse* soap_new_req__s3__DeleteObjectResponse(soap*, ...) allocate, set required members /// - _s3__DeleteObjectResponse* soap_new_set__s3__DeleteObjectResponse(soap*, ...) allocate, set all public members /// - _s3__DeleteObjectResponse::soap_default(soap*) reset members to default /// - int soap_read__s3__DeleteObjectResponse(soap*, _s3__DeleteObjectResponse*) deserialize from a stream /// - int soap_write__s3__DeleteObjectResponse(soap*, _s3__DeleteObjectResponse*) serialize to a stream /// - _s3__DeleteObjectResponse* _s3__DeleteObjectResponse::soap_dup(soap*) returns deep copy of _s3__DeleteObjectResponse, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__DeleteObjectResponse::soap_del() deep deletes _s3__DeleteObjectResponse data members, use only after _s3__DeleteObjectResponse::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__DeleteObjectResponse { public: /// Element "DeleteObjectResponse" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":Status. s3__Status* DeleteObjectResponse 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":ListBucket /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":ListBucket is a complexType. /// /// class _s3__ListBucket operations: /// - _s3__ListBucket* soap_new__s3__ListBucket(soap*) allocate /// - _s3__ListBucket* soap_new__s3__ListBucket(soap*, int num) allocate array /// - _s3__ListBucket* soap_new_req__s3__ListBucket(soap*, ...) allocate, set required members /// - _s3__ListBucket* soap_new_set__s3__ListBucket(soap*, ...) allocate, set all public members /// - _s3__ListBucket::soap_default(soap*) reset members to default /// - int soap_read__s3__ListBucket(soap*, _s3__ListBucket*) deserialize from a stream /// - int soap_write__s3__ListBucket(soap*, _s3__ListBucket*) serialize to a stream /// - _s3__ListBucket* _s3__ListBucket::soap_dup(soap*) returns deep copy of _s3__ListBucket, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__ListBucket::soap_del() deep deletes _s3__ListBucket data members, use only after _s3__ListBucket::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__ListBucket { public: /// Element "Bucket" of XSD type xs:string. std::string Bucket 1; ///< Required element. /// Element "Prefix" of XSD type xs:string. std::string* Prefix 0; ///< Optional element. /// Element "Marker" of XSD type xs:string. std::string* Marker 0; ///< Optional element. /// Element "MaxKeys" of XSD type xs:int. int* MaxKeys 0; ///< Optional element. /// Element "Delimiter" of XSD type xs:string. std::string* Delimiter 0; ///< Optional element. /// Element "AWSAccessKeyId" of XSD type xs:string. std::string* AWSAccessKeyId 0; ///< Optional element. /// Element "Timestamp" of XSD type xs:dateTime. time_t* Timestamp 0; ///< Optional element. /// Element "Signature" of XSD type xs:string. std::string* Signature 0; ///< Optional element. /// Element "Credential" of XSD type xs:string. std::string* Credential 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":ListBucketResponse /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":ListBucketResponse is a complexType. /// /// class _s3__ListBucketResponse operations: /// - _s3__ListBucketResponse* soap_new__s3__ListBucketResponse(soap*) allocate /// - _s3__ListBucketResponse* soap_new__s3__ListBucketResponse(soap*, int num) allocate array /// - _s3__ListBucketResponse* soap_new_req__s3__ListBucketResponse(soap*, ...) allocate, set required members /// - _s3__ListBucketResponse* soap_new_set__s3__ListBucketResponse(soap*, ...) allocate, set all public members /// - _s3__ListBucketResponse::soap_default(soap*) reset members to default /// - int soap_read__s3__ListBucketResponse(soap*, _s3__ListBucketResponse*) deserialize from a stream /// - int soap_write__s3__ListBucketResponse(soap*, _s3__ListBucketResponse*) serialize to a stream /// - _s3__ListBucketResponse* _s3__ListBucketResponse::soap_dup(soap*) returns deep copy of _s3__ListBucketResponse, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__ListBucketResponse::soap_del() deep deletes _s3__ListBucketResponse data members, use only after _s3__ListBucketResponse::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__ListBucketResponse { public: /// Element "ListBucketResponse" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":ListBucketResult. s3__ListBucketResult* ListBucketResponse 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":ListVersionsResponse /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":ListVersionsResponse is a complexType. /// /// class _s3__ListVersionsResponse operations: /// - _s3__ListVersionsResponse* soap_new__s3__ListVersionsResponse(soap*) allocate /// - _s3__ListVersionsResponse* soap_new__s3__ListVersionsResponse(soap*, int num) allocate array /// - _s3__ListVersionsResponse* soap_new_req__s3__ListVersionsResponse(soap*, ...) allocate, set required members /// - _s3__ListVersionsResponse* soap_new_set__s3__ListVersionsResponse(soap*, ...) allocate, set all public members /// - _s3__ListVersionsResponse::soap_default(soap*) reset members to default /// - int soap_read__s3__ListVersionsResponse(soap*, _s3__ListVersionsResponse*) deserialize from a stream /// - int soap_write__s3__ListVersionsResponse(soap*, _s3__ListVersionsResponse*) serialize to a stream /// - _s3__ListVersionsResponse* _s3__ListVersionsResponse::soap_dup(soap*) returns deep copy of _s3__ListVersionsResponse, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__ListVersionsResponse::soap_del() deep deletes _s3__ListVersionsResponse data members, use only after _s3__ListVersionsResponse::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__ListVersionsResponse { public: /// Element "ListVersionsResponse" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":ListVersionsResult. s3__ListVersionsResult* ListVersionsResponse 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":ListAllMyBuckets /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":ListAllMyBuckets is a complexType. /// /// class _s3__ListAllMyBuckets operations: /// - _s3__ListAllMyBuckets* soap_new__s3__ListAllMyBuckets(soap*) allocate /// - _s3__ListAllMyBuckets* soap_new__s3__ListAllMyBuckets(soap*, int num) allocate array /// - _s3__ListAllMyBuckets* soap_new_req__s3__ListAllMyBuckets(soap*, ...) allocate, set required members /// - _s3__ListAllMyBuckets* soap_new_set__s3__ListAllMyBuckets(soap*, ...) allocate, set all public members /// - _s3__ListAllMyBuckets::soap_default(soap*) reset members to default /// - int soap_read__s3__ListAllMyBuckets(soap*, _s3__ListAllMyBuckets*) deserialize from a stream /// - int soap_write__s3__ListAllMyBuckets(soap*, _s3__ListAllMyBuckets*) serialize to a stream /// - _s3__ListAllMyBuckets* _s3__ListAllMyBuckets::soap_dup(soap*) returns deep copy of _s3__ListAllMyBuckets, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__ListAllMyBuckets::soap_del() deep deletes _s3__ListAllMyBuckets data members, use only after _s3__ListAllMyBuckets::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__ListAllMyBuckets { public: /// Element "AWSAccessKeyId" of XSD type xs:string. std::string* AWSAccessKeyId 0; ///< Optional element. /// Element "Timestamp" of XSD type xs:dateTime. time_t* Timestamp 0; ///< Optional element. /// Element "Signature" of XSD type xs:string. std::string* Signature 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":ListAllMyBucketsResponse /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":ListAllMyBucketsResponse is a complexType. /// /// class _s3__ListAllMyBucketsResponse operations: /// - _s3__ListAllMyBucketsResponse* soap_new__s3__ListAllMyBucketsResponse(soap*) allocate /// - _s3__ListAllMyBucketsResponse* soap_new__s3__ListAllMyBucketsResponse(soap*, int num) allocate array /// - _s3__ListAllMyBucketsResponse* soap_new_req__s3__ListAllMyBucketsResponse(soap*, ...) allocate, set required members /// - _s3__ListAllMyBucketsResponse* soap_new_set__s3__ListAllMyBucketsResponse(soap*, ...) allocate, set all public members /// - _s3__ListAllMyBucketsResponse::soap_default(soap*) reset members to default /// - int soap_read__s3__ListAllMyBucketsResponse(soap*, _s3__ListAllMyBucketsResponse*) deserialize from a stream /// - int soap_write__s3__ListAllMyBucketsResponse(soap*, _s3__ListAllMyBucketsResponse*) serialize to a stream /// - _s3__ListAllMyBucketsResponse* _s3__ListAllMyBucketsResponse::soap_dup(soap*) returns deep copy of _s3__ListAllMyBucketsResponse, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__ListAllMyBucketsResponse::soap_del() deep deletes _s3__ListAllMyBucketsResponse data members, use only after _s3__ListAllMyBucketsResponse::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__ListAllMyBucketsResponse { public: /// Element "ListAllMyBucketsResponse" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":ListAllMyBucketsResult. s3__ListAllMyBucketsResult* ListAllMyBucketsResponse 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":PostResponse /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":PostResponse is a complexType. /// /// class _s3__PostResponse operations: /// - _s3__PostResponse* soap_new__s3__PostResponse(soap*) allocate /// - _s3__PostResponse* soap_new__s3__PostResponse(soap*, int num) allocate array /// - _s3__PostResponse* soap_new_req__s3__PostResponse(soap*, ...) allocate, set required members /// - _s3__PostResponse* soap_new_set__s3__PostResponse(soap*, ...) allocate, set all public members /// - _s3__PostResponse::soap_default(soap*) reset members to default /// - int soap_read__s3__PostResponse(soap*, _s3__PostResponse*) deserialize from a stream /// - int soap_write__s3__PostResponse(soap*, _s3__PostResponse*) serialize to a stream /// - _s3__PostResponse* _s3__PostResponse::soap_dup(soap*) returns deep copy of _s3__PostResponse, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__PostResponse::soap_del() deep deletes _s3__PostResponse data members, use only after _s3__PostResponse::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__PostResponse { public: /// Element "Location" of XSD type xs:anyURI. xsd__anyURI Location 1; ///< Required element. /// Element "Bucket" of XSD type xs:string. std::string Bucket 1; ///< Required element. /// Element "Key" of XSD type xs:string. std::string Key 1; ///< Required element. /// Element "ETag" of XSD type xs:string. std::string ETag 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":CopyObject /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":CopyObject is a complexType. /// /// class _s3__CopyObject operations: /// - _s3__CopyObject* soap_new__s3__CopyObject(soap*) allocate /// - _s3__CopyObject* soap_new__s3__CopyObject(soap*, int num) allocate array /// - _s3__CopyObject* soap_new_req__s3__CopyObject(soap*, ...) allocate, set required members /// - _s3__CopyObject* soap_new_set__s3__CopyObject(soap*, ...) allocate, set all public members /// - _s3__CopyObject::soap_default(soap*) reset members to default /// - int soap_read__s3__CopyObject(soap*, _s3__CopyObject*) deserialize from a stream /// - int soap_write__s3__CopyObject(soap*, _s3__CopyObject*) serialize to a stream /// - _s3__CopyObject* _s3__CopyObject::soap_dup(soap*) returns deep copy of _s3__CopyObject, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__CopyObject::soap_del() deep deletes _s3__CopyObject data members, use only after _s3__CopyObject::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__CopyObject { public: /// Element "SourceBucket" of XSD type xs:string. std::string SourceBucket 1; ///< Required element. /// Element "SourceKey" of XSD type xs:string. std::string SourceKey 1; ///< Required element. /// Element "DestinationBucket" of XSD type xs:string. std::string DestinationBucket 1; ///< Required element. /// Element "DestinationKey" of XSD type xs:string. std::string DestinationKey 1; ///< Required element. /// Element "MetadataDirective" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":MetadataDirective. enum s3__MetadataDirective* MetadataDirective 0; ///< Optional element. /// Vector of s3__MetadataEntry* of length 0..100. std::vector Metadata 0:100; /// Element "AccessControlList" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":AccessControlList. s3__AccessControlList* AccessControlList 0; ///< Optional element. /// Element "CopySourceIfModifiedSince" of XSD type xs:dateTime. time_t* CopySourceIfModifiedSince 0; ///< Optional element. /// Element "CopySourceIfUnmodifiedSince" of XSD type xs:dateTime. time_t* CopySourceIfUnmodifiedSince 0; ///< Optional element. /// Vector of std::string of length 0..100. std::vector CopySourceIfMatch 0:100; /// Vector of std::string of length 0..100. std::vector CopySourceIfNoneMatch 0:100; /// Element "StorageClass" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":StorageClass. enum s3__StorageClass* StorageClass 0; ///< Optional element. /// Element "AWSAccessKeyId" of XSD type xs:string. std::string* AWSAccessKeyId 0; ///< Optional element. /// Element "Timestamp" of XSD type xs:dateTime. time_t* Timestamp 0; ///< Optional element. /// Element "Signature" of XSD type xs:string. std::string* Signature 0; ///< Optional element. /// Element "Credential" of XSD type xs:string. std::string* Credential 0; ///< Optional element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief Top-level root element "http://s3.amazonaws.com/doc/2006-03-01/":CopyObjectResponse /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":CopyObjectResponse is a complexType. /// /// class _s3__CopyObjectResponse operations: /// - _s3__CopyObjectResponse* soap_new__s3__CopyObjectResponse(soap*) allocate /// - _s3__CopyObjectResponse* soap_new__s3__CopyObjectResponse(soap*, int num) allocate array /// - _s3__CopyObjectResponse* soap_new_req__s3__CopyObjectResponse(soap*, ...) allocate, set required members /// - _s3__CopyObjectResponse* soap_new_set__s3__CopyObjectResponse(soap*, ...) allocate, set all public members /// - _s3__CopyObjectResponse::soap_default(soap*) reset members to default /// - int soap_read__s3__CopyObjectResponse(soap*, _s3__CopyObjectResponse*) deserialize from a stream /// - int soap_write__s3__CopyObjectResponse(soap*, _s3__CopyObjectResponse*) serialize to a stream /// - _s3__CopyObjectResponse* _s3__CopyObjectResponse::soap_dup(soap*) returns deep copy of _s3__CopyObjectResponse, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _s3__CopyObjectResponse::soap_del() deep deletes _s3__CopyObjectResponse data members, use only after _s3__CopyObjectResponse::soap_dup(NULL) (use soapcpp2 -Ed) class _s3__CopyObjectResponse { public: /// Element "CopyObjectResult" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":CopyObjectResult. s3__CopyObjectResult* CopyObjectResult 1; ///< Required element. /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":User is an abstract complexType with complexContent extension of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":Grantee. /// /// class s3__User operations: /// - s3__User* soap_new_s3__User(soap*) allocate /// - s3__User* soap_new_s3__User(soap*, int num) allocate array /// - s3__User* soap_new_req_s3__User(soap*, ...) allocate, set required members /// - s3__User* soap_new_set_s3__User(soap*, ...) allocate, set all public members /// - s3__User::soap_default(soap*) reset members to default /// - int soap_read_s3__User(soap*, s3__User*) deserialize from a stream /// - int soap_write_s3__User(soap*, s3__User*) serialize to a stream /// - s3__User* s3__User::soap_dup(soap*) returns deep copy of s3__User, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__User::soap_del() deep deletes s3__User data members, use only after s3__User::soap_dup(NULL) (use soapcpp2 -Ed) class s3__User : public s3__Grantee { public: /* INHERITED FROM s3__Grantee: END OF INHERITED FROM s3__Grantee */ }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":Group is a complexType with complexContent extension of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":Grantee. /// /// class s3__Group operations: /// - s3__Group* soap_new_s3__Group(soap*) allocate /// - s3__Group* soap_new_s3__Group(soap*, int num) allocate array /// - s3__Group* soap_new_req_s3__Group(soap*, ...) allocate, set required members /// - s3__Group* soap_new_set_s3__Group(soap*, ...) allocate, set all public members /// - s3__Group::soap_default(soap*) reset members to default /// - int soap_read_s3__Group(soap*, s3__Group*) deserialize from a stream /// - int soap_write_s3__Group(soap*, s3__Group*) serialize to a stream /// - s3__Group* s3__Group::soap_dup(soap*) returns deep copy of s3__Group, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__Group::soap_del() deep deletes s3__Group data members, use only after s3__Group::soap_dup(NULL) (use soapcpp2 -Ed) class s3__Group : public s3__Grantee { public: /* INHERITED FROM s3__Grantee: END OF INHERITED FROM s3__Grantee */ /// Element "URI" of XSD type xs:string. std::string URI 1; ///< Required element. }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":LocationConstraint is a complexType with simpleContent. /// /// class s3__LocationConstraint operations: /// - s3__LocationConstraint* soap_new_s3__LocationConstraint(soap*) allocate /// - s3__LocationConstraint* soap_new_s3__LocationConstraint(soap*, int num) allocate array /// - s3__LocationConstraint* soap_new_req_s3__LocationConstraint(soap*, ...) allocate, set required members /// - s3__LocationConstraint* soap_new_set_s3__LocationConstraint(soap*, ...) allocate, set all public members /// - s3__LocationConstraint::soap_default(soap*) reset members to default /// - int soap_read_s3__LocationConstraint(soap*, s3__LocationConstraint*) deserialize from a stream /// - int soap_write_s3__LocationConstraint(soap*, s3__LocationConstraint*) serialize to a stream /// - s3__LocationConstraint* s3__LocationConstraint::soap_dup(soap*) returns deep copy of s3__LocationConstraint, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__LocationConstraint::soap_del() deep deletes s3__LocationConstraint data members, use only after s3__LocationConstraint::soap_dup(NULL) (use soapcpp2 -Ed) class s3__LocationConstraint { public: /// __item wraps "xs:string" simpleContent. std::string __item ; /// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). struct soap *soap ; }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":GetObjectResult is a complexType with complexContent extension of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":Result. /// /// class s3__GetObjectResult operations: /// - s3__GetObjectResult* soap_new_s3__GetObjectResult(soap*) allocate /// - s3__GetObjectResult* soap_new_s3__GetObjectResult(soap*, int num) allocate array /// - s3__GetObjectResult* soap_new_req_s3__GetObjectResult(soap*, ...) allocate, set required members /// - s3__GetObjectResult* soap_new_set_s3__GetObjectResult(soap*, ...) allocate, set all public members /// - s3__GetObjectResult::soap_default(soap*) reset members to default /// - int soap_read_s3__GetObjectResult(soap*, s3__GetObjectResult*) deserialize from a stream /// - int soap_write_s3__GetObjectResult(soap*, s3__GetObjectResult*) serialize to a stream /// - s3__GetObjectResult* s3__GetObjectResult::soap_dup(soap*) returns deep copy of s3__GetObjectResult, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__GetObjectResult::soap_del() deep deletes s3__GetObjectResult data members, use only after s3__GetObjectResult::soap_dup(NULL) (use soapcpp2 -Ed) class s3__GetObjectResult : public s3__Result { public: /* INHERITED FROM s3__Result: /// Element "Status" of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":Status. s3__Status* Status 1; ///< Required element. END OF INHERITED FROM s3__Result */ /// Vector of s3__MetadataEntry* of length 0..unbounded. std::vector Metadata 0; /// Element "Data" of XSD type xs:base64Binary. xsd__base64Binary* Data 1; ///< Optional (xsi:nil when NULL) element. /// Element "LastModified" of XSD type xs:dateTime. time_t LastModified 1; ///< Required element. /// Element "ETag" of XSD type xs:string. std::string ETag 1; ///< Required element. }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":AmazonCustomerByEmail is a complexType with complexContent extension of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":User. /// /// class s3__AmazonCustomerByEmail operations: /// - s3__AmazonCustomerByEmail* soap_new_s3__AmazonCustomerByEmail(soap*) allocate /// - s3__AmazonCustomerByEmail* soap_new_s3__AmazonCustomerByEmail(soap*, int num) allocate array /// - s3__AmazonCustomerByEmail* soap_new_req_s3__AmazonCustomerByEmail(soap*, ...) allocate, set required members /// - s3__AmazonCustomerByEmail* soap_new_set_s3__AmazonCustomerByEmail(soap*, ...) allocate, set all public members /// - s3__AmazonCustomerByEmail::soap_default(soap*) reset members to default /// - int soap_read_s3__AmazonCustomerByEmail(soap*, s3__AmazonCustomerByEmail*) deserialize from a stream /// - int soap_write_s3__AmazonCustomerByEmail(soap*, s3__AmazonCustomerByEmail*) serialize to a stream /// - s3__AmazonCustomerByEmail* s3__AmazonCustomerByEmail::soap_dup(soap*) returns deep copy of s3__AmazonCustomerByEmail, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__AmazonCustomerByEmail::soap_del() deep deletes s3__AmazonCustomerByEmail data members, use only after s3__AmazonCustomerByEmail::soap_dup(NULL) (use soapcpp2 -Ed) class s3__AmazonCustomerByEmail : public s3__User { public: /* INHERITED FROM s3__Grantee: END OF INHERITED FROM s3__Grantee */ /* INHERITED FROM s3__User: END OF INHERITED FROM s3__User */ /// Element "EmailAddress" of XSD type xs:string. std::string EmailAddress 1; ///< Required element. }; /// @brief "http://s3.amazonaws.com/doc/2006-03-01/":CanonicalUser is a complexType with complexContent extension of XSD type "http://s3.amazonaws.com/doc/2006-03-01/":User. /// /// class s3__CanonicalUser operations: /// - s3__CanonicalUser* soap_new_s3__CanonicalUser(soap*) allocate /// - s3__CanonicalUser* soap_new_s3__CanonicalUser(soap*, int num) allocate array /// - s3__CanonicalUser* soap_new_req_s3__CanonicalUser(soap*, ...) allocate, set required members /// - s3__CanonicalUser* soap_new_set_s3__CanonicalUser(soap*, ...) allocate, set all public members /// - s3__CanonicalUser::soap_default(soap*) reset members to default /// - int soap_read_s3__CanonicalUser(soap*, s3__CanonicalUser*) deserialize from a stream /// - int soap_write_s3__CanonicalUser(soap*, s3__CanonicalUser*) serialize to a stream /// - s3__CanonicalUser* s3__CanonicalUser::soap_dup(soap*) returns deep copy of s3__CanonicalUser, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - s3__CanonicalUser::soap_del() deep deletes s3__CanonicalUser data members, use only after s3__CanonicalUser::soap_dup(NULL) (use soapcpp2 -Ed) class s3__CanonicalUser : public s3__User { public: /* INHERITED FROM s3__Grantee: END OF INHERITED FROM s3__Grantee */ /* INHERITED FROM s3__User: END OF INHERITED FROM s3__User */ /// Element "ID" of XSD type xs:string. std::string ID 1; ///< Required element. /// Element "DisplayName" of XSD type xs:string. std::string* DisplayName 0; ///< Optional element. }; /******************************************************************************\ * * * Additional Top-Level Elements * * http://s3.amazonaws.com/doc/2006-03-01/ * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * http://s3.amazonaws.com/doc/2006-03-01/ * * * \******************************************************************************/ /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap s3 service name: AmazonS3SoapBinding AWS S3 SOAP API: code example located at http://www.genivia.com/files/aws-s3.cpp see also http://www.genivia.com/dev.html to learn more //gsoap s3 service type: AmazonS3 //gsoap s3 service port: https://s3.amazonaws.com/soap //gsoap s3 service namespace: http://s3.amazonaws.com/doc/2006-03-01/ //gsoap s3 service transport: http://schemas.xmlsoap.org/soap/http /** @mainpage Service Definitions @section Service_bindings Service Bindings - @ref AmazonS3SoapBinding @section Service_more More Information - @ref page_notes "Notes" - @ref page_XMLDataBinding "XML Data Binding" - @ref SOAP_ENV__Header "SOAP Header Content" (when applicable) - @ref SOAP_ENV__Detail "SOAP Fault Detail Content" (when applicable) */ /** @page AmazonS3SoapBinding Binding "AmazonS3SoapBinding" @section AmazonS3SoapBinding_operations Operations of Binding "AmazonS3SoapBinding" - @ref __s3__CreateBucket - @ref __s3__DeleteBucket - @ref __s3__GetObjectAccessControlPolicy - @ref __s3__GetBucketAccessControlPolicy - @ref __s3__SetObjectAccessControlPolicy - @ref __s3__SetBucketAccessControlPolicy - @ref __s3__GetObject - @ref __s3__GetObjectExtended - @ref __s3__PutObject - @ref __s3__PutObjectInline - @ref __s3__DeleteObject - @ref __s3__ListBucket - @ref __s3__ListAllMyBuckets - @ref __s3__SetBucketLoggingStatus - @ref __s3__GetBucketLoggingStatus - @ref __s3__CopyObject @section AmazonS3SoapBinding_ports Endpoints of Binding "AmazonS3SoapBinding" - https://s3.amazonaws.com/soap @note Use wsdl2h option -Nname to change the service binding prefix name */ /******************************************************************************\ * * * Service Binding * * AmazonS3SoapBinding * * * \******************************************************************************/ /******************************************************************************\ * * * Service Operation * * __s3__CreateBucket * * * \******************************************************************************/ /** Operation "__s3__CreateBucket" of service binding "AmazonS3SoapBinding". - SOAP document/literal style messaging - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___s3__CreateBucket( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _s3__CreateBucket* s3__CreateBucket, // output parameters: _s3__CreateBucketResponse &s3__CreateBucketResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __s3__CreateBucket( struct soap *soap, // input parameters: _s3__CreateBucket* s3__CreateBucket, // output parameters: _s3__CreateBucketResponse &s3__CreateBucketResponse ); @endcode C++ proxy class (defined in soapAmazonS3SoapBindingProxy.h): @code class AmazonS3SoapBindingProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapAmazonS3SoapBindingService.h): @code class AmazonS3SoapBindingService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap s3 service method-protocol: CreateBucket SOAP //gsoap s3 service method-style: CreateBucket document //gsoap s3 service method-encoding: CreateBucket literal //gsoap s3 service method-action: CreateBucket "" //gsoap s3 service method-output-action: CreateBucket Response int __s3__CreateBucket( _s3__CreateBucket* s3__CreateBucket, ///< Input parameter _s3__CreateBucketResponse &s3__CreateBucketResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __s3__DeleteBucket * * * \******************************************************************************/ /** Operation "__s3__DeleteBucket" of service binding "AmazonS3SoapBinding". - SOAP document/literal style messaging - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___s3__DeleteBucket( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _s3__DeleteBucket* s3__DeleteBucket, // output parameters: _s3__DeleteBucketResponse &s3__DeleteBucketResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __s3__DeleteBucket( struct soap *soap, // input parameters: _s3__DeleteBucket* s3__DeleteBucket, // output parameters: _s3__DeleteBucketResponse &s3__DeleteBucketResponse ); @endcode C++ proxy class (defined in soapAmazonS3SoapBindingProxy.h): @code class AmazonS3SoapBindingProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapAmazonS3SoapBindingService.h): @code class AmazonS3SoapBindingService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap s3 service method-protocol: DeleteBucket SOAP //gsoap s3 service method-style: DeleteBucket document //gsoap s3 service method-encoding: DeleteBucket literal //gsoap s3 service method-action: DeleteBucket "" //gsoap s3 service method-output-action: DeleteBucket Response int __s3__DeleteBucket( _s3__DeleteBucket* s3__DeleteBucket, ///< Input parameter _s3__DeleteBucketResponse &s3__DeleteBucketResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __s3__GetObjectAccessControlPolicy * * * \******************************************************************************/ /** Operation "__s3__GetObjectAccessControlPolicy" of service binding "AmazonS3SoapBinding". - SOAP document/literal style messaging - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___s3__GetObjectAccessControlPolicy( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _s3__GetObjectAccessControlPolicy* s3__GetObjectAccessControlPolicy, // output parameters: _s3__GetObjectAccessControlPolicyResponse&s3__GetObjectAccessControlPolicyResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __s3__GetObjectAccessControlPolicy( struct soap *soap, // input parameters: _s3__GetObjectAccessControlPolicy* s3__GetObjectAccessControlPolicy, // output parameters: _s3__GetObjectAccessControlPolicyResponse&s3__GetObjectAccessControlPolicyResponse ); @endcode C++ proxy class (defined in soapAmazonS3SoapBindingProxy.h): @code class AmazonS3SoapBindingProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapAmazonS3SoapBindingService.h): @code class AmazonS3SoapBindingService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap s3 service method-protocol: GetObjectAccessControlPolicy SOAP //gsoap s3 service method-style: GetObjectAccessControlPolicy document //gsoap s3 service method-encoding: GetObjectAccessControlPolicy literal //gsoap s3 service method-action: GetObjectAccessControlPolicy "" //gsoap s3 service method-output-action: GetObjectAccessControlPolicy Response int __s3__GetObjectAccessControlPolicy( _s3__GetObjectAccessControlPolicy* s3__GetObjectAccessControlPolicy, ///< Input parameter _s3__GetObjectAccessControlPolicyResponse&s3__GetObjectAccessControlPolicyResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __s3__GetBucketAccessControlPolicy * * * \******************************************************************************/ /** Operation "__s3__GetBucketAccessControlPolicy" of service binding "AmazonS3SoapBinding". - SOAP document/literal style messaging - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___s3__GetBucketAccessControlPolicy( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _s3__GetBucketAccessControlPolicy* s3__GetBucketAccessControlPolicy, // output parameters: _s3__GetBucketAccessControlPolicyResponse&s3__GetBucketAccessControlPolicyResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __s3__GetBucketAccessControlPolicy( struct soap *soap, // input parameters: _s3__GetBucketAccessControlPolicy* s3__GetBucketAccessControlPolicy, // output parameters: _s3__GetBucketAccessControlPolicyResponse&s3__GetBucketAccessControlPolicyResponse ); @endcode C++ proxy class (defined in soapAmazonS3SoapBindingProxy.h): @code class AmazonS3SoapBindingProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapAmazonS3SoapBindingService.h): @code class AmazonS3SoapBindingService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap s3 service method-protocol: GetBucketAccessControlPolicy SOAP //gsoap s3 service method-style: GetBucketAccessControlPolicy document //gsoap s3 service method-encoding: GetBucketAccessControlPolicy literal //gsoap s3 service method-action: GetBucketAccessControlPolicy "" //gsoap s3 service method-output-action: GetBucketAccessControlPolicy Response int __s3__GetBucketAccessControlPolicy( _s3__GetBucketAccessControlPolicy* s3__GetBucketAccessControlPolicy, ///< Input parameter _s3__GetBucketAccessControlPolicyResponse&s3__GetBucketAccessControlPolicyResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __s3__SetObjectAccessControlPolicy * * * \******************************************************************************/ /** Operation "__s3__SetObjectAccessControlPolicy" of service binding "AmazonS3SoapBinding". - SOAP document/literal style messaging - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___s3__SetObjectAccessControlPolicy( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _s3__SetObjectAccessControlPolicy* s3__SetObjectAccessControlPolicy, // output parameters: _s3__SetObjectAccessControlPolicyResponse&s3__SetObjectAccessControlPolicyResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __s3__SetObjectAccessControlPolicy( struct soap *soap, // input parameters: _s3__SetObjectAccessControlPolicy* s3__SetObjectAccessControlPolicy, // output parameters: _s3__SetObjectAccessControlPolicyResponse&s3__SetObjectAccessControlPolicyResponse ); @endcode C++ proxy class (defined in soapAmazonS3SoapBindingProxy.h): @code class AmazonS3SoapBindingProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapAmazonS3SoapBindingService.h): @code class AmazonS3SoapBindingService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap s3 service method-protocol: SetObjectAccessControlPolicy SOAP //gsoap s3 service method-style: SetObjectAccessControlPolicy document //gsoap s3 service method-encoding: SetObjectAccessControlPolicy literal //gsoap s3 service method-action: SetObjectAccessControlPolicy "" //gsoap s3 service method-output-action: SetObjectAccessControlPolicy Response int __s3__SetObjectAccessControlPolicy( _s3__SetObjectAccessControlPolicy* s3__SetObjectAccessControlPolicy, ///< Input parameter _s3__SetObjectAccessControlPolicyResponse&s3__SetObjectAccessControlPolicyResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __s3__SetBucketAccessControlPolicy * * * \******************************************************************************/ /** Operation "__s3__SetBucketAccessControlPolicy" of service binding "AmazonS3SoapBinding". - SOAP document/literal style messaging - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___s3__SetBucketAccessControlPolicy( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _s3__SetBucketAccessControlPolicy* s3__SetBucketAccessControlPolicy, // output parameters: _s3__SetBucketAccessControlPolicyResponse&s3__SetBucketAccessControlPolicyResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __s3__SetBucketAccessControlPolicy( struct soap *soap, // input parameters: _s3__SetBucketAccessControlPolicy* s3__SetBucketAccessControlPolicy, // output parameters: _s3__SetBucketAccessControlPolicyResponse&s3__SetBucketAccessControlPolicyResponse ); @endcode C++ proxy class (defined in soapAmazonS3SoapBindingProxy.h): @code class AmazonS3SoapBindingProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapAmazonS3SoapBindingService.h): @code class AmazonS3SoapBindingService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap s3 service method-protocol: SetBucketAccessControlPolicy SOAP //gsoap s3 service method-style: SetBucketAccessControlPolicy document //gsoap s3 service method-encoding: SetBucketAccessControlPolicy literal //gsoap s3 service method-action: SetBucketAccessControlPolicy "" //gsoap s3 service method-output-action: SetBucketAccessControlPolicy Response int __s3__SetBucketAccessControlPolicy( _s3__SetBucketAccessControlPolicy* s3__SetBucketAccessControlPolicy, ///< Input parameter _s3__SetBucketAccessControlPolicyResponse&s3__SetBucketAccessControlPolicyResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __s3__GetObject * * * \******************************************************************************/ /** Operation "__s3__GetObject" of service binding "AmazonS3SoapBinding". - SOAP document/literal style messaging - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___s3__GetObject( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _s3__GetObject* s3__GetObject, // output parameters: _s3__GetObjectResponse &s3__GetObjectResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __s3__GetObject( struct soap *soap, // input parameters: _s3__GetObject* s3__GetObject, // output parameters: _s3__GetObjectResponse &s3__GetObjectResponse ); @endcode C++ proxy class (defined in soapAmazonS3SoapBindingProxy.h): @code class AmazonS3SoapBindingProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapAmazonS3SoapBindingService.h): @code class AmazonS3SoapBindingService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap s3 service method-protocol: GetObject SOAP //gsoap s3 service method-style: GetObject document //gsoap s3 service method-encoding: GetObject literal //gsoap s3 service method-action: GetObject "" //gsoap s3 service method-output-action: GetObject Response int __s3__GetObject( _s3__GetObject* s3__GetObject, ///< Input parameter _s3__GetObjectResponse &s3__GetObjectResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __s3__GetObjectExtended * * * \******************************************************************************/ /** Operation "__s3__GetObjectExtended" of service binding "AmazonS3SoapBinding". - SOAP document/literal style messaging - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___s3__GetObjectExtended( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _s3__GetObjectExtended* s3__GetObjectExtended, // output parameters: _s3__GetObjectExtendedResponse &s3__GetObjectExtendedResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __s3__GetObjectExtended( struct soap *soap, // input parameters: _s3__GetObjectExtended* s3__GetObjectExtended, // output parameters: _s3__GetObjectExtendedResponse &s3__GetObjectExtendedResponse ); @endcode C++ proxy class (defined in soapAmazonS3SoapBindingProxy.h): @code class AmazonS3SoapBindingProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapAmazonS3SoapBindingService.h): @code class AmazonS3SoapBindingService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap s3 service method-protocol: GetObjectExtended SOAP //gsoap s3 service method-style: GetObjectExtended document //gsoap s3 service method-encoding: GetObjectExtended literal //gsoap s3 service method-action: GetObjectExtended "" //gsoap s3 service method-output-action: GetObjectExtended Response int __s3__GetObjectExtended( _s3__GetObjectExtended* s3__GetObjectExtended, ///< Input parameter _s3__GetObjectExtendedResponse &s3__GetObjectExtendedResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __s3__PutObject * * * \******************************************************************************/ /** Operation "__s3__PutObject" of service binding "AmazonS3SoapBinding". - SOAP document/literal style messaging - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___s3__PutObject( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _s3__PutObject* s3__PutObject, // output parameters: _s3__PutObjectResponse &s3__PutObjectResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __s3__PutObject( struct soap *soap, // input parameters: _s3__PutObject* s3__PutObject, // output parameters: _s3__PutObjectResponse &s3__PutObjectResponse ); @endcode C++ proxy class (defined in soapAmazonS3SoapBindingProxy.h): @code class AmazonS3SoapBindingProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapAmazonS3SoapBindingService.h): @code class AmazonS3SoapBindingService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap s3 service method-protocol: PutObject SOAP //gsoap s3 service method-style: PutObject document //gsoap s3 service method-encoding: PutObject literal //gsoap s3 service method-action: PutObject "" //gsoap s3 service method-output-action: PutObject Response int __s3__PutObject( _s3__PutObject* s3__PutObject, ///< Input parameter _s3__PutObjectResponse &s3__PutObjectResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __s3__PutObjectInline * * * \******************************************************************************/ /** Operation "__s3__PutObjectInline" of service binding "AmazonS3SoapBinding". - SOAP document/literal style messaging - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___s3__PutObjectInline( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _s3__PutObjectInline* s3__PutObjectInline, // output parameters: _s3__PutObjectInlineResponse &s3__PutObjectInlineResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __s3__PutObjectInline( struct soap *soap, // input parameters: _s3__PutObjectInline* s3__PutObjectInline, // output parameters: _s3__PutObjectInlineResponse &s3__PutObjectInlineResponse ); @endcode C++ proxy class (defined in soapAmazonS3SoapBindingProxy.h): @code class AmazonS3SoapBindingProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapAmazonS3SoapBindingService.h): @code class AmazonS3SoapBindingService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap s3 service method-protocol: PutObjectInline SOAP //gsoap s3 service method-style: PutObjectInline document //gsoap s3 service method-encoding: PutObjectInline literal //gsoap s3 service method-action: PutObjectInline "" //gsoap s3 service method-output-action: PutObjectInline Response int __s3__PutObjectInline( _s3__PutObjectInline* s3__PutObjectInline, ///< Input parameter _s3__PutObjectInlineResponse &s3__PutObjectInlineResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __s3__DeleteObject * * * \******************************************************************************/ /** Operation "__s3__DeleteObject" of service binding "AmazonS3SoapBinding". - SOAP document/literal style messaging - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___s3__DeleteObject( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _s3__DeleteObject* s3__DeleteObject, // output parameters: _s3__DeleteObjectResponse &s3__DeleteObjectResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __s3__DeleteObject( struct soap *soap, // input parameters: _s3__DeleteObject* s3__DeleteObject, // output parameters: _s3__DeleteObjectResponse &s3__DeleteObjectResponse ); @endcode C++ proxy class (defined in soapAmazonS3SoapBindingProxy.h): @code class AmazonS3SoapBindingProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapAmazonS3SoapBindingService.h): @code class AmazonS3SoapBindingService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap s3 service method-protocol: DeleteObject SOAP //gsoap s3 service method-style: DeleteObject document //gsoap s3 service method-encoding: DeleteObject literal //gsoap s3 service method-action: DeleteObject "" //gsoap s3 service method-output-action: DeleteObject Response int __s3__DeleteObject( _s3__DeleteObject* s3__DeleteObject, ///< Input parameter _s3__DeleteObjectResponse &s3__DeleteObjectResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __s3__ListBucket * * * \******************************************************************************/ /** Operation "__s3__ListBucket" of service binding "AmazonS3SoapBinding". - SOAP document/literal style messaging - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___s3__ListBucket( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _s3__ListBucket* s3__ListBucket, // output parameters: _s3__ListBucketResponse &s3__ListBucketResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __s3__ListBucket( struct soap *soap, // input parameters: _s3__ListBucket* s3__ListBucket, // output parameters: _s3__ListBucketResponse &s3__ListBucketResponse ); @endcode C++ proxy class (defined in soapAmazonS3SoapBindingProxy.h): @code class AmazonS3SoapBindingProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapAmazonS3SoapBindingService.h): @code class AmazonS3SoapBindingService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap s3 service method-protocol: ListBucket SOAP //gsoap s3 service method-style: ListBucket document //gsoap s3 service method-encoding: ListBucket literal //gsoap s3 service method-action: ListBucket "" //gsoap s3 service method-output-action: ListBucket Response int __s3__ListBucket( _s3__ListBucket* s3__ListBucket, ///< Input parameter _s3__ListBucketResponse &s3__ListBucketResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __s3__ListAllMyBuckets * * * \******************************************************************************/ /** Operation "__s3__ListAllMyBuckets" of service binding "AmazonS3SoapBinding". - SOAP document/literal style messaging - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___s3__ListAllMyBuckets( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _s3__ListAllMyBuckets* s3__ListAllMyBuckets, // output parameters: _s3__ListAllMyBucketsResponse &s3__ListAllMyBucketsResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __s3__ListAllMyBuckets( struct soap *soap, // input parameters: _s3__ListAllMyBuckets* s3__ListAllMyBuckets, // output parameters: _s3__ListAllMyBucketsResponse &s3__ListAllMyBucketsResponse ); @endcode C++ proxy class (defined in soapAmazonS3SoapBindingProxy.h): @code class AmazonS3SoapBindingProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapAmazonS3SoapBindingService.h): @code class AmazonS3SoapBindingService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap s3 service method-protocol: ListAllMyBuckets SOAP //gsoap s3 service method-style: ListAllMyBuckets document //gsoap s3 service method-encoding: ListAllMyBuckets literal //gsoap s3 service method-action: ListAllMyBuckets "" //gsoap s3 service method-output-action: ListAllMyBuckets Response int __s3__ListAllMyBuckets( _s3__ListAllMyBuckets* s3__ListAllMyBuckets, ///< Input parameter _s3__ListAllMyBucketsResponse &s3__ListAllMyBucketsResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __s3__SetBucketLoggingStatus * * * \******************************************************************************/ /** Operation "__s3__SetBucketLoggingStatus" of service binding "AmazonS3SoapBinding". - SOAP document/literal style messaging - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___s3__SetBucketLoggingStatus( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _s3__SetBucketLoggingStatus* s3__SetBucketLoggingStatus, // output parameters: _s3__SetBucketLoggingStatusResponse&s3__SetBucketLoggingStatusResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __s3__SetBucketLoggingStatus( struct soap *soap, // input parameters: _s3__SetBucketLoggingStatus* s3__SetBucketLoggingStatus, // output parameters: _s3__SetBucketLoggingStatusResponse&s3__SetBucketLoggingStatusResponse ); @endcode C++ proxy class (defined in soapAmazonS3SoapBindingProxy.h): @code class AmazonS3SoapBindingProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapAmazonS3SoapBindingService.h): @code class AmazonS3SoapBindingService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap s3 service method-protocol: SetBucketLoggingStatus SOAP //gsoap s3 service method-style: SetBucketLoggingStatus document //gsoap s3 service method-encoding: SetBucketLoggingStatus literal //gsoap s3 service method-action: SetBucketLoggingStatus "" //gsoap s3 service method-output-action: SetBucketLoggingStatus Response int __s3__SetBucketLoggingStatus( _s3__SetBucketLoggingStatus* s3__SetBucketLoggingStatus, ///< Input parameter _s3__SetBucketLoggingStatusResponse&s3__SetBucketLoggingStatusResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __s3__GetBucketLoggingStatus * * * \******************************************************************************/ /** Operation "__s3__GetBucketLoggingStatus" of service binding "AmazonS3SoapBinding". - SOAP document/literal style messaging - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___s3__GetBucketLoggingStatus( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _s3__GetBucketLoggingStatus* s3__GetBucketLoggingStatus, // output parameters: _s3__GetBucketLoggingStatusResponse&s3__GetBucketLoggingStatusResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __s3__GetBucketLoggingStatus( struct soap *soap, // input parameters: _s3__GetBucketLoggingStatus* s3__GetBucketLoggingStatus, // output parameters: _s3__GetBucketLoggingStatusResponse&s3__GetBucketLoggingStatusResponse ); @endcode C++ proxy class (defined in soapAmazonS3SoapBindingProxy.h): @code class AmazonS3SoapBindingProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapAmazonS3SoapBindingService.h): @code class AmazonS3SoapBindingService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap s3 service method-protocol: GetBucketLoggingStatus SOAP //gsoap s3 service method-style: GetBucketLoggingStatus document //gsoap s3 service method-encoding: GetBucketLoggingStatus literal //gsoap s3 service method-action: GetBucketLoggingStatus "" //gsoap s3 service method-output-action: GetBucketLoggingStatus Response int __s3__GetBucketLoggingStatus( _s3__GetBucketLoggingStatus* s3__GetBucketLoggingStatus, ///< Input parameter _s3__GetBucketLoggingStatusResponse&s3__GetBucketLoggingStatusResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __s3__CopyObject * * * \******************************************************************************/ /** Operation "__s3__CopyObject" of service binding "AmazonS3SoapBinding". - SOAP document/literal style messaging - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___s3__CopyObject( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _s3__CopyObject* s3__CopyObject, // output parameters: _s3__CopyObjectResponse &s3__CopyObjectResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __s3__CopyObject( struct soap *soap, // input parameters: _s3__CopyObject* s3__CopyObject, // output parameters: _s3__CopyObjectResponse &s3__CopyObjectResponse ); @endcode C++ proxy class (defined in soapAmazonS3SoapBindingProxy.h): @code class AmazonS3SoapBindingProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapAmazonS3SoapBindingService.h): @code class AmazonS3SoapBindingService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap s3 service method-protocol: CopyObject SOAP //gsoap s3 service method-style: CopyObject document //gsoap s3 service method-encoding: CopyObject literal //gsoap s3 service method-action: CopyObject "" //gsoap s3 service method-output-action: CopyObject Response int __s3__CopyObject( _s3__CopyObject* s3__CopyObject, ///< Input parameter _s3__CopyObjectResponse &s3__CopyObjectResponse ///< Output parameter ); /** @page AmazonS3SoapBinding Binding "AmazonS3SoapBinding" @section AmazonS3SoapBinding_policy_enablers Policy Enablers of Binding "AmazonS3SoapBinding" None specified. */ /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. Data can be read and deserialized from: - an int file descriptor, using soap->recvfd = fd - a socket, using soap->socket = (int)... - a C++ stream (istream, stringstream), using soap->is = (istream*)... - a C string, using soap->is = (const char*)... - any input, using the soap->frecv() callback Data can be serialized and written to: - an int file descriptor, using soap->sendfd = (int)... - a socket, using soap->socket = (int)... - a C++ stream (ostream, stringstream), using soap->os = (ostream*)... - a C string, using soap->os = (const char**)... - any output, using the soap->fsend() callback The following options are available for (de)serialization control: - soap->encodingStyle = NULL; to remove SOAP 1.1/1.2 encodingStyle - soap_mode(soap, SOAP_XML_TREE); XML without id-ref (no cycles!) - soap_mode(soap, SOAP_XML_GRAPH); XML with id-ref (including cycles) - soap_set_namespaces(soap, struct Namespace *nsmap); to set xmlns bindings @section s3 Top-level root elements of schema "http://s3.amazonaws.com/doc/2006-03-01/" - @ref _s3__CreateBucket @code // Reader (returns SOAP_OK on success): soap_read__s3__CreateBucket(struct soap*, _s3__CreateBucket*); // Writer (returns SOAP_OK on success): soap_write__s3__CreateBucket(struct soap*, _s3__CreateBucket*); @endcode - @ref _s3__CreateBucketResponse @code // Reader (returns SOAP_OK on success): soap_read__s3__CreateBucketResponse(struct soap*, _s3__CreateBucketResponse*); // Writer (returns SOAP_OK on success): soap_write__s3__CreateBucketResponse(struct soap*, _s3__CreateBucketResponse*); @endcode - @ref _s3__DeleteBucket @code // Reader (returns SOAP_OK on success): soap_read__s3__DeleteBucket(struct soap*, _s3__DeleteBucket*); // Writer (returns SOAP_OK on success): soap_write__s3__DeleteBucket(struct soap*, _s3__DeleteBucket*); @endcode - @ref _s3__DeleteBucketResponse @code // Reader (returns SOAP_OK on success): soap_read__s3__DeleteBucketResponse(struct soap*, _s3__DeleteBucketResponse*); // Writer (returns SOAP_OK on success): soap_write__s3__DeleteBucketResponse(struct soap*, _s3__DeleteBucketResponse*); @endcode - @ref _s3__GetBucketLoggingStatus @code // Reader (returns SOAP_OK on success): soap_read__s3__GetBucketLoggingStatus(struct soap*, _s3__GetBucketLoggingStatus*); // Writer (returns SOAP_OK on success): soap_write__s3__GetBucketLoggingStatus(struct soap*, _s3__GetBucketLoggingStatus*); @endcode - @ref _s3__GetBucketLoggingStatusResponse @code // Reader (returns SOAP_OK on success): soap_read__s3__GetBucketLoggingStatusResponse(struct soap*, _s3__GetBucketLoggingStatusResponse*); // Writer (returns SOAP_OK on success): soap_write__s3__GetBucketLoggingStatusResponse(struct soap*, _s3__GetBucketLoggingStatusResponse*); @endcode - @ref _s3__SetBucketLoggingStatus @code // Reader (returns SOAP_OK on success): soap_read__s3__SetBucketLoggingStatus(struct soap*, _s3__SetBucketLoggingStatus*); // Writer (returns SOAP_OK on success): soap_write__s3__SetBucketLoggingStatus(struct soap*, _s3__SetBucketLoggingStatus*); @endcode - @ref _s3__SetBucketLoggingStatusResponse @code // Reader (returns SOAP_OK on success): soap_read__s3__SetBucketLoggingStatusResponse(struct soap*, _s3__SetBucketLoggingStatusResponse*); // Writer (returns SOAP_OK on success): soap_write__s3__SetBucketLoggingStatusResponse(struct soap*, _s3__SetBucketLoggingStatusResponse*); @endcode - @ref _s3__GetObjectAccessControlPolicy @code // Reader (returns SOAP_OK on success): soap_read__s3__GetObjectAccessControlPolicy(struct soap*, _s3__GetObjectAccessControlPolicy*); // Writer (returns SOAP_OK on success): soap_write__s3__GetObjectAccessControlPolicy(struct soap*, _s3__GetObjectAccessControlPolicy*); @endcode - @ref _s3__GetObjectAccessControlPolicyResponse @code // Reader (returns SOAP_OK on success): soap_read__s3__GetObjectAccessControlPolicyResponse(struct soap*, _s3__GetObjectAccessControlPolicyResponse*); // Writer (returns SOAP_OK on success): soap_write__s3__GetObjectAccessControlPolicyResponse(struct soap*, _s3__GetObjectAccessControlPolicyResponse*); @endcode - @ref _s3__GetBucketAccessControlPolicy @code // Reader (returns SOAP_OK on success): soap_read__s3__GetBucketAccessControlPolicy(struct soap*, _s3__GetBucketAccessControlPolicy*); // Writer (returns SOAP_OK on success): soap_write__s3__GetBucketAccessControlPolicy(struct soap*, _s3__GetBucketAccessControlPolicy*); @endcode - @ref _s3__GetBucketAccessControlPolicyResponse @code // Reader (returns SOAP_OK on success): soap_read__s3__GetBucketAccessControlPolicyResponse(struct soap*, _s3__GetBucketAccessControlPolicyResponse*); // Writer (returns SOAP_OK on success): soap_write__s3__GetBucketAccessControlPolicyResponse(struct soap*, _s3__GetBucketAccessControlPolicyResponse*); @endcode - @ref _s3__SetObjectAccessControlPolicy @code // Reader (returns SOAP_OK on success): soap_read__s3__SetObjectAccessControlPolicy(struct soap*, _s3__SetObjectAccessControlPolicy*); // Writer (returns SOAP_OK on success): soap_write__s3__SetObjectAccessControlPolicy(struct soap*, _s3__SetObjectAccessControlPolicy*); @endcode - @ref _s3__SetObjectAccessControlPolicyResponse @code // Reader (returns SOAP_OK on success): soap_read__s3__SetObjectAccessControlPolicyResponse(struct soap*, _s3__SetObjectAccessControlPolicyResponse*); // Writer (returns SOAP_OK on success): soap_write__s3__SetObjectAccessControlPolicyResponse(struct soap*, _s3__SetObjectAccessControlPolicyResponse*); @endcode - @ref _s3__SetBucketAccessControlPolicy @code // Reader (returns SOAP_OK on success): soap_read__s3__SetBucketAccessControlPolicy(struct soap*, _s3__SetBucketAccessControlPolicy*); // Writer (returns SOAP_OK on success): soap_write__s3__SetBucketAccessControlPolicy(struct soap*, _s3__SetBucketAccessControlPolicy*); @endcode - @ref _s3__SetBucketAccessControlPolicyResponse @code // Reader (returns SOAP_OK on success): soap_read__s3__SetBucketAccessControlPolicyResponse(struct soap*, _s3__SetBucketAccessControlPolicyResponse*); // Writer (returns SOAP_OK on success): soap_write__s3__SetBucketAccessControlPolicyResponse(struct soap*, _s3__SetBucketAccessControlPolicyResponse*); @endcode - @ref _s3__GetObject @code // Reader (returns SOAP_OK on success): soap_read__s3__GetObject(struct soap*, _s3__GetObject*); // Writer (returns SOAP_OK on success): soap_write__s3__GetObject(struct soap*, _s3__GetObject*); @endcode - @ref _s3__GetObjectResponse @code // Reader (returns SOAP_OK on success): soap_read__s3__GetObjectResponse(struct soap*, _s3__GetObjectResponse*); // Writer (returns SOAP_OK on success): soap_write__s3__GetObjectResponse(struct soap*, _s3__GetObjectResponse*); @endcode - @ref _s3__GetObjectExtended @code // Reader (returns SOAP_OK on success): soap_read__s3__GetObjectExtended(struct soap*, _s3__GetObjectExtended*); // Writer (returns SOAP_OK on success): soap_write__s3__GetObjectExtended(struct soap*, _s3__GetObjectExtended*); @endcode - @ref _s3__GetObjectExtendedResponse @code // Reader (returns SOAP_OK on success): soap_read__s3__GetObjectExtendedResponse(struct soap*, _s3__GetObjectExtendedResponse*); // Writer (returns SOAP_OK on success): soap_write__s3__GetObjectExtendedResponse(struct soap*, _s3__GetObjectExtendedResponse*); @endcode - @ref _s3__PutObject @code // Reader (returns SOAP_OK on success): soap_read__s3__PutObject(struct soap*, _s3__PutObject*); // Writer (returns SOAP_OK on success): soap_write__s3__PutObject(struct soap*, _s3__PutObject*); @endcode - @ref _s3__PutObjectResponse @code // Reader (returns SOAP_OK on success): soap_read__s3__PutObjectResponse(struct soap*, _s3__PutObjectResponse*); // Writer (returns SOAP_OK on success): soap_write__s3__PutObjectResponse(struct soap*, _s3__PutObjectResponse*); @endcode - @ref _s3__PutObjectInline @code // Reader (returns SOAP_OK on success): soap_read__s3__PutObjectInline(struct soap*, _s3__PutObjectInline*); // Writer (returns SOAP_OK on success): soap_write__s3__PutObjectInline(struct soap*, _s3__PutObjectInline*); @endcode - @ref _s3__PutObjectInlineResponse @code // Reader (returns SOAP_OK on success): soap_read__s3__PutObjectInlineResponse(struct soap*, _s3__PutObjectInlineResponse*); // Writer (returns SOAP_OK on success): soap_write__s3__PutObjectInlineResponse(struct soap*, _s3__PutObjectInlineResponse*); @endcode - @ref _s3__DeleteObject @code // Reader (returns SOAP_OK on success): soap_read__s3__DeleteObject(struct soap*, _s3__DeleteObject*); // Writer (returns SOAP_OK on success): soap_write__s3__DeleteObject(struct soap*, _s3__DeleteObject*); @endcode - @ref _s3__DeleteObjectResponse @code // Reader (returns SOAP_OK on success): soap_read__s3__DeleteObjectResponse(struct soap*, _s3__DeleteObjectResponse*); // Writer (returns SOAP_OK on success): soap_write__s3__DeleteObjectResponse(struct soap*, _s3__DeleteObjectResponse*); @endcode - @ref _s3__ListBucket @code // Reader (returns SOAP_OK on success): soap_read__s3__ListBucket(struct soap*, _s3__ListBucket*); // Writer (returns SOAP_OK on success): soap_write__s3__ListBucket(struct soap*, _s3__ListBucket*); @endcode - @ref _s3__ListBucketResponse @code // Reader (returns SOAP_OK on success): soap_read__s3__ListBucketResponse(struct soap*, _s3__ListBucketResponse*); // Writer (returns SOAP_OK on success): soap_write__s3__ListBucketResponse(struct soap*, _s3__ListBucketResponse*); @endcode - @ref _s3__ListVersionsResponse @code // Reader (returns SOAP_OK on success): soap_read__s3__ListVersionsResponse(struct soap*, _s3__ListVersionsResponse*); // Writer (returns SOAP_OK on success): soap_write__s3__ListVersionsResponse(struct soap*, _s3__ListVersionsResponse*); @endcode - @ref _s3__ListAllMyBuckets @code // Reader (returns SOAP_OK on success): soap_read__s3__ListAllMyBuckets(struct soap*, _s3__ListAllMyBuckets*); // Writer (returns SOAP_OK on success): soap_write__s3__ListAllMyBuckets(struct soap*, _s3__ListAllMyBuckets*); @endcode - @ref _s3__ListAllMyBucketsResponse @code // Reader (returns SOAP_OK on success): soap_read__s3__ListAllMyBucketsResponse(struct soap*, _s3__ListAllMyBucketsResponse*); // Writer (returns SOAP_OK on success): soap_write__s3__ListAllMyBucketsResponse(struct soap*, _s3__ListAllMyBucketsResponse*); @endcode - @ref _s3__PostResponse @code // Reader (returns SOAP_OK on success): soap_read__s3__PostResponse(struct soap*, _s3__PostResponse*); // Writer (returns SOAP_OK on success): soap_write__s3__PostResponse(struct soap*, _s3__PostResponse*); @endcode - @ref _s3__CopyObject @code // Reader (returns SOAP_OK on success): soap_read__s3__CopyObject(struct soap*, _s3__CopyObject*); // Writer (returns SOAP_OK on success): soap_write__s3__CopyObject(struct soap*, _s3__CopyObject*); @endcode - @ref _s3__CopyObjectResponse @code // Reader (returns SOAP_OK on success): soap_read__s3__CopyObjectResponse(struct soap*, _s3__CopyObjectResponse*); // Writer (returns SOAP_OK on success): soap_write__s3__CopyObjectResponse(struct soap*, _s3__CopyObjectResponse*); @endcode */ /* End of aws-s3.h */ gsoap-2.8.91/gsoap/samples/googleapi/0000755000175000017500000000000013525245174017017 5ustar ellertellertgsoap-2.8.91/gsoap/samples/googleapi/GoogleDirections.hpp0000644000175000017500000005210113525245163022765 0ustar ellertellert/* GoogleDirections.hpp Google Maps Directions API example C++ client This file is imported by gdm.hpp and its contents placed in the 'gdm' C++ namespace. For more details about this API, visit: https://developers.google.com/maps/documentation/directions/intro -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2017, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //////////////////////////////////////////////////////////////////////////////// // // GeocodedWaypoint // //////////////////////////////////////////////////////////////////////////////// /// indicates the status code resulting from the geocoding operation. typedef enum DirectionsGeocoderStatus { /// indicates that no errors occurred; the address was successfully parsed and at least one geocode was returned. DirectionsGeocoderStatus__OK, /// indicates that the geocode was successful but returned no results. This may occur if the geocoder was passed a non-existent address. DirectionsGeocoderStatus__ZERO_USCORERESULTS, } DirectionsGeocoderStatus; /// contains details about the geocoding of origin, destination and waypoints. class DirectionsGeocodedWaypoint { /// indicates the status code resulting from the geocoding operation. DirectionsGeocoderStatus geocoder_USCOREstatus; /// indicates that the geocoder did not return an exact match for the original request, though it was able to match part of the requested address. You may wish to examine the original request for misspellings and/or an incomplete address. std::string *partial_USCOREmatch; // optional partial_match /// a unique identifier that can be used with other Google APIs. For example, you can use the place_id from a Google Place Autocomplete response to calculate directions to a local business. std::string place_USCOREid; /// indicates the address type of the geocoding result used for calculating directions. std::vector type; }; //////////////////////////////////////////////////////////////////////////////// // // Step // //////////////////////////////////////////////////////////////////////////////// /// distance in meters. class DirectionsDistance { /// indicates the distance in meters double value; /// contains a human-readable representation of the distance, displayed in units as used at the origin (or as overridden within the units parameter in the request). (For example, miles and feet will be used for any origin within the United States.) Note that regardless of what unit system is displayed as text, the distance.value field always contains a value expressed in meters. std::string text; }; /// duration in seconds. class DirectionsDuration { /// indicates the duration in seconds. double value; /// contains a human-readable representation of the duration. std::string text; }; /// contains a location as a single set of lat and lng fields. class DirectionsLatLng { /// location lat double lat; /// location lng double lng; }; /// contains a single points object that holds an encoded polyline representation of the step. This polyline is an approximate (smoothed) path of the step. class DirectionsPolyline { /// encoded polyline representation https://developers.google.com/maps/documentation/utilities/polylinealgorithm std::string points; }; /// contains information about the stop/station for this part of the trip. class DirectionsStop { /// the name of the transit station/stop. eg. "Union Square". std::string name; /// the location of the transit station/stop, represented as a lat and lng field. DirectionsLatLng location; }; /// contain the arrival or departure times for this leg of the journey. class DirectionsTime { std::string value; // contains Unix time, or seconds since 1/1/2070 UTC a JavaScript Date object std::string text; std::string time_USCOREzone; }; /// contains an array of TransitAgency objects that each provide information about the operator of the line. class DirectionsAgency { /// contains the name of the transit agency. std::string name; /// contains the URL for the transit agency. std::string url; /// contains the phone number of the transit agency. std::string phone; }; /// contains the type of vehicle that runs on this line. typedef enum DirectionsVehicleType { /// Rail. DirectionsVehicleType__RAIL, /// Light rail transit. DirectionsVehicleType__METRO_USCORERAIL, /// Underground light rail. DirectionsVehicleType__SUBWAY, /// Above ground light rail. DirectionsVehicleType__TRAM, /// Monorail. DirectionsVehicleType__MONORAIL, /// Heavy rail. DirectionsVehicleType__HEAVY_USCORERAIL, /// Commuter rail. DirectionsVehicleType__COMMUTER_USCORETRAIN, /// High speed train. DirectionsVehicleType__HIGH_USCORESPEED_USCORETRAIN, /// Bus. DirectionsVehicleType__BUS, /// Intercity bus. DirectionsVehicleType__INTERCITY_USCOREBUS, /// Trolleybus. DirectionsVehicleType__TROLLEYBUS, /// Share taxi is a kind of bus with the ability to drop off and pick up passengers anywhere on its route. DirectionsVehicleType__SHARE_USCORETAXI, /// Ferry. DirectionsVehicleType__FERRY, /// A vehicle that operates on a cable, usually on the ground. Aerial cable cars may be of the type GONDOLA_LIFT. DirectionsVehicleType__CABLE_USCORECAR, /// An aerial cable car. DirectionsVehicleType__GONDOLA_USCORELIFT, /// A vehicle that is pulled up a steep incline by a cable. A Funicular typically consists of two cars, with each car acting as a counterweight for the other. DirectionsVehicleType__FUNICULAR, /// All other vehicles will return this type. DirectionsVehicleType__OTHER, } DirectionsVehicleType; /// contains the type of vehicle used on this line. class DirectionsVehicle { /// contains the name of the vehicle on this line. eg. "Subway." std::string name; /// contains the type of vehicle that runs on this line. DirectionsVehicleType type; /// contains the URL for an icon associated with this vehicle type. std::string icon; /// contains the URL for the icon associated with this vehicle type, based on the local transport signage. std::string local_USCOREicon; }; /// contains information about the transit line used in this step. class DirectionsLine { /// contains the full name of this transit line. eg. "7 Avenue Express". std::string name; /// contains the short name of this transit line. This will normally be a line number, such as "M7" or "355". std::string short_USCOREname; /// contains the color commonly used in signage for this transit line. The color will be specified as a hex string such as: #FF0033. std::string color; /// contains an array of TransitAgency objects that each provide information about the operator of the line. You must display the names and URLs of the transit agencies servicing the trip results. std::vector agency; /// contains the URL for this transit line as provided by the transit agency. std::string url; /// contains the URL for the icon associated with this line. std::string icon; /// contains the color of text commonly used for signage of this line. The color will be specified as a hex string. std::string text_USCOREcolor; /// contains the type of vehicle used on this line. DirectionsVehicle vehicle; }; /// contains additional information that is not relevant for other modes of transportation. These additional properties are exposed through the transit_details object, returned as a field of an element in the steps[] array. From the TransitDetails object you can access additional information about the transit stop, transit line and transit agency. class DirectionsTransitDetails { /// contains information about the stop/station for this part of the trip. DirectionsStop arrival_USCOREstop; /// contains information about the stop/station for this part of the trip. DirectionsStop departure_USCOREstop; /// contain the arrival or departure times for this leg of the journey. DirectionsTime arrival_USCOREtime; /// contain the arrival or departure times for this leg of the journey. DirectionsTime departure_USCOREtime; /// specifies the direction in which to travel on this line, as it is marked on the vehicle or at the departure stop. This will often be the terminus station. std::string headsign; /// specifies the expected number of seconds between departures from the same stop at this time. For example, with a headway value of 600, you would expect a ten minute wait if you should miss your bus. unsigned long headway; /// contains the number of stops in this step, counting the arrival stop, but not the departure stop. For example, if your directions involve leaving from Stop A, passing through stops B and C, and arriving at stop D, num_stops will return 3. unsigned long num_USCOREstops; /// contains information about the transit line used in this step. DirectionsLine line; }; /// defines a single step of the calculated directions. A step is the most atomic unit of a direction's route, containing a single step describing a specific, single instruction on the journey. E.g. "Turn left at W. 4th St." The step not only describes the instruction but also contains distance and duration information relating to how this step relates to the following step. For example, a step denoted as "Merge onto I-80 West" may contain a duration of "37 miles" and "40 minutes," indicating that the next step is 37 miles/40 minutes from this step. class DirectionsStep { /// contains formatted instructions for this step, presented as an HTML text string. std::string html_USCOREinstructions; /// contains the mode of travel (not documented by Google Maps API). std::string travel_USCOREmode; /// contains maneuver instructions (not documented by the Google Maps API). std::string *maneuver; /// contains the distance covered by this step until the next step. This field may be undefined if the distance is unknown. DirectionsDistance *distance; // optional distance /// contains the typical time required to perform the step, until the next step. This field may be undefined if the duration is unknown. DirectionsDuration *duration; /// contains the location of the starting point of this step, as a single set of lat and lng fields. DirectionsLatLng start_USCORElocation; /// contains the location of the last point of this step, as a single set of lat and lng fields. DirectionsLatLng end_USCORElocation; /// contains a single points object that holds an encoded polyline representation of the step. This polyline is an approximate (smoothed) path of the step. DirectionsPolyline polyline; /// contains detailed directions for walking or driving steps in transit directions. Substeps are only available when travel_mode is set to "transit". The inner steps array is of the same type as steps. std::vector step; /// contains transit specific information. This field is only returned with travel_mode is set to "transit". DirectionsTransitDetails *transit_USCOREdetails; }; //////////////////////////////////////////////////////////////////////////////// // // Leg // //////////////////////////////////////////////////////////////////////////////// /// specifies a single leg of the journey from the origin to the destination in the calculated route. For routes that contain no waypoints, the route will consist of a single "leg," but for routes that define one or more waypoints, the route will consist of one or more legs, corresponding to the specific legs of the journey. class DirectionsLeg { /// contains an array of steps denoting information about each separate step of the leg of the journey. std::vector step; /// indicates the total distance covered by this leg. DirectionsDistance *distance; // optional distance /// indicates the total duration of this leg. DirectionsDuration *duration; // optional duration /// indicates the total duration of this leg. This value is an estimate of the time in traffic based on current and historical traffic conditions. DirectionsDuration *duration_USCOREin_USCOREtraffic; // optional duration_in_traffic /// contains the estimated time of arrival for this leg. This property is only returned for transit directions. DirectionsTime *arrival_USOREtime; // optional arrival_time /// contains the estimated time of departure for this leg, specified as a Time object. The departure_time is only available for transit directions. DirectionsTime *departure_USCOREtime; // optional departure_time /// contains the latitude/longitude coordinates of the origin of this leg. Because the Directions API calculates directions between locations by using the nearest transportation option (usually a road) at the start and end points, start_location may be different than the provided origin of this leg if, for example, a road is not near the origin. DirectionsLatLng start_USCORElocation; /// contains the latitude/longitude coordinates of the given destination of this leg. Because the Google Maps Directions API calculates directions between locations by using the nearest transportation option (usually a road) at the start and end points, end_location may be different than the provided destination of this leg if, for example, a road is not near the destination. DirectionsLatLng end_USCORElocation; /// contains the human-readable address (typically a street address) resulting from reverse geocoding the start_location of this leg. std::string start_USCOREaddress; /// contains the human-readable address (typically a street address) from reverse geocoding the end_location of this leg. std::string end_USCOREaddress; }; //////////////////////////////////////////////////////////////////////////////// // // Route // //////////////////////////////////////////////////////////////////////////////// /// the viewport bounding box of the overview_polyline. class DirectionsBound { /// NE corner of the bounding box. DirectionsLatLng northeast; /// SW corner of the bounding box. DirectionsLatLng southwest; }; /// ISO 4217 currency code indicating the currency that the amount is expressed in. typedef std::string DirectionsCurrency 3:3; /// the total fare (that is, the total ticket costs) on this route. This property is only returned for transit requests and only for routes where fare information is available for all transit legs. class DirectionsFare { /// an ISO 4217 currency code indicating the currency that the amount is expressed in. DirectionsCurrency currency; /// the total fare amount, in the currency specified above. double value; /// the total fare amount, formatted in the requested language. std::string text; }; /// contains a single result from the specified origin and destination. This route may consist of one or more legs depending on whether any waypoints were specified. As well, the route also contains copyright and warning information which must be displayed to the user in addition to the routing information. class DirectionsRoute { /// contains a short textual description for the route, suitable for naming and disambiguating the route from alternatives. std::string summary; /// contains an array which contains information about a leg of the route, between two locations within the given route. A separate leg will be present for each waypoint or destination specified. (A route with no waypoints will contain exactly one leg within the legs array.) Each leg consists of a series of steps. std::vector leg; /// contains an array indicating the order of any waypoints in the calculated route. This waypoints may be reordered if the request was passed optimize:true within its waypoints parameter. std::vector waypoint_USCOREindex; /// contains a single points object that holds an encoded polyline representation of the route. This polyline is an approximate (smoothed) path of the resulting directions. DirectionsPolyline overview_USCOREpolyline; /// contains the viewport bounding box of the overview_polyline. std::vector bounds; /// contains the copyrights text to be displayed for this route. You must handle and display this information yourself. std::string copyrights; /// contains an array of warnings to be displayed when showing these directions. You must handle and display these warnings yourself. std::vector warning; /// contains the total fare (that is, the total ticket costs) on this route. This property is only returned for transit requests and only for routes where fare information is available for all transit legs. DirectionsFare *fare; // optional fare }; //////////////////////////////////////////////////////////////////////////////// // // DirectionsResponse // //////////////////////////////////////////////////////////////////////////////// /// contains the status of the request, and may contain debugging information to help you track down why the Directions service failed. typedef enum DirectionsStatus { /// indicates the response contains a valid result. DirectionsStatus__OK, /// indicates at least one of the locations specified in the request's origin, destination, or waypoints could not be geocoded DirectionsStatus__NOT_USCOREFOUND, /// indicates no route could be found between the origin and destination. DirectionsStatus__ZERO_USCORERESULTS, /// indicates that too many waypoints were provided in the request. For applications using the Google Maps Directions API as a web service, or the directions service in the Google Maps JavaScript API, the maximum allowed number of waypoints is 23, plus the origin and destination. Google Maps APIs Premium Plan customers may submit requests with up to 23 waypoints, plus the origin and destination. DirectionsStatus__MAX_USCOREWAYPOINTS_USCOREEXCEEDED, /// indicates the requested route is too long and cannot be processed. DirectionsStatus__MAX_USCOREROUTE_USCORELENGTH_USCOREEXCEEDED, /// indicates that the provided request was invalid. Common causes of this status include an invalid parameter or parameter value. DirectionsStatus__INVALID_USCOREREQUEST, /// indicates the service has received too many requests from your application within the allowed time period. DirectionsStatus__OVER_USCOREQUERY_USCORELIMIT, /// indicates that the service denied use of the directions service by your application. DirectionsStatus__REQUEST_USCOREDENIED, /// indicates a directions request could not be processed due to a server error. The request may succeed if you try again. DirectionsStatus__UNKNOWN_USCOREERROR, } DirectionsStatus; /// root element class DirectionsResponse { /// contains the status of the request, and may contain debugging information to help you track down why the Directions service failed. DirectionsStatus status; /// detailed information about the reasons behind the given status code. std::string error_USCOREmessage 0; // optional error_message /// contains an array with details about the geocoding of origin, destination and waypoints. std::vector geocoded_USCOREwaypoint; /// contains an array of routes from the origin to the destination. std::vector route; /// contains an array of available travel modes. This field is returned when a request specifies a travel mode and gets no results. The array contains the available travel modes in the countries of the given set of waypoints. This field is not returned if one or more of the waypoints are via: waypoints. std::vector available_USCOREtravel_USCOREmodes; }; gsoap-2.8.91/gsoap/samples/googleapi/README.md0000644000175000017500000007700013525245163020300 0ustar ellertellertGoogle Maps API C++ examples ============================ This example explains the implementation of two client applications for the Google Maps API: - `gdm` Google Distance Matrix: search for travel distance and time for a matrix of origins and destinations. Returns a matrix of distances and time for each pair of origin and destination. Specify mode of transportation, unit (metric or imperial), origin addresses, and destination addresses as as text strings or as latitude/longitude coordinates, or as place IDs. - `gdx` Google Directions: search for directions for several modes of transportation, including transit, driving, walking or cycling. Returns multi-part directions using a series of waypoints. Specify mode of transportation, unit (metric or imperial), origin address, and destination address as as text strings or as latitude/longitude coordinates, or as place IDs. These applications are executed from the command line. To find all pair-wise bicycling distances and times from Vancouver BC or from Seattle to San Francisco or to Vancouver BC: ./gdm bicycling imperial 'Vancouver BC|Seattle' 'San Francisco|Vancouver BC' ---------------------------------------- from: Vancouver, BC, Canada to: San Francisco, CA, USA duration: 326774 (3 days 19 hours) distance: 1.70553e+06 (1,060 mi) to: Vancouver, BC, Canada duration: 0 (1 min) distance: 0 (1 ft) ---------------------------------------- from: Seattle, WA, USA to: San Francisco, CA, USA duration: 274759 (3 days 4 hours) distance: 1.45204e+06 (902 mi) to: Vancouver, BC, Canada duration: 55726 (15 hours 29 mins) distance: 271157 (168 mi) ---------------------------------------- To find public transit directions from Times Square to Battery Park in New York City: ./gdx transit imperial 'Times Square,New York,NY' 'Battery Park,New York,NY' ---------------------------------------- summary: warning: Walking directions are in beta. Use caution – This route may be missing sidewalks or pedestrian paths. copyrights: Map data ©2017 Google from Manhattan, NY 10036, USA to Battery Park, New York, NY 10004, USA takes 7386 meters (4.6 mi) 1531 seconds (26 mins) Walk to Times Sq - 42 St WALKING 551 meters (0.3 mi) 353 seconds (6 mins) Head southeast on W 46th St toward Broadway => WALKING 8 meters (26 ft) 6 seconds (1 min) Turn right onto Broadway => turn-right, WALKING 107 meters (351 ft) 81 seconds (1 min) Slight right onto 7th Ave
Destination will be on the left
=> turn-slight-right, WALKING 318 meters (0.2 mi) 254 seconds (4 mins) => WALKING 118 meters (387 ft) 12 seconds (1 min) Subway towards South Ferry TRANSIT 6705 meters (4.2 mi) 1080 seconds (18 mins) take transit at 11:37am from Times Sq - 42 St to South Ferry Station arriving at 11:56am: => Subway Broadway - 7 Avenue Local line 1 heading South Ferry and exit at stop 12 (operated by MTA New York City Transit http://www.mta.info/) Walk to Battery Park, New York, NY 10004, USA WALKING 130 meters (427 ft) 100 seconds (2 mins) Head north on Peter Minuit Plaza => WALKING 17 meters (56 ft) 13 seconds (1 min) Turn left to stay on Peter Minuit Plaza => turn-left, WALKING 68 meters (223 ft) 51 seconds (1 min) Turn left onto Battery Bikeway
Destination will be on the right
=> turn-left, WALKING 45 meters (148 ft) 36 seconds (1 min) The `gdm` and `gdx` example client applications use the Google Maps APIs with XML responses. You can find a JSON-based `gdm` implementation `json-GoogleDistanceMatrix.cpp` for the Google Maps Distance Matrix API in gsoap/samples/xml-rpc-json in the gSOAP source code tree. These are just two examples of the Google Maps API that can be developed quite easily with gSOAP. Using XML data bindings ----------------------- Interestingly, Google refers to JSON as the preferred response format. However, an XML API is more practical in C++ code with gSOAP's XML data bindings than the JSON API (in any C/C++ JSON implementation). An XML data binding offers the benefit of strong typing in C++ for reliable API coding. Of course, this assumes that an XML data binding interface header file is already defined in order to generate the XML data binding implementation with soapcpp2. In order to auto-generate an XML data binding interface header file with wsdl2h we need a WSDL or at least an XSD (XML schema) file. A WSDL or XML schema serves as a contract between the Web service and the client applications that use the Web service. Unfortunately, no WSDL or XML schema is provided for Google Maps APIs. Without a WSDL or XSD we cannot auto-generate the data binding interface with the gSOAP wsdl2h tool. However, it is relatively easy to define the data binding interface header file manually based on the Google Maps API documentation. The Google Maps API documentation is somewhat incomplete. Returned values are poorly defined with respect to the type of the values returned. Some elements, such as the Directions API `maneuver` element, are not documented at all. Or values are not documented, such as the `establishment` value of the `type` element in `geocoded_waypoints`. Some XML elements (JSON objects) appear to be optional, guessing from the examples and descriptions. Numerical values appear to be integer, but JSON numerical values are unconstrained decimal according to the JSON "standard". We assume that the C/C++ `double` type will suffice to store numerical values returned by the API. Google Maps Distance Matrix API ------------------------------- The Google Maps Distance Matrix API returns information based on the recommended route between start and end points, as calculated by the Google Maps API, and consists of rows containing duration and distance values for each pair. See: A Google Maps Distance Matrix API GET request URL takes the following form: https://maps.googleapis.com/maps/api/distancematrix/outputFormat?parameters where `outputFormat` may be either `json` or `xml`. To use the Google Maps Distance Matrix API you need an API key. To get an API key visit: Google Maps Directions API -------------------------- The Google Maps Directions API returns the most efficient routes when calculating directions. Travel time is the primary factor optimized, but the API may also take into account other factors such as distance, number of turns and many more when deciding which route is the most efficient. Calculating directions is a time and resource intensive task. Whenever possible, use the service described here to calculate known addresses ahead of time and store the results in a temporary cache of your own design. See: A Google Maps Directions API GET request URL takes the following form: https://maps.googleapis.com/maps/api/directions/outputFormat?parameters where `outputFormat` may be either `json` or `xml`. To use the Google Maps Distance Matrix API you need an API key. To get an API key visit: Google Maps Distance Matrix API interface header file ----------------------------------------------------- The `gdm` example client applications uses the Google Maps APIs with XML responses. For example, given "Vancouver BC" and "Seattle" as origins, "San Fransicso" and "Vancouver BS" as destinations, the following GET request computes the bycycling durations and distance for the four origin-destination pair combinations: https://maps.googleapis.com/maps/api/distancematrix/xml?origins=Vancouver+BC|Seattle&destinations=San+Francisco|Vancouver+BC&mode=bicycling&units=imperial&key=YOUR_API_KEY This returns the following XML response by the API: OK Vancouver, BC, Canada Seattle, WA, USA San Francisco, CA, USA Vancouver, BC, Canada OK 326774 3 days 19 hours 1705533 1,060 mi OK 0 1 min 0 1 ft OK 274759 3 days 4 hours 1452044 902 mi OK 55726 15 hours 29 mins 271157 168 mi To use XML data bindings with gSOAP to parse this XML directly into C++ objects, we define an interface header file `GoogleDistanceMatrix.hpp` as follows. The interface header file declares the `DistanceMatrixResponse` element that contains a `row` container with `element` containers. ### DistanceMatrixResponse Distance Matrix responses contain the following root elements: - `status` contains metadata on the request. - `origin_addresses` contains an array of addresses as returned by the API from your original request. These are formatted by the geocoder and localized according to the language parameter passed with the request. - `destination_addresses` contains an array of addresses as returned by the API from your original request. As with `origin_addresses`, these are localized if appropriate. - `rows` contains an array of elements, which in turn each contain a `status`, `duration`, and `distance` element. When the top-level status code is other than OK, there may be an additional `error_message` field within the Distance Matrix response object. This field contains more detailed information about the reasons behind the given status code. For more details on the XML elements and their values, see The `DistanceMatrixResponse` root element is declared in our data binding interface file `GoogleDistanceMatrix.hpp` as: class DistanceMatrixResponse { DistanceMatrixStatus status; std::string error_USCOREmessage 0; // optional error_message std::vector origin_USCOREaddress; std::vector destination_USCOREaddress; std::vector row; }; The gSOAP naming conventions for XML data bindings translate each underscore in XML to `_USCORE`, so we use `_USCORE` in place of an underscore in C++ names. The `error_USCOREmessage` element is optional. This can be made a pointer-based member to make it optional (the pointer is NULL when the element is omitted), but in this case we just declare it optional with a `0` minOccurs constraint. We define the `status` code for our `DistanceMatrixResponse` class as an enumeration, corresponding to the Distance Matrix API's status codes: typedef enum DistanceMatrixStatus { DistanceMatrixStatus__OK, DistanceMatrixStatus__INVALID_USCOREREQUEST, DistanceMatrixStatus__MAX_USCOREELEMENTS_USCOREEXCEEDED, DistanceMatrixStatus__OVER_USCOREQUERY_USCORELIMIT, DistanceMatrixStatus__REQUEST_USCOREDENIED, DistanceMatrixStatus__UNKNOWN_USCOREERROR, } DistanceMatrixStatus; Again, we used `_USCORE` to translate underscores to `_USCORE`. Note that we prefix the enumeration constants with the enumeration type name. This ensures that the enumeration constants are unique, while still being serialized in their short form. Much nicer is to use C++11 scoped enumerations that do not require prefixing of the enumeration constants. But we will stick to C++ here. Alternatively, we could have just used a string for the type of `status`, but enumerations are strongly typed, meaning the C++ code we will write later to check the API's status code is statically verified to be correct by the compiler. ### Rows When the Google Maps Distance Matrix API returns results, it places them within an array. XML responses consist of zero or more `row` elements. Rows are ordered according to the values in the origin parameter of the request. Each row corresponds to an origin, and each element within that row corresponds to a pairing of the origin with a destination value. Each row array contains one or more `element` entries, which in turn contain the information about a single origin-destination pairing. The container of rows `std::vector` type of the `DistanceMatrixResponse::row` member uses the `DistanceMatrixRow` class, which has a container of elements: class DistanceMatrixRow { std::vector element; }; ### Elements The information about each origin-destination pairing is returned in an `element` entry. The container of elements `std::vector` type of the `DistanceMatrixRow::element` member uses the `DistanceMatrixElement` class: class DistanceMatrixElement { DistanceMatrixEltStatus status; DistanceMatrixDuration duration; DistanceMatrixDuration *duration_USCOREin_USCOREtraffic; // optional duration_in_traffic DistanceMatrixDistance distance; DistanceMatrixFare *fare; // optional fare }; We define the `DistanceMatrixElement::status` as an enumeration, corresponding to the API's status codes for elements: typedef enum DistanceMatrixEltStatus { DistanceMatrixEltStatus__OK, DistanceMatrixEltStatus__NOT_USCOREFOUND, DistanceMatrixEltStatus__ZERO_USCORERESULTS, DistanceMatrixEltStatus__MAX_USCOREROUTE_USCORELENGTH_USCOREEXCEEDED, } DistanceMatrixEltStatus; Again, we could have just used a string for the type of `status`. But enumerations are preferred as strongly typed. However, if a return value is received that is not listed as an enumeration constant then XML parsing and validation will fail with a validation error. This is not a problem with the Google Maps API status codes that are well defined. Elements contain `duration` and `distance` elements, which are stored in the `DistanceMatrixElement::duration` and `DistanceMatrixElement::distance` members. The types for these members are declared as: class DistanceMatrixDuration { double value; std::string text; }; class DistanceMatrixDistance { double value; std::string text; }; A `fare` element may be optionally included with an element, which we define as: typedef std::string DistanceMatrixCurrency 3:3; class DistanceMatrixFare { DistanceMatrixCurrency currency; double value; std::string text; }; a currency designation is a three-character code as per ISO 4217. Therefore, the min and max length of `DistanceMatrixCurrency` is set to 3. ### The XML data binding interface file We put this all together in a file `GoogleDistanceMatrix.hpp` to declare our XML data binding interface: //////////////////////////////////////////////////////////////////////////////// // // Elements // //////////////////////////////////////////////////////////////////////////////// typedef std::string DistanceMatrixCurrency 3:3; class DistanceMatrixDuration { double value; std::string text; }; class DistanceMatrixDistance { double value; std::string text; }; class DistanceMatrixFare { DistanceMatrixCurrency currency; double value; std::string text; }; typedef enum DistanceMatrixEltStatus { DistanceMatrixEltStatus__OK, DistanceMatrixEltStatus__NOT_USCOREFOUND, DistanceMatrixEltStatus__ZERO_USCORERESULTS, DistanceMatrixEltStatus__MAX_USCOREROUTE_USCORELENGTH_USCOREEXCEEDED, } DistanceMatrixEltStatus; class DistanceMatrixElement { DistanceMatrixEltStatus status; DistanceMatrixDuration duration; DistanceMatrixDuration *duration_USCOREin_USCOREtraffic; // optional duration_in_traffic DistanceMatrixDistance distance; DistanceMatrixFare *fare; // optional fare }; //////////////////////////////////////////////////////////////////////////////// // // Rows // //////////////////////////////////////////////////////////////////////////////// class DistanceMatrixRow { std::vector element; }; //////////////////////////////////////////////////////////////////////////////// // // DistanceMatrixResponse // //////////////////////////////////////////////////////////////////////////////// typedef enum DistanceMatrixStatus { DistanceMatrixStatus__OK, DistanceMatrixStatus__INVALID_USCOREREQUEST, DistanceMatrixStatus__MAX_USCOREELEMENTS_USCOREEXCEEDED, DistanceMatrixStatus__OVER_USCOREQUERY_USCORELIMIT, DistanceMatrixStatus__REQUEST_USCOREDENIED, DistanceMatrixStatus__UNKNOWN_USCOREERROR, } DistanceMatrixStatus; class DistanceMatrixResponse { DistanceMatrixStatus status; std::string error_USCOREmessage 0; // optional error_message std::vector origin_USCOREaddress; std::vector destination_USCOREaddress; std::vector row; }; Google Maps Directions API interface header file ------------------------------------------------ The `gdx` example client applications uses the Google Maps APIs with XML responses. For the full listing, see `GoogleDirections.hpp`. Google Maps Distance Matrix API client source code -------------------------------------------------- The main program constructs and destructs a context `ctx` as follows: // new context with option to parse UTF-8 into strings struct soap *ctx = soap_new1(SOAP_C_UTFSTRING); ... // delete deserialized response and free the context soap_destroy(ctx); soap_end(ctx); soap_free(ctx); For the complete source code, please see `gdm.cpp`. ### Constructing the GET URL request Constructing the URL for the GET request is done by collecting the command-line arguments as follows: // construct URL with query string parameters string key = argv[1]; string mode = argv[2]; string units = argv[3]; string origins = argv[4]; string destinations = argv[5]; string URL = service; URL += "?key=" + urlencode(key); URL += "&mode=" + urlencode(mode); URL += "&units=" + urlencode(units); URL += "&origins=" + urlencode(origins); URL += "&destinations=" + urlencode(destinations); // Google API permits up to 8K URL lengths if (URL.size() > 8192) { printf("URL too long\n\n"); exit(EXIT_FAILURE); } where function `urlencode` is defined as: static string urlencode(const string& plain) { string encoded; for (size_t i = 0; i < plain.size(); ++i) { int c = plain.at(i); if (c == ' ') { encoded.push_back('+'); } else if (c == '!' || c == '$' || (c >= '(' && c <= '.') || (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || c == '_' || (c >= 'a' && c <= 'z')) { encoded.push_back(c); } else { encoded.push_back('%'); encoded.push_back((c >> 4) + (c > 159 ? '7' : '0')); c &= 0xF; encoded.push_back(c + (c > 9 ? '7' : '0')); } } return encoded; } This creates a `URL` string that we will use to invoke the Google Maps API. ### Connecting to the Google Maps API The source code establishes a HTTPS connection. The server is not verified unless you enable: if (soap_ssl_client_context(ctx, SOAP_SSL_DEFAULT, NULL, NULL, "cacerts.pem", NULL, NULL)) { soap_stream_fault(ctx, cerr); exit(EXIT_FAILURE); } When running the command-line application, a `cacerts.pem` file in the current directory is required. Or compile `plugin/cacerts.c` with hard-coded CA certificates (and change the source code as needed). We implement exponential backoff when HTTP 5xx errors occur, as recommended by Google in the [Best Practices Using Google Maps APIs](https://developers.google.com/maps/documentation/distance-matrix/web-service-best-practices#ParsingXML). // construct XML response object DistanceMatrixResponse response; // exponential backoff float delay = 0.100; // initial 100 ms delay float delay_factor = 2; // delay doubles for each retry float max_delay = 120; // 2 minutes max delay // GET XML response - exponential backoff on HTTP 5xx errors while (soap_GET_DistanceMatrixResponse(ctx, URL.c_str(), &response)) { if (delay <= max_delay && ctx->error >= 500 && ctx->error < 599) { usleep((useconds_t)(1000 * delay)); delay *= delay_factor; } else { soap_stream_fault(ctx, cerr); break; } } After the connection is made, the `response` structure contains the Google Maps API response parsed from XML. All the hard XML parsing and deserialization work is done by the `DistanceMatrixResponse` class and the auto-generated `soap_GET_DistanceMatrixResponse` function for this class. ### Printing the response To print the response we check for success and then iterate over the rows: // success? if (ctx-error == SOAP_OK) { if (response.status == DistanceMatrixStatus__OK) { cout << "----------------------------------------" << endl; // for each origin and destination pair, print duration and distance size_t n = minsize(response.origin_USCOREaddress.size(), response.row.size()); for (size_t i = 0; i < n; ++i) { cout << "from: " << response.origin_USCOREaddress[i] << endl; size_t m = minsize(response.destination_USCOREaddress.size(), response.row[i].element.size()); for (size_t j = 0; j < m; ++j) { cout << "to: " << response.destination_USCOREaddress[j] << endl; const DistanceMatrixElement& e = response.row[i].element[j]; if (e.status == DistanceMatrixEltStatus__OK) { cout << "duration: " << e.duration.value << " (" << e.duration.text << ")" << endl; if (e.duration_USCOREin_USCOREtraffic) cout << "duration in traffic: " << e.duration_USCOREin_USCOREtraffic->value << " (" << e.duration_USCOREin_USCOREtraffic->text << ")" << endl; cout << "distance: " << e.distance.value << " (" << e.distance.text << ")" << endl; if (e.fare) cout << "fare: " << e.fare->currency << " " << e.fare->value << " (" << e.fare->text << ")" << endl; } else { cout << "error: " << soap_DistanceMatrixEltStatus2s(ctx, e.status) << endl; } } cout << "----------------------------------------" << endl; } cout << endl; } else { cerr << "error: " << soap_DistanceMatrixStatus2s(ctx, response.status) << " " << response.error_USCOREmessage << endl; if (response.status == DistanceMatrixStatus__UNKNOWN_USCOREERROR) cerr << "UNKNOWN ERROR: try again" << endl; } } Google Maps Directions API client source code --------------------------------------------- The `gdx.cpp` source code has a similar structure as `gdm.cpp`. For the complete source code, please see `gdx.cpp`. ### Constructing the GET URL request // construct URL with query string parameters string key = argv[1]; string mode = argv[2]; string units = argv[3]; string origin = argv[4]; string destination = argv[5]; string URL = service; URL += "?key=" + urlencode(key); URL += "&mode=" + urlencode(mode); URL += "&units=" + urlencode(units); URL += "&origin=" + urlencode(origin); URL += "&destination=" + urlencode(destination); // Google API permits up to 8K URL lengths if (URL.size() > 8192) { printf("URL too long\n\n"); exit(EXIT_FAILURE); } ### Connecting to the Google Maps API // construct XML response object DirectionsResponse response; // exponential backoff float delay = 0.100; // initial 100 ms delay float delay_factor = 2; // delay doubles for each retry float max_delay = 120; // 2 minutes max delay // GET XML response - exponential backoff on HTTP 5xx errors while (soap_GET_DirectionsResponse(ctx, URL.c_str(), &response)) { if (delay <= max_delay && ctx->error >= 500 && ctx->error < 599) { usleep((useconds_t)(1000 * delay)); delay *= delay_factor; } else { soap_stream_fault(ctx, cerr); break; } } ### Printing the response // success? if (ctx->error == SOAP_OK) { if (response.status == DirectionsStatus__OK) { for (std::vector::const_iterator i = response.available_USCOREtravel_USCOREmodes.begin(); i != response.available_USCOREtravel_USCOREmodes.end(); ++i) cout << "available travel mode: " << *i << endl; for (std::vector::const_iterator i = response.route.begin(); i != response.route.end(); ++i) { cout << "----------------------------------------" << endl; cout << "summary: " << i->summary << endl; for (std::vector::const_iterator j = i->warning.begin(); j != i->warning.end(); ++j) cout << "warning: " << *j << endl; if (i->fare) cout << "fare: " << i->fare->currency << " " << i->fare->value << " (" << i->fare->text << ")" << endl; cout << "copyrights: " << i->copyrights << endl << endl; for (std::vector::const_iterator j = i->leg.begin(); j != i->leg.end(); ++j) { cout << "from " << j->start_USCOREaddress << " to " << j->end_USCOREaddress << " takes"; if (j->distance) cout << " " << j->distance->value << " meters (" << j->distance->text << ")"; if (j->duration) cout << " " << j->duration->value << " seconds (" << j->duration->text << ")"; if (j->duration_USCOREin_USCOREtraffic) cout << " " << j->duration_USCOREin_USCOREtraffic->value << " seconds in traffic (" << j->duration_USCOREin_USCOREtraffic->text << ")"; cout << endl << endl; for (std::vector::const_iterator k = j->step.begin(); k != j->step.end(); ++k) { if (!k->html_USCOREinstructions.empty()) cout << k->html_USCOREinstructions << endl; if (k->maneuver) cout << *k->maneuver << ", "; cout << k->travel_USCOREmode; if (k->distance) cout << " " << k->distance->value << " meters (" << k->distance->text << ")"; if (k->duration) cout << " " << k->duration->value << " seconds (" << k->duration->text << ")"; cout << endl; for (std::vector::const_iterator l = k->step.begin(); l != k->step.end(); ++l) { if (!l->html_USCOREinstructions.empty()) cout << " " << l->html_USCOREinstructions << endl; cout << " => "; if (l->maneuver) cout << *l->maneuver << ", "; cout << l->travel_USCOREmode; if (l->distance) cout << " " << l->distance->value << " meters (" << l->distance->text << ")"; if (l->duration) cout << " " << l->duration->value << " seconds (" << l->duration->text << ")"; cout << endl; } if (k->transit_USCOREdetails) { DirectionsTransitDetails& d = *k->transit_USCOREdetails; cout << " take transit at " << d.departure_USCOREtime.text << " from " << d.departure_USCOREstop.name << " to " << d.arrival_USCOREstop.name << " arriving at " << d.arrival_USCOREtime.text << ":" << endl; cout << " => " << d.line.vehicle.name << " " << d.line.name << " line " << d.line.short_USCOREname << " heading " << d.headsign << " and exit at stop " << d.num_USCOREstops << endl; for (std::vector::const_iterator l = d.line.agency.begin(); l != d.line.agency.end(); ++l) cout << " (operated by " << l->name << " " << l->url << ") " << endl; } cout << endl; } } } cout << endl; } else { cerr << "error: " << soap_DirectionsStatus2s(ctx, response.status) << " " << response.error_USCOREmessage << endl; if (response.status == DirectionsStatus__UNKNOWN_USCOREERROR) cerr << "UNKNOWN ERROR: try again" << endl; } } Using a C++ namespace for the APIs ---------------------------------- The `gdm.hpp` interface file combines the Google Maps API interface header files into one interface file and places all definitions within the `gdm` C++ namespace: namespace gdm { // add or remove APIs as needed #import "GoogleDistanceMatrix.hpp" #import "GoogleDirections.hpp" } Note the use of `#import` instead of `#include`. There are important differences between these two constructs. The soapcpp2 tool imports header files with `#import`, while `#include` is copied to the soapcpp2-generated header file so that C/C++ headers can be included in the generated source code. Build steps ----------- Because we use a C++ namespace in the `gdm.hpp` interface header file, we also need a `env.h` file with global non-C++-namespaced definitions. This is where we normally put the SOAP Header and SOAP Fault details. However, we do not use SOAP so this file is simply empty. To build the Google Maps Directions `gdx` command-line application: soapcpp2 -0 gdm.hpp soapcpp2 -0 -penv env.h c++ -DWITH_OPENSSL -o gdx gdx.cpp stdsoap2.cpp gdmC.cpp envC.cpp -lssl -lcrypto To build the Google Maps Distance Matrix `gdm` command-line application: soapcpp2 -0 gdm.hpp soapcpp2 -0 -penv env.h c++ -DWITH_OPENSSL -o gdm gdm.cpp stdsoap2.cpp gdmC.cpp envC.cpp -lssl -lcrypto Usage ----- To use the Google Maps Directions `gdx` command-line application: gdx 'origin address' 'destination address' where `YOUR_API_KEY` is the API key you received earlier, mode is either `driving`, `walking`, `bicycling`, or `transit`. The units parameter should be `metric` or `imperial`. An origina address and a destination address should be provided. The addresses are URL-encoded by `gdx` before being passed to the Google Maps Directions API. To use the Google Maps Distance Matrix `gdm` command-line application: gdm 'origin addresses' 'destination addresses' where `YOUR_API_KEY` is the API key you received earlier, mode is either `driving`, `walking`, `bicycling`, or `transit`. The units parameter should be `metric` or `imperial`. Multiple addresses, when provided, should be separated by `|`. The addresses are URL-encoded by `gdm` before being passed to the Google Maps Distance Matrix API. For C developers ---------------- A `GoogleDistanceMatrix.h` interface file for C is included to build clients in C. However, no C application example is provided in source code. gsoap-2.8.91/gsoap/samples/googleapi/gdx.cpp0000644000175000017500000002206113525245163020304 0ustar ellertellert/* gdx.cpp Google Maps Directions API example C++ client For more details, visit: https://developers.google.com/maps/documentation/directions/intro To get an API key: https://developers.google.com/maps/documentation/directions/get-api-key Build steps: soapcpp2 -0 gdm.hpp soapcpp2 -0 -penv env.h c++ -DWITH_OPENSSL -o gdx gdx.cpp stdsoap2.cpp gdmC.cpp envC.cpp -lssl -lcrypto Usage: gdx 'origin address' 'destination address' Example: gdx bicycling imperial Chicago,IL' 'Los Angeles,CA' -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2017, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include // usleep #include "gdmH.h" using namespace std; using namespace gdm; // define an empty XML namespace table (included to avoid link errors) struct Namespace namespaces[] = { {NULL, NULL, NULL, NULL} }; // the Google Distance Matrix service endpoint static const char *service = "https://maps.googleapis.com/maps/api/directions/xml"; // encode string in URL ("percentage") format static string urlencode(const string& plain); // inline min of size_t inline size_t minsize(size_t a, size_t b) { return a < b ? a : b; } int main(int argc, char **argv) { if (argc <= 5) { printf("Usage: gdx key mode units 'origin address' 'destination address'\n\n"); exit(EXIT_FAILURE); } // new context with option to parse UTF-8 into strings struct soap *ctx = soap_new1(SOAP_C_UTFSTRING); // to verify the server's authenticity, enable the code below and place cacerts.pem in the current dir: #if 0 // use SOAP_SSL_SKIP_HOST_CHECK in place of SOAP_SSL_DEFAULT to omit the host check if host mismatches occur (use at own risk!) if (soap_ssl_client_context(ctx, SOAP_SSL_DEFAULT, NULL, NULL, "cacerts.pem", NULL, NULL)) { soap_stream_fault(ctx, cerr); exit(EXIT_FAILURE); } #endif // construct URL with query string parameters string key = argv[1]; string mode = argv[2]; string units = argv[3]; string origin = argv[4]; string destination = argv[5]; string URL = service; URL += "?key=" + urlencode(key); URL += "&mode=" + urlencode(mode); URL += "&units=" + urlencode(units); URL += "&origin=" + urlencode(origin); URL += "&destination=" + urlencode(destination); // Google API permits up to 8K URL lengths if (URL.size() > 8192) { printf("URL too long\n\n"); exit(EXIT_FAILURE); } // construct XML response object DirectionsResponse response; // exponential backoff float delay = 0.100; // initial 100 ms delay float delay_factor = 2; // delay doubles for each retry float max_delay = 120; // 2 minutes max delay // GET XML response - exponential backoff on HTTP 5xx errors while (soap_GET_DirectionsResponse(ctx, URL.c_str(), &response)) { if (delay <= max_delay && ctx->error >= 500 && ctx->error < 599) { usleep((useconds_t)(1000 * delay)); delay *= delay_factor; } else { soap_stream_fault(ctx, cerr); break; } } // success? if (ctx->error == SOAP_OK) { if (response.status == DirectionsStatus__OK) { for (std::vector::const_iterator i = response.available_USCOREtravel_USCOREmodes.begin(); i != response.available_USCOREtravel_USCOREmodes.end(); ++i) cout << "available travel mode: " << *i << endl; for (std::vector::const_iterator i = response.route.begin(); i != response.route.end(); ++i) { cout << "----------------------------------------" << endl; cout << "summary: " << i->summary << endl; for (std::vector::const_iterator j = i->warning.begin(); j != i->warning.end(); ++j) cout << "warning: " << *j << endl; if (i->fare) cout << "fare: " << i->fare->currency << " " << i->fare->value << " (" << i->fare->text << ")" << endl; cout << "copyrights: " << i->copyrights << endl << endl; for (std::vector::const_iterator j = i->leg.begin(); j != i->leg.end(); ++j) { cout << "from " << j->start_USCOREaddress << " to " << j->end_USCOREaddress << " takes"; if (j->distance) cout << " " << j->distance->value << " meters (" << j->distance->text << ")"; if (j->duration) cout << " " << j->duration->value << " seconds (" << j->duration->text << ")"; if (j->duration_USCOREin_USCOREtraffic) cout << " " << j->duration_USCOREin_USCOREtraffic->value << " seconds in traffic (" << j->duration_USCOREin_USCOREtraffic->text << ")"; cout << endl << endl; for (std::vector::const_iterator k = j->step.begin(); k != j->step.end(); ++k) { if (!k->html_USCOREinstructions.empty()) cout << k->html_USCOREinstructions << endl; if (k->maneuver) cout << *k->maneuver << ", "; cout << k->travel_USCOREmode; if (k->distance) cout << " " << k->distance->value << " meters (" << k->distance->text << ")"; if (k->duration) cout << " " << k->duration->value << " seconds (" << k->duration->text << ")"; cout << endl; for (std::vector::const_iterator l = k->step.begin(); l != k->step.end(); ++l) { if (!l->html_USCOREinstructions.empty()) cout << " " << l->html_USCOREinstructions << endl; cout << " => "; if (l->maneuver) cout << *l->maneuver << ", "; cout << l->travel_USCOREmode; if (l->distance) cout << " " << l->distance->value << " meters (" << l->distance->text << ")"; if (l->duration) cout << " " << l->duration->value << " seconds (" << l->duration->text << ")"; cout << endl; } if (k->transit_USCOREdetails) { DirectionsTransitDetails& d = *k->transit_USCOREdetails; cout << " take transit at " << d.departure_USCOREtime.text << " from " << d.departure_USCOREstop.name << " to " << d.arrival_USCOREstop.name << " arriving at " << d.arrival_USCOREtime.text << ":" << endl; cout << " => " << d.line.vehicle.name << " " << d.line.name << " line " << d.line.short_USCOREname << " heading " << d.headsign << " and exit at stop " << d.num_USCOREstops << endl; for (std::vector::const_iterator l = d.line.agency.begin(); l != d.line.agency.end(); ++l) cout << " (operated by " << l->name << " " << l->url << ") " << endl; } cout << endl; } } } cout << endl; } else { cerr << "error: " << soap_DirectionsStatus2s(ctx, response.status) << " " << response.error_USCOREmessage << endl; if (response.status == DirectionsStatus__UNKNOWN_USCOREERROR) cerr << "UNKNOWN ERROR: try again" << endl; } } // delete deserialized response and free the context soap_destroy(ctx); soap_end(ctx); soap_free(ctx); exit(EXIT_SUCCESS); } // encode string in URL "percentage" format static string urlencode(const string& plain) { string encoded; for (size_t i = 0; i < plain.size(); ++i) { int c = plain.at(i); if (c == ' ') { encoded.push_back('+'); } else if (c == '!' || c == '$' || (c >= '(' && c <= '.') || (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || c == '_' || (c >= 'a' && c <= 'z')) { encoded.push_back(c); } else { encoded.push_back('%'); encoded.push_back((c >> 4) + (c > 159 ? '7' : '0')); c &= 0xF; encoded.push_back(c + (c > 9 ? '7' : '0')); } } return encoded; } gsoap-2.8.91/gsoap/samples/googleapi/gdm.hpp0000644000175000017500000000314413525245163020277 0ustar ellertellert/* Google Maps API for C++11 Combines the Google Maps Directions API and the Distance Matrix API in the C++ 'gdm' namespace. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2017, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ namespace gdm { // add or remove APIs as needed #import "GoogleDistanceMatrix.hpp" #import "GoogleDirections.hpp" } gsoap-2.8.91/gsoap/samples/googleapi/.deps/0000755000175000017500000000000013525245174020030 5ustar ellertellertgsoap-2.8.91/gsoap/samples/googleapi/.deps/envC.Po0000644000175000017500000000001013525245163021210 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/samples/googleapi/Makefile.in0000644000175000017500000005060213525245163021065 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = gdm$(EXEEXT) gdx$(EXEEXT) subdir = gsoap/samples/googleapi ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am_gdm_OBJECTS = gdm.$(OBJEXT) $(am__objects_1) gdmC.$(OBJEXT) \ $(am__objects_2) gdm_OBJECTS = $(am_gdm_OBJECTS) am__DEPENDENCIES_1 = gdm_DEPENDENCIES = $(SOAP_CPP_LIB_SSL) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_gdx_OBJECTS = gdx.$(OBJEXT) $(am__objects_1) gdmC.$(OBJEXT) \ $(am__objects_2) gdx_OBJECTS = $(am_gdx_OBJECTS) gdx_DEPENDENCIES = $(SOAP_CPP_LIB_SSL) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/gdm.Po ./$(DEPDIR)/gdmC.Po \ ./$(DEPDIR)/gdx.Po ./$(DEPDIR)/soapC.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(gdm_SOURCES) $(gdx_SOURCES) DIST_SOURCES = $(gdm_SOURCES) $(gdx_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.cpp_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = gdm.hpp AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = gdmStub.h gdmH.h gdmC.cpp soapStub.h soapH.h soapC.cpp *.nsmap *~ SOAP_NS = gdm.nsmap gdm_CFLAGS = -DWITH_OPENSSL -DWITH_GZIP gdm_SOURCES = gdm.cpp $(SOAPHEADER) gdmC.cpp $(SOAP_CPP_CORE) gdm_LDADD = $(SOAP_CPP_LIB_SSL) $(SAMPLE_EXTRA_LIBS) $(SAMPLE_SSL_LIBS) gdx_CFLAGS = -DWITH_OPENSSL -DWITH_GZIP gdx_SOURCES = gdx.cpp $(SOAPHEADER) gdmC.cpp $(SOAP_CPP_CORE) gdx_LDADD = $(SOAP_CPP_LIB_SSL) $(SAMPLE_EXTRA_LIBS) $(SAMPLE_SSL_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/googleapi/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/googleapi/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) gdm$(EXEEXT): $(gdm_OBJECTS) $(gdm_DEPENDENCIES) $(EXTRA_gdm_DEPENDENCIES) @rm -f gdm$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(gdm_OBJECTS) $(gdm_LDADD) $(LIBS) gdx$(EXEEXT): $(gdx_OBJECTS) $(gdx_DEPENDENCIES) $(EXTRA_gdx_DEPENDENCIES) @rm -f gdx$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(gdx_OBJECTS) $(gdx_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdmC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdx.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/gdm.Po -rm -f ./$(DEPDIR)/gdmC.Po -rm -f ./$(DEPDIR)/gdx.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/gdm.Po -rm -f ./$(DEPDIR)/gdmC.Po -rm -f ./$(DEPDIR)/gdx.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) $(SOAP_CPP_CORE): env.h $(SOAP) -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/googleapi/GoogleDistanceMatrix.h0000644000175000017500000000773713525245163023260 0ustar ellertellert/* GoogleDistanceMatrix.h Google MAP API Distance Matrix example in C This is a translation of GoogleDistanceMatrix.hpp to C: 1. replace 'class' with 'struct' 2. replace 'std::string' with 'char*' 3. replace 'std::vector name' with arrays: $int num_name; type *name; -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2017, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //////////////////////////////////////////////////////////////////////////////// // // DistanceMatrixResponse // //////////////////////////////////////////////////////////////////////////////// enum DistanceMatrixStatus { DistanceMatrixStatus__OK, DistanceMatrixStatus__INVALID_USCOREREQUEST, DistanceMatrixStatus__MAX_USCOREELEMENTS_USCOREEXCEEDED, DistanceMatrixStatus__OVER_USCOREQUERY_USCORELIMIT, DistanceMatrixStatus__REQUEST_USCOREDENIED, DistanceMatrixStatus__UNKNOWN_USCOREERROR, }; struct DistanceMatrixResponse { enum DistanceMatrixStatus status; char* error_USCOREmessage; $int num_origin_address; char* *origin_USCOREaddress; $int num_destination_address; char* *destination_USCOREaddress; $int num_row; struct DistanceMatrixRow *row; }; //////////////////////////////////////////////////////////////////////////////// // // Rows // //////////////////////////////////////////////////////////////////////////////// struct DistanceMatrixRow { $int num_element; struct DistanceMatrixElement *element; }; //////////////////////////////////////////////////////////////////////////////// // // Elements // //////////////////////////////////////////////////////////////////////////////// struct DistanceMatrixDuration { double value; char* text; }; struct DistanceMatrixDistance { double value; char* text; }; typedef char* DistanceMatrixCurrency 3:3; struct DistanceMatrixFare { DistanceMatrixCurrency currency; double value; char* text; }; enum DistanceMatrixEltStatus { DistanceMatrixEltStatus__OK, DistanceMatrixEltStatus__NOT_USCOREFOUND, DistanceMatrixEltStatus__ZERO_USCORERESULTS, DistanceMatrixEltStatus__MAX_USCOREROUTE_USCORELENGTH_USCOREEXCEEDED, }; struct DistanceMatrixElement { enum DistanceMatrixEltStatus status; struct DistanceMatrixDuration duration; struct DistanceMatrixDuration *duration_USCOREin_USCOREtraffic; // optional duration_in_traffic struct DistanceMatrixDistance distance; struct DistanceMatrixFare *fare; // optional fare }; gsoap-2.8.91/gsoap/samples/googleapi/env.h0000644000175000017500000000000013525245163017744 0ustar ellertellertgsoap-2.8.91/gsoap/samples/googleapi/GoogleDistanceMatrix.hpp0000644000175000017500000002036613525245163023611 0ustar ellertellert/* GoogleDistanceMatrix.hpp Google Maps Distance Matrix API example C++ client This file is imported by gdm.hpp and its contents placed in the 'gdm' C++ namespace. For more details about this API, visit: https://developers.google.com/maps/documentation/distance-matrix/intro To get an API key: https://developers.google.com/maps/documentation/distance-matrix/get-api-key Build steps: soapcpp2 -0 GoogleDistanceMatrix.hpp soapcpp2 -0 -penv env.h c++ -DWITH_OPENSSL -o gdm gdm.cpp stdsoap2.cpp gdmC.cpp envC.cpp -lssl -lcrypto Usage: gdm 'origin addresses' 'destination addresses' where addresses should be separated by | Example: gdm bicycling imperial 'Vancouver BC|Seattle' 'San Francisco|Vancouver BC' -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2017, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //////////////////////////////////////////////////////////////////////////////// // // Elements // //////////////////////////////////////////////////////////////////////////////// /// an ISO 4217 currency code indicating the currency that the amount is expressed in. typedef std::string DistanceMatrixCurrency 3:3; /// duration in seconds. class DistanceMatrixDuration { /// indicates the duration in seconds. double value; /// contains a human-readable representation of the duration. std::string text; }; /// distance in meters. class DistanceMatrixDistance { /// indicates the distance in meters double value; /// contains a human-readable representation of the distance, displayed in units as used at the origin (or as overridden within the units parameter in the request). (For example, miles and feet will be used for any origin within the United States.) Note that regardless of what unit system is displayed as text, the distance.value field always contains a value expressed in meters. std::string text; }; /// the total fare (that is, the total ticket costs) on this route. This property is only returned for transit requests and only for routes where fare information is available for all transit legs. class DistanceMatrixFare { /// an ISO 4217 currency code indicating the currency that the amount is expressed in. DistanceMatrixCurrency currency; /// the total fare amount, in the currency specified above. double value; /// the total fare amount, formatted in the requested language. std::string text; }; /// contains metadata on the element. typedef enum DistanceMatrixEltStatus { /// indicates the response contains a valid result. DistanceMatrixEltStatus__OK, /// indicates that the origin and/or destination of this pairing could not be geocoded. DistanceMatrixEltStatus__NOT_USCOREFOUND, /// indicates no route could be found between the origin and destination. DistanceMatrixEltStatus__ZERO_USCORERESULTS, /// indicates the requested route is too long and cannot be processed. DistanceMatrixEltStatus__MAX_USCOREROUTE_USCORELENGTH_USCOREEXCEEDED, } DistanceMatrixEltStatus; /// contains information about a single origin-destination pairing. class DistanceMatrixElement { /// contains metadata on the element. DistanceMatrixEltStatus status; /// contains the length of time it takes to travel this route, expressed in seconds (the value field) and as text. The textual representation is localized according to the query's language parameter. DistanceMatrixDuration duration; /// contains the length of time it takes to travel this route, based on current and historical traffic conditions. See the traffic_model request parameter for the options you can use to request that the returned value is optimistic, pessimistic, or a best-guess estimate. The duration is expressed in seconds (the value field) and as text. The textual representation is localized according to the query's language parameter. DistanceMatrixDuration *duration_USCOREin_USCOREtraffic; // optional duration_in_traffic /// contains the total distance of this route, expressed in meters (value) and as text. DistanceMatrixDistance distance; /// if present, contains the total fare (that is, the total ticket costs) on this route. This property is only returned for transit requests and only for transit providers where fare information is available. DistanceMatrixFare *fare; // optional fare }; //////////////////////////////////////////////////////////////////////////////// // // Rows // //////////////////////////////////////////////////////////////////////////////// /// contains one or more element entries, which in turn contain the information about a single origin-destination pairing. class DistanceMatrixRow { /// contains an array of information about a single origin-destination pairing. std::vector element; }; //////////////////////////////////////////////////////////////////////////////// // // DistanceMatrixResponse // //////////////////////////////////////////////////////////////////////////////// /// contains metadata on the request. typedef enum DistanceMatrixStatus { /// indicates the response contains a valid result. DistanceMatrixStatus__OK, /// indicates that the provided request was invalid. DistanceMatrixStatus__INVALID_USCOREREQUEST, /// indicates that the product of origins and destinations exceeds the per-query limit. DistanceMatrixStatus__MAX_USCOREELEMENTS_USCOREEXCEEDED, /// indicates the service has received too many requests from your application within the allowed time period. DistanceMatrixStatus__OVER_USCOREQUERY_USCORELIMIT, /// indicates that the service denied use of the Distance Matrix service by your application. DistanceMatrixStatus__REQUEST_USCOREDENIED, /// indicates a Distance Matrix request could not be processed due to a server error. The request may succeed if you try again. DistanceMatrixStatus__UNKNOWN_USCOREERROR, } DistanceMatrixStatus; /// root element class DistanceMatrixResponse { /// contains metadata on the request. DistanceMatrixStatus status; /// contains more detailed information about the reasons behind the given status code. std::string error_USCOREmessage 0; // optional error_message /// contains an array of addresses as returned by the API from your original request. These are formatted by the geocoder and localized according to the language parameter passed with the request. std::vector origin_USCOREaddress; /// contains an array of addresses as returned by the API from your original request. As with origin_addresses, these are localized if appropriate. std::vector destination_USCOREaddress; /// contains an array of elements, which in turn each contain a status, duration, and distance element. Rows are ordered according to the values in the origin parameter of the request. Each row corresponds to an origin, and each element within that row corresponds to a pairing of the origin with a destination value. std::vector row; }; gsoap-2.8.91/gsoap/samples/googleapi/gdm.cpp0000644000175000017500000001610613525245163020274 0ustar ellertellert/* gdm.cpp Google Maps Distance Matrix API example C++ client For more details, visit: https://developers.google.com/maps/documentation/distance-matrix/intro To get an API key: https://developers.google.com/maps/documentation/distance-matrix/get-api-key Build steps: soapcpp2 -0 gdm.hpp soapcpp2 -0 -penv env.h c++ -DWITH_OPENSSL -o gdm gdm.cpp stdsoap2.cpp gdmC.cpp envC.cpp -lssl -lcrypto Usage: gdm 'origin addresses' 'destination addresses' where addresses should be separated by | Example: gdm bicycling imperial 'Vancouver BC|Seattle' 'San Francisco|Vancouver BC' -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2017, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include // usleep #include "gdmH.h" using namespace std; using namespace gdm; // define an empty XML namespace table (included to avoid link errors) struct Namespace namespaces[] = { {NULL, NULL, NULL, NULL} }; // the Google Distance Matrix service endpoint static const char *service = "https://maps.googleapis.com/maps/api/distancematrix/xml"; // encode string in URL ("percentage") format static string urlencode(const string& plain); // inline min of size_t inline size_t minsize(size_t a, size_t b) { return a < b ? a : b; } int main(int argc, char **argv) { if (argc <= 5) { printf("Usage: gdm key mode units 'origin addresses' 'destination addresses'\n\n"); exit(EXIT_FAILURE); } // new context with option to parse UTF-8 into strings struct soap *ctx = soap_new1(SOAP_C_UTFSTRING); // to verify the server's authenticity, enable the code below and place cacerts.pem in the current dir: #if 0 // use SOAP_SSL_SKIP_HOST_CHECK in place of SOAP_SSL_DEFAULT to omit the host check if host mismatches occur (use at own risk!) if (soap_ssl_client_context(ctx, SOAP_SSL_DEFAULT, NULL, NULL, "cacerts.pem", NULL, NULL)) { soap_stream_fault(ctx, cerr); exit(EXIT_FAILURE); } #endif // construct URL with query string parameters string key = argv[1]; string mode = argv[2]; string units = argv[3]; string origins = argv[4]; string destinations = argv[5]; string URL = service; URL += "?key=" + urlencode(key); URL += "&mode=" + urlencode(mode); URL += "&units=" + urlencode(units); URL += "&origins=" + urlencode(origins); URL += "&destinations=" + urlencode(destinations); // Google API permits up to 8K URL lengths if (URL.size() > 8192) { printf("URL too long\n\n"); exit(EXIT_FAILURE); } // construct XML response object DistanceMatrixResponse response; // exponential backoff float delay = 0.100; // initial 100 ms delay float delay_factor = 2; // delay doubles for each retry float max_delay = 120; // 2 minutes max delay // GET XML response - exponential backoff on HTTP 5xx errors while (soap_GET_DistanceMatrixResponse(ctx, URL.c_str(), &response)) { if (delay <= max_delay && ctx->error >= 500 && ctx->error < 599) { usleep((useconds_t)(1000 * delay)); delay *= delay_factor; } else { soap_stream_fault(ctx, cerr); break; } } // success? if (ctx->error == SOAP_OK) { if (response.status == DistanceMatrixStatus__OK) { cout << "----------------------------------------" << endl; // for each origin and destination pair, print duration and distance size_t n = minsize(response.origin_USCOREaddress.size(), response.row.size()); for (size_t i = 0; i < n; ++i) { cout << "from: " << response.origin_USCOREaddress[i] << endl; size_t m = minsize(response.destination_USCOREaddress.size(), response.row[i].element.size()); for (size_t j = 0; j < m; ++j) { cout << "to: " << response.destination_USCOREaddress[j] << endl; const DistanceMatrixElement& e = response.row[i].element[j]; if (e.status == DistanceMatrixEltStatus__OK) { cout << "duration: " << e.duration.value << " (" << e.duration.text << ")" << endl; if (e.duration_USCOREin_USCOREtraffic) cout << "duration in traffic: " << e.duration_USCOREin_USCOREtraffic->value << " (" << e.duration_USCOREin_USCOREtraffic->text << ")" << endl; cout << "distance: " << e.distance.value << " (" << e.distance.text << ")" << endl; if (e.fare) cout << "fare: " << e.fare->currency << " " << e.fare->value << " (" << e.fare->text << ")" << endl; } else { cout << "error: " << soap_DistanceMatrixEltStatus2s(ctx, e.status) << endl; } } cout << "----------------------------------------" << endl; } cout << endl; } else { cerr << "error: " << soap_DistanceMatrixStatus2s(ctx, response.status) << " " << response.error_USCOREmessage << endl; if (response.status == DistanceMatrixStatus__UNKNOWN_USCOREERROR) cerr << "UNKNOWN ERROR: try again" << endl; } } // delete deserialized response and free the context soap_destroy(ctx); soap_end(ctx); soap_free(ctx); exit(EXIT_SUCCESS); } // encode string in URL "percentage" format static string urlencode(const string& plain) { string encoded; for (size_t i = 0; i < plain.size(); ++i) { int c = plain.at(i); if (c == ' ') { encoded.push_back('+'); } else if (c == '!' || c == '$' || (c >= '(' && c <= '.') || (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || c == '_' || (c >= 'a' && c <= 'z')) { encoded.push_back(c); } else { encoded.push_back('%'); encoded.push_back((c >> 4) + (c > 159 ? '7' : '0')); c &= 0xF; encoded.push_back(c + (c > 9 ? '7' : '0')); } } return encoded; } gsoap-2.8.91/gsoap/samples/googleapi/Makefile.am0000644000175000017500000000160313525245163021051 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = gdm gdx SOAPHEADER = gdm.hpp include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = gdm.nsmap CLEANFILES = gdmStub.h gdmH.h gdmC.cpp soapStub.h soapH.h soapC.cpp *.nsmap *~ $(SOAP_CPP_CORE): env.h $(SOAP) -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< gdm_CFLAGS = -DWITH_OPENSSL -DWITH_GZIP gdm_SOURCES = gdm.cpp $(SOAPHEADER) gdmC.cpp $(SOAP_CPP_CORE) gdm_LDADD = $(SOAP_CPP_LIB_SSL) $(SAMPLE_EXTRA_LIBS) $(SAMPLE_SSL_LIBS) gdx_CFLAGS = -DWITH_OPENSSL -DWITH_GZIP gdx_SOURCES = gdx.cpp $(SOAPHEADER) gdmC.cpp $(SOAP_CPP_CORE) gdx_LDADD = $(SOAP_CPP_LIB_SSL) $(SAMPLE_EXTRA_LIBS) $(SAMPLE_SSL_LIBS) gsoap-2.8.91/gsoap/samples/testmsgr/0000755000175000017500000000000013525245203016712 5ustar ellertellertgsoap-2.8.91/gsoap/samples/testmsgr/README.md0000644000175000017500000010361213525245163020201 0ustar ellertellert Test Messenger {#mainpage} ============== [TOC] Introduction {#intro} ============ It is important to test Web services and client applications as part of a quality assurance process. Furthermore, the functional and non-functional requirements of an application should be verified and tested before the application is deployed in the field. Testing Web services with randomized message exchange patterns can help to pinpoint problems early on, before applications are deployed. The benefit of the Test Messenger is the ability to use a set of message templates for unit and regression testing, with specific randomization of XML attribute and element values in the templates as specified. The Test Messenger is an application to test Web services by sending (randomized) XML test messages to services and client applications. The Test Messenger application is simply executed from the command line or from a shell script, such as a script intended to test services and clients. No coding is required to use the Test Messenger. The testmsgr Test Messenger application is located in the gSOAP distribution package under `gsoap/samples/testmsgr` and is built with: cd gsoap/samples/testmsgr make To generate randomized XML messages with the Test Messenger, a SOAP/XML message template is required. The Test Messenger populates the template with random values to send the randomly populated SOAP/XML request message to a service for \ref servers. Or the Test Messenger can be started as a stand-alone server to return the randomly populated response message template to a client for \ref clients. You can create a SOAP/XML message template manually or auto-generate it with soapcpp2 option `-g`. For example, to auto-generate XML sample message templates from an interface header file `file.h` (e.g. generated with wsdl2h from WSDLs), use soapcpp2 with option `-g`: soapcpp2 -g file.h The soapcpp2 tool generates sample messages for the service operations defined in `file.h`. Option `-g` changes the sample message to message templates that contain placeholders of the form `%[...]%`. A leading `???` qualifier indicates optional elements and attributes. Repeated elements and/or CDATA is indicated and enclosed in `<__REPEAT>`...``. Element selections are indicated and enclosed as child elements in `<__SELECT>`...``. Element permutations are enclosed as child elements in `<__PERMUTE>`...``. A placeholder value `%[...]%` specifies an XSD-related type, enumeration, or numeric range. These placeholders are populated by the Test Messenger using random values that conform to the placeholder's specified value type. While the sample messages generated by soapcpp2 (without option `-g`) can be used to test clients and services as explained in the gSOAP user guide, the problem is that the content of the sample messages is always fixed. This provides only very limited testing capabilities. By contrast, the Test Messenger application generates randomized messages based on SOAP/XML message templates for enhanced testing of client and service applications. The Test Messenger is intended to test common messaging scenarios that are defined by SOAP/XML message templates. The Test Messenger does not add (random) XML attributes and elements that are not already in the message template. It can randomly remove attributes and elements with option `-p` to test the robustness of an application to consuming partial and possibly invalid XML messages (invalid according to the schema of the XML message). The Test Messenger has several options to further randomize the messages by randomly removing attributes and elements at a specific rate of chance, or to add random spacing to XML attribute and element values, and to continuously test a service until it fails. To demonstrate the Test Messenger, assume we have the following services declared in the interface `file.h`: ```cpp //gsoap ns service name: example //gsoap ns service namespace: urn:example #import "custom/struct_tm.h" // use struct tm for xsd:dateTime typedef std::string xsd__ID; // declare xsd:ID type (whitespace collapsed) typedef std::string xsd__Name; // declare xsd:Name type (whitespace collapsed) typedef xsd__Name ns__name 1:80; // restrict xsd:Name to a name with 1 to 80 chars typedef float ns__miles 0: ; // restrict xsd:float to non-negative enum ns__gender { male, female }; struct ns__person { @xsd__ID id; ns__name firstname; ns__name lastname; xsd__dateTime dob; enum ns__gender gender; ns__miles *miles; }; int ns__upload(struct ns__person *person, xsd__ID& id); // upload to DB int ns__download(xsd__ID id, struct ns__person& person); // download from DB ``` We run soapcpp2 on this interface `file.h` with option `-g`: soapcpp2 -g file.h This produces the following SOAP/XML template files among other source code files: - `example.upload.req.xml` XML template upload request message - `example.download.req.xml` XML template download request message - `example.upload.res.xml` XML template upload response message - `example.download.res.xml` XML template download response message The `example.upload.req.xml` file looks like this:
```xml ??? %[[NAME[1:80]]]% %[[NAME[1:80]]]% %[[DATETIME]]% %[[male][female]]% ???%[[0.000000E+00:3.402823E+38]]% ```
Note that XML values in this template are represented by value placeholders of the form `%[...]%`. Also note that the `person` element, the `id` attribute and `miles` are optional. A leading `???` qualifier indicates optional elements and attributes, when the `???` qualifier appears after the opening tag of an element (i.e. in front of the element value or child elements) and in attribute values, respectively. For the full list of placeholders that can be used, see \ref placeholder. This message template is read, populated and then sent to the standard output by testmsgr as follows: ./testmsgr -r1 -i example.upload.req.xml
``` Random seed = 1 ghefklij_spqcdabWXUVnoYZOPMNSTQRGHEFKLIJlmjkCDAB7856hi9gv0 QRSTMNOPYZnoUVWXabcdpq_sijklefgh1234 1969-12-31T23:59:59Z female 8255613886394.9941 ```
This produced a randomized SOAP/XML message to standard output from the `example.upload.req.xml` template message. Option `-r1` sets the random seed to `1`. Any seed value between 1 and 2147483647 can be specified with `-r`. Option `-i` displays the randomized XML with indentation. To randomly retain or discard optional elements and attributes, use option `-q` with a specified percentage to retain optional elements and attributes in the generated XML message: ./testmsgr -r1 -q50 -i example.upload.req.xml This retains the optional element `person`, the `id` attribute, and the `miles` element with a 50% chance each. To send the randomized SOAP/XML message to a service endpoint, pass the endpoint URL as the last argument to the testmsgr command: ./testmsgr -r1 -i example.upload.req.xml http://www.example.com/service For example, we can let soapcpp2 generate a simple echo test service to which we can send messages. Since we auto-generate a simple echo test service we have no server-side logic to return meaningful values for this example. First we invoke soapcpp2 with option `-T` to generate the server-side code for a simple test service: soapcpp2 -g -SL -T file.h This generates the SOAP/XML message templates and the following source code files: - `example.wsdl` a WSDL to publish the service - `example.nsmap` an XML namespace mapping table to include in your source code - `soapStub.h` annotated copy of the source interface file - `soapH.h` serialization functions - `soapC.cpp` serialization functions - `soapServer.cpp` service request dispatcher - `soapTester.cpp` auto-test echo server Next, we compile these files together with the gSOAP library and the custom serializer for `struct tm` to build a simple echo server: c++ -I. -o echoserver soapTester.cpp soapServer.cpp soapC.cpp stdsoap2.cpp custom/struct_tm.c Now run the server. For example with arguments 8080 as the port to bind to and 8192 to set the `SOAP_XML_INDENT` engine context flag: ./echoserver 8192 8080 Finally, let's fire a randomized message to the simple echo service, using the auto-generated `example.upload.req.xml` message template: ./testmsgr -r1 example.upload.req.xml http://localhost:8080
``` Random seed = 1 Server response: ---- begin ---- ---- end ---- ```
The testmsgr displays the response received from the server, which for the simple echo service upload request is the upload response with an id element. To send a continuous stream of randomized message to the server, use option `-c`: ./testmsgr -c -r1 example.upload.req.xml http://localhost:8080 This continous until the service fails. A test is reproduced by using its random seed. So if the service fails you can replicate the message with the random seed and option `-r` with this seed value. The Test Messenger application can also send pruned XML messages with option `-p`. Pruning means that attributes and elements are randomly discarded, which allows for testing the robustness of the service against incomplete and malformed SOAP/XML content: ./testmsgr -c -p80 -r1 example.upload.req.xml http://localhost:8080 Option `-p80` means that 80% is retained and 20% of attributes and elements are randomly discarded from the SOAP/XML template `example.upload.req.xml`. When testing the auto-test echo service, the echo service displays failed requests and is silent for successful requests. For the full list of testmsgr options, see \ref options. 🔝 [Back to table of contents](#) Building and installing testmsgr {#build} ================================ To build testmsgr, [install gSOAP](http://www.genivia.com/downloads.html) and build testmsgr as follows: cd gsoap/samples/testmsgr make testmsgr This builds the command-line tool testmsgr in `gsoap/samples/testmsgr` from where you can use it and/or copy it for use with your projects. If you do not have the samples built, you can use soapcpp2 from the command line to generate the C++ code required for testmsgr: cd gsoap/samples/testmsgr soapcpp2 -CSL ../../import/dom.h c++ -I../.. -o testmsgr testmsgr.cpp soapC.cpp ../../dom.cpp ../../stdsoap2.cpp This builds the testmsgr command-line tool. For users of Windows, visit [download and installation](http://www.genivia.com/downloads.html) to download `testmsgr.exe`. 🔝 [Back to table of contents](#) Using testmsgr {#using} ============== The testmsgr command takes a set of options, a SOAP/XML message file or a message template file (i.e. to randomize with option `-r`), and an optional service endpoint URL. 🔝 [Back to table of contents](#) Server-side testing {#servers} ------------------- To test services, run testmsgr against the service endpoint URL, for example when the service runs on the localhost on port 8080: ./testmsgr -r99 example.upload.req.xml http://localhost:8080 When using https endpoints, you must build testmsgr with compile-time flag `WITH_OPENSSL` and link OpenSSL as follows: soapcpp2 -CSL ../../import/dom.h c++ -DWITH_OPENSSL -o testmsgr testmsgr.cpp soapC.cpp ../../dom.cpp ../../stdsoap2.cpp -lssl -lcrypto For CGI-based services that read SOAP/XML requests from standard input you can redirect the (randomized) message to the CGI-based service. For example: ./testmsgr -r99 example.upload.req.xml | ./echoserver where echoserver is a CGI-based service (the echoserver built in the \ref intro uses CGI by default). 🔝 [Back to table of contents](#) Client-side testing {#clients} ------------------- To test clients, run testmsgr as a stand-alone server by specifying a port number instead of a service endpoint URL: ./testmsgr -r1 example.download.res.xml 8080 This runs the Test Messenger on port 8080. The Test Messenger discards request messages sent by clients and returns randomized responses using the SOAP/XML `example.download.res.xml` response message template. You can also use file redirection to test clients when your client uses the "http://" endpoint URL without a domain. By using this URL your client writes HTTP messages to standard output and reads HTTP responses from standard input. For example: ./testmsgr -r1 example.download.res.xml > response.xml ./client < response.xml > /dev/null 🔝 [Back to table of contents](#) Options {#options} ------- testmsgr [-aact] [-b] [-c] [-dnum] [-f] [-h] [-i] [-j] [-lmax] [-mmax] [-nlen] [-ofile] [-pnum] [-qnum] [-rseed] [-tsec] [-v] [-A] [-C] [-H] [-M] [-Oopt] [-Pper] [-Rrep] [-Ssel] [infile|-] [URL|port] where the testmsgr command-line options are: Option | Description --------- | -------------------------------------------------------------------- `-a act` | add a HTTP SOAP Action header value `"act"` `-b` | add random spacing to randomized values when using `-r` `-c` | continuous testing until the service endpoint fails, when using a URL `-d num` | test a service endpoint `num` times or until it fails, when using a URL `-f` | exit on any HTTP error or SOAP fault when using `-c` or `-d` `-h` | display help message `-i` | indent XML with spaces when using `-r` `-j` | indent XML with tabs when using `-r` `-l max` | max number of randomized element repeats when using `-r` (default is 3) `-m max` | max length of randomized text values generated (default is 10) `-n len` | display the server response up to len bytes `-o file` | save to file instead of stdout `-p perc` | percentage of XML kept in general when using -r (default=100) `-q perc` | percentage of XML kept of optional/repeated indicators when using -r (default=100) `-r seed` | randomize XML from XML message templates (use soapcpp2 `-g`) `-t sec` | socket idle timeout seconds (default=1), to test response time `-v` | verbose mode `-A` | enable SOAP with MIME attachments (SwA) `-C` | enable HTTP chunked transfers `-H` | add HTTP headers when no URL is specified `-M` | enable MTOM (application/xop+xml) `-O opt` | set the XML optional value indicator (default="???") `-P per` | set the XML element permutation indicator tag (default=`__PERMUTE`) `-R rep` | set the XML element repetition indicator tag (default=`__REPEAT`) `-S sel` | set the XML element selection indicator tag (default=`__SELECT`) `infile` | XML message or XML message template with indicator annotations `-` | read XML message or XML message template from standard input `URL` | endpoint URL of service to test `port` | stand-alone server port for clients to test against More specifically, `infile` is an SOAP/XML message file (or message template file), `-` specifies that the message should be read from standard input, and `URL` is the optional service endpoint to send (randomized) messages to. When a `port` number is specified instead of a URL, testmsgr runs as a stand-alone application to test clients that connect to it. A client application receives the (randomized) message generated by testmsgr from the specified SOAP/XML message file (or message template file). ### `-a act` Use HTTP SOAP Action header value `"act"` with the SOAP request messages sent. This option is required for services that require a SOAP Action header. ### `-b` Add random blank spacing to randomized values when using option `-r`. ### `-c` Continuous testing of a service endpoint until the service fails, i.e. until the server at the specified endpoint URL becomes unresponsive. ### `-d num` Test a service endpoint `num` times or until the service fails, i.e. until the server at the specified endpoint URL becomes unresponsive. ### `-f` Exit on any HTTP error or on any SOAP fault by the service endpoint when using option `-c` or `-d num`, instead of continuing until the specified endpoint URL becomes unresponsive. ### `-h` Display help message. ### `-i` Indent XML with spaces when using option `-r`. ### `-j` Indent XML with tabs when using option `-r`. ### `-l max` Specifies the max number of randomized element repetitions for `__REPEAT` and `__SELECT` with min and max indicators, when using option `-r`. The default is 3. The maximum value that can be specified is 18446744073709551615. ### `-m max` Specifies the max length of randomized text values generated when using option `-r`. The default is 255. The maximum value that can be specified is 18446744073709551615. ### `-n len` Display the server response up to `len` bytes. `-n0` removes the server responses. Omitting this option displays the full response. ### `-o file` Save output to file. This option is not applicable when `URL` or `port` are specified. ### `-p perc` Retain XML with the specified percentage chance, when using option `-r`. XML attributes and elements are removed by chance as specified. For example, `-p10` keeps only roughly 10% of the XML elements and attributes of the original message. The default is 100 (retain all XML). ### `-q perc` Retain XML qualified with `???` and elements repeated with the `__REPEAT` indicator with the specified percentage chance, when using option `-r`. For example, if a message has an element or attribute value `???%[[INT32]]` then `-q10` keeps the element or attribute with a 10% chance. Likewise, optional XML elements enclosed in `<__REPEAT>` as indicated with `min` and `max` bounds are kept with a 10% chance. The default is 100 (retain). ### `-r seed` Randomize the SOAP/XML message template given as the `infile` argument. SOAP/XML message templates can be auto-generated with soapcpp2 option `-g`. The `seed` value is required and is used to reproduce test messages. Any positive seed value can be specified, from 1 up to 2147483647. ### `-t sec` Sets a socket idle timeout in seconds. The default is one second. A service is considered unresponsive when a socket timeout occurs while messages are exchanged. ### `-v` Enable verbose mode. ### `-A` Use SOAP with MIME attachments, also called SOAP with Attachments (SwA). This option generates a MIME message with SOAP Body and zero or more MIME attachments. When combined with option `-r`, a MIME attachment is added for each element with binary content (base64Binary XML element) specified in the template with `%[[BASE64]]%`. The template `%[[BASE64]]%` value is replaced with an `href` attribute referencing the MIME attachment with randomized content. ### `-C` Use HTTP chunked transfers. ### `-H` Add HTTP headers to the generated message even when no URL is specified on the command line. ### `-M` Use MTOM (application/xop+xml) messaging. This option generates a MIME message with SOAP Body and zero or more MTOM attachments in MIME format. When combined with option `-r`, a MIME attachment is added for each element with binary content (base64Binary XML element) specified in the template with `%[[BASE64]]%`. The template `%[[BASE64]]%` value is replaced with an `` element with an `href` attribute referencing the MIME attachment with randomized content. ### `-O opt` Sets the XML optional value indicator. The default is `???`. See \ref indicators. ### `-P per` Sets the XML element permutation indicator tag. The default is `__PERMUTE`. See \ref indicators. ### `-R rep` Sets the XML element repetition indicator tag. The default is `__REPEAT`. See \ref indicators. ### `-S sel` Sets the XML element selection indicator tag. The default is `__SELECT`. See \ref indicators. 🔝 [Back to table of contents](#) Message templates {#templates} ================= A SOAP/XML message template file is required when sending randomized messages with testmsgr option `-r`. The SOAP/XML message template file can be auto-generated with soapcpp2 option `-g` on a interface file. This interface file is usually generated with wsdl2h from a (set of) WSDL and XSD file(s). Note that option `-g` does not produce SOAP/XML message templates if the interface file does not declare any service operations. 🔝 [Back to table of contents](#) Placeholder values {#placeholder} ------------------ Templates may contain placeholder values. Placeholder values may start with `???` meaning the value is optional, followed by the placeholder value type, an enumeration, or a numeric range. Values are inserted with testmsgr option `-r seed`. ### Optional values Element and attributes that are qualified as optional with `???` are randomly discared with options `-r` and `-q`, where `-q` specifies the percentage of elements and attributes that are retained in the generated XML message. A zero percentage specified with `-q0` removes all optional values. A value of 100 specified with `-q100` retains all optional values (the default) in the generated XML message. The `???` qualifier may appear after the opening tag of an element (i.e. in front of the element value or child elements) and in attribute values. For example:
```xml ???%[[TEXT]]% ??? %[[TEXT[1:20]]]% %[[TEXT[1:40]]]% ??? ```
where `id="???%[[INT32]]"` is an optional attribute with a 32-bit integer value, `???%[[TEXT]]%` is an optional element with text, `???` is an optional element with subelements, and `???` is an optional empty element with an attribute. ### Enumeration placeholders Enumeration placeholders can be used anywhere a value is expected and is used to provide an enumeration of possible values to choose from for element and attributes. `%[[A][B][C]]%` specifies a choice of values `A`, `B` or `C`. The values can be anything but should not contain `][` or `]]%`. For example:
```xml ```
where `completed="%[[false][true]]%"` enumerates the values `false` and `true`. Note that this enumeration is identical to the `%[[BOOL]]%` placeholder type. ### Pattern placeholders Pattern placeholders can be used anywhere a value is expected and is used to provide a pattern to generate randomized values. A pattern placeholder %[['pattern']]% specifies a pattern in the usual XML regular expression syntax, for example:
```xml ```
A quote (') in the pattern should be escaped with a backslash as in \', which the soapcpp2 tool automatically converts with option `-g` to produce pattern facets. The length of the generated string may be constrained with %[['pattern'[N:M]]]%. The range `N:M` specifies the number of characters. @note Unicode character classes specified with `\p{C}` are not yet supported in gSOAP versions 2.8.62-2.8.64. @warning Length constraints `N:M` in %[['pattern'[N:M]]]% should be viable given the pattern's inherent minimum and maximum lengths. For example, %[['[a-z]+'[0:10]]]% is viable, but %[['id[0-9]{3}'[0:3]]]% is not viable. There is a possibility that the generated pattern does not meet the `[N:M]` constraints provided. ### Numeric range and precision placeholders A numeric range is integer-valued when the lower bound `N` and upper bound `M` are integer. Otherwise, the numeric range values are floating point. For example, `%[[0:10]]%` speficies a range of integer values whereas `%[[0.0:10.0]]%` specifies a range of floating point values. The bounds of a numeric range can be made exlusive by using `(` and `)` instead of `[` and `]`. `%[[N:M]]%` specifies a range of integer or float values between `N` and `M`. `%[[N:M)]%` specifies a range of integer or float values between `N` and `M` (exclusive). `%[(N:M]]%` specifies a range of integer or float values between `N` (exclusive) and `M`. `%[(N:M)]%` specifies a range of integer or float values between `N` (exclusive) and `M` (exclusive). For example:
```xml %[(0.00:100000.00]]% ```
where 0.00 is excluded from the float value range and `100000.00` is the inclusive maximum of the numeric range. A decimal precision is specified with a printf-based format string, such as `%.2f` to indicate 2 decimal places after the decimal period should be used. The decimal precision is added to the range in the template. For example, `%[[0.0:999.0%.2f]]%` specifies a floating point range between 0.00 and 999.00 with 2 decimal places after the period. The total field width (total digits) can be specified with `%[[0.0:999.0%6.2f]]%` for example. The precision of a "limitless" floating point and double precision floating point numeric precision is specified with `%[[FLOAT%.2e]]%` and `%[[DOUBLE%.2e]]%` respectively. This produces numeric values within the range of the specified type formatted according to the specified printf-format string. ### Primitive XSD type value placeholders `%[[BASE64]]%` and length-restricted `%[[BASE64[N:M]]]%` specify xsd:base64Binary XSD values. The length restriction `N:M` specifies the range of base64-encoded bytes. `%[[BOOL]]%` specifies xsd:boolean XSD values. `%[[DATE]]%` specifies xsd:date XSD values. `%[[DATETIME]]%` specifies xsd:dateTime XSD values. `%[[DOUBLE]]%` specifies xsd:double XSD values. `%[[DURATION]]%` specifies xsd:duration XSD values. `%[[ENTITY]]%` and length-restricted `%[[ENTITY[N:M]]]%` specify xsd:ENTITY XSD values. The range `N:M` specifies the number of characters. `%[[HEX]]%` and length-restricted `%[[HEX[N:M]]]%` specify xsd:hexBinary XSD values. The length restriction `N:M` specifies the range of encoded bytes, not the number of hexadecimal characters. `%[[ID]]%` and length-restricted `%[[ID[N:M]]]%` specify xsd:ID XSD values. The range `N:M` specifies the number of characters. `%[[IDREF]]%` and length-restricted `%[[IDREF[N:M]]]%` specify xsd:IDREF XSD values. The range `N:M` specifies the number of characters. `%[[FLOAT]]%` specifies xsd:float XSD values. `%[[INT8]]%` and `%[[BYTE]]%` specify xsd:byte XSD values. `%[[INT16]]%` and `%[[SHORT]]%` specify xsd:short XSD values. `%[[INT32]]%` and `%[[INT]]%` specify xsd:int XSD values. `%[[INT64]]%` and `%[[LONG]]%` specify xsd:long XSD values. `%[[LANG]]%` specifies xsd:language XSD values. `%[[NAME]]%` and length-restricted `%[[NAME[N:M]]]%` specify xsd:Name XSD values. The range `N:M` specifies the number of characters. `%[[NCNAME]]%` and length-restricted `%[[NCNAME[N:M]]]%` specify xsd:NCName XSD values. The range `N:M` specifies the number of characters. `%[[NMTOKEN]]%` and length-restricted `%[[NMTOKEN[N:M]]]%` specify xsd:NMTOKEN XSD values. The range `N:M` specifies the number of characters. `%[[QNAME]]%` specifies xsd:QName XSD values. `%[[TEXT]]%` and length-restricted `%[[TEXT[N:M]]]%` specify xsd:string, xsd:normalizedString, xsd:anyURI, xsd:NOTATION, and xsd:token XSD values. The range `N:M` specifies the number of characters. `%[[TIME]]%` specifies xsd:time XSD values. `%[[TOKEN]]%` and length-restricted `%[[TOKEN[N:M]]]%` specify xsd:token XSD values. The range `N:M` specifies the number of characters. `%[[UINT8]]%` and `%[[UBYTE]]%` specify xsd:unsignedByte XSD values. `%[[UINT16]]%` and `%[[USHORT]]%` specify xsd:unsignedShort XSD values. `%[[UINT32]]%` and `%[[UINT]]%` specify xsd:unsignedInt XSD values. `%[[UINT64]]%` and `%[[ULONG]]%` specify xsd:unsignedLong XSD values. `%[[URI]]%` specifies xsd:anyURI XSD values. 🔝 [Back to table of contents](#) Element repetition, selection and permutation indicators {#indicators} -------------------------------------------------------- Three special XML elements `__REPEAT`, `__SELECT` and `__PERMUTE` in message templates indicate XML element repetitions and selections, respectively. These elements are processed by the Test Messenger to generate child elements, after which the `__REPEAT`, `__SELECT` and `__PERMUTE` XML elements are removed from the generated randomized XML messages. These indicators require testmsgr option `-r seed`. ### Repetition Child elements and/or CDATA text in the `__REPEAT` indicator element are repeated within a range specified by `min` and `max` attributes of the `__REPEAT` element. The `min` and `max` attributes are optional and default to 1 when omitted. Option `-q` of testmsgr controls the percentage of child elements that are generated within the range. A zero percentage specified with `-q0` generates the minimum number of child elements. A value of 100 specified with `-q100` generates the maximum number of child elements. The maximum number of child elements (randomly) generated is bounded by option `-l` (default is 3). Therefore, the maximum number of child elements is the greater of attribute `min` and the lesser of attribute `max` and the value *lmax* specified with option `-l`: > *min <= n <= maximum(min, minimum(max, lmax))* where *n* is the number of child elements generated with a random probability percentage specified by option `-q`. For example, to repeat an `item` element with an integer value two or more times use the `__REPEAT` indicator element with `item` as a child element:
```xml <__REPEAT min="2" max="unbounded"> %[[INT32]]% ```
Assuming that testmsgr options `-r1`, `-l10` and `-q50` are used, the generated XML message has at least two `item` elements and at most 10 elements, with on average 50% of the elements kept between 2 (the `min` minimum) and 10 elements (the maximum specified by `-l10`), i.e. 6 elements on average. Each `item` element has a random integer value. Multiple child elements can be repeated as a group, which may include mixed CDATA content of any type, for example:
```xml <__REPEAT min="0" max="10"> %[[TOKEN]]% ???%[[INT32]]% %[[HEX]]% ```
This repeats `` with optional `` up to 10 times, with mixed hexadecimal text included. Note that the `???` qualifier can be used with child elements to make them optional in repetitions as shown in the example. The testmsgr tool recognizes SOAP 1.1/1.2 arrays with array type and size attributes. These attributes are automatically changed in the randomized XML output. The array element should have one or more nested `__REPEAT` indicators. Consider for example the following 2D array:
```xml <__REPEAT min="0" max="4"> <__REPEAT min="0" max="8"> %[[FLOAT]]% ```
The `SOAP-ENC:arrayType` attribute array dimension values are automatically adjusted in the XML output by testmsgr depending on the number of `item` elements generated. ### Selection One child element of the `__SELECT` indicator element is uniform randomly selected as an XML element for the generated randomized XML message. For example, to select one element from the three choices of elements `A`, `B` or `C`:
```xml <__SELECT> %[[INT32]]% %[[FLOAT]]% %[[TEXT]]% ```
The generated XML message has either an `A` element with an integer value, a `B` element with a floating point value, or a `C` element with a text value. Note that the `???` qualifier can be used with child elements to make them optional in selections. ### Permutation Child element of the `__PERMUTE` indicator element are uniform randomly permuted in the generated randomized XML message. For example, elements `A`, `B` or `C` are permuted with:
```xml <__PERMUTE> %[[INT32]]% %[[FLOAT]]% %[[TEXT]]% ```
The generated XML message has `A`, `B` and `C` elements produced in any order. Note that the `???` qualifier can be used with child elements to make them optional in permutations. 🔝 [Back to table of contents](#) Copyright {#copyright} ========= Copyright (c) 2018, Robert van Engelen, Genivia Inc. All rights reserved. gsoap-2.8.91/gsoap/samples/testmsgr/.deps/0000755000175000017500000000000013525245203017723 5ustar ellertellertgsoap-2.8.91/gsoap/samples/testmsgr/.deps/dom2calc.Po0000644000175000017500000000001013525245163021703 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/samples/testmsgr/Makefile.in0000644000175000017500000004721613525245163020776 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = testmsgr$(EXEEXT) subdir = gsoap/samples/testmsgr ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am_testmsgr_OBJECTS = testmsgr.$(OBJEXT) $(am__objects_1) \ $(am__objects_2) testmsgr_OBJECTS = $(am_testmsgr_OBJECTS) am__DEPENDENCIES_1 = testmsgr_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/soapC.Po ./$(DEPDIR)/testmsgr.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(testmsgr_SOURCES) DIST_SOURCES = $(testmsgr_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.cpp_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = ../../import/dom.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = $(SOAP_NS_DEF) testmsgr_CFLAGS = -DWITH_OPENSSL -DWITH_GZIP testmsgr_SOURCES = testmsgr.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) testmsgr_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) $(SAMPLE_SSL_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/testmsgr/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/testmsgr/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) testmsgr$(EXEEXT): $(testmsgr_OBJECTS) $(testmsgr_DEPENDENCIES) $(EXTRA_testmsgr_DEPENDENCIES) @rm -f testmsgr$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(testmsgr_OBJECTS) $(testmsgr_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testmsgr.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/testmsgr.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/testmsgr.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/testmsgr/Makefile.am0000644000175000017500000000106613525245163020756 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = testmsgr SOAPHEADER = ../../import/dom.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = $(SOAP_NS_DEF) testmsgr_CFLAGS = -DWITH_OPENSSL -DWITH_GZIP testmsgr_SOURCES = testmsgr.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) testmsgr_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) $(SAMPLE_SSL_LIBS) gsoap-2.8.91/gsoap/samples/testmsgr/testmsgr.cpp0000644000175000017500000034022413525245163021300 0ustar ellertellert/* testmsgr.cpp Test messenger Sends (randomized) XML messages to server for testing -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2018, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ /* Build steps: soapcpp2 -CSL import/dom.h c++ -DWITH_OPENSSL -o testmsgr testmsgr.cpp soapC.cpp stdsoap2.cpp dom.cpp -lssl -lcrypto */ #include "soapH.h" // generated by soapcpp2 -CSL import/dom.h #include // ifstream, ofstream #include #include #ifndef WIN32 #include // SIGPIPE #endif typedef std::bitset<0x110000> charset; // Unicode character set 0x0000-0x10FFFF static const unsigned int UNDEFINED_CHAR = 0xFFFD; // Unicode undefined error char static void sigpipe_handler(int) { } // SIGPIPE handler struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; // dummy namespace table static size_t cidnum = 0; // cid:id# counter for MTOM attachments static size_t idnum = 0; // ID and IDREF value counter static size_t idref = 0; // IDREF value counter //////////////////////////////////////////////////////////////////////////////// // // Indicator tags // //////////////////////////////////////////////////////////////////////////////// #define OPT "???" #define REP "__REPEAT" #define SEL "__SELECT" #define PER "__PERMUTE" //////////////////////////////////////////////////////////////////////////////// // // Command line options // //////////////////////////////////////////////////////////////////////////////// static const char *act = NULL; // -aact static bool blank = false; // -b static bool cont = false; // -c static ULONG64 dnum = 0; // -dnum static bool ferr = false; // -f static bool iind = false; // -i static bool jind = false; // -j static unsigned long lmax = 3; // -lmax static unsigned long mmax = 10; // -mmax static LONG64 nlen = -1; // -nlen static const char *ofile = NULL; // -ofile static unsigned long pperc = 100; // -pperc static unsigned long qperc = 100; // -qperc static long seed = 0; // -rseed static int tsec = 1; // -tsec static bool uchr = false; // -u static bool verb = false; // -v static bool mime = false; // -A static bool chnk = false; // -C static bool http = false; // -H static bool mtom = false; // -M static const char *opt = OPT; // -Oopt static const char *per = PER; // -Pper static const char *rep = REP; // -Rrep static const char *sel = SEL; // -Ssel static const char *ifile = NULL; // [infile|-] static const char *URL = NULL; // [URL] static unsigned long port = 0; // [port] //////////////////////////////////////////////////////////////////////////////// // // Inline // //////////////////////////////////////////////////////////////////////////////// inline void gen_send(struct soap *ctx, const char *s, size_t k = std::string::npos) { if (k == std::string::npos) k = strlen(s); if (soap_send_raw(ctx, s, k)) { if (URL) fprintf(stderr, "testmsgr: failed to send to %s\n", URL); else fprintf(stderr, "testmsgr: failed to write to output\n"); soap_print_fault(ctx, stderr); exit(EXIT_FAILURE); } } inline void gen_blank(struct soap *ctx) { if (blank) gen_send(ctx, " ", 1); } inline void gen_send_verb(struct soap *ctx, const char *t, const char *s, size_t k = std::string::npos) { if (verb) { if (k != std::string::npos) printf("%s %.*s\n", t, (int)k, s); else printf("%s %s\n", t, s); } gen_blank(ctx); gen_send(ctx, s, k); gen_blank(ctx); } inline void gen_indent(struct soap *ctx, size_t tab) { if (iind) { gen_send(ctx, "\n", 1); for (size_t i = 0; i < tab; ++i) gen_send(ctx, " ", 1); } else if (jind) { gen_send(ctx, "\n", 1); for (size_t i = 0; i < tab; ++i) gen_send(ctx, "\t", 1); } } inline unsigned long gen_random() { #ifdef HAVE_RANDOM return (unsigned long)random(); #else return (unsigned long)rand(); #endif } inline void set_chars(charset& cs, unsigned int lo, unsigned int hi) { cs |= (((charset().set() >>= lo) <<= lo + 0x10FFFF - hi) >>= 0x10FFFF - hi); } //////////////////////////////////////////////////////////////////////////////// // // Proto // //////////////////////////////////////////////////////////////////////////////// static void test_server(struct soap *ctx, xsd__anyType& dom); static void test_client(struct soap *ctx, xsd__anyType& dom); static void gen_test(struct soap *ctx, xsd__anyType& dom); static void gen_random_test(struct soap *ctx, xsd__anyType& dom, size_t tab = 0); static void gen_random_attachments(struct soap *ctx); static void get_minmax(struct soap *ctx, xsd__anyType& dom, unsigned long& n, unsigned long& m); static bool get_dim(struct soap *ctx, xsd__anyType& dom, unsigned long& d); static void gen_value(struct soap *ctx, const char *s); static bool get_range(const char *s, unsigned long& n, unsigned long& m); static void gen_name(struct soap *ctx, ULONG64 x, ULONG64 n); static void gen_ncname(struct soap *ctx, ULONG64 x, ULONG64 n); static void gen_qname(struct soap *ctx, ULONG64 x, ULONG64 n); static void gen_uri(struct soap *ctx, ULONG64 x, ULONG64 n); static void gen_lang(struct soap *ctx, ULONG64 x, ULONG64 n); static void gen_text(struct soap *ctx, ULONG64 x, ULONG64 n); static void gen_hex(struct soap *ctx, ULONG64 x, ULONG64 n); static void gen_base64(struct soap *ctx, ULONG64 x, ULONG64 n); static void gen_id(struct soap *ctx); static void gen_idref(struct soap *ctx); static void gen_pattern(struct soap *ctx, const char *pattern, ULONG64 n, ULONG64 m); static std::string get_reg(const char **pattern, ULONG64 l); static std::string get_seq(const char **pattern, ULONG64 l); static std::string get_rep(const char **pattern, ULONG64 l); static std::string get_sym(const char **pattern, ULONG64 l); static bool get_charset(const char **pattern, charset& cs); static unsigned int get_char(const char **pattern); static void append_char(std::string& s, unsigned int c); static int receive_request(struct soap *ctx); static void receive_response(struct soap *ctx); //////////////////////////////////////////////////////////////////////////////// // // testmsgr main // //////////////////////////////////////////////////////////////////////////////// int main(int argc, char **argv) { if (argc >= 2) { for (int i = 1; i < argc; i++) { const char *a = argv[i]; if ((a[0] == '-' && a[1]) #ifdef WIN32 || a[0] == '/' #endif ) { bool f = true; while (f && *++a) { switch (*a) { case 'a': a++; f = false; if (*a) act = a; else if (i < argc) act = argv[++i]; break; case 'b': blank = true; break; case 'c': cont = true; break; case 'd': a++; f = false; if (*a) dnum = soap_strtoull(a, NULL, 10); else if (i < argc) dnum = strtoull(argv[++i], NULL, 10); break; case 'f': ferr = true; break; case '?': case 'h': fprintf(stderr, "Usage: testmsgr [-aact] [-b] [-c] [-dnum] [-f] [-h] [-i] [-j] [-lmax] [-mmax] [-nlen] [-pperc] [-qperc] [-rseed] [-tsec] [-u] [-v] [-A] [-C] [-H] [-M] [-Oopt] [-Pper] [-Rrep] [-Ssel] [infile|-] [URL|port]\n\n" "-aact add a HTTP SOAP Action header with value \"act\"\n" "-b add random spacing to randomized values when using -r\n" "-c continuous testing until the service endpoint fails, when using a URL\n" "-dnum test a service endpoint num times or until it fails, when using a URL\n" "-f exit on any HTTP error or SOAP fault when using -c or -d\n" "-h display help message\n" "-i indent XML with spaces when using -r\n" "-j indent XML with tabs when using -r\n" "-lmax max number of randomized element repeats when using -r (default=3)\n" "-mmax max length of randomized text values generated (default=10)\n" "-nlen display the server response up to len bytes\n" "-ofile save to file instead of stdout\n" "-pperc percentage of XML kept in general when using -r (default=100)\n" "-qperc perc. XML kept of optional/repeat indicators when using -r (default=100)\n" "-rseed randomize XML messages from XML templates (use soapcpp2 -g)\n" "-tsec socket idle timeout seconds (default=1), to test response time\n" "-u include Unicode characters in randomized content\n" "-v verbose mode\n" "-A enable SOAP with MIME attachments (SwA)\n" "-C enable HTTP chunked transfers\n" "-H add HTTP headers when no URL is specified\n" "-M enable MTOM (application/xop+xml)\n" "-Oopt set the XML optional value indicator (default=" OPT ")\n" "-Pper set the XML element permutation indicator tag (default=" PER ")\n" "-Rrep set the XML element repetition indicator tag (default=" REP ")\n" "-Ssel set the XML element selection indicator tag (default=" SEL ")\n" "infile XML message or XML message template with indicator annotations\n" "- read XML message or XML message template from standard input\n" "URL endpoint URL of service to test\n" "port stand-alone server port for clients to test against\n\n"); exit(EXIT_SUCCESS); case 'i': iind = true; break; case 'j': jind = true; break; case 'l': a++; f = false; if (*a) lmax = soap_strtoul(a, NULL, 10); else if (i < argc) lmax = strtoul(argv[++i], NULL, 10); break; case 'm': a++; f = false; if (*a) mmax = soap_strtoul(a, NULL, 10); else if (i < argc) mmax = strtoul(argv[++i], NULL, 10); break; case 'n': a++; f = false; if (*a) nlen = soap_strtoll(a, NULL, 10); else if (i < argc) nlen = strtoll(argv[++i], NULL, 10); break; case 'o': a++; f = false; if (*a) ofile = a; else if (i < argc) ofile = argv[++i]; break; case 'p': a++; f = false; if (*a) pperc = soap_strtoul(a, NULL, 10); else if (i < argc) pperc = strtoul(argv[++i], NULL, 10); if (pperc > 100) { fprintf(stderr, "testmsgr: -p option percentage value exceeds 100\n\n"); exit(EXIT_FAILURE); } break; case 'q': a++; f = false; if (*a) qperc = soap_strtoul(a, NULL, 10); else if (i < argc) qperc = strtoul(argv[++i], NULL, 10); if (qperc > 100) { fprintf(stderr, "testmsgr: -q option percentage value exceeds 100\n\n"); exit(EXIT_FAILURE); } break; case 'r': a++; f = false; if (*a) seed = soap_strtol(a, NULL, 10); else if (i < argc) seed = strtol(argv[++i], NULL, 10); break; case 't': a++; f = false; if (*a) tsec = soap_strtol(a, NULL, 10); else if (i < argc) tsec = strtol(argv[++i], NULL, 10); break; case 'u': uchr = true; break; case 'v': verb = true; break; case 'A': mime = true; http = true; break; case 'C': http = true; chnk = true; break; case 'H': http = true; break; case 'M': mtom = true; http = true; break; case 'O': a++; f = false; if (*a) opt = a; else if (i < argc) opt = argv[++i]; if (!*opt) { fprintf(stderr, "testmsgr: Option -O requires a non-empty argument\n\n"); exit(EXIT_FAILURE); } break; case 'P': a++; f = false; if (*a) per = a; else if (i < argc) per = argv[++i]; if (!*per) { fprintf(stderr, "testmsgr: Option -P requires a non-empty argument\n\n"); exit(EXIT_FAILURE); } break; case 'R': a++; f = false; if (*a) rep = a; else if (i < argc) rep = argv[++i]; if (!*rep) { fprintf(stderr, "testmsgr: Option -R requires a non-empty argument\n\n"); exit(EXIT_FAILURE); } break; case 'S': a++; f = false; if (*a) sel = a; else if (i < argc) sel = argv[++i]; if (!*sel) { fprintf(stderr, "testmsgr: Option -S requires a non-empty argument\n\n"); exit(EXIT_FAILURE); } break; default: fprintf(stderr, "testmsgr: Unknown option %s\n\n", a); exit(EXIT_FAILURE); } } } else { if (!ifile) { ifile = argv[i]; } else if (URL) { fprintf(stderr, "testmsgr: server URL already specified as %s, ignoring %s\n\n", URL, a); } else if (port) { fprintf(stderr, "testmsgr: port already specified as %lu, ignoring %s\n\n", port, a); } else { char *r = NULL; unsigned long n = strtoul(argv[i], &r, 10); if (r && !*r && n) port = n; else URL = argv[i]; } } } } else { ifile = "-"; } if (!URL) { cont = false; dnum = 0; } #ifndef WIN32 signal(SIGPIPE, sigpipe_handler); #endif soap *ctx = soap_new1(SOAP_IO_KEEPALIVE | SOAP_C_UTFSTRING | SOAP_DOM_ASIS); ctx->send_timeout = tsec; ctx->recv_timeout = tsec; std::ifstream ifs; if (ifile) { if (!strcmp(ifile, "-")) { ctx->is = &std::cin; } else { ifs.open(ifile, std::ifstream::in); if (!ifs.is_open()) { fprintf(stderr, "testmsgr: failed to open %s for reading\n", ifile); exit(EXIT_FAILURE); } ctx->is = &ifs; } } std::ofstream ofs; if (ofile) { ofs.open(ofile, std::ofstream::out); if (!ofs.is_open()) { fprintf(stderr, "testmsgr: failed to open %s for writing\n", ofile); exit(EXIT_FAILURE); } ctx->os = &ofs; } xsd__anyType dom(ctx); if (ifile) { if (soap_read_xsd__anyType(ctx, &dom)) { soap_print_fault(ctx, stderr); soap_print_fault_location(ctx, stderr); exit(EXIT_FAILURE); } if (!dom.tag()) { fprintf(stderr, "testmsgr: No root element in %s\n", ifile); exit(EXIT_FAILURE); } } if (ifile && strcmp(ifile, "-")) { ctx->is = NULL; ifs.close(); } if (chnk) soap_set_omode(ctx, SOAP_IO_CHUNK); else soap_set_omode(ctx, SOAP_IO_STORE); if (port) test_server(ctx, dom); else test_client(ctx, dom); if (ofile) { ctx->os = NULL; ofs.close(); } soap_destroy(ctx); soap_end(ctx); soap_free(ctx); return 0; } static void test_server(struct soap *ctx, xsd__anyType& dom) { struct soap *soap = soap_copy(ctx); SOAP_SOCKET m = soap_bind(soap, NULL, (int)port, 100); if (!soap_valid_socket(m)) { soap_print_fault(soap, stderr); } else { for (;;) { SOAP_SOCKET s = soap_accept(soap); if (!soap_valid_socket(s)) { soap_print_fault(soap, stderr); break; } if (receive_request(soap) == SOAP_OK) { if (mime) { soap_set_mime(soap, NULL, NULL); } else if (mtom) { soap_set_omode(soap, SOAP_ENC_MTOM); soap_set_mime(soap, NULL, NULL); } if (soap_response(soap, SOAP_OK)) { fprintf(stderr, "testmsgr: failed to send response\n"); soap_print_fault(soap, stderr); } else { gen_test(soap, dom); if (soap_end_send(soap)) { fprintf(stderr, "testmsgr: failed to send response\n"); soap_print_fault(soap, stderr); } } } soap_closesock(soap); soap_destroy(soap); soap_end(soap); } } soap_destroy(soap); soap_end(soap); soap_free(soap); } static void test_client(struct soap *ctx, xsd__anyType& dom) { struct soap *soap = soap_copy(ctx); if (mime) { soap_set_mime(soap, NULL, NULL); } else if (mtom) { soap_set_omode(soap, SOAP_ENC_MTOM); soap_set_mime(soap, NULL, NULL); } if (URL && !strncmp(URL, "https://", 8)) { #ifdef WITH_OPENSSL if (soap_ssl_client_context( soap, SOAP_SSL_NO_AUTHENTICATION, NULL, NULL, NULL, NULL, NULL )) { fprintf(stderr, "testmsgr: failed to initialize OpenSSL\n"); soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } #else #ifdef WIN32 fprintf(stderr, "\nCannot connect to https server: SSL/TLS support not enabled in this version. Visit https://www.genivia.com/downloads.html to download the secure version of testmsgr.exe that supports SSL/TLS to connect to https servers.\n"); #else fprintf(stderr, "\nCannot connect to https server: SSL/TLS support not enabled in this version with WITH_OPENSSL.\n"); #endif exit(EXIT_FAILURE); #endif } ULONG64 i = 1; do { if (cont || dnum) printf("Iteration " SOAP_ULONG_FORMAT "\n", i); if (URL) { if (soap_connect(soap, URL, act)) { fprintf(stderr, "testmsgr: failed to connect to %s\n", URL); soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } } else if (http) { if (soap_connect(soap, "http://", act)) { fprintf(stderr, "testmsgr: failed to write to output\n"); soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } } else { if (soap_begin_send(soap)) { fprintf(stderr, "testmsgr: failed to write to output\n"); soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } } gen_test(soap, dom); if (soap_end_send(soap)) { if (URL) fprintf(stderr, "testmsgr: failed to send to %s\n", URL); else fprintf(stderr, "testmsgr: failed to write to output\n"); soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } if (URL) receive_response(soap); soap_destroy(soap); soap_end(soap); ++i; } while (cont || (dnum && i <= dnum)); soap_destroy(soap); soap_end(soap); soap_free(soap); } static void gen_test(struct soap *ctx, xsd__anyType& dom) { soap_set_version(ctx, 0); // generate MIME protocol headers (no SOAP envelope) if (soap_envelope_begin_out(ctx)) { if (URL) fprintf(stderr, "testmsgr: failed to send to %s\n", URL); else fprintf(stderr, "testmsgr: failed to write output\n"); soap_print_fault(ctx, stderr); exit(EXIT_FAILURE); } if (seed) { fprintf(stderr, "Random seed = %lu\n", seed); #ifdef HAVE_RANDOM srandom(seed); seed = random(); #else srand((int)seed); seed = rand(); #endif cidnum = 0; idnum = 0; idref = 0; gen_random_test(ctx, dom); gen_random_attachments(ctx); } else if (soap_out_xsd__anyType(ctx, NULL, 0, &dom, NULL)) { if (URL) fprintf(stderr, "testmsgr: failed to send to %s\n", URL); else fprintf(stderr, "testmsgr: failed to write output\n"); soap_print_fault(ctx, stderr); exit(EXIT_FAILURE); } } static void gen_random_test(struct soap *ctx, xsd__anyType& dom, size_t tab) { if (pperc == 100 || gen_random() % 100 < pperc) { xsd__anyType::iterator i = dom.elt_begin(); xsd__anyType::iterator end = dom.elt_end(); if (dom.tag() && !strcmp(dom.tag(), per)) { unsigned long n = (unsigned long)dom.elt_size(); std::vector p; for (unsigned long m = 0; m < n; ++m) p.push_back(i++); // generate a random permutation of dom.elt_size() child nodes using Knuth shuffles for (std::vector::iterator j = p.begin(); j != p.end(); ++j) { std::vector::iterator k = j; for (unsigned long m = gen_random() % n; m > 0; --m) ++k; if (j != k) { xsd__anyType::iterator tmp = *j; *j = *k; *k = tmp; } --n; } for (std::vector::iterator j = p.begin(); j != p.end(); ++j) { if (j != p.begin()) gen_indent(ctx, tab); gen_random_test(ctx, **j, tab); } } else if (dom.tag() && !strcmp(dom.tag(), rep)) { unsigned long n, m; bool d = false; if (get_dim(ctx, dom, n)) { m = n; // dimension that was set by arrayType/arraySize } else { get_minmax(ctx, dom, n, m); } for (unsigned long j = 0; j < m; ++j) { xsd__anyType::iterator k = i; if (j < n || qperc == 100 || gen_random() % 100 < qperc) { while (k != end) { if (d) gen_indent(ctx, tab); gen_random_test(ctx, *k++, tab); d = true; } if (dom.get_text()) gen_value(ctx, dom.get_text()); } } } else if (dom.tag() && !strcmp(dom.tag(), sel)) { for (unsigned long n = gen_random() % (unsigned long)dom.elt_size(); n > 0; --n) ++i; gen_random_test(ctx, *i, tab); } else { const char *t = NULL; if (i != end) t = i->get_text(); if (!t || strcmp(t, opt) || qperc == 100 || gen_random() % 100 < qperc) { if (dom.tag()) { gen_send(ctx, "<"); gen_send(ctx, dom.tag()); for (xsd__anyAttribute::iterator j = dom.att_begin(); j != dom.att_end(); ++j) { if (!strcmp(j->tag(), "SOAP-ENC:arrayType") && j->ns() && !strcmp(j->ns(), "http://schemas.xmlsoap.org/soap/encoding/")) { std::string dims; xsd__anyType *ptr = &dom; do { xsd__anyType::iterator k = ptr->elt_begin(); ptr = NULL; if (k != dom.elt_end() && !strcmp(k->tag(), rep)) { unsigned long n, m; get_minmax(ctx, *k, n, m); if (qperc != 100 && n != m) m = n + (unsigned long)gen_random() % (m - n + 1); std::string dim = soap_unsignedLong2s(ctx, m); k->att("dim") = dim; if (dims.empty()) dims = dim; else dims.append(",").append(dim); ptr = &*k; } } while (ptr); std::string type = j->get_text(); size_t k = type.find('['); if (k != std::string::npos) *j = type.substr(0, k + 1) + dims + "]"; } else if (!strcmp(j->tag(), "SOAP-ENC:arraySize") && j->ns() && !strcmp(j->ns(), "http://www.w3.org/2003/05/soap-encoding")) { std::string dims; xsd__anyType *ptr = &dom; do { xsd__anyType::iterator k = ptr->elt_begin(); ptr = NULL; if (k != dom.elt_end() && !strcmp(k->tag(), rep)) { unsigned long n, m; get_minmax(ctx, *k, n, m); if (qperc != 100 && n != m) m = n + (unsigned long)gen_random() % (m - n + 1); std::string dim = soap_unsignedLong2s(ctx, m); k->att("dim") = dim; if (dims.empty()) dims = dim; else dims.append(" ").append(dim); ptr = &*k; } } while (ptr); *j = dims; } if (!strncmp(j->tag(), "xml", 3) || pperc == 100 || gen_random() % 100 < pperc) { const char *t = j->get_text(); if (!t || strncmp(t, opt, strlen(opt)) || qperc == 100 || gen_random() % 100 < qperc) { gen_send(ctx, " "); gen_send(ctx, j->tag()); if (t) { gen_send(ctx, "=\""); gen_value(ctx, t); gen_send(ctx, "\""); } } } } t = dom.get_text(); if ((mime || mtom) && t && !strcmp(t, "%[[BASE64]]%")) { if (mtom) { gen_send(ctx, ">"); gen_indent(ctx, tab + 1); gen_send(ctx, ""); if (mtom) { gen_indent(ctx, tab); gen_send(ctx, ""); } } else { gen_send(ctx, ">"); while (i != end) { gen_indent(ctx, tab + 1); gen_random_test(ctx, *i++, tab + 1); } if (t) gen_value(ctx, t); else gen_indent(ctx, tab); gen_send(ctx, ""); } } else { t = dom.get_text(); if (t && strcmp(t, opt)) gen_value(ctx, t); } } } } } static void gen_random_attachments(struct soap *ctx) { for (size_t i = 0; i < cidnum; ++i) { struct soap_multipart content; content.type = "text/plain"; content.encoding = SOAP_MIME_BINARY; (SOAP_SNPRINTF(ctx->tmpbuf, sizeof(ctx->tmpbuf), 24), "", i); content.id = ctx->tmpbuf; content.location = NULL; content.description = NULL; if (soap_putmimehdr(ctx, &content)) { if (URL) fprintf(stderr, "testmsgr: failed to send to %s\n", URL); else fprintf(stderr, "testmsgr: failed to write output\n"); soap_print_fault(ctx, stderr); exit(EXIT_FAILURE); } gen_value(ctx, "%[[TEXT]]%"); } } static void get_minmax(struct soap *ctx, xsd__anyType& dom, unsigned long& n, unsigned long& m) { (void)ctx; n = m = 1; xsd__anyAttribute::iterator i; i = dom.att_find("min"); if (i != dom.att_end()) n = soap_strtoul(i->get_text(), NULL, 10); i = dom.att_find("max"); if (i != dom.att_end()) { const char *t = i->get_text(); if (!strcmp(t, "unbounded")) m = 4294967295; else m = soap_strtoul(i->get_text(), NULL, 10); } if (n > m) m = n; if (m > lmax) { if (n > lmax) m = n; else m = lmax; } } static bool get_dim(struct soap *ctx, xsd__anyType& dom, unsigned long& n) { (void)ctx; n = 0; xsd__anyAttribute::iterator i; i = dom.att_find("dim"); if (i == dom.att_end()) return false; n = soap_strtoul(i->get_text(), NULL, 10); return true; } static void gen_value(struct soap *ctx, const char *s) { if (!strncmp(s, opt, strlen(opt))) { if (qperc < 100 && gen_random() % 100 >= qperc) return; s += 3; } if (s[0] == '%' && s[1] == '[') { long x = gen_random(); if (!strcmp(s, "%[[BOOL]]%")) { gen_send_verb(ctx, s, x % 2 ? "true" : "false"); return; } if (!strcmp(s, "%[[INT8]]%") || !strcmp(s, "%[[BYTE]]%")) { char y; switch (x % 4) { case 0: gen_send_verb(ctx, s, "0"); return; case 1: gen_send_verb(ctx, s, "-128"); return; case 2: gen_send_verb(ctx, s, "127"); return; default: y = (char)x; (SOAP_SNPRINTF(ctx->tmpbuf, sizeof(ctx->tmpbuf), 24), "%d", (int)y); gen_send_verb(ctx, s, ctx->tmpbuf); return; } } if (!strcmp(s, "%[[UINT8]]%") || !strcmp(s, "%[[UBYTE]]%")) { unsigned char y; switch (x % 4) { case 0: gen_send_verb(ctx, s, "0"); return; case 1: gen_send_verb(ctx, s, "255"); return; default: y = (unsigned char)x; (SOAP_SNPRINTF(ctx->tmpbuf, sizeof(ctx->tmpbuf), 24), "%u", (unsigned int)y); gen_send_verb(ctx, s, ctx->tmpbuf); return; } } if (!strcmp(s, "%[[INT16]]%") || !strcmp(s, "%[[SHORT]]%")) { short y; switch (x % 4) { case 0: gen_send_verb(ctx, s, "0"); return; case 1: gen_send_verb(ctx, s, "-32768"); return; case 2: gen_send_verb(ctx, s, "32767"); return; default: y = (short)x; (SOAP_SNPRINTF(ctx->tmpbuf, sizeof(ctx->tmpbuf), 24), "%d", (int)y); gen_send_verb(ctx, s, ctx->tmpbuf); return; } } if (!strcmp(s, "%[[UINT16]]%") || !strcmp(s, "%[[USHORT]]%")) { unsigned short y; switch (x % 4) { case 0: gen_send_verb(ctx, s, "0"); return; case 1: gen_send_verb(ctx, s, "65535"); return; default: y = (unsigned short)x; (SOAP_SNPRINTF(ctx->tmpbuf, sizeof(ctx->tmpbuf), 24), "%d", (unsigned int)y); gen_send_verb(ctx, s, ctx->tmpbuf); return; } } if (!strcmp(s, "%[[INT32]]%") || !strcmp(s, "%[[INT]]%")) { int y; switch (x % 4) { case 0: gen_send_verb(ctx, s, "0"); return; case 1: gen_send_verb(ctx, s, "-2147483648"); return; case 2: gen_send_verb(ctx, s, "2147483647"); return; default: y = (int)x; (SOAP_SNPRINTF(ctx->tmpbuf, sizeof(ctx->tmpbuf), 24), "%d", y); gen_send_verb(ctx, s, ctx->tmpbuf); return; } } if (!strcmp(s, "%[[UINT32]]%") || !strcmp(s, "%[[UINT]]%")) { unsigned int y; switch (x % 4) { case 0: gen_send_verb(ctx, s, "0"); return; case 1: gen_send_verb(ctx, s, "4294967295"); return; default: y = (unsigned int)x; (SOAP_SNPRINTF(ctx->tmpbuf, sizeof(ctx->tmpbuf), 24), "%u", y); gen_send_verb(ctx, s, ctx->tmpbuf); return; } } if (!strcmp(s, "%[[INT64]]%") || !strcmp(s, "%[[LONG]]%")) { LONG64 y; switch (x % 4) { case 0: gen_send_verb(ctx, s, "0"); return; case 1: gen_send_verb(ctx, s, "-9223372036854775808"); return; case 2: gen_send_verb(ctx, s, "9223372036854775807"); return; default: y = (LONG64)x; (SOAP_SNPRINTF(ctx->tmpbuf, sizeof(ctx->tmpbuf), 24), SOAP_LONG_FORMAT, y); gen_send_verb(ctx, s, ctx->tmpbuf); return; } } if (!strcmp(s, "%[[UINT64]]%") || !strcmp(s, "%[[ULONG]]%")) { ULONG64 y; switch (x % 4) { case 0: gen_send_verb(ctx, s, "0"); return; case 1: gen_send_verb(ctx, s, "18446744073709551615"); return; default: y = (ULONG64)x; (SOAP_SNPRINTF(ctx->tmpbuf, sizeof(ctx->tmpbuf), 24), SOAP_ULONG_FORMAT, y); gen_send_verb(ctx, s, ctx->tmpbuf); return; } } if (!strcmp(s, "%[[FLOAT]]%") || !strncmp(s, "%[[FLOAT%", 9)) { char buf[16]; const char *format = ctx->float_format; if (s[8] == '%') { // get %D.F format string size_t i = 0; for (const char *r = s + 8; *r != ']' && i < sizeof(buf) - 1; ++r) buf[i++] = *r; buf[i] = '\0'; format = buf; } float y; switch (x % 10) { case 0: gen_send_verb(ctx, s, "NaN"); return; case 1: gen_send_verb(ctx, s, "INF"); return; case 2: gen_send_verb(ctx, s, "-INF"); return; case 3: gen_send_verb(ctx, s, "0.0"); return; case 4: gen_send_verb(ctx, s, "-0.0"); return; case 5: y = -FLT_MAX; (SOAP_SNPRINTF(ctx->tmpbuf, sizeof(ctx->tmpbuf), 24), format, y); gen_send_verb(ctx, s, ctx->tmpbuf); return; case 6: y = FLT_MAX; (SOAP_SNPRINTF(ctx->tmpbuf, sizeof(ctx->tmpbuf), 24), format, y); gen_send_verb(ctx, s, ctx->tmpbuf); return; default: y = (float)x/(float)0xFFFF; (SOAP_SNPRINTF(ctx->tmpbuf, sizeof(ctx->tmpbuf), 24), format, y); gen_send_verb(ctx, s, ctx->tmpbuf); return; } } if (!strcmp(s, "%[[DOUBLE]]%") || !strncmp(s, "%[[DOUBLE%", 10)) { char buf[16]; const char *format = ctx->double_format; if (s[9] == '%') { // get %D.F format string size_t i = 0; for (const char *r = s + 9; *r != ']' && i < sizeof(buf) - 1; ++r) buf[i++] = *r; buf[i] = '\0'; format = buf; } double y; switch (x % 10) { case 0: gen_send_verb(ctx, s, "NaN"); return; case 1: gen_send_verb(ctx, s, "INF"); return; case 2: gen_send_verb(ctx, s, "-INF"); return; case 3: gen_send_verb(ctx, s, "0.0"); return; case 4: gen_send_verb(ctx, s, "-0.0"); return; case 5: y = -DBL_MAX; (SOAP_SNPRINTF(ctx->tmpbuf, sizeof(ctx->tmpbuf), 24), format, y); gen_send_verb(ctx, s, ctx->tmpbuf); return; case 6: y = DBL_MAX; (SOAP_SNPRINTF(ctx->tmpbuf, sizeof(ctx->tmpbuf), 24), format, y); gen_send_verb(ctx, s, ctx->tmpbuf); return; default: y = (double)x/(double)0xFFFF; (SOAP_SNPRINTF(ctx->tmpbuf, sizeof(ctx->tmpbuf), 24), format, y); gen_send_verb(ctx, s, ctx->tmpbuf); return; } } if (!strcmp(s, "%[[DATETIME]]%")) { time_t t = (time_t)x; switch (x % 4) { case 0: gen_send_verb(ctx, s, "0000-01-00T00:00:00Z"); return; case 1: gen_send_verb(ctx, s, "1969-12-31T23:59:59Z"); return; default: t = (time_t)x; gen_send_verb(ctx, s, soap_dateTime2s(ctx, t)); return; } } if (!strcmp(s, "%[[DATE]]%")) { time_t t = (time_t)x; char *r; switch (x % 4) { case 0: gen_send_verb(ctx, s, "0000-01-00Z"); return; case 1: gen_send_verb(ctx, s, "1969-12-31Z"); return; default: t = (time_t)x; soap_dateTime2s(ctx, t); r = strchr(ctx->tmpbuf, 'T'); if (r) { r[0] = 'Z'; r[1] = '\0'; gen_send_verb(ctx, s, ctx->tmpbuf); } return; } } if (!strcmp(s, "%[[TIME]]%")) { time_t t = (time_t)x; switch (x % 4) { case 0: gen_send_verb(ctx, s, "00:00:00Z"); return; default: t = (time_t)x; gen_send_verb(ctx, s, soap_dateTime2s(ctx, t) + 11); return; } } if (!strcmp(s, "%[[DURATION]]%")) { int y; switch (x % 4) { case 0: gen_send_verb(ctx, s, "PT0S"); return; default: gen_send_verb(ctx, s, "PT"); y = (int)x; (SOAP_SNPRINTF(ctx->tmpbuf, sizeof(ctx->tmpbuf), 24), "%d", y); gen_send_verb(ctx, s, ctx->tmpbuf); gen_send(ctx, "S"); return; } } if (!strncmp(s, "%[[HEX", 6)) { if (s[6] == '[') { unsigned long n, m; if (get_range(s + 7, n, m)) { gen_hex(ctx, x, n + x % (m - n + 1)); return; } } else if (s[6] == ']' && s[7] == ']' && s[8] == '%' && !s[9]) { ULONG64 n = x; switch (x % 6) { case 0: gen_hex(ctx, x, 0); return; case 1: n %= 16; if (n > mmax) n = mmax; gen_hex(ctx, x, n); return; case 2: n %= 256; if (n > mmax) n = mmax; gen_hex(ctx, x, n); return; case 3: n %= 65536; if (n > mmax) n = mmax; gen_hex(ctx, x, n); return; case 4: if (n > mmax) n = mmax; gen_hex(ctx, x, n); return; default: gen_hex(ctx, x, mmax); return; } } } if (!strncmp(s, "%[[BASE64", 9)) { if (s[9] == '[') { unsigned long n, m; if (get_range(s + 10, n, m)) { gen_base64(ctx, x, n + x % (m - n + 1)); return; } } else if (s[9] == ']' && s[10] == ']' && s[11] == '%' && !s[12]) { ULONG64 n = x; switch (x % 6) { case 0: gen_base64(ctx, x, 0); return; case 1: n %= 16; if (n > mmax) n = mmax; gen_base64(ctx, x, n); return; case 2: n %= 256; if (n > mmax) n = mmax; gen_base64(ctx, x, n); return; case 3: n %= 65536; if (n > mmax) n = mmax; gen_base64(ctx, x, n); return; case 4: if (n > mmax) n = mmax; gen_base64(ctx, x, n); return; default: gen_base64(ctx, x, mmax); return; } } } if (!strcmp(s, "%[[ID]]%")) { gen_id(ctx); return; } if (!strcmp(s, "%[[IDREF]]%")) { gen_idref(ctx); return; } if (!strncmp(s, "%[[ENTITY", 9) || !strncmp(s, "%[[NAME", 7) || !strncmp(s, "%[[NCNAME", 9) || !strncmp(s, "%[[NMTOKEN", 10) || !strncmp(s, "%[[TOKEN", 8)) { size_t i = s[4] == 'C' ? 9 : s[4] == 'M' ? 10 : s[4] == 'A' ? 7 : s[3] == 'T' ? 8 : 9; if (s[i] == '[') { unsigned long n, m; if (get_range(s + i + 1, n, m)) { gen_name(ctx, x, n + x % (m - n + 1)); return; } } else if (s[i] == ']' && s[i + 1] == ']' && s[i + 2] == '%' && !s[i + 3]) { ULONG64 n = x; if (n == 0) n = 1; switch (x % 6) { case 0: gen_name(ctx, x, 1); return; case 1: n %= 16; if (n > mmax) n = mmax; gen_name(ctx, x, n); return; case 2: n %= 256; if (n > mmax) n = mmax; gen_name(ctx, x, n); return; case 3: n %= 65536; if (n > mmax) n = mmax; gen_name(ctx, x, n); return; case 4: if (n > mmax) n = mmax; gen_name(ctx, x, n); return; default: gen_name(ctx, x, mmax); return; } } } if (!strncmp(s, "%[[LANG", 7)) { if (s[7] == '[') { unsigned long n, m; if (get_range(s + 8, n, m)) { gen_lang(ctx, x, n + x % (m - n + 1)); return; } } else if (s[7] == ']' && s[8] == ']' && s[9] == '%' && !s[10]) { static const char iso639_1[] = "aaasaeafisamanisasasayazbabebgbhNibmasasbrbscacechcocrcsbycvcydadedvdzeeeleneoeseteuasasfifjfofrasgagdglgngugvhahehihohrhthuhyhzbymsinigYiikofisitiujajvkakgkikjkkklorknkokrkskukvkwkylalblglilnloltaslvmgmhasmkmlmnasidmtmyasnoasnengnlnonnasnvnyocasomasospaasplpsptqurmasberurwasscsdsesgsiskassmsnsoinsrasstsusvswtatetgthtitktltntotrtsttakofugukuruzvevivowawoxhyiyozazhzu"; switch (x % 4) { case 0: gen_send_verb(ctx, s, "en", 2); return; default: gen_send_verb(ctx, s, iso639_1 + 2 * (gen_random() % ((sizeof(iso639_1) - 1)/2)), 2); return; } } } if (!strcmp(s, "%[[URI]]%")) { switch (x % 2) { case 0: gen_send_verb(ctx, s, "http://www.example.com/schema/anyURI"); return; default: gen_uri(ctx, x, x % 32); return; } } if (!strcmp(s, "%[[QNAME]]%")) { switch (x % 2) { case 0: gen_send_verb(ctx, s, "xsd:string"); return; default: gen_qname(ctx, x, x % 32); return; } } if (!strncmp(s, "%[[TEXT", 7)) { if (s[7] == '[') { unsigned long n, m; if (get_range(s + 8, n, m)) { gen_text(ctx, x, n + x % (m - n + 1)); return; } } else if (s[7] == ']' && s[8] == ']' && s[9] == '%' && !s[10]) { ULONG64 n = x; switch (x % 6) { case 0: gen_text(ctx, x, 0); return; case 1: n %= 16; if (n > mmax) n = mmax; gen_text(ctx, x, n); return; case 2: n %= 256; if (n > mmax) n = mmax; gen_text(ctx, x, n); return; case 3: n %= 65536; if (n > mmax) n = mmax; gen_text(ctx, x, n); return; case 4: if (n > mmax) n = mmax; gen_text(ctx, x, n); return; default: gen_text(ctx, x, mmax); return; } } } if ((s[2] == '[' || s[2] == '(') && strchr(s, ':')) { // inclusive or exclusive numeric range %[[N:M]]% %[(N:M)]% %[(N:M]]% %[[N:M)]% char *r; double n = strtod(s + 3, &r); double m = n; char buf[16]; const char *format = ctx->double_format; if (r && *r == ':') m = strtod(r + 1, &r); if (r && *r == '%') { // get %D.F format string after the range: %[[N:M%D.F]]%, %[(N:M%D.F]]%, %[[N:M%D.F)]%, %[(N:M%D.F)]% size_t i = 0; for (; *r && *r != ')' && *r != ']' && i < sizeof(buf) - 1; ++r) buf[i++] = *r; buf[i] = '\0'; format = buf; } bool isint = !strchr(s, '.'); if (r && (r[0] == ']' || r[0] == ')') && r[1] == ']' && r[2] == '%' && !r[3] && ( (isint && s[2] == '(' && r[0] == ')' && n + 1 < m) || (isint && s[2] == '(' && r[0] == ']' && n < m) || (isint && s[2] == '[' && r[0] == ')' && n < m) || (isint && s[2] == '[' && r[0] == ']' && n <= m) || (!isint && n <= m) )) { double y; for (;;) { y = exp((double)x/(double)RAND_MAX * log(m - n)) + n; if (isint) y = round(y); if ((s[2] != '(' || y > n) && (r[0] != ')' || y < m)) break; x = gen_random(); } if (isint) (SOAP_SNPRINTF(ctx->tmpbuf, sizeof(ctx->tmpbuf), 24), SOAP_LONG_FORMAT, (LONG64)y); else (SOAP_SNPRINTF(ctx->tmpbuf, sizeof(ctx->tmpbuf), 24), format, y); gen_send_verb(ctx, s, ctx->tmpbuf); return; } } // regex %[['pattern']]% and %[['pattern'[N:M]]]% if (s[2] == '[' && s[3] == '\'') { const char *r; for (r = s + 4; *r; ++r) { if (r[0] == '\\' && r[1] != '\0') ++r; else if (r[0] == '\'' && (r[1] == '[' || r[1] == ']')) break; } if (*r) { std::string pattern(s + 4, r - s - 4); unsigned long n = 0, m = mmax; if (r[1] == '[') { if (get_range(r + 2, n, m)) { gen_pattern(ctx, pattern.c_str(), n, m); return; } } else { gen_pattern(ctx, pattern.c_str(), n, m); return; } } } // enumeration %[[A][B][C]]% if (s[2] == '[' && strstr(s, "][")) { size_t k = 1; const char *r = s + 1; while ((r = strstr(r + 2, "][")) != NULL) ++k; long y = x % k; r = s + 1; while (y-- > 0) r = strstr(r + 2, "]["); r += 2; const char *t = strstr(r, "]["); if (t) { k = t - r; } else { k = strlen(r); if (k >= 3) k -= 3; } gen_send_verb(ctx, s, r, k); return; } } gen_send(ctx, s); } static bool get_range(const char *s, unsigned long& n, unsigned long& m) { char *r; m = n = soap_strtoul(s, &r, 10); if (r && *r == ':') m = soap_strtoul(r + 1, &r, 10); if (m > mmax) { m = mmax; if (m < n) m = n; } return r && r[0] == ']' && r[1] == ']' && r[2] == ']' && r[3] == '%' && !r[4]; } static void gen_name(struct soap *ctx, ULONG64 x, ULONG64 n) { if (verb) printf("%%[[NAME]]%% " SOAP_ULONG_FORMAT " bytes\n", n); gen_ncname(ctx, x, n); } static void gen_qname(struct soap *ctx, ULONG64 x, ULONG64 n) { if (verb) printf("%%[[QNAME]]%% " SOAP_ULONG_FORMAT " bytes\n", n); ULONG64 m = n, k = n; if (n >= 4) { m = n/4; k = n - m; } gen_ncname(ctx, x, m); gen_send(ctx, ":"); gen_ncname(ctx, x, k); } static void gen_uri(struct soap *ctx, ULONG64 x, ULONG64 n) { if (verb) printf("%%[[URI]]%% " SOAP_ULONG_FORMAT " bytes\n", n); ULONG64 m = n, k = n; if (n >= 4) { m = n/4; k = n - m; } gen_send(ctx, "http://www."); gen_ncname(ctx, x, m); gen_send(ctx, ".com/"); gen_ncname(ctx, x, k); } static void gen_ncname(struct soap *ctx, ULONG64 x, ULONG64 n) { for (ULONG64 i = 0; i < n; ++i) { char c = (x ^ n ^ i) % 78 + 45; if (i == 0 && !isalpha(c)) c = 'A' + c % 26 + (c & 0x20); else if (!isalnum(c) && c != '-' && c != '_') c = 'A' + c % 26 + (c & 0x20); if (soap_send_raw(ctx, &c, 1)) { fprintf(stderr, "testmsgr: failed to send to %s\n", URL); soap_print_fault(ctx, stderr); exit(EXIT_FAILURE); } } } static void gen_lang(struct soap *ctx, ULONG64 x, ULONG64 n) { if (verb) printf("%%[[LANG]]%%\n"); for (ULONG64 i = 0; i < n; ++i) { char c = (x ^ n ^ i) % 26 + 'a'; if (soap_send_raw(ctx, &c, 1)) { fprintf(stderr, "testmsgr: failed to send to %s\n", URL); soap_print_fault(ctx, stderr); exit(EXIT_FAILURE); } } } static void gen_text(struct soap *ctx, ULONG64 x, ULONG64 n) { if (verb) printf("%%[[TEXT]]%% " SOAP_ULONG_FORMAT " bytes\n", n); if (uchr) { std::string s; for (ULONG64 i = 0; i < n; ++i) { unsigned int c = (x ^ n ^ i) % 0xFFD0 + 32; if (c >= 0xD800 && c <= 0xDFFF) c = 32; append_char(s, c); } gen_send(ctx, s.c_str()); } else { for (ULONG64 i = 0; i < n; ++i) { char c = (x ^ n ^ i) % 95 + 32; switch (c) { case '\'': gen_send(ctx, "'"); break; case '"': gen_send(ctx, """); break; case '&': gen_send(ctx, "&"); break; case '<': gen_send(ctx, "<"); break; case '>': gen_send(ctx, ">"); break; default: if (soap_send_raw(ctx, &c, 1)) { fprintf(stderr, "testmsgr: failed to send to %s\n", URL); soap_print_fault(ctx, stderr); exit(EXIT_FAILURE); } } } } } static void gen_hex(struct soap *ctx, ULONG64 x, ULONG64 n) { if (verb) printf("%%[[HEX]]%% " SOAP_ULONG_FORMAT " bytes\n", n); n /= 2; for (ULONG64 i = 0; i < n; ++i) { int c = (x ^ n ^ i) % 256; char h[2]; h[0] = ((c >> 4) & 0xF) + '0'; if (c > 0x9F) h[0] += 7; h[1] = (c & 0xF) + '0'; if ((c & 0xF) > 9) h[1] += 7; if (soap_send_raw(ctx, h, 2)) { fprintf(stderr, "testmsgr: failed to send to %s\n", URL); soap_print_fault(ctx, stderr); exit(EXIT_FAILURE); } } } static void gen_base64(struct soap *ctx, ULONG64 x, ULONG64 n) { if (verb) printf("%%[[BASE64]]%% " SOAP_ULONG_FORMAT " bytes\n", n); unsigned long m; char b[4]; for (ULONG64 i = 0; i < n; i += 3) { int c = (x ^ n ^ i) & 0xFFFFFF; m = (c >> 16) & 0xFF; m = (m << 8) | ((c >> 8) & 0xFF); m = (m << 8) | (c & 0xFF); for (int j = 4; j > 0; m >>= 6) b[--j] = soap_base64o[m & 0x3F]; if (soap_send_raw(ctx, b, 4)) { fprintf(stderr, "testmsgr: failed to send to %s\n", URL); soap_print_fault(ctx, stderr); exit(EXIT_FAILURE); } } n %= 3; if (n > 0) { int c = n & 0xFFFFFF; m = c & 0xFF; m <<= 8; if (n > 1) m |= (c >> 8) & 0xFF; m <<= 8; for (int j = (int)n; j > 0; m >>= 6) b[--j] = soap_base64o[m & 0x3F]; for (int j = 3; j > (int)n; j--) b[j] = '='; if (soap_send_raw(ctx, b, 4)) { fprintf(stderr, "testmsgr: failed to send to %s\n", URL); soap_print_fault(ctx, stderr); exit(EXIT_FAILURE); } } } static void gen_id(struct soap *ctx) { if (verb) printf("%%[[ID]]%%\n"); soap_send(ctx, "id"); soap_send(ctx, soap_ULONG642s(ctx, ++idnum)); } static void gen_idref(struct soap *ctx) { if (verb) printf("%%[[IDREF]]%%\n"); if (idref < idnum || idref < cidnum) ++idref; soap_send(ctx, "id"); soap_send(ctx, soap_ULONG642s(ctx, idref)); } static void gen_pattern(struct soap *ctx, const char *pattern, ULONG64 n, ULONG64 m) { if (verb) printf("%%[['%s']]%%\n", pattern); ULONG64 l = m, k; for (k = 0; l; l >>= 1) ++k; l = 1; for (; k > 1; --k) l <<= 1; k = l >> 1; --l; std::string s; for (; k; k >>= 1) { const char *p = pattern; s = get_reg(&p, l); if (s.size() < n) l += k; else if (s.size() > m) l -= k; else break; } for (const char *t = s.c_str(); *t; ++t) { switch (*t) { case '\t': gen_send(ctx, " "); break; case '\'': gen_send(ctx, "'"); break; case '"': gen_send(ctx, """); break; case '&': gen_send(ctx, "&"); break; case '<': gen_send(ctx, "<"); break; case '>': gen_send(ctx, ">"); break; default: if (soap_send_raw(ctx, t, 1)) { fprintf(stderr, "testmsgr: failed to send to %s\n", URL); soap_print_fault(ctx, stderr); exit(EXIT_FAILURE); } } } } static std::string get_reg(const char **pattern, ULONG64 l) { std::vector v; while (1) { v.push_back(get_seq(pattern, l)); if (**pattern != '|') break; ++*pattern; } return v[gen_random() % v.size()]; } static std::string get_seq(const char **pattern, ULONG64 l) { std::string s; while (**pattern && **pattern != '|' && **pattern != ')') s.append(get_rep(pattern, l)); return s; } static std::string get_rep(const char **pattern, ULONG64 l) { unsigned long n, m; char *r = NULL; const char *p = *pattern; std::string s = get_sym(pattern, l); switch (**pattern) { case '?': ++*pattern; if (gen_random() % 2) s.clear(); break; case '*': ++*pattern; if (gen_random() % 2) s.clear(); for (unsigned long i = gen_random() % l + 1; i < l; ++i) { const char *t = p; s.append(get_sym(&t, l)); } break; case '+': ++*pattern; for (unsigned long i = gen_random() % l + 1; i < l; ++i) { const char *t = p; s.append(get_sym(&t, l)); } break; case '{': n = m = strtoul(*pattern + 1, &r, 10); if (r && *r == ',') { ++r; if (*r == '}') m = n < lmax ? lmax : n; else m = strtoul(r, &r, 10); } if (r && *r == '}') { *pattern = r + 1; for (unsigned long i = n < m ? gen_random() % (m - n) + 1 : 1; i < m; ++i) { const char *t = p; s.append(get_sym(&t, l)); } } break; default: break; } return s; } static std::string get_sym(const char **pattern, ULONG64 l) { std::string s; if (**pattern == '(') { ++*pattern; s = get_reg(pattern, l); if (**pattern == ')') ++*pattern; } else if (**pattern == '.' || **pattern == '[' || **pattern == '\\') { charset cs; get_charset(pattern, cs); if (cs.count()) { long n = gen_random() % cs.count(); for (unsigned int c = 0; c < (unsigned int)cs.size(); ++c) { if (cs.test(c) && n-- == 0) { append_char(s, c); break; } } } } else { append_char(s, get_char(pattern)); } return s; } static bool get_charset(const char **pattern, charset& cs) { bool iscat = false; bool isneg = false; unsigned int h = 0; switch (**pattern) { case '\0': break; case '.': ++*pattern; set_chars(cs, 0, 31); if (uchr) set_chars(cs, 0xD800, 0xDFFF); else set_chars(cs, 0x80, 0x10FFFF); cs.flip(); iscat = true; break; case '[': ++*pattern; if (**pattern == '^') { isneg = true; ++*pattern; } do { if (**pattern == '[' || **pattern == '\\') { get_charset(pattern, cs); h = 0; } else if (h != 0 && **pattern == '-') { ++*pattern; set_chars(cs, h, get_char(pattern)); h = 0; } else if (**pattern != '\0') { h = get_char(pattern); cs.set(h); } } while (**pattern && **pattern != ']'); if (isneg) { set_chars(cs, 0, 31); if (!uchr) set_chars(cs, 0x80, 0x10FFFF); cs.flip(); } if (**pattern == ']') ++*pattern; iscat = true; break; case '\\': ++*pattern; switch (**pattern) { case 'c': cs.set('-'); cs.set('.'); set_chars(cs, '0', '9'); cs.set(':'); set_chars(cs, 'A', 'Z'); cs.set('_'); set_chars(cs, 'a', 'z'); if (uchr) { cs.set(0xB7); set_chars(cs, 0xC0, 0xD6); set_chars(cs, 0xD8, 0xF6); set_chars(cs, 0xF8, 0x37D); set_chars(cs, 0x37F, 0x1FFF); set_chars(cs, 0x200C, 0x200D); set_chars(cs, 0x203F, 0x2040); set_chars(cs, 0x2070, 0x218F); set_chars(cs, 0x2C00, 0x2FEF); set_chars(cs, 0x3001, 0xD7FF); set_chars(cs, 0xF900, 0xFDCF); set_chars(cs, 0xFDF0, 0xFFFD); set_chars(cs, 0x10000, 0xEFFFF); } iscat = true; break; case 'C': cs.set('-'); cs.set('.'); set_chars(cs, '0', '9'); cs.set(':'); set_chars(cs, 'A', 'Z'); cs.set('_'); set_chars(cs, 'a', 'z'); if (uchr) { cs.set(0xB7); set_chars(cs, 0xC0, 0xD6); set_chars(cs, 0xD8, 0xF6); set_chars(cs, 0xF8, 0x37D); set_chars(cs, 0x37F, 0x1FFF); set_chars(cs, 0x200C, 0x200D); set_chars(cs, 0x203F, 0x2040); set_chars(cs, 0x2070, 0x218F); set_chars(cs, 0x2C00, 0x2FEF); set_chars(cs, 0x3001, 0xD7FF); set_chars(cs, 0xF900, 0xFDCF); set_chars(cs, 0xFDF0, 0xFFFD); set_chars(cs, 0x10000, 0xEFFFF); } else { set_chars(cs, 0x80, 0x10FFFF); } cs.flip(); iscat = true; break; case 'd': set_chars(cs, '0', '9'); iscat = true; break; case 'D': set_chars(cs, '0', '9'); cs.flip(); iscat = true; break; case 'i': cs.set(':'); set_chars(cs, 'A', 'Z'); cs.set('_'); set_chars(cs, 'a', 'z'); if (uchr) { set_chars(cs, 0xC0, 0xD6); set_chars(cs, 0xD8, 0xF6); set_chars(cs, 0xF8, 0x2FF); set_chars(cs, 0x370, 0x37D); set_chars(cs, 0x37F, 0x1FFF); set_chars(cs, 0x200C, 0x200D); set_chars(cs, 0x2070, 0x218F); set_chars(cs, 0x2C00, 0x2FEF); set_chars(cs, 0x3001, 0xD7FF); set_chars(cs, 0xF900, 0xFDCF); set_chars(cs, 0xFDF0, 0xFFFD); set_chars(cs, 0x10000, 0xEFFFF); } iscat = true; break; case 'I': cs.set(':'); set_chars(cs, 'A', 'Z'); cs.set('_'); set_chars(cs, 'a', 'z'); if (uchr) { set_chars(cs, 0xC0, 0xD6); set_chars(cs, 0xD8, 0xF6); set_chars(cs, 0xF8, 0x2FF); set_chars(cs, 0x370, 0x37D); set_chars(cs, 0x37F, 0x1FFF); set_chars(cs, 0x200C, 0x200D); set_chars(cs, 0x2070, 0x218F); set_chars(cs, 0x2C00, 0x2FEF); set_chars(cs, 0x3001, 0xD7FF); set_chars(cs, 0xF900, 0xFDCF); set_chars(cs, 0xFDF0, 0xFFFD); set_chars(cs, 0x10000, 0xEFFFF); } else { set_chars(cs, 0x80, 0x10FFFF); } cs.flip(); iscat = true; break; case 'n': cs.set('\n'); break; case 'p': // TODO not supported yet break; case 'P': // TODO not supported yet break; case 'r': cs.set('\r'); break; case 's': cs.set(' '); cs.set('\t'); cs.set('\n'); cs.set('\r'); iscat = true; break; case 'S': cs.set(' '); cs.set('\t'); cs.set('\n'); cs.set('\r'); cs.flip(); iscat = true; break; case 't': cs.set('\t'); break; case 'w': set_chars(cs, '0', '9'); set_chars(cs, 'A', 'Z'); cs.set('_'); set_chars(cs, 'a', 'z'); if (uchr) { set_chars(cs, 48, 57); set_chars(cs, 65, 90); set_chars(cs, 95, 95); set_chars(cs, 97, 122); set_chars(cs, 170, 170); set_chars(cs, 181, 181); set_chars(cs, 186, 186); set_chars(cs, 192, 214); set_chars(cs, 216, 246); set_chars(cs, 248, 705); set_chars(cs, 710, 721); set_chars(cs, 736, 740); set_chars(cs, 748, 748); set_chars(cs, 750, 750); set_chars(cs, 880, 884); set_chars(cs, 886, 887); set_chars(cs, 890, 893); set_chars(cs, 895, 895); set_chars(cs, 902, 902); set_chars(cs, 904, 906); set_chars(cs, 908, 908); set_chars(cs, 910, 929); set_chars(cs, 931, 1013); set_chars(cs, 1015, 1153); set_chars(cs, 1162, 1327); set_chars(cs, 1329, 1366); set_chars(cs, 1369, 1369); set_chars(cs, 1377, 1415); set_chars(cs, 1488, 1514); set_chars(cs, 1520, 1522); set_chars(cs, 1568, 1610); set_chars(cs, 1632, 1641); set_chars(cs, 1646, 1647); set_chars(cs, 1649, 1747); set_chars(cs, 1749, 1749); set_chars(cs, 1765, 1766); set_chars(cs, 1774, 1788); set_chars(cs, 1791, 1791); set_chars(cs, 1808, 1808); set_chars(cs, 1810, 1839); set_chars(cs, 1869, 1957); set_chars(cs, 1969, 1969); set_chars(cs, 1984, 2026); set_chars(cs, 2036, 2037); set_chars(cs, 2042, 2042); set_chars(cs, 2048, 2069); set_chars(cs, 2074, 2074); set_chars(cs, 2084, 2084); set_chars(cs, 2088, 2088); set_chars(cs, 2112, 2136); set_chars(cs, 2208, 2226); set_chars(cs, 2308, 2361); set_chars(cs, 2365, 2365); set_chars(cs, 2384, 2384); set_chars(cs, 2392, 2401); set_chars(cs, 2406, 2415); set_chars(cs, 2417, 2432); set_chars(cs, 2437, 2444); set_chars(cs, 2447, 2448); set_chars(cs, 2451, 2472); set_chars(cs, 2474, 2480); set_chars(cs, 2482, 2482); set_chars(cs, 2486, 2489); set_chars(cs, 2493, 2493); set_chars(cs, 2510, 2510); set_chars(cs, 2524, 2525); set_chars(cs, 2527, 2529); set_chars(cs, 2534, 2545); set_chars(cs, 2565, 2570); set_chars(cs, 2575, 2576); set_chars(cs, 2579, 2600); set_chars(cs, 2602, 2608); set_chars(cs, 2610, 2611); set_chars(cs, 2613, 2614); set_chars(cs, 2616, 2617); set_chars(cs, 2649, 2652); set_chars(cs, 2654, 2654); set_chars(cs, 2662, 2671); set_chars(cs, 2674, 2676); set_chars(cs, 2693, 2701); set_chars(cs, 2703, 2705); set_chars(cs, 2707, 2728); set_chars(cs, 2730, 2736); set_chars(cs, 2738, 2739); set_chars(cs, 2741, 2745); set_chars(cs, 2749, 2749); set_chars(cs, 2768, 2768); set_chars(cs, 2784, 2785); set_chars(cs, 2790, 2799); set_chars(cs, 2821, 2828); set_chars(cs, 2831, 2832); set_chars(cs, 2835, 2856); set_chars(cs, 2858, 2864); set_chars(cs, 2866, 2867); set_chars(cs, 2869, 2873); set_chars(cs, 2877, 2877); set_chars(cs, 2908, 2909); set_chars(cs, 2911, 2913); set_chars(cs, 2918, 2927); set_chars(cs, 2929, 2929); set_chars(cs, 2947, 2947); set_chars(cs, 2949, 2954); set_chars(cs, 2958, 2960); set_chars(cs, 2962, 2965); set_chars(cs, 2969, 2970); set_chars(cs, 2972, 2972); set_chars(cs, 2974, 2975); set_chars(cs, 2979, 2980); set_chars(cs, 2984, 2986); set_chars(cs, 2990, 3001); set_chars(cs, 3024, 3024); set_chars(cs, 3046, 3055); set_chars(cs, 3077, 3084); set_chars(cs, 3086, 3088); set_chars(cs, 3090, 3112); set_chars(cs, 3114, 3129); set_chars(cs, 3133, 3133); set_chars(cs, 3160, 3161); set_chars(cs, 3168, 3169); set_chars(cs, 3174, 3183); set_chars(cs, 3205, 3212); set_chars(cs, 3214, 3216); set_chars(cs, 3218, 3240); set_chars(cs, 3242, 3251); set_chars(cs, 3253, 3257); set_chars(cs, 3261, 3261); set_chars(cs, 3294, 3294); set_chars(cs, 3296, 3297); set_chars(cs, 3302, 3311); set_chars(cs, 3313, 3314); set_chars(cs, 3333, 3340); set_chars(cs, 3342, 3344); set_chars(cs, 3346, 3386); set_chars(cs, 3389, 3389); set_chars(cs, 3406, 3406); set_chars(cs, 3424, 3425); set_chars(cs, 3430, 3439); set_chars(cs, 3450, 3455); set_chars(cs, 3461, 3478); set_chars(cs, 3482, 3505); set_chars(cs, 3507, 3515); set_chars(cs, 3517, 3517); set_chars(cs, 3520, 3526); set_chars(cs, 3558, 3567); set_chars(cs, 3585, 3632); set_chars(cs, 3634, 3635); set_chars(cs, 3648, 3654); set_chars(cs, 3664, 3673); set_chars(cs, 3713, 3714); set_chars(cs, 3716, 3716); set_chars(cs, 3719, 3720); set_chars(cs, 3722, 3722); set_chars(cs, 3725, 3725); set_chars(cs, 3732, 3735); set_chars(cs, 3737, 3743); set_chars(cs, 3745, 3747); set_chars(cs, 3749, 3749); set_chars(cs, 3751, 3751); set_chars(cs, 3754, 3755); set_chars(cs, 3757, 3760); set_chars(cs, 3762, 3763); set_chars(cs, 3773, 3773); set_chars(cs, 3776, 3780); set_chars(cs, 3782, 3782); set_chars(cs, 3792, 3801); set_chars(cs, 3804, 3807); set_chars(cs, 3840, 3840); set_chars(cs, 3872, 3881); set_chars(cs, 3904, 3911); set_chars(cs, 3913, 3948); set_chars(cs, 3976, 3980); set_chars(cs, 4096, 4138); set_chars(cs, 4159, 4169); set_chars(cs, 4176, 4181); set_chars(cs, 4186, 4189); set_chars(cs, 4193, 4193); set_chars(cs, 4197, 4198); set_chars(cs, 4206, 4208); set_chars(cs, 4213, 4225); set_chars(cs, 4238, 4238); set_chars(cs, 4240, 4249); set_chars(cs, 4256, 4293); set_chars(cs, 4295, 4295); set_chars(cs, 4301, 4301); set_chars(cs, 4304, 4346); set_chars(cs, 4348, 4680); set_chars(cs, 4682, 4685); set_chars(cs, 4688, 4694); set_chars(cs, 4696, 4696); set_chars(cs, 4698, 4701); set_chars(cs, 4704, 4744); set_chars(cs, 4746, 4749); set_chars(cs, 4752, 4784); set_chars(cs, 4786, 4789); set_chars(cs, 4792, 4798); set_chars(cs, 4800, 4800); set_chars(cs, 4802, 4805); set_chars(cs, 4808, 4822); set_chars(cs, 4824, 4880); set_chars(cs, 4882, 4885); set_chars(cs, 4888, 4954); set_chars(cs, 4992, 5007); set_chars(cs, 5024, 5108); set_chars(cs, 5121, 5740); set_chars(cs, 5743, 5759); set_chars(cs, 5761, 5786); set_chars(cs, 5792, 5866); set_chars(cs, 5873, 5880); set_chars(cs, 5888, 5900); set_chars(cs, 5902, 5905); set_chars(cs, 5920, 5937); set_chars(cs, 5952, 5969); set_chars(cs, 5984, 5996); set_chars(cs, 5998, 6000); set_chars(cs, 6016, 6067); set_chars(cs, 6103, 6103); set_chars(cs, 6108, 6108); set_chars(cs, 6112, 6121); set_chars(cs, 6160, 6169); set_chars(cs, 6176, 6263); set_chars(cs, 6272, 6312); set_chars(cs, 6314, 6314); set_chars(cs, 6320, 6389); set_chars(cs, 6400, 6430); set_chars(cs, 6470, 6509); set_chars(cs, 6512, 6516); set_chars(cs, 6528, 6571); set_chars(cs, 6593, 6599); set_chars(cs, 6608, 6617); set_chars(cs, 6656, 6678); set_chars(cs, 6688, 6740); set_chars(cs, 6784, 6793); set_chars(cs, 6800, 6809); set_chars(cs, 6823, 6823); set_chars(cs, 6917, 6963); set_chars(cs, 6981, 6987); set_chars(cs, 6992, 7001); set_chars(cs, 7043, 7072); set_chars(cs, 7086, 7141); set_chars(cs, 7168, 7203); set_chars(cs, 7232, 7241); set_chars(cs, 7245, 7293); set_chars(cs, 7401, 7404); set_chars(cs, 7406, 7409); set_chars(cs, 7413, 7414); set_chars(cs, 7424, 7615); set_chars(cs, 7680, 7957); set_chars(cs, 7960, 7965); set_chars(cs, 7968, 8005); set_chars(cs, 8008, 8013); set_chars(cs, 8016, 8023); set_chars(cs, 8025, 8025); set_chars(cs, 8027, 8027); set_chars(cs, 8029, 8029); set_chars(cs, 8031, 8061); set_chars(cs, 8064, 8116); set_chars(cs, 8118, 8124); set_chars(cs, 8126, 8126); set_chars(cs, 8130, 8132); set_chars(cs, 8134, 8140); set_chars(cs, 8144, 8147); set_chars(cs, 8150, 8155); set_chars(cs, 8160, 8172); set_chars(cs, 8178, 8180); set_chars(cs, 8182, 8188); set_chars(cs, 8255, 8256); set_chars(cs, 8276, 8276); set_chars(cs, 8305, 8305); set_chars(cs, 8319, 8319); set_chars(cs, 8336, 8348); set_chars(cs, 8450, 8450); set_chars(cs, 8455, 8455); set_chars(cs, 8458, 8467); set_chars(cs, 8469, 8469); set_chars(cs, 8473, 8477); set_chars(cs, 8484, 8484); set_chars(cs, 8486, 8486); set_chars(cs, 8488, 8488); set_chars(cs, 8490, 8493); set_chars(cs, 8495, 8505); set_chars(cs, 8508, 8511); set_chars(cs, 8517, 8521); set_chars(cs, 8526, 8526); set_chars(cs, 8579, 8580); set_chars(cs, 11264, 11310); set_chars(cs, 11312, 11358); set_chars(cs, 11360, 11492); set_chars(cs, 11499, 11502); set_chars(cs, 11506, 11507); set_chars(cs, 11520, 11557); set_chars(cs, 11559, 11559); set_chars(cs, 11565, 11565); set_chars(cs, 11568, 11623); set_chars(cs, 11631, 11631); set_chars(cs, 11648, 11670); set_chars(cs, 11680, 11686); set_chars(cs, 11688, 11694); set_chars(cs, 11696, 11702); set_chars(cs, 11704, 11710); set_chars(cs, 11712, 11718); set_chars(cs, 11720, 11726); set_chars(cs, 11728, 11734); set_chars(cs, 11736, 11742); set_chars(cs, 11823, 11823); set_chars(cs, 12293, 12294); set_chars(cs, 12337, 12341); set_chars(cs, 12347, 12348); set_chars(cs, 12353, 12438); set_chars(cs, 12445, 12447); set_chars(cs, 12449, 12538); set_chars(cs, 12540, 12543); set_chars(cs, 12549, 12589); set_chars(cs, 12593, 12686); set_chars(cs, 12704, 12730); set_chars(cs, 12784, 12799); set_chars(cs, 13312, 19893); set_chars(cs, 19968, 40908); set_chars(cs, 40960, 42124); set_chars(cs, 42192, 42237); set_chars(cs, 42240, 42508); set_chars(cs, 42512, 42539); set_chars(cs, 42560, 42606); set_chars(cs, 42623, 42653); set_chars(cs, 42656, 42725); set_chars(cs, 42775, 42783); set_chars(cs, 42786, 42888); set_chars(cs, 42891, 42894); set_chars(cs, 42896, 42925); set_chars(cs, 42928, 42929); set_chars(cs, 42999, 43009); set_chars(cs, 43011, 43013); set_chars(cs, 43015, 43018); set_chars(cs, 43020, 43042); set_chars(cs, 43072, 43123); set_chars(cs, 43138, 43187); set_chars(cs, 43216, 43225); set_chars(cs, 43250, 43255); set_chars(cs, 43259, 43259); set_chars(cs, 43264, 43301); set_chars(cs, 43312, 43334); set_chars(cs, 43360, 43388); set_chars(cs, 43396, 43442); set_chars(cs, 43471, 43481); set_chars(cs, 43488, 43492); set_chars(cs, 43494, 43518); set_chars(cs, 43520, 43560); set_chars(cs, 43584, 43586); set_chars(cs, 43588, 43595); set_chars(cs, 43600, 43609); set_chars(cs, 43616, 43638); set_chars(cs, 43642, 43642); set_chars(cs, 43646, 43695); set_chars(cs, 43697, 43697); set_chars(cs, 43701, 43702); set_chars(cs, 43705, 43709); set_chars(cs, 43712, 43712); set_chars(cs, 43714, 43714); set_chars(cs, 43739, 43741); set_chars(cs, 43744, 43754); set_chars(cs, 43762, 43764); set_chars(cs, 43777, 43782); set_chars(cs, 43785, 43790); set_chars(cs, 43793, 43798); set_chars(cs, 43808, 43814); set_chars(cs, 43816, 43822); set_chars(cs, 43824, 43866); set_chars(cs, 43868, 43871); set_chars(cs, 43876, 43877); set_chars(cs, 43968, 44002); set_chars(cs, 44016, 44025); set_chars(cs, 44032, 55203); set_chars(cs, 55216, 55238); set_chars(cs, 55243, 55291); set_chars(cs, 63744, 64109); set_chars(cs, 64112, 64217); set_chars(cs, 64256, 64262); set_chars(cs, 64275, 64279); set_chars(cs, 64285, 64285); set_chars(cs, 64287, 64296); set_chars(cs, 64298, 64310); set_chars(cs, 64312, 64316); set_chars(cs, 64318, 64318); set_chars(cs, 64320, 64321); set_chars(cs, 64323, 64324); set_chars(cs, 64326, 64433); set_chars(cs, 64467, 64829); set_chars(cs, 64848, 64911); set_chars(cs, 64914, 64967); set_chars(cs, 65008, 65019); set_chars(cs, 65075, 65076); set_chars(cs, 65101, 65103); set_chars(cs, 65136, 65140); set_chars(cs, 65142, 65276); set_chars(cs, 65296, 65305); set_chars(cs, 65313, 65338); set_chars(cs, 65343, 65343); set_chars(cs, 65345, 65370); set_chars(cs, 65382, 65470); set_chars(cs, 65474, 65479); set_chars(cs, 65482, 65487); set_chars(cs, 65490, 65495); set_chars(cs, 65498, 65500); set_chars(cs, 65536, 65547); set_chars(cs, 65549, 65574); set_chars(cs, 65576, 65594); set_chars(cs, 65596, 65597); set_chars(cs, 65599, 65613); set_chars(cs, 65616, 65629); set_chars(cs, 65664, 65786); set_chars(cs, 66176, 66204); set_chars(cs, 66208, 66256); set_chars(cs, 66304, 66335); set_chars(cs, 66352, 66368); set_chars(cs, 66370, 66377); set_chars(cs, 66384, 66421); set_chars(cs, 66432, 66461); set_chars(cs, 66464, 66499); set_chars(cs, 66504, 66511); set_chars(cs, 66560, 66717); set_chars(cs, 66720, 66729); set_chars(cs, 66816, 66855); set_chars(cs, 66864, 66915); set_chars(cs, 67072, 67382); set_chars(cs, 67392, 67413); set_chars(cs, 67424, 67431); set_chars(cs, 67584, 67589); set_chars(cs, 67592, 67592); set_chars(cs, 67594, 67637); set_chars(cs, 67639, 67640); set_chars(cs, 67644, 67644); set_chars(cs, 67647, 67669); set_chars(cs, 67680, 67702); set_chars(cs, 67712, 67742); set_chars(cs, 67840, 67861); set_chars(cs, 67872, 67897); set_chars(cs, 67968, 68023); set_chars(cs, 68030, 68031); set_chars(cs, 68096, 68096); set_chars(cs, 68112, 68115); set_chars(cs, 68117, 68119); set_chars(cs, 68121, 68147); set_chars(cs, 68192, 68220); set_chars(cs, 68224, 68252); set_chars(cs, 68288, 68295); set_chars(cs, 68297, 68324); set_chars(cs, 68352, 68405); set_chars(cs, 68416, 68437); set_chars(cs, 68448, 68466); set_chars(cs, 68480, 68497); set_chars(cs, 68608, 68680); set_chars(cs, 69635, 69687); set_chars(cs, 69734, 69743); set_chars(cs, 69763, 69807); set_chars(cs, 69840, 69864); set_chars(cs, 69872, 69881); set_chars(cs, 69891, 69926); set_chars(cs, 69942, 69951); set_chars(cs, 69968, 70002); set_chars(cs, 70006, 70006); set_chars(cs, 70019, 70066); set_chars(cs, 70081, 70084); set_chars(cs, 70096, 70106); set_chars(cs, 70144, 70161); set_chars(cs, 70163, 70187); set_chars(cs, 70320, 70366); set_chars(cs, 70384, 70393); set_chars(cs, 70405, 70412); set_chars(cs, 70415, 70416); set_chars(cs, 70419, 70440); set_chars(cs, 70442, 70448); set_chars(cs, 70450, 70451); set_chars(cs, 70453, 70457); set_chars(cs, 70461, 70461); set_chars(cs, 70493, 70497); set_chars(cs, 70784, 70831); set_chars(cs, 70852, 70853); set_chars(cs, 70855, 70855); set_chars(cs, 70864, 70873); set_chars(cs, 71040, 71086); set_chars(cs, 71168, 71215); set_chars(cs, 71236, 71236); set_chars(cs, 71248, 71257); set_chars(cs, 71296, 71338); set_chars(cs, 71360, 71369); set_chars(cs, 71840, 71913); set_chars(cs, 71935, 71935); set_chars(cs, 72384, 72440); set_chars(cs, 73728, 74648); set_chars(cs, 77824, 78894); set_chars(cs, 92160, 92728); set_chars(cs, 92736, 92766); set_chars(cs, 92768, 92777); set_chars(cs, 92880, 92909); set_chars(cs, 92928, 92975); set_chars(cs, 92992, 92995); set_chars(cs, 93008, 93017); set_chars(cs, 93027, 93047); set_chars(cs, 93053, 93071); set_chars(cs, 93952, 94020); set_chars(cs, 94032, 94032); set_chars(cs, 94099, 94111); set_chars(cs, 110592, 110593); set_chars(cs, 113664, 113770); set_chars(cs, 113776, 113788); set_chars(cs, 113792, 113800); set_chars(cs, 113808, 113817); set_chars(cs, 119808, 119892); set_chars(cs, 119894, 119964); set_chars(cs, 119966, 119967); set_chars(cs, 119970, 119970); set_chars(cs, 119973, 119974); set_chars(cs, 119977, 119980); set_chars(cs, 119982, 119993); set_chars(cs, 119995, 119995); set_chars(cs, 119997, 120003); set_chars(cs, 120005, 120069); set_chars(cs, 120071, 120074); set_chars(cs, 120077, 120084); set_chars(cs, 120086, 120092); set_chars(cs, 120094, 120121); set_chars(cs, 120123, 120126); set_chars(cs, 120128, 120132); set_chars(cs, 120134, 120134); set_chars(cs, 120138, 120144); set_chars(cs, 120146, 120485); set_chars(cs, 120488, 120512); set_chars(cs, 120514, 120538); set_chars(cs, 120540, 120570); set_chars(cs, 120572, 120596); set_chars(cs, 120598, 120628); set_chars(cs, 120630, 120654); set_chars(cs, 120656, 120686); set_chars(cs, 120688, 120712); set_chars(cs, 120714, 120744); set_chars(cs, 120746, 120770); set_chars(cs, 120772, 120779); set_chars(cs, 120782, 120831); set_chars(cs, 124928, 125124); set_chars(cs, 126464, 126467); set_chars(cs, 126469, 126495); set_chars(cs, 126497, 126498); set_chars(cs, 126500, 126500); set_chars(cs, 126503, 126503); set_chars(cs, 126505, 126514); set_chars(cs, 126516, 126519); set_chars(cs, 126521, 126521); set_chars(cs, 126523, 126523); set_chars(cs, 126530, 126530); set_chars(cs, 126535, 126535); set_chars(cs, 126537, 126537); set_chars(cs, 126539, 126539); set_chars(cs, 126541, 126543); set_chars(cs, 126545, 126546); set_chars(cs, 126548, 126548); set_chars(cs, 126551, 126551); set_chars(cs, 126553, 126553); set_chars(cs, 126555, 126555); set_chars(cs, 126557, 126557); set_chars(cs, 126559, 126559); set_chars(cs, 126561, 126562); set_chars(cs, 126564, 126564); set_chars(cs, 126567, 126570); set_chars(cs, 126572, 126578); set_chars(cs, 126580, 126583); set_chars(cs, 126585, 126588); set_chars(cs, 126590, 126590); set_chars(cs, 126592, 126601); set_chars(cs, 126603, 126619); set_chars(cs, 126625, 126627); set_chars(cs, 126629, 126633); set_chars(cs, 126635, 126651); set_chars(cs, 131072, 173782); set_chars(cs, 173824, 177972); set_chars(cs, 177984, 178205); set_chars(cs, 194560, 195101); } iscat = true; break; case 'W': set_chars(cs, '0', '9'); set_chars(cs, 'A', 'Z'); cs.set('_'); set_chars(cs, 'a', 'z'); if (uchr) { set_chars(cs, 48, 57); set_chars(cs, 65, 90); set_chars(cs, 95, 95); set_chars(cs, 97, 122); set_chars(cs, 170, 170); set_chars(cs, 181, 181); set_chars(cs, 186, 186); set_chars(cs, 192, 214); set_chars(cs, 216, 246); set_chars(cs, 248, 705); set_chars(cs, 710, 721); set_chars(cs, 736, 740); set_chars(cs, 748, 748); set_chars(cs, 750, 750); set_chars(cs, 880, 884); set_chars(cs, 886, 887); set_chars(cs, 890, 893); set_chars(cs, 895, 895); set_chars(cs, 902, 902); set_chars(cs, 904, 906); set_chars(cs, 908, 908); set_chars(cs, 910, 929); set_chars(cs, 931, 1013); set_chars(cs, 1015, 1153); set_chars(cs, 1162, 1327); set_chars(cs, 1329, 1366); set_chars(cs, 1369, 1369); set_chars(cs, 1377, 1415); set_chars(cs, 1488, 1514); set_chars(cs, 1520, 1522); set_chars(cs, 1568, 1610); set_chars(cs, 1632, 1641); set_chars(cs, 1646, 1647); set_chars(cs, 1649, 1747); set_chars(cs, 1749, 1749); set_chars(cs, 1765, 1766); set_chars(cs, 1774, 1788); set_chars(cs, 1791, 1791); set_chars(cs, 1808, 1808); set_chars(cs, 1810, 1839); set_chars(cs, 1869, 1957); set_chars(cs, 1969, 1969); set_chars(cs, 1984, 2026); set_chars(cs, 2036, 2037); set_chars(cs, 2042, 2042); set_chars(cs, 2048, 2069); set_chars(cs, 2074, 2074); set_chars(cs, 2084, 2084); set_chars(cs, 2088, 2088); set_chars(cs, 2112, 2136); set_chars(cs, 2208, 2226); set_chars(cs, 2308, 2361); set_chars(cs, 2365, 2365); set_chars(cs, 2384, 2384); set_chars(cs, 2392, 2401); set_chars(cs, 2406, 2415); set_chars(cs, 2417, 2432); set_chars(cs, 2437, 2444); set_chars(cs, 2447, 2448); set_chars(cs, 2451, 2472); set_chars(cs, 2474, 2480); set_chars(cs, 2482, 2482); set_chars(cs, 2486, 2489); set_chars(cs, 2493, 2493); set_chars(cs, 2510, 2510); set_chars(cs, 2524, 2525); set_chars(cs, 2527, 2529); set_chars(cs, 2534, 2545); set_chars(cs, 2565, 2570); set_chars(cs, 2575, 2576); set_chars(cs, 2579, 2600); set_chars(cs, 2602, 2608); set_chars(cs, 2610, 2611); set_chars(cs, 2613, 2614); set_chars(cs, 2616, 2617); set_chars(cs, 2649, 2652); set_chars(cs, 2654, 2654); set_chars(cs, 2662, 2671); set_chars(cs, 2674, 2676); set_chars(cs, 2693, 2701); set_chars(cs, 2703, 2705); set_chars(cs, 2707, 2728); set_chars(cs, 2730, 2736); set_chars(cs, 2738, 2739); set_chars(cs, 2741, 2745); set_chars(cs, 2749, 2749); set_chars(cs, 2768, 2768); set_chars(cs, 2784, 2785); set_chars(cs, 2790, 2799); set_chars(cs, 2821, 2828); set_chars(cs, 2831, 2832); set_chars(cs, 2835, 2856); set_chars(cs, 2858, 2864); set_chars(cs, 2866, 2867); set_chars(cs, 2869, 2873); set_chars(cs, 2877, 2877); set_chars(cs, 2908, 2909); set_chars(cs, 2911, 2913); set_chars(cs, 2918, 2927); set_chars(cs, 2929, 2929); set_chars(cs, 2947, 2947); set_chars(cs, 2949, 2954); set_chars(cs, 2958, 2960); set_chars(cs, 2962, 2965); set_chars(cs, 2969, 2970); set_chars(cs, 2972, 2972); set_chars(cs, 2974, 2975); set_chars(cs, 2979, 2980); set_chars(cs, 2984, 2986); set_chars(cs, 2990, 3001); set_chars(cs, 3024, 3024); set_chars(cs, 3046, 3055); set_chars(cs, 3077, 3084); set_chars(cs, 3086, 3088); set_chars(cs, 3090, 3112); set_chars(cs, 3114, 3129); set_chars(cs, 3133, 3133); set_chars(cs, 3160, 3161); set_chars(cs, 3168, 3169); set_chars(cs, 3174, 3183); set_chars(cs, 3205, 3212); set_chars(cs, 3214, 3216); set_chars(cs, 3218, 3240); set_chars(cs, 3242, 3251); set_chars(cs, 3253, 3257); set_chars(cs, 3261, 3261); set_chars(cs, 3294, 3294); set_chars(cs, 3296, 3297); set_chars(cs, 3302, 3311); set_chars(cs, 3313, 3314); set_chars(cs, 3333, 3340); set_chars(cs, 3342, 3344); set_chars(cs, 3346, 3386); set_chars(cs, 3389, 3389); set_chars(cs, 3406, 3406); set_chars(cs, 3424, 3425); set_chars(cs, 3430, 3439); set_chars(cs, 3450, 3455); set_chars(cs, 3461, 3478); set_chars(cs, 3482, 3505); set_chars(cs, 3507, 3515); set_chars(cs, 3517, 3517); set_chars(cs, 3520, 3526); set_chars(cs, 3558, 3567); set_chars(cs, 3585, 3632); set_chars(cs, 3634, 3635); set_chars(cs, 3648, 3654); set_chars(cs, 3664, 3673); set_chars(cs, 3713, 3714); set_chars(cs, 3716, 3716); set_chars(cs, 3719, 3720); set_chars(cs, 3722, 3722); set_chars(cs, 3725, 3725); set_chars(cs, 3732, 3735); set_chars(cs, 3737, 3743); set_chars(cs, 3745, 3747); set_chars(cs, 3749, 3749); set_chars(cs, 3751, 3751); set_chars(cs, 3754, 3755); set_chars(cs, 3757, 3760); set_chars(cs, 3762, 3763); set_chars(cs, 3773, 3773); set_chars(cs, 3776, 3780); set_chars(cs, 3782, 3782); set_chars(cs, 3792, 3801); set_chars(cs, 3804, 3807); set_chars(cs, 3840, 3840); set_chars(cs, 3872, 3881); set_chars(cs, 3904, 3911); set_chars(cs, 3913, 3948); set_chars(cs, 3976, 3980); set_chars(cs, 4096, 4138); set_chars(cs, 4159, 4169); set_chars(cs, 4176, 4181); set_chars(cs, 4186, 4189); set_chars(cs, 4193, 4193); set_chars(cs, 4197, 4198); set_chars(cs, 4206, 4208); set_chars(cs, 4213, 4225); set_chars(cs, 4238, 4238); set_chars(cs, 4240, 4249); set_chars(cs, 4256, 4293); set_chars(cs, 4295, 4295); set_chars(cs, 4301, 4301); set_chars(cs, 4304, 4346); set_chars(cs, 4348, 4680); set_chars(cs, 4682, 4685); set_chars(cs, 4688, 4694); set_chars(cs, 4696, 4696); set_chars(cs, 4698, 4701); set_chars(cs, 4704, 4744); set_chars(cs, 4746, 4749); set_chars(cs, 4752, 4784); set_chars(cs, 4786, 4789); set_chars(cs, 4792, 4798); set_chars(cs, 4800, 4800); set_chars(cs, 4802, 4805); set_chars(cs, 4808, 4822); set_chars(cs, 4824, 4880); set_chars(cs, 4882, 4885); set_chars(cs, 4888, 4954); set_chars(cs, 4992, 5007); set_chars(cs, 5024, 5108); set_chars(cs, 5121, 5740); set_chars(cs, 5743, 5759); set_chars(cs, 5761, 5786); set_chars(cs, 5792, 5866); set_chars(cs, 5873, 5880); set_chars(cs, 5888, 5900); set_chars(cs, 5902, 5905); set_chars(cs, 5920, 5937); set_chars(cs, 5952, 5969); set_chars(cs, 5984, 5996); set_chars(cs, 5998, 6000); set_chars(cs, 6016, 6067); set_chars(cs, 6103, 6103); set_chars(cs, 6108, 6108); set_chars(cs, 6112, 6121); set_chars(cs, 6160, 6169); set_chars(cs, 6176, 6263); set_chars(cs, 6272, 6312); set_chars(cs, 6314, 6314); set_chars(cs, 6320, 6389); set_chars(cs, 6400, 6430); set_chars(cs, 6470, 6509); set_chars(cs, 6512, 6516); set_chars(cs, 6528, 6571); set_chars(cs, 6593, 6599); set_chars(cs, 6608, 6617); set_chars(cs, 6656, 6678); set_chars(cs, 6688, 6740); set_chars(cs, 6784, 6793); set_chars(cs, 6800, 6809); set_chars(cs, 6823, 6823); set_chars(cs, 6917, 6963); set_chars(cs, 6981, 6987); set_chars(cs, 6992, 7001); set_chars(cs, 7043, 7072); set_chars(cs, 7086, 7141); set_chars(cs, 7168, 7203); set_chars(cs, 7232, 7241); set_chars(cs, 7245, 7293); set_chars(cs, 7401, 7404); set_chars(cs, 7406, 7409); set_chars(cs, 7413, 7414); set_chars(cs, 7424, 7615); set_chars(cs, 7680, 7957); set_chars(cs, 7960, 7965); set_chars(cs, 7968, 8005); set_chars(cs, 8008, 8013); set_chars(cs, 8016, 8023); set_chars(cs, 8025, 8025); set_chars(cs, 8027, 8027); set_chars(cs, 8029, 8029); set_chars(cs, 8031, 8061); set_chars(cs, 8064, 8116); set_chars(cs, 8118, 8124); set_chars(cs, 8126, 8126); set_chars(cs, 8130, 8132); set_chars(cs, 8134, 8140); set_chars(cs, 8144, 8147); set_chars(cs, 8150, 8155); set_chars(cs, 8160, 8172); set_chars(cs, 8178, 8180); set_chars(cs, 8182, 8188); set_chars(cs, 8255, 8256); set_chars(cs, 8276, 8276); set_chars(cs, 8305, 8305); set_chars(cs, 8319, 8319); set_chars(cs, 8336, 8348); set_chars(cs, 8450, 8450); set_chars(cs, 8455, 8455); set_chars(cs, 8458, 8467); set_chars(cs, 8469, 8469); set_chars(cs, 8473, 8477); set_chars(cs, 8484, 8484); set_chars(cs, 8486, 8486); set_chars(cs, 8488, 8488); set_chars(cs, 8490, 8493); set_chars(cs, 8495, 8505); set_chars(cs, 8508, 8511); set_chars(cs, 8517, 8521); set_chars(cs, 8526, 8526); set_chars(cs, 8579, 8580); set_chars(cs, 11264, 11310); set_chars(cs, 11312, 11358); set_chars(cs, 11360, 11492); set_chars(cs, 11499, 11502); set_chars(cs, 11506, 11507); set_chars(cs, 11520, 11557); set_chars(cs, 11559, 11559); set_chars(cs, 11565, 11565); set_chars(cs, 11568, 11623); set_chars(cs, 11631, 11631); set_chars(cs, 11648, 11670); set_chars(cs, 11680, 11686); set_chars(cs, 11688, 11694); set_chars(cs, 11696, 11702); set_chars(cs, 11704, 11710); set_chars(cs, 11712, 11718); set_chars(cs, 11720, 11726); set_chars(cs, 11728, 11734); set_chars(cs, 11736, 11742); set_chars(cs, 11823, 11823); set_chars(cs, 12293, 12294); set_chars(cs, 12337, 12341); set_chars(cs, 12347, 12348); set_chars(cs, 12353, 12438); set_chars(cs, 12445, 12447); set_chars(cs, 12449, 12538); set_chars(cs, 12540, 12543); set_chars(cs, 12549, 12589); set_chars(cs, 12593, 12686); set_chars(cs, 12704, 12730); set_chars(cs, 12784, 12799); set_chars(cs, 13312, 19893); set_chars(cs, 19968, 40908); set_chars(cs, 40960, 42124); set_chars(cs, 42192, 42237); set_chars(cs, 42240, 42508); set_chars(cs, 42512, 42539); set_chars(cs, 42560, 42606); set_chars(cs, 42623, 42653); set_chars(cs, 42656, 42725); set_chars(cs, 42775, 42783); set_chars(cs, 42786, 42888); set_chars(cs, 42891, 42894); set_chars(cs, 42896, 42925); set_chars(cs, 42928, 42929); set_chars(cs, 42999, 43009); set_chars(cs, 43011, 43013); set_chars(cs, 43015, 43018); set_chars(cs, 43020, 43042); set_chars(cs, 43072, 43123); set_chars(cs, 43138, 43187); set_chars(cs, 43216, 43225); set_chars(cs, 43250, 43255); set_chars(cs, 43259, 43259); set_chars(cs, 43264, 43301); set_chars(cs, 43312, 43334); set_chars(cs, 43360, 43388); set_chars(cs, 43396, 43442); set_chars(cs, 43471, 43481); set_chars(cs, 43488, 43492); set_chars(cs, 43494, 43518); set_chars(cs, 43520, 43560); set_chars(cs, 43584, 43586); set_chars(cs, 43588, 43595); set_chars(cs, 43600, 43609); set_chars(cs, 43616, 43638); set_chars(cs, 43642, 43642); set_chars(cs, 43646, 43695); set_chars(cs, 43697, 43697); set_chars(cs, 43701, 43702); set_chars(cs, 43705, 43709); set_chars(cs, 43712, 43712); set_chars(cs, 43714, 43714); set_chars(cs, 43739, 43741); set_chars(cs, 43744, 43754); set_chars(cs, 43762, 43764); set_chars(cs, 43777, 43782); set_chars(cs, 43785, 43790); set_chars(cs, 43793, 43798); set_chars(cs, 43808, 43814); set_chars(cs, 43816, 43822); set_chars(cs, 43824, 43866); set_chars(cs, 43868, 43871); set_chars(cs, 43876, 43877); set_chars(cs, 43968, 44002); set_chars(cs, 44016, 44025); set_chars(cs, 44032, 55203); set_chars(cs, 55216, 55238); set_chars(cs, 55243, 55291); set_chars(cs, 63744, 64109); set_chars(cs, 64112, 64217); set_chars(cs, 64256, 64262); set_chars(cs, 64275, 64279); set_chars(cs, 64285, 64285); set_chars(cs, 64287, 64296); set_chars(cs, 64298, 64310); set_chars(cs, 64312, 64316); set_chars(cs, 64318, 64318); set_chars(cs, 64320, 64321); set_chars(cs, 64323, 64324); set_chars(cs, 64326, 64433); set_chars(cs, 64467, 64829); set_chars(cs, 64848, 64911); set_chars(cs, 64914, 64967); set_chars(cs, 65008, 65019); set_chars(cs, 65075, 65076); set_chars(cs, 65101, 65103); set_chars(cs, 65136, 65140); set_chars(cs, 65142, 65276); set_chars(cs, 65296, 65305); set_chars(cs, 65313, 65338); set_chars(cs, 65343, 65343); set_chars(cs, 65345, 65370); set_chars(cs, 65382, 65470); set_chars(cs, 65474, 65479); set_chars(cs, 65482, 65487); set_chars(cs, 65490, 65495); set_chars(cs, 65498, 65500); set_chars(cs, 65536, 65547); set_chars(cs, 65549, 65574); set_chars(cs, 65576, 65594); set_chars(cs, 65596, 65597); set_chars(cs, 65599, 65613); set_chars(cs, 65616, 65629); set_chars(cs, 65664, 65786); set_chars(cs, 66176, 66204); set_chars(cs, 66208, 66256); set_chars(cs, 66304, 66335); set_chars(cs, 66352, 66368); set_chars(cs, 66370, 66377); set_chars(cs, 66384, 66421); set_chars(cs, 66432, 66461); set_chars(cs, 66464, 66499); set_chars(cs, 66504, 66511); set_chars(cs, 66560, 66717); set_chars(cs, 66720, 66729); set_chars(cs, 66816, 66855); set_chars(cs, 66864, 66915); set_chars(cs, 67072, 67382); set_chars(cs, 67392, 67413); set_chars(cs, 67424, 67431); set_chars(cs, 67584, 67589); set_chars(cs, 67592, 67592); set_chars(cs, 67594, 67637); set_chars(cs, 67639, 67640); set_chars(cs, 67644, 67644); set_chars(cs, 67647, 67669); set_chars(cs, 67680, 67702); set_chars(cs, 67712, 67742); set_chars(cs, 67840, 67861); set_chars(cs, 67872, 67897); set_chars(cs, 67968, 68023); set_chars(cs, 68030, 68031); set_chars(cs, 68096, 68096); set_chars(cs, 68112, 68115); set_chars(cs, 68117, 68119); set_chars(cs, 68121, 68147); set_chars(cs, 68192, 68220); set_chars(cs, 68224, 68252); set_chars(cs, 68288, 68295); set_chars(cs, 68297, 68324); set_chars(cs, 68352, 68405); set_chars(cs, 68416, 68437); set_chars(cs, 68448, 68466); set_chars(cs, 68480, 68497); set_chars(cs, 68608, 68680); set_chars(cs, 69635, 69687); set_chars(cs, 69734, 69743); set_chars(cs, 69763, 69807); set_chars(cs, 69840, 69864); set_chars(cs, 69872, 69881); set_chars(cs, 69891, 69926); set_chars(cs, 69942, 69951); set_chars(cs, 69968, 70002); set_chars(cs, 70006, 70006); set_chars(cs, 70019, 70066); set_chars(cs, 70081, 70084); set_chars(cs, 70096, 70106); set_chars(cs, 70144, 70161); set_chars(cs, 70163, 70187); set_chars(cs, 70320, 70366); set_chars(cs, 70384, 70393); set_chars(cs, 70405, 70412); set_chars(cs, 70415, 70416); set_chars(cs, 70419, 70440); set_chars(cs, 70442, 70448); set_chars(cs, 70450, 70451); set_chars(cs, 70453, 70457); set_chars(cs, 70461, 70461); set_chars(cs, 70493, 70497); set_chars(cs, 70784, 70831); set_chars(cs, 70852, 70853); set_chars(cs, 70855, 70855); set_chars(cs, 70864, 70873); set_chars(cs, 71040, 71086); set_chars(cs, 71168, 71215); set_chars(cs, 71236, 71236); set_chars(cs, 71248, 71257); set_chars(cs, 71296, 71338); set_chars(cs, 71360, 71369); set_chars(cs, 71840, 71913); set_chars(cs, 71935, 71935); set_chars(cs, 72384, 72440); set_chars(cs, 73728, 74648); set_chars(cs, 77824, 78894); set_chars(cs, 92160, 92728); set_chars(cs, 92736, 92766); set_chars(cs, 92768, 92777); set_chars(cs, 92880, 92909); set_chars(cs, 92928, 92975); set_chars(cs, 92992, 92995); set_chars(cs, 93008, 93017); set_chars(cs, 93027, 93047); set_chars(cs, 93053, 93071); set_chars(cs, 93952, 94020); set_chars(cs, 94032, 94032); set_chars(cs, 94099, 94111); set_chars(cs, 110592, 110593); set_chars(cs, 113664, 113770); set_chars(cs, 113776, 113788); set_chars(cs, 113792, 113800); set_chars(cs, 113808, 113817); set_chars(cs, 119808, 119892); set_chars(cs, 119894, 119964); set_chars(cs, 119966, 119967); set_chars(cs, 119970, 119970); set_chars(cs, 119973, 119974); set_chars(cs, 119977, 119980); set_chars(cs, 119982, 119993); set_chars(cs, 119995, 119995); set_chars(cs, 119997, 120003); set_chars(cs, 120005, 120069); set_chars(cs, 120071, 120074); set_chars(cs, 120077, 120084); set_chars(cs, 120086, 120092); set_chars(cs, 120094, 120121); set_chars(cs, 120123, 120126); set_chars(cs, 120128, 120132); set_chars(cs, 120134, 120134); set_chars(cs, 120138, 120144); set_chars(cs, 120146, 120485); set_chars(cs, 120488, 120512); set_chars(cs, 120514, 120538); set_chars(cs, 120540, 120570); set_chars(cs, 120572, 120596); set_chars(cs, 120598, 120628); set_chars(cs, 120630, 120654); set_chars(cs, 120656, 120686); set_chars(cs, 120688, 120712); set_chars(cs, 120714, 120744); set_chars(cs, 120746, 120770); set_chars(cs, 120772, 120779); set_chars(cs, 120782, 120831); set_chars(cs, 124928, 125124); set_chars(cs, 126464, 126467); set_chars(cs, 126469, 126495); set_chars(cs, 126497, 126498); set_chars(cs, 126500, 126500); set_chars(cs, 126503, 126503); set_chars(cs, 126505, 126514); set_chars(cs, 126516, 126519); set_chars(cs, 126521, 126521); set_chars(cs, 126523, 126523); set_chars(cs, 126530, 126530); set_chars(cs, 126535, 126535); set_chars(cs, 126537, 126537); set_chars(cs, 126539, 126539); set_chars(cs, 126541, 126543); set_chars(cs, 126545, 126546); set_chars(cs, 126548, 126548); set_chars(cs, 126551, 126551); set_chars(cs, 126553, 126553); set_chars(cs, 126555, 126555); set_chars(cs, 126557, 126557); set_chars(cs, 126559, 126559); set_chars(cs, 126561, 126562); set_chars(cs, 126564, 126564); set_chars(cs, 126567, 126570); set_chars(cs, 126572, 126578); set_chars(cs, 126580, 126583); set_chars(cs, 126585, 126588); set_chars(cs, 126590, 126590); set_chars(cs, 126592, 126601); set_chars(cs, 126603, 126619); set_chars(cs, 126625, 126627); set_chars(cs, 126629, 126633); set_chars(cs, 126635, 126651); set_chars(cs, 131072, 173782); set_chars(cs, 173824, 177972); set_chars(cs, 177984, 178205); set_chars(cs, 194560, 195101); } else { set_chars(cs, 0x80, 0x10FFFF); } cs.flip(); iscat = true; break; default: if (**pattern != '\0') cs.set(get_char(pattern)); } if (**pattern != '\0') ++*pattern; break; default: if (**pattern != '\0') cs.set(get_char(pattern)); break; } if (iscat && **pattern == '-') { charset sub; const char *p = *pattern; ++*pattern; if (get_charset(pattern, sub)) { cs &= sub.flip(); } else { iscat = false; *pattern = p; } } return iscat; } static unsigned int get_char(const char **pattern) { unsigned int c = (unsigned char)**pattern; if (!c) return 0; ++*pattern; if (c < 0x80) return c; unsigned int c1 = (unsigned char)**pattern; if (c <= 0xC1 || (c1 & 0xC0) != 0x80) return UNDEFINED_CHAR; ++*pattern; c1 &= 0x3F; if (c < 0xE0) return (((c & 0x1F) << 6) | c1); unsigned int c2 = (unsigned char)**pattern; if ((c == 0xE0 && c1 < 0x20) || (c2 & 0xC0) != 0x80) return UNDEFINED_CHAR; ++*pattern; c2 &= 0x3F; if (c < 0xF0) return (((c & 0x0F) << 12) | (c1 << 6) | c2); unsigned int c3 = (unsigned char)**pattern; if ((c == 0xF0 && c1 < 0x10) || (c == 0xF4 && c1 >= 0x10) || c >= 0xF5 || (c3 & 0xC0) != 0x80) return UNDEFINED_CHAR; ++*pattern; return (((c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | (c3 & 0x3F)); } static void append_char(std::string& s, unsigned int c) { if (c < 0x80) { s.push_back(c); } else if ((c >= 0xA0 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD) || (c >= 0x10000 && c <= 0x10FFFF)) { char buf[8], *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)); *t = '\0'; s.append(buf); } } static int receive_request(struct soap *ctx) { ULONG64 n = 0; if (soap_begin_recv(ctx)) { fprintf(stderr, "testmsgr: failed to receive on port %lu\n", port); soap_print_fault(ctx, stderr); return ctx->error; } if (!(ctx->mode & SOAP_ENC_ZLIB) && (ctx->mode & SOAP_IO) != SOAP_IO_CHUNK && ctx->length == 0) { fprintf(stderr, "testmsgr: no HTTP content-length header in request message\n"); } else if ((ctx->mode & SOAP_ENC_MIME)) { // MTOM/MIME attachments: just execute soap_end_recv() to get them all } else { for (;;) { n++; if (ctx->length > 0 && n > ctx->length) break; if ((int)soap_getchar(ctx) == EOF) break; } } if (soap_end_recv(ctx)) { fprintf(stderr, "testmsgr: failed to receive on port %lu\n", port); soap_print_fault(ctx, stderr); return ctx->error; } return SOAP_OK; } static void receive_response(struct soap *ctx) { if (soap_begin_recv(ctx)) { fprintf(stderr, "testmsgr: failed to receive from %s\n", URL); soap_print_fault(ctx, stderr); } else if (!(ctx->mode & SOAP_ENC_ZLIB) && (ctx->mode & SOAP_IO) != SOAP_IO_CHUNK && ctx->length == 0) { printf("Server responded with status %d and an empty body\n\n", ctx->status); } else if ((ctx->mode & SOAP_ENC_MIME)) { printf("Server responded with status %d and MIME body:\n\n", ctx->status); if (soap_end_recv(ctx)) { fprintf(stderr, "testmsgr: failed to receive from %s\n", URL); soap_print_fault(ctx, stderr); } if (soap_closesock(ctx) && ferr) exit(EXIT_FAILURE); for (soap_multipart::iterator i = ctx->mime.begin(); i != ctx->mime.end(); ++i) { printf("MIME id=\"%s\" type=\"%s\"\n---- begin ----\n", i->id ? i->id : "", i->type ? i->type : ""); if (i->ptr) { size_t k = i->size; if (nlen > 0 && nlen < (LONG64)k) k = (size_t)nlen; fwrite(i->ptr, 1, k, stdout); if (k < i->size) printf("\n---- cut ----\n..."); } printf("\n---- end ----\n\n"); } return; } else { printf("Server responded with status %d and a message body:\n\n---- begin ----\n", ctx->status); ULONG64 n = 0; for (;;) { soap_wchar c; n++; if (ctx->length > 0 && n > ctx->length) break; c = soap_getchar(ctx); if ((int)c == EOF) break; if (nlen < 0 || n <= (ULONG64)nlen) putchar(c); } if (nlen > 0 && n > (ULONG64)nlen) printf("\n---- cut ----\n..."); printf("\n---- end ----\n\n"); } if (soap_end_recv(ctx)) { fprintf(stderr, "testmsgr: failed to receive from %s\n", URL); soap_print_fault(ctx, stderr); if (ferr) exit(EXIT_FAILURE); } if (soap_closesock(ctx) && ferr) exit(EXIT_FAILURE); } gsoap-2.8.91/gsoap/samples/atom/0000755000175000017500000000000013525245202016001 5ustar ellertellertgsoap-2.8.91/gsoap/samples/atom/.deps/0000755000175000017500000000000013525245202017012 5ustar ellertellertgsoap-2.8.91/gsoap/samples/atom/Makefile.in0000644000175000017500000004664613525245201020065 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = atom$(EXEEXT) subdir = gsoap/samples/atom ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am_atom_OBJECTS = atom.$(OBJEXT) $(am__objects_1) $(am__objects_2) atom_OBJECTS = $(am_atom_OBJECTS) atom_LDADD = $(LDADD) am__DEPENDENCIES_1 = atom_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/atom.Po ./$(DEPDIR)/soapC.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(atom_SOURCES) DIST_SOURCES = $(atom_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.cpp_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = atom.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = $(SOAP_NS_DEF) atom_SOURCES = atom.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/atom/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/atom/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) atom$(EXEEXT): $(atom_OBJECTS) $(atom_DEPENDENCIES) $(EXTRA_atom_DEPENDENCIES) @rm -f atom$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(atom_OBJECTS) $(atom_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/atom.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/atom.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/atom/atom.cpp0000644000175000017500000004144313525245161017457 0ustar ellertellert/* atom.cpp Atom 1.0 example to type-safe populate Atom XML data Compile: $ soapcpp2 -0 -CSL atom.h $ c++ -o atom atom.cpp stdsoap2.cpp soapC.cpp Try it out: $ ./atom > feed.xml $ ./atom feed.xml Warning: XML content with type _XML (a char* type) in a__text and in all __any members in several classes allow the delivery of HTML and XHTML. Many elements in these languages are considered 'unsafe' in that they open clients to one or more types of attack. Implementers of software that processes Atom should carefully consider their handling of every type of element when processing incoming (X)HTML in Atom Documents. See the security sections of [RFC2854] and [HTML] for guidance. See [RFC4287] https://tools.ietf.org/html/rfc4287 for details. [RFC4287] 4.1.3.3. Processing Model Atom Documents MUST conform to the following rules. Atom Processors MUST interpret atom:content according to the first applicable rule. 1. If the value of "type" is "text", the content of atom:content MUST NOT contain child elements. Such text is intended to be presented to humans in a readable fashion. Thus, Atom Processors MAY collapse white space (including line breaks), and display the text using typographic techniques such as justification and proportional fonts. 2. If the value of "type" is "html", the content of atom:content MUST NOT contain child elements and SHOULD be suitable for handling as HTML [HTML]. The HTML markup MUST be escaped; for example, "
" as "<br>". The HTML markup SHOULD be such that it could validly appear directly within an HTML
element. Atom Processors that display the content MAY use the markup to aid in displaying it. 3. If the value of "type" is "xhtml", the content of atom:content MUST be a single XHTML div element [XHTML] and SHOULD be suitable for handling as XHTML. The XHTML div element itself MUST NOT be considered part of the content. Atom Processors that display the content MAY use the markup to aid in displaying it. The escaped versions of characters such as "&" and ">" represent those characters, not markup. 4. If the value of "type" is an XML media type [RFC3023] or ends with "+xml" or "/xml" (case insensitive), the content of atom:content MAY include child elements and SHOULD be suitable for handling as the indicated media type. If the "src" attribute is not provided, this would normally mean that the "atom:content" element would contain a single child element that would serve as the root element of the XML document of the indicated type. 5. If the value of "type" begins with "text/" (case insensitive), the content of atom:content MUST NOT contain child elements. 6. For all other values of "type", the content of atom:content MUST be a valid Base64 encoding, as described in [RFC3548], section 3. When decoded, it SHOULD be suitable for handling as the indicated media type. In this case, the characters in the Base64 encoding MAY be preceded and followed in the atom:content element by white space, and lines are separated by a single newline (U+000A) character. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2017, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include /// the namespace mapping table has NULL entries for SOAP and XSD namespaces that we do not need struct Namespace namespaces[] = { {"SOAP-ENV", NULL, NULL, NULL}, {"SOAP-ENC", NULL, NULL, NULL}, {"xsi", NULL, NULL, NULL}, {"xsd", NULL, NULL, NULL}, {"a", "http://www.w3.org/2005/Atom", NULL, NULL}, {NULL, NULL, NULL, NULL} }; // Some useful templates and functions to populate Atom data. More useful // perhaps is to add a few more functions to populate and extract Atom data, or // add methods to the a__feed class to populate and extract Atom data. /// soap_make: populate primitive values, e.g. integers, returns pointer to managed heap-allocated data of type T template T * soap_make(struct soap *soap, T val) { T *p = (T*)soap_malloc(soap, sizeof(T)); if (p == NULL) throw std::bad_alloc(); *p = val; return p; } /// soap_make_string: return managed heap-allocated and populated std::string std::string *soap_make_string(struct soap *soap, const char *s) { if (!s) return NULL; std::string *p = (std::string*)soap_new_std__string(soap); if (p == NULL) throw std::bad_alloc(); *p = s; return p; } /// soap_make_text: return managed heap-allocated and populated a__text a__text *soap_make_text(struct soap *soap, const char *s, const char *lang = NULL) { if (!s) return NULL; a__text *p = (a__text*)soap_new_a__text(soap); if (p == NULL) throw std::bad_alloc(); p->__item = soap_strdup(soap, s); p->xml__base = NULL; p->xml__lang = lang ? soap_make_string(soap, s) : NULL; return p; } /// soap_make_uri: return managed heap-allocated and populated a__uri a__uri *soap_make_uri(struct soap *soap, const char *s, const char *lang = NULL) { if (!s) return NULL; a__uri *p = (a__uri*)soap_new_a__uri(soap); if (p == NULL) throw std::bad_alloc(); p->__item = s; p->xml__base = NULL; p->xml__lang = lang ? soap_make_string(soap, s) : NULL; return p; } /// soap_make_dateTime: return managed heap-allocated and populated a__dateTime a__dateTime *soap_make_now(struct soap *soap) { a__dateTime *p = (a__dateTime*)soap_new_a__dateTime(soap); if (p == NULL) throw std::bad_alloc(); p->__item = time(NULL); p->xml__base = NULL; p->xml__lang = NULL; return p; } /// soap_make_gen: return managed heap-allocated and populated a__generator a__generator *soap_make_gen(struct soap *soap, const char *s, const char *u = NULL, const char *v = NULL, const char *lang = NULL) { if (!s) return NULL; a__generator *p = (a__generator*)soap_new_a__generator(soap); if (p == NULL) throw std::bad_alloc(); p->__item = s; p->uri = u ? soap_make_string(soap, u) : NULL; p->version = v ? soap_make_string(soap, v) : NULL; p->xml__base = NULL; p->xml__lang = lang ? soap_make_string(soap, s) : NULL; return p; } /// display text void show_text(const char *label, const a__text *text) { if (text) { std::cout << label << text->__item; if (text->xml__lang) std::cout << " lang=" << *text->xml__lang; if (text->type) { // we could have used soap_a__textType2s(soap, *text->type) to display the type switch (*text->type) { case a__textType__text: std::cout << " (text)"; break; case a__textType__html: std::cout << " (HTML)"; break; case a__textType__xhtml: std::cout << " (XHTML)"; break; } } std::cout << std::endl; } } /// display URI void show_uri(const char *label, const a__uri *uri) { if (uri) { std::cout << label << uri->__item; if (uri->xml__lang) std::cout << " lang=" << *uri->xml__lang; std::cout << std::endl; } } /// display dateTime (not MT-safe because of clib ctime, use ctime_r instead) void show_date(const char *label, const a__dateTime *date) { if (date) std::cout << label << ctime(&date->__item); } /// display generator void show_gen(const char *label, const a__generator *gen) { if (gen) { std::cout << label << gen->__item; if (gen->uri) std::cout << " URI=" << *gen->uri; if (gen->version) std::cout << " version=" << *gen->version; if (gen->xml__lang) std::cout << " lang=" << *gen->xml__lang; std::cout << std::endl; } } /// display person void show_pers(const char *label, const a__person& pers) { std::cout << label << pers.name; if (pers.email) std::cout << " email=" << *pers.email; if (pers.xml__lang) std::cout << " lang=" << *pers.xml__lang; show_uri(" uri=", pers.uri); for (std::vector<_XML>::const_iterator i = pers.__any.begin(); i != pers.__any.end(); ++i) std::cout << std::endl << *i; std::cout << std::endl; } /// display content void show_cont(const char *label, const a__content *cont) { if (cont) { std::cout << label; if (cont->type) std::cout << " type=" << *cont->type; if (cont->src) std::cout << " src=" << *cont->src; if (cont->xml__lang) std::cout << " lang=" << *cont->xml__lang; for (std::vector<_XML>::const_iterator i = cont->__any.begin(); i != cont->__any.end(); ++i) std::cout << std::endl << *i; std::cout << std::endl; } } /// display category void show_caty(const char *label, const a__category& caty) { std::cout << label << caty.term; if (caty.scheme) std::cout << " scheme=" << *caty.scheme; if (caty.label) std::cout << " label=" << *caty.label; if (caty.xml__lang) std::cout << " lang=" << *caty.xml__lang; for (std::vector<_XML>::const_iterator i = caty.__any.begin(); i != caty.__any.end(); ++i) std::cout << std::endl << *i; std::cout << std::endl; } /// display link void show_link(const char *label, const a__link& link) { std::cout << label << link.href; if (link.rel) std::cout << " rel=" << *link.rel; if (link.type) std::cout << " type=" << *link.type; if (link.hreflang) std::cout << " hreflang=" << *link.hreflang; if (link.title) std::cout << " title=" << *link.title; if (link.length) std::cout << " length=" << *link.length; if (link.xml__lang) std::cout << " lang=" << *link.xml__lang; std::cout << std::endl; } int main(int argc, char **argv) { if (argc < 2) { /* The example code below shows how to populate in a type-safe way the following Atom feed: Example Feed A subtitle. urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6 2003-12-13T18:30:02Z Atom-Powered Robots Run Amok urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a 2003-12-13T18:30:02Z Some text.

This is the entry content.

John Doe johndoe@example.com
*/ struct soap *soap = soap_new1(SOAP_XML_INDENT | SOAP_XML_DEFAULTNS); a__feed feeds; __a__feed feed; a__link link; a__entry entry; a__person person; /* create a feed */ feed.id = soap_make_uri(soap, soap_rand_uuid(soap, "urn:uuid:")); feed.title = soap_make_text(soap, "Example Feed"); feed.subtitle = soap_make_text(soap, "A subtitle."); feed.updated = soap_make_now(soap); /* feed/link */ link.href = "http://example.org/feed/"; link.rel = soap_make_string(soap, "self"); feed.link.push_back(link); /* feed/link */ link.href = "http://example.org/"; link.rel = NULL; feed.link.push_back(link); /* create an entry in the feed with three links */ entry.id = soap_make_uri(soap, soap_rand_uuid(soap, "urn:uuid:")); entry.title = soap_make_text(soap, "Atom-Powered Robots Run Amok"); entry.updated = soap_make_now(soap); entry.summary = soap_make_text(soap, "Some text."); link.href = "http://example.org/2003/12/13/atom03"; link.rel = NULL; link.type = NULL; entry.link.push_back(link); link.href = "http://example.org/2003/12/13/atom03.html"; link.rel = soap_make_string(soap, "alternate"); link.type = soap_make_string(soap, "text/html"); entry.link.push_back(link); link.href = "http://example.org/2003/12/13/atom03/edit"; link.rel = soap_make_string(soap, "edit"); link.type = NULL; entry.link.push_back(link); /* create content for the entry */ entry.content = soap_new_a__content(soap); entry.content->type = soap_make_string(soap, "xhtml"); entry.content->__any.push_back((char*)"\n
\n

This is the entry content.

\n
\n"); /* create an author for the entry */ person.name = "John Doe"; person.email = soap_make_string(soap, "johndoe@example.com"); entry.author.push_back(person); /* add entry to feed/entry */ feed.entry.push_back(entry); /* add feed */ feeds.__feeds.push_back(feed); /* display XML */ soap_write_a__feed(soap, &feeds); /* demo is done */ soap_destroy(soap); soap_end(soap); soap_free(soap); } else { /* parse the atom file given on the command line, deserialized to C++, and display contents */ struct soap *soap = soap_new(); a__feed feeds; std::ifstream in(argv[1]); soap->is = ∈ if (soap_read_a__feed(soap, &feeds)) { soap_stream_fault(soap, std::cerr); exit(EXIT_FAILURE); } in.close(); soap->is = NULL; for (std::vector<__a__feed>::const_iterator i = feeds.__feeds.begin(); i != feeds.__feeds.end(); ++i) { show_text("title: ", i->title); show_text("subtitle: ", i->subtitle); show_date("updated: ", i->updated); show_gen ("generator: ", i->generator); show_uri ("icon: ", i->icon); show_uri ("logo: ", i->logo); show_text("rights: ", i->rights); for (std::vector::const_iterator j = i->link.begin(); j != i->link.end(); ++j) show_link("link: ", *j); for (std::vector::const_iterator j = i->entry.begin(); j != i->entry.end(); ++j) { std::cout << std::endl; show_text(" title: ", j->title); show_date(" published: ", j->updated); show_date(" updated: ", j->updated); show_text(" rights: ", j->rights); show_text(" summary: ", j->summary); show_cont(" content: ", j->content); // skipped source intentionally: you need to add code to display the source element for (std::vector::const_iterator k = j->category.begin(); k != j->category.end(); ++k) show_caty(" category: ", *k); for (std::vector::const_iterator k = j->author.begin(); k != j->author.end(); ++k) show_pers(" author: ", *k); for (std::vector::const_iterator k = j->contributor.begin(); k != j->contributor.end(); ++k) show_pers(" contributor: ", *k); for (std::vector::const_iterator k = j->link.begin(); k != j->link.end(); ++k) show_link(" link: ", *k); } } soap_destroy(soap); soap_end(soap); soap_free(soap); } return 0; } gsoap-2.8.91/gsoap/samples/atom/atom.h0000644000175000017500000003212313525245161017117 0ustar ellertellert/// Atom 1.0 specification for C++ /// /// [RFC4287] https://tools.ietf.org/html/rfc4287 /// /// Atom 1.0 is not defined in an XSD. This specification accurately reflects /// the Atom 1.0 XML structure, but not the XSD this specification generates! /// /// Class a__feed is the element root of an Atom document /// /// Read/write feeds by calling: /// int soap_read_a__feed(struct soap *, a__feed *feed) /// int soap_write_a__feed(struct soap *, const a__feed *feed) /// /// GET feeds by calling: /// int soap_GET_a__feed(struct soap *, const char *URL, a__feed *feed) /// /// PUT feeds with: /// soap->http_content = "application/atom+xml"; /// then call: /// int soap_PUT_a__feed(struct soap *, const char *URL, const a__feed *feed) /* Warning: XML content with type _XML (a char* type) in a__text and all __any members in several classes allow the delivery of HTML and XHTML. Many elements in these languages are considered 'unsafe' in that they open clients to one or more types of attack. Implementers of software that processes Atom should carefully consider their handling of every type of element when processing incoming (X)HTML in Atom Documents. See the security sections of [RFC2854] and [HTML] for guidance. See [RFC4287] https://tools.ietf.org/html/rfc4287 for details. [RFC4287] 4.1.3.3. Processing Model Atom Documents MUST conform to the following rules. Atom Processors MUST interpret atom:content according to the first applicable rule. 1. If the value of "type" is "text", the content of atom:content MUST NOT contain child elements. Such text is intended to be presented to humans in a readable fashion. Thus, Atom Processors MAY collapse white space (including line breaks), and display the text using typographic techniques such as justification and proportional fonts. 2. If the value of "type" is "html", the content of atom:content MUST NOT contain child elements and SHOULD be suitable for handling as HTML [HTML]. The HTML markup MUST be escaped; for example, "
" as "<br>". The HTML markup SHOULD be such that it could validly appear directly within an HTML
element. Atom Processors that display the content MAY use the markup to aid in displaying it. 3. If the value of "type" is "xhtml", the content of atom:content MUST be a single XHTML div element [XHTML] and SHOULD be suitable for handling as XHTML. The XHTML div element itself MUST NOT be considered part of the content. Atom Processors that display the content MAY use the markup to aid in displaying it. The escaped versions of characters such as "&" and ">" represent those characters, not markup. 4. If the value of "type" is an XML media type [RFC3023] or ends with "+xml" or "/xml" (case insensitive), the content of atom:content MAY include child elements and SHOULD be suitable for handling as the indicated media type. If the "src" attribute is not provided, this would normally mean that the "atom:content" element would contain a single child element that would serve as the root element of the XML document of the indicated type. 5. If the value of "type" begins with "text/" (case insensitive), the content of atom:content MUST NOT contain child elements. 6. For all other values of "type", the content of atom:content MUST be a valid Base64 encoding, as described in [RFC3548], section 3. When decoded, it SHOULD be suitable for handling as the indicated media type. In this case, the characters in the Base64 encoding MAY be preceded and followed in the atom:content element by white space, and lines are separated by a single newline (U+000A) character. */ //gsoapopt w //gsoap a schema namespace: http://www.w3.org/2005/Atom //gsoap a schema elementForm: qualified //gsoap a schema attributeForm: unqualified #import "stlvector.h" typedef std::string xsd__anyURI; typedef std::string _xml__base; typedef std::string _xml__lang; enum a__textType { a__textType__text, ///< xs:token value="text" a__textType__html, ///< xs:token value="html" a__textType__xhtml, ///< xs:token value="xhtml" }; class a__uri { public: xsd__anyURI __item ; @_xml__base* xml__base 0; ///< Optional attribute. @_xml__lang* xml__lang 0; ///< Optional attribute. }; class a__dateTime { public: time_t __item ; @_xml__base* xml__base 0; ///< Optional attribute. @_xml__lang* xml__lang 0; ///< Optional attribute. }; class a__generator { public: std::string __item ; @xsd__anyURI* uri 0; ///< Optional attribute. @std::string* version 0; ///< Optional attribute. @_xml__base* xml__base 0; ///< Optional attribute. @_xml__lang* xml__lang 0; ///< Optional attribute. }; class a__text { public: _XML __item ; @enum a__textType* type 0; ///< Optional attribute. @_xml__base* xml__base 0; ///< Optional attribute. @_xml__lang* xml__lang 0; ///< Optional attribute. }; class a__person { public: @_xml__base* xml__base 0; ///< Optional attribute. @_xml__lang* xml__lang 0; ///< Optional attribute. std::string name 1; ///< Required element. a__uri* uri ; ///< Optional element. std::string* email ; ///< Optional element. std::vector<_XML > __any 0; ///< Catch any element content in XML string. }; class a__content { public: @std::string* type 0; ///< Optional attribute. @xsd__anyURI* src 0; ///< Optional attribute. @_xml__base* xml__base 0; ///< Optional attribute. @_xml__lang* xml__lang 0; ///< Optional attribute. std::vector<_XML > __any 0; ///< Catch any element content in XML string. }; class a__category { public: @std::string term 1; ///< Required attribute. @xsd__anyURI* scheme 0; ///< Optional attribute. @std::string* label 0; ///< Optional attribute. @_xml__base* xml__base 0; ///< Optional attribute. @_xml__lang* xml__lang 0; ///< Optional attribute. std::vector<_XML > __any 0; ///< Catch any element content in XML string. }; class a__link { public: @xsd__anyURI href 1; ///< Required attribute. @std::string* rel 0; ///< Optional attribute. @std::string* type 0; ///< Optional attribute. @std::string* hreflang 0; ///< Optional attribute. @std::string* title 0; ///< Optional attribute. @unsigned int* length 0; ///< Optional attribute. @_xml__base* xml__base 0; ///< Optional attribute. @_xml__lang* xml__lang 0; ///< Optional attribute. std::vector<_XML > __any 0; ///< Catch any element content in XML string. }; class a__source { public: @_xml__base* xml__base 0; ///< Optional attribute. @_xml__lang* xml__lang 0; ///< Optional attribute. std::vector author 0; ///< Optional element. std::vector category 0; ///< Optional element. std::vector contributor 0; ///< Optional element. a__generator* generator 0; ///< Optional element. a__uri* icon 0; ///< Optional element. a__uri* id 0; ///< Optional element. std::vector link 0; ///< Optional element. a__uri* logo 0; ///< Optional element. a__text* rights 0; ///< Optional element. a__text* subtitle 0; ///< Optional element. a__text* title 0; ///< Optional element. a__dateTime* updated 0; ///< Optional element. std::vector<_XML > __any 0; ///< Catch any element content in XML string. }; class a__entry { public: @_xml__base* xml__base 0; ///< Optional attribute. @_xml__lang* xml__lang 0; ///< Optional attribute. a__uri* id 0; ///< Optional element. a__text* title 0; ///< Optional element. a__dateTime* published 0; ///< Optional element. a__dateTime* updated 0; ///< Optional element. a__text* rights 0; ///< Optional element. a__text* summary 0; ///< Optional element. a__source* source 0; ///< Optional element. a__content* content 0; ///< Optional element. std::vector category 0; ///< Optional element. std::vector author 0; ///< Optional element. std::vector contributor 0; ///< Optional element. std::vector link 0; ///< Optional element. std::vector<_XML > __any 0; ///< Catch any element content in XML string. }; class a__feed { public: @_xml__base* xml__base 0; ///< Optional attribute. @_xml__lang* xml__lang 0; ///< Optional attribute. std::vector< class __a__feed { a__uri* id ; ///< Optional element. a__text* title ; ///< Optional element. a__text* subtitle ; ///< Optional element. a__dateTime* updated ; ///< Optional element. a__generator* generator ; ///< Optional element. a__uri* icon ; ///< Optional element. a__uri* logo ; ///< Optional element. a__text* rights ; ///< Optional element. std::vector link ; ///< Optional element. std::vector author ; ///< Optional element. std::vector category ; ///< Optional element. std::vector contributor ; ///< Optional element. std::vector entry ; ///< Optional element. }> __feeds ; std::vector<_XML > __any 0; ///< Catch any element content in XML string. }; gsoap-2.8.91/gsoap/samples/atom/README.txt0000644000175000017500000000633113525245161017506 0ustar ellertellert Atom ==== The gSOAP Atom library supports Atom 1.0 Compile: $ soapcpp2 -0 -CSL atom.h $ c++ -o atom atom.cpp stdsoap2.cpp soapC.cpp Try it out: $ ./atom > feed.xml $ ./atom feed.xml Warning: XML content with type _XML (a char* type) in a__text and in all __any members in several classes allow the delivery of HTML and XHTML. Many elements in these languages are considered 'unsafe' in that they open clients to one or more types of attack. Implementers of software that processes Atom should carefully consider their handling of every type of element when processing incoming (X)HTML in Atom Documents. See the security sections of [RFC2854] and [HTML] for guidance. See [RFC4287] https://tools.ietf.org/html/rfc4287 for details. [RFC4287] 4.1.3.3. Processing Model Atom Documents MUST conform to the following rules. Atom Processors MUST interpret atom:content according to the first applicable rule. 1. If the value of "type" is "text", the content of atom:content MUST NOT contain child elements. Such text is intended to be presented to humans in a readable fashion. Thus, Atom Processors MAY collapse white space (including line breaks), and display the text using typographic techniques such as justification and proportional fonts. 2. If the value of "type" is "html", the content of atom:content MUST NOT contain child elements and SHOULD be suitable for handling as HTML [HTML]. The HTML markup MUST be escaped; for example, "
" as "<br>". The HTML markup SHOULD be such that it could validly appear directly within an HTML
element. Atom Processors that display the content MAY use the markup to aid in displaying it. 3. If the value of "type" is "xhtml", the content of atom:content MUST be a single XHTML div element [XHTML] and SHOULD be suitable for handling as XHTML. The XHTML div element itself MUST NOT be considered part of the content. Atom Processors that display the content MAY use the markup to aid in displaying it. The escaped versions of characters such as "&" and ">" represent those characters, not markup. 4. If the value of "type" is an XML media type [RFC3023] or ends with "+xml" or "/xml" (case insensitive), the content of atom:content MAY include child elements and SHOULD be suitable for handling as the indicated media type. If the "src" attribute is not provided, this would normally mean that the "atom:content" element would contain a single child element that would serve as the root element of the XML document of the indicated type. 5. If the value of "type" begins with "text/" (case insensitive), the content of atom:content MUST NOT contain child elements. 6. For all other values of "type", the content of atom:content MUST be a valid Base64 encoding, as described in [RFC3548], section 3. When decoded, it SHOULD be suitable for handling as the indicated media type. In this case, the characters in the Base64 encoding MAY be preceded and followed in the atom:content element by white space, and lines are separated by a single newline (U+000A) character. gsoap-2.8.91/gsoap/samples/atom/Makefile.am0000644000175000017500000000065113525245161020043 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = atom SOAPHEADER = atom.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = $(SOAP_NS_DEF) atom_SOURCES = atom.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) gsoap-2.8.91/gsoap/samples/Makefile.defines0000644000175000017500000000150713525245163020126 0ustar ellertellert## common defines for Makefiles for the gsoap samples ## AM_CFLAGS=-D$(platform) AM_CXXFLAGS=-D$(platform) CPPFLAGS=$(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) SOAP=$(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF=ns.nsmap ns.wsdl SOAP_H_FILES=soapH.h soapStub.h SOAP_C_CORE=soapC.c SOAP_C_CLIENT=soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER=soapServer.c $(SOAP_C_CORE) SOAP_C_LIB=$(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK=$(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL=$(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE=soapC.cpp SOAP_CPP_CLIENT=soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER=soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB=$(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK=$(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL=$(top_builddir)/gsoap/libgsoapssl++.a gsoap-2.8.91/gsoap/samples/ssl/0000755000175000017500000000000013525245202015642 5ustar ellertellertgsoap-2.8.91/gsoap/samples/ssl/ssl_setup.h0000644000175000017500000000624213525245163020046 0ustar ellertellert/* ssl_setup.h Set up ssl client context with soap_ssl_client_setup(): - automatically uses certificates stored in Unix/Linux common locations - automatically uses Windows system certificate store - when -DWITH_WININET is defined, uses the gSOAP WinInet plugin with WinInet system certificate store - when -DWITH_CURL is defined, uses the gSOAP CURL plugin with CURL certificate store See ssl_setup.c gSOAP XML Web services tools Copyright (C) 2000-2019, 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-2010, 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 SSL_SETUP_H #define SSL_SETUP_H int soap_ssl_client_setup( struct soap *soap, /* the context */ unsigned short flags, /* SOAP_SSL_DEFAULT, SOAP_SSL_NO_AUTHENTICATION etc */ const char *keyfile, /* a keyfile is required only when client must authenticate to server, NULL otherwise */ const char *password, /* password to read the key file (not used with GNUTLS), NULL otherwise */ const char *cacert, /* optional file name of CA PEM file, NULL to search CA stores */ const char *capath); /* optional path to CA PEM files, NULL to search CA stores */ #endif gsoap-2.8.91/gsoap/samples/ssl/.deps/0000755000175000017500000000000013525245202016653 5ustar ellertellertgsoap-2.8.91/gsoap/samples/ssl/.deps/sslserver.Po0000644000175000017500000000001013525245163021200 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/samples/ssl/.deps/soapServer.Po0000644000175000017500000000001013525245163021301 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/samples/ssl/.deps/soapClient.Po0000644000175000017500000000673513525245163021275 0ustar ellertellertsoapClient.o: soapClient.c soapH.h soapStub.h \ ../../../soapcpp2/stdsoap2.h ../../../config.h /usr/include/stdlib.h \ /usr/include/sys/cdefs.h /usr/include/_types.h \ /usr/include/sys/_types.h /usr/include/machine/_types.h \ /usr/include/i386/_types.h /usr/include/sys/wait.h \ /usr/include/sys/signal.h /usr/include/sys/appleapiopts.h \ /usr/include/machine/signal.h /usr/include/i386/signal.h \ /usr/include/sys/resource.h /usr/include/machine/endian.h \ /usr/include/i386/endian.h /usr/include/sys/_endian.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdint.h \ /usr/include/libkern/OSByteOrder.h \ /usr/include/libkern/i386/OSByteOrder.h /usr/include/alloca.h \ /usr/include/machine/types.h /usr/include/i386/types.h \ /usr/include/stdio.h /usr/include/string.h /usr/include/ctype.h \ /usr/include/runetype.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/limits.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/syslimits.h \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/i386/limits.h /usr/include/i386/_limits.h \ /usr/include/sys/syslimits.h /usr/include/errno.h \ /usr/include/sys/errno.h /usr/include/sys/types.h \ /usr/include/sys/timeb.h /usr/include/time.h \ /usr/include/machine/_limits.h /usr/include/sys/socket.h \ /usr/include/machine/param.h /usr/include/i386/param.h \ /usr/include/strings.h /usr/include/sys/time.h \ /usr/include/netinet/in.h /usr/include/netinet6/in6.h \ /usr/include/netinet/tcp.h /usr/include/arpa/inet.h \ /usr/include/sys/param.h /usr/include/netdb.h /usr/include/unistd.h \ /usr/include/sys/unistd.h /usr/include/sys/select.h \ /usr/include/signal.h /usr/include/fcntl.h /usr/include/sys/fcntl.h \ /usr/include/math.h /usr/include/architecture/i386/math.h soapH.h: soapStub.h: ../../../soapcpp2/stdsoap2.h: ../../../config.h: /usr/include/stdlib.h: /usr/include/sys/cdefs.h: /usr/include/_types.h: /usr/include/sys/_types.h: /usr/include/machine/_types.h: /usr/include/i386/_types.h: /usr/include/sys/wait.h: /usr/include/sys/signal.h: /usr/include/sys/appleapiopts.h: /usr/include/machine/signal.h: /usr/include/i386/signal.h: /usr/include/sys/resource.h: /usr/include/machine/endian.h: /usr/include/i386/endian.h: /usr/include/sys/_endian.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdint.h: /usr/include/libkern/OSByteOrder.h: /usr/include/libkern/i386/OSByteOrder.h: /usr/include/alloca.h: /usr/include/machine/types.h: /usr/include/i386/types.h: /usr/include/stdio.h: /usr/include/string.h: /usr/include/ctype.h: /usr/include/runetype.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/limits.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/syslimits.h: /usr/include/limits.h: /usr/include/machine/limits.h: /usr/include/i386/limits.h: /usr/include/i386/_limits.h: /usr/include/sys/syslimits.h: /usr/include/errno.h: /usr/include/sys/errno.h: /usr/include/sys/types.h: /usr/include/sys/timeb.h: /usr/include/time.h: /usr/include/machine/_limits.h: /usr/include/sys/socket.h: /usr/include/machine/param.h: /usr/include/i386/param.h: /usr/include/strings.h: /usr/include/sys/time.h: /usr/include/netinet/in.h: /usr/include/netinet6/in6.h: /usr/include/netinet/tcp.h: /usr/include/arpa/inet.h: /usr/include/sys/param.h: /usr/include/netdb.h: /usr/include/unistd.h: /usr/include/sys/unistd.h: /usr/include/sys/select.h: /usr/include/signal.h: /usr/include/fcntl.h: /usr/include/sys/fcntl.h: /usr/include/math.h: /usr/include/architecture/i386/math.h: gsoap-2.8.91/gsoap/samples/ssl/.deps/soapC.Po0000644000175000017500000000672313525245163020236 0ustar ellertellertsoapC.o: soapC.c soapH.h soapStub.h ../../../soapcpp2/stdsoap2.h \ ../../../config.h /usr/include/stdlib.h /usr/include/sys/cdefs.h \ /usr/include/_types.h /usr/include/sys/_types.h \ /usr/include/machine/_types.h /usr/include/i386/_types.h \ /usr/include/sys/wait.h /usr/include/sys/signal.h \ /usr/include/sys/appleapiopts.h /usr/include/machine/signal.h \ /usr/include/i386/signal.h /usr/include/sys/resource.h \ /usr/include/machine/endian.h /usr/include/i386/endian.h \ /usr/include/sys/_endian.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdint.h \ /usr/include/libkern/OSByteOrder.h \ /usr/include/libkern/i386/OSByteOrder.h /usr/include/alloca.h \ /usr/include/machine/types.h /usr/include/i386/types.h \ /usr/include/stdio.h /usr/include/string.h /usr/include/ctype.h \ /usr/include/runetype.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/limits.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/syslimits.h \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/i386/limits.h /usr/include/i386/_limits.h \ /usr/include/sys/syslimits.h /usr/include/errno.h \ /usr/include/sys/errno.h /usr/include/sys/types.h \ /usr/include/sys/timeb.h /usr/include/time.h \ /usr/include/machine/_limits.h /usr/include/sys/socket.h \ /usr/include/machine/param.h /usr/include/i386/param.h \ /usr/include/strings.h /usr/include/sys/time.h \ /usr/include/netinet/in.h /usr/include/netinet6/in6.h \ /usr/include/netinet/tcp.h /usr/include/arpa/inet.h \ /usr/include/sys/param.h /usr/include/netdb.h /usr/include/unistd.h \ /usr/include/sys/unistd.h /usr/include/sys/select.h \ /usr/include/signal.h /usr/include/fcntl.h /usr/include/sys/fcntl.h \ /usr/include/math.h /usr/include/architecture/i386/math.h soapH.h: soapStub.h: ../../../soapcpp2/stdsoap2.h: ../../../config.h: /usr/include/stdlib.h: /usr/include/sys/cdefs.h: /usr/include/_types.h: /usr/include/sys/_types.h: /usr/include/machine/_types.h: /usr/include/i386/_types.h: /usr/include/sys/wait.h: /usr/include/sys/signal.h: /usr/include/sys/appleapiopts.h: /usr/include/machine/signal.h: /usr/include/i386/signal.h: /usr/include/sys/resource.h: /usr/include/machine/endian.h: /usr/include/i386/endian.h: /usr/include/sys/_endian.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdint.h: /usr/include/libkern/OSByteOrder.h: /usr/include/libkern/i386/OSByteOrder.h: /usr/include/alloca.h: /usr/include/machine/types.h: /usr/include/i386/types.h: /usr/include/stdio.h: /usr/include/string.h: /usr/include/ctype.h: /usr/include/runetype.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/limits.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/syslimits.h: /usr/include/limits.h: /usr/include/machine/limits.h: /usr/include/i386/limits.h: /usr/include/i386/_limits.h: /usr/include/sys/syslimits.h: /usr/include/errno.h: /usr/include/sys/errno.h: /usr/include/sys/types.h: /usr/include/sys/timeb.h: /usr/include/time.h: /usr/include/machine/_limits.h: /usr/include/sys/socket.h: /usr/include/machine/param.h: /usr/include/i386/param.h: /usr/include/strings.h: /usr/include/sys/time.h: /usr/include/netinet/in.h: /usr/include/netinet6/in6.h: /usr/include/netinet/tcp.h: /usr/include/arpa/inet.h: /usr/include/sys/param.h: /usr/include/netdb.h: /usr/include/unistd.h: /usr/include/sys/unistd.h: /usr/include/sys/select.h: /usr/include/signal.h: /usr/include/fcntl.h: /usr/include/sys/fcntl.h: /usr/include/math.h: /usr/include/architecture/i386/math.h: gsoap-2.8.91/gsoap/samples/ssl/.deps/sslserver-thread_setup.Po0000644000175000017500000004202313525245163023677 0ustar ellertellertsslserver-thread_setup.o: thread_setup.c ../../../gsoap/plugin/threads.h \ ../../../gsoap/stdsoap2.h ../../../config.h /usr/include/stdlib.h \ /usr/include/Availability.h /usr/include/AvailabilityInternal.h \ /usr/include/_types.h /usr/include/sys/_types.h \ /usr/include/sys/cdefs.h /usr/include/sys/_symbol_aliasing.h \ /usr/include/sys/_posix_availability.h /usr/include/machine/_types.h \ /usr/include/i386/_types.h /usr/include/sys/_pthread/_pthread_types.h \ /usr/include/sys/wait.h /usr/include/sys/_types/_pid_t.h \ /usr/include/sys/_types/_id_t.h /usr/include/sys/signal.h \ /usr/include/sys/appleapiopts.h /usr/include/machine/signal.h \ /usr/include/i386/signal.h /usr/include/machine/_mcontext.h \ /usr/include/i386/_mcontext.h /usr/include/mach/i386/_structs.h \ /usr/include/sys/_pthread/_pthread_attr_t.h \ /usr/include/sys/_types/_sigaltstack.h \ /usr/include/sys/_types/_ucontext.h \ /usr/include/sys/_types/_sigset_t.h /usr/include/sys/_types/_size_t.h \ /usr/include/sys/_types/_uid_t.h /usr/include/sys/resource.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/stdint.h \ /usr/include/stdint.h /usr/include/sys/_types/_int8_t.h \ /usr/include/sys/_types/_int16_t.h /usr/include/sys/_types/_int32_t.h \ /usr/include/sys/_types/_int64_t.h /usr/include/_types/_uint8_t.h \ /usr/include/_types/_uint16_t.h /usr/include/_types/_uint32_t.h \ /usr/include/_types/_uint64_t.h /usr/include/sys/_types/_intptr_t.h \ /usr/include/sys/_types/_uintptr_t.h /usr/include/_types/_intmax_t.h \ /usr/include/_types/_uintmax_t.h /usr/include/sys/_types/_timeval.h \ /usr/include/machine/endian.h /usr/include/i386/endian.h \ /usr/include/sys/_endian.h /usr/include/libkern/_OSByteOrder.h \ /usr/include/libkern/i386/_OSByteOrder.h /usr/include/alloca.h \ /usr/include/sys/_types/_ct_rune_t.h /usr/include/sys/_types/_rune_t.h \ /usr/include/sys/_types/_wchar_t.h /usr/include/sys/_types/_null.h \ /usr/include/machine/types.h /usr/include/i386/types.h \ /usr/include/sys/_types/_u_int8_t.h \ /usr/include/sys/_types/_u_int16_t.h \ /usr/include/sys/_types/_u_int32_t.h \ /usr/include/sys/_types/_u_int64_t.h /usr/include/sys/_types/_dev_t.h \ /usr/include/sys/_types/_mode_t.h /usr/include/stdio.h \ /usr/include/sys/_types/_va_list.h /usr/include/sys/stdio.h \ /usr/include/sys/_types/_off_t.h /usr/include/sys/_types/_ssize_t.h \ /usr/include/secure/_stdio.h /usr/include/secure/_common.h \ /usr/include/string.h /usr/include/sys/_types/_rsize_t.h \ /usr/include/sys/_types/_errno_t.h /usr/include/strings.h \ /usr/include/secure/_string.h /usr/include/ctype.h \ /usr/include/runetype.h /usr/include/sys/_types/_wint_t.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/limits.h \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/i386/limits.h /usr/include/i386/_limits.h \ /usr/include/sys/syslimits.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/float.h \ /usr/include/math.h /usr/include/locale.h /usr/include/_locale.h \ /usr/include/xlocale.h /usr/include/_xlocale.h \ /usr/include/xlocale/_ctype.h /usr/include/xlocale/_stdio.h \ /usr/include/xlocale/_stdlib.h /usr/include/xlocale/_string.h \ /usr/include/poll.h /usr/include/sys/poll.h /usr/include/errno.h \ /usr/include/sys/errno.h /usr/include/sys/types.h \ /usr/include/sys/_types/_blkcnt_t.h \ /usr/include/sys/_types/_blksize_t.h /usr/include/sys/_types/_gid_t.h \ /usr/include/sys/_types/_in_addr_t.h \ /usr/include/sys/_types/_in_port_t.h /usr/include/sys/_types/_ino_t.h \ /usr/include/sys/_types/_ino64_t.h /usr/include/sys/_types/_key_t.h \ /usr/include/sys/_types/_nlink_t.h /usr/include/sys/_types/_clock_t.h \ /usr/include/sys/_types/_time_t.h \ /usr/include/sys/_types/_useconds_t.h \ /usr/include/sys/_types/_suseconds_t.h \ /usr/include/sys/_types/_fd_def.h \ /usr/include/sys/_types/_fd_setsize.h \ /usr/include/sys/_types/_fd_set.h /usr/include/sys/_types/_fd_clr.h \ /usr/include/sys/_types/_fd_zero.h /usr/include/sys/_types/_fd_isset.h \ /usr/include/sys/_types/_fd_copy.h \ /usr/include/sys/_pthread/_pthread_cond_t.h \ /usr/include/sys/_pthread/_pthread_condattr_t.h \ /usr/include/sys/_pthread/_pthread_mutex_t.h \ /usr/include/sys/_pthread/_pthread_mutexattr_t.h \ /usr/include/sys/_pthread/_pthread_once_t.h \ /usr/include/sys/_pthread/_pthread_rwlock_t.h \ /usr/include/sys/_pthread/_pthread_rwlockattr_t.h \ /usr/include/sys/_pthread/_pthread_t.h \ /usr/include/sys/_pthread/_pthread_key_t.h \ /usr/include/sys/_types/_fsblkcnt_t.h \ /usr/include/sys/_types/_fsfilcnt_t.h /usr/include/sys/timeb.h \ /usr/include/time.h /usr/include/sys/_types/_timespec.h \ /usr/include/xlocale/_time.h /usr/include/sys/time.h \ /usr/include/sys/_types/_timeval64.h /usr/include/sys/_select.h \ /usr/include/sys/socket.h /usr/include/machine/_param.h \ /usr/include/i386/_param.h /usr/include/net/net_kev.h \ /usr/include/sys/_types/_sa_family_t.h \ /usr/include/sys/_types/_socklen_t.h \ /usr/include/sys/_types/_iovec_t.h /usr/include/netinet/in.h \ /usr/include/netinet6/in6.h /usr/include/netinet/tcp.h \ /usr/include/arpa/inet.h /usr/include/netdb.h /usr/include/unistd.h \ /usr/include/sys/unistd.h /usr/include/sys/_types/_posix_vdisable.h \ /usr/include/sys/_types/_seek_set.h /usr/include/sys/select.h \ /usr/include/sys/_types/_uuid_t.h /usr/include/gethostuuid.h \ /usr/include/fcntl.h /usr/include/sys/fcntl.h \ /usr/include/sys/_types/_o_sync.h /usr/include/sys/_types/_o_dsync.h \ /usr/include/sys/_types/_s_ifmt.h /usr/include/sys/_types/_filesec_t.h \ /usr/local/opt/openssl/include/openssl/bio.h \ /usr/local/opt/openssl/include/openssl/e_os2.h \ /usr/local/opt/openssl/include/openssl/opensslconf.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/stdarg.h \ /usr/local/opt/openssl/include/openssl/crypto.h \ /usr/local/opt/openssl/include/openssl/stack.h \ /usr/local/opt/openssl/include/openssl/safestack.h \ /usr/local/opt/openssl/include/openssl/opensslv.h \ /usr/local/opt/openssl/include/openssl/ossl_typ.h \ /usr/local/opt/openssl/include/openssl/symhacks.h \ /usr/local/opt/openssl/include/openssl/err.h \ /usr/local/opt/openssl/include/openssl/lhash.h \ /usr/local/opt/openssl/include/openssl/rand.h \ /usr/local/opt/openssl/include/openssl/ssl.h \ /usr/local/opt/openssl/include/openssl/comp.h \ /usr/local/opt/openssl/include/openssl/x509.h \ /usr/local/opt/openssl/include/openssl/buffer.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/stddef.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/__stddef_max_align_t.h \ /usr/local/opt/openssl/include/openssl/evp.h \ /usr/local/opt/openssl/include/openssl/objects.h \ /usr/local/opt/openssl/include/openssl/obj_mac.h \ /usr/local/opt/openssl/include/openssl/asn1.h \ /usr/local/opt/openssl/include/openssl/bn.h \ /usr/local/opt/openssl/include/openssl/ec.h \ /usr/local/opt/openssl/include/openssl/ecdsa.h \ /usr/local/opt/openssl/include/openssl/ecdh.h \ /usr/local/opt/openssl/include/openssl/rsa.h \ /usr/local/opt/openssl/include/openssl/dsa.h \ /usr/local/opt/openssl/include/openssl/dh.h \ /usr/local/opt/openssl/include/openssl/sha.h \ /usr/local/opt/openssl/include/openssl/x509_vfy.h \ /usr/local/opt/openssl/include/openssl/pkcs7.h \ /usr/local/opt/openssl/include/openssl/pem.h \ /usr/local/opt/openssl/include/openssl/pem2.h \ /usr/local/opt/openssl/include/openssl/hmac.h \ /usr/local/opt/openssl/include/openssl/kssl.h \ /usr/local/opt/openssl/include/openssl/ssl2.h \ /usr/local/opt/openssl/include/openssl/ssl3.h \ /usr/local/opt/openssl/include/openssl/tls1.h \ /usr/local/opt/openssl/include/openssl/dtls1.h \ /usr/local/opt/openssl/include/openssl/pqueue.h \ /usr/local/opt/openssl/include/openssl/ssl23.h \ /usr/local/opt/openssl/include/openssl/srtp.h \ /usr/local/opt/openssl/include/openssl/x509v3.h \ /usr/local/opt/openssl/include/openssl/conf.h /usr/include/zlib.h \ /usr/include/zconf.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/inttypes.h \ /usr/include/inttypes.h /usr/include/xlocale/_inttypes.h \ /usr/include/pthread.h /usr/include/pthread/pthread_impl.h \ /usr/include/pthread/sched.h /usr/include/pthread/qos.h \ /usr/include/sys/qos.h /usr/include/sys/_types/_mach_port_t.h ../../../gsoap/plugin/threads.h: ../../../gsoap/stdsoap2.h: ../../../config.h: /usr/include/stdlib.h: /usr/include/Availability.h: /usr/include/AvailabilityInternal.h: /usr/include/_types.h: /usr/include/sys/_types.h: /usr/include/sys/cdefs.h: /usr/include/sys/_symbol_aliasing.h: /usr/include/sys/_posix_availability.h: /usr/include/machine/_types.h: /usr/include/i386/_types.h: /usr/include/sys/_pthread/_pthread_types.h: /usr/include/sys/wait.h: /usr/include/sys/_types/_pid_t.h: /usr/include/sys/_types/_id_t.h: /usr/include/sys/signal.h: /usr/include/sys/appleapiopts.h: /usr/include/machine/signal.h: /usr/include/i386/signal.h: /usr/include/machine/_mcontext.h: /usr/include/i386/_mcontext.h: /usr/include/mach/i386/_structs.h: /usr/include/sys/_pthread/_pthread_attr_t.h: /usr/include/sys/_types/_sigaltstack.h: /usr/include/sys/_types/_ucontext.h: /usr/include/sys/_types/_sigset_t.h: /usr/include/sys/_types/_size_t.h: /usr/include/sys/_types/_uid_t.h: /usr/include/sys/resource.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/stdint.h: /usr/include/stdint.h: /usr/include/sys/_types/_int8_t.h: /usr/include/sys/_types/_int16_t.h: /usr/include/sys/_types/_int32_t.h: /usr/include/sys/_types/_int64_t.h: /usr/include/_types/_uint8_t.h: /usr/include/_types/_uint16_t.h: /usr/include/_types/_uint32_t.h: /usr/include/_types/_uint64_t.h: /usr/include/sys/_types/_intptr_t.h: /usr/include/sys/_types/_uintptr_t.h: /usr/include/_types/_intmax_t.h: /usr/include/_types/_uintmax_t.h: /usr/include/sys/_types/_timeval.h: /usr/include/machine/endian.h: /usr/include/i386/endian.h: /usr/include/sys/_endian.h: /usr/include/libkern/_OSByteOrder.h: /usr/include/libkern/i386/_OSByteOrder.h: /usr/include/alloca.h: /usr/include/sys/_types/_ct_rune_t.h: /usr/include/sys/_types/_rune_t.h: /usr/include/sys/_types/_wchar_t.h: /usr/include/sys/_types/_null.h: /usr/include/machine/types.h: /usr/include/i386/types.h: /usr/include/sys/_types/_u_int8_t.h: /usr/include/sys/_types/_u_int16_t.h: /usr/include/sys/_types/_u_int32_t.h: /usr/include/sys/_types/_u_int64_t.h: /usr/include/sys/_types/_dev_t.h: /usr/include/sys/_types/_mode_t.h: /usr/include/stdio.h: /usr/include/sys/_types/_va_list.h: /usr/include/sys/stdio.h: /usr/include/sys/_types/_off_t.h: /usr/include/sys/_types/_ssize_t.h: /usr/include/secure/_stdio.h: /usr/include/secure/_common.h: /usr/include/string.h: /usr/include/sys/_types/_rsize_t.h: /usr/include/sys/_types/_errno_t.h: /usr/include/strings.h: /usr/include/secure/_string.h: /usr/include/ctype.h: /usr/include/runetype.h: /usr/include/sys/_types/_wint_t.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/limits.h: /usr/include/limits.h: /usr/include/machine/limits.h: /usr/include/i386/limits.h: /usr/include/i386/_limits.h: /usr/include/sys/syslimits.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/float.h: /usr/include/math.h: /usr/include/locale.h: /usr/include/_locale.h: /usr/include/xlocale.h: /usr/include/_xlocale.h: /usr/include/xlocale/_ctype.h: /usr/include/xlocale/_stdio.h: /usr/include/xlocale/_stdlib.h: /usr/include/xlocale/_string.h: /usr/include/poll.h: /usr/include/sys/poll.h: /usr/include/errno.h: /usr/include/sys/errno.h: /usr/include/sys/types.h: /usr/include/sys/_types/_blkcnt_t.h: /usr/include/sys/_types/_blksize_t.h: /usr/include/sys/_types/_gid_t.h: /usr/include/sys/_types/_in_addr_t.h: /usr/include/sys/_types/_in_port_t.h: /usr/include/sys/_types/_ino_t.h: /usr/include/sys/_types/_ino64_t.h: /usr/include/sys/_types/_key_t.h: /usr/include/sys/_types/_nlink_t.h: /usr/include/sys/_types/_clock_t.h: /usr/include/sys/_types/_time_t.h: /usr/include/sys/_types/_useconds_t.h: /usr/include/sys/_types/_suseconds_t.h: /usr/include/sys/_types/_fd_def.h: /usr/include/sys/_types/_fd_setsize.h: /usr/include/sys/_types/_fd_set.h: /usr/include/sys/_types/_fd_clr.h: /usr/include/sys/_types/_fd_zero.h: /usr/include/sys/_types/_fd_isset.h: /usr/include/sys/_types/_fd_copy.h: /usr/include/sys/_pthread/_pthread_cond_t.h: /usr/include/sys/_pthread/_pthread_condattr_t.h: /usr/include/sys/_pthread/_pthread_mutex_t.h: /usr/include/sys/_pthread/_pthread_mutexattr_t.h: /usr/include/sys/_pthread/_pthread_once_t.h: /usr/include/sys/_pthread/_pthread_rwlock_t.h: /usr/include/sys/_pthread/_pthread_rwlockattr_t.h: /usr/include/sys/_pthread/_pthread_t.h: /usr/include/sys/_pthread/_pthread_key_t.h: /usr/include/sys/_types/_fsblkcnt_t.h: /usr/include/sys/_types/_fsfilcnt_t.h: /usr/include/sys/timeb.h: /usr/include/time.h: /usr/include/sys/_types/_timespec.h: /usr/include/xlocale/_time.h: /usr/include/sys/time.h: /usr/include/sys/_types/_timeval64.h: /usr/include/sys/_select.h: /usr/include/sys/socket.h: /usr/include/machine/_param.h: /usr/include/i386/_param.h: /usr/include/net/net_kev.h: /usr/include/sys/_types/_sa_family_t.h: /usr/include/sys/_types/_socklen_t.h: /usr/include/sys/_types/_iovec_t.h: /usr/include/netinet/in.h: /usr/include/netinet6/in6.h: /usr/include/netinet/tcp.h: /usr/include/arpa/inet.h: /usr/include/netdb.h: /usr/include/unistd.h: /usr/include/sys/unistd.h: /usr/include/sys/_types/_posix_vdisable.h: /usr/include/sys/_types/_seek_set.h: /usr/include/sys/select.h: /usr/include/sys/_types/_uuid_t.h: /usr/include/gethostuuid.h: /usr/include/fcntl.h: /usr/include/sys/fcntl.h: /usr/include/sys/_types/_o_sync.h: /usr/include/sys/_types/_o_dsync.h: /usr/include/sys/_types/_s_ifmt.h: /usr/include/sys/_types/_filesec_t.h: /usr/local/opt/openssl/include/openssl/bio.h: /usr/local/opt/openssl/include/openssl/e_os2.h: /usr/local/opt/openssl/include/openssl/opensslconf.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/stdarg.h: /usr/local/opt/openssl/include/openssl/crypto.h: /usr/local/opt/openssl/include/openssl/stack.h: /usr/local/opt/openssl/include/openssl/safestack.h: /usr/local/opt/openssl/include/openssl/opensslv.h: /usr/local/opt/openssl/include/openssl/ossl_typ.h: /usr/local/opt/openssl/include/openssl/symhacks.h: /usr/local/opt/openssl/include/openssl/err.h: /usr/local/opt/openssl/include/openssl/lhash.h: /usr/local/opt/openssl/include/openssl/rand.h: /usr/local/opt/openssl/include/openssl/ssl.h: /usr/local/opt/openssl/include/openssl/comp.h: /usr/local/opt/openssl/include/openssl/x509.h: /usr/local/opt/openssl/include/openssl/buffer.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/stddef.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/__stddef_max_align_t.h: /usr/local/opt/openssl/include/openssl/evp.h: /usr/local/opt/openssl/include/openssl/objects.h: /usr/local/opt/openssl/include/openssl/obj_mac.h: /usr/local/opt/openssl/include/openssl/asn1.h: /usr/local/opt/openssl/include/openssl/bn.h: /usr/local/opt/openssl/include/openssl/ec.h: /usr/local/opt/openssl/include/openssl/ecdsa.h: /usr/local/opt/openssl/include/openssl/ecdh.h: /usr/local/opt/openssl/include/openssl/rsa.h: /usr/local/opt/openssl/include/openssl/dsa.h: /usr/local/opt/openssl/include/openssl/dh.h: /usr/local/opt/openssl/include/openssl/sha.h: /usr/local/opt/openssl/include/openssl/x509_vfy.h: /usr/local/opt/openssl/include/openssl/pkcs7.h: /usr/local/opt/openssl/include/openssl/pem.h: /usr/local/opt/openssl/include/openssl/pem2.h: /usr/local/opt/openssl/include/openssl/hmac.h: /usr/local/opt/openssl/include/openssl/kssl.h: /usr/local/opt/openssl/include/openssl/ssl2.h: /usr/local/opt/openssl/include/openssl/ssl3.h: /usr/local/opt/openssl/include/openssl/tls1.h: /usr/local/opt/openssl/include/openssl/dtls1.h: /usr/local/opt/openssl/include/openssl/pqueue.h: /usr/local/opt/openssl/include/openssl/ssl23.h: /usr/local/opt/openssl/include/openssl/srtp.h: /usr/local/opt/openssl/include/openssl/x509v3.h: /usr/local/opt/openssl/include/openssl/conf.h: /usr/include/zlib.h: /usr/include/zconf.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/inttypes.h: /usr/include/inttypes.h: /usr/include/xlocale/_inttypes.h: /usr/include/pthread.h: /usr/include/pthread/pthread_impl.h: /usr/include/pthread/sched.h: /usr/include/pthread/qos.h: /usr/include/sys/qos.h: /usr/include/sys/_types/_mach_port_t.h: gsoap-2.8.91/gsoap/samples/ssl/.deps/sslclient-thread_setup.Po0000644000175000017500000004202313525245163023647 0ustar ellertellertsslclient-thread_setup.o: thread_setup.c ../../../gsoap/plugin/threads.h \ ../../../gsoap/stdsoap2.h ../../../config.h /usr/include/stdlib.h \ /usr/include/Availability.h /usr/include/AvailabilityInternal.h \ /usr/include/_types.h /usr/include/sys/_types.h \ /usr/include/sys/cdefs.h /usr/include/sys/_symbol_aliasing.h \ /usr/include/sys/_posix_availability.h /usr/include/machine/_types.h \ /usr/include/i386/_types.h /usr/include/sys/_pthread/_pthread_types.h \ /usr/include/sys/wait.h /usr/include/sys/_types/_pid_t.h \ /usr/include/sys/_types/_id_t.h /usr/include/sys/signal.h \ /usr/include/sys/appleapiopts.h /usr/include/machine/signal.h \ /usr/include/i386/signal.h /usr/include/machine/_mcontext.h \ /usr/include/i386/_mcontext.h /usr/include/mach/i386/_structs.h \ /usr/include/sys/_pthread/_pthread_attr_t.h \ /usr/include/sys/_types/_sigaltstack.h \ /usr/include/sys/_types/_ucontext.h \ /usr/include/sys/_types/_sigset_t.h /usr/include/sys/_types/_size_t.h \ /usr/include/sys/_types/_uid_t.h /usr/include/sys/resource.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/stdint.h \ /usr/include/stdint.h /usr/include/sys/_types/_int8_t.h \ /usr/include/sys/_types/_int16_t.h /usr/include/sys/_types/_int32_t.h \ /usr/include/sys/_types/_int64_t.h /usr/include/_types/_uint8_t.h \ /usr/include/_types/_uint16_t.h /usr/include/_types/_uint32_t.h \ /usr/include/_types/_uint64_t.h /usr/include/sys/_types/_intptr_t.h \ /usr/include/sys/_types/_uintptr_t.h /usr/include/_types/_intmax_t.h \ /usr/include/_types/_uintmax_t.h /usr/include/sys/_types/_timeval.h \ /usr/include/machine/endian.h /usr/include/i386/endian.h \ /usr/include/sys/_endian.h /usr/include/libkern/_OSByteOrder.h \ /usr/include/libkern/i386/_OSByteOrder.h /usr/include/alloca.h \ /usr/include/sys/_types/_ct_rune_t.h /usr/include/sys/_types/_rune_t.h \ /usr/include/sys/_types/_wchar_t.h /usr/include/sys/_types/_null.h \ /usr/include/machine/types.h /usr/include/i386/types.h \ /usr/include/sys/_types/_u_int8_t.h \ /usr/include/sys/_types/_u_int16_t.h \ /usr/include/sys/_types/_u_int32_t.h \ /usr/include/sys/_types/_u_int64_t.h /usr/include/sys/_types/_dev_t.h \ /usr/include/sys/_types/_mode_t.h /usr/include/stdio.h \ /usr/include/sys/_types/_va_list.h /usr/include/sys/stdio.h \ /usr/include/sys/_types/_off_t.h /usr/include/sys/_types/_ssize_t.h \ /usr/include/secure/_stdio.h /usr/include/secure/_common.h \ /usr/include/string.h /usr/include/sys/_types/_rsize_t.h \ /usr/include/sys/_types/_errno_t.h /usr/include/strings.h \ /usr/include/secure/_string.h /usr/include/ctype.h \ /usr/include/runetype.h /usr/include/sys/_types/_wint_t.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/limits.h \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/i386/limits.h /usr/include/i386/_limits.h \ /usr/include/sys/syslimits.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/float.h \ /usr/include/math.h /usr/include/locale.h /usr/include/_locale.h \ /usr/include/xlocale.h /usr/include/_xlocale.h \ /usr/include/xlocale/_ctype.h /usr/include/xlocale/_stdio.h \ /usr/include/xlocale/_stdlib.h /usr/include/xlocale/_string.h \ /usr/include/poll.h /usr/include/sys/poll.h /usr/include/errno.h \ /usr/include/sys/errno.h /usr/include/sys/types.h \ /usr/include/sys/_types/_blkcnt_t.h \ /usr/include/sys/_types/_blksize_t.h /usr/include/sys/_types/_gid_t.h \ /usr/include/sys/_types/_in_addr_t.h \ /usr/include/sys/_types/_in_port_t.h /usr/include/sys/_types/_ino_t.h \ /usr/include/sys/_types/_ino64_t.h /usr/include/sys/_types/_key_t.h \ /usr/include/sys/_types/_nlink_t.h /usr/include/sys/_types/_clock_t.h \ /usr/include/sys/_types/_time_t.h \ /usr/include/sys/_types/_useconds_t.h \ /usr/include/sys/_types/_suseconds_t.h \ /usr/include/sys/_types/_fd_def.h \ /usr/include/sys/_types/_fd_setsize.h \ /usr/include/sys/_types/_fd_set.h /usr/include/sys/_types/_fd_clr.h \ /usr/include/sys/_types/_fd_zero.h /usr/include/sys/_types/_fd_isset.h \ /usr/include/sys/_types/_fd_copy.h \ /usr/include/sys/_pthread/_pthread_cond_t.h \ /usr/include/sys/_pthread/_pthread_condattr_t.h \ /usr/include/sys/_pthread/_pthread_mutex_t.h \ /usr/include/sys/_pthread/_pthread_mutexattr_t.h \ /usr/include/sys/_pthread/_pthread_once_t.h \ /usr/include/sys/_pthread/_pthread_rwlock_t.h \ /usr/include/sys/_pthread/_pthread_rwlockattr_t.h \ /usr/include/sys/_pthread/_pthread_t.h \ /usr/include/sys/_pthread/_pthread_key_t.h \ /usr/include/sys/_types/_fsblkcnt_t.h \ /usr/include/sys/_types/_fsfilcnt_t.h /usr/include/sys/timeb.h \ /usr/include/time.h /usr/include/sys/_types/_timespec.h \ /usr/include/xlocale/_time.h /usr/include/sys/time.h \ /usr/include/sys/_types/_timeval64.h /usr/include/sys/_select.h \ /usr/include/sys/socket.h /usr/include/machine/_param.h \ /usr/include/i386/_param.h /usr/include/net/net_kev.h \ /usr/include/sys/_types/_sa_family_t.h \ /usr/include/sys/_types/_socklen_t.h \ /usr/include/sys/_types/_iovec_t.h /usr/include/netinet/in.h \ /usr/include/netinet6/in6.h /usr/include/netinet/tcp.h \ /usr/include/arpa/inet.h /usr/include/netdb.h /usr/include/unistd.h \ /usr/include/sys/unistd.h /usr/include/sys/_types/_posix_vdisable.h \ /usr/include/sys/_types/_seek_set.h /usr/include/sys/select.h \ /usr/include/sys/_types/_uuid_t.h /usr/include/gethostuuid.h \ /usr/include/fcntl.h /usr/include/sys/fcntl.h \ /usr/include/sys/_types/_o_sync.h /usr/include/sys/_types/_o_dsync.h \ /usr/include/sys/_types/_s_ifmt.h /usr/include/sys/_types/_filesec_t.h \ /usr/local/opt/openssl/include/openssl/bio.h \ /usr/local/opt/openssl/include/openssl/e_os2.h \ /usr/local/opt/openssl/include/openssl/opensslconf.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/stdarg.h \ /usr/local/opt/openssl/include/openssl/crypto.h \ /usr/local/opt/openssl/include/openssl/stack.h \ /usr/local/opt/openssl/include/openssl/safestack.h \ /usr/local/opt/openssl/include/openssl/opensslv.h \ /usr/local/opt/openssl/include/openssl/ossl_typ.h \ /usr/local/opt/openssl/include/openssl/symhacks.h \ /usr/local/opt/openssl/include/openssl/err.h \ /usr/local/opt/openssl/include/openssl/lhash.h \ /usr/local/opt/openssl/include/openssl/rand.h \ /usr/local/opt/openssl/include/openssl/ssl.h \ /usr/local/opt/openssl/include/openssl/comp.h \ /usr/local/opt/openssl/include/openssl/x509.h \ /usr/local/opt/openssl/include/openssl/buffer.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/stddef.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/__stddef_max_align_t.h \ /usr/local/opt/openssl/include/openssl/evp.h \ /usr/local/opt/openssl/include/openssl/objects.h \ /usr/local/opt/openssl/include/openssl/obj_mac.h \ /usr/local/opt/openssl/include/openssl/asn1.h \ /usr/local/opt/openssl/include/openssl/bn.h \ /usr/local/opt/openssl/include/openssl/ec.h \ /usr/local/opt/openssl/include/openssl/ecdsa.h \ /usr/local/opt/openssl/include/openssl/ecdh.h \ /usr/local/opt/openssl/include/openssl/rsa.h \ /usr/local/opt/openssl/include/openssl/dsa.h \ /usr/local/opt/openssl/include/openssl/dh.h \ /usr/local/opt/openssl/include/openssl/sha.h \ /usr/local/opt/openssl/include/openssl/x509_vfy.h \ /usr/local/opt/openssl/include/openssl/pkcs7.h \ /usr/local/opt/openssl/include/openssl/pem.h \ /usr/local/opt/openssl/include/openssl/pem2.h \ /usr/local/opt/openssl/include/openssl/hmac.h \ /usr/local/opt/openssl/include/openssl/kssl.h \ /usr/local/opt/openssl/include/openssl/ssl2.h \ /usr/local/opt/openssl/include/openssl/ssl3.h \ /usr/local/opt/openssl/include/openssl/tls1.h \ /usr/local/opt/openssl/include/openssl/dtls1.h \ /usr/local/opt/openssl/include/openssl/pqueue.h \ /usr/local/opt/openssl/include/openssl/ssl23.h \ /usr/local/opt/openssl/include/openssl/srtp.h \ /usr/local/opt/openssl/include/openssl/x509v3.h \ /usr/local/opt/openssl/include/openssl/conf.h /usr/include/zlib.h \ /usr/include/zconf.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/inttypes.h \ /usr/include/inttypes.h /usr/include/xlocale/_inttypes.h \ /usr/include/pthread.h /usr/include/pthread/pthread_impl.h \ /usr/include/pthread/sched.h /usr/include/pthread/qos.h \ /usr/include/sys/qos.h /usr/include/sys/_types/_mach_port_t.h ../../../gsoap/plugin/threads.h: ../../../gsoap/stdsoap2.h: ../../../config.h: /usr/include/stdlib.h: /usr/include/Availability.h: /usr/include/AvailabilityInternal.h: /usr/include/_types.h: /usr/include/sys/_types.h: /usr/include/sys/cdefs.h: /usr/include/sys/_symbol_aliasing.h: /usr/include/sys/_posix_availability.h: /usr/include/machine/_types.h: /usr/include/i386/_types.h: /usr/include/sys/_pthread/_pthread_types.h: /usr/include/sys/wait.h: /usr/include/sys/_types/_pid_t.h: /usr/include/sys/_types/_id_t.h: /usr/include/sys/signal.h: /usr/include/sys/appleapiopts.h: /usr/include/machine/signal.h: /usr/include/i386/signal.h: /usr/include/machine/_mcontext.h: /usr/include/i386/_mcontext.h: /usr/include/mach/i386/_structs.h: /usr/include/sys/_pthread/_pthread_attr_t.h: /usr/include/sys/_types/_sigaltstack.h: /usr/include/sys/_types/_ucontext.h: /usr/include/sys/_types/_sigset_t.h: /usr/include/sys/_types/_size_t.h: /usr/include/sys/_types/_uid_t.h: /usr/include/sys/resource.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/stdint.h: /usr/include/stdint.h: /usr/include/sys/_types/_int8_t.h: /usr/include/sys/_types/_int16_t.h: /usr/include/sys/_types/_int32_t.h: /usr/include/sys/_types/_int64_t.h: /usr/include/_types/_uint8_t.h: /usr/include/_types/_uint16_t.h: /usr/include/_types/_uint32_t.h: /usr/include/_types/_uint64_t.h: /usr/include/sys/_types/_intptr_t.h: /usr/include/sys/_types/_uintptr_t.h: /usr/include/_types/_intmax_t.h: /usr/include/_types/_uintmax_t.h: /usr/include/sys/_types/_timeval.h: /usr/include/machine/endian.h: /usr/include/i386/endian.h: /usr/include/sys/_endian.h: /usr/include/libkern/_OSByteOrder.h: /usr/include/libkern/i386/_OSByteOrder.h: /usr/include/alloca.h: /usr/include/sys/_types/_ct_rune_t.h: /usr/include/sys/_types/_rune_t.h: /usr/include/sys/_types/_wchar_t.h: /usr/include/sys/_types/_null.h: /usr/include/machine/types.h: /usr/include/i386/types.h: /usr/include/sys/_types/_u_int8_t.h: /usr/include/sys/_types/_u_int16_t.h: /usr/include/sys/_types/_u_int32_t.h: /usr/include/sys/_types/_u_int64_t.h: /usr/include/sys/_types/_dev_t.h: /usr/include/sys/_types/_mode_t.h: /usr/include/stdio.h: /usr/include/sys/_types/_va_list.h: /usr/include/sys/stdio.h: /usr/include/sys/_types/_off_t.h: /usr/include/sys/_types/_ssize_t.h: /usr/include/secure/_stdio.h: /usr/include/secure/_common.h: /usr/include/string.h: /usr/include/sys/_types/_rsize_t.h: /usr/include/sys/_types/_errno_t.h: /usr/include/strings.h: /usr/include/secure/_string.h: /usr/include/ctype.h: /usr/include/runetype.h: /usr/include/sys/_types/_wint_t.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/limits.h: /usr/include/limits.h: /usr/include/machine/limits.h: /usr/include/i386/limits.h: /usr/include/i386/_limits.h: /usr/include/sys/syslimits.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/float.h: /usr/include/math.h: /usr/include/locale.h: /usr/include/_locale.h: /usr/include/xlocale.h: /usr/include/_xlocale.h: /usr/include/xlocale/_ctype.h: /usr/include/xlocale/_stdio.h: /usr/include/xlocale/_stdlib.h: /usr/include/xlocale/_string.h: /usr/include/poll.h: /usr/include/sys/poll.h: /usr/include/errno.h: /usr/include/sys/errno.h: /usr/include/sys/types.h: /usr/include/sys/_types/_blkcnt_t.h: /usr/include/sys/_types/_blksize_t.h: /usr/include/sys/_types/_gid_t.h: /usr/include/sys/_types/_in_addr_t.h: /usr/include/sys/_types/_in_port_t.h: /usr/include/sys/_types/_ino_t.h: /usr/include/sys/_types/_ino64_t.h: /usr/include/sys/_types/_key_t.h: /usr/include/sys/_types/_nlink_t.h: /usr/include/sys/_types/_clock_t.h: /usr/include/sys/_types/_time_t.h: /usr/include/sys/_types/_useconds_t.h: /usr/include/sys/_types/_suseconds_t.h: /usr/include/sys/_types/_fd_def.h: /usr/include/sys/_types/_fd_setsize.h: /usr/include/sys/_types/_fd_set.h: /usr/include/sys/_types/_fd_clr.h: /usr/include/sys/_types/_fd_zero.h: /usr/include/sys/_types/_fd_isset.h: /usr/include/sys/_types/_fd_copy.h: /usr/include/sys/_pthread/_pthread_cond_t.h: /usr/include/sys/_pthread/_pthread_condattr_t.h: /usr/include/sys/_pthread/_pthread_mutex_t.h: /usr/include/sys/_pthread/_pthread_mutexattr_t.h: /usr/include/sys/_pthread/_pthread_once_t.h: /usr/include/sys/_pthread/_pthread_rwlock_t.h: /usr/include/sys/_pthread/_pthread_rwlockattr_t.h: /usr/include/sys/_pthread/_pthread_t.h: /usr/include/sys/_pthread/_pthread_key_t.h: /usr/include/sys/_types/_fsblkcnt_t.h: /usr/include/sys/_types/_fsfilcnt_t.h: /usr/include/sys/timeb.h: /usr/include/time.h: /usr/include/sys/_types/_timespec.h: /usr/include/xlocale/_time.h: /usr/include/sys/time.h: /usr/include/sys/_types/_timeval64.h: /usr/include/sys/_select.h: /usr/include/sys/socket.h: /usr/include/machine/_param.h: /usr/include/i386/_param.h: /usr/include/net/net_kev.h: /usr/include/sys/_types/_sa_family_t.h: /usr/include/sys/_types/_socklen_t.h: /usr/include/sys/_types/_iovec_t.h: /usr/include/netinet/in.h: /usr/include/netinet6/in6.h: /usr/include/netinet/tcp.h: /usr/include/arpa/inet.h: /usr/include/netdb.h: /usr/include/unistd.h: /usr/include/sys/unistd.h: /usr/include/sys/_types/_posix_vdisable.h: /usr/include/sys/_types/_seek_set.h: /usr/include/sys/select.h: /usr/include/sys/_types/_uuid_t.h: /usr/include/gethostuuid.h: /usr/include/fcntl.h: /usr/include/sys/fcntl.h: /usr/include/sys/_types/_o_sync.h: /usr/include/sys/_types/_o_dsync.h: /usr/include/sys/_types/_s_ifmt.h: /usr/include/sys/_types/_filesec_t.h: /usr/local/opt/openssl/include/openssl/bio.h: /usr/local/opt/openssl/include/openssl/e_os2.h: /usr/local/opt/openssl/include/openssl/opensslconf.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/stdarg.h: /usr/local/opt/openssl/include/openssl/crypto.h: /usr/local/opt/openssl/include/openssl/stack.h: /usr/local/opt/openssl/include/openssl/safestack.h: /usr/local/opt/openssl/include/openssl/opensslv.h: /usr/local/opt/openssl/include/openssl/ossl_typ.h: /usr/local/opt/openssl/include/openssl/symhacks.h: /usr/local/opt/openssl/include/openssl/err.h: /usr/local/opt/openssl/include/openssl/lhash.h: /usr/local/opt/openssl/include/openssl/rand.h: /usr/local/opt/openssl/include/openssl/ssl.h: /usr/local/opt/openssl/include/openssl/comp.h: /usr/local/opt/openssl/include/openssl/x509.h: /usr/local/opt/openssl/include/openssl/buffer.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/stddef.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/__stddef_max_align_t.h: /usr/local/opt/openssl/include/openssl/evp.h: /usr/local/opt/openssl/include/openssl/objects.h: /usr/local/opt/openssl/include/openssl/obj_mac.h: /usr/local/opt/openssl/include/openssl/asn1.h: /usr/local/opt/openssl/include/openssl/bn.h: /usr/local/opt/openssl/include/openssl/ec.h: /usr/local/opt/openssl/include/openssl/ecdsa.h: /usr/local/opt/openssl/include/openssl/ecdh.h: /usr/local/opt/openssl/include/openssl/rsa.h: /usr/local/opt/openssl/include/openssl/dsa.h: /usr/local/opt/openssl/include/openssl/dh.h: /usr/local/opt/openssl/include/openssl/sha.h: /usr/local/opt/openssl/include/openssl/x509_vfy.h: /usr/local/opt/openssl/include/openssl/pkcs7.h: /usr/local/opt/openssl/include/openssl/pem.h: /usr/local/opt/openssl/include/openssl/pem2.h: /usr/local/opt/openssl/include/openssl/hmac.h: /usr/local/opt/openssl/include/openssl/kssl.h: /usr/local/opt/openssl/include/openssl/ssl2.h: /usr/local/opt/openssl/include/openssl/ssl3.h: /usr/local/opt/openssl/include/openssl/tls1.h: /usr/local/opt/openssl/include/openssl/dtls1.h: /usr/local/opt/openssl/include/openssl/pqueue.h: /usr/local/opt/openssl/include/openssl/ssl23.h: /usr/local/opt/openssl/include/openssl/srtp.h: /usr/local/opt/openssl/include/openssl/x509v3.h: /usr/local/opt/openssl/include/openssl/conf.h: /usr/include/zlib.h: /usr/include/zconf.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/inttypes.h: /usr/include/inttypes.h: /usr/include/xlocale/_inttypes.h: /usr/include/pthread.h: /usr/include/pthread/pthread_impl.h: /usr/include/pthread/sched.h: /usr/include/pthread/qos.h: /usr/include/sys/qos.h: /usr/include/sys/_types/_mach_port_t.h: gsoap-2.8.91/gsoap/samples/ssl/.deps/ssl.Po0000644000175000017500000000001013525245163017751 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/samples/ssl/.deps/sslclient.Po0000644000175000017500000000721313525245163021164 0ustar ellertellertsslclient.o: sslclient.c soapH.h soapStub.h ../../../soapcpp2/stdsoap2.h \ ../../../config.h /usr/include/stdlib.h /usr/include/sys/cdefs.h \ /usr/include/_types.h /usr/include/sys/_types.h \ /usr/include/machine/_types.h /usr/include/i386/_types.h \ /usr/include/sys/wait.h /usr/include/sys/signal.h \ /usr/include/sys/appleapiopts.h /usr/include/machine/signal.h \ /usr/include/i386/signal.h /usr/include/sys/resource.h \ /usr/include/machine/endian.h /usr/include/i386/endian.h \ /usr/include/sys/_endian.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdint.h \ /usr/include/libkern/OSByteOrder.h \ /usr/include/libkern/i386/OSByteOrder.h /usr/include/alloca.h \ /usr/include/machine/types.h /usr/include/i386/types.h \ /usr/include/stdio.h /usr/include/string.h /usr/include/ctype.h \ /usr/include/runetype.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/limits.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/syslimits.h \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/i386/limits.h /usr/include/i386/_limits.h \ /usr/include/sys/syslimits.h /usr/include/errno.h \ /usr/include/sys/errno.h /usr/include/sys/types.h \ /usr/include/sys/timeb.h /usr/include/time.h \ /usr/include/machine/_limits.h /usr/include/sys/socket.h \ /usr/include/machine/param.h /usr/include/i386/param.h \ /usr/include/strings.h /usr/include/sys/time.h \ /usr/include/netinet/in.h /usr/include/netinet6/in6.h \ /usr/include/netinet/tcp.h /usr/include/arpa/inet.h \ /usr/include/sys/param.h /usr/include/netdb.h /usr/include/unistd.h \ /usr/include/sys/unistd.h /usr/include/sys/select.h \ /usr/include/signal.h /usr/include/fcntl.h /usr/include/sys/fcntl.h \ /usr/include/math.h /usr/include/architecture/i386/math.h ssl.nsmap \ /usr/include/pthread.h /usr/include/pthread_impl.h /usr/include/sched.h soapH.h: soapStub.h: ../../../soapcpp2/stdsoap2.h: ../../../config.h: /usr/include/stdlib.h: /usr/include/sys/cdefs.h: /usr/include/_types.h: /usr/include/sys/_types.h: /usr/include/machine/_types.h: /usr/include/i386/_types.h: /usr/include/sys/wait.h: /usr/include/sys/signal.h: /usr/include/sys/appleapiopts.h: /usr/include/machine/signal.h: /usr/include/i386/signal.h: /usr/include/sys/resource.h: /usr/include/machine/endian.h: /usr/include/i386/endian.h: /usr/include/sys/_endian.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdint.h: /usr/include/libkern/OSByteOrder.h: /usr/include/libkern/i386/OSByteOrder.h: /usr/include/alloca.h: /usr/include/machine/types.h: /usr/include/i386/types.h: /usr/include/stdio.h: /usr/include/string.h: /usr/include/ctype.h: /usr/include/runetype.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/limits.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/syslimits.h: /usr/include/limits.h: /usr/include/machine/limits.h: /usr/include/i386/limits.h: /usr/include/i386/_limits.h: /usr/include/sys/syslimits.h: /usr/include/errno.h: /usr/include/sys/errno.h: /usr/include/sys/types.h: /usr/include/sys/timeb.h: /usr/include/time.h: /usr/include/machine/_limits.h: /usr/include/sys/socket.h: /usr/include/machine/param.h: /usr/include/i386/param.h: /usr/include/strings.h: /usr/include/sys/time.h: /usr/include/netinet/in.h: /usr/include/netinet6/in6.h: /usr/include/netinet/tcp.h: /usr/include/arpa/inet.h: /usr/include/sys/param.h: /usr/include/netdb.h: /usr/include/unistd.h: /usr/include/sys/unistd.h: /usr/include/sys/select.h: /usr/include/signal.h: /usr/include/fcntl.h: /usr/include/sys/fcntl.h: /usr/include/math.h: /usr/include/architecture/i386/math.h: ssl.nsmap: /usr/include/pthread.h: /usr/include/pthread_impl.h: /usr/include/sched.h: gsoap-2.8.91/gsoap/samples/ssl/cacerts.c0000644000175000017500000064650113525245163017454 0ustar ellertellert/* cacerts.c Stores CA certificates in memory to replace the use of cacerts.pem Simply replace the call to soap_ssl_client_context() with a call to: soap_ssl_client_cacerts(soap); No cacerts.pem file is needed. gSOAP XML Web services tools Copyright (C) 2000-2018, 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-2018, 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 -------------------------------------------------------------------------------- # Part of the source for this file is provided by Mozilla: # http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 # This file was converted to PEM format with tools provided by OpenSSL. # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cacerts.h" #ifdef __cplusplus extern "C" { #endif int soap_ssl_client_cacerts(struct soap *soap) { extern const char cacert_pem_data[]; const char *data = cacert_pem_data; const char *next = data; int err = SOAP_OK; int max = 0; X509 *cert = NULL; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) const unsigned char *der; #else unsigned char *der; #endif char *buf = NULL; X509_STORE *store; err = soap_ssl_client_context(soap, SOAP_SSL_DEFAULT, NULL, NULL, NULL, NULL, NULL); if (err) return err; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Populating certificate chain\n")); store = SSL_CTX_get_cert_store(soap->ctx); for (;;) { int len; data = strstr(next, "-----BEGIN CERTIFICATE-----"); if (!data) break; data += 27; next = strstr(data, "-----END CERTIFICATE-----"); if (!next) break; len = (next - data + 3) / 4 * 3; if (len > max) { if (buf) SOAP_FREE(soap, buf); buf = (char*)SOAP_MALLOC(soap, len); max = len; } soap_base642s(soap, data, buf, (size_t)len, NULL); der = (unsigned char*)buf; if (cert) { X509_free(cert); cert = NULL; } if (!d2i_X509(&cert, &der, len)) break; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Adding certificate %d bytes\n", len)); if (X509_STORE_add_cert(store, cert) != 1) { char line[80]; (SOAP_SNPRINTF(line, sizeof(line), 32), "At position %lu", (unsigned long)(data - cacert_pem_data)); err = soap_set_receiver_error(soap, line, "SSL add chain certificate failed in soap_ssl_client_cacerts()", SOAP_SSL_ERROR); break; } data = next + 25; } if (buf) SOAP_FREE(soap, buf); if (cert) X509_free(cert); return err; } const char cacert_pem_data[] = "\ GlobalSign Root CA\ ==================\ -----BEGIN CERTIFICATE-----\ MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx\ GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds\ b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV\ BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD\ VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa\ DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc\ THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb\ Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP\ c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX\ gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\ HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF\ AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj\ Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG\ j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH\ hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC\ X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==\ -----END CERTIFICATE-----\ \ GlobalSign Root CA - R2\ =======================\ -----BEGIN CERTIFICATE-----\ MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv\ YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh\ bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT\ aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln\ bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6\ ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp\ s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN\ S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL\ TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C\ ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E\ FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i\ YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN\ BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp\ 9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu\ 01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7\ 9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7\ TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==\ -----END CERTIFICATE-----\ \ Verisign Class 3 Public Primary Certification Authority - G3\ ============================================================\ -----BEGIN CERTIFICATE-----\ MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV\ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv\ cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl\ IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh\ dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw\ CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy\ dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv\ cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg\ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\ ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1\ EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc\ cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw\ EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj\ 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA\ ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f\ j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC\ /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0\ xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa\ t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==\ -----END CERTIFICATE-----\ \ Entrust.net Premium 2048 Secure Server CA\ =========================================\ -----BEGIN CERTIFICATE-----\ MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u\ ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp\ bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV\ BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx\ NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3\ d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl\ MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u\ ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\ MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL\ Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr\ hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW\ nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi\ VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E\ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ\ KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy\ T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf\ zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT\ J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e\ nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE=\ -----END CERTIFICATE-----\ \ Baltimore CyberTrust Root\ =========================\ -----BEGIN CERTIFICATE-----\ MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE\ ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li\ ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC\ SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs\ dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME\ uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB\ UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C\ G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9\ XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr\ l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI\ VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB\ BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh\ cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5\ hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa\ Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H\ RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp\ -----END CERTIFICATE-----\ \ AddTrust External Root\ ======================\ -----BEGIN CERTIFICATE-----\ MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML\ QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD\ VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw\ NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU\ cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg\ Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821\ +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw\ Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo\ aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy\ 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7\ 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P\ BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL\ VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk\ VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB\ IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl\ j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5\ 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355\ e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u\ G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=\ -----END CERTIFICATE-----\ \ Entrust Root Certification Authority\ ====================================\ -----BEGIN CERTIFICATE-----\ MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV\ BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw\ b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG\ A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0\ MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu\ MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu\ Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v\ dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\ ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz\ A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww\ Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68\ j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN\ rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw\ DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1\ MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH\ hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA\ A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM\ Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa\ v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS\ W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0\ tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8\ -----END CERTIFICATE-----\ \ GeoTrust Global CA\ ==================\ -----BEGIN CERTIFICATE-----\ MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK\ Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw\ MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j\ LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\ CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo\ BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet\ 8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc\ T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU\ vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD\ AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk\ DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q\ zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4\ d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2\ mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p\ XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm\ Mw==\ -----END CERTIFICATE-----\ \ GeoTrust Universal CA\ =====================\ -----BEGIN CERTIFICATE-----\ MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN\ R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1\ MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu\ Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP\ ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t\ JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e\ RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs\ 7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d\ 8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V\ qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga\ Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB\ Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu\ KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08\ ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0\ XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB\ hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc\ aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2\ qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL\ oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK\ xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF\ KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2\ DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK\ xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU\ p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI\ P/rmMuGNG2+k5o7Y+SlIis5z/iw=\ -----END CERTIFICATE-----\ \ GeoTrust Universal CA 2\ =======================\ -----BEGIN CERTIFICATE-----\ MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN\ R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0\ MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg\ SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA\ A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0\ DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17\ j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q\ JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a\ QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2\ WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP\ 20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn\ ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC\ SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG\ 8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2\ +/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E\ BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z\ dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ\ 4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+\ mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq\ A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg\ Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP\ pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d\ FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp\ gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm\ X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS\ -----END CERTIFICATE-----\ \ Visa eCommerce Root\ ===================\ -----BEGIN CERTIFICATE-----\ MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG\ EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug\ QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2\ WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm\ VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv\ bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL\ F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b\ RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0\ TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI\ /k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs\ GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG\ MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc\ CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW\ YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz\ zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu\ YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt\ 398znM/jra6O1I7mT1GvFpLgXPYHDw==\ -----END CERTIFICATE-----\ \ Comodo AAA Services root\ ========================\ -----BEGIN CERTIFICATE-----\ MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS\ R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg\ TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw\ MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl\ c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV\ BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\ ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG\ C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs\ i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW\ Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH\ Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK\ Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f\ BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl\ cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz\ LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm\ 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz\ Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z\ 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C\ 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==\ -----END CERTIFICATE-----\ \ QuoVadis Root CA\ ================\ -----BEGIN CERTIFICATE-----\ MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE\ ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0\ eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz\ MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp\ cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD\ EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF\ AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk\ J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL\ F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL\ YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen\ AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w\ PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y\ ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7\ MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj\ YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs\ ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh\ Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW\ Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu\ BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw\ FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0\ aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6\ tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo\ fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul\ LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x\ gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi\ 5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi\ 5nrQNiOKSnQ2+Q==\ -----END CERTIFICATE-----\ \ QuoVadis Root CA 2\ ==================\ -----BEGIN CERTIFICATE-----\ MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT\ EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx\ ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM\ aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC\ DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6\ XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk\ lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB\ lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy\ lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt\ 66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn\ wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh\ D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy\ BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie\ J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud\ DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU\ a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT\ ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv\ Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3\ UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm\ VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK\ +JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW\ IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1\ WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X\ f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II\ 4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8\ VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u\ -----END CERTIFICATE-----\ \ QuoVadis Root CA 3\ ==================\ -----BEGIN CERTIFICATE-----\ MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT\ EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx\ OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM\ aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC\ DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg\ DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij\ KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K\ DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv\ BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp\ p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8\ nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX\ MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM\ Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz\ uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT\ BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj\ YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0\ aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB\ BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD\ VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4\ ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE\ AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV\ qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s\ hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z\ POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2\ Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp\ 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC\ bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu\ g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p\ vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr\ qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=\ -----END CERTIFICATE-----\ \ Security Communication Root CA\ ==============================\ -----BEGIN CERTIFICATE-----\ MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP\ U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw\ HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP\ U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw\ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw\ 8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM\ DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX\ 5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd\ DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2\ JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw\ DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g\ 0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a\ mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ\ s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ\ 6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi\ FL39vmwLAw==\ -----END CERTIFICATE-----\ \ Sonera Class 2 Root CA\ ======================\ -----BEGIN CERTIFICATE-----\ MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG\ U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw\ NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh\ IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3\ /Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT\ dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG\ f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P\ tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH\ nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT\ XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt\ 0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI\ cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph\ Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx\ EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH\ llpwrN9M\ -----END CERTIFICATE-----\ \ XRamp Global CA Root\ ====================\ -----BEGIN CERTIFICATE-----\ MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE\ BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj\ dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB\ dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx\ HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg\ U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp\ dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu\ IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx\ foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE\ zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs\ AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry\ xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud\ EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap\ oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC\ AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc\ /Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt\ qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n\ nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz\ 8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=\ -----END CERTIFICATE-----\ \ Go Daddy Class 2 CA\ ===================\ -----BEGIN CERTIFICATE-----\ MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY\ VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp\ ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG\ A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g\ RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD\ ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv\ 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32\ qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j\ YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY\ vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O\ BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o\ atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu\ MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG\ A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim\ PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt\ I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ\ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI\ Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b\ vZ8=\ -----END CERTIFICATE-----\ \ Starfield Class 2 CA\ ====================\ -----BEGIN CERTIFICATE-----\ MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc\ U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg\ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo\ MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG\ A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG\ SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY\ bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ\ JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm\ epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN\ F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF\ MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f\ hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo\ bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g\ QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs\ afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM\ PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl\ xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD\ KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3\ QBFGmh95DmK/D5fs4C8fF5Q=\ -----END CERTIFICATE-----\ \ Taiwan GRCA\ ===========\ -----BEGIN CERTIFICATE-----\ MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG\ EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X\ DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv\ dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD\ ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN\ w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5\ BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O\ 1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO\ htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov\ J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7\ Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t\ B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB\ O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8\ lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV\ HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2\ 09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ\ TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj\ Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2\ Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU\ D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz\ DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk\ Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk\ 7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ\ CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy\ +fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS\ -----END CERTIFICATE-----\ \ DigiCert Assured ID Root CA\ ===========================\ -----BEGIN CERTIFICATE-----\ MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG\ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw\ IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx\ MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL\ ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew\ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO\ 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy\ UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW\ /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy\ oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf\ GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF\ 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq\ hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc\ EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn\ SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i\ 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe\ +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==\ -----END CERTIFICATE-----\ \ DigiCert Global Root CA\ =======================\ -----BEGIN CERTIFICATE-----\ MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG\ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw\ HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw\ MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3\ dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq\ hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn\ TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5\ BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H\ 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y\ 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB\ o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm\ 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF\ BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr\ EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt\ tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886\ UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\ CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\ -----END CERTIFICATE-----\ \ DigiCert High Assurance EV Root CA\ ==================================\ -----BEGIN CERTIFICATE-----\ MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG\ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw\ KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw\ MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ\ MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu\ Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t\ Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS\ OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3\ MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ\ NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe\ h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB\ Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY\ JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ\ V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp\ myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK\ mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe\ vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K\ -----END CERTIFICATE-----\ \ Certplus Class 2 Primary CA\ ===========================\ -----BEGIN CERTIFICATE-----\ MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE\ BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN\ OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy\ dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\ ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR\ 5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ\ Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO\ YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e\ e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME\ CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ\ YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t\ L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD\ P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R\ TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+\ 7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW\ //1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7\ l7+ijrRU\ -----END CERTIFICATE-----\ \ DST Root CA X3\ ==============\ -----BEGIN CERTIFICATE-----\ MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK\ ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X\ DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1\ cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD\ ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT\ rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9\ UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy\ xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d\ utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T\ AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ\ MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug\ dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE\ GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw\ RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS\ fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ\ -----END CERTIFICATE-----\ \ SwissSign Gold CA - G2\ ======================\ -----BEGIN CERTIFICATE-----\ MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw\ EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN\ MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp\ c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B\ AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq\ t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C\ jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg\ vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF\ ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR\ AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend\ jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO\ peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR\ 7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi\ GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw\ AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64\ OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov\ L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm\ 5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr\ 44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf\ Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m\ Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp\ mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk\ vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf\ KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br\ NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj\ viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ\ -----END CERTIFICATE-----\ \ SwissSign Silver CA - G2\ ========================\ -----BEGIN CERTIFICATE-----\ MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT\ BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X\ DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3\ aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG\ 9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644\ N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm\ +/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH\ 6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu\ MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h\ qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5\ FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs\ ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc\ celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X\ CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/\ BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB\ tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0\ cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P\ 4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F\ kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L\ 3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx\ /uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa\ DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP\ e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu\ WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ\ DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub\ DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u\ -----END CERTIFICATE-----\ \ GeoTrust Primary Certification Authority\ ========================================\ -----BEGIN CERTIFICATE-----\ MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG\ EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD\ ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx\ CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ\ cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\ CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN\ b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9\ nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge\ RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt\ tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI\ hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K\ Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN\ NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa\ Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG\ 1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=\ -----END CERTIFICATE-----\ \ thawte Primary Root CA\ ======================\ -----BEGIN CERTIFICATE-----\ MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE\ BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2\ aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv\ cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3\ MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg\ SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv\ KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT\ FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs\ oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ\ 1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc\ q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K\ aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p\ afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD\ VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF\ AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE\ uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX\ xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89\ jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH\ z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==\ -----END CERTIFICATE-----\ \ VeriSign Class 3 Public Primary Certification Authority - G5\ ============================================================\ -----BEGIN CERTIFICATE-----\ MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE\ BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO\ ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk\ IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp\ ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB\ yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln\ biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh\ dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt\ YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw\ ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz\ j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD\ Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/\ Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r\ fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/\ BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv\ Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy\ aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG\ SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+\ X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE\ KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC\ Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE\ ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq\ -----END CERTIFICATE-----\ \ SecureTrust CA\ ==============\ -----BEGIN CERTIFICATE-----\ MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG\ EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy\ dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe\ BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC\ ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX\ OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t\ DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH\ GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b\ 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH\ ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/\ BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj\ aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ\ KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu\ SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf\ mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ\ nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR\ 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=\ -----END CERTIFICATE-----\ \ Secure Global CA\ ================\ -----BEGIN CERTIFICATE-----\ MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG\ EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH\ bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg\ MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg\ Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx\ YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ\ bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g\ 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV\ HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi\ 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud\ EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn\ oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA\ MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+\ OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn\ CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5\ 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc\ f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW\ -----END CERTIFICATE-----\ \ COMODO Certification Authority\ ==============================\ -----BEGIN CERTIFICATE-----\ MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE\ BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG\ A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1\ dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb\ MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD\ T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5\ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH\ +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww\ xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV\ 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA\ 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI\ rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E\ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k\ b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC\ AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP\ OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/\ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc\ IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN\ +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==\ -----END CERTIFICATE-----\ \ Network Solutions Certificate Authority\ =======================================\ -----BEGIN CERTIFICATE-----\ MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG\ EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr\ IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx\ MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu\ MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G\ CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx\ jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT\ aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT\ crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc\ /Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB\ AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP\ BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv\ bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA\ A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q\ 4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/\ GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv\ wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD\ ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey\ -----END CERTIFICATE-----\ \ COMODO ECC Certification Authority\ ==================================\ -----BEGIN CERTIFICATE-----\ MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC\ R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE\ ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB\ dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix\ GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR\ Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo\ b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X\ 4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni\ wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E\ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG\ FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA\ U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=\ -----END CERTIFICATE-----\ \ OISTE WISeKey Global Root GA CA\ ===============================\ -----BEGIN CERTIFICATE-----\ MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE\ BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG\ A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH\ bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD\ VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw\ IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5\ IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9\ Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg\ Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD\ d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ\ /yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R\ LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw\ AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ\ KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm\ MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4\ +vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa\ hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY\ okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=\ -----END CERTIFICATE-----\ \ Certigna\ ========\ -----BEGIN CERTIFICATE-----\ MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw\ EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3\ MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI\ Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q\ XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH\ GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p\ ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg\ DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf\ Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ\ tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ\ BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J\ SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA\ hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+\ ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu\ PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY\ 1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw\ WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==\ -----END CERTIFICATE-----\ \ Deutsche Telekom Root CA 2\ ==========================\ -----BEGIN CERTIFICATE-----\ MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT\ RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG\ A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5\ MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G\ A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS\ b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5\ bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI\ KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY\ AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK\ Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV\ jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV\ HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr\ E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy\ zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8\ rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G\ dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU\ Cm26OWMohpLzGITY+9HPBVZkVw==\ -----END CERTIFICATE-----\ \ Cybertrust Global Root\ ======================\ -----BEGIN CERTIFICATE-----\ MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li\ ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4\ MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD\ ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\ +Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW\ 0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL\ AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin\ 89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT\ 8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP\ BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2\ MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G\ A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO\ lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi\ 5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2\ hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T\ X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW\ WL1WMRJOEcgh4LMRkWXbtKaIOM5V\ -----END CERTIFICATE-----\ \ ePKI Root Certification Authority\ =================================\ -----BEGIN CERTIFICATE-----\ MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG\ EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg\ Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx\ MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq\ MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B\ AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs\ IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi\ lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv\ qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX\ 12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O\ WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+\ ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao\ lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/\ vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi\ Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi\ MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH\ ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0\ 1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq\ KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV\ xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP\ NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r\ GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE\ xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx\ gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy\ sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD\ BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=\ -----END CERTIFICATE-----\ \ certSIGN ROOT CA\ ================\ -----BEGIN CERTIFICATE-----\ MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD\ VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa\ Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE\ CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I\ JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH\ rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2\ ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD\ 0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943\ AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B\ Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB\ AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8\ SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0\ x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt\ vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz\ TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD\ -----END CERTIFICATE-----\ \ GeoTrust Primary Certification Authority - G3\ =============================================\ -----BEGIN CERTIFICATE-----\ MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE\ BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0\ IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy\ eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz\ NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo\ YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT\ LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI\ hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j\ K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE\ c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C\ IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu\ dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC\ MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr\ 2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9\ cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE\ Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD\ AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s\ t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt\ -----END CERTIFICATE-----\ \ thawte Primary Root CA - G2\ ===========================\ -----BEGIN CERTIFICATE-----\ MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC\ VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu\ IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg\ Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV\ MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG\ b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt\ IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS\ LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5\ 8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU\ mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN\ G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K\ rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==\ -----END CERTIFICATE-----\ \ thawte Primary Root CA - G3\ ===========================\ -----BEGIN CERTIFICATE-----\ MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE\ BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2\ aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv\ cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w\ ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh\ d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD\ VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG\ A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\ MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At\ P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC\ +BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY\ 7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW\ vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E\ BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ\ KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK\ A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu\ t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC\ 8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm\ er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=\ -----END CERTIFICATE-----\ \ GeoTrust Primary Certification Authority - G2\ =============================================\ -----BEGIN CERTIFICATE-----\ MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC\ VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu\ Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD\ ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1\ OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg\ MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl\ b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG\ BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc\ KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD\ VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+\ EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m\ ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2\ npaqBA+K\ -----END CERTIFICATE-----\ \ VeriSign Universal Root Certification Authority\ ===============================================\ -----BEGIN CERTIFICATE-----\ MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE\ BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO\ ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk\ IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u\ IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV\ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv\ cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl\ IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0\ aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj\ 1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP\ MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72\ 9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I\ AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR\ tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G\ CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O\ a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud\ DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3\ Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx\ Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx\ P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P\ wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4\ mJO37M2CYfE45k+XmCpajQ==\ -----END CERTIFICATE-----\ \ VeriSign Class 3 Public Primary Certification Authority - G4\ ============================================================\ -----BEGIN CERTIFICATE-----\ MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC\ VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3\ b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz\ ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj\ YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL\ MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU\ cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo\ b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5\ IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8\ Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz\ rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB\ /zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw\ HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u\ Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD\ A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx\ AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==\ -----END CERTIFICATE-----\ \ NetLock Arany (Class Gold) Főtanúsítvány\ ========================================\ -----BEGIN CERTIFICATE-----\ MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G\ A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610\ dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB\ cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx\ MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO\ ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv\ biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6\ c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu\ 0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw\ /HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk\ H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw\ fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1\ neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB\ BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW\ qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta\ YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC\ bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna\ NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu\ dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=\ -----END CERTIFICATE-----\ \ Staat der Nederlanden Root CA - G2\ ==================================\ -----BEGIN CERTIFICATE-----\ MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE\ CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g\ Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC\ TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l\ ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ\ 5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn\ vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj\ CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil\ e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR\ OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI\ CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65\ 48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi\ trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737\ qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB\ AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC\ ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV\ HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA\ A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz\ +51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj\ f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN\ kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk\ CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF\ URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb\ CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h\ oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV\ IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm\ 66+KAQ==\ -----END CERTIFICATE-----\ \ Hongkong Post Root CA 1\ =======================\ -----BEGIN CERTIFICATE-----\ MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT\ DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx\ NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n\ IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF\ AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1\ ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr\ auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh\ qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY\ V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV\ HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i\ h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio\ l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei\ IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps\ T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT\ c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==\ -----END CERTIFICATE-----\ \ SecureSign RootCA11\ ===================\ -----BEGIN CERTIFICATE-----\ MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi\ SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS\ b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw\ KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1\ cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL\ TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO\ wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq\ g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP\ O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA\ bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX\ t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh\ OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r\ bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ\ Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01\ y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061\ lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=\ -----END CERTIFICATE-----\ \ Microsec e-Szigno Root CA 2009\ ==============================\ -----BEGIN CERTIFICATE-----\ MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER\ MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv\ c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o\ dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE\ BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt\ U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw\ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA\ fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG\ 0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA\ pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm\ 1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC\ AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf\ QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE\ FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o\ lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX\ I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775\ tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02\ yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi\ LXpUq3DDfSJlgnCW\ -----END CERTIFICATE-----\ \ GlobalSign Root CA - R3\ =======================\ -----BEGIN CERTIFICATE-----\ MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv\ YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh\ bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT\ aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln\ bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt\ iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ\ 0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3\ rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl\ OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2\ xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE\ FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7\ lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8\ EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E\ bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18\ YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r\ kpeDMdmztcpHWD9f\ -----END CERTIFICATE-----\ \ Autoridad de Certificacion Firmaprofesional CIF A62634068\ =========================================================\ -----BEGIN CERTIFICATE-----\ MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA\ BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2\ MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw\ QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB\ NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD\ Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P\ B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY\ 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH\ ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI\ plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX\ MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX\ LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK\ bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU\ vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud\ EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH\ DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp\ cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA\ bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx\ ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx\ 51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk\ R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP\ T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f\ Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl\ osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR\ crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR\ saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD\ KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi\ 6Et8Vcad+qMUu2WFbm5PEn4KPJ2V\ -----END CERTIFICATE-----\ \ Izenpe.com\ ==========\ -----BEGIN CERTIFICATE-----\ MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG\ EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz\ MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu\ QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ\ 03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK\ ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU\ +zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC\ PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT\ OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK\ F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK\ 0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+\ 0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB\ leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID\ AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+\ SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG\ NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx\ MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O\ BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l\ Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga\ kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q\ hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs\ g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5\ aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5\ nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC\ ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo\ Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z\ WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==\ -----END CERTIFICATE-----\ \ Chambers of Commerce Root - 2008\ ================================\ -----BEGIN CERTIFICATE-----\ MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD\ MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv\ bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu\ QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy\ Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl\ ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF\ EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl\ cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC\ AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA\ XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj\ h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/\ ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk\ NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g\ D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331\ lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ\ 0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj\ ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2\ EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI\ G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ\ BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh\ bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh\ bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC\ CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH\ AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1\ wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH\ 3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU\ RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6\ M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1\ YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF\ 9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK\ zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG\ nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg\ OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ\ -----END CERTIFICATE-----\ \ Global Chambersign Root - 2008\ ==============================\ -----BEGIN CERTIFICATE-----\ MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD\ MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv\ bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu\ QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx\ NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg\ Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ\ QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD\ aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf\ VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf\ XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0\ ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB\ /gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA\ TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M\ H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe\ Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF\ HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh\ wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB\ AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT\ BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE\ BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm\ aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm\ aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp\ 1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0\ dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG\ /5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6\ ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s\ dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg\ 9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH\ foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du\ qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr\ P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq\ c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z\ 09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B\ -----END CERTIFICATE-----\ \ Go Daddy Root Certificate Authority - G2\ ========================================\ -----BEGIN CERTIFICATE-----\ MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT\ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu\ MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5\ MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6\ b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G\ A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI\ hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq\ 9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD\ +qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd\ fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl\ NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC\ MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9\ BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac\ vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r\ 5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV\ N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO\ LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1\ -----END CERTIFICATE-----\ \ Starfield Root Certificate Authority - G2\ =========================================\ -----BEGIN CERTIFICATE-----\ MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT\ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s\ b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0\ eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw\ DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg\ VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB\ dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv\ W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs\ bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk\ N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf\ ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU\ JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\ AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol\ TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx\ 4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw\ F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K\ pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ\ c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0\ -----END CERTIFICATE-----\ \ Starfield Services Root Certificate Authority - G2\ ==================================================\ -----BEGIN CERTIFICATE-----\ MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT\ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s\ b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl\ IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV\ BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT\ dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg\ Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC\ AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2\ h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa\ hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP\ LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB\ rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw\ AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG\ SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP\ E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy\ xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd\ iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza\ YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6\ -----END CERTIFICATE-----\ \ AffirmTrust Commercial\ ======================\ -----BEGIN CERTIFICATE-----\ MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS\ BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw\ MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly\ bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF\ AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb\ DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV\ C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6\ BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww\ MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV\ HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\ AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG\ hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi\ qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv\ 0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh\ sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=\ -----END CERTIFICATE-----\ \ AffirmTrust Networking\ ======================\ -----BEGIN CERTIFICATE-----\ MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS\ BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw\ MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly\ bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF\ AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE\ Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI\ dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24\ /PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb\ h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV\ HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\ AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu\ UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6\ 12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23\ WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9\ /ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=\ -----END CERTIFICATE-----\ \ AffirmTrust Premium\ ===================\ -----BEGIN CERTIFICATE-----\ MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS\ BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy\ OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy\ dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A\ MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn\ BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV\ 5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs\ +7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd\ GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R\ p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI\ S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04\ 6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5\ /bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo\ +Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB\ /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv\ MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg\ Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC\ 6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S\ L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK\ +4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV\ BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg\ IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60\ g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb\ zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==\ -----END CERTIFICATE-----\ \ AffirmTrust Premium ECC\ =======================\ -----BEGIN CERTIFICATE-----\ MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV\ BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx\ MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U\ cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA\ IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ\ N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW\ BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK\ BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X\ 57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM\ eQ==\ -----END CERTIFICATE-----\ \ Certum Trusted Network CA\ =========================\ -----BEGIN CERTIFICATE-----\ MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK\ ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv\ biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy\ MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU\ ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5\ MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC\ AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC\ l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J\ J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4\ fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0\ cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB\ Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw\ DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj\ jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1\ mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj\ Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI\ 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=\ -----END CERTIFICATE-----\ \ TWCA Root Certification Authority\ =================================\ -----BEGIN CERTIFICATE-----\ MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ\ VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh\ dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG\ EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB\ IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK\ AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx\ QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC\ oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP\ 4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r\ y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB\ BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG\ 9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC\ mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW\ QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY\ T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny\ Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==\ -----END CERTIFICATE-----\ \ Security Communication RootCA2\ ==============================\ -----BEGIN CERTIFICATE-----\ MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc\ U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh\ dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC\ SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy\ aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\ ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++\ +T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R\ 3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV\ spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K\ EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8\ QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB\ CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj\ u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk\ 3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q\ tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29\ mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03\ -----END CERTIFICATE-----\ \ EC-ACC\ ======\ -----BEGIN CERTIFICATE-----\ MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE\ BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w\ ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD\ VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE\ CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT\ BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7\ MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt\ SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl\ Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh\ cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND\ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK\ w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT\ ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4\ HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a\ E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw\ 0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E\ BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD\ VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0\ Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l\ dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ\ lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa\ Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe\ l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2\ E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D\ 5EI=\ -----END CERTIFICATE-----\ \ Hellenic Academic and Research Institutions RootCA 2011\ =======================================================\ -----BEGIN CERTIFICATE-----\ MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT\ O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y\ aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z\ IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT\ AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z\ IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo\ IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\ AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI\ 1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa\ 71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u\ 8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH\ 3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/\ MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8\ MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu\ b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt\ XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8\ TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD\ /md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N\ 7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4\ -----END CERTIFICATE-----\ \ Actalis Authentication Root CA\ ==============================\ -----BEGIN CERTIFICATE-----\ MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM\ BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE\ AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky\ MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz\ IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290\ IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ\ wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa\ by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6\ zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f\ YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2\ oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l\ EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7\ hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8\ EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5\ jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY\ iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt\ ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI\ WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0\ JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx\ K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+\ Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC\ 4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo\ 2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz\ lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem\ OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9\ vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==\ -----END CERTIFICATE-----\ \ Trustis FPS Root CA\ ===================\ -----BEGIN CERTIFICATE-----\ MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG\ EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290\ IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV\ BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ\ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ\ RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk\ H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa\ cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt\ o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA\ AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd\ BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c\ GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC\ yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P\ 8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV\ l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl\ iB6XzCGcKQENZetX2fNXlrtIzYE=\ -----END CERTIFICATE-----\ \ Buypass Class 2 Root CA\ =======================\ -----BEGIN CERTIFICATE-----\ MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU\ QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X\ DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1\ eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw\ DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1\ g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn\ 9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b\ /+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU\ CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff\ awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI\ zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn\ Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX\ Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs\ M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD\ VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF\ AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s\ A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI\ osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S\ aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd\ DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD\ LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0\ oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC\ wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS\ CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN\ rJgWVqA=\ -----END CERTIFICATE-----\ \ Buypass Class 3 Root CA\ =======================\ -----BEGIN CERTIFICATE-----\ MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU\ QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X\ DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1\ eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw\ DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH\ sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR\ 5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh\ 7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ\ ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH\ 2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV\ /afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ\ RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA\ Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq\ j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD\ VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF\ AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV\ cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G\ uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG\ Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8\ ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2\ KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz\ 6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug\ UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe\ eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi\ Cp/HuZc=\ -----END CERTIFICATE-----\ \ T-TeleSec GlobalRoot Class 3\ ============================\ -----BEGIN CERTIFICATE-----\ MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM\ IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU\ cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx\ MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz\ dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD\ ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3\ DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK\ 9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU\ NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF\ iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W\ 0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA\ MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr\ AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb\ fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT\ ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h\ P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml\ e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==\ -----END CERTIFICATE-----\ \ EE Certification Centre Root CA\ ===============================\ -----BEGIN CERTIFICATE-----\ MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG\ EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy\ dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw\ MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB\ UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy\ ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB\ DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM\ TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2\ rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw\ 93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN\ P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T\ AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ\ MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF\ BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj\ xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM\ lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u\ uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU\ 3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM\ dcGWxZ0=\ -----END CERTIFICATE-----\ \ D-TRUST Root Class 3 CA 2 2009\ ==============================\ -----BEGIN CERTIFICATE-----\ MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK\ DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe\ Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE\ LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw\ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD\ ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA\ BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv\ KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z\ p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC\ AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ\ 4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y\ eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw\ MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G\ PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw\ OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm\ 2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0\ o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV\ dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph\ X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I=\ -----END CERTIFICATE-----\ \ D-TRUST Root Class 3 CA 2 EV 2009\ =================================\ -----BEGIN CERTIFICATE-----\ MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK\ DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw\ OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK\ DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw\ OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS\ egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh\ zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T\ 7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60\ sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35\ 11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv\ cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v\ ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El\ MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp\ b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh\ c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+\ PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05\ nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX\ ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA\ NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv\ w9y4AyHqnxbxLFS1\ -----END CERTIFICATE-----\ \ CA Disig Root R2\ ================\ -----BEGIN CERTIFICATE-----\ MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw\ EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp\ ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx\ EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp\ c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC\ w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia\ xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7\ A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S\ GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV\ g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa\ 5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE\ koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A\ Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i\ Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV\ HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u\ Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM\ tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV\ sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je\ dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8\ 1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx\ mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01\ utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0\ sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg\ UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV\ 7+ZtsH8tZ/3zbBt1RqPlShfppNcL\ -----END CERTIFICATE-----\ \ ACCVRAIZ1\ =========\ -----BEGIN CERTIFICATE-----\ MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB\ SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1\ MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH\ UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC\ DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM\ jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0\ RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD\ aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ\ 0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG\ WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7\ 8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR\ 5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J\ 9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK\ Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw\ Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu\ Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2\ VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM\ Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA\ QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh\ AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA\ YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj\ AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA\ IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk\ aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0\ dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2\ MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI\ hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E\ R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN\ YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49\ nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ\ TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3\ sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h\ I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg\ Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd\ 3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p\ EfbRD0tVNEYqi4Y7\ -----END CERTIFICATE-----\ \ TWCA Global Root CA\ ===================\ -----BEGIN CERTIFICATE-----\ MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT\ CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD\ QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK\ EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg\ Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C\ nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV\ r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR\ Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV\ tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W\ KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99\ sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p\ yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn\ kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI\ zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC\ AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g\ cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn\ LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M\ 8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg\ /eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg\ lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP\ A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m\ i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8\ EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3\ zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0=\ -----END CERTIFICATE-----\ \ TeliaSonera Root CA v1\ ======================\ -----BEGIN CERTIFICATE-----\ MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE\ CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4\ MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW\ VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+\ 6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA\ 3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k\ B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn\ Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH\ oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3\ F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ\ oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7\ gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc\ TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB\ AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW\ DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm\ zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx\ 0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW\ pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV\ G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc\ c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT\ JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2\ qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6\ Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems\ WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=\ -----END CERTIFICATE-----\ \ E-Tugra Certification Authority\ ===============================\ -----BEGIN CERTIFICATE-----\ MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w\ DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls\ ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN\ ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw\ NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx\ QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl\ cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD\ DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A\ MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd\ hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K\ CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g\ ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ\ BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0\ E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz\ rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq\ jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn\ rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5\ dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB\ /wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG\ MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK\ kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO\ XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807\ VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo\ a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc\ dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV\ KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT\ Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0\ 8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G\ C7TbO6Orb1wdtn7os4I07QZcJA==\ -----END CERTIFICATE-----\ \ T-TeleSec GlobalRoot Class 2\ ============================\ -----BEGIN CERTIFICATE-----\ MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM\ IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU\ cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx\ MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz\ dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD\ ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3\ DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ\ SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F\ vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970\ 2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV\ WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA\ MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy\ YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4\ r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf\ vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR\ 3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN\ 9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg==\ -----END CERTIFICATE-----\ \ Atos TrustedRoot 2011\ =====================\ -----BEGIN CERTIFICATE-----\ MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU\ cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4\ MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG\ A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV\ hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr\ 54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+\ DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320\ HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR\ z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R\ l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ\ bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB\ CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h\ k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh\ TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9\ 61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G\ 3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed\ -----END CERTIFICATE-----\ \ QuoVadis Root CA 1 G3\ =====================\ -----BEGIN CERTIFICATE-----\ MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG\ A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv\ b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN\ MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg\ RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE\ PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm\ PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6\ Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN\ ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l\ g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV\ 7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX\ 9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f\ iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg\ t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI\ hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC\ MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3\ GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct\ Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP\ +V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh\ 3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa\ wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6\ O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0\ FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV\ hMJKzRwuJIczYOXD\ -----END CERTIFICATE-----\ \ QuoVadis Root CA 2 G3\ =====================\ -----BEGIN CERTIFICATE-----\ MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG\ A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv\ b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN\ MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg\ RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh\ ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY\ NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t\ oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o\ MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l\ V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo\ L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ\ sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD\ 6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh\ lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI\ hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66\ AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K\ pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9\ x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz\ dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X\ U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw\ mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD\ zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN\ JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr\ O3jtZsSOeWmD3n+M\ -----END CERTIFICATE-----\ \ QuoVadis Root CA 3 G3\ =====================\ -----BEGIN CERTIFICATE-----\ MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG\ A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv\ b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN\ MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg\ RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286\ IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL\ Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe\ 6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3\ I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U\ VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7\ 5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi\ Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM\ dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt\ rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI\ hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px\ KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS\ t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ\ TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du\ DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib\ Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD\ hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX\ 0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW\ dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2\ PpxxVJkES/1Y+Zj0\ -----END CERTIFICATE-----\ \ DigiCert Assured ID Root G2\ ===========================\ -----BEGIN CERTIFICATE-----\ MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG\ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw\ IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw\ MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL\ ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw\ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH\ 35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq\ bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw\ VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP\ YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn\ lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO\ w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv\ 0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz\ d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW\ hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M\ jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo\ IhNzbM8m9Yop5w==\ -----END CERTIFICATE-----\ \ DigiCert Assured ID Root G3\ ===========================\ -----BEGIN CERTIFICATE-----\ MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV\ UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD\ VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1\ MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\ d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ\ BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb\ RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs\ KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF\ UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy\ YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy\ 1vUhZscv6pZjamVFkpUBtA==\ -----END CERTIFICATE-----\ \ DigiCert Global Root G2\ =======================\ -----BEGIN CERTIFICATE-----\ MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG\ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw\ HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx\ MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3\ dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq\ hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ\ kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO\ 3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV\ BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM\ UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB\ o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu\ 5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr\ F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U\ WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH\ QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/\ iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl\ MrY=\ -----END CERTIFICATE-----\ \ DigiCert Global Root G3\ =======================\ -----BEGIN CERTIFICATE-----\ MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV\ UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD\ VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw\ MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k\ aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C\ AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O\ YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP\ BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp\ Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y\ 3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34\ VOKa5Vt8sycX\ -----END CERTIFICATE-----\ \ DigiCert Trusted Root G4\ ========================\ -----BEGIN CERTIFICATE-----\ MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG\ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw\ HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1\ MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\ d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G\ CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp\ pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o\ k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa\ vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY\ QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6\ MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm\ mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7\ f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH\ dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8\ oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud\ DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD\ ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY\ ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr\ yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy\ 7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah\ ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN\ 5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb\ /UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa\ 5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK\ G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP\ 82Z+\ -----END CERTIFICATE-----\ \ COMODO RSA Certification Authority\ ==================================\ -----BEGIN CERTIFICATE-----\ MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE\ BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG\ A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv\ biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC\ R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE\ ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB\ dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn\ dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ\ FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+\ 5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG\ x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX\ 2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL\ OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3\ sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C\ GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5\ WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E\ FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w\ DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt\ rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+\ nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg\ tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW\ sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp\ pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA\ zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq\ ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52\ 7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I\ LaZRfyHBNVOFBkpdn627G190\ -----END CERTIFICATE-----\ \ USERTrust RSA Certification Authority\ =====================================\ -----BEGIN CERTIFICATE-----\ MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE\ BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK\ ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh\ dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE\ BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK\ ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh\ dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz\ 0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j\ Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn\ RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O\ +T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq\ /nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE\ Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM\ lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8\ yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+\ eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd\ BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF\ MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW\ FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ\ 7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ\ Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM\ 8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi\ FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi\ yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c\ J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw\ sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx\ Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9\ -----END CERTIFICATE-----\ \ USERTrust ECC Certification Authority\ =====================================\ -----BEGIN CERTIFICATE-----\ MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC\ VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU\ aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv\ biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC\ VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU\ aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv\ biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2\ 0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez\ nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV\ HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB\ HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu\ 9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=\ -----END CERTIFICATE-----\ \ GlobalSign ECC Root CA - R4\ ===========================\ -----BEGIN CERTIFICATE-----\ MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb\ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD\ EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb\ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD\ EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl\ OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P\ AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV\ MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF\ JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q=\ -----END CERTIFICATE-----\ \ GlobalSign ECC Root CA - R5\ ===========================\ -----BEGIN CERTIFICATE-----\ MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb\ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD\ EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb\ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD\ EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6\ SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS\ h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd\ BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx\ uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7\ yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3\ -----END CERTIFICATE-----\ \ Staat der Nederlanden Root CA - G3\ ==================================\ -----BEGIN CERTIFICATE-----\ MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE\ CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g\ Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC\ TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l\ ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y\ olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t\ x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy\ EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K\ Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur\ mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5\ 1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp\ 07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo\ FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE\ 41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB\ AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu\ yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD\ U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq\ KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1\ v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA\ 8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b\ 8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r\ mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq\ 1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI\ JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV\ tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk=\ -----END CERTIFICATE-----\ \ Staat der Nederlanden EV Root CA\ ================================\ -----BEGIN CERTIFICATE-----\ MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE\ CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g\ RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M\ MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl\ cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk\ SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW\ O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r\ 0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8\ Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV\ XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr\ 08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV\ 0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd\ 74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx\ fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC\ MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa\ ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI\ eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu\ c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq\ 5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN\ b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN\ f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi\ 5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4\ WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK\ DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy\ eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg==\ -----END CERTIFICATE-----\ \ IdenTrust Commercial Root CA 1\ ==============================\ -----BEGIN CERTIFICATE-----\ MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG\ EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS\ b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES\ MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB\ IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld\ hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/\ mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi\ 1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C\ XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl\ 3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy\ NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV\ WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg\ xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix\ uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC\ AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI\ hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH\ 6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg\ ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt\ ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV\ YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX\ feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro\ kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe\ 2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz\ Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R\ cGzM7vRX+Bi6hG6H\ -----END CERTIFICATE-----\ \ IdenTrust Public Sector Root CA 1\ =================================\ -----BEGIN CERTIFICATE-----\ MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG\ EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv\ ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV\ UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS\ b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy\ P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6\ Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI\ rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf\ qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS\ mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn\ ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh\ LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v\ iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL\ 4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B\ Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw\ DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj\ t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A\ mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt\ GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt\ m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx\ NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4\ Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI\ ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC\ ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ\ 3Wl9af0AVqW3rLatt8o+Ae+c\ -----END CERTIFICATE-----\ \ Entrust Root Certification Authority - G2\ =========================================\ -----BEGIN CERTIFICATE-----\ MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV\ BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy\ bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug\ b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw\ HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT\ DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx\ OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s\ eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi\ MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP\ /vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz\ HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU\ s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y\ TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx\ AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6\ 0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z\ iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ\ Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi\ nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+\ vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO\ e4pIb4tF9g==\ -----END CERTIFICATE-----\ \ Entrust Root Certification Authority - EC1\ ==========================================\ -----BEGIN CERTIFICATE-----\ MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx\ FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn\ YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl\ ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5\ IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw\ FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs\ LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg\ dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt\ IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy\ AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef\ 9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE\ FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h\ vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8\ kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G\ -----END CERTIFICATE-----\ \ CFCA EV ROOT\ ============\ -----BEGIN CERTIFICATE-----\ MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE\ CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB\ IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw\ MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD\ DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV\ BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD\ 7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN\ uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW\ ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7\ xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f\ py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K\ gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol\ hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ\ tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf\ BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB\ /wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB\ ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q\ ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua\ 4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG\ E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX\ BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn\ aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy\ PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX\ kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C\ ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su\ -----END CERTIFICATE-----\ \ Certinomis - Root CA\ ====================\ -----BEGIN CERTIFICATE-----\ MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjETMBEGA1UEChMK\ Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAbBgNVBAMTFENlcnRpbm9taXMg\ LSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMzMTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIx\ EzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRD\ ZXJ0aW5vbWlzIC0gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQos\ P5L2fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJflLieY6pOo\ d5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQVWZUKxkd8aRi5pwP5ynap\ z8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDFTKWrteoB4owuZH9kb/2jJZOLyKIOSY00\ 8B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09x\ RLWtwHkziOC/7aOgFLScCbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE\ 6OXWk6RiwsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJwx3t\ FvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SGm/lg0h9tkQPTYKbV\ PZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4F2iw4lNVYC2vPsKD2NkJK/DAZNuH\ i5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZngWVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGj\ YzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I\ 6tNxIqSSaHh02TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF\ AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/0KGRHCwPT5iV\ WVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWwF6YSjNRieOpWauwK0kDDPAUw\ Pk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZSg081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAX\ lCOotQqSD7J6wWAsOMwaplv/8gzjqh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJ\ y29SWwNyhlCVCNSNh4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9\ Iff/ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8Vbtaw5Bng\ DwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwjY/M50n92Uaf0yKHxDHYi\ I0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nM\ cyrDflOR1m749fPH0FFNjkulW+YZFzvWgQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVr\ hkIGuUE=\ -----END CERTIFICATE-----\ \ OISTE WISeKey Global Root GB CA\ ===============================\ -----BEGIN CERTIFICATE-----\ MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG\ EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl\ ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw\ MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD\ VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds\ b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX\ scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP\ rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk\ 9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o\ Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg\ GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB\ /zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI\ hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD\ dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0\ VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui\ HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic\ Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=\ -----END CERTIFICATE-----\ \ SZAFIR ROOT CA2\ ===============\ -----BEGIN CERTIFICATE-----\ MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG\ A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV\ BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ\ BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD\ VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q\ qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK\ DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE\ 2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ\ ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi\ ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P\ AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC\ AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5\ O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67\ oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul\ 4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6\ +/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw==\ -----END CERTIFICATE-----\ \ Certum Trusted Network CA 2\ ===========================\ -----BEGIN CERTIFICATE-----\ MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE\ BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1\ bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y\ ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ\ TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl\ cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB\ IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9\ 7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o\ CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b\ Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p\ uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130\ GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ\ 9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB\ Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye\ hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM\ BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\ AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI\ hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW\ Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA\ L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo\ clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM\ pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb\ w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo\ J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm\ ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX\ is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7\ zAYspsbiDrW5viSP\ -----END CERTIFICATE-----\ \ Hellenic Academic and Research Institutions RootCA 2015\ =======================================================\ -----BEGIN CERTIFICATE-----\ MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT\ BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0\ aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl\ YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx\ MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg\ QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV\ BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw\ MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv\ bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh\ iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+\ 6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd\ FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr\ i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F\ GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2\ fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu\ iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc\ Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI\ hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+\ D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM\ d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y\ d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn\ 82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb\ davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F\ Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt\ J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa\ JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q\ p/UsQu0yrbYhnr68\ -----END CERTIFICATE-----\ \ Hellenic Academic and Research Institutions ECC RootCA 2015\ ===========================================================\ -----BEGIN CERTIFICATE-----\ MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0\ aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u\ cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj\ aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw\ MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj\ IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD\ VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290\ Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP\ dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK\ Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O\ BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA\ GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn\ dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR\ -----END CERTIFICATE-----\ \ ISRG Root X1\ ============\ -----BEGIN CERTIFICATE-----\ MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE\ BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD\ EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG\ EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT\ DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r\ Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1\ 3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K\ b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN\ Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ\ 4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf\ 1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu\ hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH\ usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r\ OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G\ A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY\ 9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\ ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV\ 0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt\ hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw\ TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx\ e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA\ JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD\ YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n\ JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ\ m+kXQ99b21/+jh5Xos1AnX5iItreGCc=\ -----END CERTIFICATE-----\ \ AC RAIZ FNMT-RCM\ ================\ -----BEGIN CERTIFICATE-----\ MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT\ AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw\ MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD\ TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC\ ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf\ qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr\ btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL\ j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou\ 08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw\ WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT\ tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ\ 47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC\ ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa\ i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE\ FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o\ dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD\ nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s\ D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ\ j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT\ Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW\ +YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7\ Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d\ 8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm\ 5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG\ rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM=\ -----END CERTIFICATE-----\ \ Amazon Root CA 1\ ================\ -----BEGIN CERTIFICATE-----\ MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD\ VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1\ MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv\ bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\ ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH\ FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ\ gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t\ dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce\ VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB\ /zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3\ DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM\ CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy\ 8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa\ 2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2\ xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5\ -----END CERTIFICATE-----\ \ Amazon Root CA 2\ ================\ -----BEGIN CERTIFICATE-----\ MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD\ VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1\ MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv\ bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC\ ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4\ kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp\ N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9\ AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd\ fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx\ kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS\ btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0\ Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN\ c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+\ 3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw\ DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA\ A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY\ +gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE\ YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW\ xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ\ gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW\ aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV\ Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3\ KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi\ JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw=\ -----END CERTIFICATE-----\ \ Amazon Root CA 3\ ================\ -----BEGIN CERTIFICATE-----\ MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG\ EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy\ NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ\ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB\ f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr\ Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43\ rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc\ eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw==\ -----END CERTIFICATE-----\ \ Amazon Root CA 4\ ================\ -----BEGIN CERTIFICATE-----\ MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG\ EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy\ NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ\ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN\ /sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri\ 83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV\ HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA\ MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1\ AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA==\ -----END CERTIFICATE-----\ \ LuxTrust Global Root 2\ ======================\ -----BEGIN CERTIFICATE-----\ MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQELBQAwRjELMAkG\ A1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNVBAMMFkx1eFRydXN0IEdsb2Jh\ bCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUwMzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEW\ MBQGA1UECgwNTHV4VHJ1c3QgUy5BLjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCC\ AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wm\ Kb3FibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTemhfY7RBi2\ xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1EMShduxq3sVs35a0VkBC\ wGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsnXpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm\ 1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkm\ FRseTJIpgp7VkoGSQXAZ96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niF\ wpN6cj5mj5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4gDEa/\ a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+8kPREd8vZS9kzl8U\ ubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2jX5t/Lax5Gw5CMZdjpPuKadUiDTSQ\ MC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmHhFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB\ /zBCBgNVHSAEOzA5MDcGByuBKwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5\ Lmx1eHRydXN0Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT\ +Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQELBQADggIBAGoZ\ FO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9BzZAcg4atmpZ1gDlaCDdLnIN\ H2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTOjFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW\ 7MM3LGVYvlcAGvI1+ut7MV3CwRI9loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIu\ ZY+kt9J/Z93I055cqqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWA\ VWe+2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/JEAdemrR\ TxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKrezrnK+T+Tb/mjuuqlPpmt\ /f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQfLSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc\ 7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31I\ iyBMz2TWuJdGsE7RKlY6oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr\ -----END CERTIFICATE-----\ \ TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1\ =============================================\ -----BEGIN CERTIFICATE-----\ MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT\ D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr\ IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g\ TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp\ ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD\ VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt\ c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth\ bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11\ IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\ MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8\ 6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc\ wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0\ 3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9\ WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU\ ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ\ KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh\ AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc\ lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R\ e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j\ q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM=\ -----END CERTIFICATE-----\ \ GDCA TrustAUTH R5 ROOT\ ======================\ -----BEGIN CERTIFICATE-----\ MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw\ BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD\ DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow\ YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ\ IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B\ AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs\ AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p\ OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr\ pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ\ 9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ\ xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM\ R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ\ D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4\ oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx\ 9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR\ MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg\ p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9\ H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35\ 6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd\ +PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ\ HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD\ F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ\ 8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv\ /EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT\ aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g==\ -----END CERTIFICATE-----\ \ TrustCor RootCert CA-1\ ======================\ -----BEGIN CERTIFICATE-----\ MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYDVQQGEwJQQTEP\ MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig\ U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp\ dHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkx\ MjMxMTcyMzE2WjCBpDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFu\ YW1hIENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUGA1UECwwe\ VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZUcnVzdENvciBSb290Q2Vy\ dCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv463leLCJhJrMxnHQFgKq1mq\ jQCj/IDHUHuO1CAmujIS2CNUSSUQIpidRtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4\ pQa81QBeCQryJ3pS/C3Vseq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0\ JEsq1pme9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CVEY4h\ gLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorWhnAbJN7+KIor0Gqw\ /Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/DeOxCbeKyKsZn3MzUOcwHwYDVR0j\ BBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\ AYYwDQYJKoZIhvcNAQELBQADggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5\ mDo4Nvu7Zp5I/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf\ ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZyonnMlo2HD6C\ qFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djtsL1Ac59v2Z3kf9YKVmgenFK+P\ 3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdNzl/HHk484IkzlQsPpTLWPFp5LBk=\ -----END CERTIFICATE-----\ \ TrustCor RootCert CA-2\ ======================\ -----BEGIN CERTIFICATE-----\ MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNVBAYTAlBBMQ8w\ DQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQwIgYDVQQKDBtUcnVzdENvciBT\ eXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0\ eTEfMB0GA1UEAwwWVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEy\ MzExNzI2MzlaMIGkMQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5h\ bWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U\ cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0\ IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnIG7CKqJiJJWQdsg4foDSq8Gb\ ZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9Nk\ RvRUqdw6VC0xK5mC8tkq1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1\ oYxOdqHp2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nKDOOb\ XUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hapeaz6LMvYHL1cEksr1\ /p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF3wP+TfSvPd9cW436cOGlfifHhi5q\ jxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQP\ eSghYA2FFn3XVDjxklb9tTNMg9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+Ctg\ rKAmrhQhJ8Z3mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh\ 8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAdBgNVHQ4EFgQU\ 2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6UnrybPZx9mCAZ5YwwYrIwDwYD\ VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/h\ Osh80QA9z+LqBrWyOrsGS2h60COXdKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnp\ kpfbsEZC89NiqpX+MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv\ 2wnL/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RXCI/hOWB3\ S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYaZH9bDTMJBzN7Bj8RpFxw\ PIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dv\ DDqPys/cA8GiCcjl/YBeyGBCARsaU1q7N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYU\ RpFHmygk71dSTlxCnKr3Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANE\ xdqtvArBAs8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp5KeX\ RKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu1uwJ\ -----END CERTIFICATE-----\ \ TrustCor ECA-1\ ==============\ -----BEGIN CERTIFICATE-----\ MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYDVQQGEwJQQTEP\ MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig\ U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp\ dHkxFzAVBgNVBAMMDlRydXN0Q29yIEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3Mjgw\ N1owgZwxCzAJBgNVBAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5\ MSQwIgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29y\ IENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3IgRUNBLTEwggEiMA0GCSqG\ SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb3w9U73NjKYKtR8aja+3+XzP4Q1HpGjOR\ MRegdMTUpwHmspI+ap3tDvl0mEDTPwOABoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23\ xFUfJ3zSCNV2HykVh0A53ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmc\ p0yJF4OuowReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/wZ0+\ fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZFZtS6mFjBAgMBAAGj\ YzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAfBgNVHSMEGDAWgBREnkj1zG1I1KBL\ f/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF\ AAOCAQEABT41XBVwm8nHc2FvcivUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u\ /ukZMjgDfxT2AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F\ hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50soIipX1TH0Xs\ J5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BIWJZpTdwHjFGTot+fDz2LYLSC\ jaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1WitJ/X5g==\ -----END CERTIFICATE-----\ \ SSL.com Root Certification Authority RSA\ ========================================\ -----BEGIN CERTIFICATE-----\ MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxDjAM\ BgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24x\ MTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYw\ MjEyMTczOTM5WhcNNDEwMjEyMTczOTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx\ EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NM\ LmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcNAQEBBQAD\ ggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2RxFdHaxh3a3by/ZPkPQ/C\ Fp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aXqhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8\ P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcCC52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/ge\ oeOy3ZExqysdBP+lSgQ36YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkp\ k8zruFvh/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrFYD3Z\ fBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93EJNyAKoFBbZQ+yODJ\ gUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVcUS4cK38acijnALXRdMbX5J+tB5O2\ UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi8\ 1xtZPCvM8hnIk2snYxnP/Okm+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4s\ bE6x/c+cCbqiM+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV\ HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4GA1UdDwEB/wQE\ AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGVcpNxJK1ok1iOMq8bs3AD/CUr\ dIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBcHadm47GUBwwyOabqG7B52B2ccETjit3E+ZUf\ ijhDPwGFpUenPUayvOUiaPd7nNgsPgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAsl\ u1OJD7OAUN5F7kR/q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjq\ erQ0cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jra6x+3uxj\ MxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90IH37hVZkLId6Tngr75qNJ\ vTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/YK9f1JmzJBjSWFupwWRoyeXkLtoh/D1JI\ Pb9s2KJELtFOt3JY04kTlf5Eq/jXixtunLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406y\ wKBjYZC6VWg3dGq2ktufoYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NI\ WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k=\ -----END CERTIFICATE-----\ \ SSL.com Root Certification Authority ECC\ ========================================\ -----BEGIN CERTIFICATE-----\ MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV\ BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv\ BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy\ MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO\ BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv\ bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA\ BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+\ 8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR\ hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT\ jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW\ e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z\ 5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl\ -----END CERTIFICATE-----\ \ SSL.com EV Root Certification Authority RSA R2\ ==============================================\ -----BEGIN CERTIFICATE-----\ MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w\ DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u\ MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy\ MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI\ DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD\ VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN\ BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh\ hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w\ cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO\ Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+\ B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh\ CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim\ 9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto\ RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm\ JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48\ +qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV\ HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp\ qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1\ ++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx\ Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G\ guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz\ OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7\ CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq\ lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR\ rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1\ hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX\ 9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w==\ -----END CERTIFICATE-----\ \ SSL.com EV Root Certification Authority ECC\ ===========================================\ -----BEGIN CERTIFICATE-----\ MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV\ BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy\ BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw\ MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx\ EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM\ LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB\ BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy\ 3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O\ BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe\ 5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ\ N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm\ m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg==\ -----END CERTIFICATE-----\ \ GlobalSign Root CA - R6\ =======================\ -----BEGIN CERTIFICATE-----\ MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX\ R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds\ b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i\ YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs\ U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss\ grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE\ 3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF\ vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM\ PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+\ azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O\ WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy\ CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP\ 0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN\ b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE\ AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV\ HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN\ nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0\ lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY\ BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym\ Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr\ 3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1\ 0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T\ uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK\ oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t\ JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA=\ -----END CERTIFICATE-----\ \ OISTE WISeKey Global Root GC CA\ ===============================\ -----BEGIN CERTIFICATE-----\ MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD\ SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo\ MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa\ Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL\ ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh\ bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr\ VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab\ NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd\ BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E\ AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk\ AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9\ -----END CERTIFICATE-----\ "; #ifdef __cplusplus } #endif gsoap-2.8.91/gsoap/samples/ssl/ssl.wsdl0000644000175000017500000000455613525245163017356 0ustar ellertellert Service definition of function ns__add gSOAP 2.8.91 generated service definition gsoap-2.8.91/gsoap/samples/ssl/Makefile.in0000644000175000017500000011450113525245163017717 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = sslclient$(EXEEXT) sslserver$(EXEEXT) subdir = gsoap/samples/ssl ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = sslclient-soapC.$(OBJEXT) am__objects_3 = sslclient-soapClient.$(OBJEXT) $(am__objects_2) am_sslclient_OBJECTS = sslclient-sslclient.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) sslclient-ssl_setup.$(OBJEXT) \ sslclient-threads.$(OBJEXT) sslclient_OBJECTS = $(am_sslclient_OBJECTS) am__DEPENDENCIES_1 = sslclient_DEPENDENCIES = $(SOAP_C_LIB_SSL) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) sslclient_LINK = $(CCLD) $(sslclient_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ am__objects_4 = sslserver-soapC.$(OBJEXT) am__objects_5 = sslserver-soapServer.$(OBJEXT) $(am__objects_4) am_sslserver_OBJECTS = sslserver-sslserver.$(OBJEXT) $(am__objects_1) \ $(am__objects_5) sslserver-threads.$(OBJEXT) sslserver_OBJECTS = $(am_sslserver_OBJECTS) sslserver_DEPENDENCIES = $(SOAP_C_LIB_SSL) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) sslserver_LINK = $(CCLD) $(sslserver_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/sslclient-soapC.Po \ ./$(DEPDIR)/sslclient-soapClient.Po \ ./$(DEPDIR)/sslclient-ssl_setup.Po \ ./$(DEPDIR)/sslclient-sslclient.Po \ ./$(DEPDIR)/sslclient-threads.Po \ ./$(DEPDIR)/sslserver-soapC.Po \ ./$(DEPDIR)/sslserver-soapServer.Po \ ./$(DEPDIR)/sslserver-sslserver.Po \ ./$(DEPDIR)/sslserver-threads.Po am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(sslclient_SOURCES) $(sslserver_SOURCES) DIST_SOURCES = $(sslclient_SOURCES) $(sslserver_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.c_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = foreign 1.4 SOAPHEADER = ssl.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = $(SOAP_NS_DEF) sslclient_CFLAGS = -DWITH_OPENSSL -DWITH_GZIP sslclient_SOURCES = sslclient.c $(SOAPHEADER) $(SOAP_C_CLIENT) ssl_setup.c ../../plugin/threads.c sslclient_LDADD = $(SOAP_C_LIB_SSL) $(SAMPLE_EXTRA_LIBS) $(SAMPLE_SSL_LIBS) -lpthread sslserver_CFLAGS = -DWITH_OPENSSL -DWITH_GZIP sslserver_SOURCES = sslserver.c $(SOAPHEADER) $(SOAP_C_SERVER) ../../plugin/threads.c sslserver_LDADD = $(SOAP_C_LIB_SSL) $(SAMPLE_EXTRA_LIBS) $(SAMPLE_SSL_LIBS) -lpthread all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/ssl/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/ssl/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) sslclient$(EXEEXT): $(sslclient_OBJECTS) $(sslclient_DEPENDENCIES) $(EXTRA_sslclient_DEPENDENCIES) @rm -f sslclient$(EXEEXT) $(AM_V_CCLD)$(sslclient_LINK) $(sslclient_OBJECTS) $(sslclient_LDADD) $(LIBS) sslserver$(EXEEXT): $(sslserver_OBJECTS) $(sslserver_DEPENDENCIES) $(EXTRA_sslserver_DEPENDENCIES) @rm -f sslserver$(EXEEXT) $(AM_V_CCLD)$(sslserver_LINK) $(sslserver_OBJECTS) $(sslserver_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sslclient-soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sslclient-soapClient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sslclient-ssl_setup.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sslclient-sslclient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sslclient-threads.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sslserver-soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sslserver-soapServer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sslserver-sslserver.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sslserver-threads.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` sslclient-sslclient.o: sslclient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -MT sslclient-sslclient.o -MD -MP -MF $(DEPDIR)/sslclient-sslclient.Tpo -c -o sslclient-sslclient.o `test -f 'sslclient.c' || echo '$(srcdir)/'`sslclient.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslclient-sslclient.Tpo $(DEPDIR)/sslclient-sslclient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sslclient.c' object='sslclient-sslclient.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -c -o sslclient-sslclient.o `test -f 'sslclient.c' || echo '$(srcdir)/'`sslclient.c sslclient-sslclient.obj: sslclient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -MT sslclient-sslclient.obj -MD -MP -MF $(DEPDIR)/sslclient-sslclient.Tpo -c -o sslclient-sslclient.obj `if test -f 'sslclient.c'; then $(CYGPATH_W) 'sslclient.c'; else $(CYGPATH_W) '$(srcdir)/sslclient.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslclient-sslclient.Tpo $(DEPDIR)/sslclient-sslclient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sslclient.c' object='sslclient-sslclient.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -c -o sslclient-sslclient.obj `if test -f 'sslclient.c'; then $(CYGPATH_W) 'sslclient.c'; else $(CYGPATH_W) '$(srcdir)/sslclient.c'; fi` sslclient-soapClient.o: soapClient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -MT sslclient-soapClient.o -MD -MP -MF $(DEPDIR)/sslclient-soapClient.Tpo -c -o sslclient-soapClient.o `test -f 'soapClient.c' || echo '$(srcdir)/'`soapClient.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslclient-soapClient.Tpo $(DEPDIR)/sslclient-soapClient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapClient.c' object='sslclient-soapClient.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -c -o sslclient-soapClient.o `test -f 'soapClient.c' || echo '$(srcdir)/'`soapClient.c sslclient-soapClient.obj: soapClient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -MT sslclient-soapClient.obj -MD -MP -MF $(DEPDIR)/sslclient-soapClient.Tpo -c -o sslclient-soapClient.obj `if test -f 'soapClient.c'; then $(CYGPATH_W) 'soapClient.c'; else $(CYGPATH_W) '$(srcdir)/soapClient.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslclient-soapClient.Tpo $(DEPDIR)/sslclient-soapClient.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapClient.c' object='sslclient-soapClient.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -c -o sslclient-soapClient.obj `if test -f 'soapClient.c'; then $(CYGPATH_W) 'soapClient.c'; else $(CYGPATH_W) '$(srcdir)/soapClient.c'; fi` sslclient-soapC.o: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -MT sslclient-soapC.o -MD -MP -MF $(DEPDIR)/sslclient-soapC.Tpo -c -o sslclient-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslclient-soapC.Tpo $(DEPDIR)/sslclient-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='sslclient-soapC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -c -o sslclient-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c sslclient-soapC.obj: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -MT sslclient-soapC.obj -MD -MP -MF $(DEPDIR)/sslclient-soapC.Tpo -c -o sslclient-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslclient-soapC.Tpo $(DEPDIR)/sslclient-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='sslclient-soapC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -c -o sslclient-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` sslclient-ssl_setup.o: ssl_setup.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -MT sslclient-ssl_setup.o -MD -MP -MF $(DEPDIR)/sslclient-ssl_setup.Tpo -c -o sslclient-ssl_setup.o `test -f 'ssl_setup.c' || echo '$(srcdir)/'`ssl_setup.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslclient-ssl_setup.Tpo $(DEPDIR)/sslclient-ssl_setup.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ssl_setup.c' object='sslclient-ssl_setup.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -c -o sslclient-ssl_setup.o `test -f 'ssl_setup.c' || echo '$(srcdir)/'`ssl_setup.c sslclient-ssl_setup.obj: ssl_setup.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -MT sslclient-ssl_setup.obj -MD -MP -MF $(DEPDIR)/sslclient-ssl_setup.Tpo -c -o sslclient-ssl_setup.obj `if test -f 'ssl_setup.c'; then $(CYGPATH_W) 'ssl_setup.c'; else $(CYGPATH_W) '$(srcdir)/ssl_setup.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslclient-ssl_setup.Tpo $(DEPDIR)/sslclient-ssl_setup.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ssl_setup.c' object='sslclient-ssl_setup.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -c -o sslclient-ssl_setup.obj `if test -f 'ssl_setup.c'; then $(CYGPATH_W) 'ssl_setup.c'; else $(CYGPATH_W) '$(srcdir)/ssl_setup.c'; fi` sslclient-threads.o: ../../plugin/threads.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -MT sslclient-threads.o -MD -MP -MF $(DEPDIR)/sslclient-threads.Tpo -c -o sslclient-threads.o `test -f '../../plugin/threads.c' || echo '$(srcdir)/'`../../plugin/threads.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslclient-threads.Tpo $(DEPDIR)/sslclient-threads.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/threads.c' object='sslclient-threads.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -c -o sslclient-threads.o `test -f '../../plugin/threads.c' || echo '$(srcdir)/'`../../plugin/threads.c sslclient-threads.obj: ../../plugin/threads.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -MT sslclient-threads.obj -MD -MP -MF $(DEPDIR)/sslclient-threads.Tpo -c -o sslclient-threads.obj `if test -f '../../plugin/threads.c'; then $(CYGPATH_W) '../../plugin/threads.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/threads.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslclient-threads.Tpo $(DEPDIR)/sslclient-threads.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/threads.c' object='sslclient-threads.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslclient_CFLAGS) $(CFLAGS) -c -o sslclient-threads.obj `if test -f '../../plugin/threads.c'; then $(CYGPATH_W) '../../plugin/threads.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/threads.c'; fi` sslserver-sslserver.o: sslserver.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -MT sslserver-sslserver.o -MD -MP -MF $(DEPDIR)/sslserver-sslserver.Tpo -c -o sslserver-sslserver.o `test -f 'sslserver.c' || echo '$(srcdir)/'`sslserver.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslserver-sslserver.Tpo $(DEPDIR)/sslserver-sslserver.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sslserver.c' object='sslserver-sslserver.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -c -o sslserver-sslserver.o `test -f 'sslserver.c' || echo '$(srcdir)/'`sslserver.c sslserver-sslserver.obj: sslserver.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -MT sslserver-sslserver.obj -MD -MP -MF $(DEPDIR)/sslserver-sslserver.Tpo -c -o sslserver-sslserver.obj `if test -f 'sslserver.c'; then $(CYGPATH_W) 'sslserver.c'; else $(CYGPATH_W) '$(srcdir)/sslserver.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslserver-sslserver.Tpo $(DEPDIR)/sslserver-sslserver.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sslserver.c' object='sslserver-sslserver.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -c -o sslserver-sslserver.obj `if test -f 'sslserver.c'; then $(CYGPATH_W) 'sslserver.c'; else $(CYGPATH_W) '$(srcdir)/sslserver.c'; fi` sslserver-soapServer.o: soapServer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -MT sslserver-soapServer.o -MD -MP -MF $(DEPDIR)/sslserver-soapServer.Tpo -c -o sslserver-soapServer.o `test -f 'soapServer.c' || echo '$(srcdir)/'`soapServer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslserver-soapServer.Tpo $(DEPDIR)/sslserver-soapServer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapServer.c' object='sslserver-soapServer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -c -o sslserver-soapServer.o `test -f 'soapServer.c' || echo '$(srcdir)/'`soapServer.c sslserver-soapServer.obj: soapServer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -MT sslserver-soapServer.obj -MD -MP -MF $(DEPDIR)/sslserver-soapServer.Tpo -c -o sslserver-soapServer.obj `if test -f 'soapServer.c'; then $(CYGPATH_W) 'soapServer.c'; else $(CYGPATH_W) '$(srcdir)/soapServer.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslserver-soapServer.Tpo $(DEPDIR)/sslserver-soapServer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapServer.c' object='sslserver-soapServer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -c -o sslserver-soapServer.obj `if test -f 'soapServer.c'; then $(CYGPATH_W) 'soapServer.c'; else $(CYGPATH_W) '$(srcdir)/soapServer.c'; fi` sslserver-soapC.o: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -MT sslserver-soapC.o -MD -MP -MF $(DEPDIR)/sslserver-soapC.Tpo -c -o sslserver-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslserver-soapC.Tpo $(DEPDIR)/sslserver-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='sslserver-soapC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -c -o sslserver-soapC.o `test -f 'soapC.c' || echo '$(srcdir)/'`soapC.c sslserver-soapC.obj: soapC.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -MT sslserver-soapC.obj -MD -MP -MF $(DEPDIR)/sslserver-soapC.Tpo -c -o sslserver-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslserver-soapC.Tpo $(DEPDIR)/sslserver-soapC.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='soapC.c' object='sslserver-soapC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -c -o sslserver-soapC.obj `if test -f 'soapC.c'; then $(CYGPATH_W) 'soapC.c'; else $(CYGPATH_W) '$(srcdir)/soapC.c'; fi` sslserver-threads.o: ../../plugin/threads.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -MT sslserver-threads.o -MD -MP -MF $(DEPDIR)/sslserver-threads.Tpo -c -o sslserver-threads.o `test -f '../../plugin/threads.c' || echo '$(srcdir)/'`../../plugin/threads.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslserver-threads.Tpo $(DEPDIR)/sslserver-threads.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/threads.c' object='sslserver-threads.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -c -o sslserver-threads.o `test -f '../../plugin/threads.c' || echo '$(srcdir)/'`../../plugin/threads.c sslserver-threads.obj: ../../plugin/threads.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -MT sslserver-threads.obj -MD -MP -MF $(DEPDIR)/sslserver-threads.Tpo -c -o sslserver-threads.obj `if test -f '../../plugin/threads.c'; then $(CYGPATH_W) '../../plugin/threads.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/threads.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sslserver-threads.Tpo $(DEPDIR)/sslserver-threads.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../plugin/threads.c' object='sslserver-threads.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sslserver_CFLAGS) $(CFLAGS) -c -o sslserver-threads.obj `if test -f '../../plugin/threads.c'; then $(CYGPATH_W) '../../plugin/threads.c'; else $(CYGPATH_W) '$(srcdir)/../../plugin/threads.c'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/sslclient-soapC.Po -rm -f ./$(DEPDIR)/sslclient-soapClient.Po -rm -f ./$(DEPDIR)/sslclient-ssl_setup.Po -rm -f ./$(DEPDIR)/sslclient-sslclient.Po -rm -f ./$(DEPDIR)/sslclient-threads.Po -rm -f ./$(DEPDIR)/sslserver-soapC.Po -rm -f ./$(DEPDIR)/sslserver-soapServer.Po -rm -f ./$(DEPDIR)/sslserver-sslserver.Po -rm -f ./$(DEPDIR)/sslserver-threads.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/sslclient-soapC.Po -rm -f ./$(DEPDIR)/sslclient-soapClient.Po -rm -f ./$(DEPDIR)/sslclient-ssl_setup.Po -rm -f ./$(DEPDIR)/sslclient-sslclient.Po -rm -f ./$(DEPDIR)/sslclient-threads.Po -rm -f ./$(DEPDIR)/sslserver-soapC.Po -rm -f ./$(DEPDIR)/sslserver-soapServer.Po -rm -f ./$(DEPDIR)/sslserver-sslserver.Po -rm -f ./$(DEPDIR)/sslserver-threads.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/ssl/cert.sh0000644000175000017500000000314113525245163017140 0ustar ellertellert#!/bin/sh if [ "$#" = 1 ] then echo "* This utility create certificate ${1}.pem signed by the root CA:" echo "* ${1}cert.pem - public key (CA-signed certificate to be shared)" echo "* ${1}key.pem - private key (keep this secret)" echo "* ${1}.pem - private key bundled with certificates (keep secret)" echo "* Distribute the CA root cacert.pem (and/or ${1}cert.pem when needed)" echo "* Before using this utility, create a root CA root.pem using root.sh" echo "* Keep ${1}.pem key file secret: store locally with client/server app" echo "*" echo "* Enter a secret pass phrase when requested" echo "* The pass phrase is used to access ${1}.pem in your application" echo "* Enter the server's host name as the Common Name when requested" echo "* Enter the root CA pass phrase (Getting CA Private Key) to sign the key file" echo "* The key file will expire after three years or when the root CA expires" # Create a certificate and signing request openssl req -newkey rsa:1024 -sha1 -keyout ${1}key.pem -out ${1}req.pem # Sign the certificate with the root CA openssl x509 -req -in ${1}req.pem -sha1 -extfile openssl.cnf -extensions usr_cert -CA root.pem -CAkey root.pem -CAcreateserial -out ${1}cert.pem -days 1095 # Bundle the CA certificate cacert with the certificate file cat ${1}cert.pem cacert.pem > ${1}tmp.pem mv -f ${1}tmp.pem ${1}cert.pem # Bundle certificates with the private key file cat ${1}key.pem ${1}cert.pem > ${1}.pem # Show what we got openssl x509 -subject -issuer -dates -noout -in ${1}.pem else echo "Usage: cert.sh " exit 1 fi gsoap-2.8.91/gsoap/samples/ssl/clientcert.pem0000644000175000017500000000522113525245163020507 0ustar ellertellert-----BEGIN CERTIFICATE----- MIID4TCCA0qgAwIBAgIBIDANBgkqhkiG9w0BAQUFADCBjTELMAkGA1UEBhMCVVMx CzAJBgNVBAgTAkZMMRQwEgYDVQQHEwtUYWxsYWhhc3NlZTEWMBQGA1UEChMNR2Vu aXZpYSwgSW5jLjELMAkGA1UECxMCSVQxEjAQBgNVBAMTCWxvY2FsaG9zdDEiMCAG CSqGSIb3DQEJARYTY29udGFjdEBnZW5pdmlhLmNvbTAeFw0xODA4MjUxNzU4MDha Fw0yMTA4MjQxNzU4MDhaMIGNMQswCQYDVQQGEwJVUzELMAkGA1UECBMCRkwxFDAS BgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJbmMuMQswCQYD VQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcNAQkBFhNjb250 YWN0QGdlbml2aWEuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDPMEu7 ZzcMf8q9pswCg4IMsolqh9zAZxC/fWB+9bQLghD+wjfAna3BP2mvqx+TR0xS4Y/a yDo6yOddFJPujZa61c6wZQvSDhOYBpaQTQhh0XiXfWdVroIvZP0aHmdVzbUUi8IB DtXaOSZMAHALWr94JhcORxKmlpGxK6ldi7UuxQIDAQABo4IBTTCCAUkwCQYDVR0T BAIwADALBgNVHQ8EBAMCBPAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd BgNVHQ4EFgQURsvkJ2+Evc35UiOMgTjDPf3xItcwgcIGA1UdIwSBujCBt4AUVixg D6n5N0NNc/tWvNSYuhDTKkmhgZOkgZAwgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb22CCQCG9y4FBiOi4zANBgkqhkiG9w0BAQUF AAOBgQCstkf6RkWhM6XzS7e9sHQJc7t3ErT4m0+Py8MyApuX5Yx5/byhCGTRjotr qmWONRiathIRwhUPgi4DYqD2YnDZsmNWVgeeMubyzkXI+M2XBus2hQsSg49pgnm/ dYPoI3GtWYk7XK9LBaE4E5LC1aZO7JOrQHyZ5810K9qQEcs2Dg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJAIb3LgUGI6LjMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE4MDgy NTE3NTczNloXDTIxMDgyNDE3NTczNlowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBAMXNOWKaNVtyWpWa/5/mNXZ7cgv+v5B1RL0OoOwvoQ5dHhc4KycDPAtiiV+I AoZy7bLbARWJboLPo3JnOf3Mc0aQjVFXz+X8eVhEseCIP4HAWSGa5ISDVDdxj4Nh RfwlVtrmLdL08HkTr+f3scHRvtvtmAtTFeT9FOCzttMpBRTXAgMBAAGjgfUwgfIw HQYDVR0OBBYEFFYsYA+p+TdDTXP7VrzUmLoQ0ypJMIHCBgNVHSMEgbowgbeAFFYs YA+p+TdDTXP7VrzUmLoQ0ypJoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkAhvcuBQYjouMwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQA1xebtW3G5e9Xfz2zys4d+628r2qy4ov0ggGS5 WmrBhyIFCE+xW1bj5waLMOt0e4+yfODMTcVKArrrthJdHm5YFILT9ZU2hOEOZw5P Dizc3Q34yzQxXrpsaHri5OfM0wgiIJOynz/YbX2f46YpqhMT7VvNoI8sR+OIydcY mi3qVQ== -----END CERTIFICATE----- gsoap-2.8.91/gsoap/samples/ssl/ssl_setup.c0000644000175000017500000002204013525245163020033 0ustar ellertellert/* ssl_setup.c / ssl_setup.cpp See instructions below. gSOAP XML Web services tools Copyright (C) 2000-2019, 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-2010, 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 -------------------------------------------------------------------------------- */ /* Easy TLS/SSL setup with soap_ssl_client_setup() to replace soap_ssl_client_context(): - automatically uses certificates stored in Unix/Linux common locations - automatically uses Windows system certificate store - when -DWITH_WININET is defined, uses the gSOAP WinInet plugin with WinInet system certificate store - when -DWITH_CURL is defined, uses the gSOAP CURL plugin with CURL certificate store Requires: - compilation with -DWITH_OPENSSL or -DWITH_GNUTLS - compilation with -DWITH_WININET when the gSOAP WinInet plugin is used - compilation with -DWITH_CURL when the gSOAP CURL plugin is used Example usage: #include "thread_setup.h" // CRYPTO_thread_setup, CRYPTO_thread_cleanup #include "ssl_setup.h" // soap_ssl_client_setup, soap_ssl_client_cleanup int main() { // OpenSSL versions prior to 1.1.0 require mutex locks if (CRYPTO_thread_setup()) exit(EXIT_FAILURE); struct soap *soap = soap_new(); if (soap_ssl_client_setup( soap, SOAP_SSL_DEFAULT, // authenticate servers NULL, // a keyfile is required only when client must authenticate to server, NULL otherwise NULL, // password to read the key file (not used with GNUTLS), NULL otherwise NULL, // optional file name of certificates PEM file, NULL to search certificate stores NULL // optional path to certificates PEM files, NULL to search certificate stores )) { soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } ... // rest of the code to run the client making https and http calls ... // use soap_copy(soap) to create copies of the context with this setup ... // which is efficient and cheap to execute, or use soap_new() and ... // soap_ssl_client_setup() again to setup contexts but this is more ... // expensive since it searches for certificate files again CRYPTO_thread_cleanup(); } */ #include "stdsoap2.h" #if defined(WIN32) || defined(_WIN32) || defined(_WIN64) #if (defined(WITH_OPENSSL) || defined(WITH_GNUTLS)) && !defined(WITH_WININET) && !defined(GSOAP_WIN_WININET) && !defined(WITH_CURL) #include #endif #ifndef SOAP_CLIENT_OS_WINDOWS #define SOAP_CLIENT_OS_WINDOWS #endif #endif #if (defined(WITH_OPENSSL) || defined(WITH_GNUTLS)) && !defined(SOAP_CLIENT_OS_WINDOWS) && !defined(WITH_WININET) && !defined(GSOAP_WIN_WININET) && !defined(WITH_CURL) #include /* from curl configure or https://serverfault.com/questions/62496/ssl-certificate-location-on-unix-linux */ static const char *list_candidate_cacert[] = { "/etc/ssl/certs/ca-certificates.crt", "/etc/pki/tls/certs/ca-bundle.crt", "/etc/ssl/cert.pem", "/etc/pki/tls/cacert.pem", "/etc/ssl/ca-bundle.pem", "/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem", "/usr/share/ssl/certs/ca-bundle.crt", "/usr/local/share/certs/ca-root-nss.crt", NULL }; static const char *search_cacert_default_file() { int i = 0; for (;;) { const char *fname = list_candidate_cacert[i++]; if (!fname) break; if (access(fname, F_OK) != -1) return fname; } return NULL; } static const char *list_candidate_capath[] = { "/etc/ssl/certs", NULL }; static const char *search_cacert_default_path() { int i = 0; for (;;) { struct stat statbuf; const char *fdir = list_candidate_capath[i++]; if (!fdir) break; if (stat(fdir, &statbuf) != -1 && S_ISDIR(statbuf.st_mode)) return fdir; } return NULL; } #else static const char *search_cacert_default_file() { return NULL; } static const char *search_cacert_default_path() { return NULL; } #endif #if (defined(WITH_OPENSSL) || defined(WITH_GNUTLS)) && defined(SOAP_CLIENT_OS_WINDOWS) && !defined(WITH_WININET) && !defined(GSOAP_WIN_WININET) && !defined(WITH_CURL) #include #include #pragma comment(lib, "crypt32.lib") /* from https://stackoverflow.com/questions/9507184/can-openssl-on-windows-use-the-system-certificate-store/15451831 */ /* from https://github.com/d3x0r/SACK/blob/master/src/netlib/ssl_layer.c#L1037 */ static bool Add_InStore_from_Windows_Store(X509_STORE *store, LPCWSTR szSubsystemProtocol) { HCERTSTORE hStore; PCCERT_CONTEXT pContext = NULL; X509 *x509; hStore = CertOpenSystemStoreW((HCRYPTPROV_LEGACY)NULL, szSubsystemProtocol); if (!hStore) { /* lprintf("FATAL, CANNOT OPEN ROOT STORE"); */ return false; } while ((pContext = CertEnumCertificatesInStore(hStore, pContext))) { /* uncomment this block if you want to see the certificates as pop ups: #include "cryptuiapi.h" #pragma comment (lib, "cryptui.lib") CryptUIDlgViewContext(CERT_STORE_CERTIFICATE_CONTEXT, pContext, NULL, NULL, 0, NULL); */ const unsigned char *encoded_cert = (const unsigned char*)pContext->pbCertEncoded; x509 = d2i_X509(NULL, &encoded_cert, pContext->cbCertEncoded); if (x509) { X509_STORE_add_cert(store, x509); X509_free(x509); } } CertFreeCertificateContext(pContext); CertCloseStore(hStore, 0); return true; } #endif int soap_ssl_client_setup( struct soap *soap, /* the context */ unsigned short flags, /* SOAP_SSL_DEFAULT, SOAP_SSL_NO_AUTHENTICATION etc */ const char *keyfile, /* required only when client must authenticate to server, NULL otherwise */ const char *password, /* password to read the key file (not used with GNUTLS), NULL otherwise */ const char *cacert, /* optionally assign file name of certificates PEM file, NULL to search certificate stores */ const char *capath) /* optionally assign path to certificates PEM files, NULL to search certificate stores */ { #if (defined(WITH_OPENSSL) || defined(WITH_GNUTLS)) && !defined(WITH_WININET) && !defined(GSOAP_WIN_WININET) && !defined(WITH_CURL) if ((flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION) && !cacert && !capath) { cacert = search_cacert_default_file(); if (!cacert) capath = search_cacert_default_path(); } if (soap_ssl_client_context(soap, flags, keyfile, /* required only when client must authenticate to server */ password, /* password to read the key file (not used with GNUTLS) */ cacert, /* cacert file to store trusted certificates */ capath, /* capath to directory with trusted certificates */ NULL /* if randfile!=NULL: use a file with random data to seed randomness */ )) { return soap->error; } #if defined(SOAP_CLIENT_OS_WINDOWS) if ((flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION) && !cacert && !capath) { X509_STORE *store = SSL_CTX_get_cert_store(soap->ctx); /* only ROOT appears to be useful */ Add_InStore_from_Windows_Store(store, L"ROOT"); /* Add_InStore_from_Windows_Store(store, L"CA"); */ /* Add_InStore_from_Windows_Store(store, L"MY"); */ } #endif #endif return SOAP_OK; } gsoap-2.8.91/gsoap/samples/ssl/server.pem0000644000175000017500000000724213525245163017666 0ustar ellertellert-----BEGIN ENCRYPTED PRIVATE KEY----- MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIQcdZuFt0YzgCAggA MBQGCCqGSIb3DQMHBAig/PutfpxHfwSCAoCSsevV3jWwaMLqzkz4FtHPPKI9Guiz y3HjO4uHUnTZNyHA87ukCBYcn06fj4lLsdzShC4PKq1us9WlPgp7iXjS3HxvSNkV JaKfZ1W0LtNnY5BJvp+rFgmrO0/FWwVBuCg4yQCO0PtREif5Sf47qMn/uQI+G9K9 nZcav3w+nI6p9pwUcyFEpKFMLixCFNBHnQCO0SA7PsSHcHe8vntvMXGYnnEjjSq7 pjD2eIV0A5lDYn/u0HQasY0FvLqbDWblZtcI2DAAbwzq0YPK3kPYEKUe/9r3JT5o kRsVak7ZOao1Xfd4c57QrRk4zNuPLDmQJFi3FhtScMGB2de5QIKnzvAyjU2TMhKK xezFZ173p6wNO7+xTmurZ5wfgZQ9EbbaGzdFMhH+IZA0NEVogZn40fjoWKR0Xhwc FfQUuCraq9O7V6xmR19vJNzGGD5WljzTaHPdqlJiBof9L32IfJnEMelr4wf/kZFq VMYieFjB8GZslZEKJC3Y3r+4KOZwdPz3fPCTyYcYt13TFRc+ffE632GHZr4LRrJD +Gy8QHxkA1veyeh+2U52lJylzK2JKQ2nqcIk0d5AIizAf4e6Ow2NXmUgUpirJgUH hfI4Ejed8zgoqk5T2k1jj8zY7I7lpHo4V5Fi5lwc3ubzKZi6lD/Rdqcz3uZUN8gQ 8ZQe4XHtImsS9QkgdAeVgzLW5rKrx5UKYI2z7538YAanSJGX0N2c6Fsd0rx4sFkx HqVgwy0JEZT2ajwdkVOXIEnVZ7/immdAyddeYnxnHl6GnKP6i7vN8/9jCu/VSSzt HECoqQ7eu0j+PsAN0N0JVbTJMEgWwkKc7RG+4M4MNIbTbLJn16KEfCxD -----END ENCRYPTED PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIID4TCCA0qgAwIBAgIBITANBgkqhkiG9w0BAQUFADCBjTELMAkGA1UEBhMCVVMx CzAJBgNVBAgTAkZMMRQwEgYDVQQHEwtUYWxsYWhhc3NlZTEWMBQGA1UEChMNR2Vu aXZpYSwgSW5jLjELMAkGA1UECxMCSVQxEjAQBgNVBAMTCWxvY2FsaG9zdDEiMCAG CSqGSIb3DQEJARYTY29udGFjdEBnZW5pdmlhLmNvbTAeFw0xODA4MjUxNzU4Mzda Fw0yMTA4MjQxNzU4MzdaMIGNMQswCQYDVQQGEwJVUzELMAkGA1UECBMCRkwxFDAS BgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJbmMuMQswCQYD VQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcNAQkBFhNjb250 YWN0QGdlbml2aWEuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDsMNey f1zqU26XTAYsjsHVfSzuQcHX7H6rVDej4i+syy7JF198AlZXKNyx+lDbDzTWmEJM wJtelxoVmnnIJPYTxWlWYCXc+9QwopQ4Jm0rANdfTujDDHug2uMxfTiJNJGq4eOm VrghruL6l96H5aHveauzUh7XiEbcFSL9+1h8twIDAQABo4IBTTCCAUkwCQYDVR0T BAIwADALBgNVHQ8EBAMCBPAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd BgNVHQ4EFgQUl21S3PtNIU5VptaFc0rS21mVve4wgcIGA1UdIwSBujCBt4AUVixg D6n5N0NNc/tWvNSYuhDTKkmhgZOkgZAwgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb22CCQCG9y4FBiOi4zANBgkqhkiG9w0BAQUF AAOBgQBE4Swc3a+wyEXqXGB753H10PmpqpcmpUaLmTfBKvgl1WeLhAZqcpKiKWnH s2BNKE68Ndlopo4ttP3DIkf69vKrUrTANzui5pdShdEom6SJ1yjm/mTFSXNOxAs7 kkbwMTnYltSLvNLdBV22pVmHbRP0G6xwTi7Br5ZIGcQGEQDaDw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJAIb3LgUGI6LjMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE4MDgy NTE3NTczNloXDTIxMDgyNDE3NTczNlowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBAMXNOWKaNVtyWpWa/5/mNXZ7cgv+v5B1RL0OoOwvoQ5dHhc4KycDPAtiiV+I AoZy7bLbARWJboLPo3JnOf3Mc0aQjVFXz+X8eVhEseCIP4HAWSGa5ISDVDdxj4Nh RfwlVtrmLdL08HkTr+f3scHRvtvtmAtTFeT9FOCzttMpBRTXAgMBAAGjgfUwgfIw HQYDVR0OBBYEFFYsYA+p+TdDTXP7VrzUmLoQ0ypJMIHCBgNVHSMEgbowgbeAFFYs YA+p+TdDTXP7VrzUmLoQ0ypJoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkAhvcuBQYjouMwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQA1xebtW3G5e9Xfz2zys4d+628r2qy4ov0ggGS5 WmrBhyIFCE+xW1bj5waLMOt0e4+yfODMTcVKArrrthJdHm5YFILT9ZU2hOEOZw5P Dizc3Q34yzQxXrpsaHri5OfM0wgiIJOynz/YbX2f46YpqhMT7VvNoI8sR+OIydcY mi3qVQ== -----END CERTIFICATE----- gsoap-2.8.91/gsoap/samples/ssl/client.pem0000644000175000017500000000724213525245163017636 0ustar ellertellert-----BEGIN ENCRYPTED PRIVATE KEY----- MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIaWE062ig1DwCAggA MBQGCCqGSIb3DQMHBAiV2CAcBIqLvgSCAoAb2rFc/f92WlyYUdMgbb1/DXzLve/T hH54rQiYOz0amfOReQGGxgSvatKRtSJY67fh8K5aoqqV+UKoXhYtb4jxAJtdszrM QlMKGVze2tsBCnjDYJf9aPVQFYDlRTcAqLYd6p+SScVHUaPNk0DND0qhvgN8bs31 QMiSFxZLEE5WJKBlIYiJ0JZSdNRMf+D7aZCe4fTJ+GHE8zQJ1DwvHE/4KKaUFNPS OMrAU2ew1WdjORP2uYKW+uur1IQOL0Op6+h2jGqvzeS1yTBOeaDP/qM0cS8u3wBH uRmE2RWpI69lgb8clsNlRpd8sod0q2K0RruwbHlzSS0f8YEYQDNMIaqFTOv2bDcB lMHa6UTzoacGTAhiaI9T9LwiHOQP7fmXMfQcSCXH/K6IO4A6pjcUW1ZntaNQzK0C fDR2iSEwUbJxlgoUmR9Knv15kMBlOs5kVvvlYYS/gDIoZP73kqDIntyjjnfgJCOu K/2JQ8VyPkeqZPzVR8BRUZ7VIH0AropEXZpFOHWL226ye7i6qHivA5ZEIOgPhKd9 PmbnHN3GDFnSDUNgj3ZS95XwJ+7rsF73NO9TzkUYcsktIaanc591SPFTDznB7AIE k280QJbGPJaM6B2bpFZHCHt53vdg2IeFcSQlBPASmySYFblhI8GH+wETuvb0I1GA ZsCb1H3jWflYW8Ma03ZiQ8Y28acGm/GjTYEXco5LNHXXMA6gYv1DFurfaa3jdU7K +JOyPHYdtJKKv9g+OVXG+MF8kRWX16U6SzS/0xFCYoXsHUVggzV+y1ssghPeAIL3 5sRXN+3GYkSi7e0hyp7Xn5QDcgeTxhsY/BPelhFRNwM1pt0UG1LiEr23 -----END ENCRYPTED PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIID4TCCA0qgAwIBAgIBIDANBgkqhkiG9w0BAQUFADCBjTELMAkGA1UEBhMCVVMx CzAJBgNVBAgTAkZMMRQwEgYDVQQHEwtUYWxsYWhhc3NlZTEWMBQGA1UEChMNR2Vu aXZpYSwgSW5jLjELMAkGA1UECxMCSVQxEjAQBgNVBAMTCWxvY2FsaG9zdDEiMCAG CSqGSIb3DQEJARYTY29udGFjdEBnZW5pdmlhLmNvbTAeFw0xODA4MjUxNzU4MDha Fw0yMTA4MjQxNzU4MDhaMIGNMQswCQYDVQQGEwJVUzELMAkGA1UECBMCRkwxFDAS BgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJbmMuMQswCQYD VQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcNAQkBFhNjb250 YWN0QGdlbml2aWEuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDPMEu7 ZzcMf8q9pswCg4IMsolqh9zAZxC/fWB+9bQLghD+wjfAna3BP2mvqx+TR0xS4Y/a yDo6yOddFJPujZa61c6wZQvSDhOYBpaQTQhh0XiXfWdVroIvZP0aHmdVzbUUi8IB DtXaOSZMAHALWr94JhcORxKmlpGxK6ldi7UuxQIDAQABo4IBTTCCAUkwCQYDVR0T BAIwADALBgNVHQ8EBAMCBPAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd BgNVHQ4EFgQURsvkJ2+Evc35UiOMgTjDPf3xItcwgcIGA1UdIwSBujCBt4AUVixg D6n5N0NNc/tWvNSYuhDTKkmhgZOkgZAwgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb22CCQCG9y4FBiOi4zANBgkqhkiG9w0BAQUF AAOBgQCstkf6RkWhM6XzS7e9sHQJc7t3ErT4m0+Py8MyApuX5Yx5/byhCGTRjotr qmWONRiathIRwhUPgi4DYqD2YnDZsmNWVgeeMubyzkXI+M2XBus2hQsSg49pgnm/ dYPoI3GtWYk7XK9LBaE4E5LC1aZO7JOrQHyZ5810K9qQEcs2Dg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJAIb3LgUGI6LjMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE4MDgy NTE3NTczNloXDTIxMDgyNDE3NTczNlowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBAMXNOWKaNVtyWpWa/5/mNXZ7cgv+v5B1RL0OoOwvoQ5dHhc4KycDPAtiiV+I AoZy7bLbARWJboLPo3JnOf3Mc0aQjVFXz+X8eVhEseCIP4HAWSGa5ISDVDdxj4Nh RfwlVtrmLdL08HkTr+f3scHRvtvtmAtTFeT9FOCzttMpBRTXAgMBAAGjgfUwgfIw HQYDVR0OBBYEFFYsYA+p+TdDTXP7VrzUmLoQ0ypJMIHCBgNVHSMEgbowgbeAFFYs YA+p+TdDTXP7VrzUmLoQ0ypJoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkAhvcuBQYjouMwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQA1xebtW3G5e9Xfz2zys4d+628r2qy4ov0ggGS5 WmrBhyIFCE+xW1bj5waLMOt0e4+yfODMTcVKArrrthJdHm5YFILT9ZU2hOEOZw5P Dizc3Q34yzQxXrpsaHri5OfM0wgiIJOynz/YbX2f46YpqhMT7VvNoI8sR+OIydcY mi3qVQ== -----END CERTIFICATE----- gsoap-2.8.91/gsoap/samples/ssl/dh2048.pem0000644000175000017500000000065013525245163017265 0ustar ellertellert-----BEGIN DH PARAMETERS----- MIIBCAKCAQEA9R6X6I4D0/ZC7MgiaVKdzQLQyAexIr6UlBxiWIO8v1YiGHfuc8xN YnBMWkbGfJu7a0kC/qApeLYVsPu5FYFvoGHX9InmyYaS31R/5sgB+zBRwuPSyAjF u0rlIGPIlb4avmUVdMWGZej0BHiB52eBP4ySKAg3eh0lUQxZUpnnZ9AlvoD6VuXj hnwaeE2pSEMmhnNEW3EgrfikwxUSiSAzfeR1cIehhU09O+0IUl5X8dtZ5ngcQNr2 k44bHefFIubaOjLKgaiTuqd8MRW3BIX/WG/5D5lI1TZBfGSsuA6gbXLbgWfvlvaB cNKQ0gNc4OCKPu8GW0QTTDY7ZWKstPuDEwIBAg== -----END DH PARAMETERS----- gsoap-2.8.91/gsoap/samples/ssl/servercert.pem0000644000175000017500000000522113525245163020537 0ustar ellertellert-----BEGIN CERTIFICATE----- MIID4TCCA0qgAwIBAgIBITANBgkqhkiG9w0BAQUFADCBjTELMAkGA1UEBhMCVVMx CzAJBgNVBAgTAkZMMRQwEgYDVQQHEwtUYWxsYWhhc3NlZTEWMBQGA1UEChMNR2Vu aXZpYSwgSW5jLjELMAkGA1UECxMCSVQxEjAQBgNVBAMTCWxvY2FsaG9zdDEiMCAG CSqGSIb3DQEJARYTY29udGFjdEBnZW5pdmlhLmNvbTAeFw0xODA4MjUxNzU4Mzda Fw0yMTA4MjQxNzU4MzdaMIGNMQswCQYDVQQGEwJVUzELMAkGA1UECBMCRkwxFDAS BgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJbmMuMQswCQYD VQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcNAQkBFhNjb250 YWN0QGdlbml2aWEuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDsMNey f1zqU26XTAYsjsHVfSzuQcHX7H6rVDej4i+syy7JF198AlZXKNyx+lDbDzTWmEJM wJtelxoVmnnIJPYTxWlWYCXc+9QwopQ4Jm0rANdfTujDDHug2uMxfTiJNJGq4eOm VrghruL6l96H5aHveauzUh7XiEbcFSL9+1h8twIDAQABo4IBTTCCAUkwCQYDVR0T BAIwADALBgNVHQ8EBAMCBPAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd BgNVHQ4EFgQUl21S3PtNIU5VptaFc0rS21mVve4wgcIGA1UdIwSBujCBt4AUVixg D6n5N0NNc/tWvNSYuhDTKkmhgZOkgZAwgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb22CCQCG9y4FBiOi4zANBgkqhkiG9w0BAQUF AAOBgQBE4Swc3a+wyEXqXGB753H10PmpqpcmpUaLmTfBKvgl1WeLhAZqcpKiKWnH s2BNKE68Ndlopo4ttP3DIkf69vKrUrTANzui5pdShdEom6SJ1yjm/mTFSXNOxAs7 kkbwMTnYltSLvNLdBV22pVmHbRP0G6xwTi7Br5ZIGcQGEQDaDw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJAIb3LgUGI6LjMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE4MDgy NTE3NTczNloXDTIxMDgyNDE3NTczNlowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBAMXNOWKaNVtyWpWa/5/mNXZ7cgv+v5B1RL0OoOwvoQ5dHhc4KycDPAtiiV+I AoZy7bLbARWJboLPo3JnOf3Mc0aQjVFXz+X8eVhEseCIP4HAWSGa5ISDVDdxj4Nh RfwlVtrmLdL08HkTr+f3scHRvtvtmAtTFeT9FOCzttMpBRTXAgMBAAGjgfUwgfIw HQYDVR0OBBYEFFYsYA+p+TdDTXP7VrzUmLoQ0ypJMIHCBgNVHSMEgbowgbeAFFYs YA+p+TdDTXP7VrzUmLoQ0ypJoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkAhvcuBQYjouMwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQA1xebtW3G5e9Xfz2zys4d+628r2qy4ov0ggGS5 WmrBhyIFCE+xW1bj5waLMOt0e4+yfODMTcVKArrrthJdHm5YFILT9ZU2hOEOZw5P Dizc3Q34yzQxXrpsaHri5OfM0wgiIJOynz/YbX2f46YpqhMT7VvNoI8sR+OIydcY mi3qVQ== -----END CERTIFICATE----- gsoap-2.8.91/gsoap/samples/ssl/thread_setup.c0000644000175000017500000000520013525245163020500 0ustar ellertellert/* All OpenSSL versions prior to 1.1.0 require mutex locks to be explicitly setup to work safely with multi-threaded applications At the start of your program call: soap_ssl_init(); CRYPTO_thread_setup(); At the end of your program call: CRYPTO_thread_cleanup(); Compile together with gsoap/plugin/threads.c The CRYPTO_thread_setup() and CRYPTO_thread_cleanup() are effective for OpenSSL versions prior to 1.1.0 but otherwise have no effect. */ #include "threads.h" /* gsoap/plugin/threads.h */ #if defined(WITH_OPENSSL) struct CRYPTO_dynlock_value { MUTEX_TYPE mutex; }; static MUTEX_TYPE *mutex_buf = NULL; static struct CRYPTO_dynlock_value *dyn_create_function(const char *file, int line) { struct CRYPTO_dynlock_value *value; (void)file; (void)line; value = (struct CRYPTO_dynlock_value*)OPENSSL_malloc(sizeof(struct CRYPTO_dynlock_value)); if (value) MUTEX_SETUP(value->mutex); return value; } static void dyn_lock_function(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line) { (void)file; (void)line; if (mode & CRYPTO_LOCK) MUTEX_LOCK(l->mutex); else MUTEX_UNLOCK(l->mutex); } static void dyn_destroy_function(struct CRYPTO_dynlock_value *l, const char *file, int line) { (void)file; (void)line; MUTEX_CLEANUP(l->mutex); OPENSSL_free(l); } static void locking_function(int mode, int n, const char *file, int line) { (void)file; (void)line; if (mode & CRYPTO_LOCK) MUTEX_LOCK(mutex_buf[n]); else MUTEX_UNLOCK(mutex_buf[n]); } static unsigned long id_function() { return (unsigned long)THREAD_ID; } int CRYPTO_thread_setup() { int i; mutex_buf = (MUTEX_TYPE*)OPENSSL_malloc(CRYPTO_num_locks() * sizeof(MUTEX_TYPE)); if (!mutex_buf) return SOAP_EOM; for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_SETUP(mutex_buf[i]); CRYPTO_set_id_callback(id_function); CRYPTO_set_locking_callback(locking_function); CRYPTO_set_dynlock_create_callback(dyn_create_function); CRYPTO_set_dynlock_lock_callback(dyn_lock_function); CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function); return SOAP_OK; } void CRYPTO_thread_cleanup() { int i; if (!mutex_buf) return; CRYPTO_set_id_callback(NULL); CRYPTO_set_locking_callback(NULL); CRYPTO_set_dynlock_create_callback(NULL); CRYPTO_set_dynlock_lock_callback(NULL); CRYPTO_set_dynlock_destroy_callback(NULL); for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_CLEANUP(mutex_buf[i]); OPENSSL_free(mutex_buf); mutex_buf = NULL; } #else /* OpenSSL not used or OpenSSL prior to 1.1.0 */ int CRYPTO_thread_setup() { return SOAP_OK; } void CRYPTO_thread_cleanup() { } #endif gsoap-2.8.91/gsoap/samples/ssl/cacerts.pem0000644000175000017500000062777613525245163020030 0ustar ellertellert# Part of the source for this file is provided by Mozilla: # http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 # This file was converted to PEM format with tools provided by OpenSSL. # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. GlobalSign Root CA ================== -----BEGIN CERTIFICATE----- MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== -----END CERTIFICATE----- GlobalSign Root CA - R2 ======================= -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp 9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu 01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== -----END CERTIFICATE----- Verisign Class 3 Public Primary Certification Authority - G3 ============================================================ -----BEGIN CERTIFICATE----- MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== -----END CERTIFICATE----- Entrust.net Premium 2048 Secure Server CA ========================================= -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= -----END CERTIFICATE----- Baltimore CyberTrust Root ========================= -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp -----END CERTIFICATE----- AddTrust External Root ====================== -----BEGIN CERTIFICATE----- MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= -----END CERTIFICATE----- Entrust Root Certification Authority ==================================== -----BEGIN CERTIFICATE----- MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 -----END CERTIFICATE----- GeoTrust Global CA ================== -----BEGIN CERTIFICATE----- MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet 8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm Mw== -----END CERTIFICATE----- GeoTrust Universal CA ===================== -----BEGIN CERTIFICATE----- MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs 7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d 8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI P/rmMuGNG2+k5o7Y+SlIis5z/iw= -----END CERTIFICATE----- GeoTrust Universal CA 2 ======================= -----BEGIN CERTIFICATE----- MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP 20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG 8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 +/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ 4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS -----END CERTIFICATE----- Visa eCommerce Root =================== -----BEGIN CERTIFICATE----- MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI /k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt 398znM/jra6O1I7mT1GvFpLgXPYHDw== -----END CERTIFICATE----- Comodo AAA Services root ======================== -----BEGIN CERTIFICATE----- MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== -----END CERTIFICATE----- QuoVadis Root CA ================ -----BEGIN CERTIFICATE----- MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi 5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi 5nrQNiOKSnQ2+Q== -----END CERTIFICATE----- QuoVadis Root CA 2 ================== -----BEGIN CERTIFICATE----- MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt 66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK +JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II 4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u -----END CERTIFICATE----- QuoVadis Root CA 3 ================== -----BEGIN CERTIFICATE----- MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= -----END CERTIFICATE----- Security Communication Root CA ============================== -----BEGIN CERTIFICATE----- MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw 8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX 5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g 0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ 6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi FL39vmwLAw== -----END CERTIFICATE----- Sonera Class 2 Root CA ====================== -----BEGIN CERTIFICATE----- MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 /Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt 0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH llpwrN9M -----END CERTIFICATE----- XRamp Global CA Root ==================== -----BEGIN CERTIFICATE----- MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc /Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz 8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= -----END CERTIFICATE----- Go Daddy Class 2 CA =================== -----BEGIN CERTIFICATE----- MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b vZ8= -----END CERTIFICATE----- Starfield Class 2 CA ==================== -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 QBFGmh95DmK/D5fs4C8fF5Q= -----END CERTIFICATE----- Taiwan GRCA =========== -----BEGIN CERTIFICATE----- MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O 1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk 7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy +fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS -----END CERTIFICATE----- DigiCert Assured ID Root CA =========================== -----BEGIN CERTIFICATE----- MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== -----END CERTIFICATE----- DigiCert Global Root CA ======================= -----BEGIN CERTIFICATE----- MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- DigiCert High Assurance EV Root CA ================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K -----END CERTIFICATE----- Certplus Class 2 Primary CA =========================== -----BEGIN CERTIFICATE----- MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR 5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ 7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW //1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 l7+ijrRU -----END CERTIFICATE----- DST Root CA X3 ============== -----BEGIN CERTIFICATE----- MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ -----END CERTIFICATE----- SwissSign Gold CA - G2 ====================== -----BEGIN CERTIFICATE----- MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR 7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm 5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr 44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ -----END CERTIFICATE----- SwissSign Silver CA - G2 ======================== -----BEGIN CERTIFICATE----- MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG 9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm +/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH 6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P 4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L 3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx /uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u -----END CERTIFICATE----- GeoTrust Primary Certification Authority ======================================== -----BEGIN CERTIFICATE----- MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG 1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= -----END CERTIFICATE----- thawte Primary Root CA ====================== -----BEGIN CERTIFICATE----- MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ 1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== -----END CERTIFICATE----- VeriSign Class 3 Public Primary Certification Authority - G5 ============================================================ -----BEGIN CERTIFICATE----- MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq -----END CERTIFICATE----- SecureTrust CA ============== -----BEGIN CERTIFICATE----- MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= -----END CERTIFICATE----- Secure Global CA ================ -----BEGIN CERTIFICATE----- MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW -----END CERTIFICATE----- COMODO Certification Authority ============================== -----BEGIN CERTIFICATE----- MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== -----END CERTIFICATE----- Network Solutions Certificate Authority ======================================= -----BEGIN CERTIFICATE----- MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc /Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q 4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey -----END CERTIFICATE----- COMODO ECC Certification Authority ================================== -----BEGIN CERTIFICATE----- MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X 4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= -----END CERTIFICATE----- OISTE WISeKey Global Root GA CA =============================== -----BEGIN CERTIFICATE----- MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ /yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 +vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= -----END CERTIFICATE----- Certigna ======== -----BEGIN CERTIFICATE----- MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY 1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== -----END CERTIFICATE----- Deutsche Telekom Root CA 2 ========================== -----BEGIN CERTIFICATE----- MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU Cm26OWMohpLzGITY+9HPBVZkVw== -----END CERTIFICATE----- Cybertrust Global Root ====================== -----BEGIN CERTIFICATE----- MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW 0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin 89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT 8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi 5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW WL1WMRJOEcgh4LMRkWXbtKaIOM5V -----END CERTIFICATE----- ePKI Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX 12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= -----END CERTIFICATE----- certSIGN ROOT CA ================ -----BEGIN CERTIFICATE----- MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD 0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD -----END CERTIFICATE----- GeoTrust Primary Certification Authority - G3 ============================================= -----BEGIN CERTIFICATE----- MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr 2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt -----END CERTIFICATE----- thawte Primary Root CA - G2 =========================== -----BEGIN CERTIFICATE----- MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== -----END CERTIFICATE----- thawte Primary Root CA - G3 =========================== -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC +BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY 7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC 8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= -----END CERTIFICATE----- GeoTrust Primary Certification Authority - G2 ============================================= -----BEGIN CERTIFICATE----- MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 npaqBA+K -----END CERTIFICATE----- VeriSign Universal Root Certification Authority =============================================== -----BEGIN CERTIFICATE----- MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj 1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 mJO37M2CYfE45k+XmCpajQ== -----END CERTIFICATE----- VeriSign Class 3 Public Primary Certification Authority - G4 ============================================================ -----BEGIN CERTIFICATE----- MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB /zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== -----END CERTIFICATE----- NetLock Arany (Class Gold) Főtanúsítvány ======================================== -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu 0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw /HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= -----END CERTIFICATE----- Staat der Nederlanden Root CA - G2 ================================== -----BEGIN CERTIFICATE----- MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ 5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65 48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737 qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz +51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm 66+KAQ== -----END CERTIFICATE----- Hongkong Post Root CA 1 ======================= -----BEGIN CERTIFICATE----- MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== -----END CERTIFICATE----- SecureSign RootCA11 =================== -----BEGIN CERTIFICATE----- MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= -----END CERTIFICATE----- Microsec e-Szigno Root CA 2009 ============================== -----BEGIN CERTIFICATE----- MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG 0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm 1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi LXpUq3DDfSJlgnCW -----END CERTIFICATE----- GlobalSign Root CA - R3 ======================= -----BEGIN CERTIFICATE----- MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ 0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r kpeDMdmztcpHWD9f -----END CERTIFICATE----- Autoridad de Certificacion Firmaprofesional CIF A62634068 ========================================================= -----BEGIN CERTIFICATE----- MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx 51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi 6Et8Vcad+qMUu2WFbm5PEn4KPJ2V -----END CERTIFICATE----- Izenpe.com ========== -----BEGIN CERTIFICATE----- MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ 03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU +zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK 0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ 0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== -----END CERTIFICATE----- Chambers of Commerce Root - 2008 ================================ -----BEGIN CERTIFICATE----- MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ 0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH 3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF 9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ -----END CERTIFICATE----- Global Chambersign Root - 2008 ============================== -----BEGIN CERTIFICATE----- MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB /gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp 1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG /5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg 9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z 09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B -----END CERTIFICATE----- Go Daddy Root Certificate Authority - G2 ======================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq 9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD +qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r 5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 -----END CERTIFICATE----- Starfield Root Certificate Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx 4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 -----END CERTIFICATE----- Starfield Services Root Certificate Authority - G2 ================================================== -----BEGIN CERTIFICATE----- MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 -----END CERTIFICATE----- AffirmTrust Commercial ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv 0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= -----END CERTIFICATE----- AffirmTrust Networking ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 /PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 /ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= -----END CERTIFICATE----- AffirmTrust Premium =================== -----BEGIN CERTIFICATE----- MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV 5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs +7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 /bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo +Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC 6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK +4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== -----END CERTIFICATE----- AffirmTrust Premium ECC ======================= -----BEGIN CERTIFICATE----- MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X 57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM eQ== -----END CERTIFICATE----- Certum Trusted Network CA ========================= -----BEGIN CERTIFICATE----- MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= -----END CERTIFICATE----- TWCA Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP 4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG 9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== -----END CERTIFICATE----- Security Communication RootCA2 ============================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ +T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R 3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk 3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 -----END CERTIFICATE----- EC-ACC ====== -----BEGIN CERTIFICATE----- MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw 0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D 5EI= -----END CERTIFICATE----- Hellenic Academic and Research Institutions RootCA 2011 ======================================================= -----BEGIN CERTIFICATE----- MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI 1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa 71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u 8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH 3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD /md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N 7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 -----END CERTIFICATE----- Actalis Authentication Root CA ============================== -----BEGIN CERTIFICATE----- MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC 4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo 2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== -----END CERTIFICATE----- Trustis FPS Root CA =================== -----BEGIN CERTIFICATE----- MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P 8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl iB6XzCGcKQENZetX2fNXlrtIzYE= -----END CERTIFICATE----- Buypass Class 2 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn 9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b /+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN rJgWVqA= -----END CERTIFICATE----- Buypass Class 3 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR 5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh 7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH 2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV /afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz 6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi Cp/HuZc= -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 3 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK 9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W 0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== -----END CERTIFICATE----- EE Certification Centre Root CA =============================== -----BEGIN CERTIFICATE----- MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw 93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU 3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM dcGWxZ0= -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 2009 ============================== -----BEGIN CERTIFICATE----- MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ 4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm 2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 EV 2009 ================================= -----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T 7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv w9y4AyHqnxbxLFS1 -----END CERTIFICATE----- CA Disig Root R2 ================ -----BEGIN CERTIFICATE----- MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa 5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV 7+ZtsH8tZ/3zbBt1RqPlShfppNcL -----END CERTIFICATE----- ACCVRAIZ1 ========= -----BEGIN CERTIFICATE----- MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ 0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR 5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J 9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd 3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p EfbRD0tVNEYqi4Y7 -----END CERTIFICATE----- TWCA Global Root CA =================== -----BEGIN CERTIFICATE----- MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M 8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg /eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= -----END CERTIFICATE----- TeliaSonera Root CA v1 ====================== -----BEGIN CERTIFICATE----- MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ 6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA 3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx 0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= -----END CERTIFICATE----- E-Tugra Certification Authority =============================== -----BEGIN CERTIFICATE----- MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB /wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G C7TbO6Orb1wdtn7os4I07QZcJA== -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 2 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR 3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN 9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== -----END CERTIFICATE----- Atos TrustedRoot 2011 ===================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr 54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G 3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed -----END CERTIFICATE----- QuoVadis Root CA 1 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV 7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX 9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP +V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh 3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV hMJKzRwuJIczYOXD -----END CERTIFICATE----- QuoVadis Root CA 2 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD 6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr O3jtZsSOeWmD3n+M -----END CERTIFICATE----- QuoVadis Root CA 3 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe 6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX 0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 PpxxVJkES/1Y+Zj0 -----END CERTIFICATE----- DigiCert Assured ID Root G2 =========================== -----BEGIN CERTIFICATE----- MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH 35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv 0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo IhNzbM8m9Yop5w== -----END CERTIFICATE----- DigiCert Assured ID Root G3 =========================== -----BEGIN CERTIFICATE----- MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy 1vUhZscv6pZjamVFkpUBtA== -----END CERTIFICATE----- DigiCert Global Root G2 ======================= -----BEGIN CERTIFICATE----- MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO 3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu 5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl MrY= -----END CERTIFICATE----- DigiCert Global Root G3 ======================= -----BEGIN CERTIFICATE----- MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y 3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 VOKa5Vt8sycX -----END CERTIFICATE----- DigiCert Trusted Root G4 ======================== -----BEGIN CERTIFICATE----- MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy 7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN 5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb /UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa 5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP 82Z+ -----END CERTIFICATE----- COMODO RSA Certification Authority ================================== -----BEGIN CERTIFICATE----- MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+ 5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX 2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3 sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5 WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+ nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52 7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I LaZRfyHBNVOFBkpdn627G190 -----END CERTIFICATE----- USERTrust RSA Certification Authority ===================================== -----BEGIN CERTIFICATE----- MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz 0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O +T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq /nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8 yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+ eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ 7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM 8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 -----END CERTIFICATE----- USERTrust ECC Certification Authority ===================================== -----BEGIN CERTIFICATE----- MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu 9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= -----END CERTIFICATE----- GlobalSign ECC Root CA - R4 =========================== -----BEGIN CERTIFICATE----- MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q= -----END CERTIFICATE----- GlobalSign ECC Root CA - R5 =========================== -----BEGIN CERTIFICATE----- MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 -----END CERTIFICATE----- Staat der Nederlanden Root CA - G3 ================================== -----BEGIN CERTIFICATE----- MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5 1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp 07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE 41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1 v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA 8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b 8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq 1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk= -----END CERTIFICATE----- Staat der Nederlanden EV Root CA ================================ -----BEGIN CERTIFICATE----- MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r 0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8 Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr 08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV 0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd 74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq 5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi 5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4 WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg== -----END CERTIFICATE----- IdenTrust Commercial Root CA 1 ============================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi 1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl 3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH 6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe 2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R cGzM7vRX+Bi6hG6H -----END CERTIFICATE----- IdenTrust Public Sector Root CA 1 ================================= -----BEGIN CERTIFICATE----- MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL 4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ 3Wl9af0AVqW3rLatt8o+Ae+c -----END CERTIFICATE----- Entrust Root Certification Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP /vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO e4pIb4tF9g== -----END CERTIFICATE----- Entrust Root Certification Authority - EC1 ========================================== -----BEGIN CERTIFICATE----- MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef 9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G -----END CERTIFICATE----- CFCA EV ROOT ============ -----BEGIN CERTIFICATE----- MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD 7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB /wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua 4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su -----END CERTIFICATE----- Certinomis - Root CA ==================== -----BEGIN CERTIFICATE----- MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjETMBEGA1UEChMK Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAbBgNVBAMTFENlcnRpbm9taXMg LSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMzMTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIx EzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRD ZXJ0aW5vbWlzIC0gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQos P5L2fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJflLieY6pOo d5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQVWZUKxkd8aRi5pwP5ynap z8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDFTKWrteoB4owuZH9kb/2jJZOLyKIOSY00 8B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09x RLWtwHkziOC/7aOgFLScCbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE 6OXWk6RiwsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJwx3t FvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SGm/lg0h9tkQPTYKbV PZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4F2iw4lNVYC2vPsKD2NkJK/DAZNuH i5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZngWVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGj YzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I 6tNxIqSSaHh02TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/0KGRHCwPT5iV WVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWwF6YSjNRieOpWauwK0kDDPAUw Pk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZSg081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAX lCOotQqSD7J6wWAsOMwaplv/8gzjqh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJ y29SWwNyhlCVCNSNh4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9 Iff/ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8Vbtaw5Bng DwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwjY/M50n92Uaf0yKHxDHYi I0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nM cyrDflOR1m749fPH0FFNjkulW+YZFzvWgQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVr hkIGuUE= -----END CERTIFICATE----- OISTE WISeKey Global Root GB CA =============================== -----BEGIN CERTIFICATE----- MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk 9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB /zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= -----END CERTIFICATE----- SZAFIR ROOT CA2 =============== -----BEGIN CERTIFICATE----- MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE 2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5 O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67 oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul 4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6 +/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw== -----END CERTIFICATE----- Certum Trusted Network CA 2 =========================== -----BEGIN CERTIFICATE----- MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1 bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9 7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130 GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ 9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 zAYspsbiDrW5viSP -----END CERTIFICATE----- Hellenic Academic and Research Institutions RootCA 2015 ======================================================= -----BEGIN CERTIFICATE----- MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0 aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+ 6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2 fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+ D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn 82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q p/UsQu0yrbYhnr68 -----END CERTIFICATE----- Hellenic Academic and Research Institutions ECC RootCA 2015 =========================================================== -----BEGIN CERTIFICATE----- MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0 aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290 Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR -----END CERTIFICATE----- ISRG Root X1 ============ -----BEGIN CERTIFICATE----- MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ 4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf 1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY 9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV 0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ m+kXQ99b21/+jh5Xos1AnX5iItreGCc= -----END CERTIFICATE----- AC RAIZ FNMT-RCM ================ -----BEGIN CERTIFICATE----- MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou 08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ 47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW +YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d 8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm 5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM= -----END CERTIFICATE----- Amazon Root CA 1 ================ -----BEGIN CERTIFICATE----- MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB /zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy 8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa 2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 -----END CERTIFICATE----- Amazon Root CA 2 ================ -----BEGIN CERTIFICATE----- MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ 3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY +gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= -----END CERTIFICATE----- Amazon Root CA 3 ================ -----BEGIN CERTIFICATE----- MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== -----END CERTIFICATE----- Amazon Root CA 4 ================ -----BEGIN CERTIFICATE----- MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN /sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri 83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== -----END CERTIFICATE----- LuxTrust Global Root 2 ====================== -----BEGIN CERTIFICATE----- MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQELBQAwRjELMAkG A1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNVBAMMFkx1eFRydXN0IEdsb2Jh bCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUwMzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEW MBQGA1UECgwNTHV4VHJ1c3QgUy5BLjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCC AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wm Kb3FibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTemhfY7RBi2 xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1EMShduxq3sVs35a0VkBC wGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsnXpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm 1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkm FRseTJIpgp7VkoGSQXAZ96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niF wpN6cj5mj5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4gDEa/ a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+8kPREd8vZS9kzl8U ubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2jX5t/Lax5Gw5CMZdjpPuKadUiDTSQ MC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmHhFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB /zBCBgNVHSAEOzA5MDcGByuBKwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5 Lmx1eHRydXN0Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT +Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQELBQADggIBAGoZ FO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9BzZAcg4atmpZ1gDlaCDdLnIN H2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTOjFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW 7MM3LGVYvlcAGvI1+ut7MV3CwRI9loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIu ZY+kt9J/Z93I055cqqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWA VWe+2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/JEAdemrR TxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKrezrnK+T+Tb/mjuuqlPpmt /f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQfLSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc 7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31I iyBMz2TWuJdGsE7RKlY6oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr -----END CERTIFICATE----- TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 ============================================= -----BEGIN CERTIFICATE----- MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11 IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8 6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0 3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9 WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= -----END CERTIFICATE----- GDCA TrustAUTH R5 ROOT ====================== -----BEGIN CERTIFICATE----- MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ 9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4 oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx 9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9 H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35 6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd +PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ 8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv /EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== -----END CERTIFICATE----- TrustCor RootCert CA-1 ====================== -----BEGIN CERTIFICATE----- MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYDVQQGEwJQQTEP MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkx MjMxMTcyMzE2WjCBpDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFu YW1hIENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUGA1UECwwe VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZUcnVzdENvciBSb290Q2Vy dCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv463leLCJhJrMxnHQFgKq1mq jQCj/IDHUHuO1CAmujIS2CNUSSUQIpidRtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4 pQa81QBeCQryJ3pS/C3Vseq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0 JEsq1pme9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CVEY4h gLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorWhnAbJN7+KIor0Gqw /Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/DeOxCbeKyKsZn3MzUOcwHwYDVR0j BBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AYYwDQYJKoZIhvcNAQELBQADggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5 mDo4Nvu7Zp5I/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZyonnMlo2HD6C qFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djtsL1Ac59v2Z3kf9YKVmgenFK+P 3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdNzl/HHk484IkzlQsPpTLWPFp5LBk= -----END CERTIFICATE----- TrustCor RootCert CA-2 ====================== -----BEGIN CERTIFICATE----- MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNVBAYTAlBBMQ8w DQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQwIgYDVQQKDBtUcnVzdENvciBT eXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0 eTEfMB0GA1UEAwwWVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEy MzExNzI2MzlaMIGkMQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5h bWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0 IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnIG7CKqJiJJWQdsg4foDSq8Gb ZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9Nk RvRUqdw6VC0xK5mC8tkq1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1 oYxOdqHp2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nKDOOb XUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hapeaz6LMvYHL1cEksr1 /p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF3wP+TfSvPd9cW436cOGlfifHhi5q jxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQP eSghYA2FFn3XVDjxklb9tTNMg9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+Ctg rKAmrhQhJ8Z3mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh 8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAdBgNVHQ4EFgQU 2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6UnrybPZx9mCAZ5YwwYrIwDwYD VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/h Osh80QA9z+LqBrWyOrsGS2h60COXdKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnp kpfbsEZC89NiqpX+MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv 2wnL/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RXCI/hOWB3 S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYaZH9bDTMJBzN7Bj8RpFxw PIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dv DDqPys/cA8GiCcjl/YBeyGBCARsaU1q7N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYU RpFHmygk71dSTlxCnKr3Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANE xdqtvArBAs8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp5KeX RKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu1uwJ -----END CERTIFICATE----- TrustCor ECA-1 ============== -----BEGIN CERTIFICATE----- MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYDVQQGEwJQQTEP MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkxFzAVBgNVBAMMDlRydXN0Q29yIEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3Mjgw N1owgZwxCzAJBgNVBAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5 MSQwIgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29y IENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3IgRUNBLTEwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb3w9U73NjKYKtR8aja+3+XzP4Q1HpGjOR MRegdMTUpwHmspI+ap3tDvl0mEDTPwOABoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23 xFUfJ3zSCNV2HykVh0A53ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmc p0yJF4OuowReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/wZ0+ fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZFZtS6mFjBAgMBAAGj YzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAfBgNVHSMEGDAWgBREnkj1zG1I1KBL f/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF AAOCAQEABT41XBVwm8nHc2FvcivUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u /ukZMjgDfxT2AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50soIipX1TH0Xs J5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BIWJZpTdwHjFGTot+fDz2LYLSC jaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1WitJ/X5g== -----END CERTIFICATE----- SSL.com Root Certification Authority RSA ======================================== -----BEGIN CERTIFICATE----- MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxDjAM BgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24x MTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYw MjEyMTczOTM5WhcNNDEwMjEyMTczOTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NM LmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2RxFdHaxh3a3by/ZPkPQ/C Fp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aXqhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8 P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcCC52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/ge oeOy3ZExqysdBP+lSgQ36YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkp k8zruFvh/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrFYD3Z fBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93EJNyAKoFBbZQ+yODJ gUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVcUS4cK38acijnALXRdMbX5J+tB5O2 UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi8 1xtZPCvM8hnIk2snYxnP/Okm+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4s bE6x/c+cCbqiM+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4GA1UdDwEB/wQE AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGVcpNxJK1ok1iOMq8bs3AD/CUr dIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBcHadm47GUBwwyOabqG7B52B2ccETjit3E+ZUf ijhDPwGFpUenPUayvOUiaPd7nNgsPgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAsl u1OJD7OAUN5F7kR/q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjq erQ0cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jra6x+3uxj MxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90IH37hVZkLId6Tngr75qNJ vTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/YK9f1JmzJBjSWFupwWRoyeXkLtoh/D1JI Pb9s2KJELtFOt3JY04kTlf5Eq/jXixtunLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406y wKBjYZC6VWg3dGq2ktufoYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NI WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k= -----END CERTIFICATE----- SSL.com Root Certification Authority ECC ======================================== -----BEGIN CERTIFICATE----- MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+ 8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z 5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl -----END CERTIFICATE----- SSL.com EV Root Certification Authority RSA R2 ============================================== -----BEGIN CERTIFICATE----- MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+ B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim 9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48 +qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1 ++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7 CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1 hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX 9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== -----END CERTIFICATE----- SSL.com EV Root Certification Authority ECC =========================================== -----BEGIN CERTIFICATE----- MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy 3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe 5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== -----END CERTIFICATE----- GlobalSign Root CA - R6 ======================= -----BEGIN CERTIFICATE----- MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE 3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+ azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP 0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0 lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr 3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1 0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= -----END CERTIFICATE----- OISTE WISeKey Global Root GC CA =============================== -----BEGIN CERTIFICATE----- MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 -----END CERTIFICATE----- gsoap-2.8.91/gsoap/samples/ssl/sslserver.c0000644000175000017500000002170613525245163020052 0ustar ellertellert/* sslserver.c Example stand-alone SSL-secure gSOAP Web service. Build steps: soapcpp2 -c ssl.h cc -o sslserver sslserver.c soapC.c soapServer.c stdsoap2.c thread_setup.c SSL-enabled services use the gSOAP SSL interface. See sslclient.c and sslserver.c for example code with instructions and the gSOAP documentation more details. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "ssl.nsmap" #include "threads.h" /* gsoap/plugin/threads.h */ #include /* defines SIGPIPE */ void sigpipe_handle(int x) { } void *process_request(struct soap*); int CRYPTO_thread_setup(); void CRYPTO_thread_cleanup(); /******************************************************************************\ * * Main * \******************************************************************************/ int main() { SOAP_SOCKET m; THREAD_TYPE tid; struct soap soap, *tsoap; /* Uncomment to call this first before all else if SSL is initialized elsewhere, e.g. in application code */ /* soap_ssl_noinit(); */ /* Init SSL before any threads are started (do this just once) */ soap_ssl_init(); /* Need SIGPIPE handler on Unix/Linux systems to catch broken pipes: */ signal(SIGPIPE, sigpipe_handle); /* set up lSSL ocks */ if (CRYPTO_thread_setup()) { fprintf(stderr, "Cannot setup thread mutex for OpenSSL\n"); exit(EXIT_FAILURE); } /* init gsoap context and SSL */ soap_init(&soap); /* The supplied server certificate "server.pem" assumes that the server is running on 'localhost', so clients can only connect from the same host when verifying the server's certificate. To verify the certificates of third-party services, they must provide a certificate issued by Verisign or another trusted CA. At the client-side, the capath parameter should point to a directory that contains these trusted (root) certificates or the cafile parameter should refer to one file will all certificates. To help you out, the supplied "cacerts.pem" file contains the certificates issued by various CAs. You should use this file for the cafile parameter instead of "cacert.pem" to connect to trusted servers. Note that the client may fail to connect if the server's credentials have problems (e.g. expired). Note 1: the password and capath are not used with GNUTLS Note 2: setting capath may not work on Windows. */ if (soap_ssl_server_context(&soap, SOAP_SSL_DEFAULT, /* use SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION to verify clients: client must provide a key file e.g. "client.pem" and "password" */ "server.pem", /* keyfile (cert+key): see README.txt to create this file */ "password", /* password to read the private key in the key file */ "cacert.pem", /* cacert file to store trusted certificates (to authenticate clients), see README.txt */ NULL, /* capath */ NULL, /* DH file name (e.g. "dh2048.pem") or DH param key len bits in string (e.g. "2048"), if NULL then RSA with 2048 bits is used instead (bits defined by SOAP_SSL_RSA_BITS) */ NULL, /* if randfile!=NULL: use a file with random data to seed randomness */ "sslserver" /* server identification for SSL session cache (unique server name, e.g. use argv[0]) */ ) ) { soap_print_fault(&soap, stderr); exit(EXIT_FAILURE); } /* enable CRL, may need SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE when certs have no CRL if (soap_ssl_crl(&soap, "")) { soap_print_fault(&soap, stderr); exit(EXIT_FAILURE); } */ soap.accept_timeout = 60; /* server times out after 1 minute inactivity */ soap.send_timeout = soap.recv_timeout = 5; /* max I/O idle time is 5 seconds */ m = soap_bind(&soap, NULL, 18081, 100); if (!soap_valid_socket(m)) { soap_print_fault(&soap, stderr); exit(EXIT_FAILURE); } fprintf(stderr, "Bind successful: socket = %d\n", m); for (;;) { SOAP_SOCKET s = soap_accept(&soap); if (!soap_valid_socket(s)) { if (soap.errnum) soap_print_fault(&soap, stderr); else fprintf(stderr, "Server timed out (timeout set to %d seconds)\n", soap.accept_timeout); break; } fprintf(stderr, "Socket %d connection from IP %d.%d.%d.%d\n", s, (int)(soap.ip>>24)&0xFF, (int)(soap.ip>>16)&0xFF, (int)(soap.ip>>8)&0xFF, (int)soap.ip&0xFF); tsoap = soap_copy(&soap); if (!tsoap) { soap_closesock(&soap); continue; } while (THREAD_CREATE(&tid, (void*(*)(void*))&process_request, tsoap)) sleep(1); } soap_destroy(&soap); soap_end(&soap); soap_done(&soap); /* MUST call before CRYPTO_thread_cleanup */ CRYPTO_thread_cleanup(); return 0; } void *process_request(struct soap *soap) { THREAD_DETACH(THREAD_ID); if (soap_ssl_accept(soap) != SOAP_OK) { /* when soap_ssl_accept() fails, socket is closed and SSL data reset */ soap_print_fault(soap, stderr); fprintf(stderr, "SSL request failed, continue with next...\n"); } else { soap_serve(soap); fprintf(stderr, "SSL request served, continue with next...\n"); } soap_destroy(soap); soap_end(soap); soap_free(soap); return NULL; } /******************************************************************************\ * * Service methods * \******************************************************************************/ int ns__add(struct soap *soap, double a, double b, double *result) { (void)soap; *result = a + b; return SOAP_OK; } /******************************************************************************\ * * OpenSSL * \******************************************************************************/ #if defined(WITH_OPENSSL) struct CRYPTO_dynlock_value { MUTEX_TYPE mutex; }; static MUTEX_TYPE *mutex_buf = NULL; static struct CRYPTO_dynlock_value *dyn_create_function(const char *file, int line) { struct CRYPTO_dynlock_value *value; (void)file; (void)line; value = (struct CRYPTO_dynlock_value*)OPENSSL_malloc(sizeof(struct CRYPTO_dynlock_value)); if (value) MUTEX_SETUP(value->mutex); return value; } static void dyn_lock_function(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line) { (void)file; (void)line; if (mode & CRYPTO_LOCK) MUTEX_LOCK(l->mutex); else MUTEX_UNLOCK(l->mutex); } static void dyn_destroy_function(struct CRYPTO_dynlock_value *l, const char *file, int line) { (void)file; (void)line; MUTEX_CLEANUP(l->mutex); OPENSSL_free(l); } static void locking_function(int mode, int n, const char *file, int line) { (void)file; (void)line; if (mode & CRYPTO_LOCK) MUTEX_LOCK(mutex_buf[n]); else MUTEX_UNLOCK(mutex_buf[n]); } static unsigned long id_function() { return (unsigned long)THREAD_ID; } int CRYPTO_thread_setup() { int i; mutex_buf = (MUTEX_TYPE*)OPENSSL_malloc(CRYPTO_num_locks() * sizeof(MUTEX_TYPE)); if (!mutex_buf) return SOAP_EOM; for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_SETUP(mutex_buf[i]); CRYPTO_set_id_callback(id_function); CRYPTO_set_locking_callback(locking_function); CRYPTO_set_dynlock_create_callback(dyn_create_function); CRYPTO_set_dynlock_lock_callback(dyn_lock_function); CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function); return SOAP_OK; } void CRYPTO_thread_cleanup() { int i; if (!mutex_buf) return; CRYPTO_set_id_callback(NULL); CRYPTO_set_locking_callback(NULL); CRYPTO_set_dynlock_create_callback(NULL); CRYPTO_set_dynlock_lock_callback(NULL); CRYPTO_set_dynlock_destroy_callback(NULL); for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_CLEANUP(mutex_buf[i]); OPENSSL_free(mutex_buf); mutex_buf = NULL; } #else /* OpenSSL not used or OpenSSL prior to 1.1.0 */ int CRYPTO_thread_setup() { return SOAP_OK; } void CRYPTO_thread_cleanup() { } #endif gsoap-2.8.91/gsoap/samples/ssl/openssl.cnf0000644000175000017500000002257413525245163020035 0ustar ellertellert# # OpenSSL example configuration file. # This is mostly being used for generation of certificate requests. # # This definition stops the following lines choking if HOME isn't # defined. HOME = . RANDFILE = $ENV::HOME/.rnd # Extra OBJECT IDENTIFIER info: #oid_file = $ENV::HOME/.oid oid_section = new_oids # To use this configuration file with the "-extfile" option of the # "openssl x509" utility, name here the section containing the # X.509v3 extensions to use: # extensions = # (Alternatively, use a configuration file that has only # X.509v3 extensions in its main [= default] section.) [ new_oids ] # We can add new OIDs in here for use by 'ca' and 'req'. # Add a simple OID like this: # testoid1=1.2.3.4 # Or use config file substitution like this: # testoid2=${testoid1}.5.6 #################################################################### [ ca ] default_ca = CA_default # The default ca section #################################################################### [ CA_default ] dir = ./demoCA # Where everything is kept certs = $dir/certs # Where the issued certs are kept crl_dir = $dir/crl # Where the issued crl are kept database = $dir/index.txt # database index file. #unique_subject = no # Set to 'no' to allow creation of # several ctificates with same subject. new_certs_dir = $dir/newcerts # default place for new certs. certificate = $dir/cacert.pem # The CA certificate serial = $dir/serial # The current serial number #crlnumber = $dir/crlnumber # the current crl number must be # commented out to leave a V1 CRL crl = $dir/crl.pem # The current CRL private_key = $dir/private/cakey.pem# The private key RANDFILE = $dir/private/.rand # private random number file x509_extensions = usr_cert # The extentions to add to the cert # Comment out the following two lines for the "traditional" # (and highly broken) format. name_opt = ca_default # Subject Name options cert_opt = ca_default # Certificate field options # Extension copying option: use with caution. # copy_extensions = copy # Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs # so this is commented out by default to leave a V1 CRL. # crlnumber must also be commented out to leave a V1 CRL. # crl_extensions = crl_ext default_days = 365 # how long to certify for default_crl_days= 30 # how long before next CRL default_md = sha256 # which md to use. preserve = no # keep passed DN ordering # A few difference way of specifying how similar the request should look # For type CA, the listed attributes must be the same, and the optional # and supplied fields are just that :-) policy = policy_match # For the CA policy [ policy_match ] countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional # For the 'anything' policy # At this point in time, you must list all acceptable 'object' # types. [ policy_anything ] countryName = optional stateOrProvinceName = optional localityName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional #################################################################### [ req ] default_bits = 1024 default_keyfile = privkey.pem distinguished_name = req_distinguished_name attributes = req_attributes x509_extensions = v3_ca # The extentions to add to the self signed cert # Passwords for private keys if not present they will be prompted for # input_password = secret # output_password = secret # This sets a mask for permitted string types. There are several options. # default: PrintableString, T61String, BMPString. # pkix : PrintableString, BMPString. # utf8only: only UTF8Strings. # nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). # MASK:XXXX a literal mask value. # WARNING: current versions of Netscape crash on BMPStrings or UTF8Strings # so use this option with caution! string_mask = nombstr # req_extensions = v3_req # The extensions to add to a certificate request [ req_distinguished_name ] countryName = Country Name (2 letter code) countryName_default = AU countryName_min = 2 countryName_max = 2 stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = Some-State localityName = Locality Name (eg, city) 0.organizationName = Organization Name (eg, company) 0.organizationName_default = Internet Widgits Pty Ltd # we can do this but it is not needed normally :-) #1.organizationName = Second Organization Name (eg, company) #1.organizationName_default = World Wide Web Pty Ltd organizationalUnitName = Organizational Unit Name (eg, section) #organizationalUnitName_default = commonName = Common Name (eg, YOUR name) commonName_default = localhost commonName_max = 64 emailAddress = Email Address emailAddress_max = 64 # SET-ex3 = SET extension number 3 [ req_attributes ] challengePassword = A challenge password challengePassword_min = 4 challengePassword_max = 20 unstructuredName = An optional company name [ usr_cert ] # These extensions are added when 'ca' signs a request. # This goes against PKIX guidelines but some CAs do it and some software # requires this to avoid interpreting an end user certificate as a CA. basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth, clientAuth # Here are some examples of the usage of nsCertType. If it is omitted # the certificate can be used for anything *except* object signing. # This is OK for an SSL server. # nsCertType = server # For an object signing certificate this would be used. # nsCertType = objsign # For normal client use this is typical # nsCertType = client, email # and for everything including object signing: # nsCertType = client, email, objsign # This is typical in keyUsage for a client certificate. # keyUsage = nonRepudiation, digitalSignature, keyEncipherment # This will be displayed in Netscape's comment listbox. nsComment = "OpenSSL Generated Certificate" # PKIX recommendations harmless if included in all certificates. subjectKeyIdentifier=hash authorityKeyIdentifier=keyid,issuer:always # This stuff is for subjectAltName and issuerAltname. # Import the email address. # subjectAltName=email:copy # An alternative to produce certificates that aren't # deprecated according to PKIX. # subjectAltName=email:move # Copy subject details # issuerAltName=issuer:copy #nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem #nsBaseUrl #nsRevocationUrl #nsRenewalUrl #nsCaPolicyUrl #nsSslServerName [ v3_req ] # Extensions to add to a certificate request basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth,clientAuth [ v3_ca ] # Extensions for a typical CA # PKIX recommendation. subjectKeyIdentifier=hash authorityKeyIdentifier=keyid:always,issuer:always # This is what PKIX recommends but some broken software chokes on critical # extensions. #basicConstraints = critical,CA:true # So we do this instead. basicConstraints = CA:true # Key usage: this is typical for a CA certificate. However since it will # prevent it being used as an test self-signed certificate it is best # left out by default. # keyUsage = cRLSign, keyCertSign # Some might want this also # nsCertType = sslCA, emailCA # Include email address in subject alt name: another PKIX recommendation # subjectAltName=email:copy # Copy issuer details # issuerAltName=issuer:copy # DER hex encoding of an extension: beware experts only! # obj=DER:02:03 # Where 'obj' is a standard or added object # You can even override a supported extension: # basicConstraints= critical, DER:30:03:01:01:FF [ crl_ext ] # CRL extensions. # Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. # issuerAltName=issuer:copy authorityKeyIdentifier=keyid:always,issuer:always [ proxy_cert_ext ] # These extensions should be added when creating a proxy certificate # This goes against PKIX guidelines but some CAs do it and some software # requires this to avoid interpreting an end user certificate as a CA. basicConstraints=CA:FALSE # Here are some examples of the usage of nsCertType. If it is omitted # the certificate can be used for anything *except* object signing. # This is OK for an SSL server. # nsCertType = server # For an object signing certificate this would be used. # nsCertType = objsign # For normal client use this is typical # nsCertType = client, email # and for everything including object signing: # nsCertType = client, email, objsign # This is typical in keyUsage for a client certificate. # keyUsage = nonRepudiation, digitalSignature, keyEncipherment # This will be displayed in Netscape's comment listbox. nsComment = "OpenSSL Generated Certificate" # PKIX recommendations harmless if included in all certificates. subjectKeyIdentifier=hash authorityKeyIdentifier=keyid,issuer:always # This stuff is for subjectAltName and issuerAltname. # Import the email address. # subjectAltName=email:copy # An alternative to produce certificates that aren't # deprecated according to PKIX. # subjectAltName=email:move # Copy subject details # issuerAltName=issuer:copy #nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem #nsBaseUrl #nsRevocationUrl #nsRenewalUrl #nsCaPolicyUrl #nsSslServerName # This really needs to be in place for it to be a proxy certificate. proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo gsoap-2.8.91/gsoap/samples/ssl/README.txt0000644000175000017500000002665013525245163017357 0ustar ellertellert SSL/TLS Client and Server Examples and Key Generation with gSOAP ================================================================ Using OpenSSL ------------- The SSL-enabled applications are compiled with -DWITH_OPENSSL -DWITH_GZIP and linked with -lgsoapssl++ (or -lgsoapssl) -lssl -lcrypto -lz OpenSSL multithreaded applications require mutex locks, see the CRYPTO_thread_setup() and CRYPTO_thread_cleanup() usage in the examples and thread_setup.h and thread_setup.c/.cpp for these functions. The certificates of trusted certificate authorities (CA) are stored in cacerts.pem and can be used to connect gSOAP clients to secure services. To do so, use cacerts.pem instead of the demo cacert.pem with soap_ssl_client_context. As a better alternative to calling soap_ssl_client_context(), trusted certificate stores are automatically added with ssl_client_setup(), which works for Unix/Linux and Windows platforms. See ssl_setup.h and ssl_setup.c/.cpp for an explanation. Using GNUTLS ------------ The SSL-enabled applications are compiled with -DWITH_GNUTLS -DWITH_GZIP and linked with stdsoap2.c[pp] -lgnutls -lgcrypt -lz Note that stdsoap2.c[pp] MUST be compiled with -DWITH_GNUTLS to use GNUTLS, because libgsoapssl is built with OpenSSL by default. Note: GNUTLS does not support encrypted PEM keyfiles, so you cannot use the key files generated with OpenSSL and use them in a GNUTLS-enabled application. GNUTLS mutex locks are automatically enabled by the gSOAP engine stdsoap2.c[pp] when pthreads are detected. How to create self-signed certificates with OpenSSL --------------------------------------------------- To generate a self-signed root certificate to sign client and server certificates, first create a new private directory, say CA for "Certificate Authority" in your home directory to store private keys and certificates. Next, copy openssl.cnf, root.sh, and cert.sh to this directory. Edit openssl.cnf and go to the [req_distinguished_name] section to add or change the following items: [ req_distinguished_name ] countryName_default = US stateOrProvinceName_default = Your-State localityName_default = Your-City 0.organizationName_default = Your-Company-Name emailAddress_default = your-email@address If you are going to use these settings often, we suggest to add the following line to your .cshrc or .tcshrc when you're using csh or tcsh: setenv OPENSSL_CONF $HOME/CA/openssl.cnf or add the folling line to .bashrc when you're using bash: export OPENSSL_CONF=$HOME/CA/openssl.cnf To generate the root CA, execute: ./root.sh When prompted, choose a PEM pass phrase to protect the CA's private key that you are about to generate. After entering your info, enter the pass phrase again to self-sign the root CA. You will also need the CA's PEM pass phrase later when you sign certificates with the cert.sh script. Now you have a new root.pem with the CA's private key. Save the generated root.pem keyfile and the CA's PEM pass phrase in a safe place. Do not distribute the root.pem! The generated cacert.pem certificate of the CA can be distributed and used by peers (web browsers and other client applications) to authenticate all server certificates that are signed with it. The root.pem and cacert.pem are valid for three years (1095 days as set in openssl.cnf). Next, generate the server.pem keyfile and sign it with the root CA by executing: ./cert.sh server When prompted, choose a PEM pass phrase to protect the server's private key that you are about to generate. The server's PEM pass phrase is used to lock the private key of the server that is stored in the server.pem keyfile and will therefore be needed by your server application to unlock the private key from this file. Enter your info and for the common name enter the server's host name or simply localhost when testing your servers on your local machine. Enter the root CA pass phrase when prompted to sign the server certificate. Repeat this procedure for the client if the client must authenticate to a server: ./cert.sh client We strongly recommend to use a fresh PEM pass phrase to protect the client private key. The server.pem and client.pem keys are valid for one year. Do not distribute them, because they hold the private key. The private key files are used locally by the TLS/SSL application. Only distribute the CA certificate cacert.pem which is needed by peers to authenticate servers. Server applications should use server.pem with soap_ssl_server_context(): if (soap_ssl_server_context(soap, SOAP_SSL_DEFAULT, "server.pem", /* server keyfile (cert+key) */ "XXXXXXXXXX", /* password to read the private key stored in keyfile */ NULL, /* no certificate to authenticate clients */ NULL, /* no capath to trusted certificates */ NULL, /* DH/RSA: use 2048 bit RSA (default with NULL) */ NULL, /* no random data to seed randomness */ NULL /* no SSL session cache */ )) { soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } Client applications should use cacert.pem to authenticate the server: if (soap_ssl_client_context(soap, SOAP_SSL_DEFAULT, NULL, /* no keyfile */ NULL, /* no keyfile password */ "cacert.pem", /* self-signed certificate cacert.pem */ NULL, /* no capath to trusted certificates */ NULL /* no random data to seed randomness */ )) { soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } To disable server authentication use SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION and use NULL for the certificate file. Client applications may also use client.pem as the key file with soap_ssl_client_context(), but this is only needed if the client must authenticate to the server. This assumes that the client and server are tightly coupled and must mutually trust each other. The server.pem and client.pem files actually hold both the private key and certificate. To print the contents of a PEM file: openssl x509 -text -in file.pem To generate parameters for DH (Diffie Hellman) key exchange with OpenSSL, use: openssl dhparam -out dh2048.pem -2 2048 To summarize, the files you need are: openssl.cnf root.sh cert.sh Files generated: cacert.pem CA certificate for distribution and authentication root.pem CA private key and certificate to sign client/server key files (do not distribute!) rootkey.pem CA private key (do not distribute!) rootreq.pem CA self-sign request root.srl serial number server.pem server private key and certificate (do not distribute!) servercert.pem server certificate, signed by root CA, for distribution serverkey.pem server private key (do not distribute!) serverreq.pem sign request client.pem client private key and certificate (do not distribute!) clientcert.pem client certificate signed by root CA (public) clientkey.pem client private key (do not distribute!) clientreq.pem sign request Files bundled with the gSOAP software: cacerts.pem trusted certificates of common CAs cacerts.h header file for cacerts.c: declares soap_ssl_client_cacerts() cacerts.c trusted certificates of common CAs hardcoded, no cacerts.pem required How to convert certificates to CER format for MS Windows -------------------------------------------------------- To convert certificate cacert.pem to CER format: openssl x509 -in cacert.pem -outform der -out cacert.cer Install the certificate on MS Windows by opening it and then select "Install Certificate". Client applications running on MS Windows can now connect to the server. The server authenticates to the client by means of the certificate. How to create self-signed certificates with GNUTLS -------------------------------------------------- We use the GNUTLS 'certtool' command (or the 'gnutls-certtool' command) to create keys and certificates as follows. First we generate a private key (for a client or server): certtool --generate-privkey --outfile privkey.pem Make sure to use GNUTLS 'certtool', sometimes renamed to 'gnutls-certtool' to avoid confusion with the system 'certtool' command. Then we self-sign the certificate: certtool --generate-self-signed --load-privkey privkey.pem --outfile cert.pem When prompted, the following options are recommended for the certificate: * The certificate MUST NOT be marked as a CA certificate. * The DNS name MUST match the FQDN that clients will use to access the server. Use the server domain name here. One name suffices. * The certificate MUST be marked as usable for encryption. * The certificate MUST be marked as usable for a TLS server (or client when appropriate). The client.pem and server.pem keyfiles used in the soap_ssl_client_context() and soap_ssl_server_context() API functions is a combination of the private key and the certificate: cat privkey.pem cert.pem > server.pem The client can use the cert.pem to authenticate the server. The private key file and server.pem are for the server only and SHOULD NEVER be shared. Note that the server.pem file generated above is NOT encrypted with a password, so the password parameter of soap_ssl_server_context() is not used. Neither is the capath parameter used for the fact that GNUTLS does not search for loadable certificates. The PEM files produced by GNUTLS can be used with OpenSSL. The PEM key files created with OpenSSL (such as server.pem and client.pem) CANNOT be used with GNUTLS, because they contain encrypted private keys that GNUTLS cannot read ("SSL/TLS error: Can't read key file"). We can also use GNUTLS 'certtool' to create a Certificate Authority (CA) to sign client and server certificates as follows. certtool --generate-privkey --outfile cakey.pem Then we self-sign the CA certificate: certtool --generate-self-signed --load-privkey cakey.pem --outfile cacert.pem When prompted, the following options are recommended for the CA certificate: * The CA certificate SHOULD be marked to belong to an authority. * The CA certificate MUST be marked as a CA certificate. * The CA certificate MUST be usable for signing other certificates. * The CA certificate MUST be usable for signing Certificate Revocation Lists (CRLs). Now we can create a server key and use the CA to sign the server's certificate: certtool --generate-privkey --outfile serverkey.pem certtool --generate-request --load-privkey serverkey.pem --outfile server.csr certtool --generate-certificate --load-request server.csr --load-ca-certificate cacert.pem --load-ca-privkey cakey.pem --outfile servercert.pem Use the recommended options shown earlier for creating the certificate. The client.pem and server.pem keyfiles used in the soap_ssl_client_context() and soap_ssl_server_context() API functions is a combination of the private key and the certificate: cat serverkey.pem servercert.pem > server.pem The procedure above can be repeated to create a key and signed certificate for clients and other servers. All clients and servers can be authenticated with the CA certificate. The cacert.pem is to be used by all peers that require the other party to authenticate (e.g. the client uses cacert.pem CA cert to authenticate the server, who uses the server.pem keyfile). To generate parameters for DH (Diffie Hellman) key exchange with GNUTLS, use: certtool --generate-dh-params --bits 2048 --outfile dh2048.pem gsoap-2.8.91/gsoap/samples/ssl/ssl_setup.cpp0000644000175000017500000002204013525245163020373 0ustar ellertellert/* ssl_setup.c / ssl_setup.cpp See instructions below. gSOAP XML Web services tools Copyright (C) 2000-2019, 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-2010, 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 -------------------------------------------------------------------------------- */ /* Easy TLS/SSL setup with soap_ssl_client_setup() to replace soap_ssl_client_context(): - automatically uses certificates stored in Unix/Linux common locations - automatically uses Windows system certificate store - when -DWITH_WININET is defined, uses the gSOAP WinInet plugin with WinInet system certificate store - when -DWITH_CURL is defined, uses the gSOAP CURL plugin with CURL certificate store Requires: - compilation with -DWITH_OPENSSL or -DWITH_GNUTLS - compilation with -DWITH_WININET when the gSOAP WinInet plugin is used - compilation with -DWITH_CURL when the gSOAP CURL plugin is used Example usage: #include "thread_setup.h" // CRYPTO_thread_setup, CRYPTO_thread_cleanup #include "ssl_setup.h" // soap_ssl_client_setup, soap_ssl_client_cleanup int main() { // OpenSSL versions prior to 1.1.0 require mutex locks if (CRYPTO_thread_setup()) exit(EXIT_FAILURE); struct soap *soap = soap_new(); if (soap_ssl_client_setup( soap, SOAP_SSL_DEFAULT, // authenticate servers NULL, // a keyfile is required only when client must authenticate to server, NULL otherwise NULL, // password to read the key file (not used with GNUTLS), NULL otherwise NULL, // optional file name of certificates PEM file, NULL to search certificate stores NULL // optional path to certificates PEM files, NULL to search certificate stores )) { soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } ... // rest of the code to run the client making https and http calls ... // use soap_copy(soap) to create copies of the context with this setup ... // which is efficient and cheap to execute, or use soap_new() and ... // soap_ssl_client_setup() again to setup contexts but this is more ... // expensive since it searches for certificate files again CRYPTO_thread_cleanup(); } */ #include "stdsoap2.h" #if defined(WIN32) || defined(_WIN32) || defined(_WIN64) #if (defined(WITH_OPENSSL) || defined(WITH_GNUTLS)) && !defined(WITH_WININET) && !defined(GSOAP_WIN_WININET) && !defined(WITH_CURL) #include #endif #ifndef SOAP_CLIENT_OS_WINDOWS #define SOAP_CLIENT_OS_WINDOWS #endif #endif #if (defined(WITH_OPENSSL) || defined(WITH_GNUTLS)) && !defined(SOAP_CLIENT_OS_WINDOWS) && !defined(WITH_WININET) && !defined(GSOAP_WIN_WININET) && !defined(WITH_CURL) #include /* from curl configure or https://serverfault.com/questions/62496/ssl-certificate-location-on-unix-linux */ static const char *list_candidate_cacert[] = { "/etc/ssl/certs/ca-certificates.crt", "/etc/pki/tls/certs/ca-bundle.crt", "/etc/ssl/cert.pem", "/etc/pki/tls/cacert.pem", "/etc/ssl/ca-bundle.pem", "/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem", "/usr/share/ssl/certs/ca-bundle.crt", "/usr/local/share/certs/ca-root-nss.crt", NULL }; static const char *search_cacert_default_file() { int i = 0; for (;;) { const char *fname = list_candidate_cacert[i++]; if (!fname) break; if (access(fname, F_OK) != -1) return fname; } return NULL; } static const char *list_candidate_capath[] = { "/etc/ssl/certs", NULL }; static const char *search_cacert_default_path() { int i = 0; for (;;) { struct stat statbuf; const char *fdir = list_candidate_capath[i++]; if (!fdir) break; if (stat(fdir, &statbuf) != -1 && S_ISDIR(statbuf.st_mode)) return fdir; } return NULL; } #else static const char *search_cacert_default_file() { return NULL; } static const char *search_cacert_default_path() { return NULL; } #endif #if (defined(WITH_OPENSSL) || defined(WITH_GNUTLS)) && defined(SOAP_CLIENT_OS_WINDOWS) && !defined(WITH_WININET) && !defined(GSOAP_WIN_WININET) && !defined(WITH_CURL) #include #include #pragma comment(lib, "crypt32.lib") /* from https://stackoverflow.com/questions/9507184/can-openssl-on-windows-use-the-system-certificate-store/15451831 */ /* from https://github.com/d3x0r/SACK/blob/master/src/netlib/ssl_layer.c#L1037 */ static bool Add_InStore_from_Windows_Store(X509_STORE *store, LPCWSTR szSubsystemProtocol) { HCERTSTORE hStore; PCCERT_CONTEXT pContext = NULL; X509 *x509; hStore = CertOpenSystemStoreW((HCRYPTPROV_LEGACY)NULL, szSubsystemProtocol); if (!hStore) { /* lprintf("FATAL, CANNOT OPEN ROOT STORE"); */ return false; } while ((pContext = CertEnumCertificatesInStore(hStore, pContext))) { /* uncomment this block if you want to see the certificates as pop ups: #include "cryptuiapi.h" #pragma comment (lib, "cryptui.lib") CryptUIDlgViewContext(CERT_STORE_CERTIFICATE_CONTEXT, pContext, NULL, NULL, 0, NULL); */ const unsigned char *encoded_cert = (const unsigned char*)pContext->pbCertEncoded; x509 = d2i_X509(NULL, &encoded_cert, pContext->cbCertEncoded); if (x509) { X509_STORE_add_cert(store, x509); X509_free(x509); } } CertFreeCertificateContext(pContext); CertCloseStore(hStore, 0); return true; } #endif int soap_ssl_client_setup( struct soap *soap, /* the context */ unsigned short flags, /* SOAP_SSL_DEFAULT, SOAP_SSL_NO_AUTHENTICATION etc */ const char *keyfile, /* required only when client must authenticate to server, NULL otherwise */ const char *password, /* password to read the key file (not used with GNUTLS), NULL otherwise */ const char *cacert, /* optionally assign file name of certificates PEM file, NULL to search certificate stores */ const char *capath) /* optionally assign path to certificates PEM files, NULL to search certificate stores */ { #if (defined(WITH_OPENSSL) || defined(WITH_GNUTLS)) && !defined(WITH_WININET) && !defined(GSOAP_WIN_WININET) && !defined(WITH_CURL) if ((flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION) && !cacert && !capath) { cacert = search_cacert_default_file(); if (!cacert) capath = search_cacert_default_path(); } if (soap_ssl_client_context(soap, flags, keyfile, /* required only when client must authenticate to server */ password, /* password to read the key file (not used with GNUTLS) */ cacert, /* cacert file to store trusted certificates */ capath, /* capath to directory with trusted certificates */ NULL /* if randfile!=NULL: use a file with random data to seed randomness */ )) { return soap->error; } #if defined(SOAP_CLIENT_OS_WINDOWS) if ((flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION) && !cacert && !capath) { X509_STORE *store = SSL_CTX_get_cert_store(soap->ctx); /* only ROOT appears to be useful */ Add_InStore_from_Windows_Store(store, L"ROOT"); /* Add_InStore_from_Windows_Store(store, L"CA"); */ /* Add_InStore_from_Windows_Store(store, L"MY"); */ } #endif #endif return SOAP_OK; } gsoap-2.8.91/gsoap/samples/ssl/thread_setup.h0000644000175000017500000000113113525245163020504 0ustar ellertellert/* All OpenSSL versions prior to 1.1.0 require mutex locks to be explicitly set up to work safely with multi-threaded applications At the start of your program call: soap_ssl_init(); CRYPTO_thread_setup(); At the end of your program call: CRYPTO_thread_cleanup(); Compile together with gsoap/plugin/threads.c The CRYPTO_thread_setup() and CRYPTO_thread_cleanup() are effective for OpenSSL versions prior to 1.1.0 but otherwise have no effect. */ #ifndef THREAD_SETUP_H #define THREAD_SETUP_H int CRYPTO_thread_setup(); void CRYPTO_thread_cleanup(); #endif gsoap-2.8.91/gsoap/samples/ssl/ssl.h0000644000175000017500000000352413525245163016626 0ustar ellertellert/* ssl.h Example SSL-secure client and server. SSL-enabled services use the gSOAP SSL interface. See sslclient.c and sslserver.c for example code with instructions and the gSOAP documentation more details. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: ssl //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: urn:ssl //gsoap ns service location: https://localhost:18081 typedef double xsd__double; int ns__add(xsd__double a, xsd__double b, xsd__double *result); gsoap-2.8.91/gsoap/samples/ssl/dh4096.pem0000644000175000017500000000140113525245163017265 0ustar ellertellert-----BEGIN DH PARAMETERS----- MIICCAKCAgEAoIvNMvr8VU9p1EWhurnPtxt6V/503dBKuN3SZWzOJVEEpdA+oBff 8NcxiIzFOtyXpNy09GDkheZUUt+vtxKV64yjzIvW1774/1B6/vpT8gTajsvakxlP SwCpcKKjGlIRs/23mOUZb0IVr0ZLtXO1rZiHDb/EnJfDvcOhjPCCC59hRIIGeDgY XY3QHryOM4XRvyPh79Q8fG8x2GxHhuZtwH8OgYs4L876kKqP0XnmdlawIxzcv2qb jL+Ysy2Mc9GPQHy3d/5x45fhRuXPhsHLNmHhmf66u57y1FJjoslr3CSpbyoBzZGy UjIKlvtB9CGAYO0mgvDFgKpb0JC+BVMwvWQK+GWohvCO/wwrnQ5YFsMmK3uqELMN A5uHQoTXj0htsV8LSUC3mbPcvc+IBryINJkM0utredKexs9jMtWcaNfqNz6J0t0M NU+Ajkqqf5qE8n5b0X/mj6pH2j2YasCqi7S/T2VRCtB4RvE3y8+Cu9TgeU2p2pQh JHbaOH2AQW6lDlP37ieGDHhIS+xLvUubARtVNk4qtVSqMKMbwCQbDvS77PSXcdqt NEA1kZ0KuYYdepMJ6XT1/Pb7ObDfs8VZEIofLbTwzZf/Vp5CsOqVXPzC1tCImdpJ iPwTbofsyrlDfpBGfh2jnWRlytsyZ11r9qi1QGFlAWpLoFRJt6gQ6usCAQI= -----END DH PARAMETERS----- gsoap-2.8.91/gsoap/samples/ssl/root.sh0000644000175000017500000000211513525245163017166 0ustar ellertellert#!/bin/sh # Create the self-signed root CA and root's certificate: root.pem cacert.pem echo "* This utility creates a self-signed private root CA and public certificate:" echo "* root.pem - private root CA (keep this secret)" echo "* cacert.pem - public CA certificate (shared)" echo "* Distribute the cacert.pem to clients to authenticate your server" echo "* Use root.pem to sign certificates using the cert.sh utility" echo "*" echo "* Enter a (new) secret pass phrase when requested" echo "* Enter it again when prompted to self-sign the CA root certificate" echo "* You also need the pass phrase later to sign the client and server key files" echo "* Enter your company name as the Common Name (e.g. genivia.com) when requested" echo "* The root CA will expire after three years (1095 days)" openssl req -newkey rsa:1024 -sha1 -keyout rootkey.pem -out rootreq.pem openssl x509 -req -in rootreq.pem -sha1 -extfile openssl.cnf -extensions v3_ca -signkey rootkey.pem -out cacert.pem -days 1095 cat cacert.pem rootkey.pem > root.pem openssl x509 -subject -issuer -dates -noout -in root.pem gsoap-2.8.91/gsoap/samples/ssl/dh1024.pem0000644000175000017500000000036513525245163017261 0ustar ellertellert-----BEGIN DH PARAMETERS----- MIGHAoGBAP60Z2NxZi679crmEYW6RnBtSVBtD/ismDZMf/0pgs3gVOZQoSA9yJTO zkwMvQW3ox0XM+54PFKtmNOmS8jXKBaL0iUO+BuEZl44Oh1CA096tbET5jWlGCR2 PlxtcipPA5fx+ZM8RoYZKoCxP1JLr8UU4VQkEJiliz8QD0mfpygzAgEC -----END DH PARAMETERS----- gsoap-2.8.91/gsoap/samples/ssl/sslclient.c0000644000175000017500000002130013525245163020010 0ustar ellertellert/* sslclient.c Example SSL-secure client. Build steps: soapcpp2 -c ssl.h cc -DWITH_OPENSSL -o sslserver sslserver.c soapC.c soapClient.c stdsoap2.c thread_setup.c SSL-enabled services use the gSOAP SSL interface. See sslclient.c and sslserver.c for example code with instructions and the gSOAP documentation more details. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "ssl.nsmap" #include "threads.h" /* gsoap/plugin/threads.h */ #include "ssl_setup.h" /* soap_ssl_client_setup */ #include /* defines SIGPIPE */ const char server[] = "https://localhost:18081"; void sigpipe_handle(int x) { } int CRYPTO_thread_setup(); void CRYPTO_thread_cleanup(); int main() { struct soap soap; double a, b, result; /* Uncomment to call this first before all else if SSL is initialized elsewhere, e.g. in application code */ /* soap_ssl_noinit(); */ /* Init SSL before any threads are started (do this just once) */ soap_ssl_init(); /* set up SSL locks */ if (CRYPTO_thread_setup()) { fprintf(stderr, "Cannot setup thread mutex for OpenSSL\n"); exit(1); } a = 10.0; b = 20.0; /* Init gSOAP context */ soap_init(&soap); /* The supplied server certificate "server.pem" assumes that the server is running on 'localhost', so clients can only connect from the same host when verifying the server's certificate. Use SOAP_SSL_NO_AUTHENTICATION to omit the authentication of the server and use encryption directly from any site. To verify the certificates of third-party services, they must provide a certificate issued by Verisign or another trusted CA. At the client-side, the capath parameter should point to a directory that contains these trusted (root) certificates or the cafile parameter should refer to one file will all certificates. To help you out, the supplied "cacerts.pem" file contains the certificates issued by various CAs. You should use this file for the cafile parameter instead of "cacert.pem" to connect to trusted servers. Note that the client may fail to connect if the server's credentials have problems (e.g. expired). Use SOAP_SSL_NO_AUTHENTICATION and set cacert to NULL to encrypt messages if you don't care about the trustworthyness of the server. Note 1: the password and capath are not used with GNUTLS Note 2: setting capath may not work on Windows. */ if (soap_ssl_client_context(&soap, /* SOAP_SSL_NO_AUTHENTICATION, */ /* for encryption w/o authentication */ /* SOAP_SSL_DEFAULT | SOAP_SSL_SKIP_HOST_CHECK, */ /* if we don't want the host name checks since these will change from machine to machine */ SOAP_SSL_DEFAULT | SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE, /* allow self-signed, expired, and certificates w/o CRL */ /* SOAP_SSL_DEFAULT, */ /* use SOAP_SSL_DEFAULT in production code */ NULL, /* keyfile (cert+key): required only when client must authenticate to server (see SSL docs to create this file) */ NULL, /* password to read the keyfile */ "cacert.pem", /* optional cacert file to store trusted certificates, use cacerts.pem for all public certificates issued by common CAs */ NULL, /* optional capath to directory with trusted certificates */ NULL /* if randfile!=NULL: use a file with random data to seed randomness */ )) { soap_print_fault(&soap, stderr); exit(EXIT_FAILURE); } /* Consider using soap_ssl_client_setup() instead of soap_ssl_client_context() above: - automatically uses certificates stored in Unix/Linux common locations - automatically uses Windows system certificate store - when -DWITH_WININET is defined, uses the gSOAP WinInet plugin with WinInet system certificate store - when -DWITH_CURL is defined, uses the gSOAP CURL plugin with CURL certificate store if (soap_ssl_client_setup(&soap, // SOAP_SSL_DEFAULT | SOAP_SSL_SKIP_HOST_CHECK, if we don't want the host name checks since these will change from machine to machine SOAP_SSL_DEFAULT | SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE, // allow self-signed, expired, and certificates w/o CRL NULL, // keyfile (cert+key): required only when client must authenticate to server (see SSL docs to create this file) NULL, // password to read the keyfile "cacert.pem", // optional cacert file to store trusted certificates, use cacerts.pem for all public certificates issued by common CAs NULL // optional capath to directory with trusted certificates )) { soap_print_fault(&soap, stderr); exit(1); } */ /* code below enables CRL, may need SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE when certs have no CRL resulting in a warning/error */ if (soap_ssl_crl(&soap, "") ) { soap_print_fault(&soap, stderr); exit(EXIT_FAILURE); } soap.connect_timeout = 30; /* try to connect for up to 30 seconds */ soap.send_timeout = soap.recv_timeout = 10; /* max I/O idle time is 10 seconds */ if (soap_call_ns__add(&soap, server, "", a, b, &result) == SOAP_OK) fprintf(stdout, "Result: %f + %f = %f\n", a, b, result); else soap_print_fault(&soap, stderr); soap_destroy(&soap); soap_end(&soap); soap_done(&soap); CRYPTO_thread_cleanup(); return 0; } /******************************************************************************\ * * OpenSSL * \******************************************************************************/ #if defined(WITH_OPENSSL) struct CRYPTO_dynlock_value { MUTEX_TYPE mutex; }; static MUTEX_TYPE *mutex_buf = NULL; static struct CRYPTO_dynlock_value *dyn_create_function(const char *file, int line) { struct CRYPTO_dynlock_value *value; (void)file; (void)line; value = (struct CRYPTO_dynlock_value*)OPENSSL_malloc(sizeof(struct CRYPTO_dynlock_value)); if (value) MUTEX_SETUP(value->mutex); return value; } static void dyn_lock_function(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line) { (void)file; (void)line; if (mode & CRYPTO_LOCK) MUTEX_LOCK(l->mutex); else MUTEX_UNLOCK(l->mutex); } static void dyn_destroy_function(struct CRYPTO_dynlock_value *l, const char *file, int line) { (void)file; (void)line; MUTEX_CLEANUP(l->mutex); OPENSSL_free(l); } static void locking_function(int mode, int n, const char *file, int line) { (void)file; (void)line; if (mode & CRYPTO_LOCK) MUTEX_LOCK(mutex_buf[n]); else MUTEX_UNLOCK(mutex_buf[n]); } static unsigned long id_function() { return (unsigned long)THREAD_ID; } int CRYPTO_thread_setup() { int i; mutex_buf = (MUTEX_TYPE*)OPENSSL_malloc(CRYPTO_num_locks() * sizeof(MUTEX_TYPE)); if (!mutex_buf) return SOAP_EOM; for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_SETUP(mutex_buf[i]); CRYPTO_set_id_callback(id_function); CRYPTO_set_locking_callback(locking_function); CRYPTO_set_dynlock_create_callback(dyn_create_function); CRYPTO_set_dynlock_lock_callback(dyn_lock_function); CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function); return SOAP_OK; } void CRYPTO_thread_cleanup() { int i; if (!mutex_buf) return; CRYPTO_set_id_callback(NULL); CRYPTO_set_locking_callback(NULL); CRYPTO_set_dynlock_create_callback(NULL); CRYPTO_set_dynlock_lock_callback(NULL); CRYPTO_set_dynlock_destroy_callback(NULL); for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_CLEANUP(mutex_buf[i]); OPENSSL_free(mutex_buf); mutex_buf = NULL; } #else int CRYPTO_thread_setup() { return SOAP_OK; } void CRYPTO_thread_cleanup() { } #endif gsoap-2.8.91/gsoap/samples/ssl/Makefile.am0000644000175000017500000000145713525245163017713 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = foreign 1.4 noinst_PROGRAMS = sslclient sslserver SOAPHEADER = ssl.h include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = $(SOAP_NS_DEF) sslclient_CFLAGS = -DWITH_OPENSSL -DWITH_GZIP sslclient_SOURCES = sslclient.c $(SOAPHEADER) $(SOAP_C_CLIENT) ssl_setup.c ../../plugin/threads.c sslclient_LDADD = $(SOAP_C_LIB_SSL) $(SAMPLE_EXTRA_LIBS) $(SAMPLE_SSL_LIBS) -lpthread sslserver_CFLAGS = -DWITH_OPENSSL -DWITH_GZIP sslserver_SOURCES = sslserver.c $(SOAPHEADER) $(SOAP_C_SERVER) ../../plugin/threads.c sslserver_LDADD = $(SOAP_C_LIB_SSL) $(SAMPLE_EXTRA_LIBS) $(SAMPLE_SSL_LIBS) -lpthread gsoap-2.8.91/gsoap/samples/ssl/cacert.pem0000644000175000017500000000242213525245163017614 0ustar ellertellert-----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJAIb3LgUGI6LjMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE4MDgy NTE3NTczNloXDTIxMDgyNDE3NTczNlowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBAMXNOWKaNVtyWpWa/5/mNXZ7cgv+v5B1RL0OoOwvoQ5dHhc4KycDPAtiiV+I AoZy7bLbARWJboLPo3JnOf3Mc0aQjVFXz+X8eVhEseCIP4HAWSGa5ISDVDdxj4Nh RfwlVtrmLdL08HkTr+f3scHRvtvtmAtTFeT9FOCzttMpBRTXAgMBAAGjgfUwgfIw HQYDVR0OBBYEFFYsYA+p+TdDTXP7VrzUmLoQ0ypJMIHCBgNVHSMEgbowgbeAFFYs YA+p+TdDTXP7VrzUmLoQ0ypJoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkAhvcuBQYjouMwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQA1xebtW3G5e9Xfz2zys4d+628r2qy4ov0ggGS5 WmrBhyIFCE+xW1bj5waLMOt0e4+yfODMTcVKArrrthJdHm5YFILT9ZU2hOEOZw5P Dizc3Q34yzQxXrpsaHri5OfM0wgiIJOynz/YbX2f46YpqhMT7VvNoI8sR+OIydcY mi3qVQ== -----END CERTIFICATE----- gsoap-2.8.91/gsoap/samples/ssl/cacerts.h0000644000175000017500000000511613525245163017450 0ustar ellertellert/* cacerts.h Stores CA certificates in memory to replace the use of cacerts.pem Simply replace the call to soap_ssl_client_context() with a call to: soap_ssl_client_cacerts(soap); No cacerts.pem file is needed. gSOAP XML Web services tools Copyright (C) 2000-2018, 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-2018, 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 WITH_OPENSSL #define WITH_OPENSSL #endif #include "stdsoap2.h" #ifdef __cplusplus extern "C" { #endif int soap_ssl_client_cacerts(struct soap *soap); #ifdef __cplusplus } #endif gsoap-2.8.91/gsoap/samples/router/0000755000175000017500000000000013525245200016357 5ustar ellertellertgsoap-2.8.91/gsoap/samples/router/.deps/0000755000175000017500000000000013525245200017370 5ustar ellertellertgsoap-2.8.91/gsoap/samples/router/.deps/soapClient.Po0000644000175000017500000001034213525245163022001 0ustar ellertellertsoapClient.o soapClient.o: soapClient.c soapH.h soapStub.h \ ../../../gsoap/stdsoap2.h ../../../config.h /usr/include/stdlib.h \ /usr/include/Availability.h /usr/include/AvailabilityInternal.h \ /usr/include/_types.h /usr/include/sys/_types.h \ /usr/include/sys/cdefs.h /usr/include/machine/_types.h \ /usr/include/i386/_types.h /usr/include/sys/wait.h \ /usr/include/sys/signal.h /usr/include/sys/appleapiopts.h \ /usr/include/machine/signal.h /usr/include/i386/signal.h \ /usr/include/i386/_structs.h /usr/include/sys/_structs.h \ /usr/include/machine/_structs.h /usr/include/mach/i386/_structs.h \ /usr/include/sys/resource.h /usr/include/machine/endian.h \ /usr/include/i386/endian.h /usr/include/sys/_endian.h \ /usr/include/libkern/_OSByteOrder.h \ /usr/include/libkern/i386/_OSByteOrder.h /usr/include/alloca.h \ /usr/include/machine/types.h /usr/include/i386/types.h \ /usr/include/i386/_types.h /usr/include/stdio.h \ /usr/include/secure/_stdio.h /usr/include/secure/_common.h \ /usr/include/string.h /usr/include/secure/_string.h \ /usr/include/ctype.h /usr/include/runetype.h \ /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/limits.h \ /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/syslimits.h \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/i386/limits.h /usr/include/i386/_limits.h \ /usr/include/sys/syslimits.h /usr/include/poll.h \ /usr/include/sys/poll.h /usr/include/errno.h /usr/include/sys/errno.h \ /usr/include/sys/types.h /usr/include/sys/timeb.h /usr/include/time.h \ /usr/include/_structs.h /usr/include/sys/socket.h \ /usr/include/machine/_param.h /usr/include/i386/_param.h \ /usr/include/strings.h /usr/include/sys/time.h \ /usr/include/sys/_select.h /usr/include/netinet/in.h \ /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/stdint.h \ /usr/include/netinet6/in6.h /usr/include/netinet/tcp.h \ /usr/include/arpa/inet.h /usr/include/netdb.h /usr/include/unistd.h \ /usr/include/sys/unistd.h /usr/include/sys/select.h \ /usr/include/fcntl.h /usr/include/sys/fcntl.h /usr/include/math.h \ /usr/include/architecture/i386/math.h /usr/include/AvailabilityMacros.h soapH.h: soapStub.h: ../../../gsoap/stdsoap2.h: ../../../config.h: /usr/include/stdlib.h: /usr/include/Availability.h: /usr/include/AvailabilityInternal.h: /usr/include/_types.h: /usr/include/sys/_types.h: /usr/include/sys/cdefs.h: /usr/include/machine/_types.h: /usr/include/i386/_types.h: /usr/include/sys/wait.h: /usr/include/sys/signal.h: /usr/include/sys/appleapiopts.h: /usr/include/machine/signal.h: /usr/include/i386/signal.h: /usr/include/i386/_structs.h: /usr/include/sys/_structs.h: /usr/include/machine/_structs.h: /usr/include/mach/i386/_structs.h: /usr/include/sys/resource.h: /usr/include/machine/endian.h: /usr/include/i386/endian.h: /usr/include/sys/_endian.h: /usr/include/libkern/_OSByteOrder.h: /usr/include/libkern/i386/_OSByteOrder.h: /usr/include/alloca.h: /usr/include/machine/types.h: /usr/include/i386/types.h: /usr/include/i386/_types.h: /usr/include/stdio.h: /usr/include/secure/_stdio.h: /usr/include/secure/_common.h: /usr/include/string.h: /usr/include/secure/_string.h: /usr/include/ctype.h: /usr/include/runetype.h: /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/limits.h: /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/syslimits.h: /usr/include/limits.h: /usr/include/machine/limits.h: /usr/include/i386/limits.h: /usr/include/i386/_limits.h: /usr/include/sys/syslimits.h: /usr/include/poll.h: /usr/include/sys/poll.h: /usr/include/errno.h: /usr/include/sys/errno.h: /usr/include/sys/types.h: /usr/include/sys/timeb.h: /usr/include/time.h: /usr/include/_structs.h: /usr/include/sys/socket.h: /usr/include/machine/_param.h: /usr/include/i386/_param.h: /usr/include/strings.h: /usr/include/sys/time.h: /usr/include/sys/_select.h: /usr/include/netinet/in.h: /usr/lib/gcc/i686-apple-darwin10/4.2.1/include/stdint.h: /usr/include/netinet6/in6.h: /usr/include/netinet/tcp.h: /usr/include/arpa/inet.h: /usr/include/netdb.h: /usr/include/unistd.h: /usr/include/sys/unistd.h: /usr/include/sys/select.h: /usr/include/fcntl.h: /usr/include/sys/fcntl.h: /usr/include/math.h: /usr/include/architecture/i386/math.h: /usr/include/AvailabilityMacros.h: gsoap-2.8.91/gsoap/samples/router/Makefile.in0000644000175000017500000004562013525245163020443 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = router$(EXEEXT) subdir = gsoap/samples/router ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am_router_OBJECTS = router.$(OBJEXT) $(am__objects_1) $(am__objects_2) router_OBJECTS = $(am_router_OBJECTS) am__DEPENDENCIES_1 = router_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/router.Po ./$(DEPDIR)/soapC.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(router_SOURCES) DIST_SOURCES = $(router_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.c_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = router.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = $(SOAP_NS_DEF) router_SOURCES = router.c $(SOAPHEADER) $(SOAP_C_CORE) router_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/router/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/router/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) router$(EXEEXT): $(router_OBJECTS) $(router_DEPENDENCIES) $(EXTRA_router_DEPENDENCIES) @rm -f router$(EXEEXT) $(AM_V_CCLD)$(LINK) $(router_OBJECTS) $(router_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/router.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/router.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/router.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/router/router.c0000644000175000017500000007024313525245163020061 0ustar ellertellert/* router.c SOAP/XML message router (relay server and message forwarding). Note: HTTP cookies are not supported Copyright (C) 2000-2002 Robert A. van Engelen. All Rights Reserved. Configure ========= The router uses two routing tables: an internal table (for speed) and an external routing file (for flexibility). The internal is always checked first. Change the contents of the tables to your needs. Internal table: struct t__Routing routing[] (see below) External table: provide the name of a default routing file (see below) or use router option -r Compile ======= soapcpp2 -c router.h gcc -o router router.c stdsoap2.c soapC.c Notes ===== Unix/Linux SIGPIPE handler must be added to avoid broken pipe. In DEBUG mode the engine reports memory leaks for the allocation of the external routing table. This is normal, because the routing table is permanent. Usage scenarios =============== Command-line options: -a action value override (SOAP Action) -c connect directly to endpoint if routing table redirect fails -e endpoint URL -g start stand-alone router on port -r use external routing table (XML file) -t connect/send/recv timeout Forwarding of messages to a service ----------------------------------- router [-c] [-e | -g] [-a] [-r] [-t] [] Examples: 1. router -c request.soap Sends the request message stored in file request.soap and returns response to stdout where file request.soap contains a SOAP request with HTTP header and SOAP/XML/DIME body. If the SOAPAction in the message is present and matches one or more keys in the routing table, the alternative service endpoints in the table will be tried first until one service endpoint is found to accept the connection. If no SOAPAction is given or the SOAPAction does not match any key, then the endpoint in the HTTP header in request.soap is searched in the routing table. If the endoint matches one or more keys in the routing table, the alternative endpoints will be tried first until one endpoint is found to accept the connection. Finally, the endpoint in the HTTP header of request.soap is used to establish a connection if all other service endpoints in the table failed and if option -c is enabled. 2. router -c -e http://domain/path request.soap Sends request message to http://domain/path and returns the service response to stdout. If http://domain/path matches one or more keys in the routing table, then the alternative service endpoints in the table will be tried first until one service endpoint is found to accept the connection. The http://domain/path endpoint is tried last when all other service endpoints in the table failed. File request.soap MAY contain an HTTP header but MUST of course contain a body. To try this, compile the 'calc' client (samples/calc). Edit the 'calc.add.req.xml' SOAP/XML request file and replace and values. Then run: router -c -e "http://www.cs.fsu.edu/~engelen/calcserver.cgi" -a "" calc.add.req.xml The SOAP/XML response is returned. 3. router -a SOAPAction request.soap When SOAPAction matches one or more keys in the routing table, then the alternative endpoints in the table will be tried first until one endpoint is found to accept the connection. When all endpoints fail, or when SOAPAction does not match a key, the router fails. File request.soap MAY contain an HTTP header but MUST of course contain a body. 4. router -c -r routingtable.xml request.soap Same as 1. but uses routingtable.xml as the routing table after checking keys in the internal routing table. The XSD schema of routingtable.xml is generated as t.xsd. The default routing table file is router.xml. 5. router -c -t5 request.soap Same as 1. but searches the routing table for an endpoint that takes less than 5 seconds to connect to. Use negative timeouts to specify a timeout value in microseconds. The timeout also specifies the message receive timeout AFTER the connection was established. 6. cat request.soap | router -c -e http://domain/path | more When request.soap does not contain an HTTP header, the router computes the HTTP content length by buffering the entire request message which allows you to use it as a filter as in this example. (fstat() is generally tried first to determine file length.) 7. router -c -g http://domain/path/file.html Sends an HTTP GET request to the host and copies the response to stdout. CGI-based relay server ---------------------- Install the router as CGI application. The CGI-based relay service uses SOAPActions in the messages and HTTP query strings to index the routing table. Examples: Messages addressed to "http://domain/cgi-bin/router?key" will be routed by the router to the service endpoint associated with the key in the routing table. When messages use SOAPActions, the SOAPActions will be used to find service endpoints instead of a query string. To tunnel SOAP through firewals to stateful stand-alone Web services: run a stand-alone gSOAP Web service on a port, e.g. 18000. Add the key-endpoint pair "myservice", "http://localhost:18000" to the router table. After installing the router, all requests for endpoint http://domain/cgi-bin/router?myservice will be tunneled to the stand-alone Web service. To add backup services: add multiple key-endpoint pairs to the routing table with the same key. Given a key (e.g. SOAPAction or Query string) the router will check the endpoints in sequence until it can connect. If one or more of the backup services are down, an active service endpoint will be selected. Multi-threaded stand-alone relay server --------------------------------------- router -p [-r] [-t] & Examples: router -p18000 -rtable.xml -t5 & Runs a stand-alone router on port 18000 using table.xml as the external routing table for lookup. Service endpoints are selected from alternative endpoints that take less than 5 seconds to connect to. Clients connect to the router with a service endpoint such as "http://machine:/path" where the endpoint "http://machine/path" (note the absence of the port) will be used as a key in the routing table to find an endpoint when no SOAPAction is present. For example, a stand-alone Web service called "quote" runs on a machine named "zulu" port 18080. To address this service through the router, add key "http://zulu/quote" and endpoint "http://zulu:18080" to the routing table. Run the router on port 18000. Router requests with endpoint "http://zulu:18000/quote" will be relayed to zulu:18080 Gateway keeper -------------- When the routing table contains userid and passwd information, the client requests are only tunnelled when the proper HTTP Authorization userid and passwd are provided in the client request message. It is possible to provide different service endpoint in the table depending on the client's HTTP Authorization information. Notes ----- * Table lookup algorithm: SOAPActions (if provided) are used first to match routing table keys. Next, HTTP query string in the endpoint URL (CGI only) is used to match routing table keys. Next, the service endpoint is checked to match routing table keys. Finally, if the -c option is set the service endpoint URL itself is used to connect. * Keys in routing table may contain * (multi-char) and - (single-char) wildcards to match multiple SOAPActions and endpoints. * When a match is found but the endpoint is NULL in the table, the search is terminated. This can be used to prevent searches in the routing file for specific patterns. * Optional HTTP Authorization userid and passwd are checked if present in the routing table. The userid and passwd may be patterns with '*' and '-' wildcards. An endpoint in the table is selected for which the userid and passwd match. * is TCP connect and I/O timeout for router-server connection in seconds (use negative value for timeout in microseconds). * When an external routing table is once read by a stand-alone router, it will be cached to optimize speed. But this also means that changing the contents of the routing table file does not affect the actual routing while the stand-alone router is running. * HTTP POST and HTTP GET styles of SOAP messaging is supported (but CGI-based router does not support HTTP GET) * Supports any type of messages (e.g. DIME) * HTTP cookies are not handled and will be deleted from the HTTP header * Keep-alive support has not been tested and might not work -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include /* need fstat */ #include "threads.h" /* plugin/threads.h for portable threads+mutex */ /* Maximum request backlog */ #define BACKLOG (100) /* Default file name of external routing table (or NULL if none used) */ #define DEFAULT_ROUTINGFILE "router.xml" /* Internal routine table (fast) */ static struct t__Routing routing[] = /* SOAPAction/endpoint -> target endpoint [userid, passwd] */ { {"dime", "http://websrv.cs.fsu.edu/~engelen/dimesrv.cgi"}, {"http://*/dime", "http://websrv.cs.fsu.edu/~engelen/dimesrv.cgi"}, {"magic", "http://www.cs.fsu.edu/~engelen/magicserver.cgi"}, {NULL, NULL} }; #ifdef WIN32 #define OPTION_CHAR '/' #else #define OPTION_CHAR '-' #endif struct header { struct header *next; char line[SOAP_HDRLEN]; }; static int port_number = 0; static const char *input_file = NULL; static const char *service_endpoint = NULL; static const char *service_action = NULL; static const char *routing_file = DEFAULT_ROUTINGFILE; static int server_timeout = 0; static int method = SOAP_POST; static int connect_flag = 0; void options(int, char**); void *process_request(void*); const char *lookup(struct t__RoutingTable*, const char*, const char*, const char*); int copy_header(struct soap*, struct soap*, const char*, const char*); int create_header(struct soap*, int, const char*, const char*, size_t); int buffer_body(struct soap*); int copy_body(struct soap*, struct soap*); int server_connect(struct soap*, const char*, const char*, const char*, const char*); int make_connect(struct soap*, const char*); int main(int argc, char **argv) { options(argc, argv); if (port_number) { /* run server on port */ THREAD_TYPE tid; struct soap soap, *tsoap; int m, s, i; soap_init(&soap); soap.bind_flags = SO_REUSEADDR; /* don't use this in a secure environment. We keep it here so you can quickly restart the router */ m = soap_bind(&soap, NULL, port_number, BACKLOG); if (!soap_valid_socket(m)) { soap_print_fault(&soap, stderr); exit(1); } fprintf(stderr, "Socket connection successful %d\n", m); for (i = 1; ; i++) { s = soap_accept(&soap); if (!soap_valid_socket(s)) { if (soap.errnum) soap_print_fault(&soap, stderr); else fprintf(stderr, "router timed out\n"); /* if accept_timeout is set */ break; } fprintf(stderr, "Thread %d accepts socket %d connection from IP %d.%d.%d.%d\n", i, s, (int)(soap.ip>>24)&0xFF, (int)(soap.ip>>16)&0xFF, (int)(soap.ip>>8)&0xFF, (int)soap.ip&0xFF); tsoap = soap_copy(&soap); while (THREAD_CREATE(&tid, (void*(*)(void*))process_request, (void*)tsoap)) sleep(1); } } else /* run as stand-alone or CGI */ { struct soap client; struct soap server; int err; soap_init(&client); soap_init(&server); if (argc <= 1) /* try CGI env vars */ { char *s = getenv("REQUEST_METHOD"); if (s && !strcmp(s, "GET")) method = SOAP_GET; else { s = getenv("Content-Length"); if (s) client.length = strtoul(s, NULL, 10); } service_action = getenv("HTTP_SOAPAction"); if (!service_action) service_action = getenv("QUERY_STRING"); } if (method == SOAP_POST) { soap_wchar c; if (input_file) { client.recvfd = open(input_file, O_RDONLY); if (client.recvfd < 0) { fprintf(stderr, "router: cannot open file '%s' for reading\n", input_file); exit(1); } } c = soap_get0(&client); if (c == 'G' || c == 'P') /* simple check to see if HTTP GET/POST header is present */ { if (copy_header(&client, &server, service_endpoint, service_action)) { err = client.error = server.error; soap_send_fault(&client); return err; } } else { struct stat sb; if (!fstat(client.recvfd, &sb) && sb.st_size > 0) client.length = sb.st_size; else if ((err = buffer_body(&client)) != SOAP_OK) { soap_send_fault(&client); return err; } if (create_header(&server, SOAP_POST, service_endpoint, service_action, client.length)) { err = client.error = server.error; soap_send_fault(&client); return err; } } if ((err = copy_body(&client, &server)) != SOAP_OK) { soap_send_fault(&client); return err; } } else { if (create_header(&server, SOAP_GET, service_endpoint, service_action, 0)) { err = client.error = server.error; soap_send_fault(&client); return err; } soap_end_send(&server); } soap_begin(&server); copy_header(&server, &client, NULL, NULL); /* ignore TCP error for stdout */ if ((err = copy_body(&server, &client)) != SOAP_OK) return err; soap_closesock(&client); soap_closesock(&server); soap_end(&client); soap_end(&server); soap_done(&client); soap_done(&server); } return 0; } void options(int argc, char **argv) { int i, flag; char *arg; for (i = 1; i < argc; i++) { arg = argv[i]; if (*arg == OPTION_CHAR) { flag = 1; while (flag && *++arg) switch (*arg) { case 'h': fprintf(stderr, "Usage: router [-c] [-p] [-e | -g] [-a] [-r] [-t] []\n-a\taction value override (SOAP Action)\n-c\tconnect directly to endpoint\n-e\tendpoint URL\n-g\tget content (instead of HTTP POST)\n-p\tstart stand-alone router on port\n-r\trouting table\n-t\ttimeout in seconds"); exit(0); case 'p': flag = 0; if (*++arg) port_number = atol(arg); else if (i < argc && argv[++i]) port_number = atol(argv[i]); else { fprintf(stderr, "router: -p requires \n"); exit(1); } break; case 'g': method = SOAP_GET; case 'e': flag = 0; if (*++arg) service_endpoint = arg; else if (i < argc && argv[++i]) service_endpoint = argv[i]; else { fprintf(stderr, "router: -e and -g require \n"); exit(1); } break; case 'a': flag = 0; if (*++arg) service_action = arg; else if (i < argc && argv[++i]) service_action = argv[i]; else { fprintf(stderr, "router: -a requires \n"); exit(1); } break; case 'r': flag = 0; if (*++arg) routing_file = arg; else if (i < argc && argv[++i]) routing_file = argv[i]; else { fprintf(stderr, "router: -r requires \n"); exit(1); } break; case 't': flag = 0; if (*++arg) server_timeout = atol(arg); else if (i < argc && argv[++i]) server_timeout = atol(argv[i]); else { fprintf(stderr, "router: -t requires \n"); exit(1); } break; case 'c': connect_flag = 1; break; default: fprintf(stderr, "router: unknown option -%c\n", *arg); } } else input_file = arg; } } void* process_request(void *soap) { struct soap *client = (struct soap*)soap, server; soap_wchar c; THREAD_DETACH(THREAD_ID); soap_init(&server); soap_begin(client); c = soap_get0(client); if (c == 'G' || c == 'P') /* simple check to see if HTTP GET/POST header is present */ { if (copy_header(client, &server, NULL, NULL)) client->error = server.error; } else { buffer_body(client); if (create_header(&server, method, service_endpoint, service_action, client->length)) client->error = server.error; } if (!client->error) { copy_body(client, &server); soap_begin(&server); copy_header(&server, client, NULL, NULL); copy_body(&server, client); } else soap_send_fault(client); soap_closesock(client); soap_closesock(&server); soap_end(&server); soap_end(client); soap_done(&server); soap_free(client); return NULL; } const char* lookup(struct t__RoutingTable *route, const char *key, const char *userid, const char *passwd) { static struct t__RoutingTable routing_table = {0, NULL}; /* file-based routing table cache */ if (!key) return NULL; /* can't do lookup on nil key */ if (!route->__ptr) { route->__ptr = routing; /* first stage: use internal routing table */ route->__size = 999999999; } else if (route->__size) { route->__ptr++; route->__size--; } for (;;) { if (route->__ptr) { while (route->__size && route->__ptr->key) { if (!soap_tag_cmp(key, route->__ptr->key)) if (!route->__ptr->userid || !route->__ptr->passwd || !userid || !passwd || !soap_tag_cmp(userid, route->__ptr->userid) || !soap_tag_cmp(passwd, route->__ptr->passwd)) return route->__ptr->endpoint; route->__ptr++; route->__size--; } } if (route->__size) /* second stage: use file-based routing table */ { if (routing_table.__ptr) *route = routing_table; /* table is already cached in memory */ else if (routing_file) /* else read table from file */ { static struct soap soap = { SOAP_NONE }; MUTEX_TYPE lock; MUTEX_LOCK(lock); if (soap.state == SOAP_NONE) soap_init(&soap); soap.recvfd = open(routing_file, O_RDONLY); if (soap.recvfd < 0) /* no routing file: silently stop */ { MUTEX_UNLOCK(lock); break; } if (!soap_begin_recv(&soap)) if (!soap_get_t__RoutingTable(&soap, &routing_table, "router", NULL)) { close(soap.recvfd); MUTEX_UNLOCK(lock); break; } soap_end_recv(&soap); close(soap.recvfd); *route = routing_table; MUTEX_UNLOCK(lock); } } else break; } return NULL; } int make_connect(struct soap *server, const char *endpoint) { char host[SOAP_TAGLEN]; int port; soap_strcpy(host, sizeof(host), server->host); port = server->port; soap_set_endpoint(server, endpoint); /* get host, path, and port */ server->connect_timeout = server_timeout; server->recv_timeout = server_timeout; server->send_timeout = server_timeout; /* server->connect_flags = SO_NOSIGPIPE; */ /* prevents UNIX SIGPIPE */ /* server->socket_flags = MSG_NOSIGNAL; */ /* prevents UNIX SIGPIPE */ if (*server->host) { if (!soap_valid_socket(server->socket) || strcmp(server->host, host) || server->port != port) { soap_closesock(server); server->socket = server->fopen(server, endpoint, server->host, server->port); if (!soap_valid_socket(server->socket)) return server->error; } } return SOAP_OK; } int server_connect(struct soap *server, const char *endpoint, const char *action, const char *userid, const char *passwd) { if (action && *action) { struct t__RoutingTable route; route.__ptr = NULL; route.__size = 0; fprintf(stderr, "Searching services on action %s...\n", action); while (lookup(&route, action, userid, passwd)) { fprintf(stderr, "Attempting to connect to '%s'\n", route.__ptr->endpoint); if (!make_connect(server, route.__ptr->endpoint)) return SOAP_OK; } } if (endpoint && *endpoint) { struct t__RoutingTable route; route.__ptr = NULL; route.__size = 0; fprintf(stderr, "Searching services on endpoint %s...\n", endpoint); while (lookup(&route, endpoint, userid, passwd)) { fprintf(stderr, "Attempting to connect to '%s'\n", route.__ptr->endpoint); if (!make_connect(server, route.__ptr->endpoint)) return SOAP_OK; } } if (connect_flag && endpoint && *endpoint) { fprintf(stderr, "Connect to endpoint %s...\n", endpoint); if (!make_connect(server, endpoint)) return SOAP_OK; } return server->error = SOAP_TCP_ERROR; } int copy_header(struct soap *sender, struct soap *receiver, const char *endpoint, const char *action) { struct header *h, *p; char *s, *t; h = (struct header*)SOAP_MALLOC(sender, sizeof(struct header)); for (;;) { if (soap_getline(sender, h->line, SOAP_HDRLEN)) { SOAP_FREE(sender, h); return sender->error = SOAP_EOF; } t = strchr(h->line, ' '); if (!t || strncmp(t, " 100 ", 5)) break; do { if (soap_getline(sender, h->line, SOAP_HDRLEN)) { SOAP_FREE(sender, h); return sender->error = SOAP_EOF; } } while (*h->line); } p = h; for (;;) { p = p->next = (struct header*)SOAP_MALLOC(sender, sizeof(struct header)); p->next = NULL; if (soap_getline(sender, p->line, SOAP_HDRLEN)) { while (h) { p = h->next; SOAP_FREE(sender, h); h = p; } return sender->error = SOAP_EOF; } if (!*p->line) break; s = t = strchr(p->line, ':'); if (t) { *t = '\0'; do t++; while (*t && *t <= 32); } sender->fparsehdr(sender, p->line, t); if (s) *s = ':'; } s = strstr(h->line, "HTTP/"); if (s && (!strncmp(h->line, "GET ", 4) || !strncmp(h->line, "POST ", 5))) { size_t m = strlen(sender->endpoint); size_t n = m + (s - h->line) - 5 - (*h->line == 'P'); if (n >= sizeof(sender->endpoint)) n = sizeof(sender->endpoint) - 1; soap_strncpy(sender->path, sizeof(sender->path), h->line + 4 + (*h->line == 'P'), n - m); soap_strncpy(sender->endpoint + m, sizeof(sender->endpoint) - m, sender->path, n - m); } if (!endpoint || !*endpoint) endpoint = sender->endpoint; if (!action || !*action) action = sender->action; if (server_connect(receiver, endpoint, action, receiver->userid, receiver->passwd)) { while (h) { p = h->next; SOAP_FREE(sender, h); h = p; } return receiver->error; } receiver->count = sender->length; soap_begin_send(receiver); receiver->mode &= ~SOAP_IO; receiver->mode |= SOAP_IO_BUFFER; while (h) { receiver->fposthdr(receiver, h->line, NULL); p = h->next; SOAP_FREE(sender, h); h = p; } if ((sender->mode & SOAP_IO) == SOAP_IO_CHUNK) { if (soap_flush(receiver)) return receiver->error; receiver->mode &= ~SOAP_IO; receiver->mode |= SOAP_IO_CHUNK; } return SOAP_OK; } int create_header(struct soap *server, int method, const char *endpoint, const char *action, size_t count) { if (server_connect(server, endpoint, action, NULL, NULL)) return server->error; soap_begin_send(server); server->mode &= ~SOAP_IO; server->mode |= SOAP_IO_BUFFER; server->status = method; return server->error = server->fpost(server, server->endpoint, server->host, server->port, server->path, action, count); } int buffer_body(struct soap *sender) { char *s; if (!soap_alloc_block(sender)) return sender->error; for (;;) { if (!(s = (char*)soap_push_block(sender, NULL, sender->buflen - sender->bufidx))) return SOAP_EOM; (void)soap_memcpy((void*)s, sender->buflen - sender->bufidx, (const void*)(sender->buf + sender->bufidx), sender->buflen - sender->bufidx); if (soap_recv_raw(sender)) break; } if (sender->error == SOAP_EOF) sender->error = SOAP_OK; if (sender->error || soap_end_recv(sender)) return sender->error; sender->length = sender->blist->size; return SOAP_OK; } int copy_body(struct soap *sender, struct soap *receiver) { if (sender->blist) { char *p; for (p = soap_first_block(sender, NULL); p; p = soap_next_block(sender, NULL)) soap_send_raw(receiver, p, soap_block_size(sender, NULL)); soap_end_block(sender, NULL); } else { if ((sender->mode & SOAP_IO) == SOAP_IO_CHUNK) { sender->chunkbuflen = sender->buflen; sender->buflen = sender->bufidx; sender->chunksize = 0; while (!soap_recv_raw(sender)) { if (soap_send_raw(receiver, sender->buf + sender->bufidx, sender->buflen - sender->bufidx)) return receiver->error; } } else { soap_send_raw(receiver, sender->buf + sender->bufidx, sender->buflen - sender->bufidx); /* send part after HTTP header */ if (sender->buflen - sender->bufidx < sender->length) { sender->length -= sender->buflen - sender->bufidx; while (!soap_recv_raw(sender)) { if (soap_send_raw(receiver, sender->buf, sender->buflen)) return receiver->error; if (sender->buflen >= sender->length) break; sender->length -= sender->buflen; } } } if (soap_end_recv(sender)) return sender->error; } if (soap_end_send(receiver)) return receiver->error; return SOAP_OK; } struct Namespace namespaces[] = { {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/"}, {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/"}, {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance"}, {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema"}, {"t", "http://tempuri.org"}, {NULL, NULL} }; gsoap-2.8.91/gsoap/samples/router/router.h0000644000175000017500000000341713525245163020065 0ustar ellertellert/* router.h Simple Web Service message router (relay server) -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2016, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ struct t__Routing { char *key; // key matches SOAPAction or query string or endpoint URL char *endpoint; char *userid; // optional HTTP Authorization userid char *passwd; // optional HTTP Authorization passwd }; struct t__RoutingTable { int __size; // size of array struct t__Routing *__ptr; // array of Routing entries }; gsoap-2.8.91/gsoap/samples/router/README.txt0000644000175000017500000001706113525245163020072 0ustar ellertellert SOAP/XML over HTTP message router. Supports many HTTP message routing scenarios. Command-line options: -a action value override (SOAP Action) -c connect directly to endpoint if routing table redirect fails -e endpoint URL -g start stand-alone router on port -r routing table XML file -t timeout Forwarding of messages to a service ----------------------------------- router [-c] [-e | -g] [-a] [-r] [-t] [] Examples: 1. router -c request.soap Sends the request message stored in file request.soap and returns response to stdout where file request.soap contains a SOAP request with HTTP header and SOAP/XML/DIME body. If the SOAPAction in the message is present and matches one or more keys in the routing table, the alternative service endpoints in the table will be tried first until one service endpoint is found to accept the connection. If no SOAPAction is given or the SOAPAction does not match any key, then the endpoint in the HTTP header in request.soap is searched in the routing table. If the endoint matches one or more keys in the routing table, the alternative endpoints will be tried first until one endpoint is found to accept the connection. Finally, the endpoint in the HTTP header of request.soap is used to establish a connection if all other service endpoints in the table failed and if option -c is enabled. 2. router -c -ehttp://domain/path request.soap Sends request message to http://domain/path and returns the service response to stdout. If http://domain/path matches one or more keys in the routing table, then the alternative service endpoints in the table will be tried first until one service endpoint is found to accept the connection. The http://domain/path endpoint is tried last when all other service endpoints in the table failed. File request.soap MAY contain an HTTP header but MUST of course contain a body. To try this, compile the 'calc' client (samples/calc). Edit the 'calc.add.req.xml' SOAP/XML request file and replace and values. Then run: router -ehttp://www.cs.fsu.edu/~engelen/calcserver.cgi -a"" calc.add.req.xml The SOAP/XML response is returned. 3. router -aSOAPAction request.soap When SOAPAction matches one or more keys in the routing table, then the alternative endpoints in the table will be tried first until one endpoint is found to accept the connection. When all endpoints fail, or when SOAPAction does not match a key, the router fails. File request.soap MAY contain an HTTP header but MUST of course contain a body. 4. router -c -rroutingtable.xml request.soap Same as 1. but uses routingtable.xml as the routing table after checking keys in the internal routing table. The XSD schema of routingtable.xml is generated as t.xsd. The default routing table file is router.xml. 5. router -c -t5 request.soap Same as 1. but searches the routing table for an endpoint that takes less than 5 seconds to connect to. Use negative timeouts to specify a timeout value in microseconds. The timeout also specifies the message receive timeout AFTER the connection was established. 6. cat request.soap | router -ehttp://domain/path | more When request.soap does not contain an HTTP header, the router computes the HTTP content length by buffering the entire request message which allows you to use it as a filter as in this example. (fstat() is generally tried first to determine file length.) 7. router -ghttp://domain/path/file.html Sends an HTTP GET request to the host and copies the response to stdout. CGI-based relay server ---------------------- Install the router as CGI application. The CGI-based relay service uses SOAPActions in the messages and HTTP query strings to index the routing table. Examples: Messages addressed to "http://domain/cgi-bin/router?key" will be routed by the router to the service endpoint associated with the key in the routing table. When messages use SOAPActions, the SOAPActions will be used to find service endpoints instead of a query string. To tunnel SOAP through firewals to stateful stand-alone Web services: run a stand-alone gSOAP Web service on a port, e.g. 18000. Add the key-endpoint pair "myservice", "http://localhost:18000" to the router table. After installing the router, all requests for endpoint http://domain/cgi-bin/router?myservice will be tunneled to the stand-alone Web service. To add backup services: add multiple key-endpoint pairs to the routing table with the same key. Given a key (e.g. SOAPAction or Query string) the router will check the endpoints in sequence until it can connect. If one or more of the backup services are down, an active service endpoint will be selected. Multi-threaded stand-alone relay server --------------------------------------- router -p [-r] [-t] & Examples: router -p18000 -rtable.xml -t5 & Runs a stand-alone router on port 18000 using table.xml as the external routing table for lookup. Service endpoints are selected from alternative endpoints that take less than 5 seconds to connect to. Clients connect to the router with a service endpoint such as "http://machine:/path" where the endpoint "http://machine/path" (note the absence of the port) will be used as a key in the routing table to find an endpoint when no SOAPAction is present. For example, a stand-alone Web service called "quote" runs on a machine named "zulu" port 18080. To address this service through the router, add key "http://zulu/quote" and endpoint "http://zulu:18080" to the routing table. Run the router on port 18000. Router requests with endpoint "http://zulu:18000/quote" will be relayed to zulu:18080 Gateway keeper -------------- When the routing table contains userid and passwd information, the client requests are only tunnelled when the proper HTTP Authorization userid and passwd are provided in the client request message. It is possible to provide different service endpoint in the table depending on the client's HTTP Authorization information. Notes ----- * Table lookup algorithm: SOAPActions (if provided) are used first to match routing table keys. Next, HTTP query string in the endpoint URL (CGI only) is used to match routing table keys. Next, the service endpoint is checked to match routing table keys. Finally, if the -c option is set the service endpoint URL itself is used to connect. * Keys in routing table may contain * (multi-char) and - (single-char) wildcards to match multiple SOAPActions and endpoints. * When a match is found but the endpoint is NULL in the table, the search is terminated. This can be used to prevent searches in the routing file for specific patterns. * Optional HTTP Authorization userid and passwd are checked if present in the routing table. The userid and passwd may be patterns with '*' and '-' wildcards. An endpoint in the table is selected for which the userid and passwd match. * is TCP connect and I/O timeout for router-server connection in seconds (use negative value for timeout in microseconds). * When an external routing table is once read by a stand-alone router, it will be cached to optimize speed. But this also means that changing the contents of the routing table file does not affect the actual routing while the stand-alone router is running. * HTTP POST and HTTP GET styles of SOAP messaging is supported (but CGI-based router does not support HTTP GET) * Supports any type of messages (e.g. DIME) * HTTP cookies are not handled and will be deleted from the HTTP header * Keep-alive support has not been tested and might not work gsoap-2.8.91/gsoap/samples/router/Makefile.am0000644000175000017500000000074713525245163020433 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = router SOAPHEADER = router.h include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = $(SOAP_NS_DEF) router_SOURCES = router.c $(SOAPHEADER) $(SOAP_C_CORE) router_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread gsoap-2.8.91/gsoap/samples/router/router.xml0000644000175000017500000000041113525245163020425 0ustar ellertellert magicserver http://www.cs.fsu.edu/~engelen/magicserver.cgi guest guest *?ldsrv http://localhost:18000 gsoap-2.8.91/gsoap/samples/async/0000755000175000017500000000000013525245205016161 5ustar ellertellertgsoap-2.8.91/gsoap/samples/async/asyncrest2.cpp0000644000175000017500000001604513525245161020771 0ustar ellertellert/* asyncrest2.cpp Example synchronous versus asynchronous REST messaging with threads Compilation: $ soapcpp2 -CL -r -wx async.h $ c++ -o asyncrest2 asyncrest2.cpp stdsoap2.cpp soapC.cpp Run by starting the webserver with HTTP pipeline and keep-alive enabled at port 8080, then run asyncrest:s $ ../webserver/webserver -ek 8080 & $ ./asyncrest2 -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2019, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "plugin/threads.h" #include "soapH.h" #include "async.nsmap" #define ENDPOINT "http://localhost:8080" #define CHECK(op) if (op) exit(EXIT_FAILURE) void if_error_then_die(struct soap *soap); void *async_receiver(void *arg); MUTEX_TYPE start_lock; MUTEX_TYPE ready_lock; COND_TYPE start; COND_TYPE ready; int main() { THREAD_TYPE tid; struct soap *soap = soap_new(); /* optionally use SOAP_IO_KEEPALIVE here to improve performance */ struct soap *soap_writer = soap_new(); /* to output to stdout and not interfere with the connected context */ struct ns__record record; MUTEX_SETUP(start_lock); MUTEX_SETUP(ready_lock); COND_SETUP(start); COND_SETUP(ready); CHECK(THREAD_CREATEX(&tid, async_receiver, soap)); soap->connect_timeout = 10; /* 10 sec connect timeout */ soap->transfer_timeout = 10; /* 10 second max message transfer time */ soap->send_timeout = 5; /* 5 second max socket recv idle time */ soap->recv_timeout = 5; /* 5 second max socket send idle time */ printf("Synchronous HTTP GET:\n"); if (soap_GET_ns__record(soap, ENDPOINT "/product?SKU=123", &record)) if_error_then_die(soap); (void)soap_write_ns__record(soap_writer, &record); printf("\n\n"); printf("Synchronous HTTP PUT:\n"); if (soap_PUT_ns__record(soap, ENDPOINT "/product", &record)) if_error_then_die(soap); printf("OK\n\n"); printf("Synchronous HTTP POST:\n"); if (soap_POST_send_ns__record(soap, ENDPOINT "/product", &record) || soap_POST_recv_ns__record(soap, &record)) if_error_then_die(soap); (void)soap_write_ns__record(soap_writer, &record); printf("\n\n"); soap_set_mode(soap, SOAP_IO_KEEPALIVE); /* try to keep the connection alive */ printf("Asynchronous HTTP GET:\n"); if (soap_GET(soap, ENDPOINT "/product?SKU=123", NULL)) if_error_then_die(soap); CHECK(COND_SIGNAL(start)); /* connection established, start async_receiver */ printf("Doing some work for one second...\n"); sleep(1); CHECK(COND_SIGNAL(start)); CHECK(MUTEX_LOCK(ready_lock)); CHECK(COND_WAIT(ready, ready_lock)); /* we may want to use a non-blocking wait instead of blocking */ CHECK(MUTEX_UNLOCK(ready_lock)); printf("Asynchronous HTTP PUT:\n"); if (soap_PUT(soap, ENDPOINT "/product", NULL, "text/xml") || soap_put_ns__record(soap, &record, "ns:record", NULL) || soap_end_send(soap)) if_error_then_die(soap); printf("Doing some work for one second...\n"); sleep(1); CHECK(COND_SIGNAL(start)); CHECK(MUTEX_LOCK(ready_lock)); CHECK(COND_WAIT(ready, ready_lock)); /* we may want to use a non-blocking wait instead of blocking */ CHECK(MUTEX_UNLOCK(ready_lock)); soap_clr_mode(soap, SOAP_IO_KEEPALIVE); /* optional, to inform the server the next message is the last */ printf("Asynchronous HTTP POST send & recv:\n"); if (soap_POST_send_ns__record(soap, ENDPOINT "/product", &record)) if_error_then_die(soap); printf("Doing some work for one second...\n"); sleep(1); CHECK(COND_SIGNAL(start)); CHECK(MUTEX_LOCK(ready_lock)); CHECK(COND_WAIT(ready, ready_lock)); /* we may want to use a non-blocking wait instead of blocking */ CHECK(MUTEX_UNLOCK(ready_lock)); THREAD_JOIN(tid); soap_force_closesock(soap); /* optional, soap_free() or a new connection will close the old anyway */ soap_destroy(soap_writer); soap_end(soap_writer); soap_free(soap_writer); soap_destroy(soap); soap_end(soap); soap_free(soap); MUTEX_CLEANUP(start_lock); MUTEX_CLEANUP(ready_lock); COND_CLEANUP(start); COND_CLEANUP(ready); return 0; } void if_error_then_die(struct soap *soap) { if (soap->error) { soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } } void *async_receiver(void *arg) { struct soap *soap; struct soap *soap_writer = soap_new(); /* to output to stdout and not interfere with the connected context */ struct ns__record record; CHECK(MUTEX_LOCK(start_lock)); CHECK(COND_WAIT(start, start_lock)); soap = soap_copy((struct soap*)arg); CHECK(MUTEX_UNLOCK(start_lock)); if (soap_begin_recv(soap) || soap_get_ns__record(soap, &record, "ns:record", NULL) == NULL || soap_end_recv(soap) || soap_closesock(soap)) if_error_then_die(soap); (void)soap_write_ns__record(soap_writer, &record); printf("\n\n"); CHECK(MUTEX_LOCK(start_lock)); CHECK(COND_WAIT(start, start_lock)); CHECK(MUTEX_UNLOCK(start_lock)); CHECK(COND_SIGNAL(ready)); if (soap_valid_socket(soap->socket)) { if (soap_recv_empty_response(soap)) if_error_then_die(soap); printf("OK\n\n"); } else { printf("Connection closed, server rejected keep-alive!\n"); } CHECK(MUTEX_LOCK(start_lock)); CHECK(COND_WAIT(start, start_lock)); CHECK(MUTEX_UNLOCK(start_lock)); CHECK(COND_SIGNAL(ready)); if (soap_valid_socket(soap->socket)) { if (soap_POST_recv_ns__record(soap, &record)) if_error_then_die(soap); (void)soap_write_ns__record(soap_writer, &record); printf("\n\n"); } else { printf("Connection closed, server rejected keep-alive!\n"); } CHECK(MUTEX_LOCK(start_lock)); CHECK(COND_WAIT(start, start_lock)); CHECK(MUTEX_UNLOCK(start_lock)); CHECK(COND_SIGNAL(ready)); soap_destroy(soap_writer); soap_end(soap_writer); soap_free(soap_writer); soap_destroy(soap); soap_end(soap); soap_free(soap); return NULL; } gsoap-2.8.91/gsoap/samples/async/asyncsoap2.cpp0000644000175000017500000001263513525245161020757 0ustar ellertellert/* asyncsoap2.cpp Example synchronous versus asynchronous SOAP messaging without threads Compilation: $ soapcpp2 -j -C -r -wx async.h $ c++ -o asyncsoap2 asyncsoap2.cpp stdsoap2.cpp soapC.cpp soapasyncProxy.cpp Run by starting the webserver with HTTP pipeline and keep-alive enabled at port 8080, then run asyncsoap2: $ ../webserver/webserver -ek 8080 & $ ./asyncsoap2 -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2019, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "plugin/threads.h" #include "soapasyncProxy.h" #include "async.nsmap" #define ENDPOINT "http://localhost:8080" #define SOAPACTION NULL #define CHECK(op) if (op) exit(EXIT_FAILURE) void if_error_then_die(struct soap *soap); void *async_receiver(void *arg); MUTEX_TYPE start_lock; MUTEX_TYPE ready_lock; COND_TYPE start; COND_TYPE ready; int main() { THREAD_TYPE tid; asyncProxy async; /* optionally use SOAP_IO_KEEPALIVE here to improve performance */ double a, b, r; MUTEX_SETUP(start_lock); MUTEX_SETUP(ready_lock); COND_SETUP(start); COND_SETUP(ready); CHECK(THREAD_CREATEX(&tid, async_receiver, &async)); async.soap->connect_timeout = 10; /* 10 sec connect timeout */ async.soap->transfer_timeout = 10; /* 10 second max message transfer time */ async.soap->send_timeout = 5; /* 5 second max socket recv idle time */ async.soap->recv_timeout = 5; /* 5 second max socket send idle time */ a = 2.0; b = 3.0; printf("Synchronous SOAP call:\n"); if (async.add(ENDPOINT, SOAPACTION, a, b, &r)) if_error_then_die(async.soap); printf("%g + %g = %g\n\n", a, b, r); printf("Synchronous SOAP call:\n"); if (async.mul(ENDPOINT, SOAPACTION, a, b, &r)) if_error_then_die(async.soap); printf("%g * %g = %g\n\n", a, b, r); soap_set_mode(async.soap, SOAP_IO_KEEPALIVE); /* try to keep the connection alive */ printf("Asynchronous SOAP send & recv:\n"); if (async.send_add(ENDPOINT, SOAPACTION, a, b)) if_error_then_die(async.soap); CHECK(COND_SIGNAL(start)); /* connection established, start async_receiver */ printf("Doing some work for one second...\n"); printf("%g + %g = ", a, b); sleep(1); CHECK(COND_SIGNAL(start)); CHECK(MUTEX_LOCK(ready_lock)); CHECK(COND_WAIT(ready, ready_lock)); /* we may want to use a non-blocking wait instead of blocking */ CHECK(MUTEX_UNLOCK(ready_lock)); soap_clr_mode(async.soap, SOAP_IO_KEEPALIVE); /* optional, to inform the server the next message is the last */ printf("Asynchronous SOAP send & recv:\n"); if (async.send_mul(ENDPOINT, SOAPACTION, a, b)) if_error_then_die(async.soap); printf("Doing some work for one second...\n"); printf("%g * %g = ", a, b); sleep(1); CHECK(COND_SIGNAL(start)); CHECK(MUTEX_LOCK(ready_lock)); CHECK(COND_WAIT(ready, ready_lock)); /* we may want to use a non-blocking wait instead of blocking */ CHECK(MUTEX_UNLOCK(ready_lock)); THREAD_JOIN(tid); async.soap_force_close_socket(); /* optional, destructor or a new connection will close the old anyway */ async.destroy(); MUTEX_CLEANUP(start_lock); MUTEX_CLEANUP(ready_lock); COND_CLEANUP(start); COND_CLEANUP(ready); return 0; } void if_error_then_die(struct soap *soap) { if (soap->error) { soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } } void *async_receiver(void *arg) { asyncProxy *async; double r; CHECK(MUTEX_LOCK(start_lock)); CHECK(COND_WAIT(start, start_lock)); async = ((asyncProxy*)arg)->copy(); CHECK(MUTEX_UNLOCK(start_lock)); if (async->recv_add(&r)) if_error_then_die(async->soap); printf("%g\n\n", r); CHECK(MUTEX_LOCK(start_lock)); CHECK(COND_WAIT(start, start_lock)); CHECK(MUTEX_UNLOCK(start_lock)); CHECK(COND_SIGNAL(ready)); if (soap_valid_socket(async->soap->socket)) { if (async->recv_mul(&r)) if_error_then_die(async->soap); printf("%g\n\n", r); } else { printf("Connection closed, server rejected keep-alive!\n"); } CHECK(MUTEX_LOCK(start_lock)); CHECK(COND_WAIT(start, start_lock)); CHECK(MUTEX_UNLOCK(start_lock)); CHECK(COND_SIGNAL(ready)); async->destroy(); delete async; return NULL; } gsoap-2.8.91/gsoap/samples/async/asyncsoap.cpp0000644000175000017500000000715113525245161020672 0ustar ellertellert/* asyncsoap.cpp Example synchronous versus asynchronous SOAP messaging without threads Compilation: $ soapcpp2 -j -C -r -wx async.h $ c++ -o asyncsoap asyncsoap.cpp stdsoap2.cpp soapC.cpp soapasyncProxy.cpp Run by starting the webserver at port 8080, then run asyncsoap: $ ../webserver/webserver 8080 & $ ./asyncsoap -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2019, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapasyncProxy.h" #include "async.nsmap" #define ENDPOINT "http://localhost:8080" #define SOAPACTION NULL void if_error_then_die(struct soap *soap); int main() { asyncProxy async; /* optionally use SOAP_IO_KEEPALIVE here to improve performance */ double a, b, r; async.soap->connect_timeout = 10; /* 10 sec connect timeout */ async.soap->transfer_timeout = 10; /* 10 second max message transfer time */ async.soap->send_timeout = 5; /* 5 second max socket recv idle time */ async.soap->recv_timeout = 5; /* 5 second max socket send idle time */ a = 2.0; b = 3.0; printf("Synchronous SOAP call:\n"); if (async.add(ENDPOINT, SOAPACTION, a, b, &r)) if_error_then_die(async.soap); printf("%g + %g = %g\n\n", a, b, r); printf("Synchronous SOAP call:\n"); if (async.mul(ENDPOINT, SOAPACTION, a, b, &r)) if_error_then_die(async.soap); printf("%g * %g = %g\n\n", a, b, r); printf("Asynchronous SOAP send & recv:\n"); if (async.send_add(ENDPOINT, SOAPACTION, a, b)) if_error_then_die(async.soap); while (soap_ready(async.soap) == SOAP_EOF) { printf("Doing some work until server is ready...\n"); usleep(10000); /* sleep 10ms */ } if_error_then_die(async.soap); if (async.recv_add(&r)) if_error_then_die(async.soap); printf("%g + %g = %g\n\n", a, b, r); printf("Asynchronous SOAP send & recv:\n"); if (async.send_mul(ENDPOINT, SOAPACTION, a, b)) if_error_then_die(async.soap); while (soap_ready(async.soap) == SOAP_EOF) { printf("Doing some work until server is ready...\n"); usleep(10000); /* sleep 10ms */ } if_error_then_die(async.soap); if (async.recv_mul(&r)) if_error_then_die(async.soap); printf("%g * %g = %g\n\n", a, b, r); async.destroy(); return 0; } void if_error_then_die(struct soap *soap) { if (soap->error) { soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } } gsoap-2.8.91/gsoap/samples/async/.deps/0000755000175000017500000000000013525245205017172 5ustar ellertellertgsoap-2.8.91/gsoap/samples/async/asyncrest.c0000644000175000017500000001126013525245161020341 0ustar ellertellert/* asyncrest.c Example synchronous versus asynchronous REST messaging without threads Compilation: $ soapcpp2 -c -CL -r -wx async.h $ cc -o asyncrest asyncrest.c stdsoap2.c soapC.c Run by starting the webserver at port 8080, then run asyncrest: $ ../webserver/webserver 8080 & $ ./asyncrest -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2019, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "async.nsmap" #define ENDPOINT "http://localhost:8080" void if_error_then_die(struct soap *soap); int main() { struct soap *soap = soap_new(); /* optionally use SOAP_IO_KEEPALIVE here to improve performance */ struct soap *soap_writer = soap_new(); /* to output to stdout and not interfere with the connected context */ struct ns__record record; soap->connect_timeout = 10; /* 10 sec connect timeout */ soap->transfer_timeout = 10; /* 10 second max message transfer time */ soap->send_timeout = 5; /* 5 second max socket recv idle time */ soap->recv_timeout = 5; /* 5 second max socket send idle time */ printf("Synchronous HTTP GET:\n"); if (soap_GET_ns__record(soap, ENDPOINT "/product?SKU=123", &record)) if_error_then_die(soap); (void)soap_write_ns__record(soap_writer, &record); printf("\n\n"); printf("Synchronous HTTP PUT:\n"); if (soap_PUT_ns__record(soap, ENDPOINT "/product", &record)) if_error_then_die(soap); printf("OK\n\n"); printf("Synchronous HTTP POST:\n"); if (soap_POST_send_ns__record(soap, ENDPOINT "/product", &record) || soap_POST_recv_ns__record(soap, &record)) if_error_then_die(soap); (void)soap_write_ns__record(soap_writer, &record); printf("\n\n"); printf("Asynchronous HTTP GET:\n"); if (soap_GET(soap, ENDPOINT "/product?SKU=123", NULL)) if_error_then_die(soap); while (soap_ready(soap) == SOAP_EOF) { printf("Doing some work until server is ready...\n"); usleep(10000); /* sleep 10ms */ } if_error_then_die(soap); if (soap_begin_recv(soap) || soap_get_ns__record(soap, &record, "ns:record", NULL) == NULL || soap_end_recv(soap) || soap_closesock(soap)) if_error_then_die(soap); (void)soap_write_ns__record(soap_writer, &record); printf("\n\n"); printf("Asynchronous HTTP PUT:\n"); if (soap_PUT(soap, ENDPOINT "/product", NULL, "text/xml") || soap_put_ns__record(soap, &record, "ns:record", NULL) || soap_end_send(soap)) if_error_then_die(soap); while (soap_ready(soap) == SOAP_EOF) { printf("Doing some work until server is ready...\n"); usleep(10000); /* sleep 10ms */ } if_error_then_die(soap); if (soap_recv_empty_response(soap)) if_error_then_die(soap); printf("OK\n\n"); printf("Asynchronous HTTP POST send & recv:\n"); if (soap_POST_send_ns__record(soap, ENDPOINT "/product", &record)) if_error_then_die(soap); while (soap_ready(soap) == SOAP_EOF) { printf("Doing some work until server is ready...\n"); usleep(10000); /* sleep 10ms */ } if_error_then_die(soap); if (soap_POST_recv_ns__record(soap, &record)) if_error_then_die(soap); (void)soap_write_ns__record(soap_writer, &record); printf("\n\n"); soap_destroy(soap_writer); soap_end(soap_writer); soap_free(soap_writer); soap_destroy(soap); soap_end(soap); soap_free(soap); return 0; } void if_error_then_die(struct soap *soap) { if (soap->error) { soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } } gsoap-2.8.91/gsoap/samples/async/Makefile.in0000644000175000017500000004767113525245204020244 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = asyncsoap$(EXEEXT) asyncrest$(EXEEXT) subdir = gsoap/samples/async ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am_asyncrest_OBJECTS = asyncrest.$(OBJEXT) $(am__objects_1) \ $(am__objects_2) asyncrest_OBJECTS = $(am_asyncrest_OBJECTS) am__DEPENDENCIES_1 = asyncrest_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am_asyncsoap_OBJECTS = asyncsoap.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) asyncsoap_OBJECTS = $(am_asyncsoap_OBJECTS) asyncsoap_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/asyncrest.Po \ ./$(DEPDIR)/asyncsoap.Po ./$(DEPDIR)/soapC.Po \ ./$(DEPDIR)/soapClient.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(asyncrest_SOURCES) $(asyncsoap_SOURCES) DIST_SOURCES = $(asyncrest_SOURCES) $(asyncsoap_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.c_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = async.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = async.nsmap asyncsoap_SOURCES = asyncsoap.c $(SOAPHEADER) $(SOAP_C_CLIENT) asyncsoap_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread asyncrest_SOURCES = asyncrest.c $(SOAPHEADER) $(SOAP_C_CORE) asyncrest_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/async/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/async/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) asyncrest$(EXEEXT): $(asyncrest_OBJECTS) $(asyncrest_DEPENDENCIES) $(EXTRA_asyncrest_DEPENDENCIES) @rm -f asyncrest$(EXEEXT) $(AM_V_CCLD)$(LINK) $(asyncrest_OBJECTS) $(asyncrest_LDADD) $(LIBS) asyncsoap$(EXEEXT): $(asyncsoap_OBJECTS) $(asyncsoap_DEPENDENCIES) $(EXTRA_asyncsoap_DEPENDENCIES) @rm -f asyncsoap$(EXEEXT) $(AM_V_CCLD)$(LINK) $(asyncsoap_OBJECTS) $(asyncsoap_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asyncrest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asyncsoap.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/asyncrest.Po -rm -f ./$(DEPDIR)/asyncsoap.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/asyncrest.Po -rm -f ./$(DEPDIR)/asyncsoap.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/async/asyncsoap2.c0000644000175000017500000001257113525245161020416 0ustar ellertellert/* asyncsoap2.c Example synchronous versus asynchronous SOAP messaging with threads Compilation: $ soapcpp2 -c -CL -r -wx async.h $ cc -o asyncsoap2 asyncsoap2.c stdsoap2.c soapC.c soapClient.c Run by starting the webserver with HTTP pipeline and keep-alive enabled at port 8080, then run asyncsoap2: $ ../webserver/webserver -ek 8080 & $ ./asyncsoap2 -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2019, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "plugin/threads.h" #include "soapH.h" #include "async.nsmap" #define ENDPOINT "http://localhost:8080" #define SOAPACTION NULL #define CHECK(op) if (op) exit(EXIT_FAILURE) void if_error_then_die(struct soap *soap); void *async_receiver(void *arg); MUTEX_TYPE start_lock; MUTEX_TYPE ready_lock; COND_TYPE start; COND_TYPE ready; int main() { THREAD_TYPE tid; struct soap *soap = soap_new(); double a, b, r; MUTEX_SETUP(start_lock); MUTEX_SETUP(ready_lock); COND_SETUP(start); COND_SETUP(ready); CHECK(THREAD_CREATEX(&tid, async_receiver, soap)); soap->connect_timeout = 10; /* 10 sec connect timeout */ soap->transfer_timeout = 10; /* 10 second max message transfer time */ soap->send_timeout = 5; /* 5 second max socket recv idle time */ soap->recv_timeout = 5; /* 5 second max socket send idle time */ a = 2.0; b = 3.0; printf("Synchronous SOAP call:\n"); if (soap_call_ns__add(soap, ENDPOINT, SOAPACTION, a, b, &r)) if_error_then_die(soap); printf("%g + %g = %g\n\n", a, b, r); printf("Synchronous SOAP call:\n"); if (soap_call_ns__mul(soap, ENDPOINT, SOAPACTION, a, b, &r)) if_error_then_die(soap); printf("%g * %g = %g\n\n", a, b, r); soap_set_mode(soap, SOAP_IO_KEEPALIVE); /* try to keep the connection alive */ printf("Asynchronous SOAP send & recv:\n"); if (soap_send_ns__add(soap, ENDPOINT, SOAPACTION, a, b)) if_error_then_die(soap); CHECK(COND_SIGNAL(start)); /* connection established, start async_receiver */ printf("Doing some work for one second...\n"); printf("%g + %g = ", a, b); sleep(1); CHECK(COND_SIGNAL(start)); CHECK(MUTEX_LOCK(ready_lock)); CHECK(COND_WAIT(ready, ready_lock)); /* we may want to use a non-blocking wait instead of blocking */ CHECK(MUTEX_UNLOCK(ready_lock)); soap_clr_mode(soap, SOAP_IO_KEEPALIVE); /* optional, to inform the server the next message is the last */ printf("Asynchronous SOAP send & recv:\n"); if (soap_send_ns__mul(soap, ENDPOINT, SOAPACTION, a, b)) if_error_then_die(soap); printf("Doing some work for one second...\n"); printf("%g * %g = ", a, b); sleep(1); CHECK(COND_SIGNAL(start)); CHECK(MUTEX_LOCK(ready_lock)); CHECK(COND_WAIT(ready, ready_lock)); /* we may want to use a non-blocking wait instead of blocking */ CHECK(MUTEX_UNLOCK(ready_lock)); THREAD_JOIN(tid); soap_force_closesock(soap); /* optional, soap_free() or a new connection will close the old anyway */ soap_destroy(soap); soap_end(soap); soap_free(soap); MUTEX_CLEANUP(start_lock); MUTEX_CLEANUP(ready_lock); COND_CLEANUP(start); COND_CLEANUP(ready); return 0; } void if_error_then_die(struct soap *soap) { if (soap->error) { soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } } void *async_receiver(void *arg) { struct soap *soap; double r; CHECK(MUTEX_LOCK(start_lock)); CHECK(COND_WAIT(start, start_lock)); soap = soap_copy((struct soap*)arg); CHECK(MUTEX_UNLOCK(start_lock)); if (soap_recv_ns__add(soap, &r)) if_error_then_die(soap); printf("%g\n\n", r); CHECK(MUTEX_LOCK(start_lock)); CHECK(COND_WAIT(start, start_lock)); CHECK(MUTEX_UNLOCK(start_lock)); CHECK(COND_SIGNAL(ready)); if (soap_valid_socket(soap->socket)) { if (soap_recv_ns__mul(soap, &r)) if_error_then_die(soap); printf("%g\n\n", r); } else { printf("Connection closed, server rejected keep-alive!\n"); } CHECK(MUTEX_LOCK(start_lock)); CHECK(COND_WAIT(start, start_lock)); CHECK(MUTEX_UNLOCK(start_lock)); CHECK(COND_SIGNAL(ready)); soap_destroy(soap); soap_end(soap); soap_free(soap); return NULL; } gsoap-2.8.91/gsoap/samples/async/asyncsoap3.cpp0000644000175000017500000001107013525245161020750 0ustar ellertellert/* asyncsoap2.cpp Example synchronous versus asynchronous pipelined SOAP messaging Compilation: $ soapcpp2 -j -C -r -wx async.h $ c++ -o asyncsoap2 asyncsoap2.cpp stdsoap2.cpp soapC.cpp soapasyncProxy.cpp Run by starting the webserver with HTTP pipeline and keep-alive enabled at port 8080, then run asyncsoap2: $ ../webserver/webserver -ek 8080 & $ ./asyncsoap2 -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2019, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "plugin/threads.h" #include "soapasyncProxy.h" #include "async.nsmap" #define ENDPOINT "http://localhost:8080" #define SOAPACTION NULL #define CHECK(op) if (op) exit(EXIT_FAILURE) void if_error_then_die(struct soap *soap); void *async_receiver(void *arg); MUTEX_TYPE start_lock; MUTEX_TYPE ready_lock; COND_TYPE start; COND_TYPE ready; int main() { THREAD_TYPE tid; asyncProxy async; /* optionally use SOAP_IO_KEEPALIVE here to improve performance */ double a, b, r; MUTEX_SETUP(start_lock); MUTEX_SETUP(ready_lock); COND_SETUP(start); COND_SETUP(ready); CHECK(THREAD_CREATEX(&tid, async_receiver, &async)); async.soap->connect_timeout = 10; /* 10 sec connect timeout */ async.soap->transfer_timeout = 10; /* 10 second max message transfer time */ async.soap->send_timeout = 5; /* 5 second max socket recv idle time */ async.soap->recv_timeout = 5; /* 5 second max socket send idle time */ a = 2.0; b = 3.0; printf("Synchronous SOAP call:\n"); if (async.add(ENDPOINT, SOAPACTION, a, b, &r)) if_error_then_die(async.soap); printf("%g + %g = %g\n\n", a, b, r); printf("Synchronous SOAP call:\n"); if (async.mul(ENDPOINT, SOAPACTION, a, b, &r)) if_error_then_die(async.soap); printf("%g * %g = %g\n\n", a, b, r); soap_set_mode(async.soap, SOAP_IO_KEEPALIVE); /* try to keep the connection alive */ printf("Asynchronous SOAP send & recv:\n"); if (async.send_add(ENDPOINT, SOAPACTION, a, b)) if_error_then_die(async.soap); CHECK(COND_SIGNAL(start)); /* connection established, start async_receiver */ /* soap_clr_mode(async.soap, SOAP_IO_KEEPALIVE); */ /* with pipelining do not cancel keep-alive */ printf("Asynchronous SOAP send & recv:\n"); if (async.send_mul(ENDPOINT, SOAPACTION, a, b)) if_error_then_die(async.soap); THREAD_JOIN(tid); async.soap_force_close_socket(); /* optional, destructor or a new connection will close the old anyway */ async.destroy(); MUTEX_CLEANUP(start_lock); MUTEX_CLEANUP(ready_lock); COND_CLEANUP(start); COND_CLEANUP(ready); return 0; } void if_error_then_die(struct soap *soap) { if (soap->error) { soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } } void *async_receiver(void *arg) { asyncProxy *async; double r; CHECK(MUTEX_LOCK(start_lock)); CHECK(COND_WAIT(start, start_lock)); async = ((asyncProxy*)arg)->copy(); CHECK(MUTEX_UNLOCK(start_lock)); if (async->recv_add(&r)) if_error_then_die(async->soap); printf("result = %g\n", r); if (soap_valid_socket(async->soap->socket)) { if (async->recv_mul(&r)) if_error_then_die(async->soap); printf("result = %g\n", r); } else { printf("Connection closed, server rejected keep-alive!\n"); } async->destroy(); delete async; return NULL; } gsoap-2.8.91/gsoap/samples/async/async.wsdl0000644000175000017500000001245313525245161020177 0ustar ellertellert Service definition of function ns__add Service definition of function ns__sub Service definition of function ns__mul Service definition of function ns__div gSOAP 2.8.91 generated service definition gsoap-2.8.91/gsoap/samples/async/asyncrest3.c0000644000175000017500000001353213525245161020430 0ustar ellertellert/* asyncrest3.c Example synchronous versus asynchronous pipelined REST messaging Compilation: $ soapcpp2 -c -CL -r -wx async.h $ cc -o asyncrest3 asyncrest3.c stdsoap2.c soapC.c Run by starting the webserver with HTTP pipeline and keep-alive enabled at port 8080, then run asyncrest3: $ ../webserver/webserver -ek 8080 & $ ./asyncrest3 -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2019, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "plugin/threads.h" #include "soapH.h" #include "async.nsmap" #define ENDPOINT "http://localhost:8080" #define CHECK(op) if (op) exit(EXIT_FAILURE) void if_error_then_die(struct soap *soap); void *async_receiver(void *arg); MUTEX_TYPE start_lock; MUTEX_TYPE ready_lock; COND_TYPE start; COND_TYPE ready; int main() { THREAD_TYPE tid; struct soap *soap = soap_new(); /* optionally use SOAP_IO_KEEPALIVE here to improve performance */ struct soap *soap_writer = soap_new(); /* to output to stdout and not interfere with the connected context */ struct ns__record record; MUTEX_SETUP(start_lock); MUTEX_SETUP(ready_lock); COND_SETUP(start); COND_SETUP(ready); CHECK(THREAD_CREATEX(&tid, async_receiver, soap)); soap->connect_timeout = 10; /* 10 sec connect timeout */ soap->transfer_timeout = 10; /* 10 second max message transfer time */ soap->send_timeout = 5; /* 5 second max socket recv idle time */ soap->recv_timeout = 5; /* 5 second max socket send idle time */ printf("Synchronous HTTP GET:\n"); if (soap_GET_ns__record(soap, ENDPOINT "/product?SKU=123", &record)) if_error_then_die(soap); (void)soap_write_ns__record(soap_writer, &record); printf("\n\n"); printf("Synchronous HTTP PUT:\n"); if (soap_PUT_ns__record(soap, ENDPOINT "/product", &record)) if_error_then_die(soap); printf("OK\n\n"); printf("Synchronous HTTP POST:\n"); if (soap_POST_send_ns__record(soap, ENDPOINT "/product", &record) || soap_POST_recv_ns__record(soap, &record)) if_error_then_die(soap); (void)soap_write_ns__record(soap_writer, &record); printf("\n\n"); soap_set_mode(soap, SOAP_IO_KEEPALIVE); /* try to keep the connection alive */ printf("Asynchronous HTTP GET:\n"); if (soap_GET(soap, ENDPOINT "/product?SKU=123", NULL)) if_error_then_die(soap); CHECK(COND_SIGNAL(start)); /* connection established, start async_receiver */ printf("Asynchronous HTTP PUT:\n"); if (soap_PUT(soap, ENDPOINT "/product", NULL, "text/xml") || soap_put_ns__record(soap, &record, "ns:record", NULL) || soap_end_send(soap)) if_error_then_die(soap); /* soap_clr_mode(soap, SOAP_IO_KEEPALIVE); */ /* with pipelining do not cancel keep-alive */ printf("Asynchronous HTTP POST send & recv:\n"); if (soap_POST_send_ns__record(soap, ENDPOINT "/product", &record)) if_error_then_die(soap); THREAD_JOIN(tid); soap_force_closesock(soap); /* optional, soap_free() or a new connection will close the old anyway */ soap_destroy(soap_writer); soap_end(soap_writer); soap_free(soap_writer); soap_destroy(soap); soap_end(soap); soap_free(soap); MUTEX_CLEANUP(start_lock); MUTEX_CLEANUP(ready_lock); COND_CLEANUP(start); COND_CLEANUP(ready); return 0; } void if_error_then_die(struct soap *soap) { if (soap->error) { soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } } void *async_receiver(void *arg) { struct soap *soap; struct soap *soap_writer = soap_new(); /* to output to stdout and not interfere with the connected context */ struct ns__record record; CHECK(MUTEX_LOCK(start_lock)); CHECK(COND_WAIT(start, start_lock)); soap = soap_copy((struct soap*)arg); CHECK(MUTEX_UNLOCK(start_lock)); if (soap_begin_recv(soap) || soap_get_ns__record(soap, &record, "ns:record", NULL) == NULL || soap_end_recv(soap) || soap_closesock(soap)) if_error_then_die(soap); (void)soap_write_ns__record(soap_writer, &record); printf("\n\n"); if (soap_valid_socket(soap->socket)) { if (soap_recv_empty_response(soap)) if_error_then_die(soap); printf("OK\n\n"); } else { printf("Connection closed, server rejected keep-alive!\n"); } if (soap_valid_socket(soap->socket)) { if (soap_POST_recv_ns__record(soap, &record)) if_error_then_die(soap); (void)soap_write_ns__record(soap_writer, &record); printf("\n\n"); } else { printf("Connection closed, server rejected keep-alive!\n"); } soap_destroy(soap_writer); soap_end(soap_writer); soap_free(soap_writer); soap_destroy(soap); soap_end(soap); soap_free(soap); return NULL; } gsoap-2.8.91/gsoap/samples/async/asyncrest.cpp0000644000175000017500000001126613525245161020707 0ustar ellertellert/* asyncrest.cpp Example synchronous versus asynchronous REST messaging without threads Compilation: $ soapcpp2 -CL -r -wx async.h $ c++ -o asyncrest asyncrest.cpp stdsoap2.cpp soapC.cpp Run by starting the webserver at port 8080, then run asyncrest: $ ../webserver/webserver 8080 & $ ./asyncrest -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2019, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "async.nsmap" #define ENDPOINT "http://localhost:8080" void if_error_then_die(struct soap *soap); int main() { struct soap *soap = soap_new(); /* optionally use SOAP_IO_KEEPALIVE here to improve performance */ struct soap *soap_writer = soap_new(); /* to output to stdout and not interfere with the connected context */ struct ns__record record; soap->connect_timeout = 10; /* 10 sec connect timeout */ soap->transfer_timeout = 10; /* 10 second max message transfer time */ soap->send_timeout = 5; /* 5 second max socket recv idle time */ soap->recv_timeout = 5; /* 5 second max socket send idle time */ printf("Synchronous HTTP GET:\n"); if (soap_GET_ns__record(soap, ENDPOINT "/product?SKU=123", &record)) if_error_then_die(soap); (void)soap_write_ns__record(soap_writer, &record); printf("\n\n"); printf("Synchronous HTTP PUT:\n"); if (soap_PUT_ns__record(soap, ENDPOINT "/product", &record)) if_error_then_die(soap); printf("OK\n\n"); printf("Synchronous HTTP POST:\n"); if (soap_POST_send_ns__record(soap, ENDPOINT "/product", &record) || soap_POST_recv_ns__record(soap, &record)) if_error_then_die(soap); (void)soap_write_ns__record(soap_writer, &record); printf("\n\n"); printf("Asynchronous HTTP GET:\n"); if (soap_GET(soap, ENDPOINT "/product?SKU=123", NULL)) if_error_then_die(soap); while (soap_ready(soap) == SOAP_EOF) { printf("Doing some work until server is ready...\n"); usleep(10000); /* sleep 10ms */ } if_error_then_die(soap); if (soap_begin_recv(soap) || soap_get_ns__record(soap, &record, "ns:record", NULL) == NULL || soap_end_recv(soap) || soap_closesock(soap)) if_error_then_die(soap); (void)soap_write_ns__record(soap_writer, &record); printf("\n\n"); printf("Asynchronous HTTP PUT:\n"); if (soap_PUT(soap, ENDPOINT "/product", NULL, "text/xml") || soap_put_ns__record(soap, &record, "ns:record", NULL) || soap_end_send(soap)) if_error_then_die(soap); while (soap_ready(soap) == SOAP_EOF) { printf("Doing some work until server is ready...\n"); usleep(10000); /* sleep 10ms */ } if_error_then_die(soap); if (soap_recv_empty_response(soap)) if_error_then_die(soap); printf("OK\n\n"); printf("Asynchronous HTTP POST send & recv:\n"); if (soap_POST_send_ns__record(soap, ENDPOINT "/product", &record)) if_error_then_die(soap); while (soap_ready(soap) == SOAP_EOF) { printf("Doing some work until server is ready...\n"); usleep(10000); /* sleep 10ms */ } if_error_then_die(soap); if (soap_POST_recv_ns__record(soap, &record)) if_error_then_die(soap); (void)soap_write_ns__record(soap_writer, &record); printf("\n\n"); soap_destroy(soap_writer); soap_end(soap_writer); soap_free(soap_writer); soap_destroy(soap); soap_end(soap); soap_free(soap); return 0; } void if_error_then_die(struct soap *soap) { if (soap->error) { soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } } gsoap-2.8.91/gsoap/samples/async/README.txt0000644000175000017500000001414713525245161017667 0ustar ellertellertSimple examples illustrating asynchronous messaging with SOAP and REST. The SOAP examples are a calculator web service and invoke 'add' and 'mul' service operations. The REST examples use GET, PUT, and POST of and XML record to the REST server. The web server used by these examples is the gSOAP demo web server located in gsoap/samples/webserver, which should be build to run the examples. The gSOAP webserver optionally uses the httppipe HTTP pipelining plugin to support HTTP pipelining. Examples: - asyncsoap.c C example SOAP asynchronous messaging with one thread - asyncsoap.cpp C++ example SOAP asynchronous messaging with one thread - asyncrest.c C example REST asynchronous messaging with one thread - asyncrest.cpp C++ example REST asynchronous messaging with one thread - asyncsoap2.c C example SOAP asynchronous messaging with threads - asyncsoap2.cpp C++ example SOAP asynchronous messaging with threads - asyncrest2.c C example REST asynchronous messaging with threads - asyncrest2.cpp C++ example REST asynchronous messaging with threads - asyncsoap3.c C example SOAP asynchronous pipelined messaging with threads - asyncsoap3.cpp C++ example SOAP asynchronous pipelined messaging with threads - asyncrest3.c C example REST asynchronous pipelined messaging with threads - asyncrest3.cpp C++ example REST asynchronous pipelined messaging with threads To build the C examples: $ soapcpp2 -c -CL -r -wx async.h $ cc -I. -I../.. -I../../plugin -o asyncsoap asyncsoap.c ../../stdsoap2.c soapC.c soapClient.c $ cc -I. -I../.. -I../../plugin -o asyncrest asyncsoap.c ../../stdsoap2.c soapC.c $ cc -I. -I../.. -I../../plugin -o asyncsoap2 asyncsoap2.c ../../stdsoap2.c soapC.c soapClient.c ../../plugin/threads.c $ cc -I. -I../.. -I../../plugin -o asyncrest2 asyncsoap2.c ../../stdsoap2.c soapC.c threads.c ../../plugin/threads.c $ cc -I. -I../.. -I../../plugin -o asyncsoap3 asyncsoap3.c ../../stdsoap2.c soapC.c soapClient.c ../../plugin/threads.c $ cc -I. -I../.. -I../../plugin -o asyncrest3 asyncsoap3.c ../../stdsoap2.c soapC.c threads.c ../../plugin/threads.c To build the C++ examples: $ soapcpp2 -j -CL -r -wx async.h $ c++ -I. -I../.. -I../../plugin -o asyncsoap++ asyncsoap.cpp ../../stdsoap2.cpp soapC.cpp soapasyncProxy.cpp $ -I. -I../.. -I../../plugin c++ -o asyncrest++ asyncrest.cpp ../../stdsoap2.cpp soapC.cpp $ c++ -I. -I../.. -I../../plugin -o asyncsoap2++ asyncsoap2.cpp ../../stdsoap2.cpp soapC.cpp soapasyncProxy.cpp ../../plugin/threads.c $ -I. -I../.. -I../../plugin c++ -o asyncrest2++ asyncrest2.cpp ../../stdsoap2.cpp soapC.cpp ../../plugin/threads.c $ c++ -I. -I../.. -I../../plugin -o asyncsoap3++ asyncsoap3.cpp ../../stdsoap2.cpp soapC.cpp soapasyncProxy.cpp ../../plugin/threads.c $ -I. -I../.. -I../../plugin c++ -o asyncrest3++ asyncrest3.cpp ../../stdsoap2.cpp soapC.cpp ../../plugin/threads.c See also the build instructions in the C/C++ source code of the examples. Start the webserver at port 8080, then run and example such as asyncsoap: $ ../webserver/webserver -e -k 8080 & $ ./asyncsoap Where webserver options -e and -k enable pipelining and keep-alive, respectively. Non-pipelined asynchronous messaging splits the sending operation from the receive operation. Sends should be paired with receives, meaning that no other send should occur on the same connection before the response is received. A connection may or may not be persistent, though the examples with threads require persistence to allow the receiving thread to receive responses over the single HTTP keep-alive connection. By contrast, HTTP pipelining allows multiple sends to be followed by multiple receives over a persistent connection, i.e. with HTTP keep-alive enabled. HTTP pipelining requires at least two threads, one for sending and one for receiving. HTTP servers may not implement HTTP pipelining that is required to handle multiple requests messages. HTTP pipelining may boost performance, though it is not widely supported and the performance gains are generally known to dissapoint. HTTP pipelining on the server side is easy with gSOAP, just add: #include "plugin/httppipe.h" struct soap *soap = soap_new1(SOAP_IO_KEEPALIVE); // keep-alive required soap_register_plugin(soap, httppipe); // register The gsoap/samples/webserver/webserver can be started with HTTP pipelining enabled, say on port 8080 with options -e (pipeline) and -k (keepalive) as follows: $ ../webserver/webserver -e -k 8080 Implementing HTTP pipelining correctly on the client side requires threads and logic to deal with failed requests and responses. Using only one thread may cause significant message blocking issues or even deadlock with infinite IO timeouts: Client Server send req1 --------> recv req1 send req2 ---> processing waiting <--- send res1 waiting waiting : : send req1 failed send res1 failed Using two client threads T1 and T2 end orks: Client T1 Client T2 Server send req1 --------------------------------> recv req1 send req2 ---> waiting processing waiting \ recv res1 <------------ send res1 waiting ---------------------------> recv req2 waiting waiting processing waiting recv res2 <------------ send res2 done done When the client thread T2 does not receive one or more responses from the server it may be caused by the lack of HTTP pipeline support by the server or by a transmission error. In either case the client thread T1 should resend the message. Such a send-resend scheme requires messaging to be "idempotent", meaning that the server state does not matter. HTTP GET, HEAD, PUT, and DELETE are idempotent but HTTP POST is not. However, HTTP POST can be made idempotent if the POST message contents do not depend on the server state, which is typical for SOAP/XML Web services that commonly use POST message exchanges. In general, be forewarned that if any of the messages depend on the server state then HTTP pipelining is a bad idea. gsoap-2.8.91/gsoap/samples/async/async.h0000644000175000017500000000102413525245161017445 0ustar ellertellert//gsoap ns service name: async //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl //gsoap ns service location: http://localhost:8080 //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns schema namespace: urn:calc int ns__add(double a, double b, double *result); int ns__sub(double a, double b, double *result); int ns__mul(double a, double b, double *result); int ns__div(double a, double b, double *result); struct ns__record { int SKU; char *product_name; int in_store; }; gsoap-2.8.91/gsoap/samples/async/asyncsoap3.c0000644000175000017500000001102713525245161020412 0ustar ellertellert/* asyncsoap3.c Example synchronous versus asynchronous pipelined SOAP messaging Compilation: $ soapcpp2 -c -CL -r -wx async.h $ cc -o asyncsoap3 asyncsoap2.c stdsoap2.c soapC.c soapClient.c Run by starting the webserver with HTTP pipeline and keep-alive enabled at port 8080, then run asyncsoap3: $ ../webserver/webserver -ek 8080 & $ ./asyncsoap3 -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2019, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "plugin/threads.h" #include "soapH.h" #include "async.nsmap" #define ENDPOINT "http://localhost:8080" #define SOAPACTION NULL #define CHECK(op) if (op) exit(EXIT_FAILURE) void if_error_then_die(struct soap *soap); void *async_receiver(void *arg); MUTEX_TYPE start_lock; MUTEX_TYPE ready_lock; COND_TYPE start; COND_TYPE ready; int main() { THREAD_TYPE tid; struct soap *soap = soap_new(); double a, b, r; MUTEX_SETUP(start_lock); MUTEX_SETUP(ready_lock); COND_SETUP(start); COND_SETUP(ready); CHECK(THREAD_CREATEX(&tid, async_receiver, soap)); soap->connect_timeout = 10; /* 10 sec connect timeout */ soap->transfer_timeout = 10; /* 10 second max message transfer time */ soap->send_timeout = 5; /* 5 second max socket recv idle time */ soap->recv_timeout = 5; /* 5 second max socket send idle time */ a = 2.0; b = 3.0; printf("Synchronous SOAP call:\n"); if (soap_call_ns__add(soap, ENDPOINT, SOAPACTION, a, b, &r)) if_error_then_die(soap); printf("%g + %g = %g\n\n", a, b, r); printf("Synchronous SOAP call:\n"); if (soap_call_ns__mul(soap, ENDPOINT, SOAPACTION, a, b, &r)) if_error_then_die(soap); printf("%g * %g = %g\n\n", a, b, r); soap_set_mode(soap, SOAP_IO_KEEPALIVE); /* try to keep the connection alive */ printf("Asynchronous SOAP send & recv:\n"); if (soap_send_ns__add(soap, ENDPOINT, SOAPACTION, a, b)) if_error_then_die(soap); CHECK(COND_SIGNAL(start)); /* connection established, start async_receiver */ /* soap_clr_mode(soap, SOAP_IO_KEEPALIVE); */ /* with pipelining do not cancel keep-alive */ printf("Asynchronous SOAP send & recv:\n"); if (soap_send_ns__mul(soap, ENDPOINT, SOAPACTION, a, b)) if_error_then_die(soap); THREAD_JOIN(tid); soap_force_closesock(soap); /* optional, soap_free() or a new connection will close the old anyway */ soap_destroy(soap); soap_end(soap); soap_free(soap); MUTEX_CLEANUP(start_lock); MUTEX_CLEANUP(ready_lock); COND_CLEANUP(start); COND_CLEANUP(ready); return 0; } void if_error_then_die(struct soap *soap) { if (soap->error) { soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } } void *async_receiver(void *arg) { struct soap *soap; double r; CHECK(MUTEX_LOCK(start_lock)); CHECK(COND_WAIT(start, start_lock)); soap = soap_copy((struct soap*)arg); CHECK(MUTEX_UNLOCK(start_lock)); if (soap_recv_ns__add(soap, &r)) if_error_then_die(soap); printf("result = %g\n", r); if (soap_valid_socket(soap->socket)) { if (soap_recv_ns__mul(soap, &r)) if_error_then_die(soap); printf("result = %g\n", r); } else { printf("Connection closed, server rejected keep-alive!\n"); } soap_destroy(soap); soap_end(soap); soap_free(soap); return NULL; } gsoap-2.8.91/gsoap/samples/async/asyncrest2.c0000644000175000017500000001604013525245161020424 0ustar ellertellert/* asyncrest2.c Example synchronous versus asynchronous REST messaging with threads Compilation: $ soapcpp2 -c -CL -r -wx async.h $ cc -o asyncrest2 asyncrest2.c stdsoap2.c soapC.c Run by starting the webserver with HTTP pipeline and keep-alive enabled at port 8080, then run asyncrest2: $ ../webserver/webserver -ek 8080 & $ ./asyncrest2 -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2019, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "plugin/threads.h" #include "soapH.h" #include "async.nsmap" #define ENDPOINT "http://localhost:8080" #define CHECK(op) if (op) exit(EXIT_FAILURE) void if_error_then_die(struct soap *soap); void *async_receiver(void *arg); MUTEX_TYPE start_lock; MUTEX_TYPE ready_lock; COND_TYPE start; COND_TYPE ready; int main() { THREAD_TYPE tid; struct soap *soap = soap_new(); /* optionally use SOAP_IO_KEEPALIVE here to improve performance */ struct soap *soap_writer = soap_new(); /* to output to stdout and not interfere with the connected context */ struct ns__record record; MUTEX_SETUP(start_lock); MUTEX_SETUP(ready_lock); COND_SETUP(start); COND_SETUP(ready); CHECK(THREAD_CREATEX(&tid, async_receiver, soap)); soap->connect_timeout = 10; /* 10 sec connect timeout */ soap->transfer_timeout = 10; /* 10 second max message transfer time */ soap->send_timeout = 5; /* 5 second max socket recv idle time */ soap->recv_timeout = 5; /* 5 second max socket send idle time */ printf("Synchronous HTTP GET:\n"); if (soap_GET_ns__record(soap, ENDPOINT "/product?SKU=123", &record)) if_error_then_die(soap); (void)soap_write_ns__record(soap_writer, &record); printf("\n\n"); printf("Synchronous HTTP PUT:\n"); if (soap_PUT_ns__record(soap, ENDPOINT "/product", &record)) if_error_then_die(soap); printf("OK\n\n"); printf("Synchronous HTTP POST:\n"); if (soap_POST_send_ns__record(soap, ENDPOINT "/product", &record) || soap_POST_recv_ns__record(soap, &record)) if_error_then_die(soap); (void)soap_write_ns__record(soap_writer, &record); printf("\n\n"); soap_set_mode(soap, SOAP_IO_KEEPALIVE); /* try to keep the connection alive */ printf("Asynchronous HTTP GET:\n"); if (soap_GET(soap, ENDPOINT "/product?SKU=123", NULL)) if_error_then_die(soap); CHECK(COND_SIGNAL(start)); /* connection established, start async_receiver */ printf("Doing some work for one second...\n"); sleep(1); CHECK(COND_SIGNAL(start)); CHECK(MUTEX_LOCK(ready_lock)); CHECK(COND_WAIT(ready, ready_lock)); /* we may want to use a non-blocking wait instead of blocking */ CHECK(MUTEX_UNLOCK(ready_lock)); printf("Asynchronous HTTP PUT:\n"); if (soap_PUT(soap, ENDPOINT "/product", NULL, "text/xml") || soap_put_ns__record(soap, &record, "ns:record", NULL) || soap_end_send(soap)) if_error_then_die(soap); printf("Doing some work for one second...\n"); sleep(1); CHECK(COND_SIGNAL(start)); CHECK(MUTEX_LOCK(ready_lock)); CHECK(COND_WAIT(ready, ready_lock)); /* we may want to use a non-blocking wait instead of blocking */ CHECK(MUTEX_UNLOCK(ready_lock)); soap_clr_mode(soap, SOAP_IO_KEEPALIVE); /* optional, to inform the server the next message is the last */ printf("Asynchronous HTTP POST send & recv:\n"); if (soap_POST_send_ns__record(soap, ENDPOINT "/product", &record)) if_error_then_die(soap); printf("Doing some work for one second...\n"); sleep(1); CHECK(COND_SIGNAL(start)); CHECK(MUTEX_LOCK(ready_lock)); CHECK(COND_WAIT(ready, ready_lock)); /* we may want to use a non-blocking wait instead of blocking */ CHECK(MUTEX_UNLOCK(ready_lock)); THREAD_JOIN(tid); soap_force_closesock(soap); /* optional, soap_free() or a new connection will close the old anyway */ soap_destroy(soap_writer); soap_end(soap_writer); soap_free(soap_writer) soap_destroy(soap); soap_end(soap); soap_free(soap); MUTEX_CLEANUP(start_lock); MUTEX_CLEANUP(ready_lock); COND_CLEANUP(start); COND_CLEANUP(ready); return 0; } void if_error_then_die(struct soap *soap) { if (soap->error) { soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } } void *async_receiver(void *arg) { struct soap *soap; struct soap *soap_writer = soap_new(); /* to output to stdout and not interfere with the connected context */ struct ns__record record; CHECK(MUTEX_LOCK(start_lock)); CHECK(COND_WAIT(start, start_lock)); soap = soap_copy((struct soap*)arg); CHECK(MUTEX_UNLOCK(start_lock)); if (soap_begin_recv(soap) || soap_get_ns__record(soap, &record, "ns:record", NULL) == NULL || soap_end_recv(soap) || soap_closesock(soap)) if_error_then_die(soap); (void)soap_write_ns__record(soap_writer, &record); printf("\n\n"); CHECK(MUTEX_LOCK(start_lock)); CHECK(COND_WAIT(start, start_lock)); CHECK(MUTEX_UNLOCK(start_lock)); CHECK(COND_SIGNAL(ready)); if (soap_valid_socket(soap->socket)) { if (soap_recv_empty_response(soap)) if_error_then_die(soap); printf("OK\n\n"); } else { printf("Connection closed, server rejected keep-alive!\n"); } CHECK(MUTEX_LOCK(start_lock)); CHECK(COND_WAIT(start, start_lock)); CHECK(MUTEX_UNLOCK(start_lock)); CHECK(COND_SIGNAL(ready)); if (soap_valid_socket(soap->socket)) { if (soap_POST_recv_ns__record(soap, &record)) if_error_then_die(soap); (void)soap_write_ns__record(soap_writer, &record); printf("\n\n"); } else { printf("Connection closed, server rejected keep-alive!\n"); } CHECK(MUTEX_LOCK(start_lock)); CHECK(COND_WAIT(start, start_lock)); CHECK(MUTEX_UNLOCK(start_lock)); CHECK(COND_SIGNAL(ready)); soap_destroy(soap_writer); soap_end(soap_writer); soap_free(soap_writer); soap_destroy(soap); soap_end(soap); soap_free(soap); return NULL; } gsoap-2.8.91/gsoap/samples/async/asyncsoap.c0000644000175000017500000000716413525245161020336 0ustar ellertellert/* asyncsoap.c Example synchronous versus asynchronous SOAP messaging without threads Compilation: $ soapcpp2 -c -CL -r -wx async.h $ cc -o asyncsoap asyncsoap.c stdsoap2.c soapC.c soapClient.c Run by starting the webserver at port 8080, then run asyncsoap: $ ../webserver/webserver 8080 & $ ./asyncsoap -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2019, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "async.nsmap" #define ENDPOINT "http://localhost:8080" #define SOAPACTION NULL void if_error_then_die(struct soap *soap); int main() { struct soap *soap = soap_new(); /* optionally use SOAP_IO_KEEPALIVE here to improve performance */ double a, b, r; soap->connect_timeout = 10; /* 10 sec connect timeout */ soap->transfer_timeout = 10; /* 10 second max message transfer time */ soap->send_timeout = 5; /* 5 second max socket recv idle time */ soap->recv_timeout = 5; /* 5 second max socket send idle time */ a = 2.0; b = 3.0; printf("Synchronous SOAP call:\n"); if (soap_call_ns__add(soap, ENDPOINT, SOAPACTION, a, b, &r)) if_error_then_die(soap); printf("%g + %g = %g\n\n", a, b, r); printf("Synchronous SOAP call:\n"); if (soap_call_ns__mul(soap, ENDPOINT, SOAPACTION, a, b, &r)) if_error_then_die(soap); printf("%g * %g = %g\n\n", a, b, r); printf("Asynchronous SOAP send & recv:\n"); if (soap_send_ns__add(soap, ENDPOINT, SOAPACTION, a, b)) if_error_then_die(soap); while (soap_ready(soap) == SOAP_EOF) { printf("Doing some work until server is ready...\n"); usleep(10000); /* sleep 10ms */ } if_error_then_die(soap); if (soap_recv_ns__add(soap, &r)) if_error_then_die(soap); printf("%g + %g = %g\n\n", a, b, r); printf("Asynchronous SOAP send & recv:\n"); if (soap_send_ns__mul(soap, ENDPOINT, SOAPACTION, a, b)) if_error_then_die(soap); while (soap_ready(soap) == SOAP_EOF) { printf("Doing some work until server is ready...\n"); usleep(10000); /* sleep 10ms */ } if_error_then_die(soap); if (soap_recv_ns__mul(soap, &r)) if_error_then_die(soap); printf("%g * %g = %g\n\n", a, b, r); soap_destroy(soap); soap_end(soap); soap_free(soap); return 0; } void if_error_then_die(struct soap *soap) { if (soap->error) { soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } } gsoap-2.8.91/gsoap/samples/async/Makefile.am0000644000175000017500000000116713525245161020223 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = asyncsoap asyncrest SOAPHEADER = async.h include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = async.nsmap asyncsoap_SOURCES = asyncsoap.c $(SOAPHEADER) $(SOAP_C_CLIENT) asyncsoap_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread asyncrest_SOURCES = asyncrest.c $(SOAPHEADER) $(SOAP_C_CORE) asyncrest_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread gsoap-2.8.91/gsoap/samples/async/asyncrest3.cpp0000644000175000017500000001353613525245161020774 0ustar ellertellert/* asyncrest2.cpp Example synchronous versus asynchronous pipelined REST messaging Compilation: $ soapcpp2 -CL -r -wx async.h $ c++ -o asyncrest2 asyncrest2.cpp stdsoap2.cpp soapC.cpp Run by starting the webserver with HTTP pipeline and keep-alive enabled at port 8080, then run asyncrest:s $ ../webserver/webserver -ek 8080 & $ ./asyncrest2 -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2019, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "plugin/threads.h" #include "soapH.h" #include "async.nsmap" #define ENDPOINT "http://localhost:8080" #define CHECK(op) if (op) exit(EXIT_FAILURE) void if_error_then_die(struct soap *soap); void *async_receiver(void *arg); MUTEX_TYPE start_lock; MUTEX_TYPE ready_lock; COND_TYPE start; COND_TYPE ready; int main() { THREAD_TYPE tid; struct soap *soap = soap_new(); /* optionally use SOAP_IO_KEEPALIVE here to improve performance */ struct soap *soap_writer = soap_new(); /* to output to stdout and not interfere with the connected context */ struct ns__record record; MUTEX_SETUP(start_lock); MUTEX_SETUP(ready_lock); COND_SETUP(start); COND_SETUP(ready); CHECK(THREAD_CREATEX(&tid, async_receiver, soap)); soap->connect_timeout = 10; /* 10 sec connect timeout */ soap->transfer_timeout = 10; /* 10 second max message transfer time */ soap->send_timeout = 5; /* 5 second max socket recv idle time */ soap->recv_timeout = 5; /* 5 second max socket send idle time */ printf("Synchronous HTTP GET:\n"); if (soap_GET_ns__record(soap, ENDPOINT "/product?SKU=123", &record)) if_error_then_die(soap); (void)soap_write_ns__record(soap_writer, &record); printf("\n\n"); printf("Synchronous HTTP PUT:\n"); if (soap_PUT_ns__record(soap, ENDPOINT "/product", &record)) if_error_then_die(soap); printf("OK\n\n"); printf("Synchronous HTTP POST:\n"); if (soap_POST_send_ns__record(soap, ENDPOINT "/product", &record) || soap_POST_recv_ns__record(soap, &record)) if_error_then_die(soap); (void)soap_write_ns__record(soap_writer, &record); printf("\n\n"); soap_set_mode(soap, SOAP_IO_KEEPALIVE); /* try to keep the connection alive */ printf("Asynchronous HTTP GET:\n"); if (soap_GET(soap, ENDPOINT "/product?SKU=123", NULL)) if_error_then_die(soap); CHECK(COND_SIGNAL(start)); /* connection established, start async_receiver */ printf("Asynchronous HTTP PUT:\n"); if (soap_PUT(soap, ENDPOINT "/product", NULL, "text/xml") || soap_put_ns__record(soap, &record, "ns:record", NULL) || soap_end_send(soap)) if_error_then_die(soap); /* soap_clr_mode(soap, SOAP_IO_KEEPALIVE); */ /* with pipelining do not cancel keep-alive */ printf("Asynchronous HTTP POST send & recv:\n"); if (soap_POST_send_ns__record(soap, ENDPOINT "/product", &record)) if_error_then_die(soap); THREAD_JOIN(tid); soap_force_closesock(soap); /* optional, soap_free() or a new connection will close the old anyway */ soap_destroy(soap_writer); soap_end(soap_writer); soap_free(soap_writer); soap_destroy(soap); soap_end(soap); soap_free(soap); MUTEX_CLEANUP(start_lock); MUTEX_CLEANUP(ready_lock); COND_CLEANUP(start); COND_CLEANUP(ready); return 0; } void if_error_then_die(struct soap *soap) { if (soap->error) { soap_print_fault(soap, stderr); exit(EXIT_FAILURE); } } void *async_receiver(void *arg) { struct soap *soap; struct soap *soap_writer = soap_new(); /* to output to stdout and not interfere with the connected context */ struct ns__record record; CHECK(MUTEX_LOCK(start_lock)); CHECK(COND_WAIT(start, start_lock)); soap = soap_copy((struct soap*)arg); CHECK(MUTEX_UNLOCK(start_lock)); if (soap_begin_recv(soap) || soap_get_ns__record(soap, &record, "ns:record", NULL) == NULL || soap_end_recv(soap) || soap_closesock(soap)) if_error_then_die(soap); (void)soap_write_ns__record(soap_writer, &record); printf("\n\n"); if (soap_valid_socket(soap->socket)) { if (soap_recv_empty_response(soap)) if_error_then_die(soap); printf("OK\n\n"); } else { printf("Connection closed, server rejected keep-alive!\n"); } if (soap_valid_socket(soap->socket)) { if (soap_POST_recv_ns__record(soap, &record)) if_error_then_die(soap); (void)soap_write_ns__record(soap_writer, &record); printf("\n\n"); } else { printf("Connection closed, server rejected keep-alive!\n"); } soap_destroy(soap_writer); soap_end(soap_writer); soap_free(soap_writer); soap_destroy(soap); soap_end(soap); soap_free(soap); return NULL; } gsoap-2.8.91/gsoap/samples/mtom-stream/0000755000175000017500000000000013525245200017304 5ustar ellertellertgsoap-2.8.91/gsoap/samples/mtom-stream/.deps/0000755000175000017500000000000013525245200020315 5ustar ellertellertgsoap-2.8.91/gsoap/samples/mtom-stream/Makefile.in0000644000175000017500000004714613525245163021375 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = mtom-stream$(EXEEXT) subdir = gsoap/samples/mtom-stream ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am__objects_4 = $(am__objects_3) soapServer.$(OBJEXT) $(am__objects_1) \ $(am__objects_1) am_mtom_stream_OBJECTS = mtom-stream-test.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) mtom_stream_OBJECTS = $(am_mtom_stream_OBJECTS) am__DEPENDENCIES_1 = mtom_stream_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/mtom-stream-test.Po \ ./$(DEPDIR)/soapC.Po ./$(DEPDIR)/soapClient.Po \ ./$(DEPDIR)/soapServer.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(mtom_stream_SOURCES) DIST_SOURCES = $(mtom_stream_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.c_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = mtom-stream-test.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = mtom_stream_test.nsmap mtom_stream_test.wsdl mtom_stream_SOURCES = mtom-stream-test.c $(SOAPHEADER) $(SOAP_C_SRC) mtom_stream_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/mtom-stream/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/mtom-stream/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) mtom-stream$(EXEEXT): $(mtom_stream_OBJECTS) $(mtom_stream_DEPENDENCIES) $(EXTRA_mtom_stream_DEPENDENCIES) @rm -f mtom-stream$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mtom_stream_OBJECTS) $(mtom_stream_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mtom-stream-test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/mtom-stream-test.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/mtom-stream-test.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/mtom-stream/mtom-stream-test.h0000644000175000017500000000675513525245163022724 0ustar ellertellert/* mtom-stream-test.h Example streaming MTOM client and server. Copyright (C) 2000-2006 Robert A. van Engelen, Genivia, Inc. All Rights Reserved. Usage (CGI server): Install as CGI application, e.g. under cgi-bin Usage (server): mtom-stream-test 8085 & Starts a server on your host at port 8085. Usage (client): mtom-stream-test -p file1 file2 file3 ... Stores files file1, file2, etc. at the server side. The server saves them locally under a key. The storage keys are printed at the client side. The keys provide access to the data using option -g (get). mtom-stream-test -g name1 name2 name3 ... Retrieves files stored under keys name1, name2, etc. The keys must correspond to the keys returned when storing files. Files are stored by the server locally under the key name. Unix/Linux: add a sigpipe handler to avoid broken pipes. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #import "soap12.h" #import "xop.h" #import "xmime5.h" //gsoap m service name: mtom_stream_test //gsoap m service namespace: http://www.genivia.com/wsdl/mtom_stream_test.wsdl //gsoap x schema namespace: http://www.genivia.com/schemas/mtom_stream_test.xsd //gsoap x schema elementForm: qualified //gsoap x schema type-documentation: Data holds a MIME attachment struct x__Data { _xop__Include xop__Include; @char *xmime5__contentType; }; //gsoap x schema type-documentation: DataSet holds a set of MIME attachments struct x__DataSet { int __size; struct x__Data *item; }; //gsoap x schema type-documentation: Keys holds a set of strings to access the data collection at the server side struct x__Keys { int __size; char **key; }; //gsoap m service method-mime-type: PutData */* //gsoap m service method-documentation: PutData stores a data set at the server side and returns a set of unique keys to access that data int m__PutData( struct x__DataSet *x__data, struct m__PutDataResponse { struct x__Keys x__keys; }* ); //gsoap m service method-mime-type: GetData */* //gsoap m service method-documentation: GetData gets a set of data items from the server given a set of keys int m__GetData( struct x__Keys *x__keys, struct m__GetDataResponse { struct x__DataSet x__data; }* ); gsoap-2.8.91/gsoap/samples/mtom-stream/README.txt0000644000175000017500000000154313525245163021015 0ustar ellertellertMTOM attachment streaming processing example. This application is a server and client to demonstrate MTOM attachment handling. Usage (CGI server): Install as CGI application, e.g. under cgi-bin Usage (stand-alone server): $ mtom-stream-test 8085 & Starts a server on your host at port 8085. Usage (client): $ mtom-stream-test -p file1 file2 file3 ... Stores files file1, file2, etc. at the server side. The server saves them locally under a key. The storage keys are printed at the client side. The keys provide access to the data using option -g (get). $ mtom-stream-test -g name1 name2 name3 ... Retrieves files stored under keys name1, name2, etc. The keys must correspond to the keys returned when storing files. Files are stored by the server locally under the key name. gsoap-2.8.91/gsoap/samples/mtom-stream/Makefile.am0000644000175000017500000000104713525245163021352 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = mtom-stream SOAPHEADER = mtom-stream-test.h include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = mtom_stream_test.nsmap mtom_stream_test.wsdl mtom_stream_SOURCES = mtom-stream-test.c $(SOAPHEADER) $(SOAP_C_SRC) mtom_stream_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread gsoap-2.8.91/gsoap/samples/mtom-stream/mtom-stream-test.c0000644000175000017500000005017513525245163022712 0ustar ellertellert/* mtom-stream-test.c Example streaming MTOM client and server. Copyright (C) 2000-2006 Robert A. van Engelen, Genivia, Inc. All Rights Reserved. Usage (server): mtom-stream-test 8085 & Starts a server on your local host at port 8085. Usage (client): mtom-stream-test -p file1 file2 file3 ... Stores files file1, file2, etc. at the server side. The server saves them locally under a key. The storage keys are printed at the client side. The keys provide access to the data using option -g (get). The server saves files in its current directory, or the directory specified by the TMPDIR environment variable. mtom-stream-test -g name1 name2 name3 ... Retrieves files stored under keys name1, name2, etc. The keys must correspond to the keys returned when storing files. Files are stored by the server locally under the key name. Unix/Linux: add a sigpipe handler to avoid broken pipes. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "mtom_stream_test.nsmap" #if defined(_POSIX_THREADS) || defined(_SC_THREADS) #include #endif #include /******************************************************************************\ * * Default endpoint * \******************************************************************************/ const char *endpoint = "http://localhost:8085"; /******************************************************************************\ * * Server-Side Location to Store Files (Changed by TMPDIR env var) * \******************************************************************************/ const char *TMPDIR = "."; /******************************************************************************\ * * Server-Side Streaming MIME Handler for Saving File Data Under Keys * \******************************************************************************/ struct mime_server_handle { char *key; /* file name */ FILE *fd; /* file fd */ }; /******************************************************************************\ * * Forward Declarations * \******************************************************************************/ int cgi_server(); int run_server(int port); int run_client(int, char**); int open_data(struct soap *soap, const char *file, struct x__Data *data); int client_putData(struct soap *soap, int argc, char **argv); int client_getData(struct soap *soap, int argc, char **argv); void *mime_read_open(struct soap*, void*, const char*, const char*, const char*); void mime_read_close(struct soap*, void*); size_t mime_read(struct soap*, void*, char*, size_t); void *mime_server_write_open(struct soap *soap, void *handle, const char *id, const char *type, const char *description, enum soap_mime_encoding encoding); void mime_server_write_close(struct soap *soap, void *handle); int mime_server_write(struct soap *soap, void *handle, const char *buf, size_t len); void *mime_client_write_open(struct soap *soap, void *handle, const char *id, const char *type, const char *description, enum soap_mime_encoding encoding); void mime_client_write_close(struct soap *soap, void *handle); int mime_client_write(struct soap *soap, void *handle, const char *buf, size_t len); char *file_type(const char *file); /******************************************************************************\ * * Main * \******************************************************************************/ int main(int argc, char **argv) { const char *tmp = getenv("TMPDIR"); if (tmp) TMPDIR = tmp; if (argc < 2) return cgi_server(); if (argc < 3) return run_server(atoi(argv[1])); return run_client(argc, argv); } /******************************************************************************\ * * CGI Server * \******************************************************************************/ int cgi_server() { /* CGI-style: serve request from stdin to stdout */ return soap_serve(soap_new1(SOAP_ENC_MTOM)); /* Enable MTOM XOP attachments */ } #if !defined(_POSIX_THREADS) && !defined(_SC_THREADS) /******************************************************************************\ * * Stand-Alone Iterative Server * \******************************************************************************/ int run_server(int port) { struct soap soap; int ret; /* Enable MTOM */ #ifdef WITH_GZIP soap_init1(&soap, SOAP_ENC_MTOM | SOAP_ENC_ZLIB); /* Enable MTOM */ #else soap_init1(&soap, SOAP_ENC_MTOM); #endif /* Set the MIME callbacks */ soap.fmimereadopen = mime_read_open; soap.fmimereadclose = mime_read_close; soap.fmimeread = mime_read; soap.fmimewriteopen = mime_server_write_open; soap.fmimewriteclose = mime_server_write_close; soap.fmimewrite = mime_server_write; /* Bind socket */ if (!soap_valid_socket(soap_bind(&soap, NULL, port, 100))) soap_print_fault(&soap, stderr); else { fprintf(stderr, "Bind to port %d successful\n", port); /* Optional: let server time out after one hour */ soap.accept_timeout = 3600; /* Unix/Linux SIGPIPE, this is OS dependent: soap.accept_flags = SO_NOSIGPIPE; // some systems like this soap.socket_flags = MSG_NOSIGNAL; // others need this signal(SIGPIPE, sigpipe_handle); // or a sigpipe handler (more portable) */ /* Server loop */ for (;;) { int sock = soap_accept(&soap); if (!soap_valid_socket(sock)) { if (soap.errnum) soap_print_fault(&soap, stderr); else { fprintf(stderr, "Server timed out (see code how to change this)\n"); break; } } fprintf(stderr, "Accepting socket %d connection from IP %d.%d.%d.%d... ", sock, (int)(soap.ip>>24)&0xFF, (int)(soap.ip>>16)&0xFF, (int)(soap.ip>>8)&0xFF, (int)soap.ip&0xFF); if (soap_serve(&soap)) soap_print_fault(&soap, stderr); fprintf(stderr, "done\n"); soap_destroy(&soap); soap_end(&soap); } } ret = soap.error; soap_destroy(&soap); soap_end(&soap); soap_done(&soap); return ret; } #else /******************************************************************************\ * * Multi-Threaded Stand-Alone Server * \******************************************************************************/ void *process_request(void*); int run_server(int port) { struct soap soap; int i, ret; /* Enable MTOM */ #ifdef WITH_GZIP soap_init1(&soap, SOAP_ENC_MTOM | SOAP_ENC_ZLIB); /* Enable MTOM */ #else soap_init1(&soap, SOAP_ENC_MTOM); #endif /* Set the MIME callbacks */ soap.fmimereadopen = mime_read_open; soap.fmimereadclose = mime_read_close; soap.fmimeread = mime_read; soap.fmimewriteopen = mime_server_write_open; soap.fmimewriteclose = mime_server_write_close; soap.fmimewrite = mime_server_write; /* Bind socket */ if (!soap_valid_socket(soap_bind(&soap, NULL, port, 100))) soap_print_fault(&soap, stderr); else { fprintf(stderr, "Bind to port %d successful\n", port); /* Optional: let server time out after one hour */ soap.accept_timeout = 3600; /* Unix/Linux SIGPIPE, this is OS dependent: soap.accept_flags = SO_NOSIGPIPE; // some systems like this soap.socket_flags = MSG_NOSIGNAL; // others need this signal(SIGPIPE, sigpipe_handle); // or a sigpipe handler (more portable) */ /* Main thread spawns server threads */ for (i = 1; ; i++) { struct soap *tsoap; pthread_t tid; int sock = soap_accept(&soap); if (!soap_valid_socket(sock)) { if (soap.errnum) soap_print_fault(&soap, stderr); else { fprintf(stderr, "Server timed out (see code how to change this)\n"); break; } } fprintf(stderr, "Thread %d accepts socket %d connection from IP %d.%d.%d.%d\n", i, sock, (int)(soap.ip>>24)&0xFF, (int)(soap.ip>>16)&0xFF, (int)(soap.ip>>8)&0xFF, (int)soap.ip&0xFF); /* Copy soap environment and spawn thread */ tsoap = soap_copy(&soap); pthread_create(&tid, NULL, (void*(*)(void*))process_request, (void*)tsoap); } } ret = soap.error; soap_done(&soap); return ret; } void *process_request(void *soap) { pthread_detach(pthread_self()); /* Serve request (or multiple requests with keep-alive enabled) */ soap_serve((struct soap*)soap); /* Cleanup and delete deserialized data */ soap_destroy((struct soap*)soap); soap_end((struct soap*)soap); /* Detach thread's copy of soap environment */ soap_done((struct soap*)soap); /* Free soap environment */ free(soap); fprintf(stderr, "done\n"); return NULL; } #endif /******************************************************************************\ * * Client * \******************************************************************************/ int run_client(int argc, char **argv) { struct soap soap; int ret = 0; #ifdef WITH_GZIP soap_init1(&soap, SOAP_ENC_MTOM | SOAP_ENC_ZLIB); /* Enable MTOM */ #else soap_init1(&soap, SOAP_ENC_MTOM); /* Enable MTOM */ #endif /* Set the MIME callbacks */ soap.fmimereadopen = mime_read_open; soap.fmimereadclose = mime_read_close; soap.fmimeread = mime_read; soap.fmimewriteopen = mime_client_write_open; soap.fmimewriteclose = mime_client_write_close; soap.fmimewrite = mime_client_write; /* Connect timeout value (sec) (not supported by Linux) */ soap.connect_timeout = 10; /* IO timeouts (sec) */ soap.send_timeout = 30; soap.recv_timeout = 30; /* Unix/Linux SIGPIPE, this is OS dependent: soap.accept_flags = SO_NOSIGPIPE; // some systems like this soap.socket_flags = MSG_NOSIGNAL; // others need this signal(SIGPIPE, sigpipe_handle); // or a sigpipe handler (more portable) */ switch (argv[1][1]) { case 'p': ret = client_putData(&soap, argc, argv); break; case 'g': ret = client_getData(&soap, argc, argv); break; default: fprintf(stderr, "Usage: mtom-stream-test -p file1 file2 file3 ...\n"); fprintf(stderr, " mtom-stream-test -g key1 key2 key3 ...\n"); } soap_destroy(&soap); soap_end(&soap); soap_done(&soap); return ret; } int open_data(struct soap *soap, const char *file, struct x__Data *data) { struct stat sb; FILE *fd = NULL; int size; soap_default_x__Data(soap, data); fd = fopen(file, "rb"); if (!fd) { fprintf(stderr, "Cannot open file %s\n", file); return soap->error = SOAP_EOF; } /* The handle for the streaming MIME callback is the open file fd */ data->xop__Include.__ptr = (unsigned char*)fd; if (!fstat(fileno(fd), &sb) && sb.st_size > 0) size = sb.st_size; else { /* File size is unknown, so must use HTTP chunking and set size = 0 */ soap_set_omode(soap, SOAP_IO_CHUNK); size = 0; } data->xop__Include.__size = size; data->xmime5__contentType = file_type(file); data->xop__Include.id = NULL; data->xop__Include.type = data->xmime5__contentType; data->xop__Include.options = NULL; return SOAP_OK; } int client_putData(struct soap *soap, int argc, char **argv) { int i; struct x__DataSet data; struct m__PutDataResponse response; data.__size = argc - 2; data.item = soap_malloc(soap, (argc - 2)*sizeof(struct x__Data)); for (i = 2; i < argc; i++) open_data(soap, argv[i], &data.item[i - 2]); if (soap_call_m__PutData(soap, endpoint, NULL, &data, &response)) soap_print_fault(soap, stderr); else { printf("Data stored with keys:\n"); for (i = 0; i < response.x__keys.__size; i++) printf("\t%s\n", response.x__keys.key[i]); printf("Use these keys to retrieve the data with -g key1 key2 ...\n"); } return soap->error; } int client_getData(struct soap *soap, int argc, char **argv) { int i; struct x__Keys keys; struct m__GetDataResponse response; keys.__size = argc - 2; keys.key = soap_malloc(soap, (argc - 2)*sizeof(char*)); for (i = 2; i < argc; i++) keys.key[i - 2] = argv[i]; /* Pass this information to the callbacks using the soap->user variable */ soap->user = (void*)keys.key; if (soap_call_m__GetData(soap, endpoint, NULL, &keys, &response)) soap_print_fault(soap, stderr); else printf("Data retrieved\n"); return soap->error; } /******************************************************************************\ * * Server Operations * \******************************************************************************/ int m__PutData(struct soap *soap, struct x__DataSet *data, struct m__PutDataResponse *response) { int i; /* This operation is called AFTER the streaming MIME attachment callbacks handled the data. gSOAP switches to SOAP_IO_STORE when SOAP_IO_CHUNK (HTTP chunking) is not supported by the client. Since it is undesirable to use SOAP_IO_STORE to buffer the entire message, we reset it to the default SOAP_IO_BUFFER for socket connections. */ if ((soap->omode & SOAP_IO) == SOAP_IO_STORE) soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_BUFFER; if (!data) return soap_sender_fault(soap, "No data", NULL); /* Set up array of keys to return a key for each data item saved */ response->x__keys.__size = data->__size; response->x__keys.key = soap_malloc(soap, data->__size*sizeof(char**)); /* Each key is stored in the mime_server_handle object, set by the callbacks and accessible through the data __ptr, where .type must be set as this indicates the presence of an attachment with a type */ for (i = 0; i < data->__size; i++) { if (data->item[i].xop__Include.__ptr && data->item[i].xop__Include.type) { const char *key = ((struct mime_server_handle*)(data->item[i].xop__Include.__ptr))->key; const char *s; if (!key) return soap_sender_fault(soap, "Missing name", NULL); s = strrchr(key, '/'); if (!s) s = strrchr(key, '\\'); if (!s) s = key; else s++; response->x__keys.key[i] = soap_strdup(soap, s); } else response->x__keys.key[i] = "-"; } return SOAP_OK; } int m__GetData(struct soap *soap, struct x__Keys *keys, struct m__GetDataResponse *response) { int i; char *file = soap_malloc(soap, strlen(TMPDIR) + 80); if ((soap->omode & SOAP_IO) == SOAP_IO_STORE) soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_BUFFER; if (!keys) return soap_sender_fault(soap, "No keys", NULL); /* Set up array of attachments to return */ response->x__data.__size = keys->__size; response->x__data.item = soap_malloc(soap, keys->__size*sizeof(struct x__Data)); for (i = 0; i < keys->__size; ++i) { strcpy(file, TMPDIR); strcat(file, "/"); if (strncmp(keys->key[i], "data", 4)) strcat(file, "data"); strcat(file, keys->key[i]); open_data(soap, file, &response->x__data.item[i]); } return SOAP_OK; } /******************************************************************************\ * * Streaming MIME Callbacks * \******************************************************************************/ void *mime_read_open(struct soap *soap, void *handle, const char *id, const char *type, const char *description) { FILE *fd = (FILE*)handle; /* we should return NULL without setting soap->error if we don't want to use the streaming callback for this MIME attachment. The handle contains the non-NULL __ptr field value of xop__Include which should have been set in the application. The return value of this function will be passed on to the fmimeread and fmimereadclose callbacks. The return value will not affect the value of the __ptr field. */ fprintf(stderr, "Opening streaming outbound MIME channel for id=%s type=%s\n", id, type); return (void*)fd; } size_t mime_read(struct soap *soap, void *handle, char *buf, size_t len) { return fread(buf, 1, len, (FILE*)handle); } void mime_read_close(struct soap *soap, void *handle) { fprintf(stderr, "Closing streaming outbound MIME channel\n"); fclose((FILE*)handle); } /******************************************************************************\ * * Server-Side Streaming MIME Callbacks * \******************************************************************************/ void *mime_server_write_open(struct soap *soap, void *unused_handle, const char *id, const char *type, const char *description, enum soap_mime_encoding encoding) { /* Note: the 'unused_handle' is always NULL */ /* Return NULL without setting soap->error if we don't want to use the streaming callback for this DIME attachment */ const char *file; struct mime_server_handle *handle = soap_malloc(soap, sizeof(struct mime_server_handle)); if (!handle) { soap->error = SOAP_EOM; return NULL; } /* Create a new file */ file = tempnam(TMPDIR, "data"); /* The file name is also the key */ handle->key = soap_strdup(soap, file); handle->fd = fopen(file, "wb"); free((void*)file); if (!handle->fd) { soap->error = soap_sender_fault(soap, "Cannot save data to file", handle->key); soap->errnum = errno; /* get reason */ return NULL; } fprintf(stderr, "Saving file %s type %s\n", handle->key, type?type:""); return (void*)handle; } void mime_server_write_close(struct soap *soap, void *handle) { fclose(((struct mime_server_handle*)handle)->fd); } int mime_server_write(struct soap *soap, void *handle, const char *buf, size_t len) { FILE *fd = ((struct mime_server_handle*)handle)->fd; while (len) { size_t nwritten = fwrite(buf, 1, len, fd); if (!nwritten) { soap->errnum = errno; return SOAP_EOF; } len -= nwritten; buf += nwritten; } return SOAP_OK; } /******************************************************************************\ * * Client-Side Streaming MIME Callbacks * \******************************************************************************/ void *mime_client_write_open(struct soap *soap, void *unused_handle, const char *id, const char *type, const char *description, enum soap_mime_encoding encoding) { /* Note: the 'unused_handle' is always NULL */ FILE *fd; const char *file; fprintf(stderr, "Opening streaming inbound MIME channel for id=%s type=%s\n", id, type); /* soap->user points to array of keys (strings) that are file names */ file = *(char**)soap->user; soap->user = (void*)(((char**)soap->user)+1); fd = fopen(file, "wb"); if (!fd) soap->error = soap_receiver_fault(soap, "Cannot save data to file", file); return (void*)fd; } void mime_client_write_close(struct soap *soap, void *handle) { fprintf(stderr, "Closing streaming inbound MIME channel\n"); fclose((FILE*)handle); } int mime_client_write(struct soap *soap, void *handle, const char *buf, size_t len) { FILE *fd = (FILE*)handle; while (len) { size_t nwritten = fwrite(buf, 1, len, fd); if (!nwritten) { soap->errnum = errno; return SOAP_EOF; } len -= nwritten; buf += nwritten; } return SOAP_OK; } /******************************************************************************\ * * Misc * \******************************************************************************/ char *file_type(const char *file) { int n = strlen(file); if (n > 4 && (!strcmp(file + n - 4, ".xml") || !strcmp(file + n - 4, ".xsd") || !strcmp(file + n - 5, ".wsdl"))) return "text/xml"; if (n > 4 && !strcmp(file + n - 4, ".jpg")) return "image/jpg"; return "*/*"; } gsoap-2.8.91/gsoap/samples/link++/0000755000175000017500000000000013525245163016132 5ustar ellertellertgsoap-2.8.91/gsoap/samples/link++/gmt.h0000644000175000017500000000055713525245163017101 0ustar ellertellert//gsoap t service name: gmt Get current time client code: `#include "soapH.h" #include "gmt.nsmap" int main() { time_t t; struct soap *soap = soap_new(); soap_call_t__gmt(soap, "http://www.cs.fsu.edu/~engelen/gmtlitserver.cgi", "", &t); printf("The current time is %s\n", ctime(&t)); soap_destroy(soap); soap_end(soap); soap_free(soap); return 0; }` t__gmt(time_t*); gsoap-2.8.91/gsoap/samples/link++/env.h0000644000175000017500000000213413525245163017073 0ustar ellertellert/* env.h Defines SOAP-ENV Header and Fault global structures shared by client and service modules to process SOAP headers and faults when combining multiple client and/or services into one executable. Defines SOAP Fault and SOAP Header structures, which will be shared by client and service modules. The Header structure should contain all fields required by the clients and services. To obtain these, look into the wsdl2h-generated .h files for struct SOAP_ENV__Header and struct SOAP_ENV__Detail. Copy these below to make them globally visible to the gSOAP engine and plugins. Copyright (C) 2000-2016 Robert A. van Engelen, Genivia inc. All Rights Reserved. Compile in C: soapcpp2 -c -penv env.h then compile and link envC.c with your project Compile in C++ with C++ namespaces: soapcpp2 -qenv env.h then compile and link envC.cpp with your project When including envH.h in your project, include envH.h as the last: #include "abcH.h" #include "xyzH.h" #include "envH.h" */ #import "header.h" // optional user-defined headers #import "fault.h" // optional user-defined fault details gsoap-2.8.91/gsoap/samples/link++/Makefile0000644000175000017500000000310713525245163017573 0ustar ellertellert# Simple Makefile for C++ example with muliple client proxy linkage WSDL2H=../../wsdl/wsdl2h GSOAP=../../src/soapcpp2 -I../.. SOAPH=../../stdsoap2.h SOAPC=../../stdsoap2.c SOAPCPP=../../stdsoap2.cpp SOAPDOMC=../../dom.c SOAPDOMCPP=../../dom.cpp CC=gcc CPP=g++ LIBS= COFLAGS=-O2 CWFLAGS=-Wall CIFLAGS=-I. -I.. -I../.. CMFLAGS= CFLAGS= $(CWFLAGS) $(COFLAGS) $(CIFLAGS) $(CMFLAGS) all: xmas xmas: xmas.cpp envC.o stdsoap2.o gmtProxy.o calccalcProxy.o xmasmashupService.o $(CPP) $(CFLAGS) -o xmas xmas.cpp envC.o stdsoap2.o gmtProxy.o calccalcProxy.o xmasmashupService.o gmtC.cpp calcC.cpp xmasC.cpp stdsoap2.o: $(SOAPH) $(SOAPC) $(CPP) $(CFLAGS) -DWITH_NONAMESPACES -c ../../stdsoap2.cpp envC.o: env.h header.h fault.h $(GSOAP) -CS -penv env.h $(CPP) $(CFLAGS) -c envC.cpp gmtProxy.cpp: gmt.h $(GSOAP) -i -w -C -qgmt gmt.h gmtProxy.o: gmtProxy.cpp $(CPP) $(CFLAGS) -c gmtProxy.cpp calccalcProxy.cpp: calc.h $(GSOAP) -i -w -C -qcalc calc.h cp calcH.h soapH.h calccalcProxy.o: calccalcProxy.cpp $(CPP) $(CFLAGS) -c calccalcProxy.cpp xmasmashupService.cpp: xmas.hpp $(GSOAP) -i -S -qxmas xmas.hpp xmasmashupService.o: xmasmashupService.cpp $(CPP) $(CFLAGS) -c xmasmashupService.cpp xmas.hpp: xmas.wsdl $(WSDL2H) -s -o xmas.hpp xmas.wsdl .PHONY: clean distclean clean: rm -f *.o *H.h *Stub.h *C.cpp *Client.cpp *Server.cpp *ClientLib.cpp *ServerLib.cpp *Proxy.h *Proxy.cpp *Service.h *Service.cpp distclean: rm -f *.o *H.h *Stub.h *C.cpp *Client.cpp *Server.cpp *ClientLib.cpp *ServerLib.cpp *Proxy.h *Proxy.cpp *Service.h *Service.cpp rm -f *.xsd *.xml *.nsmap *.log rm -f xmas gsoap-2.8.91/gsoap/samples/link++/xmas.wsdl0000644000175000017500000000426613525245163020005 0ustar ellertellert gsoap-2.8.91/gsoap/samples/link++/gmt_time_t.h0000644000175000017500000000002113525245163020424 0ustar ellertellertt__gmt(time_t*); gsoap-2.8.91/gsoap/samples/link++/README.txt0000644000175000017500000000443413525245163017635 0ustar ellertellert How to combine multiple clients and servers into one executable? 1. Run wsdl2h once on all WSDLs together. The wsdl2h tool can import multiple WSDL files at once to combine multiple clients and service into one executable. See the samples/mashup and samples/mashup++ examples. 2. Run wsdl2h on each WSDL and use soapcpp2 compiler options. If there is a need to build clients and services from multiple gSOAP header files, then an alternative approach is required demonstrated by the material included in this part of the gSOAP package. The advantages of #1 is that you end up with smaller code, because redundant definitions are eliminated. The advantage of #2 is a more modular setup, thus supporting dynamic linking of separately compiled service modules. However, the build process requires additional steps depending on C or C++. The C++ project build process is simpler, because C++ namespaces can be used to separate the definitions as is shown in the samples/link++ example. The C++ examples in this directory illustrate how multiple clients and services can be compiled and linked into one executable from multiple gSOAP header files. The C++ examples accomplish this by using C++ namespaces (soapcpp2 option -q) to separate the service definitions and type serializers. When linking multiple soapcpp2-generated files, a single file with shared SOAP Header definitions is required. This means that all SOAP Header members must be collected into a single SOAP Header definition. Similar requirements are needed for SOAP Faults (the SOAP_ENV__Detail struct with details to be more precise). So the first step is to generate header and fault handlers: $ soapcpp2 -CS -penv env.h Multiple SOAP_ENV__Header structs can be defined in env.h moved there from the client and service gSOAP header files. All SOAP_ENV__Header members will be combined into a single struct by soapcpp2. Also the struct SOAP_ENV__Detail can be defined this way. Its definition is shared among the clients and services. Then each file.h is compiled with: $ soapcp2 -i -q .h where is a name for a C++ namespace. The -i option generates proxies and server objects, which are declared in this namespace. Compile the xyzProxy.cpp or xyzServer.cpp code and the C.cpp serializers, and envC.cpp. gsoap-2.8.91/gsoap/samples/link++/header.h0000644000175000017500000000120413525245163017530 0ustar ellertellert/* header.h Example SOAP Header definitions, to demonstrate the use of env.h. This file defines the SOAP Header data structure shared by client and service modules Copyright (C) 2000-2002 Robert A. van Engelen. All Rights Reserved. */ //gsoap h schema namespace: http://websrv.cs.fsu.edu/~engelen/h.xsd // h:authentication type of SOAP Header element struct h__authentication { @char *userid; // userid XML attribute @char *passwd; // passwd XML attribute }; // add the above to the SOAP Header elements: struct SOAP_ENV__Header { struct h__authentication *h__credentials; // rendered as XML }; gsoap-2.8.91/gsoap/samples/link++/xmas.cpp0000644000175000017500000000604113525245163017607 0ustar ellertellert/* xmas.cpp Example CGI service with multiple C++ proxy linkage To generate non-client-server header and fault handlers: $ soapcpp2 -CS -penv env.h The gmt client proxy in 'gmt' C++ namespace: $ soapcpp2 -i -C -qgmt gmt.h The calc client proxy in 'calc' C++ namespace: $ soapcpp2 -i -C -qcalc calc.h The xmas service in 'xmas' C++ namespace: $ soapcpp2 -i -S -qxmas xmas.hpp cc -o xmas.cgi xmas.cpp stdsoap2.cpp envC.cpp gmtProxy.cpp calccalcProxy.cpp xmasmashupService.cpp gmtC.cpp calcC.cpp xmasC.cpp -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "envH.h" #include "gmtProxy.h" #include "calccalcProxy.h" #include "xmasmashupService.h" int main() { xmas::mashupService service; return service.serve(); } /******************************************************************************\ * * Server operation * \******************************************************************************/ int xmas::mashupService::dtx(_XML x, struct _ns2__commingtotown *response) { gmt::Proxy Time("http://www.cs.fsu.edu/~engelen/gmtlitserver.cgi"); time_t now; if (Time.gmt(&now)) return soap_receiverfault("Cannot connect to GMT server", NULL); struct tm tm; tm.tm_sec = 0; tm.tm_min = 0; tm.tm_hour = 0; tm.tm_mday = 25; tm.tm_mon = 11; tm.tm_year = gmtime(&now)->tm_year; /* this year */ tm.tm_isdst = 0; tm.tm_zone = NULL; time_t xmas = soap_timegm(&tm); if (xmas < now) { tm.tm_year++; /* xmas just passed, go to next year */ xmas = soap_timegm(&tm); } double sec = difftime(xmas, now); calc::calcProxy Calc; double days; if (Calc.div(sec, 86400.0, &days)) return soap_receiverfault("Cannot connect to calc server", NULL); response->days = (int)days; return SOAP_OK; } gsoap-2.8.91/gsoap/samples/link++/xmas.hpp0000644000175000017500000001575613525245163017631 0ustar ellertellert// Reminder: Modify typemap.dat to customize the header file generated by wsdl2h /* xmas.hpp Generated by wsdl2h 1.2.9l from xmas.wsdl and typemap.dat 2007-12-31 01:37:25 GMT Copyright (C) 2001-2007 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 schema 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 w /******************************************************************************\ * * * http://www.genivia.com/mashup.wsdl * * * \******************************************************************************/ /******************************************************************************\ * * * 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: ns1 = "http://www.genivia.com/mashup.wsdl" ns2 = "urn:daystoxmas" */ //gsoap ns2 schema namespace: urn:daystoxmas //gsoap ns2 schema form: qualified /******************************************************************************\ * * * Schema Types * * * \******************************************************************************/ /// Element "urn:daystoxmas":daystoxmas. /// Note: use wsdl2h option -g to generate this global element declaration. // Forward declaration of class _ns2__commingtotown. class _ns2__commingtotown; /// Element "urn:daystoxmas":commingtotown of complexType. /// "urn:daystoxmas":commingtotown is a complexType. class _ns2__commingtotown { public: /// Element days of type xs:int. int days 1; ///< Required element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap ns1 service name: mashup //gsoap ns1 service type: PortType //gsoap ns1 service port: http://www.cs.fsu.edu/~engelen/mashup.cgi //gsoap ns1 service namespace: http://www.genivia.com/mashup.wsdl //gsoap ns1 service transport: http://schemas.xmlsoap.org/soap/http /** @mainpage Service Definitions @section Service_bindings Bindings - @ref mashup */ /** @page mashup Binding "mashup" @section mashup_operations Operations of Binding "mashup" - @ref __ns1__dtx @section mashup_ports Endpoints of Binding "mashup" - http://www.cs.fsu.edu/~engelen/mashup.cgi Note: use wsdl2h option -N to change the service binding prefix name */ /******************************************************************************\ * * * mashup * * * \******************************************************************************/ /******************************************************************************\ * * * __ns1__dtx * * * \******************************************************************************/ /// Operation "__ns1__dtx" of service binding "mashup" /** Operation details: - SOAP document/literal style C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__dtx( 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: _XML ns2__daystoxmas, // response parameters: _ns2__commingtotown* ns2__commingtotown ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__dtx( struct soap *soap, // request parameters: _XML ns2__daystoxmas, // response parameters: _ns2__commingtotown* ns2__commingtotown ); @endcode C++ proxy class (defined in soapmashupProxy.h): class mashup; Note: use soapcpp2 option '-i' to generate improved proxy and service classes; */ //gsoap ns1 service method-style: dtx document //gsoap ns1 service method-encoding: dtx literal //gsoap ns1 service method-action: dtx "" int __ns1__dtx( _XML ns2__daystoxmas, ///< Request parameter _ns2__commingtotown* ns2__commingtotown ///< Response parameter ); /* End of xmas.hpp */ gsoap-2.8.91/gsoap/samples/link++/calc.h0000644000175000017500000001054613525245163017213 0ustar ellertellert/* calc.h This is a gSOAP header file with a calculator data binding and Web service interface to implement clients and services The service operations and type definitions use familiar C/C++ syntax. The following methods are defined by this gSOAP service definition: add(a,b) sub(a,b) mul(a,b) div(a,b) pow(a,b) Build steps for C (see samples/calc): $ soapcpp2 -c -r calc.h $ cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c $ cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c Build steps for C++ (see samples/calc++): $ soapcpp2 -j -r calc.h $ c++ -o calcclient++ calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp $ c++ -o calcserver++ calcserver.cpp stdsoap2.cpp soapC.cpp soapcalcService.cpp Option -r generates a soapReadme.md report. Note that soapcpp2 option -j generates proxy and service classes, which encapsulate the method operations in the class instead of defining them as global functions as in C. The //gsoap directives are used to bind XML namespaces and to define Web service properties: //gsoap service name: //gsoap service style: [rpc|document] //gsoap service encoding: [literal|encoded] //gsoap service namespace: //gsoap service location: Web service operation properties: //gsoap service method-style: [rpc|document] //gsoap service method-encoding: [literal|encoded] //gsoap service method-action: //gsoap service method-documentation: and type schema properties: //gsoap schema namespace: //gsoap schema elementForm: [qualified|unqualified] //gsoap schema attributeForm: [qualified|unqualified] //gsoap schema documentation: //gsoap schema type-documentation: where is an XML namespace prefix, which is used in C/C++ operation names, e.g. ns__add(), and type names, e.g. xsd__int. See the documentation for the full list of //gsoap directives. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: calc Simple calculator service described at https://www.genivia.com/dev.html //gsoap ns service protocol: SOAP //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns schema namespace: urn:calc //gsoap ns service method: add Sums two values int ns__add(double a, double b, double *result); //gsoap ns service method: sub Subtracts two values int ns__sub(double a, double b, double *result); //gsoap ns service method: mul Multiplies two values int ns__mul(double a, double b, double *result); //gsoap ns service method: div Divides two values int ns__div(double a, double b, double *result); //gsoap ns service method: pow Raises a to b int ns__pow(double a, double b, double *result); gsoap-2.8.91/gsoap/samples/link++/fault.h0000644000175000017500000000234613525245163017423 0ustar ellertellert/* fault.h Example SOAP Fault detail definitions, to demonstrate the use of env.h. Defines optional SOAP Fault derail data structures Copyright (C) 2000-2004 Robert A. van Engelen. All Rights Reserved. */ /* Add any data structure you want to serialize as part of the SOAP Fault detail element. The detail element '__type' and 'value' fields should be set to transmit data. The fields are set when data of corresponding types are received. For example, we define an of name with a string vector (note the leading _ in the following declaration): class _f__myData { public: std::vector *data; }; To return a fault from your service application: soap_sender_fault(soap, "An error occurred", NULL)); // set soap fault soap->fault->detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail)); soap->fault->detail->__type = SOAP_TYPE__f__myData; soap->fault->detail->value = soap_new__f__myData(soap, -1); return SOAP_FAULT; In addition, you can modify the SOAP_ENV__Detail struct and add your own set of fields, as in: struct SOAP_ENV__Detail { struct f__myDataType f__myData; int __type; void *value; char *__any; // or use '_XML __any' to store literal XML content }; */ gsoap-2.8.91/gsoap/samples/wcf/0000755000175000017500000000000013525245163015626 5ustar ellertellertgsoap-2.8.91/gsoap/samples/wcf/WS/0000755000175000017500000000000013525245163016157 5ustar ellertellertgsoap-2.8.91/gsoap/samples/wcf/WS/DualHttp/0000755000175000017500000000000013525245163017704 5ustar ellertellertgsoap-2.8.91/gsoap/samples/wcf/WS/DualHttp/netrm.xsd0000644000175000017500000000223513525245163021553 0ustar ellertellert gsoap-2.8.91/gsoap/samples/wcf/WS/DualHttp/calculator.h0000644000175000017500000011726513525245163022222 0ustar ellertellert/* calculator.h Generated by wsdl2h 2.8.9 from calculator.wsdl and typemap.dat 2012-08-18 17:13:16 GMT DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS USE THE soapcpp2-GENERATED SOURCE CODE FILES FOR YOUR PROJECT BUILDS gSOAP XML Web services tools. Copyright (C) 2001-2012 Robert van Engelen, Genivia Inc. All Rights Reserved. Part of this software is released under one of the following licenses: GPL or Genivia's license for commercial use. */ /** @page page_notes Usage Notes NOTE: - Run soapcpp2 on calculator.h to generate the SOAP/XML processing logic. Use soapcpp2 option -I to specify paths for #import To build with STL, 'stlvector.h' is imported from 'import' dir in package. Use soapcpp2 option -i to generate improved proxy and server classes. - 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) on this file to generate documentation. - Use wsdl2h options -nname and -Nname to globally rename the prefix 'ns'. - Use wsdl2h option -d to enable DOM support for xsd:anyType. - Use wsdl2h option -g to auto-generate readers and writers for root elements. - Struct/class members serialized as XML attributes are annotated with a '@'. - Struct/class members that have a special role are annotated with a '$'. WARNING: DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS. USE THE SOURCE CODE FILES GENERATED BY soapcpp2 FOR YOUR PROJECT BUILDS: THE soapStub.h FILE CONTAINS THIS CONTENT WITHOUT ANNOTATIONS. LICENSE: @verbatim -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following two licenses: 1) GPL or 2) Genivia's license for commercial use. -------------------------------------------------------------------------------- 1) 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. -------------------------------------------------------------------------------- 2) A commercial-use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- @endverbatim */ //gsoapopt w /******************************************************************************\ * * * Definitions * * http://tempuri.org/ * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ // STL vector containers (use option -s to remove STL dependency) #import "stlvector.h" /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ // This service supports SOAP 1.2 namespaces: #import "soap12.h" /* 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: tempuri = "http://tempuri.org/" mssadhi = "http://Microsoft.Samples.DualHttp/Imports" mssadh = "http://Microsoft.Samples.DualHttp" */ #define SOAP_NAMESPACE_OF_mssadhi "http://Microsoft.Samples.DualHttp/Imports" //gsoap mssadhi schema namespace: http://Microsoft.Samples.DualHttp/Imports //gsoap mssadhi schema form: unqualified #define SOAP_NAMESPACE_OF_mssadh "http://Microsoft.Samples.DualHttp" //gsoap mssadh schema namespace: http://Microsoft.Samples.DualHttp //gsoap mssadh schema elementForm: qualified //gsoap mssadh schema attributeForm: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ /******************************************************************************\ * * * Forward Declarations * * * \******************************************************************************/ // Forward declaration of class _mssadh__Clear. class _mssadh__Clear; // Forward declaration of class _mssadh__AddTo. class _mssadh__AddTo; // Forward declaration of class _mssadh__SubtractFrom. class _mssadh__SubtractFrom; // Forward declaration of class _mssadh__MultiplyBy. class _mssadh__MultiplyBy; // Forward declaration of class _mssadh__DivideBy. class _mssadh__DivideBy; // Forward declaration of class _mssadh__Result. class _mssadh__Result; // Forward declaration of class _mssadh__Equation. class _mssadh__Equation; /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://Microsoft.Samples.DualHttp/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://Microsoft.Samples.DualHttp * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://Microsoft.Samples.DualHttp/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://Microsoft.Samples.DualHttp * * * \******************************************************************************/ /// Top-level root element "http://Microsoft.Samples.DualHttp":Clear /// "http://Microsoft.Samples.DualHttp":Clear is a complexType. class _mssadh__Clear { public: /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.DualHttp":AddTo /// "http://Microsoft.Samples.DualHttp":AddTo is a complexType. class _mssadh__AddTo { public: /// Element n of type xs:double. double* n 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.DualHttp":SubtractFrom /// "http://Microsoft.Samples.DualHttp":SubtractFrom is a complexType. class _mssadh__SubtractFrom { public: /// Element n of type xs:double. double* n 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.DualHttp":MultiplyBy /// "http://Microsoft.Samples.DualHttp":MultiplyBy is a complexType. class _mssadh__MultiplyBy { public: /// Element n of type xs:double. double* n 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.DualHttp":DivideBy /// "http://Microsoft.Samples.DualHttp":DivideBy is a complexType. class _mssadh__DivideBy { public: /// Element n of type xs:double. double* n 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.DualHttp":Result /// "http://Microsoft.Samples.DualHttp":Result is a complexType. class _mssadh__Result { public: /// Element result of type xs:double. double* result 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.DualHttp":Equation /// "http://Microsoft.Samples.DualHttp":Equation is a complexType. class _mssadh__Equation { public: /// Element eqn of type xs:string. std::string* eqn 0; ///< Nullable pointer. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /******************************************************************************\ * * * Additional Top-Level Elements * * http://Microsoft.Samples.DualHttp/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * http://Microsoft.Samples.DualHttp/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Elements * * http://Microsoft.Samples.DualHttp * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * http://Microsoft.Samples.DualHttp * * * \******************************************************************************/ /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap tempuri service name: WSDualHttpBinding_USCOREICalculatorDuplex //gsoap tempuri service type: ICalculatorDuplex //gsoap tempuri service port: http://192.168.2.2:8000/ServiceModelSamples/service //gsoap tempuri service namespace: http://tempuri.org/ //gsoap tempuri service transport: http://schemas.xmlsoap.org/soap/http /** @mainpage CalculatorService Definitions @section CalculatorService_bindings Service Bindings - @ref WSDualHttpBinding_USCOREICalculatorDuplex @section CalculatorService_more More Information - @ref page_notes "Usage Notes" - @ref page_XMLDataBinding "XML Data Binding" - @ref SOAP_ENV__Header "SOAP Header Content" (when applicable) - @ref SOAP_ENV__Detail "SOAP Fault Detail Content" (when applicable) */ /** @page WSDualHttpBinding_USCOREICalculatorDuplex Binding "WSDualHttpBinding_USCOREICalculatorDuplex" @section WSDualHttpBinding_USCOREICalculatorDuplex_operations Operations of Binding "WSDualHttpBinding_USCOREICalculatorDuplex" - @ref __tempuri__Clear - @ref __tempuri__AddTo - @ref __tempuri__SubtractFrom - @ref __tempuri__MultiplyBy - @ref __tempuri__DivideBy - @ref __tempuri__Result - @ref __tempuri__Equation @section WSDualHttpBinding_USCOREICalculatorDuplex_ports Endpoints of Binding "WSDualHttpBinding_USCOREICalculatorDuplex" - http://192.168.2.2:8000/ServiceModelSamples/service @section WSDualHttpBinding_USCOREICalculatorDuplex_policy Policy of Binding "WSDualHttpBinding_USCOREICalculatorDuplex" See Section @ref WSDualHttpBinding_USCOREICalculatorDuplex_policy_enablers - WS-Policy applicable to the service endpoint ports: - Exactly one of the following: - All of the following: - WS-Addressing is used - WS-ReliableMessaging is used - Inactivity Timeout = 600000 (ms) - Acknowledgement Interval = 200 (ms) - Other policy requirements: @verbatim @endverbatim - Other policy requirements: @verbatim @endverbatim Note: use wsdl2h option -N to change the service binding prefix name */ /******************************************************************************\ * * * Service Binding * * WSDualHttpBinding_USCOREICalculatorDuplex * * * \******************************************************************************/ /******************************************************************************\ * * * Service Operation * * __tempuri__Clear * * * \******************************************************************************/ /// Operation "__tempuri__Clear" of service binding "WSDualHttpBinding_USCOREICalculatorDuplex" /** Operation details: - One-way service input message request - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/Clear" - Addressing method action: "http://tempuri.org//ICalculatorDuplex/Clear" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_send___tempuri__Clear( 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: _mssadh__Clear* mssadh__Clear, ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Clear( struct soap *soap, // request parameters: _mssadh__Clear* mssadh__Clear, // response parameters: ); @endcode C++ proxy class (defined in soapWSDualHttpBinding_USCOREICalculatorDuplexProxy.h): @code class WSDualHttpBinding_USCOREICalculatorDuplexProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapWSDualHttpBinding_USCOREICalculatorDuplexService.h): @code class WSDualHttpBinding_USCOREICalculatorDuplexService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Clear document //gsoap tempuri service method-encoding: Clear literal //gsoap tempuri service method-action: Clear http://Microsoft.Samples.DualHttp/ICalculatorDuplex/Clear int __tempuri__Clear( _mssadh__Clear* mssadh__Clear, ///< Request parameter void ///< One-way message: no response parameter ); /******************************************************************************\ * * * Service Operation * * __tempuri__AddTo * * * \******************************************************************************/ /// Operation "__tempuri__AddTo" of service binding "WSDualHttpBinding_USCOREICalculatorDuplex" /** Operation details: - One-way service input message request - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/AddTo" - Addressing method action: "http://tempuri.org//ICalculatorDuplex/AddTo" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_send___tempuri__AddTo( 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: _mssadh__AddTo* mssadh__AddTo, ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__AddTo( struct soap *soap, // request parameters: _mssadh__AddTo* mssadh__AddTo, // response parameters: ); @endcode C++ proxy class (defined in soapWSDualHttpBinding_USCOREICalculatorDuplexProxy.h): @code class WSDualHttpBinding_USCOREICalculatorDuplexProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapWSDualHttpBinding_USCOREICalculatorDuplexService.h): @code class WSDualHttpBinding_USCOREICalculatorDuplexService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: AddTo document //gsoap tempuri service method-encoding: AddTo literal //gsoap tempuri service method-action: AddTo http://Microsoft.Samples.DualHttp/ICalculatorDuplex/AddTo int __tempuri__AddTo( _mssadh__AddTo* mssadh__AddTo, ///< Request parameter void ///< One-way message: no response parameter ); /******************************************************************************\ * * * Service Operation * * __tempuri__SubtractFrom * * * \******************************************************************************/ /// Operation "__tempuri__SubtractFrom" of service binding "WSDualHttpBinding_USCOREICalculatorDuplex" /** Operation details: - One-way service input message request - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/SubtractFrom" - Addressing method action: "http://tempuri.org//ICalculatorDuplex/SubtractFrom" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_send___tempuri__SubtractFrom( 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: _mssadh__SubtractFrom* mssadh__SubtractFrom, ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__SubtractFrom( struct soap *soap, // request parameters: _mssadh__SubtractFrom* mssadh__SubtractFrom, // response parameters: ); @endcode C++ proxy class (defined in soapWSDualHttpBinding_USCOREICalculatorDuplexProxy.h): @code class WSDualHttpBinding_USCOREICalculatorDuplexProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapWSDualHttpBinding_USCOREICalculatorDuplexService.h): @code class WSDualHttpBinding_USCOREICalculatorDuplexService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: SubtractFrom document //gsoap tempuri service method-encoding: SubtractFrom literal //gsoap tempuri service method-action: SubtractFrom http://Microsoft.Samples.DualHttp/ICalculatorDuplex/SubtractFrom int __tempuri__SubtractFrom( _mssadh__SubtractFrom* mssadh__SubtractFrom, ///< Request parameter void ///< One-way message: no response parameter ); /******************************************************************************\ * * * Service Operation * * __tempuri__MultiplyBy * * * \******************************************************************************/ /// Operation "__tempuri__MultiplyBy" of service binding "WSDualHttpBinding_USCOREICalculatorDuplex" /** Operation details: - One-way service input message request - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/MultiplyBy" - Addressing method action: "http://tempuri.org//ICalculatorDuplex/MultiplyBy" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_send___tempuri__MultiplyBy( 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: _mssadh__MultiplyBy* mssadh__MultiplyBy, ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__MultiplyBy( struct soap *soap, // request parameters: _mssadh__MultiplyBy* mssadh__MultiplyBy, // response parameters: ); @endcode C++ proxy class (defined in soapWSDualHttpBinding_USCOREICalculatorDuplexProxy.h): @code class WSDualHttpBinding_USCOREICalculatorDuplexProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapWSDualHttpBinding_USCOREICalculatorDuplexService.h): @code class WSDualHttpBinding_USCOREICalculatorDuplexService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: MultiplyBy document //gsoap tempuri service method-encoding: MultiplyBy literal //gsoap tempuri service method-action: MultiplyBy http://Microsoft.Samples.DualHttp/ICalculatorDuplex/MultiplyBy int __tempuri__MultiplyBy( _mssadh__MultiplyBy* mssadh__MultiplyBy, ///< Request parameter void ///< One-way message: no response parameter ); /******************************************************************************\ * * * Service Operation * * __tempuri__DivideBy * * * \******************************************************************************/ /// Operation "__tempuri__DivideBy" of service binding "WSDualHttpBinding_USCOREICalculatorDuplex" /** Operation details: - One-way service input message request - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/DivideBy" - Addressing method action: "http://tempuri.org//ICalculatorDuplex/DivideBy" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_send___tempuri__DivideBy( 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: _mssadh__DivideBy* mssadh__DivideBy, ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__DivideBy( struct soap *soap, // request parameters: _mssadh__DivideBy* mssadh__DivideBy, // response parameters: ); @endcode C++ proxy class (defined in soapWSDualHttpBinding_USCOREICalculatorDuplexProxy.h): @code class WSDualHttpBinding_USCOREICalculatorDuplexProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapWSDualHttpBinding_USCOREICalculatorDuplexService.h): @code class WSDualHttpBinding_USCOREICalculatorDuplexService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: DivideBy document //gsoap tempuri service method-encoding: DivideBy literal //gsoap tempuri service method-action: DivideBy http://Microsoft.Samples.DualHttp/ICalculatorDuplex/DivideBy int __tempuri__DivideBy( _mssadh__DivideBy* mssadh__DivideBy, ///< Request parameter void ///< One-way message: no response parameter ); /******************************************************************************\ * * * Service Operation * * __tempuri__Result * * * \******************************************************************************/ /// Operation "__tempuri__Result" of service binding "WSDualHttpBinding_USCOREICalculatorDuplex" /** Operation details: - One-way service output response message - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/Result" - Addressing method action: "http://tempuri.org//ICalculatorDuplex/Result" - Addressing method output action: "http://tempuri.org//ICalculatorDuplex/Result" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_send___tempuri__Result( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // parameters: _mssadh__Result* mssadh__Result, ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Result( struct soap *soap, // parameters: _mssadh__Result* mssadh__Result, ); @endcode C++ proxy class (defined in soapWSDualHttpBinding_USCOREICalculatorDuplexProxy.h): @code class WSDualHttpBinding_USCOREICalculatorDuplexProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapWSDualHttpBinding_USCOREICalculatorDuplexService.h): @code class WSDualHttpBinding_USCOREICalculatorDuplexService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Result document //gsoap tempuri service method-encoding: Result literal //gsoap tempuri service method-action: Result http://Microsoft.Samples.DualHttp/ICalculatorDuplex/Result int __tempuri__Result( _mssadh__Result* mssadh__Result, ///< Request parameter void ///< One-way message ); /******************************************************************************\ * * * Service Operation * * __tempuri__Equation * * * \******************************************************************************/ /// Operation "__tempuri__Equation" of service binding "WSDualHttpBinding_USCOREICalculatorDuplex" /** Operation details: - One-way service output response message - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/Equation" - Addressing method action: "http://tempuri.org//ICalculatorDuplex/Equation" - Addressing method output action: "http://tempuri.org//ICalculatorDuplex/Equation" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_send___tempuri__Equation( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // parameters: _mssadh__Equation* mssadh__Equation, ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Equation( struct soap *soap, // parameters: _mssadh__Equation* mssadh__Equation, ); @endcode C++ proxy class (defined in soapWSDualHttpBinding_USCOREICalculatorDuplexProxy.h): @code class WSDualHttpBinding_USCOREICalculatorDuplexProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapWSDualHttpBinding_USCOREICalculatorDuplexService.h): @code class WSDualHttpBinding_USCOREICalculatorDuplexService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Equation document //gsoap tempuri service method-encoding: Equation literal //gsoap tempuri service method-action: Equation http://Microsoft.Samples.DualHttp/ICalculatorDuplex/Equation int __tempuri__Equation( _mssadh__Equation* mssadh__Equation, ///< Request parameter void ///< One-way message ); /** @page WSDualHttpBinding_USCOREICalculatorDuplex Binding "WSDualHttpBinding_USCOREICalculatorDuplex" @section WSDualHttpBinding_USCOREICalculatorDuplex_policy_enablers Policy Enablers of Binding "WSDualHttpBinding_USCOREICalculatorDuplex" Based on policies, this service imports wsa5.h wsrm5.h - WS-Policy reminders and enablers: - WS-Addressing 1.0 (2005/08, accepts 2004/08): @code #import "wsa5.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsaapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code // See the user guide gsoap/doc/wsa/html/index.html @endcode - WS-Addressing (2004/08): @code #import "wsa.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsaapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code // See the user guide gsoap/doc/wsa/html/index.html @endcode - WS-ReliableMessaging 1.0: @code #import "wsrm5.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsrmapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code soap_register_plugin(soap, soap_wsrm); // register the wsrm plugin in your code // See the user guide gsoap/doc/wsrm/html/index.html @endcode - WS-ReliableMessaging 1.1: @code #import "wsrm.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsrmapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code soap_register_plugin(soap, soap_wsrm); // register the wsrm plugin in your code // See the user guide gsoap/doc/wsrm/html/index.html @endcode - WS-Security (SOAP Message Security) 1.0 (accepts 1.1): @code #import "wsse.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsseapi.h" soap_register_plugin(soap, soap_wsse); // register the wsse plugin in your code // See the user guide gsoap/doc/wsse/html/index.html @endcode - WS-Security (SOAP Message Security) 1.1 (accepts 1.0): @code #import "wsse11.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsseapi.h" soap_register_plugin(soap, soap_wsse); // register the wsse plugin in your code // See the user guide gsoap/doc/wsse/html/index.html @endcode - HTTP Digest Authentication: @code #include "plugin/httpda.h" soap_register_plugin(soap, soap_http_da); // register the HTTP DA plugin in your code // See the user guide gsoap/doc/httpda/html/index.html @endcode */ #import "wsa5.h" #import "wsrm5.h" /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. XML content can be retrieved from: - a file descriptor, using soap->recvfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->is = ... - a buffer, using the soap->frecv() callback XML content can be stored to: - a file descriptor, using soap->sendfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->os = ... - a buffer, using the soap->fsend() callback @section mssadhi Top-level root elements of schema "http://Microsoft.Samples.DualHttp/Imports" @section mssadh Top-level root elements of schema "http://Microsoft.Samples.DualHttp" - @ref _mssadh__Clear @code // Reader (returns SOAP_OK on success): soap_read__mssadh__Clear(struct soap*, _mssadh__Clear*); // Writer (returns SOAP_OK on success): soap_write__mssadh__Clear(struct soap*, _mssadh__Clear*); @endcode - @ref _mssadh__AddTo @code // Reader (returns SOAP_OK on success): soap_read__mssadh__AddTo(struct soap*, _mssadh__AddTo*); // Writer (returns SOAP_OK on success): soap_write__mssadh__AddTo(struct soap*, _mssadh__AddTo*); @endcode - @ref _mssadh__SubtractFrom @code // Reader (returns SOAP_OK on success): soap_read__mssadh__SubtractFrom(struct soap*, _mssadh__SubtractFrom*); // Writer (returns SOAP_OK on success): soap_write__mssadh__SubtractFrom(struct soap*, _mssadh__SubtractFrom*); @endcode - @ref _mssadh__MultiplyBy @code // Reader (returns SOAP_OK on success): soap_read__mssadh__MultiplyBy(struct soap*, _mssadh__MultiplyBy*); // Writer (returns SOAP_OK on success): soap_write__mssadh__MultiplyBy(struct soap*, _mssadh__MultiplyBy*); @endcode - @ref _mssadh__DivideBy @code // Reader (returns SOAP_OK on success): soap_read__mssadh__DivideBy(struct soap*, _mssadh__DivideBy*); // Writer (returns SOAP_OK on success): soap_write__mssadh__DivideBy(struct soap*, _mssadh__DivideBy*); @endcode - @ref _mssadh__Result @code // Reader (returns SOAP_OK on success): soap_read__mssadh__Result(struct soap*, _mssadh__Result*); // Writer (returns SOAP_OK on success): soap_write__mssadh__Result(struct soap*, _mssadh__Result*); @endcode - @ref _mssadh__Equation @code // Reader (returns SOAP_OK on success): soap_read__mssadh__Equation(struct soap*, _mssadh__Equation*); // Writer (returns SOAP_OK on success): soap_write__mssadh__Equation(struct soap*, _mssadh__Equation*); @endcode */ /* End of calculator.h */ gsoap-2.8.91/gsoap/samples/wcf/WS/DualHttp/Doxyfile0000644000175000017500000002271313525245163021417 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "WCF WS Dual Http" PROJECT_NUMBER = "" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = YES STRIP_FROM_PATH = /Applications/ STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = calculator.h calculator.cpp FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = YES INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = HTML_FOOTER = HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /usr/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.91/gsoap/samples/wcf/WS/DualHttp/Makefile0000644000175000017500000000334313525245163021347 0ustar ellertellertURL=http://192.168.2.2:8000/ServiceModelSamples/service WSDL=../../../../wsdl/wsdl2h GSOAP=../../../../src/soapcpp2 SOAPH=../../../../stdsoap2.h SOAPC=../../../../stdsoap2.c SOAPCPP=../../../../stdsoap2.cpp SOAPDOMC=../../../../dom.c SOAPDOMCPP=../../../../dom.cpp TYPEMAP=../../../../typemap.dat CC=gcc -x c CPP=g++ -x c++ LIBS=-lssl -lcrypto GSFLAGS=-L -I../../../../import -I../../../.. COFLAGS=-O2 CWFLAGS=-Wall -Wno-deprecated-declarations CIFLAGS=-I. -I../../../.. -I../../../../plugin CMFLAGS=-DCB_THREAD -DWITH_WCF -DWITH_DOM -DWITH_OPENSSL CFLAGS= $(CWFLAGS) $(COFLAGS) $(CIFLAGS) $(CMFLAGS) all: calculator calculator: calculator.h calculator.cpp $(SOAPH) $(SOAPC) wsrxClient.cpp $(GSOAP) $(GSFLAGS) -a -j calculator.h $(CPP) $(CFLAGS) -o calculator calculator.cpp soapC.cpp soapWSDualHttpBinding_USCOREICalculatorDuplexService.cpp soapWSDualHttpBinding_USCOREICalculatorDuplexProxy.cpp wsrxClient.cpp wsrxServer.cpp ../../../../plugin/wsrmapi.c ../../../../plugin/wsaapi.c ../../../../custom/duration.c $(SOAPDOMCPP) $(SOAPCPP) $(LIBS) wsrxClient.cpp wsrxServer.cpp: $(GSOAP) $(GSFLAGS) -A -pwsrx ../../../../import/wsrm5.h %.cer: %.pem openssl x509 -in $< -outform der -out $@ calculator.h: $(WSDL) -t $(TYPEMAP) -o calculator.h $(URL)?wsdl .PHONY: clean distclean clean: rm -f *.o soapH.h soapStub.h soapC.* soapClient.* soapServer.* soap*Proxy.* soap*Service.* soap*Object.* rm -f *.o wsrxH.h wsrxStub.h wsrxC.* wsrxClient.* wsrxServer.* wsrxwsrmObject.h wsrxwsrmProxy.h distclean: rm -f *.o soapH.h soapStub.h soapC.* soapClient.* soapServer.* soap*Proxy.* soap*Service.* soap*Object.* rm -f *.o wsrxH.h wsrxStub.h wsrxC.* wsrxClient.* wsrxServer.* wsrxwsrmObject.h wsrxwsrmProxy.h rm -f *.xml *.nsmap *.log rm -f calculator gsoap-2.8.91/gsoap/samples/wcf/WS/DualHttp/calculator.cpp0000644000175000017500000006051213525245163022545 0ustar ellertellert/* calculator.cpp WCF wsDualHttpBinding demo See the README.txt gSOAP XML Web services tools Copyright (C) 2000-2012, 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-2012, 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 -------------------------------------------------------------------------------- */ /* To build with C++ service objects (proxies, services, and callback service objects), run soapcpp2 twice, first for the WS-RM logic and then for the app logic: $ soapcpp2 -L -I../../../../import -I../../../.. -A -pwsrx ../../../../import/wsrm5.h $ soapcpp2 -L -I../../../../import -I../../../.. -a -j calculator.h then compile: $ c++ -o calculator calculator.cpp soapC.cpp soapWSDualHttpBinding_USCOREICalculatorDuplexService.cpp soapWSDualHttpBinding_USCOREICalculatorDuplexProxy.cpp wsrxClient.cpp wsrxServer.cpp ../../../../plugin/wsrmapi.c ../../../../plugin/wsaapi.c ../../../../custom/duration.c ../../../../dom.cpp ../../../../stdsoap2.cpp Run service on port 8000: $ ./calculator 8000 Run client: $ ./calculator Note: Set serverURI to "http://localhost:8000" and clientURI to "http://localhost:8001" in the code below to run the client and server on the same host. See README.txt for custimizations and instructions for WCF. When comppiled with -DCB_THREAD, the client will start a callback server to accept incoming messages instead of using a polling method. */ #include "soapWSDualHttpBinding_USCOREICalculatorDuplexService.h" #include "soapWSDualHttpBinding_USCOREICalculatorDuplexProxy.h" #include "WSDualHttpBinding_USCOREICalculatorDuplex.nsmap" // Set to the service URI: const char *serverURI = "http://localhost:8000"; // const char *serverURI = "http://192.168.2.2:8000/ServiceModelSamples/service"; // Set to the client callback URI and port: const char *clientURI = "http://localhost:8001"; // const char *clientURI = "http://10.0.1.3:8001"; int clientPort = 8001; #include #include "wsrmapi.h" #ifdef CB_THREAD void *callback_server(void*); void *callback_thread(void *ctx); #define CB_WAIT (1) /* threaded callback service operation may block for up to 1s with NoDiscard */ #else #define CB_WAIT (0) /* callback polling service operations should not block with NoDiscard */ #endif class Service : public WSDualHttpBinding_USCOREICalculatorDuplexService { private: double result; std::stringstream equation; WSDualHttpBinding_USCOREICalculatorDuplexProxy callback; public: Service() { soap_set_mode(soap, SOAP_XML_INDENT); soap_register_plugin(soap, soap_wsa); soap_register_plugin(soap, soap_wsrm); soap->send_timeout = soap->recv_timeout = 10; // 10 sec soap_set_mode(callback.soap, SOAP_XML_INDENT); soap_register_plugin(callback.soap, soap_wsa); soap_register_plugin(callback.soap, soap_wsrm); callback.soap->send_timeout = callback.soap->recv_timeout = 10; // 10 sec result = 0.0; equation.str(""); equation << 0.0; } ~Service() { destroy(); callback.destroy(); } int start(int port); int Clear(_mssadh__Clear*); int AddTo(_mssadh__AddTo*); int SubtractFrom(_mssadh__SubtractFrom*); int MultiplyBy(_mssadh__MultiplyBy*); int DivideBy(_mssadh__DivideBy*); }; class Client : public WSDualHttpBinding_USCOREICalculatorDuplexProxy { private: WSDualHttpBinding_USCOREICalculatorDuplexService callback; public: #ifdef CB_THREAD THREAD_TYPE tid; // callback service thread #endif Client(const char *serverURI) { soap_set_mode(soap, SOAP_XML_INDENT); soap_register_plugin(soap, soap_wsa); soap_register_plugin(soap, soap_wsrm); soap_endpoint = serverURI; soap->send_timeout = soap->recv_timeout = 10; // 10 sec soap_set_mode(callback.soap, SOAP_XML_INDENT); soap_register_plugin(callback.soap, soap_wsa); soap_register_plugin(callback.soap, soap_wsrm); callback.soap->send_timeout = callback.soap->recv_timeout = 10; // 10 sec callback.soap->bind_flags = SO_REUSEADDR; // allow immediate bind if (!soap_valid_socket(callback.bind(NULL, clientPort, 100))) { callback.soap_stream_fault(std::cerr); exit(1); } #ifdef CB_THREAD THREAD_CREATE(&tid, (void*(*)(void*))callback_server, (void*)&callback); #endif } ~Client() { destroy(); #ifdef CB_THREAD THREAD_JOIN(tid); #endif callback.destroy(); } int run(); int poll(int timeout); }; int main(int argc, char **argv) { // Command line argument? If yes, then run the service on a port if (argc >= 2) { int port = atoi(argv[1]); Service service; service.start(port); } else { Client client(serverURI); client.run(); } } int Client::run() { // Create a reliable messaging sequence handle for client-initiated session soap_wsrm_sequence_handle seq; xsd__duration expires = 30000; /* 30000 ms = 30 seconds to expire */ const char *id = soap_wsa_rand_uuid(soap); double n; int retry; printf("\n**** Creating the Sequence\n"); // Create session for in-order messaging, init sequence handle if (soap_wsrm_create_offer(soap, serverURI, clientURI, id, expires, NoDiscard, soap_wsa_rand_uuid(soap), &seq)) { soap_stream_fault(std::cerr); soap_wsrm_seq_free(soap, seq); return soap->error; } // poll 100 times for .1 second until created for (retry = 100; retry && !soap_wsrm_seq_created(soap, seq); retry--) { if (poll(-100000)) return soap->error; } if (!retry) { fprintf(stderr, "CANNOT CREATE SEQUENCE - SERVER NOT RESPONDING\n"); exit(1); } // Reliable messaging request message if (soap_wsrm_request_acks(soap, seq, soap_wsa_rand_uuid(soap), "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/AddTo")) { soap_stream_fault(std::cerr); return soap->error; } n = 3.14; _mssadh__AddTo addTo; addTo.n = &n; if (AddTo(&addTo) == SOAP_OK) std::cout << std::endl << "**** AddTo(" << *addTo.n << ")" << std::endl; else soap_stream_fault(std::cerr); destroy(); #ifndef CB_THREAD // callback polling: 500 ms polling cycle if (poll(-500000)) return soap->error; #endif // Reliable messaging request message if (soap_wsrm_request_acks(soap, seq, soap_wsa_rand_uuid(soap), "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/SubtractFrom")) { soap_stream_fault(std::cerr); return soap->error; } n = 1.41; _mssadh__SubtractFrom subtractFrom; subtractFrom.n = &n; if (SubtractFrom(&subtractFrom) == SOAP_OK) std::cout << std::endl << "**** SubtractFrom(" << *subtractFrom.n << ")" << std::endl; else soap_stream_fault(std::cerr); destroy(); #ifndef CB_THREAD // callback polling: 500 ms polling cycle if (poll(-500000)) return soap->error; #endif // Reliable messaging request message if (soap_wsrm_request_acks(soap, seq, soap_wsa_rand_uuid(soap), "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/Clear")) { soap_stream_fault(std::cerr); return soap->error; } _mssadh__Clear clear; if (Clear(&clear) == SOAP_OK) std::cout << std::endl << "**** Clear()" << std::endl; else soap_stream_fault(std::cerr); destroy(); #ifndef CB_THREAD // callback polling: 500 ms polling cycle if (poll(-500000)) return soap->error; #endif printf("\n**** Closing the Sequence\n"); if (soap_wsrm_close(soap, seq, soap_wsa_rand_uuid(soap))) { soap_stream_fault(std::cerr); soap_wsrm_seq_free(soap, seq); return soap->error; } for (retry = 30; retry; retry--) { // Receive more messages when last not yet received if (soap_wsrm_lastnum(seq) == 0) { #ifdef CB_THREAD // we want to pulse here to send acks for incoming messages to keep flow going soap_wsrm_pulse(soap, -500000); /* 500 ms */ #endif printf("\n**** Receiving Messages Until Last\n"); // callback polling or delay: 500 ms polling cycle if (poll(-500000)) return soap->error; } // Resend messages marked as non-acked (as an option) if (soap_wsrm_nack(seq)) { printf("\n**** Resending "SOAP_ULONG_FORMAT" Non-Acked Messages\n", soap_wsrm_nack(seq)); soap_wsrm_resend(soap, seq, 0, 0); /* 0 0 means full range of msg nums */ } } if (soap_wsrm_nack(seq) || soap_wsrm_lastnum(seq) == 0) { printf("\n**** Incomplete Sequence\n"); soap_wsrm_dump(soap, stdout); } printf("\n**** Terminating the Sequence\n"); // Termination fails if the server did not get all messages if (soap_wsrm_terminate(soap, seq, soap_wsa_rand_uuid(soap))) { soap_stream_fault(std::cerr); soap_wsrm_seq_free(soap, seq); return soap->error; } #ifdef CB_THREAD soap_wsrm_dump(soap, stdout); printf("\n**** Waiting for Callback Server to Terminate\n"); #endif // callback polling: 1 s polling cycle if (poll(1)) return soap->error; // Delete the reliable messaging session sequence (assuming no more inbound messages) soap_wsrm_seq_free(soap, seq); return 0; } /******************************************************************************\ * * Client-side callback polling * \******************************************************************************/ int Client::poll(int timeout) { #ifdef CB_THREAD // We leave the acceptance of messages to the callback server thread if (timeout < 0) timeout = 1; sleep(timeout); // but we want to wait some until these messages arrive #else callback.soap->accept_timeout = timeout; printf("\n**** Callback Polling\n"); while (soap_valid_socket(callback.accept())) { /* chain the WSRM operations after callback operations */ if (soap_begin_serve(callback.soap) == SOAP_OK) if (callback.dispatch() == SOAP_NO_METHOD) soap_serve_request(callback.soap); if (callback.soap->error) soap_send_fault(callback.soap); soap->error = callback.soap->error; callback.destroy(); if (soap->error && soap->error != SOAP_STOP) { soap_stream_fault(std::cerr); return soap->error; } soap_wsrm_dump(callback.soap, stdout); } #endif return SOAP_OK; } /******************************************************************************\ * * Optional Client-Side Threaded Callback Server * \******************************************************************************/ #ifdef CB_THREAD void *callback_server(void *ctx) { WSDualHttpBinding_USCOREICalculatorDuplexService *callback = (WSDualHttpBinding_USCOREICalculatorDuplexService*)ctx; THREAD_TYPE tid; callback->soap->accept_timeout = 30; /* server quits after 30 seconds of inactivity */ printf("\n**** Callback Server Running\n"); while (soap_valid_socket(callback->accept())) THREAD_CREATE(&tid, (void*(*)(void*))callback_thread, (void*)callback->copy()); printf("\n**** Callback Server Terminated\n"); return NULL; } void *callback_thread(void *ctx) { WSDualHttpBinding_USCOREICalculatorDuplexService *callback = (WSDualHttpBinding_USCOREICalculatorDuplexService*)ctx; THREAD_DETACH(THREAD_ID); /* chain the WSRM operations after callback operations */ if (soap_begin_serve(callback->soap) == SOAP_OK) if (callback->dispatch() == SOAP_NO_METHOD) soap_serve_request(callback->soap); if (callback->soap->error) soap_send_fault(callback->soap); if (callback->soap->error != SOAP_STOP && callback->soap->error != SOAP_EOF) callback->soap_stream_fault(std::cerr); else if (callback->soap->error != SOAP_EOF || callback->soap->errnum) soap_wsrm_dump(callback->soap, stdout); callback->destroy(); delete callback; return NULL; } #endif /******************************************************************************\ * * Client-side callback operations via callback polling service * \******************************************************************************/ int WSDualHttpBinding_USCOREICalculatorDuplexService::Result(_mssadh__Result *req) { /* check for WS-RM/WSA, send empty response (this is a one-way operation over HTTP) */ if (soap_wsrm_check_send_empty_response_and_wait(soap, CB_WAIT)) return soap->error; if (req->result) std::cout << std::endl << "**** Result(" << *req->result << ")" << std::endl; return SOAP_OK; } int WSDualHttpBinding_USCOREICalculatorDuplexService::Equation(_mssadh__Equation *req) { /* check for WS-RM/WSA, send empty response (this is a one-way operation over HTTP) */ if (soap_wsrm_check_send_empty_response_and_wait(soap, CB_WAIT)) return soap->error; if (req->eqn) std::cout << std::endl << "**** Equation(" << *req->eqn << ")" << std::endl; return SOAP_OK; } /******************************************************************************\ * * Service operations * \******************************************************************************/ int Service::start(int port) { if (!soap_valid_socket(bind(NULL, port, 100))) { soap_stream_fault(std::cerr); exit(1); } std::cerr << "Server Running" << std::endl; /* optional: set accept timeout to pulse acks every 500 ms, see below */ soap->accept_timeout = -500000; for (;;) { if (soap_valid_socket(accept())) { /* with iterative servers asynchronous messaging deadlock scenarios exist! */ /* chain the WSRM service operations after the main service operations */ if (soap_begin_serve(soap) == SOAP_OK) if (dispatch() == SOAP_NO_METHOD) soap_serve_request(soap); if (soap->error) soap_send_fault(soap); if (soap->error && soap->error != SOAP_STOP) soap_stream_fault(std::cerr); destroy(); callback.destroy(); soap_wsrm_dump(soap, stdout); } else { /* error or timeout? */ if (soap->errnum) { soap_stream_fault(std::cerr); exit(1); } /* timeout occurs after 1 sec */ /* send acks to peers (optional), 10 ms per message timeout */ soap_wsrm_pulse(soap, -10000); /* 10 ms */ } } return SOAP_OK; } int Service::Clear(_mssadh__Clear *req) { /* check for WS-RM/WSA, send empty response (this is a one-way operation over HTTP) */ if (soap_wsrm_check_send_empty_response(soap)) return soap->error; /* get the handle to the current sequence of the inbound message */ soap_wsrm_sequence_handle seq = soap_wsrm_seq(soap); /* TODO: send acknowledgement(s) immediately? */ /* soap_wsrm_acknowledgement(soap, seq, NULL); */ if (soap_wsrm_request_acks(callback.soap, seq, soap_wsa_rand_uuid(callback.soap), "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/Equation")) { callback.soap_stream_fault(std::cerr); soap_wsrm_seq_release(soap, seq); return callback.soap->error; } callback.soap_endpoint = soap_wsrm_to(seq); soap_wsrm_seq_release(soap, seq); equation << " = " << result; if (callback.soap_endpoint) { _mssadh__Equation eqn; std::string s = equation.str(); eqn.eqn = &s; if (callback.Equation(&eqn) == SOAP_OK) std::cout << "Equation(" << s << ")" << std::endl; else callback.soap_stream_fault(std::cerr); } callback.destroy(); result = 0.0; equation.str(""); equation << 0.0; return SOAP_OK; } int Service::AddTo(_mssadh__AddTo *req) { /* check for WS-RM/WSA */ if (soap_wsrm_check(soap)) return soap->error; if (req && req->n) { result += *req->n; equation << " + " << *req->n; } else return soap_wsrm_sender_fault(soap, "Invalid data in AddTo", NULL); /* this is a one-way operation over HTTP, so we're done with client */ soap_send_empty_response(soap, 202); /* get the handle to the current sequence of the inbound message */ soap_wsrm_sequence_handle seq = soap_wsrm_seq(soap); /* TODO: send acknowledgement(s) immediately? */ /* soap_wsrm_acknowledgement(soap, seq, NULL); */ if (soap_wsrm_request_acks(callback.soap, seq, soap_wsa_rand_uuid(callback.soap), "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/Result")) { callback.soap_stream_fault(std::cerr); soap_wsrm_seq_release(soap, seq); return callback.soap->error; } callback.soap_endpoint = soap_wsrm_to(seq); soap_wsrm_seq_release(soap, seq); if (callback.soap_endpoint) { _mssadh__Result res; res.result = &result; if (callback.Result(&res) == SOAP_OK) std::cout << "Result(" << result << ")" << std::endl; else callback.soap_stream_fault(std::cerr); } callback.destroy(); return SOAP_OK; } int Service::SubtractFrom(_mssadh__SubtractFrom *req) { /* check for WS-RM/WSA */ if (soap_wsrm_check(soap)) return soap->error; if (req && req->n) { result -= *req->n; equation << " - " << *req->n; } else return soap_wsrm_sender_fault(soap, "Invalid data in SubtractFrom", NULL); /* this is a one-way operation over HTTP, so we're done with client */ soap_send_empty_response(soap, 202); /* get the handle to the current sequence of the inbound message */ soap_wsrm_sequence_handle seq = soap_wsrm_seq(soap); /* TODO: send acknowledgement(s) immediately? */ /* soap_wsrm_acknowledgement(soap, seq, NULL); */ if (soap_wsrm_request_acks(callback.soap, seq, soap_wsa_rand_uuid(callback.soap), "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/Result")) { callback.soap_stream_fault(std::cerr); soap_wsrm_seq_release(soap, seq); return callback.soap->error; } callback.soap_endpoint = soap_wsrm_to(seq); soap_wsrm_seq_release(soap, seq); if (callback.soap_endpoint) { _mssadh__Result res; res.result = &result; if (callback.Result(&res) == SOAP_OK) std::cout << "Result(" << result << ")" << std::endl; else callback.soap_stream_fault(std::cerr); } callback.destroy(); return SOAP_OK; } int Service::MultiplyBy(_mssadh__MultiplyBy *req) { /* check for WS-RM/WSA */ if (soap_wsrm_check(soap)) return soap->error; if (req && req->n) { result *= *req->n; equation << " * " << *req->n; } else return soap_wsrm_sender_fault(soap, "Invalid data in MultiplyBy", NULL); /* this is a one-way operation over HTTP, so we're done with client */ soap_send_empty_response(soap, 202); /* get the handle to the current sequence of the inbound message */ soap_wsrm_sequence_handle seq = soap_wsrm_seq(soap); /* TODO: send acknowledgement(s) immediately? */ /* soap_wsrm_acknowledgement(soap, seq, NULL); */ if (soap_wsrm_request_acks(callback.soap, seq, soap_wsa_rand_uuid(callback.soap), "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/Result")) { callback.soap_stream_fault(std::cerr); soap_wsrm_seq_release(soap, seq); return callback.soap->error; } callback.soap_endpoint = soap_wsrm_to(seq); soap_wsrm_seq_release(soap, seq); if (callback.soap_endpoint) { _mssadh__Result res; res.result = &result; if (callback.Result(&res) == SOAP_OK) std::cout << "Result(" << result << ")" << std::endl; else callback.soap_stream_fault(std::cerr); } callback.destroy(); return SOAP_OK; } int Service::DivideBy(_mssadh__DivideBy *req) { /* check for WS-RM/WSA */ if (soap_wsrm_check(soap)) return soap->error; if (req && req->n) { result /= *req->n; equation << " / " << *req->n; } else return soap_wsrm_sender_fault(soap, "Invalid data in DivideBy", NULL); /* this is a one-way operation over HTTP, so we're done with client */ soap_send_empty_response(soap, 202); /* get the handle to the current sequence of the inbound message */ soap_wsrm_sequence_handle seq = soap_wsrm_seq(soap); /* TODO: send acknowledgement(s) immediately? */ /* soap_wsrm_acknowledgement(soap, seq, NULL); */ if (soap_wsrm_request_acks(callback.soap, seq, soap_wsa_rand_uuid(callback.soap), "http://Microsoft.Samples.DualHttp/ICalculatorDuplex/Result")) { callback.soap_stream_fault(std::cerr); soap_wsrm_seq_release(soap, seq); return callback.soap->error; } callback.soap_endpoint = soap_wsrm_to(seq); soap_wsrm_seq_release(soap, seq); if (callback.soap_endpoint) { _mssadh__Result res; res.result = &result; if (callback.send_Result(&res) == SOAP_OK) std::cout << "Result(" << result << ")" << std::endl; else callback.soap_stream_fault(std::cerr); } callback.destroy(); return SOAP_OK; } /******************************************************************************\ * * Catch and Report the SOAP Faults Sent by Peer * \******************************************************************************/ int SOAP_ENV__Fault(struct soap *soap, _QName faultcode, // SOAP 1.1 char *faultstring, // SOAP 1.1 char *faultactor, // SOAP 1.1 struct SOAP_ENV__Detail *detail, // SOAP 1.1 struct SOAP_ENV__Code *Code, // SOAP 1.2 struct SOAP_ENV__Reason *Reason, // SOAP 1.2 char *Node, // SOAP 1.2 char *Role, // SOAP 1.2 struct SOAP_ENV__Detail *Detail // SOAP 1.2 ) { soap_send_empty_response(soap, 202); printf("\n**** Fault Received ****\n"); if (faultstring) printf("reason: %s\n", faultstring); else if (Reason && Reason->SOAP_ENV__Text) printf("reason: %s\n", Reason->SOAP_ENV__Text); if (!detail) detail = Detail; if (detail && detail->__type == SOAP_TYPE__wsrm__Identifier) { /* the sequence id is in the Fault Detail __type and fault members */ char *id = (char*)detail->fault; printf("id: %s\n", id); /* we opt to treat all faults fatal, so let's terminate the sequence */ soap_wsrm_sequence_handle seq = soap_wsrm_seq_lookup_id(soap, id); if (seq) { soap_wsrm_error(soap, seq, wsrm__SequenceTerminated); soap_wsrm_seq_release(soap, seq); return soap->error; } } return SOAP_OK; } /******************************************************************************\ * * Base Service operations (inactive) * \******************************************************************************/ /* These service methods are defined to avoid vtable linking errors. A more elegant alternative is to compile all code with #define SOAP_PURE_VIRTUAL = NULL which makes all base service operations pure virtual (abstract) */ int WSDualHttpBinding_USCOREICalculatorDuplexService::Clear(_mssadh__Clear *req) { return SOAP_NO_METHOD; } int WSDualHttpBinding_USCOREICalculatorDuplexService::AddTo(_mssadh__AddTo *req) { return SOAP_NO_METHOD; } int WSDualHttpBinding_USCOREICalculatorDuplexService::SubtractFrom(_mssadh__SubtractFrom *req) { return SOAP_NO_METHOD; } int WSDualHttpBinding_USCOREICalculatorDuplexService::MultiplyBy(_mssadh__MultiplyBy *req) { return SOAP_NO_METHOD; } int WSDualHttpBinding_USCOREICalculatorDuplexService::DivideBy(_mssadh__DivideBy *req) { return SOAP_NO_METHOD; } gsoap-2.8.91/gsoap/samples/wcf/WS/DualHttp/README.txt0000644000175000017500000001256213525245163021410 0ustar ellertellertINSTRUCTIONS Install the WCF samples by downloading the "Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4." from the Microsoft download site (you may have to search). You should have: C:\WF_WCF_Samples\WCF\Basic\Binding\WS\DualHttp\CS Open the WS DualHttp WCF C# example client and service project in Visual Studio. Modify the configuration and source code as described below. Notes: C:> denotes the Windows command line $ denotes the Unix/Linux command line A pre-generated calculator.h gSOAP example file is included, which was generated by wsdl2h -b from the WCF's calculator service WSDL file. Use wsdl2h option -b (option /b with wsdl2h.exe) to enable duplex WS-RM and generate additional bi-directional one-way operations that are required for asynchronous request-response operations by client-side callback services (duplex mode). To enable gSOAP to use WS-ReliableMessaging 1.0 (2005) for wsDualHttp interop, we added the following line to calculator.h, which is processed by soapcpp2: #import "wsrm5.h" Note that "wsrm.h" defines WS-ReliableMessaging 1.1, but WCF supports the older 2005 version 1.0. See doc/wsrm on WS-RM plugin usage. The Makefile builds the WS-RM logic and then the app logic with soapcpp2: $ soapcpp2 -L -I../../../../import -I../../../.. -A -pwsrx ../../../../import/wsrm5.h $ soapcpp2 -L -I../../../../import -I../../../.. -a -j calculator.h $ cc -o calculator -DCB_THREAD -DWITH_WCF -DWITH_OPENSSL calculator.cpp soapC.cpp soapWSDualHttpBinding_USCOREICalculatorDuplexService.cpp soapWSDualHttpBinding_USCOREICalculatorDuplexProxy.cpp wsrxClient.cpp wsrxServer.cpp ../../../../plugin/wsrmapi.c ../../../../plugin/wsaapi.c ../../../../custom/duration.c ../../../../dom.cpp ../../../../stdsoap2.cpp The -DWITH_WCF def ensures WS-RM plugin compatibility with WCF. To enable the gSOAP client-side threaded callback server, use -DCB_THREAD. Debugging is enabled with -DDEBUG or -DDEBUG_STAMP to timestamp the logs. To connect a WCF client to a gSOAP service ------------------------------------------ In App.config set the endpoint to the server endpoint, say "10.0.1.5" over wifi, with Message Security disabled, and clientBase (for callback calls) to the current machine, say 192.168.2.2: Edit calculator.cpp to change the URIs: Compile and run the gSOAP server on port 8000 on machine "10.0.1.5": $ ./calculator 8000 Compile and run the WCF client: C:\WF_WCF_Samples\WCF\Basic\Binding\WS\DualHttp\CS\client> bin\client.exe The gSOAP server in this example is an iterative server. Therefore, SOAP_IO_KEEPALIVE is not recommended since this leads to messages being blocked on the server port. To self-host a WCF service -------------------------- Obtain the machine name or IP C:> ipconfig /all say it is 192.168.2.2. Add a Program class with Main() to the WCF sample to self host a service: C:\WF_WCF_Samples\WCF\Basic\Binding\WS\DualHttp\CS\service with the following Program class put in the namespace: using System; using System.ServiceModel; using System.Configuration; using System.ServiceModel.Description; namespace ... { ... public class Program { public static void Main() { Uri httpUrl = new Uri("http://192.168.2.2:8000/ServiceModelSamples/service"); using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), httpUrl)) { WSDualHttpBinding dhb = new WSDualHttpBinding(); dhb.Security.Mode = WSDualHttpSecurityMode.None; serviceHost.AddServiceEndpoint(typeof(ICalculatorDuplex), dhb, ""); ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; serviceHost.Description.Behaviors.Add(smb); serviceHost.Open(); Console.WriteLine("Press to terminate service."); Console.ReadLine(); } } } Under Project Properties change the Output type to Console Application to generate a service.exe. Compile and run the WCF service: C:\WF_WCF_Samples\WCF\Basic\Binding\WS\DualHttp\CS\service> bin\service.exe Use a web browser to access the service at http://192.168.2.2:8000/ServiceModelSamples/service and access the WSDL at http://192.168.2.2:8000/ServiceModelSamples/service?wsdl To run wsdl2h to generate C++ code: $ wsdl2h -b -t ../../../../typemap.dat -o calculator.h 'http://192.168.2.2:8000/ServiceModelSamples/service?wsdl' This may take some time, since the self-hosted service is an iterative web server that allows only one open connection. A pre-generated calculator.h file is included in the build directory. Note that WCF supports WS-ReliableMessaging 1.0 (2005) so we changed calculator.h as follows: #import "wsrm.h" to #import "wsrm5.h" To connect a gSOAP client to a WCF self-hosted service ------------------------------------------------------ In the gSOAP calculator.cpp, change the hosts to the WCF server host URI and the client host URI and port number: const char *serverURI = "http://192.168.2.2:8000/ServiceModelSamples/service"; const char *clientURI = "http://10.0.1.5:8001"; int clientPort = 8001; Compile and run: C:\WF_WCF_Samples\WCF\Basic\Binding\WS\DualHttp\CS\service> bin\service.exe $ ./calculator gsoap-2.8.91/gsoap/samples/wcf/Basic/0000755000175000017500000000000013525564140016646 5ustar ellertellertgsoap-2.8.91/gsoap/samples/wcf/Basic/MessageSecurity/0000755000175000017500000000000013525245163021763 5ustar ellertellertgsoap-2.8.91/gsoap/samples/wcf/Basic/MessageSecurity/servercertWCF.pem0000755000175000017500000000134013525245163025213 0ustar ellertellertBag Attributes localKeyID: 01 00 00 00 subject=/CN=10.0.1.5 issuer=/CN=Root Agency -----BEGIN CERTIFICATE----- MIIBsDCCAV6gAwIBAgIQi65mfnzMd7FImSdgjiZmeTAJBgUrDgMCHQUAMBYxFDAS BgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTEyMDYwMzAxMDAwM1oXDTM5MTIzMTIzNTk1 OVowEzERMA8GA1UEAxMIMTAuMC4xLjUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBANEk3zsPY0C1U32aiUejqIwP2KFnXrIB2mLfbPHs4vRh768FiY3Olr05x1bo nAVTei0ZAIv813bZ+E9EdP2JFXOTbqwb+UAWefLRjpKNQJC+BP5gH2c+472vFgmO iSc+sCncSbn3WqMt9AFrPJinA0d3/4vQ8c46eTN0vF3T8s17AgMBAAGjSzBJMEcG A1UdAQRAMD6AEBLkCS0GHR1PAI1hIdwWZGOhGDAWMRQwEgYDVQQDEwtSb290IEFn ZW5jeYIQBjdsAKoAZIoRz7jUqlw19DAJBgUrDgMCHQUAA0EAAicd/NhTpJx0uXFJ iSM7xbDkaRlevdy2uBhjgHY0qgGJxFU+O/wpx2/xUowJXmyb1IDVpS5CD7loqGK9 bX7hGw== -----END CERTIFICATE----- gsoap-2.8.91/gsoap/samples/wcf/Basic/MessageSecurity/calculator.h0000644000175000017500000011723413525245163024275 0ustar ellertellert// Reminder: Modify typemap.dat to customize the header file generated by wsdl2h /* calculator.h Generated by wsdl2h 2.8.9 from http://192.168.2.2:8000/ServiceModelSamples/service?wsdl and ../../typemap.dat 2012-05-23 00:15:28 GMT DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS USE THE soapcpp2-GENERATED SOURCE CODE FILES FOR YOUR PROJECT BUILDS gSOAP XML Web services tools. Copyright (C) 2001-2012 Robert van Engelen, Genivia Inc. All Rights Reserved. Part of this software is released under one of the following licenses: GPL or Genivia's license for commercial use. */ /** @page page_notes Usage Notes NOTE: - Run soapcpp2 on calculator.h to generate the SOAP/XML processing logic. Use soapcpp2 option -I to specify paths for #import To build with STL, 'stlvector.h' is imported from 'import' dir in package. Use soapcpp2 option -i to generate improved proxy and server classes. - 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) on this file to generate documentation. - Use wsdl2h options -nname and -Nname to globally rename the prefix 'ns'. - Use wsdl2h option -d to enable DOM support for xsd:anyType. - Use wsdl2h option -g to auto-generate readers and writers for root elements. - Struct/class members serialized as XML attributes are annotated with a '@'. - Struct/class members that have a special role are annotated with a '$'. WARNING: DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS. USE THE SOURCE CODE FILES GENERATED BY soapcpp2 FOR YOUR PROJECT BUILDS: THE soapStub.h FILE CONTAINS THIS CONTENT WITHOUT ANNOTATIONS. LICENSE: @verbatim -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following two licenses: 1) GPL or 2) Genivia's license for commercial use. -------------------------------------------------------------------------------- 1) 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. -------------------------------------------------------------------------------- 2) A commercial-use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- @endverbatim */ //gsoapopt w /******************************************************************************\ * * * Definitions * * http://tempuri.org/ * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ // STL vector containers (use option -s to remove STL dependency) #import "stlvector.h" /******************************************************************************\ * * * 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: tempuri = "http://tempuri.org/" mssammi = "http://Microsoft.Samples.MessageSecurity/Imports" mssamm = "http://Microsoft.Samples.MessageSecurity" */ #define SOAP_NAMESPACE_OF_mssammi "http://Microsoft.Samples.MessageSecurity/Imports" //gsoap mssammi schema namespace: http://Microsoft.Samples.MessageSecurity/Imports //gsoap mssammi schema form: unqualified #define SOAP_NAMESPACE_OF_mssamm "http://Microsoft.Samples.MessageSecurity" //gsoap mssamm schema namespace: http://Microsoft.Samples.MessageSecurity //gsoap mssamm schema elementForm: qualified //gsoap mssamm schema attributeForm: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ /******************************************************************************\ * * * Forward Declarations * * * \******************************************************************************/ // Forward declaration of class _mssamm__Add. class _mssamm__Add; // Forward declaration of class _mssamm__AddResponse. class _mssamm__AddResponse; // Forward declaration of class _mssamm__Subtract. class _mssamm__Subtract; // Forward declaration of class _mssamm__SubtractResponse. class _mssamm__SubtractResponse; // Forward declaration of class _mssamm__Multiply. class _mssamm__Multiply; // Forward declaration of class _mssamm__MultiplyResponse. class _mssamm__MultiplyResponse; // Forward declaration of class _mssamm__Divide. class _mssamm__Divide; // Forward declaration of class _mssamm__DivideResponse. class _mssamm__DivideResponse; /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://Microsoft.Samples.MessageSecurity/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://Microsoft.Samples.MessageSecurity * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://Microsoft.Samples.MessageSecurity/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://Microsoft.Samples.MessageSecurity * * * \******************************************************************************/ /// Top-level root element "http://Microsoft.Samples.MessageSecurity":Add /// "http://Microsoft.Samples.MessageSecurity":Add is a complexType. class _mssamm__Add { public: /// Element n1 of type xs:double. double* n1 0; ///< Optional element. /// Element n2 of type xs:double. double* n2 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.MessageSecurity":AddResponse /// "http://Microsoft.Samples.MessageSecurity":AddResponse is a complexType. class _mssamm__AddResponse { public: /// Element AddResult of type xs:double. double* AddResult 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.MessageSecurity":Subtract /// "http://Microsoft.Samples.MessageSecurity":Subtract is a complexType. class _mssamm__Subtract { public: /// Element n1 of type xs:double. double* n1 0; ///< Optional element. /// Element n2 of type xs:double. double* n2 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.MessageSecurity":SubtractResponse /// "http://Microsoft.Samples.MessageSecurity":SubtractResponse is a complexType. class _mssamm__SubtractResponse { public: /// Element SubtractResult of type xs:double. double* SubtractResult 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.MessageSecurity":Multiply /// "http://Microsoft.Samples.MessageSecurity":Multiply is a complexType. class _mssamm__Multiply { public: /// Element n1 of type xs:double. double* n1 0; ///< Optional element. /// Element n2 of type xs:double. double* n2 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.MessageSecurity":MultiplyResponse /// "http://Microsoft.Samples.MessageSecurity":MultiplyResponse is a complexType. class _mssamm__MultiplyResponse { public: /// Element MultiplyResult of type xs:double. double* MultiplyResult 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.MessageSecurity":Divide /// "http://Microsoft.Samples.MessageSecurity":Divide is a complexType. class _mssamm__Divide { public: /// Element n1 of type xs:double. double* n1 0; ///< Optional element. /// Element n2 of type xs:double. double* n2 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.MessageSecurity":DivideResponse /// "http://Microsoft.Samples.MessageSecurity":DivideResponse is a complexType. class _mssamm__DivideResponse { public: /// Element DivideResult of type xs:double. double* DivideResult 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /******************************************************************************\ * * * Additional Top-Level Elements * * http://Microsoft.Samples.MessageSecurity/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * http://Microsoft.Samples.MessageSecurity/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Elements * * http://Microsoft.Samples.MessageSecurity * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * http://Microsoft.Samples.MessageSecurity * * * \******************************************************************************/ /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap tempuri service name: BasicHttpBinding_USCOREICalculator //gsoap tempuri service type: ICalculator //gsoap tempuri service port: http://192.168.2.2:8000/ServiceModelSamples/service //gsoap tempuri service namespace: http://tempuri.org/ //gsoap tempuri service transport: http://schemas.xmlsoap.org/soap/http /** @mainpage CalculatorService Definitions @section CalculatorService_bindings Service Bindings - @ref BasicHttpBinding_USCOREICalculator @section CalculatorService_more More Information - @ref page_notes "Usage Notes" - @ref page_XMLDataBinding "XML Data Binding" - @ref SOAP_ENV__Header "SOAP Header Content" (when applicable) - @ref SOAP_ENV__Detail "SOAP Fault Detail Content" (when applicable) */ /** @page BasicHttpBinding_USCOREICalculator Binding "BasicHttpBinding_USCOREICalculator" @section BasicHttpBinding_USCOREICalculator_operations Operations of Binding "BasicHttpBinding_USCOREICalculator" - @ref __tempuri__Add - @ref __tempuri__Subtract - @ref __tempuri__Multiply - @ref __tempuri__Divide @section BasicHttpBinding_USCOREICalculator_ports Endpoints of Binding "BasicHttpBinding_USCOREICalculator" - http://192.168.2.2:8000/ServiceModelSamples/service @section BasicHttpBinding_USCOREICalculator_policy Policy of Binding "BasicHttpBinding_USCOREICalculator" See Section @ref BasicHttpBinding_USCOREICalculator_policy_enablers - WS-Policy applicable to the service endpoint ports: - Exactly one of the following: - All of the following: - [7.5] WS-Security Asymmetric Binding (public key) requirements: - [7.1] Security Binding Algorithm Suite requirements: - Basic256 - [7.2] WS-Security Header Layout requirements: - WS-Security headers may occur in any order (gSOAP allows this) - Initiator requirements: - [5.4.3] WS-Security X509 required: -# IncludeToken = http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient - An X509 Version 3 token should be used as defined in X509TokenProfile1.0 - Recipient requirements: - [5.4.3] WS-Security X509 required: -# IncludeToken = http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/Never - An X509 Version 3 token should be used as defined in X509TokenProfile1.0 - WS-Security Timestamp should be set prior to send: @code #include "plugin/wsseapi.h" soap_wsse_add_Timestamp(soap, "Timestamp", ); @endcode - WS-Security Timestamp presence and expiration verified post-receive with: @code #include "plugin/wsseapi.h" if (soap_wsse_verify_Timestamp(soap)) ...... @endcode - WS-Security Encrypt Signature @code #include "plugin/wsseapi.h" soap_wsse_add_EncryptedKey_encrypt_only(soap, , NULL, , NULL, , , "ds:Signature SOAP-ENV:Body"); @endcode - WS-Security Sign Entire Headers and Body: @code #include "plugin/wsseapi.h" soap_wsse_set_wsu_id(soap, " ..."); // list each ns:tagname used in SOAP Header soap_wsse_sign_body(soap, , , ); @endcode - [9.1] WSS: SOAP Message Security 1.0 options: - Key Identifier References - Issuer Serial References Note: use wsdl2h option -N to change the service binding prefix name */ /******************************************************************************\ * * * Service Binding * * BasicHttpBinding_USCOREICalculator * * * \******************************************************************************/ /******************************************************************************\ * * * Service Operation * * __tempuri__Add * * * \******************************************************************************/ /// Operation "__tempuri__Add" of service binding "BasicHttpBinding_USCOREICalculator" /** Operation details: - WS-Policy applicable to the request message: - Exactly one of the following: - All of the following: - [4.1.1] WS-Security Signed Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_sign_body(soap, , , ); @endcode - [4.2.1] Security Encrypted Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_encrypt_body(soap, , , ); @endcode - WS-Policy applicable to the response message: - Exactly one of the following: - All of the following: - [4.1.1] WS-Security Signed Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_sign_body(soap, , , ); @endcode - [4.2.1] Security Encrypted Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_encrypt_body(soap, , , ); @endcode - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.MessageSecurity/ICalculator/Add" - Addressing method action: "http://tempuri.org//ICalculator/Add" - Addressing method output action: "http://tempuri.org//ICalculator/AddResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___tempuri__Add( 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: _mssamm__Add* mssamm__Add, // response parameters: _mssamm__AddResponse* mssamm__AddResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Add( struct soap *soap, // request parameters: _mssamm__Add* mssamm__Add, // response parameters: _mssamm__AddResponse* mssamm__AddResponse ); @endcode C++ proxy class (defined in soapBasicHttpBinding_USCOREICalculatorProxy.h): @code class BasicHttpBinding_USCOREICalculatorProxy; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapBasicHttpBinding_USCOREICalculatorService.h): @code class BasicHttpBinding_USCOREICalculatorService; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Add document //gsoap tempuri service method-encoding: Add literal //gsoap tempuri service method-action: Add http://Microsoft.Samples.MessageSecurity/ICalculator/Add //gsoap tempuri service method-output-action: Add http://tempuri.org//ICalculator/AddResponse int __tempuri__Add( _mssamm__Add* mssamm__Add, ///< Request parameter _mssamm__AddResponse* mssamm__AddResponse ///< Response parameter ); /******************************************************************************\ * * * Service Operation * * __tempuri__Subtract * * * \******************************************************************************/ /// Operation "__tempuri__Subtract" of service binding "BasicHttpBinding_USCOREICalculator" /** Operation details: - WS-Policy applicable to the request message: - Exactly one of the following: - All of the following: - [4.1.1] WS-Security Signed Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_sign_body(soap, , , ); @endcode - [4.2.1] Security Encrypted Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_encrypt_body(soap, , , ); @endcode - WS-Policy applicable to the response message: - Exactly one of the following: - All of the following: - [4.1.1] WS-Security Signed Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_sign_body(soap, , , ); @endcode - [4.2.1] Security Encrypted Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_encrypt_body(soap, , , ); @endcode - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.MessageSecurity/ICalculator/Subtract" - Addressing method action: "http://tempuri.org//ICalculator/Subtract" - Addressing method output action: "http://tempuri.org//ICalculator/SubtractResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___tempuri__Subtract( 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: _mssamm__Subtract* mssamm__Subtract, // response parameters: _mssamm__SubtractResponse* mssamm__SubtractResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Subtract( struct soap *soap, // request parameters: _mssamm__Subtract* mssamm__Subtract, // response parameters: _mssamm__SubtractResponse* mssamm__SubtractResponse ); @endcode C++ proxy class (defined in soapBasicHttpBinding_USCOREICalculatorProxy.h): @code class BasicHttpBinding_USCOREICalculatorProxy; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapBasicHttpBinding_USCOREICalculatorService.h): @code class BasicHttpBinding_USCOREICalculatorService; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Subtract document //gsoap tempuri service method-encoding: Subtract literal //gsoap tempuri service method-action: Subtract http://Microsoft.Samples.MessageSecurity/ICalculator/Subtract //gsoap tempuri service method-output-action: Subtract http://tempuri.org//ICalculator/SubtractResponse int __tempuri__Subtract( _mssamm__Subtract* mssamm__Subtract, ///< Request parameter _mssamm__SubtractResponse* mssamm__SubtractResponse ///< Response parameter ); /******************************************************************************\ * * * Service Operation * * __tempuri__Multiply * * * \******************************************************************************/ /// Operation "__tempuri__Multiply" of service binding "BasicHttpBinding_USCOREICalculator" /** Operation details: - WS-Policy applicable to the request message: - Exactly one of the following: - All of the following: - [4.1.1] WS-Security Signed Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_sign_body(soap, , , ); @endcode - [4.2.1] Security Encrypted Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_encrypt_body(soap, , , ); @endcode - WS-Policy applicable to the response message: - Exactly one of the following: - All of the following: - [4.1.1] WS-Security Signed Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_sign_body(soap, , , ); @endcode - [4.2.1] Security Encrypted Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_encrypt_body(soap, , , ); @endcode - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.MessageSecurity/ICalculator/Multiply" - Addressing method action: "http://tempuri.org//ICalculator/Multiply" - Addressing method output action: "http://tempuri.org//ICalculator/MultiplyResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___tempuri__Multiply( 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: _mssamm__Multiply* mssamm__Multiply, // response parameters: _mssamm__MultiplyResponse* mssamm__MultiplyResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Multiply( struct soap *soap, // request parameters: _mssamm__Multiply* mssamm__Multiply, // response parameters: _mssamm__MultiplyResponse* mssamm__MultiplyResponse ); @endcode C++ proxy class (defined in soapBasicHttpBinding_USCOREICalculatorProxy.h): @code class BasicHttpBinding_USCOREICalculatorProxy; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapBasicHttpBinding_USCOREICalculatorService.h): @code class BasicHttpBinding_USCOREICalculatorService; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Multiply document //gsoap tempuri service method-encoding: Multiply literal //gsoap tempuri service method-action: Multiply http://Microsoft.Samples.MessageSecurity/ICalculator/Multiply //gsoap tempuri service method-output-action: Multiply http://tempuri.org//ICalculator/MultiplyResponse int __tempuri__Multiply( _mssamm__Multiply* mssamm__Multiply, ///< Request parameter _mssamm__MultiplyResponse* mssamm__MultiplyResponse ///< Response parameter ); /******************************************************************************\ * * * Service Operation * * __tempuri__Divide * * * \******************************************************************************/ /// Operation "__tempuri__Divide" of service binding "BasicHttpBinding_USCOREICalculator" /** Operation details: - WS-Policy applicable to the request message: - Exactly one of the following: - All of the following: - [4.1.1] WS-Security Signed Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_sign_body(soap, , , ); @endcode - [4.2.1] Security Encrypted Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_encrypt_body(soap, , , ); @endcode - WS-Policy applicable to the response message: - Exactly one of the following: - All of the following: - [4.1.1] WS-Security Signed Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_sign_body(soap, , , ); @endcode - [4.2.1] Security Encrypted Parts requirements: -# Body: @code #include "plugin/wsseapi.h" soap_wsse_encrypt_body(soap, , , ); @endcode - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.MessageSecurity/ICalculator/Divide" - Addressing method action: "http://tempuri.org//ICalculator/Divide" - Addressing method output action: "http://tempuri.org//ICalculator/DivideResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___tempuri__Divide( 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: _mssamm__Divide* mssamm__Divide, // response parameters: _mssamm__DivideResponse* mssamm__DivideResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Divide( struct soap *soap, // request parameters: _mssamm__Divide* mssamm__Divide, // response parameters: _mssamm__DivideResponse* mssamm__DivideResponse ); @endcode C++ proxy class (defined in soapBasicHttpBinding_USCOREICalculatorProxy.h): @code class BasicHttpBinding_USCOREICalculatorProxy; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapBasicHttpBinding_USCOREICalculatorService.h): @code class BasicHttpBinding_USCOREICalculatorService; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Divide document //gsoap tempuri service method-encoding: Divide literal //gsoap tempuri service method-action: Divide http://Microsoft.Samples.MessageSecurity/ICalculator/Divide //gsoap tempuri service method-output-action: Divide http://tempuri.org//ICalculator/DivideResponse int __tempuri__Divide( _mssamm__Divide* mssamm__Divide, ///< Request parameter _mssamm__DivideResponse* mssamm__DivideResponse ///< Response parameter ); /** @page BasicHttpBinding_USCOREICalculator Binding "BasicHttpBinding_USCOREICalculator" @section BasicHttpBinding_USCOREICalculator_policy_enablers Policy Enablers of Binding "BasicHttpBinding_USCOREICalculator" Based on policies, this service imports wsse.h - WS-Policy reminders and enablers: - WS-Addressing 1.0 (2005/08, accepts 2004/08): @code #import "wsa5.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsaapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code // See the user guide gsoap/doc/wsa/html/index.html @endcode - WS-Addressing (2004/08): @code #import "wsa.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsaapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code // See the user guide gsoap/doc/wsa/html/index.html @endcode - WS-ReliableMessaging 1.1: @code #import "wsrm.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsrmapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code soap_register_plugin(soap, soap_wsrm); // register the wsrm plugin in your code // See the user guide gsoap/doc/wsrm/html/index.html @endcode - WS-Security (SOAP Message Security) 1.0 (accepts 1.1): @code #import "wsse.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsseapi.h" soap_register_plugin(soap, soap_wsse); // register the wsse plugin in your code // See the user guide gsoap/doc/wsse/html/index.html @endcode - WS-Security (SOAP Message Security) 1.1 (accepts 1.0): @code #import "wsse11.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsseapi.h" soap_register_plugin(soap, soap_wsse); // register the wsse plugin in your code // See the user guide gsoap/doc/wsse/html/index.html @endcode - HTTP Digest Authentication: @code #include "plugin/httpda.h" soap_register_plugin(soap, soap_http_da); // register the HTTP DA plugin in your code // See the user guide gsoap/doc/httpda/html/index.html @endcode */ #import "wsse.h" /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. XML content can be retrieved from: - a file descriptor, using soap->recvfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->is = ... - a buffer, using the soap->frecv() callback XML content can be stored to: - a file descriptor, using soap->sendfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->os = ... - a buffer, using the soap->fsend() callback @section mssammi Top-level root elements of schema "http://Microsoft.Samples.MessageSecurity/Imports" @section mssamm Top-level root elements of schema "http://Microsoft.Samples.MessageSecurity" - @ref _mssamm__Add @code // Reader (returns SOAP_OK on success): soap_read__mssamm__Add(struct soap*, _mssamm__Add*); // Writer (returns SOAP_OK on success): soap_write__mssamm__Add(struct soap*, _mssamm__Add*); @endcode - @ref _mssamm__AddResponse @code // Reader (returns SOAP_OK on success): soap_read__mssamm__AddResponse(struct soap*, _mssamm__AddResponse*); // Writer (returns SOAP_OK on success): soap_write__mssamm__AddResponse(struct soap*, _mssamm__AddResponse*); @endcode - @ref _mssamm__Subtract @code // Reader (returns SOAP_OK on success): soap_read__mssamm__Subtract(struct soap*, _mssamm__Subtract*); // Writer (returns SOAP_OK on success): soap_write__mssamm__Subtract(struct soap*, _mssamm__Subtract*); @endcode - @ref _mssamm__SubtractResponse @code // Reader (returns SOAP_OK on success): soap_read__mssamm__SubtractResponse(struct soap*, _mssamm__SubtractResponse*); // Writer (returns SOAP_OK on success): soap_write__mssamm__SubtractResponse(struct soap*, _mssamm__SubtractResponse*); @endcode - @ref _mssamm__Multiply @code // Reader (returns SOAP_OK on success): soap_read__mssamm__Multiply(struct soap*, _mssamm__Multiply*); // Writer (returns SOAP_OK on success): soap_write__mssamm__Multiply(struct soap*, _mssamm__Multiply*); @endcode - @ref _mssamm__MultiplyResponse @code // Reader (returns SOAP_OK on success): soap_read__mssamm__MultiplyResponse(struct soap*, _mssamm__MultiplyResponse*); // Writer (returns SOAP_OK on success): soap_write__mssamm__MultiplyResponse(struct soap*, _mssamm__MultiplyResponse*); @endcode - @ref _mssamm__Divide @code // Reader (returns SOAP_OK on success): soap_read__mssamm__Divide(struct soap*, _mssamm__Divide*); // Writer (returns SOAP_OK on success): soap_write__mssamm__Divide(struct soap*, _mssamm__Divide*); @endcode - @ref _mssamm__DivideResponse @code // Reader (returns SOAP_OK on success): soap_read__mssamm__DivideResponse(struct soap*, _mssamm__DivideResponse*); // Writer (returns SOAP_OK on success): soap_write__mssamm__DivideResponse(struct soap*, _mssamm__DivideResponse*); @endcode */ /* End of calculator.h */ gsoap-2.8.91/gsoap/samples/wcf/Basic/MessageSecurity/Doxyfile0000644000175000017500000002272513525245163023501 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "WCF Basic Message Security" PROJECT_NUMBER = "" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = YES STRIP_FROM_PATH = /Applications/ STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = calculator.h calculator.cpp FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = YES INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = HTML_FOOTER = HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /usr/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.91/gsoap/samples/wcf/Basic/MessageSecurity/Makefile0000644000175000017500000000261613525245163023430 0ustar ellertellertURL=http://192.168.2.2:8000/ServiceModelSamples/service WSDL=../../../../wsdl/wsdl2h GSOAP=../../../../src/soapcpp2 SOAPH=../../../../stdsoap2.h SOAPC=../../../../stdsoap2.c SOAPCPP=../../../../stdsoap2.cpp SOAPDOMC=../../../../dom.c SOAPDOMCPP=../../../../dom.cpp TYPEMAP=../../../../typemap.dat CC=gcc -x c CPP=g++ -x c++ LIBS=-lssl -lcrypto GSFLAGS=-L -I../../../../import COFLAGS=-O2 CWFLAGS=-Wall -Wno-deprecated-declarations CIFLAGS=-I. -I../../../.. -I../../../../plugin CMFLAGS=-DWITH_DOM -DWITH_OPENSSL #CMFLAGS=-DDEBUG -DWITH_DOM -DWITH_OPENSSL CFLAGS= $(CWFLAGS) $(COFLAGS) $(CIFLAGS) $(CMFLAGS) all: calculator calculator: calculator.h calculator.cpp $(SOAPH) $(SOAPC) $(GSOAP) $(GSFLAGS) -a -j calculator.h $(CPP) $(CFLAGS) -o calculator calculator.cpp soapC.cpp soapBasicHttpBinding_USCOREICalculatorService.cpp soapBasicHttpBinding_USCOREICalculatorProxy.cpp ../../../../plugin/wsseapi.c ../../../../plugin/smdevp.c ../../../../plugin/mecevp.c $(SOAPDOMCPP) $(SOAPCPP) $(LIBS) %.cer: %.pem openssl x509 -in $< -outform der -out $@ calculator.h: $(WSDL) -t $(TYPEMAP) -o calculator.h $(URL)?wsdl .PHONY: clean distclean clean: rm -f *.o soapH.h soapStub.h soapC.* soapClient.* soapServer.* soap*Proxy.* soap*Service.* soap*Object.* distclean: rm -f *.o soapH.h soapStub.h soapC.* soapClient.* soapServer.* soap*Proxy.* soap*Service.* soap*Object.* rm -f *.xml *.nsmap *.log rm -f calculator gsoap-2.8.91/gsoap/samples/wcf/Basic/MessageSecurity/calculator.cpp0000644000175000017500000005147213525245163024631 0ustar ellertellert/* calculator.cpp WCF BasicMessageSecurity demo See the README.txt gSOAP XML Web services tools Copyright (C) 2000-2016, 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-2016, 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 "soapBasicHttpBinding_USCOREICalculatorService.h" #include "soapBasicHttpBinding_USCOREICalculatorProxy.h" #include "BasicHttpBinding_USCOREICalculator.nsmap" #include "wsseapi.h" /* gsoap/plugin/wsseapi.h */ /* user options */ #define ENCRYPTION /* enable encryption in addition to signing */ /* #define UNENCRYPTED_SIGNATURE */ /* disable encryption of signature */ /* #define CERTVERIFY */ /* enable verification of inbound certs, see ssl_verify() */ const char *endpoint = "http://10.0.1.5:8000/ServiceModelSamples/service"; // Set to the service endpoint X509 *srv_cert = NULL, *clt_cert = NULL; EVP_PKEY *srv_privk = NULL, *clt_privk = NULL; EVP_PKEY *srv_pubk = NULL, *clt_pubk = NULL; char srv_subject[256], clt_subject[256]; char srv_issuer[256], clt_issuer[256]; char *srv_serial = NULL, *clt_serial = NULL; static int chk_security(struct soap *soap); static int set_srv_security(struct soap *soap); static int set_clt_security(struct soap *soap); static const void *token_handler(struct soap *soap, int *alg, const char *keyname, const unsigned char *keyid, int keyidlen, int *keylen); static int ssl_verify(int, X509_STORE_CTX*); /* primitive type managed allocator */ template T * soap_make(struct soap *soap, T val = T()) { T *p = (T*)soap_malloc(soap, sizeof(T)); *p = val; return p; } int main(int argc, char **argv) { FILE *fd; BIGNUM *bn = BN_new(); /* init OpenSSL before any OpenSSL and crypto operations */ soap_ssl_init(); /* server's RSA private key for signing */ if ((fd = fopen("serverWCF.pem", "r"))) { srv_privk = PEM_read_PrivateKey(fd, NULL, NULL, (void*)"password"); fclose(fd); if (!srv_privk) { fprintf(stderr, "Could not read private RSA key from server.pem\n"); exit(1); } } else { fprintf(stderr, "Could not read server.pem\n"); } /* server's certificate with public key for encryption and signature verification */ if ((fd = fopen("servercertWCF.pem", "r"))) { srv_cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); if (!srv_cert) { fprintf(stderr, "Could not read certificate from clientcert.pem\n"); exit(1); } } else { fprintf(stderr, "Could not read server.pem\n"); } /* server's RSA public key from the certificate */ srv_pubk = X509_get_pubkey(srv_cert); if (!srv_pubk) { fprintf(stderr, "Could not get public key from certificate\n"); exit(1); } /* server's certificate subject, issuer and serial number */ X509_NAME_oneline(X509_get_subject_name(srv_cert), srv_subject, sizeof(srv_subject)); X509_NAME_oneline(X509_get_issuer_name(srv_cert), srv_issuer, sizeof(srv_issuer)); ASN1_INTEGER_to_BN(X509_get_serialNumber(srv_cert), bn); srv_serial = BN_bn2dec(bn); fprintf(stderr, "Server certificate issuer = \"%s\"\n", srv_issuer); fprintf(stderr, "Server certificate serial = %s (%s)\n", BN_bn2hex(bn), srv_serial); /* client's RSA private key for signing */ if ((fd = fopen("clientWCF.pem", "r"))) { clt_privk = PEM_read_PrivateKey(fd, NULL, NULL, (void*)"password"); fclose(fd); if (!clt_privk) { fprintf(stderr, "Could not read private RSA key from server.pem\n"); exit(1); } } else fprintf(stderr, "Could not read server.pem\n"); /* client's certificate with public key for encryption and signature verification */ if ((fd = fopen("clientcertWCF.pem", "r"))) { clt_cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); if (!clt_cert) { fprintf(stderr, "Could not read certificate from clientcert.pem\n"); exit(1); } } else fprintf(stderr, "Could not read server.pem\n"); /* client's RSA public key from the certificate */ clt_pubk = X509_get_pubkey(clt_cert); if (!clt_pubk) { fprintf(stderr, "Could not get public key from certificate\n"); exit(1); } /* client's certificate subject, issuer and serial number */ X509_NAME_oneline(X509_get_subject_name(clt_cert), clt_subject, sizeof(clt_subject)); X509_NAME_oneline(X509_get_issuer_name(clt_cert), clt_issuer, sizeof(clt_issuer)); ASN1_INTEGER_to_BN(X509_get_serialNumber(clt_cert), bn); clt_serial = BN_bn2dec(bn); fprintf(stderr, "Client certificate issuer = \"%s\"\n", clt_issuer); fprintf(stderr, "Client certificate serial = %s (%s)\n", BN_bn2hex(bn), clt_serial); OPENSSL_free(bn); if (argc >= 2) { // Service sample application int port = atoi(argv[1]); BasicHttpBinding_USCOREICalculatorService service(SOAP_XML_CANONICAL); soap_register_plugin_arg(service.soap, soap_wsse, (void*)token_handler); service.soap->send_timeout = service.soap->recv_timeout = 10; // 10 sec /* need cacert to verify certificates */ service.soap->cafile = "clientcertWCF.pem"; service.soap->fsslverify = ssl_verify; /* immediately reuse the port when restarting the service */ service.soap->bind_flags = SO_REUSEADDR; if (!soap_valid_socket(service.bind(NULL, port, 100))) { service.soap_stream_fault(std::cerr); exit(1); } std::cerr << "Server running" << std::endl; for (;;) { soap_wsse_verify_auto(service.soap, SOAP_WSSE_IGNORE_EXTRA_REFS, NULL, 0); soap_wsse_decrypt_auto(service.soap, SOAP_MEC_ENV_DEC_AES256_CBC, srv_privk, 0); if (!soap_valid_socket(service.accept()) || service.serve()) service.soap_stream_fault(std::cerr); service.destroy(); } } else { // Client sample application BasicHttpBinding_USCOREICalculatorProxy proxy(endpoint, SOAP_XML_CANONICAL); soap_register_plugin_arg(proxy.soap, soap_wsse, (void*)token_handler); proxy.soap->send_timeout = proxy.soap->recv_timeout = 10; // 10 sec /* need cacert to verify certificates */ proxy.soap->cafile = "servercertWCF.pem"; proxy.soap->fsslverify = ssl_verify; double n1 = 3.14, n2 = 1.41; if (set_clt_security(proxy.soap)) { proxy.soap_stream_fault(std::cerr); } else { _mssamm__Add areq; _mssamm__AddResponse ares; areq.n1 = &n1; areq.n2 = &n2; if (proxy.Add(&areq, &ares) == SOAP_OK && ares.AddResult && chk_security(proxy.soap) == SOAP_OK) printf("Add(%g, %g) = %g\n", *areq.n1, *areq.n2, *ares.AddResult); else proxy.soap_stream_fault(std::cerr); proxy.destroy(); } if (set_clt_security(proxy.soap)) { proxy.soap_stream_fault(std::cerr); } else { _mssamm__Subtract sreq; _mssamm__SubtractResponse sres; sreq.n1 = &n1; sreq.n2 = &n2; if (proxy.Subtract(&sreq, &sres) == SOAP_OK && sres.SubtractResult && chk_security(proxy.soap) == SOAP_OK) printf("Subtract(%g, %g) = %g\n", *sreq.n1, *sreq.n2, *sres.SubtractResult); else proxy.soap_stream_fault(std::cerr); proxy.destroy(); } if (set_clt_security(proxy.soap)) { proxy.soap_stream_fault(std::cerr); } else { _mssamm__Multiply mreq; _mssamm__MultiplyResponse mres; mreq.n1 = &n1; mreq.n2 = &n2; if (proxy.Multiply(&mreq, &mres) == SOAP_OK && mres.MultiplyResult && chk_security(proxy.soap) == SOAP_OK) printf("Multiply(%g, %g) = %g\n", *mreq.n1, *mreq.n2, *mres.MultiplyResult); else proxy.soap_stream_fault(std::cerr); proxy.destroy(); } if (set_clt_security(proxy.soap)) { proxy.soap_stream_fault(std::cerr); } else { _mssamm__Divide dreq; _mssamm__DivideResponse dres; dreq.n1 = &n1; dreq.n2 = &n2; if (proxy.Divide(&dreq, &dres) == SOAP_OK && dres.DivideResult && chk_security(proxy.soap) == SOAP_OK) printf("Divide(%g, %g) = %g\n", *dreq.n1, *dreq.n2, *dres.DivideResult); else proxy.soap_stream_fault(std::cerr); proxy.destroy(); } proxy.destroy(); } OPENSSL_free(clt_serial); OPENSSL_free(srv_serial); return 0; } /******************************************************************************\ * * Check and set security * \******************************************************************************/ /* Check WS-Security properties of a message */ static int chk_security(struct soap *soap) { X509 *cert = soap_wsse_get_KeyInfo_SecurityTokenReferenceX509(soap); if (cert) { char buf[1024]; /* if certificate is included, we may want to check if the certificate is known to us */ X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)); if (!strstr(buf, srv_subject) && !strstr(buf, clt_subject)) { fprintf(stderr, "Warning: certificate from %s is unknown\n", buf); strncat(buf, ": unrecognized subject name", sizeof(buf)-strlen(buf)-1); buf[sizeof(buf)-1] = '\0'; return soap_wsse_fault(soap, wsse__InvalidSecurityToken, buf); } } /* Valid timestamp required */ if (soap_wsse_verify_Timestamp(soap)) { soap_wsse_delete_Security(soap); return soap->error; } /* Timestamp must be signed */ if (soap_wsse_verify_element(soap, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "Timestamp") == 0) { soap_wsse_delete_Security(soap); return soap_wsse_sender_fault(soap, "Timestamp not signed", NULL); } /* Body must be signed */ if (soap_wsse_verify_body(soap)) { soap_wsse_delete_Security(soap); return soap->error; } soap_wsse_delete_Security(soap); return SOAP_OK; } /* Set WS-Security server-side properties after an operation */ static int set_srv_security(struct soap *soap) { if (soap_wsse_add_Timestamp(soap, "Time", 60) // 1 min to expire || soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", srv_cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA1, srv_privk, 0) #ifdef ENCRYPTION #ifdef UNENCRYPTED_SIGNATURE || soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_AES256_CBC, NULL, clt_cert, NULL, clt_issuer+1, clt_serial) #else || soap_wsse_add_EncryptedKey_encrypt_only(soap, SOAP_MEC_ENV_ENC_AES256_CBC, NULL, clt_cert, NULL, clt_issuer+1, clt_serial, "ds:Signature SOAP-ENV:Body") #endif #endif ) return soap->error; return SOAP_OK; } /* Set WS-Security client-side properties before an operation */ static int set_clt_security(struct soap *soap) { // soap_wsse_set_wsu_id(soap, "ds:Signature"); // to encrypt ds:Signature if (soap_wsse_add_Timestamp(soap, "Time", 60) // 1 min to expire || soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", clt_cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA1, clt_privk, 0) || soap_wsse_verify_auto(soap, SOAP_WSSE_IGNORE_EXTRA_REFS, NULL, 0) #ifdef ENCRYPTION #ifdef UNENCRYPTED_SIGNATURE || soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_AES256_CBC, NULL, srv_cert, NULL, srv_issuer+1, srv_serial) #else || soap_wsse_add_EncryptedKey_encrypt_only(soap, SOAP_MEC_ENV_ENC_AES256_CBC, NULL, srv_cert, NULL, srv_issuer+1, srv_serial, "ds:Signature SOAP-ENV:Body") #endif || soap_wsse_decrypt_auto(soap, SOAP_MEC_ENV_DEC_AES256_CBC, clt_privk, 0) #endif ) return soap->error; return SOAP_OK; } /******************************************************************************\ * * Service operations * \******************************************************************************/ int BasicHttpBinding_USCOREICalculatorService::Add(_mssamm__Add *Add, _mssamm__AddResponse *AddResponse) { double *res = soap_make(soap); if (chk_security(soap)) return soap->error; if (Add && Add->n1 && Add->n2) *res = *Add->n1 + *Add->n2; else return soap_sender_fault(soap, "Invalid data", NULL); AddResponse->AddResult = res; return set_srv_security(soap); } int BasicHttpBinding_USCOREICalculatorService::Subtract(_mssamm__Subtract *Subtract, _mssamm__SubtractResponse *SubtractResponse) { double *res = soap_make(soap); if (chk_security(soap)) return soap->error; if (Subtract && Subtract->n1 && Subtract->n2) *res = *Subtract->n1 - *Subtract->n2; else return soap_sender_fault(soap, "Invalid data", NULL); SubtractResponse->SubtractResult = res; return set_srv_security(soap); } int BasicHttpBinding_USCOREICalculatorService::Multiply(_mssamm__Multiply *Multiply, _mssamm__MultiplyResponse *MultiplyResponse) { double *res = soap_make(soap); if (chk_security(soap)) return soap->error; if (Multiply && Multiply->n1 && Multiply->n2) *res = *Multiply->n1 * *Multiply->n2; else return soap_sender_fault(soap, "Invalid data", NULL); MultiplyResponse->MultiplyResult = res; return set_srv_security(soap); } int BasicHttpBinding_USCOREICalculatorService::Divide(_mssamm__Divide *Divide, _mssamm__DivideResponse *DivideResponse) { double *res = soap_make(soap); if (chk_security(soap)) return soap->error; if (Divide && Divide->n1 && Divide->n2 && *Divide->n2 != 0.0) *res = *Divide->n1 / *Divide->n2; else return soap_sender_fault(soap, "Invalid data", NULL); DivideResponse->DivideResult = res; return set_srv_security(soap); } /******************************************************************************\ * * WSSE Token Handler * \******************************************************************************/ static char hmac_key[16] = /* Dummy HMAC key for signature test */ { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; static char des_key[20] = /* Dummy 160-bit triple DES key for encryption test */ { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }; static const void *token_handler(struct soap *soap, int *alg, const char *keyname, const unsigned char *keyid, int keyidlen, int *keylen) { const char *ctxId; struct ds__X509IssuerSerialType *issuer; switch (*alg) { case SOAP_SMD_VRFY_DSA_SHA1: case SOAP_SMD_VRFY_DSA_SHA256: case SOAP_SMD_VRFY_RSA_SHA1: case SOAP_SMD_VRFY_RSA_SHA224: case SOAP_SMD_VRFY_RSA_SHA256: case SOAP_SMD_VRFY_RSA_SHA384: case SOAP_SMD_VRFY_RSA_SHA512: /* Signature verification requires a certificate with a public key */ if (keyname && !strcmp(keyname, "Client")) return (const void*)clt_cert; if (keyname && !strcmp(keyname, "Server")) return (const void*)srv_cert; /* Use KeyInfo/SecurityTokenReference/X509Data */ issuer = soap_wsse_get_KeyInfo_SecurityTokenReferenceX509Data(soap); if (issuer) { if (!strcmp(issuer->X509IssuerName, "CN=Root Agency") && !strcmp(issuer->X509SerialNumber, "-79441640260855276448009124614332182350")) return (const void*)clt_cert; if (!strcmp(issuer->X509IssuerName, "CN=Root Agency") && !strcmp(issuer->X509SerialNumber, "-154614137026298720537726749139640359303")) return (const void*)srv_cert; } break; case SOAP_SMD_HMAC_SHA1: case SOAP_SMD_HMAC_SHA224: case SOAP_SMD_HMAC_SHA256: case SOAP_SMD_HMAC_SHA384: case SOAP_SMD_HMAC_SHA512: /* HMAC digests requires a shared secret key */ /* WS-SecureConversation: get & check context token ID */ if ((keyname && !strcmp(keyname, "Shared")) || ((ctxId = soap_wsse_get_SecurityContextToken(soap)) && !strcmp(ctxId, "Context"))) { *keylen = sizeof(hmac_key); return (const void*)hmac_key; /* signature verification with secret key */ } break; case SOAP_MEC_ENV_DEC_DES_CBC: case SOAP_MEC_ENV_DEC_AES128_CBC: case SOAP_MEC_ENV_DEC_AES192_CBC: case SOAP_MEC_ENV_DEC_AES256_CBC: case SOAP_MEC_ENV_DEC_AES512_CBC: /* Envelope decryption requires a private key */ /* Use KeyInfo/SecurityTokenReference/X509Data */ issuer = soap_wsse_get_KeyInfo_SecurityTokenReferenceX509Data(soap); if (issuer) { if (!strcmp(issuer->X509IssuerName, "CN=Root Agency") && !strcmp(issuer->X509SerialNumber, "-79441640260855276448009124614332182350")) return (const void*)clt_cert; if (!strcmp(issuer->X509IssuerName, "CN=Root Agency") && !strcmp(issuer->X509SerialNumber, "-154614137026298720537726749139640359303")) return (const void*)srv_cert; } break; if (keyname && !strcmp(keyname, "Client")) return (const void*)clt_privk; if (keyname && !strcmp(keyname, "Server")) return (const void*)srv_privk; break; case SOAP_MEC_DEC_DES_CBC: case SOAP_MEC_DEC_AES128_CBC: case SOAP_MEC_DEC_AES192_CBC: case SOAP_MEC_DEC_AES256_CBC: case SOAP_MEC_DEC_AES512_CBC: /* Decryption requires a shared secret key */ /* WS-SecureConversation: get & check context token ID */ if ((keyname && !strcmp(keyname, "Shared")) || ((ctxId = soap_wsse_get_SecurityContextToken(soap)) && !strcmp(ctxId, "Context"))) { *keylen = sizeof(des_key); return (const void*)des_key; /* decryption with secret key */ } } fprintf(stderr, "Warning: token handler returned NULL key\n"); return NULL; /* fail */ } /******************************************************************************\ * * Optional certificate verification * \******************************************************************************/ static int ssl_verify(int ok, X509_STORE_CTX *store) { /* put certificate verification here, return 0 to fail, 1 to force success */ #ifdef CERTVERIFY if (!ok) { char buf[1024]; int err = X509_STORE_CTX_get_error(store); X509 *cert = X509_STORE_CTX_get_current_cert(store); /* accept self-signed certificates and certificates out of date - modify as you see fit */ switch (err) { case X509_V_ERR_CERT_NOT_YET_VALID: case X509_V_ERR_CERT_HAS_EXPIRED: case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: case X509_V_ERR_UNABLE_TO_GET_CRL: case X509_V_ERR_CRL_NOT_YET_VALID: case X509_V_ERR_CRL_HAS_EXPIRED: /* override with ok = 1 */ X509_STORE_CTX_set_error(store, X509_V_OK); ok = 1; break; default: /* print errors to stderr */ fprintf(stderr, "SSL verify error %d or warning with certificate at depth %d: %s\n", err, X509_STORE_CTX_get_error_depth(store), X509_verify_cert_error_string(err)); X509_NAME_oneline(X509_get_issuer_name(cert), buf, sizeof(buf)); fprintf(stderr, " certificate issuer: %s\n", buf); X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)); fprintf(stderr, " certificate subject: %s\n", buf); } } return ok; #else /* Note: return 1 to try to continue, but unsafe progress will be terminated by OpenSSL */ return 1; #endif } gsoap-2.8.91/gsoap/samples/wcf/Basic/MessageSecurity/README.txt0000644000175000017500000002447113525245163023471 0ustar ellertellertINSTRUCTIONS Install the WCF samples by downloading the "Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4." from the Microsoft download site (you may have to search). You should have: C:\WF_WCF_Samples\WCF\Basic\Binding\Basic\MessageSecurity\CS Open the Basic MessageSecurity WCF C# example client and service project in Visual Studio. Modify the configuration and source code as described below. Notes: C:> denotes the Windows command line $ denotes the Unix/Linux command line To enable gSOAP to use WS-Security for BasicMessageSecurity interop, add to the .h file to be processed by soapcpp2: #import "wsse.h" See doc/wsse for instructions. Generating keys and certificates -------------------------------- First create the client key and certificate: C:> makecert -ss My -n "CN=client.com" -sk myKey -pe Open the MMC console C:> mmc Add the certificates snap-in to MMC if not already added, by pressing CTRL-M. In Console Root/Certificates: select under Personal/Certificates "client.com" Export "client.com" by right-clicking, All Tasks/Export... Export "client.com" as "client.pfx", make sure you export the private key. Copy client.pfx to the other machine for conversion to PEM format. To create a PEM-formatted private key: $ openssl pkcs12 -in client.pfx -nocerts -out clientWCF.pem $ openssl rsa -in clientWCF.pem -text -noout To create a PEM-formatted certificate: $ openssl pkcs12 -in client.pfx -clcerts -nokeys -out clientcertWCF.pem $ openssl x509 -in clientcertWCF.pem -text -noout Obtain the host name of the machine on which the service runs, say we use domain "server.com". Generate the server certificate for this domain: C:> makecert -ss TrustedPeople -n "CN=server.com" -sky exchange -pe Export the certificate under MMC Trusted People/Certificates to pfx format as described above, and convert the key and certificate to PEM format: $ openssl pkcs12 -in server.pfx -nocerts -out serverWCF.pem $ openssl rsa -in serverWCF.pem -text -noout $ openssl pkcs12 -in server.pfx -clcerts -nokeys -out servercertWCF.pem $ openssl x509 -in servercertWCF.pem -text -noout To connect a WCF client to a gSOAP service ------------------------------------------ In App.config of the WCF client, change the , , and elements as follows: ... ... To connect a gSOAP client to a WCF service ------------------------------------------ Follow instructions to set up a WCF service using the keys and certificates, where the server certificate should use the machine's host name or IP. See gsoap\samples\wcf\Basic\Http\README.txt for help. In Web.config (or App.config) of the service, change the element: Supported algorthm suites ------------------------- All Basic suites with Rsa15 for keywrap. The rsa-oaep-mgf1p keywrap algorithm is currently not supported, but possibly will be supported in future releases. WS-Security with gSOAP ---------------------- You can use the following flags with the gSOAP client/server initialization using soap_new1() and soap_init1(): - SOAP_XML_CANONICAL is recommended to enable C14N - SOAP_IO_CHUNK enables HTTP chunking, which is faster - SOAP_ENC_GZIP enables HTTP compression Do NOT use SOAP_XML_INDENT because interoperability with WCF WS-Security is not guaranteed when SOAP_XML_INDENT is enabled. The implementation of C14N in WCF with respect to the normalization of white space between XML tags differs from the protocol standards. Build steps for gSOAP client/server calculator example ------------------------------------------------------ The calculator.h file with the service definitions and data binding interface as pre-generated from the WSDL published by the WCF service as follows: $ wsdl2h -t ../../../../typemap.dat -o calculator.h \ 'http://your_server_host:8000/ServiceModelSamples/service?wsdl' The soapcpp2 tool generates the data binding code and client/server classes: $ soapcpp2 -a -j calculator.h Make sure that calculator.cpp connects to the WCF service by setting: const char *endpoint = "http://your_server_host:8000/ServiceModelSamples/service"; Compile the project with: $ c++ -DWITH_DOM -DWITH_OPENSSL -I. -I../../../.. -I../../../../plugin \ -o calculator \ calculator.cpp soapC.cpp \ soapBasicHttpBinding_USCOREICalculatorService.cpp \ soapBasicHttpBinding_USCOREICalculatorProxy.cpp \ ../../../../plugin/wsseapi.c \ ../../../../plugin/smdevp.c \ ../../../../plugin/mecevp.c This compiles the client/server that uses WS-Security signature and encryption. Enable certificate verification in the gSOAP client/server example ------------------------------------------------------------------ To enable certificate verification, build with -DCERTVERIFY: $ c++ -DCERTVERIFY -DWITH_DOM -DWITH_OPENSSL ... How to disable encryption of the signature ------------------------------------------ To disable encryption of the signature: $ c++ -DUNENCRYPTED_SIGNATURE -DWITH_DOM -DWITH_OPENSSL ... WCF-defined default bindings such as BasicHttpBinding require the signature to be signed when receiving messages. WCF will throw an error such as "The primary signature must be encrypted" if the signature is not encrypted. To let WCF accept a message in which the signature is not encypted, a custom binding is required. To do so, in the .config file of the WCF server replace the original tag with the configuration below: Modify the value of attribute 'binding' in of Binding1 from BasicHttpBinding to customBinding. The rest is unchanged. ... See also https://blogs.msdn.microsoft.com/distributedservices/2011/03/07/wcf-security-interop-scenarios/ How to disable encryption ------------------------- To disable encryption from the calculator.cpp client/server, comment the line: // #define ENCRYPTION To disable encryption in service.cs of the WCF service, change interface ICalculator by adding protecting level attribute on service contract and operation contract. For example, the code bellow shows only enable signature on Add operation, and the rest three operation enable both signature and encryption: [ServiceContract(Namespace = "http://Microsoft.Samples.MessageSecurity", ProtectionLevel = ProtectionLevel.EncryptAndSign)] interface ICalculator { [OperationContract(ProtectionLevel = ProtectionLevel.Sign)] double Add(double n1, double n2); [OperationContract] double Subtract(double n1, double n2); [OperationContract] double Multiply(double n1, double n2); [OperationContract] double Divide(double n1, double n2); } In generatedClient.cs of the WCF client, enable only signature on the Add operation by making similar changes: [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] [System.ServiceModel.ServiceContractAttribute(Namespace = "http://Microsoft.Samples.MessageSecurity", ConfigurationName = "Microsoft.Samples.MessageSecurity.ICalculator", ProtectionLevel = System.Net.Security.ProtectionLevel.EncryptAndSign)] public interface ICalculator { [System.ServiceModel.OperationContractAttribute(ProtectionLevel = System.Net.Security.ProtectionLevel.Sign, Action = "http://Microsoft.Samples.MessageSecurity/ICalculator/Add", ReplyAction = "http://Microsoft.Samples.MessageSecurity/ICalculator/AddResponse")] double Add(double n1, double n2); [System.ServiceModel.OperationContractAttribute(Action="http://Microsoft.Samples.MessageSecurity/ICalculator/Subtract", ReplyAction="http://Microsoft.Samples.MessageSecurity/ICalculator/SubtractResponse")] double Subtract(double n1, double n2); [System.ServiceModel.OperationContractAttribute(Action="http://Microsoft.Samples.MessageSecurity/ICalculator/Multiply", ReplyAction="http://Microsoft.Samples.MessageSecurity/ICalculator/MultiplyResponse")] double Multiply(double n1, double n2); [System.ServiceModel.OperationContractAttribute(Action="http://Microsoft.Samples.MessageSecurity/ICalculator/Divide", ReplyAction="http://Microsoft.Samples.MessageSecurity/ICalculator/DivideResponse")] double Divide(double n1, double n2); } gsoap-2.8.91/gsoap/samples/wcf/Basic/MessageSecurity/clientWCF.pem0000755000175000017500000000221713525245163024311 0ustar ellertellertBag Attributes localKeyID: 01 00 00 00 friendlyName: 00cc75b6-e684-45a1-88c8-6d76e553b011 Microsoft CSP Name: Microsoft Strong Cryptographic Provider Key Attributes X509v3 Key Usage: 10 -----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: DES-EDE3-CBC,58A6BDE020668E33 8KvjLV8TyangGo6sZFl3g29hLJJgHNxFVsmZfOo8Z23rwANdnYNrkwYlGXmVMrGa dtaZ198XQsmPS/yhY5KvM/i4rxtBSkAV+ri1KMk8RYPAM+NxXvz6a5Mm3DjyY0TS Q6NN+UyEBHGdyY9Bh6GJDpbjzFPk0f8+pEGN9OdLU+rQ2wsZ0aOl3RitOVhaj6XE agFsawHfGlg2lYpBu0uh8xzI864r9P9NqTpPj97wzCLj168tsrvOvh3jt77gdoUE 7kH3R80cYfFflldFFpbDtFlycauBntet2xy42KUkGKEPQ13l+fECBpYLSqVdonXN oR7+n00wBNlC3xJEogaVhgDpyF6e+BUfFiGX8B+paodh3C9RKLRHZMxXxAw19lzz 5ufqE9X+PQT2jmS0lR+xGosJaWRXA0iFK7RoZdvocLmLjuAggBa44SlK+AO0oiTR +SZTrzr1nxRnfjPrako25ZABbgXWb64u57k4M+HSVDcLh6PzkwnYKz48lm4g5Kvr M5BkBKzPg4804/uTQWnlXeFRTxnfrJ5ecqYA8x7yh2tTnNb9GMGGzE3ahl/6UIvf tQ4SLKm+USElryTyP4HX75GAQPNfn8mvvP51Z/GGRgMmYISLwnr1rYq/8cJJF4qc zp7Czv/7G7un0mBrSOxT9YyaUTgm+EXZkeJ7QO62SkjQclZ+OotKT+A1FwsLsaYB q/4aYlQeeTfUGgxY1d50Z6U3KkVM/YRG+g57gXBMdhwnEZoR2gN4hNHIFDFVV5L9 dlTPVqW9cORYYtN4O+yRxNDBcHxBoNmjxukiYaxeqx3Im9oMcutVeA== -----END RSA PRIVATE KEY----- gsoap-2.8.91/gsoap/samples/wcf/Basic/MessageSecurity/clientcertWCF.pem0000755000175000017500000000134213525245163025165 0ustar ellertellertBag Attributes localKeyID: 01 00 00 00 subject=/CN=client.com issuer=/CN=Root Agency -----BEGIN CERTIFICATE----- MIIBsjCCAWCgAwIBAgIQxDwYvAZ4d5lMASIy4YSQsjAJBgUrDgMCHQUAMBYxFDAS BgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTEyMDYwMzAxMDAwNFoXDTM5MTIzMTIzNTk1 OVowFTETMBEGA1UEAxMKY2xpZW50LmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw gYkCgYEAhiVObPitp+2xlTe363+Ax0RR/VWDph852F/Mj9RwXTtc9S6CnToUu2lA UvubGnu6+lMfK+xlNBMU5kaAs7fyEIJqgvDsZNxb07obiI6sNqWXV3nwiasZPyGg KLeMhCZafpxqCf3UK51/d3PgXbAC0W9qsx1pgYNBlLUloGcjVtkCAwEAAaNLMEkw RwYDVR0BBEAwPoAQEuQJLQYdHU8AjWEh3BZkY6EYMBYxFDASBgNVBAMTC1Jvb3Qg QWdlbmN5ghAGN2wAqgBkihHPuNSqXDX0MAkGBSsOAwIdBQADQQAcmxkSVMPVGrxw HYBLx1hSx2mMYDG6yM3SvIhKRP365pQLSYuhFADrWqxKn+MhpQ/6EDgUzq5aX4/6 Y2AR2ZC4 -----END CERTIFICATE----- gsoap-2.8.91/gsoap/samples/wcf/Basic/MessageSecurity/serverWCF.pem0000755000175000017500000000227013525245163024340 0ustar ellertellertBag Attributes Microsoft Local Key set: localKeyID: 01 00 00 00 friendlyName: 9920b063-8731-4a54-992d-84314f18e447 Microsoft CSP Name: Microsoft Strong Cryptographic Provider Key Attributes X509v3 Key Usage: 10 -----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: DES-EDE3-CBC,ECC683394369A286 6hD+kz2CBIgNpHsynRtBhRXjydr5acyDpuRzA1GBRfifPw/UPu7clqRPSFDH5CWk evxTHHL2XZqVmyjhQiSw3o4QNXM7quMx5gdZx35P7UUcz3ofhcrzo7yCOKbNvamA p8O4GJ61p78yY5TWmpX/Z6guPNeofeS9oYeyJlkjBccs9tHVHdH/m6YNW1Diayyt 1PRiDsLxeCtZK4mBL2zL/VjKhRma//z3gzZq/6J+bMbzpo3Bi2bJlFTlRCFgeNyh 4aCrAb7FLg3AIN6hywBKQnwklDdkNaw8ZizTvCIGYMKGD1hW6FVMjBZuGyZnTH/b 5yCYXelbp8ZMWQMo1ojJbVU55S93K4uHPmjRYdKDah+jqiiLDNMqWop1/OTLFGu5 DMexxp+DF4274N7Lp6lKSOxQVvCQTghyXH+1dQ3jEXahxg6myYv70KsvAecStnpy G45QnaiFzRJKLhk1MhCnHjcH42J6rFiilpDzCiNzKBCEZxG6wHfj89ZauSA9iGuf KEOqloX3LcB6RX/EQ5oibWNjBkJzSY8l+X8ZQG3SG8MSgOkzIquFlEgcjzd+eFRP Tw+nHVDguyXekoLxO1ECthAsjdQ/gSHBjBNhannE/kvc+erT+IGtZDZl3ZATuRfq 08condry+9VnTPUg6gOAF75lIwLwacdCaY9Tj9kkuaE4GagTeKOlreACxQVGupDw 1/vgbwNaMeUu46jKfeEPqFCKZfW7b8XzfB08JQSYF7byu3Z8fOAaN7YcUj90RF2N W9+PtxnT2OnQZ4rtCR+7m/nz9IzO/+19nMlnY358FZlrJHAhEQkNAw== -----END RSA PRIVATE KEY----- gsoap-2.8.91/gsoap/samples/wcf/Basic/TransportSecurity/0000755000175000017500000000000013525564137022400 5ustar ellertellertgsoap-2.8.91/gsoap/samples/wcf/Basic/TransportSecurity/dh512.pem0000644000175000017500000000023413525245163023720 0ustar ellertellert-----BEGIN DH PARAMETERS----- MEYCQQDYbhGNVV6GoxOPsX+rBNGmgfJqh7+e1PFj8IketLqWtA2gkXAB9PKxrkDQ jvuEoXE4A6PVPfstmP/Ef4uNfCqLAgEC -----END DH PARAMETERS----- gsoap-2.8.91/gsoap/samples/wcf/Basic/TransportSecurity/BasicHttpBinding_USCOREICalculator.nsmap0000644000175000017500000000122413525245163032011 0ustar ellertellert #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}, {"tempuri", "http://tempuri.org/", NULL, NULL}, {"mssamt", "http://Microsoft.Samples.TransportSecurity", NULL, NULL}, {NULL, NULL, NULL, NULL} }; gsoap-2.8.91/gsoap/samples/wcf/Basic/TransportSecurity/calculator.h0000644000175000017500000010430613525245163024701 0ustar ellertellert// Reminder: Modify typemap.dat to customize the header file generated by wsdl2h /* calculator.h Generated by wsdl2h 2.8.9 from http://192.168.2.2:8000/ServiceModelSamples/service?wsdl and ../../typemap.dat 2012-05-22 19:10:09 GMT DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS USE THE soapcpp2-GENERATED SOURCE CODE FILES FOR YOUR PROJECT BUILDS gSOAP XML Web services tools. Copyright (C) 2001-2012 Robert van Engelen, Genivia Inc. All Rights Reserved. Part of this software is released under one of the following licenses: GPL or Genivia's license for commercial use. */ /** @page page_notes Usage Notes NOTE: - Run soapcpp2 on calculator.h to generate the SOAP/XML processing logic. Use soapcpp2 option -I to specify paths for #import To build with STL, 'stlvector.h' is imported from 'import' dir in package. Use soapcpp2 option -i to generate improved proxy and server classes. - 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) on this file to generate documentation. - Use wsdl2h options -nname and -Nname to globally rename the prefix 'ns'. - Use wsdl2h option -d to enable DOM support for xsd:anyType. - Use wsdl2h option -g to auto-generate readers and writers for root elements. - Struct/class members serialized as XML attributes are annotated with a '@'. - Struct/class members that have a special role are annotated with a '$'. WARNING: DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS. USE THE SOURCE CODE FILES GENERATED BY soapcpp2 FOR YOUR PROJECT BUILDS: THE soapStub.h FILE CONTAINS THIS CONTENT WITHOUT ANNOTATIONS. LICENSE: @verbatim -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following two licenses: 1) GPL or 2) Genivia's license for commercial use. -------------------------------------------------------------------------------- 1) 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. -------------------------------------------------------------------------------- 2) A commercial-use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- @endverbatim */ //gsoapopt w /******************************************************************************\ * * * Definitions * * http://tempuri.org/ * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ // STL vector containers (use option -s to remove STL dependency) #import "stlvector.h" /******************************************************************************\ * * * 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: tempuri = "http://tempuri.org/" mssamti = "http://Microsoft.Samples.TransportSecurity/Imports" mssamt = "http://Microsoft.Samples.TransportSecurity" */ #define SOAP_NAMESPACE_OF_mssamti "http://Microsoft.Samples.TransportSecurity/Imports" //gsoap mssamti schema namespace: http://Microsoft.Samples.TransportSecurity/Imports //gsoap mssamti schema form: unqualified #define SOAP_NAMESPACE_OF_mssamt "http://Microsoft.Samples.TransportSecurity" //gsoap mssamt schema namespace: http://Microsoft.Samples.TransportSecurity //gsoap mssamt schema elementForm: qualified //gsoap mssamt schema attributeForm: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ /******************************************************************************\ * * * Forward Declarations * * * \******************************************************************************/ // Forward declaration of class _mssamt__Add. class _mssamt__Add; // Forward declaration of class _mssamt__AddResponse. class _mssamt__AddResponse; // Forward declaration of class _mssamt__Subtract. class _mssamt__Subtract; // Forward declaration of class _mssamt__SubtractResponse. class _mssamt__SubtractResponse; // Forward declaration of class _mssamt__Multiply. class _mssamt__Multiply; // Forward declaration of class _mssamt__MultiplyResponse. class _mssamt__MultiplyResponse; // Forward declaration of class _mssamt__Divide. class _mssamt__Divide; // Forward declaration of class _mssamt__DivideResponse. class _mssamt__DivideResponse; /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://Microsoft.Samples.TransportSecurity/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://Microsoft.Samples.TransportSecurity * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://Microsoft.Samples.TransportSecurity/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://Microsoft.Samples.TransportSecurity * * * \******************************************************************************/ /// Top-level root element "http://Microsoft.Samples.TransportSecurity":Add /// "http://Microsoft.Samples.TransportSecurity":Add is a complexType. class _mssamt__Add { public: /// Element n1 of type xs:double. double* n1 0; ///< Optional element. /// Element n2 of type xs:double. double* n2 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.TransportSecurity":AddResponse /// "http://Microsoft.Samples.TransportSecurity":AddResponse is a complexType. class _mssamt__AddResponse { public: /// Element AddResult of type xs:double. double* AddResult 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.TransportSecurity":Subtract /// "http://Microsoft.Samples.TransportSecurity":Subtract is a complexType. class _mssamt__Subtract { public: /// Element n1 of type xs:double. double* n1 0; ///< Optional element. /// Element n2 of type xs:double. double* n2 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.TransportSecurity":SubtractResponse /// "http://Microsoft.Samples.TransportSecurity":SubtractResponse is a complexType. class _mssamt__SubtractResponse { public: /// Element SubtractResult of type xs:double. double* SubtractResult 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.TransportSecurity":Multiply /// "http://Microsoft.Samples.TransportSecurity":Multiply is a complexType. class _mssamt__Multiply { public: /// Element n1 of type xs:double. double* n1 0; ///< Optional element. /// Element n2 of type xs:double. double* n2 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.TransportSecurity":MultiplyResponse /// "http://Microsoft.Samples.TransportSecurity":MultiplyResponse is a complexType. class _mssamt__MultiplyResponse { public: /// Element MultiplyResult of type xs:double. double* MultiplyResult 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.TransportSecurity":Divide /// "http://Microsoft.Samples.TransportSecurity":Divide is a complexType. class _mssamt__Divide { public: /// Element n1 of type xs:double. double* n1 0; ///< Optional element. /// Element n2 of type xs:double. double* n2 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.TransportSecurity":DivideResponse /// "http://Microsoft.Samples.TransportSecurity":DivideResponse is a complexType. class _mssamt__DivideResponse { public: /// Element DivideResult of type xs:double. double* DivideResult 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /******************************************************************************\ * * * Additional Top-Level Elements * * http://Microsoft.Samples.TransportSecurity/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * http://Microsoft.Samples.TransportSecurity/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Elements * * http://Microsoft.Samples.TransportSecurity * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * http://Microsoft.Samples.TransportSecurity * * * \******************************************************************************/ /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap tempuri service name: BasicHttpBinding_USCOREICalculator //gsoap tempuri service type: ICalculator //gsoap tempuri service port: https://192.168.2.2:8000/ServiceModelSamples/service //gsoap tempuri service namespace: http://tempuri.org/ //gsoap tempuri service transport: http://schemas.xmlsoap.org/soap/http /** @mainpage CalculatorService Definitions @section CalculatorService_bindings Service Bindings - @ref BasicHttpBinding_USCOREICalculator @section CalculatorService_more More Information - @ref page_notes "Usage Notes" - @ref page_XMLDataBinding "XML Data Binding" - @ref SOAP_ENV__Header "SOAP Header Content" (when applicable) - @ref SOAP_ENV__Detail "SOAP Fault Detail Content" (when applicable) */ /** @page BasicHttpBinding_USCOREICalculator Binding "BasicHttpBinding_USCOREICalculator" @section BasicHttpBinding_USCOREICalculator_operations Operations of Binding "BasicHttpBinding_USCOREICalculator" - @ref __tempuri__Add - @ref __tempuri__Subtract - @ref __tempuri__Multiply - @ref __tempuri__Divide @section BasicHttpBinding_USCOREICalculator_ports Endpoints of Binding "BasicHttpBinding_USCOREICalculator" - http://192.168.2.2:8000/ServiceModelSamples/service Note: use wsdl2h option -N to change the service binding prefix name */ /******************************************************************************\ * * * Service Binding * * BasicHttpBinding_USCOREICalculator * * * \******************************************************************************/ /******************************************************************************\ * * * Service Operation * * __tempuri__Add * * * \******************************************************************************/ /// Operation "__tempuri__Add" of service binding "BasicHttpBinding_USCOREICalculator" /** Operation details: - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.TransportSecurity/ICalculator/Add" - Addressing method action: "http://tempuri.org//ICalculator/Add" - Addressing method output action: "http://tempuri.org//ICalculator/AddResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___tempuri__Add( 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: _mssamt__Add* mssamt__Add, // response parameters: _mssamt__AddResponse* mssamt__AddResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Add( struct soap *soap, // request parameters: _mssamt__Add* mssamt__Add, // response parameters: _mssamt__AddResponse* mssamt__AddResponse ); @endcode C++ proxy class (defined in soapBasicHttpBinding_USCOREICalculatorProxy.h): @code class BasicHttpBinding_USCOREICalculatorProxy; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapBasicHttpBinding_USCOREICalculatorService.h): @code class BasicHttpBinding_USCOREICalculatorService; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Add document //gsoap tempuri service method-encoding: Add literal //gsoap tempuri service method-action: Add http://Microsoft.Samples.TransportSecurity/ICalculator/Add //gsoap tempuri service method-output-action: Add http://tempuri.org//ICalculator/AddResponse int __tempuri__Add( _mssamt__Add* mssamt__Add, ///< Request parameter _mssamt__AddResponse* mssamt__AddResponse ///< Response parameter ); /******************************************************************************\ * * * Service Operation * * __tempuri__Subtract * * * \******************************************************************************/ /// Operation "__tempuri__Subtract" of service binding "BasicHttpBinding_USCOREICalculator" /** Operation details: - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.TransportSecurity/ICalculator/Subtract" - Addressing method action: "http://tempuri.org//ICalculator/Subtract" - Addressing method output action: "http://tempuri.org//ICalculator/SubtractResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___tempuri__Subtract( 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: _mssamt__Subtract* mssamt__Subtract, // response parameters: _mssamt__SubtractResponse* mssamt__SubtractResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Subtract( struct soap *soap, // request parameters: _mssamt__Subtract* mssamt__Subtract, // response parameters: _mssamt__SubtractResponse* mssamt__SubtractResponse ); @endcode C++ proxy class (defined in soapBasicHttpBinding_USCOREICalculatorProxy.h): @code class BasicHttpBinding_USCOREICalculatorProxy; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapBasicHttpBinding_USCOREICalculatorService.h): @code class BasicHttpBinding_USCOREICalculatorService; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Subtract document //gsoap tempuri service method-encoding: Subtract literal //gsoap tempuri service method-action: Subtract http://Microsoft.Samples.TransportSecurity/ICalculator/Subtract //gsoap tempuri service method-output-action: Subtract http://tempuri.org//ICalculator/SubtractResponse int __tempuri__Subtract( _mssamt__Subtract* mssamt__Subtract, ///< Request parameter _mssamt__SubtractResponse* mssamt__SubtractResponse ///< Response parameter ); /******************************************************************************\ * * * Service Operation * * __tempuri__Multiply * * * \******************************************************************************/ /// Operation "__tempuri__Multiply" of service binding "BasicHttpBinding_USCOREICalculator" /** Operation details: - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.TransportSecurity/ICalculator/Multiply" - Addressing method action: "http://tempuri.org//ICalculator/Multiply" - Addressing method output action: "http://tempuri.org//ICalculator/MultiplyResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___tempuri__Multiply( 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: _mssamt__Multiply* mssamt__Multiply, // response parameters: _mssamt__MultiplyResponse* mssamt__MultiplyResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Multiply( struct soap *soap, // request parameters: _mssamt__Multiply* mssamt__Multiply, // response parameters: _mssamt__MultiplyResponse* mssamt__MultiplyResponse ); @endcode C++ proxy class (defined in soapBasicHttpBinding_USCOREICalculatorProxy.h): @code class BasicHttpBinding_USCOREICalculatorProxy; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapBasicHttpBinding_USCOREICalculatorService.h): @code class BasicHttpBinding_USCOREICalculatorService; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Multiply document //gsoap tempuri service method-encoding: Multiply literal //gsoap tempuri service method-action: Multiply http://Microsoft.Samples.TransportSecurity/ICalculator/Multiply //gsoap tempuri service method-output-action: Multiply http://tempuri.org//ICalculator/MultiplyResponse int __tempuri__Multiply( _mssamt__Multiply* mssamt__Multiply, ///< Request parameter _mssamt__MultiplyResponse* mssamt__MultiplyResponse ///< Response parameter ); /******************************************************************************\ * * * Service Operation * * __tempuri__Divide * * * \******************************************************************************/ /// Operation "__tempuri__Divide" of service binding "BasicHttpBinding_USCOREICalculator" /** Operation details: - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.TransportSecurity/ICalculator/Divide" - Addressing method action: "http://tempuri.org//ICalculator/Divide" - Addressing method output action: "http://tempuri.org//ICalculator/DivideResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___tempuri__Divide( 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: _mssamt__Divide* mssamt__Divide, // response parameters: _mssamt__DivideResponse* mssamt__DivideResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Divide( struct soap *soap, // request parameters: _mssamt__Divide* mssamt__Divide, // response parameters: _mssamt__DivideResponse* mssamt__DivideResponse ); @endcode C++ proxy class (defined in soapBasicHttpBinding_USCOREICalculatorProxy.h): @code class BasicHttpBinding_USCOREICalculatorProxy; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapBasicHttpBinding_USCOREICalculatorService.h): @code class BasicHttpBinding_USCOREICalculatorService; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Divide document //gsoap tempuri service method-encoding: Divide literal //gsoap tempuri service method-action: Divide http://Microsoft.Samples.TransportSecurity/ICalculator/Divide //gsoap tempuri service method-output-action: Divide http://tempuri.org//ICalculator/DivideResponse int __tempuri__Divide( _mssamt__Divide* mssamt__Divide, ///< Request parameter _mssamt__DivideResponse* mssamt__DivideResponse ///< Response parameter ); /** @page BasicHttpBinding_USCOREICalculator Binding "BasicHttpBinding_USCOREICalculator" @section BasicHttpBinding_USCOREICalculator_policy_enablers Policy Enablers of Binding "BasicHttpBinding_USCOREICalculator" Based on policies, this service imports - WS-Policy reminders and enablers: - WS-Addressing 1.0 (2005/08, accepts 2004/08): @code #import "wsa5.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsaapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code // See the user guide gsoap/doc/wsa/html/index.html @endcode - WS-Addressing (2004/08): @code #import "wsa.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsaapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code // See the user guide gsoap/doc/wsa/html/index.html @endcode - WS-ReliableMessaging 1.1: @code #import "wsrm.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsrmapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code soap_register_plugin(soap, soap_wsrm); // register the wsrm plugin in your code // See the user guide gsoap/doc/wsrm/html/index.html @endcode - WS-Security (SOAP Message Security) 1.0 (accepts 1.1): @code #import "wsse.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsseapi.h" soap_register_plugin(soap, soap_wsse); // register the wsse plugin in your code // See the user guide gsoap/doc/wsse/html/index.html @endcode - WS-Security (SOAP Message Security) 1.1 (accepts 1.0): @code #import "wsse11.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsseapi.h" soap_register_plugin(soap, soap_wsse); // register the wsse plugin in your code // See the user guide gsoap/doc/wsse/html/index.html @endcode - HTTP Digest Authentication: @code #include "plugin/httpda.h" soap_register_plugin(soap, soap_http_da); // register the HTTP DA plugin in your code // See the user guide gsoap/doc/httpda/html/index.html @endcode */ /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. XML content can be retrieved from: - a file descriptor, using soap->recvfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->is = ... - a buffer, using the soap->frecv() callback XML content can be stored to: - a file descriptor, using soap->sendfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->os = ... - a buffer, using the soap->fsend() callback @section mssamti Top-level root elements of schema "http://Microsoft.Samples.TransportSecurity/Imports" @section mssamt Top-level root elements of schema "http://Microsoft.Samples.TransportSecurity" - @ref _mssamt__Add @code // Reader (returns SOAP_OK on success): soap_read__mssamt__Add(struct soap*, _mssamt__Add*); // Writer (returns SOAP_OK on success): soap_write__mssamt__Add(struct soap*, _mssamt__Add*); @endcode - @ref _mssamt__AddResponse @code // Reader (returns SOAP_OK on success): soap_read__mssamt__AddResponse(struct soap*, _mssamt__AddResponse*); // Writer (returns SOAP_OK on success): soap_write__mssamt__AddResponse(struct soap*, _mssamt__AddResponse*); @endcode - @ref _mssamt__Subtract @code // Reader (returns SOAP_OK on success): soap_read__mssamt__Subtract(struct soap*, _mssamt__Subtract*); // Writer (returns SOAP_OK on success): soap_write__mssamt__Subtract(struct soap*, _mssamt__Subtract*); @endcode - @ref _mssamt__SubtractResponse @code // Reader (returns SOAP_OK on success): soap_read__mssamt__SubtractResponse(struct soap*, _mssamt__SubtractResponse*); // Writer (returns SOAP_OK on success): soap_write__mssamt__SubtractResponse(struct soap*, _mssamt__SubtractResponse*); @endcode - @ref _mssamt__Multiply @code // Reader (returns SOAP_OK on success): soap_read__mssamt__Multiply(struct soap*, _mssamt__Multiply*); // Writer (returns SOAP_OK on success): soap_write__mssamt__Multiply(struct soap*, _mssamt__Multiply*); @endcode - @ref _mssamt__MultiplyResponse @code // Reader (returns SOAP_OK on success): soap_read__mssamt__MultiplyResponse(struct soap*, _mssamt__MultiplyResponse*); // Writer (returns SOAP_OK on success): soap_write__mssamt__MultiplyResponse(struct soap*, _mssamt__MultiplyResponse*); @endcode - @ref _mssamt__Divide @code // Reader (returns SOAP_OK on success): soap_read__mssamt__Divide(struct soap*, _mssamt__Divide*); // Writer (returns SOAP_OK on success): soap_write__mssamt__Divide(struct soap*, _mssamt__Divide*); @endcode - @ref _mssamt__DivideResponse @code // Reader (returns SOAP_OK on success): soap_read__mssamt__DivideResponse(struct soap*, _mssamt__DivideResponse*); // Writer (returns SOAP_OK on success): soap_write__mssamt__DivideResponse(struct soap*, _mssamt__DivideResponse*); @endcode */ /* End of calculator.h */ gsoap-2.8.91/gsoap/samples/wcf/Basic/TransportSecurity/Doxyfile0000644000175000017500000002272713525245163024113 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "WCF Basic Transport Security" PROJECT_NUMBER = "" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = YES STRIP_FROM_PATH = /Applications/ STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = calculator.h calculator.cpp FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = YES INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = HTML_FOOTER = HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /usr/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.91/gsoap/samples/wcf/Basic/TransportSecurity/Makefile0000644000175000017500000000247013525245163024036 0ustar ellertellertURL=http://192.168.2.2:8000/ServiceModelSamples/service WSDL=../../../../wsdl/wsdl2h GSOAP=../../../../src/soapcpp2 SOAPH=../../../../stdsoap2.h SOAPC=../../../../stdsoap2.c SOAPCPP=../../../../stdsoap2.cpp SOAPDOMC=../../../../dom.c SOAPDOMCPP=../../../../dom.cpp TYPEMAP=../../../../typemap.dat CC=gcc CPP=g++ LIBS=-lssl -lcrypto GSFLAGS=-L -I../../../../import COFLAGS=-O2 CWFLAGS=-Wall -Wno-deprecated-declarations CIFLAGS=-I. -I../../../.. -I../../../../plugin CMFLAGS=-DWITH_DOM -DWITH_OPENSSL #CMFLAGS=-DDEBUG -DWITH_DOM -DWITH_OPENSSL CFLAGS= $(CWFLAGS) $(COFLAGS) $(CIFLAGS) $(CMFLAGS) all: cacert.cer calculator calculator: calculator.h calculator.cpp $(SOAPH) $(SOAPC) $(GSOAP) $(GSFLAGS) -a -j calculator.h $(CPP) $(CFLAGS) -o calculator calculator.cpp soapC.cpp soapBasicHttpBinding_USCOREICalculatorService.cpp soapBasicHttpBinding_USCOREICalculatorProxy.cpp $(SOAPDOMCPP) $(SOAPCPP) $(LIBS) %.cer: %.pem openssl x509 -in $< -outform der -out $@ calculator.h: $(WSDL) -t $(TYPEMAP) -o calculator.h $(URL)?wsdl .PHONY: clean distclean clean: rm -f *.o soapH.h soapStub.h soapC.* soapClient.* soapServer.* soap*Proxy.* soap*Service.* soap*Object.* distclean: rm -f *.o soapH.h soapStub.h soapC.* soapClient.* soapServer.* soap*Proxy.* soap*Service.* soap*Object.* rm -f *.xml *.nsmap *.log rm -f calculator gsoap-2.8.91/gsoap/samples/wcf/Basic/TransportSecurity/server.pem0000644000175000017500000000724213525245163024411 0ustar ellertellert-----BEGIN ENCRYPTED PRIVATE KEY----- MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIQcdZuFt0YzgCAggA MBQGCCqGSIb3DQMHBAig/PutfpxHfwSCAoCSsevV3jWwaMLqzkz4FtHPPKI9Guiz y3HjO4uHUnTZNyHA87ukCBYcn06fj4lLsdzShC4PKq1us9WlPgp7iXjS3HxvSNkV JaKfZ1W0LtNnY5BJvp+rFgmrO0/FWwVBuCg4yQCO0PtREif5Sf47qMn/uQI+G9K9 nZcav3w+nI6p9pwUcyFEpKFMLixCFNBHnQCO0SA7PsSHcHe8vntvMXGYnnEjjSq7 pjD2eIV0A5lDYn/u0HQasY0FvLqbDWblZtcI2DAAbwzq0YPK3kPYEKUe/9r3JT5o kRsVak7ZOao1Xfd4c57QrRk4zNuPLDmQJFi3FhtScMGB2de5QIKnzvAyjU2TMhKK xezFZ173p6wNO7+xTmurZ5wfgZQ9EbbaGzdFMhH+IZA0NEVogZn40fjoWKR0Xhwc FfQUuCraq9O7V6xmR19vJNzGGD5WljzTaHPdqlJiBof9L32IfJnEMelr4wf/kZFq VMYieFjB8GZslZEKJC3Y3r+4KOZwdPz3fPCTyYcYt13TFRc+ffE632GHZr4LRrJD +Gy8QHxkA1veyeh+2U52lJylzK2JKQ2nqcIk0d5AIizAf4e6Ow2NXmUgUpirJgUH hfI4Ejed8zgoqk5T2k1jj8zY7I7lpHo4V5Fi5lwc3ubzKZi6lD/Rdqcz3uZUN8gQ 8ZQe4XHtImsS9QkgdAeVgzLW5rKrx5UKYI2z7538YAanSJGX0N2c6Fsd0rx4sFkx HqVgwy0JEZT2ajwdkVOXIEnVZ7/immdAyddeYnxnHl6GnKP6i7vN8/9jCu/VSSzt HECoqQ7eu0j+PsAN0N0JVbTJMEgWwkKc7RG+4M4MNIbTbLJn16KEfCxD -----END ENCRYPTED PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIID4TCCA0qgAwIBAgIBITANBgkqhkiG9w0BAQUFADCBjTELMAkGA1UEBhMCVVMx CzAJBgNVBAgTAkZMMRQwEgYDVQQHEwtUYWxsYWhhc3NlZTEWMBQGA1UEChMNR2Vu aXZpYSwgSW5jLjELMAkGA1UECxMCSVQxEjAQBgNVBAMTCWxvY2FsaG9zdDEiMCAG CSqGSIb3DQEJARYTY29udGFjdEBnZW5pdmlhLmNvbTAeFw0xODA4MjUxNzU4Mzda Fw0yMTA4MjQxNzU4MzdaMIGNMQswCQYDVQQGEwJVUzELMAkGA1UECBMCRkwxFDAS BgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJbmMuMQswCQYD VQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcNAQkBFhNjb250 YWN0QGdlbml2aWEuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDsMNey f1zqU26XTAYsjsHVfSzuQcHX7H6rVDej4i+syy7JF198AlZXKNyx+lDbDzTWmEJM wJtelxoVmnnIJPYTxWlWYCXc+9QwopQ4Jm0rANdfTujDDHug2uMxfTiJNJGq4eOm VrghruL6l96H5aHveauzUh7XiEbcFSL9+1h8twIDAQABo4IBTTCCAUkwCQYDVR0T BAIwADALBgNVHQ8EBAMCBPAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd BgNVHQ4EFgQUl21S3PtNIU5VptaFc0rS21mVve4wgcIGA1UdIwSBujCBt4AUVixg D6n5N0NNc/tWvNSYuhDTKkmhgZOkgZAwgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb22CCQCG9y4FBiOi4zANBgkqhkiG9w0BAQUF AAOBgQBE4Swc3a+wyEXqXGB753H10PmpqpcmpUaLmTfBKvgl1WeLhAZqcpKiKWnH s2BNKE68Ndlopo4ttP3DIkf69vKrUrTANzui5pdShdEom6SJ1yjm/mTFSXNOxAs7 kkbwMTnYltSLvNLdBV22pVmHbRP0G6xwTi7Br5ZIGcQGEQDaDw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJAIb3LgUGI6LjMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE4MDgy NTE3NTczNloXDTIxMDgyNDE3NTczNlowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBAMXNOWKaNVtyWpWa/5/mNXZ7cgv+v5B1RL0OoOwvoQ5dHhc4KycDPAtiiV+I AoZy7bLbARWJboLPo3JnOf3Mc0aQjVFXz+X8eVhEseCIP4HAWSGa5ISDVDdxj4Nh RfwlVtrmLdL08HkTr+f3scHRvtvtmAtTFeT9FOCzttMpBRTXAgMBAAGjgfUwgfIw HQYDVR0OBBYEFFYsYA+p+TdDTXP7VrzUmLoQ0ypJMIHCBgNVHSMEgbowgbeAFFYs YA+p+TdDTXP7VrzUmLoQ0ypJoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkAhvcuBQYjouMwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQA1xebtW3G5e9Xfz2zys4d+628r2qy4ov0ggGS5 WmrBhyIFCE+xW1bj5waLMOt0e4+yfODMTcVKArrrthJdHm5YFILT9ZU2hOEOZw5P Dizc3Q34yzQxXrpsaHri5OfM0wgiIJOynz/YbX2f46YpqhMT7VvNoI8sR+OIydcY mi3qVQ== -----END CERTIFICATE----- gsoap-2.8.91/gsoap/samples/wcf/Basic/TransportSecurity/client.pem0000644000175000017500000000724213525245163024361 0ustar ellertellert-----BEGIN ENCRYPTED PRIVATE KEY----- MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIaWE062ig1DwCAggA MBQGCCqGSIb3DQMHBAiV2CAcBIqLvgSCAoAb2rFc/f92WlyYUdMgbb1/DXzLve/T hH54rQiYOz0amfOReQGGxgSvatKRtSJY67fh8K5aoqqV+UKoXhYtb4jxAJtdszrM QlMKGVze2tsBCnjDYJf9aPVQFYDlRTcAqLYd6p+SScVHUaPNk0DND0qhvgN8bs31 QMiSFxZLEE5WJKBlIYiJ0JZSdNRMf+D7aZCe4fTJ+GHE8zQJ1DwvHE/4KKaUFNPS OMrAU2ew1WdjORP2uYKW+uur1IQOL0Op6+h2jGqvzeS1yTBOeaDP/qM0cS8u3wBH uRmE2RWpI69lgb8clsNlRpd8sod0q2K0RruwbHlzSS0f8YEYQDNMIaqFTOv2bDcB lMHa6UTzoacGTAhiaI9T9LwiHOQP7fmXMfQcSCXH/K6IO4A6pjcUW1ZntaNQzK0C fDR2iSEwUbJxlgoUmR9Knv15kMBlOs5kVvvlYYS/gDIoZP73kqDIntyjjnfgJCOu K/2JQ8VyPkeqZPzVR8BRUZ7VIH0AropEXZpFOHWL226ye7i6qHivA5ZEIOgPhKd9 PmbnHN3GDFnSDUNgj3ZS95XwJ+7rsF73NO9TzkUYcsktIaanc591SPFTDznB7AIE k280QJbGPJaM6B2bpFZHCHt53vdg2IeFcSQlBPASmySYFblhI8GH+wETuvb0I1GA ZsCb1H3jWflYW8Ma03ZiQ8Y28acGm/GjTYEXco5LNHXXMA6gYv1DFurfaa3jdU7K +JOyPHYdtJKKv9g+OVXG+MF8kRWX16U6SzS/0xFCYoXsHUVggzV+y1ssghPeAIL3 5sRXN+3GYkSi7e0hyp7Xn5QDcgeTxhsY/BPelhFRNwM1pt0UG1LiEr23 -----END ENCRYPTED PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIID4TCCA0qgAwIBAgIBIDANBgkqhkiG9w0BAQUFADCBjTELMAkGA1UEBhMCVVMx CzAJBgNVBAgTAkZMMRQwEgYDVQQHEwtUYWxsYWhhc3NlZTEWMBQGA1UEChMNR2Vu aXZpYSwgSW5jLjELMAkGA1UECxMCSVQxEjAQBgNVBAMTCWxvY2FsaG9zdDEiMCAG CSqGSIb3DQEJARYTY29udGFjdEBnZW5pdmlhLmNvbTAeFw0xODA4MjUxNzU4MDha Fw0yMTA4MjQxNzU4MDhaMIGNMQswCQYDVQQGEwJVUzELMAkGA1UECBMCRkwxFDAS BgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJbmMuMQswCQYD VQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcNAQkBFhNjb250 YWN0QGdlbml2aWEuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDPMEu7 ZzcMf8q9pswCg4IMsolqh9zAZxC/fWB+9bQLghD+wjfAna3BP2mvqx+TR0xS4Y/a yDo6yOddFJPujZa61c6wZQvSDhOYBpaQTQhh0XiXfWdVroIvZP0aHmdVzbUUi8IB DtXaOSZMAHALWr94JhcORxKmlpGxK6ldi7UuxQIDAQABo4IBTTCCAUkwCQYDVR0T BAIwADALBgNVHQ8EBAMCBPAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd BgNVHQ4EFgQURsvkJ2+Evc35UiOMgTjDPf3xItcwgcIGA1UdIwSBujCBt4AUVixg D6n5N0NNc/tWvNSYuhDTKkmhgZOkgZAwgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb22CCQCG9y4FBiOi4zANBgkqhkiG9w0BAQUF AAOBgQCstkf6RkWhM6XzS7e9sHQJc7t3ErT4m0+Py8MyApuX5Yx5/byhCGTRjotr qmWONRiathIRwhUPgi4DYqD2YnDZsmNWVgeeMubyzkXI+M2XBus2hQsSg49pgnm/ dYPoI3GtWYk7XK9LBaE4E5LC1aZO7JOrQHyZ5810K9qQEcs2Dg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJAIb3LgUGI6LjMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE4MDgy NTE3NTczNloXDTIxMDgyNDE3NTczNlowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBAMXNOWKaNVtyWpWa/5/mNXZ7cgv+v5B1RL0OoOwvoQ5dHhc4KycDPAtiiV+I AoZy7bLbARWJboLPo3JnOf3Mc0aQjVFXz+X8eVhEseCIP4HAWSGa5ISDVDdxj4Nh RfwlVtrmLdL08HkTr+f3scHRvtvtmAtTFeT9FOCzttMpBRTXAgMBAAGjgfUwgfIw HQYDVR0OBBYEFFYsYA+p+TdDTXP7VrzUmLoQ0ypJMIHCBgNVHSMEgbowgbeAFFYs YA+p+TdDTXP7VrzUmLoQ0ypJoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkAhvcuBQYjouMwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQA1xebtW3G5e9Xfz2zys4d+628r2qy4ov0ggGS5 WmrBhyIFCE+xW1bj5waLMOt0e4+yfODMTcVKArrrthJdHm5YFILT9ZU2hOEOZw5P Dizc3Q34yzQxXrpsaHri5OfM0wgiIJOynz/YbX2f46YpqhMT7VvNoI8sR+OIydcY mi3qVQ== -----END CERTIFICATE----- gsoap-2.8.91/gsoap/samples/wcf/Basic/TransportSecurity/calculator.cpp0000644000175000017500000002573613525245163025245 0ustar ellertellert/* calculator.cpp WCF BasicTransportSecurity Binding demo See the README.txt gSOAP XML Web services tools Copyright (C) 2000-2012, 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-2012, 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 "soapBasicHttpBinding_USCOREICalculatorService.h" #include "soapBasicHttpBinding_USCOREICalculatorProxy.h" #include "BasicHttpBinding_USCOREICalculator.nsmap" #include "threads.h" /* gsoap/plugin/threads.h */ int CRYPTO_thread_setup(); void CRYPTO_thread_cleanup(); const char *URI = "https://10.0.1.5:8000/ServiceModelSamples/service"; // the service URI int main(int argc, char **argv) { if (CRYPTO_thread_setup()) { std::cerr << "Cannot setup thread mutex for OpenSSL" << std::endl; exit(1); } if (argc >= 2) { // Service sample application int port = atoi(argv[1]); BasicHttpBinding_USCOREICalculatorService service(SOAP_XML_INDENT); service.soap->send_timeout = service.soap->recv_timeout = 10; // 10 sec /* The supplied server certificate "server.pem" assumes that the server is running on 'localhost', so clients can only connect from the same host when verifying the server's certificate. To verify the certificates of third-party services, they must provide a certificate issued by Verisign or another trusted CA. At the client-side, the capath parameter should point to a directory that contains these trusted (root) certificates or the cafile parameter should refer to one file will all certificates. To help you out, the supplied "cacerts.pem" file contains the certificates issued by various CAs. You should use this file for the cafile parameter instead of "cacert.pem" to connect to trusted servers. Note that the client may fail to connect if the server's credentials have problems (e.g. expired). Note 1: the password and capath are not used with GNUTLS Note 2: setting capath may not work on Windows. */ if (soap_ssl_server_context(service.soap, SOAP_SSL_DEFAULT, /* use SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION to verify clients: client must provide a key file e.g. "client.pem" and "password" */ "server.pem", /* keyfile (cert+key): see SSL docs to create this file */ "password", /* password to read the private key in the key file */ "cacert.pem", /* optional cacert file to store trusted certificates (to authenticate clients) */ NULL, /* optional capath */ "dh512.pem", /* DH file name or DH param key len bits (e.g. "1024"), if NULL use RSA 2048 bits (SOAP_SSL_RSA_BITS) */ NULL, /* if randfile!=NULL: use a file with random data to seed randomness */ NULL /* optional server identification for SSL session cache (unique server name, e.g. use argv[0]) */ )) { service.soap_stream_fault(std::cerr); exit(1); } std::cerr << "Server running" << std::endl; for (;;) { service.ssl_run(port); service.soap_stream_fault(std::cerr); } } else { // Client sample application BasicHttpBinding_USCOREICalculatorProxy proxy(URI, SOAP_XML_INDENT); proxy.soap->send_timeout = proxy.soap->recv_timeout = 10; // 10 sec if (soap_ssl_client_context(proxy.soap, SOAP_SSL_DEFAULT | SOAP_SSL_SKIP_HOST_CHECK, NULL, /* keyfile (cert+key): required only when client must authenticate to server (see SSL docs to create this file) */ NULL, /* password to read the keyfile */ "cacert.pem", /* optional cacert file to store trusted certificates, use cacerts.pem for all public certificates issued by common CAs */ NULL, /* optional capath to directory with trusted certificates */ NULL /* optional: use a file with random data to seed randomness */ )) { proxy.soap_stream_fault(std::cerr); exit(1); } double n1 = 3.14, n2 = 1.41; _mssamt__Add areq; _mssamt__AddResponse ares; areq.n1 = &n1; areq.n2 = &n2; if (proxy.Add(&areq, &ares) == SOAP_OK && ares.AddResult) printf("Add(%g, %g) = %g\n", *areq.n1, *areq.n2, *ares.AddResult); else proxy.soap_stream_fault(std::cerr); proxy.destroy(); _mssamt__Subtract sreq; _mssamt__SubtractResponse sres; sreq.n1 = &n1; sreq.n2 = &n2; if (proxy.Subtract(&sreq, &sres) == SOAP_OK && sres.SubtractResult) printf("Subtract(%g, %g) = %g\n", *sreq.n1, *sreq.n2, *sres.SubtractResult); else proxy.soap_stream_fault(std::cerr); proxy.destroy(); _mssamt__Multiply mreq; _mssamt__MultiplyResponse mres; mreq.n1 = &n1; mreq.n2 = &n2; if (proxy.Multiply(&mreq, &mres) == SOAP_OK && mres.MultiplyResult) printf("Multiply(%g, %g) = %g\n", *mreq.n1, *mreq.n2, *mres.MultiplyResult); else proxy.soap_stream_fault(std::cerr); proxy.destroy(); _mssamt__Divide dreq; _mssamt__DivideResponse dres; dreq.n1 = &n1; dreq.n2 = &n2; if (proxy.Divide(&dreq, &dres) == SOAP_OK && dres.DivideResult) printf("Divide(%g, %g) = %g\n", *dreq.n1, *dreq.n2, *dres.DivideResult); else proxy.soap_stream_fault(std::cerr); proxy.destroy(); } CRYPTO_thread_cleanup(); return 0; } /******************************************************************************\ * * Service operations * \******************************************************************************/ int BasicHttpBinding_USCOREICalculatorService::Add(_mssamt__Add *Add, _mssamt__AddResponse *AddResponse) { double *res = (double*)soap_malloc(soap, sizeof(double)); if (Add && Add->n1 && Add->n2) *res = *Add->n1 + *Add->n2; else return soap_sender_fault(soap, "Invalid data", NULL); AddResponse->AddResult = res; return SOAP_OK; } int BasicHttpBinding_USCOREICalculatorService::Subtract(_mssamt__Subtract *Subtract, _mssamt__SubtractResponse *SubtractResponse) { double *res = (double*)soap_malloc(soap, sizeof(double)); if (Subtract && Subtract->n1 && Subtract->n2) *res = *Subtract->n1 - *Subtract->n2; else return soap_sender_fault(soap, "Invalid data", NULL); SubtractResponse->SubtractResult = res; return SOAP_OK; } int BasicHttpBinding_USCOREICalculatorService::Multiply(_mssamt__Multiply *Multiply, _mssamt__MultiplyResponse *MultiplyResponse) { double *res = (double*)soap_malloc(soap, sizeof(double)); if (Multiply && Multiply->n1 && Multiply->n2) *res = *Multiply->n1 * *Multiply->n2; else return soap_sender_fault(soap, "Invalid data", NULL); MultiplyResponse->MultiplyResult = res; return SOAP_OK; } int BasicHttpBinding_USCOREICalculatorService::Divide(_mssamt__Divide *Divide, _mssamt__DivideResponse *DivideResponse) { double *res = (double*)soap_malloc(soap, sizeof(double)); if (Divide && Divide->n1 && Divide->n2 && *Divide->n2 != 0.0) *res = *Divide->n1 / *Divide->n2; else return soap_sender_fault(soap, "Invalid data", NULL); DivideResponse->DivideResult = res; return SOAP_OK; } /******************************************************************************\ * * OpenSSL * \******************************************************************************/ #ifdef WITH_OPENSSL struct CRYPTO_dynlock_value { MUTEX_TYPE mutex; }; static MUTEX_TYPE *mutex_buf; static struct CRYPTO_dynlock_value *dyn_create_function(const char *file, int line) { struct CRYPTO_dynlock_value *value; value = (struct CRYPTO_dynlock_value*)malloc(sizeof(struct CRYPTO_dynlock_value)); if (value) MUTEX_SETUP(value->mutex); return value; } static void dyn_lock_function(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line) { if (mode & CRYPTO_LOCK) MUTEX_LOCK(l->mutex); else MUTEX_UNLOCK(l->mutex); } static void dyn_destroy_function(struct CRYPTO_dynlock_value *l, const char *file, int line) { MUTEX_CLEANUP(l->mutex); free(l); } void locking_function(int mode, int n, const char *file, int line) { if (mode & CRYPTO_LOCK) MUTEX_LOCK(mutex_buf[n]); else MUTEX_UNLOCK(mutex_buf[n]); } unsigned long id_function() { return (unsigned long)THREAD_ID; } int CRYPTO_thread_setup() { int i; mutex_buf = (MUTEX_TYPE*)malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t)); if (!mutex_buf) return SOAP_EOM; for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_SETUP(mutex_buf[i]); CRYPTO_set_id_callback(id_function); CRYPTO_set_locking_callback(locking_function); CRYPTO_set_dynlock_create_callback(dyn_create_function); CRYPTO_set_dynlock_lock_callback(dyn_lock_function); CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function); return SOAP_OK; } void CRYPTO_thread_cleanup() { int i; if (!mutex_buf) return; CRYPTO_set_id_callback(NULL); CRYPTO_set_locking_callback(NULL); CRYPTO_set_dynlock_create_callback(NULL); CRYPTO_set_dynlock_lock_callback(NULL); CRYPTO_set_dynlock_destroy_callback(NULL); for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_CLEANUP(mutex_buf[i]); free(mutex_buf); mutex_buf = NULL; } #else /* OpenSSL not used, e.g. GNUTLS is used */ int CRYPTO_thread_setup() { return SOAP_OK; } void CRYPTO_thread_cleanup() { } #endif gsoap-2.8.91/gsoap/samples/wcf/Basic/TransportSecurity/README.txt0000644000175000017500000001010313525245163024064 0ustar ellertellertINSTRUCTIONS Install the WCF samples by downloading the "Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4." from the Microsoft download site (you may have to search). You should have: C:\WF_WCF_Samples\WCF\Basic\Binding\Basic\TransportSecurity\CS Open the Basic TransportSecurity WCF C# example client and service project in Visual Studio. Modify the configuration and source code as described below. Notes: C:> denotes the Windows command line $ denotes the Unix/Linux command line To generate keys and certificates --------------------------------- Convert PEM to cer format: $ make cacert.cer Import cacert.cer by opening it on the Windows machine and then select Install Certificate. Change client.cs by removing the RemoteCertValidate(...) check to always return true, or modify according to certificate properties to enforce. To connect a WCF client to a gSOAP service ------------------------------------------ Import cacert.cer on the windows machine, see above. In App.config set the endpoint to the gSOAP server endpoint, say "10.0.1.5" over wifi: Run the gSOAP server on port 8000 and then the client. $ ./calculator 8000 C:\WF_WCF_Samples\WCF\Basic\Binding\Basic\TransportSecurity\CS\client\bin\client.exe To self-host a WCF service -------------------------- Obtain the machine name or IP C:> ipconfig /all say it is 10.0.1.5 over wifi. Add a Program class with Main() to the WCF sample to self host a service: C:\WF_WCF_Samples\WCF\Basic\Binding\Basic\TransportSecurity\CS\service with the following Program class put in the namespace: using System; using System.ServiceModel; using System.Configuration; using System.ServiceModel.Description; namespace ... { ... public class Program { public static void Main() { Uri httpUrl = new Uri("https://10.0.1.5:8000/ServiceModelSamples/service"); using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), httpUrl)) { BasicHttpBinding bhb = new BasicHttpBinding(); bhb.Security.Mode = BasicHttpSecurityMode.Transport; bhb.Security.Transport.ClientCredentialType = HttpClientCredentialType.None; serviceHost.AddServiceEndpoint(typeof(ICalculator), bhb, ""); ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpsGetEnabled = true; serviceHost.Description.Behaviors.Add(smb); serviceHost.Open(); Console.WriteLine("Press to terminate service."); Console.ReadLine(); } } } } Under Project Properties change the Output type to Console Application to generate a service.exe. For the self-hosted service to work properly you must configure a port with an SSL certificate, see: https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-configure-a-port-with-an-ssl-certificate If you are using IIS then configure an IIS-hosted WCF service with SSL: https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-configure-an-iis-hosted-wcf-service-with-ssl After compiling, run service.exe from the command prompt (this may require administrator privileges): C:\WF_WCF_Samples\WCF\Basic\Binding\Basic\TransportSecurity\CS\service\bin\service.exe Use a web browser to access the service at https://10.0.1.5:8000/ServiceModelSamples/service and access the WSDL at https://10.0.1.5:8000/ServiceModelSamples/service?wsdl A gSOAP client connects to this https service, but only when the service certificate is registered with the https port of the Windows machine. To run wsdl2h to generate C++ code: $ wsdl2h -t ../../../../typemap.dat -o calculator.h 'http://10.0.1.5:8000/ServiceModelSamples/service?wsdl' This may take some time, since the self-hosted service is an iterative web server that allows only one open connection. A pre-generated calculator.h file is included in the build directory. gsoap-2.8.91/gsoap/samples/wcf/Basic/TransportSecurity/cacert.cer0000644000175000017500000000162413525245163024332 0ustar ellertellert00 vLU0  *H 01 0 UUS1 0 UFL10U Tallahassee10U  Genivia, Inc.1 0 U IT10U localhost1"0  *H  contact@genivia.com0 150804190120Z 180803190120Z01 0 UUS1 0 UFL10U Tallahassee10U  Genivia, Inc.1 0 U IT10U localhost1"0  *H  contact@genivia.com00  *H 0.,F.0̴0BRl}^.hY^T-Jx_9NO}Z p(!GM-I~A"`V.$ʓ9渇L4@|ź K'00Uǂ~Lj: Yc*0U#0ǂ~Lj: Yc*С01 0 UUS1 0 UFL10U Tallahassee10U  Genivia, Inc.1 0 U IT10U localhost1"0  *H  contact@genivia.com vLU0 U00  *H ~~fpjwGI l!ǾR@&v) 8u&F&C#< ~ ,)nZqsak \3HS)@j^H bf0| ELy l.gsoap-2.8.91/gsoap/samples/wcf/Basic/TransportSecurity/cacert.pem0000644000175000017500000000242213525245163024337 0ustar ellertellert-----BEGIN CERTIFICATE----- MIIDkDCCAvmgAwIBAgIJAIb3LgUGI6LjMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD VQQGEwJVUzELMAkGA1UECBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYD VQQKEw1HZW5pdmlhLCBJbmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxo b3N0MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGdlbml2aWEuY29tMB4XDTE4MDgy NTE3NTczNloXDTIxMDgyNDE3NTczNlowgY0xCzAJBgNVBAYTAlVTMQswCQYDVQQI EwJGTDEUMBIGA1UEBxMLVGFsbGFoYXNzZWUxFjAUBgNVBAoTDUdlbml2aWEsIElu Yy4xCzAJBgNVBAsTAklUMRIwEAYDVQQDEwlsb2NhbGhvc3QxIjAgBgkqhkiG9w0B CQEWE2NvbnRhY3RAZ2VuaXZpYS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ AoGBAMXNOWKaNVtyWpWa/5/mNXZ7cgv+v5B1RL0OoOwvoQ5dHhc4KycDPAtiiV+I AoZy7bLbARWJboLPo3JnOf3Mc0aQjVFXz+X8eVhEseCIP4HAWSGa5ISDVDdxj4Nh RfwlVtrmLdL08HkTr+f3scHRvtvtmAtTFeT9FOCzttMpBRTXAgMBAAGjgfUwgfIw HQYDVR0OBBYEFFYsYA+p+TdDTXP7VrzUmLoQ0ypJMIHCBgNVHSMEgbowgbeAFFYs YA+p+TdDTXP7VrzUmLoQ0ypJoYGTpIGQMIGNMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCRkwxFDASBgNVBAcTC1RhbGxhaGFzc2VlMRYwFAYDVQQKEw1HZW5pdmlhLCBJ bmMuMQswCQYDVQQLEwJJVDESMBAGA1UEAxMJbG9jYWxob3N0MSIwIAYJKoZIhvcN AQkBFhNjb250YWN0QGdlbml2aWEuY29tggkAhvcuBQYjouMwDAYDVR0TBAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQA1xebtW3G5e9Xfz2zys4d+628r2qy4ov0ggGS5 WmrBhyIFCE+xW1bj5waLMOt0e4+yfODMTcVKArrrthJdHm5YFILT9ZU2hOEOZw5P Dizc3Q34yzQxXrpsaHri5OfM0wgiIJOynz/YbX2f46YpqhMT7VvNoI8sR+OIydcY mi3qVQ== -----END CERTIFICATE----- gsoap-2.8.91/gsoap/samples/wcf/Basic/Http/0000755000175000017500000000000013525245163017566 5ustar ellertellertgsoap-2.8.91/gsoap/samples/wcf/Basic/Http/calculator.h0000644000175000017500000010344513525245163022077 0ustar ellertellert// Reminder: Modify typemap.dat to customize the header file generated by wsdl2h /* calculator.h Generated by wsdl2h 2.8.9 from http://192.168.2.2:8000/ServiceModelSamples/service?wsdl and ../../typemap.dat 2012-05-22 19:24:39 GMT DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS USE THE soapcpp2-GENERATED SOURCE CODE FILES FOR YOUR PROJECT BUILDS gSOAP XML Web services tools. Copyright (C) 2001-2012 Robert van Engelen, Genivia Inc. All Rights Reserved. Part of this software is released under one of the following licenses: GPL or Genivia's license for commercial use. */ /** @page page_notes Usage Notes NOTE: - Run soapcpp2 on calculator.h to generate the SOAP/XML processing logic. Use soapcpp2 option -I to specify paths for #import To build with STL, 'stlvector.h' is imported from 'import' dir in package. Use soapcpp2 option -i to generate improved proxy and server classes. - 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) on this file to generate documentation. - Use wsdl2h options -nname and -Nname to globally rename the prefix 'ns'. - Use wsdl2h option -d to enable DOM support for xsd:anyType. - Use wsdl2h option -g to auto-generate readers and writers for root elements. - Struct/class members serialized as XML attributes are annotated with a '@'. - Struct/class members that have a special role are annotated with a '$'. WARNING: DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS. USE THE SOURCE CODE FILES GENERATED BY soapcpp2 FOR YOUR PROJECT BUILDS: THE soapStub.h FILE CONTAINS THIS CONTENT WITHOUT ANNOTATIONS. LICENSE: @verbatim -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following two licenses: 1) GPL or 2) Genivia's license for commercial use. -------------------------------------------------------------------------------- 1) 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. -------------------------------------------------------------------------------- 2) A commercial-use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- @endverbatim */ //gsoapopt w /******************************************************************************\ * * * Definitions * * http://tempuri.org/ * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ // STL vector containers (use option -s to remove STL dependency) #import "stlvector.h" /******************************************************************************\ * * * 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: tempuri = "http://tempuri.org/" mssamhi = "http://Microsoft.Samples.Http/Imports" mssamh = "http://Microsoft.Samples.Http" */ #define SOAP_NAMESPACE_OF_mssamhi "http://Microsoft.Samples.Http/Imports" //gsoap mssamhi schema namespace: http://Microsoft.Samples.Http/Imports //gsoap mssamhi schema form: unqualified #define SOAP_NAMESPACE_OF_mssamh "http://Microsoft.Samples.Http" //gsoap mssamh schema namespace: http://Microsoft.Samples.Http //gsoap mssamh schema elementForm: qualified //gsoap mssamh schema attributeForm: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ /******************************************************************************\ * * * Forward Declarations * * * \******************************************************************************/ // Forward declaration of class _mssamh__Add. class _mssamh__Add; // Forward declaration of class _mssamh__AddResponse. class _mssamh__AddResponse; // Forward declaration of class _mssamh__Subtract. class _mssamh__Subtract; // Forward declaration of class _mssamh__SubtractResponse. class _mssamh__SubtractResponse; // Forward declaration of class _mssamh__Multiply. class _mssamh__Multiply; // Forward declaration of class _mssamh__MultiplyResponse. class _mssamh__MultiplyResponse; // Forward declaration of class _mssamh__Divide. class _mssamh__Divide; // Forward declaration of class _mssamh__DivideResponse. class _mssamh__DivideResponse; /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://Microsoft.Samples.Http/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://Microsoft.Samples.Http * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://Microsoft.Samples.Http/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://Microsoft.Samples.Http * * * \******************************************************************************/ /// Top-level root element "http://Microsoft.Samples.Http":Add /// "http://Microsoft.Samples.Http":Add is a complexType. class _mssamh__Add { public: /// Element n1 of type xs:double. double* n1 0; ///< Optional element. /// Element n2 of type xs:double. double* n2 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.Http":AddResponse /// "http://Microsoft.Samples.Http":AddResponse is a complexType. class _mssamh__AddResponse { public: /// Element AddResult of type xs:double. double* AddResult 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.Http":Subtract /// "http://Microsoft.Samples.Http":Subtract is a complexType. class _mssamh__Subtract { public: /// Element n1 of type xs:double. double* n1 0; ///< Optional element. /// Element n2 of type xs:double. double* n2 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.Http":SubtractResponse /// "http://Microsoft.Samples.Http":SubtractResponse is a complexType. class _mssamh__SubtractResponse { public: /// Element SubtractResult of type xs:double. double* SubtractResult 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.Http":Multiply /// "http://Microsoft.Samples.Http":Multiply is a complexType. class _mssamh__Multiply { public: /// Element n1 of type xs:double. double* n1 0; ///< Optional element. /// Element n2 of type xs:double. double* n2 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.Http":MultiplyResponse /// "http://Microsoft.Samples.Http":MultiplyResponse is a complexType. class _mssamh__MultiplyResponse { public: /// Element MultiplyResult of type xs:double. double* MultiplyResult 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.Http":Divide /// "http://Microsoft.Samples.Http":Divide is a complexType. class _mssamh__Divide { public: /// Element n1 of type xs:double. double* n1 0; ///< Optional element. /// Element n2 of type xs:double. double* n2 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /// Top-level root element "http://Microsoft.Samples.Http":DivideResponse /// "http://Microsoft.Samples.Http":DivideResponse is a complexType. class _mssamh__DivideResponse { public: /// Element DivideResult of type xs:double. double* DivideResult 0; ///< Optional element. /// A handle to the soap struct that manages this instance (automatically set) struct soap *soap ; }; /******************************************************************************\ * * * Additional Top-Level Elements * * http://Microsoft.Samples.Http/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * http://Microsoft.Samples.Http/Imports * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Elements * * http://Microsoft.Samples.Http * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * http://Microsoft.Samples.Http * * * \******************************************************************************/ /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap tempuri service name: BasicHttpBinding_USCOREICalculator //gsoap tempuri service type: ICalculator //gsoap tempuri service port: http://192.168.2.2:8000/ServiceModelSamples/service //gsoap tempuri service namespace: http://tempuri.org/ //gsoap tempuri service transport: http://schemas.xmlsoap.org/soap/http /** @mainpage CalculatorService Definitions @section CalculatorService_bindings Service Bindings - @ref BasicHttpBinding_USCOREICalculator @section CalculatorService_more More Information - @ref page_notes "Usage Notes" - @ref page_XMLDataBinding "XML Data Binding" - @ref SOAP_ENV__Header "SOAP Header Content" (when applicable) - @ref SOAP_ENV__Detail "SOAP Fault Detail Content" (when applicable) */ /** @page BasicHttpBinding_USCOREICalculator Binding "BasicHttpBinding_USCOREICalculator" @section BasicHttpBinding_USCOREICalculator_operations Operations of Binding "BasicHttpBinding_USCOREICalculator" - @ref __tempuri__Add - @ref __tempuri__Subtract - @ref __tempuri__Multiply - @ref __tempuri__Divide @section BasicHttpBinding_USCOREICalculator_ports Endpoints of Binding "BasicHttpBinding_USCOREICalculator" - http://192.168.2.2:8000/ServiceModelSamples/service Note: use wsdl2h option -N to change the service binding prefix name */ /******************************************************************************\ * * * Service Binding * * BasicHttpBinding_USCOREICalculator * * * \******************************************************************************/ /******************************************************************************\ * * * Service Operation * * __tempuri__Add * * * \******************************************************************************/ /// Operation "__tempuri__Add" of service binding "BasicHttpBinding_USCOREICalculator" /** Operation details: - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.Http/ICalculator/Add" - Addressing method action: "http://tempuri.org//ICalculator/Add" - Addressing method output action: "http://tempuri.org//ICalculator/AddResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___tempuri__Add( 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: _mssamh__Add* mssamh__Add, // response parameters: _mssamh__AddResponse* mssamh__AddResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Add( struct soap *soap, // request parameters: _mssamh__Add* mssamh__Add, // response parameters: _mssamh__AddResponse* mssamh__AddResponse ); @endcode C++ proxy class (defined in soapBasicHttpBinding_USCOREICalculatorProxy.h): @code class BasicHttpBinding_USCOREICalculatorProxy; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapBasicHttpBinding_USCOREICalculatorService.h): @code class BasicHttpBinding_USCOREICalculatorService; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Add document //gsoap tempuri service method-encoding: Add literal //gsoap tempuri service method-action: Add http://Microsoft.Samples.Http/ICalculator/Add //gsoap tempuri service method-output-action: Add http://tempuri.org//ICalculator/AddResponse int __tempuri__Add( _mssamh__Add* mssamh__Add, ///< Request parameter _mssamh__AddResponse* mssamh__AddResponse ///< Response parameter ); /******************************************************************************\ * * * Service Operation * * __tempuri__Subtract * * * \******************************************************************************/ /// Operation "__tempuri__Subtract" of service binding "BasicHttpBinding_USCOREICalculator" /** Operation details: - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.Http/ICalculator/Subtract" - Addressing method action: "http://tempuri.org//ICalculator/Subtract" - Addressing method output action: "http://tempuri.org//ICalculator/SubtractResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___tempuri__Subtract( 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: _mssamh__Subtract* mssamh__Subtract, // response parameters: _mssamh__SubtractResponse* mssamh__SubtractResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Subtract( struct soap *soap, // request parameters: _mssamh__Subtract* mssamh__Subtract, // response parameters: _mssamh__SubtractResponse* mssamh__SubtractResponse ); @endcode C++ proxy class (defined in soapBasicHttpBinding_USCOREICalculatorProxy.h): @code class BasicHttpBinding_USCOREICalculatorProxy; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapBasicHttpBinding_USCOREICalculatorService.h): @code class BasicHttpBinding_USCOREICalculatorService; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Subtract document //gsoap tempuri service method-encoding: Subtract literal //gsoap tempuri service method-action: Subtract http://Microsoft.Samples.Http/ICalculator/Subtract //gsoap tempuri service method-output-action: Subtract http://tempuri.org//ICalculator/SubtractResponse int __tempuri__Subtract( _mssamh__Subtract* mssamh__Subtract, ///< Request parameter _mssamh__SubtractResponse* mssamh__SubtractResponse ///< Response parameter ); /******************************************************************************\ * * * Service Operation * * __tempuri__Multiply * * * \******************************************************************************/ /// Operation "__tempuri__Multiply" of service binding "BasicHttpBinding_USCOREICalculator" /** Operation details: - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.Http/ICalculator/Multiply" - Addressing method action: "http://tempuri.org//ICalculator/Multiply" - Addressing method output action: "http://tempuri.org//ICalculator/MultiplyResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___tempuri__Multiply( 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: _mssamh__Multiply* mssamh__Multiply, // response parameters: _mssamh__MultiplyResponse* mssamh__MultiplyResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Multiply( struct soap *soap, // request parameters: _mssamh__Multiply* mssamh__Multiply, // response parameters: _mssamh__MultiplyResponse* mssamh__MultiplyResponse ); @endcode C++ proxy class (defined in soapBasicHttpBinding_USCOREICalculatorProxy.h): @code class BasicHttpBinding_USCOREICalculatorProxy; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapBasicHttpBinding_USCOREICalculatorService.h): @code class BasicHttpBinding_USCOREICalculatorService; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Multiply document //gsoap tempuri service method-encoding: Multiply literal //gsoap tempuri service method-action: Multiply http://Microsoft.Samples.Http/ICalculator/Multiply //gsoap tempuri service method-output-action: Multiply http://tempuri.org//ICalculator/MultiplyResponse int __tempuri__Multiply( _mssamh__Multiply* mssamh__Multiply, ///< Request parameter _mssamh__MultiplyResponse* mssamh__MultiplyResponse ///< Response parameter ); /******************************************************************************\ * * * Service Operation * * __tempuri__Divide * * * \******************************************************************************/ /// Operation "__tempuri__Divide" of service binding "BasicHttpBinding_USCOREICalculator" /** Operation details: - SOAP document/literal style messaging - SOAP action: "http://Microsoft.Samples.Http/ICalculator/Divide" - Addressing method action: "http://tempuri.org//ICalculator/Divide" - Addressing method output action: "http://tempuri.org//ICalculator/DivideResponse" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___tempuri__Divide( 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: _mssamh__Divide* mssamh__Divide, // response parameters: _mssamh__DivideResponse* mssamh__DivideResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __tempuri__Divide( struct soap *soap, // request parameters: _mssamh__Divide* mssamh__Divide, // response parameters: _mssamh__DivideResponse* mssamh__DivideResponse ); @endcode C++ proxy class (defined in soapBasicHttpBinding_USCOREICalculatorProxy.h): @code class BasicHttpBinding_USCOREICalculatorProxy; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use proxy classes; C++ service class (defined in soapBasicHttpBinding_USCOREICalculatorService.h): @code class BasicHttpBinding_USCOREICalculatorService; @endcode Important: use soapcpp2 option '-i' to generate greatly improved and easy-to-use service classes; */ //gsoap tempuri service method-style: Divide document //gsoap tempuri service method-encoding: Divide literal //gsoap tempuri service method-action: Divide http://Microsoft.Samples.Http/ICalculator/Divide //gsoap tempuri service method-output-action: Divide http://tempuri.org//ICalculator/DivideResponse int __tempuri__Divide( _mssamh__Divide* mssamh__Divide, ///< Request parameter _mssamh__DivideResponse* mssamh__DivideResponse ///< Response parameter ); /** @page BasicHttpBinding_USCOREICalculator Binding "BasicHttpBinding_USCOREICalculator" @section BasicHttpBinding_USCOREICalculator_policy_enablers Policy Enablers of Binding "BasicHttpBinding_USCOREICalculator" Based on policies, this service imports - WS-Policy reminders and enablers: - WS-Addressing 1.0 (2005/08, accepts 2004/08): @code #import "wsa5.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsaapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code // See the user guide gsoap/doc/wsa/html/index.html @endcode - WS-Addressing (2004/08): @code #import "wsa.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsaapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code // See the user guide gsoap/doc/wsa/html/index.html @endcode - WS-ReliableMessaging 1.1: @code #import "wsrm.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsrmapi.h" soap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code soap_register_plugin(soap, soap_wsrm); // register the wsrm plugin in your code // See the user guide gsoap/doc/wsrm/html/index.html @endcode - WS-Security (SOAP Message Security) 1.0 (accepts 1.1): @code #import "wsse.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsseapi.h" soap_register_plugin(soap, soap_wsse); // register the wsse plugin in your code // See the user guide gsoap/doc/wsse/html/index.html @endcode - WS-Security (SOAP Message Security) 1.1 (accepts 1.0): @code #import "wsse11.h" // to be added to this header file for the soapcpp2 build step @endcode @code #include "plugin/wsseapi.h" soap_register_plugin(soap, soap_wsse); // register the wsse plugin in your code // See the user guide gsoap/doc/wsse/html/index.html @endcode - HTTP Digest Authentication: @code #include "plugin/httpda.h" soap_register_plugin(soap, soap_http_da); // register the HTTP DA plugin in your code // See the user guide gsoap/doc/httpda/html/index.html @endcode */ /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. XML content can be retrieved from: - a file descriptor, using soap->recvfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->is = ... - a buffer, using the soap->frecv() callback XML content can be stored to: - a file descriptor, using soap->sendfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->os = ... - a buffer, using the soap->fsend() callback @section mssamhi Top-level root elements of schema "http://Microsoft.Samples.Http/Imports" @section mssamh Top-level root elements of schema "http://Microsoft.Samples.Http" - @ref _mssamh__Add @code // Reader (returns SOAP_OK on success): soap_read__mssamh__Add(struct soap*, _mssamh__Add*); // Writer (returns SOAP_OK on success): soap_write__mssamh__Add(struct soap*, _mssamh__Add*); @endcode - @ref _mssamh__AddResponse @code // Reader (returns SOAP_OK on success): soap_read__mssamh__AddResponse(struct soap*, _mssamh__AddResponse*); // Writer (returns SOAP_OK on success): soap_write__mssamh__AddResponse(struct soap*, _mssamh__AddResponse*); @endcode - @ref _mssamh__Subtract @code // Reader (returns SOAP_OK on success): soap_read__mssamh__Subtract(struct soap*, _mssamh__Subtract*); // Writer (returns SOAP_OK on success): soap_write__mssamh__Subtract(struct soap*, _mssamh__Subtract*); @endcode - @ref _mssamh__SubtractResponse @code // Reader (returns SOAP_OK on success): soap_read__mssamh__SubtractResponse(struct soap*, _mssamh__SubtractResponse*); // Writer (returns SOAP_OK on success): soap_write__mssamh__SubtractResponse(struct soap*, _mssamh__SubtractResponse*); @endcode - @ref _mssamh__Multiply @code // Reader (returns SOAP_OK on success): soap_read__mssamh__Multiply(struct soap*, _mssamh__Multiply*); // Writer (returns SOAP_OK on success): soap_write__mssamh__Multiply(struct soap*, _mssamh__Multiply*); @endcode - @ref _mssamh__MultiplyResponse @code // Reader (returns SOAP_OK on success): soap_read__mssamh__MultiplyResponse(struct soap*, _mssamh__MultiplyResponse*); // Writer (returns SOAP_OK on success): soap_write__mssamh__MultiplyResponse(struct soap*, _mssamh__MultiplyResponse*); @endcode - @ref _mssamh__Divide @code // Reader (returns SOAP_OK on success): soap_read__mssamh__Divide(struct soap*, _mssamh__Divide*); // Writer (returns SOAP_OK on success): soap_write__mssamh__Divide(struct soap*, _mssamh__Divide*); @endcode - @ref _mssamh__DivideResponse @code // Reader (returns SOAP_OK on success): soap_read__mssamh__DivideResponse(struct soap*, _mssamh__DivideResponse*); // Writer (returns SOAP_OK on success): soap_write__mssamh__DivideResponse(struct soap*, _mssamh__DivideResponse*); @endcode */ /* End of calculator.h */ gsoap-2.8.91/gsoap/samples/wcf/Basic/Http/Doxyfile0000644000175000017500000002271113525245163021277 0ustar ellertellert# Doxyfile 1.3.8 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "WCF Basic Http" PROJECT_NUMBER = "" OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = YES STRIP_FROM_PATH = /Applications/ STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = calculator.h calculator.cpp FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = YES INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = HTML_FOOTER = HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = /usr/local/bin DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO gsoap-2.8.91/gsoap/samples/wcf/Basic/Http/Makefile0000644000175000017500000000224613525245163021232 0ustar ellertellertURL=http://192.168.2.2:8000/ServiceModelSamples/service WSDL=../../../../wsdl/wsdl2h GSOAP=../../../../src/soapcpp2 SOAPH=../../../../stdsoap2.h SOAPC=../../../../stdsoap2.c SOAPCPP=../../../../stdsoap2.cpp SOAPDOMC=../../../../dom.c SOAPDOMCPP=../../../../dom.cpp TYPEMAP=../../../../typemap.dat CC=gcc CPP=g++ LIBS= GSFLAGS=-L -I../../../../import COFLAGS=-O2 CWFLAGS=-Wall -Wno-deprecated-declarations CIFLAGS=-I. -I../../../.. -I../../../../plugin CMFLAGS= #CMFLAGS=-DDEBUG CFLAGS= $(CWFLAGS) $(COFLAGS) $(CIFLAGS) $(CMFLAGS) all: calculator calculator: calculator.h calculator.cpp $(SOAPH) $(SOAPC) $(GSOAP) $(GSFLAGS) -a -j calculator.h $(CPP) $(CFLAGS) -o calculator calculator.cpp soapC.cpp soapBasicHttpBinding_USCOREICalculatorService.cpp soapBasicHttpBinding_USCOREICalculatorProxy.cpp $(SOAPCPP) $(LIBS) calculator.h: $(WSDL) -t $(TYPEMAP) -o calculator.h $(URL)?wsdl .PHONY: clean distclean clean: rm -f *.o soapH.h soapStub.h soapC.* soapClient.* soapServer.* soap*Proxy.* soap*Service.* soap*Object.* distclean: rm -f *.o soapH.h soapStub.h soapC.* soapClient.* soapServer.* soap*Proxy.* soap*Service.* soap*Object.* rm -f *.xml *.nsmap *.log rm -f calculator gsoap-2.8.91/gsoap/samples/wcf/Basic/Http/calculator.cpp0000644000175000017500000001414013525245163022423 0ustar ellertellert/* calculator.cpp WCF BasicHttpBinding demo See the README.txt gSOAP XML Web services tools Copyright (C) 2000-2012, 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-2012, 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 "soapBasicHttpBinding_USCOREICalculatorService.h" #include "soapBasicHttpBinding_USCOREICalculatorProxy.h" #include "BasicHttpBinding_USCOREICalculator.nsmap" const char *URI = "http://10.0.1.5:8000/ServiceModelSamples/service"; // the service endpoint int main(int argc, char **argv) { if (argc >= 2) { // Service sample application int port = atoi(argv[1]); BasicHttpBinding_USCOREICalculatorService service(SOAP_XML_INDENT); service.soap->send_timeout = service.soap->recv_timeout = 10; // 10 sec std::cerr << "Server running" << std::endl; for (;;) { service.run(port); service.soap_stream_fault(std::cerr); } } else { // Client sample application BasicHttpBinding_USCOREICalculatorProxy proxy(URI, SOAP_XML_INDENT); proxy.soap->send_timeout = proxy.soap->recv_timeout = 10; // 10 sec double n1 = 3.14, n2 = 1.41; _mssamh__Add areq; _mssamh__AddResponse ares; areq.n1 = &n1; areq.n2 = &n2; if (proxy.Add(&areq, &ares) == SOAP_OK && ares.AddResult) printf("Add(%g, %g) = %g\n", *areq.n1, *areq.n2, *ares.AddResult); else proxy.soap_stream_fault(std::cerr); proxy.destroy(); _mssamh__Subtract sreq; _mssamh__SubtractResponse sres; sreq.n1 = &n1; sreq.n2 = &n2; if (proxy.Subtract(&sreq, &sres) == SOAP_OK && sres.SubtractResult) printf("Subtract(%g, %g) = %g\n", *sreq.n1, *sreq.n2, *sres.SubtractResult); else proxy.soap_stream_fault(std::cerr); proxy.destroy(); _mssamh__Multiply mreq; _mssamh__MultiplyResponse mres; mreq.n1 = &n1; mreq.n2 = &n2; if (proxy.Multiply(&mreq, &mres) == SOAP_OK && mres.MultiplyResult) printf("Multiply(%g, %g) = %g\n", *mreq.n1, *mreq.n2, *mres.MultiplyResult); else proxy.soap_stream_fault(std::cerr); proxy.destroy(); _mssamh__Divide dreq; _mssamh__DivideResponse dres; dreq.n1 = &n1; dreq.n2 = &n2; if (proxy.Divide(&dreq, &dres) == SOAP_OK && dres.DivideResult) printf("Divide(%g, %g) = %g\n", *dreq.n1, *dreq.n2, *dres.DivideResult); else proxy.soap_stream_fault(std::cerr); proxy.destroy(); } return 0; } /******************************************************************************\ * * Service operations * \******************************************************************************/ int BasicHttpBinding_USCOREICalculatorService::Add(_mssamh__Add *Add, _mssamh__AddResponse *AddResponse) { double *res = (double*)soap_malloc(soap, sizeof(double)); if (Add && Add->n1 && Add->n2) *res = *Add->n1 + *Add->n2; else return soap_sender_fault(soap, "Invalid data", NULL); AddResponse->AddResult = res; return SOAP_OK; } int BasicHttpBinding_USCOREICalculatorService::Subtract(_mssamh__Subtract *Subtract, _mssamh__SubtractResponse *SubtractResponse) { double *res = (double*)soap_malloc(soap, sizeof(double)); if (Subtract && Subtract->n1 && Subtract->n2) *res = *Subtract->n1 - *Subtract->n2; else return soap_sender_fault(soap, "Invalid data", NULL); SubtractResponse->SubtractResult = res; return SOAP_OK; } int BasicHttpBinding_USCOREICalculatorService::Multiply(_mssamh__Multiply *Multiply, _mssamh__MultiplyResponse *MultiplyResponse) { double *res = (double*)soap_malloc(soap, sizeof(double)); if (Multiply && Multiply->n1 && Multiply->n2) *res = *Multiply->n1 * *Multiply->n2; else return soap_sender_fault(soap, "Invalid data", NULL); MultiplyResponse->MultiplyResult = res; return SOAP_OK; } int BasicHttpBinding_USCOREICalculatorService::Divide(_mssamh__Divide *Divide, _mssamh__DivideResponse *DivideResponse) { double *res = (double*)soap_malloc(soap, sizeof(double)); if (Divide && Divide->n1 && Divide->n2 && *Divide->n2 != 0.0) *res = *Divide->n1 / *Divide->n2; else return soap_sender_fault(soap, "Invalid data", NULL); DivideResponse->DivideResult = res; return SOAP_OK; } gsoap-2.8.91/gsoap/samples/wcf/Basic/Http/README.txt0000644000175000017500000001517413525245163021274 0ustar ellertellertINSTRUCTIONS Install the WCF samples by downloading the "Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4." from the Microsoft download site. After downloading you should have: C:\WF_WCF_Samples\WCF\Basic\Binding\Basic\Http\CS Open the Http.sln solution in that folder in Visual Studio. This shows a Basic Http WCF C# example client and service project. If the Solution Explorer shows "Project unloaded" then right-click the client project name in the Solution Explorer and select "Reload project". Do the same for the service. Modify the configuration and source code as described below. Notes: C:> denotes the Windows command line $ denotes the Unix/Linux command line How to connect a WCF client to a gSOAP service ---------------------------------------------- In App.config of the example WCF client set the endpoint to the gSOAP server host name or IP and port, which is the machine on which the gSOAP server runs, say the server endpoint is "10.0.1.5" on port 8000: If you run the server on the same machine as the client, then you can use: Compile the gSOAP server with 'make' and run the gSOAP server on port 8000: $ make $ ./calculator 8000 Under Project Properties of the example WCF client, change the Output type to Console Application. Then After compiling the WCF client in Visual Studio, run the WCF client: C:> cd WF_WCF_Samples\WCF\Basic\Binding\Basic\Http\CS\client\bin C:> client.exe If the gSOAP server runs remotely and the client cannot connect to the machine on which the server runs then check your firewall settings on both machines to permit TCP connections on the server port (8000 for example). How to self-host a WCF service ------------------------------ First obtain the machine host name or IP with ipconfig: C:> ipconfig /all Say the output of this command shows us that the machine IP is 10.0.1.5. Add a Program class with Main() to the WCF service example service.cs file to self host a service with the following Program class put in the namespace: using System; using System.ServiceModel; using System.Configuration; using System.ServiceModel.Description; namespace ... { ... public class Program { public static void Main() { Uri httpUrl = new Uri("http://10.0.1.5:8000/ServiceModelSamples/service"); using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), httpUrl)) { BasicHttpBinding bhb = new BasicHttpBinding(); serviceHost.AddServiceEndpoint(typeof(ICalculator), bhb, ""); ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; serviceHost.Description.Behaviors.Add(smb); serviceHost.Open(); Console.WriteLine("Press to terminate service."); Console.ReadLine(); } } } Under Project Properties of the example WCF service, change the Output type to Console Application. Then rebuild the project to generate service.exe. After compiling, run service.exe from the command prompt: C:\WF_WCF_Samples\WCF\Basic\Binding\Basic\Http\CS\service\bin\service.exe Running this command on the command prompt may require administrator privileges. To do so, right click the Command Prompt application icon on your desktop to select Run as Administrator. WCF self-hosting settings must be configured for HTTP, see the Microsoft documentation on Configuring HTTP and HTTPS for WCF. For example, on Windows 7, 8 and 10 you need to add a URL reservation for the specified URL namespace for your account: C:> netsh http add urlacl url=http://+:8000/MyUri user=YourUserName Use a web browser to access the service at the endpoint URL 10.0.1.5:8000/ServiceModelSamples/service (replace 10.0.1.5 with the IP address returned by ipconfig): http://10.0.1.5:8000/ServiceModelSamples/service Use a browser to view the WSDL at the endpoint URL http://10.0.1.5:8000/ServiceModelSamples/service?wsdl Using a browser to view the service from a remote machine is a good way to check if the remote connection works. If it fails, then check your firewall settings on the machine on which the self-hosted service runs to allow connections on port 8000. To allow connections on port 8000 add a firewall rule: C:> netsh advfirewall firewall add rule name="WCF service example" dir=in action=allow protocol=TCP localport=8000 To remove the firewall rule later: C:> netsh advfirewall firewall delete rule name="WCF service example" dir=in action=allow protocol=TCP localport=8000 Once the service runs, you can now use the gSOAP wsdl2h tool to generate C++ source code to develop a client application: $ wsdl2h -t ../../../../typemap.dat -o calculator.h 'http://10.0.1.5:8000/ServiceModelSamples/service?wsdl' This may take some time, since the self-hosted service is only an iterative web server that allows only one open connection at a time, while multiple connections are opened to access all files (WSDL and XSD files). To avoid this hassle, use: $ wsdl2h -t ../../../../typemap.dat -o calculator.h 'http://10.0.1.5:8000/ServiceModelSamples/service?singleWsdl' A pre-generated calculator.h file is included in the build directory. The calculator.h file contains the service definitions and XML data bindings for C++ (or C with wsdl2h option -c). You can find the typemap.dat file in the gsoap root directory. This file binds XML namespace prefixes such as mssamh to XML namespace URIs. We use this prefix in our source code. The next step is to run soapcpp2 on the calculator.h file to generate the binding implementation source code: $ soapcpp2 -j calculator.h This generates a BasicHttpBinding_USCOREICalculatorProxy class to invoke the service. The gSOAP client application uses this class as follows: #include "soapBasicHttpBinding_USCOREICalculatorProxy.h" #include "BasicHttpBinding_USCOREICalculator.nsmap" const char *URI = "http://10.0.1.5:8000"; // the service URI BasicHttpBinding_USCOREICalculatorProxy proxy(URI, SOAP_XML_INDENT); proxy.soap->send_timeout = proxy.soap->recv_timeout = 10; // 10 sec timeouts double n1 = 3.14, n2 = 1.41; _mssamh__Add areq; _mssamh__AddResponse ares; areq.n1 = &n1; areq.n2 = &n2; if (proxy.Add(&areq, &ares) == SOAP_OK && ares.AddResult) std::cout << "Add(" << n1 << ", " << n2 << ") = " << *ares.AddResult << std::endl; else proxy.soap_stream_fault(std::cerr); proxy.destroy(); gsoap-2.8.91/gsoap/samples/wcf/README.txt0000644000175000017500000000123413525245163017324 0ustar ellertellert INSTRUCTIONS Install the WCF samples. For the basic bindings, you should have: C:\WF_WCF_Samples\WCF\Basic\Binding\Basic\Http C:\WF_WCF_Samples\WCF\Basic\Binding\Basic\TransportSecurity C:\WF_WCF_Samples\WCF\Basic\Binding\Basic\MessageSecurity The gSOAP examples to interact with the WCF client and service examples: Basic/Http Basic/TransportSecurity Basic/MessageSecurity For the WS bindings, you should have: C:\WF_WCF_Samples\WCF\Basic\Binding\WS\DualHttp The gSOAP examples to interact with the WCF client and service examples: WS/DualHttp Additional sample demo applications for WCF bindings will be added to upcoming gSOAP releases. gsoap-2.8.91/gsoap/samples/Makefile.am0000644000175000017500000000104013525245163017076 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = foreign 1.4 SUBDIRS = \ autotest aws calc calc++ databinding dime dom oneway oneway++ \ factory factorytest \ gmt googleapi hello httpcookies lu magic mashup mashup++ \ chaining chaining++ primes \ mtom mtom-stream polytest roll router atom rss ssl template udp varparam \ wsa wsrm wsse wst xml-rpc-json rest testmsgr async gsoap-2.8.91/gsoap/samples/Makefile.cpp_proxy_rules0000644000175000017500000000102613525245163021742 0ustar ellertellert## common Makefile rules for building the C++ - soap samples ## SOAP_CPP_SRC = $(SOAP_H_FILES) $(SOAP_NS) $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -i -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ gsoap-2.8.91/gsoap/samples/magic/0000755000175000017500000000000013525245175016132 5ustar ellertellertgsoap-2.8.91/gsoap/samples/magic/.deps/0000755000175000017500000000000013525245175017143 5ustar ellertellertgsoap-2.8.91/gsoap/samples/magic/.deps/mtmagicserver.Po0000644000175000017500000000001013525245163022277 0ustar ellertellert# dummy gsoap-2.8.91/gsoap/samples/magic/magic.h0000644000175000017500000000445213525245163017365 0ustar ellertellert/* -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns1 service name: magic Magic squares //gsoap ns1 service style: rpc //gsoap ns1 service encoding: encoded //gsoap ns1 service namespace: http://websrv.cs.fsu.edu/~engelen/magic.wsdl //gsoap ns1 service location: http://websrv.cs.fsu.edu/~engelen/magicserver.cgi //gsoap ns1 schema namespace: urn:MagicSquare typedef int xsd__int; // SOAP encoded array of ints class vector { public: xsd__int *__ptr; int __size; struct soap *soap; vector(); vector(int); virtual ~vector(); void resize(int); int& operator[](int) const; }; // SOAP encoded array of arrays of ints class matrix { public: vector *__ptr; int __size; struct soap *soap; matrix(); matrix(int, int); virtual ~matrix(); void resize(int, int); vector& operator[](int) const; }; //gsoap ns1 service method: magic Compute magic square of given rank //gsoap ns1 service method: magic::rank magic square matrix rank int ns1__magic(xsd__int rank, matrix *result); gsoap-2.8.91/gsoap/samples/magic/Makefile.in0000644000175000017500000005134013525245163020177 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = magic$(EXEEXT) magicserver$(EXEEXT) subdir = gsoap/samples/magic ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am_magic_OBJECTS = magic.$(OBJEXT) $(am__objects_1) $(am__objects_3) magic_OBJECTS = $(am_magic_OBJECTS) magic_LDADD = $(LDADD) am__DEPENDENCIES_1 = magic_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) am__objects_4 = soapServer.$(OBJEXT) $(am__objects_2) am_magicserver_OBJECTS = magicserver.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) magicserver_OBJECTS = $(am_magicserver_OBJECTS) magicserver_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/magic.Po ./$(DEPDIR)/magicserver.Po \ ./$(DEPDIR)/soapC.Po ./$(DEPDIR)/soapClient.Po \ ./$(DEPDIR)/soapServer.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(magic_SOURCES) $(magicserver_SOURCES) DIST_SOURCES = $(magic_SOURCES) $(magicserver_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.cpp_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = magic.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = magic.nsmap magic.wsdl magic_SOURCES = magic.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) magicserver_SOURCES = magicserver.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) magicserver_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/magic/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/magic/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) magic$(EXEEXT): $(magic_OBJECTS) $(magic_DEPENDENCIES) $(EXTRA_magic_DEPENDENCIES) @rm -f magic$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(magic_OBJECTS) $(magic_LDADD) $(LIBS) magicserver$(EXEEXT): $(magicserver_OBJECTS) $(magicserver_DEPENDENCIES) $(EXTRA_magicserver_DEPENDENCIES) @rm -f magicserver$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(magicserver_OBJECTS) $(magicserver_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/magic.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/magicserver.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/magic.Po -rm -f ./$(DEPDIR)/magicserver.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/magic.Po -rm -f ./$(DEPDIR)/magicserver.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/magic/magicserver.cpp0000644000175000017500000002125213525245163021144 0ustar ellertellert/* magicserver.cpp Example CGI or stand-alone multi-threaded magic squares Web service. Install as a CGI application. Alternatively, run from command line with arguments IP (which must be the IP of the current machine you are using) and PORT to run this as a stand-alone server on a port. For example: $ magicserver.cgi 18081 & To let the 'magic' client application talk to this service, change the URL in magic.cpp into "http://localhost:18081" To show wsdl as stand-alone, use: http://localhost:18081/?wsdl This example illustrates two alternative server implementations with threads. The first implementation recycles gSOAP resources but is bounded to a maximum number of threads. Each thread needs to be joined, so runaway processes will halt the server at some point. The second implementation has no thread limitation. Runaway threads are not controlled. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "magic.nsmap" #include #ifdef _POSIX_THREADS #include // use Pthreads, NOTE: perhaps use gsoap/plugin/threads.h #endif #define BACKLOG (100) // Max. request backlog #define MAX_THR (8) // Max. threads to serve requests #define SLEEP (0) // >0 will make each thread sleep to mimic work load //////////////////////////////////////////////////////////////////////////////// // // Magic Squares Server // //////////////////////////////////////////////////////////////////////////////// int http_get(struct soap*); void *process_request(void*); int main(int argc, char **argv) { struct soap soap; soap_init(&soap); if (argc < 2) // no args: assume this is a CGI application { soap_serve(&soap); // serve request soap_destroy(&soap);// cleanup class instances soap_end(&soap); // cleanup } else { #ifdef _POSIX_THREADS pthread_t tid; void *arg; #endif SOAP_SOCKET m, s; int port = atoi(argv[1]); soap.recv_timeout = soap.send_timeout = 5; // max socket idle time (sec) soap.transfer_timeout = 10; // max transfer time (sec) // soap.accept_timeout = 60; // die if no requests are made within 1 minute // register a HTTP GET handler soap.fget = http_get; m = soap_bind(&soap, NULL, port, 100); if (!soap_valid_socket(m)) { soap_print_fault(&soap, stderr); exit(1); } fprintf(stderr, "Socket connection successful %d\n", m); for (int i = 1; ; i++) { s = soap_accept(&soap); if (!soap_valid_socket(s)) { if (soap.errnum) soap_print_fault(&soap, stderr); else fprintf(stderr, "Server timed out\n"); break; } fprintf(stderr, "%d: accepted %d IP=%d.%d.%d.%d ... ", i, s, (int)(soap.ip>>24)&0xFF, (int)(soap.ip>>16)&0xFF, (int)(soap.ip>>8)&0xFF, (int)soap.ip&0xFF); #ifdef _POSIX_THREADS arg = (void*)soap_copy(&soap); while (pthread_create(&tid, NULL, (void*(*)(void*))process_request, arg)) sleep(1); #else soap_serve(&soap); // process request fprintf(stderr, "served\n"); soap_destroy(&soap); soap_end(&soap); // clean up #endif } } soap_done(&soap); return 0; } #ifdef _POSIX_THREADS void *process_request(void *soap) { pthread_detach(pthread_self()); soap_serve((struct soap*)soap); soap_destroy((struct soap*)soap); soap_end((struct soap*)soap); soap_free((struct soap*)soap); return NULL; } #endif //////////////////////////////////////////////////////////////////////////////// // // Magic Square Algorithm // //////////////////////////////////////////////////////////////////////////////// int ns1__magic(struct soap *soap, int n, matrix *square) { int i, j, k, l, key = 2; if (n < 1) return soap_sender_fault(soap, "Negative or zero size", "The input parameter must be positive"); if (n > 100) return soap_sender_fault(soap, "size > 100", "The input parameter must not be too large"); square->resize(n, n); for (i = 0; i < n; i++) for (j = 0; j < n; j++) (*square)[i][j] = 0; i = 0; j = (n-1)/2; (*square)[i][j] = 1; while (key <= n*n) { if (i-1 < 0) k = n-1; else k = i-1; if (j-1 < 0) l = n-1; else l = j-1; if ((*square)[k][l]) i = (i+1) % n; else { i = k; j = l; } (*square)[i][j] = key; key++; } sleep(SLEEP); // mimic work load latency return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // Class vector Methods // //////////////////////////////////////////////////////////////////////////////// vector::vector() { __ptr = 0; __size = 0; } vector::vector(int n) { __ptr = (int*)soap_malloc(soap, n*sizeof(int)); __size = n; } vector::~vector() { soap_unlink(soap, this); // not required, but just to make sure if someone calls delete on this } void vector::resize(int n) { int *p; if (__size == n) return; p = (int*)soap_malloc(soap, n*sizeof(int)); if (__ptr) { for (int i = 0; i < (n <= __size ? n : __size); i++) p[i] = __ptr[i]; soap_unlink(soap, __ptr); free(__ptr); } __size = n; __ptr = p; } int& vector::operator[](int i) const { if (!__ptr || i < 0 || i >= __size) fprintf(stderr, "Array index out of bounds\n"); return (__ptr)[i]; } //////////////////////////////////////////////////////////////////////////////// // // Class matrix Methods // //////////////////////////////////////////////////////////////////////////////// matrix::matrix() { __ptr = 0; __size = 0; } matrix::matrix(int rows, int cols) { __ptr = soap_new_vector(soap, rows); for (int i = 0; i < cols; i++) __ptr[i].resize(cols); __size = rows; } matrix::~matrix() { soap_unlink(soap, this); // not required, but just to make sure if someone calls delete on this } void matrix::resize(int rows, int cols) { int i; vector *p; if (__size != rows) { if (__ptr) { p = soap_new_vector(soap, rows); for (i = 0; i < (rows <= __size ? rows : __size); i++) { if (this[i].__size != cols) (*this)[i].resize(cols); (p+i)->__ptr = __ptr[i].__ptr; (p+i)->__size = cols; } for (; i < rows; i++) __ptr[i].resize(cols); } else { __ptr = soap_new_vector(soap, rows); for (i = 0; i < rows; i++) __ptr[i].resize(cols); __size = rows; } } else for (i = 0; i < __size; i++) __ptr[i].resize(cols); } vector& matrix::operator[](int i) const { if (!__ptr || i < 0 || i >= __size) fprintf(stderr, "Array index out of bounds\n"); return __ptr[i]; } //////////////////////////////////////////////////////////////////////////////// // // A HTTP GET Handler to return WSDL (magic.wsdl) // //////////////////////////////////////////////////////////////////////////////// int http_get(struct soap * soap) { FILE *fd = NULL; char *s = strchr(soap->path, '?'); // soap->path has the URL path of soap->endpoint if (!s || strcmp(s, "?wsdl")) return SOAP_GET_METHOD; fd = fopen("magic.wsdl", "rb"); // open WSDL file to copy if (!fd) return 404; // return HTTP not found error soap->http_content = "text/xml"; // HTTP header with text/xml content soap_response(soap, SOAP_FILE); for (;;) { size_t r = fread(soap->tmpbuf, 1, sizeof(soap->tmpbuf), fd); if (!r) break; if (soap_send_raw(soap, soap->tmpbuf, r)) break; // can't send, but little we can do about that } fclose(fd); soap_end_send(soap); return SOAP_OK; } gsoap-2.8.91/gsoap/samples/magic/magic.cpp0000644000175000017500000001236413525245163017721 0ustar ellertellert/* magic.cpp Magic squares client. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "magic.nsmap" //////////////////////////////////////////////////////////////////////////////// // // Magic Squares Client // //////////////////////////////////////////////////////////////////////////////// // To access a stand-alone server on a port: magicserver[] = "IP:PORT"; // use "http://" to include HTTP header, e.g: magicserver[] = "http://IP:PORT"; const char magicserver[] = "http://www.cs.fsu.edu/~engelen/magicserver.cgi"; // const char magicserver[] = "http://localhost:8080"; // To send request to stdout and read response from stdin, use: // const char magicserver[] = "http://"; int main(int argc, char **argv) { struct soap soap; int r; soap_init(&soap); matrix *A = soap_new_matrix(&soap, -1); if (argc <= 1) { char *s = getenv("QUERY_STRING"); if (!s || (r = atoi(s)) == 0) r = 7; } else r = atoi(argv[1]); printf("Content-type: text/html\r\n\r\n

Magic Square of Rank %d

\n", r);
  if (soap_call_ns1__magic(&soap, magicserver, NULL, r, A))
  { soap_print_fault(&soap, stderr);
    soap_print_fault_location(&soap, stderr);
  }
  else
  { for (int i = 0; i < (*A).__size; i++)
    { int sum = 0;
      for (int j = 0; j < (*A)[i].__size; j++)
      { sum += (*A)[i][j];
        printf("%4d", (*A)[i][j]);
      }
      printf(" =%4d\n", sum);
    }
    for (int j = 0; j < (*A)[0].__size; j++)
      printf("  ||");
    printf("\n");
    for (int j = 0; j < (*A)[0].__size; j++)
    { int sum = 0;
      for (int i = 0; i < (*A).__size; i++)
	sum += (*A)[i][j];
      printf("%4d", sum);
    }
    printf("\n");
    if (r % 2 == 0)
      printf("
Magic only for odd ranks!\n"); } printf("
\n"); soap_destroy(&soap); soap_end(&soap); soap_done(&soap); return 0; } //////////////////////////////////////////////////////////////////////////////// // // Class vector Methods // //////////////////////////////////////////////////////////////////////////////// vector::vector() { __ptr = 0; __size = 0; } vector::vector(int size) { __ptr = (int*)soap_malloc(soap, size*sizeof(int)); __size = size; } vector::~vector() { soap_unlink(soap, this); } void vector::resize(int size) { int *p; if (__size == size) return; p = (int*)soap_malloc(soap, size*sizeof(int)); if (__ptr) { for (int i = 0; i < (size <= __size ? size : __size); i++) p[i] = __ptr[i]; soap_unlink(soap, __ptr); free(__ptr); } __ptr = p; __size = size; } int& vector::operator[](int idx) const { if (!__ptr || idx < 0 || idx >= __size) fprintf(stderr, "Array index out of bounds\n"); return __ptr[idx]; } //////////////////////////////////////////////////////////////////////////////// // // Class matrix Methods // //////////////////////////////////////////////////////////////////////////////// matrix::matrix() { __ptr = 0; __size = 0; } matrix::~matrix() { soap_unlink(soap, this); // not required, but just to make sure if someone calls delete on this } matrix::matrix(int rows, int cols) { __ptr = soap_new_vector(soap, rows); for (int i = 0; i < cols; i++) __ptr[i].resize(cols); __size = rows; } void matrix::resize(int rows, int cols) { int i; vector *p; if (__size != rows) { if (__ptr) { p = soap_new_vector(soap, rows); for (i = 0; i < (rows <= __size ? rows : __size); i++) { if (this[i].__size != cols) (*this)[i].resize(cols); (p+i)->__ptr = __ptr[i].__ptr; (p+i)->__size = cols; } for (; i < rows; i++) __ptr[i].resize(cols); } else { __ptr = soap_new_vector(soap, rows); for (i = 0; i < rows; i++) __ptr[i].resize(cols); __size = rows; } } else for (i = 0; i < __size; i++) __ptr[i].resize(cols); } vector& matrix::operator[](int idx) const { if (!__ptr || idx < 0 || idx >= __size) fprintf(stderr, "Array index out of bounds\n"); return __ptr[idx]; } gsoap-2.8.91/gsoap/samples/magic/README.txt0000644000175000017500000000036113525245163017625 0ustar ellertellertExample magic square client and servers. The client 'magic' application invokes the magic square service on our web site. The 'magicserver' demonstrates a CGI-based server and stand-alone multi-threaded server (if pthreads is available). gsoap-2.8.91/gsoap/samples/magic/Makefile.am0000644000175000017500000000111513525245163020161 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = magic magicserver SOAPHEADER = magic.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = magic.nsmap magic.wsdl magic_SOURCES = magic.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) magicserver_SOURCES = magicserver.cpp $(SOAPHEADER) $(SOAP_CPP_SERVER) magicserver_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread gsoap-2.8.91/gsoap/samples/xml-rpc-json/0000755000175000017500000000000013525245203017373 5ustar ellertellertgsoap-2.8.91/gsoap/samples/xml-rpc-json/README.md0000644000175000017500000042733313525245163020673 0ustar ellertellert XML-RPC/JSON and jsoncpp {#mainpage} ======================== [TOC] Introduction {#intro} ============ XML-RPC predates JSON and shares the same goal to offer a simple data format for Web applications that interoperate via "remote procedure calls" (RPC) over "stateless" HTTP via HTTP POST. Applications are not limited to the exchange of RPC messages via HTTP POST. Other REST methods can be used to manage the state of resources via URL references, allowing for the storage of data (HTTP PUT), retrieval of data (HTTP GET), and removal of data (HTTP DELETE) from a resource. XML-RPC is a generic, self-describing (and very verbose) XML format to compose XML messages for platform-neutral data exchange. XML-RPC defines a collection of frequently used XML types with common programming language equivalents. XML-RPC does NOT provide a data binding to XML and does NOT support a validation mechanism to ensure that data content is validated against a schema. XML-RPC serialization proceeds by marshaling parameters in predefined XML elements for each data type. XML-RPC has primitive types (bool, int, double, string, dateTime, base64) and two compound types (structs and arrays). This document does not describe XML-RPC in detail. For more details, please visit . JSON (JavaScript Object Notation) is an even simpler data format to support platform-neutral data interchange that is highly compatible across programming languages by restricting data representation to a set of five common types: bool, number, string, array, and object. A JSON object is the same as an XML-RPC struct. Only the syntax differs. Both are composed of fieldname-value member pairs (i.e. dictionaries or hashmaps) and have no other special properties. Which is in contrast to XML data "as objects" that are namespace scoped and may include xsi:type attributes to distinguish derived from base types, and may include id-ref attributes to cross-reference data, and other properties that make XML more suitable to achieve lossless C/C++ serialization. This document does not describe JSON (and JSON RPC/REST) in detail. For more details, please visit . This document describes both the C and C++/C++11 XML-RPC and JSON library APIs, see table of contents. JSON and gSOAP {#intro-1} -------------- The gSOAP JSON API is compact and lightweight. It is straightforward to write JSON RPC and JSON REST code. For example, a JSON REST call in C++: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "json.h" int main() { soap *ctx = soap_new1(SOAP_C_UTFSTRING); // set up context to manage memory const char *endpoint = "http://www.cs.fsu.edu/~engelen/currentTimeJSON.cgi"; value req(ctx), res(ctx); // new JSON values req and res req = "getCurrentTime"; // request current time json_call(ctx, // make a call (POST) endpoint, // the service endpoint URL req, // value with the request string res) // response, if call is OK ); if (ctx->error) ... // handle IO error or HTTP status code else cout << "Current time = " << res << endl; // JSON response to cout } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For more details on JSON-RPC and JSON REST operations, see \ref cpp-rpc. To compile this example see the \ref cpp-files. Furthermore, to help you quickly develop C/C++ JSON code, we offer a code generator **jsoncpp** with the gSOAP package (version 2.8.26 and up). You can find the jsoncpp tool with the JSON examples in `gsoap/samples/xml-rpc-json`. The jsoncpp command-line tool auto-generates C or C++ code from a JSON fragment. The generated code creates a JSON node graph for this fragment, which can be further tweaked as necessary. We demonstrate this on an example `menu.json` file, where we show each command executed in a command shell followed by the results displayed in the terminal: cat menu.json
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ { "menu": { "id": "file", "value": "File", "popup": { "menuitem": [ {"value": "New", "onclick": "CreateNewDoc()"}, {"value": "Open", "onclick": "OpenDoc()"}, {"value": "Close", "onclick": "CloseDoc()"} ] } } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
jsoncpp menu.json ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "json.h" { // Generated by jsoncpp menu.json struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); ctx->double_format = "%lG"; value x(ctx); x["menu"]["id"] = "file"; x["menu"]["value"] = "File"; x["menu"]["popup"]["menuitem"][0]["value"] = "New"; x["menu"]["popup"]["menuitem"][0]["onclick"] = "CreateNewDoc()"; x["menu"]["popup"]["menuitem"][1]["value"] = "Open"; x["menu"]["popup"]["menuitem"][1]["onclick"] = "OpenDoc()"; x["menu"]["popup"]["menuitem"][2]["value"] = "Close"; x["menu"]["popup"]["menuitem"][2]["onclick"] = "CloseDoc()"; std::cout << x << std::endl; soap_destroy(ctx); soap_end(ctx); soap_free(ctx); } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can use jsoncpp option `-e` to add explanatory comments to the generated code, which explains what the code does to help you understand the JSON API. Use jsoncpp option `-M` to narrow the generated code down to the essentials, without the initialization and cleanup parts of the code. This makes the generated code suitable for direct inclusion in your codebase. Generating code to populate a node graph is one option. Another option is to generate code to inspect a node graph. Use jsoncpp option `-i` (gSOAP 2.8.28 and up) to generate code to inspect the node graph of a value parsed from JSON input, given that the JSON file provided with option `-i` serves as a generic template: jsoncpp -i menu.json ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "json.h" { // Generated by jsoncpp -i menu.json struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); ctx->double_format = "%lG"; value x(ctx); std::cin >> x; if (x.soap->error) exit(EXIT_FAILURE); // error parsing JSON #define USE_VAL(path, val) std::cout << path << " = " << val << std::endl if (x.has("menu")) { if (x["menu"].has("id")) USE_VAL("$.menu.id", x["menu"]["id"]); if (x["menu"].has("value")) USE_VAL("$.menu.value", x["menu"]["value"]); if (x["menu"].has("popup")) { if (x["menu"]["popup"].has("menuitem")) { for (int i3 = 0; i3 < x["menu"]["popup"]["menuitem"].size(); i3++) { if (x["menu"]["popup"]["menuitem"][i3].has("value")) USE_VAL("$.menu.popup.menuitem[].value", x["menu"]["popup"]["menuitem"][i3]["value"]); if (x["menu"]["popup"]["menuitem"][i3].has("onclick")) USE_VAL("$.menu.popup.menuitem[].onclick", x["menu"]["popup"]["menuitem"][i3]["onclick"]); } } } } std::cout << x << std::endl; soap_destroy(ctx); soap_end(ctx); soap_free(ctx); } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ As you notice, each access to deeper JSON values in objects is guarded by a check that the object property is present. This helps to identify missing data in the JSON data received, but this checking is not strictly necessary to access values. When a non-existent obect property is accessed, its value returned is `null`. For example, you can access `x["menu"]["id"]` directly to obtain the `id` value, even when `menu` is not an object because this will cast `menu` into an object (i.e. internally changing the JSON graph without triggering exceptions or errors): jsoncpp -k menu.json ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "json.h" { // Generated by jsoncpp -k menu.json struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); ctx->double_format = "%lG"; value x(ctx); std::cin >> x; if (x.soap->error) exit(EXIT_FAILURE); // error parsing JSON #define USE_VAL(path, val) std::cout << path << " = " << val << std::endl USE_VAL("$.menu.id", x["menu"]["id"]); USE_VAL("$.menu.value", x["menu"]["value"]); for (int i0 = 0; i0 < x["menu"]["popup"]["menuitem"].size(); i0++) { USE_VAL("$.menu.popup.menuitem[].value", x["menu"]["popup"]["menuitem"][i0]["value"]); USE_VAL("$.menu.popup.menuitem[].onclick", x["menu"]["popup"]["menuitem"][i0]["onclick"]); } std::cout << x << std::endl; soap_destroy(ctx); soap_end(ctx); soap_free(ctx); } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ On the other hand, checking for the presence of data before accessing it preserves its original structure, which may be important with respect to the type of application that uses JSON. The two examples above display the JSON values with the macro `USE_VAL`, which takes a JSON `val` of type `value`. Furthermore, we can assign the JSON values to auto-generated local variables using option `-l` with options `-i` or `-k`: jsoncpp -k -l menu.json ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "json.h" { // Generated by jsoncpp -k -l menu.json struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); ctx->double_format = "%lG"; value x(ctx); std::cin >> x; if (x.soap->error) exit(EXIT_FAILURE); // error parsing JSON #define USE_VAL(path, val) std::cout << path << " = " << val << std::endl value& x_menu = x["menu"]; value& x_menu_id = x_menu["id"]; USE_VAL("$.menu.id", x_menu_id); value& x_menu_value = x_menu["value"]; USE_VAL("$.menu.value", x_menu_value); value& x_menu_popup = x_menu["popup"]; value& x_menu_popup_menuitem = x_menu_popup["menuitem"]; for (int i = 0; i < x_menu_popup_menuitem.size(); i++) { value& x_menu_popup_menuitemi = x_menu_popup_menuitem[i]; value& x_menu_popup_menuitemi_value = x_menu_popup_menuitemi["value"]; USE_VAL("$.menu.popup.menuitem[].value", x_menu_popup_menuitemi_value); value& x_menu_popup_menuitemi_onclick = x_menu_popup_menuitemi["onclick"]; USE_VAL("$.menu.popup.menuitem[].onclick", x_menu_popup_menuitemi_onclick); } std::cout << x << std::endl; soap_destroy(ctx); soap_end(ctx); soap_free(ctx); } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON values of type `value` can be easily cast to and from C/C++ types, see \ref cpp-ex for details. You can also use the new jsoncpp option `-p` (gSOAP 2.8.27 and up) to generate efficient JSONPath query code to query and retrieve specific values. For example, let's write a JSONPath query to display the authors of books in a store. We will read the JSON data from `std:cin` and filter the authors with the query `$.store.book[*].author` to collect them in a JSON array `y` of results with jsoncpp option `-y`. We generate the code from the command line with jsoncpp as follows: jsoncpp -M -p'$.store.book[*].author' -y ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} value x(ctx); std::cin >> x; // JSONPath: $.store.book[*].author value y(ctx); y.size(0); #define QUERY_YIELD(val) y[y.size()] = val if (x.has("store")) { if (x["store"].has("book")) { value::iterator j = x["store"]["book"].begin(); value::iterator k = x["store"]["book"].end(); for (value::iterator i = j; i != k; ++i) { if ((*i).has("author")) { QUERY_YIELD((*i)["author"]); } } } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Let's apply this query to the `store.json` file that you can find in section \ref jsoncpp-4: ./query < store.json
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [ "Nigel Rees", "Evelyn Waugh", "Herman Melville", "J. R. R. Tolkien" ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
You can compile this example yourself with: jsoncpp -o query.cpp -m -p'$.store.book[*].author' -y soapcpp2 -CSL xml-rpc.h c++ -o query query.cpp json.cpp xml-rpc.cpp soapC.cpp stdsoap2.cpp You can also embed C/C++ code in JSONPath queries to filter and select values from JSON data at runtime. The jsoncpp code generator aims to produce clean, high-quality and readable C and C++ code. We will present jsoncpp in more detail in the next section. The remainder of this document explains how you can use the XML-RPC/JSON C and C++ APIs to create JSON data, access JSON data, send/recv data via REST, and to read/write JSON data to files, streams, and string buffers. It should be stated that JSON as a data format is not a true-and-tested alternative to XML and XML schema. XML data bindings provide a strongly typed interface to exchange validated data with RPC and REST. However, XML can be more complex to provide strong guarantees for object polymorphism (base and derived classes), to accurately represent tree and graph structures, to include binary content natively with base64 (and mechanisms for streaming MIME/MTOM attachments), to support extensibility (to extend data types and to add new data types), and schema namespaces referenced by XML elements and attributes to avoid ambiguity. The jsoncpp command-line tool {#jsoncpp} ============================= The jsoncpp command produces high-quality, readable and reusable source code. The generated code can be readily used in your projects to populate JSON data and retrieve data, thereby saving you substantial time and effort to write code. You may not have to write any C or C++ code to manipulate JSON data with your application's code base when taking full advantage of the jsoncpp autocoding tool. The jsoncpp command-line tool generates C or C++ source code to populate a JSON node graph with the data given in a JSON file. The command also has an option `-i` to generate source code to inspect parsed JSON values by using a JSON file as a generic template for this code. And option `-p` generates efficient source code for JSONPath queries. Even stand-alone JSONPath query filter applications can be auto-generated with option `-m` (for main). Building and installing jsoncpp {#jsoncpp-1} ------------------------------- You will find jsoncpp and the XML-RPC/JSON examples in the gSOAP package in `gsoap/samples/xml-rpc-json`. To build jsoncpp, [install gSOAP](http://www.genivia.com/downloads.html) and build jsoncpp as follows: cd gsoap/samples/xml-rpc-json make jsoncpp This builds the command-line tool jsoncpp in `gsoap/samples/xml-rpc-json` from where you can use it and/or copy it for use with your projects. If you do not have the samples built, you can use soapcpp2 from the command line to generate the C++ code required to compile jsoncpp and that is also required by the C++ JSON API components: cd gsoap/samples/xml-rpc-json soapcpp2 -CSL xml-rpc.h c++ -I../.. -o jsoncpp jsoncpp.cpp json.cpp xml-rpc.cpp soapC.cpp ../../stdsoap2.cpp This builds the jsoncpp command-line tool. For users of Windows, visit [download and installation](http://www.genivia.com/downloads.html) to download `jsoncpp.exe`. Command-line options {#jsoncpp-2} -------------------- The jsoncpp command takes several options and an optional JSON input file: jsoncpp [-c] [-e] [-f%fmt] [-h] [-i] [-k] [-l] [-m] [-M] [-O] [-ofile] [-ppath] [-rroot] [-xcode] [-y] [infile] where the jsoncpp command-line options are: | Option | Description | | -------- | ----------------------------------------------------------------- | | `-c` | generate C code instead of C++ | | `-e` | add explanatory comments to the generated code | | `-f%%fmt`| use `%%fmt` to format double floats, e.g. `-f%%lG` | | `-h` | display help message | | `-i` | generate code to inspect JSON node graph with data type checks | | `-k` | generate code to inspect JSON node graph directly without checks | | `-l` | generate code for option `-i` to store values in local variables | | `-m` | generate stand-alone code by adding `main()` | | `-M` | generate minimal code unadorned with initialization and cleanup | | `-O` | optimize code by factoring common indices | | `-ofile` | save source code to `file` | | `-ppath` | generate JSONPath query code for `path` | | `-rroot` | use `root` instead of root value `x` in the generated code | | `-xcode` | generate code that executes `code` for each JSONPath query result | | `-y` | generate code that yields an array `y` of JSONPath query results | | `infile` | optional JSON file to parse | | `-` | read JSON from standard input | The jsoncpp command takes a JSON input file `infile` to generate code to construct this JSON value in C/C++ or, with options `-i` or `-k`, to generate code that reads JSON data from input and traverses it to inspect its value by using the JSON input file `infile` as a template to match against. For options `-i` and `-k`, if you want additional code that uses local variables to store boolean, integer, and floating point values retrieved from the JSON node graph, then also use option `-l`. Use option `-c` to generate C code instead of C++ and use option `-e` to add explanatory comments to the generated code. The jsoncpp command emits source code to standard output or to the file specified with option `-o`. Minimalistic code is generated with option `-M`, which is useful to automate pasting of the unadorned source code into the source code of your project. Optimized code is generated with option `-O` by factoring common array indices and object field names. This produces more elaborate code that is more efficient but may be harder to read and modify. This option has no effect on the code generated with options `-i` and `-k`. The default name of the root value in the generated source code is `x`. To change this name use option `-r`. Do not use the name `v`, which represents the current value. Other variable names to avoid are `i`, `j`, `k`, `p`, `q`, `r`, `s`, and `S`, since these are internally used by the generated JSONPath query code. Use option `-p` to generate code that filters JSON data from a source of input with a JSONPath query `path`. Option `-x` specifies a JSONPath query code to execute for each query result. The default action in the generated code is to print each query result value in JSON format separated by newlines. Option `-y` yields a JSON array of query result values that are incrementally collected. Option `-x` overrides option `-y`. To generate a stand-alone application use option `-m`. This option is useful for testing JSONPath query filters given with option `-p`. Option `-f%%fmt` sets the floating point double precision format to use in the generated code. By default, jsoncpp emits floating point numbers with up to 17 digit mantissas to preserve precision. Use `-f%%lG` for the shortest floating point representation. JSONPath syntax {#jsoncpp-3} --------------- The concept behind JSONPath is identical to XPath for XML: to select elements (value nodes) from a DOM node structure of a document by matching the path expression against descendent nodes in the node tree structure. A JSONPath query returns the JSON values selected. We adopt the JSONPath syntax suggested by [Goessner](http://goessner.net/articles/JsonPath), but extended with `?` ("where") and `!` ("where not") operators. Our JSONPath syntax also supports the `[?(expr)]` and `[(expr)]` constructs to insert your own C/C++ expressions for filtering and selection of nodes in JSONPath queries. Our syntax also supports multiple comma-separated alternatives in the `[ ]` selector. But the syntax does not support `|` (alternation). We recommend to write a JSONPath query for each alternation. JSON data structures are represented internally as a node graph consisting of atomic values (null, bool, int/double, string), arrays, and "objects". JSON objects are structs with fieldname-value pairs. A JSONPath expression specifies a JSON data query, typically starting from the root node, and descending deeper into the node graph to match child nodes. For example, suppose we have a `store` object with a `book` array. Each `book` object has a `title` string and some other properties which we will ignore for now. The following JSONPath query returns the titles of all books in the store: $.store.book[*].title We can also write the same query in bracket notation: $["store"]["book"][*]["title"] Note that the syntax of this query has a close similarity to the C++ JSON API for accessing object fields (a.k.a. object properties) and array elements. Basically, a JSONPath expression is a sequence of operations to match nodes: | Operator | Nodes matched and returned | | ------------- | ------------------------------------------------------------ | | `$` | the root node of the node graph | | `.f` or `[f]` | child node at field named `f` of the current object node | | `[n]` | nth node of the current array node, if indexed within bounds | | `[b:e:s]` | array slice of the current array node | | `[x,y]` | child nodes matching `x` or `y` (fields, indices and slices) | | `*` | "wildcard": any child node of the current object/array node | | `..` | "recurse": any matching descendant nodes of the current node | | `?` | "where": current node if the rest of the query path matches | | `!` | "where not": the complement of `?` | | `[(e)]` | use value of C/C++ expression `e` to match a field or index | | `[?(e)]` | evaluate C/C++ expression `e`, continue matching when true | Field names (`f` in the table) in JSON and in JSONPath queries may contain UTF-8 Unicode characters. Throughout this document we refer to the *field names* of objects and structs. Also commonly used are JSON object *property names* and *key names* (as in key-value pairs), Other JSONPath implementations require quotes for field names in brackets, as in `["store"]`. With jsoncpp you will only need to add quotes when field names contain control characters, spaces, or punctuation, such as a `unit-price` field name in the query `$..["unit-price"]`. To promote orthogonality of the JSONPath syntax (no arbitrary rules and exceptions depending on a context), quoted field names are also valid with dot notation in our JSONPath syntax, such as the query `$.."unit-price"`. JSONPath by example {#jsoncpp-4} ------------------- A JSONPath query expression uses dot or bracket operators to match JSON data located at increasingly deeper levels of the data structure. Consider the following JSON data:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ { "store": { "book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95 }, { "category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99 }, { "category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99 }, { "category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99 } ], "bicycle": { "color": "red", "price": 19.95 } } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
To match the `title` of the first book (`book[0]`) in a `store`, starting at the root node indicated by `$`, we use the following JSONPath query expression: $.store.book[0].title This query returns `"Sayings of the Century"` when applied to the JSON data. To try the JSONPath examples yourself, we suggest to create a `store.json` file with the above JSON data and run jsoncpp from the command line to compile a JSONPath query as follows: cd gsoap/samples/xml-rpc-json soapcpp2 -CSL xml-rpc.h jsoncpp -o test-json.cpp -m -p'$.store.book[0].title' c++ -I../.. -o test-json test-json.cpp json.cpp xml-rpc.cpp soapC.cpp ../../stdsoap2.cpp ./test-json < store.json The compiled JSONPath query is applied to the `store.json` data and returns the matching values found. Use jsoncpp option `-y` to return matches in a JSON array. The `soapC.cpp` file, and the header files `soapStub.h` and `soapH.h`, are generated with the command `soapcpp2 -CSL xml-rpc.h`, which is done just once for all C++ JSON applications. Use soapcpp2 option `-c` to generate `soapC.c` for C (with the corresponding `soapStub.h` and `soapH.h` in C). To match any field of an object or any array element, we use a wildcard `*`: $.store.*.price This matches and returns the bicycle price `19.95`, but not the book prices that are located one level deeper in the array of books, which can be matched with: $.store.*.*.price This returns the values `8.95`, `12.99`, `8.99`, and `22.99`. Note that in the latter case we only get the book prices, because the first `*` matches `book` and `bicycle` and the second `*` matches the book array and the `red` and `price` fields. Only the book prices are returned, because `red` and `price` are atomic and have no `price` child node. To match and return all prices in the store we use `..` called "recursive descent" or simply "recurse", as follows: $..price Array elements are matched with brackets `[n]` where `n` is an array index. Negative indices can be used to access array elements from the end of an array, where -1 refers to the last element. We can list the array elements to match with `[x,y]`, for example: $.store.book[0,1,-1].title This matches and returns the titles of the first two books and the last. JSONPath queries do not modify the node graph searched. So you do not need to worry about indices that are out of bounds or fields that are not part of an object. Arrays can also be sliced for matching from a starting index `b` until (excluding) an ending index `e` with `[b:e]`, where `b` and `e` values are optional. When omitted, the slice runs from the start and/or from the end of the array. For example: $.store.book[:].title matches and returns the titles of all books in the store, and $.store.book[:2].title matches and returns the first two books (at 0 and 1) in the store. We can use an optional step `s` to slice arrays with `[b:e:s]` and even reverse array element-by-element matching with a negative unit step: $.store.book[::-1].title This matches and returns the titles of all books in reverse order. The following JSONPath queries return the same results for the example JSON data, where we used slices and `[x,y]` to match multiple array entries: $.store.book[1:3].title $.store.book[1:-1].title $.store.book[-3:-1].title $.store.book[1,2].title $.store.book[-3,-2].title Basically, JSONPath array slices in our implementation follow the intuitive Python array slice syntax and meaning. Beware that many other JSONPath implementations do not implement the step parameter consistently or do not support stepping. Note that `[:]` is not the same as `[*]` because `[:]` only matches arrays. A conditional JSONPath expression contains a `?` ("where") operator. The operator returns the results that match the left side of the `?` but only when the right-side matches: $.store.book[:]?isbn This matches and returns only books that have an `isbn` field. The complement of the `?` operator is `!` ("where not"), which returns the results that match the left side of the `!` but only when the right-side does not match. More complex queries can be formulated by embedding C/C++ expressions in the query to filter `[?(e)]` and select `[(e)]` nodes. For example, in C++: $.store.book[:][?((double)v["price"] < 10.0)].title and in C: $.store.book[:][?(*double_of(value_at(v, "price")) < 10.0)].title This filters books with prices lower than 10.0 and returns the title of each book found. Embedded C/C++ expressions to filter nodes can inspect the current JSONPath node value by accessing variable `v`, as is shown above. Here we used `(double)v["price"]` to obtain the price of the current node for comparison. Besides the current node `v` you can also access the JSONPath root node value `x`. Instead of the default name `x`, you can change `x` to another name with jsoncpp option `-r`. You can access variables and functions in embedded C/C++ expressions, but do not access or modify `i`, `j`, `k`, `p`, `q`, `r`, `s` and `S`, which are internally used by the generated JSONPath query code. @warning In this respect we should caution you about using C/C++ expressions that modify node values, since this may affect the query results in unpredictable ways. In fact, `v["price"]` will add a price to any current node value `v` that has no `"price"` field! To make field accesses safe we should first check if the field exists in the current node before we access it: $.store.book[:][?((v.has("price") ? (double)v["price"] : 9999) < 10.0)].title @warning Guarding field accesses with `has()` is the only safe way to combine `..` with C/C++ filters, since we may visit all nodes in the graph, for example to find all prices < 10.0: $..[?((v.has("price") ? (double)v["price"] : 9999) < 10.0)].price Object fields and array elements can be accessed in a JSONPath query with C/C++ expressions that evaluate to string field names or to integers indices, respectively. For example, we can use the string `argv[1]` of `main()` as a field name in C++: $.store.book[:][(argv[1])] In C we have to explicitly use `value_at` to access the field of the current `v` node (and we use `nth_value` to access array elements of the current `v` node, not shown here): $.store.book[:][(value_at(v, argv[1]))] This assumes that the command-line argument (`argv[1]`) of the application is a book field name. Otherwise, no results are returned. After compiling the JSONPath query with jsoncpp -o test-json.cpp -m -p'$.store.book[:][(argv[1])]' c++ -I../.. -o test-json test-json.cpp json.cpp xml-rpc.cpp soapC.cpp ../../stdsoap2.cpp we can obtain the book titles with: ./test-json title < store.json You can use multiple C/C++ expressions in brackets and combine them with other field and array expressions separated by commas: $.store.book[:][title,(argv[1])] This prints the title and the value of the field name given by the command-line argument, if there is a field that matches the given name. Finally, let's use the value of `argv` to filter products in the store by a given command-line argument price: jsoncpp -m -p'$.store..[?((v.has("price") ? (double)v["price"] : 9999) < strtod(argv[1], NULL))]' And in C: jsoncpp -c -m -p'$.store..[?((nth_at(v, "price") >= 0 ? *double_of(value_at(v, "price")) : 9999) < strtod(argv[1], NULL))]' C/C++ expressions cannot be used as array slice bounds, which must be constant. C++ XML-RPC and JSON {#cpp} ==================== XML-RPC and JSON data is interchangeable in this implementation, with the only exception that the dateTime and base64 types are handled as strings in JSON. Also, JSON's only numeric type is floating point. However, integers are handled just fine by this JSON implementation as 64 bit (i.e. `long long`, `int64_t`, `LONG64`) without internal conversion to/from double floating point values that could cause a loss of precision for large values. List of files {#cpp-files} ------------- The following files define XML-RPC operations and data types for C++: - `xml-rpc-io.h`: XML-RPC serialization over streams - `xml-rpc-io.cpp`: XML-RPC serialization over streams - `xml-rpc-iters.h`: iterators for structs, arrays, and XML-RPC parameters - `xml-rpc.cpp`: XML-RPC C++ data binding API - `xml-rpc.h`: XML-RPC data binding as a gSOAP .h file for soapcpp2 (do not #include this file in your project builds) For JSON we use the following files for C++: - `json.h`: JSON C++ API and JSON serialization over streams - `json.cpp`: JSON C++ API and JSON serialization over streams - `xml-rpc.cpp`: XML-RPC C++ data binding API - `xml-rpc-iters.h`: iterators for structs/objects and arrays - `xml-rpc.h`: XML-RPC data binding as a gSOAP .h file for soapcpp2 (do not #include this file in your project builds) The gSOAP header file `xml-rpc.h` defines all XML-RPC and JSON types as struct with C++ member functions to create XML-RPC and JSON data and REST messages. A note about the following auto-generated files: `soapH.h`, `soapStub.h` and `soapC.cpp`. These are required for XML-RPC and JSON. To auto-generate these files, execute: soapcpp2 -CSL xml-rpc.h Then compile and link the `.cpp` files listed above for XML-RPC and JSON with the auto-generated `soapC.cpp` and `stdsoap2.cpp`: c++ -I../.. -o myapp myapp.cpp json.cpp xml-rpc.cpp soapC.cpp ../../stdsoap2.cpp Instead of `stdsoap2.cpp` you can link `libgsoap++.a` with `-lgsoap++`, when installed by the gSOAP package. To enable OpenSSL for HTTPS compile with `-DWITH_OPENSSL` and link `-lssl`, and `-lcrypto`: c++ -DWITH_OPENSSL -I../.. -o myapp myapp.cpp json.cpp xml-rpc.cpp soapC.cpp ../../stdsoap2.cpp -lssl -lcrypto For OpenSSL support, instead of `stdsoap2.cpp` you can link `libgsoapssl++.a` with `-lgsoapssl++`, when installed by the gSOAP package. Because XML namespaces are not used, we can either use `-DWITH_NONAMESPACES` to compile `stdsoap2.cpp` without complaining about a missing global `Namespace`, or we can define an empty namespaces table somewhere in our code: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Overview {#cpp-ex} -------- An XML-RPC/JSON data value is created in C++ as follows, which requires a context `ctx` with the engine state (the soap struct). The context manages the memory that is internally allocated to hold values: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" soap *ctx = soap_new1(SOAP_C_UTFSTRING); // new context value v(ctx); // a new local value v soap_destroy(ctx); // delete all values soap_end(ctx); // delete temp data soap_free(ctx); // free context ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Note that `soapH.h` is an auto-generated file (see previous section). This file needs to be generated only once and for all. It also references `stdsoap2.h` and the auto-generated `soapStub.h`. Compile and link your code with `stdsoap2.cpp` and the auto-generated `soapC.cpp` XML-RPC serializers. Also compile and link `xml-rpc.cpp`. For JSON, compile and link `json.cpp`. We can stack-allocate local values as shown above. To allocate a value on the heap that is managed by the engine context, use `new_value(ctx)`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" soap *ctx = soap_new1(SOAP_C_UTFSTRING); // new context value *v = new_value(ctx); soap_destroy(ctx); // delete all values soap_end(ctx); // delete temp data soap_free(ctx); // free context ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Allocating values on the heap may throw `std::bad_alloc` exceptions, but allocating a context does not. To safeguard your code use a try-catch: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" soap *ctx = soap_new1(SOAP_C_UTFSTRING); // new context (does not throw) if (ctx == NULL) ... // handle out-of-memory error try { value *v = new_value(ctx); ... // create other values } catch (std::bad_alloc& e) { ... // handle out-of-memory error } soap_destroy(ctx); // delete all values soap_end(ctx); // delete temp data soap_free(ctx); // free context ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can use wide strings with Unicode stored in UTF-8-formattted 8-bit `char` strings. For compatibility with XML-RPC serialization of UTF-8-encoded strings, we MUST use the `SOAP_C_UTFSTRING` flag to initialize the context with `soap_new1(SOAP_C_UTFSTRING)`. We can optionally use `SOAP_XML_INDENT` to indent XML and JSON. The code shown above creates an empty value `v`. Values can be assigned any one of the following data types: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} v = 12345LL; // 64 bit int v = 12.34; // double float v = "abc"; // string v = string("abc"); // std::string v = L"xyz"; // wide string (converted to UTF-8) v = wstring(L"xyz"); // std::wstring (converted to UTF-8) v = false; // Boolean v = (ULONG64)time(0); // ULONG64 values are serialized as ISO 8601 date time // create an array [24, 99.99, "abc"] v[0] = 24; v[1] = 99.99; v[2] = "abc"; // copy a C array or a C++ container to a JSON array int ints[] = { 1, 2, 3 }; v.size(3); // array size of JSON value v must conform std::copy(ints, ints + 3, v.begin()); // create a struct (JSON object) {"name": "gsoap", "major": 2.8, "©": 2015} v["name"] = "gsoap"; v["major"] = 2.8; v[L"©"] = 2015; // wide string tags are OK // create a base64-encoded image object _base64 img(ctx, 100, ptr_to_rawimage100bytes); // block of 100 raw bytes v = img; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We can combine these operations in many possible ways to create arrays of arrays, arrays of structs, and so on. For example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} v[0]["name"] = "bob"; v[0]["toys"][0] = "ball"; v[0]["toys"][1] = "furby"; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This creates a singleton array containing an object with two members: `name` set to `"bob"` and `toys` set to an array containing `"ball"` and `"furby"`. In JSON format this is represented as: [ { "name": "bob", "toys": ["ball", "furby"] } ] ^ ^ ^ ^ | | | | an array_/ | | | of 1 struct_/ | | with 2 members_/______________/ Let's see what happens when we assign a variable the value of another. The JSON C++ API uses the *value model* for variables with atomic values, meaning that atomic values are copied when assigning a target variable the atomic value of another variable. It uses the *reference model* for arrays and structs, meaning that array and struct contents are shared when assigning a target variable the array/struct value of another variable. We illustrate the effect below: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} value x(ctx), y(ctx); x = 1; y = x; x = 2; std::cout << "x = " << x << " and y = " << y << std::endl; value a(ctx), b(ctx); a["num"] = 1; b = a; a["num"] = 2; std::cout << "a.num = " << a["num"] << " and b.num = " << b["num"] << std::endl; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This prints `x = 2 and y = 1` and `a.num = 2 and b.num = 2`. You can make deep copies of values by using the auto-generated `soap_dup_value` function in `soapC.cpp`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} value a(ctx), b(ctx); a["num"] = 1; soap_dup_value(ctx, &b, &a); a["num"] = 2; std::cout << "a.num = " << a["num"] << " and b.num = " << b["num"] << std::endl; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This prints `a.num = 2 and b.num = 1`. @warning Do not extend arrays and structs (JSON objects) returned by `soap_dup_value` with new entries. The new entries may use unallocated memory. You can always loop over arrays and structs to copy their contents to a new array or struct managed by another context, if you must add new entries later. To auto-generate `soap_dup_value`, use option `-Ec` with soapcpp2: soapcpp2 -Ec -CSL xml-rpc.h With gSOAP 2.8.28 and later you can use the following operators on values in C++: | Operator | Type of JSON Value Operands | Result after Operand Type Promotion | | -------------------- | ----------------------------------- | ----------------------------------------------- | | `+` | bool, number, string, struct, array | sum, string concat, struct concat, array concat | | `-`, `*`, `/`, `%` | bool, number | difference, product, division, modulo | | `==`, `!=` | bool, number, string, struct, array | C++ `bool` | | `<=`, `>=`, `<`, `>` | bool, number, string | C++ `bool` | The (un)equal operators compare the two values by deep value comparison of array elements and object fields and values. For the arithmetic operations, operands are converted by type promotion until the two operands conform to the type required for the operation: atomic int double string struct array false -> 0 true -> 1 int -> double null -------------------> "null" false ------------------> "false" true -------------------> "true" int -> double -> string null ---------------------------------------> [null] false --------------------------------------> [false] true ---------------------------------------> [true] int -------------------------------> [int] double ---------------------> [double] string -----------> [string] struct -> [struct] An example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include std::stringstream ss("[0,1,2]"); // parse JSON array into 'x' value x(ctx); ss >> x; // x = [0,1,2] x[3] = x[1] + x[2]; // x = [0,1,2,3] value y(ctx); y[0] = "abc"; // y = ["abc"] y[1] = y[0] + 123; // y = ["abc","abc123"] std::cout << x + y; // [0,1,2,3] + ["abc","abc123"] is [0,1,2,3,"abc","abc123"] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Arithmetic and concatenation operations may incur significant memory overhead due to temporaries, type conversions (when applicable), and managed heap storage. Use them only when CPU and memory usage are not critical. When receiving a value in XML-RPC/JSON, we generally want to check its type to obtain its value. To check the type of a value, we use `is_Type` methods: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} bool value::is_null() // true if value is not set (JSON null) bool value::is_bool() // true if value is a Boolean "true" or "false" value bool value::is_true() // true if value is Boolean "true" bool value::is_false() // true if value is Boolean "false" bool value::is_number() // true if value is a number (int or float) bool value::is_int() // true if value is a 32 or a 64 bit int bool value::is_double() // true if value is a 64 bit double floating point (not integer) bool value::is_string() // true if value is a string or wide string bool value::is_dateTime() // true if ISO 8601, always false for received JSON bool value::is_array() // true if array of values bool value::is_struct() // true if structure, a.k.a. a JSON object bool value::is_base64() // true if base64, always false for received JSON ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ When working with JSON data, do not use `is_double()` but `is_number()`. JSON data does not differentiate between integers and floats. However, gSOAP makes sure that 64 bit integer values are accurately represented in JSON and decoded without loss from JSON. That is, when receiving an integer that you checked with `is_int()` you can then safely cast value with e.g. `int64_t n = v`. The following methods can be used to inspect arrays and structs (JSON objects): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} void value::size(int) // reset array size or pre-allocate space int value::size() // returns array or struct size or 0 bool value::empty() // true if array or struct is empty bool value::has(int) // true if index is within array bounds bool value::has(const char*) // true if struct has field bool value::has(const wchar_t*) // true if struct has field int value::nth(int) // returns index >= 0 if index is in array bounds, < 0 otherwise int value::nth(const char*) // returns index >= 0 of field in struct, < 0 otherwise int value::nth(const wchar_t*) // returns index >= 0 of field in struct, < 0 otherwise value& value::operator[int] // returns value at index in array or struct value& value::operator[const char*] // returns value at field in struct value& value::operator[const wchar_t*] // returns value at field in struct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For example, let's take the value `v` that was assigned the array shown above. We have the following properties of this value: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} v.is_null() == false // v is not null v.is_array() == true // v is an array v.size() == 1 // v has one element v.has(1) == false // v has no array element at index 1 v.nth(-1) == 0 // v last element is at index 0 v[0].is_struct() == true // v[0] is a struct v[0].has("name") == true // v[0] has field name "name" v[0].nth("name") == 0 // v[0] has field name "name" at index 0 v[0][0].is_string() == true // v[0][0] == v[0]["name"] is a string v[0].has("toys") == true // v[0] has field name "toys" v[0]["toys"].is_array() == true // v[0]["toys"] is an array v[0]["toys"].empty() == false // v[0]["toys"] is not empty ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ When accessing structs (JSON objects) by field name, make sure to use existing member field names only. A new member fieldname-value pair is dynamically added to the structure to accomodate the new entry for the field. Also arrays are extended to accommodate the indexed array element. A negative index accesses elements from the array's end, with index -1 accessing the last value. Also the `value::has(int)` and `value::nth(int)` methods take a negative index for bounds checking on arrays and will return `false` or negative, respectively. Use `value::size(int)` to change array size or set arrays to zero length. Use negative size with `value::size(int)` to remove elements from the end. You may want to use iterators to retrieve data from structs and arrays (see further below). To retrieve atomic data we can use casts on a value `v` as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} (double)v // 64 bit double or 0.0 if not numeric (int)v // 32 bit int or 0 if not numeric (LONG64)v // 64 bit int or 0 if not numeric (char*)v // convert to string (string)v // convert to std::string (wchar_t*)v // convert to wide string (wstring)v // convert to std::wstring (bool)v // same as is_true() (ULONG64)v // nonzero time_t if v contains an ISO 8601 date time (_base64)v // base64 encoding of v ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ It is valid to cast a primitive type to any of the other primitive types shown above and no runtime error will occur, although you may loose some information when an atomic value has no representation in the target type's value space. Casting a number to a string is fine, but casting a string to a number only gives a nonzero numeric value if the string is numeric. Casting a value to base64 produces its base64 encoding. To access base64 binary raw data of a value `v`, we use the following methods: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} _base64& base64 = v; unsigned char *raw = base64.ptr(); // points to raw binary data int size = base64.size(); // that is of this size ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Arrays and structs are compound types that cannot be cast to or from other types (but if you do cast, an empty array or struct is created an no runtime error will occur). So we should check for array and struct types to obtain their content. For example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} if (v.is_array()) { for (int i = 0; i < v.size(); ++i) { value& array_value = v[i]; ... // use and/or set array_value } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We use the iterators `value::iterator` and `value::const_iterator` to loop over the values in structs and arrays: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} if (v.is_struct() || v.is_array()) { for (value::iterator i = v.begin(); i != v.end(); ++i) { int index = i.index(); // index of element const char *name = i.name(); // name() is nonempty for structs value& element = *i; ... // use index, name, and/or use/set the element value } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The iterator method `value::iterator::index()` returns the integer index of the struct or array element. The `value::iterator::name()` method returns the name of the struct member, or empty `""` if the type is not a struct. The `value::const_iterator` does not permit the value referenced by the iterator to be modified. There are two lower level iterators for structs and arrays, which are slightly more efficient to use compared to the `value::iterator`. These array and struct iterators have an `index()` method to obtain the index (an int). Struct iterators have a `name()` method to obtain a member's name (a string). For example, to traverse a value `v` that is an array or a struct: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} if (v.is_array()) { _array& vec = v; // cast to _array for (_array::iterator i = vec.begin(); i != vec.end(); ++i) { int array_index = i.index(); value& array_value = *i; ... // use array_index, use and/or set array_value } } else if (v.is_struct()) { _struct& rec = v; // cast to _struct for (_struct::iterator i = rec.begin(); i != rec.end(); ++i) { const char *member_name = i.name(); value& member_value = *i; ... // use member_name, use and/or set member_value } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ As usual, the `_struct::const_iterator` and `_array::const_iterator` do not permit the values referenced by the iterator to be modified. XML-RPC parameter lists are similar to arrays and its values are indexed. We can also iterate over response parameters after an XML-RPC REST call: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} methodCall rpc(ctx, "endpoint URL", "methodName"); params request(ctx, 2); request[0] = ...; // first request parameter request[1] = ...; // second request parameter params response = rpc(request); // execute the call if (!rpc.error()) { for (params::iterator i = response.begin(); i != response.end(); ++i) { int index = i.index(); value& param_value = *i; ... // use param_value of response params } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We should note that JSON REST does not require parameter types, for example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "json.h" value request(ctx); value response(ctx); request[0] = ...; // first request parameter request[1] = ...; // second request parameter if (!json_call(cts, "endpoint URL", request, response)) { ... // use response value } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ There are two additional methods to invoke on parameters: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} int params::size(); // returns number of parameters bool params::empty(); // true if no parameters ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ All dynamically allocated memory that is internally used to store data is deallocated with: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} soap_destroy(ctx); // delete all values soap_end(ctx); // delete temp data soap_free(ctx); // delete context allocated with soap_new() ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Additional C++ examples are located in `gsoap/samples/xml-rpc-json`: - `xml-rpc-currentTime.cpp`: XML-RPC C++ client, also uses JSON - `xml-rpc-currentTimeServer.cpp`: XML-RPC C++ server (CGI and multi-threaded stand-alone) - `xml-rpc-weblogs.cpp`: XML-RPC C++ client - `xml-rpc-json.cpp`: XML-RPC to/from JSON example - `json-currentTime.cpp`: JSON REST C++ client - `json-currentTimeServer.cpp`: JSON REST C++ server (CGI and multi-threaded stand-alone) - `json-GitHub.cpp`: JSON REST C++ client for GitHub API v3 C++ XML-RPC client example {#cpp-cl} -------------------------- A typical XML-RPC calling sequence in C++ is: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "soapH.h" // generated by the command: soapcpp2 -CSL xml-rpc.h #include "xml-rpc-io.h" // to serialize XML-RPC data to streams struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; // no XML namespaces // create a context soap *ctx = soap_new1(SOAP_C_UTFSTRING); // store Unicode in UTF-8 format ctx->send_timeout = 10; // 10 sec, stop if server is not accepting msg ctx->recv_timeout = 10; // 10 sec, stop if server does not respond in time // create an XML-RPC method call object methodCall rpc(ctx, "endpoint URL", "methodName"); // populate the parameters rpc[0] = 123; // first parameter is an integer rpc[1] = "abc"; // second is a string rpc[2]["name"] = "joe"; // a record, first member "name" rpc[2]["age"] = 23; // a record, second member "age" rpc[3][0] = 456.789; // an array, first element (a float) rpc[3][1] = "widget"; // an array, second element (a string) rpc[3][2] = true; // an array, third element (a bool) // make the XML-RPC call and retrieve response params response = rpc(request); // check result if (rpc.error()) soap_stream_fault(ctx, std::err); else if (response.empty()) std::cout << rpc.fault() << std::endl; else if (response.size() > 1) std::cout << "More than one response data" << std::endl; else if (response[0].is_array() && !response[0].empty()) for (int i = 0; i < response[0].size(); i++) ... = response[0][i]; else if (response[0].is_struct()) { ... = response[0]["membername1"]; ... = response[0]["membername2"]; } else if (response[0].is_base64()) { _base64 base64& = response[0]; unsigned char *raw = base64.ptr(); int size = base64.size(); ... // use raw[0..size-1] data } else if (response[0].is_bool()) { bool flag = response[0]; ... // use boolean flag } else if (response[0].is_int()) { LONG64 num = response[0]; ... // use integer } else if (response[0].is_double()) { double num = response[0]; ... // use double float } else if (response[0].is_string()) { const char *str = response[0]; // use string, note that also legal is: const std::string& st = response[0]; // and conversion from UTF-8 to wide string unicode: const wchar_t *w = response[0]; const std::string& ws = response[0]; } else if (response[0].is_dateTime()) { time_t t = (ULONG64)response[0]; ... // use time } // deallocate all soap_destroy(ctx); soap_end(ctx); soap_free(ctx); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Alternatively, parameters of a methodCall can be passed with the methodCall itself as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} methodCall rpc(ctx, "endpoint URL", "methodName"); // create 5 parameters params request(ctx, 5); // populate the parameters request[0] = 123; // first parameter is an integer request[1] = "abc"; // second is a string request[2]["name"] = "joe"; // a record, first member "name" request[2]["age"] = 23; // a record, second member "age" request[3][0] = 456.789; // an array, first element (a float) request[3][1] = "widget"; // an array, second element (a string) request[3][2] = true; // an array, third element (a bool) // make the XML-RPC call with request parameters, retrieve response params response = rpc(request); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Note that in the client code, after the response is retrieved, the implicit type casts done by assignments will retrieve the values that are type-cast converted if needed. These casts can be used anywhere to retrieve values: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} params response = rpc(); double sum = 0.0; for (int i = 0; i < response.size(); i++) if (response[i].is_number()) // is this parameter an int or float? sum += (double)response[i]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Type casts can also be used to convert data, which means they never produce an exception. Casting to string `(const char*)` converts atomic values to strings, but does not convert compound types such as arrays and structs. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} params response = rpc(); for (int i = 0; i < response.size(); i++) printf("response[%d] = %s\n", i, (const char*)response[i]); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ which prints a string representation of the int, double, boolean, time, or base64 values of parameters. An empty string is printed for arrays and structs. Use iterators to walk over arrays and structs to print values. Or use the JSON API `json.h` and `json.cpp` to print values in JSON format, see further on JSON below. C++ XML-RPC server example {#cpp-sr} -------------------------- A typical C++ XML-RPC server sequence is: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // create an allocation context soap *ctx = soap_new1(SOAP_C_UTFSTRING); // create an XML-RPC methodCall object methodCall rpc(ctx); // Option 1: parse and write to/from stdin/out for CGI // (no code needed) // Option 2: parse and write to/from FILE or socket // ctx->recvfd = ...; // set input file descriptor // ctx->sendfd = ...; // set output file descriptor // Option 3: parse and write to/from IO streams // ctx->is = ...; // set input stream // ctx->os = ...; // set output stream if (rpc.recv() != SOAP_OK) soap_print_fault(ctx, stderr); else { // create response methodResponse response(ctx); // check method name if (!strcmp(rpc.name(), "methodName")) { // method name matches: populate response parameters with values: response[0] = ...; response[1] = ...; ... // add response data } else { // otherwise, set fault response.set_fault("Wrong method"); } // send response if (response.send() != SOAP_OK) soap_print_fault(ctx, stderr); } // close (but keep-alive setting keeps socket open) soap_closesock(ctx); // clean up soap_destroy(ctx); soap_end(ctx); soap_free(ctx); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ With option 1 the server code above uses standard in/out and thus runs over CGI. Other possibilities are given by options 2 and 3. To serve requests at a port, we use the `soap_bind()` and `soap_accept()` calls to bind the server to a port and accept requests via socket, see also the docs and examples for these calls (see for example `gsoap/samples/webserver.c`): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // create an allocation context soap *ctx = soap_new1(SOAP_IO_KEEPALIVE | SOAP_C_UTFSTRING); // bind to port 8080 if (!soap_valid_socket(soap_bind(ctx, NULL, 8080, 100))) ... // error, stop // accept messages in server loop for (;;) { if (!soap_valid_socket(soap_accept(ctx))) ... // error, stop // create a method object methodCall rpc(ctx); // parse it from socket if (rpc.recv() != SOAP_OK) soap_print_fault(ctx, stderr); ... // process request, produce result to send as shown above // close (but keep-alive setting keeps socket open) soap_closesock(ctx); // clean up soap_destroy(ctx); soap_end(ctx); } // free context soap_free(ctx); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ XML-RPC serialization from/to streams {#cpp-io} ----------------------------------------- To send and receive XML over streams, use `xml-rpc-io.h` and `xml-rpc-io.cpp`. For example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "xml-rpc-io.h" std::cout << response[0] << std::endl; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ which will display the data in XML-RPC format. To parse XML-RPC data from a stream, use: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "xml-rpc-io.h" value v(ctx); std::cin >> v; if (ctx->error) ... // check for parse errors (can also use v.soap->error) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Compile and link together with `soapC.cpp`, `xml-rpc.cpp`, `xml-rpc-io.cpp`, and `stdsoap2.cpp`. C++ JSON serialization from/to streams {#cpp-js} -------------------------------------- To display values in JSON format or to parse JSON data, use the `json.h` and `json.cpp` JSON serializers in combination with `xml-rpc.cpp` and the auto-generated `soapH.h` and `soapC.cpp`. It is also possible to send and receive JSON data over HTTP as JSON REST operations, but this requires some more coding (see \ref cpp-jr below). Because the internal data is the same for XML-RPC and JSON, You can write data in XML-RPC or in JSON format. You can also parse XML-RPC data and write to JSON data and vice versa. To write JSON to a stream you can use the `<<` operator on an output stream and a JSON value. To parse JSON from a stream you can use the `>>` operator on an input stream and populate a JSON value. For example, you can parse a JSON-formatted string and use that data to make an XML-RPC call. The result of the call is displayed in JSON, nicely indented using the `SOAP_XML_INDENT` flag (this XML indent flag also works for JSON): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "json.h" #include struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; // no XML namespaces // SOAP_C_UTFSTRING: UTF-8 content in char*, SOAP_XML_INDENT: indent JSON soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); value request(ctx); std::istringstream in; in.str("[ [1, \"2\", 3.14, true], {\"name\": \"john\", \"age\": 24} ]"); in >> request; // parse JSON, store as XML-PRC data if (ctx->error) ... // check for parse errors params response = rpc(request); // make the XML-RPC call std::cout << response << std::endl; // display result in JSON (indented) if (ctx->error) ... // check for write errors ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To force reading and writing JSON in ISO 8859-1 format, use the `SOAP_ENC_LATIN` flag to set the context (not recommended). Optionally use `SOAP_XML_INDENT` to indent XML and JSON. To parse JSON values from a file or any other non-HTTP source, it is recommended to set the `SOAP_ENC_PLAIN` context flag to prevent the parser from attempting to read a MIME or HTTP headers (HTTP headers are required with JSON-RPC): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_ENC_PLAIN); value v(ctx); in >> v; // SOAP_ENC_PLAIN: read JSON without parsing MIME/HTTP header ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Compile and link your code together with `soapC.cpp` (generated), `xml-rpc.cpp`, `json.cpp`, and `stdsoap2.cpp`. The JSON protocol has fewer data types than XML-RPC, so type information can be lost when serializing to JSON: - XML-RPC uses a base64 type to exchange raw binary data. The base64 data is converted to a string with base64 content by the JSON serializer. See also \ref base64. - XML-RPC has a dateTime type, JSON does not. The JSON serializer converts the dateTime type to a dateTime-formatted string. See also \ref dateTime. See the section on C++ examples on how to populate and retrieve C++ data. Strings are stored and exchanged in UTF-8 format in 8-bit strings (`char*` and `std::string`) by using the `SOAP_C_UTFSTRING` flag. Wide strings (i.e. `wchar_t*` and `std::wstring` ) are converted to UTF-8. C++ JSON REST clients and servers {#cpp-jr} --------------------------------- To use JSON REST on the client side, we use `json_call`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "json.h" // also compile and link json.cpp struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; // no XML namespaces // SOAP_C_UTFSTRING: UTF-8 content in char*, SOAP_XML_INDENT: indent JSON soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); value request(ctx), response(ctx); ... // now populate the request data to send if (json_call(ctx, "URL", &request, &response) != SOAP_OK)) // POST ... // error else ... // use the response data ... // make other calls etc. soap_destroy(ctx); // delete all values soap_end(ctx); ... // make other calls etc. soap_free(ctx); // free context ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A `json_call` takes a context, an endpoint URL (with URL query string parameters as needed), and optional `in` and `out` values to send and receive, respectively. This function returns `SOAP_OK` (zero) for success or `EOF`, `SOAP_SYNTAX_ERROR`, or an HTTP error code. To use the HTTP POST method, pass both `in` and `out` values to `json_call`. For the GET method, pass a NULL to `in`. For the PUT method, pass a NULL to `out`. For the DELETE method, pass both NULL to `in` and `out`. Besides `json_call`, there are other JSON API functions: - `int json_call(soap *ctx, const char *URL, value *in, value *out)` makes a POST, GET, PUT, DELETE call, returns `SOAP_OK` or error code. POST method: pass both `in` and `out`. GET method: pass a NULL to `in`. PUT method: pass a NULL to `out`. DELETE method: pass both NULL to `in` and `out`. `SOAP_OK` is returned for POST and GET methods upon success. An HTTP status code of 200 (OK) or 202 (Accepted) is returned for PUT and DELETE methods upon success. - `int json_write(soap *ctx, const value *v)` writes JSON value to current file, socket, or stream. Returns `SOAP_OK` or error. Set file/socket file descriptor to write to with `ctx->sendfd = fd` (1 by default). In C++, set output stream with `ctx->os = ostream` to write to. - `int json_read(soap *ctx, value *v)` reads JSON value from current file, socket, or stream. Returns `SOAP_OK` or error. Set file/socket file descriptor with `ctx->recvfd = fd` to read from (0 by default). In C++, set input stream with `ctx->is = istream`. The are two other lower-level functions `json_send` and `json_recv` that are similar to `json_write` and `json_read` but do not initialize the sending and receiving operations and do not flush after the sending and receiving operations. To implement a JSON REST server for CGI (e.g. install in cgi-bin): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "json.h" // also compile and link json.cpp struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; // no XML namespaces int main() { soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_ENC_PLAIN); value request(ctx), response(ctx); if (soap_begin_recv(ctx) || json_recv(ctx, request) || soap_end_recv(ctx)) { json_send_fault(ctx); // return a JSON-formatted fault } else { ... // use the 'request' value ... // set the 'response' value // set http content type ctx->http_content = "application/json; charset=utf-8"; // send http header 200 OK and JSON response if (soap_response(ctx, SOAP_FILE) || json_send(ctx, response) || soap_end_send(ctx)) soap_closesock(ctx); } // dealloc all soap_destroy(ctx); soap_end(ctx); soap_free(ctx); } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The above server works with CGI, which is rather slow and stateless. A stand-alone JSON REST server is recommended. You can also use the Apache and IIS plugins for gSOAP to deploy JSON REST services. See the [documentation](https://www.genivia.com/docs.html). Note that we use `json_send_fault()` instead of `soap_send_fault()` when an internal error occurred, since we want the error to be reported in JSON format as per Google JSON Style Guide. For application-specific errors, we use `json_send_error()` as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} if (some application error occurred) json_send_error(ctx, 400, "Error message", "Error details"); else ... // send the response ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can specify an HTTP error code such as 400 in this case, which means that a HTTP 400 Bad Request is returned to the client. The `json_send_error()` function is a convenient shortcut to return an error message with an HTTP error code. To return a JSON response with a HTTP error code use the following: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} int status = 400; // HTTP 400 Bad Request soap->http_content = "application/json; charset=utf-8"; if (soap_response(soap, SOAP_FILE + status) || json_send(soap, v) || soap_end_send(soap)) soap_closesock(soap); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The code for a stand-alone server is the same, except that we call `soap_bind()` and `soap_accept()` to serve requests on a port. Here is a simple iterative server serving requests on port 8080: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // create an allocation context soap *ctx = soap_new1(SOAP_IO_KEEPALIVE | SOAP_C_UTFSTRING); // bind to port 8080 if (!soap_valid_socket(soap_bind(ctx, NULL, 8080, 100))) ... // error, stop // accept messages in server loop for (;;) { if (!soap_valid_socket(soap_accept(ctx))) ... // error, stop value request(ctx), response(ctx); if (soap_begin_recv(ctx) || json_recv(ctx, request) || soap_end_recv(ctx)) { json_send_fault(ctx); // return a JSON-formatted fault } else { ... // use the 'request' value ... // set the 'response' value // set http content type ctx->http_content = "application/json; charset=utf-8"; // send http header 200 OK and JSON response if (soap_response(ctx, SOAP_FILE) || json_send(ctx, response) || soap_end_send(ctx)) soap_closesock(ctx); } // dealloc all soap_destroy(ctx); soap_end(ctx); } soap_free(ctx); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Note that `SOAP_ENC_PLAIN` should be used with CGI, since we are reading from a non-HTTP source with CGI. We do not use this flag with gSOAP stand-alone servers. Iterative stand-alone services are not performant and may block requests. We recommend stand-alone multi-threaded services. Compile and link your code together with `soapC.cpp` (generated with `soapcpp2 -CSL xml-rpc.h`), `xml-rpc.cpp`, `json.cpp`, and `stdsoap2.cpp`. For C++ client and server examples, please see the gSOAP package content `gsoap/samples/xml-rpc-json`: - `json-currentTime.cpp`: JSON REST C++ client - `json-currentTimeServer.cpp`: JSON REST C++ server (CGI and multi-threaded stand-alone) The presentation in this section concerned stand-alone JSON REST services. To combine SOAP/XML with JSON REST services, see \ref soap for details. C++ JSON-RPC clients and servers {#cpp-rpc} -------------------------------- The [JSON-RPC 1.0 specification](http://json-rpc.org/wiki/specification) (the "original version") adds `method`, `parameter` and `id` fields to the request message:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ { "method": "echo", "params": [ "Hello World!" ], "id": 1 } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
where: - `method` is a string with the name of the method to be invoked. - `params` is an array of objects to be passed as parameters to the defined method. - `id` is a value of any type, which is used to match the response with the request that it is replying to. A response message has a `result` field, an `error` field, and an `id`:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ { "result": "Welcome!", "error": null, "id": 1 } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
where: - `result` is the data returned by the invoked method. If an error occurred while invoking the method, this value must be null. - `error` is a specified error code if there was an error invoking the method, otherwise null. - `id` is the id of the request it is responding to. The [JSON-RPC 2.0 specification](http://www.jsonrpc.org/specification) makes all 1.0 fields REQUIRED, except for `error` which MUST NOT be present if there was no error triggered during invocation. The 2.0 specification adds a `jsonrpc` field in the request message:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ { "jsonrpc": 2.0, "method": "echo", "params": [ "Hello World!" ], "id": 1 } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
and also adds the `jsonrpc` field to the response message:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ { "jsonrpc": 2.0, "result": "Welcome!", "id": 1 } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The C++ operations are straightforward to conform to the JSON-RPC 1.0 or 2.0 specifications. The example JSON-RPC 2.0 request message shown above is created by the following code that uses `json_call()` to invoke a JSON-RPC service: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} const char *endpoint = "http://..."; soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); value req(ctx), res(ctx); req["jsonrpc"] = 2.0; req["method"] = "echo"; req["params"][0] = "Hello World!"; req["id"] = 1; if (json_call(ctx, endpoint, req, res)) // JSON-RPC call soap_stream_fault(ctx, std::cerr); else if (res.has("error") && !res["error"].is_null()) // JSON-RPC error? std::cerr << res["error"]; else if ((int)res["id"] != 1) // matching id field? std::cerr << "response id != request id\n"; else // all OK! std::cout << res["result"]; // display result ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For HTTPS use an https endpoint URL. You can control the HTTPS context as explained in the [tutorials.](http://www.genivia.com/tutorials.html) The server-side creates response messages similar to the example shown above. To implement a C++ JSON-RPC and JSON REST server, please see the example `json-currentTimeServer.cpp` located in `gsoap/samples/xml-rpc-json` in the gSOAP package. Embedding and serializing raw JSON data as a JSON value in C++ {#cpp-raw} -------------------------------------------------------------- A JSON value represented by a `value` may contain raw JSON data as a string to serialize literally in the output. Deserializing JSON into a JSON `value` never populates this string, so this feature is to augment JSON output with embedded raw JSON data only. To add raw JSON data create a `_rawdata` object and assign it to a `value`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "json.h" soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); json::value v(ctx); // create a blob of raw JSON _rawdata blob(ctx, "[ true, 123, { \"key\": 456 } ]"); v = blob; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The `_rawdata blob` can be assigned anywhere where a `value` is expected, i.e. as an item of an array or as a value property of a JSON object. To check that a `value` contains a `_rawdata` value and to retrieve it as raw data: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "json.h" soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); json::value v(ctx); ... if (v.is_rawdata()) { _rawdata blob = (_rawdata)v; size_t size = blob.size(); char *data = blob.ptr(); ... } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If the raw data blob does not contain `\0` bytes, then it is simpler to cast the `value` to a string: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "json.h" soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); json::value v(ctx); ... if (v.is_rawdata()) { char *data = v; ... } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Moving JSON types and operations into a C++ namespace {#json-ns} ----------------------------------------------------- A C++ namespace is preferred to separate JSON types and operations from other project-related types and operations. This allows you to cleanly compile the JSON API files together with other gSOAP XML data binding files. To put all JSON (and the internal XML-RPC) types and operations in a `json` C++ namespace, execute the following commands: soapcpp2 -qjson -CSL xml-rpc.h soapcpp2 -penv -CSL env.h where `env.h` is an empty file. This generates `jsonStub.h` and `jsonH.h` and two more files `jsonC.cpp` and `envC.cpp` to compile with `xml-rpc.cpp`, `json.cpp`, and `stdsoap2.cpp`. When combining JSON with a wsdl2h-generated header file that declares an XML data binding interface, use this header file instead of an empty `env.h`. Use soapcpp2 to generate the data binding and client/server code as usual (without option `-penv`). Compile the source files together with `xml-rpc.cpp` and `json.cpp` and set the macro `-DJSON_NAMESPACE`, for example: c++ -DJSON_NAMESPACE xml-rpc.cpp json.cpp jsonC.cpp envC.cpp stdsoap2.cpp ... To enable OpenSSL for HTTPS also use `-DWITH_OPENSSL` to compile. Then link with `-lssl` and `-lcrypto`. Your project should now use the `json` namespace with the `value` type, for example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "json.h" soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); json::value v(ctx); std::cin >> v; // parse JSON if (ctx->error) ... // check for errors (can also check v.soap->error) std::cout << v; // output JSON if (ctx->error) ... // check for errors (can also check v.soap->error) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C XML-RPC and JSON {#c} ================== With the release of gSOAP 2.8.26, the XML-RPC and JSON C APIs have been greatly improved. The material in this section pertains to gSOAP 2.8.26 and later. The new C API for XML-RPC and JSON makes it much easier to populate and retrieve data, but not as simple and easy as the C++ API. List of files {#c-files} ------------- The following files define XML-RPC operations and data types: - `xml-rpc.c`: XML-RPC C API - `xml-rpc.h`: XML-RPC data binding as a gSOAP .h file for soapcpp2 (do not #include this file in your project builds) In addition to the files above, for JSON we also need the following files: - `json.h`: JSON C API and JSON serialization - `json.c`: JSON C API and JSON serialization The gSOAP header file `xml-rpc.h` defines all XML-RPC and JSON types and the C API functions to create XML-RPC and JSON data for REST messages. A note about the following auto-generated files: `soapH.h`, `soapStub.h` and `soapC.c`: these are required for XML-RPC and JSON. To auto-generate these files, execute: soapcpp2 -c -CSL xml-rpc.h Then compile and link the `.c` files listed above for XML-RPC and JSON with the auto-generated `soapC.c` and `stdsoap2.c`: cc -I../.. -o myapp myapp.c json.c xml-rpc.c soapC.c ../../stdsoap2.c Instead of `stdsoap2.c` you can link `libgsoap.a` with `-lgsoap`, when installed by the gSOAP package. To enable OpenSSL for HTTPS compile with `-DWITH_OPENSSL` and link `-lssl`, and `-lcrypto`: cc -DWITH_OPENSSL -I../.. -o myapp myapp.c json.c xml-rpc.c soapC.c ../../stdsoap2.c -lssl -lcrypto For OpenSSL support, instead of `stdsoap2.c` you can link `libgsoapssl.a` with `-lgsoapssl`, when installed by the gSOAP package. Because XML namespaces are not used, we can either use `-DWITH_NONAMESPACES` to compile `stdsoap2.c` without complaining about a missing global `Namespace`, or we can define an empty namespaces table somewhere in our code: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Overview {#c-ex} -------- An XML-RPC/JSON data value is created in C as follows, which requires a context `ctx` with the engine state (the soap struct). The context manages the memory that is internally allocated to hold values. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} #include "soapH.h" struct soap *ctx = soap_new1(SOAP_C_UTFSTRING); /* new context */ struct value *v = new_value(ctx); soap_end(ctx); /* delete all values */ soap_free(ctx); /* free context */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Note that `soapH.h` is an auto-generated file (see previous section). This file needs to be generated only once and for all. It also references `stdsoap2.h` and the auto-generated `soapStub.h`. Compile and link your code with `stdsoap2.cpp` and the auto-generated `soapC.cpp` XML-RPC serializers. Also compile and link `xml-rpc.cpp`. For JSON, compile and link `json.cpp`. With the C API, allocating a context and values on the heap may return NULL when your system runs out of memory. On most systems this is unlikely to happen, but to safeguard your code check for NULL returns as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} #include "soapH.h" struct soap *ctx = soap_new1(SOAP_C_UTFSTRING); /* new context */ if (ctx == NULL) ... /* out-of-memory error */ struct value *v = new_value(ctx); if (v == NULL) ... /* out-of-memory error */ soap_end(ctx); /* delete all values */ soap_free(ctx); /* free context */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Also, when enlarging structs and arrays by indexing them beyond their current content, the enlargement may fail and a NULL pointer is returned. You can use wide strings with Unicode stored in UTF-8-formattted 8-bit `char` strings. For compatibility with XML-RPC serialization of UTF-8-encoded strings, we MUST use the `SOAP_C_UTFSTRING` flag to initialize the context with `soap_new1(SOAP_C_UTFSTRING)`. The code shown above creates an empty value `v`. Values can be assigned any one of the following data types: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} *int_of(v) = 12345LL; /* 64 bit int */ *double_of(v) = 12.34; /* double float */ *string_of(v) = "abc"; /* string */ *string_of(v) = soap_wchar2s(ctx, L"xyz"); /* wide string (converted to UTF-8) */ *bool_of(v) = 0; /* Boolean false (0) or true (1) */ *dateTime_of(v) = soap_dateTime2s(ctx, time(0)); /* time_t value serialized as ISO 8601 date time */ /* create an array [24, 99.99, "abc"] */ *int_of(nth_value(v, 0)) = 24; *double_of(nth_value(v, 1)) = 99.99; *string_of(nth_value(v, 2)) = "abc"; /* create a struct (JSON object) {"name": "gsoap", "major": 2.8, "©": 2015} */ *string_of(value_at(v, "name")) = "gsoap"; *double_of(value_at(v, "major")) = 2.8; *int_of(value_atw(v, L"©")) = 2015; /* wide string tags are OK */ /* create a base64-encoded image object */ struct _base64 *img = base64_of(v); img->__ptr = ptr_to_rawimage100bytes; /* block of 100 raw bytes */ img->__size = 100; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The functions above return a pointer to a specific type of value and this value can be assigned as shown above but also read. So we use these functions also to retrieve data, for example after receiving XML-RPC or JSON data. We can combine this syntax in many possible ways to create arrays of arrays, arrays of structs, and so on. For example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} *string_of(value_at(nth_value(v, 0), "name")) = "bob"; *string_of(nth_value(value_at(nth_value(v, 0), "toys"), 0)) = "ball"; *string_of(nth_value(value_at(nth_value(v, 0), "toys"), 1)) = "furby"; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This creates a singleton array containing an object with two members: `name` set to `"bob"` and `toys` set to an array containing `"ball"` and `"furby"`. In JSON format this is represented as: [ { "name": "bob", "toys": ["ball", "furby"] } ] ^ ^ ^ ^ | | | | an array_/ | | | of 1 struct_/ | | with 2 members_/______________/ Let's see what happens when we assign a variable the value of another. The JSON C API uses the *reference model* for variables, meaning that values are shared when assigning a target variable the value of another variable. The variable values are shared until one or the other variables is assigned a different type of value. We illustrate the effect below: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} struct value *x = new_value(ctx), *y = new_value(ctx); *int_of(x) = 1; *y = *x; *int_of(x) = 2; printf("x = %lld and y = %lld\n", *int_of(x), *int_of(y)); *double_of(x) = 3.1; printf("x = %g and y = %lld\n", *double_of(x), *int_of(y)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This prints `x = 2 and y = 2` and `x = 3.1 and y = 2`. You can make a copy of an atomic value with one of the `Type_of()` functions. The following code illustrates how: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} struct value *x = new_value(ctx), *y; *int_of(x) = 1; *int_of(y) = *int_of(x); *int_of(x) = 2; printf("x = %lld and y = %lld\n", *int_of(x), *int_of(y)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This prints `x = 2 and y = 1`. You can also make deep copies of values by using the auto-generated `soap_dup_value` function in `soapC.c`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} struct value *a = new_value(ctx), *b; *int_of(nth_value(a, 0)) = 1; b = soap_dup_value(ctx, NULL, a); *int_of(nth_value(a, 0)) = 2; printf("a[0] = %lld and b[0] = %lld\n", *int_of(nth_value(a, 0)), *int_of(nth_value(b, 0))); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This prints `a[0] = 2 and b[0] = 1`. To auto-generate `soap_dup_value`, use option `-Ec` with soapcpp2: soapcpp2 -c -Ec -CSL xml-rpc.h When receiving a value in XML-RPC or JSON, we generally want to check its type to obtain its value. To check the type of a value, we use `is_Type` functions: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} is_null(v) /* true if value is not set (JSON null) */ is_bool(v) /* true if value is a Boolean "true" or "false" value */ is_true(v) /* true if value is Boolean "true" */ is_false(v) /* true if value is Boolean "false" */ is_number(v) /* true if value is a number (int or float) */ is_int(v) /* true if value is a 32 or a 64 bit int */ is_double(v) /* true if value is a 64 bit double floating point (not integer) */ is_string(v) /* true if value is a string */ is_dateTime(v) /* true if ISO 8601, always false for received JSON */ is_array(v) /* true if array of values */ is_struct(v) /* true if structure, a.k.a. a JSON object */ is_base64(v) /* true if base64, always false for received JSON */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ When working with JSON data, do not use `is_double()` but `is_number()`. JSON data does not differentiate between integers and floats. However, gSOAP makes sure that 64 bit integer values are accurately represented in JSON and decoded without loss from JSON. That is, when receiving an integer that you checked with `is_int()` you can then safely retrieve the value with `int_of()`, for example `int64_t n = *int_of(v)`. The following functions can be used with arrays and structs (JSON objects): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} void set_struct(v) /* reset/create an empty struct */ void set_size(v, int) /* reset/change array size or pre-allocate space */ int has_size(v) /* returns array or struct size or 0 */ int is_empty(v) /* returns 1 if array or struct is empty or 0 */ struct value *nth_value(v, int) /* returns nth value in array or struct */ struct value *value_at(v, const char*) /* returns value at field in struct */ struct value *value_atw(v, const wchar_t*) /* returns value at field in struct */ int nth_at(v, const char*) /* returns nth index of field in struct or -1 */ int nth_atw(v, const wchar_t*) /* returns nth index of field in struct or -1 */ int nth_nth(v, int) /* returns nth index if nth index exists in array or -1 */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ When accessing structs (JSON objects) with `value_at`, make sure to use existing member field names only. A new member fieldname-value pair is dynamically added to the structure to accomodate the new entry for the field. Also arrays are extended with `nth_value` to accommodate the indexed array element. A negative array index indexes elements from the end of the array, with index -1 accessing the array's last value. Use `set_size` to change array size or set arrays to zero length. Use negative size with `set_size` to remove elements from the end. For example, let's take the value `v` that was assigned the array shown above. We have the following properties of this value: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} is_null(v) == false is_array(v) == true has_size(v) == 1 is_empty(v) == 0 is_struct(nth_value(v, 0)) == true nth_at(nth_value(v, 0), "name") == 0 is_string(value_at(nth_value(v, 0), "name")) == true is_string(nth_value(value_at(nth_value(v, 0), "toys"), 0)) == true is_string(nth_value(value_at(nth_value(v, 0), "toys"), 1)) == true ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Considering that the code verbosity quickly increases when accessing deeper levels of your structures, you are probably inclined to define your own macros to create and access deep data more conveniently, such as: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} #define string_at(v, s) string_of(value_at((v), (s))) #define nth_string(v, n) string_of(nth_value((v), (n))) #define nth_string_at(v, s, n) string_of(nth_value(value_at((v), (s)), (n))) #define string_at_nth(v, n, s) string_of(value_at(nth_value((v), (n)), (s))) #define nth_string_at_nth(v, n, s, m) string_of(nth_value(value_at(nth_value((v), (n)), (s)), (m))) ... etc ... *string_at_nth(v, 0, "name") = "bob"; *nth_string_at_nth(v, 0, "toys", 0) = "ball"; *nth_string_at_nth(v, 0, "toys", 1) = "furby"; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To iterate over array and struct values, we use a loop over `nth_value` and `nth_member` as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} if (is_array(v)) { int i; for (i = 0; i < has_size(v); i++) { struct value *array_value = nth_value(v, i); ... /* use and/or set array_value */ } } else if (is_struct(v)) { int i; for (i = 0; i < has_size(v); i++) { struct member *member = nth_member(v, i); const char *member_name = member->name; struct value *member_value = &member->value; ... /* use member_name and member_value */ } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To access base64 binary raw data of a value `v`, we use the following code: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} struct _base64 *base64 = base64_of(v); unsigned char *raw = base64->__ptr; /* point to raw binary data */ int size = base64->__size; /* that is of this size */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ XML-RPC parameter lists are similar to arrays and its values are indexed. We can also loop over response parameters after an XML-RPC REST call: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} struct params *request = new_params(ctx); struct methodResponse response; *string_of(nth_param(request, 0)) = "hello"; *string_of(nth_param(request, 1)) = "world"; if (call_method(ctx, "endpoint URL", "methodName", request, &response) == SOAP_OK) { int i; for (i = 0; i < response.params->__size; i++) { struct value *param_value = nth_param(response.params, i); ... /* use param_value */ } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We should note that JSON REST does not require parameter types, for example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} #include "json.h" struct value *request = new_value(ctx); struct value *response = new_value(ctx); *string_of(nth_value(request, 0)) = "hello"; *string_of(nth_value(request, 1)) = "world"; if (json_call(cts, "endpoint URL", request, response) == SOAP_OK) { ... /* use response value */ } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ All dynamically allocated memory that is internally used to store data is deallocated with: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} soap_end(ctx); /* delete all values */ soap_free(ctx); /* delete context allocated with soap_new() */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Additional examples are located in `gsoap/samples/xml-rpc-json`: - `json-currentTime.c` JSON REST C client - `json-currentTimeServer.c` JSON REST C server (CGI and multi-threaded stand-alone) - `json-GitHub.c`: JSON C client for GitHub API v3 - `xml-rpc-currentTime.c` XML-RPC C client - `xml-rpc-weblogs.c` XML-RPC C client C XML-RPC client example {#c-cl} ------------------------ An XML-RPC method call in C with the new XML-RPC C API: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} #include "soapH.h" /* generated by the command: soapcpp2 -CSL xml-rpc.h */ struct soap *ctx = soap_new1(SOAP_C_UTFSTRING); /* UTF-8 in char* strings */ struct params *request = new_params(ctx); struct methodResponse response; ctx->send_timeout = 10; /* 10 sec, stop if server is not accepting msg */ ctx->recv_timeout = 10; /* 10 sec, stop if server does not respond in time */ /* first parameter is an integer */ *int_of(nth_param(request, 0)) = 123; /* second parameter is a string */ *string_of(nth_param(request, 1)) = "abc"; /* third parameter is a struct {"name": "joe", "age": 23} */ *string_of(value_at(nth_param(request, 2), "name")) = "joe"; *int_of(value_at(nth_param(request, 2), "age")) = 23; /* fourth parameter is an array [456.789, "widget", true] */ *double_of(nth_value(nth_param(request, 3), 0)) = 456.789 *string_of(nth_value(nth_param(request, 3), 1)) = "widget"; *bool_of(nth_value(nth_param(request, 3), 2)) = 1; /* connect, send request, and receive response */ if (call_method(ctx, "endpoint UTL", "methodName" request, &response)) { soap_print_fault(ctx, stderr); } else if (response.fault) { /* write fault to stdout */ soap_write_fault(ctx, response.fault); } else { /* print response parameters */ int i; for (i = 0; i < response.params->__size; i++) { printf("Return parameter %d = ", i+1); display(nth_param(response.params, i)); /* see below */ printf("\n"); } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The following example shows how to traverse the node graph to display a value: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} void display(struct value *v) { if (is_bool(v)) printf(is_true(v) ? "true" : "false"); else if (is_int(v)) printf("%lld", int_of(v)); else if (is_double(v)) printf("%lG", double_of(v)); else if (is_string(v)) printf("\"%s\"", string_of(v)); else if (is_array(v)) { int i; printf("["); for (i = 0; i < has_size(v); i++) { if (i) printf(","); display(nth_value(v, i)); } printf("]"); } else if (is_struct(v)) { int i; printf("{"); for (i = 0; i < has_size(v); i++) { if (i) printf(","); printf("\"%s\": ", nth_member(v, i)->name); display(&nth_member(v, i)->value); } printf("}"); } else if (is_dateTime(v)) printf("\"%s\"", dateTime_of(v)); else if (is_base64(v)) printf("(%d bytes of raw data at %p)", base64_of(v)->__size, base64_of(v)->__ptr); } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Compile and link your code together with `soapC.c` (generated), `xml-rpc.c`, and `stdsoap2.c`. C JSON serialization {#c-js} -------------------- To write values in JSON format or parse JSON data, we use the `json.h` and `json.c` JSON C API. It is also possible to send and receive JSON data over HTTP (JSON REST). Reading and writing XML from/to files, streams and string buffers is done via the managing context by setting one of the following context members that control IO sources and sinks: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} ctx->recvfd = fd; // an int file descriptor to read from (0 by default) ctx->sendfd = fd; // an int file descriptor to write to (1 by default) ctx->is = cs; // C only: a const char* string to read from (soap->is will advance) ctx->os = &cs; // C only: pointer to a const char*, will be set to point to the string output ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For example, to read and write JSON data from/to a file descriptor: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} #include "json.h" /* also compile and link json.c */ struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; /* no XML namespaces */ /* SOAP_C_UTFSTRING: UTF-8 content in char*, SOAP_XML_INDENT: indent JSON */ struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); struct value *v = new_value(ctx); ctx->recvfd = ...; /* set int file descriptor for reading */ json_read(ctx, v); /* read JSON into value v */ if (ctx->error) ... /* handle IO error (error message is in 'v' */ ctx->sendfd = ...; /* set int file descriptor for writing */ json_write(ctx, v); /* write value v in JSON format (indented) */ if (ctx->error) ... /* handle IO error (error message is in 'v' */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To force reading and writing JSON in ISO 8859-1 format, use the `SOAP_ENC_LATIN` flag to initialize the context (not recommended). Optionally use `SOAP_XML_INDENT` to indent XML and JSON output. To parse JSON values from a file or from any other non-HTTP source, it is recommended to set the `SOAP_ENC_PLAIN` context flag to prevent the parser from attempting to read a MIME or HTTP headers (HTTP headers are required with JSON-RPC): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_ENC_PLAIN); struct value *v = new_value(ctx); json_read(ctx, v); /* read JSON without parsing MIME/HTTP header */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can also read and write JSON data from/to NUL-terminated strings: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} #include "json.h" struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_ENC_PLAIN); struct value *v = new_value(ctx); const char *cs = "[1, 2, 3]"; ctx->is = cs; json_read(ctx, v); /* read JSON array from cs into value v */ if (ctx->error) ... /* handle IO error (error message is in 'v' */ cs = NULL; ctx->os = &cs; json_write(ctx, v); /* write value v in JSON format (indented) and set cs */ if (ctx->error) ... /* handle IO error (error message is in 'v' */ printf("JSON data:\n%s\n", cs); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Compile and link your code together with `soapC.c` (generated), `xml-rpc.c`, `json.c`, and `stdsoap2.c`. You can also convert XML-RPC data to/from JSON and populate XML-RPC from JSON data. The XML-RPC parsing and sending functions are `soap_read_value` and `soap_write_value`, respectively. The JSON protocol has fewer data types than XML-RPC, so type information can be lost when serializing to JSON: - XML-RPC uses a base64 type to exchange raw binary data. The base64 data is converted to a string with base64 content by the JSON serializer. See also \ref base64. - XML-RPC has a dateTime type, JSON does not. The JSON serializer converts the dateTime type to a dateTime-formatted string. See also \ref dateTime. Strings are stored and exchanged in UTF-8 format in 8-bit strings (i.e. `char*` strings) with the `SOAP_C_UTFSTRING` flag. Wide strings (i.e. `wchar_t*` strings) are converted to UTF-8. To read JSON from a string and write JSON to a string, we suggest to use gSOAP 2.8.28 or later. With these newer versions you can set the contex input string `ctx->is` to the string to parse (reset to NULL afterwards) as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} value *v = new_value(ctx); ctx->is = "[ [1, \"2\", 3.14, true], {\"name\": \"john\", \"age\": 24} ]": json_read(ctx, v); if (ctx->error) ... /* handle IO error (error message is in 'v' */ ctx->is = NULL; /* stop reading from string */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can set the context output string pointer `ctx->os` to point to the `const char*` string that you want to be set. This string will point to the JSON data created by the engine and managed by the context as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} value *v = new_value(ctx); const char *json_out = NULL; ... /* populate value v */ ctx->os = &json_out; /* the string to point to JSON data */ json_write(ctx, v); if (ctx->error) ... ctx->os = NULL; /* stop writing to strings */ if (json_out) { ... /* use json_out string, do not free() (managed by the context) */ } ... soap_end(ctx); /* deletes json_out string */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For older versions prior to 2.8.28, the gSOAP engine's IO `frecv` callback function can be used as follows to parse JSON from a string buffer: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} size_t buf_recv(struct soap *ctx, char *buf, size_t len) { const char *in = (char*)ctx->user; /* get handle to input string */ size_t n = strlen(in); if (n > len) /* if in[] is larger than buf[] len */ n = len; /* then cap length at len */ memcpy(buf, in, n); in += n; ctx->user = (void*)in; /* update the handle */ return n; } ... value *v = new_value(ctx); const char *json_in = "[ [1, \"2\", 3.14, true], {\"name\": \"john\", \"age\": 24} ]": ctx->frecv = buf_recv; ctx->user = (void*)json_in; /* a user handle that is passed to buf_recv */ json_read(ctx, v); if (ctx->error) ... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For older versions prior to 2.8.28, the gSOAP engine IO `fsend` callback function can be used to write JSON to strings as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} #define BUFFER_INCREMENT (1024) int buf_send(struct soap *ctx, const char *buf, size_t len) { char *out = (char*)ctx->user; /* get handle to current buffer, if any */ size_t n = out ? strlen(out) : 0; size_t k = (n + len + 1)/BUFFER_INCREMENT; if (!out) /* first time around? */ { out = malloc((k + 1) * BUFFER_INCREMENT); } else if (n/BUFFER_INCREMENT < k) /* need to increase buffer? */ { char *more = malloc((k + 1) * BUFFER_INCREMENT); memcpy(more, out, n); free(out); out = more; } memcpy(out + n, buf, len); out[n + len] = '\0'; ctx->user = (void*)out; return SOAP_OK; } ... value *v = new_value(ctx); const char *json_out; ... /* populate value v */ ctx->fsend = buf_send; ctx->user = NULL; json_write(ctx, v); if (ctx->error) ... json_out = (char*)ctx->user; if (json_out) { ... /* use json_out string */ free(json_out); ctx->user = NULL; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C JSON REST clients and servers {#c-jr} ------------------------------- To use JSON REST on the client side, we use `json_call`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} #include "json.h" /* also compile and link json.c */ struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; /* no XML namespaces */ /* SOAP_C_UTFSTRING: UTF-8 content in char*, SOAP_XML_INDENT: indent JSON */ struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); struct value *request = new_value(ctx); struct value response; ... /* here we populate the request data to send */ if (json_call(ctx, "endpoint URL", request, &response)) ... /* error */ ... /* use the response data */ soap_end(ctx); /* delete all values */ ... /* here we can make other calls etc. */ soap_free(ctx); /* delete the context */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The `json_call` function takes a context, an endpoint URL (with query string parameters as needed), and optional `in` and `out` values to send and receive, respectively. The function returns `SOAP_OK` (zero) for success or `EOF`, `SOAP_SYNTAX_ERROR`, or an HTTP error code. To use the JSON REST POST method, pass both `in` and `out` values to `json_call`. For the GET method, pass a NULL to `in`. For the PUT method, pass a NULL to `out`. For the DELETE method, pass both NULL to `in` and `out`. Besides `json_call`, there are other JSON API functions: - `int json_call(struct soap *ctx, const char *URL, struct value *in, struct value *out)` makes a POST, GET, PUT, DELETE call, returns `SOAP_OK` or error code. POST method: pass both `in` and `out`. GET method: pass a NULL to `in`. PUT method: pass a NULL to `out`. DELETE method: pass both NULL to `in` and `out`. `SOAP_OK` is returned for POST and GET methods upon success. An HTTP status code of 200 (OK) or 202 (Accepted) is returned for PUT and DELETE methods upon success. - `int json_write(struct soap *ctx, const struct value *v)` Writes JSON value to current file or socket. Returns `SOAP_OK` or error. Set current file/socket file descriptor with `ctx->sendfd = fd`. Or save JSON to a string by setting `ctx->os = &cs` with `const char *cs` a string pointer that will be set to a NUL-terminated string when the write completed. - `int json_read(struct soap *ctx, struct value *v)` Reads JSON value from current file or socket. Returns `SOAP_OK` or error. Set current file/socket file descriptor with `ctx->recvfd = fd`. Or read from string by setting `ctx->is = cs` to a `const char *cs` NUL-terminated string. The are two other lower-level functions `json_send` and `json_recv` that are similar to `json_write` and `json_read` but do not initialize the sending and receiving operations and do not flush after the sending and receiving operations. Compile and link your code together with `soapC.c` (generated), `xml-rpc.c`, `json.c`, and `stdsoap2.c`. To implement a JSON REST server for CGI (e.g. install in cgi-bin): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "json.h" // also compile and link json.c struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; // no XML namespaces int main() { struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT | SOAP_ENC_PLAIN); struct value *request = new_value(ctx); struct value *response = new_value(ctx); if (soap_begin_recv(ctx) || json_recv(ctx, request) || soap_end_recv(ctx)) { json_send_fault(ctx); // return a JSON-formatted fault } else { ... // use the 'request' value ... // set the 'response' value // set http content type ctx->http_content = "application/json; charset=utf-8"; // send http header 200 OK and JSON response if (soap_response(ctx, SOAP_FILE) || json_send(ctx, response) || soap_end_send(ctx)) soap_closesock(ctx); } // dealloc all soap_end(ctx); soap_free(ctx); } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The above server works with CGI, which is rather slow and stateless. A stand-alone JSON REST server is recommended. You can also use the Apache and IIS plugins for gSOAP to deploy JSON REST services. See the [documentation](https://www.genivia.com/docs.html). Note that we use `json_send_fault()` instead of `soap_send_fault()` when an internal error occurred, since we want the error to be reported in JSON format as per Google JSON Style Guide. For application-specific errors, we use `json_send_error()` as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} if (some application error occurred) json_send_error(ctx, 400, "Error message", "Error details"); else ... // send the response ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can specify an HTTP error code such as 400 in this case, which means that a HTTP 400 Bad Request is returned to the client. The `json_send_error()` function is a convenient shortcut to return an error message with an HTTP error code. To return a JSON response with a HTTP error code use the following: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} int status = 400; // HTTP 400 Bad Request soap->http_content = "application/json; charset=utf-8"; if (soap_response(soap, SOAP_FILE + status) || json_send(soap, v) || soap_end_send(soap)) soap_closesock(soap); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The code for a stand-alone server is the same, except that we call `soap_bind()` and `soap_accept()` to serve requests on a port. Here is a simple iterative server serving requests on port 8080: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} // create an allocation context struct soap *ctx = soap_new1(SOAP_IO_KEEPALIVE | SOAP_C_UTFSTRING); // bind to port 8080 if (!soap_valid_socket(soap_bind(ctx, NULL, 8080, 100))) ... // error, stop // accept messages in server loop for (;;) { struct value *request = new_value(ctx); struct value *response = new_value(ctx); if (!soap_valid_socket(soap_accept(ctx))) ... // error, stop if (soap_begin_recv(ctx) || json_recv(ctx, request) || soap_end_recv(ctx)) { json_send_fault(ctx); // return a JSON-formatted fault } else { ... // use the 'request' value ... // set the 'response' value // set http content type ctx->http_content = "application/json; charset=utf-8"; // send http header 200 OK and JSON response if (soap_response(ctx, SOAP_FILE) || json_send(ctx, response) || soap_end_send(ctx)) soap_closesock(ctx); } // dealloc all soap_end(ctx); } soap_free(ctx); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Note that `SOAP_ENC_PLAIN` should be used with CGI, since we are reading from a non-HTTP source with CGI. Do not use this flag with gSOAP stand-alone servers. Iterative stand-alone services are not performant and may block requests. We recommend stand-alone multi-threaded services. Compile and link your code together with `soapC.c` (generated with `soapcpp2 -c -CSL xml-rpc.h`), `xml-rpc.c`, `json.c`, and `stdsoap2.c`. For client and server examples, please see the gSOAP package content in `gsoap/samples/xml-rpc-json`: - `json-currentTime.c` JSON REST C client - `json-currentTimeServer.c` JSON REST C server (CGI and multi-threaded stand-alone) The presentation in this section concerned stand-alone JSON REST services. To combine SOAP/XML with JSON REST services, see \ref soap for details. C JSON-RPC clients and servers {#c-rpc} ------------------------------ The [JSON-RPC 1.0 specification](http://json-rpc.org/wiki/specification) (the "original version") adds `method`, `parameter` and `id` fields to the request message:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ { "method": "echo", "params": [ "Hello World!" ], "id": 1 } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
where: - `method` is a string with the name of the method to be invoked. - `params` is an array of objects to be passed as parameters to the defined method. - `id` is a value of any type, which is used to match the response with the request that it is replying to. A response message has a `result` field, an `error` field, and an `id`:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ { "result": "Welcome!", "error": null, "id": 1 } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
where: - `result` is the data returned by the invoked method. If an error occurred while invoking the method, this value must be null. - `error` is a specified error code if there was an error invoking the method, otherwise null. - `id` is the id of the request it is responding to. The [JSON-RPC 2.0 specification](http://www.jsonrpc.org/specification) makes all 1.0 fields REQUIRED, except for `error` which MUST NOT be present if there was no error triggered during invocation. The 2.0 specification adds a `jsonrpc` field in the request message:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ { "jsonrpc": 2.0, "method": "echo", "params": [ "Hello World!" ], "id": 1 } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
and also adds the `jsonrpc` field to the response message:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ { "jsonrpc": 2.0, "result": "Welcome!", "id": 1 } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The C operations are straightforward to conform to the JSON-RPC 1.0 or 2.0 specifications. The example JSON-RPC 2.0 request message shown above is created by the following code that uses `json_call()` to invoke a JSON-RPC service: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} const char *endpoint = "http://..."; struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); struct value *req = new_value(ctx); struct value *res = new_value(ctx); struct value *args; *double_of(value_at(req, "jsonrpc")) = 2.0; *string_of(value_at(req, "method")) = "echo"; args = value_at(ref, "params"); *string_of(nth_value(args, 0)) = "Hello World!"; *int_of(value_at(req, "id")) = 1; if (json_call(ctx, endpoint, req, res)) // JSON-RPC call soap_printf_fault(ctx, stderr); else if (nth_at(res, "error") >= 0) // JSON-RPC error? json_write(ctx, value_at(res, "error")); else if ((int)res["id"] != 1) // matching id field? printf("response id != request id\n"); else // all OK! json_write(ctx, value_at(res, "result")); // display result ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For HTTPS use an https endpoint URL. You can control the HTTPS context as explained in the [tutorials.](http://www.genivia.com/tutorials.html) The server-side creates response messages similar to the example shown above. To implement a C JSON-RPC and JSON REST server, please see the example `json-currentTimeServer.c` located in `gsoap/samples/xml-rpc-json` in the gSOAP package. Embedding and serializing raw JSON data as a JSON value in C {#c-raw} ------------------------------------------------------------ A JSON value represented by a `value` may contain raw JSON data as a string to serialize literally in the output. Deserializing JSON into a JSON `value` never populates this string, so this feature is to augment JSON output with embedded raw JSON data only. To add raw JSON data create a `_rawdata` structure and assign it to a `value`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "json.h" struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); struct value *v = new_value(ctx); /* create a blob of raw data */ struct _rawdata *blob = rawdata_of(v); const char *data = "[ true, 123, { \"key\": 456 } ]"; blob->__ptr = (void*)data; blob->__size = strlen(data); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The `_rawdata blob` can be assigned anywhere where a `value` is expected, i.e. as an item of an array or as a value property of a JSON object. To check that a `value` contains a `_rawdata` value and to retrieve it as raw data: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "json.h" struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); struct value *v = new_value(ctx); ... if (is_rawdata(v)) { struct _rawdata *blob = rawdata_of(v); char *data = (char*)blob.__ptr; size_t size = blob.__size; ... } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Miscellaneous {#misc} ============= Compiling XML-RPC/JSON together with gSOAP SOAP services and XML {#json-cc} ---------------------------------------------------------------- To use JSON (and XML-RPC) with other gSOAP XML data binding code requires a few simple steps to ensure that your project compiles cleanly. For C++, arguably the best option is to \ref json-ns. We present three methods that you can follow. These methods follow different strategies to compile a combined set of files with JSON (and XML-RPC) types and operations with other files with XML data binding types and operations: ### Method 1: #import "xml-rpc.h" Before processing a gSOAP XML data binding header file with soapcpp2, add `#import "xml-rpc.h"` to this header file to include XML-RPC and JSON data types. Then compile the generated files as usual together with `jcon.c` (or `json.cpp` for C++) and `xml-rpc.c` (or `xml-rpc.cpp` for C++). Also `#include "json.h"` in your code to use the JSON API. This is the simplest method. When using wsdl2h, you can automate this method by adding the following three lines to `typemap.dat`: [ #import "xml-rpc.h" ] This automatically imports the JSON/XML-RPC types and operations into the XML data binding code. You will still need to compile your code together with `jcon.c` (or `json.cpp` for C++) and `xml-rpc.c` (or `xml-rpc.cpp` for C++). ### Method 2: soapcpp2 -qjson (works with C++ only) Use soapcpp2 option `-qjson` to generate and compile the JSON (and XML-RPC) API code to combine with your other XML data binding code generated with soapcpp2: soapcpp2 -qjson -CSL xml-rpc.h This generates `jsonStub.h`, `jsonH.h`, and `jsonC.cpp`. Compile the files `jsonC.cpp`, `xml-rpc.cpp`, and `json.cpp` with option `-DJSON_NAMESPACE` and your other source code files, such as those generated by soapcpp2 for your other .h file: c++ -DJSON_NAMESPACE json.cpp jsonC.cpp xml-rpc.cpp ... Make sure to use `#include "json.h"` in your code. The JSON C++ API is in the `json` C++ namespace. See also \ref json-ns. ### Method 3: soapcpp2 -pjson Use soapcpp2 option `-pjson` to generate and compile the JSON (and XML-RPC) API code to combine with your other XML data binding code generated with soapcpp2: soapcpp2 -c -pjson -CSL xml-rpc.h This generates `jsonStub.h`, `jsonH.h`, and `jsonC.c`. Compile the files `jsonC.c`, `xml-rpc.c`, and `json.c` with option `-DJSON_NAMESPACE` and your other source code files, such as `soapClientLib.c` generated by soapcpp2 with option `-C` for your other .h file: cc -DJSON_NAMESPACE json.c jsonC.c xml-rpc.c soapClientLib.c stdsoap2.c ... or the `soapServerLib.c` file generated by soapcpp2 with option `-S`: cc -DJSON_NAMESPACE json.c jsonC.c xml-rpc.c soapServerLib.c stdsoap2.c ... Make sure to use `#include "json.h"` in your code. This method also works in C++, but it is recommended to use the second method for C++ applications. Serving JSON and SOAP requests on the same server port {#soap} ------------------------------------------------------ SOAP requests are served using the usual `soap_serve()` call generated by soapcpp2 given an interface header file with SOAP/XML Web service definitions. We can also serve JSON requests on the same port by using the gSOAP HTTP POST plugin. This plugin serves non-SOAP requests when `soap_serve()` is called by capturing the HTTP content type of the request and also handles PUT, PATCH and DELETE requests. The httpget plugin is located in `gsoap/plugin/httppost.h` and `gsoap/plugin/httppost.c`. The plugin captures POST requests that have a content type matching a content type entry specified in a table of POST, PUT, PATCH and DELETE handlers. Each entry in this table specifies a content type of a POST request with the function to invoke that will handle it. We can also specify generic POST, PUT, PATCH and DELETE request handlers in this table: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} struct http_post_handlers my_handlers[] = { { "application/json", json_handler }, { "application/json;*", json_handler }, { "POST", generic_POST_handler }, { "PUT", generic_PUT_handler }, { "PATCH", generic_PATCH_handler }, { "DELETE", generic_DELETE_handler }, { NULL } }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Note that `*` can be used as a wildcard, in this case we use `*` to also capture `"application/json; charset=utf-8"` content type variations. To register the plugin: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} #include "plugin/httppost.h" struct soap *ctx = soap_new(); soap_register_plugin_arg(ctx, http_post, my_handlers); ... soap_serve(ctx); // serve SOAP and other POST/PUT/PATCH/DELETE requests ... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The handlers in the example `my_handlers` table given above are used by the plugin to dispatch the request. If a non-SOAP or non-POST request is made, the handler in the table that matches the HTTP content type of the request is invoked. Also generic POST, PUT, PATCH and DELETE handlers can be optionally specified. A handler in the `my_handlers` table is a function that takes the context and returns `SOAP_OK` or an error code. Here is an example `json_handler` in C: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} int json_handler(struct soap *ctx) { struct value *request = new_value(ctx); struct value *response = new_value(ctx); if (json_recv(ctx, request) || soap_end_recv(ctx)) return json_send_fault(ctx); // return a JSON-formatted fault ... // use the 'request' value ... // set the 'response' value // set http content type ctx->http_content = "application/json; charset=utf-8"; // send http header 200 OK and JSON response if (soap_response(ctx, SOAP_FILE) || json_send(ctx, response) || soap_end_send(ctx)) soap_closesock(ctx); return SOAP_OK; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Note that we use `json_send_fault()` instead of `soap_send_fault()` when an internal error occurred, since we want the error to be reported in JSON format as per Google JSON Style Guide. For application-specific errors, we use `json_send_error()` as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} if (some application error occurred) json_send_error(ctx, 400, "Error message", "Error details"); else ... // send the response ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can specify an HTTP error code such as 400 in this case, which means that a HTTP 400 Bad Request is returned to the client. The `json_send_error()` function is a convenient shortcut to return an error message with an HTTP error code. To return a JSON response with a HTTP error code use the following: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} int status = 400; // HTTP 400 Bad Request soap->http_content = "application/json; charset=utf-8"; if (soap_response(soap, SOAP_FILE + status) || json_send(soap, v) || soap_end_send(soap)) soap_closesock(soap); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A `generic_POST_handler` should be similar to the above. The HTTP content type of the request is stored in the `http_content` string variable of the context. A `generic_PUT_handler` and `generic_PATCH_handler` should not return a response message but should call `soap_send_empty_response()` instead. Likewise, these handlers should return a HTTP status code instead of calling `json_send_error()` since the HTTP body should be empty: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} int generic_PUT_handler(struct soap *ctx) { struct value *request = new_value(ctx); if (!ctx->http_content || soap_tag_cmp(ctx->http_content, "application/json*")) { return 400; // HTTP Bad Request } if (json_recv(ctx, request) || soap_end_recv(ctx)) return 400; // HTTP Bad Request ... // use the 'request' value // send http header 200 OK and empty http body return soap_send_empty_response(ctx); } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The `soap_tag_cmp()` function is similar to `strcmp()` but it is case insensitive and supports `*` (any number of characters) and `-` (any single character) wildcards. To compile your server application that serves JSON and SOAP requests, see \ref json-cc. Floating point format {#fp} --------------------- The floating point format used to output values in XML-RPC and JSON is by default ".17lG' to ensure accuracy up to the last digit. The format can be set as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); ctx->double_format = "%lG"; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON and base64 {#base64} --------------- JSON has no binary type to transmit binary data. Sending binary data in JSON strings as text is not recommended, due to NULs and problems with Unicode/UTF-8 sequences. Base64 is a common encoding format for binary data. A JSON string with base64 content is our recommended option. To populate JSON data with base64-encoded binary content, you can simply create and assign a `_base64` value as described earlier (e.g. by casting a `_base64` structure to a value in C++). Receiving base64-encoded content with JSON is not possible, because the necessary type information is lost in transit. The base64 content will arrive at the receiver simply as a string with base64 content. You can explicitly decode the base64 string back to binary as shown here for C++: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} if (v.is_string()) { /* assuming base64 content in string value v, decoded it */ int len; unsigned char *ptr = (unsigned char*)soap_base642s(ctx, (const char*)v, NULL, 0, &len); /* ptr points to binary of length len or is NULL when decoding failed */ if (ptr) ... // success ctx->error = SOAP_OK; // fail and reset error ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ And for C: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} if (is_string(v)) { /* assuming base64 content in string value v, decoded it */ int len; unsigned char *ptr = (unsigned char*)soap_base642s(ctx, *string_of(v), NULL, 0, &len); /* ptr points to binary of length len or is NULL when decoding failed */ if (ptr) ... // success ctx->error = SOAP_OK; // fail and reset error ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON and ISO 8601 dateTime {#dateTime} -------------------------- To populate JSON data with ISO 8601 date time content, you can simply assign a `ULONG64` value cast from a `time_t` value as described earlier. Receiving ISO 8601 date time content with JSON is not possible, because the necessary type information is lost in transit. The content will arrive at the receiver simply as a string with a date and time. You can explicitly convert a string with an ISO 8601 date time to a `time_t` value as shown here for C++: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} if (v.is_string()) { time_t tm; if (soap_s2dateTime(ctx, (const char*)v, &tm) == SOAP_OK) ... // success ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ And for C: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} if (is_string(v)) { time_t tm; if (soap_s2dateTime(ctx, *string_of(v), &tm) == SOAP_OK) ... // success ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The disable UTC time zone `Z` in the dateTime string, use `-DWITH_NOZONE` to compile `stdsoap2.c` (for C) or `stdsoap2.cpp` (for C++). Potential issues {#issues} ---------------- The JSON parser follows the published JSON "standards" but is a bit more forgiving, meaning that it parses the following extensions: - The parser admits floating point values that are formatted as C floating point values in addition to JSON formats for numbers (which are more restrictive). - The parser admits `NaN`, `+Inf`, `-Inf` as floating point values. - The parser admits hexadecimal integer values of the form `0xHHHH`. - Any additional trailing content after a valid JSON object or array is silently ignored. - To parse JSON data from files or from any other non-HTTP source use the `SOAP_ENC_PLAIN` flag to initialize the context, otherwise files containing just the JSON values `true`, `false`, and `null` are not parsed. Copyright {#copyright} ========= Copyright (c) 2017, Robert van Engelen, Genivia Inc. All rights reserved. gsoap-2.8.91/gsoap/samples/xml-rpc-json/json-GitHub.c0000644000175000017500000000523413525245163021701 0ustar ellertellert/* json-GitHub.c JSON GitHub API v3 (gSOAP C version) https://developer.github.com/v3/ Compile: soapcpp2 -c -CSL xml-rpc.h cc -DWITH_OPENSSL -DWITH_GZIP -o json-GitHub json-GitHub.c xml-rpc.c json.c stdsoap2.c soapC.c -lcrypto -lssl -lz Usage: ./json-GutHub URL [username password] Example: ./json-GitHub https://api.github.com/orgs/Genivia/repos -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "json.h" int main(int argc, char **argv) { if (argc < 2) { fprintf(stderr, "Usage: json-GitHub URL [username password]\nFor example: json-GitHub https://api.github.com/orgs/Genivia/repos\n\n"); exit(1); } else { struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); struct value response; if (argc > 3) { /* Basic authentication with username password */ if (strncmp(argv[1], "https", 5)) { fprintf(stderr, "Basic authentication over http is not secure: use https\n"); exit(1); } ctx->userid = argv[2]; ctx->passwd = argv[3]; } if (json_call(ctx, argv[1], NULL, &response)) soap_print_fault(ctx, stderr); else json_write(ctx, &response); printf("\n\nOK\n"); soap_end(ctx); soap_free(ctx); } return 0; } /* Don't need a namespace table. We put an empty one here to avoid link errors */ struct Namespace namespaces[] = { {NULL, NULL} }; gsoap-2.8.91/gsoap/samples/xml-rpc-json/json-currentTime.c0000644000175000017500000000504713525245163023022 0ustar ellertellert/* json-currentTime.c JSON currenTime (C version) Prints current time. Compile: soapcpp2 -c -CSL xml-rpc.h cc json-currentTime.c xml-rpc.c json.c stdsoap2.c soapC.c -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2012, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "json.h" int main() { struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); struct value *request = new_value(ctx); struct value response; ctx->send_timeout = 5; /* 5 sec max socket send idle time */ ctx->recv_timeout = 5; /* 5 sec max socket recv idle time */ ctx->transfer_timeout = 30; /* 30 sec message transfer timeout */ /* make the JSON REST POST request and get response */ *string_of(request) = "getCurrentTime"; if (json_call(ctx, "http://www.cs.fsu.edu/~engelen/currentTimeJSON.cgi", request, &response)) soap_print_fault(ctx, stderr); else if (is_string(&response)) /* JSON does not support a dateTime value: this is a string */ printf("Time = %s\n", *string_of(&response)); else /* error? */ { printf("Error: "); json_write(ctx, &response); } /* clean up */ soap_destroy(ctx); soap_end(ctx); soap_free(ctx); return 0; } /* Don't need a namespace table. We put an empty one here to avoid link errors */ struct Namespace namespaces[] = { {NULL, NULL} }; gsoap-2.8.91/gsoap/samples/xml-rpc-json/xml-rpc-io.h0000644000175000017500000000332513525245163021543 0ustar ellertellert/* xml-rpc-io.h XML-RPC io stream operations on XML-RPC values -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifdef JSON_NAMESPACE namespace json { #endif /// print a value in XML-RPC format extern std::ostream& operator<<(std::ostream&, const struct value&); /// parse a value from XML stream extern std::istream& operator>>(std::istream&, struct value&); #ifdef JSON_NAMESPACE } // namespace json #endif gsoap-2.8.91/gsoap/samples/xml-rpc-json/.deps/0000755000175000017500000000000013525245203020404 5ustar ellertellertgsoap-2.8.91/gsoap/samples/xml-rpc-json/Makefile.in0000644000175000017500000012312013525245163021444 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = jsoncpp$(EXEEXT) json-GitHub$(EXEEXT) \ json-gdm$(EXEEXT) json-currentTime$(EXEEXT) \ json-currentTimeServer$(EXEEXT) xml-rpc-currentTime$(EXEEXT) subdir = gsoap/samples/xml-rpc-json ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = json_GitHub-soapC.$(OBJEXT) am_json_GitHub_OBJECTS = json_GitHub-json-GitHub.$(OBJEXT) \ json_GitHub-xml-rpc.$(OBJEXT) json_GitHub-json.$(OBJEXT) \ $(am__objects_1) $(am__objects_2) json_GitHub_OBJECTS = $(am_json_GitHub_OBJECTS) am__DEPENDENCIES_1 = json_GitHub_DEPENDENCIES = $(SOAP_CPP_LIB_SSL) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am__objects_3 = soapC.$(OBJEXT) am_json_currentTime_OBJECTS = json-currentTime.$(OBJEXT) \ xml-rpc.$(OBJEXT) json.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) json_currentTime_OBJECTS = $(am_json_currentTime_OBJECTS) json_currentTime_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) am_json_currentTimeServer_OBJECTS = json-currentTimeServer.$(OBJEXT) \ xml-rpc.$(OBJEXT) json.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) json_currentTimeServer_OBJECTS = $(am_json_currentTimeServer_OBJECTS) json_currentTimeServer_DEPENDENCIES = $(SOAP_CPP_LIB) \ $(am__DEPENDENCIES_1) am__objects_4 = json_gdm-soapC.$(OBJEXT) am_json_gdm_OBJECTS = json_gdm-json-GoogleDistanceMatrix.$(OBJEXT) \ json_gdm-xml-rpc.$(OBJEXT) json_gdm-json.$(OBJEXT) \ $(am__objects_1) $(am__objects_4) json_gdm_OBJECTS = $(am_json_gdm_OBJECTS) json_gdm_DEPENDENCIES = $(SOAP_CPP_LIB_SSL) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_jsoncpp_OBJECTS = jsoncpp.$(OBJEXT) xml-rpc.$(OBJEXT) \ json.$(OBJEXT) $(am__objects_1) $(am__objects_3) jsoncpp_OBJECTS = $(am_jsoncpp_OBJECTS) jsoncpp_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) am_xml_rpc_currentTime_OBJECTS = xml-rpc-currentTime.$(OBJEXT) \ xml-rpc.$(OBJEXT) json.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) xml_rpc_currentTime_OBJECTS = $(am_xml_rpc_currentTime_OBJECTS) xml_rpc_currentTime_DEPENDENCIES = $(SOAP_CPP_LIB) \ $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/json-currentTime.Po \ ./$(DEPDIR)/json-currentTimeServer.Po ./$(DEPDIR)/json.Po \ ./$(DEPDIR)/json_GitHub-json-GitHub.Po \ ./$(DEPDIR)/json_GitHub-json.Po \ ./$(DEPDIR)/json_GitHub-soapC.Po \ ./$(DEPDIR)/json_GitHub-xml-rpc.Po \ ./$(DEPDIR)/json_gdm-json-GoogleDistanceMatrix.Po \ ./$(DEPDIR)/json_gdm-json.Po ./$(DEPDIR)/json_gdm-soapC.Po \ ./$(DEPDIR)/json_gdm-xml-rpc.Po ./$(DEPDIR)/jsoncpp.Po \ ./$(DEPDIR)/soapC.Po ./$(DEPDIR)/xml-rpc-currentTime.Po \ ./$(DEPDIR)/xml-rpc.Po am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(json_GitHub_SOURCES) $(json_currentTime_SOURCES) \ $(json_currentTimeServer_SOURCES) $(json_gdm_SOURCES) \ $(jsoncpp_SOURCES) $(xml_rpc_currentTime_SOURCES) DIST_SOURCES = $(json_GitHub_SOURCES) $(json_currentTime_SOURCES) \ $(json_currentTimeServer_SOURCES) $(json_gdm_SOURCES) \ $(jsoncpp_SOURCES) $(xml_rpc_currentTime_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.cpp_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = xml-rpc.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = $(SOAP_NS_DEF) jsoncpp_SOURCES = jsoncpp.cpp xml-rpc.cpp json.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) jsoncpp_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) json_GitHub_CPPFLAGS = -DWITH_OPENSSL -DWITH_GZIP json_GitHub_SOURCES = json-GitHub.cpp xml-rpc.cpp json.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) json_GitHub_LDADD = $(SOAP_CPP_LIB_SSL) $(SAMPLE_EXTRA_LIBS) $(SAMPLE_SSL_LIBS) json_gdm_CPPFLAGS = -DWITH_OPENSSL -DWITH_GZIP json_gdm_SOURCES = json-GoogleDistanceMatrix.cpp xml-rpc.cpp json.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) json_gdm_LDADD = $(SOAP_CPP_LIB_SSL) $(SAMPLE_EXTRA_LIBS) $(SAMPLE_SSL_LIBS) json_currentTime_SOURCES = json-currentTime.cpp xml-rpc.cpp json.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) json_currentTime_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) json_currentTimeServer_SOURCES = json-currentTimeServer.cpp xml-rpc.cpp json.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) json_currentTimeServer_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread xml_rpc_currentTime_SOURCES = xml-rpc-currentTime.cpp xml-rpc.cpp json.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) xml_rpc_currentTime_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/xml-rpc-json/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/xml-rpc-json/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) json-GitHub$(EXEEXT): $(json_GitHub_OBJECTS) $(json_GitHub_DEPENDENCIES) $(EXTRA_json_GitHub_DEPENDENCIES) @rm -f json-GitHub$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(json_GitHub_OBJECTS) $(json_GitHub_LDADD) $(LIBS) json-currentTime$(EXEEXT): $(json_currentTime_OBJECTS) $(json_currentTime_DEPENDENCIES) $(EXTRA_json_currentTime_DEPENDENCIES) @rm -f json-currentTime$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(json_currentTime_OBJECTS) $(json_currentTime_LDADD) $(LIBS) json-currentTimeServer$(EXEEXT): $(json_currentTimeServer_OBJECTS) $(json_currentTimeServer_DEPENDENCIES) $(EXTRA_json_currentTimeServer_DEPENDENCIES) @rm -f json-currentTimeServer$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(json_currentTimeServer_OBJECTS) $(json_currentTimeServer_LDADD) $(LIBS) json-gdm$(EXEEXT): $(json_gdm_OBJECTS) $(json_gdm_DEPENDENCIES) $(EXTRA_json_gdm_DEPENDENCIES) @rm -f json-gdm$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(json_gdm_OBJECTS) $(json_gdm_LDADD) $(LIBS) jsoncpp$(EXEEXT): $(jsoncpp_OBJECTS) $(jsoncpp_DEPENDENCIES) $(EXTRA_jsoncpp_DEPENDENCIES) @rm -f jsoncpp$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(jsoncpp_OBJECTS) $(jsoncpp_LDADD) $(LIBS) xml-rpc-currentTime$(EXEEXT): $(xml_rpc_currentTime_OBJECTS) $(xml_rpc_currentTime_DEPENDENCIES) $(EXTRA_xml_rpc_currentTime_DEPENDENCIES) @rm -f xml-rpc-currentTime$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(xml_rpc_currentTime_OBJECTS) $(xml_rpc_currentTime_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json-currentTime.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json-currentTimeServer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_GitHub-json-GitHub.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_GitHub-json.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_GitHub-soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_GitHub-xml-rpc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_gdm-json-GoogleDistanceMatrix.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_gdm-json.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_gdm-soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json_gdm-xml-rpc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jsoncpp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml-rpc-currentTime.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml-rpc.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` json_GitHub-json-GitHub.o: json-GitHub.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_GitHub-json-GitHub.o -MD -MP -MF $(DEPDIR)/json_GitHub-json-GitHub.Tpo -c -o json_GitHub-json-GitHub.o `test -f 'json-GitHub.cpp' || echo '$(srcdir)/'`json-GitHub.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_GitHub-json-GitHub.Tpo $(DEPDIR)/json_GitHub-json-GitHub.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json-GitHub.cpp' object='json_GitHub-json-GitHub.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_GitHub-json-GitHub.o `test -f 'json-GitHub.cpp' || echo '$(srcdir)/'`json-GitHub.cpp json_GitHub-json-GitHub.obj: json-GitHub.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_GitHub-json-GitHub.obj -MD -MP -MF $(DEPDIR)/json_GitHub-json-GitHub.Tpo -c -o json_GitHub-json-GitHub.obj `if test -f 'json-GitHub.cpp'; then $(CYGPATH_W) 'json-GitHub.cpp'; else $(CYGPATH_W) '$(srcdir)/json-GitHub.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_GitHub-json-GitHub.Tpo $(DEPDIR)/json_GitHub-json-GitHub.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json-GitHub.cpp' object='json_GitHub-json-GitHub.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_GitHub-json-GitHub.obj `if test -f 'json-GitHub.cpp'; then $(CYGPATH_W) 'json-GitHub.cpp'; else $(CYGPATH_W) '$(srcdir)/json-GitHub.cpp'; fi` json_GitHub-xml-rpc.o: xml-rpc.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_GitHub-xml-rpc.o -MD -MP -MF $(DEPDIR)/json_GitHub-xml-rpc.Tpo -c -o json_GitHub-xml-rpc.o `test -f 'xml-rpc.cpp' || echo '$(srcdir)/'`xml-rpc.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_GitHub-xml-rpc.Tpo $(DEPDIR)/json_GitHub-xml-rpc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml-rpc.cpp' object='json_GitHub-xml-rpc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_GitHub-xml-rpc.o `test -f 'xml-rpc.cpp' || echo '$(srcdir)/'`xml-rpc.cpp json_GitHub-xml-rpc.obj: xml-rpc.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_GitHub-xml-rpc.obj -MD -MP -MF $(DEPDIR)/json_GitHub-xml-rpc.Tpo -c -o json_GitHub-xml-rpc.obj `if test -f 'xml-rpc.cpp'; then $(CYGPATH_W) 'xml-rpc.cpp'; else $(CYGPATH_W) '$(srcdir)/xml-rpc.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_GitHub-xml-rpc.Tpo $(DEPDIR)/json_GitHub-xml-rpc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml-rpc.cpp' object='json_GitHub-xml-rpc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_GitHub-xml-rpc.obj `if test -f 'xml-rpc.cpp'; then $(CYGPATH_W) 'xml-rpc.cpp'; else $(CYGPATH_W) '$(srcdir)/xml-rpc.cpp'; fi` json_GitHub-json.o: json.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_GitHub-json.o -MD -MP -MF $(DEPDIR)/json_GitHub-json.Tpo -c -o json_GitHub-json.o `test -f 'json.cpp' || echo '$(srcdir)/'`json.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_GitHub-json.Tpo $(DEPDIR)/json_GitHub-json.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json.cpp' object='json_GitHub-json.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_GitHub-json.o `test -f 'json.cpp' || echo '$(srcdir)/'`json.cpp json_GitHub-json.obj: json.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_GitHub-json.obj -MD -MP -MF $(DEPDIR)/json_GitHub-json.Tpo -c -o json_GitHub-json.obj `if test -f 'json.cpp'; then $(CYGPATH_W) 'json.cpp'; else $(CYGPATH_W) '$(srcdir)/json.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_GitHub-json.Tpo $(DEPDIR)/json_GitHub-json.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json.cpp' object='json_GitHub-json.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_GitHub-json.obj `if test -f 'json.cpp'; then $(CYGPATH_W) 'json.cpp'; else $(CYGPATH_W) '$(srcdir)/json.cpp'; fi` json_GitHub-soapC.o: soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_GitHub-soapC.o -MD -MP -MF $(DEPDIR)/json_GitHub-soapC.Tpo -c -o json_GitHub-soapC.o `test -f 'soapC.cpp' || echo '$(srcdir)/'`soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_GitHub-soapC.Tpo $(DEPDIR)/json_GitHub-soapC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapC.cpp' object='json_GitHub-soapC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_GitHub-soapC.o `test -f 'soapC.cpp' || echo '$(srcdir)/'`soapC.cpp json_GitHub-soapC.obj: soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_GitHub-soapC.obj -MD -MP -MF $(DEPDIR)/json_GitHub-soapC.Tpo -c -o json_GitHub-soapC.obj `if test -f 'soapC.cpp'; then $(CYGPATH_W) 'soapC.cpp'; else $(CYGPATH_W) '$(srcdir)/soapC.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_GitHub-soapC.Tpo $(DEPDIR)/json_GitHub-soapC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapC.cpp' object='json_GitHub-soapC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_GitHub_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_GitHub-soapC.obj `if test -f 'soapC.cpp'; then $(CYGPATH_W) 'soapC.cpp'; else $(CYGPATH_W) '$(srcdir)/soapC.cpp'; fi` json_gdm-json-GoogleDistanceMatrix.o: json-GoogleDistanceMatrix.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_gdm_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_gdm-json-GoogleDistanceMatrix.o -MD -MP -MF $(DEPDIR)/json_gdm-json-GoogleDistanceMatrix.Tpo -c -o json_gdm-json-GoogleDistanceMatrix.o `test -f 'json-GoogleDistanceMatrix.cpp' || echo '$(srcdir)/'`json-GoogleDistanceMatrix.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_gdm-json-GoogleDistanceMatrix.Tpo $(DEPDIR)/json_gdm-json-GoogleDistanceMatrix.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json-GoogleDistanceMatrix.cpp' object='json_gdm-json-GoogleDistanceMatrix.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_gdm_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_gdm-json-GoogleDistanceMatrix.o `test -f 'json-GoogleDistanceMatrix.cpp' || echo '$(srcdir)/'`json-GoogleDistanceMatrix.cpp json_gdm-json-GoogleDistanceMatrix.obj: json-GoogleDistanceMatrix.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_gdm_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_gdm-json-GoogleDistanceMatrix.obj -MD -MP -MF $(DEPDIR)/json_gdm-json-GoogleDistanceMatrix.Tpo -c -o json_gdm-json-GoogleDistanceMatrix.obj `if test -f 'json-GoogleDistanceMatrix.cpp'; then $(CYGPATH_W) 'json-GoogleDistanceMatrix.cpp'; else $(CYGPATH_W) '$(srcdir)/json-GoogleDistanceMatrix.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_gdm-json-GoogleDistanceMatrix.Tpo $(DEPDIR)/json_gdm-json-GoogleDistanceMatrix.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json-GoogleDistanceMatrix.cpp' object='json_gdm-json-GoogleDistanceMatrix.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_gdm_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_gdm-json-GoogleDistanceMatrix.obj `if test -f 'json-GoogleDistanceMatrix.cpp'; then $(CYGPATH_W) 'json-GoogleDistanceMatrix.cpp'; else $(CYGPATH_W) '$(srcdir)/json-GoogleDistanceMatrix.cpp'; fi` json_gdm-xml-rpc.o: xml-rpc.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_gdm_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_gdm-xml-rpc.o -MD -MP -MF $(DEPDIR)/json_gdm-xml-rpc.Tpo -c -o json_gdm-xml-rpc.o `test -f 'xml-rpc.cpp' || echo '$(srcdir)/'`xml-rpc.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_gdm-xml-rpc.Tpo $(DEPDIR)/json_gdm-xml-rpc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml-rpc.cpp' object='json_gdm-xml-rpc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_gdm_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_gdm-xml-rpc.o `test -f 'xml-rpc.cpp' || echo '$(srcdir)/'`xml-rpc.cpp json_gdm-xml-rpc.obj: xml-rpc.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_gdm_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_gdm-xml-rpc.obj -MD -MP -MF $(DEPDIR)/json_gdm-xml-rpc.Tpo -c -o json_gdm-xml-rpc.obj `if test -f 'xml-rpc.cpp'; then $(CYGPATH_W) 'xml-rpc.cpp'; else $(CYGPATH_W) '$(srcdir)/xml-rpc.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_gdm-xml-rpc.Tpo $(DEPDIR)/json_gdm-xml-rpc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xml-rpc.cpp' object='json_gdm-xml-rpc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_gdm_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_gdm-xml-rpc.obj `if test -f 'xml-rpc.cpp'; then $(CYGPATH_W) 'xml-rpc.cpp'; else $(CYGPATH_W) '$(srcdir)/xml-rpc.cpp'; fi` json_gdm-json.o: json.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_gdm_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_gdm-json.o -MD -MP -MF $(DEPDIR)/json_gdm-json.Tpo -c -o json_gdm-json.o `test -f 'json.cpp' || echo '$(srcdir)/'`json.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_gdm-json.Tpo $(DEPDIR)/json_gdm-json.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json.cpp' object='json_gdm-json.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_gdm_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_gdm-json.o `test -f 'json.cpp' || echo '$(srcdir)/'`json.cpp json_gdm-json.obj: json.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_gdm_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_gdm-json.obj -MD -MP -MF $(DEPDIR)/json_gdm-json.Tpo -c -o json_gdm-json.obj `if test -f 'json.cpp'; then $(CYGPATH_W) 'json.cpp'; else $(CYGPATH_W) '$(srcdir)/json.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_gdm-json.Tpo $(DEPDIR)/json_gdm-json.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='json.cpp' object='json_gdm-json.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_gdm_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_gdm-json.obj `if test -f 'json.cpp'; then $(CYGPATH_W) 'json.cpp'; else $(CYGPATH_W) '$(srcdir)/json.cpp'; fi` json_gdm-soapC.o: soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_gdm_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_gdm-soapC.o -MD -MP -MF $(DEPDIR)/json_gdm-soapC.Tpo -c -o json_gdm-soapC.o `test -f 'soapC.cpp' || echo '$(srcdir)/'`soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_gdm-soapC.Tpo $(DEPDIR)/json_gdm-soapC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapC.cpp' object='json_gdm-soapC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_gdm_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_gdm-soapC.o `test -f 'soapC.cpp' || echo '$(srcdir)/'`soapC.cpp json_gdm-soapC.obj: soapC.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_gdm_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT json_gdm-soapC.obj -MD -MP -MF $(DEPDIR)/json_gdm-soapC.Tpo -c -o json_gdm-soapC.obj `if test -f 'soapC.cpp'; then $(CYGPATH_W) 'soapC.cpp'; else $(CYGPATH_W) '$(srcdir)/soapC.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json_gdm-soapC.Tpo $(DEPDIR)/json_gdm-soapC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soapC.cpp' object='json_gdm-soapC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(json_gdm_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o json_gdm-soapC.obj `if test -f 'soapC.cpp'; then $(CYGPATH_W) 'soapC.cpp'; else $(CYGPATH_W) '$(srcdir)/soapC.cpp'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/json-currentTime.Po -rm -f ./$(DEPDIR)/json-currentTimeServer.Po -rm -f ./$(DEPDIR)/json.Po -rm -f ./$(DEPDIR)/json_GitHub-json-GitHub.Po -rm -f ./$(DEPDIR)/json_GitHub-json.Po -rm -f ./$(DEPDIR)/json_GitHub-soapC.Po -rm -f ./$(DEPDIR)/json_GitHub-xml-rpc.Po -rm -f ./$(DEPDIR)/json_gdm-json-GoogleDistanceMatrix.Po -rm -f ./$(DEPDIR)/json_gdm-json.Po -rm -f ./$(DEPDIR)/json_gdm-soapC.Po -rm -f ./$(DEPDIR)/json_gdm-xml-rpc.Po -rm -f ./$(DEPDIR)/jsoncpp.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/xml-rpc-currentTime.Po -rm -f ./$(DEPDIR)/xml-rpc.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/json-currentTime.Po -rm -f ./$(DEPDIR)/json-currentTimeServer.Po -rm -f ./$(DEPDIR)/json.Po -rm -f ./$(DEPDIR)/json_GitHub-json-GitHub.Po -rm -f ./$(DEPDIR)/json_GitHub-json.Po -rm -f ./$(DEPDIR)/json_GitHub-soapC.Po -rm -f ./$(DEPDIR)/json_GitHub-xml-rpc.Po -rm -f ./$(DEPDIR)/json_gdm-json-GoogleDistanceMatrix.Po -rm -f ./$(DEPDIR)/json_gdm-json.Po -rm -f ./$(DEPDIR)/json_gdm-soapC.Po -rm -f ./$(DEPDIR)/json_gdm-xml-rpc.Po -rm -f ./$(DEPDIR)/jsoncpp.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/xml-rpc-currentTime.Po -rm -f ./$(DEPDIR)/xml-rpc.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/xml-rpc-json/json.cpp0000644000175000017500000007161213525245163021064 0ustar ellertellert/* json.c[pp] JSON C/C++ API For more information please visit: http://www.genivia.com/doc/xml-rpc-json/html/ -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "json.h" #ifdef JSON_NAMESPACE #ifdef __cplusplus # define SOAP_TYPE__boolean SOAP_TYPE_json__boolean # define SOAP_TYPE__i4 SOAP_TYPE_json__i4 # define SOAP_TYPE__int SOAP_TYPE_json__int # define SOAP_TYPE__double SOAP_TYPE_json__double # define SOAP_TYPE__dateTime_DOTiso8601 SOAP_TYPE_json__dateTime_DOTiso8601 # define SOAP_TYPE__string SOAP_TYPE_json__string # define SOAP_TYPE__array SOAP_TYPE_json__array # define SOAP_TYPE__struct SOAP_TYPE_json__struct # define SOAP_TYPE__base64 SOAP_TYPE_json__base64 # define SOAP_TYPE__rawdata SOAP_TYPE_json__rawdata #endif #endif #ifdef JSON_NAMESPACE #ifdef __cplusplus namespace json { #endif #endif /******************************************************************************\ * * JSON error * \******************************************************************************/ int json_error(struct soap *soap, struct value *v) { if (soap->error && v) { const char *s, *t; soap_set_fault(soap); s = soap_fault_string(soap); t = soap_fault_detail(soap); /* set JSON error property (Google JSON Style Guide) */ #ifdef __cplusplus (*v)["error"]["code"] = soap->error; if (s) { (*v)["error"]["message"] = s; if (t) (*v)["error"]["errors"][0]["message"] = t; } #else *int_of(value_at(value_at(v, "error"), "code")) = soap->error; if (s) { *string_of(value_at(value_at(v, "error"), "message")) = soap_strdup(soap, s); if (t) *string_of(value_at(nth_value(value_at(value_at(v, "error"), "errors"), 0), "message")) = soap_strdup(soap, t); } #endif } return soap->error; } int json_send_fault(struct soap *soap) { int status = soap->error; struct value *v; if (status == SOAP_OK || status == SOAP_STOP) return soap_closesock(soap); if (status >= 200 && status < 300) return soap_send_empty_response(soap, status); if (status < 400) status = 500; soap->keep_alive = 0; /* error: close connection by disabling keep-alive */ v = new_value(soap); json_error(soap, v); soap->http_content = "application/json; charset=utf-8"; if (soap_response(soap, SOAP_FILE + status) || json_send(soap, v) || soap_end_send(soap)) return soap_closesock(soap); return soap_closesock(soap); } int json_send_error(struct soap *soap, int status, const char *message, const char *details) { struct value *v = new_value(soap); if (status < 200 || status > 599) status = 0; /* set JSON error property (Google JSON Style Guide) */ #ifdef __cplusplus (*v)["error"]["code"] = status; if (message) (*v)["error"]["message"] = message; if (details) (*v)["error"]["errors"][0]["message"] = details; #else *int_of(value_at(value_at(v, "error"), "code")) = status; if (message) *string_of(value_at(value_at(v, "error"), "message")) = soap_strdup(soap, message); if (details) *string_of(value_at(nth_value(value_at(value_at(v, "error"), "errors"), 0), "message")) = soap_strdup(soap, details); #endif soap->http_content = "application/json; charset=utf-8"; if (soap_response(soap, SOAP_FILE + status) || json_send(soap, v) || soap_end_send(soap)) return soap_closesock(soap); return soap_closesock(soap); } /******************************************************************************\ * * JSON output * \******************************************************************************/ int json_write(struct soap *soap, const struct value *v) { if (soap_begin_send(soap) || json_send(soap, v) || soap_end_send(soap)) return soap->error; return SOAP_OK; } /******************************************************************************/ int json_send(struct soap *soap, const struct value *v) { static const char *json_indent_string = ",\n "; int i, n = 1; if (!v) return SOAP_OK; switch (v->__type) { case SOAP_TYPE__array: if ((soap->mode & SOAP_XML_INDENT)) n = 2 * (++soap->level % 40) + 2; if (soap_send_raw(soap, "["/*"]"*/, 1)) return soap->error; if (v->ref) { for (i = 0; i < ((struct _array*)v->ref)->data.__size; i++) { if (soap_send_raw(soap, json_indent_string + (i == 0), n - (i == 0))) return soap->error; if (json_send(soap, &(((struct _array*)v->ref)->data.value)[i])) return soap->error; } } if ((soap->mode & SOAP_XML_INDENT)) { if (i && soap_send_raw(soap, json_indent_string + 1, n - 3)) return soap->error; soap->level--; } return soap_send_raw(soap, /*"["*/"]", 1); case SOAP_TYPE__boolean: if (*(_boolean*)v->ref == 1) return soap_send_raw(soap, "true", 4); return soap_send_raw(soap, "false", 5); case SOAP_TYPE__double: return soap_send(soap, soap_double2s(soap, (double)*(_double*)v->ref)); case SOAP_TYPE__i4: return soap_send(soap, soap_int2s(soap, (int)*(_i4*)v->ref)); case SOAP_TYPE__int: return soap_send(soap, soap_LONG642s(soap, (LONG64)*(_int*)v->ref)); case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: return json_send_string(soap, (const char*)v->ref); case SOAP_TYPE__base64: if (soap_send_raw(soap, "\"", 1)) return soap->error; if (v->ref && soap_putbase64(soap, ((struct _base64*)v->ref)->__ptr, ((struct _base64*)v->ref)->__size)) return soap->error; return soap_send_raw(soap, "\"", 1); case SOAP_TYPE__rawdata: return soap_send_raw(soap, (const char*)(((struct _rawdata*)v->ref)->__ptr), ((struct _rawdata*)v->ref)->__size); case SOAP_TYPE__struct: if ((soap->mode & SOAP_XML_INDENT)) n = 2 * (++soap->level % 40) + 2; if (soap_send_raw(soap, "{"/*"}"*/, 1)) return soap->error; if (v->ref) { for (i = 0; i < ((struct _struct*)v->ref)->__size; i++) { if (soap_send_raw(soap, json_indent_string + (i == 0), n - (i == 0))) return soap->error; if (json_send_string(soap, (((struct _struct*)v->ref)->member)[i].name) || soap_send_raw(soap, ": ", 1 + (n > 1)) || json_send(soap, &(((struct _struct*)v->ref)->member)[i].value)) return soap->error; } } if ((soap->mode & SOAP_XML_INDENT)) { if (i && soap_send_raw(soap, json_indent_string + 1, n - 3)) return soap->error; soap->level--; } return soap_send_raw(soap, /*"{"*/"}", 1); default: if (v->__any) return json_send_string(soap, v->__any); return soap_send_raw(soap, "null", 4); } return SOAP_OK; } /******************************************************************************/ int json_send_string(struct soap *soap, const char *s) { const char *t = s; int c; char buf[8]; if (!s) return soap_send_raw(soap, "\"\"", 2); if (soap_send_raw(soap, "\"", 1)) return soap->error; while ((c = *s++)) { if (c < 0x20 && c > 0) { switch (c) { case '\b': c = 'b'; break; case '\f': c = 'f'; break; case '\n': c = 'n'; break; case '\r': c = 'r'; break; case '\t': c = 't'; break; } if (c > 0x20) { buf[0] = '\\'; buf[1] = c; if (soap_send_raw(soap, t, s - t - 1) || soap_send_raw(soap, buf, 2)) return soap->error; t = s; } else { (SOAP_SNPRINTF(buf, sizeof(buf), 7), "\\u%4x", c); if (soap_send_raw(soap, t, s - t - 1) || soap_send_raw(soap, buf, 6)) return soap->error; t = s; } } else if (c == '"' || c == '\\') { buf[0] = '\\'; buf[1] = c; if (soap_send_raw(soap, t, s - t - 1) || soap_send_raw(soap, buf, 2)) return soap->error; t = s; } else if ((c & 0x80)) { if ((soap->omode & SOAP_ENC_LATIN) && (soap->omode & SOAP_C_UTFSTRING)) /* UTF-8 to ISO 8859-1 */ { if (c < 0xE0 && (c & 0x1F) <= 0x03) buf[0] = ((c & 0x1F) << 6) | (*s++ & 0x3F); else buf[0] = '?'; if (soap_send_raw(soap, t, s - t - 1) || soap_send_raw(soap, buf, 1)) return soap->error; t = s; } else if (!(soap->omode & SOAP_ENC_LATIN) && !(soap->omode & SOAP_C_UTFSTRING)) /* ISO 8859-1 to UTF-8 */ { buf[0] = (char)(0xC0 | ((c >> 6) & 0x1F)); buf[1] = (char)(0x80 | (c & 0x3F)); if (soap_send_raw(soap, t, s - t - 1) || soap_send_raw(soap, buf, 2)) return soap->error; t = s; } } } if (soap_send_raw(soap, t, s - t - 1) || soap_send_raw(soap, "\"", 1)) return soap->error; return SOAP_OK; } /******************************************************************************\ * * JSON input * \******************************************************************************/ int json_read(struct soap *soap, struct value *v) { soap_default_value(soap, v); if (soap_begin_recv(soap) || json_recv(soap, v) || soap_end_recv(soap)) return json_error(soap, v); return SOAP_OK; } /******************************************************************************/ int json_recv(struct soap *soap, struct value *v) { soap_wchar c; if (!v) return SOAP_OK; v->__type = 0; v->ref = NULL; v->__any = NULL; v->soap = soap; while (((c = soap_getchar(soap)) > 0 && c <= 0x20) || c == 0xA0) continue; switch (c) { case EOF: return soap->error = SOAP_EOF; case '{'/*'}'*/: { struct value s; if (++soap->level > soap->maxlevel) return soap->error = SOAP_LEVEL; #ifdef __cplusplus if (!(v->ref = (void*)soap_new__struct(soap))) return soap->error = SOAP_EOM; #else if (!(v->ref = (void*)soap_malloc(soap, sizeof(struct _struct)))) return soap->error = SOAP_EOM; #endif soap_default__struct(soap, (struct _struct*)v->ref); v->__type = SOAP_TYPE__struct; while (((c = soap_getchar(soap)) > 0 && c <= 0x20) || c == 0xA0) continue; if (c == /*'{'*/'}') return SOAP_OK; soap_unget(soap, c); for (;;) { if (json_recv(soap, &s)) return soap->error; if (s.__type != SOAP_TYPE__string) return soap_set_sender_error(soap, "string name expected", (const char*)s.ref, SOAP_SYNTAX_ERROR); while (((c = soap_getchar(soap)) > 0 && c <= 0x20) || c == 0xA0) continue; if (c != ':') return soap_set_sender_error(soap, "':' expected", (const char*)s.ref, SOAP_SYNTAX_ERROR); #ifdef __cplusplus if (json_recv(soap, v->operator[]((const char*)s.ref))) return soap->error; #else if (json_recv(soap, value_at(v, (const char*)s.ref))) return soap->error; #endif while (((c = soap_getchar(soap)) > 0 && c <= 0x20) || c == 0xA0) continue; if (c == /*'{'*/'}') break; if ((int)c == EOF) return soap->error = SOAP_EOF; if (c != ',') return soap_set_sender_error(soap, "closing '}' or comma expected", NULL, SOAP_SYNTAX_ERROR); } soap->level--; return SOAP_OK; } case '['/*']'*/: { int i; if (++soap->level > soap->maxlevel) return soap->error = SOAP_LEVEL; #ifdef __cplusplus if (!(v->ref = (void*)soap_new__array(soap))) return soap->error = SOAP_EOM; #else if (!(v->ref = (void*)soap_malloc(soap, sizeof(struct _array)))) return soap->error = SOAP_EOM; #endif soap_default__array(soap, (struct _array*)v->ref); v->__type = SOAP_TYPE__array; while (((c = soap_getchar(soap)) > 0 && c <= 0x20) || c == 0xA0) continue; if (c == /*'['*/']') return SOAP_OK; soap_unget(soap, c); for (i = 0; i < (int)soap->maxoccurs; i++) { #ifdef __cplusplus if (json_recv(soap, v->operator[](i))) return soap->error; #else if (json_recv(soap, nth_value(v, i))) return soap->error; #endif while (((c = soap_getchar(soap)) > 0 && c <= 0x20) || c == 0xA0) continue; if (c == /*'['*/']') break; if ((int)c == EOF) return soap->error = SOAP_EOF; if (c != ',') return soap_set_sender_error(soap, "closing ']' or comma expected", NULL, SOAP_SYNTAX_ERROR); } --soap->level; return SOAP_OK; } case '"': { long l = 0; soap->labidx = 0; for (;;) { char *s; const char *t = NULL; size_t k; if (soap_append_lab(soap, NULL, 0)) return soap->error = SOAP_EOM; s = soap->labbuf + soap->labidx; k = soap->lablen - soap->labidx; soap->labidx = soap->lablen; while (k--) { if (t) { *s++ = *t++; if (!*t) t = NULL; } else { c = soap_getchar(soap); switch (c) { case EOF: return soap->error = SOAP_EOF; case '"': *s = '\0'; v->__type = SOAP_TYPE__string; if (!(v->ref = soap_strdup(soap, soap->labbuf))) return soap->error = SOAP_EOM; if (soap->maxlength > 0 && l > soap->maxlength) return soap->error = SOAP_LENGTH; return SOAP_OK; case '\\': c = soap_getchar(soap); switch (c) { case EOF: return soap->error = SOAP_EOF; case '"': case '\\': case '/': break; case 'b': c = 8; break; case 'f': c = 12; break; case 'n': c = 10; break; case 'r': c = 13; break; case 't': c = 9; break; case 'u': { char *h; wchar_t wc[2]; int i; /* hex to utf8 conversion */ h = soap->tmpbuf; for (i = 0; i < 4; i++) { if ((c = soap_getchar(soap)) == (int)EOF) return soap->error = SOAP_EOF; h[i] = c; } h[4] = '\0'; wc[0] = (wchar_t)soap_strtol(h, &h, 16); wc[1] = 0; if (h - soap->tmpbuf < 4) return soap->error = SOAP_TYPE; t = soap_wchar2s(soap, wc); c = *t++; if (!*t) t = NULL; break; } default: return soap_set_sender_error(soap, "invalid escape in string", NULL, SOAP_SYNTAX_ERROR); } *s++ = c; l++; break; default: if ((c & 0x80) && (soap->imode & SOAP_ENC_LATIN) && (soap->imode & SOAP_C_UTFSTRING)) /* ISO 8859-1 to utf8 */ { *s++ = (char)(0xC0 | ((c >> 6) & 0x1F)); soap->tmpbuf[0] = (0x80 | (c & 0x3F)); soap->tmpbuf[1] = '\0'; t = soap->tmpbuf; } else if ((c & 0x80) && !(soap->imode & SOAP_ENC_LATIN) && !(soap->imode & SOAP_C_UTFSTRING)) /* utf8 to ISO 8859-1 */ { soap_wchar c1 = soap_getchar(soap); if (c1 == (int)EOF) return soap->error = SOAP_EOF; if (c < 0xE0 && (c & 0x1F) <= 0x03) *s++ = ((c & 0x1F) << 6) | (c1 & 0x3F); else *s++ = '?'; } /* the JSON "standard" does not permit ctrl chars in strings, we silently accept these else if (c < 0x20 && c >= 0) { return soap_set_sender_error(soap, "invalid control character in string", NULL, SOAP_SYNTAX_ERROR); } */ else { *s++ = c; } l++; } } } if (soap->maxlength > 0 && l > soap->maxlength) return soap->error = SOAP_LENGTH; } } default: /* number, true, false, null */ { char *s = soap->tmpbuf; do { *s++ = c; c = soap_getchar(soap); } while (c != (int)EOF && (isalnum((int)c) || (int)c == '.' || (int)c == '+' || (int)c == '-') && s - soap->tmpbuf < (int)sizeof(soap->tmpbuf) - 1); *s = '\0'; soap_unget(soap, c); if (soap->tmpbuf[0] == '-' || isdigit(soap->tmpbuf[0])) { LONG64 n = soap_strtoll(soap->tmpbuf, &s, 10); if (!*s) { v->__type = SOAP_TYPE__int; if (!(v->ref = soap_malloc(soap, sizeof(_int)))) return soap->error = SOAP_EOM; *(_int*)v->ref = n; } else { double x; if (soap_s2double(soap, soap->tmpbuf, &x)) return soap_set_sender_error(soap, "JSON number expected", soap->tmpbuf, SOAP_SYNTAX_ERROR); v->__type = SOAP_TYPE__double; if (!(v->ref = soap_malloc(soap, sizeof(_double)))) return soap->error = SOAP_EOM; *(_double*)v->ref = x; } } else if (!strcmp(soap->tmpbuf, "true")) { v->__type = SOAP_TYPE__boolean; if (!(v->ref = soap_malloc(soap, sizeof(_boolean)))) return soap->error = SOAP_EOM; *(char*)v->ref = 1; } else if (!strcmp(soap->tmpbuf, "false")) { v->__type = SOAP_TYPE__boolean; if (!(v->ref = soap_malloc(soap, sizeof(_boolean)))) return soap->error = SOAP_EOM; *(char*)v->ref = 0; } else if (strcmp(soap->tmpbuf, "null")) { return soap_set_sender_error(soap, "JSON value expected", soap->tmpbuf, SOAP_SYNTAX_ERROR); } return SOAP_OK; } } } /******************************************************************************\ * * JSON REST * \******************************************************************************/ int json_call(struct soap *soap, const char *endpoint, const struct value *in, struct value *out) { if (out) soap_default_value(soap, out); soap->http_content = "application/json; charset=utf-8"; if (soap_begin_count(soap) || ((soap->mode & SOAP_IO_LENGTH) && json_send(soap, in)) || soap_end_count(soap) || soap_connect_command(soap, in && out ? SOAP_POST_FILE : out ? SOAP_GET : in ? SOAP_PUT : SOAP_DEL, endpoint, NULL) || json_send(soap, in) || soap_end_send(soap) || soap_begin_recv(soap) || json_recv(soap, out) || soap_end_recv(soap)) { if (out) json_error(soap, out); else if (soap->error == 200 || soap->error == 201 || soap->error == 202) soap->error = SOAP_OK; } return soap_closesock(soap); } #ifdef __cplusplus /******************************************************************************\ * * JSON C++ API * \******************************************************************************/ int json_write(struct soap *soap, const struct value& v) { return json_write(soap, &v); } int json_send(struct soap *soap, const struct value& v) { return json_send(soap, &v); } int json_read(struct soap *soap, struct value& v) { return json_read(soap, &v); } int json_recv(struct soap *soap, struct value& v) { return json_recv(soap, &v); } int json_call(struct soap *soap, const char *endpoint, const struct value& in, struct value& out) { return json_call(soap, endpoint, &in, &out); } int json_call(struct soap *soap, const char *endpoint, const struct value *in, struct value& out) { return json_call(soap, endpoint, in, &out); } int json_call(struct soap *soap, const char *endpoint, const struct value& in, struct value *out) { return json_call(soap, endpoint, &in, out); } std::ostream& operator<<(std::ostream& o, const struct value& v) { if (v.soap) { std::ostream *os = v.soap->os; v.soap->os = &o; if (json_write(v.soap, v)) o.clear(std::ios::failbit); // writing JSON data failed (must be a stream error) v.soap->os = os; } else { soap *ctx = soap_new(); if (ctx) { ctx->os = &o; if (json_write(ctx, v)) o.clear(std::ios::failbit); // writing JSON data failed (must be a stream error) soap_destroy(ctx); soap_end(ctx); soap_free(ctx); } } return o; } std::istream& operator>>(std::istream& i, struct value& v) { if (!v.soap) v.soap = soap_new(); if (v.soap) { std::istream *is = v.soap->is; v.soap->is = &i; (void)json_read(v.soap, v); v.soap->is = is; } return i; } static int json_promote_type(const value& x, const value& y) { switch (x.__type) { case SOAP_TYPE__array: return x.__type; case SOAP_TYPE__struct: switch (y.__type) { case SOAP_TYPE__array: return y.__type; case SOAP_TYPE__struct: return x.__type; default: return SOAP_TYPE__array; } case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: switch (y.__type) { case SOAP_TYPE__array: case SOAP_TYPE__struct: return y.__type; default: return x.__type; } case SOAP_TYPE__double: switch (y.__type) { case SOAP_TYPE__array: case SOAP_TYPE__struct: case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: return y.__type; default: return x.__type; } case SOAP_TYPE__i4: case SOAP_TYPE__int: switch (y.__type) { case SOAP_TYPE__array: case SOAP_TYPE__struct: case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: case SOAP_TYPE__double: return y.__type; default: return x.__type; } default: return y.__type; } } value json_add(const value& x, const value& y) { switch (json_promote_type(x, y)) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: return value(x.soap, (_int)x + (_int)y); case SOAP_TYPE__double: return value(x.soap, (_double)x + (_double)y); case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: { std::string s = (const char*)x; return value(x.soap, s.append((const char*)y)); } case SOAP_TYPE__struct: { _struct s = x; _struct t = y; _struct st(x.soap); for (_struct::iterator i = s.begin(); i != s.end(); ++i) st[i.name()] = *i; for (_struct::iterator i = t.begin(); i != t.end(); ++i) st[i.name()] = *i; return value(x.soap, st); } case SOAP_TYPE__array: { _array a = x; _array b = y; int n = a.size(); int m = b.size(); _array ab(x.soap); ab.size(n + m); for (int i = 0; i < n; ++i) ab[i] = a[i]; for (int i = 0; i < m; ++i) ab[n + i] = b[i]; return value(x.soap, ab); } default: return value(x.soap); } } value json_sub(const value& x, const value& y) { switch (json_promote_type(x, y)) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: return value(x.soap, (_int)x - (_int)y); case SOAP_TYPE__double: return value(x.soap, (_double)x - (_double)y); default: return value(x.soap); } } value json_mul(const value& x, const value& y) { switch (json_promote_type(x, y)) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: return value(x.soap, (_int)x * (_int)y); case SOAP_TYPE__double: return value(x.soap, (_double)x * (_double)y); default: return value(x.soap); } } value json_div(const value& x, const value& y) { switch (json_promote_type(x, y)) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: return value(x.soap, (_int)x / (_int)y); case SOAP_TYPE__double: return value(x.soap, (_double)x / (_double)y); default: return value(x.soap); } } value json_mod(const value& x, const value& y) { switch (json_promote_type(x, y)) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: case SOAP_TYPE__double: return value(x.soap, (_int)x % (_int)y); default: return value(x.soap); } } bool json_eqv(const value& x, const value& y) { if (x.__type != y.__type && (x.__type != SOAP_TYPE__i4 || y.__type != SOAP_TYPE__int) && (x.__type != SOAP_TYPE__int || y.__type != SOAP_TYPE__i4)) return false; switch (x.__type) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: return (_int)x == (_int)y; case SOAP_TYPE__double: return (_double)x == (_double)y; case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: return !strcmp((const char*)x, (const char*)y); case SOAP_TYPE__struct: if (x.size() != y.size()) return false; else { const _struct& s = x; const _struct& t = y; for (_struct::iterator i = s.begin(); i != s.end(); ++i) { _struct::iterator j; for (j = t.begin(); j != t.end(); ++j) if (!strcmp(i.name(), j.name())) break; if (j == t.end() || *i != *j) return false; } return true; } case SOAP_TYPE__array: if (x.size() != y.size()) return false; else { const _array& a = x; const _array& b = y; _array::iterator i = a.begin(); _array::iterator j = b.begin(); for ( ; i != a.end(); ++i, ++j) if (*i != *j) return false; return true; } default: return false; } } bool json_leq(const value& x, const value& y) { if (x.__type != y.__type && (x.__type != SOAP_TYPE__i4 || y.__type != SOAP_TYPE__int) && (x.__type != SOAP_TYPE__int || y.__type != SOAP_TYPE__i4)) return false; switch (x.__type) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: return (_int)x <= (_int)y; case SOAP_TYPE__double: return (_double)x <= (_double)y; case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: return strcmp((const char*)x, (const char*)y) <= 0; default: return false; } } bool json_lne(const value& x, const value& y) { if (x.__type != y.__type && (x.__type != SOAP_TYPE__i4 || y.__type != SOAP_TYPE__int) && (x.__type != SOAP_TYPE__int || y.__type != SOAP_TYPE__i4)) return false; switch (x.__type) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: return (_int)x < (_int)y; case SOAP_TYPE__double: return (_double)x < (_double)y; case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: return strcmp((const char*)x, (const char*)y) < 0; default: return false; } } #endif #ifdef JSON_NAMESPACE #ifdef __cplusplus } // namespace json #endif #endif gsoap-2.8.91/gsoap/samples/xml-rpc-json/build.bat0000644000175000017500000000064313525245163021172 0ustar ellertellertREM Copying stdsoap2.h and stdsoap2.cpp to source dir COPY /B ..\..\stdsoap2.h . COPY /B ..\..\stdsoap2.cpp . ..\..\soapcpp2\Release\soapcpp2.exe -CSL xml-rpc.h REM You need these header files to compile: REM stdsoap2.h REM json.h REM xml-rpc-iters.h REM soapH.h REM soapStub.h REM You need these source code files to compile: REM stdsoap2.cpp REM xml-rpc.cpp REM json.cpp REM jsoncpp.cpp REM soapC.cpp gsoap-2.8.91/gsoap/samples/xml-rpc-json/xml-rpc-currentTime.cpp0000644000175000017500000000475713525245163024002 0ustar ellertellert/* xml-rpc-currentTime.cpp XML-RPC currenTime (C++ version) Prints current time. Compile: soapcpp2 xml-rpc.h c++ xml-rpc-currentTime.cpp xml-rpc.cpp xml-rpc-io.cpp stdsoap2.cpp soapC.cpp -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "json.h" using namespace std; int main() { soap *ctx = soap_new1(SOAP_IO_KEEPALIVE | SOAP_XML_INDENT | SOAP_C_UTFSTRING); ctx->send_timeout = 10; // 10 sec, stop if server is not accepting msg ctx->recv_timeout = 10; // 10 sec, stop if server does not respond in time // set up the method call methodCall m(ctx, "http://www.cs.fsu.edu/~engelen/currentTime.cgi", "currentTime.getCurrentTime"); // make the call and get response params params r = m(); // error? if (m.error()) soap_print_fault(ctx, stderr); // empty response means fault in JSON format else if (r.empty()) cout << m.fault() << endl; // print time in JSON format (just a string as per json.h) else cout << "Time = " << r[0] << endl; // clean up soap_destroy(ctx); soap_end(ctx); soap_free(ctx); return 0; } /* Don't need a namespace table. We put an empty one here to avoid link errors */ struct Namespace namespaces[] = { {NULL, NULL} }; gsoap-2.8.91/gsoap/samples/xml-rpc-json/xml-rpc-iters.h0000644000175000017500000004705313525245163022270 0ustar ellertellert/* xml-rpc-iters.h XML-RPC/JSON C++ API iterators -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef XML_RPC_ITERS_H #define XML_RPC_ITERS_H #ifdef __cplusplus #include #ifdef JSON_NAMESPACE # define SOAP_TYPE__boolean SOAP_TYPE_json__boolean # define SOAP_TYPE__i4 SOAP_TYPE_json__i4 # define SOAP_TYPE__int SOAP_TYPE_json__int # define SOAP_TYPE__double SOAP_TYPE_json__double # define SOAP_TYPE__dateTime_DOTiso8601 SOAP_TYPE_json__dateTime_DOTiso8601 # define SOAP_TYPE__string SOAP_TYPE_json__string # define SOAP_TYPE__array SOAP_TYPE_json__array # define SOAP_TYPE__struct SOAP_TYPE_json__struct # define SOAP_TYPE__base64 SOAP_TYPE_json__base64 # define SOAP_TYPE__rawdata SOAP_TYPE_json__rawdata #endif #ifdef JSON_NAMESPACE namespace json { #endif class value_const_iterator; class value_iterator; class _struct_const_iterator; class _struct_iterator; class _array_const_iterator; class _array_iterator; class params_const_iterator; class params_iterator; #ifdef JSON_NAMESPACE } #endif // force "cyclic" inclusion to obtain type declarations for definitions below #ifdef JSON_NAMESPACE #include "jsonStub.h" #else #include "soapStub.h" #endif #ifdef JSON_NAMESPACE namespace json { #endif /// bidirectional const iterator over values (struct or array or one atomic value) class value_const_iterator : public std::iterator { friend class value_iterator; private: struct value* _value; struct member* _member; int _index; public: value_const_iterator() : _value(NULL), _member(NULL), _index(0) { } value_const_iterator(struct value* v) : _value(v), _member(NULL), _index(0) { } value_const_iterator(struct value* v, struct member* m) : _value(v), _member(m), _index(0) { } value_const_iterator(struct value* v, int i) : _value(v), _member(NULL), _index(i) { } bool operator==(const value_iterator& that) const; bool operator==(const value_const_iterator& that) const { if (_value == NULL) return that._value == NULL; if (that._value == NULL) return _value == NULL; if (_value->__type != that._value->__type) return false; if (_value->__type == SOAP_TYPE__struct) return _member == that._member; if (_value->__type == SOAP_TYPE__array) return (((_array*)_value->ref)->data.value + _index) == (((_array*)that._value->ref)->data.value + that._index); return _value == that._value; } bool operator!=(const value_iterator& that) const { return !operator==(that); } bool operator!=(const value_const_iterator& that) const { return !operator==(that); } const struct value& operator*() const { return *operator->(); } const struct value *operator->() const { if (_value->__type == SOAP_TYPE__struct) return &_member->value; if (_value->__type == SOAP_TYPE__array) return ((_array*)_value->ref)->data.value + _index; return _value; } int index() const { if (_value->__type == SOAP_TYPE__struct) return (int)(_member - ((_struct*)_value->ref)->member); if (_value->__type == SOAP_TYPE__array) return _index; return 0; } const char *name() const { if (_value->__type == SOAP_TYPE__struct) return _member->name; return ""; } value_const_iterator& operator++() { if (_value->__type == SOAP_TYPE__struct) _member++; else if (_value->__type == SOAP_TYPE__array) _index++; else _value = NULL; return *this; } value_const_iterator operator++(int) { value_const_iterator i = *this; if (_value->__type == SOAP_TYPE__struct) _member++; else if (_value->__type == SOAP_TYPE__array) _index++; else _value = NULL; return i; } value_const_iterator& operator--() { if (_value->__type == SOAP_TYPE__struct) _member--; else if (_value->__type == SOAP_TYPE__array) _index--; else _value = NULL; return *this; } value_const_iterator operator--(int) { value_const_iterator i = *this; if (_value->__type == SOAP_TYPE__struct) _member--; else if (_value->__type == SOAP_TYPE__array) _index--; else _value = NULL; return i; } value_const_iterator& operator+=(int k) { if (_value->__type == SOAP_TYPE__struct) _member += k; else if (_value->__type == SOAP_TYPE__array) _index += k; else if (k) _value = NULL; return *this; } value_const_iterator& operator-=(int k) { if (_value->__type == SOAP_TYPE__struct) _member -= k; else if (_value->__type == SOAP_TYPE__array) _index -= k; else if (k) _value = NULL; return *this; } }; /// bidirectional iterator over values (struct or array or one atomic value) class value_iterator : public std::iterator { friend class value_const_iterator; private: struct value* _value; struct member* _member; int _index; public: value_iterator() : _value(NULL), _member(NULL), _index(0) { } value_iterator(struct value* v) : _value(v), _member(NULL), _index(0) { } value_iterator(struct value* v, struct member* m) : _value(v), _member(m), _index(0) { } value_iterator(struct value* v, int i) : _value(v), _member(NULL), _index(i) { } operator value_const_iterator() const { value_const_iterator i; i._value = _value; i._member = _member; i._index = _index; return i; } bool operator==(const value_iterator& that) const { if (_value == NULL) return that._value == NULL; if (that._value == NULL) return _value == NULL; if (_value->__type != that._value->__type) return false; if (_value->__type == SOAP_TYPE__struct) return _member == that._member; if (_value->__type == SOAP_TYPE__array) return (((_array*)_value->ref)->data.value + _index) == (((_array*)that._value->ref)->data.value + that._index); return _value == that._value; } bool operator==(const value_const_iterator& that) const { if (_value == NULL) return that._value == NULL; if (that._value == NULL) return _value == NULL; if (_value->__type != that._value->__type) return false; if (_value->__type == SOAP_TYPE__struct) return _member == that._member; if (_value->__type == SOAP_TYPE__array) return (((_array*)_value->ref)->data.value + _index) == (((_array*)that._value->ref)->data.value + that._index); return _value == that._value; } bool operator!=(const value_iterator& that) const { return !operator==(that); } bool operator!=(const value_const_iterator& that) const { return !operator==(that); } struct value& operator*() { return *operator->(); } struct value *operator->() { if (_value->__type == SOAP_TYPE__struct) return &_member->value; if (_value->__type == SOAP_TYPE__array) { if (((_array*)_value->ref)->data.__size <= _index) ((_array*)_value->ref)->size(_index + 1); return ((_array*)_value->ref)->data.value + _index; } return _value; } int index() const { if (_value->__type == SOAP_TYPE__struct) return (int)(_member - ((_struct*)_value->ref)->member); if (_value->__type == SOAP_TYPE__array) return _index; return 0; } const char *name() const { if (_value->__type == SOAP_TYPE__struct) return _member->name; return ""; } value_iterator& operator++() { if (_value->__type == SOAP_TYPE__struct) _member++; else if (_value->__type == SOAP_TYPE__array) _index++; else _value = NULL; return *this; } value_iterator operator++(int) { value_iterator i = *this; if (_value->__type == SOAP_TYPE__struct) _member++; else if (_value->__type == SOAP_TYPE__array) _index++; else _value = NULL; return i; } value_iterator& operator--() { if (_value->__type == SOAP_TYPE__struct) _member--; else if (_value->__type == SOAP_TYPE__array) _index--; else _value = NULL; return *this; } value_iterator operator--(int) { value_iterator i = *this; if (_value->__type == SOAP_TYPE__struct) _member--; else if (_value->__type == SOAP_TYPE__array) _index--; else _value = NULL; return i; } value_iterator& operator+=(int k) { if (_value->__type == SOAP_TYPE__struct) _member += k; else if (_value->__type == SOAP_TYPE__array) _index += k; else if (k) _value = NULL; return *this; } value_iterator& operator-=(int k) { if (_value->__type == SOAP_TYPE__struct) _member -= k; else if (_value->__type == SOAP_TYPE__array) _index -= k; else if (k) _value = NULL; return *this; } }; /// iterates over _struct class _struct_const_iterator { friend class _struct_iterator; private: const struct member* _member; public: _struct_const_iterator() : _member(NULL) { } _struct_const_iterator(const struct _struct* s) : _member(s->member) { } bool operator==(const _struct_iterator& that) const; bool operator==(const _struct_const_iterator& that) const { return _member == that._member; } bool operator!=(const _struct_iterator& that) const { return !operator==(that); } bool operator!=(const _struct_const_iterator& that) const { return !operator==(that); } const char* index() const { return _member->name; } ///< get member name const struct value& operator*() const { return _member->value; } ///< get member value const struct value* operator->() const { return &_member->value; } ///< get member value _struct_const_iterator& operator++() { _member++; return *this; } _struct_const_iterator operator++(int) { _struct_const_iterator i = *this; _member++; return i; } _struct_const_iterator& operator+=(int k) { _member += k; return *this; } _struct_const_iterator& operator-=(int k) { _member -= k; return *this; } }; /// iterates over _struct class _struct_iterator { friend class _struct_const_iterator; private: struct member* _member; public: _struct_iterator() : _member(NULL) { } _struct_iterator(const struct _struct* s) : _member(s->member) { } bool operator==(const _struct_iterator& that) const { return _member == that._member; } bool operator==(const _struct_const_iterator& that) const { return _member == that._member; } bool operator!=(const _struct_iterator& that) const { return !operator==(that); } bool operator!=(const _struct_const_iterator& that) const { return !operator==(that); } const char* name() const { return _member->name; } ///< get member name const char* index() const { return name(); } ///< get member name (deprecated) struct value& operator*() const { return _member->value; } ///< get member value struct value* operator->() const { return &_member->value; } ///< get member value _struct_iterator& operator++() { _member++; return *this; } _struct_iterator operator++(int) { _struct_iterator i = *this; _member++; return i; } _struct_iterator& operator+=(int k) { _member += k; return *this; } _struct_iterator& operator-=(int k) { _member -= k; return *this; } }; /// iterates over _array class _array_const_iterator { friend class _array_iterator; private: const struct value* _start; const struct value* _value; public: _array_const_iterator() : _start(NULL), _value(NULL) { } _array_const_iterator(const struct _array* a) : _start(a->data.value), _value(a->data.value) { } bool operator==(const _array_iterator& that) const; bool operator==(const _array_const_iterator& that) const { return _value == that._value; } bool operator!=(const _array_iterator& that) const { return !operator==(that); } bool operator!=(const _array_const_iterator& that) const { return !operator==(that); } int index() const { return (int)(_value - _start); } ///< get array index const struct value& operator*() const { return *_value; } ///< get array value const struct value* operator->() const { return _value; } ///< get array value _array_const_iterator& operator++() { _value++; return *this; } _array_const_iterator operator++(int) { _array_const_iterator i = *this; _value++; return i; } _array_const_iterator& operator+=(int k) { _value += k; return *this; } _array_const_iterator& operator-=(int k) { _value -= k; return *this; } }; /// iterates over _array class _array_iterator { friend class _array_const_iterator; private: struct value* _start; struct value* _value; public: _array_iterator() : _start(NULL), _value(NULL) { } _array_iterator(const struct _array* a) : _start(a->data.value), _value(a->data.value) { } bool operator==(const _array_iterator& that) const { return _value == that._value; } bool operator==(const _array_const_iterator& that) const { return _value == that._value; } bool operator!=(const _array_iterator& that) const { return !operator==(that); } bool operator!=(const _array_const_iterator& that) const { return !operator==(that); } int index() const { return (int)(_value - _start); } ///< get array index struct value& operator*() const { return *_value; } ///< get array value struct value* operator->() const { return _value; } ///< get array value _array_iterator& operator++() { _value++; return *this; } _array_iterator operator++(int) { _array_iterator i = *this; _value++; return i; } _array_iterator& operator+=(int k) { _value += k; return *this; } _array_iterator& operator-=(int k) { _value -= k; return *this; } }; /// iterates over params class params_const_iterator { friend class params_iterator; private: const struct param* _start; const struct param* _param; public: params_const_iterator() : _start(NULL), _param(NULL) { } params_const_iterator(const struct params* p) : _start(p->param), _param(p->param) { } bool operator==(const params_iterator& that) const; bool operator==(const params_const_iterator& that) const { return _param == that._param; } bool operator!=(const params_iterator& that) const { return !operator==(that); } bool operator!=(const params_const_iterator& that) const { return !operator==(that); } int index() const { return (int)(_param - _start); } ///< get parameter index const struct value& operator*() const { return _param->value; } ///< get parameter value const struct value* operator->() const { return &_param->value; } ///< get parameter value params_const_iterator& operator++() { _param++; return *this; } params_const_iterator operator++(int) { params_const_iterator i = *this; _param++; return i; } params_const_iterator& operator+=(int k) { _param += k; return *this; } params_const_iterator& operator-=(int k) { _param -= k; return *this; } }; /// iterates over params class params_iterator { friend class params_const_iterator; private: struct param* _start; struct param* _param; public: params_iterator() : _start(NULL), _param(NULL) { } params_iterator(const struct params* p) : _start(p->param), _param(p->param) { } bool operator==(const params_iterator& that) const { return _param == that._param; } bool operator==(const params_const_iterator& that) const { return _param == that._param; } bool operator!=(const params_iterator& that) const { return !operator==(that); } bool operator!=(const params_const_iterator& that) const { return !operator==(that); } int index() const { return (int)(_param - _start); } ///< get parameter index struct value& operator*() const { return _param->value; } ///< get parameter value struct value* operator->() const { return &_param->value; } ///< get parameter value params_iterator& operator++() { _param++; return *this; } params_iterator operator++(int) { params_iterator i = *this; _param++; return i; } params_iterator& operator+=(int k) { _param += k; return *this; } params_iterator& operator-=(int k) { _param -= k; return *this; } }; #ifdef JSON_NAMESPACE } // namespace json #endif #endif #endif gsoap-2.8.91/gsoap/samples/xml-rpc-json/json.h0000644000175000017500000002071013525245163020522 0ustar ellertellert/* json.h JSON C/C++ supporting functions -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifdef JSON_NAMESPACE # include "jsonH.h" #else # include "soapH.h" #endif #ifdef JSON_NAMESPACE #ifdef __cplusplus namespace json { #endif #endif /** @brief Set value to JSON error property given the context's error code, as per Google JSON Style Guide @param soap context with soap->error set @param v value to set @return error code */ extern int json_error(struct soap *soap, struct value *v); /** @brief Respond with a JSON error when an internal fault occurred (i.e. soap->error is nonzero), as per Google JSON Style Guide @param soap context with soap->error set @return error code */ extern int json_send_fault(struct soap *soap); /** @brief Send JSON error back to the client using the specified HTTP status code and a message and details, as per Google JSON Style Guide @param soap context with soap->error set @param status HTTP error status code or SOAP_OK (0) @param message error message @param details error detail or NULL @return error code */ extern int json_send_error(struct soap *soap, int status, const char *message, const char *details); /** @brief Write JSON value to the context's output (socket, stream, FILE, or string) @param soap context that manages IO @param v value to write @return SOAP_OK or error code */ extern int json_write(struct soap *soap, const struct value *v); /** @brief Send JSON value, requires soap_begin_send() before this call and soap_end_send() to finish, this function is used by json_write() @param soap context that manages IO @param v value to send @return SOAP_OK or error code */ extern int json_send(struct soap *soap, const struct value *v); #ifdef __cplusplus extern int json_write(struct soap *soap, const value& v); extern int json_send(struct soap *soap, const value& v); extern std::ostream& operator<<(std::ostream&, const value&); #endif /** @brief Read JSON value from context's input (socket, stream, FILE, or string) @param soap context that manages IO @param v value to read (non NULL) @return SOAP_OK or error code */ extern int json_read(struct soap *soap, struct value *v); /** @brief Receive JSON value, requires soap_begin_recv() before this call and soap_end_recv() to finish, this function is used by json_read() @param soap context that manages IO @param v value to receive (non NULL) @return SOAP_OK or error code */ extern int json_recv(struct soap *soap, struct value *v); #ifdef __cplusplus extern int json_read(struct soap *soap, value& v); extern int json_recv(struct soap *soap, value& v); extern std::istream& operator>>(std::istream&, value&); #endif /** Client-side JSON REST call to endpoint URL with optional in and out values (POST with in/out, GET with out, PUT with in, DELETE without in/out), returns SOAP_OK or HTTP status code @param soap context that manages IO @param endpoint URL of the JSON REST/RPC service @param in value to send, or NULL (when non-NULL: PUT or POST, when NULL: GET or DELETE) @param out value to receive, or NULL (when non-NULL: GET or POST, when NULL: PUT or DELETE) @return SOAP_OK or HTTP status code or an error code with out set to the JSON error property when the error was returned by the server */ extern int json_call(struct soap *soap, const char *endpoint, const struct value *in, struct value *out); #ifdef __cplusplus extern int json_call(struct soap *soap, const char *endpoint, const struct value& in, struct value& out); #endif /** @brief Convert string to JSON string and write it to context's output @param soap context that manages IO @param s string to send @return SOAP_OK or error code */ extern int json_send_string(struct soap *soap, const char *s); #ifdef __cplusplus extern value json_add(const value&, const value&); template inline value operator+(const value& x, const T& y); template inline value operator+(const value& x, const T& y) { return json_add(x, value(x.soap, y)); } template<> inline value operator+(const value& x, const value& y) { return json_add(x, y); } extern value json_sub(const value&, const value&); template inline value operator-(const value& x, const T& y); template inline value operator-(const value& x, const T& y) { return json_sub(x, value(x.soap, y)); } template<> inline value operator-(const value& x, const value& y) { return json_sub(x, y); } extern value json_mul(const value&, const value&); template inline value operator*(const value& x, const T& y); template inline value operator*(const value& x, const T& y) { return json_mul(x, value(x.soap, y)); } template<> inline value operator*(const value& x, const value& y) { return json_mul(x, y); } extern value json_div(const value&, const value&); template inline value operator/(const value& x, const T& y); template inline value operator/(const value& x, const T& y) { return json_div(x, value(x.soap, y)); } template<> inline value operator/(const value& x, const value& y) { return json_div(x, y); } extern value json_mod(const value&, const value&); template inline value operator%(const value& x, const T& y); template inline value operator%(const value& x, const T& y) { return json_mod(x, value(x.soap, y)); } template<> inline value operator%(const value& x, const value& y) { return json_mod(x, y); } extern bool json_eqv(const value&, const value&); template inline bool operator==(const value& x, const T& y); template inline bool operator==(const value& x, const T& y) { return json_eqv(x, value(x.soap, y)); } template<> inline bool operator==(const value& x, const value& y) { return json_eqv(x, y); } template inline bool operator!=(const value& x, const T& y); template inline bool operator!=(const value& x, const T& y) { return !json_eqv(x, value(x.soap, y)); } template<> inline bool operator!=(const value& x, const value& y) { return !json_eqv(x, y); } extern bool json_leq(const value&, const value&); template inline bool operator<=(const value& x, const T& y); template inline bool operator<=(const value& x, const T& y) { return json_leq(x, value(x.soap, y)); } template<> inline bool operator<=(const value& x, const value& y) { return json_leq(x, y); } template inline bool operator>=(const value& x, const T& y); template inline bool operator>=(const value& x, const T& y) { return json_leq(value(x.soap, y), x); } template<> inline bool operator>=(const value& x, const value& y) { return json_leq(y, x); } extern bool json_lne(const value&, const value&); template inline bool operator<(const value& x, const T& y); template inline bool operator<(const value& x, const T& y) { return json_lne(x, value(x.soap, y)); } template<> inline bool operator<(const value& x, const value& y) { return json_lne(x, y); } template inline bool operator>(const value& x, const T& y); template inline bool operator>(const value& x, const T& y) { return json_lne(value(x.soap, y), x); } template<> inline bool operator>(const value& x, const value& y) { return json_lne(y, x); } #endif #ifdef JSON_NAMESPACE #ifdef __cplusplus } // namespace json #endif #endif gsoap-2.8.91/gsoap/samples/xml-rpc-json/xml-rpc.c0000644000175000017500000003552613525245163021141 0ustar ellertellert/* xml-rpc.c C API for XML-RPC/JSON data management Note: XML-RPC declarations are located in the gSOAP header file xml-rpc.h, which is used to generate XML-RPC serializers (soapH.h, soapStub.h, and soapC.c) with: $ soapcpp2 -c -CSL xml-rpc.h To generate the soap_dup_value deep copy function use -Ec: $ soapcpp2 -c -Ec -CSL xml-rpc.h For more information please visit: http://www.genivia.com/doc/xml-rpc-json/html/ -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifdef JSON_NAMESPACE # include "jsonH.h" #else # include "soapH.h" #endif static int size2k(int n); struct value * new_value(struct soap *soap) { return init_value(soap, (struct value*)soap_malloc(soap, sizeof(struct value))); } struct value * init_value(struct soap *soap, struct value *v) { if (v) soap_default_value(soap, v); return v; } _boolean * bool_of(struct value *v) { if (v->__type != SOAP_TYPE__boolean) if ((v->ref = (void*)soap_malloc(v->soap, sizeof(_boolean)))) *(_boolean*)v->ref = 0; v->__type = SOAP_TYPE__boolean; v->__any = NULL; return (_boolean*)v->ref; } _int * int_of(struct value *v) { _int r = 0; if (v->__type == SOAP_TYPE__boolean) r = (_int)*(_boolean*)v->ref; else if (v->__type == SOAP_TYPE__i4) r = (_int)*(_i4*)v->ref; else if (v->__type == SOAP_TYPE__double) r = (_int)(*(_double*)v->ref); else if (v->__type == SOAP_TYPE__string) { soap_s2LONG64(v->soap, (const char*)v->ref, &r); v->soap->error = SOAP_OK; } if (v->__type != SOAP_TYPE__int) if ((v->ref = (void*)soap_malloc(v->soap, sizeof(_int)))) *(_int*)v->ref = r; v->__type = SOAP_TYPE__int; v->__any = NULL; return (_int*)v->ref; } _double * double_of(struct value *v) { _double r = 0; if (v->__type == SOAP_TYPE__boolean) r = (_double)*(_boolean*)v->ref; else if (v->__type == SOAP_TYPE__i4) r = (_double)*(_i4*)v->ref; else if (v->__type == SOAP_TYPE__int) r = (_double)(*(_int*)v->ref); else if (v->__type == SOAP_TYPE__string) { soap_s2double(v->soap, (const char*)v->ref, &r); v->soap->error = SOAP_OK; } if (v->__type != SOAP_TYPE__double) if ((v->ref = (void*)soap_malloc(v->soap, sizeof(_double)))) *(_double*)v->ref = r; v->__type = SOAP_TYPE__double; v->__any = NULL; return (_double*)v->ref; } const char ** string_of(struct value *v) { if (v->__type == SOAP_TYPE__string || v->__type == SOAP_TYPE__dateTime_DOTiso8601) return (const char**)&v->ref; if (v->__type == SOAP_TYPE__boolean) v->ref = (void*)(*(_boolean*)v->ref ? "true" : "false"); else if (v->__type == SOAP_TYPE__i4) v->ref = (void*)soap_strdup(v->soap, soap_int2s(v->soap, (int)*(_i4*)v->ref)); else if (v->__type == SOAP_TYPE__int) v->ref = (void*)soap_strdup(v->soap, soap_LONG642s(v->soap, (LONG64)*(_int*)v->ref)); else if (v->__type == SOAP_TYPE__double) v->ref = (void*)soap_strdup(v->soap, soap_double2s(v->soap, (double)*(_double*)v->ref)); else if (v->__type == SOAP_TYPE__base64) v->ref = (void*)soap_s2base64(v->soap, (unsigned char*)((struct _base64*)v->ref)->__ptr, NULL, ((struct _base64*)v->ref)->__size); else if (v->__type == SOAP_TYPE__rawdata) v->ref = (void*)soap_strdup(v->soap, (const char*)((struct _rawdata*)v->ref)->__ptr); else if (v->__any) v->ref = (void*)v->__any; else v->ref = (void*)"null"; v->__type = SOAP_TYPE__string; v->__any = NULL; return (const char**)&v->ref; } const char ** dateTime_of(struct value *v) { if (v->__type != SOAP_TYPE__dateTime_DOTiso8601) v->ref = (void*)""; v->__type = SOAP_TYPE__dateTime_DOTiso8601; v->__any = NULL; return (const char**)&v->ref; } struct _base64 * base64_of(struct value *v) { if (v->__type != SOAP_TYPE__base64) if ((v->ref = (void*)soap_malloc(v->soap, sizeof(struct _base64)))) soap_default__base64(v->soap, (struct _base64*)v->ref); v->__type = SOAP_TYPE__base64; v->__any = NULL; return (struct _base64*)v->ref; } struct _rawdata * rawdata_of(struct value *v) { if (v->__type != SOAP_TYPE__rawdata) if ((v->ref = (void*)soap_malloc(v->soap, sizeof(struct _rawdata)))) soap_default__rawdata(v->soap, (struct _rawdata*)v->ref); v->__type = SOAP_TYPE__rawdata; v->__any = NULL; return (struct _rawdata*)v->ref; } struct value * value_at(struct value *v, const char *s) { int i = 0; struct _struct *_struct = (struct _struct*)v->ref; if (s == NULL) s = ""; if (v->__type != SOAP_TYPE__struct || !_struct) { v->ref = _struct = (struct _struct*)soap_malloc(v->soap, sizeof(struct _struct)); if (!_struct) return NULL; soap_default__struct(v->soap, _struct); } v->__type = SOAP_TYPE__struct; v->__any = NULL; if (!_struct->member) { int newsize = size2k(_struct->__size = 1); _struct->member = (struct member*)soap_malloc(v->soap, sizeof(struct member) * newsize); if (!_struct->member) return NULL; for (i = 0; i < newsize; i++) soap_default_member(v->soap, &_struct->member[i]); } else { int oldsize, newsize; for (i = 0; i < _struct->__size; i++) if (!strcmp(_struct->member[i].name, s)) return &_struct->member[i].value; oldsize = size2k(_struct->__size); newsize = size2k(++_struct->__size); if (oldsize < newsize) { struct member *newmember = (struct member*)soap_malloc(v->soap, sizeof(struct member) * newsize); if (!newmember) return NULL; (void)soap_memcpy((void*)newmember, sizeof(struct member) * newsize, (const void*)_struct->member, sizeof(struct member) * oldsize); for (i = oldsize; i < newsize; i++) soap_default_member(v->soap, &newmember[i]); soap_unlink(v->soap, _struct->member); free((void*)_struct->member); _struct->member = newmember; } } i = _struct->__size - 1; _struct->member[i].name = soap_strdup(_struct->soap, s); soap_default_value(v->soap, &_struct->member[i].value); return &_struct->member[i].value; } struct value * value_atw(struct value *v, const wchar_t *s) { const char *t = soap_wchar2s(NULL, s); struct value *u = value_at(v, t); free((void*)t); return u; } struct member * nth_member(struct value *v, int n) { struct _struct *_struct = (struct _struct*)v->ref; if (n < 0 && _struct) { n += _struct->__size; if (n < 0) n = 0; } if (v->__type != SOAP_TYPE__struct || !_struct || _struct->__size <= n || n < 0) return NULL; return &_struct->member[n]; } struct value * nth_value(struct value *v, int n) { if (v->__type == SOAP_TYPE__struct) { struct member *member = nth_member(v, n); if (!member) return new_value(v->soap); return &member->value; } else { int i = 0; struct data *data; if (v->__type != SOAP_TYPE__array || v->ref == NULL) { struct _array *_array = (struct _array*)soap_malloc(v->soap, sizeof(struct _array)); if (!_array) return NULL; v->ref = _array; soap_default__array(v->soap, _array); } data = &((struct _array*)v->ref)->data; v->__type = SOAP_TYPE__array; v->__any = NULL; if (n < 0) { n += data->__size; if (n < 0) n = 0; } if (!data->value) { int newsize = size2k(data->__size = n + 1); data->value = (struct value*)soap_malloc(v->soap, sizeof(struct value) * newsize); if (!data->value) return NULL; for (i = 0; i < newsize; i++) soap_default_value(v->soap, &data->value[i]); } else if (data->__size <= n) { int oldsize = size2k(data->__size); int newsize = size2k(data->__size = n + 1); if (oldsize < newsize) { struct value *newvalue = (struct value*)soap_malloc(v->soap, sizeof(struct value) * newsize); if (!newvalue) return NULL; (void)soap_memcpy((void*)newvalue, sizeof(struct value) * newsize, (const void*)data->value, sizeof(struct value) * oldsize); for (i = oldsize; i < newsize; i++) soap_default_value(v->soap, &newvalue[i]); soap_unlink(v->soap, data->value); free((void*)data->value); data->value = newvalue; } } return &data->value[n]; } } void set_struct(struct value *v) { if (v->__type != SOAP_TYPE__struct || !v->ref) v->ref = (struct _struct*)soap_malloc(v->soap, sizeof(struct _struct)); v->__type = SOAP_TYPE__struct; v->__any = NULL; if (v->ref) soap_default__struct(v->soap, (struct _struct*)v->ref); } void set_size(struct value *v, int n) { if (v->__type == SOAP_TYPE__array && v->ref) { struct data *data = &((struct _array*)v->ref)->data; if (n < 0) n += data->__size; if (n >= 0) { if (data->__size >= n) data->__size = n; else (void)nth_value(v, n - 1); } } else { v->ref = (void*)soap_malloc(v->soap, sizeof(struct _array)); if (!v->ref) return; v->__type = SOAP_TYPE__array; v->__any = NULL; soap_default__array(v->soap, (struct _array*)v->ref); if (n > 0) (void)nth_value(v, n - 1); } } int has_size(const struct value *v) { if (v->__type == SOAP_TYPE__array && v->ref) return ((const struct _array*)v->ref)->data.__size; if (v->__type == SOAP_TYPE__struct && v->ref) return ((const struct _struct*)v->ref)->__size; return 0; } int is_empty(const struct value *v) { if (v->__type == SOAP_TYPE__array && v->ref) return ((const struct _array*)v->ref)->data.__size == 0; if (v->__type == SOAP_TYPE__struct && v->ref) return ((const struct _struct*)v->ref)->__size == 0; return 1; } int nth_at(const struct value *v, const char *s) { if (s == NULL) return -1; if (v->__type == SOAP_TYPE__struct) { const struct _struct *_struct = (const struct _struct*)v->ref; int i; if (s == NULL) s = ""; if (_struct) for (i = 0; i < _struct->__size; i++) if (!strcmp(_struct->member[i].name, s)) return i; } return -1; } int nth_atw(const struct value *v, const wchar_t *s) { const char *t; int i; if (s == NULL) return -1; t = soap_wchar2s(NULL, s); i = nth_at(v, t); free((void*)t); return i; } int nth_nth(const struct value *v, int n) { if (v->__type == SOAP_TYPE__array && v->ref) { int size = ((struct _array*)v->ref)->data.__size; return n < 0 ? n + size : n < size ? n : -1; } return -1; } _boolean is_null(const struct value *v) { return v->__type == 0 && !(v->__any && *v->__any); } _boolean is_int(const struct value *v) { return v->__type == SOAP_TYPE__i4 || v->__type == SOAP_TYPE__int; } _boolean is_double(const struct value *v) { return v->__type == SOAP_TYPE__double; } _boolean is_number(const struct value *v) { return v->__type == SOAP_TYPE__i4 || v->__type == SOAP_TYPE__int || v->__type == SOAP_TYPE__double; } _boolean is_string(const struct value *v) { return v->__type == SOAP_TYPE__string || (v->__any && *v->__any); } _boolean is_bool(const struct value *v) { return v->__type == SOAP_TYPE__boolean; } _boolean is_true(const struct value *v) { return v->__type == SOAP_TYPE__boolean && *(_boolean*)v->ref; } _boolean is_false(const struct value *v) { return v->__type == SOAP_TYPE__boolean && !*(_boolean*)v->ref; } _boolean is_array(const struct value *v) { return v->__type == SOAP_TYPE__array; } _boolean is_struct(const struct value *v) { return v->__type == SOAP_TYPE__struct; } _boolean is_dateTime(const struct value *v) { return v->__type == SOAP_TYPE__dateTime_DOTiso8601; } _boolean is_base64(const struct value *v) { return v->__type == SOAP_TYPE__base64; } _boolean is_rawdata(const struct value *v) { return v->__type == SOAP_TYPE__rawdata; } struct params * new_params(struct soap *soap) { struct params *p = soap_malloc(soap, sizeof(struct params)); if (p) soap_default_params(soap, p); return p; } struct value * nth_param(struct params *p, int n) { int i = 0; if (n < 0) { n += p->__size; if (n < 0) n = 0; } if (!p->param) { int newsize = size2k(p->__size = n + 1); p->param = (struct param*)soap_malloc(p->soap, sizeof(struct param) * newsize); if (!p->param) return NULL; for (i = 0; i < newsize; i++) soap_default_param(p->soap, &p->param[i]); } else if (p->__size <= n) { int oldsize = size2k(p->__size); int newsize = size2k(p->__size = n + 1); if (oldsize < newsize) { struct param *newparam = (struct param*)soap_malloc(p->soap, sizeof(struct param) * newsize); if (!newparam) return NULL; (void)soap_memcpy((void*)newparam, sizeof(struct param) * newsize, (const void*)p->param, sizeof(struct param) * oldsize); for (i = oldsize; i < newsize; i++) soap_default_param(p->soap, &newparam[i]); soap_unlink(p->soap, p->param); free((void*)p->param); p->param = newparam; } } return &p->param[n].value; } int call_method(struct soap *soap, const char *endpoint, const char *methodName, struct params *p, struct methodResponse *r) { struct methodCall m; soap_default_methodCall(soap, &m); m.methodName = (char*)methodName; if (p) { m.params.__size = p->__size; m.params.param = p->param; } soap->namespaces = NULL; /* no namespaces */ soap->encodingStyle = NULL; /* no SOAP encodingStyle */ /* connect, send request and receive response */ if (soap_connect(soap, endpoint, NULL) || soap_write_methodCall(soap, &m) || soap_read_methodResponse(soap, r)) return soap_closesock(soap); /* closes socket and returns soap->error */ soap_closesock(soap); return SOAP_OK; } static int size2k(int n) { int k = 2; while (k < n) k *= 2; return k; } gsoap-2.8.91/gsoap/samples/xml-rpc-json/xml-rpc-weblogs.c0000644000175000017500000000544013525245163022571 0ustar ellertellert/* xml-rpc-weblogs.c XML-RPC weblogUpdates.ping example in C Updated for gSOAP 2.8.26 with new XML-RPC C API xml-rpc.c Compile: soapcpp2 -c -CSL xml-rpc.h cc xml-rpc-weblogs.c xml-rpc.c stdsoap2.c soapC.c -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" int main() { struct soap *soap = soap_new1(SOAP_C_UTFSTRING); struct params *p = new_params(soap); struct methodResponse r; /* Set up method call parameters */ *string_of(nth_param(p, 0)) = "Scripting News"; *string_of(nth_param(p, 1)) = "http://www.scripting.com/"; /* connect, send request, and receive response */ if (call_method(soap, "http://rpc.weblogs.com/RPC2", "weblogUpdates.ping", p, &r)) { soap_print_fault(soap, stderr); exit(soap->error); } if (r.fault) { /* print fault on stdout */ soap_write_fault(soap, r.fault); } else if (r.params && r.params->__size == 1) { /* print response parameter, check if first parameter is a struct */ struct value *v = nth_param(r.params, 0); if (v->__type == SOAP_TYPE__struct) { if (is_false(value_at(v, "flerror"))) printf("Weblog ping successful: %s\n", *string_of(value_at(v, "message"))); else printf("Weblog ping failed\n"); } else printf("XML-RPC response message format error: struct expected\n"); } soap_end(soap); soap_free(soap); return 0; } /* Don't need a namespace table. We put an empty one here to avoid link errors */ struct Namespace namespaces[] = { {NULL, NULL} }; gsoap-2.8.91/gsoap/samples/xml-rpc-json/xml-rpc-currentTime.c0000644000175000017500000000473713525245163023440 0ustar ellertellert/* xml-rpc-currentTime.c XML-RPC currenTime (C version) Updated for gSOAP 2.8.26 with new XML-RPC C API xml-rpc.c Prints current time. Compile: soapcpp2 -c -CSL xml-rpc.h cc xml-rpc-currentTime.c xml-rpc.c stdsoap2.c soapC.c -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" int main() { struct soap *soap = soap_new1(SOAP_C_UTFSTRING); struct methodResponse r; /* connect, send request w/o parameters (NULL) and receive response */ if (call_method(soap, "http://www.cs.fsu.edu/~engelen/currentTime.cgi", "currentTime.getCurrentTime", NULL, &r)) { soap_print_fault(soap, stderr); exit(soap->error); } if (r.fault) { soap_write_fault(soap, r.fault); /* print fault on stdout */ } else if (r.params && r.params->__size == 1) { /* print response parameter */ if (nth_param(r.params, 0)->__type == SOAP_TYPE__dateTime_DOTiso8601) printf("Time = %s\n", *dateTime_of(nth_param(r.params, 0))); else printf("Time not provided\n"); } soap_end(soap); soap_free(soap); return 0; } /* Don't need a namespace table. We put an empty one here to avoid link errors */ struct Namespace namespaces[] = { {NULL, NULL} }; gsoap-2.8.91/gsoap/samples/xml-rpc-json/json-GitHub.cpp0000644000175000017500000000541413525245163022241 0ustar ellertellert/* json-GitHub.cpp JSON GitHub API v3 (gSOAP C++ version) https://developer.github.com/v3/ Compile: soapcpp2 -CSL xml-rpc.h c++ -DWITH_OPENSSL -DWITH_GZIP -o json-GitHub json-GitHub.cpp xml-rpc.cpp json.cpp stdsoap2.cpp soapC.cpp -lcrypto -lssl -lz Usage: ./json-GutHub URL [username password] Example: ./json-GitHub https://api.github.com/orgs/Genivia/repos -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "json.h" int main(int argc, char **argv) { if (argc < 2) { fprintf(stderr, "Usage: json-GitHub URL [username password]\nFor example: json-GitHub https://api.github.com/orgs/Genivia/repos\n\n"); exit(1); } else { soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); value response(ctx); if (argc > 3) { /* Basic authentication with username password */ if (strncmp(argv[1], "https", 5)) { fprintf(stderr, "Basic authentication over http is not secure: use https\n"); exit(1); } ctx->userid = argv[2]; ctx->passwd = argv[3]; } if (json_call(ctx, argv[1], NULL, &response)) soap_stream_fault(ctx, std::cerr); else std::cout << response; std::cout << "\n\nOK\n"; soap_destroy(ctx); // delete managed objects soap_end(ctx); // delete managed data soap_free(ctx); // delete context } return 0; } /* Don't need a namespace table. We put an empty one here to avoid link errors */ struct Namespace namespaces[] = { {NULL, NULL} }; gsoap-2.8.91/gsoap/samples/xml-rpc-json/json-GoogleDistanceMatrix.cpp0000644000175000017500000001744213525245163025137 0ustar ellertellert/* json-GoogleDistanceMatrix.cpp Google Maps Distance Matrix API example C++ client For more details, visit: https://developers.google.com/maps/documentation/distance-matrix/intro To get an API key: https://developers.google.com/maps/documentation/distance-matrix/get-api-key Build steps (requires code from samples/xml-rpc-json): soapcpp2 -CSL xml-rpc.h c++ -DWITH_OPENSSL -o json-gdm json-GoogleDistanceMatrix.cpp stdsoap2.cpp xml-rpc.cpp json.cpp soapC.cpp -lssl -lcrypto Usage: json-gdm 'origin addresses' 'destination addresses' where addresses should be separated by | Example: json-gdm bicycling imperial 'Vancouver BC|Seattle' 'San Francisco|Vancouver BC' -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2017, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "json.h" using namespace std; // define an empty XML namespace table (included to avoid link errors) struct Namespace namespaces[] = { {NULL, NULL, NULL, NULL} }; // the Google Distance Matrix service endpoint static const char *service = "https://maps.googleapis.com/maps/api/distancematrix/json"; // encode string in URL ("percentage") format static string urlencode(const string& plain); // inline min of size_t inline size_t minsize(size_t a, size_t b) { return a < b ? a : b; } int main(int argc, char **argv) { if (argc <= 5) { printf("Usage: gdm key mode units 'origin addresses' 'destination addresses'\n\n"); exit(EXIT_FAILURE); } // new context with option to parse UTF-8 into strings struct soap *ctx = soap_new1(SOAP_C_UTFSTRING); // to verify the server's authenticity, enable the code below and place cacerts.pem in the current dir: #if 0 // use SOAP_SSL_SKIP_HOST_CHECK in place of SOAP_SSL_DEFAULT to omit the host check if host mismatches occur (use at own risk!) if (soap_ssl_client_context(ctx, SOAP_SSL_DEFAULT, NULL, NULL, "cacerts.pem", NULL, NULL)) { soap_stream_fault(ctx, cerr); exit(EXIT_FAILURE); } #endif // construct URL with query string parameters string key = argv[1]; string mode = argv[2]; string units = argv[3]; string origins = argv[4]; string destinations = argv[5]; string URL = service; URL += "?key=" + urlencode(key); URL += "&mode=" + urlencode(mode); URL += "&units=" + urlencode(units); URL += "&origins=" + urlencode(origins); URL += "&destinations=" + urlencode(destinations); // Google API permits up to 8K URL lengths if (URL.size() > 8192) { printf("URL too long\n\n"); exit(EXIT_FAILURE); } // construct JSON response object value response(ctx); // exponential backoff float delay = 0.100; // initial 100 ms delay float delay_factor = 2; // delay doubles for each retry float max_delay = 120; // 2 minutes max delay // GET JSON response - exponential backoff on HTTP 5xx errors while (json_call(ctx, URL.c_str(), NULL, response)) { if (delay <= max_delay && ctx->error >= 500 && ctx->error < 599) { usleep((useconds_t)(1000 * delay)); delay *= delay_factor; } else { soap_stream_fault(ctx, cerr); break; } } // success? if (ctx->error == SOAP_OK) { if (response.has("status") && response.has("origin_addresses") && response.has("destination_addresses") && response.has("rows")) { if (!strcmp(response["status"], "OK")) { cout << "----------------------------------------" << endl; // for each origin and destination pair, print duration and distance size_t n = minsize(response["origin_addresses"].size(), response["rows"].size()); for (size_t i = 0; i < n; ++i) { cout << "from: " << response["origin_addresses"][i] << endl; if (response["rows"][i].has("elements")) { size_t m = minsize(response["destination_addresses"].size(), response["rows"][i]["elements"].size()); for (size_t j = 0; j < m; ++j) { cout << "to: " << response["destination_addresses"][j] << endl; value& e = response["rows"][i]["elements"][j]; if (e.has("status") && !strcmp(e["status"], "OK")) { if (e.has("duration") && e["duration"].has("value") && e["duration"].has("text")) cout << "duration: " << e["duration"]["value"] << " (" << e["duration"]["text"] << ")" << endl; if (e.has("duration_in_traffic") && e["duration_in_traffic"].has("value") && e["duration_in_traffic"].has("text")) cout << "duration in traffic: " << e["duration_in_traffic"]["value"] << " (" << e["duration_in_traffic"]["text"] << ")" << endl; if (e.has("distance") && e["distance"].has("value") && e["distance"].has("text")) cout << "distance: " << e["distance"]["value"] << " (" << e["distance"]["text"] << ")" << endl; if (e.has("fare") && e["fare"].has("currency") && e["fare"].has("value") && e["fare"].has("text")) cout << "fare: " << e["fare"]["currency"] << e["fare"]["value"] << " (" << e["fare"]["text"] << ")" << endl; } else { cout << "error: "; if (e.has("status")) cout << e["status"]; cout << endl; } cout << "----------------------------------------" << endl; } } } } else { cerr << "error: "; if (response.has("status")) cerr << response["status"]; if (response.has("error_message")) cerr << " " << response["error_message"]; cerr << endl; } } } else { soap_stream_fault(ctx, cerr); } // delete deserialized response and free the context soap_destroy(ctx); soap_end(ctx); soap_free(ctx); exit(EXIT_SUCCESS); } // encode string in URL "percentage" format static string urlencode(const string& plain) { string encoded; for (size_t i = 0; i < plain.size(); ++i) { int c = plain.at(i); if (c == ' ') { encoded.push_back('+'); } else if (c == '!' || c == '$' || (c >= '(' && c <= '.') || (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || c == '_' || (c >= 'a' && c <= 'z')) { encoded.push_back(c); } else { encoded.push_back('%'); encoded.push_back((c >> 4) + (c > 159 ? '7' : '0')); c &= 0xF; encoded.push_back(c + (c > 9 ? '7' : '0')); } } return encoded; } gsoap-2.8.91/gsoap/samples/xml-rpc-json/json-currentTimeServer.c0000644000175000017500000001275713525245163024217 0ustar ellertellert/* json-currentTimeServer.c JSON currenTime server (C version) CGI or stand-alone multi-threaded server Returns JSON message with current time to client. Compile: soapcpp2 -c -CSL xml-rpc.h cc -o json-currentTimeServer json-currentTimeServer.c json.c xml-rpc.c stdsoap2.c soapC.c Install as CGI on Web server Or run as stand-alone server (e.g. on port 18000): ./json-currentTimeServer 18000 -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "json.h" #include "plugin/threads.h" int serve_request(struct soap*); int main(int argc, char **argv) { struct soap *ctx = soap_new1(SOAP_C_UTFSTRING); int port; if (argc < 2) { /* process CGI request */ struct value request; /* receive JSON request value */ if (soap_begin_recv(ctx) || json_recv(ctx, &request) || soap_end_recv(ctx)) { json_send_fault(ctx); } else { /* if the name matches: set response to time, else error */ if (is_string(&request) && !strcmp(*string_of(&request), "getCurrentTime")) { struct value *response = new_value(ctx); *dateTime_of(response) = soap_dateTime2s(ctx, time(0)); /* set the http content type */ ctx->http_content = "application/json; charset=utf-8"; /* send the response */ if (soap_response(ctx, SOAP_FILE) || json_send(ctx, response) || soap_end_send(ctx)) soap_print_fault(ctx, stderr); } else { /* JSON error as per Google JSON Style Guide */ json_send_error(ctx, 400, "Wrong method", *string_of(&request)); } } soap_destroy(ctx); soap_end(ctx); soap_free(ctx); return 0; } /* multi-threaded stand-alone server on port specified by the command-line argument */ port = atoi(argv[1]); if (!soap_valid_socket(soap_bind(ctx, NULL, port, 100))) { soap_print_fault(ctx, stderr); exit(1); } soap_set_mode(ctx, SOAP_IO_KEEPALIVE); /* enable HTTP keep-alive, which is optional */ ctx->send_timeout = 10; /* 10 sec max socket idle time */ ctx->recv_timeout = 10; /* 10 sec max socket idle time */ ctx->transfer_timeout = 30; /* 30 sec message transfer timeout */ while (1) { THREAD_TYPE tid; if (soap_valid_socket(soap_accept(ctx))) { struct soap *cpy = soap_copy(ctx); if (!cpy) soap_closesock(ctx); else while (THREAD_CREATE(&tid, (void*(*)(void*))&serve_request, (void*)cpy)) sleep(1); } else if (ctx->errnum == 0) /* accept timed out, quit looping */ { break; } else /* accept failed, try again after 5 seconds */ { soap_print_fault(ctx, stderr); sleep(5); } } soap_destroy(ctx); soap_end(ctx); soap_free(ctx); return 0; } int serve_request(struct soap* ctx) { /* HTTP keep-alive max number of iterations */ unsigned int k = ctx->max_keep_alive; struct value *request = new_value(ctx); int err; THREAD_DETACH(THREAD_ID); do { if (ctx->max_keep_alive > 0 && !--k) ctx->keep_alive = 0; /* receive JSON request */ if (soap_begin_recv(ctx) || json_recv(ctx, request) || soap_end_recv(ctx)) { json_send_fault(ctx); } else { if (is_string(request) && !strcmp(*string_of(request), "getCurrentTime")) { struct value *response = new_value(ctx); *dateTime_of(response) = soap_dateTime2s(ctx, time(0)); ctx->http_content = "application/json; charset=utf-8"; if (soap_response(ctx, SOAP_FILE) || json_send(ctx, response) || soap_end_send(ctx)) soap_print_fault(ctx, stderr); } else { /* JSON error as per Google JSON Style Guide */ json_send_error(ctx, 400, "Wrong method", *string_of(request)); } } /* close (keep-alive may keep socket open when client supports it) */ soap_closesock(ctx); } while (ctx->keep_alive); err = ctx->error; /* clean up */ soap_destroy(ctx); soap_end(ctx); soap_free(ctx); return err; } /* Don't need a namespace table. We put an empty one here to avoid link errors */ struct Namespace namespaces[] = { {NULL, NULL} }; gsoap-2.8.91/gsoap/samples/xml-rpc-json/xml-rpc-weblogs.cpp0000644000175000017500000000527313525245163023135 0ustar ellertellert/* xml-rpc-weblogs.cpp XML-RPC weblogUpdates.ping example in C++ See http://xmlrpc.scripting.com/weblogsCom for more details. Requires xml-rpc.h and xml-rpc.cpp Compile: soapcpp2 xml-rpc.h cc xml-rpc-weblogs.cpp xml-rpc.cpp xml-rpc-io.cpp stdsoap2.cpp soapC.cpp -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "xml-rpc-io.h" using namespace std; #define ENDPOINT "http://rpc.weblogs.com/RPC2" int main() { soap *ctx = soap_new1(SOAP_C_UTFSTRING); // define the weblogsUpdates.ping method methodCall ping(ctx, ENDPOINT, "weblogUpdates.ping"); // set the two parameters of the method ping[0] = "Scripting News"; ping[1] = "http://www.scripting.com/"; // make the call params output = ping(); // error? if (ping.error()) soap_print_fault(ctx, stderr); else if (output.empty()) cout << ping.fault() << endl; else { if (output[0].is_struct()) { if (output[0]["flerror"].is_false()) cout << "Success:" << endl; else cout << "Failure:" << endl; cout << output[0]["message"] << endl; } else cout << "Message format error:" << endl << output[0] << endl; } // delete all data soap_destroy(ctx); soap_end(ctx); // free context soap_free(ctx); return 0; } /* Don't need a namespace table. We put an empty one here to avoid link errors */ struct Namespace namespaces[] = { {NULL, NULL} }; gsoap-2.8.91/gsoap/samples/xml-rpc-json/xml-rpc-io.cpp0000644000175000017500000000441113525245163022073 0ustar ellertellert/* xml-rpc-io.cpp XML-RPC io stream operations on XML-RPC values -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifdef JSON_NAMESPACE # include "jsonH.h" #else # include "soapH.h" #endif #ifdef JSON_NAMESPACE using namespace json; #endif std::ostream& operator<<(std::ostream& o, const struct value& v) { if (v.soap) { std::ostream *os = v.soap->os; v.soap->os = &o; soap_write_value(v.soap, &v); v.soap->os = os; } else { soap *ctx = soap_new(); ctx->os = &o; soap_write_value(ctx, &v); soap_destroy(ctx); soap_end(ctx); soap_free(ctx); } return o; } std::istream& operator>>(std::istream& i, struct value& v) { if (!v.soap) v.soap = soap_new(); std::istream *is = v.soap->is; v.soap->is = &i; if (soap_read_value(v.soap, &v)) { soap_sprint_fault(v.soap, v.soap->msgbuf, sizeof(v.soap->msgbuf)); v["$error"] = v.soap->msgbuf; v["$code"] = v.soap->error; } v.soap->is = is; return i; } gsoap-2.8.91/gsoap/samples/xml-rpc-json/json-currentTimeServer.cpp0000644000175000017500000001236613525245163024553 0ustar ellertellert/* json-currentTimeServer.cpp JSON currenTime server (C++ version) CGI or stand-alone multi-threaded server Returns JSON message with current time to client. Compile: soapcpp2 -CSL xml-rpc.h c++ -o json-currentTimeServer json-currentTimeServer.cpp json.cpp xml-rpc.cpp stdsoap2.cpp soapC.cpp Install as CGI on Web server Or run as stand-alone server (e.g. on port 18000): ./json-currentTimeServer 18000 -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "json.h" #include "plugin/threads.h" using namespace std; int serve_request(soap*); int main(int argc, char **argv) { soap *ctx = soap_new1(SOAP_C_UTFSTRING); if (argc < 2) { // process CGI request value request(ctx); if (soap_begin_recv(ctx) || json_recv(ctx, request) || soap_end_recv(ctx)) { json_send_fault(ctx); } else { // if the name matches: set response to time, else error if (request.is_string() && !strcmp(request, "getCurrentTime")) { value response(ctx); response = (ULONG64)time(0); // ULONG64 stores a dateTime value in seconds // set the http content type ctx->http_content = "application/json; charset=utf-8"; // send the response if (soap_response(ctx, SOAP_FILE) || json_send(ctx, response) || soap_end_send(ctx)) soap_print_fault(ctx, stderr); } else { // JSON error as per Google JSON Style Guide json_send_error(ctx, 400, "Wrong method", request); } } soap_destroy(ctx); soap_end(ctx); soap_free(ctx); return 0; } int port = atoi(argv[1]); if (!soap_valid_socket(soap_bind(ctx, NULL, port, 100))) { soap_print_fault(ctx, stderr); exit(1); } soap_set_mode(ctx, SOAP_IO_KEEPALIVE); // enable HTTP keep-alive, which is optional ctx->send_timeout = 10; // 10 sec max socket idle time ctx->recv_timeout = 10; // 10 sec max socket idle time ctx->transfer_timeout = 30; // 30 sec message transfer timeout while (1) { THREAD_TYPE tid; if (soap_valid_socket(soap_accept(ctx))) { struct soap *cpy = soap_copy(ctx); if (!cpy) soap_closesock(ctx); else while (THREAD_CREATE(&tid, (void*(*)(void*))&serve_request, (void*)cpy)) sleep(1); } else if (ctx->errnum == 0) // accept timed out, quit looping { break; } else // accept failed, try again after 5 seconds { soap_print_fault(ctx, stderr); sleep(5); } } soap_destroy(ctx); soap_end(ctx); soap_free(ctx); return 0; } int serve_request(soap* ctx) { THREAD_DETACH(THREAD_ID); // HTTP keep-alive max number of iterations unsigned int k = ctx->max_keep_alive; value request(ctx); do { if (ctx->max_keep_alive > 0 && !--k) ctx->keep_alive = 0; // receive JSON request if (soap_begin_recv(ctx) || json_recv(ctx, request) || soap_end_recv(ctx)) { json_send_fault(ctx); } else { if (request.is_string() && !strcmp(request, "getCurrentTime")) { value response(ctx); response = (ULONG64)time(0); // ULONG64 stores a dateTime value in seconds ctx->http_content = "application/json; charset=utf-8"; if (soap_response(ctx, SOAP_FILE) || json_send(ctx, response) || soap_end_send(ctx)) soap_print_fault(ctx, stderr); } else { // JSON error as per Google JSON Style Guide json_send_error(ctx, 400, "Wrong method", request); } } // close (keep-alive may keep socket open when client supports it) soap_closesock(ctx); } while (ctx->keep_alive); int err = ctx->error; // clean up soap_destroy(ctx); soap_end(ctx); soap_free(ctx); return err; } /* Don't need a namespace table. We put an empty one here to avoid link errors */ struct Namespace namespaces[] = { {NULL, NULL} }; gsoap-2.8.91/gsoap/samples/xml-rpc-json/json-currentTime.cpp0000644000175000017500000000474713525245163023370 0ustar ellertellert/* json-currentTime.cpp JSON currenTime (C++ version) Prints current time. Compile: soapcpp2 -CSL xml-rpc.h c++ json-currentTime.cpp xml-rpc.cpp json.cpp stdsoap2.cpp soapC.cpp -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2012, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "json.h" using namespace std; int main() { soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); ctx->send_timeout = 5; // 5 sec max socket send idle time ctx->recv_timeout = 5; // 5 sec max socket recv idle time ctx->transfer_timeout = 30; // 30 sec message transfer timeout value request(ctx), response(ctx); // make the JSON REST POST request and get response request = "getCurrentTime"; if (json_call(ctx, "http://www.cs.fsu.edu/~engelen/currentTimeJSON.cgi", request, response)) soap_print_fault(ctx, stderr); else if (response.is_string()) // JSON does not support a dateTime value: this is a string cout << "Time = " << response << endl; else // error? cout << "Error: " << response << endl; // clean up soap_destroy(ctx); soap_end(ctx); soap_free(ctx); return 0; } /* Don't need a namespace table. We put an empty one here to avoid link errors */ struct Namespace namespaces[] = { {NULL, NULL} }; gsoap-2.8.91/gsoap/samples/xml-rpc-json/xml-rpc.cpp0000644000175000017500000007427413525245163021504 0ustar ellertellert/* xml-rpc.cpp C++ API for XML-RPC/JSON data management Note: XML-RPC declarations are located in the gSOAP header file xml-rpc.h, which is used to generate XML-RPC serializers (soapH.h, soapStub.h, and soapC.cpp) with: $ soapcpp2 -CSL xml-rpc.h To generate the soap_dup_value deep copy function use -Ec: $ soapcpp2 -Ec -CSL xml-rpc.h Iterators to walk the tree data are declared in xml-rpc-iters.h IO stream operations for XML-RPC data are declared in xml-rpc-io.h For more information please visit: http://www.genivia.com/doc/xml-rpc-json/html/ -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifdef JSON_NAMESPACE # include "jsonH.h" # define SOAP_TYPE__boolean SOAP_TYPE_json__boolean # define SOAP_TYPE__i4 SOAP_TYPE_json__i4 # define SOAP_TYPE__int SOAP_TYPE_json__int # define SOAP_TYPE__double SOAP_TYPE_json__double # define SOAP_TYPE__dateTime_DOTiso8601 SOAP_TYPE_json__dateTime_DOTiso8601 # define SOAP_TYPE__string SOAP_TYPE_json__string # define SOAP_TYPE__array SOAP_TYPE_json__array # define SOAP_TYPE__struct SOAP_TYPE_json__struct # define SOAP_TYPE__base64 SOAP_TYPE_json__base64 # define SOAP_TYPE__rawdata SOAP_TYPE_json__rawdata #else # include "soapH.h" #endif #ifdef JSON_NAMESPACE namespace json { #endif static char * s_copy_l(struct soap *soap, const char *s); static char * s_copy_l(struct soap *soap, const wchar_t *s); static int size2k(int n); value::value() { soap_default_value(NULL, this); } value::value(const value& v) { __type = v.__type; ref = v.ref; __any = v.__any; soap = v.soap; } value::value(struct soap *soap) { soap_default_value(soap, this); } value::value(struct soap *soap, bool b) { soap_default_value(soap, this); *this = b; } value::value(struct soap *soap, _double d) { soap_default_value(soap, this); *this = d; } value::value(struct soap *soap, _i4 n) { soap_default_value(soap, this); *this = n; } value::value(struct soap *soap, _int n) { soap_default_value(soap, this); *this = n; } value::value(struct soap *soap, ULONG64 t) { soap_default_value(soap, this); *this = t; } value::value(struct soap *soap, const char *s) { soap_default_value(soap, this); *this = s; } value::value(struct soap *soap, const std::string& s) { soap_default_value(soap, this); *this = s; } value::value(struct soap *soap, const wchar_t *s) { soap_default_value(soap, this); *this = s; } value::value(struct soap *soap, const std::wstring& s) { soap_default_value(soap, this); *this = s; } value::value(struct soap *soap, const _array& a) { soap_default_value(soap, this); *this = a; } value::value(struct soap *soap, const _struct& r) { soap_default_value(soap, this); *this = r; } value::value(struct soap *soap, const _base64& b) { soap_default_value(soap, this); *this = b; } value::value(struct soap* soap, const _rawdata& b) { soap_default_value(soap, this); *this = b; } value::operator bool() const { return this->is_true(); } value::operator _i4() const { if (__type == SOAP_TYPE__boolean) return (_i4)*(_boolean*)ref; if (__type == SOAP_TYPE__i4) return (_i4)*(_i4*)ref; if (__type == SOAP_TYPE__int) return (_i4)*(_int*)ref; if (__type == SOAP_TYPE__double) return (_i4)(*(_double*)ref); int r = 0; const char *s = *this; soap_s2int(soap, s, &r); soap->error = SOAP_OK; return r; } value::operator _int() const { if (__type == SOAP_TYPE__boolean) return (_int)*(_boolean*)ref; if (__type == SOAP_TYPE__i4) return (_int)*(_i4*)ref; if (__type == SOAP_TYPE__int) return (_int)*(_int*)ref; if (__type == SOAP_TYPE__double) return (_int)(*(_double*)ref); LONG64 r = 0; const char *s = *this; soap_s2LONG64(soap, s, &r); soap->error = SOAP_OK; return r; } value::operator _double() const { if (__type == SOAP_TYPE__boolean) return (_double)*(_boolean*)ref; if (__type == SOAP_TYPE__i4) return (_double)*(_i4*)ref; if (__type == SOAP_TYPE__int) return (_double)*(_int*)ref; if (__type == SOAP_TYPE__double) return (_double)*(_double*)ref; double r = 0.0; const char *s = *this; soap_s2double(soap, s, &r); soap->error = SOAP_OK; return r; } value::operator char*() const { if (__type == SOAP_TYPE__string || __type == SOAP_TYPE__dateTime_DOTiso8601 || __type == SOAP_TYPE__rawdata) return (char*)ref; if (__type == SOAP_TYPE__boolean) return (char*)(*(_boolean*)ref ? "true" : "false"); if (__type == SOAP_TYPE__i4) return (char*)soap_strdup(soap, soap_int2s(soap, (int)*(_i4*)ref)); if (__type == SOAP_TYPE__int) return (char*)soap_strdup(soap, soap_LONG642s(soap, (LONG64)*(_int*)ref)); if (__type == SOAP_TYPE__double) return (char*)soap_strdup(soap, soap_double2s(soap, (double)*(_double*)ref)); if (__type == SOAP_TYPE__base64) return (char*)soap_s2base64(soap, (unsigned char*)((_base64*)ref)->ptr(), NULL, ((_base64*)ref)->size()); if (__type == SOAP_TYPE__rawdata) return (char*)soap_strdup(soap, (const char*)((_rawdata*)ref)->ptr()); if (__any) return (char*)__any; if (!__type) return (char*)"null"; return (char*)""; } value::operator std::string() const { const char *s = *this; return std::string(s); } value::operator wchar_t*() const { const char *s = *this; wchar_t *t = NULL; soap_s2wchar(soap, s, &t, 1, 0, -1, NULL); soap->error = SOAP_OK; return t; } value::operator std::wstring() const { const char *s = *this; wchar_t *t = NULL; soap_s2wchar(soap, s, &t, 1, 0, -1, NULL); soap->error = SOAP_OK; return std::wstring(t); } value::operator ULONG64() const { time_t t = 0; if (__type == SOAP_TYPE__string || __type == SOAP_TYPE__dateTime_DOTiso8601 || __type == SOAP_TYPE__rawdata) { if (soap_s2dateTime(soap, (const char*)ref, &t)) { soap->error = SOAP_OK; return 0; } } return (ULONG64)t; } value::operator _array&() { if (__type == SOAP_TYPE__array) return *(_array*)ref; _array *a = soap_new__array(soap); if (!a) throw std::bad_alloc(); soap_default__array(soap, a); (*a)[0] = *this; return *a; } value::operator const _array&() const { if (__type == SOAP_TYPE__array) return *(const _array*)ref; _array *a = soap_new__array(soap); if (!a) throw std::bad_alloc(); soap_default__array(soap, a); (*a)[0] = *this; return *a; } value::operator _struct&() { if (__type == SOAP_TYPE__struct) return *(_struct*)ref; _struct *r = soap_new__struct(soap); if (!r) throw std::bad_alloc(); soap_default__struct(soap, r); return *r; } value::operator const _struct&() const { if (__type == SOAP_TYPE__struct) return *(const _struct*)ref; _struct *r = soap_new__struct(soap); if (!r) throw std::bad_alloc(); soap_default__struct(soap, r); return *r; } value::operator _base64&() { if (__type == SOAP_TYPE__base64) return *(_base64*)ref; _base64 *base64 = soap_new__base64(soap); if (base64) { soap_default__base64(soap, base64); char *s = *this; base64->__ptr = (unsigned char*)s; base64->__size = (int)strlen(s); } return *base64; } value::operator const _base64&() const { if (__type == SOAP_TYPE__base64) return *(const _base64*)ref; _base64 *base64 = soap_new__base64(soap); if (base64) { soap_default__base64(soap, base64); const char *s = *this; base64->__ptr = (unsigned char*)s; base64->__size = (int)strlen(s); } return *base64; } value::operator _rawdata&() { if (__type == SOAP_TYPE__rawdata) return *(_rawdata*)ref; _rawdata *rawdata = soap_new__rawdata(soap); if (rawdata) { soap_default__rawdata(soap, rawdata); char *s = *this; rawdata->__ptr = (unsigned char*)s; rawdata->__size = (int)strlen(s); } return *rawdata; } value::operator const _rawdata&() const { if (__type == SOAP_TYPE__rawdata) return *(const _rawdata*)ref; _rawdata *rawdata = soap_new__rawdata(soap); if (rawdata) { soap_default__rawdata(soap, rawdata); char *s = *this; rawdata->__ptr = (unsigned char*)s; rawdata->__size = (int)strlen(s); } return *rawdata; } value& value::operator[](int n) { if (__type == SOAP_TYPE__struct) return ((_struct*)ref)->operator[](n); _array& a = *this; __type = SOAP_TYPE__array; __any = NULL; ref = &a; return a[n]; } value& value::operator[](const char *s) { _struct& r = *this; __type = SOAP_TYPE__struct; __any = NULL; ref = &r; return r[s]; } value& value::operator[](const std::string& s) { _struct& r = *this; __type = SOAP_TYPE__struct; __any = NULL; ref = &r; return r[s.c_str()]; } value& value::operator[](const wchar_t *s) { _struct& r = *this; __type = SOAP_TYPE__struct; __any = NULL; ref = &r; return r[s]; } value& value::operator[](const std::wstring& s) { _struct& r = *this; __type = SOAP_TYPE__struct; __any = NULL; ref = &r; return r[s.c_str()]; } const value& value::operator[](int n) const { if (__type == SOAP_TYPE__struct) return ((const _struct*)ref)->operator[](n); if (__type == SOAP_TYPE__array) return ((const _array*)ref)->operator[](n); return *new_value(soap); } const value& value::operator[](const char *s) const { if (__type == SOAP_TYPE__struct) return ((const _struct*)ref)->operator[](s); return *new_value(soap); } const value& value::operator[](const std::string& s) const { if (__type == SOAP_TYPE__struct) return ((const _struct*)ref)->operator[](s.c_str()); return *new_value(soap); } const value& value::operator[](const wchar_t *s) const { if (__type == SOAP_TYPE__struct) return ((const _struct*)ref)->operator[](s); return *new_value(soap); } const value& value::operator[](const std::wstring& s) const { if (__type == SOAP_TYPE__struct) return ((const _struct*)ref)->operator[](s.c_str()); return *new_value(soap); } bool value::operator=(bool b) { __type = SOAP_TYPE__boolean; __any = NULL; ref = soap_malloc(soap, sizeof(_boolean)); if (ref) *(_boolean*)ref = (_boolean)b; return b; } _i4 value::operator=(_i4 n) { __type = SOAP_TYPE__i4; __any = NULL; ref = soap_malloc(soap, sizeof(_i4)); if (ref) *(_i4*)ref = n; return n; } _int value::operator=(_int n) { __type = SOAP_TYPE__int; __any = NULL; ref = soap_malloc(soap, sizeof(_int)); if (ref) *(_int*)ref = n; return n; } _double value::operator=(_double d) { __type = SOAP_TYPE__double; __any = NULL; ref = soap_malloc(soap, sizeof(_double)); if (ref) *(_double*)ref = (_double)d; return d; } const char * value::operator=(const char *s) { __type = SOAP_TYPE__string; __any = NULL; ref = s_copy_l(soap, s); return s; } char * value::operator=(char *s) { __type = SOAP_TYPE__string; __any = NULL; ref = s_copy_l(soap, s); return s; } char * value::operator=(const std::string& s) { __type = SOAP_TYPE__string; __any = NULL; ref = s_copy_l(soap, s.c_str()); return (char*)ref; } const char * value::operator=(const wchar_t *s) { __type = SOAP_TYPE__string; __any = NULL; ref = s_copy_l(soap, s); return (char*)ref; } char * value::operator=(wchar_t *s) { __type = SOAP_TYPE__string; __any = NULL; ref = s_copy_l(soap, s); return (char*)ref; } char * value::operator=(const std::wstring& s) { __type = SOAP_TYPE__string; __any = NULL; ref = s_copy_l(soap, s.c_str()); return (char*)ref; } ULONG64 value::operator=(ULONG64 t) { __type = SOAP_TYPE__dateTime_DOTiso8601; __any = NULL; ref = soap_strdup(soap, soap_dateTime2s(soap, (time_t)t)); return t; } _array& value::operator=(const _array& a) { __type = SOAP_TYPE__array; __any = NULL; ref = soap_new__array(soap); if (!ref) throw std::bad_alloc(); soap_default__array(soap, (_array*)ref); *(_array*)ref = a; return *(_array*)ref; } _struct& value::operator=(const _struct& r) { __type = SOAP_TYPE__struct; __any = NULL; ref = soap_new__struct(soap); if (!ref) throw std::bad_alloc(); soap_default__struct(soap, (_struct*)ref); *(_struct*)ref = r; return *(_struct*)ref; } _base64& value::operator=(const _base64& b) { __type = SOAP_TYPE__base64; __any = NULL; ref = soap_new__base64(soap); if (!ref) throw std::bad_alloc(); soap_default__base64(soap, (_base64*)ref); *(_base64*)ref = b; return *(_base64*)ref; } _rawdata& value::operator=(const _rawdata& b) { __type = SOAP_TYPE__rawdata; __any = NULL; ref = soap_new__rawdata(soap); if (!ref) throw std::bad_alloc(); soap_default__rawdata(soap, (_rawdata*)ref); *(_rawdata*)ref = b; return *(_rawdata*)ref; } void value::size(int n) { if (__type == SOAP_TYPE__array) { ((_array*)ref)->size(n); } else { __type = SOAP_TYPE__array; __any = NULL; ref = soap_new__array(soap); if (!ref) throw std::bad_alloc(); soap_default__array(soap, (_array*)ref); ((_array*)ref)->size(n); } } int value::size() const { if (__type == SOAP_TYPE__array) return ((_array*)ref)->size(); if (__type == SOAP_TYPE__struct) return ((_struct*)ref)->size(); return 0; } bool value::empty() const { if (__type == SOAP_TYPE__array) return ((_array*)ref)->empty(); if (__type == SOAP_TYPE__struct) return ((_struct*)ref)->empty(); return true; } int value::nth(int n) const { if (__type == SOAP_TYPE__array) { if (n < 0) return n + size(); if (n < size()) return n; } return -1; } int value::nth(const char *s) const { if (s != NULL && __type == SOAP_TYPE__struct) { const _struct *r = (const _struct*)ref; for (int i = 0; i < r->__size; i++) if (!strcmp(r->member[i].name, s)) return i; } return -1; } int value::nth(const wchar_t *s) const { if (s == NULL) return -1; const char *t = soap_wchar2s(NULL, s); int i = nth(t); free((void*)t); return i; } bool value::has(int n) const { if (__type == SOAP_TYPE__array) return n < 0 ? n + size() >= 0 : n < size(); return false; } bool value::has(const char *s) const { if (s != NULL && __type == SOAP_TYPE__struct) { const _struct *r = (const _struct*)ref; for (int i = 0; i < r->__size; i++) if (!strcmp(r->member[i].name, s)) return true; } return false; } bool value::has(const wchar_t *s) const { if (s == NULL) return false; const char *t = soap_wchar2s(NULL, s); bool b = has(t); free((void*)t); return b; } bool value::is_null() const { return __type == 0 && !(__any && *__any); } bool value::is_bool() const { return __type == SOAP_TYPE__boolean; } bool value::is_true() const { return __type == SOAP_TYPE__boolean && (bool)*(_boolean*)ref == true; } bool value::is_false() const { return __type == SOAP_TYPE__boolean && (bool)*(_boolean*)ref == false; } bool value::is_int() const { return __type == SOAP_TYPE__i4 || __type == SOAP_TYPE__int; } bool value::is_double() const { return __type == SOAP_TYPE__double; } bool value::is_number() const { return __type == SOAP_TYPE__i4 || __type == SOAP_TYPE__int || __type == SOAP_TYPE__double; } bool value::is_string() const { return __type == SOAP_TYPE__string || (__any && *__any); } bool value::is_dateTime() const { return __type == SOAP_TYPE__dateTime_DOTiso8601; } bool value::is_array() const { return __type == SOAP_TYPE__array; } bool value::is_struct() const { return __type == SOAP_TYPE__struct; } bool value::is_base64() const { return __type == SOAP_TYPE__base64; } bool value::is_rawdata() const { return __type == SOAP_TYPE__rawdata; } value_iterator value::begin() { if (__type == SOAP_TYPE__struct) return value_iterator(this, ((_struct*)ref)->member); return value_iterator(this); } value_iterator value::end() { if (__type == SOAP_TYPE__struct) return value_iterator(this, ((_struct*)ref)->member + ((_struct*)ref)->__size); if (__type == SOAP_TYPE__array) return value_iterator(this, ((_array*)ref)->data.__size); return value_iterator(); } bool value_const_iterator::operator==(const value_iterator& that) const { if (_value == NULL) return that._value == NULL; if (that._value == NULL) return _value == NULL; if (_value->__type != that._value->__type) return false; if (_value->__type == SOAP_TYPE__struct) return _member == that._member; if (_value->__type == SOAP_TYPE__array) return (((_array*)_value->ref)->data.value + _index) == (((_array*)that._value->ref)->data.value + that._index); return _value == that._value; } static char * s_copy_l(struct soap *soap, const char *s) { return soap_strdup(soap, s); } static char * s_copy_l(struct soap *soap, const wchar_t *s) { return (char*)soap_wchar2s(soap, s); } _struct::_struct() { soap_default__struct(NULL, this); } _struct::_struct(const _struct& r) { __size = r.__size; member = r.member; soap = r.soap; } _struct::_struct(struct soap *soap) { soap_default__struct(soap, this); } _struct::_struct(struct soap *soap, int size) { soap_default__struct(soap, this); if (size > 0) { __size = size; member = soap_new_member(soap, __size); if (!member) throw std::bad_alloc(); for (int i = 0; i < __size; i++) soap_default_member(soap, &member[i]); } } bool _struct::empty() const { return __size == 0; } int _struct::size() const { return __size; } value& _struct::operator[](int n) const { if (member == NULL || __size == 0) return *new_value(soap); if (n < 0) { n += __size; if (n < 0) n = 0; } if (n >= __size) n = __size - 1; return member[n].value; } value& _struct::operator[](const char *s) { int i = 0; if (s == NULL) s = ""; if (member == NULL) { int newsize = size2k(__size = 1); member = soap_new_member(soap, newsize); if (!member) throw std::bad_alloc(); for (i = 0; i < newsize; i++) soap_default_member(soap, &member[i]); } else { for (i = 0; i < __size; i++) if (!strcmp(member[i].name, s)) return member[i].value; int oldsize = size2k(__size); int newsize = size2k(++__size); if (oldsize < newsize) { struct member *newmember = soap_new_member(soap, newsize); if (!newmember) throw std::bad_alloc(); for (i = 0; i < oldsize; i++) newmember[i] = member[i]; for (; i < newsize; i++) soap_default_member(soap, &newmember[i]); (void)soap_unlink(soap, member); delete[] member; member = newmember; } } i = __size - 1; member[i].name = soap_strdup(soap, s); soap_default_value(soap, &member[i].value); return member[i].value; } value& _struct::operator[](const wchar_t *s) { const char *t = soap_wchar2s(NULL, s); value& r = operator[](t); free((void*)t); return r; } const value& _struct::operator[](const char *s) const { if (s == NULL) s = ""; if (member != NULL) for (int i = 0; i < __size; i++) if (!strcmp(member[i].name, s)) return member[i].value; return *new_value(soap); } const value& _struct::operator[](const wchar_t *s) const { const char *t = soap_wchar2s(NULL, s); const value& r = operator[](t); free((void*)t); return r; } _struct_iterator _struct::begin() const { return _struct_iterator(this); } _struct_iterator _struct::end() const { _struct_iterator i(this); i += __size; return i; } bool _struct_const_iterator::operator==(const _struct_iterator& that) const { return _member == that._member; } _array::_array() { soap_default__array(NULL, this); } _array::_array(const _array& a) { data = a.data; soap = a.soap; } _array::_array(struct soap *soap) { soap_default__array(soap, this); } _array::_array(struct soap *soap, int size) { soap_default__array(soap, this); if (size > 0) { data.__size = size; data.value = soap_new_value(soap, data.__size); if (!data.value) throw std::bad_alloc(); for (int i = 0; i < data.__size; i++) soap_default_value(soap, &data.value[i]); } } bool _array::empty() const { return data.__size == 0; } int _array::size() const { return data.__size; } void _array::size(int n) { if (n < 0) n += data.__size; if (n >= 0) { if (data.__size >= n) data.__size = n; else (void)(*this)[n - 1]; } } value& _array::operator[](int n) { if (n < 0) { n += data.__size; if (n < 0) n = 0; } if (data.value == NULL) { int newsize = size2k(data.__size = n + 1); data.value = soap_new_value(soap, newsize); if (!data.value) throw std::bad_alloc(); for (int i = 0; i < newsize; i++) soap_default_value(soap, &data.value[i]); } else if (data.__size <= n) { int oldsize = size2k(data.__size); int newsize = size2k(data.__size = n + 1); if (oldsize < newsize) { value *newvalue = soap_new_value(soap, newsize); if (!newvalue) throw std::bad_alloc(); int i; for (i = 0; i < oldsize; i++) newvalue[i] = data.value[i]; for (; i < newsize; i++) soap_default_value(soap, &newvalue[i]); (void)soap_unlink(soap, data.value); delete[] data.value; data.value = newvalue; } } return data.value[n]; } const value& _array::operator[](int n) const { if (n < 0) { n += data.__size; if (n < 0) n = 0; } if (data.value != NULL && data.__size > n) return data.value[n]; return *new_value(soap); } _array_iterator _array::begin() const { return _array_iterator(this); } _array_iterator _array::end() const { _array_iterator i(this); i += data.__size; return i; } bool _array_const_iterator::operator==(const _array_iterator& that) const { return _value == that._value; } _base64::_base64() { } _base64::_base64(struct soap *soap) { soap_default__base64(soap, this); } _base64::_base64(struct soap *soap, int n, unsigned char *p) { soap_default__base64(soap, this); __size = n; __ptr = p; } int _base64::size() const { return __size; } unsigned char * _base64::ptr() { return __ptr; } void _base64::size(int n) { __size = n; } void _base64::ptr(unsigned char *p) { __ptr = p; } _rawdata::_rawdata() { } _rawdata::_rawdata(struct soap *soap) { soap_default__rawdata(soap, this); } _rawdata::_rawdata(struct soap *soap, char *p) { soap_default__rawdata(soap, this); __size = (int)strlen(p); __ptr = (unsigned char*)p; } _rawdata::_rawdata(struct soap *soap, int n, char *p) { soap_default__rawdata(soap, this); __size = n; __ptr = (unsigned char*)p; } int _rawdata::size() const { return __size; } char * _rawdata::ptr() { return (char*)__ptr; } void _rawdata::size(int n) { __size = n; } void _rawdata::ptr(char *p) { __ptr = (unsigned char*)p; } params::params() { } params::params(struct soap *soap) { soap_default_params(soap, this); } params::params(struct soap *soap, int size) { soap_default_params(soap, this); if (size > 0) { __size = size; param = soap_new_param(soap, __size); if (!param) throw std::bad_alloc(); for (int i = 0; i < __size; i++) soap_default_param(soap, ¶m[i]); } } bool params::empty() const { return __size == 0; } int params::size() const { return __size; } value& params::operator[](int n) { if (n < 0) { n += __size; if (n < 0) n = 0; } if (param == NULL) { int newsize = size2k(__size = n + 1); param = soap_new_param(soap, newsize); if (!param) throw std::bad_alloc(); for (int i = 0; i < newsize; i++) soap_default_param(soap, ¶m[i]); } else if (__size <= n) { int oldsize = size2k(__size); int newsize = size2k(__size = n + 1); if (oldsize < newsize) { struct param *newparam = soap_new_param(soap, newsize); if (!param) throw std::bad_alloc(); int i; for (i = 0; i < oldsize; i++) newparam[i] = param[i]; for (; i < newsize; i++) soap_default_param(soap, &newparam[i]); (void)soap_unlink(soap, param); delete[] param; param = newparam; } } return param[n].value; } const value& params::operator[](int n) const { if (n < 0) { n += __size; if (n < 0) n = 0; } if (param != NULL && __size > n) return param[n].value; return *new_value(soap); } params_iterator params::begin() const { return params_iterator(this); } params_iterator params::end() const { params_iterator i(this); i += __size; return i; } bool params_const_iterator::operator==(const params_iterator& that) const { return _param == that._param; } methodCall::methodCall() { } methodCall::methodCall(struct soap *soap) { soap_default_methodCall(soap, this); } methodCall::methodCall(struct soap *soap, const char *endpoint, const char *name) { soap_default_methodCall(soap, this); methodName = soap_strdup(soap, name); methodEndpoint = soap_strdup(soap, endpoint); methodResponse = NULL; } value& methodCall::operator[](int n) { return params[n]; } const value& methodCall::operator[](int n) const { return params[n]; } struct params& methodCall::operator()() { if (send() == SOAP_OK) { if (methodResponse == NULL) methodResponse = soap_new_methodResponse(soap); if (methodResponse == NULL) throw std::bad_alloc(); if (methodResponse->recv() != SOAP_OK) methodResponse = NULL; } else methodResponse = NULL; soap_closesock(soap); if (methodResponse && methodResponse->params) return *methodResponse->params; struct params *params = soap_new_params(soap); if (!params) throw std::bad_alloc(); soap_default_params(soap, params); return *params; } struct params& methodCall::operator()(const struct params& args) { /* parameters */ params = args; /* invoke */ return (*this)(); } struct params& methodCall::response() { if (methodResponse == NULL) { methodResponse = soap_new_methodResponse(soap); if (!methodResponse) throw std::bad_alloc(); soap_default_methodResponse(soap, methodResponse); } if (methodResponse->params == NULL) { methodResponse->params = soap_new_params(soap); if (!methodResponse->params) throw std::bad_alloc(); soap_default_params(soap, methodResponse->params); } return *methodResponse->params; } value& methodCall::fault() { if (methodResponse) return methodResponse->get_fault(); return *new_value(soap); } const char * methodCall::name() const { if (methodName) return methodName; return ""; } int methodCall::error() const { return soap->error; } int methodCall::send() { /* no namespaces */ soap->namespaces = NULL; /* no SOAP encodingStyle */ soap->encodingStyle = NULL; /* content length (needed for HTTP non-chunked) */ soap_begin_count(soap); if (soap->mode & SOAP_IO_LENGTH) soap_put_methodCall(soap, this, "methodCall", NULL); soap_end_count(soap); /* connect and send request */ if (soap_connect(soap, methodEndpoint, NULL) || soap_put_methodCall(soap, this, "methodCall", NULL) || soap_end_send(soap)) return soap->error; return SOAP_OK; } int methodCall::recv() { if (soap_begin_recv(soap) || !soap_get_methodCall(soap, this, "methodCall", NULL) || soap_end_recv(soap)) return soap->error; return SOAP_OK; } methodResponse::methodResponse() { } methodResponse::methodResponse(struct soap *soap) { soap_default_methodResponse(soap, this); } value& methodResponse::operator[](int n) { if (params == NULL) { params = soap_new_params(soap); if (!params) throw std::bad_alloc(); soap_default_params(soap, params); } return (*params)[n]; } const value& methodResponse::operator[](int n) const { if (params != NULL) return (*params)[n]; return *new_value(soap); } value& methodResponse::get_fault() { if (fault == NULL) { fault = soap_new_fault(soap); if (!fault) throw std::bad_alloc(); soap_default_fault(soap, fault); } return fault->value; } value& methodResponse::set_fault(const char *s) { value *value = new_value(soap); *value = s; return get_fault() = *value; } value& methodResponse::set_fault(value& v) { return get_fault() = v; } int methodResponse::send() { /* no namespaces */ soap->namespaces = NULL; /* no SOAP encodingStyle */ soap->encodingStyle = NULL; /* content length */ soap_begin_count(soap); if (soap->mode & SOAP_IO_LENGTH) soap_put_methodResponse(soap, this, "methodResponse", NULL); soap_end_count(soap); /* send response */ if (soap_response(soap, SOAP_OK) || soap_put_methodResponse(soap, this, "methodResponse", NULL) || soap_end_send(soap)) return soap->error; return SOAP_OK; } int methodResponse::recv() { if (soap_begin_recv(soap) || !soap_get_methodResponse(soap, this, "methodResponse", NULL) || soap_end_recv(soap)) return soap->error; return SOAP_OK; } static int size2k(int n) { int k = 2; while (k < n) k *= 2; return k; } value * new_value(struct soap *soap) { value *v = soap_new_value(soap); if (!v) throw std::bad_alloc(); return init_value(soap, v); } value * init_value(struct soap *soap, value *v) { if (v) soap_default_value(soap, v); return v; } #ifdef JSON_NAMESPACE } // namespace json #endif gsoap-2.8.91/gsoap/samples/xml-rpc-json/jsoncpp.cpp0000644000175000017500000024175013525245163021571 0ustar ellertellert/* jsoncpp.cpp A JSON C/C++ code generator for the gSOAP JSON API. 1. Take a JSON sample document and render it in JSON API code to construct this JSON value: echo '\ { "menu": {\ "id": "file",\ "value": "File",\ "popup": {\ "menuitem": [\ {"value": "New", "onclick": "CreateNewDoc()"},\ {"value": "Open", "onclick": "OpenDoc()"},\ {"value": "Close", "onclick": "CloseDoc()"}\ ]\ }\ }\ }' | ./jsoncpp #include "json.h" { struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); ctx->double_format = "%lG"; value x(ctx); x["menu"]["id"] = "file"; x["menu"]["value"] = "File"; x["menu"]["popup"]["menuitem"][0]["value"] = "New"; x["menu"]["popup"]["menuitem"][0]["onclick"] = "CreateNewDoc()"; x["menu"]["popup"]["menuitem"][1]["value"] = "Open"; x["menu"]["popup"]["menuitem"][1]["onclick"] = "OpenDoc()"; x["menu"]["popup"]["menuitem"][2]["value"] = "Close"; x["menu"]["popup"]["menuitem"][2]["onclick"] = "CloseDoc()"; std::cout << x << std::endl; soap_destroy(ctx); // delete objects soap_end(ctx); // delete data soap_free(ctx); // free context } 2. Take a JSON sample document and render it in JSON API code to inspect and extract values from JSON input data, by using the JSON sample document as a template: echo '\ { "menu": {\ "id": "file",\ "value": "File",\ "popup": {\ "menuitem": [\ {"value": "New", "onclick": "CreateNewDoc()"},\ {"value": "Open", "onclick": "OpenDoc()"},\ {"value": "Close", "onclick": "CloseDoc()"}\ ]\ }\ }\ }' | ./jsoncpp -i #include "json.h" { struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); ctx->double_format = "%lG"; value x(ctx); std::cin >> x; if (x.soap->error) exit(EXIT_FAILURE); // error parsing JSON #define USE_VAL(path, val) std::cout << path << " = " << val << std::endl if (x.has("menu")) { if (x["menu"].has("id")) USE_VAL("$.menu.id", x["menu"]["id"]); if (x["menu"].has("value")) USE_VAL("$.menu.value", x["menu"]["value"]); if (x["menu"].has("popup")) { if (x["menu"]["popup"].has("menuitem")) { for (int i3 = 0; i3 < x["menu"]["popup"]["menuitem"].size(); i3++) { if (x["menu"]["popup"]["menuitem"][i3].has("value")) USE_VAL("$.menu.popup.menuitem[].value", x["menu"]["popup"]["menuitem"][i3]["value"]); if (x["menu"]["popup"]["menuitem"][i3].has("onclick")) USE_VAL("$.menu.popup.menuitem[].onclick", x["menu"]["popup"]["menuitem"][i3]["onclick"]); } } } } std::cout << x << std::endl; soap_destroy(ctx); // delete objects soap_end(ctx); // delete data soap_free(ctx); // free context } 3. Take a JSONPath to generate a stand-alone application that filters JSON documents with a store of books to return their titles: ./jsoncpp -m -p'$.store.book[:].title' #include "json.h" struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; int main(int argc, char **argv) { struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); ctx->double_format = "%lG"; value x(ctx); std::cin >> x; if (x.soap->error) exit(EXIT_FAILURE); // error parsing JSON // $.store.book[:].title #define QUERY_YIELD(val) std::cout << val << std::endl if (x.has("store")) { if (x["store"].has("book")) { if (x["store"]["book"].is_array()) { int j, k = x["store"]["book"].size()-1; for (j = 0; j <= k; j += 1) { value& r = x["store"]["book"][j]; if (r.has("title")) { QUERY_YIELD(r["title"]); } } } } } soap_destroy(ctx); // delete objects soap_end(ctx); // delete data soap_free(ctx); // free context return 0; } 4. To build jsoncpp: cd gsoap/samples/xml-rpc-json soapcpp2 -CSL xml-rpc.h c++ -I../.. -o jsoncpp jsoncpp.cpp json.cpp xml-rpc.cpp soapC.cpp ../../stdsoap2.cpp 5. To compile and link jsoncpp-generated C++ code: ./jsoncpp -o myjson.cpp ... soapcpp2 -CSL xml-rpc.h c++ -I../.. -o myjson myjson.cpp json.cpp xml-rpc.cpp soapC.cpp ../../stdsoap2.cpp 6. To compile and link jsoncpp-generated C code: ./jsoncpp -c -o myjson.c ... soapcpp2 -c -CSL xml-rpc.h cc -I../.. -o myjson myjson.c json.c xml-rpc.c soapC.c ../../stdsoap2.c -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "json.h" #include #include #include struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; //////////////////////////////////////////////////////////////////////////////// // // Command line options // //////////////////////////////////////////////////////////////////////////////// static bool coutput = false; // -c generate C code instead of C++ static bool explain = false; // -e add explanatory comments to the generated code static bool genread = false; // -i generate code to inspect JSON node graph with data type checks static bool nocheck = false; // -k generate code to inspect JSON node graph directly without checks static bool genvars = false; // -l generate code for option -i to store values in local variables static bool genmain = false; // -m generate stand-alone code by adding main() static bool minimal = false; // -M generate minimal code unadorned with initialization and cleanup static bool optimal = false; // -O optimize code by factoring common indices when applicable static bool collect = false; // -y generate code that yields an array 'y' of JSONPath query results static const char *dform = NULL; // -f%fmt use %%fmt to format double floats, e.g. -f%%lG static const char *ofile = NULL; // -ofile save source code to file static const char *jpath = NULL; // -ppath generate JSONPath query code for 'path' static const char *jroot = "x"; // -rroot use 'root' instead of root value 'x' in the generated code static const char *jcode = NULL; // -xcode generate code that executes 'code' for each JSONPath query result static const char *ifile = NULL; // [infile] //////////////////////////////////////////////////////////////////////////////// // // Proto // //////////////////////////////////////////////////////////////////////////////// static void out_gen_c(soap*, value&, std::string, const std::string&, int); static void in_gen_c(soap*, value&, std::string, const std::string&, int); static void out_gen_cpp(soap*, value&, std::string, const std::string&, int); static void in_gen_cpp(soap*, value&, std::string, const std::string&, int); static void path_gen_c(soap*, const char*, std::string&, int, bool); static void path_exec_c(soap*, std::string&, int); static void path_gen_cpp(soap*, const char*, std::string&, int, bool); static void path_exec_cpp(soap*, std::string&, int); static std::ostream& indent(soap*, int); static std::string gen_ident(const std::string&, const char*); static std::string gen_counter(int); static std::string putstrname(const char*); static std::string putname(const char*); static std::string getname(const char**); //////////////////////////////////////////////////////////////////////////////// // // Pretty printer // //////////////////////////////////////////////////////////////////////////////// struct putstr { const char *str; int quote; putstr(const char *str, int quote = '"') : str(str), quote(quote) { } putstr(const std::string& str, int quote = '"') : str(str.c_str()), quote(quote) { } }; std::ostream& operator<<(std::ostream& os, const putstr& p) { if (p.str) { if (p.quote) os << (char)p.quote; for (const char *s = p.str; *s; ++s) { switch (*s) { case '\t': os << "\\t"; break; case '\n': os << "\\n"; break; case '\r': os << "\\r"; break; default: if (*s > 0 && *s < 0x10) os << "\\x0" << std::hex << *s << std::dec; else if (*s < 0x20 || *s >= 0x7f) os << "\\x" << std::hex << (*s & 0xff) << std::dec; else if (coutput && !p.quote && s[0] == '*' && s[1] == '/') os << "\\x2a"; else if (p.quote && s[0] == '?' && s[1] == '?') os << "?\\"; else { if (p.quote && (*s == '"' || *s == '\\')) os << "\\"; os << (char)*s; } } } if (p.quote) os << (char)p.quote; } else os << "NULL"; return os; } //////////////////////////////////////////////////////////////////////////////// // // jsoncpp main // //////////////////////////////////////////////////////////////////////////////// int main(int argc, char **argv) { if (argc >= 2) { for (int i = 1; i < argc; i++) { const char *a = argv[i]; if ((a[0] == '-' && a[1]) #ifdef WIN32 || a[0] == '/' #endif ) { bool f = true; while (f && *++a) { switch (*a) { case 'c': coutput = true; break; case 'e': explain = true; break; case 'f': a++; f = false; if (*a) dform = a; else if (i < argc) dform = argv[++i]; break; case 'i': genread = true; if (!ifile) ifile = "-"; break; case 'k': genread = true; nocheck = true; if (!ifile) ifile = "-"; break; case 'l': genvars = true; break; case 'm': genmain = true; break; case 'M': minimal = true; break; case 'O': optimal = true; break; case 'o': a++; f = false; if (*a) ofile = a; else if (i < argc) ofile = argv[++i]; break; case 'p': a++; f = false; if (*a) jpath = a; else if (i < argc) jpath = argv[++i]; break; case 'r': a++; f = false; if (*a) jroot = a; else if (i < argc) jroot = argv[++i]; break; case 'x': a++; f = false; if (*a) jcode = a; else if (i < argc) jcode = argv[++i]; break; case 'y': collect = true; break; case '?': case 'h': fprintf(stderr, "Usage: jsoncpp [-c] [-e] [-f%%fmt] [-h] [-i] [-l] [-m] [-M] [-O] [-ofile] [-ppath] [-rroot] [-xcode] [-y] [infile]\n\n" "-c generate C code instead of C++\n" "-e add explanatory comments to the generated code\n" "-f%%fmt use %%fmt to format double floats, e.g. -f%%lG\n" "-h display help message\n" "-i generate code to inspect node graph parsed from JSON input\n" "-l generate code for option -i to store values in local variables\n" "-m generate stand-alone code by adding main()\n" "-M generate minimal code unadorned with initialization and cleanup\n" "-O optimize code by factoring common indices when applicable\n" "-ofile save source code to file\n" "-ppath generate JSONPath query code for 'path'\n" "-rroot use 'root' instead of root value 'x' in the generated code\n" "-xcode generate code that executes 'code' for each JSONPath query result\n" "-y generate code that yields an array 'y' of JSONPath query results\n" "infile optional JSON file to parse\n" "- read JSON from standard input\n\n"); exit(EXIT_SUCCESS); default: fprintf(stderr, "jsoncpp: Unknown option %s\n\n", a); exit(EXIT_FAILURE); } } } else { if (ifile && strcmp(ifile, "-")) fprintf(stderr, "jsoncpp: Input already specified as %s, ignoring %s\n\n", ifile, a); else ifile = argv[i]; } } } else { ifile = "-"; } if (genmain) minimal = false; soap *ctx = soap_new1(SOAP_C_UTFSTRING); if (dform && *dform == '%' && *(dform+1)) ctx->double_format = dform; std::ifstream ifs; if (ifile) { if (!strcmp(ifile, "-")) { ctx->is = &std::cin; } else { ifs.open(ifile, std::ifstream::in); if (!ifs.is_open()) { fprintf(stderr, "Cannot open %s for reading\n", ifile); exit(EXIT_FAILURE); } ctx->is = &ifs; } } std::ofstream ofs; if (ofile) { ofs.open(ofile, std::ofstream::out); if (!ofs.is_open()) { fprintf(stderr, "Cannot open %s for writing\n", ofile); exit(EXIT_FAILURE); } ctx->os = &ofs; } else { ctx->os = &std::cout; } value v(ctx); if (ifile) { // read plain JSON, no HTTP/MIME headers soap_set_imode(ctx, SOAP_ENC_PLAIN); if (json_read(ctx, v)) { soap_print_fault(ctx, stderr); soap_print_fault_location(ctx, stderr); exit(EXIT_FAILURE); } } if (ifile && strcmp(ifile, "-")) ifs.close(); if (!minimal) { if (coutput) { *ctx->os << "/* Dependencies:\n" " json.h xml-rpc-iters.h stdsoap2.h\n" " json.c xml-rpc.c stdsoap2.c\n" " Build:\n" " soapcpp2 -c -CSL xml-rpc.h (generates soapStub.h, soapH.h, soapC.c)\n" " cc ... soapC.c json.c xml-rpc.c stdsoap2.c ...\n" "*/\n"; } else { *ctx->os << "// Dependencies:\n" "// json.h xml-rpc-iters.h stdsoap2.h\n" "// json.cpp xml-rpc.cpp stdsoap2.cpp\n" "// Build:\n" "// soapcpp2 -CSL xml-rpc.h (generates soapStub.h, soapH.h, soapC.cpp)\n" "// c++ ... soapC.cpp json.cpp xml-rpc.cpp stdsoap2.cpp ...\n"; } *ctx->os << "\n#include \"json.h\"\n"; if (!coutput && jpath && strstr(jpath, "..")) *ctx->os << "#include \n"; } if (genmain) *ctx->os << "struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}};\n" "int main(int argc, char **argv)\n"; if (!minimal) { if (coutput) *ctx->os << "{ /* Generated by jsoncpp"; else *ctx->os << "{ // Generated by jsoncpp"; for (int i = 1; i < argc; ++i) *ctx->os << " " << putstr(argv[i], 0); if (coutput) *ctx->os << " */\n" " /* jsoncpp tool Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. */\n"; else *ctx->os << "\n" " // jsoncpp tool Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc.\n"; *ctx->os << " struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT);\n" " ctx->double_format = \"" << (dform ? dform : "%lG") << "\";\n\n"; } if (coutput) { *ctx->os << " struct value *" << jroot << " = new_value(ctx);\n"; if ((ifile && genread && genvars) || jpath) { if (explain) *ctx->os << " /* index to inspect structs and arrays */\n"; *ctx->os << " int j;\n"; } std::string path = "$"; if (ifile && !genread) { out_gen_c(ctx, v, jroot, path, 2); } else { if (explain) *ctx->os << " /* parse JSON into value " << jroot << " */\n"; *ctx->os << " json_read(ctx, " << jroot << ");\n"; if (!minimal) *ctx->os << " if (" << jroot << "->soap->error)\n" " exit(EXIT_FAILURE); /* error parsing JSON */\n"; if (ifile) { *ctx->os << " #define USE_VAL(path, val) printf(\"%s = %s\\n\", path, *string_of(val))\n"; in_gen_c(ctx, v, jroot, path, 2); } } if (jpath) { *ctx->os << " /* JSONPath: " << putstr(jpath, 0) << " */\n"; if (!jcode) { if (collect) { if (explain) *ctx->os << " /* JSONPath query yields an array 'y' of JSONPath query results: */\n"; *ctx->os << " struct value *y = new_value(ctx);\n" " set_size(y, 0);\n" " #define QUERY_YIELD(val) *nth_value(y, has_size(y)) = *val\n"; } else { if (explain) *ctx->os << " /* JSONPath query yields are shown for each JSONPath result: */\n"; *ctx->os << " #define QUERY_YIELD(val) json_write(ctx, val), putchar('\\n')\n"; } } *ctx->os << " #define QUERY_STACK_SIZE 65536\n"; *ctx->os << " #define QUERY_STACK_OVFL exit(EXIT_FAILURE)\n"; std::string root(jroot); if (explain) { *ctx->os << " /* Synopsis of variables used:\n" " " << root << "\troot node value pointer\n" << ( collect ? " y\tyield array of query results\n" : "" ) << " v\tcurrent node value pointer to use in [(expr)]\n" " i\tarray/struct loop index\n" " j\tarray/struct index\n" " k\tswitch case counter / loop end\n" " p\tvalue pointer to current node\n" " q\tvalue pointer to current node\n" " s\tstack pointer\n" " S\tvalue stack for recursive descent\n" " Synopsis of constants used:\n" " QUERY_STACK_SIZE\tmax stack size for recursive descent\n" " QUERY_STACK_OVFL\tcode to execute on stack overflow\n" " */\n"; } path_gen_c(ctx, jpath, root, 2, false); if (!minimal && collect) *ctx->os << " json_write(ctx, y), putchar('\\n');\n"; } else if (!minimal) { if (explain) *ctx->os << " /* output value " << jroot << " in JSON */\n"; *ctx->os << " json_write(ctx, " << jroot << "), putchar('\\n');\n"; } if (!minimal) { *ctx->os << "\n" " soap_end(ctx); /* delete data */\n" " soap_free(ctx); /* free context */\n" << (genmain ? " return 0;\n" : "") << "}\n"; } } else { *ctx->os << " value " << jroot << "(ctx);\n"; std::string path = "$"; if (ifile && !genread) { out_gen_cpp(ctx, v, jroot, path, 2); } else { if (explain) *ctx->os << " // parse JSON into value " << jroot << "\n"; *ctx->os << " std::cin >> " << jroot << ";\n"; if (!minimal) *ctx->os << " if (" << jroot << ".soap->error)\n" " exit(EXIT_FAILURE); // error parsing JSON\n"; if (ifile) { *ctx->os << " #define USE_VAL(path, val) std::cout << path << \" = \" << val << std::endl\n"; in_gen_cpp(ctx, v, jroot, path, 2); } } if (jpath) { *ctx->os << " // JSONPath: " << jpath << "\n"; if (optimal) { if (explain) *ctx->os << " // index to inspect structs and arrays\n"; *ctx->os << " int j;\n"; } if (!jcode) { if (collect) { if (explain) *ctx->os << " // JSONPath query yields an array 'y' of JSONPath query results:\n"; *ctx->os << " value y(ctx);\n" " y.size(0);\n" " #define QUERY_YIELD(val) y[y.size()] = val\n"; } else { if (explain) *ctx->os << " // JSONPath query yields are shown for each JSONPath result:\n"; *ctx->os << " #define QUERY_YIELD(val) std::cout << val << std::endl\n"; } } std::string root(jroot); if (explain) { *ctx->os << " // Synopsis of variables used:\n" " // " << root << "\troot node value\n" << ( collect ? " // y\tyield array of query results\n" : "" ) << " // v\tcurrent node value to use in [(expr)]\n" " // i\titerator over arrays and structs\n" " // j\tarray/struct index\n" " // k\tswitch case counter / loop end\n" " // p\tvalue pointer to current node\n" " // q\tvalue pointer to current node\n" " // r\tvalue reference to current node\n" " // s\tvalue reference to current node\n" " // S\tvalue stack for recursive descent\n"; } path_gen_cpp(ctx, jpath, root, 2, false); if (!minimal && collect) *ctx->os << " std::cout << y << std::endl;\n"; } else if (!minimal) { if (explain) *ctx->os << " // output value " << jroot << " in JSON\n"; *ctx->os << " std::cout << " << jroot << " << std::endl;\n"; } if (!minimal) { *ctx->os << "\n" " soap_destroy(ctx); // delete objects\n" " soap_end(ctx); // delete data\n" " soap_free(ctx); // free context\n" << (genmain ? " return 0;\n" : "") << "}\n"; } } if (ofile) ofs.close(); soap_destroy(ctx); soap_end(ctx); soap_free(ctx); return 0; } //////////////////////////////////////////////////////////////////////////////// // // C gen writer/reader from infile // //////////////////////////////////////////////////////////////////////////////// static void out_gen_c(soap *ctx, value& v, std::string lhs, const std::string& path, int k) { switch (v.__type) { case SOAP_TYPE__boolean: if (explain) indent(ctx, k) << "// " << putstr(path, 0) << " = " << putstr((const char*)v, 0) << "\n"; indent(ctx, k) << "*bool_of(" << lhs << ") = " << (v.is_true() ? 1 : 0) << ";\n"; break; case SOAP_TYPE__i4: case SOAP_TYPE__int: if (explain) indent(ctx, k) << "// " << putstr(path, 0) << " = " << putstr((const char*)v, 0) << "\n"; indent(ctx, k) << "*int_of(" << lhs << ") = "; json_send(ctx, v); *ctx->os << ";\n"; break; case SOAP_TYPE__double: if (explain) indent(ctx, k) << "// " << putstr(path, 0) << " = " << putstr((const char*)v, 0) << "\n"; indent(ctx, k) << "*double_of(" << lhs << ") = "; json_send(ctx, v); *ctx->os << ";\n"; break; case SOAP_TYPE__string: if (explain) indent(ctx, k) << "// " << putstr(path, 0) << " = " << putstr((const char*)v, 0) << "\n"; indent(ctx, k) << "*string_of(" << lhs << ") = " << putstr((const char*)v) << ";\n"; break; case SOAP_TYPE__struct: if (v.empty()) { indent(ctx, k) << "set_struct(" << lhs << ");\n"; } else { _struct& s = v; for (_struct::iterator i = s.begin(); i != s.end(); ++i) { std::string lhsidx; if (optimal && (i->is_struct() || i->is_array()) && !i->empty()) { lhsidx = gen_ident(lhs, i.index()); indent(ctx, k) << "{\n"; k += 2; indent(ctx, k) << "struct value *" << lhsidx << " = value_at(" << lhs << ", " << putstr(i.index()) << ");\n"; } else { lhsidx = "value_at("; lhsidx.append(lhs).append(", ").append(putstrname(i.index())).append(")"); } std::string newpath = path; newpath.append(".").append(putname(i.index())); out_gen_c(ctx, *i, lhsidx, newpath, k); if (optimal && (i->is_struct() || i->is_array()) && !i->empty()) { k -= 2; indent(ctx, k) << "}\n"; } } } break; case SOAP_TYPE__array: if (v.empty()) { indent(ctx, k) << "set_size(" << lhs << ", 0);\n"; } else { _array& a = v; for (_array::iterator i = a.begin(); i != a.end(); ++i) { const char *s = soap_int2s(ctx, i.index()); std::string lhsidx; if (optimal && (i->is_struct() || i->is_array()) && !i->empty()) { lhsidx = lhs; lhsidx.append(s); indent(ctx, k) << "{\n"; k += 2; indent(ctx, k) << "struct value *" << lhsidx << " = nth_value(" << lhs << ", " << s << ");\n"; } else { lhsidx = "nth_value("; lhsidx.append(lhs).append(", ").append(s).append(")"); } std::string newpath = path; newpath.append("[").append(s).append("]"); out_gen_c(ctx, *i, lhsidx, newpath, k); if (optimal && (i->is_struct() || i->is_array()) && !i->empty()) { k -= 2; indent(ctx, k) << "}\n"; } } } break; default: break; } } static void in_gen_c(soap *ctx, value& v, std::string lhs, const std::string& path, int k) { switch (v.__type) { case SOAP_TYPE__boolean: if (explain) indent(ctx, k) << "/* " << putstr(path, 0) << " bool value, is_true(" << lhs << ") and is_false(" << lhs << ") */\n"; indent(ctx, k) << "USE_VAL(" << putstr(path) << ", " << lhs << ");\n"; break; case SOAP_TYPE__i4: case SOAP_TYPE__int: if (explain) indent(ctx, k) << "/* " << putstr(path, 0) << " int value, is_int(" << lhs << ") and *int_of(" << lhs << ") */\n"; indent(ctx, k) << "USE_VAL(" << putstr(path) << ", " << lhs << ");\n"; break; case SOAP_TYPE__double: if (explain) indent(ctx, k) << "/* " << putstr(path, 0) << " double value, is_double(" << lhs << ") and *double_of(" << lhs << ") */\n"; indent(ctx, k) << "USE_VAL(" << putstr(path) << ", " << lhs << ");\n"; break; case SOAP_TYPE__string: if (explain) indent(ctx, k) << "/* " << putstr(path, 0) << " string value, is_string(" << lhs << ") and *string_of(" << lhs << ") */\n"; indent(ctx, k) << "USE_VAL(" << putstr(path) << ", " << lhs << ");\n"; break; case SOAP_TYPE__struct: { _struct& s = v; if (explain) indent(ctx, k) << "/* " << putstr(path, 0) << " object, is_struct(" << lhs << ") */\n"; for (_struct::iterator i = s.begin(); i != s.end(); ++i) { std::string lhsidx; if (genvars) { lhsidx = gen_ident(lhs, i.index()); } else { lhsidx = "value_at("; lhsidx.append(lhs).append(", ").append(putstrname(i.index())).append(")"); } std::string newpath = path; newpath.append(".").append(putname(i.index())); if (!nocheck) { if (genvars) indent(ctx, k) << "if ((j = nth_at(" << lhs << ", " << putstr(i.index()) << ")) >= 0)\n"; else indent(ctx, k) << "if (nth_at(" << lhs << ", " << putstr(i.index()) << ") >= 0)\n"; if (explain || genvars || i->is_struct() || i->is_array()) indent(ctx, k) << "{\n"; if (genvars) indent(ctx, k + 2) << "struct value *" << lhsidx << " = nth_value(" << lhs << ", j);\n"; in_gen_c(ctx, *i, lhsidx, newpath, k + 2); if (explain || genvars || i->is_struct() || i->is_array()) indent(ctx, k) << "}\n"; } else { if (genvars) indent(ctx, k) << "struct value *" << lhsidx << " = nth_value(" << lhs << ", j);\n"; in_gen_c(ctx, *i, lhsidx, newpath, k); } } } break; case SOAP_TYPE__array: { if (explain) indent(ctx, k) << "/* " << putstr(path, 0) << " array, is_array(" << lhs << ") */\n"; std::string idx; std::string lhsidx; if (genvars) { idx = "i"; lhsidx = lhs; lhsidx.append(idx); } else { idx = gen_counter(k/2 - 1); lhsidx = "nth_value("; lhsidx.append(lhs).append(", ").append(idx).append(")"); } indent(ctx, k) << "int " << idx << ";\n"; indent(ctx, k) << "for (" << idx << " = 0; " << idx << " < has_size(" << lhs << "); " << idx << "++)\n"; std::string newpath = path; newpath.append("[]"); if (explain || genvars || v[0].is_struct() || v[0].is_array()) indent(ctx, k) << "{\n"; if (genvars) indent(ctx, k + 2) << "struct value *" << lhsidx << " = nth_value(" << lhs << ", " << idx << ");\n"; in_gen_c(ctx, v[0], lhsidx, newpath, k + 2); if (explain || genvars || v[0].is_struct() || v[0].is_array()) indent(ctx, k) << "}\n"; } break; default: indent(ctx, k) << "; // null\n"; break; } } //////////////////////////////////////////////////////////////////////////////// // // C++ gen writer/reader from infile // //////////////////////////////////////////////////////////////////////////////// static void out_gen_cpp(soap *ctx, value& v, std::string lhs, const std::string& path, int k) { switch (v.__type) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: case SOAP_TYPE__double: if (explain) indent(ctx, k) << "// " << putstr(path, 0) << " = " << putstr((const char*)v, 0) << "\n"; indent(ctx, k) << lhs << " = "; json_send(ctx, v); if (v.__type == SOAP_TYPE__int) *ctx->os << "LL"; *ctx->os << ";\n"; break; case SOAP_TYPE__string: if (explain) indent(ctx, k) << "// " << putstr(path, 0) << " = " << putstr((const char*)v, 0) << "\n"; indent(ctx, k) << lhs << " = " << putstr((const char*)v) << ";\n"; break; case SOAP_TYPE__struct: if (v.empty()) { indent(ctx, k) << lhs << " = _struct(ctx);\n"; } else { _struct& s = v; for (_struct::iterator i = s.begin(); i != s.end(); ++i) { std::string lhsidx; if (optimal && (i->is_struct() || i->is_array()) && !i->empty()) { lhsidx = gen_ident(lhs, i.index()); indent(ctx, k) << "{\n"; k += 2; indent(ctx, k) << "value& " << lhsidx << " = " << lhs << "[" << putstr(i.index()) << "];\n"; } else { lhsidx = lhs; lhsidx.append("[").append(putstrname(i.index())).append("]"); } std::string newpath = path; newpath.append(".").append(putname(i.index())); out_gen_cpp(ctx, *i, lhsidx, newpath, k); if (optimal && (i->is_struct() || i->is_array()) && !i->empty()) { k -= 2; indent(ctx, k) << "}\n"; } } } break; case SOAP_TYPE__array: if (v.empty()) { indent(ctx, k) << lhs << ".size(0);\n"; } else { _array& a = v; for (_array::iterator i = a.begin(); i != a.end(); ++i) { const char *s = soap_int2s(ctx, i.index()); std::string lhsidx; if (optimal && (i->is_struct() || i->is_array()) && !i->empty()) { lhsidx = lhs; lhsidx.append(s); indent(ctx, k) << "{\n"; k += 2; indent(ctx, k) << "value& " << lhsidx << " = " << lhs << "[" << s << "];\n"; } else { lhsidx = lhs; lhsidx.append("[").append(s).append("]"); } std::string newpath = path; newpath.append("[").append(s).append("]"); out_gen_cpp(ctx, *i, lhsidx, newpath, k); if (optimal && (i->is_struct() || i->is_array()) && !i->empty()) { k -= 2; indent(ctx, k) << "}\n"; } } } break; default: break; } } static void in_gen_cpp(soap *ctx, value& v, std::string lhs, const std::string& path, int k) { switch (v.__type) { case SOAP_TYPE__boolean: if (explain) indent(ctx, k) << "// " << putstr(path, 0) << " bool value\n"; indent(ctx, k) << "USE_VAL(" << putstr(path) << ", " << lhs << ");\n"; break; case SOAP_TYPE__i4: case SOAP_TYPE__int: if (explain) indent(ctx, k) << "// " << putstr(path, 0) << " int value\n"; indent(ctx, k) << "USE_VAL(" << putstr(path) << ", " << lhs << ");\n"; break; case SOAP_TYPE__double: if (explain) indent(ctx, k) << "// " << putstr(path, 0) << " double value\n"; indent(ctx, k) << "USE_VAL(" << putstr(path) << ", " << lhs << ");\n"; break; case SOAP_TYPE__string: if (explain) indent(ctx, k) << "// " << putstr(path, 0) << " string value\n"; indent(ctx, k) << "USE_VAL(" << putstr(path) << ", " << lhs << ");\n"; break; case SOAP_TYPE__struct: { _struct& s = v; if (explain) indent(ctx, k) << "// " << putstr(path, 0) << " object\n"; for (_struct::iterator i = s.begin(); i != s.end(); ++i) { std::string lhsidx; if (genvars) { lhsidx = gen_ident(lhs, i.index()); } else { lhsidx = lhs; lhsidx.append("[").append(putstrname(i.index())).append("]"); } std::string newpath = path; newpath.append(".").append(putname(i.index())); if (!nocheck) { indent(ctx, k) << "if (" << lhs << ".has(" << putstr(i.index()) << "))\n"; if (explain || genvars || i->is_struct() || i->is_array()) indent(ctx, k) << "{\n"; if (genvars) indent(ctx, k + 2) << "value& " << lhsidx << " = " << lhs << "[" << putstr(i.index()) << "];\n"; in_gen_cpp(ctx, *i, lhsidx, newpath, k + 2); if (explain || genvars || i->is_struct() || i->is_array()) indent(ctx, k) << "}\n"; } else { if (genvars) indent(ctx, k) << "value& " << lhsidx << " = " << lhs << "[" << putstr(i.index()) << "];\n"; in_gen_cpp(ctx, *i, lhsidx, newpath, k); } } } break; case SOAP_TYPE__array: { if (explain) indent(ctx, k) << "// " << putstr(path, 0) << " array\n"; std::string idx; std::string lhsidx; if (genvars) { idx = "i"; lhsidx = lhs; lhsidx.append(idx); } else { idx = gen_counter(k/2 - 1); lhsidx = lhs; lhsidx.append("[").append(idx).append("]"); } indent(ctx, k) << "for (int " << idx << " = 0; " << idx << " < " << lhs << ".size(); " << idx << "++)\n"; std::string newpath = path; newpath.append("[]"); if (explain || genvars || v[0].is_struct() || v[0].is_array()) indent(ctx, k) << "{\n"; if (genvars) indent(ctx, k + 2) << "value& " << lhsidx << " = " << lhs << "[" << idx << "];\n"; in_gen_cpp(ctx, v[0], lhsidx, newpath, k + 2); if (explain || genvars || v[0].is_struct() || v[0].is_array()) indent(ctx, k) << "}\n"; } break; default: indent(ctx, k) << "; // null\n"; break; } } //////////////////////////////////////////////////////////////////////////////// // // C gen JSONPath from -ppath // //////////////////////////////////////////////////////////////////////////////// static void path_gen_c(struct soap *ctx, const char *jpath, std::string& v, int k, bool throwup) { if (*jpath == '$' || *jpath == '@') // strip $ and @ from path ++jpath; while (isspace(*jpath) || (*jpath == '.' && *(jpath + 1) != '.')) // skip space and single . ++jpath; if (*jpath == '.') // path: .. { ++jpath; if (*jpath == '.') { if (explain) indent(ctx, k) << "/* iterate over descendants of current node " << v << " to match " << jpath << " */\n"; indent(ctx, k) << "struct value *S[QUERY_STACK_SIZE], **s = S;\n"; indent(ctx, k) << "*s++ = " << v << ";\n"; indent(ctx, k) << "while (S < s)\n"; indent(ctx, k) << "{\n"; indent(ctx, k + 2) << "struct value *p = *--s;\n"; indent(ctx, k + 2) << "int i;\n"; indent(ctx, k + 2) << "for (i = has_size(p)-1; i >= 0; --i)\n"; indent(ctx, k + 2) << "{\n"; indent(ctx, k + 4) << "if (s < S + QUERY_STACK_SIZE)\n"; indent(ctx, k + 6) << "*s++ = nth_value(p, i);\n"; indent(ctx, k + 4) << "else\n"; indent(ctx, k + 6) << "QUERY_STACK_OVFL;\n"; indent(ctx, k + 2) << "}\n"; indent(ctx, k + 2) << "{\n"; v = "p"; path_gen_c(ctx, jpath, v, k + 4, throwup); indent(ctx, k + 2) << "}\n"; indent(ctx, k) << "}\n"; } else { fprintf(stderr, "jsoncpp: JSONPath unexpected end at '.'\n\n"); exit(EXIT_FAILURE); } } else if (*jpath == '[') // path: [*]..., [?x], or [(),:]... { ++jpath; if (*jpath == '*') // path: [*]... { ++jpath; if (*jpath != ']') { fprintf(stderr, "jsoncpp: JSONPath ']' expected at ...->%s\n\n", jpath); exit(EXIT_FAILURE); } ++jpath; if (explain) indent(ctx, k) << "/* iterate over current array/struct node " << v << " to match " << jpath << " */\n"; indent(ctx, k) << "int i, k = has_size(" << v << ");\n"; indent(ctx, k) << "for (i = 0; i < k; ++i)\n"; indent(ctx, k) << "{\n"; if (v[0] == 'p') { indent(ctx, k + 2) << "struct value *q = nth_value(" << v << ", i);\n"; v = "q"; } else { indent(ctx, k + 2) << "struct value *p = nth_value(" << v << ", i);\n"; v = "p"; } path_gen_c(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } else if (*jpath == '?') // path: [?x]... where x is a C++ bool expression { ++jpath; if (*jpath != '(') { fprintf(stderr, "jsoncpp: JSONPath '(' expected at ...->%s\n\n", jpath); exit(EXIT_FAILURE); } ++jpath; int nest = 0; const char *s; for (s = jpath; *s; ++s) { if (*s == ')') { if (nest == 0) break; --nest; } else if (*s == '(') ++nest; } if (*s != ')' || *(s + 1) != ']') { fprintf(stderr, "jsoncpp: JSONPath ')]' expected at ...->%s\n\n", jpath); exit(EXIT_FAILURE); } std::string code(jpath, s - jpath); jpath = s + 2; if (explain) indent(ctx, k) << "/* filter current node " << v << " with 'if (" << code << ")' to match " << jpath << " */\n"; indent(ctx, k) << "struct value *v = " << v << ";\n"; indent(ctx, k) << "if (" << code << ")\n"; indent(ctx, k) << "{\n"; path_gen_c(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } else // path: [(),:]... { std::string u; int subs = 0; std::string code; std::string name; int start, end, step; while (true) { ++subs; code.clear(); name.clear(); start = end = step = 0; if (*jpath == '(') { ++jpath; int nest = 0; const char *s; for (s = jpath; *s; ++s) { if (*s == ')') { if (nest == 0) break; --nest; } else if (*s == '(') ++nest; } if (*s != ')') { fprintf(stderr, "jsoncpp: JSONPath ')' expected at ...->%s\n\n", jpath); exit(EXIT_FAILURE); } code = std::string(jpath, s - jpath); jpath = s + 1; } else if (*jpath == ':') { ++jpath; bool hasend = true; if (*jpath == '-' || *jpath == '+' || isdigit(*jpath)) end = soap_strtol(jpath, (char**)&jpath, 10); else hasend = false; if (*jpath == ':') step = soap_strtol(jpath + 1, (char**)&jpath, 10); else step = 1; if (step > 0) // end is exclusive (Python array slicing) --end; else if (hasend) ++end; if (step < 0) start = -1; } else if (*jpath == '\'' || *jpath == '"' || isalpha(*jpath)) { name = getname(&jpath); } else if (*jpath == '-' || *jpath == '+' || isdigit(*jpath)) { start = soap_strtol(jpath, (char**)&jpath, 10); if (*jpath == ':') { ++jpath; bool hasend = true; if (*jpath == '-' || *jpath == '+' || isdigit(*jpath)) end = soap_strtol(jpath, (char**)&jpath, 10); else hasend = false; if (*jpath == ':') step = soap_strtol(jpath + 1, (char**)&jpath, 10); else step = 1; if (step > 0) // end is exclusive (Python array slicing) --end; else if (hasend) ++end; } } if ((step > 0 && !(start <= end || (start >= 0 && end < 0))) || (step < 0 && !(start >= end || (start < 0 && end >= 0)))) { fprintf(stderr, "jsoncpp: JSONPath inverted bounds at ...->%s\n\n", jpath); exit(EXIT_FAILURE); } if (subs == 1 && *jpath != ',') // path: [x]... with x a name or index or [start]:[end][:step] slice break; if (subs == 1) // path: [x,...]... with x a name or index or [start]:[end][:step] slice { if (explain) indent(ctx, k) << "/* for each case */\n"; indent(ctx, k) << "int i, k = 1;\n"; if (v[0] == 'p') { indent(ctx, k) << "struct value *q;\n"; u = "q"; } else { indent(ctx, k) << "struct value *p;\n"; u = "p"; } indent(ctx, k) << "do\n"; indent(ctx, k) << "{\n"; indent(ctx, k + 2) << "switch (k)\n"; indent(ctx, k + 2) << "{\n"; } indent(ctx, k + 4) << "case " << 2*subs-1 << ":\n"; if (!code.empty()) { indent(ctx, k + 4) << "{\n"; if (explain) indent(ctx, k + 6) << "/* if current node " << v << " is an array/struct with field/element [(" << code << ")] ... */\n"; indent(ctx, k + 6) << "struct value *v = " << v << ";\n"; indent(ctx, k + 6) << "k = " << 2*subs+1 << ";\n"; indent(ctx, k + 6) << u << " = (" << code << ");\n"; // only value pointer expressions in C indent(ctx, k + 6) << "if (" << u << ")\n"; indent(ctx, k + 8) << "break;\n"; indent(ctx, k + 4) << "}\n"; } else if (!name.empty()) { if (explain) indent(ctx, k + 6) << "/* if current node " << v << " is a struct with field '" << name << "' ... */\n"; indent(ctx, k + 6) << "k = " << 2*subs+1 << ";\n"; indent(ctx, k + 6) << "if ((i = nth_at(" << v << ", " << putstr(name) << ")) >= 0)\n"; indent(ctx, k + 6) << "{\n"; indent(ctx, k + 8) << u << " = nth_value(" << v << ", i);\n"; indent(ctx, k + 8) << "break;\n"; indent(ctx, k + 6) << "}\n"; } else if (step > 0) { if (explain) indent(ctx, k + 6) << "/* if current node " << v << " is an array then iterate from " << start << " to " << end << " by " << step << " ... */\n"; indent(ctx, k + 6) << "if (!is_array(" << v << ")\n"; indent(ctx, k + 6) << "{\n"; indent(ctx, k + 8) << "k = " << 2*subs+1 << ";\n"; indent(ctx, k + 8) << "continue;\n"; indent(ctx, k + 6) << "}\n"; if (start < 0) indent(ctx, k + 6) << "i = (" << start << " >= -has_size(" << v << ") ? " << start << " : -has_size(" << v << "))-" << step << ";\n"; else indent(ctx, k + 6) << "i = " << start-step << ";\n"; indent(ctx, k + 6) << "k = " << 2*subs << ";\n"; indent(ctx, k + 4) << "case " << 2*subs << ":\n"; indent(ctx, k + 6) << "i += " << step << ";\n"; if (start >= 0 && end < 0) // : 0 <= start <= size+end where end < 0 indent(ctx, k + 6) << "if (i <= has_size(" << v << ")+" << end << ")\n"; else if (start >= 0 && end >= 0) // : 0 <= start <= end < size indent(ctx, k + 6) << "if (i <= " << end << " && i < has_size(" << v << "))\n"; else // start < 0 && end < 0 : -size <= start <= end < 0 indent(ctx, k + 6) << "if (i <= " << end << ")\n"; indent(ctx, k + 6) << "{\n"; indent(ctx, k + 8) << u << " = nth_value(" << v << ", i);\n"; indent(ctx, k + 8) << "break;\n"; indent(ctx, k + 6) << "}\n"; indent(ctx, k + 6) << "else\n"; indent(ctx, k + 8) << "k = " << 2*subs+1 << ";\n"; } else if (step < 0) { if (explain) indent(ctx, k + 6) << "/* if current node " << v << " is an array then iterate from " << start << " to " << end << " by " << step << " ... */\n"; indent(ctx, k + 6) << "if (!is_array(" << v << "))\n"; indent(ctx, k + 6) << "{\n"; indent(ctx, k + 8) << "k = " << 2*subs+1 << ";\n"; indent(ctx, k + 8) << "continue;\n"; indent(ctx, k + 6) << "}\n"; if (start < 0 && end >= 0) indent(ctx, k + 6) << "i = has_size(" << v << ")+" << start-step << ";\n"; else if (start >= 0 && end >= 0) indent(ctx, k + 6) << "i = (" << start << " < has_size(" << v << ") ? " << start << " : has_size(" << v << ")-1)+" << -step << ";\n"; else // start < 0 && end < 0 indent(ctx, k + 6) << "i = " << start-step << ";\n"; indent(ctx, k + 6) << "k = " << 2*subs << ";\n"; indent(ctx, k + 4) << "case " << 2*subs << ":\n"; indent(ctx, k + 6) << "i -= " << -step << ";\n"; if (start < 0 && end >= 0) // : 0 <= end <= size+start where start < 0 indent(ctx, k + 6) << "if (i >= " << end << ")\n"; else if (start >= 0 && end >= 0) // : 0 <= end <= start < size indent(ctx, k + 6) << "if (i >= " << end << ")\n"; else // start < 0 && end < 0 : -size <= end <= start < 0 indent(ctx, k + 6) << "if (i >= " << end << " && i >= -has_size(" << v << "))\n"; indent(ctx, k + 6) << "{\n"; indent(ctx, k + 8) << u << " = nth_value(" << v << ", i);\n"; indent(ctx, k + 8) << "break;\n"; indent(ctx, k + 6) << "}\n"; indent(ctx, k + 6) << "else\n"; indent(ctx, k + 8) << "k = " << 2*subs+1 << ";\n"; } else { if (explain) indent(ctx, k + 6) << "/* if current node " << v << " is an array with element [" << start << "] ... */\n"; indent(ctx, k + 6) << "k = " << 2*subs+1 << ";\n"; indent(ctx, k + 6) << "if ((i = nth_nth(" << v << ", " << start << ")) >= 0)\n"; indent(ctx, k + 6) << "{\n"; indent(ctx, k + 8) << u << " = nth_value(" << v << ", i);\n"; indent(ctx, k + 8) << "break;\n"; indent(ctx, k + 6) << "}\n"; } if (*jpath != ',') break; ++jpath; } if (subs == 0 && *jpath == ']') { fprintf(stderr, "jsoncpp: JSONPath empty '[]' at ...->%s\n\n", jpath); exit(EXIT_FAILURE); } if (*jpath != ']') { fprintf(stderr, "jsoncpp: JSONPath ']' expected at ...->%s\n\n", jpath); exit(EXIT_FAILURE); } ++jpath; if (subs == 1) // path: [x]... with x a name or index or [start]:[end][:step] range { if (!code.empty()) { if (explain) indent(ctx, k) << "/* if current node " << v << " is an array/struct with field/element [(" << code << ")] then match " << jpath << " */\n"; indent(ctx, k) << "struct value *v = " << v << ";\n"; indent(ctx, k) << "struct value *p = (" << code << ");\n"; // only value pointer expressions in C indent(ctx, k) << "if (p)\n"; indent(ctx, k) << "{\n"; v = "p"; path_gen_c(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } else if (!name.empty()) { if (explain) indent(ctx, k) << "/* if current node " << v << " is a struct with field '" << name << "' then match " << jpath << " */\n"; indent(ctx, k) << "if ((j = nth_at(" << v << ", " << putstr(name) << ")) >= 0)\n"; indent(ctx, k) << "{\n"; if (v[0] == 'p') { indent(ctx, k + 2) << "struct value *q = nth_value(" << v << ", j);\n"; v = "q"; } else { indent(ctx, k + 2) << "struct value *p = nth_value(" << v << ", j);\n"; v = "p"; } path_gen_c(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } else if (step > 0) { if (explain) indent(ctx, k) << "/* if current node " << v << " is an array then iterate from " << start << " to " << end << " by " << step << " to match " << jpath << " */\n"; indent(ctx, k) << "if (is_array(" << v << "))\n"; indent(ctx, k) << "{\n"; if (start >= 0 && end < 0) { indent(ctx, k + 2) << "int i, k = has_size(" << v << ")-" << -end << ";\n"; indent(ctx, k + 2) << "for (i = " << start << "; i <= k; i += " << step << ")\n"; } else if (start >= 0 && end >= 0) { indent(ctx, k + 2) << "int i, k = (" << end << " < has_size(" << v << ") ? " << end << " : has_size(" << v << ")-1);\n"; indent(ctx, k + 2) << "for (i = " << start << "; i <= k; i += " << step << ")\n"; } else // start < 0 && end < 0 { indent(ctx, k + 2) << "int i, k = (" << start << " >= -has_size(" << v << ") ? " << start << " : -has_size(" << v << "));\n"; indent(ctx, k + 2) << "for (i = k; i <= " << end << "; i += " << step << ")\n"; } indent(ctx, k + 2) << "{\n"; if (v[0] == 'p') { indent(ctx, k + 4) << "struct value *q = nth_value(" << v << ", i);\n"; v = "q"; } else { indent(ctx, k + 4) << "struct value *p = nth_value(" << v << ", i);\n"; v = "p"; } path_gen_c(ctx, jpath, v, k + 4, throwup); indent(ctx, k + 2) << "}\n"; indent(ctx, k) << "}\n"; } else if (step < 0) { if (explain) indent(ctx, k) << "/* if current node " << v << " is an array then iterate from " << start << " to " << end << " by " << step << " to match " << jpath << " */\n"; indent(ctx, k) << "if (is_array(" << v << "))\n"; indent(ctx, k) << "{\n"; if (start < 0 && end >= 0) { indent(ctx, k + 2) << "int i, k = has_size(" << v << ")-" << -start << ";\n"; indent(ctx, k + 2) << "for (i = k; i >= " << end << "; i -= " << -step << ")\n"; } else if (start >= 0 && end >= 0) { indent(ctx, k + 2) << "int i, k = (" << start << " < has_size(" << v << ") ? " << start << " : has_size(" << v << ")-1);\n"; indent(ctx, k + 2) << "for (i = k; i >= " << end << "; i -= " << -step << ")\n"; } else // start < 0 && end < 0 { indent(ctx, k + 2) << "int i, k = (" << end << " >= -has_size(" << v << ") ? " << end << " : -has_size(" << v << "));\n"; indent(ctx, k + 2) << "for (i = " << start << "; i >= k; i -= " << -step << ")\n"; } indent(ctx, k + 2) << "{\n"; if (v[0] == 'p') { indent(ctx, k + 4) << "struct value *q = nth_value(" << v << ", i);\n"; v = "q"; } else { indent(ctx, k + 4) << "struct value *p = nth_value(" << v << ", i);\n"; v = "p"; } path_gen_c(ctx, jpath, v, k + 4, throwup); indent(ctx, k + 2) << "}\n"; indent(ctx, k) << "}\n"; } else { if (explain) indent(ctx, k) << "/* if current node " << v << " is an array with element [" << start << "] then match " << jpath << " */\n"; indent(ctx, k) << "if ((j = nth_nth(" << v << ", " << start << ")) >= 0)\n"; indent(ctx, k) << "{\n"; if (v[0] == 'p') { indent(ctx, k + 2) << "struct value *q = nth_value(" << v << ", j);\n"; v = "q"; } else { indent(ctx, k + 2) << "struct value *p = nth_value(" << v << ", j);\n"; v = "p"; } path_gen_c(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } } else { indent(ctx, k + 4) << "default:\n"; indent(ctx, k + 6) << "continue;\n"; indent(ctx, k + 2) << "}\n"; if (explain) indent(ctx, k + 2) << "/* ... then match " << jpath << " */\n"; indent(ctx, k + 2) << "{\n"; path_gen_c(ctx, jpath, u, k + 4, throwup); indent(ctx, k + 2) << "}\n"; indent(ctx, k) << "} while (k <= " << 2*subs << ");\n"; } } } else if (*jpath == '?') // path: P?Q means all values P such that Q (has at least one result) { if (throwup) { fprintf(stderr, "jsoncpp: JSONPath cannot nest '?' and '!' ...->%s\n\n", jpath); exit(EXIT_FAILURE); } ++jpath; if (explain) indent(ctx, k) << "/* value of current node " << v << " if its descendants match " << jpath << " */\n"; std::string u = v; path_gen_c(ctx, jpath, v, k, true); indent(ctx, k) << "if (0)\n"; indent(ctx, k) << "{\n"; indent(ctx, 2) << "found:\n"; path_exec_c(ctx, u, k + 2); indent(ctx, k) << "}\n"; } else if (*jpath == '!') // path: P!Q means all values P such that not Q (has no results) { if (throwup) { fprintf(stderr, "jsoncpp: JSONPath cannot nest '?' and '!' ...->%s\n\n", jpath); exit(EXIT_FAILURE); } ++jpath; if (explain) indent(ctx, k) << "/* value of current node " << v << " if its descendants do not match " << jpath << " */\n"; std::string u = v; path_gen_c(ctx, jpath, v, k, true); path_exec_c(ctx, u, k); indent(ctx, 2) << "found:\n"; indent(ctx, k) << ";\n"; } else if (*jpath == '*') // path: *... { ++jpath; if (explain) indent(ctx, k) << "/* iterate over current array/struct node " << v << " to match " << jpath << " */\n"; indent(ctx, k) << "int i, k = has_size(" << v << ");\n"; indent(ctx, k) << "for (i = 0; i < k; ++i)\n"; indent(ctx, k) << "{\n"; if (v[0] == 'p') { indent(ctx, k + 2) << "struct value *q = nth_value(" << v << ", i);\n"; v = "q"; } else { indent(ctx, k + 2) << "struct value *p = nth_value(" << v << ", i);\n"; v = "p"; } path_gen_c(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } else if (!*jpath) { if (throwup) indent(ctx, k) << "goto found;\n"; else path_exec_c(ctx, v, k); } else // path: name... { std::string name = getname(&jpath); if (explain) indent(ctx, k) << "/* if current node " << v << " is a struct with field '" << name << "' then match " << jpath << " */\n"; indent(ctx, k) << "if ((j = nth_at(" << v << ", " << putstr(name) << ")) >= 0)\n"; indent(ctx, k) << "{\n"; if (v[0] == 'p') { indent(ctx, k + 2) << "struct value *q = nth_value(" << v << ", j);\n"; v = "q"; } else { indent(ctx, k + 2) << "struct value *p = nth_value(" << v << ", j);\n"; v = "p"; } path_gen_c(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } } static void path_exec_c(struct soap *ctx, std::string& v, int k) { if (jcode) { indent(ctx, k) << "value *v = " << v << ";\n"; indent(ctx, k) << jcode << "\n"; } else { indent(ctx, k) << "QUERY_YIELD(" << v << ");\n"; } } //////////////////////////////////////////////////////////////////////////////// // // C++ gen JSONPath from -ppath // //////////////////////////////////////////////////////////////////////////////// static void path_gen_cpp(struct soap *ctx, const char *jpath, std::string& v, int k, bool throwup) { if (*jpath == '$' || *jpath == '@') // strip $ and @ from path ++jpath; while (isspace(*jpath) || (*jpath == '.' && *(jpath + 1) != '.')) // skip space and single . ++jpath; if (*jpath == '.') // path: .. { ++jpath; if (*jpath == '.') { ++jpath; if (explain) indent(ctx, k) << "// iterate over descendants of current node " << v << " to match " << jpath << "\n"; indent(ctx, k) << "std::stack S;\n"; indent(ctx, k) << "S.push(&" << v << ");\n"; indent(ctx, k) << "while (!S.empty())\n"; indent(ctx, k) << "{\n"; indent(ctx, k + 2) << "value& r = *S.top();\n"; indent(ctx, k + 2) << "S.pop();\n"; indent(ctx, k + 2) << "for (int i = r.size()-1; i >= 0; --i)\n"; indent(ctx, k + 4) << "S.push(&r[i]);\n"; v = "r"; path_gen_cpp(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } else { fprintf(stderr, "jsoncpp: JSONPath unexpected end at '.'\n\n"); exit(EXIT_FAILURE); } } else if (*jpath == '[') // path: [*]..., [?x], or [(),:]... { ++jpath; if (*jpath == '*') // path: [*]... { ++jpath; if (*jpath != ']') { fprintf(stderr, "jsoncpp: JSONPath ']' expected at ...->%s\n\n", jpath); exit(EXIT_FAILURE); } ++jpath; if (explain) indent(ctx, k) << "// iterate over current array/struct node " << v << " to match " << jpath << "\n"; indent(ctx, k) << "value::iterator k = " << v << ".end();\n"; indent(ctx, k) << "for (value::iterator i = " << v << ".begin(); i != k; ++i)\n"; indent(ctx, k) << "{\n"; indent(ctx, k + 2) << "value& r = *i;\n"; v = "r"; path_gen_cpp(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } else if (*jpath == '?') // path: [?x]... where x is a C++ bool expression { ++jpath; if (*jpath != '(') { fprintf(stderr, "jsoncpp: JSONPath '(' expected at ...->%s\n\n", jpath); exit(EXIT_FAILURE); } ++jpath; int nest = 0; const char *s; for (s = jpath; *s; ++s) { if (*s == ')') { if (nest == 0) break; --nest; } else if (*s == '(') ++nest; } if (*s != ')' || *(s + 1) != ']') { fprintf(stderr, "jsoncpp: JSONPath ')]' expected at ...->%s\n\n", jpath); exit(EXIT_FAILURE); } std::string code(jpath, s - jpath); jpath = s + 2; if (explain) indent(ctx, k) << "// filter current node " << v << " with 'if (" << code << ")' to match " << jpath << "\n"; indent(ctx, k) << "value& v = " << v << ";\n"; indent(ctx, k) << "if (" << code << ")\n"; indent(ctx, k) << "{\n"; path_gen_cpp(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } else // path: [(),:]... { std::string p, u; int subs = 0; std::string code; std::string name; int start, end, step; while (true) { ++subs; code.clear(); name.clear(); start = end = step = 0; if (*jpath == '(') { ++jpath; int nest = 0; const char *s; for (s = jpath; *s; ++s) { if (*s == ')') { if (nest == 0) break; --nest; } else if (*s == '(') ++nest; } if (*s != ')') { fprintf(stderr, "jsoncpp: JSONPath ')' expected at ...->%s\n\n", jpath); exit(EXIT_FAILURE); } code = std::string(jpath, s - jpath); jpath = s + 1; } else if (*jpath == ':') { ++jpath; bool hasend = true; if (*jpath == '-' || *jpath == '+' || isdigit(*jpath)) end = soap_strtol(jpath, (char**)&jpath, 10); else hasend = false; if (*jpath == ':') step = soap_strtol(jpath + 1, (char**)&jpath, 10); else step = 1; if (step > 0) // end is exclusive (Python array slicing) --end; else if (hasend) ++end; if (step < 0) start = -1; } else if (*jpath == '\'' || *jpath == '"' || isalpha(*jpath)) { name = getname(&jpath); } else if (*jpath == '-' || *jpath == '+' || isdigit(*jpath)) { start = soap_strtol(jpath, (char**)&jpath, 10); if (*jpath == ':') { ++jpath; bool hasend = true; if (*jpath == '-' || *jpath == '+' || isdigit(*jpath)) end = soap_strtol(jpath, (char**)&jpath, 10); else hasend = false; if (*jpath == ':') step = soap_strtol(jpath + 1, (char**)&jpath, 10); else step = 1; if (step > 0) // end is exclusive (Python array slicing) --end; else if (hasend) ++end; } } if ((step > 0 && !(start <= end || (start >= 0 && end < 0))) || (step < 0 && !(start >= end || (start < 0 && end >= 0)))) { fprintf(stderr, "jsoncpp: JSONPath inverted bounds at ...->%s\n\n", jpath); exit(EXIT_FAILURE); } if (subs == 1 && *jpath != ',') // path: [x]... with x a name or index or [start]:[end][:step] slice break; if (subs == 1) // path: [x,...]... with x a name or index or [start]:[end][:step] slice { if (explain) indent(ctx, k) << "// for each case\n"; indent(ctx, k) << "int i, k = 1;\n"; if (v.compare(0, 4, "(*p)") == 0) { indent(ctx, k) << "value *q;\n"; p = "q"; u = "(*q)"; } else { indent(ctx, k) << "value *p;\n"; p = "p"; u = "(*p)"; } indent(ctx, k) << "do\n"; indent(ctx, k) << "{\n"; indent(ctx, k + 2) << "switch (k)\n"; indent(ctx, k + 2) << "{\n"; } indent(ctx, k + 4) << "case " << 2*subs-1 << ":\n"; if (!code.empty()) { indent(ctx, k + 4) << "{\n"; if (explain) indent(ctx, k + 6) << "// if current node " << v << " is an array/struct with field/element [(" << code << ")] ...\n"; indent(ctx, k + 6) << "k = " << 2*subs+1 << ";\n"; indent(ctx, k + 6) << "value& v = " << v << ";\n"; indent(ctx, k + 6) << "if ((i = v.nth(" << code << ")) >= 0)\n"; indent(ctx, k + 6) << "{\n"; indent(ctx, k + 8) << p << " = &v[i];\n"; indent(ctx, k + 8) << "break;\n"; indent(ctx, k + 6) << "}\n"; indent(ctx, k + 4) << "}\n"; } else if (!name.empty()) { if (explain) indent(ctx, k + 6) << "// if current node " << v << " is a struct with field '" << name << "' ...\n"; indent(ctx, k + 6) << "k = " << 2*subs+1 << ";\n"; if (optimal) { indent(ctx, k + 6) << "if ((i = " << v << ".nth(" << putstr(name) << ")) >= 0)\n"; indent(ctx, k + 6) << "{\n"; indent(ctx, k + 8) << p << " = &" << v << "[i];\n"; indent(ctx, k + 8) << "break;\n"; indent(ctx, k + 6) << "}\n"; } else { indent(ctx, k + 6) << "if (" << v << ".has(" << putstr(name) << "))\n"; indent(ctx, k + 6) << "{\n"; indent(ctx, k + 8) << p << " = &" << v << "[" << putstr(name) << "];\n"; indent(ctx, k + 8) << "break;\n"; indent(ctx, k + 6) << "}\n"; } } else if (step > 0) { if (explain) indent(ctx, k + 6) << "// if current node " << v << " is an array then iterate from " << start << " to " << end << " by " << step << " ...\n"; indent(ctx, k + 6) << "if (!" << v << ".is_array())\n"; indent(ctx, k + 6) << "{\n"; indent(ctx, k + 8) << "k = " << 2*subs+1 << ";\n"; indent(ctx, k + 8) << "continue;\n"; indent(ctx, k + 6) << "}\n"; if (start < 0) indent(ctx, k + 6) << "i = (" << start << " >= -" << v << ".size() ? " << start << " : -" << v << ".size())-" << step << ";\n"; else indent(ctx, k + 6) << "i = " << start-step << ";\n"; indent(ctx, k + 6) << "k = " << 2*subs << ";\n"; indent(ctx, k + 4) << "case " << 2*subs << ":\n"; indent(ctx, k + 6) << "i += " << step << ";\n"; if (start >= 0 && end < 0) // : 0 <= start <= size+end where end < 0 indent(ctx, k + 6) << "if (i <= " << v << ".size()+" << end << ")\n"; else if (start >= 0 && end >= 0) // : 0 <= start <= end < size indent(ctx, k + 6) << "if (i <= " << end << " && i < " << v << ".size())\n"; else // start < 0 && end < 0 : -size <= start <= end < 0 indent(ctx, k + 6) << "if (i <= " << end << ")\n"; indent(ctx, k + 6) << "{\n"; indent(ctx, k + 8) << p << " = &" << v << "[i];\n"; indent(ctx, k + 8) << "break;\n"; indent(ctx, k + 6) << "}\n"; indent(ctx, k + 6) << "else\n"; indent(ctx, k + 8) << "k = " << 2*subs+1 << ";\n"; } else if (step < 0) { if (explain) indent(ctx, k + 6) << "// if current node " << v << " is an array then iterate from " << start << " to " << end << " by " << step << " ...\n"; indent(ctx, k + 6) << "if (!" << v << ".is_array())\n"; indent(ctx, k + 6) << "{\n"; indent(ctx, k + 8) << "k = " << 2*subs+1 << ";\n"; indent(ctx, k + 8) << "continue;\n"; indent(ctx, k + 6) << "}\n"; if (start < 0 && end >= 0) indent(ctx, k + 6) << "i = " << v << ".size()+" << start-step << ";\n"; else if (start >= 0 && end >= 0) indent(ctx, k + 6) << "i = (" << start << " < " << v << ".size() ? " << start << " : " << v << ".size()-1)+" << -step << ";\n"; else // start < 0 && end < 0 indent(ctx, k + 6) << "i = " << start-step << ";\n"; indent(ctx, k + 6) << "k = " << 2*subs << ";\n"; indent(ctx, k + 4) << "case " << 2*subs << ":\n"; indent(ctx, k + 6) << "i -= " << -step << ";\n"; if (start < 0 && end >= 0) // : 0 <= end <= size+start where start < 0 indent(ctx, k + 6) << "if (i >= " << end << ")\n"; else if (start >= 0 && end >= 0) // : 0 <= end <= start < size indent(ctx, k + 6) << "if (i >= " << end << ")\n"; else // start < 0 && end < 0 : -size <= end <= start < 0 indent(ctx, k + 6) << "if (i >= " << end << " && i >= -" << v << ".size())\n"; indent(ctx, k + 6) << "{\n"; indent(ctx, k + 8) << p << " = &" << v << "[i];\n"; indent(ctx, k + 8) << "break;\n"; indent(ctx, k + 6) << "}\n"; indent(ctx, k + 6) << "else\n"; indent(ctx, k + 8) << "k = " << 2*subs+1 << ";\n"; } else { if (explain) indent(ctx, k + 6) << "// if current node " << v << " is an array with element [" << start << "] ...\n"; indent(ctx, k + 6) << "k = " << 2*subs+1 << ";\n"; indent(ctx, k + 6) << "if (" << v << ".has(" << start << "))\n"; indent(ctx, k + 6) << "{\n"; indent(ctx, k + 8) << p << " = &" << v << "[" << start << "];\n"; indent(ctx, k + 8) << "break;\n"; indent(ctx, k + 6) << "}\n"; } if (*jpath != ',') break; ++jpath; } if (subs == 0 && *jpath == ']') { fprintf(stderr, "jsoncpp: JSONPath empty '[]' at ...->%s\n\n", jpath); exit(EXIT_FAILURE); } if (*jpath != ']') { fprintf(stderr, "jsoncpp: JSONPath ']' expected at ...->%s\n\n", jpath); exit(EXIT_FAILURE); } ++jpath; if (subs == 1) // path: [x]... with x a name or index or [start]:[end][:step] range { if (!code.empty()) { if (explain) indent(ctx, k) << "// if current node " << v << " is an array/struct with field/element [(" << code << ")] then match " << jpath << "\n"; indent(ctx, k) << "value& v = " << v << ";\n"; indent(ctx, k) << "if ((j = v.nth(" << code << ")) >= 0)\n"; indent(ctx, k) << "{\n"; indent(ctx, k + 2) << "value& r = v[j];\n"; v = "r"; path_gen_cpp(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } else if (!name.empty()) { if (optimal) { if (explain) indent(ctx, k) << "// if current node " << v << " is a struct with field '" << name << "' then match " << jpath << "\n"; indent(ctx, k) << "if ((j = " << v << ".nth(" << putstr(name) << ")) >= 0)\n"; indent(ctx, k) << "{\n"; if (v[0] == 'r') { indent(ctx, k + 2) << "value& s = " << v << "[j];\n"; v = "s"; } else { indent(ctx, k + 2) << "value& r = " << v << "[j];\n"; v = "r"; } path_gen_cpp(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } else { indent(ctx, k) << "if (" << v << ".has(" << putstr(name) << "))\n"; indent(ctx, k) << "{\n"; v.append("[").append(putstrname(name.c_str())).append("]"); path_gen_cpp(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } } else if (step > 0) { if (explain) indent(ctx, k) << "// if current node " << v << " is an array then iterate from " << start << " to " << end << " by " << step << " to match " << jpath << "\n"; indent(ctx, k) << "if (" << v << ".is_array())\n"; indent(ctx, k) << "{\n"; if (start >= 0 && end < 0) { indent(ctx, k + 2) << "int k = " << v << ".size()-" << -end << ";\n"; indent(ctx, k + 2) << "for (int i = " << start << "; i <= k; i += " << step << ")\n"; } else if (start >= 0 && end >= 0) { indent(ctx, k + 2) << "int k = (" << end << " < " << v << ".size() ? " << end << " : " << v << ".size()-1);\n"; indent(ctx, k + 2) << "for (int i = " << start << "; i <= k; i += " << step << ")\n"; } else // start < 0 && end < 0 { indent(ctx, k + 2) << "int k = (" << start << " >= -" << v << ".size() ? " << start << " : -" << v << ".size());\n"; indent(ctx, k + 2) << "for (int i = k; i <= " << end << "; i += " << step << ")\n"; } indent(ctx, k + 2) << "{\n"; if (v[0] == 'r') { indent(ctx, k + 4) << "value& s = " << v << "[i];\n"; v = "s"; } else { indent(ctx, k + 4) << "value& r = " << v << "[i];\n"; v = "r"; } path_gen_cpp(ctx, jpath, v, k + 4, throwup); indent(ctx, k + 2) << "}\n"; indent(ctx, k) << "}\n"; } else if (step < 0) { if (explain) indent(ctx, k) << "// if current node " << v << " is an array then iterate from " << start << " to " << end << " by " << step << " to match " << jpath << "\n"; indent(ctx, k) << "if (" << v << ".is_array())\n"; indent(ctx, k) << "{\n"; if (start < 0 && end >= 0) { indent(ctx, k + 2) << "int k = " << v << ".size()-" << -start << ";\n"; indent(ctx, k + 2) << "for (int i = k; i >= " << end << "; i -= " << -step << ")\n"; } else if (start >= 0 && end >= 0) { indent(ctx, k + 2) << "int k = (" << start << " < " << v << ".size() ? " << start << " : " << v << ".size()-1);\n"; indent(ctx, k + 2) << "for (int i = k; i >= " << end << "; i -= " << -step << ")\n"; } else // start < 0 && end < 0 { indent(ctx, k + 2) << "int k = (" << end << " >= -" << v << ".size() ? " << end << " : -" << v << ".size());\n"; indent(ctx, k + 2) << "for (int i = " << start << "; i >= k; i -= " << -step << ")\n"; } indent(ctx, k + 2) << "{\n"; if (v[0] == 'r') { indent(ctx, k + 4) << "value& s = " << v << "[i];\n"; v = "s"; } else { indent(ctx, k + 4) << "value& r = " << v << "[i];\n"; v = "r"; } path_gen_cpp(ctx, jpath, v, k + 4, throwup); indent(ctx, k + 2) << "}\n"; indent(ctx, k) << "}\n"; } else { if (explain) indent(ctx, k) << "// if current node " << v << " is an array with element [" << start << "] then match " << jpath << "\n"; indent(ctx, k) << "if (" << v << ".has(" << start << "))\n"; indent(ctx, k) << "{\n"; v.append("[").append(soap_int2s(ctx, start)).append("]"); path_gen_cpp(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } } else { indent(ctx, k + 4) << "default:\n"; indent(ctx, k + 6) << "continue;\n"; indent(ctx, k + 2) << "}\n"; if (explain) indent(ctx, k + 2) << "// ... then match " << jpath << "\n"; path_gen_cpp(ctx, jpath, u, k + 2, throwup); indent(ctx, k) << "} while (k <= " << 2*subs << ");\n"; } } } else if (*jpath == '?') // path: P?Q means all values P such that Q (has at least one result) { if (throwup) { fprintf(stderr, "jsoncpp: JSONPath cannot nest '?' and '!' ...->%s\n\n", jpath); exit(EXIT_FAILURE); } ++jpath; if (explain) indent(ctx, k) << "// value of current node " << v << " if its descendants match " << jpath << "\n"; indent(ctx, k) << "try\n"; indent(ctx, k) << "{\n"; std::string u = v; path_gen_cpp(ctx, jpath, v, k + 2, true); indent(ctx, k) << "}\n"; indent(ctx, k) << "catch (const bool&)\n"; indent(ctx, k) << "{\n"; path_exec_cpp(ctx, u, k + 2); indent(ctx, k) << "}\n"; } else if (*jpath == '!') // path: P!Q means all values P such that not Q (has no results) { if (throwup) { fprintf(stderr, "jsoncpp: JSONPath cannot nest '?' and '!' ...->%s\n\n", jpath); exit(EXIT_FAILURE); } ++jpath; if (explain) indent(ctx, k) << "// value of current node " << v << " if its descendants do not match " << jpath << "\n"; indent(ctx, k) << "try\n"; indent(ctx, k) << "{\n"; std::string u = v; path_gen_cpp(ctx, jpath, v, k + 2, true); indent(ctx, k + 2) << "throw false;\n"; indent(ctx, k) << "}\n"; indent(ctx, k) << "catch (const bool& k)\n"; indent(ctx, k) << "{\n"; indent(ctx, k + 2) << "if (k == false)\n"; path_exec_cpp(ctx, u, k + 4); indent(ctx, k) << "}\n"; } else if (*jpath == '*') // path: *... { ++jpath; if (explain) indent(ctx, k) << "// iterate over current array/struct node " << v << " to match " << jpath << "\n"; indent(ctx, k) << "value::iterator k = " << v << ".end();\n"; indent(ctx, k) << "for (value::iterator i = " << v << ".begin(); i != k; ++i)\n"; indent(ctx, k) << "{\n"; indent(ctx, k + 2) << "value& r = " << v << "*i;\n"; v = "r"; path_gen_cpp(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } else if (!*jpath) { if (throwup) indent(ctx, k) << "throw true;\n"; else path_exec_cpp(ctx, v, k); } else // path: name... { std::string name = getname(&jpath); if (explain) indent(ctx, k) << "// if current node " << v << " is a struct with field '" << name << "' then match " << jpath << "\n"; if (optimal) { indent(ctx, k) << "if ((j = " << v << ".nth(" << putstr(name) << ")) >= 0)\n"; indent(ctx, k) << "{\n"; if (v[0] == 'r') { indent(ctx, k + 2) << "value& s = " << v << "[j];\n"; v = "s"; } else { indent(ctx, k + 2) << "value& r = " << v << "[j];\n"; v = "r"; } path_gen_cpp(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } else { indent(ctx, k) << "if (" << v << ".has(" << putstr(name) << "))\n"; indent(ctx, k) << "{\n"; v.append("[").append(putstrname(name.c_str())).append("]"); path_gen_cpp(ctx, jpath, v, k + 2, throwup); indent(ctx, k) << "}\n"; } } } static void path_exec_cpp(struct soap *ctx, std::string& v, int k) { if (jcode) { indent(ctx, k) << "value& v = " << v << ";\n"; indent(ctx, k) << jcode << "\n"; } else { indent(ctx, k) << "QUERY_YIELD(" << v << ");\n"; } } //////////////////////////////////////////////////////////////////////////////// // // Misc // //////////////////////////////////////////////////////////////////////////////// static std::ostream& indent(soap *ctx, int k) { *ctx->os << std::setw(k) << "" << std::setw(0); return *ctx->os; } static std::string gen_ident(const std::string& lhs, const char *name) { std::string id = lhs; id.append("_"); for (const char *s = name; *s; name = s) { while (isalnum(*s)) s++; id.append(name, s - name); if (*s) s++; } return id; } static std::string gen_counter(int k) { std::string id = "i"; char tmp[2]; if (k <= 9) k += '0'; else if (k <= 36) k += 'a' - 10; else k += 'A' - 36; tmp[0] = k; tmp[1] = '\0'; id.append(tmp); return id; } static std::string putstrname(const char *name) { std::stringstream ss; ss << putstr(name); return ss.str(); } static std::string putname(const char *name) { const char *s; for (s = name; isalnum(*s) || *s == '_'; s++) continue; if (!*s) return name; return putstrname(name); } static std::string getname(const char **jpath) { const char *s = *jpath; const char *t = s; if (*t == '\'' || *t == '"') { while (*++t && *t != *s) if (*t == '\\' && *(t+1)) ++t; if (!*t) { fprintf(stderr, "jsoncpp: JSONPath closing quote expected at ...->%s\n\n", s); exit(EXIT_FAILURE); } *jpath = ++t; return std::string(s + 1, t - s - 2); } while (*t && !ispunct(*t) && !isspace(*t)) ++t; if (t == s) { fprintf(stderr, "jsoncpp: JSONPath empty field name at ...->%s\n\n", s); exit(EXIT_FAILURE); } *jpath = t; return std::string(s, t - s); } gsoap-2.8.91/gsoap/samples/xml-rpc-json/xml-rpc.h0000644000175000017500000005706013525245163021143 0ustar ellertellert/* xml-rpc.h XML-RPC binding for C and C++ -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2012, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //////////////////////////////////////////////////////////////////////////////// // // C/C++ XML-RPC/JSON API Value Allocation/Initialization // //////////////////////////////////////////////////////////////////////////////// /// C/C++ function returns a pointer to a new value extern struct value * new_value(struct soap *soap); /// C/C++ function to init or reset a value, returns a pointer to this value extern struct value * init_value(struct soap *soap, struct value *v); //////////////////////////////////////////////////////////////////////////////// // // C++ XML-RPC/JSON API Array, Struct, and Parameter Iterators // //////////////////////////////////////////////////////////////////////////////// #include "xml-rpc-iters.h" /* deferred for inclusion by C++ compiler */ /// C++ external iterator class for values extern class value_iterator; /// C++ external iterator class for values extern class value_const_iterator; /// C++ external iterator class for structs /// C++ external iterator class for structs extern class _struct_iterator; /// C++ external iterator class for structs extern class _struct_const_iterator; /// C++ external iterator class for arrays extern class _array_iterator; /// C++ external iterator class for arrays extern class _array_const_iterator; /// C++ only: declare external iterator class for parameters extern class params_iterator; /// C++ only: declare external iterator class for parameters extern class params_const_iterator; //////////////////////////////////////////////////////////////////////////////// // // C/C++ XML-RPC and JSON Types // //////////////////////////////////////////////////////////////////////////////// /// Scalar <boolean> element with values 0 (false) or 1 (true) typedef char _boolean; /// Scalar <double> element with double floating point typedef double _double; /// Scalar <i4> element with 32 bit integer typedef int _i4; /// Scalar <int> element with 64 bit integer typedef LONG64 _int; /// Scalar <string> element typedef char * _string; /// Scalar <dateTime.iso8601> element with ISO8601 date and time formatted string typedef char * _dateTime_DOTiso8601; /// Represents the <base64> binary data element struct _base64 { // C++ function members, not available in C (when using stdsoap2 -c) public: _base64(); _base64(struct soap*); _base64(struct soap*, int, unsigned char*); int size() const; ///< byte size of data unsigned char * ptr(); ///< pointer to data void size(int); ///< set byte size of data void ptr(unsigned char*);///< set pointer to data // serializable content public: unsigned char * __ptr; ///< pointer to raw binary data block int __size; ///< size of raw binary data block }; /// Represents the <rawdata> binary data element struct _rawdata { // C++ function members, not available in C (when using stdsoap2 -c) public: _rawdata(); _rawdata(struct soap*); _rawdata(struct soap*, int, char*); _rawdata(struct soap*, char*); int size() const; ///< byte size of data char * ptr(); ///< pointer to data void size(int); ///< set byte size of data void ptr(char*); ///< set pointer to data // serializable content public: unsigned char * __ptr; ///< pointer to raw binary data block int __size; ///< size of raw binary data block }; /// Represents the <struct> record structure element struct _struct { // C++ function members, not available in C (when using stdsoap2 -c) public: typedef _struct_iterator iterator; typedef _struct_const_iterator const_iterator; _struct(); _struct(const struct _struct&); _struct(struct soap*); _struct(struct soap*, int); extern bool empty() const; ///< true if struct is empty int size() const; ///< number of accessors in struct struct value& operator[](int) const;///< struct index (negative to get from end) struct value& operator[](const char*);///< struct accessor struct value& operator[](const wchar_t*);///< struct accessor const struct value& operator[](const char*) const;///< struct accessor const struct value& operator[](const wchar_t*) const;///< struct accessor _struct_iterator begin() const; ///< struct iterator begin _struct_iterator end() const; ///< struct iterator end // serializable content public: int __size; ///< number of members struct member * member; ///< pointer to member array struct soap * soap; ///< ref to soap struct that manages this type }; /// Represents the <data> element struct data { // serializable content public: int __size; ///< number of array elements struct value * value; ///< pointer to array elements }; /// Represents the <array> array of values element struct _array { // C++ function members, not available in C (when using stdsoap2 -c) public: typedef _array_iterator iterator; typedef _array_const_iterator const_iterator; _array(); _array(const struct _array&); _array(struct soap*); _array(struct soap*, int); extern bool empty() const; ///< true if array is empty int size() const; ///< number of array elements void size(int); ///< (re)set number of array elements struct value& operator[](int);///< array index (negative to get from end) const struct value& operator[](int) const;///< array index (negative to get from end) _array_iterator begin() const; ///< array iterator begin _array_iterator end() const; ///< array iterator end // serializable content public: struct data data; ///< data with values struct soap* soap; ///< ref to soap struct that manages this type }; /// Represents the <value> container element /// The <value> element contains either string data stored in __any or an /// other type of data stored in a subelement. In case of a subelement, the /// __type member indicates the type of data pointed to by the ref member. /// For example, when __type = SOAP_TYPE__int then the ref points to a LONG64, /// when __type = SOAP_TYPE__string (char*)ref is a string. struct value { // C++ function members, not available in C (when using stdsoap2 -c) public: typedef value_iterator iterator; typedef value_const_iterator const_iterator; value(); value(const struct value&); value(struct soap*); value(struct soap*, extern bool); value(struct soap*, _i4); value(struct soap*, _int); value(struct soap*, _double); value(struct soap*, const char*); value(struct soap*, const std::string&); value(struct soap*, const wchar_t*); value(struct soap*, const std::wstring&); value(struct soap*, ULONG64); value(struct soap*, const struct _array&); value(struct soap*, const struct _struct&); value(struct soap*, const struct _base64&); value(struct soap*, const struct _rawdata&); operator extern bool() const; operator _i4() const; operator _int() const; operator _double() const; operator char*() const; operator std::string() const; operator wchar_t*() const; operator std::wstring() const; operator ULONG64() const; operator struct _array&(); operator const struct _array&() const; operator struct _struct&(); operator const struct _struct&() const; operator struct _base64&(); operator const struct _base64&() const; operator struct _rawdata& (); operator const struct _rawdata& () const; struct value& operator[](int); ///< array/struct index (negative to get from end) struct value& operator[](const char*); ///< struct access struct value& operator[](const std::string&); ///< struct access struct value& operator[](const wchar_t*); ///< struct access struct value& operator[](const std::wstring&); ///< struct access const struct value& operator[](int) const; ///< array/struct index (negative to get from end) const struct value& operator[](const char*) const; ///< struct access const struct value& operator[](const std::string&) const; ///< struct access const struct value& operator[](const wchar_t*) const; ///< struct access const struct value& operator[](const std::wstring&) const; ///< struct access extern bool operator=(extern bool); _i4 operator=(_i4); _int operator=(_int); _double operator=(_double); ULONG64 operator=(ULONG64); const char * operator=(const char*); char * operator=(char*); char * operator=(const std::string&); const char * operator=(const wchar_t*); char * operator=(wchar_t*); char * operator=(const std::wstring&); struct _array& operator=(const struct _array&); struct _struct& operator=(const struct _struct&); struct _base64& operator=(const struct _base64&); struct _rawdata& operator=(const struct _rawdata&); extern void size(int); ///< set/allocate size of array extern int size() const; ///< returns array/struct size or 0 extern bool empty() const; ///< true if empty array or struct extern int nth(int) const; ///< returns nth index if index is in bounds, < 0 otherwise extern int nth(const char*) const; ///< returns nth index of name in struct, < 0 otherwise extern int nth(const wchar_t*) const; ///< returns nth index of name in struct, < 0 otherwise extern bool has(int) const; ///< true if array index is in bounds extern bool has(const char*) const; ///< true if struct has name as a key extern bool has(const wchar_t*) const; ///< true if struct has name as a key extern bool is_null() const; ///< true if value is not set (JSON null) extern bool is_bool() const; ///< true if value is Boolean type extern bool is_false() const; ///< true if value is Boolean false extern bool is_true() const; ///< true if value is Boolean true extern bool is_int() const; ///< true if value is int type extern bool is_double() const; ///< true if value is double type extern bool is_number() const; ///< true if value is a number (int or float) extern bool is_string() const; ///< true if value is string type extern bool is_dateTime() const; ///< true if value is dateTime extern bool is_array() const; ///< true if value is array type extern bool is_struct() const; ///< true if value is struct type extern bool is_base64() const; ///< true if value is base64 type extern bool is_rawdata() const; ///< true if value is rawdata value_iterator begin(); ///< value iterator begin value_iterator end(); ///< value iterator end // serializable content public: int __type 0; ///< optional SOAP_TYPE_X, where X is a type name void * ref; ///< ref to data _string __any; ///< <value> string content in XML-RPC (not JSON), if any struct soap * soap; ///< ref to soap struct that manages this type }; /// Represents the <member> element of a <struct> struct member { // serializable content public: char * name; ///< struct accessor name struct value value; ///< struct accessor value }; //////////////////////////////////////////////////////////////////////////////// // // C/C++ XML-RPC API Method Parameters and Call Objects // //////////////////////////////////////////////////////////////////////////////// /// Represents the <params> of a <methodCall> request and response struct params { // C++ function members, not available in C (when using stdsoap2 -c) public: typedef params_iterator iterator; typedef params_const_iterator const_iterator; params(); params(struct soap*); params(struct soap*, int); extern bool empty() const; ///< true if no parameters int size() const; ///< number of parameters struct value& operator[](int);///< parameter index (negative to get from end) const struct value& operator[](int) const;///< parameter index (negative to get from end) params_iterator begin() const; ///< parameter accessor iterator begin params_iterator end() const; ///< parameter accessor iterator end // serializable content public: int __size; ///< number of parameters struct param * param; ///< pointer to array of parameters struct soap * soap; ///< ref to soap struct that manages this type }; /// Represents a <param> of the <params> of a <methodCall> struct param { // serializable content public: struct value value; ///< parameter value }; /// Represents the <methodResponse> element with response <params> and <fault> struct methodResponse { // C++ function members, not available in C (when using stdsoap2 -c) public: methodResponse(); methodResponse(struct soap*); struct value& operator[](int);///< response parameter accessor index const struct value& operator[](int) const;///< response parameter accessor index struct value& get_fault(void);///< get fault, if set struct value& set_fault(const char*);///< set fault struct value& set_fault(struct value&);///< set fault int recv(); ///< receive response int send(); ///< send response // serializable content public: struct params * params; ///< response return parameters, if any struct fault * fault; ///< response fault, if any struct soap * soap; ///< ref to soap struct that manages this type }; /// Represents the <methodCall> element with <methodName> and request <params> for remote invocation struct methodCall { // private state info private: char * methodEndpoint; ///< XML-RPC endpoint struct methodResponse*methodResponse; ///< holds the response after the call // C++ function members, not available in C (when using stdsoap2 -c) public: methodCall(); methodCall(struct soap*); methodCall(struct soap*, const char *endpoint, const char *methodname); ///< instantiate with endpoint and method name struct value& operator[](int);///< method parameter accessor index const struct value& operator[](int) const;///< method parameter accessor index struct params& operator()(); ///< method invocation struct params& operator()(const struct params&); ///< method invocation with param list struct params& response(); ///< get last response struct value& fault(); ///< fault value of response const char * name() const; ///< get method name int error() const; ///< gSOAP error code int recv(); ///< receive call int send(); ///< send call // serializable content public: char * methodName; ///< name of the method struct params params; ///< input request parameters struct soap * soap; ///< ref to soap struct that manages this type }; /// Represents the <fault> container element with a value struct fault { // serializable content public: struct value value; ///< value of the fault }; //////////////////////////////////////////////////////////////////////////////// // // C XML-RPC/JSON API Functions // //////////////////////////////////////////////////////////////////////////////// /// C function returns pointer to Boolean, coerces v to Boolean if needed extern _boolean *bool_of(struct value *v); /// C function returns pointer to int, coerces v to int if needed extern _int *int_of(struct value *v); /// C function returns pointer to double, coerces v to double if needed extern _double *double_of(struct value *v); /// C function returns pointer to string (pointer to char * to set or get), coerces v to string if needed extern const char **string_of(struct value *v); /// C function returns pointer to string of ISO 8601, coerces v to string if needed (get time with soap_s2dateTime and set time with soap_dateTime2s) extern const char **dateTime_of(struct value *v); /// C function returns pointer to base64 struct, coerces v to base64 struct if needed extern struct _base64 *base64_of(struct value *v); /// C function returns pointer to string of RAW JSON extern struct _rawdata *rawdata_of(struct value* v); /// C function returns pointer to member value of a struct, coerces v to struct if needed extern struct value *value_at(struct value *v, const char *s); /// C function returns pointer to member value of a struct, coerces v to struct if needed extern struct value *value_atw(struct value *v, const wchar_t *s); /// C function returns the nth index of a name in a struct, < 0 otherwise extern int nth_at(const struct value *v, const char *s); /// C function returns the nth index of a name in a struct, < 0 otherwise extern int nth_atw(const struct value *v, const wchar_t *s); /// C function returns the nth index if an nth index in the array exists, < 0 otherwise extern int nth_nth(const struct value *v, int n); /// C function returns pointer to nth member (name and value) of a struct or NULL when not exists extern struct member *nth_member(struct value *v, int n); /// C function returns pointer to array element value at index n, coerces v to array with value at n if needed extern struct value *nth_value(struct value *v, int n); /// C function returns true if value is not set or assigned (JSON null) extern _boolean is_null(const struct value *v); /// C function returns true if value is a 32 or a 64 bit int extern _boolean is_int(const struct value *v); /// C function returns true if value is a 64 bit double floating point extern _boolean is_double(const struct value *v); /// C function returns true if value is a number (int or float) extern _boolean is_number(const struct value *v); /// C function returns true if value is a string extern _boolean is_string(const struct value *v); /// C function returns true if value is a Boolean "true" or "false" value extern _boolean is_bool(const struct value *v); /// C function returns true if value is Boolean "true" extern _boolean is_true(const struct value *v); /// C function returns true if value is Boolean "false" extern _boolean is_false(const struct value *v); /// C function returns true if array of values extern _boolean is_array(const struct value *v); /// C function returns true if structure, a.k.a. a JSON object extern _boolean is_struct(const struct value *v); /// C function returns true if ISO 8601, always false for received JSON extern _boolean is_dateTime(const struct value *v); /// C function returns true if base64, always false for received JSON extern _boolean is_base64(const struct value *v); /// C function returns true if RAW JSON, always false for received JSON extern _boolean is_rawdata(const struct value *v); /// C function to create an empty struct extern void set_struct(struct value *v); /// C function set/allocate size of array extern void set_size(struct value *v, int n); /// C function returns the size of an array or struct extern int has_size(const struct value *v); /// C function returns true (1) if struct/array is empty or when value is not an struct/array, 0 otherwise extern int is_empty(const struct value *v); //////////////////////////////////////////////////////////////////////////////// // // C XML-RPC API Method Parameters and Call Function // //////////////////////////////////////////////////////////////////////////////// /// C function returns pointer to new parameters for XML-RPC methodCall extern struct params *new_params(struct soap *soap); /// C function to clear parameters, returns a pointer to the empty parameters extern struct params *init_params(struct soap *soap, struct params *p); /// C function returns pointer to parameter value at index n, creates new parameter if needed extern struct value *nth_param(struct params *p, int n); /// C function to invoke XML-RPC methodCall on endpoint given methodCall m populates methodResponse r, returns SOAP_OK or error extern int call_method(struct soap *soap, const char *endpoint, const char *methodName, struct params *p, struct methodResponse *r); gsoap-2.8.91/gsoap/samples/xml-rpc-json/Makefile.am0000644000175000017500000000303413525245163021434 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = jsoncpp json-GitHub json-gdm json-currentTime json-currentTimeServer xml-rpc-currentTime SOAPHEADER = xml-rpc.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = $(SOAP_NS_DEF) jsoncpp_SOURCES = jsoncpp.cpp xml-rpc.cpp json.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) jsoncpp_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) json_GitHub_CPPFLAGS = -DWITH_OPENSSL -DWITH_GZIP json_GitHub_SOURCES = json-GitHub.cpp xml-rpc.cpp json.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) json_GitHub_LDADD = $(SOAP_CPP_LIB_SSL) $(SAMPLE_EXTRA_LIBS) $(SAMPLE_SSL_LIBS) json_gdm_CPPFLAGS = -DWITH_OPENSSL -DWITH_GZIP json_gdm_SOURCES = json-GoogleDistanceMatrix.cpp xml-rpc.cpp json.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) json_gdm_LDADD = $(SOAP_CPP_LIB_SSL) $(SAMPLE_EXTRA_LIBS) $(SAMPLE_SSL_LIBS) json_currentTime_SOURCES = json-currentTime.cpp xml-rpc.cpp json.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) json_currentTime_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) json_currentTimeServer_SOURCES = json-currentTimeServer.cpp xml-rpc.cpp json.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) json_currentTimeServer_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread xml_rpc_currentTime_SOURCES = xml-rpc-currentTime.cpp xml-rpc.cpp json.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) xml_rpc_currentTime_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) gsoap-2.8.91/gsoap/samples/xml-rpc-json/xml-rpc-currentTimeServer.cpp0000644000175000017500000000765213525245163025166 0ustar ellertellert/* xml-rpc-currentTimeServer.cpp XML-RPC currenTime server (C++ version) CGI or stand-alone multi-threaded server Returns XML-RPC message with current time to client. Compile: soapcpp2 xml-rpc.h c++ -o xml-rpc-currentTimeServer xml-rpc-currentTimeServer.cpp xml-rpc.cpp xml-rpc-io.cpp stdsoap2.cpp soapC.cpp Install as CGI on Web server Or run as stand-alone server (e.g. on port 18000): ./xml-rpc-currentTimeServer 18000 -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include #ifdef _POSIX_THREADS #include // use Pthreads #endif #define BACKLOG (100) // Max. request backlog #define MAX_THR (8) // Max. threads to serve requests using namespace std; int serve_request(soap*); int main(int argc, char **argv) { soap *ctx = soap_new1(SOAP_IO_KEEPALIVE | SOAP_XML_INDENT); ctx->send_timeout = 10; // 10 sec ctx->recv_timeout = 10; // 10 sec if (argc < 2) return serve_request(ctx); int port = atoi(argv[1]); #ifdef _POSIX_THREADS pthread_t tid; void *arg; #endif if (!soap_valid_socket(soap_bind(ctx, NULL, port, BACKLOG))) { soap_print_fault(ctx, stderr); exit(1); } for (;;) { if (!soap_valid_socket(soap_accept(ctx))) { soap_print_fault(ctx, stderr); } else { #ifdef _POSIX_THREADS arg = (void*)soap_copy(ctx); while (pthread_create(&tid, NULL, (void*(*)(void*))serve_request, arg)) sleep(1); #else serve_request(ctx); #endif } } soap_free(ctx); return 0; } int serve_request(soap* ctx) { methodCall m(ctx); #ifdef _POSIX_THREADS pthread_detach(pthread_self()); #endif // HTTP keep-alive max number of iterations unsigned int k = ctx->max_keep_alive; do { if (ctx->max_keep_alive > 0 && !--k) ctx->keep_alive = 0; if (m.recv() != SOAP_OK) soap_print_fault(ctx, stderr); else { methodResponse r(ctx); if (!strcmp(m.name(), "currentTime.getCurrentTime")) // method name matches: first parameter of response is time r[0] = (ULONG64)time(0); else // otherwise, set fault r.set_fault("Wrong method"); if (r.send() != SOAP_OK) soap_print_fault(ctx, stderr); } // close (keep-alive may keep socket open when client supports it) soap_closesock(ctx); } while (ctx->keep_alive); int err = ctx->error; // clean up soap_destroy(ctx); soap_end(ctx); #ifdef _POSIX_THREADS // free the ctx copy for this thread soap_free(ctx); #endif return err; } /* Don't need a namespace table. We put an empty one here to avoid link errors */ struct Namespace namespaces[] = { {NULL, NULL} }; gsoap-2.8.91/gsoap/samples/xml-rpc-json/xml-rpc-json.cpp0000644000175000017500000001116713525245163022443 0ustar ellertellert/* xml-rpc-json.cpp XML-RPC <=> JSON serialization example Requires xml-rpc.h, xml-rpc.cpp, json.h, and json.cpp Compile: soapcpp2 -CSL xml-rpc.h c++ -o xml-rpc-json xml-rpc-json.cpp xml-rpc.cpp json.cpp stdsoap2.cpp soapC.cpp To put JSON types and operations in a C++ namespace, compile: soapcpp2 -qjson -CSL xml-rpc.h soapcpp2 -CSL -penv env.h c++ -DJSON_NAMESPACE -o xml-rpc-json xml-rpc-json.cpp xml-rpc.cpp json.cpp stdsoap2.cpp jsonC.cpp envC.cpp -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "json.h" #include using namespace std; #ifdef JSON_NAMESPACE using namespace json; #endif int main() { // set up context soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); // create a value value v(ctx); // create an input stream from a given string with JSON content stringstream in("[ [1,\"2\",3.14, true], {\"name\": \"gsoap\", \"major\": 2.8, \"©\": 2015} ]"); // parse JSON content in >> v; if (v.soap->error) cerr << "Error reading JSON\n"; // write v in XML-RPC format to cout (soap_write_value is soapcpp2-generated) ctx->os = &cout; soap_write_value(ctx, &v); if (v.soap->error) cerr << "Error writing XML-RPC\n"; // assumes writes can fail if deemed critical // let's change some of v's values: v[0][0] = (char*)v[0][0]; // convert int 1 to string "1" v[0][1] = (int)v[0][1]; // convert string "2" to 32 bit int = 2 v[0][2] = (LONG64)v[0][2]; // truncate 3.14 to 64 bit int = 3 v[0].size(3); // reset size to 3 to remove last entry v[1]["name"] = L"gSOAP © Genivia"; v[1]["major"] = 2.9; v[1][L"©"] = 2016; v[1]["released"] = false; // v[2] = deliberately skipped, which will show up as null v[3] = (ULONG64)time(0); v[4] = 123; // see below v[5] = "123"; // see below v[6] = 456; // see below v[7] = v[0] + v[4]; // array concat: copy array v[0] to v[7] extended with one element value of v[4] // find all values 123 in v[] and change to 456, increment all other ints, // string "123" is also changed to 456, since we deliberately do not guard // the change by a type check for (value::iterator i = v.begin(); i != v.end(); ++i) { if ((int)*i == 123) *i = 456; else if (i->is_int()) *i = (int)*i + 1; } // check without changing values const value x = v; const value y = x[7]; if (!y.is_array() || !y[0].is_string() || strcmp(y[0], "1")) exit(1); const value z = v[1]["name"]; std::wstring w = z; std::cout << soap_wchar2s(ctx, w.c_str()) << std::endl; // print index, name, and value of structure v[1] for (value::const_iterator i = v[1].begin(); i != v[1].end(); ++i) cout << "[" << i.index() << "] " << i.name() << ": " << *i << endl; // display in JSON format using stream ops defined in json.h/.cpp API cout << endl << "JSON output of modified value:" << endl << v << endl; // display in XML-RPC format using soap_write_value() cout << endl << "XML-RPC output of modified value:" << endl; ctx->os = &cout; soap_write_value(ctx, &v); cout << endl; // clean up soap_destroy(ctx); soap_end(ctx); soap_free(ctx); return 0; } /* Don't need a namespace table. We put an empty one here to avoid link errors */ struct Namespace namespaces[] = { {NULL, NULL} }; gsoap-2.8.91/gsoap/samples/xml-rpc-json/json.c0000644000175000017500000007161213525245163020524 0ustar ellertellert/* json.c[pp] JSON C/C++ API For more information please visit: http://www.genivia.com/doc/xml-rpc-json/html/ -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "json.h" #ifdef JSON_NAMESPACE #ifdef __cplusplus # define SOAP_TYPE__boolean SOAP_TYPE_json__boolean # define SOAP_TYPE__i4 SOAP_TYPE_json__i4 # define SOAP_TYPE__int SOAP_TYPE_json__int # define SOAP_TYPE__double SOAP_TYPE_json__double # define SOAP_TYPE__dateTime_DOTiso8601 SOAP_TYPE_json__dateTime_DOTiso8601 # define SOAP_TYPE__string SOAP_TYPE_json__string # define SOAP_TYPE__array SOAP_TYPE_json__array # define SOAP_TYPE__struct SOAP_TYPE_json__struct # define SOAP_TYPE__base64 SOAP_TYPE_json__base64 # define SOAP_TYPE__rawdata SOAP_TYPE_json__rawdata #endif #endif #ifdef JSON_NAMESPACE #ifdef __cplusplus namespace json { #endif #endif /******************************************************************************\ * * JSON error * \******************************************************************************/ int json_error(struct soap *soap, struct value *v) { if (soap->error && v) { const char *s, *t; soap_set_fault(soap); s = soap_fault_string(soap); t = soap_fault_detail(soap); /* set JSON error property (Google JSON Style Guide) */ #ifdef __cplusplus (*v)["error"]["code"] = soap->error; if (s) { (*v)["error"]["message"] = s; if (t) (*v)["error"]["errors"][0]["message"] = t; } #else *int_of(value_at(value_at(v, "error"), "code")) = soap->error; if (s) { *string_of(value_at(value_at(v, "error"), "message")) = soap_strdup(soap, s); if (t) *string_of(value_at(nth_value(value_at(value_at(v, "error"), "errors"), 0), "message")) = soap_strdup(soap, t); } #endif } return soap->error; } int json_send_fault(struct soap *soap) { int status = soap->error; struct value *v; if (status == SOAP_OK || status == SOAP_STOP) return soap_closesock(soap); if (status >= 200 && status < 300) return soap_send_empty_response(soap, status); if (status < 400) status = 500; soap->keep_alive = 0; /* error: close connection by disabling keep-alive */ v = new_value(soap); json_error(soap, v); soap->http_content = "application/json; charset=utf-8"; if (soap_response(soap, SOAP_FILE + status) || json_send(soap, v) || soap_end_send(soap)) return soap_closesock(soap); return soap_closesock(soap); } int json_send_error(struct soap *soap, int status, const char *message, const char *details) { struct value *v = new_value(soap); if (status < 200 || status > 599) status = 0; /* set JSON error property (Google JSON Style Guide) */ #ifdef __cplusplus (*v)["error"]["code"] = status; if (message) (*v)["error"]["message"] = message; if (details) (*v)["error"]["errors"][0]["message"] = details; #else *int_of(value_at(value_at(v, "error"), "code")) = status; if (message) *string_of(value_at(value_at(v, "error"), "message")) = soap_strdup(soap, message); if (details) *string_of(value_at(nth_value(value_at(value_at(v, "error"), "errors"), 0), "message")) = soap_strdup(soap, details); #endif soap->http_content = "application/json; charset=utf-8"; if (soap_response(soap, SOAP_FILE + status) || json_send(soap, v) || soap_end_send(soap)) return soap_closesock(soap); return soap_closesock(soap); } /******************************************************************************\ * * JSON output * \******************************************************************************/ int json_write(struct soap *soap, const struct value *v) { if (soap_begin_send(soap) || json_send(soap, v) || soap_end_send(soap)) return soap->error; return SOAP_OK; } /******************************************************************************/ int json_send(struct soap *soap, const struct value *v) { static const char *json_indent_string = ",\n "; int i, n = 1; if (!v) return SOAP_OK; switch (v->__type) { case SOAP_TYPE__array: if ((soap->mode & SOAP_XML_INDENT)) n = 2 * (++soap->level % 40) + 2; if (soap_send_raw(soap, "["/*"]"*/, 1)) return soap->error; if (v->ref) { for (i = 0; i < ((struct _array*)v->ref)->data.__size; i++) { if (soap_send_raw(soap, json_indent_string + (i == 0), n - (i == 0))) return soap->error; if (json_send(soap, &(((struct _array*)v->ref)->data.value)[i])) return soap->error; } } if ((soap->mode & SOAP_XML_INDENT)) { if (i && soap_send_raw(soap, json_indent_string + 1, n - 3)) return soap->error; soap->level--; } return soap_send_raw(soap, /*"["*/"]", 1); case SOAP_TYPE__boolean: if (*(_boolean*)v->ref == 1) return soap_send_raw(soap, "true", 4); return soap_send_raw(soap, "false", 5); case SOAP_TYPE__double: return soap_send(soap, soap_double2s(soap, (double)*(_double*)v->ref)); case SOAP_TYPE__i4: return soap_send(soap, soap_int2s(soap, (int)*(_i4*)v->ref)); case SOAP_TYPE__int: return soap_send(soap, soap_LONG642s(soap, (LONG64)*(_int*)v->ref)); case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: return json_send_string(soap, (const char*)v->ref); case SOAP_TYPE__base64: if (soap_send_raw(soap, "\"", 1)) return soap->error; if (v->ref && soap_putbase64(soap, ((struct _base64*)v->ref)->__ptr, ((struct _base64*)v->ref)->__size)) return soap->error; return soap_send_raw(soap, "\"", 1); case SOAP_TYPE__rawdata: return soap_send_raw(soap, (const char*)(((struct _rawdata*)v->ref)->__ptr), ((struct _rawdata*)v->ref)->__size); case SOAP_TYPE__struct: if ((soap->mode & SOAP_XML_INDENT)) n = 2 * (++soap->level % 40) + 2; if (soap_send_raw(soap, "{"/*"}"*/, 1)) return soap->error; if (v->ref) { for (i = 0; i < ((struct _struct*)v->ref)->__size; i++) { if (soap_send_raw(soap, json_indent_string + (i == 0), n - (i == 0))) return soap->error; if (json_send_string(soap, (((struct _struct*)v->ref)->member)[i].name) || soap_send_raw(soap, ": ", 1 + (n > 1)) || json_send(soap, &(((struct _struct*)v->ref)->member)[i].value)) return soap->error; } } if ((soap->mode & SOAP_XML_INDENT)) { if (i && soap_send_raw(soap, json_indent_string + 1, n - 3)) return soap->error; soap->level--; } return soap_send_raw(soap, /*"{"*/"}", 1); default: if (v->__any) return json_send_string(soap, v->__any); return soap_send_raw(soap, "null", 4); } return SOAP_OK; } /******************************************************************************/ int json_send_string(struct soap *soap, const char *s) { const char *t = s; int c; char buf[8]; if (!s) return soap_send_raw(soap, "\"\"", 2); if (soap_send_raw(soap, "\"", 1)) return soap->error; while ((c = *s++)) { if (c < 0x20 && c > 0) { switch (c) { case '\b': c = 'b'; break; case '\f': c = 'f'; break; case '\n': c = 'n'; break; case '\r': c = 'r'; break; case '\t': c = 't'; break; } if (c > 0x20) { buf[0] = '\\'; buf[1] = c; if (soap_send_raw(soap, t, s - t - 1) || soap_send_raw(soap, buf, 2)) return soap->error; t = s; } else { (SOAP_SNPRINTF(buf, sizeof(buf), 7), "\\u%4x", c); if (soap_send_raw(soap, t, s - t - 1) || soap_send_raw(soap, buf, 6)) return soap->error; t = s; } } else if (c == '"' || c == '\\') { buf[0] = '\\'; buf[1] = c; if (soap_send_raw(soap, t, s - t - 1) || soap_send_raw(soap, buf, 2)) return soap->error; t = s; } else if ((c & 0x80)) { if ((soap->omode & SOAP_ENC_LATIN) && (soap->omode & SOAP_C_UTFSTRING)) /* UTF-8 to ISO 8859-1 */ { if (c < 0xE0 && (c & 0x1F) <= 0x03) buf[0] = ((c & 0x1F) << 6) | (*s++ & 0x3F); else buf[0] = '?'; if (soap_send_raw(soap, t, s - t - 1) || soap_send_raw(soap, buf, 1)) return soap->error; t = s; } else if (!(soap->omode & SOAP_ENC_LATIN) && !(soap->omode & SOAP_C_UTFSTRING)) /* ISO 8859-1 to UTF-8 */ { buf[0] = (char)(0xC0 | ((c >> 6) & 0x1F)); buf[1] = (char)(0x80 | (c & 0x3F)); if (soap_send_raw(soap, t, s - t - 1) || soap_send_raw(soap, buf, 2)) return soap->error; t = s; } } } if (soap_send_raw(soap, t, s - t - 1) || soap_send_raw(soap, "\"", 1)) return soap->error; return SOAP_OK; } /******************************************************************************\ * * JSON input * \******************************************************************************/ int json_read(struct soap *soap, struct value *v) { soap_default_value(soap, v); if (soap_begin_recv(soap) || json_recv(soap, v) || soap_end_recv(soap)) return json_error(soap, v); return SOAP_OK; } /******************************************************************************/ int json_recv(struct soap *soap, struct value *v) { soap_wchar c; if (!v) return SOAP_OK; v->__type = 0; v->ref = NULL; v->__any = NULL; v->soap = soap; while (((c = soap_getchar(soap)) > 0 && c <= 0x20) || c == 0xA0) continue; switch (c) { case EOF: return soap->error = SOAP_EOF; case '{'/*'}'*/: { struct value s; if (++soap->level > soap->maxlevel) return soap->error = SOAP_LEVEL; #ifdef __cplusplus if (!(v->ref = (void*)soap_new__struct(soap))) return soap->error = SOAP_EOM; #else if (!(v->ref = (void*)soap_malloc(soap, sizeof(struct _struct)))) return soap->error = SOAP_EOM; #endif soap_default__struct(soap, (struct _struct*)v->ref); v->__type = SOAP_TYPE__struct; while (((c = soap_getchar(soap)) > 0 && c <= 0x20) || c == 0xA0) continue; if (c == /*'{'*/'}') return SOAP_OK; soap_unget(soap, c); for (;;) { if (json_recv(soap, &s)) return soap->error; if (s.__type != SOAP_TYPE__string) return soap_set_sender_error(soap, "string name expected", (const char*)s.ref, SOAP_SYNTAX_ERROR); while (((c = soap_getchar(soap)) > 0 && c <= 0x20) || c == 0xA0) continue; if (c != ':') return soap_set_sender_error(soap, "':' expected", (const char*)s.ref, SOAP_SYNTAX_ERROR); #ifdef __cplusplus if (json_recv(soap, v->operator[]((const char*)s.ref))) return soap->error; #else if (json_recv(soap, value_at(v, (const char*)s.ref))) return soap->error; #endif while (((c = soap_getchar(soap)) > 0 && c <= 0x20) || c == 0xA0) continue; if (c == /*'{'*/'}') break; if ((int)c == EOF) return soap->error = SOAP_EOF; if (c != ',') return soap_set_sender_error(soap, "closing '}' or comma expected", NULL, SOAP_SYNTAX_ERROR); } soap->level--; return SOAP_OK; } case '['/*']'*/: { int i; if (++soap->level > soap->maxlevel) return soap->error = SOAP_LEVEL; #ifdef __cplusplus if (!(v->ref = (void*)soap_new__array(soap))) return soap->error = SOAP_EOM; #else if (!(v->ref = (void*)soap_malloc(soap, sizeof(struct _array)))) return soap->error = SOAP_EOM; #endif soap_default__array(soap, (struct _array*)v->ref); v->__type = SOAP_TYPE__array; while (((c = soap_getchar(soap)) > 0 && c <= 0x20) || c == 0xA0) continue; if (c == /*'['*/']') return SOAP_OK; soap_unget(soap, c); for (i = 0; i < (int)soap->maxoccurs; i++) { #ifdef __cplusplus if (json_recv(soap, v->operator[](i))) return soap->error; #else if (json_recv(soap, nth_value(v, i))) return soap->error; #endif while (((c = soap_getchar(soap)) > 0 && c <= 0x20) || c == 0xA0) continue; if (c == /*'['*/']') break; if ((int)c == EOF) return soap->error = SOAP_EOF; if (c != ',') return soap_set_sender_error(soap, "closing ']' or comma expected", NULL, SOAP_SYNTAX_ERROR); } --soap->level; return SOAP_OK; } case '"': { long l = 0; soap->labidx = 0; for (;;) { char *s; const char *t = NULL; size_t k; if (soap_append_lab(soap, NULL, 0)) return soap->error = SOAP_EOM; s = soap->labbuf + soap->labidx; k = soap->lablen - soap->labidx; soap->labidx = soap->lablen; while (k--) { if (t) { *s++ = *t++; if (!*t) t = NULL; } else { c = soap_getchar(soap); switch (c) { case EOF: return soap->error = SOAP_EOF; case '"': *s = '\0'; v->__type = SOAP_TYPE__string; if (!(v->ref = soap_strdup(soap, soap->labbuf))) return soap->error = SOAP_EOM; if (soap->maxlength > 0 && l > soap->maxlength) return soap->error = SOAP_LENGTH; return SOAP_OK; case '\\': c = soap_getchar(soap); switch (c) { case EOF: return soap->error = SOAP_EOF; case '"': case '\\': case '/': break; case 'b': c = 8; break; case 'f': c = 12; break; case 'n': c = 10; break; case 'r': c = 13; break; case 't': c = 9; break; case 'u': { char *h; wchar_t wc[2]; int i; /* hex to utf8 conversion */ h = soap->tmpbuf; for (i = 0; i < 4; i++) { if ((c = soap_getchar(soap)) == (int)EOF) return soap->error = SOAP_EOF; h[i] = c; } h[4] = '\0'; wc[0] = (wchar_t)soap_strtol(h, &h, 16); wc[1] = 0; if (h - soap->tmpbuf < 4) return soap->error = SOAP_TYPE; t = soap_wchar2s(soap, wc); c = *t++; if (!*t) t = NULL; break; } default: return soap_set_sender_error(soap, "invalid escape in string", NULL, SOAP_SYNTAX_ERROR); } *s++ = c; l++; break; default: if ((c & 0x80) && (soap->imode & SOAP_ENC_LATIN) && (soap->imode & SOAP_C_UTFSTRING)) /* ISO 8859-1 to utf8 */ { *s++ = (char)(0xC0 | ((c >> 6) & 0x1F)); soap->tmpbuf[0] = (0x80 | (c & 0x3F)); soap->tmpbuf[1] = '\0'; t = soap->tmpbuf; } else if ((c & 0x80) && !(soap->imode & SOAP_ENC_LATIN) && !(soap->imode & SOAP_C_UTFSTRING)) /* utf8 to ISO 8859-1 */ { soap_wchar c1 = soap_getchar(soap); if (c1 == (int)EOF) return soap->error = SOAP_EOF; if (c < 0xE0 && (c & 0x1F) <= 0x03) *s++ = ((c & 0x1F) << 6) | (c1 & 0x3F); else *s++ = '?'; } /* the JSON "standard" does not permit ctrl chars in strings, we silently accept these else if (c < 0x20 && c >= 0) { return soap_set_sender_error(soap, "invalid control character in string", NULL, SOAP_SYNTAX_ERROR); } */ else { *s++ = c; } l++; } } } if (soap->maxlength > 0 && l > soap->maxlength) return soap->error = SOAP_LENGTH; } } default: /* number, true, false, null */ { char *s = soap->tmpbuf; do { *s++ = c; c = soap_getchar(soap); } while (c != (int)EOF && (isalnum((int)c) || (int)c == '.' || (int)c == '+' || (int)c == '-') && s - soap->tmpbuf < (int)sizeof(soap->tmpbuf) - 1); *s = '\0'; soap_unget(soap, c); if (soap->tmpbuf[0] == '-' || isdigit(soap->tmpbuf[0])) { LONG64 n = soap_strtoll(soap->tmpbuf, &s, 10); if (!*s) { v->__type = SOAP_TYPE__int; if (!(v->ref = soap_malloc(soap, sizeof(_int)))) return soap->error = SOAP_EOM; *(_int*)v->ref = n; } else { double x; if (soap_s2double(soap, soap->tmpbuf, &x)) return soap_set_sender_error(soap, "JSON number expected", soap->tmpbuf, SOAP_SYNTAX_ERROR); v->__type = SOAP_TYPE__double; if (!(v->ref = soap_malloc(soap, sizeof(_double)))) return soap->error = SOAP_EOM; *(_double*)v->ref = x; } } else if (!strcmp(soap->tmpbuf, "true")) { v->__type = SOAP_TYPE__boolean; if (!(v->ref = soap_malloc(soap, sizeof(_boolean)))) return soap->error = SOAP_EOM; *(char*)v->ref = 1; } else if (!strcmp(soap->tmpbuf, "false")) { v->__type = SOAP_TYPE__boolean; if (!(v->ref = soap_malloc(soap, sizeof(_boolean)))) return soap->error = SOAP_EOM; *(char*)v->ref = 0; } else if (strcmp(soap->tmpbuf, "null")) { return soap_set_sender_error(soap, "JSON value expected", soap->tmpbuf, SOAP_SYNTAX_ERROR); } return SOAP_OK; } } } /******************************************************************************\ * * JSON REST * \******************************************************************************/ int json_call(struct soap *soap, const char *endpoint, const struct value *in, struct value *out) { if (out) soap_default_value(soap, out); soap->http_content = "application/json; charset=utf-8"; if (soap_begin_count(soap) || ((soap->mode & SOAP_IO_LENGTH) && json_send(soap, in)) || soap_end_count(soap) || soap_connect_command(soap, in && out ? SOAP_POST_FILE : out ? SOAP_GET : in ? SOAP_PUT : SOAP_DEL, endpoint, NULL) || json_send(soap, in) || soap_end_send(soap) || soap_begin_recv(soap) || json_recv(soap, out) || soap_end_recv(soap)) { if (out) json_error(soap, out); else if (soap->error == 200 || soap->error == 201 || soap->error == 202) soap->error = SOAP_OK; } return soap_closesock(soap); } #ifdef __cplusplus /******************************************************************************\ * * JSON C++ API * \******************************************************************************/ int json_write(struct soap *soap, const struct value& v) { return json_write(soap, &v); } int json_send(struct soap *soap, const struct value& v) { return json_send(soap, &v); } int json_read(struct soap *soap, struct value& v) { return json_read(soap, &v); } int json_recv(struct soap *soap, struct value& v) { return json_recv(soap, &v); } int json_call(struct soap *soap, const char *endpoint, const struct value& in, struct value& out) { return json_call(soap, endpoint, &in, &out); } int json_call(struct soap *soap, const char *endpoint, const struct value *in, struct value& out) { return json_call(soap, endpoint, in, &out); } int json_call(struct soap *soap, const char *endpoint, const struct value& in, struct value *out) { return json_call(soap, endpoint, &in, out); } std::ostream& operator<<(std::ostream& o, const struct value& v) { if (v.soap) { std::ostream *os = v.soap->os; v.soap->os = &o; if (json_write(v.soap, v)) o.clear(std::ios::failbit); // writing JSON data failed (must be a stream error) v.soap->os = os; } else { soap *ctx = soap_new(); if (ctx) { ctx->os = &o; if (json_write(ctx, v)) o.clear(std::ios::failbit); // writing JSON data failed (must be a stream error) soap_destroy(ctx); soap_end(ctx); soap_free(ctx); } } return o; } std::istream& operator>>(std::istream& i, struct value& v) { if (!v.soap) v.soap = soap_new(); if (v.soap) { std::istream *is = v.soap->is; v.soap->is = &i; (void)json_read(v.soap, v); v.soap->is = is; } return i; } static int json_promote_type(const value& x, const value& y) { switch (x.__type) { case SOAP_TYPE__array: return x.__type; case SOAP_TYPE__struct: switch (y.__type) { case SOAP_TYPE__array: return y.__type; case SOAP_TYPE__struct: return x.__type; default: return SOAP_TYPE__array; } case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: switch (y.__type) { case SOAP_TYPE__array: case SOAP_TYPE__struct: return y.__type; default: return x.__type; } case SOAP_TYPE__double: switch (y.__type) { case SOAP_TYPE__array: case SOAP_TYPE__struct: case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: return y.__type; default: return x.__type; } case SOAP_TYPE__i4: case SOAP_TYPE__int: switch (y.__type) { case SOAP_TYPE__array: case SOAP_TYPE__struct: case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: case SOAP_TYPE__double: return y.__type; default: return x.__type; } default: return y.__type; } } value json_add(const value& x, const value& y) { switch (json_promote_type(x, y)) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: return value(x.soap, (_int)x + (_int)y); case SOAP_TYPE__double: return value(x.soap, (_double)x + (_double)y); case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: { std::string s = (const char*)x; return value(x.soap, s.append((const char*)y)); } case SOAP_TYPE__struct: { _struct s = x; _struct t = y; _struct st(x.soap); for (_struct::iterator i = s.begin(); i != s.end(); ++i) st[i.name()] = *i; for (_struct::iterator i = t.begin(); i != t.end(); ++i) st[i.name()] = *i; return value(x.soap, st); } case SOAP_TYPE__array: { _array a = x; _array b = y; int n = a.size(); int m = b.size(); _array ab(x.soap); ab.size(n + m); for (int i = 0; i < n; ++i) ab[i] = a[i]; for (int i = 0; i < m; ++i) ab[n + i] = b[i]; return value(x.soap, ab); } default: return value(x.soap); } } value json_sub(const value& x, const value& y) { switch (json_promote_type(x, y)) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: return value(x.soap, (_int)x - (_int)y); case SOAP_TYPE__double: return value(x.soap, (_double)x - (_double)y); default: return value(x.soap); } } value json_mul(const value& x, const value& y) { switch (json_promote_type(x, y)) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: return value(x.soap, (_int)x * (_int)y); case SOAP_TYPE__double: return value(x.soap, (_double)x * (_double)y); default: return value(x.soap); } } value json_div(const value& x, const value& y) { switch (json_promote_type(x, y)) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: return value(x.soap, (_int)x / (_int)y); case SOAP_TYPE__double: return value(x.soap, (_double)x / (_double)y); default: return value(x.soap); } } value json_mod(const value& x, const value& y) { switch (json_promote_type(x, y)) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: case SOAP_TYPE__double: return value(x.soap, (_int)x % (_int)y); default: return value(x.soap); } } bool json_eqv(const value& x, const value& y) { if (x.__type != y.__type && (x.__type != SOAP_TYPE__i4 || y.__type != SOAP_TYPE__int) && (x.__type != SOAP_TYPE__int || y.__type != SOAP_TYPE__i4)) return false; switch (x.__type) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: return (_int)x == (_int)y; case SOAP_TYPE__double: return (_double)x == (_double)y; case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: return !strcmp((const char*)x, (const char*)y); case SOAP_TYPE__struct: if (x.size() != y.size()) return false; else { const _struct& s = x; const _struct& t = y; for (_struct::iterator i = s.begin(); i != s.end(); ++i) { _struct::iterator j; for (j = t.begin(); j != t.end(); ++j) if (!strcmp(i.name(), j.name())) break; if (j == t.end() || *i != *j) return false; } return true; } case SOAP_TYPE__array: if (x.size() != y.size()) return false; else { const _array& a = x; const _array& b = y; _array::iterator i = a.begin(); _array::iterator j = b.begin(); for ( ; i != a.end(); ++i, ++j) if (*i != *j) return false; return true; } default: return false; } } bool json_leq(const value& x, const value& y) { if (x.__type != y.__type && (x.__type != SOAP_TYPE__i4 || y.__type != SOAP_TYPE__int) && (x.__type != SOAP_TYPE__int || y.__type != SOAP_TYPE__i4)) return false; switch (x.__type) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: return (_int)x <= (_int)y; case SOAP_TYPE__double: return (_double)x <= (_double)y; case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: return strcmp((const char*)x, (const char*)y) <= 0; default: return false; } } bool json_lne(const value& x, const value& y) { if (x.__type != y.__type && (x.__type != SOAP_TYPE__i4 || y.__type != SOAP_TYPE__int) && (x.__type != SOAP_TYPE__int || y.__type != SOAP_TYPE__i4)) return false; switch (x.__type) { case SOAP_TYPE__boolean: case SOAP_TYPE__i4: case SOAP_TYPE__int: return (_int)x < (_int)y; case SOAP_TYPE__double: return (_double)x < (_double)y; case SOAP_TYPE__string: case SOAP_TYPE__dateTime_DOTiso8601: return strcmp((const char*)x, (const char*)y) < 0; default: return false; } } #endif #ifdef JSON_NAMESPACE #ifdef __cplusplus } // namespace json #endif #endif gsoap-2.8.91/gsoap/samples/mashup++/0000755000175000017500000000000013525245175016475 5ustar ellertellertgsoap-2.8.91/gsoap/samples/mashup++/.deps/0000755000175000017500000000000013525245175017506 5ustar ellertellertgsoap-2.8.91/gsoap/samples/mashup++/.deps/soapServiceProxy.Po0000644000175000017500000006054513525245163023342 0ustar ellertellertsoapServiceProxy.o: soapServiceProxy.cpp soapServiceProxy.h soapH.h \ soapStub.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/deque \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__config \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__split_buffer \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/type_traits \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstddef \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.0/include/stddef.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/algorithm \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/initializer_list \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstring \ /usr/include/string.h /usr/include/_types.h /usr/include/sys/_types.h \ /usr/include/sys/cdefs.h /usr/include/sys/_symbol_aliasing.h \ /usr/include/sys/_posix_availability.h /usr/include/machine/_types.h \ /usr/include/i386/_types.h /usr/include/Availability.h \ /usr/include/AvailabilityInternal.h /usr/include/sys/_types/_size_t.h \ /usr/include/sys/_types/_null.h /usr/include/sys/_types/_rsize_t.h \ /usr/include/sys/_types/_errno_t.h /usr/include/sys/_types/_ssize_t.h \ /usr/include/strings.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/utility \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__tuple \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__tuple_03 \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/typeinfo \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/exception \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstdint \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.0/include/stdint.h \ /usr/include/stdint.h /usr/include/sys/_types/_int8_t.h \ /usr/include/sys/_types/_int16_t.h /usr/include/sys/_types/_int32_t.h \ /usr/include/sys/_types/_int64_t.h /usr/include/_types/_uint8_t.h \ /usr/include/_types/_uint16_t.h /usr/include/_types/_uint32_t.h \ /usr/include/_types/_uint64_t.h /usr/include/sys/_types/_intptr_t.h \ /usr/include/sys/_types/_uintptr_t.h /usr/include/_types/_intmax_t.h \ /usr/include/_types/_uintmax_t.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/new \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/limits \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__undef_min_max \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iterator \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iosfwd \ /usr/include/wchar.h /usr/include/sys/_types/_mbstate_t.h \ /usr/include/sys/_types/_ct_rune_t.h /usr/include/sys/_types/_rune_t.h \ /usr/include/sys/_types/_wchar_t.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.0/include/stdarg.h \ /usr/include/stdio.h /usr/include/sys/_types/_va_list.h \ /usr/include/sys/_types/_off_t.h /usr/include/time.h \ /usr/include/_structs.h /usr/include/sys/_structs.h \ /usr/include/sys/_types/_timespec.h /usr/include/sys/_types/_clock_t.h \ /usr/include/sys/_types/_time_t.h /usr/include/_wctype.h \ /usr/include/sys/_types/_wint_t.h /usr/include/_types/_wctype_t.h \ /usr/include/ctype.h /usr/include/runetype.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__functional_base \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__functional_base_03 \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/tuple \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/stdexcept \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/list \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__bit_reference \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/climits \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.0/include/limits.h \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/i386/limits.h /usr/include/i386/_limits.h \ /usr/include/sys/syslimits.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/set \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__tree \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/functional \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__functional_03 \ ../../../gsoap/stdsoap2.h ../../../config.h /usr/include/stdlib.h \ /usr/include/sys/wait.h /usr/include/sys/_types/_pid_t.h \ /usr/include/sys/_types/_id_t.h /usr/include/sys/signal.h \ /usr/include/sys/appleapiopts.h /usr/include/machine/signal.h \ /usr/include/i386/signal.h /usr/include/machine/_mcontext.h \ /usr/include/i386/_mcontext.h /usr/include/mach/i386/_structs.h \ /usr/include/sys/_types/_sigaltstack.h \ /usr/include/sys/_types/_ucontext.h \ /usr/include/sys/_types/_pthread_attr_t.h \ /usr/include/sys/_types/_sigset_t.h /usr/include/sys/_types/_uid_t.h \ /usr/include/sys/resource.h /usr/include/sys/_types/_timeval.h \ /usr/include/machine/endian.h /usr/include/i386/endian.h \ /usr/include/sys/_endian.h /usr/include/libkern/_OSByteOrder.h \ /usr/include/libkern/i386/_OSByteOrder.h /usr/include/alloca.h \ /usr/include/machine/types.h /usr/include/i386/types.h \ /usr/include/sys/_types/___offsetof.h /usr/include/sys/_types/_dev_t.h \ /usr/include/sys/_types/_mode_t.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.0/include/float.h \ /usr/include/math.h /usr/include/poll.h /usr/include/sys/poll.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/string \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstdio \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cwchar \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cwctype \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cctype \ /usr/include/wctype.h /usr/include/_types/_wctrans_t.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iostream \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ios \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__locale \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/mutex \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__mutex_base \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/chrono \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ctime \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ratio \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/system_error \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cerrno \ /usr/include/errno.h /usr/include/sys/errno.h /usr/include/pthread.h \ /usr/include/pthread_impl.h /usr/include/sched.h \ /usr/include/sys/_types/_pthread_cond_t.h \ /usr/include/sys/_types/_pthread_condattr_t.h \ /usr/include/sys/_types/_pthread_key_t.h \ /usr/include/sys/_types/_pthread_mutex_t.h \ /usr/include/sys/_types/_pthread_mutexattr_t.h \ /usr/include/sys/_types/_pthread_once_t.h \ /usr/include/sys/_types/_pthread_rwlock_t.h \ /usr/include/sys/_types/_pthread_rwlockattr_t.h \ /usr/include/sys/_types/_pthread_t.h \ /usr/include/sys/_types/_mach_port_t.h /usr/include/locale.h \ /usr/include/_locale.h /usr/include/xlocale.h /usr/include/_xlocale.h \ /usr/include/xlocale/_ctype.h /usr/include/xlocale/__wctype.h \ /usr/include/xlocale/_stdio.h /usr/include/xlocale/_stdlib.h \ /usr/include/xlocale/_string.h /usr/include/xlocale/_time.h \ /usr/include/xlocale/_wchar.h /usr/include/xlocale/_wctype.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/streambuf \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/istream \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ostream \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/locale \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstdlib \ /usr/include/nl_types.h /usr/include/sys/types.h \ /usr/include/sys/_types/_blkcnt_t.h \ /usr/include/sys/_types/_blksize_t.h /usr/include/sys/_types/_gid_t.h \ /usr/include/sys/_types/_in_addr_t.h \ /usr/include/sys/_types/_in_port_t.h /usr/include/sys/_types/_ino_t.h \ /usr/include/sys/_types/_ino64_t.h /usr/include/sys/_types/_key_t.h \ /usr/include/sys/_types/_nlink_t.h \ /usr/include/sys/_types/_useconds_t.h \ /usr/include/sys/_types/_suseconds_t.h \ /usr/include/sys/_types/_fd_def.h \ /usr/include/sys/_types/_fd_setsize.h \ /usr/include/sys/_types/_fd_set.h /usr/include/sys/_types/_fd_clr.h \ /usr/include/sys/_types/_fd_zero.h /usr/include/sys/_types/_fd_isset.h \ /usr/include/sys/_types/_fd_copy.h \ /usr/include/sys/_types/_fsblkcnt_t.h \ /usr/include/sys/_types/_fsfilcnt_t.h /usr/include/_types/_nl_item.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/bitset \ /usr/include/sys/timeb.h /usr/include/sys/socket.h \ /usr/include/machine/_param.h /usr/include/i386/_param.h \ /usr/include/sys/_types/_sa_family_t.h \ /usr/include/sys/_types/_socklen_t.h \ /usr/include/sys/_types/_iovec_t.h /usr/include/sys/time.h \ /usr/include/sys/_select.h /usr/include/netinet/in.h \ /usr/include/netinet6/in6.h /usr/include/netinet/tcp.h \ /usr/include/arpa/inet.h /usr/include/netdb.h /usr/include/unistd.h \ /usr/include/sys/unistd.h /usr/include/sys/_types/_posix_vdisable.h \ /usr/include/sys/_types/_seek_set.h /usr/include/sys/select.h \ /usr/include/sys/_types/_uuid_t.h /usr/include/gethostuuid.h \ /usr/include/fcntl.h /usr/include/sys/fcntl.h \ /usr/include/sys/_types/_o_sync.h /usr/include/sys/_types/_o_dsync.h \ /usr/include/sys/_types/_s_ifmt.h /usr/include/sys/_types/_filesec_t.h \ /usr/include/inttypes.h /usr/include/xlocale/_inttypes.h soapServiceProxy.h: soapH.h: soapStub.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/deque: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__config: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__split_buffer: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/type_traits: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstddef: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.0/include/stddef.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/algorithm: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/initializer_list: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstring: /usr/include/string.h: /usr/include/_types.h: /usr/include/sys/_types.h: /usr/include/sys/cdefs.h: /usr/include/sys/_symbol_aliasing.h: /usr/include/sys/_posix_availability.h: /usr/include/machine/_types.h: /usr/include/i386/_types.h: /usr/include/Availability.h: /usr/include/AvailabilityInternal.h: /usr/include/sys/_types/_size_t.h: /usr/include/sys/_types/_null.h: /usr/include/sys/_types/_rsize_t.h: /usr/include/sys/_types/_errno_t.h: /usr/include/sys/_types/_ssize_t.h: /usr/include/strings.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/utility: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__tuple: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__tuple_03: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/typeinfo: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/exception: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstdint: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.0/include/stdint.h: /usr/include/stdint.h: /usr/include/sys/_types/_int8_t.h: /usr/include/sys/_types/_int16_t.h: /usr/include/sys/_types/_int32_t.h: /usr/include/sys/_types/_int64_t.h: /usr/include/_types/_uint8_t.h: /usr/include/_types/_uint16_t.h: /usr/include/_types/_uint32_t.h: /usr/include/_types/_uint64_t.h: /usr/include/sys/_types/_intptr_t.h: /usr/include/sys/_types/_uintptr_t.h: /usr/include/_types/_intmax_t.h: /usr/include/_types/_uintmax_t.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/new: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/limits: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__undef_min_max: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iterator: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iosfwd: /usr/include/wchar.h: /usr/include/sys/_types/_mbstate_t.h: /usr/include/sys/_types/_ct_rune_t.h: /usr/include/sys/_types/_rune_t.h: /usr/include/sys/_types/_wchar_t.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.0/include/stdarg.h: /usr/include/stdio.h: /usr/include/sys/_types/_va_list.h: /usr/include/sys/_types/_off_t.h: /usr/include/time.h: /usr/include/_structs.h: /usr/include/sys/_structs.h: /usr/include/sys/_types/_timespec.h: /usr/include/sys/_types/_clock_t.h: /usr/include/sys/_types/_time_t.h: /usr/include/_wctype.h: /usr/include/sys/_types/_wint_t.h: /usr/include/_types/_wctype_t.h: /usr/include/ctype.h: /usr/include/runetype.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__functional_base: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__functional_base_03: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/tuple: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/stdexcept: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/list: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__bit_reference: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/climits: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.0/include/limits.h: /usr/include/limits.h: /usr/include/machine/limits.h: /usr/include/i386/limits.h: /usr/include/i386/_limits.h: /usr/include/sys/syslimits.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/set: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__tree: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/functional: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__functional_03: ../../../gsoap/stdsoap2.h: ../../../config.h: /usr/include/stdlib.h: /usr/include/sys/wait.h: /usr/include/sys/_types/_pid_t.h: /usr/include/sys/_types/_id_t.h: /usr/include/sys/signal.h: /usr/include/sys/appleapiopts.h: /usr/include/machine/signal.h: /usr/include/i386/signal.h: /usr/include/machine/_mcontext.h: /usr/include/i386/_mcontext.h: /usr/include/mach/i386/_structs.h: /usr/include/sys/_types/_sigaltstack.h: /usr/include/sys/_types/_ucontext.h: /usr/include/sys/_types/_pthread_attr_t.h: /usr/include/sys/_types/_sigset_t.h: /usr/include/sys/_types/_uid_t.h: /usr/include/sys/resource.h: /usr/include/sys/_types/_timeval.h: /usr/include/machine/endian.h: /usr/include/i386/endian.h: /usr/include/sys/_endian.h: /usr/include/libkern/_OSByteOrder.h: /usr/include/libkern/i386/_OSByteOrder.h: /usr/include/alloca.h: /usr/include/machine/types.h: /usr/include/i386/types.h: /usr/include/sys/_types/___offsetof.h: /usr/include/sys/_types/_dev_t.h: /usr/include/sys/_types/_mode_t.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.0/include/float.h: /usr/include/math.h: /usr/include/poll.h: /usr/include/sys/poll.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/string: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstdio: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cwchar: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cwctype: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cctype: /usr/include/wctype.h: /usr/include/_types/_wctrans_t.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iostream: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ios: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__locale: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/mutex: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__mutex_base: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/chrono: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ctime: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ratio: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/system_error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cerrno: /usr/include/errno.h: /usr/include/sys/errno.h: /usr/include/pthread.h: /usr/include/pthread_impl.h: /usr/include/sched.h: /usr/include/sys/_types/_pthread_cond_t.h: /usr/include/sys/_types/_pthread_condattr_t.h: /usr/include/sys/_types/_pthread_key_t.h: /usr/include/sys/_types/_pthread_mutex_t.h: /usr/include/sys/_types/_pthread_mutexattr_t.h: /usr/include/sys/_types/_pthread_once_t.h: /usr/include/sys/_types/_pthread_rwlock_t.h: /usr/include/sys/_types/_pthread_rwlockattr_t.h: /usr/include/sys/_types/_pthread_t.h: /usr/include/sys/_types/_mach_port_t.h: /usr/include/locale.h: /usr/include/_locale.h: /usr/include/xlocale.h: /usr/include/_xlocale.h: /usr/include/xlocale/_ctype.h: /usr/include/xlocale/__wctype.h: /usr/include/xlocale/_stdio.h: /usr/include/xlocale/_stdlib.h: /usr/include/xlocale/_string.h: /usr/include/xlocale/_time.h: /usr/include/xlocale/_wchar.h: /usr/include/xlocale/_wctype.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/streambuf: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/istream: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ostream: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/locale: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstdlib: /usr/include/nl_types.h: /usr/include/sys/types.h: /usr/include/sys/_types/_blkcnt_t.h: /usr/include/sys/_types/_blksize_t.h: /usr/include/sys/_types/_gid_t.h: /usr/include/sys/_types/_in_addr_t.h: /usr/include/sys/_types/_in_port_t.h: /usr/include/sys/_types/_ino_t.h: /usr/include/sys/_types/_ino64_t.h: /usr/include/sys/_types/_key_t.h: /usr/include/sys/_types/_nlink_t.h: /usr/include/sys/_types/_useconds_t.h: /usr/include/sys/_types/_suseconds_t.h: /usr/include/sys/_types/_fd_def.h: /usr/include/sys/_types/_fd_setsize.h: /usr/include/sys/_types/_fd_set.h: /usr/include/sys/_types/_fd_clr.h: /usr/include/sys/_types/_fd_zero.h: /usr/include/sys/_types/_fd_isset.h: /usr/include/sys/_types/_fd_copy.h: /usr/include/sys/_types/_fsblkcnt_t.h: /usr/include/sys/_types/_fsfilcnt_t.h: /usr/include/_types/_nl_item.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/bitset: /usr/include/sys/timeb.h: /usr/include/sys/socket.h: /usr/include/machine/_param.h: /usr/include/i386/_param.h: /usr/include/sys/_types/_sa_family_t.h: /usr/include/sys/_types/_socklen_t.h: /usr/include/sys/_types/_iovec_t.h: /usr/include/sys/time.h: /usr/include/sys/_select.h: /usr/include/netinet/in.h: /usr/include/netinet6/in6.h: /usr/include/netinet/tcp.h: /usr/include/arpa/inet.h: /usr/include/netdb.h: /usr/include/unistd.h: /usr/include/sys/unistd.h: /usr/include/sys/_types/_posix_vdisable.h: /usr/include/sys/_types/_seek_set.h: /usr/include/sys/select.h: /usr/include/sys/_types/_uuid_t.h: /usr/include/gethostuuid.h: /usr/include/fcntl.h: /usr/include/sys/fcntl.h: /usr/include/sys/_types/_o_sync.h: /usr/include/sys/_types/_o_dsync.h: /usr/include/sys/_types/_s_ifmt.h: /usr/include/sys/_types/_filesec_t.h: /usr/include/inttypes.h: /usr/include/xlocale/_inttypes.h: gsoap-2.8.91/gsoap/samples/mashup++/Makefile.in0000644000175000017500000005262613525245163020552 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = mashupclient$(EXEEXT) mashupserver$(EXEEXT) subdir = gsoap/samples/mashup++ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am_mashupclient_OBJECTS = mashupclient.$(OBJEXT) $(am__objects_1) \ $(am__objects_2) soapmashupProxy.$(OBJEXT) mashupclient_OBJECTS = $(am_mashupclient_OBJECTS) am__DEPENDENCIES_1 = mashupclient_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) am_mashupserver_OBJECTS = mashupserver.$(OBJEXT) $(am__objects_1) \ $(am__objects_2) soapcalcProxy.$(OBJEXT) \ soapgmtProxy.$(OBJEXT) soapmashupService.$(OBJEXT) mashupserver_OBJECTS = $(am_mashupserver_OBJECTS) mashupserver_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/mashupclient.Po \ ./$(DEPDIR)/mashupserver.Po ./$(DEPDIR)/soapC.Po \ ./$(DEPDIR)/soapcalcProxy.Po ./$(DEPDIR)/soapgmtProxy.Po \ ./$(DEPDIR)/soapmashupProxy.Po \ ./$(DEPDIR)/soapmashupService.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(mashupclient_SOURCES) $(mashupserver_SOURCES) DIST_SOURCES = $(mashupclient_SOURCES) $(mashupserver_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.cpp_proxy_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = mashup.hpp AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = mashup.nsmap mashupclient_SOURCES = mashupclient.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) soapmashupProxy.cpp mashupclient_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) mashupserver_SOURCES = mashupserver.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) soapcalcProxy.cpp soapgmtProxy.cpp soapmashupService.cpp mashupserver_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_proxy_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/mashup++/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/mashup++/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_proxy_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) mashupclient$(EXEEXT): $(mashupclient_OBJECTS) $(mashupclient_DEPENDENCIES) $(EXTRA_mashupclient_DEPENDENCIES) @rm -f mashupclient$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(mashupclient_OBJECTS) $(mashupclient_LDADD) $(LIBS) mashupserver$(EXEEXT): $(mashupserver_OBJECTS) $(mashupserver_DEPENDENCIES) $(EXTRA_mashupserver_DEPENDENCIES) @rm -f mashupserver$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(mashupserver_OBJECTS) $(mashupserver_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mashupclient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mashupserver.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapcalcProxy.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapgmtProxy.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapmashupProxy.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapmashupService.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/mashupclient.Po -rm -f ./$(DEPDIR)/mashupserver.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapcalcProxy.Po -rm -f ./$(DEPDIR)/soapgmtProxy.Po -rm -f ./$(DEPDIR)/soapmashupProxy.Po -rm -f ./$(DEPDIR)/soapmashupService.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/mashupclient.Po -rm -f ./$(DEPDIR)/mashupserver.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapcalcProxy.Po -rm -f ./$(DEPDIR)/soapgmtProxy.Po -rm -f ./$(DEPDIR)/soapmashupProxy.Po -rm -f ./$(DEPDIR)/soapmashupService.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -i -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/mashup++/calc.wsdl0000644000175000017500000001326213525245163020273 0ustar ellertellert Sums two values Subtracts two values Multiplies two values Divides two values Raises a to b Simple calculator service described at https://www.genivia.com/dev.html gsoap-2.8.91/gsoap/samples/mashup++/mashup.hpp0000644000175000017500000013240613525245163020506 0ustar ellertellert// Reminder: Modify typemap.dat to customize the header file generated by wsdl2h /* mashup.hpp Generated by wsdl2h 2.8.88 from gmt.wsdl calc.wsdl mashup.wsdl and typemap.dat 2019-07-25 20:25:47 GMT DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS USE THE soapcpp2-GENERATED SOURCE CODE FILES FOR YOUR PROJECT BUILDS gSOAP XML Web services tools Copyright (C) 2000-2018, Robert van Engelen, Genivia Inc. All Rights Reserved. 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 -------------------------------------------------------------------------------- */ /** @page page_notes Notes @note HINTS: - Run soapcpp2 on mashup.hpp to generate the SOAP/XML processing logic: Use soapcpp2 -I to specify paths for #import Use soapcpp2 -j to generate improved proxy and server classes. Use soapcpp2 -r to generate a report. - Edit '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. - Run Doxygen (www.doxygen.org) on this file to generate documentation. - Use wsdl2h -c to generate pure C code. - Use wsdl2h -R to include the REST operations defined by the WSDLs. - Use wsdl2h -O3 or -O4 to optimize by removing unused schema components. - Use wsdl2h -d to enable DOM support for xsd:any and xsd:anyType. - Use wsdl2h -F to simulate struct-type derivation in C (also works in C++). - Use wsdl2h -f to generate flat C++ class hierarchy, removes type derivation. - Use wsdl2h -g to generate top-level root elements with readers and writers. - Use wsdl2h -U to map XML names to C++ Unicode identifiers instead of _xNNNN. - Use wsdl2h -u to disable the generation of unions. - Use wsdl2h -L to remove this @note and all other @note comments. - Use wsdl2h -nname to use name as the base namespace prefix instead of 'ns'. - Use wsdl2h -Nname for service prefix and produce multiple service bindings - Struct/class members serialized as XML attributes are annotated with a '@'. - Struct/class members that have a special role are annotated with a '$'. @warning DO NOT INCLUDE THIS ANNOTATED FILE DIRECTLY IN YOUR PROJECT SOURCE CODE. USE THE FILES GENERATED BY soapcpp2 FOR YOUR PROJECT'S SOURCE CODE: THE GENERATED soapStub.h FILE CONTAINS THIS CONTENT WITHOUT ANNOTATIONS. @copyright LICENSE: @verbatim -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2019, Robert van Engelen, Genivia Inc. All Rights Reserved. The wsdl2h tool and its generated software are released under the GPL. This software is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- @endverbatim */ //gsoapopt c++,w /******************************************************************************\ * * * Definitions * * * * * \******************************************************************************/ /******************************************************************************\ * * * $CONTAINER * * std::vector * * * \******************************************************************************/ #include template class std::vector; /******************************************************************************\ * * * 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' then rerun wsdl2h (use wsdl2h -t typemap.dat): ns1 = "http://tempuri.org/t.xsd" ns2 = "urn:calc" ns3 = "urn:daystoxmas" */ #define SOAP_NAMESPACE_OF_ns1 "http://tempuri.org/t.xsd" //gsoap ns1 schema namespace: http://tempuri.org/t.xsd //gsoap ns1 schema form: unqualified #define SOAP_NAMESPACE_OF_ns2 "urn:calc" //gsoap ns2 schema namespace: urn:calc //gsoap ns2 schema form: unqualified #define SOAP_NAMESPACE_OF_ns3 "urn:daystoxmas" //gsoap ns3 schema namespace: urn:daystoxmas //gsoap ns3 schema form: qualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ /******************************************************************************\ * * * Forward Declarations * * * \******************************************************************************/ class _ns1__gmt; class _ns1__gmtResponse; /// @brief Top-level root element "urn:daystoxmas":daystoxmas. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration. class _ns3__commingtotown; /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://tempuri.org/t.xsd * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * urn:calc * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * urn:daystoxmas * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://tempuri.org/t.xsd * * * \******************************************************************************/ /// @brief Top-level root element "http://tempuri.org/t.xsd":gmt /// @brief "http://tempuri.org/t.xsd":gmt is a complexType. /// /// @note class _ns1__gmt operations: /// - _ns1__gmt* soap_new__ns1__gmt(soap*) allocate and default initialize /// - _ns1__gmt* soap_new__ns1__gmt(soap*, int num) allocate and default initialize an array /// - _ns1__gmt* soap_new_req__ns1__gmt(soap*, ...) allocate, set required members /// - _ns1__gmt* soap_new_set__ns1__gmt(soap*, ...) allocate, set all public members /// - _ns1__gmt::soap_default(soap*) default initialize members /// - int soap_read__ns1__gmt(soap*, _ns1__gmt*) deserialize from a stream /// - int soap_write__ns1__gmt(soap*, _ns1__gmt*) serialize to a stream /// - _ns1__gmt* _ns1__gmt::soap_dup(soap*) returns deep copy of _ns1__gmt, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _ns1__gmt::soap_del() deep deletes _ns1__gmt data members, use only after _ns1__gmt::soap_dup(NULL) (use soapcpp2 -Ed) /// - int _ns1__gmt::soap_type() returns SOAP_TYPE__ns1__gmt or derived type identifier class _ns1__gmt { public: /// Pointer to soap context that manages this instance. struct soap *soap ; }; /// @brief Top-level root element "http://tempuri.org/t.xsd":gmtResponse /// @brief "http://tempuri.org/t.xsd":gmtResponse is a complexType. /// /// @note class _ns1__gmtResponse operations: /// - _ns1__gmtResponse* soap_new__ns1__gmtResponse(soap*) allocate and default initialize /// - _ns1__gmtResponse* soap_new__ns1__gmtResponse(soap*, int num) allocate and default initialize an array /// - _ns1__gmtResponse* soap_new_req__ns1__gmtResponse(soap*, ...) allocate, set required members /// - _ns1__gmtResponse* soap_new_set__ns1__gmtResponse(soap*, ...) allocate, set all public members /// - _ns1__gmtResponse::soap_default(soap*) default initialize members /// - int soap_read__ns1__gmtResponse(soap*, _ns1__gmtResponse*) deserialize from a stream /// - int soap_write__ns1__gmtResponse(soap*, _ns1__gmtResponse*) serialize to a stream /// - _ns1__gmtResponse* _ns1__gmtResponse::soap_dup(soap*) returns deep copy of _ns1__gmtResponse, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _ns1__gmtResponse::soap_del() deep deletes _ns1__gmtResponse data members, use only after _ns1__gmtResponse::soap_dup(NULL) (use soapcpp2 -Ed) /// - int _ns1__gmtResponse::soap_type() returns SOAP_TYPE__ns1__gmtResponse or derived type identifier class _ns1__gmtResponse { public: /// Element "param-1" of type xs:dateTime. time_t param_1 1; ///< Required element. /// Pointer to soap context that manages this instance. struct soap *soap ; }; /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * urn:calc * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * urn:daystoxmas * * * \******************************************************************************/ /// @brief Top-level root element "urn:daystoxmas":commingtotown /// @brief "urn:daystoxmas":commingtotown is a complexType. /// /// @note class _ns3__commingtotown operations: /// - _ns3__commingtotown* soap_new__ns3__commingtotown(soap*) allocate and default initialize /// - _ns3__commingtotown* soap_new__ns3__commingtotown(soap*, int num) allocate and default initialize an array /// - _ns3__commingtotown* soap_new_req__ns3__commingtotown(soap*, ...) allocate, set required members /// - _ns3__commingtotown* soap_new_set__ns3__commingtotown(soap*, ...) allocate, set all public members /// - _ns3__commingtotown::soap_default(soap*) default initialize members /// - int soap_read__ns3__commingtotown(soap*, _ns3__commingtotown*) deserialize from a stream /// - int soap_write__ns3__commingtotown(soap*, _ns3__commingtotown*) serialize to a stream /// - _ns3__commingtotown* _ns3__commingtotown::soap_dup(soap*) returns deep copy of _ns3__commingtotown, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - _ns3__commingtotown::soap_del() deep deletes _ns3__commingtotown data members, use only after _ns3__commingtotown::soap_dup(NULL) (use soapcpp2 -Ed) /// - int _ns3__commingtotown::soap_type() returns SOAP_TYPE__ns3__commingtotown or derived type identifier class _ns3__commingtotown { public: /// Element "days" of type xs:int. int days 1; ///< Required element. /// Pointer to soap context that manages this instance. struct soap *soap ; }; /******************************************************************************\ * * * Additional Top-Level Elements * * http://tempuri.org/t.xsd * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * http://tempuri.org/t.xsd * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Elements * * urn:calc * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * urn:calc * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Elements * * urn:daystoxmas * * * \******************************************************************************/ /******************************************************************************\ * * * Additional Top-Level Attributes * * urn:daystoxmas * * * \******************************************************************************/ /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap ns2 service name: calc //gsoap ns2 service type: calcPortType //gsoap ns2 service port: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns2 service namespace: urn:calc //gsoap ns2 service transport: http://schemas.xmlsoap.org/soap/http //gsoap ns4 service name: gmt //gsoap ns4 service type: gmtPortType //gsoap ns4 service port: http://localhost:80 //gsoap ns4 service namespace: http://tempuri.org/t.xsd/gmt.wsdl //gsoap ns4 service transport: http://schemas.xmlsoap.org/soap/http //gsoap ns5 service name: mashup //gsoap ns5 service type: PortType //gsoap ns5 service port: http://www.cs.fsu.edu/~engelen/mashup.cgi //gsoap ns5 service namespace: http://www.genivia.com/mashup.wsdl //gsoap ns5 service transport: http://schemas.xmlsoap.org/soap/http /** @mainpage WSDL Definitions @section WSDL_bindings Service Bindings - @ref calc - @ref gmt - @ref mashup @section WSDL_more More Information - @ref page_notes "Notes" - @ref page_XMLDataBinding "XML Data Binding" - @ref SOAP_ENV__Header "SOAP Header Content" (when applicable) - @ref SOAP_ENV__Detail "SOAP Fault Detail Content" (when applicable) */ /** @page calc Binding "calc" @section calc_service Service Documentation "calc" Simple calculator service described at https://www.genivia.com/dev.html @section calc_operations Operations of Binding "calc" - @ref ns2__add - @ref ns2__sub - @ref ns2__mul - @ref ns2__div - @ref ns2__pow @section calc_ports Default endpoints of Binding "calc" - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi @note Use wsdl2h option -Nname to change the service binding prefix name */ /** @page gmt Binding "gmt" @section gmt_service Service Documentation "gmt" Get current time client code: `#include "soapH.h" #include "gmt.nsmap" int main() { time_t t; struct soap *soap = soap_new(); soap_call_t__gmt(soap, "http://www.cs.fsu.edu/~engelen/gmtlitserver.cgi", "", &t); printf("The current time is %s\\n", ctime(&t)); soap_destroy(soap); soap_end(soap); soap_free(soap); return 0; }` @section gmt_operations Operations of Binding "gmt" - @ref __ns4__gmt @section gmt_ports Default endpoints of Binding "gmt" - http://localhost:80 @note Use wsdl2h option -Nname to change the service binding prefix name */ /** @page mashup Binding "mashup" @section mashup_operations Operations of Binding "mashup" - @ref __ns5__dtx @section mashup_ports Default endpoints of Binding "mashup" - http://www.cs.fsu.edu/~engelen/mashup.cgi @note Use wsdl2h option -Nname to change the service binding prefix name */ /******************************************************************************\ * * * Service Binding * * calc * * * \******************************************************************************/ /******************************************************************************\ * * * Service Operation * * ns2__add * * * \******************************************************************************/ /** Operation "ns2__add" of service binding "calc". Sums two values - SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" - Default endpoints: - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call_ns2__add( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: double a, double b, // output parameters: double &result ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int ns2__add( struct soap *soap, // input parameters: double a, double b, // output parameters: double &result ); @endcode C++ proxy class (defined in soapcalcProxy.h generated with soapcpp2): @code class calcProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapcalcService.h generated with soapcpp2): @code class calcService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns2 service method-protocol: add SOAP //gsoap ns2 service method-style: add rpc //gsoap ns2 service method-encoding: add http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: add "" //gsoap ns2 service method-output-action: add Response int ns2__add( double :a, ///< Input parameter, :unqualified name as per RPC encoding double :b, ///< Input parameter, :unqualified name as per RPC encoding double &:result ///< Output parameter, :unqualified name as per RPC encoding ); /******************************************************************************\ * * * Service Operation * * ns2__sub * * * \******************************************************************************/ /** Operation "ns2__sub" of service binding "calc". Subtracts two values - SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" - Default endpoints: - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call_ns2__sub( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: double a, double b, // output parameters: double &result ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int ns2__sub( struct soap *soap, // input parameters: double a, double b, // output parameters: double &result ); @endcode C++ proxy class (defined in soapcalcProxy.h generated with soapcpp2): @code class calcProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapcalcService.h generated with soapcpp2): @code class calcService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns2 service method-protocol: sub SOAP //gsoap ns2 service method-style: sub rpc //gsoap ns2 service method-encoding: sub http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: sub "" //gsoap ns2 service method-output-action: sub Response int ns2__sub( double :a, ///< Input parameter, :unqualified name as per RPC encoding double :b, ///< Input parameter, :unqualified name as per RPC encoding double &:result ///< Output parameter, :unqualified name as per RPC encoding ); /******************************************************************************\ * * * Service Operation * * ns2__mul * * * \******************************************************************************/ /** Operation "ns2__mul" of service binding "calc". Multiplies two values - SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" - Default endpoints: - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call_ns2__mul( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: double a, double b, // output parameters: double &result ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int ns2__mul( struct soap *soap, // input parameters: double a, double b, // output parameters: double &result ); @endcode C++ proxy class (defined in soapcalcProxy.h generated with soapcpp2): @code class calcProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapcalcService.h generated with soapcpp2): @code class calcService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns2 service method-protocol: mul SOAP //gsoap ns2 service method-style: mul rpc //gsoap ns2 service method-encoding: mul http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: mul "" //gsoap ns2 service method-output-action: mul Response int ns2__mul( double :a, ///< Input parameter, :unqualified name as per RPC encoding double :b, ///< Input parameter, :unqualified name as per RPC encoding double &:result ///< Output parameter, :unqualified name as per RPC encoding ); /******************************************************************************\ * * * Service Operation * * ns2__div * * * \******************************************************************************/ /** Operation "ns2__div" of service binding "calc". Divides two values - SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" - Default endpoints: - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call_ns2__div( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: double a, double b, // output parameters: double &result ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int ns2__div( struct soap *soap, // input parameters: double a, double b, // output parameters: double &result ); @endcode C++ proxy class (defined in soapcalcProxy.h generated with soapcpp2): @code class calcProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapcalcService.h generated with soapcpp2): @code class calcService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns2 service method-protocol: div SOAP //gsoap ns2 service method-style: div rpc //gsoap ns2 service method-encoding: div http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: div "" //gsoap ns2 service method-output-action: div Response int ns2__div( double :a, ///< Input parameter, :unqualified name as per RPC encoding double :b, ///< Input parameter, :unqualified name as per RPC encoding double &:result ///< Output parameter, :unqualified name as per RPC encoding ); /******************************************************************************\ * * * Service Operation * * ns2__pow * * * \******************************************************************************/ /** Operation "ns2__pow" of service binding "calc". Raises a to b - SOAP RPC encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" - Default endpoints: - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call_ns2__pow( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: double a, double b, // output parameters: double &result ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int ns2__pow( struct soap *soap, // input parameters: double a, double b, // output parameters: double &result ); @endcode C++ proxy class (defined in soapcalcProxy.h generated with soapcpp2): @code class calcProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapcalcService.h generated with soapcpp2): @code class calcService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns2 service method-protocol: pow SOAP //gsoap ns2 service method-style: pow rpc //gsoap ns2 service method-encoding: pow http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns2 service method-action: pow "" //gsoap ns2 service method-output-action: pow Response int ns2__pow( double :a, ///< Input parameter, :unqualified name as per RPC encoding double :b, ///< Input parameter, :unqualified name as per RPC encoding double &:result ///< Output parameter, :unqualified name as per RPC encoding ); /** @page calc Binding "calc" @section calc_policy_enablers Policy Enablers of Binding "calc" None specified. */ /******************************************************************************\ * * * Service Binding * * gmt * * * \******************************************************************************/ /******************************************************************************\ * * * Service Operation * * __ns4__gmt * * * \******************************************************************************/ /** Operation "__ns4__gmt" of service binding "gmt". Service definition of function t__gmt - SOAP document/literal style messaging - Default endpoints: - http://localhost:80 - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns4__gmt( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _ns1__gmt* ns1__gmt, // output parameters: _ns1__gmtResponse &ns1__gmtResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns4__gmt( struct soap *soap, // input parameters: _ns1__gmt* ns1__gmt, // output parameters: _ns1__gmtResponse &ns1__gmtResponse ); @endcode C++ proxy class (defined in soapgmtProxy.h generated with soapcpp2): @code class gmtProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapgmtService.h generated with soapcpp2): @code class gmtService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns4 service method-protocol: gmt SOAP //gsoap ns4 service method-style: gmt document //gsoap ns4 service method-encoding: gmt literal //gsoap ns4 service method-action: gmt "" //gsoap ns4 service method-output-action: gmt Response int __ns4__gmt( _ns1__gmt* ns1__gmt, ///< Input parameter _ns1__gmtResponse &ns1__gmtResponse ///< Output parameter ); /** @page gmt Binding "gmt" @section gmt_policy_enablers Policy Enablers of Binding "gmt" None specified. */ /******************************************************************************\ * * * Service Binding * * mashup * * * \******************************************************************************/ /******************************************************************************\ * * * Service Operation * * __ns5__dtx * * * \******************************************************************************/ /** Operation "__ns5__dtx" of service binding "mashup". - SOAP document/literal style messaging - Default endpoints: - http://www.cs.fsu.edu/~engelen/mashup.cgi - Addressing input action: "" - Addressing output action: "Response" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns5__dtx( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: _XML ns3__daystoxmas, // output parameters: _ns3__commingtotown &ns3__commingtotown ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns5__dtx( struct soap *soap, // input parameters: _XML ns3__daystoxmas, // output parameters: _ns3__commingtotown &ns3__commingtotown ); @endcode C++ proxy class (defined in soapmashupProxy.h generated with soapcpp2): @code class mashupProxy; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes; C++ service class (defined in soapmashupService.h generated with soapcpp2): @code class mashupService; @endcode Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes; */ //gsoap ns5 service method-protocol: dtx SOAP //gsoap ns5 service method-style: dtx document //gsoap ns5 service method-encoding: dtx literal //gsoap ns5 service method-action: dtx "" //gsoap ns5 service method-output-action: dtx Response int __ns5__dtx( _XML ns3__daystoxmas, ///< Input parameter _ns3__commingtotown &ns3__commingtotown ///< Output parameter ); /** @page mashup Binding "mashup" @section mashup_policy_enablers Policy Enablers of Binding "mashup" None specified. */ /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings that are contractually bound by WSDL and are auto-generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. @note The following readers and writers are C/C++ data type (de)serializers auto-generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. @note Data can be read and deserialized from: - an int file descriptor, using soap->recvfd = fd - a socket, using soap->socket = (int)... - a C++ stream (istream, stringstream), using soap->is = (istream*)... - a C string, using soap->is = (const char*)... - any input, using the soap->frecv() callback @note Data can be serialized and written to: - an int file descriptor, using soap->sendfd = (int)... - a socket, using soap->socket = (int)... - a C++ stream (ostream, stringstream), using soap->os = (ostream*)... - a C string, using soap->os = (const char**)... - any output, using the soap->fsend() callback @note The following options are available for (de)serialization control: - soap->encodingStyle = NULL; to remove SOAP 1.1/1.2 encodingStyle - soap_set_mode(soap, SOAP_XML_TREE); XML without id-ref (no cycles!) - soap_set_mode(soap, SOAP_XML_GRAPH); XML with id-ref (including cycles) - soap_set_namespaces(soap, struct Namespace *nsmap); to set xmlns bindings @section ns1 Top-level root elements of schema "http://tempuri.org/t.xsd" - @ref _ns1__gmt @code // Reader (returns SOAP_OK on success): soap_read__ns1__gmt(struct soap*, _ns1__gmt*); // Writer (returns SOAP_OK on success): soap_write__ns1__gmt(struct soap*, _ns1__gmt*); // REST GET (returns SOAP_OK on success): soap_GET__ns1__gmt(struct soap*, const char *URL, _ns1__gmt*); // REST PUT (returns SOAP_OK on success): soap_PUT__ns1__gmt(struct soap*, const char *URL, _ns1__gmt*); // REST POST (returns SOAP_OK on success): soap_POST_send__ns1__gmt(struct soap*, const char *URL, _ns1__gmt*); soap_POST_recv__ns1__gmt(struct soap*, _ns1__gmt*); @endcode - @ref _ns1__gmtResponse @code // Reader (returns SOAP_OK on success): soap_read__ns1__gmtResponse(struct soap*, _ns1__gmtResponse*); // Writer (returns SOAP_OK on success): soap_write__ns1__gmtResponse(struct soap*, _ns1__gmtResponse*); // REST GET (returns SOAP_OK on success): soap_GET__ns1__gmtResponse(struct soap*, const char *URL, _ns1__gmtResponse*); // REST PUT (returns SOAP_OK on success): soap_PUT__ns1__gmtResponse(struct soap*, const char *URL, _ns1__gmtResponse*); // REST POST (returns SOAP_OK on success): soap_POST_send__ns1__gmtResponse(struct soap*, const char *URL, _ns1__gmtResponse*); soap_POST_recv__ns1__gmtResponse(struct soap*, _ns1__gmtResponse*); @endcode @section ns2 Top-level root elements of schema "urn:calc" @section ns3 Top-level root elements of schema "urn:daystoxmas" - @ref _ns3__daystoxmas @code // Reader (returns SOAP_OK on success): soap_read__ns3__daystoxmas(struct soap*, _XML); // Writer (returns SOAP_OK on success): soap_write__ns3__daystoxmas(struct soap*, _XML); // REST GET (returns SOAP_OK on success): soap_GET__ns3__daystoxmas(struct soap*, const char *URL, _XML); // REST PUT (returns SOAP_OK on success): soap_PUT__ns3__daystoxmas(struct soap*, const char *URL, _XML); // REST POST (returns SOAP_OK on success): soap_POST_send__ns3__daystoxmas(struct soap*, const char *URL, _XML); soap_POST_recv__ns3__daystoxmas(struct soap*, _XML); @endcode - @ref _ns3__commingtotown @code // Reader (returns SOAP_OK on success): soap_read__ns3__commingtotown(struct soap*, _ns3__commingtotown*); // Writer (returns SOAP_OK on success): soap_write__ns3__commingtotown(struct soap*, _ns3__commingtotown*); // REST GET (returns SOAP_OK on success): soap_GET__ns3__commingtotown(struct soap*, const char *URL, _ns3__commingtotown*); // REST PUT (returns SOAP_OK on success): soap_PUT__ns3__commingtotown(struct soap*, const char *URL, _ns3__commingtotown*); // REST POST (returns SOAP_OK on success): soap_POST_send__ns3__commingtotown(struct soap*, const char *URL, _ns3__commingtotown*); soap_POST_recv__ns3__commingtotown(struct soap*, _ns3__commingtotown*); @endcode */ /* End of mashup.hpp */ gsoap-2.8.91/gsoap/samples/mashup++/gmt.wsdl0000644000175000017500000000574513525245163020167 0ustar ellertellert Service definition of function t__gmt Get current time client code: `#include "soapH.h" #include "gmt.nsmap" int main() { time_t t; struct soap *soap = soap_new(); soap_call_t__gmt(soap, "http://www.cs.fsu.edu/~engelen/gmtlitserver.cgi", "", &t); printf("The current time is %s\\n", ctime(&t)); soap_destroy(soap); soap_end(soap); soap_free(soap); return 0; }` gsoap-2.8.91/gsoap/samples/mashup++/README.txt0000644000175000017500000000223313525245163020170 0ustar ellertellert A simple example "mashup" service. The service computes the number of days to christmas using the GMT time service and calculator service. The wsdl2h tool accepts multiple WSDLs and generates one gSOAP definitions file to implement clients and/or services. If necessary, use wsdl2h -Nname to generate bindings for the separate WSDL services. In this mashup example we create a new service to compute the days to christmas by invoking the GMT and calc services within a service operation. A client for the mashup service is also included. The mashup.h gSOAP definitions file is generated from the GMT and calculator WSDLs using: wsdl2h -s -o mashup.h gmt.wsdl calc.wsdl mashup.wsdl where gmt.wsdl is generated in samples/gmt, calc.wsdl is generated in samples/calc, and mashup.wsdl is a new WSDL to expose the new "daystoxmas" service operation. The mashupserver is a CGI application, which can be easily changed into a (multi-threaded) stand-alone Web server as per online tutorials and shown in other examples. The mashupclient is a stand-alone client for the service. Invoking mashupclient will connect to the service, which returns the number of days to christmas. gsoap-2.8.91/gsoap/samples/mashup++/mashupserver.cpp0000644000175000017500000000571213525245163021727 0ustar ellertellert/* mashupserver.cpp Example mashup CGI service in C++ soapcpp2 -i mashup.hpp cc -o mashupserver mashupserver.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp soapServiceProxy.cpp soapmashupService.cpp -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapcalcProxy.h" #include "soapgmtProxy.h" #include "soapmashupService.h" #include "mashup.nsmap" int main() { mashupService service; return service.serve(); } /******************************************************************************\ * * Server operation * \******************************************************************************/ int mashupService::dtx(_XML x, _ns3__commingtotown &response) { (void)x; /* input param that is always empty is simply ignored */ gmtProxy Time("http://www.cs.fsu.edu/~engelen/gmtlitserver.cgi"); _ns1__gmt gmt; _ns1__gmtResponse gmtResponse; if (Time.gmt(&gmt, gmtResponse)) return soap_receiverfault("Cannot connect to GMT server", NULL); time_t now = gmtResponse.param_1; struct tm tm; memset(&tm, 0, sizeof(struct tm)); tm.tm_mday = 25; tm.tm_mon = 11; tm.tm_year = gmtime(&now)->tm_year; // this year time_t xmas = soap_timegm(&tm); if (xmas < now) { tm.tm_year++; // xmas just passed, go to next year xmas = soap_timegm(&tm); } double sec = difftime(xmas, now); calcProxy Calc; double days; if (Calc.div(sec, 86400.0, days)) return soap_receiverfault("Cannot connect to calc server", NULL); response.days = (int)days; soap_delegate_deletion(&Time, this); // Time data to be deleted by 'this' soap_delegate_deletion(&Calc, this); // Calc data to be deleted by 'this' return SOAP_OK; } gsoap-2.8.91/gsoap/samples/mashup++/mashupclient.cpp0000644000175000017500000000367213525245163021702 0ustar ellertellert/* mashupclient.cpp Example mashup service client in C++ soapcpp2 -i mashup.hpp cc -o mashupclient mashupclient.cpp stdsoap2.cpp soapC.cpp soapmashupProxy.cpp -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapmashupProxy.h" #include "mashup.nsmap" int main() { mashupProxy proxy; _ns3__commingtotown response; if (proxy.dtx((char*)"", response)) proxy.soap_stream_fault(std::cerr); else if (response.days == 0) std::cout << "Today is the day!" << std::endl; else std::cout << "Wait " << response.days << " more days to xmas" << std::endl; proxy.destroy(); // delete deserialized data return 0; } gsoap-2.8.91/gsoap/samples/mashup++/Makefile.am0000644000175000017500000000133613525245163020531 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = mashupclient mashupserver SOAPHEADER = mashup.hpp include ../Makefile.defines include ../Makefile.cpp_proxy_rules SOAP_NS = mashup.nsmap mashupclient_SOURCES = mashupclient.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) soapmashupProxy.cpp mashupclient_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) mashupserver_SOURCES = mashupserver.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) soapcalcProxy.cpp soapgmtProxy.cpp soapmashupService.cpp mashupserver_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) gsoap-2.8.91/gsoap/samples/mashup++/mashup.wsdl0000644000175000017500000000426613525245163020672 0ustar ellertellert gsoap-2.8.91/gsoap/samples/oneway++/0000755000175000017500000000000013525245174016501 5ustar ellertellertgsoap-2.8.91/gsoap/samples/oneway++/.deps/0000755000175000017500000000000013525245174017512 5ustar ellertellertgsoap-2.8.91/gsoap/samples/oneway++/event.h0000644000175000017500000000436313525245163017777 0ustar ellertellert/* -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: Event Simple remote event handler //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://www.cs.fsu.edu/~engelen/event.wsdl //gsoap ns service location: http://localhost:18000 //gsoap ns schema namespace: urn:event //gsoap ns schema type: event Set of four possible events enum ns__event { //gsoap ns schema type: event::EVENT_A first event EVENT_A, //gsoap ns schema type: event::EVENT_B second event EVENT_B, //gsoap ns schema type: event::EVENT_C third event EVENT_C, //gsoap ns schema type: event::EVENT_Z final event EVENT_Z }; //gsoap ns service method: handle Handles asynchronous events //gsoap ns service method: handle::event EVENT_A, EVENT_B, EVENT_C, or EVENT_Z //gsoap ns service method-action: handle "event" int ns__handle(enum ns__event event, void); gsoap-2.8.91/gsoap/samples/oneway++/Makefile.in0000644000175000017500000005133113525245163020547 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = event$(EXEEXT) handler$(EXEEXT) subdir = gsoap/samples/oneway++ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am_event_OBJECTS = event.$(OBJEXT) $(am__objects_1) $(am__objects_2) \ soapEventProxy.$(OBJEXT) event_OBJECTS = $(am_event_OBJECTS) am__DEPENDENCIES_1 = event_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) am_handler_OBJECTS = handler.$(OBJEXT) $(am__objects_1) \ $(am__objects_2) soapEventService.$(OBJEXT) \ soapEventProxy.$(OBJEXT) handler_OBJECTS = $(am_handler_OBJECTS) handler_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/event.Po ./$(DEPDIR)/handler.Po \ ./$(DEPDIR)/soapC.Po ./$(DEPDIR)/soapEventProxy.Po \ ./$(DEPDIR)/soapEventService.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(event_SOURCES) $(handler_SOURCES) DIST_SOURCES = $(event_SOURCES) $(handler_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.cpp_proxy_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = event.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = Event.nsmap Event.wsdl event_SOURCES = event.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) soapEventProxy.cpp event_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) handler_SOURCES = handler.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) soapEventService.cpp soapEventProxy.cpp handler_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_proxy_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/oneway++/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/oneway++/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_proxy_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) event$(EXEEXT): $(event_OBJECTS) $(event_DEPENDENCIES) $(EXTRA_event_DEPENDENCIES) @rm -f event$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(event_OBJECTS) $(event_LDADD) $(LIBS) handler$(EXEEXT): $(handler_OBJECTS) $(handler_DEPENDENCIES) $(EXTRA_handler_DEPENDENCIES) @rm -f handler$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(handler_OBJECTS) $(handler_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/event.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/handler.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapEventProxy.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapEventService.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/event.Po -rm -f ./$(DEPDIR)/handler.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapEventProxy.Po -rm -f ./$(DEPDIR)/soapEventService.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/event.Po -rm -f ./$(DEPDIR)/handler.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapEventProxy.Po -rm -f ./$(DEPDIR)/soapEventService.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -i -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/oneway++/event.cpp0000644000175000017500000001017313525245163020326 0ustar ellertellert/* event.cpp C++-style client Events based on one-way SOAP messaging using HTTP keep-alive for persistent connections. C++ style with Proxy object. The 'synchronous' global flag illustrates SOAP one-way messaging, which requires an HTTP OK or HTTP Accept response with an empty body to be returned by the server. Compile: soapcpp2 -i event.h c++ -o event event.cpp stdsoap2.cpp soapC.cpp soapEventProxy.cpp Run (first start the event handler on localhost port 18000): event -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapEventProxy.h" #include "Event.nsmap" int synchronous = 1; /* synchronous=0: asynchronous one-way messaging over HTTP (no HTTP response) */ /* synchronous=1: SOAP interoperable synchronous one-way messaging over HTTP */ /* Service details (copied from event.h): */ const char *event_handler_endpoint = "http://localhost:18000"; const char *event_handler_action = "event"; int main() { EventProxy e(SOAP_IO_KEEPALIVE | SOAP_XML_INDENT); // Events A to C do not generate a response from the server fprintf(stderr, "Client Sends Event: A\n"); if (e.send_handle(EVENT_A)) e.soap_print_fault(stderr); else if (synchronous && e.recv_handle_empty_response()) e.soap_print_fault(stderr); fprintf(stderr, "Client Sends Event: B\n"); if (e.send_handle(EVENT_B)) e.soap_print_fault(stderr); else if (synchronous && e.recv_handle_empty_response()) e.soap_print_fault(stderr); // connection should not be kept alive after the last call: be nice to the server and tell it that we close the connection after this call soap_clr_omode(&e, SOAP_IO_KEEPALIVE); fprintf(stderr, "Client Sends Event: C\n"); if (e.send_handle(EVENT_C)) e.soap_print_fault(stderr); else if (synchronous && e.recv_handle_empty_response()) e.soap_print_fault(stderr); e.soap_close_socket(); // Re-enable keep-alive soap_set_omode(&e, SOAP_IO_KEEPALIVE); // Events Z generates a series of responses from the server fprintf(stderr, "Client Sends Event: Z\n"); if (e.send_handle(EVENT_Z)) e.soap_print_fault(stderr); else { struct ns__handle response; for (;;) { if (!soap_valid_socket(e.socket)) { fprintf(stderr, "Connection was terminated (keep alive disabled?)\n"); break; } if (e.recv_handle(response)) { if (e.error == SOAP_EOF) fprintf(stderr, "Connection was gracefully closed by server\n"); else e.soap_print_fault(stderr); break; } else { switch (response.event) { case EVENT_A: fprintf(stderr, "Client Received Event: A\n"); break; case EVENT_B: fprintf(stderr, "Client Received Event: B\n"); break; case EVENT_C: fprintf(stderr, "Client Received Event: C\n"); break; case EVENT_Z: fprintf(stderr, "Client Received Event: Z\n"); break; } } } } return 0; } gsoap-2.8.91/gsoap/samples/oneway++/handler.cpp0000644000175000017500000001264113525245163020624 0ustar ellertellert/* handler.cpp Multi-threaded C++ stand-alone event handler service Events are based on one-way SOAP messaging using HTTP keep-alive for persistent connections The 'synchronous' global flag illustrates SOAP one-way messaging, which requires an HTTP OK response with an empty body to be returned by the server. Compile: soapcpp2 -i event.h cc -o handler++ handler.cpp stdsoap2.cpp soapC.cpp soapEventService.cpp soapEventProxy.cpp Run: handler 18000 & Server will time out after 24hr of inactivity This code enables keep-alive support which can cause "broken pipes" when the client prematurely closes the connection while indicating it wants the connection to stay alive. Broken pipes (SIGPIPE) can be fixed using MSG_NOSIGNAL, SO_NOSIGPIPE, or with a signal handler, but this is not very portable (see code below) -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapEventService.h" #include "soapEventProxy.h" #include "Event.nsmap" #include #ifdef _POSIX_THREADS #include // use Pthreads #endif #define BACKLOG (100) #define TIMEOUT (24*60*60) /* timeout after 24hrs of inactivity */ void *process_request(void*); int synchronous = 1; /* synchronous=0: asynchronous one-way messaging over HTTP (no HTTP response) */ /* synchronous=1: SOAP interoperable synchronous one-way messaging over HTTP */ int main(int argc, char **argv) { if (argc < 2) { fprintf(stderr, "Usage: handler \n"); exit(1); } int port = atoi(argv[1]); /* server with keep I/O alive and timeout settings */ EventService handler(SOAP_IO_KEEPALIVE, SOAP_IO_KEEPALIVE | SOAP_XML_INDENT); handler.accept_timeout = TIMEOUT; handler.bind_flags |= SO_REUSEADDR; /* don't use this in unsecured environments */ /* handler.socket_flags = MSG_NOSIGNAL; */ /* use this to disable SIGPIPE */ /* handler.bind_flags |= SO_NOSIGPIPE; */ /* or use this to disable SIGPIPE */ SOAP_SOCKET m = handler.bind(NULL, port, BACKLOG); if (!soap_valid_socket(m)) { handler.soap_print_fault(stderr); exit(1); } fprintf(stderr, "Socket connection successful %d\n", m); for (int i = 1; ; i++) { SOAP_SOCKET s = handler.accept(); if (!soap_valid_socket(s)) { if (handler.errnum) handler.soap_print_fault(stderr); else fprintf(stderr, "%s timed out\n", argv[0]); /* should really wait for threads to terminate, but 24hr timeout should be enough ... */ break; } fprintf(stderr, "Thread %d accepts socket %d connection from IP %d.%d.%d.%d\n", i, s, (int)(handler.ip>>24)&0xFF, (int)(handler.ip>>16)&0xFF, (int)(handler.ip>>8)&0xFF, (int)handler.ip&0xFF); EventService *thandler = handler.copy(); #ifdef _POSIX_THREADS pthread_t tid; pthread_create(&tid, NULL, (void*(*)(void*))process_request, (void*)thandler); #else process_request((void*)thandler); #endif } return 0; } void *process_request(void *thandler) { EventService *handler = (EventService *)thandler; #ifdef _POSIX_THREADS pthread_detach(pthread_self()); #endif handler->serve(); delete handler; return NULL; } int EventService::handle(enum ns__event event) { switch (event) { /* each event is just consumed without server response */ case EVENT_A: fprintf(stderr, "Server Received Event: A\n"); break; case EVENT_B: fprintf(stderr, "Server Received Event: B\n"); break; case EVENT_C: fprintf(stderr, "Server Received Event: C\n"); break; /* after receiving event Z, we echo events A to C back to the client */ case EVENT_Z: fprintf(stderr, "Server Received Event: Z\n"); { /* create a proxy with a copy of the server state */ EventProxy proxy(*this); /* send message over HTTP on current socket */ proxy.soap_endpoint = "http://"; /* these multiple sends assume that the client enabled keep-alive */ fprintf(stderr, "Server Sends Event: A\n"); proxy.send_handle(EVENT_A); fprintf(stderr, "Server Sends Event: B\n"); proxy.send_handle(EVENT_B); fprintf(stderr, "Server Sends Event: C\n"); proxy.send_handle(EVENT_C); } } if (event != EVENT_Z && synchronous) return send_handle_empty_response(SOAP_OK); return SOAP_OK; } gsoap-2.8.91/gsoap/samples/oneway++/README.txt0000644000175000017500000001574513525245163020211 0ustar ellertellert C++-style eventing client and event handler server. Events are one-way SOAP messages using HTTP keep-alive for persistent connections. This example illustrates one-way message exchange patterns (MEP) between a client and server, each with C and C++ implementations. samples/event: event.c C-based client handler.c C-based multithreaded server (uses Pthreads) samples/event++: event.cpp C++-based client handler.cpp C++-based server (uses Pthreads) For HTTP communications events are not truly one-way, since HTTP Accept or OK responses are expected to be returned to the client. Thus, this is a form of synchronous communication with rendezvous. The code also supports true one-way messaging, by setting the global flag synchronous = 0. Note that all send operations may or may not block. Receive operations always block. All four files are built with the web service definitions given in the gSOAP header file event.h. The event.h file is processed with soapcpp2 as follows: Compilation in C: soapcpp2 -c event.h cc -o event event.c stdsoap2.c soapC.c soapClient.c cc -o handler handler.c stdsoap2.c soapC.c soapServer.c Compilation in C++: soapcpp2 -i event.h cc -o event++ event.cpp stdsoap2.cpp soapC.cpp soapEventProxy.cpp cc -o handler++ handler.cpp stdsoap2.cpp soapC.cpp soapEventService.cpp soap EventProxy.cpp The C client-side uses: Initialization of the runtime engine: soap_init(struct soap*) soap_init2(struct soap*, soap_mode input_modes, soap_mode output_modes) Sending an event to the handler, this function is generated by soapcpp2: soap_send_ns__handle(struct soap*, const char *endpoint, const char *action, enum ns__event event) Note: pass endpoint=NULL and action=NULL for defaults To accept an HTTP Accept or OK message (ack): soap_recv_empty_response(struct soap*) Receiving an event from the handler, this function is generated by soapcpp2: soap_recv_ns__handle(struct soap*, struct ns__handle*) Set and reset HTTP keep-alive connections (optional): soap_set_omode(soap, SOAP_IO_KEEPALIVE) soap_clr_omode(soap, SOAP_IO_KEEPALIVE) Close the socket (to end a keep-alive session) soap_closesocket(struct soap*) Print communication errors: soap_print_fault(struct soap*, FILE*) Allocate data, which stays alive until deallocated by soap_end() soap_malloc(struct soap*, size_t len) Delete deserialized data: soap_end(struct soap*) Finalize and detach the runtime engine: soap_done(struct soap*) The multi-threaded C server-side uses: Initialization of the runtime engine: soap_init(struct soap*) soap_init2(struct soap*, soap_mode input_modes, soap_mode output_modes) Binding the port: soap_bind(struct soap*, const char *host, int port, int backlog) Accepting a request: soap_accept(struct soap*); Invoking the service dispatcher, this function is generated by soapcpp2: soap_serve(struct soap*) Print communication errors: soap_print_fault(struct soap*, FILE*) Allocate data, which stays alive until deallocated by soap_end() soap_malloc(struct soap*, size_t len) Delete deserialized data: soap_end(struct soap*) Send back sender-related fault: soap_sender_fault(struct soap*, const char *string, const char *detailXML) Send back receiver-related fault: soap_receiver_fault(struct soap*, const char *string, const char *detailXML) Make a copy of the current runtime engine: soap_copy(struct soap*) Finalize and detach the runtime engine: soap_done(struct soap*) Finalize, detach, and delete the runtime engine: soap_free(struct soap*) Service operation is not auto-generated (user-defined): ns__handle(struct soap*, enum ns__event *event); Sending an event to the client, this function is generated by soapcpp2: soap_send_ns__handle(struct soap*, const char *endpoint, const char *action, enum ns__event event) where we use endpoint = "http://" to send message over current socket The C++ client-side uses a proxy generated with soapcpp2 -i: class EventProxy Constructor EventProxy(soap_mode input_output_modes) The default endpoint can be changed: const char *EventProxxy::endpoint Invoke a call of xyz: EventProxy::xyz(double a, double b, double *result) Print communication errors: EventProxy::soap_stream_fault(std::ostream&) Error code (see list of error codes in documentation and stdsoap2.h): EventProxy::error Allocate data, deallocated by soap_end() or EventService destructor soap_malloc(EventService*, size_t len) Get new instance of class X, deallocated by soap_destroy() or EventService destructor soap_new_X(EventService*, -1) Get array of new instances of class X, deallocated by soap_destroy() or EventService destructor soap_new_X(EventService*, arraylen) Delete deserialized C++ class instances (also part of EventService destructor): soap_destroy(EventService*) Delete deserialized data (also part of EventService destructor): soap_end(EventService*) The C++ server-side uses the server and proxy classes generated with soapcpp2 option -i. A proxy instance is needed for the one-way send operation. Create a serivce copy for new thread EventService::copy() Bind port EventService::bind(const char *host, int port, int backlog) Accept and set socket EventService::accept() Serve requests over current socket EventService::serve() Print communication errors: EventService::soap_stream_fault(std::ostream&) Error code (see list of error codes in documentation and stdsoap2.h): EventService::error Send back sender-related fault: EventService::soap_senderfault(const char *string, const char *detailXML) Send back sender-related fault with subcode (SOAP 1.2): EventService::soap_senderfault(const char *subcodeQName, const char *string, const char *detailXML) Send back receiver-related fault: EventService::soap_receiverfault(const char *string, const char *detailXML) Send back receiver-related fault with subcode (SOAP 1.2): EventService::soap_receiverfault(const char *subcodeQName, const char *string, const char *detailXML) Service operations are user-defined (not auto-generated): EventService::handle(enum ns__event *event) Allocate data, deallocated by soap_end() or EventService destructor soap_malloc(EventService*, size_t len) Get new instance of class X, deallocated by soap_destroy() or EventService destructor soap_new_X(EventService*, -1) Get array of new instances of class X, deallocated by soap_destroy() or EventService destructor soap_new_X(EventService*, arraylen) Delete deserialized C++ class instances (also part of EventService destructor): soap_destroy(EventService*) Delete deserialized data (also part of EventService destructor): soap_end(EventService*) Note: all soap_xyz(struct soap*, ...) gSOAP API functions are also available to the EventProxy and EventService classes by inheritance of the struct soap runtime engine state object. gsoap-2.8.91/gsoap/samples/oneway++/Makefile.am0000644000175000017500000000125713525245163020540 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = event handler SOAPHEADER = event.h include ../Makefile.defines include ../Makefile.cpp_proxy_rules SOAP_NS = Event.nsmap Event.wsdl event_SOURCES = event.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) soapEventProxy.cpp event_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) handler_SOURCES = handler.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) soapEventService.cpp soapEventProxy.cpp handler_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread gsoap-2.8.91/gsoap/samples/factorytest/0000755000175000017500000000000013525245174017420 5ustar ellertellertgsoap-2.8.91/gsoap/samples/factorytest/.deps/0000755000175000017500000000000013525245174020431 5ustar ellertellertgsoap-2.8.91/gsoap/samples/factorytest/Makefile.in0000644000175000017500000004760713525245163021501 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = factorytest$(EXEEXT) subdir = gsoap/samples/factorytest ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am_factorytest_OBJECTS = factorytest.$(OBJEXT) $(am__objects_1) \ $(am__objects_3) factorytest_OBJECTS = $(am_factorytest_OBJECTS) am__DEPENDENCIES_1 = factorytest_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/factorytest.Po ./$(DEPDIR)/soapC.Po \ ./$(DEPDIR)/soapClient.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(factorytest_SOURCES) DIST_SOURCES = $(factorytest_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.cpp_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = factorytest.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_CPP_CLIENT) soapServer.cpp $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = factorytest.nsmap factorytest.wsdl factorytest_SOURCES = factorytest.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) factorytest_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/factorytest/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/factorytest/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) factorytest$(EXEEXT): $(factorytest_OBJECTS) $(factorytest_DEPENDENCIES) $(EXTRA_factorytest_DEPENDENCIES) @rm -f factorytest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(factorytest_OBJECTS) $(factorytest_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/factorytest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/factorytest.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/factorytest.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -L -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/factorytest/factorytest.h0000644000175000017500000000724213525245163022143 0ustar ellertellert/* factorytest.h Client-side remote object factory definitions -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: factorytest //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/factory.wsdl //gsoap ns service location: http://localhost:18085 //gsoap ns schema namespace: urn:factoryService //gsoap t schema namespace: urn:factoryTypes //gsoap h schema namespace: urn:factoryHandles //////////////////////////////////////////////////////////////////////////////// // // SOAP Header: used to exchange stateful object handles // //////////////////////////////////////////////////////////////////////////////// struct SOAP_ENV__Header { mustUnderstand unsigned int h__handle; }; //////////////////////////////////////////////////////////////////////////////// // // Remote factory objects // //////////////////////////////////////////////////////////////////////////////// enum t__object // object types: { ROOT, // t__root object ADDER, // t__adder object COUNTER // t__counter object }; enum t__status // remote object status: { FACTORY_OK, // ok FACTORY_INVALID, // invalid handle (wrong type of object or lease expired) FACTORY_NOTFOUND, // lookup operation not successful FACTORY_RETRY // cannot create new object: try later }; //////////////////////////////////////////////////////////////////////////////// // // Remote factory method interfaces // //////////////////////////////////////////////////////////////////////////////// int ns__create(enum t__object object, char *name, enum t__status &status); int ns__lookup(enum t__object object, char *name, enum t__status &status); int ns__rename(char *name, enum t__status &status); int ns__release(enum t__status &status); //////////////////////////////////////////////////////////////////////////////// // // Rewote adder method interfaces // //////////////////////////////////////////////////////////////////////////////// int ns__set(double val, enum t__status &status); int ns__get(double &val); int ns__add(double val, enum t__status &status); //////////////////////////////////////////////////////////////////////////////// // // Remote counter method interfaces // //////////////////////////////////////////////////////////////////////////////// int ns__inc(enum t__status &status); gsoap-2.8.91/gsoap/samples/factorytest/factorytest.cpp0000644000175000017500000001541613525245163022500 0ustar ellertellert/* factorytest.cpp Test client for remote object factory This is a simple example client program that defines its own proxy objects. The proxy objects utilize the gSOAP remote interfaces to access the remote factory. The remote object interfaces are declared in factorytest.h. Since the remote interfaces are C-style, C-based client programs cam be developed to access remote object factories. Compile: soapcpp2 factorytest.h c++ -o factorytest factorytest.cpp stdsoap2.cpp soapC.cpp soapClient.cpp Run: factorytest where is the service endpoint of a factory server, e.g. http://localhost:18085 -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "factorytest.nsmap" #include // default factory service endpoint: const char *factory = "http://localhost:18085"; //////////////////////////////////////////////////////////////////////////////// // // Client-side root proxy class // //////////////////////////////////////////////////////////////////////////////// class Root { public: char *endpoint; // factory service endpoint enum t__status status; // status flag struct soap *soap; // gSOAP environment (for header h__handle) Root(); Root(const char *factory, enum t__object object, char *name); virtual ~Root(); void rename(char *name); }; Root::Root() { endpoint = NULL; status = FACTORY_OK; soap = NULL; } Root::Root(const char *factory, enum t__object object, char *name) { soap = soap_new(); endpoint = soap_strdup(soap, factory); status = FACTORY_NOTFOUND; if (name) if (soap_call_ns__lookup(soap, endpoint, "", object, name, status)) soap_print_fault(soap, stderr); // for demo, just print if (status == FACTORY_NOTFOUND) do { if (soap_call_ns__create(soap, endpoint, "", object, name, status)) soap_print_fault(soap, stderr); // for demo, just print } while (status == FACTORY_RETRY); } Root::~Root() { if (soap_call_ns__release(soap, endpoint, "", status)) soap_print_fault(soap, stderr); // for demo, just print soap_destroy(soap); soap_end(soap); soap_free(soap); } void Root::rename(char *name) { if (soap_call_ns__rename(soap, endpoint, "", name, status)) soap_print_fault(soap, stderr); // for demo, just print } //////////////////////////////////////////////////////////////////////////////// // // Client-side adder proxy class derived from root // //////////////////////////////////////////////////////////////////////////////// class Adder: public Root { public: Adder() : Root(factory, ADDER, NULL) {}; Adder(char *name) : Root(factory, ADDER, name) {}; Adder(const char *factory, enum t__object object, char *name) : Root(factory, object, name) {}; void set(double val); // to set the remote adder double get(); // to get value of the remote adder void add(double val); // to add a value to the remote adder }; void Adder::set(double val) { if (soap_call_ns__set(soap, endpoint, "", val, status)) soap_print_fault(soap, stderr); // for demo, just print } double Adder::get() { double val; if (soap_call_ns__get(soap, endpoint, "", val)) soap_print_fault(soap, stderr); // for demo, just print return val; } void Adder::add(double val) { if (soap_call_ns__add(soap, endpoint, "", val, status)) soap_print_fault(soap, stderr); // for demo, just print } //////////////////////////////////////////////////////////////////////////////// // // Client-side counter proxy class derived from adder // //////////////////////////////////////////////////////////////////////////////// class Counter: public Adder { public: Counter() : Adder(factory, COUNTER, NULL) {}; Counter(char *name) : Adder(factory, COUNTER, name) {}; Counter(const char *factory, enum t__object object, char *name) : Adder(factory, object, name) {}; void inc(); // to increment the remote counter }; void Counter::inc() { if (soap_call_ns__inc(soap, endpoint, "", status)) soap_print_fault(soap, stderr); // for demo, just print } //////////////////////////////////////////////////////////////////////////////// // // Main client test program // //////////////////////////////////////////////////////////////////////////////// int main(int argc, char **argv) { if (argc > 1) factory = argv[1]; // use factory from command line arg by default std::cout << "Connecting to factory " << factory << std::endl; Adder adder; // create unique new remote adder object Counter counter1((char*)"myCounter"); // new counter object "myCounter" (created if not exists) Counter counter2((char*)"myCounter"); // lookup and use counter "myCounter" (this is an alias to counter1!) adder.set(2.0); counter1.set(adder.get()); adder.add(3.0); counter1.inc(); std::cout << "Adder=" << adder.get() << std::endl; std::cout << "Counter=" << counter2.get() << std::endl; // counter2 is an alias for counter1 so this prints the value of counter1 std::cout << "Sleep for 90 seconds to test factory server purging objects:" << std::endl; // counter is periodically incremented which keeps it alive sleep(30); counter1.inc(); std::cout << "Counter=" << counter2.get() << std::endl; sleep(30); counter1.inc(); std::cout << "Counter=" << counter2.get() << std::endl; sleep(30); counter1.inc(); std::cout << "Counter=" << counter2.get() << std::endl; // after 90 secs, the adder should be gone std::cout << "Adder is no longer available:" << std::endl; adder.add(3.0); std::cout << "Adder status = " << adder.status << std::endl; return 0; } gsoap-2.8.91/gsoap/samples/factorytest/README.txt0000644000175000017500000000065313525245163021120 0ustar ellertellert A remote object factory client. See samples/factory for the server code. Server objects are instantiated, manipulated, and destroyed remotely using SOAP messages. The objects are persistent and can be named. Objects are purged when their lease expires. A lease is renewed when the object is used. The client-side message definitions do not include the server object definitions, since only the messaging parts are needed. gsoap-2.8.91/gsoap/samples/factorytest/Makefile.am0000644000175000017500000000102413525245163021447 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = factorytest SOAPHEADER = factorytest.h include ../Makefile.defines include ../Makefile.cpp_rules SOAP_NS = factorytest.nsmap factorytest.wsdl factorytest_SOURCES = factorytest.cpp $(SOAPHEADER) $(SOAP_CPP_CLIENT) factorytest_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) gsoap-2.8.91/gsoap/samples/oneway/0000755000175000017500000000000013525245174016353 5ustar ellertellertgsoap-2.8.91/gsoap/samples/oneway/.deps/0000755000175000017500000000000013525245174017364 5ustar ellertellertgsoap-2.8.91/gsoap/samples/oneway/event.h0000644000175000017500000000436313525245163017651 0ustar ellertellert/* -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: Event Simple remote event handler //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://www.cs.fsu.edu/~engelen/event.wsdl //gsoap ns service location: http://localhost:18000 //gsoap ns schema namespace: urn:event //gsoap ns schema type: event Set of four possible events enum ns__event { //gsoap ns schema type: event::EVENT_A first event EVENT_A, //gsoap ns schema type: event::EVENT_B second event EVENT_B, //gsoap ns schema type: event::EVENT_C third event EVENT_C, //gsoap ns schema type: event::EVENT_Z final event EVENT_Z }; //gsoap ns service method: handle Handles asynchronous events //gsoap ns service method: handle::event EVENT_A, EVENT_B, EVENT_C, or EVENT_Z //gsoap ns service method-action: handle "event" int ns__handle(enum ns__event event, void); gsoap-2.8.91/gsoap/samples/oneway/Makefile.in0000644000175000017500000005011513525245163020420 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = event$(EXEEXT) handler$(EXEEXT) subdir = gsoap/samples/oneway ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am_event_OBJECTS = event.$(OBJEXT) $(am__objects_1) $(am__objects_3) event_OBJECTS = $(am_event_OBJECTS) am__DEPENDENCIES_1 = event_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) am__objects_4 = $(am__objects_3) soapServer.$(OBJEXT) $(am__objects_1) \ $(am__objects_1) am_handler_OBJECTS = handler.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) handler_OBJECTS = $(am_handler_OBJECTS) handler_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/event.Po ./$(DEPDIR)/handler.Po \ ./$(DEPDIR)/soapC.Po ./$(DEPDIR)/soapClient.Po \ ./$(DEPDIR)/soapServer.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(event_SOURCES) $(handler_SOURCES) DIST_SOURCES = $(event_SOURCES) $(handler_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.c_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = event.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = Event.nsmap Event.wsdl event_SOURCES = event.c $(SOAPHEADER) $(SOAP_C_CLIENT) event_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) handler_SOURCES = handler.c $(SOAPHEADER) $(SOAP_C_SRC) handler_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/oneway/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/oneway/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) event$(EXEEXT): $(event_OBJECTS) $(event_DEPENDENCIES) $(EXTRA_event_DEPENDENCIES) @rm -f event$(EXEEXT) $(AM_V_CCLD)$(LINK) $(event_OBJECTS) $(event_LDADD) $(LIBS) handler$(EXEEXT): $(handler_OBJECTS) $(handler_DEPENDENCIES) $(EXTRA_handler_DEPENDENCIES) @rm -f handler$(EXEEXT) $(AM_V_CCLD)$(LINK) $(handler_OBJECTS) $(handler_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/event.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/handler.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/event.Po -rm -f ./$(DEPDIR)/handler.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/event.Po -rm -f ./$(DEPDIR)/handler.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/oneway/README.txt0000644000175000017500000001576213525245163020062 0ustar ellertellert C-style eventing client and event handler server. Events are one-way SOAP messages using HTTP keep-alive for persistent connections. This example illustrates one-way message exchange patterns (MEP) between a client and server, each with C and C++ implementations. samples/event: event.c C-based client handler.c C-based multithreaded server (uses Pthreads) samples/event++: event.cpp C++-based client handler.cpp C++-based server (uses simple iterative server) For HTTP communications events are not truly one-way, since HTTP Accept or OK responses are expected to be returned to the client. Thus, this is a form of synchronous communication with rendezvous. The code also supports true one-way messaging, by setting the global flag synchronous = 0. Note that all send operations may or may not block. Receive operations always block. All four files are built with the web service definitions given in the gSOAP header file event.h. The event.h file is processed with soapcpp2 as follows: Compilation in C: soapcpp2 -c event.h cc -o event event.c stdsoap2.c soapC.c soapClient.c cc -o handler handler.c stdsoap2.c soapC.c soapServer.c Compilation in C++: soapcpp2 -i event.h cc -o event++ event.cpp stdsoap2.cpp soapC.cpp soapEventProxy.cpp cc -o handler++ handler.cpp stdsoap2.cpp soapC.cpp soapEventService.cpp soap EventProxy.cpp The C client-side uses: Initialization of the runtime engine: soap_init(struct soap*) soap_init2(struct soap*, soap_mode input_modes, soap_mode output_modes) Sending an event to the handler, this function is generated by soapcpp2: soap_send_ns__handle(struct soap*, const char *endpoint, const char *action, enum ns__event event) Note: pass endpoint=NULL and action=NULL for defaults To accept an HTTP Accept or OK message (ack): soap_recv_empty_response(struct soap*) Receiving an event from the handler, this function is generated by soapcpp2: soap_recv_ns__handle(struct soap*, struct ns__handle*) Set and reset HTTP keep-alive connections (optional): soap_set_omode(soap, SOAP_IO_KEEPALIVE) soap_clr_omode(soap, SOAP_IO_KEEPALIVE) Close the socket (to end a keep-alive session) soap_closesocket(struct soap*) Print communication errors: soap_print_fault(struct soap*, FILE*) Allocate data, which stays alive until deallocated by soap_end() soap_malloc(struct soap*, size_t len) Delete deserialized data: soap_end(struct soap*) Finalize and detach the runtime engine: soap_done(struct soap*) The multi-threaded C server-side uses: Initialization of the runtime engine: soap_init(struct soap*) soap_init2(struct soap*, soap_mode input_modes, soap_mode output_modes) Binding the port: soap_bind(struct soap*, const char *host, int port, int backlog) Accepting a request: soap_accept(struct soap*); Invoking the service dispatcher, this function is generated by soapcpp2: soap_serve(struct soap*) Print communication errors: soap_print_fault(struct soap*, FILE*) Allocate data, which stays alive until deallocated by soap_end() soap_malloc(struct soap*, size_t len) Delete deserialized data: soap_end(struct soap*) Send back sender-related fault: soap_sender_fault(struct soap*, const char *string, const char *detailXML) Send back receiver-related fault: soap_receiver_fault(struct soap*, const char *string, const char *detailXML) Make a copy of the current runtime engine: soap_copy(struct soap*) Finalize and detach the runtime engine: soap_done(struct soap*) Finalize, detach, and delete the runtime engine: soap_free(struct soap*) Service operation is not auto-generated (user-defined): ns__handle(struct soap*, enum ns__event *event); Sending an event to the client, this function is generated by soapcpp2: soap_send_ns__handle(struct soap*, const char *endpoint, const char *action, enum ns__event event) where we use endpoint = "http://" to send message over current socket The C++ client-side uses a proxy generated with soapcpp2 -i: class EventProxy Constructor EventProxy(soap_mode input_output_modes) The default endpoint can be changed: const char *EventProxxy::endpoint Invoke a call of xyz: EventProxy::xyz(double a, double b, double *result) Print communication errors: EventProxy::soap_stream_fault(std::ostream&) Error code (see list of error codes in documentation and stdsoap2.h): EventProxy::error Allocate data, deallocated by soap_end() or EventService destructor soap_malloc(EventService*, size_t len) Get new instance of class X, deallocated by soap_destroy() or EventService destructor soap_new_X(EventService*, -1) Get array of new instances of class X, deallocated by soap_destroy() or EventService destructor soap_new_X(EventService*, arraylen) Delete deserialized C++ class instances (also part of EventService destructor): soap_destroy(EventService*) Delete deserialized data (also part of EventService destructor): soap_end(EventService*) The C++ server-side uses the server and proxy classes generated with soapcpp2 option -i. A proxy instance is needed for the one-way send operation. Create a serivce copy for new thread EventService::copy() Bind port EventService::bind(const char *host, int port, int backlog) Accept and set socket EventService::accept() Serve requests over current socket EventService::serve() Print communication errors: EventService::soap_stream_fault(std::ostream&) Error code (see list of error codes in documentation and stdsoap2.h): EventService::error Send back sender-related fault: EventService::soap_senderfault(const char *string, const char *detailXML) Send back sender-related fault with subcode (SOAP 1.2): EventService::soap_senderfault(const char *subcodeQName, const char *string, const char *detailXML) Send back receiver-related fault: EventService::soap_receiverfault(const char *string, const char *detailXML) Send back receiver-related fault with subcode (SOAP 1.2): EventService::soap_receiverfault(const char *subcodeQName, const char *string, const char *detailXML) Service operations are user-defined (not auto-generated): EventService::handle(enum ns__event *event) Allocate data, deallocated by soap_end() or EventService destructor soap_malloc(EventService*, size_t len) Get new instance of class X, deallocated by soap_destroy() or EventService destructor soap_new_X(EventService*, -1) Get array of new instances of class X, deallocated by soap_destroy() or EventService destructor soap_new_X(EventService*, arraylen) Delete deserialized C++ class instances (also part of EventService destructor): soap_destroy(EventService*) Delete deserialized data (also part of EventService destructor): soap_end(EventService*) Note: all soap_xyz(struct soap*, ...) gSOAP API functions are also available to the EventProxy and EventService classes by inheritance of the struct soap runtime engine state object. gsoap-2.8.91/gsoap/samples/oneway/handler.c0000644000175000017500000001320313525245163020131 0ustar ellertellert/* handler.c Multi-threaded stand-alone event handler service Events are based on one-way SOAP messaging using HTTP keep-alive for persistent connections The 'synchronous' global flag illustrates SOAP one-way messaging, which requires an HTTP OK response with an empty body to be returned by the server. Copyright (C) 2000-2007 Robert A. van Engelen. All Rights Reserved. Compile: soapcpp2 -c event.h cc -o handler handler.c stdsoap2.c soapC.c soapService.c Run: handler 18000 & Server will time out after 24hr of inactivity This code enables keep-alive support which can cause "broken pipes" when the client prematurely closes the connection while indicating it wants the connection to stay alive. Broken pipes (SIGPIPE) can be fixed using MSG_NOSIGNAL, SO_NOSIGPIPE, or with a signal handler, but this is not very portable (see code below) -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "Event.nsmap" #include #if defined(_POSIX_THREADS) || defined(_SC_THREADS) #include // use Pthreads #endif #define BACKLOG (100) #define TIMEOUT (24*60*60) /* timeout after 24hrs of inactivity */ void *process_request(void*); int synchronous = 1; /* synchronous=0: asynchronous one-way messaging over HTTP (no HTTP response) */ /* synchronous=1: SOAP interoperable synchronous one-way messaging over HTTP */ int main(int argc, char **argv) { #if defined(_POSIX_THREADS) || defined(_SC_THREADS) pthread_t tid; struct soap *tsoap; #endif struct soap soap; int port; SOAP_SOCKET m, s; int i; if (argc < 2) { fprintf(stderr, "Usage: handler \n"); exit(1); } port = atoi(argv[1]); /* keep I/O alive and server timeout settings */ soap_init2(&soap, SOAP_IO_KEEPALIVE, SOAP_IO_KEEPALIVE | SOAP_XML_INDENT); soap.accept_timeout = TIMEOUT; soap.bind_flags |= SO_REUSEADDR; /* don't use this in unsecured environments */ /* soap.socket_flags = MSG_NOSIGNAL; */ /* use this to disable SIGPIPE */ /* soap.bind_flags |= SO_NOSIGPIPE; */ /* or use this to disable SIGPIPE */ m = soap_bind(&soap, NULL, port, BACKLOG); if (!soap_valid_socket(m)) { soap_print_fault(&soap, stderr); exit(1); } fprintf(stderr, "Socket connection successful %d\n", m); for (i = 1; ; i++) { s = soap_accept(&soap); if (!soap_valid_socket(s)) { if (soap.errnum) soap_print_fault(&soap, stderr); else fprintf(stderr, "%s timed out\n", argv[0]); /* should really wait for threads to terminate, but 24hr timeout should be enough ... */ break; } fprintf(stderr, "Thread %d accepts socket %d connection from IP %d.%d.%d.%d\n", i, s, (int)(soap.ip>>24)&0xFF, (int)(soap.ip>>16)&0xFF, (int)(soap.ip>>8)&0xFF, (int)soap.ip&0xFF); #if defined(_POSIX_THREADS) || defined(_SC_THREADS) tsoap = soap_copy(&soap); pthread_create(&tid, NULL, (void*(*)(void*))process_request, (void*)tsoap); #else soap_serve(&soap); soap_destroy(&soap); soap_end(&soap); #endif } return 0; } void *process_request(void *soap) { struct soap *tsoap = (struct soap*)soap; #if defined(_POSIX_THREADS) || defined(_SC_THREADS) pthread_detach(pthread_self()); #endif soap_serve(tsoap); soap_destroy(tsoap); soap_end(tsoap); soap_free(tsoap); return NULL; } int ns__handle(struct soap *soap, enum ns__event event) { switch (event) { /* each event is just consumed without server response */ case EVENT_A: fprintf(stderr, "Server Received Event: A\n"); break; case EVENT_B: fprintf(stderr, "Server Received Event: B\n"); break; case EVENT_C: fprintf(stderr, "Server Received Event: C\n"); break; /* after receiving event Z, we echo events A to C back to the client */ case EVENT_Z: fprintf(stderr, "Server Received Event: Z\n"); { struct soap *resp = soap_copy(soap); /* these multiple sends assume that the client enabled keep-alive */ fprintf(stderr, "Server Sends Event: A\n"); soap_send_ns__handle(resp, "http://", NULL, EVENT_A); fprintf(stderr, "Server Sends Event: B\n"); soap_send_ns__handle(resp, "http://", NULL, EVENT_B); fprintf(stderr, "Server Sends Event: C\n"); soap_send_ns__handle(resp, "http://", NULL, EVENT_C); soap_end(resp); soap_free(resp); } } if (event != EVENT_Z && synchronous) return soap_send_empty_response(soap, SOAP_OK); /* HTTP 202 Accepted */ return SOAP_OK; } gsoap-2.8.91/gsoap/samples/oneway/event.c0000644000175000017500000001142713525245163017643 0ustar ellertellert/* event.c C-style eventing client Events are based on one-way SOAP messaging using HTTP keep-alive for persistent connections. The 'synchronous' global flag illustrates SOAP one-way messaging, which requires an HTTP OK or HTTP Accept response with an empty body to be returned by the server. Copyright (C) 2000-2002 Robert A. van Engelen. All Rights Reserved. Compile: soapcpp2 -c event.h cc -o event event.c stdsoap2.c soapC.c soapClient.c Run (first start the event handler on localhost port 18000): event -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "Event.nsmap" int synchronous = 1; /* synchronous=0: asynchronous one-way messaging over HTTP (no HTTP response) */ /* synchronous=1: SOAP interoperable synchronous one-way messaging over HTTP */ /* Service details (copied from event.h): */ const char *event_handler_endpoint = "http://localhost:18000"; const char *event_handler_action = "event"; int main() { struct soap soap; soap_init2(&soap, SOAP_IO_KEEPALIVE, SOAP_IO_KEEPALIVE | SOAP_XML_INDENT); /* Events A to C do not generate a response from the server */ fprintf(stderr, "Client Sends Event: A\n"); if (soap_send_ns__handle(&soap, event_handler_endpoint, event_handler_action, EVENT_A)) soap_print_fault(&soap, stderr); if (synchronous && soap_recv_empty_response(&soap)) soap_print_fault(&soap, stderr); fprintf(stderr, "Client Sends Event: B\n"); if (soap_send_ns__handle(&soap, event_handler_endpoint, event_handler_action, EVENT_B)) soap_print_fault(&soap, stderr); if (synchronous && soap_recv_empty_response(&soap)) soap_print_fault(&soap, stderr); /* reset keep-alive when client needs to inform the server that it will close the connection. It may reconnect later */ soap_clr_omode(&soap, SOAP_IO_KEEPALIVE); fprintf(stderr, "Client Sends Event: C\n"); if (soap_send_ns__handle(&soap, event_handler_endpoint, event_handler_action, EVENT_C)) soap_print_fault(&soap, stderr); if (synchronous && soap_recv_empty_response(&soap)) soap_print_fault(&soap, stderr); /* close the socket */ soap_closesock(&soap); /* re-enable keep-alive which is required to accept and execute multiple receives */ soap_set_omode(&soap, SOAP_IO_KEEPALIVE); /* Events Z generates a series of response from the server */ fprintf(stderr, "Client Sends Event: Z\n"); if (soap_send_ns__handle(&soap, event_handler_endpoint, event_handler_action, EVENT_Z)) soap_print_fault(&soap, stderr); else { struct ns__handle response; for (;;) { if (!soap_valid_socket(soap.socket)) { fprintf(stderr, "Connection was terminated (keep alive disabled?)\n"); break; } if (soap_recv_ns__handle(&soap, &response)) { if (soap.error == SOAP_EOF) fprintf(stderr, "Connection was gracefully closed by server\n"); else soap_print_fault(&soap, stderr); break; } else { switch (response.event) { case EVENT_A: fprintf(stderr, "Client Received Event: A\n"); break; case EVENT_B: fprintf(stderr, "Client Received Event: B\n"); break; case EVENT_C: fprintf(stderr, "Client Received Event: C\n"); break; case EVENT_Z: fprintf(stderr, "Client Received Event: Z\n"); break; } } } } soap_closesock(&soap); /* EVENT_Z has no HTTP response (fire and forget), so close the socket */ soap_destroy(&soap); soap_end(&soap); soap_done(&soap); /* detach environment (also closes sockets even with keep-alive) */ return 0; } gsoap-2.8.91/gsoap/samples/oneway/Makefile.am0000644000175000017500000000114113525245163020402 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = event handler SOAPHEADER = event.h include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = Event.nsmap Event.wsdl event_SOURCES = event.c $(SOAPHEADER) $(SOAP_C_CLIENT) event_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) handler_SOURCES = handler.c $(SOAPHEADER) $(SOAP_C_SRC) handler_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) -lpthread gsoap-2.8.91/gsoap/samples/calc++/0000755000175000017500000000000013525245170016075 5ustar ellertellertgsoap-2.8.91/gsoap/samples/calc++/.deps/0000755000175000017500000000000013525245170017106 5ustar ellertellertgsoap-2.8.91/gsoap/samples/calc++/Makefile.in0000644000175000017500000005147713525245170020160 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = calcclient$(EXEEXT) calcserver$(EXEEXT) subdir = gsoap/samples/calc++ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am_calcclient_OBJECTS = calcclient.$(OBJEXT) $(am__objects_1) \ $(am__objects_2) soapcalcProxy.$(OBJEXT) calcclient_OBJECTS = $(am_calcclient_OBJECTS) am__DEPENDENCIES_1 = calcclient_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) am_calcserver_OBJECTS = calcserver.$(OBJEXT) $(am__objects_1) \ $(am__objects_2) soapcalcService.$(OBJEXT) calcserver_OBJECTS = $(am_calcserver_OBJECTS) calcserver_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/calcclient.Po \ ./$(DEPDIR)/calcserver.Po ./$(DEPDIR)/soapC.Po \ ./$(DEPDIR)/soapcalcProxy.Po ./$(DEPDIR)/soapcalcService.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(calcclient_SOURCES) $(calcserver_SOURCES) DIST_SOURCES = $(calcclient_SOURCES) $(calcserver_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.cpp_proxy_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = calc.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_CPP_SRC = $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_CPP_SRC) CLEANFILES = $(SOAP_CPP_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.cpp soap*Proxy.h soap*Proxy.cpp soap*Object.h soap*Service.h soap*Service.cpp soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp *~ SOAP_NS = calc.nsmap calc.wsdl calcclient_SOURCES = calcclient.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) soapcalcProxy.cpp calcclient_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) calcserver_SOURCES = calcserver.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) soapcalcService.cpp calcserver_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) -lm all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_proxy_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/calc++/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/calc++/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.cpp_proxy_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) calcclient$(EXEEXT): $(calcclient_OBJECTS) $(calcclient_DEPENDENCIES) $(EXTRA_calcclient_DEPENDENCIES) @rm -f calcclient$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(calcclient_OBJECTS) $(calcclient_LDADD) $(LIBS) calcserver$(EXEEXT): $(calcserver_OBJECTS) $(calcserver_DEPENDENCIES) $(EXTRA_calcserver_DEPENDENCIES) @rm -f calcserver$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(calcserver_OBJECTS) $(calcserver_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/calcclient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/calcserver.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapcalcProxy.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapcalcService.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/calcclient.Po -rm -f ./$(DEPDIR)/calcserver.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapcalcProxy.Po -rm -f ./$(DEPDIR)/soapcalcService.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/calcclient.Po -rm -f ./$(DEPDIR)/calcserver.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapcalcProxy.Po -rm -f ./$(DEPDIR)/soapcalcService.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) -i -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $< # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/calc++/README.txt0000644000175000017500000001333713525245162017603 0ustar ellertellertSimple calculator service implements: add(a,b) sub(a,b) mul(a,b) div(a,b) pow(a,b) Compilation in C (see samples/calc): soapcpp2 -c calc.h cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c Compilation in C++ (see samples/calc++): soapcpp2 -i calc.h cc -o calcclient++ calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp cc -o calcserver++ calcserver.cpp stdsoap2.cpp soapC.cpp soapcalcService.cpp For C++ development soapcpp2 option -i generates proxy and service classes, which encapsulate the method operations in the class instead of defining them as global functions as in C. The calcclient application invokes the service and is used from the command line as follows: $ calcclient add 3 4 result = 7 The calcserver application is a CGI application that can be installed under the cgibin of your Web server. The C client-side uses: Initialization of the runtime engine: soap_init(struct soap*) Invoking a call of xyz, this function is generated by soapcpp2: soap_call_ns__xyz(struct soap*, const char *endpoint, const char *action, double a, double b, double *result) Note: endpoint=NULL and action=NULL for defaults Print communication errors: soap_print_fault(struct soap*, FILE*) Allocate data, which stays alive until deallocated by soap_end() soap_malloc(struct soap*, size_t len) Delete deserialized data: soap_end(struct soap*) Finalize and detach the runtime engine: soap_done(struct soap*) The C server-side uses: Initialization of the runtime engine: soap_init(struct soap*) Binding the port: soap_bind(struct soap*, const char *host, int port, int backlog) Accepting a request: soap_accept(struct soap*); Invoking the service dispatcher, this function is generated by soapcpp2: soap_serve(struct soap*) Print communication errors: soap_print_fault(struct soap*, FILE*) Allocate data, which stays alive until deallocated by soap_end() soap_malloc(struct soap*, size_t len) Delete deserialized data: soap_end(struct soap*) Send back sender-related fault: soap_sender_fault(struct soap*, const char *string, const char *detailXML) Send back receiver-related fault: soap_receiver_fault(struct soap*, const char *string, const char *detailXML) Finalize and detach the runtime engine: soap_done(struct soap*) Service operations are not auto-generated (user-defined): ns__add(struct soap*, double a, double b, double *result) ns__sub(struct soap*, double a, double b, double *result) ns__mul(struct soap*, double a, double b, double *result) ns__div(struct soap*, double a, double b, double *result) ns__pow(struct soap*, double a, double b, double *result) The C++ client-side uses a proxy generated with soapcpp2 -i: class calcProxy The default endpoint can be changed: const char *calcProxxy::endpoint Invoke a call of xyz: calcProxy::xyz(double a, double b, double *result) Print communication errors: calcProxy::soap_stream_fault(std::ostream&) Error code (see list of error codes in documentation and stdsoap2.h): calcProxy::error Allocate data, deallocated by soap_end() or calcProxy destructor soap_malloc(calcProxy*, size_t len) Get new instance of class X, deallocated by soap_destroy() or calcProxy destructor soap_new_X(calcProxy*, -1) Get array of new instances of class X, deallocated by soap_destroy() or calcProxy destructor soap_new_X(calcProxy*, arraylen) Delete deserialized C++ class instances (also part of calcProxy destructor): soap_destroy(calcProxy*) Delete deserialized data (also part of calcProxy destructor): soap_end(calcProxy*) The C++ server-side uses a class generated with soapcpp2 -i: class calcService Serve requests over stdin/out (for CGI) calcService::serve() Serve multiple requests over port (iterative HTTP server): calcService::run() Print communication errors: calcService::soap_stream_fault(std::ostream&) Error code (see list of error codes in documentation and stdsoap2.h): calcService::error Send back sender-related fault: calcService::soap_senderfault(const char *string, const char *detailXML) Send back sender-related fault with subcode (SOAP 1.2): calcService::soap_senderfault(const char *subcodeQName, const char *string, const char *detailXML) Send back receiver-related fault: calcService::soap_receiver_fault(const char *string, const char *detailXML) Send back receiver-related fault with subcode (SOAP 1.2): calcService::soap_receiver_fault(const char *subcodeQName, const char *string, const char *detailXML) Service operations are user-defined (not auto-generated): calcService::add(double a, double b, double *result) calcService::sub(double a, double b, double *result) calcService::mul(double a, double b, double *result) calcService::div(double a, double b, double *result) calcService::pow(double a, double b, double *result) Allocate data, deallocated by soap_end() or calcService destructor soap_malloc(calcService*, size_t len) Get new instance of class X, deallocated by soap_destroy() or calcService destructor soap_new_X(calcService*, -1) Get array of new instances of class X, deallocated by soap_destroy() or calcService destructor soap_new_X(calcService*, arraylen) Delete deserialized C++ class instances (also part of calcService destructor): soap_destroy(calcService*) Delete deserialized data (also part of calcService destructor): soap_end(calcService*) Note: all soap_xyz(struct soap*, ...) gSOAP API functions are also available to the calcProxy and calcService classes by inheritance of the struct soap runtime engine state object. gsoap-2.8.91/gsoap/samples/calc++/calc.h0000644000175000017500000001054613525245162017157 0ustar ellertellert/* calc.h This is a gSOAP header file with a calculator data binding and Web service interface to implement clients and services The service operations and type definitions use familiar C/C++ syntax. The following methods are defined by this gSOAP service definition: add(a,b) sub(a,b) mul(a,b) div(a,b) pow(a,b) Build steps for C (see samples/calc): $ soapcpp2 -c -r calc.h $ cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c $ cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c Build steps for C++ (see samples/calc++): $ soapcpp2 -j -r calc.h $ c++ -o calcclient++ calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp $ c++ -o calcserver++ calcserver.cpp stdsoap2.cpp soapC.cpp soapcalcService.cpp Option -r generates a soapReadme.md report. Note that soapcpp2 option -j generates proxy and service classes, which encapsulate the method operations in the class instead of defining them as global functions as in C. The //gsoap directives are used to bind XML namespaces and to define Web service properties: //gsoap service name: //gsoap service style: [rpc|document] //gsoap service encoding: [literal|encoded] //gsoap service namespace: //gsoap service location: Web service operation properties: //gsoap service method-style: [rpc|document] //gsoap service method-encoding: [literal|encoded] //gsoap service method-action: //gsoap service method-documentation: and type schema properties: //gsoap schema namespace: //gsoap schema elementForm: [qualified|unqualified] //gsoap schema attributeForm: [qualified|unqualified] //gsoap schema documentation: //gsoap schema type-documentation: where is an XML namespace prefix, which is used in C/C++ operation names, e.g. ns__add(), and type names, e.g. xsd__int. See the documentation for the full list of //gsoap directives. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap ns service name: calc Simple calculator service described at https://www.genivia.com/dev.html //gsoap ns service protocol: SOAP //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns schema namespace: urn:calc //gsoap ns service method: add Sums two values int ns__add(double a, double b, double *result); //gsoap ns service method: sub Subtracts two values int ns__sub(double a, double b, double *result); //gsoap ns service method: mul Multiplies two values int ns__mul(double a, double b, double *result); //gsoap ns service method: div Divides two values int ns__div(double a, double b, double *result); //gsoap ns service method: pow Raises a to b int ns__pow(double a, double b, double *result); gsoap-2.8.91/gsoap/samples/calc++/Makefile.am0000644000175000017500000000125713525245162020137 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = calcclient calcserver SOAPHEADER = calc.h include ../Makefile.defines include ../Makefile.cpp_proxy_rules SOAP_NS = calc.nsmap calc.wsdl calcclient_SOURCES = calcclient.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) soapcalcProxy.cpp calcclient_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) calcserver_SOURCES = calcserver.cpp $(SOAPHEADER) $(SOAP_CPP_CORE) soapcalcService.cpp calcserver_LDADD = $(SOAP_CPP_LIB) $(SAMPLE_EXTRA_LIBS) -lm gsoap-2.8.91/gsoap/samples/calc++/calcclient.cpp0000644000175000017500000000520013525245162020700 0ustar ellertellert/* calcclient.cpp Example calculator service client in C++ Service definitions in calc.h (not generated by wsdl2h, but similar) $ soapcpp2 -i calc.h $ c++ -o calcclient calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp where stdsoap2.cpp is in the 'gsoap' directory, or use libgsoap++: $ c++ -o calcclient calcclient.cpp soapC.cpp soapcalcProxy.cpp -lgsoap++ -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapcalcProxy.h" #include "calc.nsmap" const char server[] = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; int main(int argc, char **argv) { if (argc < 4) { fprintf(stderr, "Usage: [add|sub|mul|div|pow] num num\n"); exit(0); } double a, b, result; a = strtod(argv[2], NULL); b = strtod(argv[3], NULL); calcProxy calc; calc.soap_endpoint = server; switch (*argv[1]) { case 'a': calc.add(a, b, &result); break; case 's': calc.sub(a, b, &result); break; case 'm': calc.mul(a, b, &result); break; case 'd': calc.div(a, b, &result); break; case 'p': calc.pow(a, b, &result); break; default: fprintf(stderr, "Unknown command\n"); exit(0); } if (calc.error) calc.soap_stream_fault(std::cerr); else printf("result = %g\n", result); calc.destroy(); /* clean up mem */ return 0; } gsoap-2.8.91/gsoap/samples/calc++/calcserver.cpp0000644000175000017500000000622713525245162020742 0ustar ellertellert/* calcserver.cpp Example calculator service in C++ $ soapcpp2 -i calc.h $ c++ -o calcserver++ calcserver.cpp stdsoap2.cpp soapC.cpp soapcalcService.cpp where stdsoap2.cpp is in the 'gsoap' directory, or use libgsoap++: $ c++ -o calcserver++ calcserver.cpp soapC.cpp soapcalcService.cpp -lgsoap++ -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapcalcService.h" #include "calc.nsmap" int main(int argc, char **argv) { calcService calc; if (argc < 2) calc.serve(); /* serve as CGI application */ else { int port = atoi(argv[1]); if (!port) { fprintf(stderr, "Usage: calcserver++ \n"); exit(0); } /* run iterative server on port until fatal error */ if (calc.run(port)) { calc.soap_stream_fault(std::cerr); exit(1); } } return 0; } int calcService::add(double a, double b, double *result) { *result = a + b; return SOAP_OK; } int calcService::sub(double a, double b, double *result) { *result = a - b; return SOAP_OK; } int calcService::mul(double a, double b, double *result) { *result = a * b; return SOAP_OK; } int calcService::div(double a, double b, double *result) { if (b) *result = a / b; else { char *s = (char*)soap_malloc(this, 1024); (SOAP_SNPRINTF(s, 1024, 100), "Can't divide %f by %f", a, b); return soap_senderfault("Division by zero", s); } return SOAP_OK; } int calcService::pow(double a, double b, double *result) { *result = ::pow(a, b); if (soap_errno == EDOM) /* soap_errno is like errno, but compatible with Win32 */ { char *s = (char*)soap_malloc(this, 1024); (SOAP_SNPRINTF(s, 1024, 100), "Can't take power of %f to %f", a, b); return soap_senderfault("Power function domain error", s); } return SOAP_OK; } gsoap-2.8.91/gsoap/samples/mtom/0000755000175000017500000000000013525245200016013 5ustar ellertellertgsoap-2.8.91/gsoap/samples/mtom/.deps/0000755000175000017500000000000013525245200017024 5ustar ellertellertgsoap-2.8.91/gsoap/samples/mtom/Makefile.in0000644000175000017500000004662513525245163020105 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = mtom$(EXEEXT) subdir = gsoap/samples/mtom ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am__objects_2 = soapC.$(OBJEXT) am__objects_3 = soapClient.$(OBJEXT) $(am__objects_2) am__objects_4 = $(am__objects_3) soapServer.$(OBJEXT) $(am__objects_1) \ $(am__objects_1) am_mtom_OBJECTS = mtom-test.$(OBJEXT) $(am__objects_1) \ $(am__objects_4) mtom_OBJECTS = $(am_mtom_OBJECTS) am__DEPENDENCIES_1 = mtom_DEPENDENCIES = $(SOAP_C_LIB) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/mtom-test.Po ./$(DEPDIR)/soapC.Po \ ./$(DEPDIR)/soapClient.Po ./$(DEPDIR)/soapServer.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(mtom_SOURCES) DIST_SOURCES = $(mtom_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.c_rules \ $(srcdir)/../Makefile.defines $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = $(SAMPLE_INCLUDES) -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin $(SOAPCPP2_NO_C_LOCALE) CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ####### This is the input file for automake, which will generate Makefile.in ########## AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SOAPHEADER = mtom-test.h AM_CFLAGS = -D$(platform) AM_CXXFLAGS = -D$(platform) SOAP = $(top_srcdir)/gsoap/src/soapcpp2 SOAP_NS_DEF = ns.nsmap ns.wsdl SOAP_H_FILES = soapH.h soapStub.h SOAP_C_CORE = soapC.c SOAP_C_CLIENT = soapClient.c $(SOAP_C_CORE) SOAP_C_SERVER = soapServer.c $(SOAP_C_CORE) SOAP_C_LIB = $(top_builddir)/gsoap/libgsoap.a SOAP_C_LIB_CK = $(top_builddir)/gsoap/libgsoapck.a SOAP_C_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl.a SOAP_CPP_CORE = soapC.cpp SOAP_CPP_CLIENT = soapClient.cpp $(SOAP_CPP_CORE) SOAP_CPP_SERVER = soapServer.cpp $(SOAP_CPP_CORE) SOAP_CPP_LIB = $(top_builddir)/gsoap/libgsoap++.a SOAP_CPP_LIB_CK = $(top_builddir)/gsoap/libgsoapck++.a SOAP_CPP_LIB_SSL = $(top_builddir)/gsoap/libgsoapssl++.a SOAP_C_SRC = $(SOAP_C_CLIENT) soapServer.c $(SOAP_H_FILES) $(SOAP_NS) LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) BUILT_SOURCES = $(SOAP_C_SRC) CLEANFILES = $(SOAP_C_SRC) *.req.xml *.res.xml *.nsmap *.xsd soapStub.h soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c *~ SOAP_NS = mtom_test.nsmap mtom_test.wsdl mtom_SOURCES = mtom-test.c $(SOAPHEADER) $(SOAP_C_SRC) mtom_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/samples/mtom/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/samples/mtom/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.defines $(srcdir)/../Makefile.c_rules $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) mtom$(EXEEXT): $(mtom_OBJECTS) $(mtom_DEPENDENCIES) $(EXTRA_mtom_DEPENDENCIES) @rm -f mtom$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mtom_OBJECTS) $(mtom_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mtom-test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapClient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapServer.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/mtom-test.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/mtom-test.Po -rm -f ./$(DEPDIR)/soapC.Po -rm -f ./$(DEPDIR)/soapClient.Po -rm -f ./$(DEPDIR)/soapServer.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile $(SOAP_C_SRC) : $(SOAPHEADER) $(SOAP) -cL -I$(top_srcdir)/gsoap/import:$(top_srcdir)/gsoap $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/samples/mtom/README.txt0000644000175000017500000000042713525245163017524 0ustar ellertellertMTOM attachment processing example. This application is a server and client to demonstate MTOM attachment handling. The application runs as a simple CGI server, stand-alone Web server on a port, or a test client application to test multiple MTOM attachment handling features. gsoap-2.8.91/gsoap/samples/mtom/mtom-test.c0000644000175000017500000003217513525245163020130 0ustar ellertellert/* mtom-test.c This application includes a MTOM test client and server. As a client application, it fires four different base64 or MTOM attachments to the server. As a server, it will respond to the messages by converting base64 into MTOM attachments and vice versa. Usage (server): $ mtom Usage (client): $ mtom http://localhost: "" "" "" ... -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapH.h" #include "mtom_test.nsmap" int cgi_serve(); int run_serve(int port); int run_tests(int, char**); int main(int argc, char **argv) { if (argc < 2) return cgi_serve(); if (argc < 3) return run_serve(atoi(argv[1])); return run_tests(argc, argv); } int cgi_serve() { /* CGI-style: serve request from stdin */ /* enable MTOM XOP attachments (and XML indent) */ return soap_serve(soap_new1(SOAP_XML_INDENT | SOAP_ENC_MTOM)); } int run_serve(int port) { struct soap *soap = soap_new1(SOAP_ENC_MTOM); /* enable MTOM */ int ret; if (!soap_valid_socket(soap_bind(soap, NULL, port, 100))) soap_print_fault(soap, stderr); else { fprintf(stderr, "Bind to port %d successful\n", port); soap->accept_timeout = 3600; /* let server time out after one hour */ for (;;) { int sock = soap_accept(soap); if (!soap_valid_socket(sock)) { if (soap->errnum) soap_print_fault(soap, stderr); else fprintf(stderr, "Server timed out\n"); break; } fprintf(stderr, "Accepting socket %d connection from IP %d.%d.%d.%d... ", sock, (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF); if (soap_serve(soap)) soap_print_fault(soap, stderr); fprintf(stderr, "done\n"); soap_destroy(soap); soap_end(soap); } } ret = soap->error; soap_free(soap); /* done and free */ return ret; } int run_tests(int argc, char **argv) { struct soap *soap = soap_new1(SOAP_ENC_MTOM); /* enable MTOM */ int i, ret; struct x__DataType data; struct x__WrapperType wrap; struct m__EchoTestSingleResponse single; struct m__EchoTestMultipleResponse multiple; soap_default_x__DataType(soap, &data); soap_default_x__WrapperType(soap, &wrap); /* First test call */ data.__union = SOAP_UNION_x__data_base64; data.choice.base64.__ptr = (unsigned char*)argv[2]; data.choice.base64.__size = (int)strlen(argv[2]) + 1; if (soap_call_m__EchoTestSingle(soap, argv[1], NULL, &data, &single)) { soap_print_fault(soap, stderr); } else { if (!single.x__Data || single.x__Data->__union != SOAP_UNION_x__data_xop__Include || !single.x__Data->choice.xop__Include.__ptr || single.x__Data->choice.xop__Include.__size != data.choice.base64.__size || strcmp((char*)single.x__Data->choice.xop__Include.__ptr, (char*)data.choice.base64.__ptr)) fprintf(stderr, "EchoTestSingle 1: data transcription error\n"); else fprintf(stderr, "EchoTestSingle 1: OK\n"); /* Second test call */ data.__union = SOAP_UNION_x__data_xop__Include; data.choice.xop__Include.__ptr = (unsigned char*)argv[2]; data.choice.xop__Include.__size = (int)strlen(argv[2]) + 1; data.choice.xop__Include.id = NULL; data.choice.xop__Include.type = "text/xml"; data.choice.xop__Include.options = NULL; data.xmime5__contentType = "text/xml"; #ifdef WITH_NOIDREF /* compiling with WITH_NOIDREF removes auto-detection of attachments */ soap_set_mime(soap, NULL, NULL); /* so we explicitly set MIME attachments */ #endif if (soap_call_m__EchoTestSingle(soap, argv[1], NULL, &data, &single)) { soap_print_fault(soap, stderr); } else { if (!single.x__Data || single.x__Data->__union != SOAP_UNION_x__data_base64 || !single.x__Data->choice.base64.__ptr || single.x__Data->choice.base64.__size != data.choice.xop__Include.__size || strcmp((char*)single.x__Data->choice.base64.__ptr, (char*)data.choice.xop__Include.__ptr)) fprintf(stderr, "EchoTestSingle 2: data transcription error\n"); else { fprintf(stderr, "EchoTestSingle 2: OK\n"); /* Third test call */ wrap.__size = argc - 2; wrap.Data = (struct x__DataType*)soap_malloc(soap, wrap.__size * sizeof(struct x__DataType)); for (i = 0; i < wrap.__size; ++i) { soap_default_x__DataType(soap, &wrap.Data[i]); wrap.Data[i].__union = SOAP_UNION_x__data_base64; wrap.Data[i].choice.base64.__ptr = (unsigned char*)argv[i + 2]; wrap.Data[i].choice.base64.__size = (int)strlen(argv[i + 2]) + 1; wrap.Data[i].xmime5__contentType = "text/xml"; } if (soap_call_m__EchoTestMultiple(soap, argv[1], NULL, &wrap, &multiple)) soap_print_fault(soap, stderr); else { int okay = 1; if (!multiple.x__EchoTest || multiple.x__EchoTest->__size != wrap.__size) okay = 0; else { for (i = 0; i < multiple.x__EchoTest->__size; ++i) if (multiple.x__EchoTest->Data[i].__union != SOAP_UNION_x__data_xop__Include || !multiple.x__EchoTest->Data[i].choice.xop__Include.__ptr || multiple.x__EchoTest->Data[i].choice.xop__Include.__size != wrap.Data[i].choice.base64.__size || strcmp((char*)multiple.x__EchoTest->Data[i].choice.xop__Include.__ptr, (char*)wrap.Data[i].choice.base64.__ptr)) okay = 0; } if (!okay) fprintf(stderr, "EchoTestMultiple 1: data transcription error\n"); else { fprintf(stderr, "EchoTestMultiple 1: OK\n"); /* Fourth test call */ for (i = 0; i < wrap.__size; ++i) { soap_default_x__DataType(soap, &wrap.Data[i]); wrap.Data[i].__union = SOAP_UNION_x__data_xop__Include; wrap.Data[i].choice.xop__Include.__ptr = (unsigned char*)argv[i + 2]; wrap.Data[i].choice.xop__Include.__size = (int)strlen(argv[i + 2]) + 1; wrap.Data[i].choice.xop__Include.id = NULL; wrap.Data[i].choice.xop__Include.type = "text/xml"; wrap.Data[i].choice.xop__Include.options = NULL; wrap.Data[i].xmime5__contentType = "text/xml"; } if (soap_call_m__EchoTestMultiple(soap, argv[1], NULL, &wrap, &multiple)) soap_print_fault(soap, stderr); else { int okay = 1; if (!multiple.x__EchoTest || multiple.x__EchoTest->__size != wrap.__size) okay = 0; else { for (i = 0; i < multiple.x__EchoTest->__size; ++i) if (multiple.x__EchoTest->Data[i].__union != SOAP_UNION_x__data_base64 || !multiple.x__EchoTest->Data[i].choice.base64.__ptr || multiple.x__EchoTest->Data[i].choice.base64.__size != wrap.Data[i].choice.xop__Include.__size || strcmp((char*)multiple.x__EchoTest->Data[i].choice.base64.__ptr, (char*)wrap.Data[i].choice.xop__Include.__ptr)) okay = 0; } if (!okay) fprintf(stderr, "EchoTestMultiple 2: data transcription error\n"); else fprintf(stderr, "EchoTestMultiple 2: OK\n"); } } } } } } ret = soap->error; soap_destroy(soap); soap_end(soap); soap_done(soap); free(soap); return ret; } int m__EchoTestSingle(struct soap *soap, struct x__DataType *data, struct m__EchoTestSingleResponse *response) { if (!data) { /* To return a fault in an MTOM attachment: soap_set_mode(soap, SOAP_ENC_MTOM | SOAP_ENC_MIME); */ return soap_sender_fault(soap, "No data", NULL); } /* allocate response */ response->x__Data = (struct x__DataType*)soap_malloc(soap, sizeof(struct x__DataType)); if (!response->x__Data) return SOAP_EOM; /* copy data into response, switching from base64 to MTOM and vice versa */ switch (data->__union) { case SOAP_UNION_x__data_xop__Include: /* convert MTOM attachment to base64Binary */ response->x__Data->__union = SOAP_UNION_x__data_base64; response->x__Data->choice.base64.__ptr = data->choice.xop__Include.__ptr; response->x__Data->choice.base64.__size = data->choice.xop__Include.__size; response->x__Data->xmime5__contentType = data->choice.xop__Include.type; break; case SOAP_UNION_x__data_base64: /* set MTOM/MIME attachments, if context is not already initialized with SOAP_ENC_MTOM */ soap_set_mode(soap, SOAP_ENC_MTOM | SOAP_ENC_MIME); /* convert base64Binary to MTOM attachment */ response->x__Data->__union = SOAP_UNION_x__data_xop__Include; response->x__Data->choice.xop__Include.__ptr = data->choice.base64.__ptr; response->x__Data->choice.xop__Include.__size = data->choice.base64.__size; response->x__Data->choice.xop__Include.id = NULL; response->x__Data->choice.xop__Include.type = data->xmime5__contentType; response->x__Data->choice.xop__Include.options = NULL; response->x__Data->xmime5__contentType = data->xmime5__contentType; #ifdef WITH_NOIDREF /* compiling with WITH_NOIDREF removes auto-detection of attachments */ soap_set_mime(soap, NULL, NULL); /* so we explicitly set MIME attachments */ #endif break; default: return soap_sender_fault(soap, "Wrong data format", NULL); } return SOAP_OK; } int m__EchoTestMultiple(struct soap *soap, struct x__WrapperType *x__EchoTest, struct m__EchoTestMultipleResponse *response) { int i; if (!x__EchoTest) return soap_sender_fault(soap, "No data", NULL); /* allocate response */ response->x__EchoTest = (struct x__WrapperType*)soap_malloc(soap, sizeof(struct x__WrapperType)); if (!response->x__EchoTest) return SOAP_EOM; response->x__EchoTest->__size = x__EchoTest->__size; response->x__EchoTest->Data = (struct x__DataType*)soap_malloc(soap, sizeof(struct x__DataType) * x__EchoTest->__size); if (!response->x__EchoTest->Data) return SOAP_EOM; /* copy data into response, switching from base64 to MTOM and vice versa */ for (i = 0; i < x__EchoTest->__size; ++i) { switch (x__EchoTest->Data[i].__union) { case SOAP_UNION_x__data_xop__Include: /* convert MTOM attachment to base64Binary */ response->x__EchoTest->Data[i].__union = SOAP_UNION_x__data_base64; response->x__EchoTest->Data[i].choice.base64.__ptr = x__EchoTest->Data[i].choice.xop__Include.__ptr; response->x__EchoTest->Data[i].choice.base64.__size = x__EchoTest->Data[i].choice.xop__Include.__size; response->x__EchoTest->Data[i].xmime5__contentType = x__EchoTest->Data[i].choice.xop__Include.type; break; case SOAP_UNION_x__data_base64: /* set MTOM/MIME attachments, if context is not already initialized with SOAP_ENC_MTOM */ soap_set_mode(soap, SOAP_ENC_MTOM | SOAP_ENC_MIME); /* set MTOM/MIME attachments */ /* convert base64Binary to MTOM attachment */ response->x__EchoTest->Data[i].__union = SOAP_UNION_x__data_xop__Include; response->x__EchoTest->Data[i].choice.xop__Include.__ptr = x__EchoTest->Data[i].choice.base64.__ptr; response->x__EchoTest->Data[i].choice.xop__Include.__size = x__EchoTest->Data[i].choice.base64.__size; response->x__EchoTest->Data[i].choice.xop__Include.id = NULL; response->x__EchoTest->Data[i].choice.xop__Include.type = x__EchoTest->Data[i].xmime5__contentType; response->x__EchoTest->Data[i].choice.xop__Include.options = NULL; response->x__EchoTest->Data[i].xmime5__contentType = x__EchoTest->Data[i].xmime5__contentType; #ifdef WITH_NOIDREF /* compiling with WITH_NOIDREF removes auto-detection of attachments */ soap_set_mime(soap, NULL, NULL); /* so we explicitly set MIME attachments */ #endif break; default: return soap_sender_fault(soap, "Wrong data format", NULL); } } return SOAP_OK; } gsoap-2.8.91/gsoap/samples/mtom/Makefile.am0000644000175000017500000000075513525245163020066 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 noinst_PROGRAMS = mtom SOAPHEADER = mtom-test.h include ../Makefile.defines include ../Makefile.c_rules SOAP_NS = mtom_test.nsmap mtom_test.wsdl mtom_SOURCES = mtom-test.c $(SOAPHEADER) $(SOAP_C_SRC) mtom_LDADD = $(SOAP_C_LIB) $(SAMPLE_EXTRA_LIBS) gsoap-2.8.91/gsoap/samples/mtom/mtom-test.h0000644000175000017500000000666513525245163020142 0ustar ellertellert/* mtom-test.h This application includes a MIME test client and server. As a client application, it fires four different base64 or MIME attachments to the server. As a server, it will respond to the messages by converting base64 into MIME attachments and vice versa. Usage (server): $ mtom-test Usage (client): $ mtom-test http://localhost: "" "" "" ... -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #import "soap12.h" #import "xop.h" #import "xmime5.h" //gsoap m service name: mtom_test //gsoap m service namespace: http://www.genivia.com/wsdl/mtom_test.wsdl //gsoap x schema namespace: http://www.genivia.com/schemas/mtom_test.xsd //gsoap x schema elementForm: qualified struct xsd__base64Binary { unsigned char *__ptr; int __size; }; //gsoap x schema type-documentation: DataType a union of an MIME attachment or a base64 binary data type struct x__DataType { int __union; union x__data { _xop__Include xop__Include; struct xsd__base64Binary base64; } choice; @char *xmime5__contentType; }; //gsoap x schema type-documentation: WrapperType wraps a sequence of data elements with MIME attachments or base64 binary data struct x__WrapperType { int __size; struct x__DataType *Data; }; /* m:EchoTestSingle has a single in/out attachment of text/xml */ //gsoap m service method-input-mime-type: EchoTestSingle text/xml //gsoap m service method-output-mime-type: EchoTestSingle text/xml //gsoap m service method-documentation: EchoTestSingle echo a single MIME attachment or base64 binary data element int m__EchoTestSingle( struct x__DataType *x__Data, struct m__EchoTestSingleResponse { struct x__DataType *x__Data; }* ); /* m:EchoTestSingle has at least two in/out attachments of any MIME type */ //gsoap m service method-mime-type: EchoTestMultiple */* //gsoap m service method-mime-type: EchoTestMultiple */* //gsoap m service method-documentation: EchoTestMultiple echo a sequence of MIME attachments or base64 binary data elements int m__EchoTestMultiple( struct x__WrapperType *x__EchoTest, struct m__EchoTestMultipleResponse { struct x__WrapperType *x__EchoTest; }* ); gsoap-2.8.91/gsoap/wsdl/0000755000175000017500000000000013525245164014355 5ustar ellertellertgsoap-2.8.91/gsoap/wsdl/imports.h0000644000175000017500000000340113525245163016220 0ustar ellertellert/* imports.h Common XSD types and externs for gSOAP header file import -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ template class std::vector; typedef char *xsd__anyURI, *xsd__ID, *xsd__NCName, *xsd__NMTOKEN, *xsd__NMTOKENS, *xsd__QName, *xsd__token, *xsd__string; typedef bool xsd__boolean; extern class std::ostream; extern class std::istream; #include "includes.h" extern class MapOfStringToString; extern class SetOfString; gsoap-2.8.91/gsoap/wsdl/gwsdl.h0000644000175000017500000000505213525245163015647 0ustar ellertellert/* gwsdl.h OGSI GWSDL binding schema interface -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap gwsdl schema documentation: OGSI GWSDL binding schema //gsoap gwsdl schema namespace: http://www.gridforum.org/namespaces/2003/03/gridWSDLExtensions //gsoap sd schema namespace: http://www.gridforum.org/namespaces/2003/03/serviceData #import "schema.h" class wsdl__operation; enum sd__mutability { static_, constant, extendable, mutable_ }; class sd__serviceData { public: @xsd__NMTOKEN name; @xsd__QName type; @xsd__boolean nillable = false; @xsd__string minOccurs; // xsd:nonNegativeInteger @xsd__string maxOccurs; // xsd:nonNegativeInteger|unbounded @enum sd__mutability mutability = extendable; @xsd__boolean modifiable = false; /* has any content */ public: }; class sd__staticServiceDataValues { public: int __type; /* any content, probably should use DOM */ void* _any; }; class gwsdl__portType { public: @xsd__NMTOKEN name; @xsd__QName extends; // a list of QNames xsd__string documentation; // ? std::vector operation; // * std::vector sd__serviceData_; sd__staticServiceDataValues *sd__staticServiceDataValues_; public: }; gsoap-2.8.91/gsoap/wsdl/bpel.h0000644000175000017500000000630313525245163015451 0ustar ellertellert/* bpel.h BPEL 2.0 binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2014, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #import "imports.h" //gsoap plnk schema documentation: Partner Link Type Schema for WS-BPEL 2.0 //gsoap plnk schema namespace: http://docs.oasis-open.org/wsbpel/2.0/plnktype //gsoap plnk schema elementForm: qualified //gsoap plnk schema attributeForm: unqualified //gsoap vprop schema documentation: Variable Properties Schema for WS-BPEL 2.0 //gsoap vprop schema namespace: http://docs.oasis-open.org/wsbpel/2.0/varprop //gsoap vprop schema elementForm: qualified //gsoap vprop schema attributeForm: unqualified class wsdl__definitions; class wsdl__portType; class plnk__tPartnerLinkType; class plnk__tRole { public: @xsd__NCName name; @xsd__QName portType; xsd__string documentation; private: wsdl__portType *portTypeRef; plnk__tPartnerLinkType *plnkRef; public: plnk__tRole(); int traverse(wsdl__definitions&); wsdl__portType *portTypePtr() const; void plnkPtr(plnk__tPartnerLinkType*); plnk__tPartnerLinkType *plnkPtr() const; }; class plnk__tPartnerLinkType { public: @xsd__NCName name; std::vector role; xsd__string documentation; public: int traverse(wsdl__definitions&); }; class vprop__tQuery { public: @xsd__anyURI queryLanguage = "urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0"; xsd__QName __mixed; }; class vprop__tProperty { public: @xsd__NCName name; @xsd__QName type; @xsd__QName element; xsd__string documentation; public: int traverse(wsdl__definitions&); }; class vprop__tPropertyAlias { public: vprop__tQuery* query; @xsd__QName propertyName; @xsd__QName messageType; @xsd__NCName part; @xsd__QName type; @xsd__QName element; xsd__string documentation; private: vprop__tProperty *vpropRef; public: int traverse(wsdl__definitions&); vprop__tProperty *vpropPtr() const; }; gsoap-2.8.91/gsoap/wsdl/Make_mvc.mak0000644000175000017500000000441413525245163016573 0ustar ellertellertCC=cl CPP=cl LIBS=wsock32.lib SECURE_LIBS=$(LIBS) libeay32.lib ssleay32.lib GSOAP=..\\soapcpp2.exe SOAPH=stdsoap2.h SOAPC=stdsoap2.c SOAPCPP=stdsoap2.cpp COFLAGS=-O2 # COFLAGS=-ZI -DDEBUG CFLAGS= -EHsc -nologo $(COFLAGS) wsdl2h.exe: wsdlC.obj wsdl.obj schema.obj soap.obj mime.obj wsp.obj bpel.obj types.obj service.obj wsdl2h.obj stdsoap2.obj $(CPP) $(CFLAGS) -Fewsdl2h.exe wsdl2h.obj wsdlC.obj wsdl.obj schema.obj \ soap.obj mime.obj wsp.obj bpel.obj types.obj service.obj stdsoap2.obj $(LIBS) # cp -f wsdl2h .. secure: touch wsdl2h.cpp make wsdl2h_secure wsdl2h_secure: wsdlC.obj wsdl.obj schema.cpp soap.obj mime.obj wsp.obj bpel.obj types.obj service.obj wsdl2h.obj httpda.obj md5evp.obj stdsoap2.obj $(CPP) $(CFLAGS) -DWITH_OPENSSL -Fewsdl2h.exe wsdl2h.obj wsdlC.obj wsdl.obj \ schema.cpp soap.obj mime.obj wsp.obj bpel.obj types.obj service.obj httpda.obj md5evp.obj stdsoap2.obj $(SECURE_LIBS) wsdl2h.obj: wsdl2h.cpp $(CPP) -c $(CFLAGS) wsdl2h.cpp wsdlC.obj: wsdlC.cpp $(CPP) -c $(CFLAGS) wsdlC.cpp wsdlC.cpp: schema.h soap.h mime.h http.h wsdl.h includes.h imports.h $(GSOAP) -CS -pwsdl wsdl.h types.obj: types.h types.cpp $(CPP) -c $(CFLAGS) types.cpp service.obj: types.h service.h service.cpp $(CPP) -c $(CFLAGS) service.cpp wsdl.obj: wsdl.h wsdl.cpp includes.h imports.h $(CPP) -c $(CFLAGS) wsdl.cpp schema.obj: schema.h schema.cpp includes.h imports.h $(CPP) -c $(CFLAGS) schema.cpp soap.obj: soap.h soap.cpp includes.h imports.h $(CPP) -c $(CFLAGS) soap.cpp mime.obj: mime.h mime.cpp includes.h imports.h $(CPP) -c $(CFLAGS) mime.cpp wsp.obj: wsp.h wsp.cpp includes.h imports.h $(CPP) -c $(CFLAGS) wsp.cpp bpel.obj: bpel.h bpel.cpp includes.h imports.h $(CPP) -c $(CFLAGS) bpel.cpp httpda.obj: ../plugin/httpda.c $(CC) -c -I../plugin $(CFLAGS) ../plugin/httpda.c md5evp.obj: ../plugin/md5evp.c $(CC) -c -I../plugin $(CFLAGS) ../plugin/md5evp.c stdsoap2.obj: $(SOAPCPP) $(CPP) -c $(CFLAGS) $(SOAPCPP) clean: del /f *.obj wsdlH.h wsdlStub.h wsdlC.cpp wsdlClient.cpp wsdlServer.cpp \ wsdlClientLib.cpp wsdlServerLib.cpp distclean: del /f *.obj *.wsdl. *.xsd *.xml *.nsmap wsdl2h.exe wsdlH.h wsdlStub.h \ wsdlC.cpp wsdlClient.cpp wsdlServer.cpp wsdlClientLib.cpp wsdlServerLib.cpp gsoap-2.8.91/gsoap/wsdl/wsdl.h0000644000175000017500000005653513525245163015514 0ustar ellertellert/* wsdl.h WSDL 1.1 and WSDL 2.0 schemas -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2014, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoapopt w //gsoap wsdl schema documentation: WSDL 1.1/2.0 binding schema //gsoap wsdl schema namespace: http://schemas.xmlsoap.org/wsdl/ //gsoap wsdl schema namespace2: http://www.w3.org/ns/wsdl //gsoap wsdl schema elementForm: qualified //gsoap wsdl schema attributeForm: unqualified class wsdl__definitions; // forward declaration #import "imports.h" #import "schema.h" #import "wadl.h" #import "soap.h" #import "mime.h" #import "dime.h" #import "http.h" #import "gwsdl.h" #import "wsam.h" #import "wsp.h" #import "bpel.h" class wsdl__import { public: @xsd__anyURI namespace_; @xsd__anyURI location; private: wsdl__definitions *definitionsRef; public: wsdl__import(); int preprocess(wsdl__definitions&); int traverse(wsdl__definitions&); void definitionsPtr(wsdl__definitions*); wsdl__definitions *definitionsPtr() const; void mark(); }; class wsdl__types : public xs__schema // WSDL 2.0 inlined schema { public: xsd__string documentation; // ? std::vector xs__schema_; // * public: int preprocess(wsdl__definitions&); int traverse(wsdl__definitions&); void mark(); }; class wsdl__part { public: @xsd__NMTOKEN name; @xsd__QName element; @xsd__QName type; xsd__string documentation; // ? private: bool optional; // WADL @required bool repeating; // WADL @repeating bool fixed; // true if WADL @fixed xsd__string default_; // WADL @default and @fixed std::vector option; // WADL option/value* xs__element *elementRef; // traverse() finds element xs__simpleType *simpleTypeRef; // traverse() finds simpleType xs__complexType *complexTypeRef; // traverse() finds complexType public: wsdl__part(); int traverse(wsdl__definitions&); void elementPtr(xs__element*); void simpleTypePtr(xs__simpleType*); void complexTypePtr(xs__complexType*); xs__element *elementPtr() const; xs__simpleType *simpleTypePtr() const; xs__complexType *complexTypePtr() const; void set_optional(bool); void set_fixed(bool); void set_repeating(bool); void set_default(char*); void set_option(char*); bool is_optional() const; bool is_fixed() const; bool is_repeating() const; const char* get_default() const; const std::vector& options() const; void mark(); }; class wsdl__message { public: @xsd__NMTOKEN name; xsd__string documentation; // ? std::vector wsp__Policy_; // * std::vector wsp__PolicyReference_;// * std::vector part; // * public: int traverse(wsdl__definitions&); void mark(); }; class wsdl__ioput { public: @xsd__NMTOKEN name; @xsd__QName message; @xsd__NMTOKEN messageLabel; // WSDL 2.0 @xsd__QName element; // WSDL 2.0 @xsd__anyURI wsa__Action; @xsd__anyURI wsam__Action; xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? private: wsdl__message *messageRef; // traverse() finds message xs__element *elementRef; // traverse() finds element WSDL 2.0 public: wsdl__ioput(); int traverse(wsdl__definitions&); void messagePtr(wsdl__message*); wsdl__message *messagePtr() const; void elementPtr(xs__element*); xs__element *elementPtr() const; void mark(); }; class wsdl__fault { public: @xsd__NMTOKEN name; @xsd__QName message; @xsd__QName ref; // WSDL 2.0 @xsd__NMTOKEN messageLabel; // WSDL 2.0 @xsd__QName element; // WSDL 2.0 @xsd__anyURI wsa__Action; @xsd__anyURI wsam__Action; xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? private: wsdl__message *messageRef; // traverse() finds message xs__element *elementRef; // traverse() finds element WSDL 2.0 public: wsdl__fault(); int traverse(wsdl__definitions&); void messagePtr(wsdl__message*); wsdl__message *messagePtr() const; void elementPtr(xs__element*); xs__element *elementPtr() const; void mark(); }; class wsdl__operation { public: @xsd__NMTOKEN name; @xsd__anyURI pattern; // WSDL 2.0 @xsd__anyURI style; // WSDL 2.0 @xsd__string wrpc__signature; // WSDL 2.0 @xsd__string parameterOrder; xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? $int __union1; union wsdl__union_ioput // | { wsdl__ioput *input; wsdl__ioput *output; } __ioput1; $int __union2; union wsdl__union_ioput __ioput2; // | std::vector fault; // * std::vector infault; // * WSDL 2.0 std::vector outfault; // * WSDL 2.0 public: int traverse(wsdl__definitions&); void mark(); }; class wsdl__portType // ... and WSDL 2.0 interface { public: @xsd__NMTOKEN name; @xsd__QName extends; // WSDL 2.0 @xsd__anyURI styleDefault; // WSDL 2.0 xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? std::vector fault; // * WSDL 2.0 std::vector operation; // * private: wsdl__definitions *definitionsRef; public: wsdl__portType(); int traverse(wsdl__definitions&); void definitionsPtr(wsdl__definitions*); wsdl__definitions *definitionsPtr() const; void mark(); }; class wsdl__ext_ioput // binding extensibility element { public: @xsd__NMTOKEN name; @xsd__NMTOKEN messageLabel; // WSDL 2.0 xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? dime__message *dime__message_; // ? soap__body *soap__body_; // ? xsd__string http__urlEncoded; // ? mime__multipartRelated *mime__multipartRelated_;// ? mime__content *mime__content_; // ? mime__mimeXml *mime__mimeXml_; // ? std::vector soap__header_; // * std::vector wsoap__module_; // * WSDL 2.0 std::vector wsoap__header_; // * WSDL 2.0 std::vector whttp__header_; // * WSDL 2.0 public: int traverse(wsdl__definitions&); void mark(); }; class wsdl__ext_fault // binding extensibility element { public: @xsd__NMTOKEN name; @xsd__QName ref; // WSDL 2.0 @xsd__NMTOKEN messageLabel; // WSDL 2.0 @xsd__QName wsoap__code; // WSDL 2.0 @xsd__QName wsoap__subcodes; // WSDL 2.0 xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? soap__fault *soap__fault_; // ? std::vector wsoap__module_; // * WSDL 2.0 private: wsdl__fault *faultRef; public: wsdl__ext_fault(); int traverse(wsdl__definitions&, wsdl__portType*); void faultPtr(wsdl__fault*); wsdl__fault *faultPtr() const; }; class wsdl__ext_operation // binding extensibility element { public: @xsd__NMTOKEN name; @xsd__QName ref; // WSDL 2.0 @xsd__anyURI wsoap__mep; // WSDL 2.0 @xsd__anyURI wsoap__action; // WSDL 2.0 @xsd__string whttp__method; // WSDL 2.0 @xsd__string whttp__location; // WSDL 2.0 xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? soap__operation *soap__operation_; // ? http__operation *http__operation_; // ? wsdl__ext_ioput *input; // ? wsdl__ext_ioput *output; // ? std::vector fault; // * std::vector infault; // * WSDL 2.0 std::vector outfault; // * WSDL 2.0 private: wsdl__operation *operationRef; // traverse() finds operation public: wsdl__ext_operation(); int traverse(wsdl__definitions&, wsdl__portType*); void operationPtr(wsdl__operation*); wsdl__operation *operationPtr() const; void mark(); }; class wsdl__binding { public: @xsd__NMTOKEN name; @xsd__QName type; @xsd__anyURI type_; // WSDL 2.0 @xsd__QName interface_; // WSDL 2.0 @xsd__boolean whttp__cookies = false; // WSDL 2.0 @xsd__string wsoap__version; // WSDL 2.0 @xsd__anyURI wsoap__protocol; // WSDL 2.0 @xsd__anyURI wsoap__mepDefault; // WSDL 2.0 @xsd__string whttp__methodDefault; // WSDL 2.0 xsd__string documentation; // ? std::vector wsp__Policy_; // * std::vector wsp__PolicyReference_;// * soap__binding *soap__binding_; // ? http__binding *http__binding_; // ? std::vector wsoap__module_; // * WSDL 2.0 std::vector fault; // * WSDL 2.0 std::vector operation; // * private: wsdl__portType *portTypeRef; // traverse() finds portType/interface public: wsdl__binding(); int traverse(wsdl__definitions&); void portTypePtr(wsdl__portType*); wsdl__portType *portTypePtr() const; void mark(); }; class wsdl__port // ... and WSDL 2.0 endpoint { public: @xsd__NMTOKEN name; @xsd__QName binding; @xsd__anyURI address; // WSDL 2.0 @xsd__NMTOKEN whttp__authenticationScheme; // WSDL 2.0 @xsd__NMTOKEN whttp__authenticationRealm; // WSDL 2.0 xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? wsa__EndpointReferenceType *wsa__EndpointReference;// ? xsd__string *wsaw__UsingAddressing; // ? soap__address *soap__address_; // ? http__address *http__address_; // ? private: wsdl__binding *bindingRef; // traverse() finds binding public: wsdl__port(); int traverse(wsdl__definitions&); void bindingPtr(wsdl__binding*); wsdl__binding *bindingPtr() const; }; class wsdl__service { public: @xsd__NMTOKEN name; @xsd__QName interface_; // WSDL 2.0 xsd__string documentation; // ? std::vector wsp__Policy_; // * std::vector wsp__PolicyReference_;// * std::vector port; // * WSDL 1.1 std::vector endpoint; // * WSDL 2.0 public: int traverse(wsdl__definitions&); }; class wsdl__definitions { public: @xsd__NMTOKEN name; @xsd__anyURI targetNamespace = ""; @xsd__NMTOKEN version; std::vector import; // * xsd__string documentation; // ? wsdl__types *types; // ? std::vector message; // * std::vector portType; // * WSDL 1.1 std::vector interface_; // * WSDL 2.0 std::vector binding; // * std::vector service; // * xsd__string wsp__UsingPolicy; // ? WS-Policy 1.2/1.5 std::vector wsp__Policy_; // * WS-Policy 1.2/1.5 std::vector plnk__partnerLinkType; // * BPEL 2.0 std::vector vprop__property; // * BPEL 2.0 std::vector vprop__propertyAlias; // * BPEL 2.0 std::vector gwsdl__portType_; // * struct soap *soap; private: bool soap12; bool updated; char* location; int redirs; MapOfStringToString builtinTypeMap; SetOfString builtinTypeSet; SetOfString builtinElementSet; SetOfString builtinAttributeSet; wadl__application *appRef; bool used; public: wsdl__definitions(); wsdl__definitions(struct soap*); wsdl__definitions(struct soap*, const char*, const char*, const char*); virtual ~wsdl__definitions(); int get(struct soap*); // getter is triggered after parsing int preprocess(); int traverse(); int read(int, char**); int read(const char*, const char*, const char*); const char* sourceLocation(); char* absoluteLocation(const char *loc) const; int error(); bool is_updated(); void print_fault(); void builtinType(const char*); void builtinTypes(const SetOfString&); void builtinTypeDerivation(xs__schema&, const char*, const char*); void builtinTypeDerivations(const MapOfStringToString&); void builtinElement(const char*); void builtinElements(const SetOfString&); void builtinAttribute(const char*); void builtinAttributes(const SetOfString&); const SetOfString& builtinTypes() const; const MapOfStringToString& builtinTypeDerivations() const; const SetOfString& builtinElements() const; const SetOfString& builtinAttributes() const; void appPtr(wadl__application*); wadl__application* appPtr() const; void mark(); friend std::ostream& operator<<(std::ostream&, const wsdl__definitions&); friend std::istream& operator>>(std::istream&, wsdl__definitions&); }; extern std::ostream &operator<<(std::ostream &o, const wsdl__definitions &e); extern std::istream &operator>>(std::istream &i, wsdl__definitions &e); gsoap-2.8.91/gsoap/wsdl/soap.h0000644000175000017500000000775713525245163015507 0ustar ellertellert/* soap.h WSDL/SOAP binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap soap schema documentation: WSDL 1.1 SOAP binding schema //gsoap soap schema namespace: http://schemas.xmlsoap.org/wsdl/soap/ //gsoap soap schema elementForm: qualified //gsoap soap schema attributeForm: unqualified //gsoap wsoap schema documentation: WSDL 2.0 SOAP binding schema //gsoap wsoap schema namespace: http://www.w3.org/ns/wsdl/soap //gsoap wsoap schema elementForm: qualified //gsoap wsoap schema attributeForm: unqualified #import "imports.h" class wsdl__definitions; // forward declaration class wsdl__message; // forward declaration class wsdl__part; // forward declaration enum soap__styleChoice { rpc, document }; class soap__binding { public: @xsd__anyURI transport; @enum soap__styleChoice *style; }; class soap__operation { public: @xsd__anyURI soapAction; @xsd__boolean soapActionRequired = true; @enum soap__styleChoice *style; }; enum soap__useChoice { literal, encoded }; class soap__body { public: @xsd__anyURI encodingStyle; @xsd__NMTOKENS parts; @enum soap__useChoice use; @xsd__anyURI namespace_; }; class soap__fault { public: @xsd__NMTOKEN name; @xsd__anyURI encodingStyle; @enum soap__useChoice use; @xsd__anyURI namespace_; }; class soap__headerfault { public: @xsd__QName message; @xsd__NMTOKEN part; @enum soap__useChoice use; @xsd__anyURI encodingStyle; @xsd__anyURI namespace_; private: wsdl__message *messageRef; wsdl__part *partRef; public: int traverse(wsdl__definitions&); void messagePtr(wsdl__message*); void partPtr(wsdl__part*); wsdl__message *messagePtr() const; wsdl__part *partPtr() const; }; class soap__header { public: @xsd__QName message; @xsd__NMTOKEN part; @enum soap__useChoice use; @xsd__anyURI encodingStyle; @xsd__anyURI namespace_; std::vector headerfault; // * private: wsdl__message *messageRef; wsdl__part *partRef; public: int traverse(wsdl__definitions&); void messagePtr(wsdl__message*); void partPtr(wsdl__part*); wsdl__message *messagePtr() const; wsdl__part *partPtr() const; }; class soap__address { public: @xsd__anyURI location; }; class wsoap__module { public: @xsd__anyURI ref; @xsd__boolean required = false; }; class wsoap__header { public: @xsd__QName element; @xsd__boolean mustUnderstand_ = false; @xsd__boolean required = false; private: xs__element *elementRef; public: int traverse(wsdl__definitions&); void elementPtr(xs__element*); xs__element *elementPtr() const; void mark(); }; gsoap-2.8.91/gsoap/wsdl/schema.h0000644000175000017500000007020013525245163015764 0ustar ellertellert/* schema.h schema of XSD schemas 1.0 and 1.1 -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap xs schema documentation: XSD binding schema //gsoap xs schema namespace: http://www.w3.org/2001/XMLSchema //gsoap xs schema elementForm: qualified //gsoap xs schema attributeForm: unqualified /* For the wsdl:arrayType attribute to support old style SOAP arrays: */ //gsoap wsdl schema namespace: http://schemas.xmlsoap.org/wsdl/ #import "imports.h" class xs__schema; // forward declaration class xs__simpleType; // forward declaration class xs__complexType; // forward declaration class xs__extension; // forward declaration class xs__restriction; // forward declaration class xs__seqchoice; // forward declaration class xs__group; // forward declaration class xs__list; // forward declaration class xs__union; // forward declaration class xs__annotation { public: std::vector documentation; }; class xs__assert { public: @xsd__string test; @xsd__anyURI xpathDefaultNamespace; xs__annotation *annotation; }; class xs__alternative { public: @xsd__string test; @xsd__QName type; @xsd__anyURI xpathDefaultNamespace; xs__annotation *annotation; }; enum xs__formChoice { unqualified, qualified }; class xs__element { public: @xsd__NCName name; @xsd__QName ref; @xsd__QName type; @xsd__string default_; @xsd__QName default__; // also get QName value if element type is QName @xsd__string fixed; @xsd__QName fixed_; // also get QName value if element type is QName @enum xs__formChoice *form; @xsd__boolean nillable = false; @xsd__boolean abstract = false; @xsd__QName substitutionGroup; @xsd__token minOccurs; // xsd:nonNegativeInteger @xsd__token maxOccurs; // xsd:nonNegativeInteger|unbounded @xsd__anyURI targetNamespace; // XSD 1.1 @xsd__string xmime__expectedContentTypes; xs__annotation *annotation; xs__simpleType *simpleType; // choice xs__complexType *complexType; // choice std::vector alternative; // XSD 1.1 (unused) xsd__string unique; // unused private: xs__schema *schemaRef; // schema to which this belongs xs__element *elementRef; // traverse() finds ref xs__simpleType *simpleTypeRef; // traverse() finds type or = simpleType above xs__complexType *complexTypeRef; // traverse() finds type or = complexType above std::vector substitutions; // traverse() finds substitutionGroup elements bool used; public: xs__element(); int traverse(xs__schema&); void schemaPtr(xs__schema*); void elementPtr(xs__element*); void simpleTypePtr(xs__simpleType*); void complexTypePtr(xs__complexType*); xs__schema *schemaPtr() const; xs__element *elementPtr() const; xs__simpleType *simpleTypePtr() const; xs__complexType *complexTypePtr() const; const std::vector *substitutionsPtr() const; void mark(); bool is_used() const; }; enum xs__attribute_use { optional, prohibited, required, default_, fixed_ }; class xs__attribute { public: @xsd__NCName name; @xsd__QName ref; @xsd__QName type; @enum xs__attribute_use use = optional; @xsd__string default_; @xsd__QName default__; // also get QName value if attribute type is QName @xsd__string fixed; @xsd__QName fixed_; // also get QName value if attribute type is QName @enum xs__formChoice *form; @xsd__boolean inheritable; // XSD 1.1 (unused) @xsd__anyURI targetNamespace; // XSD 1.1 @xsd__QName wsdl__arrayType; // extensibility attribute added for WSDL parsing xs__annotation *annotation; xs__simpleType *simpleType; private: xs__schema *schemaRef; // schema to which this belongs xs__attribute *attributeRef; // traverse() finds ref xs__simpleType *simpleTypeRef; // traverse() finds type or = simpleType above bool used; public: xs__attribute(); int traverse(xs__schema&); void schemaPtr(xs__schema*); void attributePtr(xs__attribute*); void simpleTypePtr(xs__simpleType*); xs__schema *schemaPtr() const; xs__attribute *attributePtr() const; xs__simpleType *simpleTypePtr() const; void mark(); bool is_used() const; }; class xs__all { public: std::vector element; public: int traverse(xs__schema&); void mark(); }; enum xs__processContents { strict, skip, lax }; typedef char *xs__namespaceList; // "##any" or "##other" or list of URI, "##targetNamespace", "##local" class xs__any { public: @xs__namespaceList namespace_ = "##any"; @enum xs__processContents processContents = strict; @xsd__token minOccurs; // xsd:nonNegativeInteger @xsd__token maxOccurs; // xsd:nonNegativeInteger|unbounded std::vector element; public: int traverse(xs__schema&); void mark(); }; class xs__contents { public: $int __union; union xs__union_content { xs__element *element; xs__group *group; xs__seqchoice *choice; xs__seqchoice *sequence; xs__any *any; } __content; public: int traverse(xs__schema&); void mark(); }; class xs__seqchoice { public: @xsd__token minOccurs; // xsd:nonNegativeInteger @xsd__token maxOccurs; // xsd:nonNegativeInteger|unbounded xs__annotation *annotation; std::vector __contents; private: xs__schema *schemaRef; // schema to which this belongs public: xs__seqchoice(); int traverse(xs__schema&); void schemaPtr(xs__schema*); xs__schema *schemaPtr() const; void mark(); }; class xs__group { public: @xsd__NCName name; @xsd__QName ref; @xsd__token minOccurs; // xsd:nonNegativeInteger @xsd__token maxOccurs; // xsd:nonNegativeInteger|unbounded xs__annotation *annotation; xs__all *all; xs__seqchoice *choice; xs__seqchoice *sequence; private: xs__schema *schemaRef; // schema to which this belongs xs__group *groupRef; // traverse() finds ref bool used; public: xs__group(); int traverse(xs__schema&); void schemaPtr(xs__schema*); void groupPtr(xs__group*); xs__schema *schemaPtr() const; xs__group *groupPtr() const; void mark(); }; class xs__anyAttribute { public: @xs__namespaceList namespace_ = "##any"; @enum xs__processContents processContents = strict; }; class xs__attributeGroup { public: @xsd__NCName name; @xsd__QName ref; xs__annotation *annotation; std::vector attribute; std::vector attributeGroup; xs__anyAttribute *anyAttribute; private: xs__schema *schemaRef; xs__attributeGroup *attributeGroupRef; bool used; public: xs__attributeGroup(); int traverse(xs__schema&); void schemaPtr(xs__schema*); void attributeGroupPtr(xs__attributeGroup*); xs__schema *schemaPtr() const; xs__attributeGroup *attributeGroupPtr() const; void mark(); }; class xs__enumeration { public: @xsd__string value; @xsd__QName value_; // also get QName value if base type is QName xs__annotation *annotation; public: int traverse(xs__schema&); }; class xs__pattern { public: @xsd__string value; public: int traverse(xs__schema&); }; class xs__simpleContent { public: xs__extension *extension; // choice xs__restriction *restriction; // choice public: int traverse(xs__schema&); void mark(); }; class xs__simpleType { public: @xsd__NMTOKEN name; @xsd__string vc__minVersion; // XSD 1.1 (unused) @xsd__string vc__maxVersion; // XSD 1.1 (unused) xs__annotation *annotation; xs__restriction *restriction; // choice xs__list *list; // choice xs__union *union_; // choice private: xs__schema *schemaRef; std::vector complextype_extensions; std::vector extensions; std::vector restrictions; int level; bool used; public: xs__simpleType(); int traverse(xs__schema&); void schemaPtr(xs__schema*); xs__schema *schemaPtr() const; int baseLevel(); void mark(); bool is_used() const; void add_extension(xs__complexType*, xs__schema&, xsd__NCName); void add_restriction(xs__schema&, xsd__NCName); const std::vector& get_extensions() const; const std::vector& get_restrictions() const; }; class xs__extension { public: @xsd__QName base; xs__group *group; xs__all *all; xs__seqchoice *choice; xs__seqchoice *sequence; std::vector attribute; std::vector attributeGroup; xs__anyAttribute *anyAttribute; xs__annotation *annotation; std::vector assert; // XSD 1.1 private: xs__simpleType *simpleTypeRef; // traverse() finds type xs__complexType *complexTypeRef; // traverse() finds type public: xs__extension(); int traverse(xs__schema&); void simpleTypePtr(xs__simpleType*); void complexTypePtr(xs__complexType*); xs__simpleType *simpleTypePtr() const; xs__complexType *complexTypePtr() const; void mark(); }; class xs__length { public: @xsd__string value; @xsd__boolean fixed; xs__annotation *annotation; }; class xs__whiteSpace { public: @xsd__string value; }; class xs__restriction { public: @xsd__QName base; xs__simpleType *simpleType; // used in xs__attributeGroup *attributeGroup; // not used in xs__group *group; // not used in xs__all *all; // not used in xs__seqchoice *choice; // not used in xs__seqchoice *sequence; // not used in std::vector attribute; // not used in xs__anyAttribute *anyAttribute; // not used in std::vector enumeration; std::vector pattern; xs__whiteSpace *whiteSpace; xs__length *length; xs__length *minLength; xs__length *maxLength; xs__length *precision; // 2000 XSD 1.0 xs__length *scale; // 2000 XSD 1.0 xs__length *totalDigits; // 2001 XSD 1.0 xs__length *fractionDigits; // 2001 XSD 1.0 xs__length *minInclusive; xs__length *maxInclusive; xs__length *minExclusive; xs__length *maxExclusive; xs__annotation *annotation; std::vector assert; // XSD 1.1 xs__assert *assertion; // XSD 1.1 private: xs__simpleType *simpleTypeRef; // traverse() finds type xs__complexType *complexTypeRef; // traverse() finds type xs__simpleType *simpleArrayTypeRef; // traverse() finds type xs__complexType *complexArrayTypeRef; // traverse() finds type public: xs__restriction(); int traverse(xs__schema&); void simpleTypePtr(xs__simpleType*); void complexTypePtr(xs__complexType*); xs__simpleType *simpleTypePtr() const; xs__complexType *complexTypePtr() const; xs__simpleType *simpleArrayTypePtr() const; xs__complexType *complexArrayTypePtr() const; void mark(); }; class xs__list { public: @xsd__QName itemType; xs__restriction *restriction; // choice std::vector simpleType; // choice private: xs__simpleType *itemTypeRef; public: xs__list(); int traverse(xs__schema&); void itemTypePtr(xs__simpleType*); xs__simpleType *itemTypePtr() const; void mark(); }; class xs__union { public: @xsd__NMTOKENS memberTypes; // check if NMTOKENS is ok??? std::vector simpleType; public: int traverse(xs__schema&); void mark(); }; class xs__complexContent { public: @xsd__boolean mixed = false; xs__extension *extension; xs__restriction *restriction; xs__annotation *annotation; public: int traverse(xs__schema&); void mark(); }; class xs__complexType { public: @xsd__NMTOKEN name; @xsd__boolean abstract = false; @xsd__boolean mixed = false; @xsd__boolean defaultAttributesApply = true; // XSD 1.1 @xsd__string vc__minVersion; // XSD 1.1 (unused) @xsd__string vc__maxVersion; // XSD 1.1 (unused) xs__annotation *annotation; xs__simpleContent *simpleContent; xs__complexContent *complexContent; xs__all *all; xs__seqchoice *choice; xs__seqchoice *sequence; xs__group *group; xs__any *any; std::vector attribute; std::vector attributeGroup; xs__anyAttribute *anyAttribute; std::vector assert; // XSD 1.1 private: xs__schema *schemaRef; std::vector complextype_extensions; std::vector extensions; std::vector restrictions; int level; bool used; public: xs__complexType(); int traverse(xs__schema&); void schemaPtr(xs__schema*); xs__schema *schemaPtr() const; int baseLevel(); void mark(); bool is_used() const; void add_extension(xs__complexType*, xs__schema&, xsd__NCName); void add_restriction(xs__schema&, xsd__NCName); const std::vector& get_extensions() const; const std::vector& get_restrictions() const; }; class xs__import { public: @xsd__anyURI namespace_; @xsd__anyURI schemaLocation; @xsd__anyURI location; // work around a Microsoft bug private: xs__schema *schemaRef; // set by WSDL parser or via schemaLocation public: xs__import(); int preprocess(xs__schema&); int traverse(xs__schema&); void schemaPtr(xs__schema*); xs__schema *schemaPtr() const; void mark(); }; class xs__include { public: @xsd__anyURI schemaLocation; private: xs__schema *schemaRef; public: xs__include(); int preprocess(xs__schema&); int traverse(xs__schema&); void schemaPtr(xs__schema*); xs__schema *schemaPtr() const; }; class xs__override { public: @xsd__anyURI schemaLocation; std::vector attribute; std::vector element; std::vector group; std::vector attributeGroup; std::vector simpleType; std::vector complexType; private: xs__schema *schemaRef; public: xs__override(); int preprocess(xs__schema&); int traverse(xs__schema&); void schemaPtr(xs__schema*); xs__schema *schemaPtr() const; }; class xs__redefine { public: @xsd__anyURI schemaLocation; std::vector group; std::vector attributeGroup; std::vector simpleType; std::vector complexType; private: xs__schema *schemaRef; public: xs__redefine(); int preprocess(xs__schema&); int traverse(xs__schema&); void schemaPtr(xs__schema*); xs__schema *schemaPtr() const; }; class xs__schema { public: @xsd__anyURI targetNamespace = ""; @xsd__string version; @xsd__NCName defaultAttributes; // XSD 1.1 @enum xs__formChoice attributeFormDefault = unqualified; @enum xs__formChoice elementFormDefault = unqualified; xs__annotation *annotation; std::vector include; std::vector override_; std::vector redefine; std::vector import; std::vector attribute; std::vector element; std::vector group; std::vector attributeGroup; std::vector simpleType; std::vector complexType; struct soap *soap; private: xs__attributeGroup *attributeGroupRef; // defaultAttributes group bool updated; char* location; int redirs; MapOfStringToString builtinTypeMap; SetOfString builtinTypeSet; SetOfString builtinElementSet; SetOfString builtinAttributeSet; bool used; public: xs__schema(); xs__schema(struct soap*); xs__schema(struct soap*, const char*, const char*, const char*); virtual ~xs__schema(); int get(struct soap*); // getter is triggered after parsing int preprocess(); int insert(xs__schema&); int traverse(); int read(const char*, const char*, const char*); void sourceLocation(const char*); const char* sourceLocation(); char* absoluteLocation(const char*) const; xs__attributeGroup *attributeGroupPtr() const; // defaultAttributes group int error(); void print_fault(); void builtinType(const char*); void builtinTypeDerivation(xs__schema&, const char*, const char*); void builtinElement(const char*); void builtinAttribute(const char*); const SetOfString& builtinTypes() const; const MapOfStringToString& builtinTypeDerivations() const; const SetOfString& builtinElements() const; const SetOfString& builtinAttributes() const; bool empty() const; void mark(); friend std::ostream& operator<<(std::ostream&, const xs__schema&); friend std::istream& operator>>(std::istream&, xs__schema&); }; extern std::ostream &operator<<(std::ostream &o, const xs__schema &e); extern std::istream &operator>>(std::istream &i, xs__schema &e); gsoap-2.8.91/gsoap/wsdl/.deps/0000755000175000017500000000000013525245164015366 5ustar ellertellertgsoap-2.8.91/gsoap/wsdl/.deps/soap.Po0000644000175000017500000002726413525245163016642 0ustar ellertellertsoap.o soap.o: soap.cpp wsdlH.h wsdlStub.h /usr/include/c++/4.0.0/vector \ /usr/include/c++/4.0.0/bits/functexcept.h \ /usr/include/c++/4.0.0/exception_defines.h \ /usr/include/c++/4.0.0/bits/stl_algobase.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++config.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/os_defines.h \ /usr/include/c++/4.0.0/cstring /usr/include/c++/4.0.0/cstddef \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stddef.h \ /usr/include/string.h /usr/include/_types.h /usr/include/sys/_types.h \ /usr/include/sys/cdefs.h /usr/include/machine/_types.h \ /usr/include/i386/_types.h /usr/include/c++/4.0.0/climits \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/limits.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/syslimits.h \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/i386/limits.h /usr/include/i386/_limits.h \ /usr/include/sys/syslimits.h /usr/include/c++/4.0.0/cstdlib \ /usr/include/stdlib.h /usr/include/sys/wait.h /usr/include/sys/signal.h \ /usr/include/sys/appleapiopts.h /usr/include/machine/signal.h \ /usr/include/i386/signal.h /usr/include/sys/resource.h \ /usr/include/machine/endian.h /usr/include/i386/endian.h \ /usr/include/sys/_endian.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdint.h \ /usr/include/libkern/OSByteOrder.h \ /usr/include/libkern/i386/OSByteOrder.h /usr/include/alloca.h \ /usr/include/machine/types.h /usr/include/i386/types.h \ /usr/include/c++/4.0.0/iosfwd \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++locale.h \ /usr/include/c++/4.0.0/clocale /usr/include/locale.h \ /usr/include/_locale.h /usr/include/c++/4.0.0/cstdio \ /usr/include/stdio.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++io.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/gthr.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/gthr-default.h \ /usr/include/pthread.h /usr/include/pthread_impl.h /usr/include/sched.h \ /usr/include/time.h /usr/include/machine/_limits.h \ /usr/include/unistd.h /usr/include/sys/unistd.h \ /usr/include/sys/select.h /usr/include/sys/types.h \ /usr/include/signal.h /usr/include/sys/time.h \ /usr/include/c++/4.0.0/cctype /usr/include/ctype.h \ /usr/include/runetype.h /usr/include/c++/4.0.0/bits/stringfwd.h \ /usr/include/c++/4.0.0/bits/postypes.h /usr/include/c++/4.0.0/cwchar \ /usr/include/c++/4.0.0/ctime /usr/include/wchar.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdarg.h \ /usr/include/_wctype.h /usr/include/c++/4.0.0/bits/stl_pair.h \ /usr/include/c++/4.0.0/bits/cpp_type_traits.h \ /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h \ /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h \ /usr/include/c++/4.0.0/bits/concept_check.h \ /usr/include/c++/4.0.0/bits/stl_iterator.h \ /usr/include/c++/4.0.0/debug/debug.h /usr/include/c++/4.0.0/cassert \ /usr/include/assert.h /usr/include/c++/4.0.0/bits/allocator.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++allocator.h \ /usr/include/c++/4.0.0/ext/new_allocator.h /usr/include/c++/4.0.0/new \ /usr/include/c++/4.0.0/exception \ /usr/include/c++/4.0.0/bits/stl_construct.h \ /usr/include/c++/4.0.0/bits/stl_uninitialized.h \ /usr/include/c++/4.0.0/bits/stl_vector.h \ /usr/include/c++/4.0.0/bits/stl_bvector.h \ /usr/include/c++/4.0.0/bits/vector.tcc includes.h \ ../../soapcpp2/stdsoap2.h ../../config.h /usr/include/c++/4.0.0/string \ /usr/include/c++/4.0.0/bits/char_traits.h /usr/include/c++/4.0.0/memory \ /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h \ /usr/include/c++/4.0.0/limits \ /usr/include/c++/4.0.0/bits/stl_function.h \ /usr/include/c++/4.0.0/bits/basic_string.h \ /usr/include/c++/4.0.0/bits/atomicity.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/atomic_word.h \ /usr/include/c++/4.0.0/algorithm /usr/include/c++/4.0.0/bits/stl_algo.h \ /usr/include/c++/4.0.0/bits/stl_heap.h \ /usr/include/c++/4.0.0/bits/stl_tempbuf.h \ /usr/include/c++/4.0.0/bits/basic_string.tcc \ /usr/include/c++/4.0.0/iostream /usr/include/c++/4.0.0/ostream \ /usr/include/c++/4.0.0/ios /usr/include/c++/4.0.0/bits/localefwd.h \ /usr/include/c++/4.0.0/bits/ios_base.h \ /usr/include/c++/4.0.0/bits/locale_classes.h \ /usr/include/c++/4.0.0/streambuf \ /usr/include/c++/4.0.0/bits/streambuf.tcc \ /usr/include/c++/4.0.0/bits/basic_ios.h \ /usr/include/c++/4.0.0/bits/streambuf_iterator.h \ /usr/include/c++/4.0.0/bits/locale_facets.h \ /usr/include/c++/4.0.0/cwctype /usr/include/wctype.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/ctype_base.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/ctype_inline.h \ /usr/include/c++/4.0.0/bits/codecvt.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/time_members.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/messages_members.h \ /usr/include/c++/4.0.0/bits/basic_ios.tcc \ /usr/include/c++/4.0.0/bits/ostream.tcc /usr/include/c++/4.0.0/locale \ /usr/include/c++/4.0.0/bits/locale_facets.tcc \ /usr/include/c++/4.0.0/typeinfo /usr/include/c++/4.0.0/istream \ /usr/include/c++/4.0.0/bits/istream.tcc /usr/include/errno.h \ /usr/include/sys/errno.h /usr/include/sys/timeb.h \ /usr/include/sys/socket.h /usr/include/machine/param.h \ /usr/include/i386/param.h /usr/include/strings.h \ /usr/include/netinet/in.h /usr/include/netinet6/in6.h \ /usr/include/netinet/tcp.h /usr/include/arpa/inet.h \ /usr/include/sys/param.h /usr/include/netdb.h /usr/include/fcntl.h \ /usr/include/sys/fcntl.h /usr/include/math.h \ /usr/include/architecture/i386/math.h /usr/include/c++/4.0.0/utility \ /usr/include/c++/4.0.0/bits/stl_relops.h \ /usr/include/c++/4.0.0/iterator \ /usr/include/c++/4.0.0/bits/stream_iterator.h \ /usr/include/c++/4.0.0/set /usr/include/c++/4.0.0/bits/stl_tree.h \ /usr/include/c++/4.0.0/bits/stl_set.h \ /usr/include/c++/4.0.0/bits/stl_multiset.h /usr/include/c++/4.0.0/map \ /usr/include/c++/4.0.0/bits/stl_map.h \ /usr/include/c++/4.0.0/bits/stl_multimap.h wsdlH.h: wsdlStub.h: /usr/include/c++/4.0.0/vector: /usr/include/c++/4.0.0/bits/functexcept.h: /usr/include/c++/4.0.0/exception_defines.h: /usr/include/c++/4.0.0/bits/stl_algobase.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++config.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/os_defines.h: /usr/include/c++/4.0.0/cstring: /usr/include/c++/4.0.0/cstddef: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stddef.h: /usr/include/string.h: /usr/include/_types.h: /usr/include/sys/_types.h: /usr/include/sys/cdefs.h: /usr/include/machine/_types.h: /usr/include/i386/_types.h: /usr/include/c++/4.0.0/climits: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/limits.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/syslimits.h: /usr/include/limits.h: /usr/include/machine/limits.h: /usr/include/i386/limits.h: /usr/include/i386/_limits.h: /usr/include/sys/syslimits.h: /usr/include/c++/4.0.0/cstdlib: /usr/include/stdlib.h: /usr/include/sys/wait.h: /usr/include/sys/signal.h: /usr/include/sys/appleapiopts.h: /usr/include/machine/signal.h: /usr/include/i386/signal.h: /usr/include/sys/resource.h: /usr/include/machine/endian.h: /usr/include/i386/endian.h: /usr/include/sys/_endian.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdint.h: /usr/include/libkern/OSByteOrder.h: /usr/include/libkern/i386/OSByteOrder.h: /usr/include/alloca.h: /usr/include/machine/types.h: /usr/include/i386/types.h: /usr/include/c++/4.0.0/iosfwd: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++locale.h: /usr/include/c++/4.0.0/clocale: /usr/include/locale.h: /usr/include/_locale.h: /usr/include/c++/4.0.0/cstdio: /usr/include/stdio.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++io.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/gthr.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/gthr-default.h: /usr/include/pthread.h: /usr/include/pthread_impl.h: /usr/include/sched.h: /usr/include/time.h: /usr/include/machine/_limits.h: /usr/include/unistd.h: /usr/include/sys/unistd.h: /usr/include/sys/select.h: /usr/include/sys/types.h: /usr/include/signal.h: /usr/include/sys/time.h: /usr/include/c++/4.0.0/cctype: /usr/include/ctype.h: /usr/include/runetype.h: /usr/include/c++/4.0.0/bits/stringfwd.h: /usr/include/c++/4.0.0/bits/postypes.h: /usr/include/c++/4.0.0/cwchar: /usr/include/c++/4.0.0/ctime: /usr/include/wchar.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdarg.h: /usr/include/_wctype.h: /usr/include/c++/4.0.0/bits/stl_pair.h: /usr/include/c++/4.0.0/bits/cpp_type_traits.h: /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h: /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h: /usr/include/c++/4.0.0/bits/concept_check.h: /usr/include/c++/4.0.0/bits/stl_iterator.h: /usr/include/c++/4.0.0/debug/debug.h: /usr/include/c++/4.0.0/cassert: /usr/include/assert.h: /usr/include/c++/4.0.0/bits/allocator.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++allocator.h: /usr/include/c++/4.0.0/ext/new_allocator.h: /usr/include/c++/4.0.0/new: /usr/include/c++/4.0.0/exception: /usr/include/c++/4.0.0/bits/stl_construct.h: /usr/include/c++/4.0.0/bits/stl_uninitialized.h: /usr/include/c++/4.0.0/bits/stl_vector.h: /usr/include/c++/4.0.0/bits/stl_bvector.h: /usr/include/c++/4.0.0/bits/vector.tcc: includes.h: ../../soapcpp2/stdsoap2.h: ../../config.h: /usr/include/c++/4.0.0/string: /usr/include/c++/4.0.0/bits/char_traits.h: /usr/include/c++/4.0.0/memory: /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h: /usr/include/c++/4.0.0/limits: /usr/include/c++/4.0.0/bits/stl_function.h: /usr/include/c++/4.0.0/bits/basic_string.h: /usr/include/c++/4.0.0/bits/atomicity.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/atomic_word.h: /usr/include/c++/4.0.0/algorithm: /usr/include/c++/4.0.0/bits/stl_algo.h: /usr/include/c++/4.0.0/bits/stl_heap.h: /usr/include/c++/4.0.0/bits/stl_tempbuf.h: /usr/include/c++/4.0.0/bits/basic_string.tcc: /usr/include/c++/4.0.0/iostream: /usr/include/c++/4.0.0/ostream: /usr/include/c++/4.0.0/ios: /usr/include/c++/4.0.0/bits/localefwd.h: /usr/include/c++/4.0.0/bits/ios_base.h: /usr/include/c++/4.0.0/bits/locale_classes.h: /usr/include/c++/4.0.0/streambuf: /usr/include/c++/4.0.0/bits/streambuf.tcc: /usr/include/c++/4.0.0/bits/basic_ios.h: /usr/include/c++/4.0.0/bits/streambuf_iterator.h: /usr/include/c++/4.0.0/bits/locale_facets.h: /usr/include/c++/4.0.0/cwctype: /usr/include/wctype.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/ctype_base.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/ctype_inline.h: /usr/include/c++/4.0.0/bits/codecvt.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/time_members.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/messages_members.h: /usr/include/c++/4.0.0/bits/basic_ios.tcc: /usr/include/c++/4.0.0/bits/ostream.tcc: /usr/include/c++/4.0.0/locale: /usr/include/c++/4.0.0/bits/locale_facets.tcc: /usr/include/c++/4.0.0/typeinfo: /usr/include/c++/4.0.0/istream: /usr/include/c++/4.0.0/bits/istream.tcc: /usr/include/errno.h: /usr/include/sys/errno.h: /usr/include/sys/timeb.h: /usr/include/sys/socket.h: /usr/include/machine/param.h: /usr/include/i386/param.h: /usr/include/strings.h: /usr/include/netinet/in.h: /usr/include/netinet6/in6.h: /usr/include/netinet/tcp.h: /usr/include/arpa/inet.h: /usr/include/sys/param.h: /usr/include/netdb.h: /usr/include/fcntl.h: /usr/include/sys/fcntl.h: /usr/include/math.h: /usr/include/architecture/i386/math.h: /usr/include/c++/4.0.0/utility: /usr/include/c++/4.0.0/bits/stl_relops.h: /usr/include/c++/4.0.0/iterator: /usr/include/c++/4.0.0/bits/stream_iterator.h: /usr/include/c++/4.0.0/set: /usr/include/c++/4.0.0/bits/stl_tree.h: /usr/include/c++/4.0.0/bits/stl_set.h: /usr/include/c++/4.0.0/bits/stl_multiset.h: /usr/include/c++/4.0.0/map: /usr/include/c++/4.0.0/bits/stl_map.h: /usr/include/c++/4.0.0/bits/stl_multimap.h: gsoap-2.8.91/gsoap/wsdl/.deps/schema.Po0000644000175000017500000002727213525245163017137 0ustar ellertellertschema.o schema.o: schema.cpp wsdlH.h wsdlStub.h \ /usr/include/c++/4.0.0/vector /usr/include/c++/4.0.0/bits/functexcept.h \ /usr/include/c++/4.0.0/exception_defines.h \ /usr/include/c++/4.0.0/bits/stl_algobase.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++config.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/os_defines.h \ /usr/include/c++/4.0.0/cstring /usr/include/c++/4.0.0/cstddef \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stddef.h \ /usr/include/string.h /usr/include/_types.h /usr/include/sys/_types.h \ /usr/include/sys/cdefs.h /usr/include/machine/_types.h \ /usr/include/i386/_types.h /usr/include/c++/4.0.0/climits \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/limits.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/syslimits.h \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/i386/limits.h /usr/include/i386/_limits.h \ /usr/include/sys/syslimits.h /usr/include/c++/4.0.0/cstdlib \ /usr/include/stdlib.h /usr/include/sys/wait.h /usr/include/sys/signal.h \ /usr/include/sys/appleapiopts.h /usr/include/machine/signal.h \ /usr/include/i386/signal.h /usr/include/sys/resource.h \ /usr/include/machine/endian.h /usr/include/i386/endian.h \ /usr/include/sys/_endian.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdint.h \ /usr/include/libkern/OSByteOrder.h \ /usr/include/libkern/i386/OSByteOrder.h /usr/include/alloca.h \ /usr/include/machine/types.h /usr/include/i386/types.h \ /usr/include/c++/4.0.0/iosfwd \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++locale.h \ /usr/include/c++/4.0.0/clocale /usr/include/locale.h \ /usr/include/_locale.h /usr/include/c++/4.0.0/cstdio \ /usr/include/stdio.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++io.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/gthr.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/gthr-default.h \ /usr/include/pthread.h /usr/include/pthread_impl.h /usr/include/sched.h \ /usr/include/time.h /usr/include/machine/_limits.h \ /usr/include/unistd.h /usr/include/sys/unistd.h \ /usr/include/sys/select.h /usr/include/sys/types.h \ /usr/include/signal.h /usr/include/sys/time.h \ /usr/include/c++/4.0.0/cctype /usr/include/ctype.h \ /usr/include/runetype.h /usr/include/c++/4.0.0/bits/stringfwd.h \ /usr/include/c++/4.0.0/bits/postypes.h /usr/include/c++/4.0.0/cwchar \ /usr/include/c++/4.0.0/ctime /usr/include/wchar.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdarg.h \ /usr/include/_wctype.h /usr/include/c++/4.0.0/bits/stl_pair.h \ /usr/include/c++/4.0.0/bits/cpp_type_traits.h \ /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h \ /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h \ /usr/include/c++/4.0.0/bits/concept_check.h \ /usr/include/c++/4.0.0/bits/stl_iterator.h \ /usr/include/c++/4.0.0/debug/debug.h /usr/include/c++/4.0.0/cassert \ /usr/include/assert.h /usr/include/c++/4.0.0/bits/allocator.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++allocator.h \ /usr/include/c++/4.0.0/ext/new_allocator.h /usr/include/c++/4.0.0/new \ /usr/include/c++/4.0.0/exception \ /usr/include/c++/4.0.0/bits/stl_construct.h \ /usr/include/c++/4.0.0/bits/stl_uninitialized.h \ /usr/include/c++/4.0.0/bits/stl_vector.h \ /usr/include/c++/4.0.0/bits/stl_bvector.h \ /usr/include/c++/4.0.0/bits/vector.tcc includes.h \ ../../soapcpp2/stdsoap2.h ../../config.h /usr/include/c++/4.0.0/string \ /usr/include/c++/4.0.0/bits/char_traits.h /usr/include/c++/4.0.0/memory \ /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h \ /usr/include/c++/4.0.0/limits \ /usr/include/c++/4.0.0/bits/stl_function.h \ /usr/include/c++/4.0.0/bits/basic_string.h \ /usr/include/c++/4.0.0/bits/atomicity.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/atomic_word.h \ /usr/include/c++/4.0.0/algorithm /usr/include/c++/4.0.0/bits/stl_algo.h \ /usr/include/c++/4.0.0/bits/stl_heap.h \ /usr/include/c++/4.0.0/bits/stl_tempbuf.h \ /usr/include/c++/4.0.0/bits/basic_string.tcc \ /usr/include/c++/4.0.0/iostream /usr/include/c++/4.0.0/ostream \ /usr/include/c++/4.0.0/ios /usr/include/c++/4.0.0/bits/localefwd.h \ /usr/include/c++/4.0.0/bits/ios_base.h \ /usr/include/c++/4.0.0/bits/locale_classes.h \ /usr/include/c++/4.0.0/streambuf \ /usr/include/c++/4.0.0/bits/streambuf.tcc \ /usr/include/c++/4.0.0/bits/basic_ios.h \ /usr/include/c++/4.0.0/bits/streambuf_iterator.h \ /usr/include/c++/4.0.0/bits/locale_facets.h \ /usr/include/c++/4.0.0/cwctype /usr/include/wctype.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/ctype_base.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/ctype_inline.h \ /usr/include/c++/4.0.0/bits/codecvt.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/time_members.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/messages_members.h \ /usr/include/c++/4.0.0/bits/basic_ios.tcc \ /usr/include/c++/4.0.0/bits/ostream.tcc /usr/include/c++/4.0.0/locale \ /usr/include/c++/4.0.0/bits/locale_facets.tcc \ /usr/include/c++/4.0.0/typeinfo /usr/include/c++/4.0.0/istream \ /usr/include/c++/4.0.0/bits/istream.tcc /usr/include/errno.h \ /usr/include/sys/errno.h /usr/include/sys/timeb.h \ /usr/include/sys/socket.h /usr/include/machine/param.h \ /usr/include/i386/param.h /usr/include/strings.h \ /usr/include/netinet/in.h /usr/include/netinet6/in6.h \ /usr/include/netinet/tcp.h /usr/include/arpa/inet.h \ /usr/include/sys/param.h /usr/include/netdb.h /usr/include/fcntl.h \ /usr/include/sys/fcntl.h /usr/include/math.h \ /usr/include/architecture/i386/math.h /usr/include/c++/4.0.0/utility \ /usr/include/c++/4.0.0/bits/stl_relops.h \ /usr/include/c++/4.0.0/iterator \ /usr/include/c++/4.0.0/bits/stream_iterator.h \ /usr/include/c++/4.0.0/set /usr/include/c++/4.0.0/bits/stl_tree.h \ /usr/include/c++/4.0.0/bits/stl_set.h \ /usr/include/c++/4.0.0/bits/stl_multiset.h /usr/include/c++/4.0.0/map \ /usr/include/c++/4.0.0/bits/stl_map.h \ /usr/include/c++/4.0.0/bits/stl_multimap.h wsdlH.h: wsdlStub.h: /usr/include/c++/4.0.0/vector: /usr/include/c++/4.0.0/bits/functexcept.h: /usr/include/c++/4.0.0/exception_defines.h: /usr/include/c++/4.0.0/bits/stl_algobase.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++config.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/os_defines.h: /usr/include/c++/4.0.0/cstring: /usr/include/c++/4.0.0/cstddef: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stddef.h: /usr/include/string.h: /usr/include/_types.h: /usr/include/sys/_types.h: /usr/include/sys/cdefs.h: /usr/include/machine/_types.h: /usr/include/i386/_types.h: /usr/include/c++/4.0.0/climits: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/limits.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/syslimits.h: /usr/include/limits.h: /usr/include/machine/limits.h: /usr/include/i386/limits.h: /usr/include/i386/_limits.h: /usr/include/sys/syslimits.h: /usr/include/c++/4.0.0/cstdlib: /usr/include/stdlib.h: /usr/include/sys/wait.h: /usr/include/sys/signal.h: /usr/include/sys/appleapiopts.h: /usr/include/machine/signal.h: /usr/include/i386/signal.h: /usr/include/sys/resource.h: /usr/include/machine/endian.h: /usr/include/i386/endian.h: /usr/include/sys/_endian.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdint.h: /usr/include/libkern/OSByteOrder.h: /usr/include/libkern/i386/OSByteOrder.h: /usr/include/alloca.h: /usr/include/machine/types.h: /usr/include/i386/types.h: /usr/include/c++/4.0.0/iosfwd: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++locale.h: /usr/include/c++/4.0.0/clocale: /usr/include/locale.h: /usr/include/_locale.h: /usr/include/c++/4.0.0/cstdio: /usr/include/stdio.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++io.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/gthr.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/gthr-default.h: /usr/include/pthread.h: /usr/include/pthread_impl.h: /usr/include/sched.h: /usr/include/time.h: /usr/include/machine/_limits.h: /usr/include/unistd.h: /usr/include/sys/unistd.h: /usr/include/sys/select.h: /usr/include/sys/types.h: /usr/include/signal.h: /usr/include/sys/time.h: /usr/include/c++/4.0.0/cctype: /usr/include/ctype.h: /usr/include/runetype.h: /usr/include/c++/4.0.0/bits/stringfwd.h: /usr/include/c++/4.0.0/bits/postypes.h: /usr/include/c++/4.0.0/cwchar: /usr/include/c++/4.0.0/ctime: /usr/include/wchar.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdarg.h: /usr/include/_wctype.h: /usr/include/c++/4.0.0/bits/stl_pair.h: /usr/include/c++/4.0.0/bits/cpp_type_traits.h: /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h: /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h: /usr/include/c++/4.0.0/bits/concept_check.h: /usr/include/c++/4.0.0/bits/stl_iterator.h: /usr/include/c++/4.0.0/debug/debug.h: /usr/include/c++/4.0.0/cassert: /usr/include/assert.h: /usr/include/c++/4.0.0/bits/allocator.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++allocator.h: /usr/include/c++/4.0.0/ext/new_allocator.h: /usr/include/c++/4.0.0/new: /usr/include/c++/4.0.0/exception: /usr/include/c++/4.0.0/bits/stl_construct.h: /usr/include/c++/4.0.0/bits/stl_uninitialized.h: /usr/include/c++/4.0.0/bits/stl_vector.h: /usr/include/c++/4.0.0/bits/stl_bvector.h: /usr/include/c++/4.0.0/bits/vector.tcc: includes.h: ../../soapcpp2/stdsoap2.h: ../../config.h: /usr/include/c++/4.0.0/string: /usr/include/c++/4.0.0/bits/char_traits.h: /usr/include/c++/4.0.0/memory: /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h: /usr/include/c++/4.0.0/limits: /usr/include/c++/4.0.0/bits/stl_function.h: /usr/include/c++/4.0.0/bits/basic_string.h: /usr/include/c++/4.0.0/bits/atomicity.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/atomic_word.h: /usr/include/c++/4.0.0/algorithm: /usr/include/c++/4.0.0/bits/stl_algo.h: /usr/include/c++/4.0.0/bits/stl_heap.h: /usr/include/c++/4.0.0/bits/stl_tempbuf.h: /usr/include/c++/4.0.0/bits/basic_string.tcc: /usr/include/c++/4.0.0/iostream: /usr/include/c++/4.0.0/ostream: /usr/include/c++/4.0.0/ios: /usr/include/c++/4.0.0/bits/localefwd.h: /usr/include/c++/4.0.0/bits/ios_base.h: /usr/include/c++/4.0.0/bits/locale_classes.h: /usr/include/c++/4.0.0/streambuf: /usr/include/c++/4.0.0/bits/streambuf.tcc: /usr/include/c++/4.0.0/bits/basic_ios.h: /usr/include/c++/4.0.0/bits/streambuf_iterator.h: /usr/include/c++/4.0.0/bits/locale_facets.h: /usr/include/c++/4.0.0/cwctype: /usr/include/wctype.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/ctype_base.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/ctype_inline.h: /usr/include/c++/4.0.0/bits/codecvt.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/time_members.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/messages_members.h: /usr/include/c++/4.0.0/bits/basic_ios.tcc: /usr/include/c++/4.0.0/bits/ostream.tcc: /usr/include/c++/4.0.0/locale: /usr/include/c++/4.0.0/bits/locale_facets.tcc: /usr/include/c++/4.0.0/typeinfo: /usr/include/c++/4.0.0/istream: /usr/include/c++/4.0.0/bits/istream.tcc: /usr/include/errno.h: /usr/include/sys/errno.h: /usr/include/sys/timeb.h: /usr/include/sys/socket.h: /usr/include/machine/param.h: /usr/include/i386/param.h: /usr/include/strings.h: /usr/include/netinet/in.h: /usr/include/netinet6/in6.h: /usr/include/netinet/tcp.h: /usr/include/arpa/inet.h: /usr/include/sys/param.h: /usr/include/netdb.h: /usr/include/fcntl.h: /usr/include/sys/fcntl.h: /usr/include/math.h: /usr/include/architecture/i386/math.h: /usr/include/c++/4.0.0/utility: /usr/include/c++/4.0.0/bits/stl_relops.h: /usr/include/c++/4.0.0/iterator: /usr/include/c++/4.0.0/bits/stream_iterator.h: /usr/include/c++/4.0.0/set: /usr/include/c++/4.0.0/bits/stl_tree.h: /usr/include/c++/4.0.0/bits/stl_set.h: /usr/include/c++/4.0.0/bits/stl_multiset.h: /usr/include/c++/4.0.0/map: /usr/include/c++/4.0.0/bits/stl_map.h: /usr/include/c++/4.0.0/bits/stl_multimap.h: gsoap-2.8.91/gsoap/wsdl/.deps/wsdl.Po0000644000175000017500000002726413525245163016651 0ustar ellertellertwsdl.o wsdl.o: wsdl.cpp wsdlH.h wsdlStub.h /usr/include/c++/4.0.0/vector \ /usr/include/c++/4.0.0/bits/functexcept.h \ /usr/include/c++/4.0.0/exception_defines.h \ /usr/include/c++/4.0.0/bits/stl_algobase.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++config.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/os_defines.h \ /usr/include/c++/4.0.0/cstring /usr/include/c++/4.0.0/cstddef \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stddef.h \ /usr/include/string.h /usr/include/_types.h /usr/include/sys/_types.h \ /usr/include/sys/cdefs.h /usr/include/machine/_types.h \ /usr/include/i386/_types.h /usr/include/c++/4.0.0/climits \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/limits.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/syslimits.h \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/i386/limits.h /usr/include/i386/_limits.h \ /usr/include/sys/syslimits.h /usr/include/c++/4.0.0/cstdlib \ /usr/include/stdlib.h /usr/include/sys/wait.h /usr/include/sys/signal.h \ /usr/include/sys/appleapiopts.h /usr/include/machine/signal.h \ /usr/include/i386/signal.h /usr/include/sys/resource.h \ /usr/include/machine/endian.h /usr/include/i386/endian.h \ /usr/include/sys/_endian.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdint.h \ /usr/include/libkern/OSByteOrder.h \ /usr/include/libkern/i386/OSByteOrder.h /usr/include/alloca.h \ /usr/include/machine/types.h /usr/include/i386/types.h \ /usr/include/c++/4.0.0/iosfwd \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++locale.h \ /usr/include/c++/4.0.0/clocale /usr/include/locale.h \ /usr/include/_locale.h /usr/include/c++/4.0.0/cstdio \ /usr/include/stdio.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++io.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/gthr.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/gthr-default.h \ /usr/include/pthread.h /usr/include/pthread_impl.h /usr/include/sched.h \ /usr/include/time.h /usr/include/machine/_limits.h \ /usr/include/unistd.h /usr/include/sys/unistd.h \ /usr/include/sys/select.h /usr/include/sys/types.h \ /usr/include/signal.h /usr/include/sys/time.h \ /usr/include/c++/4.0.0/cctype /usr/include/ctype.h \ /usr/include/runetype.h /usr/include/c++/4.0.0/bits/stringfwd.h \ /usr/include/c++/4.0.0/bits/postypes.h /usr/include/c++/4.0.0/cwchar \ /usr/include/c++/4.0.0/ctime /usr/include/wchar.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdarg.h \ /usr/include/_wctype.h /usr/include/c++/4.0.0/bits/stl_pair.h \ /usr/include/c++/4.0.0/bits/cpp_type_traits.h \ /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h \ /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h \ /usr/include/c++/4.0.0/bits/concept_check.h \ /usr/include/c++/4.0.0/bits/stl_iterator.h \ /usr/include/c++/4.0.0/debug/debug.h /usr/include/c++/4.0.0/cassert \ /usr/include/assert.h /usr/include/c++/4.0.0/bits/allocator.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++allocator.h \ /usr/include/c++/4.0.0/ext/new_allocator.h /usr/include/c++/4.0.0/new \ /usr/include/c++/4.0.0/exception \ /usr/include/c++/4.0.0/bits/stl_construct.h \ /usr/include/c++/4.0.0/bits/stl_uninitialized.h \ /usr/include/c++/4.0.0/bits/stl_vector.h \ /usr/include/c++/4.0.0/bits/stl_bvector.h \ /usr/include/c++/4.0.0/bits/vector.tcc includes.h \ ../../soapcpp2/stdsoap2.h ../../config.h /usr/include/c++/4.0.0/string \ /usr/include/c++/4.0.0/bits/char_traits.h /usr/include/c++/4.0.0/memory \ /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h \ /usr/include/c++/4.0.0/limits \ /usr/include/c++/4.0.0/bits/stl_function.h \ /usr/include/c++/4.0.0/bits/basic_string.h \ /usr/include/c++/4.0.0/bits/atomicity.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/atomic_word.h \ /usr/include/c++/4.0.0/algorithm /usr/include/c++/4.0.0/bits/stl_algo.h \ /usr/include/c++/4.0.0/bits/stl_heap.h \ /usr/include/c++/4.0.0/bits/stl_tempbuf.h \ /usr/include/c++/4.0.0/bits/basic_string.tcc \ /usr/include/c++/4.0.0/iostream /usr/include/c++/4.0.0/ostream \ /usr/include/c++/4.0.0/ios /usr/include/c++/4.0.0/bits/localefwd.h \ /usr/include/c++/4.0.0/bits/ios_base.h \ /usr/include/c++/4.0.0/bits/locale_classes.h \ /usr/include/c++/4.0.0/streambuf \ /usr/include/c++/4.0.0/bits/streambuf.tcc \ /usr/include/c++/4.0.0/bits/basic_ios.h \ /usr/include/c++/4.0.0/bits/streambuf_iterator.h \ /usr/include/c++/4.0.0/bits/locale_facets.h \ /usr/include/c++/4.0.0/cwctype /usr/include/wctype.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/ctype_base.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/ctype_inline.h \ /usr/include/c++/4.0.0/bits/codecvt.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/time_members.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/messages_members.h \ /usr/include/c++/4.0.0/bits/basic_ios.tcc \ /usr/include/c++/4.0.0/bits/ostream.tcc /usr/include/c++/4.0.0/locale \ /usr/include/c++/4.0.0/bits/locale_facets.tcc \ /usr/include/c++/4.0.0/typeinfo /usr/include/c++/4.0.0/istream \ /usr/include/c++/4.0.0/bits/istream.tcc /usr/include/errno.h \ /usr/include/sys/errno.h /usr/include/sys/timeb.h \ /usr/include/sys/socket.h /usr/include/machine/param.h \ /usr/include/i386/param.h /usr/include/strings.h \ /usr/include/netinet/in.h /usr/include/netinet6/in6.h \ /usr/include/netinet/tcp.h /usr/include/arpa/inet.h \ /usr/include/sys/param.h /usr/include/netdb.h /usr/include/fcntl.h \ /usr/include/sys/fcntl.h /usr/include/math.h \ /usr/include/architecture/i386/math.h /usr/include/c++/4.0.0/utility \ /usr/include/c++/4.0.0/bits/stl_relops.h \ /usr/include/c++/4.0.0/iterator \ /usr/include/c++/4.0.0/bits/stream_iterator.h \ /usr/include/c++/4.0.0/set /usr/include/c++/4.0.0/bits/stl_tree.h \ /usr/include/c++/4.0.0/bits/stl_set.h \ /usr/include/c++/4.0.0/bits/stl_multiset.h /usr/include/c++/4.0.0/map \ /usr/include/c++/4.0.0/bits/stl_map.h \ /usr/include/c++/4.0.0/bits/stl_multimap.h wsdlH.h: wsdlStub.h: /usr/include/c++/4.0.0/vector: /usr/include/c++/4.0.0/bits/functexcept.h: /usr/include/c++/4.0.0/exception_defines.h: /usr/include/c++/4.0.0/bits/stl_algobase.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++config.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/os_defines.h: /usr/include/c++/4.0.0/cstring: /usr/include/c++/4.0.0/cstddef: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stddef.h: /usr/include/string.h: /usr/include/_types.h: /usr/include/sys/_types.h: /usr/include/sys/cdefs.h: /usr/include/machine/_types.h: /usr/include/i386/_types.h: /usr/include/c++/4.0.0/climits: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/limits.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/syslimits.h: /usr/include/limits.h: /usr/include/machine/limits.h: /usr/include/i386/limits.h: /usr/include/i386/_limits.h: /usr/include/sys/syslimits.h: /usr/include/c++/4.0.0/cstdlib: /usr/include/stdlib.h: /usr/include/sys/wait.h: /usr/include/sys/signal.h: /usr/include/sys/appleapiopts.h: /usr/include/machine/signal.h: /usr/include/i386/signal.h: /usr/include/sys/resource.h: /usr/include/machine/endian.h: /usr/include/i386/endian.h: /usr/include/sys/_endian.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdint.h: /usr/include/libkern/OSByteOrder.h: /usr/include/libkern/i386/OSByteOrder.h: /usr/include/alloca.h: /usr/include/machine/types.h: /usr/include/i386/types.h: /usr/include/c++/4.0.0/iosfwd: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++locale.h: /usr/include/c++/4.0.0/clocale: /usr/include/locale.h: /usr/include/_locale.h: /usr/include/c++/4.0.0/cstdio: /usr/include/stdio.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++io.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/gthr.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/gthr-default.h: /usr/include/pthread.h: /usr/include/pthread_impl.h: /usr/include/sched.h: /usr/include/time.h: /usr/include/machine/_limits.h: /usr/include/unistd.h: /usr/include/sys/unistd.h: /usr/include/sys/select.h: /usr/include/sys/types.h: /usr/include/signal.h: /usr/include/sys/time.h: /usr/include/c++/4.0.0/cctype: /usr/include/ctype.h: /usr/include/runetype.h: /usr/include/c++/4.0.0/bits/stringfwd.h: /usr/include/c++/4.0.0/bits/postypes.h: /usr/include/c++/4.0.0/cwchar: /usr/include/c++/4.0.0/ctime: /usr/include/wchar.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdarg.h: /usr/include/_wctype.h: /usr/include/c++/4.0.0/bits/stl_pair.h: /usr/include/c++/4.0.0/bits/cpp_type_traits.h: /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h: /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h: /usr/include/c++/4.0.0/bits/concept_check.h: /usr/include/c++/4.0.0/bits/stl_iterator.h: /usr/include/c++/4.0.0/debug/debug.h: /usr/include/c++/4.0.0/cassert: /usr/include/assert.h: /usr/include/c++/4.0.0/bits/allocator.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++allocator.h: /usr/include/c++/4.0.0/ext/new_allocator.h: /usr/include/c++/4.0.0/new: /usr/include/c++/4.0.0/exception: /usr/include/c++/4.0.0/bits/stl_construct.h: /usr/include/c++/4.0.0/bits/stl_uninitialized.h: /usr/include/c++/4.0.0/bits/stl_vector.h: /usr/include/c++/4.0.0/bits/stl_bvector.h: /usr/include/c++/4.0.0/bits/vector.tcc: includes.h: ../../soapcpp2/stdsoap2.h: ../../config.h: /usr/include/c++/4.0.0/string: /usr/include/c++/4.0.0/bits/char_traits.h: /usr/include/c++/4.0.0/memory: /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h: /usr/include/c++/4.0.0/limits: /usr/include/c++/4.0.0/bits/stl_function.h: /usr/include/c++/4.0.0/bits/basic_string.h: /usr/include/c++/4.0.0/bits/atomicity.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/atomic_word.h: /usr/include/c++/4.0.0/algorithm: /usr/include/c++/4.0.0/bits/stl_algo.h: /usr/include/c++/4.0.0/bits/stl_heap.h: /usr/include/c++/4.0.0/bits/stl_tempbuf.h: /usr/include/c++/4.0.0/bits/basic_string.tcc: /usr/include/c++/4.0.0/iostream: /usr/include/c++/4.0.0/ostream: /usr/include/c++/4.0.0/ios: /usr/include/c++/4.0.0/bits/localefwd.h: /usr/include/c++/4.0.0/bits/ios_base.h: /usr/include/c++/4.0.0/bits/locale_classes.h: /usr/include/c++/4.0.0/streambuf: /usr/include/c++/4.0.0/bits/streambuf.tcc: /usr/include/c++/4.0.0/bits/basic_ios.h: /usr/include/c++/4.0.0/bits/streambuf_iterator.h: /usr/include/c++/4.0.0/bits/locale_facets.h: /usr/include/c++/4.0.0/cwctype: /usr/include/wctype.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/ctype_base.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/ctype_inline.h: /usr/include/c++/4.0.0/bits/codecvt.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/time_members.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/messages_members.h: /usr/include/c++/4.0.0/bits/basic_ios.tcc: /usr/include/c++/4.0.0/bits/ostream.tcc: /usr/include/c++/4.0.0/locale: /usr/include/c++/4.0.0/bits/locale_facets.tcc: /usr/include/c++/4.0.0/typeinfo: /usr/include/c++/4.0.0/istream: /usr/include/c++/4.0.0/bits/istream.tcc: /usr/include/errno.h: /usr/include/sys/errno.h: /usr/include/sys/timeb.h: /usr/include/sys/socket.h: /usr/include/machine/param.h: /usr/include/i386/param.h: /usr/include/strings.h: /usr/include/netinet/in.h: /usr/include/netinet6/in6.h: /usr/include/netinet/tcp.h: /usr/include/arpa/inet.h: /usr/include/sys/param.h: /usr/include/netdb.h: /usr/include/fcntl.h: /usr/include/sys/fcntl.h: /usr/include/math.h: /usr/include/architecture/i386/math.h: /usr/include/c++/4.0.0/utility: /usr/include/c++/4.0.0/bits/stl_relops.h: /usr/include/c++/4.0.0/iterator: /usr/include/c++/4.0.0/bits/stream_iterator.h: /usr/include/c++/4.0.0/set: /usr/include/c++/4.0.0/bits/stl_tree.h: /usr/include/c++/4.0.0/bits/stl_set.h: /usr/include/c++/4.0.0/bits/stl_multiset.h: /usr/include/c++/4.0.0/map: /usr/include/c++/4.0.0/bits/stl_map.h: /usr/include/c++/4.0.0/bits/stl_multimap.h: gsoap-2.8.91/gsoap/wsdl/.deps/mime.Po0000644000175000017500000002726413525245163016627 0ustar ellertellertmime.o mime.o: mime.cpp wsdlH.h wsdlStub.h /usr/include/c++/4.0.0/vector \ /usr/include/c++/4.0.0/bits/functexcept.h \ /usr/include/c++/4.0.0/exception_defines.h \ /usr/include/c++/4.0.0/bits/stl_algobase.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++config.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/os_defines.h \ /usr/include/c++/4.0.0/cstring /usr/include/c++/4.0.0/cstddef \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stddef.h \ /usr/include/string.h /usr/include/_types.h /usr/include/sys/_types.h \ /usr/include/sys/cdefs.h /usr/include/machine/_types.h \ /usr/include/i386/_types.h /usr/include/c++/4.0.0/climits \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/limits.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/syslimits.h \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/i386/limits.h /usr/include/i386/_limits.h \ /usr/include/sys/syslimits.h /usr/include/c++/4.0.0/cstdlib \ /usr/include/stdlib.h /usr/include/sys/wait.h /usr/include/sys/signal.h \ /usr/include/sys/appleapiopts.h /usr/include/machine/signal.h \ /usr/include/i386/signal.h /usr/include/sys/resource.h \ /usr/include/machine/endian.h /usr/include/i386/endian.h \ /usr/include/sys/_endian.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdint.h \ /usr/include/libkern/OSByteOrder.h \ /usr/include/libkern/i386/OSByteOrder.h /usr/include/alloca.h \ /usr/include/machine/types.h /usr/include/i386/types.h \ /usr/include/c++/4.0.0/iosfwd \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++locale.h \ /usr/include/c++/4.0.0/clocale /usr/include/locale.h \ /usr/include/_locale.h /usr/include/c++/4.0.0/cstdio \ /usr/include/stdio.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++io.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/gthr.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/gthr-default.h \ /usr/include/pthread.h /usr/include/pthread_impl.h /usr/include/sched.h \ /usr/include/time.h /usr/include/machine/_limits.h \ /usr/include/unistd.h /usr/include/sys/unistd.h \ /usr/include/sys/select.h /usr/include/sys/types.h \ /usr/include/signal.h /usr/include/sys/time.h \ /usr/include/c++/4.0.0/cctype /usr/include/ctype.h \ /usr/include/runetype.h /usr/include/c++/4.0.0/bits/stringfwd.h \ /usr/include/c++/4.0.0/bits/postypes.h /usr/include/c++/4.0.0/cwchar \ /usr/include/c++/4.0.0/ctime /usr/include/wchar.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdarg.h \ /usr/include/_wctype.h /usr/include/c++/4.0.0/bits/stl_pair.h \ /usr/include/c++/4.0.0/bits/cpp_type_traits.h \ /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h \ /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h \ /usr/include/c++/4.0.0/bits/concept_check.h \ /usr/include/c++/4.0.0/bits/stl_iterator.h \ /usr/include/c++/4.0.0/debug/debug.h /usr/include/c++/4.0.0/cassert \ /usr/include/assert.h /usr/include/c++/4.0.0/bits/allocator.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++allocator.h \ /usr/include/c++/4.0.0/ext/new_allocator.h /usr/include/c++/4.0.0/new \ /usr/include/c++/4.0.0/exception \ /usr/include/c++/4.0.0/bits/stl_construct.h \ /usr/include/c++/4.0.0/bits/stl_uninitialized.h \ /usr/include/c++/4.0.0/bits/stl_vector.h \ /usr/include/c++/4.0.0/bits/stl_bvector.h \ /usr/include/c++/4.0.0/bits/vector.tcc includes.h \ ../../soapcpp2/stdsoap2.h ../../config.h /usr/include/c++/4.0.0/string \ /usr/include/c++/4.0.0/bits/char_traits.h /usr/include/c++/4.0.0/memory \ /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h \ /usr/include/c++/4.0.0/limits \ /usr/include/c++/4.0.0/bits/stl_function.h \ /usr/include/c++/4.0.0/bits/basic_string.h \ /usr/include/c++/4.0.0/bits/atomicity.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/atomic_word.h \ /usr/include/c++/4.0.0/algorithm /usr/include/c++/4.0.0/bits/stl_algo.h \ /usr/include/c++/4.0.0/bits/stl_heap.h \ /usr/include/c++/4.0.0/bits/stl_tempbuf.h \ /usr/include/c++/4.0.0/bits/basic_string.tcc \ /usr/include/c++/4.0.0/iostream /usr/include/c++/4.0.0/ostream \ /usr/include/c++/4.0.0/ios /usr/include/c++/4.0.0/bits/localefwd.h \ /usr/include/c++/4.0.0/bits/ios_base.h \ /usr/include/c++/4.0.0/bits/locale_classes.h \ /usr/include/c++/4.0.0/streambuf \ /usr/include/c++/4.0.0/bits/streambuf.tcc \ /usr/include/c++/4.0.0/bits/basic_ios.h \ /usr/include/c++/4.0.0/bits/streambuf_iterator.h \ /usr/include/c++/4.0.0/bits/locale_facets.h \ /usr/include/c++/4.0.0/cwctype /usr/include/wctype.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/ctype_base.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/ctype_inline.h \ /usr/include/c++/4.0.0/bits/codecvt.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/time_members.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/messages_members.h \ /usr/include/c++/4.0.0/bits/basic_ios.tcc \ /usr/include/c++/4.0.0/bits/ostream.tcc /usr/include/c++/4.0.0/locale \ /usr/include/c++/4.0.0/bits/locale_facets.tcc \ /usr/include/c++/4.0.0/typeinfo /usr/include/c++/4.0.0/istream \ /usr/include/c++/4.0.0/bits/istream.tcc /usr/include/errno.h \ /usr/include/sys/errno.h /usr/include/sys/timeb.h \ /usr/include/sys/socket.h /usr/include/machine/param.h \ /usr/include/i386/param.h /usr/include/strings.h \ /usr/include/netinet/in.h /usr/include/netinet6/in6.h \ /usr/include/netinet/tcp.h /usr/include/arpa/inet.h \ /usr/include/sys/param.h /usr/include/netdb.h /usr/include/fcntl.h \ /usr/include/sys/fcntl.h /usr/include/math.h \ /usr/include/architecture/i386/math.h /usr/include/c++/4.0.0/utility \ /usr/include/c++/4.0.0/bits/stl_relops.h \ /usr/include/c++/4.0.0/iterator \ /usr/include/c++/4.0.0/bits/stream_iterator.h \ /usr/include/c++/4.0.0/set /usr/include/c++/4.0.0/bits/stl_tree.h \ /usr/include/c++/4.0.0/bits/stl_set.h \ /usr/include/c++/4.0.0/bits/stl_multiset.h /usr/include/c++/4.0.0/map \ /usr/include/c++/4.0.0/bits/stl_map.h \ /usr/include/c++/4.0.0/bits/stl_multimap.h wsdlH.h: wsdlStub.h: /usr/include/c++/4.0.0/vector: /usr/include/c++/4.0.0/bits/functexcept.h: /usr/include/c++/4.0.0/exception_defines.h: /usr/include/c++/4.0.0/bits/stl_algobase.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++config.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/os_defines.h: /usr/include/c++/4.0.0/cstring: /usr/include/c++/4.0.0/cstddef: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stddef.h: /usr/include/string.h: /usr/include/_types.h: /usr/include/sys/_types.h: /usr/include/sys/cdefs.h: /usr/include/machine/_types.h: /usr/include/i386/_types.h: /usr/include/c++/4.0.0/climits: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/limits.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/syslimits.h: /usr/include/limits.h: /usr/include/machine/limits.h: /usr/include/i386/limits.h: /usr/include/i386/_limits.h: /usr/include/sys/syslimits.h: /usr/include/c++/4.0.0/cstdlib: /usr/include/stdlib.h: /usr/include/sys/wait.h: /usr/include/sys/signal.h: /usr/include/sys/appleapiopts.h: /usr/include/machine/signal.h: /usr/include/i386/signal.h: /usr/include/sys/resource.h: /usr/include/machine/endian.h: /usr/include/i386/endian.h: /usr/include/sys/_endian.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdint.h: /usr/include/libkern/OSByteOrder.h: /usr/include/libkern/i386/OSByteOrder.h: /usr/include/alloca.h: /usr/include/machine/types.h: /usr/include/i386/types.h: /usr/include/c++/4.0.0/iosfwd: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++locale.h: /usr/include/c++/4.0.0/clocale: /usr/include/locale.h: /usr/include/_locale.h: /usr/include/c++/4.0.0/cstdio: /usr/include/stdio.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++io.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/gthr.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/gthr-default.h: /usr/include/pthread.h: /usr/include/pthread_impl.h: /usr/include/sched.h: /usr/include/time.h: /usr/include/machine/_limits.h: /usr/include/unistd.h: /usr/include/sys/unistd.h: /usr/include/sys/select.h: /usr/include/sys/types.h: /usr/include/signal.h: /usr/include/sys/time.h: /usr/include/c++/4.0.0/cctype: /usr/include/ctype.h: /usr/include/runetype.h: /usr/include/c++/4.0.0/bits/stringfwd.h: /usr/include/c++/4.0.0/bits/postypes.h: /usr/include/c++/4.0.0/cwchar: /usr/include/c++/4.0.0/ctime: /usr/include/wchar.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdarg.h: /usr/include/_wctype.h: /usr/include/c++/4.0.0/bits/stl_pair.h: /usr/include/c++/4.0.0/bits/cpp_type_traits.h: /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h: /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h: /usr/include/c++/4.0.0/bits/concept_check.h: /usr/include/c++/4.0.0/bits/stl_iterator.h: /usr/include/c++/4.0.0/debug/debug.h: /usr/include/c++/4.0.0/cassert: /usr/include/assert.h: /usr/include/c++/4.0.0/bits/allocator.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++allocator.h: /usr/include/c++/4.0.0/ext/new_allocator.h: /usr/include/c++/4.0.0/new: /usr/include/c++/4.0.0/exception: /usr/include/c++/4.0.0/bits/stl_construct.h: /usr/include/c++/4.0.0/bits/stl_uninitialized.h: /usr/include/c++/4.0.0/bits/stl_vector.h: /usr/include/c++/4.0.0/bits/stl_bvector.h: /usr/include/c++/4.0.0/bits/vector.tcc: includes.h: ../../soapcpp2/stdsoap2.h: ../../config.h: /usr/include/c++/4.0.0/string: /usr/include/c++/4.0.0/bits/char_traits.h: /usr/include/c++/4.0.0/memory: /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h: /usr/include/c++/4.0.0/limits: /usr/include/c++/4.0.0/bits/stl_function.h: /usr/include/c++/4.0.0/bits/basic_string.h: /usr/include/c++/4.0.0/bits/atomicity.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/atomic_word.h: /usr/include/c++/4.0.0/algorithm: /usr/include/c++/4.0.0/bits/stl_algo.h: /usr/include/c++/4.0.0/bits/stl_heap.h: /usr/include/c++/4.0.0/bits/stl_tempbuf.h: /usr/include/c++/4.0.0/bits/basic_string.tcc: /usr/include/c++/4.0.0/iostream: /usr/include/c++/4.0.0/ostream: /usr/include/c++/4.0.0/ios: /usr/include/c++/4.0.0/bits/localefwd.h: /usr/include/c++/4.0.0/bits/ios_base.h: /usr/include/c++/4.0.0/bits/locale_classes.h: /usr/include/c++/4.0.0/streambuf: /usr/include/c++/4.0.0/bits/streambuf.tcc: /usr/include/c++/4.0.0/bits/basic_ios.h: /usr/include/c++/4.0.0/bits/streambuf_iterator.h: /usr/include/c++/4.0.0/bits/locale_facets.h: /usr/include/c++/4.0.0/cwctype: /usr/include/wctype.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/ctype_base.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/ctype_inline.h: /usr/include/c++/4.0.0/bits/codecvt.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/time_members.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/messages_members.h: /usr/include/c++/4.0.0/bits/basic_ios.tcc: /usr/include/c++/4.0.0/bits/ostream.tcc: /usr/include/c++/4.0.0/locale: /usr/include/c++/4.0.0/bits/locale_facets.tcc: /usr/include/c++/4.0.0/typeinfo: /usr/include/c++/4.0.0/istream: /usr/include/c++/4.0.0/bits/istream.tcc: /usr/include/errno.h: /usr/include/sys/errno.h: /usr/include/sys/timeb.h: /usr/include/sys/socket.h: /usr/include/machine/param.h: /usr/include/i386/param.h: /usr/include/strings.h: /usr/include/netinet/in.h: /usr/include/netinet6/in6.h: /usr/include/netinet/tcp.h: /usr/include/arpa/inet.h: /usr/include/sys/param.h: /usr/include/netdb.h: /usr/include/fcntl.h: /usr/include/sys/fcntl.h: /usr/include/math.h: /usr/include/architecture/i386/math.h: /usr/include/c++/4.0.0/utility: /usr/include/c++/4.0.0/bits/stl_relops.h: /usr/include/c++/4.0.0/iterator: /usr/include/c++/4.0.0/bits/stream_iterator.h: /usr/include/c++/4.0.0/set: /usr/include/c++/4.0.0/bits/stl_tree.h: /usr/include/c++/4.0.0/bits/stl_set.h: /usr/include/c++/4.0.0/bits/stl_multiset.h: /usr/include/c++/4.0.0/map: /usr/include/c++/4.0.0/bits/stl_map.h: /usr/include/c++/4.0.0/bits/stl_multimap.h: gsoap-2.8.91/gsoap/wsdl/.deps/wsdl2h-threads.Po0000644000175000017500000004201313525245163020520 0ustar ellertellertwsdl2h-threads.o: ../../gsoap/plugin/threads.c \ ../../gsoap/plugin/threads.h ../../gsoap/stdsoap2.h ../../config.h \ /usr/include/stdlib.h /usr/include/Availability.h \ /usr/include/AvailabilityInternal.h /usr/include/_types.h \ /usr/include/sys/_types.h /usr/include/sys/cdefs.h \ /usr/include/sys/_symbol_aliasing.h \ /usr/include/sys/_posix_availability.h /usr/include/machine/_types.h \ /usr/include/i386/_types.h /usr/include/sys/_pthread/_pthread_types.h \ /usr/include/sys/wait.h /usr/include/sys/_types/_pid_t.h \ /usr/include/sys/_types/_id_t.h /usr/include/sys/signal.h \ /usr/include/sys/appleapiopts.h /usr/include/machine/signal.h \ /usr/include/i386/signal.h /usr/include/machine/_mcontext.h \ /usr/include/i386/_mcontext.h /usr/include/mach/i386/_structs.h \ /usr/include/sys/_pthread/_pthread_attr_t.h \ /usr/include/sys/_types/_sigaltstack.h \ /usr/include/sys/_types/_ucontext.h \ /usr/include/sys/_types/_sigset_t.h /usr/include/sys/_types/_size_t.h \ /usr/include/sys/_types/_uid_t.h /usr/include/sys/resource.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/stdint.h \ /usr/include/stdint.h /usr/include/sys/_types/_int8_t.h \ /usr/include/sys/_types/_int16_t.h /usr/include/sys/_types/_int32_t.h \ /usr/include/sys/_types/_int64_t.h /usr/include/_types/_uint8_t.h \ /usr/include/_types/_uint16_t.h /usr/include/_types/_uint32_t.h \ /usr/include/_types/_uint64_t.h /usr/include/sys/_types/_intptr_t.h \ /usr/include/sys/_types/_uintptr_t.h /usr/include/_types/_intmax_t.h \ /usr/include/_types/_uintmax_t.h /usr/include/sys/_types/_timeval.h \ /usr/include/machine/endian.h /usr/include/i386/endian.h \ /usr/include/sys/_endian.h /usr/include/libkern/_OSByteOrder.h \ /usr/include/libkern/i386/_OSByteOrder.h /usr/include/alloca.h \ /usr/include/sys/_types/_ct_rune_t.h /usr/include/sys/_types/_rune_t.h \ /usr/include/sys/_types/_wchar_t.h /usr/include/sys/_types/_null.h \ /usr/include/machine/types.h /usr/include/i386/types.h \ /usr/include/sys/_types/_u_int8_t.h \ /usr/include/sys/_types/_u_int16_t.h \ /usr/include/sys/_types/_u_int32_t.h \ /usr/include/sys/_types/_u_int64_t.h /usr/include/sys/_types/_dev_t.h \ /usr/include/sys/_types/_mode_t.h /usr/include/stdio.h \ /usr/include/sys/_types/_va_list.h /usr/include/sys/stdio.h \ /usr/include/sys/_types/_off_t.h /usr/include/sys/_types/_ssize_t.h \ /usr/include/secure/_stdio.h /usr/include/secure/_common.h \ /usr/include/string.h /usr/include/sys/_types/_rsize_t.h \ /usr/include/sys/_types/_errno_t.h /usr/include/strings.h \ /usr/include/secure/_string.h /usr/include/ctype.h \ /usr/include/runetype.h /usr/include/sys/_types/_wint_t.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/limits.h \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/i386/limits.h /usr/include/i386/_limits.h \ /usr/include/sys/syslimits.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/float.h \ /usr/include/math.h /usr/include/locale.h /usr/include/_locale.h \ /usr/include/xlocale.h /usr/include/_xlocale.h \ /usr/include/xlocale/_ctype.h /usr/include/xlocale/_stdio.h \ /usr/include/xlocale/_stdlib.h /usr/include/xlocale/_string.h \ /usr/include/poll.h /usr/include/sys/poll.h /usr/include/errno.h \ /usr/include/sys/errno.h /usr/include/sys/types.h \ /usr/include/sys/_types/_blkcnt_t.h \ /usr/include/sys/_types/_blksize_t.h /usr/include/sys/_types/_gid_t.h \ /usr/include/sys/_types/_in_addr_t.h \ /usr/include/sys/_types/_in_port_t.h /usr/include/sys/_types/_ino_t.h \ /usr/include/sys/_types/_ino64_t.h /usr/include/sys/_types/_key_t.h \ /usr/include/sys/_types/_nlink_t.h /usr/include/sys/_types/_clock_t.h \ /usr/include/sys/_types/_time_t.h \ /usr/include/sys/_types/_useconds_t.h \ /usr/include/sys/_types/_suseconds_t.h \ /usr/include/sys/_types/_fd_def.h \ /usr/include/sys/_types/_fd_setsize.h \ /usr/include/sys/_types/_fd_set.h /usr/include/sys/_types/_fd_clr.h \ /usr/include/sys/_types/_fd_zero.h /usr/include/sys/_types/_fd_isset.h \ /usr/include/sys/_types/_fd_copy.h \ /usr/include/sys/_pthread/_pthread_cond_t.h \ /usr/include/sys/_pthread/_pthread_condattr_t.h \ /usr/include/sys/_pthread/_pthread_mutex_t.h \ /usr/include/sys/_pthread/_pthread_mutexattr_t.h \ /usr/include/sys/_pthread/_pthread_once_t.h \ /usr/include/sys/_pthread/_pthread_rwlock_t.h \ /usr/include/sys/_pthread/_pthread_rwlockattr_t.h \ /usr/include/sys/_pthread/_pthread_t.h \ /usr/include/sys/_pthread/_pthread_key_t.h \ /usr/include/sys/_types/_fsblkcnt_t.h \ /usr/include/sys/_types/_fsfilcnt_t.h /usr/include/sys/timeb.h \ /usr/include/time.h /usr/include/sys/_types/_timespec.h \ /usr/include/xlocale/_time.h /usr/include/sys/time.h \ /usr/include/sys/_types/_timeval64.h /usr/include/sys/_select.h \ /usr/include/sys/socket.h /usr/include/machine/_param.h \ /usr/include/i386/_param.h /usr/include/net/net_kev.h \ /usr/include/sys/_types/_sa_family_t.h \ /usr/include/sys/_types/_socklen_t.h \ /usr/include/sys/_types/_iovec_t.h /usr/include/netinet/in.h \ /usr/include/netinet6/in6.h /usr/include/netinet/tcp.h \ /usr/include/arpa/inet.h /usr/include/netdb.h /usr/include/unistd.h \ /usr/include/sys/unistd.h /usr/include/sys/_types/_posix_vdisable.h \ /usr/include/sys/_types/_seek_set.h /usr/include/sys/select.h \ /usr/include/sys/_types/_uuid_t.h /usr/include/gethostuuid.h \ /usr/include/fcntl.h /usr/include/sys/fcntl.h \ /usr/include/sys/_types/_o_sync.h /usr/include/sys/_types/_o_dsync.h \ /usr/include/sys/_types/_s_ifmt.h /usr/include/sys/_types/_filesec_t.h \ /usr/local/opt/openssl/include/openssl/bio.h \ /usr/local/opt/openssl/include/openssl/e_os2.h \ /usr/local/opt/openssl/include/openssl/opensslconf.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/stdarg.h \ /usr/local/opt/openssl/include/openssl/crypto.h \ /usr/local/opt/openssl/include/openssl/stack.h \ /usr/local/opt/openssl/include/openssl/safestack.h \ /usr/local/opt/openssl/include/openssl/opensslv.h \ /usr/local/opt/openssl/include/openssl/ossl_typ.h \ /usr/local/opt/openssl/include/openssl/symhacks.h \ /usr/local/opt/openssl/include/openssl/err.h \ /usr/local/opt/openssl/include/openssl/lhash.h \ /usr/local/opt/openssl/include/openssl/rand.h \ /usr/local/opt/openssl/include/openssl/ssl.h \ /usr/local/opt/openssl/include/openssl/comp.h \ /usr/local/opt/openssl/include/openssl/x509.h \ /usr/local/opt/openssl/include/openssl/buffer.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/stddef.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/__stddef_max_align_t.h \ /usr/local/opt/openssl/include/openssl/evp.h \ /usr/local/opt/openssl/include/openssl/objects.h \ /usr/local/opt/openssl/include/openssl/obj_mac.h \ /usr/local/opt/openssl/include/openssl/asn1.h \ /usr/local/opt/openssl/include/openssl/bn.h \ /usr/local/opt/openssl/include/openssl/ec.h \ /usr/local/opt/openssl/include/openssl/ecdsa.h \ /usr/local/opt/openssl/include/openssl/ecdh.h \ /usr/local/opt/openssl/include/openssl/rsa.h \ /usr/local/opt/openssl/include/openssl/dsa.h \ /usr/local/opt/openssl/include/openssl/dh.h \ /usr/local/opt/openssl/include/openssl/sha.h \ /usr/local/opt/openssl/include/openssl/x509_vfy.h \ /usr/local/opt/openssl/include/openssl/pkcs7.h \ /usr/local/opt/openssl/include/openssl/pem.h \ /usr/local/opt/openssl/include/openssl/pem2.h \ /usr/local/opt/openssl/include/openssl/hmac.h \ /usr/local/opt/openssl/include/openssl/kssl.h \ /usr/local/opt/openssl/include/openssl/ssl2.h \ /usr/local/opt/openssl/include/openssl/ssl3.h \ /usr/local/opt/openssl/include/openssl/tls1.h \ /usr/local/opt/openssl/include/openssl/dtls1.h \ /usr/local/opt/openssl/include/openssl/pqueue.h \ /usr/local/opt/openssl/include/openssl/ssl23.h \ /usr/local/opt/openssl/include/openssl/srtp.h \ /usr/local/opt/openssl/include/openssl/x509v3.h \ /usr/local/opt/openssl/include/openssl/conf.h /usr/include/zlib.h \ /usr/include/zconf.h \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/inttypes.h \ /usr/include/inttypes.h /usr/include/xlocale/_inttypes.h \ /usr/include/pthread.h /usr/include/pthread/pthread_impl.h \ /usr/include/pthread/sched.h /usr/include/pthread/qos.h \ /usr/include/sys/qos.h /usr/include/sys/_types/_mach_port_t.h ../../gsoap/plugin/threads.h: ../../gsoap/stdsoap2.h: ../../config.h: /usr/include/stdlib.h: /usr/include/Availability.h: /usr/include/AvailabilityInternal.h: /usr/include/_types.h: /usr/include/sys/_types.h: /usr/include/sys/cdefs.h: /usr/include/sys/_symbol_aliasing.h: /usr/include/sys/_posix_availability.h: /usr/include/machine/_types.h: /usr/include/i386/_types.h: /usr/include/sys/_pthread/_pthread_types.h: /usr/include/sys/wait.h: /usr/include/sys/_types/_pid_t.h: /usr/include/sys/_types/_id_t.h: /usr/include/sys/signal.h: /usr/include/sys/appleapiopts.h: /usr/include/machine/signal.h: /usr/include/i386/signal.h: /usr/include/machine/_mcontext.h: /usr/include/i386/_mcontext.h: /usr/include/mach/i386/_structs.h: /usr/include/sys/_pthread/_pthread_attr_t.h: /usr/include/sys/_types/_sigaltstack.h: /usr/include/sys/_types/_ucontext.h: /usr/include/sys/_types/_sigset_t.h: /usr/include/sys/_types/_size_t.h: /usr/include/sys/_types/_uid_t.h: /usr/include/sys/resource.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/stdint.h: /usr/include/stdint.h: /usr/include/sys/_types/_int8_t.h: /usr/include/sys/_types/_int16_t.h: /usr/include/sys/_types/_int32_t.h: /usr/include/sys/_types/_int64_t.h: /usr/include/_types/_uint8_t.h: /usr/include/_types/_uint16_t.h: /usr/include/_types/_uint32_t.h: /usr/include/_types/_uint64_t.h: /usr/include/sys/_types/_intptr_t.h: /usr/include/sys/_types/_uintptr_t.h: /usr/include/_types/_intmax_t.h: /usr/include/_types/_uintmax_t.h: /usr/include/sys/_types/_timeval.h: /usr/include/machine/endian.h: /usr/include/i386/endian.h: /usr/include/sys/_endian.h: /usr/include/libkern/_OSByteOrder.h: /usr/include/libkern/i386/_OSByteOrder.h: /usr/include/alloca.h: /usr/include/sys/_types/_ct_rune_t.h: /usr/include/sys/_types/_rune_t.h: /usr/include/sys/_types/_wchar_t.h: /usr/include/sys/_types/_null.h: /usr/include/machine/types.h: /usr/include/i386/types.h: /usr/include/sys/_types/_u_int8_t.h: /usr/include/sys/_types/_u_int16_t.h: /usr/include/sys/_types/_u_int32_t.h: /usr/include/sys/_types/_u_int64_t.h: /usr/include/sys/_types/_dev_t.h: /usr/include/sys/_types/_mode_t.h: /usr/include/stdio.h: /usr/include/sys/_types/_va_list.h: /usr/include/sys/stdio.h: /usr/include/sys/_types/_off_t.h: /usr/include/sys/_types/_ssize_t.h: /usr/include/secure/_stdio.h: /usr/include/secure/_common.h: /usr/include/string.h: /usr/include/sys/_types/_rsize_t.h: /usr/include/sys/_types/_errno_t.h: /usr/include/strings.h: /usr/include/secure/_string.h: /usr/include/ctype.h: /usr/include/runetype.h: /usr/include/sys/_types/_wint_t.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/limits.h: /usr/include/limits.h: /usr/include/machine/limits.h: /usr/include/i386/limits.h: /usr/include/i386/_limits.h: /usr/include/sys/syslimits.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/float.h: /usr/include/math.h: /usr/include/locale.h: /usr/include/_locale.h: /usr/include/xlocale.h: /usr/include/_xlocale.h: /usr/include/xlocale/_ctype.h: /usr/include/xlocale/_stdio.h: /usr/include/xlocale/_stdlib.h: /usr/include/xlocale/_string.h: /usr/include/poll.h: /usr/include/sys/poll.h: /usr/include/errno.h: /usr/include/sys/errno.h: /usr/include/sys/types.h: /usr/include/sys/_types/_blkcnt_t.h: /usr/include/sys/_types/_blksize_t.h: /usr/include/sys/_types/_gid_t.h: /usr/include/sys/_types/_in_addr_t.h: /usr/include/sys/_types/_in_port_t.h: /usr/include/sys/_types/_ino_t.h: /usr/include/sys/_types/_ino64_t.h: /usr/include/sys/_types/_key_t.h: /usr/include/sys/_types/_nlink_t.h: /usr/include/sys/_types/_clock_t.h: /usr/include/sys/_types/_time_t.h: /usr/include/sys/_types/_useconds_t.h: /usr/include/sys/_types/_suseconds_t.h: /usr/include/sys/_types/_fd_def.h: /usr/include/sys/_types/_fd_setsize.h: /usr/include/sys/_types/_fd_set.h: /usr/include/sys/_types/_fd_clr.h: /usr/include/sys/_types/_fd_zero.h: /usr/include/sys/_types/_fd_isset.h: /usr/include/sys/_types/_fd_copy.h: /usr/include/sys/_pthread/_pthread_cond_t.h: /usr/include/sys/_pthread/_pthread_condattr_t.h: /usr/include/sys/_pthread/_pthread_mutex_t.h: /usr/include/sys/_pthread/_pthread_mutexattr_t.h: /usr/include/sys/_pthread/_pthread_once_t.h: /usr/include/sys/_pthread/_pthread_rwlock_t.h: /usr/include/sys/_pthread/_pthread_rwlockattr_t.h: /usr/include/sys/_pthread/_pthread_t.h: /usr/include/sys/_pthread/_pthread_key_t.h: /usr/include/sys/_types/_fsblkcnt_t.h: /usr/include/sys/_types/_fsfilcnt_t.h: /usr/include/sys/timeb.h: /usr/include/time.h: /usr/include/sys/_types/_timespec.h: /usr/include/xlocale/_time.h: /usr/include/sys/time.h: /usr/include/sys/_types/_timeval64.h: /usr/include/sys/_select.h: /usr/include/sys/socket.h: /usr/include/machine/_param.h: /usr/include/i386/_param.h: /usr/include/net/net_kev.h: /usr/include/sys/_types/_sa_family_t.h: /usr/include/sys/_types/_socklen_t.h: /usr/include/sys/_types/_iovec_t.h: /usr/include/netinet/in.h: /usr/include/netinet6/in6.h: /usr/include/netinet/tcp.h: /usr/include/arpa/inet.h: /usr/include/netdb.h: /usr/include/unistd.h: /usr/include/sys/unistd.h: /usr/include/sys/_types/_posix_vdisable.h: /usr/include/sys/_types/_seek_set.h: /usr/include/sys/select.h: /usr/include/sys/_types/_uuid_t.h: /usr/include/gethostuuid.h: /usr/include/fcntl.h: /usr/include/sys/fcntl.h: /usr/include/sys/_types/_o_sync.h: /usr/include/sys/_types/_o_dsync.h: /usr/include/sys/_types/_s_ifmt.h: /usr/include/sys/_types/_filesec_t.h: /usr/local/opt/openssl/include/openssl/bio.h: /usr/local/opt/openssl/include/openssl/e_os2.h: /usr/local/opt/openssl/include/openssl/opensslconf.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/stdarg.h: /usr/local/opt/openssl/include/openssl/crypto.h: /usr/local/opt/openssl/include/openssl/stack.h: /usr/local/opt/openssl/include/openssl/safestack.h: /usr/local/opt/openssl/include/openssl/opensslv.h: /usr/local/opt/openssl/include/openssl/ossl_typ.h: /usr/local/opt/openssl/include/openssl/symhacks.h: /usr/local/opt/openssl/include/openssl/err.h: /usr/local/opt/openssl/include/openssl/lhash.h: /usr/local/opt/openssl/include/openssl/rand.h: /usr/local/opt/openssl/include/openssl/ssl.h: /usr/local/opt/openssl/include/openssl/comp.h: /usr/local/opt/openssl/include/openssl/x509.h: /usr/local/opt/openssl/include/openssl/buffer.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/stddef.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/__stddef_max_align_t.h: /usr/local/opt/openssl/include/openssl/evp.h: /usr/local/opt/openssl/include/openssl/objects.h: /usr/local/opt/openssl/include/openssl/obj_mac.h: /usr/local/opt/openssl/include/openssl/asn1.h: /usr/local/opt/openssl/include/openssl/bn.h: /usr/local/opt/openssl/include/openssl/ec.h: /usr/local/opt/openssl/include/openssl/ecdsa.h: /usr/local/opt/openssl/include/openssl/ecdh.h: /usr/local/opt/openssl/include/openssl/rsa.h: /usr/local/opt/openssl/include/openssl/dsa.h: /usr/local/opt/openssl/include/openssl/dh.h: /usr/local/opt/openssl/include/openssl/sha.h: /usr/local/opt/openssl/include/openssl/x509_vfy.h: /usr/local/opt/openssl/include/openssl/pkcs7.h: /usr/local/opt/openssl/include/openssl/pem.h: /usr/local/opt/openssl/include/openssl/pem2.h: /usr/local/opt/openssl/include/openssl/hmac.h: /usr/local/opt/openssl/include/openssl/kssl.h: /usr/local/opt/openssl/include/openssl/ssl2.h: /usr/local/opt/openssl/include/openssl/ssl3.h: /usr/local/opt/openssl/include/openssl/tls1.h: /usr/local/opt/openssl/include/openssl/dtls1.h: /usr/local/opt/openssl/include/openssl/pqueue.h: /usr/local/opt/openssl/include/openssl/ssl23.h: /usr/local/opt/openssl/include/openssl/srtp.h: /usr/local/opt/openssl/include/openssl/x509v3.h: /usr/local/opt/openssl/include/openssl/conf.h: /usr/include/zlib.h: /usr/include/zconf.h: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/inttypes.h: /usr/include/inttypes.h: /usr/include/xlocale/_inttypes.h: /usr/include/pthread.h: /usr/include/pthread/pthread_impl.h: /usr/include/pthread/sched.h: /usr/include/pthread/qos.h: /usr/include/sys/qos.h: /usr/include/sys/_types/_mach_port_t.h: gsoap-2.8.91/gsoap/wsdl/.deps/service.Po0000644000175000017500000002735513525245163017341 0ustar ellertellertservice.o service.o: service.cpp types.h includes.h \ ../../soapcpp2/stdsoap2.h ../../config.h /usr/include/stdlib.h \ /usr/include/sys/cdefs.h /usr/include/_types.h \ /usr/include/sys/_types.h /usr/include/machine/_types.h \ /usr/include/i386/_types.h /usr/include/sys/wait.h \ /usr/include/sys/signal.h /usr/include/sys/appleapiopts.h \ /usr/include/machine/signal.h /usr/include/i386/signal.h \ /usr/include/sys/resource.h /usr/include/machine/endian.h \ /usr/include/i386/endian.h /usr/include/sys/_endian.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdint.h \ /usr/include/libkern/OSByteOrder.h \ /usr/include/libkern/i386/OSByteOrder.h /usr/include/alloca.h \ /usr/include/machine/types.h /usr/include/i386/types.h \ /usr/include/stdio.h /usr/include/string.h /usr/include/ctype.h \ /usr/include/runetype.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/limits.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/syslimits.h \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/i386/limits.h /usr/include/i386/_limits.h \ /usr/include/sys/syslimits.h /usr/include/c++/4.0.0/string \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++config.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/os_defines.h \ /usr/include/c++/4.0.0/bits/stringfwd.h \ /usr/include/c++/4.0.0/bits/char_traits.h \ /usr/include/c++/4.0.0/cstring /usr/include/c++/4.0.0/cstddef \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stddef.h \ /usr/include/c++/4.0.0/bits/stl_algobase.h \ /usr/include/c++/4.0.0/climits /usr/include/c++/4.0.0/cstdlib \ /usr/include/c++/4.0.0/iosfwd \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++locale.h \ /usr/include/c++/4.0.0/clocale /usr/include/locale.h \ /usr/include/_locale.h /usr/include/c++/4.0.0/cstdio \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++io.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/gthr.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/gthr-default.h \ /usr/include/pthread.h /usr/include/pthread_impl.h /usr/include/sched.h \ /usr/include/time.h /usr/include/machine/_limits.h \ /usr/include/unistd.h /usr/include/sys/unistd.h \ /usr/include/sys/select.h /usr/include/sys/types.h \ /usr/include/signal.h /usr/include/sys/time.h \ /usr/include/c++/4.0.0/cctype /usr/include/c++/4.0.0/bits/postypes.h \ /usr/include/c++/4.0.0/cwchar /usr/include/c++/4.0.0/ctime \ /usr/include/wchar.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdarg.h \ /usr/include/_wctype.h /usr/include/c++/4.0.0/bits/functexcept.h \ /usr/include/c++/4.0.0/exception_defines.h \ /usr/include/c++/4.0.0/bits/stl_pair.h \ /usr/include/c++/4.0.0/bits/cpp_type_traits.h \ /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h \ /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h \ /usr/include/c++/4.0.0/bits/concept_check.h \ /usr/include/c++/4.0.0/bits/stl_iterator.h \ /usr/include/c++/4.0.0/debug/debug.h /usr/include/c++/4.0.0/cassert \ /usr/include/assert.h /usr/include/c++/4.0.0/memory \ /usr/include/c++/4.0.0/bits/allocator.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++allocator.h \ /usr/include/c++/4.0.0/ext/new_allocator.h /usr/include/c++/4.0.0/new \ /usr/include/c++/4.0.0/exception \ /usr/include/c++/4.0.0/bits/stl_construct.h \ /usr/include/c++/4.0.0/bits/stl_uninitialized.h \ /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h \ /usr/include/c++/4.0.0/limits \ /usr/include/c++/4.0.0/bits/stl_function.h \ /usr/include/c++/4.0.0/bits/basic_string.h \ /usr/include/c++/4.0.0/bits/atomicity.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/atomic_word.h \ /usr/include/c++/4.0.0/algorithm /usr/include/c++/4.0.0/bits/stl_algo.h \ /usr/include/c++/4.0.0/bits/stl_heap.h \ /usr/include/c++/4.0.0/bits/stl_tempbuf.h \ /usr/include/c++/4.0.0/bits/basic_string.tcc \ /usr/include/c++/4.0.0/iostream /usr/include/c++/4.0.0/ostream \ /usr/include/c++/4.0.0/ios /usr/include/c++/4.0.0/bits/localefwd.h \ /usr/include/c++/4.0.0/bits/ios_base.h \ /usr/include/c++/4.0.0/bits/locale_classes.h \ /usr/include/c++/4.0.0/streambuf \ /usr/include/c++/4.0.0/bits/streambuf.tcc \ /usr/include/c++/4.0.0/bits/basic_ios.h \ /usr/include/c++/4.0.0/bits/streambuf_iterator.h \ /usr/include/c++/4.0.0/bits/locale_facets.h \ /usr/include/c++/4.0.0/cwctype /usr/include/wctype.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/ctype_base.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/ctype_inline.h \ /usr/include/c++/4.0.0/bits/codecvt.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/time_members.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/messages_members.h \ /usr/include/c++/4.0.0/bits/basic_ios.tcc \ /usr/include/c++/4.0.0/bits/ostream.tcc /usr/include/c++/4.0.0/locale \ /usr/include/c++/4.0.0/bits/locale_facets.tcc \ /usr/include/c++/4.0.0/typeinfo /usr/include/c++/4.0.0/istream \ /usr/include/c++/4.0.0/bits/istream.tcc /usr/include/errno.h \ /usr/include/sys/errno.h /usr/include/sys/timeb.h \ /usr/include/sys/socket.h /usr/include/machine/param.h \ /usr/include/i386/param.h /usr/include/strings.h \ /usr/include/netinet/in.h /usr/include/netinet6/in6.h \ /usr/include/netinet/tcp.h /usr/include/arpa/inet.h \ /usr/include/sys/param.h /usr/include/netdb.h /usr/include/fcntl.h \ /usr/include/sys/fcntl.h /usr/include/math.h \ /usr/include/architecture/i386/math.h /usr/include/c++/4.0.0/utility \ /usr/include/c++/4.0.0/bits/stl_relops.h \ /usr/include/c++/4.0.0/iterator \ /usr/include/c++/4.0.0/bits/stream_iterator.h \ /usr/include/c++/4.0.0/vector /usr/include/c++/4.0.0/bits/stl_vector.h \ /usr/include/c++/4.0.0/bits/stl_bvector.h \ /usr/include/c++/4.0.0/bits/vector.tcc /usr/include/c++/4.0.0/set \ /usr/include/c++/4.0.0/bits/stl_tree.h \ /usr/include/c++/4.0.0/bits/stl_set.h \ /usr/include/c++/4.0.0/bits/stl_multiset.h /usr/include/c++/4.0.0/map \ /usr/include/c++/4.0.0/bits/stl_map.h \ /usr/include/c++/4.0.0/bits/stl_multimap.h wsdlH.h wsdlStub.h service.h types.h: includes.h: ../../soapcpp2/stdsoap2.h: ../../config.h: /usr/include/stdlib.h: /usr/include/sys/cdefs.h: /usr/include/_types.h: /usr/include/sys/_types.h: /usr/include/machine/_types.h: /usr/include/i386/_types.h: /usr/include/sys/wait.h: /usr/include/sys/signal.h: /usr/include/sys/appleapiopts.h: /usr/include/machine/signal.h: /usr/include/i386/signal.h: /usr/include/sys/resource.h: /usr/include/machine/endian.h: /usr/include/i386/endian.h: /usr/include/sys/_endian.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdint.h: /usr/include/libkern/OSByteOrder.h: /usr/include/libkern/i386/OSByteOrder.h: /usr/include/alloca.h: /usr/include/machine/types.h: /usr/include/i386/types.h: /usr/include/stdio.h: /usr/include/string.h: /usr/include/ctype.h: /usr/include/runetype.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/limits.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/syslimits.h: /usr/include/limits.h: /usr/include/machine/limits.h: /usr/include/i386/limits.h: /usr/include/i386/_limits.h: /usr/include/sys/syslimits.h: /usr/include/c++/4.0.0/string: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++config.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/os_defines.h: /usr/include/c++/4.0.0/bits/stringfwd.h: /usr/include/c++/4.0.0/bits/char_traits.h: /usr/include/c++/4.0.0/cstring: /usr/include/c++/4.0.0/cstddef: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stddef.h: /usr/include/c++/4.0.0/bits/stl_algobase.h: /usr/include/c++/4.0.0/climits: /usr/include/c++/4.0.0/cstdlib: /usr/include/c++/4.0.0/iosfwd: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++locale.h: /usr/include/c++/4.0.0/clocale: /usr/include/locale.h: /usr/include/_locale.h: /usr/include/c++/4.0.0/cstdio: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++io.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/gthr.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/gthr-default.h: /usr/include/pthread.h: /usr/include/pthread_impl.h: /usr/include/sched.h: /usr/include/time.h: /usr/include/machine/_limits.h: /usr/include/unistd.h: /usr/include/sys/unistd.h: /usr/include/sys/select.h: /usr/include/sys/types.h: /usr/include/signal.h: /usr/include/sys/time.h: /usr/include/c++/4.0.0/cctype: /usr/include/c++/4.0.0/bits/postypes.h: /usr/include/c++/4.0.0/cwchar: /usr/include/c++/4.0.0/ctime: /usr/include/wchar.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdarg.h: /usr/include/_wctype.h: /usr/include/c++/4.0.0/bits/functexcept.h: /usr/include/c++/4.0.0/exception_defines.h: /usr/include/c++/4.0.0/bits/stl_pair.h: /usr/include/c++/4.0.0/bits/cpp_type_traits.h: /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h: /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h: /usr/include/c++/4.0.0/bits/concept_check.h: /usr/include/c++/4.0.0/bits/stl_iterator.h: /usr/include/c++/4.0.0/debug/debug.h: /usr/include/c++/4.0.0/cassert: /usr/include/assert.h: /usr/include/c++/4.0.0/memory: /usr/include/c++/4.0.0/bits/allocator.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++allocator.h: /usr/include/c++/4.0.0/ext/new_allocator.h: /usr/include/c++/4.0.0/new: /usr/include/c++/4.0.0/exception: /usr/include/c++/4.0.0/bits/stl_construct.h: /usr/include/c++/4.0.0/bits/stl_uninitialized.h: /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h: /usr/include/c++/4.0.0/limits: /usr/include/c++/4.0.0/bits/stl_function.h: /usr/include/c++/4.0.0/bits/basic_string.h: /usr/include/c++/4.0.0/bits/atomicity.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/atomic_word.h: /usr/include/c++/4.0.0/algorithm: /usr/include/c++/4.0.0/bits/stl_algo.h: /usr/include/c++/4.0.0/bits/stl_heap.h: /usr/include/c++/4.0.0/bits/stl_tempbuf.h: /usr/include/c++/4.0.0/bits/basic_string.tcc: /usr/include/c++/4.0.0/iostream: /usr/include/c++/4.0.0/ostream: /usr/include/c++/4.0.0/ios: /usr/include/c++/4.0.0/bits/localefwd.h: /usr/include/c++/4.0.0/bits/ios_base.h: /usr/include/c++/4.0.0/bits/locale_classes.h: /usr/include/c++/4.0.0/streambuf: /usr/include/c++/4.0.0/bits/streambuf.tcc: /usr/include/c++/4.0.0/bits/basic_ios.h: /usr/include/c++/4.0.0/bits/streambuf_iterator.h: /usr/include/c++/4.0.0/bits/locale_facets.h: /usr/include/c++/4.0.0/cwctype: /usr/include/wctype.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/ctype_base.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/ctype_inline.h: /usr/include/c++/4.0.0/bits/codecvt.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/time_members.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/messages_members.h: /usr/include/c++/4.0.0/bits/basic_ios.tcc: /usr/include/c++/4.0.0/bits/ostream.tcc: /usr/include/c++/4.0.0/locale: /usr/include/c++/4.0.0/bits/locale_facets.tcc: /usr/include/c++/4.0.0/typeinfo: /usr/include/c++/4.0.0/istream: /usr/include/c++/4.0.0/bits/istream.tcc: /usr/include/errno.h: /usr/include/sys/errno.h: /usr/include/sys/timeb.h: /usr/include/sys/socket.h: /usr/include/machine/param.h: /usr/include/i386/param.h: /usr/include/strings.h: /usr/include/netinet/in.h: /usr/include/netinet6/in6.h: /usr/include/netinet/tcp.h: /usr/include/arpa/inet.h: /usr/include/sys/param.h: /usr/include/netdb.h: /usr/include/fcntl.h: /usr/include/sys/fcntl.h: /usr/include/math.h: /usr/include/architecture/i386/math.h: /usr/include/c++/4.0.0/utility: /usr/include/c++/4.0.0/bits/stl_relops.h: /usr/include/c++/4.0.0/iterator: /usr/include/c++/4.0.0/bits/stream_iterator.h: /usr/include/c++/4.0.0/vector: /usr/include/c++/4.0.0/bits/stl_vector.h: /usr/include/c++/4.0.0/bits/stl_bvector.h: /usr/include/c++/4.0.0/bits/vector.tcc: /usr/include/c++/4.0.0/set: /usr/include/c++/4.0.0/bits/stl_tree.h: /usr/include/c++/4.0.0/bits/stl_set.h: /usr/include/c++/4.0.0/bits/stl_multiset.h: /usr/include/c++/4.0.0/map: /usr/include/c++/4.0.0/bits/stl_map.h: /usr/include/c++/4.0.0/bits/stl_multimap.h: wsdlH.h: wsdlStub.h: service.h: gsoap-2.8.91/gsoap/wsdl/.deps/wsdl2h.Po0000644000175000017500000002735613525245163017105 0ustar ellertellertwsdl2h.o wsdl2h.o: wsdl2h.cpp includes.h ../../soapcpp2/stdsoap2.h \ ../../config.h /usr/include/stdlib.h /usr/include/sys/cdefs.h \ /usr/include/_types.h /usr/include/sys/_types.h \ /usr/include/machine/_types.h /usr/include/i386/_types.h \ /usr/include/sys/wait.h /usr/include/sys/signal.h \ /usr/include/sys/appleapiopts.h /usr/include/machine/signal.h \ /usr/include/i386/signal.h /usr/include/sys/resource.h \ /usr/include/machine/endian.h /usr/include/i386/endian.h \ /usr/include/sys/_endian.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdint.h \ /usr/include/libkern/OSByteOrder.h \ /usr/include/libkern/i386/OSByteOrder.h /usr/include/alloca.h \ /usr/include/machine/types.h /usr/include/i386/types.h \ /usr/include/stdio.h /usr/include/string.h /usr/include/ctype.h \ /usr/include/runetype.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/limits.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/syslimits.h \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/i386/limits.h /usr/include/i386/_limits.h \ /usr/include/sys/syslimits.h /usr/include/c++/4.0.0/string \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++config.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/os_defines.h \ /usr/include/c++/4.0.0/bits/stringfwd.h \ /usr/include/c++/4.0.0/bits/char_traits.h \ /usr/include/c++/4.0.0/cstring /usr/include/c++/4.0.0/cstddef \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stddef.h \ /usr/include/c++/4.0.0/bits/stl_algobase.h \ /usr/include/c++/4.0.0/climits /usr/include/c++/4.0.0/cstdlib \ /usr/include/c++/4.0.0/iosfwd \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++locale.h \ /usr/include/c++/4.0.0/clocale /usr/include/locale.h \ /usr/include/_locale.h /usr/include/c++/4.0.0/cstdio \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++io.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/gthr.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/gthr-default.h \ /usr/include/pthread.h /usr/include/pthread_impl.h /usr/include/sched.h \ /usr/include/time.h /usr/include/machine/_limits.h \ /usr/include/unistd.h /usr/include/sys/unistd.h \ /usr/include/sys/select.h /usr/include/sys/types.h \ /usr/include/signal.h /usr/include/sys/time.h \ /usr/include/c++/4.0.0/cctype /usr/include/c++/4.0.0/bits/postypes.h \ /usr/include/c++/4.0.0/cwchar /usr/include/c++/4.0.0/ctime \ /usr/include/wchar.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdarg.h \ /usr/include/_wctype.h /usr/include/c++/4.0.0/bits/functexcept.h \ /usr/include/c++/4.0.0/exception_defines.h \ /usr/include/c++/4.0.0/bits/stl_pair.h \ /usr/include/c++/4.0.0/bits/cpp_type_traits.h \ /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h \ /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h \ /usr/include/c++/4.0.0/bits/concept_check.h \ /usr/include/c++/4.0.0/bits/stl_iterator.h \ /usr/include/c++/4.0.0/debug/debug.h /usr/include/c++/4.0.0/cassert \ /usr/include/assert.h /usr/include/c++/4.0.0/memory \ /usr/include/c++/4.0.0/bits/allocator.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++allocator.h \ /usr/include/c++/4.0.0/ext/new_allocator.h /usr/include/c++/4.0.0/new \ /usr/include/c++/4.0.0/exception \ /usr/include/c++/4.0.0/bits/stl_construct.h \ /usr/include/c++/4.0.0/bits/stl_uninitialized.h \ /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h \ /usr/include/c++/4.0.0/limits \ /usr/include/c++/4.0.0/bits/stl_function.h \ /usr/include/c++/4.0.0/bits/basic_string.h \ /usr/include/c++/4.0.0/bits/atomicity.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/atomic_word.h \ /usr/include/c++/4.0.0/algorithm /usr/include/c++/4.0.0/bits/stl_algo.h \ /usr/include/c++/4.0.0/bits/stl_heap.h \ /usr/include/c++/4.0.0/bits/stl_tempbuf.h \ /usr/include/c++/4.0.0/bits/basic_string.tcc \ /usr/include/c++/4.0.0/iostream /usr/include/c++/4.0.0/ostream \ /usr/include/c++/4.0.0/ios /usr/include/c++/4.0.0/bits/localefwd.h \ /usr/include/c++/4.0.0/bits/ios_base.h \ /usr/include/c++/4.0.0/bits/locale_classes.h \ /usr/include/c++/4.0.0/streambuf \ /usr/include/c++/4.0.0/bits/streambuf.tcc \ /usr/include/c++/4.0.0/bits/basic_ios.h \ /usr/include/c++/4.0.0/bits/streambuf_iterator.h \ /usr/include/c++/4.0.0/bits/locale_facets.h \ /usr/include/c++/4.0.0/cwctype /usr/include/wctype.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/ctype_base.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/ctype_inline.h \ /usr/include/c++/4.0.0/bits/codecvt.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/time_members.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/messages_members.h \ /usr/include/c++/4.0.0/bits/basic_ios.tcc \ /usr/include/c++/4.0.0/bits/ostream.tcc /usr/include/c++/4.0.0/locale \ /usr/include/c++/4.0.0/bits/locale_facets.tcc \ /usr/include/c++/4.0.0/typeinfo /usr/include/c++/4.0.0/istream \ /usr/include/c++/4.0.0/bits/istream.tcc /usr/include/errno.h \ /usr/include/sys/errno.h /usr/include/sys/timeb.h \ /usr/include/sys/socket.h /usr/include/machine/param.h \ /usr/include/i386/param.h /usr/include/strings.h \ /usr/include/netinet/in.h /usr/include/netinet6/in6.h \ /usr/include/netinet/tcp.h /usr/include/arpa/inet.h \ /usr/include/sys/param.h /usr/include/netdb.h /usr/include/fcntl.h \ /usr/include/sys/fcntl.h /usr/include/math.h \ /usr/include/architecture/i386/math.h /usr/include/c++/4.0.0/utility \ /usr/include/c++/4.0.0/bits/stl_relops.h \ /usr/include/c++/4.0.0/iterator \ /usr/include/c++/4.0.0/bits/stream_iterator.h \ /usr/include/c++/4.0.0/vector /usr/include/c++/4.0.0/bits/stl_vector.h \ /usr/include/c++/4.0.0/bits/stl_bvector.h \ /usr/include/c++/4.0.0/bits/vector.tcc /usr/include/c++/4.0.0/set \ /usr/include/c++/4.0.0/bits/stl_tree.h \ /usr/include/c++/4.0.0/bits/stl_set.h \ /usr/include/c++/4.0.0/bits/stl_multiset.h /usr/include/c++/4.0.0/map \ /usr/include/c++/4.0.0/bits/stl_map.h \ /usr/include/c++/4.0.0/bits/stl_multimap.h types.h wsdlH.h wsdlStub.h \ service.h includes.h: ../../soapcpp2/stdsoap2.h: ../../config.h: /usr/include/stdlib.h: /usr/include/sys/cdefs.h: /usr/include/_types.h: /usr/include/sys/_types.h: /usr/include/machine/_types.h: /usr/include/i386/_types.h: /usr/include/sys/wait.h: /usr/include/sys/signal.h: /usr/include/sys/appleapiopts.h: /usr/include/machine/signal.h: /usr/include/i386/signal.h: /usr/include/sys/resource.h: /usr/include/machine/endian.h: /usr/include/i386/endian.h: /usr/include/sys/_endian.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdint.h: /usr/include/libkern/OSByteOrder.h: /usr/include/libkern/i386/OSByteOrder.h: /usr/include/alloca.h: /usr/include/machine/types.h: /usr/include/i386/types.h: /usr/include/stdio.h: /usr/include/string.h: /usr/include/ctype.h: /usr/include/runetype.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/limits.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/syslimits.h: /usr/include/limits.h: /usr/include/machine/limits.h: /usr/include/i386/limits.h: /usr/include/i386/_limits.h: /usr/include/sys/syslimits.h: /usr/include/c++/4.0.0/string: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++config.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/os_defines.h: /usr/include/c++/4.0.0/bits/stringfwd.h: /usr/include/c++/4.0.0/bits/char_traits.h: /usr/include/c++/4.0.0/cstring: /usr/include/c++/4.0.0/cstddef: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stddef.h: /usr/include/c++/4.0.0/bits/stl_algobase.h: /usr/include/c++/4.0.0/climits: /usr/include/c++/4.0.0/cstdlib: /usr/include/c++/4.0.0/iosfwd: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++locale.h: /usr/include/c++/4.0.0/clocale: /usr/include/locale.h: /usr/include/_locale.h: /usr/include/c++/4.0.0/cstdio: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++io.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/gthr.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/gthr-default.h: /usr/include/pthread.h: /usr/include/pthread_impl.h: /usr/include/sched.h: /usr/include/time.h: /usr/include/machine/_limits.h: /usr/include/unistd.h: /usr/include/sys/unistd.h: /usr/include/sys/select.h: /usr/include/sys/types.h: /usr/include/signal.h: /usr/include/sys/time.h: /usr/include/c++/4.0.0/cctype: /usr/include/c++/4.0.0/bits/postypes.h: /usr/include/c++/4.0.0/cwchar: /usr/include/c++/4.0.0/ctime: /usr/include/wchar.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdarg.h: /usr/include/_wctype.h: /usr/include/c++/4.0.0/bits/functexcept.h: /usr/include/c++/4.0.0/exception_defines.h: /usr/include/c++/4.0.0/bits/stl_pair.h: /usr/include/c++/4.0.0/bits/cpp_type_traits.h: /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h: /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h: /usr/include/c++/4.0.0/bits/concept_check.h: /usr/include/c++/4.0.0/bits/stl_iterator.h: /usr/include/c++/4.0.0/debug/debug.h: /usr/include/c++/4.0.0/cassert: /usr/include/assert.h: /usr/include/c++/4.0.0/memory: /usr/include/c++/4.0.0/bits/allocator.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++allocator.h: /usr/include/c++/4.0.0/ext/new_allocator.h: /usr/include/c++/4.0.0/new: /usr/include/c++/4.0.0/exception: /usr/include/c++/4.0.0/bits/stl_construct.h: /usr/include/c++/4.0.0/bits/stl_uninitialized.h: /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h: /usr/include/c++/4.0.0/limits: /usr/include/c++/4.0.0/bits/stl_function.h: /usr/include/c++/4.0.0/bits/basic_string.h: /usr/include/c++/4.0.0/bits/atomicity.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/atomic_word.h: /usr/include/c++/4.0.0/algorithm: /usr/include/c++/4.0.0/bits/stl_algo.h: /usr/include/c++/4.0.0/bits/stl_heap.h: /usr/include/c++/4.0.0/bits/stl_tempbuf.h: /usr/include/c++/4.0.0/bits/basic_string.tcc: /usr/include/c++/4.0.0/iostream: /usr/include/c++/4.0.0/ostream: /usr/include/c++/4.0.0/ios: /usr/include/c++/4.0.0/bits/localefwd.h: /usr/include/c++/4.0.0/bits/ios_base.h: /usr/include/c++/4.0.0/bits/locale_classes.h: /usr/include/c++/4.0.0/streambuf: /usr/include/c++/4.0.0/bits/streambuf.tcc: /usr/include/c++/4.0.0/bits/basic_ios.h: /usr/include/c++/4.0.0/bits/streambuf_iterator.h: /usr/include/c++/4.0.0/bits/locale_facets.h: /usr/include/c++/4.0.0/cwctype: /usr/include/wctype.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/ctype_base.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/ctype_inline.h: /usr/include/c++/4.0.0/bits/codecvt.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/time_members.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/messages_members.h: /usr/include/c++/4.0.0/bits/basic_ios.tcc: /usr/include/c++/4.0.0/bits/ostream.tcc: /usr/include/c++/4.0.0/locale: /usr/include/c++/4.0.0/bits/locale_facets.tcc: /usr/include/c++/4.0.0/typeinfo: /usr/include/c++/4.0.0/istream: /usr/include/c++/4.0.0/bits/istream.tcc: /usr/include/errno.h: /usr/include/sys/errno.h: /usr/include/sys/timeb.h: /usr/include/sys/socket.h: /usr/include/machine/param.h: /usr/include/i386/param.h: /usr/include/strings.h: /usr/include/netinet/in.h: /usr/include/netinet6/in6.h: /usr/include/netinet/tcp.h: /usr/include/arpa/inet.h: /usr/include/sys/param.h: /usr/include/netdb.h: /usr/include/fcntl.h: /usr/include/sys/fcntl.h: /usr/include/math.h: /usr/include/architecture/i386/math.h: /usr/include/c++/4.0.0/utility: /usr/include/c++/4.0.0/bits/stl_relops.h: /usr/include/c++/4.0.0/iterator: /usr/include/c++/4.0.0/bits/stream_iterator.h: /usr/include/c++/4.0.0/vector: /usr/include/c++/4.0.0/bits/stl_vector.h: /usr/include/c++/4.0.0/bits/stl_bvector.h: /usr/include/c++/4.0.0/bits/vector.tcc: /usr/include/c++/4.0.0/set: /usr/include/c++/4.0.0/bits/stl_tree.h: /usr/include/c++/4.0.0/bits/stl_set.h: /usr/include/c++/4.0.0/bits/stl_multiset.h: /usr/include/c++/4.0.0/map: /usr/include/c++/4.0.0/bits/stl_map.h: /usr/include/c++/4.0.0/bits/stl_multimap.h: types.h: wsdlH.h: wsdlStub.h: service.h: gsoap-2.8.91/gsoap/wsdl/.deps/types.Po0000644000175000017500000002732113525245163017036 0ustar ellertellerttypes.o types.o: types.cpp types.h includes.h ../../soapcpp2/stdsoap2.h \ ../../config.h /usr/include/stdlib.h /usr/include/sys/cdefs.h \ /usr/include/_types.h /usr/include/sys/_types.h \ /usr/include/machine/_types.h /usr/include/i386/_types.h \ /usr/include/sys/wait.h /usr/include/sys/signal.h \ /usr/include/sys/appleapiopts.h /usr/include/machine/signal.h \ /usr/include/i386/signal.h /usr/include/sys/resource.h \ /usr/include/machine/endian.h /usr/include/i386/endian.h \ /usr/include/sys/_endian.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdint.h \ /usr/include/libkern/OSByteOrder.h \ /usr/include/libkern/i386/OSByteOrder.h /usr/include/alloca.h \ /usr/include/machine/types.h /usr/include/i386/types.h \ /usr/include/stdio.h /usr/include/string.h /usr/include/ctype.h \ /usr/include/runetype.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/limits.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/syslimits.h \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/i386/limits.h /usr/include/i386/_limits.h \ /usr/include/sys/syslimits.h /usr/include/c++/4.0.0/string \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++config.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/os_defines.h \ /usr/include/c++/4.0.0/bits/stringfwd.h \ /usr/include/c++/4.0.0/bits/char_traits.h \ /usr/include/c++/4.0.0/cstring /usr/include/c++/4.0.0/cstddef \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stddef.h \ /usr/include/c++/4.0.0/bits/stl_algobase.h \ /usr/include/c++/4.0.0/climits /usr/include/c++/4.0.0/cstdlib \ /usr/include/c++/4.0.0/iosfwd \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++locale.h \ /usr/include/c++/4.0.0/clocale /usr/include/locale.h \ /usr/include/_locale.h /usr/include/c++/4.0.0/cstdio \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++io.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/gthr.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/gthr-default.h \ /usr/include/pthread.h /usr/include/pthread_impl.h /usr/include/sched.h \ /usr/include/time.h /usr/include/machine/_limits.h \ /usr/include/unistd.h /usr/include/sys/unistd.h \ /usr/include/sys/select.h /usr/include/sys/types.h \ /usr/include/signal.h /usr/include/sys/time.h \ /usr/include/c++/4.0.0/cctype /usr/include/c++/4.0.0/bits/postypes.h \ /usr/include/c++/4.0.0/cwchar /usr/include/c++/4.0.0/ctime \ /usr/include/wchar.h \ /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdarg.h \ /usr/include/_wctype.h /usr/include/c++/4.0.0/bits/functexcept.h \ /usr/include/c++/4.0.0/exception_defines.h \ /usr/include/c++/4.0.0/bits/stl_pair.h \ /usr/include/c++/4.0.0/bits/cpp_type_traits.h \ /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h \ /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h \ /usr/include/c++/4.0.0/bits/concept_check.h \ /usr/include/c++/4.0.0/bits/stl_iterator.h \ /usr/include/c++/4.0.0/debug/debug.h /usr/include/c++/4.0.0/cassert \ /usr/include/assert.h /usr/include/c++/4.0.0/memory \ /usr/include/c++/4.0.0/bits/allocator.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++allocator.h \ /usr/include/c++/4.0.0/ext/new_allocator.h /usr/include/c++/4.0.0/new \ /usr/include/c++/4.0.0/exception \ /usr/include/c++/4.0.0/bits/stl_construct.h \ /usr/include/c++/4.0.0/bits/stl_uninitialized.h \ /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h \ /usr/include/c++/4.0.0/limits \ /usr/include/c++/4.0.0/bits/stl_function.h \ /usr/include/c++/4.0.0/bits/basic_string.h \ /usr/include/c++/4.0.0/bits/atomicity.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/atomic_word.h \ /usr/include/c++/4.0.0/algorithm /usr/include/c++/4.0.0/bits/stl_algo.h \ /usr/include/c++/4.0.0/bits/stl_heap.h \ /usr/include/c++/4.0.0/bits/stl_tempbuf.h \ /usr/include/c++/4.0.0/bits/basic_string.tcc \ /usr/include/c++/4.0.0/iostream /usr/include/c++/4.0.0/ostream \ /usr/include/c++/4.0.0/ios /usr/include/c++/4.0.0/bits/localefwd.h \ /usr/include/c++/4.0.0/bits/ios_base.h \ /usr/include/c++/4.0.0/bits/locale_classes.h \ /usr/include/c++/4.0.0/streambuf \ /usr/include/c++/4.0.0/bits/streambuf.tcc \ /usr/include/c++/4.0.0/bits/basic_ios.h \ /usr/include/c++/4.0.0/bits/streambuf_iterator.h \ /usr/include/c++/4.0.0/bits/locale_facets.h \ /usr/include/c++/4.0.0/cwctype /usr/include/wctype.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/ctype_base.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/ctype_inline.h \ /usr/include/c++/4.0.0/bits/codecvt.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/time_members.h \ /usr/include/c++/4.0.0/i686-apple-darwin8/bits/messages_members.h \ /usr/include/c++/4.0.0/bits/basic_ios.tcc \ /usr/include/c++/4.0.0/bits/ostream.tcc /usr/include/c++/4.0.0/locale \ /usr/include/c++/4.0.0/bits/locale_facets.tcc \ /usr/include/c++/4.0.0/typeinfo /usr/include/c++/4.0.0/istream \ /usr/include/c++/4.0.0/bits/istream.tcc /usr/include/errno.h \ /usr/include/sys/errno.h /usr/include/sys/timeb.h \ /usr/include/sys/socket.h /usr/include/machine/param.h \ /usr/include/i386/param.h /usr/include/strings.h \ /usr/include/netinet/in.h /usr/include/netinet6/in6.h \ /usr/include/netinet/tcp.h /usr/include/arpa/inet.h \ /usr/include/sys/param.h /usr/include/netdb.h /usr/include/fcntl.h \ /usr/include/sys/fcntl.h /usr/include/math.h \ /usr/include/architecture/i386/math.h /usr/include/c++/4.0.0/utility \ /usr/include/c++/4.0.0/bits/stl_relops.h \ /usr/include/c++/4.0.0/iterator \ /usr/include/c++/4.0.0/bits/stream_iterator.h \ /usr/include/c++/4.0.0/vector /usr/include/c++/4.0.0/bits/stl_vector.h \ /usr/include/c++/4.0.0/bits/stl_bvector.h \ /usr/include/c++/4.0.0/bits/vector.tcc /usr/include/c++/4.0.0/set \ /usr/include/c++/4.0.0/bits/stl_tree.h \ /usr/include/c++/4.0.0/bits/stl_set.h \ /usr/include/c++/4.0.0/bits/stl_multiset.h /usr/include/c++/4.0.0/map \ /usr/include/c++/4.0.0/bits/stl_map.h \ /usr/include/c++/4.0.0/bits/stl_multimap.h wsdlH.h wsdlStub.h types.h: includes.h: ../../soapcpp2/stdsoap2.h: ../../config.h: /usr/include/stdlib.h: /usr/include/sys/cdefs.h: /usr/include/_types.h: /usr/include/sys/_types.h: /usr/include/machine/_types.h: /usr/include/i386/_types.h: /usr/include/sys/wait.h: /usr/include/sys/signal.h: /usr/include/sys/appleapiopts.h: /usr/include/machine/signal.h: /usr/include/i386/signal.h: /usr/include/sys/resource.h: /usr/include/machine/endian.h: /usr/include/i386/endian.h: /usr/include/sys/_endian.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdint.h: /usr/include/libkern/OSByteOrder.h: /usr/include/libkern/i386/OSByteOrder.h: /usr/include/alloca.h: /usr/include/machine/types.h: /usr/include/i386/types.h: /usr/include/stdio.h: /usr/include/string.h: /usr/include/ctype.h: /usr/include/runetype.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/limits.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/syslimits.h: /usr/include/limits.h: /usr/include/machine/limits.h: /usr/include/i386/limits.h: /usr/include/i386/_limits.h: /usr/include/sys/syslimits.h: /usr/include/c++/4.0.0/string: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++config.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/os_defines.h: /usr/include/c++/4.0.0/bits/stringfwd.h: /usr/include/c++/4.0.0/bits/char_traits.h: /usr/include/c++/4.0.0/cstring: /usr/include/c++/4.0.0/cstddef: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stddef.h: /usr/include/c++/4.0.0/bits/stl_algobase.h: /usr/include/c++/4.0.0/climits: /usr/include/c++/4.0.0/cstdlib: /usr/include/c++/4.0.0/iosfwd: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++locale.h: /usr/include/c++/4.0.0/clocale: /usr/include/locale.h: /usr/include/_locale.h: /usr/include/c++/4.0.0/cstdio: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++io.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/gthr.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/gthr-default.h: /usr/include/pthread.h: /usr/include/pthread_impl.h: /usr/include/sched.h: /usr/include/time.h: /usr/include/machine/_limits.h: /usr/include/unistd.h: /usr/include/sys/unistd.h: /usr/include/sys/select.h: /usr/include/sys/types.h: /usr/include/signal.h: /usr/include/sys/time.h: /usr/include/c++/4.0.0/cctype: /usr/include/c++/4.0.0/bits/postypes.h: /usr/include/c++/4.0.0/cwchar: /usr/include/c++/4.0.0/ctime: /usr/include/wchar.h: /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/stdarg.h: /usr/include/_wctype.h: /usr/include/c++/4.0.0/bits/functexcept.h: /usr/include/c++/4.0.0/exception_defines.h: /usr/include/c++/4.0.0/bits/stl_pair.h: /usr/include/c++/4.0.0/bits/cpp_type_traits.h: /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h: /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h: /usr/include/c++/4.0.0/bits/concept_check.h: /usr/include/c++/4.0.0/bits/stl_iterator.h: /usr/include/c++/4.0.0/debug/debug.h: /usr/include/c++/4.0.0/cassert: /usr/include/assert.h: /usr/include/c++/4.0.0/memory: /usr/include/c++/4.0.0/bits/allocator.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/c++allocator.h: /usr/include/c++/4.0.0/ext/new_allocator.h: /usr/include/c++/4.0.0/new: /usr/include/c++/4.0.0/exception: /usr/include/c++/4.0.0/bits/stl_construct.h: /usr/include/c++/4.0.0/bits/stl_uninitialized.h: /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h: /usr/include/c++/4.0.0/limits: /usr/include/c++/4.0.0/bits/stl_function.h: /usr/include/c++/4.0.0/bits/basic_string.h: /usr/include/c++/4.0.0/bits/atomicity.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/atomic_word.h: /usr/include/c++/4.0.0/algorithm: /usr/include/c++/4.0.0/bits/stl_algo.h: /usr/include/c++/4.0.0/bits/stl_heap.h: /usr/include/c++/4.0.0/bits/stl_tempbuf.h: /usr/include/c++/4.0.0/bits/basic_string.tcc: /usr/include/c++/4.0.0/iostream: /usr/include/c++/4.0.0/ostream: /usr/include/c++/4.0.0/ios: /usr/include/c++/4.0.0/bits/localefwd.h: /usr/include/c++/4.0.0/bits/ios_base.h: /usr/include/c++/4.0.0/bits/locale_classes.h: /usr/include/c++/4.0.0/streambuf: /usr/include/c++/4.0.0/bits/streambuf.tcc: /usr/include/c++/4.0.0/bits/basic_ios.h: /usr/include/c++/4.0.0/bits/streambuf_iterator.h: /usr/include/c++/4.0.0/bits/locale_facets.h: /usr/include/c++/4.0.0/cwctype: /usr/include/wctype.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/ctype_base.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/ctype_inline.h: /usr/include/c++/4.0.0/bits/codecvt.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/time_members.h: /usr/include/c++/4.0.0/i686-apple-darwin8/bits/messages_members.h: /usr/include/c++/4.0.0/bits/basic_ios.tcc: /usr/include/c++/4.0.0/bits/ostream.tcc: /usr/include/c++/4.0.0/locale: /usr/include/c++/4.0.0/bits/locale_facets.tcc: /usr/include/c++/4.0.0/typeinfo: /usr/include/c++/4.0.0/istream: /usr/include/c++/4.0.0/bits/istream.tcc: /usr/include/errno.h: /usr/include/sys/errno.h: /usr/include/sys/timeb.h: /usr/include/sys/socket.h: /usr/include/machine/param.h: /usr/include/i386/param.h: /usr/include/strings.h: /usr/include/netinet/in.h: /usr/include/netinet6/in6.h: /usr/include/netinet/tcp.h: /usr/include/arpa/inet.h: /usr/include/sys/param.h: /usr/include/netdb.h: /usr/include/fcntl.h: /usr/include/sys/fcntl.h: /usr/include/math.h: /usr/include/architecture/i386/math.h: /usr/include/c++/4.0.0/utility: /usr/include/c++/4.0.0/bits/stl_relops.h: /usr/include/c++/4.0.0/iterator: /usr/include/c++/4.0.0/bits/stream_iterator.h: /usr/include/c++/4.0.0/vector: /usr/include/c++/4.0.0/bits/stl_vector.h: /usr/include/c++/4.0.0/bits/stl_bvector.h: /usr/include/c++/4.0.0/bits/vector.tcc: /usr/include/c++/4.0.0/set: /usr/include/c++/4.0.0/bits/stl_tree.h: /usr/include/c++/4.0.0/bits/stl_set.h: /usr/include/c++/4.0.0/bits/stl_multiset.h: /usr/include/c++/4.0.0/map: /usr/include/c++/4.0.0/bits/stl_map.h: /usr/include/c++/4.0.0/bits/stl_multimap.h: wsdlH.h: wsdlStub.h: gsoap-2.8.91/gsoap/wsdl/service.cpp0000644000175000017500000065360513525245163016537 0ustar ellertellert/* service.cpp Generate gSOAP service structures from WSDL. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2018, 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. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "types.h" #include "service.h" #include #define URI_CHAR(c) ((c) > 32 && (c) != '"' && (c) != '<' && (c) != '>' && (c) != '\\' && (c) != '^' && (c) != '`' && (c) != '|' && (c) <= '~') static const char *urienc(struct soap*, const char*); static bool imported(const char *tag); static void comment(const char *start, const char *middle, const char *end, const char *text); static void page(const char *page, const char *title, const char *text); static void section(const char *section, const char *title, const char *text); static void banner(const char*, const char* = NULL); static void ident(); static void gen_policy(Service&, const std::vector&, const char*, Types&); static void gen_policy_enablers(const Service&); static void gen_plnk(const Service& service); static void gen_vprop(const wsdl__definitions& definitions, Types&); //////////////////////////////////////////////////////////////////////////////// // // Definitions methods // //////////////////////////////////////////////////////////////////////////////// Definitions::Definitions() { } void Definitions::collect(const wsdl__definitions& definitions) { // Collect information: analyze WSDL definitions and imported definitions analyze(definitions); for (std::vector::const_iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) if ((*import).definitionsPtr()) analyze(*(*import).definitionsPtr()); } void Definitions::analyze(const wsdl__definitions& definitions) { // Analyze WADL application linked within empty WSDL definitions analyze_application(definitions); // Analyze WSDL and build Service information binding_count = 0; // Determine number of relevant service bindings (service prefix option only) for (std::vector::const_iterator i = definitions.binding.begin(); i != definitions.binding.end(); ++i) { for (std::vector::const_iterator j = (*i).operation.begin(); j != (*i).operation.end(); ++j) { if ((*j).operationPtr()) { binding_count++; break; } } } if (vflag && definitions.name) fprintf(stderr, "\nAnalyzing \"%s\" which has %d service binding(s)\n", definitions.name, binding_count); if (binding_count == 0 && definitions.import.empty() && definitions.name && (!definitions.portType.empty() || !definitions.interface_.empty())) fprintf(stderr, "\nWarning: WSDL \"%s\" has no bindings to implement operations\n", definitions.name); else if (binding_count > 1 && !service_prefix) { // This puts all operations under a single binding fprintf(stderr, "\nWarning: %d service bindings found, but collected as one service (use option -Nname to produce a separate service for each binding)\n", binding_count); } // Analyze and collect service data for (std::vector::const_iterator binding = definitions.binding.begin(); binding != definitions.binding.end(); ++binding) { // /definitions/binding/documentation const char *binding_documentation = (*binding).documentation; // /definitions/binding/soap:binding soap__binding *soap__binding_ = (*binding).soap__binding_; // /definitions/binding/soap:binding/@transport const char *soap__binding_transport = NULL; int version = 0; if (soap__binding_) soap__binding_transport = soap__binding_->transport; else if ((*binding).wsoap__version && strlen((*binding).wsoap__version) > 2) version = (*binding).wsoap__version[2]-'0'; // WSDL 2.0 else if (!(*binding).http__binding_) version = 2; // assume WSDL 2.0 if (version == 2) soap12 = true; // /definitions/binding/@soap:protocol if ((*binding).wsoap__protocol) soap__binding_transport = (*binding).wsoap__protocol; // /definitions/binding/@name const char *binding_name = ""; if ((*binding).name) binding_name = (*binding).name; else if ((*binding).portTypePtr() && (*binding).portTypePtr()->name) { size_t l = strlen((*binding).portTypePtr()->name); char *s = (char*)soap_malloc(definitions.soap, l + 8); if (s) { soap_strcpy(s, l + 8, (*binding).portTypePtr()->name); soap_strcpy(s + l, 8, "Binding"); binding_name = s; } } if (!Rflag && (!soap__binding_transport || (strcmp(soap__binding_transport+strlen(soap__binding_transport)-4, "http") && strcmp(soap__binding_transport+strlen(soap__binding_transport)-5, "HTTP/")))) { // -R not set: skip WSDL REST bindings if (!Wflag) fprintf(stderr, "\nWarning: ignoring RESTful binding \"%s\" because of non-SOAP transport \"%s\" (use option -R to enable REST)\n", binding_name, soap__binding_transport ? soap__binding_transport : ""); } else { // /definitions/binding/@type // TODO: need to find the Policy of portType, though it is never used...? // const wsp__Policy *portType_policy = NULL; // /definitions/binding/wsp:Policy and wsp:PolicyReference /* const wsp__Policy *binding_policy = NULL; if ((*binding).wsp__Policy_) binding_policy = (*binding).wsp__Policy_; if ((*binding).wsp__PolicyReference_) binding_policy = (*binding).wsp__PolicyReference_->policyPtr(); */ // /definitions/binding/http:binding http__binding *http__binding_ = (*binding).http__binding_; const char *http__binding_verb = NULL; if (http__binding_) http__binding_verb = http__binding_->verb; // HTTP POST and GET else if ((*binding).whttp__methodDefault) http__binding_verb = (*binding).whttp__methodDefault; // HTTP POST and GET // /definitions/binding/soap:binding/@style soap__styleChoice soap__binding_style = document; if (soap__binding_ && soap__binding_->style) soap__binding_style = *soap__binding_->style; // /definitions/binding/operation* for (std::vector::const_iterator operation = (*binding).operation.begin(); operation != (*binding).operation.end(); ++operation) { // /definitions/portType/operation/ associated with /definitions/binding/operation wsdl__operation *wsdl__operation_ = (*operation).operationPtr(); // /definitions/binding/operation/soap:operation soap__operation *soap__operation_ = (*operation).soap__operation_; // /definitions/binding/operation/soap:operation/@style soap__styleChoice soap__operation_style = soap__binding_style; if (soap__operation_ && soap__operation_->style) soap__operation_style = *soap__operation_->style; // /definitions/binding/@wsoap:mepDefault const char *soap__operation_mep = (*binding).wsoap__mepDefault; // /definitions/binding/operation/@wsoap:mep if ((*operation).wsoap__mep) soap__operation_mep = (*operation).wsoap__mep; // /definitions/binding/operation/@whttp:method const char *http_method = http__binding_verb; if ((*operation).whttp__method) http_method = (*operation).whttp__method; // /definitions/binding/operation/@wsoap:action const char *soap__operation_action = NULL; if ((*operation).wsoap__action) soap__operation_action = (*operation).wsoap__action; // /definitions/binding/operation/http:operation http__operation *http__operation_ = (*operation).http__operation_; // /definitions/binding/wsp:Policy and wsp:PolicyReference const wsp__Policy *ext_operation_policy = NULL; if ((*operation).wsp__Policy_) ext_operation_policy = (*operation).wsp__Policy_; if ((*operation).wsp__PolicyReference_) ext_operation_policy = (*operation).wsp__PolicyReference_->policyPtr(); // /definitions/binding/operation/http:operation/@location const char *http__operation_location = NULL; if (http__operation_) http__operation_location = http__operation_->location; else if ((*operation).whttp__location) http__operation_location = (*operation).whttp__location; // /definitions/binding/operation/input and output wsdl__ext_ioput *ext_input, *ext_output; // /definitions/portType/operation if (wsdl__operation_ && wsdl__operation_->name) { bool reversed = false; wsdl__ioput *input = NULL; wsdl__ioput *output = NULL; // normalize input/output order for solicit-response operations if (wsdl__operation_->__union1 == SOAP_UNION_wsdl__union_ioput_input) input = wsdl__operation_->__ioput1.input; else if (wsdl__operation_->__union1 == SOAP_UNION_wsdl__union_ioput_output) { reversed = true; input = wsdl__operation_->__ioput1.output; } if (wsdl__operation_->__union2 == SOAP_UNION_wsdl__union_ioput_input) { reversed = true; output = wsdl__operation_->__ioput2.input; } else if (wsdl__operation_->__union2 == SOAP_UNION_wsdl__union_ioput_output) output = wsdl__operation_->__ioput2.output; else // one input only or one output only (or none) { reversed = false; input = NULL; output = NULL; if (wsdl__operation_->__union1 == SOAP_UNION_wsdl__union_ioput_input) input = wsdl__operation_->__ioput1.input; else if (wsdl__operation_->__union1 == SOAP_UNION_wsdl__union_ioput_output) output = wsdl__operation_->__ioput1.output; } if (!reversed) { ext_input = (*operation).input; ext_output = (*operation).output; } else { ext_input = (*operation).output; ext_output = (*operation).input; } if ((http_method && !strcmp(http_method, "GET")) || (wsdl__operation_->pattern && !strstr(wsdl__operation_->pattern, "in"))) input = NULL; if (wsdl__operation_->pattern && !strstr(wsdl__operation_->pattern, "out")) output = NULL; if (wsdl__operation_->pattern) // WSDL 2.0 { soap__operation_style = document; if (wsdl__operation_->style && !strcmp(wsdl__operation_->style, "http://www.w3.org/ns/wsdl/rpc")) soap__operation_style = rpc; else if ((*binding).portTypePtr() && (*binding).portTypePtr()->styleDefault && !strcmp( (*binding).portTypePtr()->styleDefault, "http://www.w3.org/ns/wsdl/rpc")) soap__operation_style = rpc; } // /definitions/binding/wsp:Policy and wsp:PolicyReference const wsp__Policy *operation_policy = NULL; if (wsdl__operation_->wsp__Policy_) operation_policy = wsdl__operation_->wsp__Policy_; if (wsdl__operation_->wsp__PolicyReference_) operation_policy = wsdl__operation_->wsp__PolicyReference_->policyPtr(); if (!Rflag && (http__operation_ || http__operation_location)) { // skip WSDL REST HTTP operations if (!Wflag) fprintf(stderr, "\nWarning: ignoring RESTful operation \"%s\" in binding \"%s\" (use option -R to enable REST)\n", wsdl__operation_->name, binding_name); } else if (input) { soap__body *input_body = NULL; mime__mimeXml *input_mime = NULL; mime__content *input_mime_content = NULL; if (!reversed && ext_input) { input_body = ext_input->soap__body_; input_mime = ext_input->mime__mimeXml_; input_mime_content = ext_input->mime__content_; if (ext_input->mime__multipartRelated_) { for (std::vector::const_iterator part = ext_input->mime__multipartRelated_->part.begin(); part != ext_input->mime__multipartRelated_->part.end(); ++part) if ((*part).soap__body_) { input_body = (*part).soap__body_; break; } } } else if (ext_output) { input_body = ext_output->soap__body_; input_mime = ext_output->mime__mimeXml_; input_mime_content = ext_output->mime__content_; if (ext_output->mime__multipartRelated_) { for (std::vector::const_iterator part = ext_output->mime__multipartRelated_->part.begin(); part != ext_output->mime__multipartRelated_->part.end(); ++part) if ((*part).soap__body_) { input_body = (*part).soap__body_; break; } } } if (wsdl__operation_->style && !strcmp(wsdl__operation_->style, "http://www.w3.org/ns/wsdl/style/iri")) { input_mime_content = soap_new_mime__content(definitions.soap); input_mime_content->soap_default(definitions.soap); input_mime_content->type = (char*)"application/x-www-form-urlencoded"; } // MUST have an input binding, otherwise can't generate a service operation if (input_body || input_mime || input_mime_content || input->element) { char *URI; if (input_body && soap__operation_style == rpc) URI = input_body->namespace_; else if ((binding_count == 1 || !service_prefix) && definitions.targetNamespace && *definitions.targetNamespace) URI = definitions.targetNamespace; else if ((binding_count == 1 || !service_prefix) && definitions.name && *definitions.name) URI = definitions.name; else { // multiple service bindings are used, each needs a unique new URI size_t l = strlen(definitions.targetNamespace) + strlen(binding_name); URI = (char*)soap_malloc(definitions.soap, l + 2); if (URI) { soap_strcpy(URI, l + 2, definitions.targetNamespace); size_t n = strlen(URI); if (n > 0 && URI[n-1] != '/') { soap_strcpy(URI + n, l + 2 - n, "/"); ++n; } soap_strcpy(URI + n, l + 2 - n, binding_name); } } const char *prefix = types.nsprefix(service_prefix, URI); const char *name = types.aname(NULL, NULL, binding_name); // name of service is binding name Service *service = services[prefix]; if (!service) { service = services[prefix] = new Service(); service->prefix = prefix; service->URI = urienc(definitions.soap, URI); service->name = name; service->transport = soap__binding_transport; if ((*binding).portTypePtr() && (*binding).portTypePtr()->name) service->type = types.aname(NULL, NULL, (*binding).portTypePtr()->name); else service->type = NULL; // collect faults (TODO: this is not used anywhere) for (std::vector::const_iterator fault = (*binding).fault.begin(); fault != (*binding).fault.end(); ++fault) { Message *f = analyze_fault(definitions, service, *fault); if (f) service->fault[f->name] = f; } // collect policies for the bindings for (std::vector::const_iterator p = (*binding).wsp__Policy_.begin(); p != (*binding).wsp__Policy_.end(); ++p) service->policy.push_back(&(*p)); for (std::vector::const_iterator r = (*binding).wsp__PolicyReference_.begin(); r != (*binding).wsp__PolicyReference_.end(); ++r) service->policy.push_back((*r).policyPtr()); // collect policies for the service endpoints for (std::vector::const_iterator s = definitions.service.begin(); s != definitions.service.end(); ++s) { for (std::vector::const_iterator p = (*s).wsp__Policy_.begin(); p != (*s).wsp__Policy_.end(); ++p) service->policy.push_back(&(*p)); for (std::vector::const_iterator r = (*s).wsp__PolicyReference_.begin(); r != (*s).wsp__PolicyReference_.end(); ++r) service->policy.push_back((*r).policyPtr()); } // collect BPEL 2.0 partner link roles for (std::vector::const_iterator p = definitions.plnk__partnerLinkType.begin(); p != definitions.plnk__partnerLinkType.end(); ++p) { for (std::vector::const_iterator r = (*p).role.begin(); r != (*p).role.end(); ++r) { if ((binding_count > 1 && !service_prefix) || (*r).portTypePtr() == (*binding).portTypePtr()) service->role.push_back(&(*r)); } } } for (std::vector::const_iterator s = definitions.service.begin(); s != definitions.service.end(); ++s) { for (std::vector::const_iterator port = (*s).port.begin(); port != (*s).port.end(); ++port) { if ((*port).bindingPtr() == &(*binding)) { if ((*port).soap__address_ && (*port).soap__address_->location) service->location.insert(urienc(definitions.soap, (*port).soap__address_->location)); if ((*port).wsa__EndpointReference && (*port).wsa__EndpointReference->Address) service->location.insert(urienc(definitions.soap, (*port).wsa__EndpointReference->Address)); if ((*port).http__address_ && (*port).http__address_->location) service->location.insert(urienc(definitions.soap, (*port).http__address_->location)); if ((*port).wsaw__UsingAddressing) service->add_import("wsa5.h"); // collect service documentation if ((*s).documentation) service->service_documentation[(*service).name] = (*s).documentation; if ((*port).documentation && (*port).name) service->port_documentation[(*port).name] = (*port).documentation; if (binding_documentation) service->binding_documentation[binding_name] = binding_documentation; // collect policies for the service and endpoints if ((*port).wsp__Policy_) service->policy.push_back((*port).wsp__Policy_); if ((*port).wsp__PolicyReference_ && (*port).wsp__PolicyReference_->policyPtr()) service->policy.push_back((*port).wsp__PolicyReference_->policyPtr()); } } for (std::vector::const_iterator endpoint = (*s).endpoint.begin(); endpoint != (*s).endpoint.end(); ++endpoint) { if ((*endpoint).bindingPtr() == &(*binding)) { if ((*endpoint).address) service->location.insert(urienc(definitions.soap, (*endpoint).address)); if ((*endpoint).wsa__EndpointReference && (*endpoint).wsa__EndpointReference->Address) service->location.insert(urienc(definitions.soap, (*endpoint).wsa__EndpointReference->Address)); if ((*endpoint).http__address_ && (*endpoint).http__address_->location) service->location.insert(urienc(definitions.soap, (*endpoint).http__address_->location)); // TODO: locations need auth // service->auth_scheme = (*endpoint).whttp__authenticationScheme; // service->auth_realm = (*endpoint).whttp__authenticationRealm; // collect service documentation if ((*s).documentation) service->service_documentation[(*service).name] = (*s).documentation; if ((*endpoint).documentation && (*endpoint).name) service->port_documentation[(*endpoint).name] = (*endpoint).documentation; if (binding_documentation) service->binding_documentation[binding_name] = binding_documentation; // collect policies for the service and endpoints if ((*endpoint).wsp__Policy_) service->policy.push_back((*endpoint).wsp__Policy_); if ((*endpoint).wsp__PolicyReference_ && (*endpoint).wsp__PolicyReference_->policyPtr()) service->policy.push_back((*endpoint).wsp__PolicyReference_->policyPtr()); } } } Operation *op = new Operation(); op->operation = wsdl__operation_; op->name = types.aname(NULL, NULL, wsdl__operation_->name); op->prefix = prefix; op->URI = urienc(definitions.soap, URI); op->style = soap__operation_style; op->mep = soap__operation_mep; op->is_rest = false; if (soap__binding_transport && (!strcmp(soap__binding_transport+strlen(soap__binding_transport)-4, "http") || !strcmp(soap__binding_transport+strlen(soap__binding_transport)-5, "HTTP/"))) { if ((op->mep && strstr(op->mep, "soap-response")) || (http_method && !strcmp(http_method, "GET"))) op->protocol = "SOAP-GET"; else if (version == 1) op->protocol = "SOAP1.1"; else if (version == 2) op->protocol = "SOAP1.2"; else op->protocol = "SOAP"; } else { op->is_rest = true; if (http_method) op->protocol = http_method; else op->protocol = "HTTP"; } op->documentation = wsdl__operation_->documentation; op->operation_documentation = (*operation).documentation; op->parameterOrder = wsdl__operation_->parameterOrder; if (http__operation_location) op->action = http__operation_location; // TODO: for now, store HTTP location in action else { op->action = soap__operation_action; if ((*operation).soap__operation_) { if ((*operation).soap__operation_->soapActionRequired) op->action = (*operation).soap__operation_->soapAction; } else if (version != 2) op->action = ""; } if (operation_policy) op->policy.push_back(operation_policy); if (ext_operation_policy) op->policy.push_back(ext_operation_policy); op->input = new Message(); op->input->name = wsdl__operation_->name; if (input_body && soap__operation_style == rpc && !input_body->namespace_) { op->input->URI = ""; fprintf(stderr, "\nError: no soap:body namespace attribute\n"); } else if (input_body) op->input->URI = urienc(definitions.soap, input_body->namespace_); else op->input->URI = service->URI; op->input->style = soap__operation_style; if (input_body) { op->input->use = input_body->use; op->input->encodingStyle = input_body->encodingStyle; } if (input->wsa__Action) op->input->action = input->wsa__Action; else if (input->wsam__Action) op->input->action = input->wsam__Action; else if (op->action) op->input->action = op->action; else if (definitions.targetNamespace && (*binding).portTypePtr() && (*binding).portTypePtr()->name) { const char *name = input->name ? input->name : op->name; size_t l = strlen(definitions.targetNamespace) + strlen((*binding).portTypePtr()->name) + strlen(name); char *tmp = (char*)soap_malloc(definitions.soap, l + 3); if (tmp) { (SOAP_SNPRINTF(tmp, l + 3, l + 2), "%s/%s/%s", definitions.targetNamespace, (*binding).portTypePtr()->name, name); op->input->action = tmp; } } op->input->message = input->messagePtr(); op->input->element = input->elementPtr(); op->input->part = NULL; op->input->mustUnderstand = false; op->input->multipartRelated = NULL; op->input->content = input_mime_content; op->input->body_parts = NULL; op->input->layout = NULL; op->input->ext_documentation = NULL; if (ext_input) { op->input->multipartRelated = ext_input->mime__multipartRelated_; if (ext_input->mime__multipartRelated_ && !ext_input->mime__multipartRelated_->part.empty()) op->input->header = ext_input->mime__multipartRelated_->part.front().soap__header_; else if (!ext_input->soap__header_.empty()) op->input->header = ext_input->soap__header_; else if (!ext_input->wsoap__header_.empty()) op->input->wheader = ext_input->wsoap__header_; if (ext_input->mime__multipartRelated_ && !ext_input->mime__multipartRelated_->part.empty() && ext_input->mime__multipartRelated_->part.front().soap__body_) op->input->body_parts = ext_input->mime__multipartRelated_->part.front().soap__body_->parts; else if (input_body) op->input->body_parts = input_body->parts; if (ext_input->dime__message_) op->input->layout = ext_input->dime__message_->layout; else op->input->layout = NULL; op->input->ext_documentation = ext_input->documentation; } op->input->documentation = input->documentation; // collect input message policies if (op->input->message) { for (std::vector::const_iterator p = op->input->message->wsp__Policy_.begin(); p != op->input->message->wsp__Policy_.end(); ++p) op->input->policy.push_back(&(*p)); for (std::vector::const_iterator r = op->input->message->wsp__PolicyReference_.begin(); r != op->input->message->wsp__PolicyReference_.end(); ++r) op->input->policy.push_back((*r).policyPtr()); } if (input->wsp__Policy_) op->input->policy.push_back(input->wsp__Policy_); if (input->wsp__PolicyReference_ && input->wsp__PolicyReference_->policyPtr()) op->input->policy.push_back(input->wsp__PolicyReference_->policyPtr()); if (ext_input) { if (ext_input->wsp__Policy_) op->input->policy.push_back(ext_input->wsp__Policy_); if (ext_input->wsp__PolicyReference_ && ext_input->wsp__PolicyReference_->policyPtr()) op->input->policy.push_back(ext_input->wsp__PolicyReference_->policyPtr()); } if (soap__operation_style == document) op->input_name = types.oname("__", op->URI, op->input->name); else op->input_name = types.oname(NULL, op->input->URI, op->input->name); if (output) { soap__body *output_body = NULL; mime__mimeXml *output_mime = NULL; mime__content *output_mime_content = NULL; if (ext_output) { output_body = ext_output->soap__body_; output_mime = ext_output->mime__mimeXml_; output_mime_content = ext_output->mime__content_; if (ext_output->mime__multipartRelated_) { for (std::vector::const_iterator part = ext_output->mime__multipartRelated_->part.begin(); part != ext_output->mime__multipartRelated_->part.end(); ++part) if ((*part).soap__body_) { output_body = (*part).soap__body_; break; } } } if (ext_output && ext_output->mime__content_) { op->output = new Message(); op->output->name = NULL; op->output->URI = NULL; op->output->style = soap__operation_style; op->output->use = literal; op->output->encodingStyle = NULL; op->output->action = NULL; op->output->body_parts = NULL; op->output->part = NULL; op->output->mustUnderstand = false; op->output->multipartRelated = NULL; op->output->content = output_mime_content; op->output->message = output->messagePtr(); op->output->element = output->elementPtr(); op->output->layout = NULL; } else if (output_body || output_mime || output_mime_content || output->element) { op->output = new Message(); op->output->name = wsdl__operation_->name; // RPC uses operation/@name with suffix 'Response' as set below op->output->style = soap__operation_style; if (output_body) { op->output->use = output_body->use; // the code below is a hack around the RPC encoded response message element tag mismatch with Axis: if (!output_body->namespace_ || output_body->use == encoded) op->output->URI = op->input->URI; // encoded seems (?) to require the request's namespace else op->output->URI = urienc(definitions.soap, output_body->namespace_); op->output->encodingStyle = output_body->encodingStyle; } else op->output->URI = service->URI; if (output->wsa__Action) op->output->action = output->wsa__Action; else if (output->wsam__Action) op->output->action = output->wsam__Action; else if (http__operation_location) op->output->action = NULL; else if (op->action) { size_t l = strlen(op->action); char *tmp = (char*)soap_malloc(definitions.soap, l + 9); if (tmp) { (SOAP_SNPRINTF(tmp, l + 9, l + 8), "%sResponse", op->action); op->output->action = tmp; } } else if (definitions.targetNamespace && (*binding).portTypePtr() && (*binding).portTypePtr()->name) { const char *name = output->name ? output->name : op->name; size_t l = strlen(definitions.targetNamespace) + strlen((*binding).portTypePtr()->name) + strlen(name); char *tmp = (char*)soap_malloc(definitions.soap, l + 11); if (tmp) { (SOAP_SNPRINTF(tmp, l + 11, l + 10), "%s/%s/%s%s", definitions.targetNamespace, (*binding).portTypePtr()->name, name, output->name ? "" : "Response"); op->output->action = tmp; } } op->output->message = output->messagePtr(); op->output->element = output->elementPtr(); op->output->part = NULL; op->output->content = output_mime_content; op->output->body_parts = NULL; op->output->layout = NULL; op->output->ext_documentation = NULL; op->output->mustUnderstand = false; } if (ext_output) { op->output->multipartRelated = ext_output->mime__multipartRelated_; if (ext_output->mime__multipartRelated_ && !ext_output->mime__multipartRelated_->part.empty()) op->output->header = ext_output->mime__multipartRelated_->part.front().soap__header_; else if (!ext_output->soap__header_.empty()) op->output->header = ext_output->soap__header_; else if (!ext_output->wsoap__header_.empty()) op->output->wheader = ext_output->wsoap__header_; if (ext_output->mime__multipartRelated_ && !ext_output->mime__multipartRelated_->part.empty() && ext_output->mime__multipartRelated_->part.front().soap__body_) op->output->body_parts = ext_output->mime__multipartRelated_->part.front().soap__body_->parts; else if (output_body) op->output->body_parts = output_body->parts; if (ext_output->dime__message_) op->output->layout = ext_output->dime__message_->layout; else op->output->layout = NULL; op->output->ext_documentation = ext_output->documentation; } if (op->output->name) { size_t l = strlen(op->output->name); char *s = (char*)soap_malloc(definitions.soap, l + 9); if (s) { (SOAP_SNPRINTF(s, l + 9, l + 8), "%sResponse", op->output->name); if (soap__operation_style == document) op->output_name = types.oname("__", op->URI, s); else op->output_name = types.oname(NULL, op->output->URI, s); } } op->output->documentation = output->documentation; // collect output message policies if (op->output->message) { for (std::vector::const_iterator p = op->output->message->wsp__Policy_.begin(); p != op->output->message->wsp__Policy_.end(); ++p) op->output->policy.push_back(&(*p)); for (std::vector::const_iterator r = op->output->message->wsp__PolicyReference_.begin(); r != op->output->message->wsp__PolicyReference_.end(); ++r) op->output->policy.push_back((*r).policyPtr()); } if (output->wsp__Policy_) op->output->policy.push_back(output->wsp__Policy_); if (output->wsp__PolicyReference_ && output->wsp__PolicyReference_->policyPtr()) op->output->policy.push_back(output->wsp__PolicyReference_->policyPtr()); if (ext_output) { if (ext_output->wsp__Policy_) op->output->policy.push_back(ext_output->wsp__Policy_); if (ext_output->wsp__PolicyReference_ && ext_output->wsp__PolicyReference_->policyPtr()) op->output->policy.push_back(ext_output->wsp__PolicyReference_->policyPtr()); } } else { op->output_name = NULL; op->output = NULL; } analyze_headers(definitions, service, ext_input, ext_output); analyze_faults(definitions, service, op, operation); service->operation.push_back(op); } else fprintf(stderr, "\nError: no wsdl:definitions/binding/operation/input\n"); } else if (output) { // This part is similar to the previous clause, limited to one-way output operations soap__body *output_body = NULL; mime__mimeXml *output_mime = NULL; mime__content *output_mime_content = NULL; if (!reversed && ext_output) { output_body = ext_output->soap__body_; output_mime = ext_output->mime__mimeXml_; output_mime_content = ext_output->mime__content_; if (ext_output->mime__multipartRelated_) { for (std::vector::const_iterator part = ext_output->mime__multipartRelated_->part.begin(); part != ext_output->mime__multipartRelated_->part.end(); ++part) if ((*part).soap__body_) { output_body = (*part).soap__body_; break; } } } else if (ext_input) { output_body = ext_input->soap__body_; output_mime = ext_input->mime__mimeXml_; output_mime_content = ext_input->mime__content_; if (ext_input->mime__multipartRelated_) { for (std::vector::const_iterator part = ext_input->mime__multipartRelated_->part.begin(); part != ext_input->mime__multipartRelated_->part.end(); ++part) if ((*part).soap__body_) { output_body = (*part).soap__body_; break; } } } if (wsdl__operation_->style && !strcmp(wsdl__operation_->style, "http://www.w3.org/ns/wsdl/style/iri")) { output_mime_content = soap_new_mime__content(definitions.soap); output_mime_content->soap_default(definitions.soap); output_mime_content->type = (char*)"application/x-www-form-urlencoded"; } if (output_body || output_mime || output_mime_content || output->element) { char *URI; if (output_body && soap__operation_style == rpc) URI = output_body->namespace_; else if ((binding_count == 1 || !service_prefix) && definitions.targetNamespace && *definitions.targetNamespace) URI = definitions.targetNamespace; else if ((binding_count == 1 || !service_prefix) && definitions.name && *definitions.name) URI = definitions.name; else { // multiple service bidings are used, each needs a unique new URI size_t l = strlen(definitions.targetNamespace) + strlen(binding_name); URI = (char*)soap_malloc(definitions.soap, l + 2); if (URI) { soap_strcpy(URI, l + 2, definitions.targetNamespace); size_t n = strlen(URI); if (n > 0 && URI[n-1] != '/') { soap_strcpy(URI + n, l + 2 - n, "/"); ++n; } soap_strcpy(URI + n, l + 2 - n, binding_name); } } const char *prefix = types.nsprefix(service_prefix, URI); const char *name = types.aname(NULL, NULL, binding_name); // name of service is binding name Service *service = services[prefix]; if (!service) { service = services[prefix] = new Service(); service->prefix = prefix; service->URI = urienc(definitions.soap, URI); service->name = name; service->transport = soap__binding_transport; if ((*binding).portTypePtr() && (*binding).portTypePtr()->name) service->type = types.aname(NULL, NULL, (*binding).portTypePtr()->name); else service->type = NULL; // collect faults (TODO: this is not used anywhere) for (std::vector::const_iterator fault = (*binding).fault.begin(); fault != (*binding).fault.end(); ++fault) { Message *f = analyze_fault(definitions, service, *fault); if (f) service->fault[f->name] = f; } // collect policies for the bindings for (std::vector::const_iterator p = (*binding).wsp__Policy_.begin(); p != (*binding).wsp__Policy_.end(); ++p) service->policy.push_back(&(*p)); for (std::vector::const_iterator r = (*binding).wsp__PolicyReference_.begin(); r != (*binding).wsp__PolicyReference_.end(); ++r) service->policy.push_back((*r).policyPtr()); // collect policies for the service endpoints for (std::vector::const_iterator s = definitions.service.begin(); s != definitions.service.end(); ++s) { for (std::vector::const_iterator p = (*s).wsp__Policy_.begin(); p != (*s).wsp__Policy_.end(); ++p) service->policy.push_back(&(*p)); for (std::vector::const_iterator r = (*s).wsp__PolicyReference_.begin(); r != (*s).wsp__PolicyReference_.end(); ++r) service->policy.push_back((*r).policyPtr()); } // collect BPEL 2.0 partner link roles for (std::vector::const_iterator p = definitions.plnk__partnerLinkType.begin(); p != definitions.plnk__partnerLinkType.end(); ++p) { for (std::vector::const_iterator r = (*p).role.begin(); r != (*p).role.end(); ++r) { if ((binding_count > 1 && !service_prefix) || (*r).portTypePtr() == (*binding).portTypePtr()) service->role.push_back(&(*r)); } } } for (std::vector::const_iterator s = definitions.service.begin(); s != definitions.service.end(); ++s) { for (std::vector::const_iterator port = (*s).port.begin(); port != (*s).port.end(); ++port) { if ((*port).bindingPtr() == &(*binding)) { if ((*port).soap__address_ && (*port).soap__address_->location) service->location.insert(urienc(definitions.soap, (*port).soap__address_->location)); else if ((*port).wsa__EndpointReference && (*port).wsa__EndpointReference->Address) service->location.insert(urienc(definitions.soap, (*port).wsa__EndpointReference->Address)); if ((*port).wsaw__UsingAddressing) service->add_import("wsa5.h"); // TODO: HTTP address for HTTP operations // if ((*port).http__address_) // http__address_location = http__address_->location; // collect service documentation if ((*s).documentation) service->service_documentation[(*service).name] = (*s).documentation; if ((*port).documentation && (*port).name) service->port_documentation[(*port).name] = (*port).documentation; if (binding_documentation) service->binding_documentation[binding_name] = binding_documentation; // collect policies for the service and endpoints if ((*port).wsp__Policy_) service->policy.push_back((*port).wsp__Policy_); if ((*port).wsp__PolicyReference_ && (*port).wsp__PolicyReference_->policyPtr()) service->policy.push_back((*port).wsp__PolicyReference_->policyPtr()); } } } Operation *op = new Operation(); op->operation = wsdl__operation_; op->input_name = NULL; op->input = NULL; op->name = types.aname(NULL, NULL, wsdl__operation_->name); op->prefix = prefix; op->URI = urienc(definitions.soap, URI); op->style = soap__operation_style; op->mep = soap__operation_mep; op->is_rest = false; if (soap__binding_transport && (!strcmp(soap__binding_transport+strlen(soap__binding_transport)-4, "http") || !strcmp(soap__binding_transport+strlen(soap__binding_transport)-5, "HTTP/"))) { if ((op->mep && strstr(op->mep, "soap-response")) || (http_method && !strcmp(http_method, "GET"))) op->protocol = "SOAP-GET"; else if (version == 1) op->protocol = "SOAP1.1"; else if (version == 2) op->protocol = "SOAP1.2"; else op->protocol = "SOAP"; } else { op->is_rest = true; if (http_method) op->protocol = http_method; else op->protocol = "HTTP"; } op->documentation = wsdl__operation_->documentation; op->operation_documentation = (*operation).documentation; op->parameterOrder = wsdl__operation_->parameterOrder; if (http__operation_location) { op->action = http__operation_location; // TODO: for now, store HTTP location in action } else { op->action = soap__operation_action; if ((*operation).soap__operation_) { if ((*operation).soap__operation_->soapActionRequired) op->action = (*operation).soap__operation_->soapAction; } else if (version != 2) op->action = ""; } if (operation_policy) op->policy.push_back(operation_policy); if (ext_operation_policy) op->policy.push_back(ext_operation_policy); op->output = new Message(); // one-way output operation op->output->name = wsdl__operation_->name; // RPC uses operation/@name if (output_body && soap__operation_style == rpc && !output_body->namespace_) { op->output->URI = ""; fprintf(stderr, "\nError: no soap:body namespace attribute\n"); } else if (output_body) op->output->URI = urienc(definitions.soap, output_body->namespace_); else op->output->URI = service->URI; op->output->style = soap__operation_style; if (output_body) { op->output->use = output_body->use; op->output->encodingStyle = output_body->encodingStyle; } if (output->wsa__Action) op->output->action = output->wsa__Action; else if (output->wsam__Action) op->output->action = output->wsam__Action; else if (op->action) op->output->action = op->action; else if (definitions.targetNamespace && (*binding).portTypePtr() && (*binding).portTypePtr()->name) { const char *name = output->name ? output->name : op->name; size_t l = strlen(definitions.targetNamespace) + strlen((*binding).portTypePtr()->name) + strlen(name); char *tmp = (char*)soap_malloc(definitions.soap, l + 3); if (tmp) { (SOAP_SNPRINTF(tmp, l + 3, l + 2), "%s/%s/%s", definitions.targetNamespace, (*binding).portTypePtr()->name, name); op->output->action = tmp; } } op->output->message = output->messagePtr(); op->output->element = output->elementPtr(); op->output->part = NULL; op->output->mustUnderstand = false; op->output->multipartRelated = NULL; op->output->content = output_mime_content; op->output->body_parts = NULL; op->output->layout = NULL; op->output->ext_documentation = NULL; if (ext_output) { op->output->multipartRelated = ext_output->mime__multipartRelated_; if (ext_output->mime__multipartRelated_ && !ext_output->mime__multipartRelated_->part.empty()) op->output->header = ext_output->mime__multipartRelated_->part.front().soap__header_; else if (!ext_output->soap__header_.empty()) op->output->header = ext_output->soap__header_; else if (!ext_output->wsoap__header_.empty()) op->output->wheader = ext_output->wsoap__header_; if (ext_output->mime__multipartRelated_ && !ext_output->mime__multipartRelated_->part.empty() && ext_output->mime__multipartRelated_->part.front().soap__body_) op->output->body_parts = ext_output->mime__multipartRelated_->part.front().soap__body_->parts; else if (output_body) op->output->body_parts = output_body->parts; if (ext_output->dime__message_) op->output->layout = ext_output->dime__message_->layout; else op->output->layout = NULL; op->output->ext_documentation = ext_output->documentation; } op->output->documentation = output->documentation; // collect output message policies if (op->output->message) { for (std::vector::const_iterator p = op->output->message->wsp__Policy_.begin(); p != op->output->message->wsp__Policy_.end(); ++p) op->output->policy.push_back(&(*p)); for (std::vector::const_iterator r = op->output->message->wsp__PolicyReference_.begin(); r != op->output->message->wsp__PolicyReference_.end(); ++r) op->output->policy.push_back((*r).policyPtr()); } if (output->wsp__Policy_) op->output->policy.push_back(output->wsp__Policy_); if (output->wsp__PolicyReference_ && output->wsp__PolicyReference_->policyPtr()) op->output->policy.push_back(output->wsp__PolicyReference_->policyPtr()); if (ext_output) { if (ext_output->wsp__Policy_) op->output->policy.push_back(ext_output->wsp__Policy_); if (ext_output->wsp__PolicyReference_ && ext_output->wsp__PolicyReference_->policyPtr()) op->output->policy.push_back(ext_output->wsp__PolicyReference_->policyPtr()); } if (soap__operation_style == document) op->input_name = types.oname("__", op->URI, op->output->name); else op->input_name = types.oname(NULL, op->output->URI, op->output->name); size_t l = strlen(op->output->name); char *s = (char*)soap_malloc(definitions.soap, l + 9); if (s) { (SOAP_SNPRINTF(s, l + 9, l + 8), "%sResponse", op->output->name); if (soap__operation_style == document) op->output_name = types.oname("__", op->URI, s); else op->output_name = types.oname(NULL, op->output->URI, s); } analyze_headers(definitions, service, ext_input, ext_output); analyze_faults(definitions, service, op, operation); service->operation.push_back(op); } else fprintf(stderr, "\nError: no wsdl:definitions/binding/operation/output\n"); } else fprintf(stderr, "\nError: no wsdl:definitions/portType/operation/input and output\n"); } else fprintf(stderr, "\nError: no wsdl:definitions/portType/operation\n"); } } } } void Definitions::analyze_headers(const wsdl__definitions& definitions, Service *service, wsdl__ext_ioput *ext_input, wsdl__ext_ioput *ext_output) { // collect input headers and headerfaults if (ext_input) { const std::vector *soap__header_ = NULL; // check if soap header is in mime:multipartRelated if (ext_input->mime__multipartRelated_) { for (std::vector::const_iterator part = ext_input->mime__multipartRelated_->part.begin(); part != ext_input->mime__multipartRelated_->part.end(); ++part) if (!(*part).soap__header_.empty()) { soap__header_ = &(*part).soap__header_; break; } } if (!soap__header_) soap__header_ = &ext_input->soap__header_; for (std::vector::const_iterator header = soap__header_->begin(); header != soap__header_->end(); ++header) { Message *h = new Message(); h->message = (*header).messagePtr(); h->element = NULL; h->body_parts = NULL; h->part = (*header).partPtr(); if ((*header).namespace_) h->URI = urienc(definitions.soap, (*header).namespace_); else h->URI = service->URI; if (h->part && h->part->element) h->name = types.aname(NULL, NULL, h->part->element); else if (h->URI && h->part && h->part->name && h->part->type) h->name = types.aname(NULL, h->URI, h->part->name); else { fprintf(stderr, "\nError in SOAP Header part definition: input part \"%s\" missing?\n", h->part && h->part->name ? h->part->name : "?"); h->name = ""; } h->encodingStyle = (*header).encodingStyle; h->style = document; // irrelevant h->use = (*header).use; h->mustUnderstand = true; h->multipartRelated = NULL; h->content = NULL; h->layout = NULL; h->ext_documentation = NULL; // TODO: may wanto to add document content h->documentation = NULL; // TODO: may wanto to add document content service->header[h->name] = h; for (std::vector::const_iterator headerfault = (*header).headerfault.begin(); headerfault != (*header).headerfault.end(); ++headerfault) { Message *hf = new Message(); hf->message = (*headerfault).messagePtr(); hf->element = NULL; hf->body_parts = NULL; hf->part = (*headerfault).partPtr(); if ((*headerfault).namespace_) hf->URI = urienc(definitions.soap, (*headerfault).namespace_); else hf->URI = service->URI; if (hf->part && hf->part->element) hf->name = types.aname(NULL, NULL, hf->part->element); else if (hf->URI && hf->part && hf->part->name && hf->part->type) hf->name = types.aname(NULL, hf->URI, hf->part->name); else { fprintf(stderr, "\nError in SOAP HeaderFault part definition: input part \"%s\" missing?\n", hf->part && hf->part->name ? hf->part->name : "?"); hf->name = ""; } hf->encodingStyle = (*headerfault).encodingStyle; hf->action = NULL; hf->style = document; // irrelevant hf->use = (*headerfault).use; hf->mustUnderstand = false; hf->multipartRelated = NULL; hf->content = NULL; hf->layout = NULL; hf->ext_documentation = NULL; // TODO: may wanto to add document content hf->documentation = NULL; // TODO: may wanto to add document content service->headerfault[hf->name] = hf; } } for (std::vector::const_iterator wheader = ext_input->wsoap__header_.begin(); wheader != ext_input->wsoap__header_.end(); ++wheader) { Message *h = new Message(); h->message = NULL; h->element = (*wheader).elementPtr(); h->body_parts = NULL; h->part = NULL; h->URI = NULL; h->mustUnderstand = (*wheader).mustUnderstand_; h->name = types.aname(NULL, NULL, (*wheader).element); h->encodingStyle = NULL; h->style = document; // irrelevant h->use = literal; h->multipartRelated = NULL; h->content = NULL; h->layout = NULL; h->ext_documentation = NULL; // TODO: may want to add document content h->documentation = NULL; // TODO: may want to add document content service->header[h->name] = h; } } // collect output headers and headerfaults if (ext_output) { const std::vector *soap__header_ = NULL; // check if soap header is in mime:multipartRelated if (ext_output->mime__multipartRelated_) { for (std::vector::const_iterator part = ext_output->mime__multipartRelated_->part.begin(); part != ext_output->mime__multipartRelated_->part.end(); ++part) if (!(*part).soap__header_.empty()) { soap__header_ = &(*part).soap__header_; break; } } if (!soap__header_) soap__header_ = &ext_output->soap__header_; for (std::vector::const_iterator header = soap__header_->begin(); header != soap__header_->end(); ++header) { Message *h = new Message(); h->message = (*header).messagePtr(); h->element = NULL; h->body_parts = NULL; h->part = (*header).partPtr(); h->URI = urienc(definitions.soap, (*header).namespace_); if (h->part && h->part->element) h->name = types.aname(NULL, NULL, h->part->element); else if (h->URI && h->part && h->part->name && h->part->type) h->name = types.aname(NULL, h->URI, h->part->name); else { fprintf(stderr, "\nError in SOAP Header part definition: output part \"%s\" missing?\n", h->part && h->part->name ? h->part->name : "?"); h->name = ""; } h->encodingStyle = (*header).encodingStyle; h->style = document; // irrelevant h->use = (*header).use; h->mustUnderstand = false; h->multipartRelated = NULL; h->content = NULL; h->layout = NULL; h->ext_documentation = NULL; // TODO: may want to add document content h->documentation = NULL; // TODO: may want to add document content service->header[h->name] = h; for (std::vector::const_iterator headerfault = (*header).headerfault.begin(); headerfault != (*header).headerfault.end(); ++headerfault) { Message *hf = new Message(); hf->message = (*headerfault).messagePtr(); hf->element = NULL; hf->body_parts = NULL; hf->part = (*headerfault).partPtr(); if ((*headerfault).namespace_) hf->URI = urienc(definitions.soap, (*headerfault).namespace_); else hf->URI = service->URI; if (hf->part && hf->part->element) hf->name = types.aname(NULL, NULL, hf->part->element); else if (hf->URI && hf->part && hf->part->name && hf->part->type) hf->name = types.aname(NULL, hf->URI, hf->part->name); else { fprintf(stderr, "\nError in SOAP HeaderFault part definition: output part \"%s\" missing?\n", hf->part && hf->part->name ? hf->part->name : "?"); hf->name = ""; } hf->encodingStyle = (*headerfault).encodingStyle; hf->action = NULL; hf->style = document; // irrelevant hf->use = (*headerfault).use; hf->mustUnderstand = false; hf->multipartRelated = NULL; hf->content = NULL; hf->layout = NULL; hf->ext_documentation = NULL; // TODO: may wanto to add document content hf->documentation = NULL; // TODO: may wanto to add document content service->headerfault[hf->name] = hf; } } for (std::vector::const_iterator wheader = ext_output->wsoap__header_.begin(); wheader != ext_output->wsoap__header_.end(); ++wheader) { Message *h = new Message(); h->message = NULL; h->element = (*wheader).elementPtr(); h->body_parts = NULL; h->part = NULL; h->URI = NULL; h->mustUnderstand = (*wheader).mustUnderstand_; h->name = types.aname(NULL, NULL, (*wheader).element); h->encodingStyle = NULL; h->style = document; // irrelevant h->use = literal; h->multipartRelated = NULL; h->content = NULL; h->layout = NULL; h->ext_documentation = NULL; // TODO: may want to add document content h->documentation = NULL; // TODO: may want to add document content service->header[h->name] = h; } } } void Definitions::analyze_faults(const wsdl__definitions& definitions, Service *service, Operation *op, std::vector::const_iterator& operation) { for (std::vector::const_iterator fault = (*operation).fault.begin(); fault != (*operation).fault.end(); ++fault) { Message *f = analyze_fault(definitions, service, *fault); if (f) { op->outfault.push_back(f); service->fault[f->name] = f; } } for (std::vector::const_iterator infault = (*operation).infault.begin(); infault != (*operation).infault.end(); ++infault) { Message *f = analyze_fault(definitions, service, *infault); if (f) { op->infault.push_back(f); service->fault[f->name] = f; } } for (std::vector::const_iterator outfault = (*operation).outfault.begin(); outfault != (*operation).outfault.end(); ++outfault) { Message *f = analyze_fault(definitions, service, *outfault); if (f) { op->outfault.push_back(f); service->fault[f->name] = f; } } } Message *Definitions::analyze_fault(const wsdl__definitions& definitions, Service *service, const wsdl__ext_fault& ext_fault) { Message *f = NULL; const wsdl__fault *fault = ext_fault.faultPtr(); if (fault && (fault->messagePtr() || fault->elementPtr())) { f = new Message(); f->message = fault->messagePtr(); f->element = fault->elementPtr(); f->body_parts = NULL; f->part = NULL; f->encodingStyle = NULL; if (ext_fault.soap__fault_) f->encodingStyle = ext_fault.soap__fault_->encodingStyle; f->action = NULL; if (fault->wsa__Action) f->action = fault->wsa__Action; else f->action = fault->wsam__Action; if (f->element && f->element->schemaPtr()) f->URI = urienc(definitions.soap, f->element->schemaPtr()->targetNamespace); else if (ext_fault.soap__fault_ && ext_fault.soap__fault_->namespace_) f->URI = urienc(definitions.soap, ext_fault.soap__fault_->namespace_); else f->URI = service->URI; // must have a unique URI f->style = document; // irrelevant f->use = literal; if (ext_fault.soap__fault_) f->use = ext_fault.soap__fault_->use; if (ext_fault.wsoap__code) { size_t l = strlen(ext_fault.wsoap__code); if (ext_fault.wsoap__subcodes) l += strlen(ext_fault.wsoap__subcodes); char *s = (char*)soap_malloc(definitions.soap, l + 40); if (s) { (SOAP_SNPRINTF(s, l + 40, l + 19), "\"%s\" with subcodes \"%s\"", ext_fault.wsoap__code, ext_fault.wsoap__subcodes ? ext_fault.wsoap__subcodes : ""); f->body_parts = s; } } else f->ext_documentation = ext_fault.documentation; f->mustUnderstand = false; f->multipartRelated = NULL; f->content = NULL; f->layout = NULL; if (f->message) { f->name = types.aname("_", f->URI, f->message->name); f->documentation = f->message->documentation; } else { f->name = types.aname(NULL, f->URI, fault->element); f->documentation = fault->documentation; } // collect fault message policies if (fault->wsp__Policy_) f->policy.push_back(fault->wsp__Policy_); if (fault->wsp__PolicyReference_ && fault->wsp__PolicyReference_->policyPtr()) f->policy.push_back(fault->wsp__PolicyReference_->policyPtr()); if (ext_fault.wsp__Policy_) f->policy.push_back(ext_fault.wsp__Policy_); if (ext_fault.wsp__PolicyReference_ && ext_fault.wsp__PolicyReference_->policyPtr()) f->policy.push_back(ext_fault.wsp__PolicyReference_->policyPtr()); } else if (ext_fault.soap__fault_ && ext_fault.soap__fault_->name) fprintf(stderr, "\nError: no wsdl:definitions/binding/operation/fault/soap:fault \"%s\"\n", ext_fault.soap__fault_->name); else fprintf(stderr, "\nError: no wsdl:definitions/binding/operation/fault/soap:fault\n"); return f; } void Definitions::analyze_application(const wsdl__definitions& definitions) { // Analyze WADL application resources and build Service information const wadl__application *app = definitions.appPtr(); if (app) { if (vflag) fprintf(stderr, "\nAnalyzing and collecting WADL application resources\n"); for (std::vector::const_iterator resources = app->resources.begin(); resources != app->resources.end(); ++resources) { const char *URI = (*resources).base; const char *prefix = types.nsprefix(service_prefix, URI); Service *service = services[prefix]; if (!service) { service = services[prefix] = new Service(); service->prefix = prefix; service->URI = urienc(definitions.soap, URI); size_t l = strlen(prefix); char *name = (char*)soap_malloc(definitions.soap, l + 5); (SOAP_SNPRINTF(name, l + 5, l + 4), "%sREST", prefix); service->name = name; service->transport = NULL; service->type = NULL; service->location.insert(URI); for (std::vector::const_iterator resource = (*resources).resource.begin(); resource != (*resources).resource.end(); ++resource) { const char *path = urienc(definitions.soap, (*resource).path); const char *queryType = (*resource).queryType; analyze_resource(definitions, service, &*resource, URI, path, queryType); for (std::vector::const_iterator type = (*resource).typePtrs().begin(); type != (*resource).typePtrs().end(); ++type) analyze_resource(definitions, service, *type, URI, path, queryType); } } } } } void Definitions::analyze_resource(const wsdl__definitions& definitions, Service *service, const wadl__resource_USCOREtype *type, const char *URI, const char *path, const char *queryType) { for (std::vector<__wadl__method_resource_choice>::const_iterator choice = type->__choice.begin(); choice != type->__choice.end(); ++choice) { const wadl__method *method = (*choice).method; if (method) { while (method->methodPtr() && !method->id) method = method->methodPtr(); Operation *op = new Operation(); op->is_rest = true; op->protocol = soap_wadl__HTTPMethods2s(definitions.soap, method->name); op->operation = NULL; // wsdl__operation_; op->prefix = service->prefix; op->URI = service->URI; op->mep = NULL; op->style = document; op->parameterOrder = NULL; if (path && *path != '/') { size_t l = strlen(path); char *action = (char*)soap_malloc(definitions.soap, l + 2); (SOAP_SNPRINTF(action, l + 2, l + 1), "/%s", path); op->action = action; } else { op->action = path; } op->documentation = NULL; op->operation_documentation = NULL; if (!method->doc.empty()) { const wadl__doc& doc = *method->doc.begin(); op->documentation = doc.title; op->operation_documentation = doc.__mixed; } const char *name = method->id ? method->id : op->protocol; op->name = types.aname(NULL, URI, name); op->input_name = types.oname("__", URI, name); size_t l = strlen(name); char *resname = (char*)soap_malloc(definitions.soap, l + 9); if (resname) { (SOAP_SNPRINTF(resname, l + 9, l + 8), "%sResponse", name); op->output_name = types.oname("__", URI, resname); } op->input = NULL; if (method->request) { wsdl__message *message = NULL; const xs__element *element = NULL; const char *documentation = NULL; for (std::vector::const_iterator rep = method->request->representation.begin(); rep != method->request->representation.end(); ++rep) { const wadl__representation *representation = &*rep; while (representation->representationPtr() && !representation->id) representation = representation->representationPtr(); if (!representation->mediaType || strstr(representation->mediaType, "xml")) { if (representation->elementPtr()) element = representation->elementPtr(); if (!representation->doc.empty()) { const wadl__doc& doc = *representation->doc.begin(); if (doc.__mixed && *doc.__mixed) documentation = doc.__mixed; else documentation = doc.title; } break; } } std::vector allparam = type->param; for (std::vector::const_iterator par = method->request->param.begin(); par != method->request->param.end(); ++par) allparam.push_back(*par); for (std::vector::const_iterator par = allparam.begin(); par != allparam.end(); ++par) { const wadl__param *param = &*par; while (param->paramPtr() && !param->id) param = param->paramPtr(); if (param->name) { if (param->style && (*param->style == matrix || *param->style == header || *param->style == plain)) { if (!Wflag) fprintf(stderr, "\nWarning: ignoring param '%s' with unsupported style '%s' in method/response/representation\n", param->name, soap_wadl__ParamStyle2s(definitions.soap, *param->style)); } else { if (!message) { message = soap_new_wsdl__message(definitions.soap); message->soap_default(definitions.soap); } wsdl__part part; part.soap_default(definitions.soap); part.name = param->name; if (param->type) { part.type = param->type; if (param->simpleTypePtr()) part.simpleTypePtr(param->simpleTypePtr()); else if (param->complexTypePtr()) part.complexTypePtr(param->complexTypePtr()); } else { part.type = (char*)"xsd:string"; } part.set_optional(param->required == false); if (param->repeating) { part.set_optional(true); part.set_repeating(true); } else if (param->default_) { part.set_optional(true); // There is no point in setting the default value if param is optional // part.set_default(param->default_); } else if (param->fixed) { part.set_optional(false); part.set_fixed(true); part.set_default(param->fixed); } for (std::vector::const_iterator i = param->option.begin(); i != param->option.end(); ++i) part.set_option((*i).value); if (!param->doc.empty()) { const wadl__doc& doc = *param->doc.begin(); if (doc.__mixed && *doc.__mixed) part.documentation = doc.__mixed; else part.documentation = doc.title; } message->part.push_back(part); } } } op->input = new Message; op->input->name = op->input_name; op->input->URI = service->URI; op->input->style = op->style; op->input->use = literal; op->input->encodingStyle = NULL; op->input->action = NULL; op->input->message = message; op->input->element = element; op->input->part = NULL; op->input->mustUnderstand = false; op->input->multipartRelated = NULL; op->input->content = soap_new_mime__content(definitions.soap); op->input->content->soap_default(definitions.soap); op->input->content->type = (char*)queryType; op->input->body_parts = NULL; op->input->layout = NULL; op->input->multipartRelated = NULL; op->input->layout = NULL; op->input->documentation = documentation; op->input->ext_documentation = NULL; if (!method->request->doc.empty()) { const wadl__doc& doc = *method->request->doc.begin(); if (doc.__mixed && *doc.__mixed) op->input->ext_documentation = doc.__mixed; else op->input->ext_documentation = doc.title; } } op->output = NULL; for (std::vector::const_iterator response = method->response.begin(); response != method->response.end(); ++response) { const char *name = NULL; const xs__element *element = NULL; for (std::vector::const_iterator rep = (*response).representation.begin(); rep != (*response).representation.end(); ++rep) { const wadl__representation *representation = &*rep; while (representation->representationPtr() && !representation->id) representation = representation->representationPtr(); if (!representation->mediaType || strstr(representation->mediaType, "xml")) { if (representation->elementPtr()) { name = representation->element; element = representation->elementPtr(); } for (std::vector::const_iterator param = representation->param.begin(); param != representation->param.end(); ++param) if (!Wflag) fprintf(stderr, "\nWarning: ignoring param '%s' in method/response/representation\n", param->name ? param->name : ""); break; } } if (element) { if (!op->output && (!(*response).status || strstr((*response).status, "200") || strstr((*response).status, "201") || strstr((*response).status, "202"))) { op->output = new Message(); op->output->name = op->output_name; op->output->URI = service->URI; op->output->style = op->style; op->output->use = literal; op->output->encodingStyle = NULL; op->output->action = NULL; op->output->message = NULL; op->output->element = element; op->output->part = NULL; op->output->mustUnderstand = false; op->output->multipartRelated = NULL; op->output->content = NULL; op->output->body_parts = NULL; op->output->layout = NULL; op->output->ext_documentation = NULL; op->output->multipartRelated = NULL; op->output->layout = NULL; op->output->ext_documentation = NULL; op->output->documentation = NULL; } else { Message *fault = new Message(); fault->name = types.aname(NULL, NULL, name); fault->URI = service->URI; fault->style = op->style; fault->use = literal; fault->encodingStyle = NULL; fault->action = NULL; fault->message = NULL; fault->element = element; fault->part = NULL; fault->mustUnderstand = false; fault->multipartRelated = NULL; fault->content = NULL; fault->body_parts = (*response).status; fault->layout = NULL; fault->ext_documentation = NULL; fault->multipartRelated = NULL; fault->layout = NULL; fault->ext_documentation = NULL; fault->documentation = NULL; op->outfault.push_back(fault); } } } service->operation.push_back(op); } wadl__resource *resource = (*choice).resource; if (resource) { const char *fullpath = NULL; if (resource->path) fullpath = urienc(definitions.soap, resource->path); if (path) { if (fullpath) { size_t l = strlen(path) + strlen(fullpath) + 2; char *s = (char*)soap_malloc(definitions.soap, l); (SOAP_SNPRINTF_SAFE(s, l), "%s/%s", path, fullpath + (*fullpath == '/')); fullpath = s; } else { fullpath = path; } } if (!type->param.empty()) { std::vector allparam = type->param; for (std::vector::const_iterator par = resource->param.begin(); par != resource->param.end(); ++par) allparam.push_back(*par); resource->param.swap(allparam); } analyze_resource(definitions, service, resource, URI, fullpath, resource->queryType ? resource->queryType : queryType); } } } void Definitions::compile(const wsdl__definitions& definitions) { // compile the definitions and generate gSOAP header file const char *defs; if (definitions.name) defs = types.aname(NULL, NULL, definitions.name); else defs = "Service"; ident(); fprintf(stream, "/**\n\n"); if (!Lflag) fprintf(stream, "@page page_notes Notes\n\n@note HINTS:\n - Run soapcpp2 on %s to generate the SOAP/XML processing logic:\n Use soapcpp2 -I to specify paths for #import\n Use soapcpp2 -j to generate improved proxy and server classes.\n Use soapcpp2 -r to generate a report.\n - Edit 'typemap.dat' to control namespace bindings and type mappings:\n It is strongly recommended to customize the names of the namespace prefixes\n generated by wsdl2h. To do so, modify the prefix bindings in the Namespaces\n section below and add the modified lines to 'typemap.dat' to rerun wsdl2h.\n - Run Doxygen (www.doxygen.org) on this file to generate documentation.\n - Use wsdl2h -c to generate pure C code.\n - Use wsdl2h -R to include the REST operations defined by the WSDLs.\n - Use wsdl2h -O3 or -O4 to optimize by removing unused schema components.\n - Use wsdl2h -d to enable DOM support for xsd:any and xsd:anyType.\n - Use wsdl2h -F to simulate struct-type derivation in C (also works in C++).\n - Use wsdl2h -f to generate flat C++ class hierarchy, removes type derivation.\n - Use wsdl2h -g to generate top-level root elements with readers and writers.\n - Use wsdl2h -U to map XML names to C++ Unicode identifiers instead of _xNNNN.\n - Use wsdl2h -u to disable the generation of unions.\n - Use wsdl2h -L to remove this @note and all other @note comments.\n - Use wsdl2h -nname to use name as the base namespace prefix instead of 'ns'.\n - Use wsdl2h -Nname for service prefix and produce multiple service bindings\n - Struct/class members serialized as XML attributes are annotated with a '@'.\n - Struct/class members that have a special role are annotated with a '$'.\n\n@warning\n DO NOT INCLUDE THIS ANNOTATED FILE DIRECTLY IN YOUR PROJECT SOURCE CODE.\n USE THE FILES GENERATED BY soapcpp2 FOR YOUR PROJECT'S SOURCE CODE:\n THE GENERATED soapStub.h FILE CONTAINS THIS CONTENT WITHOUT ANNOTATIONS.\n\n", outfile ? outfile : "this file"); fprintf(stream, "@copyright LICENSE:\n@verbatim\n%s@endverbatim\n\n*/\n\n", licensenotice); // gsoap compiler options: 'w' disables WSDL/schema output to avoid file collisions if (cflag) fprintf(stream, "\n//gsoapopt c,w\n"); else if (c11flag) fprintf(stream, "\n//gsoapopt c++11,w\n"); else fprintf(stream, "\n//gsoapopt c++,w\n"); banner("Definitions", definitions.targetNamespace ? definitions.targetNamespace : ""); // copy documentation from WSDL definitions if (definitions.documentation) { fprintf(stream, "/* WSDL Documentation:\n\n"); text(definitions.documentation); fprintf(stream, "*/\n\n"); } if (definitions.version) { banner("Version", definitions.version); fprintf(stream, "#define SOAP_WSDL_VERSION \"%s\"\n", definitions.version); } if (!cflag) { const char *s; if (!sflag) { s = types.vname("$CONTAINER"); if (s && *s != '*' && *s != '$') { banner("$CONTAINER", s); if (!strcmp(s, "std::deque")) fprintf(stream, "#include \n"); else if (!strcmp(s, "std::list")) fprintf(stream, "#include \n"); else if (!strcmp(s, "std::vector")) fprintf(stream, "#include \n"); else if (!strcmp(s, "std::set")) fprintf(stream, "#include \n"); fprintf(stream, "template class %s;\n", s); } } s = types.vname("$POINTER"); if (s && *s != '*' && *s != '$') { banner("$POINTER", s); fprintf(stream, "volatile template class %s;\n", s); } } banner("Import"); if (dflag) { fprintf(stream, "\n// dom.h declares the DOM xsd__anyType object (compiler and link with dom.cpp)\n"); fprintf(stream, "#import \"dom.h\"\n"); } if (mflag) { fprintf(stream, "#import \""); fprintf(stream, "xsd.h\"\t// import built-in XSD types.\n"); } for (SetOfString::const_iterator u = exturis.begin(); u != exturis.end(); ++u) { bool found = false; size_t n = strlen(*u); for (SetOfString::const_iterator i = definitions.builtinTypes().begin(); i != definitions.builtinTypes().end(); ++i) { if (**i == '"' && !strncmp(*u, *i + 1, n) && (*i)[n+1] == '"') { found = true; break; } } if (!found) { for (SetOfString::const_iterator j = definitions.builtinElements().begin(); j != definitions.builtinElements().end(); ++j) { if (**j == '"' && !strncmp(*u, *j + 1, n) && (*j)[n+1] == '"') { found = true; break; } } } if (!found) { for (SetOfString::const_iterator k = definitions.builtinAttributes().begin(); k != definitions.builtinAttributes().end(); ++k) { if (**k == '"' && !strncmp(*u, *k + 1, n) && (*k)[n+1] == '"') { found = true; break; } } } if (found) { if (vflag) fprintf(stderr, "import %s\n", *u); fprintf(stream, "#import \"%s.h\"\t// %s = <%s>\n", types.nsprefix(NULL, *u), types.nsprefix(NULL, *u), *u); } } banner("Schema Namespaces"); // Determine if bindings use SOAP 1.2 soap12 = false; for (Namespace *p = definitions.soap->local_namespaces; p && p->id; p++) { if (p->out && !strcmp(p->id, "soap") && !strcmp(p->out, "http://schemas.xmlsoap.org/wsdl/soap12/")) { soap12 = true; break; } } if (!soap12) { for (std::vector::const_iterator i = definitions.import.begin(); i != definitions.import.end(); ++i) { if ((*i).definitionsPtr()) { for (Namespace *p = (*i).definitionsPtr()->soap->local_namespaces; p && p->id; p++) { if (p->out && !strcmp(p->id, "soap") && !strcmp(p->out, "http://schemas.xmlsoap.org/wsdl/soap12/")) { soap12 = true; break; } } } if (soap12) break; } } if (definitions.types) { if (!Lflag) { fprintf(stream, "\n/* NOTE:\n\nIt is strongly recommended to customize the names of the namespace prefixes\ngenerated by wsdl2h. To do so, modify the prefix bindings below and add the\nmodified lines to 'typemap.dat' then rerun wsdl2h (use wsdl2h -t typemap.dat):\n\n"); if (definitions.targetNamespace && *definitions.targetNamespace) fprintf(stream, "%s = \"%s\"\n", types.nsprefix(service_prefix, definitions.targetNamespace), definitions.targetNamespace); for (std::vector::const_iterator schema1 = definitions.types->xs__schema_.begin(); schema1 != definitions.types->xs__schema_.end(); ++schema1) if ((*schema1)->targetNamespace && *(*schema1)->targetNamespace && (!definitions.targetNamespace || strcmp((*schema1)->targetNamespace, definitions.targetNamespace))) fprintf(stream, "%s = \"%s\"\n", types.nsprefix(NULL, (*schema1)->targetNamespace), (*schema1)->targetNamespace); fprintf(stream, "\n*/\n"); } for (std::vector::const_iterator schema2 = definitions.types->xs__schema_.begin(); schema2 != definitions.types->xs__schema_.end(); ++schema2) { const char *t = types.nsprefix(NULL, (*schema2)->targetNamespace); if (t && *t) { fprintf(stream, "\n"); types.document((*schema2)->annotation); fprintf(stream, "#define SOAP_NAMESPACE_OF_%s\t\"%s\"\n", types.aname(NULL, NULL, t), urienc(definitions.soap, (*schema2)->targetNamespace)); fprintf(stream, schemaformat, t, "namespace", urienc(definitions.soap, (*schema2)->targetNamespace)); if ((*schema2)->elementFormDefault == (*schema2)->attributeFormDefault) fprintf(stream, schemaformat, t, "form", (*schema2)->elementFormDefault == qualified ? "qualified" : "unqualified"); else { fprintf(stream, schemaformat, t, "elementForm", (*schema2)->elementFormDefault == qualified ? "qualified" : "unqualified"); fprintf(stream, schemaformat, t, "attributeForm", (*schema2)->attributeFormDefault == qualified ? "qualified" : "unqualified"); } } } } // generate the prototypes first: these should allow use before def, e.g. class names then generate the defs // check if xsd:anyType is used if (!pflag) { for (SetOfString::const_iterator i = definitions.builtinTypes().begin(); i != definitions.builtinTypes().end(); ++i) { if (!strcmp(*i, "xs:anyType")) { pflag = 1; if (!wflag && !Pflag && !fflag && (!cflag || Fflag)) fprintf(stderr, "\nNote: option -p auto-enabled to generate wrappers for built-in types derived from xsd__anyType to support polymorphism in XML by (de)serializing any derived type of xsd:anyType (or xsd:anySimpleType) as elements annotated by xsi:type attributes in XML, use option -P to suppress and disable this feature\n"); break; } } } // produce built-in primitive types banner("Built-in Schema Types and Top-Level Elements and Attributes"); // define xsd:anyType first, if used if (pflag) { if (Fflag && !fflag && !Pflag) { if (cflag) { types.usetypemap["xsd__anyType"] = "struct xsd__anyType_"; types.ptrtypemap["xsd__anyType"] = "struct xsd__anyType_*"; } else { fprintf(stream, "/// Built-in root XSD type \"xs:anyType\".\n"); fprintf(stream, "class xsd__anyType_;\n\n"); types.usetypemap["xsd__anyType"] = "xsd__anyType_"; types.ptrtypemap["xsd__anyType"] = "xsd__anyType_*"; types.knames.insert("xsd__anyType_"); const char *r = types.vname("$POINTER"); if (r && *r != '*' && *r != '$') { MapOfStringToString::iterator i = types.smptypemap.find("xsd__anyType"); if (i != types.smptypemap.end()) types.smptypemap.erase(i); types.smptypemap["xsd__anyType"] = types.pname(true, true, NULL, NULL, "xs:anyType"); } } } else if (!dflag) { const char *s, *t; t = types.cname(NULL, NULL, "xs:anyType"); s = types.deftypemap[t]; if (s) { if (*s) { if (!mflag) { fprintf(stream, "/// Built-in XSD root type \"xs:anyType\".\n///\n"); if (!cflag && !Lflag) fprintf(stream, "/// @note Call virtual method soap_type() generated by soapcpp2 to check runtime type is SOAP_TYPE_%s or a derived type. Use option -P to remove this class.\n", t); fprintf(stream, "%s\n\n", s); } } s = types.usetypemap[t]; if (s) { if (mflag) fprintf(stream, "// xsd.h: should define type %s\n\n", s); types.knames.insert(s); } } else { fprintf(stderr, "\nError: no xsd__anyType defined in type map\n"); pflag = 0; } } } if (fflag || Pflag) pflag = 0; if (vflag) fprintf(stderr, "\nGenerating built-in types\n"); for (SetOfString::const_iterator i = definitions.builtinTypes().begin(); i != definitions.builtinTypes().end(); ++i) { const char *s, *t; if (!cflag && !strcmp(*i, "xs:anyType")) continue; // make an exception for the rarely-used xs:anySimpleType to equal xs:anyType to make coding easier if (Qflag && !strcmp(*i, "xs:anySimpleType") && types.deftypemap.find("xsd__anySimpleType") == types.deftypemap.end()) { if (pflag) { types.deftypemap["xsd__anySimpleType"] = ""; if (Fflag) { if (cflag) { types.usetypemap["xsd__anySimpleType"] = "struct xsd__anyType_"; types.ptrtypemap["xsd__anySimpleType"] = "struct xsd__anyType_*"; } else { types.usetypemap["xsd__anySimpleType"] = "xsd__anyType_"; types.ptrtypemap["xsd__anySimpleType"] = "xsd__anyType_*"; } } else if (cflag) { types.usetypemap["xsd__anySimpleType"] = types.usetypemap["xsd__anyType"]; } else { types.usetypemap["xsd__anySimpleType"] = "xsd__anyType*"; types.ptrtypemap["xsd__anySimpleType"] = "xsd__anyType*"; } } else { types.deftypemap["xsd__anySimpleType"] = ""; types.usetypemap["xsd__anySimpleType"] = types.usetypemap["xsd__anyType"]; types.ptrtypemap["xsd__anySimpleType"] = types.ptrtypemap["xsd__anyType"]; } } // make an exception for SOAP-ENC:Array if (!strcmp(*i, "SOAP-ENC:Array") && types.deftypemap.find("SOAP_ENC__Array") == types.deftypemap.end()) { if (pflag) { if (Fflag) { if (cflag) { types.deftypemap["SOAP_ENC__Array"] = "struct SOAP_ENC__Array\n{\n/// Pointer to array of elements of type xs:anyType\n struct xsd__anyType_ *__ptr;\n/// Size of the array\n int __size;\n};"; types.usetypemap["SOAP_ENC__Array"] = "struct SOAP_ENC__Array"; } else { types.deftypemap["SOAP_ENC__Array"] = "class SOAP_ENC__Array\n{ public:\n/// Pointer to array of elements of type xs:anyType\n xsd__anyType_ *__ptr;\n/// Size of the array\n int __size;\n};"; types.usetypemap["SOAP_ENC__Array"] = "SOAP_ENC__Array"; } } else if (cflag) { types.deftypemap["SOAP_ENC__Array"] = soap_strdup(definitions.soap, (std::string("struct SOAP_ENC__Array\n{\n/// Pointer to array of elements of type xs:anyType\n ") + std::string(types.usetypemap["xsd__anyType"]) + std::string(" *__ptr;\n/// Size of the array\n int __size;\n};")).c_str()); types.usetypemap["SOAP_ENC__Array"] = "struct SOAP_ENC__Array"; } else { types.deftypemap["SOAP_ENC__Array"] = "class SOAP_ENC__Array : public xsd__anyType\n{ public:\n/// Pointer to array of elements of type xs:anyType\n xsd__anyType **__ptr;\n/// Size of the array\n int __size;\n};"; types.usetypemap["SOAP_ENC__Array"] = "SOAP_ENC__Array"; } } else if (cflag) { if (dflag) { types.deftypemap["SOAP_ENC__Array"] = "struct SOAP_ENC__Array\n{\n/// Pointer to array of DOM nodes\n xsd__anyType *__ptr;\n/// Size of the array\n int __size;\n};"; types.usetypemap["SOAP_ENC__Array"] = "struct SOAP_ENC__Array"; } else { types.deftypemap["SOAP_ENC__Array"] = "struct SOAP_ENC__Array\n{\n/// Pointer to array of XML strings\n _XML *__ptr;\n/// Size of the array\n int __size;\n};"; types.usetypemap["SOAP_ENC__Array"] = "struct SOAP_ENC__Array"; } } else { if (dflag) { types.deftypemap["SOAP_ENC__Array"] = "class SOAP_ENC__Array\n{ public:\n/// Pointer to array of DOM nodes\n xsd__anyType *__ptr;\n/// Size of the array\n int __size;\n};"; types.usetypemap["SOAP_ENC__Array"] = "SOAP_ENC__Array"; } else { types.deftypemap["SOAP_ENC__Array"] = "class SOAP_ENC__Array\n{ public:\n/// Pointer to array of XML strings\n _XML *__ptr;\n/// Size of the array\n int __size;\n};"; types.usetypemap["SOAP_ENC__Array"] = "SOAP_ENC__Array"; } } } t = types.cname(NULL, NULL, *i); s = types.deftypemap[t]; if (s) { if (*s) { if (**i == '"') fprintf(stream, "/// Imported type \"%s\" from typemap %s.\n", *i, mapfile ? mapfile : ""); else fprintf(stream, "/// Built-in type \"%s\".\n", *i); if (mflag) { fprintf(stream, "// (declaration of %s removed by option -m)\n\n", t); } else if (!iflag && !imported(*i)) { types.format(s); fprintf(stream, "\n"); } } s = types.usetypemap[t]; if (s && *s) { if (mflag && **i != '"') fprintf(stream, "// xsd.h: typemap override of type %s with %s\n\n", t, s); if (types.knames.find(s) == types.knames.end()) types.knames.insert(s); } } } for (SetOfString::const_iterator i = definitions.builtinTypes().begin(); i != definitions.builtinTypes().end(); ++i) { const char *s, *t; if (!cflag && (!strcmp(*i, "xs:anyType") || (Qflag && !strcmp(*i, "xs:anySimpleType")) || !strcmp(*i, "SOAP-ENC:Array"))) continue; t = types.cname(NULL, NULL, *i); s = types.deftypemap[t]; if (!s) { if (!mflag) { if (**i == '"') { fprintf(stream, "// Imported type \"%s\" defined by %s.\n\n", *i, t); } else if (!iflag) { s = types.tname(NULL, NULL, "xsd:string"); fprintf(stream, "/// Primitive built-in type \"%s\".\n", *i); fprintf(stream, "typedef %s %s;\n\n", s, t); types.deftname(TYPEDEF, false, types.is_ptr(NULL, NULL, "xsd:string"), NULL, NULL, *i, s); const char *u = types.uri(*i); if (u && !types.uris[u]) { fprintf(stream, schemaformat, types.nsprefix(types.prefix(*i), u), "namespace", u); fprintf(stream, "\n"); } } } else if (**i == '"') { fprintf(stream, "// Imported type \"%s\" defined by %s.\n\n", *i, t); } else { fprintf(stream, "// xsd.h: should define type %s\n\n", t); } types.deftname(TYPEDEF, false, false, NULL, NULL, *i, s); } if (pflag && !cflag && !Fflag) { if (!zflag || zflag > 8) s = types.wname(NULL, NULL, *i, NOLOOKUP); else s = types.aname(NULL, NULL, *i); if (!mflag) { fprintf(stream, "/// Class wrapper %s for built-in type \"%s\" extends xsd__anyType.\n", s, *i); if (!Lflag) fprintf(stream, "/// @note Call virtual method soap_type() generated by soapcpp2 to check runtime type is SOAP_TYPE_%s or a derived type. Use option -P to remove this class.\n", s); fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s); fprintf(stream, elementformat, types.tname(NULL, NULL, *i), "__item"); fprintf(stream, ";\n};\n\n"); } types.knames.insert(s); } } // produce built-in primitive elements if (vflag) fprintf(stderr, "\nGenerating built-in elements\n"); for (SetOfString::const_iterator j = definitions.builtinElements().begin(); j != definitions.builtinElements().end(); ++j) { const char *s, *t; t = types.cname("_", NULL, *j); s = types.deftypemap[t]; if (s) { if (*s) { if (**j == '"') fprintf(stream, "/// Imported element \"%s\" from typemap %s.\n\n", *j, mapfile ? mapfile : ""); else fprintf(stream, "/// Built-in element \"%s\".\n\n", *j); if (mflag) { fprintf(stream, "// (declaration of %s removed by option -m)\n\n", t); } else if (!iflag && !imported(*j)) { types.format(s); fprintf(stream, "\n"); } } s = types.usetypemap[t]; if (s && *s) { if (mflag && **j != '"') fprintf(stream, "// xsd.h: typemap override of element %s with %s\n\n", t, s); if (types.knames.find(s) == types.knames.end()) types.knames.insert(s); } } else { if (!mflag) { if (**j == '"') { fprintf(stream, "// Imported element \"%s\" declared as %s.\n\n", *j, t); } else if (!iflag && !imported(*j)) { s = types.tname(NULL, NULL, "xsd:any"); fprintf(stream, "/// Built-in element \"%s\".\n", *j); fprintf(stream, "typedef %s %s;\n\n", s, t); types.deftname(TYPEDEF, false, true, "_", NULL, *j, s); // already pointer const char *u = types.uri(*j); if (u && !types.uris[u]) { fprintf(stream, schemaformat, types.nsprefix(types.prefix(*j), u), "namespace", u); fprintf(stream, "\n"); } } } else if (**j == '"') { fprintf(stream, "// Imported element \"%s\" declared as %s.\n\n", *j, t); } else { fprintf(stream, "// xsd.h: should define element %s\n\n", t); } types.deftname(TYPEDEF, false, false, "_", NULL, *j, s); } } // produce built-in primitive attributes if (vflag) fprintf(stderr, "\nGenerating built-in attributes\n"); for (SetOfString::const_iterator k = definitions.builtinAttributes().begin(); k != definitions.builtinAttributes().end(); ++k) { const char *s, *t; t = types.cname("_", NULL, *k); s = types.deftypemap[t]; if (s) { if (*s) { if (**k == '"') fprintf(stream, "/// Imported attribute \"%s\" from typemap %s.\n", *k, mapfile ? mapfile : ""); else fprintf(stream, "/// Built-in attribute \"%s\".\n", *k); if (mflag) fprintf(stream, "// (declaration of %s removed by option -m)\n\n", t); else if (!iflag && !imported(*k)) { types.format(s); fprintf(stream, "\n"); } } s = types.usetypemap[t]; if (s && *s) { if (mflag && **k != '"') fprintf(stream, "// xsd.h: typemap override of attribute %s with %s\n\n", t, s); if (types.knames.find(s) == types.knames.end()) types.knames.insert(s); } } else { s = types.tname(NULL, NULL, "xsd:string"); if (!mflag) { if (**k == '"') { fprintf(stream, "// Imported attribute \"%s\" declared as %s.\n", *k, t); } else if (!iflag && !imported(*k)) { fprintf(stream, "/// Built-in attribute \"%s\".\n", *k); fprintf(stream, "typedef %s %s;\n\n", s, t); const char *u = types.uri(*k); if (u && !types.uris[u]) { fprintf(stream, schemaformat, types.nsprefix(types.prefix(*k), u), "namespace", u); fprintf(stream, "\n"); } } } else if (**k == '"') { fprintf(stream, "// Imported attribute \"%s\" declared as %s.\n\n", *k, t); } else { fprintf(stream, "// xsd.h: should define attribute %s\n\n", t); } types.deftname(TYPEDEF, false, types.is_ptr(NULL, NULL, "xsd:string"), "_", NULL, *k, s); } } // produce types // define class/struct types first if (!cflag) banner("Forward Declarations"); if (definitions.types) { comment("Definitions", defs, "types", definitions.types->documentation); fprintf(stream, "\n"); for (std::vector::const_iterator schema4 = definitions.types->xs__schema_.begin(); schema4 != definitions.types->xs__schema_.end(); ++schema4) { if (vflag) fprintf(stderr, "\nDefining types in %s\n", (*schema4)->targetNamespace); for (std::vector::const_iterator complexType = (*schema4)->complexType.begin(); complexType != (*schema4)->complexType.end(); ++complexType) types.define((*schema4)->targetNamespace, NULL, *complexType); if (vflag) fprintf(stderr, "\nDefining elements in %s\n", (*schema4)->targetNamespace); for (std::vector::const_iterator element = (*schema4)->element.begin(); element != (*schema4)->element.end(); ++element) { if (!(*element).type && !(*element).abstract) { if ((*element).complexTypePtr()) { types.define((*schema4)->targetNamespace, (*element).name, *(*element).complexTypePtr()); } else if (!(*element).simpleTypePtr()) { fprintf(stream, "/// @brief Top-level root element \"%s\":%s.\n", (*schema4)->targetNamespace, (*element).name); if (gflag) { const char *t = types.deftname(TYPEDEF, false, false, "_", (*schema4)->targetNamespace, (*element).name, NULL); if (t) fprintf(stream, "typedef _XML %s;\n\n", t); else fprintf(stream, "// Element definition intentionally left blank.\n\n"); types.ptrtypemap[t] = types.usetypemap[t] = "_XML"; } else { const char *s = types.cname("_", (*schema4)->targetNamespace, (*element).name); types.ptrtypemap[s] = types.usetypemap[s] = "_XML"; if (!Lflag) fprintf(stream, "/// @note Use wsdl2h option -g to auto-generate a top-level root element declaration.\n\n"); } } } } } // visit types with lowest base level first int baseLevel = 1; bool found; bool inheritance = false; do { found = (baseLevel == 1); for (std::vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { if (found) banner("Schema Types and Top-Level Elements and Attributes", (*schema)->targetNamespace); for (std::vector::iterator simpleType = (*schema)->simpleType.begin(); simpleType != (*schema)->simpleType.end(); ++simpleType) { if ((*simpleType).baseLevel() == baseLevel) { found = true; types.gen((*schema)->targetNamespace, NULL, *simpleType, false, false); } } for (std::vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if (!(*element).type && (*element).simpleTypePtr() && (*element).simpleTypePtr()->baseLevel() == baseLevel) { found = true; if ((*element).type) fprintf(stream, "/// @brief Top-level root element \"%s\":%s of simpleType %s.\n", (*schema)->targetNamespace, (*element).name, (*element).type); types.document((*element).annotation); types.gen((*schema)->targetNamespace, (*element).name, *(*element).simpleTypePtr(), false, false); } if (!(*element).type && (*element).complexTypePtr() && (*element).complexTypePtr()->baseLevel() == baseLevel) found = true; } for (std::vector::const_iterator attribute = (*schema)->attribute.begin(); attribute != (*schema)->attribute.end(); ++attribute) { if (!(*attribute).type && (*attribute).simpleTypePtr() && (*attribute).simpleTypePtr()->baseLevel() == baseLevel) { found = true; if ((*attribute).type) fprintf(stream, "/// @brief Top-level attribute \"%s\":%s of simpleType %s.\n", (*schema)->targetNamespace, (*attribute).name, (*attribute).type); types.document((*attribute).annotation); types.gen((*schema)->targetNamespace, (*attribute).name, *(*attribute).simpleTypePtr(), false, false); // URI = NULL won't generate type in schema (type without namespace qualifier) } } for (std::vector::iterator complexType = (*schema)->complexType.begin(); complexType != (*schema)->complexType.end(); ++complexType) { if ((*complexType).baseLevel() == baseLevel) found = true; } } if (found && baseLevel > 1) inheritance = true; ++baseLevel; } while (found); if (cflag && !Fflag && !fflag && inheritance && !wflag) fprintf(stderr, "\nWarning: ignoring type inheritance by default for C, use option -F to generate struct declarations with simulated inheritance using transient pointer members pointing to derived types to serialize derived types as elements annotated by xsi:type attributes in XML.\n"); // generate wrapper structs/classes for built-in XSD types with options -p and -F if (pflag && Fflag) { banner("Wrappers for built-in types with their derived types"); for (SetOfString::const_iterator i = definitions.builtinTypes().begin(); i != definitions.builtinTypes().end(); ++i) { if (strcmp(*i, "xs:anyType") && strcmp(*i, "xs:anySimpleType")) { const char *s = types.wname(NULL, NULL, *i, NOLOOKUP); fprintf(stream, "/// Wrapper %s for built-in type \"%s\".\n///\n", s, *i); if (cflag) { if (!Lflag) fprintf(stream, "/// @note Use option -P to remove this struct.\n"); fprintf(stream, "struct %s\n{\n", s); } else { if (!Lflag) fprintf(stream, "/// @note Call virtual method soap_type() generated by soapcpp2 to check runtime type is SOAP_TYPE_%s or a derived type. Use option -P to remove this class.\n", s); fprintf(stream, "class %s\n{ public:\n", s); } fprintf(stream, elementformat, types.tname(NULL, NULL, *i), "__item"); fprintf(stream, ";\n"); for (MapOfStringToString::const_iterator j = definitions.builtinTypeDerivations().begin(); j != definitions.builtinTypeDerivations().end(); ++j) { if (!strcmp(*i, (*j).second)) { fprintf(stream, "/// A transient pointer to a derived type value that replaces the value of this base type %s when non-NULL\n", s); fprintf(stream, derivedformat, types.tnamenoptr(NULL, NULL, (*j).first), types.aname(NULL, NULL, (*j).first)); fprintf(stream, "\n"); } } if (cflag) { fprintf(stream, "};\n\n"); } else { fprintf(stream, pointerformat, "struct soap", soap_context); fprintf(stream, ";\n"); fprintf(stream, "};\n\n"); } } } fprintf(stream, "/// Wrapper xsd__anyType_ for built-in XSD type \"xs:anyType\".\n///\n"); if (cflag) { if (!Lflag) fprintf(stream, "/// @note Use option -P to remove this struct.\n"); fprintf(stream, "struct xsd__anyType_\n{\n"); } else { if (!Lflag) fprintf(stream, "/// @note Call virtual method soap_type() generated by soapcpp2 to check runtime type is SOAP_TYPE_xsd__anyType_ or a derived type. Use option -P to remove this class.\n"); fprintf(stream, "class xsd__anyType_\n{ public:\n"); } if (dflag) fprintf(stream, elementformat, "xsd__anyType", "__item"); else fprintf(stream, elementformat, "_XML", "__item"); fprintf(stream, ";\n"); for (SetOfString::const_iterator i = definitions.builtinTypes().begin(); i != definitions.builtinTypes().end(); ++i) { if (strcmp(*i, "xs:anyType") && strcmp(*i, "xs:anySimpleType")) { fprintf(stream, "/// A transient pointer to a derived type value that replaces the value of this root type xsd__anyType when non-NULL\n"); fprintf(stream, derivedformat, types.wname(NULL, NULL, *i, LOOKUP), types.aname(NULL, NULL, *i)); fprintf(stream, "\n"); } } for (std::vector::const_iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { for (std::vector::const_iterator simpleType = (*schema)->simpleType.begin(); simpleType != (*schema)->simpleType.end(); ++simpleType) { if ((*simpleType).name && !(*simpleType).restriction && !(*simpleType).list && !(*simpleType).union_) { fprintf(stream, "/// A transient pointer to a derived type value that replaces the value of this root type xsd__anyType when non-NULL\n"); fprintf(stream, derivedformat, types.tnamenoptr(NULL, (*schema)->targetNamespace, (*simpleType).name), types.aname(NULL, (*schema)->targetNamespace, (*simpleType).name)); fprintf(stream, "\n"); } } for (std::vector::const_iterator complexType = (*schema)->complexType.begin(); complexType != (*schema)->complexType.end(); ++complexType) { if ((*complexType).name && !(*complexType).abstract && !((*complexType).simpleContent && ((*complexType).simpleContent->restriction || (*complexType).simpleContent->extension)) && !((*complexType).complexContent && ((*complexType).complexContent->restriction || (*complexType).complexContent->extension))) { fprintf(stream, "/// A transient pointer to a derived type value that replaces the value of this root type xsd__anyType when non-NULL\n"); fprintf(stream, derivedformat, types.tnamenoptr(NULL, (*schema)->targetNamespace, (*complexType).name), types.aname(NULL, (*schema)->targetNamespace, (*complexType).name)); fprintf(stream, "\n"); } } } if (!cflag) { fprintf(stream, pointerformat, "struct soap", soap_context); fprintf(stream, ";\n"); } fprintf(stream, "};\n\n"); } // generate complex type defs. Problem: what if a simpleType restriction/extension depends on a complexType simpleContent restriction/extension? int maxLevel = baseLevel; for (baseLevel = 1; baseLevel < maxLevel; ++baseLevel) { for (std::vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { if (baseLevel == 1) banner("Schema Complex Types and Top-Level Elements", (*schema)->targetNamespace); for (std::vector::iterator complexType = (*schema)->complexType.begin(); complexType != (*schema)->complexType.end(); ++complexType) { if ((*complexType).baseLevel() == baseLevel) types.gen((*schema)->targetNamespace, NULL, *complexType, false); } for (std::vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if (!(*element).type && (*element).complexTypePtr() && (*element).complexTypePtr()->baseLevel() == baseLevel) { fprintf(stream, "/// @brief Top-level root element \"%s\":%s\n", (*schema)->targetNamespace, (*element).name); types.document((*element).annotation); types.gen((*schema)->targetNamespace, (*element).name, *(*element).complexTypePtr(), false); } } } } for (std::vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { for (std::vector::iterator simpleType = (*schema)->simpleType.begin(); simpleType != (*schema)->simpleType.end(); ++simpleType) { if ((*simpleType).baseLevel() <= 0) { const char *t = types.deftname(TYPEDEF, false, false, NULL, (*schema)->targetNamespace, (*simpleType).name, NULL); fprintf(stderr, "\nError: circular restriction/extension \n", (*simpleType).name ? (*simpleType).name : ""); fprintf(stream, "\n/// @todo !FIXME! @warning %s defines a simpleType with circular restriction/extension.\n", (*simpleType).name ? (*simpleType).name : ""); fprintf(stream, "typedef _XML %s;\n\n", t); types.ptrtypemap[t] = types.usetypemap[t] = "_XML"; } } for (std::vector::iterator complexType = (*schema)->complexType.begin(); complexType != (*schema)->complexType.end(); ++complexType) { if ((*complexType).baseLevel() <= 0) { fprintf(stderr, "\nError: circular restriction/extension \n", (*complexType).name ? (*complexType).name : ""); fprintf(stream, "\n\n/// @todo !FIXME! @warning %s defines a complexType with circular restriction/extension.\n", (*complexType).name ? (*complexType).name : ""); if (cflag) fprintf(stream, "struct %s { };\n\n", types.cname(NULL, (*schema)->targetNamespace, (*complexType).name)); else fprintf(stream, "class %s { };\n\n", types.cname(NULL, (*schema)->targetNamespace, (*complexType).name)); } } } // option to consider: generate local complexTypes iteratively /* for (MapOfStringToType::const_iterator local = types.locals.begin(); local != types.locals.end(); ++local) { types.gen(NULL, (*local).first, *(*local).second); } */ for (std::vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { if (vflag) fprintf(stderr, "\nGenerating elements in %s\n", (*schema)->targetNamespace); banner("Additional Top-Level Elements", (*schema)->targetNamespace); for (std::vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if ((*element).name && (*element).type && !(*element).abstract) { fprintf(stream, "/// @brief Top-level root element \"%s\":%s of type %s.\n", (*schema)->targetNamespace, (*element).name, (*element).type); types.document((*element).annotation); if (Oflag > 1 && !(*element).is_used()) { fprintf(stream, "// Optimization: element not used and removed\n\n"); } else { if (!types.is_defined("_", (*schema)->targetNamespace, (*element).name)) { if (gflag) { const char *s = types.tnamenoptr(NULL, (*schema)->targetNamespace, (*element).type); const char *t = types.deftname(TYPEDEF, false, false, "_", (*schema)->targetNamespace, (*element).name, s); fprintf(stream, "typedef %s %s;\n\n", s, t); } else if (!Lflag) { fprintf(stream, "/// @note Use wsdl2h option -g to auto-generate a top-level root element declaration.\n\n"); } } else { const char *s = types.cname("_", (*schema)->targetNamespace, (*element).name); const char *t = types.deftypemap[s]; if (t && *t) { fprintf(stream, "/// Imported element \"%s\" from typemap %s.\n", s, mapfile ? mapfile : ""); types.format(t); } else { fprintf(stream, "// \"%s\" element definition intentionally left blank.\n", types.cname("_", (*schema)->targetNamespace, (*element).name)); } } } } } if (vflag) fprintf(stderr, "\nGenerating attributes in %s\n", (*schema)->targetNamespace); banner("Additional Top-Level Attributes", (*schema)->targetNamespace); for (std::vector::iterator attribute = (*schema)->attribute.begin(); attribute != (*schema)->attribute.end(); ++attribute) { if ((*attribute).name && (*attribute).type) { fprintf(stream, "/// @brief Top-level attribute \"%s\":%s of simpleType %s.\n", (*schema)->targetNamespace, (*attribute).name, (*attribute).type); types.document((*attribute).annotation); if (Oflag > 1 && !(*attribute).is_used()) { fprintf(stream, "// Optimization: attribute not used and removed\n\n"); } else { if (!types.is_defined("_", (*schema)->targetNamespace, (*attribute).name)) { if (gflag) { const char *s = types.tnamenoptr(NULL, (*schema)->targetNamespace, (*attribute).type); const char *t = types.deftname(TYPEDEF, false, false, "_", (*schema)->targetNamespace, (*attribute).name, s); fprintf(stream, "typedef %s %s;\n\n", s, t); } else if (!Lflag) { fprintf(stream, "/// @note Use wsdl2h option -g to auto-generate a top-level attribute declaration.\n\n"); } } else { const char *s = types.cname("_", (*schema)->targetNamespace, (*attribute).name); const char *t = types.deftypemap[s]; if (t && *t) { fprintf(stream, "/// Imported attribute \"%s\" from typemap %s.\n", s, mapfile ? mapfile : ""); types.format(t); } else fprintf(stream, "// \"%s\" attribute definition intentionally left blank.\n", types.cname("_", (*schema)->targetNamespace, (*attribute).name)); } } } } } } if (vflag) fprintf(stderr, "\nCollecting service bindings\n"); collect(definitions); if (!services.empty()) { banner("Services"); if (soap12) fprintf(stream, "// This service supports SOAP 1.2 namespaces:\n#import \"soap12.h\"\n"); for (MapOfStringToService::const_iterator service1 = services.begin(); service1 != services.end(); ++service1) { Service *sv = (*service1).second; if (sv) { fprintf(stream, "\n"); if (sv->name) fprintf(stream, serviceformat, sv->prefix, "name", sv->name, ""); if (sv->type) fprintf(stream, serviceformat, sv->prefix, "type", sv->type, ""); for (SetOfString::const_iterator port = sv->location.begin(); port != sv->location.end(); ++port) fprintf(stream, serviceformat, sv->prefix, "port", (*port), ""); if (sv->URI && *sv->URI) fprintf(stream, serviceformat, sv->prefix, "namespace", sv->URI, ""); if (sv->transport) fprintf(stream, serviceformat, sv->prefix, "transport", sv->transport, ""); } } fprintf(stream, "\n/** @mainpage %s Definitions\n", defs); if (definitions.version) { section(defs, "_version Version", NULL); text(definitions.version); } if (definitions.documentation) { section(defs, "_documentation Documentation", NULL); text(definitions.documentation); } if (definitions.types && definitions.types->documentation) { section(defs, "_types Schema Type Information", NULL); text(definitions.types->documentation); } section(defs, "_bindings Service Bindings", NULL); for (MapOfStringToService::const_iterator service2 = services.begin(); service2 != services.end(); ++service2) { Service *sv = (*service2).second; if (sv && sv->name) fprintf(stream, "\n - @ref %s\n", sv->name); } section(defs, "_more More Information", NULL); fprintf(stream, "\n - @ref page_notes \"Notes\"\n"); if (!definitions.vprop__property.empty()) fprintf(stream, "\n - @ref page_bpel \"BPEL 2.0 Variables\"\n"); fprintf(stream, "\n - @ref page_XMLDataBinding \"XML Data Binding\"\n"); if (!jflag) fprintf(stream, "\n - @ref SOAP_ENV__Header \"SOAP Header Content\" (when applicable)\n"); if (!jflag) fprintf(stream, "\n - @ref SOAP_ENV__Detail \"SOAP Fault Detail Content\" (when applicable)\n"); fprintf(stream, "\n\n*/\n"); for (MapOfStringToService::const_iterator service3 = services.begin(); service3 != services.end(); ++service3) { Service *sv = (*service3).second; if (sv && sv->name) { fprintf(stream, "\n/** "); page(sv->name, " Binding", sv->name); for (MapOfStringToString::const_iterator service_doc = sv->service_documentation.begin(); service_doc != sv->service_documentation.end(); ++service_doc) { const char *name = types.aname(NULL, NULL, (*service_doc).first); section(name, "_service Service Documentation", (*service_doc).first); text((*service_doc).second); } for (MapOfStringToString::const_iterator port_doc = sv->port_documentation.begin(); port_doc != sv->port_documentation.end(); ++port_doc) { const char *name = types.aname(NULL, NULL, (*port_doc).first); section(name, "_port Port Documentation", (*port_doc).first); text((*port_doc).second); } for (MapOfStringToString::const_iterator binding_doc = sv->binding_documentation.begin(); binding_doc != sv->binding_documentation.end(); ++binding_doc) { const char *name = types.aname(NULL, NULL, (*binding_doc).first); section(name, "_binding Binding Documentation", (*binding_doc).first); text((*binding_doc).second); } section(sv->name, "_operations Operations of Binding", sv->name); for (std::vector::const_iterator op = sv->operation.begin(); op != sv->operation.end(); ++op) { if (*op && (*op)->input && (*op)->input_name) fprintf(stream, "\n - @ref %s\n", (*op)->input_name); else if (*op && (*op)->output_name) fprintf(stream, "\n - @ref %s\n", (*op)->output_name); } if (!sv->role.empty()) { section(sv->name, "_plnk BPEL 2.0 Partner Links for Binding", sv->name); gen_plnk(*sv); } section(sv->name, "_ports Default endpoints of Binding", sv->name); for (SetOfString::const_iterator port = sv->location.begin(); port != sv->location.end(); ++port) fprintf(stream, "\n - %s\n", *port); if (!sv->policy.empty()) { section(sv->name, "_policy Policy of Binding", sv->name); fprintf(stream, "\nSee Section @ref %s_policy_enablers\n", sv->name); gen_policy(*sv, sv->policy, "service endpoint ports", types); } if (!service_prefix && !Lflag) { if (binding_count > 1) fprintf(stream, "\n@note Multiple service bindings collected as one, use wsdl2h option -Nname to produce a separate service for each binding\n"); else fprintf(stream, "\n@note Use wsdl2h option -Nname to change the service binding prefix name\n"); } fprintf(stream, "\n\n*/\n"); } } } generate(); if (definitions.types) { gen_vprop(definitions, types); banner("XML Data Binding"); fprintf(stream, "\n/** "); page("page_XMLDataBinding", " XML Data Binding", NULL); fprintf(stream, "\nSOAP/XML services use data bindings that are contractually bound by WSDLs and\nare auto-generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data\nbindings are adopted from XML schemas as part of the WSDL types section or when\nrunning wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings.\n"); if (!Lflag) fprintf(stream, "\n@note The following readers and writers are C/C++ data type (de)serializers\nauto-generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the\n(de)serialization code, which is stored in soapC.c[pp]. Include \"soapH.h\" in\nyour code to import these data type and function declarations. Only use the\nsoapcpp2-generated files in your project build. Do not include the wsdl2h-\ngenerated .h file in your code.\n\n@note Data can be read and deserialized from:\n - an int file descriptor, using soap->recvfd = fd\n - a socket, using soap->socket = (int)...\n - a C++ stream (istream, stringstream), using soap->is = (istream*)...\n - a C string, using soap->is = (const char*)...\n - any input, using the soap->frecv() callback\n\n@note Data can be serialized and written to:\n - an int file descriptor, using soap->sendfd = (int)...\n - a socket, using soap->socket = (int)...\n - a C++ stream (ostream, stringstream), using soap->os = (ostream*)...\n - a C string, using soap->os = (const char**)...\n - any output, using the soap->fsend() callback\n\n@note The following options are available for (de)serialization control:\n - soap->encodingStyle = NULL; to remove SOAP 1.1/1.2 encodingStyle\n - soap_set_mode(soap, SOAP_XML_TREE); XML without id-ref (no cycles!)\n - soap_set_mode(soap, SOAP_XML_GRAPH); XML with id-ref (including cycles)\n - soap_set_namespaces(soap, struct Namespace *nsmap); to set xmlns bindings\n\n"); for (std::vector::const_iterator schema5 = definitions.types->xs__schema_.begin(); schema5 != definitions.types->xs__schema_.end(); ++schema5) { const char *prefix = types.nsprefix(NULL, (*schema5)->targetNamespace); fprintf(stream, "\n*/\n\n/**\n\n@section %s Top-level root elements of schema \"%s\"\n", prefix ? prefix : "default", (*schema5)->targetNamespace); for (std::vector::const_iterator element = (*schema5)->element.begin(); element != (*schema5)->element.end(); ++element) { if (prefix && *prefix) fprintf(stream, "\n - <%s:%s> ", prefix, (*element).name); else fprintf(stream, "\n - <%s> ", (*element).name); const char *cname = types.cname("_", (*schema5)->targetNamespace, (*element).name); if (types.is_defined("_", (*schema5)->targetNamespace, (*element).name)) { fprintf(stream, "@ref %s\n", cname); if (!Lflag) { const char *pname = types.pname(true, false, "_", (*schema5)->targetNamespace, (*element).name); fprintf(stream, " @code\n // Reader (returns SOAP_OK on success):\n soap_read_%s(struct soap*, %s);\n // Writer (returns SOAP_OK on success):\n soap_write_%s(struct soap*, %s);\n", cname, pname, cname, pname); fprintf(stream, " // REST GET (returns SOAP_OK on success):\n soap_GET_%s(struct soap*, const char *URL, %s);\n // REST PUT (returns SOAP_OK on success):\n soap_PUT_%s(struct soap*, const char *URL, %s);\n", cname, pname, cname, pname); fprintf(stream, " // REST POST (returns SOAP_OK on success):\n soap_POST_send_%s(struct soap*, const char *URL, %s);\n soap_POST_recv_%s(struct soap*, %s);\n @endcode\n", cname, pname, cname, pname); } } else { fprintf(stream, "(use wsdl2h option -g to auto-generate type %s)\n", cname); } } } fprintf(stream, "\n*/\n"); } if (cppnamespace) fprintf(stream, "\n} // namespace %s\n", cppnamespace); fprintf(stream, "\n/* End of %s */\n", outfile ? outfile : "file"); } void Definitions::generate() { MapOfStringToMessage headers; MapOfStringToMessage headerfaults; MapOfStringToMessage faults; const char *t; for (MapOfStringToService::const_iterator service1 = services.begin(); service1 != services.end(); ++service1) { if ((*service1).second) { for (MapOfStringToMessage::const_iterator header = (*service1).second->header.begin(); header != (*service1).second->header.end(); ++header) headers[(*header).first] = (*header).second; for (MapOfStringToMessage::const_iterator headerfault = (*service1).second->headerfault.begin(); headerfault != (*service1).second->headerfault.end(); ++headerfault) headerfaults[(*headerfault).first] = (*headerfault).second; for (MapOfStringToMessage::const_iterator fault = (*service1).second->fault.begin(); fault != (*service1).second->fault.end(); ++fault) faults[(*fault).first] = (*fault).second; } } // Generate SOAP Header definition t = types.deftypemap["SOAP_ENV__Header"]; if (t && *t) { banner("Custom SOAP Header"); types.format(t); } else if (!jflag && (!headers.empty() || !headerfaults.empty())) { banner("SOAP Header"); fprintf(stream, "/**\n\nThe SOAP Header is part of the gSOAP context and its content is accessed\nthrough the soap.header variable. You may have to set the soap.actor variable\nto serialize SOAP Headers with SOAP-ENV:actor or SOAP-ENV:role attributes.\nUse option -j to remove entire SOAP Header definition.\nUse option -k to remove the mustUnderstand qualifiers.\n\n*/\n"); fprintf(stream, "mutable struct SOAP_ENV__Header\n{\n"); for (MapOfStringToMessage::const_iterator header = headers.begin(); header != headers.end(); ++header) { if ((*header).second->use == encoded && (*header).second->URI && *(*header).second->URI) fprintf(stream, schemaformat, types.nsprefix(NULL, (*header).second->URI), "namespace", (*header).second->URI); comment("Header", (*header).first, "WSDL", (*header).second->ext_documentation); comment("Header", (*header).first, "SOAP", (*header).second->documentation); if ((*header).second->mustUnderstand && !kflag) { fprintf(stream, elementformat, "mustUnderstand", "// must be understood by receiver"); fprintf(stream, "\n"); } if ((*header).second->part && (*header).second->part->elementPtr()) { fprintf(stream, "/// \"%s\" SOAP Header part element.\n", (*header).second->part->name); if ((*header).second->part->elementPtr()->type && (*header).second->part->element) fprintf(stream, elementformat, types.pname(true, false, NULL, NULL, (*header).second->part->elementPtr()->type), types.aname(NULL, NULL, (*header).second->part->element)); else if ((*header).second->part->element) fprintf(stream, elementformat, types.pname(true, false, "_", NULL, (*header).second->part->element), types.aname(NULL, NULL, (*header).second->part->element)); else fprintf(stream, elementformat, types.pname(true, false, "_", NULL, (*header).second->part->elementPtr()->name), (*header).first); fprintf(stream, ";\n"); } else if ((*header).second->part && (*header).second->part->type) { fprintf(stream, "/// \"%s\" SOAP Header part type.\n", (*header).second->part->type); fprintf(stream, elementformat, types.pname(true, false, NULL, NULL, (*header).second->part->type), types.aname(NULL, (*header).second->URI, (*header).second->part->name)); fprintf(stream, ";\n"); } else if ((*header).second->element) { fprintf(stream, "/// \"%s\" SOAP Header element.", (*header).second->name); (*header).second->generate(types, ";", false, true, false, true, false); fprintf(stream, "\n"); } else { if ((*header).second->part && (*header).second->part->element) fprintf(stream, elementformat, types.pname(true, false, "_", NULL, (*header).second->part->element), (*header).first); else fprintf(stream, pointerformat, (*header).first, (*header).first); fprintf(stream, ";\t///< @todo Please check element name and type (imported type)\n"); } } for (MapOfStringToMessage::const_iterator headerfault = headerfaults.begin(); headerfault != headerfaults.end(); ++headerfault) { if ((*headerfault).second->use == encoded && (*headerfault).second->URI && *(*headerfault).second->URI) fprintf(stream, schemaformat, types.nsprefix(NULL, (*headerfault).second->URI), "namespace", (*headerfault).second->URI); comment("HeaderFault", (*headerfault).first, "WSDL", (*headerfault).second->ext_documentation); comment("HeaderFault", (*headerfault).first, "SOAP", (*headerfault).second->documentation); if ((*headerfault).second->mustUnderstand && !kflag) { fprintf(stream, elementformat, "mustUnderstand", "// must be understood by receiver"); fprintf(stream, "\n"); } if ((*headerfault).second->part && (*headerfault).second->part->elementPtr()) { fprintf(stream, "/// \"%s\" SOAP HeaderFault part element optionally contains fault details.\n", (*headerfault).second->part->name); if ((*headerfault).second->part->elementPtr()->type && (*headerfault).second->part->element) fprintf(stream, elementformat, types.pname(true, false, NULL, NULL, (*headerfault).second->part->elementPtr()->type), types.aname(NULL, NULL, (*headerfault).second->part->element)); else if ((*headerfault).second->part->element) fprintf(stream, elementformat, types.pname(true, false, "_", NULL, (*headerfault).second->part->element), types.aname(NULL, NULL, (*headerfault).second->part->element)); else fprintf(stream, elementformat, types.pname(true, false, "_", NULL, (*headerfault).second->part->elementPtr()->name), (*headerfault).first); fprintf(stream, ";\n"); } else if ((*headerfault).second->part && (*headerfault).second->part->type) { fprintf(stream, "/// \"%s\" SOAP HeaderFault part type optionally contains fault details.\n", (*headerfault).second->part->type); fprintf(stream, elementformat, types.pname(true, false, NULL, NULL, (*headerfault).second->part->type), types.aname(NULL, (*headerfault).second->URI, (*headerfault).second->part->name)); fprintf(stream, ";\n"); } else if ((*headerfault).second->element) { fprintf(stream, "/// \"%s\" SOAP HeaderFault element optionally contains fault details.", (*headerfault).second->name); (*headerfault).second->generate(types, ";", false, true, false, true, false); fprintf(stream, "\n"); } else { if ((*headerfault).second->part && (*headerfault).second->part->element) fprintf(stream, elementformat, types.pname(true, false, "_", NULL, (*headerfault).second->part->element), (*headerfault).first); else fprintf(stream, pointerformat, (*headerfault).first, (*headerfault).first); fprintf(stream, ";\t///< @todo Please check element name and type (imported type)\n"); } } types.modify("SOAP_ENV__Header"); fprintf(stream, "\n};\n\n"); } // Generate Fault detail element definitions for (MapOfStringToMessage::const_iterator fault = faults.begin(); fault != faults.end(); ++fault) { if ((*fault).second->use == encoded) { fprintf(stream, schemaformat, types.nsprefix(NULL, (*fault).second->URI), "namespace", (*fault).second->URI); fprintf(stream, "/// SOAP Fault message \"%s\":%s.\n", (*fault).second->URI, (*fault).second->message->name); comment("Fault", (*fault).first, "WSDL", (*fault).second->ext_documentation); comment("Fault", (*fault).first, "SOAP", (*fault).second->documentation); if (cflag) fprintf(stream, "struct %s\n{", (*fault).first); else fprintf(stream, "class %s\n{ public:", (*fault).first); (*fault).second->generate(types, ";", false, true, false, true, false); if (!cflag && soap_context && *soap_context) { fprintf(stream, "\n"); fprintf(stream, pointerformat, "struct soap", soap_context); fprintf(stream, ";"); } fprintf(stream, "\n};\n\n"); if (cflag) fprintf(stream, "typedef struct %s %s;\n\n", (*fault).first, (*fault).first); } } t = types.deftypemap["SOAP_ENV__Detail"]; if (t && *t) { banner("Custom SOAP Fault Detail"); types.format(t); } else if (!jflag && !faults.empty()) { SetOfString fault_elements; banner("SOAP Fault Detail"); fprintf(stream, "/**\n\nThe SOAP Fault is part of the gSOAP context and its content is accessed\nthrough the soap.fault->detail variable (SOAP 1.1) or the\nsoap.fault->SOAP_ENV__Detail variable (SOAP 1.2).\nUse wsdl2h option -j to omit these declarations.\n\n*/\n"); fprintf(stream, "mutable struct SOAP_ENV__Detail\n{\n"); if (dflag) { const char *t = types.tname(NULL, NULL, "xsd:anyAttribute"); fprintf(stream, attributeformat, t, "__anyAttribute"); fprintf(stream, ";\t///< Catch any attribute content in DOM.\n"); } else { fprintf(stream, "/// xsd:anyAttribute omitted: to parse attribute content of the Detail element into DOM anyAttribute, use wsdl2h option -d.\n"); } types.modify("SOAP_ENV__Detail"); /* See below */ /* The DOM representation is not desired since faultdetail is NULL. However, future options may reenable this feature (see keep code here). const char *t = types.tname(NULL, NULL, "xsd:any"); fprintf(stream, elementformat, t, "__any"); if (dflag) fprintf(stream, ";\t///< Catch any element content in DOM.\n"); else fprintf(stream, ";\t///< Catch any element content in XML string.\n"); */ for (MapOfStringToMessage::const_iterator fault = faults.begin(); fault != faults.end(); ++fault) { comment("Fault", (*fault).first, "WSDL", (*fault).second->ext_documentation); comment("Fault", (*fault).first, "SOAP", (*fault).second->documentation); if ((*fault).second->message) { const char *name = (*fault).second->message->name; if (!name) name = "?"; if ((*fault).second->use == literal) { for (std::vector::const_iterator part = (*fault).second->message->part.begin(); part != (*fault).second->message->part.end(); ++part) { if ((*part).elementPtr()) { if (fault_elements.find((*part).element) == fault_elements.end()) { fprintf(stream, "/// SOAP Fault message \"%s\" part \"%s\" element \"%s\".\n", name, (*part).name ? (*part).name : "", (*part).element ? (*part).element : ""); if ((*part).elementPtr()->type) fprintf(stream, elementformat, types.pname(true, false, NULL, NULL, (*part).elementPtr()->type), types.aname(NULL, (*fault).second->URI, (*part).element)); else fprintf(stream, elementformat, types.pname(true, false, "_", NULL, (*part).element), types.aname(NULL, (*fault).second->URI, (*part).element)); fprintf(stream, ";\n"); fault_elements.insert((*part).element); } } else if ((*part).name && (*part).type) { if (fault_elements.find((*part).name) == fault_elements.end()) { fprintf(stream, schemaformat, types.nsprefix(NULL, (*fault).second->URI), "namespace", (*fault).second->URI); fprintf(stream, "/// SOAP Fault message \"%s\" part \"%s\" type \"%s\".\n", name, (*part).name, (*part).type); fprintf(stream, elementformat, types.pname(true, false, NULL, NULL, (*part).type), types.aname(NULL, (*fault).second->URI, (*part).name)); fprintf(stream, ";\n"); fault_elements.insert((*part).name); } } else fprintf(stream, "// Unknown SOAP Fault message \"%s\":%s part \"%s\"\n", (*fault).second->URI, name, (*part).name ? (*part).name : ""); } } else { fprintf(stream, "/// SOAP Fault message \"%s\":%s\n", (*fault).second->URI, name); fprintf(stream, pointerformat, (*fault).first, types.aname(NULL, (*fault).second->URI, (*fault).second->message->name)); fprintf(stream, ";\n"); } } else if ((*fault).second->element) { if (fault_elements.find((*fault).second->name) == fault_elements.end()) { fprintf(stream, "/// SOAP Fault message \"%s\":%s\n", (*fault).second->URI, (*fault).second->element->name); fprintf(stream, elementformat, types.pname(true, false, "_", (*fault).second->URI, (*fault).second->element->name), (*fault).second->name); fprintf(stream, ";\n"); fault_elements.insert((*fault).second->name); } } } fprintf(stream, elementformat, "int", "__type"); fprintf(stream, ";\t///< set to SOAP_TYPE_T for a serializable type T\n"); fprintf(stream, pointerformat, "void", "fault"); fprintf(stream, ";\t///< points to serializable value of type T or NULL\n"); fprintf(stream, elementformat, "_XML", "__any"); fprintf(stream, ";\t///< Catch any other content in XML string.\n"); fprintf(stream, "};\n\n"); } /* The SOAP Fault struct below is autogenerated by soapcpp2 (kept here for future mods) if (!mflag && !faults.empty()) { fprintf(stream, "struct SOAP_ENV__Code\n{\n"); fprintf(stream, elementformat, "_QName", "SOAP_ENV__Value"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "char", "SOAP_ENV__Node"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "char", "SOAP_ENV__Role"); fprintf(stream, ";\n};\n"); fprintf(stream, "struct SOAP_ENV__Detail\n{\n"); fprintf(stream, elementformat, "int", "__type"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "void", "fault"); fprintf(stream, ";\n"); fprintf(stream, elementformat, "_XML", "__any"); fprintf(stream, ";\n};\n"); fprintf(stream, "struct SOAP_ENV__Fault\n{\n"); fprintf(stream, elementformat, "_QName", "faultcode"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "char", "faultstring"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "char", "faultactor"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "struct SOAP_ENV__Detail", "detail"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "struct SOAP_ENV__Code", "SOAP_ENV__Code"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "char", "SOAP_ENV__Reason"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "struct SOAP_ENV__Detail", "SOAP_ENV__Detail"); fprintf(stream, ";\n};\n"); } */ for (MapOfStringToService::const_iterator service2 = services.begin(); service2 != services.end(); ++service2) if ((*service2).second) (*service2).second->generate(types); } //////////////////////////////////////////////////////////////////////////////// // // Service methods // //////////////////////////////////////////////////////////////////////////////// Service::Service() { prefix = NULL; URI = NULL; name = NULL; type = NULL; transport = NULL; } void Service::generate(Types& types) { const char *method_name; banner("Service Binding", name); for (std::vector::const_iterator op2 = operation.begin(); op2 != operation.end(); ++op2) { if (*op2 && ((*op2)->input || bflag)) { bool flag = false, anonymous = ((*op2)->style != document && (*op2)->parameterOrder != NULL); if (!(*op2)->input) method_name = (*op2)->output_name; else method_name = (*op2)->input_name; banner("Service Operation", method_name); if ((*op2)->output && (*op2)->output_name) { if ((*op2)->style == document) flag = ((*op2)->output->element || ((*op2)->output->message && (*op2)->output->message->part.size() == 1)); else if (!wflag) flag = ((*op2)->output->element || ((*op2)->output->message && (*op2)->output->use == encoded && (*op2)->output->message->part.size() == 1 && !(*(*op2)->output->message->part.begin()).simpleTypePtr() && !(*(*op2)->output->message->part.begin()).complexTypePtr())); if (flag && (*op2)->input && (*op2)->output && (*op2)->input->message && (*op2)->output->message && !(*op2)->output->message->part.empty() && (*(*op2)->output->message->part.begin()).element) for (std::vector::const_iterator part = (*op2)->input->message->part.begin(); part != (*op2)->input->message->part.end(); ++part) if ((*part).element && !strcmp((*part).element, (*(*op2)->output->message->part.begin()).element)) flag = false; if (!flag) { if (bflag) fprintf(stream, "/* soapcpp2 generates the following struct automatically for your use:\n"); fprintf(stream, "/// Operation response struct \"%s\" of operation \"%s\".\n", (*op2)->output_name, method_name); fprintf(stream, "struct %s\n{", (*op2)->output_name); (*op2)->output->generate(types, ";", anonymous, true, false, false, (*op2)->is_rest); fprintf(stream, "\n};\n"); if (bflag) fprintf(stream, "*/\n"); } } fprintf(stream, "\n/** Operation \"%s\" of service binding \"%s\".\n", method_name, name); if ((*op2)->documentation) text((*op2)->documentation); if ((*op2)->operation_documentation) text((*op2)->operation_documentation); if ((*op2)->input && (*op2)->input->documentation) { fprintf(stream, "Input request:\n"); text((*op2)->input->documentation); } if ((*op2)->input && (*op2)->input->ext_documentation) { fprintf(stream, "Input request:\n"); text((*op2)->input->ext_documentation); } if ((*op2)->output) { if ((*op2)->output->documentation) { fprintf(stream, "Output response:\n"); text((*op2)->output->documentation); } if ((*op2)->output->ext_documentation) { fprintf(stream, "Output response:\n"); text((*op2)->output->ext_documentation); } } gen_policy(*this, (*op2)->policy, "operation", types); if ((*op2)->input) { gen_policy(*this, (*op2)->input->policy, "request message", types); if ((*op2)->input->content) { fprintf(stream, "\n - Request message MIME content"); if ((*op2)->input->content->type) { fprintf(stream, " type: "); text((*op2)->input->content->type); } if ((*op2)->input->content->type && !strcmp((*op2)->input->content->type, "application/x-www-form-urlencoded")) fprintf(stream, "\n Use the httpform.c plugin to retrieve key-value pairs from the REST request\n message form data at the server side (client side is automated).\n"); else fprintf(stream, "\n @todo This form of MIME content is not automatically handled.\n"); } } if ((*op2)->output) { gen_policy(*this, (*op2)->output->policy, "response message", types); if ((*op2)->output->content) { fprintf(stream, "\n - Response message MIME content"); if ((*op2)->output->content->type) { fprintf(stream, " type: "); text((*op2)->output->content->type); } fprintf(stream, "\n @todo This form of MIME content response is not automatically handled.\n Use one-way request and implement code to parse response.\n"); } } else fprintf(stream, "\n - One-way service request message\n"); if ((*op2)->mep) fprintf(stream, "\n - SOAP MEP: \"%s\"\n", ((*op2)->mep)); if ((*op2)->style == document) fprintf(stream, "\n - %s %s messaging\n", (*op2)->protocol, (*op2)->input && (*op2)->input->content && (*op2)->input->content->type ? (*op2)->input->content->type : "document/literal style"); else if ((*op2)->input) { if ((*op2)->input->use == literal) fprintf(stream, "\n - %s literal messaging\n", (*op2)->protocol); else if ((*op2)->input->encodingStyle) fprintf(stream, "\n - %s RPC encodingStyle=\"%s\"\n", (*op2)->protocol, (*op2)->input->encodingStyle); else fprintf(stream, "\n - %s RPC encoded messaging\n", (*op2)->protocol); } if ((*op2)->output) { if (!(*op2)->input || (*op2)->input->use != (*op2)->output->use) { if ((*op2)->output->use == literal) fprintf(stream, "\n - %s literal response messages\n", (*op2)->protocol); else if ((*op2)->output->encodingStyle) fprintf(stream, "\n - %s RPC response encodingStyle=\"%s\"\n", (*op2)->protocol, (*op2)->output->encodingStyle); else fprintf(stream, "\n - %s RPC encoded response messages\n", (*op2)->protocol); } } if (!location.empty()) { fprintf(stream, "\n - Default endpoints:\n"); for (SetOfString::const_iterator port = location.begin(); port != location.end(); ++port) fprintf(stream, " - %s\n", *port); } if ((*op2)->action) { if (*(*op2)->action) fprintf(stream, "\n - Default SOAP action or REST location path:\n - \"%s\"\n", (*op2)->action); } if ((*op2)->input) { if ((*op2)->input->action) fprintf(stream, "\n - Addressing input action: \"%s\"\n", (*op2)->input->action); } if ((*op2)->output) { if ((*op2)->output->action) fprintf(stream, "\n - Addressing output action: \"%s\"\n", (*op2)->output->action); } for (std::vector::const_iterator infault = (*op2)->infault.begin(); infault != (*op2)->infault.end(); ++infault) { if ((*infault)->message) { if ((*infault)->use == literal) { for (std::vector::const_iterator part = (*infault)->message->part.begin(); part != (*infault)->message->part.end(); ++part) { if ((*part).element) fprintf(stream, "\n - Input Fault: %s (literal)\n", (*part).element); else if ((*part).name && (*part).type) fprintf(stream, "\n - Input Fault: %s (literal)\n", (*part).name); } } else if ((*infault)->message->name) fprintf(stream, "\n - Input Fault: %s\n", (*infault)->name); if ((*infault)->message->name && (*infault)->action) fprintf(stream, " - Input Fault addressing action: \"%s\"\n", (*infault)->action); } else if ((*infault)->name) fprintf(stream, "\n - Input Fault: %s (literal)\n", (*infault)->name); if ((*infault)->body_parts) fprintf(stream, " Input Fault code: %s\n", (*infault)->body_parts); text((*infault)->documentation); text((*infault)->ext_documentation); gen_policy(*this, (*infault)->policy, "fault message", types); } for (std::vector::const_iterator outfault = (*op2)->outfault.begin(); outfault != (*op2)->outfault.end(); ++outfault) { if ((*outfault)->message) { if ((*outfault)->use == literal) { for (std::vector::const_iterator part = (*outfault)->message->part.begin(); part != (*outfault)->message->part.end(); ++part) { if ((*part).element) fprintf(stream, "\n - Output Fault: %s (literal)\n", (*part).element); else if ((*part).name && (*part).type) fprintf(stream, "\n - Output Fault: %s (literal)\n", (*part).name); } } else if ((*outfault)->message->name) fprintf(stream, "\n - Output Fault: %s\n", (*outfault)->name); if ((*outfault)->message->name && (*outfault)->action) fprintf(stream, " - Output Fault addressing action: \"%s\"\n", (*outfault)->action); } else if ((*outfault)->name) fprintf(stream, "\n - Output Fault: %s (literal)\n", (*outfault)->name); if ((*outfault)->body_parts) fprintf(stream, " Output Fault code: %s\n", (*outfault)->body_parts); text((*outfault)->documentation); text((*outfault)->ext_documentation); gen_policy(*this, (*outfault)->policy, "fault message", types); } if ((*op2)->input) { if (!(*op2)->input->header.empty()) fprintf(stream, "\n - Request message has mandatory header part(s) (see @ref SOAP_ENV__Header):\n"); for (std::vector::const_iterator inputheader = (*op2)->input->header.begin(); inputheader != (*op2)->input->header.end(); ++inputheader) { if ((*inputheader).part) { if ((*inputheader).use == encoded && (*inputheader).namespace_) fprintf(stream, " - %s\n", types.aname(NULL, (*inputheader).namespace_, (*inputheader).part)); else if ((*inputheader).partPtr() && (*inputheader).partPtr()->element) fprintf(stream, " - %s\n", types.aname(NULL, NULL, (*inputheader).partPtr()->element)); } } } if ((*op2)->input && (*op2)->input->multipartRelated) { int k = 2; fprintf(stream, "\n - Request message MIME multipart/related attachments:\n"); for (std::vector::const_iterator part = (*op2)->input->multipartRelated->part.begin(); part != (*op2)->input->multipartRelated->part.end(); ++part) { if ((*part).soap__body_) { fprintf(stream, " -# MIME attachment with SOAP Body and mandatory header part(s):\n"); for (std::vector::const_iterator header = (*part).soap__header_.begin(); header != (*part).soap__header_.end(); ++header) { if ((*header).part) { if ((*header).use == encoded && (*header).namespace_) fprintf(stream, " - %s\n", types.aname(NULL, (*header).namespace_, (*header).part)); else if ((*header).partPtr() && (*header).partPtr()->element) fprintf(stream, " - %s\n", types.aname(NULL, NULL, (*header).partPtr()->element)); } } } else { fprintf(stream, " -# MIME attachment %d:\n", k++); for (std::vector::const_iterator content = (*part).content.begin(); content != (*part).content.end(); ++content) { if ((*content).part) { fprintf(stream, " - part: "); text((*content).part); } if ((*content).type) { fprintf(stream, " - type: "); text((*content).type); } } } } } if ((*op2)->input && (*op2)->input->layout) fprintf(stream, "\n - Request message has DIME attachments in compliance with %s\n", (*op2)->input->layout); if ((*op2)->output) { if (!(*op2)->output->header.empty()) fprintf(stream, "\n - Response message has mandatory header part(s): (see @ref SOAP_ENV__Header)\n"); for (std::vector::const_iterator outputheader = (*op2)->output->header.begin(); outputheader != (*op2)->output->header.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, " - %s\n", types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, " - %s\n", types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } } if ((*op2)->output && (*op2)->output_name && (*op2)->output->multipartRelated) { int k = 2; fprintf(stream, "\n - Response message MIME multipart/related attachments\n"); for (std::vector::const_iterator part = (*op2)->output->multipartRelated->part.begin(); part != (*op2)->output->multipartRelated->part.end(); ++part) { if ((*part).soap__body_) { fprintf(stream, " -# MIME attachment with SOAP Body and mandatory header part(s):\n"); for (std::vector::const_iterator header = (*part).soap__header_.begin(); header != (*part).soap__header_.end(); ++header) { if ((*header).part) { if ((*header).use == encoded && (*header).namespace_) fprintf(stream, " - %s\n", types.aname(NULL, (*header).namespace_, (*header).part)); else if ((*header).partPtr() && (*header).partPtr()->element) fprintf(stream, " - %s\n", types.aname(NULL, NULL, (*header).partPtr()->element)); } } } else { fprintf(stream, " -# MIME attachment %d:\n", k++); for (std::vector::const_iterator content = (*part).content.begin(); content != (*part).content.end(); ++content) { if ((*content).part) { fprintf(stream, " - part: "); text((*content).part); } if ((*content).type) { fprintf(stream, " - type: "); text((*content).type); } } } } } if ((*op2)->output && (*op2)->output_name && (*op2)->output->layout) fprintf(stream, "\n - Response message has DIME attachments in compliance with %s\n", (*op2)->output->layout); if (!Lflag) { fprintf(stream, "\nC stub function (defined in soapClient.c[pp] generated by soapcpp2):\n@code\n int soap_%s_%s(\n struct soap *soap,\n NULL, // char *endpoint = NULL selects default endpoint for this operation\n NULL, // char *action = NULL selects default action for this operation\n // input parameters:", (*op2)->output ? "call" : "send", method_name); if ((*op2)->input) (*op2)->input->generate(types, ",", false, false, false, false, (*op2)->is_rest); if ((*op2)->output && (*op2)->output_name) { fprintf(stream, "\n // output parameters:"); if (flag) { if ((*op2)->style == rpc && (*op2)->output->message && !(*op2)->output->message->part.empty() && (*(*op2)->output->message->part.begin()).name) { fprintf(stream, "\n"); fprintf(stream, anonymous ? anonformat : paraformat, types.tnamenoptr(NULL, NULL, (*(*op2)->output->message->part.begin()).type), cflag ? "*" : "&", types.aname(NULL, NULL, (*(*op2)->output->message->part.begin()).name), ""); } else (*op2)->output->generate(types, "", anonymous, false, true, false, (*op2)->is_rest); } else fprintf(stream, "\n struct %s%s", (*op2)->output_name, cflag ? "*" : "&"); } fprintf(stream, "\n );\n@endcode\n\nC server function (called from the service dispatcher defined in soapServer.c[pp]):\n@code\n int %s(\n struct soap *soap,\n // input parameters:", method_name); if ((*op2)->input) (*op2)->input->generate(types, ",", false, false, false, false, (*op2)->is_rest); fprintf(stream, "\n // output parameters:"); if ((*op2)->output && (*op2)->output_name) { if (flag) { if ((*op2)->style == rpc && (*op2)->output->message && !(*op2)->output->message->part.empty() && (*(*op2)->output->message->part.begin()).name) { fprintf(stream, "\n"); fprintf(stream, anonymous ? anonformat : paraformat, types.tnamenoptr(NULL, NULL, (*(*op2)->output->message->part.begin()).type), cflag ? "*" : "&", types.aname(NULL, NULL, (*(*op2)->output->message->part.begin()).name), ""); } else (*op2)->output->generate(types, "", anonymous, false, true, false, (*op2)->is_rest); } else fprintf(stream, "\n struct %s%s", (*op2)->output_name, cflag ? "*" : "&"); } fprintf(stream, "\n );\n@endcode\n\n"); if (!cflag) { fprintf(stream, "C++ proxy class (defined in soap%sProxy.h generated with soapcpp2):\n", name); fprintf(stream, "@code\n class %sProxy;\n@endcode\n", name); fprintf(stream, "Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes;\n\n"); fprintf(stream, "C++ service class (defined in soap%sService.h generated with soapcpp2):\n", name); fprintf(stream, "@code\n class %sService;\n@endcode\n", name); fprintf(stream, "Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes;\n\n"); } } fprintf(stream, "*/\n\n"); (*op2)->generate(types, *this); } else if (*op2 && (*op2)->output) { if (!(*op2)->input) method_name = (*op2)->output_name; else method_name = (*op2)->input_name; banner("Service Operation", method_name); fprintf(stream, "\n/** Operation \"%s\" of service binding \"%s\".\n", method_name, name); if ((*op2)->documentation) text((*op2)->documentation); if ((*op2)->operation_documentation) text((*op2)->operation_documentation); if ((*op2)->output->documentation) { fprintf(stream, "Output response:\n"); text((*op2)->output->documentation); } if ((*op2)->output->ext_documentation) { fprintf(stream, "Output response:\n"); text((*op2)->output->ext_documentation); } gen_policy(*this, (*op2)->policy, "operation", types); gen_policy(*this, (*op2)->output->policy, "response message", types); fprintf(stream, "\n - One-way service response message\n"); if ((*op2)->mep) fprintf(stream, "\n - SOAP MEP: \"%s\"\n", ((*op2)->mep)); if ((*op2)->style == document) fprintf(stream, "\n - %s document/literal style messaging\n", (*op2)->protocol); else { if ((*op2)->output->use == literal) fprintf(stream, "\n - %s RPC literal messaging\n", (*op2)->protocol); else if ((*op2)->output->encodingStyle) fprintf(stream, "\n - %s RPC encodingStyle=\"%s\"\n", (*op2)->protocol, (*op2)->output->encodingStyle); else fprintf(stream, "\n - %s RPC encoded messaging\n", (*op2)->protocol); } if (!location.empty()) { fprintf(stream, "\n - Default endpoints:\n"); for (SetOfString::const_iterator port = location.begin(); port != location.end(); ++port) fprintf(stream, " - %s\n", *port); } if ((*op2)->action) { if (*(*op2)->action) fprintf(stream, "\n - Default SOAP action or REST location path:\n - \"%s\"\n", (*op2)->action); } if ((*op2)->output) { if ((*op2)->output->action) fprintf(stream, "\n - Addressing output action: \"%s\"\n", (*op2)->output->action); } for (std::vector::const_iterator outfault = (*op2)->outfault.begin(); outfault != (*op2)->outfault.end(); ++outfault) { if ((*outfault)->message) { if ((*outfault)->use == literal) { for (std::vector::const_iterator part = (*outfault)->message->part.begin(); part != (*outfault)->message->part.end(); ++part) { if ((*part).element) fprintf(stream, "\n - SOAP Output Fault: %s (literal)\n", (*part).element); else if ((*part).name && (*part).type) fprintf(stream, "\n - SOAP Output Fault: %s (literal)\n", (*part).name); } } else if ((*outfault)->message->name) fprintf(stream, "\n - SOAP Output Fault: %s\n", (*outfault)->name); if ((*outfault)->message->name && (*outfault)->action) fprintf(stream, " - SOAP Output Fault addressing action: \"%s\"\n", (*outfault)->action); } else if ((*outfault)->name) fprintf(stream, "\n - SOAP Output Fault: %s (literal)\n", (*outfault)->name); gen_policy(*this, (*outfault)->policy, "fault message", types); } if (!(*op2)->output->header.empty()) fprintf(stream, "\n - Response message has mandatory header part(s) (see @ref SOAP_ENV__Header):\n"); for (std::vector::const_iterator outputheader = (*op2)->output->header.begin(); outputheader != (*op2)->output->header.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, " - %s\n", types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, " - %s\n", types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } if ((*op2)->output->multipartRelated) { int k = 2; fprintf(stream, "\n - Response message MIME multipart/related attachments:\n"); for (std::vector::const_iterator part = (*op2)->output->multipartRelated->part.begin(); part != (*op2)->output->multipartRelated->part.end(); ++part) { if ((*part).soap__body_) { fprintf(stream, " -# MIME attachment with SOAP Body and mandatory header part(s):\n"); for (std::vector::const_iterator header = (*part).soap__header_.begin(); header != (*part).soap__header_.end(); ++header) { if ((*header).part) { if ((*header).use == encoded && (*header).namespace_) fprintf(stream, " - %s\n", types.aname(NULL, (*header).namespace_, (*header).part)); else if ((*header).partPtr() && (*header).partPtr()->element) fprintf(stream, " - %s\n", types.aname(NULL, NULL, (*header).partPtr()->element)); } } } else { fprintf(stream, " -# MIME attachment %d:\n", k++); for (std::vector::const_iterator content = (*part).content.begin(); content != (*part).content.end(); ++content) { if ((*content).part) { fprintf(stream, " - part: "); text((*content).part); } if ((*content).type) { fprintf(stream, " - type: "); text((*content).type); } } } } } if ((*op2)->output->layout) fprintf(stream, "\n - Response message has DIME attachments in compliance with %s\n", (*op2)->output->layout); if (!Lflag) { fprintf(stream, "\nC stub function (defined in soapClient.c[pp] generated by soapcpp2):\n@code\n int soap_call_%s(\n struct soap *soap,\n NULL, // char *endpoint = NULL selects default endpoint for this operation\n NULL, // char *action = NULL selects default action for this operation\n // parameters:", method_name); (*op2)->output->generate(types, ",", false, false, false, false, (*op2)->is_rest); fprintf(stream, "\n );\n@endcode\n\nC server function (called from the service dispatcher defined in soapServer.c[pp]):\n@code\n int %s(\n struct soap *soap,\n // parameters:", method_name); (*op2)->output->generate(types, ",", false, false, false, false, (*op2)->is_rest); fprintf(stream, "\n );\n@endcode\n\n"); if (!cflag) { fprintf(stream, "C++ proxy class (defined in soap%sProxy.h):\n", name); fprintf(stream, "@code\n class %sProxy;\n@endcode\n", name); fprintf(stream, "Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes;\n\n"); fprintf(stream, "C++ service class (defined in soap%sService.h):\n", name); fprintf(stream, "@code\n class %sService;\n@endcode\n", name); fprintf(stream, "Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes;\n\n"); } } fprintf(stream, "*/\n\n"); (*op2)->generate(types, *this); } } gen_policy_enablers(*this); } void Service::add_import(const char *s) { if (find_if(imports.begin(), imports.end(), eqstr(s)) == imports.end()) imports.push_back(s); } void Service::del_import(const char *s) { VectorOfString::iterator i = find_if(imports.begin(), imports.end(), eqstr(s)); if (i != imports.end()) imports.erase(i); } //////////////////////////////////////////////////////////////////////////////// // // Operation methods // //////////////////////////////////////////////////////////////////////////////// void Operation::generate(Types& types, Service& service) { bool flag = false, anonymous = ((style != document) && parameterOrder != NULL); const char *method_name = NULL; (void)service; if (output) { if (style == document) flag = (output->element || (output->message && output->message->part.size() == 1)); else if (!wflag) flag = (output->element || (output->message && output->use == encoded && output->message->part.size() == 1 && !(*output->message->part.begin()).simpleTypePtr() && !(*output->message->part.begin()).complexTypePtr())); if (flag && input && input->message && output->message && !output->message->part.empty() && (*output->message->part.begin()).element) for (std::vector::const_iterator part = input->message->part.begin(); part != input->message->part.end(); ++part) if ((*part).element && !strcmp((*part).element, (*output->message->part.begin()).element)) flag = false; } if (output && output_name && bflag) { if (input) { method_name = strstr(output_name + 1, "__"); if (method_name) method_name += 2; else method_name = output_name; } else { method_name = strstr(input_name + 1, "__"); if (method_name) method_name += 2; else method_name = input_name; } if (protocol) fprintf(stream, serviceformat, prefix, "method-protocol", method_name, protocol); if (output->content && output->content->type) fprintf(stream, serviceformat, prefix, "method-mime-type", method_name, output->content->type); else if (style == document) fprintf(stream, serviceformat, prefix, "method-style", method_name, "document"); else fprintf(stream, serviceformat, prefix, "method-style", method_name, "rpc"); if (output->use == literal) fprintf(stream, serviceformat, prefix, "method-encoding", method_name, "literal"); else if (output->encodingStyle) fprintf(stream, serviceformat, prefix, "method-encoding", method_name, output->encodingStyle); else fprintf(stream, serviceformat, prefix, "method-encoding", method_name, "encoded"); if (output->action && *output->action) fprintf(stream, serviceformat, prefix, "method-action", method_name, output->action); else if (action) { if (*action) fprintf(stream, serviceformat, prefix, "method-action", method_name, action); else fprintf(stream, serviceformat, prefix, "method-action", method_name, "\"\""); } for (std::vector::const_iterator message = outfault.begin(); message != outfault.end(); ++message) { if ((*message)->message) { if ((*message)->use == literal) { for (std::vector::const_iterator part = (*message)->message->part.begin(); part != (*message)->message->part.end(); ++part) { if ((*part).element) fprintf(stream, serviceformat, prefix, "method-fault", method_name, types.aname(NULL, NULL, (*part).element)); else if ((*part).type) fprintf(stream, serviceformat, prefix, "method-fault", method_name, types.aname(NULL, (*message)->URI, (*part).name)); } } else { if ((*message)->message->name) fprintf(stream, serviceformat, prefix, "method-fault", method_name, (*message)->name); } if ((*message)->action) fprintf(stream, serviceformat, prefix, "method-fault-action", method_name, (*message)->action); } else if ((*message)->name) fprintf(stream, serviceformat, prefix, "method-fault", method_name, (*message)->name); } if (output->multipartRelated) { for (std::vector::const_iterator outputmime = output->multipartRelated->part.begin(); outputmime != output->multipartRelated->part.end(); ++outputmime) { for (std::vector::const_iterator outputheader = (*outputmime).soap__header_.begin(); outputheader != (*outputmime).soap__header_.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } for (std::vector::const_iterator content = (*outputmime).content.begin(); content != (*outputmime).content.end(); ++content) if ((*content).type) fprintf(stream, serviceformat, prefix, "method-mime-type", method_name, (*content).type); } } // TODO: add headerfault directives? for (std::vector::const_iterator outputheader = output->header.begin(); outputheader != output->header.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } for (std::vector::const_iterator outputwheader = output->wheader.begin(); outputwheader != output->wheader.end(); ++outputwheader) { if ((*outputwheader).element) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, NULL, (*outputwheader).element)); } if (input) { fprintf(stream, "/// Operation response \"%s\" of operation \"%s\".\n", output_name, input_name); fprintf(stream, "int %s(", output_name); } else fprintf(stream, "int %s(", input_name); output->generate(types, ",", anonymous, true, false, false, is_rest); fprintf(stream, "\n void\t///< One-way message: no output parameter\n);\n"); } if (!input && output && output_name) { method_name = strstr(output_name + 1, "__"); if (method_name) method_name += 2; else method_name = output_name; if (protocol) fprintf(stream, serviceformat, prefix, "method-protocol", method_name, protocol); if (output->content && output->content->type) fprintf(stream, serviceformat, prefix, "method-mime-type", method_name, output->content->type); else if (style == document) fprintf(stream, serviceformat, prefix, "method-style", method_name, "document"); else fprintf(stream, serviceformat, prefix, "method-style", method_name, "rpc"); if (output->use == literal) fprintf(stream, serviceformat, prefix, "method-encoding", method_name, "literal"); else if (output->encodingStyle) fprintf(stream, serviceformat, prefix, "method-encoding", method_name, output->encodingStyle); else fprintf(stream, serviceformat, prefix, "method-encoding", method_name, "encoded"); if (output->action && *output->action) fprintf(stream, serviceformat, prefix, "method-action", method_name, output->action); else if (action) { if (*action) fprintf(stream, serviceformat, prefix, "method-action", method_name, action); else fprintf(stream, serviceformat, prefix, "method-action", method_name, "\"\""); } for (std::vector::const_iterator message = outfault.begin(); message != outfault.end(); ++message) { if ((*message)->message) { if ((*message)->use == literal) { for (std::vector::const_iterator part = (*message)->message->part.begin(); part != (*message)->message->part.end(); ++part) { if ((*part).element) fprintf(stream, serviceformat, prefix, "method-fault", method_name, types.aname(NULL, NULL, (*part).element)); else if ((*part).type) fprintf(stream, serviceformat, prefix, "method-fault", method_name, types.aname(NULL, (*message)->URI, (*part).name)); } } else { if ((*message)->message->name) fprintf(stream, serviceformat, prefix, "method-fault", method_name, (*message)->name); } if ((*message)->action) fprintf(stream, serviceformat, prefix, "method-fault-action", method_name, (*message)->action); } else if ((*message)->name) fprintf(stream, serviceformat, prefix, "method-fault", method_name, (*message)->name); } if (output->multipartRelated) { for (std::vector::const_iterator outputmime = output->multipartRelated->part.begin(); outputmime != output->multipartRelated->part.end(); ++outputmime) { for (std::vector::const_iterator outputheader = (*outputmime).soap__header_.begin(); outputheader != (*outputmime).soap__header_.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } for (std::vector::const_iterator content = (*outputmime).content.begin(); content != (*outputmime).content.end(); ++content) if ((*content).type) fprintf(stream, serviceformat, prefix, "method-mime-type", method_name, (*content).type); } } // TODO: add headerfault directives? for (std::vector::const_iterator outputheader = output->header.begin(); outputheader != output->header.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } for (std::vector::const_iterator outputwheader = output->wheader.begin(); outputwheader != output->wheader.end(); ++outputwheader) { if ((*outputwheader).element) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, NULL, (*outputwheader).element)); } fprintf(stream, "int %s(", output_name); if (flag) { if (style == rpc && output->message && (*output->message->part.begin()).name) { fprintf(stream, "\n"); if (output->use == encoded) fprintf(stream, anonymous ? anonformat : paraformat, types.tnamenoptr(NULL, NULL, (*output->message->part.begin()).type), cflag ? "*:" : "&:", types.aname(NULL, NULL, (*output->message->part.begin()).name), ""); else fprintf(stream, anonymous ? anonformat : paraformat, types.tnamenoptr(NULL, NULL, (*output->message->part.begin()).type), cflag ? "*" : "&", types.aname(NULL, NULL, (*output->message->part.begin()).name), ""); fprintf(stream, "\t///< Output parameter%s%s", output->use == encoded ? ", :unqualified name as per RPC encoding" : "", anonymous ? ", _wildcard name as per RPC parameterOrder" : ""); } else output->generate(types, "", anonymous, true, true, false, is_rest); } else { fprintf(stream, "\n struct %-28s%s", output_name, cflag ? "*" : "&"); fprintf(stream, "\t///< Output response struct parameter"); } fprintf(stream, "\n);\n"); } if (input && input_name) { method_name = strstr(input_name + 1, "__"); if (method_name) method_name += 2; else method_name = input_name; if (protocol) fprintf(stream, serviceformat, prefix, "method-protocol", method_name, protocol); if (input->content && input->content->type) fprintf(stream, serviceformat, prefix, "method-input-mime-type", method_name, input->content->type); else if (style == document) fprintf(stream, serviceformat, prefix, "method-style", method_name, "document"); else fprintf(stream, serviceformat, prefix, "method-style", method_name, "rpc"); if (output && output->content && output->content->type) fprintf(stream, serviceformat, prefix, "method-output-mime-type", method_name, output->content->type); if (!input || input->use == literal) fprintf(stream, serviceformat, prefix, "method-encoding", method_name, "literal"); else if (input->encodingStyle) fprintf(stream, serviceformat, prefix, "method-encoding", method_name, input->encodingStyle); else fprintf(stream, serviceformat, prefix, "method-encoding", method_name, "encoded"); if (output) { if (!input || input->use != output->use) { if (output->use == literal) fprintf(stream, serviceformat, prefix, "method-response-encoding", method_name, "literal"); else if (output->encodingStyle) fprintf(stream, serviceformat, prefix, "method-response-encoding", method_name, output->encodingStyle); else fprintf(stream, serviceformat, prefix, "method-response-encoding", method_name, "encoded"); } if (style == rpc && (!input || (input->URI && output->URI && *output->URI && strcmp(input->URI, output->URI)))) fprintf(stream, schemaformat, types.nsprefix(NULL, output->URI), "namespace", output->URI); } if (input && input->action && *input->action) fprintf(stream, serviceformat, prefix, "method-input-action", method_name, input->action); else if (action) { if (*action) fprintf(stream, serviceformat, prefix, "method-action", method_name, action); else fprintf(stream, serviceformat, prefix, "method-action", method_name, "\"\""); } if (output && output->action && *output->action) fprintf(stream, serviceformat, prefix, "method-output-action", method_name, output->action); for (std::vector::const_iterator message = outfault.begin(); message != outfault.end(); ++message) { if ((*message)->message) { if ((*message)->use == literal) { for (std::vector::const_iterator part = (*message)->message->part.begin(); part != (*message)->message->part.end(); ++part) { if ((*part).element) fprintf(stream, serviceformat, prefix, "method-fault", method_name, types.aname(NULL, NULL, (*part).element)); else if ((*part).type) fprintf(stream, serviceformat, prefix, "method-fault", method_name, types.aname(NULL, (*message)->URI, (*part).name)); } } else { if ((*message)->message->name) fprintf(stream, serviceformat, prefix, "method-fault", method_name, (*message)->name); } if ((*message)->action) fprintf(stream, serviceformat, prefix, "method-fault-action", method_name, (*message)->action); } else if ((*message)->name) fprintf(stream, serviceformat, prefix, "method-fault", method_name, (*message)->name); } if (input) { if (input->multipartRelated) { for (std::vector::const_iterator inputmime = input->multipartRelated->part.begin(); inputmime != input->multipartRelated->part.end(); ++inputmime) { for (std::vector::const_iterator inputheader = (*inputmime).soap__header_.begin(); inputheader != (*inputmime).soap__header_.end(); ++inputheader) { if ((*inputheader).part) { if ((*inputheader).use == encoded && (*inputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-input-header-part", method_name, types.aname(NULL, (*inputheader).namespace_, (*inputheader).part)); else if ((*inputheader).partPtr() && (*inputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-input-header-part", method_name, types.aname(NULL, NULL, (*inputheader).partPtr()->element)); } } for (std::vector::const_iterator content = (*inputmime).content.begin(); content != (*inputmime).content.end(); ++content) if ((*content).type) fprintf(stream, serviceformat, prefix, "method-input-mime-type", method_name, (*content).type); } } // TODO: add headerfault directives? for (std::vector::const_iterator inputheader = input->header.begin(); inputheader != input->header.end(); ++inputheader) { if ((*inputheader).part) { if ((*inputheader).use == encoded && (*inputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-input-header-part", method_name, types.aname(NULL, (*inputheader).namespace_, (*inputheader).part)); else if ((*inputheader).partPtr() && (*inputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-input-header-part", method_name, types.aname(NULL, NULL, (*inputheader).partPtr()->element)); } } for (std::vector::const_iterator inputwheader = input->wheader.begin(); inputwheader != input->wheader.end(); ++inputwheader) { if ((*inputwheader).element) fprintf(stream, serviceformat, prefix, "method-input-header-part", method_name, types.aname(NULL, NULL, (*inputwheader).element)); } } if (output) { if (output->multipartRelated) { for (std::vector::const_iterator outputmime = output->multipartRelated->part.begin(); outputmime != output->multipartRelated->part.end(); ++outputmime) { for (std::vector::const_iterator outputheader = (*outputmime).soap__header_.begin(); outputheader != (*outputmime).soap__header_.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-output-header-part", method_name, types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-output-header-part", method_name, types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } for (std::vector::const_iterator content = (*outputmime).content.begin(); content != (*outputmime).content.end(); ++content) if ((*content).type) fprintf(stream, serviceformat, prefix, "method-output-mime-type", method_name, (*content).type); } } for (std::vector::const_iterator outputheader = output->header.begin(); outputheader != output->header.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-output-header-part", method_name, types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-output-header-part", method_name, types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } for (std::vector::const_iterator outputwheader = output->wheader.begin(); outputwheader != output->wheader.end(); ++outputwheader) { if ((*outputwheader).element) fprintf(stream, serviceformat, prefix, "method-output-header-part", method_name, types.aname(NULL, NULL, (*outputwheader).element)); } } if (input) fprintf(stream, "int %s(", input_name); else fprintf(stream, "int %s(", output_name); if (input) input->generate(types, ",", anonymous, true, false, false, is_rest); if (output) { if (flag) { if (style == rpc && output->message && (*output->message->part.begin()).name) { fprintf(stream, "\n"); if (output->use == encoded) fprintf(stream, anonymous ? anonformat : paraformat, types.tnamenoptr(NULL, NULL, (*output->message->part.begin()).type), cflag ? "*:" : "&:", types.aname(NULL, NULL, (*output->message->part.begin()).name), ""); else fprintf(stream, anonymous ? anonformat : paraformat, types.tnamenoptr(NULL, NULL, (*output->message->part.begin()).type), cflag ? "*" : "&", types.aname(NULL, NULL, (*output->message->part.begin()).name), ""); fprintf(stream, "\t///< Output parameter%s%s", output->use == encoded ? ", :unqualified name as per RPC encoding" : "", anonymous ? ", _wildcard name as per RPC parameterOrder" : ""); } else output->generate(types, "", anonymous, true, true, false, is_rest); } else { fprintf(stream, "\n struct %-28s%s", output_name, cflag ? "*" : "&"); fprintf(stream, "\t///< Output response struct parameter"); } fprintf(stream, "\n);\n"); } else fprintf(stream, "\n void\t///< One-way message: no output parameter\n);\n"); } } //////////////////////////////////////////////////////////////////////////////// // // Message methods // //////////////////////////////////////////////////////////////////////////////// void Message::generate(Types& types, const char *sep, bool anonymous, bool remark, bool response, bool optional, bool is_rest) { if (message) { for (std::vector::const_iterator part = message->part.begin(); part != message->part.end(); ++part) { if (!(*part).name) { fprintf(stderr, "\nError: no wsdl:definitions/message/part/@name \"%s\"\n", message->name ? message->name : ""); } else if (!body_parts || soap_tagsearch(body_parts, (*part).name)) { if (remark && (*part).documentation) comment("", (*part).name, "parameter", (*part).documentation); else fprintf(stream, "\n"); if ((*part).element) { if ((*part).elementPtr()) { const char *name, *type, *nameURI = NULL, *typeURI = NULL, *prefix = NULL; if (style == rpc && use == encoded) { name = (*part).name; } else { name = (*part).elementPtr()->name; if (style == document && (*part).elementPtr()->schemaPtr()) nameURI = (*part).elementPtr()->schemaPtr()->targetNamespace; } if ((*part).elementPtr()->type) { type = (*part).elementPtr()->type; } else { type = (*part).elementPtr()->name; prefix = "_"; } if ((*part).elementPtr()->schemaPtr()) typeURI = (*part).elementPtr()->schemaPtr()->targetNamespace; if ((*part).elementPtr()->xmime__expectedContentTypes) fprintf(stream, " /// MTOM attachment with content types %s\n", (*part).elementPtr()->xmime__expectedContentTypes); if (response) { const char *t; bool flag = false; if (!zflag || zflag > 6) t = types.tnamenoptr(prefix, typeURI, type); else { t = types.tname(prefix, typeURI, type); flag = (strchr(t, '*') && strcmp(t, "char*") && strcmp(t, "char *")); } fprintf(stream, anonymous ? anonformat : paraformat, t, flag ? " " : cflag ? "*" : "&", types.aname(NULL, nameURI, name), sep); if (remark) fprintf(stream, "\t///< Output parameter%s", anonymous ? ", _wildcard name as per RPC parameterOrder" : ""); } else { fprintf(stream, anonymous ? anonformat : paraformat, types.pname(optional, false, prefix, typeURI, type), " ", types.aname(NULL, nameURI, name), sep); if (remark) { if (*sep == ',') fprintf(stream, "\t///< Input parameter%s", anonymous ? ", _wildcard name as per RPC parameterOrder" : ""); else fprintf(stream, "\t///< Output parameter%s", anonymous ? ", _wildcard name as per RPC parameterOrder" : ""); } } } else { fprintf(stream, anonymous ? anonformat : paraformat, types.pname(optional, false, NULL, NULL, (*part).element), " ", types.aname(NULL, NULL, (*part).element), sep); if (remark) fprintf(stream, "\t///< @todo Check element type (imported type)"); } } else if ((*part).type) { bool unqual = (style == rpc && use == encoded) && remark; const char *nameURI = NULL, *typeURI = NULL; if (!Xflag && (!zflag || zflag > 8)) { if ((*part).simpleTypePtr() && (*part).simpleTypePtr()->schemaPtr()) typeURI = (*part).simpleTypePtr()->schemaPtr()->targetNamespace; else if ((*part).complexTypePtr() && (*part).complexTypePtr()->schemaPtr()) typeURI = (*part).complexTypePtr()->schemaPtr()->targetNamespace; if (style == document && use == literal && !is_rest) { if (remark && !Wflag) fprintf(stderr, "\nWarning: wsdl:definitions/message/part/@type schema type for part/@name=\"%s\" makes the name ambiguous resulting in a qualified part name when its type is not a primitive XSD type and when option -X is not used to disambiguate wrapped patterns, the document/literal wrapped pattern requires part/@element\n", (*part).name); /* this adds the schema namespace prefix, but not for primitive XSD types and other built-in types */ nameURI = typeURI; } } if (response) { const char *t; bool flag = false; if (!zflag || zflag > 6) t = types.tnamenoptr(NULL, typeURI, (*part).type); else { t = types.tname(NULL, typeURI, (*part).type); flag = (strchr(t, '*') && strcmp(t, "char*") && strcmp(t, "char *")); } if (unqual) fprintf(stream, anonymous ? anonformat : paraformat, t, flag ? " :" : cflag ? "*:" : "&:", types.aname(NULL, NULL, (*part).name), sep); else fprintf(stream, anonymous ? anonformat : paraformat, t, flag ? " " : cflag ? "*" : "&", types.aname(NULL, nameURI, (*part).name), sep); if (remark) fprintf(stream, "\t///< Output parameter%s%s", unqual ? ", :unqualified name as per RPC encoding" : "", anonymous ? ", _wildcard name as per RPC parameterOrder" : ""); } else { const char *t = types.pname((optional || (*part).is_optional()) && !(*part).is_repeating(), false, NULL, typeURI, (*part).type); if ((*part).is_repeating()) { if (cflag) { fprintf(stream, sizeparaformat, "int", types.aname(NULL, NULL, (*part).name), ","); fprintf(stream, "\t///< Repeating parameter\n"); fprintf(stream, anonymous ? anonformat : paraformat, t, unqual ? "*:" : "*", types.aname(NULL, nameURI, (*part).name), ""); } else { fprintf(stream, pointertemplateparaformat, types.vname("$CONTAINER"), t, unqual ? " :" : " ", types.aname(NULL, nameURI, (*part).name), ""); } } else { fprintf(stream, anonymous ? anonformat : paraformat, t, unqual ? " :" : " ", types.aname(NULL, nameURI, (*part).name), ""); types.gendefault(NULL, (*part).type, NULL, (*part).simpleTypePtr(), (*part).get_default(), NULL, "="); } fprintf(stream, "%s", sep); if (remark) { if (*sep == ',') fprintf(stream, "\t///< Input parameter%s%s%s", (*part).is_repeating() ? " is repeating" : optional || (*part).is_optional() ? " is optional" : "", unqual ? ", :unqualified name as per RPC encoding" : "", anonymous ? ", _wildcard name as per RPC parameterOrder" : ""); else fprintf(stream, "\t///< Output parameter%s%s%s", (*part).is_repeating() ? " is repeating" : optional || (*part).is_optional() ? " is optional" : "", unqual ? ", :unqualified name as per RPC encoding" : "", anonymous ? ", _wildcard name as per RPC parameterOrder" : ""); const std::vector& options = (*part).options(); if (!options.empty()) fprintf(stream, " with one of the values"); for (std::vector::const_iterator i = options.begin(); i != options.end(); ++i) fprintf(stream, " '%s'", *i); if ((*part).is_fixed() && (*part).get_default()) fprintf(stream, " with fixed value '%s'", (*part).get_default()); } } } else if (style == rpc) { fprintf(stderr, "\nError: no wsdl:definitions/message/part/@type in part \"%s\"\n", (*part).name); } else { fprintf(stderr, "\nError: no wsdl:definitions/message/part/@element in part \"%s\"\n", (*part).name); } } } } else if (element) // WSDL 2.0 { const char *prefix = NULL; const char *URI = NULL; const char *name = element->name; const char *type = element->type; if (!type) { type = name; prefix = "_"; } if (element->schemaPtr()) URI = element->schemaPtr()->targetNamespace; if (response) { const char *t; bool flag = false; if (!zflag || zflag > 6) t = types.tnamenoptr(prefix, URI, type); else { t = types.tname(prefix, URI, type); flag = (strchr(t, '*') && strcmp(t, "char*") && strcmp(t, "char *")); } fprintf(stream, "\n"); fprintf(stream, paraformat, t, flag ? " " : cflag ? "*" : "&", anonymous ? "" : types.aname(NULL, URI, name), sep); if (remark) fprintf(stream, "\t///< Output parameter%s", anonymous ? ", _wildcard name as per RPC parameterOrder" : ""); } else if (style == document || element->simpleTypePtr()) { // WSDL 2.0 document style fprintf(stream, "\n"); fprintf(stream, anonymous ? anonformat : paraformat, types.pname(optional, false, prefix, URI, type), " ", types.aname(NULL, URI, name), sep); if (remark) { if (*sep == ',') fprintf(stream, "\t///< Input parameter%s", anonymous ? ", _wildcard name as er RPC parameterOrder" : ""); else fprintf(stream, "\t///< Output parameter%s", anonymous ? ", _wildcard name as er RPC parameterOrder" : ""); } } else if (element->complexTypePtr()) { // WSDL 2.0 RPC style xs__seqchoice *seq = element->complexTypePtr()->sequence; for (std::vector::const_iterator i = seq->__contents.begin(); i != seq->__contents.end(); ++i) { if ((*i).__union == SOAP_UNION_xs__union_content_element) { name = (*i).__content.element->name; type = (*i).__content.element->type; if (!type) type = name; fprintf(stream, "\n"); fprintf(stream, anonymous ? anonformat : paraformat, types.pname(optional, false, prefix, URI, type), " ", types.aname(NULL, NULL, name), sep); if (remark) { if (*sep == ',') fprintf(stream, "\t///< Input parameter%s", anonymous ? ", _wildcard name as per RPC parameterOrder" : ""); else fprintf(stream, "\t///< Output parameter%s", anonymous ? ", _wildcard name as per RPC parameterOrder" : ""); } } } } } } //////////////////////////////////////////////////////////////////////////////// // // Miscellaneous // //////////////////////////////////////////////////////////////////////////////// static const char *urienc(struct soap *soap, const char *uri) { const char *r, *s; char *t; size_t n = 0; if (!uri) return NULL; for (s = uri; *s; s++) if (!URI_CHAR(*s)) n++; if (!n) return uri; n = strlen(uri) + 2*n; r = t = (char*)soap_malloc(soap, n + 1); if (r) { for (s = uri; *s; s++) { if (URI_CHAR(*s)) { *t++ = *s; } else { (SOAP_SNPRINTF(t, n + 1 - (t - r), 3), "%%%2.2x", *s); t += 3; } } *t = '\0'; } return r; } static bool imported(const char *tag) { if (!tag || *tag != '"') return false; for (SetOfString::const_iterator u = exturis.begin(); u != exturis.end(); ++u) { size_t n = strlen(*u); if (!strncmp(*u, tag + 1, n) && tag[n+1] == '"') return true; } return false; } static void comment(const char *start, const char *middle, const char *end, const char *text) { if (text) { if (strchr(text, '\r') || strchr(text, '\n')) fprintf(stream, "\n/** %s %s %s documentation:\n%s\n*/\n\n", start, middle, end, text); else fprintf(stream, "\n/// %s %s %s: %s\n", start, middle, end, text); } } static void page(const char *page, const char *title, const char *text) { if (text) fprintf(stream, "@page %s%s \"%s\"\n", page, title, text); else fprintf(stream, "@page %s%s\n", page, title); } static void section(const char *section, const char *title, const char *text) { if (text) fprintf(stream, "\n@section %s%s \"%s\"\n", section, title, text); else fprintf(stream, "\n@section %s%s\n", section, title); } static void banner(const char *text1, const char *text2) { int i; if (!text1) return; fprintf(stream, "\n/"); for (i = 0; i < 78; i++) fputc('*', stream); if (text2) fprintf(stream, "\\\n *%76s*\n * %-75s*\n * %-73s*\n *%76s*\n\\", "", text1, text2, ""); else fprintf(stream, "\\\n *%76s*\n * %-75s*\n *%76s*\n\\", "", text1, ""); for (i = 0; i < 78; i++) fputc('*', stream); fprintf(stream, "/\n\n"); if (vflag) fprintf(stderr, "\n----<< %s: %s >>----\n\n", text1, text2 ? text2 : ""); } static void ident() { time_t t = time(NULL), *p = &t; char tmp[256]; int i; strftime(tmp, 256, "%Y-%m-%d %H:%M:%S GMT", gmtime(p)); fprintf(stream, "/* %s\n Generated by wsdl2h " WSDL2H_VERSION " from ", outfile ? outfile : ""); if (infiles) { for (i = 0; i < infiles; i++) fprintf(stream, "%s ", infile[i]); } else fprintf(stream, "(stdin) "); fprintf(stream, "and %s\n\ %s\n\n\ DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS\n\ USE THE soapcpp2-GENERATED SOURCE CODE FILES FOR YOUR PROJECT BUILDS\n\n\ gSOAP XML Web services tools\n\ Copyright (C) 2000-2018, Robert van Engelen, Genivia Inc. All Rights Reserved.\n\ This program is released under the GPL with the additional exemption that\n\ compiling, linking, and/or using OpenSSL is allowed.\n\ --------------------------------------------------------------------------------\n\ A commercial use license is available from Genivia Inc., contact@genivia.com\n\ --------------------------------------------------------------------------------\n\ */\n\n", mapfile, tmp); } void text(const char *text) { const char *s; if (!text) return; size_t k = 0; for (s = text; *s; s++, k++) { switch (*s) { case '\n': if (k) { fputc('\n', stream); k = 0; } break; case '\t': k = 8 * ((k + 8) / 8) - 1; fputc('\t', stream); break; case '/': fputc(*s, stream); if (s[1] == '*') fputc(' ', stream); break; case '*': fputc(*s, stream); if (s[1] == '/') fputc(' ', stream); break; case ' ': if (k >= 79) { fputc('\n', stream); k = 0; } else fputc(' ', stream); break; default: if (*s >= 32) fputc(*s, stream); } } if (k) fputc('\n', stream); } //////////////////////////////////////////////////////////////////////////////// // // WS-Policy // //////////////////////////////////////////////////////////////////////////////// static void gen_policy(Service& service, const std::vector& policy, const char *text, Types& types) { if (!policy.empty()) { fprintf(stream, "\n - WS-Policy applicable to the %s:\n", text); for (std::vector::const_iterator p = policy.begin(); p != policy.end(); ++p) if (*p) (*p)->generate(service, types, 0); } } static void gen_policy_enablers(const Service& service) { fprintf(stream, "\n/** "); page(service.name, " Binding", service.name); section(service.name, "_policy_enablers Policy Enablers of Binding", service.name); if (service.imports.empty()) { fprintf(stream, "\nNone specified.\n\n*/\n"); return; } fprintf(stream, "\nBased on policies and protocol requirements, this service requires importing"); for (VectorOfString::const_iterator i = service.imports.begin(); i != service.imports.end(); ++i) fprintf(stream, " \"%s\"", *i); fprintf(stream, "\n\n - WS-Policy reminders and enablers (when applicable):\n"); fprintf(stream, " - WS-Addressing 1.0 (2005/08, accepts 2004/08):\n\t@code\n\t#import \"wsa5.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsaapi.h\"\n\tsoap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code\n\t// See the user guide gsoap/doc/wsa/html/index.html\n\t@endcode\n"); fprintf(stream, " - WS-Addressing (2004/08):\n\t@code\n\t#import \"wsa.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsaapi.h\"\n\tsoap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code\n\t// See the user guide gsoap/doc/wsa/html/index.html\n\t@endcode\n"); fprintf(stream, " - WS-ReliableMessaging 1.0:\n\t@code\n\t#import \"wsrm5.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsrmapi.h\"\n\tsoap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code\n\tsoap_register_plugin(soap, soap_wsrm); // register the wsrm plugin in your code\n\t// See the user guide gsoap/doc/wsrm/html/index.html\n\t@endcode\n"); fprintf(stream, " - WS-ReliableMessaging 1.1:\n\t@code\n\t#import \"wsrm.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsrmapi.h\"\n\tsoap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code\n\tsoap_register_plugin(soap, soap_wsrm); // register the wsrm plugin in your code\n\t// See the user guide gsoap/doc/wsrm/html/index.html\n\t@endcode\n"); fprintf(stream, " - WS-Discovery 1.0:\n\t@code\n\t#import \"wsrm5.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsddapi.h\" // See the user guide gsoap/doc/wsdd/html/index.html\n\t@endcode\n"); fprintf(stream, " - WS-Discovery 1.1:\n\t@code\n\t#import \"wsrm.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsddapi.h\" // See the user guide gsoap/doc/wsdd/html/index.html\n\t@endcode\n"); fprintf(stream, " - WS-Security (SOAP Message Security) 1.0 (accepts 1.1):\n\t@code\n\t#import \"wsse.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_register_plugin(soap, soap_wsse); // register the wsse plugin in your code\n\t// See the user guide gsoap/doc/wsse/html/index.html\n\t@endcode\n"); fprintf(stream, " - WS-Security (SOAP Message Security) 1.1 (accepts 1.0):\n\t@code\n\t#import \"wsse11.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_register_plugin(soap, soap_wsse); // register the wsse plugin in your code\n\t// See the user guide gsoap/doc/wsse/html/index.html\n\t@endcode\n"); fprintf(stream, " - HTTP Digest Authentication:\n\t@code\n\t#include \"plugin/httpda.h\"\n\tsoap_register_plugin(soap, soap_http_da); // register the HTTP DA plugin in your code\n\t// See the user guide gsoap/doc/httpda/html/index.html\n\t@endcode\n"); fprintf(stream, "*/\n\n"); for (VectorOfString::const_iterator i = service.imports.begin(); i != service.imports.end(); ++i) fprintf(stream, "#import \"%s\"\n", *i); } //////////////////////////////////////////////////////////////////////////////// // // BPEL 2.0 // //////////////////////////////////////////////////////////////////////////////// static void gen_plnk(const Service& service) { if (!service.role.empty()) { for (std::vector::const_iterator r = service.role.begin(); r != service.role.end(); ++r) { if (*r && (*r)->portTypePtr() && (*r)->plnkPtr()) { fprintf(stream, "\n - \"%s\" role \"%s\" port type \"%s\" operations.\n", (*r)->plnkPtr()->name, (*r)->portTypePtr()->name, (*r)->name); text((*r)->documentation); text((*r)->plnkPtr()->documentation); } } } } static void gen_vprop(const wsdl__definitions& definitions, Types& types) { if (!definitions.vprop__property.empty()) { banner("BPEL 2.0 Variables"); fprintf(stream, "/** "); page("page_bpel", " BPEL 2.0 Variables", NULL); for (std::vector::const_iterator i1 = definitions.vprop__property.begin(); i1 != definitions.vprop__property.end(); ++i1) { if ((*i1).name) { fprintf(stream, "\nBPEL 2.0 Variable \"%s\"\n", (*i1).name); text((*i1).documentation); fprintf(stream, "\n"); for (std::vector::const_iterator j = definitions.vprop__propertyAlias.begin(); j != definitions.vprop__propertyAlias.end(); ++j) { if ((*j).vpropPtr() == &(*i1) && (*j).query && (*j).query->__mixed) { if ((*j).messageType) { if ((*j).type) fprintf(stream, " - Variable property alias for message %s/%s of type %s.\n", (*j).messageType, (*j).part, (*j).type); else if ((*j).element) fprintf(stream, " - Variable property alias for message %s/%s element %s.\n", (*j).messageType, (*j).part, (*j).element); } else fprintf(stream, " - Variable property alias.\n"); text((*j).documentation); if ((*j).type) fprintf(stream, " XPath %s: %s\n", types.tname(NULL, NULL, (*j).type), (*j).query->__mixed); else if ((*j).element) fprintf(stream, " XPath %s: %s\n", types.tname(NULL, NULL, (*j).element), (*j).query->__mixed); } } } } fprintf(stream, "*/\n\n"); for (std::vector::const_iterator i2 = definitions.vprop__property.begin(); i2 != definitions.vprop__property.end(); ++i2) { if ((*i2).name) { for (std::vector::const_iterator j = definitions.vprop__propertyAlias.begin(); j != definitions.vprop__propertyAlias.end(); ++j) { if ((*j).vpropPtr() == &(*i2) && (*j).query && (*j).query->__mixed) { if ((*j).type) fprintf(stream, "//xpath %s %s\n", types.tname(NULL, NULL, (*j).type), (*j).query->__mixed); else if ((*j).element) fprintf(stream, "//xpath %s %s\n", types.tname(NULL, NULL, (*j).element), (*j).query->__mixed); } } if ((*i2).type) fprintf(stream, elementformat, types.tname(NULL, NULL, (*i2).type), types.aname(NULL, NULL, (*i2).name)); else if ((*i2).element) fprintf(stream, elementformat, types.tname(NULL, NULL, (*i2).element), types.aname(NULL, NULL, (*i2).name)); fprintf(stream, ";\n"); } } fprintf(stream, "\n"); } } gsoap-2.8.91/gsoap/wsdl/Makefile.in0000644000175000017500000013736513525245163016440 0ustar ellertellert# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ ####### This is the input file for automake, which will generate Makefile.in ########## VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = wsdl2h$(EXEEXT) @WITH_OPENSSL_TRUE@am__append_1 = $(top_srcdir)/gsoap/plugin/httpda.c $(top_srcdir)/gsoap/plugin/smdevp.c @WITH_OPENSSL_TRUE@am__append_2 = -lpthread subdir = gsoap/wsdl ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am__wsdl2h_SOURCES_DIST = wsdl2h.cpp wsdl.cpp wadl.cpp schema.cpp \ types.cpp service.cpp soap.cpp mime.cpp wsp.cpp bpel.cpp \ wsdlC.cpp $(top_srcdir)/gsoap/plugin/httpda.c \ $(top_srcdir)/gsoap/plugin/smdevp.c am__objects_1 = wsdl2h-wsdlC.$(OBJEXT) @WITH_OPENSSL_TRUE@am__objects_2 = wsdl2h-httpda.$(OBJEXT) \ @WITH_OPENSSL_TRUE@ wsdl2h-smdevp.$(OBJEXT) am_wsdl2h_OBJECTS = wsdl2h-wsdl2h.$(OBJEXT) wsdl2h-wsdl.$(OBJEXT) \ wsdl2h-wadl.$(OBJEXT) wsdl2h-schema.$(OBJEXT) \ wsdl2h-types.$(OBJEXT) wsdl2h-service.$(OBJEXT) \ wsdl2h-soap.$(OBJEXT) wsdl2h-mime.$(OBJEXT) \ wsdl2h-wsp.$(OBJEXT) wsdl2h-bpel.$(OBJEXT) $(am__objects_1) \ $(am__objects_2) wsdl2h_OBJECTS = $(am_wsdl2h_OBJECTS) am__DEPENDENCIES_1 = wsdl2h_DEPENDENCIES = $(SOAP_CPP_LIB) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) wsdl2h_LINK = $(CXXLD) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/wsdl2h-bpel.Po \ ./$(DEPDIR)/wsdl2h-httpda.Po ./$(DEPDIR)/wsdl2h-mime.Po \ ./$(DEPDIR)/wsdl2h-schema.Po ./$(DEPDIR)/wsdl2h-service.Po \ ./$(DEPDIR)/wsdl2h-smdevp.Po ./$(DEPDIR)/wsdl2h-soap.Po \ ./$(DEPDIR)/wsdl2h-types.Po ./$(DEPDIR)/wsdl2h-wadl.Po \ ./$(DEPDIR)/wsdl2h-wsdl.Po ./$(DEPDIR)/wsdl2h-wsdl2h.Po \ ./$(DEPDIR)/wsdl2h-wsdlC.Po ./$(DEPDIR)/wsdl2h-wsp.Po am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(wsdl2h_SOURCES) DIST_SOURCES = $(am__wsdl2h_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BISON_DEFINE = @BISON_DEFINE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_SAMPLES = @ENABLE_SAMPLES@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_DEFINE = @LEX_DEFINE@ LEX_FLAGS = @LEX_FLAGS@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SAMPLE_DIRS = @SAMPLE_DIRS@ SAMPLE_EXTRA_LIBS = @SAMPLE_EXTRA_LIBS@ SAMPLE_INCLUDES = @SAMPLE_INCLUDES@ SAMPLE_SSL_LIBS = @SAMPLE_SSL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOAPCPP2_DEBUG = @SOAPCPP2_DEBUG@ SOAPCPP2_IMPORTPATH = @SOAPCPP2_IMPORTPATH@ SOAPCPP2_INCLUDE_XLOCALE = @SOAPCPP2_INCLUDE_XLOCALE@ SOAPCPP2_IPV6 = @SOAPCPP2_IPV6@ SOAPCPP2_IPV6_V6ONLY = @SOAPCPP2_IPV6_V6ONLY@ SOAPCPP2_NONAMESPACES = @SOAPCPP2_NONAMESPACES@ SOAPCPP2_NO_C_LOCALE = @SOAPCPP2_NO_C_LOCALE@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_OPENSSL = @WITH_OPENSSL@ WSDL2H_EXTRA_FLAGS = @WSDL2H_EXTRA_FLAGS@ WSDL2H_EXTRA_LIBS = @WSDL2H_EXTRA_LIBS@ WSDL2H_IMPORTPATH = @WSDL2H_IMPORTPATH@ WSDL2H_SOAP_CPP_LIB = @WSDL2H_SOAP_CPP_LIB@ YACC = @YACC@ YACC_LIB = @YACC_LIB@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign 1.4 # INCLUDES=-I$(top_srcdir)/gsoap # AM_LDFLAGS=$(INCLUDES) -I$(top_srcdir)/gsoap/wsdl -L$(top_srcdir)/gsoap/wsdl AM_LDFLAGS = -L$(top_srcdir)/gsoap/wsdl -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin AM_CPPFLAGS = -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin SOAP = $(top_builddir)/gsoap/src/soapcpp2$(EXEEXT) SOAP_CPP_LIB = $(top_builddir)/gsoap/$(WSDL2H_SOAP_CPP_LIB) SOAP_CPP_SRC = wsdlC.cpp SOAPHEADER = $(top_srcdir)/gsoap/wsdl/wsdl.h SOAP_FLAGS = -SC -pwsdl -I$(top_srcdir)/gsoap/wsdl -I$(top_srcdir)/gsoap/import BUILT_SOURCES = $(SOAP_CPP_SRC) wsdl2h_CFLAGS = $(C_DEBUG_FLAGS) $(SOAPCPP2_INCLUDE_XLOCALE) $(SOAPCPP2_NO_C_LOCALE) $(WSDL2H_EXTRA_FLAGS) wsdl2h_CXXFLAGS = $(C_DEBUG_FLAGS) $(SOAPCPP2_INCLUDE_XLOCALE) $(SOAPCPP2_NO_C_LOCALE) $(WSDL2H_EXTRA_FLAGS) $(WSDL2H_IMPORTPATH) wsdl2h_CPPFLAGS = $(AM_CPPFLAGS) $(SOAPCPP2_NONAMESPACES) -D$(platform) wsdl2h_SOURCES = wsdl2h.cpp wsdl.cpp wadl.cpp schema.cpp types.cpp \ service.cpp soap.cpp mime.cpp wsp.cpp bpel.cpp $(SOAP_CPP_SRC) \ $(am__append_1) wsdl2h_LDADD = $(SOAP_CPP_LIB) $(WSDL2H_EXTRA_LIBS) $(am__append_2) CLEANFILES = *~ *C.cpp *H.h *Stub.h *.nsmap all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gsoap/wsdl/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign gsoap/wsdl/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) wsdl2h$(EXEEXT): $(wsdl2h_OBJECTS) $(wsdl2h_DEPENDENCIES) $(EXTRA_wsdl2h_DEPENDENCIES) @rm -f wsdl2h$(EXEEXT) $(AM_V_CXXLD)$(wsdl2h_LINK) $(wsdl2h_OBJECTS) $(wsdl2h_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsdl2h-bpel.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsdl2h-httpda.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsdl2h-mime.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsdl2h-schema.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsdl2h-service.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsdl2h-smdevp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsdl2h-soap.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsdl2h-types.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsdl2h-wadl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsdl2h-wsdl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsdl2h-wsdl2h.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsdl2h-wsdlC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wsdl2h-wsp.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` wsdl2h-httpda.o: $(top_srcdir)/gsoap/plugin/httpda.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CFLAGS) $(CFLAGS) -MT wsdl2h-httpda.o -MD -MP -MF $(DEPDIR)/wsdl2h-httpda.Tpo -c -o wsdl2h-httpda.o `test -f '$(top_srcdir)/gsoap/plugin/httpda.c' || echo '$(srcdir)/'`$(top_srcdir)/gsoap/plugin/httpda.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-httpda.Tpo $(DEPDIR)/wsdl2h-httpda.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(top_srcdir)/gsoap/plugin/httpda.c' object='wsdl2h-httpda.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CFLAGS) $(CFLAGS) -c -o wsdl2h-httpda.o `test -f '$(top_srcdir)/gsoap/plugin/httpda.c' || echo '$(srcdir)/'`$(top_srcdir)/gsoap/plugin/httpda.c wsdl2h-httpda.obj: $(top_srcdir)/gsoap/plugin/httpda.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CFLAGS) $(CFLAGS) -MT wsdl2h-httpda.obj -MD -MP -MF $(DEPDIR)/wsdl2h-httpda.Tpo -c -o wsdl2h-httpda.obj `if test -f '$(top_srcdir)/gsoap/plugin/httpda.c'; then $(CYGPATH_W) '$(top_srcdir)/gsoap/plugin/httpda.c'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/gsoap/plugin/httpda.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-httpda.Tpo $(DEPDIR)/wsdl2h-httpda.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(top_srcdir)/gsoap/plugin/httpda.c' object='wsdl2h-httpda.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CFLAGS) $(CFLAGS) -c -o wsdl2h-httpda.obj `if test -f '$(top_srcdir)/gsoap/plugin/httpda.c'; then $(CYGPATH_W) '$(top_srcdir)/gsoap/plugin/httpda.c'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/gsoap/plugin/httpda.c'; fi` wsdl2h-smdevp.o: $(top_srcdir)/gsoap/plugin/smdevp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CFLAGS) $(CFLAGS) -MT wsdl2h-smdevp.o -MD -MP -MF $(DEPDIR)/wsdl2h-smdevp.Tpo -c -o wsdl2h-smdevp.o `test -f '$(top_srcdir)/gsoap/plugin/smdevp.c' || echo '$(srcdir)/'`$(top_srcdir)/gsoap/plugin/smdevp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-smdevp.Tpo $(DEPDIR)/wsdl2h-smdevp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(top_srcdir)/gsoap/plugin/smdevp.c' object='wsdl2h-smdevp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CFLAGS) $(CFLAGS) -c -o wsdl2h-smdevp.o `test -f '$(top_srcdir)/gsoap/plugin/smdevp.c' || echo '$(srcdir)/'`$(top_srcdir)/gsoap/plugin/smdevp.c wsdl2h-smdevp.obj: $(top_srcdir)/gsoap/plugin/smdevp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CFLAGS) $(CFLAGS) -MT wsdl2h-smdevp.obj -MD -MP -MF $(DEPDIR)/wsdl2h-smdevp.Tpo -c -o wsdl2h-smdevp.obj `if test -f '$(top_srcdir)/gsoap/plugin/smdevp.c'; then $(CYGPATH_W) '$(top_srcdir)/gsoap/plugin/smdevp.c'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/gsoap/plugin/smdevp.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-smdevp.Tpo $(DEPDIR)/wsdl2h-smdevp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(top_srcdir)/gsoap/plugin/smdevp.c' object='wsdl2h-smdevp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CFLAGS) $(CFLAGS) -c -o wsdl2h-smdevp.obj `if test -f '$(top_srcdir)/gsoap/plugin/smdevp.c'; then $(CYGPATH_W) '$(top_srcdir)/gsoap/plugin/smdevp.c'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/gsoap/plugin/smdevp.c'; fi` .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` wsdl2h-wsdl2h.o: wsdl2h.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-wsdl2h.o -MD -MP -MF $(DEPDIR)/wsdl2h-wsdl2h.Tpo -c -o wsdl2h-wsdl2h.o `test -f 'wsdl2h.cpp' || echo '$(srcdir)/'`wsdl2h.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-wsdl2h.Tpo $(DEPDIR)/wsdl2h-wsdl2h.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wsdl2h.cpp' object='wsdl2h-wsdl2h.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-wsdl2h.o `test -f 'wsdl2h.cpp' || echo '$(srcdir)/'`wsdl2h.cpp wsdl2h-wsdl2h.obj: wsdl2h.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-wsdl2h.obj -MD -MP -MF $(DEPDIR)/wsdl2h-wsdl2h.Tpo -c -o wsdl2h-wsdl2h.obj `if test -f 'wsdl2h.cpp'; then $(CYGPATH_W) 'wsdl2h.cpp'; else $(CYGPATH_W) '$(srcdir)/wsdl2h.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-wsdl2h.Tpo $(DEPDIR)/wsdl2h-wsdl2h.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wsdl2h.cpp' object='wsdl2h-wsdl2h.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-wsdl2h.obj `if test -f 'wsdl2h.cpp'; then $(CYGPATH_W) 'wsdl2h.cpp'; else $(CYGPATH_W) '$(srcdir)/wsdl2h.cpp'; fi` wsdl2h-wsdl.o: wsdl.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-wsdl.o -MD -MP -MF $(DEPDIR)/wsdl2h-wsdl.Tpo -c -o wsdl2h-wsdl.o `test -f 'wsdl.cpp' || echo '$(srcdir)/'`wsdl.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-wsdl.Tpo $(DEPDIR)/wsdl2h-wsdl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wsdl.cpp' object='wsdl2h-wsdl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-wsdl.o `test -f 'wsdl.cpp' || echo '$(srcdir)/'`wsdl.cpp wsdl2h-wsdl.obj: wsdl.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-wsdl.obj -MD -MP -MF $(DEPDIR)/wsdl2h-wsdl.Tpo -c -o wsdl2h-wsdl.obj `if test -f 'wsdl.cpp'; then $(CYGPATH_W) 'wsdl.cpp'; else $(CYGPATH_W) '$(srcdir)/wsdl.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-wsdl.Tpo $(DEPDIR)/wsdl2h-wsdl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wsdl.cpp' object='wsdl2h-wsdl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-wsdl.obj `if test -f 'wsdl.cpp'; then $(CYGPATH_W) 'wsdl.cpp'; else $(CYGPATH_W) '$(srcdir)/wsdl.cpp'; fi` wsdl2h-wadl.o: wadl.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-wadl.o -MD -MP -MF $(DEPDIR)/wsdl2h-wadl.Tpo -c -o wsdl2h-wadl.o `test -f 'wadl.cpp' || echo '$(srcdir)/'`wadl.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-wadl.Tpo $(DEPDIR)/wsdl2h-wadl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wadl.cpp' object='wsdl2h-wadl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-wadl.o `test -f 'wadl.cpp' || echo '$(srcdir)/'`wadl.cpp wsdl2h-wadl.obj: wadl.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-wadl.obj -MD -MP -MF $(DEPDIR)/wsdl2h-wadl.Tpo -c -o wsdl2h-wadl.obj `if test -f 'wadl.cpp'; then $(CYGPATH_W) 'wadl.cpp'; else $(CYGPATH_W) '$(srcdir)/wadl.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-wadl.Tpo $(DEPDIR)/wsdl2h-wadl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wadl.cpp' object='wsdl2h-wadl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-wadl.obj `if test -f 'wadl.cpp'; then $(CYGPATH_W) 'wadl.cpp'; else $(CYGPATH_W) '$(srcdir)/wadl.cpp'; fi` wsdl2h-schema.o: schema.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-schema.o -MD -MP -MF $(DEPDIR)/wsdl2h-schema.Tpo -c -o wsdl2h-schema.o `test -f 'schema.cpp' || echo '$(srcdir)/'`schema.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-schema.Tpo $(DEPDIR)/wsdl2h-schema.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='schema.cpp' object='wsdl2h-schema.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-schema.o `test -f 'schema.cpp' || echo '$(srcdir)/'`schema.cpp wsdl2h-schema.obj: schema.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-schema.obj -MD -MP -MF $(DEPDIR)/wsdl2h-schema.Tpo -c -o wsdl2h-schema.obj `if test -f 'schema.cpp'; then $(CYGPATH_W) 'schema.cpp'; else $(CYGPATH_W) '$(srcdir)/schema.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-schema.Tpo $(DEPDIR)/wsdl2h-schema.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='schema.cpp' object='wsdl2h-schema.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-schema.obj `if test -f 'schema.cpp'; then $(CYGPATH_W) 'schema.cpp'; else $(CYGPATH_W) '$(srcdir)/schema.cpp'; fi` wsdl2h-types.o: types.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-types.o -MD -MP -MF $(DEPDIR)/wsdl2h-types.Tpo -c -o wsdl2h-types.o `test -f 'types.cpp' || echo '$(srcdir)/'`types.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-types.Tpo $(DEPDIR)/wsdl2h-types.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='types.cpp' object='wsdl2h-types.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-types.o `test -f 'types.cpp' || echo '$(srcdir)/'`types.cpp wsdl2h-types.obj: types.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-types.obj -MD -MP -MF $(DEPDIR)/wsdl2h-types.Tpo -c -o wsdl2h-types.obj `if test -f 'types.cpp'; then $(CYGPATH_W) 'types.cpp'; else $(CYGPATH_W) '$(srcdir)/types.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-types.Tpo $(DEPDIR)/wsdl2h-types.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='types.cpp' object='wsdl2h-types.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-types.obj `if test -f 'types.cpp'; then $(CYGPATH_W) 'types.cpp'; else $(CYGPATH_W) '$(srcdir)/types.cpp'; fi` wsdl2h-service.o: service.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-service.o -MD -MP -MF $(DEPDIR)/wsdl2h-service.Tpo -c -o wsdl2h-service.o `test -f 'service.cpp' || echo '$(srcdir)/'`service.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-service.Tpo $(DEPDIR)/wsdl2h-service.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='service.cpp' object='wsdl2h-service.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-service.o `test -f 'service.cpp' || echo '$(srcdir)/'`service.cpp wsdl2h-service.obj: service.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-service.obj -MD -MP -MF $(DEPDIR)/wsdl2h-service.Tpo -c -o wsdl2h-service.obj `if test -f 'service.cpp'; then $(CYGPATH_W) 'service.cpp'; else $(CYGPATH_W) '$(srcdir)/service.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-service.Tpo $(DEPDIR)/wsdl2h-service.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='service.cpp' object='wsdl2h-service.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-service.obj `if test -f 'service.cpp'; then $(CYGPATH_W) 'service.cpp'; else $(CYGPATH_W) '$(srcdir)/service.cpp'; fi` wsdl2h-soap.o: soap.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-soap.o -MD -MP -MF $(DEPDIR)/wsdl2h-soap.Tpo -c -o wsdl2h-soap.o `test -f 'soap.cpp' || echo '$(srcdir)/'`soap.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-soap.Tpo $(DEPDIR)/wsdl2h-soap.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soap.cpp' object='wsdl2h-soap.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-soap.o `test -f 'soap.cpp' || echo '$(srcdir)/'`soap.cpp wsdl2h-soap.obj: soap.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-soap.obj -MD -MP -MF $(DEPDIR)/wsdl2h-soap.Tpo -c -o wsdl2h-soap.obj `if test -f 'soap.cpp'; then $(CYGPATH_W) 'soap.cpp'; else $(CYGPATH_W) '$(srcdir)/soap.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-soap.Tpo $(DEPDIR)/wsdl2h-soap.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soap.cpp' object='wsdl2h-soap.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-soap.obj `if test -f 'soap.cpp'; then $(CYGPATH_W) 'soap.cpp'; else $(CYGPATH_W) '$(srcdir)/soap.cpp'; fi` wsdl2h-mime.o: mime.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-mime.o -MD -MP -MF $(DEPDIR)/wsdl2h-mime.Tpo -c -o wsdl2h-mime.o `test -f 'mime.cpp' || echo '$(srcdir)/'`mime.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-mime.Tpo $(DEPDIR)/wsdl2h-mime.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mime.cpp' object='wsdl2h-mime.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-mime.o `test -f 'mime.cpp' || echo '$(srcdir)/'`mime.cpp wsdl2h-mime.obj: mime.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-mime.obj -MD -MP -MF $(DEPDIR)/wsdl2h-mime.Tpo -c -o wsdl2h-mime.obj `if test -f 'mime.cpp'; then $(CYGPATH_W) 'mime.cpp'; else $(CYGPATH_W) '$(srcdir)/mime.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-mime.Tpo $(DEPDIR)/wsdl2h-mime.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mime.cpp' object='wsdl2h-mime.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-mime.obj `if test -f 'mime.cpp'; then $(CYGPATH_W) 'mime.cpp'; else $(CYGPATH_W) '$(srcdir)/mime.cpp'; fi` wsdl2h-wsp.o: wsp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-wsp.o -MD -MP -MF $(DEPDIR)/wsdl2h-wsp.Tpo -c -o wsdl2h-wsp.o `test -f 'wsp.cpp' || echo '$(srcdir)/'`wsp.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-wsp.Tpo $(DEPDIR)/wsdl2h-wsp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wsp.cpp' object='wsdl2h-wsp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-wsp.o `test -f 'wsp.cpp' || echo '$(srcdir)/'`wsp.cpp wsdl2h-wsp.obj: wsp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-wsp.obj -MD -MP -MF $(DEPDIR)/wsdl2h-wsp.Tpo -c -o wsdl2h-wsp.obj `if test -f 'wsp.cpp'; then $(CYGPATH_W) 'wsp.cpp'; else $(CYGPATH_W) '$(srcdir)/wsp.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-wsp.Tpo $(DEPDIR)/wsdl2h-wsp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wsp.cpp' object='wsdl2h-wsp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-wsp.obj `if test -f 'wsp.cpp'; then $(CYGPATH_W) 'wsp.cpp'; else $(CYGPATH_W) '$(srcdir)/wsp.cpp'; fi` wsdl2h-bpel.o: bpel.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-bpel.o -MD -MP -MF $(DEPDIR)/wsdl2h-bpel.Tpo -c -o wsdl2h-bpel.o `test -f 'bpel.cpp' || echo '$(srcdir)/'`bpel.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-bpel.Tpo $(DEPDIR)/wsdl2h-bpel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='bpel.cpp' object='wsdl2h-bpel.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-bpel.o `test -f 'bpel.cpp' || echo '$(srcdir)/'`bpel.cpp wsdl2h-bpel.obj: bpel.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-bpel.obj -MD -MP -MF $(DEPDIR)/wsdl2h-bpel.Tpo -c -o wsdl2h-bpel.obj `if test -f 'bpel.cpp'; then $(CYGPATH_W) 'bpel.cpp'; else $(CYGPATH_W) '$(srcdir)/bpel.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-bpel.Tpo $(DEPDIR)/wsdl2h-bpel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='bpel.cpp' object='wsdl2h-bpel.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-bpel.obj `if test -f 'bpel.cpp'; then $(CYGPATH_W) 'bpel.cpp'; else $(CYGPATH_W) '$(srcdir)/bpel.cpp'; fi` wsdl2h-wsdlC.o: wsdlC.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-wsdlC.o -MD -MP -MF $(DEPDIR)/wsdl2h-wsdlC.Tpo -c -o wsdl2h-wsdlC.o `test -f 'wsdlC.cpp' || echo '$(srcdir)/'`wsdlC.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-wsdlC.Tpo $(DEPDIR)/wsdl2h-wsdlC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wsdlC.cpp' object='wsdl2h-wsdlC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-wsdlC.o `test -f 'wsdlC.cpp' || echo '$(srcdir)/'`wsdlC.cpp wsdl2h-wsdlC.obj: wsdlC.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -MT wsdl2h-wsdlC.obj -MD -MP -MF $(DEPDIR)/wsdl2h-wsdlC.Tpo -c -o wsdl2h-wsdlC.obj `if test -f 'wsdlC.cpp'; then $(CYGPATH_W) 'wsdlC.cpp'; else $(CYGPATH_W) '$(srcdir)/wsdlC.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wsdl2h-wsdlC.Tpo $(DEPDIR)/wsdl2h-wsdlC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wsdlC.cpp' object='wsdl2h-wsdlC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wsdl2h_CPPFLAGS) $(CPPFLAGS) $(wsdl2h_CXXFLAGS) $(CXXFLAGS) -c -o wsdl2h-wsdlC.obj `if test -f 'wsdlC.cpp'; then $(CYGPATH_W) 'wsdlC.cpp'; else $(CYGPATH_W) '$(srcdir)/wsdlC.cpp'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/wsdl2h-bpel.Po -rm -f ./$(DEPDIR)/wsdl2h-httpda.Po -rm -f ./$(DEPDIR)/wsdl2h-mime.Po -rm -f ./$(DEPDIR)/wsdl2h-schema.Po -rm -f ./$(DEPDIR)/wsdl2h-service.Po -rm -f ./$(DEPDIR)/wsdl2h-smdevp.Po -rm -f ./$(DEPDIR)/wsdl2h-soap.Po -rm -f ./$(DEPDIR)/wsdl2h-types.Po -rm -f ./$(DEPDIR)/wsdl2h-wadl.Po -rm -f ./$(DEPDIR)/wsdl2h-wsdl.Po -rm -f ./$(DEPDIR)/wsdl2h-wsdl2h.Po -rm -f ./$(DEPDIR)/wsdl2h-wsdlC.Po -rm -f ./$(DEPDIR)/wsdl2h-wsp.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/wsdl2h-bpel.Po -rm -f ./$(DEPDIR)/wsdl2h-httpda.Po -rm -f ./$(DEPDIR)/wsdl2h-mime.Po -rm -f ./$(DEPDIR)/wsdl2h-schema.Po -rm -f ./$(DEPDIR)/wsdl2h-service.Po -rm -f ./$(DEPDIR)/wsdl2h-smdevp.Po -rm -f ./$(DEPDIR)/wsdl2h-soap.Po -rm -f ./$(DEPDIR)/wsdl2h-types.Po -rm -f ./$(DEPDIR)/wsdl2h-wadl.Po -rm -f ./$(DEPDIR)/wsdl2h-wsdl.Po -rm -f ./$(DEPDIR)/wsdl2h-wsdl2h.Po -rm -f ./$(DEPDIR)/wsdl2h-wsdlC.Po -rm -f ./$(DEPDIR)/wsdl2h-wsp.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-binPROGRAMS clean-generic cscopelist-am ctags ctags-am \ distclean distclean-compile distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-binPROGRAMS install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS .PRECIOUS: Makefile # WSDL2H_EXTRA_FLAGS=-DWITH_OPENSSL -DWITH_GZIP # defined in configure.in # WSDL2H_EXTRA_LIBS=-lssl -lcrypto -lz # defined in configure.in $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) $(SOAP_FLAGS) $(SOAPHEADER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsoap-2.8.91/gsoap/wsdl/wsrmp.h0000644000175000017500000000516613525245163015705 0ustar ellertellert/* wsrmp.h WS-ReliableMessaging Policy -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap wsrmp schema documentation: WS-ReliableMessaging Policy binding //gsoap wsrmp schema namespace: http://docs.oasis-open.org/ws-rx/wsrm/200702 //gsoap wsrmp schema elementForm: qualified //gsoap wsrmp schema attributeForm: unqualified //gsoap wsrmp5 schema documentation: WS-ReliableMessaging Policy binding //gsoap wsrmp5 schema namespace: http://schemas.xmlsoap.org/ws/2005/02/rm/policy //gsoap wsrmp5 schema elementForm: qualified //gsoap wsrmp5 schema attributeForm: unqualified #import "imports.h" class wsrmp__Timeout { public: @char *Milliseconds; }; class wsrmp__RMAssertion : public wsp__Assertion { public: wsrmp__Timeout *InactivityTimeout; wsrmp__Timeout *BaseRetransmissionInterval; wsrmp__Timeout *AcknowledgementInterval; char *ExponentialBackoff; // TODO: WCF netrmp extension elements go here, as necessary }; class wsrmp5__Timeout { public: @char *Milliseconds; }; class wsrmp5__RMAssertion : public wsp__Assertion { public: wsrmp5__Timeout *InactivityTimeout; wsrmp5__Timeout *BaseRetransmissionInterval; wsrmp5__Timeout *AcknowledgementInterval; char *ExponentialBackoff; // TODO: WCF netrmp extension elements go here, as necessary }; gsoap-2.8.91/gsoap/wsdl/wst.h0000644000175000017500000000323213525245163015342 0ustar ellertellert/* wst.h WS-Trust -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap wst schema documentation: WS-Trust //gsoap wst schema namespace: http://docs.oasis-open.org/ws-sx/ws-trust/200512 //gsoap wst schema elementForm: qualified //gsoap wst schema attributeForm: unqualified class wst__Claims { public: @xsd__string Dialect; xsd__string __item; }; gsoap-2.8.91/gsoap/wsdl/build.bat0000644000175000017500000000103113525245163016136 0ustar ellertellertREM Copying stdsoap2.h and stdsoap2.cpp to source dir COPY /B ..\stdsoap2.h . COPY /B ..\stdsoap2.cpp . ..\..\soapcpp2\Release\soapcpp2.exe -I../import -SC -pwsdl wsdl.h REM You need these header files to compile: REM stdsoap2.h REM include.h REM service.h REM types.h REM wsdlH.h REM wsdlStub.h REM You need these source code files to compile: REM stdsoap2.cpp REM bpel.cpp REM mime.cpp REM schema.cpp REM service.cpp REM soap.cpp REM types.cpp REM wadl.cpp REM wsdl.cpp REM wsdl2h.cpp REM wsp.cpp REM wsdlC.cpp gsoap-2.8.91/gsoap/wsdl/typemap.dat0000644000175000017500000006322413525245163016534 0ustar ellertellert# typemap.dat # Use this file to define XML namespace prefixes and type bindings for # interface header files generated by the wsdl2h tool. # # This typemap.dat file is the default file used by wsdl2h to customize # its output. You can use wsdl2h option -t to specify an alternate file. ####### XML NAMESPACE BINDINGS # You can define XML namespace prefix bindings to override the default # choice of the ns1, ns2, ... prefixes generated by wsdl2h. It is highly # recommended to provide namespace prefixes for your project's XML # namespaces. In this way, changes to the WSDL (or newer releases of # wsdl2h) will have a minimal impact on coding and project maintenance. # # Bindings for namespace prefixes are of the form: # # prefix = "URI" # # For example, to bind prefix s3 to the AWS S3 namespace: # # s3 = "http://s3.amazonaws.com/doc/2006-03-01/" ####### XSD TYPE BINDINGS # Type bindings can be provided to bind XML schema types to C/C++ # types for your project. # # Type bindings are of the form: # # prefix__type = declaration | use | ptr-use # # where 'prefix__type' is the C/C++-translation of the schema type, # 'declaration' introduces the type in the header file, the optional # 'use' specifies how the type is used directly, and the optional # 'ptr-use' specifies how the type is used as a pointer type. # # For example, to use wide strings in C: # # xsd__string = | wchar_t* | wchar_t* # # this replaces the default char* mapping in C for xsd:string. # To use C++ std::wstring for xsd:string: # # xsd__string = | std::wstring # # After enabling one of these lines, all XSD strings will be changed in # the interface file generated by wsdl2h. Rerun wsdl2h if necessary. # Note that the 'declaration' part above is empta,y as expected. # # When a type binding requires only the usage to be changed and the # declaration part must be kept intact, then the declaration part should # be specified as an elipsis '...': # # prefix__type = ... | use | ptr-use # # This ensure that the wsdl2h-generated type definition is preserved, # while the use and ptr-use are changed. ####### CLASS/STRUCT MEMBER ADDITIONS # Additional data and function members can be provided to extend a # wsdl2h-generated struct or class. # # Class and struct extensions are of the form: # # prefix__type = $ member-declaration # # For example, to add a constructor and destructor to class myns__record: # # myns__record = $ myns__record(); # myns__record = $ ~myns__record(); ####### TYPE EQUIVALENCES # Type equivalence mappings can be given to replace a type with another: # # prefix__type1 == prefix__type2 # # This replaces 'prefix__type1' by 'prefix__type2' in the wsdl2h output. # # For example: # # SOAP_ENC__boolean == xsd__boolean # # replaces 'SOAP_ENC__boolean' with the C/C++ type information that # corresponds to `xsd__boolean' which is 'bool' for C++. # # Target C/C++ type names (names without prefix) can also be replaced: # # float == double # # which replaces all 'float' with 'double' in the wsdl2h output. Beware # that replacing types may lead to xsi:type mismatches and SOAP # encoding id-ref mismatches when parsing inbound XML messages. However, # this is not a problem when using XML instead of SOAP and when mapping # schema root elements to their types, for example the WCF serialization # root element remappings defined further below. ####### BUILT-IN VARIABLES # The variable '$CONTAINER' defines the container to emit in the # generated declarations, which is std::vector by default. For example, # to change containers to std::list: # # $CONTAINER = std::list # # To remove containers, use wsdl2h option -s (removes std::string also, # you can re-introduce std::string with xsd__string = | std::string). # # The variable '$POINTER' defines the smart pointer to emit in the # generated declarations, replacing '*'. For example: # # $POINTER = std::shared_ptr # # Not all pointers in the generated output are replaced by smart # pointers by wsdl2h, such as pointers as union members and pointers # as struct/class members that point to arrays of values. # # The variable '$SIZE' defines the type of array sizes, which is int by # default. For example, to change array size types to size_t: # # $SIZE = size_t # # Permissible types are int and size_t. This variable does not affect # the size of SOAP-encoded arrays, xsd__hexBinary and xsd__base64Binary # types, which is always int. ####### USER-DEFINED CONTENT # Any other content to be included in the generated header file can be # provided by enclosing it within brackets [ and ]. These brackets MUST # appear at the start of a new line. # # For example, to add an #import directive to the wsdl2h-generated output: # # [ # #import "wsa5.h" # ] #------------------------------------------------------------------------------- #gSOAP XML Web services tools #Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. #This software is released under one of the following two licenses: #GPL or Genivia's license for commercial use. #------------------------------------------------------------------------------- #A commercial use license is available from Genivia, Inc., contact@genivia.com #------------------------------------------------------------------------------- [ // Reminder: Modify typemap.dat to customize the header file generated by wsdl2h ] # Remember: type bindings are given on a single line (use \ to continue # with the next line). Here is an example binding for the XSD int type # that maps to an 'int': # xsd__int = | int # To use regular char* strings instead of std::string, use: # xsd__string = | char* | char* # For char* serialized with xsi:type when using soapcpp2 option -t, use: # xsd__string = typedef char *xsd__string; | xsd__string | xsd__string # The following mapping is internally applied by wsdl2h for C (not C++): # (assuming option -e is used to remove the xsd__boolean__ name prefix) # xsd__boolean = enum xsd__boolean { false_, true_ }; | enum xsd__boolean # Uncomment the line below to use __int128_t for xsd:integer instead of # mapping xsd:integer to string. # Then rerun wsdl2h and also compile and link custom/int128.c # xsd__integer = #import "custom/int128.h" | xsd__integer # # Or if the xsd:integer value range is bounded to int64_t, then: # xsd__integer = typedef LONG64 xsd__integer; # # Also, to enable XSD integer types that are restrictions of xsd:integer # to be mapped to int128 or LONG64, uncomment: # xsd__nonNegativeInteger = typedef xsd__integer xsd__nonNegativeInteger 0 : ; # xsd__nonPositiveInteger = typedef xsd__integer xsd__nonPositiveInteger : 0 ; # xsd__positiveInteger = typedef xsd__integer xsd__positiveInteger 1 : ; # xsd__negativeInteger = typedef xsd__integer xsd__negativeInteger : -1; # Uncomment the line below to use long double for xsd:decimal instead of # mapping xsd:decimal to string. # Then rerun wsdl2h and also compile and link custom/long_double.c. # xsd__decimal = #import "custom/long_double.h" | long double # # Or if your system supports __float128 then you can use: # xsd__decimal = #import "custom/float128.h" | xsd__decimal # # Or if the xsd:decimal value range is bounded to double, then: # xsd__decimal = typedef double xsd__decimal; # Uncomment the line below to use struct tm instead of time_t xsd:dateTime # Then rerun wsdl2h and also compile and link custom/struct_tm.c. # xsd__dateTime = #import "custom/struct_tm.h" | xsd__dateTime # Uncomment the line below to use timeval with usec precision xsd:dateTime # Then rerun wsdl2h and also compile and link custom/struct_timeval.c. # xsd__dateTime = #import "custom/struct_timeval.h" | xsd__dateTime # Uncomment the line below to use std::chrono::system_clock::time_point # for xsd:dateTime. # Then rerun wsdl2h and also compile and link custom/chrono_time_point.c. # xsd__dateTime = #import "custom/chrono_time_point.h" | xsd__dateTime # Uncomment the line below to use struct tm for xsd:date instead of # mapping xsd:date to string. # Then rerun wsdl2h and also compile and link custom/struct_tm_date.c. # xsd__date = #import "custom/struct_tm_date.h" | xsd__date # Uncomment the line below to use LONG64 int for xsd:duration instead of # mapping xsd:duration to string (in milliseconds precision). # Then rerun wsdl2h and also compile and link custom/duration.c. # # xsd__duration = #import "custom/duration.h" | xsd__duration # Uncomment the line below to use C++11 std::chrono::nanoseconds for # xsd:duration instead of mapping xsd:duration to string. # Then rerun wsdl2h and also compile and link custom/chrono_duration.cpp. # xsd__duration = #import "custom/chrono_duration.h" | xsd__duration # Uncomment the line below to use ULONG64 int for xsd:time instead of # mapping xsd:time to string (also comes with high usec precision) # Then rerun wsdl2h and also compile and link custom/time.c # xsd__time = #import "custom/long_time.h" | xsd__time # When compiling WITH_LEAN there is no hexBinary serializer. You can # remap the hexBinary type to a string as follows: # xsd__hexBinary = | char* # When wsdl2h option -d is used, xsd:any is mapped to xsd__anyType DOM # declared in dom.h and implemented in dom.c/dom.cpp. You can remap # xsd:any, for example to a pointer to a DOM node as follows: # xsd__any = | xsd__anyType* # When SOAP 1.2 Faults should carry multiple SOAP_ENV__Text elements with # xml:lang attributes, then remap SOAP_ENV__Reason as follows: # [ # struct SOAP_ENV__Reason # { # char *SOAP_ENV__Text; // at least one SOAP-ENV:Text for the gSOAP engine # $int size; # struct SOAP_ENV__Text *SOAP_ENV__Text_; // array of more SOAP-ENV:Text # }; # struct SOAP_ENV__Text # { # char *__item; # @char *xml__lang; # }; # ] # SOAP-ENV mapping. Note that SOAP Body content is mapped to an XML # string. Use xsd__anyType instead of _XML to use a DOM instead. SOAP_ENV__Envelope = struct SOAP_ENV__Envelope { struct SOAP_ENV__Header *SOAP_ENV__Header; _XML SOAP_ENV__Body; }; | struct SOAP_ENV__Envelope SOAP_ENV__Header = | struct SOAP_ENV__Header SOAP_ENV__Fault = | struct SOAP_ENV__Fault SOAP_ENV__Detail = | struct SOAP_ENV__Detail SOAP_ENV__Code = | struct SOAP_ENV__Code SOAP_ENV__Subcode = | struct SOAP_ENV__Subcode SOAP_ENV__Reason = | struct SOAP_ENV__Reason # SOAP-ENV mapping when using C++ namespaces with soapcpp2 option -q # THE FOLLOWING DEFINITIONS SHOULD ONLY BE USED WHEN COMPILATION ERRORS # OCCUR. Remove the previous SOAP_ENV__Envelope, SOAP_ENV__Header and # SOAP_ENV__Fault, then enable the following definitions: # SOAP_ENV__Envelope = struct SOAP_ENV__Envelope { struct SOAP_ENV__Header_ *SOAP_ENV__Header; _XML SOAP_ENV__Body; }; | struct SOAP_ENV__Envelope # SOAP_ENV__Header = struct SOAP_ENV__Header_ { /* place SOAP Header elements here, if any */ }; | struct SOAP_ENV__Header_ # SOAP_ENV__Fault = \ # struct SOAP_ENV__Fault_\ # {\ # char *faultcode;\ # char *faultstring;\ # char *faultactor;\ # struct SOAP_ENV__Detail_ *detail;\ # struct SOAP_ENV__Code_ *SOAP_ENV__Code;\ # struct SOAP_ENV__Reason_ *SOAP_ENV__Reason;\ # char *SOAP_ENV__Node;\ # char *SOAP_ENV__Role;\ # struct SOAP_ENV__Detail_ *SOAP_ENV__Detail;\ # };\ # struct SOAP_ENV__Detail_\ # {\ # char *__any;\ # int __type;\ # void *fault;\ # };\ # struct SOAP_ENV__Code_\ # {\ # char *SOAP_ENV__Value;\ # struct SOAP_ENV__Code_ *SOAP_ENV__Subcode_;\ # };\ # struct SOAP_ENV__Reason_\ # {\ # char *SOAP_ENV__Text;\ # };\ # | struct SOAP_ENV__Fault_ # Older gSOAP versions prior to 2.8.83 used a simple SOAP_ENC__Array type # which can be re-enabled by uncommenting this line: # SOAP_ENC__Array = | struct { _XML *__ptr; int __size; } | struct { _XML *__ptr; int __size; } # Temporary URI tempuri = "http://tempuri.org/" # Empty URI empty = "" # .NET WCF DataContract Serialization Schema ser = arr = "http://schemas.microsoft.com/2003/10/Serialization/Arrays" # .NET WCF DataContract Serialization Schema root element remappings _ser__anyURI == xsd__anyURI _ser__boolean == xsd__boolean _ser__base64Binary == xsd__base64Binary _ser__byte == xsd__byte _ser__dateTime == xsd__dateTime _ser__decimal == xsd__decimal _ser__double == xsd__double _ser__float == xsd__float _ser__int == xsd__int _ser__long == xsd__long _ser__QName == xsd__QName _ser__short == xsd__short _ser__string == xsd__string _ser__unsignedByte == xsd__unsignedByte _ser__unsignedInt == xsd__unsignedInt _ser__unsignedLong == xsd__unsignedLong _ser__unsignedShort == xsd__unsignedShort # .NET WCF ser:anyType represents an object (see import/ser.h): _ser__anyType = | struct __ser__anyType | struct __ser__anyType # .NET WCF ser:char element and type represents a Unicode character _ser__char = | int ser__char = | int # .NET WCF ser:duration root element and type maps to xsd:duration _ser__duration == xsd__duration ser__duration == xsd__duration # .NET WCF ser:guid pattern = "[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}" _ser__guid = | char* ser__guid = | char* # .NET WCF samples mssamh = "http://Microsoft.Samples.Http" mssamhi = "http://Microsoft.Samples.Http/Imports" mssamt = "http://Microsoft.Samples.TransportSecurity" mssamti = "http://Microsoft.Samples.TransportSecurity/Imports" mssamm = "http://Microsoft.Samples.MessageSecurity" mssammi = "http://Microsoft.Samples.MessageSecurity/Imports" mssadh = "http://Microsoft.Samples.DualHttp" mssadhi = "http://Microsoft.Samples.DualHttp/Imports" # MTOM xop and xmime are imported from xop.h, xmime.h, and xmlmime.h: # Note: changed xmlmime to xmime to avoid other MTOM tools from # complaining that 'xml' is reserved. xop = xmime = xmime4 = xmime5 = # xop:Include is imported from xop.h and redefined as _xop__Include: xop__Include = #import "xop.h" | _xop__Include # xmime/xmlmime:contentType attribute is a string: _xmime__contentType = | char* | char* _xmime4__contentType = | char* | char* _xmime5__contentType = | char* | char* # exc-c14n c14n = # WS-Addressing (2003, 2004, and 2005 schemas) # See import/wsa.h, import/wsa3.h etc for definitions and code examples # The API is defined in plugin/wsaapi.c, plugin/wsaapi3.c, etc. wsa = wsa3 = wsa4 = wsa5 = # The types below should not use pointers, so we add a 3rd column: _wsa__Action = | | _wsa__Action _wsa__MessageID = | | _wsa__MessageID _wsa__To = | | _wsa__To _wsa3__Action = | | _wsa3__Action _wsa3__MessageID = | | _wsa3__MessageID _wsa3__To = | | _wsa3__To _wsa4__Action = | | _wsa4__Action _wsa4__MessageID = | | _wsa4__MessageID _wsa4__To = | | _wsa4__To _wsa5__Action = | | _wsa5__Action _wsa5__MessageID = | | _wsa5__MessageID _wsa5__To = | | _wsa5__To # WS-ReliableMessaging 1.1 and 1.0 (and obsolete WS-Reliability 2004) wsrm = wsrm5 = wsrm4 = # WS-Discovery 1.1 (2009/01) and 1.0 (2004/08 with WS-Addressing) # To upgrade WS-Discovery to WS-Addressing 2005/08, uncomment wsdd5: wsdd = #wsdd5 = wsdd10 = wsdd5__HelloType = | wsdd__HelloType wsdd5__ByeType = | wsdd__ByeType wsdd5__ProbeType = | wsdd__ProbeType wsdd5__ProbeMatchesType = | wsdd__ProbeMatchesType wsdd5__ProbeMatchType = | wsdd__ProbeMatchType wsdd5__ResolveType = | wsdd__ResolveType wsdd5__ResolveMatchesType = | wsdd__ResolveMatchesType wsdd5__ResolveMatchType = | wsdd__ResolveMatchType wsdd5__ScopesType = | wsdd__ScopesType wsdd5__SecurityType = | wsdd__SecurityType wsdd5__SigType = | wsdd__SigType wsdd5__AppSequenceType = | wsdd__AppSequenceType wsdd10__HelloType = | wsdd__HelloType wsdd10__ByeType = | wsdd__ByeType wsdd10__ProbeType = | wsdd__ProbeType wsdd10__ProbeMatchesType = | wsdd__ProbeMatchesType wsdd10__ProbeMatchType = | wsdd__ProbeMatchType wsdd10__ResolveType = | wsdd__ResolveType wsdd10__ResolveMatchesType = | wsdd__ResolveMatchesType wsdd10__ResolveMatchType = | wsdd__ResolveMatchType wsdd10__ScopesType = | wsdd__ScopesType wsdd10__SecurityType = | wsdd__SecurityType wsdd10__SigType = | wsdd__SigType wsdd10__AppSequenceType = | wsdd__AppSequenceType # WS-Policy wsp = # WS-SecureConversation 1.4 wsc = wsc2 = # WS-Trust 1.2 and 1.3 wst = # Some WSDLs use the incorrect URI (below), if so, replace the above with: # wst = wst2 = wst__RequestSecurityToken = | wst__RequestSecurityTokenType* wst__RequestSecurityTokenResponse = | wst__RequestSecurityTokenResponseType* wst__RequestSecurityTokenCollection = | wst__RequestSecurityTokenCollectionType* wst__RequestSecurityTokenResponseCollection = | wst__RequestSecurityTokenResponseCollectionType* wst2__RequestSecurityToken = | wst__RequestSecurityTokenType* wst2__RequestSecurityTokenResponse = | wst__RequestSecurityTokenResponseType* wst2__RequestSecurityTokenCollection = | wst__RequestSecurityTokenCollectionType* wst2__RequestSecurityTokenResponseCollection = | wst__RequestSecurityTokenResponseCollectionType* # SAML bindings saml1 = saml2 = # WS-Security wsse 2004 v1.0 and 1.1 and old wsse 2002 schema wsse11 = wsse = wsse2 = _wsse2__Security == _wsse__Security wsse2__Security == wsse__Security # wsu 2004 wsu = _wsu__Id = | char* _wsu__Created = | time_t _wsu__Expires = | time_t wsu__AttributedDateTime = | time_t wsu__AttributedURI = | char* # Bindings for ds and xenc for WS-Security protocols: ds = xenc = # xlink xlink = "http://www.w3.org/1999/xlink" # wsrp routing protocol (deprecated) wsrp = # BPEL 2.0 bpel = "http://docs.oasis-open.org/wsbpel/2.0/process/executable" bpelabs = "http://docs.oasis-open.org/wsbpel/2.0/process/abstract" plnk = "http://docs.oasis-open.org/wsbpel/2.0/plnktype" sref = "http://docs.oasis-open.org/wsbpel/2.0/serviceref" vprop = "http://docs.oasis-open.org/wsbpel/2.0/varprop" # ONVIF recommended prefixes as per 8/20/12 # http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl # http://www.onvif.org/onvif/ver10/event/wsdl/event.wsdl # http://www.onvif.org/onvif/ver10/display.wsdl # http://www.onvif.org/onvif/ver10/deviceio.wsdl # http://www.onvif.org/onvif/ver20/imaging/wsdl/imaging.wsdl # http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl # http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl # http://www.onvif.org/onvif/ver10/receiver.wsdl # http://www.onvif.org/onvif/ver10/recording.wsdl # http://www.onvif.org/onvif/ver10/search.wsdl # http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl # http://www.onvif.org/onvif/ver10/replay.wsdl # http://www.onvif.org/onvif/ver20/analytics/wsdl/analytics.wsdl # http://www.onvif.org/onvif/ver10/analyticsdevice.wsdl # http://www.onvif.org/onvif/ver10/schema/onvif.xsd tds = "http://www.onvif.org/ver10/device/wsdl" tev = "http://www.onvif.org/ver10/events/wsdl" tls = "http://www.onvif.org/ver10/display/wsdl" tmd = "http://www.onvif.org/ver10/deviceIO/wsdl" timg = "http://www.onvif.org/ver20/imaging/wsdl" trt = "http://www.onvif.org/ver10/media/wsdl" tptz = "http://www.onvif.org/ver20/ptz/wsdl" trv = "http://www.onvif.org/ver10/receiver/wsdl" trc = "http://www.onvif.org/ver10/recording/wsdl" tse = "http://www.onvif.org/ver10/search/wsdl" trp = "http://www.onvif.org/ver10/replay/wsdl" tan = "http://www.onvif.org/ver20/analytics/wsdl" tad = "http://www.onvif.org/ver10/analyticsdevice/wsdl" tas = "http://www.onvif.org/ver10/advancedsecurity/wsdl" tdn = "http://www.onvif.org/ver10/network/wsdl" tt = "http://www.onvif.org/ver10/schema" # to extend tt__EventFilter with TopicExpression element (for C): # tt__EventFilter = $ struct wsnt__TopicExpressionType *wsnt__TopicExpression; # to extend tt__EventFilter with TopicExpression element (for C++): # tt__EventFilter = $ wsnt__TopicExpressionType *wsnt__TopicExpression; # to extend _tds__Service_Capabilities with trt:ProfileCapabilities element (for C): # tds__Service_Capabilities = $ struct trt__ProfileCapabilities* trt__ProfileCapabilities; # to extend _tds__Service_Capabilities with trt:ProfileCapabilities element (for C++): # _tds__Service_Capabilities = $ trt__ProfileCapabilities* trt__ProfileCapabilities_; # to extend trt__ProfileCapabilities with @Rotation attribute (for C): # trt__ProfileCapabilities = $ @enum xsd__boolean Rotation; # to extend trt__ProfileCapabilities with @Rotation attribute (for C++): # trt__ProfileCapabilities = $ @bool Rotation; # OASIS recommended prefixes wsnt = "http://docs.oasis-open.org/wsn/b-2" wsntw = "http://docs.oasis-open.org/wsn/bw-2" wsrfbf = "http://docs.oasis-open.org/wsrf/bf-2" wsrfr = "http://docs.oasis-open.org/wsrf/r-2" wsrfrw = "http://docs.oasis-open.org/wsrf/rw-2" wstop = "http://docs.oasis-open.org/wsn/t-1" # TR-069 recommended prefixes cwmp = "urn:dslforum-org:cwmp-1-1" cwmp = "urn:dslforum-org:cwmp-1-2" lwn = "urn:broadband-forum-org:cwmp:lwnotif-1-0" dm = "urn:broadband-forum-org:cwmp:datamodel-1-5" dmr = "urn:broadband-forum-org:cwmp:datamodel-report-0-1" dt = "urn:broadband-forum-org:cwmp:devicetype-1-3" dtf = "urn:broadband-forum-org:cwmp:devicetype-features" xmpp = "urn:broadband-forum-org:cwmp:xmppConnReq-1-0" bdc = "urn:broadband-forum-org:ipdr:tr-232-1-0" ipdr = "http://www.ipdr.org/namespaces/ipdr" # XMPP and jabber protocols (a selection) stream = "http://etherx.jabber.org/streams" iqrpc = "jabber:iq:rpc" xdata = "jabber:x:data" iqlast = "jabber:iq:last" # XHTML prefix and recommended types xhtml = "http://www.w3.org/1999/xhtml" xhtml__Number = | unsigned int xhtml__Pixels = | unsigned int # HL7 FHIR prefix # When using FHIR you may want to use XHTML as a DOM instead of XML data # binding resulting in lots of code, by uncommenting the following line: # xhtml = # with this line uncommented, create an xhtml.h file with the following: = #import "dom.h" # typedef xsd__anyType _xhtml__div; fhir = "http://hl7.org/fhir" # Prefix bindings for WhiteMesa interoperability testing round 2: i = "http://soapinterop.org/" s = "http://soapinterop.org/xsd" # Prefix bindings for Amazon AWS S3 Web Services: aws = "urn:PI/DevCentral/SoapService" s3 = "http://s3.amazonaws.com/doc/2006-03-01/" _s3__CreateBucketResponse = $ s3__CreateBucketResult* CreateBucketResponse; _s3__CopyObjectResponse = $ s3__CopyObjectResult* CopyObjectResponse; # Prefix bindings for Exchange Web Services ewsmsg = "http://schemas.microsoft.com/exchange/services/2006/messages" ewstype = "http://schemas.microsoft.com/exchange/services/2006/types" # Prefix binding for Mappoint Web services: mpt = "http://s.mappoint.net/mappoint-30/" # Prefix binding for XLIFF 2.0 xliff = "urn:oasis:names:tc:xliff:document:2.0" xliff__priorityValue = typedef int xliff__priorityValue 1:10; gsoap-2.8.91/gsoap/wsdl/MakefileManual0000644000175000017500000000561613525245163017162 0ustar ellertellert# gSOAP wsdl2h Makefile by Robert van Engelen, Genivia Inc. # Use this to build the soapcpp2 tool when autoconf/automake are not # available. # # Dependences: # Build soapcpp2 first (should be in ../bin/soapcpp2) # # Use 'make secure' to build SSL-capable wsdlh2 tool (requires OpenSSL) # # Mac OS X universal binary: # CPP=g++ -arch i386 -arch ppc CC=gcc CPP=g++ # SOAPCPP=../src/soapcpp2 STDSOAPH=../stdsoap2.h STDSOAPC=../stdsoap2.cpp PLUGIN=../plugin # SOCKLIB= # SOCKLIB=-lsocket -lnsl # SSLFLAGS= # SSLFLAGS=-I/opt/local/include SSLLIB=-lcrypto -lssl # SSLLIB=-L/opt/local/lib -lcrypto -lssl # LIBS=-lm $(SOCKLIB) # COFLAGS=-O1 # For static linking use: # COFLAGS=-O1 -static # For debugging use: # COFLAGS=-DDEBUG -g # COFLAGS=-g CWFLAGS=-Wall -Wextra # CIFLAGS=-I.. -I$(PLUGIN) $(SSLFLAGS) # CMFLAGS= # CFLAGS=$(CWFLAGS) $(COFLAGS) $(CIFLAGS) $(CMFLAGS) # release: $(MAKE) -f MakefileManual distclean $(MAKE) -f MakefileManual wsdl2h secure: $(MAKE) -f MakefileManual distclean $(MAKE) -f MakefileManual CMFLAGS='-Wno-deprecated-declarations -DWITH_OPENSSL -DWITH_GZIP' LIBS="httpda.o smdevp.o -lz -lm -lpthread $(SOCKLIB) $(SSLLIB)" httpda.o smdevp.o wsdl2h wsdl2h: wsdlC.o wsdl2h.o wsdl.o wadl.o schema.o soap.o mime.o wsp.o bpel.o types.o service.o stdsoap2.o $(CPP) -o wsdl2h wsdlC.o wsdl2h.o wsdl.o wadl.o schema.o soap.o mime.o wsp.o bpel.o types.o service.o stdsoap2.o $(LIBS) -cp -f wsdl2h ../bin stdsoap2.o: $(STDSOAPH) $(STDSOAPC) $(CPP) -c $(CFLAGS) $(STDSOAPC) wsdl2h.o: wsdl2h.cpp types.h service.h includes.h $(CPP) -c $(CFLAGS) wsdl2h.cpp wsdlC.o: wsdlC.cpp $(CPP) -c $(CFLAGS) wsdlC.cpp wsdlC.cpp: schema.h soap.h mime.h dime.h http.h wsdl.h includes.h imports.h wsp.h sp.h wsam.h wsrmp.h wsu.h wst.h $(SOAPCPP) -I../import -SC -pwsdl wsdl.h types.o: types.h types.cpp includes.h wsdlC.cpp $(CPP) -c $(CFLAGS) types.cpp service.o: service.h service.cpp includes.h wsdlC.cpp $(CPP) -c $(CFLAGS) service.cpp wsdl.o: wsdl.h wsdl.cpp includes.h imports.h $(CPP) -c $(CFLAGS) wsdl.cpp wadl.o: wadl.h wadl.cpp includes.h imports.h $(CPP) -c $(CFLAGS) wadl.cpp schema.o: schema.h schema.cpp includes.h imports.h $(CPP) -c $(CFLAGS) schema.cpp soap.o: soap.h soap.cpp includes.h imports.h $(CPP) -c $(CFLAGS) soap.cpp mime.o: mime.h mime.cpp includes.h imports.h $(CPP) -c $(CFLAGS) mime.cpp wsp.o: wsp.h wsp.cpp includes.h imports.h $(CPP) -c $(CFLAGS) wsp.cpp bpel.o: bpel.h bpel.cpp includes.h imports.h $(CPP) -c $(CFLAGS) bpel.cpp httpda.o: $(PLUGIN)/httpda.c $(CPP) -c $(CFLAGS) $(PLUGIN)/httpda.c smdevp.o: $(PLUGIN)/smdevp.c $(CPP) -c $(CFLAGS) $(PLUGIN)/smdevp.c .PHONY: clean distclean clean: -rm -f *.o wsdlH.h wsdlStub.h wsdlC.cpp wsdlClient.cpp wsdlServer.cpp wsdlClientLib.cpp wsdlServerLib.cpp distclean: -rm -f *.o *.wsdl *.xsd *.xml *.nsmap wsdl2h wsdlH.h wsdlStub.h wsdlC.cpp wsdlClient.cpp wsdlServer.cpp wsdlClientLib.cpp wsdlServerLib.cpp gsoap-2.8.91/gsoap/wsdl/schema.cpp0000644000175000017500000030423313525245163016325 0ustar ellertellert/* schema.cpp XSD binding schema implementation -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "wsdlH.h" // cannot include "schemaH.h" #include "includes.h" extern struct Namespace namespaces[]; extern "C" { extern int warn_ignore(struct soap*, const char*); } extern const char *qname_token(const char*, const char*); extern int is_builtin_qname(const char*); extern xsd__QName make_qname(xs__schema&, const char *); //////////////////////////////////////////////////////////////////////////////// // // schema // //////////////////////////////////////////////////////////////////////////////// xs__schema::xs__schema() { soap = soap_new1(SOAP_XML_TREE | SOAP_C_UTFSTRING); #ifdef HTTPDA_H soap_register_plugin(soap, http_da); #endif #ifdef WITH_OPENSSL soap_ssl_client_context(soap, SOAP_SSL_NO_AUTHENTICATION | SOAP_SSLv3_TLSv1, NULL, NULL, NULL, NULL, NULL); #endif soap_set_namespaces(soap, namespaces); soap_default(soap); soap->fignore = warn_ignore; soap->encodingStyle = NULL; soap->proxy_host = proxy_host; soap->proxy_port = proxy_port; soap->proxy_userid = proxy_userid; soap->proxy_passwd = proxy_passwd; targetNamespace = NULL; version = NULL; attributeGroupRef = NULL; updated = false; location = NULL; redirs = 0; used = false; } xs__schema::xs__schema(struct soap *copy) { soap = soap_copy(copy); soap->socket = SOAP_INVALID_SOCKET; soap->recvfd = 0; soap->sendfd = 1; soap_default(soap); soap->fignore = warn_ignore; soap->encodingStyle = NULL; targetNamespace = NULL; version = NULL; attributeGroupRef = NULL; updated = false; location = NULL; redirs = 0; } xs__schema::xs__schema(struct soap *copy, const char *cwd, const char *loc, const char *relloc) { soap = soap_copy(copy); soap->socket = SOAP_INVALID_SOCKET; soap->recvfd = 0; soap->sendfd = 1; soap_default(soap); soap->fignore = warn_ignore; soap->encodingStyle = NULL; targetNamespace = NULL; version = NULL; attributeGroupRef = NULL; updated = false; location = NULL; redirs = 0; read(cwd, loc, relloc); } xs__schema::~xs__schema() { } int xs__schema::get(struct soap *soap) { (void)soap; return preprocess(); } int xs__schema::preprocess() { for (std::vector::iterator im = import.begin(); im != import.end(); ++im) (*im).preprocess(*this); // read schema and recurse over for (std::vector::iterator in = include.begin(); in != include.end(); ++in) { (*in).preprocess(*this); // read schema and recurse over , and if ((*in).schemaPtr()) insert(*(*in).schemaPtr()); } for (std::vector::iterator ov = override_.begin(); ov != override_.end(); ++ov) { (*ov).preprocess(*this); // read schema and recurse over , and if ((*ov).schemaPtr()) insert(*(*ov).schemaPtr()); } for (std::vector::iterator re = redefine.begin(); re != redefine.end(); ++re) { (*re).preprocess(*this); // read schema and recurse over , and if ((*re).schemaPtr()) insert(*(*re).schemaPtr()); } return SOAP_OK; } int xs__schema::insert(xs__schema& schema) { bool found; if (targetNamespace && (!schema.targetNamespace || strcmp(targetNamespace, schema.targetNamespace))) { if (!Wflag) fprintf(stderr, "\nWarning: attempt to include schema '%s' with mismatching targetNamespace '%s' into schema namespace '%s', assuming chameleon schema targetNamespace '%s'\n", schema.sourceLocation() ? schema.sourceLocation() : "", schema.targetNamespace, targetNamespace, targetNamespace); schema.targetNamespace = targetNamespace; } if (elementFormDefault != schema.elementFormDefault) { if (!Wflag) fprintf(stderr, "\nWarning: attempt to include schema '%s' with mismatching elementFormDefault into schema namespace '%s', assuming elementFormDefault '%squalified'\n", schema.sourceLocation() ? schema.sourceLocation() : "", targetNamespace ?targetNamespace : "(null)", elementFormDefault == qualified ? "" : "un"); schema.elementFormDefault = elementFormDefault; } if (attributeFormDefault != schema.attributeFormDefault) { if (!Wflag) fprintf(stderr, "\nWarning: attempt to include schema '%s' with mismatching attributeFormDefault into schema namespace '%s', assuming attributeFormDefault '%squalified'\n", schema.sourceLocation() ? schema.sourceLocation() : "", targetNamespace ? targetNamespace : "(null)", attributeFormDefault == qualified ? "" : "un"); schema.attributeFormDefault = attributeFormDefault; } // insert imports for (std::vector::const_iterator im = schema.import.begin(); im != schema.import.end(); ++im) { found = false; if ((*im).schemaLocation) { for (std::vector::const_iterator i = import.begin(); i != import.end(); ++i) { if ((*i).schemaLocation && !strcmp((*im).schemaLocation, (*i).schemaLocation)) { found = true; break; } } } else if ((*im).namespace_) { for (std::vector::const_iterator i = import.begin(); i != import.end(); ++i) { if ((*i).namespace_ && !strcmp((*im).namespace_, (*i).namespace_)) { found = true; break; } } } if (!found) import.push_back(*im); } // insert attributes, but only add attributes with new name (limited conflict check) for (std::vector::const_iterator at = schema.attribute.begin(); at != schema.attribute.end(); ++at) { found = false; if ((*at).name) { for (std::vector::const_iterator a = attribute.begin(); a != attribute.end(); ++a) { if ((*a).name && !strcmp((*at).name, (*a).name)) { found = true; if ((*at).type && (*a).type && strcmp((*at).type, (*a).type)) if (!Wflag) fprintf(stderr, "\nWarning: attempt to redefine attribute '%s' with type '%s' in schema '%s'\n", (*at).name, (*at).type, targetNamespace ? targetNamespace : "(null)"); break; } } } if (!found) { attribute.push_back(*at); attribute.back().schemaPtr(this); } } // insert elements, but only add elements with new name (limited conflict check) for (std::vector::const_iterator el = schema.element.begin(); el != schema.element.end(); ++el) { found = false; if ((*el).name) { for (std::vector::const_iterator e = element.begin(); e != element.end(); ++e) { if ((*e).name && !strcmp((*el).name, (*e).name)) { found = true; if ((*el).type && (*e).type && strcmp((*el).type, (*e).type)) if (!Wflag) fprintf(stderr, "\nWarning: attempt to redefine element '%s' with type '%s' in schema '%s'\n", (*el).name, (*el).type, targetNamespace ? targetNamespace : "(null)"); break; } } } if (!found) { element.push_back(*el); element.back().schemaPtr(this); } } // insert groups, but only add groups with new name (no conflict warning) for (std::vector::const_iterator gp = schema.group.begin(); gp != schema.group.end(); ++gp) { found = false; if ((*gp).name) { for (std::vector::const_iterator g = group.begin(); g != group.end(); ++g) { if ((*g).name && !strcmp((*gp).name, (*g).name)) { found = true; break; } } } if (!found) { group.push_back(*gp); group.back().schemaPtr(this); } } // insert attributeGroups, but only add attributeGroups with new name (no conflict warning) for (std::vector::const_iterator ag = schema.attributeGroup.begin(); ag != schema.attributeGroup.end(); ++ag) { found = false; if ((*ag).name) { for (std::vector::const_iterator g = attributeGroup.begin(); g != attributeGroup.end(); ++g) { if ((*g).name && !strcmp((*ag).name, (*g).name)) { found = true; break; } } } if (!found) { attributeGroup.push_back(*ag); attributeGroup.back().schemaPtr(this); } } // insert simpleTypes, but only add simpleTypes with new name (no conflict warning) for (std::vector::const_iterator st = schema.simpleType.begin(); st != schema.simpleType.end(); ++st) { found = false; if ((*st).name) { for (std::vector::const_iterator s = simpleType.begin(); s != simpleType.end(); ++s) { if ((*s).name && !strcmp((*st).name, (*s).name)) { found = true; break; } } } if (!found) { simpleType.push_back(*st); simpleType.back().schemaPtr(this); } } // insert complexTypes, but only add complexTypes with new name (no conflict warning) for (std::vector::const_iterator ct = schema.complexType.begin(); ct != schema.complexType.end(); ++ct) { found = false; if ((*ct).name) { for (std::vector::const_iterator c = complexType.begin(); c != complexType.end(); ++c) { if ((*c).name && !strcmp((*ct).name, (*c).name)) { found = true; break; } } } if (!found) { complexType.push_back(*ct); complexType.back().schemaPtr(this); } } return SOAP_OK; } int xs__schema::traverse() { if (updated) return SOAP_OK; if (vflag) std::cerr << " Analyzing schema '" << (targetNamespace ? targetNamespace : "(null)") << "' '" << (sourceLocation() ? sourceLocation() : "") << "'" << std::endl; updated = true; if (!targetNamespace) { if (vflag) fprintf(stderr, "\nWarning: Schema has no targetNamespace\n"); targetNamespace = soap_strdup(soap, ""); } else if (exturis.find(targetNamespace) != exturis.end()) { if (vflag) fprintf(stderr, "\nWarning: Built-in schema '%s' content encountered\n", targetNamespace); } // process import for (std::vector::iterator im = import.begin(); im != import.end(); ++im) (*im).traverse(*this); // process attributes for (std::vector::iterator at = attribute.begin(); at != attribute.end(); ++at) (*at).traverse(*this); // process elements for (std::vector::iterator el = element.begin(); el != element.end(); ++el) (*el).traverse(*this); // process simpleTypes, check conflicts with complexTypes for (std::vector::iterator st = simpleType.begin(); st != simpleType.end(); ++st) { (*st).traverse(*this); if ((*st).name) { for (std::vector::iterator ct = complexType.begin(); ct != complexType.end(); ++ct) { if ((*ct).name && !strcmp((*st).name, (*ct).name)) { if (!Wflag) fprintf(stderr, "\nWarning: top-level simpleType name and complexType name '%s' clash in schema '%s'\n", (*st).name, targetNamespace ? targetNamespace : "(null)"); } } } } // process complexTypes for (std::vector::iterator ct = complexType.begin(); ct != complexType.end(); ++ct) (*ct).traverse(*this); // process groups for (std::vector::iterator gp = group.begin(); gp != group.end(); ++gp) (*gp).traverse(*this); // process attributeGroups for (std::vector::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) (*ag).traverse(*this); // XSD 1.1 defaultAttributes if (defaultAttributes) { for (std::vector::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) { if ((*ag).name && !strcmp((*ag).name, defaultAttributes)) { attributeGroupRef = &*ag; break; } } if (!attributeGroupRef) std::cerr << "\nWarning: could not find defaultAttributes attributeGroup '" << defaultAttributes << "' in schema '" << (targetNamespace ? targetNamespace : "(null)") << "'" << std::endl; } if (vflag) std::cerr << " End of schema '" << (targetNamespace ? targetNamespace : "(null)") << "'" << std::endl; return SOAP_OK; } int xs__schema::read(const char *cwd, const char *loc, const char *relloc) { const char *cwd_temp; if (!cwd) cwd = cwd_path; if (vflag) fprintf(stderr, "\nOpening schema '%s' relative to '%s'\n", loc ? loc : "(stdin)", cwd ? cwd : "./"); if (loc) { if (soap->recvfd > 2) { soap_end_recv(soap); close(soap->recvfd); soap->recvfd = -1; } else if (soap_valid_socket(soap->socket)) { soap_end_recv(soap); soap_closesock(soap); } #ifdef WITH_OPENSSL if (!strncmp(loc, "http://", 7) || !strncmp(loc, "https://", 8)) #else if (!strncmp(loc, "https://", 8)) { #ifdef WIN32 fprintf(stderr, "\nCannot connect to https site: SSL/TLS support not enabled in this version. Visit https://www.genivia.com/downloads.html to download the secure version of wsdl2h.exe that supports SSL/TLS to connect to https sites.\n"); #else fprintf(stderr, "\nCannot connect to https site: SSL/TLS support not enabled, please rebuild wsdl2h with SSL/TLS enabled using 'make secure' or download the WSDL/WADL and XSD files and rerun wsdl2h on these files directly by specifying the file names on the command line.\n"); #endif exit(1); } else if (!strncmp(loc, "http://", 7)) #endif { fprintf(stderr, "%*sConnecting to '%s' to retrieve schema...", 2*openfiles, "", loc); location = soap_strdup(soap, loc); if (soap_connect_command(soap, SOAP_GET, location, NULL)) { fprintf(stderr, "\n\nError: connection failed\n"); soap_print_fault(soap, stderr); exit(1); } fprintf(stderr, " connected, receiving...\n"); openfiles++; } else if (cwd && (!strncmp(cwd, "http://", 7) || !strncmp(cwd, "https://", 8))) { size_t l = strlen(cwd) + strlen(loc); location = (char*)soap_malloc(soap, l + 2); soap_strcpy(location, l + 2, cwd); char *s = strrchr(location, '/'); if (s) *s = '\0'; size_t n = strlen(location); soap_strcpy(location + n, l + 2 - n, "/"); ++n; soap_strcpy(location + n, l + 2 - n, loc); fprintf(stderr, "%*sConnecting to '%s' to retrieve schema '%s'...", 2*openfiles, "", location, loc); if (soap_connect_command(soap, SOAP_GET, location, NULL)) { fprintf(stderr, "\n\nError: failed to retrieve '%s'\n", loc); soap_print_fault(soap, stderr); exit(1); } fprintf(stderr, " connected, receiving...\n"); openfiles++; } else { if (!strncmp(loc, "file://", 7)) loc += 7; soap->recvfd = open(loc, O_RDONLY, 0); if (soap->recvfd < 0) { if (loc && cwd) { size_t l = strlen(cwd) + strlen(relloc); location = (char*)soap_malloc(soap, l + 2); soap_strcpy(location, l + 2, cwd); char *s = strrchr(location, '/'); #ifdef WIN32 if (!s) s = strrchr(location, '\\'); #endif if (s) { *s = '\0'; size_t n = strlen(location); soap_strcpy(location + n, l + 2 - n, "/"); ++n; soap_strcpy(location + n, l + 2 - n, relloc); if (!strncmp(location, "file://", 7)) location += 7; soap->recvfd = open(location, O_RDONLY, 0); if (vflag) std::cerr << "Opening file " << location << (soap->recvfd < 0 ? " failed" : " successful") << std::endl; } } if (soap->recvfd < 0 && import_path) { size_t l = strlen(import_path) + strlen(loc); location = (char*)soap_malloc(soap, l + 2); soap_strcpy(location, l + 2, import_path); size_t n = strlen(location); soap_strcpy(location + n, l + 2 - n, "/"); ++n; soap_strcpy(location + n, l + 2 - n, loc); if (!strncmp(location, "file://", 7)) location += 7; soap->recvfd = open(location, O_RDONLY, 0); if (vflag) std::cerr << "Opening file " << location << (soap->recvfd < 0 ? " failed" : " successful") << std::endl; } if (relloc && soap->recvfd < 0 && import_path) { size_t l = strlen(import_path) + strlen(relloc); location = (char*)soap_malloc(soap, l + 2); soap_strcpy(location, l + 2, import_path); size_t n = strlen(location); soap_strcpy(location + n, l + 2 - n, "/"); ++n; soap_strcpy(location + n, l + 2 - n, relloc); if (!strncmp(location, "file://", 7)) location += 7; soap->recvfd = open(location, O_RDONLY, 0); if (vflag) std::cerr << "Opening file " << location << (soap->recvfd < 0 ? " failed" : " successful") << std::endl; } if (soap->recvfd < 0) { fprintf(stderr, "\nCannot open '%s' to retrieve schema\n", loc); exit(1); } } else { location = soap_strdup(soap, loc); } fprintf(stderr, "%*sReading schema '%s'...\n", 2*openfiles, "", location); openfiles++; } } cwd_temp = cwd_path; cwd_path = location; if (!soap_begin_recv(soap)) this->soap_in(soap, "xs:schema", NULL); if ((soap->error >= 301 && soap->error <= 303) || soap->error == 307) // HTTP redirect, socket was closed { int r = SOAP_ERR; fprintf(stderr, "Redirected to '%s'...\n", soap->endpoint); if (redirs++ < 10) r = read(cwd, soap->endpoint, NULL); else fprintf(stderr, "\nMax redirects exceeded\n"); redirs--; return r; } else if (soap->error == 401) { int r = SOAP_ERR; fprintf(stderr, "Authenticating to '%s' realm '%s'...\n", loc, soap->authrealm); if (auth_userid && auth_passwd && redirs++ < 1) { #ifdef HTTPDA_H struct http_da_info info; http_da_save(soap, &info, soap->authrealm, auth_userid, auth_passwd); #else soap->userid = auth_userid; soap->passwd = auth_passwd; #endif r = read(cwd, loc, NULL); #ifdef HTTPDA_H http_da_release(soap, &info); #endif redirs--; } else { fprintf(stderr, "Authentication failed, use option -r:uid:pwd and (re)build with OpenSSL to enable digest authentication\n"); } return r; } if (soap->error) { fprintf(stderr, "\nAn error occurred while parsing schema from '%s'\n", loc ? loc : "(stdin)"); soap_print_fault(soap, stderr); if (soap->error < 200) soap_print_fault_location(soap, stderr); fprintf(stderr, "\nIf this schema namespace is considered \"built-in\", then add\n namespaceprefix = \nto typemap.dat.\n"); exit(1); } openfiles--; fprintf(stderr, "%*sDone reading '%s'\n", 2*openfiles, "", loc ? loc : "(stdin)"); soap_end_recv(soap); if (soap->recvfd > 2) { close(soap->recvfd); soap->recvfd = -1; } else { soap_closesock(soap); } cwd_path = cwd_temp; return SOAP_OK; } void xs__schema::sourceLocation(const char *loc) { location = soap_strdup(soap, loc); } const char *xs__schema::sourceLocation() { return location; } char *xs__schema::absoluteLocation(const char *loc) const { const char *base = location ? location : cwd_path; if (!base) return soap_strdup(soap, loc); if (!strncmp(loc, "http://", 7) || !strncmp(loc, "https://", 8)) return soap_strdup(soap, loc); if (!strncmp(loc, "file://", 7)) loc += 7; const char *s = strrchr(base, '/'); #ifdef WIN32 const char *t = strrchr(base, '\\'); if (!s || s < t) s = t; if (!s) return soap_strdup(soap, loc); while ((!strncmp(loc, "../", 3) || !strncmp(loc, "..\\", 3)) && s > base) { while (--s >= base) { if (*s == '/' || *s == '\\') { if (s[1] != '.') break; if (s[2] == '.' && (s[3] == '/' || s[3] == '\\')) { s += 3; break; } } } loc += 3; } #else if (!s) return soap_strdup(soap, loc); while (!strncmp(loc, "../", 3) && s > base) { while (--s >= base) { if (*s == '/') { if (s[1] != '.') break; if (s[2] == '.' && s[3] == '/') { s += 3; break; } } } loc += 3; } #endif size_t n = s - base + 1; size_t l = n + strlen(loc); char *abs = (char*)soap_malloc(soap, l + 1); soap_strncpy(abs, l + 1, base, n); soap_strcpy(abs + n, l + 1 - n, loc); return abs; } xs__attributeGroup *xs__schema::attributeGroupPtr() const { return attributeGroupRef; } int xs__schema::error() { return soap->error; } void xs__schema::print_fault() { soap_print_fault(soap, stderr); if (soap->error < 200) soap_print_fault_location(soap, stderr); } void xs__schema::builtinType(const char *type) { builtinTypeSet.insert(type); } void xs__schema::builtinTypeDerivation(xs__schema& schema, const char *base, const char *derived) { builtinTypeMap[make_qname(schema, derived)] = base; } void xs__schema::builtinElement(const char *element) { builtinElementSet.insert(element); } void xs__schema::builtinAttribute(const char *attribute) { builtinAttributeSet.insert(attribute); } const SetOfString& xs__schema::builtinTypes() const { return builtinTypeSet; } const MapOfStringToString& xs__schema::builtinTypeDerivations() const { return builtinTypeMap; } const SetOfString& xs__schema::builtinElements() const { return builtinElementSet; } const SetOfString& xs__schema::builtinAttributes() const { return builtinAttributeSet; } bool xs__schema::empty() const { return include.empty() && redefine.empty() && override_.empty() && attribute.empty() && element.empty() && group.empty() && attributeGroup.empty() && simpleType.empty() && complexType.empty(); // empty except for } void xs__schema::mark() { if (Oflag > 1 && !used) { used = true; for (std::vector::iterator im = import.begin(); im != import.end(); ++im) (*im).mark(); // -O2: start with root of usage: use top-level attributes if (Oflag < 3) for (std::vector::iterator at = attribute.begin(); at != attribute.end(); ++at) (*at).mark(); // -O2 and -O3: start with root of usage: use top-level elements if (Oflag < 4) for (std::vector::iterator el = element.begin(); el != element.end(); ++el) (*el).mark(); } } xs__include::xs__include() { schemaLocation = NULL; schemaRef = NULL; } int xs__include::preprocess(xs__schema &schema) { if (!schemaRef) { if (schemaLocation) { // only read from include locations not read already, uses static std::map static std::map included; std::map::iterator i = included.end(); const char *relative_schemaLocation = soap_strdup(schema.soap, schemaLocation); schemaLocation = schema.absoluteLocation(schemaLocation); if (schema.targetNamespace) { for (i = included.begin(); i != included.end(); ++i) { if ((*i).second->targetNamespace && !strcmp(schemaLocation, (*i).first) && !strcmp(schema.targetNamespace, (*i).second->targetNamespace)) break; } } if (i == included.end()) { if (vflag) std::cerr << "Preprocessing schema include '" << (schemaLocation ? schemaLocation : "(null)") << "' into schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << std::endl; schemaRef = new xs__schema(schema.soap); if (!schemaRef) return SOAP_EOF; included[schemaLocation] = schemaRef; schemaRef->read(schema.sourceLocation(), schemaLocation, relative_schemaLocation); if (schema.targetNamespace && (!schemaRef->targetNamespace || strcmp(schema.targetNamespace, schemaRef->targetNamespace))) { if (!Wflag) { if (schemaRef->targetNamespace) fprintf(stderr, "\nWarning: attempt to include schema with mismatching targetNamespace '%s' into schema namespace '%s', assigning targetNamespace '%s'\n", schemaRef->targetNamespace, schema.targetNamespace, schema.targetNamespace); else fprintf(stderr, "\nWarning: attempt to include chameleon schema with no targetNamespace into schema namespace '%s', assigning targetNamespace '%s'\n", schema.targetNamespace, schema.targetNamespace); } } } else { if (vflag) std::cerr << "Schema '" << (schemaLocation ? schemaLocation : "(null)") << "' already included into schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << std::endl; schemaRef = (*i).second; } } else if (!Wflag) { fprintf(stderr, "\nWarning: no schemaLocation in to load schema\n"); } } return SOAP_OK; } int xs__include::traverse(xs__schema &schema) { (void)schema; return SOAP_OK; } void xs__include::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema *xs__include::schemaPtr() const { return schemaRef; } xs__redefine::xs__redefine() { schemaLocation = NULL; schemaRef = NULL; } int xs__redefine::preprocess(xs__schema &schema) { if (vflag) std::cerr << "Preprocessing schema redefine '" << (schemaLocation ? schemaLocation : "(null)") << "' into schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << std::endl; if (!schemaRef) { if (schemaLocation) { const char *relative_schemaLocation = soap_strdup(schema.soap, schemaLocation); schemaLocation = schema.absoluteLocation(schemaLocation); schemaRef = new xs__schema(schema.soap, schema.sourceLocation(), schemaLocation, relative_schemaLocation); // redefine xs:all, xs:choice, or xs:sequence in a group for (std::vector::iterator gp = schemaRef->group.begin(); gp != schemaRef->group.end(); ++gp) { if ((*gp).name) { for (std::vector::const_iterator g = group.begin(); g != group.end(); ++g) { if ((*g).name && !strcmp((*gp).name, (*g).name)) { if ((*g).all) { (*gp).all = (*g).all; } else if ((*g).choice && (*gp).choice) { xs__seqchoice& s = *(*gp).choice; (*gp).choice = soap_new_xs__seqchoice(schema.soap); for (std::vector::iterator c = (*g).choice->__contents.begin(); c != (*g).choice->__contents.end(); ) { if ((*c).__union == SOAP_UNION_xs__union_content_element) { (*gp).choice->__contents.push_back(*c); ++c; } else if ((*c).__union == SOAP_UNION_xs__union_content_group) { if ((*c).__content.group->ref) { const char *token = qname_token((*c).__content.group->ref, schema.targetNamespace); if (token && !strcmp((*gp).name, token)) for (std::vector::const_iterator d = s.__contents.begin(); d != s.__contents.end(); ++d) if ((*d).__union == SOAP_UNION_xs__union_content_element) (*gp).choice->__contents.push_back(*d); (*g).choice->__contents.erase(c); } } else { ++c; } } } else if ((*g).sequence && (*gp).sequence) { xs__seqchoice& s = *(*gp).sequence; (*gp).sequence = soap_new_xs__seqchoice(schema.soap); for (std::vector::iterator c = (*g).sequence->__contents.begin(); c != (*g).sequence->__contents.end(); ) { if ((*c).__union == SOAP_UNION_xs__union_content_element) { (*gp).sequence->__contents.push_back(*c); ++c; } else if ((*c).__union == SOAP_UNION_xs__union_content_group) { if ((*c).__content.group->ref) { const char *token = qname_token((*c).__content.group->ref, schema.targetNamespace); if (token && !strcmp((*gp).name, token)) for (std::vector::const_iterator d = s.__contents.begin(); d != s.__contents.end(); ++d) if ((*d).__union == SOAP_UNION_xs__union_content_element) (*gp).sequence->__contents.push_back(*d); (*g).sequence->__contents.erase(c); } } else { ++c; } } } break; } } } } // redefine specified attributes in an attributeGroup for (std::vector::iterator ag = schemaRef->attributeGroup.begin(); ag != schemaRef->attributeGroup.end(); ++ag) { if ((*ag).name) { for (std::vector::const_iterator g = attributeGroup.begin(); g != attributeGroup.end(); ++g) { if ((*g).name && !strcmp((*ag).name, (*g).name)) { for (std::vector::const_iterator ga = (*g).attribute.begin(); ga != (*g).attribute.end(); ++ga) { if ((*ga).name) { bool found = false; for (std::vector::iterator aga = (*ag).attribute.begin(); aga != (*ag).attribute.end(); ++aga) { if ((*aga).name && !strcmp((*aga).name, (*ga).name)) { *aga = *ga; found = true; break; } } if (!found) (*ag).attribute.push_back(*ga); } } } } } } // redefine simpleType for (std::vector::iterator st = schemaRef->simpleType.begin(); st != schemaRef->simpleType.end(); ++st) { if ((*st).name) { for (std::vector::const_iterator s = simpleType.begin(); s != simpleType.end(); ++s) { if ((*s).name && !strcmp((*st).name, (*s).name)) { char *base = (*st).restriction ? (*st).restriction->base : (char*)"xs:string"; *st = *s; (*st).restriction->base = base; break; } } } } // redefine complexType by extension/restriction for (std::vector::iterator ct = schemaRef->complexType.begin(); ct != schemaRef->complexType.end(); ++ct) { if ((*ct).name) { for (std::vector::const_iterator c = complexType.begin(); c != complexType.end(); ++c) { if ((*c).name && !strcmp((*ct).name, (*c).name)) { if ((*c).complexContent && (*c).complexContent->extension && qname_token((*c).complexContent->extension->base, schemaRef->targetNamespace)) { if ((*ct).all && (*c).complexContent->extension->all) { (*ct).all->element.insert((*ct).all->element.end(), (*c).complexContent->extension->all->element.begin(), (*c).complexContent->extension->all->element.end()); } else if ((*ct).choice && (*c).complexContent->extension->choice) { (*ct).choice->__contents.insert((*ct).choice->__contents.end(), (*c).complexContent->extension->choice->__contents.begin(), (*c).complexContent->extension->choice->__contents.end()); } else if ((*ct).sequence && (*c).complexContent->extension->sequence) { (*ct).sequence->__contents.insert((*ct).sequence->__contents.end(), (*c).complexContent->extension->sequence->__contents.begin(), (*c).complexContent->extension->sequence->__contents.end()); } else if ((*ct).group && (*c).complexContent->extension->group) { if ((*ct).group->sequence && (*c).complexContent->extension->group->sequence) (*ct).group->sequence->__contents.insert((*ct).group->sequence->__contents.end(), (*c).complexContent->extension->group->sequence->__contents.begin(), (*c).complexContent->extension->group->sequence->__contents.end()); } else if ((*ct).complexContent && (*ct).complexContent->extension) { if ((*ct).complexContent->extension->all && (*c).complexContent->extension->all) { (*ct).complexContent->extension->all->element.insert((*ct).complexContent->extension->all->element.end(), (*c).complexContent->extension->all->element.begin(), (*c).complexContent->extension->all->element.end()); } else if ((*ct).complexContent->extension->choice && (*c).complexContent->extension->choice) { (*ct).complexContent->extension->choice->__contents.insert((*ct).complexContent->extension->choice->__contents.end(), (*c).complexContent->extension->choice->__contents.begin(), (*c).complexContent->extension->choice->__contents.end()); } else if ((*ct).complexContent->extension->sequence && (*c).complexContent->extension->sequence) { (*ct).complexContent->extension->sequence->__contents.insert((*ct).complexContent->extension->sequence->__contents.end(), (*c).complexContent->extension->sequence->__contents.begin(), (*c).complexContent->extension->sequence->__contents.end()); } else if ((*ct).complexContent->extension->group && (*c).complexContent->extension->group) { if ((*ct).complexContent->extension->group->sequence && (*c).complexContent->extension->group->sequence) (*ct).complexContent->extension->group->sequence->__contents.insert((*ct).complexContent->extension->group->sequence->__contents.end(), (*c).complexContent->extension->group->sequence->__contents.begin(), (*c).complexContent->extension->group->sequence->__contents.end()); } else { (*ct).complexContent->extension->all = (*c).complexContent->extension->all; (*ct).complexContent->extension->choice = (*c).complexContent->extension->choice; (*ct).complexContent->extension->sequence = (*c).complexContent->extension->sequence; (*ct).complexContent->extension->group = (*c).complexContent->extension->group; } } else if ((*ct).complexContent && (*ct).complexContent->restriction) { if ((*ct).complexContent->restriction->all && (*c).complexContent->extension->all) { (*ct).complexContent->restriction->all->element.insert((*ct).complexContent->restriction->all->element.end(), (*c).complexContent->extension->all->element.begin(), (*c).complexContent->extension->all->element.end()); } else if ((*ct).complexContent->restriction->choice && (*c).complexContent->extension->choice) { (*ct).complexContent->restriction->choice->__contents.insert((*ct).complexContent->restriction->choice->__contents.end(), (*c).complexContent->extension->choice->__contents.begin(), (*c).complexContent->extension->choice->__contents.end()); } else if ((*ct).complexContent->restriction->sequence && (*c).complexContent->extension->sequence) { (*ct).complexContent->restriction->sequence->__contents.insert((*ct).complexContent->restriction->sequence->__contents.end(), (*c).complexContent->extension->sequence->__contents.begin(), (*c).complexContent->extension->sequence->__contents.end()); } else if ((*ct).complexContent->restriction->group && (*c).complexContent->extension->group) { if ((*ct).complexContent->restriction->group->sequence && (*c).complexContent->restriction->group->sequence) (*ct).complexContent->restriction->group->sequence->__contents.insert((*ct).complexContent->restriction->group->sequence->__contents.end(), (*c).complexContent->extension->group->sequence->__contents.begin(), (*c).complexContent->extension->group->sequence->__contents.end()); } else { (*ct).complexContent->restriction->all = (*c).complexContent->extension->all; (*ct).complexContent->restriction->choice = (*c).complexContent->extension->choice; (*ct).complexContent->restriction->sequence = (*c).complexContent->extension->sequence; (*ct).complexContent->restriction->group = (*c).complexContent->extension->group; } } else { (*ct).all = (*c).complexContent->extension->all; (*ct).choice = (*c).complexContent->extension->choice; (*ct).sequence = (*c).complexContent->extension->sequence; (*ct).group = (*c).complexContent->extension->group; } (*ct).attribute.insert((*ct).attribute.begin(), (*c).complexContent->extension->attribute.begin(), (*c).complexContent->extension->attribute.end()); } else if ((*c).complexContent && (*c).complexContent->restriction && qname_token((*c).complexContent->restriction->base, schemaRef->targetNamespace)) { (*ct).all = (*c).complexContent->restriction->all; (*ct).choice = (*c).complexContent->restriction->choice; (*ct).sequence = (*c).complexContent->restriction->sequence; (*ct).group = (*c).complexContent->restriction->group; (*ct).attribute = (*c).complexContent->restriction->attribute; (*ct).complexContent = NULL; } else { if (!Wflag) fprintf(stderr, "\nWarning: redefining complexType \"%s\" in schema \"%s\" by extension requires an extension base\n", (*ct).name, schemaRef->targetNamespace ? schemaRef->targetNamespace : "(null)"); } break; } } } } } else if (!Wflag) { fprintf(stderr, "\nWarning: no schemaLocation in to load schema\n"); } } return SOAP_OK; } int xs__redefine::traverse(xs__schema &schema) { (void)schema; return SOAP_OK; } void xs__redefine::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema *xs__redefine::schemaPtr() const { return schemaRef; } xs__override::xs__override() { schemaLocation = NULL; schemaRef = NULL; } int xs__override::preprocess(xs__schema &schema) { if (vflag) std::cerr << "Preprocessing schema override '" << (schemaLocation ? schemaLocation : "(null)") << "' into schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << std::endl; if (!schemaRef) { if (schemaLocation) { const char *relative_schemaLocation = soap_strdup(schema.soap, schemaLocation); schemaLocation = schema.absoluteLocation(schemaLocation); schemaRef = new xs__schema(schema.soap, schema.sourceLocation(), schemaLocation, relative_schemaLocation); for (std::vector::iterator el = schemaRef->element.begin(); el != schemaRef->element.end(); ++el) { if ((*el).name) { for (std::vector::const_iterator e = element.begin(); e != element.end(); ++e) { if ((*e).name && !strcmp((*el).name, (*e).name)) { *el = *e; break; } } } } for (std::vector::iterator at = schemaRef->attribute.begin(); at != schemaRef->attribute.end(); ++at) { if ((*at).name) { for (std::vector::const_iterator a = attribute.begin(); a != attribute.end(); ++a) { if ((*a).name && !strcmp((*at).name, (*a).name)) { *at = *a; break; } } } } for (std::vector::iterator gp = schemaRef->group.begin(); gp != schemaRef->group.end(); ++gp) { if ((*gp).name) { for (std::vector::const_iterator g = group.begin(); g != group.end(); ++g) { if ((*g).name && !strcmp((*gp).name, (*g).name)) { *gp = *g; break; } } } } for (std::vector::iterator ag = schemaRef->attributeGroup.begin(); ag != schemaRef->attributeGroup.end(); ++ag) { if ((*ag).name) { for (std::vector::const_iterator g = attributeGroup.begin(); g != attributeGroup.end(); ++g) { if ((*g).name && !strcmp((*ag).name, (*g).name)) { *ag = *g; break; } } } } for (std::vector::iterator st = schemaRef->simpleType.begin(); st != schemaRef->simpleType.end(); ++st) { if ((*st).name) { for (std::vector::const_iterator s = simpleType.begin(); s != simpleType.end(); ++s) { if ((*s).name && !strcmp((*st).name, (*s).name)) { *st = *s; break; } } } } for (std::vector::iterator ct = schemaRef->complexType.begin(); ct != schemaRef->complexType.end(); ++ct) { if ((*ct).name) { for (std::vector::const_iterator c = complexType.begin(); c != complexType.end(); ++c) { if ((*c).name && !strcmp((*ct).name, (*c).name)) { *ct = *c; break; } } } } } else if (!Wflag) { fprintf(stderr, "\nWarning: no schemaLocation in to load schema\n"); } } return SOAP_OK; } int xs__override::traverse(xs__schema &schema) { (void)schema; return SOAP_OK; } void xs__override::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema *xs__override::schemaPtr() const { return schemaRef; } xs__import::xs__import() { namespace_ = NULL; schemaLocation = NULL; location = NULL; // work around a Microsoft WSDL bug uses @location instead of @schemaLocation in WSDLs schemaRef = NULL; } int xs__import::preprocess(xs__schema &schema) { // work around a Microsoft bug that uses @location instead of @schemaLocation in WSDLs if (!schemaLocation && location) schemaLocation = location; if (vflag) std::cerr << " Preprocessing schema import '" << (namespace_ ? namespace_ : "(null)") << "'" << std::endl; if (!schemaRef) { bool found = false; if (namespace_) { for (SetOfString::const_iterator i = exturis.begin(); i != exturis.end(); ++i) { if (!soap_tag_cmp(namespace_, *i)) { found = true; break; } } } else if (!Wflag) { fprintf(stderr, "\nWarning: no namespace in \n"); } if (!found && !iflag) // don't import any of the schemas in the .nsmap table (or when -i option is used) { if (schemaLocation) { schemaLocation = schema.absoluteLocation(schemaLocation); // only read from import locations not read already, uses static std::map static std::map included; std::map::iterator i = included.find(schemaLocation); const char *relative_schemaLocation = soap_strdup(schema.soap, schemaLocation); if (i == included.end()) { included[schemaLocation] = schemaRef = new xs__schema(schema.soap); schemaRef->read(schema.sourceLocation(), schemaLocation, relative_schemaLocation); } else { schemaRef = (*i).second; } if (schemaRef) { if (!schemaRef->targetNamespace || !*schemaRef->targetNamespace) schemaRef->targetNamespace = namespace_; else if (!namespace_ || strcmp(schemaRef->targetNamespace, namespace_)) if (!Wflag) fprintf(stderr, "\nWarning: schema import '%s' with schema targetNamespace '%s' mismatch\n", namespace_ ? namespace_ : "(null)", schemaRef->targetNamespace); } } } } return SOAP_OK; } int xs__import::traverse(xs__schema &schema) { (void)schema; if (schemaRef) schemaRef->traverse(); return SOAP_OK; } void xs__import::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema *xs__import::schemaPtr() const { return schemaRef; } void xs__import::mark() { if (Oflag > 1) if (schemaPtr()) schemaPtr()->mark(); } xs__attribute::xs__attribute() { schemaRef = NULL; attributeRef = NULL; simpleTypeRef = NULL; used = false; } int xs__attribute::traverse(xs__schema &schema) { if (vflag) std::cerr << " Analyzing schema attribute '" << (name ? name : "(null)") << "'" << std::endl; schemaRef = &schema; const char *token = qname_token(ref, schema.targetNamespace); attributeRef = NULL; if (token) { for (std::vector::iterator i = schema.attribute.begin(); i != schema.attribute.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { attributeRef = &(*i); if (vflag) std::cerr << " Found attribute '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << std::endl; break; } } } if (!attributeRef) { for (std::vector::iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(ref, s->targetNamespace); if (token) { for (std::vector::iterator j = s->attribute.begin(); j != s->attribute.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { attributeRef = &(*j); if (vflag) std::cerr << " Found attribute '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (attributeRef) break; } } } } if (simpleType) { simpleType->traverse(schema); simpleTypeRef = simpleType; } else { token = qname_token(type, schema.targetNamespace); simpleTypeRef = NULL; if (token) { for (std::vector::iterator i = schema.simpleType.begin(); i != schema.simpleType.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { simpleTypeRef = &(*i); if (vflag) std::cerr << " Found attribute '" << (name ? name : "(null)") << "' type '" << (token ? token : "(null)") << "'" << std::endl; break; } } } if (!simpleTypeRef) { for (std::vector::iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(type, s->targetNamespace); if (token) { for (std::vector::iterator j = s->simpleType.begin(); j != s->simpleType.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { simpleTypeRef = &(*j); if (vflag) std::cerr << " Found attribute '" << (name ? name : "(null)") << "' type '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (simpleTypeRef) break; } } } } } if (!attributeRef && !simpleTypeRef) { if (ref) { if (is_builtin_qname(ref)) schema.builtinAttribute(ref); else if (!Wflag) std::cerr << "\nWarning: could not find the referenced attribute '" << (name ? name : "") << "' ref '" << ref << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << std::endl; /* moved to restriction::traverse() if (wsdl__arrayType) { char *arrayType = soap_strdup(schema.soap, wsdl__arrayType); char *s = strchr(arrayType, '['); if (s) *s = '\0'; if (is_builtin_qname(arrayType)) schema.builtinType(arrayType); } */ } else if (type) { if (is_builtin_qname(type)) schema.builtinType(type); else if (!Wflag) std::cerr << "\nWarning: could not find the type for attribute '" << (name ? name : "(null)") << "' type '" << type << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << std::endl; } } return SOAP_OK; } void xs__attribute::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema* xs__attribute::schemaPtr() const { return schemaRef; } void xs__attribute::attributePtr(xs__attribute *attribute) { attributeRef = attribute; } void xs__attribute::simpleTypePtr(xs__simpleType *simpleType) { simpleTypeRef = simpleType; } xs__attribute *xs__attribute::attributePtr() const { return attributeRef; } xs__simpleType *xs__attribute::simpleTypePtr() const { return simpleTypeRef; } void xs__attribute::mark() { if (Oflag > 1 && !used) { used = true; if (attributePtr()) attributePtr()->mark(); if (simpleTypePtr()) simpleTypePtr()->mark(); } } bool xs__attribute::is_used() const { return used; } xs__element::xs__element() { schemaRef = NULL; elementRef = NULL; simpleTypeRef = NULL; complexTypeRef = NULL; name = NULL; ref = NULL; type = NULL; default_ = NULL; default__ = NULL; fixed = NULL; fixed_ = NULL; form = NULL; nillable = false; abstract = false; substitutionGroup = NULL; minOccurs = NULL; maxOccurs = NULL; xmime__expectedContentTypes = NULL; annotation = NULL; simpleType = NULL; complexType = NULL; unique = NULL; used = false; } int xs__element::traverse(xs__schema &schema) { if (vflag) std::cerr << " Analyzing schema element '" << (name ? name : "(null)") << "'" << std::endl; schemaRef = &schema; const char *token = qname_token(ref, schema.targetNamespace); elementRef = NULL; if (token) { for (std::vector::iterator i = schema.element.begin(); i != schema.element.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { elementRef = &(*i); if (vflag) std::cerr << " Found element '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << std::endl; break; } } } if (!elementRef) { for (std::vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(ref, s->targetNamespace); if (token) { for (std::vector::iterator j = s->element.begin(); j != s->element.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { elementRef = &(*j); if (vflag) std::cerr << " Found element '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (elementRef) break; } } } } if (simpleType) { simpleType->traverse(schema); simpleTypeRef = simpleType; } else { token = qname_token(type, schema.targetNamespace); simpleTypeRef = NULL; if (token) { for (std::vector::iterator i = schema.simpleType.begin(); i != schema.simpleType.end(); ++i) if ((*i).name && !strcmp((*i).name, token)) { simpleTypeRef = &(*i); if (vflag) std::cerr << " Found element '" << (name ? name : "(null)") << "' simpleType '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (!simpleTypeRef) { for (std::vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(type, s->targetNamespace); if (token) { for (std::vector::iterator j = s->simpleType.begin(); j != s->simpleType.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { simpleTypeRef = &(*j); if (vflag) std::cerr << " Found element '" << (name ? name : "(null)") << "' simpleType '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (simpleTypeRef) break; } } } } } if (complexType) { complexType->traverse(schema); complexTypeRef = complexType; } else { token = qname_token(type, schema.targetNamespace); complexTypeRef = NULL; if (token) { for (std::vector::iterator i = schema.complexType.begin(); i != schema.complexType.end(); ++i) if ((*i).name && !strcmp((*i).name, token)) { complexTypeRef = &(*i); if (vflag) std::cerr << " Found element '" << (name ? name : "(null)") << "' complexType '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (!complexTypeRef) { for (std::vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(type, s->targetNamespace); if (token) { for (std::vector::iterator j = s->complexType.begin(); j != s->complexType.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { complexTypeRef = &(*j); if (vflag) std::cerr << " Found element '" << (name ? name : "(null)") << "' complexType '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (complexTypeRef) break; } } } } } if (!abstract && substitutionGroup) { token = qname_token(substitutionGroup, schema.targetNamespace); if (token) { for (std::vector::iterator i = schema.element.begin(); i != schema.element.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { xs__element *elt = this; if (!elementPtr()) { elt = soap_new_xs__element(schema.soap); elt->soap_default(schema.soap); elt->name = name; elt->form = form; elt->elementPtr(this); // create element ref in substitutionGroup elt->schemaPtr(schemaPtr()); elt->targetNamespace = NULL; } (*i).substitutions.push_back(elt); if (vflag) std::cerr << " Found substitutionGroup element '" << (name ? name : "(null)") << "' for element '" << (token ? token : "(null)") << "'" << std::endl; break; } } } for (std::vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(substitutionGroup, s->targetNamespace); if (token) { for (std::vector::iterator j = s->element.begin(); j != s->element.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { xs__element *elt = this; if (!elementPtr()) { elt = soap_new_xs__element(schema.soap); elt->soap_default(schema.soap); elt->name = name; elt->form = form; elt->elementPtr(this); // create element ref in substitutionGroup elt->schemaPtr(schemaPtr()); elt->targetNamespace = NULL; } (*j).substitutions.push_back(elt); if (vflag) std::cerr << " Found substitutionGroup element '" << (name ? name : "(null)") << "' for element '" << (token ? token : "(null)") << "' in '" << s->targetNamespace << "'" << std::endl; break; } } } } } } if (!elementRef && !simpleTypeRef && !complexTypeRef) { if (ref) { if (is_builtin_qname(ref)) schema.builtinElement(ref); else if (!Wflag) std::cerr << "\nWarning: could not find the referenced element '" << (name ? name : "") << "' ref '" << ref << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << std::endl; } else if (type) { if (is_builtin_qname(type)) schema.builtinType(type); else if (!Wflag) std::cerr << "\nWarning: could not find the type for element '" << (name ? name : "(null)") << "' type '" << type << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << std::endl; } } return SOAP_OK; } void xs__element::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema* xs__element::schemaPtr() const { return schemaRef; } void xs__element::elementPtr(xs__element *element) { elementRef = element; } void xs__element::simpleTypePtr(xs__simpleType *simpleType) { simpleTypeRef = simpleType; } void xs__element::complexTypePtr(xs__complexType *complexType) { complexTypeRef = complexType; } xs__element *xs__element::elementPtr() const { return elementRef; } const std::vector* xs__element::substitutionsPtr() const { return &substitutions; } xs__simpleType *xs__element::simpleTypePtr() const { return simpleTypeRef; } xs__complexType *xs__element::complexTypePtr() const { return complexTypeRef; } void xs__element::mark() { if (Oflag > 1 && !used) { used = true; if (elementPtr()) elementPtr()->mark(); if (simpleTypePtr()) simpleTypePtr()->mark(); if (complexTypePtr()) complexTypePtr()->mark(); for (std::vector::iterator i = substitutions.begin(); i != substitutions.end(); ++i) if ((*i)->elementPtr()) (*i)->elementPtr()->mark(); } } bool xs__element::is_used() const { return used; } xs__simpleType::xs__simpleType() { schemaRef = NULL; level = 0; used = false; } int xs__simpleType::traverse(xs__schema &schema) { if (vflag) std::cerr << " Analyzing schema simpleType '" << (name ? name : "(null)") << "'" << std::endl; schemaRef = &schema; if (list) { list->traverse(schema); } else if (restriction) { restriction->traverse(schema); if (name) { xs__simpleType *base = restriction->simpleTypePtr(); if (base) base->add_restriction(schema, name); else if (is_builtin_qname(restriction->base)) schema.builtinTypeDerivation(schema, restriction->base, name); } } else if (union_) { union_->traverse(schema); } return SOAP_OK; } void xs__simpleType::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema *xs__simpleType::schemaPtr() const { return schemaRef; } int xs__simpleType::baseLevel() { if (!level) { if (restriction) { level = -1; if (restriction->simpleTypePtr()) level = restriction->simpleTypePtr()->baseLevel() + 1; else level = 2; } else if (list && list->restriction) { level = -1; if (list->restriction->simpleTypePtr()) level = list->restriction->simpleTypePtr()->baseLevel() + 1; else level = 2; } else level = 1; } else if (level < 0) { std::cerr << "Error: cyclic simpleType restriction/extension base dependency in '" << (name ? name : "(null)") << "'" << std::endl; } return level; } void xs__simpleType::mark() { if (Oflag > 1 && !used) { used = true; if (restriction) restriction->mark(); else if (list) list->mark(); else if (union_) union_->mark(); if (Owflag) for (std::vector::const_iterator i = complextype_extensions.begin(); i != complextype_extensions.end(); ++i) (*i)->mark(); } } bool xs__simpleType::is_used() const { return used; } void xs__simpleType::add_extension(xs__complexType *complexType, xs__schema& schema, xsd__NCName name) { complextype_extensions.push_back(complexType); extensions.push_back(make_qname(schema, name)); } void xs__simpleType::add_restriction(xs__schema& schema, xsd__NCName name) { restrictions.push_back(make_qname(schema, name)); } const std::vector& xs__simpleType::get_extensions() const { return extensions; } const std::vector& xs__simpleType::get_restrictions() const { return restrictions; } xs__complexType::xs__complexType() { schemaRef = NULL; level = 0; used = false; } int xs__complexType::traverse(xs__schema &schema) { if (vflag) std::cerr << " Analyzing schema complexType '" << (name ? name : "(null)") << "'" << std::endl; schemaRef = &schema; if (simpleContent) { simpleContent->traverse(schema); if (name) { if (simpleContent->extension) { xs__complexType *ct_base = simpleContent->extension->complexTypePtr(); if (ct_base) { ct_base->add_extension(this, schema, name); } else { xs__simpleType *st_base = simpleContent->extension->simpleTypePtr(); if (st_base) st_base->add_extension(this, schema, name); else if (is_builtin_qname(simpleContent->extension->base)) schema.builtinTypeDerivation(schema, simpleContent->extension->base, name); } } else if (simpleContent->restriction) { xs__complexType *ct_base = simpleContent->restriction->complexTypePtr(); if (ct_base) { ct_base->add_restriction(schema, name); } else { xs__simpleType *st_base = simpleContent->restriction->simpleTypePtr(); if (st_base) st_base->add_restriction(schema, name); else if (is_builtin_qname(simpleContent->restriction->base)) schema.builtinTypeDerivation(schema, simpleContent->restriction->base, name); } } } } else if (complexContent) { complexContent->traverse(schema); if (name) { if (complexContent->extension) { xs__complexType *ct_base = complexContent->extension->complexTypePtr(); if (ct_base) ct_base->add_extension(this, schema, name); } else if (complexContent->restriction) { xs__complexType *ct_base = complexContent->restriction->complexTypePtr(); if (ct_base) ct_base->add_restriction(schema, name); } } } else if (all) { all->traverse(schema); } else if (choice) { choice->traverse(schema); } else if (sequence) { sequence->traverse(schema); } else if (group) { group->traverse(schema); } else if (any) { any->traverse(schema); } for (std::vector::iterator at = attribute.begin(); at != attribute.end(); ++at) (*at).traverse(schema); for (std::vector::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) (*ag).traverse(schema); return SOAP_OK; } void xs__complexType::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema *xs__complexType::schemaPtr() const { return schemaRef; } int xs__complexType::baseLevel() { if (!level) { if (simpleContent) { if (simpleContent->restriction) { level = -1; if (simpleContent->restriction->simpleTypePtr()) level = simpleContent->restriction->simpleTypePtr()->baseLevel() + 1; else if (simpleContent->restriction->complexTypePtr()) level = simpleContent->restriction->complexTypePtr()->baseLevel() + 1; else level = 2; } else if (simpleContent->extension) { level = -1; if (simpleContent->extension->simpleTypePtr()) level = simpleContent->extension->simpleTypePtr()->baseLevel() + 1; else if (simpleContent->extension->complexTypePtr()) level = simpleContent->extension->complexTypePtr()->baseLevel() + 1; else level = 2; } } else if (complexContent) { if (complexContent->restriction) { level = -1; if (complexContent->restriction->simpleTypePtr()) level = complexContent->restriction->simpleTypePtr()->baseLevel() + 1; else if (complexContent->restriction->complexTypePtr()) level = complexContent->restriction->complexTypePtr()->baseLevel() + 1; else level = 2; } else if (complexContent->extension) { level = -1; if (complexContent->extension->simpleTypePtr()) level = complexContent->extension->simpleTypePtr()->baseLevel() + 1; else if (complexContent->extension->complexTypePtr()) level = complexContent->extension->complexTypePtr()->baseLevel() + 1; else level = 2; } } else level = 1; } else if (level < 0) { std::cerr << "Error: cyclic complexType restriction/extension base dependency in '" << (name ? name : "(null)") << "'" << std::endl; } return level; } void xs__complexType::mark() { if (Oflag > 1 && !used) { used = true; if (simpleContent) simpleContent->mark(); else if (complexContent) complexContent->mark(); else if (all) all->mark(); else if (choice) choice->mark(); else if (sequence) sequence->mark(); else if (group) group->mark(); else if (any) any->mark(); for (std::vector::iterator at = attribute.begin(); at != attribute.end(); ++at) (*at).mark(); for (std::vector::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) (*ag).mark(); if (Owflag) for (std::vector::const_iterator i = complextype_extensions.begin(); i != complextype_extensions.end(); ++i) (*i)->mark(); } } bool xs__complexType::is_used() const { return used; } void xs__complexType::add_extension(xs__complexType *complexType, xs__schema& schema, xsd__NCName name) { complextype_extensions.push_back(complexType); extensions.push_back(make_qname(schema, name)); } void xs__complexType::add_restriction(xs__schema& schema, xsd__NCName name) { restrictions.push_back(make_qname(schema, name)); } const std::vector& xs__complexType::get_extensions() const { return extensions; } const std::vector& xs__complexType::get_restrictions() const { return restrictions; } int xs__simpleContent::traverse(xs__schema &schema) { if (vflag) std::cerr << " Analyzing schema simpleContent" << std::endl; if (extension) extension->traverse(schema); else if (restriction) restriction->traverse(schema); return SOAP_OK; } void xs__simpleContent::mark() { if (Oflag > 1) { if (extension) extension->mark(); else if (restriction) restriction->mark(); } } int xs__complexContent::traverse(xs__schema &schema) { if (vflag) std::cerr << " Analyzing schema complexContent" << std::endl; if (extension) extension->traverse(schema); else if (restriction) restriction->traverse(schema); return SOAP_OK; } void xs__complexContent::mark() { if (Oflag > 1) { if (extension) extension->mark(); else if (restriction) restriction->mark(); } } xs__extension::xs__extension() { simpleTypeRef = NULL; complexTypeRef = NULL; } int xs__extension::traverse(xs__schema &schema) { if (vflag) std::cerr << " Analyzing schema extension '" << (base ? base : "(null)") << "'" << std::endl; if (group) group->traverse(schema); else if (all) all->traverse(schema); else if (choice) choice->traverse(schema); else if (sequence) sequence->traverse(schema); for (std::vector::iterator at = attribute.begin(); at != attribute.end(); ++at) (*at).traverse(schema); for (std::vector::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) (*ag).traverse(schema); const char *token = qname_token(base, schema.targetNamespace); simpleTypeRef = NULL; if (token) { for (std::vector::iterator i = schema.simpleType.begin(); i != schema.simpleType.end(); ++i) if ((*i).name && !strcmp((*i).name, token)) { simpleTypeRef = &(*i); if (vflag) std::cerr << " Found extension base type '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (!simpleTypeRef) { for (std::vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(base, s->targetNamespace); if (token) { for (std::vector::iterator j = s->simpleType.begin(); j != s->simpleType.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { simpleTypeRef = &(*j); if (vflag) std::cerr << " Found extension base type '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (simpleTypeRef) break; } } } } token = qname_token(base, schema.targetNamespace); complexTypeRef = NULL; if (token) { for (std::vector::iterator i = schema.complexType.begin(); i != schema.complexType.end(); ++i) if ((*i).name && !strcmp((*i).name, token)) { complexTypeRef = &(*i); if (vflag) std::cerr << " Found extension base type '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (!complexTypeRef) { for (std::vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(base, s->targetNamespace); if (token) { for (std::vector::iterator j = s->complexType.begin(); j != s->complexType.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { complexTypeRef = &(*j); if (vflag) std::cerr << " Found extension base type '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (complexTypeRef) break; } } } } if (!simpleTypeRef && !complexTypeRef) { if (base) { if (is_builtin_qname(base)) schema.builtinType(base); else if (!Wflag) std::cerr << "\nWarning: could not find extension base type '" << base << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << std::endl; } else std::cerr << "Extension has no base" << std::endl; } return SOAP_OK; } void xs__extension::simpleTypePtr(xs__simpleType *simpleType) { simpleTypeRef = simpleType; } void xs__extension::complexTypePtr(xs__complexType *complexType) { complexTypeRef = complexType; } void xs__extension::mark() { if (Oflag > 1) { if (simpleTypePtr()) simpleTypePtr()->mark(); if (complexTypePtr()) complexTypePtr()->mark(); if (group) group->mark(); else if (all) all->mark(); else if (choice) choice->mark(); else if (sequence) sequence->mark(); for (std::vector::iterator at = attribute.begin(); at != attribute.end(); ++at) (*at).mark(); for (std::vector::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) (*ag).mark(); } } xs__simpleType *xs__extension::simpleTypePtr() const { return simpleTypeRef; } xs__complexType *xs__extension::complexTypePtr() const { return complexTypeRef; } xs__restriction::xs__restriction() { simpleTypeRef = NULL; complexTypeRef = NULL; simpleArrayTypeRef = NULL; complexArrayTypeRef = NULL; } int xs__restriction::traverse(xs__schema &schema) { if (vflag) std::cerr << " Analyzing schema restriction '" << (base ? base : "(null)") << "'" << std::endl; if (simpleType) simpleType->traverse(schema); if (attributeGroup) attributeGroup->traverse(schema); if (group) group->traverse(schema); else if (all) all->traverse(schema); else if (choice) choice->traverse(schema); else if (sequence) sequence->traverse(schema); else { for (std::vector::iterator en = enumeration.begin(); en != enumeration.end(); ++en) (*en).traverse(schema); for (std::vector::iterator pn = pattern.begin(); pn != pattern.end(); ++pn) (*pn).traverse(schema); } for (std::vector::iterator at = attribute.begin(); at != attribute.end(); ++at) { (*at).traverse(schema); if ((*at).wsdl__arrayType) { char *arrayType = soap_strdup(schema.soap, (*at).wsdl__arrayType); char *r = strchr(arrayType, '['); if (r) *r = '\0'; #if 0 /* one work-around for incomplete schemas with SOAP arrays defined solely by wsdl:arrayType is to add sequence/element with type but this creates __ptritem */ if (!sequence) { std::cerr << "ADDED sequence/element for array\n"; sequence = soap_new_xs__seqchoice(schema.soap); sequence->soap_default(schema.soap); xs__contents ct; ct.__union = SOAP_UNION_xs__union_content_element; ct.__content.element = soap_new_xs__element(schema.soap); ct.__content.element->soap_default(schema.soap); ct.__content.element->name = soap_strdup(schema.soap, "item"); ct.__content.element->type = arrayType; ct.__content.element->minOccurs = soap_strdup(schema.soap, "0"); ct.__content.element->maxOccurs = soap_strdup(schema.soap, "unbounded"); sequence->__contents.push_back(ct); sequence->traverse(schema); } #else /* another way is to add simpleArrayTypeRef and complexArrayTypeRef */ const char *token = qname_token(arrayType, schema.targetNamespace); simpleArrayTypeRef = NULL; if (token) { for (std::vector::iterator i = schema.simpleType.begin(); i != schema.simpleType.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { simpleArrayTypeRef = &(*i); if (vflag) std::cerr << " Found restriction array type '" << (token ? token : "(null)") << "'" << std::endl; break; } } } if (!simpleArrayTypeRef) { for (std::vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(arrayType, s->targetNamespace); if (token) { for (std::vector::iterator j = s->simpleType.begin(); j != s->simpleType.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { simpleArrayTypeRef = &(*j); if (vflag) std::cerr << " Found restriction array type '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (simpleArrayTypeRef) break; } } } } token = qname_token(arrayType, schema.targetNamespace); complexArrayTypeRef = NULL; if (token) { for (std::vector::iterator i = schema.complexType.begin(); i != schema.complexType.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { complexArrayTypeRef = &(*i); if (vflag) std::cerr << " Found restriction array type '" << (token ? token : "(null)") << "'" << std::endl; break; } } } if (!complexArrayTypeRef) { for (std::vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(arrayType, s->targetNamespace); if (token) { for (std::vector::iterator j = s->complexType.begin(); j != s->complexType.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { complexArrayTypeRef = &(*j); if (vflag) std::cerr << " Found restriction array type '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (complexArrayTypeRef) break; } } } } if (!simpleArrayTypeRef && !complexArrayTypeRef) { if (is_builtin_qname(arrayType)) schema.builtinType(arrayType); else if (!Wflag) std::cerr << "\nWarning: could not find restriction array type '" << arrayType << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << std::endl; } #endif } } const char *token = qname_token(base, schema.targetNamespace); simpleTypeRef = NULL; if (token) { for (std::vector::iterator i = schema.simpleType.begin(); i != schema.simpleType.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { simpleTypeRef = &(*i); if (vflag) std::cerr << " Found restriction base type '" << (token ? token : "(null)") << "'" << std::endl; break; } } } if (!simpleTypeRef) { for (std::vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(base, s->targetNamespace); if (token) { for (std::vector::iterator j = s->simpleType.begin(); j != s->simpleType.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { simpleTypeRef = &(*j); if (vflag) std::cerr << " Found restriction base type '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (simpleTypeRef) break; } } } } token = qname_token(base, schema.targetNamespace); complexTypeRef = NULL; if (token) { for (std::vector::iterator i = schema.complexType.begin(); i != schema.complexType.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { complexTypeRef = &(*i); if (vflag) std::cerr << " Found restriction base type '" << (token ? token : "(null)") << "'" << std::endl; break; } } } if (!complexTypeRef) { for (std::vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(base, s->targetNamespace); if (token) { for (std::vector::iterator j = s->complexType.begin(); j != s->complexType.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { complexTypeRef = &(*j); if (vflag) std::cerr << " Found restriction base type '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (complexTypeRef) break; } } } } if (!simpleTypeRef && !complexTypeRef) { if (base) { if (is_builtin_qname(base)) schema.builtinType(base); else if (!Wflag) std::cerr << "\nWarning: could not find restriction base type '" << base << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << std::endl; } else if (!simpleType) { std::cerr << "Restriction has no base" << std::endl; } } return SOAP_OK; } void xs__restriction::simpleTypePtr(xs__simpleType *simpleType) { simpleTypeRef = simpleType; } void xs__restriction::complexTypePtr(xs__complexType *complexType) { complexTypeRef = complexType; } xs__simpleType *xs__restriction::simpleTypePtr() const { return simpleTypeRef; } xs__complexType *xs__restriction::complexTypePtr() const { return complexTypeRef; } xs__simpleType *xs__restriction::simpleArrayTypePtr() const { return simpleArrayTypeRef; } xs__complexType *xs__restriction::complexArrayTypePtr() const { return complexArrayTypeRef; } void xs__restriction::mark() { if (Oflag > 1) { if (simpleTypePtr()) simpleTypePtr()->mark(); if (complexTypePtr()) complexTypePtr()->mark(); if (simpleArrayTypePtr()) simpleArrayTypePtr()->mark(); if (complexArrayTypePtr()) complexArrayTypePtr()->mark(); if (simpleType) simpleType->mark(); if (attributeGroup) attributeGroup->mark(); if (group) group->mark(); else if (all) all->mark(); else if (choice) choice->mark(); else if (sequence) sequence->mark(); for (std::vector::iterator at = attribute.begin(); at != attribute.end(); ++at) (*at).mark(); } } xs__list::xs__list() { itemTypeRef = NULL; } int xs__list::traverse(xs__schema &schema) { if (vflag) std::cerr << " Analyzing schema list" << std::endl; if (restriction) restriction->traverse(schema); for (std::vector::iterator i = simpleType.begin(); i != simpleType.end(); ++i) (*i).traverse(schema); itemTypeRef = NULL; const char *token = qname_token(itemType, schema.targetNamespace); if (token) { for (std::vector::iterator i = schema.simpleType.begin(); i != schema.simpleType.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { itemTypeRef = &(*i); if (vflag) std::cerr << " Found list itemType '" << (token ? token : "(null)") << "'" << std::endl; break; } } } if (!itemTypeRef) { for (std::vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(itemType, s->targetNamespace); if (token) { for (std::vector::iterator j = s->simpleType.begin(); j != s->simpleType.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { itemTypeRef = &(*j); if (vflag) std::cerr << " Found list itemType '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (itemTypeRef) break; } } } } if (itemType && !itemTypeRef) { if (is_builtin_qname(itemType)) schema.builtinType(itemType); else if (!Wflag) std::cerr << "\nWarning: could not find list itemType '" << itemType << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << std::endl; } return SOAP_OK; } void xs__list::itemTypePtr(xs__simpleType *simpleType) { itemTypeRef = simpleType; } xs__simpleType *xs__list::itemTypePtr() const { return itemTypeRef; } void xs__list::mark() { if (Oflag > 1) { if (restriction) restriction->mark(); for (std::vector::iterator i = simpleType.begin(); i != simpleType.end(); ++i) (*i).mark(); } } int xs__union::traverse(xs__schema &schema) { if (vflag) std::cerr << " Analyzing schema union" << std::endl; for (std::vector::iterator i = simpleType.begin(); i != simpleType.end(); ++i) (*i).traverse(schema); return SOAP_OK; } void xs__union::mark() { if (Oflag > 1) { for (std::vector::iterator i = simpleType.begin(); i != simpleType.end(); ++i) (*i).mark(); } } int xs__all::traverse(xs__schema &schema) { if (vflag) std::cerr << " Analyzing schema all" << std::endl; for (std::vector::iterator i = element.begin(); i != element.end(); ++i) (*i).traverse(schema); return SOAP_OK; } void xs__all::mark() { if (Oflag > 1) for (std::vector::iterator i = element.begin(); i != element.end(); ++i) (*i).mark(); } int xs__contents::traverse(xs__schema &schema) { switch (__union) { case SOAP_UNION_xs__union_content_element: if (__content.element) __content.element->traverse(schema); break; case SOAP_UNION_xs__union_content_group: if (__content.group) __content.group->traverse(schema); break; case SOAP_UNION_xs__union_content_choice: if (__content.choice) __content.choice->traverse(schema); break; case SOAP_UNION_xs__union_content_sequence: if (__content.sequence) __content.sequence->traverse(schema); break; case SOAP_UNION_xs__union_content_any: if (__content.any) __content.any->traverse(schema); break; } return SOAP_OK; } void xs__contents::mark() { if (Oflag > 1) { switch (__union) { case SOAP_UNION_xs__union_content_element: if (__content.element) __content.element->mark(); break; case SOAP_UNION_xs__union_content_group: if (__content.group) __content.group->mark(); break; case SOAP_UNION_xs__union_content_choice: if (__content.choice) __content.choice->mark(); break; case SOAP_UNION_xs__union_content_sequence: if (__content.sequence) __content.sequence->mark(); break; case SOAP_UNION_xs__union_content_any: if (__content.any) __content.any->mark(); break; } } } xs__seqchoice::xs__seqchoice() { minOccurs = NULL; maxOccurs = NULL; annotation = NULL; schemaRef = NULL; } int xs__seqchoice::traverse(xs__schema &schema) { if (vflag) std::cerr << " Analyzing schema sequence/choice" << std::endl; schemaRef = &schema; for (std::vector::iterator c = __contents.begin(); c != __contents.end(); ++c) (*c).traverse(schema); if (Oflag > 0) { SetOfString members; for (std::vector::iterator c = __contents.begin(); c != __contents.end(); ) { if ((*c).__union == SOAP_UNION_xs__union_content_sequence) { for (std::vector::iterator c1 = (*c).__content.sequence->__contents.begin(); c1 != (*c).__content.sequence->__contents.end(); ) { if ((*c1).__union == SOAP_UNION_xs__union_content_element) { xs__element *e = (*c1).__content.element; if (e->elementPtr()) { e = e->elementPtr(); } if (e->name) { if (members.find(e->name) != members.end()) { (*c).__content.sequence->__contents.erase(c1); if (!Wflag) std::cerr << "\nOptimization: removed duplicate element '" << e->name << "' from nested choice/sequence" << std::endl; } else { members.insert(e->name); ++c1; } } else { ++c1; } } else { ++c1; } } ++c; } else if ((*c).__union == SOAP_UNION_xs__union_content_element) { xs__element *e = (*c).__content.element; if (e->elementPtr()) { e = e->elementPtr(); } if (e->name) { if (members.find(e->name) != members.end()) { __contents.erase(c); std::cerr << "\nOptimization: removed duplicate element '" << e->name << "' from nested xs:sequence/xs:choice" << std::endl; } else { members.insert(e->name); ++c; } } else { ++c; } } else { ++c; } } } return SOAP_OK; } void xs__seqchoice::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema *xs__seqchoice::schemaPtr() const { return schemaRef; } void xs__seqchoice::mark() { if (Oflag > 1) for (std::vector::iterator c = __contents.begin(); c != __contents.end(); ++c) (*c).mark(); } xs__attributeGroup::xs__attributeGroup() { schemaRef = NULL; attributeGroupRef = NULL; used = false; } int xs__attributeGroup::traverse(xs__schema& schema) { if (vflag) std::cerr << " Analyzing schema attributeGroup" << std::endl; schemaRef = &schema; for (std::vector::iterator at = attribute.begin(); at != attribute.end(); ++at) (*at).traverse(schema); for (std::vector::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) (*ag).traverse(schema); attributeGroupRef = NULL; if (ref) { const char *token = qname_token(ref, schema.targetNamespace); if (token) { for (std::vector::iterator i = schema.attributeGroup.begin(); i != schema.attributeGroup.end(); ++i) if ((*i).name && !strcmp((*i).name, token)) { attributeGroupRef = &(*i); if (vflag) std::cerr << " Found attributeGroup '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (!attributeGroupRef) { for (std::vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(ref, s->targetNamespace); if (token) { for (std::vector::iterator j = s->attributeGroup.begin(); j != s->attributeGroup.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { attributeGroupRef = &(*j); if (vflag) std::cerr << " Found attribute Group '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (attributeGroupRef) break; } } } } if (!attributeGroupRef) if (!Wflag) std::cerr << "\nWarning: could not find the referenced attributeGroup '" << (name ? name : "") << "' ref '" << (ref ? ref : "(null)") << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << std::endl; } return SOAP_OK; } void xs__attributeGroup::schemaPtr(xs__schema *schema) { schemaRef = schema; } void xs__attributeGroup::attributeGroupPtr(xs__attributeGroup *attributeGroup) { attributeGroupRef = attributeGroup; } xs__schema *xs__attributeGroup::schemaPtr() const { return schemaRef; } xs__attributeGroup *xs__attributeGroup::attributeGroupPtr() const { return attributeGroupRef; } void xs__attributeGroup::mark() { if (Oflag > 1 && !used) { used = true; if (attributeGroupPtr()) attributeGroupPtr()->mark(); for (std::vector::iterator at = attribute.begin(); at != attribute.end(); ++at) (*at).mark(); for (std::vector::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) (*ag).mark(); } } int xs__any::traverse(xs__schema &schema) { if (vflag) std::cerr << " Analyzing schema any" << std::endl; for (std::vector::iterator i = element.begin(); i != element.end(); ++i) (*i).traverse(schema); return SOAP_OK; } void xs__any::mark() { if (Oflag > 1) for (std::vector::iterator i = element.begin(); i != element.end(); ++i) (*i).mark(); } xs__group::xs__group() { schemaRef = NULL; groupRef = NULL; used = false; } int xs__group::traverse(xs__schema &schema) { if (vflag) std::cerr << " Analyzing schema group" << std::endl; schemaRef = &schema; if (all) all->traverse(schema); if (choice) choice->traverse(schema); if (sequence) sequence->traverse(schema); groupRef = NULL; if (ref) { const char *token = qname_token(ref, schema.targetNamespace); if (token) { for (std::vector::iterator i = schema.group.begin(); i != schema.group.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { groupRef = &(*i); if (vflag) std::cerr << " Found group '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << std::endl; break; } } } if (!groupRef) { for (std::vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(ref, s->targetNamespace); if (token) { for (std::vector::iterator j = s->group.begin(); j != s->group.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { groupRef = &(*j); if (vflag) std::cerr << " Found group '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (groupRef) break; } } } } if (!groupRef) if (!Wflag) std::cerr << "\nWarning: could not find the referenced group '" << (name ? name : "") << "' ref '" << (ref ? ref : "(null)") << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << std::endl; } return SOAP_OK; } void xs__group::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema* xs__group::schemaPtr() const { return schemaRef; } void xs__group::groupPtr(xs__group *group) { groupRef = group; } xs__group* xs__group::groupPtr() const { return groupRef; } void xs__group::mark() { if (Oflag > 1 && !used) { used = true; if (groupPtr()) groupPtr()->mark(); if (all) all->mark(); if (choice) choice->mark(); if (sequence) sequence->mark(); } } int xs__enumeration::traverse(xs__schema &schema) { (void)schema; if (vflag) std::cerr << " Analyzing schema enumeration '" << (value ? value : "(null)") << "'" << std::endl; return SOAP_OK; } int xs__pattern::traverse(xs__schema &schema) { (void)schema; if (vflag) std::cerr << " Analyzing schema pattern" << std::endl; return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // I/O // //////////////////////////////////////////////////////////////////////////////// std::ostream &operator<<(std::ostream &o, const xs__schema &e) { if (!e.soap) { struct soap soap; soap_init2(&soap, SOAP_IO_DEFAULT, SOAP_XML_TREE | SOAP_C_UTFSTRING); soap_set_namespaces(&soap, namespaces); e.soap_serialize(&soap); soap_begin_send(&soap); e.soap_out(&soap, "xs:schema", 0, NULL); soap_end_send(&soap); soap_end(&soap); soap_done(&soap); } else { std::ostream *os = e.soap->os; e.soap->os = &o; e.soap_serialize(e.soap); soap_begin_send(e.soap); e.soap_out(e.soap, "xs:schema", 0, NULL); soap_end_send(e.soap); e.soap->os = os; } return o; } std::istream &operator>>(std::istream &i, xs__schema &e) { if (!e.soap) { e.soap = soap_new(); soap_set_namespaces(e.soap, namespaces); } std::istream *is = e.soap->is; e.soap->is = &i; if (soap_begin_recv(e.soap) || !e.soap_in(e.soap, "xs:schema", NULL) || soap_end_recv(e.soap)) { // handle error? Note: e.soap->error is set and app should check } e.soap->is = is; return i; } gsoap-2.8.91/gsoap/wsdl/wsp.h0000644000175000017500000002051213525245163015336 0ustar ellertellert/* wsp.h WS-Policy 1.2 and 1.5 binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap wsp schema documentation: WS-Policy binding //gsoap wsp schema namespace: http://www.w3.org/ns/ws-policy // 1.2 //gsoap wsp schema namespace: http://schemas.xmlsoap.org/ws/2004/09/policy //gsoap wsp schema elementForm: qualified //gsoap wsp schema attributeForm: unqualified #import "imports.h" #import "wsu.h" class wsp__Policy; class wsp__Content; extern class Service; extern class Types; class wsp__PolicyReference { public: @xsd__anyURI URI; @xsd__string Digest; @xsd__anyURI DigestAlgorithm; private: wsp__Policy *policyRef; public: int traverse(wsdl__definitions&); void policyPtr(wsp__Policy*); wsp__Policy *policyPtr() const; }; class wsp__Assertion { public: @bool Optional = false; @bool Ignorable = false; wsp__Content *Policy; }; #import "sp.h" #import "wsrmp.h" #import "wsam.h" class wsp__Content { public: wsp__Policy *Policy; wsp__PolicyReference *PolicyReference; std::vector All; std::vector ExactlyOne; std::vector sp__SignedParts; std::vector sp__EncryptedParts; std::vector sp__RequiredParts; sp__Elements *sp__SignedElements; sp__Elements *sp__EncryptedElements; sp__Elements *sp__ContentEncryptedElements; sp__Elements *sp__RequiredElements; sp__Token *sp__UsernameToken; sp__Token *sp__IssuedToken; sp__Token *sp__X509Token; sp__Token *sp__KerberosToken; sp__Token *sp__SpnegoContextToken; sp__Token *sp__SecurityContextToken; sp__Token *sp__SecureConversationToken; sp__Token *sp__SamlToken; sp__Token *sp__RelToken; sp__Token *sp__HttpsToken; sp__Token *sp__KeyValueToken; wsp__Assertion *sp__TransportBinding; wsp__Assertion *sp__TransportToken; wsp__Assertion *sp__AlgorithmSuite; wsp__Assertion *sp__Layout; wsp__Assertion *sp__SymmetricBinding; wsp__Assertion *sp__AsymmetricBinding; wsp__Assertion *sp__ProtectionToken; wsp__Assertion *sp__InitiatorToken; wsp__Assertion *sp__InitiatorSignatureToken; wsp__Assertion *sp__InitiatorEncryptionToken; wsp__Assertion *sp__RecipientToken; wsp__Assertion *sp__SupportingTokens; wsp__Assertion *sp__SignedSupportingTokens; wsp__Assertion *sp__EndorsingSupportingTokens; wsp__Assertion *sp__SignedEndorsingSupportingTokens; wsp__Assertion *sp__SignedEncryptedSupportingTokens; wsp__Assertion *sp__EncryptedSupportingTokens; wsp__Assertion *sp__EndorsingEncryptedSupportingTokens; wsp__Assertion *sp__SignedEndorsingEncryptedSupportingTokens; wsp__Assertion *sp__Wss10; wsp__Assertion *sp__Wss11; wsp__Assertion *sp__Trust10; wsp__Assertion *sp__Trust13; wsp__Content *sp__BootstrapPolicy; xsd__string wsaw__UsingAddressing; wsp__Assertion *wsam__Addressing; wsrmp__RMAssertion *wsrmp__RMAssertion_; wsrmp__RMAssertion *wsrmp__DeliveryAssurance; xsd__string wsrmp__AtLeastOnce; xsd__string wsrmp__AtMostOnce; xsd__string wsrmp__ExactlyOnce; xsd__string wsrmp__InOrder; wsrmp5__RMAssertion *wsrmp5__RMAssertion_; wsrmp5__RMAssertion *wsrmp5__DeliveryAssurance; xsd__string wsrmp5__AtLeastOnce; xsd__string wsrmp5__AtMostOnce; xsd__string wsrmp5__ExactlyOnce; xsd__string wsrmp5__InOrder; wsp__Assertion *sp__NoPassword; wsp__Assertion *sp__HashPassword; wsp__Assertion *sp__IncludeTimestamp; wsp__Assertion *sp__EncryptBeforeSigning; wsp__Assertion *sp__EncryptSignature; wsp__Assertion *sp__ProtectTokens; wsp__Assertion *sp__OnlySignEntireHeadersAndBody; xsd__string sp__RequireDerivedKeys; xsd__string sp__RequireImpliedDerivedKeys; xsd__string sp__RequireExplicitDerivedKeys; xsd__string sp__WssUsernameToken10; xsd__string sp__WssUsernameToken11; xsd__string sp__RequireExternalReference; xsd__string sp__RequireInternalReference; xsd__string sp__RequireKeyIdentifierReference; xsd__string sp__RequireIssuerSerialReference; xsd__string sp__RequireEmbeddedTokenReference; xsd__string sp__RequireThumbprintReference; xsd__string sp__WssX509V3Token10; xsd__string sp__WssX509Pkcs7Token10; xsd__string sp__WssX509PkiPathV1Token10; xsd__string sp__WssX509V1Token11; xsd__string sp__WssX509V3Token11; xsd__string sp__WssX509Pkcs7Token11; xsd__string sp__WssX509PkiPathV1Token11; xsd__string sp__WssKerberosV5ApReqToken11; xsd__string sp__WssGssKerberosV5ApReqToken11; xsd__string sp__WssRelV10Token10; xsd__string sp__WssRelV20Token10; xsd__string sp__WssRelV10Token11; xsd__string sp__WssRelV20Token11; xsd__string sp__MustNotSendCancel; xsd__string sp__MustNotSendAmend; xsd__string sp__MustNotSendRenew; xsd__string sp__MustSupportRefKeyIdentifier; xsd__string sp__MustSupportRefIssuerSerial; xsd__string sp__MustSupportRefExternalURI; xsd__string sp__MustSupportRefEmbeddedToken; xsd__string sp__MustSupportRefThumbprint; xsd__string sp__MustSupportRefEncryptedKey; xsd__string sp__RequireSignatureConfirmation; xsd__string sp__MustSupportClientChallenge; xsd__string sp__MustSupportServerChallenge; xsd__string sp__RequireClientEntropy; xsd__string sp__RequireServerEntropy; xsd__string sp__MustSupportIssuedTokens; xsd__string sp__RequireRequestSecurityTokenCollection; xsd__string sp__RequireAppliesTo; xsd__string sp__RequireExternalUriReference; xsd__string sp__SC13SecurityContextToken; xsd__string sp__Strict; xsd__string sp__Lax; xsd__string sp__LaxTsFirst; xsd__string sp__LaxTsLast; xsd__string sp__HttpBasicAuthentication; xsd__string sp__HttpDigestAuthentication; xsd__string sp__RequireClientCertificate; xsd__string sp__Basic256; xsd__string sp__Basic192; xsd__string sp__Basic128; xsd__string sp__TripleDes; xsd__string sp__Basic256Rsa15; xsd__string sp__Basic192Rsa15; xsd__string sp__Basic128Rsa15; xsd__string sp__TripleDesRsa15; xsd__string sp__Basic256Sha256; xsd__string sp__Basic192Sha256; xsd__string sp__Basic128Sha256; xsd__string sp__TripleDesSha256; xsd__string sp__Basic256Sha256Rsa15; xsd__string sp__Basic192Sha256Rsa15; xsd__string sp__Basic128Sha256Rsa15; xsd__string sp__TripleDesSha256Rsa15; xsd__string sp__InclusiveC14N; xsd__string sp__SOAPNormalization10; xsd__string sp__STRTransform10; xsd__string sp__Path10; xsd__string sp__XPathFilter20; xsd__string sp__AbsXPath; xsd__string wsam__AnonymousResponses; xsd__string wsam__NonAnonymousResponses; std::vector<_XML> __any; public: int traverse(wsdl__definitions&); void generate(Service& service, Types& types, int indent) const; }; class wsp__Policy : public wsp__Content { public: @xsd__anyURI xml__base; @xsd__string wsu__Id; @xsd__anyURI TargetNamespace; }; class wsp__Attachment { public: wsp__Policy *Policy; wsp__PolicyReference *PolicyReference; }; class wsp__AppliesTo { public: _XML __any; }; class wsp__PolicyAttachment { public: wsp__AppliesTo *AppliesTo; std::vector Attachment; }; gsoap-2.8.91/gsoap/wsdl/wsp.cpp0000644000175000017500000010737513525245163015706 0ustar ellertellert/* wsp.cpp WS-Policy 1.2 and 1.5 binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "wsdlH.h" #include "includes.h" #include "types.h" #include "service.h" static wsp__Policy *search(const char *URI, wsdl__definitions& definitions); static wsp__Policy *search(const char *URI, wsp__Policy *policy); static wsp__Policy *search(const char *URI, wsp__Content *content); static void gen_parts(const sp__Parts& parts, Types& types, const char *what, const char *name, int indent); //////////////////////////////////////////////////////////////////////////////// // // wsp:OperatorContentType // //////////////////////////////////////////////////////////////////////////////// int wsp__Content::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing wsp Policy" << std::endl; if (Policy) Policy->traverse(definitions); if (PolicyReference) PolicyReference->traverse(definitions); for (std::vector::iterator i = All.begin(); i != All.end(); ++i) { if (*i) (*i)->traverse(definitions); } for (std::vector::iterator j = ExactlyOne.begin(); j != ExactlyOne.end(); ++j) { if (*j) (*j)->traverse(definitions); } return SOAP_OK; } void wsp__Content::generate(Service& service, Types& types, int indent) const { static const char stabs[] = "\t\t\t\t\t\t\t\t\t\t"; const char *tabs; if (indent > 8) indent = 8; tabs = stabs + 9 - indent; // Recursive policies and references if (Policy) Policy->generate(service, types, indent); if (PolicyReference && PolicyReference->policyPtr()) PolicyReference->policyPtr()->generate(service, types, indent); // WS-Policy All if (!All.empty()) { fprintf(stream, "%s- All of the following:\n", tabs); for (std::vector::const_iterator p = All.begin(); p != All.end(); ++p) if (*p) (*p)->generate(service, types, indent + 1); } // WS-Policy ExactlyOne if (!ExactlyOne.empty()) { fprintf(stream, "%s- Exactly one of the following:\n", tabs); for (std::vector::const_iterator p = ExactlyOne.begin(); p != ExactlyOne.end(); ++p) if (*p) (*p)->generate(service, types, indent + 1); } // WS-SecurityPolicy Parts (TODO: do we need vectors of these?) for (std::vector::const_iterator sp = sp__SignedParts.begin(); sp != sp__SignedParts.end(); ++sp) gen_parts(*sp, types, "sign", "[4.1.1] WS-Security Signed Parts", indent); for (std::vector::const_iterator ep = sp__EncryptedParts.begin(); ep != sp__EncryptedParts.end(); ++ep) gen_parts(*ep, types, "encrypt", "[4.2.1] Security Encrypted Parts", indent); for (std::vector::const_iterator rp = sp__RequiredParts.begin(); rp != sp__RequiredParts.end(); ++rp) { fprintf(stream, "%s- Required Header elements:", tabs); for (std::vector::const_iterator h = (*rp).Header.begin(); h != (*rp).Header.end(); ++h) if ((*h).Name) fprintf(stream, " %s", types.aname(NULL, (*h).Namespace, (*h).Name)); else if ((*h).Namespace) fprintf(stream, " %s", (*h).Namespace); } // WS-SecurityPolicy Elements sp__Elements *elts = NULL; const char *elts_name = NULL; if (sp__SignedElements) { elts = sp__SignedElements; elts_name = "[4.1.2] Signed"; } if (sp__EncryptedElements) { elts = sp__EncryptedElements; elts_name = "[4.2.2] Encrypted"; } if (sp__ContentEncryptedElements) { elts = sp__ContentEncryptedElements; elts_name = "[4.2.3] Content Encrypted"; } if (sp__RequiredElements) { elts = sp__RequiredElements; elts_name = "[4.3.1] Required"; } if (elts) { fprintf(stream, "%s- %s Elements requirements (XPath%s):\n%s @verbatim\n", tabs, elts_name, elts->XPathVersion?elts->XPathVersion:"", tabs); for (std::vector::const_iterator s = elts->XPath.begin(); s != elts->XPath.end(); ++s) { fprintf(stream, "%s ", tabs); text(*s); } fprintf(stream, "%s @endverbatim\n", tabs); service.add_import("wsse.h"); } // WS-SecurityPolicy Tokens sp__Token *token = NULL; const char *token_name = NULL; if (sp__UsernameToken) { token = sp__UsernameToken; token_name = "[5.4.1] WS-Security Username"; } else if (sp__IssuedToken) { token = sp__IssuedToken; token_name = "[5.4.2] WS-Trust Issued"; } else if (sp__X509Token) { token = sp__X509Token; token_name = "[5.4.3] WS-Security X509"; } else if (sp__KerberosToken) { token = sp__KerberosToken; token_name = "[5.4.4] WS-Security Kerberos"; } else if (sp__SpnegoContextToken) { token = sp__SpnegoContextToken; token_name = "[5.4.5] WS-Trust n-leg RST/RSTR SPNEGO binary negotiation protocol (SpnegoContext)"; } else if (sp__SecurityContextToken) { token = sp__SecurityContextToken; token_name = "[5.4.6] WS-SecureConversation SecurityContext"; } else if (sp__SecureConversationToken) { token = sp__SecureConversationToken; token_name = "[5.4.7] WS-SecureConversation"; } else if (sp__SamlToken) { token = sp__SamlToken; token_name = "[5.4.8] SAML"; } else if (sp__RelToken) { token = sp__RelToken; token_name = "[5.4.9] WSS-REL"; } else if (sp__HttpsToken) { token = sp__HttpsToken; token_name = "[5.4.10] HTTPS"; } else if (sp__KeyValueToken) { token = sp__KeyValueToken; token_name = "[5.4.11] XML Signature"; } if (token) { fprintf(stream, "%s- %s required:\n", tabs, token_name); if (token->IncludeToken) fprintf(stream, "%s -# IncludeToken = %s\n", tabs, token->IncludeToken); if (token->Issuer && token->Issuer->Address) fprintf(stream, "%s -# Issuer = %s\n", tabs, token->Issuer->Address); if (token->IssuerName) fprintf(stream, "%s -# Issuer Name = %s\n", tabs, token->IssuerName); if (token->Policy) token->Policy->generate(service, types, indent + 1); // TODO: add wst:Claims? service.add_import("wsse.h"); } // WS-SecurityPolicy if (sp__AlgorithmSuite) { fprintf(stream, "%s- [7.1] Security Binding Algorithm Suite requirements:\n", tabs); if (sp__AlgorithmSuite->Policy) sp__AlgorithmSuite->Policy->generate(service, types, indent + 1); } if (sp__Layout) { fprintf(stream, "%s- [7.2] WS-Security Header Layout requirements:\n", tabs); if (sp__Layout->Policy) sp__Layout->Policy->generate(service, types, indent + 1); } if (sp__TransportBinding) { fprintf(stream, "%s- [7.3] Transport Binding%s requirements:\n", tabs, sp__TransportBinding->Optional ? " (optional)" : sp__TransportBinding->Ignorable ? " (ignorable)" : ""); if (sp__TransportBinding->Policy) sp__TransportBinding->Policy->generate(service, types, indent + 1); } if (sp__TransportToken) { fprintf(stream, "%s- Transport%s requirements:\n", tabs, sp__TransportToken->Optional ? " (optional)" : sp__TransportToken->Ignorable ? " (ignorable)" : ""); if (sp__TransportToken->Policy) sp__TransportToken->Policy->generate(service, types, indent + 1); } if (sp__SymmetricBinding) { fprintf(stream, "%s- [7.4] WS-Security Symmetric Binding%s requirements:\n", tabs, sp__SymmetricBinding->Optional ? " (optional)" : sp__SymmetricBinding->Ignorable ? " (ignorable)" : ""); if (sp__SymmetricBinding->Policy) sp__SymmetricBinding->Policy->generate(service, types, indent + 1); service.add_import("wsse.h"); } if (sp__ProtectionToken) { fprintf(stream, "%s- Symmetric Protection%s requirements:\n", tabs, sp__ProtectionToken->Optional ? " (optional)" : sp__ProtectionToken->Ignorable ? " (ignorable)" : ""); if (sp__ProtectionToken->Policy) sp__ProtectionToken->Policy->generate(service, types, indent + 1); } if (sp__AsymmetricBinding) { fprintf(stream, "%s- [7.5] WS-Security Asymmetric Binding%s (public key) requirements:\n", tabs, sp__AsymmetricBinding->Optional ? " (optional)" : sp__AsymmetricBinding->Ignorable ? " (ignorable)" : ""); if (sp__AsymmetricBinding->Policy) sp__AsymmetricBinding->Policy->generate(service, types, indent + 1); service.add_import("wsse.h"); } if (sp__InitiatorToken) { fprintf(stream, "%s- Initiator%s requirements:\n", tabs, sp__InitiatorToken->Optional ? " (optional)" : sp__InitiatorToken->Ignorable ? " (ignorable)" : ""); if (sp__InitiatorToken->Policy) sp__InitiatorToken->Policy->generate(service, types, indent + 1); } if (sp__InitiatorSignatureToken) { fprintf(stream, "%s- Initiator Signature%s requirements:\n", tabs, sp__InitiatorSignatureToken->Optional ? " (optional)" : sp__InitiatorSignatureToken->Ignorable ? " (ignorable)" : ""); if (sp__InitiatorSignatureToken->Policy) sp__InitiatorSignatureToken->Policy->generate(service, types, indent + 1); } if (sp__InitiatorEncryptionToken) { fprintf(stream, "%s- Initiator Encryption%s requirements:\n", tabs, sp__InitiatorEncryptionToken->Optional ? " (optional)" : sp__InitiatorEncryptionToken->Ignorable ? " (ignorable)" : ""); if (sp__InitiatorEncryptionToken->Policy) sp__InitiatorEncryptionToken->Policy->generate(service, types, indent + 1); } if (sp__RecipientToken) { fprintf(stream, "%s- Recipient%s requirements:\n", tabs, sp__RecipientToken->Optional ? " (optional)" : sp__RecipientToken->Ignorable ? " (ignorable)" : ""); if (sp__RecipientToken->Policy) sp__RecipientToken->Policy->generate(service, types, indent + 1); } if (sp__SupportingTokens) { fprintf(stream, "%s- [8.1] Supporting Tokens%s requirements:\n", tabs, sp__SupportingTokens->Optional ? " (optional)" : sp__SupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__SupportingTokens->Policy) sp__SupportingTokens->Policy->generate(service, types, indent + 1); } if (sp__SignedSupportingTokens) { fprintf(stream, "%s- [8.2] Signed Supporting Tokens%s requirements:\n", tabs, sp__SignedSupportingTokens->Optional ? " (optional)" : sp__SignedSupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__SignedSupportingTokens->Policy) sp__SignedSupportingTokens->Policy->generate(service, types, indent + 1); } if (sp__EndorsingSupportingTokens) { fprintf(stream, "%s- [8.3] Endorsing Supporting Tokens%s requirements:\n", tabs, sp__EndorsingSupportingTokens->Optional ? " (optional)" : sp__EndorsingSupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__EndorsingSupportingTokens->Policy) sp__EndorsingSupportingTokens->Policy->generate(service, types, indent + 1); } if (sp__SignedEndorsingSupportingTokens) { fprintf(stream, "%s- [8.4] Signed Endorsing Supporting Tokens%s requirements:\n", tabs, sp__SignedEndorsingSupportingTokens->Optional ? " (optional)" : sp__SignedEndorsingSupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__SignedEndorsingSupportingTokens->Policy) sp__SignedEndorsingSupportingTokens->Policy->generate(service, types, indent + 1); } if (sp__SignedEncryptedSupportingTokens) { fprintf(stream, "%s- [8.5] Signed Encrypted Supporting Tokens%s requirements:\n", tabs, sp__SignedEncryptedSupportingTokens->Optional ? " (optional)" : sp__SignedEncryptedSupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__SignedEncryptedSupportingTokens->Policy) sp__SignedEncryptedSupportingTokens->Policy->generate(service, types, indent + 1); } if (sp__EncryptedSupportingTokens) { fprintf(stream, "%s- [8.6] Encrypted Supporting Tokens%s requirements:\n", tabs, sp__EncryptedSupportingTokens->Optional ? " (optional)" : sp__EncryptedSupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__EncryptedSupportingTokens->Policy) sp__EncryptedSupportingTokens->Policy->generate(service, types, indent + 1); } if (sp__EndorsingEncryptedSupportingTokens) { fprintf(stream, "%s- [8.7] Endorsing Encrypted Supporting Tokens%s requirements:\n", tabs, sp__EndorsingEncryptedSupportingTokens->Optional ? " (optional)" : sp__EndorsingEncryptedSupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__EndorsingEncryptedSupportingTokens->Policy) sp__EndorsingEncryptedSupportingTokens->Policy->generate(service, types, indent + 1); } if (sp__SignedEndorsingEncryptedSupportingTokens) { fprintf(stream, "%s- [8.8] Signed Endorsing Encrypted Supporting Tokens%s requirements:\n", tabs, sp__SignedEndorsingEncryptedSupportingTokens->Optional ? " (optional)" : sp__SignedEndorsingEncryptedSupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__SignedEndorsingEncryptedSupportingTokens->Policy) sp__SignedEndorsingEncryptedSupportingTokens->Policy->generate(service, types, indent + 1); } // Wss10 or Wss11 if (sp__Wss10) { fprintf(stream, "%s- [9.1] WSS: SOAP Message Security 1.0%s options:\n", tabs, sp__Wss10->Optional ? " (optional)" : sp__Wss10->Ignorable ? " (ignorable)" : ""); if (sp__Wss10->Policy) sp__Wss10->Policy->generate(service, types, indent + 1); service.add_import("wsse.h"); } else if (sp__Wss11) { fprintf(stream, "%s- [9.2] WSS: SOAP Message Security 1.1%s options:\n", tabs, sp__Wss11->Optional ? " (optional)" : sp__Wss11->Ignorable ? " (ignorable)" : ""); if (sp__Wss11->Policy) sp__Wss11->Policy->generate(service, types, indent + 1); service.add_import("wsse.h"); } if (sp__MustSupportRefKeyIdentifier) fprintf(stream, "%s- Key Identifier References\n", tabs); if (sp__MustSupportRefIssuerSerial) fprintf(stream, "%s- Issuer Serial References\n", tabs); if (sp__MustSupportRefExternalURI) fprintf(stream, "%s- External URI References\n", tabs); if (sp__MustSupportRefEmbeddedToken) fprintf(stream, "%s- Embedded Token References\n", tabs); if (sp__MustSupportRefThumbprint) fprintf(stream, "%s- Thumbprint References\n", tabs); if (sp__MustSupportRefEncryptedKey) fprintf(stream, "%s- EncryptedKey References\n", tabs); if (sp__RequireSignatureConfirmation) fprintf(stream, "%s- Signature Confirmation\n", tabs); // WS-SecureConversation if (sp__RequireDerivedKeys) fprintf(stream, "%s- Properties = WS-SecureConversation RequireDerivedKeys\n", tabs); else if (sp__RequireImpliedDerivedKeys) fprintf(stream, "%s- Properties = WS-SecureConversation RequireImpliedDerivedKeys\n", tabs); else if (sp__RequireExplicitDerivedKeys) fprintf(stream, "%s- Properties = WS-SecureConversation RequireExplicitDerivedKeys\n", tabs); if (sp__MustNotSendCancel) fprintf(stream, "%s- WS-SecureConversation STS issuing the secure conversation token does not support SCT/Cancel RST messages", tabs); else if (sp__MustNotSendAmend) fprintf(stream, "%s- WS-SecureConversation STS issuing the secure conversation token does not support SCT/Amend RST messages", tabs); else if (sp__MustNotSendRenew) fprintf(stream, "%s- WS-SecureConversation STS issuing the secure conversation token does not support SCT/Renew RST messages", tabs); if (sp__RequireExternalUriReference) fprintf(stream, "%s- WS-SecureConversation external URI reference is required", tabs); if (sp__SC13SecurityContextToken) fprintf(stream, "%s- WS-SecureConversation Security Context Token should be used", tabs); // WS-Security passwords if (sp__NoPassword) fprintf(stream, "%s- No WS-Security password%s required\n", tabs, sp__NoPassword->Optional ? " (optional)" : sp__NoPassword->Ignorable ? " (ignorable)" : ""); else if (sp__HashPassword) { fprintf(stream, "%s- Client-side WS-Security password%s should be set:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_add_UsernameTokenDigest(soap, \"User\", \"\", \"\");\n\t@endcode\n", tabs, sp__HashPassword->Optional ? " (optional)" : sp__HashPassword->Ignorable ? " (ignorable)" : ""); fprintf(stream, "%s- Server-side WS-Security password%s verified with:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tconst char *username = soap_wsse_get_Username(soap);\n\t...\n\tif (soap_wsse_verify_Password(soap, \"\")) ......\n\t@endcode\n", tabs, sp__HashPassword->Optional ? " (optional)" : sp__HashPassword->Ignorable ? " (ignorable)" : ""); service.add_import("wsse.h"); } if (sp__WssUsernameToken10) { fprintf(stream, "%s- Username token should be used as defined in UsernameTokenProfile1.0:\n", tabs); fprintf(stream, "%s - Client-side WS-Security password should be set:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_add_UsernameTokenDigest(soap, \"User\", \"\", \"\");\n\t@endcode\n", tabs); fprintf(stream, "%s - Server-side WS-Security password verified with:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tconst char *username = soap_wsse_get_Username(soap);\n\t...\n\tif (soap_wsse_verify_Password(soap, \"\")) \n\t@endcode\n", tabs); service.add_import("wsse.h"); } else if (sp__WssUsernameToken11) { fprintf(stream, "%s- Username token should be used as defined in UsernameTokenProfile1.1:\n", tabs); fprintf(stream, "%s - Client-side WS-Security plain-text password should be set:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_add_UsernameToken(soap, \"User\", \"\", \"\");\n\t@endcode\n", tabs); fprintf(stream, "%s - Client-side WS-Security digest password should be set:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_add_UsernameTokenDigest(soap, \"User\", \"\", \"\");\n\t@endcode\n", tabs); fprintf(stream, "%s - Server-side WS-Security password verified with:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tconst char *username = soap_wsse_get_Username(soap);\n\t...\n\tif (soap_wsse_verify_Password(soap, \"\")) ...\n\t@endcode\n", tabs); service.add_import("wsse.h"); } // WS-Trust if (sp__RequireExternalReference) fprintf(stream, "%s- WS-Trust external reference is required when referencing this token\n", tabs); else if (sp__RequireInternalReference) fprintf(stream, "%s- WS-Trust internal reference is required when referencing this token\n", tabs); // WS-Trust 1.0 and 1.3 if (sp__Trust10) { fprintf(stream, "%s- [10.1] WS-Trust 1.0%s options:\n", tabs, sp__Trust10->Optional ? " (optional)" : sp__Trust10->Ignorable ? " (ignorable)" : ""); if (sp__Trust10->Policy) sp__Trust10->Policy->generate(service, types, indent + 1); service.add_import("wst.h"); } else if (sp__Trust13) { fprintf(stream, "%s- [10.1] WS-Trust 1.3%s options:\n", tabs, sp__Trust13->Optional ? " (optional)" : sp__Trust13->Ignorable ? " (ignorable)" : ""); if (sp__Trust13->Policy) sp__Trust13->Policy->generate(service, types, indent + 1); service.add_import("wst.h"); } if (sp__MustSupportClientChallenge) { fprintf(stream, "%s- Client Challenge\n", tabs); service.add_import("wst.h"); } if (sp__MustSupportServerChallenge) { fprintf(stream, "%s- Server Challenge\n", tabs); service.add_import("wst.h"); } if (sp__RequireClientEntropy) { fprintf(stream, "%s- Client Entropy\n", tabs); service.add_import("wst.h"); } if (sp__RequireServerEntropy) { fprintf(stream, "%s- Server Entropy\n", tabs); service.add_import("wst.h"); } if (sp__MustSupportIssuedTokens) { fprintf(stream, "%s- Issued Tokens\n", tabs); service.add_import("wst.h"); } if (sp__RequireRequestSecurityTokenCollection) { fprintf(stream, "%s- Collection\n", tabs); service.add_import("wst.h"); } if (sp__RequireAppliesTo) { fprintf(stream, "%s- STS requires the requestor to specify the scope for the issued token using wsp:AppliesTo in the RST\n", tabs); service.add_import("wst.h"); } // WS-Security header layout if (sp__IncludeTimestamp) { fprintf(stream, "%s- WS-Security Timestamp%s should be set prior to send:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_add_Timestamp(soap, \"Timestamp\", );\n\t@endcode\n", tabs, sp__IncludeTimestamp->Optional ? " (optional)" : sp__IncludeTimestamp->Ignorable ? " (ignorable)" : ""); fprintf(stream, "%s- WS-Security Timestamp%s presence and expiration verified post-receive with:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tif (soap_wsse_verify_Timestamp(soap)) ......\n\t@endcode\n", tabs, sp__IncludeTimestamp->Optional ? " (optional)" : sp__IncludeTimestamp->Ignorable ? " (ignorable)" : ""); } if (sp__EncryptBeforeSigning) fprintf(stream, "%s- WS-Security Encrypt Before Signing%s (gSOAP unsupported)\n", tabs, sp__EncryptBeforeSigning->Optional ? " (optional)" : sp__EncryptBeforeSigning->Ignorable ? " (ignorable)" : ""); if (sp__EncryptSignature) fprintf(stream, "%s- WS-Security Encrypt Signature%s\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_add_EncryptedKey_encrypt_only(soap, , NULL, , NULL, , , \"ds:Signature SOAP-ENV:Body\");\n\t@endcode\n", tabs, sp__EncryptSignature->Optional ? " (optional)" : sp__EncryptSignature->Ignorable ? " (ignorable)" : ""); if (sp__ProtectTokens) fprintf(stream, "%s- WS-Security Token Protection%s required\n", tabs, sp__ProtectTokens->Optional ? " (optional)" : sp__ProtectTokens->Ignorable ? " (ignorable)" : ""); if (sp__OnlySignEntireHeadersAndBody) { fprintf(stream, "%s- WS-Security Sign Entire Headers and Body%s:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_set_wsu_id(soap, \" ...\"); // list each ns:tagname used in SOAP Header\n\tsoap_wsse_sign_body(soap, , , );\n\t@endcode\n", tabs, sp__OnlySignEntireHeadersAndBody->Optional ? " (optional)" : sp__OnlySignEntireHeadersAndBody->Ignorable ? " (ignorable)" : ""); } if (sp__Strict) fprintf(stream, "%s- WS-Security headers 'declare before use' required (gSOAP default)\n", tabs); else if (sp__Lax) fprintf(stream, "%s- WS-Security headers may occur in any order (gSOAP allows this)\n", tabs); else if (sp__LaxTsFirst) fprintf(stream, "%s- WS-Security Timestamp must appear first (gSOAP default)\n", tabs); else if (sp__LaxTsLast) fprintf(stream, "%s- WS-Security Timestamp must appear last (requires changing the placement of the Timestamp header in SOAP_ENV__Header defined in import/wsse.h)\n", tabs); // HTTP authentication if (sp__HttpBasicAuthentication) fprintf(stream, "%s- HTTP/S Basic Authentication required:\n\t@code\n\tsoap->userid = \"\"; soap->passwd = \"\";\nsoap_call_ns__method(...)\n\t@endcode\n", tabs); else if (sp__HttpDigestAuthentication) fprintf(stream, "%s- HTTP/S Digest Authentication required:\n%sSee plugin/httpda.c plugin for usage details\n", tabs, tabs); if (sp__RequireClientCertificate) fprintf(stream, "%s- HTTPS client must authenticate to server with a certificate:\n\t@code\n\tsoap_ssl_client_context(soap, , \"\", \"\", ...)\n\t@endcode\n", tabs); // Security token requirements if (sp__RequireKeyIdentifierReference) fprintf(stream, "%s- Key identifier reference is required\n", tabs); if (sp__RequireIssuerSerialReference) fprintf(stream, "%s- Issuer serial reference is required\n", tabs); if (sp__RequireEmbeddedTokenReference) fprintf(stream, "%s- An embedded token reference is required\n", tabs); if (sp__RequireThumbprintReference) fprintf(stream, "%s- A thumbprint reference is required\n", tabs); // Algorithm suite if (sp__Basic256) fprintf(stream, "%s- Basic256\n", tabs); else if (sp__Basic192) fprintf(stream, "%s- Basic192\n", tabs); else if (sp__Basic128) fprintf(stream, "%s- Basic128\n", tabs); else if (sp__TripleDes) fprintf(stream, "%s- TripleDes\n", tabs); else if (sp__Basic256Rsa15) fprintf(stream, "%s- Basic256Rsa15\n", tabs); else if (sp__Basic192Rsa15) fprintf(stream, "%s- Basic192Rsa15\n", tabs); else if (sp__Basic128Rsa15) fprintf(stream, "%s- Basic128Rsa15\n", tabs); else if (sp__TripleDesRsa15) fprintf(stream, "%s- TripleDesRsa15\n", tabs); else if (sp__Basic256Sha256) fprintf(stream, "%s- Basic256Sha256\n", tabs); else if (sp__Basic192Sha256) fprintf(stream, "%s- Basic192Sha256\n", tabs); else if (sp__Basic128Sha256) fprintf(stream, "%s- Basic128Sha256\n", tabs); else if (sp__TripleDesSha256) fprintf(stream, "%s- TripleDesSha256\n", tabs); else if (sp__Basic256Sha256Rsa15) fprintf(stream, "%s- Basic256Sha256Rsa15\n", tabs); else if (sp__Basic192Sha256Rsa15) fprintf(stream, "%s- Basic192Sha256Rsa15\n", tabs); else if (sp__Basic128Sha256Rsa15) fprintf(stream, "%s- Basic128Sha256Rsa15\n", tabs); else if (sp__TripleDesSha256Rsa15) fprintf(stream, "%s- TripleDesSha256Rsa15\n", tabs); if (sp__InclusiveC14N) fprintf(stream, "%s- InclusiveC14N\n", tabs); if (sp__SOAPNormalization10) fprintf(stream, "%s- SOAPNormalization10\n", tabs); if (sp__STRTransform10) fprintf(stream, "%s- STRTransform10\n", tabs); if (sp__Path10) fprintf(stream, "%s- Path10\n", tabs); else if (sp__XPathFilter20) fprintf(stream, "%s- XPathFilter20\n", tabs); else if (sp__AbsXPath) fprintf(stream, "%s- AbsXPath\n", tabs); // WSS if (sp__WssX509V3Token10) fprintf(stream, "%s- An X509 Version 3 token should be used as defined in X509TokenProfile1.0\n", tabs); else if (sp__WssX509Pkcs7Token10) fprintf(stream, "%s- An X509 PKCS7 token should be used as defined in X509TokenProfile1.0\n", tabs); else if (sp__WssX509PkiPathV1Token10) fprintf(stream, "%s- An X509 PKI Path Version 1 token should be used as defined in X509TokenProfile1.0\n", tabs); else if (sp__WssX509V1Token11) fprintf(stream, "%s- An X509 Version 1 token should be used as defined in X509TokenProfile1.1\n", tabs); else if (sp__WssX509V3Token11) fprintf(stream, "%s- An X509 Version 3 token should be used as defined in X509TokenProfile1.1\n", tabs); else if (sp__WssX509Pkcs7Token11) fprintf(stream, "%s- An X509 PKCS7 token should be used as defined in X509TokenProfile1.1\n", tabs); else if (sp__WssX509PkiPathV1Token11) fprintf(stream, "%s- An X509 PKI Path Version 1 token should be used as defined in X509TokenProfile1.1\n", tabs); if (sp__WssKerberosV5ApReqToken11) fprintf(stream, "%s- A Kerberos Version 5 AP-REQ X509 token should be used as defined in KerberosTokenProfile1.1\n", tabs); else if (sp__WssGssKerberosV5ApReqToken11) fprintf(stream, "%s- A GSS Kerberos Version 5 AP-REQ token should be used as defined in KerberosTokenProfile1.1\n", tabs); if (sp__WssRelV10Token10) fprintf(stream, "%s- A REL Version 1.0 token should be used as defined in RELTokenProfile1.0\n", tabs); else if (sp__WssRelV20Token10) fprintf(stream, "%s- A REL Version 2.0 token should be used as defined in RELTokenProfile1.0\n", tabs); else if (sp__WssRelV10Token11) fprintf(stream, "%s- A REL Version 1.0 token should be used as defined in RELTokenProfile1.1\n", tabs); else if (sp__WssRelV20Token11) fprintf(stream, "%s- A REL Version 2.0 token should be used as defined in RELTokenProfile1.1\n", tabs); if (sp__BootstrapPolicy) { fprintf(stream, "%s- SecureConversation BootstrapPolicy\n", tabs); sp__BootstrapPolicy->generate(service, types, indent + 1); } // WS-Addressing WSDL Policy if (wsaw__UsingAddressing) { fprintf(stream, "%s- WS-Addressing is used\n", tabs); service.add_import("wsa5.h"); } // WS-Addressing Metadata Policy if (wsam__Addressing) { fprintf(stream, "%s- WS-Addressing%s is used\n", tabs, wsam__Addressing->Optional ? " (optional)" : wsam__Addressing->Ignorable ? " (ignorable)" : ""); if (wsam__Addressing->Policy) wsam__Addressing->Policy->generate(service, types, indent + 1); service.add_import("wsa5.h"); } if (wsam__AnonymousResponses) fprintf(stream, "%s- WS-Addressing Anonymous Responses\n", tabs); else if (wsam__NonAnonymousResponses) fprintf(stream, "%s- WS-Addressing NonAnonymous Responses\n", tabs); // WS-ReliableMessaging Policy 2007 if (wsrmp__RMAssertion_) { fprintf(stream, "%s- WS-ReliableMessaging%s is used\n", tabs, wsrmp__RMAssertion_->Optional ? " (optional)" : wsrmp__RMAssertion_->Ignorable ? " (ignorable)" : ""); if (wsrmp__RMAssertion_->InactivityTimeout && wsrmp__RMAssertion_->InactivityTimeout->Milliseconds) fprintf(stream, "%s - Inactivity Timeout = %s (ms)\n", tabs, wsrmp__RMAssertion_->InactivityTimeout->Milliseconds); if (wsrmp__RMAssertion_->BaseRetransmissionInterval && wsrmp__RMAssertion_->BaseRetransmissionInterval->Milliseconds) fprintf(stream, "%s - Base Retransmission Interval = %s (ms)\n", tabs, wsrmp__RMAssertion_->BaseRetransmissionInterval->Milliseconds); if (wsrmp__RMAssertion_->AcknowledgementInterval && wsrmp__RMAssertion_->AcknowledgementInterval->Milliseconds) fprintf(stream, "%s - Acknowledgement Interval = %s (ms)\n", tabs, wsrmp__RMAssertion_->AcknowledgementInterval->Milliseconds); if (wsrmp__RMAssertion_->ExponentialBackoff) fprintf(stream, "%s - ExponentialBackoff\n", tabs); if (wsrmp__RMAssertion_->Policy) wsrmp__RMAssertion_->Policy->generate(service, types, indent + 1); service.add_import("wsrm.h"); } if (wsrmp__DeliveryAssurance) { fprintf(stream, "%s- WS-ReliableMessaging Delivery Assurance%s:\n", tabs, wsrmp__DeliveryAssurance->Optional ? " (optional)" : wsrmp__DeliveryAssurance->Ignorable ? " (ignorable)" : ""); if (wsrmp__DeliveryAssurance->Policy) wsrmp__DeliveryAssurance->Policy->generate(service, types, indent + 1); service.add_import("wsrm.h"); } if (wsrmp__AtLeastOnce) fprintf(stream, "%s- At Least Once\n", tabs); if (wsrmp__AtMostOnce) fprintf(stream, "%s- At Most Once\n", tabs); if (wsrmp__ExactlyOnce) fprintf(stream, "%s- Exactly Once\n", tabs); if (wsrmp__InOrder) fprintf(stream, "%s- In Order\n", tabs); // WS-ReliableMessaging Policy 2005 if (wsrmp5__RMAssertion_) { fprintf(stream, "%s- WS-ReliableMessaging%s is used\n", tabs, wsrmp5__RMAssertion_->Optional ? " (optional)" : wsrmp5__RMAssertion_->Ignorable ? " (ignorable)" : ""); if (wsrmp5__RMAssertion_->InactivityTimeout && wsrmp5__RMAssertion_->InactivityTimeout->Milliseconds) fprintf(stream, "%s - Inactivity Timeout = %s (ms)\n", tabs, wsrmp5__RMAssertion_->InactivityTimeout->Milliseconds); if (wsrmp5__RMAssertion_->BaseRetransmissionInterval && wsrmp5__RMAssertion_->BaseRetransmissionInterval->Milliseconds) fprintf(stream, "%s - Base Retransmission Interval = %s (ms)\n", tabs, wsrmp5__RMAssertion_->BaseRetransmissionInterval->Milliseconds); if (wsrmp5__RMAssertion_->AcknowledgementInterval && wsrmp5__RMAssertion_->AcknowledgementInterval->Milliseconds) fprintf(stream, "%s - Acknowledgement Interval = %s (ms)\n", tabs, wsrmp5__RMAssertion_->AcknowledgementInterval->Milliseconds); if (wsrmp5__RMAssertion_->ExponentialBackoff) fprintf(stream, "%s - ExponentialBackoff\n", tabs); if (wsrmp5__RMAssertion_->Policy) wsrmp5__RMAssertion_->Policy->generate(service, types, indent + 1); service.add_import("wsrm5.h"); } if (wsrmp5__DeliveryAssurance) { fprintf(stream, "%s- WS-ReliableMessaging Delivery Assurance%s:\n", tabs, wsrmp5__DeliveryAssurance->Optional ? " (optional)" : wsrmp5__DeliveryAssurance->Ignorable ? " (ignorable)" : ""); if (wsrmp5__DeliveryAssurance->Policy) wsrmp5__DeliveryAssurance->Policy->generate(service, types, indent + 1); service.add_import("wsrm5.h"); } if (wsrmp5__AtLeastOnce) fprintf(stream, "%s- At Least Once\n", tabs); if (wsrmp5__AtMostOnce) fprintf(stream, "%s- At Most Once\n", tabs); if (wsrmp5__ExactlyOnce) fprintf(stream, "%s- Exactly Once\n", tabs); if (wsrmp5__InOrder) fprintf(stream, "%s- In Order\n", tabs); // All else for (std::vector<_XML>::const_iterator x = __any.begin(); x != __any.end(); ++x) { if (*x && *(*x)) { fprintf(stream, "%s- Other policy requirements:\n\t@verbatim\n", tabs); text(*x); fprintf(stream, "\t@endverbatim\n"); } } } static void gen_parts(const sp__Parts& parts, Types& types, const char *what, const char *name, int indent) { static const char stabs[] = "\t\t\t\t\t\t\t\t\t\t"; const char *tabs; if (indent > 8) indent = 8; tabs = stabs + 9 - indent; fprintf(stream, "%s- %s requirements:\n", tabs, name); if (parts.Body) fprintf(stream, "%s -# Body:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_%s_body(soap, , , );\n\t@endcode\n", tabs, what); if (!parts.Header.empty()) { fprintf(stream, "%s -# Header elements:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_set_wsu_id(soap, \"", tabs); for (std::vector::const_iterator h = parts.Header.begin(); h != parts.Header.end(); ++h) { if ((*h).Name) fprintf(stream, "%s ", types.aname(NULL, (*h).Namespace, (*h).Name)); else if ((*h).Namespace) fprintf(stream, "%s: ", types.nsprefix(NULL, (*h).Namespace)); } fprintf(stream, "\");\n\t@endcode\n"); } if (parts.Attachments) fprintf(stream, "%s -# Attachments as defined in SwAProfile1.1\n", tabs); } //////////////////////////////////////////////////////////////////////////////// // // wsp:PolicyReference // //////////////////////////////////////////////////////////////////////////////// int wsp__PolicyReference::traverse(wsdl__definitions& definitions) { policyRef = NULL; if (!URI || !*URI) { std::cerr << "PolicyReference has no URI" << std::endl; return SOAP_OK; } if (*URI == '#') { policyRef = search(URI + 1, definitions); if (!policyRef) { std::cerr << "PolicyReference URI=\"" << URI << "\" not found" << std::endl; return SOAP_OK; } } return SOAP_OK; } void wsp__PolicyReference::policyPtr(wsp__Policy *Policy) { policyRef = Policy; } wsp__Policy *wsp__PolicyReference::policyPtr() const { return policyRef; } static wsp__Policy *search(const char *URI, wsdl__definitions& definitions) { for (std::vector::iterator p = definitions.wsp__Policy_.begin(); p != definitions.wsp__Policy_.end(); ++p) { wsp__Policy *policy = search(URI, &(*p)); if (policy) return policy; } return NULL; } static wsp__Policy *search(const char *URI, wsp__Policy *policy) { if (!policy) return NULL; if (policy->wsu__Id && !strcmp(URI, policy->wsu__Id)) return policy; return search(URI, (wsp__Content*)policy); } static wsp__Policy *search(const char *URI, wsp__Content *content) { wsp__Policy *policy; policy = search(URI, content->Policy); if (policy) return policy; for (std::vector::iterator i = content->All.begin(); i != content->All.end(); ++i) { policy = search(URI, *i); if (policy) return policy; } for (std::vector::iterator j = content->ExactlyOne.begin(); j != content->ExactlyOne.end(); ++j) { policy = search(URI, *j); if (policy) return policy; } return NULL; } gsoap-2.8.91/gsoap/wsdl/types.cpp0000644000175000017500000051226413525245163016236 0ustar ellertellert/* types.cpp Generate gSOAP types from XML schemas (e.g. embedded in WSDL). -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "types.h" static char *getline(char *s, size_t n, FILE *fd); static const char *nonblank(const char *s); static bool isdelim(int c); static const char *fill(char *t, int n, const char *s, int e); static const char *utf8(char **t, const char *s, bool start); static const char *cstring(const char *s); static const char *xstring(const char *s); static bool is_float(const char *s); static bool is_integer(const char *s); static LONG64 to_integer(const char *s); static void documentation(const char *text); static void operations(const char *t); static int comment_nest = 0; /* keep track of block comments to avoid nesting */ //////////////////////////////////////////////////////////////////////////////// // // Keywords and reserved words // //////////////////////////////////////////////////////////////////////////////// static const char *keywords[] = { "alignas", "alignof", "and", "and_eq", "asm", "auto", "bitand", "bitor", "bool", "break", "case", "catch", "char", "char16_t", "char32_t", "class", "compl", "const", "constexpr", "const_cast", "continue", "decltype", "default", "delete", "do", "double", "dynamic_cast", "else", "enum", "errno", "explicit", "export", "extern", "false", "FILE", "final", "float", "for", "friend", "goto", "if", "INFINITY", "inline", "int", "interface", "long", "LONG64", "max", "min", "mustUnderstand", "mutable", "namespace", "new", "not", "not_eq", "NULL", "nullptr", "nullptr_t", "operator", "or", "or_eq", "override", "private", "protected", "public", "register", "reinterpret_cast", "restrict", "return", "short", "signed", "size_t", "sizeof", "static", "static_assert", "static_cast", "struct", "switch", "template", "this", "thread_local", "throw", "time_t", "true", "try", "typedef", "typeid", "typeof", "typename", "ULONG64", "union", "unsigned", "using", "virtual", "void", "volatile", "wchar_t", "while", "XML", "xor", "xor_eq", "_QName", "_XML", }; //////////////////////////////////////////////////////////////////////////////// // // Types methods // //////////////////////////////////////////////////////////////////////////////// Types::Types() { init(); } int Types::read(const char *file) { FILE *fd; char buf[4096], xsd[4096], def[4096], use[4096], ptr[4096], uri[4096]; const char *s; short copy = 0; MapOfStringToString eqvtypemap; soap_strcpy(buf, sizeof(buf), file); fd = fopen(buf, "r"); if (!fd && import_path) { (SOAP_SNPRINTF(buf, sizeof(buf), strlen(import_path) + strlen(file) + 1), "%s/%s", import_path, file); fd = fopen(buf, "r"); } if (!fd) { fprintf(stderr, "Cannot open file \"%s\"\n", file); return SOAP_EOF; } fprintf(stderr, "Reading type definitions from type map \"%s\"\n", buf); while (getline(buf, sizeof(buf), fd)) { s = buf; if (copy) { if (*s == ']') copy = 0; else fprintf(stream, "%s\n", buf); } else if (*s == '[') { copy = 1; } else if (*s == '<') { s = fill(uri, sizeof(uri), s+1, -1); infile[infiles++] = estrdup(uri); if (infiles >= MAXINFILES) { fprintf(stderr, "wsdl2h: too many files\n"); exit(1); } } else if (*s == '>') { s = fill(uri, sizeof(uri), s+1, -1); if (!outfile) { outfile = estrdup(uri); stream = fopen(outfile, "w"); if (!stream) { fprintf(stderr, "Cannot write to %s\n", outfile); exit(1); } if (cppnamespace) fprintf(stream, "namespace %s {\n", cppnamespace); fprintf(stderr, "Saving %s\n\n", outfile); } } else if (*s && *s != '#') { s = fill(xsd, sizeof(xsd), s, '='); if (s && *s == '=') { s = fill(use, sizeof(use), s+1, '|'); if (*xsd && *use) { s = estrdup(xsd); eqvtypemap[s] = estrdup(use); deftypemap[s] = ""; if (usetypemap.find(use) != usetypemap.end()) usetypemap[s] = usetypemap[use]; else usetypemap[s] = estrdup(use); } } else if (strstr(xsd, "__")) { s = fill(def, sizeof(def), s, '|'); s = fill(use, sizeof(use), s, '|'); s = fill(ptr, sizeof(ptr), s, '|'); if (*xsd) { s = estrdup(xsd); if (*def == '$') { const char *t = modtypemap[s]; if (t) { size_t l = strlen(t) + strlen(def); char *r = (char*)emalloc(l + 1); (SOAP_SNPRINTF(r, l + 1, l), "%s%s", t, def); free((void*)modtypemap[s]); modtypemap[s] = r; } else modtypemap[s] = estrdup(def); } else { if (*def) { if (strcmp(def, "...")) { deftypemap[s] = estrdup(def); ctypemap[s] = ctype(def); } } else deftypemap[s] = ""; if (*use) usetypemap[s] = estrdupf(use); else usetypemap[s] = estrdupf(xsd); if (*ptr) ptrtypemap[s] = estrdupf(ptr); else { MapOfStringToString::iterator i = ptrtypemap.find(s); if (i != ptrtypemap.end()) ptrtypemap.erase(i); } } } } else if (*xsd == '$') { fill(use, sizeof(use), s, 0); if (*use) { s = estrdup(xsd); usetypemap[s] = estrdup(use); } } else if (*xsd) { s = fill(uri, sizeof(uri), s, 0); if (uri[0] == '"') { uri[strlen(uri) - 1] = '\0'; nsprefix(xsd, estrdup(uri + 1)); } else if (uri[0] == '<') { uri[strlen(uri) - 1] = '\0'; char *s = estrdup(uri + 1); nsprefix(xsd, s); exturis.insert(s); } else { nsprefix(xsd, estrdup(uri)); } } } } for (MapOfStringToString::const_iterator i = eqvtypemap.begin(); i != eqvtypemap.end(); ++i) { const char *s = (*i).first, *t = (*i).second; if (usetypemap.find(t) != usetypemap.end()) t = usetypemap[t]; deftypemap[s] = ""; usetypemap[s] = t; if (ptrtypemap.find((*i).second) != ptrtypemap.end()) { ptrtypemap[s] = ptrtypemap[(*i).second]; } else { MapOfStringToString::iterator j = ptrtypemap.find(s); if (j != ptrtypemap.end()) ptrtypemap.erase(j); } for (MapOfStringToString::iterator j = usetypemap.begin(); j != usetypemap.end(); ++j) if (!strcmp((*j).second, s)) (*j).second = t; for (MapOfStringToString::iterator k = ptrtypemap.begin(); k != ptrtypemap.end(); ++k) if (!strcmp((*k).second, s)) (*k).second = t; } fclose(fd); return SOAP_OK; } void Types::init() { snum = 1; unum = 1; gnum = 1; with_union = false; fake_union = false; total = 0; omitted = 0; knames.insert(keywords, keywords + sizeof(keywords)/sizeof(char*)); if (soap_context && *soap_context) knames.insert(soap_context); /* xsd:ur-type is deprecated if (cflag) { deftypemap["xsd__ur_type"] = ""; if (dflag) { usetypemap["xsd__ur_type"] = "xsd__anyType"; } else { usetypemap["xsd__ur_type"] = "_XML"; ptrtypemap["xsd__ur_type"] = "_XML"; } } else { deftypemap["xsd__ur_type"] = "class xsd__ur_type { _XML __item; };"; usetypemap["xsd__ur_type"] = "xsd__ur_type"; } */ if (cflag) { deftypemap["xsd__anyType"] = ""; if (dflag) { usetypemap["xsd__anyType"] = "xsd__anyType"; } else { usetypemap["xsd__anyType"] = "_XML"; ptrtypemap["xsd__anyType"] = "_XML"; } } else { if (dflag) { deftypemap["xsd__anyType"] = ""; } else if (!soap_context || !*soap_context) { deftypemap["xsd__anyType"] = "class xsd__anyType\n{ public:\n _XML __item;\n};"; } else { size_t l = strlen(soap_context) + 67; char *t = (char*)emalloc(l + 1); (SOAP_SNPRINTF(t, l + 1, l), "class xsd__anyType\n{ public:\n _XML __item;\n struct soap *%s;\n};", soap_context); deftypemap["xsd__anyType"] = t; } // xsd__anyType ia a base class: use pointer so can replace with any derived class usetypemap["xsd__anyType"] = "xsd__anyType*"; } deftypemap["xsd__any"] = ""; if (dflag) { usetypemap["xsd__any"] = "xsd__anyType"; } else { usetypemap["xsd__any"] = "_XML"; ptrtypemap["xsd__any"] = "_XML"; } deftypemap["xsd__anyAttribute"] = ""; if (dflag) { usetypemap["xsd__anyAttribute"] = "xsd__anyAttribute"; } else { usetypemap["xsd__anyAttribute"] = "_XML"; ptrtypemap["xsd__anyAttribute"] = "_XML"; } if (cflag) { deftypemap["xsd__base64Binary"] = "struct xsd__base64Binary\n{\n unsigned char *__ptr;\n int __size;\n char *id, *type, *options; // NOTE: non-NULL for DIME/MIME/MTOM XOP attachments only\n};"; usetypemap["xsd__base64Binary"] = "struct xsd__base64Binary"; ptrtypemap["xsd__base64Binary"] = "struct xsd__base64Binary"; } else { deftypemap["xsd__base64Binary"] = "class xsd__base64Binary\n{ public:\n unsigned char *__ptr;\n int __size;\n char *id, *type, *options; // NOTE: non-NULL for DIME/MIME/MTOM XOP attachments only\n};"; usetypemap["xsd__base64Binary"] = "xsd__base64Binary"; } if (cflag) { if (eflag) deftypemap["xsd__boolean"] = "enum xsd__boolean { false_, true_ };"; else deftypemap["xsd__boolean"] = "enum xsd__boolean { xsd__boolean__false_, xsd__boolean__true_ };"; usetypemap["xsd__boolean"] = "enum xsd__boolean"; defename("xsd__boolean", "false", false); defename("xsd__boolean", "true", false); } else { deftypemap["xsd__boolean"] = ""; usetypemap["xsd__boolean"] = "bool"; } deftypemap["xsd__byte"] = "typedef char xsd__byte;"; usetypemap["xsd__byte"] = "xsd__byte"; deftypemap["xsd__dateTime"] = ""; usetypemap["xsd__dateTime"] = "time_t"; deftypemap["xsd__double"] = ""; usetypemap["xsd__double"] = "double"; deftypemap["xsd__float"] = ""; usetypemap["xsd__float"] = "float"; if (cflag) { deftypemap["xsd__hexBinary"] = "struct xsd__hexBinary\n{\n unsigned char *__ptr;\n int __size;\n};"; usetypemap["xsd__hexBinary"] = "struct xsd__hexBinary"; ptrtypemap["xsd__hexBinary"] = "struct xsd__hexBinary"; } else { deftypemap["xsd__hexBinary"] = "class xsd__hexBinary\n{ public:\n unsigned char *__ptr;\n int __size;\n};"; usetypemap["xsd__hexBinary"] = "xsd__hexBinary"; } deftypemap["xsd__int"] = ""; usetypemap["xsd__int"] = "int"; deftypemap["xsd__long"] = ""; usetypemap["xsd__long"] = "LONG64"; deftypemap["xsd__short"] = ""; usetypemap["xsd__short"] = "short"; if (cflag || sflag) { deftypemap["xsd__string"] = ""; usetypemap["xsd__string"] = "char*"; ptrtypemap["xsd__string"] = "char*"; } else { deftypemap["xsd__string"] = ""; usetypemap["xsd__string"] = "std::string"; } if (cflag || sflag) { deftypemap["xsd__QName"] = ""; usetypemap["xsd__QName"] = "_QName"; ptrtypemap["xsd__QName"] = "_QName"; } else { deftypemap["xsd__QName"] = "typedef std::string xsd__QName;"; usetypemap["xsd__QName"] = "xsd__QName"; } deftypemap["xsd__unsignedByte"] = "typedef unsigned char xsd__unsignedByte;"; usetypemap["xsd__unsignedByte"] = "xsd__unsignedByte"; deftypemap["xsd__unsignedInt"] = ""; usetypemap["xsd__unsignedInt"] = "unsigned int"; deftypemap["xsd__unsignedLong"] = ""; usetypemap["xsd__unsignedLong"] = "ULONG64"; deftypemap["xsd__unsignedShort"] = ""; usetypemap["xsd__unsignedShort"] = "unsigned short"; if (cflag) { deftypemap["SOAP_ENC__base64Binary"] = "struct SOAP_ENC__base64Binary\n{\n unsigned char *__ptr;\n int __size;\n};"; usetypemap["SOAP_ENC__base64Binary"] = "struct SOAP_ENC__base64Binary"; ptrtypemap["SOAP_ENC__base64Binary"] = "struct SOAP_ENC__base64Binary"; deftypemap["SOAP_ENC__base64"] = "struct SOAP_ENC__base64\n{\n unsigned char *__ptr;\n int __size;\n};"; usetypemap["SOAP_ENC__base64"] = "struct SOAP_ENC__base64"; ptrtypemap["SOAP_ENC__base64"] = "struct SOAP_ENC__base64"; } else { deftypemap["SOAP_ENC__base64Binary"] = "class SOAP_ENC__base64Binary\n{ public:\n unsigned char *__ptr;\n int __size;\n};"; usetypemap["SOAP_ENC__base64Binary"] = "SOAP_ENC__base64Binary"; deftypemap["SOAP_ENC__base64"] = "class SOAP_ENC__base64\n{ public:\n unsigned char *__ptr;\n int __size;\n};"; usetypemap["SOAP_ENC__base64"] = "SOAP_ENC__base64"; } if (cflag) { if (eflag) deftypemap["SOAP_ENC__boolean"] = "enum SOAP_ENC__boolean { false__, true__ };"; else deftypemap["SOAP_ENC__boolean"] = "enum SOAP_ENC__boolean { SOAP_ENC__boolean__false_, SOAP_ENC__boolean__true_ };"; usetypemap["SOAP_ENC__boolean"] = "enum SOAP_ENC__boolean"; defename("SOAP_ENC__boolean", "false", false); defename("SOAP_ENC__boolean", "true", false); } else { deftypemap["SOAP_ENC__boolean"] = "typedef bool SOAP_ENC__boolean;"; usetypemap["SOAP_ENC__boolean"] = "SOAP_ENC__boolean"; } deftypemap["SOAP_ENC__byte"] = "typedef char SOAP_ENC__byte;"; usetypemap["SOAP_ENC__byte"] = "SOAP_ENC__byte"; deftypemap["SOAP_ENC__dateTime"] = "typedef time_t SOAP_ENC__dateTime;"; usetypemap["SOAP_ENC__dateTime"] = "SOAP_ENC__dateTime"; deftypemap["SOAP_ENC__double"] = "typedef double SOAP_ENC__double;"; usetypemap["SOAP_ENC__double"] = "SOAP_ENC__double"; deftypemap["SOAP_ENC__float"] = "typedef float SOAP_ENC__float;"; usetypemap["SOAP_ENC__float"] = "SOAP_ENC__float"; if (cflag) { deftypemap["SOAP_ENC__hexBinary"] = "struct SOAP_ENC__hexBinary\n{\n unsigned char *__ptr;\n int __size;\n};"; usetypemap["SOAP_ENC__hexBinary"] = "struct SOAP_ENC__hexBinary"; ptrtypemap["SOAP_ENC__hexBinary"] = "struct SOAP_ENC__hexBinary"; } else { deftypemap["SOAP_ENC__hexBinary"] = "class SOAP_ENC__hexBinary\n{ public:\n unsigned char *__ptr;\n int __size;\n};"; usetypemap["SOAP_ENC__hexBinary"] = "SOAP_ENC__hexBinary"; } deftypemap["SOAP_ENC__int"] = "typedef int SOAP_ENC__int;"; usetypemap["SOAP_ENC__int"] = "SOAP_ENC__int"; deftypemap["SOAP_ENC__long"] = "typedef LONG64 SOAP_ENC__long;"; usetypemap["SOAP_ENC__long"] = "SOAP_ENC__long"; deftypemap["SOAP_ENC__short"] = "typedef short SOAP_ENC__short;"; usetypemap["SOAP_ENC__short"] = "SOAP_ENC__short"; if (cflag || sflag) { deftypemap["SOAP_ENC__string"] = "typedef char* SOAP_ENC__string;"; usetypemap["SOAP_ENC__string"] = "SOAP_ENC__string"; ptrtypemap["SOAP_ENC__string"] = "SOAP_ENC__string"; } else { deftypemap["SOAP_ENC__string"] = "typedef std::string SOAP_ENC__string;"; usetypemap["SOAP_ENC__string"] = "SOAP_ENC__string"; } deftypemap["SOAP_ENC__unsignedByte"] = "typedef unsigned char SOAP_ENC__unsignedByte;"; usetypemap["SOAP_ENC__unsignedByte"] = "SOAP_ENC__unsignedByte"; deftypemap["SOAP_ENC__unsignedInt"] = "typedef unsigned int SOAP_ENC__unsignedInt;"; usetypemap["SOAP_ENC__unsignedInt"] = "SOAP_ENC__unsignedInt"; deftypemap["SOAP_ENC__unsignedLong"] = "typedef ULONG64 SOAP_ENC__unsignedLong;"; usetypemap["SOAP_ENC__unsignedLong"] = "SOAP_ENC__unsignedLong"; deftypemap["SOAP_ENC__unsignedShort"] = "typedef unsigned short SOAP_ENC__unsignedShort;"; usetypemap["SOAP_ENC__unsignedShort"] = "SOAP_ENC__unsignedShort"; deftypemap["_SOAP_ENC__arrayType"] = ""; deftypemap["SOAP_ENV__Header"] = ""; usetypemap["SOAP_ENV__Header"] = "struct SOAP_ENV__Header"; deftypemap["_SOAP_ENV__mustUnderstand"] = ""; if (cflag || sflag) usetypemap["_SOAP_ENV__mustUnderstand"] = "char*"; else usetypemap["_SOAP_ENV__mustUnderstand"] = "std::string"; deftypemap["SOAP_ENV__Fault"] = ""; usetypemap["SOAP_ENV__Fault"] = "struct SOAP_ENV__Fault"; deftypemap["SOAP_ENV__detail"] = ""; usetypemap["SOAP_ENV__detail"] = "struct SOAP_ENV__Detail"; deftypemap["SOAP_ENV__Detail"] = ""; usetypemap["SOAP_ENV__Detail"] = "struct SOAP_ENV__Detail"; deftypemap["SOAP_ENV__Code"] = ""; usetypemap["SOAP_ENV__Code"] = "struct SOAP_ENV__Code"; deftypemap["SOAP_ENV__Reason"] = ""; usetypemap["SOAP_ENV__Reason"] = "struct SOAP_ENV__Reason"; usetypemap["$CONTAINER"] = "std::vector"; usetypemap["$SIZE"] = "int"; if (read(mapfile)) fprintf(stderr, "Problem reading type map file '%s'.\nUsing internal type definitions for %s instead.\n\n", mapfile, cflag ? "C" : "C++"); if (!cflag) { // xsd__anyType is a base class: use pointer so can replace with any derived class const char *r = vname("$POINTER"); if (r && *r != '*' && *r != '$' && !strcmp(usetypemap["xsd__anyType"], "xsd__anyType*")) { usetypemap["xsd__anyType"] = "xsd__anyType"; if (!fflag) smptypemap["xsd__anyType"] = usetypemap["xsd__anyType"] = pname(true, true, NULL, NULL, "xs:anyType"); } } } const char *Types::nsprefix(const char *prefix, const char *URI) { if (URI && *URI) { const char *s = uris[URI]; if (!s) { size_t n; if (!prefix || !*prefix || *prefix == '_') s = schema_prefix; else s = estrdup(prefix); if (!syms[s]) n = syms[s] = 1; else n = ++syms[s]; if (n != 1 || !prefix || !*prefix || *prefix == '_') { size_t l = strlen(s); char *t = (char*)emalloc(l + 21); (SOAP_SNPRINTF(t, l + 21, l + 20), "%s%lu", s, (unsigned long)n); s = t; } uris[URI] = s; if (vflag) fprintf(stderr, "namespace prefix %s = \"%s\"\n", s, URI); } // if *prefix == '_', then add prefix string to s if (prefix && *prefix == '_') { size_t l = strlen(s); char *t = (char*)emalloc(l + 2); *t = '_'; soap_strcpy(t + 1, l + 1, s); s = t; } return s; } return ""; } const char *Types::prefix(const char *name) { const char *s; char *t; if (*name == '"') { s = strchr(name + 1, '"'); t = (char*)emalloc(s - name); soap_strncpy(t, s - name, name + 1, s - name - 1); return nsprefix(NULL, t); } s = strchr(name, ':'); if (s) { t = (char*)emalloc(s - name + 1); soap_strncpy(t, s - name + 1, name, s - name); return t; } return NULL; } const char *Types::uri(const char *name) { const char *s; char *t; if (*name == '"') { s = strchr(name + 1, '"'); t = (char*)emalloc(s - name); soap_strncpy(t, s - name, name + 1, s - name - 1); return t; } s = strchr(name, ':'); if (s) { struct Namespace *p = namespaces; if (p) { for (p += 6; p->id; p++) { if (!strncmp(p->id, name, s - name) && !p->id[s - name]) { if (p->in && *p->in) return p->in; return p->ns; } } } } return NULL; } // Find a C name for a QName. If the name has no qualifier, use URI. Suggest prefix for URI const char *Types::fname(const char *prefix, const char *URI, const char *qname, SetOfString *reserved, enum Lookup lookup, bool isqname) { char buf[4096], *t; const char *p, *s, *name; if (!qname) { fprintf(stream, "// Warning: FIXME internal error, no QName in fname()\n"); if (vflag) fprintf(stderr, "Internal error, no QName in fname()\n"); qname = "?"; } name = qname; if (isqname) s = strrchr(name, ':'); else s = NULL; if (s) { name = s + 1; if (qname[0] == '"' && qname[1] == '"') { s = NULL; } else if (*qname == '"') { t = (char*)emalloc(s - qname - 1); soap_strncpy(t, s - qname - 1, qname + 1, s - qname - 2); URI = t; } else if (!strncmp(qname, "xs:", 3)) // this hack is necessary since the nsmap table defines "xs" for "xsd" { s = "xsd"; URI = NULL; } else { t = (char*)emalloc(s - qname + 1); soap_strncpy(t, s - qname + 1, qname, s - qname); s = t; URI = NULL; } } if (URI && *URI) p = nsprefix(prefix, URI); else if (s) p = s; else p = ""; s = NULL; if (lookup == LOOKUP) { if (qnames.find(Pair(p,name)) != qnames.end()) s = qnames[Pair(p,name)]; } if (!s) { t = buf; if (!prefix || *prefix) { s = p; // no longer add '_' when URI != NULL, since nsprefix() will do this if (prefix && *prefix == ':') *t++ = ':'; else if (prefix && *prefix == '_') { if (!URI || !*URI) *t++ = '_'; if (prefix[1] == '_') // ensures ns prefix starts with __ { soap_strcpy(t, sizeof(buf) - (t - buf), prefix + 1); t += strlen(prefix + 1); } } if (s && *s) { for (; *s; s++) { if (t >= buf + sizeof(buf) - 8) break; if (isalnum(*s)) { *t++ = *s; } else if (*s == '-' && s[1] != '-' && s != p) { *t++ = '_'; } else if (*s == '_') { if (s == p) *t++ = '_'; else if (!_flag) { soap_strcpy(t, sizeof(buf) - (t - buf), "_USCORE"); t += 7; } else { s = utf8(&t, s, t == buf) - 1; } } else { s = utf8(&t, s, t == buf) - 1; } } if (!prefix || *prefix != '*') { *t++ = '_'; *t++ = '_'; } } else if (isdigit(*name)) { *t++ = '_'; } } for (s = name; *s; s++) { if (t >= buf + sizeof(buf) - 8) break; if (isalnum(*s)) { *t++ = *s; } else if (*s == '-' && s[1] != '-' && s[1] != '\0' && s != name) { *t++ = '_'; } else if (!_flag && *s == '_') { soap_strcpy(t, sizeof(buf) - (t - buf), "_USCORE"); t += 7; } else { s = utf8(&t, s, t == buf) - 1; } } *t = '\0'; s = strchr(buf, ':'); if (s) s++; else s = buf; while (knames.find(s) != knames.end() || (reserved && reserved->find(s) != reserved->end())) { if (t >= buf + sizeof(buf) - 8) break; *t++ = '_'; *t = '\0'; } if (isalpha(*buf) || *buf == '_' || *buf == ':') { size_t l = strlen(buf); t = (char*)emalloc(l + 1); soap_strcpy(t, l + 1, buf); } else { size_t l = strlen(buf); t = (char*)emalloc(l + 2); *t = '_'; soap_strcpy(t + 1, l + 1, buf); } s = t; if (lookup == LOOKUP) { qnames[Pair(p,name)] = s; if (vflag) { std::cerr << "Mapping '" << p << ":" << name << "' to '" << s << "'" << std::endl; #ifdef DEBUG for (MapOfPairToString::const_iterator i = qnames.begin(); i != qnames.end(); ++i) std::cerr << "Map[" << (*i).first.first << ":" << (*i).first.second << "]='" << (*i).second << "'" << std::endl; #endif } } } return s; } bool Types::is_defined(const char *prefix, const char *URI, const char *qname) { const char *t = fname(prefix, URI, qname, NULL, LOOKUP, true); return usetypemap.find(t) != usetypemap.end(); } const char *Types::aname(const char *prefix, const char *URI, const char *qname, SetOfString *reserved) { const char *s = fname(prefix, URI, qname, reserved, NOLOOKUP, true); if (reserved) reserved->insert(s); return s; } const char *Types::wname(const char *prefix, const char *URI, const char *qname, enum Lookup lookup) { SetOfString reserved; const char *t = aname(prefix, URI, qname, &reserved); const char *s; if (!zflag || zflag > 8) { if (lookup == LOOKUP) { MapOfStringToString::const_iterator i = wnames.find(t); if (i != wnames.end()) return (*i).second; fprintf(stream, "// Warning: FIXME internal error, incomplete wnames\n"); return qname; } s = fname(prefix, URI, qname, &reserved, NOLOOKUP, true); if (cflag) { size_t l = strlen(s); char *r = (char*)emalloc(l + 8); soap_strcpy(r, l + 8, "struct "); soap_strcpy(r + 7, l + 1, s); wnames[t] = r; } else { wnames[t] = s; } } else { s = fname(prefix, URI, qname, &reserved, NOLOOKUP, true); } knames.insert(s); return s; } const char *Types::cname(const char *prefix, const char *URI, const char *qname) { return fname(prefix, URI, qname, NULL, LOOKUP, true); } const char *Types::tname(const char *prefix, const char *URI, const char *qname) { const char *s = NULL, *t; t = cname(prefix, URI, qname); MapOfStringToString::const_iterator i = usetypemap.find(t); if (i != usetypemap.end()) s = (*i).second; if (!s) { s = t; fprintf(stream, "\n/// @todo !FIXME! @warning Undefined QName %s for type %s in namespace \"%s\", check WSDL and schema definitions.\n", qname ? qname : "", t, URI ? URI : "?"); if (vflag) fprintf(stderr, "\nWarning: undefined QName %s for type %s in namespace \"%s\"\n", qname ? qname : "", t, URI ? URI : "?"); } if (vflag) std::cerr << "Mapping use of '" << t << "' to '" << s << "'" << std::endl; return s; } const char *Types::tnameptr(bool flag, const char *prefix, const char *URI, const char *qname) { const char *s = pname(flag, !flag, prefix, URI, qname); if (flag) { if (!strchr(s, '*') || !strncmp(s, "char", 4) || !strncmp(s, "const char", 10) || !strncmp(s, "wchar_t", 7) || !strncmp(s, "const wchar_t", 13) || !strncmp(s, "_QName", 6) || !strncmp(s, "_XML", 4)) { size_t l = strlen(s); char *r = (char*)emalloc(l + 2); soap_strcpy(r, l + 2, s); soap_strcpy(r + l, 2, "*"); return r; } } return s; } const char *Types::tnamenoptr(const char *prefix, const char *URI, const char *qname) { const char *s = tname(prefix, URI, qname); if (strchr(s, '*') && (!strncmp(s, "char", 4) || !strncmp(s, "const char", 10) || !strncmp(s, "wchar_t", 7) || !strncmp(s, "const wchar_t", 13) || !strncmp(s, "_QName", 6) || !strncmp(s, "_XML", 4))) return s; size_t n = strlen(s); if (s[n - 1] == '*') { char *r = (char*)emalloc(n); soap_strncpy(r, n, s, n - 1); return r; } return s; } const char *Types::pname(bool flag, bool smart, const char *prefix, const char *URI, const char *qname) { const char *s = NULL, *t; t = cname(prefix, URI, qname); if (flag) { const char *r = NULL; if (!cflag && smart && (r = vname("$POINTER")) && *r != '*' && *r != '$') { MapOfStringToString::const_iterator i = smptypemap.find(t); if (i != smptypemap.end()) { s = (*i).second; } else { i = usetypemap.find(t); if (i != usetypemap.end()) s = (*i).second; if (!s) { s = t; fprintf(stream, "\n/// @todo !FIXME! @warning Undefined QName %s for pointer to type %s, check WSDL and schema definitions.\n", qname, t); if (vflag) fprintf(stderr, "\nWarning: undefined QName %s for pointer to type %s in namespace \"%s\"\n", qname, t, URI ? URI : "?"); } if (!is_ptr(prefix, URI, qname)) { size_t k = strlen(r); size_t l = strlen(s); char *p = (char*)emalloc(k + l + 4); soap_strcpy(p, k + l + 4, r); soap_strcpy(p + k, l + 4, "<"); soap_strcpy(p + k + 1, l + 3, s); soap_strcpy(p + k + l + 1, 3, "> "); s = p; } if (vflag) std::cerr << "Mapping \"smart\" pointer of '" << t << "' to '" << s << "'" << std::endl; smptypemap[t] = s; } } else { MapOfStringToString::const_iterator i = ptrtypemap.find(t); if (i != ptrtypemap.end()) { s = (*i).second; } else { i = usetypemap.find(t); if (i != usetypemap.end()) s = (*i).second; if (!s) { s = t; fprintf(stream, "\n/// @todo !FIXME! @warning Undefined QName %s for pointer to type %s, check WSDL and schema definitions.\n", qname, t); if (vflag) fprintf(stderr, "\nWarning: undefined QName %s for pointer to type %s in namespace \"%s\"\n", qname, t, URI ? URI : "?"); } if (!is_ptr(prefix, URI, qname)) { size_t l = strlen(s); char *p = (char*)emalloc(l + 2); soap_strcpy(p, l + 2, s); soap_strcpy(p + l, 2, "*"); s = p; } if (vflag) std::cerr << "Mapping pointer of '" << t << "' to '" << s << "'" << std::endl; ptrtypemap[t] = s; } } } else { MapOfStringToString::const_iterator i = usetypemap.find(t); if (i != usetypemap.end()) { if (!cflag && smart && smptypemap.find(t) != smptypemap.end() && ptrtypemap.find(t) != ptrtypemap.end() && usetypemap[t] == ptrtypemap[t]) s = smptypemap[t]; else s = usetypemap[t]; } if (!s) { s = t; fprintf(stream, "\n/// @todo !FIXME! @warning Undefined QName %s for type %s in namespace \"%s\", check WSDL and schema definitions.\n", qname, t, URI ? URI : "?"); if (vflag) fprintf(stderr, "\nWarning: undefined QName %s for type %s in namespace \"%s\"\n", qname, t, URI ? URI : "?"); } } return s; } const char *Types::deftname(enum Type type, bool mk_pointer, bool is_pointer, const char *prefix, const char *URI, const char *qname, const char *base) { char buf[4096]; const char *t = fname(prefix, URI, qname, NULL, LOOKUP, true); if (deftypemap[t]) { if (vflag) fprintf(stderr, "Name %s already defined (probably in typemap \"%s\")\n", qname, mapfile); return NULL; } if (usetypemap[t]) { if (vflag) fprintf(stderr, "Name %s is mapped\n", qname); return t; } const char *q = NULL; switch (type) { case ENUM: if (!c11flag) q = "enum"; if (c11flag || yflag) knames.insert(t); break; case STRUCT: q = "struct"; if (yflag) knames.insert(t); break; case CLASS: knames.insert(t); break; case TYPEDEF: knames.insert(t); if (base) ctypemap[t] = ctype(base); break; default: break; } buf[0] = '\0'; size_t n = 0; if (q) { soap_strcpy(buf, sizeof(buf), q); n = strlen(buf); soap_strcpy(buf + n, sizeof(buf) - n, " "); ++n; } soap_strcpy(buf + n, sizeof(buf) - n, t); const char *r = vname("$POINTER"); if (!cflag && !is_pointer && r && *r != '*' && *r != '$') { n = strlen(buf); size_t l = strlen(r); char *s = (char*)emalloc(l + n + 4); soap_strcpy(s, l + n + 4, r); soap_strcpy(s + l, n + 4, "<"); (void)soap_memcpy(s + l + 1, n + 3, buf, n + 1); soap_strcpy(s + l + n + 1, 3, "> "); smptypemap[t] = s; } if (mk_pointer) { n = strlen(buf); soap_strcpy(buf + n, sizeof(buf) - n, "*"); } n = strlen(buf); char *s = (char*)emalloc(n + 1); soap_strcpy(s, n + 1, buf); usetypemap[t] = s; if (mk_pointer || is_pointer) ptrtypemap[t] = s; if (is_pointer) smptypemap[t] = s; if (vflag) std::cerr << "Defined '" << t << "' ('" << qname << "' in namespace '" << (URI ? URI : prefix ? prefix : "") << "') as '" << s << "'" << std::endl; return t; } // get enumeration value. URI/type refers to the enum simpleType. const char *Types::ename(const char *type, const char *value, bool isqname) { if (c11flag) return fname(NULL, NULL, value, NULL, NOLOOKUP, isqname); const char *s = enames[Pair(type,value)]; if (!s) return defename(type, value, isqname); return s; } // get operation name const char *Types::oname(const char *prefix, const char *URI, const char *qname) { const char *s = fname(prefix, URI, qname, NULL, LOOKUP, true); if (s && usetypemap.find(s) != usetypemap.end()) { // Avoid name clash with structs/classes of the same name onames.insert(s); } s = fname(prefix, URI, qname, &onames, NOLOOKUP, true); onames.insert(s); return s; } // generate struct name const char *Types::sname(const char *URI, const char *name) { const char *s; char *t; if (!name || aflag) { t = (char*)emalloc(28); (SOAP_SNPRINTF(t, 28, 27), "struct-%d", snum++); s = fname("_", URI, t, &rnames, NOLOOKUP, true); rnames.insert(s); return s; } size_t l = strlen(name) + 1; for (VectorOfString::const_iterator i = scope.begin(); i != scope.end(); ++i) l += strlen(*i) + 1; t = (char*)emalloc(l); size_t n = 0; for (VectorOfString::const_iterator j = scope.begin(); j != scope.end(); ++j) { soap_strcpy(t + n, l - n, *j); n = strlen(t); soap_strcpy(t + n, l - n, "-"); ++n; if (n >= l) break; } soap_strcpy(t + n, l - n, name); s = fname("_", URI, t, &rnames, NOLOOKUP, true); rnames.insert(s); return s; } // generate union name const char *Types::uname(const char *URI) { const char *s; char *t; if (aflag) { t = (char*)emalloc(28); (SOAP_SNPRINTF(t, 28, 27), "union-%d", unum++); s = fname("_", URI, t, &rnames, NOLOOKUP, true); rnames.insert(s); return s; } size_t l = 0; for (VectorOfString::const_iterator i = scope.begin(); i != scope.end(); ++i) l += strlen(*i) + 1; t = (char*)emalloc(l + 6); soap_strcpy(t, l + 6, "union"); size_t n = 5; for (VectorOfString::const_iterator j = scope.begin(); j != scope.end(); ++j) { soap_strcpy(t + n, l + 6 - n, "-"); soap_strcpy(t + n + 1, l + 5 - n, *j); n = strlen(t); } s = fname("_", URI, t, &rnames, NOLOOKUP, true); rnames.insert(s); return s; } // generate enum name const char *Types::gname(const char *URI, const char *name) { const char *s; char *t; if (!name || aflag) { t = (char*)emalloc(28); (SOAP_SNPRINTF(t, 28, 27), "enum-%d", gnum++); s = fname("_", URI, t, &rnames, NOLOOKUP, true); rnames.insert(s); return s; } size_t l = strlen(name) + 1; for (VectorOfString::const_iterator i = scope.begin(); i != scope.end(); ++i) l += strlen(*i) + 1; t = (char*)emalloc(l); size_t n = 0; for (VectorOfString::const_iterator j = scope.begin(); j != scope.end(); ++j) { soap_strcpy(t + n, l - n, *j); n = strlen(t); soap_strcpy(t + n, l - n, "-"); ++n; if (n >= l) break; } soap_strcpy(t + n, l - n, name); s = fname("_", URI, t, &rnames, LOOKUP, true); rnames.insert(s); return s; } const char *Types::vname(const char *var) { MapOfStringToString::const_iterator i = usetypemap.find(var); if (i != usetypemap.end()) return (*i).second; return var; } // set enumeration value. URI/type refers to the enum simpleType. const char *Types::defename(const char *type, const char *value, bool isqname) { const char *s = fname(NULL, NULL, value, &rnames, NOLOOKUP, isqname); if (!eflag && type && *type) { // Add prefix to enum if (!*s || (s[0] == '_' && s[1] == '\0')) s = "_x0000"; size_t l = strlen(type) + strlen(s); char *buf = (char*)emalloc(l + 3); // _xXXXX is OK here if (s[0] == '_' && s[1] != 'x' && strncmp(s, "_USCORE", 7)) (SOAP_SNPRINTF(buf, l + 3, l + 1), "%s_%s", type, s); else (SOAP_SNPRINTF(buf, l + 3, l + 2), "%s__%s", type, s); s = buf; } else { rnames.insert(s); } enames[Pair(type,value)] = s; return s; } // checks if nillable or minOccurs=0 bool Types::is_nillable(const xs__element& element) { return (element.nillable || (element.minOccurs && !strcmp(element.minOccurs, "0"))); } // checks if permitted as union member bool Types::is_choicetype(const char *prefix, const char *URI, const char *type) { // TODO: consider c11flag also safe, but classes containing unions must define assignment ops using the selector(s) if (cflag) return true; if (type && !strcmp(type, "xs:byte")) return true; const char *t = tname(prefix, URI, type); return ( !strncmp(t, "enum ", 5) || !strcmp(t, "bool") || !strcmp(t, "int8_t") || !strcmp(t, "int16_t") || !strcmp(t, "int32_t") || !strcmp(t, "int64_t") || !strcmp(t, "uint8_t") || !strcmp(t, "uint16_t") || !strcmp(t, "uint32_t") || !strcmp(t, "uint64_t") || !strcmp(t, "char") || !strcmp(t, "unsigned char") || !strcmp(t, "short") || !strcmp(t, "unsigned short") || !strcmp(t, "int") || !strcmp(t, "unsigned int") || !strcmp(t, "long") || !strcmp(t, "long long") || !strcmp(t, "unsigned long") || !strcmp(t, "unsigned long long") || !strcmp(t, "LONG64") || !strcmp(t, "ULONG64") || !strcmp(t, "float") || !strcmp(t, "double") || !strcmp(t, "long double") || !strcmp(t, "time_t") || !strcmp(t, "_QName") || !strcmp(t, "_XML") ); } bool Types::is_ptr(const char *prefix, const char *URI, const char *qname) { const char *t = cname(prefix, URI, qname); const char *s = NULL; /* TODO perhaps looking at the typedef base type to see if this is a pointer? But this may not be desirable in all cases MapOfStringToString::const_iterator i = deftypemap.find(t); if (i != deftypemap.end()) { s = (*i).second; if (s && !strncmp(s, "typedef ", 8)) s += 8; } */ if ((!s || !*s) && usetypemap.find(t) != usetypemap.end()) { s = usetypemap[t]; if (ptrtypemap.find(t) != ptrtypemap.end() && s == ptrtypemap[t]) return true; if (!strcmp(s, "_QName") || !strcmp(s, "_XML")) return true; while (s && *s) { s = strchr(s + 1, '*'); if (s && *(s-1) != '/' && *(s+1) != '/') return true; } } return false; } void Types::dump(FILE *fd) { fprintf(fd, "\nTypes:\n"); for (MapOfStringToString::const_iterator i = usetypemap.begin(); i != usetypemap.end(); ++i) fprintf(fd, "%s=%s\n", (*i).first, (*i).second ? (*i).second : "(null)"); fprintf(fd, "\nPointers:\n"); for (MapOfStringToString::const_iterator j = ptrtypemap.begin(); j != ptrtypemap.end(); ++j) fprintf(fd, "%s=%s\n", (*j).first, (*j).second ? (*j).second : "(null)"); } void Types::define(const char *URI, const char *name, const xs__complexType& complexType) { if (Oflag > 1 && !complexType.is_used()) return; // generate prototype for structs/classes and store name const char *prefix = NULL; if (complexType.name) name = complexType.name; else prefix = "_"; if (complexType.complexContent && complexType.complexContent->restriction && !strcmp(complexType.complexContent->restriction->base, "SOAP-ENC:Array")) { if (strcmp(schema_prefix, "ns")) prefix = "*"; else prefix = ""; } if (cflag) { const char *t = deftname(STRUCT, true, false, prefix, URI, name, NULL); if (t) { if (yflag) fprintf(stream, "/// @brief Typedef synonym for struct %s.\ntypedef struct %s %s;\n\n", t, t, t); } else if (name) { t = deftypemap[cname(prefix, URI, name)]; if (t) { fprintf(stream, "/// Imported complexType \"%s\":%s from typemap \"%s\".\n", URI, name, mapfile ? mapfile : ""); document(complexType.annotation); if (*t) format(t); else fprintf(stream, "// complexType definition intentionally left blank.\n"); fprintf(stream, "\n"); } } } else { const char *t = deftname(CLASS, true, false, prefix, URI, name, NULL); if (t) { fprintf(stream, "class %s;\n\n", t); } else if (name) { const char *s = cname(prefix, URI, name); t = deftypemap[s]; if (t) { fprintf(stream, "/// Imported complexType \"%s\":%s from typemap \"%s\".\n", URI, name, mapfile ? mapfile : ""); document(complexType.annotation); if (*t) format(t); else fprintf(stream, "// complexType definition for %s intentionally left blank.\n", s); fprintf(stream, "\n"); } } } } void Types::gen(const char *URI, const char *name, const xs__simpleType& simpleType, bool anonymous, bool nested_restriction) { const char *t = NULL; const char *prefix = NULL; if (simpleType.name) name = simpleType.name; else if (!nested_restriction) prefix = "_"; if (!anonymous) { ++total; if (Oflag > 1 && !simpleType.is_used()) { fprintf(stream, "// Optimization: simpleType \"%s\":%s is not used and was removed\n\n", URI, name ? name : ""); ++omitted; return; } } if (!anonymous) { t = deftypemap[cname(NULL, URI, name)]; if (t) { fprintf(stream, "/// Imported simpleType \"%s\":%s from typemap \"%s\".\n", URI, name, mapfile ? mapfile : ""); document(simpleType.annotation); if (*t) format(t); else fprintf(stream, "// simpleType definition intentionally left blank.\n"); return; } } if (simpleType.restriction) { const char *base = simpleType.restriction->base; const xs__simpleType *ref = simpleType.restriction->simpleTypePtr(); while (ref && ref->restriction) ref = ref->restriction->simpleTypePtr(); if (simpleType.restriction->complexTypePtr()) { fprintf(stderr, "\nWarning: %s\"%s\":%s simpleType restriction has invalid base %s complexType\n", anonymous ? "local element/attribute " : "", URI ? URI : "", name ? name : "", base ? base : ""); } if (ref && ref->list) { const char *baseURI = NULL; if (simpleType.restriction->simpleTypePtr() && simpleType.restriction->simpleTypePtr()->schemaPtr()) baseURI = simpleType.restriction->simpleTypePtr()->schemaPtr()->targetNamespace; if (!anonymous) { if (simpleType.restriction->length && simpleType.restriction->length->value) { fprintf(stream, "/// @brief \"%s\":%s is a simpleType restriction of list %s of length %s.\n///\n", URI ? URI : "", name, base ? base : "", simpleType.restriction->length->value); document(simpleType.restriction->length->annotation); } else { const char *a = NULL, *b = "unbounded"; if (simpleType.restriction->minLength) { a = simpleType.restriction->minLength->value; document(simpleType.restriction->minLength->annotation); } if (simpleType.restriction->maxLength) { b = simpleType.restriction->maxLength->value; document(simpleType.restriction->maxLength->annotation); } if (a || b) fprintf(stream, "/// @brief \"%s\":%s is a simpleType of restriction of list %s of length %s..%s.\n", URI ? URI : "", name, base ? base : "", a ? a : "0", b ? b : ""); else fprintf(stream, "/// @brief \"%s\":%s is a simpleType of restriction of list %s.\n///\n", URI ? URI : "", name, base ? base : ""); } if (!simpleType.get_extensions().empty()) { fprintf(stream, "/// This type is extended by:\n"); for (std::vector::const_iterator i = simpleType.get_extensions().begin(); i != simpleType.get_extensions().end(); ++i) { if (is_defined(NULL, NULL, *i)) fprintf(stream, "/// - %s as %s\n", *i, tnamenoptr(NULL, NULL, *i)); else if (!Owflag) fprintf(stream, "/// - %s (not used and removed, retain with option -Ow%d)\n", *i, Oflag); else fprintf(stream, "/// - %s (not used and removed)\n", *i); } fprintf(stream, "///\n"); } if (!simpleType.get_restrictions().empty()) { fprintf(stream, "/// This type is restricted by:\n"); for (std::vector::const_iterator i = simpleType.get_restrictions().begin(); i != simpleType.get_restrictions().end(); ++i) { if (is_defined(NULL, NULL, *i)) fprintf(stream, "/// - %s as %s\n", *i, tnamenoptr(NULL, NULL, *i)); else fprintf(stream, "/// - %s (not used and removed)\n", *i); } fprintf(stream, "///\n"); } } const char *s = tname(NULL, baseURI, base); if (!anonymous) { t = deftname(TYPEDEF, false, is_ptr(NULL, baseURI, base), prefix, URI, name, s); if (t) fprintf(stream, "typedef %s %s;\n\n", s, t); } else { t = ""; fprintf(stream, elementformat, s, ""); fprintf(stream, "\n"); } } else if (!base && simpleType.restriction->simpleType) { if (!anonymous) { if (simpleType.restriction->simpleType->list && simpleType.restriction->length && simpleType.restriction->length->value) { fprintf(stream, "/// @brief \"%s\":%s is a simpleType restriction list of length %s.\n///\n", URI ? URI : "", name, simpleType.restriction->length->value); document(simpleType.restriction->length->annotation); } else { const char *a = NULL, *b = "unbounded"; if (simpleType.restriction->minLength) { a = simpleType.restriction->minLength->value; document(simpleType.restriction->minLength->annotation); } if (simpleType.restriction->maxLength) { b = simpleType.restriction->maxLength->value; document(simpleType.restriction->maxLength->annotation); } if (a || b) fprintf(stream, "/// @brief \"%s\":%s is a simpleType restriction list of length %s..%s.\n", URI ? URI : "", name, a ? a : "0", b ? b : ""); else fprintf(stream, "/// @brief \"%s\":%s is a simpleType restriction list.\n///\n", URI ? URI : "", name); } } gen(URI, name, *simpleType.restriction->simpleType, anonymous, true); } else { if (!base) base = "xs:string"; const char *baseURI = NULL; if (simpleType.restriction->simpleTypePtr() && simpleType.restriction->simpleTypePtr()->schemaPtr()) baseURI = simpleType.restriction->simpleTypePtr()->schemaPtr()->targetNamespace; if (!anonymous) fprintf(stream, "/// @brief \"%s\":%s is a simpleType restriction of type %s.\n///\n", URI ? URI : "", name, base); document(simpleType.annotation); document(simpleType.restriction->annotation); if (simpleType.restriction->assertion && simpleType.restriction->assertion->test) { fprintf(stream, "/// Assertion:\n"); documentation(simpleType.restriction->assertion->test); } if (!simpleType.restriction->enumeration.empty()) { bool is_qname = !strcmp(base, "xs:QName"); if (!anonymous) { t = deftname(ENUM, false, false, prefix, URI, name, NULL); if (t && !eflag && !c11flag && !Lflag) fprintf(stream, "/// @note The enum values are prefixed with \"%s__\" to prevent name clashes: use wsdl2h option -e to omit this prefix or use option -c++11 for scoped enumerations\n", t); } if (!t) t = gname(URI, name); if (c11flag) { if (!anonymous) fprintf(stream, "enum class %s\n{\n", t); else fprintf(stream, " enum class %s\n {\n", t); } else { if (!anonymous) fprintf(stream, "enum %s\n{\n", t); else fprintf(stream, " enum %s\n {\n", t); } SetOfString enumvals; LONG64 enumval = 0; if (!is_qname) { bool letters_ok = true; for (std::vector::const_iterator enumeration = simpleType.restriction->enumeration.begin(); enumeration != simpleType.restriction->enumeration.end(); ++enumeration) { const char *s; if ((s = (*enumeration).value)) { if (!enumvals.count(s)) { if (is_integer(s)) { LONG64 n = soap_strtoll(s, NULL, 10); document((*enumeration).annotation); fprintf(stream, "\t%s = " SOAP_LONG_FORMAT ",\t///< %s value=\"%s\"\n", ename(eflag ? "enum int" : t, s, false), n, base, s); // type="enum int" if eflag so all int enum consts get the same value assigned enumvals.insert(s); if (letters_ok) { if ((n >= 'A' && n <= 'Z') || (n >= 'a' && n <= 'z')) letters_ok = false; } if (n > enumval) enumval = n; } } } } if (letters_ok) { for (std::vector::const_iterator enumeration = simpleType.restriction->enumeration.begin(); enumeration != simpleType.restriction->enumeration.end(); ++enumeration) { const char *s; if ((s = (*enumeration).value)) { if (!enumvals.count(s)) { if (isalpha(s[0]) && !s[1]) { document((*enumeration).annotation); fprintf(stream, "\t%s = '%c',\t///< %s value=\"%s\"\n", ename(eflag ? "enum char" : t, s, false), *s, base, s); // type="enum char" if eflag so all char enum consts get the same value assigned enumvals.insert(s); if (*s > enumval) enumval = *s; } } } } } } for (std::vector::const_iterator enumeration = simpleType.restriction->enumeration.begin(); enumeration != simpleType.restriction->enumeration.end(); ++enumeration) { const char *s; if ((s = (*enumeration).value)) { if (!enumvals.count(s)) { document((*enumeration).annotation); if (is_qname) fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value_, true), base, (*enumeration).value_); else if (enumval) fprintf(stream, "\t%s = " SOAP_LONG_FORMAT ",\t///< %s value=\"%s\"\n", ename(t, s, false), ++enumval, base, s); else fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, s, false), base, s); enumvals.insert(s); } } else { fprintf(stream, "//\tunrecognized: enumeration \"%s\" has no value\n", name ? name : ""); } } if (!anonymous) { fprintf(stream, "};\n\n"); if (!c11flag && yflag) fprintf(stream, "/// @brief Typedef synonym for enum %s.\ntypedef enum %s %s;\n\n", t, t, t); if (!cflag && !Fflag && pflag && simpleType.name) { const char *s = wname(prefix, URI, name, NOLOOKUP); const char *t = tname(prefix, URI, name); fprintf(stream, "/// @brief Class wrapper for type %s derived from xsd__anyType.\n///\n", t); if (!Lflag) fprintf(stream, "/// @note Use option -P to remove this class.\n"); fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s); fprintf(stream, elementformat, t, "__item;"); modify(s); fprintf(stream, "\n};\n\n"); } } else fprintf(stream, " }\n"); } else { if (simpleType.restriction->length && simpleType.restriction->length->value) { fprintf(stream, "/// Length of this content is %s.\n", simpleType.restriction->length->value); document(simpleType.restriction->length->annotation); } else { const char *a = NULL, *b = NULL; if (simpleType.restriction->minLength) { a = simpleType.restriction->minLength->value; document(simpleType.restriction->minLength->annotation); } if (simpleType.restriction->maxLength) { b = simpleType.restriction->maxLength->value; document(simpleType.restriction->maxLength->annotation); } if (a || b) { fprintf(stream, "/// Length of this content is %s to %s.\n", a ? a : "0", b ? b : "unbounded"); } } char format[16]; format[0] = '\0'; if (simpleType.restriction->precision && simpleType.restriction->precision->value) { soap_strcpy(format, sizeof(format), simpleType.restriction->precision->value); fprintf(stream, "/// %s is %s.\n", simpleType.restriction->precision->fixed ? "Fixed precision" : "Precision", simpleType.restriction->precision->value); } else if (simpleType.restriction->totalDigits && simpleType.restriction->totalDigits->value) { soap_strcpy(format, sizeof(format), simpleType.restriction->totalDigits->value); fprintf(stream, "/// %s of total digits is %s.\n", simpleType.restriction->totalDigits->fixed ? "Fixed number" : "Number", simpleType.restriction->totalDigits->value); } if (simpleType.restriction->scale && simpleType.restriction->scale->value) { size_t n = strlen(format); soap_strcpy(format + n, sizeof(format) - n, "."); soap_strcpy(format + n + 1, sizeof(format) - n - 1, simpleType.restriction->scale->value); fprintf(stream, "/// %s is %s.\n", simpleType.restriction->scale->fixed ? "Fixed scale" : "Scale", simpleType.restriction->scale->value); } else if (simpleType.restriction->fractionDigits && simpleType.restriction->fractionDigits->value) { size_t n = strlen(format); soap_strcpy(format + n, sizeof(format) - n, "."); soap_strcpy(format + n + 1, sizeof(format) - n - 1, simpleType.restriction->fractionDigits->value); fprintf(stream, "/// %s of fraction digits is %s.\n", simpleType.restriction->fractionDigits->fixed ? "Fixed number" : "Number", simpleType.restriction->fractionDigits->value); } for (std::vector::const_iterator pattern1 = simpleType.restriction->pattern.begin(); pattern1 != simpleType.restriction->pattern.end(); ++pattern1) fprintf(stream, "/// Content pattern is \"%s\".\n", xstring((*pattern1).value)); const char *ai = NULL, *ae = NULL, *bi = NULL, *be = NULL; if (simpleType.restriction->minInclusive) { ai = simpleType.restriction->minInclusive->value; document(simpleType.restriction->minInclusive->annotation); } else if (simpleType.restriction->minExclusive) { ae = simpleType.restriction->minExclusive->value; document(simpleType.restriction->minExclusive->annotation); } if (simpleType.restriction->maxInclusive) { bi = simpleType.restriction->maxInclusive->value; document(simpleType.restriction->maxInclusive->annotation); } else if (simpleType.restriction->maxExclusive) { be = simpleType.restriction->maxExclusive->value; document(simpleType.restriction->maxExclusive->annotation); } if (ai || ae || bi || be) { fprintf(stream, "/// Value range is "); if (ai) fprintf(stream, "%s", ai); else if (ae) fprintf(stream, "%s (exclusive)", ae); else fprintf(stream, "lowest"); fprintf(stream, " to "); if (bi) fprintf(stream, "%s.\n", bi); else if (be) fprintf(stream, "%s (exclusive).\n", be); else fprintf(stream, "highest.\n"); } if (!simpleType.restriction->attribute.empty()) { if (!Wflag) fprintf(stderr, "\nWarning: simpleType \"%s\" should not have attributes\n", name ? name : ""); } const char *s = tname(NULL, baseURI, base); if (!anonymous) { t = deftname(TYPEDEF, false, is_ptr(NULL, baseURI, base), prefix, URI, name, s); if (t) fprintf(stream, "typedef %s %s", s, t); } else { t = ""; fprintf(stream, elementformat, s, ""); fprintf(stream, "\n"); } if (t) { if (!anonymous && !simpleType.restriction->pattern.empty()) { fprintf(stream, " \""); for (std::vector::const_iterator pattern2 = simpleType.restriction->pattern.begin(); pattern2 != simpleType.restriction->pattern.end(); ++pattern2) { if (pattern2 != simpleType.restriction->pattern.begin()) fprintf(stream, "|"); fprintf(stream, "%s", xstring((*pattern2).value)); } fprintf(stream, "\""); } // add range info only when type is numeric CType type = ctype(s); if (!anonymous && *format) { if (type == CTLONGDOUBLE) { fprintf(stream, " \"%%%sLf\"", format); } else if (type == CTDOUBLE) { fprintf(stream, " \"%%%slf\"", format); } else if (type == CTFLOAT) { fprintf(stream, " \"%%%sf\"", format); } else if (type == CTINT) { fprintf(stream, " \"%%%sd\"", format); } else if (type == CTUINT) { fprintf(stream, " \"%%%su\"", format); } else if (type == CTLONG) { fprintf(stream, " \"%%%slld\"", format); } else if (type == CTULONG) { fprintf(stream, " \"%%%sllu\"", format); } } if (!anonymous && simpleType.restriction->length && simpleType.restriction->length->value) fprintf(stream, " %s", simpleType.restriction->length->value); else if (!anonymous && simpleType.restriction->minLength && simpleType.restriction->minLength->value) fprintf(stream, " %s", simpleType.restriction->minLength->value); else if ((type == CTFLOAT || type == CTDOUBLE || type == CTLONGDOUBLE) && !anonymous && simpleType.restriction->minInclusive && simpleType.restriction->minInclusive->value && is_float(simpleType.restriction->minInclusive->value)) fprintf(stream, " %s", simpleType.restriction->minInclusive->value); else if ((type == CTINT || type == CTUINT || type == CTLONG || type == CTULONG) && !anonymous && simpleType.restriction->minInclusive && simpleType.restriction->minInclusive->value && is_integer(simpleType.restriction->minInclusive->value)) fprintf(stream, " %s", simpleType.restriction->minInclusive->value); else if ((type == CTFLOAT || type == CTDOUBLE || type == CTLONGDOUBLE) && !anonymous && simpleType.restriction->minExclusive && simpleType.restriction->minExclusive->value && is_float(simpleType.restriction->minExclusive->value)) fprintf(stream, " %s <", simpleType.restriction->minExclusive->value); else if ((type == CTINT || type == CTUINT || type == CTLONG || type == CTULONG) && !anonymous && simpleType.restriction->minExclusive && simpleType.restriction->minExclusive->value && is_integer(simpleType.restriction->minExclusive->value)) fprintf(stream, " " SOAP_LONG_FORMAT, to_integer(simpleType.restriction->minExclusive->value)+1); else if (!anonymous && simpleType.restriction->minInclusive && simpleType.restriction->minInclusive->value && is_integer(simpleType.restriction->minInclusive->value)) fprintf(stream, " /* from %s (inclusive) @warning: could not determine if this type is numeric */", simpleType.restriction->minInclusive->value); else if (!anonymous && simpleType.restriction->minExclusive && simpleType.restriction->minExclusive->value && is_integer(simpleType.restriction->minExclusive->value)) fprintf(stream, " /* from %s (exclusive) @warning: could not determine if this type is numeric */", simpleType.restriction->minExclusive->value); if (!anonymous && simpleType.restriction->length && simpleType.restriction->length->value) fprintf(stream, " : %s", simpleType.restriction->length->value); else if (!anonymous && simpleType.restriction->maxLength && simpleType.restriction->maxLength->value) fprintf(stream, " : %s", simpleType.restriction->maxLength->value); else if ((type == CTFLOAT || type == CTDOUBLE || type == CTLONGDOUBLE) && !anonymous && simpleType.restriction->maxInclusive && simpleType.restriction->maxInclusive->value && is_float(simpleType.restriction->maxInclusive->value)) fprintf(stream, " : %s", simpleType.restriction->maxInclusive->value); else if ((type == CTINT || type == CTUINT || type == CTLONG || type == CTULONG) && !anonymous && simpleType.restriction->maxInclusive && simpleType.restriction->maxInclusive->value && is_integer(simpleType.restriction->maxInclusive->value)) fprintf(stream, " : %s", simpleType.restriction->maxInclusive->value); else if ((type == CTFLOAT || type == CTDOUBLE || type == CTLONGDOUBLE) && !anonymous && simpleType.restriction->maxExclusive && simpleType.restriction->maxExclusive->value && is_float(simpleType.restriction->maxExclusive->value)) fprintf(stream, " :< %s", simpleType.restriction->maxExclusive->value); else if ((type == CTINT || type == CTUINT || type == CTLONG || type == CTULONG) && !anonymous && simpleType.restriction->maxExclusive && simpleType.restriction->maxExclusive->value && is_integer(simpleType.restriction->maxExclusive->value)) fprintf(stream, " : " SOAP_LONG_FORMAT, to_integer(simpleType.restriction->maxExclusive->value)-1); else if (!anonymous && simpleType.restriction->maxInclusive && simpleType.restriction->maxInclusive->value && is_integer(simpleType.restriction->maxInclusive->value)) fprintf(stream, " /* to %s (inclusive) @warning: could not determine if this type is numeric */", simpleType.restriction->maxInclusive->value); else if (!anonymous && simpleType.restriction->maxExclusive && simpleType.restriction->maxExclusive->value && is_integer(simpleType.restriction->maxExclusive->value)) fprintf(stream, " /* to %s (exclusive) @warning: could not determine if this type is numeric */", simpleType.restriction->maxExclusive->value); if (!anonymous) { fprintf(stream, ";\n\n"); if (!cflag && !Fflag && pflag && simpleType.name) { const char *s = wname(prefix, URI, name, NOLOOKUP); const char *t = tname(prefix, URI, name); fprintf(stream, "/// @brief Class wrapper for type %s derived from xsd__anyType.\n///\n", t); if (!Lflag) fprintf(stream, "/// @note Use option -P to remove this class.\n"); fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s); fprintf(stream, elementformat, t, "__item;"); modify(s); fprintf(stream, "\n};\n\n"); } } } } } } else if (simpleType.list) { if (simpleType.list->restriction && simpleType.list->restriction->base) { if (!anonymous) { fprintf(stream, "/// @brief \"%s\":%s is a simpleType list restriction of type %s.\n///\n", URI ? URI : "", name, simpleType.list->restriction->base); if (!Lflag) fprintf(stream, "/// @note This enumeration is a bitmask, so a set of values is supported (using | and & bit-ops on the bit vector).\n"); } document(simpleType.annotation); if (!anonymous) { t = deftname(ENUM, false, false, prefix, URI, name, NULL); if (t) { if (c11flag) fprintf(stream, "enum * class : int64_t %s\n{\n", t); else fprintf(stream, "enum * %s\n{\n", t); } } else { t = ""; fprintf(stream, "enum *\n{\n"); } if (t) { for (std::vector::const_iterator enumeration = simpleType.list->restriction->enumeration.begin(); enumeration != simpleType.list->restriction->enumeration.end(); ++enumeration) { if ((*enumeration).value) { if (!strcmp(simpleType.list->restriction->base, "xs:QName") && (*enumeration).value_) fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value_, true), simpleType.list->restriction->base, (*enumeration).value_); else fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value, false), simpleType.list->restriction->base, (*enumeration).value); } else { fprintf(stream, "//\tunrecognized: bitmask enumeration \"%s\" has no value\n", t); } } if (!anonymous) { fprintf(stream, "};\n\n"); if (!c11flag && yflag) fprintf(stream, "/// @brief Typedef synonym for enum %s.\ntypedef enum %s %s;\n\n", t, t, t); if (!cflag && !Fflag && pflag && simpleType.name) { const char *s = wname(prefix, URI, name, NOLOOKUP); const char *t = tname(prefix, URI, name); fprintf(stream, "/// @brief Class wrapper for type %s derived from xsd__anyType.\n///\n", t); if (!Lflag) fprintf(stream, "/// @note Use option -P to remove this class.\n"); fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s); fprintf(stream, elementformat, t, "__item;"); modify(s); fprintf(stream, "\n};\n\n"); } } else fprintf(stream, "}\n"); } } else if (simpleType.list->itemType) { const xs__simpleType *p = simpleType.list->itemTypePtr(); if (p && p->restriction && p->restriction->base && !p->restriction->enumeration.empty() && p->restriction->enumeration.size() <= 64) { if (!anonymous) { fprintf(stream, "/// @brief \"%s\":%s is a simpleType list of values of type %s.\n///\n", URI ? URI : "", name, simpleType.list->itemType); if (!Lflag) fprintf(stream, "/// @note This enumeration is a bitmask, so a set of values is supported (using | and & bit-ops on the bit vector).\n"); } document(simpleType.annotation); if (!anonymous) { t = deftname(ENUM, false, false, prefix, URI, name, NULL); if (t) { if (c11flag) fprintf(stream, "enum * class %s : int64_t\n{\n", t); else fprintf(stream, "enum * %s\n{\n", t); } } else { t = ""; fprintf(stream, "enum *\n{\n"); } if (t) { for (std::vector::const_iterator enumeration = p->restriction->enumeration.begin(); enumeration != p->restriction->enumeration.end(); ++enumeration) { if ((*enumeration).value) { if (!strcmp(p->restriction->base, "xs:QName") && (*enumeration).value_) fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value_, true), p->restriction->base, (*enumeration).value_); else fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value, false), p->restriction->base, (*enumeration).value); } else { fprintf(stream, "//\tunrecognized: bitmask enumeration \"%s\" has no value\n", t); } } if (!anonymous) { fprintf(stream, "};\n\n"); if (!c11flag && yflag) fprintf(stream, "/// @brief Typedef synonym for enum %s.\ntypedef enum %s %s;\n\n", t, t, t); if (!cflag && !Fflag && pflag && simpleType.name) { const char *s = wname(prefix, URI, name, NOLOOKUP); const char *t = tname(prefix, URI, name); fprintf(stream, "/// @brief Class wrapper for type %s derived from xsd__anyType.\n///\n", t); if (!Lflag) fprintf(stream, "/// @note Use option -P to remove this class.\n"); fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s); fprintf(stream, elementformat, t, "__item;"); modify(s); fprintf(stream, "\n};\n\n"); } } else fprintf(stream, "}\n"); } } else { const char *base; if (!strcmp(simpleType.list->itemType, "xs:QName")) base = "xs:QName"; else base = "xs:string"; const char *s = tname(NULL, NULL, base); if (!anonymous) { fprintf(stream, "/// @brief \"%s\":%s is a simpleType containing a whitespace separated list of values of type %s.\n///\n", URI ? URI : "", name, simpleType.list->itemType); t = deftname(TYPEDEF, false, is_ptr(NULL, NULL, base), prefix, URI, name, s); } document(simpleType.annotation); if (t) fprintf(stream, "typedef %s %s;\n", s, t); else { fprintf(stream, elementformat, s, ""); fprintf(stream, "\n"); } fprintf(stream, "\n"); } } else { if (!anonymous) { fprintf(stream, "/// @brief \"%s\":%s is a simpleType list.\n///\n", URI ? URI : "", name); if (!Lflag) fprintf(stream, "/// @note This enumeration is a bitmask, so a set of values is supported (using | and & bit-ops on the bit vector).\n"); } document(simpleType.annotation); if (!anonymous) { t = deftname(ENUM, false, false, prefix, URI, name, NULL); if (t && !eflag && !c11flag && !Lflag) fprintf(stream, "/// @note The enum values are prefixed with \"%s__\" to prevent name clashes: use wsdl2h option -e to omit this prefix or use option -c++11 for scoped enumerations\n", t); } else t = ""; if (t) { if (c11flag) fprintf(stream, "enum * class %s : int64_t\n{\n", t); else fprintf(stream, "enum * %s\n{\n", t); for (std::vector::const_iterator simple = simpleType.list->simpleType.begin(); simple != simpleType.list->simpleType.end(); ++simple) { if ((*simple).restriction && (*simple).restriction->base) { for (std::vector::const_iterator enumeration = (*simple).restriction->enumeration.begin(); enumeration != (*simple).restriction->enumeration.end(); ++enumeration) { if ((*enumeration).value) { if (!strcmp((*simple).restriction->base, "xs:QName") && (*enumeration).value_) fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value_, true), (*simple).restriction->base, (*enumeration).value_); else fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value, false), (*simple).restriction->base, (*enumeration).value); } else { fprintf(stream, "//\tunrecognized: bitmask enumeration \"%s\" has no value\n", t); } } } } if (!anonymous) { fprintf(stream, "};\n\n"); if (!c11flag && yflag) fprintf(stream, "/// @brief Typedef synonym for enum %s.\ntypedef enum %s %s;\n\n", t, t, t); if (!cflag && !Fflag && pflag && simpleType.name) { const char *s = wname(prefix, URI, name, NOLOOKUP); const char *t = tname(prefix, URI, name); fprintf(stream, "/// @brief Class wrapper for type %s derived from xsd__anyType.\n///\n", t); if (!Lflag) fprintf(stream, "/// @note Use option -P to remove this class.\n"); fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s); fprintf(stream, elementformat, t, "__item;"); modify(s); fprintf(stream, "\n};\n\n"); } } else fprintf(stream, "}\n\n"); } } } else if (simpleType.union_) { if (simpleType.union_->memberTypes) { const char *s = tname(NULL, NULL, "xs:string"); if (!anonymous) t = deftname(TYPEDEF, false, is_ptr(NULL, NULL, "xs:string"), prefix, URI, name, s); fprintf(stream, "/// @brief Union of values from member types \"%s\".\n", cstring(simpleType.union_->memberTypes)); if (t) fprintf(stream, "typedef %s %s;\n\n", s, t); else { fprintf(stream, elementformat, s, ""); fprintf(stream, "\n"); } } else if (!simpleType.union_->simpleType.empty()) { const char *s = tname(NULL, NULL, "xs:string"); if (!anonymous) t = deftname(TYPEDEF, false, is_ptr(NULL, NULL, "xs:string"), prefix, URI, name, s); for (std::vector::const_iterator simpleType1 = simpleType.union_->simpleType.begin(); simpleType1 != simpleType.union_->simpleType.end(); ++simpleType1) { if ((*simpleType1).restriction) { fprintf(stream, "/// @brief Union of values from type \"%s\".\n", (*simpleType1).restriction->base); // TODO: are there any other types we should report here? } } if (t) fprintf(stream, "typedef %s %s;\n\n", s, t); else { fprintf(stream, elementformat, s, ""); fprintf(stream, "\n"); } } else { fprintf(stream, "//\tunrecognized\n"); } } else { fprintf(stream, "//\tunrecognized simpleType\n"); } } void Types::gen(const char *URI, const char *name, const xs__complexType& complexType, bool anonymous) { SetOfString members; const char *t = NULL; const char *prefix = NULL; bool soapflag = false; if (complexType.name) name = complexType.name; else prefix = "_"; if (!anonymous) { ++total; if (Oflag > 1 && !complexType.is_used()) { fprintf(stream, "// Optimization: complexType \"%s\":%s is not used and was removed\n\n", URI, name ? name : ""); ++omitted; return; } } if (anonymous && name) { t = sname(URI, name); } else if (name) { t = cname(prefix, URI, name); if (deftypemap[t]) return; } if (name) scope.push_back(name); if (complexType.simpleContent) { if (!anonymous) { if (complexType.simpleContent->restriction) fprintf(stream, "/// @brief \"%s\":%s is a%s complexType with simpleContent restriction of type %s.\n///\n", URI ? URI : "", name ? name : "", complexType.abstract ? "n abstract" : "", complexType.simpleContent->restriction->base ? complexType.simpleContent->restriction->base : "xs:string"); else fprintf(stream, "/// @brief \"%s\":%s is a%s complexType with simpleContent extension of type %s.\n///\n", URI ? URI : "", name ? name : "", complexType.abstract ? "n abstract" : "", complexType.simpleContent->extension->base ? complexType.simpleContent->extension->base : "xs:string"); } document(complexType.annotation); if (!complexType.assert.empty()) { fprintf(stream, "/// Assertions:\n"); for (std::vector::const_iterator a = complexType.assert.begin(); a != complexType.assert.end(); ++a) if ((*a).test) documentation((*a).test); } if (!anonymous) { if (!complexType.get_extensions().empty()) { fprintf(stream, "/// This type is extended by:\n"); for (std::vector::const_iterator i = complexType.get_extensions().begin(); i != complexType.get_extensions().end(); ++i) { if (is_defined(NULL, NULL, *i)) fprintf(stream, "/// - %s as %s\n", *i, tnamenoptr(NULL, NULL, *i)); else if (!Owflag) fprintf(stream, "/// - %s (not used and removed, retain with option -Ow%d)\n", *i, Oflag); else fprintf(stream, "/// - %s (not used and removed)\n", *i); } fprintf(stream, "///\n"); } if (!complexType.get_restrictions().empty()) { fprintf(stream, "/// This type is restricted by:\n"); for (std::vector::const_iterator i = complexType.get_restrictions().begin(); i != complexType.get_restrictions().end(); ++i) { if (is_defined(NULL, NULL, *i)) fprintf(stream, "/// - %s as %s\n", *i, tnamenoptr(NULL, NULL, *i)); else fprintf(stream, "/// - %s (not used and removed)\n", *i); } fprintf(stream, "///\n"); } } operations(t); if (complexType.simpleContent->restriction) { if (cflag || Fflag || fflag || anonymous) { if (anonymous) { if (cflag) fprintf(stream, " struct %s\n {\n", t); else fprintf(stream, " class %s\n { public:\n", t); } else if (cflag) { fprintf(stream, "struct %s\n{\n", t); } else if (pflag && !Fflag && complexType.name) { fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t); } else { fprintf(stream, "class %s\n{ public:\n", t); } const xs__complexType *p = complexType.simpleContent->restriction->complexTypePtr(); if (p && !p->simpleContent) { fprintf(stderr, "\nWarning: %s\"%s\":%s complexType with simpleContent restriction has invalid base %s complexType with no simpleContent\n", anonymous ? "local element " : "", URI ? URI : "", name ? name : "", complexType.simpleContent->restriction->base ? complexType.simpleContent->restriction->base : ""); } gen_inh(URI, &complexType, anonymous); } else { const char *base = complexType.simpleContent->restriction->base; const char *baseURI = NULL; const xs__complexType *p = complexType.simpleContent->restriction->complexTypePtr(); if (p) { if (complexType.simpleContent->restriction->simpleTypePtr() && complexType.simpleContent->restriction->simpleTypePtr()->schemaPtr()) baseURI = complexType.simpleContent->restriction->simpleTypePtr()->schemaPtr()->targetNamespace; else if (complexType.simpleContent->restriction->complexTypePtr() && complexType.simpleContent->restriction->complexTypePtr()->schemaPtr()) baseURI = complexType.simpleContent->restriction->complexTypePtr()->schemaPtr()->targetNamespace; fprintf(stream, "class %s : public %s\n{ public:\n", t, cname(NULL, baseURI, base)); soapflag = true; if (p && !p->simpleContent) { fprintf(stderr, "\nWarning: \"%s\":%s complexType with simpleContent restriction has invalid base %s complexType with no simpleContent\n", URI ? URI : "", name ? name : "", complexType.simpleContent->restriction->base ? complexType.simpleContent->restriction->base : ""); } gen_inh(URI, p, anonymous); } else { if (pflag && !Fflag && complexType.name) fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t); else fprintf(stream, "class %s\n{ public:\n", t); fprintf(stream, "/// __item wraps simpleContent of type %s.\n", base); fprintf(stream, elementformat, tname(NULL, baseURI, base), "__item"); fprintf(stream, ";\n"); } } } else if (complexType.simpleContent->extension) { if (cflag || Fflag || fflag || anonymous) { if (anonymous) { if (cflag) fprintf(stream, " struct %s\n {\n", t); else fprintf(stream, " class %s\n { public:\n", t); } else if (cflag) { fprintf(stream, "struct %s\n{\n", t); } else if (pflag && !Fflag && complexType.name) { fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t); } else { fprintf(stream, "class %s\n{ public:\n", t); } const xs__complexType *p = complexType.simpleContent->extension->complexTypePtr(); if (p && !p->simpleContent) { fprintf(stderr, "\nWarning: %s\"%s\":%s complexType with simpleContent extension has invalid base %s complexType with no simpleContent\n", anonymous ? "local element " : "", URI ? URI : "", name ? name : "", complexType.simpleContent->extension->base ? complexType.simpleContent->extension->base : ""); } gen_inh(URI, &complexType, anonymous); } else { const char *base = complexType.simpleContent->extension->base; const char *baseURI = NULL; const xs__complexType *p = complexType.simpleContent->extension->complexTypePtr(); if (p) { if (complexType.simpleContent->extension->simpleTypePtr() && complexType.simpleContent->extension->simpleTypePtr()->schemaPtr()) baseURI = complexType.simpleContent->extension->simpleTypePtr()->schemaPtr()->targetNamespace; else if (complexType.simpleContent->extension->complexTypePtr() && complexType.simpleContent->extension->complexTypePtr()->schemaPtr()) baseURI = complexType.simpleContent->extension->complexTypePtr()->schemaPtr()->targetNamespace; fprintf(stream, "class %s : public %s\n{ public:\n", t, cname(NULL, baseURI, base)); soapflag = true; if (p && !p->simpleContent) { fprintf(stderr, "\nWarning: \"%s\":%s complexType with simpleContent extension has invalid base %s complexType with no simpleContent\n", URI ? URI : "", name ? name : "", complexType.simpleContent->extension->base ? complexType.simpleContent->extension->base : ""); } gen_inh(URI, p, anonymous); } else { if (pflag && !Fflag && complexType.name) fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t); else fprintf(stream, "class %s\n{ public:\n", t); fprintf(stream, "/// __item wraps simpleContent of type %s.\n", base); fprintf(stream, elementformat, tname(NULL, baseURI, base), "__item"); fprintf(stream, ";\n"); } gen(URI, complexType.simpleContent->extension->attribute, members); gen(URI, complexType.simpleContent->extension->attributeGroup, members); if (complexType.simpleContent->extension->anyAttribute) gen(URI, *complexType.simpleContent->extension->anyAttribute); } } else { fprintf(stream, "//\tunrecognized\n"); } } else if (complexType.complexContent) { if (complexType.complexContent->restriction) { if (!anonymous) fprintf(stream, "/// @brief \"%s\":%s is a%s complexType with complexContent restriction of type %s.\n///\n", URI ? URI : "", name ? name : "", complexType.abstract ? "n abstract" : "", complexType.complexContent->restriction->base ? complexType.complexContent->restriction->base : "xs:string"); document(complexType.annotation); document(complexType.complexContent->annotation); document(complexType.complexContent->restriction->annotation); if (!complexType.assert.empty()) { fprintf(stream, "/// Assertions:\n"); for (std::vector::const_iterator a = complexType.assert.begin(); a != complexType.assert.end(); ++a) if ((*a).test) documentation((*a).test); } if (!complexType.complexContent->restriction->assert.empty()) { fprintf(stream, "/// Assertions on restriction:\n"); for (std::vector::const_iterator a = complexType.complexContent->restriction->assert.begin(); a != complexType.complexContent->restriction->assert.end(); ++a) if ((*a).test) documentation((*a).test); } if (!anonymous) { if (!complexType.get_extensions().empty()) { fprintf(stream, "/// This type is extended by:\n"); for (std::vector::const_iterator i = complexType.get_extensions().begin(); i != complexType.get_extensions().end(); ++i) { if (is_defined(NULL, NULL, *i)) fprintf(stream, "/// - %s as %s\n", *i, tnamenoptr(NULL, NULL, *i)); else if (!Owflag) fprintf(stream, "/// - %s (not used and removed, retain with option -Ow%d)\n", *i, Oflag); else fprintf(stream, "/// - %s (not used and removed)\n", *i); } fprintf(stream, "///\n"); } if (!complexType.get_restrictions().empty()) { fprintf(stream, "/// This type is restricted by:\n"); for (std::vector::const_iterator i = complexType.get_restrictions().begin(); i != complexType.get_restrictions().end(); ++i) { if (is_defined(NULL, NULL, *i)) fprintf(stream, "/// - %s as %s\n", *i, tnamenoptr(NULL, NULL, *i)); else fprintf(stream, "/// - %s (not used and removed)\n", *i); } fprintf(stream, "///\n"); } } operations(t); if (!strcmp(complexType.complexContent->restriction->base, "SOAP-ENC:Array")) { char *item = NULL, *type = NULL; if (!complexType.complexContent->restriction->attribute.empty()) { xs__attribute& attribute = complexType.complexContent->restriction->attribute.front(); if (attribute.wsdl__arrayType) type = attribute.wsdl__arrayType; } xs__seqchoice *s = complexType.complexContent->restriction->sequence; if (s && !s->__contents.empty() && s->__contents.front().__union == SOAP_UNION_xs__union_content_element && s->__contents.front().__content.element) { xs__element& element = *s->__contents.front().__content.element; if (!type) { if (element.type) type = element.type; else if (element.simpleTypePtr()) { if (element.simpleTypePtr()->name) type = element.simpleTypePtr()->name; else if (element.simpleTypePtr()->restriction) type = element.simpleTypePtr()->restriction->base; } else if (element.complexTypePtr()) { if (element.complexTypePtr()->name) type = element.complexTypePtr()->name; else if (element.complexTypePtr()->complexContent && element.complexTypePtr()->complexContent->restriction) type = element.complexTypePtr()->complexContent->restriction->base; } } item = element.name; // } gen_soap_array(t, item, type); } else { const xs__complexType *p = complexType.complexContent->restriction->complexTypePtr(); if (complexType.complexContent->restriction->simpleTypePtr()) { fprintf(stderr, "\nWarning: %s\"%s\":%s complexType with complexContent restriction has invalid base %s simpleType\n", anonymous ? "local element " : "", URI ? URI : "", name ? name : "", complexType.complexContent->restriction->base ? complexType.complexContent->restriction->base : ""); } if (p && p->simpleContent) { fprintf(stderr, "\nWarning: %s\"%s\":%s complexType with complexContent restriction has invalid base %s complexType with simpleContent\n", anonymous ? "local element " : "", URI ? URI : "", name ? name : "", complexType.complexContent->restriction->base ? complexType.complexContent->restriction->base : ""); } if (anonymous) { if (cflag) fprintf(stream, " struct %s\n {\n", t); else fprintf(stream, " class %s\n { public:\n", t); } else if (cflag) fprintf(stream, "struct %s\n{\n", t); else if (pflag && !Fflag && complexType.name) fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t); else fprintf(stream, "class %s\n{ public:\n", t); if (complexType.complexContent->restriction->group) gen(URI, *complexType.complexContent->restriction->group, NULL, NULL, members); if (complexType.complexContent->restriction->all) gen(URI, *complexType.complexContent->restriction->all, NULL, NULL, members); if (complexType.complexContent->restriction->sequence) gen(URI, *complexType.complexContent->restriction->sequence, NULL, NULL, members); if (complexType.complexContent->restriction->choice) gen(URI, name, *complexType.complexContent->restriction->choice, NULL, NULL, members); gen(URI, complexType.complexContent->restriction->attribute, members); bool flag = true; if (complexType.complexContent->restriction->anyAttribute) { gen(URI, *complexType.complexContent->restriction->anyAttribute); flag = false; } while (p) { const char *pURI; if (p->schemaPtr()) pURI = p->schemaPtr()->targetNamespace; else pURI = URI; const char *b = cname(NULL, pURI, p->name); if (zflag && zflag <= 5) { fprintf(stream, "/// RESTRICTED FROM %s:\n", b); } else { if (comment_nest == 0) fprintf(stream, "/* RESTRICTED FROM %s:\n", b); else fprintf(stream, " RESTRICTED FROM %s:\n", b); comment_nest++; } if (p->complexContent && p->complexContent->restriction) { gen(URI, p->complexContent->restriction->attribute, members); if (p->complexContent->restriction->anyAttribute && flag) { gen(URI, *p->complexContent->restriction->anyAttribute); flag = false; } p = p->complexContent->restriction->complexTypePtr(); } else if (p->complexContent && p->complexContent->extension) { gen(URI, p->complexContent->extension->attribute, members); gen(URI, p->complexContent->extension->attributeGroup, members); if (p->complexContent->extension->anyAttribute && flag) { gen(URI, *p->complexContent->extension->anyAttribute); flag = false; } p = p->complexContent->extension->complexTypePtr(); } else { gen(URI, p->attribute, members); gen(URI, p->attributeGroup, members); if (p->anyAttribute && flag) gen(URI, *p->anyAttribute); p = NULL; } if (zflag && zflag <= 5) { fprintf(stream, "// END OF RESTRICTED FROM %s\n", b); } else { comment_nest--; if (comment_nest == 0) fprintf(stream, " END OF RESTRICTED FROM %s */\n", b); else fprintf(stream, " END OF RESTRICTED FROM %s\n", b); } } } } else if (complexType.complexContent->extension) { const char *base = complexType.complexContent->extension->base; xs__complexType *p = complexType.complexContent->extension->complexTypePtr(); if (!anonymous) fprintf(stream, "/// @brief \"%s\":%s is a%s complexType with complexContent extension of type %s.\n///\n", URI ? URI : "", name, complexType.abstract ? "n abstract" : "", base ? base : "xs:string"); document(complexType.annotation); document(complexType.complexContent->annotation); document(complexType.complexContent->extension->annotation); if (!complexType.assert.empty()) { fprintf(stream, "/// Assertions:\n"); for (std::vector::const_iterator a = complexType.assert.begin(); a != complexType.assert.end(); ++a) if ((*a).test) documentation((*a).test); } if (!complexType.complexContent->extension->assert.empty()) { fprintf(stream, "/// Assertions on extension:\n"); for (std::vector::const_iterator a = complexType.complexContent->extension->assert.begin(); a != complexType.complexContent->extension->assert.end(); ++a) if ((*a).test) documentation((*a).test); } operations(t); const char *baseURI = NULL; if (p && p->schemaPtr()) baseURI = p->schemaPtr()->targetNamespace; if (anonymous) { if (cflag) fprintf(stream, " struct %s\n {\n", t); else fprintf(stream, " class %s\n { public:\n", t); } else if (cflag) { fprintf(stream, "struct %s\n{\n", t); } else if (Fflag || fflag) { fprintf(stream, "class %s\n{ public:\n", t); } else // TODO: what to do if base class is in another namespace and elements must be qualified in XML payload? { fprintf(stream, "class %s : public %s\n{ public:\n", t, cname(NULL, baseURI, base)); soapflag = true; } if (complexType.complexContent->extension->simpleTypePtr()) { fprintf(stderr, "\nWarning: %s\"%s\":%s complexType with complexContent extension has invalid base simpleType %s\n", anonymous ? "local element " : "", URI ? URI : "", name ? name : "", base ? base : ""); } gen_inh(URI, p, anonymous); if (complexType.complexContent->extension->group) gen(URI, *complexType.complexContent->extension->group, NULL, NULL, members); if (complexType.complexContent->extension->all) gen(URI, *complexType.complexContent->extension->all, NULL, NULL, members); if (complexType.complexContent->extension->sequence) gen(URI, *complexType.complexContent->extension->sequence, NULL, NULL, members); if (complexType.complexContent->extension->choice) gen(URI, name, *complexType.complexContent->extension->choice, NULL, NULL, members); gen(URI, complexType.complexContent->extension->attribute, members); gen(URI, complexType.complexContent->extension->attributeGroup, members); if (complexType.complexContent->extension->anyAttribute) gen(URI, *complexType.complexContent->extension->anyAttribute); } else { fprintf(stream, "//\tunrecognized\n"); } } else { if (!anonymous) fprintf(stream, "/// @brief \"%s\":%s is a%s complexType.\n///\n", URI ? URI : "", name ? name : "", complexType.abstract ? "n abstract" : ""); document(complexType.annotation); if (!anonymous) { if (!complexType.get_extensions().empty()) { fprintf(stream, "/// This type is extended by:\n"); for (std::vector::const_iterator i = complexType.get_extensions().begin(); i != complexType.get_extensions().end(); ++i) { if (is_defined(NULL, NULL, *i)) fprintf(stream, "/// - %s as %s\n", *i, tnamenoptr(NULL, NULL, *i)); else if (!Owflag) fprintf(stream, "/// - %s (not used and removed, retain with option -Ow%d)\n", *i, Oflag); else fprintf(stream, "/// - %s (not used and removed)\n", *i); } fprintf(stream, "///\n"); } if (!complexType.get_restrictions().empty()) { fprintf(stream, "/// This type is restricted by:\n"); for (std::vector::const_iterator i = complexType.get_restrictions().begin(); i != complexType.get_restrictions().end(); ++i) { if (is_defined(NULL, NULL, *i)) fprintf(stream, "/// - %s as %s\n", *i, tnamenoptr(NULL, NULL, *i)); else fprintf(stream, "/// - %s (not used and removed)\n", *i); } fprintf(stream, "///\n"); } } operations(t); if (anonymous) { if (cflag) fprintf(stream, " struct %s\n {\n", t); else fprintf(stream, " class %s\n { public:\n", t); } else if (cflag) { fprintf(stream, "struct %s\n{\n", t); } else if (pflag && !Fflag && complexType.name) { fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t); } else { fprintf(stream, "class %s\n{ public:\n", t); } if (complexType.all) gen(URI, *complexType.all, NULL, NULL, members); else if (complexType.choice) gen(URI, name, *complexType.choice, NULL, NULL, members); else if (complexType.sequence) gen(URI, *complexType.sequence, NULL, NULL, members); else if (complexType.group) gen(URI, *complexType.group, NULL, NULL, members); else if (complexType.any) gen(URI, *complexType.any, NULL, NULL); } if (!(complexType.complexContent && complexType.complexContent->extension) && complexType.defaultAttributesApply && complexType.schemaPtr() && complexType.schemaPtr()->attributeGroupPtr()) { fprintf(stream, "/// Default attributes \"%s\"\n", complexType.schemaPtr()->defaultAttributes); xs__attributeGroup *a = complexType.schemaPtr()->attributeGroupPtr(); if (a->attributeGroupPtr()) a = a->attributeGroupPtr(); gen(URI, a->attribute, members); gen(URI, a->attributeGroup, members); if (a->anyAttribute) gen(URI, *a->anyAttribute); } gen(URI, complexType.attribute, members); gen(URI, complexType.attributeGroup, members); if (complexType.anyAttribute) gen(URI, *complexType.anyAttribute); if (complexType.mixed || ( complexType.complexContent && ( complexType.complexContent->mixed || ( complexType.complexContent->extension && complexType.complexContent->extension->complexTypePtr() && complexType.complexContent->extension->complexTypePtr()->mixed ) ) )) { fprintf(stream, "/// Mixed content.\n"); if (!Lflag) fprintf(stream, "/// @note Mixed content is user-definable.\n/// Consult the protocol documentation to change or insert declarations.\n/// Use wsdl2h option -d for DOM (soap_dom_element) to store mixed content.\n"); if (dflag) { fprintf(stream, elementformat, pname(with_union, false, NULL, NULL, "xs:any"), "__mixed"); fprintf(stream, "0;\t///< Store mixed content as xsd:any (by default a xsd__anyType DOM soap_dom_element linked node structure).\n"); } else { fprintf(stream, elementformat, tname(NULL, NULL, "xs:any"), "__mixed"); fprintf(stream, "0;\t///< Store mixed content as an xsd:any (an XML string by default).\n"); } } if (t) modify(t); if (!anonymous) { if (Fflag) { for (std::vector::const_iterator i = complexType.get_extensions().begin(); i != complexType.get_extensions().end(); ++i) { fprintf(stream, "/// A transient pointer to a derived type value that replaces the value of this base type %s when non-NULL\n", t); fprintf(stream, derivedformat, tnamenoptr(NULL, NULL, *i), aname(NULL, NULL, *i, &members)); fprintf(stream, "\n"); } for (std::vector::const_iterator i = complexType.get_restrictions().begin(); i != complexType.get_restrictions().end(); ++i) { fprintf(stream, "/// A transient pointer to a derived type value that replaces the value of this base type %s when non-NULL\n", t); fprintf(stream, derivedformat, tnamenoptr(NULL, NULL, *i), aname(NULL, NULL, *i, &members)); fprintf(stream, "\n"); } } if (!cflag && !(pflag && !Fflag && complexType.name) && !soapflag && soap_context && *soap_context) { if (!complexType.complexContent || !complexType.complexContent->extension || !complexType.complexContent->extension->complexTypePtr()) { fprintf(stream, "/// Pointer to soap context that manages this instance.\n"); fprintf(stream, pointerformat, "struct soap", soap_context); fprintf(stream, ";\n"); } } fprintf(stream, "};\n\n"); } if (name) scope.pop_back(); } void Types::gen(const char *URI, const std::vector& attributes, SetOfString& members) { for (std::vector::const_iterator attribute = attributes.begin(); attribute != attributes.end(); ++attribute) gen(URI, *attribute, members); } void Types::gen(const char *URI, const xs__attribute& attribute, SetOfString& members) { const char *name = attribute.name; const char *type = attribute.type; const char *default_ = attribute.default_; const char *default__ = attribute.default__; const char *fixed = attribute.fixed; const char *fixed_ = attribute.fixed_; const char *nameURI = NULL, *typeURI = NULL, *nameprefix = NULL, *typeprefix = NULL; bool is_optional = attribute.use != required && (!default_ || Dflag) && (!fixed || Dflag); document(attribute.annotation); if (!URI) URI = attribute.schemaPtr()->targetNamespace; if (attribute.targetNamespace) { if ((attribute.form && *attribute.form == qualified) || attribute.schemaPtr()->attributeFormDefault == qualified) nameURI = attribute.targetNamespace; else nameprefix = ":"; } else if (!attribute.ref && URI && attribute.schemaPtr() && attribute.schemaPtr()->targetNamespace && strcmp(URI, attribute.schemaPtr()->targetNamespace)) { if ((attribute.form && *attribute.form == qualified) || attribute.schemaPtr()->attributeFormDefault == qualified) nameURI = attribute.schemaPtr()->targetNamespace; // handles attributes defined in another namespace else nameprefix = ":"; } else if (attribute.form) { if (*attribute.form == qualified) nameURI = URI; else nameprefix = ":"; } if (attribute.attributePtr()) // attribute ref { name = attribute.attributePtr()->name; type = attribute.attributePtr()->type; if (!default_) { default_ = attribute.attributePtr()->default_; default__ = attribute.attributePtr()->default__; } if (!fixed) { fixed = attribute.attributePtr()->fixed; fixed_ = attribute.attributePtr()->fixed_; } if (default_) is_optional = attribute.attributePtr()->use != required && (Dflag != 0); else if (fixed) is_optional = false; else if (is_optional) is_optional = attribute.attributePtr()->use != required; if (!type) { type = name; typeprefix = "_"; } if (attribute.attributePtr()->schemaPtr()) { typeURI = attribute.attributePtr()->schemaPtr()->targetNamespace; if (attribute.form && *attribute.form == unqualified) nameprefix = ":"; else if (zflag != 3 && zflag != 2 && URI && typeURI && attribute.schemaPtr()->attributeFormDefault == qualified && !strcmp(URI, typeURI)) nameprefix = NULL; else if (zflag == 3 && URI && typeURI && attribute.schemaPtr()->attributeFormDefault == unqualified && !strcmp(URI, typeURI)) nameprefix = NULL; else nameURI = typeURI; } if (attribute.ref) fprintf(stream, "/// Attribute reference \"%s\":%s.\n", attribute.schemaPtr()->targetNamespace, attribute.ref); document(attribute.attributePtr()->annotation); fprintf(stream, attributeformat, pname(is_optional, true, typeprefix, typeURI, type), aname(nameprefix, nameURI, name, &members)); // make sure no name - type clash } else if (name && type) { fprintf(stream, "/// Attribute \"%s\" of type %s.\n", name, type); fprintf(stream, attributeformat, pname(is_optional, true, NULL, URI, type), aname(nameprefix, nameURI, name, &members)); // make sure no name - type clash } else if (name && attribute.simpleTypePtr()) { const char *s = ""; const char *r = NULL; if (!cflag && is_optional && (r = vname("$POINTER")) && *r != '*' && *r != '$') { s = ">"; fprintf(stream, attrtemplateformat_open, r, "\n"); } else fprintf(stream, "@"); gen(URI, name, *attribute.simpleTypePtr(), true, false); if (r && *r != '*' && *r != '$') fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name, &members)); else if (is_optional) fprintf(stream, pointerformat, s, aname(nameprefix, nameURI, name, &members)); else fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name, &members)); } else if (attribute.ref) { if (!type) type = attribute.ref; fprintf(stream, "/// Imported attribute reference %s.\n", attribute.ref); fprintf(stream, attributeformat, pname(is_optional, true, "_", NULL, attribute.ref), aname(NULL, NULL, attribute.ref, &members)); } else { type = "xs:string"; fprintf(stream, "/// Attribute \"%s\" has no type or ref: assuming string content.\n", name ? name : ""); fprintf(stream, attributeformat, pname(is_optional, true, NULL, NULL, type), aname(NULL, nameURI, name, &members)); } const char *s; switch (attribute.use) { case prohibited: fprintf(stream, " 0:0"); s = "Prohibited attribute"; break; case required: fprintf(stream, " 1"); s = "Required attribute"; break; default: fprintf(stream, " 0"); s = "Optional attribute"; break; } if (default_) { gendefault(typeURI ? typeURI : URI, type, name, attribute.simpleTypePtr(), default_, default__, "="); fprintf(stream, ";\t///< %s with default value=\"%s\".\n", s, default_); } else if (fixed) { gendefault(typeURI ? typeURI : URI, type, name, attribute.simpleTypePtr(), fixed, fixed_, "=="); fprintf(stream, ";\t///< %s with fixed value=\"%s\".\n", s, fixed); } else { fprintf(stream, ";\t///< %s.\n", s); } } void Types::gen(const char *URI, const std::vector& attributeGroups, SetOfString& members) { for (std::vector::const_iterator attributeGroup = attributeGroups.begin(); attributeGroup != attributeGroups.end(); ++attributeGroup) { static std::set visited; const xs__attributeGroup *p = &*attributeGroup; if (visited.find(p) != visited.end()) { if (p->ref) fprintf(stderr, "\nWarning: circular attributeGroup \n", p->ref); else fprintf(stderr, "\nWarning: circular attributeGroup \n", p->name ? p->name : ""); fprintf(stream, "/// @todo !FIXME! @warning %s is an attributeGroup with a circular reference.\n", p->ref ? p->ref : p->name ? p->name : ""); return; } visited.insert(p); const char *pURI = URI; if (p->ref) // attributeGroup ref fprintf(stream, "// BEGIN ATTRIBUTEGROUP .\n", p->ref ? p->ref : ""); else fprintf(stream, "// BEGIN ATTRIBUTEGROUP .\n", p->name ? p->name : ""); if (p->attributeGroupPtr()) { gen(pURI, p->attributeGroupPtr()->attribute, members); gen(pURI, p->attributeGroupPtr()->attributeGroup, members); } else { gen(pURI, p->attribute, members); gen(pURI, p->attributeGroup, members); } if (p->anyAttribute) gen(pURI, *p->anyAttribute); fprintf(stream, "// END OF ATTRIBUTEGROUP\n"); visited.erase(p); } } void Types::gen(const char *URI, const std::vector& alls, SetOfString& members) { for (std::vector::const_iterator all = alls.begin(); all != alls.end(); ++all) gen(URI, *all, NULL, NULL, members); } void Types::gen(const char *URI, const xs__all& all, const char *minOccurs, const char *maxOccurs, SetOfString& members) { bool tmp_union1 = with_union; bool tmp_union2 = fake_union; with_union = false; fake_union = false; gen(URI, all.element, minOccurs, maxOccurs, members); with_union = tmp_union1; fake_union = tmp_union2; } void Types::gen(const char *URI, const std::vector& contents, SetOfString& members) { for (std::vector::const_iterator content = contents.begin(); content != contents.end(); ++content) { switch ((*content).__union) { case SOAP_UNION_xs__union_content_element: if ((*content).__content.element) gen(URI, *(*content).__content.element, true, NULL, NULL, members); break; case SOAP_UNION_xs__union_content_group: if ((*content).__content.group) gen(URI, *(*content).__content.group, NULL, NULL, members); break; case SOAP_UNION_xs__union_content_choice: if ((*content).__content.choice) gen(URI, NULL, *(*content).__content.choice, NULL, NULL, members); break; case SOAP_UNION_xs__union_content_sequence: if ((*content).__content.sequence) gen(URI, *(*content).__content.sequence, NULL, NULL, members); break; case SOAP_UNION_xs__union_content_any: if ((*content).__content.any) gen(URI, *(*content).__content.any, NULL, NULL); break; } } } void Types::gen(const char *URI, const xs__seqchoice& sequence, const char *minOccurs, const char *maxOccurs, SetOfString& members) { const char *min = minOccurs; const char *max = maxOccurs; const char *s = NULL; char *t = NULL; bool tmp_union = with_union; with_union = false; if (sequence.minOccurs) min = sequence.minOccurs; if (sequence.maxOccurs) max = sequence.maxOccurs; if ((min && strcmp(min, "1")) || (max && strcmp(max, "1"))) { fprintf(stream, "// BEGIN SEQUENCE \n"); document(sequence.annotation); s = sname(URI, "sequence"); size_t l = strlen(s); t = (char*)emalloc(l + 2); soap_strcpy(t, l + 2, "_"); soap_strcpy(t + 1, l + 1, s); s = strstr(s, "__"); if (!s) s = t; if (max && strcmp(max, "1")) { if (cflag || sflag || (zflag && zflag <= 2)) { fprintf(stream, sizeformat, vname("$SIZE"), s + 1); if (!fake_union && min) fprintf(stream, " %s", min); if (max && strcmp(max, "1") && is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); } else { fprintf(stream, templateformat_open, vname("$CONTAINER"), "\n"); } } fprintf(stream, " struct %s\n {\n", t); // do not use a class, may clash with member name SetOfString members1; gen(URI, sequence.__contents, members1); } else { if (fake_union) fprintf(stream, "// BEGIN SEQUENCE \n"); document(sequence.annotation); gen(URI, sequence.__contents, members); } if (s) { if (max && strcmp(max, "1")) { if (cflag || sflag || (zflag && zflag <= 2)) { fprintf(stream, pointerformat, "}", s); } else { fprintf(stream, elementformat, "}>", s); if (!fake_union && min) fprintf(stream, " %s", min); if (max && strcmp(max, "1") && is_integer(max)) fprintf(stream, ":%s", max); } } else { fprintf(stream, pointerformat, "}", s); if (!fake_union && min) fprintf(stream, " %s", min); } fprintf(stream, ";\n"); } if (s || fake_union) fprintf(stream, "// END OF SEQUENCE\n"); with_union = tmp_union; } void Types::gen(const char *URI, const std::vector& elements, const char *minOccurs, const char *maxOccurs, SetOfString& members) { for (std::vector::const_iterator element = elements.begin(); element != elements.end(); ++element) gen(URI, *element, true, minOccurs, maxOccurs, members); } void Types::gen(const char *URI, const xs__element& element, bool substok, const char *minOccurs, const char *maxOccurs, SetOfString& members) { const char *name = element.name; const char *type = element.type; const char *default_ = element.default_; const char *default__ = element.default__; const char *fixed = element.fixed; const char *fixed_ = element.fixed_; const char *min = minOccurs; const char *max = maxOccurs; bool nillable = element.nillable; const char *nameURI = NULL, *typeURI = NULL, *nameprefix = NULL, *typeprefix = NULL; document(element.annotation); if (!URI) URI = element.schemaPtr()->targetNamespace; if (element.minOccurs) min = element.minOccurs; if (element.maxOccurs) max = element.maxOccurs; if (element.xmime__expectedContentTypes) fprintf(stream, "/// MTOM attachment with content types %s.\n", element.xmime__expectedContentTypes); if (element.targetNamespace) { if ((element.form && *element.form == qualified) || element.schemaPtr()->elementFormDefault == qualified) nameURI = element.targetNamespace; else nameprefix = ":"; } else if (!element.ref && URI && element.schemaPtr() && element.schemaPtr()->targetNamespace && strcmp(URI, element.schemaPtr()->targetNamespace)) { if ((element.form && *element.form == qualified) || element.schemaPtr()->elementFormDefault == qualified) nameURI = element.schemaPtr()->targetNamespace; // handles elements defined in another namespace else nameprefix = ":"; } else if (element.form) { if (*element.form == qualified) nameURI = URI; else nameprefix = ":"; } if (element.elementPtr()) // element ref (or ref to substitution element) { name = element.elementPtr()->name; type = element.elementPtr()->type; if (!max || !strcmp(max, "0") || !strcmp(max, "1")) { if (!default_) { default_ = element.elementPtr()->default_; default__ = element.elementPtr()->default__; } if (!fixed) { fixed = element.elementPtr()->fixed; fixed_ = element.elementPtr()->fixed_; } } if (!nillable) nillable = element.elementPtr()->nillable; if (!type) { type = name; typeprefix = "_"; } if (element.elementPtr()->schemaPtr()) { typeURI = element.elementPtr()->schemaPtr()->targetNamespace; if (element.form && *element.form == unqualified) nameprefix = ":"; else if (zflag != 3 && zflag != 2 && URI && typeURI && element.schemaPtr()->elementFormDefault == qualified && !strcmp(URI, typeURI)) nameprefix = NULL; else if (zflag == 3 && URI && typeURI && element.schemaPtr()->elementFormDefault == unqualified && !strcmp(URI, typeURI)) nameprefix = NULL; else nameURI = typeURI; } document(element.elementPtr()->annotation); if (element.elementPtr()->xmime__expectedContentTypes) fprintf(stream, "/// MTOM attachment with content types %s.\n", element.elementPtr()->xmime__expectedContentTypes); if (substok && element.elementPtr()->abstract) { fprintf(stream, "/// Reference %s to abstract element.\n", element.ref); gen_substitutions(URI, element, members); } else if (substok && element.elementPtr()->substitutionsPtr() && !element.elementPtr()->substitutionsPtr()->empty()) { if (vflag) fprintf(stderr, "\nWarning: element ref \"%s\" stands as the head of a substitutionGroup but is not declared abstract\n", element.ref); gen_substitutions(URI, element, members); } else if (max && strcmp(max, "1")) // maxOccurs != "1" { const char *s; if (cflag && zflag != 1) s = tnameptr(true, typeprefix, typeURI, type); else if (Fflag || fflag) s = tnamenoptr(typeprefix, typeURI, type); else s = tnameptr(false, typeprefix, typeURI, type); if (cflag || sflag) { fprintf(stream, "/// Size of the dynamic array of values of type %s is %s..%s.\n", s, min ? min : "1", max); fprintf(stream, sizeformat, vname("$SIZE"), aname(NULL, NULL, name, &members)); fprintf(stream, " %s", fake_union ? "0" : min ? min : "1"); if (is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); if (cflag && zflag != 1) { fprintf(stream, "/// Array %s of size %s..%s.\n", s, min ? min : "1", max); fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name, &members)); } else { fprintf(stream, "/// Pointer to array %s of size %s..%s.\n", s, min ? min : "1", max); fprintf(stream, pointerformat, s, aname(nameprefix, nameURI, name, &members)); } } else { fprintf(stream, "/// Vector of %s element refs of length %s..%s.\n", s, min ? min : "1", max); if (with_union) fprintf(stream, pointertemplateformat, vname("$CONTAINER"), s, aname(nameprefix, nameURI, name)); else fprintf(stream, templateformat, vname("$CONTAINER"), s, aname(nameprefix, nameURI, name, &members)); } nillable = false; } else { if (element.ref) fprintf(stream, "/// Element reference \"%s:\"%s.\n", element.schemaPtr()->targetNamespace, element.ref); else fprintf(stream, "/// Element \"%s\":%s.\n", element.schemaPtr()->targetNamespace, name); nillable = (with_union && !is_choicetype(typeprefix, typeURI, type)) || ((fake_union || element.nillable || (is_nillable(element) && !(with_union && is_choicetype(typeprefix, typeURI, type))))); fprintf(stream, elementformat, pname(nillable, !with_union, typeprefix, typeURI, type), aname(nameprefix, nameURI, name, &members)); } } else if (name && type) { if (substok && element.abstract) { fprintf(stream, "/// Abstract element \"%s\" of type %s.\n", name, type); gen_substitutions(URI, element, members); } else if (substok && element.substitutionsPtr() && !element.substitutionsPtr()->empty()) { if (vflag) fprintf(stderr, "\nWarning: element \"%s\" stands as the head of a substitutionGroup but is not declared abstract\n", name); gen_substitutions(URI, element, members); } else if (max && strcmp(max, "1")) // maxOccurs != "1" { const char *s; if (cflag && zflag != 1) s = tnameptr(true, NULL, URI, type); else if (Fflag || fflag) s = tnamenoptr(NULL, URI, type); else s = tnameptr(false, NULL, URI, type); if (cflag || sflag) { fprintf(stream, "/// Size of array of %s is %s..%s.\n", s, min ? min : "1", max); fprintf(stream, sizeformat, vname("$SIZE"), aname(NULL, NULL, name)); fprintf(stream, " %s", fake_union ? "0" : min ? min : "1"); if (is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); if (cflag && zflag != 1) { fprintf(stream, "/// Array %s of size %s..%s.\n", s, min ? min : "1", max); fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name, &members)); } else { fprintf(stream, "/// Pointer to array %s of size %s..%s.\n", s, min ? min : "1", max); fprintf(stream, pointerformat, s, aname(nameprefix, nameURI, name, &members)); } } else { fprintf(stream, "/// Vector of %s of length %s..%s.\n", s, min ? min : "1", max); if (with_union) fprintf(stream, pointertemplateformat, vname("$CONTAINER"), s, aname(nameprefix, nameURI, name, &members)); else fprintf(stream, templateformat, vname("$CONTAINER"), s, aname(nameprefix, nameURI, name, &members)); } nillable = false; } else { fprintf(stream, "/// Element \"%s\" of type %s.\n", name, type); nillable = (with_union && !is_choicetype(NULL, URI, type)) || ((fake_union || element.nillable || (is_nillable(element) && !(with_union && is_choicetype(NULL, URI, type))))); fprintf(stream, elementformat, pname(nillable, !with_union, NULL, URI, type), aname(nameprefix, nameURI, name, &members)); } } else if (name && element.simpleTypePtr()) { const char *s = ""; const char *r = NULL; document(element.simpleTypePtr()->annotation); if (max && strcmp(max, "1")) // maxOccurs != "1" { if (cflag || sflag) { fprintf(stream, "/// Size of %s array is %s..%s.\n", name, min ? min : "1", max); fprintf(stream, sizeformat, vname("$SIZE"), aname(NULL, NULL, name)); fprintf(stream, " %s", fake_union ? "0" : min ? min : "1"); if (is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); } else { if (with_union) s = ">*"; else s = ">"; fprintf(stream, "/// Vector of %s of length %s..%s.\n", name, min ? min : "1", max); fprintf(stream, templateformat_open, vname("$CONTAINER"), "\n"); } nillable = false; } else if (!cflag && !with_union && (r = vname("$POINTER")) && *r != '*' && *r != '$') { if (is_nillable(element) || fake_union) { s = ">"; fprintf(stream, templateformat_open, r, "\n"); } } gen(URI, name, *element.simpleTypePtr(), true, false); if (!with_union && s && s[0] == '>') // container or smart pointer, not in a union { fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name, &members)); } else if (is_nillable(element) || ((cflag || sflag) && max && strcmp(max, "1")) // maxOccurs != "1" || (with_union && !cflag) || fake_union) { fprintf(stream, pointerformat, s, aname(nameprefix, nameURI, name, &members)); } else { fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name, &members)); nillable = false; } } else if (name && element.complexTypePtr()) { const char *s = "}"; const char *r = NULL; document(element.complexTypePtr()->annotation); if (max && strcmp(max, "1")) // maxOccurs != "1" { if (cflag || sflag) { fprintf(stream, "/// Size of %s array is %s..%s.\n", name, min ? min : "1", max); fprintf(stream, sizeformat, vname("$SIZE"), aname(NULL, NULL, name)); fprintf(stream, " %s", fake_union ? "0" : min ? min : "1"); if (is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); } else { if (with_union) s = "}>*"; else s = "}>"; fprintf(stream, "/// Vector of %s of length %s..%s.\n", name, min ? min : "1", max); fprintf(stream, templateformat_open, vname("$CONTAINER"), "\n"); } nillable = false; } else if (!cflag && !with_union && (r = vname("$POINTER")) && *r != '*' && *r != '$') { if (is_nillable(element) || fake_union) { s = "}>"; fprintf(stream, templateformat_open, r, "\n"); } } gen(URI, name, *element.complexTypePtr(), true); if (!with_union && s && s[1] == '>') // container or smart pointer, not in a union { fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name, &members)); } else if (is_nillable(element) || ((cflag || sflag) && max && strcmp(max, "1")) // maxOccurs != "1" || (with_union && !cflag) || fake_union) { fprintf(stream, pointerformat, s, aname(nameprefix, nameURI, name, &members)); } else { fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name, &members)); nillable = false; } } else if (element.ref) { fprintf(stream, "/// Imported element reference %s.\n", element.ref); if (max && strcmp(max, "1")) // maxOccurs != "1" { if (cflag || sflag) { fprintf(stream, "/// Size of %s array is %s..%s.\n", element.ref, min ? min : "1", max); fprintf(stream, sizeformat, vname("$SIZE"), aname(NULL, NULL, element.ref)); fprintf(stream, " %s", fake_union ? "0" : min ? min : "1"); if (is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); fprintf(stream, pointerformat, pname(true, true, "_", NULL, element.ref), aname(nameprefix, nameURI, element.ref, &members)); } else { fprintf(stream, "/// Vector of %s of length %s..%s.\n", element.ref, min ? min : "1", max); if (with_union) fprintf(stream, pointertemplateformat, vname("$CONTAINER"), tname("_", NULL, element.ref), aname(nameprefix, nameURI, element.ref, &members)); else fprintf(stream, templateformat, vname("$CONTAINER"), tname("_", NULL, element.ref), aname(nameprefix, nameURI, element.ref, &members)); } nillable = false; } else { nillable = (with_union && !cflag) || fake_union || is_nillable(element); fprintf(stream, elementformat, pname(nillable, !with_union, "_", NULL, element.ref), aname(nameprefix, nameURI, element.ref, &members)); } } else if (name) { fprintf(stream, "/// Element \"%s\" has no type or ref (empty or with literal XML content).\n", name ? name : ""); if (max && strcmp(max, "1")) // maxOccurs != "1" { if (cflag || sflag) { fprintf(stream, sizeformat, vname("$SIZE"), aname(NULL, NULL, name)); fprintf(stream, " %s", fake_union ? "0" : min ? min : "1"); if (is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); fprintf(stream, "/// Pointer to array of XML.\n"); fprintf(stream, pointerformat, "_XML", aname(NULL, nameURI, name, &members)); } else { fprintf(stream, "/// Vector of XML of length %s..%s.\n", min ? min : "1", max); if (with_union) fprintf(stream, pointertemplateformat, vname("$CONTAINER"), "_XML", aname(NULL, nameURI, name, &members)); else fprintf(stream, templateformat, vname("$CONTAINER"), "_XML", aname(NULL, nameURI, name, &members)); } nillable = false; } else { fprintf(stream, elementformat, "_XML", aname(NULL, nameURI, name, &members)); } } else { fprintf(stream, "/// Element has no name, type, or ref.\n"); } if (!substok || ( !(element.elementPtr() && element.elementPtr()->abstract) && !(element.substitutionsPtr() && !element.substitutionsPtr()->empty()) && !(element.elementPtr() && element.elementPtr()->substitutionsPtr() && !element.elementPtr()->substitutionsPtr()->empty()) )) { if (!with_union && !fake_union && nillable && (!min || !strcmp(min, "1")) && (!max || !strcmp(max, "1"))) fprintf(stream, " nullptr"); if (!with_union && !fake_union && !min) fprintf(stream, " 1"); else if (!with_union && !fake_union && min) fprintf(stream, " %s", min); if (!with_union && max && strcmp(max, "1") && is_integer(max)) fprintf(stream, ":%s", max); const char *s = "Required element"; if ((with_union || fake_union) && min && !strcmp(min, "0")) s = "Choice of optional element (one of multiple choices)"; else if (with_union || fake_union) s = "Choice of element (one of multiple choices)"; else if (nillable && (!min || !strcmp(min, "1")) && (!max || !strcmp(max, "1"))) s = "Required nillable (xsi:nil when NULL) element"; else if (min && !strcmp(min, "0") && (!max || !strcmp(max, "1"))) s = "Optional element"; else if (max && !strcmp(max, "0")) s = "Prohibited element"; else if (max && strcmp(max, "1")) s = "Multiple elements"; if (default_) { if ((!min || !strcmp(min, "0") || !strcmp(min, "1")) && (!max || !strcmp(max, "0") || !strcmp(max, "1"))) // min/maxOccurs <= "0" gendefault(typeURI ? typeURI : URI, type, name, element.simpleTypePtr(), default_, default__, "="); fprintf(stream, ";\t///< %s with default value=\"%s\".\n", s, default_); } else if (fixed) { if ((!min || !strcmp(min, "0") || !strcmp(min, "1")) && (!max || !strcmp(max, "0") || !strcmp(max, "1"))) // min/maxOccurs <= "0" gendefault(typeURI ? typeURI : URI, type, name, element.simpleTypePtr(), fixed, fixed_, "=="); fprintf(stream, ";\t///< %s with fixed value=\"%s\".\n", s, fixed); } else { fprintf(stream, ";\t///< %s.\n", s); } } } void Types::gen(const char *URI, const std::vector& groups, SetOfString& members) { for (std::vector::const_iterator group = groups.begin(); group != groups.end(); ++group) gen(URI, *group, NULL, NULL, members); } void Types::gen(const char *URI, const xs__group& group, const char *minOccurs, const char *maxOccurs, SetOfString& members) { static std::set visited; const char *min = minOccurs; const char *max = maxOccurs; if (visited.find(&group) != visited.end()) { if (group.ref) fprintf(stderr, "\nWarning: circular group \n", group.ref); else fprintf(stderr, "\nWarning: circular group \n", group.name ? group.name : ""); fprintf(stream, "/// @todo !FIXME! @warning %s defines a group with a circular reference.\n", group.ref ? group.ref : group.name ? group.name : ""); return; } visited.insert(&group); if (group.minOccurs) min = group.minOccurs; if (group.maxOccurs) max = group.maxOccurs; if (group.groupPtr()) { gen(URI, *group.groupPtr(), min, max, members); } else { fprintf(stream, "// BEGIN GROUP \n"); document(group.annotation); if (group.all) gen(URI, *group.all, min, max, members); else if (group.choice) gen(URI, NULL, *group.choice, min, max, members); else if (group.sequence) gen(URI, *group.sequence, min, max, members); fprintf(stream, "// END OF GROUP\n"); } visited.erase(&group); } void Types::gen(const char *URI, const char *name, const xs__seqchoice& choice, const char *minOccurs, const char *maxOccurs, SetOfString& members) { const char *r = NULL, *s = NULL, *t = NULL; const char *min = minOccurs; const char *max = maxOccurs; bool use_union = !uflag; bool wrap_union = false; bool tmp_union; int tmp_xflag = xflag; if (!URI && choice.schemaPtr()) URI = choice.schemaPtr()->targetNamespace; fprintf(stream, "// BEGIN CHOICE \n"); document(choice.annotation); for (std::vector::const_iterator c1 = choice.__contents.begin(); c1 != choice.__contents.end(); ++c1) { if (use_union && ((*c1).__union == SOAP_UNION_xs__union_content_group || (*c1).__union == SOAP_UNION_xs__union_content_sequence)) { if (!Lflag) fprintf(stream, "/// @note with embedded or prevents the use of a union for . Instead of being members of a union, the following members are declared optional. Only one sequence of members should be non-NULL by choice.\n"); use_union = false; break; } if (!xflag && !use_union && max && strcmp(max, "1") && (*c1).__union == SOAP_UNION_xs__union_content_any) { if (!Lflag) fprintf(stream, "/// @note with maxOccurs>1 and an embedded requires the use of a union for whereas option -u is currently enabled: locally enabling option -x to remove for this .\n"); xflag = true; } } if (use_union && (cflag || sflag)) { for (std::vector::const_iterator c2 = choice.__contents.begin(); c2 != choice.__contents.end(); ++c2) { if ((*c2).__union == SOAP_UNION_xs__union_content_element && (*c2).__content.element && (*c2).__content.element->maxOccurs && strcmp((*c2).__content.element->maxOccurs, "1")) { if (!Lflag) fprintf(stream, "/// @note with one ore more elements with maxOccurs>1 prevents the use of a union. Instead of being members of a union, the following members are declared optional. Only one member should be non-NULL by choice.\n"); use_union = false; break; } } } t = uname(URI); s = strstr(t, "__union"); #if 0 // Alternative name for choice selector (old style): r = aname(NULL, NULL, name); #else if (s) r = s + 7; if (!r || !*r) { if (strncmp(t, "union", 5) == 0) { r = t + 5; s = r; } else { r = t; s = t; } } #endif if (max && strcmp(max, "1")) { if (!cflag && !sflag && (!zflag || zflag > 7)) { // Use a container instead of __size fprintf(stream, templateformat_open, vname("$CONTAINER"), "\n"); } else { if (with_union) { // Generate a wrapper when we need a union within a union wrap_union = true; fprintf(stream, " struct __%s\n {\n", t); } fprintf(stream, sizeformat, vname("$SIZE"), r); fprintf(stream, " %s", min ? min : "0"); if (is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); } if (cflag) fprintf(stream, " struct _%s\n {\n", t); else fprintf(stream, " class _%s\n {\n", t); } if (use_union) { if (!with_union || wrap_union) { fprintf(stream, choiceformat, "int", r); if (min) fprintf(stream, " %s", min); fprintf(stream, ";\t///< Union %s selector: set to SOAP_UNION_%s_%s\n", t, t, min && !strcmp(min, "0") ? " or 0 to omit" : ""); if (name) fprintf(stream, "/// Union for choice in %s.\n", cname(NULL, URI, name)); fprintf(stream, " union %s\n {\n", t); } tmp_union = with_union; with_union = true; } else { tmp_union = fake_union; fake_union = true; } if (with_union || wrap_union || (max && strcmp(max, "1"))) { SetOfString members1; gen(URI, choice.__contents, members1); } else { gen(URI, choice.__contents, members); } if (use_union) { with_union = tmp_union; if (!with_union || wrap_union) { fprintf(stream, elementformat, "}", s[0] == '_' && s[1] == '_' ? s+2 : s); fprintf(stream, ";\n"); } } else { fake_union = tmp_union; } if (max && strcmp(max, "1")) { if (!cflag && !sflag && (!zflag || zflag > 7)) { // Use a container instead of __size fprintf(stream, with_union ? pointerformat : elementformat, "}>", s); fprintf(stream, " %s", min ? min : "0"); if (is_integer(max)) fprintf(stream, ":%s", max); } else { fprintf(stream, pointerformat, "}", s); } fprintf(stream, ";\n"); } if (wrap_union) { fprintf(stream, elementformat, "}", s); fprintf(stream, ";\n"); } xflag = tmp_xflag; fprintf(stream, "// END OF CHOICE\n"); } void Types::gen(const char *URI, const std::vector& anys) { for (std::vector::const_iterator any = anys.begin(); any != anys.end(); ++any) gen(URI, *any, NULL, NULL); } void Types::gen(const char *URI, const xs__any& any, const char *minOccurs, const char *maxOccurs) { const char *min = minOccurs; const char *max = maxOccurs; (void)URI; if (any.minOccurs) min = any.minOccurs; if (any.maxOccurs) max = any.maxOccurs; fprintf(stream, "/// \n"); if (!Lflag) fprintf(stream, "/// @note Schema extensibility is user-definable.\n/// Consult the protocol documentation to change or insert declarations.\n/// Use wsdl2h option -x to remove this element.\n/// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element):\n/// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap.\n"); if (!xflag) { if (max && strcmp(max, "1")) { fprintf(stream, "/// Size of the array of XML or DOM nodes is %s..%s.\n", min ? min : "1", max); if (cflag || sflag) { if (!with_union) { fprintf(stream, sizeformat, vname("$SIZE"), ""); fprintf(stream, "0;\n"); fprintf(stream, pointerformat, tname(NULL, NULL, "xs:any"), "__any"); } else { fprintf(stream, elementformat, tname(NULL, NULL, "xs:any"), "__any"); } } else if (with_union) fprintf(stream, pointertemplateformat, vname("$CONTAINER"), tname(NULL, NULL, "xs:any"), "__any"); else fprintf(stream, templateformat, vname("$CONTAINER"), tname(NULL, NULL, "xs:any"), "__any"); } else { fprintf(stream, elementformat, pname(with_union, false, NULL, NULL, "xs:any"), "__any"); } if (dflag) fprintf(stream, "0;\t///< Store any element content in DOM soap_dom_element node.\n"); else fprintf(stream, "0;\t///< Store any element content in XML string.\n"); } } void Types::gen(const char *URI, const xs__anyAttribute& anyAttribute) { (void)URI; if (anyAttribute.namespace_) fprintf(stream, "/// .\n", anyAttribute.namespace_); if (!Lflag) fprintf(stream, "/// @note Schema extensibility is user-definable.\n/// Consult the protocol documentation to change or insert declarations.\n/// Use wsdl2h option -x to remove this attribute.\n/// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute).\n"); if (!xflag) { const char *t = tname(NULL, NULL, "xs:anyAttribute"); fprintf(stream, attributeformat, t, "__anyAttribute"); if (dflag) fprintf(stream, ";\t///< Store anyAttribute content in DOM soap_dom_attribute linked node structure.\n"); else fprintf(stream, ";\t///< A placeholder that has no effect: please see comment.\n"); } } void Types::gen_inh(const char *URI, const xs__complexType *complexType, bool anonymous) { const xs__complexType *p = complexType; if (!p) return; const char *pURI; if (p->schemaPtr()) pURI = p->schemaPtr()->targetNamespace; else pURI = URI; const char *b = p->name ? cname(NULL, pURI, p->name) : NULL; if (p->simpleContent && p->simpleContent->restriction) gen_inh(URI, p->simpleContent->restriction->complexTypePtr(), anonymous); else if (p->simpleContent && p->simpleContent->extension) gen_inh(URI, p->simpleContent->extension->complexTypePtr(), anonymous); else if (p->complexContent && p->complexContent->extension) gen_inh(URI, p->complexContent->extension->complexTypePtr(), anonymous); if (b) { if (cflag || Fflag || fflag || anonymous) { fprintf(stream, "/// INHERITED FROM %s:\n", b); } else { if (comment_nest == 0) fprintf(stream, "/* INHERITED FROM %s:\n", b); else fprintf(stream, " INHERITED FROM %s:\n", b); comment_nest++; } } if (cflag || Fflag || fflag || anonymous) pURI = URI; // if base ns != derived ns then qualify elts and atts SetOfString members; if (p->simpleContent && p->simpleContent->restriction) { if (!p->simpleContent->restriction->complexTypePtr()) { const char *base = p->simpleContent->restriction->base; if (!base) base = "xs:string"; fprintf(stream, "/// __item wraps simpleContent of type %s.\n", base); fprintf(stream, elementformat, tname(NULL, pURI, base), "__item"); fprintf(stream, ";\n"); } } else if (p->simpleContent && p->simpleContent->extension) { if (!p->simpleContent->extension->complexTypePtr()) { const char *base = p->simpleContent->extension->base; if (!base) base = "xs:string"; fprintf(stream, "/// __item wraps simpleContent of type %s.\n", base); fprintf(stream, elementformat, tname(NULL, pURI, base), "__item"); fprintf(stream, ";\n"); } gen(pURI, p->simpleContent->extension->attribute, members); gen(pURI, p->simpleContent->extension->attributeGroup, members); if (p->simpleContent->extension->anyAttribute) gen(pURI, *p->simpleContent->extension->anyAttribute); } else if (p->complexContent && p->complexContent->extension) { if (p->complexContent->extension->group) gen(pURI, *p->complexContent->extension->group, NULL, NULL, members); if (p->complexContent->extension->all) gen(pURI, *p->complexContent->extension->all, NULL, NULL, members); if (p->complexContent->extension->sequence) gen(pURI, *p->complexContent->extension->sequence, NULL, NULL, members); if (p->complexContent->extension->choice) gen(pURI, p->name, *p->complexContent->extension->choice, NULL, NULL, members); gen(pURI, p->complexContent->extension->attribute, members); gen(pURI, p->complexContent->extension->attributeGroup, members); if (p->complexContent->extension->anyAttribute) gen(pURI, *p->complexContent->extension->anyAttribute); } else { if (p->all) gen(pURI, p->all->element, NULL, NULL, members); else if (p->all) gen(pURI, *p->all, NULL, NULL, members); else if (p->choice) gen(pURI, p->name, *p->choice, NULL, NULL, members); else if (p->sequence) gen(pURI, *p->sequence, NULL, NULL, members); else if (p->any) gen(pURI, *p->any, NULL, NULL); if (p->defaultAttributesApply && p->schemaPtr() && p->schemaPtr()->attributeGroupPtr()) { xs__attributeGroup *a = p->schemaPtr()->attributeGroupPtr(); if (a->attributeGroupPtr()) a = a->attributeGroupPtr(); gen(pURI, a->attribute, members); gen(pURI, a->attributeGroup, members); if (a->anyAttribute) gen(pURI, *a->anyAttribute); } gen(pURI, p->attribute, members); gen(pURI, p->attributeGroup, members); if (p->anyAttribute) gen(pURI, *p->anyAttribute); } if (b) { modify(b); if (cflag || Fflag || fflag || anonymous) { fprintf(stream, "// END OF INHERITED FROM %s\n", b); } else { comment_nest--; if (comment_nest == 0) fprintf(stream, " END OF INHERITED FROM %s */\n", b); else fprintf(stream, " END OF INHERITED FROM %s\n", b); } } } void Types::gen_soap_array(const char *t, const char *item, const char *type) { char *tmp = NULL, *dims = NULL, size[24]; if (type) tmp = (char*)estrdup(type); *size = '\0'; if (tmp) dims = strrchr(tmp, '['); if (dims) *dims++ = '\0'; fprintf(stream, "/// SOAP encoded array of values of type %s.\n", tmp ? tmp : "xs:anyType"); if (cflag) fprintf(stream, "struct %s\n{\n", t); else if (pflag && !Fflag && *t) fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t); else fprintf(stream, "class %s\n{ public:\n", t); if (dims) { char *s = strchr(dims, ']'); if (s && s != dims) (SOAP_SNPRINTF(size, 24, 23), "[%d]", (int)(s - dims + 1)); } if (tmp) { if (strchr(tmp, '[') != NULL) { size_t l = strlen(t); if (!strncmp(t, "ArrayOf", 7) && l > 7) gen_soap_array(t + 7, item, tmp); else if (!strncmp(t, "Array", 5) && l > 5) gen_soap_array(t + 5, item, tmp); else gen_soap_array("", item, tmp); fprintf(stream, arrayformat, "}", item ? aname(NULL, NULL, item) : ""); fprintf(stream, ";\n"); } else { const char *s = tname(NULL, NULL, tmp); fprintf(stream, "/// Pointer to dynamic array of elements <%s> of type %s.\n", item ? item : "item", s); fprintf(stream, arrayformat, s, item ? aname(NULL, NULL, item) : ""); fprintf(stream, ";\n"); } if (*size) fprintf(stream, "/// Size of the multidimensional dynamic array with dimensions=%s.\n", size); else fprintf(stream, "/// Size of the dynamic array.\n"); fprintf(stream, arraysizeformat, "int", size); fprintf(stream, ";\n/// Offset for partially transmitted arrays (uncomment only when required).\n"); fprintf(stream, arrayoffsetformat, "int", size); fprintf(stream, ";\n"); } else { // TODO: how to handle generic SOAP array? E.g. as an array of anyType? if (!Lflag) fprintf(stream, "// @note Add declarations to handle generic SOAP-ENC:Array (array of anyType)\n"); } } void Types::gen_substitutions(const char *URI, const xs__element& element, SetOfString& members) { const std::vector *substitutions; const char *name; const char *r = NULL, *s = NULL, *t = NULL; bool use_union = !uflag; bool wrap_union = false; bool tmp_union; bool abstract = false; if (!URI && element.schemaPtr()) URI = element.schemaPtr()->targetNamespace; if (element.elementPtr()) { name = element.elementPtr()->name; substitutions = element.elementPtr()->substitutionsPtr(); abstract = element.elementPtr()->abstract; if (!abstract && element.elementPtr()->complexTypePtr()) abstract = element.elementPtr()->complexTypePtr()->abstract; } else { name = element.name; substitutions = element.substitutionsPtr(); abstract = element.abstract; if (!abstract && element.complexTypePtr()) abstract = element.complexTypePtr()->abstract; } fprintf(stream, "// BEGIN SUBSTITUTIONS with choice of elements to substitute:\n// "); size_t len = 7; for (std::vector::const_iterator i1 = substitutions->begin(); i1 != substitutions->end(); ++i1) { size_t w = strlen((*i1)->name) + 3; len += w; if (len > 132) { fprintf(stream, "\n// "); len = 7 + w; } fprintf(stream, " <%s>", (*i1)->name); } fprintf(stream, "\n"); t = uname(URI); s = strstr(t, "__union"); r = aname(NULL, NULL, name); if (element.maxOccurs && strcmp(element.maxOccurs, "1")) { if (with_union) { // Generate a wrapper when we need a union within a union wrap_union = true; fprintf(stream, " struct __%s\n {\n", t); } fprintf(stream, sizeformat, vname("$SIZE"), r); fprintf(stream, " %s", element.minOccurs ? element.minOccurs : "0"); if (is_integer(element.maxOccurs)) fprintf(stream, ":%s", element.maxOccurs); fprintf(stream, ";\n"); if (cflag) fprintf(stream, " struct _%s\n {\n", t); else fprintf(stream, " class _%s\n {\n", t); } if (use_union) { if (!with_union || wrap_union) { fprintf(stream, choiceformat, "int", r); if (element.minOccurs) fprintf(stream, " %s", element.minOccurs); fprintf(stream, ";\t///< Union %s selector: set to SOAP_UNION_%s_%s\n", t, t, element.minOccurs && !strcmp(element.minOccurs, "0") ? " or 0 to omit" : ""); if (name) fprintf(stream, "/// Union for substitutionGroup %s.\n", cname(NULL, URI, name)); fprintf(stream, " union %s\n {\n", t); } tmp_union = with_union; with_union = true; } else { tmp_union = fake_union; fake_union = true; } if (!abstract) gen(URI, element, false, NULL, NULL, members); for (std::vector::const_iterator i2 = substitutions->begin(); i2 != substitutions->end(); ++i2) gen(URI, *(*i2), true, NULL, NULL, members); // substitutions can be recursive? if (use_union) { with_union = tmp_union; if (!with_union || wrap_union) { if (s) fprintf(stream, elementformat, "}", s[0] == '_' && s[1] == '_' ? s+2 : s); else fprintf(stream, elementformat, "}", t[0] == '_' ? t+1 : t); fprintf(stream, ";\n"); } } else fake_union = tmp_union; if (element.maxOccurs && strcmp(element.maxOccurs, "1")) { fprintf(stream, pointerformat, "}", s); fprintf(stream, ";\n"); } if (wrap_union) { fprintf(stream, elementformat, "}", s); fprintf(stream, ";\n"); } fprintf(stream, "// END OF SUBSTITUTIONS\n"); } void Types::document(const xs__annotation *annotation) { if (annotation) for (std::vector::const_iterator i = annotation->documentation.begin(); i != annotation->documentation.end(); ++i) documentation(*i); } void Types::modify(const char *name) { // TODO: consider support removal of elements/attributes with ns__X = $- Y const char *s = modtypemap[name]; if (s) { while (*s) { if (*s++ == '$') fprintf(stream, "/// Member declared in %s\n ", mapfile); s = format(s); } } } const char* Types::format(const char *text) { const char *s = text; if (!s) return NULL; while (*s && *s != '$') { if (*s == '\\') { switch (s[1]) { case 'n': fputc('\n', stream); break; case 't': fputc('\t', stream); break; default: fputc(s[1], stream); } s++; } else fputc(*s, stream); s++; } fputc('\n', stream); return s; } void Types::gendefault(const char *URI, const char *type, const char *name, xs__simpleType *p, const char *v, const char *q, const char *a) { if (!v) return; const char *t = NULL; if (!type && p) { if (!p->restriction) return; if (!p->restriction->enumeration.empty() && URI && name) { t = gname(URI, name); if (t) { v = enames[Pair(t, v)]; if (v) fprintf(stream, " %s %s", a, v); } return; } if (p->restriction->base) { if (p->restriction->simpleTypePtr() && p->restriction->simpleTypePtr()->schemaPtr()) URI = p->restriction->simpleTypePtr()->schemaPtr()->targetNamespace; t = cname(NULL, URI, p->restriction->base); } } else if (type) { t = cname(NULL, URI, type); } if (!t) return; switch (ctype(t)) { case CTNONE: if (comment_nest == 0) fprintf(stream, " /* @warning: cannot assign default/fixed value to this type */"); break; case CTBOOL: case CTINT: case CTUINT: case CTLONG: case CTULONG: case CTFLOAT: case CTDOUBLE: case CTLONGDOUBLE: fprintf(stream, " %s %s", a, v); break; case CTENUM: if ((v = enames[Pair(t, v)])) fprintf(stream, " %s %s", a, v); break; case CTSTRING: case CTWSTRING: fprintf(stream, " %s \"%s\"", a, cstring(v)); break; case CTQNAME: case CTWQNAME: fprintf(stream, " %s \"%s\"", a, cstring(q)); break; } } CType Types::ctype(const char *t) { MapOfStringToCType::const_iterator i = ctypemap.find(t); if (i != ctypemap.end()) return (*i).second; CType type = CTINT; const char *s = NULL; MapOfStringToString::const_iterator j = deftypemap.find(t); if (j != deftypemap.end()) { s = (*j).second; if (s && !strncmp(s, "typedef", 7) && isdelim(s[7])) s = nonblank(s + 7); } if (!s || !*s) { j = usetypemap.find(t); if (j != usetypemap.end()) s = (*j).second; if (!s) s = t; } if (!strncmp(s, "const", 5) && isdelim(s[5])) { s = nonblank(s + 5); } if (!strncmp(s, "signed", 6) && isdelim(s[6])) { s = nonblank(s + 6); } else if (!strncmp(s, "unsigned", 8) && isdelim(s[8])) { s = nonblank(s + 8); type = CTUINT; } if (!strncmp(s, "long", 4) && isdelim(s[4])) { s = nonblank(s + 4); if (type == CTUINT) type = CTULONG; else type = CTLONG; } else if (!strncmp(s, "short", 5) && isdelim(s[5])) { s = nonblank(s + 5); } if ((!strncmp(s, "char", 4) && isdelim(s[4]) && strchr(s, '*')) || (!strncmp(s, "_XML", 4) && isdelim(s[4])) || (!strncmp(s, "std::string", 11) && isdelim(s[11]))) { if (!strncmp(t, "xsd__QName", 10)) type = CTQNAME; else type = CTSTRING; } else if ((!strncmp(s, "wchar_t", 7) && isdelim(s[7]) && strchr(s, '*')) || (!strncmp(s, "std::wstring", 12) && isdelim(s[12]))) { if (!strncmp(t, "xsd__QName", 10)) type = CTWQNAME; else type = CTWSTRING; } else if (!strncmp(s, "float", 5) && isdelim(s[5])) { type = CTFLOAT; } else if (!strncmp(s, "double", 6) && isdelim(s[6])) { if (type == CTLONG) type = CTLONGDOUBLE; else type = CTDOUBLE; } else if (!strncmp(s, "bool", 4) && isdelim(s[4])) { type = CTBOOL; } else if (!strncmp(s, "enum", 4) && isdelim(s[4])) { type = CTENUM; } else if ((!strncmp(s, "char", 4) && isdelim(s[4])) || (!strncmp(s, "int", 3) && isdelim(s[3])) || (!strncmp(s, "int8_t", 6) && isdelim(s[6])) || (!strncmp(s, "int16_t", 7) && isdelim(s[7])) || (!strncmp(s, "int32_t", 7) && isdelim(s[7])) || (!strncmp(s, "short", 5) && isdelim(s[5]))) { } else if ((!strncmp(s, "uint8_t", 7) && isdelim(s[7])) || (!strncmp(s, "uint16_t", 8) && isdelim(s[8])) || (!strncmp(s, "uint32_t", 8) && isdelim(s[8])) || (!strncmp(s, "size_t", 6) && isdelim(s[6]))) { type = CTUINT; } else if ((!strncmp(s, "LONG64", 6) && isdelim(s[6])) || (!strncmp(s, "long", 4) && isdelim(s[4])) || (!strncmp(s, "int64_t", 7) && isdelim(s[7]))) { if (type == CTUINT) type = CTULONG; else type = CTLONG; } else if ((!strncmp(s, "ULONG64", 7) && isdelim(s[7])) || (!strncmp(s, "uint64_t", 8) && isdelim(s[8]))) { type = CTULONG; } else if (!strncmp(s, "_QName", 6) && isdelim(s[6])) { type = CTQNAME; } else { type = CTNONE; } ctypemap[t] = type; return type; } //////////////////////////////////////////////////////////////////////////////// // // Type map file parsing // //////////////////////////////////////////////////////////////////////////////// static char *getline(char *s, size_t n, FILE *fd) { int c; char *t = s; if (n) n--; for (;;) { c = fgetc(fd); if (c == '\r') continue; if (c == '\\') { c = fgetc(fd); if (c == '\r') c = fgetc(fd); if (c < ' ') continue; if (n) { *t++ = '\\'; n--; } } if (c == '\n' || c == EOF) break; if (n) { *t++ = c; n--; } } *t++ = '\0'; if (!*s && c == EOF) return NULL; return s; } static bool isdelim(int c) { return c == '\0' || c == EOF || !isalnum(c); } static const char *nonblank(const char *s) { while (*s && isspace(*s)) s++; return s; } static const char *fill(char *t, int n, const char *s, int e) { int i = n; s = nonblank(s); while (*s && *s != e && --i) *t++ = *s++; while (*s && *s != e) s++; if (*s) s++; i = n - i; if (i == 0) *t = '\0'; else { while (isspace(*--t) && i--) ; t[1] = '\0'; } return s; } //////////////////////////////////////////////////////////////////////////////// // // Miscellaneous // //////////////////////////////////////////////////////////////////////////////// static const char *utf8(char **t, const char *s, bool start) { unsigned int c = 0; unsigned int c1, c2, c3; const char *r = s; c = (unsigned char)*r++; if (c >= 0x80) { c1 = (unsigned char)*r++; if (c < 0xC0 || (c1 & 0xC0) != 0x80) r--; /* doesn't look like this is UTF-8, try continue as if ISO-8859-1 */ else { c1 &= 0x3F; if (c < 0xE0) c = ((c & 0x1F) << 6) | c1; else { c2 = (unsigned char)*r++; if ((c == 0xE0 && c1 < 0x20) || (c2 & 0xC0) != 0x80) r -= 2; /* doesn't look like this is UTF-8, try continue as if ISO-8859-1 */ else { c2 &= 0x3F; if (c < 0xF0) c = ((c & 0x0F) << 12) | (c1 << 6) | c2; else { c3 = (unsigned char)*r++; if ((c == 0xF0 && c1 < 0x10) || (c == 0xF4 && c1 >= 0x10) || c >= 0xF5 || (c3 & 0xC0) != 0x80) r -= 3; /* doesn't look like this is UTF-8, try continue as if ISO-8859-1 */ else c = ((c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | (c3 & 0x3F); } } } } } if (Uflag && // Universal character names for identifier characters // E.1 Ranges of characters allowed ( c == 0x00A8 || c == 0x00AA || c == 0x00AD || c == 0x00AF || (0x00B2 <= c && c <= 0x00B5) || (0x00B7 <= c && c <= 0x00BA) || (0x00BC <= c && c <= 0x00BE) || (0x00C0 <= c && c <= 0x00D6) || (0x00D8 <= c && c <= 0x00F6) || (0x00F8 <= c && c <= 0x00FF) || (0x0100 <= c && c <= 0x167F) || (0x1681 <= c && c <= 0x180D) || (0x180F <= c && c <= 0x1FFF) || (0x200B <= c && c <= 0x200D) || (0x202A <= c && c <= 0x202E) || (0x203F <= c && c <= 0x2040) || c == 0x2054 || (0x2060 <= c && c <= 0x206F) || (0x2070 <= c && c <= 0x218F) || (0x2460 <= c && c <= 0x24FF) || (0x2776 <= c && c <= 0x2793) || (0x2C00 <= c && c <= 0x2DFF) || (0x2E80 <= c && c <= 0x2FFF) || (0x3004 <= c && c <= 0x3007) || (0x3021 <= c && c <= 0x302F) || (0x3031 <= c && c <= 0x303F) || (0x3040 <= c && c <= 0xD7FF) || (0xF900 <= c && c <= 0xFD3D) || (0xFD40 <= c && c <= 0xFDCF) || (0xFDF0 <= c && c <= 0xFE44) || (0xFE47 <= c && c <= 0xFFFD) || (0x10000 <= c && c <= 0x1FFFD) || (0x20000 <= c && c <= 0x2FFFD) || (0x30000 <= c && c <= 0x3FFFD) || (0x40000 <= c && c <= 0x4FFFD) || (0x50000 <= c && c <= 0x5FFFD) || (0x60000 <= c && c <= 0x6FFFD) || (0x70000 <= c && c <= 0x7FFFD) || (0x80000 <= c && c <= 0x8FFFD) || (0x90000 <= c && c <= 0x9FFFD) || (0xA0000 <= c && c <= 0xAFFFD) || (0xB0000 <= c && c <= 0xBFFFD) || (0xC0000 <= c && c <= 0xCFFFD) || (0xD0000 <= c && c <= 0xDFFFD) || (0xE0000 <= c && c <= 0xEFFFD) ) && // E.2 Ranges of characters disallowed initially !(start && ( (0x0300 <= c && c <= 0x036F) || (0x1DC0 <= c && c <= 0x1DFF) || (0x20D0 <= c && c <= 0x20FF) || (0xFE20 <= c && c <= 0xFE2F) ) ) ) { soap_strncpy(*t, 7, s, r - s); *t += r - s; } else { // encode up to UCS2 only if (c > 0xFFFF) c = 0xFFFF; (SOAP_SNPRINTF(*t, 7, 6), "_x%4.4x", c); *t += 6; } return r; } static const char *cstring(const char *s) { size_t n; char *t; const char *r; for (n = 0, r = s; *r; n++, r++) if (*r == '"' || *r == '\\') n++; else if (*r < 32) n += 3; r = t = (char*)emalloc(n + 1); for (; *s; s++) { if (*s == '"' || *s == '\\') { *t++ = '\\'; *t++ = *s; } else if (*s == '\n') { soap_strcpy(t, 3, "\\n"); t += 2; } else if (*s < 32) { (SOAP_SNPRINTF(t, 5, 4), "\\%03o", (unsigned int)(unsigned char)*s); t += 4; } else *t++ = *s; } *t = '\0'; return r; } static const char *xstring(const char *s) { size_t n; char *t; const char *r; for (n = 0, r = s; *r; n++, r++) { if (*r < 32 || *r >= 127) n += 4; else if (*r == '<' || *r == '>') n += 3; else if (*r == '&') n += 4; else if (*r == '"') n += 5; else if (*r == '\\') n += 1; } r = t = (char*)emalloc(n + 1); for (; *s; s++) { if (*s < 32 || *s >= 127) { (SOAP_SNPRINTF(t, 6, 4), "&#%.2x;", (unsigned char)*s); t += 5; } else if (*s == '<') { soap_strcpy(t, 5, "<"); t += 4; } else if (*s == '>') { soap_strcpy(t, 5, ">"); t += 4; } else if (*s == '&') { soap_strcpy(t, 6, "&"); t += 5; } else if (*s == '"') { soap_strcpy(t, 7, """); t += 6; } else if (*s == '\\') { soap_strcpy(t, 3, "\\\\"); t += 2; } else *t++ = *s; } *t = '\0'; return r; } static bool is_float(const char *s) { if (*s == '-' || *s == '+') s++; if (!*s || strlen(s) > 20) return false; while (*s && isdigit(*s)) s++; if (*s == '.') s++; while (*s && isdigit(*s)) s++; if (*s == 'e' || *s == 'E') { s++; if (*s == '-' || *s == '+') s++; while (*s && isdigit(*s)) s++; } return *s == '\0'; } static bool is_integer(const char *s) { if (*s == '-' || *s == '+') s++; if (!*s || strlen(s) > 20) return false; while (*s && isdigit(*s)) s++; return *s == '\0'; } static LONG64 to_integer(const char *s) { char *r; return soap_strtoll(s, &r, 10); } static void documentation(const char *text) { const char *s = text; const char *sep = "///
\n/// "; if (!s) return; while (*s) { switch (*s) { case '\n': if (!sep) sep = "\n/// "; break; case '\t': case ' ': if (!sep) sep = " "; break; default: if (*s > 32) { if (sep) { fputs(sep, stream); sep = NULL; } fputc(*s, stream); } } s++; } fprintf(stream, "\n///
\n///\n"); } static void operations(const char *t) { if (!Lflag) { if (cflag) fprintf(stream, "/// @note struct %s operations:\n/// - %s* soap_new_%s(struct soap*, int num) allocate and default initialize one or more values (an array)\n/// - soap_default_%s(struct soap*, %s*) default initialize members\n/// - int soap_read_%s(struct soap*, %s*) deserialize from a source\n/// - int soap_write_%s(struct soap*, %s*) serialize to a sink\n/// - %s* soap_dup_%s(struct soap*, %s* dst, %s *src) returns deep copy of %s src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec)\n/// - soap_del_%s(%s*) deep deletes %s data members, use only on dst after soap_dup_%s(NULL, %s *dst, %s *src) (use soapcpp2 -Ed)\n", t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t); else fprintf(stream, "/// @note class %s operations:\n/// - %s* soap_new_%s(soap*) allocate and default initialize\n/// - %s* soap_new_%s(soap*, int num) allocate and default initialize an array\n/// - %s* soap_new_req_%s(soap*, ...) allocate, set required members\n/// - %s* soap_new_set_%s(soap*, ...) allocate, set all public members\n/// - %s::soap_default(soap*) default initialize members\n/// - int soap_read_%s(soap*, %s*) deserialize from a stream\n/// - int soap_write_%s(soap*, %s*) serialize to a stream\n/// - %s* %s::soap_dup(soap*) returns deep copy of %s, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec)\n/// - %s::soap_del() deep deletes %s data members, use only after %s::soap_dup(NULL) (use soapcpp2 -Ed)\n/// - int %s::soap_type() returns SOAP_TYPE_%s or derived type identifier\n", t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t); } } //////////////////////////////////////////////////////////////////////////////// // // Allocation // //////////////////////////////////////////////////////////////////////////////// void *emalloc(size_t size) { // we will not always make an attempt to release this heap memory // since the wsdl2h tool needs heap allocated data until it terminates void *p = malloc(size); if (!p) { fprintf(stderr, "\nError: Malloc failed\n"); exit(1); } return p; } char *estrdup(const char *s) { size_t l = strlen(s); char *t = (char*)emalloc(l + 1); soap_strcpy(t, l + 1, s); return t; } char *estrdupf(const char *s) { char *t = (char*)emalloc(strlen(s) + 1); char *p; for (p = t; *s; s++) { if (s[0] == '/' && s[1] == '*') { for (s += 2; s[0] && s[1]; s++) { if (s[0] == '*' && s[1] == '/') { s++; break; } } continue; } *p++ = *s; } *p = '\0'; return t; } gsoap-2.8.91/gsoap/wsdl/wadl.cpp0000644000175000017500000003660013525245163016014 0ustar ellertellert/* wadl.cpp WADL binding schema implementation -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "wsdlH.h" #include "includes.h" extern const char *qname_token(const char*, const char*); extern int is_builtin_qname(const char*); //////////////////////////////////////////////////////////////////////////////// // // wadl // //////////////////////////////////////////////////////////////////////////////// int wadl__application::preprocess(wsdl__definitions& definitions) { if (vflag) std::cerr << "Preprocessing wadl application" << std::endl; if (grammars) return grammars->preprocess(definitions); return SOAP_OK; } int wadl__application::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << "Analyzing wadl application" << std::endl; for (std::vector::iterator i1 = resources.begin(); i1 != resources.end(); ++i1) (*i1).traverse(definitions); for (std::vector::iterator i2 = resource_USCOREtype.begin(); i2 != resource_USCOREtype.end(); ++i2) (*i2).traverse(definitions); for (std::vector::iterator i3 = method.begin(); i3 != method.end(); ++i3) (*i3).traverse(definitions); for (std::vector::iterator i4 = representation.begin(); i4 != representation.end(); ++i4) (*i4).traverse(definitions); for (std::vector::iterator i5 = param.begin(); i5 != param.end(); ++i5) (*i5).traverse(definitions); return SOAP_OK; } void wadl__application::mark() { if (Oflag > 1) { for (std::vector::iterator i4 = representation.begin(); i4 != representation.end(); ++i4) (*i4).mark(); for (std::vector::iterator i5 = param.begin(); i5 != param.end(); ++i5) (*i5).mark(); } } int wadl__grammars::preprocess(wsdl__definitions& definitions) { if (vflag) std::cerr << "Preprocessing wadl:grammars" << std::endl; for (std::vector::iterator i = include.begin(); i != include.end(); ++i) (*i).preprocess(definitions); return SOAP_OK; } int wadl__include::preprocess(wsdl__definitions& definitions) { if (vflag) std::cerr << "Preprocessing wadl:include href='" << (href ? href : "") << "'" << std::endl; if (href) { wsdl__import import; import.soap_default(definitions.soap); import.location = href; definitions.import.push_back(import); } return SOAP_OK; } wadl__link::wadl__link() { linkRef = NULL; } int wadl__link::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing wadl:link resource_type '" << (resource_USCOREtype ? resource_USCOREtype : "") << "'" << std::endl; linkRef = NULL; if (resource_USCOREtype) { if (*resource_USCOREtype != '#') { if (!Wflag) std::cerr << "\nWarning: external link resource_type='" << resource_USCOREtype << "' found that is not supported" << std::endl; } else if (definitions.appPtr()) { for (std::vector::iterator i = definitions.appPtr()->resource_USCOREtype.begin(); i != definitions.appPtr()->resource_USCOREtype.end(); ++i) { if ((*i).id && !strcmp((*i).id, resource_USCOREtype + 1)) { linkRef = &*i; break; } } } if (!linkRef) if (!Wflag) std::cerr << "\nWarning: no wadl:resource_type with id '" << resource_USCOREtype << "' found" << std::endl; } return SOAP_OK; } void wadl__link::linkPtr(wadl__resource_USCOREtype *resource) { linkRef = resource; if (!linkRef && vflag) std::cerr << "\nWarning: wadl__link link set to NULL" << std::endl; } const wadl__resource_USCOREtype *wadl__link::linkPtr() const { return linkRef; } wadl__param::wadl__param() { paramRef = NULL; simpleTypeRef = NULL; complexTypeRef = NULL; } int wadl__param::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing wadl:param '" << (name ? name : "") << "' id '" << (id ? id : "") << "'" << std::endl; paramRef = NULL; simpleTypeRef = NULL; complexTypeRef = NULL; if (href) { if (*href != '#') { if (!Wflag) std::cerr << "\nWarning: external reference href='" << href << "' found that is not supported" << std::endl; } else if (definitions.appPtr()) { for (std::vector::iterator i = definitions.appPtr()->param.begin(); i != definitions.appPtr()->param.end(); ++i) { if ((*i).id && !strcmp((*i).id, href + 1)) { paramRef = &*i; break; } } } if (!paramRef) if (!Wflag) std::cerr << "\nWarning: no wadl:param with id '" << href << "' found" << std::endl; } else { if (definitions.types) { for (std::vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(type, (*schema)->targetNamespace); if (token) { for (std::vector::iterator st = (*schema)->simpleType.begin(); st != (*schema)->simpleType.end(); ++st) { if ((*st).name && !strcmp((*st).name, token)) { simpleTypeRef = &(*st); if (vflag) std::cerr << " Found wadl:param simpleType '" << (token ? token : "(null)") << "'" << std::endl; break; } } } token = qname_token(type, (*schema)->targetNamespace); if (token) { for (std::vector::iterator ct = (*schema)->complexType.begin(); ct != (*schema)->complexType.end(); ++ct) { if ((*ct).name && !strcmp((*ct).name, token)) { complexTypeRef = &(*ct); if (vflag) std::cerr << " Found wadl:param complexType '" << (token ? token : "(null)") << "'" << std::endl; break; } } } } } if (type && !simpleTypeRef && !complexTypeRef) { if (is_builtin_qname(type)) definitions.builtinType(type); else if (!Wflag) std::cerr << "\nWarning: no wadl:param type '" << type << "' found" << std::endl; } } if (link) link->traverse(definitions); return SOAP_OK; } void wadl__param::paramPtr(wadl__param *param) { paramRef = param; if (!paramRef && vflag) std::cerr << "\nWarning: wadl__param param set to NULL" << std::endl; } const wadl__param *wadl__param::paramPtr() const { return paramRef; } void wadl__param::simpleTypePtr(xs__simpleType *simpleType) { simpleTypeRef = simpleType; if (!simpleTypeRef && vflag) std::cerr << "\nWarning: wadl__param simpleType set to NULL" << std::endl; } xs__simpleType *wadl__param::simpleTypePtr() const { return simpleTypeRef; } void wadl__param::complexTypePtr(xs__complexType *complexType) { complexTypeRef = complexType; if (!complexTypeRef && vflag) std::cerr << "\nWarning: wadl__param complexType set to NULL" << std::endl; } xs__complexType *wadl__param::complexTypePtr() const { return complexTypeRef; } void wadl__param::mark() { if (Oflag > 1) { if (simpleTypePtr()) simpleTypePtr()->mark(); if (complexTypePtr()) complexTypePtr()->mark(); } } wadl__representation::wadl__representation() { representationRef = NULL; elementRef = NULL; } int wadl__representation::traverse(wsdl__definitions& definitions) { for (std::vector::iterator i = param.begin(); i != param.end(); ++i) (*i).traverse(definitions); if (vflag) std::cerr << " Analyzing wadl:representation id '" << (id ? id : "") << "'" << std::endl; elementRef = NULL; if (href) { if (*href != '#') { if (!Wflag) std::cerr << "\nWarning: external representation reference href='" << href << "' found that is not supported" << std::endl; } else if (definitions.appPtr()) { for (std::vector::iterator i = definitions.appPtr()->representation.begin(); i != definitions.appPtr()->representation.end(); ++i) { if ((*i).id && !strcmp((*i).id, href + 1)) { representationRef = &*i; break; } } } if (!representationRef) if (!Wflag) std::cerr << "\nWarning: no wadl:representation with id '" << href << "' found" << std::endl; } else { if (definitions.types) { for (std::vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(element, (*schema)->targetNamespace); if (token) { for (std::vector::iterator el = (*schema)->element.begin(); el != (*schema)->element.end(); ++el) { if ((*el).name && !strcmp((*el).name, token)) { elementRef = &(*el); if (vflag) std::cerr << " Found wadl:representation element '" << (token ? token : "(null)") << "'" << std::endl; break; } } } } } if (element && !elementRef) { if (is_builtin_qname(element)) definitions.builtinElement(element); else if (!Wflag) std::cerr << "\nWarning: no wadl:representation element '" << element << "'" << std::endl; } } return SOAP_OK; } void wadl__representation::representationPtr(wadl__representation *representation) { representationRef = representation; if (!representationRef && vflag) std::cerr << "\nWarning: wadl__representation representation set to NULL" << std::endl; } const wadl__representation *wadl__representation::representationPtr() const { return representationRef; } void wadl__representation::elementPtr(xs__element *element) { elementRef = element; if (!elementRef && vflag) std::cerr << "\nWarning: wadl__representation element set to NULL" << std::endl; } xs__element *wadl__representation::elementPtr() const { return elementRef; } void wadl__representation::mark() { if (Oflag > 1) { if (elementPtr()) elementPtr()->mark(); } } int wadl__request::traverse(wsdl__definitions& definitions) { for (std::vector::iterator i = param.begin(); i != param.end(); ++i) (*i).traverse(definitions); for (std::vector::iterator j = representation.begin(); j != representation.end(); ++j) (*j).traverse(definitions); return SOAP_OK; } void wadl__request::mark() { if (Oflag > 1) { for (std::vector::iterator i = param.begin(); i != param.end(); ++i) (*i).mark(); for (std::vector::iterator j = representation.begin(); j != representation.end(); ++j) (*j).mark(); } } wadl__method::wadl__method() { methodRef = NULL; } int wadl__method::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing wadl:method name '" << soap_wadl__HTTPMethods2s(definitions.soap, name) << "' id '" << (id ? id : "") << "'" << std::endl; if (request) request->traverse(definitions); for (std::vector::iterator i = response.begin(); i != response.end(); ++i) (*i).traverse(definitions); methodRef = NULL; if (href) { if (*href != '#') { if (!Wflag) std::cerr << "\nWarning: external method href='" << href << "' found that is not supported" << std::endl; } else if (definitions.appPtr()) { for (std::vector::iterator i = definitions.appPtr()->method.begin(); i != definitions.appPtr()->method.end(); ++i) { if ((*i).id && !strcmp((*i).id, href + 1)) { methodRef = &*i; break; } } } if (!methodRef) if (!Wflag) std::cerr << "\nWarning: no wadl:method with id '" << href << "' found" << std::endl; } return SOAP_OK; } void wadl__method::methodPtr(wadl__method *method) { methodRef = method; if (!methodRef && vflag) std::cerr << "\nWarning: wadl__method method set to NULL" << std::endl; } const wadl__method *wadl__method::methodPtr() const { return methodRef; } void wadl__method::mark() { if (Oflag > 1) { if (request) request->mark(); for (std::vector::iterator i = response.begin(); i != response.end(); ++i) (*i).mark(); } } int __wadl__method_resource_choice::traverse(wsdl__definitions& definitions) { if (method) method->traverse(definitions); if (resource) resource->traverse(definitions); return SOAP_OK; } int wadl__resource_USCOREtype::traverse(wsdl__definitions& definitions) { for (std::vector::iterator i = param.begin(); i != param.end(); ++i) (*i).traverse(definitions); for (std::vector<__wadl__method_resource_choice>::iterator j = __choice.begin(); j != __choice.end(); ++j) (*j).traverse(definitions); return SOAP_OK; } int wadl__resource::traverse(wsdl__definitions& definitions) { wadl__resource_USCOREtype::traverse(definitions); if (type) { const char *t = type; while (true) { const char *s = strchr(t, ' '); size_t n = s ? s - t : strlen(t); if (*t != '#') { if (!Wflag) std::cerr << "\nWarning: external resource in type='" << type << "' found that is not supported" << std::endl; } else if (definitions.appPtr()) { for (std::vector::iterator i = definitions.appPtr()->resource_USCOREtype.begin(); i != definitions.appPtr()->resource_USCOREtype.end(); ++i) { if ((*i).id && !strncmp((*i).id, t + 1, n)) { typeRefs.push_back(&*i); break; } } } if (!s) break; t = s + 1; } } return SOAP_OK; } void wadl__resource::typePtr(wadl__resource_USCOREtype *type) { if (type) typeRefs.push_back(type); } const std::vector& wadl__resource::typePtrs() const { return typeRefs; } int wadl__resources::traverse(wsdl__definitions& definitions) { for (std::vector::iterator i = resource.begin(); i != resource.end(); ++i) (*i).traverse(definitions); return SOAP_OK; } gsoap-2.8.91/gsoap/wsdl/types.h0000644000175000017500000001574213525245163015702 0ustar ellertellert/* types.h WSDL parser and converter to gSOAP header file format -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef TYPES_H #define TYPES_H #include "includes.h" #include "wsdlH.h" enum Type { NONE, CLASS, ENUM, STRUCT, TYPEDEF }; enum CType { CTNONE, CTBOOL, CTINT, CTUINT, CTLONG, CTULONG, CTFLOAT, CTDOUBLE, CTLONGDOUBLE, CTENUM, CTSTRING, CTWSTRING, CTQNAME, CTWQNAME }; typedef std::map MapOfStringToCType; enum Lookup { NOLOOKUP, LOOKUP }; class Types { public: SetOfString knames; // keywords, reserved words, class names, and typedefs MapOfStringToString modtypemap; MapOfStringToString deftypemap; MapOfStringToString usetypemap; MapOfStringToString ptrtypemap; MapOfStringToString smptypemap; MapOfStringToCType ctypemap; MapOfStringToString wnames; // name -> wrapper name MapOfPairToString qnames; // (URI,name) -> name MapOfStringToString uris; // URI -> prefix MapOfStringToNum syms; // prefix -> count (ns1, ns2, ...) SetOfString rnames; // reserved symbolic names to avoid clashes SetOfString onames; // service operator names MapOfPairToString enames; // enum symbolic names VectorOfString scope; // de-anonymizer stack int snum; // struct name index, TODO: consider map of URI to count per URI int unum; // union name index, TODO: consider map of URI to count per URI int gnum; // enum name index, TODO: consider map of URI to count per URI bool with_union; bool fake_union; size_t total; // total number of types size_t omitted; // number of -O removed types Types(); void init(); int read(const char *file); private: const char *fname(const char *prefix, const char *URI, const char *qname, SetOfString *reserved, enum Lookup lookup, bool isqname); public: const char *aname(const char *prefix, const char *URI, const char *qname, SetOfString *reserved = NULL); const char *wname(const char *prefix, const char *URI, const char *qname, enum Lookup lookup); const char *cname(const char *prefix, const char *URI, const char *qname); const char *tname(const char *prefix, const char *URI, const char *qname); const char *tnameptr(bool, const char *prefix, const char *URI, const char *qname); const char *tnamenoptr(const char *prefix, const char *URI, const char *qname); const char *pname(bool flag, bool smart, const char *prefix, const char *URI, const char *qname); const char *oname(const char *prefix, const char *URI, const char *qname); const char *ename(const char *type, const char *value, bool isqname); const char *sname(const char *URI, const char *name); const char *gname(const char *URI, const char *name); const char *uname(const char *URI); const char *vname(const char *var); const char *nsprefix(const char *prefix, const char *URI); const char *prefix(const char *name); const char *uri(const char *name); const char *deftname(enum Type type, bool mk_pointer, bool is_pointer, const char *prefix, const char *URI, const char *qname, const char *base); const char *defename(const char *type, const char *value, bool isqname); bool is_defined(const char *prefix, const char *URI, const char *qname); bool is_nillable(const xs__element& element); bool is_choicetype(const char *prefix, const char *URI, const char *type); bool is_ptr(const char *prefix, const char *URI, const char *type); void dump(FILE*); void define(const char *URI, const char *name, const xs__complexType&); void gen(const char *URI, const std::vector&, SetOfString&); void gen(const char *URI, const std::vector&, SetOfString&); void gen(const char *URI, const std::vector&, SetOfString&); void gen(const char *URI, const std::vector&, const char *minOccurs, const char *maxOccurs, SetOfString&); void gen(const char *URI, const std::vector&, SetOfString&); void gen(const char *URI, const std::vector&); void gen(const char *URI, const std::vector&, SetOfString&); void gen(const char *URI, const char *name, const xs__simpleType&, bool anonymous, bool nested_restriction); void gen(const char *URI, const char *name, const xs__complexType&, bool anonymous); void gen(const char *URI, const xs__attribute&, SetOfString&); void gen(const char *URI, const xs__all&, const char *minOccurs, const char *maxOccurs, SetOfString&); void gen(const char *URI, const xs__seqchoice&, const char *minOccurs, const char *maxOccurs, SetOfString&); void gen(const char *URI, const char *name, const xs__seqchoice&, const char *minOccurs, const char *maxOccurs, SetOfString&); void gen(const char *URI, const xs__element&, bool substok, const char *minOccurs, const char *maxOccurs, SetOfString&); void gen(const char *URI, const xs__group&, const char *minOccurs, const char *maxOccurs, SetOfString&); void gen(const char *URI, const xs__any&, const char *minOccurs, const char *maxOccurs); void gen(const char *URI, const xs__anyAttribute&); void gen_inh(const char *URI, const xs__complexType *complexType, bool anonymous); void gen_soap_array(const char *t, const char *item, const char *type); void gen_substitutions(const char *URI, const xs__element &element, SetOfString&); void document(const xs__annotation*); void modify(const char *name); const char *format(const char *text); void gendefault(const char *URI, const char *type, const char *name, xs__simpleType *p, const char *s, const char *q, const char *a); CType ctype(const char *s); }; #endif gsoap-2.8.91/gsoap/wsdl/wsam.h0000644000175000017500000000417213525245163015500 0ustar ellertellert/* wsam.h WS-Addressing and WS-Addressing Metadata -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap wsa schema documentation: WS-Addressing //gsoap wsa schema namespace: http://www.w3.org/2005/08/addressing //gsoap wsa schema elementForm: qualified //gsoap wsa schema attributeForm: unqualified //gsoap wsam schema documentation: WS-Addressing Metadata //gsoap wsam schema namespace: http://www.w3.org/2007/05/addressing/metadata //gsoap wsam schema elementForm: qualified //gsoap wsam schema attributeForm: unqualified //gsoap wsaw schema documentation: WS-Addressing WSDL //gsoap wsaw schema namespace: http://www.w3.org/2006/05/addressing/wsdl //gsoap wsaw schema elementForm: qualified //gsoap wsaw schema attributeForm: unqualified class wsa__EndpointReferenceType { public: xsd__anyURI Address; _XML __any; }; gsoap-2.8.91/gsoap/wsdl/wsu.h0000644000175000017500000000320113525245163015337 0ustar ellertellert/* wsu.h WS-Utility (namespace only) -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap wsu schema documentation: WS-Utility //gsoap wsu schema namespace: http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd //gsoap wsu schema elementForm: qualified //gsoap wsu schema attributeForm: unqualified gsoap-2.8.91/gsoap/wsdl/soap.cpp0000644000175000017500000002243213525245163016025 0ustar ellertellert/* soap.cpp WSDL/SOAP binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "wsdlH.h" // cannot include "schemaH.h" #include "includes.h" extern const char *qname_token(const char*, const char*); extern int is_builtin_qname(const char*); //////////////////////////////////////////////////////////////////////////////// // // soap:header // //////////////////////////////////////////////////////////////////////////////// int soap__header::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing soap header in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << std::endl; messageRef = NULL; partRef = NULL; const char *token = qname_token(message, definitions.targetNamespace); if (token) { for (std::vector::iterator message = definitions.message.begin(); message != definitions.message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) std::cerr << " Found soap header part '" << (part?part:"") << "' message '" << (token?token:"") << "'" << std::endl; break; } } } if (!messageRef) { for (std::vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(message, importdefinitions->targetNamespace); if (token) { for (std::vector::iterator message = importdefinitions->message.begin(); message != importdefinitions->message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) std::cerr << " Found soap header part '" << (part?part:"") << "' message '" << (token?token:"") << "'" << std::endl; break; } } } } } } if (messageRef) { if (part) { for (std::vector::iterator pt = messageRef->part.begin(); pt != messageRef->part.end(); ++pt) if ((*pt).name && !strcmp((*pt).name, part)) { partRef = &(*pt); break; } } if (!partRef) std::cerr << "Warning: soap header has no matching part in message '" << (message?message:"") << "' in wsdl definitions '" << definitions.name << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << std::endl; } else std::cerr << "Warning: could not find soap header part '" << (part?part:"") << "' message '" << (message?message:"") << "' in wsdl definitions '" << definitions.name << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << std::endl; for (std::vector::iterator i = headerfault.begin(); i != headerfault.end(); ++i) (*i).traverse(definitions); return SOAP_OK; } void soap__header::messagePtr(wsdl__message *message) { messageRef = message; } wsdl__message *soap__header::messagePtr() const { return messageRef; } void soap__header::partPtr(wsdl__part *part) { partRef = part; } wsdl__part *soap__header::partPtr() const { return partRef; } //////////////////////////////////////////////////////////////////////////////// // // soap:headerfault // //////////////////////////////////////////////////////////////////////////////// int soap__headerfault::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing soap headerfault in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << std::endl; messageRef = NULL; partRef = NULL; const char *token = qname_token(message, definitions.targetNamespace); if (token) { for (std::vector::iterator message = definitions.message.begin(); message != definitions.message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) std::cerr << " Found soap headerfault part '" << (part?part:"") << "' message '" << (token?token:"") << "'" << std::endl; break; } } } else { for (std::vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(message, importdefinitions->targetNamespace); if (token) { for (std::vector::iterator message = importdefinitions->message.begin(); message != importdefinitions->message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) std::cerr << " Found soap headerfault part '" << (part?part:"") << "' message '" << (token?token:"") << "'" << std::endl; break; } } } } } } if (messageRef) { if (part) { for (std::vector::iterator pt = messageRef->part.begin(); pt != messageRef->part.end(); ++pt) if ((*pt).name && !strcmp((*pt).name, part)) { partRef = &(*pt); break; } } if (!partRef) std::cerr << "Warning: soap headerfault has no matching part in message '" << (message?message:"") << "' in wsdl definitions '" << definitions.name << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << std::endl; } else std::cerr << "Warning: could not find soap headerfault part '" << (part?part:"") << "' message '" << (message?message:"") << "' in wSDL definitions '" << definitions.name << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << std::endl; return SOAP_OK; } void soap__headerfault::messagePtr(wsdl__message *message) { messageRef = message; } wsdl__message *soap__headerfault::messagePtr() const { return messageRef; } void soap__headerfault::partPtr(wsdl__part *part) { partRef = part; } wsdl__part *soap__headerfault::partPtr() const { return partRef; } //////////////////////////////////////////////////////////////////////////////// // // wsoap:header // //////////////////////////////////////////////////////////////////////////////// int wsoap__header::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing soap header in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << std::endl; elementRef = NULL; // WSDL 2.0 if (element) { if (definitions.types) { for (std::vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(element, (*schema)->targetNamespace); if (token) { for (std::vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if ((*element).name && !strcmp((*element).name, token)) { elementRef = &(*element); if (vflag) std::cerr << " Found soap header element '" << (token?token:"") << "'" << std::endl; break; } } } } } if (!elementRef) { if (is_builtin_qname(element)) definitions.builtinElement(element); else if (!Wflag) std::cerr << "Warning: no soap header element '" << element << "' in wsdl definitions '" << (definitions.name?definitions.name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << std::endl; } } return SOAP_OK; } void wsoap__header::elementPtr(xs__element *element) { elementRef = element; } xs__element *wsoap__header::elementPtr() const { return elementRef; } void wsoap__header::mark() { if (Oflag > 1) if (elementPtr()) elementPtr()->mark(); } gsoap-2.8.91/gsoap/wsdl/README.txt0000644000175000017500000002522013525245163016053 0ustar ellertellertThe gSOAP WSDL parser 'wsdl2h' INSTRUCTIONS The gSOAP WSDL parser converts one or more WSDLs into a gSOAP header file for processing with the gSOAP soapcpp2 compiler to generate client stubs/proxies and server skeletons/objects to access services or build new services. For example: $ wsdl2h -o XMethodsQuery.h http://www.xmethods.net/wsdl/query.wsdl Note: if an error occurs when running wsdl2h, please try again later. The XMethods site is very popular and suffers under load. It may also be the case that XMethods removed certain services. In that case, try another on-line WSDL. This generates the XMethodsQuery.h header file with Web service operations and C++ data types. This header file is intended to be processed with soapcpp2 to generate the stub and/or skeleton code. You need to have stlvector.h present in the current directory (stlvector.h is in the package) to support STL vectors. To build without STL, use option -s: $ wsdl2h -s -o XMethodsQuery.h http://www.xmethods.net/wsdl/query.wsdl Or to build a pure C application, use option -c: $ wsdl2h -c -o XMethodsQuery.h http://www.xmethods.net/wsdl/query.wsdl Other useful options to control the output are -e and -y (see below). The above commands are to be followed by the soapcpp2 compilation phase: $ soapcpp2 -C XMethodsQuery.h Where option -C indicates client-side only files (soapcpp2 generates both client and server stubs and skeletons by default). The generated XMethodsQuery.h includes the definitions of data types and service operations of the XMethods Query Web service. To develop a C++ client application, you can use the generated 'soapXMethodsQuerySoapProxy' class and 'XMethodsQuerySoap.nsmap' XML namespace table to access the Web service. Both need to be '#include'd in your source. Then compile and link the soapC.cpp, soapClient.cpp, and stdsoap2.cpp sources to complete the build. More information on this process can be found in the gSOAP documentation. When parsing a WSDL, the output file name is the WSDL input file name with extension '.h' instead of '.wsdl'. When an input file is absent or a WSDL file from a Web location is accessed, the header output will be produced on the standard output. Input may also consist of schema files, which is useful when you to need to generate code for serializing schema instances. USING A TYPEMAP FILE TO CONTROL THE INPUT AND OUTPUT The typemap.dat is the default file processed by 'wsdl2h' to customize the generated header file output. The default typemap.dat file is located in the 'WS' directory. Use wsdl2h option -t to specify an alternate file. The typemap.dat file can be used to define namespace prefix and type bindings for the generated header files by the 'wsdl2h' tool. XML namespace prefix bindings can be provided to override the default choice of the ns1, ns2, ... prefixes generated by 'wsdl2h'. It is highly recommended to provide namespace prefixes for your project's XML namespaces. In this way, changes to the WSDL (or newer releases of wsdl2h) will have a minimal impact on coding. Bindings for namespace prefixes in typemap.dat are of the form: prefix = "URI" For example, to bind the 'google' prefix to the Google API's namespace: google = "urn:GoogleSearch" Type bindings can by provided to bind XML schema types to C/C++ types for your project. Type bindings are of the form: prefix__type = declaration | use | ptr-use where 'declaration' introduces the type in the header file, 'use' specifies how the type is used directly, 'ptr-use' specifies how the type is used as a pointer type. For example: xsd__string = | char* | char* After enabling this line, all XSD strings will be mapped to char* and since char* is already a pointer type, the 'ptr-use' part is the same as 'use' part. Note that the 'declaration' part is empty in these cases. Member data and functions can be provided to extend a generated struct or class. Class and struct extensions are of the form: prefix__type = $ member-declaration For example, to add a constructor and destructor to class myns__record: myns__record = $ myns__record(); myns__record = $ ~myns__record(); To specify a set of input files in typemap.dat for wsdl2h to process, use '<': < infile1.wsdl < infile2.xsd < http://www.example.com/example.wsdl To specify the default output file, use '>', for example: > example.h Any other material to be included in the generated header file can be provided by enclosing the text within brackets [ and ]. Brackets MUST appear at the start of a new line. For example, to include a note: [ // TODO: Don't forget to bind the namespace prefixes! ] This comment appears as the first line in the generated header file. INPUT FORMATS wsdl2h reads from standard input or the files provided at the command line: wsdl2h [options] [-o outfile.h] [infile1.wsdl infile2.wsdl infile3.xsd ... ] Valid input file formats are .wsdl and .xsd (schema) files. Multiple wsdl and schema files can be given, which results in a consolidated header file with all definitions combined. OUTPUT FORMAT The output file is a gSOAP-formatted header file. The header file syntax is augmented with annotations reflecting WSDL and schema-specific bindings and validation constraints. We suggest the use of Doxygen (www.doxygen.org) to produce documented for the generated header file. However, we STRONGLY recommend user to inspect the generated header file first for warnings and other annotations (which do not appear in Doxygen's output) indicating potential problems. Note that Doxygen's license model does not infinge on your ownership of the generated gSOAP source code output when you purchased a commercial license. COMMAND LINE OPTIONS -a generate indexed struct names for local elements with anonymous types -b bi-directional operations to serve one-way response messages (duplex) -c generate C source code -c++ generate C++ source code (default) -c++11 generate C++11 source code -D make attribute members with default/fixed values optional with pointers -d use DOM to populate xs:any and xsd:anyType elements -e don't qualify enum names -F add transient members to structs to simulate struct-type derivation in C -f generate flat C++ class hierarchy by removing inheritance -g generate global top-level element and attribute declarations -h display help info and exit -Ipath use path to locate WSDL and XSD files -i don't import (advanced option) -j don't generate SOAP_ENV__Header and SOAP_ENV__Detail definitions -k don't generate SOAP_ENV__Header mustUnderstand qualifiers -L generate less documentation by removing generic @note comments -l display license information -M suppress error "must understand element with wsdl:required='true'" -m use xsd.h module to import primitive types -Nname use name for service prefixes to produce a service for each binding -nname use name as the base namespace prefix instead of 'ns' -O1 optimize by omitting duplicate choice/sequence members -O2 optimize -O1 and omit unused schema types (unreachable from roots) -O3 optimize -O2 and omit unused schema root attributes -O4 optimize -O3 and omit unused schema root elements (use only with WSDLs) -Ow2 optimize -O2 while retaining all derived types of used base types -Ow3 optimize -O3 while retaining all derived types of used base types -Ow4 optimize -O4 while retaining all derived types of used base types -ofile output to file -P don't create polymorphic types with C++ inheritance from xsd__anyType -p create polymorphic types with C++ inheritance from base xsd__anyType -Q make xsd__anySimpleType equal to xsd__anyType to use as the base type -qname use name for the C++ namespace for all service declarations -R generate REST operations for REST bindings specified in a WSDL -rhost[:port[:uid:pwd]] connect via proxy host, port, and proxy credentials uid and pwd -r:uid:pwd connect with authentication credentials uid and pwd -R generate REST operations for REST bindings in the WSDL -Sname use name instead of 'soap' for the C++ class member with soap context -s don't generate STL code (no std::string and no std::vector) -tfile use type map file instead of the default file typemap.dat -u don't generate unions -V display the current version and exit -v verbose output -W suppress warnings -w always wrap response parameters in a response struct (<=1.1.4 behavior) -X don't qualify part names to disambiguate doc/lit wrapped patterns -x don't generate _XML any/anyAttribute extensibility elements -y generate typedef synonyms for structs and enums -z1 compatibility with 2.7.6e: generate pointer-based arrays -z2 compatibility with 2.7.15: qualify element/attribute referenced members -z3 compatibility with 2.7.16 to 2.8.7: qualify element/attribute references -z4 compatibility up to 2.8.11: don't generate union structs in std::vector -z5 compatibility up to 2.8.15: don't include minor improvements -z6 compatibility up to 2.8.17: don't include minor improvements -z7 compatibility up to 2.8.59: don't generate std::vector of class of union -z8 compatibility up to 2.8.74: don't gen quals for doc/lit wrapped patterns -_ don't generate _USCORE (replace with Unicode code point _x005f) infile.wsdl infile.xsd http://www... list of input sources (if none use stdin) DOCUMENTATION See soapdoc2.pdf for documentation. INSTALLATION Use './configure' and 'make' in the root directory, as explained in the installation instructions. This builds 'wsdl2h' with all features enabled. To build 'wsdl2h' when autoconf/automake fail, use: make -f MakefileManual To build 'wsdl2h' with secure features when `./configure' and 'make' fail, use: make -f MakefileManual secure If you don't have OpenSSL installed, you cannot build an SSL-secure version of wsdl2h. In that case we recommend downloading the WSDL and schema files for processing with the non-SSL-enabled wsdl2h tool. A NOTE ON HEAP MEMORY USAGE Parts of the wsdl2h tool allocate heap memory during its execution to maintain critical state information during its execution. No attempt is made to release this memory before the program terminates. LICENSE The gSOAP WSDL parser 'wsdl2h' and source code are released under GPLv2 or a commercial license. The commercial license is available from Genivia. Please visit http://genivia.com/Products/gsoap/contract.html COPYRIGHT NOTICE gSOAP XML Web services tools Copyright (C) 2000-2017, Robert van Engelen, Genivia, Inc. All Rights Reserved. gsoap-2.8.91/gsoap/wsdl/service.h0000644000175000017500000001140713525245163016170 0ustar ellertellert/* service.h Service structures -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2014, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef SERVICE_H #define SERVICE_H #include "includes.h" #include "wsdlH.h" class Message { public: wsdl__message *message; const char *name; const char *URI; soap__styleChoice style; soap__useChoice use; const char *encodingStyle; const char *action; const xs__element *element; const char *body_parts; wsdl__part *part; bool mustUnderstand; std::vector header; std::vector wheader; mime__multipartRelated *multipartRelated; // MIME mime__content *content; // REST/MIME const char *layout; // DIME const char *documentation; const char *ext_documentation; std::vector policy; void generate(Types&, const char *sep, bool anonymous, bool remark, bool response, bool optional, bool rest); }; typedef std::map MapOfStringToMessage; class Operation { public: const wsdl__operation *operation; const char *prefix; const char *URI; const char *name; const char *mep; // WSDL 2.0 bool is_rest; const char *protocol; soap__styleChoice style; const char *parameterOrder; const char *action; // SOAP action, REST HTTP location, or REST path /path const char *input_name; const char *output_name; Message *input; // name, use, and parts Message *output; // name, use, and parts std::vector infault; std::vector outfault; const char *documentation; const char *operation_documentation; std::vector policy; void generate(Types&, Service&); }; class Service { public: const char *prefix; // a gSOAP service has a unique namespace const char *URI; const char *name; // binding name const char *type; // portType const char *transport; // binding transport SetOfString location; // WSDL may specify multiple locations via -> std::vector operation; MapOfStringToMessage header; MapOfStringToMessage headerfault; MapOfStringToMessage fault; MapOfStringToString service_documentation; MapOfStringToString port_documentation; MapOfStringToString binding_documentation; std::vector policy; // WS-Policy std::vector role; // BPEL 2.0 VectorOfString imports; Service(); void generate(Types&); void add_import(const char*); void del_import(const char*); }; typedef std::map MapOfStringToService; class Definitions { public: Types types; // to process schema type information MapOfStringToService services; // service information gathered bool soap12; int binding_count; Definitions(); void collect(const wsdl__definitions&); void compile(const wsdl__definitions&); private: void analyze(const wsdl__definitions&); void analyze_headers(const wsdl__definitions&, Service*, wsdl__ext_ioput*, wsdl__ext_ioput*); void analyze_faults(const wsdl__definitions&, Service*, Operation*, std::vector::const_iterator&); Message *analyze_fault(const wsdl__definitions&, Service*, const wsdl__ext_fault&); void analyze_application(const wsdl__definitions&); void analyze_resource(const wsdl__definitions&, Service*, const wadl__resource_USCOREtype*, const char*, const char*, const char*); void generate(); }; #endif gsoap-2.8.91/gsoap/wsdl/bpel.cpp0000644000175000017500000003506013525245163016006 0ustar ellertellert/* bpel.cpp BPEL 2.0 binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2014, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "wsdlH.h" #include "includes.h" extern const char *qname_token(const char*, const char*); extern int is_builtin_qname(const char*); //////////////////////////////////////////////////////////////////////////////// // // plnk:tRole // //////////////////////////////////////////////////////////////////////////////// plnk__tRole::plnk__tRole() { portTypeRef = NULL; } wsdl__portType *plnk__tRole::portTypePtr() const { return portTypeRef; } int plnk__tRole::traverse(wsdl__definitions& definitions) { const char *token; if (vflag) std::cerr << " Analyzing BPEL Partner Link tRole" << std::endl; portTypeRef = NULL; token = qname_token(portType, definitions.targetNamespace); if (token) { for (std::vector::iterator portType = definitions.portType.begin(); portType != definitions.portType.end(); ++portType) { if ((*portType).name && !strcmp((*portType).name, token)) { portTypeRef = &(*portType); if (vflag) std::cerr << " Found tRole '" << (name?name:"") << "' portType '" << (token?token:"") << "'" << std::endl; break; } } // WSDL 2.0 for (std::vector::iterator i = definitions.interface_.begin(); i != definitions.interface_.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { portTypeRef = &(*i); if (vflag) std::cerr << " Found tRole '" << (name?name:"") << "' interface '" << (token?token:"") << "'" << std::endl; break; } } } if (!portTypeRef) { for (std::vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(portType, importdefinitions->targetNamespace); if (token) { for (std::vector::iterator portType = importdefinitions->portType.begin(); portType != importdefinitions->portType.end(); ++portType) { if ((*portType).name && !strcmp((*portType).name, token)) { portTypeRef = &(*portType); if (vflag) std::cerr << " Found tRole '" << (name?name:"") << "' portType '" << (token?token:"") << "'" << std::endl; break; } } // WSDL 2.0 for (std::vector::iterator i = importdefinitions->interface_.begin(); i != importdefinitions->interface_.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { portTypeRef = &(*i); if (vflag) std::cerr << " Found tRole '" << (name?name:"") << "' interface '" << (token?token:"") << "'" << std::endl; break; } } } } } } if (!portTypeRef) { if (!Wflag) std::cerr << "Warning: no tRole '" << (name?name:"") << "' portType '" << (portType?portType:"") << "' in wsdl definitions '" << (definitions.name?definitions.name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << std::endl; } return SOAP_OK; } void plnk__tRole::plnkPtr(plnk__tPartnerLinkType *plnk) { plnkRef = plnk; } plnk__tPartnerLinkType* plnk__tRole::plnkPtr() const { return plnkRef; } //////////////////////////////////////////////////////////////////////////////// // // plnk:tPartnerLinkType // //////////////////////////////////////////////////////////////////////////////// int plnk__tPartnerLinkType::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing BPEL Partner Link Type" << std::endl; for (std::vector::iterator i = role.begin(); i != role.end(); ++i) { (*i).plnkPtr(this); (*i).traverse(definitions); } return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // vprop:property // //////////////////////////////////////////////////////////////////////////////// int vprop__tProperty::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing BPEL Variable Properties" << std::endl; if (element && definitions.types) { for (std::vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(element, (*schema)->targetNamespace); if (token) { for (std::vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if ((*element).name && !strcmp((*element).name, token)) { type = (*element).type; if (vflag) std::cerr << " Found property '" << (name?name:"") << "' element '" << (token?token:"") << "'" << std::endl; break; } } } } } if (element && !type) { if (is_builtin_qname(element)) definitions.builtinElement(element); else if (!Wflag) std::cerr << "Warning: no BPEL Variable Properties '" << (name?name:"") << "' element '" << element << "' in wsdl definitions '" << (definitions.name?definitions.name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << std::endl; } else if (type) { if (is_builtin_qname(type)) definitions.builtinType(type); } return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // vprop:tPropertyAlias // //////////////////////////////////////////////////////////////////////////////// int vprop__tPropertyAlias::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing BPEL Variable Property Alias" << std::endl; vpropRef = NULL; for (std::vector::iterator vprop = definitions.vprop__property.begin(); vprop != definitions.vprop__property.end(); ++vprop) { const char *token = qname_token(propertyName, definitions.targetNamespace); if (token && !strcmp((*vprop).name, token)) { vpropRef = &(*vprop); if (vflag) std::cerr << " Found property alias '" << (propertyName?propertyName:"") << "' variable" << std::endl; break; } } if (!vpropRef) { for (std::vector::iterator import = definitions.import.begin(); !vpropRef && import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { for (std::vector::iterator vprop = importdefinitions->vprop__property.begin(); vprop != importdefinitions->vprop__property.end(); ++vprop) { const char *token = qname_token(propertyName, importdefinitions->targetNamespace); if (token && !strcmp((*vprop).name, token)) { vpropRef = &(*vprop); if (vflag) std::cerr << " Found property alias '" << (propertyName?propertyName:"") << "' variable" << std::endl; break; } } } } } xs__complexType *complexTypeRef = NULL; if (element && definitions.types) { for (std::vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(element, (*schema)->targetNamespace); if (token) { for (std::vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if ((*element).name && !strcmp((*element).name, token)) { if ((*element).type) type = (*element).type; else complexTypeRef = (*element).complexType; if (vflag) std::cerr << " Found property alias '" << (propertyName?propertyName:"") << "' element '" << (token?token:"") << "'" << std::endl; break; } } } } } else if (messageType && part) { wsdl__message *messageRef = NULL; const char *token = qname_token(messageType, definitions.targetNamespace); if (token) { for (std::vector::iterator message = definitions.message.begin(); message != definitions.message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) std::cerr << " Found property alias '" << (propertyName?propertyName:"") << "' message '" << (token?token:"") << "'" << std::endl; break; } } } if (!messageRef) { for (std::vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(messageType, importdefinitions->targetNamespace); if (token) { for (std::vector::iterator message = importdefinitions->message.begin(); message != importdefinitions->message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) std::cerr << " Found property alias '" << (propertyName?propertyName:"") << "' message '" << (token?token:"") << "'" << std::endl; break; } } } } } } if (messageRef) { for (std::vector::iterator parti = messageRef->part.begin(); parti != messageRef->part.end(); ++parti) { if ((*parti).name && !strcmp(part, (*parti).name)) { if ((*parti).element && definitions.types) { for (std::vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { if ((*parti).type) type = (*parti).type; else { token = qname_token((*parti).element, (*schema)->targetNamespace); if (token) { for (std::vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if ((*element).name && !strcmp((*element).name, token)) { if ((*element).type) type = (*element).type; else complexTypeRef = (*element).complexType; if (vflag) std::cerr << " Found property alias '" << (propertyName?propertyName:"") << "' element '" << (token?token:"") << "'" << std::endl; break; } } } } } } } } } } if (type && !complexTypeRef && definitions.types) { for (std::vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(type, (*schema)->targetNamespace); if (token) { for (std::vector::iterator complexType = (*schema)->complexType.begin(); complexType != (*schema)->complexType.end(); ++complexType) { if ((*complexType).name && !strcmp((*complexType).name, token)) { complexTypeRef = &(*complexType); break; } } } } } if (query && query->__mixed && complexTypeRef) { // TODO query is an XPath expression, most often just the name of an element const char *tag = strchr(query->__mixed, ':'); if (tag) ++tag; else tag = query->__mixed; if (complexTypeRef->all) { for (std::vector::iterator element = complexTypeRef->all->element.begin(); element != complexTypeRef->all->element.end(); ++element) { if ((*element).name && !strcmp((*element).name, tag)) { // element = (*element).name; type = (*element).type; break; } } } else if (complexTypeRef->sequence) { for (std::vector::iterator content = complexTypeRef->sequence->__contents.begin(); content != complexTypeRef->sequence->__contents.end(); ++content) { if ((*content).__union == SOAP_UNION_xs__union_content_element && (*content).__content.element && (*content).__content.element->name && !strcmp((*content).__content.element->name, tag)) { element = (*content).__content.element->name; type = (*content).__content.element->type; break; } } } } if (element && !type) { if (is_builtin_qname(element)) definitions.builtinElement(element); } else if (type) { if (is_builtin_qname(type)) definitions.builtinType(type); } return SOAP_OK; } vprop__tProperty *vprop__tPropertyAlias::vpropPtr() const { return vpropRef; } gsoap-2.8.91/gsoap/wsdl/mime.cpp0000644000175000017500000000470013525245163016010 0ustar ellertellert/* mime.cpp WSDL/MIME binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "wsdlH.h" // cannot include "schemaH.h" #include "includes.h" extern const char *qname_token(const char*, const char*); //////////////////////////////////////////////////////////////////////////////// // // mime:multipartRelated // //////////////////////////////////////////////////////////////////////////////// int mime__multipartRelated::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << "Analyzing mime multpartRelated " << std::endl; for (std::vector::iterator pt = part.begin(); pt != part.end(); ++pt) (*pt).traverse(definitions); return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // mime:part // //////////////////////////////////////////////////////////////////////////////// int mime__part::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << "Analyzing mime part " << std::endl; for (std::vector::iterator hd = soap__header_.begin(); hd != soap__header_.end(); ++hd) (*hd).traverse(definitions); return SOAP_OK; } gsoap-2.8.91/gsoap/wsdl/mime.h0000644000175000017500000000431613525245163015460 0ustar ellertellert/* mime.h mime and xmime binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap mime schema documentation: WSDL/MIME binding schema //gsoap mime schema namespace: http://schemas.xmlsoap.org/wsdl/mime/ //gsoap mime schema elementForm: qualified //gsoap mime schema attributeForm: unqualified //gsoap xmime schema documentation: xmime binding schema //gsoap xmime schema namespace: http://www.w3.org/2005/05/xmlmime #import "imports.h" #import "soap.h" class mime__content { public: @xsd__NMTOKEN part; @xsd__string type; }; class mime__part { public: soap__body *soap__body_; std::vector soap__header_; std::vector content; public: int traverse(wsdl__definitions&); }; class mime__multipartRelated { public: std::vector part; public: int traverse(wsdl__definitions&); }; class mime__mimeXml { public: @xsd__NMTOKEN part; }; gsoap-2.8.91/gsoap/wsdl/wsdl2h.cpp0000644000175000017500000006107713525245163016276 0ustar ellertellert/* wsdl2h.cpp WSDL/WADL/XSD parser and translator to the gSOAP header file format -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2019, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "includes.h" #include "types.h" #include "service.h" #ifndef WSDL2H_IMPORT_PATH #define WSDL2H_IMPORT_PATH (NULL) #endif #ifndef WSDL_TYPEMAP_FILE #define WSDL_TYPEMAP_FILE "typemap.dat" #endif static void init(); static void options(int argc, char **argv); int _flag = 0, aflag = 0, bflag = 0, cflag = 0, c11flag = 0, Dflag = 0, dflag = 0, eflag = 0, Fflag = 0, fflag = 0, gflag = 0, iflag = 0, jflag = 0, kflag = 0, Lflag = 0, Mflag = 0, mflag = 0, Oflag = 0, Owflag = 0, Pflag = 0, pflag = 0, Qflag = 0, Rflag = 0, sflag = 0, Uflag = 0, uflag = 0, vflag = 0, Wflag = 0, wflag = 0, Xflag = 0, xflag = 0, yflag = 0, zflag = 0; int openfiles = 0; int infiles = 0; char *infile[MAXINFILES], *outfile = NULL, *proxy_host = NULL, *proxy_userid = NULL, *proxy_passwd = NULL, *auth_userid = NULL, *auth_passwd = NULL; const char *mapfile = WSDL_TYPEMAP_FILE, *import_path = WSDL2H_IMPORT_PATH, *cwd_path = NULL, *cppnamespace = NULL; int proxy_port = 8080; FILE *stream = stdout; SetOfString exturis; extern struct Namespace namespaces[]; const char *service_prefix = NULL; const char *schema_prefix = "ns"; const char *soap_context = "soap"; const char elementformat[] = " %-35s %-30s"; const char pointerformat[] = " %-35s *%-30s"; const char attributeformat[] = " @ %-35s %-30s"; const char templateformat[] = " %s<%-23s> %-30s"; const char pointertemplateformat[] = " %s<%-22s> *%-30s"; const char templateformat_open[] = " %s<%s"; const char attrtemplateformat_open[] = " @ %s<%s"; const char arrayformat[] = " %-35s *__ptr%-25s"; const char arraysizeformat[] = " %-35s __size%-24s"; const char arrayoffsetformat[] = "// %-35s __offset%-22s"; const char sizeformat[] = " $ %-35s __size%-24s"; const char choiceformat[] = " $ %-35s __union%-23s"; const char schemaformat[] = "//gsoap %-5s schema %s:\t%s\n"; const char serviceformat[] = "//gsoap %-4s service %s:\t%s %s\n"; const char paraformat[] = " %-35s%s%s%s"; const char anonformat[] = " %-35s%s_%s%s"; const char sizeparaformat[] = " $ %-35s __size%s%s"; const char pointertemplateparaformat[] = " %s<%-21s>*%s%s%s"; const char derivedformat[] = " [ %-35s *%-30s; ]"; const char copyrightnotice[] = "\n** The gSOAP WSDL/WADL/XSD processor for C and C++, wsdl2h release " WSDL2H_VERSION "\n** Copyright (C) 2000-2019 Robert van Engelen, Genivia Inc.\n** All Rights Reserved. This product is provided \"as is\", without any warranty.\n** The wsdl2h tool and its generated software are released under the GPL.\n** ----------------------------------------------------------------------------\n** A commercial use license is available from Genivia Inc., contact@genivia.com\n** ----------------------------------------------------------------------------\n\n"; const char licensenotice[] = "\ --------------------------------------------------------------------------------\n\ gSOAP XML Web services tools\n\ Copyright (C) 2000-2019, Robert van Engelen, Genivia Inc. All Rights Reserved.\n\ The wsdl2h tool and its generated software are released under the GPL.\n\ This software is released under the GPL with the additional exemption that\n\ compiling, linking, and/or using OpenSSL is allowed.\n\ --------------------------------------------------------------------------------\n\ GPL license.\n\ \n\ This program is free software; you can redistribute it and/or modify it under\n\ the terms of the GNU General Public License as published by the Free Software\n\ Foundation; either version 2 of the License, or (at your option) any later\n\ version.\n\ \n\ This program is distributed in the hope that it will be useful, but WITHOUT ANY\n\ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n\ PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\ \n\ You should have received a copy of the GNU General Public License along with\n\ this program; if not, write to the Free Software Foundation, Inc., 59 Temple\n\ Place, Suite 330, Boston, MA 02111-1307 USA\n\ \n\ Author contact information:\n\ engelen@genivia.com / engelen@acm.org\n\ \n\ This program is released under the GPL with the additional exemption that\n\ compiling, linking, and/or using OpenSSL is allowed.\n\ --------------------------------------------------------------------------------\n\ A commercial-use license is available from Genivia, Inc., contact@genivia.com\n\ --------------------------------------------------------------------------------\n"; int main(int argc, char **argv) { options(argc, argv); fprintf(stderr, "%s", copyrightnotice); if (!infiles) fprintf(stderr, "Reading from stdin...\n"); init(); if (cppnamespace) fprintf(stream, "namespace %s {\n", cppnamespace); Definitions def; wsdl__definitions definitions; definitions.read(infiles, infile); if (definitions.error()) { definitions.print_fault(); exit(1); } definitions.traverse(); if (Oflag > 1) definitions.mark(); def.compile(definitions); if (Oflag > 1) { if (def.types.omitted) { fprintf(stderr, "\nOptimization (-O%s%d) removed %zu definitions of unused schema components (%.1f%%)\n", Owflag ? "w" : "", Oflag, def.types.omitted, 100.0*def.types.omitted/def.types.total); if (pflag && !Owflag) fprintf(stderr, "\nWarning: option -O%d removes type definitions that may be used as derived types of base types in XML (which are indicated by xsi:type attributes). Use option -Ow%d instead of -O%d to retain all derived types of base types\n", Oflag, Oflag, Oflag); else if (Fflag && !Owflag) fprintf(stderr, "\nWarning: option -O%d removes type definitions that may be used as derived types of base types in XML (which are indicated by xsi:type attributes). Use option -Ow%d instead of -O%d to retain all derived types of base types\n", Oflag, Oflag, Oflag); } else { fprintf(stderr, "\nOptimization (-O%s%d) found no unused schema components to remove\n", Owflag ? "w" : "", Oflag); } } if (outfile) { fclose(stream); fprintf(stderr, "\nTo finalize code generation, execute:\n> soapcpp2 %s\n", outfile); if (!cflag) fprintf(stderr, "Or to generate C++ proxy and service classes:\n> soapcpp2 -j %s\n", outfile); fprintf(stderr, "\n"); } return 0; } //////////////////////////////////////////////////////////////////////////////// // // Initialization // //////////////////////////////////////////////////////////////////////////////// static void init() { struct Namespace *p = namespaces; if (p) { for (; p->id; p++) { if (p->in && *p->in) exturis.insert(p->in); if (p->ns && *p->ns) exturis.insert(p->ns); } } } //////////////////////////////////////////////////////////////////////////////// // // Parse command line options // //////////////////////////////////////////////////////////////////////////////// static void options(int argc, char **argv) { int i; infiles = 0; openfiles = 0; for (i = 1; i < argc; i++) { char *a = argv[i]; if (*a == '-' #ifdef WIN32 || *a == '/' #endif ) { int g = 1; while (g && *++a) { switch (*a) { case '_': _flag = 1; break; case 'a': aflag = 1; break; case 'b': bflag = 1; break; case 'c': if (a[1] == '+' && a[2] == '+') { a += 2; if (a[1] == '1' && a[2] == '1') { a += 2; c11flag = 1; } cflag = 0; } else { cflag = 1; if (cppnamespace) fprintf(stderr, "wsdl2h: Options -c and -q cannot be used together\n"); } break; case 'D': Dflag = 1; break; case 'd': dflag = 1; break; case 'e': eflag = 1; break; case 'F': Fflag = 1; break; case 'f': fflag = 1; break; case 'g': gflag = 1; break; case 'i': iflag = 1; break; case 'j': jflag = 1; break; case 'k': kflag = 1; break; case 'I': a++; g = 0; if (*a) import_path = a; else if (i < argc && argv[++i]) import_path = argv[i]; else fprintf(stderr, "wsdl2h: Option -I requires a path argument\n"); break; case 'L': Lflag = 1; break; case 'l': fprintf(stderr, "%s", licensenotice); exit(0); break; case 'm': mflag = 1; break; case 'M': Mflag = 1; break; case 'n': a++; g = 0; if (*a) schema_prefix = a; else if (i < argc && argv[++i]) schema_prefix = argv[i]; else fprintf(stderr, "wsdl2h: Option -n requires a prefix name argument\n"); break; case 'N': a++; g = 0; if (*a) service_prefix = a; else if (i < argc && argv[++i]) service_prefix = argv[i]; else fprintf(stderr, "wsdl2h: Option -N requires a prefix name argument\n"); break; case 'o': a++; if (outfile) fprintf(stderr, "wsdl2h: Option -o specified twice\n"); g = 0; if (*a) outfile = a; else if (i < argc && argv[++i]) outfile = argv[i]; else fprintf(stderr, "wsdl2h: Option -o requires an output file argument\n"); break; case 'O': a++; if (*a == 'w') { Owflag = 1; a++; } if (Oflag) fprintf(stderr, "wsdl2h: Option -O specified twice\n"); g = 0; if (*a) Oflag = soap_strtol(a, NULL, 10); else if (i < argc && argv[++i]) Oflag = soap_strtol(argv[i], NULL, 10); else fprintf(stderr, "wsdl2h: Option -O requires an argument number\n"); break; case 'p': pflag = 1; break; case 'P': Pflag = 1; break; case 'Q': Qflag = 1; break; case 'q': a++; g = 0; if (*a) cppnamespace = a; else if (i < argc && argv[++i]) cppnamespace = argv[i]; else fprintf(stderr, "wsdl2h: Option -q requires a C++ namespace name argument\n"); if (cflag) fprintf(stderr, "wsdl2h: Options -c and -q cannot be used together\n"); break; case 'r': a++; g = 0; if (*a) proxy_host = a; else if (i < argc && argv[++i]) proxy_host = argv[i]; else fprintf(stderr, "wsdl2h: Option -r requires proxy host:port:userid:passwd or :userid:passwd authentication argument\n"); if (proxy_host) { size_t l = strlen(proxy_host); char *s = (char*)emalloc(l + 1); soap_strcpy(s, l + 2, proxy_host); proxy_host = s; s = strchr(proxy_host, ':'); if (s) { *s = '\0'; if (*proxy_host) { proxy_port = soap_strtol(s + 1, &s, 10); if (s && *s == ':') { *s = '\0'; proxy_userid = s + 1; s = strchr(proxy_userid, ':'); if (s && *s == ':') { *s = '\0'; proxy_passwd = s + 1; } } } else { s = proxy_host; proxy_host = NULL; auth_userid = s + 1; s = strchr(auth_userid, ':'); if (s && *s == ':') { *s = '\0'; auth_passwd = s + 1; } } } } break; case 'R': Rflag = 1; break; case 's': sflag = 1; break; case 'S': a++; g = 0; if (*a) soap_context = a; else if (i < argc && argv[++i]) soap_context = argv[i]; else fprintf(stderr, "wsdl2h: Option -S requires a name argument\n"); break; case 't': a++; g = 0; if (*a) mapfile = a; else if (i < argc && argv[++i]) mapfile = argv[i]; else fprintf(stderr, "wsdl2h: Option -t requires a type map file argument\n"); break; case 'U': Uflag = 1; break; case 'u': uflag = 1; break; case 'V': printf("%s", WSDL2H_VERSION); exit(0); case 'v': vflag = 1; break; case 'w': wflag = 1; break; case 'W': Wflag = 1; break; case 'X': Xflag = 1; break; case 'x': xflag = 1; break; case 'y': yflag = 1; break; case 'z': { int z = zflag; a++; if (zflag) fprintf(stderr, "wsdl2h: Option -z specified twice\n"); g = 0; if (*a) z = soap_strtol(a, NULL, 10); else if (i < argc && argv[++i]) z = soap_strtol(argv[i], NULL, 10); else fprintf(stderr, "wsdl2h: Option -z requires an argument\n"); if (zflag == 0 || z < zflag) zflag = z; break; } case '?': case 'h': fprintf(stderr, "Usage: wsdl2h [-a] [-b] [-c|-c++|-c++11] [-D] [-d] [-e] [-F] [-f] [-g] [-h] [-I path] [-i] [-j] [-k] [-L] [-l] [-M] [-m] [-N name] [-n name] [-O1|-O2|-O3|-O4|-Ow2|-Ow3|-Ow4] [-P|-p] [-Q] [-q name] [-R] [-r proxyhost[:port[:uid:pwd]]] [-r:uid:pwd] [-Sname] [-s] [-T] [-t typemapfile] [-U] [-u] [-V] [-v] [-w] [-W] [-x] [-y] [-z#] [-_] [-o outfile.h] infile.wsdl infile.xsd http://www... ...\n\n"); fprintf(stderr, "\ -a generate indexed struct names for local elements with anonymous types\n\ -b bi-directional operations (duplex ops) added to serve one-way responses\n\ -c generate C source code\n\ -c++ generate C++ source code (default)\n\ -c++11 generate C++11 source code\n\ -D make attribute members with default/fixed values optional with pointers\n\ -d use DOM to populate xs:any, xs:anyType, and xs:anyAttribute\n\ -e don't qualify enum names\n\ -F add transient members to structs to simulate struct-type derivation in C\n\ -f generate flat C++ class hierarchy by removing inheritance\n\ -g generate global top-level element and attribute declarations\n\ -h display help info and exit\n\ -Ipath use path to locate WSDL and XSD files\n\ -i don't import (advanced option)\n\ -j don't generate SOAP_ENV__Header and SOAP_ENV__Detail definitions\n\ -k don't generate SOAP_ENV__Header mustUnderstand qualifiers\n\ -L generate less documentation by removing generic @note comments\n\ -l display license information\n\ -M suppress error \"must understand element with wsdl:required='true'\"\n\ -m use xsd.h module to import primitive types\n\ -Nname use name for service prefixes to produce a service for each binding\n\ -nname use name as the base namespace prefix instead of 'ns'\n\ -O1 optimize by omitting duplicate choice/sequence members\n\ -O2 optimize -O1 and omit unused schema types (unreachable from roots)\n\ -O3 optimize -O2 and omit unused schema root attributes\n\ -O4 optimize -O3 and omit unused schema root elements (use only with WSDLs)\n\ -Ow2 optimize -O2 while retaining all derived types of used base types\n\ -Ow3 optimize -O3 while retaining all derived types of used base types\n\ -Ow4 optimize -O4 while retaining all derived types of used base types\n\ -ofile output to file\n\ -P don't create polymorphic types inherited from xsd__anyType\n\ -p create polymorphic types inherited from base xsd__anyType\n\ -Q make xsd__anySimpleType equal to xsd__anyType to use as the base type\n\ -qname use name for the C++ namespace of all declarations\n\ -R generate REST operations for REST bindings specified in a WSDL\n\ -rhost[:port[:uid:pwd]]\n\ connect via proxy host, port, and proxy credentials uid and pwd\n\ -r:uid:pwd\n\ connect with authentication credentials uid and pwd\n\ -Sname use name instead of 'soap' for the C++ class members with soap contexts\n\ -s don't generate STL code (no std::string and no std::vector)\n\ -tfile use type map file instead of the default file typemap.dat\n\ -U allow UTF-8-encoded Unicode C/C++ identifiers when mapping XML tag names\n\ -u don't generate unions\n\ -V display the current version and exit\n\ -v verbose output\n\ -W suppress warnings\n\ -w always wrap response parameters in a response struct (<=1.1.4 behavior)\n\ -X don't qualify part names to disambiguate doc/lit wrapped patterns\n\ -x don't generate _XML any/anyAttribute extensibility elements\n\ -y generate typedef synonyms for structs and enums\n\ -z1 compatibility with 2.7.6e: generate pointer-based arrays\n\ -z2 compatibility with 2.7.7 to 2.7.15: qualify element/attribute references\n\ -z3 compatibility with 2.7.16 to 2.8.7: qualify element/attribute references\n\ -z4 compatibility up to 2.8.11: don't generate union structs in std::vector\n\ -z5 compatibility up to 2.8.15: don't include minor improvements\n\ -z6 compatibility up to 2.8.17: don't include minor improvements\n\ -z7 compatibility up to 2.8.59: don't generate std::vector of class of union\n\ -z8 compatibility up to 2.8.74: don't gen quals for doc/lit wrapped patterns\n\ -_ don't generate _USCORE (replace with Unicode code point _x005f)\n\ infile.wsdl infile.xsd http://www... list of input sources (if none reads stdin)\n\ \n"); exit(0); default: fprintf(stderr, "wsdl2h: Unknown option %s\n", a); exit(1); } } } else { infile[infiles++] = argv[i]; if (infiles >= MAXINFILES) { fprintf(stderr, "wsdl2h: too many files\n"); exit(1); } } } if (infiles) { if (!outfile) { if (strncmp(infile[0], "http://", 7) && strncmp(infile[0], "https://", 8)) { const char *s = strrchr(infile[0], '.'); if (s && (!soap_tag_cmp(s, ".wsdl") || !soap_tag_cmp(s, ".wadl") || !soap_tag_cmp(s, ".gwsdl") || !soap_tag_cmp(s, ".xsd"))) { outfile = estrdup(infile[0]); outfile[s - infile[0] + 1] = 'h'; outfile[s - infile[0] + 2] = '\0'; } else { size_t l = strlen(infile[0]); outfile = (char*)emalloc(l + 3); soap_strcpy(outfile, l + 3, infile[0]); soap_strcpy(outfile + l, 3, ".h"); } } } if (outfile) { stream = fopen(outfile, "w"); if (!stream) { fprintf(stderr, "Cannot write to %s\n", outfile); exit(1); } fprintf(stderr, "Saving %s\n\n", outfile); } } } //////////////////////////////////////////////////////////////////////////////// // // Namespaces // //////////////////////////////////////////////////////////////////////////////// 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", NULL, NULL}, {"xsd", "-", NULL, NULL}, // http://www.w3.org/2001/XMLSchema"}, // don't use this, it might conflict with xs {"xml", "http://www.w3.org/XML/1998/namespace", NULL, NULL}, {"xs", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL}, {"vc", "http://www.w3.org/2007/XMLSchema-versioning", NULL, NULL}, {"http", "http://schemas.xmlsoap.org/wsdl/http/", NULL, NULL}, {"soap", "http://schemas.xmlsoap.org/wsdl/soap/", "http://schemas.xmlsoap.org/wsdl/soap*/", NULL}, {"mime", "http://schemas.xmlsoap.org/wsdl/mime/", NULL, NULL}, {"xmime", "http://www.w3.org/2005/05/xmlmime", NULL, NULL}, {"dime", "http://schemas.xmlsoap.org/ws/2002/04/dime/wsdl/", "http://schemas.xmlsoap.org/ws/*/dime/wsdl/", NULL}, {"wadl", "http://wadl.dev.java.net/2009/02", NULL, NULL}, {"wsdl", "http://schemas.xmlsoap.org/wsdl/", "http://www.w3.org/ns/wsdl", NULL}, {"wsdli", "http://www.w3.org/ns/wsdl-instance", NULL, NULL}, {"wsdlx", "http://www.w3.org/ns/wsdl-extensions", NULL, NULL}, {"wsoap", "http://www.w3.org/ns/wsdl/soap", NULL, NULL}, {"whttp", "http://www.w3.org/ns/wsdl/http", NULL, NULL}, {"wrpc", "http://www.w3.org/ns/wsdl/rpc", NULL, NULL}, {"wsaw", "http://www.w3.org/2006/05/addressing/wsdl", NULL, NULL}, {"gwsdl", "http://www.gridforum.org/namespaces/2003/03/gridWSDLExtensions", NULL, NULL}, {"wsa_", "http://www.w3.org/2005/08/addressing", NULL, NULL}, {"wsam", "http://www.w3.org/2007/05/addressing/metadata", NULL, NULL}, {"wsrmp", "http://docs.oasis-open.org/ws-rx/wsrm/200702", "http://docs.oasis-open.org/ws-rx/wsrm/*", NULL}, {"wsrmp5", "http://schemas.xmlsoap.org/ws/2005/02/rm/policy", NULL, NULL}, {"sp", "http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702", "http://schemas.xmlsoap.org/ws/2005/07/securitypolicy", NULL}, {"wsp_", "http://www.w3.org/ns/ws-policy", "http://schemas.xmlsoap.org/ws/2004/09/policy", NULL}, {"wst_", "http://docs.oasis-open.org/ws-sx/ws-trust/200512", NULL, NULL}, {"wsu_", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", NULL, NULL}, {"plnk","http://docs.oasis-open.org/wsbpel/2.0/plnktype", NULL, NULL}, {"vprop","http://docs.oasis-open.org/wsbpel/2.0/varprop", NULL, NULL}, #ifdef WITH_BPEL {"bpel","http://docs.oasis-open.org/wsbpel/2.0/process/executable", NULL, NULL}, {"sref","http://docs.oasis-open.org/wsbpel/2.0/serviceref", NULL, NULL}, #endif {NULL, NULL, NULL, NULL} }; gsoap-2.8.91/gsoap/wsdl/wadl.h0000644000175000017500000002126313525245163015460 0ustar ellertellert/* wadl.h WADL schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap wadl schema documentation: WADL binding schema //gsoap wadl schema namespace: http://wadl.dev.java.net/2009/02 //gsoap wadl schema elementForm: qualified //gsoap wadl schema attributeForm: unqualified #import "imports.h" class wadl__resource; // forward declaration class wadl__resource_USCOREtype; // forward declaration typedef xsd__string wadl__statusCodeList; // list of unsigned ints enum wadl__HTTPMethods { GET, POST, PUT, HEAD, DELETE_ }; enum wadl__ParamStyle { plain, query, matrix, header, template_ }; class wadl__doc { public: @xsd__string title; @xsd__string xml__lang; _XML __mixed; }; class wadl__option { public: @xsd__string value; @xsd__string mediaType; std::vector doc; }; class wadl__link { public: @xsd__anyURI resource_USCOREtype; @xsd__token rel; @xsd__token rev; std::vector doc; private: wadl__resource_USCOREtype* linkRef; public: wadl__link(); int traverse(wsdl__definitions&); void linkPtr(wadl__resource_USCOREtype*); const wadl__resource_USCOREtype* linkPtr() const; }; class wadl__param { public: @xsd__anyURI href; @xsd__NMTOKEN name; @enum wadl__ParamStyle* style; @xsd__ID id; @xsd__QName type; @xsd__string default_; @bool required = false; @bool repeating = false; @xsd__string fixed; @xsd__string path; std::vector doc; std::vector option; wadl__link* link; private: wadl__param* paramRef; xs__simpleType* simpleTypeRef; xs__complexType* complexTypeRef; public: wadl__param(); int traverse(wsdl__definitions&); void paramPtr(wadl__param*); const wadl__param* paramPtr() const; void simpleTypePtr(xs__simpleType*); xs__simpleType* simpleTypePtr() const; void complexTypePtr(xs__complexType*); xs__complexType* complexTypePtr() const; void mark(); }; class wadl__include { public: @xsd__anyURI href; std::vector doc; public: int preprocess(wsdl__definitions&); }; class wadl__grammars { public: std::vector doc; std::vector include; public: int preprocess(wsdl__definitions&); }; class wadl__representation { public: @xsd__ID id; @xsd__QName element; @xsd__string mediaType; @xsd__anyURI href; @xsd__anyURI profile; std::vector doc; std::vector param; private: wadl__representation* representationRef; xs__element* elementRef; public: wadl__representation(); int traverse(wsdl__definitions&); void representationPtr(wadl__representation*); const wadl__representation* representationPtr() const; void elementPtr(xs__element*); xs__element* elementPtr() const; void mark(); }; class wadl__request { public: std::vector doc; std::vector param; std::vector representation; public: int traverse(wsdl__definitions&); void mark(); }; class wadl__response : public wadl__request { public: @wadl__statusCodeList status; }; class wadl__method { public: @xsd__ID id; @enum wadl__HTTPMethods name; @xsd__anyURI href; std::vector doc; wadl__request* request; std::vector response; private: wadl__method* methodRef; public: wadl__method(); int traverse(wsdl__definitions&); void methodPtr(wadl__method*); const wadl__method* methodPtr() const; void mark(); }; class __wadl__method_resource_choice { public: wadl__method* method; wadl__resource* resource; public: int traverse(wsdl__definitions&); }; class wadl__resource_USCOREtype { public: @xsd__ID id; std::vector doc; std::vector param; std::vector<__wadl__method_resource_choice> __choice; public: int traverse(wsdl__definitions&); }; class wadl__resource : public wadl__resource_USCOREtype { public: @xsd__anyURI type; @xsd__string queryType = "application/x-www-form-urlencoded"; @xsd__string path; private: std::vector typeRefs; public: int traverse(wsdl__definitions&); void typePtr(wadl__resource_USCOREtype*); const std::vector& typePtrs() const; }; class wadl__resources { public: @xsd__anyURI base; std::vector doc; std::vector resource; public: int traverse(wsdl__definitions&); }; class wadl__application { public: std::vector doc; wadl__grammars* grammars; std::vector resources; std::vector resource_USCOREtype; std::vector method; std::vector representation; std::vector param; struct soap* soap; public: int preprocess(wsdl__definitions&); int traverse(wsdl__definitions&); void mark(); }; gsoap-2.8.91/gsoap/wsdl/includes.h0000644000175000017500000001035613525245163016340 0ustar ellertellert/* includes.h Common project definitions -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2017, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef INCLUDES_H #define INCLUDES_H #include "stdsoap2.h" #ifdef WITH_OPENSSL #include "httpda.h" #endif #define WSDL2H_VERSION "2.8.91" #ifdef WIN32 # pragma warning(disable : 4996) #endif #include #include #include #include #include struct ltstr { bool operator()(const char *s1, const char *s2) const { return strcmp(s1, s2) < 0; } }; struct eqstr { const char *s; eqstr(const char *s) : s(s) { } bool operator()(const char *t) const { return strcmp(s, t) == 0; } }; typedef std::set SetOfString; typedef std::pair Pair; struct ltpair { bool operator()(Pair s1, Pair s2) const { int cmp = strcmp(s1.first, s2.first); if (cmp == 0) cmp = strcmp(s1.second, s2.second); return cmp < 0; } }; typedef std::map MapOfStringToString; typedef std::map MapOfPairToString; typedef std::map MapOfStringToNum; typedef std::vector VectorOfString; extern int _flag, aflag, bflag, cflag, c11flag, Dflag, dflag, eflag, Fflag, fflag, gflag, iflag, jflag, kflag, Lflag, Mflag, mflag, Oflag, Owflag, Pflag, pflag, Qflag, Rflag, sflag, sflag, Uflag, uflag, vflag, Wflag, wflag, Xflag, xflag, yflag, zflag; extern FILE *stream; extern SetOfString exturis; #define MAXINFILES (1000) extern int openfiles; extern int infiles; extern char *infile[MAXINFILES], *outfile, *proxy_host, *proxy_userid, *proxy_passwd, *auth_userid, *auth_passwd; extern const char *mapfile, *import_path, *cwd_path, *cppnamespace; extern int proxy_port; extern const char *service_prefix; extern const char *schema_prefix; extern const char *soap_context; extern const char elementformat[]; extern const char pointerformat[]; extern const char attributeformat[]; extern const char templateformat_open[]; extern const char attrtemplateformat_open[]; extern const char templateformat[]; extern const char pointertemplateformat[]; extern const char arrayformat[]; extern const char arraysizeformat[]; extern const char arrayoffsetformat[]; extern const char sizeformat[]; extern const char choiceformat[]; extern const char schemaformat[]; extern const char serviceformat[]; extern const char paraformat[]; extern const char anonformat[]; extern const char sizeparaformat[]; extern const char pointertemplateparaformat[]; extern const char derivedformat[]; extern const char copyrightnotice[]; extern const char licensenotice[]; extern void *emalloc(size_t size); extern char *estrdup(const char *s); extern char *estrdupf(const char *s); extern void text(const char*); class Types; class Message; class Operation; class Service; class Definitions; #endif gsoap-2.8.91/gsoap/wsdl/Makefile.am0000644000175000017500000000320713525245163016412 0ustar ellertellert####### This is the input file for automake, which will generate Makefile.in ########## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = foreign 1.4 # INCLUDES=-I$(top_srcdir)/gsoap # AM_LDFLAGS=$(INCLUDES) -I$(top_srcdir)/gsoap/wsdl -L$(top_srcdir)/gsoap/wsdl AM_LDFLAGS=-L$(top_srcdir)/gsoap/wsdl -I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin AM_CPPFLAGS=-I$(top_srcdir)/gsoap -I$(top_srcdir)/gsoap/plugin SOAP=$(top_builddir)/gsoap/src/soapcpp2$(EXEEXT) SOAP_CPP_LIB=$(top_builddir)/gsoap/$(WSDL2H_SOAP_CPP_LIB) SOAP_CPP_SRC=wsdlC.cpp SOAPHEADER=$(top_srcdir)/gsoap/wsdl/wsdl.h SOAP_FLAGS=-SC -pwsdl -I$(top_srcdir)/gsoap/wsdl -I$(top_srcdir)/gsoap/import BUILT_SOURCES=$(SOAP_CPP_SRC) # WSDL2H_EXTRA_FLAGS=-DWITH_OPENSSL -DWITH_GZIP # defined in configure.in # WSDL2H_EXTRA_LIBS=-lssl -lcrypto -lz # defined in configure.in $(SOAP_CPP_SRC) : $(SOAPHEADER) $(SOAP) $(SOAP_FLAGS) $(SOAPHEADER) #LIBS= bin_PROGRAMS=wsdl2h wsdl2h_CFLAGS=$(C_DEBUG_FLAGS) $(SOAPCPP2_INCLUDE_XLOCALE) $(SOAPCPP2_NO_C_LOCALE) $(WSDL2H_EXTRA_FLAGS) wsdl2h_CXXFLAGS=$(C_DEBUG_FLAGS) $(SOAPCPP2_INCLUDE_XLOCALE) $(SOAPCPP2_NO_C_LOCALE) $(WSDL2H_EXTRA_FLAGS) $(WSDL2H_IMPORTPATH) wsdl2h_CPPFLAGS=$(AM_CPPFLAGS) $(SOAPCPP2_NONAMESPACES) -D$(platform) wsdl2h_SOURCES=wsdl2h.cpp wsdl.cpp wadl.cpp schema.cpp types.cpp service.cpp soap.cpp mime.cpp wsp.cpp bpel.cpp $(SOAP_CPP_SRC) wsdl2h_LDADD=$(SOAP_CPP_LIB) $(WSDL2H_EXTRA_LIBS) if WITH_OPENSSL wsdl2h_SOURCES+=$(top_srcdir)/gsoap/plugin/httpda.c $(top_srcdir)/gsoap/plugin/smdevp.c wsdl2h_LDADD+=-lpthread endif CLEANFILES= *~ *C.cpp *H.h *Stub.h *.nsmap gsoap-2.8.91/gsoap/wsdl/wsdl.cpp0000644000175000017500000023243613525245163016043 0ustar ellertellert/* wsdl.cpp WSDL 1.1 and WSDL 2.0 binding schema implementation -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "wsdlH.h" #include "includes.h" extern struct Namespace namespaces[]; const char *qname_token(const char *QName, const char *URI) { if (QName && QName[0] == '"' && QName[1] == '"' && QName[2] == ':') return QName + 3; if (QName && URI && *QName == '"') // QNames are stored in the format "URI":name, unless the URI is in the nsmap { size_t n = strlen(URI); if (!strncmp(QName + 1, URI, n) && QName[n + 1] == '"') return QName + n + 3; } return NULL; } int is_builtin_qname(const char *QName) { if (iflag) return 1; if (QName) { if (*QName == '#') // reserved QNames return 0; if (*QName != '"') return 1; // if the QName does not start with a ", it must be in the nsmap const char *s = strchr(QName + 1, '"'); if (s) { size_t n = s - QName - 1; for (SetOfString::const_iterator i = exturis.begin(); i != exturis.end(); ++i) if (strlen(*i) == n && !strncmp(QName + 1, *i, n)) return 1; // QName is in exturis } } return 0; } xsd__QName make_qname(xs__schema& schema, const char *name) { const char *URI = schema.targetNamespace ? schema.targetNamespace : ""; size_t n = strlen(URI) + strlen(name) + 3; char *s = (char*)soap_malloc(schema.soap, n + 1); (SOAP_SNPRINTF(s, n + 1, n), "\"%s\":%s", URI, name); return s; } //////////////////////////////////////////////////////////////////////////////// // // wsdl // //////////////////////////////////////////////////////////////////////////////// extern "C" { int warn_ignore(struct soap*, const char*); int show_ignore(struct soap*, const char*); } wsdl__definitions::wsdl__definitions() { soap = soap_new1(SOAP_XML_TREE | SOAP_C_UTFSTRING); #ifdef HTTPDA_H soap_register_plugin(soap, http_da); #endif #ifdef WITH_OPENSSL soap_ssl_client_context(soap, SOAP_SSL_NO_AUTHENTICATION | SOAP_SSLv3_TLSv1, NULL, NULL, NULL, NULL, NULL); #endif soap_set_namespaces(soap, namespaces); soap_default(soap); if (vflag) soap->fignore = show_ignore; else soap->fignore = warn_ignore; soap->encodingStyle = NULL; soap->proxy_host = proxy_host; soap->proxy_port = proxy_port; soap->proxy_userid = proxy_userid; soap->proxy_passwd = proxy_passwd; name = NULL; targetNamespace = soap_strdup(soap, ""); documentation = NULL; types = NULL; updated = false; location = NULL; redirs = 0; appRef = NULL; used = false; } wsdl__definitions::wsdl__definitions(struct soap *copy) { soap = soap_copy(copy); soap->socket = SOAP_INVALID_SOCKET; soap->recvfd = 0; soap->sendfd = 1; soap_strcpy(soap->host, sizeof(soap->host), copy->host); soap_default(soap); soap->fignore = warn_ignore; soap->encodingStyle = NULL; updated = false; location = NULL; redirs = 0; appRef = NULL; } wsdl__definitions::wsdl__definitions(struct soap *copy, const char *cwd, const char *loc, const char *relloc) { soap = soap_copy(copy); soap->socket = SOAP_INVALID_SOCKET; soap->recvfd = 0; soap->sendfd = 1; soap_strcpy(soap->host, sizeof(soap->host), copy->host); soap_default(soap); soap->fignore = warn_ignore; soap->encodingStyle = NULL; updated = false; location = NULL; redirs = 0; appRef = NULL; read(cwd, loc, relloc); } wsdl__definitions::~wsdl__definitions() { soap_destroy(soap); soap_end(soap); soap_done(soap); free(soap); } int wsdl__definitions::get(struct soap *soap) { (void)soap; return preprocess(); } int wsdl__definitions::read(int num, char **loc) { if (num <= 0) return read(NULL, NULL, NULL); if (num == 1) return read(NULL, loc[0], NULL); wsdl__import im; im.namespace_ = NULL; name = soap_strdup(soap, "WSDL"); targetNamespace = soap_strdup(soap, "");; for (int i = 0; i < num; i++) { im.location = loc[i]; import.push_back(im); } return preprocess(); } int wsdl__definitions::read(const char *cwd, const char *loc, const char *relloc) { const char *cwd_temp; if (!cwd) cwd = cwd_path; if (vflag) fprintf(stderr, "\nOpening WSDL/WADL or XSD '%s' relative to '%s'\n", loc ? loc : "(stdin)", cwd ? cwd : "./"); if (loc) { if (soap->recvfd > 2) { soap_end_recv(soap); close(soap->recvfd); soap->recvfd = -1; } else if (soap_valid_socket(soap->socket)) { soap_end_recv(soap); soap_closesock(soap); } #ifdef WITH_OPENSSL if (!strncmp(loc, "http://", 7) || !strncmp(loc, "https://", 8)) #else if (!strncmp(loc, "https://", 8)) { #ifdef WIN32 fprintf(stderr, "\nCannot connect to https site: SSL/TLS support not enabled in this version. Visit https://www.genivia.com/downloads.html to download the secure version of wsdl2h.exe that supports SSL/TLS to connect to https sites.\n"); #else fprintf(stderr, "\nCannot connect to https site: SSL/TLS support not enabled, please rebuild wsdl2h with SSL/TLS enabled using 'make secure' or download the WSDL/WADL and XSD files and rerun wsdl2h on these files directly by specifying the file names on the command line.\n"); #endif exit(1); } else if (!strncmp(loc, "http://", 7)) #endif { fprintf(stderr, "%*sConnecting to '%s' to retrieve WSDL/WADL or XSD...", 2*openfiles, "", loc); location = soap_strdup(soap, loc); if (soap_connect_command(soap, SOAP_GET, location, NULL)) { fprintf(stderr, "\n\nError: connection failed\n"); soap_print_fault(soap, stderr); exit(1); } fprintf(stderr, " connected, receiving...\n"); openfiles++; } else if (cwd && (!strncmp(cwd, "http://", 7) || !strncmp(cwd, "https://", 8))) { size_t l = strlen(cwd) + strlen(loc); location = (char*)soap_malloc(soap, l + 2); soap_strcpy(location, l + 2, cwd); char *s = strrchr(location, '/'); if (s) *s = '\0'; size_t n = strlen(location); soap_strcpy(location + n, l + 2 - n, "/"); ++n; soap_strcpy(location + n, l + 2 - n, loc); fprintf(stderr, "%*sConnecting to '%s' to retrieve '%s'...", 2*openfiles, "", location, loc); if (soap_connect_command(soap, SOAP_GET, location, NULL)) { fprintf(stderr, "\n\nError: failed to retrieve '%s'\n", loc); soap_print_fault(soap, stderr); exit(1); } fprintf(stderr, " connected, receiving...\n"); openfiles++; } else { if (!strncmp(loc, "file://", 7)) loc += 7; soap->recvfd = open(loc, O_RDONLY, 0); if (soap->recvfd < 0) { if (loc && cwd) { size_t l = strlen(cwd) + strlen(relloc); location = (char*)soap_malloc(soap, l + 2); soap_strcpy(location, l + 2, cwd); char *s = strrchr(location, '/'); #ifdef WIN32 if (!s) s = strrchr(location, '\\'); #endif if (s) { *s = '\0'; size_t n = strlen(location); soap_strcpy(location + n, l + 2 - n, "/"); ++n; soap_strcpy(location + n, l + 2 - n, relloc); if (!strncmp(location, "file://", 7)) location += 7; soap->recvfd = open(location, O_RDONLY, 0); if (vflag) std::cerr << "Opening file " << location << (soap->recvfd < 0 ? " failed" : " successful") << std::endl; } } if (soap->recvfd < 0 && import_path) { size_t l = strlen(import_path) + strlen(loc); location = (char*)soap_malloc(soap, l + 2); soap_strcpy(location, l + 2, import_path); size_t n = strlen(location); soap_strcpy(location + n, l + 2 - n, "/"); ++n; soap_strcpy(location + n, l + 2 - n, loc); if (!strncmp(location, "file://", 7)) location += 7; soap->recvfd = open(location, O_RDONLY, 0); if (vflag) std::cerr << "Opening file " << location << (soap->recvfd < 0 ? " failed" : " successful") << std::endl; } if (relloc && soap->recvfd < 0 && import_path) { size_t l = strlen(import_path) + strlen(relloc); location = (char*)soap_malloc(soap, l + 2); soap_strcpy(location, l + 2, import_path); size_t n = strlen(location); soap_strcpy(location + n, l + 2 - n, "/"); ++n; soap_strcpy(location + n, l + 2 - n, relloc); if (!strncmp(location, "file://", 7)) location += 7; soap->recvfd = open(location, O_RDONLY, 0); if (vflag) std::cerr << "Opening file " << location << (soap->recvfd < 0 ? " failed" : " successful") << std::endl; } if (soap->recvfd < 0) { fprintf(stderr, "\nCannot open '%s'\n", loc); exit(1); } } else { location = soap_strdup(soap, loc); } fprintf(stderr, "%*sReading '%s'...\n", 2*openfiles, "", location); openfiles++; } } cwd_temp = cwd_path; cwd_path = location; if (!soap_begin_recv(soap)) this->soap_in(soap, "wsdl:", NULL); if (soap->error) { // handle sloppy WSDLs that import schemas at the top level rather than // importing them in // handle WADL when used in place of WSDL if (soap->error == SOAP_TAG_MISMATCH && soap->level == 0) { soap_retry(soap); xs__schema *schema = soap_new_xs__schema(soap); schema->sourceLocation(location); schema->soap_in(soap, "xs:schema", NULL); if (soap->error == SOAP_TAG_MISMATCH && soap->level == 0) { soap_retry(soap); wadl__application *app = soap_new_wadl__application(soap); app->soap_in(soap, "wadl:application", NULL); if (soap->error) { fprintf(stderr, "\nAn error occurred while parsing WSDL/WADL or XSD from '%s'\n", loc ? loc : "(stdin)"); soap_print_fault(soap, stderr); if (soap->error < 200) soap_print_fault_location(soap, stderr); exit(1); } appRef = app; preprocess(); } else { if (soap->error) { fprintf(stderr, "\nAn error occurred while parsing WSDL/WADL or XSD from '%s'\n", loc ? loc : "(stdin)"); soap_print_fault(soap, stderr); if (soap->error < 200) soap_print_fault_location(soap, stderr); exit(1); } name = NULL; targetNamespace = schema->targetNamespace; if (vflag) std::cerr << "Found schema '" << (targetNamespace ? targetNamespace : "(null)") << "' when expecting WSDL" << std::endl; types = soap_new_wsdl__types(soap); types->documentation = NULL; types->xs__schema_.push_back(schema); types->preprocess(*this); } } // check HTTP redirect (socket was closed) else if ((soap->error >= 301 && soap->error <= 303) || soap->error == 307) { int r = SOAP_ERR; fprintf(stderr, "Redirected to '%s'...\n", soap->endpoint); if (redirs++ < 10) r = read(cwd, soap->endpoint, NULL); else fprintf(stderr, "\nMax redirects exceeded\n"); redirs--; return r; } else if (soap->error == 401) { int r = SOAP_ERR; fprintf(stderr, "Authenticating to '%s' realm '%s'...\n", loc, soap->authrealm); if (auth_userid && auth_passwd && redirs++ < 1) { #ifdef HTTPDA_H struct http_da_info info; http_da_save(soap, &info, soap->authrealm, auth_userid, auth_passwd); #else soap->userid = auth_userid; soap->passwd = auth_passwd; #endif r = read(cwd, loc, NULL); #ifdef HTTPDA_H http_da_release(soap, &info); #endif redirs--; } else { fprintf(stderr, "Authentication failed, use option -r:uid:pwd and (re)build with OpenSSL to enable digest authentication\n"); } return r; } else { fprintf(stderr, "\nAn error occurred while parsing WSDL/WADL and XSD from '%s'\n", loc ? loc : "(stdin)"); soap_print_fault(soap, stderr); if (soap->error < 200) soap_print_fault_location(soap, stderr); exit(1); } } openfiles--; fprintf(stderr, "%*sDone reading '%s'\n", 2*openfiles, "", loc ? loc : "(stdin)"); soap_end_recv(soap); if (soap->recvfd > 2) { close(soap->recvfd); soap->recvfd = -1; } else { soap_closesock(soap); } cwd_path = cwd_temp; return SOAP_OK; } int wsdl__definitions::preprocess() { if (vflag) std::cerr << "Preprocessing wsdl definitions '" << (location ? location : "(null)") << "' namespace '" << (targetNamespace ? targetNamespace : "(null)") << "'" << std::endl; // process WADL app if (appPtr()) appPtr()->preprocess(*this); // process import for (std::vector::iterator im1 = import.begin(); im1 != import.end(); ++im1) (*im1).preprocess(*this); // merge nested imported WSDLs into single import list again: for (std::vector::iterator im2 = import.begin(); im2 != import.end(); ++im2) { if ((*im2).definitionsPtr()) { for (std::vector::iterator i = (*im2).definitionsPtr()->import.begin(); i != (*im2).definitionsPtr()->import.end(); ++i) { if ((*i).definitionsPtr()) { bool found = false; if (vflag) std::cerr << "Import WSDL '" << ((*i).location ? (*i).location : "(null)") << std::endl; for (std::vector::iterator j = import.begin(); j != import.end(); ++j) { if ((*i).definitionsPtr() == (*j).definitionsPtr() || ((*i).location && (*j).location && !strcmp((*i).location, (*j).location))) { found = true; break; } } if (!found) { if (vflag) std::cerr << "Adding imported WSDL '" << ((*i).location ? (*i).location : "(null)") << "' to '" << (location ? location : "(null)") << "' ('" << (name ? name : "(null)") << "') namespace '" << (targetNamespace ? targetNamespace : "(null)") << "'" << std::endl; import.push_back(*i); goto again; } } } } } // merge for (std::vector::iterator im3 = import.begin(); im3 != import.end(); ++im3) { if ((*im3).definitionsPtr() && (*im3).definitionsPtr()->types) { if (!types) { types = soap_new_wsdl__types(soap); types->soap_default(soap); } // merge , check for duplicates, add namespaces for sloppy imports for (std::vector::const_iterator i = (*im3).definitionsPtr()->types->xs__schema_.begin(); i != (*im3).definitionsPtr()->types->xs__schema_.end(); ++i) { bool found = false; std::vector::const_iterator j; if (!(*i)->targetNamespace) { (*i)->targetNamespace = targetNamespace; if (!Wflag) std::cerr << "\nWarning: schema imported without namespace, assigning namespace '" << (targetNamespace ? targetNamespace : "(null)") << "'" << std::endl; } for (j = types->xs__schema_.begin(); j != types->xs__schema_.end(); ++j) { if ((*j)->targetNamespace && !strcmp((*i)->targetNamespace, (*j)->targetNamespace)) { found = true; break; } } // add new schema only if not already in , otherwise merge schema components if (found) { if (vflag) std::cerr << "\nSchemas with identical namespace '" << ((*i)->targetNamespace ? (*i)->targetNamespace : "(null)") << "' merged in WSDL '" << (name ? name : "(null)") << "' namespace '" << (targetNamespace ? targetNamespace : "(null)") << "'" << std::endl; (*j)->insert(*(*i)); } else { if (vflag) std::cerr << "Adding schema with namespace '" << ((*i)->targetNamespace ? (*i)->targetNamespace : "(null)") << "' to types in WSDL '" << (name ? name : "(null)") << "' namespace '" << (targetNamespace ? targetNamespace : "(null)") << "'" << std::endl; types->xs__schema_.push_back(*i); } } // make imported WSDL point to merged (*im3).definitionsPtr()->types = types; } } // process the types if (types) types->preprocess(*this); return SOAP_OK; } int wsdl__definitions::traverse() { if (updated) return SOAP_OK; if (vflag) std::cerr << "Analyzing definitions '" << (name ? name : "(null)") << "' in wsdl namespace '" << (targetNamespace ? targetNamespace : "(null)") << "'" << std::endl; updated = true; if (!targetNamespace) { if (vflag) std::cerr << "\nWarning: wsdl '" << (name ? name : "(null)") << "' has no targetNamespace" << std::endl; targetNamespace = soap_strdup(soap, ""); } // process import first for (std::vector::iterator im = import.begin(); im != import.end(); ++im) (*im).traverse(*this); // then process the types if (types) types->traverse(*this); // process WADL if (appRef) appRef->traverse(*this); // process messages before portType for (std::vector::iterator mg = message.begin(); mg != message.end(); ++mg) (*mg).traverse(*this); // process portType before binding for (std::vector::iterator pt = portType.begin(); pt != portType.end(); ++pt) (*pt).traverse(*this); // process interface before binding WSDL 2.0 for (std::vector::iterator in = interface_.begin(); in != interface_.end(); ++in) (*in).traverse(*this); // process binding for (std::vector::iterator bg = binding.begin(); bg != binding.end(); ++bg) (*bg).traverse(*this); // process service for (std::vector::iterator sv = service.begin(); sv != service.end(); ++sv) (*sv).traverse(*this); if (vflag) std::cerr << "End of definitions '" << (name ? name : "(null)") << "' namespace '" << (targetNamespace ? targetNamespace : "(null)") << "'" << std::endl; for (std::vector::iterator wsp = wsp__Policy_.begin(); wsp != wsp__Policy_.end(); ++wsp) (*wsp).traverse(*this); for (std::vector::iterator plt = plnk__partnerLinkType.begin(); plt != plnk__partnerLinkType.end(); ++plt) (*plt).traverse(*this); for (std::vector::iterator vp = vprop__property.begin(); vp != vprop__property.end(); ++vp) (*vp).traverse(*this); for (std::vector::iterator vpa = vprop__propertyAlias.begin(); vpa != vprop__propertyAlias.end(); ++vpa) (*vpa).traverse(*this); return SOAP_OK; } const char *wsdl__definitions::sourceLocation() { return location; } char *wsdl__definitions::absoluteLocation(const char *loc) const { const char *base = location ? location : cwd_path; if (!base) return soap_strdup(soap, loc); if (!strncmp(loc, "http://", 7) || !strncmp(loc, "https://", 8)) return soap_strdup(soap, loc); if (!strncmp(loc, "file://", 7)) loc += 7; const char *s = strrchr(base, '/'); #ifdef WIN32 const char *t = strrchr(base, '\\'); if (!s || s < t) s = t; if (!s) return soap_strdup(soap, loc); while ((!strncmp(loc, "../", 3) || !strncmp(loc, "..\\", 3)) && s > base) { while (--s >= base) { if (*s == '/' || *s == '\\') { if (s[1] != '.') break; if (s[2] == '.' && (s[3] == '/' || s[3] == '\\')) { s += 3; break; } } } loc += 3; } #else if (!s) return soap_strdup(soap, loc); while (!strncmp(loc, "../", 3) && s > base) { while (--s >= base) { if (*s == '/') { if (s[1] != '.') break; if (s[2] == '.' && s[3] == '/') { s += 3; break; } } } loc += 3; } #endif size_t n = s - base + 1; size_t l = n + strlen(loc); char *abs = (char*)soap_malloc(soap, l + 1); soap_strncpy(abs, l + 1, base, n); soap_strcpy(abs + n, l + 1 - n, loc); return abs; } int wsdl__definitions::error() { return soap->error; } bool wsdl__definitions::is_updated() { return updated; } void wsdl__definitions::print_fault() { soap_print_fault(soap, stderr); if (soap->error < 200) soap_print_fault_location(soap, stderr); } void wsdl__definitions::builtinType(const char *type) { builtinTypeSet.insert(type); } void wsdl__definitions::builtinTypeDerivation(xs__schema& schema, const char *base, const char *derived) { builtinTypeMap[make_qname(schema, derived)] = base; } void wsdl__definitions::builtinTypes(const SetOfString& types) { for (SetOfString::const_iterator tp = types.begin(); tp != types.end(); ++tp) builtinTypeSet.insert(*tp); } void wsdl__definitions::builtinTypeDerivations(const MapOfStringToString& derivations) { for (MapOfStringToString::const_iterator dp = derivations.begin(); dp != derivations.end(); ++dp) builtinTypeMap.insert(*dp); } void wsdl__definitions::builtinElement(const char *element) { builtinElementSet.insert(element); } void wsdl__definitions::builtinElements(const SetOfString& elements) { for (SetOfString::const_iterator el = elements.begin(); el != elements.end(); ++el) builtinElementSet.insert(*el); } void wsdl__definitions::builtinAttribute(const char *attribute) { builtinAttributeSet.insert(attribute); } void wsdl__definitions::builtinAttributes(const SetOfString& attributes) { for (SetOfString::const_iterator at = attributes.begin(); at != attributes.end(); ++at) builtinAttributeSet.insert(*at); } const SetOfString& wsdl__definitions::builtinTypes() const { return builtinTypeSet; } const MapOfStringToString& wsdl__definitions::builtinTypeDerivations() const { return builtinTypeMap; } const SetOfString& wsdl__definitions::builtinElements() const { return builtinElementSet; } const SetOfString& wsdl__definitions::builtinAttributes() const { return builtinAttributeSet; } void wsdl__definitions::appPtr(wadl__application *app) { appRef = app; } wadl__application *wsdl__definitions::appPtr() const { return appRef; } void wsdl__definitions::mark() { if (Oflag > 1 && !used) { used = true; for (std::vector::iterator im = import.begin(); im != import.end(); ++im) (*im).mark(); if (types) types->mark(); if (appRef) appRef->mark(); for (std::vector::iterator pt = interface_.begin(); pt != interface_.end(); ++pt) (*pt).mark(); for (std::vector::iterator mg = message.begin(); mg != message.end(); ++mg) (*mg).mark(); for (std::vector::iterator bg = binding.begin(); bg != binding.end(); ++bg) (*bg).mark(); } } int wsdl__service::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << "Analyzing service '" << (name ? name : "(null)") << "' in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; // process ports for (std::vector::iterator pt = port.begin(); pt != port.end(); ++pt) (*pt).traverse(definitions); for (std::vector::iterator ep = endpoint.begin(); ep != endpoint.end(); ++ep) (*ep).traverse(definitions); for (std::vector::iterator py = wsp__Policy_.begin(); py != wsp__Policy_.end(); ++py) (*py).traverse(definitions); for (std::vector::iterator pr = wsp__PolicyReference_.begin(); pr != wsp__PolicyReference_.end(); ++pr) (*pr).traverse(definitions); return SOAP_OK; } wsdl__port::wsdl__port() { bindingRef = NULL; } int wsdl__port::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing service port/endpoint in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; // search binding name const char *token = qname_token(binding, definitions.targetNamespace); bindingRef = NULL; if (token) { for (std::vector::iterator binding = definitions.binding.begin(); binding != definitions.binding.end(); ++binding) { if ((*binding).name && !strcmp((*binding).name, token)) { bindingRef = &(*binding); if (vflag) std::cerr << " Found port/endpoint '" << (name ? name : "(null)") << "' binding '" << (token ? token : "(null)") << "'" << std::endl; break; } } } if (!bindingRef) { for (std::vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(binding, importdefinitions->targetNamespace); if (token) { for (std::vector::iterator binding = importdefinitions->binding.begin(); binding != importdefinitions->binding.end(); ++binding) { if ((*binding).name && !strcmp((*binding).name, token)) { bindingRef = &(*binding); if (vflag) std::cerr << " Found port/endpoint '" << (name ? name : "(null)") << "' binding '" << (token ? token : "(null)") << "'" << std::endl; break; } } } } } } if (!bindingRef) if (!Wflag) std::cerr << "\nWarning: no port/endpoint '" << (name ? name : "(null)") << "' binding '" << (binding ? binding : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } void wsdl__port::bindingPtr(wsdl__binding *binding) { bindingRef = binding; if (!bindingRef && vflag) std::cerr << "\nWarning: wsdl__port binding set to NULL" << std::endl; } wsdl__binding *wsdl__port::bindingPtr() const { return bindingRef; } wsdl__binding::wsdl__binding() { portTypeRef = NULL; } int wsdl__binding::traverse(wsdl__definitions& definitions) { const char *token; if (vflag) std::cerr << " Analyzing binding '" << (name ? name : "(null)") << "' in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; portTypeRef = NULL; if (interface_) // WSDL 2.0 token = qname_token(interface_, definitions.targetNamespace); else token = qname_token(type, definitions.targetNamespace); if (token) { for (std::vector::iterator portType = definitions.portType.begin(); portType != definitions.portType.end(); ++portType) { if ((*portType).name && !strcmp((*portType).name, token)) { portTypeRef = &(*portType); if (vflag) std::cerr << " Found binding '" << (name ? name : "(null)") << "' portType '" << (token ? token : "(null)") << "'" << std::endl; break; } } // WSDL 2.0 for (std::vector::iterator i = definitions.interface_.begin(); i != definitions.interface_.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { portTypeRef = &(*i); if (vflag) std::cerr << " Found binding '" << (name ? name : "(null)") << "' interface '" << (token ? token : "(null)") << "'" << std::endl; break; } } } if (!portTypeRef) { for (std::vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { if (interface_) // WSDL 2.0 token = qname_token(interface_, importdefinitions->targetNamespace); else token = qname_token(type, importdefinitions->targetNamespace); if (token) { for (std::vector::iterator portType = importdefinitions->portType.begin(); portType != importdefinitions->portType.end(); ++portType) { if ((*portType).name && !strcmp((*portType).name, token)) { portTypeRef = &(*portType); if (vflag) std::cerr << " Found binding '" << (name ? name : "(null)") << "' portType '" << (token ? token : "(null)") << "'" << std::endl; break; } } // WSDL 2.0 for (std::vector::iterator i = importdefinitions->interface_.begin(); i != importdefinitions->interface_.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { portTypeRef = &(*i); if (vflag) std::cerr << " Found binding '" << (name ? name : "(null)") << "' interface '" << (token ? token : "(null)") << "'" << std::endl; break; } } } } } } if (!portTypeRef) { if (!Wflag) { if (interface_) std::cerr << "\nWarning: no binding '" << (name ? name : "(null)") << "' interface '" << (interface_ ? interface_ : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; else std::cerr << "\nWarning: no binding '" << (name ? name : "(null)") << "' portType '" << (type ? type : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; } } // WSDL 2.0 for (std::vector::iterator f = fault.begin(); f != fault.end(); ++f) (*f).traverse(definitions, portTypeRef); for (std::vector::iterator i = operation.begin(); i != operation.end(); ++i) (*i).traverse(definitions, portTypeRef); for (std::vector::iterator p = wsp__Policy_.begin(); p != wsp__Policy_.end(); ++p) (*p).traverse(definitions); for (std::vector::iterator r = wsp__PolicyReference_.begin(); r != wsp__PolicyReference_.end(); ++r) (*r).traverse(definitions); return SOAP_OK; } void wsdl__binding::portTypePtr(wsdl__portType *portType) { portTypeRef = portType; if (!portTypeRef && vflag) std::cerr << "\nWarning: wsdl__binding portType set to NULL" << std::endl; } wsdl__portType *wsdl__binding::portTypePtr() const { return portTypeRef; } void wsdl__binding::mark() { if (Oflag > 1) for (std::vector::iterator i = operation.begin(); i != operation.end(); ++i) (*i).mark(); } wsdl__ext_operation::wsdl__ext_operation() { operationRef = NULL; } int wsdl__ext_operation::traverse(wsdl__definitions& definitions, wsdl__portType *portTypeRef) { if (vflag) std::cerr << " Analyzing binding operation '" << (name ? name : ref ? ref : "(null)") << "' in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; if (input) input->traverse(definitions); if (output) output->traverse(definitions); for (std::vector::iterator f = fault.begin(); f != fault.end(); ++f) (*f).traverse(definitions, portTypeRef); // WSDL 2.0 for (std::vector::iterator fi = infault.begin(); fi != infault.end(); ++fi) (*fi).traverse(definitions, portTypeRef); for (std::vector::iterator fo = outfault.begin(); fo != outfault.end(); ++fo) (*fo).traverse(definitions, portTypeRef); operationRef = NULL; if (portTypeRef) { // WSDL 2.0, assumption: ref refers to an operation in the interface for this binding const char *token = NULL; if (ref) token = qname_token(ref, portTypeRef->definitionsPtr()->targetNamespace); for (std::vector::iterator i = portTypeRef->operation.begin(); i != portTypeRef->operation.end(); ++i) { if (token) { if ((*i).name && !strcmp((*i).name, token)) { operationRef = &(*i); if (vflag) std::cerr << " Found operation '" << token << "' in interface '" << portTypeRef->name << "'" << std::endl; break; } } else if (name && (*i).name && !strcmp((*i).name, name)) { if ((!input || !input->name || ((*i).__union1 == SOAP_UNION_wsdl__union_ioput_input && (*i).__ioput1.input->name && !strcmp((*i).__ioput1.input->name, input->name)) || ((*i).__union2 == SOAP_UNION_wsdl__union_ioput_input && (*i).__ioput2.input->name && !strcmp((*i).__ioput2.input->name, input->name)) ) && (!output || !output->name || ((*i).__union1 == SOAP_UNION_wsdl__union_ioput_output && (*i).__ioput1.output->name && !strcmp((*i).__ioput1.output->name, output->name)) || ((*i).__union2 == SOAP_UNION_wsdl__union_ioput_output && (*i).__ioput2.output->name && !strcmp((*i).__ioput2.output->name, output->name)) )) { operationRef = &(*i); if (vflag) std::cerr << " Found operation '" << name << "' in portType '" << portTypeRef->name << "'" << std::endl; break; } } } if (name && !operationRef) { for (std::vector::iterator j = portTypeRef->operation.begin(); j != portTypeRef->operation.end(); ++j) { if ((*j).name && !strcmp((*j).name, name)) { if (input && input->name && (((*j).__union1 == SOAP_UNION_wsdl__union_ioput_input && (*j).__ioput1.input->name && !strcmp((*j).__ioput1.input->name, input->name)) || ((*j).__union2 == SOAP_UNION_wsdl__union_ioput_input && (*j).__ioput2.input->name && !strcmp((*j).__ioput2.input->name, input->name)) )) std::cerr << "\nWarning: no matching portType operation input name '" << input->name << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; if (output && output->name && (((*j).__union1 == SOAP_UNION_wsdl__union_ioput_output && (*j).__ioput1.output->name && !strcmp((*j).__ioput1.output->name, output->name)) || ((*j).__union2 == SOAP_UNION_wsdl__union_ioput_output && (*j).__ioput2.output->name && !strcmp((*j).__ioput2.output->name, output->name)) )) std::cerr << "\nWarning: no matching portType operation output name '" << output->name << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; operationRef = &(*j); if (vflag) std::cerr << " Found operation '" << name << "'" << std::endl; break; } } } } if (!operationRef) { if (!Wflag) { if (ref) std::cerr << "\nWarning: no matching interface operation '" << (ref ? ref : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; else std::cerr << "\nWarning: no matching portType operation '" << (name ? name : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; } } else { for (std::vector::iterator i = fault.begin(); i != fault.end(); ++i) { if ((*i).name) { for (std::vector::iterator j = operationRef->fault.begin(); j != operationRef->fault.end(); ++j) { if ((*j).name && !strcmp((*j).name, (*i).name)) { (*i).faultPtr(&(*j)); if (vflag) std::cerr << " Found fault '" << (*j).name << "' message" << std::endl; break; } } } else if ((*i).soap__fault_ && (*i).soap__fault_->name) // try the soap:fault name, this is not elegant, but neither is WSDL 1.1 { for (std::vector::iterator j = operationRef->fault.begin(); j != operationRef->fault.end(); ++j) { if ((*j).name && !strcmp((*j).name, (*i).soap__fault_->name)) { (*i).faultPtr(&(*j)); if (vflag) std::cerr << " Found fault '" << ((*j).name ? (*j).name : "(null)") << "' message" << std::endl; break; } } } if (!(*i).faultPtr()) if (!Wflag) std::cerr << "\nWarning: no soap:fault '" << ((*i).name ? (*i).name : "(null)") << "' message in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' operation '" << (name ? name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; } } if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } void wsdl__ext_operation::operationPtr(wsdl__operation *operation) { operationRef = operation; if (!operationRef && vflag) std::cerr << "\nWarning: wsdl__ext_operation operation set to NULL" << std::endl; } wsdl__operation *wsdl__ext_operation::operationPtr() const { return operationRef; } void wsdl__ext_operation::mark() { if (Oflag > 1) { if (input) input->mark(); if (output) output->mark(); } } int wsdl__ext_ioput::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing binding operation input/output in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; for (std::vector::iterator hd = soap__header_.begin(); hd != soap__header_.end(); ++hd) (*hd).traverse(definitions); for (std::vector::iterator whd = wsoap__header_.begin(); whd != wsoap__header_.end(); ++whd) (*whd).traverse(definitions); if (mime__multipartRelated_) mime__multipartRelated_->traverse(definitions); if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } void wsdl__ext_ioput::mark() { if (Oflag > 1) for (std::vector::iterator sh = wsoap__header_.begin(); sh != wsoap__header_.end(); ++sh) (*sh).mark(); } wsdl__ext_fault::wsdl__ext_fault() { faultRef = NULL; } int wsdl__ext_fault::traverse(wsdl__definitions& definitions, wsdl__portType *portTypeRef) { if (vflag) std::cerr << " Analyzing binding operation fault in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; if (ref && portTypeRef) { // WSDL 2.0, assumption: ref refers to a fault in the interface for this binding const char *token = qname_token(ref, portTypeRef->definitionsPtr()->targetNamespace); if (token) { for (std::vector::iterator fault = portTypeRef->fault.begin(); fault != portTypeRef->fault.end(); ++fault) { if ((*fault).name && !strcmp((*fault).name, token)) { faultRef = &(*fault); if (vflag) std::cerr << " Found fault '" << (*fault).name << std::endl; break; } } } if (!faultRef) if (!Wflag) std::cerr << "\nWarning: no fault '" << (ref ? ref : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' interface '" << (portTypeRef->name ? portTypeRef->name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; } if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } void wsdl__ext_fault::faultPtr(wsdl__fault *fault) { faultRef = fault; if (!faultRef && vflag) std::cerr << "\nWarning: wsdl__ext_fault fault ref set to NULL" << std::endl; } wsdl__fault *wsdl__ext_fault::faultPtr() const { return faultRef; } wsdl__portType::wsdl__portType() { definitionsRef = NULL; } int wsdl__portType::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing portType/interface '" << (name ? name : "(null)") << "' in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; definitionsRef = &definitions; // traverse faults before operations, WSDL 2.0 for (std::vector::iterator f = fault.begin(); f != fault.end(); ++f) (*f).traverse(definitions); for (std::vector::iterator i = operation.begin(); i != operation.end(); ++i) (*i).traverse(definitions); if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } void wsdl__portType::definitionsPtr(wsdl__definitions *definitions) { definitionsRef = definitions; } wsdl__definitions *wsdl__portType::definitionsPtr() const { return definitionsRef; } void wsdl__portType::mark() { if (Oflag > 1) { for (std::vector::iterator ft = fault.begin(); ft != fault.end(); ++ft) (*ft).mark(); for (std::vector::iterator op = operation.begin(); op != operation.end(); ++op) (*op).mark(); } } int wsdl__operation::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing portType/interface operation '" << (name ? name : "(null)") << "' in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; if (__union1 == SOAP_UNION_wsdl__union_ioput_input) if (__ioput1.input) __ioput1.input->traverse(definitions); if (__union1 == SOAP_UNION_wsdl__union_ioput_output) if (__ioput1.output) __ioput1.output->traverse(definitions); if (__union2 == SOAP_UNION_wsdl__union_ioput_input) if (__ioput2.input) __ioput2.input->traverse(definitions); if (__union2 == SOAP_UNION_wsdl__union_ioput_output) if (__ioput2.output) __ioput2.output->traverse(definitions); for (std::vector::iterator i = fault.begin(); i != fault.end(); ++i) (*i).traverse(definitions); // WSDL 2.0 for (std::vector::iterator fi = infault.begin(); fi != infault.end(); ++fi) (*fi).traverse(definitions); for (std::vector::iterator fo = outfault.begin(); fo != outfault.end(); ++fo) (*fo).traverse(definitions); if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } void wsdl__operation::mark() { if (Oflag > 1) { if (__union1 == SOAP_UNION_wsdl__union_ioput_input) if (__ioput1.input) __ioput1.input->mark(); if (__union1 == SOAP_UNION_wsdl__union_ioput_output) if (__ioput1.output) __ioput1.output->mark(); if (__union2 == SOAP_UNION_wsdl__union_ioput_input) if (__ioput2.input) __ioput2.input->mark(); if (__union2 == SOAP_UNION_wsdl__union_ioput_output) if (__ioput2.output) __ioput2.output->mark(); for (std::vector::iterator i = fault.begin(); i != fault.end(); ++i) (*i).mark(); for (std::vector::iterator fi = infault.begin(); fi != infault.end(); ++fi) (*fi).mark(); for (std::vector::iterator fo = outfault.begin(); fo != outfault.end(); ++fo) (*fo).mark(); } } wsdl__ioput::wsdl__ioput() { messageRef = NULL; elementRef = NULL; } int wsdl__ioput::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing portType/interface operation input/output in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; messageRef = NULL; elementRef = NULL; // WSDL 2.0 if (element) { if (definitions.types) { for (std::vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(element, (*schema)->targetNamespace); if (token) { for (std::vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if ((*element).name && !strcmp((*element).name, token)) { elementRef = &(*element); if (vflag) std::cerr << " Found input/output '" << (messageLabel ? messageLabel : "(null)") << "' element '" << (token ? token : "(null)") << "'" << std::endl; break; } } } } } if (*element != '#' && !elementRef) { if (is_builtin_qname(element)) definitions.builtinElement(element); else if (!Wflag) std::cerr << "\nWarning: no input/output '" << (messageLabel ? messageLabel : "(null)") << "' element '" << element << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; } } else { const char *token = qname_token(message, definitions.targetNamespace); if (token) { for (std::vector::iterator message = definitions.message.begin(); message != definitions.message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) std::cerr << " Found input/output '" << (name ? name : "(null)") << "' message '" << (token ? token : "(null)") << "'" << std::endl; break; } } } if (!messageRef) { for (std::vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(message, importdefinitions->targetNamespace); if (token) { for (std::vector::iterator message = importdefinitions->message.begin(); message != importdefinitions->message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) std::cerr << " Found input/output '" << (name ? name : "(null)") << "' message '" << (token ? token : "(null)") << "'" << std::endl; break; } } } } } } if (!messageRef) if (!Wflag) std::cerr << "\nWarning: no input/output '" << (name ? name : "(null)") << "' message '" << (message ? message : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; } if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } void wsdl__ioput::messagePtr(wsdl__message *message) { messageRef = message; } wsdl__message *wsdl__ioput::messagePtr() const { return messageRef; } void wsdl__ioput::elementPtr(xs__element *element) { elementRef = element; } xs__element *wsdl__ioput::elementPtr() const { return elementRef; } void wsdl__ioput::mark() { if (Oflag > 1) if (elementPtr()) elementPtr()->mark(); } wsdl__fault::wsdl__fault() { messageRef = NULL; elementRef = NULL; } int wsdl__fault::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing portType/interface operation faults in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; messageRef = NULL; elementRef = NULL; // WSDL 2.0 if (ref) { const char *token = qname_token(ref, definitions.targetNamespace); if (token) { for (std::vector::iterator i = definitions.interface_.begin(); i != definitions.interface_.end(); ++i) { for (std::vector::iterator fault = (*i).fault.begin(); fault != (*i).fault.end(); ++fault) { if ((*fault).name && !strcmp((*fault).name, token)) { elementRef = (*fault).elementPtr(); if (vflag) std::cerr << " Found fault '" << (ref ? ref : "(null)") << "' element '" << (token ? token : "(null)") << "'" << std::endl; break; } } } } if (!elementRef) { for (std::vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(message, importdefinitions->targetNamespace); if (token) { for (std::vector::iterator i = importdefinitions->interface_.begin(); i != importdefinitions->interface_.end(); ++i) { for (std::vector::iterator fault = (*i).fault.begin(); fault != (*i).fault.end(); ++fault) { if ((*fault).name && !strcmp((*fault).name, token)) { elementRef = (*fault).elementPtr(); if (vflag) std::cerr << " Found fault '" << (ref ? ref : "(null)") << "' element '" << (token ? token : "(null)") << "'" << std::endl; break; } } } } } } } if (!elementRef) { if (is_builtin_qname(element)) definitions.builtinElement(element); else if (!Wflag) std::cerr << "\nWarning: no fault '" << (messageLabel ? messageLabel : "(null)") << "' ref '" << ref << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; } } else if (element) { if (definitions.types) { for (std::vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(element, (*schema)->targetNamespace); if (token) { for (std::vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if ((*element).name && !strcmp((*element).name, token)) { elementRef = &(*element); if (vflag) std::cerr << " Found fault '" << (messageLabel ? messageLabel : "(null)") << "' element '" << (token ? token : "(null)") << "'" << std::endl; break; } } } } } if (!elementRef) { if (is_builtin_qname(element)) definitions.builtinElement(element); else if (!Wflag) std::cerr << "\nWarning: no fault '" << (messageLabel ? messageLabel : "(null)") << "' element '" << element << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; } } else { const char *token = qname_token(message, definitions.targetNamespace); if (token) { for (std::vector::iterator message = definitions.message.begin(); message != definitions.message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) std::cerr << " Found operation fault '" << (name ? name : "(null)") << "' message '" << (token ? token : "(null)") << "'" << std::endl; break; } } } if (!messageRef) { for (std::vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(message, importdefinitions->targetNamespace); if (token) { for (std::vector::iterator message = importdefinitions->message.begin(); message != importdefinitions->message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) std::cerr << " Found operation fault '" << (name ? name : "(null)") << "' message '" << (token ? token : "(null)") << "'" << std::endl; break; } } } } } } if (!messageRef) if (!Wflag) std::cerr << "\nWarning: no operation fault '" << (name ? name : "(null)") << "' message '" << (message ? message : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; } if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } void wsdl__fault::messagePtr(wsdl__message *message) { messageRef = message; } wsdl__message *wsdl__fault::messagePtr() const { return messageRef; } void wsdl__fault::elementPtr(xs__element *element) { elementRef = element; } xs__element *wsdl__fault::elementPtr() const { return elementRef; } void wsdl__fault::mark() { if (Oflag > 1) if (elementPtr()) elementPtr()->mark(); } int wsdl__message::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing message '" << (name ? name : "(null)") << "' in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; for (std::vector::iterator i = part.begin(); i != part.end(); ++i) (*i).traverse(definitions); for (std::vector::iterator p = wsp__Policy_.begin(); p != wsp__Policy_.end(); ++p) (*p).traverse(definitions); for (std::vector::iterator r = wsp__PolicyReference_.begin(); r != wsp__PolicyReference_.end(); ++r) (*r).traverse(definitions); return SOAP_OK; } void wsdl__message::mark() { if (Oflag > 1) for (std::vector::iterator i = part.begin(); i != part.end(); ++i) (*i).mark(); } wsdl__part::wsdl__part() { elementRef = NULL; simpleTypeRef = NULL; complexTypeRef = NULL; optional = false; repeating = false; fixed = false; default_ = NULL; } int wsdl__part::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing message parts in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; elementRef = NULL; simpleTypeRef = NULL; complexTypeRef = NULL; if (definitions.types) { for (std::vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(element, (*schema)->targetNamespace); if (token) { for (std::vector::iterator el = (*schema)->element.begin(); el != (*schema)->element.end(); ++el) { if ((*el).name && !strcmp((*el).name, token)) { elementRef = &(*el); if (vflag) std::cerr << " Found message part '" << (name ? name : "(null)") << "' element '" << (token ? token : "(null)") << "'" << std::endl; break; } } } token = qname_token(type, (*schema)->targetNamespace); if (token) { for (std::vector::iterator st = (*schema)->simpleType.begin(); st != (*schema)->simpleType.end(); ++st) { if ((*st).name && !strcmp((*st).name, token)) { simpleTypeRef = &(*st); if (vflag) std::cerr << " Found message part '" << (name ? name : "(null)") << "' simpleType '" << (token ? token : "(null)") << "'" << std::endl; break; } } } token = qname_token(type, (*schema)->targetNamespace); if (token) { for (std::vector::iterator ct = (*schema)->complexType.begin(); ct != (*schema)->complexType.end(); ++ct) { if ((*ct).name && !strcmp((*ct).name, token)) { complexTypeRef = &(*ct); if (vflag) std::cerr << " Found message part '" << (name ? name : "(null)") << "' complexType '" << (token ? token : "(null)") << "'" << std::endl; break; } } } } } if (!elementRef && !simpleTypeRef && !complexTypeRef) { if (element) { if (is_builtin_qname(element)) definitions.builtinElement(element); else if (!Wflag) std::cerr << "\nWarning: no message part '" << (name ? name : "(null)") << "' element '" << element << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; } else if (type) { if (is_builtin_qname(type)) definitions.builtinType(type); else if (!Wflag) std::cerr << "\nWarning: no message part '" << (name ? name : "(null)") << "' type '" << type << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; } else if (!Wflag) std::cerr << "\nWarning: no message part '" << (name ? name : "(null)") << "' element or type in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; } return SOAP_OK; } void wsdl__part::elementPtr(xs__element *element) { elementRef = element; if (!elementRef && vflag) std::cerr << "\nWarning: wsdl__part element set to NULL" << std::endl; } void wsdl__part::simpleTypePtr(xs__simpleType *simpleType) { simpleTypeRef = simpleType; if (!simpleTypeRef && vflag) std::cerr << "\nWarning: wsdl__part simpleType set to NULL" << std::endl; } void wsdl__part::complexTypePtr(xs__complexType *complexType) { complexTypeRef = complexType; if (!complexTypeRef && vflag) std::cerr << "\nWarning: wsdl__part complexType set to NULL" << std::endl; } xs__element *wsdl__part::elementPtr() const { return elementRef; } xs__simpleType *wsdl__part::simpleTypePtr() const { return simpleTypeRef; } xs__complexType *wsdl__part::complexTypePtr() const { return complexTypeRef; } void wsdl__part::set_optional(bool b) { optional = b; } void wsdl__part::set_fixed(bool b) { fixed = b; } void wsdl__part::set_repeating(bool b) { repeating = b; } void wsdl__part::set_default(char* s) { default_ = s; } void wsdl__part::set_option(char* s) { if (s) option.push_back(s); } bool wsdl__part::is_optional() const { return optional; } bool wsdl__part::is_fixed() const { return fixed; } bool wsdl__part::is_repeating() const { return repeating; } const char *wsdl__part::get_default() const { return default_; } const std::vector& wsdl__part::options() const { return option; } void wsdl__part::mark() { if (Oflag > 1) { if (elementPtr()) elementPtr()->mark(); if (simpleTypePtr()) simpleTypePtr()->mark(); if (complexTypePtr()) complexTypePtr()->mark(); } } int wsdl__types::preprocess(wsdl__definitions& definitions) { if (vflag) std::cerr << "Preprocessing wsdl types" << std::endl; if (xs__schema_.empty()) // WSDL 2.0 w/o { targetNamespace = definitions.targetNamespace; sourceLocation(definitions.sourceLocation()); xs__schema_.push_back(this); } for (std::vector::iterator schema = xs__schema_.begin(); schema != xs__schema_.end(); ++schema) (*schema)->sourceLocation(definitions.sourceLocation()); again: // link imported schemas, need to repeat when is extended with new imported schema (from inside another schema, etc.) for (std::vector::iterator schema1 = xs__schema_.begin(); schema1 != xs__schema_.end(); ++schema1) { for (std::vector::iterator import = (*schema1)->import.begin(); import != (*schema1)->import.end(); ++import) { if ((*import).namespace_ && !(*import).schemaPtr()) { for (std::vector::const_iterator schema2 = xs__schema_.begin(); schema2 != xs__schema_.end(); ++schema2) { if (schema2 != schema1 && (*schema2)->targetNamespace && !strcmp((*import).namespace_, (*schema2)->targetNamespace)) { (*import).schemaPtr(*schema2); break; } } } } } // if a schema is imported but not in then get it for (std::vector::iterator schema2 = xs__schema_.begin(); schema2 != xs__schema_.end(); ++schema2) { for (std::vector::iterator import = (*schema2)->import.begin(); import != (*schema2)->import.end(); ++import) { bool found = false; if (vflag) std::cerr << "Preprocessing schema '" << (*schema2)->targetNamespace << "' import '" << ((*import).namespace_ ? (*import).namespace_ : "(null)") << "'" << std::endl; if (!found && (*import).namespace_) { for (SetOfString::const_iterator i = exturis.begin(); i != exturis.end(); ++i) { if (!soap_tag_cmp((*import).namespace_, *i)) { found = true; break; } } } if (!found && !iflag) // don't import any of the schemas in the .nsmap table (or when -i option is used) { xs__schema *importschema = (*import).schemaPtr(); if (importschema) { #if 0 // no longer applicable as imports are preprocessed if (!importschema) { const char *s = (*import).schemaLocation; if (!s && (*import).location) { s = (*import).schemaLocation = (*import).location; // work around for Microsoft bugs std::cerr << "Schema import with namespace '" << ((*import).namespace_ ? (*import).namespace_ : "(null)") << "' has a 'location' attribute specified but a 'schemaLocation' attribute must be used, please inform the author of this WSDL to correct this problem" << std::endl; } else if (!s) { s = (*import).namespace_; } if (!s) continue; importschema = new xs__schema(definitions.soap, (*schema2)->sourceLocation(), (*schema2)->absoluteLocation(s)); if (!(*import).namespace_) { if (importschema->targetNamespace) (*import).namespace_ = importschema->targetNamespace; else (*import).namespace_ = soap_strdup(definitions.soap, ""); } if (!importschema->targetNamespace || !*importschema->targetNamespace) importschema->targetNamespace = (*import).namespace_; else if ((*import).namespace_ && strcmp(importschema->targetNamespace, (*import).namespace_)) std::cerr << "Schema import namespace '" << ((*import).namespace_ ? (*import).namespace_ : "(null)") << "' does not correspond to imported namespace '" << importschema->targetNamespace << "'" << std::endl; for (std::vector::const_iterator schema3 = xs__schema_.begin(); schema3 != xs__schema_.end(); ++schema3) { if ((*schema3)->targetNamespace && !strcmp((*import).namespace_, (*schema3)->targetNamespace)) { (*import).schemaPtr(*schema3); if ((*schema3) == this || // WSDL 2.0 has no FormDefaults (*schema3)->empty()) // schema w/o components, only imports { (*schema3)->elementFormDefault = importschema->elementFormDefault; (*schema3)->attributeFormDefault = importschema->attributeFormDefault; } (*schema3)->insert(*importschema); // merge content goto again; } } } #endif if (!found) { for (std::vector::const_iterator schema3 = xs__schema_.begin(); schema3 != xs__schema_.end(); ++schema3) { if (*schema3 == importschema) { found = true; } else if ((*schema3)->targetNamespace && (*import).namespace_ && !strcmp((*import).namespace_, (*schema3)->targetNamespace)) { (*import).schemaPtr(*schema3); if ((*schema3) == this || // WSDL 2.0 has no FormDefaults (*schema3)->empty()) // schema w/o components, only imports { (*schema3)->elementFormDefault = importschema->elementFormDefault; (*schema3)->attributeFormDefault = importschema->attributeFormDefault; } (*schema3)->insert(*importschema); // merge content goto again; } } } if (!found) { xs__schema_.push_back(importschema); if (vflag) std::cerr << "Adding schema '" << importschema->targetNamespace << "'" << std::endl; goto again; } } else if (!Wflag) { fprintf(stderr, "\nWarning: no schemaLocation in to load schema: unknown schema\n", (*import).namespace_ ? (*import).namespace_ : "(null)"); } } } } if (vflag) { for (std::vector::iterator schema4 = xs__schema_.begin(); schema4 != xs__schema_.end(); ++schema4) { std::cerr << std::endl << "Schema " << ((*schema4)->targetNamespace ? (*schema4)->targetNamespace : "") << " " << ((*schema4)->sourceLocation() ? (*schema4)->sourceLocation() : "") << std::endl; for (std::vector::iterator im = (*schema4)->import.begin(); im != (*schema4)->import.end(); ++im) std::cerr << " import " << ((*im).namespace_ ? (*im).namespace_ : "") << " " << ((*im).schemaLocation ? (*im).schemaLocation : "") << std::endl; for (std::vector::iterator st = (*schema4)->simpleType.begin(); st != (*schema4)->simpleType.end(); ++st) std::cerr << " simpleType " << ((*st).name ? (*st).name : "") << std::endl; for (std::vector::iterator ct = (*schema4)->complexType.begin(); ct != (*schema4)->complexType.end(); ++ct) std::cerr << " complexType " << ((*ct).name ? (*ct).name : "") << std::endl; for (std::vector::iterator el = (*schema4)->element.begin(); el != (*schema4)->element.end(); ++el) std::cerr << " element " << ((*el).name ? (*el).name : "") << std::endl; for (std::vector::iterator at = (*schema4)->attribute.begin(); at != (*schema4)->attribute.end(); ++at) std::cerr << " attribute " << ((*at).name ? (*at).name : "") << std::endl; } } return SOAP_OK; } int wsdl__types::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing types in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; for (std::vector::iterator schema3 = xs__schema_.begin(); schema3 != xs__schema_.end(); ++schema3) { // artificially extend the of each schema to include others so when we traverse schemas we can resolve references for (std::vector::iterator importschema = xs__schema_.begin(); importschema != xs__schema_.end(); ++importschema) { if (schema3 != importschema && (*importschema)->targetNamespace) { xs__import *import = soap_new_xs__import(definitions.soap); import->namespace_ = (*importschema)->targetNamespace; import->schemaPtr(*importschema); (*schema3)->import.push_back(*import); } } // check and report for (std::vector::iterator import = (*schema3)->import.begin(); import != (*schema3)->import.end(); ++import) { if ((*import).namespace_) { bool found = false; for (std::vector::const_iterator importschema = xs__schema_.begin(); importschema != xs__schema_.end(); ++importschema) { if ((*importschema)->targetNamespace && !strcmp((*import).namespace_, (*importschema)->targetNamespace)) { found = true; break; } } if (!found && vflag) std::cerr << "Schema import namespace '" << (*import).namespace_ << "' refers to an unknown Schema" << std::endl; } else if (!Wflag) std::cerr << "\nWarning: schema import '" << ((*import).schemaLocation ? (*import).schemaLocation : "") << "' has no namespace" << std::endl; } } // traverse the schemas for (std::vector::iterator schema4 = xs__schema_.begin(); schema4 != xs__schema_.end(); ++schema4) (*schema4)->traverse(); // find all built-in types, elements, and attributes for (std::vector::iterator schema5 = xs__schema_.begin(); schema5 != xs__schema_.end(); ++schema5) { if (vflag) for (SetOfString::const_iterator i = (*schema5)->builtinTypes().begin(); i != (*schema5)->builtinTypes().end(); ++i) std::cerr << " Built-in schema type '" << (*i) << "'" << std::endl; definitions.builtinTypes((*schema5)->builtinTypes()); definitions.builtinTypeDerivations((*schema5)->builtinTypeDerivations()); definitions.builtinElements((*schema5)->builtinElements()); definitions.builtinAttributes((*schema5)->builtinAttributes()); } return SOAP_OK; } void wsdl__types::mark() { if (Oflag > 1) { xs__schema::mark(); for (std::vector::iterator schema = xs__schema_.begin(); schema != xs__schema_.end(); ++schema) (*schema)->mark(); } } int wsdl__import::preprocess(wsdl__definitions& definitions) { static std::map included; bool found = false; const char *relative_location = soap_strdup(definitions.soap, location); location = definitions.absoluteLocation(location); if (vflag) std::cerr << "Preprocess wsdl import '" << (location ? location : "(null)") << "'" << std::endl; definitionsRef = NULL; if (namespace_) { for (SetOfString::const_iterator i = exturis.begin(); i != exturis.end(); ++i) { if (!soap_tag_cmp(namespace_, *i)) { found = true; break; } } } if (!found && location) { std::map::iterator i = included.find(location); if (i != included.end()) { if (vflag) fprintf(stderr, "\nWSDL/XSD '%s' already imported\n", location); found = true; definitionsRef = (*i).second; } } if (!found && location) { // parse imported definitions const char *source = definitions.sourceLocation(); if (vflag) std::cerr << "Importing '" << location << "' into '" << (source ? source : "(source location not set)") << "'" << std::endl; definitionsRef = new wsdl__definitions(definitions.soap); if (!definitionsRef) return SOAP_EOF; included[location] = definitionsRef; definitionsRef->read(source, location, relative_location); if (!namespace_) namespace_ = definitionsRef->targetNamespace; else if (!definitionsRef->targetNamespace || !*definitionsRef->targetNamespace) definitionsRef->targetNamespace = namespace_; else if (strcmp(namespace_, definitionsRef->targetNamespace)) std::cerr << "Error: wsdl definitions/import '" << location << "' namespace '" << namespace_ << "' does not match imported targetNamespace '" << definitionsRef->targetNamespace << "'" << std::endl; } else if (!location) std::cerr << "\nWarning: wsdl definitions/import has no location attribute" << std::endl; return SOAP_OK; } int wsdl__import::traverse(wsdl__definitions& definitions) { if (definitionsRef) { if (vflag) std::cerr << " Analyzing imported wsdl namespace '" << (namespace_ ? namespace_ : "(null)") << "' in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; if (!definitionsRef->targetNamespace) { if (namespace_) definitionsRef->targetNamespace = namespace_; else definitionsRef->targetNamespace = definitions.targetNamespace; } definitionsRef->traverse(); // collect imported artifacts into parent collections definitions.builtinTypes(definitionsRef->builtinTypes()); definitions.builtinTypeDerivations(definitionsRef->builtinTypeDerivations()); definitions.builtinElements(definitionsRef->builtinElements()); definitions.builtinAttributes(definitionsRef->builtinAttributes()); } return SOAP_OK; } void wsdl__import::definitionsPtr(wsdl__definitions *definitions) { definitionsRef = definitions; if (!definitionsRef && vflag) std::cerr << "\nWarning: wsdl__import definitions set to NULL" << std::endl; } wsdl__definitions *wsdl__import::definitionsPtr() const { return definitionsRef; } wsdl__import::wsdl__import() { definitionsRef = NULL; } void wsdl__import::mark() { if (Oflag > 1) { if (definitionsRef) definitionsRef->mark(); } } //////////////////////////////////////////////////////////////////////////////// // // streams // //////////////////////////////////////////////////////////////////////////////// std::ostream &operator<<(std::ostream &o, const wsdl__definitions &e) { if (!e.soap) { struct soap soap; soap_init2(&soap, SOAP_IO_DEFAULT, SOAP_XML_TREE | SOAP_C_UTFSTRING); soap_set_namespaces(&soap, namespaces); e.soap_serialize(&soap); soap_begin_send(&soap); e.soap_out(&soap, "wsdl:definitions", 0, NULL); soap_end_send(&soap); soap_destroy(&soap); soap_end(&soap); soap_done(&soap); } else { std::ostream *os = e.soap->os; e.soap->os = &o; e.soap_serialize(e.soap); soap_begin_send(e.soap); e.soap_out(e.soap, "wsdl:definitions", 0, NULL); soap_end_send(e.soap); e.soap->os = os; } return o; } std::istream &operator>>(std::istream &i, wsdl__definitions &e) { if (!e.soap) { e.soap = soap_new1(SOAP_XML_TREE | SOAP_C_UTFSTRING); soap_set_namespaces(e.soap, namespaces); } std::istream *is = e.soap->is; e.soap->is = &i; if (soap_begin_recv(e.soap) || !e.soap_in(e.soap, "wsdl:", NULL) || soap_end_recv(e.soap)) { // handle error? Note: e.soap->error is set and app should check } e.soap->is = is; return i; } //////////////////////////////////////////////////////////////////////////////// // // Miscellaneous // //////////////////////////////////////////////////////////////////////////////// extern "C" { int warn_ignore(struct soap *soap, const char *tag) { // We don't warn if the omitted element was an annotation or a documentation in an unexpected place if (!Mflag && soap->mustUnderstand) { fprintf(stderr, "\nError: must understand element '%s' at level %d with wsdl:required='true'. Suppress this error with -M\n", tag, soap->level); return soap->error = SOAP_MUSTUNDERSTAND; } if (!Wflag && soap_match_tag(soap, tag, "xs:annotation") && soap_match_tag(soap, tag, "xs:documentation") && soap_match_tag(soap, tag, "xs:appinfo")) fprintf(stderr, "\nWarning: unexpected element '%s' at level %d is skipped (safe to ignore)\n", tag, soap->level); if (soap->body && !soap_string_in(soap, 0, -1, -1, NULL)) return soap->error; return SOAP_OK; } int show_ignore(struct soap *soap, const char *tag) { warn_ignore(soap, tag); soap_print_fault_location(soap, stderr); return SOAP_OK; } } // end extern "C" gsoap-2.8.91/gsoap/wsdl/sp.h0000644000175000017500000000436713525245163015161 0ustar ellertellert/* sp.h WS-SecurityPolicy 1.2 binding schemas -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap sp schema documentation: WS-SecurityPolicy binding //gsoap sp schema namespace: http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702 // 1.1 //gsoap sp schema namespace: http://schemas.xmlsoap.org/ws/2005/07/securitypolicy //gsoap sp schema elementForm: qualified //gsoap sp schema attributeForm: unqualified #import "imports.h" #import "wsam.h" #import "wst.h" class sp__Header { public: @xsd__NCName Name; @xsd__anyURI Namespace; }; class sp__Parts { public: xsd__string Body; std::vector Header; xsd__string Attachments; }; class sp__Elements { public: @xsd__anyURI XPathVersion; std::vector XPath; }; class sp__Token : public wsp__Assertion { public: @xsd__anyURI IncludeToken; wsa__EndpointReferenceType *Issuer; xsd__anyURI IssuerName; wst__Claims *wst__Claims_; }; gsoap-2.8.91/gsoap/wsdl/dime.h0000644000175000017500000000320713525245163015445 0ustar ellertellert/* dime.h WSDL/DIME binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap dime schema documentation: WSDL/DIME binding schema //gsoap dime schema namespace: http://schemas.xmlsoap.org/ws/2002/04/dime/wsdl/ #import "imports.h" class dime__message { public: @xsd__anyURI layout; // @xsd__boolean wsdl__required; }; gsoap-2.8.91/gsoap/wsdl/http.h0000644000175000017500000000420113525245163015501 0ustar ellertellert/* http.h WSDL/HTTP binding schema interface -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap http schema documentation: WSDL 1.1 HTTP binding schema //gsoap http schema namespace: http://schemas.xmlsoap.org/wsdl/http/ //gsoap http schema elementForm: qualified //gsoap http schema attributeForm: unqualified //gsoap whttp schema documentation: WSDL 2.0 HTTP binding schema //gsoap whttp schema namespace: http://www.w3.org/ns/wsdl/http //gsoap whttp schema elementForm: qualified //gsoap whttp schema attributeForm: unqualified #import "imports.h" class http__address { public: @xsd__anyURI location; }; class http__binding { public: @xsd__NMTOKEN verb; }; class http__operation { public: @xsd__anyURI location; }; class whttp__header { public: @xsd__string name; @xsd__QName type; @xsd__boolean required = false; }; gsoap-2.8.91/gsoap/plugin/0000755000175000017500000000000013525245161014677 5ustar ellertellertgsoap-2.8.91/gsoap/plugin/httpdatest.h0000644000175000017500000000421613525245161017237 0ustar ellertellert/* httpdatest.h gSOAP HTTP Digest Authentication example application. gSOAP XML Web services tools Copyright (C) 2000-2005, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- 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. -------------------------------------------------------------------------------- Compile: soapcpp2 -c httpdatest.h cc -DWITH_OPENSSL -o httpdatest httpdatest.c soapC.c soapClient.c soapServer.c httpda.c smdevp.c threads.c stdsoap2.c -lssl -lcrypto -lz */ int ns__echoString(char *arg, struct ns__echoString*); gsoap-2.8.91/gsoap/plugin/httpmd5test.c0000644000175000017500000000517213525245161017335 0ustar ellertellert/* httpmd5test.c gSOAP HTTP Content-MD5 digest plugin example application. gSOAP XML Web services tools Copyright (C) 2000-2004, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- 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-2004, 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. -------------------------------------------------------------------------------- Requires OpenSSL Compile: soapcpp2 -c httpmd5test.h cc -DWITH_OPENSSL -o httpmd5test httpmd5test.c soapC.c soapClient.c soapServer.c httpmd5.c md5evp.c stdsoap2.c -lssl -lcrypto -lz */ #include "httpmd5.h" #include "soapH.h" #include "ns.nsmap" int main(int argc, char **argv) { struct soap soap; struct ns__echoString r; soap_init(&soap); soap_register_plugin(&soap, http_md5); if (argc < 2) soap_serve(&soap); else if (soap_call_ns__echoString(&soap, "http://", NULL, argv[1], &r)) soap_print_fault(&soap, stderr); soap_end(&soap); soap_done(&soap); return 0; } int ns__echoString(struct soap *soap, char *arg, struct ns__echoString *response) { response->arg = arg; return SOAP_OK; } gsoap-2.8.91/gsoap/plugin/httpget.h0000644000175000017500000000617613525245161016541 0ustar ellertellert/* httpget.h gSOAP HTTP GET plugin. See httpget.c for usage instructions. 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, 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-2008 Robert A. 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. -------------------------------------------------------------------------------- */ #ifndef HTTPGET_H #define HTTPGET_H #include "stdsoap2.h" #ifdef __cplusplus extern "C" { #endif #define HTTP_GET_ID "SOAP-HTTP-GET/2.1" /* plugin identification */ extern const char http_get_id[]; /* This is the local plugin data shared among all copies of the soap struct: */ struct http_get_data { int (*fparse)(struct soap*); /* to save and call the internal HTTP header parser */ int (*fget)(struct soap*); /* user-defined server-side HTTP GET handler */ size_t stat_get; /* HTTP GET usage statistics */ size_t stat_post; /* HTTP POST usage statistics */ size_t stat_fail; /* HTTP failure statistics */ size_t hist_min[60]; /* Hits by the minute */ size_t hist_hour[24]; /* Hits by the hour */ size_t hist_day[366]; /* Hits by day */ }; int http_get(struct soap*, struct soap_plugin*, void*); int soap_http_get_connect(struct soap*, const char*, const char*); void soap_http_get_stats(struct soap *soap, size_t *stat_get, size_t *stat_post, size_t *stat_fail, size_t **hist_min, size_t **hist_hour, size_t **hist_day); #ifdef __cplusplus } #endif #endif gsoap-2.8.91/gsoap/plugin/httppipe.h0000644000175000017500000000457613525245161016721 0ustar ellertellert/* httppipe.h HTTP pipeline implementation for stand-alone gSOAP servers gSOAP XML Web services tools Copyright (C) 2000-2018, Robert van Engelen, Genivia, Inc. All Rights Reserved. -------------------------------------------------------------------------------- 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-2018 Robert A. 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. -------------------------------------------------------------------------------- */ #ifndef HTTPPIPE_H #define HTTPPIPE_H #include "stdsoap2.h" #ifdef __cplusplus extern "C" { #endif #define HTTP_PIPE_ID "SOAP-HTTP-PIPE/1.0" /* plugin identification */ extern const char http_post_id[]; struct http_pipe_data { int (*fprepareinitrecv)(struct soap*); int (*fpreparefinalrecv)(struct soap*); char buf[SOAP_BUFLEN]; size_t len; }; int http_pipe(struct soap*, struct soap_plugin*, void*); #ifdef __cplusplus } #endif #endif gsoap-2.8.91/gsoap/plugin/threads.c0000644000175000017500000001017013525245161016474 0ustar ellertellert/* threads.c Portable threads and locks API implementation gSOAP XML Web services tools Copyright (C) 2000-2010, 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-2010, 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 "threads.h" #ifdef WIN32 /******************************************************************************\ * * Emulation of POSIX condition variables for WIN32 * \******************************************************************************/ #ifdef __cplusplus extern "C" { #endif SOAP_FMAC1 int SOAP_FMAC2 emulate_pthread_mutex_lock(volatile MUTEX_TYPE *mx) { if (*mx == NULL) /* static initializer? */ { HANDLE p = CreateMutex(NULL, FALSE, NULL); if (InterlockedCompareExchangePointer((PVOID*)mx, (PVOID)p, NULL) != NULL) CloseHandle(p); } return WaitForSingleObject(*mx, INFINITE) == WAIT_FAILED; } SOAP_FMAC1 int SOAP_FMAC2 emulate_pthread_cond_init(COND_TYPE *cv) { cv->waiters_count_ = 0; cv->signal_event_ = CreateEvent(NULL, FALSE, FALSE, NULL); InitializeCriticalSection(&cv->waiters_count_lock_); return 0; } SOAP_FMAC1 int SOAP_FMAC2 emulate_pthread_cond_destroy(COND_TYPE *cv) { CloseHandle(cv->signal_event_); DeleteCriticalSection(&cv->waiters_count_lock_); return 0; } SOAP_FMAC1 int SOAP_FMAC2 emulate_pthread_cond_signal(COND_TYPE *cv) { int have_waiters; EnterCriticalSection(&cv->waiters_count_lock_); have_waiters = cv->waiters_count_ > 0; LeaveCriticalSection(&cv->waiters_count_lock_); if (have_waiters) return SetEvent(cv->signal_event_) == 0; return 0; } SOAP_FMAC1 int SOAP_FMAC2 emulate_pthread_cond_wait(COND_TYPE *cv, MUTEX_TYPE *cs) { int result; EnterCriticalSection(&cv->waiters_count_lock_); cv->waiters_count_++; LeaveCriticalSection(&cv->waiters_count_lock_); ReleaseMutex(*cs); result = (WaitForSingleObject(cv->signal_event_, INFINITE) == WAIT_FAILED); if (!result) { EnterCriticalSection(&cv->waiters_count_lock_); cv->waiters_count_--; LeaveCriticalSection(&cv->waiters_count_lock_); result = (WaitForSingleObject(*cs, INFINITE) == WAIT_FAILED); } return result; } #ifdef __cplusplus } #endif #endif gsoap-2.8.91/gsoap/plugin/md5evp.h0000644000175000017500000000600213525245161016246 0ustar ellertellert/* 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" #ifdef WITH_OPENSSL #include #endif #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 gsoap-2.8.91/gsoap/plugin/wsaapi.h0000644000175000017500000001635213525245161016343 0ustar ellertellert/* wsaapi.h WS-Addressing plugin 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, 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-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 -------------------------------------------------------------------------------- */ #ifndef WSAAPI_H #define WSAAPI_H /* When using soapcpp2 option -q or -p, you need to change "soapH.h" below */ /* include soapH.h generated by soapcpp2 from .h file containing #import "wsa.h" */ #ifdef SOAP_H_FILE /* if set, use the soapcpp2-generated fileH.h file as specified with: cc ... -DSOAP_H_FILE=fileH.h */ # include "stdsoap2.h" # include SOAP_XSTRINGIFY(SOAP_H_FILE) #else # include "soapH.h" /* or manually replace with soapcpp2-generated *H.h file */ #endif #ifdef __cplusplus extern "C" { #endif /** Plugin identification for plugin registry */ #define SOAP_WSA_ID "SOAP-WSA/1.3" /** Plugin identification for plugin registry */ extern const char soap_wsa_id[]; extern const char *soap_wsa_noneURI; extern const char *soap_wsa_anonymousURI; extern const char *soap_wsa_faultAction; #if defined(SOAP_WSA_2003) # define SOAP_WSA(member) wsa3__##member # define SOAP_WSA_(prefix,member) prefix##_wsa3__##member # define SOAP_WSA__(prefix,member) prefix##wsa3__##member #elif defined(SOAP_WSA_2004) # define SOAP_WSA(member) wsa4__##member # define SOAP_WSA_(prefix,member) prefix##_wsa4__##member # define SOAP_WSA__(prefix,member) prefix##wsa4__##member #elif defined(SOAP_WSA_2005) # define SOAP_WSA(member) wsa5__##member # define SOAP_WSA_(prefix,member) prefix##_wsa5__##member # define SOAP_WSA__(prefix,member) prefix##wsa5__##member #else # define SOAP_WSA(member) wsa__##member # define SOAP_WSA_(prefix,member) prefix##_wsa__##member # define SOAP_WSA__(prefix,member) prefix##wsa__##member #endif /** @brief plugin data to override callbacks */ struct soap_wsa_data { /** fheader callback is invoked immediately after parsing a SOAP Header */ int (*fheader)(struct soap*); /** fseterror callback is used to inspect and change gSOAP error codes */ void (*fseterror)(struct soap*, const char**, const char**); /** fresponse callback is used to change a HTTP response into a HTTP POST */ int (*fresponse)(struct soap*, int, ULONG64); /** fdisconnect callback is used to accept HTTP 202 */ int (*fdisconnect)(struct soap*); }; SOAP_FMAC1 int SOAP_FMAC2 soap_wsa(struct soap *soap, struct soap_plugin *p, void *arg); SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsa_rand_uuid(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_request(struct soap *soap, const char *id, const char *to, const char *action); SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_add_From(struct soap *soap, const char *endpoint); SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_add_NoReply(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_add_ReplyTo(struct soap *soap, const char *endpoint); SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_add_FaultTo(struct soap *soap, const char *endpoint); SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_add_RelatesTo(struct soap *soap, const char *endpoint); SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsa_From(struct soap *soap); SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsa_ReplyTo(struct soap *soap); SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsa_FaultTo(struct soap *soap); SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsa_RelatesTo(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_check(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_reply(struct soap *soap, const char *id, const char *action); SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_fault_subcode(struct soap *soap, int flag, const char *faultsubcode, const char *faultstring, const char *faultdetail); SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_fault_subcode_action(struct soap *soap, int flag, const char *faultsubcode, const char *faultstring, const char *faultdetail, const char *action); SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail); SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_sender_fault_subcode_action(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail, const char *action); SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail); SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_receiver_fault_subcode_action(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail, const char *action); SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail); SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail); #if defined(SOAP_WSA_2005) SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_check_fault(struct soap *soap, SOAP_WSA(FaultCodesType) *fault, const char **info); SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_error(struct soap *soap, SOAP_WSA(FaultCodesType) fault, const char *info); #elif defined(SOAP_WSA_2003) SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_check_fault(struct soap *soap, char **fault); SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_error(struct soap *soap, const char *fault); #else SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_check_fault(struct soap *soap, SOAP_WSA(FaultSubcodeValues) *fault); SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_error(struct soap *soap, SOAP_WSA(FaultSubcodeValues) fault); #endif #ifdef __cplusplus } #endif #endif gsoap-2.8.91/gsoap/plugin/cacerts.c0000644000175000017500000064650113525245161016503 0ustar ellertellert/* cacerts.c Stores CA certificates in memory to replace the use of cacerts.pem Simply replace the call to soap_ssl_client_context() with a call to: soap_ssl_client_cacerts(soap); No cacerts.pem file is needed. gSOAP XML Web services tools Copyright (C) 2000-2018, 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-2018, 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 -------------------------------------------------------------------------------- # Part of the source for this file is provided by Mozilla: # http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 # This file was converted to PEM format with tools provided by OpenSSL. # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cacerts.h" #ifdef __cplusplus extern "C" { #endif int soap_ssl_client_cacerts(struct soap *soap) { extern const char cacert_pem_data[]; const char *data = cacert_pem_data; const char *next = data; int err = SOAP_OK; int max = 0; X509 *cert = NULL; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) const unsigned char *der; #else unsigned char *der; #endif char *buf = NULL; X509_STORE *store; err = soap_ssl_client_context(soap, SOAP_SSL_DEFAULT, NULL, NULL, NULL, NULL, NULL); if (err) return err; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Populating certificate chain\n")); store = SSL_CTX_get_cert_store(soap->ctx); for (;;) { int len; data = strstr(next, "-----BEGIN CERTIFICATE-----"); if (!data) break; data += 27; next = strstr(data, "-----END CERTIFICATE-----"); if (!next) break; len = (next - data + 3) / 4 * 3; if (len > max) { if (buf) SOAP_FREE(soap, buf); buf = (char*)SOAP_MALLOC(soap, len); max = len; } soap_base642s(soap, data, buf, (size_t)len, NULL); der = (unsigned char*)buf; if (cert) { X509_free(cert); cert = NULL; } if (!d2i_X509(&cert, &der, len)) break; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Adding certificate %d bytes\n", len)); if (X509_STORE_add_cert(store, cert) != 1) { char line[80]; (SOAP_SNPRINTF(line, sizeof(line), 32), "At position %lu", (unsigned long)(data - cacert_pem_data)); err = soap_set_receiver_error(soap, line, "SSL add chain certificate failed in soap_ssl_client_cacerts()", SOAP_SSL_ERROR); break; } data = next + 25; } if (buf) SOAP_FREE(soap, buf); if (cert) X509_free(cert); return err; } const char cacert_pem_data[] = "\ GlobalSign Root CA\ ==================\ -----BEGIN CERTIFICATE-----\ MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx\ GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds\ b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV\ BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD\ VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa\ DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc\ THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb\ Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP\ c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX\ gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\ HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF\ AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj\ Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG\ j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH\ hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC\ X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==\ -----END CERTIFICATE-----\ \ GlobalSign Root CA - R2\ =======================\ -----BEGIN CERTIFICATE-----\ MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv\ YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh\ bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT\ aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln\ bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6\ ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp\ s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN\ S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL\ TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C\ ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E\ FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i\ YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN\ BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp\ 9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu\ 01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7\ 9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7\ TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==\ -----END CERTIFICATE-----\ \ Verisign Class 3 Public Primary Certification Authority - G3\ ============================================================\ -----BEGIN CERTIFICATE-----\ MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV\ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv\ cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl\ IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh\ dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw\ CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy\ dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv\ cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg\ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\ ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1\ EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc\ cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw\ EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj\ 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA\ ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f\ j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC\ /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0\ xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa\ t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==\ -----END CERTIFICATE-----\ \ Entrust.net Premium 2048 Secure Server CA\ =========================================\ -----BEGIN CERTIFICATE-----\ MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u\ ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp\ bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV\ BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx\ NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3\ d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl\ MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u\ ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\ MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL\ Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr\ hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW\ nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi\ VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E\ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ\ KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy\ T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf\ zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT\ J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e\ nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE=\ -----END CERTIFICATE-----\ \ Baltimore CyberTrust Root\ =========================\ -----BEGIN CERTIFICATE-----\ MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE\ ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li\ ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC\ SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs\ dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME\ uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB\ UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C\ G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9\ XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr\ l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI\ VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB\ BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh\ cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5\ hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa\ Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H\ RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp\ -----END CERTIFICATE-----\ \ AddTrust External Root\ ======================\ -----BEGIN CERTIFICATE-----\ MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML\ QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD\ VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw\ NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU\ cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg\ Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821\ +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw\ Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo\ aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy\ 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7\ 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P\ BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL\ VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk\ VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB\ IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl\ j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5\ 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355\ e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u\ G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=\ -----END CERTIFICATE-----\ \ Entrust Root Certification Authority\ ====================================\ -----BEGIN CERTIFICATE-----\ MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV\ BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw\ b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG\ A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0\ MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu\ MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu\ Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v\ dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\ ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz\ A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww\ Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68\ j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN\ rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw\ DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1\ MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH\ hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA\ A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM\ Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa\ v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS\ W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0\ tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8\ -----END CERTIFICATE-----\ \ GeoTrust Global CA\ ==================\ -----BEGIN CERTIFICATE-----\ MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK\ Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw\ MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j\ LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\ CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo\ BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet\ 8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc\ T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU\ vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD\ AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk\ DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q\ zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4\ d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2\ mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p\ XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm\ Mw==\ -----END CERTIFICATE-----\ \ GeoTrust Universal CA\ =====================\ -----BEGIN CERTIFICATE-----\ MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN\ R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1\ MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu\ Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP\ ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t\ JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e\ RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs\ 7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d\ 8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V\ qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga\ Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB\ Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu\ KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08\ ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0\ XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB\ hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc\ aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2\ qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL\ oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK\ xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF\ KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2\ DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK\ xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU\ p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI\ P/rmMuGNG2+k5o7Y+SlIis5z/iw=\ -----END CERTIFICATE-----\ \ GeoTrust Universal CA 2\ =======================\ -----BEGIN CERTIFICATE-----\ MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN\ R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0\ MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg\ SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA\ A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0\ DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17\ j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q\ JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a\ QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2\ WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP\ 20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn\ ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC\ SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG\ 8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2\ +/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E\ BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z\ dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ\ 4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+\ mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq\ A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg\ Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP\ pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d\ FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp\ gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm\ X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS\ -----END CERTIFICATE-----\ \ Visa eCommerce Root\ ===================\ -----BEGIN CERTIFICATE-----\ MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG\ EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug\ QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2\ WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm\ VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv\ bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL\ F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b\ RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0\ TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI\ /k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs\ GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG\ MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc\ CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW\ YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz\ zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu\ YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt\ 398znM/jra6O1I7mT1GvFpLgXPYHDw==\ -----END CERTIFICATE-----\ \ Comodo AAA Services root\ ========================\ -----BEGIN CERTIFICATE-----\ MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS\ R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg\ TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw\ MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl\ c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV\ BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\ ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG\ C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs\ i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW\ Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH\ Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK\ Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f\ BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl\ cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz\ LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm\ 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz\ Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z\ 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C\ 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==\ -----END CERTIFICATE-----\ \ QuoVadis Root CA\ ================\ -----BEGIN CERTIFICATE-----\ MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE\ ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0\ eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz\ MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp\ cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD\ EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF\ AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk\ J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL\ F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL\ YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen\ AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w\ PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y\ ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7\ MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj\ YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs\ ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh\ Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW\ Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu\ BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw\ FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0\ aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6\ tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo\ fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul\ LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x\ gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi\ 5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi\ 5nrQNiOKSnQ2+Q==\ -----END CERTIFICATE-----\ \ QuoVadis Root CA 2\ ==================\ -----BEGIN CERTIFICATE-----\ MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT\ EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx\ ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM\ aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC\ DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6\ XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk\ lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB\ lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy\ lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt\ 66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn\ wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh\ D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy\ BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie\ J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud\ DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU\ a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT\ ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv\ Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3\ UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm\ VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK\ +JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW\ IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1\ WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X\ f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II\ 4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8\ VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u\ -----END CERTIFICATE-----\ \ QuoVadis Root CA 3\ ==================\ -----BEGIN CERTIFICATE-----\ MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT\ EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx\ OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM\ aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC\ DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg\ DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij\ KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K\ DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv\ BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp\ p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8\ nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX\ MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM\ Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz\ uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT\ BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj\ YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0\ aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB\ BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD\ VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4\ ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE\ AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV\ qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s\ hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z\ POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2\ Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp\ 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC\ bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu\ g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p\ vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr\ qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=\ -----END CERTIFICATE-----\ \ Security Communication Root CA\ ==============================\ -----BEGIN CERTIFICATE-----\ MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP\ U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw\ HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP\ U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw\ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw\ 8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM\ DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX\ 5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd\ DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2\ JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw\ DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g\ 0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a\ mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ\ s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ\ 6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi\ FL39vmwLAw==\ -----END CERTIFICATE-----\ \ Sonera Class 2 Root CA\ ======================\ -----BEGIN CERTIFICATE-----\ MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG\ U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw\ NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh\ IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3\ /Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT\ dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG\ f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P\ tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH\ nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT\ XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt\ 0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI\ cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph\ Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx\ EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH\ llpwrN9M\ -----END CERTIFICATE-----\ \ XRamp Global CA Root\ ====================\ -----BEGIN CERTIFICATE-----\ MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE\ BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj\ dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB\ dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx\ HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg\ U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp\ dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu\ IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx\ foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE\ zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs\ AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry\ xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud\ EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap\ oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC\ AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc\ /Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt\ qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n\ nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz\ 8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=\ -----END CERTIFICATE-----\ \ Go Daddy Class 2 CA\ ===================\ -----BEGIN CERTIFICATE-----\ MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY\ VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp\ ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG\ A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g\ RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD\ ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv\ 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32\ qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j\ YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY\ vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O\ BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o\ atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu\ MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG\ A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim\ PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt\ I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ\ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI\ Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b\ vZ8=\ -----END CERTIFICATE-----\ \ Starfield Class 2 CA\ ====================\ -----BEGIN CERTIFICATE-----\ MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc\ U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg\ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo\ MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG\ A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG\ SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY\ bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ\ JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm\ epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN\ F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF\ MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f\ hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo\ bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g\ QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs\ afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM\ PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl\ xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD\ KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3\ QBFGmh95DmK/D5fs4C8fF5Q=\ -----END CERTIFICATE-----\ \ Taiwan GRCA\ ===========\ -----BEGIN CERTIFICATE-----\ MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG\ EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X\ DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv\ dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD\ ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN\ w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5\ BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O\ 1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO\ htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov\ J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7\ Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t\ B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB\ O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8\ lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV\ HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2\ 09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ\ TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj\ Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2\ Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU\ D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz\ DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk\ Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk\ 7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ\ CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy\ +fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS\ -----END CERTIFICATE-----\ \ DigiCert Assured ID Root CA\ ===========================\ -----BEGIN CERTIFICATE-----\ MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG\ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw\ IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx\ MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL\ ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew\ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO\ 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy\ UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW\ /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy\ oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf\ GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF\ 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq\ hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc\ EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn\ SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i\ 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe\ +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==\ -----END CERTIFICATE-----\ \ DigiCert Global Root CA\ =======================\ -----BEGIN CERTIFICATE-----\ MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG\ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw\ HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw\ MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3\ dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq\ hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn\ TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5\ BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H\ 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y\ 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB\ o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm\ 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF\ BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr\ EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt\ tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886\ UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\ CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\ -----END CERTIFICATE-----\ \ DigiCert High Assurance EV Root CA\ ==================================\ -----BEGIN CERTIFICATE-----\ MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG\ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw\ KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw\ MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ\ MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu\ Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t\ Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS\ OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3\ MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ\ NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe\ h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB\ Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY\ JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ\ V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp\ myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK\ mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe\ vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K\ -----END CERTIFICATE-----\ \ Certplus Class 2 Primary CA\ ===========================\ -----BEGIN CERTIFICATE-----\ MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE\ BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN\ OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy\ dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\ ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR\ 5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ\ Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO\ YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e\ e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME\ CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ\ YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t\ L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD\ P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R\ TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+\ 7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW\ //1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7\ l7+ijrRU\ -----END CERTIFICATE-----\ \ DST Root CA X3\ ==============\ -----BEGIN CERTIFICATE-----\ MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK\ ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X\ DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1\ cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD\ ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT\ rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9\ UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy\ xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d\ utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T\ AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ\ MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug\ dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE\ GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw\ RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS\ fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ\ -----END CERTIFICATE-----\ \ SwissSign Gold CA - G2\ ======================\ -----BEGIN CERTIFICATE-----\ MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw\ EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN\ MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp\ c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B\ AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq\ t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C\ jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg\ vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF\ ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR\ AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend\ jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO\ peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR\ 7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi\ GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw\ AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64\ OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov\ L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm\ 5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr\ 44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf\ Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m\ Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp\ mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk\ vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf\ KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br\ NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj\ viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ\ -----END CERTIFICATE-----\ \ SwissSign Silver CA - G2\ ========================\ -----BEGIN CERTIFICATE-----\ MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT\ BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X\ DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3\ aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG\ 9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644\ N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm\ +/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH\ 6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu\ MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h\ qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5\ FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs\ ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc\ celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X\ CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/\ BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB\ tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0\ cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P\ 4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F\ kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L\ 3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx\ /uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa\ DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP\ e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu\ WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ\ DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub\ DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u\ -----END CERTIFICATE-----\ \ GeoTrust Primary Certification Authority\ ========================================\ -----BEGIN CERTIFICATE-----\ MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG\ EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD\ ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx\ CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ\ cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\ CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN\ b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9\ nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge\ RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt\ tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI\ hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K\ Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN\ NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa\ Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG\ 1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=\ -----END CERTIFICATE-----\ \ thawte Primary Root CA\ ======================\ -----BEGIN CERTIFICATE-----\ MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE\ BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2\ aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv\ cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3\ MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg\ SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv\ KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT\ FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs\ oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ\ 1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc\ q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K\ aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p\ afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD\ VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF\ AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE\ uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX\ xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89\ jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH\ z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==\ -----END CERTIFICATE-----\ \ VeriSign Class 3 Public Primary Certification Authority - G5\ ============================================================\ -----BEGIN CERTIFICATE-----\ MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE\ BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO\ ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk\ IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp\ ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB\ yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln\ biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh\ dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt\ YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw\ ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz\ j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD\ Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/\ Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r\ fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/\ BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv\ Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy\ aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG\ SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+\ X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE\ KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC\ Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE\ ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq\ -----END CERTIFICATE-----\ \ SecureTrust CA\ ==============\ -----BEGIN CERTIFICATE-----\ MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG\ EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy\ dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe\ BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC\ ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX\ OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t\ DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH\ GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b\ 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH\ ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/\ BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj\ aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ\ KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu\ SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf\ mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ\ nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR\ 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=\ -----END CERTIFICATE-----\ \ Secure Global CA\ ================\ -----BEGIN CERTIFICATE-----\ MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG\ EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH\ bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg\ MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg\ Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx\ YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ\ bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g\ 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV\ HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi\ 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud\ EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn\ oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA\ MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+\ OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn\ CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5\ 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc\ f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW\ -----END CERTIFICATE-----\ \ COMODO Certification Authority\ ==============================\ -----BEGIN CERTIFICATE-----\ MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE\ BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG\ A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1\ dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb\ MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD\ T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5\ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH\ +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww\ xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV\ 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA\ 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI\ rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E\ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k\ b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC\ AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP\ OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/\ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc\ IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN\ +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==\ -----END CERTIFICATE-----\ \ Network Solutions Certificate Authority\ =======================================\ -----BEGIN CERTIFICATE-----\ MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG\ EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr\ IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx\ MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu\ MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G\ CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx\ jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT\ aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT\ crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc\ /Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB\ AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP\ BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv\ bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA\ A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q\ 4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/\ GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv\ wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD\ ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey\ -----END CERTIFICATE-----\ \ COMODO ECC Certification Authority\ ==================================\ -----BEGIN CERTIFICATE-----\ MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC\ R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE\ ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB\ dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix\ GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR\ Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo\ b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X\ 4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni\ wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E\ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG\ FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA\ U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=\ -----END CERTIFICATE-----\ \ OISTE WISeKey Global Root GA CA\ ===============================\ -----BEGIN CERTIFICATE-----\ MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE\ BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG\ A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH\ bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD\ VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw\ IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5\ IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9\ Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg\ Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD\ d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ\ /yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R\ LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw\ AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ\ KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm\ MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4\ +vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa\ hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY\ okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=\ -----END CERTIFICATE-----\ \ Certigna\ ========\ -----BEGIN CERTIFICATE-----\ MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw\ EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3\ MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI\ Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q\ XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH\ GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p\ ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg\ DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf\ Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ\ tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ\ BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J\ SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA\ hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+\ ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu\ PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY\ 1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw\ WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==\ -----END CERTIFICATE-----\ \ Deutsche Telekom Root CA 2\ ==========================\ -----BEGIN CERTIFICATE-----\ MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT\ RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG\ A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5\ MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G\ A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS\ b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5\ bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI\ KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY\ AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK\ Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV\ jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV\ HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr\ E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy\ zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8\ rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G\ dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU\ Cm26OWMohpLzGITY+9HPBVZkVw==\ -----END CERTIFICATE-----\ \ Cybertrust Global Root\ ======================\ -----BEGIN CERTIFICATE-----\ MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li\ ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4\ MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD\ ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\ +Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW\ 0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL\ AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin\ 89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT\ 8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP\ BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2\ MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G\ A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO\ lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi\ 5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2\ hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T\ X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW\ WL1WMRJOEcgh4LMRkWXbtKaIOM5V\ -----END CERTIFICATE-----\ \ ePKI Root Certification Authority\ =================================\ -----BEGIN CERTIFICATE-----\ MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG\ EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg\ Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx\ MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq\ MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B\ AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs\ IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi\ lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv\ qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX\ 12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O\ WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+\ ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao\ lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/\ vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi\ Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi\ MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH\ ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0\ 1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq\ KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV\ xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP\ NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r\ GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE\ xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx\ gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy\ sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD\ BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=\ -----END CERTIFICATE-----\ \ certSIGN ROOT CA\ ================\ -----BEGIN CERTIFICATE-----\ MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD\ VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa\ Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE\ CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I\ JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH\ rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2\ ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD\ 0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943\ AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B\ Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB\ AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8\ SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0\ x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt\ vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz\ TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD\ -----END CERTIFICATE-----\ \ GeoTrust Primary Certification Authority - G3\ =============================================\ -----BEGIN CERTIFICATE-----\ MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE\ BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0\ IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy\ eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz\ NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo\ YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT\ LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI\ hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j\ K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE\ c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C\ IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu\ dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC\ MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr\ 2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9\ cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE\ Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD\ AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s\ t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt\ -----END CERTIFICATE-----\ \ thawte Primary Root CA - G2\ ===========================\ -----BEGIN CERTIFICATE-----\ MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC\ VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu\ IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg\ Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV\ MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG\ b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt\ IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS\ LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5\ 8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU\ mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN\ G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K\ rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==\ -----END CERTIFICATE-----\ \ thawte Primary Root CA - G3\ ===========================\ -----BEGIN CERTIFICATE-----\ MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE\ BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2\ aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv\ cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w\ ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh\ d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD\ VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG\ A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\ MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At\ P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC\ +BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY\ 7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW\ vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E\ BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ\ KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK\ A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu\ t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC\ 8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm\ er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=\ -----END CERTIFICATE-----\ \ GeoTrust Primary Certification Authority - G2\ =============================================\ -----BEGIN CERTIFICATE-----\ MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC\ VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu\ Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD\ ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1\ OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg\ MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl\ b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG\ BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc\ KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD\ VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+\ EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m\ ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2\ npaqBA+K\ -----END CERTIFICATE-----\ \ VeriSign Universal Root Certification Authority\ ===============================================\ -----BEGIN CERTIFICATE-----\ MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE\ BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO\ ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk\ IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u\ IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV\ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv\ cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl\ IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0\ aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj\ 1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP\ MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72\ 9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I\ AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR\ tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G\ CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O\ a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud\ DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3\ Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx\ Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx\ P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P\ wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4\ mJO37M2CYfE45k+XmCpajQ==\ -----END CERTIFICATE-----\ \ VeriSign Class 3 Public Primary Certification Authority - G4\ ============================================================\ -----BEGIN CERTIFICATE-----\ MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC\ VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3\ b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz\ ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj\ YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL\ MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU\ cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo\ b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5\ IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8\ Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz\ rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB\ /zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw\ HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u\ Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD\ A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx\ AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==\ -----END CERTIFICATE-----\ \ NetLock Arany (Class Gold) Főtanúsítvány\ ========================================\ -----BEGIN CERTIFICATE-----\ MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G\ A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610\ dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB\ cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx\ MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO\ ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv\ biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6\ c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu\ 0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw\ /HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk\ H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw\ fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1\ neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB\ BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW\ qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta\ YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC\ bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna\ NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu\ dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=\ -----END CERTIFICATE-----\ \ Staat der Nederlanden Root CA - G2\ ==================================\ -----BEGIN CERTIFICATE-----\ MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE\ CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g\ Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC\ TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l\ ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ\ 5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn\ vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj\ CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil\ e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR\ OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI\ CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65\ 48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi\ trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737\ qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB\ AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC\ ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV\ HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA\ A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz\ +51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj\ f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN\ kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk\ CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF\ URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb\ CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h\ oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV\ IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm\ 66+KAQ==\ -----END CERTIFICATE-----\ \ Hongkong Post Root CA 1\ =======================\ -----BEGIN CERTIFICATE-----\ MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT\ DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx\ NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n\ IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF\ AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1\ ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr\ auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh\ qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY\ V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV\ HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i\ h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio\ l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei\ IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps\ T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT\ c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==\ -----END CERTIFICATE-----\ \ SecureSign RootCA11\ ===================\ -----BEGIN CERTIFICATE-----\ MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi\ SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS\ b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw\ KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1\ cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL\ TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO\ wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq\ g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP\ O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA\ bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX\ t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh\ OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r\ bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ\ Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01\ y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061\ lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=\ -----END CERTIFICATE-----\ \ Microsec e-Szigno Root CA 2009\ ==============================\ -----BEGIN CERTIFICATE-----\ MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER\ MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv\ c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o\ dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE\ BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt\ U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw\ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA\ fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG\ 0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA\ pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm\ 1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC\ AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf\ QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE\ FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o\ lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX\ I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775\ tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02\ yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi\ LXpUq3DDfSJlgnCW\ -----END CERTIFICATE-----\ \ GlobalSign Root CA - R3\ =======================\ -----BEGIN CERTIFICATE-----\ MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv\ YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh\ bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT\ aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln\ bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt\ iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ\ 0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3\ rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl\ OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2\ xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE\ FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7\ lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8\ EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E\ bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18\ YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r\ kpeDMdmztcpHWD9f\ -----END CERTIFICATE-----\ \ Autoridad de Certificacion Firmaprofesional CIF A62634068\ =========================================================\ -----BEGIN CERTIFICATE-----\ MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA\ BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2\ MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw\ QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB\ NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD\ Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P\ B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY\ 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH\ ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI\ plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX\ MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX\ LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK\ bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU\ vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud\ EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH\ DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp\ cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA\ bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx\ ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx\ 51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk\ R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP\ T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f\ Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl\ osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR\ crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR\ saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD\ KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi\ 6Et8Vcad+qMUu2WFbm5PEn4KPJ2V\ -----END CERTIFICATE-----\ \ Izenpe.com\ ==========\ -----BEGIN CERTIFICATE-----\ MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG\ EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz\ MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu\ QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ\ 03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK\ ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU\ +zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC\ PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT\ OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK\ F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK\ 0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+\ 0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB\ leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID\ AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+\ SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG\ NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx\ MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O\ BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l\ Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga\ kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q\ hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs\ g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5\ aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5\ nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC\ ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo\ Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z\ WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==\ -----END CERTIFICATE-----\ \ Chambers of Commerce Root - 2008\ ================================\ -----BEGIN CERTIFICATE-----\ MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD\ MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv\ bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu\ QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy\ Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl\ ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF\ EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl\ cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC\ AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA\ XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj\ h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/\ ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk\ NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g\ D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331\ lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ\ 0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj\ ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2\ EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI\ G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ\ BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh\ bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh\ bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC\ CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH\ AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1\ wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH\ 3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU\ RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6\ M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1\ YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF\ 9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK\ zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG\ nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg\ OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ\ -----END CERTIFICATE-----\ \ Global Chambersign Root - 2008\ ==============================\ -----BEGIN CERTIFICATE-----\ MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD\ MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv\ bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu\ QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx\ NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg\ Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ\ QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD\ aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf\ VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf\ XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0\ ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB\ /gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA\ TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M\ H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe\ Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF\ HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh\ wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB\ AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT\ BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE\ BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm\ aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm\ aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp\ 1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0\ dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG\ /5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6\ ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s\ dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg\ 9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH\ foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du\ qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr\ P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq\ c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z\ 09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B\ -----END CERTIFICATE-----\ \ Go Daddy Root Certificate Authority - G2\ ========================================\ -----BEGIN CERTIFICATE-----\ MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT\ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu\ MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5\ MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6\ b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G\ A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI\ hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq\ 9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD\ +qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd\ fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl\ NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC\ MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9\ BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac\ vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r\ 5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV\ N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO\ LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1\ -----END CERTIFICATE-----\ \ Starfield Root Certificate Authority - G2\ =========================================\ -----BEGIN CERTIFICATE-----\ MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT\ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s\ b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0\ eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw\ DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg\ VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB\ dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv\ W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs\ bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk\ N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf\ ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU\ JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\ AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol\ TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx\ 4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw\ F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K\ pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ\ c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0\ -----END CERTIFICATE-----\ \ Starfield Services Root Certificate Authority - G2\ ==================================================\ -----BEGIN CERTIFICATE-----\ MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT\ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s\ b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl\ IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV\ BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT\ dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg\ Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC\ AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2\ h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa\ hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP\ LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB\ rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw\ AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG\ SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP\ E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy\ xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd\ iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza\ YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6\ -----END CERTIFICATE-----\ \ AffirmTrust Commercial\ ======================\ -----BEGIN CERTIFICATE-----\ MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS\ BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw\ MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly\ bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF\ AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb\ DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV\ C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6\ BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww\ MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV\ HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\ AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG\ hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi\ qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv\ 0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh\ sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=\ -----END CERTIFICATE-----\ \ AffirmTrust Networking\ ======================\ -----BEGIN CERTIFICATE-----\ MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS\ BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw\ MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly\ bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF\ AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE\ Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI\ dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24\ /PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb\ h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV\ HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\ AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu\ UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6\ 12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23\ WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9\ /ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=\ -----END CERTIFICATE-----\ \ AffirmTrust Premium\ ===================\ -----BEGIN CERTIFICATE-----\ MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS\ BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy\ OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy\ dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A\ MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn\ BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV\ 5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs\ +7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd\ GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R\ p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI\ S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04\ 6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5\ /bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo\ +Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB\ /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv\ MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg\ Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC\ 6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S\ L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK\ +4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV\ BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg\ IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60\ g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb\ zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==\ -----END CERTIFICATE-----\ \ AffirmTrust Premium ECC\ =======================\ -----BEGIN CERTIFICATE-----\ MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV\ BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx\ MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U\ cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA\ IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ\ N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW\ BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK\ BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X\ 57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM\ eQ==\ -----END CERTIFICATE-----\ \ Certum Trusted Network CA\ =========================\ -----BEGIN CERTIFICATE-----\ MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK\ ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv\ biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy\ MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU\ ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5\ MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC\ AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC\ l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J\ J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4\ fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0\ cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB\ Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw\ DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj\ jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1\ mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj\ Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI\ 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=\ -----END CERTIFICATE-----\ \ TWCA Root Certification Authority\ =================================\ -----BEGIN CERTIFICATE-----\ MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ\ VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh\ dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG\ EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB\ IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK\ AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx\ QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC\ oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP\ 4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r\ y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB\ BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG\ 9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC\ mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW\ QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY\ T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny\ Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==\ -----END CERTIFICATE-----\ \ Security Communication RootCA2\ ==============================\ -----BEGIN CERTIFICATE-----\ MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc\ U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh\ dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC\ SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy\ aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\ ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++\ +T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R\ 3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV\ spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K\ EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8\ QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB\ CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj\ u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk\ 3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q\ tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29\ mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03\ -----END CERTIFICATE-----\ \ EC-ACC\ ======\ -----BEGIN CERTIFICATE-----\ MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE\ BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w\ ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD\ VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE\ CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT\ BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7\ MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt\ SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl\ Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh\ cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND\ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK\ w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT\ ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4\ HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a\ E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw\ 0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E\ BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD\ VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0\ Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l\ dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ\ lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa\ Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe\ l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2\ E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D\ 5EI=\ -----END CERTIFICATE-----\ \ Hellenic Academic and Research Institutions RootCA 2011\ =======================================================\ -----BEGIN CERTIFICATE-----\ MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT\ O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y\ aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z\ IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT\ AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z\ IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo\ IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\ AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI\ 1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa\ 71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u\ 8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH\ 3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/\ MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8\ MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu\ b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt\ XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8\ TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD\ /md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N\ 7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4\ -----END CERTIFICATE-----\ \ Actalis Authentication Root CA\ ==============================\ -----BEGIN CERTIFICATE-----\ MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM\ BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE\ AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky\ MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz\ IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290\ IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ\ wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa\ by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6\ zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f\ YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2\ oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l\ EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7\ hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8\ EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5\ jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY\ iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt\ ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI\ WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0\ JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx\ K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+\ Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC\ 4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo\ 2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz\ lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem\ OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9\ vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==\ -----END CERTIFICATE-----\ \ Trustis FPS Root CA\ ===================\ -----BEGIN CERTIFICATE-----\ MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG\ EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290\ IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV\ BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ\ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ\ RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk\ H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa\ cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt\ o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA\ AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd\ BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c\ GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC\ yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P\ 8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV\ l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl\ iB6XzCGcKQENZetX2fNXlrtIzYE=\ -----END CERTIFICATE-----\ \ Buypass Class 2 Root CA\ =======================\ -----BEGIN CERTIFICATE-----\ MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU\ QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X\ DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1\ eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw\ DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1\ g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn\ 9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b\ /+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU\ CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff\ awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI\ zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn\ Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX\ Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs\ M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD\ VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF\ AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s\ A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI\ osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S\ aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd\ DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD\ LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0\ oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC\ wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS\ CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN\ rJgWVqA=\ -----END CERTIFICATE-----\ \ Buypass Class 3 Root CA\ =======================\ -----BEGIN CERTIFICATE-----\ MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU\ QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X\ DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1\ eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw\ DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH\ sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR\ 5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh\ 7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ\ ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH\ 2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV\ /afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ\ RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA\ Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq\ j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD\ VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF\ AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV\ cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G\ uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG\ Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8\ ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2\ KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz\ 6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug\ UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe\ eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi\ Cp/HuZc=\ -----END CERTIFICATE-----\ \ T-TeleSec GlobalRoot Class 3\ ============================\ -----BEGIN CERTIFICATE-----\ MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM\ IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU\ cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx\ MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz\ dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD\ ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3\ DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK\ 9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU\ NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF\ iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W\ 0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA\ MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr\ AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb\ fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT\ ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h\ P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml\ e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==\ -----END CERTIFICATE-----\ \ EE Certification Centre Root CA\ ===============================\ -----BEGIN CERTIFICATE-----\ MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG\ EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy\ dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw\ MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB\ UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy\ ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB\ DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM\ TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2\ rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw\ 93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN\ P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T\ AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ\ MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF\ BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj\ xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM\ lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u\ uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU\ 3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM\ dcGWxZ0=\ -----END CERTIFICATE-----\ \ D-TRUST Root Class 3 CA 2 2009\ ==============================\ -----BEGIN CERTIFICATE-----\ MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK\ DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe\ Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE\ LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw\ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD\ ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA\ BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv\ KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z\ p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC\ AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ\ 4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y\ eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw\ MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G\ PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw\ OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm\ 2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0\ o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV\ dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph\ X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I=\ -----END CERTIFICATE-----\ \ D-TRUST Root Class 3 CA 2 EV 2009\ =================================\ -----BEGIN CERTIFICATE-----\ MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK\ DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw\ OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK\ DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw\ OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS\ egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh\ zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T\ 7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60\ sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35\ 11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv\ cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v\ ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El\ MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp\ b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh\ c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+\ PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05\ nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX\ ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA\ NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv\ w9y4AyHqnxbxLFS1\ -----END CERTIFICATE-----\ \ CA Disig Root R2\ ================\ -----BEGIN CERTIFICATE-----\ MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw\ EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp\ ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx\ EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp\ c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC\ w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia\ xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7\ A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S\ GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV\ g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa\ 5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE\ koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A\ Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i\ Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV\ HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u\ Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM\ tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV\ sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je\ dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8\ 1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx\ mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01\ utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0\ sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg\ UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV\ 7+ZtsH8tZ/3zbBt1RqPlShfppNcL\ -----END CERTIFICATE-----\ \ ACCVRAIZ1\ =========\ -----BEGIN CERTIFICATE-----\ MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB\ SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1\ MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH\ UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC\ DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM\ jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0\ RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD\ aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ\ 0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG\ WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7\ 8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR\ 5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J\ 9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK\ Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw\ Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu\ Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2\ VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM\ Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA\ QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh\ AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA\ YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj\ AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA\ IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk\ aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0\ dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2\ MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI\ hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E\ R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN\ YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49\ nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ\ TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3\ sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h\ I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg\ Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd\ 3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p\ EfbRD0tVNEYqi4Y7\ -----END CERTIFICATE-----\ \ TWCA Global Root CA\ ===================\ -----BEGIN CERTIFICATE-----\ MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT\ CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD\ QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK\ EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg\ Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C\ nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV\ r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR\ Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV\ tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W\ KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99\ sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p\ yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn\ kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI\ zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC\ AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g\ cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn\ LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M\ 8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg\ /eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg\ lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP\ A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m\ i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8\ EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3\ zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0=\ -----END CERTIFICATE-----\ \ TeliaSonera Root CA v1\ ======================\ -----BEGIN CERTIFICATE-----\ MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE\ CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4\ MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW\ VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+\ 6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA\ 3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k\ B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn\ Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH\ oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3\ F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ\ oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7\ gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc\ TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB\ AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW\ DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm\ zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx\ 0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW\ pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV\ G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc\ c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT\ JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2\ qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6\ Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems\ WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=\ -----END CERTIFICATE-----\ \ E-Tugra Certification Authority\ ===============================\ -----BEGIN CERTIFICATE-----\ MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w\ DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls\ ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN\ ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw\ NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx\ QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl\ cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD\ DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A\ MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd\ hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K\ CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g\ ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ\ BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0\ E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz\ rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq\ jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn\ rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5\ dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB\ /wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG\ MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK\ kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO\ XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807\ VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo\ a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc\ dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV\ KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT\ Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0\ 8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G\ C7TbO6Orb1wdtn7os4I07QZcJA==\ -----END CERTIFICATE-----\ \ T-TeleSec GlobalRoot Class 2\ ============================\ -----BEGIN CERTIFICATE-----\ MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM\ IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU\ cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx\ MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz\ dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD\ ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3\ DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ\ SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F\ vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970\ 2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV\ WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA\ MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy\ YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4\ r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf\ vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR\ 3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN\ 9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg==\ -----END CERTIFICATE-----\ \ Atos TrustedRoot 2011\ =====================\ -----BEGIN CERTIFICATE-----\ MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU\ cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4\ MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG\ A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV\ hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr\ 54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+\ DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320\ HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR\ z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R\ l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ\ bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB\ CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h\ k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh\ TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9\ 61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G\ 3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed\ -----END CERTIFICATE-----\ \ QuoVadis Root CA 1 G3\ =====================\ -----BEGIN CERTIFICATE-----\ MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG\ A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv\ b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN\ MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg\ RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE\ PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm\ PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6\ Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN\ ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l\ g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV\ 7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX\ 9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f\ iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg\ t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI\ hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC\ MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3\ GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct\ Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP\ +V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh\ 3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa\ wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6\ O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0\ FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV\ hMJKzRwuJIczYOXD\ -----END CERTIFICATE-----\ \ QuoVadis Root CA 2 G3\ =====================\ -----BEGIN CERTIFICATE-----\ MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG\ A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv\ b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN\ MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg\ RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh\ ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY\ NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t\ oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o\ MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l\ V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo\ L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ\ sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD\ 6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh\ lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI\ hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66\ AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K\ pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9\ x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz\ dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X\ U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw\ mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD\ zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN\ JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr\ O3jtZsSOeWmD3n+M\ -----END CERTIFICATE-----\ \ QuoVadis Root CA 3 G3\ =====================\ -----BEGIN CERTIFICATE-----\ MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG\ A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv\ b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN\ MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg\ RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286\ IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL\ Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe\ 6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3\ I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U\ VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7\ 5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi\ Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM\ dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt\ rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI\ hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px\ KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS\ t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ\ TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du\ DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib\ Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD\ hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX\ 0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW\ dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2\ PpxxVJkES/1Y+Zj0\ -----END CERTIFICATE-----\ \ DigiCert Assured ID Root G2\ ===========================\ -----BEGIN CERTIFICATE-----\ MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG\ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw\ IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw\ MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL\ ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw\ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH\ 35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq\ bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw\ VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP\ YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn\ lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO\ w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv\ 0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz\ d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW\ hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M\ jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo\ IhNzbM8m9Yop5w==\ -----END CERTIFICATE-----\ \ DigiCert Assured ID Root G3\ ===========================\ -----BEGIN CERTIFICATE-----\ MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV\ UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD\ VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1\ MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\ d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ\ BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb\ RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs\ KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF\ UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy\ YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy\ 1vUhZscv6pZjamVFkpUBtA==\ -----END CERTIFICATE-----\ \ DigiCert Global Root G2\ =======================\ -----BEGIN CERTIFICATE-----\ MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG\ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw\ HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx\ MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3\ dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq\ hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ\ kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO\ 3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV\ BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM\ UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB\ o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu\ 5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr\ F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U\ WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH\ QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/\ iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl\ MrY=\ -----END CERTIFICATE-----\ \ DigiCert Global Root G3\ =======================\ -----BEGIN CERTIFICATE-----\ MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV\ UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD\ VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw\ MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k\ aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C\ AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O\ YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP\ BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp\ Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y\ 3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34\ VOKa5Vt8sycX\ -----END CERTIFICATE-----\ \ DigiCert Trusted Root G4\ ========================\ -----BEGIN CERTIFICATE-----\ MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG\ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw\ HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1\ MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\ d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G\ CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp\ pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o\ k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa\ vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY\ QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6\ MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm\ mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7\ f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH\ dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8\ oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud\ DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD\ ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY\ ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr\ yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy\ 7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah\ ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN\ 5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb\ /UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa\ 5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK\ G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP\ 82Z+\ -----END CERTIFICATE-----\ \ COMODO RSA Certification Authority\ ==================================\ -----BEGIN CERTIFICATE-----\ MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE\ BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG\ A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv\ biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC\ R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE\ ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB\ dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn\ dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ\ FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+\ 5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG\ x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX\ 2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL\ OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3\ sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C\ GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5\ WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E\ FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w\ DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt\ rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+\ nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg\ tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW\ sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp\ pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA\ zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq\ ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52\ 7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I\ LaZRfyHBNVOFBkpdn627G190\ -----END CERTIFICATE-----\ \ USERTrust RSA Certification Authority\ =====================================\ -----BEGIN CERTIFICATE-----\ MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE\ BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK\ ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh\ dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE\ BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK\ ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh\ dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz\ 0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j\ Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn\ RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O\ +T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq\ /nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE\ Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM\ lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8\ yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+\ eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd\ BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF\ MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW\ FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ\ 7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ\ Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM\ 8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi\ FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi\ yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c\ J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw\ sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx\ Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9\ -----END CERTIFICATE-----\ \ USERTrust ECC Certification Authority\ =====================================\ -----BEGIN CERTIFICATE-----\ MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC\ VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU\ aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv\ biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC\ VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU\ aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv\ biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2\ 0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez\ nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV\ HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB\ HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu\ 9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=\ -----END CERTIFICATE-----\ \ GlobalSign ECC Root CA - R4\ ===========================\ -----BEGIN CERTIFICATE-----\ MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb\ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD\ EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb\ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD\ EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl\ OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P\ AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV\ MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF\ JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q=\ -----END CERTIFICATE-----\ \ GlobalSign ECC Root CA - R5\ ===========================\ -----BEGIN CERTIFICATE-----\ MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb\ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD\ EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb\ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD\ EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6\ SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS\ h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd\ BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx\ uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7\ yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3\ -----END CERTIFICATE-----\ \ Staat der Nederlanden Root CA - G3\ ==================================\ -----BEGIN CERTIFICATE-----\ MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE\ CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g\ Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC\ TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l\ ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y\ olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t\ x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy\ EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K\ Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur\ mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5\ 1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp\ 07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo\ FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE\ 41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB\ AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu\ yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD\ U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq\ KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1\ v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA\ 8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b\ 8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r\ mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq\ 1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI\ JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV\ tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk=\ -----END CERTIFICATE-----\ \ Staat der Nederlanden EV Root CA\ ================================\ -----BEGIN CERTIFICATE-----\ MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE\ CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g\ RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M\ MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl\ cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk\ SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW\ O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r\ 0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8\ Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV\ XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr\ 08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV\ 0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd\ 74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx\ fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC\ MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa\ ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI\ eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu\ c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq\ 5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN\ b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN\ f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi\ 5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4\ WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK\ DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy\ eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg==\ -----END CERTIFICATE-----\ \ IdenTrust Commercial Root CA 1\ ==============================\ -----BEGIN CERTIFICATE-----\ MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG\ EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS\ b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES\ MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB\ IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld\ hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/\ mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi\ 1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C\ XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl\ 3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy\ NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV\ WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg\ xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix\ uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC\ AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI\ hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH\ 6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg\ ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt\ ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV\ YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX\ feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro\ kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe\ 2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz\ Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R\ cGzM7vRX+Bi6hG6H\ -----END CERTIFICATE-----\ \ IdenTrust Public Sector Root CA 1\ =================================\ -----BEGIN CERTIFICATE-----\ MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG\ EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv\ ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV\ UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS\ b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy\ P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6\ Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI\ rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf\ qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS\ mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn\ ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh\ LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v\ iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL\ 4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B\ Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw\ DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj\ t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A\ mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt\ GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt\ m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx\ NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4\ Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI\ ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC\ ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ\ 3Wl9af0AVqW3rLatt8o+Ae+c\ -----END CERTIFICATE-----\ \ Entrust Root Certification Authority - G2\ =========================================\ -----BEGIN CERTIFICATE-----\ MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV\ BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy\ bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug\ b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw\ HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT\ DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx\ OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s\ eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi\ MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP\ /vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz\ HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU\ s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y\ TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx\ AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6\ 0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z\ iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ\ Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi\ nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+\ vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO\ e4pIb4tF9g==\ -----END CERTIFICATE-----\ \ Entrust Root Certification Authority - EC1\ ==========================================\ -----BEGIN CERTIFICATE-----\ MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx\ FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn\ YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl\ ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5\ IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw\ FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs\ LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg\ dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt\ IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy\ AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef\ 9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE\ FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h\ vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8\ kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G\ -----END CERTIFICATE-----\ \ CFCA EV ROOT\ ============\ -----BEGIN CERTIFICATE-----\ MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE\ CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB\ IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw\ MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD\ DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV\ BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD\ 7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN\ uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW\ ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7\ xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f\ py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K\ gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol\ hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ\ tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf\ BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB\ /wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB\ ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q\ ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua\ 4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG\ E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX\ BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn\ aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy\ PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX\ kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C\ ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su\ -----END CERTIFICATE-----\ \ Certinomis - Root CA\ ====================\ -----BEGIN CERTIFICATE-----\ MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjETMBEGA1UEChMK\ Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAbBgNVBAMTFENlcnRpbm9taXMg\ LSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMzMTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIx\ EzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRD\ ZXJ0aW5vbWlzIC0gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQos\ P5L2fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJflLieY6pOo\ d5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQVWZUKxkd8aRi5pwP5ynap\ z8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDFTKWrteoB4owuZH9kb/2jJZOLyKIOSY00\ 8B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09x\ RLWtwHkziOC/7aOgFLScCbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE\ 6OXWk6RiwsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJwx3t\ FvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SGm/lg0h9tkQPTYKbV\ PZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4F2iw4lNVYC2vPsKD2NkJK/DAZNuH\ i5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZngWVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGj\ YzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I\ 6tNxIqSSaHh02TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF\ AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/0KGRHCwPT5iV\ WVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWwF6YSjNRieOpWauwK0kDDPAUw\ Pk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZSg081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAX\ lCOotQqSD7J6wWAsOMwaplv/8gzjqh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJ\ y29SWwNyhlCVCNSNh4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9\ Iff/ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8Vbtaw5Bng\ DwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwjY/M50n92Uaf0yKHxDHYi\ I0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nM\ cyrDflOR1m749fPH0FFNjkulW+YZFzvWgQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVr\ hkIGuUE=\ -----END CERTIFICATE-----\ \ OISTE WISeKey Global Root GB CA\ ===============================\ -----BEGIN CERTIFICATE-----\ MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG\ EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl\ ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw\ MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD\ VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds\ b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX\ scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP\ rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk\ 9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o\ Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg\ GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB\ /zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI\ hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD\ dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0\ VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui\ HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic\ Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=\ -----END CERTIFICATE-----\ \ SZAFIR ROOT CA2\ ===============\ -----BEGIN CERTIFICATE-----\ MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG\ A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV\ BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ\ BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD\ VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q\ qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK\ DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE\ 2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ\ ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi\ ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P\ AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC\ AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5\ O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67\ oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul\ 4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6\ +/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw==\ -----END CERTIFICATE-----\ \ Certum Trusted Network CA 2\ ===========================\ -----BEGIN CERTIFICATE-----\ MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE\ BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1\ bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y\ ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ\ TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl\ cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB\ IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9\ 7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o\ CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b\ Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p\ uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130\ GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ\ 9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB\ Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye\ hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM\ BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\ AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI\ hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW\ Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA\ L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo\ clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM\ pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb\ w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo\ J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm\ ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX\ is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7\ zAYspsbiDrW5viSP\ -----END CERTIFICATE-----\ \ Hellenic Academic and Research Institutions RootCA 2015\ =======================================================\ -----BEGIN CERTIFICATE-----\ MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT\ BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0\ aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl\ YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx\ MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg\ QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV\ BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw\ MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv\ bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh\ iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+\ 6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd\ FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr\ i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F\ GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2\ fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu\ iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc\ Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI\ hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+\ D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM\ d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y\ d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn\ 82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb\ davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F\ Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt\ J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa\ JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q\ p/UsQu0yrbYhnr68\ -----END CERTIFICATE-----\ \ Hellenic Academic and Research Institutions ECC RootCA 2015\ ===========================================================\ -----BEGIN CERTIFICATE-----\ MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0\ aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u\ cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj\ aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw\ MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj\ IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD\ VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290\ Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP\ dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK\ Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O\ BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA\ GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn\ dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR\ -----END CERTIFICATE-----\ \ ISRG Root X1\ ============\ -----BEGIN CERTIFICATE-----\ MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE\ BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD\ EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG\ EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT\ DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r\ Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1\ 3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K\ b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN\ Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ\ 4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf\ 1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu\ hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH\ usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r\ OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G\ A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY\ 9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\ ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV\ 0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt\ hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw\ TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx\ e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA\ JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD\ YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n\ JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ\ m+kXQ99b21/+jh5Xos1AnX5iItreGCc=\ -----END CERTIFICATE-----\ \ AC RAIZ FNMT-RCM\ ================\ -----BEGIN CERTIFICATE-----\ MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT\ AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw\ MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD\ TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC\ ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf\ qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr\ btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL\ j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou\ 08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw\ WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT\ tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ\ 47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC\ ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa\ i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE\ FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o\ dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD\ nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s\ D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ\ j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT\ Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW\ +YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7\ Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d\ 8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm\ 5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG\ rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM=\ -----END CERTIFICATE-----\ \ Amazon Root CA 1\ ================\ -----BEGIN CERTIFICATE-----\ MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD\ VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1\ MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv\ bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\ ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH\ FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ\ gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t\ dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce\ VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB\ /zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3\ DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM\ CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy\ 8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa\ 2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2\ xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5\ -----END CERTIFICATE-----\ \ Amazon Root CA 2\ ================\ -----BEGIN CERTIFICATE-----\ MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD\ VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1\ MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv\ bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC\ ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4\ kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp\ N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9\ AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd\ fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx\ kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS\ btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0\ Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN\ c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+\ 3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw\ DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA\ A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY\ +gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE\ YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW\ xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ\ gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW\ aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV\ Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3\ KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi\ JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw=\ -----END CERTIFICATE-----\ \ Amazon Root CA 3\ ================\ -----BEGIN CERTIFICATE-----\ MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG\ EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy\ NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ\ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB\ f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr\ Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43\ rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc\ eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw==\ -----END CERTIFICATE-----\ \ Amazon Root CA 4\ ================\ -----BEGIN CERTIFICATE-----\ MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG\ EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy\ NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ\ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN\ /sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri\ 83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV\ HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA\ MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1\ AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA==\ -----END CERTIFICATE-----\ \ LuxTrust Global Root 2\ ======================\ -----BEGIN CERTIFICATE-----\ MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQELBQAwRjELMAkG\ A1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNVBAMMFkx1eFRydXN0IEdsb2Jh\ bCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUwMzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEW\ MBQGA1UECgwNTHV4VHJ1c3QgUy5BLjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCC\ AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wm\ Kb3FibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTemhfY7RBi2\ xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1EMShduxq3sVs35a0VkBC\ wGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsnXpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm\ 1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkm\ FRseTJIpgp7VkoGSQXAZ96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niF\ wpN6cj5mj5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4gDEa/\ a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+8kPREd8vZS9kzl8U\ ubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2jX5t/Lax5Gw5CMZdjpPuKadUiDTSQ\ MC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmHhFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB\ /zBCBgNVHSAEOzA5MDcGByuBKwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5\ Lmx1eHRydXN0Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT\ +Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQELBQADggIBAGoZ\ FO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9BzZAcg4atmpZ1gDlaCDdLnIN\ H2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTOjFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW\ 7MM3LGVYvlcAGvI1+ut7MV3CwRI9loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIu\ ZY+kt9J/Z93I055cqqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWA\ VWe+2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/JEAdemrR\ TxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKrezrnK+T+Tb/mjuuqlPpmt\ /f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQfLSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc\ 7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31I\ iyBMz2TWuJdGsE7RKlY6oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr\ -----END CERTIFICATE-----\ \ TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1\ =============================================\ -----BEGIN CERTIFICATE-----\ MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT\ D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr\ IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g\ TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp\ ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD\ VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt\ c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth\ bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11\ IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\ MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8\ 6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc\ wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0\ 3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9\ WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU\ ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ\ KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh\ AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc\ lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R\ e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j\ q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM=\ -----END CERTIFICATE-----\ \ GDCA TrustAUTH R5 ROOT\ ======================\ -----BEGIN CERTIFICATE-----\ MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw\ BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD\ DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow\ YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ\ IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B\ AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs\ AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p\ OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr\ pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ\ 9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ\ xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM\ R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ\ D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4\ oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx\ 9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR\ MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg\ p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9\ H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35\ 6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd\ +PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ\ HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD\ F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ\ 8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv\ /EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT\ aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g==\ -----END CERTIFICATE-----\ \ TrustCor RootCert CA-1\ ======================\ -----BEGIN CERTIFICATE-----\ MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYDVQQGEwJQQTEP\ MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig\ U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp\ dHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkx\ MjMxMTcyMzE2WjCBpDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFu\ YW1hIENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUGA1UECwwe\ VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZUcnVzdENvciBSb290Q2Vy\ dCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv463leLCJhJrMxnHQFgKq1mq\ jQCj/IDHUHuO1CAmujIS2CNUSSUQIpidRtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4\ pQa81QBeCQryJ3pS/C3Vseq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0\ JEsq1pme9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CVEY4h\ gLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorWhnAbJN7+KIor0Gqw\ /Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/DeOxCbeKyKsZn3MzUOcwHwYDVR0j\ BBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\ AYYwDQYJKoZIhvcNAQELBQADggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5\ mDo4Nvu7Zp5I/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf\ ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZyonnMlo2HD6C\ qFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djtsL1Ac59v2Z3kf9YKVmgenFK+P\ 3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdNzl/HHk484IkzlQsPpTLWPFp5LBk=\ -----END CERTIFICATE-----\ \ TrustCor RootCert CA-2\ ======================\ -----BEGIN CERTIFICATE-----\ MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNVBAYTAlBBMQ8w\ DQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQwIgYDVQQKDBtUcnVzdENvciBT\ eXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0\ eTEfMB0GA1UEAwwWVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEy\ MzExNzI2MzlaMIGkMQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5h\ bWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U\ cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0\ IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnIG7CKqJiJJWQdsg4foDSq8Gb\ ZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9Nk\ RvRUqdw6VC0xK5mC8tkq1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1\ oYxOdqHp2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nKDOOb\ XUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hapeaz6LMvYHL1cEksr1\ /p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF3wP+TfSvPd9cW436cOGlfifHhi5q\ jxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQP\ eSghYA2FFn3XVDjxklb9tTNMg9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+Ctg\ rKAmrhQhJ8Z3mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh\ 8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAdBgNVHQ4EFgQU\ 2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6UnrybPZx9mCAZ5YwwYrIwDwYD\ VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/h\ Osh80QA9z+LqBrWyOrsGS2h60COXdKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnp\ kpfbsEZC89NiqpX+MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv\ 2wnL/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RXCI/hOWB3\ S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYaZH9bDTMJBzN7Bj8RpFxw\ PIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dv\ DDqPys/cA8GiCcjl/YBeyGBCARsaU1q7N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYU\ RpFHmygk71dSTlxCnKr3Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANE\ xdqtvArBAs8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp5KeX\ RKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu1uwJ\ -----END CERTIFICATE-----\ \ TrustCor ECA-1\ ==============\ -----BEGIN CERTIFICATE-----\ MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYDVQQGEwJQQTEP\ MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig\ U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp\ dHkxFzAVBgNVBAMMDlRydXN0Q29yIEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3Mjgw\ N1owgZwxCzAJBgNVBAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5\ MSQwIgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29y\ IENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3IgRUNBLTEwggEiMA0GCSqG\ SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb3w9U73NjKYKtR8aja+3+XzP4Q1HpGjOR\ MRegdMTUpwHmspI+ap3tDvl0mEDTPwOABoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23\ xFUfJ3zSCNV2HykVh0A53ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmc\ p0yJF4OuowReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/wZ0+\ fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZFZtS6mFjBAgMBAAGj\ YzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAfBgNVHSMEGDAWgBREnkj1zG1I1KBL\ f/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF\ AAOCAQEABT41XBVwm8nHc2FvcivUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u\ /ukZMjgDfxT2AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F\ hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50soIipX1TH0Xs\ J5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BIWJZpTdwHjFGTot+fDz2LYLSC\ jaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1WitJ/X5g==\ -----END CERTIFICATE-----\ \ SSL.com Root Certification Authority RSA\ ========================================\ -----BEGIN CERTIFICATE-----\ MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxDjAM\ BgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24x\ MTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYw\ MjEyMTczOTM5WhcNNDEwMjEyMTczOTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx\ EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NM\ LmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcNAQEBBQAD\ ggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2RxFdHaxh3a3by/ZPkPQ/C\ Fp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aXqhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8\ P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcCC52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/ge\ oeOy3ZExqysdBP+lSgQ36YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkp\ k8zruFvh/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrFYD3Z\ fBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93EJNyAKoFBbZQ+yODJ\ gUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVcUS4cK38acijnALXRdMbX5J+tB5O2\ UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi8\ 1xtZPCvM8hnIk2snYxnP/Okm+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4s\ bE6x/c+cCbqiM+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV\ HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4GA1UdDwEB/wQE\ AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGVcpNxJK1ok1iOMq8bs3AD/CUr\ dIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBcHadm47GUBwwyOabqG7B52B2ccETjit3E+ZUf\ ijhDPwGFpUenPUayvOUiaPd7nNgsPgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAsl\ u1OJD7OAUN5F7kR/q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjq\ erQ0cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jra6x+3uxj\ MxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90IH37hVZkLId6Tngr75qNJ\ vTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/YK9f1JmzJBjSWFupwWRoyeXkLtoh/D1JI\ Pb9s2KJELtFOt3JY04kTlf5Eq/jXixtunLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406y\ wKBjYZC6VWg3dGq2ktufoYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NI\ WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k=\ -----END CERTIFICATE-----\ \ SSL.com Root Certification Authority ECC\ ========================================\ -----BEGIN CERTIFICATE-----\ MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV\ BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv\ BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy\ MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO\ BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv\ bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA\ BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+\ 8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR\ hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT\ jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW\ e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z\ 5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl\ -----END CERTIFICATE-----\ \ SSL.com EV Root Certification Authority RSA R2\ ==============================================\ -----BEGIN CERTIFICATE-----\ MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w\ DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u\ MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy\ MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI\ DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD\ VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN\ BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh\ hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w\ cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO\ Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+\ B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh\ CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim\ 9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto\ RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm\ JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48\ +qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV\ HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp\ qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1\ ++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx\ Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G\ guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz\ OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7\ CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq\ lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR\ rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1\ hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX\ 9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w==\ -----END CERTIFICATE-----\ \ SSL.com EV Root Certification Authority ECC\ ===========================================\ -----BEGIN CERTIFICATE-----\ MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV\ BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy\ BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw\ MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx\ EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM\ LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB\ BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy\ 3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O\ BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe\ 5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ\ N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm\ m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg==\ -----END CERTIFICATE-----\ \ GlobalSign Root CA - R6\ =======================\ -----BEGIN CERTIFICATE-----\ MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX\ R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds\ b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i\ YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs\ U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss\ grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE\ 3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF\ vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM\ PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+\ azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O\ WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy\ CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP\ 0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN\ b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE\ AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV\ HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN\ nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0\ lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY\ BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym\ Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr\ 3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1\ 0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T\ uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK\ oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t\ JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA=\ -----END CERTIFICATE-----\ \ OISTE WISeKey Global Root GC CA\ ===============================\ -----BEGIN CERTIFICATE-----\ MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD\ SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo\ MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa\ Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL\ ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh\ bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr\ VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab\ NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd\ BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E\ AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk\ AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9\ -----END CERTIFICATE-----\ "; #ifdef __cplusplus } #endif gsoap-2.8.91/gsoap/plugin/logging.h0000644000175000017500000000742413525245161016505 0ustar ellertellert/* logging.h Message logging plugin and message stats collector Register the plugin with: #include "plugin/logging.h" soap_register_plugin(soap, logging); Set or change logging destinations: soap_set_logging_inbound(struct soap*, FILE*); soap_set_logging_outbound(struct soap*, FILE*); Turn logging off by passing NULL FILE* descriptor. To obtain stats (sent and recv byte count): soap_get_logging_stats(soap, size_t *sent, size_t *recv); where sent and recv will be set to the number of bytes sent (outbound) and received (inbound) in total, respectively. The stats are collected even when inbound and outbound logging is turned off. To reset the stats: soap_reset_loggin_stats(soap); 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, 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-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 -------------------------------------------------------------------------------- */ #ifndef LOGGING_H #define LOGGING_H #include "stdsoap2.h" #ifdef __cplusplus extern "C" { #endif #define LOGGING_ID "SOAP-LOGGING/1.4" extern const char logging_id[]; struct logging_data { FILE *inbound; FILE *outbound; size_t stat_sent; size_t stat_recv; int (*fsend)(struct soap*, const char*, size_t); /* to save and use send callback */ size_t (*frecv)(struct soap*, char*, size_t); /* to save and use recv callback */ }; SOAP_FMAC1 int SOAP_FMAC2 logging(struct soap *soap, struct soap_plugin *plugin, void *arg); SOAP_FMAC1 void SOAP_FMAC2 soap_set_logging_inbound(struct soap *soap, FILE *fd); SOAP_FMAC1 void SOAP_FMAC2 soap_set_logging_outbound(struct soap *soap, FILE *fd); SOAP_FMAC1 void SOAP_FMAC2 soap_logging_stats(struct soap *soap, size_t *sent, size_t *recv); SOAP_FMAC1 void SOAP_FMAC2 soap_reset_logging_stats(struct soap *soap); #ifdef __cplusplus } #endif #endif gsoap-2.8.91/gsoap/plugin/httppost.h0000644000175000017500000000665713525245161016753 0ustar ellertellert/* httppost.h gSOAP HTTP POST plugin for non-SOAP payloads. See httppost.c for instructions. Revisions: register multiple POST content handlers, each for a content type gSOAP XML Web services tools Copyright (C) 2000-2018, Robert van Engelen, Genivia, Inc. All Rights Reserved. -------------------------------------------------------------------------------- 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-2004 Robert A. 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. -------------------------------------------------------------------------------- */ #ifndef HTTPPOST_H #define HTTPPOST_H #include "stdsoap2.h" #ifdef __cplusplus extern "C" { #endif #define HTTP_POST_ID "SOAP-HTTP-POST/2.1" /* plugin identification */ extern const char http_post_id[]; typedef int (*http_handler_t)(struct soap*); struct http_post_handlers { const char *type; http_handler_t handler; }; /* This is the local plugin data shared among all copies of the soap struct: */ struct http_post_data { int (*fparsehdr)(struct soap*, const char*, const char*); /* to save and call the internal HTTP header parser */ int (*fput)(struct soap*); /* to save */ int (*fpatch)(struct soap*); /* to save */ int (*fdel)(struct soap*); /* to save */ struct http_post_handlers *handlers; /* the server-side POST content type handlers */ }; /* the http post plugin, note: argument should be a table of type-handler pairs */ int http_post(struct soap*, struct soap_plugin*, void*); /* deprecated: use soap_POST instead */ int soap_post_connect(struct soap*, const char *endpoint, const char *action, const char *type); /* deprecated: use soap_PUT instead */ int soap_put_connect(struct soap*, const char *endpoint, const char *action, const char *type); /* deprecated: use soap_DELETE instead */ int soap_delete_connect(struct soap*, const char *endpoint); /* deprecated: use soap_get_http_body instead */ int soap_http_body(struct soap*, char **buf, size_t *len); #ifdef __cplusplus } #endif #endif gsoap-2.8.91/gsoap/plugin/httppost.c0000644000175000017500000003031413525245161016731 0ustar ellertellert/* httppost.c gSOAP HTTP POST/PUT/DELETE plugin for SOAP and non-SOAP payloads. See instructions below. Revisions: register multiple POST content handlers, each for a content type Note: multipart/related and multipart/form-data are already handled in gSOAP. gSOAP XML Web services tools Copyright (C) 2000-2018, Robert van Engelen, Genivia, Inc. All Rights Reserved. -------------------------------------------------------------------------------- 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-2018 Robert A. 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. -------------------------------------------------------------------------------- Compile & link with stand-alone gSOAP server. Usage (server side): Define a NULL-terminated array of type-handler pairs, each with a media type and a the handler function: struct http_post_handlers my_handlers[] = { { "application/json", json_handler }, { "image/jpg", jpeg_handler }, { "text/html", html_handler }, { "POST", generic_POST_handler }, { "PUT", generic_PUT_handler }, { "PATCH", generic_PATCH_handler }, { "DELETE", generic_DELETE_handler }, { NULL } }; Note that `*` and `-` can be used as wildcards to match any text and any character, respectively: { "image*", image_handler }, { "text*", text_handler }, { "text/---", three_char_type_text_handler }, In the above, to be more accurate, we should use a slash / between image and the wildcard * (which is not shown in the table above due to compilers throwing a fit at the / and * combo in this comment block). Media types may have optional parameters after `;` such as `charset` and `boundary`. These parameters can be matched by the media type patterns in the table. Patterns that are more specific must precede patterns that are less specific in the table. For example, `"text/xml;*charset=utf-8*"` must precede `"text/xml"` which must precede `"text*"`. Note that `"text/xml"` also matches any parameters of the media type of the message reveived, such as `"text/xml; charset=utf-8"` (only since gSOAP version 2.8.75). Each handler is a function that takes the soap context as a parameter and returns SOAP_OK or an error code. Register the plugin and the handlers: struct soap soap; soap_init(&soap); soap_register_plugin_arg(&soap, http_post, my_handlers); ... ... = soap_copy(&soap); // copies plugin too but not its data: plugin data is shared since fcopy is not set ... soap_done(&soap); // delete plugin (calls plugin->fdelete) A POST handler function is triggered by the media type in the http_post_handlers table. Use http_http_get_body() as below to retrieve HTTP POST body data: int image_handler(struct soap *soap) { const char *buf; size_t len; // if necessary, check type in soap->http_content if (soap->http_content && soap_tag_cmp(soap->http_content, "image/gif")) return 404; buf = soap_http_get_body(soap, &len); if (!buf) return soap->error; soap_end_recv(soap); ... // process image in buf[0..len-1] // reply with empty HTTP OK response: return soap_send_empty_response(soap, SOAP_OK); } This function should also produce a valid HTTP response, for example: if (we want to return HTML) { if (soap_response(soap, SOAP_HTML) // use this to return HTML... || soap_send(soap, "..."); // example HTML || ... || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } else { soap->http_content = "image/jpeg"; // a jpeg image if (soap_response(soap, SOAP_FILE) // SOAP_FILE sets custom http content || soap_send_raw(soap, ..., ...); || ... || soap_end_send(soap)) return soap_closesock(soap); return SOAP_OK; } The soap_send(soap, char*) and soap_send_raw(soap, char*, size_t) can be used to return content from server. The soap_response(soap, SOAP_FILE) call returns a HTTP 200 OK response with the HTTP content-type header set to soap->http_content. To return a http error status code use soap_response(soap, SOAP_FILE + status) with status between 200 and 599 or 0. Usage (client side): char *buf; // to hold the HTTP response body data size_t len; ... if (soap_post_connect(soap, "URL", "SOAP action or NULL", "media type") || soap_send(soap, ...) || soap_end_send(soap)) ... // error if (soap_begin_recv(&soap) || soap_http_body(&soap, &buf, &len) || soap_end_recv(&soap)) ... // error ... // use buf[0..len-1] soap_closesock(soap); // close, but keep open only with HTTP keep-alive soap_end(soap); // also deletes buf content The soap_send(soap, char*) and soap_send_raw(soap, char*, size_t) can be used to send content to the server as shown above. */ #include "httppost.h" #ifdef __cplusplus extern "C" { #endif const char http_post_id[] = HTTP_POST_ID; static int http_post_init(struct soap *soap, struct http_post_data *data, struct http_post_handlers *handlers); static void http_post_delete(struct soap *soap, struct soap_plugin *p); static int http_post_parse_header(struct soap *soap, const char*, const char*); static http_handler_t http_lookup_handler(struct soap *soap, const char *type, struct http_post_data *data); static int http_fput(struct soap *soap); static int http_fpatch(struct soap *soap); static int http_fdel(struct soap *soap); int http_post(struct soap *soap, struct soap_plugin *p, void *arg) { p->id = http_post_id; p->data = (void*)SOAP_MALLOC(soap, sizeof(struct http_post_data)); p->fdelete = http_post_delete; if (!p->data) return SOAP_EOM; if (http_post_init(soap, (struct http_post_data*)p->data, (struct http_post_handlers *)arg)) { SOAP_FREE(soap, p->data); /* error: could not init */ return SOAP_EOM; /* return error */ } return SOAP_OK; } static int http_post_init(struct soap *soap, struct http_post_data *data, struct http_post_handlers *handlers) { data->fparsehdr = soap->fparsehdr; /* save old HTTP header parser callback */ soap->fparsehdr = http_post_parse_header; /* replace HTTP header parser callback with ours */ data->fput = soap->fput; soap->fput = http_fput; data->fpatch = soap->fpatch; soap->fpatch = http_fpatch; data->fdel = soap->fdel; soap->fdel = http_fdel; data->handlers = handlers; return SOAP_OK; } static void http_post_delete(struct soap *soap, struct soap_plugin *p) { soap->fparsehdr = ((struct http_post_data*)p->data)->fparsehdr; soap->fput = ((struct http_post_data*)p->data)->fput; soap->fpatch = ((struct http_post_data*)p->data)->fpatch; soap->fdel = ((struct http_post_data*)p->data)->fdel; SOAP_FREE(soap, p->data); /* free allocated plugin data (this function is not called for shared plugin data, but only when the final soap_done() is invoked on the original soap struct) */ } static int http_post_parse_header(struct soap *soap, const char *key, const char *val) { struct http_post_data *data = (struct http_post_data*)soap_lookup_plugin(soap, http_post_id); if (!data) return SOAP_PLUGIN_ERROR; if (data->fparsehdr(soap, key, val)) /* parse HTTP header */ return soap->error; if (!soap_tag_cmp(key, "Content-Type")) /* check content type */ soap->fform = http_lookup_handler(soap, val, data); if (!soap->fform) soap->fform = http_lookup_handler(soap, "POST", data); return soap->error; } static http_handler_t http_lookup_handler(struct soap *soap, const char *type, struct http_post_data *data) { struct http_post_handlers *p; const char *params = strchr(type, ';'); char temp[SOAP_HDRLEN]; (void)soap; if (params) { size_t n = params - type; soap_strncpy(temp, sizeof(temp), type, n); temp[n] = '\0'; } for (p = data->handlers; p && p->type; p++) { if (params) { if (strchr(p->type, ';')) { if (!soap_tag_cmp(type, p->type)) break; } else if (!soap_tag_cmp(temp, p->type)) { break; } } else if (!soap_tag_cmp(type, p->type)) { break; } } if (p && p->type) { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Found HTTP POST plugin handler for '%s'\n", type)); return p->handler; } return NULL; } static int http_fput(struct soap *soap) { int (*fform)(struct soap*); struct http_post_data *data = (struct http_post_data*)soap_lookup_plugin(soap, http_post_id); if (!data) return SOAP_PLUGIN_ERROR; fform = http_lookup_handler(soap, "PUT", data); if (fform) return fform(soap); return data->fput(soap); } static int http_fpatch(struct soap *soap) { int (*fform)(struct soap*); struct http_post_data *data = (struct http_post_data*)soap_lookup_plugin(soap, http_post_id); if (!data) return SOAP_PLUGIN_ERROR; fform = http_lookup_handler(soap, "PATCH", data); if (fform) return fform(soap); return data->fpatch(soap); } static int http_fdel(struct soap *soap) { int (*fform)(struct soap*); struct http_post_data *data = (struct http_post_data*)soap_lookup_plugin(soap, http_post_id); if (!data) return SOAP_PLUGIN_ERROR; fform = http_lookup_handler(soap, "DELETE", data); if (fform) return fform(soap); return data->fdel(soap); } /******************************************************************************/ /* deprecated: use soap_POST instead */ int soap_post_connect(struct soap *soap, const char *endpoint, const char *action, const char *type) { return soap_POST(soap, endpoint, action, type); } /* deprecated: use soap_PUT instead */ int soap_put_connect(struct soap *soap, const char *endpoint, const char *action, const char *type) { return soap_PUT(soap, endpoint, action, type); } /* deprecated: use soap_DELETE instead */ int soap_delete_connect(struct soap *soap, const char *endpoint) { return soap_DELETE(soap, endpoint); } /* deprecated: use soap_http_get_body instead */ int soap_http_body(struct soap *soap, char **buf, size_t *len) { *buf = soap_http_get_body(soap, len); if (*buf) return SOAP_OK; return soap->error; } /******************************************************************************/ #ifdef __cplusplus } #endif gsoap-2.8.91/gsoap/plugin/httpget.c0000644000175000017500000002251313525245161016525 0ustar ellertellert/* httpget.c gSOAP HTTP GET plugin. See instructions below. 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, 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-2008 Robert A. 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. -------------------------------------------------------------------------------- Compile & link with stand-alone gSOAP server for HTTP GET support. Compile & link with gSOAP clients for client-side HTTP GET requests. Usage (server side): struct soap soap; soap_init(&soap); soap_register_plugin_arg(&soap, http_get, http_get_handler); ... ... = soap_copy(&soap); // copies plugin too but not its data: plugin data is shared since fcopy is not set ... soap_done(&soap); // detach plugin (calls plugin->fdelete) You need to define a HTTP GET handling function at the server-side: int http_get_handler(struct soap*) which will be called from the plugin upon an HTTP GET request. The function should return an error code or SOAP_OK; This function should produce a valid HTTP response, for example: soap_response(soap, SOAP_HTML); // use this to return HTML ... soap_response(soap, SOAP_OK); // ... or use this to return a SOAP message ... soap_send(soap, "..."); // example HTML ... soap_end_send(soap); To get query string key-value pairs within a service routine, use: char *s; s = soap_query(soap); while (s) { char *key = soap_query_key(soap, &s); char *val = soap_query_val(soap, &s); ... } This will garble soap->path, which contains the HTTP path of the form: /path?query where path and/or ?query may be absent. The path info is obtained from the HTTP request URL: http://domain/path?query The URL should not exceed the length of SOAP_TAGLEN. Adjust SOAP_TAGLEN in stdsoap2.h if necessary. Usage (client side): For SOAP GET method calls, declare the service method with protocol GET: //gsoap ns service method-protocol: someMethod GET int ns__someMethod(... in-params ..., struct ns__someMethodResponse { ... out-params ... } *); and to make the call in your code: struct ns__someMethodResponse res; soap_call_ns__someMethod(soap, "endpoint", "action", ... in-params ...., &res) Client code for non-SOAP REST GET: To use general HTTP GET, for example to retrieve an HTML document, use: struct soap soap; char *buf = NULL; size_t len = 0; soap_init(&soap); if (soap_GET(&soap, endpoint, action) || soap_begin_recv(&soap)) ... connect/recv error ... else buf = soap_http_get_body(&soap, &len); soap_end_recv(&soap); ... process data in buf[0..len-1] soap_destroy(&soap); soap_end(&soap); soap_done(&soap); The soap_http_get_body() function above returns the HTTP body content as a string. */ #include "httpget.h" #ifdef __cplusplus extern "C" { #endif const char http_get_id[] = HTTP_GET_ID; static int http_get_init(struct soap *soap, struct http_get_data *data, int (*handler)(struct soap*)); static void http_get_delete(struct soap *soap, struct soap_plugin *p); static int http_get_parse(struct soap *soap); static int http_get_handler(struct soap *soap); int http_get(struct soap *soap, struct soap_plugin *p, void *arg) { p->id = http_get_id; p->data = (void*)SOAP_MALLOC(soap, sizeof(struct http_get_data)); /* p->fcopy = http_get_copy; obsolete, see note with http_get_copy() */ p->fdelete = http_get_delete; if (!p->data) return SOAP_EOM; if (http_get_init(soap, (struct http_get_data*)p->data, (int (*)(struct soap*))arg)) { SOAP_FREE(soap, p->data); /* error: could not init */ return SOAP_EOM; /* return error */ } return SOAP_OK; } static int http_get_init(struct soap *soap, struct http_get_data *data, int (*handler)(struct soap*)) { data->fparse = soap->fparse; /* save old HTTP header parser callback */ data->fget = handler; data->stat_get = 0; data->stat_post = 0; data->stat_fail = 0; memset((void*)data->hist_min, 0, sizeof(data->hist_min)); memset((void*)data->hist_hour, 0, sizeof(data->hist_hour)); memset((void*)data->hist_day, 0, sizeof(data->hist_day)); soap->fparse = http_get_parse; /* replace HTTP header parser callback with ours */ soap->fget = http_get_handler; /* replace HTTP GET callback with ours */ return SOAP_OK; } /* We will share the plugin data among all soap copies created with soap_copy(), so we don't have to define this static int http_get_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) { *dst = *src; return SOAP_OK; } */ static void http_get_delete(struct soap *soap, struct soap_plugin *p) { (void)soap; SOAP_FREE(soap, p->data); /* free allocated plugin data (this function is not called for shared plugin data, but only when the final soap_done() is invoked on the original soap struct) */ } static int http_get_parse(struct soap *soap) { #ifndef WITH_LEAN time_t t; struct tm T, *pT; #endif struct http_get_data *data = (struct http_get_data*)soap_lookup_plugin(soap, http_get_id); if (!data) return SOAP_PLUGIN_ERROR; #ifndef WITH_LEAN time(&t); #ifdef HAVE_LOCALTIME_R pT = localtime_r(&t, &T); #else pT = localtime(&t); #endif /* updates should be in mutex, but we don't mind some inaccuracy in the count to preserve performance */ data->hist_day[pT->tm_yday]++; data->hist_day[(pT->tm_yday + 1) % 365] = 0; data->hist_hour[pT->tm_hour]++; data->hist_hour[(pT->tm_hour + 1) % 24] = 0; data->hist_min[pT->tm_min]++; data->hist_min[(pT->tm_min + 1) % 60] = 0; #endif soap->error = data->fparse(soap); /* parse HTTP header */ if (!soap->error) { if (soap->status == SOAP_POST) data->stat_post++; /* update should be in mutex, but we don't mind some inaccuracy in the count */ } else { data->stat_fail++; /* update should be in mutex, but we don't mind some inaccuracy in the count */ } return soap->error; } /******************************************************************************/ static int http_get_handler(struct soap *soap) { struct http_get_data *data = (struct http_get_data*)soap_lookup_plugin(soap, http_get_id); if (!data) return SOAP_PLUGIN_ERROR; soap->error = data->fget(soap); /* call user-defined HTTP GET handler */ if (soap->error) { /* update should be in mutex, but we don't mind some inaccuracy in the count */ data->stat_fail++; return soap->error; } /* update should be in mutex, but we don't mind some inaccuracy in the count */ data->stat_get++; return SOAP_OK; } /******************************************************************************/ void soap_http_get_stats(struct soap *soap, size_t *stat_get, size_t *stat_post, size_t *stat_fail, size_t **hist_min, size_t **hist_hour, size_t **hist_day) { struct http_get_data *data = (struct http_get_data*)soap_lookup_plugin(soap, http_get_id); if (!data) return; if (stat_get) *stat_get = data->stat_get; if (stat_post) *stat_post = data->stat_post; if (stat_fail) *stat_fail = data->stat_fail; if (hist_min) *hist_min = data->hist_min; if (hist_hour) *hist_hour = data->hist_hour; if (hist_day) *hist_day = data->hist_day; } /* deprecated: use soap_GET instead */ int soap_http_get_connect(struct soap *soap, const char *endpoint, const char *action) { return soap_GET(soap, endpoint, action); } #ifdef __cplusplus } #endif gsoap-2.8.91/gsoap/plugin/wsse2api.h0000644000175000017500000003234013525245161016607 0ustar ellertellert/* wsse2api.h WS-Security plugin. See wsseapi.c for documentation and details. 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 WSSEAPI_H #define WSSEAPI_H /* When using soapcpp2 option -q or -p, you need to change "soapH.h" below */ /* include soapH.h generated by soapcpp2 from .h file containing #import "wsse2.h" */ #ifdef SOAP_H_FILE /* if set, use the soapcpp2-generated fileH.h file as specified with: cc ... -DSOAP_H_FILE=fileH.h */ # include "stdsoap2.h" # include SOAP_XSTRINGIFY(SOAP_H_FILE) #else # include "soapH.h" /* or manually replace with soapcpp2-generated *H.h file */ #endif #include "smdevp.h" #include "mecevp.h" #ifdef __cplusplus extern "C" { #endif /** plugin identification for plugin registry */ #define SOAP_WSSE_ID "SOAP-WSSE/1.3" /** to ignore extra/external SignedInfo/Reference/@URI */ #define SOAP_WSSE_IGNORE_EXTRA_REFS (0x1000) /** plugin identification for plugin registry */ extern const char soap_wsse_id[]; /** @struct soap_wsse_data @brief wsseapi plugin data The signature key (private) and verification key (public) are kept in the plugin data, together with other info. */ struct soap_wsse_data { const char *sigid; /**< string with wsu:Id names to sign */ const char *encid; /**< string with wsu:Id names to encrypt */ int sign_alg; /**< The digest or signature algorithm used */ const void *sign_key; /**< EVP_PKEY or key string for HMAC */ int sign_keylen; /**< HMAC key length */ int vrfy_alg; /**< The signature verify algorithm used */ const void *vrfy_key; /**< EVP_PKEY or key string for HMAC verify */ int vrfy_keylen; /**< HMAC key length */ int enco_alg; /**< current encrypt algorithm used */ const char *enco_keyname; /**< optional key name (id of symmetric key) */ const void *enco_key; /**< EVP_PKEY or secret key */ int enco_keylen; /**< secret key length */ int deco_alg; /**< decrypt algorithm used */ const void *deco_key; /**< EVP_PKEY or secret key */ int deco_keylen; /**< secret key length */ struct soap_wsse_digest *digest; /**< List of ID-hash pairs */ int (*fpreparesend)(struct soap*, const char*, size_t); int (*fpreparefinalsend)(struct soap*); int (*fpreparefinalrecv)(struct soap*); int (*fheader)(struct soap*); struct soap_mec_data *mec; X509_STORE *store; const void *(*security_token_handler)(struct soap *soap, int *alg, const char *keyname, int *keylen); }; /** @struct soap_wsse_digest @brief Digest dictionary: linked list of ID-hash pairs The digest dictionary is populated by the soap_wsse_preparesend callback. The callback intercepts XML elements with wsu:Id attributes and computes the digest during the preprocessing of a message transmission. The 'level' field is used to determine when the end of an element is reached by handling inner wsu:Id attributed elements, so that the outer wsu:Id attributed element can be hashed. */ struct soap_wsse_digest { struct soap_wsse_digest *next; /**< Next in list */ unsigned int level; /**< XML parser depth level */ struct soap_smd_data smd; /**< smdevp engine context */ unsigned char hash[SOAP_SMD_MAX_SIZE];/**< Digest hash value */ char id[1]; /**< String flows down the struct */ }; extern const char *wsse_PasswordTextURI; extern const char *wsse_PasswordDigestURI; extern const char *wsse_Base64BinaryURI; extern const char *wsse_X509v3URI; extern const char *wsse_X509v3SubjectKeyIdentifierURI; extern const char *ds_sha1URI; extern const char *ds_sha256URI; extern const char *ds_sha512URI; extern const char *ds_hmac_sha1URI; extern const char *ds_hmac_sha256URI; extern const char *ds_hmac_sha512URI; extern const char *ds_dsa_sha1URI; extern const char *ds_rsa_sha1URI; extern const char *ds_rsa_sha256URI; extern const char *ds_rsa_sha512URI; extern const char *xenc_rsa15URI; extern const char *xenc_rsaesURI; extern const char *xenc_3desURI; extern const char *xenc_aes128URI; extern const char *xenc_aes192URI; extern const char *xenc_aes256URI; extern const char *xenc_aes512URI; extern const char *xenc_elementURI; extern const char *xenc_contentURI; extern const char *ds_URI; extern const char *c14n_URI; extern const char *wsu_URI; struct _wsse__Security* soap_wsse_add_Security(struct soap *soap); struct _wsse__Security* soap_wsse_add_Security_actor(struct soap *soap, const char *actor); void soap_wsse_delete_Security(struct soap *soap); struct _wsse__Security* soap_wsse_Security(struct soap *soap); struct ds__SignatureType* soap_wsse_add_Signature(struct soap *soap); void soap_wsse_delete_Signature(struct soap *soap); struct ds__SignatureType* soap_wsse_Signature(struct soap *soap); int soap_wsse_add_Timestamp(struct soap *soap, const char *id, time_t lifetime); struct _wsu__Timestamp *soap_wsse_Timestamp(struct soap *soap); int soap_wsse_verify_Timestamp(struct soap *soap); int soap_wsse_add_UsernameTokenText(struct soap *soap, const char *id, const char *username, const char *password); int soap_wsse_add_UsernameTokenDigest(struct soap *soap, const char *id, const char *username, const char *password); struct _wsse__UsernameToken *soap_wsse_UsernameToken(struct soap *soap, const char *id); const char* soap_wsse_get_Username(struct soap *soap); int soap_wsse_verify_Password(struct soap *soap, const char *password); int soap_wsse_add_BinarySecurityToken(struct soap *soap, const char *id, const char *valueType, const unsigned char *data, int size); int soap_wsse_add_BinarySecurityTokenX509(struct soap *soap, const char *id, X509 *cert); int soap_wsse_add_BinarySecurityTokenPEM(struct soap *soap, const char *id, const char *filename); struct _wsse__BinarySecurityToken *soap_wsse_BinarySecurityToken(struct soap *soap, const char *id); int soap_wsse_get_BinarySecurityToken(struct soap *soap, const char *id, char **valueType, unsigned char **data, int *size); X509 *soap_wsse_get_BinarySecurityTokenX509(struct soap *soap, const char *id); int soap_wsse_verify_X509(struct soap *soap, X509 *cert); int soap_wsse_add_SecurityContextToken(struct soap *soap, const char *id, const char *identifier); const char * soap_wsse_get_SecurityContextToken(struct soap *soap); struct ds__SignedInfoType *soap_wsse_add_SignedInfo(struct soap *soap); int soap_wsse_add_SignedInfo_Reference(struct soap *soap, const char *URI, const char *transform, const char *inclusiveNamespaces, int alg, const char *HA); int soap_wsse_add_SignedInfo_SignatureMethod(struct soap *soap, const char *method, int canonical); struct ds__SignedInfoType *soap_wsse_SignedInfo(struct soap *soap); int soap_wsse_get_SignedInfo_SignatureMethod(struct soap *soap, int *alg); int soap_wsse_add_SignatureValue(struct soap *soap, int alg, const void *key, int keylen); int soap_wsse_verify_SignatureValue(struct soap *soap, int alg, const void *key, int keylen); int soap_wsse_verify_SignedInfo(struct soap *soap); int soap_wsse_verify_digest(struct soap *soap, int alg, int canonical, const char *id, unsigned char hash[SOAP_SMD_MAX_SIZE]); struct ds__KeyInfoType *soap_wsse_add_KeyInfo(struct soap *soap); struct ds__KeyInfoType *soap_wsse_KeyInfo(struct soap *soap); int soap_wsse_add_KeyInfo_KeyName(struct soap *soap, const char *name); const char *soap_wsse_get_KeyInfo_KeyName(struct soap *soap); int soap_wsse_add_KeyInfo_SecurityTokenReferenceURI(struct soap *soap, const char *URI, const char *valueType); int soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(struct soap *soap, const char *URI); const char *soap_wsse_get_KeyInfo_SecurityTokenReferenceURI(struct soap *soap); const char *soap_wsse_get_KeyInfo_SecurityTokenReferenceValueType(struct soap *soap); X509 *soap_wsse_get_KeyInfo_SecurityTokenReferenceX509(struct soap *soap); struct ds__X509IssuerSerialType *soap_wsse_get_KeyInfo_SecurityTokenReferenceX509Data(struct soap *soap); int soap_wsse_add_KeyInfo_SecurityTokenReferenceKeyIdentifier(struct soap *soap, const char *id, const char *valueType, unsigned char *data, int size); const char *soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifierValueType(struct soap *soap); const unsigned char *soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifier(struct soap *soap, int *size); int soap_wsse_add_KeyInfo_SecurityTokenReferenceEmbedded(struct soap *soap, const char *id, const char *valueType); int soap_wsse_add_EncryptedData_KeyInfo_KeyName(struct soap *soap, const char *keyname); int soap_wsse_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail); int soap_wsse_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail); int soap_wsse_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail); int soap_wsse_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail); int soap_wsse_fault(struct soap *soap, enum wsse__FaultcodeEnum fault, const char *detail); int soap_wsse(struct soap *soap, struct soap_plugin *p, void *arg); int soap_wsse_sign(struct soap *soap, int alg, const void *key, int keylen); int soap_wsse_sign_body(struct soap *soap, int alg, const void *key, int keylen); int soap_wsse_verify_init(struct soap *soap); int soap_wsse_verify_auto(struct soap *soap, int alg, const void *key, size_t keylen); int soap_wsse_verify_done(struct soap *soap); size_t soap_wsse_verify_element(struct soap *soap, const char *URI, const char *tag); int soap_wsse_verify_body(struct soap *soap); int soap_wsse_set_wsu_id(struct soap *soap, const char *tags); int soap_wsse_sign_only(struct soap *soap, const char *tags); int soap_wsse_add_EncryptedKey(struct soap *soap, int alg, const char *URI, X509 *cert, const char *subjectkeyid, const char *issuer, const char *serial); int soap_wsse_add_EncryptedKey_encrypt_only(struct soap *soap, int alg, const char *URI, X509 *cert, const char *subjectkeyid, const char *issuer, const char *serial, const char *tags); int soap_wsse_verify_EncryptedKey(struct soap *soap); void soap_wsse_delete_EncryptedKey(struct soap *soap); struct xenc__EncryptedKeyType* soap_wsse_EncryptedKey(struct soap *soap); int soap_wsse_add_EncryptedKey_DataReferenceURI(struct soap *soap, const char *URI); int soap_wsse_add_DataReferenceURI(struct soap *soap, const char *URI); int soap_wsse_encrypt_body(struct soap *soap, int alg, const void *key, int keylen); int soap_wsse_encrypt_only(struct soap *soap, int alg, const void *key, int keylen, const char *tags); int soap_wsse_encrypt(struct soap *soap, int alg, const void *key, int keylen); int soap_wsse_decrypt_auto(struct soap *soap, int alg, const void *key, int keylen); int soap_wsse_encrypt_begin(struct soap *soap, const char *id, int alg, const char *URI, const char *keyname, const unsigned char *key); int soap_wsse_encrypt_end(struct soap *soap); int soap_wsse_decrypt_begin(struct soap *soap, const unsigned char *key); int soap_wsse_decrypt_end(struct soap *soap); #ifdef __cplusplus } #endif SOAP_FMAC1 void SOAP_FMAC2 soap_default_xsd__anyType(struct soap*, struct soap_dom_element *node); SOAP_FMAC1 int SOAP_FMAC2 soap_out_xsd__anyType(struct soap *soap, const char *tag, int id, const struct soap_dom_element *node, const char *type); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_in_xsd__anyType(struct soap *soap, const char *tag, struct soap_dom_element *node, const char *type); #endif gsoap-2.8.91/gsoap/plugin/sessions.c0000644000175000017500000014272413525245161016723 0ustar ellertellert/* sessions.c Sessions plugin for thread-safe server-side HTTP session management. by Chris Moutsos & Robert van Engelen gSOAP XML Web services tools Copyright (C) 2000-2016, 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-2016, 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 -------------------------------------------------------------------------------- */ /** @mainpage The Sessions Plugin @section title HTTP Server Session Management Plugin [TOC] By Chris Moutsos and Robert van Engelen. @section overview Overview The HTTP server session management plugin for gSOAP enables servers to store a database of sessions to keep track of client data across multiple requests. Client data is stored per session as name and value pairs that can be set to any valid string. Sessions are tracked with unique session IDs (sometimes called tokens) that are passed between the server and client with HTTP cookies. The sessions plugin is MT safe. @section features Features - Stores sessions identified by random 128-bit session IDs managed with HTTP cookies - Session validity can be restricted based on domain and path - Each session stores a list of session variables (name/value string pairs) - Can easily create, modify, delete, and retrieve session variables - Configurable settings - Rolling sessions (re-set session ID cookie with every response) - Session ID cookie `Max-Age` and `Expire` attribute values - Maximum stale time before a session expires server-side - Time interval between purging expired sessions - Max number of sessions allowed in database - Thread-safe - Can be used with C or C++ projects @section setup Setup To set up the sessions plugin on the server-side: -# Make sure to compile your program with plugin/sessions.c and plugin/threads.c. -# Enable cookies by compiling all gSOAP source code with `-DWITH_COOKIES`. Cookies are required for tracking session IDs. -# Enable HTTPS (compile with `-DWITH_OPENSSL` or `-DWITH_GNUTLS` or link with `-lgsoapssl`/`-lgsoapssl++`). @note While it is not a requirement to use HTTPS with this plugin, it is **strongly recommended** to use HTTPS. This is because the session ID cookies can be intercepted if not encrypted with SSL/TLS. Cookies are automatically sent with the Secure flag enabled when SSL is enabled. The HttpOnly flag is automatically enabled for all cookies in order to prevent XSS attacks. @section usage Basic Usage Client-side usage is automatic, provided that the client supports cookies and the server has properly configured the plugin. If the client is a gSOAP application, make sure to compile with `-DWITH_COOKIES`. For server-side usage, register the plugin with: @code #include "plugin/sessions.h" struct soap *soap = soap_new(); soap_register_plugin(soap, sessions); @endcode If you are using a server object in C++ generated with soappcpp2 option `-j`: @code #include "plugin/sessions.h" soap_register_plugin(server.soap, sessions); @endcode For brevity, the `struct soap*` version will be used below. Replace `soap` with your server object's `soap` member if necessary. Start a new session with: @code struct soap_session *session = soap_start_session(soap, "domain", "path"); @endcode This creates a new session with a random 128-bit session ID and the default settings (see section: @ref settings). If the client already has a session ID cookie with name `SESSION_COOKIE_NAME` and the given `domain` and `path`, and that ID refers to a valid session, that existing session will be returned instead. @note For all of the sessions plugin function calls, `domain` and `path` arguments are required. These must match the values that were given when the session was created, otherwise the client's session ID cookie won't be found. The `domain` and `path` arguments may be set to `NULL` to use the current values given by the `soap` context's `cookie_domain` and `cookie_path` members: @note | Attribute | Value | --------------------------- | ------------------------------------------------ | `const char *cookie_domain` | MUST be set to the domain (host) of the service | `const char *cookie_path` | MAY be set to the default path to the service (defaults to '`/`') @note These rules also apply to the cookies used for tracking session IDs. See the [gSOAP User Guide](http://genivia.com/doc/soapdoc2.html) for more information on how gSOAP handles cookies. For example, to create a session on localhost:8080 that is valid on any path: @code soap->cookie_domain = "localhost:8080"; struct soap_session *session = soap_start_session(soap, NULL, NULL); @endcode To create a new session variable or modify an existing session variable inside that session: @code soap_set_session_var(soap, "session_var_name", "session_var_value", NULL, NULL); @endcode To access the value of that session variable: @code const char *value = soap_get_session_var(soap, "session_var_name", NULL, NULL); @endcode To delete that session variable: @code soap_clr_session_var(soap, "session_var_name", NULL, NULL); @endcode Consider changing the session's `rolling`, `cookie_maxage`, `max_inactive_secs` settings from their defaults. Read more about these in the @ref settings section. @section example Simple Calculator Server (C) Example We will show how to extend the simple calculator server example (in C) to keep track of the client's last calculated value with a session variable. Make sure to register the plugin and set the default `domain` and `path`. After calling `soap_destroy` and `soap_end`, we should also free the internal cookie database (or call `soap_done`): @code #include "plugin/session.h" ... struct soap soap; soap_init(&soap); soap_register_plugin(&soap, sessions); soap.cookie_domain = "localhost:8080"; soap.cookie_path = "/"; ... // set up the service and serve requests soap_destroy(&soap); soap_end(&soap); soap_free_cookies(&soap); @endcode Now in each of our calculator service operations (`ns__add`, `ns__sub`, etc.), we can update the `lastCalculation` session variable in our current session: @code int ns__add(struct soap *soap, double a, double b, double *result) { (void)soap; *result = a + b; // make sure we have a session if (!soap_get_session(soap, NULL, NULL)) { // no current session, create a new one if (!soap_start_session(soap, NULL, NULL)) return SOAP_ERR; // session creation failed // configure session settings soap_set_session_rolling(soap, 1, NULL, NULL); soap_set_session_cookie_maxage(soap, 30, NULL, NULL); soap_set_session_max_inactive_secs(soap, 30, NULL, NULL); } // update `lastCalculation` session variable char calculation[80]; sprintf(calculation, "add %f %f, result = %f", a, b, *result); soap_set_session_var(soap, "lastCalculation", calculation, NULL, NULL); return SOAP_OK; } @endcode If we want to allow the client to access their last calculation, add another service operation to retrieve the `lastCalculation` session variable: @code int ns__getLastCalculation(struct soap *soap, char **r) { const char *lastCalculation = soap_get_session_var(soap, "lastCalculation", NULL, NULL); if (!lastCalculation) lastCalculation = "None"; if ((*r = (char*)soap_malloc(soap, strlen(lastCalculation)+1))) strcpy(*r, lastCalculation); return SOAP_OK; } @endcode @section api Sessions Plugin API This section describes the Sessions Plugin API. @note The term *session ID cookie* refers to a cookie with the name `SESSION_COOKIE_NAME` (see section: @ref settings), the given `domain` and `path` (see section: @ref usage), and a random 128-bit session ID as the value. The term *current session* refers to the session in the database identified by the client's session ID cookie. @note The arguments `domain` and `path` may be set to `NULL` to use the current values given by `soap->cookie_domain` and `soap->cookie_path` (see section: @ref usage). The sessions plugin provides the following API for server-side session management:
Session Plugin Function Description
struct soap_session* soap_start_session(struct soap * soap, const char *domain, const char *path);\n Create a session in the database and a session ID cookie. Behaves the same as `soap_get_session` if the client already has a valid session ID cookie. Returns pointer to the session node, or `NULL` if the session could not be created.
struct soap_session* soap_get_session(struct soap *soap, const char *domain, const char *path);\n Get the current session. Can be used as a 'touch'. Returns pointer to the session node, or `NULL` if the session is not found or is expired.
int soap_get_num_sessions(struct soap *soap, const char *domain, const char *path);\n Get the number of sessions in the database. Returns `-1` if the session is not found or is expired.
struct soap_session* soap_regenerate_session_id(struct soap * soap, const char *domain, const char *path);\n Create a new session ID for the current session and update the session ID cookie. Returns pointer to the session node, or `NULL` if the session is not found or is expired.
int soap_get_num_session_vars(struct soap *soap, const char *domain, const char *path);\n Get the number of session variables in the current session. Returns `-1` if the session is not found or is expired.
void soap_end_session(struct soap *soap, const char * domain, const char *path);\n Delete the current session from the database and clear the client's session ID cookie.
void soap_end_sessions(struct soap *soap, const char * domain, const char *path);\n Delete all sessions in the database and clear the current session ID cookie.
struct soap_session_var* soap_set_session_var(struct soap * soap, const char *name, const char *value, const char *domain, const char *path);\n Set a session variable with the given `name` and `value` in the current session, overwring any old `value`. Returns pointer to the session variable node, or `NULL` if the session is not found or is expired.
const char* soap_get_session_var(struct soap *soap, const char *name, const char *domain, const char *path); \n Get the `value` of the session variable with the given `name` in the current session. Returns `NULL` if the session is not found or is expired.
void soap_clr_session_var(struct soap *soap, const char *name, const char *domain, const char *path);\n Delete the session variable with the given `name` in the current session.
void soap_clr_session_vars(struct soap *soap, const char *domain, const char *path); \n Delete all session variables in the current session.
For managing session settings (see section: @ref settings), the following API is provided:
Session Plugin Function Description (Settings / Misc.)
int soap_set_session_rolling(struct soap * soap, int rolling, const char *domain, const char * path);\n Set the `rolling` setting for the current session. Zero (non-rolling) means the session ID cookie is only set when the session is first created. Non-zero (rolling) means the session ID cookie will be re-set on every response. If successful, returns SOAP_OK, or SOAP_ERR otherwise.
int soap_get_session_rolling(struct soap * soap, const char *domain, const char *path);\n Get the `rolling` setting for the current session. Returns `-1` if the session is not found or is expired.
int soap_set_session_cookie_maxage(struct soap * soap, long maxage, const char *domain, const char * path);\n Set the `cookie_maxage` member for the current session. This will be used to set the session ID cookie's `Max-Age` and `Expires` attributes. `-1` means the cookie will have no `Max-Age` or `Expires` attributes. If successful, returns SOAP_OK, or SOAP_ERR otherwise.
long soap_get_session_cookie_maxage(struct soap * soap, const char *domain, const char *path);\n Get the `cookie_maxage` member for the current session. Returns `0` if the session is not found or is expired.
int soap_set_session_max_inactive_secs(struct soap * soap, long max, const char *domain, const char * path);\n Set the `max_inactive_secs` member for the current session. This is the maximum amount of stale time in seconds before a session is marked as expired (to be purged) on the server-side. `-1` means the session will never expire. If successful, returns SOAP_OK, or SOAP_ERR otherwise.
long soap_get_session_max_inactive_secs(struct soap * soap, const char *domain, const char *path);\n Get the `max_inactive_secs` member for the current session. Returns `0` if the session is not found or is expired.
struct soap_session* soap_get_sessions_head(); \n Get `soap_sessions`, the first node in the sessions linked list. Not necessary unless low-level list management is needed (see section: @ref internals).
@section settings Settings In `plugins/session.h`, the following constants are defined: | Name | Default | Description | ------------------------------------- | --------------------- | -------------------------------------------------- | `SESSION_COOKIE_NAME` | `"GSOAP_SESSIONID"` | The name to use for session ID cookies. | `SESSION_MAX` | `8192` | The max number of sessions allowed in the database. Any attempt to create more sessions than this will fail. | `SESSIONS_DEFAULT_MAX_INACTIVE_SECS` | `300` | The default time in seconds for sessions' `max_inactive_secs` member. `-1` means the session will never expire server-side. | `SESSION_PURGE_INTERVAL` | `300` | On every session database access, the time since the last database purge is checked. If it's been longer than this interval (in seconds), any expired sessions will be purged with `soap_purge_sessions()`. `0` means a purge will occcur on every database access. `-1` means a purge will never occur. Set these values to whatever makes sense for your application. In each session node, the following settings are declared: | Name | Default | Description | ----------------------- | ------------------------------------ | ----------------------- | `rolling` | `0` | Non-rolling (`0`) means the session ID cookie is only set when the session is first created. Rolling (non-`0`) means the session ID cookie will be re-set on every response after any part of the session has been touched. | `cookie_maxage` | `-1` | This will be used to set the session ID cookie's `Max-Age` and `Expires` attributes. `-1` means the cookie will have no `Max-Age` or `Expires` attributes. | `max_inactive_secs` | `SESSIONS_DEFAULT_MAX_INACTIVE_SECS` | This is the maximum amount of stale time in seconds before a session is marked as expired (to be purged) on the server-side. `-1` means the session will never expire server-side. This should probably be set equal to `cookie_maxage` unless that value is `-1`. @note These settings should not be changed directly. See the @ref api section for functions to manage these settings. @section internals The Internals The session database is stored as a linked list pointed to by `soap_sessions` (accessible by calling `soap_get_sessions_head()`). Session nodes are of type `struct soap_session` and are declared as: @code struct soap_session { struct soap_session *next; const char *id; struct soap_session_var *session_vars; struct soap_session_var *session_vars_tail; int num_session_vars; // the total number of session_vars we have in this session long cookie_maxage; // client time in seconds before the cookie expires (-1 for session cookie) int rolling; // whether or not we should set the cookie's maxage on every response time_t last_touched; // time that we last touched this session or its vars long max_inactive_secs; // server time in seconds before inactive session expires (-1 to never expire) // this should usually be at least as high as cookie_maxage }; @endcode The `session_vars` member is a pointer to the session's linked list of session variables. Session variable nodes are of type `struct soap_session_var` and are declared as: @code struct soap_session_var { struct soap_session_var *next; const char *name; const char *value; }; @endcode */ #include "sessions.h" #ifdef __cplusplus extern "C" { #endif const char sessions_id[] = SESSIONS_ID; /** Head node of session database (linked list) */ static struct soap_session *soap_sessions = NULL; /** Tail node of session database */ static struct soap_session *soap_sessions_tail = NULL; /** Number of sessions in database */ static int num_sessions = 0; /** Time that we last purged expired sessions */ static time_t last_purged_sessions; /** Session database lock */ static MUTEX_TYPE sessions_lock = MUTEX_INITIALIZER; /******************************************************************************\ * * Forward decls * \******************************************************************************/ static int sessions_init(struct soap *soap); static void sessions_delete(struct soap *soap, struct soap_plugin *p); /******************************************************************************\ * * Plugin registry * \******************************************************************************/ /** @brief Plugin registry function, invoked by soap_register_plugin. */ SOAP_FMAC1 int SOAP_FMAC2 sessions(struct soap *soap, struct soap_plugin *p, void *arg) { (void)arg; p->id = sessions_id; /* register the destructor */ p->fdelete = sessions_delete; if (sessions_init(soap)) return SOAP_EOM; /* return error */ return SOAP_OK; } /******************************************************************************/ /** @brief Used by plugin registry function. */ static int sessions_init(struct soap *soap) { (void)soap; last_purged_sessions = time(NULL); return SOAP_OK; } /******************************************************************************\ * * Callbacks * \******************************************************************************/ /** @brief Deletes all sessions. Called when plugin is ended by first caller. */ static void sessions_delete(struct soap *soap, struct soap_plugin *p) { (void)p; soap_end_sessions(soap, NULL, NULL); } /******************************************************************************\ * * For Internal Plugin Use (NOT THREAD-SAFE ALONE) * \******************************************************************************/ /** @brief Intended for internal plugin use. Creates a cookie that will be sent to the client, named SESSION_COOKIE_NAME with the given value, domain, and path. */ SOAP_FMAC1 void SOAP_FMAC2 soap_session_cookie_create(struct soap *soap, const char *value, const char *domain, const char *path, long maxage) { /* create session ID cookie */ soap_set_cookie(soap, SESSION_COOKIE_NAME, value, domain, path); soap_set_cookie_session(soap, SESSION_COOKIE_NAME, domain, path); soap_set_cookie_expire(soap, SESSION_COOKIE_NAME, maxage, domain, path); } /******************************************************************************/ /** @brief Intended for internal plugin use. Creates a cookie that will be sent to the client, named SESSION_COOKIE_NAME with the given domain and path. The value will be empty and it will be set to expire when the client recieves it. This ensures the session ID is no longer in the client's cookie. */ SOAP_FMAC1 void SOAP_FMAC2 soap_session_cookie_delete(struct soap *soap, const char *domain, const char *path) { /* delete client-side cookie */ soap_set_cookie(soap, SESSION_COOKIE_NAME, "", domain, path); soap_set_cookie_session(soap, SESSION_COOKIE_NAME, domain, path); soap_set_cookie_expire(soap, SESSION_COOKIE_NAME, 0, domain, path); } /******************************************************************************/ /** @brief Intended for internal plugin use. Find the current session with domain and path. Returns NULL if not found or if the session is expired (for normal use, set `when` to `time(NULL)`). Will also clear the cookie if the session is expired. */ SOAP_FMAC1 struct soap_session* SOAP_FMAC2 soap_session_internal_find(struct soap *soap, const char *domain, const char *path, time_t when) { struct soap_session *s = NULL; const char *id; id = soap_cookie_value(soap, SESSION_COOKIE_NAME, domain, path); if (id) { for (s = soap_sessions; s; s = s->next) if (s && !strcmp(s->id, id)) break; if (!s) return NULL; if (s->max_inactive_secs >= 0 && (s->last_touched + s->max_inactive_secs <= when)) { /* session has expired and has not been purged, or NULL */ soap_session_cookie_delete(soap, domain, path); return NULL; } } return s; } /******************************************************************************\ * * Sessions Public API * \******************************************************************************/ /** @brief Gets soap_sessions (first node in sessions linked list). */ SOAP_FMAC1 struct soap_session* SOAP_FMAC2 soap_get_sessions_head() { return soap_sessions; } /******************************************************************************/ /** @brief Removes all sessions that have been stale longer than their max_inactive_secs allows. -1 max_inactive_secs means the session will never expire. The when parameter is usually the current time, i.e. time(NULL) to purge sessions that expire after the when time. This is called internally every time a session or a session_var is accessed, so it shouldn't ever be necessary to manually call this function. Only will purge when the last time we purged was more than SESSION_PURGE_INTERVAL seconds ago (defined in sessions.h). SESSION_PURGE_INTERVAL == -1 means never purge. SESSION_PURGE_INTERVAL == 0 means always purge. */ SOAP_FMAC1 void SOAP_FMAC2 soap_purge_sessions(struct soap *soap, const char *domain, const char *path, time_t when) { struct soap_session *s, *t; struct soap_session_var *v; const char *id; if (SESSION_PURGE_INTERVAL == -1) return; MUTEX_LOCK(sessions_lock); /* If we purge the current session, we'll want to clear the cookie, too. So grab the current ID to check against. */ id = soap_cookie_value(soap, SESSION_COOKIE_NAME, domain, path); /* not time to purge yet */ if (SESSION_PURGE_INTERVAL && (last_purged_sessions + SESSION_PURGE_INTERVAL >= when)) { MUTEX_UNLOCK(sessions_lock); return; } last_purged_sessions = when; s = soap_sessions; while (s) { t = s->next; /* delete session if its older than allowed */ if (s->max_inactive_secs >= 0 && (s->last_touched + s->max_inactive_secs <= when)) { /* clear the cookie if this was the current session */ if (id && !strcmp(id, s->id)) soap_session_cookie_delete(soap, domain, path); /* delete session vars */ for (v = s->session_vars; v;) { struct soap_session_var *u; if (v->name) SOAP_FREE(soap, v->name); if (v->value) SOAP_FREE(soap, v->value); u = v->next; SOAP_FREE(soap, v); v = u; } /* delete session data */ if (s->id) SOAP_FREE(soap, s->id); /* deleting not last node? */ if (t) { /* adjust tail if this was second to last */ if (t == soap_sessions_tail) soap_sessions_tail = s; s->id = t->id; s->session_vars = t->session_vars; s->session_vars_tail = t->session_vars_tail; s->num_session_vars = t->num_session_vars; s->cookie_maxage = t->cookie_maxage; s->rolling = t->rolling; s->last_touched = t->last_touched; s->max_inactive_secs = t->max_inactive_secs; s->next = t->next; SOAP_FREE(soap, t); } else /* deleting the last node */ { /* set tail to previous node */ struct soap_session *u = soap_sessions; while (u && u->next != s) u = u->next; soap_sessions_tail = u; if (soap_sessions_tail == NULL) soap_sessions = NULL; else soap_sessions_tail->next = NULL; SOAP_FREE(soap, s); /* to end the loop */ s = NULL; } num_sessions--; } else { /* only move s to the next node if we didn't do a deletion (because we moved the next node onto s if we did do a deletion) */ s = t; } } MUTEX_UNLOCK(sessions_lock); } /******************************************************************************/ /** @brief Gets the number of sessions in the database. */ SOAP_FMAC1 int SOAP_FMAC2 soap_get_num_sessions(struct soap *soap, const char *domain, const char *path) { /* purge first, so num_sessions will not include expired ones */ soap_purge_sessions(soap, domain, path, time(NULL)); return num_sessions; } /******************************************************************************/ /** @brief Finds the session identified by the cookie with name SESSION_COOKIE_NAME and the given domain and path. Updates session's last_touched to now. Returns NULL if not found. */ SOAP_FMAC1 struct soap_session* SOAP_FMAC2 soap_get_session(struct soap *soap, const char *domain, const char *path) { struct soap_session *s; time_t now = time(NULL); soap_purge_sessions(soap, domain, path, now); MUTEX_LOCK(sessions_lock); s = soap_session_internal_find(soap, domain, path, now); if (!s) { MUTEX_UNLOCK(sessions_lock); return NULL; } s->last_touched = now; if (s->rolling) soap_session_cookie_create(soap, s->id, domain, path, s->cookie_maxage); MUTEX_UNLOCK(sessions_lock); return s; } /******************************************************************************/ /** @brief Creates a new session with a random 128-bit ID. A cookie will be created with name SESSION_COOKIE_NAME and the given domain and path. If there already exists a session ID cookie, the only action will be updating the session's last_touched to now. Returns a pointer to the session. */ SOAP_FMAC1 struct soap_session* SOAP_FMAC2 soap_start_session(struct soap *soap, const char *domain, const char *path) { struct soap_session *s = NULL; time_t now = time(NULL); const char *id; soap_purge_sessions(soap, domain, path, now); MUTEX_LOCK(sessions_lock); id = soap_cookie_value(soap, SESSION_COOKIE_NAME, domain, path); if (id) { for (s = soap_sessions; s; s = s->next) if (!strcmp(s->id, id)) break; } if (!s) { /* check if we have too many sessions */ if (num_sessions >= SESSION_MAX) { MUTEX_UNLOCK(sessions_lock); return NULL; } /* create new session */ s = (struct soap_session*)SOAP_MALLOC(soap, sizeof(struct soap_session)); if (s) { /* generate random 128-bit session ID */ s->id = (const char*)soap_strdup(NULL, soap_rand_uuid(soap, NULL)); s->session_vars = NULL; s->session_vars_tail = NULL; s->num_session_vars = 0; s->cookie_maxage = -1; s->rolling = 0; s->last_touched = now; s->max_inactive_secs = SESSIONS_DEFAULT_MAX_INACTIVE_SECS; /* add to end of list */ if (num_sessions == 0) soap_sessions = s; else soap_sessions_tail->next = s; soap_sessions_tail = s; soap_sessions_tail->next = NULL; num_sessions++; soap_session_cookie_create(soap, s->id, domain, path, s->cookie_maxage); } } else { /* session already exists */ if (s->max_inactive_secs >= 0 && (s->last_touched + s->max_inactive_secs <= now)) { /* session has expired and has not been purged, or NULL */ soap_session_cookie_delete(soap, domain, path); } else { /* update last_touched */ s->last_touched = now; if (s->rolling) soap_session_cookie_create(soap, s->id, domain, path, s->cookie_maxage); } } MUTEX_UNLOCK(sessions_lock); return s; } /******************************************************************************/ /** @brief The session ID for the current session (identified by the cookie with name SESSION_COOKIE_NAME and the given domain and path) will be set to a new random 128-bit ID. Also updates the cookie. Returns a pointer to the session. */ SOAP_FMAC1 struct soap_session* SOAP_FMAC2 soap_regenerate_session_id(struct soap *soap, const char *domain, const char *path) { struct soap_session *s; time_t now = time(NULL); soap_purge_sessions(soap, domain, path, now); MUTEX_LOCK(sessions_lock); s = soap_session_internal_find(soap, domain, path, now); if (!s) { MUTEX_UNLOCK(sessions_lock); return NULL; } s->last_touched = now; if (s->id) SOAP_FREE(soap, s->id); /* generate random 128-bit session ID if one wasn't provided */ s->id = (const char*)soap_strdup(NULL, soap_rand_uuid(soap, NULL)); /* reset session ID cookie */ soap_session_cookie_create(soap, s->id, domain, path, s->cookie_maxage); MUTEX_UNLOCK(sessions_lock); return s; } /******************************************************************************/ /** @brief Frees all sessions in database. */ SOAP_FMAC1 void SOAP_FMAC2 soap_end_sessions(struct soap *soap, const char *domain, const char *path) { struct soap_session *s; MUTEX_LOCK(sessions_lock); last_purged_sessions = time(NULL); s = soap_sessions; while (s) { /* delete session_vars */ struct soap_session *t = s->next; struct soap_session_var *v = s->session_vars; while (v) { struct soap_session_var *u; if (v->name) SOAP_FREE(soap, v->name); if (v->value) SOAP_FREE(soap, v->value); u = v->next; SOAP_FREE(soap, v); v = u; } /* delete session */ if (s->id) SOAP_FREE(soap, s->id); SOAP_FREE(soap, s); s = t; } soap_sessions = NULL; soap_sessions_tail = NULL; num_sessions = 0; /* clear session ID cookie */ soap_session_cookie_delete(soap, domain, path); MUTEX_UNLOCK(sessions_lock); } /******************************************************************************/ /** @brief Frees the current session (identified by the cookie with name SESSION_COOKIE_NAME and the given domain and path). Also clears the cookie. */ SOAP_FMAC1 void SOAP_FMAC2 soap_end_session(struct soap *soap, const char *domain, const char *path) { struct soap_session *s; struct soap_session_var *v; time_t now = time(NULL); soap_purge_sessions(soap, domain, path, now); MUTEX_LOCK(sessions_lock); s = soap_session_internal_find(soap, domain, path, now); if (!s) { MUTEX_UNLOCK(sessions_lock); return; } /* deleting whether expired or not */ /* delete session vars */ for (v = s->session_vars; v;) { struct soap_session_var *u; if (v->name) SOAP_FREE(soap, v->name); if (v->value) SOAP_FREE(soap, v->value); u = v->next; SOAP_FREE(soap, v); v = u; } /* delete session data */ if (s->id) SOAP_FREE(soap, s->id); struct soap_session *temp = s->next; /* deleting not last node */ if (temp != NULL) { /* adjust tail if this was second to last */ if (temp == soap_sessions_tail) soap_sessions_tail = s; s->id = temp->id; s->session_vars = temp->session_vars; s->session_vars_tail = temp->session_vars_tail; s->num_session_vars = temp->num_session_vars; s->cookie_maxage = temp->cookie_maxage; s->last_touched = temp->last_touched; s->max_inactive_secs = temp->max_inactive_secs; s->next = temp->next; SOAP_FREE(soap, temp); } /* deleting the last node */ else { /* set tail to previous node */ struct soap_session *t = soap_sessions; while (t && t->next != s) t = t->next; soap_sessions_tail = t; if (soap_sessions_tail == NULL) soap_sessions = NULL; else soap_sessions_tail->next = NULL; SOAP_FREE(soap, s); } num_sessions--; /* delete client-side cookie */ soap_session_cookie_delete(soap, domain, path); MUTEX_UNLOCK(sessions_lock); } /******************************************************************************/ /** @brief Gets the cookie_maxage for the current session (identified by the cookie with name SESSION_COOKIE_NAME and the given domain and path). -1 means the cookie is a session cookie. 0 means a session was not found or is expired. */ SOAP_FMAC1 long SOAP_FMAC2 soap_get_session_cookie_maxage(struct soap *soap, const char *domain, const char *path) { struct soap_session *s; time_t now = time(NULL); long result; soap_purge_sessions(soap, domain, path, now); MUTEX_LOCK(sessions_lock); s = soap_session_internal_find(soap, domain, path, now); if (!s) { MUTEX_UNLOCK(sessions_lock); return 0; } result = s->cookie_maxage; if (s->rolling) soap_session_cookie_create(soap, s->id, domain, path, s->cookie_maxage); MUTEX_UNLOCK(sessions_lock); return result; } /******************************************************************************/ /** @brief Sets the cookie_maxage for the current session (identified by the cookie with name SESSION_COOKIE_NAME and the given domain and path). -1 means the cookie will be a session cookie. If successful, returns SOAP_OK, or SOAP_ERR otherwise. */ SOAP_FMAC1 int SOAP_FMAC2 soap_set_session_cookie_maxage(struct soap *soap, long maxage, const char *domain, const char *path) { struct soap_session *s; time_t now = time(NULL); soap_purge_sessions(soap, domain, path, now); MUTEX_LOCK(sessions_lock); s = soap_session_internal_find(soap, domain, path, now); if (!s) { MUTEX_UNLOCK(sessions_lock); return SOAP_ERR; } s->cookie_maxage = maxage; soap_session_cookie_create(soap, s->id, domain, path, s->cookie_maxage); MUTEX_UNLOCK(sessions_lock); return SOAP_OK; } /******************************************************************************/ /** @brief Gets the max_inactive_secs for the current session (identified by the cookie with name SESSION_COOKIE_NAME and the given domain and path). -1 means the session will never expire. 0 means the session wasn't found or is expired. */ SOAP_FMAC1 long SOAP_FMAC2 soap_get_session_max_inactive_secs(struct soap *soap, const char *domain, const char *path) { struct soap_session *s; time_t now = time(NULL); long result; soap_purge_sessions(soap, domain, path, now); MUTEX_LOCK(sessions_lock); s = soap_session_internal_find(soap, domain, path, now); if (!s) { MUTEX_UNLOCK(sessions_lock); return 0; } result = s->max_inactive_secs; if (s->rolling) soap_session_cookie_create(soap, s->id, domain, path, s->cookie_maxage); MUTEX_UNLOCK(sessions_lock); return result; } /******************************************************************************/ /** @brief Sets the max_inactive_secs for the current session (identified by the cookie with name SESSION_COOKIE_NAME and the given domain and path). -1 means the session will never expire. If successful, returns SOAP_OK, or SOAP_ERR otherwise. */ SOAP_FMAC1 int SOAP_FMAC2 soap_set_session_max_inactive_secs(struct soap *soap, long max, const char *domain, const char *path) { struct soap_session *s; time_t now = time(NULL); soap_purge_sessions(soap, domain, path, now); MUTEX_LOCK(sessions_lock); s = soap_session_internal_find(soap, domain, path, now); if (!s) { MUTEX_UNLOCK(sessions_lock); return SOAP_ERR; } s->max_inactive_secs = max; if (s->rolling) soap_session_cookie_create(soap, s->id, domain, path, s->cookie_maxage); MUTEX_UNLOCK(sessions_lock); return SOAP_OK; } /******************************************************************************/ /** @brief Gets the `rolling` flag for the current session (identified by the cookie with name SESSION_COOKIE_NAME and the given domain and path). -1 means the session was not found or is expired. */ SOAP_FMAC1 int SOAP_FMAC2 soap_get_session_rolling(struct soap *soap, const char *domain, const char *path) { struct soap_session *s; time_t now = time(NULL); int result; soap_purge_sessions(soap, domain, path, now); MUTEX_LOCK(sessions_lock); s = soap_session_internal_find(soap, domain, path, now); if (!s) { MUTEX_UNLOCK(sessions_lock); return -1; } result = s->rolling; if (s->rolling) soap_session_cookie_create(soap, s->id, domain, path, s->cookie_maxage); MUTEX_UNLOCK(sessions_lock); return result; } /******************************************************************************/ /** @brief Sets the `rolling` flag for the current session (identified by the cookie with name SESSION_COOKIE_NAME and the given domain and path). If successful, returns SOAP_OK, or SOAP_ERR otherwise. */ SOAP_FMAC1 int SOAP_FMAC2 soap_set_session_rolling(struct soap *soap, int rolling, const char *domain, const char *path) { struct soap_session *s; time_t now = time(NULL); soap_purge_sessions(soap, domain, path, now); MUTEX_LOCK(sessions_lock); s = soap_session_internal_find(soap, domain, path, now); if (!s) { MUTEX_UNLOCK(sessions_lock); return SOAP_ERR; } s->rolling = rolling; if (s->rolling) soap_session_cookie_create(soap, s->id, domain, path, s->cookie_maxage); MUTEX_UNLOCK(sessions_lock); return SOAP_OK; } /******************************************************************************\ * * Session Variables Public API * \******************************************************************************/ /** @brief Gets the number of sessions variables in the current session (identified by the cookie with name SESSION_COOKIE_NAME and the given domain and path). Returns -1 if the session does not exist. */ SOAP_FMAC1 int SOAP_FMAC2 soap_get_num_session_vars(struct soap *soap, const char *domain, const char *path) { struct soap_session *s; time_t now = time(NULL); int result; soap_purge_sessions(soap, domain, path, now); MUTEX_LOCK(sessions_lock); s = soap_session_internal_find(soap, domain, path, now); if (!s) { MUTEX_UNLOCK(sessions_lock); return -1; } result = s->num_session_vars; if (s->rolling) soap_session_cookie_create(soap, s->id, domain, path, s->cookie_maxage); MUTEX_UNLOCK(sessions_lock); return result; } /******************************************************************************/ /** @brief Returns session_var value by name in the current session (identified by the cookie with name SESSION_COOKIE_NAME and the given domain and path). Returns NULL if not found. */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_get_session_var(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_session *s; struct soap_session_var *v; time_t now = time(NULL); const char *value; soap_purge_sessions(soap, domain, path, now); MUTEX_LOCK(sessions_lock); s = soap_session_internal_find(soap, domain, path, now); if (!s) { MUTEX_UNLOCK(sessions_lock); return NULL; } s->last_touched = now; if (s->rolling) soap_session_cookie_create(soap, s->id, domain, path, s->cookie_maxage); for (v = s->session_vars; v; v = v->next) if (!strcmp(v->name, name)) break; value = v ? v->value : NULL; MUTEX_UNLOCK(sessions_lock); return value; } /******************************************************************************/ /** @brief Add new session_var with the given name and value to the current session (identified by the cookie with name SESSION_COOKIE_NAME and the given domain and path). If the name is already used, the value is re-written. If successful, returns pointer to a session_var node in the session's linked list, or NULL otherwise. */ SOAP_FMAC1 struct soap_session_var* SOAP_FMAC2 soap_set_session_var(struct soap *soap, const char *name, const char *value, const char *domain, const char *path) { struct soap_session *s; struct soap_session_var *v; time_t now = time(NULL); soap_purge_sessions(soap, domain, path, now); MUTEX_LOCK(sessions_lock); s = soap_session_internal_find(soap, domain, path, now); if (!s) { MUTEX_UNLOCK(sessions_lock); return NULL; } s->last_touched = now; if (s->rolling) soap_session_cookie_create(soap, s->id, domain, path, s->cookie_maxage); for (v = s->session_vars; v; v = v->next) if (!strcmp(v->name, name)) break; if (!v) { v = (struct soap_session_var*)SOAP_MALLOC(soap, sizeof(struct soap_session_var)); if (v) { size_t l = strlen(name); char *x = (char*)SOAP_MALLOC(soap, l + 1); v->name = x; if (v->name) soap_strcpy(x, l + 1, name); l = strlen(value); x = (char*)SOAP_MALLOC(soap, l + 1); v->value = x; if (v->value) soap_strcpy(x, l + 1, value); /* add to end of list */ if (s->num_session_vars == 0) s->session_vars = v; else s->session_vars_tail->next = v; s->session_vars_tail = v; s->session_vars_tail->next = NULL; s->num_session_vars++; } } else { size_t l = strlen(value); char *x; if (v->value) SOAP_FREE(soap, v->value); x = (char*)SOAP_MALLOC(soap, l + 1); v->value = x; if (v->value) soap_strcpy(x, l + 1, value); } MUTEX_UNLOCK(sessions_lock); return v; } /******************************************************************************/ /** @brief Frees all session vars in the current session (identified by the cookie with name SESSION_COOKIE_NAME and the given domain and path). */ SOAP_FMAC1 void SOAP_FMAC2 soap_clr_session_vars(struct soap *soap, const char *domain, const char *path) { struct soap_session *s; struct soap_session_var *v; time_t now = time(NULL); soap_purge_sessions(soap, domain, path, now); MUTEX_LOCK(sessions_lock); s = soap_session_internal_find(soap, domain, path, now); if (!s) { MUTEX_UNLOCK(sessions_lock); return; } s->last_touched = now; if (s->rolling) soap_session_cookie_create(soap, s->id, domain, path, s->cookie_maxage); v = s->session_vars; while (v) { struct soap_session_var *u; if (v->name) SOAP_FREE(soap, v->name); if (v->value) SOAP_FREE(soap, v->value); u = v->next; SOAP_FREE(soap, v); v = u; } s->session_vars = NULL; s->num_session_vars = 0; MUTEX_UNLOCK(sessions_lock); } /******************************************************************************/ /** @brief Frees session var with the given name in the current session (identified by the cookie with name SESSION_COOKIE_NAME and the given domain and path). */ SOAP_FMAC1 void SOAP_FMAC2 soap_clr_session_var(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_session *s; struct soap_session_var *v; time_t now = time(NULL); soap_purge_sessions(soap, domain, path, now); MUTEX_LOCK(sessions_lock); s = soap_session_internal_find(soap, domain, path, now); if (!s) { MUTEX_UNLOCK(sessions_lock); return; } s->last_touched = now; if (s->rolling) soap_session_cookie_create(soap, s->id, domain, path, s->cookie_maxage); for (v = s->session_vars; v; v = v->next) if (!strcmp(v->name, name)) break; if (!v) { MUTEX_UNLOCK(sessions_lock); return; } /* delete session var data */ if (v->name) SOAP_FREE(soap, v->name); if (v->value) SOAP_FREE(soap, v->value); struct soap_session_var *temp = v->next; /* deleting not last node */ if (temp != NULL) { /* adjust tail if this was second to last */ if (temp == s->session_vars_tail) s->session_vars_tail = v; v->name = temp->name; v->value = temp->value; v->next = temp->next; SOAP_FREE(soap, temp); } /* deleting the last node */ else { /* set tail to previous node */ struct soap_session_var *t = s->session_vars; while (t && t->next != v) t = t->next; s->session_vars_tail = t; if (s->session_vars_tail == NULL) s->session_vars = NULL; else s->session_vars_tail->next = NULL; SOAP_FREE(soap, v); } s->num_session_vars--; MUTEX_UNLOCK(sessions_lock); } /******************************************************************************/ #ifdef __cplusplus } #endif gsoap-2.8.91/gsoap/plugin/wsseapi-lite.h0000644000175000017500000001161013525245161017455 0ustar ellertellert/* wsseapi-lite.h WS-Security, lite version (time stamp and user name token only). See wsseapi-lite.c for documentation and details. gSOAP XML Web services tools Copyright (C) 2000-2015, 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-2015, 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 WSSEAPI_H #define WSSEAPI_H /* When using soapcpp2 option -q or -p, you need to change "soapH.h" below */ /* include soapH.h generated by soapcpp2 from .h file containing #import "wsse.h" */ #ifdef SOAP_H_FILE /* if set, use the soapcpp2-generated fileH.h file as specified with: cc ... -DSOAP_H_FILE=fileH.h */ # include "stdsoap2.h" # include SOAP_XSTRINGIFY(SOAP_H_FILE) #else # include "soapH.h" /* or manually replace with soapcpp2-generated *H.h file */ #endif #ifdef __cplusplus extern "C" { #endif extern const char *wsse_PasswordTextURI; SOAP_FMAC1 struct _wsse__Security * SOAP_FMAC2 soap_wsse_add_Security(struct soap *soap); SOAP_FMAC1 struct _wsse__Security * SOAP_FMAC2 soap_wsse_add_Security_actor(struct soap *soap, const char *actor); SOAP_FMAC1 void SOAP_FMAC2 soap_wsse_delete_Security(struct soap *soap); SOAP_FMAC1 struct _wsse__Security* SOAP_FMAC2 soap_wsse_Security(struct soap *soap); SOAP_FMAC1 struct ds__SignatureType * SOAP_FMAC2 soap_wsse_add_Signature(struct soap *soap); SOAP_FMAC1 void SOAP_FMAC2 soap_wsse_delete_Signature(struct soap *soap); SOAP_FMAC1 struct ds__SignatureType * SOAP_FMAC2 soap_wsse_Signature(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_Timestamp(struct soap *soap, const char *id, time_t lifetime); SOAP_FMAC1 struct _wsu__Timestamp * SOAP_FMAC2 soap_wsse_Timestamp(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_Timestamp(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_UsernameTokenText(struct soap *soap, const char *id, const char *username, const char *password); SOAP_FMAC1 struct _wsse__UsernameToken * SOAP_FMAC2 soap_wsse_UsernameToken(struct soap *soap, const char *id); SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsse_get_Username(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_Password(struct soap *soap, const char *password); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_fault(struct soap *soap, enum wsse__FaultcodeEnum fault, const char *detail); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_set_wsu_id(struct soap *soap, const char *tags); #ifdef __cplusplus } #endif #endif gsoap-2.8.91/gsoap/plugin/wstapi.h0000644000175000017500000001032313525245161016356 0ustar ellertellert/* wstapi.h WS-Trust plugin. See wstapi.c for documentation and details. gSOAP XML Web services tools Copyright (C) 2000-2016, 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-2016, 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 WSTAPI_H #define WSTAPI_H #include "wsaapi.h" /* also includes soapH.h, see wsaapi.h if you are using a different fileH.h */ #include "wsseapi.h" /* also includes soapH.h, see wsseapi.h if you are using a different fileH.h */ #include "smdevp.h" /* digest algos */ #include "mecevp.h" /* encryption algos */ #include "threads.h" /* mutex for sequence database */ extern const char *soap_wst_rst_action; extern const char *soap_wst_rstr_action; extern const char *soap_wst_rstc_action; extern const char *soap_wst_rstrc_action; #ifdef __cplusplus extern "C" { #endif SOAP_FMAC1 int SOAP_FMAC2 soap_wst_request_saml_token(struct soap *soap, const char *endpoint, int soapver, const char *applyto, const char *username, const char *password, saml1__AssertionType **saml1, saml2__AssertionType **saml2); SOAP_FMAC1 int SOAP_FMAC2 soap_wst_request_psha1_token(struct soap *soap, const char *endpoint, int soapver, const char *applyto, const char *username, const char *password, char *psha1, size_t psha1len); #ifdef __cplusplus } #endif SOAP_FMAC5 int SOAP_FMAC6 soap_call___wst__RequestSecurityToken(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct wst__RequestSecurityTokenType *wst__RequestSecurityToken, struct wst__RequestSecurityTokenResponseType *wst__RequestSecurityTokenResponse); SOAP_FMAC5 int SOAP_FMAC6 soap_call___wst__RequestSecurityTokenResponse(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct wst__RequestSecurityTokenResponseType *wst__RequestSecurityTokenResponse, struct wst__RequestSecurityTokenResponseCollectionType *wst__RequestSecurityTokenResponseCollection); SOAP_FMAC5 int SOAP_FMAC6 soap_call___wst__RequestSecurityTokenCollection(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct wst__RequestSecurityTokenCollectionType *wst__RequestSecurityTokenCollection, struct wst__RequestSecurityTokenResponseCollectionType *wst__RequestSecurityTokenResponseCollection); #endif gsoap-2.8.91/gsoap/plugin/calcrest.h0000644000175000017500000006133013525245161016653 0ustar ellertellert/* calcrest.h Generated by wsdl2h 2.8.37 from calcrest.wsdl and typemap.dat 2016-11-11 18:13:09 GMT DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS USE THE soapcpp2-GENERATED SOURCE CODE FILES FOR YOUR PROJECT BUILDS gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. 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 -------------------------------------------------------------------------------- */ /** @page page_notes Notes @note HINTS: - Run soapcpp2 on calcrest.h to generate the SOAP/XML processing logic. Use soapcpp2 -I to specify paths for #import To build with STL, 'stl.h' is imported from 'import' dir in package. Use soapcpp2 -j to generate improved proxy and server classes. Use soapcpp2 -r to generate a report. - Use wsdl2h -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. - Run Doxygen (www.doxygen.org) on this file to generate documentation. - Use wsdl2h -R to generate REST operations. - Use wsdl2h -nname to use name as the base namespace prefix instead of 'ns'. - Use wsdl2h -Nname for service prefix and produce multiple service bindings - Use wsdl2h -d to enable DOM support for xsd:anyType. - Use wsdl2h -g to auto-generate readers and writers for root elements. - Use wsdl2h -b to auto-generate bi-directional operations (duplex ops). - Use wsdl2h -U to map XML names to C++ Unicode identifiers instead of _xNNNN. - Use wsdl2h -u to disable the generation of unions. - Struct/class members serialized as XML attributes are annotated with a '@'. - Struct/class members that have a special role are annotated with a '$'. @warning DO NOT INCLUDE THIS ANNOTATED FILE DIRECTLY IN YOUR PROJECT SOURCE CODE. USE THE FILES GENERATED BY soapcpp2 FOR YOUR PROJECT'S SOURCE CODE: THE soapStub.h FILE CONTAINS THIS CONTENT WITHOUT ANNOTATIONS. @copyright LICENSE: @verbatim -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. The wsdl2h tool and its generated software are released under the GPL. This software is released under the GPL with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- @endverbatim */ //gsoapopt c,w /******************************************************************************\ * * * Definitions * * http://websrv.cs.fsu.edu/~engelen/calc.wsdl * * * \******************************************************************************/ /******************************************************************************\ * * * 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: ns1 = "http://websrv.cs.fsu.edu/~engelen/calc.wsdl" ns2 = "urn:calc" */ #define SOAP_NAMESPACE_OF_ns2 "urn:calc" //gsoap ns2 schema namespace: urn:calc //gsoap ns2 schema form: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * urn:calc * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * urn:calc * * * \******************************************************************************/ /// @brief "urn:calc":pair is a complexType. /// /// struct ns2__pair operations: /// - ns2__pair* soap_new_ns2__pair(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_ns2__pair(struct soap*, ns2__pair*) default initialize members /// - int soap_read_ns2__pair(struct soap*, ns2__pair*) deserialize from a source /// - int soap_write_ns2__pair(struct soap*, ns2__pair*) serialize to a sink /// - ns2__pair* soap_dup_ns2__pair(struct soap*, ns2__pair* dst, ns2__pair *src) returns deep copy of ns2__pair src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_ns2__pair(ns2__pair*) deep deletes ns2__pair data members, use only on dst after soap_dup_ns2__pair(NULL, ns2__pair *dst, ns2__pair *src) (use soapcpp2 -Ed) struct ns2__pair { /// Element "a" of XSD type xs:double. double a 1; ///< Required element. /// Element "b" of XSD type xs:double. double b 1; ///< Required element. }; /******************************************************************************\ * * * Additional Top-Level Elements * * urn:calc * * * \******************************************************************************/ /// @brief Top-level root element "urn:calc":add of XSD type "urn:calc":pair. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:calc":sub of XSD type "urn:calc":pair. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:calc":mul of XSD type "urn:calc":pair. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:calc":div of XSD type "urn:calc":pair. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:calc":pow of XSD type "urn:calc":pair. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:calc":addResponse of XSD type xs:double. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:calc":subResponse of XSD type xs:double. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:calc":mulResponse of XSD type xs:double. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:calc":divResponse of XSD type xs:double. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "urn:calc":powResponse of XSD type xs:double. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /******************************************************************************\ * * * Additional Top-Level Attributes * * urn:calc * * * \******************************************************************************/ /******************************************************************************\ * * * Services * * * \******************************************************************************/ //gsoap ns1 service name: calcPOST //gsoap ns1 service type: calcPortType //gsoap ns1 service port: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns1 service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl /** @mainpage calcPOST Definitions @section calcPOST_bindings Service Bindings - @ref calcPOST @section calcPOST_more More Information - @ref page_notes "Notes" - @ref page_XMLDataBinding "XML Data Binding" - @ref SOAP_ENV__Header "SOAP Header Content" (when applicable) - @ref SOAP_ENV__Detail "SOAP Fault Detail Content" (when applicable) */ /** @page calcPOST Binding "calcPOST" @section calcPOST_operations Operations of Binding "calcPOST" - @ref __ns1__add - @ref __ns1__sub - @ref __ns1__mul - @ref __ns1__div - @ref __ns1__pow @section calcPOST_ports Default endpoints of Binding "calcPOST" - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi @note Use wsdl2h option -Nname to change the service binding prefix name */ /******************************************************************************\ * * * Service Binding * * calcPOST * * * \******************************************************************************/ /******************************************************************************\ * * * Service Operation * * __ns1__add * * * \******************************************************************************/ /** Operation "__ns1__add" of service binding "calcPOST". - POST document/literal style messaging - Default endpoints: - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi - Addressing input action: "" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__add( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: struct ns2__pair* ns2__add, // output parameters: double *ns2__addResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__add( struct soap *soap, // input parameters: struct ns2__pair* ns2__add, // output parameters: double *ns2__addResponse ); @endcode */ //gsoap ns1 service method-protocol: add POST //gsoap ns1 service method-style: add document //gsoap ns1 service method-encoding: add literal //gsoap ns1 service method-action: add "" int __ns1__add( struct ns2__pair* ns2__add, ///< Input parameter double *ns2__addResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __ns1__sub * * * \******************************************************************************/ /** Operation "__ns1__sub" of service binding "calcPOST". - POST document/literal style messaging - Default endpoints: - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi - Addressing input action: "" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__sub( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: struct ns2__pair* ns2__sub, // output parameters: double *ns2__subResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__sub( struct soap *soap, // input parameters: struct ns2__pair* ns2__sub, // output parameters: double *ns2__subResponse ); @endcode */ //gsoap ns1 service method-protocol: sub POST //gsoap ns1 service method-style: sub document //gsoap ns1 service method-encoding: sub literal //gsoap ns1 service method-action: sub "" int __ns1__sub( struct ns2__pair* ns2__sub, ///< Input parameter double *ns2__subResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __ns1__mul * * * \******************************************************************************/ /** Operation "__ns1__mul" of service binding "calcPOST". - POST document/literal style messaging - Default endpoints: - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi - Addressing input action: "" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__mul( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: struct ns2__pair* ns2__mul, // output parameters: double *ns2__mulResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__mul( struct soap *soap, // input parameters: struct ns2__pair* ns2__mul, // output parameters: double *ns2__mulResponse ); @endcode */ //gsoap ns1 service method-protocol: mul POST //gsoap ns1 service method-style: mul document //gsoap ns1 service method-encoding: mul literal //gsoap ns1 service method-action: mul "" int __ns1__mul( struct ns2__pair* ns2__mul, ///< Input parameter double *ns2__mulResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __ns1__div * * * \******************************************************************************/ /** Operation "__ns1__div" of service binding "calcPOST". - POST document/literal style messaging - Default endpoints: - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi - Addressing input action: "" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__div( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: struct ns2__pair* ns2__div, // output parameters: double *ns2__divResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__div( struct soap *soap, // input parameters: struct ns2__pair* ns2__div, // output parameters: double *ns2__divResponse ); @endcode */ //gsoap ns1 service method-protocol: div POST //gsoap ns1 service method-style: div document //gsoap ns1 service method-encoding: div literal //gsoap ns1 service method-action: div "" int __ns1__div( struct ns2__pair* ns2__div, ///< Input parameter double *ns2__divResponse ///< Output parameter ); /******************************************************************************\ * * * Service Operation * * __ns1__pow * * * \******************************************************************************/ /** Operation "__ns1__pow" of service binding "calcPOST". - POST document/literal style messaging - Default endpoints: - http://websrv.cs.fsu.edu/~engelen/calcserver.cgi - Addressing input action: "" C stub function (defined in soapClient.c[pp] generated by soapcpp2): @code int soap_call___ns1__pow( struct soap *soap, NULL, // char *endpoint = NULL selects default endpoint for this operation NULL, // char *action = NULL selects default action for this operation // input parameters: struct ns2__pair* ns2__pow, // output parameters: double *ns2__powResponse ); @endcode C server function (called from the service dispatcher defined in soapServer.c[pp]): @code int __ns1__pow( struct soap *soap, // input parameters: struct ns2__pair* ns2__pow, // output parameters: double *ns2__powResponse ); @endcode */ //gsoap ns1 service method-protocol: pow POST //gsoap ns1 service method-style: pow document //gsoap ns1 service method-encoding: pow literal //gsoap ns1 service method-action: pow "" int __ns1__pow( struct ns2__pair* ns2__pow, ///< Input parameter double *ns2__powResponse ///< Output parameter ); /** @page calcPOST Binding "calcPOST" @section calcPOST_policy_enablers Policy Enablers of Binding "calcPOST" None specified. */ /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. Data can be read and deserialized from: - an int file descriptor, using soap->recvfd = fd - a socket, using soap->socket = (int)... - a C++ stream (istream, stringstream), using soap->is = (istream*)... - a C string, using soap->is = (const char*)... - any input, using the soap->frecv() callback Data can be serialized and written to: - an int file descriptor, using soap->sendfd = (int)... - a socket, using soap->socket = (int)... - a C++ stream (ostream, stringstream), using soap->os = (ostream*)... - a C string, using soap->os = (const char**)... - any output, using the soap->fsend() callback The following options are available for (de)serialization control: - soap->encodingStyle = NULL; to remove SOAP 1.1/1.2 encodingStyle - soap_mode(soap, SOAP_XML_TREE); XML without id-ref (no cycles!) - soap_mode(soap, SOAP_XML_GRAPH); XML with id-ref (including cycles) - soap_set_namespaces(soap, struct Namespace *nsmap); to set xmlns bindings @section ns2 Top-level root elements of schema "urn:calc" - (use wsdl2h option -g to auto-generate type _ns2__add) - (use wsdl2h option -g to auto-generate type _ns2__sub) - (use wsdl2h option -g to auto-generate type _ns2__mul) - (use wsdl2h option -g to auto-generate type _ns2__div) - (use wsdl2h option -g to auto-generate type _ns2__pow) - (use wsdl2h option -g to auto-generate type _ns2__addResponse) - (use wsdl2h option -g to auto-generate type _ns2__subResponse) - (use wsdl2h option -g to auto-generate type _ns2__mulResponse) - (use wsdl2h option -g to auto-generate type _ns2__divResponse) - (use wsdl2h option -g to auto-generate type _ns2__powResponse) */ /* End of calcrest.h */ gsoap-2.8.91/gsoap/plugin/wsddapi.c0000644000175000017500000016535013525245161016510 0ustar ellertellert/* wsddapi.c WS-Discovery 1.0 and 1.1 (WSDD) plugin API See gsoap/doc/wsdd for the WSDD plugin user guide. gSOAP XML Web services tools Copyright (C) 2000-2011, 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-2011, 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 -------------------------------------------------------------------------------- */ /** @mainpage - @ref wsdd_0 documents the wsdd library for WS-Discovery support. */ /** @page wsdd_0 The WS-Discovery plugin [TOC] @section wsdd_1 WS-Discovery Setup The material in this section relates to the WS-Discovery specification. To use the wsdd library: -# Define WS-Discovery event handlers in your code, see Section @ref wsdd_2. -# Use the wsdd API functions as described below. -# (Re-)compile and link stdsoap2.c/pp or libgsoap, (dom.c/.cpp when needed), wsddapi.c, wsaapi.c and the soapcpp2-generated source files. Compile and link with plugin/threads.c when needed. The material in this document pertains to the WS-Discovery protocol and model and assumes that the reader is familiar with the WS-Discovery protocol, its terms and definitions, and the WS-Discovery model. This document describes the WS-Discovery interface to invoke and handle WS-Discovery events, while the higher-level logic remains application-specific. Especially the mode of operation, ad-hoc or managed with a Discovery Proxy, depends on the application deployment and WS-Discovery support requirements. The following assumptions are made. A Client (C) is an endpoint that searches for Target Service(s). A Target Service (TS) is a service endpoint that makes itself available for discovery. A Discovery Proxy (DP) is an endpoint that facilitates discovery of Target Services by Clients. The interfaces defined in the wsdd library can be used to implement Client, Target Service, and Discovery Proxy operations. WS-Discovery ad-hoc and managed modes are supported by the wsdd library. In an ad-hoc mode discovery messages are sent multicast and response messages are sent unicast. In a managed mode discovery messages are sent unicast to a Discovery Proxy. @note The wsdl2h tool uses typemap.dat to auto-generate a gSOAP service definitions header file that imports wsdd.h to support WS-Discovery 1.1 with WS-Addressing 2005/08. The tool imports wsdd10.h to support WS-Discovery 1.0 with WS-Addressing 2004/08. To use WS-Discovery 1.0 with WS-Addressing 2005/08, you will need to change typemap.dat to let wsdl2h import wsdd5.h (see comments in typemap.dat). @section wsdd_2 WS-Discovery Event Handlers The following event handlers MUST be defined by the user to handle inbound WS-Discovery messages. The event handlers receive notifications (Hello, Bye, ProbeMatches, and ResolveMatches) or receive requests to provide data (Probe and Resolve). The event handlers to define are: - @ref wsdd_event_Hello - @ref wsdd_event_Bye - @ref wsdd_event_Probe - @ref wsdd_event_ProbeMatches - @ref wsdd_event_Resolve - @ref wsdd_event_ResolveMatches See the documentation provided with each of these functions in wsddapi.h. @section wsdd_3 WS-Discovery Event Listener Inbound WS-Discovery multicast messages are handled via a listener on a port. The user-defined event handlers are invoked when WS-Discovery messages arrive on the port. The `soap_wsdd_listen` function listens on the current port opened with `soap_bind` for WS-Discovery messages for a brief time period as specified by a timeout value in seconds (negative for micro seconds). The function allows for periodically polling the port as shown: @code #include "wsddapi.h" int port = 8080; struct soap *soap = soap_new(); soap->user = (void*)&my_state; if (!soap_valid_socket(soap_bind(soap, port, 100))) { soap_print_fault(soap, stderr); exit(0); } soap_wsdd_listen(soap, -1000); // listen for messages for 1 ms ... @endcode WS-Discovery messages are relayed to the event handlers. The soap->user pointer can be used to point to a state object that is updated by the event handlers as per desired behavior at the Client side, the Target Service, or the Discovery Proxy implementation. @section wsdd_4 Invoking WS-Discovery Operations A Client may invoke the following WS-Discovery operations: - `soap_wsdd_Probe` - `soap_wsdd_Resolve` A Target Service may invoke the following WS-Discovery operations: - `soap_wsdd_Hello` - `soap_wsdd_Bye` - `soap_wsdd_ProbeMatches` (automatic via `soap_wsdd_listen`) - `soap_wsdd_ResolveMatches` (automatic via `soap_wsdd_listen`) A Discovery Proxy can perform all operations listed above, and should use "wsdd:DiscoveryProxy" as the Type with the Hello, Bye, and ProbeMatches. To send a Hello message to join a network: @code soap_wsdd_Hello(soap, SOAP_WSDD_MANAGED, // or SOAP_WSDD_ADHOC for ad-hoc mode "to address", // "http(s):" URL, or "soap.udp:" UDP, or TCP/IP address soap_wsa_rand_uuid(soap), // a unique message ID NULL, "my address", // where they can find me for WS-Discovery "wsdd:DiscoveryProxy",// Types: I'm a DP NULL, // Scope NULL, // MatchBy NULL, // XAddrs 75965); // MDVersion @endcode Note that `Types` above is a string with namespace-qualified names (QNames). These should be qualified as in "namespace":name or you can use a namespace prefix that is part of your namespace table (in the .nsmap). So you can use "wsdd:DiscoveryPRoxy" as a QName in Types because wsdd is a namespace prefix with a defined binding in the namespace table. For UDP multicast, use @code soap.connect_flags = SO_BROADCAST; @endcode and optionally set the interface and TTL settings: @code in_addr_t addr = inet_addr("1.2.3.4"); soap.ipv4_multicast_if = &addr; // see setsockopt IPPROTO_IP IP_MULTICAST_IF soap.ipv6_multicast_if = addr; // multicast sin6_scope_id soap.ipv4_multicast_ttl = 1; // see setsockopt IPPROTO_IP, IP_MULTICAST_TTL @endcode Please refer to the socket options for `IPPROTO_IP` `IP_MULTICAST_IF` to specify the default interface for multicast datagrams to be sent from. Otherwise, the default interface set by the system administrator will be used (if any). Please refer to the socket options for `IPPROTO_IP` `IP_MULTICAST_TTL` to limit the lifetime of the packet. Multicast datagrams are sent with a default value of 1, to prevent them to be forwarded beyond the local network. This parameter can be set between 1 to 255. To send a Bye message to leave a network: @code soap_wsdd_Bye(soap, SOAP_WSDD_MANAGED, // or SOAP_WSDD_ADHOC for ad-hoc mode "to address", // "http(s):" URL, or "soap.udp:" UDP, or TCP/IP address soap_wsa_rand_uuid(soap), // a unique message ID NULL, "my address", // where they can find me for WS-Discovery "wsdd:DiscoveryProxy",// Types: I'm a DP NULL, // Scope NULL, // MatchBy NULL, // XAddrs 75965); // MDVersion @endcode To send a Probe message (see WS-Discovery 1.1 Section 1.7) and then listen to ProbeMatches: @code struct soap soap = soap_new(); // to invoke messages struct soap serv = soap_new(); // for the listener and event handlers soap_bind(serv, port, 100); const char *id = soap_wsa_rand_uuid(soap); serv->user = (void*)&my_state; my_state.probe_id = id; soap_wsdd_Probe(soap, SOAP_WSDD_ADHOC, // ad-hoc mode SOAP_WSDD_TO_TS, // to a TS "to address", // address of TS id, // message ID NULL, // ReplyTo "\"http://printer.example.org/2003/imaging\":PrintBasic", "ldap:///ou=engineering,o=examplecom,c=us", "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01/ldap"); soap_wsdd_listen(serv, -1000); @endcode The `id` above is the WS-Addressing message ID that will be included in the ProbeMatches RelatesTo WS-Addressing header. As an example, `my_state` is set to this `id` so that when the `wsdd_event_ProbeMatches` event handler is invoked it can find the `id` in the current state that is pointed to by `serv->user` (`soap->user` in the handler). To send a Resolve message and then listen to ResolveMatches: @code struct soap soap = soap_new(); // to invoke messages struct soap serv = soap_new(); // for the listener and event handlers soap_bind(serv, port, 100); const char *id = soap_wsa_rand_uuid(soap); serv->user = (void*)&my_state; my_state.resolve_id = id; soap_wsdd_Resolve(soap, SOAP_WSDD_ADHOC, // ad-hoc mode SOAP_WSDD_TO_TS, // to a TS "to address", // address to send to id, // message ID NULL, // ReplyTo "endpoint"); // EndpointReference of TS soap_wsdd_listen(serv, -1000); @endcode Again, the `id` and `my_state` are used to associate the asynchronously received ResolveMatches response that is handled by the @ref wsdd_event_ResolveMatches for the original request. In managed mode with unicast messages (request-response messages), the `soap_wsdd_Probe` and `soap_wsdd_Resolve` are sufficient to invoke without setting up a listener. The event handlers are invoked when the unicast response message arrives. In managed mode, the ProbeMatches and ResolveMatches are automatically sent via `soap_wsdd_listen` and the event `wsdd_event_Probe` and `wsdd_event_Resolve` handlers. These event handlers should set the matches to be returned. In ad-hoc mode, ProbeMatches or ResolveMatches responses are NOT sent automatically. In ad-hoc mode the responses can be returned by adding code to the event handler or from anywhere in the main program, for example after @ref soap_wsdd_listen. When responses are to be returned from the event handler or from the main program, you should invoke @ref soap_wsdd_ProbeMatches and @ref soap_wsdd_ResolveMatches to explicitly send unicast messages with the match(es) back to the clients. The WS-Addressing ReplyTo address can be used as the return address (when not anonymous), or by using the peer's host information that is accessible in the soap->peer and soap->peerlen members. For example: @code char host[1024], port[16]; getnameinfo((struct sockaddr*)&soap->peer, soap->peerlen, host, sizeof(host), port, 16, NI_DGRAM | NI_NAMEREQD | NI_NUMERICSERV); @endcode @section wsdd_5 Generating C++ Server Objects The WSDD plugin is developed to support C and C++. To support C++ server objects generated with soapcpp2 option `-j` (or `-i`), run soapcpp2 again: soapcpp2 -a -j -Iimport import/wsdd.h You should define in your C++ code the following wrappers (use `this` instead of `this->soap` below with soapcpp2 option `-i`): @code int wsddService::Hello(struct wsdd__HelloType *hello) { return __wsdd__Hello(this->soap, hello); } int wsddService::Bye(struct wsdd__ByeType *bye) { return __wsdd__Bye(this->soap, bye); } int wsddService::Probe(struct wsdd__ProbeType *probe) { return __wsdd__Probe(this->soap, probe); } int wsddService::ProbeMatches(struct wsdd__ProbeMatchesType *matches) { return __wsdd__ProbeMatches(this->soap, matches); } int wsddService::Resolve(struct wsdd__ResolveType *resolve) { return __wsdd__Resolve(this->soap, resolve); } int wsddService::ResolveMatches(struct wsdd__ResolveMatchesType *matches) { return __wsdd__ResolveMatches(this->soap, matches); } @endcode Note that soapcpp2 option `-a` may be needed to enable automatic service dispatching of WS-Addressing services based on the SOAP Action value instead of the SOAP/XML request operation. Another approach to generate the WSDD service operations is to run soapcpp2 separately on wsdd.h (or wsdd5.h or wsdd10.h for WS-Discovery 1.0) by: soapcpp2 -a -L -pwsdd -Iimport import/wsdd.h Now with this approach you must chain the service operations at the server side as follows: @code if (soap_begin_serve(service.soap) == SOAP_OK) if (service.dispatch() == SOAP_NO_METHOD) soap_serve_request(service.soap); @endcode where the `service` object is an instance of the application services generated by soapcpp2 `-j`. @section wsdd_6 Miscellaneous You must generate client-side operations that the WSDD library expects to be linked with, by executing: soapcpp2 -a -L -pwsdd -Iimport import/wsdd.h Then change wsddapi.h to use `#include "wsddH.h"` and compile and link the generated wsddClient.cpp code with your project. For server-side projects, also compile and link the generated wsddServer.cpp code. You will also need to implement the @ref wsdd_2. Because WS-Addressing may relay faults to a FaultTo service, when implementing a service you will also have to define a SOAP Fault service operation to accept and handle these: @code int SOAP_ENV__Fault(struct soap *soap, char *faultcode, char *faultstring, char *faultactor, struct SOAP_ENV__Detail *detail, struct SOAP_ENV__Code *SOAP_ENV__Code, struct SOAP_ENV__Reason *SOAP_ENV__Reason, char *SOAP_ENV__Node, char *SOAP_ENV__Role, struct SOAP_ENV__Detail *SOAP_ENV__Detail) { ... = faultcode; // SOAP 1.1 fault code string (QName) ... = faultstring; // SOAP 1.1 fault string ... = faultactor; // SOAP 1.1 fault actor string ... = detail; // SOAP 1.1 fault detail struct ... = SOAP_ENV__Code; // SOAP 1.2 fault code struct ... = SOAP_ENV__Reason; // SOAP 1.2 reason struct ... = SOAP_ENV__Node; // SOAP 1.2 node string ... = SOAP_ENV__Role; // SOAP 1.2 role string ... = SOAP_ENV__Detail; // SOAP 1.2 detail struct return SOAP_OK; } @endcode When implementing a WS-Discovery client and/or server without any other XML Web services, the above suffices to generate the required code. */ #include "wsddapi.h" #ifdef SOAP_WSDD_2005 /* WS-Discovery 1.0 2005 */ const char *to_ts_URL = "urn:schemas-xmlsoap-org:ws:2005:04:discovery"; #else /* WS-Discovery 1.1 2009 */ const char *to_ts_URL = "urn:docs-oasis-open-org:ws-dd:ns:discovery:2009:01"; #endif /******************************************************************************\ * * WS-Discovery AppSequence State * \******************************************************************************/ static MUTEX_TYPE soap_wsdd_state = MUTEX_INITIALIZER; static unsigned int soap_wsdd_InstanceId = 0; static const char *soap_wsdd_SequenceId = NULL; static unsigned int soap_wsdd_MessageNumber = 1; static int soap_wsdd_serve___wsdd__Hello(struct soap *soap); static int soap_wsdd_serve___wsdd__Bye(struct soap *soap); static int soap_wsdd_serve___wsdd__Probe(struct soap *soap); static int soap_wsdd_serve___wsdd__ProbeMatches(struct soap *soap); static int soap_wsdd_serve___wsdd__Resolve(struct soap *soap); static int soap_wsdd_serve___wsdd__ResolveMatches(struct soap *soap); static void soap_wsdd_set_AppSequence(struct soap*); static void soap_wsdd_reset_AppSequence(struct soap*); static void soap_wsdd_delay(struct soap*); /******************************************************************************\ * * WS-Discovery Outbound Messages * \******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /** @fn int soap_wsdd_Hello(struct soap *soap, soap_wsdd_mode mode, const char *endpoint, const char *MessageID, const char *RelatesTo, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion) @brief TS or DP Hello message to join a network. @param soap context @param[in] mode SOAP_WSDD_MANAGED or SOAP_WSDD_ADHOC @param[in] endpoint to send Hello message to (unicast or multicast) @param[in] MessageID unique WS-Addressing message ID (@ref soap_wsa_rand_uuid) @param[in] RelatesTo WS-Addressing message ID @param[in] EndpointReference of this Target Server or Discovery Proxy @param[in] Types an unordered string of QNames or NULL, a Discovery Proxy MUST include "wsdd:DiscoveryProxy" @param[in] Scopes an unordered set of scopes or NULL @param[in] MatchBy NULL (unused, reserved) @param[in] XAddrs contains the transport address(es) that MAY be used to communicate with the Target Service or Discovery Proxy @param[in] MetadataVersion incremented by a positive value (>= 1) whenever there is a change in the metadata of the Target Service @return SOAP_OK or error code Hello is a one-way message sent by a Target Service to announce its availability when it joins the network. It is also sent by a Discovery Proxy to reduce multicast traffic on an ad hoc network. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsdd_Hello(struct soap *soap, soap_wsdd_mode mode, const char *endpoint, const char *MessageID, const char *RelatesTo, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion) { struct wsdd__HelloType req; struct wsdd__ScopesType scopes; const char *Action = SOAP_NAMESPACE_OF_wsdd"/Hello"; const char *To = endpoint; /* SOAP Header */ if (mode == SOAP_WSDD_ADHOC) To = to_ts_URL; soap_wsa_request(soap, MessageID, To, Action); soap_wsa_add_RelatesTo(soap, RelatesTo); #ifdef SOAP_WSDD_2005 soap_wsdd_set_AppSequence(soap); #else if (mode == SOAP_WSDD_ADHOC) soap_wsdd_set_AppSequence(soap); else soap_wsdd_reset_AppSequence(soap); #endif /* Hello */ soap_default_wsdd__HelloType(soap, &req); #ifdef SOAP_WSA_2005 req.wsa5__EndpointReference.Address = (char*)EndpointReference; #else req.wsa__EndpointReference.Address = (char*)EndpointReference; #endif req.Types = (char*)Types; if (Scopes) { soap_default_wsdd__ScopesType(soap, &scopes); scopes.__item = (char*)Scopes; scopes.MatchBy = (char*)MatchBy; req.Scopes = &scopes; } req.XAddrs = (char*)XAddrs; req.MetadataVersion = MetadataVersion; if (soap_send___wsdd__Hello(soap, endpoint, Action, &req)) return soap->error; /* HTTP(S) POST expects an HTTP OK response */ if (endpoint && !strncmp(endpoint, "http", 4)) return soap_recv_empty_response(soap); return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsdd_Bye(struct soap *soap, soap_wsdd_mode mode, const char *endpoint, const char *MessageID, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion) @brief TS or DP Bye message to leave a network. @param soap context @param[in] mode SOAP_WSDD_MANAGED or SOAP_WSDD_ADHOC @param[in] endpoint to send Bye message to (unicast or multicast) @param[in] MessageID unique WS-Addressing message ID (@ref soap_wsa_rand_uuid) @param[in] EndpointReference of this Target Server or Discovery Proxy @param[in] Types an unordered string of QNames or NULL, a Discovery Proxy MUST include "wsdd:DiscoveryProxy" @param[in] Scopes an unordered set of scopes or NULL @param[in] MatchBy NULL (unused, reserved) @param[in] XAddrs contains the transport address(es) that MAY be used to communicate with the Target Service or Discovery Proxy @param[in] MetadataVersion incremented by a positive value (>= 1) whenever there is a change in the metadata of the Target Service @return SOAP_OK or error code Bye is a one-way message sent by a Target Service to announce its unavailability as a best effort when it leaves the network. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsdd_Bye(struct soap *soap, soap_wsdd_mode mode, const char *endpoint, const char *MessageID, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion) { struct wsdd__ByeType req; struct wsdd__ScopesType scopes; const char *Action = SOAP_NAMESPACE_OF_wsdd"/Bye"; const char *To = endpoint; /* SOAP Header */ if (mode == SOAP_WSDD_ADHOC) To = to_ts_URL; soap_wsa_request(soap, MessageID, To, Action); #ifdef SOAP_WSDD_2005 soap_wsdd_set_AppSequence(soap); #else if (mode == SOAP_WSDD_ADHOC) soap_wsdd_set_AppSequence(soap); else soap_wsdd_reset_AppSequence(soap); #endif /* Bye */ soap_default_wsdd__ByeType(soap, &req); #ifdef SOAP_WSA_2005 req.wsa5__EndpointReference.Address = (char*)EndpointReference; #else req.wsa__EndpointReference.Address = (char*)EndpointReference; #endif req.Types = (char*)Types; if (Scopes) { soap_default_wsdd__ScopesType(soap, &scopes); scopes.__item = (char*)Scopes; scopes.MatchBy = (char*)MatchBy; req.Scopes = &scopes; } req.XAddrs = (char*)XAddrs; req.MetadataVersion = &MetadataVersion; if (soap_send___wsdd__Bye(soap, endpoint, Action, &req)) return soap->error; /* HTTP(S) POST expects an HTTP OK response */ if (endpoint && !strncmp(endpoint, "http", 4)) return soap_recv_empty_response(soap); return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsdd_Probe(struct soap *soap, soap_wsdd_mode mode, soap_wsdd_to to, const char *endpoint, const char *MessageID, const char *ReplyTo, const char *Types, const char *Scopes, const char *MatchBy) @brief Client Probe message to a TS or DP. @param soap context @param[in] mode SOAP_WSDD_MANAGED or SOAP_WSDD_ADHOC @param[in] to SOAP_WSDD_TO_TS or SOAP_WSDD_TO_DP @param[in] endpoint to send Probe to (unicast or multicast) @param[in] MessageID WS-Addressing message ID of the message @param[in] ReplyTo WS-Addressing ReplyTo message ID of the message @param[in] Types an unordered string of QNames to probe @param[in] Scopes an unordered set of scopes to probe @param[in] MatchBy matching rule to apply for this probe @return SOAP_OK or error code A Client sends a probe to find Target Services by the Type of the Target Service, a Scope in which the Target Service resides, both, or simply all Target Services. The matches will be delivered to @ref wsdd_event_ProbeMatches when @ref soap_wsdd_listen receives a ProbeMatch response. The RelatesTo of the ProbeMatches is the MessageID of the Probe. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsdd_Probe(struct soap *soap, soap_wsdd_mode mode, soap_wsdd_to to, const char *endpoint, const char *MessageID, const char *ReplyTo, const char *Types, const char *Scopes, const char *MatchBy) { unsigned int InstanceId = 0; const char *SequenceId = NULL; unsigned int MessageNumber = 0; struct wsdd__ProbeType req; struct __wsdd__ProbeMatches res; struct wsdd__ScopesType scopes; const char *Action = SOAP_NAMESPACE_OF_wsdd"/Probe"; const char *To = endpoint; /* SOAP Header */ if (to == SOAP_WSDD_TO_TS) To = to_ts_URL; soap_wsa_request(soap, MessageID, To, Action); soap_wsa_add_ReplyTo(soap, ReplyTo); soap_wsdd_reset_AppSequence(soap); /* Probe */ soap_default_wsdd__ProbeType(soap, &req); req.Types = (char*)Types; if (Scopes) { soap_default_wsdd__ScopesType(soap, &scopes); scopes.__item = (char*)Scopes; scopes.MatchBy = (char*)MatchBy; req.Scopes = &scopes; } if (soap_send___wsdd__Probe(soap, endpoint, Action, &req)) return soap->error; /* ad-hoc mode: we're done */ if (mode == SOAP_WSDD_ADHOC) { /* HTTP(S) POST expects an HTTP OK response */ if (endpoint && !strncmp(endpoint, "http", 4)) return soap_recv_empty_response(soap); } else { /* managed mode: receive the matches */ if (soap_recv___wsdd__ProbeMatches(soap, &res)) return soap->error; /* check Header WSDD */ if (!soap->header) return soap_wsa_sender_fault(soap, "WSDD ProbeMatches incomplete", NULL); if (soap->header->wsdd__AppSequence) { wsdd__AppSequenceType *seq = soap->header->wsdd__AppSequence; InstanceId = seq->InstanceId; SequenceId = seq->SequenceId; MessageNumber = seq->MessageNumber; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "AppSeq id=%u seq=%s msg=%u\n", InstanceId, SequenceId ? SequenceId : "(null)", MessageNumber)); } /* pass probe matches on to user-defined event handler */ wsdd_event_ProbeMatches(soap, InstanceId, SequenceId, MessageNumber, #ifdef SOAP_WSA_2005 soap->header->wsa5__MessageID, soap->header->wsa5__RelatesTo ? soap->header->wsa5__RelatesTo->__item : NULL, #else soap->header->wsa__MessageID, soap->header->wsa__RelatesTo ? soap->header->wsa__RelatesTo->__item : NULL, #endif res.wsdd__ProbeMatches); } return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsdd_Resolve(struct soap *soap, soap_wsdd_mode mode, soap_wsdd_to to, const char *endpoint, const char *MessageID, const char *ReplyTo, const char *EndpointReference) @brief Client Resolve message to a TS or DP. @param soap context @param[in] mode SOAP_WSDD_MANAGED or SOAP_WSDD_ADHOC @param[in] to SOAP_WSDD_TO_TS or SOAP_WSDD_TO_DP @param[in] endpoint to send Resolve to (unicast or multicast) @param[in] MessageID WS-Addressing message ID of the message @param[in] ReplyTo WS-Addressing ReplyTo message ID of the message @param[in] EndpointReference of the Target Service or Discovery Proxy @return SOAP_OK or error code A Client sends a resolve to locate a Target Service, i.e., to retrieve its transport address(es). This server-side event handler returns the match(es). The matches will be delivered to @ref wsdd_event_ResolveMatches when @ref soap_wsdd_listen receives a ResolveMatch response. The RelatesTo of the ResolveMatches is the MessageID of the Resolve. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsdd_Resolve(struct soap *soap, soap_wsdd_mode mode, soap_wsdd_to to, const char *endpoint, const char *MessageID, const char *ReplyTo, const char *EndpointReference) { unsigned int InstanceId = 0; const char *SequenceId = NULL; unsigned int MessageNumber = 0; struct wsdd__ResolveType req; struct __wsdd__ResolveMatches res; const char *Action = SOAP_NAMESPACE_OF_wsdd"/Resolve"; const char *To = endpoint; /* SOAP Header */ if (to == SOAP_WSDD_TO_TS) To = to_ts_URL; soap_wsa_request(soap, MessageID, To, Action); soap_wsa_add_ReplyTo(soap, ReplyTo); soap_wsdd_reset_AppSequence(soap); /* Resolve */ soap_default_wsdd__ResolveType(soap, &req); #ifdef SOAP_WSA_2005 req.wsa5__EndpointReference.Address = (char*)EndpointReference; #else req.wsa__EndpointReference.Address = (char*)EndpointReference; #endif if (soap_send___wsdd__Resolve(soap, endpoint, Action, &req)) return soap->error; /* ad-hoc mode: we're done */ if (mode == SOAP_WSDD_ADHOC) { /* HTTP(S) POST expects an HTTP OK response */ if (endpoint && !strncmp(endpoint, "http", 4)) return soap_recv_empty_response(soap); } else { /* managed mode: receive the matches */ if (soap_recv___wsdd__ResolveMatches(soap, &res)) return soap->error; /* check Header WSDD */ if (!soap->header) return soap_wsa_sender_fault(soap, "WSDD ProbeMatches incomplete", NULL); if (soap->header->wsdd__AppSequence) { wsdd__AppSequenceType *seq = soap->header->wsdd__AppSequence; InstanceId = seq->InstanceId; SequenceId = seq->SequenceId; MessageNumber = seq->MessageNumber; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "AppSeq id=%u seq=%s msg=%u\n", InstanceId, SequenceId ? SequenceId : "(null)", MessageNumber)); } /* pass probe matches on to user-defined event handler */ if (res.wsdd__ResolveMatches && res.wsdd__ResolveMatches->ResolveMatch) wsdd_event_ResolveMatches(soap, InstanceId, SequenceId, MessageNumber, #ifdef SOAP_WSA_2005 soap->header->wsa5__MessageID, soap->header->wsa5__RelatesTo ? soap->header->wsa5__RelatesTo->__item : NULL, #else soap->header->wsa__MessageID, soap->header->wsa__RelatesTo ? soap->header->wsa__RelatesTo->__item : NULL, #endif res.wsdd__ResolveMatches->ResolveMatch); } return SOAP_OK; } /******************************************************************************/ /** @fn void soap_wsdd_init_ProbeMatches(struct soap *soap, struct wsdd__ProbeMatchesType *matches) @brief Initalize the probe matches container. @param soap context @param matches the container with matches to initialize */ SOAP_FMAC1 void SOAP_FMAC2 soap_wsdd_init_ProbeMatches(struct soap *soap, struct wsdd__ProbeMatchesType *matches) { soap_default_wsdd__ProbeMatchesType(soap, matches); } /******************************************************************************/ /** @fn int soap_wsdd_add_ProbeMatch(struct soap *soap, struct wsdd__ProbeMatchesType *matches, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion) @brief Add a match to the probe matches container. @param soap context @param matches the container to update with a new match @param[in] EndpointReference of this Target Server or Discovery Proxy @param[in] Types an unordered string of QNames or NULL, a Discovery Proxy MUST include "wsdd:DiscoveryProxy" @param[in] Scopes an unordered set of scopes or NULL @param[in] MatchBy NULL (unused, reserved) @param[in] XAddrs contains the transport address(es) that MAY be used to communicate with the Target Service or Discovery Proxy @param[in] MetadataVersion incremented by a positive value (>= 1) whenever there is a change in the metadata of the Target Service @return SOAP_OK or error code To populate a Prove matches container, first initialize with @ref soap_wsdd_init_ProbeMatches, then use this function to add each match. The container is deallocated with soap_end(soap) and can be initialized again (without leaks). */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsdd_add_ProbeMatch(struct soap *soap, struct wsdd__ProbeMatchesType *matches, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion) { int n = 0, k = matches->__sizeProbeMatch; struct wsdd__ProbeMatchType *m; /* need to increase space? */ if (k == 0) n = 4; else if (k >= 4 && (k & (k - 1)) == 0) n = 2 * k; /* yes we do */ if (n) { struct wsdd__ProbeMatchType *tmp = (struct wsdd__ProbeMatchType*)soap_malloc(soap, n * sizeof(struct wsdd__ProbeMatchType)); int i; if (!tmp) return soap->error = SOAP_EOM; for (i = 0; i < k; i++) tmp[i] = matches->ProbeMatch[i]; matches->ProbeMatch = tmp; } /* add entry */ m = &matches->ProbeMatch[k]; soap_default_wsdd__ProbeMatchType(soap, m); #ifdef SOAP_WSA_2005 m->wsa5__EndpointReference.Address = (char*)EndpointReference; #else m->wsa__EndpointReference.Address = (char*)EndpointReference; #endif m->Types = (char*)Types; if (Scopes) { m->Scopes = (struct wsdd__ScopesType*)soap_malloc(soap, sizeof(struct wsdd__ScopesType)); soap_default_wsdd__ScopesType(soap, m->Scopes); m->Scopes->__item = (char*)Scopes; m->Scopes->MatchBy = (char*)MatchBy; } m->XAddrs = (char*)XAddrs; m->MetadataVersion = MetadataVersion; matches->__sizeProbeMatch++; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsdd_ProbeMatches(struct soap *soap, const char *endpoint, const char *MessageID, const char *RelatesTo, const char *To, struct wsdd__ProbeMatchesType *matches) @brief TS or DP ProbeMatches message. @param soap context @param[in] endpoint to send Probe to (unicast or multicast) @param[in] MessageID WS-Addressing message ID of the message @param[in] RelatesTo WS-Addressing RelatesTo message ID of the message @param[in] To WS-Addressing endpoint IP and port or NULL for anonymous @param[in] matches contains the probe matches, use @ref soap_wsdd_add_ProbeMatch to populate this container @return SOAP_OK or error code A Client sends a probe to find Target Services by the Type of the Target Service, a Scope in which the Target Service resides, both, or simply all Target Services. The Target Server(s) or Discovery Proxy responds by sending ProbeMatches to the Client. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsdd_ProbeMatches(struct soap *soap, const char *endpoint, const char *MessageID, const char *RelatesTo, const char *To, struct wsdd__ProbeMatchesType *matches) { const char *Action = SOAP_NAMESPACE_OF_wsdd"/ProbeMatches"; /* 0..APP_MAX_DELAY ms delay */ soap_wsdd_delay(soap); /* SOAP Header */ soap_wsa_request(soap, MessageID, To, Action); soap_wsa_add_RelatesTo(soap, RelatesTo); soap_wsdd_set_AppSequence(soap); /* ProbeMatches */ if (soap_send___wsdd__ProbeMatches(soap, endpoint, Action, matches)) return soap->error; /* HTTP(S) POST expects an HTTP OK response */ if (endpoint && !strncmp(endpoint, "http", 4)) return soap_recv_empty_response(soap); return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsdd_ResolveMatches(struct soap *soap, const char *endpoint, const char *MessageID, const char *RelatesTo, const char *To, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion) @brief TS or DP ResolveMatches message. @param soap context @param[in] endpoint to send Probe to (unicast or multicast) @param[in] MessageID WS-Addressing message ID of the message @param[in] RelatesTo WS-Addressing RelatesTo message ID of the message @param[in] To WS-Addressing endpoint IP and port or NULL for anonymous @param[in] EndpointReference of the Target Service @param[in] Types an unordered string of QNames or NULL, a Discovery Proxy MUST include "wsdd:DiscoveryProxy" @param[in] Scopes an unordered set of scopes or NULL @param[in] MatchBy NULL (unused, reserved) @param[in] XAddrs contains the transport address(es) that MAY be used to communicate with the Target Service or Discovery Proxy @param[in] MetadataVersion incremented by a positive value (>= 1) whenever there is a change in the metadata of the Target Service @return SOAP_OK or error code A Client sends a resolve to locate a Target Service, i.e., to retrieve its transport address(es). The Target Server(s) or Discovery Proxy responds by sending ResolveMatches to the Client. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsdd_ResolveMatches(struct soap *soap, const char *endpoint, const char *MessageID, const char *RelatesTo, const char *To, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion) { struct wsdd__ResolveMatchesType res; struct wsdd__ResolveMatchType match; struct wsdd__ScopesType scopes; const char *Action = SOAP_NAMESPACE_OF_wsdd"/ResolveMatches"; /* 0..APP_MAX_DELAY ms delay */ soap_wsdd_delay(soap); /* SOAP Header */ soap_wsa_request(soap, MessageID, To, Action); soap_wsa_add_RelatesTo(soap, RelatesTo); soap_wsdd_set_AppSequence(soap); /* ResolveMatches */ soap_default_wsdd__ResolveMatchType(soap, &match); #ifdef SOAP_WSA_2005 match.wsa5__EndpointReference.Address = (char*)EndpointReference; #else match.wsa__EndpointReference.Address = (char*)EndpointReference; #endif match.Types = (char*)Types; if (Scopes) { soap_default_wsdd__ScopesType(soap, &scopes); scopes.__item = (char*)Scopes; scopes.MatchBy = (char*)MatchBy; match.Scopes = &scopes; } match.XAddrs = (char*)XAddrs; match.MetadataVersion = MetadataVersion; soap_default_wsdd__ResolveMatchesType(soap, &res); res.ResolveMatch = &match; if (soap_send___wsdd__ResolveMatches(soap, endpoint, Action, &res)) return soap->error; /* HTTP(S) POST expects an HTTP OK response */ if (endpoint && !strncmp(endpoint, "http", 4)) return soap_recv_empty_response(soap); return SOAP_OK; } /******************************************************************************\ * * WS-Discovery Serving Inbound Messages * \******************************************************************************/ /** @fn int soap_wsdd_listen(struct soap *soap, int timeout) @brief Listen on a port for inbound WS-Discovery messages, also cleans up memory with `soap_destroy` and `soap_end`. @param soap context @param[in] timeout seconds to listen (use negative value for micro seconds) @return SOAP_OK or error code First you need to open a port with soap_bind(soap). Then invoke this function to listen to WS-Discovery messages on that port. Inbound messages are accepted and the information is relayed to the event handlers, see Section @ref wsdd_2. Use soap->user to pass a pointer to a state object that the event hanlders can use. The timeout allows a Client to periodically poll the port for messages. A value of zero will loop the listener forever or until an error occurs. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsdd_listen(struct soap *soap, int timeout) { soap->accept_timeout = soap->recv_timeout = soap->send_timeout = timeout; /* event-serve loop (exits upon timeout) */ for (;;) { if (!soap_valid_socket(soap_accept(soap)) || soap_begin_serve(soap)) { /* timeout? */ if (!soap->errnum) break; return soap->error; } /* always close HTTP afterwards */ soap->keep_alive = 0; /* receive event and serve */ if (soap_wsdd_serve_request(soap)) { /* timeout? */ if (!soap->errnum) break; #ifdef WITH_FASTCGI soap_send_fault(soap); #else return soap_send_fault(soap); #endif } /* clean up for next iteration */ soap_destroy(soap); soap_end(soap); } /* timed out */ soap_destroy(soap); soap_end(soap); return soap->error = SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_wsdd_serve_request(struct soap *soap) { soap_peek_element(soap); if (!soap_match_tag(soap, soap->tag, "wsdd:Hello")) return soap_wsdd_serve___wsdd__Hello(soap); if (!soap_match_tag(soap, soap->tag, "wsdd:Bye")) return soap_wsdd_serve___wsdd__Bye(soap); if (!soap_match_tag(soap, soap->tag, "wsdd:Probe")) return soap_wsdd_serve___wsdd__Probe(soap); if (!soap_match_tag(soap, soap->tag, "wsdd:ProbeMatches")) return soap_wsdd_serve___wsdd__ProbeMatches(soap); if (!soap_match_tag(soap, soap->tag, "wsdd:Resolve")) return soap_wsdd_serve___wsdd__Resolve(soap); if (!soap_match_tag(soap, soap->tag, "wsdd:ResolveMatches")) return soap_wsdd_serve___wsdd__ResolveMatches(soap); soap->error = SOAP_NO_METHOD; /* close socket unless soap->keep_alive == 1 */ return soap_closesock(soap); } /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ static int soap_wsdd_serve___wsdd__Hello(struct soap *soap) { struct __wsdd__Hello soap_tmp___wsdd__Hello; soap_default___wsdd__Hello(soap, &soap_tmp___wsdd__Hello); soap->encodingStyle = NULL; if (!soap_get___wsdd__Hello(soap, &soap_tmp___wsdd__Hello, "-wsdd:Hello", NULL)) return soap->error; if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap->error; soap->error = __wsdd__Hello(soap, soap_tmp___wsdd__Hello.wsdd__Hello); if (soap->error) return soap->error; return soap_closesock(soap); } /******************************************************************************/ static int soap_wsdd_serve___wsdd__Bye(struct soap *soap) { struct __wsdd__Bye soap_tmp___wsdd__Bye; soap_default___wsdd__Bye(soap, &soap_tmp___wsdd__Bye); soap->encodingStyle = NULL; if (!soap_get___wsdd__Bye(soap, &soap_tmp___wsdd__Bye, "-wsdd:Bye", NULL)) return soap->error; if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap->error; soap->error = __wsdd__Bye(soap, soap_tmp___wsdd__Bye.wsdd__Bye); if (soap->error) return soap->error; return soap_closesock(soap); } /******************************************************************************/ static int soap_wsdd_serve___wsdd__Probe(struct soap *soap) { struct __wsdd__Probe soap_tmp___wsdd__Probe; soap_default___wsdd__Probe(soap, &soap_tmp___wsdd__Probe); soap->encodingStyle = NULL; if (!soap_get___wsdd__Probe(soap, &soap_tmp___wsdd__Probe, "-wsdd:Probe", NULL)) return soap->error; if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap->error; soap->error = __wsdd__Probe(soap, soap_tmp___wsdd__Probe.wsdd__Probe); if (soap->error) return soap->error; return soap_closesock(soap); } /******************************************************************************/ static int soap_wsdd_serve___wsdd__ProbeMatches(struct soap *soap) { struct __wsdd__ProbeMatches soap_tmp___wsdd__ProbeMatches; soap_default___wsdd__ProbeMatches(soap, &soap_tmp___wsdd__ProbeMatches); soap->encodingStyle = NULL; if (!soap_get___wsdd__ProbeMatches(soap, &soap_tmp___wsdd__ProbeMatches, "-wsdd:ProbeMatches", NULL)) return soap->error; if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap->error; soap->error = __wsdd__ProbeMatches(soap, soap_tmp___wsdd__ProbeMatches.wsdd__ProbeMatches); if (soap->error) return soap->error; return soap_closesock(soap); } /******************************************************************************/ static int soap_wsdd_serve___wsdd__Resolve(struct soap *soap) { struct __wsdd__Resolve soap_tmp___wsdd__Resolve; soap_default___wsdd__Resolve(soap, &soap_tmp___wsdd__Resolve); soap->encodingStyle = NULL; if (!soap_get___wsdd__Resolve(soap, &soap_tmp___wsdd__Resolve, "-wsdd:Resolve", NULL)) return soap->error; if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap->error; soap->error = __wsdd__Resolve(soap, soap_tmp___wsdd__Resolve.wsdd__Resolve); if (soap->error) return soap->error; return soap_closesock(soap); } /******************************************************************************/ static int soap_wsdd_serve___wsdd__ResolveMatches(struct soap *soap) { struct __wsdd__ResolveMatches soap_tmp___wsdd__ResolveMatches; soap_default___wsdd__ResolveMatches(soap, &soap_tmp___wsdd__ResolveMatches); soap->encodingStyle = NULL; if (!soap_get___wsdd__ResolveMatches(soap, &soap_tmp___wsdd__ResolveMatches, "-wsdd:ResolveMatches", NULL)) return soap->error; if (soap_body_end_in(soap) || soap_envelope_end_in(soap) || soap_end_recv(soap)) return soap->error; soap->error = __wsdd__ResolveMatches(soap, soap_tmp___wsdd__ResolveMatches.wsdd__ResolveMatches); if (soap->error) return soap->error; return soap_closesock(soap); } /******************************************************************************/ /** @fn int __wsdd__Hello(struct soap *soap, struct wsdd__HelloType *Hello) @brief Internal WS-Discovery service operation. */ SOAP_FMAC5 int SOAP_FMAC6 __wsdd__Hello(struct soap *soap, struct wsdd__HelloType *Hello) { unsigned int InstanceId = 0; const char *SequenceId = NULL; unsigned int MessageNumber = 0; DBGFUN("__wsdd__Hello"); /* check for WSA */ if (soap_wsa_check(soap)) return soap->error; /* check WSDD */ if (!Hello #ifdef SOAP_WSA_2005 || !Hello->wsa5__EndpointReference.Address #else || !Hello->wsa__EndpointReference.Address #endif ) return soap_wsa_sender_fault(soap, "WSDD Hello incomplete", NULL); #ifdef SOAP_WSA_2005 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EndpointReference=%s\n", Hello->wsa5__EndpointReference.Address)); #else DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EndpointReference=%s\n", Hello->wsa__EndpointReference.Address)); #endif if (soap->header->wsdd__AppSequence) { wsdd__AppSequenceType *seq = soap->header->wsdd__AppSequence; InstanceId = seq->InstanceId; SequenceId = seq->SequenceId; MessageNumber = seq->MessageNumber; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "AppSeq id=%u seq=%s msg=%u\n", InstanceId, SequenceId ? SequenceId : "(null)", MessageNumber)); } /* pass on to user-defined event handler */ wsdd_event_Hello(soap, InstanceId, SequenceId, MessageNumber, #ifdef SOAP_WSA_2005 soap->header->wsa5__MessageID, soap->header->wsa5__RelatesTo ? soap->header->wsa5__RelatesTo->__item : NULL, Hello->wsa5__EndpointReference.Address, #else soap->header->wsa__MessageID, soap->header->wsa__RelatesTo ? soap->header->wsa__RelatesTo->__item : NULL, Hello->wsa__EndpointReference.Address, #endif Hello->Types, Hello->Scopes ? Hello->Scopes->__item : NULL, Hello->Scopes ? Hello->Scopes->MatchBy : NULL, Hello->XAddrs, Hello->MetadataVersion); /* one-way HTTP(S) POST message requires an HTTP OK response message */ if (!strncmp(soap->endpoint, "http", 4)) return soap_send_empty_response(soap, SOAP_OK); return SOAP_OK; } /******************************************************************************/ /** @fn int __wsdd__Bye(struct soap *soap, struct wsdd__ByeType *Bye) @brief Internal WS-Discovery service operation. */ SOAP_FMAC5 int SOAP_FMAC6 __wsdd__Bye(struct soap *soap, struct wsdd__ByeType *Bye) { unsigned int InstanceId = 0; const char *SequenceId = NULL; unsigned int MessageNumber = 0; DBGFUN("__wsdd__Bye"); /* check for WSA */ if (soap_wsa_check(soap)) return soap->error; /* check WSDD */ if (!Bye #ifdef SOAP_WSA_2005 || !Bye->wsa5__EndpointReference.Address #else || !Bye->wsa__EndpointReference.Address #endif ) return soap_wsa_sender_fault(soap, "WSDD Bye incomplete", NULL); #ifdef SOAP_WSA_2005 DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EndpointReference=%s\n", Bye->wsa5__EndpointReference.Address)); #else DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EndpointReference=%s\n", Bye->wsa__EndpointReference.Address)); #endif if (soap->header->wsdd__AppSequence) { wsdd__AppSequenceType *seq = soap->header->wsdd__AppSequence; InstanceId = seq->InstanceId; SequenceId = seq->SequenceId; MessageNumber = seq->MessageNumber; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "AppSeq id=%u seq=%s msg=%u\n", InstanceId, SequenceId ? SequenceId : "(null)", MessageNumber)); } /* pass on to user-defined event handler */ wsdd_event_Bye(soap, InstanceId, SequenceId, MessageNumber, #ifdef SOAP_WSA_2005 soap->header->wsa5__MessageID, soap->header->wsa5__RelatesTo ? soap->header->wsa5__RelatesTo->__item : NULL, Bye->wsa5__EndpointReference.Address, #else soap->header->wsa__MessageID, soap->header->wsa__RelatesTo ? soap->header->wsa__RelatesTo->__item : NULL, Bye->wsa__EndpointReference.Address, #endif Bye->Types, Bye->Scopes ? Bye->Scopes->__item : NULL, Bye->Scopes ? Bye->Scopes->MatchBy : NULL, Bye->XAddrs, Bye->MetadataVersion); /* one-way HTTP(S) POST message requires an HTTP OK response message */ if (!strncmp(soap->endpoint, "http", 4)) return soap_send_empty_response(soap, SOAP_OK); return SOAP_OK; } /******************************************************************************/ static int soap_wsdd_http(struct soap *soap, const char *endpoint, const char *host, int port, const char *path, const char *action, ULONG64 count) { (void)endpoint; (void)host; (void)port; (void)path; (void)action; return soap->fresponse(soap, SOAP_OK, count); } /******************************************************************************/ /** @fn int __wsdd__Probe(struct soap *soap, struct wsdd__ProbeType *Probe) @brief Internal WS-Discovery service operation. */ SOAP_FMAC5 int SOAP_FMAC6 __wsdd__Probe(struct soap *soap, struct wsdd__ProbeType *Probe) { struct wsdd__ProbeMatchesType ProbeMatches; soap_wsdd_mode mode; DBGFUN("__wsdd__Probe"); /* check for WSA */ if (soap_wsa_check(soap)) return soap->error; /* check WSDD */ if (!Probe) return soap_wsa_sender_fault(soap, "WSDD Probe incomplete", NULL); soap_default_wsdd__ProbeMatchesType(soap, &ProbeMatches); /* pass probe request on to user-defined event handler to get matches */ mode = wsdd_event_Probe(soap, #ifdef SOAP_WSA_2005 soap->header->wsa5__MessageID, soap->header->wsa5__ReplyTo ? soap->header->wsa5__ReplyTo->Address : NULL, #else soap->header->wsa__MessageID, soap->header->wsa__ReplyTo ? soap->header->wsa__ReplyTo->Address : NULL, #endif Probe->Types, Probe->Scopes ? Probe->Scopes->__item : NULL, Probe->Scopes ? Probe->Scopes->MatchBy : NULL, &ProbeMatches); if (mode == SOAP_WSDD_ADHOC) { /* event handler or main application MUST return matches independently */ /* one-way HTTP(S) POST message requires an HTTP OK response message */ if (!strncmp(soap->endpoint, "http", 4)) return soap_send_empty_response(soap, SOAP_OK); } else { int err; int (*fpost)(struct soap*, const char*, const char*, int, const char*, const char*, ULONG64); const char *MessageID = soap_wsa_rand_uuid(soap); const char *Action = SOAP_NAMESPACE_OF_wsdd"/ProbeMatches"; /* SOAP Header */ soap_wsdd_set_AppSequence(soap); soap_wsa_reply(soap, MessageID, Action); /* send over current socket as HTTP OK response: */ fpost = soap->fpost; soap->fpost = soap_wsdd_http; err = soap_send___wsdd__ProbeMatches(soap, "http://", Action, &ProbeMatches); soap->fpost = fpost; return err; } return SOAP_OK; } /******************************************************************************/ /** @fn int __wsdd__ProbeMatches(struct soap *soap, struct wsdd__ProbeMatchesType *ProbeMatches) @brief Internal WS-Discovery service operation. */ SOAP_FMAC5 int SOAP_FMAC6 __wsdd__ProbeMatches(struct soap *soap, struct wsdd__ProbeMatchesType *ProbeMatches) { unsigned int InstanceId = 0; const char *SequenceId = NULL; unsigned int MessageNumber = 0; DBGFUN("__wsdd__ProbeMatches"); /* check for WSA */ if (soap_wsa_check(soap)) return soap->error; /* check WSDD */ if (!ProbeMatches) return soap_wsa_sender_fault(soap, "WSDD ProbeMatches incomplete", NULL); if (soap->header->wsdd__AppSequence) { wsdd__AppSequenceType *seq = soap->header->wsdd__AppSequence; InstanceId = seq->InstanceId; SequenceId = seq->SequenceId; MessageNumber = seq->MessageNumber; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "AppSeq id=%u seq=%s msg=%u\n", InstanceId, SequenceId ? SequenceId : "(null)", MessageNumber)); } /* pass probe matches on to user-defined event handler */ wsdd_event_ProbeMatches(soap, InstanceId, SequenceId, MessageNumber, #ifdef SOAP_WSA_2005 soap->header->wsa5__MessageID, soap->header->wsa5__RelatesTo ? soap->header->wsa5__RelatesTo->__item : NULL, #else soap->header->wsa__MessageID, soap->header->wsa__RelatesTo ? soap->header->wsa__RelatesTo->__item : NULL, #endif ProbeMatches); /* one-way HTTP(S) POST message requires an HTTP OK response message */ if (!strncmp(soap->endpoint, "http", 4)) return soap_send_empty_response(soap, SOAP_OK); return SOAP_OK; } /******************************************************************************/ /** @fn int __wsdd__Resolve(struct soap *soap, struct wsdd__ResolveType *Resolve) @brief Internal WS-Discovery service operation. */ SOAP_FMAC5 int SOAP_FMAC6 __wsdd__Resolve(struct soap *soap, struct wsdd__ResolveType *Resolve) { struct wsdd__ResolveMatchesType ResolveMatches; struct wsdd__ResolveMatchType match; soap_wsdd_mode mode; DBGFUN("__wsdd__Resolve"); /* check for WSA */ if (soap_wsa_check(soap)) return soap->error; /* check WSDD */ if (!Resolve #ifdef SOAP_WSA_2005 || !Resolve->wsa5__EndpointReference.Address #else || !Resolve->wsa__EndpointReference.Address #endif ) return soap_wsa_sender_fault(soap, "WSDD Resolve incomplete", NULL); soap_default_wsdd__ResolveMatchesType(soap, &ResolveMatches); soap_default_wsdd__ResolveMatchType(soap, &match); ResolveMatches.ResolveMatch = &match; /* pass resolve request on to user-defined event handler */ mode = wsdd_event_Resolve(soap, #ifdef SOAP_WSA_2005 soap->header->wsa5__MessageID, soap->header->wsa5__ReplyTo ? soap->header->wsa5__ReplyTo->Address : NULL, Resolve->wsa5__EndpointReference.Address, #else soap->header->wsa__MessageID, soap->header->wsa__ReplyTo ? soap->header->wsa__ReplyTo->Address : NULL, Resolve->wsa__EndpointReference.Address, #endif &match); if (mode == SOAP_WSDD_ADHOC) { /* event handler or main application MUST return match independently */ /* one-way HTTP(S) POST message requires an HTTP OK response message */ if (!strncmp(soap->endpoint, "http", 4)) return soap_send_empty_response(soap, SOAP_OK); } else { int err; int (*fpost)(struct soap*, const char*, const char*, int, const char*, const char*, ULONG64); const char *MessageID = soap_wsa_rand_uuid(soap); const char *Action = SOAP_NAMESPACE_OF_wsdd"/ResolveMatches"; /* SOAP Header */ soap_wsdd_set_AppSequence(soap); soap_wsa_reply(soap, MessageID, Action); /* send over current socket as HTTP OK response: */ fpost = soap->fpost; soap->fpost = soap_wsdd_http; err = soap_send___wsdd__ResolveMatches(soap, NULL, Action, &ResolveMatches); soap->fpost = fpost; return err; } return SOAP_OK; } /******************************************************************************/ /** @fn int __wsdd__ResolveMatches(struct soap *soap, struct wsdd__ResolveMatchesType *ResolveMatches) @brief Internal WS-Discovery service operation. */ SOAP_FMAC5 int SOAP_FMAC6 __wsdd__ResolveMatches(struct soap *soap, struct wsdd__ResolveMatchesType *ResolveMatches) { unsigned int InstanceId = 0; const char *SequenceId = NULL; unsigned int MessageNumber = 0; DBGFUN("__wsdd__ResolveMatches"); /* check for WSA */ if (soap_wsa_check(soap)) return soap->error; /* check WSDD */ if (!ResolveMatches || !ResolveMatches->ResolveMatch) return soap_wsa_sender_fault(soap, "WSDD ResolveMatch incomplete", NULL); if (soap->header->wsdd__AppSequence) { wsdd__AppSequenceType *seq = soap->header->wsdd__AppSequence; InstanceId = seq->InstanceId; SequenceId = seq->SequenceId; MessageNumber = seq->MessageNumber; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "AppSeq id=%u seq=%s msg=%u\n", InstanceId, SequenceId ? SequenceId : "(null)", MessageNumber)); } /* pass resolve matches on to user-defined event handler */ wsdd_event_ResolveMatches(soap, InstanceId, SequenceId, MessageNumber, #ifdef SOAP_WSA_2005 soap->header->wsa5__MessageID, soap->header->wsa5__RelatesTo ? soap->header->wsa5__RelatesTo->__item : NULL, #else soap->header->wsa__MessageID, soap->header->wsa__RelatesTo ? soap->header->wsa__RelatesTo->__item : NULL, #endif ResolveMatches->ResolveMatch); /* one-way HTTP(S) POST message requires an HTTP OK response message */ if (!strncmp(soap->endpoint, "http", 4)) return soap_send_empty_response(soap, SOAP_OK); return SOAP_OK; } /******************************************************************************\ * * WS-Discovery AppSequence State * \******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /** @fn void soap_wsdd_set_InstanceId(unsigned int InstanceId) @brief Set the global AppSequence InstanceId that is used to populate messages @param[in] InstanceId */ SOAP_FMAC1 void SOAP_FMAC2 soap_wsdd_set_InstanceId(unsigned int InstanceId) { MUTEX_LOCK(soap_wsdd_state); soap_wsdd_InstanceId = InstanceId; soap_wsdd_MessageNumber = 1; MUTEX_UNLOCK(soap_wsdd_state); } /******************************************************************************/ /** @fn void soap_wsdd_set_SequenceId(const char *SequenceId) @brief Set the global AppSequence SequenceId that is used to populate messages @param[in] SequenceId */ SOAP_FMAC1 void SOAP_FMAC2 soap_wsdd_set_SequenceId(const char *SequenceId) { MUTEX_LOCK(soap_wsdd_state); if (soap_wsdd_SequenceId) free((void*)soap_wsdd_SequenceId); soap_wsdd_SequenceId = strdup(SequenceId); soap_wsdd_MessageNumber = 1; MUTEX_UNLOCK(soap_wsdd_state); } /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ static void soap_wsdd_set_AppSequence(struct soap *soap) { soap_header(soap); if (!soap->header->wsdd__AppSequence) { soap->header->wsdd__AppSequence = (wsdd__AppSequenceType*)soap_malloc(soap, sizeof(wsdd__AppSequenceType)); soap_default_wsdd__AppSequenceType(soap, soap->header->wsdd__AppSequence); } MUTEX_LOCK(soap_wsdd_state); soap->header->wsdd__AppSequence->InstanceId = soap_wsdd_InstanceId; soap->header->wsdd__AppSequence->SequenceId = (char*)soap_wsdd_SequenceId; soap->header->wsdd__AppSequence->MessageNumber = soap_wsdd_MessageNumber++; MUTEX_UNLOCK(soap_wsdd_state); } /******************************************************************************/ static void soap_wsdd_reset_AppSequence(struct soap *soap) { if (soap->header) soap->header->wsdd__AppSequence = NULL; } /******************************************************************************/ static void soap_wsdd_delay(struct soap *soap) { unsigned int r = (unsigned int)soap_random % SOAP_WSDD_APP_MAX_DELAY; #if defined(_WRS_KERNEL) int delay = r * sysClkRateGet() / 1000; taskDelay(delay); /* VxWorks compatible sleep API, delay is specified in number of ticks, which depends on the System Clock Rate */ #elif defined(WIN32) DWORD delay = (DWORD)r; Sleep(delay); #else useconds_t delay = 1000 * r; usleep(delay); #endif (void)soap; } /******************************************************************************/ gsoap-2.8.91/gsoap/plugin/sessions.h0000644000175000017500000001614713525245161016727 0ustar ellertellert/* sessions.h Sessions plugin for thread-safe server-side HTTP session management. by Chris Moutsos & Robert van Engelen gSOAP XML Web services tools Copyright (C) 2000-2016, 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-2016, 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 SESSIONS_H #define SESSIONS_H #include "stdsoap2.h" #include "threads.h" #ifdef __cplusplus extern "C" { #endif /** plugin identification for plugin registry */ #define SESSIONS_ID "SOAP-SESSIONS/1.0" /** Max number of sessions allowed */ #define SESSION_MAX (8192) /** Default max amount of stale time (seconds) server-side before a session is expired */ #define SESSIONS_DEFAULT_MAX_INACTIVE_SECS (300); /** On every session database access, the time since the last database purge is checked. If it's been longer than this interval (in seconds), any expired sessions will be purged with soap_session_purge(). A value of 0 means a purge will occcur on every database access. A value of -1 means a purge will never occur. */ #define SESSION_PURGE_INTERVAL (300) /** plugin identification for plugin registry */ extern const char sessions_id[]; /** Name used for session ID cookies */ static const char SESSION_COOKIE_NAME[] = "GSOAP_SESSIONID"; /** @brief A session node. */ struct soap_session { struct soap_session *next; const char *id; struct soap_session_var *session_vars; struct soap_session_var *session_vars_tail; int num_session_vars; /* the total number of session_vars we have in this session */ long cookie_maxage; /* client time in seconds before the cookie expires (-1 for session cookie) */ int rolling; /* whether or not we should set the cookie's maxage on every response */ time_t last_touched; /* time that we last touched this session or its vars */ long max_inactive_secs; /* server time in seconds before inactive session expires (-1 to never expire) this should usually be at least as high as cookie_maxage */ }; /** @brief A session variable node. Session variables are name-value pairs. */ struct soap_session_var { struct soap_session_var *next; const char *name; const char *value; }; /* plugin registry */ SOAP_FMAC1 int SOAP_FMAC2 sessions(struct soap *soap, struct soap_plugin *plugin, void *arg); /* gets soap_sessions (first node in sessions linked list) */ SOAP_FMAC1 struct soap_session* SOAP_FMAC2 soap_get_sessions_head(); /* purge expired sessions */ SOAP_FMAC1 void SOAP_FMAC2 soap_purge_sessions(struct soap *soap, const char *domain, const char *path, time_t when); /* get/start sessions */ SOAP_FMAC1 struct soap_session* SOAP_FMAC2 soap_start_session(struct soap *soap, const char *domain, const char *path); SOAP_FMAC1 struct soap_session* SOAP_FMAC2 soap_get_session(struct soap *soap, const char *domain, const char *path); /* get number of sessions */ SOAP_FMAC1 int SOAP_FMAC2 soap_get_num_sessions(struct soap *soap, const char *domain, const char *path); /* generate a new session ID */ SOAP_FMAC1 struct soap_session* SOAP_FMAC2 soap_regenerate_session_id(struct soap *soap, const char *domain, const char *path); /* get/set rolling */ SOAP_FMAC1 int SOAP_FMAC2 soap_get_session_rolling(struct soap *soap, const char *domain, const char *path); SOAP_FMAC1 int SOAP_FMAC2 soap_set_session_rolling(struct soap *soap, int rolling, const char *domain, const char *path); /* get/set cookie_maxage */ SOAP_FMAC1 int SOAP_FMAC2 soap_set_session_cookie_maxage(struct soap *soap, long maxage, const char *domain, const char *path); SOAP_FMAC1 long SOAP_FMAC2 soap_get_session_cookie_maxage(struct soap *soap, const char *domain, const char *path); /* get/set max_inactive_secs */ SOAP_FMAC1 int SOAP_FMAC2 soap_set_session_max_inactive_secs(struct soap *soap, long max, const char *domain, const char *path); SOAP_FMAC1 long SOAP_FMAC2 soap_get_session_max_inactive_secs(struct soap *soap, const char *domain, const char *path); /* end all sessions */ SOAP_FMAC1 void SOAP_FMAC2 soap_end_sessions(struct soap *soap, const char *domain, const char *path); /* get number of session variables in session */ SOAP_FMAC1 int SOAP_FMAC2 soap_get_num_session_vars(struct soap *soap, const char *domain, const char *path); /* end single session */ SOAP_FMAC1 void SOAP_FMAC2 soap_end_session(struct soap *soap, const char *domain, const char *path); /* get/set session variable values */ SOAP_FMAC1 struct soap_session_var* SOAP_FMAC2 soap_set_session_var(struct soap *soap, const char *name, const char *value, const char *domain, const char *path); SOAP_FMAC1 const char* SOAP_FMAC2 soap_get_session_var(struct soap *soap, const char *name, const char *domain, const char *path); /* clear single session variable */ SOAP_FMAC1 void SOAP_FMAC2 soap_clr_session_var(struct soap *soap, const char *name, const char *domain, const char *path); /* clear all session variables */ SOAP_FMAC1 void SOAP_FMAC2 soap_clr_session_vars(struct soap *soap, const char *domain, const char *path); #ifdef __cplusplus } #endif #endif gsoap-2.8.91/gsoap/plugin/wsseapi.h0000644000175000017500000004302713525245161016531 0ustar ellertellert/* wsseapi.h WS-Security plugin. See wsseapi.c for documentation and details. gSOAP XML Web services tools Copyright (C) 2000-2015, 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-2015, 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 WSSEAPI_H #define WSSEAPI_H /* When using soapcpp2 option -q or -p, you need to change "soapH.h" below */ /* include soapH.h generated by soapcpp2 from .h file containing #import "wsse.h" */ #ifdef SOAP_H_FILE /* if set, use the soapcpp2-generated fileH.h file as specified with: cc ... -DSOAP_H_FILE=fileH.h */ # include "stdsoap2.h" # include SOAP_XSTRINGIFY(SOAP_H_FILE) #else # include "soapH.h" /* or manually replace with soapcpp2-generated *H.h file */ #endif #include "smdevp.h" #include "mecevp.h" #ifdef __cplusplus extern "C" { #endif /** plugin identification for plugin registry */ #define SOAP_WSSE_ID "SOAP-WSSE/1.5" /** to ignore extra/external SignedInfo/Reference/@URI */ #define SOAP_WSSE_IGNORE_EXTRA_REFS (0x1000) /** plugin identification for plugin registry */ extern const char soap_wsse_id[]; /** @struct soap_wsse_data @brief wsseapi plugin data The signature key (private) and verification key (public) are kept in the plugin data, together with other info. */ struct soap_wsse_data { const char *sigid; /**< string with wsu:Id names to sign */ const char *encid; /**< string with wsu:Id names to encrypt */ const char *prefixlist; /**< string with c14n PrefixList to send, or NULL */ int sign_alg; /**< The digest or signature algorithm used */ const void *sign_key; /**< EVP_PKEY or key string for HMAC */ int sign_keylen; /**< HMAC key length */ int vrfy_alg; /**< The signature verify algorithm used */ const void *vrfy_key; /**< EVP_PKEY or key string for HMAC verify */ int vrfy_keylen; /**< HMAC key length */ int enco_alg; /**< current encrypt algorithm used */ const char *enco_keyname; /**< optional key name (id of symmetric key) */ const void *enco_key; /**< EVP_PKEY or secret key */ int enco_keylen; /**< secret key length */ int deco_alg; /**< decrypt algorithm used */ const void *deco_key; /**< EVP_PKEY or secret key */ int deco_keylen; /**< secret key length */ struct soap_wsse_digest *digest; /**< List of ID-hash pairs */ int (*fpreparesend)(struct soap*, const char*, size_t); int (*fpreparefinalsend)(struct soap*); int (*fpreparefinalrecv)(struct soap*); struct soap_mec_data *mec; X509_STORE *store; const void *(*security_token_handler)(struct soap *soap, int *alg, const char *keyname, const unsigned char *keyid, int keyidlen, int *keylen); }; /** @struct soap_wsse_digest @brief Digest dictionary: linked list of ID-hash pairs The digest dictionary is populated by the soap_wsse_preparesend callback. The callback intercepts XML elements with wsu:Id attributes and computes the digest during the preprocessing of a message transmission. The 'level' field is used to determine when the end of an element is reached by handling inner wsu:Id attributed elements, so that the outer wsu:Id attributed element can be hashed. */ struct soap_wsse_digest { struct soap_wsse_digest *next; /**< Next in list */ int done; /**< done when digest is computed */ unsigned int level; /**< XML element level */ struct soap_smd_data smd; /**< smdevp engine context */ unsigned char hash[SOAP_SMD_MAX_SIZE];/**< Digest hash value */ char id[1]; /**< String flows down the struct */ }; extern const char *wsse_PasswordTextURI; extern const char *wsse_PasswordDigestURI; extern const char *wsse_Base64BinaryURI; extern const char *wsse_X509v3URI; extern const char *wsse_X509v3SubjectKeyIdentifierURI; extern const char *ds_sha1URI; extern const char *ds_sha256URI; extern const char *ds_sha512URI; extern const char *ds_hmac_sha1URI; extern const char *ds_hmac_sha256URI; extern const char *ds_hmac_sha512URI; extern const char *ds_dsa_sha1URI; extern const char *ds_rsa_sha1URI; extern const char *ds_rsa_sha256URI; extern const char *ds_rsa_sha512URI; extern const char *xenc_3desURI; extern const char *xenc_aes128cbcURI; extern const char *xenc_aes192cbcURI; extern const char *xenc_aes256cbcURI; extern const char *xenc_aes512cbcURI; extern const char *xenc_aes128gcmURI; extern const char *xenc_aes192gcmURI; extern const char *xenc_aes256gcmURI; extern const char *xenc_aes512gcmURI; extern const char *xenc_elementURI; extern const char *xenc_contentURI; extern const char *xenc_rsa15URI; extern const char *xenc_rsaesURI; extern const char *ds_URI; extern const char *c14n_URI; extern const char *wsu_URI; SOAP_FMAC1 struct _wsse__Security * SOAP_FMAC2 soap_wsse_add_Security(struct soap *soap); SOAP_FMAC1 struct _wsse__Security * SOAP_FMAC2 soap_wsse_add_Security_actor(struct soap *soap, const char *actor); SOAP_FMAC1 void SOAP_FMAC2 soap_wsse_delete_Security(struct soap *soap); SOAP_FMAC1 struct _wsse__Security * SOAP_FMAC2 soap_wsse_Security(struct soap *soap); SOAP_FMAC1 struct ds__SignatureType * SOAP_FMAC2 soap_wsse_add_Signature(struct soap *soap); SOAP_FMAC1 void SOAP_FMAC2 soap_wsse_delete_Signature(struct soap *soap); SOAP_FMAC1 struct ds__SignatureType * SOAP_FMAC2 soap_wsse_Signature(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_Timestamp(struct soap *soap, const char *id, time_t lifetime); SOAP_FMAC1 struct _wsu__Timestamp * SOAP_FMAC2 soap_wsse_Timestamp(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_Timestamp(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_UsernameTokenText(struct soap *soap, const char *id, const char *username, const char *password); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_UsernameTokenDigest(struct soap *soap, const char *id, const char *username, const char *password); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_UsernameTokenDigest_at(struct soap *soap, const char *id, const char *username, const char *password, time_t when); SOAP_FMAC1 struct _wsse__UsernameToken * SOAP_FMAC2 soap_wsse_UsernameToken(struct soap *soap, const char *id); SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsse_get_Username(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_Password(struct soap *soap, const char *password); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_BinarySecurityToken(struct soap *soap, const char *id, const char *valueType, const unsigned char *data, int size); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_BinarySecurityTokenX509(struct soap *soap, const char *id, X509 *cert); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_BinarySecurityTokenPEM(struct soap *soap, const char *id, const char *filename); SOAP_FMAC1 struct _wsse__BinarySecurityToken * SOAP_FMAC2 soap_wsse_BinarySecurityToken(struct soap *soap, const char *id); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_get_BinarySecurityToken(struct soap *soap, const char *id, char **valueType, unsigned char **data, int *size); SOAP_FMAC1 X509 * SOAP_FMAC2 soap_wsse_get_BinarySecurityTokenX509(struct soap *soap, const char *id); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_X509(struct soap *soap, X509 *cert); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_SecurityContextToken(struct soap *soap, const char *id, const char *identifier); SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsse_get_SecurityContextToken(struct soap *soap); SOAP_FMAC1 struct ds__SignedInfoType * SOAP_FMAC2 soap_wsse_add_SignedInfo(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_SignedInfo_Reference(struct soap *soap, const char *URI, unsigned int level, const char *transform, const char *inclusiveNamespaces, int alg, const char *HA); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_SignedInfo_SignatureMethod(struct soap *soap, const char *method, int canonical); SOAP_FMAC1 struct ds__SignedInfoType * SOAP_FMAC2 soap_wsse_SignedInfo(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_get_SignedInfo_SignatureMethod(struct soap *soap, int *alg, int *bits); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_SignatureValue(struct soap *soap, int alg, const void *key, int keylen); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_Signature(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_SignatureValue(struct soap *soap, int alg, const void *key, int keylen); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_SignedInfo(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_digest(struct soap *soap, int alg, int canonical, const char *id, unsigned char hash[SOAP_SMD_MAX_SIZE]); SOAP_FMAC1 struct ds__KeyInfoType * SOAP_FMAC2 soap_wsse_add_KeyInfo(struct soap *soap); SOAP_FMAC1 struct ds__KeyInfoType * SOAP_FMAC2 soap_wsse_KeyInfo(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_KeyInfo_KeyName(struct soap *soap, const char *name); SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsse_get_KeyInfo_KeyName(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_KeyInfo_SecurityTokenReferenceURI(struct soap *soap, const char *URI, const char *valueType); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(struct soap *soap, const char *URI); SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsse_get_KeyInfo_SecurityTokenReferenceURI(struct soap *soap); SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsse_get_KeyInfo_SecurityTokenReferenceValueType(struct soap *soap); SOAP_FMAC1 X509 * SOAP_FMAC2 soap_wsse_get_KeyInfo_SecurityTokenReferenceX509(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_KeyInfo_X509Certificate(struct soap *soap, X509 *cert); SOAP_FMAC1 struct ds__X509IssuerSerialType * SOAP_FMAC2 soap_wsse_get_KeyInfo_SecurityTokenReferenceX509Data(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_KeyInfo_SecurityTokenReferenceKeyIdentifier(struct soap *soap, const char *id, const char *valueType, unsigned char *data, int size); SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifierValueType(struct soap *soap, ds__KeyInfoType *keyInfo); SOAP_FMAC1 const unsigned char * SOAP_FMAC2 soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifier(struct soap *soap, ds__KeyInfoType *keyInfo, int *size); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_KeyInfo_SecurityTokenReferenceEmbedded(struct soap *soap, const char *id, const char *valueType); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_EncryptedData_KeyInfo_KeyName(struct soap *soap, const char *keyname); #ifdef SOAP_NAMESPACE_OF_saml1 SOAP_FMAC1 saml1__AssertionType * SOAP_FMAC2 soap_wsse_add_saml1(struct soap *soap, const char *wsuId); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_sign_saml1(struct soap *soap, saml1__AssertionType *assertion, int alg, const void *key, int keylen, X509 *cert); SOAP_FMAC1 saml1__AssertionType * SOAP_FMAC2 soap_wsse_get_saml1(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_saml1(struct soap *soap, saml1__AssertionType *saml1); #endif #ifdef SOAP_NAMESPACE_OF_saml2 SOAP_FMAC1 saml2__AssertionType * SOAP_FMAC2 soap_wsse_add_saml2(struct soap *soap, const char *wsuId); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_sign_saml2(struct soap *soap, saml2__AssertionType *assertion, int alg, const void *key, int keylen, X509 *cert); SOAP_FMAC1 saml2__AssertionType * SOAP_FMAC2 soap_wsse_get_saml2(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_saml2(struct soap *soap, saml2__AssertionType *saml2); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_fault(struct soap *soap, enum wsse__FaultcodeEnum fault, const char *detail); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse(struct soap *soap, struct soap_plugin *p, void *arg); SOAP_FMAC1 void SOAP_FMAC2 soap_wsse_rand_nonce(char *nonce, size_t noncelen); SOAP_FMAC1 int SOAP_FMAC2 soap_pmd5(struct soap *soap, const char *hmac_key, size_t hmac_key_len, const char *secret, size_t secretlen, char *pmd5, size_t pmd5len); SOAP_FMAC1 int SOAP_FMAC2 soap_psha1(struct soap *soap, const char *hmac_key, size_t hmac_key_len, const char *secret, size_t secretlen, char *psha1, size_t psha1len); SOAP_FMAC1 int SOAP_FMAC2 soap_psha256(struct soap *soap, const char *hmac_key, size_t hmac_key_len, const char *secret, size_t secretlen, char *psha256, size_t psha256len); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_sign(struct soap *soap, int alg, const void *key, int keylen); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_sign_body(struct soap *soap, int alg, const void *key, int keylen); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_init(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_auto(struct soap *soap, int alg, const void *key, size_t keylen); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_done(struct soap *soap); SOAP_FMAC1 size_t SOAP_FMAC2 soap_wsse_verify_element(struct soap *soap, const char *URI, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_body(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_with_signature(struct soap *soap, _ds__Signature *signature); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_set_security_token_handler(struct soap *soap, const void *(*callback)(struct soap*, int *alg, const char *keyname, const unsigned char *keyid, int keyidlen, int *keylen)); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_set_wsu_id(struct soap *soap, const char *tags); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_set_InclusiveNamespaces(struct soap *soap, const char *prefixlist); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_sign_only(struct soap *soap, const char *tags); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_EncryptedKey(struct soap *soap, int alg, const char *URI, X509 *cert, const char *subjectkeyid, const char *issuer, const char *serial); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_EncryptedKey_encrypt_only(struct soap *soap, int alg, const char *URI, X509 *cert, const char *subjectkeyid, const char *issuer, const char *serial, const char *tags); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_EncryptedKey(struct soap *soap); SOAP_FMAC1 void SOAP_FMAC2 soap_wsse_delete_EncryptedKey(struct soap *soap); SOAP_FMAC1 struct xenc__EncryptedKeyType * SOAP_FMAC2 soap_wsse_EncryptedKey(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_EncryptedKey_DataReferenceURI(struct soap *soap, const char *URI); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_DataReferenceURI(struct soap *soap, const char *URI); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_encrypt_body(struct soap *soap, int alg, const void *key, int keylen); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_encrypt_only(struct soap *soap, int alg, const void *key, int keylen, const char *tags); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_encrypt(struct soap *soap, int alg, const void *key, int keylen); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_decrypt_auto(struct soap *soap, int alg, const void *key, int keylen); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_encrypt_begin(struct soap *soap, const char *id, int alg, const char *URI, const char *keyname, const unsigned char *key, const char *type); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_encrypt_end(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_decrypt_begin(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_decrypt_end(struct soap *soap); #ifdef __cplusplus } #endif SOAP_FMAC1 void SOAP_FMAC2 soap_default_xsd__anyType(struct soap*, struct soap_dom_element *node); SOAP_FMAC1 int SOAP_FMAC2 soap_out_xsd__anyType(struct soap *soap, const char *tag, int id, const struct soap_dom_element *node, const char *type); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_in_xsd__anyType(struct soap *soap, const char *tag, struct soap_dom_element *node, const char *type); #endif gsoap-2.8.91/gsoap/plugin/httpmd5.c0000644000175000017500000002250513525245161016434 0ustar ellertellert/* httpmd5.c gSOAP HTTP Content-MD5 digest plugin. Usage (both client and server, see httpmd5test.h/.c for example): soap_register_plugin(&soap, http_md5); This enables HTTP MD5 checksum generation and checking for SOAP/XML messages WITHOUT attachments. Compile with -DWITH_OPENSSL Link with OpenSSL (for md5evp.c), httpmd5.c, and md5evp.c 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 -------------------------------------------------------------------------------- Requires an md5 engine, see md5evp.h 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 Example code: httpmd5test.h, httpmd5test.c Limitations: Does not work with combined chunked + compressed messages. When sending DIME/MIME attachments, you MUST use the SOAP_IO_STORE flag to compute the MD5 hash of the message with attachments. The flag disables streaming DIME. */ #include "httpmd5.h" #ifdef __cplusplus extern "C" { #endif const char http_md5_id[18] = HTTP_MD5_ID; static int http_md5_init(struct soap *soap, struct http_md5_data *data); static int http_md5_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src); static void http_md5_delete(struct soap *soap, struct soap_plugin *p); static int http_md5_post_header(struct soap *soap, const char *key, const char *val); static int http_md5_parse_header(struct soap *soap, const char *key, const char *val); static int http_md5_prepareinitsend(struct soap *soap); static int http_md5_prepareinitrecv(struct soap *soap); static int http_md5_preparesend(struct soap *soap, const char *buf, size_t len); static int http_md5_preparerecv(struct soap *soap, const char *buf, size_t len); static int http_md5_preparefinalrecv(struct soap *soap); int http_md5(struct soap *soap, struct soap_plugin *p, void *arg) { (void)arg; p->id = http_md5_id; p->data = (void*)SOAP_MALLOC(soap, sizeof(struct http_md5_data)); p->fcopy = http_md5_copy; p->fdelete = http_md5_delete; if (!p->data) return SOAP_EOM; if (http_md5_init(soap, (struct http_md5_data*)p->data)) { SOAP_FREE(soap, p->data); /* error: could not init */ return SOAP_EOM; /* return error */ } return SOAP_OK; } static int http_md5_init(struct soap *soap, struct http_md5_data *data) { data->fposthdr = soap->fposthdr; soap->fposthdr = http_md5_post_header; data->fparsehdr = soap->fparsehdr; soap->fparsehdr = http_md5_parse_header; data->fprepareinitsend = soap->fprepareinitsend; soap->fprepareinitsend = http_md5_prepareinitsend; data->fprepareinitrecv = soap->fprepareinitrecv; soap->fprepareinitrecv = http_md5_prepareinitrecv; data->fpreparesend = soap->fpreparesend; soap->fpreparesend = http_md5_preparesend; data->context = NULL; memset((void*)data->digest, 0, sizeof(data->digest)); return SOAP_OK; } static int http_md5_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) { *dst = *src; dst->data = (void*)SOAP_MALLOC(soap, sizeof(struct http_md5_data)); (void)soap_memcpy((void*)dst->data, sizeof(struct http_md5_data), (const void*)src->data, sizeof(struct http_md5_data)); ((struct http_md5_data*)dst->data)->context = NULL; return SOAP_OK; } static void http_md5_delete(struct soap *soap, struct soap_plugin *p) { (void)p; struct http_md5_data *data = (struct http_md5_data*)soap_lookup_plugin(soap, http_md5_id); if (data) { md5_handler(soap, &data->context, MD5_DELETE, NULL, 0); SOAP_FREE(soap, data); } } static int http_md5_post_header(struct soap *soap, const char *key, const char *val) { struct http_md5_data *data = (struct http_md5_data*)soap_lookup_plugin(soap, http_md5_id); char buf64[25]; /* 24 base64 chars + '\0' */ int err; if (!data) return SOAP_PLUGIN_ERROR; if (!key) /* last line */ { if ((err = md5_handler(soap, &data->context, MD5_FINAL, data->digest, 0))) return err; data->fposthdr(soap, "Content-MD5", soap_s2base64(soap, (unsigned char*)data->digest, buf64, 16)); } return data->fposthdr(soap, key, val); } static int http_md5_parse_header(struct soap *soap, const char *key, const char *val) { struct http_md5_data *data = (struct http_md5_data*)soap_lookup_plugin(soap, http_md5_id); if (!data) return SOAP_PLUGIN_ERROR; if (!soap_tag_cmp(key, "Content-MD5")) { soap_base642s(soap, val, data->digest, 16, NULL); data->fpreparerecv = soap->fpreparerecv; soap->fpreparerecv = http_md5_preparerecv; data->fpreparefinalrecv = soap->fpreparefinalrecv; soap->fpreparefinalrecv = http_md5_preparefinalrecv; md5_handler(soap, &data->context, MD5_INIT, NULL, 0); return SOAP_OK; } return data->fparsehdr(soap, key, val); } static int http_md5_prepareinitsend(struct soap *soap) { struct http_md5_data *data = (struct http_md5_data*)soap_lookup_plugin(soap, http_md5_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 md5_handler(soap, &data->context, MD5_INIT, NULL, 0); if (data->fprepareinitsend) return data->fprepareinitsend(soap); return SOAP_OK; } static int http_md5_prepareinitrecv(struct soap *soap) { struct http_md5_data *data = (struct http_md5_data*)soap_lookup_plugin(soap, http_md5_id); if (!data) return SOAP_PLUGIN_ERROR; if (soap->fpreparerecv == http_md5_preparerecv) soap->fpreparerecv = data->fpreparerecv; if (soap->fpreparefinalrecv == http_md5_preparefinalrecv) soap->fpreparefinalrecv = data->fpreparefinalrecv; if (data->fprepareinitrecv) return data->fprepareinitrecv(soap); return SOAP_OK; } static int http_md5_preparesend(struct soap *soap, const char *buf, size_t len) { struct http_md5_data *data = (struct http_md5_data*)soap_lookup_plugin(soap, http_md5_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_md5_preparerecv(struct soap *soap, const char *buf, size_t len) { struct http_md5_data *data = (struct http_md5_data*)soap_lookup_plugin(soap, http_md5_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_md5_preparefinalrecv(struct soap *soap) { struct http_md5_data *data = (struct http_md5_data*)soap_lookup_plugin(soap, http_md5_id); char digest[16]; if (!data) return SOAP_PLUGIN_ERROR; md5_handler(soap, &data->context, MD5_FINAL, digest, 0); soap->fpreparerecv = data->fpreparerecv; soap->fpreparefinalrecv = data->fpreparefinalrecv; if (memcmp((void*)digest, (const void*)data->digest, sizeof(data->digest))) return soap_sender_fault(soap, "MD5 digest mismatch: message corrupted", NULL); if (soap->fpreparefinalrecv) return soap->fpreparefinalrecv(soap); return SOAP_OK; } #ifdef __cplusplus } #endif gsoap-2.8.91/gsoap/plugin/logging.c0000644000175000017500000001513313525245161016474 0ustar ellertellert/* logging.c Message logging plugin and message stats collector Register the plugin with: soap_register_plugin(soap, logging); Change logging destinations: soap_set_logging_inbound(struct soap*, FILE*); soap_set_logging_outbound(struct soap*, FILE*); Turn logging off by passing NULL FILE* descriptor. To obtain stats (sent and recv byte count): soap_logging_stats(soap, size_t *sent, size_t *recv); where sent and recv will be set to the number of bytes sent (outbound) and received (inbound) in total, respectively. The stats are collected even when inbound and outbound logging is turned off. To reset the stats: soap_reset_loggin_stats(soap); 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, 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-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 -------------------------------------------------------------------------------- */ #include "logging.h" #ifdef __cplusplus extern "C" { #endif const char logging_id[] = LOGGING_ID; static int logging_init(struct soap *soap, struct logging_data *data); static void logging_delete(struct soap *soap, struct soap_plugin *p); static int logging_send(struct soap *soap, const char *buf, size_t len); static size_t logging_recv(struct soap *soap, char *buf, size_t len); /* plugin registry function, invoked by soap_register_plugin */ SOAP_FMAC1 int SOAP_FMAC2 logging(struct soap *soap, struct soap_plugin *p, void *arg) { (void)arg; p->id = logging_id; /* create local plugin data */ p->data = (void*)SOAP_MALLOC(soap, sizeof(struct logging_data)); /* register the destructor */ p->fdelete = logging_delete; /* if OK then initialize */ if (!p->data) return SOAP_EOM; if (logging_init(soap, (struct logging_data*)p->data)) { SOAP_FREE(soap, p->data); /* error: could not init */ return SOAP_EOM; /* return error */ } return SOAP_OK; } /* set inbound logging FD, NULL to disable */ SOAP_FMAC1 void SOAP_FMAC2 soap_set_logging_inbound(struct soap *soap, FILE *fd) { struct logging_data *data = (struct logging_data*)soap_lookup_plugin(soap, logging_id); if (data) data->inbound = fd; } /* set outbound logging FD, NULL to disable */ SOAP_FMAC1 void SOAP_FMAC2 soap_set_logging_outbound(struct soap *soap, FILE *fd) { struct logging_data *data = (struct logging_data*)soap_lookup_plugin(soap, logging_id); if (data) data->outbound = fd; } /* get logging sent and recv octet counts */ SOAP_FMAC1 void SOAP_FMAC2 soap_logging_stats(struct soap *soap, size_t *sent, size_t *recv) { struct logging_data *data = (struct logging_data*)soap_lookup_plugin(soap, logging_id); if (data) { *sent = data->stat_sent; *recv = data->stat_recv; } } /* reset the logging stats */ SOAP_FMAC1 void SOAP_FMAC2 soap_reset_logging_stats(struct soap *soap) { struct logging_data *data = (struct logging_data*)soap_lookup_plugin(soap, logging_id); if (data) { data->stat_sent = 0; data->stat_recv = 0; } } /* used by plugin registry function */ static int logging_init(struct soap *soap, struct logging_data *data) { data->inbound = NULL; data->outbound = NULL; data->stat_sent = 0; data->stat_recv = 0; data->fsend = soap->fsend; /* save old recv callback */ data->frecv = soap->frecv; /* save old send callback */ soap->fsend = logging_send; /* replace send callback with ours */ soap->frecv = logging_recv; /* replace recv callback with ours */ return SOAP_OK; } static void logging_delete(struct soap *soap, struct soap_plugin *p) { (void)soap; /* free allocated plugin data. If fcopy() is not set, then this function is not called for all copies of the plugin created with soap_copy(). In this example, the fcopy() callback is omitted and the plugin data is shared by the soap copies created with soap_copy() */ SOAP_FREE(soap, p->data); } static size_t logging_recv(struct soap *soap, char *buf, size_t len) { struct logging_data *data = (struct logging_data*)soap_lookup_plugin(soap, logging_id); size_t res; /* get data from old recv callback */ res = data->frecv(soap, buf, len); /* update should be in mutex, but we don't mind some inaccuracy in stats */ data->stat_recv += res; if (data->inbound) fwrite(buf, res, 1, data->inbound); return res; } static int logging_send(struct soap *soap, const char *buf, size_t len) { struct logging_data *data = (struct logging_data*)soap_lookup_plugin(soap, logging_id); /* update should be in mutex, but we don't mind some inaccuracy in stats */ data->stat_sent += len; if (data->outbound) fwrite(buf, len, 1, data->outbound); return data->fsend(soap, buf, len); /* pass data on to old send callback */ } #ifdef __cplusplus } #endif gsoap-2.8.91/gsoap/plugin/plugin.h0000644000175000017500000000112313525245161016343 0ustar ellertellert/* plugin.h Example gSOAP plug-in. Include this file and link with plugin.c Copyright (C) 2000-2002 Robert A. van Engelen. All Rights Reserved. */ #include "stdsoap2.h" #define PLUGIN_ID "SOAP-PLUGIN/1.0" /* plugin identification */ #ifdef __cplusplus extern "C" { #endif struct plugin_data { int (*fsend)(struct soap*, const char*, size_t); /* example: to save and use send callback */ size_t (*frecv)(struct soap*, char*, size_t); /* example: to save and use recv callback */ }; int plugin(struct soap *soap, struct soap_plugin *plugin, void *arg); #ifdef __cplusplus } #endif gsoap-2.8.91/gsoap/plugin/httppipe.c0000644000175000017500000001613713525245161016710 0ustar ellertellert/* httppipe.c HTTP pipeline implementation for stand-alone gSOAP servers See instructions below. gSOAP XML Web services tools Copyright (C) 2000-2018, Robert van Engelen, Genivia, Inc. All Rights Reserved. -------------------------------------------------------------------------------- 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-2004 Robert A. 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. -------------------------------------------------------------------------------- Compile & link with stand-alone gSOAP server. HTTP pipelining allows multiple request messages to be dispatched by client applications. This allows for some overlap of messages send and received. This improves performance marginally and only under certain conditions when clients orgestrate the pipeline feed properly. A non-multi-threaded client application may be able to sent N requests to the server until request N+1 times out: client request 1 --> server client request 2 --> server ... client request N --> server if time out client request N+1 --> server then client response 1 <-- server client response 2 <-- server ... client response N <-- server client request N+1 --> server ... This plugin queues the next pending request(s) received in a buffer so that the next server loop iteration in soap_serve() continues to accept and serve these pending requests in the pipeline. Usage (server side): struct soap soap; soap_init1(&soap, SOAP_IO_KEEPALIVE); soap_register_plugin(&soap, http_pipe); ... ... = soap_copy(&soap); // copies plugin too ... soap_done(&soap); // delete plugin */ #include "httppipe.h" #ifdef __cplusplus extern "C" { #endif const char http_pipe_id[] = HTTP_PIPE_ID; static int http_pipe_init(struct soap *soap, struct http_pipe_data *data); static void http_pipe_delete(struct soap *soap, struct soap_plugin *p); static int http_pipe_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src); static int http_pipe_init_recv(struct soap *soap); static int http_pipe_final_recv(struct soap *soap); int http_pipe(struct soap *soap, struct soap_plugin *p, void *arg) { (void)arg; p->id = http_pipe_id; p->data = (void*)SOAP_MALLOC(soap, sizeof(struct http_pipe_data)); p->fdelete = http_pipe_delete; p->fcopy = http_pipe_copy; if (!p->data) return SOAP_EOM; if (http_pipe_init(soap, (struct http_pipe_data*)p->data)) { SOAP_FREE(soap, p->data); /* error: could not init */ return SOAP_EOM; /* return error */ } return SOAP_OK; } static int http_pipe_init(struct soap *soap, struct http_pipe_data *data) { data->fprepareinitrecv = soap->fprepareinitrecv; /* save old callback */ soap->fprepareinitrecv = http_pipe_init_recv; /* replace callback with ours */ data->fpreparefinalrecv = soap->fpreparefinalrecv; /* save old callback */ soap->fpreparefinalrecv = http_pipe_final_recv; /* replace callback with ours */ data->len = 0; return SOAP_OK; } static void http_pipe_delete(struct soap *soap, struct soap_plugin *p) { soap->fprepareinitrecv = ((struct http_pipe_data*)p->data)->fprepareinitrecv; /* replace callback with ours */ soap->fpreparefinalrecv = ((struct http_pipe_data*)p->data)->fpreparefinalrecv; /* replace callback with ours */ SOAP_FREE(soap, p->data); /* free allocated plugin data (this function is not called for shared plugin data, but only when the final soap_done() is invoked on the original soap struct) */ } static int http_pipe_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) { (void)soap; /* make a copy of the plugin data */ dst->data = (void*)SOAP_MALLOC(soap, sizeof(struct http_pipe_data)); if (!dst->data) return SOAP_EOM; ((struct http_pipe_data*)dst->data)->fprepareinitrecv = ((struct http_pipe_data*)src->data)->fprepareinitrecv; ((struct http_pipe_data*)dst->data)->fpreparefinalrecv = ((struct http_pipe_data*)src->data)->fpreparefinalrecv; ((struct http_pipe_data*)dst->data)->len = 0; return SOAP_OK; } static int http_pipe_init_recv(struct soap *soap) { struct http_pipe_data *data = (struct http_pipe_data*)soap_lookup_plugin(soap, http_pipe_id); if (!data) return SOAP_PLUGIN_ERROR; /* if previous message exchange left data in the receive buffer, use that data */ if (data->len && soap->keep_alive) { (void)soap_memcpy(soap->buf, sizeof(soap->buf), data->buf, data->len); soap->bufidx = 0; soap->buflen = data->len; DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP pipeline: restored %lu buffered bytes\n", (unsigned long)data->len)); } data->len = 0; if (data->fprepareinitrecv) return data->fprepareinitrecv(soap); return SOAP_OK; } static int http_pipe_final_recv(struct soap *soap) { struct http_pipe_data *data = (struct http_pipe_data*)soap_lookup_plugin(soap, http_pipe_id); if (!data) return SOAP_PLUGIN_ERROR; if (soap->keep_alive) { /* if message has data left in the receive buffer, save that data for later */ data->len = soap->buflen - soap->bufidx; if (data->len) { (void)soap_memcpy(data->buf, sizeof(data->buf), soap->buf + soap->bufidx, data->len); DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP pipeline: saved %lu buffered bytes\n", (unsigned long)data->len)); } } else { data->len = 0; } if (data->fpreparefinalrecv) return data->fpreparefinalrecv(soap); return SOAP_OK; } #ifdef __cplusplus } #endif gsoap-2.8.91/gsoap/plugin/httpform.c0000644000175000017500000001473413525245161016717 0ustar ellertellert/* httpform.c gSOAP HTTP POST application/x-www-form-urlencoded data plugin. Note: multipart/related and multipart/form-data are handled in gSOAP as MIME attachments. 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, 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-2004 Robert A. 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. -------------------------------------------------------------------------------- Compile & link with stand-alone gSOAP server. Usage (server side): struct soap soap; soap_init(&soap); soap_register_plugin_arg(&soap, http_form, http_form_handler); ... ... = soap_copy(&soap); // copies plugin too but not its data: plugin data is shared since fcopy is not set ... soap_done(&soap); // detach plugin (calls plugin->fdelete) You need to define a HTTP handling function at the server-side: int http_form_handler(struct soap*) which will be called from the plugin upon an HTTP POST request that matches the application/x-www-form-urlencoded content-type. The function should return an error code or SOAP_STOP to prevent the gSOAP engine from processing the message body; To parse form data in the handler, use: char *s = soap_http_get_form(soap); while (s) { char *key = soap_query_key(soap, &s); // decode next form string key char *val = soap_query_val(soap, &s); // decode next form string value (if any) ... } The soap_http_get_form() function reads an HTTP body and stores it in an internal buffer that is returned as a char*. This buffer can be used to process HTTP POST body content. The soap_query_key/val functions simply extract key-value pairs from this buffer. The handler should also produce a valid HTTP response, for example: soap_response(soap, SOAP_HTML); // use this to return HTML ... soap_response(soap, SOAP_OK); // ... or use this to return a SOAP message ... soap_send(soap, "..."); // example HTML ... soap_end_send(soap); See samples/webserver for an example HTTP POST form handling server. Warning: this plugin MUST be registered AFTER the httppost plugin. */ #include "httpform.h" #ifdef __cplusplus extern "C" { #endif const char http_form_id[] = HTTP_FORM_ID; static int http_form_init(struct soap *soap, struct http_form_data *data, int (*handler)(struct soap*)); static void http_form_delete(struct soap *soap, struct soap_plugin *p); static int http_form_parse_header(struct soap *soap, const char*, const char*); int http_form(struct soap *soap, struct soap_plugin *p, void *arg) { p->id = http_form_id; p->data = (void*)SOAP_MALLOC(soap, sizeof(struct http_form_data)); p->fdelete = http_form_delete; if (!p->data) return SOAP_EOM; if (http_form_init(soap, (struct http_form_data*)p->data, (int (*)(struct soap*))arg)) { SOAP_FREE(soap, p->data); /* error: could not init */ return SOAP_EOM; /* return error */ } return SOAP_OK; } static int http_form_init(struct soap *soap, struct http_form_data *data, int (*handler)(struct soap*)) { data->fparsehdr = soap->fparsehdr; /* save old HTTP header parser callback */ soap->fparsehdr = http_form_parse_header; /* replace HTTP header parser callback with ours */ if (handler) data->handler = handler; return SOAP_OK; } static void http_form_delete(struct soap *soap, struct soap_plugin *p) { (void)soap; SOAP_FREE(soap, p->data); /* free allocated plugin data (this function is not called for shared plugin data, but only when the final soap_done() is invoked on the original soap struct) */ } static int http_form_parse_header(struct soap *soap, const char *key, const char *val) { struct http_form_data *data = (struct http_form_data*)soap_lookup_plugin(soap, http_form_id); if (!data) return SOAP_PLUGIN_ERROR; if (!soap_tag_cmp(key, "Content-Type")) { /* check content type: you can filter any type of payloads here */ if (!soap_tag_cmp(val, "application/x-www-form-urlencoded") || !soap_tag_cmp(val, "application/x-www-form-urlencoded;*")) /* skip charset=UTF-8 etc */ { soap->fform = data->handler; return soap->error = SOAP_FORM; /* delegate body parsing to form handler */ } /* it is possible to add other payload types to handle via forms and use * as a wildcard: if (!soap_tag_cmp(val, "image/jpg") || !soap_tag_cmp(val, "image/jpg;*")) soap->error = SOAP_FORM; */ } return data->fparsehdr(soap, key, val); /* parse HTTP header */ } /******************************************************************************/ #ifdef __cplusplus } #endif gsoap-2.8.91/gsoap/plugin/httpposttest.c0000644000175000017500000001540613525245161017636 0ustar ellertellert/* httpposttest.c gSOAP HTTP POST plugin client and server example application. gSOAP XML Web services tools Copyright (C) 2000-2009, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- 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-2009, 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. -------------------------------------------------------------------------------- Compile: soapcpp2 -S -c httpposttest.h cc -Iplugin -o httpposttest httpposttest.c soapC.c soapServer.c httppost.c stdsoap2.c To support https and compression, compile with: cc -DWITH_OPENSSL -DWITH_GZIP -Iplugin -o httpposttest httpposttest.c soapC.c soapServer.c httppost.c stdsoap2.c -lssl -lcrypto -lz */ #include "soapH.h" #include "httppost.h" int jpg_post_handler(struct soap *soap); int image_post_handler(struct soap *soap); int text_post_handler(struct soap *soap); int generic_POST_handler(struct soap *soap); int generic_PUT_handler(struct soap *soap); int generic_DELETE_handler(struct soap *soap); int main(int argc, char **argv) { char *buf; size_t len; struct soap soap; soap_init(&soap); /* chunking conserves memory and is generally faster: */ soap_set_omode(&soap, SOAP_IO_CHUNK); if (argc < 2) { /* CGI server */ struct http_post_handlers handlers[] = { { "image/jpg", jpg_post_handler }, { "image/*", image_post_handler }, { "image/*;*", image_post_handler }, { "text/*", text_post_handler }, { "text/*;*", text_post_handler }, { "POST", generic_POST_handler }, { "PUT", generic_PUT_handler }, { "DELETE", generic_DELETE_handler }, { NULL } }; soap_register_plugin_arg(&soap, http_post, handlers); /* register plugin (server only) */ soap_serve(&soap); exit(0); } /* HTTP POST client */ if (soap_post_connect(&soap, argv[1], NULL, "text/html") || soap_send(&soap, "") || soap_send(&soap, argc == 2 ? "Hello" : argv[2]) || soap_send(&soap, "") || soap_end_send(&soap)) { soap_print_fault(&soap, stderr); exit(1); } /* after sending POST content, receive body (note: POST handlers should not be set for client) */ if (soap_begin_recv(&soap) || soap_http_body(&soap, &buf, &len) || soap_end_recv(&soap)) { soap_print_fault(&soap, stderr); exit(1); } soap_closesock(&soap); /* close only when not keep-alive */ printf("Received %lu bytes of type %s:\n", (unsigned long)len, soap.http_content?soap.http_content:""); soap_end(&soap); soap_done(&soap); return 0; } /* Calculator service operations */ int __ns1__add(struct soap *soap, struct ns2__pair *in, double *out) { *out = in->a + in->b; return SOAP_OK; } int __ns1__sub(struct soap *soap, struct ns2__pair *in, double *out) { *out = in->a - in->b; return SOAP_OK; } int __ns1__mul(struct soap *soap, struct ns2__pair *in, double *out) { *out = in->a * in->b; return SOAP_OK; } int __ns1__div(struct soap *soap, struct ns2__pair *in, double *out) { *out = in->a / in->b; return SOAP_OK; } int __ns1__pow(struct soap *soap, struct ns2__pair *in, double *out) { *out = pow(in->a, in->b); return SOAP_OK; } /* the jpg handler just responds with HTTP OK */ int jpg_post_handler(struct soap *soap) { char *buf; size_t len; soap_http_body(soap, &buf, &len); soap_response(soap, SOAP_OK); soap_end_send(soap); return SOAP_OK; } /* the image handler responds with HTTP OK and a text/html body */ int image_post_handler(struct soap *soap) { char *buf; size_t len; soap_http_body(soap, &buf, &len); soap_response(soap, SOAP_HTML); soap_send(soap, "Image received"); soap_end_send(soap); return SOAP_OK; } /* the text handler copies the message back */ int text_post_handler(struct soap *soap) { char *buf; size_t len; soap_http_body(soap, &buf, &len); /* use current soap->http_content from HTTP header as return HTTP type */ soap_response(soap, SOAP_FILE); soap_send_raw(soap, buf, len); soap_end_send(soap); return SOAP_OK; } /* the generic POST handler */ int generic_POST_handler(struct soap *soap) { char *buf; size_t len; soap_http_body(soap, &buf, &len); fprintf(stderr, "Generic POST accepted URL=\"%s\" content=\"%s\"\n", soap->endpoint, soap->http_content); soap_response(soap, SOAP_HTML); soap_send(soap, "Data received"); soap_end_send(soap); return SOAP_OK; } /* the generic PUT handler */ int generic_PUT_handler(struct soap *soap) { char *buf; size_t len; soap_http_body(soap, &buf, &len); fprintf(stderr, "Generic PUT accepted URL=\"%s\" content=\"%s\"\n", soap->endpoint, soap->http_content); return 202; /* HTTP Accepted */ } /* the generic DELETE handler */ int generic_DELETE_handler(struct soap *soap) { fprintf(stderr, "Generic DELETE accepted URL=\"%s\"\n", soap->endpoint); return 202; /* HTTP Accepted */ } 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}, {NULL, NULL, NULL, NULL} }; gsoap-2.8.91/gsoap/plugin/plugin.c0000644000175000017500000000717613525245161016354 0ustar ellertellert/* plugin.c Example gSOAP plug-in Copyright (C) 2000-2002 Robert A. van Engelen. All Rights Reserved. Compile & link with gSOAP clients and services to view SOAP messages. Usage (client/server code): struct soap soap; soap_init(&soap); soap_register_plugin(&soap, plugin); // register plugin ... ... = soap_copy(&soap); // copies plugin too ... soap_done(&soap); // detach plugin A plugin is copied with the soap_copy() call. Upon this call, two situations may arise depending on setting the fcopy() callback and the need to share or not share plugin data: 1. if the plugin fcopy() callback is set, it will be called to allow the plugin to copy its local data. When soap_done() is called on the copy, the fdelete() callback is called for cleanup. 2. if the plugin fcopy() callback is not set, then the plugin data will be shared (i.e. the data pointer points to the same address). The fdelete() callback will not be called upon a soap_done() on a copy of the soap struct. The fdelete() callback will be called for the original soap struct with which the plugin registered. */ #include "plugin.h" static const char plugin_id[] = PLUGIN_ID; static int plugin_init(struct soap *soap, struct plugin_data *data); static int plugin_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src); static void plugin_delete(struct soap *soap, struct soap_plugin *p); static int plugin_send(struct soap *soap, const char *buf, size_t len); static size_t plugin_recv(struct soap *soap, char *buf, size_t len); int plugin(struct soap *soap, struct soap_plugin *p, void *arg) { p->id = plugin_id; p->data = (void*)malloc(sizeof(struct plugin_data)); /* optional: define fcopy() operation. When defined, fdelete() will be called for every copy of the plugin created with fcopy(), when NOT defined, fdelete() will only be called on the original non-copied plugin */ p->fcopy = plugin_copy; p->fdelete = plugin_delete; if (!p->data) return SOAP_EOM; if (plugin_init(soap, (struct plugin_data*)p->data)) { free(p->data); /* error: could not init */ return SOAP_EOM; /* return error */ } return SOAP_OK; } static int plugin_init(struct soap *soap, struct plugin_data *data) { data->fsend = soap->fsend; /* save old recv callback */ data->frecv = soap->frecv; /* save old send callback */ soap->fsend = plugin_send; /* replace send callback with ours */ soap->frecv = plugin_recv; /* replace recv callback with ours */ return SOAP_OK; } static int plugin_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) { if (!(dst->data = (struct plugin_data*)malloc(sizeof(struct plugin_data)))) return SOAP_EOM; *dst->data = *src->data; return SOAP_OK; } static void plugin_delete(struct soap *soap, struct soap_plugin *p) { free(p->data); /* free allocated plugin data. If fcopy() is not set, then this function is not called for all copies of the plugin created with soap_copy(). In this example, the fcopy() callback can be safely omitted. When omitted, the plugin data is shared by the soap copies created with soap_copy() */ } static int plugin_send(struct soap *soap, const char *buf, size_t len) { struct plugin_data *data = (struct plugin_data*)soap_lookup_plugin(soap, plugin_id); fwrite(buf, len, 1, stderr); return data->fsend(soap, buf, len); /* pass data on to old send callback */ } static size_t plugin_recv(struct soap *soap, char *buf, size_t len) { struct plugin_data *data = (struct plugin_data*)soap_lookup_plugin(soap, plugin_id); size_t res = data->frecv(soap, buf, len); /* get data from old recv callback */ fwrite(buf, res, 1, stderr); return res; } gsoap-2.8.91/gsoap/plugin/curlapi.c0000644000175000017500000007410113525245161016505 0ustar ellertellert/* curlapi.c cURL plugin. gSOAP XML Web services tools Copyright (C) 2000-2017, 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-2017, 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 -------------------------------------------------------------------------------- */ /** @mainpage The CURL plugin [TOC] @section curl_0 Overview The CURL plugin for gSOAP provides a bridge for the gSOAP engine to use libcurl for internet communications. While gSOAP provides a full HTTP stack, libcurl can be used to support additional protocols and features by replacing gSOAP's HTTP stack. @section curl_1 CURL plugin setup To use the CURL plugin: -# Add `#include "plugin/curlapi.h"` to your client-side code and compile your code together with `plugin/curlapi.c`. Link your code with libcurl. -# Add `curl_global_init(CURL_GLOBAL_ALL)` at the start of your program to initialize CURL. Add `curl_global_cleanup()` at the end of your program. -# In your source code where you create a `soap` context, register the plugin with this `soap` context, Or use the `soap` member of a soapcpp2-generated C++ proxy class. Use `soap_register_plugin(soap, soap_curl)` to register. -# Alternatively, if you have a `CURL *curl` handle already set up, then register the plugin with `soap_register_plugin_arg(soap, soap_curl, curl)`. The benefit of this is that you can set CURL options of the handle. Do not delete this handle until the `soap` context is deleted. -# If you register multiple other plugins with the context, you should register the CURL plugin always first. The plugin is not limited to SOAP calls, you can use it with XML REST and JSON in gSOAP. The plugin registry steps are the same for any client-side API service calls. The CURL plugin supports SOAP with MTOM attachments, including streaming MTOM. Other plugins can be combined with this plugin, such as WSSE for WS-Security. @note The CURL plugin increases the overhead of HTTP calls compared to the gSOAP HTTP stack. The overhead is due to buffering of the entire outbound message before sending and buffering of the entire message received. By contrast, gSOAP uses a streaming approach and only buffers the socket communications to (de)serialize XML directly into C/C++ data. @section curl_2 Configuration and settings To use the CURL plugin, register the plugin with the current `soap` context using `soap_register_plugin(soap, soap_curl)`. This also creates a new CURL handle that is internally used by the plugin until the `soap` context is deleted. For C++ proxy classes generated with soapcpp2, register the plugin with the `soap` member of the proxy class. The gSOAP HTTP chunked transfer mode `SOAP_IO_CHUNK` and timeout settings are also used by the CURL plugin, when set, as follows: @code #include "plugin/curlapi.h" ... struct soap *soap; curl_global_init(CURL_GLOBAL_ALL); soap = soap_new1(SOAP_IO_CHUNK | SOAP_XML_INDENT); soap_register_plugin(soap, soap_curl); soap->connect_timeout = 60; // 1 minute soap->send_timeout = 10; // 10 seconds soap->recv_timeout = 10; // 10 seconds soap->transfer_timeout = 20; // 20 seconds ... // client program runs ... soap_destroy(soap); soap_end(soap); soap_free(soap); curl_global_cleanup(); @endcode It is strongly recommended to set timeouts. The timeout values specified here are just examples. Actual values depend on the application's performance characteristics. HTTP proxy settings are used by the CURL plugin. You can specify the HTTP proxy settings `soap->proxy_host` and `soap->proxy_port` with the HTTP proxy host and port, respectively, and specify the HTTP proxy access credentials `soap->proxy_userid` and `soap->proxy_passwd`. Also compression is used by the CURL plugin when enabled with `SOAP_ENC_ZLIB`: @code #include "plugin/curlapi.h" ... struct soap *soap; curl_global_init(CURL_GLOBAL_ALL); soap = soap_new1(SOAP_IO_CHUNK | SOAP_ENC_ZLIB | SOAP_XML_INDENT); soap_register_plugin(soap, soap_curl); ... // client program runs ... soap_destroy(soap); soap_end(soap); soap_free(soap); curl_global_cleanup(); @endcode When an transmission error occurs, use `soap_curl_reset(soap)` to reset the plugin. This ensures that the gSOAP IO operations are reset and will behave again normally. Alternatively, you can create your own `CURL *curl` handle, configure it, and pass it to the plugin as follows: @code #include "plugin/curlapi.h" ... struct soap *soap; CURL *curl; curl_global_init(CURL_GLOBAL_ALL); curl = curl_easy_init(); curl_easy_setopt(data->curl, CURLOPT_CONNECTTIMEOUT, 60L); curl_easy_setopt(data->curl, CURLOPT_TIMEOUT, 10L); soap = soap_new1(SOAP_XML_INDENT); soap_register_plugin_arg(soap, soap_curl, curl); ... // client program runs ... soap_destroy(soap); soap_end(soap); soap_free(soap); curl_easy_cleanup(curl); ... curl_global_cleanup(); @endcode Note that C++ proxy classes generated by soapcpp2 with option `-j` have a `soap` member that should be used to register the plugin with: @code #include "plugin/curlapi.h" ... Proxy proxy(SOAP_XML_INDENT); CURL *curl; curl_global_init(CURL_GLOBAL_ALL); curl = curl_easy_init(); curl_easy_setopt(data->curl, CURLOPT_CONNECTTIMEOUT, 60L); curl_easy_setopt(data->curl, CURLOPT_TIMEOUT, 10L); soap_register_plugin_arg(proxy.soap, soap_curl, curl); ... // make calls with the proxy object ... proxy.destroy(); curl_easy_cleanup(curl); ... curl_global_cleanup(); @endcode @section curl_3 SOAP client example This example shows a calculator client application with CURL and gSOAP. The soapcpp2 command is applied to `calc.h` with `soapcpp2 -c -CL calc.h`, where `calc.h` is: @code //gsoap ns service name: calc Simple calculator service described at https://www.genivia.com/dev.html //gsoap ns service protocol: SOAP //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns schema namespace: urn:calc //gsoap ns service method: add Sums two values int ns__add(double a, double b, double *result); //gsoap ns service method: sub Subtracts two values int ns__sub(double a, double b, double *result); //gsoap ns service method: mul Multiplies two values int ns__mul(double a, double b, double *result); //gsoap ns service method: div Divides two values int ns__div(double a, double b, double *result); //gsoap ns service method: pow Raises a to b int ns__pow(double a, double b, double *result); @endcode This generates `soapStub.h`, `soapH.h`, `soapC.c`, `soapClient.c`, and `calc.nsmap`. To keep this example small, the main program uses the calculator service to add two values: @code #include "soapH.h" #include "calc.nsmap" #include "plugin/curlapi.h" const char server[] = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; int main(int argc, char **argv) { struct soap *soap = soap_new1(SOAP_XML_INDENT); double result; curl_global_init(CURL_GLOBAL_ALL); soap_register_plugin(soap, soap_curl); if (soap_call_ns__add(soap, server, "", 2.0, 3.0, &result)) { soap_print_fault(soap, stderr); soap_curl_reset(soap); } else printf("2 +3 = %g\n", result); soap_destroy(soap); soap_end(soap); soap_free(soap); curl_global_cleanup(); return 0; } @endcode We compile this example program together with `stdsoap2.c`, `soapC.c`, `soapClient.c`, `plugin/curlapi.c` and we link it with libcurl. As stated previously, to use a current `CURL *curl` handle that you have created, use `soap_register_plugin_arg(soap, soap_curl, curl)` to register the plugin. @section curl_4 JSON REST example See the gSOAP [JSON documentation](https://www.genivia.com/doc/xml-rpc-json/html/index.html) for details about using JSON with gSOAP in C and in C++. A JSON client in C with CURL has the following outline: @code #include "plugin/curlapi.h" #include "json.h" struct Namespace namespaces[] = {{NULL,NULL,NULL,NULL}}; ... struct soap *ctx = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_INDENT); struct value *request = new_value(ctx); struct value response; curl_global_init(CURL_GLOBAL_ALL); soap_register_plugin(ctx, soap_curl); ... // here we populate the request data to send if (json_call(ctx, "endpoint URL", request, &response)) { soap_print_fault(ctx, stderr); soap_curl_reset(ctx); } else { ... // use the response data here } soap_destroy(ctx); // delete objects soap_end(ctx); // delete data ... // here we can make other calls etc. soap_free(ctx); // delete the context curl_global_cleanup(); @endcode As stated previously, to use a current `CURL *curl` handle that you have created, use `soap_register_plugin_arg(soap, soap_curl, curl)` to register the plugin. JSON in C++ is similar to the C example shown with the benefit of the easy-to-use [JSON C++ API](https://www.genivia.com/doc/xml-rpc-json/html/index.html#cpp). */ #include "curlapi.h" #ifdef __cplusplus extern "C" { #endif /** Plugin identification for plugin registry */ const char soap_curl_id[] = SOAP_CURL_ID; /******************************************************************************\ * * Static protos * \******************************************************************************/ static int soap_curl_init(struct soap *soap, struct soap_curl_data *data, CURL *curl); static void soap_curl_delete(struct soap *soap, struct soap_plugin *p); static int soap_curl_connect_callback(struct soap *soap, const char *endpoint, const char *host, int port); static int soap_curl_send_callback(struct soap *soap, const char *buf, size_t len); static int soap_curl_prepare_init_recv_callback(struct soap *soap); static int soap_curl_prepare_final_recv_callback(struct soap *soap); static size_t soap_curl_recv_callback(struct soap *soap, char *buf, size_t size); static size_t soap_curl_read_callback(void *buffer, size_t size, size_t nitems, void *ptr); static size_t soap_curl_write_callback(void *buffer, size_t size, size_t nitems, void *ptr); /******************************************************************************\ * * Plugin registry functions * \******************************************************************************/ /** @fn int soap_curl(struct soap *soap, struct soap_plugin *p, void *arg) @brief Plugin registry function, used with soap_register_plugin and soap_register_plugin_arg. @param soap context @param[in,out] p plugin created in registry @param[in] arg passed from soap_register_plugin_arg @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_curl(struct soap *soap, struct soap_plugin *p, void *arg) { DBGFUN("soap_curl"); p->id = soap_curl_id; p->data = (void*)SOAP_MALLOC(soap, sizeof(struct soap_curl_data)); p->fcopy = NULL; p->fdelete = soap_curl_delete; if (!p->data) return SOAP_EOM; if (soap_curl_init(soap, (struct soap_curl_data*)p->data, (CURL*)arg)) { SOAP_FREE(soap, p->data); return SOAP_EOM; } return SOAP_OK; } /** @fn int soap_curl_init(struct soap *soap, struct soap_wsa_data *data) @brief Initializes plugin data. @param soap context @param[in,out] data plugin data @return SOAP_OK */ static int soap_curl_init(struct soap *soap, struct soap_curl_data *data, CURL *curl) { DBGFUN("soap_curl_init"); data->soap = soap; data->curl = curl; data->own = (curl == NULL); data->active = 0; data->hdr = NULL; data->blk = NULL; data->ptr = NULL; data->lst = NULL; data->mode = soap->omode; *data->buf = '\0'; soap->omode &= ~SOAP_IO; soap->omode |= SOAP_IO_BUFFER; soap->omode |= SOAP_ENC_PLAIN; data->fconnect = soap->fconnect; soap->fconnect = soap_curl_connect_callback; data->fsend = soap->fsend; soap->fsend = soap_curl_send_callback; data->frecv = soap->frecv; soap->frecv = soap_curl_recv_callback; data->fprepareinitrecv = soap->fprepareinitrecv; soap->fprepareinitrecv = soap_curl_prepare_init_recv_callback; data->fpreparefinalrecv = soap->fpreparefinalrecv; soap->fpreparefinalrecv = soap_curl_prepare_final_recv_callback; return SOAP_OK; } /** @fn void soap_curl_delete(struct soap *soap, struct soap_plugin *p) @brief Deletes plugin data. @param soap context @param[in,out] p plugin */ static void soap_curl_delete(struct soap *soap, struct soap_plugin *p) { (void)soap; struct soap_curl_data *data = (struct soap_curl_data*)p->data; DBGFUN("soap_curl_delete"); if (data->lst) soap_end_block(soap, data->lst); if (data->curl && data->own) curl_easy_cleanup(data->curl); soap->fsend = data->fsend; soap->frecv = data->frecv; soap->fprepareinitrecv = data->fprepareinitrecv; soap->fpreparefinalrecv = data->fpreparefinalrecv; SOAP_FREE(soap, data); } /******************************************************************************\ * * Plugin API calls * \******************************************************************************/ /** @fn int soap_curl_reset(struct soap *soap) @brief Reset the plugin so gSOAP IO behaves normally. This is an optional API call, not required except when serializing data after an error. @param soap context */ SOAP_FMAC1 void SOAP_FMAC2 soap_curl_reset(struct soap *soap) { struct soap_curl_data *data = (struct soap_curl_data*)soap_lookup_plugin(soap, soap_curl_id); DBGFUN("soap_curl_reset"); if (data) { if (data->lst) soap_end_block(soap, data->lst); data->lst = NULL; data->active = 0; } } /******************************************************************************\ * * Callbacks registered by plugin * \******************************************************************************/ /** @fn int soap_curl_connect_callback(struct soap *soap, const char *endpoint, const char *host, int port) @brief The fconnect callback invokes this function to override connecting to an endpoint. @param soap context @param endpoint URL to connect to, use "" if the CURL handle has a URL assigned with CURLOPT_URL @param host not used @param port not used @return SOAP_OK or error code */ static int soap_curl_connect_callback(struct soap *soap, const char *endpoint, const char *host, int port) { struct soap_curl_data *data = (struct soap_curl_data*)soap_lookup_plugin(soap, soap_curl_id); (void)host; (void)port; DBGFUN1("soap_curl_connect_callback", "endpoint=%s", endpoint); if (!data) return soap->error = SOAP_PLUGIN_ERROR; if (!data->curl) /* no CURL handle passed to soap_register_plugin() */ { data->curl = curl_easy_init(); /* so set up our own */ if (!data->curl) return soap->error = SOAP_EOM; data->own = 1; } if (data->hdr) curl_slist_free_all(data->hdr); data->hdr = NULL; data->blk = NULL; data->ptr = NULL; if (data->lst) soap_end_block(soap, data->lst); data->lst = NULL; if (endpoint && *endpoint) /* if endpoint != "" then use it, otherwise use CURL's */ curl_easy_setopt(data->curl, CURLOPT_URL, endpoint); curl_easy_setopt(data->curl, CURLOPT_USERAGENT, SOAP_CURL_ID); if (soap->status == SOAP_POST || soap->status == SOAP_POST_FILE) curl_easy_setopt(data->curl, CURLOPT_POST, 1L); else if (soap->status == SOAP_GET) curl_easy_setopt(data->curl, CURLOPT_HTTPGET, 1L); else if (soap->status == SOAP_PUT) curl_easy_setopt(data->curl, CURLOPT_PUT, 1L); else if (soap->status == SOAP_DEL) curl_easy_setopt(data->curl, CURLOPT_CUSTOMREQUEST, "DELETE"); if (soap->status == SOAP_POST || soap->status == SOAP_POST_FILE || soap->status == SOAP_PUT) { if (soap_http_content_type(soap, SOAP_OK)) { (void)soap_memmove(soap->tmpbuf+14, sizeof(soap->tmpbuf), soap->tmpbuf, sizeof(soap->tmpbuf)-14); soap->tmpbuf[sizeof(soap->tmpbuf)-1] = '\0'; (void)soap_memcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "Content-Type: ", 14); data->hdr = curl_slist_append(data->hdr, soap->tmpbuf); if (!data->hdr) return soap->error = SOAP_EOM; } if (soap->action) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(soap->action) + 14), "SOAPAction: \"%s\"", soap->action); data->hdr = curl_slist_append(data->hdr, soap->tmpbuf); if (!data->hdr) return soap->error = SOAP_EOM; } if (soap->http_extra_header) { const char *header = soap->http_extra_header; const char *next; soap->http_extra_header = NULL; /* use http_extra_header once (assign new value before each call) */ while ((next = strstr(header, "\r\n")) != NULL) { if (next > header && next < header + sizeof(soap->tmpbuf)) { soap_strncpy(soap->tmpbuf, sizeof(soap->tmpbuf), header, next - header); if (*soap->tmpbuf) { data->hdr = curl_slist_append(data->hdr, soap->tmpbuf); if (!data->hdr) return soap->error = SOAP_EOM; } } header = next + 2; } if (*header) { data->hdr = curl_slist_append(data->hdr, header); if (!data->hdr) return soap->error = SOAP_EOM; } } if (data->hdr) curl_easy_setopt(data->curl, CURLOPT_HTTPHEADER, (void*)data->hdr); curl_easy_setopt(data->curl, CURLOPT_READFUNCTION, soap_curl_read_callback); curl_easy_setopt(data->curl, CURLOPT_READDATA, (void*)data); } curl_easy_setopt(data->curl, CURLOPT_WRITEFUNCTION, soap_curl_write_callback); curl_easy_setopt(data->curl, CURLOPT_WRITEDATA, (void*)data); curl_easy_setopt(data->curl, CURLOPT_ERRORBUFFER, data->buf); curl_easy_setopt(data->curl, CURLOPT_NOSIGNAL, 1L); if (soap->connect_timeout > 0) curl_easy_setopt(data->curl, CURLOPT_CONNECTTIMEOUT, (long)soap->connect_timeout); else if (soap->connect_timeout < 0) curl_easy_setopt(data->curl, CURLOPT_CONNECTTIMEOUT_MS, -(long)soap->connect_timeout/1000); if (soap->transfer_timeout > 0) curl_easy_setopt(data->curl, CURLOPT_TIMEOUT, (long)soap->transfer_timeout); else if (soap->send_timeout > 0) curl_easy_setopt(data->curl, CURLOPT_TIMEOUT, (long)soap->send_timeout); else if (soap->send_timeout < 0) curl_easy_setopt(data->curl, CURLOPT_TIMEOUT_MS, -(long)soap->send_timeout/1000); else if (soap->recv_timeout > 0) curl_easy_setopt(data->curl, CURLOPT_TIMEOUT, (long)soap->recv_timeout); else if (soap->recv_timeout < 0) curl_easy_setopt(data->curl, CURLOPT_TIMEOUT_MS, -(long)soap->recv_timeout/1000); if (soap->proxy_host) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(soap->proxy_host) + 8 + 8), "http://%s:%d", soap->proxy_host,soap->proxy_port); curl_easy_setopt(data->curl, CURLOPT_PROXY, (void*)soap->tmpbuf); if (soap->proxy_userid) { size_t len_proxy_userid = strlen(soap->proxy_userid); size_t len_proxy_passwd = soap->proxy_passwd ? strlen(soap->proxy_passwd) : 0; if ((len_proxy_userid + len_proxy_passwd) * 3 + 2 < sizeof(soap->tmpbuf)) { size_t pos = 0; size_t i; for (i = 0; i < len_proxy_userid; i++) { (SOAP_SNPRINTF(soap->tmpbuf + pos, sizeof(soap->tmpbuf) - pos, 4), "%%%02x", (int)((unsigned char)soap->proxy_userid[i])); pos += 3; } soap->tmpbuf[pos] = ':'; pos++; for (i = 0; i < len_proxy_passwd; i++) { (SOAP_SNPRINTF(soap->tmpbuf + pos, sizeof(soap->tmpbuf) - pos, 4), "%%%02x", (int)((unsigned char)soap->proxy_passwd[i])); pos += 3; } soap->tmpbuf[pos] = '\0'; curl_easy_setopt(data->curl, CURLOPT_PROXYUSERPWD, (void*)soap->tmpbuf); } } } soap->omode &= ~SOAP_IO; /* reset IO modes */ soap->omode |= SOAP_IO_BUFFER; /* buffer the output */ soap->omode |= SOAP_ENC_PLAIN; /* no HTTP headers */ soap->omode &= ~SOAP_ENC_ZLIB; /* store data sent by engine in an isolated blist */ if (!(data->lst = soap_alloc_block(soap))) return soap->error; soap->blist = soap->blist->next; /* activate callbacks */ data->active = 1; return SOAP_OK; } /** @fn int soap_curl_send_callback(struct soap *soap, const char *buf, size_t len) @brief The fsend callback invokes this function to override sending data by saving in a blist. @param soap context @param buf data to send @param len number of bytes to send @return SOAP_OK or error code */ static int soap_curl_send_callback(struct soap *soap, const char *buf, size_t len) { struct soap_curl_data *data = (struct soap_curl_data*)soap_lookup_plugin(soap, soap_curl_id); char *blk; DBGFUN1("soap_curl_send_callback", "len=%zu", len); if (!data) return soap->error = SOAP_PLUGIN_ERROR; if (!data->active) return data->fsend(soap, buf, len); if (!data->curl || !data->lst) return soap->error = SOAP_PLUGIN_ERROR; if (len > 0) { blk = (char*)soap_push_block(soap, data->lst, len); if (!blk) return soap->error; (void)soap_memcpy((void*)blk, len, (const void*)buf, len); } return SOAP_OK; } /** @fn int soap_curl_prepare_init_recv_callback(struct soap *soap) @brief The fprepareinitrecv callback invokes this function to override the start of receiving data and ending of sending. @param soap context @return SOAP_OK or error code */ static int soap_curl_prepare_init_recv_callback(struct soap *soap) { struct soap_curl_data *data = (struct soap_curl_data*)soap_lookup_plugin(soap, soap_curl_id); long status; const char *s = NULL; CURLcode res; DBGFUN("soap_curl_prepare_init_recv_callback"); if (!data || !data->curl) return soap->error = SOAP_PLUGIN_ERROR; if (!data->active || !data->lst) { if (data->fprepareinitrecv) return data->fprepareinitrecv(soap); return SOAP_OK; } if ((data->mode & SOAP_IO) == SOAP_IO_CHUNK) { /* HTTP chunking mode was set with soap_init1() */ data->hdr = curl_slist_append(data->hdr, "Transfer-Encoding: chunked"); if (!data->hdr) { soap->error = SOAP_EOM; return 0; } curl_easy_setopt(data->curl, CURLOPT_HTTPHEADER, data->hdr); } else { /* content length is the size of the message saved */ curl_easy_setopt(data->curl, CURLOPT_POSTFIELDSIZE, data->lst->size); } if ((data->mode & SOAP_ENC_ZLIB)) { /* enable all supported built-in compressions */ curl_easy_setopt(data->curl, CURLOPT_ACCEPT_ENCODING, ""); } data->hdr = curl_slist_append(data->hdr, "Expect:"); /* remove Expect: 100 */ if (data->hdr) { curl_easy_setopt(data->curl, CURLOPT_HTTPHEADER, (void*)data->hdr); res = curl_easy_perform(data->curl); curl_slist_free_all(data->hdr); data->hdr = NULL; if (res != CURLE_OK) return soap_sender_fault(soap, curl_easy_strerror(res), "origin: soap_curl plugin"); } curl_easy_getinfo(data->curl, CURLINFO_RESPONSE_CODE, &status); if (!curl_easy_getinfo(data->curl, CURLINFO_CONTENT_TYPE, &s) && s) soap->http_content = soap_strdup(soap, s); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "cURL HTTP response code %ld content type %s\n", status, s ? s : "")); soap->status = (int)status; if ((soap->status >= 200 && soap->status <= 299) /* OK, Accepted, etc */ || soap->status == 400 /* Bad Request */ || soap->status == 500) /* Internal Server Error */ { if (data->fprepareinitrecv) return data->fprepareinitrecv(soap); return SOAP_OK; } /* read HTTP body for error details and return HTTP error */ return soap_set_receiver_error(soap, "HTTP Error", soap_http_get_body(soap, NULL), soap->status); } /** @fn int soap_curl_prepare_final_recv_callback(struct soap *soap) @brief The fpreparefinalrecv callback resets the recv callback. @param soap context @return SOAP_OK or error code */ static int soap_curl_prepare_final_recv_callback(struct soap *soap) { struct soap_curl_data *data = (struct soap_curl_data*)soap_lookup_plugin(soap, soap_curl_id); DBGFUN("soap_curl_prepare_final_recv_callback"); if (!data) return soap->error = SOAP_PLUGIN_ERROR; /* deactivate callbacks */ data->active = 0; if (data->fpreparefinalrecv) return data->fpreparefinalrecv(soap); return SOAP_OK; } /** @fn size_t soap_curl_recv_callback(struct soap *soap, char *buf, size_t size) @brief The frecv callback invokes this function to override receiving data that is stored in a blist. @param soap context @param buf receive in this buffer @param size buffer size @return number of bytes read, 0 for end or error */ static size_t soap_curl_recv_callback(struct soap *soap, char *buf, size_t size) { struct soap_curl_data *data = (struct soap_curl_data*)soap_lookup_plugin(soap, soap_curl_id); size_t len; DBGFUN1("soap_curl_recv_callback", "size=%zu", size); if (!data) { soap->error = SOAP_PLUGIN_ERROR; return 0; } if (!data->active) return data->frecv(soap, buf, size); if (!data->lst) { long status; curl_easy_getinfo(data->curl, CURLINFO_RESPONSE_CODE, &status); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "cURL HTTP response code %ld\n", status)); soap->error = (int)status; return 0; } if (!data->blk) { data->ptr = data->blk = soap_first_block(data->soap, data->lst); if (!data->blk) { soap_end_block(soap, data->lst); data->lst = NULL; return 0; } } len = soap_block_size(soap, data->lst) - (data->ptr - data->blk); if (len > size) len = size; (void)soap_memcpy((void*)buf, size, (const void*)data->ptr, len); data->ptr += len; if (data->ptr >= data->blk + soap_block_size(data->soap, data->lst)) { data->ptr = data->blk = soap_next_block(data->soap, data->lst); if (!data->blk) { soap_end_block(soap, data->lst); data->lst = NULL; } } soap->length += len; return len; } /******************************************************************************\ * * CURL callbacks * \******************************************************************************/ /** @fn size_t soap_curl_read_callback(void *buffer, size_t size, size_t nitems, void *ptr) @brief The CURL read callback invokes this function to read data to send. @param buffer read data into this buffer, buffer is size*nitems large. @param size @param nitems @param ptr points to soap_curl_data plugin data @return number of bytes read, 0 for end or error */ static size_t soap_curl_read_callback(void *buffer, size_t size, size_t nitems, void *ptr) { struct soap_curl_data *data = (struct soap_curl_data*)ptr; struct soap *soap = data->soap; size_t len; DBGFUN2("soap_curl_read_callback", "size=%zu", size, "nitems=%zu", nitems); if (!data->lst) return 0; if (!data->blk) { data->ptr = data->blk = soap_first_block(soap, data->lst); if (!data->blk) { soap_end_block(soap, data->lst); data->lst = NULL; return 0; } } len = soap_block_size(soap, data->lst) - (data->ptr - data->blk); if (len > size * nitems) len = size * nitems; (void)soap_memcpy((void*)buffer, size * nitems, (const void*)data->ptr, len); data->ptr += len; if (data->ptr >= data->blk + soap_block_size(soap, data->lst)) { data->ptr = data->blk = soap_next_block(soap, data->lst); if (!data->blk) { soap_end_block(soap, data->lst); data->lst = NULL; } } return len; } /** @fn size_t soap_curl_write_callback(void *buffer, size_t size, size_t nitems, void *ptr) @brief The CURL write callback invokes this function to write data that was received. @param buffer data to write of size*nitems bytes total. @param size @param nitems @param ptr points to soap_curl_data plugin data @return number of bytes written, 0 for error */ static size_t soap_curl_write_callback(void *buffer, size_t size, size_t nitems, void *ptr) { struct soap_curl_data *data = (struct soap_curl_data*)ptr; struct soap *soap = data->soap; size_t len = size * nitems; char *s; DBGFUN2("soap_curl_write_callback", "size=%zu", size, "nitems=%zu", nitems); if (!data->lst) { /* store data received in an isolated blist */ if (!(data->lst = soap_alloc_block(soap))) return 0; soap->blist = soap->blist->next; } s = (char*)soap_push_block(soap, data->lst, len); if (!s) return 0; (void)soap_memcpy((void*)s, len, buffer, len); return len; } #ifdef __cplusplus } #endif gsoap-2.8.91/gsoap/plugin/wsseapi.cpp0000644000175000017500000111063213525245161017062 0ustar ellertellert/* wsseapi.c WS-Security plugin gSOAP XML Web services tools Copyright (C) 2000-2016, 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-2016, 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 -------------------------------------------------------------------------------- */ /** @mainpage - @ref wsse documents the wsse plugin for WS-Security 1.0/1.1 support. - @ref smdevp documents the smdevp signature/digest engine. - @ref mecevp documents the mecevp encryption engine. - @ref threads documents a portable threads and locking API. */ /** @page wsse The WS-Security plugin [TOC] @section wsse_5 Security Header The material in this section relates to the WS-Security specification section 5. To use the wsse plugin: -# Run wsdl2h -t typemap.dat on a WSDL of a service that requires WS-Security headers. The typemap.dat file is used to recognize and translate Security header blocks for XML signature and encryption. -# Run soapcpp2 on the header file produced by wsdl2h. -# (Re-)compile stdsoap2.c/pp, dom.c/pp, smdevp.c, mecevp.c, wsseapi.c and the generated source files with the `-DWITH_DOM` and `-DWITH_OPENSSL` compiler flags set. The smdevp.c, mecevp.c, and wsseapi.c files are located in the 'plugin' directory. -# Use the wsse plugin API functions described below to add and verify Security headers, sign and verify messages, and to encrypt/decrypt messages. An example WS-Security client/server application can be found in gsoap/samples/wsse. Another example WS-Security client/server application that is designed to interoperate with WCF can be found in gsoap/samples/WCF/Basic/MessageSecurity. @warning The security token handler callback function parameters have changed in 2.8.34 and greater with the addition of KeyIdentifier information `keyid` and `keyidlen`. To register your own security token handler function with the plugin, make sure that your functions matches these function parameters: @code const void *security_token_handler(struct soap *soap, int *alg, const char *keyname, const unsigned char *keyid, int keyidlen, int *keylen); @endcode The wsse engine is thread safe. However, if HTTPS is required then please follow the instructions in Section @ref wsse_11 to ensure thread-safety of WS-Security with HTTPS. The wsse API code is implemented in: - `gsoap/plugin/wsseapi.h` wsse API declarations. - `gsoap/plugin/wsseapi.c` wsse API for C and C++. You will also need: - `gsoap/plugin/smdevp.c` compile and link this file (C and C++). - `gsoap/plugin/mecevp.c` compile and link this file (C and C++). - compile all sources with `-DWITH_OPENSSL -DWITH_DOM`. - if you have zlib installed, compile all sources also with `-DWITH_GZIP`. - link with `-lssl -lcrypto -lz -lgsoapssl++` (or `-lgsoapssl` for C, or compile `stdsoap2.cpp` for C++ and `stdsoap2.c` for C). The gSOAP header file (generated with wsdl2h, and containing the data binding interface for soapcpp2) should import wsse.h (or the older 2002 version wsse2.h): @code #import "wsse.h" @endcode The wsdl2h tool adds the necessary imports to the generated header file if the WSDL declares the use of WS-Security. If not, you may have to add the import manually before running soapcpp2. The wsse API consists of a set of functions to populate and verify WS-Security headers and message body content. For more details, we refer to the following sections that correspond to the WS-Security specification sections: - Section 6 @ref wsse_6 - Section 7 @ref wsse_7 - Section 8 @ref wsse_8 - Section 9 @ref wsse_9 - Section 10 @ref wsse_10 - @ref wsse_11 - @ref wsse_12 - @ref wsse_13 - @ref wsse_wsc The basic API is introduced below. To add an empty Security header block to the SOAP header, use: @code soap_wsse_add_Security(soap); @endcode To delete a Security header, use: @code soap_wsse_delete_Security(soap); @endcode Adding an empty Security header block is not very useful. In the following, we present the higher-level functions of the wsse plugin to populate and verify Security header content. @note The soap context includes an actor value soap.actor that is populated and rendered as the SOAP-ENV:actor (SOAP 1.1) or SOAP-ENV:role (SOAP 1.2) attribute in XML within the generic SOAP Header. The attribute is optional, but should be used to target a recipient such as an intermediate node to process the SOAP header. In contrast, actor or role attributes within Security header blocks target specific recipients to process the Security header block. The gSOAP implementation does not automate this feature and application should set and check the actor/role attribute when necessary. In addition, the current implementation supports the inclusion of a single Security header block in the SOAP header. To populate the SOAP-ENV:actor or SOAP-ENV:role attribute within the Security header, use: @code soap_wsse_add_Security_actor(soap, "recipient"); @endcode To obtain the actor or role value (e.g. after receiving a message), use: @code _wsse__Security *security = soap_wsse_Security(soap); if (security) { ... = security->SOAP_ENV__actor; // SOAP 1.1 ... = security->SOAP_ENV__role; // SOAP 1.2 @endcode The SOAP-ENV:mustUnderstand attribute is automatically added and checked by the gSOAP engine. A gSOAP application compiled without Security support will reject Security headers. Security header blocks are attached to the soap context, which means that the information will be automatically kept to support multiple invocations. @section wsse_6 Security Tokens The material in this section relates to the WS-Security specification section 6. @subsection wsse_6_2 User Name Tokens To add a user name token to the Security header block, use: @code soap_wsse_add_UsernameTokenText(soap, "Id", "username", NULL); @endcode The `Id` value is optional. When non-NULL the user name token is included in the digital signature to protect its integrity. It is common for the wsse plugin functions to accept such `Id`s, which are serialized as wsu:Id identifiers for cross-referencing XML elements. The signature engine of the wsse plugin is designed to automatically sign all wsu:Id attributed elements to simplify the code you need to write to implement the signing process. To add a user name token with clear text password, use: @code soap_wsse_add_UsernameTokenText(soap, "Id", "username", "password"); @endcode It is strongly recommended to use `soap_wsse_add_UsernameTokenText` only in combination with HTTPS encrypted transmission or not at all. A better alternative is to use password digests. With password digest authentication, the digest value of a password (with message creation time and a random nonce) is compared on both sides, thus eliminating the need to exchange a password over the wire. To add a user name token with password digest, use: @code soap_wsse_add_UsernameTokenDigest(soap, "Id", "username", "password"); @endcode Although the password string is passed to this function, it is not rendered in XML or stored in a message log. Only digests are compared on both sides, not the passwords. This authentication method adds a timestamp and nonce to prevent message replay attacks. It has been argued that this approach adopted by the WS-Security protocol is still vulnerable since the application retrieves the password in text form requiring a database to store passwords in clear text. However, a digest algorithm can be used to hash the passwords and store their digests instead, which eliminates the need to store clear-text passwords. This is a common approach adopted by Unix for decades. By setting the `Id` value to a unique string, the user name token is also digitally signed by the signature engine further preventing tampering with its value. You must use `soap_wsse_add_UsernameTokenDigest` for each message exchange to refresh the password digest even when the user name and password are not changed. Otherwise, the receiver might flag the message as a replay attack. To specify a time stamp for the digest instead of the current time, use: @code time_t when = ...; soap_wsse_add_UsernameTokenDigest_at(soap, "Id", "username", "password", when); @endcode Clear-text passwords and password digests are verified with `soap_wsse_verify_Password`. To verify a password at the receiving side to authorize a request (e.g. within a Web service operation), use: @code int ns__myMethod(struct soap *soap, ...) { const char *username = soap_wsse_get_Username(soap); const char *password; if (!username) { soap_wsse_delete_Security(soap); // remove old security headers return soap->error; // no username: return FailedAuthentication (from soap_wsse_get_Username) } password = ...; // lookup password of username if (soap_wsse_verify_Password(soap, password)) { int err = soap->error; soap_wsse_delete_Security(soap); // remove old security headers // if it is required to return signed faults, then add the following six lines here: if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0) { soap_wsse_delete_Security(soap); // remove security headers (failed construction) return soap->error; } return err; // password verification failed: return FailedAuthentication } ... // process request, then sign the response message: if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0) { soap_wsse_delete_Security(soap); // remove security headers (failed construction) return soap->error; } return SOAP_OK; } @endcode Note that the `soap_wsse_get_Username` functions sets the wsse:FailedAuthentication fault upon failure. It is common for the wsse plugin functions to return `SOAP_OK` or a wsse fault that should be passed to the sender by returning soap->error from service operations. The fault is displayed with the `soap_print_fault` function. To return signed faults back to the client, a signature is constructed as shown in the code snippet above. When the signature construction itself fails, we delete the partially constructed signature and return the fault to the client. Password digest authentication prevents message replay attacks. The wsse plugin keeps a database of password digests to thwart replay attacks. This is the only part in the plugin code that requires mutex provided by threads.h. Of course, this only works correctly if the server is persistent, such as a stand-alone service. Note that CGI-based services do not keep state. Machine clocks must be synchronized and clock skew should not exceed `SOAP_WSSE_CLKSKEW` at the server side. @subsection wsse_6_3 Binary Security Tokens X509 certificates are commonly included in Security header blocks as binary security tokens. A certificate is used to verify the digital signature of a digitally signed message using the public key embedded within the certificate. The certificate itself is signed by a certificate authority (CA) that vouches for the authenticity of the certificate, i.e. to prove the identify of the message originator. This verification process is important, because digital signatures are useless without verification: an attacker could simply replace the message, sign it, and replace the certificate. Certificates are automatically verified by the wsse plugin signature engine when received and accessed, which means that the certificates of the CAs must be made accessible to the wsse plugin as follows: @code soap->cafile = "cacerts.pem"; // use this soap->capath = "dir/to/certs"; // and/or point to CA certs soap->crlfile = "revoked.pem"; // use CRL (optional) @endcode The `soap_wsse_verify_X509` function checks the validity of a certificate. The check is automatically performed. The check is also performed when retrieving the certificate from a Security header block, either automatically by the wsse plugin's signature verification engine or manually as follows: @code X509 *cert = soap_wsse_get_BinarySecurityTokenX509(soap, "Id"); @endcode where `Id` is the identification string of the binary security token or NULL to get the first found in the Security header. The X509 certificate returned by this function should be freed with `X509_free` to deallocate the certificate data: @code if (cert) X509_free(cert); cert = NULL; @endcode The verification is an expensive process that will be optimized in future releases by caching the certificate chain. To attach a binary security token stored in a PEM file to a Security header block for transmission, use: @code soap_wsse_add_BinarySecurityTokenPEM(soap, NULL, "mycert.pem") @endcode A binary security token can be automatically signed by setting its `Id` attribute: @code soap_wsse_add_BinarySecurityTokenPEM(soap, "X509Token", "mycert.pem") @endcode Repeatedly loading a certificate from a PEM file is inefficient. To reuse a certificate loaded from a PEM file for multiple invocations, use: @code FILE *fd = fopen("mycert.pem", "r"); X509 *cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert)) ... // an error occurred @endcode Other types of binary security tokens can be added to the Security header block using: @code soap_wsse_add_BinarySecurityToken(soap, "Id", "valueType", data, datalen); @endcode @section wsse_6_4 SAML and Other Tokens The use and processing rules for tokens such as SAML assertions is specific to an application. SAML 1.0 and 2.0 tokens are supported with the following functions to retrieve them from Security header blocks: @code saml1__AssertionType *assertion1 = soap_wsse_get_saml1(soap); @endcode @code saml2__AssertionType *assertion2 = soap_wsse_get_saml2(soap); @endcode The pointers returned are non-NULL when these tokens are present. You can verify that a token is signed by the signature of the Security header with: @code saml2__AssertionType *assertion2 = soap_wsse_get_saml2(soap); if (!assertion2 || soap_wsse_verify_element(soap, SOAP_NAMESPACE_OF_saml2, "Assertion") == 0) ... error // no Assertion or Assertion not signed by WS-Security signature (zero Assertion elements signed) @endcode If the SAML token received contains a signature and/or time range conditions then you should verify that the SAML token is valid after receiving it in a Security header block of a WS-Security message: @code if (saml2->saml2__Conditions) { time_t now = time(NULL); if (saml2->saml2__Conditions->NotBefore && *saml2->saml2__Conditions->NotBefore > now) ... error // not valid yet if (saml2->saml2__Conditions->NotOnOrAfter && *saml2->saml2__Conditions->NotOnOrAfter <= now) ... error // expired } if (saml2->ds__Signature) if (soap_wsse_verify_with_signature(soap, saml2->ds__Signature)) ... error // Assertion has signature but token is invalid @endcode The above assumes that a WS-Security message was received that was signed and decrypted (when applicable). @note The resolution of the dateTime values of `NotBefore` and `NotOnOrAfter` is determined by the clock resolution of `time_t`, which is usually seconds. To increase the resolution, edit `gsoap/import/saml2.h` and add `#import "custom/struct_timeval.h"`. Then replace `time_t` in `gsoap/import/saml2.h` with `xsd__dateTime` to use `struct timeval`, which includes the time in seconds `tv_sec` and a microsecond offset `tv_usec`. To add a SAML token to the WS-Security headers, use `soap_wsse_add_saml1(struct soap*, const char *id)` or `soap_wsse_add_saml2(struct soap*, const char *id)`: @code time_t now = time(NULL); saml1__AssertionType *assertion1 = soap_wsse_add_saml1(soap, "SAML1"); if (!assertion1) ... // error assertion1->IssueInstant = now; assertion1->Issuer = (char*)"MyCompany"; assertion1->saml1__Conditions = soap_new_saml1__ConditionsType(soap, -1); if (!assertion1->saml1__Conditions) ... // error // valid from now for up to one hour assertion1->saml1__Conditions->NotBefore = soap_new_dateTime(soap, -1) if (!assertion1->saml1__Conditions->NotBefore) ... // error *assertion1->saml1__Conditions->NotBefore = now; assertion1->saml1__Conditions->NotOnOrAfter = soap_new_dateTime(soap, -1) if (!assertion1->saml1__Conditions->NotOnOrAfter) ... // error *assertion1->saml1__Conditions->NotOnOrAfter = now + 3600; ... @endcode and, respectively: @code time_t now = time(NULL); saml2__AssertionType *assertion2 = soap_wsse_add_saml2(soap, "SAML2"); if (!assertion2) ... // error assertion2->IssueInstant = now; assertion2->saml2__Issuer = (struct saml2__NameIDType*)soap_malloc(soap, sizeof(struct saml2__NameIDType)); soap_default_saml2__NameIDType(soap, assertion2->saml2__Issuer); assertion2->saml2__Issuer->__item = (char*)"MyCompany"; // valid from now for up to one hour assertion2->saml2__Conditions->NotBefore = soap_new_dateTime(soap, -1) if (!assertion2->saml2__Conditions->NotBefore) ... // error *assertion2->saml2__Conditions->NotBefore = now; assertion2->saml2__Conditions->NotOnOrAfter = soap_new_dateTime(soap, -1) if (!assertion2->saml2__Conditions->NotOnOrAfter) ... // error *assertion2->saml2__Conditions->NotOnOrAfter = now + 3600; ... @endcode The code shown above adds an empty SAML token to the Security header block after which the SAML assertion issuer, subject, conditions, statements, and attributes should be set. Once these are set, the assertion can be signed with a ds:Signature and X509 certificate added to the assertion to create an enveloped signature: @code EVP_PKEY *rsa_private_key; // private key X509 *cert; // certificate (e.g. in "cacert.pem") ... saml2__AssertionType *assertion2 = soap_wsse_add_saml2(soap, "SAML2"); if (!assertion2) ... // error ... // set SAML issuer, subject, conditions, statements, and attributes if (soap_wsse_sign_saml2(soap, assertion2, SOAP_SMD_SIGN_RSA_SHA256, private_key, 0, cert)) ... error // could not sign and/or add cert to X509Data soap->cafile = "cacert.pem"; // file that contains the public certificate if (soap_wsse_verify_saml2(soap, assertion2)) ... error // coult not verify the signature, e.g. invalid key-certificate pair @endcode It is a good habit to verify a SAML token that was created in memory with `int soap_wsse_verify_saml1(struct soap*, saml1__AssertionType *saml1)` or `int soap_wsse_verify_saml2(struct soap*, saml2__AssertionType *saml2)` as shown. This step is optional, but can be useful to detect if the private key and certificate are uncorrelated and should not be used. The private key and certificate values can be obtained as shown in Section @ref wsse_8_2a. For implementing other types of tokens, you are encouraged to modify the import/wsse.h file to add more tokens to the `_wsse__Security` header block: @code struct somens__SomeTokenType { @char *wsu__Id; ... }; typedef struct _wsse__Security { ... struct saml1__AssertionType* saml1__Assertion; struct saml2__AssertionType* saml2__Assertion; struct somens__SomeTokenType* somens__SomeToken; // added an optional token ... // add more if needed @char* SOAP_ENV__actor; @char* SOAP_ENV__role; } _wsse__Security; @endcode The tokens can be set with: @code _wsse__Security *security = soap_wsse_Security(soap); security->somens__SomeToken = (struct somens__SomeTokenType*)soap_malloc(soap, sizeof(struct somens__SomeTokenType)); soap_default_somens__SomeTokenType(soap, security->somens__SomeToken); security->somens__SomeToken->wsu__Id = "myToken"; // allows for auto-signing this element ... @endcode For tokens in DOM XML form, use the `xsd__anyType` DOM element: @code typedef struct _wsse__Security { ... xsd__anyType* somens__SomeToken; // added an optional token in DOM form } _wsse__Security; @endcode The token in DOM form can be signed if you set the wsu:Id attribute to a unique value say "MyToken": @code _wsse__Security *security = soap_wsse_Security(soap); security->somens__SomeToken = (xsd__anyType*)soap_malloc(soap, sizeof(xsd__anyType)); soap_default_xsd__anyType(soap, security->somens__SomeToken); soap_att_text(soap_att(soap_add_security->somens__SomeToken, NULL, "wsu:Id"), "MyToken"); ... @endcode We recommend to use [domcpp](http://www.genivia.com/doc/dom/html/index.html) to generate code to set the token to send messages and get its values after receiving messages. For tokens in XML "string" text form, use the `_XML` literal string (a `char*` type with XML content): @code typedef struct _wsse__Security { ... _XML somens__SomeToken; // added an optional token in string form } _wsse__Security; @endcode However, beware that XML text cannot be signed by the signature as a Security header (unless you embed it within a new element in the Security header block and set that element's wsu:Id attribute). @section wsse_7 Token References The material in this section relates to the WS-Security specification section 7. To use a certificate for signature verification, add a direct security token reference URI for the token to the KeyInfo, for example: @code soap_wsse_add_KeyInfo_SecurityTokenReferenceURI(soap, "URI", "valueType"); @endcode and: @code soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "URI"); @endcode For X509 certificates we use this to add a binary security token with the certificate and a reference to the local token: @code if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token")) ... // an error occurred @endcode This follows the recommended practice to place Security token references in the KeyInfo element of a Signature. The KeyInfo is used to verify the validity of a signature value. Key identifiers can be used as well: @code soap_wsse_add_KeyInfo_SecurityTokenReferenceKeyIdentifier(soap, "Id", "valueType", data, datalen); @endcode Embedded references are added with: @code soap_wsse_add_KeyInfo_SecurityTokenReferenceEmbedded(soap, "Id", "valueType"); @endcode Full support for embedded references requires coding to add tokens and assertions, as well as to consume embedded references at the receiving side. There is no automated mechanism to take the embedded references and process them accordingly. The use of key names is not recommended, but in case they are required they can be added with: @code soap_wsse_add_KeyInfo_KeyName(soap, "name"); @endcode @section wsse_8 Signatures The material in this section relates to the WS-Security specification section 8. The wsse plugin must be registered to sign and verify messages: @code soap_register_plugin(soap, soap_wsse); @endcode XML signatures are usually computed over normalized XML (to ensure the XML processors of intermediate nodes can accurately reproduce the XML). To this end, the exclusive canonical XML standard (exc-c14n) is required, which is set using the `SOAP_XML_CANONICAL` flag: @code struct soap *soap = soap_new1(SOAP_XML_CANONICAL); soap_register_plugin(soap, soap_wsse); @endcode To send messages with inclusive canonicalization, in addition to the `SOAP_XML_CANONICAL` flag also use: @code soap_wsse_set_InclusiveNamespaces(soap, "*"); @endcode However, exclusive canonicalization is recommended over inclusive canonicalization, or no canonicalization at all. WS Basic Security profile 1.0 requires exclusive canonicalization. Flags to consider: - `SOAP_XML_CANONICAL` recommended to enable exc-c14n (exclusive canonicalization). - `SOAP_XML_INDENT` optional, to emit more readable XML (see warning below). - `SOAP_IO_CHUNK` efficient HTTP-chunked streaming messages. - `SOAP_ENC_GZIP` for HTTP compression (also enables HTTP chunking). @warning Interoperability with WCF WS-Security is not guaranteed when `SOAP_XML_INDENT` is enabled. Avoid using `SOAP_XML_INDENT` for interoperability. The implementation of canonicalization in WCF with respect to the normalization of white space between XML tags differs from the protocol standards. Next, decide which signature algorithm is appropriate to use: - HMAC-SHA uses a secret key (also known as a shared key in symmetric cryptography) to sign the SHA digest of the SignedInfo element. - DSA-SHA uses a DSA private key to sign the SHA digest of the SignedInfo element. - RSA-SHA uses a RSA private key to sign the SHA digest of the SignedInfo element. - ECDSA-SHA uses a Elliptic Curve DSA private key to sign the SHA digest of the SignedInfo element. HMAC-SHA is the simplest method, but relies on the fact that you have to make absolutely sure the key is kept secret on both the sending and receiving side. As long as the secret key is confidential, messages are securely signed. However, this is virtually impossible when exchanging messages with untrusted disparate parties. The advantage of HMAC-SHA is the speed by which messages are signed and verified. Algorithms HMAC SHA1, SHA256, and SHA512 are supported: - `SOAP_SMD_HMAC_SHA1` http://www.w3.org/2000/09/xmldsig#hmac-sha1 - `SOAP_SMD_HMAC_SHA224` http://www.w3.org/2001/04/xmldsig-more#hmac-sha224 - `SOAP_SMD_HMAC_SHA256` http://www.w3.org/2001/04/xmldsig-more#hmac-sha256 - `SOAP_SMD_HMAC_SHA384` http://www.w3.org/2001/04/xmldsig-more#hmac-sha384 - `SOAP_SMD_HMAC_SHA512` http://www.w3.org/2001/04/xmldsig-more#hmac-sha512 DSA-SHA and RSA-SHA rely on public key cryptography. In simplified terms, a message is signed using the (confidential!) private key. The public key is used to verify the signature. Since only the originating party could have used its private key to sign the message, the integrity of the message is guaranteed. Of course, we must trust the public key came from the originator (it is often included as an X509 certificate in the message). To this end, a trusted certificate authority should have signed the public key, thereby creating a X509 certificate that contains the public key and the identity of the message originator. The following DSA, RSA, and ECDSA algorithms are supported: - `SOAP_SMD_SIGN_DSA_SHA1` http://www.w3.org/2000/09/xmldsig#dsa-sha1 - `SOAP_SMD_SIGN_DSA_SHA256` http://www.w3.org/2000/09/xmldsig-more#dsa-sha256 - `SOAP_SMD_SIGN_RSA_SHA1` http://www.w3.org/2000/09/xmldsig#rsa-sha1 - `SOAP_SMD_SIGN_RSA_SHA224` http://www.w3.org/2001/04/xmldsig-more#rsa-sha224 - `SOAP_SMD_SIGN_RSA_SHA256` http://www.w3.org/2001/04/xmldsig-more#rsa-sha256 - `SOAP_SMD_SIGN_RSA_SHA384` http://www.w3.org/2001/04/xmldsig-more#rsa-sha384 - `SOAP_SMD_SIGN_RSA_SHA512` http://www.w3.org/2001/04/xmldsig-more#rsa-sha512 - `SOAP_SMD_SIGN_ECDSA_SHA1` http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha1 - `SOAP_SMD_SIGN_ECDSA_SHA224` http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha224 - `SOAP_SMD_SIGN_ECDSA_SHA256` http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256 - `SOAP_SMD_SIGN_ECDSA_SHA384` http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha384 - `SOAP_SMD_SIGN_ECDSA_SHA512` http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha512 An optional callback function can be passed to the plugin that is responsible for providing a certificate or key to the wsse engine to verify a signed message. For example, when a security token is absent from an DSA-SHA or RSA-SHA signed message then the only mechanism to automatically verify the signature is to let the callback produce a certificate: @code soap_register_plugin(soap, soap_wsse); soap_wsse_set_security_token_handler(soap, security_token_handler); const void *security_token_handler(struct soap *soap, int *alg, const char *keyname, const unsigned char *keyid, int keyidlen, int *keylen) { // Get the user name from UsernameToken in message const char *uid = soap_wsse_get_Username(soap); switch (*alg) { case SOAP_SMD_VRFY_DSA_SHA1: case SOAP_SMD_VRFY_DSA_SHA256: case SOAP_SMD_VRFY_RSA_SHA1: case SOAP_SMD_VRFY_RSA_SHA224: case SOAP_SMD_VRFY_RSA_SHA256: case SOAP_SMD_VRFY_RSA_SHA384: case SOAP_SMD_VRFY_RSA_SHA512: case SOAP_SMD_VRFY_ECDSA_SHA1: case SOAP_SMD_VRFY_ECDSA_SHA224: case SOAP_SMD_VRFY_ECDSA_SHA256: case SOAP_SMD_VRFY_ECDSA_SHA384: case SOAP_SMD_VRFY_ECDSA_SHA512: if (uid) { // Lookup uid to retrieve the X509 certificate to verify the signature const X509 *cert = ...; return (const void*)cert; } return NULL; // no certificate: fail case SOAP_SMD_HMAC_SHA1: case SOAP_SMD_HMAC_SHA224: case SOAP_SMD_HMAC_SHA256: case SOAP_SMD_HMAC_SHA384: case SOAP_SMD_HMAC_SHA512: if (uid) { // Lookup uid to retrieve the HMAC SHA key to verify the signature const void *key = ...; *alg = ...; *keylen = ...; return key; } return NULL; // no certificate: fail case SOAP_MEC_ENV_DEC_DES_CBC: case SOAP_MEC_ENV_DEC_AES128_CBC: case SOAP_MEC_ENV_DEC_AES192_CBC: case SOAP_MEC_ENV_DEC_AES256_CBC: case SOAP_MEC_ENV_DEC_AES512_CBC: // reserved for future use case SOAP_MEC_ENV_DEC_AES128_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_ENV_DEC_AES192_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_ENV_DEC_AES256_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_ENV_DEC_AES512_GCM: // GCM requires OpenSSL 1.0.2 or higher if (keyname) { // use this to get key or X509 certificate from a key store using the keyname value: // 1. keyname is set to the subject name of the certificate, if a // certificate is present in the SecurityTokenReference/KeyIdentifier // when ValueType is http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3 // 2. keyname is set to the string concatenation // "{X509IssuerName}#{X509SerialNumber}" of the X509IssuerName // and X509SerialNumber present in X509Data/X509IssuerSerial // 3. keyname is set to X509Data/X509SubjectName return ...; } else if (keyid) { // use this to get the key from a key store using the keyid[0..keyidlen-1]: // 1. keyid and keyidlen are set to the data in // SecurityTokenReference/KeyIdentifier when the ValueType is // http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509SubjectKeyIdentifier return ...; } break; case SOAP_MEC_DEC_DES_CBC: case SOAP_MEC_DEC_AES128_CBC: case SOAP_MEC_DEC_AES192_CBC: case SOAP_MEC_DEC_AES256_CBC: case SOAP_MEC_DEC_AES512_CBC: // reserved for future use case SOAP_MEC_DEC_AES128_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_DEC_AES192_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_DEC_AES256_GCM: // GCM requires OpenSSL 1.0.2 or higher` case SOAP_MEC_DEC_AES512_GCM: // GCM requires OpenSSL 1.0.2 or higher if (keyname) { // use the keyname to get the shared secret key associated for decryption *keylen = ... // length of the shared secret key return ...; } break; } return NULL; // fail } @endcode @warning The security token handler callback function parameters have changed in 2.8.34 and greater with the addition of KeyIdentifier information `keyid` and `keyidlen`. @subsection wsse_8_2a Signing Messages After the plugin is registered and a signature algorithm selected, the `soap_wsse_sign` function or the `soap_wsse_sign_body` function is used to initiate the signature engine to automatically sign outbound messages. The code to sign the SOAP Body of a message using HMAC-SHA1 is: @code static char hmac_key[16] = { 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00 }; struct soap *soap = soap_new1(SOAP_XML_CANONICAL); soap_register_plugin(soap, soap_wsse); if (soap_wsse_sign_body(soap, SOAP_SMD_HMAC_SHA1, hmac_key, sizeof(hmac_key)) ... // an error occurred else if (soap_call_ns__myMethod(soap, ...)) ... // a transmission error occurred @endcode The `hmac_key` above is some secret key you generated for the sending side and receiving side (don't use the one shown here). Instead of SHA1 above, you can also use the more secure SHA224, SHA256, SHA384 and SHA512 hashes. As always, use `soap_print_fault` to display the error message. To sign the body of an outbound SOAP message using RSA-SHA (DSA-SHA is similar), we include the X509 certificate with the public key as a BinarySecurityToken in the header and a KeyInfo reference to the token to let receivers use the public key in the certificate to verify the authenticity of the message: @code FILE *fd; EVP_PKEY *rsa_private_key; X509 *cert; struct soap *soap = soap_new1(SOAP_XML_CANONICAL); soap_register_plugin(soap, soap_wsse); fd = fopen("privkey.pem", "r"); rsa_private_key = PEM_read_PrivateKey(fd, NULL, NULL, "password"); fclose(fd); fd = fopen("cert.pem", "r"); X509 *cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0)) ... // an error occurred else if (soap_call_ns__myMethod(soap, ...)) ... // a transmission error occurred @endcode The private key and its certificate are often placed in the same file, see e.g. server.pem in the package. To summarize the signing process: -# Register the wsse plugin. -# Obtain an HMAC secret key or a DSA/RSA/ECDSA private key. -# For DSA or RSA, obtain the X509 certificate with the public key signed by a certificate authority. -# Add the X509 certificate as a BinarySecurityToken to the header. -# Add a KeyInfo BinarySecurityTokenReference. -# Invoke `soap_wsse_sign_body` and/or `soap_wsse_sign` with `soap_wsse_sign_only` to sign the message. -# Always check the function return values for errors. You don't want to produce and accept messages with an invalid Security headers. @subsection wsse_8_2b Signing Message Parts The `soap_wsse_sign_body` function signs the entire SOAP body but nothing else. If it is desirable to sign individual parts of a message the `soap_wsse_sign_only` and `soap_wsse_sign` functions should be used. All message parts with wsu:Id attributes are signed. These message parts should not be nested (nested elements will not be separately signed). By default, all and only those XML elements with wsu:Id attributes are signed. Therefore, the wsu:Id attribute values used in a message must be unique within the message. Although usually not required, the default signing rule can be overridden with the `soap_wsse_sign_only` function, see @ref wsse_8_3. For example, consider a transaction in which we only want to sign a contract in the SOAP Body. This allows us to modify the rest of the message or extract the contract in XML and pass it on with the signature. The gSOAP header file includes a myContract declaration: @code struct ns__myContract { @char* wsu__Id = "Contract"; char* name; char* title; char* terms; }; int ns__myMethod(struct ns__myContract agreement, bool* accepted); @endcode The default value of the wsu:Id is "Contract" so that we can instantiate the struct, automatically sign it, and send it as follows: @code struct ns__myContract contract; bool accept; soap_default_ns__myContract(soap, &contract); contract.name = ...; contract.title = ...; contract.terms = ...; if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0)) ... // an error occurred else if (soap_call_ns__myMethod(soap, contract, &accept)) ... // a transmission error occurred @endcode The above example shows a wsu:Id attribute embedded (hardcoded) in a struct. When it is not possible to add the `wsu__Id` member, for example when the type is a string instead of a struct, it is suggested to specify the XML element to be signed with the `soap_wsse_set_wsu_id(soap, "space-separated string of element names")`. Use it before each call or in the server operation (when returning XML data from a service operation). This lets the engine add wsu:Id="tag" attribute-value pair to the element's tag name. For example: @code soap_wsse_set_wsu_id(soap, "ns:myContract"); // ... soap_wsse_set_InclusiveNamespaces(soap, "ns xsd"); // QNames have 'ns' and 'xsd' values if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0)) ... // an error occurred soap_wsse_set_wsu_id(soap, NULL); // reset soap_wsse_set_InclusiveNamespaces(soap, NULL); // reset @endcode This code adds the wsu:Id="ns-myContract" to the ns:myContract element. Here, the `wsu__Id` value in the struct MUST NOT be set. Otherwise, two wsu:Id attributes are present which is invalid. Also, the element signed must be unique in the message. That is, there cannot be more than one matching element, otherwise the resulting signature is invalid. @note To reset the automatic wsu:Id attributes addition, pass NULL to `soap_wsse_set_wsu_id` as shown above. This is automatically performed when a new message is received (but not automatically in a sequence of one-way sends for example). @note It is generally known that QName content of elements and attribute values may lead to verification issues with exclusive canonicalization (`SOAP_XML_CANONICAL`), because XML processors may not recognize prefixes in such QName contexts as visually utilized. With QName content in elements and attributes and `SOAP_XML_CANONICAL` enabled, we should use `soap_wsse_set_InclusiveNamespaces(soap, "prefixlist")` to define which namespace prefixes (space-separated in the string) should be considered inclusive. For example, xsi:type attribute values are QNames with xsd types (and perhaps other types), meaning we should add "xsd" to the inclusive namespace prefix list with `soap_wsse_set_InclusiveNamespaces(soap, "xsd")` to ensure xsi:type="xsd:TYPE" attributes with QName content are properly signed and not susceptible to certain wrapping attacks. A quick way to include all prefixes in the signed contents and thereby thwart signature wrapping attacks is to use `soap_wsse_set_InclusiveNamespaces(soap, "+")`. @note When signing parts of the body as outlined above, use `soap_wsse_sign` (do NOT use `soap_wsse_sign_body`). @warning Do not attempt to sign an element with a wsu:Id that is a subelement of another element with a wsu:Id, that is, do not sign inner nested wsu:Id elements. The element that you will try to sign will not be canonicalized and will lead to a failure of the signature verification. When elements with wsu:Id are nested, sign the outermost element. We recommend to sign the entire SOAP Body using `soap_wsse_sign_body` and reserve the use of `soap_wsse_set_wsu_id` for SOAP Header elements, such as WS-Addressing elements. For example, to add and sign WS-Addressing 2005 headers (which are activated with an `#import "wsa5.h"` in the header file for soapcpp2): @code #include "wsaapi.h" #include "wsseapi.h" soap_register_plugin(soap, soap_wsa); soap_register_plugin(soap, soap_wsse); ... soap_wsse_set_wsu_id(soap, "wsa5:From wsa5:To wsa5:ReplyTo wsa5:FaultTo wsa5:Action wsa5:MessageID"); if (soap_wsa_request(soap, RequestMessageID, ToAddress, RequestAction) || soap_wsa_add_From(soap, FromAddress) // optional: add a 'From' address || soap_wsa_add_FaultTo(soap, FaultToAddress)) ... // error: out of memory if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0)) ... // an error occurred else if (soap_call_ns__myMethod(soap, ...)) ... // a transmission error occurred soap_wsse_set_wsu_id(soap, NULL); @endcode This code signs the wsa5 header elements that are set with `soap_wsa_request`, see the WS-Addressing "wsa" API in the gSOAP documentation for more information on the use of WS-Addressing). It is fine to specify more elements with `soap_wsse_set_wsu_id` than actually present in the XML payload. The other WS-Addressing headers are not present and are not signed. If your are using WS-Addressing 2004 (which is activated with an `#import "wsa.h"` in the header file for soapcpp2) then change one line: @code soap_wsse_set_wsu_id(soap, "wsa:From wsa:To wsa:ReplyTo wsa:FaultTo wsa:Action wsa:MessageID"); @endcode @note `soap_wsse_set_wsu_id` should only be set once for each `soap_wsse_sign` or `soap_wsse_sign_body`. Each new call overrides the previous setting. @warning Never use `soap_wsse_set_wsu_id` to set the wsu:Id for an element that occurs more than once in the payload, since each will have the same wsu:Id attribute that may lead to a WS-Signature failure. @subsection wsse_8_3 Signing Security Headers and Tokens To sign security tokens such as user names, passwords, and binary security tokens, just assign their Id values with a unique string, such as "Time" for timestamps and "User" for user names. For example: @code soap_wsse_add_Timestamp(soap, "Time", 600); soap_wsse_add_UsernameTokenDigest(soap, "User", "username", "password"); ... // the rest of the signing code @endcode Note that by default all wsu:Id-attributed elements are signed. To filter a subset of wsu:Id-attributed elements for signatures, use the `soap_wsse_sign_only` function to specify a subset of the elements that have wsu:Id values as follows: @code soap_wsse_add_Timestamp(soap, "Time", 600); soap_wsse_add_UsernameTokenDigest(soap, "User", "username", "password"); soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert); soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token"); soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0); soap_wsse_sign_only(soap, "Time User Body"); // OK to use after soap_wsse_sign_body @endcode The wsu:Id values are provides with the `add` functions, such as "User" and "X509Token". The SOAP Body always has a wsu:Id value "Body" when `soap_wsse_sign_body` is used. Note that in the above we MUST set the X509Token name for cross-referencing with a wsu:Id, which normally results in automatically signing that token unless filtered out with `soap_wsse_sign_only`. The SOAP Body wsu:Id is always "Body" and should be part of the `soap_wsse_sign_only` set of wsu:Id names to sign. When using `soap_wsse_set_wsu_id` we need to use the tag name with `soap_wsse_sign_only`. For example: @code soap_wsa_request(soap, RequestMessageID, ToAddress, RequestAction); soap_wsse_set_wsu_id(soap, "wsa5:To wsa5:From wsa5:ReplyTo wsa5:Action"); soap_wsse_add_UsernameTokenDigest(soap, "User", "username", "password"); soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert); soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token"); soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0); soap_wsse_sign_only(soap, "wsa5:To wsa5:From wsa5:ReplyTo wsa5:Action User Body"); @endcode @note `soap_wsse_sign_only` should only be set once for each `soap_wsse_sign` or `soap_wsse_sign_body`. Each new call overrides the previous. @note To reset the filtering of signed tokens and elements, pass NULL to `soap_wsse_sign_only`. This is automatically performed when a new message is received (but not automatically in a sequence of one-way sends for example). @subsection wsse_8_4 Signature Validation To automatically verify the signature of an inbound message signed with DSA or RSA algorithms, assuming the message contains the X509 certificate as a binary security token, use: @code struct soap *soap = soap_new1(SOAP_XML_CANONICAL); soap_register_plugin(soap, soap_wsse); soap_wsse_verify_auto(soap, SOAP_SMD_NONE, NULL, 0); soap->cafile = "cacerts.pem"; // file with CA certs of peers soap->capath = "dir/to/certs"; // and/or point to CA certs directory soap->crlfile = "revoked.pem"; // use CRL (optional) // server: if (soap_serve(soap)) ... // an error occurred // client: if (soap_call_ns__myMethod(soap, ...)) ... // an error occurred @endcode All locally referenced and signed elements in the signed message will be verified with `soap_wsse_verify_auto` using the default settings set with `SOAP_SMD_NONE`. Elements that are not signed cannot be verified. Also elements referenced with absolute URIs that are not part of the message are not automatically verified. The received message is stored in a DOM accessible with soap->dom. This enables further analysis of the message content. For a post-parsing check to verify if an XML element was signed in an inbound message, use: @code soap_wsse_verify_auto(soap, SOAP_SMD_NONE, NULL, 0); soap->cafile = "cacerts.pem"; // file with CA certs of peers soap->capath = "dir/to/certs"; // and/or point to CA certs directory soap->crlfile = "revoked.pem"; // use CRL (optional) ... // client call if (soap_wsse_verify_element(soap, "namespaceURI", "tag") == 1) ... // only one element with matching tag and namespace is signed @endcode The `soap_wsse_verify_element` function returns the number of matching elements signed. The signed element nesting rules are obeyed, so if the matching element is a descendent of a signed element, it is signed as well. Because it is a post check, a client should invoke `soap_wsse_verify_element` after the call completed. A service should invoke this function within the service operation routine, i.e. when the message request is accepted and about to be processed. For example, to check whether the wsu:Timestamp element was signed, e.g. after checking that it is present and message expiration checked with `soap_wsse_verify_Timestamp`, use: @code if (!soap_wsse_verify_Timestamp(soap)) { soap_wsse_delete_Security(soap); ... // error } else if (soap_wsse_verify_element(soap, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "Timestamp") > 0) ... // timestamp was signed @endcode To check the SOAP Body (either using SOAP 1.1 or 1.2), simply use `soap_wsse_verify_body`. The `soap_wsse_verify_auto` function keeps processing signed (and unsigned) messages as they arrive. For unsigned messages this can be expensive and the verification engine should be shut down using `soap_wsse_verify_done`. There can be two problems with signature verification. First, some WS-Security implementations include SignedInfo/Reference/@URI without targeting an element, which will produce an error that a Reference URI target does not exist. To ignore these references, use `SOAP_WSSE_IGNORE_EXTRA_REFS`. Second, certificates provided by the peer are not verifiable unless the signing CA certificate is included in the cafile or capath. To disable peer certificate verification, set the fsslverify callback to return 1 as follows: @code static int ssl_verify(int ok, X509_STORE_CTX *store) { // put certificate verification here, return 0 when fails 1 when ok return 1; } ... soap_wsse_verify_auto(soap, SOAP_SMD_NONE | SOAP_WSSE_IGNORE_EXTRA_REFS, NULL, 0); soap->cafile = "cacerts.pem"; // file with CA certs of peers soap->capath = "dir/to/certs"; // and/or point to CA certs directory soap->crlfile = "revoked.pem"; // use CRL (optional) soap->fsslverify = ssl_verify; // set certificate verification callback @endcode To reject peer certificates under all conditions except specific permitted conditions such as self-signed certificates in the chain, use the following code as a guide (see OpenSSL documentation on `X509_STORE_CTX_get_error`): @code static int ssl_verify(int ok, X509_STORE_CTX *store) { if (!ok) { char buf[1024]; int err = X509_STORE_CTX_get_error(store); X509 *cert = X509_STORE_CTX_get_current_cert(store); switch (err) { case X509_V_ERR_CERT_NOT_YET_VALID: case X509_V_ERR_CERT_HAS_EXPIRED: case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: case X509_V_ERR_UNABLE_TO_GET_CRL: case X509_V_ERR_CRL_NOT_YET_VALID: case X509_V_ERR_CRL_HAS_EXPIRED: X509_STORE_CTX_set_error(store, X509_V_OK); ok = 1; break; default: fprintf(stderr, "SSL verify error %d or warning with certificate at depth %d: %s\n", err, X509_STORE_CTX_get_error_depth(store), X509_verify_cert_error_string(err)); X509_NAME_oneline(X509_get_issuer_name(cert), buf, sizeof(buf)-1); fprintf(stderr, " certificate issuer: %s\n", buf); X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)-1); fprintf(stderr, " certificate subject: %s\n", buf); } } return ok; } ... soap_wsse_verify_auto(soap, SOAP_SMD_NONE | SOAP_WSSE_IGNORE_EXTRA_REFS, NULL, 0); soap->cafile = "cacerts.pem"; // file with CA certs of peers soap->capath = "dir/to/certs"; // and/or point to CA certs directory soap->crlfile = "revoked.pem"; // use CRL (optional) soap->fsslverify = ssl_verify; @endcode To verify the HMAC signature of an inbound message, the HMAC key must be supplied: @code static char hmac_key[16] = // the same secret key that was used to sign { 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00 }; struct soap *soap = soap_new1(SOAP_XML_CANONICAL); soap_register_plugin(soap, soap_wsse); soap_wsse_verify_auto(soap, SOAP_SMD_HMAC_SHA1, hmac_key, sizeof(hmac_key)); soap->cafile = "cacerts.pem"; // file with CA certs of peers soap->capath = "dir/to/certs"; // and/or point to CA certs directory soap->crlfile = "revoked.pem"; // use CRL (optional) // server: if (soap_serve(soap)) ... // an error occurred // client: if (soap_call_ns__myMethod(soap, ...)) ... // an error occurred @endcode To summarize the signature verification process: -# Register the wsse plugin. -# For HMAC, obtain the HMAC secret key -# Use `soap_wsse_verify_auto` to verify inbound messages. -# Set the cafile (or capath) to verify certificates of the peers and crlfile (optional) -# After receiving a message, the DOM in soap->dom can be traversed for further analysis. -# Always check the function return values for errors. You don't want to accept a request or response message with an invalid Security header. -# Use `soap_wsse_verify_done` to terminate verification, e.g. to consume plain messages more efficiently. @section wsse_9 Encryption The material in this section relates to the WS-Security specification section 9. The wsse plugin must be registered: @code struct soap *soap = soap_new1(SOAP_XML_CANONICAL); soap_register_plugin(soap, soap_wsse); @endcode To send messages with inclusive canonicalization, in addition to the `SOAP_XML_CANONICAL` flag also use: @code soap_wsse_set_InclusiveNamespaces(soap, "*"); @endcode However, exclusive canonicalization is recommended over inclusive canonicalization, or no canonicalization at all. WS Basic Security profile 1.0 requires exclusive canonicalization. Flags to consider: - `SOAP_XML_CANONICAL` recommended to enable exc-c14n (exclusive canonicalization). - `SOAP_XML_INDENT` optional, to emit more readable XML (see warning). - `SOAP_IO_CHUNK` efficient HTTP-chunked streaming messages. - `SOAP_ENC_GZIP` for HTTP compression (also enables HTTP chunking). @warning Interoperability with WCF WS-Security is not guaranteed when `SOAP_XML_INDENT` is enabled. Avoid using `SOAP_XML_INDENT` for interoperability. The implementation of C14N in WCF with respect to the normalization of white space between XML tags differs from the protocol standards. @subsection wsse_9_1 Encrypting Messages Encryption should be used in combination with signing. A signature ensures message integrity while encryption ensures confidentially. Encrypted messages can be tampered with unless integrity is ensured. Therefore, the reader should be familiar with the material in Section @ref wsse_8 should to sign and verify message content. Messages are encrypted using either public key cryptography or by using a symmetric secret key. A symmetric secret key should only be shared between the sender and receiver (or any trusted communicating peer). Encryption with public key cryptography uses an "envelope" process, where the public key of the recipient is used to encrypt a temporary (ephemeral) secret key that is sent together with the secret key-encrypted message to the recipient. The recipient decrypts the ephemeral key and uses it to decrypt the message. The public key is usually part of a X509 certificate. The public key (containing the subject information) is added to the Security header and used for encryption of the SOAP Body as follows: @code X509 *cert = ...; // if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, NULL, NULL)) soap_print_fault(soap, stderr); @endcode `SOAP_MEC_ENV_ENC_DES_CBC` specifies envelope encoding with triple DES CBC and PKCS1 RSA-1_5. Use `(SOAP_MEC_ENV_ENC_AES256_CBC | SOAP_MEC_OAEP)` for AES256 CBC with OAEP padding (OAEP is recommended over RSA-1_5 or use GCM). The envelope encryption options are: - `SOAP_MEC_ENV_ENC_DES_CBC` RSA-1_5 envelope encryption with triple DES CBC - `SOAP_MEC_ENV_ENC_AES256_CBC` RSA-1_5 envelope encryption with AES256 CBC - `SOAP_MEC_ENV_ENC_AES256_GCM` envelope authenticated encryption with AES256 GCM - `SOAP_MEC_ENV_ENC_AES256_CBC | SOAP_MEC_OAEP` OAEP envelope encryption with AES256 CBC where, in the above, AES256 can also be replaced with AES128 or AES192. The "Cert" parameter is a unique URI to reference the key from the encrypted SOAP Body. The above enables the encryption engine for the next message to be sent, either at the client or server side. The server should use this withing a server operation (before returning) to enable the service operation response to be encrypted. To include a subject key ID in the Security header instead of the entire public key, specify the subject key ID parameter: @code X509 *cert = ...; // if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, "Subject Key ID", NULL, NULL)) soap_print_fault(soap, stderr); @endcode The difference with the previous example where no subject key ID was specified is that the Security header only contains the subject key ID and no longer the public key in base64 format. To exclude the encrypted key certificate from the message and include a X509Data element with IssuerName and SerialNumber: @code X509 *cert = ...; if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, "CN=Root Agency", "-79441640260855276448009124614332182350")) soap_print_fault(soap, stderr); @endcode The issuer name and serial number (must be in decimal for `soap_wsse_add_EncryptedKey`) of a certificate can be obtained as follows: @code X509 *cert = ...; BIGNUM *bn = BN_new(); char issuer[256], *serial; X509_NAME_oneline(X509_get_issuer_name(cert), issuer, sizeof(issuer)-1); ASN1_INTEGER_to_BN(X509_get_serialNumber(cert), bn); serial = BN_bn2dec(bn); OPENSSL_free(bn); ... if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, issuer+1, serial)) soap_print_fault(soap, stderr); ... OPENSSL_free(serial); @endcode Note that in the above code the leading slash in "/CN=Root Agency" is excluded from the issuer name. When excluding the encrypted key certificate from the message, the token handler callback must be provided on the receiving end to obtain the certificate that corresponds to the issuer name and serial number. To encrypt specific elements of the SOAP Body rather than the entire SOAP Body, use `soap_wsse_add_EncryptedKey_encrypt_only` to specify elements to encrypt in combination with `soap_wsse_set_wsu_id` to specify these elements again as follows: @code X509 *cert = ...; // the SOAP Body contains one and one (not nested) soap_wsse_set_wsu_id(soap, "ns:myContract ns:myPIN"); if (soap_wsse_add_EncryptedKey_encrypt_only(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, NULL, NULL, "ns:myContract ns:myPIN")) soap_print_fault(soap, stderr); @endcode To encrypt the SOAP Body and SOAP Header element(s), such as ds:Signature, use "SOAP-ENV:Body" with `soap_wsse_add_EncryptedKey_encrypt_only` to specify these elements: @code X509 *cert = ...; soap_wsse_set_wsu_id(soap, "ds:Signature"); if (soap_wsse_add_EncryptedKey_encrypt_only(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, NULL, NULL, "ds:Signature SOAP-ENV:Body")) soap_print_fault(soap, stderr); @endcode @note The `soap_wsse_set_wsu_id` MUST be used to specify all element tag names to encrypt. Additional elements MAY be specified in `soap_wsse_set_wsu_id` (for example elements to digitally sign). You do not have to use this function to set the wsu:Id of the SOAP Body which always has a wsu:Id with "Body". @note The elements identified by the tag names in `soap_wsse_set_wsu_id` to encrypt MUST occur NO MORE THAN ONCE in the XML message. For symmetric encryption with a shared secret key, generate a 160-bit triple DES key and make sure both the sender and reciever can use the key without it being shared by any other party (key exchange problem). Then use the `soap_wsse_encrypt_body` function to encrypt the SOAP Body as follows: @code char des_key[20] = ...; // 20-byte (160-bit) DES shared secret key if (soap_wsse_encrypt_body(soap, SOAP_MEC_ENC_DES_CBC, des_key, sizeof(des_key))) soap_print_fault(soap, stderr); @endcode The symmetric encryption options are: - `SOAP_MEC_ENC_DES_CBC` symmetric encryption with triple DES CBC - `SOAP_MEC_ENC_AES256_CBC` symmetric encryption with AES256 CBC - `SOAP_MEC_ENC_AES256_GCM` symmetric authenticated encryption with AES256 GCM where, in the above, AES256 can also be replaced with AES128 or AES192. For example, symmetric encryption with AES256: @code char aes256_key[32] = ...; // 32-byte (256-bit) AES256 shared secret key if (soap_wsse_encrypt_body(soap, SOAP_MEC_ENC_AES256_CBC, aes256_key, sizeof(aes256_key))) soap_print_fault(soap, stderr); @endcode To symmetrically encrypt specific elements of the SOAP Body rather than the entire SOAP Body, use `soap_wsse_encrypt_only` to specify the elements to encrypt in combination with `soap_wsse_set_wsu_id` to specify these elements again as follows: @code char des_key[20] = ...; // 20-byte (160-bit) secret key // the SOAP Body contains one and one (not nested) soap_wsse_set_wsu_id(soap, "ns:myContract ns:myPIN"); if (soap_wsse_encrypt_only(soap, SOAP_MEC_ENC_DES_CBC, des_key, sizeof(des_key), "ns:myContract ns:myPIN")) soap_print_fault(soap, stderr); @endcode @note The `soap_wsse_set_wsu_id` MUST be used to specify all element tag names to encrypt. Additional elements MAY be specified in `soap_wsse_set_wsu_id` (for example elements to digitally sign). @note The elements identified by the tag names in `soap_wsse_set_wsu_id` to encrypt MUST occur EXACTLY ONCE in the SOAP Body. @subsection wsse_9_2 Decrypting Message Parts The wsse engine automatically decrypts message parts, but requires a private key or secret shared key to do so. A default key can be given to enable decryption, but it will fail if a non-compatible key was used for encryption. In that case a token handler callback should be defined by the user to select a proper decryption key based on the available subject key name or identifier embedded in the encrypted message. An example of a token handler callback: @code soap_register_plugin_arg(soap, soap_wsse); soap_wsse_set_security_token_handler(soap, security_token_handler); const void *security_token_handler(struct soap *soap, int *alg, const char *keyname, const unsigned char *keyid, int keyidlen, int *keylen) { // Get the user name from UsernameToken in message const char *uid = soap_wsse_get_Username(soap); switch (*alg) { case SOAP_SMD_VRFY_DSA_SHA1: case SOAP_SMD_VRFY_DSA_SHA256: case SOAP_SMD_VRFY_RSA_SHA1: case SOAP_SMD_VRFY_RSA_SHA224: case SOAP_SMD_VRFY_RSA_SHA256: case SOAP_SMD_VRFY_RSA_SHA384: case SOAP_SMD_VRFY_RSA_SHA512: case SOAP_SMD_VRFY_ECDSA_SHA1: case SOAP_SMD_VRFY_ECDSA_SHA224: case SOAP_SMD_VRFY_ECDSA_SHA256: case SOAP_SMD_VRFY_ECDSA_SHA384: case SOAP_SMD_VRFY_ECDSA_SHA512: if (uid) { // Lookup uid to retrieve the X509 certificate to verify the signature const X509 *cert = ...; return (const void*)cert; } break; case SOAP_SMD_HMAC_SHA1: case SOAP_SMD_HMAC_SHA224: case SOAP_SMD_HMAC_SHA256: case SOAP_SMD_HMAC_SHA384: case SOAP_SMD_HMAC_SHA512: if (uid) { // Lookup uid to retrieve the HMAC SHA key to verify the signature const void *key = ...; *alg = ...; *keylen = ...; return key; } return NULL; // no certificate: fail case SOAP_MEC_ENV_DEC_DES_CBC: case SOAP_MEC_ENV_DEC_AES128_CBC: case SOAP_MEC_ENV_DEC_AES192_CBC: case SOAP_MEC_ENV_DEC_AES256_CBC: case SOAP_MEC_ENV_DEC_AES512_CBC: // reserved for future use case SOAP_MEC_ENV_DEC_AES128_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_ENV_DEC_AES192_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_ENV_DEC_AES256_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_ENV_DEC_AES512_GCM: // GCM requires OpenSSL 1.0.2 or higher if (keyname) { // use this to get the key or certificate from a key store using the keyname value: // 1. keyname is set to the subject name of the certificate, if a // certificate is present in the SecurityTokenReference/KeyIdentifier // when ValueType is http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3 // 2. keyname is set to the string concatenation // "{X509IssuerName}#{X509SerialNumber}" of the X509IssuerName // and X509SerialNumber present in X509Data/X509IssuerSerial // 3. keyname is set to X509Data/X509SubjectName return ...; } else if (keyid) { // use this to get the key from a key store using the keyid[0..keyidlen-1]: // 1. keyid and keyidlen are set to the data in // SecurityTokenReference/KeyIdentifier when the ValueType is // http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509SubjectKeyIdentifier return ...; } break; case SOAP_MEC_DEC_DES_CBC: case SOAP_MEC_DEC_AES128_CBC: case SOAP_MEC_DEC_AES192_CBC: case SOAP_MEC_DEC_AES256_CBC: case SOAP_MEC_DEC_AES512_CBC: // reserved for future use case SOAP_MEC_DEC_AES128_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_DEC_AES192_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_DEC_AES256_GCM: // GCM requires OpenSSL 1.0.2 or higher` case SOAP_MEC_DEC_AES512_GCM: // GCM requires OpenSSL 1.0.2 or higher if (keyname) { // use the keyname to get the shared secret key associated for decryption *keylen = ... // length of the shared secret key return ...; } break; } return NULL; // fail } @endcode The last two case-arms are used to return a key associated with the keyname paramater, which is a string that contains the subject key id from the public key information in an encrypted message or the subject key ID string that was set with `soap_wsse_add_EncryptedKey` at the sender side. @warning The security token handler callback function parameters have changed in 2.8.34 and greater with the addition of KeyIdentifier information `keyid` and `keyidlen`. To set the default private key for envelope decryption, use: @code EVP_PKEY *rsa_private_key = ...; soap_wsse_decrypt_auto(soap, SOAP_MEC_ENV_DEC_DES_CBC, rsa_private_key, 0); @endcode The envelope decryption options are: - `SOAP_MEC_ENV_DEC_DES_CBC` RSA-1_5 envelope decryption with triple DES CBC - `SOAP_MEC_ENV_DEC_AES256_CBC` RSA-1_5 envelope decryption with AES256 CBC - `SOAP_MEC_ENV_DEC_AES256_GCM` envelope authenticated decryption with AES256 GCM - `SOAP_MEC_ENV_DEC_AES256_CBC | SOAP_MEC_OAEP` OAEP envelope decryption with AES256 CBC where, in the above, AES256 can be replaced with AES128 or AES192. To set the default shared secret key for symmetric decryption, use: @code char des_key[20] = ...; // 20-byte (160-bit) triple DES key soap_wsse_decrypt_auto(soap, SOAP_MEC_DEC_DES_CBC, des_key, sizeof(des_key)); @endcode The symmetric decryption options are: - `SOAP_MEC_DEC_DES_CBC` symmetric decryption with triple DES CBC - `SOAP_MEC_DEC_AES256_CBC` symmetric decryption with AES256 CBC - `SOAP_MEC_DEC_AES256_GCM` symmetric authenticated decryption with AES256 GCM where, in the above, AES256 can be replaced with AES128 or AES192. For example, symmetric decryption with AES256: @code char aes256_key[32] = ...; // 32-byte (256-bit) AES256 key soap_wsse_decrypt_auto(soap, SOAP_MEC_DEC_AES256_CBC, aes256_key, sizeof(aes256_key)); @endcode If a default key is not set, the token handler callback should be used as discussed above in this section. Do NOT set a default key if a token handler is used to handle multiple different keys. The default key mechanism is simpler to use when only one decryption key is used to decrypt all encrypted messages. To remove the default key, use: @code soap_wsse_decrypt_auto(soap, SOAP_MEC_NONE, NULL, 0); @endcode @subsection wsse_9_3 Example Client and Server The code for a client is shown below that uses signatures and encryption: @code FILE *fd; EVP_PKEY *rsa_private_key; X509 *cert; // create new context with recommended C14N enabled struct soap *soap = soap_new1(SOAP_XML_CANONICAL); // register the plugin(s) soap_register_plugin(soap, soap_wsse); // enable peer certificate verification soap->cafile = "cacerts.pem"; // file with CA certs of peers soap->capath = "dir/to/certs"; // and/or point to CA certs directory soap->crlfile = "revoked.pem"; // use CRL (optional) soap->fsslverify = ssl_verify; // optional, a callback to verify peer certificates // get the private key for signing and decryption fd = fopen("privkey.pem", "r"); rsa_private_key = PEM_read_PrivateKey(fd, NULL, NULL, "password"); fclose(fd); // get the certificate to include in the security header fd = fopen("cert.pem", "r"); X509 *cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); // enable decryption with the private key soap_wsse_decrypt_auto(soap, SOAP_MEC_ENV_DEC_DES_CBC, rsa_private_key, 0); // enable signature verification soap_wsse_verify_auto(soap, SOAP_SMD_NONE, NULL, 0); // add the certificate X509 token and token reference, sign the Body using the private key if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0)) ... // an error occurred // encrypt the Body and the signature using the public key in cert (the cert of the peer) soap_wsse_set_wsu_id(soap, "ds:Signature"); if (soap_wsse_add_EncryptedKey_encrypt_only(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, NULL, NULL, "ds:Signature SOAP-ENV:Body")) ... // an error occurred if (soap_call_ns__myMethod(soap, ...)) ... // a transmission error occurred ... EVP_PKEY_free(rsa_private_key); X509_free(cert); @endcode When using HTTPS, the `soap->cafile`, `soap->capath` are already set with `soap_ssl_client_context()`. The explicit assignments shown above are not needed. See @ref wsse_8_4 on how to implement the optional `ssl_verify` callback to verify peer certificates. You may want to register a token handler callback if the peer does not include its X509 certificate in the security header. The token handler callback should retrieve the certificate, e.g. given its id and serial number. The server-side service is implemented as follows: @code EVP_PKEY *rsa_private_key; // OK to declare global X509 *cert; // OK to declare global .. FILE *fd; // create new context with recommended C14N enabled struct soap *soap = soap_new1(SOAP_XML_CANONICAL); // register the plugin(s) soap_register_plugin(soap, soap_wsse); // enable peer certificate verification soap->cafile = "cacerts.pem"; // file with CA certs of peers soap->capath = "dir/to/certs"; // and/or point to CA certs directory soap->crlfile = "revoked.pem"; // use CRL (optional) soap->fsslverify = ssl_verify; // optional, a callback to verify peer certificates // get the private key for signing and decryption fd = fopen("privkey.pem", "r"); rsa_private_key = PEM_read_PrivateKey(fd, NULL, NULL, "password"); fclose(fd); // get the certificate to include in the security header fd = fopen("cert.pem", "r"); X509 *cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); ... if (!soap_valid_socket(soap_bind(soap, NULL, port, 100))) ... // an error occurred while (soap_valid_socket(soap_accept(soap))) { // enable signature verification soap_wsse_verify_auto(soap, SOAP_SMD_NONE, NULL, 0); // enable decryption with the private key soap_wsse_decrypt_auto(soap, SOAP_MEC_ENV_DEC_DES_CBC, rsa_private_key, 0); // serve one request if (soap_serve(soap)) { soap_wsse_delete_Security(soap); soap_print_fault(soap, stderr); } } ... EVP_PKEY_free(rsa_private_key); X509_free(cert); @endcode where an example service operation could be: @code int ns__myMethod(struct soap *soap, ...) { ... // remove old security headers soap_wsse_delete_Security(soap); // encrypt the Body and the signature using the public key in cert (the cert of the peer) soap_wsse_set_wsu_id(soap, "ds:Signature"); // add the certificate X509 token and token reference, sign the Body using the private key // encrypt the Body and the signature using the public key in cert (the cert of the peer) if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0) || soap_wsse_add_EncryptedKey_encrypt_only(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, NULL, NULL, "ds:Signature SOAP-ENV:Body")) { soap_wsse_delete_Security(soap); // remove incomplete security headers return soap->error; } return SOAP_OK; } @endcode The service operation signs the Body using its private key and encrypts the response Body and signature using a public key from the peer's certificate. To implement a server that supports HTTP keep-alive, a `soap->fserveloop` callback function should be assigned. This callback is executed in the `soap_serve()` loop to call `soap_wsse_verify_auto()` and `soap_wsse_decrypt_auto()` to ensure that the continuous inbound message stream can be verified and decrypted: @code struct soap *soap = soap_new1(SOAP_XML_CANONICAL | SOAP_IO_KEEPALIVE); soap_register_plugin(soap, soap_wsse); ... soap->fserveloop = set_verify_decrypt_auto; ... while (soap_valid_socket(soap_accept(soap))) { set_verify_decrypt_auto(soap); // serve multiple requests (when keep alive) if (soap_serve(soap)) { soap_wsse_delete_Security(soap); soap_print_fault(soap, stderr); } } int set_verify_decrypt_auto(struct soap *soap) { // enable signature verification soap_wsse_verify_auto(soap, SOAP_SMD_NONE, NULL, 0); // enable decryption with the private key soap_wsse_decrypt_auto(soap, SOAP_MEC_ENV_DEC_DES_CBC, rsa_private_key, 0); return SOAP_OK; } @endcode @section wsse_10 Security Timestamps The material in this section relates to the WS-Security specification section 10. To add a timestamp with the creation time to the Security header, use: @code soap_wsse_add_Timestamp(soap, NULL, 0); // 0 means no expiration @endcode The lifetime of a message (in seconds) is passed as the third argument, which will be displayed as the timestamp expiration time: @code soap_wsse_add_Timestamp(soap, NULL, 10); // 10 seconds lifetime @endcode Timestamps, like other header elements, are not automatically secured with a digital signature. To secure a timestamp, we add an identifier (wsu:Id) to each element we want the WS-Security plugin to sign thereby making it impossible for someone to tamper with that part of the message. To do this for the timestamp, we simply pass a unique identification string as the second argument: @code soap_wsse_add_Timestamp(soap, "Time", 10); // timestamp will be signed @endcode After receiving a message, the receiver can verify the presence and validity of the timestamp and whether it was signed with: @code if (!soap_wsse_verify_Timestamp(soap)) { soap_wsse_delete_Security(soap); ... // error, no timestamp or timestamp has expired } else if (soap_wsse_verify_element(soap, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "Timestamp") > 0) ... // timestamp was signed @endcode @section wsse_11 WS-Security and HTTPS HTTPS is used at the client side with the usual "https:" URL addressing, shown here with the registration of the wsse plugin and setting up locks for thread-safe use of SSL for HTTPS: @code #include "wsseapi.h" #include "threads.h" struct soap *soap; if (CRYPTO_thread_setup()) ... // error soap = soap_new1(SOAP_XML_CANONICAL); soap_register_plugin(soap, soap_wsse); if (soap_ssl_client_context(&soap, SOAP_SSL_DEFAULT, // requires server authentication NULL, // keyfile for client authentication to server NULL, // the keyfile password "cacerts.pem", // cafile CA certificates to authenticate the server NULL, // capath CA directory path to certificates NULL )) ... // error soap->cafile = "cacerts.pem"; // same as above (or overrides the above) soap->capath = "dir/to/certs"; // and/or point to CA certs soap->crlfile = "revoked.pem"; // use CRL (optional) ... // set up WS-Security for signatures/encryption etc if (soap_call_ns__myMethod(soap, "https://...", ...)) ... // error ... // process response results soap_destroy(soap); soap_end(soap); soap_free(soap); CRYPTO_thread_cleanup(); @endcode The CRYPTO threads should be set up before any threads are created. The `soap_ssl_client_context` only needs to be set up once. Use the following flags: - `SOAP_SSL_DEFAULT` requires server authentication, CA certs should be used - `SOAP_SSL_NO_AUTHENTICATION` disables server authentication - `SOAP_SSL_SKIP_HOST_CHECK` disables server authentication host check - `SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE` to accept self-signed certificates, expired certificates, and certificates without CRL. The server uses the following: @code #include "wsseapi.h" #include "threads.h" SOAP_SOCKET m, s; int port = 443; struct soap *soap; if (CRYPTO_thread_setup()) ... // error soap = soap_new1(SOAP_XML_CANONICAL); soap_register_plugin(soap, soap_wsse); if (soap_ssl_server_context(&soap, SOAP_SSL_DEFAULT, // requires server to authenticate, but not the client server.pem, // keyfile for authentication to client "password", // the keyfile password NULL, // CA certificates to authenticate the client NULL, // CA directory path to certificates NULL, // use RSA 2048 bits (or give file name with DH param) NULL, NULL )) ... // error if (!soap_valid_socket(m = soap_bind(soap, NULL, port, 100)) ... // error for (;;) { if (!soap_valid_socket(s = soap_accept(soap))) ... // error else { struct soap *tsoap = soap_copy(soap); while (THREAD_CREATE(&tid, (void*(*)(void*))&process_request, (void*)tsoap)) sleep(1); } } soap_destroy(soap); soap_end(soap); soap_free(soap); CRYPTO_thread_cleanup(); @endcode where we define a `process_request()` function that is executed by the thread to process the request (on a copy of the soap context struct): @code void *process_request(struct soap *soap) { ... // set up WS-Security for signatures/encryption etc if (soap_ssl_accept(soap) || soap_serve(soap)) ... // error soap_destroy(soap); soap_end(soap); soap_free(soap); } @endcode The `soap_ssl_server_context` only needs to be set up once. Use the following flags: - `SOAP_SSL_DEFAULT` requires server authentication, but no client authentication - `SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION` requires client authentication We also should implement the mutex setup and cleanup operations as follows: @code struct CRYPTO_dynlock_value { MUTEX_TYPE mutex; }; static MUTEX_TYPE *mutex_buf; static struct CRYPTO_dynlock_value *dyn_create_function(const char *file, int line) { struct CRYPTO_dynlock_value *value; value = (struct CRYPTO_dynlock_value*)malloc(sizeof(struct CRYPTO_dynlock_value)); if (value) MUTEX_SETUP(value->mutex); return value; } static void dyn_lock_function(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line) { if (mode & CRYPTO_LOCK) MUTEX_LOCK(l->mutex); else MUTEX_UNLOCK(l->mutex); } static void dyn_destroy_function(struct CRYPTO_dynlock_value *l, const char *file, int line) { MUTEX_CLEANUP(l->mutex); free(l); } void locking_function(int mode, int n, const char *file, int line) { if (mode & CRYPTO_LOCK) MUTEX_LOCK(mutex_buf[n]); else MUTEX_UNLOCK(mutex_buf[n]); } unsigned long id_function() { return (unsigned long)THREAD_ID; } int CRYPTO_thread_setup() { int i; mutex_buf = (MUTEX_TYPE*)malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t)); if (!mutex_buf) return SOAP_EOM; for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_SETUP(mutex_buf[i]); CRYPTO_set_id_callback(id_function); CRYPTO_set_locking_callback(locking_function); CRYPTO_set_dynlock_create_callback(dyn_create_function); CRYPTO_set_dynlock_lock_callback(dyn_lock_function); CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function); return SOAP_OK; } void CRYPTO_thread_cleanup() { int i; if (!mutex_buf) return; CRYPTO_set_id_callback(NULL); CRYPTO_set_locking_callback(NULL); CRYPTO_set_dynlock_create_callback(NULL); CRYPTO_set_dynlock_lock_callback(NULL); CRYPTO_set_dynlock_destroy_callback(NULL); for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_CLEANUP(mutex_buf[i]); free(mutex_buf); mutex_buf = NULL; } @endcode For additional details and examples, see the user guide and examples in the gSOAP package directory gsoap/samples/ssl. @section wsse_12 Miscellaneous The Security header block was generated from the WS-Security schema with the wsdl2h tool and WS/WS-typemap.dat: wsdl2h -cegxy -o wsse.h -t WS/WS-typemap.dat WS/wsse.xsd The same process was used to generate the header file ds.h from the XML digital signatures core schema, and the xenc.h encryption schema: wsdl2h -cuxy -o ds.h -t WS/WS-typemap.dat WS/ds.xsd wsdl2h -cuxy -o xenc.h -t WS/WS-typemap.dat WS/xenc.xsd The import/wsse.h file has the following definition for the Security header block: @code typedef struct _wsse__Security { struct _wsu__Timestamp* wsu__Timestamp; struct _wsse__UsernameToken* UsernameToken; struct _wsse__BinarySecurityToken* BinarySecurityToken; struct xenc__EncryptedKeyType* xenc__EncryptedKey; struct _xenc__ReferenceList* xenc__ReferenceList; struct ds__SignatureType* ds__Signature; @char* SOAP_ENV__actor; @char* SOAP_ENV__role; } _wsse__Security; @endcode The `_wsse__Security` header is modified by a WS/WS-typemap.dat mapping rule to include additional details. @section wsse_13 Some Limitations - Encryption of simple content (CDATA content) directly with `soap_wsse_add_EncryptedKey_encrypt_only` is not supported. You can encrypt elements with complex content (complexType and complexContent elements that have sub elements). Decryption is not limited to elements with complex content. - Encryption is performed after signing (likewise, signatures are verified after decryption). Signing after encryption is not supported in the current plugin release. It is generally known that it is safer to perform encryption after signing as the WSSE plugin performs, and not vice versa. - Signing and encrypting XML containing QName content may lead to verification issues, because the W3C C14N exclusive canonicalization protocol has known limitations with QName content normalization. In fact, not signing the prefix bindings as in C14N exclusive canonicalization is a security risk, because the prefix-URI binding can be modified when placed at an ancestor node that is not included in the signed XML content. Use `soap_wsse_set_InclusiveNamespaces(soap, "prefixlist")` to define all namespace prefixes (space-separated in the string) that should be considered inclusive. All prefixes used in QName content should be listed to mitigate the security risks outlined. The WSSE engine recognizes xsi:type, SOAP-ENC:arrayType, SOAP-ENC:itemType attribute QNames. Therefore, soapcpp2 option `-t` is always safe to use, but a non-gSOAP receiver may still fail. @section wsse_14 Defending Against Signature Wrapping Attacks Signature wrapping attacks exploit a vulnerability in the XML DSig standard by tricking the signature verifier to verify the signature of the signed content but when this content is moved to a different place in the XML document, for example where the content is ignored. In this attack, a signed XML element identified with an `id` attribute is moved in the document and replaced with an unsigned replacement element with aribitrary content that the attacker created and the receiver will use instead. We refer to online articles and publications on signature wrapping attacks for more details. To defend against signature wrapping attacks, we recommend to sign the SOAP Body instead of individual elements of the SOAP Body. A receiver must verify that the SOAP Body received is indeed signed and verify that other parts of the message such as critical SOAP Headers are signed. You can do this on the receiving end by calling `soap_wsse_verify_body(soap)` and check that the return value is nonzero. This prevents signature wrapping attacks on the SOAP Body. If individual element(s) of the SOAP Body must be signed instead of the body itself, then make sure to use call `soap_wsse_verify_element(soap, "namespaceURI", "tag")` on the receiving end and check that the return value is nonzero to verify that all elements matching the namespaceURI and tag are signed. If SOAP Headers are signed such as the timestamp and username token then make sure to verify that the timestamp was indeed signed by calling `soap_wsse_verify_element(soap, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "Timestamp")` and check that the return value is nonzero. Likewise, to verify that the usernameToken authentication credentials are signed, call `soap_wsse_verify_element(soap, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "UsernameToken")` and check that the return value is nonzero. To prevent signature wrapping attacks on XML namespace prefixes used in QNames, which are vulnerable when the prefix is bound to a namespace URI in an ancester node to the signed content, use `soap_wsse_set_InclusiveNamespaces(soap, "prefixlist")`. This makes the namespace prefixes in the list (space-separated in the string) inclusive. Use `soap_wsse_set_InclusiveNamespaces(soap, "+")` to automatically add all prefixes defined in the namespace table (i.e. the .nsmap file) to the inclusive namespace list (this requires gSOAP 2.8.64 or greater). @section wsse_wsc WS-SecureConversation and WS-Trust To use a WS-SecureConversation security context token (SCT) with WS-Security: @code const char *identifier = "..."; soap_wsse_add_SecurityContextToken(soap, "SCT", identifier); @endcode In this example a context has been established and the secret that is identified by the 'identifier' string is known to both parties. This secret is used to sign the message body. The "SCT" is a wsu:Id, which is used as a reference to sign the token. To compute PSHA1 with base64 input strings `client_secret_base64` and `server_secret_base64` to output a base64-encoded `psha1[0..psha1len-1]` string `psha1_base64`: @code int psha1len = 32; // or greater int n, m; const char *client_secret = soap_base642s(soap, client_secret_base64, NULL, 0, &n); const char *server_secret = soap_base642s(soap, server_secret_base64, NULL, 0, &m); char psha1[psha1len]; char *psha1_base64; if (soap_psha1(soap, client_secret, n, server_secret, m, psha1, psha1len)) .. error // insufficient memory psha1_base64 = soap_s2base64(soap, (unsigned char*)psha1, NULL, psha1len); @endcode Similarly, PSHA256 can be computed by calling `soap_psha256()`. */ #include "wsseapi.h" #include "threads.h" /* need threads to enable mutex for MT */ #if defined(SOAP_WSA_2003) || defined(SOAP_WSA_2004) || defined(SOAP_WSA_200408) || defined(SOAP_WSA_2005) #include "wsaapi.h" #endif #ifdef __cplusplus extern "C" { #endif /** Plugin identification for plugin registry */ const char soap_wsse_id[14] = SOAP_WSSE_ID; /** Maximum number of SignedInfo References */ #define SOAP_WSSE_MAX_REF (100) /** Clock skew between machines (in sec) to fit message expiration in window */ #define SOAP_WSSE_CLKSKEW (300) /** Size of the random nonce */ #define SOAP_WSSE_NONCELEN (20) /** Digest authentication accepts messages that are not older than creation time + SOAP_WSSE_NONCETIME */ #define SOAP_WSSE_NONCETIME (SOAP_WSSE_CLKSKEW + 240) /******************************************************************************\ * * Common URIs * \******************************************************************************/ const char *wsse_PasswordTextURI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"; const char *wsse_PasswordDigestURI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest"; const char *wsse_Base64BinaryURI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary"; const char *wsse_HexBinaryURI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#HexBinary"; const char *wsse_X509v3URI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"; const char *wsse_X509v3SubjectKeyIdentifierURI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509SubjectKeyIdentifier"; const char *ds_envsigURI = "http://www.w3.org/2000/09/xmldsig#enveloped-signature"; const char *ds_sha1URI = "http://www.w3.org/2000/09/xmldsig#sha1"; const char *ds_sha224URI = "http://www.w3.org/2001/04/xmldsig-more#sha224"; const char *ds_sha256URI = "http://www.w3.org/2001/04/xmlenc#sha256"; const char *ds_sha384URI = "http://www.w3.org/2001/04/xmldsig-more#sha384"; const char *ds_sha512URI = "http://www.w3.org/2001/04/xmlenc#sha512"; const char *ds_hmac_sha1URI = "http://www.w3.org/2000/09/xmldsig#hmac-sha1"; const char *ds_hmac_sha224URI = "http://www.w3.org/2001/04/xmldsig-more#hmac-sha224"; const char *ds_hmac_sha256URI = "http://www.w3.org/2001/04/xmldsig-more#hmac-sha256"; const char *ds_hmac_sha384URI = "http://www.w3.org/2001/04/xmldsig-more#hmac-sha384"; const char *ds_hmac_sha512URI = "http://www.w3.org/2001/04/xmldsig-more#hmac-sha512"; const char *ds_dsa_sha1URI = "http://www.w3.org/2000/09/xmldsig#dsa-sha1"; const char *ds_dsa_sha256URI = "http://www.w3.org/2009/xmldsig11#dsa-sha256"; const char *ds_rsa_sha1URI = "http://www.w3.org/2000/09/xmldsig#rsa-sha1"; const char *ds_rsa_sha224URI = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha224"; const char *ds_rsa_sha256URI = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"; const char *ds_rsa_sha384URI = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha384"; const char *ds_rsa_sha512URI = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha512"; const char *ds_ecdsa_sha1URI = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha1"; const char *ds_ecdsa_sha224URI = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha224"; const char *ds_ecdsa_sha256URI = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256"; const char *ds_ecdsa_sha384URI = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha384"; const char *ds_ecdsa_sha512URI = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha512"; const char *xenc_3desURI = "http://www.w3.org/2001/04/xmlenc#tripledes-cbc"; const char *xenc_aes128cbcURI = "http://www.w3.org/2001/04/xmlenc#aes128-cbc"; const char *xenc_aes192cbcURI = "http://www.w3.org/2001/04/xmlenc#aes192-cbc"; const char *xenc_aes256cbcURI = "http://www.w3.org/2001/04/xmlenc#aes256-cbc"; const char *xenc_aes512cbcURI = "http://www.w3.org/2001/04/xmlenc#aes512-cbc"; const char *xenc_aes128gcmURI = "http://www.w3.org/2009/xmlenc11#aes128-gcm"; const char *xenc_aes192gcmURI = "http://www.w3.org/2009/xmlenc11#aes192-gcm"; const char *xenc_aes256gcmURI = "http://www.w3.org/2009/xmlenc11#aes256-gcm"; const char *xenc_aes512gcmURI = "http://www.w3.org/2009/xmlenc11#aes512-gcm"; const char *xenc_elementURI = "http://www.w3.org/2001/04/xmlenc#Element"; const char *xenc_contentURI = "http://www.w3.org/2001/04/xmlenc#Content"; const char *xenc_rsa15URI = "http://www.w3.org/2001/04/xmlenc#rsa-1_5"; const char *xenc_rsaesURI = "http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p"; const char *wsse_URI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; const char *xenc_URI = "http://www.w3.org/2001/04/xmlenc#"; const char *ds_URI = "http://www.w3.org/2000/09/xmldsig#"; const char *c14n_URI = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315"; const char *c14n_wc_URI = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"; const char *exc_c14n_URI = "http://www.w3.org/2001/10/xml-exc-c14n#"; const char *exc_c14n_wc_URI = "http://www.w3.org/2001/10/xml-exc-c14n#WithComments"; const char *wsu_URI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"; const char *saml1_URI = "urn:oasis:names:tc:SAML:1.0:assertion"; const char *saml2_URI = "urn:oasis:names:tc:SAML:2.0:assertion"; /******************************************************************************\ * * Digest authentication session * \******************************************************************************/ /** @struct soap_wsse_session @brief Digest authentication session data. */ struct soap_wsse_session { struct soap_wsse_session *next; /**< Next session in list */ time_t expired; /**< Session expiration */ char hash[SOAP_SMD_SHA1_SIZE]; /**< SHA1 digest */ char nonce[1]; /**< Nonce string flows into region below this struct */ }; /** The digest authentication session database */ static struct soap_wsse_session *soap_wsse_session = NULL; /** Lock for digest authentication session database exclusive access */ static MUTEX_TYPE soap_wsse_session_lock = MUTEX_INITIALIZER; /******************************************************************************\ * * Static protos * \******************************************************************************/ static char* soap_wsse_ids(struct soap *soap, const char *tags, int sub); static int soap_wsse_session_verify(struct soap *soap, const char hash[SOAP_SMD_SHA1_SIZE], const char *created, const char *nonce); static void soap_wsse_session_cleanup(struct soap *soap); static void calc_digest(struct soap *soap, const char *created, const char *nonce, int noncelen, const char *password, char hash[SOAP_SMD_SHA1_SIZE]); static int soap_wsse_init(struct soap *soap, struct soap_wsse_data *data, const void *(*arg)(struct soap*, int*, const char*, const unsigned char*, int, int*)); static int soap_wsse_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src); static void soap_wsse_delete(struct soap *soap, struct soap_plugin *p); static int soap_wsse_preparesend(struct soap *soap, const char *buf, size_t len); static int soap_wsse_preparefinalsend(struct soap *soap); static void soap_wsse_preparecleanup(struct soap *soap, struct soap_wsse_data *data); static int soap_wsse_preparefinalrecv(struct soap *soap); static int soap_wsse_element_begin_in(struct soap *soap, const char *tag); static int soap_wsse_element_end_in(struct soap *soap, const char *tag1, const char *tag2); static int soap_wsse_element_begin_out(struct soap *soap, const char *tag, int id, const char *type); static int soap_wsse_element_end_out(struct soap *soap, const char *tag); static size_t soap_wsse_verify_nested(struct soap *soap, struct soap_dom_element *dom, const char *URI, const char *tag); static int soap_p_hash(struct soap *soap, const char *hmac_key, size_t hmac_key_len, const char *secret, size_t secretlen, int alg, char HA[], size_t HA_len, char temp[], char *phash, size_t phashlen); /******************************************************************************\ * * wsse:Security header element * \******************************************************************************/ /** @fn _wsse__Security* soap_wsse_add_Security(struct soap *soap) @brief Adds Security header element. @param soap context @return _wsse__Security object */ SOAP_FMAC1 struct _wsse__Security * SOAP_FMAC2 soap_wsse_add_Security(struct soap *soap) { DBGFUN("soap_wsse_add_Security"); /* if we don't have a SOAP Header, create one */ soap_header(soap); /* if we don't have a wsse:Security element in the SOAP Header, create one */ if (!soap->header->wsse__Security) { soap->header->wsse__Security = (_wsse__Security*)soap_malloc(soap, sizeof(_wsse__Security)); if (!soap->header->wsse__Security) return NULL; soap_default__wsse__Security(soap, soap->header->wsse__Security); } return soap->header->wsse__Security; } /******************************************************************************/ /** @fn _wsse__Security* soap_wsse_add_Security_actor(struct soap *soap, const char *actor) @brief Adds Security header element with actor or role attribute. @param soap context @param actor string @return _wsse__Security object */ SOAP_FMAC1 struct _wsse__Security * SOAP_FMAC2 soap_wsse_add_Security_actor(struct soap *soap, const char *actor) { _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN1("soap_wsse_add_Security_actor", "actor=%s", actor); if (soap->namespaces && !strcmp(soap->namespaces[0].ns, "http://schemas.xmlsoap.org/soap/envelope/")) security->SOAP_ENV__actor = soap_strdup(soap, actor); else security->SOAP_ENV__role = soap_strdup(soap, actor); return security; } /******************************************************************************/ /** @fn void soap_wsse_delete_Security(struct soap *soap) @brief Deletes Security header element. @param soap context */ SOAP_FMAC1 void SOAP_FMAC2 soap_wsse_delete_Security(struct soap *soap) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_delete_Security"); if (data) { if (soap->fpreparesend == soap_wsse_preparesend) soap->fpreparesend = data->fpreparesend; if (soap->fpreparefinalsend == soap_wsse_preparefinalsend) soap->fpreparefinalsend = data->fpreparefinalsend; data->fpreparesend = NULL; data->fpreparefinalsend = NULL; data->sigid = NULL; data->encid = NULL; if (data->prefixlist) SOAP_FREE(soap, data->prefixlist); data->prefixlist = NULL; } soap->feltbegout = NULL; soap->feltendout = NULL; if (soap->header) soap->header->wsse__Security = NULL; } /******************************************************************************/ /** @fn _wsse__Security* soap_wsse_Security(struct soap *soap) @brief Returns Security header element if present. @param soap context @return _wsse__Security object or NULL */ SOAP_FMAC1 struct _wsse__Security * SOAP_FMAC2 soap_wsse_Security(struct soap *soap) { if (soap->header) return soap->header->wsse__Security; return NULL; } /******************************************************************************\ * * wsse:Security/ds:Signature header element * \******************************************************************************/ /** @fn ds__SignatureType* soap_wsse_add_Signature(struct soap *soap) @brief Adds Signature header element. @param soap context @return ds__SignatureType object */ SOAP_FMAC1 struct ds__SignatureType * SOAP_FMAC2 soap_wsse_add_Signature(struct soap *soap) { _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN("soap_wsse_add_Signature"); /* if we don't have a ds:Signature, create one */ if (!security->ds__Signature) { security->ds__Signature = (ds__SignatureType*)soap_malloc(soap, sizeof(ds__SignatureType)); if (!security->ds__Signature) return NULL; soap_default_ds__SignatureType(soap, security->ds__Signature); } return security->ds__Signature; } /******************************************************************************/ /** @fn void soap_wsse_delete_Signature(struct soap *soap) @brief Deletes Signature header element. @param soap context */ SOAP_FMAC1 void SOAP_FMAC2 soap_wsse_delete_Signature(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); DBGFUN("soap_wsse_delete_Signature"); if (security) security->ds__Signature = NULL; } /******************************************************************************/ /** @fn ds__SignatureType* soap_wsse_Signature(struct soap *soap) @brief Returns Signature header element if present. @param soap context @return ds__SignatureType object or NULL */ SOAP_FMAC1 struct ds__SignatureType * SOAP_FMAC2 soap_wsse_Signature(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); if (security) return security->ds__Signature; return NULL; } /******************************************************************************\ * * wsse:Security/wsu:Timestamp header element * \******************************************************************************/ /** @fn int soap_wsse_add_Timestamp(struct soap *soap, const char *id, time_t lifetime) @brief Adds Timestamp element with optional expiration date+time (lifetime). @param[in] soap context @param[in] id for signature referencing or NULL @param[in] lifetime expressed in time_t units, or 0 for no expiration @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_Timestamp(struct soap *soap, const char *id, time_t lifetime) { _wsse__Security *security = soap_wsse_add_Security(soap); time_t now = time(NULL); char *created = soap_strdup(soap, soap_dateTime2s(soap, now)); char *expired = lifetime ? soap_strdup(soap, soap_dateTime2s(soap, now + lifetime)) : NULL; DBGFUN1("soap_wsse_add_Timestamp", "id=%s", id?id:""); /* allocate a Timestamp if we don't have one already */ if (!security->wsu__Timestamp) { security->wsu__Timestamp = (_wsu__Timestamp*)soap_malloc(soap, sizeof(_wsu__Timestamp)); if (!security->wsu__Timestamp) return soap->error = SOAP_EOM; } soap_default__wsu__Timestamp(soap, security->wsu__Timestamp); /* populate the wsu:Timestamp element */ security->wsu__Timestamp->wsu__Id = soap_strdup(soap, id); security->wsu__Timestamp->Created = created; security->wsu__Timestamp->Expires = expired; return SOAP_OK; } /******************************************************************************/ /** @fn _wsu__Timestamp *soap_wsse_Timestamp(struct soap *soap) @brief Returns Timestamp element if present. @param soap context @return _wsu__Timestamp object or NULL */ SOAP_FMAC1 struct _wsu__Timestamp * SOAP_FMAC2 soap_wsse_Timestamp(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); if (security) return security->wsu__Timestamp; return NULL; } /******************************************************************************/ /** @fn int soap_wsse_verify_Timestamp(struct soap *soap) @brief Verifies the Timestamp/Expires element against the current time. @param soap context @return SOAP_OK or SOAP_FAULT with wsu:MessageExpired fault Sets wsu:MessageExpired fault if wsu:Timestamp is expired. The SOAP_WSSE_CLKSKEW value is used as a margin to mitigate clock skew. Keeps silent when no timestamp is supplied or no expiration date is included in the wsu:Timestamp element. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_Timestamp(struct soap *soap) { _wsu__Timestamp *timestamp = soap_wsse_Timestamp(soap); DBGFUN("soap_wsse_verify_Timestamp"); /* if we have a timestamp with an expiration date, check it */ if (timestamp && timestamp->Expires) { time_t now = time(NULL), expired; soap_s2dateTime(soap, timestamp->Expires, &expired); if (expired + SOAP_WSSE_CLKSKEW <= now) { const char *code = soap_wsu__tTimestampFault2s(soap, wsu__MessageExpired); return soap_wsse_sender_fault_subcode(soap, code, "Message has expired", timestamp->Expires); } } return SOAP_OK; } /******************************************************************************\ * * wsse:Security/UsernameToken header element * \******************************************************************************/ /** @fn int soap_wsse_add_UsernameTokenText(struct soap *soap, const char *id, const char *username, const char *password) @brief Adds UsernameToken element with optional clear-text password. @param soap context @param[in] id string for signature referencing or NULL @param[in] username string @param[in] password string or NULL to omit the password @return SOAP_OK Passwords are sent in the clear, so transport-level encryption is required. @note This release supports the use of at most one UsernameToken in the header. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_UsernameTokenText(struct soap *soap, const char *id, const char *username, const char *password) { _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN2("soap_wsse_add_UsernameTokenText", "id=%s", id?id:"", "username=%s", username?username:""); /* allocate a UsernameToken if we don't have one already */ if (!security->UsernameToken) { security->UsernameToken = (_wsse__UsernameToken*)soap_malloc(soap, sizeof(_wsse__UsernameToken)); if (!security->UsernameToken) return soap->error = SOAP_EOM; } soap_default__wsse__UsernameToken(soap, security->UsernameToken); /* populate the UsernameToken */ security->UsernameToken->wsu__Id = soap_strdup(soap, id); security->UsernameToken->Username = soap_strdup(soap, username); /* allocate and populate the Password */ if (password) { security->UsernameToken->Password = (_wsse__Password*)soap_malloc(soap, sizeof(_wsse__Password)); if (!security->UsernameToken->Password) return soap->error = SOAP_EOM; soap_default__wsse__Password(soap, security->UsernameToken->Password); security->UsernameToken->Password->Type = (char*)wsse_PasswordTextURI; security->UsernameToken->Password->__item = soap_strdup(soap, password); } return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_add_UsernameTokenDigest(struct soap *soap, const char *id, const char *username, const char *password) @brief Adds UsernameToken element for digest authentication. @param soap context @param[in] id string for signature referencing or NULL @param[in] username string @param[in] password string @return SOAP_OK Computes SHA1 digest of the time stamp, a nonce, and the password. The digest provides the authentication credentials. Passwords are NOT sent in the clear. @note This release supports the use of at most one UsernameToken in the header. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_UsernameTokenDigest(struct soap *soap, const char *id, const char *username, const char *password) { return soap_wsse_add_UsernameTokenDigest_at(soap, id, username, password, time(NULL)); } /******************************************************************************/ /** @fn int soap_wsse_add_UsernameTokenDigest_at(struct soap *soap, const char *id, const char *username, const char *password, time_t when) @brief Adds UsernameToken element for digest authentication. @param soap context @param[in] id string for signature referencing or NULL @param[in] username string @param[in] password string @param[in] when the time stamp to use for the digest hash @return SOAP_OK Computes SHA1 digest of the time stamp, a nonce, and the password. The digest provides the authentication credentials. Passwords are NOT sent in the clear. @note This release supports the use of at most one UsernameToken in the header. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_UsernameTokenDigest_at(struct soap *soap, const char *id, const char *username, const char *password, time_t when) { _wsse__Security *security = soap_wsse_add_Security(soap); const char *created = soap_dateTime2s(soap, when); char HA[SOAP_SMD_SHA1_SIZE], HABase64[29]; char nonce[SOAP_WSSE_NONCELEN], *nonceBase64; DBGFUN2("soap_wsse_add_UsernameTokenDigest", "id=%s", id?id:"", "username=%s", username?username:""); /* generate a nonce */ soap_wsse_rand_nonce(nonce, SOAP_WSSE_NONCELEN); nonceBase64 = soap_s2base64(soap, (unsigned char*)nonce, NULL, SOAP_WSSE_NONCELEN); /* The specs are not clear: compute digest over binary nonce or base64 nonce? */ /* compute SHA1(created, nonce, password) */ calc_digest(soap, created, nonce, SOAP_WSSE_NONCELEN, password, HA); /* Hm...? calc_digest(soap, created, nonceBase64, strlen(nonceBase64), password, HA); */ soap_s2base64(soap, (unsigned char*)HA, HABase64, SOAP_SMD_SHA1_SIZE); /* populate the UsernameToken with digest */ soap_wsse_add_UsernameTokenText(soap, id, username, HABase64); /* populate the remainder of the password, nonce, and created */ security->UsernameToken->Password->Type = (char*)wsse_PasswordDigestURI; security->UsernameToken->Nonce = (struct wsse__EncodedString*)soap_malloc(soap, sizeof(struct wsse__EncodedString)); if (!security->UsernameToken->Nonce) return soap->error = SOAP_EOM; soap_default_wsse__EncodedString(soap, security->UsernameToken->Nonce); security->UsernameToken->Nonce->__item = nonceBase64; security->UsernameToken->Nonce->EncodingType = (char*)wsse_Base64BinaryURI; security->UsernameToken->wsu__Created = soap_strdup(soap, created); return SOAP_OK; } /******************************************************************************/ /** @fn _wsse__UsernameToken* soap_wsse_UsernameToken(struct soap *soap, const char *id) @brief Returns UsernameToken element if present. @param soap context @param[in] id string of UsernameToken or NULL @return _wsse__UsernameToken object or NULL @note This release supports the use of at most one UsernameToken in the header. */ SOAP_FMAC1 struct _wsse__UsernameToken * SOAP_FMAC2 soap_wsse_UsernameToken(struct soap *soap, const char *id) { _wsse__Security *security = soap_wsse_Security(soap); if (security && security->UsernameToken && (!id || (security->UsernameToken->wsu__Id && !strcmp(security->UsernameToken->wsu__Id, id)))) return security->UsernameToken; return NULL; } /******************************************************************************/ /** @fn const char* soap_wsse_get_Username(struct soap *soap) @brief Returns UsernameToken/username string or wsse:FailedAuthentication fault. @param soap context @return UsernameToken/username string or NULL with wsse:FailedAuthentication fault error set @see soap_wsse_verify_Password The returned username should be used to lookup the user's password in a dictionary or database for server-side authentication with soap_wsse_verify_Password. */ SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsse_get_Username(struct soap *soap) { _wsse__UsernameToken *token = soap_wsse_UsernameToken(soap, NULL); DBGFUN("soap_wsse_get_Username"); if (token) return token->Username; soap_wsse_fault(soap, wsse__FailedAuthentication, "Username authentication required"); return NULL; } /******************************************************************************/ /** @fn int soap_wsse_verify_Password(struct soap *soap, const char *password) @brief Verifies the supplied password or sets wsse:FailedAuthentication fault. @param soap context @param[in] password string to verify against @return SOAP_OK (authorized) or SOAP_FAULT with wsse:FailedAuthentication fault The verification supports both clear-text password verification and digest password authentication. For digest authentication a history mechanism with a digest authentication session database ensures protection against replay attacks. @note This release supports the use of at most one UsernameToken in the header. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_Password(struct soap *soap, const char *password) { _wsse__UsernameToken *token = soap_wsse_UsernameToken(soap, NULL); DBGFUN("soap_wsse_verify_Password"); /* if we have a UsernameToken with a Password, check it */ if (token && token->Password) { /* password digest or text? */ if (token->Password->Type && !strcmp(token->Password->Type, wsse_PasswordDigestURI)) { /* check password digest: compute SHA1(created, nonce, password) */ if (token->Nonce && token->wsu__Created && strlen(token->Password->__item) == 28) /* digest pw len = 28 */ { char HA1[SOAP_SMD_SHA1_SIZE], HA2[SOAP_SMD_SHA1_SIZE]; /* The specs are not clear: compute digest over binary nonce or base64 nonce? The formet appears to be the case: */ int noncelen; const char *nonce; if (!token->Nonce->EncodingType || !strcmp(token->Nonce->EncodingType, wsse_Base64BinaryURI)) nonce = soap_base642s(soap, token->Nonce->__item, NULL, 0, &noncelen); else if (!strcmp(token->Nonce->EncodingType, wsse_HexBinaryURI)) nonce = soap_hex2s(soap, token->Nonce->__item, NULL, 0, &noncelen); else return soap_wsse_fault(soap, wsse__FailedAuthentication, NULL); /* compute HA1 = SHA1(created, nonce, password) */ calc_digest(soap, token->wsu__Created, nonce, noncelen, password, HA1); /* calc_digest(soap, token->wsu__Created, token->Nonce->__item, strlen(token->Nonce->__item), password, HA1); */ /* get HA2 = supplied digest from base64 Password */ soap_base642s(soap, token->Password->__item, HA2, SOAP_SMD_SHA1_SIZE, NULL); /* compare HA1 to HA2 */ if (!memcmp(HA1, HA2, SOAP_SMD_SHA1_SIZE)) { /* authorize if HA1 and HA2 identical and not replay attack */ if (!soap_wsse_session_verify(soap, HA1, token->wsu__Created, token->Nonce->__item)) return SOAP_OK; return soap->error; } } } else { /* check password text */ if (!strcmp(token->Password->__item, password)) return SOAP_OK; } } return soap_wsse_fault(soap, wsse__FailedAuthentication, NULL); } /******************************************************************************\ * * wsse:Security/BinarySecurityToken header element * \******************************************************************************/ /** @fn int soap_wsse_add_BinarySecurityToken(struct soap *soap, const char *id, const char *valueType, const unsigned char *data, int size) @brief Adds BinarySecurityToken element. @param soap context @param[in] id string for signature referencing or NULL @param[in] valueType string @param[in] data points to binary token data @param[in] size is length of binary token @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_BinarySecurityToken(struct soap *soap, const char *id, const char *valueType, const unsigned char *data, int size) { _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN2("wsse_add_BinarySecurityToken", "id=%s", id?id:"", "valueType=%s", valueType?valueType:""); /* allocate BinarySecurityToken if we don't already have one */ if (!security->BinarySecurityToken) { security->BinarySecurityToken = (_wsse__BinarySecurityToken*)soap_malloc(soap, sizeof(_wsse__BinarySecurityToken)); if (!security->BinarySecurityToken) return soap->error = SOAP_EOM; } soap_default__wsse__BinarySecurityToken(soap, security->BinarySecurityToken); /* populate the BinarySecurityToken */ security->BinarySecurityToken->wsu__Id = soap_strdup(soap, id); security->BinarySecurityToken->ValueType = soap_strdup(soap, valueType); security->BinarySecurityToken->EncodingType = (char*)wsse_Base64BinaryURI; security->BinarySecurityToken->__item = soap_s2base64(soap, data, NULL, size); return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_add_BinarySecurityTokenX509(struct soap *soap, const char *id, X509 *cert) @brief Adds BinarySecurityToken element with X509 certificate. @param soap context @param[in] id string for signature reference @param[in] cert points to the X509 certificate @return SOAP_OK or SOAP_EOM This function uses i2d_X509 from the the OpenSSL library to convert an X509 object to binary DER format. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_BinarySecurityTokenX509(struct soap *soap, const char *id, X509 *cert) { int derlen; unsigned char *der, *s; if (!cert) return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Missing certificate"); /* determine the storage requirement */ derlen = i2d_X509(cert, NULL); if (derlen < 0) return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Invalid certificate"); /* use the gSOAP engine's look-aside buffer to temporarily hold the cert */ if (soap_store_lab(soap, NULL, derlen)) return SOAP_EOM; s = der = (unsigned char*)soap->labbuf; /* store in DER format */ i2d_X509(cert, &s); /* populate the BinarySecurityToken with base64 certificate data */ return soap_wsse_add_BinarySecurityToken(soap, id, wsse_X509v3URI, der, derlen); } /******************************************************************************/ /** @fn int soap_wsse_add_BinarySecurityTokenPEM(struct soap *soap, const char *id, const char *filename) @brief Adds BinarySecurityToken element from a PEM file. @param soap context @param[in] id string for signature reference @param[in] filename @return SOAP_OK or SOAP_FAULT with wsse__InvalidSecurity fault when file cannot be read or does not contain a valid certificate This function uses PEM_read_X509 from the the OpenSSL library to read a certificate from a PEM formatted file. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_BinarySecurityTokenPEM(struct soap *soap, const char *id, const char *filename) { FILE *fd; DBGFUN2("soap_wsse_add_BinarySecurityTokenPEM", "id=%s", id?id:"", "filename=%s", filename?filename:""); fd = fopen(filename, "r"); if (fd) { /* read the certificate */ X509 *cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); /* if okay, populate the BinarySecurityToken element */ if (cert) { int err = soap_wsse_add_BinarySecurityTokenX509(soap, id, cert); X509_free(cert); return err; } } return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Missing certificate"); } /******************************************************************************/ /** @fn _wsse__BinarySecurityToken* soap_wsse_BinarySecurityToken(struct soap *soap, const char *id) @brief Returns BinarySecurityToken element if present. @param soap context @param[in] id string of token to get or NULL to get the first @return _wsse__BinarySecurityToken object or NULL */ SOAP_FMAC1 struct _wsse__BinarySecurityToken * SOAP_FMAC2 soap_wsse_BinarySecurityToken(struct soap *soap, const char *id) { _wsse__Security *security = soap_wsse_Security(soap); if (security && security->BinarySecurityToken && (!id || (security->BinarySecurityToken->wsu__Id && !strcmp(security->BinarySecurityToken->wsu__Id, id)))) return security->BinarySecurityToken; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "No BinarySecurityToken id=%s, pointer=%p to token found\n", id, security->BinarySecurityToken)); return NULL; } /******************************************************************************/ /** @fn int soap_wsse_get_BinarySecurityToken(struct soap *soap, const char *id, char **valueType, unsigned char **data, int *size) @brief Get wsse:BinarySecurityToken element token data in binary form. @param soap context @param[in] id string of token to get or NULL to get the first @param[out] valueType string @param[out] data points to binary token data @param[out] size is length of binary token @return SOAP_OK or SOAP_FAULT with wsse:SecurityTokenUnavailable fault */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_get_BinarySecurityToken(struct soap *soap, const char *id, char **valueType, unsigned char **data, int *size) { _wsse__BinarySecurityToken *token = soap_wsse_BinarySecurityToken(soap, id); DBGFUN1("soap_wsse_get_BinarySecurityToken", "id=%s", id?id:""); if (token) { *valueType = token->ValueType; if (!token->EncodingType || !strcmp(token->EncodingType, wsse_Base64BinaryURI)) *data = (unsigned char*)soap_base642s(soap, token->__item, NULL, 0, size); else if (!strcmp(token->EncodingType, wsse_HexBinaryURI)) *data = (unsigned char*)soap_hex2s(soap, token->__item, NULL, 0, size); if (*data) return SOAP_OK; } return soap_wsse_fault(soap, wsse__SecurityTokenUnavailable, "BinarySecurityToken required"); } /******************************************************************************/ /** @fn X509* soap_wsse_get_BinarySecurityTokenX509(struct soap *soap, const char *id) @brief Get X509 wsse:BinarySecurityToken certificate and verify its content. This call must be followed by an X509_free to deallocate the X509 certificate data. @param soap context @param[in] id string of token to get or NULL to get the first @return X509 certificate (dynamically allocated) or NULL with wsse:SecurityTokenUnavailable fault */ SOAP_FMAC1 X509* SOAP_FMAC2 soap_wsse_get_BinarySecurityTokenX509(struct soap *soap, const char *id) { X509 *cert = NULL; char *valueType = NULL; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) const unsigned char *data; #else unsigned char *data; #endif int size; DBGFUN1("soap_wsse_get_BinarySecurityTokenX509", "id=%s", id?id:""); if (!soap_wsse_get_BinarySecurityToken(soap, id, &valueType, (unsigned char**)&data, &size) && valueType && !strcmp(valueType, wsse_X509v3URI)) cert = d2i_X509(NULL, &data, size); /* verify the certificate */ if (cert && soap_wsse_verify_X509(soap, cert)) { X509_free(cert); cert = NULL; } return cert; } /******************************************************************************/ /** @fn int soap_wsse_verify_X509(struct soap *soap, X509 *cert) @brief Verifies X509 certificate against soap->cafile, soap->capath, and soap->crlfile. @param soap context @param[in] cert X509 certificate @return SOAP_OK or fault This is an expensive operation. Whenever a new soap context is created, the cafile and objects are loaded into that context each time we need to verify a certificate. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_X509(struct soap *soap, X509 *cert) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); X509_STORE_CTX *verify; DBGFUN("soap_wsse_verify_X509"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_verify_X509", "Plugin not registered", SOAP_PLUGIN_ERROR); if (!cert) return soap_wsse_sender_fault(soap, "soap_wsse_verify_X509", "No certificate"); if (!data->store) { data->store = X509_STORE_new(); if (!data->store) return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not create X509_STORE object"); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Setting up a new X509 store\n")); X509_STORE_set_verify_cb_func(data->store, soap->fsslverify); if (soap->cafile || soap->capath) { if (X509_STORE_load_locations(data->store, soap->cafile, soap->capath) != 1) return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not load CA PEM file or path"); } #if (OPENSSL_VERSION_NUMBER > 0x00907000L) if (soap->crlfile) { if (*soap->crlfile) { X509_LOOKUP *lookup; lookup = X509_STORE_add_lookup(data->store, X509_LOOKUP_file()); if (!lookup) return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not create X509_LOOKUP object"); if (X509_load_crl_file(lookup, soap->crlfile, X509_FILETYPE_PEM) != 1) return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not read CRL PEM file"); } X509_STORE_set_flags(data->store, X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL); } #endif } verify = X509_STORE_CTX_new(); if (!verify) return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not create X509_STORE_CTX object"); #if (OPENSSL_VERSION_NUMBER > 0x00907000L) if (X509_STORE_CTX_init(verify, data->store, cert, NULL) != 1) { X509_STORE_CTX_free(verify); return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not initialize X509_STORE_CTX object"); } #else X509_STORE_CTX_init(verify, data->store, cert, NULL); #endif #ifdef SOAP_DEBUG { char buf[1024]; X509_NAME_oneline(X509_get_issuer_name(cert), buf, sizeof(buf)-1); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Certificate issuer %s\n", buf)); X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)-1); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Certificate subject %s\n", buf)); } #endif if (X509_verify_cert(verify) != 1) { X509_STORE_CTX_free(verify); return soap_wsse_sender_fault(soap, "soap_wsse_verify_X509", "Invalid certificate"); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Certificate is valid\n")); X509_STORE_CTX_free(verify); return SOAP_OK; } /******************************************************************************\ * * wsc:SecurityContextToken * \******************************************************************************/ /** @fn int soap_wsse_add_SecurityContextToken(struct soap *soap, const char *id, const char *identifier) @brief Adds wsc:SecurityContextToken/Identifier and SecurityTokenReference to it. @param soap context @param[in] id string for signature reference (required) @param[in] identifier wsc:Identifier value (required) @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_SecurityContextToken(struct soap *soap, const char *id, const char *identifier) { char *URI; size_t l; _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN2("soap_wsse_add_SecurityContextToken", "id=%s", id, "identifier=%s", identifier?identifier:""); /* allocate wsc:SecurityContextToken if we don't already have one */ if (!security->wsc__SecurityContextToken) { security->wsc__SecurityContextToken = (struct wsc__SecurityContextTokenType*)soap_malloc(soap, sizeof(struct wsc__SecurityContextTokenType)); if (!security->wsc__SecurityContextToken) return soap->error = SOAP_EOM; } soap_default_wsc__SecurityContextTokenType(soap, security->wsc__SecurityContextToken); /* populate the wsc:SecurityContextToken */ l = strlen(id); URI = (char*)soap_malloc(soap, l + 2); if (!URI) return soap->error = SOAP_EOM; *URI = '#'; soap_strcpy(URI + 1, l + 1, id); security->wsc__SecurityContextToken->wsu__Id = URI + 1; security->wsc__SecurityContextToken->Identifier = soap_strdup(soap, identifier); /* set SecurityTokenReference */ return soap_wsse_add_KeyInfo_SecurityTokenReferenceURI(soap, URI, NULL); } /******************************************************************************/ /** @fn const char *soap_wsse_get_SecurityContextToken(struct soap *soap) @brief Returns wsc:SecurityContextToken/Identifier string value or NULL. @param soap context @return wsc:SecurityContextToken/Identifier string value value or NULL */ SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsse_get_SecurityContextToken(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); DBGFUN("soap_wsse_SecurityContextToken"); if (security->wsc__SecurityContextToken && security->wsc__SecurityContextToken->wsu__Id) { const char *URI = soap_wsse_get_KeyInfo_SecurityTokenReferenceURI(soap); if (URI && !strcmp(URI, security->wsc__SecurityContextToken->wsu__Id)) return security->wsc__SecurityContextToken->Identifier; } return NULL; } /******************************************************************************\ * * ds:Signature/SignedInfo * \******************************************************************************/ /** @fn ds__SignedInfoType* soap_wsse_add_SignedInfo(struct soap *soap) @brief Adds SignedInfo element. @param soap context @return ds__SignedInfoType object */ SOAP_FMAC1 struct ds__SignedInfoType * SOAP_FMAC2 soap_wsse_add_SignedInfo(struct soap *soap) { ds__SignatureType *signature = soap_wsse_add_Signature(soap); if (!signature->SignedInfo) { signature->SignedInfo = (ds__SignedInfoType*)soap_malloc(soap, sizeof(ds__SignedInfoType)); if (!signature->SignedInfo) return NULL; soap_default_ds__SignedInfoType(soap, signature->SignedInfo); } return signature->SignedInfo; } /******************************************************************************/ /** @fn int soap_wsse_add_SignedInfo_Reference(struct soap *soap, const char *URI, unsigned int level, const char *transform, const char *prefixlist, int alg, const char *HA) @brief Adds SignedInfo element with Reference URI, transform algorithm used, and digest value. @param soap context @param[in] URI reference @param[in] level XML depth of element signed @param[in] transform string should be exc_c14n_URI for exc-c14n, or c14n_URI or NULL for default (no canonicalization) @param[in] prefixlist used by the exc-c14n transform or NULL @param[in] alg is the digest algorithm used @param[in] HA is the digest in binary form @return SOAP_OK or SOAP_EOM when references exceed SOAP_WSSE_MAX_REF This function can be called to add more references to the wsse:SignedInfo element. A maximum number of SOAP_WSSE_MAX_REF references can be added. The digest method is always SHA1. @note XPath transforms cannot be specified in this release. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_SignedInfo_Reference(struct soap *soap, const char *URI, unsigned int level, const char *transform, const char *prefixlist, int alg, const char *HA) { ds__SignedInfoType *signedInfo = soap_wsse_add_SignedInfo(soap); ds__ReferenceType *reference; DBGFUN3("soap_wsse_add_SignedInfo_Reference", "URI=%s", URI ? URI : "(null)", "transform=%s", transform ? transform : "(null)", "alg=%x", alg); /* if this is the first reference, allocate SOAP_WSSE_MAX_REF references */ if (signedInfo->__sizeReference == 0) { signedInfo->Reference = (ds__ReferenceType**)soap_malloc(soap, SOAP_WSSE_MAX_REF*sizeof(ds__ReferenceType*)); } else { /* maximum number of references exceeded? */ if (signedInfo->__sizeReference >= SOAP_WSSE_MAX_REF) return soap->error = SOAP_EOM; } /* allocate fresh new reference */ reference = (ds__ReferenceType*)soap_malloc(soap, sizeof(ds__ReferenceType)); if (!reference) return soap->error = SOAP_EOM; soap_default_ds__ReferenceType(soap, reference); /* populate the URI */ reference->URI = soap_strdup(soap, URI); /* if a transform algorithm was used, populate the Transforms element */ if (transform) { reference->Transforms = (ds__TransformsType*)soap_malloc(soap, sizeof(ds__TransformsType)); if (!reference->Transforms) return soap->error = SOAP_EOM; soap_default_ds__TransformsType(soap, reference->Transforms); /* only one transform, unless level == 0 to create enveloped signatures */ if (level <= 1) { reference->Transforms->__sizeTransform = 2; reference->Transforms->Transform = (ds__TransformType*)soap_malloc(soap, 2 * sizeof(ds__TransformType)); if (reference->Transforms->Transform) { soap_default_ds__TransformType(soap, &reference->Transforms->Transform[1]); reference->Transforms->Transform[1].Algorithm = (char*)ds_envsigURI; } } else { reference->Transforms->__sizeTransform = 1; reference->Transforms->Transform = (ds__TransformType*)soap_malloc(soap, sizeof(ds__TransformType)); } if (!reference->Transforms->Transform) return soap->error = SOAP_EOM; soap_default_ds__TransformType(soap, reference->Transforms->Transform); reference->Transforms->Transform->Algorithm = (char*)transform; /* populate the c14n:InclusiveNamespaces element */ if (prefixlist && *prefixlist && *prefixlist != '*') { reference->Transforms->Transform->c14n__InclusiveNamespaces = (_c14n__InclusiveNamespaces*)soap_malloc(soap, sizeof(_c14n__InclusiveNamespaces)); if (!reference->Transforms->Transform->c14n__InclusiveNamespaces) return soap->error = SOAP_EOM; soap_default__c14n__InclusiveNamespaces(soap, reference->Transforms->Transform->c14n__InclusiveNamespaces); if (*prefixlist == '+') { struct Namespace *ns = soap->local_namespaces; size_t n = 0; char *p; for (ns = soap->local_namespaces; ns && ns->id; ns++) n += strlen(ns->id) + 1; reference->Transforms->Transform->c14n__InclusiveNamespaces->PrefixList = p = (char*)soap_malloc(soap, n); if (p) { for (ns = soap->local_namespaces; ns && ns->id; ) { strcpy(p, ns->id); p += strlen(p); ns++; if (ns->id) *p++ = ' '; } *p = '\0'; } } else { reference->Transforms->Transform->c14n__InclusiveNamespaces->PrefixList = (char*)prefixlist; } } } /* populate the DigestMethod element */ reference->DigestMethod = (ds__DigestMethodType*)soap_malloc(soap, sizeof(ds__DigestMethodType)); if (!reference->DigestMethod) return soap->error = SOAP_EOM; soap_default_ds__DigestMethodType(soap, reference->DigestMethod); /* the DigestMethod algorithm SHA1, SHA256, SHA512 */ switch (alg & SOAP_SMD_HASH) { case SOAP_SMD_SHA1: reference->DigestMethod->Algorithm = (char*)ds_sha1URI; break; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) case SOAP_SMD_SHA224: reference->DigestMethod->Algorithm = (char*)ds_sha224URI; break; case SOAP_SMD_SHA256: reference->DigestMethod->Algorithm = (char*)ds_sha256URI; break; case SOAP_SMD_SHA384: reference->DigestMethod->Algorithm = (char*)ds_sha384URI; break; case SOAP_SMD_SHA512: reference->DigestMethod->Algorithm = (char*)ds_sha512URI; break; #endif default: return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, "SHA224/256/384/512 requires OpenSSL 0.9.8 or greater"); } /* populate the DigestValue element */ reference->DigestValue = soap_s2base64(soap, (unsigned char*)HA, NULL, soap_smd_size(alg, NULL)); if (!reference->DigestValue) return soap->error; /* add the fresh new reference to the array */ signedInfo->Reference[signedInfo->__sizeReference] = reference; signedInfo->__sizeReference++; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_add_SignedInfo_SignatureMethod(struct soap *soap, const char *method, int canonical) @brief Adds SignedInfo element with SignatureMethod. @param soap context @param[in] method is the URI of the signature algorithm (e.g. ds_rsa_sha1) @param[in] canonical flag indicating that SignedInfo is signed in exc-c14n form or in c14n when soap->c14ninclude == "*" (i.e. all prefixes are inclusive) @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_SignedInfo_SignatureMethod(struct soap *soap, const char *method, int canonical) { ds__SignedInfoType *signedInfo = soap_wsse_add_SignedInfo(soap); DBGFUN2("soap_wsse_add_SignedInfo_SignatureMethod", "method=%s", method?method:"", "canonical=%d", canonical); /* if signed in exc-c14n form, populate CanonicalizationMethod element */ if (canonical) { signedInfo->CanonicalizationMethod = (ds__CanonicalizationMethodType*)soap_malloc(soap, sizeof(ds__CanonicalizationMethodType)); if (!signedInfo->CanonicalizationMethod) return soap->error = SOAP_EOM; soap_default_ds__CanonicalizationMethodType(soap, signedInfo->CanonicalizationMethod); if (soap->c14ninclude && *soap->c14ninclude == '*') signedInfo->CanonicalizationMethod->Algorithm = (char*)c14n_URI; else signedInfo->CanonicalizationMethod->Algorithm = (char*)exc_c14n_URI; } /* populate SignatureMethod element */ signedInfo->SignatureMethod = (ds__SignatureMethodType*)soap_malloc(soap, sizeof(ds__SignatureMethodType)); if (!signedInfo->SignatureMethod) return soap->error = SOAP_EOM; soap_default_ds__SignatureMethodType(soap, signedInfo->SignatureMethod); signedInfo->SignatureMethod->Algorithm = (char*)method; return SOAP_OK; } /******************************************************************************/ /** @fn ds__SignedInfoType* soap_wsse_SignedInfo(struct soap *soap) @brief Returns SignedInfo element if present. @param soap context @return ds__SignedInfoType object or NULL */ SOAP_FMAC1 struct ds__SignedInfoType * SOAP_FMAC2 soap_wsse_SignedInfo(struct soap *soap) { ds__SignatureType *signature = soap_wsse_Signature(soap); if (signature) return signature->SignedInfo; return NULL; } /******************************************************************************/ /** @fn int soap_wsse_get_SignedInfo_SignatureMethod(struct soap *soap, int *alg, int *bits) @brief Get SignatureMethod algorithm. @param soap context @param[out] alg is a signature algorithm, such as SOAP_SMD_HMAC_SHA1/224/256/384/512, SOAP_SMD_VRFY_DSA_SHA1/256, SOAP_SMD_VRFY_RSA_SHA1/224/256/384/512 or SOAP_SMD_ECDSA_SHA1/224/256/384/512 @param[out] bits is set to HMACOutputLength if present and valid, 0 otherwise @return SOAP_OK or SOAP_FAULT with wsse:UnsupportedAlgorithm, wsse:FailedCheck, or wsse__InvalidSecurity fault */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_get_SignedInfo_SignatureMethod(struct soap *soap, int *alg, int *bits) { ds__SignedInfoType *signedInfo = soap_wsse_SignedInfo(soap); DBGFUN("soap_wsse_get_SignedInfo_SignatureMethod"); *alg = SOAP_SMD_NONE; *bits = 0; /* if we have a SignedInfo element, get the algorithm */ if (signedInfo && signedInfo->SignatureMethod && signedInfo->SignatureMethod->Algorithm) { const char *method = signedInfo->SignatureMethod->Algorithm; if (!strcmp(method, ds_hmac_sha1URI)) *alg = SOAP_SMD_HMAC_SHA1; else if (!strcmp(method, ds_hmac_sha224URI)) *alg = SOAP_SMD_HMAC_SHA224; else if (!strcmp(method, ds_hmac_sha256URI)) *alg = SOAP_SMD_HMAC_SHA256; else if (!strcmp(method, ds_hmac_sha384URI)) *alg = SOAP_SMD_HMAC_SHA384; else if (!strcmp(method, ds_hmac_sha512URI)) *alg = SOAP_SMD_HMAC_SHA512; else if (!strcmp(method, ds_dsa_sha1URI)) *alg = SOAP_SMD_VRFY_DSA_SHA1; else if (!strcmp(method, ds_dsa_sha256URI)) *alg = SOAP_SMD_VRFY_DSA_SHA256; else if (!strcmp(method, ds_rsa_sha1URI)) *alg = SOAP_SMD_VRFY_RSA_SHA1; else if (!strcmp(method, ds_rsa_sha224URI)) *alg = SOAP_SMD_VRFY_RSA_SHA224; else if (!strcmp(method, ds_rsa_sha256URI)) *alg = SOAP_SMD_VRFY_RSA_SHA256; else if (!strcmp(method, ds_rsa_sha384URI)) *alg = SOAP_SMD_VRFY_RSA_SHA384; else if (!strcmp(method, ds_rsa_sha512URI)) *alg = SOAP_SMD_VRFY_RSA_SHA512; else if (!strcmp(method, ds_ecdsa_sha1URI)) *alg = SOAP_SMD_VRFY_ECDSA_SHA1; else if (!strcmp(method, ds_ecdsa_sha224URI)) *alg = SOAP_SMD_VRFY_ECDSA_SHA224; else if (!strcmp(method, ds_ecdsa_sha256URI)) *alg = SOAP_SMD_VRFY_ECDSA_SHA256; else if (!strcmp(method, ds_ecdsa_sha384URI)) *alg = SOAP_SMD_VRFY_ECDSA_SHA384; else if (!strcmp(method, ds_ecdsa_sha512URI)) *alg = SOAP_SMD_VRFY_ECDSA_SHA512; else return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, method); if (signedInfo->SignatureMethod->HMACOutputLength) { if ((*alg & SOAP_SMD_ALGO) != SOAP_SMD_HMAC) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid SignatureMethod HMACOutputLength"); *bits = *signedInfo->SignatureMethod->HMACOutputLength; if (*bits < (int)(4 * soap_smd_size(*alg, NULL)) || *bits > (int)(8 * soap_smd_size(*alg, NULL))) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid SignatureMethod HMACOutputLength"); } return SOAP_OK; } return soap_wsse_fault(soap, wsse__FailedCheck, "Signature with SignedInfo SignatureMethod required"); } /******************************************************************************\ * * ds:Signature/SignatureValue * \******************************************************************************/ /** @fn int soap_wsse_add_SignatureValue(struct soap *soap, int alg, const void *key, int keylen) @brief Adds SignedInfo/SignatureMethod element, signs the SignedInfo element, and adds the resulting SignatureValue element. @param soap context @param[in] alg is SOAP_SMD_HMAC_SHA1/224/256/384/512, SOAP_SMD_SIGN_DSA_SHA1/256, SOAP_SMD_SIGN_RSA_SHA1/224/256/384/512, or SOAP_SMD_SIGN_ECDSA_SHA1/224/256/384/512 @param[in] key to use to sign (HMAC or DSA/RSA/ECDSA EVP_PKEY) @param[in] keylen length of HMAC key @return SOAP_OK, SOAP_EOM, or fault To sign the SignedInfo element with this function, populate SignedInfo with Reference elements first using soap_wsse_add_SignedInfo_Reference. The SignedInfo element must not be modified after signing. The SOAP_XML_INDENT and SOAP_XML_CANONICAL flags are used to serialize the SignedInfo to compute the signature. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_SignatureValue(struct soap *soap, int alg, const void *key, int keylen) { ds__SignatureType *signature = soap_wsse_add_Signature(soap); const char *method = NULL; char *sig; int siglen; int err; const char *c14ninclude = soap->c14ninclude; DBGFUN1("soap_wsse_add_SignatureValue", "alg=%x", alg); /* determine signature algorithm to use */ switch (alg) { case SOAP_SMD_HMAC_SHA1: method = ds_hmac_sha1URI; break; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) case SOAP_SMD_HMAC_SHA224: method = ds_hmac_sha224URI; break; case SOAP_SMD_HMAC_SHA256: method = ds_hmac_sha256URI; break; case SOAP_SMD_HMAC_SHA384: method = ds_hmac_sha384URI; break; case SOAP_SMD_HMAC_SHA512: method = ds_hmac_sha512URI; break; #endif case SOAP_SMD_SIGN_DSA_SHA1: method = ds_dsa_sha1URI; break; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) case SOAP_SMD_SIGN_DSA_SHA256: method = ds_dsa_sha256URI; break; #endif case SOAP_SMD_SIGN_RSA_SHA1: method = ds_rsa_sha1URI; break; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) case SOAP_SMD_SIGN_RSA_SHA224: method = ds_rsa_sha224URI; break; case SOAP_SMD_SIGN_RSA_SHA256: method = ds_rsa_sha256URI; break; case SOAP_SMD_SIGN_RSA_SHA384: method = ds_rsa_sha512URI; break; case SOAP_SMD_SIGN_RSA_SHA512: method = ds_rsa_sha512URI; break; #endif case SOAP_SMD_SIGN_ECDSA_SHA1: method = ds_ecdsa_sha1URI; break; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) case SOAP_SMD_SIGN_ECDSA_SHA224: method = ds_ecdsa_sha224URI; break; case SOAP_SMD_SIGN_ECDSA_SHA256: method = ds_ecdsa_sha256URI; break; case SOAP_SMD_SIGN_ECDSA_SHA384: method = ds_ecdsa_sha512URI; break; case SOAP_SMD_SIGN_ECDSA_SHA512: method = ds_ecdsa_sha512URI; break; #endif default: return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, "Unsupported algorithm (requires OpenSSL 0.9.8 or greater)"); } /* populate SignedInfo/SignatureMethod based on SOAP_XML_CANONICAL flag */ soap_wsse_add_SignedInfo_SignatureMethod(soap, method, (soap->mode & SOAP_XML_CANONICAL)); /* use the gSOAP engine's look-aside buffer to temporarily hold the sig */ if (soap_store_lab(soap, NULL, soap_smd_size(alg, key))) return soap->error = SOAP_EOM; sig = soap->labbuf; /* we will serialize SignedInfo as it appears exactly in the SOAP Header */ soap->part = SOAP_IN_HEADER; /* set indent level for XML SignedInfo as it appears in the SOAP Header */ soap->level = 4; /* prevent xmlns:ds namespace inclusion when non-exclusive is used */ if (!(soap->mode & SOAP_XML_CANONICAL)) soap_push_namespace(soap, "ds", ds_URI); soap->c14ninclude = NULL; /* use smdevp engine to sign SignedInfo */ err = soap_smd_begin(soap, alg, key, keylen); if (!err) err = soap_out_ds__SignedInfoType(soap, "ds:SignedInfo", 0, signature->SignedInfo, NULL); soap->c14ninclude = c14ninclude; if (soap_smd_end(soap, sig, &siglen) || err) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Could not sign"); /* populate the SignatureValue element */ signature->SignatureValue = soap_s2base64(soap, (unsigned char*)sig, NULL, siglen); if (!signature->SignatureValue) return soap->error; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_verify_Signature(struct soap *soap) @brief Verifies the Signature and the signed elements. @param soap context @return SOAP_OK, SOAP_EOM, or fault */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_Signature(struct soap *soap) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); ds__SignedInfoType *signedInfo = soap_wsse_SignedInfo(soap); int err = SOAP_OK, alg, bits, keylen = 0; EVP_PKEY *pkey = NULL; const void *key = NULL; DBGFUN("soap_wsse_verify_Signature"); if (!signedInfo) return soap_wsse_fault(soap, wsse__FailedCheck, "Signature with SignedInfo required"); if (!data) return soap->error = SOAP_PLUGIN_ERROR; /* determine which signature algorithm was used */ if (soap_wsse_get_SignedInfo_SignatureMethod(soap, &alg, &bits)) return soap->error; /* for HMAC-SHA1, the secret key might be stored in the KeyIdentifier */ if ((alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) { const char *valueType = soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifierValueType(soap, soap_wsse_KeyInfo(soap)); /* if in the KeyIdentifier, retrieve it */ if (valueType && !strcmp(valueType, ds_hmac_sha1URI)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Using HMAC key from KeyIdentifier to verify signature\n")); key = (void*)soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifier(soap, soap_wsse_KeyInfo(soap), &keylen); } /* next, try the plugin's security token handler */ if (!key) { if (data->security_token_handler) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting HMAC key through security_token_handler callback\n")); key = data->security_token_handler(soap, &alg, NULL, NULL, 0, &keylen); } } /* still no key: try to get it from the plugin */ if (!key && alg == (data->vrfy_alg & SOAP_SMD_MASK)) { /* get the HMAC secret key from the plugin */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Using HMAC key from plugin to verify signature\n")); key = data->vrfy_key; keylen = data->vrfy_keylen; } } else { /* get the certificate from the KeyInfo reference */ X509 *cert, *cert1; cert = cert1 = soap_wsse_get_KeyInfo_SecurityTokenReferenceX509(soap); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got cert=%p\n", cert)); /* next, try the plugin's security token handler */ if (!cert) { /* no cert, get it through the token handler */ if (data->security_token_handler) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting certificate through security_token_handler callback\n")); cert = (X509*)data->security_token_handler(soap, &alg, NULL, NULL, 0, &keylen); } } /* obtain the public key from the cert */ if (cert) { pkey = X509_get_pubkey((X509*)cert); key = (void*)pkey; soap->error = SOAP_OK; } else if (alg == (data->vrfy_alg & SOAP_SMD_MASK)) { /* get the public key from the plugin */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Using public key from plugin to verify signature\n")); key = data->vrfy_key; soap->error = SOAP_OK; } if (cert1) X509_free(cert1); } /* if still no key then fault else verify SignedInfo with signature and check digests of local elements */ if (!key) err = soap_wsse_fault(soap, wsse__SecurityTokenUnavailable, NULL); else if (soap_wsse_verify_SignatureValue(soap, alg, key, keylen) || soap_wsse_verify_SignedInfo(soap)) err = soap->error; if (pkey) EVP_PKEY_free(pkey); return err; } /******************************************************************************/ /** @fn int soap_wsse_verify_SignatureValue(struct soap *soap, int alg, const void *key, int keylen) @brief Verifies the SignatureValue of a SignedInfo element. @param soap context @param[in] alg is a signature algorith, such as SOAP_SMD_HMAC_SHA1/224/256/384/512, SOAP_SMD_VRFY_DSA_SHA1/256, SOAP_SMD_VRFY_RSA_SHA1/224/256/384/512 or SOAP_SMD_VRFY_ECDSA_SHA1/224/256/384/512 determined by the SignedInfo/SignatureMethod @param[in] key to use to verify (HMAC or DSA/RSA/ECDSA EVP_PKEY) @param[in] keylen length of HMAC key @return SOAP_OK, SOAP_EOM, or fault This function searches for the SignedInfo element in the soap->dom DOM tree to verify the signature in the SignatureValue element. Using the DOM ensures we will verify the signature of a SignedInfo as it was exactly received by the parser, by using the -DWITH_DOM compile flag and SOAP_XML_DOM runtime flag. If there is no DOM, it verifies the signature of the deserialized SignedInfo element in the SOAP Header. However, serializing deserialized data may change the octet stream that was signed, unless we're using gSOAP as producers and consumers (with the SOAP_XML_INDENT flag reset). */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_SignatureValue(struct soap *soap, int alg, const void *key, int keylen) { ds__SignatureType *signature = soap_wsse_Signature(soap); DBGFUN1("soap_wsse_verify_SignatureValue", "alg=%x", alg); /* always need an HMAC secret key or DSA/RSA public key to verify */ if (!key) return soap_wsse_fault(soap, wsse__SecurityTokenUnavailable, NULL); /* verify the SignedInfo element with the SignatureValue element */ if (signature && signature->SignedInfo && signature->SignatureValue) { char *sig; const char *sigval; int method, bits, siglen, sigvallen; struct soap_dom_element *elt; /* check that we are using the intended signature algorithm */ if (soap_wsse_get_SignedInfo_SignatureMethod(soap, &method, &bits)) return soap->error; if (alg != method) return soap_wsse_fault(soap, wsse__FailedCheck, "Incorrect signature algorithm used"); /* retrieve the signature */ sigval = soap_base642s(soap, signature->SignatureValue, NULL, 0, &sigvallen); /* search the DOM for SignedInfo */ elt = soap_dom_find(soap->dom, soap->dom, ds_URI, "SignedInfo", 0); if (elt) { int err = SOAP_OK; const char *c14ninclude = soap->c14ninclude; /* should not include leading whitespace in signature verification */ elt->lead = NULL; /* use smdevp engine to verify SignedInfo */ if ((alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) { sig = (char*)soap_malloc(soap, soap_smd_size(alg, key)); } else { sig = (char*)sigval; siglen = sigvallen; } if (signature->SignedInfo->CanonicalizationMethod && signature->SignedInfo->CanonicalizationMethod->Algorithm) { struct soap_dom_element *prt; struct soap_dom_attribute *att; if (signature->SignedInfo->CanonicalizationMethod->c14n__InclusiveNamespaces) soap->c14ninclude = signature->SignedInfo->CanonicalizationMethod->c14n__InclusiveNamespaces->PrefixList; else soap->c14ninclude = NULL; /* recanonicalize DOM while keeping content "as is" */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Verifying signed canonicalized DOM with C14N prefix list '%s'\n", soap->c14ninclude ? soap->c14ninclude : "")); soap->mode &= ~SOAP_XML_DOM; soap->mode |= SOAP_XML_CANONICAL | SOAP_DOM_ASIS; if (strcmp(signature->SignedInfo->CanonicalizationMethod->Algorithm, c14n_URI) && strcmp(signature->SignedInfo->CanonicalizationMethod->Algorithm, c14n_wc_URI) && strcmp(signature->SignedInfo->CanonicalizationMethod->Algorithm, exc_c14n_URI) && strcmp(signature->SignedInfo->CanonicalizationMethod->Algorithm, exc_c14n_wc_URI)) return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, "Invalid canonicalization method"); err = soap_smd_begin(soap, alg, key, keylen); /* emit all xmlns attributes of ancestors */ while (soap->nlist) { struct soap_nlist *np = soap->nlist->next; SOAP_FREE(soap, soap->nlist); soap->nlist = np; } /* push xmlns:ns="..." */ for (prt = elt->prnt; prt; prt = prt->prnt) { for (att = prt->atts; att; att = att->next) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM attribute = %s\n", att->name)); if (!strncmp(att->name, "xmlns:", 6) && !soap_lookup_ns(soap, att->name + 6, strlen(att->name + 6))) soap_attribute(soap, att->name, att->text); } } /* push xmlns="..." */ for (prt = elt->prnt; prt; prt = prt->prnt) { for (att = prt->atts; att; att = att->next) { if (!strcmp(att->name, "xmlns")) { soap_attribute(soap, att->name, att->text); break; } } } } else { /* compute digest over DOM "as is" */ soap->mode &= ~(SOAP_XML_CANONICAL | SOAP_XML_DOM); soap->mode |= SOAP_DOM_ASIS; err = soap_smd_begin(soap, alg, key, keylen); } /* do not dump namespace table xmlns bindings */ soap->ns = 2; /* compute digest */ soap->feltbegout = NULL; soap->feltendout = NULL; if (!err) err = soap_out_xsd__anyType(soap, NULL, 0, elt, NULL); soap->c14ninclude = c14ninclude; if (soap_smd_end(soap, sig, &siglen) || err) return soap_wsse_fault(soap, wsse__FailedCheck, "The signed SignedInfo SignatureValue is invalid"); if ((alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) { if (bits == 0) { if (siglen != sigvallen || memcmp(sig, sigval, siglen)) return soap_wsse_fault(soap, wsse__FailedCheck, "The HMAC-signed SignedInfo is invalid"); } else if (bits > 8 * siglen || memcmp(sig, sigval, 8 * bits)) { return soap_wsse_fault(soap, wsse__FailedCheck, "The HMAC-signed SignedInfo is invalid"); } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Signature in DOM is valid\n")); return SOAP_OK; } else { int err = SOAP_OK; const char *c14nexclude = soap->c14nexclude; const char *c14ninclude = soap->c14ninclude; soap_mode mode = soap->mode; short part = soap->part; /* serialize the SignedInfo element as it appeared in the SOAP Header */ soap->level = 4; soap->c14ninclude = NULL; soap->part = SOAP_IN_HEADER; /* header encoding rules (literal) */ soap->mode &= ~SOAP_XML_DOM; if (signature->SignedInfo->CanonicalizationMethod) soap->mode |= SOAP_XML_CANONICAL; else soap->mode &= ~SOAP_XML_CANONICAL; if ((alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) { sig = (char*)soap_malloc(soap, soap_smd_size(alg, key)); } else { sig = (char*)sigval; siglen = sigvallen; } err = soap_smd_begin(soap, alg, key, keylen); if (!err) err = soap_out_ds__SignedInfoType(soap, "ds:SignedInfo", 0, signature->SignedInfo, NULL); soap->mode = mode; soap->c14nexclude = c14nexclude; soap->c14ninclude = c14ninclude; soap->part = part; if (soap_smd_end(soap, sig, &siglen) || err) return soap_wsse_fault(soap, wsse__FailedCheck, "The signed serialized SignedInfo SignatureValue is invalid"); if ((alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) { if (bits == 0) { if (siglen != sigvallen || memcmp(sig, sigval, siglen)) return soap_wsse_fault(soap, wsse__FailedCheck, "The HMAC-signed serialized SignedInfo is invalid"); } else if (bits > 8 * siglen || memcmp(sig, sigval, 8 * bits)) { return soap_wsse_fault(soap, wsse__FailedCheck, "The HMAC-signed serialized SignedInfo is invalid"); } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Signature is valid\n")); return SOAP_OK; } } return soap_wsse_fault(soap, wsse__FailedCheck, "Signature with SignedInfo and SignatureValue required"); } /******************************************************************************/ /** @fn int soap_wsse_verify_SignedInfo(struct soap *soap) @brief Verifies the digest values of the XML elements referenced by the SignedInfo References. @param soap context @return SOAP_OK or fault This function searches for the SignedInfo element in the soap->dom DOM tree to verify the digests contained therein. Using the DOM ensures we will verify the digests of the locally signed elements as they were exactly received by the parser, by using the -DWITH_DOM compile flag and SOAP_XML_DOM runtime flag. If there is no DOM, the function fails. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_SignedInfo(struct soap *soap) { ds__SignedInfoType *signedInfo = soap_wsse_SignedInfo(soap); DBGFUN("soap_wsse_verify_SignedInfo"); if (signedInfo) { struct soap_dom_element *elt; int i; /* must have at least one reference element */ if (signedInfo->__sizeReference == 0) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Signature SignedInfo Reference required"); /* remove ds:Signature from the DOM to support enveloped signatures */ elt = soap_dom_find(soap->dom, soap->dom, ds_URI, "Signature", 0); if (elt) { elt->elts = NULL; elt->atts = NULL; elt->nstr = NULL; elt->name = NULL; elt->text = NULL; elt->code = NULL; } /* As an alternative to the current implementation, this might be a good place to re-canonicalize the entire DOM to improve interop. Two DOMs can be used: one with non-c14n XML and one with c14n XML so we can handle multiple different transforms. */ /* for each reference element, check the digest */ for (i = 0; i < signedInfo->__sizeReference; i++) { ds__ReferenceType *reference = signedInfo->Reference[i]; /* reference element is complete? */ if (!reference->URI || !reference->DigestMethod || !reference->DigestMethod->Algorithm || !reference->DigestValue) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Incomplete SignedInfo Reference"); /* reference is local? */ if (*reference->URI == '#') { int alg, canonical = 0; const char *c14ninclude = soap->c14ninclude; unsigned char hash[SOAP_SMD_MAX_SIZE]; /* digest algorithm */ if (!strcmp(reference->DigestMethod->Algorithm, ds_sha1URI)) alg = SOAP_SMD_DGST_SHA1; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) else if (!strcmp(reference->DigestMethod->Algorithm, ds_sha224URI)) alg = SOAP_SMD_DGST_SHA224; else if (!strcmp(reference->DigestMethod->Algorithm, ds_sha256URI)) alg = SOAP_SMD_DGST_SHA256; else if (!strcmp(reference->DigestMethod->Algorithm, ds_sha384URI)) alg = SOAP_SMD_DGST_SHA384; else if (!strcmp(reference->DigestMethod->Algorithm, ds_sha512URI)) alg = SOAP_SMD_DGST_SHA512; #endif else return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, reference->DigestMethod->Algorithm); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Verifying digest of locally referenced data %s alg=%x\n", reference->URI, alg)); soap->c14ninclude = NULL; /* if reference has a transform, it should be an c14n or exc-c14n transform */ if (reference->Transforms) { int i; for (i = 0; i < reference->Transforms->__sizeTransform; i++) { if (!reference->Transforms->Transform[i].Algorithm) return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, NULL); if (!strcmp(reference->Transforms->Transform[i].Algorithm, c14n_URI) || !strcmp(reference->Transforms->Transform[i].Algorithm, c14n_wc_URI)) { canonical = 1; } else if (!strcmp(reference->Transforms->Transform[i].Algorithm, exc_c14n_URI) || !strcmp(reference->Transforms->Transform[i].Algorithm, exc_c14n_wc_URI)) { canonical = 1; if (reference->Transforms->Transform[i].c14n__InclusiveNamespaces) soap->c14ninclude = reference->Transforms->Transform[i].c14n__InclusiveNamespaces->PrefixList; } else if (strcmp(reference->Transforms->Transform[i].Algorithm, ds_envsigURI)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unsupported Transform Algorithm %s\n", reference->Transforms->Transform[i].Algorithm)); /* ignore application-specific Transforms return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, reference->Transforms->Transform[i].Algorithm); */ } } } /* convert base64 digest to binary */ soap_base642s(soap, reference->DigestValue, (char*)hash, SOAP_SMD_MAX_SIZE, NULL); /* verify the digest of a locally signed element */ if (soap_wsse_verify_digest(soap, alg, canonical, reference->URI + 1, hash)) return soap->error; soap->c14ninclude = c14ninclude; } } return SOAP_OK; } return soap_wsse_fault(soap, wsse__InvalidSecurity, "Signature SignedInfo required"); } /******************************************************************************/ /** @fn int soap_wsse_verify_digest(struct soap *soap, int alg, int canonical, const char *id, unsigned char hash[SOAP_SMD_MAX_SIZE]) @brief Verifies the digest value of an XML element referenced by id against the hash. @param soap context @param[in] alg digest algorithm @param[in] canonical flag indicating that element is signed in c14n (inclusive or exclusive) @param[in] id string of the XML element to verify @param[in] hash digest value to verify against @return SOAP_OK or fault */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_digest(struct soap *soap, int alg, int canonical, const char *id, unsigned char hash[SOAP_SMD_MAX_SIZE]) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); struct soap_dom_element *elt, *dom = NULL; DBGFUN3("soap_wsse_verify_digest", "alg=%x", alg, "canonical=%d", canonical, "id=%s", id); if (!data) return soap_set_receiver_error(soap, "soap_wsse_verify_digest", "Plugin not registered", SOAP_PLUGIN_ERROR); /* traverse the DOM to find the element with matching wsu:Id or ds:Id */ for (elt = soap->dom; elt; elt = soap_dom_next_element(elt, NULL)) { struct soap_dom_attribute *att; for (att = elt->atts; att; att = att->next) { /* check if attribute is an wsu:Id or ds:Id or ID*/ if (att->name && ((att->nstr && (!strcmp(att->nstr, wsu_URI) || !strcmp(att->nstr, ds_URI)) && (!strcmp(att->name, "Id") || !soap_tag_cmp(att->name, "*:Id"))) || (!att->nstr && (!strcmp(att->name, "ID") || !strcmp(att->name, "AssertionID"))))) { /* found a match, compare attribute value with id */ if (att->text && !strcmp(att->text, id)) { if (dom) return soap_wsse_fault(soap, wsse__FailedCheck, "SignedInfo duplicate Id"); dom = elt; /* elt = NULL; break; */ /* improves speed but skips duplicate Id check */ } } } } if (dom) { unsigned char HA[SOAP_SMD_MAX_SIZE]; int len, err = SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Computing digest for Id=%s\n", id)); /* do not hash leading whitespace */ dom->lead = NULL; /* canonical or as-is? */ if (canonical) { struct soap_dom_element *prt; struct soap_dom_attribute *att; soap->mode &= ~SOAP_XML_DOM; soap->mode |= SOAP_XML_CANONICAL | SOAP_DOM_ASIS; err = soap_smd_begin(soap, alg, NULL, 0); /* emit all xmlns attributes of ancestors */ while (soap->nlist) { struct soap_nlist *np = soap->nlist->next; SOAP_FREE(soap, soap->nlist); soap->nlist = np; } for (prt = dom->prnt; prt; prt = prt->prnt) { for (att = prt->atts; att; att = att->next) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM attribute = %s\n", att->name)); if (!strncmp(att->name, "xmlns:", 6) && !soap_lookup_ns(soap, att->name + 6, strlen(att->name + 6))) soap_attribute(soap, att->name, att->text); } } for (prt = dom->prnt; prt; prt = prt->prnt) { for (att = prt->atts; att; att = att->next) { if (!strcmp(att->name, "xmlns")) { soap_attribute(soap, att->name, att->text); break; } } } } else { /* compute digest over DOM "as is" */ soap->mode &= ~SOAP_XML_CANONICAL; soap->mode |= SOAP_DOM_ASIS; err = soap_smd_begin(soap, alg, NULL, 0); } /* do not dump namespace table xmlns bindings */ soap->ns = 2; /* compute digest */ soap->feltbegout = NULL; soap->feltendout = NULL; /* root may have prefixes that should be retained as per soap->c14ninclude */ soap->event = SOAP_SEC_BEGIN; if (!err) err = soap_out_xsd__anyType(soap, NULL, 0, dom, NULL); if (soap_smd_end(soap, (char*)HA, &len) || err) return soap_wsse_fault(soap, wsse__FailedCheck, "Digest computation failed"); /* compare digests, success if identical */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Comparing digest hashes\n")); DBGHEX(TEST, hash, len); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--\n")); DBGHEX(TEST, HA, len); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); if (!memcmp(hash, HA, (size_t)len)) return SOAP_OK; return soap_wsse_fault(soap, wsse__FailedCheck, NULL); } if ((data->vrfy_alg & SOAP_WSSE_IGNORE_EXTRA_REFS)) return SOAP_OK; return soap_wsse_fault(soap, wsse__FailedCheck, "SignedInfo reference URI target not found"); } /******************************************************************************\ * * ds:Signature/KeyInfo * \******************************************************************************/ /** @fn ds__KeyInfoType* soap_wsse_add_KeyInfo(struct soap *soap) @brief Adds KeyInfo element. @param soap context @return ds__KeyInfo object */ SOAP_FMAC1 struct ds__KeyInfoType * SOAP_FMAC2 soap_wsse_add_KeyInfo(struct soap *soap) { ds__SignatureType *signature = soap_wsse_add_Signature(soap); if (!signature->KeyInfo) { signature->KeyInfo = (ds__KeyInfoType*)soap_malloc(soap, sizeof(ds__KeyInfoType)); if (!signature->KeyInfo) return NULL; } soap_default_ds__KeyInfoType(soap, signature->KeyInfo); return signature->KeyInfo; } /******************************************************************************/ /** @fn ds__KeyInfoType* soap_wsse_KeyInfo(struct soap *soap) @brief Returns KeyInfo element if present. @param soap context @return ds__KeyInfo object or NULL */ SOAP_FMAC1 struct ds__KeyInfoType * SOAP_FMAC2 soap_wsse_KeyInfo(struct soap *soap) { ds__SignatureType *signature = soap_wsse_Signature(soap); if (signature) return signature->KeyInfo; return NULL; } /******************************************************************************\ * * ds:Signature/KeyInfo/KeyName * \******************************************************************************/ /** @fn int soap_wsse_add_KeyInfo_KeyName(struct soap *soap, const char *name) @brief Adds KeyName element. @param soap context @param[in] name string of the KeyName @return SOAP_OK @note The recommended method to add Key information is to utilize KeyIdentifier instead of KeyName. A KeyName is useful mainly for internal use. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_KeyInfo_KeyName(struct soap *soap, const char *name) { ds__KeyInfoType *keyInfo = soap_wsse_add_KeyInfo(soap); DBGFUN1("soap_wsse_add_KeyInfo_KeyName", "name=%s", name); /* populate the KeyName element */ keyInfo->KeyName = soap_strdup(soap, name); return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_get_KeyInfo_KeyName(struct soap *soap) @brief Returns KeyName element if present. @param soap context @return string or NULL */ SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsse_get_KeyInfo_KeyName(struct soap *soap) { ds__KeyInfoType *keyInfo = soap_wsse_KeyInfo(soap); DBGFUN("soap_wsse_get_KeyInfo_KeyName"); if (!keyInfo) return NULL; return keyInfo->KeyName; } /******************************************************************************\ * * ds:Signature/KeyInfo/wsse:SecurityTokenReference/Reference/@URI * \******************************************************************************/ /** @fn int soap_wsse_add_KeyInfo_SecurityTokenReferenceURI(struct soap *soap, const char *URI, const char *valueType) @brief Adds KeyInfo element with SecurityTokenReference URI. @param soap context @param[in] URI string referencing a security token @param[in] valueType string or NULL @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_KeyInfo_SecurityTokenReferenceURI(struct soap *soap, const char *URI, const char *valueType) { ds__KeyInfoType *keyInfo = soap_wsse_add_KeyInfo(soap); DBGFUN2("soap_wsse_add_KeyInfo_SecurityTokenReferenceURI", "URI=%s", URI?URI:"", "valueType=%s", valueType?valueType:""); /* allocate SecurityTokenReference element if we don't have one already */ if (!keyInfo->wsse__SecurityTokenReference) { keyInfo->wsse__SecurityTokenReference = (_wsse__SecurityTokenReference*)soap_malloc(soap, sizeof(_wsse__SecurityTokenReference)); if (!keyInfo->wsse__SecurityTokenReference) return soap->error = SOAP_EOM; } soap_default__wsse__SecurityTokenReference(soap, keyInfo->wsse__SecurityTokenReference); /* allocate Reference element */ keyInfo->wsse__SecurityTokenReference->Reference = (_wsse__Reference*)soap_malloc(soap, sizeof(_wsse__Reference)); if (!keyInfo->wsse__SecurityTokenReference->Reference) return soap->error = SOAP_EOM; soap_default__wsse__Reference(soap, keyInfo->wsse__SecurityTokenReference->Reference); /* populate the Reference element */ keyInfo->wsse__SecurityTokenReference->Reference->URI = soap_strdup(soap, URI); keyInfo->wsse__SecurityTokenReference->Reference->ValueType = soap_strdup(soap, valueType); return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(struct soap *soap, const char *URI) @brief Adds KeyInfo element with SecurityTokenReference URI to an X509 cert. @param soap context @param[in] URI string referencing an X509 certificate @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(struct soap *soap, const char *URI) { return soap_wsse_add_KeyInfo_SecurityTokenReferenceURI(soap, URI, wsse_X509v3URI); } /******************************************************************************/ /** @fn const char* soap_wsse_get_KeyInfo_SecurityTokenReferenceURI(struct soap *soap) @brief Returns a SecurityTokenReference URI if present. @param soap context @return string or NULL */ SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsse_get_KeyInfo_SecurityTokenReferenceURI(struct soap *soap) { ds__KeyInfoType *keyInfo = soap_wsse_KeyInfo(soap); if (keyInfo && keyInfo->wsse__SecurityTokenReference && keyInfo->wsse__SecurityTokenReference->Reference) return keyInfo->wsse__SecurityTokenReference->Reference->URI; return NULL; } /******************************************************************************/ /** @fn const char* soap_wsse_get_KeyInfo_SecurityTokenReferenceValueType(struct soap *soap) @brief Returns a SecurityTokenReference ValueType if present. @param soap context @return string or NULL */ SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsse_get_KeyInfo_SecurityTokenReferenceValueType(struct soap *soap) { ds__KeyInfoType *keyInfo = soap_wsse_KeyInfo(soap); if (keyInfo && keyInfo->wsse__SecurityTokenReference && keyInfo->wsse__SecurityTokenReference->Reference) return keyInfo->wsse__SecurityTokenReference->Reference->ValueType; return NULL; } /******************************************************************************/ /** @fn X509* soap_wsse_get_KeyInfo_SecurityTokenReferenceX509(struct soap *soap) @brief Returns a X509 certificate when referenced and present as a BinarySecurity token or when embedded in the signature KeyIdentifier or KeyInfo element. This call must be followed by an X509_free to deallocate the X509 certificate data. @param soap context @return X509 object or NULL with wsse:SecurityTokenUnavailable fault */ SOAP_FMAC1 X509* SOAP_FMAC2 soap_wsse_get_KeyInfo_SecurityTokenReferenceX509(struct soap *soap) { const char *URI = soap_wsse_get_KeyInfo_SecurityTokenReferenceURI(soap); X509 *cert = NULL; DBGFUN("soap_wsse_get_KeyInfo_SecurityTokenReferenceX509"); if (URI && *URI == '#') { const char *valueType; valueType = soap_wsse_get_KeyInfo_SecurityTokenReferenceValueType(soap); if (!valueType || !strcmp(valueType, wsse_X509v3URI)) cert = soap_wsse_get_BinarySecurityTokenX509(soap, URI + 1); } else if (!URI) { #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) const unsigned char *der = NULL; #else unsigned char *der = NULL; #endif int derlen; ds__KeyInfoType *keyInfo = soap_wsse_KeyInfo(soap); if (keyInfo && keyInfo->X509Data && keyInfo->X509Data->X509Certificate) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Using X509 cert from KeyInfo to verify signature\n")); der = (unsigned char*)soap_base642s(soap, keyInfo->X509Data->X509Certificate, NULL, 0, &derlen); } else { const char *valueType = soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifierValueType(soap, keyInfo); if (valueType && !strcmp(valueType, ds_hmac_sha1URI)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Using X509 cert from KeyIdentifier to verify signature\n")); der = (unsigned char*)soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifier(soap, keyInfo, &derlen); } } if (der) { cert = d2i_X509(NULL, &der, derlen); /* verify the certificate */ if (cert && soap_wsse_verify_X509(soap, cert)) { X509_free(cert); cert = NULL; } } } return cert; } /******************************************************************************/ /** @fn int soap_wsse_add_KeyInfo_X509Certificate(struct soap *soap, X509 *cert) @brief Adds KeyInfo/X509Data/X509Certificate. @param soap context @param[in] cert X509 certificate @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_KeyInfo_X509Certificate(struct soap *soap, X509 *cert) { ds__KeyInfoType *keyInfo = soap_wsse_add_KeyInfo(soap); int derlen; unsigned char *der, *s; DBGFUN("soap_wsse_add_KeyInfo_X509Certificate"); if (!cert) return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Missing certificate"); if (!keyInfo) return soap->error = SOAP_EOM; /* populate the X509Data element */ keyInfo->X509Data = (struct ds__X509DataType*)soap_malloc(soap, sizeof(struct ds__X509DataType)); if (!keyInfo->X509Data) return soap->error = SOAP_EOM; soap_default_ds__X509DataType(soap, keyInfo->X509Data); /* determine the storage requirement */ derlen = i2d_X509(cert, NULL); if (derlen < 0) return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Invalid certificate"); /* use the gSOAP engine's look-aside buffer to temporarily hold the cert */ if (soap_store_lab(soap, NULL, derlen)) return SOAP_EOM; s = der = (unsigned char*)soap->labbuf; /* store in DER format */ i2d_X509(cert, &s); /* populate the X509Certificate with base64 certificate data */ keyInfo->X509Data->X509Certificate = soap_s2base64(soap, der, NULL, derlen); return SOAP_OK; } /******************************************************************************/ /** @fn struct ds__X509IssuerSerialType *soap_wsse_get_KeyInfo_SecurityTokenReferenceX509Data(struct soap *soap) @brief Returns ds__X509IssuerSerialType with non-NULL X509IssuerName and non-NULL X509SerialNumber of a X509Data element when present and set. @param soap context @return pointer to ds__X509IssuerSerialType struct or NULL */ SOAP_FMAC1 struct ds__X509IssuerSerialType * SOAP_FMAC2 soap_wsse_get_KeyInfo_SecurityTokenReferenceX509Data(struct soap *soap) { ds__KeyInfoType *keyInfo = soap_wsse_KeyInfo(soap); if (keyInfo && keyInfo->wsse__SecurityTokenReference && keyInfo->wsse__SecurityTokenReference->ds__X509Data && keyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial && keyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial->X509IssuerName && keyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial->X509SerialNumber) return keyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial; return NULL; } /******************************************************************************\ * * ds:Signature/KeyInfo/wsse:SecurityTokenReference/Reference/KeyIdentifier * \******************************************************************************/ /** @fn int soap_wsse_add_KeyInfo_SecurityTokenReferenceKeyIdentifier(struct soap *soap, const char *id, const char *valueType, unsigned char *data, int size) @brief Adds KeyInfo element with SecurityTokenReference/KeyIdentifier binary data. @param soap context @param[in] id string for signature reference @param[in] valueType string @param[in] data binary data @param[in] size of binary data @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_KeyInfo_SecurityTokenReferenceKeyIdentifier(struct soap *soap, const char *id, const char *valueType, unsigned char *data, int size) { ds__KeyInfoType *keyInfo = soap_wsse_add_KeyInfo(soap); DBGFUN2("soap_wsse_add_KeyInfo_SecurityTokenReferenceKeyIdentifier", "id=%s", id?id:"", "valueType=%s", valueType?valueType:""); /* allocate SecurityTokenReference if we don't have one already */ if (!keyInfo->wsse__SecurityTokenReference) { keyInfo->wsse__SecurityTokenReference = (_wsse__SecurityTokenReference*)soap_malloc(soap, sizeof(_wsse__SecurityTokenReference)); if (!keyInfo->wsse__SecurityTokenReference) return soap->error = SOAP_EOM; } soap_default__wsse__SecurityTokenReference(soap, keyInfo->wsse__SecurityTokenReference); /* allocate KeyIdentifier */ keyInfo->wsse__SecurityTokenReference->KeyIdentifier = (_wsse__KeyIdentifier*)soap_malloc(soap, sizeof(_wsse__KeyIdentifier)); if (!keyInfo->wsse__SecurityTokenReference->KeyIdentifier) return soap->error = SOAP_EOM; soap_default__wsse__KeyIdentifier(soap, keyInfo->wsse__SecurityTokenReference->KeyIdentifier); /* populate KeyIdentifier */ keyInfo->wsse__SecurityTokenReference->KeyIdentifier->wsu__Id = soap_strdup(soap, id); keyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType = soap_strdup(soap, valueType); keyInfo->wsse__SecurityTokenReference->KeyIdentifier->EncodingType = (char*)wsse_Base64BinaryURI; keyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item = soap_s2base64(soap, data, NULL, size); return SOAP_OK; } /******************************************************************************/ /** @fn const char* soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifierValueType(struct soap *soap, ds__KeyInfoType *keyInfo) @brief Returns KeyInfo/SecurityTokenReference/KeyIdentifier/ValueType if present. @param soap context @param keyInfo points to ds__KeyInfoType, e.g. using soap_wsse_KeyInfo(soap) @return string or NULL */ SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifierValueType(struct soap *soap, ds__KeyInfoType *keyInfo) { DBGFUN("soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifierValueType"); if (!keyInfo || !keyInfo->wsse__SecurityTokenReference || !keyInfo->wsse__SecurityTokenReference->KeyIdentifier) return NULL; return keyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType; } /******************************************************************************/ /** @fn const unsigned char* soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifier(struct soap *soap, ds__KeyInfoType *keyInfo, int *size) @brief Returns KeyInfo/SecurityTokenReference/KeyIdentifier binary data. @param soap context @param keyInfo points to ds__KeyInfoType, e.g. using soap_wsse_KeyInfo(soap) @param[out] size is set to the size of the decoded data @return data or NULL */ SOAP_FMAC1 const unsigned char * SOAP_FMAC2 soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifier(struct soap *soap, ds__KeyInfoType *keyInfo, int *size) { DBGFUN("soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifier"); if (!keyInfo || !keyInfo->wsse__SecurityTokenReference || !keyInfo->wsse__SecurityTokenReference->KeyIdentifier) return NULL; if (!keyInfo->wsse__SecurityTokenReference->KeyIdentifier->EncodingType || !strcmp(keyInfo->wsse__SecurityTokenReference->KeyIdentifier->EncodingType, wsse_Base64BinaryURI)) return (unsigned char*)soap_base642s(soap, keyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item, NULL, 0, size); else return (unsigned char*)soap_hex2s(soap, keyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item, NULL, 0, size); } /******************************************************************************\ * * ds:Signature/KeyInfo/wsse:SecurityTokenReference/Reference/Embedded * \******************************************************************************/ /** @fn int soap_wsse_add_KeyInfo_SecurityTokenReferenceEmbedded(struct soap *soap, const char *id, const char *valueType) @brief Adds KeyInfo element with Embedded SecurityTokenReference. @param soap context @param[in] id string for signature reference @param[in] valueType string @return SOAP_OK @note This function does not add embedded tokens automatically. See code for comments. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_KeyInfo_SecurityTokenReferenceEmbedded(struct soap *soap, const char *id, const char *valueType) { ds__KeyInfoType *keyInfo = soap_wsse_add_KeyInfo(soap); DBGFUN("soap_wsse_get_KeyInfo_SecurityTokenReferenceEmbedded"); /* allocate SecurityTokenReference if we don't have one already */ if (!keyInfo->wsse__SecurityTokenReference) { keyInfo->wsse__SecurityTokenReference = (_wsse__SecurityTokenReference*)soap_malloc(soap, sizeof(_wsse__SecurityTokenReference)); if (!keyInfo->wsse__SecurityTokenReference) return soap->error = SOAP_EOM; } soap_default__wsse__SecurityTokenReference(soap, keyInfo->wsse__SecurityTokenReference); /* allocate Embedded element */ keyInfo->wsse__SecurityTokenReference->Embedded = (_wsse__Embedded*)soap_malloc(soap, sizeof(_wsse__Embedded)); if (!keyInfo->wsse__SecurityTokenReference->Embedded) return soap->error = SOAP_EOM; soap_default__wsse__Embedded(soap, keyInfo->wsse__SecurityTokenReference->Embedded); /* populate Embedded element */ keyInfo->wsse__SecurityTokenReference->Embedded->wsu__Id = soap_strdup(soap, id); keyInfo->wsse__SecurityTokenReference->Embedded->ValueType = soap_strdup(soap, valueType); /* TODO: Add embedded tokens and assertions. Could use DOM here? keyInfo->wsse__SecurityTokenReference->Embedded->xyz = ...; */ return SOAP_OK; } /******************************************************************************\ * * wsse:Security/xenc:EncryptedKey header element * \******************************************************************************/ /** @fn int soap_wsse_add_EncryptedKey(struct soap *soap, int alg, const char *URI, X509 *cert, const char *subjectkeyid, const char *issuer, const char *serial) @brief Adds EncryptedKey header element and initiates the encryption of the SOAP Body. @param soap context @param[in] alg algorithm to use, SOAP_MEC_ENV_ENC_DES_CBC etc. @param[in] URI a unique identifier for the key, required for interoperability @param[in] cert the X509 certificate with public key or NULL @param[in] subjectkeyid string identification of the subject which when set to non-NULL is used instead of embedding the public key in the message @param[in] issuer string to include SecurityTokenReference/X509Data @param[in] serial string to include SecurityTokenReference/X509Data @return SOAP_OK or error code This function adds the encrypted key or subject key ID to the WS-Security header and initiates encryption of the SOAP Body. An X509 certificate may be provided, or the subjectkeyid, or the issuer and serial number. The certificate is embedded in the WS-Security EncryptedKey header. If the subjectkeyid string is non-NULL the subject key ID is used in the EncryptedKey header instead of the X509 certificate content. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_EncryptedKey(struct soap *soap, int alg, const char *URI, X509 *cert, const char *subjectkeyid, const char *issuer, const char *serial) { return soap_wsse_add_EncryptedKey_encrypt_only(soap, alg, URI, cert, subjectkeyid, issuer, serial, NULL); } /******************************************************************************/ /** @fn int soap_wsse_add_EncryptedKey_encrypt_only(struct soap *soap, int alg, const char *URI, X509 *cert, const char *subjectkeyid, const char *issuer, const char *serial, const char *tags) @brief Adds EncryptedKey header element and initiates encryption of the given XML elements specified in the tags string. Should be used in combination with soap_wsse_set_wsu_id to set wsu:Id for given XML element tags. @param soap context @param[in] alg algorithm to use, SOAP_MEC_ENV_ENC_DES_CBC etc. @param[in] URI a unique identifier for the key, required for interoperability @param[in] cert the X509 certificate with public key or NULL @param[in] subjectkeyid string identification of the subject which when set to non-NULL is used instead of embedding the public key in the message @param[in] issuer string to include SecurityTokenReference/X509Data @param[in] serial string to include SecurityTokenReference/X509Data @param[in] tags space-separated string of element tag names to encrypt @return xenc__EncryptedKeyType object This function adds the encrypted key or subject key ID to the WS-Security header and initiates encryption of the SOAP Body. An X509 certificate may be provided, or the subjectkeyid, or the issuer and serial number. The certificate is embedded in the WS-Security EncryptedKey header. If the subjectkeyid string is non-NULL the subject key ID is used in the EncryptedKey header instead of the X509 certificate content. Only the XML elements given in the 'tags' string as wsu:Id attributed elements are encrypted. @warning Use @ref soap_wsse_add_EncryptedKey_encrypt_only only in combination with @ref soap_wsse_set_wsu_id with the tag names of the elements to be encrypted. OTHERWISE THE GIVEN XML ELEMENTS ARE NOT ENCRYPTED AND WILL BE SENT IN THE CLEAR. @warning The elements identified with @ref soap_wsse_set_wsu_id to encrypt MUST occur EXACTLY ONCE in the SOAP Body. @warning Encryption/decryption of elements with simple content (CDATA content) IS NOT SUPPORTED. This means that elements you want to encrypt with this function must have complex content. That is, only encrypt elements with sub elements or encrypt the entire SOAP Body. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_EncryptedKey_encrypt_only(struct soap *soap, int alg, const char *URI, X509 *cert, const char *subjectkeyid, const char *issuer, const char *serial, const char *tags) { EVP_PKEY *pubk; unsigned char *key; int keylen; _wsse__Security *security; struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_add_EncryptedKey_encrypt_only"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_add_EncryptedKey_encrypt_only", "Plugin not registered", SOAP_PLUGIN_ERROR); security = soap_wsse_add_Security(soap); /* if we don't have a xenc:EncryptedKey, create one */ if (!security->xenc__EncryptedKey) { security->xenc__EncryptedKey = (xenc__EncryptedKeyType*)soap_malloc(soap, sizeof(xenc__EncryptedKeyType)); if (!security->xenc__EncryptedKey) return soap->error = SOAP_EOM; } soap_default_xenc__EncryptedKeyType(soap, security->xenc__EncryptedKey); security->xenc__EncryptedKey->Id = soap_strdup(soap, URI); security->xenc__EncryptedKey->EncryptionMethod = (xenc__EncryptionMethodType*)soap_malloc(soap, sizeof(struct xenc__EncryptionMethodType)); if (!security->xenc__EncryptedKey->EncryptionMethod) return soap->error = SOAP_EOM; soap_default_xenc__EncryptionMethodType(soap, security->xenc__EncryptedKey->EncryptionMethod); /* RSA Version 1.5 or RSA-OAEP? */ alg |= (SOAP_MEC_ENV | SOAP_MEC_ENC); if (alg & SOAP_MEC_OAEP) { security->xenc__EncryptedKey->EncryptionMethod->Algorithm = (char*)xenc_rsaesURI; security->xenc__EncryptedKey->EncryptionMethod->OAEPparams = NULL; security->xenc__EncryptedKey->EncryptionMethod->ds__DigestMethod = (struct ds__DigestMethodType*)soap_malloc(soap, sizeof(struct ds__DigestMethodType)); if (!security->xenc__EncryptedKey->EncryptionMethod->ds__DigestMethod) return soap->error = SOAP_EOM; soap_default_ds__DigestMethodType(soap, security->xenc__EncryptedKey->EncryptionMethod->ds__DigestMethod); security->xenc__EncryptedKey->EncryptionMethod->ds__DigestMethod->Algorithm = (char*)ds_sha1URI; } else { security->xenc__EncryptedKey->EncryptionMethod->Algorithm = (char*)xenc_rsa15URI; } /* KeyInfo */ security->xenc__EncryptedKey->ds__KeyInfo = (_ds__KeyInfo*)soap_malloc(soap, sizeof(_ds__KeyInfo)); if (!security->xenc__EncryptedKey->ds__KeyInfo) return soap->error = SOAP_EOM; soap_default__ds__KeyInfo(soap, security->xenc__EncryptedKey->ds__KeyInfo); /* allocate SecurityTokenReference */ security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference = (_wsse__SecurityTokenReference*)soap_malloc(soap, sizeof(_wsse__SecurityTokenReference)); if (!security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference) return soap->error = SOAP_EOM; soap_default__wsse__SecurityTokenReference(soap, security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference); if (issuer && serial) { security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data = (struct ds__X509DataType*)soap_malloc(soap, sizeof(struct ds__X509DataType)); if (!security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data) return soap->error = SOAP_EOM; soap_default_ds__X509DataType(soap, security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data); security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial = (struct ds__X509IssuerSerialType*)soap_malloc(soap, sizeof(struct ds__X509IssuerSerialType)); if (!security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial) return soap->error = SOAP_EOM; soap_default_ds__X509IssuerSerialType(soap, security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial); security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial->X509IssuerName = soap_strdup(soap, issuer); security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial->X509SerialNumber = soap_strdup(soap, serial); } else { /* allocate KeyIdentifier */ security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier = (_wsse__KeyIdentifier*)soap_malloc(soap, sizeof(_wsse__KeyIdentifier)); if (!security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier) return soap->error = SOAP_EOM; soap_default__wsse__KeyIdentifier(soap, security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier); /* populate KeyIdentifier */ security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->EncodingType = (char*)wsse_Base64BinaryURI; if (subjectkeyid) { security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType = (char*)wsse_X509v3SubjectKeyIdentifierURI; security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item = soap_s2base64(soap, (unsigned char*)subjectkeyid, NULL, strlen(subjectkeyid)); } else if (cert) { unsigned char *der, *s; int derlen; security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType = (char*)wsse_X509v3URI; /* determine the storage requirement */ derlen = i2d_X509(cert, NULL); if (derlen < 0) return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Invalid certificate passed to soap_wsse_add_EncryptedKey_encrypt_only"); /* use the gSOAP engine's look-aside buffer to temporarily hold the cert */ if (soap_store_lab(soap, NULL, derlen)) return SOAP_EOM; s = der = (unsigned char*)soap->labbuf; /* store in DER format */ i2d_X509(cert, &s); security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item = soap_s2base64(soap, der, NULL, derlen); } } /* CipherData */ security->xenc__EncryptedKey->CipherData = (xenc__CipherDataType*)soap_malloc(soap, sizeof(struct xenc__CipherDataType)); if (!security->xenc__EncryptedKey->CipherData) return soap->error = SOAP_EOM; soap_default_xenc__CipherDataType(soap, security->xenc__EncryptedKey->CipherData); /* get the public key */ pubk = X509_get_pubkey(cert); if (!pubk) return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Invalid certificate passed to soap_wsse_add_EncryptedKey_encrypt_only"); /* start encryption engine, get the encrypted secret key */ key = (unsigned char*)soap_malloc(soap, soap_mec_size(alg, pubk)); if (!key) return soap->error = SOAP_EOM; if (data->mec) soap_mec_cleanup(soap, data->mec); else data->mec = (struct soap_mec_data*)SOAP_MALLOC(soap, sizeof(struct soap_mec_data)); if (!data->mec) return soap->error = SOAP_EOM; if (soap_mec_begin(soap, data->mec, alg, pubk, key, &keylen)) { EVP_PKEY_free(pubk); return soap->error; } EVP_PKEY_free(pubk); data->enco_alg = alg; data->enco_keyname = NULL; data->enco_key = key; data->enco_keylen = keylen; security->xenc__EncryptedKey->CipherData->CipherValue = soap_s2base64(soap, key, NULL, keylen); if (!security->xenc__EncryptedKey->CipherData->CipherValue) return soap->error = SOAP_EOM; data->encid = soap_strdup(soap, tags); if (!tags) { soap->omode |= SOAP_SEC_WSUID; if (soap_wsse_add_EncryptedKey_DataReferenceURI(soap, "#SOAP-ENV_Body")) return soap->error; } else { char *s, *t; size_t l = strlen(tags); /* make space to insert # to each id converted from a tag name */ t = (char*)soap_malloc(soap, l + 2); if (!t) return soap->error = SOAP_EOM; *t = '#'; soap_strcpy(t + 1, l + 1, tags); s = soap_wsse_ids(soap, t, '_'); if (!s) return soap->error = SOAP_EOM; s++; for (;;) { t = strchr(s, ' '); if (t) *t = '\0'; *--s = '#'; if (soap_wsse_add_EncryptedKey_DataReferenceURI(soap, s)) return soap->error; if (!t) break; s = t + 1; while (*s == ' ') s++; } if (soap_tagsearch(data->encid, "ds:Signature")) { /* support ds:Signature encryption only with HTTP chunking, otherwise content length is incorrect */ if ((soap->omode & SOAP_IO) == SOAP_IO_BUFFER) soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_CHUNK; } } soap->feltbegout = soap_wsse_element_begin_out; soap->feltendout = soap_wsse_element_end_out; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_verify_EncryptedKey(struct soap *soap) @brief Verifies the EncryptedKey header information (certificate validity requires soap->cafile to be set). Retrieves the decryption key from the token handler callback to decrypt the decryption key. @param soap context @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_EncryptedKey(struct soap *soap) { struct soap_wsse_data *data; int keybase = 1; const char *keytype = NULL; const char *keydata = NULL; const char *keyname = NULL; const char *keyalgo = NULL; const char *keytemp = NULL; data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); if (!data) return soap_set_receiver_error(soap, "soap_wsse_verify_EncryptedKey", "Plugin not registered", SOAP_PLUGIN_ERROR); #if 0 /* deprecated */ _wsse__Security *security = soap_wsse_Security(soap); if (security) { /* SOAP header is complete when parsing the SOAP Body */ if (!security->xenc__EncryptedKey) return SOAP_OK; if (!security->xenc__EncryptedKey->EncryptionMethod || !security->xenc__EncryptedKey->EncryptionMethod->Algorithm) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid Encryption algorithm or key"); if (security->xenc__EncryptedKey->ds__KeyInfo) { if (security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference && security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier && security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType && security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item) { if (security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->EncodingType) keybase = !strcmp(security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->EncodingType, wsse_Base64BinaryURI); keytype = security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType; keydata = security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item; } if (security->xenc__EncryptedKey->ds__KeyInfo->KeyName) keyname = security->xenc__EncryptedKey->ds__KeyInfo->KeyName; else if (security->xenc__EncryptedKey->ds__KeyInfo->X509Data && security->xenc__EncryptedKey->ds__KeyInfo->X509Data->X509SubjectName) keyname = security->xenc__EncryptedKey->ds__KeyInfo->X509Data->X509SubjectName; keyalgo = security->xenc__EncryptedKey->EncryptionMethod->Algorithm; } if (security->xenc__EncryptedKey->CipherData && security->xenc__EncryptedKey->CipherData->CipherValue) keytemp = security->xenc__EncryptedKey->CipherData->CipherValue; /* do not process EncryptedKey again */ security->xenc__EncryptedKey = NULL; } else #endif { /* SOAP header is incomplete while parsing the SOAP Header, so get EncryptedKey from DOM */ if (soap->dom) { struct soap_dom_element *ek = soap_dom_find(soap->dom, soap->dom, xenc_URI, "EncryptedKey", 0); DBGFUN("soap_wsse_verify_EncryptedKey"); if (ek) { struct soap_dom_element *ki; struct soap_dom_element *cd; struct soap_dom_element *elt; struct soap_dom_attribute *att; elt = soap_elt_get(ek, xenc_URI, "EncryptionMethod"); if (elt) { att = soap_att_get(elt, NULL, "Algorithm"); if (att) keyalgo = soap_att_get_text(att); } if (!keyalgo) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid Encryption algorithm or key"); ki = soap_elt_get(ek, ds_URI, "KeyInfo"); if (ki) { elt = soap_elt_get(ki, wsse_URI, "SecurityTokenReference"); if (elt) { elt = soap_elt_get(elt, wsse_URI, "KeyIdentifier"); if (elt) { att = soap_att_get(elt, NULL, "EncodingType"); if (att) keybase = !strcmp(soap_att_get_text(att), wsse_Base64BinaryURI); att = soap_att_get(elt, NULL, "ValueType"); keytype = soap_att_get_text(att); keydata = soap_elt_get_text(elt); } } elt = soap_elt_get(ki, ds_URI, "KeyName"); if (elt) { keyname = soap_elt_get_text(elt); } else { elt = soap_elt_get(ki, ds_URI, "X509Data"); if (elt) { keyname = soap_elt_get_text(soap_elt_get(elt, ds_URI, "X509SubjectName")); elt = soap_elt_get(elt, ds_URI, "X509IssuerSerial"); if (elt) { keyname = soap_elt_get_text(soap_elt_get(elt, ds_URI, "X509IssuerName")); if (keyname) { const char *t = soap_elt_get_text(soap_elt_get(elt, ds_URI, "X509SerialNumber")); if (t) { size_t n = strlen(keyname) + strlen(t) + 2; char *s = (char*)soap_malloc(soap, n); (SOAP_SNPRINTF_SAFE(s, n), "%s#%s", keyname, t); keyname = s; } } } } } } cd = soap_elt_get(ek, xenc_URI, "CipherData"); if (cd) { elt = soap_elt_get(cd, xenc_URI, "CipherValue"); keytemp = soap_elt_get_text(elt); } } } } if (keyalgo) { int keylen; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Verify EncryptedKey %s alg=%x\n", keyalgo, data->deco_alg)); if (keydata) { if (!strcmp(keytype, wsse_X509v3URI)) { X509 *cert = NULL; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) const unsigned char *der; #else unsigned char *der; #endif int derlen; if (keybase) der = (unsigned char*)soap_base642s(soap, keydata, NULL, 0, &derlen); else der = (unsigned char*)soap_hex2s(soap, keydata, NULL, 0, &derlen); if (!der) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid Encryption algorithm or key"); cert = d2i_X509(&cert, &der, derlen); if (soap_wsse_verify_X509(soap, cert)) { if (cert) X509_free(cert); return soap->error; } /* get the private key from subject name of cert, if not set */ if (!data->deco_key && data->security_token_handler) { char buf[1024]; X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)-1); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting private key from cert name '%s' through security_token_handler callback\n", buf)); data->deco_alg = SOAP_MEC_ENV_DEC_DES_CBC; data->deco_key = data->security_token_handler(soap, &data->deco_alg, buf, NULL, 0, &keylen); data->deco_keylen = 0; } if (cert) X509_free(cert); } else if (!data->deco_key && data->security_token_handler && !strcmp(keytype, wsse_X509v3SubjectKeyIdentifierURI)) { const unsigned char *subjectkeyid; int subjectkeyidlen; if (keybase) subjectkeyid = (unsigned char*)soap_base642s(soap, keydata, NULL, 0, &subjectkeyidlen); else subjectkeyid = (unsigned char*)soap_hex2s(soap, keydata, NULL, 0, &subjectkeyidlen); /* get the private key from subject key id */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting private key from key id '%s' through security_token_handler callback\n", subjectkeyid)); data->deco_alg = SOAP_MEC_ENV_DEC_DES_CBC; data->deco_key = data->security_token_handler(soap, &data->deco_alg, NULL, subjectkeyid, subjectkeyidlen, &keylen); data->deco_keylen = 0; } } else if (!data->deco_key && data->security_token_handler && keyname) { /* get the private key from key name or subject name */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting private key from name '%s' through security_token_handler callback\n", keyname)); data->deco_alg = SOAP_MEC_ENV_DEC_DES_CBC; data->deco_key = data->security_token_handler(soap, &data->deco_alg, keyname, NULL, 0, &keylen); data->deco_keylen = 0; } /* start decryption */ if (data->deco_key && keytemp) { int keylen; unsigned char *key = (unsigned char*)soap_base642s(soap, keytemp, NULL, 0, &keylen); if (!strcmp(keyalgo, xenc_rsaesURI)) data->deco_alg |= SOAP_MEC_OAEP; else if (strcmp(keyalgo, xenc_rsa15URI)) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid Encryption algorithm or key"); if (data->mec) soap_mec_cleanup(soap, data->mec); else data->mec = (struct soap_mec_data*)SOAP_MALLOC(soap, sizeof(struct soap_mec_data)); if (!data->mec) return soap->error = SOAP_EOM; if (soap_mec_begin(soap, data->mec, data->deco_alg, (SOAP_MEC_KEY_TYPE*)data->deco_key, key, &keylen)) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Verified EncryptedKey alg=%x\n", data->deco_alg)); } return SOAP_OK; } /******************************************************************************/ /** @fn void soap_wsse_delete_EncryptedKey(struct soap *soap) @brief Deletes EncryptedKey header element. @param soap context */ SOAP_FMAC1 void SOAP_FMAC2 soap_wsse_delete_EncryptedKey(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); DBGFUN("soap_wsse_delete_EncryptedKey"); if (security) security->xenc__EncryptedKey = NULL; } /******************************************************************************/ /** @fn xenc__EncryptedKeyType* soap_wsse_EncryptedKey(struct soap *soap) @brief Returns EncryptedKey header element if present. @param soap context @return xenc__EncryptedKeyType object or NULL */ SOAP_FMAC1 struct xenc__EncryptedKeyType * SOAP_FMAC2 soap_wsse_EncryptedKey(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); if (security) return security->xenc__EncryptedKey; return NULL; } /******************************************************************************\ * * wsse:Security/xenc:EncryptedKey/ReferenceList/DataReference * \******************************************************************************/ /** @fn int soap_wsse_add_EncryptedKey_DataReferenceURI(struct soap *soap, const char *URI) @brief Adds a DataReference URI to the EncryptedKey header element. @param soap context @param[in] URI value of the URI ID @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_EncryptedKey_DataReferenceURI(struct soap *soap, const char *URI) { _wsse__Security *security = soap_wsse_add_Security(soap); _xenc__ReferenceList *ref; int k, n = 0; DBGFUN1("soap_wsse_add_EncryptedKey_DataReferenceURI", "URI=%s", URI?URI:""); if (!security->xenc__EncryptedKey) { security->xenc__EncryptedKey = (xenc__EncryptedKeyType*)soap_malloc(soap, sizeof(xenc__EncryptedKeyType)); if (!security->xenc__EncryptedKey) return soap->error = SOAP_EOM; soap_default_xenc__EncryptedKeyType(soap, security->xenc__EncryptedKey); } if (!security->xenc__EncryptedKey->ReferenceList) { security->xenc__EncryptedKey->ReferenceList = (struct _xenc__ReferenceList*)soap_malloc(soap, sizeof(struct _xenc__ReferenceList)); if (!security->xenc__EncryptedKey->ReferenceList) return soap->error = SOAP_EOM; soap_default__xenc__ReferenceList(soap, security->xenc__EncryptedKey->ReferenceList); } ref = security->xenc__EncryptedKey->ReferenceList; k = ref->__size_ReferenceList++; /* need to increase space? */ if (k < 0) return soap->error = SOAP_EOM; if (k == 0) n = 1; else if (k >= 1 && (k & (k - 1)) == 0) n = 2 * k; /* yes we do */ if (n) { struct __xenc__union_ReferenceList *tmp = (struct __xenc__union_ReferenceList*)soap_malloc(soap, n * sizeof(struct __xenc__union_ReferenceList)); int i; if (!tmp) return soap->error = SOAP_EOM; for (i = 0; i < k; i++) tmp[i] = ref->__union_ReferenceList[i]; security->xenc__EncryptedKey->ReferenceList->__union_ReferenceList = tmp; ref = security->xenc__EncryptedKey->ReferenceList; } /* add entry */ soap_default___xenc__union_ReferenceList(soap, &ref->__union_ReferenceList[k]); ref->__union_ReferenceList[k].DataReference = (struct xenc__ReferenceType*)soap_malloc(soap, sizeof(struct xenc__ReferenceType)); if (!ref->__union_ReferenceList[k].DataReference) return soap->error = SOAP_EOM; soap_default_xenc__ReferenceType(soap, ref->__union_ReferenceList[k].DataReference); ref->__union_ReferenceList[k].DataReference->URI = soap_strdup(soap, URI); return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_add_DataReferenceURI(struct soap *soap, const char *URI) @brief Adds a DataReference URI to the Security header element. @param soap context @param[in] URI value of the URI ID @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_DataReferenceURI(struct soap *soap, const char *URI) { _wsse__Security *security = soap_wsse_add_Security(soap); _xenc__ReferenceList *ref; int k, n = 0; DBGFUN1("soap_wsse_add_DataReferenceURI", "URI=%s", URI?URI:""); /* initial alloc */ if (!security->xenc__ReferenceList) { security->xenc__ReferenceList = (struct _xenc__ReferenceList*)soap_malloc(soap, sizeof(struct _xenc__ReferenceList)); if (!security->xenc__ReferenceList) return soap->error = SOAP_EOM; soap_default__xenc__ReferenceList(soap, security->xenc__ReferenceList); } ref = security->xenc__ReferenceList; k = ref->__size_ReferenceList++; /* need to increase space? */ if (k < 0) return soap->error = SOAP_EOM; if (k == 0) n = 1; else if (k >= 1 && (k & (k - 1)) == 0) n = 2 * k; /* yes we do */ if (n) { struct __xenc__union_ReferenceList *tmp = (struct __xenc__union_ReferenceList*)soap_malloc(soap, n * sizeof(struct __xenc__union_ReferenceList)); int i; if (!tmp) return soap->error = SOAP_EOM; for (i = 0; i < k; i++) tmp[i] = ref->__union_ReferenceList[i]; security->xenc__ReferenceList->__union_ReferenceList = tmp; ref = security->xenc__ReferenceList; } /* add entry */ soap_default___xenc__union_ReferenceList(soap, &ref->__union_ReferenceList[k]); ref->__union_ReferenceList[k].DataReference = (struct xenc__ReferenceType*)soap_malloc(soap, sizeof(struct xenc__ReferenceType)); if (!ref->__union_ReferenceList[k].DataReference) return soap->error = SOAP_EOM; soap_default_xenc__ReferenceType(soap, ref->__union_ReferenceList[k].DataReference); ref->__union_ReferenceList[k].DataReference->URI = soap_strdup(soap, URI); return SOAP_OK; } /******************************************************************************\ * * xenc:EncryptedData/ds:KeyInfo/Keyname * \******************************************************************************/ /** @fn int soap_wsse_add_EncryptedData_KeyInfo_KeyName(struct soap *soap, const char *keyname) @brief Adds EncryptedData/ds:KeyInfo/Keyname elements. @param soap context @param[in] keyname name of the key @return SOAP_OK or error code This function adds the name of the key to each EncryptedData element to identify the shared secret key used for encryption. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_EncryptedData_KeyInfo_KeyName(struct soap *soap, const char *keyname) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_add_EncryptedData_KeyInfo_KeyName"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_add_EncryptedData_KeyInfo_KeyName", "Plugin not registered", SOAP_PLUGIN_ERROR); data->enco_keyname = soap_strdup(soap, keyname); return SOAP_OK; } /******************************************************************************\ * * wsse:Security/saml1:Assertion * \******************************************************************************/ #ifdef SOAP_NAMESPACE_OF_saml1 /** @fn saml1__AssertionType *soap_wsse_add_saml1(struct soap *soap, const char *wsuId) @brief Adds SAML 1.0 Assertion to the wsse:Security header block, default initialized with wsu:Id set to enable signing of the assertion. @param soap context @param[in] wsuId string with unique ID value for signing or NULL to omit signing @return pointer to assertion or NULL when failed to allocate */ SOAP_FMAC1 saml1__AssertionType * SOAP_FMAC2 soap_wsse_add_saml1(struct soap *soap, const char *wsuId) { saml1__AssertionType *assertion = NULL; _wsse__Security *security = soap_wsse_add_Security(soap); if (security) { assertion = (saml1__AssertionType*)soap_malloc(soap, sizeof(saml1__AssertionType)); if (assertion) { soap_default_saml1__AssertionType(soap, assertion); assertion->MajorVersion = (char*)"1"; assertion->MinorVersion = (char*)"0"; assertion->wsu__Id = soap_strdup(soap, wsuId); } } return assertion; } /******************************************************************************/ /** @fn int soap_wsse_sign_saml1(struct soap *soap, saml1__Assertion assertion, int alg, const void *key, int keylen, X509 *cert) @brief Signs a SAML 2.0 assertion. @param soap context @param[in] alg is the signature algorithm, such as SOAP_SMD_HMAC_SHA1/224/256/384/512, SOAP_SMD_SIGN_DSA_SHA1/256, SOAP_SMD_SIGN_RSA_SHA1/224/256/384/512, or SOAP_SMD_SIGN_ECDSA_SHA1/224/256/384/512 @param[in] key is the HMAC secret key or DSA/RSA/ECDSA private EVP_PKEY @param[in] keylen is the HMAC key length @param[in] cert points to the X509 certificate */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_sign_saml1(struct soap *soap, saml1__AssertionType *assertion, int alg, const void *key, int keylen, X509 *cert) { _wsse__Security *security = soap_wsse_Security(soap); soap_mode omode = soap->omode; short version = soap->version; int err = SOAP_OK; if (!assertion) return SOAP_OK; soap_set_omode(soap, SOAP_XML_CANONICAL | SOAP_XML_CANONICAL_NA); soap_clr_omode(soap, SOAP_XML_INDENT); soap->version = 0; soap->encodingStyle = NULL; if (!assertion->AssertionID) assertion->AssertionID = soap_strdup(soap, soap_rand_uuid(soap, "_")); assertion->wsu__Id = assertion->AssertionID; if (soap_wsse_sign(soap, alg, key, keylen) || soap_wsse_sign_only(soap, assertion->AssertionID) || soap_begin_count(soap)) { err = soap->error; } else { soap_strcpy(soap->id, sizeof(soap->id), assertion->AssertionID); soap->event = SOAP_SEC_BEGIN; if (soap_out_saml1__AssertionType(soap, "saml1:Assertion", 0, assertion, "") || soap_end_count(soap) || soap_wsse_add_KeyInfo_X509Certificate(soap, cert)) err = soap->error; } assertion->ds__Signature = soap_wsse_Signature(soap); soap_wsse_delete_Security(soap); soap->header->wsse__Security = security; soap->omode = omode; soap->version = version; return err; } /******************************************************************************/ /** @fn saml1__AssertionType *soap_wsse_get_saml1(struct soap *soap) @brief Returns SAML 1.0 Assertion in the wsse:Security header block, if present. @param soap context @return pointer to assertion or NULL */ SOAP_FMAC1 saml1__AssertionType * SOAP_FMAC2 soap_wsse_get_saml1(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); if (security) return security->saml1__Assertion; return NULL; } /******************************************************************************/ /** @fn int soap_wsse_verify_saml1(struct soap *soap, saml1__AssertionType *assertion) @brief Verifies the SAML 1.0 Assertion with its enveloped signature, requires soap->cafile to be set. @param soap context @param assertion SAML 1.0 assertion to verify @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_saml1(struct soap *soap, saml1__AssertionType *assertion) { struct soap_dom_element *elt = soap->dom; soap_mode omode = soap->omode; short version = soap->version; int err = SOAP_OK; _ds__Signature *signature = assertion->ds__Signature; assertion->ds__Signature = NULL; soap_set_omode(soap, SOAP_XML_DOM | SOAP_XML_CANONICAL_NA); soap_clr_omode(soap, SOAP_XML_INDENT); soap->version = 0; soap->encodingStyle = NULL; soap->dom = NULL; if (soap_begin_send(soap) || soap_put_saml1__AssertionType(soap, assertion, "saml1:Assertion", "") || soap_end_send(soap) || soap_wsse_verify_with_signature(soap, signature)) err = soap->error; soap->version = version; soap->omode = omode; soap->dom = elt; assertion->ds__Signature = signature; return err; } #endif /******************************************************************************\ * * wsse:Security/saml2:Assertion * \******************************************************************************/ #ifdef SOAP_NAMESPACE_OF_saml2 /** @fn saml2__AssertionType *soap_wsse_add_saml2(struct soap *soap, const char *wsuId) @brief Adds SAML 2.0 Assertion to the wsse:Security header block, default initialized with wsu:Id set to enable signing of the assertion. @param soap context @param[in] wsuId string with unique ID value for signing or NULL to omit signing @return pointer to assertion or NULL when failed to allocate */ SOAP_FMAC1 saml2__AssertionType * SOAP_FMAC2 soap_wsse_add_saml2(struct soap *soap, const char *wsuId) { saml2__AssertionType *assertion = NULL; _wsse__Security *security = soap_wsse_add_Security(soap); if (security) { assertion = (saml2__AssertionType*)soap_malloc(soap, sizeof(saml2__AssertionType)); if (assertion) { soap_default_saml2__AssertionType(soap, assertion); assertion->Version = (char*)"2.0"; assertion->wsu__Id = soap_strdup(soap, wsuId); } } return assertion; } /******************************************************************************/ /** @fn int soap_wsse_sign_saml2(struct soap *soap, saml2__Assertion assertion, int alg, const void *key, int keylen, X509 *cert) @brief Signs a SAML 2.0 assertion. @param soap context @param[in] alg is the signature algorithm, such as SOAP_SMD_HMAC_SHA1/224/256/384/512, SOAP_SMD_SIGN_DSA_SHA1/256, SOAP_SMD_SIGN_RSA_SHA1/224/256/384/512, or SOAP_SMD_SIGN_ECDSA_SHA1/224/256/384/512 @param[in] key is the HMAC secret key or DSA/RSA/ECDSA private EVP_PKEY @param[in] keylen is the HMAC key length @param[in] cert points to the X509 certificate */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_sign_saml2(struct soap *soap, saml2__AssertionType *assertion, int alg, const void *key, int keylen, X509 *cert) { _wsse__Security *security = soap_wsse_Security(soap); soap_mode omode = soap->omode; short version = soap->version; int err = SOAP_OK; if (!assertion) return SOAP_OK; soap_set_omode(soap, SOAP_XML_CANONICAL | SOAP_XML_CANONICAL_NA); soap_clr_omode(soap, SOAP_XML_INDENT); soap->version = 0; soap->encodingStyle = NULL; if (!assertion->ID) assertion->ID = soap_strdup(soap, soap_rand_uuid(soap, "_")); if (soap_wsse_sign(soap, alg, key, keylen) || soap_wsse_sign_only(soap, assertion->ID) || soap_begin_count(soap)) { err = soap->error; } else { soap_strcpy(soap->id, sizeof(soap->id), assertion->ID); soap->event = SOAP_SEC_BEGIN; if (soap_out_saml2__AssertionType(soap, "saml2:Assertion", 0, assertion, "") || soap_end_count(soap) || soap_wsse_add_KeyInfo_X509Certificate(soap, cert)) err = soap->error; } assertion->ds__Signature = soap_wsse_Signature(soap); soap_wsse_delete_Security(soap); soap->header->wsse__Security = security; soap->omode = omode; soap->version = version; return err; } /******************************************************************************/ /** @fn saml2__AssertionType *soap_wsse_get_saml2(struct soap *soap) @brief Returns SAML 2.0 Assertion in the wsse:Security header block, if present. @param soap context @return pointer to assertion or NULL */ SOAP_FMAC1 saml2__AssertionType * SOAP_FMAC2 soap_wsse_get_saml2(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); if (security) return security->saml2__Assertion; return NULL; } /******************************************************************************/ /** @fn int soap_wsse_verify_saml2(struct soap *soap, saml2__AssertionType *assertion) @brief Verifies the SAML 2.0 Assertion with its enveloped signature, requires soap->cafile to be set. @param soap context @param assertion SAML 2.0 assertion to verify @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_saml2(struct soap *soap, saml2__AssertionType *assertion) { struct soap_dom_element *elt = soap->dom; soap_mode omode = soap->omode; short version = soap->version; int err = SOAP_OK; _ds__Signature *signature = assertion->ds__Signature; assertion->ds__Signature = NULL; soap_set_omode(soap, SOAP_XML_DOM | SOAP_XML_CANONICAL_NA); soap_clr_omode(soap, SOAP_XML_INDENT); soap->version = 0; soap->encodingStyle = NULL; soap->dom = NULL; if (soap_begin_send(soap) || soap_put_saml2__AssertionType(soap, assertion, "saml2:Assertion", "") || soap_end_send(soap) || soap_wsse_verify_with_signature(soap, signature)) err = soap->error; soap->version = version; soap->omode = omode; soap->dom = elt; assertion->ds__Signature = signature; return err; } #endif /******************************************************************************\ * * Faults * \******************************************************************************/ /** @fn int soap_wsse_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) @brief Sets sender SOAP Fault (sub)code for server fault response. @param soap context @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) { #if defined(SOAP_WSA_2003) || defined(SOAP_WSA_2004) || defined(SOAP_WSA_200408) || defined(SOAP_WSA_2005) return soap_wsa_sender_fault_subcode(soap, faultsubcode, faultstring, faultdetail); #else return soap_sender_fault_subcode(soap, faultsubcode, faultstring, faultdetail); #endif } /******************************************************************************/ /** @fn int soap_wsse_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) @brief Sets receiver SOAP Fault (sub)code for server fault response. @param soap context @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) { #if defined(SOAP_WSA_2003) || defined(SOAP_WSA_2004) || defined(SOAP_WSA_200408) || defined(SOAP_WSA_2005) return soap_wsa_receiver_fault_subcode(soap, faultsubcode, faultstring, faultdetail); #else return soap_receiver_fault_subcode(soap, faultsubcode, faultstring, faultdetail); #endif } /******************************************************************************/ /** @fn int soap_wsse_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail) @brief Sets sender SOAP Fault for server fault response. @param soap context @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail) { return soap_wsse_sender_fault_subcode(soap, NULL, faultstring, faultdetail); } /******************************************************************************/ /** @fn int soap_wsse_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail) @brief Sets receiver SOAP Fault for server fault response. @param soap context @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail) { return soap_wsse_receiver_fault_subcode(soap, NULL, faultstring, faultdetail); } /******************************************************************************/ /** @fn int soap_wsse_fault(struct soap *soap, wsse__FaultcodeEnum fault, const char *detail) @brief Sets SOAP Fault (sub)code for server response. @param soap context @param[in] fault is one of wsse:FaultcodeEnum @param[in] detail string with optional text message @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_fault(struct soap *soap, wsse__FaultcodeEnum fault, const char *detail) { const char *code = soap_wsse__FaultcodeEnum2s(soap, fault); DBGFUN2("soap_wsse_fault", "fault=%s", code ? code : "(null)", "detail=%s", detail ? detail : "(null)"); /* remove incorrect or incomplete Security header */ soap_wsse_delete_Security(soap); /* populate the SOAP Fault as per WS-Security spec */ /* detail = NULL; */ /* uncomment when detail text is to be omitted from SOAP Fault messages */ /* use WSA to populate the SOAP Header when WSA is used */ switch (fault) { case wsse__UnsupportedSecurityToken: return soap_wsse_sender_fault_subcode(soap, code, "An unsupported token was provided", detail); case wsse__UnsupportedAlgorithm: return soap_wsse_sender_fault_subcode(soap, code, "An unsupported signature or encryption algorithm was used", detail); case wsse__InvalidSecurity: return soap_wsse_sender_fault_subcode(soap, code, "An error was discovered processing the header", detail); case wsse__InvalidSecurityToken: return soap_wsse_sender_fault_subcode(soap, code, "An invalid security token was provided", detail); case wsse__FailedAuthentication: return soap_wsse_sender_fault_subcode(soap, code, "The security token could not be authenticated or authorized", detail); case wsse__FailedCheck: return soap_wsse_sender_fault_subcode(soap, code, "The signature or decryption was invalid", detail); case wsse__SecurityTokenUnavailable: return soap_wsse_sender_fault_subcode(soap, code, "Referenced security token could not be retrieved", detail); } return SOAP_FAULT; } /******************************************************************************\ * * Digest authentication session management * \******************************************************************************/ /** @fn static int soap_wsse_session_verify(struct soap *soap, const char hash[SOAP_SMD_SHA1_SIZE], const char *created, const char *nonce) @brief Verifies and updates the digest, nonce, and creation time against the digest authentication session database to prevent replay attacks. @param soap context @param[in] hash binary digest value of PasswordDigest @param[in] created string @param[in] nonce string (base64) @return SOAP_OK or SOAP_FAULT */ static int soap_wsse_session_verify(struct soap *soap, const char hash[SOAP_SMD_SHA1_SIZE], const char *created, const char *nonce) { struct soap_wsse_session *session; time_t expired, now = time(NULL); DBGFUN("soap_wsse_session_verify"); soap_s2dateTime(soap, created, &expired); /* creation time in the future? */ if (expired > now + SOAP_WSSE_CLKSKEW) return soap_wsse_fault(soap, wsse__FailedAuthentication, "Authorization request in future"); expired += SOAP_WSSE_NONCETIME; /* expired? */ if (expired <= now) return soap_wsse_fault(soap, wsse__FailedAuthentication, "Authentication expired"); /* purge expired messages, but don't do this all the time to improve efficiency */ if (now % 10 == 0) soap_wsse_session_cleanup(soap); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Verifying session nonce=%s\n", nonce)); /* enter mutex to check and update session */ MUTEX_LOCK(soap_wsse_session_lock); for (session = soap_wsse_session; session; session = session->next) { if (!memcmp(session->hash, hash, SOAP_SMD_SHA1_SIZE) && !strcmp(session->nonce, nonce)) break; } /* if not found, allocate new session data */ if (!session) { size_t l = strlen(nonce); session = (struct soap_wsse_session*)malloc(sizeof(struct soap_wsse_session) + l); if (session) { session->next = soap_wsse_session; session->expired = expired; (void)soap_memcpy((void*)session->hash, sizeof(session->hash), (const void*)hash, SOAP_SMD_SHA1_SIZE); soap_strcpy(session->nonce, l + 1, nonce); soap_wsse_session = session; } session = NULL; } /* exit mutex */ MUTEX_UNLOCK(soap_wsse_session_lock); /* if replay attack, return non-descript failure */ if (session) return soap_wsse_fault(soap, wsse__FailedAuthentication, NULL); return SOAP_OK; } /******************************************************************************/ /** @fn static void soap_wsse_session_cleanup(struct soap *soap) @brief Removes expired authentication data from the digest authentication session database. @param soap context */ static void soap_wsse_session_cleanup(struct soap *soap) { struct soap_wsse_session **session; time_t now = time(NULL); DBGFUN("soap_wsse_session_cleanup"); /* enter mutex to purge expired session data */ MUTEX_LOCK(soap_wsse_session_lock); session = &soap_wsse_session; while (*session) { if ((*session)->expired < now) { struct soap_wsse_session *p = *session; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deleting session nonce=%s\n", p->nonce)); *session = p->next; free(p); } else session = &(*session)->next; } /* exit mutex */ MUTEX_UNLOCK(soap_wsse_session_lock); } /******************************************************************************\ * * Calculate SHA1(created, nonce, password) digest * \******************************************************************************/ /** @fn static void calc_digest(struct soap *soap, const char *created, const char *nonce, int noncelen, const char *password, char hash[SOAP_SMD_SHA1_SIZE]) @brief Calculates digest value SHA1(created, nonce, password). @param soap context @param[in] created string (XSD dateTime format) @param[in] nonce value @param[in] noncelen length of nonce value @param[in] password string @param[out] hash SHA1 digest */ static void calc_digest(struct soap *soap, const char *created, const char *nonce, int noncelen, const char *password, char hash[SOAP_SMD_SHA1_SIZE]) { struct soap_smd_data context; /* use smdevp engine */ soap_smd_init(soap, &context, SOAP_SMD_DGST_SHA1, NULL, 0); soap_smd_update(soap, &context, nonce, noncelen); soap_smd_update(soap, &context, created, strlen(created)); soap_smd_update(soap, &context, password, strlen(password)); soap_smd_final(soap, &context, hash, NULL); } /******************************************************************************\ * * Calculate randomized hex nonce * \******************************************************************************/ /** @fn static void soap_wsse_rand_nonce(char *nonce, size_t noncelen) @brief Calculates randomized nonce. @param[out] nonce value [0..noncelen-1] @param[in] noncelen length of nonce must be multiple of 4 */ SOAP_FMAC1 void SOAP_FMAC2 soap_wsse_rand_nonce(char *nonce, size_t noncelen) { size_t i; soap_int32 r = (soap_int32)time(NULL); (void)soap_memcpy((void*)nonce, 4, (const void*)&r, 4); for (i = 4; i < noncelen; i += 4) { r = soap_random; (void)soap_memcpy((void*)(nonce + i), 4, (const void*)&r, 4); } } /******************************************************************************\ * * WS-SecureConversation P_MD5, P_SHA1 and P_SHA256 * \******************************************************************************/ /** @fn int soap_pmd5(struct soap *soap, const char *hmac_key, size_t hmac_key_len, char *secret, size_t secretlen, char *pmd5, size_t pmd5len) @brief Computes PMD5(hmac_key[0..hmac_key_len-1], secret[0..secretlen-1], pmd5[0..pmd5len-1]). @param soap context @param[in] hmac_key HMAC key (client secret) 16 raw bytes @param[in] secret seed (server secret) raw bytes @param[in] secretlen number of bytes @param[out] pmd5 points to pmd5 raw bytes to fill with result @param[in] pmd5len number of bytes to fill pmd5 @return SOAP_OK or SOAP_EOM To compute PMD5 with base64 input and output a base64 encoded pmd5[0..pmd5len-1]: @code int pmd5len = 32; // or greater int n, m; const char *client_secret = soap_base642s(soap, client_secret_base64, NULL, 0, &n); const char *server_secret = soap_base642s(soap, server_secret_base64, NULL, 0, &m); char pmd5[pmd5len]; char *pmd5_base64; if (soap_pmd5(soap, client_secret, n, server_secret, m, pmd5, pmd5len)) .. error // insufficient memory pmd5_base64 = soap_s2base64(soap, (unsigned char*)pmd5, NULL, pmd5len); @endcode */ SOAP_FMAC1 int SOAP_FMAC2 soap_pmd5(struct soap *soap, const char *hmac_key, size_t hmac_key_len, const char *secret, size_t secretlen, char *pmd5, size_t pmd5len) { char HA[SOAP_SMD_MD5_SIZE]; char temp[SOAP_SMD_MD5_SIZE]; return soap_p_hash(soap, hmac_key, hmac_key_len, secret, secretlen, SOAP_SMD_HMAC_MD5, HA, SOAP_SMD_MD5_SIZE, temp, pmd5, pmd5len); } /** @fn int soap_psha1(struct soap *soap, const char *hmac_key, size_t hmac_key_len, char *secret, size_t secretlen, char *psha1, size_t psha1len) @brief Computes PSHA1(hmac_key[0..hmac_key_len-1], secret[0..secretlen-1], psha1[0..psha1len-1]). @param soap context @param[in] hmac_key HMAC key (client secret) raw bytes @param[in] hmac_key_len HMAC key length @param[in] secret seed (server secret) raw bytes @param[in] secretlen number of bytes @param[out] psha1 points to psha1 raw bytes to fill with result @param[in] psha1len number of bytes to fill psha1 @return SOAP_OK or SOAP_EOM To compute PSHA1 with base64 input and output a base64 encoded psha1[0..psha1len-1]: @code int psha1len = 32; // or greater int n, m; const char *client_secret = soap_base642s(soap, client_secret_base64, NULL, 0, &n); const char *server_secret = soap_base642s(soap, server_secret_base64, NULL, 0, &m); char psha1[psha1len]; char *psha1_base64; if (soap_psha1(soap, client_secret, n, server_secret, m, psha1, psha1len)) .. error // insufficient memory psha1_base64 = soap_s2base64(soap, (unsigned char*)psha1, NULL, psha1len); @endcode */ SOAP_FMAC1 int SOAP_FMAC2 soap_psha1(struct soap *soap, const char *hmac_key, size_t hmac_key_len, const char *secret, size_t secretlen, char *psha1, size_t psha1len) { char HA[SOAP_SMD_SHA1_SIZE]; char temp[SOAP_SMD_SHA1_SIZE]; return soap_p_hash(soap, hmac_key, hmac_key_len, secret, secretlen, SOAP_SMD_HMAC_SHA1, HA, SOAP_SMD_SHA1_SIZE, temp, psha1, psha1len); } /** @fn int soap_psha256(struct soap *soap, const char *hmac_key, size_t hmac_key_len, char *secret, size_t secretlen, char *psha256, size_t psha256len) @brief Computes PSHA256(hmac_key[0..hmac_key_len-1], secret[0..secretlen-1], psha256[0..psha256len-1]). @param soap context @param[in] hmac_key HMAC key (client secret) raw bytes @param[in] hmac_key_len HMAC key length @param[in] secret seed (server secret) raw bytes @param[in] secretlen number of bytes @param[out] psha256 points to psha256 raw bytes to fill with result @param[in] psha256len number of bytes to fill psha256 @return SOAP_OK or SOAP_EOM To compute PSHA256 with base64 input and output a base64 encoded psha256[0..psha256len-1]: @code int psha256len = 32; // or greater int n, m; const char *client_secret = soap_base642s(soap, client_secret_base64, NULL, 0, &n); const char *server_secret = soap_base642s(soap, server_secret_base64, NULL, 0, &m); char psha256[psha256len]; char *psha256_base64; if (soap_psha256(soap, client_secret, n, server_secret, m, psha256, psha256len)) .. error // insufficient memory psha256_base64 = soap_s2base64(soap, (unsigned char*)psha256, NULL, psha256len); @endcode */ SOAP_FMAC1 int SOAP_FMAC2 soap_psha256(struct soap *soap, const char *hmac_key, size_t hmac_key_len, const char *secret, size_t secretlen, char *psha256, size_t psha256len) { char HA[SOAP_SMD_SHA256_SIZE]; char temp[SOAP_SMD_SHA256_SIZE]; return soap_p_hash(soap, hmac_key, hmac_key_len, secret, secretlen, SOAP_SMD_HMAC_SHA256, HA, SOAP_SMD_SHA256_SIZE, temp, psha256, psha256len); } /** @fn static int soap_p_hash(struct soap *soap, const char *hmac_key, size_t hmac_key_len, const char *secret, size_t secretlen, int alg, char HA[], size_t HA_len, char temp[], char *phash, size_t phashlen) @brief Computes PSHA256(hmac_key[0..hmac_key_len-1], secret[0..secretlen-1], psha256[0..psha256len-1]). @param soap context @param[in] hmac_key HMAC key (client secret) raw bytes @param[in] hmac_key_len HMAC key length @param[in] secret seed (server secret) raw bytes @param[in] secretlen number of bytes @param[in] alg hash algorithm @param HA buffer to contain hash (internally used) @param HA_len buffer length to contain hash (internally used) @param temp buffer to contain hash (internally used) @param[out] psha256 points to psha256 raw bytes to fill with result @param[in] psha256len number of bytes to fill psha256 @return SOAP_OK or SOAP_EOM */ static int soap_p_hash(struct soap *soap, const char *hmac_key, size_t hmac_key_len, const char *secret, size_t secretlen, int alg, char HA[], size_t HA_len, char temp[], char *phash, size_t phashlen) { char *buffer; size_t i; buffer = (char*)SOAP_MALLOC(soap, HA_len + secretlen); if (!buffer) return soap->error = SOAP_EOM; i = 0; while (i < phashlen) { struct soap_smd_data context; size_t j; soap_smd_init(soap, &context, alg, (void*)hmac_key, hmac_key_len); if (i == 0) soap_smd_update(soap, &context, secret, secretlen); else soap_smd_update(soap, &context, HA, HA_len); soap_smd_final(soap, &context, HA, NULL); (void)soap_memcpy((void*)buffer, HA_len + secretlen, (void*)HA, HA_len); (void)soap_memcpy((void*)(buffer + HA_len), secretlen, (void*)secret, secretlen); soap_smd_init(soap, &context, alg, (void*)hmac_key, hmac_key_len); soap_smd_update(soap, &context, buffer, HA_len + secretlen); soap_smd_final(soap, &context, temp, NULL); j = 0; while (j < HA_len && i < phashlen) phash[i++] = temp[j++]; } SOAP_FREE(soap, buffer); return SOAP_OK; } /******************************************************************************\ * * Plugin registry functions * \******************************************************************************/ /** @fn int soap_wsse(struct soap *soap, struct soap_plugin *p, void *arg) @brief Plugin registry function, used with soap_register_plugin. @param soap context @param[in,out] p plugin created in registry @param[in] arg passed from soap_register_plugin_arg is an optional security token handler callback @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse(struct soap *soap, struct soap_plugin *p, void *arg) { DBGFUN("soap_wsse"); p->id = soap_wsse_id; p->data = (void*)SOAP_MALLOC(soap, sizeof(struct soap_wsse_data)); p->fcopy = soap_wsse_copy; p->fdelete = soap_wsse_delete; if (!p->data) return SOAP_EOM; if (soap_wsse_init(soap, (struct soap_wsse_data*)p->data, (const void *(*)(struct soap*, int*, const char*, const unsigned char*, int, int*))arg)) { SOAP_FREE(soap, p->data); return SOAP_EOM; } return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_init(struct soap *soap, struct soap_wsse_data *data, const void *(*arg)(struct soap*, int*, const char*, const unsigned char *keyid, int keyidlen, int*)) @brief Initializes plugin data. @param soap context @param[in,out] data plugin data @param arg security token handler callback @return SOAP_OK */ static int soap_wsse_init(struct soap *soap, struct soap_wsse_data *data, const void *(*arg)(struct soap*, int *alg, const char *keyname, const unsigned char *keyid, int keyidlen, int *keylen)) { DBGFUN("soap_wsse_init"); if (!data) return soap->error = SOAP_EOM; data->sigid = NULL; data->encid = NULL; data->prefixlist = NULL; data->sign_alg = SOAP_SMD_NONE; data->sign_key = NULL; data->sign_keylen = 0; data->vrfy_alg = SOAP_SMD_NONE; data->vrfy_key = NULL; data->vrfy_keylen = 0; data->enco_alg = SOAP_MEC_NONE; data->enco_keyname = NULL; data->enco_key = NULL; data->enco_keylen = 0; data->deco_alg = SOAP_MEC_NONE; data->deco_key = NULL; data->deco_keylen = 0; data->digest = NULL; data->fpreparesend = NULL; data->fpreparefinalsend = NULL; data->fpreparefinalrecv = NULL; data->mec = NULL; data->store = NULL; data->security_token_handler = arg; soap->feltbegin = soap_wsse_element_begin_in; soap->feltendin = soap_wsse_element_end_in; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) @brief Copies plugin data to localize plugin data for threads. @param soap context @param[out] dst target plugin @param[in] src source plugin @return SOAP_OK */ static int soap_wsse_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) { DBGFUN("soap_wsse_copy"); *dst = *src; dst->data = (void*)SOAP_MALLOC(soap, sizeof(struct soap_wsse_data)); return soap_wsse_init(soap, (struct soap_wsse_data*)dst->data, ((struct soap_wsse_data*)src->data)->security_token_handler); } /******************************************************************************/ /** @fn void soap_wsse_delete(struct soap *soap, struct soap_plugin *p) @brief Deletes plugin data. @param soap context @param[in,out] p plugin @return SOAP_OK */ static void soap_wsse_delete(struct soap *soap, struct soap_plugin *p) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); (void)p; DBGFUN("soap_wsse_delete"); if (data) { if (data->prefixlist) SOAP_FREE(soap, data->prefixlist); soap_wsse_preparecleanup(soap, data); if (data->mec) { soap_mec_cleanup(soap, data->mec); SOAP_FREE(soap, data->mec); data->mec = NULL; } if (data->store) { X509_STORE_free(data->store); data->store = NULL; } SOAP_FREE(soap, data); } } /******************************************************************************\ * * Plugin-specific functions * \******************************************************************************/ /** @fn soap_wsse_set_security_token_handler(struct soap *soap, const void *(*callback)(struct soap*, int *alg, const char *keyname, const unsigned char *keyid, int keyidlen, int *keylen)) @brief Sets the security token handler callback that is optionaly used to retrieve keys for signature verification and decryption. @param soap context @param[in] callback function pointer @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_set_security_token_handler(struct soap *soap, const void *(*callback)(struct soap*, int *alg, const char *keyname, const unsigned char *keyid, int keyidlen, int *keylen)) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_set_security_token_handler"); if (data) data->security_token_handler = callback; return SOAP_OK; } /** @fn int soap_wsse_set_wsu_id(struct soap *soap, const char *tags) @brief Sets the elements that are to be extended with wsu:Id attributes. The wsu:Id attribute values are set to the string value of the tag's QName by replacing colons with hyphens to produce an xsd:ID value. @param soap context @param[in] tags string of space-separated qualified and unqualified element tag names @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_set_wsu_id(struct soap *soap, const char *tags) { DBGFUN1("soap_wsse_set_wsu_id", "tags=%s", tags?tags:"(null)"); soap->wsuid = soap_strdup(soap, tags); return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_set_InclusiveNamespaces(struct soap *soap, const char *prefixlist) @brief Sets the C14N InclusiveNamespaces Prefix List property. @param soap context @param[in] prefixlist string of space-separated namespace prefixes, or NULL to remove @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_set_InclusiveNamespaces(struct soap *soap, const char *prefixlist) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN1("soap_wsse_set_InclusiveNamespaces", "prefixlist=%s", prefixlist?prefixlist:"(null)"); if (data) { char *s = NULL; if (data->prefixlist) SOAP_FREE(soap, data->prefixlist); if (prefixlist) { size_t l = strlen(prefixlist); if (l + 1 < l || (SOAP_MAXALLOCSIZE > 0 && l > SOAP_MAXALLOCSIZE)) return soap->error = SOAP_EOM; s = (char*)SOAP_MALLOC(soap, l + 1); if (!s) return soap->error = SOAP_EOM; soap_strcpy(s, l + 1, prefixlist); } data->prefixlist = s; } return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_sign_only(struct soap *soap, const char *tags) @brief Filters only the specified wsu:Id names for signing. Can be used with soap_wsse_set_wsu_id() and if so should use the element tag names. @param soap context @param[in] tags string of space-separated qualified and unqualified tag names @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_sign_only(struct soap *soap, const char *tags) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN1("soap_wsse_sign_only", "tags=%s", tags?tags:"(null)"); if (data) data->sigid = soap_wsse_ids(soap, tags, '-'); return SOAP_OK; } /******************************************************************************/ /** @fn static char* soap_wsse_ids(struct soap *soap, const char *tags, int sub) @brief converts tag name(s) to id name(s). @param soap context @param[in] tags string of space-separated (un)qualified tag names @param[in] sub replacement character for ':' @return string of ids */ static char * soap_wsse_ids(struct soap *soap, const char *tags, int sub) { char *s, *t; s = t = soap_strdup(soap, tags); while (s && *s) { if (*s == ':') *s = sub; s++; } return t; } /******************************************************************************/ /** @fn int soap_wsse_sign(struct soap *soap, int alg, const void *key, int keylen) @brief Uses the wsse plugin to sign all wsu:Id attributed elements. @param soap context @param[in] alg is the signature algorithm, such as SOAP_SMD_HMAC_SHA1/224/256/384/512, SOAP_SMD_SIGN_DSA_SHA1/256, SOAP_SMD_SIGN_RSA_SHA1/224/256/384/512, or SOAP_SMD_SIGN_ECDSA_SHA1/224/256/384/512 @param[in] key is the HMAC secret key or DSA/RSA/ECDSA private EVP_PKEY @param[in] keylen is the HMAC key length @return SOAP_OK or fault This function does not actually sign the message, but initiates the plugin's signature algorithm to sign the message upon message transfer. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_sign(struct soap *soap, int alg, const void *key, int keylen) { struct soap_wsse_digest *digest, *next; struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN1("soap_wsse_sign", "alg=%x", alg); if (!data) return soap_set_receiver_error(soap, "soap_wsse_sign", "Plugin not registered", SOAP_PLUGIN_ERROR); if (!alg || !key) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid signature algorithm or key"); soap_wsse_add_Security(soap); /* store alg and key in plugin data */ data->sign_alg = alg; data->sign_key = key; data->sign_keylen = keylen; /* save and set the plugin's callbacks to preprocess outbound messages */ if (soap->fpreparesend != soap_wsse_preparesend) { data->fpreparesend = soap->fpreparesend; soap->fpreparesend = soap_wsse_preparesend; } if (soap->fpreparefinalsend != soap_wsse_preparefinalsend) { data->fpreparefinalsend = soap->fpreparefinalsend; soap->fpreparefinalsend = soap_wsse_preparefinalsend; } /* support HTTP compression only with HTTP chunking to allow signing XML */ if ((soap->omode & SOAP_ENC_ZLIB)) soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_CHUNK; else if ((soap->omode & SOAP_IO) == SOAP_IO_STORE) /* no store buffering (or else fpreparesend not working) */ soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_BUFFER; soap->omode &= ~SOAP_XML_DOM; /* cleanup the digest data */ for (digest = data->digest; digest; digest = next) { next = digest->next; SOAP_FREE(soap, digest); } data->digest = NULL; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_sign_body(struct soap *soap, int alg, const void *key, int keylen) @brief Uses the wsse plugin to sign all wsu:Id attributed elements, including the SOAP Body (by adding a wsu:Id="Body" attribute). @param soap context @param[in] alg is the signature algorithm, such as SOAP_SMD_HMAC_SHA1/224/256/384/512, SOAP_SMD_SIGN_DSA_SHA1/256, SOAP_SMD_SIGN_RSA_SHA1/224/256/384/512, or SOAP_SMD_SIGN_ECDSA_SHA1/224/256/384/512 @param[in] key is the HMAC secret key or DSA/RSA/ECDSA private EVP_PKEY @param[in] keylen is the HMAC key length @return SOAP_OK or fault This function does not actually sign the message, but initiates the plugin's signature algorithm to sign the message upon message transfer. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_sign_body(struct soap *soap, int alg, const void *key, int keylen) { DBGFUN1("soap_wsse_sign_body", "alg=%x", alg); soap_wsse_sign_only(soap, NULL); soap->omode |= SOAP_SEC_WSUID; return soap_wsse_sign(soap, alg, key, keylen); } /******************************************************************************/ /** @fn int soap_wsse_verify_init(struct soap *soap) @brief Uses the wsse plugin to initiate the verification of the signature and SignedInfo Reference digests. @param soap context @return SOAP_OK This function does not actually verify the message, but initiates the plugin's data to store the message in a DOM to verify the signature. The signature and digests in the DOM must be verified manually. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_init(struct soap *soap) { DBGFUN("soap_wsse_verify_init"); /* deserialize inbound message to DOM */ soap->imode |= SOAP_XML_DOM; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_verify_auto(struct soap *soap, int alg, const void *key, size_t keylen) @brief Uses the wsse plugin to initiate the automatic verification of the signature and SignedInfo Reference digests. @param soap context @param[in] alg to verify signature if signature has no secret or public key, use SOAP_SMD_NONE to omit @param[in] key is HMAC key or a DSA/RSA/ECDSA EVP_PKEY or NULL @param[in] keylen is HMAC key length or 0 @return SOAP_OK This function does not actually verify the message, but initiates the plugin's algorithm to store the message in a DOM to automatically verify the signature and digests. If the message does not contain a key to verify the signature, the alg, key, and keylen parameters are used. It is important that the X509 certificate used to verify the signature, which requires soap->cafile and/or soap->capath to be set. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_auto(struct soap *soap, int alg, const void *key, size_t keylen) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_verify_auto"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_verify_auto", "Plugin not registered", SOAP_PLUGIN_ERROR); data->vrfy_alg = alg; data->vrfy_key = key; data->vrfy_keylen = keylen; if (soap->fpreparefinalrecv != soap_wsse_preparefinalrecv) { data->fpreparefinalrecv = soap->fpreparefinalrecv; soap->fpreparefinalrecv = soap_wsse_preparefinalrecv; } return soap_wsse_verify_init(soap); } /******************************************************************************/ /** @fn int soap_wsse_verify_done(struct soap *soap) @brief Terminates the automatic verification of signatures. @param soap context @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_done(struct soap *soap) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_verify_done"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_verify_done", "Plugin not registered", SOAP_PLUGIN_ERROR); soap->imode &= ~SOAP_XML_DOM; soap->omode &= ~SOAP_SEC_WSUID; if (soap->fpreparefinalrecv == soap_wsse_preparefinalrecv) soap->fpreparefinalrecv = data->fpreparefinalrecv; return SOAP_OK; } /******************************************************************************/ /** @fn size_t soap_wsse_verify_element(struct soap *soap, const char *URI, const char *tag) @brief Post-checks the presence of signed element(s), returns the number of matching elements signed or zero when none found or if one or more matching elements are not signed. Does not verify the signature of these elements, which is done with @ref soap_wsse_verify_auto. @param soap context @param URI namespace of element(s) @param tag name of element(s) @return number of matching elements that are signed or 0 if no matching elements found or if one or more non-signed matching elements were found (0 is returned to prevent signature wrapping attacks). This function does not actually verify the signature of each element, but checks whether the elements are signed and thus their integrity is preserved. Signed element nesting rules are obeyed, so if the matching element is a descendent of a signed element, it is signed as well. Thus, the verification process follows nesting rules. Client should call this function after invocation. Services should call this function inside a service operation. This function traverses the entire DOM, so performance is determined by the size of a message. To check the SOAP Body (either using SOAP 1.1 or 1.2), @ref soap_wsse_verify_element(soap, namespaces[0].ns, "Body"). To check whether the Timestamp was signed (assuming it is present and message expiration checked with @ref soap_wsse_verify_Timestamp), use @ref soap_wsse_verify_element(soap, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "Timestamp"). @note For future releases, XPath queries (or forms of these) will be considered. */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_wsse_verify_element(struct soap *soap, const char *URI, const char *tag) { ds__SignedInfoType *signedInfo = soap_wsse_SignedInfo(soap); size_t count = 0; DBGFUN("soap_wsse_verify_element"); if (signedInfo && soap->dom) { struct soap_dom_element *elt; /* traverse the DOM */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SignedInfo and DOM found\n")); elt = soap->dom; while (elt) { /* find wsu:Id or ds:Id and check for Id in signedInfo */ int ok = 0; struct soap_dom_attribute *att; for (att = elt->atts; att; att = att->next) { if (att->name && att->nstr && (!strcmp(att->nstr, wsu_URI) || !strcmp(att->nstr, ds_URI)) && (!strcmp(att->name, "Id") || !soap_tag_cmp(att->name, "*:Id"))) { /* Id attribute found, search Id value in ds:Reference/@URI */ int i; for (i = 0; i < signedInfo->__sizeReference; i++) { ds__ReferenceType *reference = signedInfo->Reference[i]; if (reference->URI && *reference->URI == '#' && !strcmp(reference->URI + 1, att->text)) { ok = 1; break; } } if (ok) break; } } /* the current element is signed, count this and the matching nested */ if (ok) { count += soap_wsse_verify_nested(soap, elt, URI, tag); /* go to next sibling or back up */ if (elt->next) elt = elt->next; else { do elt = elt->prnt; while (elt && !elt->next); if (elt) elt = elt->next; } } else if (elt->name && ((!elt->nstr && !URI) || (elt->nstr && URI && !strcmp(elt->nstr, URI)))) { const char *s = strchr(elt->name, ':'); if (s) s++; else s = elt->name; /* found an unsigned matching element */ if (!strcmp(s, tag)) return 0; elt = soap_dom_next_element(elt, NULL); } else { elt = soap_dom_next_element(elt, NULL); } } } return count; } /******************************************************************************/ /** @fn size_t soap_wsse_verify_nested(struct soap *soap, struct soap_dom_element *dom, const char *URI, const char *tag) @brief Counts signed matching elements from the dom node and down. @param soap context @param dom node to check and down @param URI namespace of element(s) @param tag name of element(s) @return number of matching elements. */ static size_t soap_wsse_verify_nested(struct soap *soap, struct soap_dom_element *dom, const char *URI, const char *tag) { size_t count = 0; /* search the DOM node and descendants for matching elements */ struct soap_dom_element *elt = dom; for (elt = dom; elt && elt != dom->next && elt != dom->prnt; elt = soap_dom_next_element(elt, NULL)) { if (elt->name && ((!elt->nstr && !URI) || (elt->nstr && URI && !strcmp(elt->nstr, URI)))) { const char *s = strchr(elt->name, ':'); if (s) s++; else s = elt->name; /* found element? */ if (!strcmp(s, tag)) count++; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element '%s' (\"%s\":%s) is signed\n", elt->name, elt->nstr, elt->name)); } return count; } /******************************************************************************/ /** @fn int soap_wsse_verify_body(struct soap *soap) @brief Post-checks the presence of signed SOAP Body. Does not verify the signature of the Body, which is done with @ref soap_wsse_verify_auto. @param soap context @return SOAP_OK (signed) or SOAP_FAULT This function does not actually verify the signature of the Body. It checks whether the Body is signed and thus its integrity is preserved. Clients should call this function after invocation. Services should call this function inside a service operation. This function traverses the entire DOM, so performance is determined by the size of a message. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_body(struct soap *soap) { const char *ns = NULL; /* Are we using SOAP 1.1 or 1.2? Check first row of namespace table */ if (soap->local_namespaces) { if (soap->local_namespaces->out) ns = soap->local_namespaces->out; else if (soap->local_namespaces->ns) ns = soap->local_namespaces->ns; } /* If we don't know if we're using SOAP 1.1 or 1.2, then assume it is 1.2 */ if (!ns) ns = "http://www.w3.org/2003/05/soap-envelope"; if (soap_wsse_verify_element(soap, ns, "Body") == 1) return SOAP_OK; return soap_wsse_sender_fault(soap, "Message body not signed", NULL); } /******************************************************************************/ /** @fn int soap_wsse_verify_with_signature(struct soap *soap, const ds__Signature *signature) @brief Verifies XML in DOM of a message that was parsed, using the provided signature, assuming dsig non-WS-Security usage scenarios, requires DOM of the XML message which is created automatically with WS-Security enabled. @param soap context @param signature points to signature structure @return SOAP_OK (signed and verified) or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_with_signature(struct soap *soap, _ds__Signature *signature) { _wsse__Security *new_security, *security; int err; if (!signature) return soap_wsse_fault(soap, wsse__FailedCheck, "Signature required"); if (!soap->dom) return soap_wsse_fault(soap, wsse__FailedCheck, "XML DOM of signed message required"); /* save wsse:Security/ds:Signature when present */ security = soap_wsse_Security(soap); /* set the header wsse:Security/ds:Signature to be used internally */ soap_header(soap); soap->header->wsse__Security = NULL; new_security = soap_wsse_add_Security(soap); if (!new_security) return soap->error = SOAP_EOM; new_security->ds__Signature = signature; err = soap_wsse_verify_Signature(soap); /* restore wsse:Security/ds:Signature when present */ soap->header->wsse__Security = security; return err; } /******************************************************************************/ /** @fn int soap_wsse_encrypt_body(struct soap *soap, int alg, const void *key, int keylen) @brief Initiates the encryption of the SOAP Body. The algorithm should be SOAP_MEC_ENC_DES_CBC etc. for symmetric encryption. Use soap_wsse_add_EncryptedKey for public key encryption. @param soap context @param[in] alg the encryption algorithm, should be SOAP_MEC_ENC_DES_CBC etc. @param[in] key a certificate with public key for encryption, a DES CBC 160-bit key or AES key @param[in] keylen the symmetric encryption key length, 20 bytes for a DES CBC 160-bit key or larger for AES key @return SOAP_OK or error code This function initiates the encryption of the SOAP Body using an RSA public key or a symmetric shared secret key. No WS-Security EncryptedKey header will be set. Use soap_wsse_add_EncryptedKey instead for public key encryption. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_encrypt_body(struct soap *soap, int alg, const void *key, int keylen) { struct soap_wsse_data *data; DBGFUN1("soap_wsse_encrypt_body", "alg=%x", alg); data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); if (!data) return soap_set_receiver_error(soap, "soap_wsse_encrypt_body", "Plugin not registered", SOAP_PLUGIN_ERROR); data->encid = NULL; soap->omode |= SOAP_SEC_WSUID; soap_wsse_add_DataReferenceURI(soap, "#SOAP-ENV_Body"); return soap_wsse_encrypt(soap, alg, key, keylen); } /******************************************************************************/ /** @fn int soap_wsse_encrypt_only(struct soap *soap, int alg, const void *key, int keylen, const char *tags) @brief Initiates the encryption of XML elements specified in the tags string. Should be used in combination with soap_wsse_set_wsu_id to set wsu:Id for given XML element tags. The algorithm should be SOAP_MEC_ENC_DES_CBC etc. for symmetric encryption. Use soap_wsse_add_EncryptedKey_encrypt_only for public key encryption. @param soap context @param[in] alg the encryption algorithm, should be SOAP_MEC_ENC_DES_CBC etc. @param[in] key a certificate with public key for encryption, a DES CBC 160-bit key or AES key @param[in] keylen the symmetric encryption key length, 20 bytes for a DES CBC 160-bit key @param[in] tags string of space-separated qualified and unqualified tag names @return SOAP_OK or error code This function initiates the encryption using an RSA public key or a symmetric shared secret key. No WS-Security EncryptedKey header will be set. Use soap_wsse_add_EncryptedKey instead for public key encryption. @warning Use @ref soap_wsse_add_EncryptedKey_encrypt_only only in combination with @ref soap_wsse_set_wsu_id with the tag names of the elements to be encrypted. OTHERWISE THE GIVEN XML ELEMENTS ARE NOT ENCRYPTED AND WILL BE SENT IN THE CLEAR. @warning The elements identified with @ref soap_wsse_set_wsu_id to encrypt MUST occur EXACTLY ONCE in the SOAP Body. @warning Encryption/decryption of elements with simple content (CDATA content) IS NOT SUPPORTED. This means that elements you want to encrypt with this function must have complex content. That is, only encrypt elements with sub elements or encrypt the entire SOAP Body. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_encrypt_only(struct soap *soap, int alg, const void *key, int keylen, const char *tags) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN2("soap_wsse_encrypt_only", "alg=%x", alg, "tags=%s", tags?tags:"(null)"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_encrypt_only", "Plugin not registered", SOAP_PLUGIN_ERROR); data->encid = soap_strdup(soap, tags); if (tags) { char *s, *t; size_t l = strlen(tags); /* make space to insert # to each id converted from a tag name */ t = (char*)soap_malloc(soap, l + 2); if (!t) return soap->error = SOAP_EOM; *t = '#'; soap_strcpy(t + 1, l + 1, tags); s = soap_wsse_ids(soap, t, '_'); if (!s) return soap->error = SOAP_EOM; s++; for (;;) { t = strchr(s, ' '); if (t) *t = '\0'; *--s = '#'; if (soap_wsse_add_DataReferenceURI(soap, s)) return soap->error; if (!t) break; s = t + 1; while (*s == ' ') s++; } } return soap_wsse_encrypt(soap, alg, key, keylen); } /******************************************************************************/ /** @fn int soap_wsse_encrypt(struct soap *soap, int alg, const void *key, int keylen) @brief Start encryption. This function is supposed to be used internally only. The algorithm should be SOAP_MEC_ENC_DES_CBC etc. for symmetric encryption. Use soap_wsse_add_EncryptedKey for public key. encryption. @param soap context @param[in] alg the encryption algorithm, should be SOAP_MEC_ENC_DES_CBC etc. @param[in] key a certificate with public key for encryption, a DES CBC 160-bit key or AES key @param[in] keylen the symmetric encryption key length, 20 bytes for a DES CBC 160-bit key @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_encrypt(struct soap *soap, int alg, const void *key, int keylen) { struct soap_wsse_data *data; DBGFUN1("soap_wsse_encrypt", "alg=%x", alg); data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); if (!data) return soap_set_receiver_error(soap, "soap_wsse_encrypt", "Plugin not registered", SOAP_PLUGIN_ERROR); if (!alg || !key) return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, "An unsupported signature or encryption algorithm was used"); if (alg & SOAP_MEC_ENV) return soap_wsse_add_EncryptedKey(soap, alg, NULL, (X509*)key, NULL, NULL, NULL); /* store alg and key in plugin data */ data->enco_alg = (alg | SOAP_MEC_ENC); data->enco_key = key; data->enco_keylen = keylen; if (data->mec) soap_mec_cleanup(soap, data->mec); else data->mec = (struct soap_mec_data*)SOAP_MALLOC(soap, sizeof(struct soap_mec_data)); if (soap_mec_begin(soap, data->mec, alg, NULL, (unsigned char*)key, &keylen)) return soap->error; soap->omode &= ~SOAP_XML_DOM; soap->feltbegout = soap_wsse_element_begin_out; soap->feltendout = soap_wsse_element_end_out; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_decrypt_auto(struct soap *soap, int alg, const void *key, int keylen) @brief Start automatic decryption when needed using the specified key. This function should be used just once. The algorithm should be SOAP_MEC_ENV_DEC_DES_CBC etc. for public key encryption/decryption and SOAP_MEC_DEC_DES_CBC etc. for symmetric shared secret keys. @param soap context @param[in] alg the decryption algorithm, @param[in] key a persistent decryption key for the algorithm, a private RSA key or a shared symmetric secret key @param[in] keylen use 0 for public-key encryption/decryption or the shared secret decryption key length, 20 bytes for a DES CBC 160-bit key @return SOAP_OK or error code This function can be called once before multiple messages are received with WS-Security encrypted content, where only one key is used for encryption (public key or shared secret key). The default decryption key is set. If multiple decryption keys should be used, do NOT use this function but set the security_token_handler callback of the wsse plugin. See @ref wsse_9_2. Use a NULL key to remove the default decryption key. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_decrypt_auto(struct soap *soap, int alg, const void *key, int keylen) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN1("soap_wsse_decrypt_auto", "alg=%x", alg); if (!data) return soap_set_receiver_error(soap, "soap_wsse_decrypt_auto", "Plugin not registered", SOAP_PLUGIN_ERROR); /* store alg and key in plugin data */ data->deco_alg = (alg & ~SOAP_MEC_ENC); /* TODO should add? data->enco_alg = (alg & ~(SOAP_MEC_ENC|SOAP_MEC_ENV)); */ data->deco_key = key; data->deco_keylen = keylen; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_encrypt_begin(struct soap *soap, const char *id, int alg, const char *URI, const char *keyname, const unsigned char *key, const char *type) @brief Emit XML encryption tags and start encryption of the XML element content. @param soap context @param[in] id string for the EncryptedData element Id attribute @param[in] alg algorithm used, or SOAP_MEC_NONE to ignore @param[in] URI string for the encrypted element wsu:Id attribute @param[in] keyname optional subject key name @param[in] key optional DES/AES key for encryption (to override the current key) @param[in] type of encryption, either xenc_elementURI ("http://www.w3.org/2001/04/xmlenc#Element") or xenc_contentURI ("http://www.w3.org/2001/04/xmlenc#Content") @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_encrypt_begin(struct soap *soap, const char *id, int alg, const char *URI, const char *keyname, const unsigned char *key, const char *type) { int event; const char *algURI = NULL; (void)URI; DBGFUN("soap_wsse_encrypt_begin"); if ((soap->mode & SOAP_IO_LENGTH) && ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_IO) == SOAP_IO_STORE)) return SOAP_OK; /* disable digest */ event = soap->event; soap->event = 0; if (soap_set_attr(soap, "Id", id, 1) || soap_set_attr(soap, "Type", type, 1) || soap_element(soap, "xenc:EncryptedData", 0, NULL) || soap_element_start_end_out(soap, NULL)) return soap->error; switch (alg & SOAP_MEC_MASK & ~SOAP_MEC_ENV) { case SOAP_MEC_ENC_DES_CBC: algURI = xenc_3desURI; break; case SOAP_MEC_ENC_AES128_CBC: algURI = xenc_aes128cbcURI; break; case SOAP_MEC_ENC_AES192_CBC: algURI = xenc_aes192cbcURI; break; case SOAP_MEC_ENC_AES256_CBC: algURI = xenc_aes256cbcURI; break; case SOAP_MEC_ENC_AES512_CBC: algURI = xenc_aes512cbcURI; break; case SOAP_MEC_ENC_AES128_GCM: algURI = xenc_aes128gcmURI; break; case SOAP_MEC_ENC_AES192_GCM: algURI = xenc_aes192gcmURI; break; case SOAP_MEC_ENC_AES256_GCM: algURI = xenc_aes256gcmURI; break; case SOAP_MEC_ENC_AES512_GCM: algURI = xenc_aes512gcmURI; break; } if (algURI) { if (soap_set_attr(soap, "Algorithm", algURI, 1) || soap_element(soap, "xenc:EncryptionMethod", 0, NULL) || soap_element_start_end_out(soap, "xenc:EncryptionMethod")) return soap->error; } #if 0 /* deprecated */ if (URI) { if (soap_element(soap, "ds:KeyInfo", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_element(soap, "wsse:SecurityTokenReference", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_set_attr(soap, "URI", URI, 1) || soap_element(soap, "wsse:Reference", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_element_end_out(soap, "wsse:Reference") || soap_element_end_out(soap, "wsse:SecurityTokenReference") || soap_element_end_out(soap, "ds:KeyInfo")) return soap->error; } else #endif if (keyname) { if (soap_element(soap, "ds:KeyInfo", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_element(soap, "ds:KeyName", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_string_out(soap, keyname, 0) || soap_element_end_out(soap, "ds:KeyName") || soap_element_end_out(soap, "ds:KeyInfo")) return soap->error; } if (soap_element(soap, "xenc:CipherData", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_element(soap, "xenc:CipherValue", 0, NULL) || soap_element_start_end_out(soap, NULL)) return soap->error; /* re-enable digest */ soap->event = event; /* adjust level, hiding xenc elements */ soap->level -= 3; return soap_mec_start(soap, key); } /******************************************************************************/ /** @fn int soap_wsse_encrypt_end(struct soap *soap) @brief Emit XML encryption end tags and stop encryption of the XML element content. @param soap context @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_encrypt_end(struct soap *soap) { int event; DBGFUN("soap_wsse_encrypt_end"); if ((soap->mode & SOAP_IO_LENGTH) && ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_IO) == SOAP_IO_STORE)) return SOAP_OK; /* disable digest */ event = soap->event; soap->event = 0; /* adjust level, hiding xenc elements */ soap->level += 3; /* base64 body, no indent */ soap->body = 1; if (soap_mec_stop(soap) || soap_element_end_out(soap, "xenc:CipherValue") || soap_element_end_out(soap, "xenc:CipherData") || soap_element_end_out(soap, "xenc:EncryptedData")) return soap->error; /* re-enable digest */ soap->event = event; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_decrypt_begin(struct soap *soap) @brief Check for XML encryption tags and start decryption of the XML element content. If the KeyInfo element is present, the security_token_handler callback will be used to obtain a decryption key based on the key name. @param soap context @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_decrypt_begin(struct soap *soap) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); struct ds__KeyInfoType info; struct xenc__EncryptionMethodType meth; int alg = data->deco_alg; const unsigned char *keyid = NULL; int keyidlen = 0; unsigned char *key = NULL; int keylen = data->deco_keylen; DBGFUN("soap_wsse_decrypt_begin"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_decrypt_begin", "Plugin not registered", SOAP_PLUGIN_ERROR); if (soap_element_begin_in(soap, "xenc:EncryptedData", 0, NULL)) return soap->error; /* TODO: use Type attribute? */ soap_default_xenc__EncryptionMethodType(soap, &meth); if (soap_in_xenc__EncryptionMethodType(soap, "xenc:EncryptionMethod", &meth, NULL)) { if (meth.Algorithm) { if (!strcmp(meth.Algorithm, xenc_3desURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_DES_CBC; else if (!strcmp(meth.Algorithm, xenc_aes128cbcURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES128_CBC; else if (!strcmp(meth.Algorithm, xenc_aes192cbcURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES192_CBC; else if (!strcmp(meth.Algorithm, xenc_aes256cbcURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES256_CBC; else if (!strcmp(meth.Algorithm, xenc_aes512cbcURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES512_CBC; else if (!strcmp(meth.Algorithm, xenc_aes128gcmURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES128_GCM; else if (!strcmp(meth.Algorithm, xenc_aes192gcmURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES192_GCM; else if (!strcmp(meth.Algorithm, xenc_aes256gcmURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES256_GCM; else if (!strcmp(meth.Algorithm, xenc_aes512gcmURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES512_GCM; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EncryptionMethod alg=%x\n", alg)); } } if (soap_in_ds__KeyInfoType(soap, "ds:KeyInfo", &info, NULL)) { if (data->security_token_handler) { keyid = soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifier(soap, &info, &keyidlen); if (keyid || info.KeyName) { /* retrieve key from token handler callback */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting shared secret key '%s' through security_token_handler callback\n", info.KeyName)); key = (unsigned char*)data->security_token_handler(soap, &alg, info.KeyName, keyid, keyidlen, &keylen); if (key) { if (data->mec) soap_mec_cleanup(soap, data->mec); else data->mec = (struct soap_mec_data*)SOAP_MALLOC(soap, sizeof(struct soap_mec_data)); if (soap_mec_begin(soap, data->mec, alg, NULL, (unsigned char*)key, &keylen)) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); } } } } if (soap_element_begin_in(soap, "xenc:CipherData", 0, NULL) || soap_element_begin_in(soap, "xenc:CipherValue", 0, NULL)) return soap->error; /* if no default shared key is set for symmetric decryption, get it */ if (!(alg & SOAP_MEC_ENV)) { if (alg != data->deco_alg) { if (data->security_token_handler) { /* retrieve key from token handler callback */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting shared secret key for alg=%x through security_token_handler callback\n", alg)); data->deco_key = (const unsigned char*)data->security_token_handler(soap, &alg, NULL, keyid, keyidlen, &keylen); } } if (!key && keylen) key = (unsigned char*)data->deco_key; if (key) { if (data->mec) soap_mec_cleanup(soap, data->mec); else data->mec = (struct soap_mec_data*)SOAP_MALLOC(soap, sizeof(struct soap_mec_data)); if (soap_mec_begin(soap, data->mec, alg, NULL, (unsigned char*)key, &keylen)) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Key=%p/%p keylen=%d alg=%x\n", key, data->deco_key, keylen, alg)); data->deco_alg = alg; data->deco_keylen = keylen; if (soap_mec_start_alg(soap, alg, key)) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_decrypt_end(struct soap *soap) @brief Check for XML encryption ending tags and stop decryption of the XML element content. @param soap context @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_decrypt_end(struct soap *soap) { DBGFUN("soap_wsse_decrypt_end"); if (soap_mec_stop(soap) || soap_element_end_in(soap, "xenc:CipherValue") || soap_element_end_in(soap, "xenc:CipherData") || soap_element_end_in(soap, "xenc:EncryptedData")) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); return SOAP_OK; } /******************************************************************************\ * * Callbacks registered by plugin * \******************************************************************************/ /** @fn int soap_wsse_element_begin_in(struct soap *soap, const char *tag) @brief This callback is invoked as soon as a starting tag of an element is received by the XML parser. @param soap context @param[in] tag name of the element parsed @return SOAP_OK or error code */ static int soap_wsse_element_begin_in(struct soap *soap, const char *tag) { /* make sure we always have a header allocated */ if (soap->part == SOAP_IN_ENVELOPE) soap_header(soap); else if (!soap_match_tag(soap, tag, "xenc:EncryptedData")) { struct soap_dom_element **elt, *dom = soap->dom; /* temporarily disable DOM */ soap->dom = NULL; /* parse encryption tags */ if (soap_wsse_decrypt_begin(soap)) return soap->error; /* re-enable dom and adjust DOM tree to skip encryption elements */ soap->dom = dom->prnt; /* remove EncryptedData element from DOM */ for (elt = &soap->dom->elts; *elt && (*elt)->next; elt = &(*elt)->next) continue; if (*elt) *elt = NULL; /* adjust nesting level */ if (soap->level > 3) soap->level -= 3; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Decryption started, parsing encrypted XML\n")); soap->event = SOAP_SEC_DECRYPT; return soap_peek_element(soap); } return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_element_end_in(struct soap *soap, const char *tag1, const char *tag2) @brief This callback is invoked as soon as an ending tag of an element is received by the XML parser. @param soap context @param[in] tag1 name of the element parsed @param[in] tag2 name of the element that was expected by the parser's state, or NULL @return SOAP_OK or error code */ static int soap_wsse_element_end_in(struct soap *soap, const char *tag1, const char *tag2) { if (soap->event == SOAP_SEC_DECRYPT && soap->dom && soap->dom->elts && !soap_match_tag(soap, tag1, ":CipherValue")) { struct soap_dom_element *dom = soap->dom->elts; soap->event = 0; /* temporarily disable DOM */ soap->dom = NULL; /* adjust nesting level */ soap->level += 3; /* parse ending tags */ if (soap_mec_stop(soap) || soap_element_end_in(soap, ":CipherData") || soap_element_end_in(soap, ":EncryptedData")) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); /* adjust DOM tree to skip encryption elements */ while (dom->next) dom = dom->next; /* remove the old indent before ending tag */ dom->tail = NULL; /* re-enable DOM */ soap->dom = dom; if (soap_element_end_in(soap, tag2)) return soap->error; } else if (!soap_match_tag(soap, tag1, ":EncryptedKey")) { return soap_wsse_verify_EncryptedKey(soap); } return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_element_begin_out(struct soap *soap, const char *tag, int id, const char *type) @brief This callback is invoked as soon as a starting tag of an element is to be sent by the XML generator. @param soap context @param[in] tag name of the element @param[in] id of the element or 0 @param[in] type xsi:type of the element or NULL @return SOAP_OK or error code */ static int soap_wsse_element_begin_out(struct soap *soap, const char *tag, int id, const char *type) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); if (data && (!data->encid || soap_tagsearch(data->encid, tag))) { char *URI = NULL; #if 0 /* deprecated */ _wsse__Security *security = soap_wsse_Security(soap); if (security && security->xenc__EncryptedKey && security->xenc__EncryptedKey->Id) { const char *Id = security->xenc__EncryptedKey->Id; size_t l = strlen(Id); URI = (char*)soap_malloc(soap, l + 2); if (!URI) return soap->error = SOAP_EOM; *URI = '#'; soap_strcpy(URI + 1, l + 1, Id); } #endif if (!strcmp(tag, "SOAP-ENV:Body")) { if (soap_element(soap, tag, id, type) || soap_element_start_end_out(soap, NULL)) return soap->error; return soap_wsse_encrypt_begin(soap, "SOAP-ENV_Body", data->enco_alg, URI, data->enco_keyname, NULL, xenc_contentURI); } if (data->encid) { struct soap_attribute *tp, *tq, *tr = soap->attributes; /* preserve attribute lists */ int err; soap->attributes = NULL; err = soap_wsse_encrypt_begin(soap, soap_wsse_ids(soap, tag, '_'), data->enco_alg, URI, data->enco_keyname, NULL, xenc_elementURI); for (tp = soap->attributes; tp; tp = tq) { tq = tp->next; if (tp->value) SOAP_FREE(soap, tp->value); SOAP_FREE(soap, tp); } soap->attributes = tr; if (err) return err; } } if (soap_element(soap, tag, id, type) || soap_element_start_end_out(soap, NULL)) return soap->error; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_element_end_out(struct soap *soap, const char *tag) @brief This callback is invoked as soon as an ending tag of an element is to be sent by the XML generator. @param soap context @param[in] tag name of the element @return SOAP_OK or error code */ static int soap_wsse_element_end_out(struct soap *soap, const char *tag) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); if (soap->level <= 1 && !(soap->mode & SOAP_IO_LENGTH)) { soap->feltbegout = NULL; soap->feltendout = NULL; } if (data && (!data->encid || soap_tagsearch(data->encid, tag))) { if (!strcmp(tag, "SOAP-ENV:Body")) { if (soap_wsse_encrypt_end(soap)) return soap->error; } else if (data->encid) { if (soap_element_end(soap, tag)) return soap->error; return soap_wsse_encrypt_end(soap); } } return soap_element_end(soap, tag); } /******************************************************************************/ /** @fn int soap_wsse_preparesend(struct soap *soap, const char *buf, size_t len) @brief Takes a piece of the XML message (tokenized) to compute digest. @param soap context @param[in] buf string (XML "tokenized") to be sent @param[in] len buf length @return SOAP_OK or fault This callback is invoked to analyze a message (usually during the HTTP content length phase). @note Nested elements with wsu:Id attributes cannot be individually signed. */ static int soap_wsse_preparesend(struct soap *soap, const char *buf, size_t len) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_preparesend"); if (!data) return SOAP_PLUGIN_ERROR; soap->c14ninclude = data->prefixlist; /* the gSOAP engine signals the start of a wsu:Id element */ if (soap->event == SOAP_SEC_BEGIN) { int alg; /* start new digest or continue? */ if (data->digest && !data->digest->done) { soap->event = SOAP_SEC_SIGN; } else if (!data->sigid || soap_tagsearch(data->sigid, soap->id)) { /* initialize smdevp engine */ struct soap_wsse_digest *digest; size_t l = strlen(soap->id); soap->event = SOAP_SEC_SIGN; digest = (struct soap_wsse_digest*)SOAP_MALLOC(soap, sizeof(struct soap_wsse_digest) + l + 1); if (!digest) return soap->error = SOAP_EOM; digest->next = data->digest; digest->done = 0; digest->level = soap->level; /* digest hash strength is same as signature strength */ alg = (SOAP_SMD_DGST | (data->sign_alg & SOAP_SMD_HASH)); soap_smd_init(soap, &digest->smd, alg, NULL, 0); memset((void*)digest->hash, 0, sizeof(digest->hash)); digest->id[0] = '#'; soap_strcpy(digest->id + 1, l + 1, soap->id); data->digest = digest; /* omit indent for indented XML (next time around, we will catch '<') */ if (*buf != '<') goto end; } } if (soap->event == SOAP_SEC_SIGN) { /* update smdevp engine */ if (data->digest && !data->digest->done) { soap_smd_update(soap, &data->digest->smd, buf, len); if (soap->level < data->digest->level) { soap->event = 0; soap_smd_final(soap, &data->digest->smd, (char*)data->digest->hash, NULL); data->digest->done = 1; } } } end: if (data->fpreparesend) return data->fpreparesend(soap, buf, len); return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_preparefinalsend(struct soap *soap) @brief Collects the digests of all the wsu:Id elements and populates the SignedInfo. @param soap context @return SOAP_OK or fault This callback is invoked just before the message is sent. */ static int soap_wsse_preparefinalsend(struct soap *soap) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_preparefinalsend"); if (!data) return SOAP_PLUGIN_ERROR; if (data->digest) { ds__SignatureType *signature = soap_wsse_Signature(soap); struct soap_wsse_digest *digest; const char *transform = NULL; int alg, signature_added = 0; /* if message is canonicalized populate transform element accordingly */ if ((soap->mode & SOAP_XML_CANONICAL)) { if (soap->c14ninclude && *soap->c14ninclude == '*') transform = c14n_URI; else transform = exc_c14n_URI; } /* to increase the message length counter we need to emit the Signature, SignedInfo and SignatureValue elements. However, this does not work if we already populated the wsse:Signature with SignedInfo and should never happen! */ if (!signature) { signature = soap_wsse_add_Signature(soap); signature_added = 1; } else if (signature->SignedInfo) { return soap_set_receiver_error(soap, "wsse error", "Cannot use soap_wsse_sign with populated SignedInfo", SOAP_SSL_ERROR); } /* digest hash strength is same as signature strength */ alg = (SOAP_SMD_DGST | (data->sign_alg & SOAP_SMD_HASH)); /* add the SignedInfo/Reference elements for each digest */ for (digest = data->digest; digest; digest = digest->next) if (soap_wsse_add_SignedInfo_Reference(soap, digest->id, digest->level, transform, data->prefixlist, alg, (char*)digest->hash)) return soap->error; /* then compute the signature and add it */ if (soap_wsse_add_SignatureValue(soap, data->sign_alg, data->sign_key, data->sign_keylen)) return soap->error; /* Reset the callbacks and cleanup digests */ soap_wsse_preparecleanup(soap, data); /* if non-chunked or stored message, adjust HTTP content length */ if ((soap->mode & SOAP_IO) != SOAP_IO_CHUNK && (soap->mode & SOAP_IO) != SOAP_IO_STORE) { /* the code below ensures we increase the HTTP length counter */ short part = soap->part; soap->part = SOAP_IN_HEADER; /* header encoding rules (literal) */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Counting the size of additional SOAP Header elements, mode=0x%x\n", soap->mode)); if (signature_added) { const char *c14ninclude = soap->c14ninclude; soap->c14ninclude = NULL; soap->level = 3; /* indent level for XML Signature */ if ((soap->mode & SOAP_XML_CANONICAL)) { soap->ns = 0; /* need namespaces for canonicalization */ if ((soap->mode & SOAP_XML_INDENT)) soap->count += 4; /* correction for soap->ns = 0: add \n+indent */ } soap_out_ds__SignatureType(soap, "ds:Signature", 0, signature, NULL); soap->c14ninclude = c14ninclude; } else { const char *c14ninclude = soap->c14ninclude; const char *c14nexclude = soap->c14nexclude; soap->c14nexclude = "ds xsi"; /* don't add xmlns:ds or xmlns:xsi to count msg len */ soap->level = 4; /* indent level for XML SignedInfo */ if ((soap->mode & SOAP_XML_CANONICAL)) { soap->ns = 0; /* need namespaces for canonicalization */ soap->c14ninclude = NULL; /* but do not render inclusive namespaces */ if ((soap->mode & SOAP_XML_INDENT)) soap->count += 5; /* correction for soap->ns = 0: add \n+indent */ } soap_out_ds__SignedInfoType(soap, "ds:SignedInfo", 0, signature->SignedInfo, NULL); soap_out__ds__SignatureValue(soap, "ds:SignatureValue", 0, &signature->SignatureValue, NULL); soap->c14ninclude = c14ninclude; soap->c14nexclude = c14nexclude; } soap->part = part; } } else /* Reset the callbacks and cleanup digests */ { soap_wsse_preparecleanup(soap, data); } if (soap->fpreparefinalsend) return soap->fpreparefinalsend(soap); return SOAP_OK; } /******************************************************************************/ /** @fn void soap_wsse_preparecleanup(struct soap *soap, struct soap_wsse_data *data) @brief Restores engine state. @param soap context @param[in,out] data plugin data */ static void soap_wsse_preparecleanup(struct soap *soap, struct soap_wsse_data *data) { struct soap_wsse_digest *digest, *next; DBGFUN("soap_wsse_preparecleanup"); data->sign_alg = SOAP_SMD_NONE; data->sign_key = NULL; data->sign_keylen = 0; if (soap->fpreparesend == soap_wsse_preparesend) soap->fpreparesend = data->fpreparesend; if (soap->fpreparefinalsend == soap_wsse_preparefinalsend) soap->fpreparefinalsend = data->fpreparefinalsend; data->fpreparesend = NULL; data->fpreparefinalsend = NULL; for (digest = data->digest; digest; digest = next) { next = digest->next; SOAP_FREE(soap, digest); } data->digest = NULL; } /******************************************************************************/ /** @fn int soap_wsse_preparefinalrecv(struct soap *soap) @brief Verify signature and SignedInfo digests initiated with soap_wsse_verify_auto. @param soap context @return SOAP_OK or fault @see soap_wsse_verify_auto This callback is invoked immediately after a message was received. */ static int soap_wsse_preparefinalrecv(struct soap *soap) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); soap->omode &= ~SOAP_SEC_WSUID; data->sigid = NULL; /* so we must set again before next send */ data->encid = NULL; /* so we must set again before next send */ DBGFUN("soap_wsse_preparefinalrecv"); if (!data) return SOAP_PLUGIN_ERROR; if (data->deco_alg != SOAP_MEC_NONE && data->mec) if (soap_mec_end(soap, data->mec)) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); data->deco_alg = SOAP_MEC_NONE; if (soap_wsse_verify_Signature(soap)) return soap->error; if (data->fpreparefinalrecv && data->fpreparefinalrecv != soap_wsse_preparefinalrecv) return data->fpreparefinalrecv(soap); return SOAP_OK; } /******************************************************************************/ #ifdef __cplusplus } #endif gsoap-2.8.91/gsoap/plugin/httpmd5test.h0000644000175000017500000000421513525245161017337 0ustar ellertellert/* httpmd5test.h gSOAP HTTP Content-MD5 digest plugin example application. gSOAP XML Web services tools Copyright (C) 2000-2004, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- 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-2004, 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. -------------------------------------------------------------------------------- Compile: soapcpp2 -c httpmd5test.h cc -DWITH_OPENSSL -o httpmd5test httpmd5test.c soapC.c soapClient.c soapServer.c httpmd5.c md5evp.c stdsoap2.c -lssl -lcrypto -lz */ int ns__echoString(char *arg, struct ns__echoString*); gsoap-2.8.91/gsoap/plugin/httpgettest.c0000644000175000017500000000602713525245161017427 0ustar ellertellert/* httpgettest.c gSOAP HTTP GET plugin client example application. For server example usage of the HTTP GET plugin, see samples/webserver gSOAP XML Web services tools Copyright (C) 2000-2006, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- 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-2004, 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. -------------------------------------------------------------------------------- Compile: soapcpp2 -CS -c httpgettest.h cc -DWITH_NONAMESPACES -Iplugin -o httpgettest httpgettest.c soapC.c soapClient.c httpget.c stdsoap2.c To support https and compression, compile with: cc -DWITH_NONAMESPACES -DWITH_OPENSSL -DWITH_GZIP -Iplugin -o httpgettest httpgettest.c soapC.c httpget.c stdsoap2.c -lssl -lcrypto -lz */ #include "soapH.h" #include "httpget.h" int main(int argc, char **argv) { struct soap soap; char *body; if (argc < 2) { fprintf(stderr, "Usage: httpgettest URL\n"); exit(0); } soap_init(&soap); soap_register_plugin(&soap, http_get); /* register plugin */ if (soap_http_get_connect(&soap, argv[1], NULL) || soap_begin_recv(&soap)) { soap_print_fault(&soap, stderr); exit(1); } if (soap.http_content) printf("HTTP Content Type: %s\n", soap.http_content); body = soap_http_get_body(&soap, NULL); soap_end_recv(&soap); if (body) printf("HTTP Body:\n%s\n", body); soap_end(&soap); soap_done(&soap); return 0; } SOAP_NMAC struct Namespace namespaces[] = { {NULL, NULL, NULL, NULL} }; gsoap-2.8.91/gsoap/plugin/httpdatest.c0000644000175000017500000001414413525245161017233 0ustar ellertellert/* httpdatest.c gSOAP HTTP Digest Authentication example application. gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- 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-2015, 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. -------------------------------------------------------------------------------- Requires OpenSSL Compile: soapcpp2 -c httpdatest.h cc -DWITH_OPENSSL -o httpdatest httpdatest.c soapC.c soapClient.c soapServer.c httpda.c smdevp.c threads.c stdsoap2.c -lssl -lcrypto -lz Run server: ./httpdatest 8080 Run client test: ./httpdatest http://127.0.0.1:8080 options with an option string consisting of: c chunking z compression */ #include "httpda.h" #include "soapH.h" #include "ns.nsmap" static char authrealm[] = "gSOAP Authentication Test"; int run_serve(int port); int run_tests(int,char**); int main(int argc, char **argv) { int port; if (argc < 2) return soap_serve(soap_new1(SOAP_XML_INDENT)); else if (argc < 3 && (port = atoi(argv[1]))) return run_serve(port); else return run_tests(argc, argv); } int run_serve(int port) { struct soap *soap = soap_new1(SOAP_XML_INDENT); int ret; if (soap_register_plugin(soap, http_da)) exit(1); if (!soap_valid_socket(soap_bind(soap, NULL, port, 100))) soap_print_fault(soap, stderr); else { fprintf(stderr, "Bind to port %d successful\n", port); soap->accept_timeout = 3600; /* let server time out after one hour */ for (;;) { SOAP_SOCKET sock = soap_accept(soap); if (!soap_valid_socket(sock)) { if (soap->errnum) soap_print_fault(soap, stderr); else { fprintf(stderr, "Server timed out\n"); break; } } fprintf(stderr, "Accepting socket %d connection from IP %d.%d.%d.%d\n", sock, (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF); if (soap_serve(soap)) soap_print_fault(soap, stderr); fprintf(stderr, "Served\n\n"); soap_destroy(soap); soap_end(soap); } } ret = soap->error; soap_destroy(soap); soap_end(soap); soap_free(soap); return ret; } int run_tests(int argc, char **argv) { struct soap *soap = soap_new1(SOAP_XML_INDENT); struct ns__echoString r; char *endpoint, *arg; int ret; if (soap_register_plugin(soap, http_da)) exit(1); endpoint = argv[1]; if (argc >= 3) { arg = argv[2]; if (strchr(arg, 'c')) soap_set_omode(soap, SOAP_IO_CHUNK); /* use HTTP chunking */ if (strchr(arg, 'z')) soap_set_omode(soap, SOAP_ENC_ZLIB); /* use HTTP compression */ } else { arg = "Hello world!"; } if (soap_call_ns__echoString(soap, endpoint, NULL, arg, &r)) { if (soap->error == 401) { if (!strcmp(soap->authrealm, authrealm)) { /* save userid and passwd for basic or digest authentication */ struct http_da_info info; http_da_save(soap, &info, authrealm, "Mufasa", "Circle Of Life"); if (!soap_call_ns__echoString(soap, endpoint, NULL, arg, &r)) { /* clean up (optional) */ soap_destroy(soap); soap_end(soap); /* need to restore for authentication */ http_da_restore(soap, &info); if (!soap_call_ns__echoString(soap, endpoint, NULL, arg, &r)) { if (!strcmp(arg, r.arg)) printf("EchoString test OK\n"); else printf("Transmission error\n"); } } http_da_release(soap, &info); /* regular calls may follow */ } } } if (soap->error) soap_print_fault(soap, stderr); ret = soap->error; /* clean up and free the context and plugins */ soap_destroy(soap); soap_end(soap); soap_free(soap); return ret; } int ns__echoString(struct soap *soap, char *arg, struct ns__echoString *response) { if (soap->userid && soap->passwd) /* Basic authentication: we may want to reject this since the password was sent in the clear */ { if (!strcmp(soap->userid, "Mufasa") && !strcmp(soap->passwd, "Circle Of Life")) { response->arg = arg; return SOAP_OK; } } else if (soap->authrealm && soap->userid) { /* simulate database lookup on userid to find passwd */ if (!strcmp(soap->authrealm, authrealm) && !strcmp(soap->userid, "Mufasa")) { char *passwd = "Circle Of Life"; if (!http_da_verify_post(soap, passwd)) { response->arg = arg; return SOAP_OK; } } } soap->authrealm = authrealm; return 401; /* Not authorized, challenge digest authentication with httpda plugin */ } gsoap-2.8.91/gsoap/plugin/threads.h0000644000175000017500000001613613525245161016511 0ustar ellertellert/* threads.h Portable threads and locks API gSOAP XML Web services tools Copyright (C) 2000-2010, 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-2010, 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 -------------------------------------------------------------------------------- */ /** @page threads Portable threads and locking support The threads.h and threads.c code define the following portable API: - THREAD_TYPE portable thread type - THREAD_ID returns current thread ID of type THREAD_TYPE* - THREAD_CREATE(t,f,a) start thread (THREAD_TYPE*)t for f(a), return 0 if OK - THREAD_CREATEX(t,f,a) Windows only: start joinable thread (THREAD_TYPE*)t for f(a), return 0 if OK - THREAD_CLOSE(t) Windows only: close and destroy thread ID (a handle) when done - THREAD_DETACH(t) detach thread (THREAD_TYPE*)t - THREAD_JOIN(t) wait to join (THREAD_TYPE*)t - THREAD_EXIT exit the current thread - THREAD_CANCEL(t) kill a thread, dangerous, use only in extreme cases! - MUTEX_TYPE portable mutex type - MUTEX_INITIALIZER global initializer value for static locks - MUTEX_SETUP(m) setup lock (MUTEX_TYPE*)m - MUTEX_CLEANUP(m) cleanup lock (MUTEX_TYPE*)m - MUTEX_LOCK(m) acquire lock (MUTEX_TYPE*)m - MUTEX_UNLOCK(m) release lock (MUTEX_TYPE*)m - COND_TYPE portable condition variable type - COND_SETUP(c) setup condition variable (COND_TYPE*)c - COND_CLEANUP(c) cleanup condition variable (COND_TYPE*)c - COND_SIGNAL(c) signal condition variable (COND_TYPE*)c - COND_WAIT(c,m) wait on variable (COND_TYPE*)c in mutex (MUTEX_TYPE*)m */ #ifndef THREADS_H #define THREADS_H #include "stdsoap2.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((void(__cdecl*)(void*))(y), 0, (z))) == (HANDLE)-1L) # define THREAD_CREATEX(x,y,z) ((*(x) = (HANDLE)_beginthreadex(NULL, 0, (void(__cdecl*)(void*))(y), (z), 0, NULL)) == (HANDLE)0L) # define THREAD_CLOSE(x) CloseHandle(x) # define THREAD_DETACH(x) # define THREAD_JOIN(x) (WaitForSingleObject((x), INFINITE) == (DWORD)0xFFFFFFFF) # define THREAD_EXIT _endthread() # define THREAD_CANCEL(x) (TerminateThread(x, 0) == 0) # define MUTEX_TYPE HANDLE # define MUTEX_INITIALIZER NULL # define MUTEX_SETUP(x) (x) = CreateMutex(NULL, FALSE, NULL) # define MUTEX_CLEANUP(x) (CloseHandle(x) == 0) # define MUTEX_LOCK(x) emulate_pthread_mutex_lock(&(x)) # define MUTEX_UNLOCK(x) (ReleaseMutex(x) == 0) # 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 { UINT waiters_count_; CRITICAL_SECTION waiters_count_lock_; HANDLE signal_event_; } COND_TYPE; #ifdef __cplusplus extern "C" { #endif SOAP_FMAC1 int SOAP_FMAC2 emulate_pthread_mutex_lock(volatile MUTEX_TYPE*); SOAP_FMAC1 int SOAP_FMAC2 emulate_pthread_cond_init(COND_TYPE*); SOAP_FMAC1 int SOAP_FMAC2 emulate_pthread_cond_destroy(COND_TYPE*); SOAP_FMAC1 int SOAP_FMAC2 emulate_pthread_cond_signal(COND_TYPE*); SOAP_FMAC1 int SOAP_FMAC2 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_CREATEX(x,y,z) pthread_create((x), NULL, (y), (z)) # define THREAD_CLOSE(x) # define THREAD_DETACH(x) pthread_detach((x)) # define THREAD_JOIN(x) pthread_join((x), NULL) # define THREAD_EXIT pthread_exit(NULL) # define THREAD_CANCEL(x) pthread_cancel(x) # define MUTEX_TYPE pthread_mutex_t # define MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER # define MUTEX_SETUP(x) pthread_mutex_init(&(x), NULL) # define MUTEX_CLEANUP(x) pthread_mutex_destroy(&(x)) #if 0 /* 1: DEBUG MUTEX */ # define MUTEX_LOCK(x) (fprintf(stderr, "! LOCK %p %s:%d\n", &x, __FILE__, __LINE__), pthread_mutex_lock(&(x))) # define MUTEX_UNLOCK(x) (fprintf(stderr, "! UNLOCK %p %s:%d\n", &x, __FILE__, __LINE__), pthread_mutex_unlock(&(x))) #else # define MUTEX_LOCK(x) pthread_mutex_lock(&(x)) # define MUTEX_UNLOCK(x) pthread_mutex_unlock(&(x)) #endif # 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 gsoap-2.8.91/gsoap/plugin/mecevp.c0000644000175000017500000015275313525245161016337 0ustar ellertellert/* mecevp.c gSOAP interface for streaming message encryption and decryption gSOAP XML Web services tools Copyright (C) 2000-2015, 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-2015, 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 -------------------------------------------------------------------------------- */ /** @page mecevp The mecevp streaming message encryption and decryption engine The gSOAP mecevp engine encrypts and decrypts messages using the EVP interface of OpenSSL. It supports envelope encryption/decryption with public and private RSA keys and symmetric encryption with shared secret keys. Streaming and buffered message encryption modes are supported. An encryption and decryption algorithm and mode is selected with one of the following: - @ref SOAP_MEC_ENV_ENC_DES_CBC envelope encryption with triple DES EDE CBC - @ref SOAP_MEC_ENV_ENC_AES256_CBC envelope encryption with AES256 CBC - @ref SOAP_MEC_ENV_ENC_AES256_GCM envelope authenticated encryption with AES256 GCM - @ref SOAP_MEC_ENC_DES_CBC symmetric encryption with triple DES EDE CBC - @ref SOAP_MEC_ENC_AES256_CBC symmetric encryption with AES256 CBC - @ref SOAP_MEC_ENC_AES256_GCM symmetric authenticated encryption with AES256 GCM - @ref SOAP_MEC_ENV_DEC_DES_CBC envelope decryption with triple DES EDE CBC - @ref SOAP_MEC_ENV_DEC_AES256_CBC envelope decryption with AES256 CBC - @ref SOAP_MEC_ENV_DEC_AES256_GCM envelope authenticated decryption with AES256 GCM - @ref SOAP_MEC_DEC_DES_CBC symmetric decryption with triple DES EDE CBC - @ref SOAP_MEC_DEC_AES256_CBC symmetric decryption with AES256 CBC - @ref SOAP_MEC_DEC_AES256_GCM symmetric authenticated decryption with AES256 GCM where, in the above, AES256 can be replaced with AES128 ot AES192. Algorithm options: - @ref SOAP_MEC_STORE buffer all output in memory - @ref SOAP_MEC_OAEP use OAEP padding for CBC The mecevp engine wraps the EVP API with four new functions: - @ref soap_mec_init to initialize the engine - @ref soap_mec_update to encrypt/decrypt a message part - @ref soap_mec_final to finalize encryption/decryption, does not deallocate tne engine and buffers - @ref soap_mec_cleanup to deallocate the engine and buffers All cipher data is written and read in base64 format. A higher-level interface for message encryption/decryption in parts (such as individual XML elements) is defined by two new functions: - @ref soap_mec_begin to begin a streaming sequence of encryptions/decryptions - @ref soap_mec_start to start encryption/decryption of a message part - @ref soap_mec_stop to stop encryption/decryption of a message part - @ref soap_mec_end to end the sequence and deallocate the engine buffers Compile all source codes with -DWITH_OPENSSL and link with ssl and crypto libraries. Here is an example to encrypt a message while streaming it to the output. The example uses the public key of the recipient/reader of the message. The recipient/reader uses its private key to decrypt. Envelope encryption is used with SOAP_MEC_ENV_ENC_DES_CBC, which means an ephemeral secret key is generated and encrypted with the public key. This encrypted secret key should be communicated to the recipient/reader with the message to decrypt: @code #include "mecevp.h" soap_mec_data mec; ns__Object object; int alg = SOAP_MEC_ENV_ENC_DES_CBC; FILE *fd = fopen("key.pem", "r"); EVP_PKEY *pubk; unsigned char *key; int keylen; if (...) // key file contains public key? pubk = PEM_read_PUBKEY(fd, NULL, NULL, NULL); else // key file contains certificate { X509 *cert = PEM_read_X509(fd, NULL, NULL, NULL); pubk = X509_get_pubkey(cert); X509_free(cert); } fclose(fd); key = soap_malloc(soap, soap_mec_size(alg, pubk)); if (soap_begin_send(soap) || soap_mec_begin(soap, &mec, alg, pubk, key, &keylen) || soap_mec_start(soap, NULL) || soap_out_ns__Object(soap, "ns:Object", 0, &object, NULL) || soap_mec_stop(soap) || soap_mec_end(soap, &mec) || soap_end_send(soap)) { soap_mec_cleanup(soap, &mec); // clean up when error soap_print_fault(soap, stderr); } EVP_PKEY_free(pubk); @endcode The example given above sends the output to stdout. To save the output in a string use the following in C: @code char *str = NULL; // string to be set to the encrypted output soap->os = &str; // for C code only if (soap_begin_send(soap) ... soap->os = NULL; ... // use str, which is set to the encrypted output soap_end(soap); // auto-deletes str @endcode With C++ you should use a string stream: @code std::stringstream ss; soap->os = &ss; if (soap_begin_send(soap) ... soap->os = NULL; ... // use ss.str() soap_destroy(soap); // cleanup soap_end(soap); // cleanup @endcode The decryption by the recipient/reader requires the ephemeral encrypted secret key generated by soap_mec_begin by the sender (as set above) to decrypt the message using envelope decryption with SOAP_MEC_ENV_DEC_DES_CBC. @code #include "mecevp.h" soap_mec_data mec; ns__Object object; int alg = SOAP_MEC_ENV_DEC_DES_CBC; FILE *fd = fopen("key.pem", "r"); EVP_PKEY *privk = PEM_read_PrivateKey(fd, NULL, NULL, "password"); unsigned char *key; int keylen; fclose(fd); key = ... // value set as above by sender keylen = ... // value set as above by sender if (soap_begin_recv(soap) || soap_mec_begin(soap, &mec, alg, privk, key, &keylen) || soap_mec_start(soap) || soap_in_ns__Object(soap, "ns:Object", &object, NULL) == NULL || soap_mec_stop(soap) || soap_mec_end(soap, &mec) || soap_end_recv(soap)) { soap_mec_cleanup(soap, &mec); // clean up when error soap_print_fault(soap, stderr); } EVP_PKEY_free(privk); @endcode The example given above reads the input from stdin. To read input from a string use the following in C: @code char *str; // string with encrupted input soap->is = str; if (soap_begin_recv(soap) ... soap->is = NULL; soap_end(soap); // cleanup @endcode With C++ you should use a string stream: @code std::stringstream ss; ss.str(...); // string with encrypted input soap->is = &ss; if (soap_begin_recv(soap) ... soap->is = NULL; soap_destroy(soap); // cleanup soap_end(soap); // cleanup @endcode Note that the encrypted secret key can be sent in the clear or stored openly, since only the recipient/reader will be able to decode it (with its private key) and use it for message decryption. Symmetric encryption and decryption can be used if both parties can safely share a secret symmetric key that no other party has access to. We use SOAP_MEC_ENC_DES_CBC for encryption and SOAP_MEC_DEC_DES_CBC for decryption using a 160-bit triple DES key. You can also use AES128, AES192, AES256 ciphers. Here is an example to encrypt a message using a shared secret key while streaming it to the output. @code #include "mecevp.h" soap_mec_data mec; ns__Object object; int alg = SOAP_MEC_ENC_DES_CBC; unsigned char key[20] = { ... }; // shared secret triple DES key int keylen = 20; if (soap_begin_send(soap) || soap_mec_begin(soap, &mec, alg, NULL, key, &keylen) || soap_mec_start(soap, NULL) || soap_out_ns__Object(soap, "ns:Object", 0, &object, NULL) || soap_mec_stop(soap) || soap_mec_end(soap, &mec) || soap_end_send(soap)) { soap_mec_cleanup(soap, &mec); // clean up when error soap_print_fault(soap, stderr); } @endcode The decryption by the recipient/reader requires the same shared secret key to decrypt the message using envelope decryption with SOAP_MEC_DEC_DES_CBC. This key is secret and unencrypted, so it should never be shared with any other party besides the sender/writer and recipient/reader. @code #include "mecevp.h" soap_mec_data mec; ns__Object object; int alg = SOAP_MEC_DEC_DES_CBC; unsigned char key[20] = { ... }; // shared secret triple DES key int keylen = 20; if (soap_begin_recv(soap) || soap_mec_begin(soap, &mec, alg, NULL, key, &keylen) || soap_mec_start(soap) || soap_in_ns__Object(soap, "ns:Object", &object, NULL) == NULL || soap_mec_stop(soap) || soap_mec_end(soap, &mec) || soap_end_recv(soap)) { soap_mec_cleanup(soap, &mec); // clean up when error soap_print_fault(soap, stderr); } @endcode @note The mecevp engine uses callbacks of the gSOAP engine that were introduced in version 2.8.1. Earlier gSOAP version releases are not compatible with the mecevp plugin and engine. */ #include "mecevp.h" #ifdef __cplusplus extern "C" { #endif /******************************************************************************\ * * Static protos * \******************************************************************************/ static int soap_mec_upd(struct soap *soap, struct soap_mec_data *data, const char **s, size_t *n, int final); static int soap_mec_upd_enc(struct soap *soap, struct soap_mec_data *data, const char **s, size_t *n, int final); static int soap_mec_upd_dec(struct soap *soap, struct soap_mec_data *data, const char **s, size_t *n, int final); static int soap_mec_check(struct soap *soap, struct soap_mec_data *data, int err, const char *msg); static void soap_mec_put_base64(struct soap *soap, struct soap_mec_data *data, const unsigned char *s, int n); static void soap_mec_end_base64(struct soap *soap, struct soap_mec_data *data); static int soap_mec_get_base64(struct soap *soap, struct soap_mec_data *data, char *t, size_t *l, const char *s, size_t n, const char **r, size_t *k); static int soap_mec_filtersend(struct soap *soap, const char **s, size_t *n); static int soap_mec_filterrecv(struct soap *soap, char *buf, size_t *len, size_t maxlen); /******************************************************************************\ * * soap_mec API functions * \******************************************************************************/ /** @fn int soap_mec_init(struct soap *soap, struct soap_mec_data *data, int alg, SOAP_MEC_KEY_TYPE *pkey, unsigned char *key, int *keylen) @brief Initialize mecevp engine state and create context for encryption/decryption algorithm using a private/public key or symmetric secret key. @param soap context @param[in,out] data mecevp engine context @param[in] alg encryption/decryption algorithm @param[in] pkey public/private key or NULL @param[in,out] key secret key or encrypted ephemeral secret key set with envelope encryption, or NULL @param[in,out] keylen secret key length @return SOAP_OK or SOAP_SSL_ERROR */ SOAP_FMAC1 int SOAP_FMAC2 soap_mec_init(struct soap *soap, struct soap_mec_data *data, int alg, SOAP_MEC_KEY_TYPE *pkey, unsigned char *key, int *keylen) { int ok = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_mec_init()\n")); soap_ssl_init(); #if (OPENSSL_VERSION_NUMBER < 0x10100000L) data->ctx = (EVP_CIPHER_CTX*)SOAP_MALLOC(soap, sizeof(EVP_CIPHER_CTX)); if (data->ctx) EVP_CIPHER_CTX_init(data->ctx); #else data->ctx = EVP_CIPHER_CTX_new(); #endif if (!data->ctx) return soap->error = SOAP_EOM; data->alg = alg; data->state = SOAP_MEC_STATE_NONE; data->restidx = 0; data->taglen = 0; switch (alg & SOAP_MEC_ALGO) { case SOAP_MEC_DES_CBC: data->type = EVP_des_ede3_cbc(); break; case SOAP_MEC_AES128_CBC: data->type = EVP_aes_128_cbc(); break; case SOAP_MEC_AES192_CBC: data->type = EVP_aes_192_cbc(); break; case SOAP_MEC_AES256_CBC: data->type = EVP_aes_256_cbc(); break; case SOAP_MEC_AES512_CBC: data->type = NULL; /* N/A */ break; #if (OPENSSL_VERSION_NUMBER >= 0x10002000L) case SOAP_MEC_AES128_GCM: data->type = EVP_aes_128_gcm(); break; case SOAP_MEC_AES192_GCM: data->type = EVP_aes_192_gcm(); break; case SOAP_MEC_AES256_GCM: data->type = EVP_aes_256_gcm(); break; case SOAP_MEC_AES512_GCM: data->type = NULL; /* N/A */ break; #endif default: data->type = NULL; } if (alg & SOAP_MEC_ENC) { if (!data->type) return soap_mec_check(soap, data, 0, "soap_mec_init() failed: cannot load cipher"); ok = EVP_EncryptInit_ex(data->ctx, data->type, NULL, NULL, NULL); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EVP_EncryptInit ok=%d\n", ok)); } if (alg & SOAP_MEC_GCM) EVP_CIPHER_CTX_set_padding(data->ctx, 0); else { if (alg & SOAP_MEC_OAEP) EVP_CIPHER_CTX_set_padding(data->ctx, RSA_PKCS1_OAEP_PADDING); else EVP_CIPHER_CTX_set_padding(data->ctx, RSA_PKCS1_PADDING); } switch (alg & SOAP_MEC_MASK & ~SOAP_MEC_ALGO) { case SOAP_MEC_ENV_ENC: #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) ok = EVP_CIPHER_CTX_rand_key(data->ctx, data->ekey); #elif defined(EVP_CIPH_RAND_KEY) if (data->ctx->cipher->flags & EVP_CIPH_RAND_KEY) ok = EVP_CIPHER_CTX_ctrl(data->ctx, EVP_CTRL_RAND_KEY, 0, data->ekey); else ok = RAND_bytes(data->ekey, data->ctx->key_len); #else ok = RAND_bytes(data->ekey, data->ctx->key_len); #endif /* generate ephemeral secret key */ #if (OPENSSL_VERSION_NUMBER >= 0x10000000L) *keylen = EVP_PKEY_encrypt_old(key, data->ekey, EVP_CIPHER_CTX_key_length(data->ctx), pkey); #else *keylen = EVP_PKEY_encrypt(key, data->ekey, EVP_CIPHER_CTX_key_length(data->ctx), pkey); #endif key = data->ekey; /* fall through to next arm */ case SOAP_MEC_ENC: data->bufidx = 0; data->buflen = 1024; /* > iv in base64 must fit */ data->buf = (char*)SOAP_MALLOC(soap, data->buflen); data->key = key; break; case SOAP_MEC_ENV_DEC: case SOAP_MEC_DEC: data->pkey = pkey; data->key = key; data->keylen = *keylen; break; default: return soap_set_receiver_error(soap, "Unsupported encryption algorithm", NULL, SOAP_SSL_ERROR); } return soap_mec_check(soap, data, ok, "soap_mec_init() failed"); } /******************************************************************************/ /** @fn int soap_mec_update(struct soap *soap, struct soap_mec_data *data, const char **s, size_t *n) @brief Update mecevp engine state: encrypts plain text (or raw data) or decrypts cipher data in base64 format. @param soap context @param[in,out] data mecevp engine context @param[in,out] s input data to convert, afterwards points to converted data (original content is unchanged) @param[in,out] n size of input, afterwards size of output @return SOAP_OK or SOAP_SSL_ERROR */ SOAP_FMAC1 int SOAP_FMAC2 soap_mec_update(struct soap *soap, struct soap_mec_data *data, const char **s, size_t *n) { return soap_mec_upd(soap, data, s, n, 0); } /******************************************************************************/ /** @fn int soap_mec_final(struct soap *soap, struct soap_mec_data *data, const char **s, size_t *n) @brief Ends mecevp engine state: encrypt/decrypt remainder from buffers. @param soap context @param[in,out] data mecevp engine context @param[out] s afterwards points to converted remaining data in streaming mode, or entire converted data in buffer mode (SOAP_MEC_STORE option) @param[out] n afterwards size of remaining data @return SOAP_OK or SOAP_SSL_ERROR */ int soap_mec_final(struct soap *soap, struct soap_mec_data *data, const char **s, size_t *n) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_mec_final()\n")); *n = 0; if (!data->ctx) return SOAP_OK; if (soap_mec_upd(soap, data, s, n, 1)) return soap->error; return SOAP_OK; } /******************************************************************************/ /** @fn void soap_mec_cleanup(struct soap *soap, struct soap_mec_data *data) @brief Clean up mecevp engine and deallocate cipher context and buffers. @param soap context @param[in,out] data mecevp engine context @return SOAP_OK or SOAP_SSL_ERROR */ SOAP_FMAC1 void SOAP_FMAC2 soap_mec_cleanup(struct soap *soap, struct soap_mec_data *data) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_mec_cleanup()\n")); data->alg = SOAP_MEC_NONE; data->state = SOAP_MEC_STATE_NONE; data->type = NULL; if (data->ctx) { #if (OPENSSL_VERSION_NUMBER < 0x10100000L) EVP_CIPHER_CTX_cleanup(data->ctx); SOAP_FREE(soap, data->ctx); #else EVP_CIPHER_CTX_free(data->ctx); #endif data->ctx = NULL; } if (data->buf) { SOAP_FREE(soap, data->buf); data->buf = NULL; data->buflen = 0; } if (data->rest) { SOAP_FREE(soap, data->rest); data->rest = NULL; data->restlen = 0; } } /******************************************************************************/ /** @fn int soap_mec_begin(struct soap *soap, struct soap_mec_data *data, int alg, SOAP_MEC_KEY_TYPE *pkey, unsigned char *key, int *keylen) @brief Initialize the mecevp engine data and begin encryption or decryption message sequence using a private/public key or symmetric secret key. @param soap context @param[in,out] data mecevp engine context @param[in] alg encryption/decryption algorithm @param[in] pkey public/private key or NULL @param[in,out] key secret key or encrypted ephemeral secret key set with envelope encryption, or NULL @param[in,out] keylen secret key length @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_mec_begin(struct soap *soap, struct soap_mec_data *data, int alg, SOAP_MEC_KEY_TYPE *pkey, unsigned char *key, int *keylen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "MEC Begin alg=0x%x\n", alg)); /* save and set the engine's 'data' field to pass data to the callbacks */ soap->data[1] = (void*)data; data->ctx = NULL; data->type = NULL; data->pkey = NULL; data->key = NULL; data->buf = NULL; data->bufidx = 0; data->buflen = 0; data->rest = NULL; data->restidx = 0; data->restlen = 0; data->taglen = 0; /* save the mode flag */ data->mode = soap->mode; if (alg & SOAP_MEC_ENC) { /* clear the IO flags and DOM flag */ soap->mode &= ~(SOAP_IO | SOAP_IO_LENGTH | SOAP_ENC_ZLIB | SOAP_XML_DOM); /* clear the XML attribute store */ soap_clr_attr(soap); /* load the local XML namespaces store */ soap_set_local_namespaces(soap); if (soap->mode & SOAP_XML_CANONICAL) soap->ns = 0; /* for in c14n, we must have all xmlns bindings available */ } else if (soap->ffilterrecv != soap_mec_filterrecv) { /* save and override the callbacks */ data->ffilterrecv = soap->ffilterrecv; soap->ffilterrecv = soap_mec_filterrecv; } /* init the soap_mec engine */ return soap_mec_init(soap, data, alg, pkey, key, keylen); } /******************************************************************************/ /** @fn int soap_mec_start_alg(struct soap *soap, int alg, const unsigned char *key) @brief Start encryption or decryption of current message. If key is non-NULL, use the symmetric key with alg. Use soap_mec_start only after soap_mec_begin. The soap_mec_start should be followed by a soap_mec_stop call. @param soap context @param[in] alg algorithm @param[in] key secret DES/AES key or NULL for private key @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_mec_start_alg(struct soap *soap, int alg, const unsigned char *key) { struct soap_mec_data *data; int ok = 1; data = (struct soap_mec_data*)soap->data[1]; if (!data) return soap->error = SOAP_USER_ERROR; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "MEC Start alg=0x%x\n", data->alg)); if (key) data->key = key; if (alg != SOAP_MEC_NONE) data->alg = alg; if (data->alg & SOAP_MEC_ENC) { unsigned char iv[EVP_MAX_IV_LENGTH]; int ivlen; if (!data->type) return soap_mec_check(soap, data, 0, "soap_mec_start_alg() failed: no cipher"); /* save and override the callbacks */ data->ffiltersend = soap->ffiltersend; soap->ffiltersend = soap_mec_filtersend; data->bufidx = 0; data->i = 0; data->m = 0; ivlen = EVP_CIPHER_iv_length(data->type); if (ivlen) { RAND_pseudo_bytes(iv, ivlen); soap_mec_put_base64(soap, data, (unsigned char*)iv, ivlen); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "IV = ")); DBGHEX(TEST, iv, ivlen); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); ok = EVP_EncryptInit_ex(data->ctx, NULL, NULL, data->key, iv); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EVP_EncryptInit ok=%d\n", ok)); } else { size_t len; /* algorithm */ switch (data->alg & SOAP_MEC_ALGO) { case SOAP_MEC_DES_CBC: data->type = EVP_des_ede3_cbc(); break; case SOAP_MEC_AES128_CBC: data->type = EVP_aes_128_cbc(); break; case SOAP_MEC_AES192_CBC: data->type = EVP_aes_192_cbc(); break; case SOAP_MEC_AES256_CBC: data->type = EVP_aes_256_cbc(); break; case SOAP_MEC_AES512_CBC: data->type = NULL; /* N/A */ break; #if (OPENSSL_VERSION_NUMBER >= 0x10002000L) case SOAP_MEC_AES128_GCM: data->type = EVP_aes_128_gcm(); break; case SOAP_MEC_AES192_GCM: data->type = EVP_aes_192_gcm(); break; case SOAP_MEC_AES256_GCM: data->type = EVP_aes_256_gcm(); break; case SOAP_MEC_AES512_GCM: data->type = NULL; /* N/A */ break; #endif default: data->type = NULL; } if (!data->type) return soap_mec_check(soap, data, 0, "soap_mec_start_alg() failed: cannot load cipher"); len = 2 * sizeof(soap->buf) + EVP_CIPHER_block_size(data->type); if (!data->buf || data->buflen < len) { if (data->buf) SOAP_FREE(soap, data->buf); data->buflen = len; data->buf = (char*)SOAP_MALLOC(soap, data->buflen); } data->bufidx = soap->buflen - soap->bufidx; /* copy buf[bufidx..buflen-1] to data buf */ (void)soap_memcpy((void*)data->buf, data->buflen, (const void*)(soap->buf + soap->bufidx), data->bufidx); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Alloc buf=%lu, copy %lu message bytes\n", (unsigned long)data->buflen, (unsigned long)data->bufidx)); /* trigger ffilterrecv() */ soap->bufidx = soap->buflen; /* INIT state */ data->i = 0; data->m = 0; data->state = SOAP_MEC_STATE_INIT; } return soap_mec_check(soap, data, ok, "soap_mec_start() failed"); } /******************************************************************************/ /** @fn int soap_mec_start(struct soap *soap, const unsigned char *key) @brief Start encryption or decryption of current message. If key is non-NULL, use the symmetric key with alg. Use soap_mec_start only after soap_mec_begin. The soap_mec_start should be followed by a soap_mec_stop call. @param soap context @param[in] key secret DES/AES key or NULL @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_mec_start(struct soap *soap, const unsigned char *key) { return soap_mec_start_alg(soap, SOAP_MEC_NONE, key); } /******************************************************************************/ /** @fn int soap_mec_stop(struct soap *soap) @brief Stops encryption or decryption of current message. Use after soap_mec_start. @param soap context @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_mec_stop(struct soap *soap) { struct soap_mec_data *data; int err = SOAP_OK; data = (struct soap_mec_data*)soap->data[1]; if (!data) return soap->error = SOAP_USER_ERROR; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "MEC Stop alg=0x%x\n", data->alg)); if (data->alg & SOAP_MEC_ENC) { const char *s = NULL; size_t n = 0; err = soap_mec_final(soap, data, &s, &n); /* reset callbacks */ if (soap->ffiltersend == soap_mec_filtersend) soap->ffiltersend = data->ffiltersend; /* send remaining cipher data */ if (!err && n) if (soap_send_raw(soap, s, n)) return soap->error; } return err; } /******************************************************************************/ /** @fn int soap_mec_end(struct soap *soap, struct soap_mec_data *data) @brief Ends encryption or decryption of a sequence of message parts that began with soap_mec_begin. @param soap context @param[in,out] data mecevp engine context @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_mec_end(struct soap *soap, struct soap_mec_data *data) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "MEC End alg=0x%x\n", data->alg)); /* reset callbacks */ if (soap->ffiltersend == soap_mec_filtersend) soap->ffiltersend = data->ffiltersend; if (soap->ffilterrecv == soap_mec_filterrecv) soap->ffilterrecv = data->ffilterrecv; /* restore the mode flag */ soap->mode = data->mode; /* cleanup and reset mecevp engine */ soap_mec_cleanup(soap, data); soap->data[1] = NULL; return SOAP_OK; } /******************************************************************************/ /** @fn size_t soap_mec_size(int alg, SOAP_MEC_KEY_TYPE *pkey) @brief Returns the number of octets needed to store the public/private key or the symmetric key, depending on the algorithm. @param[in] alg is the algorithm to be used @param[in] pkey is a pointer to an EVP_PKEY object or NULL for symmetric keys @return size_t number of octets that is needed to hold the key. */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_mec_size(int alg, SOAP_MEC_KEY_TYPE *pkey) { if (alg & SOAP_MEC_ENV) return EVP_PKEY_size(pkey); switch (alg & SOAP_MEC_ALGO & ~SOAP_MEC_GCM) { case SOAP_MEC_DES_CBC: return 24; case SOAP_MEC_AES128_CBC: /* CBC and GCM */ return 16; case SOAP_MEC_AES192_CBC: /* CBC and GCM */ return 24; case SOAP_MEC_AES256_CBC: /* CBC and GCM */ return 32; case SOAP_MEC_AES512_CBC: /* CBC and GCM */ return 64; } return 0; } /******************************************************************************\ * * Static local functions * \******************************************************************************/ /** @fn int soap_mec_upd(struct soap *soap, struct soap_mec_data *data, const char **s, size_t *n, int final) @brief Update encryption/decryption state depending on the current algorithm @param soap context @param[in,out] data mecevp engine context @param[in,out] s input data to convert, afterwards points to converted data (original content is unchanged) @param[in,out] n size of input, afterwards size of output @param[in] final flag to indicate no more input, output is flushed to s @return SOAP_OK or SOAP_SSL_ERROR */ static int soap_mec_upd(struct soap *soap, struct soap_mec_data *data, const char **s, size_t *n, int final) { if (!data || !data->ctx) return soap->error = SOAP_USER_ERROR; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "-- MEC Update alg=0x%x n=%lu final=%d (%p) --\n", data->alg, (unsigned long)*n, final, data->ctx)); DBGMSG(TEST, *s, *n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--\n")); if (data->alg & SOAP_MEC_ENC) { if (soap_mec_upd_enc(soap, data, s, n, final)) return soap->error; } else { if (soap_mec_upd_dec(soap, data, s, n, final)) return soap->error; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--\n")); DBGMSG(TEST, *s, *n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--\n")); return SOAP_OK; } /******************************************************************************/ /** @fn int soap_mec_upd_enc(struct soap *soap, struct soap_mec_data *data, const char **s, size_t *n, int final) @brief Update encryption state with input plain text (or raw) data and output in base64 format. @param soap context @param[in,out] data mecevp engine context @param[in,out] s input plain text, afterwards points to output cipher data @param[in,out] n size of input text, afterwards size of cipher data @param[in] final flag to indicate no more input, output is flushed to s @return SOAP_OK or SOAP_SSL_ERROR */ static int soap_mec_upd_enc(struct soap *soap, struct soap_mec_data *data, const char **s, size_t *n, int final) { size_t k; int m; int ok = 0; if (!data->type) return soap_mec_check(soap, data, 0, "soap_mec_upd_enc() failed"); /* cipher size */ k = *n + EVP_CIPHER_block_size(data->type); /* scale by base64 size + in-use part + 8 margin */ m = data->bufidx + 8 + (k + 2) / 3 * 4 + 1; #if (OPENSSL_VERSION_NUMBER >= 0x10002000L) if (final && (data->alg & SOAP_MEC_GCM)) m += sizeof(data->tag); #endif /* fits in buf after bufidx? */ if (m > (int)data->buflen) { char *t = data->buf; data->buflen = m; /* + slack? */ data->buf = (char*)SOAP_MALLOC(soap, m); if (t) { (void)soap_memcpy((void*)data->buf, (size_t)m, (const void*)t, data->bufidx); /* copy in-use part */ SOAP_FREE(soap, t); } } if (!final) { /* envelope encryption or with shared key? */ if (data->alg & SOAP_MEC_ENV) { ok = EVP_SealUpdate(data->ctx, (unsigned char*)data->buf + data->buflen - k, &m, (unsigned char*)*s, (int)*n); DBGHEX(TEST, (unsigned char*)(data->buf + data->buflen - k), m); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--\n")); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EVP_SealUpdate ok=%d\n", ok)); } else { ok = EVP_EncryptUpdate(data->ctx, (unsigned char*)data->buf + data->buflen - k, &m, (unsigned char*)*s, (int)*n); DBGHEX(TEST, (unsigned char*)(data->buf + data->buflen - k), m); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--\n")); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EVP_EncryptUpdate ok=%d\n", ok)); } /* convert to base64 */ soap_mec_put_base64(soap, data, (unsigned char*)(data->buf + data->buflen - k), m); *s = data->buf; *n = data->bufidx; if (!(data->alg & SOAP_MEC_STORE)) data->bufidx = 0; } else { /* envelope encryption or with shared key? */ if (data->alg & SOAP_MEC_ENV) { ok = EVP_SealFinal(data->ctx, (unsigned char*)data->buf + data->buflen - k, &m); DBGHEX(TEST, (unsigned char*)(data->buf + data->buflen - k), m); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--\n")); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EVP_SealFinal ok=%d\n", ok)); } else { ok = EVP_EncryptFinal(data->ctx, (unsigned char*)data->buf + data->buflen - k, &m); DBGHEX(TEST, (unsigned char*)(data->buf + data->buflen - k), m); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--\n")); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EVP_EncryptFinal ok=%d\n", ok)); } /* convert to base64 */ soap_mec_put_base64(soap, data, (unsigned char*)(data->buf + data->buflen - k), m); #if (OPENSSL_VERSION_NUMBER >= 0x10002000L) if (data->alg & SOAP_MEC_GCM) { /* add GCM tag in base64 */ EVP_CIPHER_CTX_ctrl(data->ctx, EVP_CTRL_GCM_GET_TAG, sizeof(data->tag), data->tag); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get GCM tag = ")); DBGHEX(TEST, data->tag, sizeof(data->tag)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); soap_mec_put_base64(soap, data, (unsigned char*)(data->tag), sizeof(data->tag)); } #endif soap_mec_end_base64(soap, data); *s = data->buf; *n = data->bufidx; if (!(data->alg & SOAP_MEC_STORE)) data->bufidx = 0; } if (m > (int)k) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Assertion m<=k failed k=%lu m=%lu\n", (unsigned long)k, (unsigned long)m)); return soap->error = SOAP_USER_ERROR; } return soap_mec_check(soap, data, ok, "soap_mec_upd_enc() failed"); } /******************************************************************************/ /** @fn int soap_mec_upd_dec(struct soap *soap, struct soap_mec_data *data, const char **s, size_t *n, int final) @brief Update decryption state with input cipher data in base64 format and output in plain text (or raw) format @param soap context @param[in,out] data mecevp engine context @param[in,out] s input cipher data, afterwards points to output plain text @param[in,out] n size of input cipher data, afterwards size of plain text @param[in] final flag to indicate no more input, output is flushed to s @return SOAP_OK or SOAP_SSL_ERROR */ static int soap_mec_upd_dec(struct soap *soap, struct soap_mec_data *data, const char **s, size_t *n, int final) { const char *r = NULL; size_t k = 0, l = 0, m = 0; int len = 0; int ok = 1; int rest = 0; enum SOAP_MEC_STATE state = data->state; if (!data->type) return soap_mec_check(soap, data, 0, "soap_mec_upd_dec() failed"); if (final && state == SOAP_MEC_STATE_DECRYPT) data->state = SOAP_MEC_STATE_FINAL; /* if flushing the buf, no base64-decode or decryption to do */ if (state == SOAP_MEC_STATE_FLUSH || state == SOAP_MEC_STATE_NONE) { /* old + new fit in buf? */ if (data->bufidx + *n > data->buflen) { char *t = data->buf; do data->buflen += sizeof(soap->buf); while (data->buflen < data->bufidx + *n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enlarging buffer n=%lu\n", (unsigned long)data->buflen)); data->buf = (char*)SOAP_MALLOC(soap, data->buflen); if (t) { (void)soap_memcpy((void*)data->buf, data->buflen, (const void*)t, data->bufidx); /* copy old */ SOAP_FREE(soap, t); } } /* concat old + new */ (void)soap_memcpy((void*)(data->buf + data->bufidx), data->buflen - data->bufidx, (const void*)*s, *n); *s = data->buf; *n += data->bufidx; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Flush state n=%lu\n", (unsigned long)*n)); /* release old + new for next round (assuming consumer fetches all) */ if (!(data->alg & SOAP_MEC_STORE)) data->bufidx = 0; return SOAP_OK; } if (state == SOAP_MEC_STATE_INIT) { /* at init, base64 is in data->buf[bufidx] copied from buf[] */ data->i = 0; data->m = 0; k = (data->bufidx + *n + 3) / 4 * 3; /* decoded size from old + new */ data->taglen = 0; /* no GCM tag (yet) */ } else k = (*n + 3) / 4 * 3; /* base64-decoded size */ m = k + EVP_CIPHER_block_size(data->type); /* decrypted data size */ /* decrypted + base64-decoded + GCM tag all fit in current buf? */ if (data->buflen < data->bufidx + m + k + data->taglen) { /* no, need to enlarge */ char *t = data->buf; do data->buflen += sizeof(soap->buf); while (data->buflen < data->bufidx + m + k + data->taglen); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enlarging buffer n=%lu\n", (unsigned long)data->buflen)); data->buf = (char*)SOAP_MALLOC(soap, data->buflen); if (t) { (void)soap_memcpy((void*)data->buf, data->buflen, (const void*)t, data->bufidx); /* copy old part */ SOAP_FREE(soap, t); } } /* base64 decode */ if (state == SOAP_MEC_STATE_INIT) { /* base64 is in data buf[0..bufidx-1] and *s */ if (soap_mec_get_base64(soap, data, data->buf + data->buflen - k, &m, data->buf, data->bufidx, &r, &l)) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Base64 stage 1 s=%p n=%lu m=%lu r=%p l=%lu\n", *s, (unsigned long)data->bufidx, (unsigned long)m, r, (unsigned long)l)); /* position 'r' is at a spot that gets overwritten, copy to rest */ if (r) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Base64 stage 2 rest=%lu bytes\n", (unsigned long)*n)); rest = *n; } else { size_t j; /* base64-decode *s */ if (soap_mec_get_base64(soap, data, data->buf + data->buflen - k + m, &j, *s, *n, &r, &l)) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Base64 stage 3 s=%p n=%lu m=%lu r=%p l=%lu\n", *s, (unsigned long)*n, (unsigned long)m, r, (unsigned long)l)); m += j; } data->bufidx = 0; } else if (state != SOAP_MEC_STATE_FINAL && state != SOAP_MEC_STATE_FLUSH) { /* base64-decode *s */ if (soap_mec_get_base64(soap, data, data->buf + data->buflen - k, &m, *s, *n, &r, &l)) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Base64 stage 4 n=%lu m=%lu l=%lu\n", (unsigned long)*n, (unsigned long)m, (unsigned long)l)); } if (r) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Rest = %lu + %lu bytes\n", (unsigned long)l, (unsigned long)rest)); if (data->restlen < l + rest) { if (data->rest) SOAP_FREE(soap, data->rest); data->restlen = l + rest; data->rest = (char*)SOAP_MALLOC(soap, data->restlen); } data->restidx = l + rest; (void)soap_memcpy((void*)data->rest, data->restlen, (const void*)r, l); (void)soap_memcpy((void*)(data->rest + l), data->restlen - l, (const void*)*s, rest); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "--\n")); DBGMSG(TEST, data->rest, data->restidx); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--\n")); } /* debug */ DBGHEX(TEST, (unsigned char*)(data->buf + data->buflen - k), m); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--\n")); /* decryption of data buf[buflen-k] */ switch (data->state) { case SOAP_MEC_STATE_INIT: /* move to next state */ state = SOAP_MEC_STATE_IV; case SOAP_MEC_STATE_IV: /* get the IV data from buf[buflen-k] */ (void)soap_memmove((void*)(data->buf + data->bufidx), data->buflen - data->bufidx, (const void*)(data->buf + data->buflen - k), m); /* add to IV */ data->bufidx += m; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting IV new size=%lu\n", data->bufidx)); /* got all IV data? */ if (data->bufidx >= (size_t)EVP_CIPHER_iv_length(data->type)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got IV = ")); DBGHEX(TEST, (unsigned char*)data->buf, EVP_CIPHER_iv_length(data->type)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\nInitializing alg=0x%x\n", data->alg)); switch (data->alg & SOAP_MEC_MASK & ~SOAP_MEC_ALGO) { case SOAP_MEC_ENV_DEC: ok = EVP_OpenInit(data->ctx, data->type, (unsigned char*)data->key, data->keylen, (unsigned char*)data->buf, (EVP_PKEY*)data->pkey); EVP_CIPHER_CTX_set_padding(data->ctx, 0); /* disable padding check when decrypting for interop */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EVP_OpenInit ok=%d\n", ok)); break; case SOAP_MEC_DEC: ok = EVP_DecryptInit_ex(data->ctx, data->type, NULL, data->key, (unsigned char*)data->buf); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EVP_DecryptInit_ex ok=%d\n", ok)); break; } if (ok) { /* shift rest of data to cipher section */ m = k = data->bufidx - EVP_CIPHER_iv_length(data->type); (void)soap_memmove((void*)(data->buf + data->buflen - k), m, (const void*)(data->buf + EVP_CIPHER_iv_length(data->type)), m); #if (OPENSSL_VERSION_NUMBER >= 0x10002000L) if (data->alg & SOAP_MEC_GCM) { /* rotate the last 128 bits through tag[] buffer */ if (m < sizeof(data->tag)) { (void)soap_memcpy((void*)data->tag, sizeof(data->tag), (const void*)(data->buf + data->buflen - k), m); data->taglen = m; m = 0; } else { m -= sizeof(data->tag); (void)soap_memcpy((void*)data->tag, sizeof(data->tag), (const void*)(data->buf + data->buflen - k + m), sizeof(data->tag)); data->taglen = sizeof(data->tag); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Init GCM tag with %lu bytes\n", (unsigned long)data->taglen)); } #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Decrypt %lu bytes\n", (unsigned long)m)); /* decrypt to buf */ len = 0; switch (data->alg & SOAP_MEC_MASK & ~SOAP_MEC_ALGO) { case SOAP_MEC_ENV_DEC: ok = EVP_OpenUpdate(data->ctx, (unsigned char*)data->buf, &len, (unsigned char*)(data->buf + data->buflen - k), m); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EVP_OpenUpdate len=%d ok=%d\n", len, ok)); break; case SOAP_MEC_DEC: ok = EVP_DecryptUpdate(data->ctx, (unsigned char*)data->buf, &len, (unsigned char*)(data->buf + data->buflen - k), m); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EVP_DecryptUpdate len=%d ok=%d\n", len, ok)); break; } *s = data->buf; *n = (size_t)len; } if (!(data->alg & SOAP_MEC_STORE)) data->bufidx = 0; /* next decoded goes to start of buf */ else data->bufidx = *n; /* next state */ state = SOAP_MEC_STATE_DECRYPT; } else { /* nothing to return yet, need more data */ *n = 0; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "IV/decrypt state n=%lu\n", (unsigned long)*n)); break; case SOAP_MEC_STATE_DECRYPT: #if (OPENSSL_VERSION_NUMBER >= 0x10002000L) if (data->alg & SOAP_MEC_GCM) { /* rotate the last 128 bits through tag[] buffer */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Rotate GCM tag with %lu bytes\n", (unsigned long)data->taglen)); k += data->taglen; m += data->taglen; (void)soap_memcpy((void*)(data->buf + data->buflen - k), k, (const void*)data->tag, data->taglen); if (m < sizeof(data->tag)) { (void)soap_memcpy((void*)data->tag, sizeof(data->tag), (const void*)(data->buf + data->buflen - k), m); data->taglen = m; m = 0; } else { m -= sizeof(data->tag); (void)soap_memcpy((void*)data->tag, sizeof(data->tag), (const void*)(data->buf + data->buflen - k + m), sizeof(data->tag)); data->taglen = sizeof(data->tag); } } #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Decrypt %lu bytes\n", (unsigned long)m)); len = 0; switch (data->alg & SOAP_MEC_MASK & ~SOAP_MEC_ALGO) { case SOAP_MEC_ENV_DEC: ok = EVP_OpenUpdate(data->ctx, (unsigned char*)(data->buf + data->bufidx), &len, (unsigned char*)(data->buf + data->buflen - k), m); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EVP_OpenUpdate len=%d ok=%d\n", len, ok)); break; case SOAP_MEC_DEC: ok = EVP_DecryptUpdate(data->ctx, (unsigned char*)(data->buf + data->bufidx), &len, (unsigned char*)data->buf + data->buflen - k, m); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EVP_DecryptUpdate len=%d ok=%d\n", len, ok)); break; } *s = data->buf; *n = data->bufidx + (size_t)len; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Decrypt state n=%lu\n", (unsigned long)*n)); if (!(data->alg & SOAP_MEC_STORE)) data->bufidx = 0; /* next decoded goes to start of buf */ break; case SOAP_MEC_STATE_FINAL: { /* we know there is enough space to flush *s and *n through the buf */ const char *t = *s; #if (OPENSSL_VERSION_NUMBER >= 0x10002000L) if (data->alg & SOAP_MEC_GCM) { /* use the tag[] buffer */ EVP_CIPHER_CTX_ctrl(data->ctx, EVP_CTRL_GCM_SET_TAG, sizeof(data->tag), data->tag); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set GCM tag = ")); DBGHEX(TEST, data->tag, sizeof(data->tag)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); } #endif k = *n; len = 0; switch (data->alg & SOAP_MEC_MASK & ~SOAP_MEC_ALGO) { case SOAP_MEC_ENV_DEC: ok = EVP_OpenFinal(data->ctx, (unsigned char*)(data->buf + data->bufidx), &len); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EVP_OpenFinal ok=%d\n", ok)); break; case SOAP_MEC_DEC: ok = EVP_DecryptFinal(data->ctx, (unsigned char*)(data->buf + data->bufidx), &len); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EVP_DecryptFinal ok=%d\n", ok)); break; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Append %d bytes from decrypted\n", len)); *s = data->buf; *n = data->bufidx + (size_t)len; if (data->restidx) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Append %lu bytes from rest\n", data->restidx)); (void)soap_memcpy((void*)(data->buf + *n), data->buflen - *n, (const void*)data->rest, data->restidx); *n += data->restidx; } if (k) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Append %lu bytes from input\n", k)); (void)soap_memmove((void*)(data->buf + *n), data->buflen - *n, (const void*)t, k); *n += k; } if (!(data->alg & SOAP_MEC_STORE)) data->bufidx = 0; /* next decoded goes to start of buf */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Final len=%lu\n", (unsigned long)*n)); state = SOAP_MEC_STATE_FLUSH; /* flush data buf, if needed */ break; } default: DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error in decryption state\n")); return soap->error = SOAP_SSL_ERROR; } if (r) { if (state == SOAP_MEC_STATE_DECRYPT) { state = SOAP_MEC_STATE_FINAL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Append rest of stream %lu (%lu <= %lu)\n", data->restidx, *n, data->buflen)); } } data->state = state; return soap_mec_check(soap, data, ok, "soap_mec_upd_dec() failed"); } /******************************************************************************/ /** @fn int soap_mec_check(struct soap *soap, struct soap_mec_data *data, int ok, const char *msg) @brief Check result of init/update/final mecevp engine operations. @param soap context @param[in,out] data mecevp engine context @param[in] ok EVP error value @param[in] msg error message @return SOAP_OK or SOAP_SSL_ERROR */ static int soap_mec_check(struct soap *soap, struct soap_mec_data *data, int ok, const char *msg) { if (ok <= 0) { unsigned long r; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "-- MEC Error (%d)", ok)); while ((r = ERR_get_error())) { ERR_error_string_n(r, soap->msgbuf, sizeof(soap->msgbuf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, " %s: \"%s\";", msg, soap->msgbuf)); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); /* cleanup and reset mecevp engine */ soap_mec_cleanup(soap, data); return soap_set_receiver_error(soap, msg, soap->msgbuf, SOAP_SSL_ERROR); } return SOAP_OK; } /******************************************************************************/ /** @fn void soap_mec_put_base64(struct soap *soap, struct soap_mec_data *data, const unsigned char *s, int n) @brief Write base64 formatted data stored in s of length n to internal buffer @param soap context @param[in,out] data mecevp engine context @param[in] s data to convert @param[in] n length of data to convert */ static void soap_mec_put_base64(struct soap *soap, struct soap_mec_data *data, const unsigned char *s, int n) { char *t; int i; unsigned long m; (void)soap; if (!s || !n) return; t = data->buf + data->bufidx; i = data->i; m = data->m; while (n--) { m = (m << 8) | *s++; if (i++ == 2) { for (i = 4; i > 0; m >>= 6) t[--i] = soap_base64o[m & 0x3F]; t += 4; data->bufidx += 4; } } data->i = i; data->m = m; } /******************************************************************************/ /** @fn void soap_mec_end_base64(struct soap *soap, struct soap_mec_data *data) @brief End writing base64 formatted data to internal buffer @param soap context @param[in,out] data mecevp engine context */ static void soap_mec_end_base64(struct soap *soap, struct soap_mec_data *data) { (void)soap; if (data->i) { char *t; int i; unsigned long m; t = data->buf + data->bufidx; i = data->i; m = data->m; for (; i < 3; i++) m <<= 8; for (i++; i > 0; m >>= 6) t[--i] = soap_base64o[m & 0x3F]; for (i = 3; i > data->i; i--) t[i] = '='; data->bufidx += 4; } data->i = 0; data->m = 0; } /******************************************************************************/ /** @fn int soap_mec_get_base64(struct soap *soap, struct soap_mec_data *data, char *t, size_t *l, const char *s, size_t n, const char **r, size_t *k) @brief Convert base64-formatted data from s[0..n-1] into raw data in t[0..l-1] where l is the max size and set equal or lower if data fits in t. If data does not fit r points to remainder in s[0..n-1] of size k. @param soap context @param[in,out] data mecevp engine context @param[in] t raw data (converted from base64) @param[in,out] l max size of t[], afterwards actual size of data written to t[] @param[in] s data in base64 format @param[in] n size of base64 data @param[out] r if data does not fit in t[], points to s[] remainder to convert @param[out] k if data does not fit in t[], size of remainder in r[] @return SOAP_OK or SOAP_SSL_ERROR */ static int soap_mec_get_base64(struct soap *soap, struct soap_mec_data *data, char *t, size_t *l, const char *s, size_t n, const char **r, size_t *k) { int i; unsigned long m; size_t j; int c; i = data->i; m = data->m; j = 0; for (;;) { do { if (!n--) { *l = j; data->i = i; data->m = m; *r = NULL; *k = 0; return SOAP_OK; } c = *s++; if (c == '=' || c == '<') { switch (i) { case 2: *t++ = (char)((m >> 4) & 0xFF); j++; break; case 3: *t++ = (char)((m >> 10) & 0xFF); *t++ = (char)((m >> 2) & 0xFF); j += 2; } if (c == '<') { s--; n++; } else if (n && *s == '=') { s++; n--; } *l = j; *k = n; *r = s; return SOAP_OK; } if (c >= '+' && c <= '+' + 79) { int b = soap_base64i[c - '+']; if (b >= 64) return soap->error = SOAP_SSL_ERROR; m = (m << 6) + b; i++; } else if (c < 0 || c > 32) return soap->error = SOAP_SSL_ERROR; } while (i < 4); *t++ = (char)((m >> 16) & 0xFF); *t++ = (char)((m >> 8) & 0xFF); *t++ = (char)(m & 0xFF); j += 3; i = 0; m = 0; } } /******************************************************************************\ * * Callbacks registered by plugin * \******************************************************************************/ /** @fn int soap_mec_filtersend(struct soap *soap, const char **s, size_t *n) @brief Callback to modify outbound messages by encrypting through the engine. @param soap context @param[in,out] s plain text message, afterwards set to encrypted message @param[in,out] n plain text message size, afterwards set to encrypted message size @return SOAP_OK or SOAP_SSL_ERROR */ static int soap_mec_filtersend(struct soap *soap, const char **s, size_t *n) { struct soap_mec_data *data = (struct soap_mec_data*)soap->data[1]; if (!data) return SOAP_OK; /* encrypt to base64 */ return soap_mec_upd(soap, data, s, n, 0); } /******************************************************************************/ /** @fn int soap_mec_filterrecv(struct soap *soap, char *buf, size_t *len, size_t maxlen) @brief Callback to modify inbound messages by decrypting through the engine. @param soap context @param[in,out] buf encrypted message, afterwards contains decrypted content @param[in,out] len encrypted message size, afterwards set to decrypted content size @param[in] maxlen max length of allocated buf size to contain decrypted content @return SOAP_OK or SOAP_SSL_ERROR */ static int soap_mec_filterrecv(struct soap *soap, char *buf, size_t *len, size_t maxlen) { struct soap_mec_data *data = (struct soap_mec_data*)soap->data[1]; const char *s = buf; if (!data || (data->alg & SOAP_MEC_MASK) == SOAP_MEC_NONE || (data->alg & SOAP_MEC_ENC)) return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Filter recv len in=%lu maxlen=%lu\n", (unsigned long)*len, (unsigned long)maxlen)); /* convert s[len] to new s with len (new s = data->buf) */ if (soap_mec_upd(soap, data, &s, len, 0)) return soap->error; /* need more data? */ if (*len == 0) return SOAP_OK; /* does the result fit in buf[maxlen]? */ if (*len <= maxlen) { (void)soap_memcpy((void*)buf, maxlen, (const void*)s, *len); /* yes: copy data to buf[] */ data->bufidx = 0; } else { (void)soap_memcpy((void*)buf, maxlen, (const void*)s, maxlen); /* no: copy first part to buf[maxlen] */ (void)soap_memmove((void*)data->buf, data->buflen, (const void*)(s + maxlen), *len - maxlen); /* shift rest to the left */ data->bufidx = *len - maxlen; /* keep rest of the data in s (data->buf) */ *len = maxlen; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Filter recv len out=%lu\n", (unsigned long)*len)); return SOAP_OK; } /******************************************************************************/ #ifdef __cplusplus } #endif gsoap-2.8.91/gsoap/plugin/httpmd5.h0000644000175000017500000000632413525245161016442 0ustar ellertellert/* httpmd5.h gSOAP HTTP Content-MD5 digest plugin. Usage (both client and server, see httpmd5test.h/.c for example): soap_register_plugin(&soap, http_md5); This enables HTTP MD5 checksum generation and checking for SOAP/XML messages WITHOUT attachments. Compile with -DWITH_OPENSSL Link with OpenSSL (for md5evp.c), httpmd5.c, and md5evp.c 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 HTTPMD5_H #define HTTPMD5_H #include "stdsoap2.h" #include "md5evp.h" #ifdef __cplusplus extern "C" { #endif #define HTTP_MD5_ID "SOAP-HTTP-MD5/1.2" /* plugin identification */ extern const char http_md5_id[]; int http_md5(struct soap *soap, struct soap_plugin *p, void *arg); struct http_md5_data { int (*fposthdr)(struct soap*, const char*, const char*); int (*fparsehdr)(struct soap*, const char*, const char*); int (*fprepareinitsend)(struct soap*); int (*fprepareinitrecv)(struct soap*); int (*fpreparesend)(struct soap*, const char*, size_t); int (*fpreparerecv)(struct soap*, const char*, size_t); int (*fpreparefinalrecv)(struct soap*); void *context; char digest[16]; }; #ifdef __cplusplus } #endif #endif gsoap-2.8.91/gsoap/plugin/curlapi.h0000644000175000017500000000704213525245161016512 0ustar ellertellert/* curlapi.h cURL plugin. gSOAP XML Web services tools Copyright (C) 2000-2017, 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-2017, 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 CURLAPI_H #define CURLAPI_H #include "stdsoap2.h" #include #ifdef __cplusplus extern "C" { #endif /** Plugin identification for plugin registry */ #define SOAP_CURL_ID "SOAP-CURL/1.2" /** Plugin identification for plugin registry */ extern const char soap_curl_id[]; /** @brief plugin data to store CURL handle and override callbacks */ struct soap_curl_data { struct soap *soap; CURL *curl; /**< CURL handle (passed as arg to plugin or internal) */ short own; /**< we own the CURL handle */ short active; /**< when true: override IO */ struct curl_slist *hdr; /**< to add custom HTTP headers */ char *blk; /**< current block of data received from CURL stored in blist lst */ char *ptr; /**< points to data in blk */ struct soap_blist *lst; /**< block list with data sent to CURL and received from CURL */ soap_mode mode; char buf[CURL_ERROR_SIZE]; int (*fconnect)(struct soap*, const char*, const char*, int); int (*fsend)(struct soap*, const char*, size_t); size_t (*frecv)(struct soap*, char*, size_t); int (*fprepareinitrecv)(struct soap*); int (*fpreparefinalrecv)(struct soap*); }; SOAP_FMAC1 int SOAP_FMAC2 soap_curl(struct soap *soap, struct soap_plugin *p, void *arg); SOAP_FMAC1 void SOAP_FMAC2 soap_curl_reset(struct soap *soap); #ifdef __cplusplus } #endif #endif gsoap-2.8.91/gsoap/plugin/README.txt0000644000175000017500000000361513525245161016402 0ustar ellertellertThis directory contains plugins for extending the gSOAP engine's capabilities. cacerts.* To embed client-side certificate chain in code (no cacerts.pem) curlapi.* cURL plugin for clients, see gsoap/doc/curl/html/index.html httpda.* HTTP Digest Authentication, see gsoap/doc/httpda/html/index.html httpget.* HTTP GET method support for servers httpform.* HTTP POST application/x-www-form-urlencoded support for servers httppost.* HTTP POST method support for servers to handle non-SOAP requests httppipe.* HTTP pipelining support for servers httpmd5.* HTTP MD5 checksums logging.* Message logging (selective inbound/outbound) mq.* Message queueing (for WS-RM message queueing support) plugin.* Example plugin for aspiring plugin developers sessions.* HTTP session management plugin for servers wsaapi.* WS-Addressing (wsa) plugin, see doc/wsa wsrmapi.* WS-ReliableMessaging (wsrm) plugin, see doc/wsrm wsseapi.* WS-Security (wsse) plugin, see doc/wsse wsseapi-lite.* WS-Security lite API, see doc/wsse-lite wsddapi.* WS-Discovery (wsdd) library, see doc/wsdd Supporting modules: smdevp.* EVP-based streaming (signed) message digest engine mecevp.* EVP-based streaming message encryption engine md5evp.* MD5 EVP interface for httpmd5 threads.* Portable threads, mutex, and condition variables Test programs for plugins: httpdatest.* HTTP Digest Athentication test and example code httpgettest.* HTTP GET test and example code httpposttest.* HTTP POST test and example code httpmd5test.* HTTP MD5 integrity protection test and example code C versus C++ usage: All files are suitable for C and C++ compilation and C++ checks are included in the source code whenever applicable. If necessary, rename the .c file(s) to .cpp for your project. IMPORTANT FOR VISUAL STUDIO USERS: make sure to compile all sources in C++ compilation mode. If you migrate to a project file .vcproj, please set CompileAs="2" in your .vcproj file. gsoap-2.8.91/gsoap/plugin/md5evp.c0000644000175000017500000000773713525245161016261 0ustar ellertellert/* 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: soap_ssl_init(); if (!*context) { #if (OPENSSL_VERSION_NUMBER < 0x10100000L) *context = (void*)SOAP_MALLOC(soap, sizeof(EVP_MD_CTX)); EVP_MD_CTX_init((EVP_MD_CTX*)*context); #else *context = EVP_MD_CTX_new(); #endif 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_ex(ctx, EVP_md5(), NULL); break; case MD5_UPDATE: ctx = (EVP_MD_CTX*)*context; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "-- MD5 Update %p (%lu) --\n", ctx, (unsigned long)len)); DBGMSG(TEST, buf, len); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--")); EVP_DigestUpdate(ctx, (const void*)buf, (unsigned int)len); break; case MD5_FINAL: ctx = (EVP_MD_CTX*)*context; EVP_DigestFinal_ex(ctx, (unsigned char*)hash, &size); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "-- MD5 Final %p --\n", ctx)); DBGHEX(TEST, hash, size); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--")); (void)soap_memcpy((void*)buf, 16, (const void*)hash, 16); break; case MD5_DELETE: ctx = (EVP_MD_CTX*)*context; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "-- MD5 Delete %p --\n", ctx)); if (ctx) { #if (OPENSSL_VERSION_NUMBER < 0x10100000L) EVP_MD_CTX_cleanup(ctx); SOAP_FREE(soap, ctx); #else EVP_MD_CTX_free(ctx); #endif } *context = NULL; } return SOAP_OK; } #ifdef __cplusplus } #endif gsoap-2.8.91/gsoap/plugin/wsseapi-lite.c0000644000175000017500000007530013525245161017456 0ustar ellertellert/* wsseapi-lite.c WS-Security, lite version (time stamp and user name token only). gSOAP XML Web services tools Copyright (C) 2000-2015, 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-2015, 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 -------------------------------------------------------------------------------- */ /** @mainpage - @ref wsse documents the wsse lite API for WS-Security 1.0 support. */ /** @page wsse WS-Security lite [TOC] @section wsse_5 Security Header The material in this section relates to the WS-Security specification section 5. To use the wsse lite API: -# Run wsdl2h -t typemap.dat on a WSDL of a service that requires WS-Security headers. The typemap.dat file is used to recognize and translate Security header blocks. -# Run soapcpp2 on the header file produced by wsdl2h. -# Use the wsse lite API functions described below to add time stamp and user name tokens. If HTTPS is required with OpenSSL then please follow the instructions in Section @ref wsse_11 to ensure thread-safety of WS-Security with HTTPS. The wsse lite API is located in: - `gsoap/plugin/wsseapi-lite.h` wsse lite API. - `gsoap/plugin/wsseapi-lite.c` wsse lite API for C and C++. You will also need: - compile all sources with `-DWITH_OPENSSL` to enable HTTPS. - if you have zlib installed, compile all sources also with `-DWITH_GZIP`. - link with `-lssl -lcrypto -lz -gsoapssl++` (or `-lgsoapssl` for C, or compile `stdsoap2.cpp` for C++ and `stdsoap2.c` for C). The gSOAP header file for soapcpp2 should import wsse.h (or the older 2002 version wsse2.h): @code #import "wsse.h" @endcode The wsdl2h tool adds the necessary imports to the generated header file if the WSDL declares the use of WS-Security. If not, you may have to add the import manually before running soapcpp2. The wsse lite API consists of a set of functions to populate and verify WS-Security headers and message body content. For more details, we refer to the following sections that correspond to the WS-Security specification sections: - Section 6 @ref wsse_6 - Section 10 @ref wsse_10 - @ref wsse_11 The basic API is introduced below. To add an empty Security header block to the SOAP header, use: @code soap_wsse_add_Security(soap); @endcode To delete a Security header, use: @code soap_wsse_delete_Security(soap); @endcode Adding an empty Security header block is not very useful. In the following, we present the higher-level functions of the wsse lite API to populate and verify Security header content. @note The soap context includes an actor value soap.actor that is populated and rendered as the SOAP-ENV:actor (SOAP 1.1) or SOAP-ENV:role (SOAP 1.2) attribute in XML within the generic SOAP Header. The attribute is optional, but should be used to target a recipient such as an intermediate node to process the SOAP header. In contrast, actor or role attributes within Security header blocks target specific recipients to process the Security header block. The gSOAP implementation does not automate this feature and application should set and check the actor/role attribute when necessary. In addition, the current implementation supports the inclusion of a single Security header block in the SOAP header. To populate the SOAP-ENV:actor or SOAP-ENV:role attribute within the Security header, use: @code soap_wsse_add_Security_actor(soap, "recipient"); @endcode To obtain the actor or role value (e.g. after receiving a message), use: @code _wsse__Security *security = soap_wsse_Security(soap); if (security) { ... = security->SOAP_ENV__actor; // SOAP 1.1 ... = security->SOAP_ENV__role; // SOAP 1.2 @endcode The SOAP-ENV:mustUnderstand attribute is automatically added and checked by the gSOAP engine. A gSOAP application compiled without Security support will reject Security headers. Security header blocks are attached to the soap context, which means that the information will be automatically kept to support multiple invocations. @section wsse_6 Security Tokens The material in this section relates to the WS-Security specification section 6. @subsection wsse_6_2 User Name Token To add a user name token to the Security header block, use: @code soap_wsse_add_UsernameTokenText(soap, "Id", "username", NULL); @endcode The `Id` value is optional and not used in the wsse lite API. These `Id`s are serialized as wsu:Id identifiers for cross-referencing XML elements. To add a user name token with clear text password, use: @code soap_wsse_add_UsernameTokenText(soap, "Id", "username", "password"); @endcode It is strongly recommended to use `soap_wsse_add_UsernameTokenText` only in combination with HTTPS encrypted transmission or not at all. A better alternative is to use password digests (not supported in this wsse lite API). Clear-text passwords are verified with `soap_wsse_verify_Password`. To verify a password at the receiving side to authorize a request (e.g. within a Web service operation), use: @code int ns__myMethod(struct soap *soap, ...) { const char *username = soap_wsse_get_Username(soap); const char *password; if (!username) return soap->error; // no username: return FailedAuthentication (from soap_wsse_get_Username) password = ...; // lookup password of username if (soap_wsse_verify_Password(soap, password)) { int err = soap->error; soap_wsse_delete_Security(soap); // remove old security headers return err; // password verification failed: return FailedAuthentication } return SOAP_OK; } @endcode Note that the `soap_wsse_get_Username` functions sets the wsse:FailedAuthentication fault upon failure. It is common for the API functions functions to return SOAP_OK or a wsse fault that should be passed to the sender by returning soap->error from service operations. The fault is displayed with the `soap_print_fault` function. @section wsse_10 Security Timestamps The material in this section relates to the WS-Security specification section 10. To add a timestamp with the creation time to the Security header, use: @code soap_wsse_add_Timestamp(soap, NULL, 0); // no expiration @endcode The lifetime of a message (in seconds) is passed as the third argument, which will be displayed as the timestamp expiration time: @code soap_wsse_add_Timestamp(soap, NULL, 10); // 10 seconds lifetime @endcode @section wsse_11 WS-Security and HTTPS HTTPS is used at the client side with the usual "https:" URL addressing, shown here: @code #include "wsseapi-lite.h" #include "threads.h" struct soap *soap; if (CRYPTO_thread_setup()) ... // error soap = soap_new1(SOAP_XML_CANONICAL | SOAP_XML_INDENT); if (soap_ssl_client_context(&soap, SOAP_SSL_DEFAULT, // requires server authentication NULL, // keyfile for client authentication to server NULL, // the keyfile password "cacerts.pem", // cafile CA certificates to authenticate the server NULL, // capath CA directory path to certificates NULL )) ... // error soap->cafile = "cacerts.pem"; // same as above (or overrides the above) soap->capath = "dir/to/certs"; // and/or point to CA certs soap->crlfile = "revoked.pem"; // use CRL (optional) soap_wsse_delete_Security(soap); // remove any previous header content soap_wsse_add_UsernameTokenText(soap, NULL, "username", "password"); soap_wsse_add_Timestamp(soap, NULL, 10); // 10 seconds lifetime if (soap_call_ns__myMethod(soap, "https://...", ...)) ... // error ... // process response results soap_destroy(soap); soap_end(soap); soap_free(soap); CRYPTO_thread_cleanup(); @endcode With OpenSSL, the CRYPTO threads should be set up before any threads are created. The `soap_ssl_client_context` only needs to be set up once. Use the following flags: - `SOAP_SSL_DEFAULT` requires server authentication, CA certs should be used - `SOAP_SSL_NO_AUTHENTICATION` disables server authentication - `SOAP_SSL_SKIP_HOST_CHECK` disables server authentication host check - `SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE` to accept self-signed certificates, expired certificates, and certificates without CRL. The server uses the following: @code #include "wsseapi-lite.h" #include "threads.h" SOAP_SOCKET m, s; int port = 443; struct soap *soap; if (CRYPTO_thread_setup()) ... // error soap = soap_new1(SOAP_XML_CANONICAL | SOAP_XML_INDENT); if (soap_ssl_server_context(&soap, SOAP_SSL_DEFAULT, // requires server to authenticate, but not the client server.pem, // keyfile for authentication to client "password", // the keyfile password NULL, // CA certificates to authenticate the client NULL, // CA directory path to certificates NULL, // use RSA 2048 bits (or give file name with DH param) NULL, NULL )) ... // error if (!soap_valid_socket(m = soap_bind(soap, NULL, port, 100)) ... // error for (;;) { if (!soap_valid_socket(s = soap_accept(soap))) ... // error else { struct soap *tsoap = soap_copy(soap); while (THREAD_CREATE(&tid, (void*(*)(void*))&process_request, (void*)tsoap)) sleep(1); } } soap_destroy(soap); soap_end(soap); soap_free(soap); CRYPTO_thread_cleanup(); @endcode where we define a process_request function that is executed by the thread to process the request (on a copy of the soap context struct): @code void *process_request(struct soap *soap) { if (soap_ssl_accept(soap) || soap_serve(soap)) ... // error soap_destroy(soap); soap_end(soap); soap_free(soap); } @endcode The `soap_ssl_server_context` only needs to be set up once. Use the following flags: - `SOAP_SSL_DEFAULT` requires server authentication, but no client authentication - `SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION` requires client authentication With OpenSSL, we need to define the thread set up and clean up operations as follows: @code struct CRYPTO_dynlock_value { MUTEX_TYPE mutex; }; static MUTEX_TYPE *mutex_buf; static struct CRYPTO_dynlock_value *dyn_create_function(const char *file, int line) { struct CRYPTO_dynlock_value *value; value = (struct CRYPTO_dynlock_value*)malloc(sizeof(struct CRYPTO_dynlock_value)); if (value) MUTEX_SETUP(value->mutex); return value; } static void dyn_lock_function(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line) { if (mode & CRYPTO_LOCK) MUTEX_LOCK(l->mutex); else MUTEX_UNLOCK(l->mutex); } static void dyn_destroy_function(struct CRYPTO_dynlock_value *l, const char *file, int line) { MUTEX_CLEANUP(l->mutex); free(l); } void locking_function(int mode, int n, const char *file, int line) { if (mode & CRYPTO_LOCK) MUTEX_LOCK(mutex_buf[n]); else MUTEX_UNLOCK(mutex_buf[n]); } unsigned long id_function() { return (unsigned long)THREAD_ID; } int CRYPTO_thread_setup() { int i; mutex_buf = (MUTEX_TYPE*)malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t)); if (!mutex_buf) return SOAP_EOM; for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_SETUP(mutex_buf[i]); CRYPTO_set_id_callback(id_function); CRYPTO_set_locking_callback(locking_function); CRYPTO_set_dynlock_create_callback(dyn_create_function); CRYPTO_set_dynlock_lock_callback(dyn_lock_function); CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function); return SOAP_OK; } void CRYPTO_thread_cleanup() { int i; if (!mutex_buf) return; CRYPTO_set_id_callback(NULL); CRYPTO_set_locking_callback(NULL); CRYPTO_set_dynlock_create_callback(NULL); CRYPTO_set_dynlock_lock_callback(NULL); CRYPTO_set_dynlock_destroy_callback(NULL); for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_CLEANUP(mutex_buf[i]); free(mutex_buf); mutex_buf = NULL; } @endcode For additional details and examples, see the user guide and examples in the gSOAP package directory `gsoap/samples/ssl`. */ #include "wsseapi-lite.h" #if defined(SOAP_WSA_2003) || defined(SOAP_WSA_2004) || defined(SOAP_WSA_200408) || defined(SOAP_WSA_2005) #include "wsaapi.h" #endif /** Clock skew between machines (in sec) to fit message expiration in window */ #define SOAP_WSSE_CLKSKEW (300) #ifdef __cplusplus extern "C" { #endif /******************************************************************************\ * * Common URIs * \******************************************************************************/ const char *wsse_PasswordTextURI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"; /******************************************************************************\ * * wsse:Security header element * \******************************************************************************/ /** @fn _wsse__Security* soap_wsse_add_Security(struct soap *soap) @brief Adds Security header element. @param soap context @return _wsse__Security object */ SOAP_FMAC1 struct _wsse__Security * SOAP_FMAC2 soap_wsse_add_Security(struct soap *soap) { DBGFUN("soap_wsse_add_Security"); /* if we don't have a SOAP Header, create one */ soap_header(soap); /* if we don't have a wsse:Security element in the SOAP Header, create one */ if (!soap->header->wsse__Security) { soap->header->wsse__Security = (_wsse__Security*)soap_malloc(soap, sizeof(_wsse__Security)); if (!soap->header->wsse__Security) return NULL; soap_default__wsse__Security(soap, soap->header->wsse__Security); } return soap->header->wsse__Security; } /******************************************************************************/ /** @fn _wsse__Security* soap_wsse_add_Security_actor(struct soap *soap, const char *actor) @brief Adds Security header element with actor or role attribute. @param soap context @param actor string @return _wsse__Security object */ SOAP_FMAC1 struct _wsse__Security * SOAP_FMAC2 soap_wsse_add_Security_actor(struct soap *soap, const char *actor) { _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN1("soap_wsse_add_Security_actor", "actor=%s", actor); if (soap->namespaces && !strcmp(soap->namespaces[0].ns, "http://schemas.xmlsoap.org/soap/envelope/")) security->SOAP_ENV__actor = soap_strdup(soap, actor); else security->SOAP_ENV__role = soap_strdup(soap, actor); return security; } /******************************************************************************/ /** @fn void soap_wsse_delete_Security(struct soap *soap) @brief Deletes Security header element. @param soap context */ SOAP_FMAC1 void SOAP_FMAC2 soap_wsse_delete_Security(struct soap *soap) { DBGFUN("soap_wsse_delete_Security"); if (soap->header) soap->header->wsse__Security = NULL; } /******************************************************************************/ /** @fn _wsse__Security* soap_wsse_Security(struct soap *soap) @brief Returns Security header element if present. @param soap context @return _wsse__Security object or NULL */ SOAP_FMAC1 struct _wsse__Security * SOAP_FMAC2 soap_wsse_Security(struct soap *soap) { if (soap->header) return soap->header->wsse__Security; return NULL; } /******************************************************************************\ * * wsse:Security/wsu:Timestamp header element * \******************************************************************************/ /** @fn int soap_wsse_add_Timestamp(struct soap *soap, const char *id, time_t lifetime) @brief Adds Timestamp element with optional expiration date+time (lifetime). @param[in] soap context @param[in] id for signature referencing or NULL @param[in] lifetime expressed in time_t units, or 0 for no expiration @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_Timestamp(struct soap *soap, const char *id, time_t lifetime) { _wsse__Security *security = soap_wsse_add_Security(soap); time_t now = time(NULL); char *created = soap_strdup(soap, soap_dateTime2s(soap, now)); char *expired = lifetime ? soap_strdup(soap, soap_dateTime2s(soap, now + lifetime)) : NULL; DBGFUN1("soap_wsse_add_Timestamp", "id=%s", id?id:""); /* allocate a Timestamp if we don't have one already */ if (!security->wsu__Timestamp) { security->wsu__Timestamp = (_wsu__Timestamp*)soap_malloc(soap, sizeof(_wsu__Timestamp)); if (!security->wsu__Timestamp) return soap->error = SOAP_EOM; } soap_default__wsu__Timestamp(soap, security->wsu__Timestamp); /* populate the wsu:Timestamp element */ security->wsu__Timestamp->wsu__Id = soap_strdup(soap, id); security->wsu__Timestamp->Created = created; security->wsu__Timestamp->Expires = expired; return SOAP_OK; } /******************************************************************************/ /** @fn _wsu__Timestamp *soap_wsse_Timestamp(struct soap *soap) @brief Returns Timestamp element if present. @param soap context @return _wsu__Timestamp object or NULL */ SOAP_FMAC1 struct _wsu__Timestamp * SOAP_FMAC2 soap_wsse_Timestamp(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); if (security) return security->wsu__Timestamp; return NULL; } /******************************************************************************/ /** @fn int soap_wsse_verify_Timestamp(struct soap *soap) @brief Verifies the Timestamp/Expires element against the current time. @param soap context @return SOAP_OK or SOAP_FAULT with wsu:MessageExpired fault Sets wsu:MessageExpired fault if wsu:Timestamp is expired. The SOAP_WSSE_CLKSKEW value is used as a margin to mitigate clock skew. Keeps silent when no timestamp is supplied or no expiration date is included in the wsu:Timestamp element. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_Timestamp(struct soap *soap) { _wsu__Timestamp *timestamp = soap_wsse_Timestamp(soap); DBGFUN("soap_wsse_verify_Timestamp"); /* if we have a timestamp with an expiration date, check it */ if (timestamp && timestamp->Expires) { time_t now = time(NULL), expired; soap_s2dateTime(soap, timestamp->Expires, &expired); if (expired + SOAP_WSSE_CLKSKEW <= now) { const char *code = soap_wsu__tTimestampFault2s(soap, wsu__MessageExpired); return soap_wsse_sender_fault_subcode(soap, code, "Message has expired", timestamp->Expires); } } return SOAP_OK; } /******************************************************************************\ * * wsse:Security/UsernameToken header element * \******************************************************************************/ /** @fn int soap_wsse_add_UsernameTokenText(struct soap *soap, const char *id, const char *username, const char *password) @brief Adds UsernameToken element with optional clear-text password. @param soap context @param[in] id string for signature referencing or NULL @param[in] username string @param[in] password string or NULL to omit the password @return SOAP_OK Passwords are sent in the clear, so transport-level encryption is required. @note This release supports the use of at most one UsernameToken in the header. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_UsernameTokenText(struct soap *soap, const char *id, const char *username, const char *password) { _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN2("soap_wsse_add_UsernameTokenText", "id=%s", id?id:"", "username=%s", username?username:""); /* allocate a UsernameToken if we don't have one already */ if (!security->UsernameToken) { security->UsernameToken = (_wsse__UsernameToken*)soap_malloc(soap, sizeof(_wsse__UsernameToken)); if (!security->UsernameToken) return soap->error = SOAP_EOM; } soap_default__wsse__UsernameToken(soap, security->UsernameToken); /* populate the UsernameToken */ security->UsernameToken->wsu__Id = soap_strdup(soap, id); security->UsernameToken->Username = soap_strdup(soap, username); /* allocate and populate the Password */ if (password) { security->UsernameToken->Password = (_wsse__Password*)soap_malloc(soap, sizeof(_wsse__Password)); if (!security->UsernameToken->Password) return soap->error = SOAP_EOM; soap_default__wsse__Password(soap, security->UsernameToken->Password); security->UsernameToken->Password->Type = (char*)wsse_PasswordTextURI; security->UsernameToken->Password->__item = soap_strdup(soap, password); } return SOAP_OK; } /******************************************************************************/ /** @fn _wsse__UsernameToken* soap_wsse_UsernameToken(struct soap *soap, const char *id) @brief Returns UsernameToken element if present. @param soap context @param[in] id string of UsernameToken or NULL @return _wsse__UsernameToken object or NULL @note This release supports the use of at most one UsernameToken in the header. */ SOAP_FMAC1 struct _wsse__UsernameToken * SOAP_FMAC2 soap_wsse_UsernameToken(struct soap *soap, const char *id) { _wsse__Security *security = soap_wsse_Security(soap); if (security && security->UsernameToken && (!id || (security->UsernameToken->wsu__Id && !strcmp(security->UsernameToken->wsu__Id, id)))) return security->UsernameToken; return NULL; } /******************************************************************************/ /** @fn const char* soap_wsse_get_Username(struct soap *soap) @brief Returns UsernameToken/username string or wsse:FailedAuthentication fault. @param soap context @return UsernameToken/username string or NULL with wsse:FailedAuthentication fault error set @see soap_wsse_verify_Password The returned username should be used to lookup the user's password in a dictionary or database for server-side authentication with soap_wsse_verify_Password. */ SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsse_get_Username(struct soap *soap) { _wsse__UsernameToken *token = soap_wsse_UsernameToken(soap, NULL); DBGFUN("soap_wsse_get_Username"); if (token) return token->Username; soap_wsse_fault(soap, wsse__FailedAuthentication, "Username authentication required"); return NULL; } /******************************************************************************/ /** @fn int soap_wsse_verify_Password(struct soap *soap, const char *password) @brief Verifies the supplied password or sets wsse:FailedAuthentication fault. @param soap context @param[in] password string to verify against @return SOAP_OK (authorized) or SOAP_FAULT with wsse:FailedAuthentication fault The verification supports both clear-text password verification only. @note This release supports the use of at most one UsernameToken in the header. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_Password(struct soap *soap, const char *password) { _wsse__UsernameToken *token = soap_wsse_UsernameToken(soap, NULL); DBGFUN("soap_wsse_verify_Password"); /* if we have a UsernameToken with a Password, check it */ if (token && token->Password) { /* password digest or text? */ if (token->Password->Type && !strcmp(token->Password->Type, wsse_PasswordTextURI)) { /* check password text */ if (!strcmp(token->Password->__item, password)) return SOAP_OK; } } return soap_wsse_fault(soap, wsse__FailedAuthentication, NULL); } /******************************************************************************\ * * Faults * \******************************************************************************/ /** @fn int soap_wsse_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) @brief Sets sender SOAP Fault (sub)code for server fault response. @param soap context @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) { #if defined(SOAP_WSA_2003) || defined(SOAP_WSA_2004) || defined(SOAP_WSA_200408) || defined(SOAP_WSA_2005) return soap_wsa_sender_fault_subcode(soap, faultsubcode, faultstring, faultdetail); #else return soap_sender_fault_subcode(soap, faultsubcode, faultstring, faultdetail); #endif } /******************************************************************************/ /** @fn int soap_wsse_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) @brief Sets receiver SOAP Fault (sub)code for server fault response. @param soap context @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) { #if defined(SOAP_WSA_2003) || defined(SOAP_WSA_2004) || defined(SOAP_WSA_200408) || defined(SOAP_WSA_2005) return soap_wsa_receiver_fault_subcode(soap, faultsubcode, faultstring, faultdetail); #else return soap_receiver_fault_subcode(soap, faultsubcode, faultstring, faultdetail); #endif } /******************************************************************************/ /** @fn int soap_wsse_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail) @brief Sets sender SOAP Fault for server fault response. @param soap context @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail) { return soap_wsse_sender_fault_subcode(soap, NULL, faultstring, faultdetail); } /******************************************************************************/ /** @fn int soap_wsse_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail) @brief Sets receiver SOAP Fault for server fault response. @param soap context @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail) { return soap_wsse_receiver_fault_subcode(soap, NULL, faultstring, faultdetail); } /******************************************************************************/ /** @fn int soap_wsse_fault(struct soap *soap, wsse__FaultcodeEnum fault, const char *detail) @brief Sets SOAP Fault (sub)code for server response. @param soap context @param[in] fault is one of wsse:FaultcodeEnum @param[in] detail string with optional text message @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_fault(struct soap *soap, wsse__FaultcodeEnum fault, const char *detail) { const char *code = soap_wsse__FaultcodeEnum2s(soap, fault); DBGFUN2("soap_wsse_fault", "fault=%s", code?code:"", "detail=%s", detail?detail:""); /* remove incorrect or incomplete Security header */ soap_wsse_delete_Security(soap); /* populate the SOAP Fault as per WS-Security spec */ /* detail = NULL; */ /* uncomment when detail text not recommended */ /* use WSA to populate the SOAP Header when WSA is used */ switch (fault) { case wsse__UnsupportedSecurityToken: return soap_wsse_sender_fault_subcode(soap, code, "An unsupported token was provided", detail); case wsse__UnsupportedAlgorithm: return soap_wsse_sender_fault_subcode(soap, code, "An unsupported signature or encryption algorithm was used", detail); case wsse__InvalidSecurity: return soap_wsse_sender_fault_subcode(soap, code, "An error was discovered processing the header", detail); case wsse__InvalidSecurityToken: return soap_wsse_sender_fault_subcode(soap, code, "An invalid security token was provided", detail); case wsse__FailedAuthentication: return soap_wsse_sender_fault_subcode(soap, code, "The security token could not be authenticated or authorized", detail); case wsse__FailedCheck: return soap_wsse_sender_fault_subcode(soap, code, "The signature or decryption was invalid", detail); case wsse__SecurityTokenUnavailable: return soap_wsse_sender_fault_subcode(soap, code, "Referenced security token could not be retrieved", detail); } return SOAP_FAULT; } /******************************************************************************\ * * Misc functions * \******************************************************************************/ /** @fn int soap_wsse_set_wsu_id(struct soap *soap, const char *tags) @brief Sets the elements that are to be extended with wsu:Id attributes. The wsu:Id attribute values are set to the string value of the tag's QName by replacing colons with hyphens to produce an xsd:ID value. @param soap context @param[in] tags string of space-separated qualified and unqualified element tag names @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_set_wsu_id(struct soap *soap, const char *tags) { DBGFUN1("soap_wsse_set_wsu_id", "tags=%s", tags?tags:"(null)"); soap->wsuid = soap_strdup(soap, tags); return SOAP_OK; } /******************************************************************************/ #ifdef __cplusplus } #endif gsoap-2.8.91/gsoap/plugin/smdevp.c0000644000175000017500000006540613525245161016354 0ustar ellertellert/* smdevp.c gSOAP interface for (signed) message digest gSOAP XML Web services tools Copyright (C) 2000-2015, 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-2015, 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 -------------------------------------------------------------------------------- */ /** @page smdevp The smdevp signed message digest engine The gSOAP smdevp engine computes signed/unsigned message digests over any type of data using the EVP interface of OpenSSL. It currently supports MD5, SHA1/224/256/384/512, HMAC_SHA1/224/256/384/512, DSA_SHA1/224256/384/512, and RSA_SHA1/224/256/384/512. A digest or signature algorithm is selected with one the following: - @ref SOAP_SMD_HMAC_MD5 to compute HMAC-MD5 message authentication code - @ref SOAP_SMD_HMAC_SHA1 to compute HMAC-SHA1 message authentication code - @ref SOAP_SMD_HMAC_SHA224 to compute HMAC-SHA224 message authentication code - @ref SOAP_SMD_HMAC_SHA256 to compute HMAC-SHA256 message authentication code - @ref SOAP_SMD_HMAC_SHA384 to compute HMAC-SHA384 message authentication code - @ref SOAP_SMD_HMAC_SHA512 to compute HMAC-SHA512 message authentication code - @ref SOAP_SMD_DGST_MD5 to compute MD5 128-bit digests - @ref SOAP_SMD_DGST_SHA1 to compute SHA1 160-bit digests - @ref SOAP_SMD_DGST_SHA224 to compute SHA224 224-bit digests - @ref SOAP_SMD_DGST_SHA256 to compute SHA256 256-bit digests - @ref SOAP_SMD_DGST_SHA384 to compute SHA384 384-bit digests - @ref SOAP_SMD_DGST_SHA512 to compute SHA512 512-bit digests - @ref SOAP_SMD_SIGN_DSA_SHA1 to compute DSA-SHA1 signatures - @ref SOAP_SMD_SIGN_DSA_SHA224 to compute DSA-SHA224 signatures - @ref SOAP_SMD_SIGN_DSA_SHA256 to compute DSA-SHA256 signatures - @ref SOAP_SMD_SIGN_DSA_SHA384 to compute DSA-SHA384 signatures - @ref SOAP_SMD_SIGN_DSA_SHA512 to compute DSA-SHA512 signatures - @ref SOAP_SMD_SIGN_RSA_SHA1 to compute RSA-SHA1 signatures - @ref SOAP_SMD_SIGN_RSA_SHA224 to compute RSA-SHA224 signatures - @ref SOAP_SMD_SIGN_RSA_SHA256 to compute RSA-SHA256 signatures - @ref SOAP_SMD_SIGN_RSA_SHA384 to compute RSA-SHA384 signatures - @ref SOAP_SMD_SIGN_RSA_SHA512 to compute RSA-SHA512 signatures - @ref SOAP_SMD_VRFY_DSA_SHA1 to verify DSA-SHA1 signatures - @ref SOAP_SMD_VRFY_DSA_SHA224 to verify DSA-SHA224 signatures - @ref SOAP_SMD_VRFY_DSA_SHA256 to verify DSA-SHA256 signatures - @ref SOAP_SMD_VRFY_DSA_SHA384 to verify DSA-SHA384 signatures - @ref SOAP_SMD_VRFY_DSA_SHA512 to verify DSA-SHA512 signatures - @ref SOAP_SMD_VRFY_RSA_SHA1 to verify RSA-SHA1 signatures - @ref SOAP_SMD_VRFY_RSA_SHA224 to verify RSA-SHA224 signatures - @ref SOAP_SMD_VRFY_RSA_SHA256 to verify RSA-SHA256 signatures - @ref SOAP_SMD_VRFY_RSA_SHA384 to verify RSA-SHA384 signatures - @ref SOAP_SMD_VRFY_RSA_SHA512 to verify RSA-SHA512 signatures Algorithm options: - @ref SOAP_SMD_PASSTHRU to pass XML through the smdevp engine The smdevp engine wraps the EVP API with three new functions: - @ref soap_smd_init to initialize the engine - @ref soap_smd_update to update the state with a message part - @ref soap_smd_final to compute the digest, signature, or verify a signature and to deallocate the engine - @ref soap_smd_cleanup to deallocate the engine A higher-level interface for computing (signed) message digests over messages produced by the gSOAP engine is defined by two new functions: - @ref soap_smd_begin to start a digest or signature computation/verification - @ref soap_smd_end to finalize the digest or signature and clean up Compile all source codes with -DWITH_OPENSSL and link with ssl and crypto libraries. Here is an example to sign an XML serialized C++ object using an RSA private key applied to the SHA digest of the serialized object: @code #include "smdevp.h" ns__Object object; int alg = SOAP_SMD_SIGN_RSA_SHA1; FILE *fd = fopen("key.pem", "r"); EVP_PKEY *key = PEM_read_PrivateKey(fd, NULL, NULL, "password"); char *sig = (char*)soap_malloc(soap, soap_smd_size(alg, key)); int siglen; fclose(fd); if (soap_smd_begin(soap, alg, key, 0) || soap_out_ns__Object(soap, "ns:Object", 0, &object, NULL)) { soap_smd_end(soap, NULL, NULL); // clean up soap_print_fault(soap, stderr); } else if (soap_smd_end(soap, sig, &siglen)) soap_print_fault(soap, stderr); else ... // sig contains RSA-SHA1 signature of length siglen EVP_PKEY_free(key); @endcode Compile the gSOAP sources and your code with -DWITH_OPENSSL and link with OpenSSL libraries. There is no XML output generated by this example, as the object is simply serialized to the smdevp engine. To actually pass the XML object through the smdevp engine and output it to a stream or file simultaneously, use the SOAP_SMD_PASSTHRU flag with the algorithm selection as follows: @code ns__Object object; int alg = SOAP_SMD_SIGN_RSA_SHA1; FILE *fd = fopen("key.pem", "r"); EVP_PKEY *key = PEM_read_PrivateKey(fd, NULL, NULL, "password"); char *sig = (char*)soap_malloc(soap, soap_smd_size(alg, key)); int siglen; fclose(fd); soap->sendfd = open("object.xml", O_CREAT | O_WRONLY, 0600); // a file to save object to if (soap_smd_begin(soap, alg | SOAP_SMD_PASSTHRU, key, 0) || soap_begin_send(soap) || soap_out_ns__Object(soap, "ns:Object", 0, &object, NULL) // save to "object.xml" || soap_end_send(soap)) { soap_smd_end(soap, NULL, NULL); // clean up soap_print_fault(soap, stderr); } else if (soap_smd_end(soap, sig, &siglen)) soap_print_fault(soap, stderr); else ... // sig contains RSA-SHA1 signature of length siglen close(soap->sendfd); EVP_PKEY_free(key); @endcode Note that we used soap_begin_send and soap_end_send to emit the XML to a stream. Each type also has a reader (e.g. soap_read_ns__Object) and writer (e.g. soap_write_ns__Object) that can be used instead as these include soap_begin_recv/soap_end_recv and soap_begin_send/soap_end_send call sequences. To verify the signature of an object read from a stream or file, we pass it through the smdevp engine as follows: @code char *sig = ...; int siglen = ...; ns__Object object; int alg = SOAP_SMD_VRFY_RSA_SHA1; FILE *fd = fopen("key.pem", "r"); EVP_PKEY *key; if (...) // key file contains public key? key = PEM_read_PUBKEY(fd, NULL, NULL, NULL); else // key file contains certificate { X509 *cert = PEM_read_X509(fd, NULL, NULL, NULL); key = X509_get_pubkey(cert); X509_free(cert); } fclose(fd); soap->recvfd = open("object.xml", O_RDONLY); if (soap_smd_begin(soap, alg, key, 0) || soap_begin_recv(soap) || soap_in_ns__Object(soap, "ns:Object", &object, NULL) == NULL || soap_end_recv(soap)) { soap_smd_end(soap, NULL, NULL); // clean up soap_print_fault(soap, stderr); } else if (soap_smd_end(soap, sig, &siglen)) soap_print_fault(soap, stderr); else ... // sig verified, i.e. signed object was not changed close(soap->recvfd); EVP_PKEY_free(key); @endcode To verify the signature of an object stored in memory, we use the RSA public key and re-run the octet stream (by re-serialization in this example) through the smdevp engine using the SOAP_SMD_VRFY_RSA_SHA1 algorithm. Note that a PEM file may contain both the (encrypted) private and public keys. @code char *sig = ...; int siglen = ...; ns__Object object; int alg = SOAP_SMD_VRFY_RSA_SHA1; FILE *fd = fopen("key.pem", "r"); EVP_PKEY *key; if (...) // key file contains public key? key = PEM_read_PUBKEY(fd, NULL, NULL, NULL); else // key file contains certificate { X509 *cert = PEM_read_X509(fd, NULL, NULL, NULL); key = X509_get_pubkey(cert); X509_free(cert); } fclose(fd); if (soap_smd_begin(soap, alg, key, 0) || soap_out_ns__Object(soap, "ns:Object", 0, &object, NULL)) { soap_smd_end(soap, NULL, NULL); // clean up soap_print_fault(soap, stderr); } else if (soap_smd_end(soap, sig, &siglen)) soap_print_fault(soap, stderr); else ... // sig verified, i.e. signed object was not changed EVP_PKEY_free(key); @endcode The HMAC algorithm uses a shared secret key (hence both the sender and receiver must keep it secret) to sign and verify a message: @code ns__Object object; int alg = SOAP_SMD_HMAC_SHA1; static char key[16] = { 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00 }; char *sig = (char*)soap_malloc(soap, soap_smd_size(alg, NULL)); int siglen; if (soap_smd_begin(soap, alg, key, sizeof(key)) || soap_out_ns__Object(soap, "ns:Object", 0, &object, NULL)) { soap_smd_end(soap, NULL, NULL); // clean up soap_print_fault(soap, stderr); } else if (soap_smd_end(soap, sig, &siglen)) soap_print_fault(soap, stderr); else ... // sig holds the signature @endcode HMAC signature verification proceeds by recomputing the signature value for comparison. A digest is a hash value of an octet stream computed using the MD5 or SHA algorithms: @code ns__Object object; int alg = SOAP_SMD_DGST_SHA1; char *digest = (char*)soap_malloc(soap, soap_smd_size(alg, NULL)); int digestlen; if (soap_smd_begin(soap, alg, NULL, 0) || soap_out_ns__Object(soap, "ns:Object", 0, &object, NULL)) { soap_smd_end(soap, NULL, NULL); // clean up soap_print_fault(soap, stderr); } else if (soap_smd_end(soap, digest, &digestlen)) soap_print_fault(soap, stderr); else ... // digest holds hash value of serialized object @endcode Note that indentation (SOAP_XML_INDENT) and exc-c14n canonicalization (SOAP_XML_CANONICAL) affects the XML serialization format and, therefore, the digest or signature produced. */ #include "smdevp.h" #ifdef __cplusplus extern "C" { #endif /******************************************************************************\ * * Static protos * \******************************************************************************/ static int soap_smd_send(struct soap *soap, const char *buf, size_t len); static size_t soap_smd_recv(struct soap *soap, char *buf, size_t len); static int soap_smd_check(struct soap *soap, struct soap_smd_data *data, int err, const char *msg); /******************************************************************************\ * * soap_smd API functions * \******************************************************************************/ /** @fn size_t soap_smd_size(int alg, const void *key) @brief Returns the number of octets needed to store the digest or signature returned by soap_smd_end. @param[in] alg is the digest or signature algorithm to be used @param[in] key is a pointer to an EVP_PKEY object for RSA/DSA signatures or NULL for digests and HMAC @return size_t number of octets that is needed to hold digest or signature @see soap_smd_end The values returned for digests are SOAP_SMD_MD5_SIZE, SOAP_SMD_SHA1_SIZE, SOAP_SMD_SHA256_SIZE, SOAP_SMD_SHA512_SIZE. */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_smd_size(int alg, const void *key) { switch ((alg & SOAP_SMD_ALGO)) { case SOAP_SMD_SIGN: case SOAP_SMD_VRFY: /* OpenSSL EVP_PKEY_size returns size of signatures given a key */ return EVP_PKEY_size((EVP_PKEY*)key); case SOAP_SMD_HMAC: case SOAP_SMD_DGST: switch ((alg & SOAP_SMD_HASH)) { case SOAP_SMD_MD5: return SOAP_SMD_MD5_SIZE; case SOAP_SMD_SHA1: return SOAP_SMD_SHA1_SIZE; case SOAP_SMD_SHA224: return SOAP_SMD_SHA224_SIZE; case SOAP_SMD_SHA256: return SOAP_SMD_SHA256_SIZE; case SOAP_SMD_SHA384: return SOAP_SMD_SHA384_SIZE; case SOAP_SMD_SHA512: return SOAP_SMD_SHA512_SIZE; default: break; } default: break; } return 0; } /******************************************************************************/ /** @fn int soap_smd_begin(struct soap *soap, int alg, const void *key, int keylen) @brief Initiates a digest or signature computation. @param soap context @param[in] alg is the digest or signature (sign/verification) algorithm used @param[in] key is a HMAC key or pointer to EVP_PKEY object or NULL for digests @param[in] keylen is the length of the HMAC key or 0 @return SOAP_OK, SOAP_EOM, or SOAP_SSL_ERROR */ SOAP_FMAC1 int SOAP_FMAC2 soap_smd_begin(struct soap *soap, int alg, const void *key, int keylen) { struct soap_smd_data *data; data = (struct soap_smd_data*)SOAP_MALLOC(soap, sizeof(struct soap_smd_data)); if (!data) return soap->error = SOAP_EOM; /* save and set the engine's 'data' field to pass data to the callbacks */ soap->data[0] = (void*)data; /* save and override the send and recv callbacks */ data->fsend = soap->fsend; data->frecv = soap->frecv; soap->fsend = soap_smd_send; soap->frecv = soap_smd_recv; /* save the mode flag */ data->mode = soap->mode; /* clear the IO flags and DOM flag */ soap->mode &= ~(SOAP_IO | SOAP_IO_LENGTH | SOAP_ENC_ZLIB | SOAP_XML_DOM); /* clear the XML attribute store */ soap_clr_attr(soap); /* load the local XML namespaces store */ soap_set_local_namespaces(soap); if ((soap->mode & SOAP_XML_CANONICAL)) soap->ns = 0; /* for in c14n, we must have all xmlns bindings available */ else if (!(alg & SOAP_SMD_PASSTHRU)) soap->ns = 2; /* we don't want leading whitespace in serialized XML */ /* init the soap_smd engine */ return soap_smd_init(soap, data, alg, key, keylen); } /******************************************************************************/ /** @fn int soap_smd_end(struct soap *soap, char *buf, int *len) @brief Completes a digest or signature computation. Also deallocates temporary storage allocated by soap_smd_begin(), so MUST be called after soap_smd_begin(). @param soap context @param[in] buf contains signature for verification (when using a SOAP_SMD_VRFY algorithm) or NULL for cleanup @param[out] buf is populated with the digest or signature with maximum length soap_smd_size(alg, key) @param[in] len points to length of signature to verify (when using a SOAP_SMD_VRFY algorithm) or NULL for cleanup @param[out] len points to length of stored digest or signature (when not NULL) @return SOAP_OK, SOAP_USER_ERROR, or SOAP_SSL_ERROR */ SOAP_FMAC1 int SOAP_FMAC2 soap_smd_end(struct soap *soap, char *buf, int *len) { struct soap_smd_data *data; int err; data = (struct soap_smd_data*)soap->data[0]; if (!data) { if (soap->error) return soap->error; return soap->error = SOAP_USER_ERROR; } /* finalize the digest/signature computation and store data in buf[len] */ /* for signature verification, buf[len] contain the signature */ err = soap_smd_final(soap, data, buf, len); /* restore the callbacks */ soap->fsend = data->fsend; soap->frecv = data->frecv; /* restore the mode flag */ soap->mode = data->mode; /* free data */ SOAP_FREE(soap, data); soap->data[0] = NULL; /* return SOAP_OK or error */ return err; } /******************************************************************************/ /** @fn int soap_smd_init(struct soap *soap, struct soap_smd_data *data, int alg, const void *key, int keylen) @brief Initiates a (signed) digest computation. @param soap context @param[in,out] data smdevp engine context @param[in] alg is algorithm to use @param[in] key is key to use or NULL for digests @param[in] keylen is length of HMAC key (when provided) @return SOAP_OK or SOAP_SSL_ERROR */ SOAP_FMAC1 int SOAP_FMAC2 soap_smd_init(struct soap *soap, struct soap_smd_data *data, int alg, const void *key, int keylen) { int ok = 1; const EVP_MD *type; soap_ssl_init(); /* the algorithm to use */ data->alg = alg; /* the key to use */ data->key = key; /* allocate and init the OpenSSL HMAC or EVP_MD context */ if ((alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) { #if (OPENSSL_VERSION_NUMBER < 0x10100000L) data->ctx = (void*)SOAP_MALLOC(soap, sizeof(HMAC_CTX)); if (data->ctx) HMAC_CTX_init((HMAC_CTX*)data->ctx); #else data->ctx = (void*)HMAC_CTX_new(); #endif } else { #if (OPENSSL_VERSION_NUMBER < 0x10100000L) data->ctx = (void*)SOAP_MALLOC(soap, sizeof(EVP_MD_CTX)); if (data->ctx) EVP_MD_CTX_init((EVP_MD_CTX*)data->ctx); #else data->ctx = (void*)EVP_MD_CTX_new(); #endif } if (!data->ctx) return soap_set_receiver_error(soap, "soap_smd_init() failed", "No context", SOAP_SSL_ERROR); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "-- SMD Init alg=%x (%p) --\n", alg, data->ctx)); /* init the digest or signature computations */ switch ((alg & SOAP_SMD_HASH)) { case SOAP_SMD_MD5: type = EVP_md5(); break; case SOAP_SMD_SHA1: type = EVP_sha1(); break; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) case SOAP_SMD_SHA224: type = EVP_sha224(); break; case SOAP_SMD_SHA256: type = EVP_sha256(); break; case SOAP_SMD_SHA384: type = EVP_sha384(); break; case SOAP_SMD_SHA512: type = EVP_sha512(); break; #endif default: return soap_smd_check(soap, data, 0, "soap_smd_init() failed: cannot load digest"); } switch ((alg & SOAP_SMD_ALGO)) { case SOAP_SMD_HMAC: HMAC_Init((HMAC_CTX*)data->ctx, key, keylen, type); break; case SOAP_SMD_DGST: EVP_DigestInit((EVP_MD_CTX*)data->ctx, type); break; case SOAP_SMD_SIGN: ok = EVP_SignInit((EVP_MD_CTX*)data->ctx, type); break; case SOAP_SMD_VRFY: ok = EVP_VerifyInit((EVP_MD_CTX*)data->ctx, type); break; default: return soap_set_receiver_error(soap, "Unsupported digest algorithm", NULL, SOAP_SSL_ERROR); } /* check and return */ return soap_smd_check(soap, data, ok, "soap_smd_init() failed"); } /******************************************************************************/ /** @fn int soap_smd_update(struct soap *soap, struct soap_smd_data *data, const char *buf, size_t len) @brief Updates (signed) digest computation with message part. @param soap context @param[in,out] data smdevp engine context @param[in] buf contains message part @param[in] len of message part @return SOAP_OK or SOAP_SSL_ERROR */ SOAP_FMAC1 int SOAP_FMAC2 soap_smd_update(struct soap *soap, struct soap_smd_data *data, const char *buf, size_t len) { int ok = 1; if (!data->ctx) return soap_set_receiver_error(soap, "soap_smd_update() failed", "No context", SOAP_SSL_ERROR); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "-- SMD Update alg=%x n=%lu (%p) --\n", data->alg, (unsigned long)len, data->ctx)); switch ((data->alg & SOAP_SMD_ALGO)) { case SOAP_SMD_HMAC: HMAC_Update((HMAC_CTX*)data->ctx, (const unsigned char*)buf, len); break; case SOAP_SMD_DGST: EVP_DigestUpdate((EVP_MD_CTX*)data->ctx, (const void*)buf, (unsigned int)len); break; case SOAP_SMD_SIGN: ok = EVP_SignUpdate((EVP_MD_CTX*)data->ctx, (const void*)buf, (unsigned int)len); break; case SOAP_SMD_VRFY: ok = EVP_VerifyUpdate((EVP_MD_CTX*)data->ctx, (const void*)buf, (unsigned int)len); break; } DBGMSG(TEST, buf, len); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--")); /* check and return */ return soap_smd_check(soap, data, ok, "soap_smd_update() failed"); } /******************************************************************************/ /** @fn int soap_smd_final(struct soap *soap, struct soap_smd_data *data, char *buf, int *len) @brief Finalizes (signed) digest computation, delete context and returns digest or signature. @param soap context @param[in,out] data smdevp engine context @param[in] buf contains signature for verification (SOAP_SMD_VRFY algorithms) @param[out] buf is populated with the digest or signature @param[in] len points to length of signature to verify (SOAP_SMD_VRFY algorithms) @param[out] len points to length of stored digest or signature (pass NULL if you are not interested in this value) @return SOAP_OK or SOAP_SSL_ERROR */ SOAP_FMAC1 int SOAP_FMAC2 soap_smd_final(struct soap *soap, struct soap_smd_data *data, char *buf, int *len) { unsigned int n = 0; int ok = 1; if (!data->ctx) return soap_set_receiver_error(soap, "soap_smd_final() failed", "No context", SOAP_SSL_ERROR); if (buf) { /* finalize the digest or signature computation */ switch ((data->alg & SOAP_SMD_ALGO)) { case SOAP_SMD_HMAC: HMAC_Final((HMAC_CTX*)data->ctx, (unsigned char*)buf, &n); break; case SOAP_SMD_DGST: EVP_DigestFinal_ex((EVP_MD_CTX*)data->ctx, (unsigned char*)buf, &n); break; case SOAP_SMD_SIGN: ok = EVP_SignFinal((EVP_MD_CTX*)data->ctx, (unsigned char*)buf, &n, (EVP_PKEY*)data->key); break; case SOAP_SMD_VRFY: if (len) { n = (unsigned int)*len; ok = EVP_VerifyFinal((EVP_MD_CTX*)data->ctx, (unsigned char*)buf, n, (EVP_PKEY*)data->key); } else ok = 0; break; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "-- SMD Final alg=%x (%p) %d bytes--\n", data->alg, data->ctx, n)); DBGHEX(TEST, buf, n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--")); /* pass back length of digest or signature produced */ if (len) *len = (int)n; } /* cleanup */ soap_smd_cleanup(soap, data); /* check and return */ return soap_smd_check(soap, data, ok, "soap_smd_final() failed"); } /** @fn void soap_smd_cleanup(struct soap *soap, struct soap_smd_data *data) @brief Clear (signed) digest computation and delete context @param soap context @param[in,out] data smdevp engine context */ SOAP_FMAC1 void SOAP_FMAC2 soap_smd_cleanup(struct soap *soap, struct soap_smd_data *data) { (void)soap; if (data->ctx) { #if (OPENSSL_VERSION_NUMBER < 0x10100000L) if ((data->alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) HMAC_CTX_cleanup((HMAC_CTX*)data->ctx); else EVP_MD_CTX_cleanup((EVP_MD_CTX*)data->ctx); SOAP_FREE(soap, data->ctx); #else if ((data->alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) HMAC_CTX_free((HMAC_CTX*)data->ctx); else EVP_MD_CTX_free((EVP_MD_CTX*)data->ctx); #endif data->ctx = NULL; } } /******************************************************************************\ * * Static local functions * \******************************************************************************/ /** @fn int soap_smd_check(struct soap *soap, struct soap_smd_data *data, int ok, const char *msg) @brief Check result of init/update/final smdevp engine operations. @param soap context @param[in,out] data smdevp engine context @param[in] ok EVP error value @param[in] msg error message @return SOAP_OK or SOAP_SSL_ERROR */ static int soap_smd_check(struct soap *soap, struct soap_smd_data *data, int ok, const char *msg) { if (ok <= 0) { unsigned long r; while ((r = ERR_get_error())) { ERR_error_string_n(r, soap->msgbuf, sizeof(soap->msgbuf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "-- SMD Error (%d) %s: %s\n", ok, msg, soap->msgbuf)); } if (data->ctx) { #if (OPENSSL_VERSION_NUMBER < 0x10100000L) if ((data->alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) HMAC_CTX_cleanup((HMAC_CTX*)data->ctx); else EVP_MD_CTX_cleanup((EVP_MD_CTX*)data->ctx); SOAP_FREE(soap, data->ctx); #else if ((data->alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) HMAC_CTX_free((HMAC_CTX*)data->ctx); else EVP_MD_CTX_free((EVP_MD_CTX*)data->ctx); #endif data->ctx = NULL; } return soap_set_receiver_error(soap, msg, soap->msgbuf, SOAP_SSL_ERROR); } return SOAP_OK; } /******************************************************************************\ * * Callbacks registered by plugin * \******************************************************************************/ /** @fn int soap_smd_send(struct soap *soap, const char *buf, size_t len) @brief Callback to intercept messages for digest or signature computation/verification. @param soap context @param[in] buf message @param[in] len message length @return SOAP_OK or SOAP_SSL_ERROR */ static int soap_smd_send(struct soap *soap, const char *buf, size_t len) { int err; if (((struct soap_smd_data*)soap->data[0])->alg & SOAP_SMD_PASSTHRU) { err = ((struct soap_smd_data*)soap->data[0])->fsend(soap, buf, len); if (err) return err; } return soap_smd_update(soap, (struct soap_smd_data*)soap->data[0], buf, len); } /******************************************************************************/ /** @fn size_t soap_smd_recv(struct soap *soap, char *buf, size_t len) @brief Callback to intercept messages for digest or signature computation/verification. @param soap context @param[in] buf buffer @param[in] len max buffer length @return message size in buffer or 0 on error. */ static size_t soap_smd_recv(struct soap *soap, char *buf, size_t len) { size_t ret = ((struct soap_smd_data*)soap->data[0])->frecv(soap, buf, len); if (ret && soap_smd_update(soap, (struct soap_smd_data*)soap->data[0], buf, ret)) return 0; return ret; } /******************************************************************************/ #ifdef __cplusplus } #endif gsoap-2.8.91/gsoap/plugin/httpform.h0000644000175000017500000000530213525245161016713 0ustar ellertellert/* httpform.h gSOAP HTTP POST application/x-www-form-urlencoded plugin. Requires linkage with httpget.c (for query_key and query_val) Note: multipart/related and multipart/form-data are already handled in gSOAP. gSOAP XML Web services tools Copyright (C) 2004-2005, Robert van Engelen, Genivia, Inc. All Rights Reserved. -------------------------------------------------------------------------------- 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-2004 Robert A. 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. -------------------------------------------------------------------------------- */ #ifndef HTTPFORM_H #define HTTPFORM_H #include "stdsoap2.h" #include "httpget.h" /* require soap_decode_string */ #ifdef __cplusplus extern "C" { #endif #define HTTP_FORM_ID "SOAP-HTTP-FORM/1.2" /* plugin identification */ extern const char http_form_id[]; /* This is the local plugin data shared among all copies of the soap struct: */ struct http_form_data { int (*fparsehdr)(struct soap*, const char*, const char*); /* to save and call the internal HTTP header parser */ int (*handler)(struct soap*); }; int http_form(struct soap*, struct soap_plugin*, void*); char * soap_get_form(struct soap*); #ifdef __cplusplus } #endif #endif gsoap-2.8.91/gsoap/plugin/wsrmapi.h0000644000175000017500000003364613525245161016546 0ustar ellertellert/* wsrmapi.h WS-ReliableMessaging plugin. See wsrmapi.c for documentation and details. gSOAP XML Web services tools Copyright (C) 2000-2013, 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-2014, 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 WSRMAPI_H #define WSRMAPI_H #include "wsaapi.h" /* also includes soapH.h, see wsaapi.h if you are using a different fileH.h */ #include "threads.h" /* mutex for sequence database */ #ifdef __cplusplus extern "C" { #endif /** Plugin identification for plugin registry */ #define SOAP_WSRM_ID "WS-RM/1.14" /** Use fast O(1) message allocation/deallocation and lookup at the cost of storing an array of N pointers per sequence, where N = 2^k >= is the number of messages in the sequence */ /* #define SOAP_WSRM_FAST_ALLOC */ /** Plugin identification for plugin registry */ extern const char soap_wsrm_id[]; /** Max number of retries that soap_wsrm_check_retry can succeed */ #ifndef SOAP_WSRM_MAX_RETRIES # define SOAP_WSRM_MAX_RETRIES 100 #endif /** Max seconds (hard limit!) expiration of sequences */ #ifndef SOAP_WSRM_MAX_SEC_TO_EXPIRE # define SOAP_WSRM_MAX_SEC_TO_EXPIRE 3600 /* 3600 sec = one hour */ #endif /** Seconds to timeout when sending ack messages to independent acksto server */ #ifndef SOAP_WSRM_TIMEOUT # define SOAP_WSRM_TIMEOUT 10 /* 10 sec */ #endif /** WCF channel instance default value (no channel) */ #define SOAP_WSRM_NOCHAN 0x7FFFFFFF /** @enum soap_wsrm_enable @brief wsrm engine state (on/off) */ enum soap_wsrm_enable { SOAP_WSRM_OFF, SOAP_WSRM_ON }; /** @brief Plugin data. */ struct soap_wsrm_data { enum soap_wsrm_enable state; struct soap_wsrm_sequence *seq; struct soap_wsrm_message *msg; int (*fsend)(struct soap*, const char*, size_t); int (*fpreparefinalrecv)(struct soap*); int (*fdisconnect)(struct soap*); }; /** @brief Message state (initial, explicit ack'ed, or explicit nack'ed) */ enum soap_wsrm_message_state { SOAP_WSRM_INIT, SOAP_WSRM_ACK, SOAP_WSRM_NACK }; /** @brief Linked list of unacknowledged messages stored for retransmission. */ struct soap_wsrm_message { enum soap_wsrm_message_state state; /**< (n)ack state */ struct soap_wsrm_content *list, *last; /**< list of content blocks */ #ifndef SOAP_WSRM_FAST_ALLOC ULONG64 num; /**< message number */ struct soap_wsrm_message *next; /**< next message in list */ #endif }; /** @brief Linked list of message content blocks. */ struct soap_wsrm_content { char *buf; size_t len; struct soap_wsrm_content *next; }; /** @struct soap_wsrm_ranges @brief Linked list of message range numbers. */ struct soap_wsrm_range { ULONG64 upper, lower; /**< range */ struct soap_wsrm_range *next; /**< next range in list */ }; /** @enum soap_wsrm_state @brief Sequence state */ enum soap_wsrm_state { SOAP_WSRM_NONE, SOAP_WSRM_UNKNOWN, SOAP_WSRM_CREATED, SOAP_WSRM_CLOSED, SOAP_WSRM_TERMINATED }; /** @struct soap_wsrm_sequence @brief Linked list of currently active message sequences. */ struct soap_wsrm_sequence { struct soap_wsrm_sequence *next; /**< next sequence */ size_t refs; /**< #refs to sequence */ short handle; /**< sequence in use by source (has a handle) */ short ackreq; /**< ack requested by dest */ const char *id; /**< sequence ID (from dest) */ const char *acksid; /**< sequence ID for ack requests (gen by source) */ const char *to; /**< to endpoint */ const char *repto; /**< reply to endpoint */ const char *acksto; /**< ack to endpoint */ time_t timestamp; /**< date/time of most recent update */ time_t expires; /**< date/time of expiration */ int retry; /**< retry count */ enum wsrm__IncompleteSequenceBehaviorType behavior; ULONG64 num; /**< message sequence num sent */ ULONG64 recvnum; /**< message num received (used to be lastnum) */ ULONG64 lastnum; /**< last message num received upon closing */ enum wsrm__FaultCodes fault; /**< sequence fault (use when error) */ enum soap_wsrm_state state; /**< sequence state */ #ifdef SOAP_WSRM_FAST_ALLOC struct soap_wsrm_message **messages; /**< array [0 .. seq->num-1] pointing to message content */ #else struct soap_wsrm_message *messages; /**< linked list of messages */ struct soap_wsrm_message *messageslast; /**< back insertion in message list */ #endif struct soap_wsrm_range *ranges; /**< ranges of received messages */ int channel; /**< callback WCF channel instance */ }; typedef struct soap_wsrm_sequence *soap_wsrm_sequence_handle; SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm(struct soap *soap, struct soap_plugin *plugin, void *arg); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_create(struct soap *soap, const char *to, const char *replyto, LONG64 expires, const char *wsa_id, soap_wsrm_sequence_handle *seq); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_create_offer(struct soap *soap, const char *to, const char *replyto, const char *id, LONG64 expires, enum wsrm__IncompleteSequenceBehaviorType behavior, const char *wsa_id, soap_wsrm_sequence_handle *seq); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_create_offer_acksto(struct soap *soap, const char *to, const char *replyto, const char *acksto, const char *id, LONG64 expires, enum wsrm__IncompleteSequenceBehaviorType behavior, const char *wsa_id, soap_wsrm_sequence_handle *seq); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_request_num(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id, const char *wsa_action, ULONG64 num); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_request(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id, const char *wsa_action); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_request_acks(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id, const char *wsa_action); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_check_retry(struct soap *soap, soap_wsrm_sequence_handle seq); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_resend(struct soap *soap, soap_wsrm_sequence_handle seq, ULONG64 lower, ULONG64 upper); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_resend_only_nacked(struct soap *soap, soap_wsrm_sequence_handle seq, ULONG64 lower, ULONG64 upper); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_close(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_terminate(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_pulse(struct soap *soap, int timeout); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_acknowledgement(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_non_acknowledgement(struct soap *soap, soap_wsrm_sequence_handle seq, ULONG64 nack); SOAP_FMAC1 soap_wsrm_sequence_handle SOAP_FMAC2 soap_wsrm_seq(struct soap *soap); SOAP_FMAC1 void SOAP_FMAC2 soap_wsrm_seq_release(struct soap *soap, soap_wsrm_sequence_handle seq); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_seq_created(struct soap *soap, soap_wsrm_sequence_handle seq); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_seq_valid(struct soap *soap, soap_wsrm_sequence_handle seq); SOAP_FMAC1 soap_wsrm_sequence_handle SOAP_FMAC2 soap_wsrm_seq_lookup_id(struct soap *soap, const char *id); SOAP_FMAC1 soap_wsrm_sequence_handle SOAP_FMAC2 soap_wsrm_seq_lookup(struct soap *soap, const char *id); SOAP_FMAC1 void SOAP_FMAC2 soap_wsrm_seq_free(struct soap *soap, soap_wsrm_sequence_handle seq); SOAP_FMAC1 void SOAP_FMAC2 soap_wsrm_cleanup(struct soap *soap); SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsrm_to(const soap_wsrm_sequence_handle seq); SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsrm_acksto(const soap_wsrm_sequence_handle seq); SOAP_FMAC1 ULONG64 SOAP_FMAC2 soap_wsrm_num(const soap_wsrm_sequence_handle seq); SOAP_FMAC1 ULONG64 SOAP_FMAC2 soap_wsrm_nack(const soap_wsrm_sequence_handle seq); SOAP_FMAC1 ULONG64 SOAP_FMAC2 soap_wsrm_msgs(const soap_wsrm_sequence_handle seq); SOAP_FMAC1 ULONG64 SOAP_FMAC2 soap_wsrm_recvnum(const soap_wsrm_sequence_handle seq); SOAP_FMAC1 ULONG64 SOAP_FMAC2 soap_wsrm_lastnum(const soap_wsrm_sequence_handle seq); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_check(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_check_and_wait(struct soap *soap, int timeout); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_check_send_empty_response(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_check_send_empty_response_and_wait(struct soap *soap, int timeout); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_reply_num(struct soap *soap, int flag); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_reply(struct soap *soap, const char *wsa_id, const char *wsa_action); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_reply_request_acks(struct soap *soap, const char *wsa_id, const char *wsa_action); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_fault_subcode(struct soap *soap, int flag, const char *faultsubcode, const char *faultstring, const char *faultdetail); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_check_fault(struct soap *soap, enum wsrm__FaultCodes *fault, const char **info); SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_error(struct soap *soap, struct soap_wsrm_sequence *seq, enum wsrm__FaultCodes fault); SOAP_FMAC1 void SOAP_FMAC2 soap_wsrm_dump(struct soap *soap, FILE *fd); #ifdef __cplusplus } #endif /* Server-side generated operations from wsrm.h */ SOAP_FMAC5 int SOAP_FMAC6 __wsrm__CreateSequence(struct soap *soap, struct wsrm__CreateSequenceType *req, struct wsrm__CreateSequenceResponseType *res); SOAP_FMAC5 int SOAP_FMAC6 __wsrm__CreateSequenceResponse(struct soap *soap, struct wsrm__CreateSequenceResponseType *res); SOAP_FMAC5 int SOAP_FMAC6 __wsrm__CloseSequence(struct soap *soap, struct wsrm__CloseSequenceType *req, struct wsrm__CloseSequenceResponseType *res); SOAP_FMAC5 int SOAP_FMAC6 __wsrm__CloseSequenceResponse(struct soap *soap, struct wsrm__CloseSequenceResponseType *res); #ifdef SOAP_WSRM_2005 SOAP_FMAC5 int SOAP_FMAC6 __wsrm__TerminateSequence(struct soap *soap, struct wsrm__TerminateSequenceType *req, struct wsrm__TerminateSequenceType *res); #else SOAP_FMAC5 int SOAP_FMAC6 __wsrm__TerminateSequence(struct soap *soap, struct wsrm__TerminateSequenceType *req, struct wsrm__TerminateSequenceResponseType *res); #endif SOAP_FMAC5 int SOAP_FMAC6 __wsrm__TerminateSequenceResponse(struct soap *soap, struct wsrm__TerminateSequenceResponseType *res); SOAP_FMAC5 int SOAP_FMAC6 __wsrm__SequenceAcknowledgement(struct soap *soap); SOAP_FMAC5 int SOAP_FMAC6 __wsrm__AckRequested(struct soap *soap); SOAP_FMAC5 int SOAP_FMAC6 __wsrm__LastMessage(struct soap *soap); /* Client-side generated operations from wsrm.h */ SOAP_FMAC5 int SOAP_FMAC6 soap_call___wsrm__CreateSequence(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct wsrm__CreateSequenceType *wsrm__CreateSequence, struct wsrm__CreateSequenceResponseType *wsrm__CreateSequenceResponse); SOAP_FMAC5 int SOAP_FMAC6 soap_call___wsrm__CloseSequence(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct wsrm__CloseSequenceType *wsrm__CloseSequence, struct wsrm__CloseSequenceResponseType *wsrm__CloseSequenceResponse); SOAP_FMAC5 int SOAP_FMAC6 soap_call___wsrm__TerminateSequence(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct wsrm__TerminateSequenceType *wsrm__TerminateSequence, struct wsrm__TerminateSequenceResponseType *wsrm__TerminateSequenceResponse); SOAP_FMAC5 int SOAP_FMAC6 soap_send___wsrm__SequenceAcknowledgement(struct soap *soap, const char *soap_endpoint, const char *soap_action); SOAP_FMAC5 int SOAP_FMAC6 soap_recv___wsrm__SequenceAcknowledgement(struct soap *soap, struct __wsrm__SequenceAcknowledgement *); SOAP_FMAC5 int SOAP_FMAC6 soap_send___wsrm__LastMessage(struct soap *soap, const char *soap_endpoint, const char *soap_action); #endif gsoap-2.8.91/gsoap/plugin/mq.c0000644000175000017500000004032213525245161015461 0ustar ellertellert/* mq.c Inbound message queues to support WS-RM NoDiscard behavior gSOAP XML Web services tools Copyright (C) 2000-2013, 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. -------------------------------------------------------------------------------- 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-2013, 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 -------------------------------------------------------------------------------- */ /** @mainpage - @ref mq_0 documents the inbound message queue plugin. */ /** @page mq_0 The mq plugin for inbound message queueing and message replay The inbound message queueing plugin can be used to queue messages that should not be discarded with the WS-RM protocol's NoDiscard behavior. Messages that are out of sequence as per WS-RM protocol and should be handled by one thread (or a thread pool) should be queued for later replay and service operation invocation. If an unlimited number of threads is available, the simplest WS-RM protocol NoDiscard behavior is implemented by starting a thread for each inbound message and letting the thread block with the `soap_wsrm_check_and_wait()` or `soap_wsrm_check_send_empty_response_and_wait()` calls. However, that approach is not efficient with HTTP keep-alive because the next messages on the keep-alive socket will be blocked from being processed. This plugin is designed to process messages on an HTTP keep-alive socket even when operations block. @section mq_1 Server-Side Queueing of One-Way Messages Queueing one-way messages for internal replay is implemented with the message queueing plugin as follows, by queueing inbound messages received on a single socket and then replaying them all in sequence as received from the socket: ~~~{.cpp} #include "mq.h" int main() { struct soap *soap = soap_new1(SOAP_IO_KEEPALIVE); soap_register_plugin(soap, soap_mq); ... // initializations, port bind etc. ... while (soap_valid_socket(soap_accept(soap))) { // queue all messages on this socket (socket is HTTP keep alive) // for each message received, we immediately respond with HTTP 202 Accepted struct ms_queue *queue = soap_mq_queue(soap); struct ms_msg *msg; while (soap_mq_get(soap, queue)) soap_send_empty_response(soap, 202); // 202 Accepted // we now internally replay all messages to invoke services // services are assumed to NOT send a response message back // i.e. one-way operations for (msg = soap_mq_begin(queue); msg; msg = soap_mq_next(msg)) soap_serve(&msg->soap); // delete all queued messages, this also calls the following functions on each queued msg context: // soap_destroy(&msg->soap); // soap_end(&msg->soap); // soap_done(&msg->soap); soap_mq_del(queue, NULL); // delete the queue (allocated in current context) soap_destroy(soap); soap_end(soap); } ... // finalize ... soap_free(soap); } ~~~ Alternatively, it is also possible to call `soap_mq_del(queue, msg)` after `soap_serve(&msg->soap)` to immediately delete the message after processing. Calling `soap_mq_next(msg)` for the next loop iteration is still valid, of course. @section mq_2 WS-RM Server-Side Message Queueing for NoDiscard Behavior with Callback Services When messages are controlled by the WS-ReliableMessaging protocol, we can keep the WS-RM messages in a queue that were received out of order until the order is restored and queued messages can be dispatched. This WS-RM behavior is desirable with WS-RM NoDiscard. To implement this approach, we use an inbound message queue for each socket accepted and processed by a thread. ~~~{.cpp} #include "wsaapi.h" #include "wsrmapi.h" #include "mq.h" #include "threads.h" int main() { struct soap *soap = soap_new1(SOAP_IO_KEEPALIVE); soap_register_plugin(soap, soap_wsa); soap_register_plugin(soap, soap_wsrm); soap_register_plugin(soap, soap_mq); ... // initializations, port bind etc. ... while (soap_valid_socket(soap_accept(soap))) { THREAD_TYPE tid; struct soap *tsoap = soap_copy(soap); if (!tsoap) soap_closesock(soap); else while (THREAD_CREATE(&tid, (void*(*)(void*))process_request, (void*)tsoap)) sleep(1); } ... // finalize ... soap_free(soap); } void *process_request(void *tsoap) { struct soap *soap = (struct soap*)tsoap; struct ms_queue *queue = soap_mq_queue(soap); struct ms_msg *msg; struct soap ctx; while ((msg = soap_mq_get(soap, queue)) != NULL) { // parse the message headers, if NoDiscard then keep message in queue to retry later // copy the context, since we want to preserve the original to retry later soap_copy_context(&ctx, &msg->soap); if (soap_begin_serve(&ctx)) { soap_send_fault(&ctx); // send fault, close socket soap_mq_del(queue, msg); // delete message from queue } else if (!ctx.header || !ctx.header->wsrm__Sequence) { // this is not a WS-RM message, so serve immediately soap_serve(&msg->soap); // service operations soap_mq_del(queue, msg); // delete message from queue } else if (!soap_wsrm_check(&ctx)) { // check is OK, process this WS-RM message now soap_serve(&msg->soap); // service operations SHOULD NOT call soap_wsrm_check() soap_mq_del(queue, msg); // delete message from queue } else if (ctx.error != SOAP_STOP) { // check failed, not a WS-RM message or other WS-RM error soap_send_fault(&ctx); // send fault, close socket soap_mq_del(queue, msg); // delete message from queue } soap_destroy(&ctx); soap_end(&ctx); soap_done(&ctx); } // as long as the queue is not empty and WS-RM sequence(s) not terminated, keep trying while ((msg = soap_mq_begin(queue)) != NULL) { // process queued WS-RM messages for (; msg != NULL; msg = soap_mq_next(msg)) { // try next message in queue soap_copy_context(&ctx, &msg->soap); if (!soap_begin_serve(&ctx) && !soap_wsrm_check(&ctx)) { // check is OK, process message soap_serve(&msg->soap); soap_mq_del(queue, msg); } else if (ctx.error != SOAP_STOP) soap_mq_del(queue, msg); soap_destroy(&ctx); soap_end(&ctx); soap_done(&ctx); } sleep(1); // sleep some before around we go again } return NULL; } ~~~ In the first loop that runs over the messages received on the same keep-alive socket, the messages will be processed and services dispatched immediately for non-WS-RM messages and when the WS-RM check succeeds. This check is done in the server dispatch loop as shown, which means that WS-RM-based service operations SHOULD NOT call soap_wsrm_check() again. WS-RM messages that cannot be processed yet since they are out of the sequence order will remain in the queue. The second loop over the queued messages will retry to dispatch service operations according to the WS-RM message order as required by WS-RM NoDiscard sequence behavior. The loop will run until the queue is empty or when the WS-RM sequences are closed/terminated. */ #include "mq.h" #ifdef __cplusplus extern "C" { #endif const char soap_mq_id[] = SOAP_MQ_ID; /******************************************************************************\ * * Static protos * \******************************************************************************/ static int soap_mq_init(struct soap *soap, struct soap_mq_data *data); static void soap_mq_delete(struct soap *soap, struct soap_plugin *p); static size_t soap_mq_recv(struct soap *soap, char *buf, size_t len); static int soap_mq_serveloop(struct soap *soap); static void soap_mq_set(struct soap_mq_msg *msg); /******************************************************************************\ * * Plugin registry functions * \******************************************************************************/ /** plugin registry function, invoked by soap_register_plugin */ SOAP_FMAC1 int SOAP_FMAC2 soap_mq(struct soap *soap, struct soap_plugin *p, void *arg) { (void)soap; (void)arg; p->id = soap_mq_id; /* create local plugin data */ p->data = (void*)SOAP_MALLOC(soap, sizeof(struct soap_mq_data)); /* register the destructor */ p->fdelete = soap_mq_delete; /* if OK then initialize */ if (!p->data) return SOAP_EOM; if (soap_mq_init(soap, (struct soap_mq_data*)p->data)) { SOAP_FREE(soap, p->data); /* error: could not init */ return SOAP_EOM; /* return error */ } return SOAP_OK; } /******************************************************************************/ /* used by plugin registry function */ static int soap_mq_init(struct soap *soap, struct soap_mq_data *data) { (void)soap; data->buf = NULL; data->len = 0; return SOAP_OK; } /******************************************************************************/ static void soap_mq_delete(struct soap *soap, struct soap_plugin *p) { /* free allocated plugin data. If fcopy() is not set, then this function is not called for all copies of the plugin created with soap_copy(). In this example, the fcopy() callback is omitted and the plugin data is shared by the soap copies created with soap_copy() */ (void)soap; SOAP_FREE(soap, p->data); } /******************************************************************************\ * * Callbacks registered by plugin * \******************************************************************************/ static size_t soap_mq_recv(struct soap *soap, char *buf, size_t len) { struct soap_mq_data *data = (struct soap_mq_data*)soap_lookup_plugin(soap, soap_mq_id); if (!data) { soap->error = SOAP_PLUGIN_ERROR; return 0; } if (data->len < len) { len = data->len; data->len = 0; } (void)soap_memcpy(buf, len, data->buf, len); data->buf += len; return len; } /******************************************************************************/ static int soap_mq_serveloop(struct soap *soap) { soap->keep_alive = 0; return soap->error = SOAP_STOP; } /******************************************************************************\ * * Queue Operations * \******************************************************************************/ /** @fn struct soap_mq_queue *soap_mq_queue(struct soap *soap) @brief Create a new queue structure allocated in the current context. Will be deallocated with soap_end(soap). Use soap_mq_get() to receive a message from the current socket to add to the queue. @param soap current context @return pointer to the queue structure */ SOAP_FMAC1 struct soap_mq_queue * SOAP_FMAC2 soap_mq_queue(struct soap *soap) { struct soap_mq_queue *mq = (struct soap_mq_queue*)soap_malloc(soap, sizeof(struct soap_mq_queue)); if (mq) mq->head = mq->tail = NULL; return mq; } /******************************************************************************/ /** @fn struct soap_mq_msg *soap_mq_get(struct soap *soap, struct soap_mq_queue *mq) @brief Receive message from socket and queue it at the end of the queue. @param soap current context @param mq pointer to the message queue structure created by soap_mq_queue() @return pointer to the message received and queued, or NULL */ SOAP_FMAC1 struct soap_mq_msg * SOAP_FMAC2 soap_mq_get(struct soap *soap, struct soap_mq_queue *mq) { struct soap_mq_msg *msg; if (soap_begin_recv(soap)) return NULL; msg = (struct soap_mq_msg*)soap_malloc(soap, sizeof(struct soap_mq_msg)); if (!msg) { soap->error = SOAP_EOM; return NULL; } msg->next = NULL; soap_copy_context(&msg->soap, soap); msg->buf = soap_http_get_body(soap, &msg->len); if (!msg->buf || soap_end_recv(soap)) return NULL; if (!msg->buf) return NULL; soap_mq_set(msg); if (!mq->head) mq->head = mq->tail = msg; else mq->tail = mq->tail->next = msg; return msg; } /******************************************************************************/ /** @fn struct soap_mq_msg *soap_mq_begin(struct soap_mq_queue *mq) @brief Get first message in queue. Use msg->soap to invoke service from the queued message, as in soap_serve(&msg->soap). @param mq pointer to the message queue structure created by soap_mq_queue() @return pointer to first message in the queue, or NULL */ SOAP_FMAC1 struct soap_mq_msg * SOAP_FMAC2 soap_mq_begin(struct soap_mq_queue *mq) { struct soap_mq_msg *msg = mq->head; if (msg) soap_mq_set(msg); return msg; } /******************************************************************************/ /** @fn struct soap_mq_msg *soap_mq_next(struct soap_mq_msg *msg) @brief Get next message in queue. Use msg->soap to invoke service from the queued message, as in soap_serve(&msg->soap). @param msg pointer to current message in the queue @return pointer to next message in the queue, or NULL */ SOAP_FMAC1 struct soap_mq_msg * SOAP_FMAC2 soap_mq_next(struct soap_mq_msg *msg) { if (msg) msg = msg->next; if (msg) soap_mq_set(msg); return msg; } /******************************************************************************/ /** @fn void soap_mq_del(struct soap_mq_queue *mq, struct soap_mq_msg *msg) @brief Delete message from queue, e.g. after processing it. Delete entire queue when msg==NULL. Note: structures will be deallocated with deallocation with soap_end(). @param mq pointer to the queue structure @param msg pointer to a message in the queue, when NULL delete entire queue */ SOAP_FMAC1 void SOAP_FMAC2 soap_mq_del(struct soap_mq_queue *mq, struct soap_mq_msg *msg) { if (mq) { struct soap_mq_msg *p = mq->head; if (msg) { if (p == msg) mq->head = msg->next; else { while (p && p->next != msg) p = p->next; if (p) { p->next = msg->next; if (mq->tail == msg) mq->tail = p; } } soap_destroy(&msg->soap); soap_end(&msg->soap); soap_done(&msg->soap); } else { while (p) { soap_destroy(&p->soap); soap_end(&p->soap); soap_done(&p->soap); p = p->next; } mq->head = mq->tail = NULL; } } } /******************************************************************************/ static void soap_mq_set(struct soap_mq_msg *msg) { struct soap_mq_data *data = (struct soap_mq_data*)soap_lookup_plugin(&msg->soap, soap_mq_id); if (data) { data->buf = msg->buf; data->len = msg->len; soap_clr_imode(&msg->soap, SOAP_IO_CHUNK | SOAP_ENC_ZLIB | SOAP_ENC_SSL); msg->soap.frecv = soap_mq_recv; msg->soap.fserveloop = soap_mq_serveloop; } } /******************************************************************************/ #ifdef __cplusplus } #endif gsoap-2.8.91/gsoap/plugin/wsddapi.h0000644000175000017500000004405013525245161016506 0ustar ellertellert/* wsddapi.h WS-Discovery 1.1 and 1.0 (WSDD) plugin API See gsoap/doc/wsdd for the WSDD plugin user guide. gSOAP XML Web services tools Copyright (C) 2000-2011, 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-2011, 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 WSDDAPI_H #define WSDDAPI_H #include "wsaapi.h" /* also includes soapH.h, see wsaapi.h if you are using a different fileH.h */ #include "threads.h" /* threads and locks from plugin/threads.h */ /******************************************************************************\ * * Common Constants * \******************************************************************************/ /** A Target Service MUST wait t (ms) to elapse before sending the message, where 0 < t < APP_MAX_DELAY is randomly choosen. The default APP_MAX_DELAY is 500 ms. */ #ifndef SOAP_WSDD_APP_MAX_DELAY # define SOAP_WSDD_APP_MAX_DELAY (500) /* ms delay */ #endif /** If the DP is unresponsive after DP_MAX_TIMEOUT, or if the Client finds the responses from the DP unsatisfactory, the Client reverts to using the multicast messages. */ #ifdef SOAP_WSDD_DP_MAX_TIMEOUT # define SOAP_WSDD_DP_MAX_TIMEOUT (5000) /* ms timeout */ #endif /** Managed or ad-hoc mode */ typedef enum soap_wsdd_mode {SOAP_WSDD_MANAGED, SOAP_WSDD_ADHOC} soap_wsdd_mode; /** Send message to Target Service (TS) or Discovery Proxy (DP) */ typedef enum soap_wsdd_to { SOAP_WSDD_TO_DP, SOAP_WSDD_TO_TS } soap_wsdd_to; /******************************************************************************\ * * WS-Discovery operations (copied here from soapClient.cpp) * \******************************************************************************/ SOAP_FMAC5 int SOAP_FMAC6 soap_send___wsdd__Hello(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct wsdd__HelloType *wsdd__Hello); SOAP_FMAC5 int SOAP_FMAC6 soap_recv___wsdd__Hello(struct soap *soap, struct __wsdd__Hello *); SOAP_FMAC5 int SOAP_FMAC6 soap_send___wsdd__Bye(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct wsdd__ByeType *wsdd__Bye); SOAP_FMAC5 int SOAP_FMAC6 soap_recv___wsdd__Bye(struct soap *soap, struct __wsdd__Bye *); SOAP_FMAC5 int SOAP_FMAC6 soap_send___wsdd__Probe(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct wsdd__ProbeType *wsdd__Probe); SOAP_FMAC5 int SOAP_FMAC6 soap_recv___wsdd__Probe(struct soap *soap, struct __wsdd__Probe *); SOAP_FMAC5 int SOAP_FMAC6 soap_send___wsdd__ProbeMatches(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct wsdd__ProbeMatchesType *wsdd__ProbeMatches); SOAP_FMAC5 int SOAP_FMAC6 soap_recv___wsdd__ProbeMatches(struct soap *soap, struct __wsdd__ProbeMatches *); SOAP_FMAC5 int SOAP_FMAC6 soap_send___wsdd__Resolve(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct wsdd__ResolveType *wsdd__Resolve); SOAP_FMAC5 int SOAP_FMAC6 soap_recv___wsdd__Resolve(struct soap *soap, struct __wsdd__Resolve *); SOAP_FMAC5 int SOAP_FMAC6 soap_send___wsdd__ResolveMatches(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct wsdd__ResolveMatchesType *wsdd__ResolveMatches); SOAP_FMAC5 int SOAP_FMAC6 soap_recv___wsdd__ResolveMatches(struct soap *soap, struct __wsdd__ResolveMatches *); /******************************************************************************\ * * WS-Discovery Operations * \******************************************************************************/ #ifdef __cplusplus extern "C" { #endif SOAP_FMAC1 void SOAP_FMAC2 soap_wsdd_set_InstanceId(unsigned int InstanceId); SOAP_FMAC1 void SOAP_FMAC2 soap_wsdd_set_SequenceId(const char *SequenceId); SOAP_FMAC1 int SOAP_FMAC2 soap_wsdd_Hello(struct soap *soap, soap_wsdd_mode mode, const char *endpoint, const char *MessageID, const char *RelatesTo, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion); SOAP_FMAC1 int SOAP_FMAC2 soap_wsdd_Bye(struct soap *soap, soap_wsdd_mode mode, const char *endpoint, const char *MessageID, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion); SOAP_FMAC1 int SOAP_FMAC2 soap_wsdd_Probe(struct soap *soap, soap_wsdd_mode mode, soap_wsdd_to to, const char *endpoint, const char *MessageID, const char *ReplyTo, const char *Types, const char *Scopes, const char *MatchBy); SOAP_FMAC1 int SOAP_FMAC2 soap_wsdd_Resolve(struct soap *soap, soap_wsdd_mode mode, soap_wsdd_to to, const char *endpoint, const char *MessageID, const char *ReplyTo, const char *EndpointReference); SOAP_FMAC1 void SOAP_FMAC2 soap_wsdd_init_ProbeMatches(struct soap *soap, struct wsdd__ProbeMatchesType *matches); SOAP_FMAC1 int SOAP_FMAC2 soap_wsdd_add_ProbeMatch(struct soap *soap, struct wsdd__ProbeMatchesType *matches, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion); SOAP_FMAC1 int SOAP_FMAC2 soap_wsdd_ProbeMatches(struct soap *soap, const char *endpoint, const char *MessageID, const char *RelatesTo, const char *To, struct wsdd__ProbeMatchesType *matches); SOAP_FMAC1 int SOAP_FMAC2 soap_wsdd_ResolveMatches(struct soap *soap, const char *endpoint, const char *MessageID, const char *RelatesTo, const char *To, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion); SOAP_FMAC1 int SOAP_FMAC2 soap_wsdd_listen(struct soap *soap, int timeout); SOAP_FMAC1 int SOAP_FMAC2 soap_wsdd_serve_request(struct soap *soap); #ifdef __cplusplus } #endif SOAP_FMAC5 int SOAP_FMAC6 __wsdd__Hello(struct soap *soap, struct wsdd__HelloType *Hello); SOAP_FMAC5 int SOAP_FMAC6 __wsdd__Bye(struct soap *soap, struct wsdd__ByeType *Bye); SOAP_FMAC5 int SOAP_FMAC6 __wsdd__Probe(struct soap *soap, struct wsdd__ProbeType *Probe); SOAP_FMAC5 int SOAP_FMAC6 __wsdd__ProbeMatches(struct soap *soap, struct wsdd__ProbeMatchesType *ProbeMatches); SOAP_FMAC5 int SOAP_FMAC6 __wsdd__Resolve(struct soap *soap, struct wsdd__ResolveType *Resolve); SOAP_FMAC5 int SOAP_FMAC6 __wsdd__ResolveMatches(struct soap *soap, struct wsdd__ResolveMatchesType *ResolveMatches); /******************************************************************************\ * * User-defined WS-Discovery event handlers * \******************************************************************************/ /** @fn void wsdd_event_Hello(struct soap *soap, unsigned int InstanceId, const char *SequenceId, unsigned int MessageNumber, const char *MessageID, const char *RelatesTo, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion) @brief Handles and registers a Hello event from a TS or DP joining the network. @param soap context (use soap->user as a pointer to a global state if needed) @param[in] InstanceId (see WS-Discovery 1.1 Section 7 Application Sequencing) @param[in] SequenceId (see WS-Discovery 1.1 Section 7 Application Sequencing) @param[in] MessageNumber (see WS-Discovery 1.1 Section 7 Application Sequencing) @param[in] MessageID WS-Addressing message ID of the Hello message @param[in] RelatesTo WS-Addressing RelatesTo message ID of the Hello message @param[in] EndpointReference of the Target Service or Discovery Proxy that joins @param[in] Types an unordered string of QNames of services provided by the Target Service or Discovery Proxy where a Discovery Proxy MUST include "wsdd:DiscoveryProxy" @param[in] Scopes an unordered set of Scopes the Target Service or Discovery Proxy is in @param[in] MatchBy unused (reserved) @param[in] XAddrs contains the transport address(es) that MAY be used to communicate with the Target Service or Discovery Proxy @param[in] MetadataVersion incremented by a positive value (>= 1) whenever there is a change in the metadata of the Target Service Hello is a one-way message sent by a Target Service to announce its availability when it joins the network. It is also sent by a Discovery Proxy to reduce multicast traffic on an ad hoc network. To maintain a global state between events, for example to internally register Target Services, Discovery Proxies, and update the status of these, use void *soap->user to point to a global state (that you need to define). */ void wsdd_event_Hello(struct soap *soap, unsigned int InstanceId, const char *SequenceId, unsigned int MessageNumber, const char *MessageID, const char *RelatesTo, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int MetadataVersion); /** @fn void wsdd_event_Bye(struct soap *soap, unsigned int InstanceId, const char *SequenceId, unsigned int MessageNumber, const char *MessageID, const char *RelatesTo, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int *MetadataVersion) @brief Handles and registers a Bye event from a TS or DP leaving the network. @param soap context (use soap->user as a pointer to a global state if needed) @param[in] InstanceId (see WS-Discovery 1.1 Section 7 Application Sequencing) @param[in] SequenceId (see WS-Discovery 1.1 Section 7 Application Sequencing) @param[in] MessageNumber (see WS-Discovery 1.1 Section 7 Application Sequencing) @param[in] MessageID WS-Addressing message ID of the Bye message @param[in] RelatesTo WS-Addressing RelatesTo message ID of the Bye message @param[in] EndpointReference of the Target Service or Discovery Proxy @param[in] Types an unordered string of QNames of services provided by the Target Service or Discovery Proxy where a Discovery Proxy MUST include "wsdd:DiscoveryProxy" @param[in] Scopes an unordered set of Scopes the Target Service or Discovery Proxy is in @param[in] MatchBy unused (reserved) @param[in] XAddrs contains the transport address(es) that MAY be used to communicate with the Target Service or Discovery Proxy @param[in] MetadataVersion incremented by a positive value (>= 1) whenever there is a change in the metadata of the Target Service Bye is a one-way message sent by a Target Service to announce its unavailability as a best effort when it leaves the network. To maintain a global state between events, for example to internally register Target Services, Discovery Proxies, and update the status of these, use void *soap->user to point to a global state (that you need to define). */ void wsdd_event_Bye(struct soap *soap, unsigned int InstanceId, const char *SequenceId, unsigned int MessageNumber, const char *MessageID, const char *RelatesTo, const char *EndpointReference, const char *Types, const char *Scopes, const char *MatchBy, const char *XAddrs, unsigned int *MetadataVersion); /** @fn soap_wsdd_mode wsdd_event_Probe(struct soap *soap, const char *MessageID, const char *ReplyTo, const char *Types, const char *Scopes, const char *MatchBy, struct wsdd__ProbeMatchesType *matches) @brief Handles a Probe event from a Client. @param soap context (use soap->user as a pointer to a global state if needed) @param[in] MessageID WS-Addressing message ID of the message @param[in] ReplyTo WS-Addressing ReplyTo message ID of the message @param[in] Types an unordered string of QNames to probe @param[in] Scopes an unordered set of scopes to probe @param[in] MatchBy matching rule to apply for this probe @param[out] matches contains probe matches returned by event handler, use @ref soap_wsdd_add_ProbeMatch to populate the matches in the handler @return managed (SOAP_WSDD_MANAGED) or ad-hoc (SOAP_WSDD_ADHOC) mode to use to return the matches A Client sends a probe to find Target Services by the Type of the Target Service, a Scope in which the Target Service resides, both, or simply all Target Services. The matches are returned by this server-side event handler that match the Client's probe. To maintain a global state between events, for example to internally register Target Services, Discovery Proxies, and update the status of these, use void *soap->user to point to a global state (that you need to define). */ soap_wsdd_mode wsdd_event_Probe(struct soap *soap, const char *MessageID, const char *ReplyTo, const char *Types, const char *Scopes, const char *MatchBy, struct wsdd__ProbeMatchesType *matches); /** @fn void wsdd_event_ProbeMatches(struct soap *soap, unsigned int InstanceId, const char *SequenceId, unsigned int MessageNumber, const char *MessageID, const char *RelatesTo, struct wsdd__ProbeMatchesType *matches) @brief Handles a Probe event from a Client. @param soap context (use soap->user as a pointer to a global state if needed) @param[in] InstanceId (see WS-Discovery 1.1 Section 7 Application Sequencing) @param[in] SequenceId (see WS-Discovery 1.1 Section 7 Application Sequencing) @param[in] MessageNumber (see WS-Discovery 1.1 Section 7 Application Sequencing) @param[in] MessageID WS-Addressing message ID of the message @param[in] RelatesTo WS-Addressing RelatesTo message ID of the message @param[in] matches contains the probe matches A Client sends a probe to find Target Services by the Type of the Target Service, a Scope in which the Target Service resides, both, or simply all Target Services. The matches are provided to this client-side event handler. To maintain a global state between events, for example to internally register Target Services, Discovery Proxies, and update the status of these, use void *soap->user to point to a global state (that you need to define). */ void wsdd_event_ProbeMatches(struct soap *soap, unsigned int InstanceId, const char *SequenceId, unsigned int MessageNumber, const char *MessageID, const char *RelatesTo, struct wsdd__ProbeMatchesType *matches); /** @fn soap_wsdd_mode wsdd_event_Resolve(struct soap *soap, const char *MessageID, const char *ReplyTo, const char *EndpointReference, struct wsdd__ResolveMatchType *match); @brief Handles a Resolve event from a Client. @param soap context (use soap->user as a pointer to a global state if needed) @param[in] MessageID WS-Addressing message ID of the message @param[in] ReplyTo WS-Addressing ReplyTo message ID of the message @param[in] EndpointReference of the Target Service or Discovery Proxy @param[out] match contains the match returned by the event handler @return managed (SOAP_WSDD_MANAGED) or ad-hoc (SOAP_WSDD_ADHOC) mode to use to return the matches A Client sends a resolve to locate a Target Service, i.e., to retrieve its transport address(es). This server-side event handler returns the match(es). To maintain a global state between events, for example to internally register Target Services, Discovery Proxies, and update the status of these, use void *soap->user to point to a global state (that you need to define). */ soap_wsdd_mode wsdd_event_Resolve(struct soap *soap, const char *MessageID, const char *ReplyTo, const char *EndpointReference, struct wsdd__ResolveMatchType *match); /** @fn void wsdd_event_ResolveMatches(struct soap *soap, unsigned int InstanceId, const char *SequenceId, unsigned int MessageNumber, const char *MessageID, const char *RelatesTo, struct wsdd__ResolveMatchType *match) @brief Handles a Probe event from a Client. @param soap context (use soap->user as a pointer to a global state if needed) @param[in] InstanceId (see WS-Discovery 1.1 Section 7 Application Sequencing) @param[in] SequenceId (see WS-Discovery 1.1 Section 7 Application Sequencing) @param[in] MessageNumber (see WS-Discovery 1.1 Section 7 Application Sequencing) @param[in] MessageID WS-Addressing message ID of the message @param[in] RelatesTo WS-Addressing RelatesTo message ID of the message @param[in] match contains the resolve match A Client sends a resolve to locate a Target Service, i.e., to retrieve its transport address(es). This client-side event handler receives the match. To maintain a global state between events, for example to internally register Target Services, Discovery Proxies, and update the status of these, use void *soap->user to point to a global state (that you need to define). */ void wsdd_event_ResolveMatches(struct soap *soap, unsigned int InstanceId, const char *SequenceId, unsigned int MessageNumber, const char *MessageID, const char *RelatesTo, struct wsdd__ResolveMatchType *match); #endif gsoap-2.8.91/gsoap/plugin/smdevp.h0000644000175000017500000002655313525245161016361 0ustar ellertellert/* smdevp.h gSOAP interface for (signed) message digest gSOAP XML Web services tools Copyright (C) 2000-2015, 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-2015, 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 SMDEVP_H #define SMDEVP_H #include "stdsoap2.h" #include #include #include #ifdef __cplusplus extern "C" { #endif /** Expose EVP_PKEY in a portable representation */ #define SOAP_SMD_KEY_TYPE EVP_PKEY /** Expose EVP_MAX_MD_SIZE in a portable representation */ #define SOAP_SMD_MAX_SIZE EVP_MAX_MD_SIZE /** MD5 digest size in octets */ #define SOAP_SMD_MD5_SIZE (16) /** SHA1 digest size in octets */ #define SOAP_SMD_SHA1_SIZE (20) /** SHA224 digest size in octets */ #define SOAP_SMD_SHA224_SIZE (28) /** SHA256 digest size in octets */ #define SOAP_SMD_SHA256_SIZE (32) /** SHA384 digest size in octets */ #define SOAP_SMD_SHA384_SIZE (48) /** SHA512 digest size in octets */ #define SOAP_SMD_SHA512_SIZE (64) /******************************************************************************\ * * Supported algorithms * \******************************************************************************/ #define SOAP_SMD_NONE (0x0000) #define SOAP_SMD_HASH (0x000F) #define SOAP_SMD_ALGO (0x0030) #define SOAP_SMD_MASK (0x01FF) /** MD5 HASH */ #define SOAP_SMD_MD5 (0x00) /** SHA1 HASH */ #define SOAP_SMD_SHA1 (0x01) /** SHA224 HASH */ #define SOAP_SMD_SHA224 (0x02) /** SHA256 HASH */ #define SOAP_SMD_SHA256 (0x03) /** SHA384 HASH */ #define SOAP_SMD_SHA384 (0x04) /** SHA512 HASH */ #define SOAP_SMD_SHA512 (0x05) /** HMAC ALGO */ #define SOAP_SMD_HMAC (0x00) /** Digest ALGO */ #define SOAP_SMD_DGST (0x10) /** Sign ALGO */ #define SOAP_SMD_SIGN (0x20) /** Verify ALGO */ #define SOAP_SMD_VRFY (0x30) /** DSA Sign/Verify ALGO */ #define SOAP_SMD_DSA (0x40) /** ECDSA Sign/Verify ALGO */ #define SOAP_SMD_ECDSA (0x80) /** Additional flag: msg sends will pass through digest/signature algorithm */ #define SOAP_SMD_PASSTHRU (0x100) /** HMAC-MD5 shared key signature algorithm */ #define SOAP_SMD_HMAC_MD5 (SOAP_SMD_HMAC | SOAP_SMD_MD5) /** HMAC-SHA1 shared key signature algorithm */ #define SOAP_SMD_HMAC_SHA1 (SOAP_SMD_HMAC | SOAP_SMD_SHA1) /** HMAC-SHA224 shared key signature algorithm */ #define SOAP_SMD_HMAC_SHA224 (SOAP_SMD_HMAC | SOAP_SMD_SHA224) /** HMAC-SHA256 shared key signature algorithm */ #define SOAP_SMD_HMAC_SHA256 (SOAP_SMD_HMAC | SOAP_SMD_SHA256) /** HMAC-SHA384 shared key signature algorithm */ #define SOAP_SMD_HMAC_SHA384 (SOAP_SMD_HMAC | SOAP_SMD_SHA384) /** HMAC-SHA512 shared key signature algorithm */ #define SOAP_SMD_HMAC_SHA512 (SOAP_SMD_HMAC | SOAP_SMD_SHA512) /** DGST-MD5 digest algorithm */ #define SOAP_SMD_DGST_MD5 (SOAP_SMD_DGST | SOAP_SMD_MD5) /** DGST-SHA1 digest algorithm */ #define SOAP_SMD_DGST_SHA1 (SOAP_SMD_DGST | SOAP_SMD_SHA1) /** DGST-SHA224 digest algorithm */ #define SOAP_SMD_DGST_SHA224 (SOAP_SMD_DGST | SOAP_SMD_SHA224) /** DGST-SHA256 digest algorithm */ #define SOAP_SMD_DGST_SHA256 (SOAP_SMD_DGST | SOAP_SMD_SHA256) /** DGST-SHA384 digest algorithm */ #define SOAP_SMD_DGST_SHA384 (SOAP_SMD_DGST | SOAP_SMD_SHA384) /** DGST-SHA512 digest algorithm */ #define SOAP_SMD_DGST_SHA512 (SOAP_SMD_DGST | SOAP_SMD_SHA512) /** RSA-MD5 secret key signature algorithm */ #define SOAP_SMD_SIGN_RSA_MD5 (SOAP_SMD_SIGN | SOAP_SMD_MD5) /** RSA-SHA1 secret key signature algorithm */ #define SOAP_SMD_SIGN_RSA_SHA1 (SOAP_SMD_SIGN | SOAP_SMD_SHA1) /** RSA-SHA224 secret key signature algorithm */ #define SOAP_SMD_SIGN_RSA_SHA224 (SOAP_SMD_SIGN | SOAP_SMD_SHA224) /** RSA-SHA256 secret key signature algorithm */ #define SOAP_SMD_SIGN_RSA_SHA256 (SOAP_SMD_SIGN | SOAP_SMD_SHA256) /** RSA-SHA384 secret key signature algorithm */ #define SOAP_SMD_SIGN_RSA_SHA384 (SOAP_SMD_SIGN | SOAP_SMD_SHA384) /** RSA-SHA512 secret key signature algorithm */ #define SOAP_SMD_SIGN_RSA_SHA512 (SOAP_SMD_SIGN | SOAP_SMD_SHA512) /** DSA-MD5 secret key signature algorithm */ #define SOAP_SMD_SIGN_DSA_MD5 (SOAP_SMD_SIGN | SOAP_SMD_DSA | SOAP_SMD_MD5) /** DSA-SHA1 secret key signature algorithm */ #define SOAP_SMD_SIGN_DSA_SHA1 (SOAP_SMD_SIGN | SOAP_SMD_DSA | SOAP_SMD_SHA1) /** DSA-SHA224 secret key signature algorithm */ #define SOAP_SMD_SIGN_DSA_SHA224 (SOAP_SMD_SIGN | SOAP_SMD_DSA | SOAP_SMD_SHA224) /** DSA-SHA256 secret key signature algorithm */ #define SOAP_SMD_SIGN_DSA_SHA256 (SOAP_SMD_SIGN | SOAP_SMD_DSA | SOAP_SMD_SHA256) /** DSA-SHA384 secret key signature algorithm */ #define SOAP_SMD_SIGN_DSA_SHA384 (SOAP_SMD_SIGN | SOAP_SMD_DSA | SOAP_SMD_SHA384) /** DSA-SHA512 secret key signature algorithm */ #define SOAP_SMD_SIGN_DSA_SHA512 (SOAP_SMD_SIGN | SOAP_SMD_DSA | SOAP_SMD_SHA512) /** ECDSA-MD5 secret key signature algorithm */ #define SOAP_SMD_SIGN_ECDSA_MD5 (SOAP_SMD_SIGN | SOAP_SMD_ECDSA | SOAP_SMD_MD5) /** ECDSA-SHA1 secret key signature algorithm */ #define SOAP_SMD_SIGN_ECDSA_SHA1 (SOAP_SMD_SIGN | SOAP_SMD_ECDSA | SOAP_SMD_SHA1) /** ECDSA-SHA224 secret key signature algorithm */ #define SOAP_SMD_SIGN_ECDSA_SHA224 (SOAP_SMD_SIGN | SOAP_SMD_ECDSA | SOAP_SMD_SHA224) /** ECDSA-SHA256 secret key signature algorithm */ #define SOAP_SMD_SIGN_ECDSA_SHA256 (SOAP_SMD_SIGN | SOAP_SMD_ECDSA | SOAP_SMD_SHA256) /** ECDSA-SHA384 secret key signature algorithm */ #define SOAP_SMD_SIGN_ECDSA_SHA384 (SOAP_SMD_SIGN | SOAP_SMD_ECDSA | SOAP_SMD_SHA384) /** ECDSA-SHA512 secret key signature algorithm */ #define SOAP_SMD_SIGN_ECDSA_SHA512 (SOAP_SMD_SIGN | SOAP_SMD_ECDSA | SOAP_SMD_SHA512) /** RSA-MD5 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_RSA_MD5 (SOAP_SMD_VRFY | SOAP_SMD_MD5) /** RSA-SHA1 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_RSA_SHA1 (SOAP_SMD_VRFY | SOAP_SMD_SHA1) /** RSA-SHA224 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_RSA_SHA224 (SOAP_SMD_VRFY | SOAP_SMD_SHA224) /** RSA-SHA256 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_RSA_SHA256 (SOAP_SMD_VRFY | SOAP_SMD_SHA256) /** RSA-SHA384 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_RSA_SHA384 (SOAP_SMD_VRFY | SOAP_SMD_SHA384) /** RSA-SHA512 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_RSA_SHA512 (SOAP_SMD_VRFY | SOAP_SMD_SHA512) /** DSA-MD5 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_DSA_MD5 (SOAP_SMD_VRFY | SOAP_SMD_DSA | SOAP_SMD_MD5) /** DSA-SHA1 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_DSA_SHA1 (SOAP_SMD_VRFY | SOAP_SMD_DSA | SOAP_SMD_SHA1) /** DSA-SHA224 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_DSA_SHA224 (SOAP_SMD_VRFY | SOAP_SMD_DSA | SOAP_SMD_SHA224) /** DSA-SHA256 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_DSA_SHA256 (SOAP_SMD_VRFY | SOAP_SMD_DSA | SOAP_SMD_SHA256) /** DSA-SHA384 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_DSA_SHA384 (SOAP_SMD_VRFY | SOAP_SMD_DSA | SOAP_SMD_SHA384) /** DSA-SHA512 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_DSA_SHA512 (SOAP_SMD_VRFY | SOAP_SMD_DSA | SOAP_SMD_SHA512) /** ECDSA-MD5 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_ECDSA_MD5 (SOAP_SMD_VRFY | SOAP_SMD_ECDSA | SOAP_SMD_MD5) /** ECDSA-SHA1 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_ECDSA_SHA1 (SOAP_SMD_VRFY | SOAP_SMD_ECDSA | SOAP_SMD_SHA1) /** ECDSA-SHA224 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_ECDSA_SHA224 (SOAP_SMD_VRFY | SOAP_SMD_ECDSA | SOAP_SMD_SHA224) /** ECDSA-SHA256 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_ECDSA_SHA256 (SOAP_SMD_VRFY | SOAP_SMD_ECDSA | SOAP_SMD_SHA256) /** ECDSA-SHA384 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_ECDSA_SHA384 (SOAP_SMD_VRFY | SOAP_SMD_ECDSA | SOAP_SMD_SHA384) /** ECDSA-SHA512 secret key signature verification algorithm */ #define SOAP_SMD_VRFY_ECDSA_SHA512 (SOAP_SMD_VRFY | SOAP_SMD_ECDSA | SOAP_SMD_SHA512) /** @struct soap_smd_data @brief The smdevp engine context data, which is hooked up to soap->data[0] */ struct soap_smd_data { int alg; /**< The digest or signature algorithm used */ void *ctx; /**< EVP_MD_CTX or HMAC_CTX */ const void *key; /**< EVP_PKEY */ int (*fsend)(struct soap*, const char*, size_t); size_t (*frecv)(struct soap*, char*, size_t); soap_mode mode; /**< to preserve soap->mode value */ }; /******************************************************************************\ * * soap_smd API functions * \******************************************************************************/ SOAP_FMAC1 size_t SOAP_FMAC2 soap_smd_size(int alg, const void *key); SOAP_FMAC1 int SOAP_FMAC2 soap_smd_begin(struct soap *soap, int alg, const void *key, int keylen); SOAP_FMAC1 int SOAP_FMAC2 soap_smd_end(struct soap *soap, char *buf, int *len); SOAP_FMAC1 int SOAP_FMAC2 soap_smd_init(struct soap *soap, struct soap_smd_data *data, int alg, const void *key, int keylen); SOAP_FMAC1 int SOAP_FMAC2 soap_smd_update(struct soap *soap, struct soap_smd_data *data, const char *buf, size_t len); SOAP_FMAC1 int SOAP_FMAC2 soap_smd_final(struct soap *soap, struct soap_smd_data *data, char *buf, int *len); SOAP_FMAC1 void SOAP_FMAC2 soap_smd_cleanup(struct soap *soap, struct soap_smd_data *data); #ifdef __cplusplus } #endif #endif gsoap-2.8.91/gsoap/plugin/wsaapi.c0000644000175000017500000017164413525245161016344 0ustar ellertellert/* wsaapi.c WS-Addressing plugin. gSOAP XML Web services tools Copyright (C) 2000-2015, 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-2015, 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 -------------------------------------------------------------------------------- */ /** @mainpage - @ref wsa_0 documents the wsa plugin for WS-Addressing (2003/2004/2005 standards) support. */ /** @page wsa_0 The WS-Addressing Plugin [TOC] @section wsa_1 WS-Addressing Setup The material in this section relates to the WS-Addressing specification. To use the wsa plugin: -# Run wsdl2h -t typemap.dat on a WSDL of a service that requires WS-Addressing headers. The typemap.dat file included in the gSOAP package is used to recognize and translate Addressing header blocks. -# Run soapcpp2 -a on the header file produced by wsdl2h. To enable addressing-based service operation selection, you MUST use soapcpp2 option -a. This allows the service to dispatch methods based on the WS-Addressing action information header value (when the wsa plugin is registered). -# (Re-)compile and link stdsoap2.c/pp or libgsoap, (dom.c/pp when needed), wsaapi.c and the soapcpp2-generated source files. -# Use the wsa plugin API functions described below. An example wsa client/server application can be found in `gsoap/samples/wsa`. A gSOAP service definitions header file with a `#import "wsa.h"` to support WS-Addressing is automatically generated by wsdl2h for a set of WSDLs that use WS-Addressing. The wsdl2h-generated header file should be further processed by soapcpp2 to generate the binding code. The wsaapi.h and wsaapi.c implement the WS-Addressing API described in this document. A wsdl2h-generated service definitions header file might include the following imports: @code #import "soap12.h" #import "wsa.h" // or wsa3.h (2003/03), wsa4.h (2004/03), wsa5.h (2005/03) @endcode The wsa.h header file is imported from import/wsa.h when soapcpp2 is run on this file. The wsa.h import can be manually added to enable WS-Addressing when needed. The gSOAP service definitions header file is processed with soapcpp2 to generate the client-side and/or server-side binding code. Note that the wsa.h, wsa3.h, wsa4.h, and wsa5.h header files are located in the import directory of the gSOAP package. These files define the WS-Addressing information header elements and types. The soap12.h header file enables SOAP 1.2 messaging. For developers: the WS-Addressing header blocks in wsa.h (and others) were generated from the WS-Addressing schema with the wsdl2h tool and WS/WS-typemap.dat as follows: wsdl2h -cegy -o wsa.h -t WS/WS-typemap.dat WS/WS-Addressing.xsd Refer to wsa.h for more details. @section wsa_2 Client-side Usage @subsection wsa_2_1 Constructing WS-Addressing Information Headers To associate WS-Addressing information headers with service operations, the SOAP Header struct `SOAP_ENV__Header` must have been defined and for each service operation that uses WS-Addressing method-header-part directives should be used in the gSOAP service definitions header file as follows: @code #import "wsa.h" //gsoap ns service method-header-part: example wsa__MessageID //gsoap ns service method-header-part: example wsa__RelatesTo //gsoap ns service method-header-part: example wsa__From //gsoap ns service method-header-part: example wsa__ReplyTo //gsoap ns service method-header-part: example wsa__FaultTo //gsoap ns service method-header-part: example wsa__To //gsoap ns service method-header-part: example wsa__Action //gsoap ns service method-action: example urn:example/examplePort/example int ns__example(char *in, struct ns__exampleResponse *out); @endcode Note that the use of wsa versions determines the wsa prefix, e.g. use `wsa5` for the latest WS-Addressing as in `wsa5__MessageID`. In the client-side code, the WS-Addressing information headers are set with `soap_wsa_request` by passing an optional message UUID string, a mandatory destination address URI string, and a mandatory request action URI string. The wsa plugin should be registered with the current soap struct context. An optional source address information header can be added with `soap_wsa_add_From` (must be invoked after the `soap_wsa_request` call). For example: @code #include "wsaapi.h" soap_register_plugin(soap, soap_wsa); if (soap_wsa_request(soap, RequestMessageID, ToAddress, RequestAction)) || soap_wsa_add_From(soap, FromAddress)) // optional: add a 'From' address ... // error: out of memory if (soap_call_ns__example(soap, ToAddress, NULL, ...)) soap_print_fault(soap, stderr); // an error occurred else // process the response @endcode To generate a UUID for the RequestMessageID, use: @code const char *RequestMessageID = soap_wsa_rand_uuid(soap); @endcode @subsection wsa_2_2 Information Headers for Relaying Server Responses To relay the response to another destination, the WS-Addressing ReplyTo information header is added with `soap_wsa_add_ReplyTo` by passing a reply address URI string. The service returns "HTTP 202 ACCEPTED" to the client when the response message relay was successful. For example: @code #include "wsaapi.h" soap_register_plugin(soap, soap_wsa); if (soap_wsa_request(soap, RequestMessageID, ToAddress, RequestAction) || soap_wsa_add_From(soap, FromAddress) // optional: add a 'From' address || soap_wsa_add_ReplyTo(soap, ReplyToAddress)) ... // error: out of memory if (soap_call_ns__example(soap, ToAddress, NULL, ...)) { if (soap->error == 202) // HTTP ACCEPTED printf("Request was accepted and results were forwarded\n"); else soap_print_fault(soap, stderr); // an error occurred } else // unexpected OK: for some reason the response was not relayed @endcode Note: the response message will be relayed when the From address is absent or different than the ReplyTo address @subsection wsa_2_3 Information Headers for Relaying Server Faults To relay a server fault message to another destination, the WS-Addressing FaultTo information header is added with `soap_wsa_add_FaultTo` by passing a relay address URI string. The service returns "HTTP 202 ACCEPTED" to the client when the fault was relayed. For example: @code #include "wsaapi.h" soap_register_plugin(soap, soap_wsa); if (soap_wsa_request(soap, RequestMessageID, ToAddress, RequestAction) || soap_wsa_add_From(soap, FromAddress) // optional: add a 'From' address || soap_wsa_add_FaultTo(soap, FaultToAddress)) ... // error: out of memory if (soap_call_ns__example(soap, ToAddress, NULL, ...)) { if (soap->error == 202) // HTTP ACCEPTED printf("A fault occurred and the fault details were forwarded\n"); else soap_print_fault(soap, stderr); // a connection error occurred } else ... // process response @endcode Note that the call can still return a fault, such as a connection error when the service is not responding. In addition to the fault relay, the responses can be relayed with `soap_wsa_add_ReplyTo`. @subsection wsa_2_4 Error Handling SOAP and HTTP errors set the soap->error attribute, as shown in this example: @code if (soap_call_ns__example(soap, ToAddress, NULL, ...)) { if (soap->error == 202) // HTTP ACCEPTED printf("A fault occurred and the fault details were forwarded\n"); else soap_print_fault(soap, stderr); // a connection error occurred } else ... // process response @endcode When a WS-Addressing error occurred, the wsa error code is stored in the SOAP Fault Subcode field. This information can be retrieved with: @code wsa__FaultSubcodeValues fault; if (soap_wsa_check_fault(soap, &fault)) { switch (fault) { case wsa__InvalidMessageInformationHeader: ... case wsa__MessageInformationHeaderRequired: ... case wsa__DestinationUreachable: ... case wsa__ActionNotSupported: ... case wsa__EndpointUnavailable: ... } } @endcode When using wsa5.h, please refer to the standards and fault codes for this implementation. For the wsa5.h 2005/03 standard, several faults have an additional parameter (SOAP Fault detail): @code wsa5__FaultCodesType fault; char *info; if (soap_wsa_check_fault(soap, &fault, &info)) { switch (fault) { case wsa5__InvalidAddressingHeader: if (info) printf("The invalid addressing header element is %s\n", info); ... } } @endcode @subsection wsa_2_5 Combining WS-Addressing with WS-Security WS-Security can be combined with WS-Addressing. To sign WS-Addressing header blocks, use the `soap_wsse_set_wsu_id` WSSE-plugin call to set the wsu:Id attribute and signing of these attributed elements. For example, suppose we use WS-Addressing 2005 headers (which are activated with an `#import "wsa5.h"` in the header file for soapcpp2): @code #include "wsaapi.h" #include "wsseapi.h" soap_register_plugin(soap, soap_wsa); soap_register_plugin(soap, soap_wsse); soap_wsse_set_wsu_id(soap, "wsa5:From wsa5:To wsa5:ReplyTo wsa5:FaultTo wsa5:Action wsa5:MessageID"); if (soap_wsa_request(soap, RequestMessageID, ToAddress, RequestAction) || soap_wsa_add_From(soap, FromAddress) // optional: add a 'From' address || soap_wsa_add_FaultTo(soap, FaultToAddress)) ... // error: out of memory if (soap_call_ns__example(soap, ToAddress, NULL, ...)) ... // error @endcode If your are using WS-Addressing 2004 (which is activated with an `#import "wsa.h"` in the header file for soapcpp2) then change one line: @code soap_wsse_set_wsu_id(soap, "wsa:From wsa:To wsa:ReplyTo wsa:FaultTo wsa:Action wsa:MessageID"); @endcode Note: `soap_wsse_set_wsu_id` should only be set once. Each new call overrides the previous. For more details on WS-Security, please see the [WS-Security plugin documentation](../../wsse/html/index.html). @section wsa_3 Server-side Usage The wsa plugin should be registered with: @code soap_register_plugin(soap, soap_wsa); @endcode Once the plugin is registered, the `soap_bind`, `soap_accept`, and `soap_serve` functions can be called to process requests and semi-automatically handle the WS-Addressing header blocks. Important: to dispatch service operations based on the WS-Addressing wsa:Action information header, you must use soapcpp2 option `-a`. The generates a new dispatcher (in soapServer.c) based on the action value. A service operation implementation should use `soap_wsa_check` at the start of its execution to verify the validity of the WS-Addressing information headers in the SOAP request message. To allow response message to be automatically relayed based on the ReplyTo information header, the service operation should return `soap_wsa_reply` with an optional message UUID string and a mandatory response action string. The response action string is documented in the wsdl2h-generated .h file for this service operation. For example: @code int ns__example(struct soap *soap, char *in, struct ns__exampleResponse *out) { if (soap_wsa_check(soap)) return soap->error; // ... service logic return soap_wsa_reply(soap, ResponseMessageID, ResponseAction); } @endcode To return a SOAP fault that is automatically relayed to a fault service based on the FaultTo information header, the `soap_wsa_sender_fault`, `soap_wsa_receiver_fault`, `soap_wsa_sender_fault_subcode`, and `soap_wsa_receiver_fault_subcode` functions should be used instead of the usual `soap_sender_fault`, `soap_receiver_fault`, `soap_sender_fault_subcode`, and `soap_receiver_fault_subcode`, respectively: In case a Action must be associated with a SOAP Fault, use the `soap_wsa_sender_fault_subcode_action` and `soap_wsa_receiver_fault_subcode_action` functions to set the WS-Addressing Action (and HTTP SOAP Action header as well). For example, the following service operation illustrates the use of `soap_wsa_check` to verify and process WS-Addressing header blocks and `soap_wsa_reply` to enable responses to be relayed as per ReplyTo address in the WS-Addressing header: @code int ns__example(struct soap *soap, char *in, struct ns__exampleResponse *out) { if (soap_wsa_check(soap)) return soap->error; // ... service logic // ... an error occurred, need to return fault possibly to fault service: return soap_wsa_sender_fault(soap, "Exception in service operation", NULL); // ... normal execution continues return soap_wsa_reply(soap, ResponseMessageID, ResponseAction); } @endcode @section wsa_4 HTTPS Server-side Usage To enable HTTPS (SSL/TSL) servers, compile the sources with -DWITH_OPENSSL (and link with libgsoapssl, libssl, and libcrypto). Because WS-Addressing may relay messages over HTTPS as a sender (client), you must initialize the SSL context for server and client uses. Therefore, the context must have access to all the certificates need to verify the authenticity of the ReplyTo and FaultTo HTTPS servers. To do so, use the following SSL initialization before `soap_bind`: @code struct soap *soap = soap_new(); if (soap_ssl_server_context(soap, SOAP_SSL_DEFAULT, "server.pem", // the keyfile (server should authenticate) "password", // password to read the key file "cacert.pem", // cacert file to store trusted certificates (role as client) NULL, // optional capath NULL, // DH file name or DH param key len bits, when NULL use RSA NULL, // file with random data to seed randomness "myserver" // unique server identification for SSL session cache )) { soap_print_fault(soap, stderr); ... } soap->bind_flags = SO_REUSEADDR; if (!soap_valid_socket(soap_bind(soap, NULL, port, 100))) { soap_print_fault(soap, stderr); ... } @endcode @section wsa_5 Implementing a Server for Handling ReplyTo Response Messages To implement a separate server for handling relayed SOAP response messages based on the ReplyTo information header in the request message, the gSOAP header file should include a one-way service operation for the response message. These one-way response service operations are automatically generated with wsdl2h option `-b`. For example, suppose a service operation returns an exampleResponse message. We declare the one-way exampleResponse operation as follows: @code #import "wsa.h" //gsoap ns service method-header-part: exampleResult wsa__MessageID //gsoap ns service method-header-part: exampleResult wsa__RelatesTo //gsoap ns service method-header-part: exampleResult wsa__From //gsoap ns service method-header-part: exampleResult wsa__ReplyTo //gsoap ns service method-header-part: exampleResult wsa__FaultTo //gsoap ns service method-header-part: exampleResult wsa__To //gsoap ns service method-header-part: exampleResult wsa__Action //gsoap ns service method-action: exampleResult urn:example/examplePort/exampleResponse int ns__exampleResponse(char *out, void); @endcode Note that the action information is important, because it is used by the service dispatcher (assuming soapcpp2 option `-a` is used). The implementation in the server code uses soap_wsa_check() to check the presense and validity of the WS-Addressing information header in the message. The `soap_send_empty_response` function should be used to return an acknowledgment HTTP header with "HTTP 202 ACCEPTED" to the sender: @code int ns__exampleResponse(struct soap *soap, char *out) { if (soap_wsa_check(soap)) return soap_send_empty_response(soap, 500); // HTTP 500 Internal Server Error // ... service logic return soap_send_empty_response(soap, SOAP_OK); // HTTP 202 ACCEPTED } @endcode @section wsa_6 Implementing a Server for Handling FaultTo Fault Messages To implement a separate server for handling relayed SOAP fault messages based on the FaultTo information header in the request message, the gSOAP header file for soapcpp2 should include a SOAP fault service operation. This operation accepts fault messages that are relayed by other services. Basically, we use a trick to generate the SOAP-ENV:Fault struct via a one-way service operation. This allows us both to implement a one-way service operation that accepts faults and to automatically generate the fault struct for fault data storage and manipulation. The fault operation in the WS-Addressing files (wsa5.h etc.) is declared as follows (here shown for the 2004/08 standard): @code //gsoap SOAP_ENV service method-action: Fault http://schemas.xmlsoap.org/ws/2004/08/addressing/fault int SOAP_ENV__Fault ( _QName faultcode, // SOAP 1.1 char *faultstring, // SOAP 1.1 char *faultactor, // SOAP 1.1 struct SOAP_ENV__Detail *detail, // SOAP 1.1 struct SOAP_ENV__Code *SOAP_ENV__Code, // SOAP 1.2 struct SOAP_ENV__Reason *SOAP_ENV__Reason, // SOAP 1.2 char *SOAP_ENV__Node, // SOAP 1.2 char *SOAP_ENV__Role, // SOAP 1.2 struct SOAP_ENV__Detail *SOAP_ENV__Detail, // SOAP 1.2 void ); @endcode Because each service operation has a struct to hold its input parameters, we automatically generate the (original) `SOAP_ENV__Fault` struct on the fly! It is important to associate the wsa fault action with this operation as shown above. The implementation of the Fault service operation in your server code should be similar to: @code int SOAP_ENV__Fault(struct soap *soap, char *faultcode, char *faultstring, char *faultactor, struct SOAP_ENV__Detail *detail, struct SOAP_ENV__Code *SOAP_ENV__Code, struct SOAP_ENV__Reason *SOAP_ENV__Reason, char *SOAP_ENV__Node, char *SOAP_ENV__Role, struct SOAP_ENV__Detail *SOAP_ENV__Detail) { ... = faultcode; // SOAP 1.1 fault code string (QName) ... = faultstring; // SOAP 1.1 fault string ... = faultactor; // SOAP 1.1 fault actor string ... = detail; // SOAP 1.1 fault detail struct ... = SOAP_ENV__Code; // SOAP 1.2 fault code struct ... = SOAP_ENV__Reason; // SOAP 1.2 reason struct ... = SOAP_ENV__Node; // SOAP 1.2 node string ... = SOAP_ENV__Role; // SOAP 1.2 role string ... = SOAP_ENV__Detail; // SOAP 1.2 detail struct return SOAP_OK; } @endcode Note that SOAP 1.1 or SOAP 1.2 parameters are set based on the 1.1/1.2 messaging requirements. */ #include "wsaapi.h" #ifdef __cplusplus extern "C" { #endif /** Plugin identification for plugin registry */ const char soap_wsa_id[] = SOAP_WSA_ID; #if defined(SOAP_WSA_2003) /** Anonymous Reply/To endpoint address */ const char *soap_wsa_anonymousURI = "http://schemas.xmlsoap.org/ws/2003/03/addressing/role/anonymous"; /** Specifies no Reply endpoint address (no reply) */ const char *soap_wsa_noneURI = "addressing/none not supported"; const char *soap_wsa_faultAction = "http://schemas.xmlsoap.org/ws/2003/03/addressing/fault"; #elif defined(SOAP_WSA_2004) /** Anonymous Reply/To endpoint address */ const char *soap_wsa_anonymousURI = "http://schemas.xmlsoap.org/ws/2004/03/addressing/role/anonymous"; /** Specifies no Reply endpoint address (no reply) */ const char *soap_wsa_noneURI = "addressing/none not supported"; const char *soap_wsa_faultAction = "http://schemas.xmlsoap.org/ws/2004/03/addressing/fault"; #elif defined(SOAP_WSA_2005) /** Anonymous Reply/To endpoint address */ const char *soap_wsa_anonymousURI = "http://www.w3.org/2005/08/addressing/anonymous"; /** Specifies no Reply endpoint address (no reply) */ const char *soap_wsa_noneURI = "http://www.w3.org/2005/08/addressing/none"; const char *soap_wsa_faultAction = "http://www.w3.org/2005/08/addressing/soap/fault"; #else /** Anonymous Reply/To endpoint address */ const char *soap_wsa_anonymousURI = "http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous"; /** Specifies no Reply endpoint address (no reply) */ const char *soap_wsa_noneURI = "addressing/none not supported"; const char *soap_wsa_faultAction = "http://schemas.xmlsoap.org/ws/2004/08/addressing/fault"; #endif /** anonymous URI of 2004 and 2005 schemas */ const char *soap_wsa_allAnonymousURI = "http://schemas.xmlsoap.org/ws/2004/03/addressing/role/anonymous http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous http://www.w3.org/2005/08/addressing/anonymous"; /******************************************************************************\ * * Static protos * \******************************************************************************/ static int soap_wsa_init(struct soap *soap, struct soap_wsa_data *data); static void soap_wsa_delete(struct soap *soap, struct soap_plugin *p); static int soap_wsa_header(struct soap *soap); static void soap_wsa_set_error(struct soap *soap, const char **c, const char **s); static int soap_wsa_response(struct soap *soap, int status, ULONG64 count); static int soap_wsa_disconnect(struct soap *soap); static int soap_wsa_alloc_header(struct soap *soap); /******************************************************************************\ * * UUID * \******************************************************************************/ /** @fn const char *soap_wsa_rand_uuid(struct soap *soap) @brief Generates a random UUID (UUID algorithm version 4). Compile all source codes with -DWITH_OPENSSL for better randomness. @param soap context @return UUID "urn:uuid:xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx" or NULL if out of memory */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_wsa_rand_uuid(struct soap *soap) { return soap_strdup(soap, soap_rand_uuid(soap, "urn:uuid:")); } /******************************************************************************\ * * Client-side Request * \******************************************************************************/ /** @fn int soap_wsa_request(struct soap *soap, const char *id, const char *to, const char *action) @brief Sets the WS-Addressing information header for the next request message with MessageID (optional), To (optional), and Action (required). @param soap context @param[in] id is the message ID (optional) @param[in] to is the target endpoint (optional, set to anonymous when NULL) @param[in] action is the target action (required) @return SOAP_OK or error Note: use soap_wsa_add_From, soap_wsa_add_ReplyTo, soap_wsa_add_FaultTo to add other addressing fields following this function call. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_request(struct soap *soap, const char *id, const char *to, const char *action) { DBGFUN3("soap_wsa_request", "id=%s", id?id:"(null)", "to=%s", to?to:"(null)", "action=%s", action?action:"(null)"); if (soap_wsa_alloc_header(soap)) return soap->error; soap->header->SOAP_WSA(MessageID) = soap_strdup(soap, id); if (to) soap->header->SOAP_WSA(To) = soap_strdup(soap, to); else /* this is optional */ soap->header->SOAP_WSA(To) = (char*)soap_wsa_anonymousURI; soap->header->SOAP_WSA(Action) = soap_strdup(soap, action); soap->header->SOAP_WSA(RelatesTo) = NULL; soap->header->SOAP_WSA(From) = NULL; soap->header->SOAP_WSA(FaultTo) = NULL; soap_wsa_add_ReplyTo(soap, NULL); return soap_wsa_check(soap); } /******************************************************************************/ /** @fn int soap_wsa_add_From(struct soap *soap, const char *from) @brief Sets WS-Addressing From header for request message. @param soap context @param[in] from endpoint URI @return SOAP_OK or SOAP_ERR Use soap_wsa_request to populate the WS-Addressing header first. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_add_From(struct soap *soap, const char *from) { if (!soap->header) return SOAP_ERR; soap->header->SOAP_WSA(From) = (SOAP_WSA_(,From)*)soap_malloc(soap, sizeof(SOAP_WSA_(,From))); SOAP_WSA_(soap_default,EndpointReferenceType)(soap, soap->header->SOAP_WSA(From)); soap->header->SOAP_WSA(From)->Address = soap_strdup(soap, from); return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsa_add_NoReply(struct soap *soap) @brief Sets WS-Addressing ReplyTo header to 'none' (no reply) @param soap context @return SOAP_OK or SOAP_ERR Note: WS-Addressing 2005/08 standard. Use soap_wsa_request to populate the WS-Addressing header. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_add_NoReply(struct soap *soap) { return soap_wsa_add_ReplyTo(soap, soap_wsa_noneURI); } /******************************************************************************/ /** @fn int soap_wsa_add_ReplyTo(struct soap *soap, const char *replyTo) @brief Sets WS-Addressing ReplyTo header for request message. @param soap context @param[in] replyTo endpoint URI or NULL for anonymous @return SOAP_OK or SOAP_ERR Use soap_wsa_request to populate the WS-Addressing header. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_add_ReplyTo(struct soap *soap, const char *replyTo) { if (!soap->header) return SOAP_ERR; #ifndef SOAP_WSA_2005 if (!replyTo) replyTo = soap_wsa_anonymousURI; #endif if (replyTo) { soap->header->SOAP_WSA(ReplyTo) = (SOAP_WSA_(,ReplyTo)*)soap_malloc(soap, sizeof(SOAP_WSA_(,ReplyTo))); SOAP_WSA_(soap_default,EndpointReferenceType)(soap, soap->header->SOAP_WSA(ReplyTo)); soap->header->SOAP_WSA(ReplyTo)->Address = soap_strdup(soap, replyTo); } else soap->header->SOAP_WSA(ReplyTo) = NULL; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsa_add_FaultTo(struct soap *soap, const char *faultTo) @brief Sets WS-Addressing FaultTo header for request message. @param soap context @param[in] faultTo endpoint URI or NULL for remove faultTo @return SOAP_OK or SOAP_ERR Use soap_wsa_request to populate the WS-Addressing header first. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_add_FaultTo(struct soap *soap, const char *faultTo) { if (!soap->header) return SOAP_ERR; if (faultTo) { soap->header->SOAP_WSA(FaultTo) = (SOAP_WSA_(,FaultTo)*)soap_malloc(soap, sizeof(SOAP_WSA_(,FaultTo))); SOAP_WSA_(soap_default,EndpointReferenceType)(soap, soap->header->SOAP_WSA(FaultTo)); soap->header->SOAP_WSA(FaultTo)->Address = soap_strdup(soap, faultTo); } else soap->header->SOAP_WSA(FaultTo) = NULL; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsa_add_RelatesTo(struct soap *soap, const char *relatesTo) @brief Sets WS-Addressing RelatesTo header. @param soap context @param[in] relatesTo endpoint URI @return SOAP_OK or SOAP_ERR Use soap_wsa_request to populate the WS-Addressing header. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_add_RelatesTo(struct soap *soap, const char *relatesTo) { if (!soap->header) return SOAP_ERR; if (relatesTo) { soap->header->SOAP_WSA(RelatesTo) = (SOAP_WSA_(,RelatesTo)*)soap_malloc(soap, sizeof(SOAP_WSA_(,RelatesTo))); SOAP_WSA_(soap_default_,RelatesTo)(soap, soap->header->SOAP_WSA(RelatesTo)); soap->header->SOAP_WSA(RelatesTo)->__item = soap_strdup(soap, relatesTo); } return SOAP_OK; } /******************************************************************************/ /** @fn const char *soap_wsa_From(struct soap *soap) @brief Returns WS-Addressing From header. @param soap context @return From string or NULL */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_wsa_From(struct soap *soap) { if (!soap->header || !soap->header->SOAP_WSA(From)) return NULL; return soap->header->SOAP_WSA(From)->Address; } /******************************************************************************/ /** @fn const char *soap_wsa_ReplyTo(struct soap *soap) @brief Returns WS-Addressing ReplyTo header. @param soap context @return From string or NULL */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_wsa_ReplyTo(struct soap *soap) { if (!soap->header || !soap->header->SOAP_WSA(ReplyTo)) return NULL; return soap->header->SOAP_WSA(ReplyTo)->Address; } /******************************************************************************/ /** @fn const char *soap_wsa_FaultTo(struct soap *soap) @brief Returns WS-Addressing FaultTo header. @param soap context @return From string or NULL */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_wsa_FaultTo(struct soap *soap) { if (!soap->header || !soap->header->SOAP_WSA(FaultTo)) return NULL; return soap->header->SOAP_WSA(FaultTo)->Address; } /******************************************************************************/ /** @fn const char *soap_wsa_RelatesTo(struct soap *soap) @brief Returns WS-Addressing RelatesTo header. @param soap context @return From string or NULL */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_wsa_RelatesTo(struct soap *soap) { if (!soap->header || !soap->header->SOAP_WSA(RelatesTo)) return NULL; return soap->header->SOAP_WSA(RelatesTo)->__item; } /******************************************************************************\ * * Server-side Check and Reply * \******************************************************************************/ /** @fn int soap_wsa_check(struct soap *soap) @brief Checks the presence and validity of WS-Addressing information headers. @param soap context @return SOAP_OK or fault */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_check(struct soap *soap) { DBGFUN("soap_wsa_check"); if (!soap->header || !soap->header->SOAP_WSA(Action)) #if defined(SOAP_WSA_2005) return soap_wsa_error(soap, wsa5__MessageAddressingHeaderRequired, NULL); #elif defined(SOAP_WSA_2003) return soap_wsa_error(soap, "WS-Addressing header missing"); #else return soap_wsa_error(soap, SOAP_WSA(MessageInformationHeaderRequired)); #endif return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsa_reply(struct soap *soap, const char *id, const char *action) @brief Sets WS-Addressing header fields for server response. Automatically relays the response to the ReplyTo address (when ReplyTo != to From and ReplyTo != 'none') and returns HTTP 202 Accept to sender when relay was successful. @param soap context @param[in] id is the messageID (optional) @param[in] action is the target action (required) @return SOAP_OK or fault */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_reply(struct soap *soap, const char *id, const char *action) { struct soap_wsa_data *data = (struct soap_wsa_data*)soap_lookup_plugin(soap, soap_wsa_id); struct SOAP_ENV__Header *oldheader, *newheader; DBGFUN1("soap_wsa_reply", "action=%s", action?action:"(null)"); if (!data) return soap->error = SOAP_PLUGIN_ERROR; oldheader = soap->header; soap->header = NULL; /* if endpoint address for reply is 'none' return immediately and STOP engine */ if (oldheader && oldheader->SOAP_WSA(ReplyTo) && oldheader->SOAP_WSA(ReplyTo)->Address && !strcmp(oldheader->SOAP_WSA(ReplyTo)->Address, soap_wsa_noneURI)) return soap_send_empty_response(soap, SOAP_OK); /* allocate a new header */ if (soap_wsa_alloc_header(soap)) return soap->error; newheader = soap->header; /* copy members to new header, except WSA data */ if (oldheader) *newheader = *oldheader; newheader->SOAP_WSA(MessageID) = soap_strdup(soap, id); newheader->SOAP_WSA(Action) = soap_strdup(soap, action); newheader->SOAP_WSA(RelatesTo) = NULL; newheader->SOAP_WSA(From) = NULL; newheader->SOAP_WSA(To) = NULL; newheader->SOAP_WSA(ReplyTo) = NULL; newheader->SOAP_WSA(FaultTo) = NULL; /* check current header content */ if (oldheader && oldheader->SOAP_WSA(MessageID)) { newheader->SOAP_WSA(RelatesTo) = (SOAP_WSA_(,RelatesTo)*)soap_malloc(soap, sizeof(SOAP_WSA_(,RelatesTo))); SOAP_WSA_(soap_default_,RelatesTo)(soap, newheader->SOAP_WSA(RelatesTo)); newheader->SOAP_WSA(RelatesTo)->__item = oldheader->SOAP_WSA(MessageID); } #ifdef SOAP_WSA_2005 /* WCF Interoperability: ChannelInstance is required when the WCF Application hosts multiple Callback Channels within the same application. The ReferenceParameters->ChannelInstance element serves as a hint to the WCF Client dispatcher, as to which WCF callback instance a received SOAP Envelope belongs to ChannelInstance is declared as a pointer, so it is essentially an optional element. Tests with Applications not requiring ChannelInstance have also been done for the following fix. */ if (oldheader && oldheader->SOAP_WSA(ReplyTo) && oldheader->SOAP_WSA(ReplyTo)->ReferenceParameters && oldheader->SOAP_WSA(ReplyTo)->ReferenceParameters->chan__ChannelInstance) { if (!newheader->chan__ChannelInstance) { newheader->chan__ChannelInstance = (struct chan__ChannelInstanceType*)soap_malloc(soap, sizeof(struct chan__ChannelInstanceType)); if (newheader->chan__ChannelInstance) { soap_default_chan__ChannelInstanceType(soap, newheader->chan__ChannelInstance); newheader->chan__ChannelInstance->__item = *(oldheader->SOAP_WSA(ReplyTo)->ReferenceParameters->chan__ChannelInstance); newheader->chan__ChannelInstance->wsa5__IsReferenceParameter = _wsa5__IsReferenceParameter__true; } } else { newheader->chan__ChannelInstance->__item = *(oldheader->SOAP_WSA(ReplyTo)->ReferenceParameters->chan__ChannelInstance); newheader->chan__ChannelInstance->wsa5__IsReferenceParameter = _wsa5__IsReferenceParameter__true; } } #endif if (oldheader && oldheader->SOAP_WSA(ReplyTo) && oldheader->SOAP_WSA(ReplyTo)->Address && !soap_tagsearch(soap_wsa_allAnonymousURI, oldheader->SOAP_WSA(ReplyTo)->Address)) { newheader->SOAP_WSA(To) = oldheader->SOAP_WSA(ReplyTo)->Address; /* (re)connect to ReplyTo endpoint if From != ReplyTo */ if (!oldheader->SOAP_WSA(From) || !oldheader->SOAP_WSA(From)->Address || strcmp(oldheader->SOAP_WSA(From)->Address, oldheader->SOAP_WSA(ReplyTo)->Address)) { struct soap *reply_soap = soap_copy(soap); if (reply_soap) { soap_copy_stream(reply_soap, soap); soap_free_stream(soap); /* prevents close in soap_connect() below */ soap->omode |= SOAP_ENC_PLAIN; /* omit HTTP header ("encode XML body only") */ if (soap_connect(soap, newheader->SOAP_WSA(To), newheader->SOAP_WSA(Action))) { int err; soap_copy_stream(soap, reply_soap); soap_free_stream(reply_soap); soap_end(reply_soap); soap_free(reply_soap); soap->header = oldheader; #if defined(SOAP_WSA_2005) err = soap_wsa_error(soap, SOAP_WSA(DestinationUnreachable), newheader->SOAP_WSA(To)); #elif defined(SOAP_WSA_2003) err = soap_wsa_error(soap, "WS-Addessing destination unreachable"); #else err = soap_wsa_error(soap, SOAP_WSA(DestinationUnreachable)); #endif soap->header = NULL; return err; } if (soap_valid_socket(reply_soap->socket)) soap_send_empty_response(reply_soap, SOAP_OK); /* HTTP ACCEPTED */ soap->header = newheader; soap->omode &= ~SOAP_ENC_PLAIN; /* HTTP header required */ soap_end(reply_soap); soap_free(reply_soap); data->fresponse = soap->fresponse; soap->fresponse = soap_wsa_response; /* response will be a POST */ } } } else if (oldheader && oldheader->SOAP_WSA(From)) newheader->SOAP_WSA(To) = oldheader->SOAP_WSA(From)->Address; else newheader->SOAP_WSA(To) = (char*)soap_wsa_anonymousURI; soap->header = newheader; soap->action = newheader->SOAP_WSA(Action); return SOAP_OK; } /******************************************************************************\ * * Server-side SOAP Fault * \******************************************************************************/ /** @fn int soap_wsa_fault_subcode(struct soap *soap, int flag, const char *faultsubcode, const char *faultstring, const char *faultdetail) @brief Sets sender/receiver SOAP Fault (sub)code for server fault response. @param soap context @param[in] flag 0=receiver, 1=sender @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_fault_subcode(struct soap *soap, int flag, const char *faultsubcode, const char *faultstring, const char *faultdetail) { return soap_wsa_fault_subcode_action(soap, flag, faultsubcode, faultstring, faultdetail, NULL); } /******************************************************************************/ /** @fn int soap_wsa_fault_subcode_action(struct soap *soap, int flag, const char *faultsubcode, const char *faultstring, const char *faultdetail, const char *action) @brief Sets sender/receiver SOAP Fault (sub)code and action for server fault response. @param soap context @param[in] flag 0=receiver, 1=sender @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @param[in] action WS-Addressing action string @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_fault_subcode_action(struct soap *soap, int flag, const char *faultsubcode, const char *faultstring, const char *faultdetail, const char *action) { struct SOAP_ENV__Header *oldheader, *newheader; DBGFUN2("soap_wsa_fault_subcode_action", "faultsubcode=%s", faultsubcode ? faultsubcode : "(null)", "faultstring=%s", faultstring ? faultstring : "(null)"); oldheader = soap->header; /* no FaultTo: use ReplyTo */ if (oldheader && oldheader->SOAP_WSA(ReplyTo) && (!oldheader->SOAP_WSA(FaultTo) || soap_tagsearch(soap_wsa_allAnonymousURI, oldheader->SOAP_WSA(FaultTo)->Address))) { if (!oldheader->SOAP_WSA(FaultTo)) { oldheader->SOAP_WSA(FaultTo) = (SOAP_WSA_(,FaultTo)*)soap_malloc(soap, sizeof(SOAP_WSA_(,FaultTo))); if (oldheader->SOAP_WSA(FaultTo)) SOAP_WSA_(soap_default,EndpointReferenceType)(soap, soap->header->SOAP_WSA(FaultTo)); } if (oldheader->SOAP_WSA(FaultTo)) oldheader->SOAP_WSA(FaultTo)->Address = oldheader->SOAP_WSA(ReplyTo)->Address; } /* use FaultTo */ if (oldheader && oldheader->SOAP_WSA(FaultTo) && !strcmp(oldheader->SOAP_WSA(FaultTo)->Address, soap_wsa_noneURI)) return soap_send_empty_response(soap, SOAP_OK); /* HTTP ACCEPTED */ soap->header = NULL; /* allocate a new header */ soap_header(soap); newheader = soap->header; if (newheader) { soap_default_SOAP_ENV__Header(soap, newheader); /* remove/clear SOAP Header */ /* check header */ if (oldheader && oldheader->SOAP_WSA(MessageID)) { newheader->SOAP_WSA(RelatesTo) = (SOAP_WSA_(,RelatesTo)*)soap_malloc(soap, sizeof(SOAP_WSA_(,RelatesTo))); SOAP_WSA_(soap_default_,RelatesTo)(soap, newheader->SOAP_WSA(RelatesTo)); newheader->SOAP_WSA(RelatesTo)->__item = oldheader->SOAP_WSA(MessageID); } /* header->wsa__MessageID = "..."; */ newheader->SOAP_WSA(Action) = (char*)soap_wsa_faultAction; if (oldheader && oldheader->SOAP_WSA(FaultTo) && oldheader->SOAP_WSA(FaultTo)->Address && !soap_tagsearch(soap_wsa_allAnonymousURI, oldheader->SOAP_WSA(FaultTo)->Address)) { newheader->SOAP_WSA(To) = oldheader->SOAP_WSA(FaultTo)->Address; /* (re)connect to FaultTo endpoint if From != FaultTo */ if (!oldheader->SOAP_WSA(From) || !oldheader->SOAP_WSA(From)->Address || strcmp(oldheader->SOAP_WSA(From)->Address, oldheader->SOAP_WSA(FaultTo)->Address)) { struct soap_wsa_data *data = (struct soap_wsa_data*)soap_lookup_plugin(soap, soap_wsa_id); if (!data) return soap->error = SOAP_PLUGIN_ERROR; soap->keep_alive = 0; soap_send_empty_response(soap, SOAP_OK); /* HTTP ACCEPTED */ if (soap_connect(soap, newheader->SOAP_WSA(To), newheader->SOAP_WSA(Action))) return soap->error = SOAP_STOP; /* nowhere to go */ soap_set_endpoint(soap, newheader->SOAP_WSA(To)); if (action) soap->action = (char*)action; else soap->action = newheader->SOAP_WSA(Action); data->fresponse = soap->fresponse; soap->fresponse = soap_wsa_response; /* response will be a POST */ } } else if (oldheader && oldheader->SOAP_WSA(From)) newheader->SOAP_WSA(To) = oldheader->SOAP_WSA(From)->Address; else newheader->SOAP_WSA(To) = (char*)soap_wsa_anonymousURI; soap->header = newheader; } if (flag) return soap_sender_fault_subcode(soap, faultsubcode, faultstring, faultdetail); return soap_receiver_fault_subcode(soap, faultsubcode, faultstring, faultdetail); } /******************************************************************************/ /** @fn int soap_wsa_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) @brief Sets sender SOAP Fault (sub)code for server fault response. @param soap context @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) { return soap_wsa_fault_subcode(soap, 1, faultsubcode, faultstring, faultdetail); } /******************************************************************************/ /** @fn int soap_wsa_sender_fault_subcode_action(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail, const char *action) @brief Sets sender SOAP Fault (sub)code for server fault response. @param soap context @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @param[in] action WS-Addressing action string @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_sender_fault_subcode_action(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail, const char *action) { return soap_wsa_fault_subcode_action(soap, 1, faultsubcode, faultstring, faultdetail, action); } /******************************************************************************/ /** @fn int soap_wsa_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) @brief Sets receiver SOAP Fault (sub)code for server fault response. @param soap context @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) { return soap_wsa_fault_subcode(soap, 0, faultsubcode, faultstring, faultdetail); } /******************************************************************************/ /** @fn int soap_wsa_receiver_fault_subcode_action(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail, const char *action) @brief Sets receiver SOAP Fault (sub)code for server fault response. @param soap context @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @param[in] action WS-Addressing action string @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_receiver_fault_subcode_action(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail, const char *action) { return soap_wsa_fault_subcode_action(soap, 0, faultsubcode, faultstring, faultdetail, action); } /******************************************************************************/ /** @fn int soap_wsa_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail) @brief Sets sender SOAP Fault for server fault response. @param soap context @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail) { return soap_wsa_fault_subcode(soap, 1, NULL, faultstring, faultdetail); } /******************************************************************************/ /** @fn int soap_wsa_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail) @brief Sets receiver SOAP Fault for server fault response. @param soap context @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail) { return soap_wsa_fault_subcode(soap, 0, NULL, faultstring, faultdetail); } /******************************************************************************\ * * WS-Addressing Faults * \******************************************************************************/ #if defined(SOAP_WSA_2005) /** @fn int soap_wsa_check_fault(struct soap *soap, SOAP_WSA(FaultCodesType) *fault, const char **info) @brief Checks the presence of a WS-Addressing fault @param soap context @param[out] fault code @param[out] info string pointer related to the wsa fault (or set to NULL) @return SOAP_OK (no fault) or fault code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_check_fault(struct soap *soap, SOAP_WSA(FaultCodesType) *fault, const char **info) { if (soap->error && soap->fault && soap->fault->SOAP_ENV__Code) { const char *code = soap_fault_subcode(soap); if (code) { SOAP_WSA__(soap_s2,FaultCodesType)(soap, code, fault); if (info) { struct SOAP_ENV__Detail *detail; *info = NULL; if (soap->fault->detail) detail = soap->fault->detail; else detail = soap->fault->SOAP_ENV__Detail; if (detail) { switch (detail->__type) { case SOAP_WSA_(SOAP_TYPE_,ProblemHeaderQName): case SOAP_WSA_(SOAP_TYPE_,ProblemIRI): *info = (char*)detail->fault; break; case SOAP_WSA_(SOAP_TYPE_,ProblemAction): *info = ((SOAP_WSA_(,ProblemAction)*)detail->fault)->Action; break; default: break; } } } return soap->error; } } return SOAP_OK; } #elif defined(SOAP_WSA_2003) SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_check_fault(struct soap *soap, char **fault) { struct SOAP_ENV__Detail detail; *fault = NULL; if (soap->error && soap->fault) { if (soap->fault->detail) detail = soap->fault->detail; else detail = soap->fault->SOAP_ENV__Detail; } if (detail) { *fault = detail->__any; if (*fault) return soap->error; } return SOAP_OK; } #else /** @fn int soap_wsa_check_fault(struct soap *soap, SOAP_WSA(FaultSubcodeValues) *fault) @brief Checks the presence of a WS-Addressing fault @param soap context @param[out] fault code @return SOAP_OK (no fault) or fault code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_check_fault(struct soap *soap, SOAP_WSA(FaultSubcodeValues) *fault) { if (soap->error && soap->fault && soap->fault->SOAP_ENV__Code) { const char *code = soap_fault_subcode(soap); if (code) { SOAP_WSA__(soap_s2,FaultSubcodeValues)(soap, code, fault); return soap->error; } } return SOAP_OK; } #endif #if defined(SOAP_WSA_2005) /** @fn int soap_wsa_error(struct soap *soap, SOAP_WSA(FaultCodesType) fault, const char *info) @brief Sets SOAP Fault (sub)code for server WS-Addressing fault response. @param soap context @param[in] fault is one of wsa:FaultCodesType enumeration values @param[in] info is the value of the element in the Fault detail field @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_error(struct soap *soap, SOAP_WSA(FaultCodesType) fault, const char *info) { const char *code = SOAP_WSA_(soap,FaultCodesType2s)(soap, fault); /* populate the SOAP Fault as per WS-Addressing spec */ switch (fault) { case SOAP_WSA(InvalidAddressingHeader): soap_faultdetail(soap); if (soap->version == 1) { soap->fault->detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemHeaderQName); soap->fault->detail->fault = (void*)info; } else if (soap->version == 2) { soap->fault->SOAP_ENV__Detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemHeaderQName); soap->fault->SOAP_ENV__Detail->fault = (void*)info; } soap_wsa_sender_fault_subcode(soap, code, "A header representing a Message Addressing Property is not valid and the message cannot be processed.", NULL); break; case SOAP_WSA(InvalidAddress): soap_wsa_sender_fault_subcode(soap, code, "Invalid address.", NULL); break; case SOAP_WSA(InvalidEPR): soap_wsa_sender_fault_subcode(soap, code, "Invalid EPR.", NULL); break; case SOAP_WSA(InvalidCardinality): soap_wsa_sender_fault_subcode(soap, code, "Invalid cardinality of headers.", NULL); break; case SOAP_WSA(MissingAddressInEPR): soap_wsa_sender_fault_subcode(soap, code, "Missing EPR address.", NULL); break; case SOAP_WSA(DuplicateMessageID): soap_wsa_sender_fault_subcode(soap, code, "Message contains the message ID of a message already received.", NULL); break; case SOAP_WSA(ActionMismatch): soap_wsa_sender_fault_subcode(soap, code, "Action and SOAP action of the message do not match.", NULL); break; case SOAP_WSA(MessageAddressingHeaderRequired): soap_faultdetail(soap); if (soap->version == 1) { soap->fault->detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemHeaderQName); soap->fault->detail->fault = (void*)info; } else if (soap->version == 2) { soap->fault->SOAP_ENV__Detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemHeaderQName); soap->fault->SOAP_ENV__Detail->fault = (void*)info; } soap_wsa_sender_fault_subcode(soap, code, "A required header representing a Message Addressing Property is not present.", NULL); break; case SOAP_WSA(DestinationUnreachable): soap_faultdetail(soap); if (soap->version == 1) { soap->fault->detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemIRI); soap->fault->detail->fault = (void*)info; } else if (soap->version == 2) { soap->fault->SOAP_ENV__Detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemIRI); soap->fault->SOAP_ENV__Detail->fault = (void*)info; } soap_wsa_sender_fault_subcode(soap, code, "No route can be determined to reach [destination]", NULL); break; case SOAP_WSA(ActionNotSupported): soap_faultdetail(soap); if (soap->version == 1) { soap->fault->detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemAction); soap->fault->detail->fault = (void*)soap_malloc(soap, sizeof(SOAP_WSA_(,ProblemAction))); SOAP_WSA_(soap_default_,ProblemAction)(soap, (SOAP_WSA_(,ProblemAction)*)soap->fault->detail->fault); ((SOAP_WSA_(,ProblemAction)*)soap->fault->detail->fault)->Action = (char*)info; } else if (soap->version == 2) { soap->fault->SOAP_ENV__Detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemAction); soap->fault->SOAP_ENV__Detail->fault = (void*)soap_malloc(soap, sizeof(SOAP_WSA_(,ProblemAction))); SOAP_WSA_(soap_default_,ProblemAction)(soap, (SOAP_WSA_(,ProblemAction)*)soap->fault->SOAP_ENV__Detail->fault); ((SOAP_WSA_(,ProblemAction)*)soap->fault->SOAP_ENV__Detail->fault)->Action = (char*)info; } soap_wsa_sender_fault_subcode(soap, code, "The [action] cannot be processed at the receiver.", NULL); break; case SOAP_WSA(EndpointUnavailable): soap_faultdetail(soap); if (soap->version == 1) { soap->fault->detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemIRI); soap->fault->detail->fault = (void*)info; } else if (soap->version == 2) { soap->fault->SOAP_ENV__Detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemIRI); soap->fault->SOAP_ENV__Detail->fault = (void*)info; } soap_wsa_receiver_fault_subcode(soap, code, "The endpoint is unable to process the message at this time.", NULL); break; default: break; } return SOAP_FAULT; } #elif defined(SOAP_WSA_2003) SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_error(struct soap *soap, const char *fault) { return soap_wsa_sender_fault_subcode(soap, NULL, fault, NULL); } #else /** @fn int soap_wsa_error(struct soap *soap, SOAP_WSA(FaultSubcodeValues) fault) @brief Sets SOAP Fault (sub)code for server WS-Addressing fault response. @param soap context @param[in] fault is one of wsa:FaultSubcodeValues @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsa_error(struct soap *soap, SOAP_WSA(FaultSubcodeValues) fault) { const char *code = SOAP_WSA_(soap,FaultSubcodeValues2s)(soap, fault); /* populate the SOAP Fault as per WS-Addressing spec */ switch (fault) { case SOAP_WSA(InvalidMessageInformationHeader): return soap_wsa_sender_fault_subcode(soap, code, "A message information header is not valid and the message cannot be processed. The validity failure can be either structural or semantic, e.g. a [destination] that is not a URI or a [relationship] to a [message id] that was never issued.", "Invalid header"); case SOAP_WSA(MessageInformationHeaderRequired): return soap_wsa_sender_fault_subcode(soap, code, "A required message information header, To, MessageID, or Action, is not present.", "Missing Header QName"); case SOAP_WSA(DestinationUnreachable): return soap_wsa_sender_fault_subcode(soap, code, "No route can be determined to reach the destination role defined by the WS-Addressing To.", NULL); case SOAP_WSA(ActionNotSupported): return soap_wsa_sender_fault_subcode(soap, code, "The [action] cannot be processed at the receiver.", soap->action); case SOAP_WSA(EndpointUnavailable): return soap_wsa_receiver_fault_subcode(soap, code, "The endpoint is unable to process the message at this time.", NULL); default: break; } return SOAP_FAULT; } #endif /******************************************************************************\ * * Plugin registry functions * \******************************************************************************/ /** @fn int soap_wsa(struct soap *soap, struct soap_plugin *p, void *arg) @brief Plugin registry function, used with soap_register_plugin and soap_register_plugin_arg. @param soap context @param[in,out] p plugin created in registry @param[in] arg passed from soap_register_plugin_arg @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsa(struct soap *soap, struct soap_plugin *p, void *arg) { (void)arg; DBGFUN("soap_wsa"); p->id = soap_wsa_id; p->data = (void*)SOAP_MALLOC(soap, sizeof(struct soap_wsa_data)); p->fcopy = NULL; p->fdelete = soap_wsa_delete; if (!p->data) return SOAP_EOM; if (soap_wsa_init(soap, (struct soap_wsa_data*)p->data)) { SOAP_FREE(soap, p->data); return SOAP_EOM; } return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsa_init(struct soap *soap, struct soap_wsa_data *data) @brief Initializes plugin data. @param soap context @param[in,out] data plugin data @return SOAP_OK */ static int soap_wsa_init(struct soap *soap, struct soap_wsa_data *data) { DBGFUN("soap_wsa_init"); data->fheader = soap->fheader; data->fseterror = soap->fseterror; soap->fheader = soap_wsa_header; soap->fseterror = soap_wsa_set_error; data->fresponse = NULL; data->fdisconnect = NULL; return SOAP_OK; } /******************************************************************************/ /** @fn void soap_wsa_delete(struct soap *soap, struct soap_plugin *p) @brief Deletes plugin data. @param soap context @param[in,out] p plugin @return SOAP_OK */ static void soap_wsa_delete(struct soap *soap, struct soap_plugin *p) { (void)soap; DBGFUN("soap_wsa_delete"); SOAP_FREE(soap, p->data); } /******************************************************************************\ * * Callbacks registered by plugin * \******************************************************************************/ /** @fn int soap_wsa_header(struct soap *soap) @brief Copies WS-Addressing action to SOAP action @param soap context @return SOAP_OK or fault This callback is invoked to copy the WS-Addressing action to the SOAP action before invoking the service operation. */ static int soap_wsa_header(struct soap *soap) { struct soap_wsa_data *data = (struct soap_wsa_data*)soap_lookup_plugin(soap, soap_wsa_id); DBGFUN("soap_wsa_header"); if (!data) return soap->error = SOAP_PLUGIN_ERROR; if (data->fheader && data->fheader(soap)) return soap->error; if (soap->header && soap->header->SOAP_WSA(Action)) { soap->action = soap->header->SOAP_WSA(Action); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "WSA action='%s'\n", soap->action)); } return SOAP_OK; } /******************************************************************************/ /** @fn void soap_wsa_set_error(struct soap *soap, const char **c, const char **s) @brief Copies WS-Addressing action to SOAP action @param soap context @param c fault code @param s fault string */ static void soap_wsa_set_error(struct soap *soap, const char **c, const char **s) { struct soap_wsa_data *data = (struct soap_wsa_data*)soap_lookup_plugin(soap, soap_wsa_id); DBGFUN2("soap_wsa_set_error", "code=%s", c && *c ? *c : "(null)", "string=%s", s && *s ? *s : "(null)"); if (!data) return; if (data->fseterror) data->fseterror(soap, c, s); if (soap->error == SOAP_NO_METHOD || (soap->error == SOAP_TAG_MISMATCH && soap->level == 2)) { #if defined(SOAP_WSA_2005) soap->error = soap_wsa_error(soap, SOAP_WSA(ActionNotSupported), soap->action); #elif defined(SOAP_WSA_2003) soap->error = soap_wsa_error(soap, "Action not supported"); #else soap->error = soap_wsa_error(soap, SOAP_WSA(ActionNotSupported)); #endif } } /******************************************************************************/ /** @fn int soap_wsa_response(struct soap *soap, int status, ULONG64 count) @brief Overrides the HTTP response operations to send an HTTP POST @param soap context @param status code @param count message length (if non-chunked) */ static int soap_wsa_response(struct soap *soap, int status, ULONG64 count) { struct soap_wsa_data *data = (struct soap_wsa_data*)soap_lookup_plugin(soap, soap_wsa_id); (void)status; DBGFUN2("soap_wsa_response", "status=%d", status, "count=%lu", (unsigned long)count); if (!data) return SOAP_PLUGIN_ERROR; soap->fresponse = data->fresponse; /* reset (HTTP response) */ data->fdisconnect = soap->fdisconnect; soap->fdisconnect = soap_wsa_disconnect; /* to accept HTTP 202 */ return soap->fpost(soap, soap_strdup(soap, soap->endpoint), soap->host, soap->port, soap->path, soap->action, count); } /******************************************************************************/ /** @fn int soap_wsa_disconnect(struct soap *soap) @brief Accepts HTTP 202 response upon HTTP POST response relay @param soap context */ static int soap_wsa_disconnect(struct soap *soap) { struct soap_wsa_data *data = (struct soap_wsa_data*)soap_lookup_plugin(soap, soap_wsa_id); DBGFUN("soap_wsa_disconnect"); if (!data) return SOAP_PLUGIN_ERROR; soap->fdisconnect = data->fdisconnect; /* reset */ return soap_recv_empty_response(soap); } /******************************************************************************\ * * Misc. * \******************************************************************************/ /** @fn int soap_wsa_alloc_header(struct soap *soap) @brief Adds SOAP Header if not present. @param soap context @return SOAP_OK */ static int soap_wsa_alloc_header(struct soap *soap) { if (soap->header) return SOAP_OK; soap_header(soap); if (soap->header) return SOAP_OK; return soap->error = SOAP_EOM; } /******************************************************************************/ #ifdef __cplusplus } #endif gsoap-2.8.91/gsoap/plugin/wsrmapi.c0000644000175000017500000057731413525245161016546 0ustar ellertellert/* wsrmapi.c WS-ReliableMessaging plugin. Implements the WS-RM 1.0 and 1.1 logic for import/wsrm.h import/wsrm5.h gSOAP XML Web services tools Copyright (C) 2000-2015, 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-2015, 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. 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 -------------------------------------------------------------------------------- */ /** @mainpage - @ref wsrm_0 documents the wsrm plugin for WS-ReliableMessaging support. Although wsrm uses the wsa plugin for WS-Addressing, there is no need to read the wsa plugin documentation because this part of the documentation is self-contained. WS-Addressing usage is mentioned when applicable. - @ref wsa_0 documents the wsa plugin for WS-Addressing (2003/2004/2005 standards) support. The wsa plugin is used by the wsrm plugin. - @ref mq_0 documents the mq plugin to support optional message queueing for WS-RM NoDiscard behavior. */ /** @page wsrm_0 The WS-ReliableMessaging plugin [TOC] @section wsrm_1 WS-ReliableMessaging Setup The material in this section relates to the WS-ReliableMessaging and WS-Addressing (2005) specifications. To use the wsrm plugin: -# Run `wsdl2h -b -t typemap.dat` on a WSDL of a service that requires WS-ReliableMessaging and WS-Addressing headers. The typemap.dat file included in the gSOAP package is used to recognize and translate header blocks. The `-b` option ensures that one-way response message operations are added for duplex communications that require a client-side callback service. -# Run `soapcpp2 -a` on the header file produced by wsdl2h. To enable reliable-messaging and addressing-based service operation selection, you MUST use soapcpp2 option `-a`. This allows the service to dispatch methods based on the WS-Addressing action information header value (when the wsa plugin is registered). -# (Re-)compile and link stdsoap2.c/pp or libgsoap, (dom.c/pp when needed), plugin/wsrmapi.c, plugin/wsaapi.c, custom/duration.c, and the soapcpp2- generated source files. -# Use the wsrm plugin API functions described below. The wsrm plugin uses the wsa plugin to implement the WS-Addressing 2005 operations. Both must be registered. The wsrm plugin API is self-contained. There is no need to use the wsa plugin API, unless WS-Addressing-specific headers must be added to messages. -# For WCF compatibility and interoperability, compile wsrmapi.c with compiler flag `-DWITH_WCF` for enhanced WCF compatibility and use compiler flag `-DWITH_WCF_SIM` to enable simulated WCF features channel instance and netrm BufferRemaining. An example wsrm client/server application can be found in samples/wsrm. A gSOAP service definitions header file with an `#import "wsrm.h"` to support WS-ReliableMessaging 1.1 or `#import "wsrm5.h"` to support WS-ReliableMessaging 1.0 (2005). The imports are automatically generated by wsdl2h for a set of WSDLs that use WS-ReliableMessaging as per WS-Policy. The wsdl2h-generated header file should be further processed by soapcpp2 to generate the binding code. The wsrmapi.h and wsrmapi.c implement the WS-ReliableMessaging API described in this document. A wsdl2h-generated service definitions header file might include the following imports, where the wsrm.h is mandatory to support WS-ReliableMessaging: @code #import "soap12.h" #import "wsrm.h" @endcode The wsrm.h header file is imported from import/wsrm.h by soapcpp2. The wsrm.h import can be manually added to enable WS-ReliableMessaging when needed. The gSOAP service definitions header file is processed with soapcpp2 to generate the client-side and/or server-side binding code. Note that the wsrm.h and the WS-ReliableMessaging-dependent wsrx.h and wsa5.h header files are located in the import directory of the gSOAP package. These files define the WS-ReliableMessaging and WS-Addressing information header elements and types. The wsrx.h header file defines the WS-ReliableMessaging CreateSequence, CloseSequence, and TerminateSequence operations, as well as an one-way SequenceAcknowledgement operation to accept acknowledgements. The soap12.h header file enables SOAP 1.2 messaging. For developers working on protocols: the WS-ReliableMessaging header blocks in wsrm.h were generated from the WS-ReliableMessaging schema with the wsdl2h tool and WS/WS-typemap.dat as follows: wsdl2h -cgyex -o wsrm.h -t WS/WS-typemap.dat WS/WS-ReliableMessaging.xsd This step is not needed to use the wsrm plugin. @section wsrm_2 WS-ReliableMessaging Information Header Bindings To associate WS-ReliableMessaging and WS-Addressing information headers with service operations, the SOAP Header struct `SOAP_ENV__Header` must have been declared and contain the necessary header blocks to be transported with SOAP messages. The `SOAP_ENV__Header` for WS-ReliableMessaging and WS-Addressing is predefined in wsrm.h and imported into the gSOAP service definitions header file (this is automatically generated by wsdl2h). For each service operation in the gSOAP service definitions header file that uses WS-ReliableMessaging and/or WS-Addressing method-header-part directives are used. For example, the following gSOAP service definitions header file illustrates a typical import and service operation definition of operation 'example' in service namespace 'ns': @code #import "wsrm.h" //gsoap ns service method-header-part: example wsa5__MessageID //gsoap ns service method-header-part: example wsa5__RelatesTo //gsoap ns service method-header-part: example wsa5__From //gsoap ns service method-header-part: example wsa5__ReplyTo //gsoap ns service method-header-part: example wsa5__FaultTo //gsoap ns service method-header-part: example wsa5__To //gsoap ns service method-header-part: example wsa5__Action //gsoap ns service method-header-part: example wsrm__Sequence //gsoap ns service method-header-part: example wsrm__AckRequested //gsoap ns service method-header-part: example wsrm__SequenceAcknowledgement //gsoap ns service method-action: example urn:example/examplePort/example //gsoap ns service method-output-action: example urn:example/examplePort/exampleResponse int ns__example(char *in, struct ns__exampleResponse { char *out; } *); @endcode The wsa5 information headers are defined in wsa5.h and imported by wsrm.h (both are located in the 'import' directory). Here, all of the WS-Addressing and WS-ReliableMessaging information headers are bound to the ns__example operation request and response messages. The method action directive is important for WS-Addressing, because WS-Addressing Action information headers must be included that are unique for each operation. The soapcpp2 option `-a` ensures that WS-Addressing Action header blocks (and HTTP Action headers) are processed at the receiving side, which means that the service dispatcher uses the Action together with the operation name to invoke the service operation at the destination. This also means that Action headers must be properly set by the client. Note: the `SOAP_ENV__Header` struct can be declared in multiple files. The soapcpp2 tool gathers all members of the structs into the "final" `SOAP_ENV__Header` struct used by the gSOAP engine and your application. This is convenient when service-specific header blocks are combined with WS-ReliableMessaging and WS-Addressing header blocks or when WS-Security header blocks are added by the WSSE plugin. @section wsrm_3 WS-ReliableMessaging Overview In this section a brief overview of WS-ReliableMessaging is given. For more details please refer to the WS-ReliableMessaging protocol or tutorials on the subject. The following introduces the basic concepts of WS-ReliableMessaging from a practical point of view. WS-ReliableMessaging is useful to improve the reliability of one-way asynchronous messaging, for unreliable data gram messaging (SOAP-over-UDP), or to improve reliable delivery of responses relayed to other destinations, such as response messages that are relayed to destinations indicated by the WS-Addressing ReplyTo header. The protocol is also useful when multiple sources are sending messages that arrive out of order or must be flagged as an incomplete message collection when messages are missing as defined by the notion of a collection of related messages. Messages delivered out-of-order are not internally reordered automatically. The application logic should be designed to be robust to out-of-order delivery effects, for example by using a vector to collect the data elements received before the data is processed. Alternatively, the server-side `soap_wsrm_check_and_wait` calls can be used to let the current thread wait until preceding messages have been received and processed (by other threads). For single-thread processing with keep-alive, this will cause a performance bottleneck unless the message queue plugin is used. The message queue plugin (mq.c) provides an approach to buffer inbound messages for in-order processing. WS-ReliableMessaging is not essential to improve the reliability of request-response message exchanges between two parties over HTTP, since a successful delivery of a request message can be inferred from the fact that a response was received for the request sent. WS-ReliableMessaging "protects" message sequences, i.e. a collection of related messages. A WS-ReliableMessaging message sequence is created after which the sequence of messages is sent. The sequence is closed and terminated by the client after the last message. Either the message sequence is complete or not, and the resulting action to discard the incomplete message sequence or not depends on the chosen behavior. Duplicate messages (e.g. resulting from resends) are always discarded. To create a new sequence, a client (WS-RM source) requests from the server (WS-RM destination) a unique (new) message sequence identification. The server responds with the identification to be used as well as other details, such as the expiration time of the sequence and the behavior implemented when a sequence was received incomplete: - NoDiscard means that the sequence of messages is not discarded by the destination server when one or more messages are missing (or unacknowledged). That is, no acknowledged messages in the sequence will be discarded. The WS-RM plugin will reorder messages either by ignoring any out-of-order messages (when calling `soap_wsrm_check`) or wait for out-of-order messages to arrive in a timeout window (when calling `soap_wsrm_check_and_wait`). - DiscardFollowingFirstGap means that the initial messages of the sequence are retained by the destination up to the first gap (a missing message) in the sequence. Does not allow for out-of-order message delivery. - DiscardEntireSequence means that the entire sequence of messages will be discarded when there are one or more gaps (messages are missing). With the WS-RM plugin, messages may be accepted out-of-order. When the client terminates the sequence, it first sends a sequence close request (or a last message with the older WS-RM 1.0) and then a sequence termination request to the destination server. The sequence close informs the server how many messages should have been received. The client can still resend messages after the close, but no new messages are supposed to be send. After the optional resends, the client requests termination of the sequence. The termination will be successful depending on the behavior when messages went missing, as was listed above. The ensure reliable delivery, the WS-ReliableMessaging protocol allows the client to resend messages. Message resends are desirable when messages are lost in transit. Since the client has limited information on delivery success (message delivery acknowledgments can get lost as well), the client may resend more messages than necessary. This could lead to message duplication. However, messages that were already received by the server are discarded. The client may request message delivery acknowledgements from the server. The server sends message receipt acknowledgements for all the messages it has received in the sequence back to the client, usually by piggy-backing them with the response of a subsequent message exchange. When the client is informed about successful delivery it reduces the number of resends the client will attempt. Messages in a sequence are uniquely identified by their enumeration number in the sequence. Messages may be transmitted out of order. A missing message number indicates a gap in the message sequence. Message receipt acknowledgements consist of ranges of message numbers. Acknowledgements are normally sent to the source to help identify which messages should be resend. With the WS-Addressing protocol, message responses and fault messages can be relayed to other destinations. The ReplyTo and FaultTo WS-Addressing header blocks are used for this purpose. The WS-ReliableMessaging protocol allows message acknowledgements to be relayed. The WS-ReliableMessaging AcksTo header block is used for this purpose. In all, there are four types of communicating peers that are visible to the source (the client): - The destination service. The WS-ReliableMessaging sequence is essentially controlled by this service. When a message is sent by the source to the destination service (over HTTP, TCP, or UDP), the WS-Addressing To information header may contain the endpoint address. The destination service normally returns message responses back to the client (HTTP request-response) or in duplex mode with one-way messages. - Optionally, one of more ReplyTo destination services that accept response messages from the destination service. Rather than sending responses back to the client, the destination service relays them to another service. The WS-Addressing ReplyTo information header is used by the client to indicate the response relay target. - Optionally, one or more FaultTo destination services that accept SOAP fault messages from the destination service. Rather than sending SOAP Faults back to the client, the destination service relays them to another service. The WS-Addressing FaultTo information header is used by the client to indicate the fault relay target. - Optionally, one AcksTo destination service that accept WS-ReliableMessaging acknowledgements. Rather than sending acknowledgements piggy-backed with response messages back to the client, the destination service relays them to another service. The WS-ReliableMessaging AcksTo information header is used by the client when the sequence is created to indicate the acknowledgements relay target. The AcksTo cannot be changed after sequence creation to termination. The destination service normally serves as ReplyTo, FaultTo, and AcksTo service, which is the default scenario with request-response message exchanges. Replies, faults, and acknowledgements can also be asynchroniously transmitted in duplex mode. In that case, the WS-RM source client acts as a callback service to accept messages on a port. The practical aspects of message sequence creation, the message exchanges, the message relays, and sequence close/termination are presented for the client side first and then for each of the four types of destination servers. @section wsrm_4 Client-side Usage @subsection wsrm_4_1 Creating, Closing, and Terminating Message Sequences A sequence is created, closed, terminated, and cleaned-up on the client side as follows, using a 'soap' context struct (use one 'soap' context per thread): @code struct soap *soap = soap_new(); // Note: can use C++ proxy instead of 'soap' soap_register_plugin(soap, soap_wsa); soap_register_plugin(soap, soap_wsrm); const char *destination = "..."; // WS-RM destination server address const char *source = NULL; // WS-RM source (NULL means current) ULONG64 expires = 10000; // 10000 ms to expire (10 seconds) const char *id = NULL; // id = NULL: generate a temp sequence ID const char *opt_msg_id = NULL; // WS-Addressing message ID (optional) soap_wsrm_sequence_handle seq; // a local handle to the sequence state // Step 1: create a sequence if (soap_wsrm_create_offer(soap, destination, source, id, expires, NoDiscard, opt_msg_id, &seq)) { soap_wsrm_seq_free(soap, seq); ... // error creating sequence } // Step 2: exchange messages with WS-RM destination, request acks, receive acks, issue resends (see later) ... // Step 3: optionally close first before terminating if (soap_wsrm_close(soap, seq, NULL)) { soap_wsrm_seq_free(soap, seq); ... // error closing sequence } // Step 4: optionally resend messages before terminating if (soap_wsrm_nack(seq)) // any non-acks for messages sent? soap_wsrm_resend(soap, seq, 0, 0); // resend all non-acked messages // Step 5: terminate if (soap_wsrm_terminate(soap, seq, NULL)) { soap_wsrm_seq_free(soap, seq); ... // error creating sequence } // Step 6: cleanup soap_wsrm_seq_free(soap, seq); @endcode For duplex communication, the responses are sent to the WS-RM source's port, to which we need to listen via a callback service. There are two ways to do so, by polling or by running a separate threat that accepts responses. In the code below we use a polling approach to process responses sent asynchronously to the WS-RM source: @code struct soap *soap = soap_new(); // Note: can use C++ proxy instead of 'soap' soap_register_plugin(soap, soap_wsa); soap_register_plugin(soap, soap_wsrm); const char *destination = "..."; // WS-RM destination server address const char *source = "..."; // WS-RM source address destination sends to int source_port = ...; // port of WS-RM source address ULONG64 expires = 10000; // 10000 ms to expire (10 seconds) const char *id = NULL; // id = NULL: generate a temp sequence ID const char *opt_msg_id = NULL; // WS-Addressing message ID (optional) int retry; soap_wsrm_sequence_handle seq; // a local handle to the sequence state struct soap *callback = soap_new(); // callback for polling // Step 1: create a WS-RM source port binding for the callback to poll messages if (!soap_valid_socket(soap_bind(callback, NULL, source_port, 100))) ... // error // Step 2: create a sequence if (soap_wsrm_create_offer(soap, destination, source, id, expires, NoDiscard, opt_msg_id, &seq)) { if (soap->error != 202) // Error != HTTP Accepted { soap_wsrm_seq_free(soap, seq); ... // error creating sequence } } // poll 10 times for 1 second until the sequence created response received for (retry = 10; retry && !soap_wsrm_seq_created(soap, seq); retry--) if (callback_poll(callback, 1)) // 1 second poll ... // error if (!retry) ... // error // Step 3: exchange messages with WS-RM destination, request acks, receive acks, issue resends, and poll (see later) ... // Step 4: optionally close first before terminating if (soap_wsrm_close(soap, seq, NULL)) { if (soap->error != 202) // Error != HTTP Accepted { soap_wsrm_seq_free(soap, seq); ... // error closing sequence } } if (callback_poll(callback, -500000)) // 500 ms poll ... // error // Step 5: optionally resend messages before terminating if (soap_wsrm_nack(seq)) // any nacks? { soap_wsrm_resend(soap, seq, 0, 0); // resend all non-acked messages if (callback_poll(callback, -100000)) // 100 ms poll ... // error } // Step 6: terminate if (soap_wsrm_terminate(soap, seq, NULL)) { if (soap->error != 202) // Error != HTTP Accepted { soap_wsrm_seq_free(soap, seq); ... // error creating sequence } } // only needed with WS-RM 1.1 to accept terminate response if (callback_poll(callback, -500000)) // 500 ms poll ... // error // Step 7: cleanup soap_wsrm_seq_free(soap, seq); @endcode The polling operation can be implemented as follows: @code int callback_poll(struct soap *soap, int timeout) { int poll = 5; // 5 poll cycles times max, ensures make progress soap->accept_timeout = timeout; // polling timout soap->recv_timeout = timeout; soap->send_timeout = soap->recv_timeout = 1; // 1 sec while (poll-- && soap_valid_socket(soap_accept(soap))) { soap_serve(soap); soap_destroy(soap); soap_end(soap); } if (soap->error == SOAP_STOP || soap->error == SOAP_EOF) // timed out return soap->error = SOAP_OK; return soap->error; } @endcode In addition, callback service operations must be defined to handle faults and, when applicable, one-way message responses sent by the destination. Fault messages are accepted by the callback and processed by the service operation that can be customized to your needs: @code int SOAP_ENV__Fault(struct soap *soap, _QName faultcode, // SOAP 1.1 char *faultstring, // SOAP 1.1 char *faultactor, // SOAP 1.1 struct SOAP_ENV__Detail *detail, // SOAP 1.1 struct SOAP_ENV__Code *Code, // SOAP 1.2 struct SOAP_ENV__Reason *Reason, // SOAP 1.2 char *Node, // SOAP 1.2 char *Role, // SOAP 1.2 struct SOAP_ENV__Detail *Detail // SOAP 1.2 ) { soap_send_empty_response(soap, 202); if (!detail) detail = Detail; if (detail && detail->__type == SOAP_TYPE__wsrm__Identifier) { // the sequence id is in the Fault Detail __type and fault members char *id = (char*)detail->fault; // we opt to treat all faults fatal, so let's terminate the sequence soap_wsrm_sequence_handle seq = soap_wsrm_seq_lookup_id(soap, id); if (seq) { soap_wsrm_error(soap, seq, wsrm__SequenceTerminated); soap_wsrm_seq_release(soap, seq); return soap->error; } } return SOAP_OK; } @endcode This cleanup of memory resources may be performed at any time in the sequence of message exchange or afterwards when desired. The sequence state is maintained independent of these cleanup operations. A graceful sequence termination may fail when the delivery of a sequence of messages is incomplete or when the lifetime of the sequence expired (the hard limit on the lifetime is `SOAP_WSRM_MAX_SEC_TO_EXPIRE`, this macro can be changed). The WS-RM destination determines the failure based on the final sequence state and the sequence behavior. The behavior is set to NoDiscard by default, which means that the sequence is not discarded when transmission gaps appeared in the messages and the sequence is incomplete. The desired behavior can be specified with a sequence creation offer as explained in the next section. If the source ReplyTo and AcksTo addresses differ in your project, then use the following: @code const char *destination = "..."; // WS-RM destination server address const char *replyto = NULL; // WS-RM ReplyTo const char *acksto = NULL; // WS-RM AckstTo ULONG64 expires = 10000; // 10000 ms to expire (10 seconds) const char *id = NULL; // id = NULL: generate a temp sequence ID const char *opt_msg_id = NULL; // WS-Addressing message ID (optional) if (soap_wsrm_create_offer_acksto(soap, destination, replyto, acksto, id, expires, DiscardEntireSequence, opt_msg_id, &seq))) ... // error @endcode Expiration times should not be infinite, because sequences are kept in memory until expired even when the sequences are closed and terminated. This permits the detection of duplicate sequences. The limit on the lifetime is `SOAP_WSRM_MAX_SEC_TO_EXPIRE`. This macro can be changed. @subsection wsrm_4_2 Creating a Sequence without an Offer To enable a destination server to produce a reliable message response sequence, you need to create a sequence with an offer. Otherwise, response messages are not tracked and delivery is not verified. A sequence of two-way message exchanges should use the offer mechanism. If all messages are one-way from source to destination then the sequence offer mechanism is not needed. A sequence can be created without an offer as follows: @code const char *destination = "..."; // WS-RM destination server address const char *source = NULL; // WS-RM source (NULL means current) ULONG64 expires = 10000; // 10000 ms to expire (10 seconds) const char *opt_msg_id = NULL; // WS-Addressing message ID (optional) if (soap_wsrm_create(soap, destination, source, expires, DiscardEntireSequence, opt_msg_id, &seq)) ... // error @endcode Expiration times should not be infinite, because sequences are kept in memory until expired even when the sequences are closed and terminated. This permits the detection of duplicate sequences. The limit on the lifetime is `SOAP_WSRM_MAX_SEC_TO_EXPIRE`. This macro can be changed. @subsection wsrm_4_3 Exchanging Messages in a Sequence Each message exchange with the WS-RM destination should be preceded with a `soap_wsrm_request` or `soap_wsrm_request_acks` call to set the required WS-RM information headers for the message send operation or request-response exchange. For example, consider the 'example' operation defined previously and suppose we invoke the 'example' operation in a sequence (after creation and before closing): @code const char *exampleRequestAction = "urn:example/examplePort/example"; const char *exampleRequestMessageID = NULL; // optional WS-Addressing ID struct ns__exampleResponse response; const char *endpoint = soap_wsrm_to(seq); if (endpoint) { if (soap_wsrm_request(soap, seq, exampleRequestMessageID, exampleRequestAction)) ... // error: out of memory if (soap_call_ns__example(soap, endpoint, exampleRequestAction, &response)) soap_print_fault(soap, stderr); // an error occurred else ... // process the response } @endcode To generate WS-Addressing message IDs, use `soap_wsa_rand_uuid`, for example: @code const char *exampleRequestAction = "urn:example/examplePort/example"; if (soap_wsrm_request(soap, seq, soap_wsa_rand_uuid(soap), exampleRequestAction)) ... // error: out of memory @endcode The `soap_wsrm_request` takes the sequence handle and optional WS-Addressing message ID and mandatory WS-Addressing action string (this string must match the method-action defined in the gSOAP service definition header file). It produces a WS-RM header block with the message number incremented by one for the invocation. Messages are enumerated from one and included in the WS-RM header to allow the destination to determine which messages were received in the sequence (for acknowledgements) and to ignore duplicate messages. The remote invocation `soap_call_ns__example` uses the endpoint provided by `soap_wsrm_to(seq)` for the WS-RM destination address, which was set by `soap_wsrm_create` or by `soap_wsrm_create_offer`. Because the address may change due to a redirect, we encourage the use of `soap_wsrm_to` for the WS-RM destination address. When used at the server side, `soap_wsrm_to(seq)` is the ReplyTo address provided by the client's request message, which may be none (NULL) for a one-way call. Therefore, it is wise to check the return value of `soap_wsrm_to(seq)`. A C++ proxy object (generated by soapcpp2 option `-j`) that invokes a service operation should reset the destination address explicitly by setting the `soap_endpoint` member string before each operation invocation. @subsection wsrm_4_4 Exchanging Messages with Acknowledgements in a Sequence Before sending a message, a WS-RM request should be issued using `soap_wsrm_request_acks`. This informs the WS-RM destination to return message delivery acknowledgements back to the sender (piggy-backed in the header of the response message), unless the AcksTo is set to target an acknowledgement service endpoint in which case the acknowledgements are sent to. @code if (soap_wsrm_request_acks(soap, seq, opt_msg_id, exampleRequestAction)) ... // error if (soap_call_ns__example(soap, endpoint, exampleRequestAction, &response)) if (soap->error != 202) // Error != HTTP Accepted ... // error @endcode When duplex messaging is used via a callback, a polling operation will be needed afterwards: @code if (callback_poll(callback, -500000)) // 500 ms poll ... // error @endcode The `soap_wsrm_close` returns acknowledgements automatically, so requesting intermediate acknowledgements is not required to issue a final `soap_wsrm_resend` to resend all non-acknowledged messages, e.g. after `soap_wsrm_close`. See also below. @subsection wsrm_4_5 Resending Non-Acknowledged Messages All non-acknowledged messages in a sequence that were previously sent can be resend (from the internal sender-side cache of sent messages in a sequence) as follows: @code soap_wsrm_resend(soap, seq, 0, 0); @endcode To resend a range of non-acknowledged messages, say between 3 and 7, use: @code soap_wsrm_resend(soap, seq, 3, 7); @endcode Or all messages after message number 3: @code soap_wsrm_resend(soap, seq, 3, 0); @endcode Resends should be used with care, since in the worst case when no acknowledgements have been received all messages up to the last will be resend (and ignored by the WS-RM destination when a message is received more than once). Note that when an AcksTo destination service address was set with `soap_wsrm_create` or `soap_wsrm_create_offer`, then the acknowledgements will not be returned to the sender (client). In this case message resends are performed for all messages sent, since these have not been acknowledged. It is permitted to issue resends between creation and termination of a sequence, including after a sequence close (as long as no new messages are sent after close). The sequence close provides acknowledgement information to limit the number of messages that need to be resend. To find out if none, some, or all messages have been acknowledged, use: @code ULONG64 nack = soap_wsrm_nack(seq); if (nack == 0) ... // all sent messages have been acknowledged else if (nack == soap_wsrm_num(seq)) ... // none of the sent messages have been acknowledged else ... // some sent messages have been acknowledged @endcode @subsection wsrm_4_6 Relaying Response and Fault Messages with WS-Addressing WS-ReliableMessaging is important when messages are relayed, and especially when relayed over UDP. The ReplyTo and FaultTo destination service endpoints can be specified for each message as follows: @code const char *replyto = source; // endpoint of WS-RM source const char *faultto = "..."; // endpoint of fault processing service const char *endpoint = soap_wsrm_to(seq); if (endpoint) { if (soap_wsrm_request_acks(soap, seq, NULL, exampleRequestAction) || soap_wsa_add_ReplyTo(soap, replyto) || soap_wsa_add_FaultTo(soap, faultto)) ... // error: out of memory if (soap_call_ns__example(soap, endpoint, exampleRequestAction, &response)) { if (soap->error != 202) ... // error } } @endcode An optional source address information header can be added with `soap_wsa_add_From`: @code const char *from = "..."; // endpoint of the client (could be any URI) if (soap_wsrm_request_acks(soap, seq, NULL, exampleRequestAction) || soap_wsa_add_From(soap, from)) ... // error: out of memory @endcode Adding a From address is optional and usually not required with WS-ReliableMessaging. @subsection wsrm_4_7 Using Retry Loops to Improve Robustness of Message Sends A potential problem with reliable message delivery with resends can fail when the initial send was not successful and message ordering is relevant. Resending will lead to an unordered message delivery. Also, the wsrm plugin records all sent messages when the send operation was not interrupted. A problem occurs when the message cache contains incomplete messages and these messages cannot be resend. This section presents an additional mechanism to ensure messages are cached properly for automatic retransmission. Besides network failues, a request-response message exchange can also appear to fail due to a non `SOAP_OK` returned, such as a benign "HTTP 202 Accept" To distinguish fatal send errors from errors returned by the peer, the `soap_wsrm_check_retry` function can be used as follows to only retry the message exchange (or send) when needed: @code const char *endpoint = NULL; if (soap_wsrm_request_acks(soap, seq, NULL, exampleRequestAction)) ... // error while ((endpoint = soap_wsrm_to(seq)) != NULL && soap_call_ns__example(soap, endpoint, exampleRequestAction, &response)) { if (soap->error == 202) { // request was accepted by destination (HTTP 202 Accept) break; } else if (soap->error == SOAP_NO_TAG) // empty { // request was accepted by destination, acks are returned break; } soap_print_fault(soap, stderr); if (soap_wsrm_check_retry(soap, seq)) break; // do not continue sleep(1); // wait a second to give network a chance to recover } if (soap->error == SOAP_OK) ... // response can be processed @endcode Note that the `soap_wsrm_request` is only invoked once in the above to increment the message enumeration. The loop retries transmissions a maximum of `SOAP_WSRM_MAX_RETRIES` iterations before giving up. Note that this mechanism does not replace acknowledgements for delivery. Delivery acknowledgements are verified with `soap_wsrm_nack`. @subsection wsrm_4_8 Example Client The following code shows an example WS-RM client fragment that combines the concepts introduced in the previous sections for a request-response scenario: @code struct soap *soap = soap_new(); // Note: can use C++ proxy instead of 'soap' soap_register_plugin(soap, soap_wsa); soap_register_plugin(soap, soap_wsrm); struct ns__exampleResponse response; const char *exampleRequestAction = "urn:example/examplePort/example"; const char *destination = "..."; // WS-RM destination server address const char *source = NULL; // WS-RM source (current) ULONG64 expires = 60000; // 1 minute sequence lifetime soap_wsrm_sequence_handle seq; if (soap_wsrm_create_offer(soap, destination, source, NULL, expires, DiscardEntireSequence, NULL, &seq)) { soap_wsrm_seq_free(soap, seq); ... // error creating sequence } if (soap_wsrm_request_acks(soap, seq, NULL, exampleRequestAction)) ... // error while (soap_call_ns__example(soap, destination, exampleRequestAction, &response)) { if (soap->error == 202) { // request was accepted by destination (HTTP 202 Accept) break; } else if (soap->error == SOAP_NO_TAG) // empty { // request was accepted by destination, acks are returned break; } soap_print_fault(soap, stderr); if (soap_wsrm_check_retry(soap, seq)) break; // do not continue sleep(1); // wait a second to give network a chance to recover } if (soap->error == SOAP_OK) ... // response can be processed if (soap_wsrm_close(soap, seq, NULL)) { soap_wsrm_seq_free(soap, seq); ... // error closing sequence } soap_wsrm_resend(soap, seq, 0, 0); // resend non-acked messages if (soap_wsrm_terminate(soap, seq, NULL)) { soap_wsrm_seq_free(soap, seq); ... // error } soap_wsrm_seq_free(soap, seq); soap_destroy(soap); soap_end(soap); soap_free(soap); @endcode A duplex mode client that accepts responses via a callback: @code struct soap *soap = soap_new(); // Note: can use C++ proxy instead of 'soap' soap_register_plugin(soap, soap_wsa); soap_register_plugin(soap, soap_wsrm); struct ns__exampleResponse response; const char *exampleRequestAction = "urn:example/examplePort/example"; const char *destination = "..."; // WS-RM destination server address const char *source = "..."; // WS-RM source address destination sends to int source_port = ...; // port of WS-RM source address ULONG64 expires = 60000; // 1 minute sequence lifetime int retry; soap_wsrm_sequence_handle seq; struct soap *callback = soap_new(); // callback for polling // WS-RM source port binding for the callback to poll messages if (!soap_valid_socket(soap_bind(callback, NULL, source_port, 100))) ... // error if (soap_wsrm_create_offer(soap, destination, source, NULL, expires, DiscardEntireSequence, NULL, &seq)) { if (soap->error != 202) { soap_wsrm_seq_free(soap, seq); ... // error creating sequence } } // poll 10 times for 1 second until the sequence created response received for (retry = 10; retry && !soap_wsrm_seq_created(soap, seq); retry--) if (callback_poll(callback, 1)) // 1 second poll ... // error if (!retry) ... // error if (soap_wsrm_request_acks(soap, seq, NULL, exampleRequestAction)) ... // error while (soap_call_ns__example(soap, destination, exampleRequestAction, &response)) { if (soap->error == 202) { // request was accepted by destination (HTTP 202 Accept) break; } else if (soap->error == SOAP_NO_TAG) // empty { // request was accepted by destination, acks are returned break; } if (soap_wsrm_check_retry(soap, seq)) break; // do not continue sleep(1); // wait a second to give network a chance to recover } if (callback_poll(callback, -500000)) // 500 ms poll ... // error if (soap_wsrm_close(soap, seq, NULL)) { if (soap->error != 202) { soap_wsrm_seq_free(soap, seq); ... // error closing sequence } } // Resend messages marked as non-acked (as an option) for (retry = 2; retry && soap_wsrm_nack(seq); retry--) { soap_wsrm_resend(soap, seq, 0, 0); // 0 0 means full range of msg nums if (callback_poll(callback, -500000)) // 500 ms poll ... // error } if (soap_wsrm_terminate(soap, seq, NULL)) { if (soap->error != 202) { soap_wsrm_seq_free(soap, seq); ... // error closing sequence } } if (callback_poll(callback, -500000)) // 500 ms poll ... // error soap_wsrm_seq_free(soap, seq); soap_destroy(callback); soap_end(callback); soap_free(callback); soap_destroy(soap); soap_end(soap); soap_free(soap); @endcode @section wsrm_5 Server-side Usage To set up a WS-ReliableMessaging compliant server, register the wsa and wsrm plugins with the soap context (or with the C++ proxy object generated by soapcpp2 option `-j`): @code struct soap *soap = soap_new(); // Note: use C++ proxy->soap instead of 'soap' soap_register_plugin(soap, soap_wsa); soap_register_plugin(soap, soap_wsrm); @endcode The following subsections detail the differences between the types of WS-RM destination services. @subsection wsrm_5_1 Setting up a WS-RM Destination Service For duplex communications, it is advisable to send acknowledgements to the peer, which are normally piggy-backed on messages to the peer. If no messages are sent to the peer, explicit acknowledgements can be sent: @code if (soap_wsrm_acknowledgement(soap, seq, NULL)) ... // error @endcode To sent acknowledgements to all peers with open sequences, use: @code int timeout = -10000; // 10 ms if (soap_wsrm_pulse(soap, timeout)) ... // error @endcode where timeout is in seconds (pos value) or microseconds (neg value). Depending on the message exchange scenarios, it may be advisable to have the server send periodic acknowledgement updates as follows: @code soap->accept_timeout = -200000; // 200ms intervals for (;;) { // server loop, accept next message if (!soap_valid_socket(accept())) { // error or timeout? if (soap->errnum) { soap_stream_fault(std::cerr); exit(1); // may want to exit, but trying to continue is also possible } else { // timeout occurs after 200ms // send acks to peers (optional), take 10 ms per message soap_wsrm_pulse(soap, -10000); // 10 ms // sleep(1); // must do this with UDP: since accept() returns immediately } } else { ... // serve } @endcode Each service operation that supports WS-ReliableMessaging and WS-Addressing should use the `soap_wsrm_check`, `soap_wsrm_sender_fault`, `soap_wsrm_receiver_fault`, and `soap_wsrm_reply` functions as follows: @code int ns__example(struct soap *soap, char *in, struct ns__exampleResponse *response) { const char *ResponseAction = "urn:example/examplePort/exampleResponse"; // fatal service operation-specific errors (before soap_wsrm_check()) if (!database) // suppose we need a database, if there is none terminate return soap_wsrm_receiver_fault(soap, "No database!", NULL); // check for WS-RM/WSA and set WS-RM/WSA return headers and protocol errors // note: use soap_wsrm_check_and_wait() with NoDiscard behavior to queue out-of-order messages if (soap_wsrm_check(soap)) return soap->error; // check for non-fatal service operation-specific errors if (!in || !*in) // sender did not put anything in the 'in' string: fault return soap_wsrm_sender_fault(soap, "No string content!", NULL); response->out = ... // return normally, relaying the response to the ReplyTo service when needed return soap_wsrm_reply(soap, NULL, ResponseAction); } @endcode An error produced by `soap_wsrm_sender_fault` or `soap_wsrm_receiver_fault` before `soap_wsrm_check` is considered fatal, it will terminate the sequence and the sender (client) will not be able to continue the sequence transmissions. While the faults preduced after `soap_wsrm_check` allow the sequence to continue. @subsection wsrm_5_2 Handling Duplex Callback Service Operations To set up a callback to accept responses in a duplex scenario, we set up the server in the same way as the destination server. Service opertions should not use `soap_wsrm_reply`. Because response messages are sent (as if these were request messages), the service must define the appropriate one-way operations and gSOAP service definitions bindings. For example, the one-way response message of the ns__example operation is defined as follows in the gSOAP service definitions header file: @code //gsoap ns service method-header-part: exampleResponse wsa5__MessageID //gsoap ns service method-header-part: exampleResponse wsa5__RelatesTo //gsoap ns service method-header-part: exampleResponse wsa5__From //gsoap ns service method-header-part: exampleResponse wsa5__ReplyTo //gsoap ns service method-header-part: exampleResponse wsa5__FaultTo //gsoap ns service method-header-part: exampleResponse wsa5__To //gsoap ns service method-header-part: exampleResponse wsa5__Action //gsoap ns service method-header-part: exampleResponse wsrm__SequenceAcknowledgement //gsoap ns service method-action: exampleResponse urn:example/examplePort/exampleResponse int ns__exampleResponse(char *out, void); @endcode The one-way response service operations are automatically generated with wsdl2h option `-b`. Note that when these definitions are combined with the previous definition for `ns__example`, there is no need to define the `ns__ExampleResponse` struct any longer as this is implied by the `ns__exampleResponse` function content. The server operation implementation is for example: @code int ns__exampleResponse(struct soap *soap, char *out) { // check WS-RM/WSA headers and protocol errors and send 202 Accept back to peer // note: use soap_wsrm_check_send_empty_response_and_wait() with NoDiscard behavior to queue out-of-order messages if (soap_wsrm_check_send_empty_response(soap)) return soap->error; ... // process the 'out' content, invoke callback etc return SOAP_OK; } @endcode @section wsrm_6 WS-ReliableMessaging over HTTPS with Basic Authentication The HTTPS client and server are set up as shown in the gSOAP documentation and examples. There are no additional API calls needed to support WS-RM with HTTPS. Note that the WS-RM destination service may also relay messages to other HTTPS services, thus the WS-RM destination acts as a receiver (server) and sender (client). Therefore, the WS-RM destination server's SSL context should be set to authenticate the other servers: @code if (soap_ssl_server_context(soap, SOAP_SSL_DEFAULT, "server.pem", // keyfile (server) "password", // password to read the key file (server) "cacert.pem", // cacert file to store trusted certificates (client) NULL, // optional capath NULL, // DH file name or DH param key len bits, NULL: RSA NULL, // file with random data to seed randomness argv[1] // unique server identification for SSL session cache )) { soap_print_fault(soap, stderr); ... // handle error } @endcode Here, the cacert.pem file contains certificates to authenticate the ReplyTo, FaultTo, and AcksTo services when HTTPS is used. The client side sets up the SSL context with the `soap_ssl_client_context` as instructed in the documentation and by the examples. Multi-threaded HTTPS clients and servers must register mutex locks with OpenSSL To use Basic Authentication at the client side, set the userid and passwd values: @code soap->userid = "..."; // Basic Auth user id soap->passwd = "..."; // Basic Auth password if (soap_wsrm_request_acks(soap, seq, NULL, exampleRequestAction) ... // error: out of memory if (soap_call_ns__example(soap, endpoint, exampleRequestAction, &response)) { if (soap->error == 401) ... // authentication failed for the userid/passwd pair else ... // other error } @endcode At the server side add the authentication check to the service operation before `soap_wsrm_check` to terminate the sequence when an authentication failure occurs. For example: @code int ns__example(struct soap *soap, char *in, struct ns__exampleResponse *response) { if (!soap->userid || !soap->passwd || strcmp(soap->userid, "...") || strcmp(soap->passwd, "...")) { soap->authrealm = "..."; // optional to set HTTP WWW-Authenticate: Basic realm="..." return 401; // HTTP 401 Unauthorized } if (soap_wsrm_check(soap)) return soap->error; ... @endcode Here, we check only one userid-passwd pair though normally we could search for valid credentials in an authentication store. Note: never use Basic Authentication over HTTP because the password is sent in the clear. You must use HTTPS to encrypt the HTTP authentication information and message content. HTTP Digest Auth is preferred for this reason, because Digest Auth verifies the digest of a userid-passwd rather than require the password to be exchanged or stored in cleartext. @section wsrm_7 WS-ReliableMessaging over UDP with Timeouts The use of UDP is automatic at the client side using the "soap.udp://" protocol. Therefore, endpoints should use a "soap.udp://" URL to connect. (when using an already opened socket, the `SOAP_IO_UDP` flag must be used, see the documentation.) Note that UDP datagram messages should not exceed 8K, which is usually a size that UDP datagrams can support. To reduce the message size, we recommend compression (`-DWITH_GZIP` compile flag to enable ZLIB and use libgsoapssl.a or libgsoapssl++.a for OpenSSL and ZLIB compression combined). The code of an UDP-enabled server is identical to an HTTP/TCP server except that the `soap_accept` call is disabled and unnecessary. When message responses are not returned to the client, the client may block indefinitely when it expects a response. Therefore we recommend the use of send and receive timeouts: @code struct soap *soap = soap_new(); const char *destination = "soap.udp://..."; const char *source = NULL; ULONG64 expires = 60000; // 1 minute sequence lifetime soap->send_timeout = soap->recv_timeout = 1; // 1 second to timeout if (soap_wsrm_create_offer(soap, destination, source, NULL, expires, NoDiscard, NULL, &seq)) ... // an error occured if (soap_wsrm_request(soap, seq, NULL, exampleRequestAction)) ... // an error occured if (soap_call_ns__example(soap, ...)) { if (soap->error == SOAP_EOF && soap->errnum == 0) ... // a timeout occured else ... // an error occured } @endcode Note that the WS-Addressing ReplyTo and the use of NoReply do not return response message from the server. However, acknowledgements will be returned when acknowledgements were requested (unless acknowledgements are relayed with AcksTo). @code struct soap *soap = soap_new(); soap->send_timeout = soap->recv_timeout = 1; // 1 second to timeout const char *destination = "soap.udp://..."; const char *from = "..."; // some identifying URI const char *source = from; ULONG64 expires = 60000; // 1 minute sequence lifetime soap->send_timeout = soap->recv_timeout = 1; // 1 second to timeout if (soap_wsrm_create_offer(soap, destination, source, NULL, expires, NoDiscard, NULL, &seq)) ... // an error occured if (soap_wsrm_request_acks(soap, seq, NULL, exampleRequestAction) || soap_wsa_add_NoReply(soap) ... // an error occured if (soap_call_ns__example(soap, ...)) { if (soap->error == SOAP_EOF && soap->errnum == 0) ... // a timeout occured else if (soap->error == SOAP_NO_TAG) ... // ack was received and recorded else ... // an error occured } @endcode In this case an acknowledgement will be returned and the timeout reflects a possible network packet loss. @section wsrm_8 WS-ReliableMessaging and WS-Security WS-Security can be combined with WS-ReliableMessaging using the [WS-Security plugin](../../wsse/html/index.html). Both plugins must be registered at the client and server side. These APIs are independent. @section wsrm_9 The wsrm Plugin and C++ Proxy and Server Objects The WS-ReliableMessaging plugin is developed to support C and C++. To support C++ server objects generated with soapcpp2 option `-j` (or `-i`), run soapcpp2 again: soapcpp2 -A -pwsrx import/wsrx.h This generates wsrxClient.cpp and wsrxServer.cpp that are also needed with the WS-ReliableMessaging plugin and code. To dispatch the wsrm service operations when received: Suppose we have a myService server class generated by soapcpp2 option `-j`, which is used to process requests with the serve() member function (also generated): @code myService service; if (soap_invalid_socket(service.bind(NULL, port, 100))) ... // error for (;;) { if (!soap_valid_socket(service.accept())) { service.soap_stream_fault(std::cerr); exit(1); } if (soap_begin_serve(service.soap) == SOAP_OK) { if (service.dispatch() == SOAP_NO_METHOD) { if (soap_serve_request(service.soap) != SOAP_OK) { soap_send_fault(service.soap); service.soap_stream_fault(std::cerr); } } else if (service.soap->error) service.soap_stream_fault(std::cerr); } service.destroy(); } @endcode @section wsrm_10 Speed improvements with large number of sequences Compile wsrmapi.c with `-DSOAP_WSRM_FAST_LOOKUP` to speed up sequence lookups for a large number of concurrent message sequences or sequences with a long time to live. An internal hash table is used, which will grow to accommodate the total number of concurrent sequences. The hash table entries are reused but (temporary) empty entries are never deallocated to avoid allocation overhead, which means that leak detectors may complain about space not being freed. */ #include "wsrmapi.h" #ifdef _WRS_KERNEL #include "sysLib.h" #endif #ifdef __cplusplus extern "C" { #endif /** Plugin identification for plugin registry */ const char soap_wsrm_id[] = SOAP_WSRM_ID; /** Sequence session database */ static struct soap_wsrm_sequence *soap_wsrm_session = NULL; char soap_wsrm_idname[40] = ""; int soap_wsrm_idnum = 0; /** Sequence session database lock */ static MUTEX_TYPE soap_wsrm_session_lock = MUTEX_INITIALIZER; #ifdef SOAP_WSRM_FAST_LOOKUP #define SOAP_WSRM_IDHASH_BLK (8) struct soap_wsrm_hash_id { struct soap_wsrm_hash_id *next; struct soap_wsrm_sequence* seq[SOAP_WSRM_IDHASH_BLK]; }; static struct soap_wsrm_hash_id* soap_wsrm_hash_id[SOAP_IDHASH]; static struct soap_wsrm_hash_id* soap_wsrm_hash_acksid[SOAP_IDHASH]; #endif /******************************************************************************\ * * Static protos * \******************************************************************************/ static int soap_wsrm_init(struct soap *soap, struct soap_wsrm_data *data, void *arg); static int soap_wsrm_copy(struct soap *soap, struct soap_plugin *p, struct soap_plugin *q); static void soap_wsrm_delete(struct soap *soap, struct soap_plugin *p); static int soap_wsrm_send(struct soap *soap, const char *buf, size_t len); static int soap_wsrm_preparefinalrecv(struct soap *soap); static int soap_wsrm_disconnect(struct soap *soap); static int soap_wsrm_process_ack(struct soap *soap, struct _wsrm__SequenceAcknowledgement *ack); static int soap_wsrm_chk(struct soap *soap, int timeout, int flag); static int soap_wsrm_chk_acks(struct soap *soap); static int soap_wsrm_add_acks(struct soap *soap, struct soap_wsrm_sequence *seq, ULONG64 nack, int all, int piggy); static int soap_wsrm_set_ack(struct soap *soap, ULONG64 nack, struct soap_wsrm_sequence *seq, struct _wsrm__SequenceAcknowledgement *ack); #if 0 /* unused */ static int soap_wsrm_post(struct soap *soap, const char *endpoint, const char *host, int port, const char *path, const char *action, size_t count); #endif static int soap_wsrm_resend_seq(struct soap *soap, struct soap_wsrm_sequence *seq, int all, ULONG64 lower, ULONG64 upper); static const char *soap_wsrm_seq_newid(struct soap *soap); static void soap_wsrm_seq_insert_data(struct soap_wsrm_sequence *seq); static void soap_wsrm_seq_delete_data(struct soap_wsrm_sequence *seq); static struct soap_wsrm_sequence *soap_wsrm_seq_lookup_data(const char *id); static void soap_wsrm_seq_insert_ack(struct soap_wsrm_sequence *seq); static void soap_wsrm_seq_delete_ack(struct soap_wsrm_sequence *seq); static struct soap_wsrm_sequence *soap_wsrm_seq_lookup_ack(const char *id); static struct soap_wsrm_sequence *soap_wsrm_seq_insert(struct soap *soap); static int soap_wsrm_msg_append(struct soap *soap, struct soap_wsrm_data *data, const char *buf, size_t len); static int soap_wsrm_num_lookup(struct soap *soap, const struct soap_wsrm_sequence *seq, ULONG64 num); static int soap_wsrm_num_insert(struct soap *soap, struct soap_wsrm_sequence *seq, ULONG64 num); static int soap_wsrm_num_size(const struct soap_wsrm_sequence *seq); static void soap_wsrm_num_free(struct soap *soap, struct soap_wsrm_sequence *seq); static struct soap_wsrm_message *soap_wsrm_msg_new(struct soap *soap, struct soap_wsrm_sequence *seq, ULONG64 num); static void soap_wsrm_msg_free(struct soap *soap, struct soap_wsrm_message *p); /******************************************************************************\ * * Client-side WS-RM Operations * \******************************************************************************/ /** @fn int soap_wsrm_create(struct soap *soap, const char *to, const char *replyto, LONG64 expires, const char *wsa_id, soap_wsrm_sequence_handle *seq) @brief Creates a new sequence. Sequences are usually created by the sender (client) and confirmed by the receiver (server). The 'to' server address must be used for all messages of the sequence to be sent to the WS-RM destination server. Optionally the 'replyto' address can be given of the WS-RM source to reply to. A sequence ID is generated by the server upon success. @param soap context @param[in] to endpoint address of the WS-RM destination server (required) @param[in] replyto endpoint address of the WS-RM source to reply/ack to (optional) @param[in] expires max sequence duration (its lifetime) in ms (use 0 to offer infinite, subject to SOAP_WSRM_MAX_SEC_TO_EXPIRE or server policy) @param[in] wsa_id WS-Addressing message ID (optional, use NULL when omitted) @param[out] seq sequence handle is set @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_create(struct soap *soap, const char *to, const char *replyto, LONG64 expires, const char *wsa_id, soap_wsrm_sequence_handle *seq) { return soap_wsrm_create_offer(soap, to, replyto, "", expires, NoDiscard, wsa_id, seq); } /******************************************************************************/ /** @fn int soap_wsrm_create_offer(struct soap *soap, const char *to, const char *replyto, const char *id, LONG64 expires, enum wsrm__IncompleteSequenceBehaviorType behavior, const char *wsa_id, soap_wsrm_sequence_handle *seq) @brief Creates a new sequence by offering suggested WS-RM parameters to the WS-RM destination. Sequences are usually created by the sender (client) and confirmed by the receiver (server). The 'to' server address must be used for all messages of the sequence to be sent to the WS-RM destination server. Optionally the 'replyto' address can be given of the WS-RM source to reply to. A sequence ID is generated by the server upon success. @param soap context @param[in] to endpoint address of the WS-RM destination server (required) @param[in] replyto endpoint address of the WS-RM source to reply/ack to (optional) @param[in] id offered WS-RM sequence identifier (optional, generate with NULL) @param[in] expires max sequence duration (its lifetime) in ms (use 0 for infinite, subject to SOAP_WSRM_MAX_SEC_TO_EXPIRE or server policy) @param[in] behavior offered DiscardEntireSequence, DiscardFollowingFirstGap, or NoDiscard, which specifies the WS-RM destination's action when a sequence is closed/terminated when it is incomplete, and notifies the source when failed. @param[in] wsa_id WS-Addressing message ID (optional, use NULL when omitted) @param[out] seq sequence handle is set or NULL when response is asynchronously send and the sequence is initialized upon receipt of the create response. @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_create_offer(struct soap *soap, const char *to, const char *replyto, const char *id, LONG64 expires, enum wsrm__IncompleteSequenceBehaviorType behavior, const char *wsa_id, soap_wsrm_sequence_handle *seq) { return soap_wsrm_create_offer_acksto(soap, to, replyto, NULL, id, expires, behavior, wsa_id, seq); } /******************************************************************************/ /** @fn int soap_wsrm_create_offer_acksto(struct soap *soap, const char *to, const char *replyto, const char *acksto, const char *id, LONG64 expires, enum wsrm__IncompleteSequenceBehaviorType behavior, const char *wsa_id, soap_wsrm_sequence_handle *seq) @brief Creates a new sequence by offering suggested WS-RM parameters to the WS-RM destination. Sequences are usually created by the sender (client) and confirmed by the receiver (server). The 'to' server address must be used for all messages of the sequence to be sent to the WS-RM destination server. Optionally the 'replyto' address can be given of the WS-RM source to reply to and an 'acksto' address can be given for acknowledgement messages to be sent to (normally to the reply to). A sequence ID is generated by the server upon success. @param soap context @param[in] to endpoint address of the WS-RM destination server (required) @param[in] replyto endpoint address of the WS-RM source (optional) @param[in] acksto endpoint address for WS-RM acknowledgements (optional) (optional, use NULL when acks are piggy-backed on response messages to the source) @param[in] id offered WS-RM sequence identifier (optional, generate when NULL) @param[in] expires max sequence duration (its lifetime) in ms (use 0 for infinite, subject to SOAP_WSRM_MAX_SEC_TO_EXPIRE or server policy) @param[in] behavior offered DiscardEntireSequence, DiscardFollowingFirstGap, or NoDiscard, which specifies the WS-RM destination's action when a sequence is closed/terminated when it is incomplete, and notifies the source when failed. @param[in] wsa_id WS-Addressing message ID (optional, use NULL when omitted) @param[out] seq sequence handle is set or NULL when response is asynchronously send and the sequence is initialized upon receipt of the create response. @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_create_offer_acksto(struct soap *soap, const char *to, const char *replyto, const char *acksto, const char *id, LONG64 expires, enum wsrm__IncompleteSequenceBehaviorType behavior, const char *wsa_id, soap_wsrm_sequence_handle *seq) { char *s; size_t l; struct wsrm__CreateSequenceType req; struct wsrm__CreateSequenceResponseType res; struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); const char *action = SOAP_NAMESPACE_OF_wsrm"/CreateSequence"; DBGFUN3("soap_wsrm_create_offer", "id=%s", id ? id : "(null)", "to=%s", to ? to : "(null)", "acksto=%s", acksto ? acksto : "(null)"); *seq = NULL; if (!data) return soap->error = SOAP_PLUGIN_ERROR; soap_default_wsrm__CreateSequenceType(soap, &req); if (!to) to = soap_wsa_anonymousURI; if (!replyto) replyto = soap_wsa_anonymousURI; else if (!wsa_id) wsa_id = soap_wsa_rand_uuid(soap); if (soap_wsa_request(soap, wsa_id, to, action)) return soap->error; if (!acksto) acksto = replyto; soap_wsa_add_ReplyTo(soap, replyto); #ifdef WITH_WCF_SIM /* WCF simulated channel instance */ if (strcmp(replyto, soap_wsa_anonymousURI)) /* only with ReplyTo set */ { int ci = 2; /* for example */ struct wsa5__ReferenceParametersType rp; soap_default_wsa5__ReferenceParametersType(soap, &rp); rp.chan__ChannelInstance = &ci; soap->header->wsa5__ReplyTo->ReferenceParameters = &rp; } #endif req.AcksTo.Address = (char*)acksto; if (expires) { req.Expires = (xsd__duration*)soap_malloc(soap, sizeof(xsd__duration)); if (!req.Expires) return soap->error; *req.Expires = expires; } if (!id || *id) { req.Offer = (struct wsrm__OfferType*)soap_malloc(soap, sizeof(struct wsrm__OfferType)); if (!req.Offer) return soap->error; soap_default_wsrm__OfferType(soap, req.Offer); if (!id) { const char *t; MUTEX_LOCK(soap_wsrm_session_lock); t = soap_wsrm_seq_newid(soap); MUTEX_UNLOCK(soap_wsrm_session_lock); if (!t) return soap->error; id = req.Offer->Identifier = soap_strdup(soap, t); /* required */ free((void*)t); } else req.Offer->Identifier = soap_strdup(soap, id); /* required */ #ifdef SOAP_WSRM_2007 req.Offer->Endpoint.Address = (char*)replyto; /* required: use acksto endpoint */ if (expires) req.Offer->Expires = req.Expires; /* expire value */ #endif if (behavior != NoDiscard) req.Offer->IncompleteSequenceBehavior = &behavior; } else req.Offer = NULL; data->state = SOAP_WSRM_OFF; /* disable caching */ MUTEX_LOCK(soap_wsrm_session_lock); *seq = soap_wsrm_seq_insert(soap); if (!*seq) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } (*seq)->handle = 1; if (expires) (*seq)->expires = (*seq)->timestamp + expires/1000; (*seq)->behavior = behavior; if (id && *id) { l = strlen(id); s = (char*)malloc(l + 1); if (!s) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error = SOAP_EOM; } soap_strcpy(s, l + 1, id); (*seq)->acksid = s; soap_wsrm_seq_insert_ack(*seq); } if (to) { l = strlen(to); s = (char*)malloc(l + 1); if (!s) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error = SOAP_EOM; } soap_strcpy(s, l + 1, to); (*seq)->to = s; } if (wsa_id) { l = strlen(wsa_id); s = (char*)malloc(l + 1); if (!s) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error = SOAP_EOM; } /* trick to keep track of response via RelatesTo */ soap_strcpy(s, l + 1, wsa_id); (*seq)->id = s; soap_wsrm_seq_insert_data(*seq); } MUTEX_UNLOCK(soap_wsrm_session_lock); if (soap_call___wsrm__CreateSequence(soap, to, action, &req, &res)) { if (soap->error == 202) soap->error = SOAP_OK; return soap->error; } /* process response */ l = strlen(res.Identifier); s = (char*)malloc(l + 1); if (!s) return soap->error = SOAP_EOM; soap_strcpy(s, l + 1, res.Identifier); MUTEX_LOCK(soap_wsrm_session_lock); if ((*seq)->id) free((void*)(*seq)->id); (*seq)->id = s; soap_wsrm_seq_insert_data(*seq); if (res.Expires && (!expires || *res.Expires <= expires)) (*seq)->expires = time(NULL) + *res.Expires/1000; if (res.IncompleteSequenceBehavior) (*seq)->behavior = *res.IncompleteSequenceBehavior; else (*seq)->behavior = behavior; if (res.Accept && res.Accept->AcksTo.Address) { /* accepted: update the sequence for the responses */ l = strlen(res.Accept->AcksTo.Address); s = (char*)malloc(l + 1); if (!s) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error = SOAP_EOM; } if ((*seq)->acksto) free((void*)(*seq)->acksto); soap_strcpy(s, l + 1, res.Accept->AcksTo.Address); (*seq)->acksto = s; } MUTEX_UNLOCK(soap_wsrm_session_lock); (*seq)->state = SOAP_WSRM_CREATED; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsrm_request_num(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id, const char *wsa_action, ULONG64 num) @brief Adds a WS-RM sequence message number to the next message transmitted. No acks are requested. @param soap context @param seq sequence handle set by soap_wsrm_create() or soap_wsrm_create_offer() @param[in] wsa_id WS-Addressing message ID (optional, use NULL when omitted) @param[in] wsa_action mandatory WS-Addressing action of the next message sent @param[in] num WS-RM sequence message number @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_request_num(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id, const char *wsa_action, ULONG64 num) { struct soap_wsrm_data *data; DBGFUN1("soap_wsrm_request_num", "num=" SOAP_ULONG_FORMAT, num); if (!soap_wsrm_seq_valid(soap, seq)) return soap_wsrm_error(soap, seq, wsrm__SequenceTerminated); if (num == 0) return soap_wsrm_error(soap, seq, wsrm__MessageNumberRollover); data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (!data) return soap->error = SOAP_PLUGIN_ERROR; /* process response message sequence ID */ /* look into moving this to preparefinalrecv() for client-side only */ if (seq->acksid && soap->header && soap->header->wsrm__Sequence && !strcmp(soap->header->wsrm__Sequence->Identifier, seq->acksid)) { ULONG64 recvnum = soap->header->wsrm__Sequence->MessageNumber; if (soap_wsrm_num_lookup(soap, seq, recvnum)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Response message already received\n")); /* error? */ } else if (seq->behavior == DiscardFollowingFirstGap && recvnum != seq->recvnum + 1) return soap_wsrm_error(soap, seq, wsrm__SequenceTerminated); /* close or term */ else { /* TODO: should add message ordering constraint? */ seq->recvnum = recvnum; MUTEX_LOCK(soap_wsrm_session_lock); if (soap_wsrm_num_insert(soap, seq, seq->recvnum)) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } MUTEX_UNLOCK(soap_wsrm_session_lock); } } MUTEX_LOCK(soap_wsrm_session_lock); data->msg = soap_wsrm_msg_new(soap, seq, num); #ifdef SOAP_WSA_2005 if (soap->header && soap->header->chan__ChannelInstance) { seq->channel = soap->header->chan__ChannelInstance->__item; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "ChannelInstance = %d\n", seq->channel)); } #endif MUTEX_UNLOCK(soap_wsrm_session_lock); if (!data->msg) return soap->error; soap_header(soap); if (!soap->header) return soap->error; if (!soap->header->wsrm__Sequence) { soap->header->wsrm__Sequence = (struct wsrm__SequenceType*)soap_malloc(soap, sizeof(struct wsrm__SequenceType)); if (!soap->header->wsrm__Sequence) return soap->error; } soap_default_wsrm__SequenceType(soap, soap->header->wsrm__Sequence); soap->header->wsrm__Sequence->Identifier = soap_strdup(soap, seq->id); soap->header->wsrm__Sequence->MessageNumber = num; /* add acks for ackRequested response from server */ if (soap_wsrm_add_acks(soap, seq, 0, 0, 1)) return soap->error; seq->retry = SOAP_WSRM_MAX_RETRIES; data->state = SOAP_WSRM_ON; return soap_wsa_request(soap, wsa_id, seq->to, wsa_action); } /******************************************************************************/ /** @fn int soap_wsrm_request(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id, const char *wsa_action) @brief Adds a WS-RM sequence message number to the next message transmitted to the WS-RM destination and increments the message counter by one. No acks are requested. @param soap context @param seq sequence handle set by soap_wsrm_create() or soap_wsrm_create_offer() @param[in] wsa_id WS-Addressing message ID (optional, use NULL when omitted) @param[in] wsa_action mandatory WS-Addressing action of the next message sent @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_request(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id, const char *wsa_action) { ULONG64 num; DBGFUN("soap_wsrm_request"); MUTEX_LOCK(soap_wsrm_session_lock); num = seq->num; MUTEX_UNLOCK(soap_wsrm_session_lock); return soap_wsrm_request_num(soap, seq, wsa_id, wsa_action, num + 1); } /******************************************************************************/ /** @fn int soap_wsrm_request_acks(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id, const char *wsa_action) @brief Adds a WS-RM sequence message number to the next message transmitted to the WS-RM destination and increments the message counter by one. Message acks for the current sequence are requested. @param soap context @param seq sequence handle set by soap_wsrm_create() or soap_wsrm_create_offer() @param[in] wsa_id WS-Addressing message ID (optional, use NULL when omitted) @param[in] wsa_action mandatory WS-Addressing action of the next message sent @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_request_acks(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id, const char *wsa_action) { ULONG64 num; DBGFUN("soap_wsrm_request_ack"); MUTEX_LOCK(soap_wsrm_session_lock); num = seq->num; MUTEX_UNLOCK(soap_wsrm_session_lock); if (soap_wsrm_request_num(soap, seq, wsa_id, wsa_action, num + 1)) return soap->error; soap->header->__sizeAckRequested = 1; if (!soap->header->wsrm__AckRequested) { soap->header->wsrm__AckRequested = (struct wsrm__AckRequestedType*)soap_malloc(soap, sizeof(struct wsrm__AckRequestedType)); if (!soap->header->wsrm__AckRequested) return soap->error; } soap_default_wsrm__AckRequestedType(soap, soap->header->wsrm__AckRequested); soap->header->wsrm__AckRequested->Identifier = soap->header->wsrm__Sequence->Identifier; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsrm_check_retry(struct soap *soap, soap_wsrm_sequence_handle seq) @brief Client-side check to verify if the remote call can be retried when a failure occured. Increases the robustness of messages sends, by ensuring that the message was at least transmitted (but not necessarily received). Also implements HTTP 307 Temporary Redirect. Retries are limited to SOAP_WSRM_MAX_RETRIES iterations. @param soap context @param seq sequence handle set by soap_wsrm_create or soap_wsrm_create_offer @return SOAP_OK when retry is safe, error code otherwise */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_check_retry(struct soap *soap, soap_wsrm_sequence_handle seq) { struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (!data) return soap->error = SOAP_PLUGIN_ERROR; DBGFUN("soap_wsrm_check_retry"); if (!soap_wsrm_seq_valid(soap, seq) || seq->retry-- == 0) return soap_wsrm_error(soap, seq, wsrm__SequenceTerminated); /* should actually not call this function when OK */ if (soap->error == SOAP_OK) return SOAP_OK; /* HTTP temporary redirect? */ if (soap->error == 307) { char *s; size_t l = strlen(soap->endpoint); s = (char*)malloc(l + 1); if (s) { soap_strcpy(s, l + 1, soap->endpoint); if (seq->to) free((void*)seq->to); seq->to = s; } } /* if the sequence id was changed (eg. response), cannot resend and we fail */ else if (!soap->header || !soap->header->wsrm__Sequence || !soap->header->wsrm__Sequence->Identifier || !seq->id || strcmp(soap->header->wsrm__Sequence->Identifier, seq->id)) return soap->error; /* otherwise, send was not successful and we should try again */ data->state = SOAP_WSRM_ON; /* SOAP_OK to retry the call loop */ return soap->error = SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsrm_resend(struct soap *soap, soap_wsrm_sequence_handle seq, ULONG64 lower, ULONG64 upper) @brief Resend all unacknowledged messages, i.e. messages that were automatically cached for this sequence. Messages stored in the sequence for retransmission (those that were previously sent but not acknowledged) are resent to the soap_wsrm_to() address (which was set by soap_wsrm_create() or soap_wsrm_create_offer(), or the ReplyTo address). It is recommended to resend messages after the last message in the sequence was transmitted before closing the sequence. To reduce unnecessary resend attempts, it is recommended to use soap_wsrm_request_ack() with the last message to request acks for messages already delivered. @param soap context @param seq sequence handle set by soap_wsrm_create or soap_wsrm_create_offer @param[in] lower resend message range lower bound (0 for lowest) @param[in] upper resend message range upper bound (or 0 for infinite) @return SOAP_OK or error code (can be ignored when resends are retried later) */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_resend(struct soap *soap, soap_wsrm_sequence_handle seq, ULONG64 lower, ULONG64 upper) { struct SOAP_ENV__Header *h = soap->header; struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); DBGFUN("soap_wsrm_resend"); if (!data) return soap->error = SOAP_PLUGIN_ERROR; MUTEX_LOCK(soap_wsrm_session_lock); if (seq) { if (soap_wsrm_resend_seq(soap, seq, 1, lower, upper)) /* all=1 means non-acked messages */ { soap->header = h; MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } } else { for (seq = soap_wsrm_session; seq; seq = seq->next) { if (soap_wsrm_resend_seq(soap, seq, 1, lower, upper)) /* all=1 means non-acked messages */ { soap->header = h; MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } } } MUTEX_UNLOCK(soap_wsrm_session_lock); soap->header = h; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsrm_resend_only_nacked(struct soap *soap, soap_wsrm_sequence_handle seq, ULONG64 lower, ULONG64 upper) @brief Resend all explicitly nack'ed messages indicaed by peer. Messages stored in the sequence for retransmission (those that were previously sent but not acknowledged) are resent to the soap_wsrm_to() address (which was set by soap_wsrm_create() or soap_wsrm_create_offer(), or the ReplyTo address). @param soap context @param seq sequence handle set by soap_wsrm_create or soap_wsrm_create_offer @param[in] lower resend message range lower bound (0 for lowest) @param[in] upper resend message range upper bound (or 0 for infinite) @return SOAP_OK or error code (can be ignored when resends are retried later) */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_resend_only_nacked(struct soap *soap, soap_wsrm_sequence_handle seq, ULONG64 lower, ULONG64 upper) { struct SOAP_ENV__Header *h = soap->header; struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); DBGFUN("soap_wsrm_resend_only_nacked"); if (!data) return soap->error = SOAP_PLUGIN_ERROR; MUTEX_LOCK(soap_wsrm_session_lock); if (seq) { if (soap_wsrm_resend_seq(soap, seq, 0, lower, upper)) /* all=0 means resend only Nack messages */ { soap->header = h; MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } } else { for (seq = soap_wsrm_session; seq; seq = seq->next) { if (soap_wsrm_resend_seq(soap, seq, 0, lower, upper)) /* all=0 means resend only Nack messages */ { soap->header = h; MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } } } MUTEX_UNLOCK(soap_wsrm_session_lock); soap->header = h; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsrm_close(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id) @brief Closes the sequence, but does not yet terminate it. No new messages should be send, but messages can be resend with soap_wsrm_resend() if desired. @param soap context @param seq sequence handle set by soap_wsrm_create or soap_wsrm_create_offer @param[in] wsa_id WS-Addressing message ID (optional) @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_close(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id) { #ifdef SOAP_WSRM_2007 struct wsrm__CloseSequenceType req; struct wsrm__CloseSequenceResponseType res; #endif struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); DBGFUN1("soap_wsrm_close", "wsa_id=%s", wsa_id ? wsa_id : "(null)"); if (!data) return soap->error = SOAP_PLUGIN_ERROR; if (seq->state == SOAP_WSRM_TERMINATED) return soap_wsrm_error(soap, seq, wsrm__SequenceTerminated); /* process previous response message sequence ID */ /* look into moving this to preparefinalrecv() */ if (seq->acksid && soap->header && soap->header->wsrm__Sequence && !strcmp(soap->header->wsrm__Sequence->Identifier, seq->acksid)) { if (soap_wsrm_num_lookup(soap, seq, soap->header->wsrm__Sequence->MessageNumber)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Response message already received\n")); /* No error? */ } else if (seq->behavior == DiscardFollowingFirstGap && soap->header->wsrm__Sequence->MessageNumber != seq->recvnum + 1) return soap_wsrm_error(soap, seq, wsrm__SequenceTerminated); /* close or terminate */ else { seq->recvnum = soap->header->wsrm__Sequence->MessageNumber; MUTEX_LOCK(soap_wsrm_session_lock); if (soap_wsrm_num_insert(soap, seq, seq->recvnum)) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } MUTEX_UNLOCK(soap_wsrm_session_lock); } } /* add acks for ackRequested response from server */ /* this appears necessary, but not mentioned in the WS-RM specs */ if (soap_wsrm_add_acks(soap, seq, 0, 1, 1)) return soap->error; #ifdef SOAP_WSRM_2007 soap->header->wsrm__Sequence = NULL; if (soap_wsa_request(soap, wsa_id, seq->to, SOAP_NAMESPACE_OF_wsrm"/CloseSequence")) return soap->error; soap_default_wsrm__CloseSequenceType(soap, &req); req.Identifier = soap_strdup(soap, seq->id); if (seq->num) req.LastMsgNumber = &seq->num; else req.LastMsgNumber = NULL; data->state = SOAP_WSRM_OFF; /* disable caching */ seq->state = SOAP_WSRM_CLOSED; if (soap_call___wsrm__CloseSequence(soap, seq->to, soap->header->wsa5__Action, &req, &res)) { if (soap->error == 202) soap->error = SOAP_OK; else return soap->error; } else if (!res.Identifier || strcmp(res.Identifier, seq->id)) return soap_wsrm_error(soap, seq, wsrm__UnknownSequence); return SOAP_OK; #endif #ifdef SOAP_WSRM_2005 if (soap_wsrm_request_acks(soap, seq, wsa_id, SOAP_NAMESPACE_OF_wsrm"/LastMessage")) return soap->error; soap->header->wsrm__Sequence->LastMessage = (struct _wsrm__UsesSequenceSSL*)soap_malloc(soap, sizeof(struct _wsrm__UsesSequenceSSL)); if (!soap->header->wsrm__Sequence->LastMessage) return soap->error; soap_default__wsrm__UsesSequenceSSL(soap, soap->header->wsrm__Sequence->LastMessage); seq->state = SOAP_WSRM_CLOSED; if (soap_send___wsrm__LastMessage(soap, seq->to, soap->header->wsa5__Action)) return soap->error; return soap_recv_empty_response(soap); #endif } /******************************************************************************/ /** @fn int soap_wsrm_terminate(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id) @brief Terminates the sequence. No new messages should be send and no resends should be tried. Usually done after soap_wsrm_close() or any time to terminate the sequence prematurely. @param soap context @param seq sequence handle set by soap_wsrm_create or soap_wsrm_create_offer @param[in] wsa_id WS-Addressing message ID (optional) @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_terminate(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id) { struct wsrm__TerminateSequenceType req; struct wsrm__TerminateSequenceResponseType res; struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); DBGFUN1("soap_wsrm_terminate", "wsa_id=%s", wsa_id ? wsa_id : "(null)"); if (!data) return soap->error = SOAP_PLUGIN_ERROR; if (soap->header) { soap->header->wsrm__Sequence = NULL; soap->header->wsrm__AckRequested = NULL; soap->header->wsrm__SequenceAcknowledgement = NULL; } if (soap_wsa_request(soap, wsa_id, seq->to, SOAP_NAMESPACE_OF_wsrm"/TerminateSequence")) return soap->error; soap_default_wsrm__TerminateSequenceType(soap, &req); req.Identifier = soap_strdup(soap, seq->id); #ifdef SOAP_WSRM_2007 if (seq->num) req.LastMsgNumber = &seq->num; if (seq->ranges) seq->lastnum = seq->ranges->upper; /* why does WS-RM 2007 not allow us to check the last message num in a response? */ #endif data->state = SOAP_WSRM_OFF; /* disable caching */ seq->state = SOAP_WSRM_TERMINATED; if (soap_call___wsrm__TerminateSequence(soap, seq->to, soap->header->wsa5__Action, &req, &res)) { if (soap->error == 202) soap->error = SOAP_OK; else return soap->error; } else if (!res.Identifier || strcmp(res.Identifier, seq->id)) return soap_wsrm_error(soap, seq, wsrm__UnknownSequence); if (seq->behavior == DiscardEntireSequence && (soap_wsrm_nack(seq) || (seq->recvnum && (!seq->ranges || seq->ranges->lower != 1 || seq->ranges->upper != seq->lastnum)))) return soap_wsrm_error(soap, seq, wsrm__SequenceTerminated); if (seq->fault != (enum wsrm__FaultCodes)(-1)) return soap_wsrm_error(soap, seq, seq->fault); return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsrm_pulse(struct soap *soap, int timeout) @brief Sends acknowledgements for all open sessions to all peers. Must set send and recv timeouts to prevent blocking. @param soap context @param timeout seconds (positive value) or microseconds (negative value) @return SOAP_OK or an error code when one or more peers fault (the last error code is returned) */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_pulse(struct soap *soap, int timeout) { soap_wsrm_sequence_handle seq; int ct = soap->connect_timeout; int st = soap->send_timeout; int rt = soap->recv_timeout; int a = 1; int err = SOAP_OK, errnum = 0; DBGFUN("soap_wsrm_pulse"); soap->connect_timeout = soap->send_timeout = soap->recv_timeout = timeout; MUTEX_LOCK(soap_wsrm_session_lock); for (seq = soap_wsrm_session; seq; seq = seq->next) { if ((seq->state == SOAP_WSRM_CREATED || seq->state == SOAP_WSRM_CLOSED) && seq->recvnum) seq->ackreq = 1; } MUTEX_UNLOCK(soap_wsrm_session_lock); while (a) { a = 0; MUTEX_LOCK(soap_wsrm_session_lock); for (seq = soap_wsrm_session; seq; seq = seq->next) { if (seq->ackreq && seq->recvnum && soap_wsrm_seq_valid(soap, seq)) { seq->refs++; MUTEX_UNLOCK(soap_wsrm_session_lock); /* send acks for this sequence */ if (soap_wsrm_acknowledgement(soap, seq, NULL)) { err = soap->error; errnum = soap->errnum; soap->error = SOAP_OK; /* must keep going, ignore peer-related problems */ } soap_wsrm_seq_release(soap, seq); a = 1; break; } } if (!a) MUTEX_UNLOCK(soap_wsrm_session_lock); } soap->connect_timeout = ct; soap->send_timeout = st; soap->recv_timeout = rt; soap->error = err; soap->errnum = errnum; return err; } /******************************************************************************/ /** @fn int soap_wsrm_acknowledgement(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id) @brief Sends acknowledgements for all message sequences that require an acknowledgement (ack requested by peer) @param soap context @param seq sequence handle set by soap_wsrm_create or soap_wsrm_create_offer @param[in] wsa_id WS-Addressing message ID (deprecated, not used) @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_acknowledgement(struct soap *soap, soap_wsrm_sequence_handle seq, const char *wsa_id) { (void)wsa_id; DBGFUN("soap_wsrm_acknowledgement"); if (seq->state == SOAP_WSRM_CREATED || seq->state == SOAP_WSRM_CLOSED) { soap->header = NULL; /* force adding acks and send them all (piggy=0) */ if (soap_wsrm_add_acks(soap, seq, 0, 1, 0)) return soap->error; } seq->ackreq = 0; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsrm_non_acknowledgement(struct soap *soap, soap_wsrm_sequence_handle seq, ULONG64 nack) @brief Sends nack non-acknowledgement for a message @param soap context @param seq sequence handle set by soap_wsrm_create or soap_wsrm_create_offer @param nack num of message to nack @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_non_acknowledgement(struct soap *soap, soap_wsrm_sequence_handle seq, ULONG64 nack) { DBGFUN("soap_wsrm_non_acknowledgement"); seq->ackreq = 0; if ((seq->state == SOAP_WSRM_CREATED || seq->state == SOAP_WSRM_CLOSED)) { soap->header = NULL; /* force adding acks and send them all (piggy=0) */ if (soap_wsrm_add_acks(soap, seq, nack, 0, 0)) return soap->error; } return SOAP_OK; } /******************************************************************************/ /** @fn void soap_wsrm_seq_free(struct soap *soap, soap_wsrm_sequence_handle seq) @brief Must be called to free the sequence allocated by soap_wsrm_create() or by soap_wsrm_create_offer(). Sequences created by soap_wsrm_create_offer return handles that are not automatically reclaimed by the engine. @param soap context @param seq sequence handle set by soap_wsrm_create() or soap_wsrm_create_offer() */ SOAP_FMAC1 void SOAP_FMAC2 soap_wsrm_seq_free(struct soap *soap, soap_wsrm_sequence_handle seq) { struct soap_wsrm_data *data; struct soap_wsrm_sequence **q; time_t now = time(NULL); DBGFUN("soap_wsrm_seq_free"); data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (!data) return; MUTEX_LOCK(soap_wsrm_session_lock); q = &soap_wsrm_session; while (*q) { if ((!(*q)->handle && !(*q)->refs && (*q)->expires < now) || *q == seq) { struct soap_wsrm_sequence *t = *q; #ifndef SOAP_WSRM_FAST_ALLOC struct soap_wsrm_message *p, *r; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deleting sequence %s\n", t->id ? t->id : "(null)")); if (t->id) { soap_wsrm_seq_delete_data(t); free((void*)t->id); } if (t->acksid) { soap_wsrm_seq_delete_ack(t); free((void*)t->acksid); } if (t->to) free((void*)t->to); if (t->repto) free((void*)t->repto); if (t->acksto) free((void*)t->acksto); soap_wsrm_num_free(soap, t); #ifdef SOAP_WSRM_FAST_ALLOC if (t->messages) { ULONG64 i; for (i = 0; i < t->num; i++) { if (t->messages[i]) { soap_wsrm_msg_free(soap, t->messages[i]); free((void*)t->messages[i]); } } free((void*)t->messages); } #else for (p = t->messages; p; p = r) { r = p->next; soap_wsrm_msg_free(soap, p); free((void*)p); } #endif *q = t->next; free((void*)t); if (seq) break; } else q = &(*q)->next; } MUTEX_UNLOCK(soap_wsrm_session_lock); } /******************************************************************************/ /** @fn const char *soap_wsrm_to(const soap_wsrm_sequence_handle seq) @brief Returns the endpoint address of the destination service that serves the sequence. Initially set with soap_wsrm_create or soap_wsrm_create_offer. HTTP 307 Temporary Redirect can change the endpoint during the lifetime of a message sequence. Thus, this function returns the most recent endpoint binding that can be used to send message to the server endpoint. @param seq sequence handle set by soap_wsrm_create() or soap_wsrm_create_offer() @return the sequence endpoint address or replyTo address (when provided) or NULL when no destination is given */ SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsrm_to(const soap_wsrm_sequence_handle seq) { if (seq->repto) { if (!strcmp(seq->repto, soap_wsa_noneURI)) return NULL; if (strcmp(seq->repto, soap_wsa_anonymousURI)) return seq->repto; } return seq->to; } /******************************************************************************/ /** @fn const char *soap_wsrm_acksto(const soap_wsrm_sequence_handle seq) @brief Returns the endpoint address of the AcksTo acknowledgement service that serves the sequence, when set with soap_wsrm_create() or soap_wsrm_create_offer() or NULL otherwise. HTTP 307 Temporary Redirect can change the endpoint during the lifetime of a message sequence. Thus, this function returns the most recent endpoint binding. @param seq sequence handle set by soap_wsrm_create() or soap_wsrm_create_offer() @return the sequence endpoint address */ SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsrm_acksto(const soap_wsrm_sequence_handle seq) { return seq->acksto; } /******************************************************************************/ /** @fn ULONG64 soap_wsrm_num(const soap_wsrm_sequence_handle seq) @brief Returns the current message number of the sequence @param seq sequence handle set by soap_wsrm_create() or soap_wsrm_create_offer() @return the sequence endpoint address */ SOAP_FMAC1 ULONG64 SOAP_FMAC2 soap_wsrm_num(const soap_wsrm_sequence_handle seq) { return seq->num; } /******************************************************************************/ /** @fn ULONG64 soap_wsrm_nack(const soap_wsrm_sequence_handle seq) @brief Returns the number of non-acknowledged messages sent @param seq sequence handle set by soap_wsrm_create() or soap_wsrm_create_offer() @return number of non-acknowledged messages sent */ SOAP_FMAC1 ULONG64 SOAP_FMAC2 soap_wsrm_nack(const soap_wsrm_sequence_handle seq) { ULONG64 nack = 0; #ifdef SOAP_WSRM_FAST_ALLOC ULONG64 i; MUTEX_LOCK(soap_wsrm_session_lock); for (i = 0; i < seq->num; i++) if (seq->messages[i] && seq->messages[i]->state == SOAP_WSRM_NACK) nack++; MUTEX_UNLOCK(soap_wsrm_session_lock); #else struct soap_wsrm_message *p; MUTEX_LOCK(soap_wsrm_session_lock); for (p = seq->messages; p; p = p->next) if (p->state == SOAP_WSRM_NACK) nack++; MUTEX_UNLOCK(soap_wsrm_session_lock); #endif return nack; } /******************************************************************************\ * * Server * \******************************************************************************/ /** @fn int soap_wsrm_check(struct soap *soap) @brief Receiver (server)-side check for the presence of WS-Addressing and WS-RM header blocks in the SOAP header, checks for protocol errors, and rejects duplicate messages. Also prepares the return WS-RM header. This function should be called in the each service operation that supports WS-RM. Do not use this function in a ReplyTo response-accepting destination service operation. When NoDicards behavior is set, out of sequence messages will be discared until message sequence has resumed (requires peer resends). @param soap context @return SOAP_OK or SOAP_STOP (duplicate message error, MUST be returned by the service operation executing the soap_wsrm_check) or an error code. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_check(struct soap *soap) { DBGFUN("soap_wsrm_check"); return soap_wsrm_chk(soap, 0, 0); } /******************************************************************************/ /** @fn int soap_wsrm_check_and_wait(struct soap *soap, int timeout) @brief Receiver (server)-side check for the presence of WS-Addressing and WS-RM header blocks in the SOAP header, checks for protocol errors, and rejects duplicate messages. Also prepares the return WS-RM header. This function should be called in the each service operation that supports WS-RM. Do not use this function in a ReplyTo response-accepting destination service operation. @param soap context @param timeout NoDiscard behavior: 0=discard messages out of sequence to immediately resume, >0 wait (in seconds) until message sequence has resumed while sending Nacks every second to indicate messages are required to continue the flow of messages, <0 wait (in microseconds) until message sequence has resumed, send one nack when timeout occurred. @return SOAP_OK or SOAP_STOP (duplicate message error, MUST be returned by the service operation executing the soap_wsrm_check) or an error code. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_check_and_wait(struct soap *soap, int timeout) { DBGFUN1("soap_wsrm_check_and_wait", "timeout=%d", timeout); return soap_wsrm_chk(soap, timeout, 0); } /******************************************************************************/ /** @fn int soap_wsrm_check_send_empty_response(struct soap *soap) @brief Receiver (server)-side check for the presence of WS-Addressing and WS-RM header blocks in the SOAP header, checks for protocol errors, and rejects duplicate messages. Also prepares the return WS-RM header. This function should be called in the each service operation that sends an empty response back (one-way messaging). The behavior is the same as soap_wsrm_check() followed by soap_send_empty_response(), but more efficient and prevents blocking. @param soap context @return SOAP_OK or SOAP_STOP (duplicate message error, MUST be returned by the service operation executing the soap_wsrm_check) or an error code. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_check_send_empty_response(struct soap *soap) { DBGFUN("soap_wsrm_check_send_empty_response"); return soap_wsrm_chk(soap, 0, 1); } /******************************************************************************/ /** @fn int soap_wsrm_check_send_empty_response_and_wait(struct soap *soap, int timeout) @brief Receiver (server)-side check for the presence of WS-Addressing and WS-RM header blocks in the SOAP header, checks for protocol errors, and rejects duplicate messages. Also prepares the return WS-RM header. This function should be called in the each service operation that sends an empty response back (one-way messaging). The behavior is the same as soap_wsrm_check() followed by soap_send_empty_response(), but more efficient and prevents blocking. @param soap context @param timeout NoDiscard behavior: 0=discard messages out of sequence to immediately resume, >0 wait (in seconds) until message sequence has resumed while sending Nacks every second to indicate messages are required to continue the flow of messages, <0 wait (in microseconds) until message sequence has resumed, send one nack when timeout occurred. @return SOAP_OK or SOAP_STOP (duplicate message error, MUST be returned by the service operation executing the soap_wsrm_check) or an error code. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_check_send_empty_response_and_wait(struct soap *soap, int timeout) { DBGFUN1("soap_wsrm_check_send_empty_response_and_wait", "timeout=%d", timeout); return soap_wsrm_chk(soap, timeout, 1); } /******************************************************************************/ /** @fn int soap_wsrm_chk(struct soap *soap, int timeout, int flag) @brief Receiver (server)-side check for the presence of WS-Addressing and WS-RM header blocks in the SOAP header, checks for protocol errors, and rejects duplicate messages. Also prepares the return WS-RM header. This function should be called in the each service operation that supports WS-RM. Do not use this function in a ReplyTo response-accepting destination service operation. @param soap context @param timeout NoDiscard behavior: 0=discard messages out of sequence to immediately resume, >0 wait (in seconds) until message sequence has resumed while sending Nacks every second to indicate messages are required to continue the flow of messages, <0 wait (in microseconds) until message sequence has resumed, send one nack when timeout occurred. @param flag 0=no response, 1=send empty response @return SOAP_OK or SOAP_STOP (duplicate message error, MUST be returned by the service operation executing the soap_wsrm_check) or an error code. */ static int soap_wsrm_chk(struct soap *soap, int timeout, int flag) { struct soap_wsrm_sequence *seq; struct soap_wsrm_data *data; const char *replyTo; ULONG64 recvnum; if (soap_wsa_check(soap)) return soap->error; data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (!data) return soap->error = SOAP_PLUGIN_ERROR; data->state = SOAP_WSRM_OFF; /* disable caching */ if (!soap->header || !soap->header->wsrm__Sequence) return soap_wsrm_error(soap, NULL, wsrm__WSRMRequired); if (flag) { soap_send_empty_response(soap, 202); soap->error = SOAP_OK; } MUTEX_LOCK(soap_wsrm_session_lock); seq = soap_wsrm_seq_lookup_ack(soap->header->wsrm__Sequence->Identifier); if (!seq) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap_wsrm_error(soap, NULL, wsrm__UnknownSequence); } if (!soap_wsrm_seq_valid(soap, seq)) { soap_wsrm_error(soap, seq, wsrm__SequenceTerminated); MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } seq->timestamp = time(NULL); recvnum = soap->header->wsrm__Sequence->MessageNumber; if (soap_wsrm_num_lookup(soap, seq, recvnum)) { /* changed in 1.3: outbound non-acked message resends removed from WS-RM 1.2 */ seq->refs++; MUTEX_UNLOCK(soap_wsrm_session_lock); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Message " SOAP_ULONG_FORMAT " already received: duplicate message not processed\n", recvnum)); if (!flag) soap_send_empty_response(soap, 202); /* HTTP 202 */ if (soap_wsrm_acknowledgement(soap, seq, NULL)) /* send acks, should help avoid getting resends */ soap->error = SOAP_OK; soap_wsrm_seq_release(soap, seq); return soap->error = SOAP_STOP; /* do not process message */ } if (seq->lastnum && recvnum > seq->lastnum) { #ifdef SOAP_WSRM_2005 soap_wsrm_error(soap, seq, wsrm__LastMessageNumberExceeded); #else soap_wsrm_error(soap, seq, wsrm__SequenceClosed); #endif MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } if (seq->behavior == DiscardFollowingFirstGap && recvnum != seq->recvnum + 1) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Message " SOAP_ULONG_FORMAT " received after message " SOAP_ULONG_FORMAT ", sequence discarded following first gap\n", recvnum, seq->recvnum)); soap_wsrm_error(soap, seq, wsrm__SequenceTerminated); /* close or term */ MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } else if (seq->behavior == NoDiscard && recvnum != seq->recvnum + 1) { if (timeout) { volatile ULONG64 *vp = &seq->recvnum; /* recvnum is updated by other threads */ int r1, r2; #ifdef _WRS_KERNEL int r3; #else unsigned int r3; #endif struct soap *nack_soap = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Message " SOAP_ULONG_FORMAT " received after message " SOAP_ULONG_FORMAT "\n", recvnum, *vp)); if (timeout > 0) { r1 = timeout; /* seconds to queue message, send Nack every second (timeout-1 times) */ r2 = 5; /* 5 times... */ #ifdef _WRS_KERNEL r3 = (sysClkRateGet()/1000) * 200; #else r3 = 200000; /* 200 ms sleep in the message queue */ #endif } else if (timeout < -100000) { r1 = 1; r2 = -timeout / 100000 + 1; #ifdef _WRS_KERNEL r3 = (sysClkRateGet()/1000) * 100; #else r3 = 100000; /* 100 ms sleep */ #endif } else { r1 = r2 = 1; #ifdef _WRS_KERNEL r3 = (int)((ULONG64)(-timeout) * sysClkRateGet()/1000000); #else r3 = -timeout; #endif } while (r1) { while (r2) { MUTEX_UNLOCK(soap_wsrm_session_lock); #if defined(_WRS_KERNEL) taskDelay(r3); /* VxWorks compatible sleep API, delay is specified in number of ticks, which depends on the System Clock Rate */ #elif defined(WIN32) Sleep(r3/1000); #else usleep(r3); #endif MUTEX_LOCK(soap_wsrm_session_lock); if (recvnum == *vp + 1) /* check again, exit inner loop when message is in sequence */ break; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cannot accept message " SOAP_ULONG_FORMAT " after message " SOAP_ULONG_FORMAT "\n", recvnum, *vp)); r2--; } if (recvnum == *vp + 1) /* check again, exit outer loop when message is in sequence */ break; r1--; if (r1) { /* send nack to request resend of message(s) in the gap */ MUTEX_UNLOCK(soap_wsrm_session_lock); if (!nack_soap) nack_soap = soap_copy(soap); /* use a context copy, so we do not alter current context when sending */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending Nack for message " SOAP_ULONG_FORMAT "\n", *vp + 1)); if (nack_soap) soap_wsrm_non_acknowledgement(nack_soap, seq, *vp + 1); /* send nack for the message that we need */ MUTEX_LOCK(soap_wsrm_session_lock); } } if (nack_soap) { soap_end(nack_soap); soap_free(nack_soap); /* remove context copy */ } if (recvnum != *vp + 1) { /* timed out, ignore this message */ MUTEX_UNLOCK(soap_wsrm_session_lock); if (!flag) soap_send_empty_response(soap, 202); return soap->error = SOAP_STOP; } } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Message " SOAP_ULONG_FORMAT " received after message " SOAP_ULONG_FORMAT "\n", recvnum, seq->recvnum)); /* ignore messages that are not in order, send nack to request resend */ MUTEX_UNLOCK(soap_wsrm_session_lock); if (!flag) soap_send_empty_response(soap, 202); /* soap_wsrm_non_acknowledgement(soap, seq, seq->recvnum + 1); */ /* send nack for the message that we need? */ return soap->error = SOAP_STOP; } } seq->recvnum = recvnum; if (soap_wsrm_num_insert(soap, seq, recvnum)) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Message " SOAP_ULONG_FORMAT " accepted\n", recvnum)); if (seq->repto) { free((void*)seq->repto); seq->repto = NULL; } replyTo = soap_wsa_ReplyTo(soap); if (replyTo && strcmp(replyTo, soap_wsa_anonymousURI)) { char *s; size_t l = strlen(replyTo); s = (char*)malloc(l + 1); if (!s) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error = SOAP_EOM; } soap_strcpy(s, l + 1, replyTo); seq->repto = s; } #ifdef SOAP_WSA_2005 if (soap->header && soap->header->chan__ChannelInstance) { seq->channel = soap->header->chan__ChannelInstance->__item; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "ChannelInstance = %d\n", seq->channel)); } #endif MUTEX_UNLOCK(soap_wsrm_session_lock); return soap_wsrm_chk_acks(soap); } /******************************************************************************/ /** @fn int soap_wsrm_reply_num(struct soap *soap, int flag) @brief Prepares reply from service. When flag is set, adds a WS-RM sequence message number to the next message transmitted. No acks are requested. No WS-Addressing message relay. @param soap context @param flag true to add a WS-RM sequence message number to the message to be transmitted @return SOAP_OK or error code (and server operation must return this value) */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_reply_num(struct soap *soap, int flag) { struct soap_wsrm_sequence *seq; struct soap_wsrm_data *data; DBGFUN("soap_wsrm_reply_num"); data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (!data) return soap->error = SOAP_PLUGIN_ERROR; data->state = SOAP_WSRM_OFF; /* disable caching */ if (!soap->header || !soap->header->wsrm__Sequence) return soap_wsrm_error(soap, NULL, wsrm__WSRMRequired); MUTEX_LOCK(soap_wsrm_session_lock); seq = soap_wsrm_seq_lookup_ack(soap->header->wsrm__Sequence->Identifier); if (!seq) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap_wsrm_error(soap, NULL, wsrm__UnknownSequence); } if (seq->id) { ULONG64 num = seq->num; if (flag) { data->msg = soap_wsrm_msg_new(soap, seq, num + 1); if (!data->msg) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } data->state = SOAP_WSRM_ON; if (data->seq) data->seq->refs--; data->seq = seq; seq->refs++; /* do not dealloc until message sent or error */ num = seq->num; } soap_default_wsrm__SequenceType(soap, soap->header->wsrm__Sequence); soap->header->wsrm__Sequence->Identifier = soap_strdup(soap, seq->id); soap->header->wsrm__Sequence->MessageNumber = num; } else soap->header->wsrm__Sequence = NULL; MUTEX_UNLOCK(soap_wsrm_session_lock); soap->header->__sizeAckRequested = 0; if (!soap->header->SOAP_WSA(ReplyTo) || !soap->header->SOAP_WSA(ReplyTo)->Address || !strcmp(soap->header->SOAP_WSA(ReplyTo)->Address, soap_wsa_anonymousURI)) soap_wsa_add_ReplyTo(soap, seq->to); if (!soap->header->SOAP_WSA(FaultTo) || !soap->header->SOAP_WSA(FaultTo)->Address || !strcmp(soap->header->SOAP_WSA(FaultTo)->Address, soap_wsa_anonymousURI)) soap_wsa_add_FaultTo(soap, seq->to); /* add acks for ackRequested response from server */ return soap_wsrm_add_acks(soap, seq, 0, 0, 1); } /******************************************************************************/ /** @fn int soap_wsrm_reply(struct soap *soap, const char *wsa_id, const char *wsa_action) @brief Server-side server operation reply to be performed when the service operation returns. Server operations that support WS-Addressing and WS-RM must call this function to return normally (and/or allow the response message to be relayed as per WS-Addressing). @param soap context @param[in] wsa_id WS-Addressing message ID (optional) @param[in] wsa_action mandatory WS-Addressing action of the response @return SOAP_OK or error code (and server operation must return this value) */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_reply(struct soap *soap, const char *wsa_id, const char *wsa_action) { DBGFUN("soap_wsrm_reply"); if (soap_wsrm_reply_num(soap, 1)) return soap->error; return soap_wsa_reply(soap, wsa_id, wsa_action); } /******************************************************************************/ /** @fn int soap_wsrm_reply_request_acks(struct soap *soap, const char *wsa_id, const char *wsa_action) @brief Server-side server operation reply to be performed when the service operation returns. Message acks for the current sequence are requested, but only when client made a create sequence offer. Server operations that support WS-Addressing and WS-RM must call this function or call soap_wsrm_reply() to return normally (and/or allow the response message to be relayed as per WS-Addressing). @param soap context @param[in] wsa_id WS-Addressing message ID (optional) @param[in] wsa_action mandatory WS-Addressing action of the response @return SOAP_OK or error code (and server operation must return this value) */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_reply_request_acks(struct soap *soap, const char *wsa_id, const char *wsa_action) { DBGFUN("soap_wsrm_reply_request_acks"); if (soap_wsrm_reply_num(soap, 1)) return soap->error; if (soap->header->wsrm__Sequence) { if (!soap->header->wsrm__AckRequested) { soap->header->wsrm__AckRequested = (struct wsrm__AckRequestedType*)soap_malloc(soap, sizeof(struct wsrm__AckRequestedType)); if (!soap->header->wsrm__AckRequested) return soap->error; } soap->header->__sizeAckRequested = 1; soap_default_wsrm__AckRequestedType(soap, soap->header->wsrm__AckRequested); soap->header->wsrm__AckRequested->Identifier = soap->header->wsrm__Sequence->Identifier; } return soap_wsa_reply(soap, wsa_id, wsa_action); } /******************************************************************************/ /** @fn void soap_wsrm_cleanup(struct soap *soap) @brief Cleans up all expired sequences and releases resources. To be used at the server side to periodically clean up WS-RM sequences. Server-side cleanup is automatic, as long as WS-RM is in use. Does not release client-side sequences allocated by soap_wsrm_create() or soap_wsrm_create_offer(). @param soap context */ SOAP_FMAC1 void SOAP_FMAC2 soap_wsrm_cleanup(struct soap *soap) { DBGFUN("soap_wsrm_cleanup"); soap_wsrm_seq_free(soap, NULL); } /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************\ * * Server-side Predefined WS-RM Operations * \******************************************************************************/ /** @fn int __wsrm__CreateSequence(struct soap *soap, struct wsrm__CreateSequenceType *req, struct wsrm__CreateSequenceResponseType *res) @brief WS-RM CreateSequence service operation. Automatically invoked by the server to process a create sequence request (with or without offer). Creates a new local sequence state to keep track of messages. @param soap context @param[in] req wsrm__CreateSequence request message @param[out] res wsrm__CreateSequenceResponse response message @return SOAP_OK or error code */ SOAP_FMAC5 int SOAP_FMAC6 __wsrm__CreateSequence(struct soap *soap, struct wsrm__CreateSequenceType *req, struct wsrm__CreateSequenceResponseType *res) { struct soap_wsrm_sequence *seq; struct soap_wsrm_data *data; char *action; const char *replyTo; size_t l; DBGFUN("__wsrm__CreateSequence"); if (soap_wsa_check(soap)) return soap->error; data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (!data) return soap->error = SOAP_PLUGIN_ERROR; data->state = SOAP_WSRM_OFF; /* disable caching */ if (!req) return soap_wsrm_error(soap, NULL, wsrm__WSRMRequired); soap_wsrm_cleanup(soap); MUTEX_LOCK(soap_wsrm_session_lock); seq = soap_wsrm_seq_insert(soap); if (!seq) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } seq->num = 0; replyTo = soap_wsa_ReplyTo(soap); if (replyTo && strcmp(replyTo, soap_wsa_anonymousURI)) { char *s; l = strlen(replyTo); s = (char*)malloc(l + 1); if (!s) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error = SOAP_EOM; } soap_strcpy(s, l + 1, replyTo); seq->to = s; } if (req->AcksTo.Address) { char *s; l = strlen(req->AcksTo.Address); s = (char*)malloc(l + 1); if (!s) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error = SOAP_EOM; } soap_strcpy(s, l + 1, req->AcksTo.Address); seq->acksto = s; } if (req->Expires && *req->Expires/1000 < SOAP_WSRM_MAX_SEC_TO_EXPIRE) seq->expires = time(NULL) + *req->Expires/1000; seq->state = SOAP_WSRM_CREATED; if (req->Offer) { res->Accept = (struct wsrm__AcceptType*)soap_malloc(soap, sizeof(struct wsrm__AcceptType)); if (!res->Accept) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } soap_default_wsrm__AcceptType(soap, res->Accept); res->Accept->AcksTo.Address = soap->header->wsa5__To; /* acksto for responses req->AcksTo; */ res->Expires = req->Expires; if (req->Offer->Identifier) { /* check if offered identifier is acceptable? */ /* if (!soap_wsrm_seq_lookup_data(req->Offer->Identifier)) */ { char *s; l = strlen(req->Offer->Identifier); s = (char*)malloc(l + 1); if (s) { soap_strcpy(s, l + 1, req->Offer->Identifier); seq->id = s; soap_wsrm_seq_insert_data(seq); } } } if (req->Offer->Expires && *req->Offer->Expires/1000 < SOAP_WSRM_MAX_SEC_TO_EXPIRE) seq->expires = time(NULL) + *req->Offer->Expires/1000; /* copy same behavior for response messages */ if (req->Offer->IncompleteSequenceBehavior) { res->IncompleteSequenceBehavior = req->Offer->IncompleteSequenceBehavior; seq->behavior = *res->IncompleteSequenceBehavior; } } seq->acksid = soap_wsrm_seq_newid(soap); if (!seq->acksid) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } soap_wsrm_seq_insert_ack(seq); res->Identifier = soap_strdup(soap, seq->acksid); #ifdef SOAP_WSA_2005 if (soap->header->SOAP_WSA(ReplyTo) && soap->header->SOAP_WSA(ReplyTo)->ReferenceParameters && soap->header->SOAP_WSA(ReplyTo)->ReferenceParameters->chan__ChannelInstance) { seq->channel = *soap->header->SOAP_WSA(ReplyTo)->ReferenceParameters->chan__ChannelInstance; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "ReplyTo ChannelInstance = %d\n", seq->channel)); } #endif MUTEX_UNLOCK(soap_wsrm_session_lock); soap->header->wsrm__Sequence = NULL; soap->header->wsrm__AckRequested = NULL; l = strlen(soap->action); action = (char*)soap_malloc(soap, l + 9); if (!action) return soap->error; soap_strcpy(action, l + 9, soap->action); soap_strcpy(action + l, 9, "Response"); return soap_wsa_reply(soap, NULL, action); } /******************************************************************************/ /** @fn int __wsrm__CreateSequenceResponse(struct soap *soap, struct wsrm__CreateSequenceResponseType *res) @brief WS-RM CreateSequenceResponse one-way service operation. Automatically invoked by the server to process a create sequence response (with or without offer). Creates a new local sequence state to keep track of messages. @param soap context @param[in] res wsrm__CreateSequenceResponse response message @return SOAP_OK or error code */ SOAP_FMAC5 int SOAP_FMAC6 __wsrm__CreateSequenceResponse(struct soap *soap, struct wsrm__CreateSequenceResponseType *res) { struct soap_wsrm_sequence *seq; struct soap_wsrm_data *data; DBGFUN("__wsrm__CreateSequenceResponse"); if (soap_wsa_check(soap)) return soap->error; data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (!data) return soap->error = SOAP_PLUGIN_ERROR; data->state = SOAP_WSRM_OFF; /* disable caching */ if (!res->Identifier) return soap_wsrm_error(soap, NULL, wsrm__CreateSequenceRefused); MUTEX_LOCK(soap_wsrm_session_lock); seq = soap_wsrm_seq_lookup_data(res->Identifier); if (!seq) { char *s; size_t l; if (!soap_wsa_RelatesTo(soap)) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap_wsrm_error(soap, NULL, wsrm__UnknownSequence); } seq = soap_wsrm_seq_lookup_data(soap_wsa_RelatesTo(soap)); if (!seq) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap_wsrm_error(soap, NULL, wsrm__UnknownSequence); } l = strlen(res->Identifier); s = (char*)malloc(l + 1); if (!s) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error = SOAP_EOM; } soap_strcpy(s, l + 1, res->Identifier); if (seq->id) free((void*)seq->id); seq->id = s; soap_wsrm_seq_insert_data(seq); } if (res->Expires && *res->Expires/1000 <= SOAP_WSRM_MAX_SEC_TO_EXPIRE) seq->expires = time(NULL) + *res->Expires/1000; if (res->IncompleteSequenceBehavior) seq->behavior = *res->IncompleteSequenceBehavior; if (res->Accept && res->Accept->AcksTo.Address) { char *s; size_t l = strlen(res->Accept->AcksTo.Address); /* accepted: update the sequence for the responses */ s = (char*)malloc(l + 1); if (!s) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error = SOAP_EOM; } soap_strcpy(s, l + 1, res->Accept->AcksTo.Address); if (seq->acksto) free((void*)seq->acksto); seq->acksto = s; } seq->state = SOAP_WSRM_CREATED; #ifdef SOAP_WSA_2005 if (soap->header && soap->header->chan__ChannelInstance) { seq->channel = soap->header->chan__ChannelInstance->__item; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "ChannelInstance = %d\n", seq->channel)); } #endif MUTEX_UNLOCK(soap_wsrm_session_lock); return soap_send_empty_response(soap, 202); } /******************************************************************************/ /** @fn int __wsrm__CloseSequence(struct soap *soap, struct wsrm__CloseSequenceType *req, struct wsrm__CloseSequenceResponseType *res) @brief WS-RM CloseSequence service operation. Automatically invoked by the server to process the close sequence request. Updates the server's local sequence state to closed. @param soap context @param[in] req wsrm__CloseSequence request message @param[out] res wsrm__CloseSequenceResponse response message @return SOAP_OK or error code */ SOAP_FMAC5 int SOAP_FMAC6 __wsrm__CloseSequence(struct soap *soap, struct wsrm__CloseSequenceType *req, struct wsrm__CloseSequenceResponseType *res) { struct soap_wsrm_sequence *seq; struct soap_wsrm_data *data; char *action; size_t l; DBGFUN("__wsrm__CloseSequence"); if (soap_wsa_check(soap)) return soap->error; data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (!data) return soap->error = SOAP_PLUGIN_ERROR; data->state = SOAP_WSRM_OFF; /* disable caching */ if (!req) return soap_wsrm_error(soap, NULL, wsrm__WSRMRequired); MUTEX_LOCK(soap_wsrm_session_lock); seq = soap_wsrm_seq_lookup_ack(req->Identifier); if (!seq) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap_wsrm_error(soap, NULL, wsrm__UnknownSequence); } if (seq->state == SOAP_WSRM_TERMINATED) { soap_wsrm_error(soap, seq, wsrm__SequenceTerminated); MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } seq->state = SOAP_WSRM_CLOSED; seq->timestamp = time(NULL); #ifdef SOAP_WSRM_2007 if (req->LastMsgNumber) seq->lastnum = *req->LastMsgNumber; #endif res->Identifier = req->Identifier; soap->header->wsrm__Sequence = NULL; if (!soap->header->wsrm__SequenceAcknowledgement) { soap->header->wsrm__SequenceAcknowledgement = (struct _wsrm__SequenceAcknowledgement*)soap_malloc(soap, sizeof(struct _wsrm__SequenceAcknowledgement)); if (!soap->header->wsrm__SequenceAcknowledgement) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } } soap->header->__sizeSequenceAcknowledgement = 1; if (soap_wsrm_set_ack(soap, 0, seq, soap->header->wsrm__SequenceAcknowledgement)) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } soap_wsa_add_ReplyTo(soap, seq->to); MUTEX_UNLOCK(soap_wsrm_session_lock); l = strlen(soap->action); action = (char*)soap_malloc(soap, l + 9); if (!action) return soap->error; soap_strcpy(action, l + 9, soap->action); soap_strcpy(action + l, 9, "Response"); return soap_wsa_reply(soap, NULL, action); } /******************************************************************************/ /** @fn int __wsrm__CloseSequenceResponse(struct soap *soap, struct wsrm__CloseSequenceResponseType *res) @brief WS-RM CloseSequenceResponse one-way service operation. Automatically invoked by the server to process the close sequence response. Updates the server's local sequence state to closed. @param soap context @param[in] res wsrm__CloseSequenceResponse response message @return SOAP_OK or error code */ SOAP_FMAC5 int SOAP_FMAC6 __wsrm__CloseSequenceResponse(struct soap *soap, struct wsrm__CloseSequenceResponseType *res) { struct soap_wsrm_data *data; DBGFUN("__wsrm__CloseSequenceResponse"); if (soap_wsa_check(soap)) return soap->error; data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (!data) return soap->error = SOAP_PLUGIN_ERROR; data->state = SOAP_WSRM_OFF; /* disable caching */ if (!res->Identifier || !soap_wsrm_seq_lookup_data(res->Identifier)) return soap_wsrm_error(soap, NULL, wsrm__UnknownSequence); return soap_send_empty_response(soap, 202); } /******************************************************************************/ /** @fn int __wsrm__TerminateSequence(struct soap *soap, struct wsrm__TerminateSequenceType *req, struct wsrm__TerminateSequenceResponseType *res) @brief WS-RM TerminateSequence service operation. Automatically invoked by the server to process the terminate sequence request. Updates the server's local sequence state to terminated. @param soap context @param[in] req wsrm__TerminateSequence request message @param[out] res wsrm__TerminateSequenceResponse response message @return SOAP_OK or error code */ SOAP_FMAC5 int SOAP_FMAC6 __wsrm__TerminateSequence(struct soap *soap, struct wsrm__TerminateSequenceType *req, struct wsrm__TerminateSequenceResponseType *res) { struct soap_wsrm_sequence *seq; struct soap_wsrm_data *data; char *action; size_t l; DBGFUN("__wsrm__TerminateSequence"); if (soap_wsa_check(soap)) return soap->error; data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (!data) return soap->error = SOAP_PLUGIN_ERROR; data->state = SOAP_WSRM_OFF; /* disable caching */ if (!req) return soap_wsrm_error(soap, NULL, wsrm__WSRMRequired); soap_wsrm_cleanup(soap); MUTEX_LOCK(soap_wsrm_session_lock); seq = soap_wsrm_seq_lookup_ack(req->Identifier); if (!seq) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap_wsrm_error(soap, NULL, wsrm__UnknownSequence); } if (seq->state == SOAP_WSRM_TERMINATED) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap_send_empty_response(soap, 202); } seq->state = SOAP_WSRM_TERMINATED; seq->timestamp = time(NULL); #ifdef SOAP_WSRM_2007 if (req->LastMsgNumber) seq->lastnum = *req->LastMsgNumber; #endif /* DiscardEntireSequence: fail when inbound message sequence is not complete */ if (seq->behavior == DiscardEntireSequence && (seq->recvnum && (!seq->ranges || seq->ranges->lower != 1 || seq->ranges->upper != seq->lastnum))) { soap_wsrm_num_free(soap, seq); soap_wsrm_error(soap, seq, wsrm__SequenceTerminated); MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } #ifdef SOAP_WSRM_2005 res->Identifier = soap_strdup(soap, seq->id); soap->header->wsrm__Sequence = NULL; if (!soap->header->wsrm__SequenceAcknowledgement) { soap->header->wsrm__SequenceAcknowledgement = (struct _wsrm__SequenceAcknowledgement*)soap_malloc(soap, sizeof(struct _wsrm__SequenceAcknowledgement)); if (!soap->header->wsrm__SequenceAcknowledgement) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } } soap->header->__sizeSequenceAcknowledgement = 1; if (soap_wsrm_set_ack(soap, 0, seq, soap->header->wsrm__SequenceAcknowledgement)) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } soap_wsrm_num_free(soap, seq); soap_wsa_add_ReplyTo(soap, seq->to); MUTEX_UNLOCK(soap_wsrm_session_lock); action = soap_strdup(soap, soap->action); return soap_wsa_reply(soap, NULL, action); #else res->Identifier = req->Identifier; soap->header->wsrm__Sequence = NULL; if (!soap->header->wsrm__SequenceAcknowledgement) { soap->header->wsrm__SequenceAcknowledgement = (struct _wsrm__SequenceAcknowledgement*)soap_malloc(soap, sizeof(struct _wsrm__SequenceAcknowledgement)); if (!soap->header->wsrm__SequenceAcknowledgement) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } } soap->header->__sizeSequenceAcknowledgement = 1; if (soap_wsrm_set_ack(soap, 0, seq, soap->header->wsrm__SequenceAcknowledgement)) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } soap_wsrm_num_free(soap, seq); soap_wsa_add_ReplyTo(soap, seq->to); MUTEX_UNLOCK(soap_wsrm_session_lock); l = strlen(soap->action); action = (char*)soap_malloc(soap, l + 9); if (!action) return soap->error; soap_strcpy(action, l + 9, soap->action); soap_strcpy(action + l, 9, "Response"); return soap_wsa_reply(soap, NULL, action); #endif } /******************************************************************************/ /** @fn int __wsrm__TerminateSequenceResponse(struct soap *soap, struct wsrm__TerminateSequenceResponseType *res) @brief WS-RM TerminateSequenceResponse one-way service operation. Automatically invoked by the server to process the terminate sequence response. Updates the server's local sequence state to terminated. @param soap context @param[in] res wsrm__TerminateSequenceResponse response message @return SOAP_OK or error code */ SOAP_FMAC5 int SOAP_FMAC6 __wsrm__TerminateSequenceResponse(struct soap *soap, struct wsrm__TerminateSequenceResponseType *res) { struct soap_wsrm_data *data; DBGFUN("__wsrm__TerminateSequenceResponse"); if (soap_wsa_check(soap)) return soap->error; data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (!data) return soap->error = SOAP_PLUGIN_ERROR; data->state = SOAP_WSRM_OFF; /* disable caching */ if (!res->Identifier || !soap_wsrm_seq_lookup_data(res->Identifier)) return soap_wsrm_error(soap, NULL, wsrm__UnknownSequence); return soap_send_empty_response(soap, 202); } /******************************************************************************/ /** @fn int __wsrm__SequenceAcknowledgement(struct soap *soap) @brief WS-RM SequenceAcknowledgement operation. @param soap context @return SOAP_OK or error code */ SOAP_FMAC5 int SOAP_FMAC6 __wsrm__SequenceAcknowledgement(struct soap *soap) { DBGFUN("__wsrm__SequenceAcknowledgement"); soap_wsrm_cleanup(soap); /* soap_wsrm_preparefinalrecv was called upon invocation, to process acks */ return soap_send_empty_response(soap, 202); } /******************************************************************************/ /** @fn int __wsrm__AckRequested(struct soap *soap) @brief WS-RM AckRequested operation. @param soap context @return SOAP_OK or error code */ SOAP_FMAC5 int SOAP_FMAC6 __wsrm__AckRequested(struct soap *soap) { struct soap_wsrm_sequence *seq = NULL; DBGFUN("__wsrm__AckRequested"); soap_wsrm_cleanup(soap); /* soap_wsrm_preparefinalrecv was called upon invocation, to process acks */ soap_send_empty_response(soap, 202); if (soap->header && soap->header->wsrm__AckRequested) { struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (!data) return soap->error = SOAP_PLUGIN_ERROR; MUTEX_LOCK(soap_wsrm_session_lock); seq = soap_wsrm_seq_lookup_ack(soap->header->wsrm__AckRequested->Identifier); if (seq) { seq->refs++; MUTEX_UNLOCK(soap_wsrm_session_lock); if (soap_wsrm_acknowledgement(soap, seq, NULL)) soap->error = SOAP_OK; soap_wsrm_seq_release(soap, seq); } else MUTEX_UNLOCK(soap_wsrm_session_lock); } return SOAP_OK; } /******************************************************************************/ /** @fn int __wsrm__LastMessage(struct soap *soap) @brief WS-RM LastMessage operation (WS-RM 1.0). @param soap context @return SOAP_OK or error code */ SOAP_FMAC5 int SOAP_FMAC6 __wsrm__LastMessage(struct soap *soap) { struct soap_wsrm_sequence *seq = NULL; DBGFUN("__wsrm__LastMessage"); /* soap_wsrm_preparefinalrecv was called upon invocation, to process acks */ if (soap_wsrm_check_send_empty_response_and_wait(soap, SOAP_WSRM_TIMEOUT)) /* wait */ return soap->error; if (soap->header && soap->header->wsrm__Sequence) { struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (!data) return soap->error = SOAP_PLUGIN_ERROR; MUTEX_LOCK(soap_wsrm_session_lock); seq = soap_wsrm_seq_lookup_ack(soap->header->wsrm__Sequence->Identifier); if (seq) { seq->lastnum = seq->recvnum; seq->refs++; MUTEX_UNLOCK(soap_wsrm_session_lock); if (seq->state == SOAP_WSRM_CREATED) soap_wsrm_close(soap, seq, soap_wsa_rand_uuid(soap)); seq->state = SOAP_WSRM_CLOSED; if (soap_wsrm_acknowledgement(soap, seq, NULL)) soap->error = SOAP_OK; soap_wsrm_seq_release(soap, seq); } else MUTEX_UNLOCK(soap_wsrm_session_lock); } return SOAP_OK; } /******************************************************************************\ * * Server-side SOAP Fault * \******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /** @fn int soap_wsrm_fault_subcode(struct soap *soap, int flag, const char *faultsubcode, const char *faultstring, const char *faultdetail) @brief Sets sender/receiver SOAP Fault (sub)code for server faults (can be user defined faults). When called before soap_wsrm_check() in the server operation, terminates the current sequence. Otherwise, the sequence is not terminated. In either case the fault is returned to sender (client) or to the FaultTo server when the WS-Addressing FaultTo header was set by the sender. @param soap context @param[in] flag 0=receiver, 1=sender @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_fault_subcode(struct soap *soap, int flag, const char *faultsubcode, const char *faultstring, const char *faultdetail) { DBGFUN2("soap_wsrm_fault_subcode", "code=%s", faultsubcode ? faultsubcode : "(null)", "string=%s", faultstring ? faultstring : "(null)"); soap_wsrm_reply_num(soap, 0); if (soap->header && soap->header->wsrm__Sequence && soap->header->wsrm__Sequence->Identifier) { char *id = soap->header->wsrm__Sequence->Identifier; int err = soap_wsa_fault_subcode(soap, flag, faultsubcode, faultstring, faultdetail); soap_faultdetail(soap); if (soap->version == 2) { soap->fault->SOAP_ENV__Detail->__type = SOAP_TYPE__wsrm__Identifier; soap->fault->SOAP_ENV__Detail->fault = (void*)id; } else { soap->fault->detail->__type = SOAP_TYPE__wsrm__Identifier; soap->fault->detail->fault = (void*)id; } return err; } return soap_wsa_fault_subcode(soap, flag, faultsubcode, faultstring, faultdetail); } /******************************************************************************/ /** @fn int soap_wsrm_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) @brief Sets sender SOAP Fault (sub)code for server faults (can be user defined faults). When called before soap_wsrm_check() in the server operation, terminates the current sequence. Otherwise, the sequence is not terminated. In either case the fault is returned to sender (client) or to the FaultTo server when the WS-Addressing FaultTo header was set by the sender. @param soap context @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) { return soap_wsrm_fault_subcode(soap, 1, faultsubcode, faultstring, faultdetail); } /******************************************************************************/ /** @fn int soap_wsrm_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) @brief Sets receiver SOAP Fault (sub)code for server faults (can be user defined faults). When called before soap_wsrm_check() in the server operation, terminates the current sequence. Otherwise, the sequence is not terminated. In either case the fault is returned to sender (client) or to the FaultTo server when the WS-Addressing FaultTo header was set by the sender. @param soap context @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) { return soap_wsrm_fault_subcode(soap, 0, faultsubcode, faultstring, faultdetail); } /******************************************************************************/ /** @fn int soap_wsrm_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail) @brief Sets sender SOAP Fault for server faults (can be user defined faults). When called before soap_wsrm_check() in the server operation, terminates the current sequence. Otherwise, the sequence is not terminated. In either case the fault is returned to sender (client) or to the FaultTo server when the WS-Addressing FaultTo header was set by the sender. @param soap context @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail) { return soap_wsrm_fault_subcode(soap, 1, NULL, faultstring, faultdetail); } /******************************************************************************/ /** @fn int soap_wsrm_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail) @brief Sets receiver SOAP Fault for server faults (can be user defined faults). When called before soap_wsrm_check() in the server operation, terminates the current sequence. Otherwise, the sequence is not terminated. In either case the fault is returned to sender (client) or to the FaultTo server when the WS-Addressing FaultTo header was set by the sender. @param soap context @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail) { return soap_wsrm_fault_subcode(soap, 0, NULL, faultstring, faultdetail); } /******************************************************************************\ * * WS-RM Faults * \******************************************************************************/ /** @fn int soap_wsrm_check_fault(struct soap *soap, enum wsrm__FaultCodes *fault, const char **info) @brief Checks the presence of a WS-RM fault at the client side (or in the FaultTo destination service) when a response is received. @param soap context @param[out] fault code @param[out] info string pointer related to the fault (or NULL) @return SOAP_OK (no fault or not a WS-RM fault) or error when not WS-RM fault */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_check_fault(struct soap *soap, enum wsrm__FaultCodes *fault, const char **info) { if (soap->error && soap->fault && soap->fault->SOAP_ENV__Code) { const char *code = soap_fault_subcode(soap); if (info) *info = soap_fault_detail(soap); if (code) return soap_s2wsrm__FaultCodes(soap, code, fault); } return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsrm_error(struct soap *soap, struct soap_wsrm_sequence *seq, enum wsrm__FaultCodes fault) @brief Sets SOAP Fault (sub)code for server WS-RM fault response. Terminates the sequence. @param soap context @param[in] seq pointer to sequence to terminate or NULL @param[in] fault is one of enum wsrm__FaultCodes enumeration values @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_error(struct soap *soap, struct soap_wsrm_sequence *seq, enum wsrm__FaultCodes fault) { struct soap_wsrm_data *data; const char *code = soap_wsrm__FaultCodes2s(soap, fault); const char *reason = NULL; DBGFUN1("soap_wsrm_error", "code=%s", code ? code : "(null)"); data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (data) data->state = SOAP_WSRM_OFF; /* disable caching */ if (seq) { seq->fault = fault; seq->state = SOAP_WSRM_TERMINATED; } switch (fault) { case wsrm__SequenceTerminated: reason = "The Sequence has been terminated due to an unrecoverable error."; break; case wsrm__UnknownSequence: reason = "The value of the wsrm:Identifier is not a known Sequence identifier."; break; case wsrm__InvalidAcknowledgement: reason = "The SequenceAcknowledgement violates the cumulative Acknowledgement invariant."; break; case wsrm__MessageNumberRollover: reason = "The maximum value for wsrm:MessageNumber has been exceeded."; break; #ifdef SOAP_WSRM_2005 case wsrm__LastMessageNumberExceeded: reason = "The value for wsrm:MessageNumber exceeds the value of the MessageNumber accompanying a LastMessage element in this Sequence."; break; #endif case wsrm__CreateSequenceRefused: reason = "The Create Sequence request has been refused by the RM Destination."; break; #ifdef SOAP_WSRM_2007 case wsrm__SequenceClosed: reason = "The Sequence is closed and cannot accept new messages."; break; #endif case wsrm__WSRMRequired: reason = "The RM Destination requires the use of WSRM."; break; default: break; } soap_header(soap); if (soap->header) { soap_default_SOAP_ENV__Header(soap, soap->header); if (soap->version == 1) { soap_default_SOAP_ENV__Header(soap, soap->header); soap->header->wsrm__SequenceFault = (struct wsrm__SequenceFaultType*)soap_malloc(soap, sizeof(struct wsrm__SequenceFaultType)); if (!soap->header->wsrm__SequenceFault) return soap->error; soap_default_wsrm__SequenceFaultType(soap, soap->header->wsrm__SequenceFault); soap->header->wsrm__SequenceFault->FaultCode = fault; soap->header->wsrm__SequenceFault->Detail = (struct SOAP_ENV__Detail*)soap_malloc(soap, sizeof(struct SOAP_ENV__Detail)); if (soap->header->wsrm__SequenceFault->Detail) { soap_default_SOAP_ENV__Detail(soap, soap->header->wsrm__SequenceFault->Detail); soap->header->wsrm__SequenceFault->Detail->__any = (char*)reason; } } if (seq && !seq->handle) /* server side: need to relay error */ soap_wsa_add_ReplyTo(soap, seq->to); } return soap_wsa_sender_fault_subcode(soap, code, reason, NULL); } /******************************************************************************\ * * WS-RM State Dump * \******************************************************************************/ /** @fn void soap_wsrm_dump(struct soap *soap, FILE *fd) @brief Dumps the current sequences and details of the wsrm plugin for diagnotics purposes. @param soap context @param[in] fd file descriptor to send text to */ SOAP_FMAC1 void SOAP_FMAC2 soap_wsrm_dump(struct soap *soap, FILE *fd) { struct soap_wsrm_sequence *seq; struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); if (!data) return; fprintf(fd, "\n**** %s PLUGIN STATE DUMP ****\n", SOAP_WSRM_ID); MUTEX_LOCK(soap_wsrm_session_lock); for (seq = soap_wsrm_session; seq; seq = seq->next) { struct soap_wsrm_range *r; switch (seq->state) { case SOAP_WSRM_UNKNOWN: fputs("UNKNOWN ", fd); break; case SOAP_WSRM_CREATED: fputs("OPEN ", fd); break; case SOAP_WSRM_CLOSED: fputs("CLOSED ", fd); break; case SOAP_WSRM_TERMINATED: fputs("TERMINATED ", fd); break; default: break; } fprintf(fd, "SEQUENCE %s\n", seq->acksid ? seq->acksid : ""); fprintf(fd, " ID = %s\n", seq->id ? seq->id : "(null)"); fprintf(fd, " TO = %s\n", seq->to ? seq->to : "(null)"); fprintf(fd, " ACKSTO%c = %s\n", seq->ackreq ? '?' : ' ', seq->acksto ? seq->acksto : "(null)"); if (seq->repto) fprintf(fd, " REPLYTO = %s\n", seq->repto); if (seq->channel != SOAP_WSRM_NOCHAN) fprintf(fd, " CHANNEL = %d\n", seq->channel); fprintf(fd, " UPDATED = %s\n", soap_dateTime2s(soap, seq->timestamp)); fprintf(fd, " EXPIRES%c = %s\n", seq->handle ? '!' : ' ', soap_dateTime2s(soap, seq->expires)); fprintf(fd, " BEHAVIOR = %s\n", soap_wsrm__IncompleteSequenceBehaviorType2s(soap, seq->behavior)); if (seq->id) { fprintf(fd, " MESSAGES SENT:\n"); if (seq->state == SOAP_WSRM_CLOSED || seq->state == SOAP_WSRM_TERMINATED) fprintf(fd, " LAST = " SOAP_ULONG_FORMAT "\n", seq->num); else fprintf(fd, " NUM = " SOAP_ULONG_FORMAT "\n", seq->num); if (seq->messages) { char sep = ' '; int nack = 0; struct soap_wsrm_message *p; #ifdef SOAP_WSRM_FAST_ALLOC ULONG64 i; #endif fprintf(fd, " ACKED ="); #ifdef SOAP_WSRM_FAST_ALLOC for (i = 0; i < seq->num; i++) { p = seq->messages[i]; if (!p || p->state == SOAP_WSRM_ACK) { fprintf(fd, "%c" SOAP_ULONG_FORMAT, sep, i + 1); sep = ','; } else if (p->state == SOAP_WSRM_NACK) nack = 1; } #else for (p = seq->messages; p; p = p->next) { if (p->state == SOAP_WSRM_ACK) { fprintf(fd, "%c" SOAP_ULONG_FORMAT, sep, p->num); sep = ','; } else if (p->state == SOAP_WSRM_NACK) nack = 1; } #endif fprintf(fd, "\n"); if (nack) { fprintf(fd, " NACKED ="); sep = ' '; #ifdef SOAP_WSRM_FAST_ALLOC for (i = 0; i < seq->num; i++) { p = seq->messages[i]; if (p && p->state == SOAP_WSRM_NACK) { fprintf(fd, "%c" SOAP_ULONG_FORMAT, sep, i + 1); sep = ','; } } #else for (p = seq->messages; p; p = p->next) { if (p->state == SOAP_WSRM_NACK) { fprintf(fd, "%c" SOAP_ULONG_FORMAT, sep, p->num); sep = ','; } } #endif fprintf(fd, "\n"); } } } if (seq->acksid) { char sep = ' '; fprintf(fd, " MESSAGES RECEIVED:\n"); if (seq->lastnum) fprintf(fd, " LAST = " SOAP_ULONG_FORMAT "\n", seq->lastnum); else fprintf(fd, " NUM = " SOAP_ULONG_FORMAT "\n", seq->recvnum); fprintf(fd, " RANGE ="); for (r = seq->ranges; r; r = r->next) { fprintf(fd, "%c" SOAP_ULONG_FORMAT ":" SOAP_ULONG_FORMAT, sep, r->lower, r->upper); sep = ','; } fprintf(fd, "\n"); } fprintf(fd, "END OF SEQUENCE\n"); } MUTEX_UNLOCK(soap_wsrm_session_lock); } /******************************************************************************\ * * Plugin registry functions * \******************************************************************************/ /** @fn int soap_wsrm(struct soap *soap, struct soap_plugin *p, void *arg) @brief Plugin registry function, used with soap_register_plugin. @param soap context @param[in,out] p plugin created in registry @param[in] arg optional argument passed from soap_register_plugin_arg @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm(struct soap *soap, struct soap_plugin *p, void *arg) { p->id = soap_wsrm_id; /* create local plugin data */ p->data = (void*)SOAP_MALLOC(soap, sizeof(struct soap_wsrm_data)); /* register the copy constructor */ p->fcopy = soap_wsrm_copy; /* register the destructor */ p->fdelete = soap_wsrm_delete; /* if OK then initialize */ if (!p->data) return SOAP_EOM; if (soap_wsrm_init(soap, (struct soap_wsrm_data*)p->data, arg)) { SOAP_FREE(soap, p->data); /* error: could not init */ return SOAP_EOM; /* return error */ } return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsrm_init(struct soap *soap, struct soap_wsrm_data *data, void *arg) @brief Initializes plugin data. @param soap context @param[in,out] data plugin data @param[in] arg optional argument passed from soap_register_plugin_arg @return SOAP_OK */ static int soap_wsrm_init(struct soap *soap, struct soap_wsrm_data *data, void *arg) { if (arg || !*soap_wsrm_idname) { const char *s; if (arg) s = (char*)arg; else s = soap_wsa_rand_uuid(soap); MUTEX_LOCK(soap_wsrm_session_lock); soap_strcpy(soap_wsrm_idname, sizeof(soap_wsrm_idname), s); MUTEX_UNLOCK(soap_wsrm_session_lock); } data->state = SOAP_WSRM_OFF; /* disable caching */ data->seq = NULL; data->msg = NULL; data->fsend = soap->fsend; soap->fsend = soap_wsrm_send; data->fpreparefinalrecv = soap->fpreparefinalrecv; soap->fpreparefinalrecv = soap_wsrm_preparefinalrecv; data->fdisconnect = soap->fdisconnect; soap->fdisconnect = soap_wsrm_disconnect; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsrm_copy(struct soap *soap, struct soap_plugin *p, struct soap_plugin *q) @brief Copy plugin data (private thread data). @param soap context @param[out] p plugin @param[in] q plugin @return SOAP_OK */ static int soap_wsrm_copy(struct soap *soap, struct soap_plugin *p, struct soap_plugin *q) { (void)soap; /* create local plugin data */ p->data = (void*)SOAP_MALLOC(soap, sizeof(struct soap_wsrm_data)); if (!p->data) return SOAP_EOM; (void)soap_memcpy((void*)p->data, sizeof(struct soap_wsrm_data), (const void*)q->data, sizeof(struct soap_wsrm_data)); ((struct soap_wsrm_data*)p->data)->state = SOAP_WSRM_OFF; ((struct soap_wsrm_data*)p->data)->seq = NULL; ((struct soap_wsrm_data*)p->data)->msg = NULL; return SOAP_OK; } /******************************************************************************/ /** @fn void soap_wsrm_delete(struct soap *soap, struct soap_plugin *p) @brief Deletes plugin data. @param soap context @param[in,out] p plugin @return SOAP_OK */ static void soap_wsrm_delete(struct soap *soap, struct soap_plugin *p) { (void)soap; SOAP_FREE(soap, p->data); } /******************************************************************************\ * * Callbacks registered by plugin * \******************************************************************************/ /** @fn int soap_wsrm_send(struct soap *soap, const char *buf, size_t len) @brief Internal callback function to override fsend(). When the wsrm plugin is enabled, saves the message to the current sequence that is created at the client side. Allows unacknowledged messages to be resend with soap_wsrm_resend(). @param soap context @param[in] buf message data @param[in] len message data length @return SOAP_OK or error code */ static int soap_wsrm_send(struct soap *soap, const char *buf, size_t len) { struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_wsrm_send state=%d\n", data ? data->state : 0)); if (data && data->state == SOAP_WSRM_ON) if (soap_wsrm_msg_append(soap, data, buf, len)) return soap->error; return data->fsend(soap, buf, len); /* pass data on to next send callback */ } /******************************************************************************/ /** @fn int soap_wsrm_preparefinalrecv(struct soap *soap) @brief Internal callback function to override fpreparefinalrecv(). Takes acks returned by response to update the states of the sequences with acknowledgements. Acknowledged messages do not have to be resend and are purged from the sequence states. Also checks if at client-side response message was already received and otherwise records it in the state. @param soap context @return SOAP_OK or error code */ static int soap_wsrm_preparefinalrecv(struct soap *soap) { struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); DBGFUN("soap_wsrm_preparefinalrecv"); #if 0 /* (optional) record service response message num for acks (client side) */ if (soap->header && soap->header->wsrm__Sequence) { struct soap_wsrm_sequence *seq; seq = soap_wsrm_seq_lookup_ack(soap->header->wsrm__Sequence->Identifier); if (seq) { if (soap_wsrm_num_lookup(soap, seq, soap->header->wsrm__Sequence->MessageNumber)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Response message already received\n")); return soap->error = SOAP_STOP; } if (seq->behavior == DiscardFollowingFirstGap && soap->header->wsrm__Sequence->MessageNumber != seq->recvnum + 1) return soap_wsrm_error(soap, seq, wsrm__SequenceClosed); /* close or term */ seq->recvnum = soap->header->wsrm__Sequence->MessageNumber; if (soap_wsrm_num_insert(soap, seq, seq->recvnum)) return soap->error; } } #endif if (soap->header && soap->header->wsrm__SequenceAcknowledgement) { int i; for (i = 0; i < soap->header->__sizeSequenceAcknowledgement; i++) { if (soap_wsrm_process_ack(soap, &soap->header->wsrm__SequenceAcknowledgement[i])) return soap->error; } } if (data->fpreparefinalrecv) return data->fpreparefinalrecv(soap); return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsrm_disconnect(struct soap *soap) @brief Internal callback function to override fdisconnect(). Turns caching off, sets the cached message to NACK, and resets the server-side handle, so sequence can be deallocated later. @param soap context @return SOAP_OK or error code */ static int soap_wsrm_disconnect(struct soap *soap) { struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); DBGFUN("soap_wsrm_disconnect"); if (!data || (data->fdisconnect && data->fdisconnect(soap))) return soap->error; if (data->seq && data->seq->refs) data->seq->refs--; data->seq = NULL; if (data->msg) { if (data->msg->list) { data->state = SOAP_WSRM_OFF; /* disable caching */ data->msg = NULL; } } return SOAP_OK; } /******************************************************************************\ * * Process Acknowledgements * \******************************************************************************/ /** @fn int soap_wsrm_process_ack(struct soap *soap, struct _wsrm__SequenceAcknowledgement *ack) @brief Internal function to purge acknowledged messages as given by wsrm:SequenceAcknowledgement header. @param soap context @param[in] ack from the WS-RM SequenceAcknowledgement header. @return SOAP_OK or error code */ static int soap_wsrm_process_ack(struct soap *soap, struct _wsrm__SequenceAcknowledgement *ack) { struct soap_wsrm_sequence *seq; struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); DBGFUN1("soap_wsrm_process_ack", "ack id=%s", ack->Identifier ? ack->Identifier : "none"); if (!data) return soap->error = SOAP_PLUGIN_ERROR; MUTEX_LOCK(soap_wsrm_session_lock); seq = soap_wsrm_seq_lookup_data(ack->Identifier); if (!seq) { /* unknown old sequence should be ignored */ MUTEX_UNLOCK(soap_wsrm_session_lock); return SOAP_OK; } /* if Final no new message allowed (resends OK) */ if (ack->Final) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Final\n")); /* sequence is closed, so soap_wsrm_request() fails anyway */ } /* process Nack */ if (ack->__sizeNack) { int i; for (i = 0; i < ack->__sizeNack; i++) { struct soap_wsrm_message *p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Nack=" SOAP_ULONG_FORMAT "\n", ack->Nack[i])); if (ack->Nack[i] == 0 || ack->Nack[i] > seq->num) { soap_wsrm_error(soap, seq, wsrm__InvalidAcknowledgement); MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } #ifdef SOAP_WSRM_FAST_ALLOC if (seq->messages) { p = seq->messages[ack->Nack[i] - 1]; if (p) p->state = SOAP_WSRM_NACK; } #else for (p = seq->messages; p; p = p->next) { if (p->num == ack->Nack[i]) p->state = SOAP_WSRM_NACK; } #endif } } else if (!ack->None) /* else free acked messages, unless None */ { if (seq->messages) { int i; for (i = 0; i < ack->__sizeAcknowledgementRange; i++) { ULONG64 lo = ack->AcknowledgementRange[i].Lower; ULONG64 hi = ack->AcknowledgementRange[i].Upper; if (lo == 0 || hi > seq->num) { soap_wsrm_error(soap, seq, wsrm__InvalidAcknowledgement); MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } else { #ifdef SOAP_WSRM_FAST_ALLOC ULONG64 j; for (j = lo; j <= hi; j++) { struct soap_wsrm_message *p = seq->messages[j - 1]; if (p) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Ack=" SOAP_ULONG_FORMAT "\n", j)); soap_wsrm_msg_free(soap, p); free((void*)p); seq->messages[j - 1] = NULL; } } #else struct soap_wsrm_message *p, **q = &seq->messages; for (p = seq->messages; p && p->num <= hi; p = *q) { if (lo <= p->num) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Ack=" SOAP_ULONG_FORMAT "\n", p->num)); *q = p->next; soap_wsrm_msg_free(soap, p); free((void*)p); } else q = &p->next; } #endif } } #ifndef SOAP_WSRM_FAST_ALLOC if (!seq->messages) seq->messageslast = NULL; #endif } } MUTEX_UNLOCK(soap_wsrm_session_lock); return SOAP_OK; } /******************************************************************************\ * * Check and Add/Send Acknowledgements * \******************************************************************************/ /** @fn int soap_wsrm_chk_acks(struct soap *soap) @brief Internal function to check for AckRequested headers to update state. @param soap context @return SOAP_OK or error code */ static int soap_wsrm_chk_acks(struct soap *soap) { DBGFUN("soap_wsrm_chk_acks"); if (!soap->header) return SOAP_OK; if (soap->header->__sizeAckRequested) { int i; for (i = 0; i < soap->header->__sizeAckRequested; i++) { struct soap_wsrm_sequence *seq; MUTEX_LOCK(soap_wsrm_session_lock); seq = soap_wsrm_seq_lookup_ack(soap->header->wsrm__AckRequested[i].Identifier); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Ack requested for %s\n", soap->header->wsrm__AckRequested[i].Identifier)); if (seq) seq->ackreq = 1; MUTEX_UNLOCK(soap_wsrm_session_lock); } } return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsrm_add_acks(struct soap *soap, struct soap_wsrm_sequence *seq, ULONG64 nack, int all, int piggy) @brief Internal function to add SequenceAcknowledgement headers for AckRequested. When piggy==0 or internal AcksTo destination is set, sends acknowledgements to the AcksTo destination service or back to the source related to the seq. These sends can take time, which can be controlled with the soap context connect_timeout, send_timeout, recv_timeout settings. @param soap context @param[in] seq pointer to sequence @param[in] nack num of nack message, 0 to generate acks @param[in] all when true always include all acks @param[in] piggy when true add acks to message to be send @return SOAP_OK or error code */ static int soap_wsrm_add_acks(struct soap *soap, struct soap_wsrm_sequence *seq, ULONG64 nack, int all, int piggy) { int numack = 0; DBGFUN3("soap_wsrm_add_acks", "nack=%ld", (unsigned long)nack, "all=%d", all, "piggy=%d", piggy); soap_header(soap); if (!soap->header) return soap->error; soap->header->__sizeSequenceAcknowledgement = 0; soap->header->wsrm__SequenceAcknowledgement = NULL; soap->header->wsrm__SequenceFault = NULL; seq->timestamp = time(NULL); MUTEX_LOCK(soap_wsrm_session_lock); #ifdef SOAP_WSA_2005 /* Add WCF ChannelInstance */ if (seq->channel != SOAP_WSRM_NOCHAN) { if (!soap->header->chan__ChannelInstance) soap->header->chan__ChannelInstance = (struct chan__ChannelInstanceType*)soap_malloc(soap, sizeof(struct chan__ChannelInstanceType)); if (!soap->header->chan__ChannelInstance) return soap->error; soap->header->chan__ChannelInstance->__item = seq->channel; soap->header->chan__ChannelInstance->SOAP_WSA(IsReferenceParameter) = SOAP_WSA_(,IsReferenceParameter__true); } #endif if (piggy && seq->recvnum && seq->acksto && strcmp(seq->acksto, soap_wsa_anonymousURI) && strcmp(seq->acksto, soap_wsa_noneURI) && (!seq->to || strcmp(seq->acksto, seq->to))) piggy = 0; /* always add ack if nack or all or when we received a message and we can piggy back the acks */ if (nack || all || (piggy && seq->recvnum)) seq->ackreq = 1; /* add acks of other sequences with the same acksto address (WCF is not agreeable here) */ #ifdef WITH_WCF if (!piggy) #endif if (seq->acksto && strcmp(seq->acksto, soap_wsa_anonymousURI)) { struct soap_wsrm_sequence *q; for (q = soap_wsrm_session; q; q = q->next) { if (q != seq && q->acksto && q->ackreq && q->recvnum && !strcmp(q->acksto, seq->acksto)) numack++; } } if (seq->ackreq && seq->recvnum) numack++; if (numack) { struct soap_wsrm_sequence *q; int num = 0; struct _wsrm__SequenceAcknowledgement *ack; ack = (struct _wsrm__SequenceAcknowledgement*)soap_malloc(soap, numack * sizeof(struct _wsrm__SequenceAcknowledgement)); if (!ack) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } if (seq->recvnum) { if (soap_wsrm_set_ack(soap, nack, seq, ack)) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } num++; } #ifdef WITH_WCF if (!piggy) #endif for (q = soap_wsrm_session; q && num < numack; q = q->next) { if (q != seq && q->acksto && q->ackreq && q->recvnum && !strcmp(q->acksto, seq->acksto)) { if (soap_wsrm_set_ack(soap, 0, q, &ack[num])) { MUTEX_UNLOCK(soap_wsrm_session_lock); return soap->error; } q->ackreq = 0; num++; } } MUTEX_UNLOCK(soap_wsrm_session_lock); /* for each ack requested, send ack */ if (!piggy) { int retry; const char *acksto; struct soap *acksto_soap = soap_copy(soap); struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending ack/nack for seq %s to %s\n", seq->id, seq->acksto)); if (!data) return soap->error = SOAP_PLUGIN_ERROR; acksto_soap->socket = SOAP_INVALID_SOCKET; if (!acksto_soap->connect_timeout) acksto_soap->connect_timeout = SOAP_WSRM_TIMEOUT; if (!acksto_soap->recv_timeout) acksto_soap->recv_timeout = SOAP_WSRM_TIMEOUT; if (!acksto_soap->send_timeout) acksto_soap->send_timeout = SOAP_WSRM_TIMEOUT; acksto_soap->header = NULL; soap_header(acksto_soap); soap_default_SOAP_ENV__Header(acksto_soap, acksto_soap->header); acksto_soap->header->__sizeSequenceAcknowledgement = num; acksto_soap->header->wsrm__SequenceAcknowledgement = ack; #ifdef SOAP_WSA_2005 /* Add WCF ChannelInstance */ acksto_soap->header->chan__ChannelInstance = soap->header->chan__ChannelInstance; #endif acksto = seq->acksto; if (!acksto || !strcmp(acksto, soap_wsa_anonymousURI)) acksto = seq->to; if (acksto && strcmp(acksto, soap_wsa_anonymousURI) && strcmp(acksto, soap_wsa_noneURI)) { soap_wsa_request(acksto_soap, NULL, acksto, SOAP_NAMESPACE_OF_wsrm"/SequenceAcknowledgement"); if (soap->header->wsa5__FaultTo && soap->header->wsa5__FaultTo->Address) soap_wsa_add_FaultTo(acksto_soap, soap->header->wsa5__FaultTo->Address); else soap_wsa_add_FaultTo(acksto_soap, soap_wsa_noneURI); data->state = SOAP_WSRM_OFF; /* disable caching */ /* send, retry when HTTP 307 at most 10 times */ retry = 10; while (soap_send___wsrm__SequenceAcknowledgement(acksto_soap, acksto, NULL) || soap_recv_empty_response(acksto_soap)) { if (acksto_soap->error != 307 || retry-- == 0) break; acksto = soap_strdup(acksto_soap, acksto_soap->endpoint); } soap->error = acksto_soap->error; soap->errnum = acksto_soap->errnum; } soap_end(acksto_soap); soap_free(acksto_soap); } else if (num) { soap->header->__sizeSequenceAcknowledgement = num; soap->header->wsrm__SequenceAcknowledgement = ack; soap->header->wsa5__Action = (char*)SOAP_NAMESPACE_OF_wsrm"/SequenceAcknowledgement"; } } else MUTEX_UNLOCK(soap_wsrm_session_lock); return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsrm_set_ack(struct soap *soap, ULONG64 nack, struct soap_wsrm_sequence *seq, struct _wsrm__SequenceAcknowledgement *ack) @brief Internal function called by soap_wsrm_add_acks() to populate the SequenceAcknowledgement header block. @param soap context @param[in] nack num of message to nack, 0 to pupulate ack with ranges from seq @param[in] seq pointer to sequence @param[out] ack pointer to SequenceAcknowledgement to populate @brief */ static int soap_wsrm_set_ack(struct soap *soap, ULONG64 nack, struct soap_wsrm_sequence *seq, struct _wsrm__SequenceAcknowledgement *ack) { DBGFUN("soap_wsrm_set_ack"); soap_default__wsrm__SequenceAcknowledgement(soap, ack); ack->Identifier = soap_strdup(soap, seq->acksid); if (nack) { ack->__sizeNack = 1; ack->Nack = (ULONG64*)soap_malloc(soap, sizeof(ULONG64)); if (!ack->Nack) return soap->error; *ack->Nack = nack; } else { ack->__sizeAcknowledgementRange = soap_wsrm_num_size(seq); if (ack->__sizeAcknowledgementRange == 0) { ack->AcknowledgementRange = NULL; #ifdef SOAP_WSRM_2007 ack->None = (struct _wsrm__SequenceAcknowledgement_None*)soap_malloc(soap, sizeof(struct _wsrm__SequenceAcknowledgement_None)); if (!ack->None) return soap->error; soap_default__wsrm__SequenceAcknowledgement_None(soap, ack->None); #endif } else { struct soap_wsrm_range *p; struct _wsrm__SequenceAcknowledgement_AcknowledgementRange *q; ack->AcknowledgementRange = (struct _wsrm__SequenceAcknowledgement_AcknowledgementRange*)soap_malloc(soap, ack->__sizeAcknowledgementRange * sizeof(struct _wsrm__SequenceAcknowledgement_AcknowledgementRange)); if (!ack->AcknowledgementRange) return soap->error; soap_default__wsrm__SequenceAcknowledgement_AcknowledgementRange(soap, ack->AcknowledgementRange); for (p = seq->ranges, q = ack->AcknowledgementRange; p; p = p->next, q++) { q->Lower = p->lower; q->Upper = p->upper; } } #ifdef SOAP_WSRM_2007 /* if terminated, set Final */ if (seq->state == SOAP_WSRM_TERMINATED) { ack->Final = (struct _wsrm__SequenceAcknowledgement_Final*)soap_malloc(soap, sizeof(struct _wsrm__SequenceAcknowledgement_Final)); if (!ack->Final) return soap->error; soap_default__wsrm__SequenceAcknowledgement_Final(soap, ack->Final); } #endif } ack->netrm__BufferRemaining = NULL; #ifdef WITH_WCF_SIM /* simulated WCF netrm BufferRemaining */ ack->netrm__BufferRemaining = (int*)soap_malloc(soap, sizeof(int)); if (ack->netrm__BufferRemaining) *ack->netrm__BufferRemaining = 8; /* should be set as desired */ #endif return SOAP_OK; } /******************************************************************************/ #if 0 /* unused */ /** @fn int soap_wsrm_post(struct soap *soap, const char *endpoint, const char *host, int port, const char *path, const char *action, size_t count) @brief Internal callback overrides the HTTP post operations to send an HTTP OK response header in place. @param soap context @param endpoint (not used) @param host (not used) @param port (not used) @param path (not used) @param action (HTTP action not used) @param count message length (if non-chunked) */ static int soap_wsrm_post(struct soap *soap, const char *endpoint, const char *host, int port, const char *path, const char *action, size_t count) { return soap->fresponse(soap, SOAP_OK, count); } #endif /******************************************************************************\ * * WS-RM Resend * \******************************************************************************/ /** @fn int soap_wsrm_resend_seq(struct soap *soap, struct soap_wsrm_sequence *seq, int all, ULONG64 lower, ULONG64 upper) @brief Internal function to resend unacknowledged messages of a sequence given a range of message numbers. Used by soap_wsrm_resend(). @param soap context @param seq sequence handle set by soap_wsrm_create() or soap_wsrm_create_offer() @param[in] all 1= resend all unacknowledged messages (not just the nacked messages) @param[in] lower resend message range lower bound (0 for lowest) @param[in] upper resend message range upper bound (or 0 for infinite) @return SOAP_OK or error code (can be ignored to continue sequence) */ static int soap_wsrm_resend_seq(struct soap *soap, struct soap_wsrm_sequence *seq, int all, ULONG64 lower, ULONG64 upper) { #ifdef SOAP_WSRM_FAST_ALLOC ULONG64 i; struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); DBGFUN2("soap_wsrm_resend_seq", "lower=" SOAP_ULONG_FORMAT, lower, "upper=" SOAP_ULONG_FORMAT, upper); if (!data) return soap->error = SOAP_PLUGIN_ERROR; if (!seq->to || !seq->num || !seq->messages || seq->state == SOAP_WSRM_TERMINATED) return SOAP_OK; data->state = SOAP_WSRM_OFF; /* disable caching */ if (upper == 0) upper = seq->num; if (lower == 0) lower = 1; for (i = lower; i <= upper; i++) { struct soap_wsrm_message *p = seq->messages[i - 1]; if (p && ((all && p->state != SOAP_WSRM_ACK) || p->state == SOAP_WSRM_NACK) && p->list) /* not acked */ { struct soap_wsrm_content *q; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resending message " SOAP_ULONG_FORMAT "\n", i)); soap->omode |= SOAP_ENC_PLAIN; /* disables HTTP */ if (soap_connect(soap, seq->to, NULL)) return soap->error; DBGLOG(SENT, SOAP_MESSAGE(fdebug, "\n==== BEGIN RESEND ====\n")); for (q = p->list; q; q = q->next) { if (q->buf) { DBGMSG(SENT, q->buf, q->len); if (data->fsend(soap, q->buf, q->len)) return soap->error; } } if (soap_end_send(soap)) return soap_closesock(soap); DBGLOG(SENT, SOAP_MESSAGE(fdebug, "\n==== END RESEND ====\n")); soap->omode &= ~SOAP_ENC_PLAIN; /* reenables HTTP */ if (!soap_begin_recv(soap)) soap_ignore_element(soap); /* read content but ignore */ else if (soap->error != SOAP_NO_DATA && soap->error != 202) return soap_closesock(soap); soap_end_recv(soap); soap_closesock(soap); } } #else struct soap_wsrm_message *p; struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); DBGFUN2("soap_wsrm_resend_seq", "lower=" SOAP_ULONG_FORMAT, lower, "upper=" SOAP_ULONG_FORMAT, upper); if (!data) return soap->error = SOAP_PLUGIN_ERROR; if (!seq->to || seq->state == SOAP_WSRM_TERMINATED) return SOAP_OK; data->state = SOAP_WSRM_OFF; /* disable caching */ for (p = seq->messages; p; p = p->next) { if (p->num >= lower && (upper == 0 || p->num <= upper)) { if (((all && p->state != SOAP_WSRM_ACK) || p->state == SOAP_WSRM_NACK) && p->list) /* not acked */ { struct soap_wsrm_content *q; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resending message " SOAP_ULONG_FORMAT "\n", p->num)); soap->omode |= SOAP_ENC_PLAIN; /* disables HTTP */ if (soap_connect(soap, seq->to, NULL)) return soap->error; DBGLOG(SENT, SOAP_MESSAGE(fdebug, "\n==== BEGIN RESEND ====\n")); for (q = p->list; q; q = q->next) { DBGMSG(SENT, q->buf, q->len); if (data->fsend(soap, q->buf, q->len)) return soap->error; } if (soap_end_send(soap)) return soap_closesock(soap); DBGLOG(SENT, SOAP_MESSAGE(fdebug, "\n==== END RESEND ====\n")); soap->omode &= ~SOAP_ENC_PLAIN; /* reenables HTTP */ if (!soap_begin_recv(soap)) soap_ignore_element(soap); /* read content but ignore */ else if (soap->error != SOAP_NO_DATA && soap->error != 202) return soap_closesock(soap); soap_end_recv(soap); soap_closesock(soap); } } } #endif return SOAP_OK; } /******************************************************************************\ * * Sequences * \******************************************************************************/ /** @fn const char *soap_wsrm_seq_newid(struct soap *soap) @brief Internal function to generate a new sequence identifier. @param soap context @return sequence identifier string */ static const char * soap_wsrm_seq_newid(struct soap *soap) { size_t l = strlen(soap_wsrm_idname); char *id = (char*)malloc(l + 9); if (!id) { soap->error = SOAP_EOM; return NULL; } (SOAP_SNPRINTF(id, l + 9, l + 8), "%s%8.8x", soap_wsrm_idname, soap_wsrm_idnum++); return id; } /******************************************************************************/ /** @fn struct soap_wsrm_sequence *soap_wsrm_seq_lookup_id(struct soap *soap, const char *id) @brief Function to look up sequence given its id. @param soap context @param[in] id identifier string @return sequence handle, must be released with @ref soap_wsrm_seq_release when no longer used */ SOAP_FMAC1 struct soap_wsrm_sequence * SOAP_FMAC2 soap_wsrm_seq_lookup_id(struct soap *soap, const char *id) { struct soap_wsrm_data *data = (struct soap_wsrm_data*)soap_lookup_plugin(soap, soap_wsrm_id); struct soap_wsrm_sequence *seq = NULL; if (data) { MUTEX_LOCK(soap_wsrm_session_lock); seq = soap_wsrm_seq_lookup_data(id); if (seq) seq->refs++; MUTEX_UNLOCK(soap_wsrm_session_lock); } return seq; } /******************************************************************************/ /** @fn void soap_wsrm_seq_insert_data(struct soap_wsrm_sequence *seq) @brief Internal function to insert seq id in hash table for fast lookup. @param[in] seq sequence */ static void soap_wsrm_seq_insert_data(struct soap_wsrm_sequence *seq) { (void)seq; #ifdef SOAP_WSRM_FAST_LOOKUP if (seq->id) { struct soap_wsrm_hash_id *p; size_t i, h = soap_hash(seq->id); for (p = soap_wsrm_hash_id[h]; p; p = p->next) { for (i = 0; i < SOAP_WSRM_IDHASH_BLK; i++) { if (!p->seq[i]) { p->seq[i] = seq; return; } } } p = soap_wsrm_hash_id[h]; soap_wsrm_hash_id[h] = (struct soap_wsrm_hash_id*)malloc(sizeof(struct soap_wsrm_hash_id)); soap_wsrm_hash_id[h]->next = p; soap_wsrm_hash_id[h]->seq[0] = seq; for (i = 1; i < SOAP_WSRM_IDHASH_BLK; i++) soap_wsrm_hash_id[h]->seq[i] = NULL; } #endif } /******************************************************************************/ /** @fn void soap_wsrm_seq_delete_data(struct soap_wsrm_sequence *seq) @brief Internal function to delete seq id from hash table. @param[in] seq sequence */ static void soap_wsrm_seq_delete_data(struct soap_wsrm_sequence *seq) { (void)seq; #ifdef SOAP_WSRM_FAST_LOOKUP if (seq && seq->id) { struct soap_wsrm_hash_id *p; size_t i, h = soap_hash(seq->id); for (p = soap_wsrm_hash_id[h]; p; p = p->next) { for (i = 0; i < SOAP_WSRM_IDHASH_BLK; i++) { if (seq == p->seq[i]) { p->seq[i] = NULL; return; } } } } else { struct soap_wsrm_hash_id *p, *q; size_t h; for (h = 0; h < SOAP_IDHASH; h++) { for (p = soap_wsrm_hash_id[h]; p; p = q) { q = p->next; free((void*)p); } } } #endif } /******************************************************************************/ /** @fn struct soap_wsrm_sequence *soap_wsrm_seq_lookup_data(const char *id) @brief Internal function to look up sequence given its id. @param[in] id identifier string @return sequence or NULL */ static struct soap_wsrm_sequence * soap_wsrm_seq_lookup_data(const char *id) { #ifdef SOAP_WSRM_FAST_LOOKUP if (id) { struct soap_wsrm_hash_id *p; size_t i, h = soap_hash(id); for (p = soap_wsrm_hash_id[h]; p; p = p->next) { for (i = 0; i < SOAP_WSRM_IDHASH_BLK; i++) { if (p->seq[i] && !strcmp(p->seq[i]->id, id)) return p->seq[i]; } } } #else if (id) { struct soap_wsrm_sequence *p; for (p = soap_wsrm_session; p; p = p->next) if (p->id && !strcmp(p->id, id)) return p; } #endif return NULL; } /******************************************************************************/ /** @fn struct soap_wsrm_sequence *soap_wsrm_seq_lookup(struct soap *soap, const char *id) @brief Function to look up sequence given its id. @param soap context @param[in] id identifier string @return sequence handle, must be released with @ref soap_wsrm_seq_release when no longer used */ SOAP_FMAC1 struct soap_wsrm_sequence * SOAP_FMAC2 soap_wsrm_seq_lookup(struct soap *soap, const char *id) { struct soap_wsrm_sequence *seq = NULL; (void)soap; MUTEX_LOCK(soap_wsrm_session_lock); seq = soap_wsrm_seq_lookup_ack(id); if (seq) seq->refs++; MUTEX_UNLOCK(soap_wsrm_session_lock); return seq; } /******************************************************************************/ /** @fn void soap_wsrm_seq_insert_ack(struct soap_wsrm_sequence *seq) @brief Internal function to insert acksid for fast lookup. @param[in] seq sequence */ static void soap_wsrm_seq_insert_ack(struct soap_wsrm_sequence *seq) { (void)seq; #ifdef SOAP_WSRM_FAST_LOOKUP if (seq->acksid) { struct soap_wsrm_hash_id *p; size_t i, h = soap_hash(seq->acksid); for (p = soap_wsrm_hash_acksid[h]; p; p = p->next) { for (i = 0; i < SOAP_WSRM_IDHASH_BLK; i++) { if (!p->seq[i]) { p->seq[i] = seq; return; } } } p = soap_wsrm_hash_acksid[h]; soap_wsrm_hash_acksid[h] = (struct soap_wsrm_hash_id*)malloc(sizeof(struct soap_wsrm_hash_id)); soap_wsrm_hash_acksid[h]->next = p; soap_wsrm_hash_acksid[h]->seq[0] = seq; for (i = 1; i < SOAP_WSRM_IDHASH_BLK; i++) soap_wsrm_hash_acksid[h]->seq[i] = NULL; } #endif } /******************************************************************************/ /** @fn void soap_wsrm_seq_delete_ack(struct soap_wsrm_sequence *seq) @brief Internal function to delete acksid for fast lookup. @param[in] seq sequence */ static void soap_wsrm_seq_delete_ack(struct soap_wsrm_sequence *seq) { (void)seq; #ifdef SOAP_WSRM_FAST_LOOKUP if (seq && seq->acksid) { struct soap_wsrm_hash_id *p; size_t i, h = soap_hash(seq->acksid); for (p = soap_wsrm_hash_acksid[h]; p; p = p->next) { for (i = 0; i < SOAP_WSRM_IDHASH_BLK; i++) { if (seq == p->seq[i]) { p->seq[i] = NULL; return; } } } } else { struct soap_wsrm_hash_id *p, *q; size_t h; for (h = 0; h < SOAP_IDHASH; h++) { for (p = soap_wsrm_hash_acksid[h]; p; p = q) { q = p->next; free((void*)p); } } } #endif } /******************************************************************************/ /** @fn struct soap_wsrm_sequence *soap_wsrm_seq_lookup_ack(const char *id) @brief Internal function to look up sequence given its acksid. @param[in] id identifier string @return sequence or NULL */ static struct soap_wsrm_sequence * soap_wsrm_seq_lookup_ack(const char *id) { #ifdef SOAP_WSRM_FAST_LOOKUP if (id) { struct soap_wsrm_hash_id *p; size_t i, h = soap_hash(id); for (p = soap_wsrm_hash_acksid[h]; p; p = p->next) { for (i = 0; i < SOAP_WSRM_IDHASH_BLK; i++) { if (p->seq[i] && !strcmp(p->seq[i]->acksid, id)) return p->seq[i]; } } } #else if (id) { struct soap_wsrm_sequence *p; for (p = soap_wsrm_session; p; p = p->next) if (p->acksid && !strcmp(p->acksid, id)) return p; } #endif return NULL; } /******************************************************************************/ /** @fn struct soap_wsrm_sequence *soap_wsrm_seq_insert(struct soap *soap) @brief Internal function to create a new local sequence state. @param soap context @return sequence or NULL */ static struct soap_wsrm_sequence * soap_wsrm_seq_insert(struct soap *soap) { struct soap_wsrm_sequence *seq; seq = (struct soap_wsrm_sequence*)malloc(sizeof(struct soap_wsrm_sequence)); if (!seq) { soap->error = SOAP_EOM; return NULL; } seq->handle = 0; seq->refs = 0; seq->id = NULL; seq->acksid = NULL; seq->to = NULL; seq->repto = NULL; seq->acksto = NULL; seq->timestamp = time(NULL); seq->expires = seq->timestamp + SOAP_WSRM_MAX_SEC_TO_EXPIRE; seq->behavior = NoDiscard; seq->num = 0; seq->recvnum = 0; seq->lastnum = 0; seq->fault = (enum wsrm__FaultCodes)(-1); seq->state = SOAP_WSRM_NONE; seq->retry = 0; seq->messages = NULL; #ifndef SOAP_WSRM_FAST_ALLOC seq->messageslast = NULL; #endif seq->ranges = NULL; seq->next = soap_wsrm_session; seq->channel = SOAP_WSRM_NOCHAN; soap_wsrm_session = seq; return seq; } /******************************************************************************/ /** @fn int soap_wsrm_msg_append(struct soap *soap, struct soap_wsrm_data *data, const char *buf, size_t len) @brief Internal function used by soap_wsrm_send() to append message data to the current message being transmitted in the current sequence. @param soap context @param data plugin @param[in] buf message data @param[in] len message data length @return SOAP_OK or error code */ static int soap_wsrm_msg_append(struct soap *soap, struct soap_wsrm_data *data, const char *buf, size_t len) { struct soap_wsrm_content *p; DBGFUN1("soap_wsrm_msg_append", "len=%lu", (unsigned long)len); if (!data->msg) return SOAP_OK; p = (struct soap_wsrm_content*)malloc(sizeof(struct soap_wsrm_content)); if (!p) return soap->error = SOAP_EOM; p->buf = (char*)malloc(len); if (!p->buf) { free((void*)p); return soap->error = SOAP_EOM; } p->len = len; (void)soap_memcpy((void*)p->buf, len, (const void*)buf, len); p->next = NULL; if (!data->msg->list) data->msg->list = p; if (data->msg->last) data->msg->last->next = p; data->msg->last = p; return SOAP_OK; } /******************************************************************************/ /** @fn struct soap_wsrm_sequence *soap_wsrm_seq(struct soap *soap) @brief Assuming a SOAP header is received, gets the sequence associated with the message. @param soap context @return sequence handle, must be released with @ref soap_wsrm_seq_release when no longer used */ SOAP_FMAC1 struct soap_wsrm_sequence * SOAP_FMAC2 soap_wsrm_seq(struct soap *soap) { struct soap_wsrm_sequence *seq = NULL; DBGFUN("soap_wsrm_seq"); if (soap->header && soap->header->wsrm__Sequence) seq = soap_wsrm_seq_lookup(soap, soap->header->wsrm__Sequence->Identifier); return seq; } /******************************************************************************/ /** @fn void soap_wsrm_seq_release(struct soap *soap, struct soap_wsrm_sequence *seq) @brief Releases handle @param soap context @param seq sequence handle */ SOAP_FMAC1 void SOAP_FMAC2 soap_wsrm_seq_release(struct soap *soap, struct soap_wsrm_sequence *seq) { (void)soap; DBGFUN("soap_wsrm_seq_release"); MUTEX_LOCK(soap_wsrm_session_lock); if (seq && seq->refs) seq->refs--; MUTEX_UNLOCK(soap_wsrm_session_lock); } /******************************************************************************/ /** @fn int soap_wsrm_seq_created(struct soap *soap, struct soap_wsrm_sequence *seq) @brief Function to check if a sequence is created. @param soap context @param seq pointer to sequence @return 0 (not created) or 1 (created) */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_seq_created(struct soap *soap, struct soap_wsrm_sequence *seq) { (void)soap; DBGFUN("soap_wsrm_seq_created"); if (!seq || seq->state != SOAP_WSRM_CREATED) return 0; if (seq->expires && seq->expires < time(NULL)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sequence %s has expired\n", seq->id ? seq->id : "(null)")); seq->state = SOAP_WSRM_TERMINATED; return 0; } return 1; } /******************************************************************************/ /** @fn int soap_wsrm_seq_valid(struct soap *soap, struct soap_wsrm_sequence *seq) @brief Function to check if a sequence is not valid, terminated, or needs to be terminated when expired. @param soap context @param seq pointer to sequence @return 0 (invalid) or 1 (valid) */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsrm_seq_valid(struct soap *soap, struct soap_wsrm_sequence *seq) { (void)soap; DBGFUN("soap_wsrm_seq_valid"); if (!seq || (seq->state != SOAP_WSRM_CREATED && seq->state != SOAP_WSRM_CLOSED)) return 0; if (seq->expires && seq->expires < time(NULL)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sequence %s has expired\n", seq->id ? seq->id : "(null)")); seq->state = SOAP_WSRM_TERMINATED; return 0; } return 1; } /******************************************************************************\ * * Messages and Message Number Ranges * \******************************************************************************/ /** @fn ULONG64 soap_wsrm_msgs(const soap_wsrm_sequence_handle seq) @brief Returns the number of complete messages received, or 0 when there is a gap. @param[in] seq pointer to sequence @return number of messages received or 0 */ SOAP_FMAC1 ULONG64 SOAP_FMAC2 soap_wsrm_msgs(const soap_wsrm_sequence_handle seq) { struct soap_wsrm_range *p; ULONG64 sum = 0; MUTEX_LOCK(soap_wsrm_session_lock); if (seq) for (p = seq->ranges; p; p = p->next) sum += p->upper - p->lower + 1; MUTEX_UNLOCK(soap_wsrm_session_lock); return sum; } /******************************************************************************/ /** @fn ULONG64 soap_wsrm_recvnum(const soap_wsrm_sequence_handle seq) @brief Returns the message number of last message received @param seq sequence handle set by soap_wsrm_create() or soap_wsrm_create_offer() @return message number of last message received */ SOAP_FMAC1 ULONG64 SOAP_FMAC2 soap_wsrm_recvnum(const soap_wsrm_sequence_handle seq) { return seq->recvnum; } /******************************************************************************/ /** @fn ULONG64 soap_wsrm_lastnum(const soap_wsrm_sequence_handle seq) @brief Returns the last message number upon sequence close or 0 @param seq sequence handle set by soap_wsrm_create() or soap_wsrm_create_offer() @return last message number or 0 when more messages should be received */ SOAP_FMAC1 ULONG64 SOAP_FMAC2 soap_wsrm_lastnum(const soap_wsrm_sequence_handle seq) { return seq->lastnum; } /******************************************************************************/ /** @fn int soap_wsrm_num_lookup(struct soap *soap, const struct soap_wsrm_sequence *seq, ULONG64 num) @brief Internal function to look up a message number in the sequence state. @param soap context @param[in] seq pointer to sequence @param[in] num message num to search @return 0 (not found) 1 (found) */ static int soap_wsrm_num_lookup(struct soap *soap, const struct soap_wsrm_sequence *seq, ULONG64 num) { struct soap_wsrm_range *p; (void)soap; DBGFUN1("soap_wsrm_num_lookup", "num=" SOAP_ULONG_FORMAT, num); if (seq) for (p = seq->ranges; p; p = p->next) if (p->lower <= num && num <= p->upper) return 1; return 0; } /******************************************************************************/ /** @fn int soap_wsrm_num_insert(struct soap *soap, struct soap_wsrm_sequence *seq, ULONG64 num) @brief Internal function to insert a message number in the sequence state. Updates the sequence ranges. @param soap context @param seq pointer to sequence @param[in] num @return SOAP_OK or error code (out of memory) */ static int soap_wsrm_num_insert(struct soap *soap, struct soap_wsrm_sequence *seq, ULONG64 num) { struct soap_wsrm_range *p, **q; DBGFUN1("soap_wsrm_num_insert", "num=" SOAP_ULONG_FORMAT, num); if (!seq) return SOAP_OK; /* assumes num is not in any range yet */ /* if match: increment upper bound and normalize by joining consecutive ranges */ for (p = seq->ranges; p; p = p->next) { if (num == p->upper + 1) { p->upper = num; if (p->next) { struct soap_wsrm_range *t = p->next; if (p->upper + 1 == t->lower) { p->upper = t->upper; p->next = t->next; free((void*)t); } } return SOAP_OK; } } /* if match: decrement first range's lower bound */ if (seq->ranges && num == seq->ranges->lower - 1) { seq->ranges->lower = num; return SOAP_OK; } /* no match: insert new singleton range */ p = (struct soap_wsrm_range*)malloc(sizeof(struct soap_wsrm_range)); if (!p) return soap->error = SOAP_EOM; p->lower = p->upper = num; p->next = NULL; for (q = &seq->ranges; *q; q = &(*q)->next) { if (num < (*q)->lower) { p->next = *q; break; } } *q = p; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsrm_num_size(const struct soap_wsrm_sequence *seq) @brief Internal function returns the number of message ranges of the successfully received messages in a sequence state. @param seq pointer to sequence @return number of message ranges */ static int soap_wsrm_num_size(const struct soap_wsrm_sequence *seq) { int n = 0; if (seq) { struct soap_wsrm_range *p; for (p = seq->ranges; p; p = p->next) n++; } return n; } /******************************************************************************/ /** @fn void soap_wsrm_num_free(struct soap *soap, struct soap_wsrm_sequence *seq) @brief Internal function to deallocate all message number ranges from a sequence state. @param soap context @param seq pointer to sequence */ static void soap_wsrm_num_free(struct soap *soap, struct soap_wsrm_sequence *seq) { (void)soap; DBGFUN("soap_wsrm_num_free"); if (seq) { struct soap_wsrm_range *p, *q; for (p = seq->ranges; p; p = q) { q = p->next; free((void*)p); } } seq->ranges = NULL; } /******************************************************************************/ #ifdef SOAP_WSRM_FAST_ALLOC /** @fn unsigned short soap_wsrm_msb(ULONG64 n) @brief Returns MSB(n) @param n @return MSB (0..63) of n */ inline static unsigned short soap_wsrm_msb(register ULONG64 n) { ULONG64 k; unsigned short m = 0; if ((k = (n >> 32)) != 0) n = k, m += 32; if ((k = (n >> 16)) != 0) n = k, m += 16; if ((k = (n >> 8)) != 0) n = k, m += 8; if ((k = (n >> 4)) != 0) n = k, m += 4; if ((k = (n >> 2)) != 0) n = k, m += 2; if ((k = (n >> 1)) != 0) n = k, m += 1; return m; } #endif /******************************************************************************/ /** @fn struct soap_wsrm_message *soap_wsrm_msg_new(struct soap *soap, struct soap_wsrm_sequence *seq, ULONG64 num) @brief Internal function to allocate a new message in a sequence, updates message count seq->num @param soap context @param seq sequence pointer @param num message num (produces error when zero) @return pointer to message struct or NULL when error */ static struct soap_wsrm_message * soap_wsrm_msg_new(struct soap *soap, struct soap_wsrm_sequence *seq, ULONG64 num) { if (num == 0) { soap_wsrm_error(soap, seq, wsrm__MessageNumberRollover); return NULL; } #ifdef SOAP_WSRM_FAST_ALLOC if (!seq->messages || num > seq->num) { ULONG64 i; struct soap_wsrm_message **p = seq->messages; unsigned short m = soap_wsrm_msb(num); if (!p || seq->num == 0 || m > soap_wsrm_msb(seq->num)) { ULONG64 n = (1 << (m + 1)) - 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enlarging messages to " SOAP_ULONG_FORMAT " for num = " SOAP_ULONG_FORMAT "\n", n, num)); p = (struct soap_wsrm_message**)malloc(n * sizeof(struct soap_wsrm_message*)); if (!p) { soap->error = SOAP_EOM; return NULL; } if (seq->messages) { (void)soap_memcpy((void*)p, n * sizeof(struct soap_wsrm_message*), (const void*)seq->messages, seq->num * sizeof(struct soap_wsrm_message*)); free((void*)seq->messages); } seq->messages = p; } for (i = seq->num; i < num; i++) p[i] = NULL; seq->num = num; } if (!seq->messages[num - 1]) { struct soap_wsrm_message *p = (struct soap_wsrm_message*)malloc(sizeof(struct soap_wsrm_message)); if (!p) { soap->error = SOAP_EOM; return NULL; } p->state = SOAP_WSRM_INIT; p->list = p->last = NULL; seq->messages[num - 1] = p; } return seq->messages[num - 1]; #else struct soap_wsrm_message *p; p = (struct soap_wsrm_message*)malloc(sizeof(struct soap_wsrm_message)); if (!p) { soap->error = SOAP_EOM; return NULL; } p->next = NULL; p->num = num; p->state = SOAP_WSRM_INIT; p->list = p->last = NULL; if (seq->messageslast) seq->messageslast->next = p; else seq->messages = p; seq->messageslast = p; if (num > seq->num) seq->num = num; return p; #endif } /******************************************************************************/ /** @fn void soap_wsrm_msg_free(struct soap *soap, struct soap_wsrm_message *p) @brief Internal function to deallocate all cached message content from a sequence state. @param soap context @param p pointer to message (in a sequence state) */ static void soap_wsrm_msg_free(struct soap *soap, struct soap_wsrm_message *p) { struct soap_wsrm_content *q, *r; (void)soap; #ifndef SOAP_WSRM_FAST_ALLOC DBGFUN1("soap_wsrm_msg_free", "num=" SOAP_ULONG_FORMAT, p->num); #endif for (q = p->list; q; q = r) { r = q->next; if (q->buf) free((void*)q->buf); free((void*)q); } p->list = p->last = NULL; } /******************************************************************************/ #ifdef __cplusplus } #endif gsoap-2.8.91/gsoap/plugin/wstapi.c0000644000175000017500000006751213525245161016365 0ustar ellertellert/* wstapi.c WS-Trust with SAML 2.0, WS-Security 1.0/1.1, WS-Addressing 2005/08 Extensible framework implements partial WS-Trust logic gSOAP XML Web services tools Copyright (C) 2000-2016, 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-2016, 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. 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 -------------------------------------------------------------------------------- */ /** @mainpage The gSOAP WS-Trust Extensible Framework @section wst_1 The gSOAP WS-Trust Extensible Framework [TOC] The material in this section relates to the WS-Trust specification. The WS-Trust framework is extensible. New client-side and server-side WS-Trust operations can be added. Several predefined operations are included to get you started. The list of predefined operations will be expanded over time. Please inquire Genivia tech support services. To use the WS-Trust framework, make sure that the `wst.h` specification is imported in the .h file for soapcpp2, e.g. after running wsdl2h check the generated .h file: @code #import "wst.h" @endcode If the import is not there, add it manually. Then run soapcpp2 as usual with option `-Iimport` to import wst.h from the import directory. The wst.h and the WS-Trust-dependent wstx.h and other gSOAP-specific .h header files are located in the import directory of the gSOAP package. These files define the WS-Trust and other WS-* protocol header elements and types. The wstx.h header file defines the WS-Trust RequestSecurityTokenRequest and RequestSecurityTokenRequestCollection operations. Compile your code with `-DWITH_DOM` and `-DWITH_OPENSSL` to enable WS-Security plugin API features. Compile and link your code with wsseapi.c and wstapi.c, and include wsseapi.h and wstapi.h in your code. Internally, the wstapi.c code enables SOAP 1.2 messaging. This will not affect your SOAP 1.1 messaging. @section wst_2 WS-Trust Bindings The WS-Trust bindings in wst.h in the import directory were generated from the WS-Trust schema for you with the wsdl2h tool and WS/WS-typemap.dat as follows: wsdl2h -cgyex -o wst.h -t WS/WS-typemap.dat WS/WS-Trust.xsd The following modifications to wst.h are **required** to be made after generating wst.h with wsdl2h: - Remove `//gsoapopt` - Change `http://docs.oasis-open.org/ws-sx/ws-trust/200512` to remove the trailing `/` (slash) - Change `//gsoap wst schema namespace` directive to `//gsoap wst schema import` directive - Add `#import "wsp_appliesto.h"` - Add `#import "wstx.h"` at the end of the definitions in wst.h @section wst_3 Expanding the Current WS-Trust Bindings To expand or customize the WS-Trust bindings by adding (or removing) content model elements to the RequestSecurityToken and RequestSecurityTokenResponse, edit WS/WS-typemap.dat for the following two definition blocks: wst__RequestSecurityTokenType = $\ _wsp__AppliesTo_* wsp__AppliesTo; wst__RequestSecurityTokenType = $\ char* KeyType; wst__RequestSecurityTokenType = $\ char* RequestType; wst__RequestSecurityTokenType = $\ char* TokenType; wst__RequestSecurityTokenType = $\ wst__EntropyType* Entropy; wst__RequestSecurityTokenType = $\ char* ComputedKeyAlgorithm; wst__RequestSecurityTokenType = $\ unsigned int* KeySize; wst__RequestSecurityTokenType = $\ struct wst__BinaryExchangeType* BinaryExchange; wst__RequestSecurityTokenResponseType = $\ _wsp__AppliesTo_* wsp__AppliesTo; wst__RequestSecurityTokenResponseType = $\ struct wst__RequestedSecurityTokenType* RequestedSecurityToken; wst__RequestSecurityTokenResponseType = $\ struct wst__RequestedReferenceType* RequestedAttachedReference; wst__RequestSecurityTokenResponseType = $\ struct wst__RequestedReferenceType* RequestedUnattachedReference; wst__RequestSecurityTokenResponseType = $\ char* KeyType; wst__RequestSecurityTokenResponseType = $\ char* RequestType; wst__RequestSecurityTokenResponseType = $\ char* TokenType; wst__RequestSecurityTokenResponseType = $\ wst__EntropyType* Entropy; wst__RequestSecurityTokenResponseType = $\ struct wst__BinaryExchangeType* BinaryExchange; For example, to add the `wst:Lifetime` element to the RequestSecurityTokenResponse add the following two lines: wst__RequestSecurityTokenResponseType = $\ wst__LifetimeType* Lifetime; where `wst__LifetimeType` is declared in wst.h. The pointer makes it optional. Then follow the instructions in the previous section to regenerate wst.h. Given the new `Lifetime` element, the wstapi.c framework can be extended to use this element information as follows: @code struct wst__RequestSecurityTokenResponseType response; time_t expires = 0; // no expiration ... if (soap_call___wst__RequestSecurityToken(soap, endpoint, soap_wst_rst_action, &request, &response)) { soap_set_namespaces(soap, saved_namespaces); return soap->error; } soap_set_namespaces(soap, saved_namespaces); if (response.Lifetime && response.Lifetime->wsu__Expires) soap_s2dateTime(soap, response.Lifetime->wsu__Expires, &expires); // set expiration @endcode @section wst_4 Predefined WS-Trust Operations This section lists the predefined WS-Trust operations implemented in wstapi.c. @subsection wst_soap_wst_request_saml_token @code int soap_wst_request_saml_token(struct soap *soap, const char *endpoint, int soapver, const char *applyto, const char *username, const char *password, saml1__AssertionType **saml1, saml2__AssertionType **saml2) @endcode Request SAML 1.0 or SAML 2.0 token, with `endpoint` service endpoint URL (send to), `soapver` SOAP version with 1 = SOAP 1.1, 2 = SOAP 1.2 (SOAP 1.2 is recommended), `applyto` is your service domain, `username` to authenticate or NULL, `password` to authenticate or NULL, `saml1` if non-NULL, requests SAML 1.0 and upon return points to a pointer that is set to the SAML 1.0 assertion received, `saml2` if non-NULL, requests SAML 2.0 and upon return points to a pointer that is set to the SAML 2.0 assertion received. Returns `SOAP_OK` on success when the assertion could be verified, with `saml1` or `saml2` set. For example: @code #include "wstapi.h" #include "wsaapi.h" #include "wsseapi.h" #include "wst.nsmap" static int ssl_verify(int ok, X509_STORE_CTX *store) { return 1; } // ignore all cert warnings (bad) ... struct soap *soap = soap_new1(SOAP_XML_INDENT); int soapver = 2; // SOAP 1.2 const char *to = "https://yourcompany.com/adfs/services/trust/13/UsernameMixed"; const char *applyto = "yourcompany.com"; const char *username = "yourusername"; const char *password = "yourpassword"; saml2__AssertionType *saml2; // register wsa plugin (optional, only if the client requires WS-Addressing rerouted messaging) soap_register_plugin(soap, soap_wsa); // register wsse plugin soap_register_plugin(soap, soap_wsse); // HTTPS settings if (soap_ssl_client_context(soap, SOAP_SSL_DEFAULT, NULL, NULL, "cacerts.pem", NULL, NULL)) { soap_print_fault(soap, stderr); exit(1); } // HTTPS and SAML certificate verification callback soap->fsslverify = ssl_verify; // SAML 2.0 token request if (soap_wst_request_saml_token(soap, to, soapver, applyto, username, password, NULL, &saml2)) { soap_print_fault(soap, stderr); } else { // display subset of the assertion information if (saml2) { int i; for (i = 0; i < saml2->__size_AssertionType; i++) { if (saml2->__union_AssertionType[i].saml2__Statement) { // omitted from displaying } if (saml2->__union_AssertionType[i].saml2__AuthnStatement) { if (saml2->__union_AssertionType[i].saml2__AuthnStatement->saml2__AuthnContext) { if (saml2->__union_AssertionType[i].saml2__AuthnStatement->saml2__AuthnContext->saml2__AuthnContextClassRef) printf("AuthnStatement Context: %s\n", saml2->__union_AssertionType[i].saml2__AuthnStatement->saml2__AuthnContext->saml2__AuthnContextClassRef); } } if (saml2->__union_AssertionType[i].saml2__AuthzDecisionStatement) { // omitted from displaying } if (saml2->__union_AssertionType[i].saml2__AttributeStatement) { int j; for (j = 0; j < saml2->__union_AssertionType[i].saml2__AttributeStatement->__size_AttributeStatementType; j++) { if (saml2->__union_AssertionType[i].saml2__AttributeStatement->__union_AttributeStatementType[j].saml2__Attribute) { int k; for (k = 0; k < saml2->__union_AssertionType[i].saml2__AttributeStatement->__union_AttributeStatementType[j].saml2__Attribute->__sizeAttributeValue; k++) printf("Type: %s\nValue: %s\n", saml2->__union_AssertionType[i].saml2__AttributeStatement->__union_AttributeStatementType[j].saml2__Attribute->Name, saml2->__union_AssertionType[i].saml2__AttributeStatement->__union_AttributeStatementType[j].saml2__Attribute->saml2__AttributeValue[k]); } } } } if (saml2->saml2__Conditions) { if (saml2->saml2__Conditions->NotBefore) printf("Not before %s\n", soap_dateTime2s(soap, *saml2->saml2__Conditions->NotBefore)); if (saml2->saml2__Conditions->NotOnOrAfter) printf("Not on or after %s\n", soap_dateTime2s(soap, *saml2->saml2__Conditions->NotOnOrAfter)); } } else { printf("No SAML 2.0 statements!\n"); } } soap_destroy(soap); soap_end(soap); soap_free(soap); @endcode This prints several of the assertion's properties, including the conditions under which the assertion is valid. The `NotBefore` and `NotOnOrAfter` conditions can be checked against the current time as follows: @code time_t now = time(NULL); if (saml2->saml2__Conditions->NotBefore && *saml2->saml2__Conditions->NotBefore > now) ... error // not valid yet if (saml2->saml2__Conditions->NotOnOrAfter && *saml2->saml2__Conditions->NotOnOrAfter <= now) ... error // expired @endcode @subsection wst_soap_wst_request_psha1_token @code int soap_wst_request_psha1_token(struct soap *soap, const char *endpoint, int soapver, const char *applyto, const char *username, const char *password, char *psha1, size_t psha1len) @endcode Request P_SHA1 token with `endpoint` service endpoint URL (send to), `soapver` SOAP version with 1 = SOAP 1.1, 2 = SOAP 1.2 (SOAP 1.2 is recommended), `applyto` your service domain, `username` to authenticate or NULL, `password` to authenticate or NULL, `psha1` is filled with the P_SHA1 result token of `psa1len` bytes. Returns `SOAP_OK` on success. @code #include "wsaapi.h" #include "wstapi.h" #include "wsseapi.h" #include "wst.nsmap" static int ssl_verify(int ok, X509_STORE_CTX *store) { return 1; } // ignore all cert warnings (bad) ... struct soap *soap = soap_new1(SOAP_XML_INDENT); int soapver = 2; // SOAP 1.2 const char *to = "https://yourcompany.com/adfs/services/trust/13/UsernameMixed"; const char *applyto = "yourcompany.com"; const char *username = "yourusername"; const char *password = "yourpassword"; char psha1[256]; // register wsa plugin (optional, only if the client requires WS-Addressing rerouted messaging) soap_register_plugin(soap, soap_wsa); // register wsse plugin soap_register_plugin(soap, soap_wsse); // HTTPS settings if (soap_ssl_client_context(soap, SOAP_SSL_DEFAULT, NULL, NULL, "cacerts.pem", NULL, NULL)) { soap_print_fault(soap, stderr); exit(1); } // HTTPS certificate verification callback soap->fsslverify = ssl_verify; // PSHA1 token request if (soap_wst_request_psha1_token(soap, to, soapver, applyto, username, password, psha1, 256)) { soap_print_fault(soap, stderr); } else { // use psha1[0..255] } soap_destroy(soap); soap_end(soap); soap_free(soap); @endcode @subsection wst_soap_wst_request_psha256_token Similar to the previous section, request a P_SHA256 token with: @code int soap_wst_request_psha256_token(struct soap *soap, const char *endpoint, int soapver, const char *applyto, const char *username, const char *password, char *psha256, size_t psha256len) @endcode @section wst_5 Using the wst Plugin for Servers To implement a WS-Trust server in C, run soapcpp2 as follows: soapcpp2 -c -L file.h where file.h has an `#import "wst.h"`. This generates the soapServer.c and soapC.c code you need to compile with wstapi.c, wsaapi.c, wsseapi.c, smdevp.c, and mecevp.c. Link with libgsoapssl.a (or stdsoap2.c and dom.c). Use `-DWITH_OPENSSL` and `-DWITH_DOM` to compile the source code. For C++, use: soapcpp2 -L file.h This generates the soapServer.cpp and soapC.cpp code you need to compile with wstapi.c, wsaapi.c, wsseapi.c, smdevp.c, and mecevp.c. Link with libgsoapssl++.a (or stdsoap2.cpp and dom.cpp). Use `-DWITH_OPENSSL` and `-DWITH_DOM` to compile the source code. If you prefer to use soapcpp2 option `-j` (or `-i`) to generate C++ server objects, please run soacpp2 again as follows: soapcpp2 -j -L file.h soapcpp2 -CL -pwst import/wst.h This generates wstClient.cpp, which should be compiled together with the rest of your project code. You should define the following service operations: @code int wstService::RequestSecurityToken(wst__RequestSecurityTokenType *request, wst__RequestSecurityTokenResponseType *response) { ... } int wstService::RequestSecurityTokenCollection(struct wst__RequestSecurityTokenCollectionType *request, struct wst__RequestSecurityTokenResponseCollectionType *response) { ... } @endcode If you are combinding WS-Trust with other service operations, then you must also chain the service operations at the server side as follows: @code if (soap_begin_serve(service.soap) == SOAP_OK) if (service.dispatch() == SOAP_NO_METHOD) soap_serve_request(service.soap); @endcode where the `service` object is an instance of the application services generated by soapcpp2 `-j`. */ #include "wstapi.h" const char *soap_wst_rst_action = SOAP_NAMESPACE_OF_wst "/RST/Issue"; const char *soap_wst_rstr_action = SOAP_NAMESPACE_OF_wst "/RSTR/Issue"; const char *soap_wst_rstc_action = SOAP_NAMESPACE_OF_wst "/RSTC/Issue"; const char *soap_wst_rstrc_action = SOAP_NAMESPACE_OF_wst "/RSTRC/IssueFinal"; /* generated with soapcpp2 -1 -Iimport import/wst.h */ struct Namespace soap11_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}, {"c14n", "http://www.w3.org/2001/10/xml-exc-c14n#", NULL, NULL}, {"ds", "http://www.w3.org/2000/09/xmldsig#", NULL, NULL}, {"saml1", "urn:oasis:names:tc:SAML:1.0:assertion", NULL, NULL}, {"saml2", "urn:oasis:names:tc:SAML:2.0:assertion", NULL, NULL}, {"xenc", "http://www.w3.org/2001/04/xmlenc#", NULL, NULL}, {"wsc", "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512", "http://schemas.xmlsoap.org/ws/2005/02/sc", NULL}, {"wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd", NULL}, {"chan", "http://schemas.microsoft.com/ws/2005/02/duplex", NULL, NULL}, {"wsa5", "http://www.w3.org/2005/08/addressing", "http://schemas.xmlsoap.org/ws/2004/08/addressing", NULL}, {"wsp", "http://schemas.xmlsoap.org/ws/2004/09/policy", NULL, NULL}, {"wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", NULL, NULL}, {"wst", SOAP_NAMESPACE_OF_wst, "http://schemas.xmlsoap.org/ws/2005/02/trust", NULL}, {NULL, NULL, NULL, NULL} }; /* generated with soapcpp2 -2 -Iimport import/wst.h */ struct Namespace soap12_namespaces[] = { {"SOAP-ENV", "http://www.w3.org/2003/05/soap-envelope", "http://schemas.xmlsoap.org/soap/envelope/", NULL}, {"SOAP-ENC", "http://www.w3.org/2003/05/soap-encoding", "http://schemas.xmlsoap.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}, {"c14n", "http://www.w3.org/2001/10/xml-exc-c14n#", NULL, NULL}, {"ds", "http://www.w3.org/2000/09/xmldsig#", NULL, NULL}, {"saml1", "urn:oasis:names:tc:SAML:1.0:assertion", NULL, NULL}, {"saml2", "urn:oasis:names:tc:SAML:2.0:assertion", NULL, NULL}, {"xenc", "http://www.w3.org/2001/04/xmlenc#", NULL, NULL}, {"wsc", "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512", "http://schemas.xmlsoap.org/ws/2005/02/sc", NULL}, {"wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd", NULL}, {"chan", "http://schemas.microsoft.com/ws/2005/02/duplex", NULL, NULL}, {"wsa5", "http://www.w3.org/2005/08/addressing", "http://schemas.xmlsoap.org/ws/2004/08/addressing", NULL}, {"wsp", "http://schemas.xmlsoap.org/ws/2004/09/policy", NULL, NULL}, {"wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", NULL, NULL}, {"wst", SOAP_NAMESPACE_OF_wst, "http://schemas.xmlsoap.org/ws/2005/02/trust", NULL}, {NULL, NULL, NULL, NULL} }; #ifdef __cplusplus extern "C" { #endif /******************************************************************************\ * * Client-side WS-Trust Operations * \******************************************************************************/ /** @fn int soap_wst_request_saml_token(struct soap *soap, const char *endpoint, int soapver, const char *applyto, const char *username, const char *password, saml1__AssertionType **saml1, saml2__AssertionType **saml2) @brief Request SAML 1.0 or SAML 2.0 token. Verifies the SAML signature, which requires soap->cafile to be set. Does not verify the conditions of the SAML token, such as NotBefore and NotOnOrAfter, which has to be done explicitly as shown in the documentation. @param soap context @param endpoint service endpoint URL (send to) @param soapver SOAP version 1 = SOAP 1.1, 2 = SOAP 1.2 (recommended) @param applyto service domain @param username authentication or NULL @param password authentication or NULL @param saml1 if non-NULL, requests SAML 1.0 and upon return points to a pointer that is set to the SAML 1.0 assertion received @param saml2 if non-NULL, requests SAML 2.0 and upon return points to a pointer that is set to the SAML 2.0 assertion received @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wst_request_saml_token(struct soap *soap, const char *endpoint, int soapver, const char *applyto, const char *username, const char *password, saml1__AssertionType **saml1, saml2__AssertionType **saml2) { struct wst__RequestSecurityTokenType request; struct wst__RequestSecurityTokenResponseType response; const struct Namespace *saved_namespaces = soap->namespaces; DBGFUN("soap_wst_request_saml_token"); /* SOAP 1.1 or 1.2 */ if (soapver == 1) soap_set_namespaces(soap, soap11_namespaces); else soap_set_namespaces(soap, soap12_namespaces); /* set KeyType, RequestType, TokenType */ soap_default_wst__RequestSecurityTokenType(soap, &request); request.KeyType = (char*)SOAP_NAMESPACE_OF_wst "/Bearer"; request.RequestType = (char*)SOAP_NAMESPACE_OF_wst "/Issue"; if (saml1) { request.TokenType = (char*)"urn:oasis:names:tc:SAML:1.0:assertion"; *saml1 = NULL; } else if (saml2) { request.TokenType = (char*)"urn:oasis:names:tc:SAML:2.0:assertion"; *saml2 = NULL; } /* WS-Policy and WS-Addressing headers */ request.wsp__AppliesTo = (struct _wsp__AppliesTo_*)soap_malloc(soap, sizeof(struct _wsp__AppliesTo_)); if (!request.wsp__AppliesTo) return soap->error = SOAP_EOM; soap_default__wsp__AppliesTo_(soap, request.wsp__AppliesTo); request.wsp__AppliesTo->SOAP_WSA(EndpointReference) = (SOAP_WSA(EndpointReferenceType)*)soap_malloc(soap, sizeof(SOAP_WSA(EndpointReferenceType))); if (!request.wsp__AppliesTo->SOAP_WSA(EndpointReference)) return soap->error = SOAP_EOM; SOAP_WSA_(soap_default,EndpointReferenceType)(soap, request.wsp__AppliesTo->SOAP_WSA(EndpointReference)); request.wsp__AppliesTo->SOAP_WSA(EndpointReference)->Address = (char*)applyto; soap_wsa_request(soap, NULL, endpoint, soap_wst_rst_action); /* add credentials */ if (username && password) soap_wsse_add_UsernameTokenDigest(soap, "User", username, password); /* verify init enables signature verification */ soap_wsse_verify_init(soap); if (soap_call___wst__RequestSecurityToken(soap, endpoint, soap_wst_rst_action, &request, &response)) { short version = soap->version; soap_set_namespaces(soap, saved_namespaces); soap->version = version; return soap->error; } soap_set_namespaces(soap, saved_namespaces); if (response.RequestedSecurityToken && response.TokenType) { if (saml1 && !strcmp(response.TokenType, "urn:oasis:names:tc:SAML:1.0:assertion")) *saml1 = response.RequestedSecurityToken->saml1__Assertion; else if (saml2 && !strcmp(response.TokenType, "urn:oasis:names:tc:SAML:2.0:assertion")) *saml2 = response.RequestedSecurityToken->saml2__Assertion; } if (saml1 && *saml1) { /* verify assertion using the enveloped signature that contains a X509 certificate */ if (soap_wsse_verify_with_signature(soap, (*saml1)->ds__Signature)) return soap->error; } else if (saml2 && *saml2) { /* verify assertion using the enveloped signature that contains a X509 certificate */ if (soap_wsse_verify_with_signature(soap, (*saml2)->ds__Signature)) return soap->error; } return SOAP_OK; } /** @fn int soap_wst_request_psha1_token(struct soap *soap, const char *endpoint, int soapver, const char *applyto, const char *username, const char *password, char *psha1, size_t psha1len) @brief Request PSHA1 token. @param soap context @param endpoint service endpoint URL (send to) @param soapver SOAP version 1 = SOAP 1.1, 2 = SOAP 1.2 (recommended) @param applyto service domain @param username authentication or NULL @param password authentication or NULL @param psha1 filled with the PSHA1 result token of psa1len bytes @param psha1len token size in bytes @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wst_request_psha1_token(struct soap *soap, const char *endpoint, int soapver, const char *applyto, const char *username, const char *password, char *psha1, size_t psha1len) { struct wst__RequestSecurityTokenType request; struct wst__RequestSecurityTokenResponseType response; char HA[16]; unsigned int keysize = (unsigned int)psha1len; const struct Namespace *saved_namespaces = soap->namespaces; DBGFUN("soap_wst_request_psha1_token"); /* SOAP 1.1 or 1.2 */ if (soapver == 1) soap_set_namespaces(soap, soap11_namespaces); else soap_set_namespaces(soap, soap12_namespaces); /* set KeyType, RequestType, ComputedKeyAlgorithm */ soap_default_wst__RequestSecurityTokenType(soap, &request); request.KeyType = (char*)SOAP_NAMESPACE_OF_wst "/SymmetricKey"; request.RequestType = (char*)SOAP_NAMESPACE_OF_wst "/Issue"; request.ComputedKeyAlgorithm = (char*)SOAP_NAMESPACE_OF_wst "/CK/PSHA1"; request.KeySize = &keysize; soap_wsse_rand_nonce(HA, 16); request.Entropy = (wst__EntropyType*)soap_malloc(soap, sizeof(wst__EntropyType)); soap_default_wst__EntropyType(soap, request.Entropy); request.Entropy->BinarySecret = (wst__BinarySecretType*)soap_malloc(soap, sizeof(wst__BinarySecretType)); request.Entropy->BinarySecret->Type = (char*)SOAP_NAMESPACE_OF_wst "/Nonce"; request.Entropy->BinarySecret->__item = soap_s2base64(soap, (unsigned char*)HA, NULL, 16); /* WS-Policy and WS-Addressing headers */ request.wsp__AppliesTo = (struct _wsp__AppliesTo_*)soap_malloc(soap, sizeof(struct _wsp__AppliesTo_)); if (!request.wsp__AppliesTo) return soap->error = SOAP_EOM; soap_default__wsp__AppliesTo_(soap, request.wsp__AppliesTo); request.wsp__AppliesTo->SOAP_WSA(EndpointReference) = (SOAP_WSA(EndpointReferenceType)*)soap_malloc(soap, sizeof(SOAP_WSA(EndpointReferenceType))); if (!request.wsp__AppliesTo->SOAP_WSA(EndpointReference)) return soap->error = SOAP_EOM; SOAP_WSA_(soap_default,EndpointReferenceType)(soap, request.wsp__AppliesTo->SOAP_WSA(EndpointReference)); request.wsp__AppliesTo->SOAP_WSA(EndpointReference)->Address = (char*)applyto; soap_wsa_request(soap, NULL, endpoint, soap_wst_rst_action); /* add credentials */ if (username && password) soap_wsse_add_UsernameTokenDigest(soap, "User", username, password); /* verify init enables signature verification */ soap_wsse_verify_init(soap); if (soap_call___wst__RequestSecurityToken(soap, endpoint, soap_wst_rst_action, &request, &response)) { short version = soap->version; soap_set_namespaces(soap, saved_namespaces); soap->version = version; return soap->error; } soap_set_namespaces(soap, saved_namespaces); if (response.Entropy && response.Entropy->BinarySecret) { int len; const char *seed = soap_base642s(soap, response.Entropy->BinarySecret->__item, NULL, 0, &len); if (soap_psha1(soap, HA, 16, seed, len, psha1, psha1len)) return soap->error; } return SOAP_OK; } #ifdef __cplusplus } #endif gsoap-2.8.91/gsoap/plugin/httpposttest.h0000644000175000017500000000440313525245161017636 0ustar ellertellert/* httpposttest.h gSOAP HTTP POST plugin example application. gSOAP XML Web services tools Copyright (C) 2000-2009, Robert van Engelen, Genivia, Inc., All Rights Reserved. -------------------------------------------------------------------------------- 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-2004, 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. -------------------------------------------------------------------------------- Compile: soapcpp2 -c httpposttest.h cc -o httpposttest httpposttest.c soapC.c soapServer.c httppost.c stdsoap2.c To support https and compression, compile with: cc -DWITH_OPENSSL -DWITH_GZIP -o httpposttest httpposttest.c soapC.c soapServer.c httppost.c stdsoap2.c -lssl -lcrypto -lz */ // Implements the REST calculator service #import "calcrest.h" gsoap-2.8.91/gsoap/plugin/mq.h0000644000175000017500000000666113525245161015476 0ustar ellertellert/* mq.h Inbound message queues gSOAP XML Web services tools Copyright (C) 2000-2013, 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. -------------------------------------------------------------------------------- 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-2013, 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 MQ_H #define MQ_H #include "stdsoap2.h" #ifdef __cplusplus extern "C" { #endif #define SOAP_MQ_ID "MQ-0.9" extern const char soap_mq_id[]; /** @brief Plugin data. */ struct soap_mq_data { char *buf; /** buffer to read via frecv() */ size_t len; /** buffer length */ size_t (*frecv)(struct soap*, char*, size_t); /** to save and use recv callback */ }; /** @brief Queued inbound message (in linked list). */ struct soap_mq_msg { char *buf; /**< inbound HTTP body */ size_t len; /**< inbound HTTP body length */ struct soap soap; /**< saved context to read HTTP body */ struct soap_mq_msg *next; }; /** @brief Message queue. */ struct soap_mq_queue { struct soap_mq_msg *head, *tail; }; SOAP_FMAC1 int SOAP_FMAC2 soap_mq(struct soap *soap, struct soap_plugin *plugin, void *arg); SOAP_FMAC1 struct soap_mq_queue * SOAP_FMAC2 soap_mq_queue(struct soap *); SOAP_FMAC1 struct soap_mq_msg * SOAP_FMAC2 soap_mq_get(struct soap *soap, struct soap_mq_queue *); SOAP_FMAC1 struct soap_mq_msg * SOAP_FMAC2 soap_mq_begin(struct soap_mq_queue *); SOAP_FMAC1 struct soap_mq_msg * SOAP_FMAC2 soap_mq_next(struct soap_mq_msg *); SOAP_FMAC1 void SOAP_FMAC2 soap_mq_del(struct soap_mq_queue *, struct soap_mq_msg *); #ifdef __cplusplus } #endif #endif gsoap-2.8.91/gsoap/plugin/wsseapi.c0000644000175000017500000111063213525245161016522 0ustar ellertellert/* wsseapi.c WS-Security plugin gSOAP XML Web services tools Copyright (C) 2000-2016, 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-2016, 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 -------------------------------------------------------------------------------- */ /** @mainpage - @ref wsse documents the wsse plugin for WS-Security 1.0/1.1 support. - @ref smdevp documents the smdevp signature/digest engine. - @ref mecevp documents the mecevp encryption engine. - @ref threads documents a portable threads and locking API. */ /** @page wsse The WS-Security plugin [TOC] @section wsse_5 Security Header The material in this section relates to the WS-Security specification section 5. To use the wsse plugin: -# Run wsdl2h -t typemap.dat on a WSDL of a service that requires WS-Security headers. The typemap.dat file is used to recognize and translate Security header blocks for XML signature and encryption. -# Run soapcpp2 on the header file produced by wsdl2h. -# (Re-)compile stdsoap2.c/pp, dom.c/pp, smdevp.c, mecevp.c, wsseapi.c and the generated source files with the `-DWITH_DOM` and `-DWITH_OPENSSL` compiler flags set. The smdevp.c, mecevp.c, and wsseapi.c files are located in the 'plugin' directory. -# Use the wsse plugin API functions described below to add and verify Security headers, sign and verify messages, and to encrypt/decrypt messages. An example WS-Security client/server application can be found in gsoap/samples/wsse. Another example WS-Security client/server application that is designed to interoperate with WCF can be found in gsoap/samples/WCF/Basic/MessageSecurity. @warning The security token handler callback function parameters have changed in 2.8.34 and greater with the addition of KeyIdentifier information `keyid` and `keyidlen`. To register your own security token handler function with the plugin, make sure that your functions matches these function parameters: @code const void *security_token_handler(struct soap *soap, int *alg, const char *keyname, const unsigned char *keyid, int keyidlen, int *keylen); @endcode The wsse engine is thread safe. However, if HTTPS is required then please follow the instructions in Section @ref wsse_11 to ensure thread-safety of WS-Security with HTTPS. The wsse API code is implemented in: - `gsoap/plugin/wsseapi.h` wsse API declarations. - `gsoap/plugin/wsseapi.c` wsse API for C and C++. You will also need: - `gsoap/plugin/smdevp.c` compile and link this file (C and C++). - `gsoap/plugin/mecevp.c` compile and link this file (C and C++). - compile all sources with `-DWITH_OPENSSL -DWITH_DOM`. - if you have zlib installed, compile all sources also with `-DWITH_GZIP`. - link with `-lssl -lcrypto -lz -lgsoapssl++` (or `-lgsoapssl` for C, or compile `stdsoap2.cpp` for C++ and `stdsoap2.c` for C). The gSOAP header file (generated with wsdl2h, and containing the data binding interface for soapcpp2) should import wsse.h (or the older 2002 version wsse2.h): @code #import "wsse.h" @endcode The wsdl2h tool adds the necessary imports to the generated header file if the WSDL declares the use of WS-Security. If not, you may have to add the import manually before running soapcpp2. The wsse API consists of a set of functions to populate and verify WS-Security headers and message body content. For more details, we refer to the following sections that correspond to the WS-Security specification sections: - Section 6 @ref wsse_6 - Section 7 @ref wsse_7 - Section 8 @ref wsse_8 - Section 9 @ref wsse_9 - Section 10 @ref wsse_10 - @ref wsse_11 - @ref wsse_12 - @ref wsse_13 - @ref wsse_wsc The basic API is introduced below. To add an empty Security header block to the SOAP header, use: @code soap_wsse_add_Security(soap); @endcode To delete a Security header, use: @code soap_wsse_delete_Security(soap); @endcode Adding an empty Security header block is not very useful. In the following, we present the higher-level functions of the wsse plugin to populate and verify Security header content. @note The soap context includes an actor value soap.actor that is populated and rendered as the SOAP-ENV:actor (SOAP 1.1) or SOAP-ENV:role (SOAP 1.2) attribute in XML within the generic SOAP Header. The attribute is optional, but should be used to target a recipient such as an intermediate node to process the SOAP header. In contrast, actor or role attributes within Security header blocks target specific recipients to process the Security header block. The gSOAP implementation does not automate this feature and application should set and check the actor/role attribute when necessary. In addition, the current implementation supports the inclusion of a single Security header block in the SOAP header. To populate the SOAP-ENV:actor or SOAP-ENV:role attribute within the Security header, use: @code soap_wsse_add_Security_actor(soap, "recipient"); @endcode To obtain the actor or role value (e.g. after receiving a message), use: @code _wsse__Security *security = soap_wsse_Security(soap); if (security) { ... = security->SOAP_ENV__actor; // SOAP 1.1 ... = security->SOAP_ENV__role; // SOAP 1.2 @endcode The SOAP-ENV:mustUnderstand attribute is automatically added and checked by the gSOAP engine. A gSOAP application compiled without Security support will reject Security headers. Security header blocks are attached to the soap context, which means that the information will be automatically kept to support multiple invocations. @section wsse_6 Security Tokens The material in this section relates to the WS-Security specification section 6. @subsection wsse_6_2 User Name Tokens To add a user name token to the Security header block, use: @code soap_wsse_add_UsernameTokenText(soap, "Id", "username", NULL); @endcode The `Id` value is optional. When non-NULL the user name token is included in the digital signature to protect its integrity. It is common for the wsse plugin functions to accept such `Id`s, which are serialized as wsu:Id identifiers for cross-referencing XML elements. The signature engine of the wsse plugin is designed to automatically sign all wsu:Id attributed elements to simplify the code you need to write to implement the signing process. To add a user name token with clear text password, use: @code soap_wsse_add_UsernameTokenText(soap, "Id", "username", "password"); @endcode It is strongly recommended to use `soap_wsse_add_UsernameTokenText` only in combination with HTTPS encrypted transmission or not at all. A better alternative is to use password digests. With password digest authentication, the digest value of a password (with message creation time and a random nonce) is compared on both sides, thus eliminating the need to exchange a password over the wire. To add a user name token with password digest, use: @code soap_wsse_add_UsernameTokenDigest(soap, "Id", "username", "password"); @endcode Although the password string is passed to this function, it is not rendered in XML or stored in a message log. Only digests are compared on both sides, not the passwords. This authentication method adds a timestamp and nonce to prevent message replay attacks. It has been argued that this approach adopted by the WS-Security protocol is still vulnerable since the application retrieves the password in text form requiring a database to store passwords in clear text. However, a digest algorithm can be used to hash the passwords and store their digests instead, which eliminates the need to store clear-text passwords. This is a common approach adopted by Unix for decades. By setting the `Id` value to a unique string, the user name token is also digitally signed by the signature engine further preventing tampering with its value. You must use `soap_wsse_add_UsernameTokenDigest` for each message exchange to refresh the password digest even when the user name and password are not changed. Otherwise, the receiver might flag the message as a replay attack. To specify a time stamp for the digest instead of the current time, use: @code time_t when = ...; soap_wsse_add_UsernameTokenDigest_at(soap, "Id", "username", "password", when); @endcode Clear-text passwords and password digests are verified with `soap_wsse_verify_Password`. To verify a password at the receiving side to authorize a request (e.g. within a Web service operation), use: @code int ns__myMethod(struct soap *soap, ...) { const char *username = soap_wsse_get_Username(soap); const char *password; if (!username) { soap_wsse_delete_Security(soap); // remove old security headers return soap->error; // no username: return FailedAuthentication (from soap_wsse_get_Username) } password = ...; // lookup password of username if (soap_wsse_verify_Password(soap, password)) { int err = soap->error; soap_wsse_delete_Security(soap); // remove old security headers // if it is required to return signed faults, then add the following six lines here: if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0) { soap_wsse_delete_Security(soap); // remove security headers (failed construction) return soap->error; } return err; // password verification failed: return FailedAuthentication } ... // process request, then sign the response message: if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0) { soap_wsse_delete_Security(soap); // remove security headers (failed construction) return soap->error; } return SOAP_OK; } @endcode Note that the `soap_wsse_get_Username` functions sets the wsse:FailedAuthentication fault upon failure. It is common for the wsse plugin functions to return `SOAP_OK` or a wsse fault that should be passed to the sender by returning soap->error from service operations. The fault is displayed with the `soap_print_fault` function. To return signed faults back to the client, a signature is constructed as shown in the code snippet above. When the signature construction itself fails, we delete the partially constructed signature and return the fault to the client. Password digest authentication prevents message replay attacks. The wsse plugin keeps a database of password digests to thwart replay attacks. This is the only part in the plugin code that requires mutex provided by threads.h. Of course, this only works correctly if the server is persistent, such as a stand-alone service. Note that CGI-based services do not keep state. Machine clocks must be synchronized and clock skew should not exceed `SOAP_WSSE_CLKSKEW` at the server side. @subsection wsse_6_3 Binary Security Tokens X509 certificates are commonly included in Security header blocks as binary security tokens. A certificate is used to verify the digital signature of a digitally signed message using the public key embedded within the certificate. The certificate itself is signed by a certificate authority (CA) that vouches for the authenticity of the certificate, i.e. to prove the identify of the message originator. This verification process is important, because digital signatures are useless without verification: an attacker could simply replace the message, sign it, and replace the certificate. Certificates are automatically verified by the wsse plugin signature engine when received and accessed, which means that the certificates of the CAs must be made accessible to the wsse plugin as follows: @code soap->cafile = "cacerts.pem"; // use this soap->capath = "dir/to/certs"; // and/or point to CA certs soap->crlfile = "revoked.pem"; // use CRL (optional) @endcode The `soap_wsse_verify_X509` function checks the validity of a certificate. The check is automatically performed. The check is also performed when retrieving the certificate from a Security header block, either automatically by the wsse plugin's signature verification engine or manually as follows: @code X509 *cert = soap_wsse_get_BinarySecurityTokenX509(soap, "Id"); @endcode where `Id` is the identification string of the binary security token or NULL to get the first found in the Security header. The X509 certificate returned by this function should be freed with `X509_free` to deallocate the certificate data: @code if (cert) X509_free(cert); cert = NULL; @endcode The verification is an expensive process that will be optimized in future releases by caching the certificate chain. To attach a binary security token stored in a PEM file to a Security header block for transmission, use: @code soap_wsse_add_BinarySecurityTokenPEM(soap, NULL, "mycert.pem") @endcode A binary security token can be automatically signed by setting its `Id` attribute: @code soap_wsse_add_BinarySecurityTokenPEM(soap, "X509Token", "mycert.pem") @endcode Repeatedly loading a certificate from a PEM file is inefficient. To reuse a certificate loaded from a PEM file for multiple invocations, use: @code FILE *fd = fopen("mycert.pem", "r"); X509 *cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert)) ... // an error occurred @endcode Other types of binary security tokens can be added to the Security header block using: @code soap_wsse_add_BinarySecurityToken(soap, "Id", "valueType", data, datalen); @endcode @section wsse_6_4 SAML and Other Tokens The use and processing rules for tokens such as SAML assertions is specific to an application. SAML 1.0 and 2.0 tokens are supported with the following functions to retrieve them from Security header blocks: @code saml1__AssertionType *assertion1 = soap_wsse_get_saml1(soap); @endcode @code saml2__AssertionType *assertion2 = soap_wsse_get_saml2(soap); @endcode The pointers returned are non-NULL when these tokens are present. You can verify that a token is signed by the signature of the Security header with: @code saml2__AssertionType *assertion2 = soap_wsse_get_saml2(soap); if (!assertion2 || soap_wsse_verify_element(soap, SOAP_NAMESPACE_OF_saml2, "Assertion") == 0) ... error // no Assertion or Assertion not signed by WS-Security signature (zero Assertion elements signed) @endcode If the SAML token received contains a signature and/or time range conditions then you should verify that the SAML token is valid after receiving it in a Security header block of a WS-Security message: @code if (saml2->saml2__Conditions) { time_t now = time(NULL); if (saml2->saml2__Conditions->NotBefore && *saml2->saml2__Conditions->NotBefore > now) ... error // not valid yet if (saml2->saml2__Conditions->NotOnOrAfter && *saml2->saml2__Conditions->NotOnOrAfter <= now) ... error // expired } if (saml2->ds__Signature) if (soap_wsse_verify_with_signature(soap, saml2->ds__Signature)) ... error // Assertion has signature but token is invalid @endcode The above assumes that a WS-Security message was received that was signed and decrypted (when applicable). @note The resolution of the dateTime values of `NotBefore` and `NotOnOrAfter` is determined by the clock resolution of `time_t`, which is usually seconds. To increase the resolution, edit `gsoap/import/saml2.h` and add `#import "custom/struct_timeval.h"`. Then replace `time_t` in `gsoap/import/saml2.h` with `xsd__dateTime` to use `struct timeval`, which includes the time in seconds `tv_sec` and a microsecond offset `tv_usec`. To add a SAML token to the WS-Security headers, use `soap_wsse_add_saml1(struct soap*, const char *id)` or `soap_wsse_add_saml2(struct soap*, const char *id)`: @code time_t now = time(NULL); saml1__AssertionType *assertion1 = soap_wsse_add_saml1(soap, "SAML1"); if (!assertion1) ... // error assertion1->IssueInstant = now; assertion1->Issuer = (char*)"MyCompany"; assertion1->saml1__Conditions = soap_new_saml1__ConditionsType(soap, -1); if (!assertion1->saml1__Conditions) ... // error // valid from now for up to one hour assertion1->saml1__Conditions->NotBefore = soap_new_dateTime(soap, -1) if (!assertion1->saml1__Conditions->NotBefore) ... // error *assertion1->saml1__Conditions->NotBefore = now; assertion1->saml1__Conditions->NotOnOrAfter = soap_new_dateTime(soap, -1) if (!assertion1->saml1__Conditions->NotOnOrAfter) ... // error *assertion1->saml1__Conditions->NotOnOrAfter = now + 3600; ... @endcode and, respectively: @code time_t now = time(NULL); saml2__AssertionType *assertion2 = soap_wsse_add_saml2(soap, "SAML2"); if (!assertion2) ... // error assertion2->IssueInstant = now; assertion2->saml2__Issuer = (struct saml2__NameIDType*)soap_malloc(soap, sizeof(struct saml2__NameIDType)); soap_default_saml2__NameIDType(soap, assertion2->saml2__Issuer); assertion2->saml2__Issuer->__item = (char*)"MyCompany"; // valid from now for up to one hour assertion2->saml2__Conditions->NotBefore = soap_new_dateTime(soap, -1) if (!assertion2->saml2__Conditions->NotBefore) ... // error *assertion2->saml2__Conditions->NotBefore = now; assertion2->saml2__Conditions->NotOnOrAfter = soap_new_dateTime(soap, -1) if (!assertion2->saml2__Conditions->NotOnOrAfter) ... // error *assertion2->saml2__Conditions->NotOnOrAfter = now + 3600; ... @endcode The code shown above adds an empty SAML token to the Security header block after which the SAML assertion issuer, subject, conditions, statements, and attributes should be set. Once these are set, the assertion can be signed with a ds:Signature and X509 certificate added to the assertion to create an enveloped signature: @code EVP_PKEY *rsa_private_key; // private key X509 *cert; // certificate (e.g. in "cacert.pem") ... saml2__AssertionType *assertion2 = soap_wsse_add_saml2(soap, "SAML2"); if (!assertion2) ... // error ... // set SAML issuer, subject, conditions, statements, and attributes if (soap_wsse_sign_saml2(soap, assertion2, SOAP_SMD_SIGN_RSA_SHA256, private_key, 0, cert)) ... error // could not sign and/or add cert to X509Data soap->cafile = "cacert.pem"; // file that contains the public certificate if (soap_wsse_verify_saml2(soap, assertion2)) ... error // coult not verify the signature, e.g. invalid key-certificate pair @endcode It is a good habit to verify a SAML token that was created in memory with `int soap_wsse_verify_saml1(struct soap*, saml1__AssertionType *saml1)` or `int soap_wsse_verify_saml2(struct soap*, saml2__AssertionType *saml2)` as shown. This step is optional, but can be useful to detect if the private key and certificate are uncorrelated and should not be used. The private key and certificate values can be obtained as shown in Section @ref wsse_8_2a. For implementing other types of tokens, you are encouraged to modify the import/wsse.h file to add more tokens to the `_wsse__Security` header block: @code struct somens__SomeTokenType { @char *wsu__Id; ... }; typedef struct _wsse__Security { ... struct saml1__AssertionType* saml1__Assertion; struct saml2__AssertionType* saml2__Assertion; struct somens__SomeTokenType* somens__SomeToken; // added an optional token ... // add more if needed @char* SOAP_ENV__actor; @char* SOAP_ENV__role; } _wsse__Security; @endcode The tokens can be set with: @code _wsse__Security *security = soap_wsse_Security(soap); security->somens__SomeToken = (struct somens__SomeTokenType*)soap_malloc(soap, sizeof(struct somens__SomeTokenType)); soap_default_somens__SomeTokenType(soap, security->somens__SomeToken); security->somens__SomeToken->wsu__Id = "myToken"; // allows for auto-signing this element ... @endcode For tokens in DOM XML form, use the `xsd__anyType` DOM element: @code typedef struct _wsse__Security { ... xsd__anyType* somens__SomeToken; // added an optional token in DOM form } _wsse__Security; @endcode The token in DOM form can be signed if you set the wsu:Id attribute to a unique value say "MyToken": @code _wsse__Security *security = soap_wsse_Security(soap); security->somens__SomeToken = (xsd__anyType*)soap_malloc(soap, sizeof(xsd__anyType)); soap_default_xsd__anyType(soap, security->somens__SomeToken); soap_att_text(soap_att(soap_add_security->somens__SomeToken, NULL, "wsu:Id"), "MyToken"); ... @endcode We recommend to use [domcpp](http://www.genivia.com/doc/dom/html/index.html) to generate code to set the token to send messages and get its values after receiving messages. For tokens in XML "string" text form, use the `_XML` literal string (a `char*` type with XML content): @code typedef struct _wsse__Security { ... _XML somens__SomeToken; // added an optional token in string form } _wsse__Security; @endcode However, beware that XML text cannot be signed by the signature as a Security header (unless you embed it within a new element in the Security header block and set that element's wsu:Id attribute). @section wsse_7 Token References The material in this section relates to the WS-Security specification section 7. To use a certificate for signature verification, add a direct security token reference URI for the token to the KeyInfo, for example: @code soap_wsse_add_KeyInfo_SecurityTokenReferenceURI(soap, "URI", "valueType"); @endcode and: @code soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "URI"); @endcode For X509 certificates we use this to add a binary security token with the certificate and a reference to the local token: @code if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token")) ... // an error occurred @endcode This follows the recommended practice to place Security token references in the KeyInfo element of a Signature. The KeyInfo is used to verify the validity of a signature value. Key identifiers can be used as well: @code soap_wsse_add_KeyInfo_SecurityTokenReferenceKeyIdentifier(soap, "Id", "valueType", data, datalen); @endcode Embedded references are added with: @code soap_wsse_add_KeyInfo_SecurityTokenReferenceEmbedded(soap, "Id", "valueType"); @endcode Full support for embedded references requires coding to add tokens and assertions, as well as to consume embedded references at the receiving side. There is no automated mechanism to take the embedded references and process them accordingly. The use of key names is not recommended, but in case they are required they can be added with: @code soap_wsse_add_KeyInfo_KeyName(soap, "name"); @endcode @section wsse_8 Signatures The material in this section relates to the WS-Security specification section 8. The wsse plugin must be registered to sign and verify messages: @code soap_register_plugin(soap, soap_wsse); @endcode XML signatures are usually computed over normalized XML (to ensure the XML processors of intermediate nodes can accurately reproduce the XML). To this end, the exclusive canonical XML standard (exc-c14n) is required, which is set using the `SOAP_XML_CANONICAL` flag: @code struct soap *soap = soap_new1(SOAP_XML_CANONICAL); soap_register_plugin(soap, soap_wsse); @endcode To send messages with inclusive canonicalization, in addition to the `SOAP_XML_CANONICAL` flag also use: @code soap_wsse_set_InclusiveNamespaces(soap, "*"); @endcode However, exclusive canonicalization is recommended over inclusive canonicalization, or no canonicalization at all. WS Basic Security profile 1.0 requires exclusive canonicalization. Flags to consider: - `SOAP_XML_CANONICAL` recommended to enable exc-c14n (exclusive canonicalization). - `SOAP_XML_INDENT` optional, to emit more readable XML (see warning below). - `SOAP_IO_CHUNK` efficient HTTP-chunked streaming messages. - `SOAP_ENC_GZIP` for HTTP compression (also enables HTTP chunking). @warning Interoperability with WCF WS-Security is not guaranteed when `SOAP_XML_INDENT` is enabled. Avoid using `SOAP_XML_INDENT` for interoperability. The implementation of canonicalization in WCF with respect to the normalization of white space between XML tags differs from the protocol standards. Next, decide which signature algorithm is appropriate to use: - HMAC-SHA uses a secret key (also known as a shared key in symmetric cryptography) to sign the SHA digest of the SignedInfo element. - DSA-SHA uses a DSA private key to sign the SHA digest of the SignedInfo element. - RSA-SHA uses a RSA private key to sign the SHA digest of the SignedInfo element. - ECDSA-SHA uses a Elliptic Curve DSA private key to sign the SHA digest of the SignedInfo element. HMAC-SHA is the simplest method, but relies on the fact that you have to make absolutely sure the key is kept secret on both the sending and receiving side. As long as the secret key is confidential, messages are securely signed. However, this is virtually impossible when exchanging messages with untrusted disparate parties. The advantage of HMAC-SHA is the speed by which messages are signed and verified. Algorithms HMAC SHA1, SHA256, and SHA512 are supported: - `SOAP_SMD_HMAC_SHA1` http://www.w3.org/2000/09/xmldsig#hmac-sha1 - `SOAP_SMD_HMAC_SHA224` http://www.w3.org/2001/04/xmldsig-more#hmac-sha224 - `SOAP_SMD_HMAC_SHA256` http://www.w3.org/2001/04/xmldsig-more#hmac-sha256 - `SOAP_SMD_HMAC_SHA384` http://www.w3.org/2001/04/xmldsig-more#hmac-sha384 - `SOAP_SMD_HMAC_SHA512` http://www.w3.org/2001/04/xmldsig-more#hmac-sha512 DSA-SHA and RSA-SHA rely on public key cryptography. In simplified terms, a message is signed using the (confidential!) private key. The public key is used to verify the signature. Since only the originating party could have used its private key to sign the message, the integrity of the message is guaranteed. Of course, we must trust the public key came from the originator (it is often included as an X509 certificate in the message). To this end, a trusted certificate authority should have signed the public key, thereby creating a X509 certificate that contains the public key and the identity of the message originator. The following DSA, RSA, and ECDSA algorithms are supported: - `SOAP_SMD_SIGN_DSA_SHA1` http://www.w3.org/2000/09/xmldsig#dsa-sha1 - `SOAP_SMD_SIGN_DSA_SHA256` http://www.w3.org/2000/09/xmldsig-more#dsa-sha256 - `SOAP_SMD_SIGN_RSA_SHA1` http://www.w3.org/2000/09/xmldsig#rsa-sha1 - `SOAP_SMD_SIGN_RSA_SHA224` http://www.w3.org/2001/04/xmldsig-more#rsa-sha224 - `SOAP_SMD_SIGN_RSA_SHA256` http://www.w3.org/2001/04/xmldsig-more#rsa-sha256 - `SOAP_SMD_SIGN_RSA_SHA384` http://www.w3.org/2001/04/xmldsig-more#rsa-sha384 - `SOAP_SMD_SIGN_RSA_SHA512` http://www.w3.org/2001/04/xmldsig-more#rsa-sha512 - `SOAP_SMD_SIGN_ECDSA_SHA1` http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha1 - `SOAP_SMD_SIGN_ECDSA_SHA224` http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha224 - `SOAP_SMD_SIGN_ECDSA_SHA256` http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256 - `SOAP_SMD_SIGN_ECDSA_SHA384` http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha384 - `SOAP_SMD_SIGN_ECDSA_SHA512` http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha512 An optional callback function can be passed to the plugin that is responsible for providing a certificate or key to the wsse engine to verify a signed message. For example, when a security token is absent from an DSA-SHA or RSA-SHA signed message then the only mechanism to automatically verify the signature is to let the callback produce a certificate: @code soap_register_plugin(soap, soap_wsse); soap_wsse_set_security_token_handler(soap, security_token_handler); const void *security_token_handler(struct soap *soap, int *alg, const char *keyname, const unsigned char *keyid, int keyidlen, int *keylen) { // Get the user name from UsernameToken in message const char *uid = soap_wsse_get_Username(soap); switch (*alg) { case SOAP_SMD_VRFY_DSA_SHA1: case SOAP_SMD_VRFY_DSA_SHA256: case SOAP_SMD_VRFY_RSA_SHA1: case SOAP_SMD_VRFY_RSA_SHA224: case SOAP_SMD_VRFY_RSA_SHA256: case SOAP_SMD_VRFY_RSA_SHA384: case SOAP_SMD_VRFY_RSA_SHA512: case SOAP_SMD_VRFY_ECDSA_SHA1: case SOAP_SMD_VRFY_ECDSA_SHA224: case SOAP_SMD_VRFY_ECDSA_SHA256: case SOAP_SMD_VRFY_ECDSA_SHA384: case SOAP_SMD_VRFY_ECDSA_SHA512: if (uid) { // Lookup uid to retrieve the X509 certificate to verify the signature const X509 *cert = ...; return (const void*)cert; } return NULL; // no certificate: fail case SOAP_SMD_HMAC_SHA1: case SOAP_SMD_HMAC_SHA224: case SOAP_SMD_HMAC_SHA256: case SOAP_SMD_HMAC_SHA384: case SOAP_SMD_HMAC_SHA512: if (uid) { // Lookup uid to retrieve the HMAC SHA key to verify the signature const void *key = ...; *alg = ...; *keylen = ...; return key; } return NULL; // no certificate: fail case SOAP_MEC_ENV_DEC_DES_CBC: case SOAP_MEC_ENV_DEC_AES128_CBC: case SOAP_MEC_ENV_DEC_AES192_CBC: case SOAP_MEC_ENV_DEC_AES256_CBC: case SOAP_MEC_ENV_DEC_AES512_CBC: // reserved for future use case SOAP_MEC_ENV_DEC_AES128_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_ENV_DEC_AES192_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_ENV_DEC_AES256_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_ENV_DEC_AES512_GCM: // GCM requires OpenSSL 1.0.2 or higher if (keyname) { // use this to get key or X509 certificate from a key store using the keyname value: // 1. keyname is set to the subject name of the certificate, if a // certificate is present in the SecurityTokenReference/KeyIdentifier // when ValueType is http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3 // 2. keyname is set to the string concatenation // "{X509IssuerName}#{X509SerialNumber}" of the X509IssuerName // and X509SerialNumber present in X509Data/X509IssuerSerial // 3. keyname is set to X509Data/X509SubjectName return ...; } else if (keyid) { // use this to get the key from a key store using the keyid[0..keyidlen-1]: // 1. keyid and keyidlen are set to the data in // SecurityTokenReference/KeyIdentifier when the ValueType is // http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509SubjectKeyIdentifier return ...; } break; case SOAP_MEC_DEC_DES_CBC: case SOAP_MEC_DEC_AES128_CBC: case SOAP_MEC_DEC_AES192_CBC: case SOAP_MEC_DEC_AES256_CBC: case SOAP_MEC_DEC_AES512_CBC: // reserved for future use case SOAP_MEC_DEC_AES128_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_DEC_AES192_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_DEC_AES256_GCM: // GCM requires OpenSSL 1.0.2 or higher` case SOAP_MEC_DEC_AES512_GCM: // GCM requires OpenSSL 1.0.2 or higher if (keyname) { // use the keyname to get the shared secret key associated for decryption *keylen = ... // length of the shared secret key return ...; } break; } return NULL; // fail } @endcode @warning The security token handler callback function parameters have changed in 2.8.34 and greater with the addition of KeyIdentifier information `keyid` and `keyidlen`. @subsection wsse_8_2a Signing Messages After the plugin is registered and a signature algorithm selected, the `soap_wsse_sign` function or the `soap_wsse_sign_body` function is used to initiate the signature engine to automatically sign outbound messages. The code to sign the SOAP Body of a message using HMAC-SHA1 is: @code static char hmac_key[16] = { 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00 }; struct soap *soap = soap_new1(SOAP_XML_CANONICAL); soap_register_plugin(soap, soap_wsse); if (soap_wsse_sign_body(soap, SOAP_SMD_HMAC_SHA1, hmac_key, sizeof(hmac_key)) ... // an error occurred else if (soap_call_ns__myMethod(soap, ...)) ... // a transmission error occurred @endcode The `hmac_key` above is some secret key you generated for the sending side and receiving side (don't use the one shown here). Instead of SHA1 above, you can also use the more secure SHA224, SHA256, SHA384 and SHA512 hashes. As always, use `soap_print_fault` to display the error message. To sign the body of an outbound SOAP message using RSA-SHA (DSA-SHA is similar), we include the X509 certificate with the public key as a BinarySecurityToken in the header and a KeyInfo reference to the token to let receivers use the public key in the certificate to verify the authenticity of the message: @code FILE *fd; EVP_PKEY *rsa_private_key; X509 *cert; struct soap *soap = soap_new1(SOAP_XML_CANONICAL); soap_register_plugin(soap, soap_wsse); fd = fopen("privkey.pem", "r"); rsa_private_key = PEM_read_PrivateKey(fd, NULL, NULL, "password"); fclose(fd); fd = fopen("cert.pem", "r"); X509 *cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0)) ... // an error occurred else if (soap_call_ns__myMethod(soap, ...)) ... // a transmission error occurred @endcode The private key and its certificate are often placed in the same file, see e.g. server.pem in the package. To summarize the signing process: -# Register the wsse plugin. -# Obtain an HMAC secret key or a DSA/RSA/ECDSA private key. -# For DSA or RSA, obtain the X509 certificate with the public key signed by a certificate authority. -# Add the X509 certificate as a BinarySecurityToken to the header. -# Add a KeyInfo BinarySecurityTokenReference. -# Invoke `soap_wsse_sign_body` and/or `soap_wsse_sign` with `soap_wsse_sign_only` to sign the message. -# Always check the function return values for errors. You don't want to produce and accept messages with an invalid Security headers. @subsection wsse_8_2b Signing Message Parts The `soap_wsse_sign_body` function signs the entire SOAP body but nothing else. If it is desirable to sign individual parts of a message the `soap_wsse_sign_only` and `soap_wsse_sign` functions should be used. All message parts with wsu:Id attributes are signed. These message parts should not be nested (nested elements will not be separately signed). By default, all and only those XML elements with wsu:Id attributes are signed. Therefore, the wsu:Id attribute values used in a message must be unique within the message. Although usually not required, the default signing rule can be overridden with the `soap_wsse_sign_only` function, see @ref wsse_8_3. For example, consider a transaction in which we only want to sign a contract in the SOAP Body. This allows us to modify the rest of the message or extract the contract in XML and pass it on with the signature. The gSOAP header file includes a myContract declaration: @code struct ns__myContract { @char* wsu__Id = "Contract"; char* name; char* title; char* terms; }; int ns__myMethod(struct ns__myContract agreement, bool* accepted); @endcode The default value of the wsu:Id is "Contract" so that we can instantiate the struct, automatically sign it, and send it as follows: @code struct ns__myContract contract; bool accept; soap_default_ns__myContract(soap, &contract); contract.name = ...; contract.title = ...; contract.terms = ...; if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0)) ... // an error occurred else if (soap_call_ns__myMethod(soap, contract, &accept)) ... // a transmission error occurred @endcode The above example shows a wsu:Id attribute embedded (hardcoded) in a struct. When it is not possible to add the `wsu__Id` member, for example when the type is a string instead of a struct, it is suggested to specify the XML element to be signed with the `soap_wsse_set_wsu_id(soap, "space-separated string of element names")`. Use it before each call or in the server operation (when returning XML data from a service operation). This lets the engine add wsu:Id="tag" attribute-value pair to the element's tag name. For example: @code soap_wsse_set_wsu_id(soap, "ns:myContract"); // ... soap_wsse_set_InclusiveNamespaces(soap, "ns xsd"); // QNames have 'ns' and 'xsd' values if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0)) ... // an error occurred soap_wsse_set_wsu_id(soap, NULL); // reset soap_wsse_set_InclusiveNamespaces(soap, NULL); // reset @endcode This code adds the wsu:Id="ns-myContract" to the ns:myContract element. Here, the `wsu__Id` value in the struct MUST NOT be set. Otherwise, two wsu:Id attributes are present which is invalid. Also, the element signed must be unique in the message. That is, there cannot be more than one matching element, otherwise the resulting signature is invalid. @note To reset the automatic wsu:Id attributes addition, pass NULL to `soap_wsse_set_wsu_id` as shown above. This is automatically performed when a new message is received (but not automatically in a sequence of one-way sends for example). @note It is generally known that QName content of elements and attribute values may lead to verification issues with exclusive canonicalization (`SOAP_XML_CANONICAL`), because XML processors may not recognize prefixes in such QName contexts as visually utilized. With QName content in elements and attributes and `SOAP_XML_CANONICAL` enabled, we should use `soap_wsse_set_InclusiveNamespaces(soap, "prefixlist")` to define which namespace prefixes (space-separated in the string) should be considered inclusive. For example, xsi:type attribute values are QNames with xsd types (and perhaps other types), meaning we should add "xsd" to the inclusive namespace prefix list with `soap_wsse_set_InclusiveNamespaces(soap, "xsd")` to ensure xsi:type="xsd:TYPE" attributes with QName content are properly signed and not susceptible to certain wrapping attacks. A quick way to include all prefixes in the signed contents and thereby thwart signature wrapping attacks is to use `soap_wsse_set_InclusiveNamespaces(soap, "+")`. @note When signing parts of the body as outlined above, use `soap_wsse_sign` (do NOT use `soap_wsse_sign_body`). @warning Do not attempt to sign an element with a wsu:Id that is a subelement of another element with a wsu:Id, that is, do not sign inner nested wsu:Id elements. The element that you will try to sign will not be canonicalized and will lead to a failure of the signature verification. When elements with wsu:Id are nested, sign the outermost element. We recommend to sign the entire SOAP Body using `soap_wsse_sign_body` and reserve the use of `soap_wsse_set_wsu_id` for SOAP Header elements, such as WS-Addressing elements. For example, to add and sign WS-Addressing 2005 headers (which are activated with an `#import "wsa5.h"` in the header file for soapcpp2): @code #include "wsaapi.h" #include "wsseapi.h" soap_register_plugin(soap, soap_wsa); soap_register_plugin(soap, soap_wsse); ... soap_wsse_set_wsu_id(soap, "wsa5:From wsa5:To wsa5:ReplyTo wsa5:FaultTo wsa5:Action wsa5:MessageID"); if (soap_wsa_request(soap, RequestMessageID, ToAddress, RequestAction) || soap_wsa_add_From(soap, FromAddress) // optional: add a 'From' address || soap_wsa_add_FaultTo(soap, FaultToAddress)) ... // error: out of memory if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0)) ... // an error occurred else if (soap_call_ns__myMethod(soap, ...)) ... // a transmission error occurred soap_wsse_set_wsu_id(soap, NULL); @endcode This code signs the wsa5 header elements that are set with `soap_wsa_request`, see the WS-Addressing "wsa" API in the gSOAP documentation for more information on the use of WS-Addressing). It is fine to specify more elements with `soap_wsse_set_wsu_id` than actually present in the XML payload. The other WS-Addressing headers are not present and are not signed. If your are using WS-Addressing 2004 (which is activated with an `#import "wsa.h"` in the header file for soapcpp2) then change one line: @code soap_wsse_set_wsu_id(soap, "wsa:From wsa:To wsa:ReplyTo wsa:FaultTo wsa:Action wsa:MessageID"); @endcode @note `soap_wsse_set_wsu_id` should only be set once for each `soap_wsse_sign` or `soap_wsse_sign_body`. Each new call overrides the previous setting. @warning Never use `soap_wsse_set_wsu_id` to set the wsu:Id for an element that occurs more than once in the payload, since each will have the same wsu:Id attribute that may lead to a WS-Signature failure. @subsection wsse_8_3 Signing Security Headers and Tokens To sign security tokens such as user names, passwords, and binary security tokens, just assign their Id values with a unique string, such as "Time" for timestamps and "User" for user names. For example: @code soap_wsse_add_Timestamp(soap, "Time", 600); soap_wsse_add_UsernameTokenDigest(soap, "User", "username", "password"); ... // the rest of the signing code @endcode Note that by default all wsu:Id-attributed elements are signed. To filter a subset of wsu:Id-attributed elements for signatures, use the `soap_wsse_sign_only` function to specify a subset of the elements that have wsu:Id values as follows: @code soap_wsse_add_Timestamp(soap, "Time", 600); soap_wsse_add_UsernameTokenDigest(soap, "User", "username", "password"); soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert); soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token"); soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0); soap_wsse_sign_only(soap, "Time User Body"); // OK to use after soap_wsse_sign_body @endcode The wsu:Id values are provides with the `add` functions, such as "User" and "X509Token". The SOAP Body always has a wsu:Id value "Body" when `soap_wsse_sign_body` is used. Note that in the above we MUST set the X509Token name for cross-referencing with a wsu:Id, which normally results in automatically signing that token unless filtered out with `soap_wsse_sign_only`. The SOAP Body wsu:Id is always "Body" and should be part of the `soap_wsse_sign_only` set of wsu:Id names to sign. When using `soap_wsse_set_wsu_id` we need to use the tag name with `soap_wsse_sign_only`. For example: @code soap_wsa_request(soap, RequestMessageID, ToAddress, RequestAction); soap_wsse_set_wsu_id(soap, "wsa5:To wsa5:From wsa5:ReplyTo wsa5:Action"); soap_wsse_add_UsernameTokenDigest(soap, "User", "username", "password"); soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert); soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token"); soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0); soap_wsse_sign_only(soap, "wsa5:To wsa5:From wsa5:ReplyTo wsa5:Action User Body"); @endcode @note `soap_wsse_sign_only` should only be set once for each `soap_wsse_sign` or `soap_wsse_sign_body`. Each new call overrides the previous. @note To reset the filtering of signed tokens and elements, pass NULL to `soap_wsse_sign_only`. This is automatically performed when a new message is received (but not automatically in a sequence of one-way sends for example). @subsection wsse_8_4 Signature Validation To automatically verify the signature of an inbound message signed with DSA or RSA algorithms, assuming the message contains the X509 certificate as a binary security token, use: @code struct soap *soap = soap_new1(SOAP_XML_CANONICAL); soap_register_plugin(soap, soap_wsse); soap_wsse_verify_auto(soap, SOAP_SMD_NONE, NULL, 0); soap->cafile = "cacerts.pem"; // file with CA certs of peers soap->capath = "dir/to/certs"; // and/or point to CA certs directory soap->crlfile = "revoked.pem"; // use CRL (optional) // server: if (soap_serve(soap)) ... // an error occurred // client: if (soap_call_ns__myMethod(soap, ...)) ... // an error occurred @endcode All locally referenced and signed elements in the signed message will be verified with `soap_wsse_verify_auto` using the default settings set with `SOAP_SMD_NONE`. Elements that are not signed cannot be verified. Also elements referenced with absolute URIs that are not part of the message are not automatically verified. The received message is stored in a DOM accessible with soap->dom. This enables further analysis of the message content. For a post-parsing check to verify if an XML element was signed in an inbound message, use: @code soap_wsse_verify_auto(soap, SOAP_SMD_NONE, NULL, 0); soap->cafile = "cacerts.pem"; // file with CA certs of peers soap->capath = "dir/to/certs"; // and/or point to CA certs directory soap->crlfile = "revoked.pem"; // use CRL (optional) ... // client call if (soap_wsse_verify_element(soap, "namespaceURI", "tag") == 1) ... // only one element with matching tag and namespace is signed @endcode The `soap_wsse_verify_element` function returns the number of matching elements signed. The signed element nesting rules are obeyed, so if the matching element is a descendent of a signed element, it is signed as well. Because it is a post check, a client should invoke `soap_wsse_verify_element` after the call completed. A service should invoke this function within the service operation routine, i.e. when the message request is accepted and about to be processed. For example, to check whether the wsu:Timestamp element was signed, e.g. after checking that it is present and message expiration checked with `soap_wsse_verify_Timestamp`, use: @code if (!soap_wsse_verify_Timestamp(soap)) { soap_wsse_delete_Security(soap); ... // error } else if (soap_wsse_verify_element(soap, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "Timestamp") > 0) ... // timestamp was signed @endcode To check the SOAP Body (either using SOAP 1.1 or 1.2), simply use `soap_wsse_verify_body`. The `soap_wsse_verify_auto` function keeps processing signed (and unsigned) messages as they arrive. For unsigned messages this can be expensive and the verification engine should be shut down using `soap_wsse_verify_done`. There can be two problems with signature verification. First, some WS-Security implementations include SignedInfo/Reference/@URI without targeting an element, which will produce an error that a Reference URI target does not exist. To ignore these references, use `SOAP_WSSE_IGNORE_EXTRA_REFS`. Second, certificates provided by the peer are not verifiable unless the signing CA certificate is included in the cafile or capath. To disable peer certificate verification, set the fsslverify callback to return 1 as follows: @code static int ssl_verify(int ok, X509_STORE_CTX *store) { // put certificate verification here, return 0 when fails 1 when ok return 1; } ... soap_wsse_verify_auto(soap, SOAP_SMD_NONE | SOAP_WSSE_IGNORE_EXTRA_REFS, NULL, 0); soap->cafile = "cacerts.pem"; // file with CA certs of peers soap->capath = "dir/to/certs"; // and/or point to CA certs directory soap->crlfile = "revoked.pem"; // use CRL (optional) soap->fsslverify = ssl_verify; // set certificate verification callback @endcode To reject peer certificates under all conditions except specific permitted conditions such as self-signed certificates in the chain, use the following code as a guide (see OpenSSL documentation on `X509_STORE_CTX_get_error`): @code static int ssl_verify(int ok, X509_STORE_CTX *store) { if (!ok) { char buf[1024]; int err = X509_STORE_CTX_get_error(store); X509 *cert = X509_STORE_CTX_get_current_cert(store); switch (err) { case X509_V_ERR_CERT_NOT_YET_VALID: case X509_V_ERR_CERT_HAS_EXPIRED: case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: case X509_V_ERR_UNABLE_TO_GET_CRL: case X509_V_ERR_CRL_NOT_YET_VALID: case X509_V_ERR_CRL_HAS_EXPIRED: X509_STORE_CTX_set_error(store, X509_V_OK); ok = 1; break; default: fprintf(stderr, "SSL verify error %d or warning with certificate at depth %d: %s\n", err, X509_STORE_CTX_get_error_depth(store), X509_verify_cert_error_string(err)); X509_NAME_oneline(X509_get_issuer_name(cert), buf, sizeof(buf)-1); fprintf(stderr, " certificate issuer: %s\n", buf); X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)-1); fprintf(stderr, " certificate subject: %s\n", buf); } } return ok; } ... soap_wsse_verify_auto(soap, SOAP_SMD_NONE | SOAP_WSSE_IGNORE_EXTRA_REFS, NULL, 0); soap->cafile = "cacerts.pem"; // file with CA certs of peers soap->capath = "dir/to/certs"; // and/or point to CA certs directory soap->crlfile = "revoked.pem"; // use CRL (optional) soap->fsslverify = ssl_verify; @endcode To verify the HMAC signature of an inbound message, the HMAC key must be supplied: @code static char hmac_key[16] = // the same secret key that was used to sign { 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00 }; struct soap *soap = soap_new1(SOAP_XML_CANONICAL); soap_register_plugin(soap, soap_wsse); soap_wsse_verify_auto(soap, SOAP_SMD_HMAC_SHA1, hmac_key, sizeof(hmac_key)); soap->cafile = "cacerts.pem"; // file with CA certs of peers soap->capath = "dir/to/certs"; // and/or point to CA certs directory soap->crlfile = "revoked.pem"; // use CRL (optional) // server: if (soap_serve(soap)) ... // an error occurred // client: if (soap_call_ns__myMethod(soap, ...)) ... // an error occurred @endcode To summarize the signature verification process: -# Register the wsse plugin. -# For HMAC, obtain the HMAC secret key -# Use `soap_wsse_verify_auto` to verify inbound messages. -# Set the cafile (or capath) to verify certificates of the peers and crlfile (optional) -# After receiving a message, the DOM in soap->dom can be traversed for further analysis. -# Always check the function return values for errors. You don't want to accept a request or response message with an invalid Security header. -# Use `soap_wsse_verify_done` to terminate verification, e.g. to consume plain messages more efficiently. @section wsse_9 Encryption The material in this section relates to the WS-Security specification section 9. The wsse plugin must be registered: @code struct soap *soap = soap_new1(SOAP_XML_CANONICAL); soap_register_plugin(soap, soap_wsse); @endcode To send messages with inclusive canonicalization, in addition to the `SOAP_XML_CANONICAL` flag also use: @code soap_wsse_set_InclusiveNamespaces(soap, "*"); @endcode However, exclusive canonicalization is recommended over inclusive canonicalization, or no canonicalization at all. WS Basic Security profile 1.0 requires exclusive canonicalization. Flags to consider: - `SOAP_XML_CANONICAL` recommended to enable exc-c14n (exclusive canonicalization). - `SOAP_XML_INDENT` optional, to emit more readable XML (see warning). - `SOAP_IO_CHUNK` efficient HTTP-chunked streaming messages. - `SOAP_ENC_GZIP` for HTTP compression (also enables HTTP chunking). @warning Interoperability with WCF WS-Security is not guaranteed when `SOAP_XML_INDENT` is enabled. Avoid using `SOAP_XML_INDENT` for interoperability. The implementation of C14N in WCF with respect to the normalization of white space between XML tags differs from the protocol standards. @subsection wsse_9_1 Encrypting Messages Encryption should be used in combination with signing. A signature ensures message integrity while encryption ensures confidentially. Encrypted messages can be tampered with unless integrity is ensured. Therefore, the reader should be familiar with the material in Section @ref wsse_8 should to sign and verify message content. Messages are encrypted using either public key cryptography or by using a symmetric secret key. A symmetric secret key should only be shared between the sender and receiver (or any trusted communicating peer). Encryption with public key cryptography uses an "envelope" process, where the public key of the recipient is used to encrypt a temporary (ephemeral) secret key that is sent together with the secret key-encrypted message to the recipient. The recipient decrypts the ephemeral key and uses it to decrypt the message. The public key is usually part of a X509 certificate. The public key (containing the subject information) is added to the Security header and used for encryption of the SOAP Body as follows: @code X509 *cert = ...; // if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, NULL, NULL)) soap_print_fault(soap, stderr); @endcode `SOAP_MEC_ENV_ENC_DES_CBC` specifies envelope encoding with triple DES CBC and PKCS1 RSA-1_5. Use `(SOAP_MEC_ENV_ENC_AES256_CBC | SOAP_MEC_OAEP)` for AES256 CBC with OAEP padding (OAEP is recommended over RSA-1_5 or use GCM). The envelope encryption options are: - `SOAP_MEC_ENV_ENC_DES_CBC` RSA-1_5 envelope encryption with triple DES CBC - `SOAP_MEC_ENV_ENC_AES256_CBC` RSA-1_5 envelope encryption with AES256 CBC - `SOAP_MEC_ENV_ENC_AES256_GCM` envelope authenticated encryption with AES256 GCM - `SOAP_MEC_ENV_ENC_AES256_CBC | SOAP_MEC_OAEP` OAEP envelope encryption with AES256 CBC where, in the above, AES256 can also be replaced with AES128 or AES192. The "Cert" parameter is a unique URI to reference the key from the encrypted SOAP Body. The above enables the encryption engine for the next message to be sent, either at the client or server side. The server should use this withing a server operation (before returning) to enable the service operation response to be encrypted. To include a subject key ID in the Security header instead of the entire public key, specify the subject key ID parameter: @code X509 *cert = ...; // if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, "Subject Key ID", NULL, NULL)) soap_print_fault(soap, stderr); @endcode The difference with the previous example where no subject key ID was specified is that the Security header only contains the subject key ID and no longer the public key in base64 format. To exclude the encrypted key certificate from the message and include a X509Data element with IssuerName and SerialNumber: @code X509 *cert = ...; if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, "CN=Root Agency", "-79441640260855276448009124614332182350")) soap_print_fault(soap, stderr); @endcode The issuer name and serial number (must be in decimal for `soap_wsse_add_EncryptedKey`) of a certificate can be obtained as follows: @code X509 *cert = ...; BIGNUM *bn = BN_new(); char issuer[256], *serial; X509_NAME_oneline(X509_get_issuer_name(cert), issuer, sizeof(issuer)-1); ASN1_INTEGER_to_BN(X509_get_serialNumber(cert), bn); serial = BN_bn2dec(bn); OPENSSL_free(bn); ... if (soap_wsse_add_EncryptedKey(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, issuer+1, serial)) soap_print_fault(soap, stderr); ... OPENSSL_free(serial); @endcode Note that in the above code the leading slash in "/CN=Root Agency" is excluded from the issuer name. When excluding the encrypted key certificate from the message, the token handler callback must be provided on the receiving end to obtain the certificate that corresponds to the issuer name and serial number. To encrypt specific elements of the SOAP Body rather than the entire SOAP Body, use `soap_wsse_add_EncryptedKey_encrypt_only` to specify elements to encrypt in combination with `soap_wsse_set_wsu_id` to specify these elements again as follows: @code X509 *cert = ...; // the SOAP Body contains one and one (not nested) soap_wsse_set_wsu_id(soap, "ns:myContract ns:myPIN"); if (soap_wsse_add_EncryptedKey_encrypt_only(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, NULL, NULL, "ns:myContract ns:myPIN")) soap_print_fault(soap, stderr); @endcode To encrypt the SOAP Body and SOAP Header element(s), such as ds:Signature, use "SOAP-ENV:Body" with `soap_wsse_add_EncryptedKey_encrypt_only` to specify these elements: @code X509 *cert = ...; soap_wsse_set_wsu_id(soap, "ds:Signature"); if (soap_wsse_add_EncryptedKey_encrypt_only(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, NULL, NULL, "ds:Signature SOAP-ENV:Body")) soap_print_fault(soap, stderr); @endcode @note The `soap_wsse_set_wsu_id` MUST be used to specify all element tag names to encrypt. Additional elements MAY be specified in `soap_wsse_set_wsu_id` (for example elements to digitally sign). You do not have to use this function to set the wsu:Id of the SOAP Body which always has a wsu:Id with "Body". @note The elements identified by the tag names in `soap_wsse_set_wsu_id` to encrypt MUST occur NO MORE THAN ONCE in the XML message. For symmetric encryption with a shared secret key, generate a 160-bit triple DES key and make sure both the sender and reciever can use the key without it being shared by any other party (key exchange problem). Then use the `soap_wsse_encrypt_body` function to encrypt the SOAP Body as follows: @code char des_key[20] = ...; // 20-byte (160-bit) DES shared secret key if (soap_wsse_encrypt_body(soap, SOAP_MEC_ENC_DES_CBC, des_key, sizeof(des_key))) soap_print_fault(soap, stderr); @endcode The symmetric encryption options are: - `SOAP_MEC_ENC_DES_CBC` symmetric encryption with triple DES CBC - `SOAP_MEC_ENC_AES256_CBC` symmetric encryption with AES256 CBC - `SOAP_MEC_ENC_AES256_GCM` symmetric authenticated encryption with AES256 GCM where, in the above, AES256 can also be replaced with AES128 or AES192. For example, symmetric encryption with AES256: @code char aes256_key[32] = ...; // 32-byte (256-bit) AES256 shared secret key if (soap_wsse_encrypt_body(soap, SOAP_MEC_ENC_AES256_CBC, aes256_key, sizeof(aes256_key))) soap_print_fault(soap, stderr); @endcode To symmetrically encrypt specific elements of the SOAP Body rather than the entire SOAP Body, use `soap_wsse_encrypt_only` to specify the elements to encrypt in combination with `soap_wsse_set_wsu_id` to specify these elements again as follows: @code char des_key[20] = ...; // 20-byte (160-bit) secret key // the SOAP Body contains one and one (not nested) soap_wsse_set_wsu_id(soap, "ns:myContract ns:myPIN"); if (soap_wsse_encrypt_only(soap, SOAP_MEC_ENC_DES_CBC, des_key, sizeof(des_key), "ns:myContract ns:myPIN")) soap_print_fault(soap, stderr); @endcode @note The `soap_wsse_set_wsu_id` MUST be used to specify all element tag names to encrypt. Additional elements MAY be specified in `soap_wsse_set_wsu_id` (for example elements to digitally sign). @note The elements identified by the tag names in `soap_wsse_set_wsu_id` to encrypt MUST occur EXACTLY ONCE in the SOAP Body. @subsection wsse_9_2 Decrypting Message Parts The wsse engine automatically decrypts message parts, but requires a private key or secret shared key to do so. A default key can be given to enable decryption, but it will fail if a non-compatible key was used for encryption. In that case a token handler callback should be defined by the user to select a proper decryption key based on the available subject key name or identifier embedded in the encrypted message. An example of a token handler callback: @code soap_register_plugin_arg(soap, soap_wsse); soap_wsse_set_security_token_handler(soap, security_token_handler); const void *security_token_handler(struct soap *soap, int *alg, const char *keyname, const unsigned char *keyid, int keyidlen, int *keylen) { // Get the user name from UsernameToken in message const char *uid = soap_wsse_get_Username(soap); switch (*alg) { case SOAP_SMD_VRFY_DSA_SHA1: case SOAP_SMD_VRFY_DSA_SHA256: case SOAP_SMD_VRFY_RSA_SHA1: case SOAP_SMD_VRFY_RSA_SHA224: case SOAP_SMD_VRFY_RSA_SHA256: case SOAP_SMD_VRFY_RSA_SHA384: case SOAP_SMD_VRFY_RSA_SHA512: case SOAP_SMD_VRFY_ECDSA_SHA1: case SOAP_SMD_VRFY_ECDSA_SHA224: case SOAP_SMD_VRFY_ECDSA_SHA256: case SOAP_SMD_VRFY_ECDSA_SHA384: case SOAP_SMD_VRFY_ECDSA_SHA512: if (uid) { // Lookup uid to retrieve the X509 certificate to verify the signature const X509 *cert = ...; return (const void*)cert; } break; case SOAP_SMD_HMAC_SHA1: case SOAP_SMD_HMAC_SHA224: case SOAP_SMD_HMAC_SHA256: case SOAP_SMD_HMAC_SHA384: case SOAP_SMD_HMAC_SHA512: if (uid) { // Lookup uid to retrieve the HMAC SHA key to verify the signature const void *key = ...; *alg = ...; *keylen = ...; return key; } return NULL; // no certificate: fail case SOAP_MEC_ENV_DEC_DES_CBC: case SOAP_MEC_ENV_DEC_AES128_CBC: case SOAP_MEC_ENV_DEC_AES192_CBC: case SOAP_MEC_ENV_DEC_AES256_CBC: case SOAP_MEC_ENV_DEC_AES512_CBC: // reserved for future use case SOAP_MEC_ENV_DEC_AES128_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_ENV_DEC_AES192_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_ENV_DEC_AES256_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_ENV_DEC_AES512_GCM: // GCM requires OpenSSL 1.0.2 or higher if (keyname) { // use this to get the key or certificate from a key store using the keyname value: // 1. keyname is set to the subject name of the certificate, if a // certificate is present in the SecurityTokenReference/KeyIdentifier // when ValueType is http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3 // 2. keyname is set to the string concatenation // "{X509IssuerName}#{X509SerialNumber}" of the X509IssuerName // and X509SerialNumber present in X509Data/X509IssuerSerial // 3. keyname is set to X509Data/X509SubjectName return ...; } else if (keyid) { // use this to get the key from a key store using the keyid[0..keyidlen-1]: // 1. keyid and keyidlen are set to the data in // SecurityTokenReference/KeyIdentifier when the ValueType is // http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509SubjectKeyIdentifier return ...; } break; case SOAP_MEC_DEC_DES_CBC: case SOAP_MEC_DEC_AES128_CBC: case SOAP_MEC_DEC_AES192_CBC: case SOAP_MEC_DEC_AES256_CBC: case SOAP_MEC_DEC_AES512_CBC: // reserved for future use case SOAP_MEC_DEC_AES128_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_DEC_AES192_GCM: // GCM requires OpenSSL 1.0.2 or higher case SOAP_MEC_DEC_AES256_GCM: // GCM requires OpenSSL 1.0.2 or higher` case SOAP_MEC_DEC_AES512_GCM: // GCM requires OpenSSL 1.0.2 or higher if (keyname) { // use the keyname to get the shared secret key associated for decryption *keylen = ... // length of the shared secret key return ...; } break; } return NULL; // fail } @endcode The last two case-arms are used to return a key associated with the keyname paramater, which is a string that contains the subject key id from the public key information in an encrypted message or the subject key ID string that was set with `soap_wsse_add_EncryptedKey` at the sender side. @warning The security token handler callback function parameters have changed in 2.8.34 and greater with the addition of KeyIdentifier information `keyid` and `keyidlen`. To set the default private key for envelope decryption, use: @code EVP_PKEY *rsa_private_key = ...; soap_wsse_decrypt_auto(soap, SOAP_MEC_ENV_DEC_DES_CBC, rsa_private_key, 0); @endcode The envelope decryption options are: - `SOAP_MEC_ENV_DEC_DES_CBC` RSA-1_5 envelope decryption with triple DES CBC - `SOAP_MEC_ENV_DEC_AES256_CBC` RSA-1_5 envelope decryption with AES256 CBC - `SOAP_MEC_ENV_DEC_AES256_GCM` envelope authenticated decryption with AES256 GCM - `SOAP_MEC_ENV_DEC_AES256_CBC | SOAP_MEC_OAEP` OAEP envelope decryption with AES256 CBC where, in the above, AES256 can be replaced with AES128 or AES192. To set the default shared secret key for symmetric decryption, use: @code char des_key[20] = ...; // 20-byte (160-bit) triple DES key soap_wsse_decrypt_auto(soap, SOAP_MEC_DEC_DES_CBC, des_key, sizeof(des_key)); @endcode The symmetric decryption options are: - `SOAP_MEC_DEC_DES_CBC` symmetric decryption with triple DES CBC - `SOAP_MEC_DEC_AES256_CBC` symmetric decryption with AES256 CBC - `SOAP_MEC_DEC_AES256_GCM` symmetric authenticated decryption with AES256 GCM where, in the above, AES256 can be replaced with AES128 or AES192. For example, symmetric decryption with AES256: @code char aes256_key[32] = ...; // 32-byte (256-bit) AES256 key soap_wsse_decrypt_auto(soap, SOAP_MEC_DEC_AES256_CBC, aes256_key, sizeof(aes256_key)); @endcode If a default key is not set, the token handler callback should be used as discussed above in this section. Do NOT set a default key if a token handler is used to handle multiple different keys. The default key mechanism is simpler to use when only one decryption key is used to decrypt all encrypted messages. To remove the default key, use: @code soap_wsse_decrypt_auto(soap, SOAP_MEC_NONE, NULL, 0); @endcode @subsection wsse_9_3 Example Client and Server The code for a client is shown below that uses signatures and encryption: @code FILE *fd; EVP_PKEY *rsa_private_key; X509 *cert; // create new context with recommended C14N enabled struct soap *soap = soap_new1(SOAP_XML_CANONICAL); // register the plugin(s) soap_register_plugin(soap, soap_wsse); // enable peer certificate verification soap->cafile = "cacerts.pem"; // file with CA certs of peers soap->capath = "dir/to/certs"; // and/or point to CA certs directory soap->crlfile = "revoked.pem"; // use CRL (optional) soap->fsslverify = ssl_verify; // optional, a callback to verify peer certificates // get the private key for signing and decryption fd = fopen("privkey.pem", "r"); rsa_private_key = PEM_read_PrivateKey(fd, NULL, NULL, "password"); fclose(fd); // get the certificate to include in the security header fd = fopen("cert.pem", "r"); X509 *cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); // enable decryption with the private key soap_wsse_decrypt_auto(soap, SOAP_MEC_ENV_DEC_DES_CBC, rsa_private_key, 0); // enable signature verification soap_wsse_verify_auto(soap, SOAP_SMD_NONE, NULL, 0); // add the certificate X509 token and token reference, sign the Body using the private key if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0)) ... // an error occurred // encrypt the Body and the signature using the public key in cert (the cert of the peer) soap_wsse_set_wsu_id(soap, "ds:Signature"); if (soap_wsse_add_EncryptedKey_encrypt_only(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, NULL, NULL, "ds:Signature SOAP-ENV:Body")) ... // an error occurred if (soap_call_ns__myMethod(soap, ...)) ... // a transmission error occurred ... EVP_PKEY_free(rsa_private_key); X509_free(cert); @endcode When using HTTPS, the `soap->cafile`, `soap->capath` are already set with `soap_ssl_client_context()`. The explicit assignments shown above are not needed. See @ref wsse_8_4 on how to implement the optional `ssl_verify` callback to verify peer certificates. You may want to register a token handler callback if the peer does not include its X509 certificate in the security header. The token handler callback should retrieve the certificate, e.g. given its id and serial number. The server-side service is implemented as follows: @code EVP_PKEY *rsa_private_key; // OK to declare global X509 *cert; // OK to declare global .. FILE *fd; // create new context with recommended C14N enabled struct soap *soap = soap_new1(SOAP_XML_CANONICAL); // register the plugin(s) soap_register_plugin(soap, soap_wsse); // enable peer certificate verification soap->cafile = "cacerts.pem"; // file with CA certs of peers soap->capath = "dir/to/certs"; // and/or point to CA certs directory soap->crlfile = "revoked.pem"; // use CRL (optional) soap->fsslverify = ssl_verify; // optional, a callback to verify peer certificates // get the private key for signing and decryption fd = fopen("privkey.pem", "r"); rsa_private_key = PEM_read_PrivateKey(fd, NULL, NULL, "password"); fclose(fd); // get the certificate to include in the security header fd = fopen("cert.pem", "r"); X509 *cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); ... if (!soap_valid_socket(soap_bind(soap, NULL, port, 100))) ... // an error occurred while (soap_valid_socket(soap_accept(soap))) { // enable signature verification soap_wsse_verify_auto(soap, SOAP_SMD_NONE, NULL, 0); // enable decryption with the private key soap_wsse_decrypt_auto(soap, SOAP_MEC_ENV_DEC_DES_CBC, rsa_private_key, 0); // serve one request if (soap_serve(soap)) { soap_wsse_delete_Security(soap); soap_print_fault(soap, stderr); } } ... EVP_PKEY_free(rsa_private_key); X509_free(cert); @endcode where an example service operation could be: @code int ns__myMethod(struct soap *soap, ...) { ... // remove old security headers soap_wsse_delete_Security(soap); // encrypt the Body and the signature using the public key in cert (the cert of the peer) soap_wsse_set_wsu_id(soap, "ds:Signature"); // add the certificate X509 token and token reference, sign the Body using the private key // encrypt the Body and the signature using the public key in cert (the cert of the peer) if (soap_wsse_add_BinarySecurityTokenX509(soap, "X509Token", cert) || soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(soap, "#X509Token") || soap_wsse_sign_body(soap, SOAP_SMD_SIGN_RSA_SHA256, rsa_private_key, 0) || soap_wsse_add_EncryptedKey_encrypt_only(soap, SOAP_MEC_ENV_ENC_DES_CBC, "Cert", cert, NULL, NULL, NULL, "ds:Signature SOAP-ENV:Body")) { soap_wsse_delete_Security(soap); // remove incomplete security headers return soap->error; } return SOAP_OK; } @endcode The service operation signs the Body using its private key and encrypts the response Body and signature using a public key from the peer's certificate. To implement a server that supports HTTP keep-alive, a `soap->fserveloop` callback function should be assigned. This callback is executed in the `soap_serve()` loop to call `soap_wsse_verify_auto()` and `soap_wsse_decrypt_auto()` to ensure that the continuous inbound message stream can be verified and decrypted: @code struct soap *soap = soap_new1(SOAP_XML_CANONICAL | SOAP_IO_KEEPALIVE); soap_register_plugin(soap, soap_wsse); ... soap->fserveloop = set_verify_decrypt_auto; ... while (soap_valid_socket(soap_accept(soap))) { set_verify_decrypt_auto(soap); // serve multiple requests (when keep alive) if (soap_serve(soap)) { soap_wsse_delete_Security(soap); soap_print_fault(soap, stderr); } } int set_verify_decrypt_auto(struct soap *soap) { // enable signature verification soap_wsse_verify_auto(soap, SOAP_SMD_NONE, NULL, 0); // enable decryption with the private key soap_wsse_decrypt_auto(soap, SOAP_MEC_ENV_DEC_DES_CBC, rsa_private_key, 0); return SOAP_OK; } @endcode @section wsse_10 Security Timestamps The material in this section relates to the WS-Security specification section 10. To add a timestamp with the creation time to the Security header, use: @code soap_wsse_add_Timestamp(soap, NULL, 0); // 0 means no expiration @endcode The lifetime of a message (in seconds) is passed as the third argument, which will be displayed as the timestamp expiration time: @code soap_wsse_add_Timestamp(soap, NULL, 10); // 10 seconds lifetime @endcode Timestamps, like other header elements, are not automatically secured with a digital signature. To secure a timestamp, we add an identifier (wsu:Id) to each element we want the WS-Security plugin to sign thereby making it impossible for someone to tamper with that part of the message. To do this for the timestamp, we simply pass a unique identification string as the second argument: @code soap_wsse_add_Timestamp(soap, "Time", 10); // timestamp will be signed @endcode After receiving a message, the receiver can verify the presence and validity of the timestamp and whether it was signed with: @code if (!soap_wsse_verify_Timestamp(soap)) { soap_wsse_delete_Security(soap); ... // error, no timestamp or timestamp has expired } else if (soap_wsse_verify_element(soap, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "Timestamp") > 0) ... // timestamp was signed @endcode @section wsse_11 WS-Security and HTTPS HTTPS is used at the client side with the usual "https:" URL addressing, shown here with the registration of the wsse plugin and setting up locks for thread-safe use of SSL for HTTPS: @code #include "wsseapi.h" #include "threads.h" struct soap *soap; if (CRYPTO_thread_setup()) ... // error soap = soap_new1(SOAP_XML_CANONICAL); soap_register_plugin(soap, soap_wsse); if (soap_ssl_client_context(&soap, SOAP_SSL_DEFAULT, // requires server authentication NULL, // keyfile for client authentication to server NULL, // the keyfile password "cacerts.pem", // cafile CA certificates to authenticate the server NULL, // capath CA directory path to certificates NULL )) ... // error soap->cafile = "cacerts.pem"; // same as above (or overrides the above) soap->capath = "dir/to/certs"; // and/or point to CA certs soap->crlfile = "revoked.pem"; // use CRL (optional) ... // set up WS-Security for signatures/encryption etc if (soap_call_ns__myMethod(soap, "https://...", ...)) ... // error ... // process response results soap_destroy(soap); soap_end(soap); soap_free(soap); CRYPTO_thread_cleanup(); @endcode The CRYPTO threads should be set up before any threads are created. The `soap_ssl_client_context` only needs to be set up once. Use the following flags: - `SOAP_SSL_DEFAULT` requires server authentication, CA certs should be used - `SOAP_SSL_NO_AUTHENTICATION` disables server authentication - `SOAP_SSL_SKIP_HOST_CHECK` disables server authentication host check - `SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE` to accept self-signed certificates, expired certificates, and certificates without CRL. The server uses the following: @code #include "wsseapi.h" #include "threads.h" SOAP_SOCKET m, s; int port = 443; struct soap *soap; if (CRYPTO_thread_setup()) ... // error soap = soap_new1(SOAP_XML_CANONICAL); soap_register_plugin(soap, soap_wsse); if (soap_ssl_server_context(&soap, SOAP_SSL_DEFAULT, // requires server to authenticate, but not the client server.pem, // keyfile for authentication to client "password", // the keyfile password NULL, // CA certificates to authenticate the client NULL, // CA directory path to certificates NULL, // use RSA 2048 bits (or give file name with DH param) NULL, NULL )) ... // error if (!soap_valid_socket(m = soap_bind(soap, NULL, port, 100)) ... // error for (;;) { if (!soap_valid_socket(s = soap_accept(soap))) ... // error else { struct soap *tsoap = soap_copy(soap); while (THREAD_CREATE(&tid, (void*(*)(void*))&process_request, (void*)tsoap)) sleep(1); } } soap_destroy(soap); soap_end(soap); soap_free(soap); CRYPTO_thread_cleanup(); @endcode where we define a `process_request()` function that is executed by the thread to process the request (on a copy of the soap context struct): @code void *process_request(struct soap *soap) { ... // set up WS-Security for signatures/encryption etc if (soap_ssl_accept(soap) || soap_serve(soap)) ... // error soap_destroy(soap); soap_end(soap); soap_free(soap); } @endcode The `soap_ssl_server_context` only needs to be set up once. Use the following flags: - `SOAP_SSL_DEFAULT` requires server authentication, but no client authentication - `SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION` requires client authentication We also should implement the mutex setup and cleanup operations as follows: @code struct CRYPTO_dynlock_value { MUTEX_TYPE mutex; }; static MUTEX_TYPE *mutex_buf; static struct CRYPTO_dynlock_value *dyn_create_function(const char *file, int line) { struct CRYPTO_dynlock_value *value; value = (struct CRYPTO_dynlock_value*)malloc(sizeof(struct CRYPTO_dynlock_value)); if (value) MUTEX_SETUP(value->mutex); return value; } static void dyn_lock_function(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line) { if (mode & CRYPTO_LOCK) MUTEX_LOCK(l->mutex); else MUTEX_UNLOCK(l->mutex); } static void dyn_destroy_function(struct CRYPTO_dynlock_value *l, const char *file, int line) { MUTEX_CLEANUP(l->mutex); free(l); } void locking_function(int mode, int n, const char *file, int line) { if (mode & CRYPTO_LOCK) MUTEX_LOCK(mutex_buf[n]); else MUTEX_UNLOCK(mutex_buf[n]); } unsigned long id_function() { return (unsigned long)THREAD_ID; } int CRYPTO_thread_setup() { int i; mutex_buf = (MUTEX_TYPE*)malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t)); if (!mutex_buf) return SOAP_EOM; for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_SETUP(mutex_buf[i]); CRYPTO_set_id_callback(id_function); CRYPTO_set_locking_callback(locking_function); CRYPTO_set_dynlock_create_callback(dyn_create_function); CRYPTO_set_dynlock_lock_callback(dyn_lock_function); CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function); return SOAP_OK; } void CRYPTO_thread_cleanup() { int i; if (!mutex_buf) return; CRYPTO_set_id_callback(NULL); CRYPTO_set_locking_callback(NULL); CRYPTO_set_dynlock_create_callback(NULL); CRYPTO_set_dynlock_lock_callback(NULL); CRYPTO_set_dynlock_destroy_callback(NULL); for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_CLEANUP(mutex_buf[i]); free(mutex_buf); mutex_buf = NULL; } @endcode For additional details and examples, see the user guide and examples in the gSOAP package directory gsoap/samples/ssl. @section wsse_12 Miscellaneous The Security header block was generated from the WS-Security schema with the wsdl2h tool and WS/WS-typemap.dat: wsdl2h -cegxy -o wsse.h -t WS/WS-typemap.dat WS/wsse.xsd The same process was used to generate the header file ds.h from the XML digital signatures core schema, and the xenc.h encryption schema: wsdl2h -cuxy -o ds.h -t WS/WS-typemap.dat WS/ds.xsd wsdl2h -cuxy -o xenc.h -t WS/WS-typemap.dat WS/xenc.xsd The import/wsse.h file has the following definition for the Security header block: @code typedef struct _wsse__Security { struct _wsu__Timestamp* wsu__Timestamp; struct _wsse__UsernameToken* UsernameToken; struct _wsse__BinarySecurityToken* BinarySecurityToken; struct xenc__EncryptedKeyType* xenc__EncryptedKey; struct _xenc__ReferenceList* xenc__ReferenceList; struct ds__SignatureType* ds__Signature; @char* SOAP_ENV__actor; @char* SOAP_ENV__role; } _wsse__Security; @endcode The `_wsse__Security` header is modified by a WS/WS-typemap.dat mapping rule to include additional details. @section wsse_13 Some Limitations - Encryption of simple content (CDATA content) directly with `soap_wsse_add_EncryptedKey_encrypt_only` is not supported. You can encrypt elements with complex content (complexType and complexContent elements that have sub elements). Decryption is not limited to elements with complex content. - Encryption is performed after signing (likewise, signatures are verified after decryption). Signing after encryption is not supported in the current plugin release. It is generally known that it is safer to perform encryption after signing as the WSSE plugin performs, and not vice versa. - Signing and encrypting XML containing QName content may lead to verification issues, because the W3C C14N exclusive canonicalization protocol has known limitations with QName content normalization. In fact, not signing the prefix bindings as in C14N exclusive canonicalization is a security risk, because the prefix-URI binding can be modified when placed at an ancestor node that is not included in the signed XML content. Use `soap_wsse_set_InclusiveNamespaces(soap, "prefixlist")` to define all namespace prefixes (space-separated in the string) that should be considered inclusive. All prefixes used in QName content should be listed to mitigate the security risks outlined. The WSSE engine recognizes xsi:type, SOAP-ENC:arrayType, SOAP-ENC:itemType attribute QNames. Therefore, soapcpp2 option `-t` is always safe to use, but a non-gSOAP receiver may still fail. @section wsse_14 Defending Against Signature Wrapping Attacks Signature wrapping attacks exploit a vulnerability in the XML DSig standard by tricking the signature verifier to verify the signature of the signed content but when this content is moved to a different place in the XML document, for example where the content is ignored. In this attack, a signed XML element identified with an `id` attribute is moved in the document and replaced with an unsigned replacement element with aribitrary content that the attacker created and the receiver will use instead. We refer to online articles and publications on signature wrapping attacks for more details. To defend against signature wrapping attacks, we recommend to sign the SOAP Body instead of individual elements of the SOAP Body. A receiver must verify that the SOAP Body received is indeed signed and verify that other parts of the message such as critical SOAP Headers are signed. You can do this on the receiving end by calling `soap_wsse_verify_body(soap)` and check that the return value is nonzero. This prevents signature wrapping attacks on the SOAP Body. If individual element(s) of the SOAP Body must be signed instead of the body itself, then make sure to use call `soap_wsse_verify_element(soap, "namespaceURI", "tag")` on the receiving end and check that the return value is nonzero to verify that all elements matching the namespaceURI and tag are signed. If SOAP Headers are signed such as the timestamp and username token then make sure to verify that the timestamp was indeed signed by calling `soap_wsse_verify_element(soap, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "Timestamp")` and check that the return value is nonzero. Likewise, to verify that the usernameToken authentication credentials are signed, call `soap_wsse_verify_element(soap, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "UsernameToken")` and check that the return value is nonzero. To prevent signature wrapping attacks on XML namespace prefixes used in QNames, which are vulnerable when the prefix is bound to a namespace URI in an ancester node to the signed content, use `soap_wsse_set_InclusiveNamespaces(soap, "prefixlist")`. This makes the namespace prefixes in the list (space-separated in the string) inclusive. Use `soap_wsse_set_InclusiveNamespaces(soap, "+")` to automatically add all prefixes defined in the namespace table (i.e. the .nsmap file) to the inclusive namespace list (this requires gSOAP 2.8.64 or greater). @section wsse_wsc WS-SecureConversation and WS-Trust To use a WS-SecureConversation security context token (SCT) with WS-Security: @code const char *identifier = "..."; soap_wsse_add_SecurityContextToken(soap, "SCT", identifier); @endcode In this example a context has been established and the secret that is identified by the 'identifier' string is known to both parties. This secret is used to sign the message body. The "SCT" is a wsu:Id, which is used as a reference to sign the token. To compute PSHA1 with base64 input strings `client_secret_base64` and `server_secret_base64` to output a base64-encoded `psha1[0..psha1len-1]` string `psha1_base64`: @code int psha1len = 32; // or greater int n, m; const char *client_secret = soap_base642s(soap, client_secret_base64, NULL, 0, &n); const char *server_secret = soap_base642s(soap, server_secret_base64, NULL, 0, &m); char psha1[psha1len]; char *psha1_base64; if (soap_psha1(soap, client_secret, n, server_secret, m, psha1, psha1len)) .. error // insufficient memory psha1_base64 = soap_s2base64(soap, (unsigned char*)psha1, NULL, psha1len); @endcode Similarly, PSHA256 can be computed by calling `soap_psha256()`. */ #include "wsseapi.h" #include "threads.h" /* need threads to enable mutex for MT */ #if defined(SOAP_WSA_2003) || defined(SOAP_WSA_2004) || defined(SOAP_WSA_200408) || defined(SOAP_WSA_2005) #include "wsaapi.h" #endif #ifdef __cplusplus extern "C" { #endif /** Plugin identification for plugin registry */ const char soap_wsse_id[14] = SOAP_WSSE_ID; /** Maximum number of SignedInfo References */ #define SOAP_WSSE_MAX_REF (100) /** Clock skew between machines (in sec) to fit message expiration in window */ #define SOAP_WSSE_CLKSKEW (300) /** Size of the random nonce */ #define SOAP_WSSE_NONCELEN (20) /** Digest authentication accepts messages that are not older than creation time + SOAP_WSSE_NONCETIME */ #define SOAP_WSSE_NONCETIME (SOAP_WSSE_CLKSKEW + 240) /******************************************************************************\ * * Common URIs * \******************************************************************************/ const char *wsse_PasswordTextURI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"; const char *wsse_PasswordDigestURI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest"; const char *wsse_Base64BinaryURI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary"; const char *wsse_HexBinaryURI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#HexBinary"; const char *wsse_X509v3URI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"; const char *wsse_X509v3SubjectKeyIdentifierURI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509SubjectKeyIdentifier"; const char *ds_envsigURI = "http://www.w3.org/2000/09/xmldsig#enveloped-signature"; const char *ds_sha1URI = "http://www.w3.org/2000/09/xmldsig#sha1"; const char *ds_sha224URI = "http://www.w3.org/2001/04/xmldsig-more#sha224"; const char *ds_sha256URI = "http://www.w3.org/2001/04/xmlenc#sha256"; const char *ds_sha384URI = "http://www.w3.org/2001/04/xmldsig-more#sha384"; const char *ds_sha512URI = "http://www.w3.org/2001/04/xmlenc#sha512"; const char *ds_hmac_sha1URI = "http://www.w3.org/2000/09/xmldsig#hmac-sha1"; const char *ds_hmac_sha224URI = "http://www.w3.org/2001/04/xmldsig-more#hmac-sha224"; const char *ds_hmac_sha256URI = "http://www.w3.org/2001/04/xmldsig-more#hmac-sha256"; const char *ds_hmac_sha384URI = "http://www.w3.org/2001/04/xmldsig-more#hmac-sha384"; const char *ds_hmac_sha512URI = "http://www.w3.org/2001/04/xmldsig-more#hmac-sha512"; const char *ds_dsa_sha1URI = "http://www.w3.org/2000/09/xmldsig#dsa-sha1"; const char *ds_dsa_sha256URI = "http://www.w3.org/2009/xmldsig11#dsa-sha256"; const char *ds_rsa_sha1URI = "http://www.w3.org/2000/09/xmldsig#rsa-sha1"; const char *ds_rsa_sha224URI = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha224"; const char *ds_rsa_sha256URI = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"; const char *ds_rsa_sha384URI = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha384"; const char *ds_rsa_sha512URI = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha512"; const char *ds_ecdsa_sha1URI = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha1"; const char *ds_ecdsa_sha224URI = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha224"; const char *ds_ecdsa_sha256URI = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256"; const char *ds_ecdsa_sha384URI = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha384"; const char *ds_ecdsa_sha512URI = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha512"; const char *xenc_3desURI = "http://www.w3.org/2001/04/xmlenc#tripledes-cbc"; const char *xenc_aes128cbcURI = "http://www.w3.org/2001/04/xmlenc#aes128-cbc"; const char *xenc_aes192cbcURI = "http://www.w3.org/2001/04/xmlenc#aes192-cbc"; const char *xenc_aes256cbcURI = "http://www.w3.org/2001/04/xmlenc#aes256-cbc"; const char *xenc_aes512cbcURI = "http://www.w3.org/2001/04/xmlenc#aes512-cbc"; const char *xenc_aes128gcmURI = "http://www.w3.org/2009/xmlenc11#aes128-gcm"; const char *xenc_aes192gcmURI = "http://www.w3.org/2009/xmlenc11#aes192-gcm"; const char *xenc_aes256gcmURI = "http://www.w3.org/2009/xmlenc11#aes256-gcm"; const char *xenc_aes512gcmURI = "http://www.w3.org/2009/xmlenc11#aes512-gcm"; const char *xenc_elementURI = "http://www.w3.org/2001/04/xmlenc#Element"; const char *xenc_contentURI = "http://www.w3.org/2001/04/xmlenc#Content"; const char *xenc_rsa15URI = "http://www.w3.org/2001/04/xmlenc#rsa-1_5"; const char *xenc_rsaesURI = "http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p"; const char *wsse_URI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; const char *xenc_URI = "http://www.w3.org/2001/04/xmlenc#"; const char *ds_URI = "http://www.w3.org/2000/09/xmldsig#"; const char *c14n_URI = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315"; const char *c14n_wc_URI = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"; const char *exc_c14n_URI = "http://www.w3.org/2001/10/xml-exc-c14n#"; const char *exc_c14n_wc_URI = "http://www.w3.org/2001/10/xml-exc-c14n#WithComments"; const char *wsu_URI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"; const char *saml1_URI = "urn:oasis:names:tc:SAML:1.0:assertion"; const char *saml2_URI = "urn:oasis:names:tc:SAML:2.0:assertion"; /******************************************************************************\ * * Digest authentication session * \******************************************************************************/ /** @struct soap_wsse_session @brief Digest authentication session data. */ struct soap_wsse_session { struct soap_wsse_session *next; /**< Next session in list */ time_t expired; /**< Session expiration */ char hash[SOAP_SMD_SHA1_SIZE]; /**< SHA1 digest */ char nonce[1]; /**< Nonce string flows into region below this struct */ }; /** The digest authentication session database */ static struct soap_wsse_session *soap_wsse_session = NULL; /** Lock for digest authentication session database exclusive access */ static MUTEX_TYPE soap_wsse_session_lock = MUTEX_INITIALIZER; /******************************************************************************\ * * Static protos * \******************************************************************************/ static char* soap_wsse_ids(struct soap *soap, const char *tags, int sub); static int soap_wsse_session_verify(struct soap *soap, const char hash[SOAP_SMD_SHA1_SIZE], const char *created, const char *nonce); static void soap_wsse_session_cleanup(struct soap *soap); static void calc_digest(struct soap *soap, const char *created, const char *nonce, int noncelen, const char *password, char hash[SOAP_SMD_SHA1_SIZE]); static int soap_wsse_init(struct soap *soap, struct soap_wsse_data *data, const void *(*arg)(struct soap*, int*, const char*, const unsigned char*, int, int*)); static int soap_wsse_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src); static void soap_wsse_delete(struct soap *soap, struct soap_plugin *p); static int soap_wsse_preparesend(struct soap *soap, const char *buf, size_t len); static int soap_wsse_preparefinalsend(struct soap *soap); static void soap_wsse_preparecleanup(struct soap *soap, struct soap_wsse_data *data); static int soap_wsse_preparefinalrecv(struct soap *soap); static int soap_wsse_element_begin_in(struct soap *soap, const char *tag); static int soap_wsse_element_end_in(struct soap *soap, const char *tag1, const char *tag2); static int soap_wsse_element_begin_out(struct soap *soap, const char *tag, int id, const char *type); static int soap_wsse_element_end_out(struct soap *soap, const char *tag); static size_t soap_wsse_verify_nested(struct soap *soap, struct soap_dom_element *dom, const char *URI, const char *tag); static int soap_p_hash(struct soap *soap, const char *hmac_key, size_t hmac_key_len, const char *secret, size_t secretlen, int alg, char HA[], size_t HA_len, char temp[], char *phash, size_t phashlen); /******************************************************************************\ * * wsse:Security header element * \******************************************************************************/ /** @fn _wsse__Security* soap_wsse_add_Security(struct soap *soap) @brief Adds Security header element. @param soap context @return _wsse__Security object */ SOAP_FMAC1 struct _wsse__Security * SOAP_FMAC2 soap_wsse_add_Security(struct soap *soap) { DBGFUN("soap_wsse_add_Security"); /* if we don't have a SOAP Header, create one */ soap_header(soap); /* if we don't have a wsse:Security element in the SOAP Header, create one */ if (!soap->header->wsse__Security) { soap->header->wsse__Security = (_wsse__Security*)soap_malloc(soap, sizeof(_wsse__Security)); if (!soap->header->wsse__Security) return NULL; soap_default__wsse__Security(soap, soap->header->wsse__Security); } return soap->header->wsse__Security; } /******************************************************************************/ /** @fn _wsse__Security* soap_wsse_add_Security_actor(struct soap *soap, const char *actor) @brief Adds Security header element with actor or role attribute. @param soap context @param actor string @return _wsse__Security object */ SOAP_FMAC1 struct _wsse__Security * SOAP_FMAC2 soap_wsse_add_Security_actor(struct soap *soap, const char *actor) { _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN1("soap_wsse_add_Security_actor", "actor=%s", actor); if (soap->namespaces && !strcmp(soap->namespaces[0].ns, "http://schemas.xmlsoap.org/soap/envelope/")) security->SOAP_ENV__actor = soap_strdup(soap, actor); else security->SOAP_ENV__role = soap_strdup(soap, actor); return security; } /******************************************************************************/ /** @fn void soap_wsse_delete_Security(struct soap *soap) @brief Deletes Security header element. @param soap context */ SOAP_FMAC1 void SOAP_FMAC2 soap_wsse_delete_Security(struct soap *soap) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_delete_Security"); if (data) { if (soap->fpreparesend == soap_wsse_preparesend) soap->fpreparesend = data->fpreparesend; if (soap->fpreparefinalsend == soap_wsse_preparefinalsend) soap->fpreparefinalsend = data->fpreparefinalsend; data->fpreparesend = NULL; data->fpreparefinalsend = NULL; data->sigid = NULL; data->encid = NULL; if (data->prefixlist) SOAP_FREE(soap, data->prefixlist); data->prefixlist = NULL; } soap->feltbegout = NULL; soap->feltendout = NULL; if (soap->header) soap->header->wsse__Security = NULL; } /******************************************************************************/ /** @fn _wsse__Security* soap_wsse_Security(struct soap *soap) @brief Returns Security header element if present. @param soap context @return _wsse__Security object or NULL */ SOAP_FMAC1 struct _wsse__Security * SOAP_FMAC2 soap_wsse_Security(struct soap *soap) { if (soap->header) return soap->header->wsse__Security; return NULL; } /******************************************************************************\ * * wsse:Security/ds:Signature header element * \******************************************************************************/ /** @fn ds__SignatureType* soap_wsse_add_Signature(struct soap *soap) @brief Adds Signature header element. @param soap context @return ds__SignatureType object */ SOAP_FMAC1 struct ds__SignatureType * SOAP_FMAC2 soap_wsse_add_Signature(struct soap *soap) { _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN("soap_wsse_add_Signature"); /* if we don't have a ds:Signature, create one */ if (!security->ds__Signature) { security->ds__Signature = (ds__SignatureType*)soap_malloc(soap, sizeof(ds__SignatureType)); if (!security->ds__Signature) return NULL; soap_default_ds__SignatureType(soap, security->ds__Signature); } return security->ds__Signature; } /******************************************************************************/ /** @fn void soap_wsse_delete_Signature(struct soap *soap) @brief Deletes Signature header element. @param soap context */ SOAP_FMAC1 void SOAP_FMAC2 soap_wsse_delete_Signature(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); DBGFUN("soap_wsse_delete_Signature"); if (security) security->ds__Signature = NULL; } /******************************************************************************/ /** @fn ds__SignatureType* soap_wsse_Signature(struct soap *soap) @brief Returns Signature header element if present. @param soap context @return ds__SignatureType object or NULL */ SOAP_FMAC1 struct ds__SignatureType * SOAP_FMAC2 soap_wsse_Signature(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); if (security) return security->ds__Signature; return NULL; } /******************************************************************************\ * * wsse:Security/wsu:Timestamp header element * \******************************************************************************/ /** @fn int soap_wsse_add_Timestamp(struct soap *soap, const char *id, time_t lifetime) @brief Adds Timestamp element with optional expiration date+time (lifetime). @param[in] soap context @param[in] id for signature referencing or NULL @param[in] lifetime expressed in time_t units, or 0 for no expiration @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_Timestamp(struct soap *soap, const char *id, time_t lifetime) { _wsse__Security *security = soap_wsse_add_Security(soap); time_t now = time(NULL); char *created = soap_strdup(soap, soap_dateTime2s(soap, now)); char *expired = lifetime ? soap_strdup(soap, soap_dateTime2s(soap, now + lifetime)) : NULL; DBGFUN1("soap_wsse_add_Timestamp", "id=%s", id?id:""); /* allocate a Timestamp if we don't have one already */ if (!security->wsu__Timestamp) { security->wsu__Timestamp = (_wsu__Timestamp*)soap_malloc(soap, sizeof(_wsu__Timestamp)); if (!security->wsu__Timestamp) return soap->error = SOAP_EOM; } soap_default__wsu__Timestamp(soap, security->wsu__Timestamp); /* populate the wsu:Timestamp element */ security->wsu__Timestamp->wsu__Id = soap_strdup(soap, id); security->wsu__Timestamp->Created = created; security->wsu__Timestamp->Expires = expired; return SOAP_OK; } /******************************************************************************/ /** @fn _wsu__Timestamp *soap_wsse_Timestamp(struct soap *soap) @brief Returns Timestamp element if present. @param soap context @return _wsu__Timestamp object or NULL */ SOAP_FMAC1 struct _wsu__Timestamp * SOAP_FMAC2 soap_wsse_Timestamp(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); if (security) return security->wsu__Timestamp; return NULL; } /******************************************************************************/ /** @fn int soap_wsse_verify_Timestamp(struct soap *soap) @brief Verifies the Timestamp/Expires element against the current time. @param soap context @return SOAP_OK or SOAP_FAULT with wsu:MessageExpired fault Sets wsu:MessageExpired fault if wsu:Timestamp is expired. The SOAP_WSSE_CLKSKEW value is used as a margin to mitigate clock skew. Keeps silent when no timestamp is supplied or no expiration date is included in the wsu:Timestamp element. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_Timestamp(struct soap *soap) { _wsu__Timestamp *timestamp = soap_wsse_Timestamp(soap); DBGFUN("soap_wsse_verify_Timestamp"); /* if we have a timestamp with an expiration date, check it */ if (timestamp && timestamp->Expires) { time_t now = time(NULL), expired; soap_s2dateTime(soap, timestamp->Expires, &expired); if (expired + SOAP_WSSE_CLKSKEW <= now) { const char *code = soap_wsu__tTimestampFault2s(soap, wsu__MessageExpired); return soap_wsse_sender_fault_subcode(soap, code, "Message has expired", timestamp->Expires); } } return SOAP_OK; } /******************************************************************************\ * * wsse:Security/UsernameToken header element * \******************************************************************************/ /** @fn int soap_wsse_add_UsernameTokenText(struct soap *soap, const char *id, const char *username, const char *password) @brief Adds UsernameToken element with optional clear-text password. @param soap context @param[in] id string for signature referencing or NULL @param[in] username string @param[in] password string or NULL to omit the password @return SOAP_OK Passwords are sent in the clear, so transport-level encryption is required. @note This release supports the use of at most one UsernameToken in the header. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_UsernameTokenText(struct soap *soap, const char *id, const char *username, const char *password) { _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN2("soap_wsse_add_UsernameTokenText", "id=%s", id?id:"", "username=%s", username?username:""); /* allocate a UsernameToken if we don't have one already */ if (!security->UsernameToken) { security->UsernameToken = (_wsse__UsernameToken*)soap_malloc(soap, sizeof(_wsse__UsernameToken)); if (!security->UsernameToken) return soap->error = SOAP_EOM; } soap_default__wsse__UsernameToken(soap, security->UsernameToken); /* populate the UsernameToken */ security->UsernameToken->wsu__Id = soap_strdup(soap, id); security->UsernameToken->Username = soap_strdup(soap, username); /* allocate and populate the Password */ if (password) { security->UsernameToken->Password = (_wsse__Password*)soap_malloc(soap, sizeof(_wsse__Password)); if (!security->UsernameToken->Password) return soap->error = SOAP_EOM; soap_default__wsse__Password(soap, security->UsernameToken->Password); security->UsernameToken->Password->Type = (char*)wsse_PasswordTextURI; security->UsernameToken->Password->__item = soap_strdup(soap, password); } return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_add_UsernameTokenDigest(struct soap *soap, const char *id, const char *username, const char *password) @brief Adds UsernameToken element for digest authentication. @param soap context @param[in] id string for signature referencing or NULL @param[in] username string @param[in] password string @return SOAP_OK Computes SHA1 digest of the time stamp, a nonce, and the password. The digest provides the authentication credentials. Passwords are NOT sent in the clear. @note This release supports the use of at most one UsernameToken in the header. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_UsernameTokenDigest(struct soap *soap, const char *id, const char *username, const char *password) { return soap_wsse_add_UsernameTokenDigest_at(soap, id, username, password, time(NULL)); } /******************************************************************************/ /** @fn int soap_wsse_add_UsernameTokenDigest_at(struct soap *soap, const char *id, const char *username, const char *password, time_t when) @brief Adds UsernameToken element for digest authentication. @param soap context @param[in] id string for signature referencing or NULL @param[in] username string @param[in] password string @param[in] when the time stamp to use for the digest hash @return SOAP_OK Computes SHA1 digest of the time stamp, a nonce, and the password. The digest provides the authentication credentials. Passwords are NOT sent in the clear. @note This release supports the use of at most one UsernameToken in the header. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_UsernameTokenDigest_at(struct soap *soap, const char *id, const char *username, const char *password, time_t when) { _wsse__Security *security = soap_wsse_add_Security(soap); const char *created = soap_dateTime2s(soap, when); char HA[SOAP_SMD_SHA1_SIZE], HABase64[29]; char nonce[SOAP_WSSE_NONCELEN], *nonceBase64; DBGFUN2("soap_wsse_add_UsernameTokenDigest", "id=%s", id?id:"", "username=%s", username?username:""); /* generate a nonce */ soap_wsse_rand_nonce(nonce, SOAP_WSSE_NONCELEN); nonceBase64 = soap_s2base64(soap, (unsigned char*)nonce, NULL, SOAP_WSSE_NONCELEN); /* The specs are not clear: compute digest over binary nonce or base64 nonce? */ /* compute SHA1(created, nonce, password) */ calc_digest(soap, created, nonce, SOAP_WSSE_NONCELEN, password, HA); /* Hm...? calc_digest(soap, created, nonceBase64, strlen(nonceBase64), password, HA); */ soap_s2base64(soap, (unsigned char*)HA, HABase64, SOAP_SMD_SHA1_SIZE); /* populate the UsernameToken with digest */ soap_wsse_add_UsernameTokenText(soap, id, username, HABase64); /* populate the remainder of the password, nonce, and created */ security->UsernameToken->Password->Type = (char*)wsse_PasswordDigestURI; security->UsernameToken->Nonce = (struct wsse__EncodedString*)soap_malloc(soap, sizeof(struct wsse__EncodedString)); if (!security->UsernameToken->Nonce) return soap->error = SOAP_EOM; soap_default_wsse__EncodedString(soap, security->UsernameToken->Nonce); security->UsernameToken->Nonce->__item = nonceBase64; security->UsernameToken->Nonce->EncodingType = (char*)wsse_Base64BinaryURI; security->UsernameToken->wsu__Created = soap_strdup(soap, created); return SOAP_OK; } /******************************************************************************/ /** @fn _wsse__UsernameToken* soap_wsse_UsernameToken(struct soap *soap, const char *id) @brief Returns UsernameToken element if present. @param soap context @param[in] id string of UsernameToken or NULL @return _wsse__UsernameToken object or NULL @note This release supports the use of at most one UsernameToken in the header. */ SOAP_FMAC1 struct _wsse__UsernameToken * SOAP_FMAC2 soap_wsse_UsernameToken(struct soap *soap, const char *id) { _wsse__Security *security = soap_wsse_Security(soap); if (security && security->UsernameToken && (!id || (security->UsernameToken->wsu__Id && !strcmp(security->UsernameToken->wsu__Id, id)))) return security->UsernameToken; return NULL; } /******************************************************************************/ /** @fn const char* soap_wsse_get_Username(struct soap *soap) @brief Returns UsernameToken/username string or wsse:FailedAuthentication fault. @param soap context @return UsernameToken/username string or NULL with wsse:FailedAuthentication fault error set @see soap_wsse_verify_Password The returned username should be used to lookup the user's password in a dictionary or database for server-side authentication with soap_wsse_verify_Password. */ SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsse_get_Username(struct soap *soap) { _wsse__UsernameToken *token = soap_wsse_UsernameToken(soap, NULL); DBGFUN("soap_wsse_get_Username"); if (token) return token->Username; soap_wsse_fault(soap, wsse__FailedAuthentication, "Username authentication required"); return NULL; } /******************************************************************************/ /** @fn int soap_wsse_verify_Password(struct soap *soap, const char *password) @brief Verifies the supplied password or sets wsse:FailedAuthentication fault. @param soap context @param[in] password string to verify against @return SOAP_OK (authorized) or SOAP_FAULT with wsse:FailedAuthentication fault The verification supports both clear-text password verification and digest password authentication. For digest authentication a history mechanism with a digest authentication session database ensures protection against replay attacks. @note This release supports the use of at most one UsernameToken in the header. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_Password(struct soap *soap, const char *password) { _wsse__UsernameToken *token = soap_wsse_UsernameToken(soap, NULL); DBGFUN("soap_wsse_verify_Password"); /* if we have a UsernameToken with a Password, check it */ if (token && token->Password) { /* password digest or text? */ if (token->Password->Type && !strcmp(token->Password->Type, wsse_PasswordDigestURI)) { /* check password digest: compute SHA1(created, nonce, password) */ if (token->Nonce && token->wsu__Created && strlen(token->Password->__item) == 28) /* digest pw len = 28 */ { char HA1[SOAP_SMD_SHA1_SIZE], HA2[SOAP_SMD_SHA1_SIZE]; /* The specs are not clear: compute digest over binary nonce or base64 nonce? The formet appears to be the case: */ int noncelen; const char *nonce; if (!token->Nonce->EncodingType || !strcmp(token->Nonce->EncodingType, wsse_Base64BinaryURI)) nonce = soap_base642s(soap, token->Nonce->__item, NULL, 0, &noncelen); else if (!strcmp(token->Nonce->EncodingType, wsse_HexBinaryURI)) nonce = soap_hex2s(soap, token->Nonce->__item, NULL, 0, &noncelen); else return soap_wsse_fault(soap, wsse__FailedAuthentication, NULL); /* compute HA1 = SHA1(created, nonce, password) */ calc_digest(soap, token->wsu__Created, nonce, noncelen, password, HA1); /* calc_digest(soap, token->wsu__Created, token->Nonce->__item, strlen(token->Nonce->__item), password, HA1); */ /* get HA2 = supplied digest from base64 Password */ soap_base642s(soap, token->Password->__item, HA2, SOAP_SMD_SHA1_SIZE, NULL); /* compare HA1 to HA2 */ if (!memcmp(HA1, HA2, SOAP_SMD_SHA1_SIZE)) { /* authorize if HA1 and HA2 identical and not replay attack */ if (!soap_wsse_session_verify(soap, HA1, token->wsu__Created, token->Nonce->__item)) return SOAP_OK; return soap->error; } } } else { /* check password text */ if (!strcmp(token->Password->__item, password)) return SOAP_OK; } } return soap_wsse_fault(soap, wsse__FailedAuthentication, NULL); } /******************************************************************************\ * * wsse:Security/BinarySecurityToken header element * \******************************************************************************/ /** @fn int soap_wsse_add_BinarySecurityToken(struct soap *soap, const char *id, const char *valueType, const unsigned char *data, int size) @brief Adds BinarySecurityToken element. @param soap context @param[in] id string for signature referencing or NULL @param[in] valueType string @param[in] data points to binary token data @param[in] size is length of binary token @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_BinarySecurityToken(struct soap *soap, const char *id, const char *valueType, const unsigned char *data, int size) { _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN2("wsse_add_BinarySecurityToken", "id=%s", id?id:"", "valueType=%s", valueType?valueType:""); /* allocate BinarySecurityToken if we don't already have one */ if (!security->BinarySecurityToken) { security->BinarySecurityToken = (_wsse__BinarySecurityToken*)soap_malloc(soap, sizeof(_wsse__BinarySecurityToken)); if (!security->BinarySecurityToken) return soap->error = SOAP_EOM; } soap_default__wsse__BinarySecurityToken(soap, security->BinarySecurityToken); /* populate the BinarySecurityToken */ security->BinarySecurityToken->wsu__Id = soap_strdup(soap, id); security->BinarySecurityToken->ValueType = soap_strdup(soap, valueType); security->BinarySecurityToken->EncodingType = (char*)wsse_Base64BinaryURI; security->BinarySecurityToken->__item = soap_s2base64(soap, data, NULL, size); return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_add_BinarySecurityTokenX509(struct soap *soap, const char *id, X509 *cert) @brief Adds BinarySecurityToken element with X509 certificate. @param soap context @param[in] id string for signature reference @param[in] cert points to the X509 certificate @return SOAP_OK or SOAP_EOM This function uses i2d_X509 from the the OpenSSL library to convert an X509 object to binary DER format. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_BinarySecurityTokenX509(struct soap *soap, const char *id, X509 *cert) { int derlen; unsigned char *der, *s; if (!cert) return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Missing certificate"); /* determine the storage requirement */ derlen = i2d_X509(cert, NULL); if (derlen < 0) return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Invalid certificate"); /* use the gSOAP engine's look-aside buffer to temporarily hold the cert */ if (soap_store_lab(soap, NULL, derlen)) return SOAP_EOM; s = der = (unsigned char*)soap->labbuf; /* store in DER format */ i2d_X509(cert, &s); /* populate the BinarySecurityToken with base64 certificate data */ return soap_wsse_add_BinarySecurityToken(soap, id, wsse_X509v3URI, der, derlen); } /******************************************************************************/ /** @fn int soap_wsse_add_BinarySecurityTokenPEM(struct soap *soap, const char *id, const char *filename) @brief Adds BinarySecurityToken element from a PEM file. @param soap context @param[in] id string for signature reference @param[in] filename @return SOAP_OK or SOAP_FAULT with wsse__InvalidSecurity fault when file cannot be read or does not contain a valid certificate This function uses PEM_read_X509 from the the OpenSSL library to read a certificate from a PEM formatted file. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_BinarySecurityTokenPEM(struct soap *soap, const char *id, const char *filename) { FILE *fd; DBGFUN2("soap_wsse_add_BinarySecurityTokenPEM", "id=%s", id?id:"", "filename=%s", filename?filename:""); fd = fopen(filename, "r"); if (fd) { /* read the certificate */ X509 *cert = PEM_read_X509(fd, NULL, NULL, NULL); fclose(fd); /* if okay, populate the BinarySecurityToken element */ if (cert) { int err = soap_wsse_add_BinarySecurityTokenX509(soap, id, cert); X509_free(cert); return err; } } return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Missing certificate"); } /******************************************************************************/ /** @fn _wsse__BinarySecurityToken* soap_wsse_BinarySecurityToken(struct soap *soap, const char *id) @brief Returns BinarySecurityToken element if present. @param soap context @param[in] id string of token to get or NULL to get the first @return _wsse__BinarySecurityToken object or NULL */ SOAP_FMAC1 struct _wsse__BinarySecurityToken * SOAP_FMAC2 soap_wsse_BinarySecurityToken(struct soap *soap, const char *id) { _wsse__Security *security = soap_wsse_Security(soap); if (security && security->BinarySecurityToken && (!id || (security->BinarySecurityToken->wsu__Id && !strcmp(security->BinarySecurityToken->wsu__Id, id)))) return security->BinarySecurityToken; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "No BinarySecurityToken id=%s, pointer=%p to token found\n", id, security->BinarySecurityToken)); return NULL; } /******************************************************************************/ /** @fn int soap_wsse_get_BinarySecurityToken(struct soap *soap, const char *id, char **valueType, unsigned char **data, int *size) @brief Get wsse:BinarySecurityToken element token data in binary form. @param soap context @param[in] id string of token to get or NULL to get the first @param[out] valueType string @param[out] data points to binary token data @param[out] size is length of binary token @return SOAP_OK or SOAP_FAULT with wsse:SecurityTokenUnavailable fault */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_get_BinarySecurityToken(struct soap *soap, const char *id, char **valueType, unsigned char **data, int *size) { _wsse__BinarySecurityToken *token = soap_wsse_BinarySecurityToken(soap, id); DBGFUN1("soap_wsse_get_BinarySecurityToken", "id=%s", id?id:""); if (token) { *valueType = token->ValueType; if (!token->EncodingType || !strcmp(token->EncodingType, wsse_Base64BinaryURI)) *data = (unsigned char*)soap_base642s(soap, token->__item, NULL, 0, size); else if (!strcmp(token->EncodingType, wsse_HexBinaryURI)) *data = (unsigned char*)soap_hex2s(soap, token->__item, NULL, 0, size); if (*data) return SOAP_OK; } return soap_wsse_fault(soap, wsse__SecurityTokenUnavailable, "BinarySecurityToken required"); } /******************************************************************************/ /** @fn X509* soap_wsse_get_BinarySecurityTokenX509(struct soap *soap, const char *id) @brief Get X509 wsse:BinarySecurityToken certificate and verify its content. This call must be followed by an X509_free to deallocate the X509 certificate data. @param soap context @param[in] id string of token to get or NULL to get the first @return X509 certificate (dynamically allocated) or NULL with wsse:SecurityTokenUnavailable fault */ SOAP_FMAC1 X509* SOAP_FMAC2 soap_wsse_get_BinarySecurityTokenX509(struct soap *soap, const char *id) { X509 *cert = NULL; char *valueType = NULL; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) const unsigned char *data; #else unsigned char *data; #endif int size; DBGFUN1("soap_wsse_get_BinarySecurityTokenX509", "id=%s", id?id:""); if (!soap_wsse_get_BinarySecurityToken(soap, id, &valueType, (unsigned char**)&data, &size) && valueType && !strcmp(valueType, wsse_X509v3URI)) cert = d2i_X509(NULL, &data, size); /* verify the certificate */ if (cert && soap_wsse_verify_X509(soap, cert)) { X509_free(cert); cert = NULL; } return cert; } /******************************************************************************/ /** @fn int soap_wsse_verify_X509(struct soap *soap, X509 *cert) @brief Verifies X509 certificate against soap->cafile, soap->capath, and soap->crlfile. @param soap context @param[in] cert X509 certificate @return SOAP_OK or fault This is an expensive operation. Whenever a new soap context is created, the cafile and objects are loaded into that context each time we need to verify a certificate. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_X509(struct soap *soap, X509 *cert) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); X509_STORE_CTX *verify; DBGFUN("soap_wsse_verify_X509"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_verify_X509", "Plugin not registered", SOAP_PLUGIN_ERROR); if (!cert) return soap_wsse_sender_fault(soap, "soap_wsse_verify_X509", "No certificate"); if (!data->store) { data->store = X509_STORE_new(); if (!data->store) return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not create X509_STORE object"); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Setting up a new X509 store\n")); X509_STORE_set_verify_cb_func(data->store, soap->fsslverify); if (soap->cafile || soap->capath) { if (X509_STORE_load_locations(data->store, soap->cafile, soap->capath) != 1) return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not load CA PEM file or path"); } #if (OPENSSL_VERSION_NUMBER > 0x00907000L) if (soap->crlfile) { if (*soap->crlfile) { X509_LOOKUP *lookup; lookup = X509_STORE_add_lookup(data->store, X509_LOOKUP_file()); if (!lookup) return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not create X509_LOOKUP object"); if (X509_load_crl_file(lookup, soap->crlfile, X509_FILETYPE_PEM) != 1) return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not read CRL PEM file"); } X509_STORE_set_flags(data->store, X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL); } #endif } verify = X509_STORE_CTX_new(); if (!verify) return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not create X509_STORE_CTX object"); #if (OPENSSL_VERSION_NUMBER > 0x00907000L) if (X509_STORE_CTX_init(verify, data->store, cert, NULL) != 1) { X509_STORE_CTX_free(verify); return soap_wsse_receiver_fault(soap, "soap_wsse_verify_X509", "Could not initialize X509_STORE_CTX object"); } #else X509_STORE_CTX_init(verify, data->store, cert, NULL); #endif #ifdef SOAP_DEBUG { char buf[1024]; X509_NAME_oneline(X509_get_issuer_name(cert), buf, sizeof(buf)-1); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Certificate issuer %s\n", buf)); X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)-1); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Certificate subject %s\n", buf)); } #endif if (X509_verify_cert(verify) != 1) { X509_STORE_CTX_free(verify); return soap_wsse_sender_fault(soap, "soap_wsse_verify_X509", "Invalid certificate"); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Certificate is valid\n")); X509_STORE_CTX_free(verify); return SOAP_OK; } /******************************************************************************\ * * wsc:SecurityContextToken * \******************************************************************************/ /** @fn int soap_wsse_add_SecurityContextToken(struct soap *soap, const char *id, const char *identifier) @brief Adds wsc:SecurityContextToken/Identifier and SecurityTokenReference to it. @param soap context @param[in] id string for signature reference (required) @param[in] identifier wsc:Identifier value (required) @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_SecurityContextToken(struct soap *soap, const char *id, const char *identifier) { char *URI; size_t l; _wsse__Security *security = soap_wsse_add_Security(soap); DBGFUN2("soap_wsse_add_SecurityContextToken", "id=%s", id, "identifier=%s", identifier?identifier:""); /* allocate wsc:SecurityContextToken if we don't already have one */ if (!security->wsc__SecurityContextToken) { security->wsc__SecurityContextToken = (struct wsc__SecurityContextTokenType*)soap_malloc(soap, sizeof(struct wsc__SecurityContextTokenType)); if (!security->wsc__SecurityContextToken) return soap->error = SOAP_EOM; } soap_default_wsc__SecurityContextTokenType(soap, security->wsc__SecurityContextToken); /* populate the wsc:SecurityContextToken */ l = strlen(id); URI = (char*)soap_malloc(soap, l + 2); if (!URI) return soap->error = SOAP_EOM; *URI = '#'; soap_strcpy(URI + 1, l + 1, id); security->wsc__SecurityContextToken->wsu__Id = URI + 1; security->wsc__SecurityContextToken->Identifier = soap_strdup(soap, identifier); /* set SecurityTokenReference */ return soap_wsse_add_KeyInfo_SecurityTokenReferenceURI(soap, URI, NULL); } /******************************************************************************/ /** @fn const char *soap_wsse_get_SecurityContextToken(struct soap *soap) @brief Returns wsc:SecurityContextToken/Identifier string value or NULL. @param soap context @return wsc:SecurityContextToken/Identifier string value value or NULL */ SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsse_get_SecurityContextToken(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); DBGFUN("soap_wsse_SecurityContextToken"); if (security->wsc__SecurityContextToken && security->wsc__SecurityContextToken->wsu__Id) { const char *URI = soap_wsse_get_KeyInfo_SecurityTokenReferenceURI(soap); if (URI && !strcmp(URI, security->wsc__SecurityContextToken->wsu__Id)) return security->wsc__SecurityContextToken->Identifier; } return NULL; } /******************************************************************************\ * * ds:Signature/SignedInfo * \******************************************************************************/ /** @fn ds__SignedInfoType* soap_wsse_add_SignedInfo(struct soap *soap) @brief Adds SignedInfo element. @param soap context @return ds__SignedInfoType object */ SOAP_FMAC1 struct ds__SignedInfoType * SOAP_FMAC2 soap_wsse_add_SignedInfo(struct soap *soap) { ds__SignatureType *signature = soap_wsse_add_Signature(soap); if (!signature->SignedInfo) { signature->SignedInfo = (ds__SignedInfoType*)soap_malloc(soap, sizeof(ds__SignedInfoType)); if (!signature->SignedInfo) return NULL; soap_default_ds__SignedInfoType(soap, signature->SignedInfo); } return signature->SignedInfo; } /******************************************************************************/ /** @fn int soap_wsse_add_SignedInfo_Reference(struct soap *soap, const char *URI, unsigned int level, const char *transform, const char *prefixlist, int alg, const char *HA) @brief Adds SignedInfo element with Reference URI, transform algorithm used, and digest value. @param soap context @param[in] URI reference @param[in] level XML depth of element signed @param[in] transform string should be exc_c14n_URI for exc-c14n, or c14n_URI or NULL for default (no canonicalization) @param[in] prefixlist used by the exc-c14n transform or NULL @param[in] alg is the digest algorithm used @param[in] HA is the digest in binary form @return SOAP_OK or SOAP_EOM when references exceed SOAP_WSSE_MAX_REF This function can be called to add more references to the wsse:SignedInfo element. A maximum number of SOAP_WSSE_MAX_REF references can be added. The digest method is always SHA1. @note XPath transforms cannot be specified in this release. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_SignedInfo_Reference(struct soap *soap, const char *URI, unsigned int level, const char *transform, const char *prefixlist, int alg, const char *HA) { ds__SignedInfoType *signedInfo = soap_wsse_add_SignedInfo(soap); ds__ReferenceType *reference; DBGFUN3("soap_wsse_add_SignedInfo_Reference", "URI=%s", URI ? URI : "(null)", "transform=%s", transform ? transform : "(null)", "alg=%x", alg); /* if this is the first reference, allocate SOAP_WSSE_MAX_REF references */ if (signedInfo->__sizeReference == 0) { signedInfo->Reference = (ds__ReferenceType**)soap_malloc(soap, SOAP_WSSE_MAX_REF*sizeof(ds__ReferenceType*)); } else { /* maximum number of references exceeded? */ if (signedInfo->__sizeReference >= SOAP_WSSE_MAX_REF) return soap->error = SOAP_EOM; } /* allocate fresh new reference */ reference = (ds__ReferenceType*)soap_malloc(soap, sizeof(ds__ReferenceType)); if (!reference) return soap->error = SOAP_EOM; soap_default_ds__ReferenceType(soap, reference); /* populate the URI */ reference->URI = soap_strdup(soap, URI); /* if a transform algorithm was used, populate the Transforms element */ if (transform) { reference->Transforms = (ds__TransformsType*)soap_malloc(soap, sizeof(ds__TransformsType)); if (!reference->Transforms) return soap->error = SOAP_EOM; soap_default_ds__TransformsType(soap, reference->Transforms); /* only one transform, unless level == 0 to create enveloped signatures */ if (level <= 1) { reference->Transforms->__sizeTransform = 2; reference->Transforms->Transform = (ds__TransformType*)soap_malloc(soap, 2 * sizeof(ds__TransformType)); if (reference->Transforms->Transform) { soap_default_ds__TransformType(soap, &reference->Transforms->Transform[1]); reference->Transforms->Transform[1].Algorithm = (char*)ds_envsigURI; } } else { reference->Transforms->__sizeTransform = 1; reference->Transforms->Transform = (ds__TransformType*)soap_malloc(soap, sizeof(ds__TransformType)); } if (!reference->Transforms->Transform) return soap->error = SOAP_EOM; soap_default_ds__TransformType(soap, reference->Transforms->Transform); reference->Transforms->Transform->Algorithm = (char*)transform; /* populate the c14n:InclusiveNamespaces element */ if (prefixlist && *prefixlist && *prefixlist != '*') { reference->Transforms->Transform->c14n__InclusiveNamespaces = (_c14n__InclusiveNamespaces*)soap_malloc(soap, sizeof(_c14n__InclusiveNamespaces)); if (!reference->Transforms->Transform->c14n__InclusiveNamespaces) return soap->error = SOAP_EOM; soap_default__c14n__InclusiveNamespaces(soap, reference->Transforms->Transform->c14n__InclusiveNamespaces); if (*prefixlist == '+') { struct Namespace *ns = soap->local_namespaces; size_t n = 0; char *p; for (ns = soap->local_namespaces; ns && ns->id; ns++) n += strlen(ns->id) + 1; reference->Transforms->Transform->c14n__InclusiveNamespaces->PrefixList = p = (char*)soap_malloc(soap, n); if (p) { for (ns = soap->local_namespaces; ns && ns->id; ) { strcpy(p, ns->id); p += strlen(p); ns++; if (ns->id) *p++ = ' '; } *p = '\0'; } } else { reference->Transforms->Transform->c14n__InclusiveNamespaces->PrefixList = (char*)prefixlist; } } } /* populate the DigestMethod element */ reference->DigestMethod = (ds__DigestMethodType*)soap_malloc(soap, sizeof(ds__DigestMethodType)); if (!reference->DigestMethod) return soap->error = SOAP_EOM; soap_default_ds__DigestMethodType(soap, reference->DigestMethod); /* the DigestMethod algorithm SHA1, SHA256, SHA512 */ switch (alg & SOAP_SMD_HASH) { case SOAP_SMD_SHA1: reference->DigestMethod->Algorithm = (char*)ds_sha1URI; break; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) case SOAP_SMD_SHA224: reference->DigestMethod->Algorithm = (char*)ds_sha224URI; break; case SOAP_SMD_SHA256: reference->DigestMethod->Algorithm = (char*)ds_sha256URI; break; case SOAP_SMD_SHA384: reference->DigestMethod->Algorithm = (char*)ds_sha384URI; break; case SOAP_SMD_SHA512: reference->DigestMethod->Algorithm = (char*)ds_sha512URI; break; #endif default: return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, "SHA224/256/384/512 requires OpenSSL 0.9.8 or greater"); } /* populate the DigestValue element */ reference->DigestValue = soap_s2base64(soap, (unsigned char*)HA, NULL, soap_smd_size(alg, NULL)); if (!reference->DigestValue) return soap->error; /* add the fresh new reference to the array */ signedInfo->Reference[signedInfo->__sizeReference] = reference; signedInfo->__sizeReference++; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_add_SignedInfo_SignatureMethod(struct soap *soap, const char *method, int canonical) @brief Adds SignedInfo element with SignatureMethod. @param soap context @param[in] method is the URI of the signature algorithm (e.g. ds_rsa_sha1) @param[in] canonical flag indicating that SignedInfo is signed in exc-c14n form or in c14n when soap->c14ninclude == "*" (i.e. all prefixes are inclusive) @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_SignedInfo_SignatureMethod(struct soap *soap, const char *method, int canonical) { ds__SignedInfoType *signedInfo = soap_wsse_add_SignedInfo(soap); DBGFUN2("soap_wsse_add_SignedInfo_SignatureMethod", "method=%s", method?method:"", "canonical=%d", canonical); /* if signed in exc-c14n form, populate CanonicalizationMethod element */ if (canonical) { signedInfo->CanonicalizationMethod = (ds__CanonicalizationMethodType*)soap_malloc(soap, sizeof(ds__CanonicalizationMethodType)); if (!signedInfo->CanonicalizationMethod) return soap->error = SOAP_EOM; soap_default_ds__CanonicalizationMethodType(soap, signedInfo->CanonicalizationMethod); if (soap->c14ninclude && *soap->c14ninclude == '*') signedInfo->CanonicalizationMethod->Algorithm = (char*)c14n_URI; else signedInfo->CanonicalizationMethod->Algorithm = (char*)exc_c14n_URI; } /* populate SignatureMethod element */ signedInfo->SignatureMethod = (ds__SignatureMethodType*)soap_malloc(soap, sizeof(ds__SignatureMethodType)); if (!signedInfo->SignatureMethod) return soap->error = SOAP_EOM; soap_default_ds__SignatureMethodType(soap, signedInfo->SignatureMethod); signedInfo->SignatureMethod->Algorithm = (char*)method; return SOAP_OK; } /******************************************************************************/ /** @fn ds__SignedInfoType* soap_wsse_SignedInfo(struct soap *soap) @brief Returns SignedInfo element if present. @param soap context @return ds__SignedInfoType object or NULL */ SOAP_FMAC1 struct ds__SignedInfoType * SOAP_FMAC2 soap_wsse_SignedInfo(struct soap *soap) { ds__SignatureType *signature = soap_wsse_Signature(soap); if (signature) return signature->SignedInfo; return NULL; } /******************************************************************************/ /** @fn int soap_wsse_get_SignedInfo_SignatureMethod(struct soap *soap, int *alg, int *bits) @brief Get SignatureMethod algorithm. @param soap context @param[out] alg is a signature algorithm, such as SOAP_SMD_HMAC_SHA1/224/256/384/512, SOAP_SMD_VRFY_DSA_SHA1/256, SOAP_SMD_VRFY_RSA_SHA1/224/256/384/512 or SOAP_SMD_ECDSA_SHA1/224/256/384/512 @param[out] bits is set to HMACOutputLength if present and valid, 0 otherwise @return SOAP_OK or SOAP_FAULT with wsse:UnsupportedAlgorithm, wsse:FailedCheck, or wsse__InvalidSecurity fault */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_get_SignedInfo_SignatureMethod(struct soap *soap, int *alg, int *bits) { ds__SignedInfoType *signedInfo = soap_wsse_SignedInfo(soap); DBGFUN("soap_wsse_get_SignedInfo_SignatureMethod"); *alg = SOAP_SMD_NONE; *bits = 0; /* if we have a SignedInfo element, get the algorithm */ if (signedInfo && signedInfo->SignatureMethod && signedInfo->SignatureMethod->Algorithm) { const char *method = signedInfo->SignatureMethod->Algorithm; if (!strcmp(method, ds_hmac_sha1URI)) *alg = SOAP_SMD_HMAC_SHA1; else if (!strcmp(method, ds_hmac_sha224URI)) *alg = SOAP_SMD_HMAC_SHA224; else if (!strcmp(method, ds_hmac_sha256URI)) *alg = SOAP_SMD_HMAC_SHA256; else if (!strcmp(method, ds_hmac_sha384URI)) *alg = SOAP_SMD_HMAC_SHA384; else if (!strcmp(method, ds_hmac_sha512URI)) *alg = SOAP_SMD_HMAC_SHA512; else if (!strcmp(method, ds_dsa_sha1URI)) *alg = SOAP_SMD_VRFY_DSA_SHA1; else if (!strcmp(method, ds_dsa_sha256URI)) *alg = SOAP_SMD_VRFY_DSA_SHA256; else if (!strcmp(method, ds_rsa_sha1URI)) *alg = SOAP_SMD_VRFY_RSA_SHA1; else if (!strcmp(method, ds_rsa_sha224URI)) *alg = SOAP_SMD_VRFY_RSA_SHA224; else if (!strcmp(method, ds_rsa_sha256URI)) *alg = SOAP_SMD_VRFY_RSA_SHA256; else if (!strcmp(method, ds_rsa_sha384URI)) *alg = SOAP_SMD_VRFY_RSA_SHA384; else if (!strcmp(method, ds_rsa_sha512URI)) *alg = SOAP_SMD_VRFY_RSA_SHA512; else if (!strcmp(method, ds_ecdsa_sha1URI)) *alg = SOAP_SMD_VRFY_ECDSA_SHA1; else if (!strcmp(method, ds_ecdsa_sha224URI)) *alg = SOAP_SMD_VRFY_ECDSA_SHA224; else if (!strcmp(method, ds_ecdsa_sha256URI)) *alg = SOAP_SMD_VRFY_ECDSA_SHA256; else if (!strcmp(method, ds_ecdsa_sha384URI)) *alg = SOAP_SMD_VRFY_ECDSA_SHA384; else if (!strcmp(method, ds_ecdsa_sha512URI)) *alg = SOAP_SMD_VRFY_ECDSA_SHA512; else return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, method); if (signedInfo->SignatureMethod->HMACOutputLength) { if ((*alg & SOAP_SMD_ALGO) != SOAP_SMD_HMAC) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid SignatureMethod HMACOutputLength"); *bits = *signedInfo->SignatureMethod->HMACOutputLength; if (*bits < (int)(4 * soap_smd_size(*alg, NULL)) || *bits > (int)(8 * soap_smd_size(*alg, NULL))) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid SignatureMethod HMACOutputLength"); } return SOAP_OK; } return soap_wsse_fault(soap, wsse__FailedCheck, "Signature with SignedInfo SignatureMethod required"); } /******************************************************************************\ * * ds:Signature/SignatureValue * \******************************************************************************/ /** @fn int soap_wsse_add_SignatureValue(struct soap *soap, int alg, const void *key, int keylen) @brief Adds SignedInfo/SignatureMethod element, signs the SignedInfo element, and adds the resulting SignatureValue element. @param soap context @param[in] alg is SOAP_SMD_HMAC_SHA1/224/256/384/512, SOAP_SMD_SIGN_DSA_SHA1/256, SOAP_SMD_SIGN_RSA_SHA1/224/256/384/512, or SOAP_SMD_SIGN_ECDSA_SHA1/224/256/384/512 @param[in] key to use to sign (HMAC or DSA/RSA/ECDSA EVP_PKEY) @param[in] keylen length of HMAC key @return SOAP_OK, SOAP_EOM, or fault To sign the SignedInfo element with this function, populate SignedInfo with Reference elements first using soap_wsse_add_SignedInfo_Reference. The SignedInfo element must not be modified after signing. The SOAP_XML_INDENT and SOAP_XML_CANONICAL flags are used to serialize the SignedInfo to compute the signature. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_SignatureValue(struct soap *soap, int alg, const void *key, int keylen) { ds__SignatureType *signature = soap_wsse_add_Signature(soap); const char *method = NULL; char *sig; int siglen; int err; const char *c14ninclude = soap->c14ninclude; DBGFUN1("soap_wsse_add_SignatureValue", "alg=%x", alg); /* determine signature algorithm to use */ switch (alg) { case SOAP_SMD_HMAC_SHA1: method = ds_hmac_sha1URI; break; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) case SOAP_SMD_HMAC_SHA224: method = ds_hmac_sha224URI; break; case SOAP_SMD_HMAC_SHA256: method = ds_hmac_sha256URI; break; case SOAP_SMD_HMAC_SHA384: method = ds_hmac_sha384URI; break; case SOAP_SMD_HMAC_SHA512: method = ds_hmac_sha512URI; break; #endif case SOAP_SMD_SIGN_DSA_SHA1: method = ds_dsa_sha1URI; break; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) case SOAP_SMD_SIGN_DSA_SHA256: method = ds_dsa_sha256URI; break; #endif case SOAP_SMD_SIGN_RSA_SHA1: method = ds_rsa_sha1URI; break; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) case SOAP_SMD_SIGN_RSA_SHA224: method = ds_rsa_sha224URI; break; case SOAP_SMD_SIGN_RSA_SHA256: method = ds_rsa_sha256URI; break; case SOAP_SMD_SIGN_RSA_SHA384: method = ds_rsa_sha512URI; break; case SOAP_SMD_SIGN_RSA_SHA512: method = ds_rsa_sha512URI; break; #endif case SOAP_SMD_SIGN_ECDSA_SHA1: method = ds_ecdsa_sha1URI; break; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) case SOAP_SMD_SIGN_ECDSA_SHA224: method = ds_ecdsa_sha224URI; break; case SOAP_SMD_SIGN_ECDSA_SHA256: method = ds_ecdsa_sha256URI; break; case SOAP_SMD_SIGN_ECDSA_SHA384: method = ds_ecdsa_sha512URI; break; case SOAP_SMD_SIGN_ECDSA_SHA512: method = ds_ecdsa_sha512URI; break; #endif default: return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, "Unsupported algorithm (requires OpenSSL 0.9.8 or greater)"); } /* populate SignedInfo/SignatureMethod based on SOAP_XML_CANONICAL flag */ soap_wsse_add_SignedInfo_SignatureMethod(soap, method, (soap->mode & SOAP_XML_CANONICAL)); /* use the gSOAP engine's look-aside buffer to temporarily hold the sig */ if (soap_store_lab(soap, NULL, soap_smd_size(alg, key))) return soap->error = SOAP_EOM; sig = soap->labbuf; /* we will serialize SignedInfo as it appears exactly in the SOAP Header */ soap->part = SOAP_IN_HEADER; /* set indent level for XML SignedInfo as it appears in the SOAP Header */ soap->level = 4; /* prevent xmlns:ds namespace inclusion when non-exclusive is used */ if (!(soap->mode & SOAP_XML_CANONICAL)) soap_push_namespace(soap, "ds", ds_URI); soap->c14ninclude = NULL; /* use smdevp engine to sign SignedInfo */ err = soap_smd_begin(soap, alg, key, keylen); if (!err) err = soap_out_ds__SignedInfoType(soap, "ds:SignedInfo", 0, signature->SignedInfo, NULL); soap->c14ninclude = c14ninclude; if (soap_smd_end(soap, sig, &siglen) || err) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Could not sign"); /* populate the SignatureValue element */ signature->SignatureValue = soap_s2base64(soap, (unsigned char*)sig, NULL, siglen); if (!signature->SignatureValue) return soap->error; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_verify_Signature(struct soap *soap) @brief Verifies the Signature and the signed elements. @param soap context @return SOAP_OK, SOAP_EOM, or fault */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_Signature(struct soap *soap) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); ds__SignedInfoType *signedInfo = soap_wsse_SignedInfo(soap); int err = SOAP_OK, alg, bits, keylen = 0; EVP_PKEY *pkey = NULL; const void *key = NULL; DBGFUN("soap_wsse_verify_Signature"); if (!signedInfo) return soap_wsse_fault(soap, wsse__FailedCheck, "Signature with SignedInfo required"); if (!data) return soap->error = SOAP_PLUGIN_ERROR; /* determine which signature algorithm was used */ if (soap_wsse_get_SignedInfo_SignatureMethod(soap, &alg, &bits)) return soap->error; /* for HMAC-SHA1, the secret key might be stored in the KeyIdentifier */ if ((alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) { const char *valueType = soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifierValueType(soap, soap_wsse_KeyInfo(soap)); /* if in the KeyIdentifier, retrieve it */ if (valueType && !strcmp(valueType, ds_hmac_sha1URI)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Using HMAC key from KeyIdentifier to verify signature\n")); key = (void*)soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifier(soap, soap_wsse_KeyInfo(soap), &keylen); } /* next, try the plugin's security token handler */ if (!key) { if (data->security_token_handler) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting HMAC key through security_token_handler callback\n")); key = data->security_token_handler(soap, &alg, NULL, NULL, 0, &keylen); } } /* still no key: try to get it from the plugin */ if (!key && alg == (data->vrfy_alg & SOAP_SMD_MASK)) { /* get the HMAC secret key from the plugin */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Using HMAC key from plugin to verify signature\n")); key = data->vrfy_key; keylen = data->vrfy_keylen; } } else { /* get the certificate from the KeyInfo reference */ X509 *cert, *cert1; cert = cert1 = soap_wsse_get_KeyInfo_SecurityTokenReferenceX509(soap); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got cert=%p\n", cert)); /* next, try the plugin's security token handler */ if (!cert) { /* no cert, get it through the token handler */ if (data->security_token_handler) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting certificate through security_token_handler callback\n")); cert = (X509*)data->security_token_handler(soap, &alg, NULL, NULL, 0, &keylen); } } /* obtain the public key from the cert */ if (cert) { pkey = X509_get_pubkey((X509*)cert); key = (void*)pkey; soap->error = SOAP_OK; } else if (alg == (data->vrfy_alg & SOAP_SMD_MASK)) { /* get the public key from the plugin */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Using public key from plugin to verify signature\n")); key = data->vrfy_key; soap->error = SOAP_OK; } if (cert1) X509_free(cert1); } /* if still no key then fault else verify SignedInfo with signature and check digests of local elements */ if (!key) err = soap_wsse_fault(soap, wsse__SecurityTokenUnavailable, NULL); else if (soap_wsse_verify_SignatureValue(soap, alg, key, keylen) || soap_wsse_verify_SignedInfo(soap)) err = soap->error; if (pkey) EVP_PKEY_free(pkey); return err; } /******************************************************************************/ /** @fn int soap_wsse_verify_SignatureValue(struct soap *soap, int alg, const void *key, int keylen) @brief Verifies the SignatureValue of a SignedInfo element. @param soap context @param[in] alg is a signature algorith, such as SOAP_SMD_HMAC_SHA1/224/256/384/512, SOAP_SMD_VRFY_DSA_SHA1/256, SOAP_SMD_VRFY_RSA_SHA1/224/256/384/512 or SOAP_SMD_VRFY_ECDSA_SHA1/224/256/384/512 determined by the SignedInfo/SignatureMethod @param[in] key to use to verify (HMAC or DSA/RSA/ECDSA EVP_PKEY) @param[in] keylen length of HMAC key @return SOAP_OK, SOAP_EOM, or fault This function searches for the SignedInfo element in the soap->dom DOM tree to verify the signature in the SignatureValue element. Using the DOM ensures we will verify the signature of a SignedInfo as it was exactly received by the parser, by using the -DWITH_DOM compile flag and SOAP_XML_DOM runtime flag. If there is no DOM, it verifies the signature of the deserialized SignedInfo element in the SOAP Header. However, serializing deserialized data may change the octet stream that was signed, unless we're using gSOAP as producers and consumers (with the SOAP_XML_INDENT flag reset). */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_SignatureValue(struct soap *soap, int alg, const void *key, int keylen) { ds__SignatureType *signature = soap_wsse_Signature(soap); DBGFUN1("soap_wsse_verify_SignatureValue", "alg=%x", alg); /* always need an HMAC secret key or DSA/RSA public key to verify */ if (!key) return soap_wsse_fault(soap, wsse__SecurityTokenUnavailable, NULL); /* verify the SignedInfo element with the SignatureValue element */ if (signature && signature->SignedInfo && signature->SignatureValue) { char *sig; const char *sigval; int method, bits, siglen, sigvallen; struct soap_dom_element *elt; /* check that we are using the intended signature algorithm */ if (soap_wsse_get_SignedInfo_SignatureMethod(soap, &method, &bits)) return soap->error; if (alg != method) return soap_wsse_fault(soap, wsse__FailedCheck, "Incorrect signature algorithm used"); /* retrieve the signature */ sigval = soap_base642s(soap, signature->SignatureValue, NULL, 0, &sigvallen); /* search the DOM for SignedInfo */ elt = soap_dom_find(soap->dom, soap->dom, ds_URI, "SignedInfo", 0); if (elt) { int err = SOAP_OK; const char *c14ninclude = soap->c14ninclude; /* should not include leading whitespace in signature verification */ elt->lead = NULL; /* use smdevp engine to verify SignedInfo */ if ((alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) { sig = (char*)soap_malloc(soap, soap_smd_size(alg, key)); } else { sig = (char*)sigval; siglen = sigvallen; } if (signature->SignedInfo->CanonicalizationMethod && signature->SignedInfo->CanonicalizationMethod->Algorithm) { struct soap_dom_element *prt; struct soap_dom_attribute *att; if (signature->SignedInfo->CanonicalizationMethod->c14n__InclusiveNamespaces) soap->c14ninclude = signature->SignedInfo->CanonicalizationMethod->c14n__InclusiveNamespaces->PrefixList; else soap->c14ninclude = NULL; /* recanonicalize DOM while keeping content "as is" */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Verifying signed canonicalized DOM with C14N prefix list '%s'\n", soap->c14ninclude ? soap->c14ninclude : "")); soap->mode &= ~SOAP_XML_DOM; soap->mode |= SOAP_XML_CANONICAL | SOAP_DOM_ASIS; if (strcmp(signature->SignedInfo->CanonicalizationMethod->Algorithm, c14n_URI) && strcmp(signature->SignedInfo->CanonicalizationMethod->Algorithm, c14n_wc_URI) && strcmp(signature->SignedInfo->CanonicalizationMethod->Algorithm, exc_c14n_URI) && strcmp(signature->SignedInfo->CanonicalizationMethod->Algorithm, exc_c14n_wc_URI)) return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, "Invalid canonicalization method"); err = soap_smd_begin(soap, alg, key, keylen); /* emit all xmlns attributes of ancestors */ while (soap->nlist) { struct soap_nlist *np = soap->nlist->next; SOAP_FREE(soap, soap->nlist); soap->nlist = np; } /* push xmlns:ns="..." */ for (prt = elt->prnt; prt; prt = prt->prnt) { for (att = prt->atts; att; att = att->next) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM attribute = %s\n", att->name)); if (!strncmp(att->name, "xmlns:", 6) && !soap_lookup_ns(soap, att->name + 6, strlen(att->name + 6))) soap_attribute(soap, att->name, att->text); } } /* push xmlns="..." */ for (prt = elt->prnt; prt; prt = prt->prnt) { for (att = prt->atts; att; att = att->next) { if (!strcmp(att->name, "xmlns")) { soap_attribute(soap, att->name, att->text); break; } } } } else { /* compute digest over DOM "as is" */ soap->mode &= ~(SOAP_XML_CANONICAL | SOAP_XML_DOM); soap->mode |= SOAP_DOM_ASIS; err = soap_smd_begin(soap, alg, key, keylen); } /* do not dump namespace table xmlns bindings */ soap->ns = 2; /* compute digest */ soap->feltbegout = NULL; soap->feltendout = NULL; if (!err) err = soap_out_xsd__anyType(soap, NULL, 0, elt, NULL); soap->c14ninclude = c14ninclude; if (soap_smd_end(soap, sig, &siglen) || err) return soap_wsse_fault(soap, wsse__FailedCheck, "The signed SignedInfo SignatureValue is invalid"); if ((alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) { if (bits == 0) { if (siglen != sigvallen || memcmp(sig, sigval, siglen)) return soap_wsse_fault(soap, wsse__FailedCheck, "The HMAC-signed SignedInfo is invalid"); } else if (bits > 8 * siglen || memcmp(sig, sigval, 8 * bits)) { return soap_wsse_fault(soap, wsse__FailedCheck, "The HMAC-signed SignedInfo is invalid"); } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Signature in DOM is valid\n")); return SOAP_OK; } else { int err = SOAP_OK; const char *c14nexclude = soap->c14nexclude; const char *c14ninclude = soap->c14ninclude; soap_mode mode = soap->mode; short part = soap->part; /* serialize the SignedInfo element as it appeared in the SOAP Header */ soap->level = 4; soap->c14ninclude = NULL; soap->part = SOAP_IN_HEADER; /* header encoding rules (literal) */ soap->mode &= ~SOAP_XML_DOM; if (signature->SignedInfo->CanonicalizationMethod) soap->mode |= SOAP_XML_CANONICAL; else soap->mode &= ~SOAP_XML_CANONICAL; if ((alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) { sig = (char*)soap_malloc(soap, soap_smd_size(alg, key)); } else { sig = (char*)sigval; siglen = sigvallen; } err = soap_smd_begin(soap, alg, key, keylen); if (!err) err = soap_out_ds__SignedInfoType(soap, "ds:SignedInfo", 0, signature->SignedInfo, NULL); soap->mode = mode; soap->c14nexclude = c14nexclude; soap->c14ninclude = c14ninclude; soap->part = part; if (soap_smd_end(soap, sig, &siglen) || err) return soap_wsse_fault(soap, wsse__FailedCheck, "The signed serialized SignedInfo SignatureValue is invalid"); if ((alg & SOAP_SMD_ALGO) == SOAP_SMD_HMAC) { if (bits == 0) { if (siglen != sigvallen || memcmp(sig, sigval, siglen)) return soap_wsse_fault(soap, wsse__FailedCheck, "The HMAC-signed serialized SignedInfo is invalid"); } else if (bits > 8 * siglen || memcmp(sig, sigval, 8 * bits)) { return soap_wsse_fault(soap, wsse__FailedCheck, "The HMAC-signed serialized SignedInfo is invalid"); } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Signature is valid\n")); return SOAP_OK; } } return soap_wsse_fault(soap, wsse__FailedCheck, "Signature with SignedInfo and SignatureValue required"); } /******************************************************************************/ /** @fn int soap_wsse_verify_SignedInfo(struct soap *soap) @brief Verifies the digest values of the XML elements referenced by the SignedInfo References. @param soap context @return SOAP_OK or fault This function searches for the SignedInfo element in the soap->dom DOM tree to verify the digests contained therein. Using the DOM ensures we will verify the digests of the locally signed elements as they were exactly received by the parser, by using the -DWITH_DOM compile flag and SOAP_XML_DOM runtime flag. If there is no DOM, the function fails. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_SignedInfo(struct soap *soap) { ds__SignedInfoType *signedInfo = soap_wsse_SignedInfo(soap); DBGFUN("soap_wsse_verify_SignedInfo"); if (signedInfo) { struct soap_dom_element *elt; int i; /* must have at least one reference element */ if (signedInfo->__sizeReference == 0) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Signature SignedInfo Reference required"); /* remove ds:Signature from the DOM to support enveloped signatures */ elt = soap_dom_find(soap->dom, soap->dom, ds_URI, "Signature", 0); if (elt) { elt->elts = NULL; elt->atts = NULL; elt->nstr = NULL; elt->name = NULL; elt->text = NULL; elt->code = NULL; } /* As an alternative to the current implementation, this might be a good place to re-canonicalize the entire DOM to improve interop. Two DOMs can be used: one with non-c14n XML and one with c14n XML so we can handle multiple different transforms. */ /* for each reference element, check the digest */ for (i = 0; i < signedInfo->__sizeReference; i++) { ds__ReferenceType *reference = signedInfo->Reference[i]; /* reference element is complete? */ if (!reference->URI || !reference->DigestMethod || !reference->DigestMethod->Algorithm || !reference->DigestValue) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Incomplete SignedInfo Reference"); /* reference is local? */ if (*reference->URI == '#') { int alg, canonical = 0; const char *c14ninclude = soap->c14ninclude; unsigned char hash[SOAP_SMD_MAX_SIZE]; /* digest algorithm */ if (!strcmp(reference->DigestMethod->Algorithm, ds_sha1URI)) alg = SOAP_SMD_DGST_SHA1; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) else if (!strcmp(reference->DigestMethod->Algorithm, ds_sha224URI)) alg = SOAP_SMD_DGST_SHA224; else if (!strcmp(reference->DigestMethod->Algorithm, ds_sha256URI)) alg = SOAP_SMD_DGST_SHA256; else if (!strcmp(reference->DigestMethod->Algorithm, ds_sha384URI)) alg = SOAP_SMD_DGST_SHA384; else if (!strcmp(reference->DigestMethod->Algorithm, ds_sha512URI)) alg = SOAP_SMD_DGST_SHA512; #endif else return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, reference->DigestMethod->Algorithm); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Verifying digest of locally referenced data %s alg=%x\n", reference->URI, alg)); soap->c14ninclude = NULL; /* if reference has a transform, it should be an c14n or exc-c14n transform */ if (reference->Transforms) { int i; for (i = 0; i < reference->Transforms->__sizeTransform; i++) { if (!reference->Transforms->Transform[i].Algorithm) return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, NULL); if (!strcmp(reference->Transforms->Transform[i].Algorithm, c14n_URI) || !strcmp(reference->Transforms->Transform[i].Algorithm, c14n_wc_URI)) { canonical = 1; } else if (!strcmp(reference->Transforms->Transform[i].Algorithm, exc_c14n_URI) || !strcmp(reference->Transforms->Transform[i].Algorithm, exc_c14n_wc_URI)) { canonical = 1; if (reference->Transforms->Transform[i].c14n__InclusiveNamespaces) soap->c14ninclude = reference->Transforms->Transform[i].c14n__InclusiveNamespaces->PrefixList; } else if (strcmp(reference->Transforms->Transform[i].Algorithm, ds_envsigURI)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unsupported Transform Algorithm %s\n", reference->Transforms->Transform[i].Algorithm)); /* ignore application-specific Transforms return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, reference->Transforms->Transform[i].Algorithm); */ } } } /* convert base64 digest to binary */ soap_base642s(soap, reference->DigestValue, (char*)hash, SOAP_SMD_MAX_SIZE, NULL); /* verify the digest of a locally signed element */ if (soap_wsse_verify_digest(soap, alg, canonical, reference->URI + 1, hash)) return soap->error; soap->c14ninclude = c14ninclude; } } return SOAP_OK; } return soap_wsse_fault(soap, wsse__InvalidSecurity, "Signature SignedInfo required"); } /******************************************************************************/ /** @fn int soap_wsse_verify_digest(struct soap *soap, int alg, int canonical, const char *id, unsigned char hash[SOAP_SMD_MAX_SIZE]) @brief Verifies the digest value of an XML element referenced by id against the hash. @param soap context @param[in] alg digest algorithm @param[in] canonical flag indicating that element is signed in c14n (inclusive or exclusive) @param[in] id string of the XML element to verify @param[in] hash digest value to verify against @return SOAP_OK or fault */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_digest(struct soap *soap, int alg, int canonical, const char *id, unsigned char hash[SOAP_SMD_MAX_SIZE]) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); struct soap_dom_element *elt, *dom = NULL; DBGFUN3("soap_wsse_verify_digest", "alg=%x", alg, "canonical=%d", canonical, "id=%s", id); if (!data) return soap_set_receiver_error(soap, "soap_wsse_verify_digest", "Plugin not registered", SOAP_PLUGIN_ERROR); /* traverse the DOM to find the element with matching wsu:Id or ds:Id */ for (elt = soap->dom; elt; elt = soap_dom_next_element(elt, NULL)) { struct soap_dom_attribute *att; for (att = elt->atts; att; att = att->next) { /* check if attribute is an wsu:Id or ds:Id or ID*/ if (att->name && ((att->nstr && (!strcmp(att->nstr, wsu_URI) || !strcmp(att->nstr, ds_URI)) && (!strcmp(att->name, "Id") || !soap_tag_cmp(att->name, "*:Id"))) || (!att->nstr && (!strcmp(att->name, "ID") || !strcmp(att->name, "AssertionID"))))) { /* found a match, compare attribute value with id */ if (att->text && !strcmp(att->text, id)) { if (dom) return soap_wsse_fault(soap, wsse__FailedCheck, "SignedInfo duplicate Id"); dom = elt; /* elt = NULL; break; */ /* improves speed but skips duplicate Id check */ } } } } if (dom) { unsigned char HA[SOAP_SMD_MAX_SIZE]; int len, err = SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Computing digest for Id=%s\n", id)); /* do not hash leading whitespace */ dom->lead = NULL; /* canonical or as-is? */ if (canonical) { struct soap_dom_element *prt; struct soap_dom_attribute *att; soap->mode &= ~SOAP_XML_DOM; soap->mode |= SOAP_XML_CANONICAL | SOAP_DOM_ASIS; err = soap_smd_begin(soap, alg, NULL, 0); /* emit all xmlns attributes of ancestors */ while (soap->nlist) { struct soap_nlist *np = soap->nlist->next; SOAP_FREE(soap, soap->nlist); soap->nlist = np; } for (prt = dom->prnt; prt; prt = prt->prnt) { for (att = prt->atts; att; att = att->next) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM attribute = %s\n", att->name)); if (!strncmp(att->name, "xmlns:", 6) && !soap_lookup_ns(soap, att->name + 6, strlen(att->name + 6))) soap_attribute(soap, att->name, att->text); } } for (prt = dom->prnt; prt; prt = prt->prnt) { for (att = prt->atts; att; att = att->next) { if (!strcmp(att->name, "xmlns")) { soap_attribute(soap, att->name, att->text); break; } } } } else { /* compute digest over DOM "as is" */ soap->mode &= ~SOAP_XML_CANONICAL; soap->mode |= SOAP_DOM_ASIS; err = soap_smd_begin(soap, alg, NULL, 0); } /* do not dump namespace table xmlns bindings */ soap->ns = 2; /* compute digest */ soap->feltbegout = NULL; soap->feltendout = NULL; /* root may have prefixes that should be retained as per soap->c14ninclude */ soap->event = SOAP_SEC_BEGIN; if (!err) err = soap_out_xsd__anyType(soap, NULL, 0, dom, NULL); if (soap_smd_end(soap, (char*)HA, &len) || err) return soap_wsse_fault(soap, wsse__FailedCheck, "Digest computation failed"); /* compare digests, success if identical */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Comparing digest hashes\n")); DBGHEX(TEST, hash, len); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n--\n")); DBGHEX(TEST, HA, len); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "\n")); if (!memcmp(hash, HA, (size_t)len)) return SOAP_OK; return soap_wsse_fault(soap, wsse__FailedCheck, NULL); } if ((data->vrfy_alg & SOAP_WSSE_IGNORE_EXTRA_REFS)) return SOAP_OK; return soap_wsse_fault(soap, wsse__FailedCheck, "SignedInfo reference URI target not found"); } /******************************************************************************\ * * ds:Signature/KeyInfo * \******************************************************************************/ /** @fn ds__KeyInfoType* soap_wsse_add_KeyInfo(struct soap *soap) @brief Adds KeyInfo element. @param soap context @return ds__KeyInfo object */ SOAP_FMAC1 struct ds__KeyInfoType * SOAP_FMAC2 soap_wsse_add_KeyInfo(struct soap *soap) { ds__SignatureType *signature = soap_wsse_add_Signature(soap); if (!signature->KeyInfo) { signature->KeyInfo = (ds__KeyInfoType*)soap_malloc(soap, sizeof(ds__KeyInfoType)); if (!signature->KeyInfo) return NULL; } soap_default_ds__KeyInfoType(soap, signature->KeyInfo); return signature->KeyInfo; } /******************************************************************************/ /** @fn ds__KeyInfoType* soap_wsse_KeyInfo(struct soap *soap) @brief Returns KeyInfo element if present. @param soap context @return ds__KeyInfo object or NULL */ SOAP_FMAC1 struct ds__KeyInfoType * SOAP_FMAC2 soap_wsse_KeyInfo(struct soap *soap) { ds__SignatureType *signature = soap_wsse_Signature(soap); if (signature) return signature->KeyInfo; return NULL; } /******************************************************************************\ * * ds:Signature/KeyInfo/KeyName * \******************************************************************************/ /** @fn int soap_wsse_add_KeyInfo_KeyName(struct soap *soap, const char *name) @brief Adds KeyName element. @param soap context @param[in] name string of the KeyName @return SOAP_OK @note The recommended method to add Key information is to utilize KeyIdentifier instead of KeyName. A KeyName is useful mainly for internal use. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_KeyInfo_KeyName(struct soap *soap, const char *name) { ds__KeyInfoType *keyInfo = soap_wsse_add_KeyInfo(soap); DBGFUN1("soap_wsse_add_KeyInfo_KeyName", "name=%s", name); /* populate the KeyName element */ keyInfo->KeyName = soap_strdup(soap, name); return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_get_KeyInfo_KeyName(struct soap *soap) @brief Returns KeyName element if present. @param soap context @return string or NULL */ SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsse_get_KeyInfo_KeyName(struct soap *soap) { ds__KeyInfoType *keyInfo = soap_wsse_KeyInfo(soap); DBGFUN("soap_wsse_get_KeyInfo_KeyName"); if (!keyInfo) return NULL; return keyInfo->KeyName; } /******************************************************************************\ * * ds:Signature/KeyInfo/wsse:SecurityTokenReference/Reference/@URI * \******************************************************************************/ /** @fn int soap_wsse_add_KeyInfo_SecurityTokenReferenceURI(struct soap *soap, const char *URI, const char *valueType) @brief Adds KeyInfo element with SecurityTokenReference URI. @param soap context @param[in] URI string referencing a security token @param[in] valueType string or NULL @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_KeyInfo_SecurityTokenReferenceURI(struct soap *soap, const char *URI, const char *valueType) { ds__KeyInfoType *keyInfo = soap_wsse_add_KeyInfo(soap); DBGFUN2("soap_wsse_add_KeyInfo_SecurityTokenReferenceURI", "URI=%s", URI?URI:"", "valueType=%s", valueType?valueType:""); /* allocate SecurityTokenReference element if we don't have one already */ if (!keyInfo->wsse__SecurityTokenReference) { keyInfo->wsse__SecurityTokenReference = (_wsse__SecurityTokenReference*)soap_malloc(soap, sizeof(_wsse__SecurityTokenReference)); if (!keyInfo->wsse__SecurityTokenReference) return soap->error = SOAP_EOM; } soap_default__wsse__SecurityTokenReference(soap, keyInfo->wsse__SecurityTokenReference); /* allocate Reference element */ keyInfo->wsse__SecurityTokenReference->Reference = (_wsse__Reference*)soap_malloc(soap, sizeof(_wsse__Reference)); if (!keyInfo->wsse__SecurityTokenReference->Reference) return soap->error = SOAP_EOM; soap_default__wsse__Reference(soap, keyInfo->wsse__SecurityTokenReference->Reference); /* populate the Reference element */ keyInfo->wsse__SecurityTokenReference->Reference->URI = soap_strdup(soap, URI); keyInfo->wsse__SecurityTokenReference->Reference->ValueType = soap_strdup(soap, valueType); return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(struct soap *soap, const char *URI) @brief Adds KeyInfo element with SecurityTokenReference URI to an X509 cert. @param soap context @param[in] URI string referencing an X509 certificate @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_KeyInfo_SecurityTokenReferenceX509(struct soap *soap, const char *URI) { return soap_wsse_add_KeyInfo_SecurityTokenReferenceURI(soap, URI, wsse_X509v3URI); } /******************************************************************************/ /** @fn const char* soap_wsse_get_KeyInfo_SecurityTokenReferenceURI(struct soap *soap) @brief Returns a SecurityTokenReference URI if present. @param soap context @return string or NULL */ SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsse_get_KeyInfo_SecurityTokenReferenceURI(struct soap *soap) { ds__KeyInfoType *keyInfo = soap_wsse_KeyInfo(soap); if (keyInfo && keyInfo->wsse__SecurityTokenReference && keyInfo->wsse__SecurityTokenReference->Reference) return keyInfo->wsse__SecurityTokenReference->Reference->URI; return NULL; } /******************************************************************************/ /** @fn const char* soap_wsse_get_KeyInfo_SecurityTokenReferenceValueType(struct soap *soap) @brief Returns a SecurityTokenReference ValueType if present. @param soap context @return string or NULL */ SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsse_get_KeyInfo_SecurityTokenReferenceValueType(struct soap *soap) { ds__KeyInfoType *keyInfo = soap_wsse_KeyInfo(soap); if (keyInfo && keyInfo->wsse__SecurityTokenReference && keyInfo->wsse__SecurityTokenReference->Reference) return keyInfo->wsse__SecurityTokenReference->Reference->ValueType; return NULL; } /******************************************************************************/ /** @fn X509* soap_wsse_get_KeyInfo_SecurityTokenReferenceX509(struct soap *soap) @brief Returns a X509 certificate when referenced and present as a BinarySecurity token or when embedded in the signature KeyIdentifier or KeyInfo element. This call must be followed by an X509_free to deallocate the X509 certificate data. @param soap context @return X509 object or NULL with wsse:SecurityTokenUnavailable fault */ SOAP_FMAC1 X509* SOAP_FMAC2 soap_wsse_get_KeyInfo_SecurityTokenReferenceX509(struct soap *soap) { const char *URI = soap_wsse_get_KeyInfo_SecurityTokenReferenceURI(soap); X509 *cert = NULL; DBGFUN("soap_wsse_get_KeyInfo_SecurityTokenReferenceX509"); if (URI && *URI == '#') { const char *valueType; valueType = soap_wsse_get_KeyInfo_SecurityTokenReferenceValueType(soap); if (!valueType || !strcmp(valueType, wsse_X509v3URI)) cert = soap_wsse_get_BinarySecurityTokenX509(soap, URI + 1); } else if (!URI) { #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) const unsigned char *der = NULL; #else unsigned char *der = NULL; #endif int derlen; ds__KeyInfoType *keyInfo = soap_wsse_KeyInfo(soap); if (keyInfo && keyInfo->X509Data && keyInfo->X509Data->X509Certificate) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Using X509 cert from KeyInfo to verify signature\n")); der = (unsigned char*)soap_base642s(soap, keyInfo->X509Data->X509Certificate, NULL, 0, &derlen); } else { const char *valueType = soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifierValueType(soap, keyInfo); if (valueType && !strcmp(valueType, ds_hmac_sha1URI)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Using X509 cert from KeyIdentifier to verify signature\n")); der = (unsigned char*)soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifier(soap, keyInfo, &derlen); } } if (der) { cert = d2i_X509(NULL, &der, derlen); /* verify the certificate */ if (cert && soap_wsse_verify_X509(soap, cert)) { X509_free(cert); cert = NULL; } } } return cert; } /******************************************************************************/ /** @fn int soap_wsse_add_KeyInfo_X509Certificate(struct soap *soap, X509 *cert) @brief Adds KeyInfo/X509Data/X509Certificate. @param soap context @param[in] cert X509 certificate @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_KeyInfo_X509Certificate(struct soap *soap, X509 *cert) { ds__KeyInfoType *keyInfo = soap_wsse_add_KeyInfo(soap); int derlen; unsigned char *der, *s; DBGFUN("soap_wsse_add_KeyInfo_X509Certificate"); if (!cert) return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Missing certificate"); if (!keyInfo) return soap->error = SOAP_EOM; /* populate the X509Data element */ keyInfo->X509Data = (struct ds__X509DataType*)soap_malloc(soap, sizeof(struct ds__X509DataType)); if (!keyInfo->X509Data) return soap->error = SOAP_EOM; soap_default_ds__X509DataType(soap, keyInfo->X509Data); /* determine the storage requirement */ derlen = i2d_X509(cert, NULL); if (derlen < 0) return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Invalid certificate"); /* use the gSOAP engine's look-aside buffer to temporarily hold the cert */ if (soap_store_lab(soap, NULL, derlen)) return SOAP_EOM; s = der = (unsigned char*)soap->labbuf; /* store in DER format */ i2d_X509(cert, &s); /* populate the X509Certificate with base64 certificate data */ keyInfo->X509Data->X509Certificate = soap_s2base64(soap, der, NULL, derlen); return SOAP_OK; } /******************************************************************************/ /** @fn struct ds__X509IssuerSerialType *soap_wsse_get_KeyInfo_SecurityTokenReferenceX509Data(struct soap *soap) @brief Returns ds__X509IssuerSerialType with non-NULL X509IssuerName and non-NULL X509SerialNumber of a X509Data element when present and set. @param soap context @return pointer to ds__X509IssuerSerialType struct or NULL */ SOAP_FMAC1 struct ds__X509IssuerSerialType * SOAP_FMAC2 soap_wsse_get_KeyInfo_SecurityTokenReferenceX509Data(struct soap *soap) { ds__KeyInfoType *keyInfo = soap_wsse_KeyInfo(soap); if (keyInfo && keyInfo->wsse__SecurityTokenReference && keyInfo->wsse__SecurityTokenReference->ds__X509Data && keyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial && keyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial->X509IssuerName && keyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial->X509SerialNumber) return keyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial; return NULL; } /******************************************************************************\ * * ds:Signature/KeyInfo/wsse:SecurityTokenReference/Reference/KeyIdentifier * \******************************************************************************/ /** @fn int soap_wsse_add_KeyInfo_SecurityTokenReferenceKeyIdentifier(struct soap *soap, const char *id, const char *valueType, unsigned char *data, int size) @brief Adds KeyInfo element with SecurityTokenReference/KeyIdentifier binary data. @param soap context @param[in] id string for signature reference @param[in] valueType string @param[in] data binary data @param[in] size of binary data @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_KeyInfo_SecurityTokenReferenceKeyIdentifier(struct soap *soap, const char *id, const char *valueType, unsigned char *data, int size) { ds__KeyInfoType *keyInfo = soap_wsse_add_KeyInfo(soap); DBGFUN2("soap_wsse_add_KeyInfo_SecurityTokenReferenceKeyIdentifier", "id=%s", id?id:"", "valueType=%s", valueType?valueType:""); /* allocate SecurityTokenReference if we don't have one already */ if (!keyInfo->wsse__SecurityTokenReference) { keyInfo->wsse__SecurityTokenReference = (_wsse__SecurityTokenReference*)soap_malloc(soap, sizeof(_wsse__SecurityTokenReference)); if (!keyInfo->wsse__SecurityTokenReference) return soap->error = SOAP_EOM; } soap_default__wsse__SecurityTokenReference(soap, keyInfo->wsse__SecurityTokenReference); /* allocate KeyIdentifier */ keyInfo->wsse__SecurityTokenReference->KeyIdentifier = (_wsse__KeyIdentifier*)soap_malloc(soap, sizeof(_wsse__KeyIdentifier)); if (!keyInfo->wsse__SecurityTokenReference->KeyIdentifier) return soap->error = SOAP_EOM; soap_default__wsse__KeyIdentifier(soap, keyInfo->wsse__SecurityTokenReference->KeyIdentifier); /* populate KeyIdentifier */ keyInfo->wsse__SecurityTokenReference->KeyIdentifier->wsu__Id = soap_strdup(soap, id); keyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType = soap_strdup(soap, valueType); keyInfo->wsse__SecurityTokenReference->KeyIdentifier->EncodingType = (char*)wsse_Base64BinaryURI; keyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item = soap_s2base64(soap, data, NULL, size); return SOAP_OK; } /******************************************************************************/ /** @fn const char* soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifierValueType(struct soap *soap, ds__KeyInfoType *keyInfo) @brief Returns KeyInfo/SecurityTokenReference/KeyIdentifier/ValueType if present. @param soap context @param keyInfo points to ds__KeyInfoType, e.g. using soap_wsse_KeyInfo(soap) @return string or NULL */ SOAP_FMAC1 const char * SOAP_FMAC2 soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifierValueType(struct soap *soap, ds__KeyInfoType *keyInfo) { DBGFUN("soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifierValueType"); if (!keyInfo || !keyInfo->wsse__SecurityTokenReference || !keyInfo->wsse__SecurityTokenReference->KeyIdentifier) return NULL; return keyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType; } /******************************************************************************/ /** @fn const unsigned char* soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifier(struct soap *soap, ds__KeyInfoType *keyInfo, int *size) @brief Returns KeyInfo/SecurityTokenReference/KeyIdentifier binary data. @param soap context @param keyInfo points to ds__KeyInfoType, e.g. using soap_wsse_KeyInfo(soap) @param[out] size is set to the size of the decoded data @return data or NULL */ SOAP_FMAC1 const unsigned char * SOAP_FMAC2 soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifier(struct soap *soap, ds__KeyInfoType *keyInfo, int *size) { DBGFUN("soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifier"); if (!keyInfo || !keyInfo->wsse__SecurityTokenReference || !keyInfo->wsse__SecurityTokenReference->KeyIdentifier) return NULL; if (!keyInfo->wsse__SecurityTokenReference->KeyIdentifier->EncodingType || !strcmp(keyInfo->wsse__SecurityTokenReference->KeyIdentifier->EncodingType, wsse_Base64BinaryURI)) return (unsigned char*)soap_base642s(soap, keyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item, NULL, 0, size); else return (unsigned char*)soap_hex2s(soap, keyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item, NULL, 0, size); } /******************************************************************************\ * * ds:Signature/KeyInfo/wsse:SecurityTokenReference/Reference/Embedded * \******************************************************************************/ /** @fn int soap_wsse_add_KeyInfo_SecurityTokenReferenceEmbedded(struct soap *soap, const char *id, const char *valueType) @brief Adds KeyInfo element with Embedded SecurityTokenReference. @param soap context @param[in] id string for signature reference @param[in] valueType string @return SOAP_OK @note This function does not add embedded tokens automatically. See code for comments. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_KeyInfo_SecurityTokenReferenceEmbedded(struct soap *soap, const char *id, const char *valueType) { ds__KeyInfoType *keyInfo = soap_wsse_add_KeyInfo(soap); DBGFUN("soap_wsse_get_KeyInfo_SecurityTokenReferenceEmbedded"); /* allocate SecurityTokenReference if we don't have one already */ if (!keyInfo->wsse__SecurityTokenReference) { keyInfo->wsse__SecurityTokenReference = (_wsse__SecurityTokenReference*)soap_malloc(soap, sizeof(_wsse__SecurityTokenReference)); if (!keyInfo->wsse__SecurityTokenReference) return soap->error = SOAP_EOM; } soap_default__wsse__SecurityTokenReference(soap, keyInfo->wsse__SecurityTokenReference); /* allocate Embedded element */ keyInfo->wsse__SecurityTokenReference->Embedded = (_wsse__Embedded*)soap_malloc(soap, sizeof(_wsse__Embedded)); if (!keyInfo->wsse__SecurityTokenReference->Embedded) return soap->error = SOAP_EOM; soap_default__wsse__Embedded(soap, keyInfo->wsse__SecurityTokenReference->Embedded); /* populate Embedded element */ keyInfo->wsse__SecurityTokenReference->Embedded->wsu__Id = soap_strdup(soap, id); keyInfo->wsse__SecurityTokenReference->Embedded->ValueType = soap_strdup(soap, valueType); /* TODO: Add embedded tokens and assertions. Could use DOM here? keyInfo->wsse__SecurityTokenReference->Embedded->xyz = ...; */ return SOAP_OK; } /******************************************************************************\ * * wsse:Security/xenc:EncryptedKey header element * \******************************************************************************/ /** @fn int soap_wsse_add_EncryptedKey(struct soap *soap, int alg, const char *URI, X509 *cert, const char *subjectkeyid, const char *issuer, const char *serial) @brief Adds EncryptedKey header element and initiates the encryption of the SOAP Body. @param soap context @param[in] alg algorithm to use, SOAP_MEC_ENV_ENC_DES_CBC etc. @param[in] URI a unique identifier for the key, required for interoperability @param[in] cert the X509 certificate with public key or NULL @param[in] subjectkeyid string identification of the subject which when set to non-NULL is used instead of embedding the public key in the message @param[in] issuer string to include SecurityTokenReference/X509Data @param[in] serial string to include SecurityTokenReference/X509Data @return SOAP_OK or error code This function adds the encrypted key or subject key ID to the WS-Security header and initiates encryption of the SOAP Body. An X509 certificate may be provided, or the subjectkeyid, or the issuer and serial number. The certificate is embedded in the WS-Security EncryptedKey header. If the subjectkeyid string is non-NULL the subject key ID is used in the EncryptedKey header instead of the X509 certificate content. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_EncryptedKey(struct soap *soap, int alg, const char *URI, X509 *cert, const char *subjectkeyid, const char *issuer, const char *serial) { return soap_wsse_add_EncryptedKey_encrypt_only(soap, alg, URI, cert, subjectkeyid, issuer, serial, NULL); } /******************************************************************************/ /** @fn int soap_wsse_add_EncryptedKey_encrypt_only(struct soap *soap, int alg, const char *URI, X509 *cert, const char *subjectkeyid, const char *issuer, const char *serial, const char *tags) @brief Adds EncryptedKey header element and initiates encryption of the given XML elements specified in the tags string. Should be used in combination with soap_wsse_set_wsu_id to set wsu:Id for given XML element tags. @param soap context @param[in] alg algorithm to use, SOAP_MEC_ENV_ENC_DES_CBC etc. @param[in] URI a unique identifier for the key, required for interoperability @param[in] cert the X509 certificate with public key or NULL @param[in] subjectkeyid string identification of the subject which when set to non-NULL is used instead of embedding the public key in the message @param[in] issuer string to include SecurityTokenReference/X509Data @param[in] serial string to include SecurityTokenReference/X509Data @param[in] tags space-separated string of element tag names to encrypt @return xenc__EncryptedKeyType object This function adds the encrypted key or subject key ID to the WS-Security header and initiates encryption of the SOAP Body. An X509 certificate may be provided, or the subjectkeyid, or the issuer and serial number. The certificate is embedded in the WS-Security EncryptedKey header. If the subjectkeyid string is non-NULL the subject key ID is used in the EncryptedKey header instead of the X509 certificate content. Only the XML elements given in the 'tags' string as wsu:Id attributed elements are encrypted. @warning Use @ref soap_wsse_add_EncryptedKey_encrypt_only only in combination with @ref soap_wsse_set_wsu_id with the tag names of the elements to be encrypted. OTHERWISE THE GIVEN XML ELEMENTS ARE NOT ENCRYPTED AND WILL BE SENT IN THE CLEAR. @warning The elements identified with @ref soap_wsse_set_wsu_id to encrypt MUST occur EXACTLY ONCE in the SOAP Body. @warning Encryption/decryption of elements with simple content (CDATA content) IS NOT SUPPORTED. This means that elements you want to encrypt with this function must have complex content. That is, only encrypt elements with sub elements or encrypt the entire SOAP Body. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_EncryptedKey_encrypt_only(struct soap *soap, int alg, const char *URI, X509 *cert, const char *subjectkeyid, const char *issuer, const char *serial, const char *tags) { EVP_PKEY *pubk; unsigned char *key; int keylen; _wsse__Security *security; struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_add_EncryptedKey_encrypt_only"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_add_EncryptedKey_encrypt_only", "Plugin not registered", SOAP_PLUGIN_ERROR); security = soap_wsse_add_Security(soap); /* if we don't have a xenc:EncryptedKey, create one */ if (!security->xenc__EncryptedKey) { security->xenc__EncryptedKey = (xenc__EncryptedKeyType*)soap_malloc(soap, sizeof(xenc__EncryptedKeyType)); if (!security->xenc__EncryptedKey) return soap->error = SOAP_EOM; } soap_default_xenc__EncryptedKeyType(soap, security->xenc__EncryptedKey); security->xenc__EncryptedKey->Id = soap_strdup(soap, URI); security->xenc__EncryptedKey->EncryptionMethod = (xenc__EncryptionMethodType*)soap_malloc(soap, sizeof(struct xenc__EncryptionMethodType)); if (!security->xenc__EncryptedKey->EncryptionMethod) return soap->error = SOAP_EOM; soap_default_xenc__EncryptionMethodType(soap, security->xenc__EncryptedKey->EncryptionMethod); /* RSA Version 1.5 or RSA-OAEP? */ alg |= (SOAP_MEC_ENV | SOAP_MEC_ENC); if (alg & SOAP_MEC_OAEP) { security->xenc__EncryptedKey->EncryptionMethod->Algorithm = (char*)xenc_rsaesURI; security->xenc__EncryptedKey->EncryptionMethod->OAEPparams = NULL; security->xenc__EncryptedKey->EncryptionMethod->ds__DigestMethod = (struct ds__DigestMethodType*)soap_malloc(soap, sizeof(struct ds__DigestMethodType)); if (!security->xenc__EncryptedKey->EncryptionMethod->ds__DigestMethod) return soap->error = SOAP_EOM; soap_default_ds__DigestMethodType(soap, security->xenc__EncryptedKey->EncryptionMethod->ds__DigestMethod); security->xenc__EncryptedKey->EncryptionMethod->ds__DigestMethod->Algorithm = (char*)ds_sha1URI; } else { security->xenc__EncryptedKey->EncryptionMethod->Algorithm = (char*)xenc_rsa15URI; } /* KeyInfo */ security->xenc__EncryptedKey->ds__KeyInfo = (_ds__KeyInfo*)soap_malloc(soap, sizeof(_ds__KeyInfo)); if (!security->xenc__EncryptedKey->ds__KeyInfo) return soap->error = SOAP_EOM; soap_default__ds__KeyInfo(soap, security->xenc__EncryptedKey->ds__KeyInfo); /* allocate SecurityTokenReference */ security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference = (_wsse__SecurityTokenReference*)soap_malloc(soap, sizeof(_wsse__SecurityTokenReference)); if (!security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference) return soap->error = SOAP_EOM; soap_default__wsse__SecurityTokenReference(soap, security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference); if (issuer && serial) { security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data = (struct ds__X509DataType*)soap_malloc(soap, sizeof(struct ds__X509DataType)); if (!security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data) return soap->error = SOAP_EOM; soap_default_ds__X509DataType(soap, security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data); security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial = (struct ds__X509IssuerSerialType*)soap_malloc(soap, sizeof(struct ds__X509IssuerSerialType)); if (!security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial) return soap->error = SOAP_EOM; soap_default_ds__X509IssuerSerialType(soap, security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial); security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial->X509IssuerName = soap_strdup(soap, issuer); security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->ds__X509Data->X509IssuerSerial->X509SerialNumber = soap_strdup(soap, serial); } else { /* allocate KeyIdentifier */ security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier = (_wsse__KeyIdentifier*)soap_malloc(soap, sizeof(_wsse__KeyIdentifier)); if (!security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier) return soap->error = SOAP_EOM; soap_default__wsse__KeyIdentifier(soap, security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier); /* populate KeyIdentifier */ security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->EncodingType = (char*)wsse_Base64BinaryURI; if (subjectkeyid) { security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType = (char*)wsse_X509v3SubjectKeyIdentifierURI; security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item = soap_s2base64(soap, (unsigned char*)subjectkeyid, NULL, strlen(subjectkeyid)); } else if (cert) { unsigned char *der, *s; int derlen; security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType = (char*)wsse_X509v3URI; /* determine the storage requirement */ derlen = i2d_X509(cert, NULL); if (derlen < 0) return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Invalid certificate passed to soap_wsse_add_EncryptedKey_encrypt_only"); /* use the gSOAP engine's look-aside buffer to temporarily hold the cert */ if (soap_store_lab(soap, NULL, derlen)) return SOAP_EOM; s = der = (unsigned char*)soap->labbuf; /* store in DER format */ i2d_X509(cert, &s); security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item = soap_s2base64(soap, der, NULL, derlen); } } /* CipherData */ security->xenc__EncryptedKey->CipherData = (xenc__CipherDataType*)soap_malloc(soap, sizeof(struct xenc__CipherDataType)); if (!security->xenc__EncryptedKey->CipherData) return soap->error = SOAP_EOM; soap_default_xenc__CipherDataType(soap, security->xenc__EncryptedKey->CipherData); /* get the public key */ pubk = X509_get_pubkey(cert); if (!pubk) return soap_wsse_fault(soap, wsse__InvalidSecurityToken, "Invalid certificate passed to soap_wsse_add_EncryptedKey_encrypt_only"); /* start encryption engine, get the encrypted secret key */ key = (unsigned char*)soap_malloc(soap, soap_mec_size(alg, pubk)); if (!key) return soap->error = SOAP_EOM; if (data->mec) soap_mec_cleanup(soap, data->mec); else data->mec = (struct soap_mec_data*)SOAP_MALLOC(soap, sizeof(struct soap_mec_data)); if (!data->mec) return soap->error = SOAP_EOM; if (soap_mec_begin(soap, data->mec, alg, pubk, key, &keylen)) { EVP_PKEY_free(pubk); return soap->error; } EVP_PKEY_free(pubk); data->enco_alg = alg; data->enco_keyname = NULL; data->enco_key = key; data->enco_keylen = keylen; security->xenc__EncryptedKey->CipherData->CipherValue = soap_s2base64(soap, key, NULL, keylen); if (!security->xenc__EncryptedKey->CipherData->CipherValue) return soap->error = SOAP_EOM; data->encid = soap_strdup(soap, tags); if (!tags) { soap->omode |= SOAP_SEC_WSUID; if (soap_wsse_add_EncryptedKey_DataReferenceURI(soap, "#SOAP-ENV_Body")) return soap->error; } else { char *s, *t; size_t l = strlen(tags); /* make space to insert # to each id converted from a tag name */ t = (char*)soap_malloc(soap, l + 2); if (!t) return soap->error = SOAP_EOM; *t = '#'; soap_strcpy(t + 1, l + 1, tags); s = soap_wsse_ids(soap, t, '_'); if (!s) return soap->error = SOAP_EOM; s++; for (;;) { t = strchr(s, ' '); if (t) *t = '\0'; *--s = '#'; if (soap_wsse_add_EncryptedKey_DataReferenceURI(soap, s)) return soap->error; if (!t) break; s = t + 1; while (*s == ' ') s++; } if (soap_tagsearch(data->encid, "ds:Signature")) { /* support ds:Signature encryption only with HTTP chunking, otherwise content length is incorrect */ if ((soap->omode & SOAP_IO) == SOAP_IO_BUFFER) soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_CHUNK; } } soap->feltbegout = soap_wsse_element_begin_out; soap->feltendout = soap_wsse_element_end_out; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_verify_EncryptedKey(struct soap *soap) @brief Verifies the EncryptedKey header information (certificate validity requires soap->cafile to be set). Retrieves the decryption key from the token handler callback to decrypt the decryption key. @param soap context @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_EncryptedKey(struct soap *soap) { struct soap_wsse_data *data; int keybase = 1; const char *keytype = NULL; const char *keydata = NULL; const char *keyname = NULL; const char *keyalgo = NULL; const char *keytemp = NULL; data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); if (!data) return soap_set_receiver_error(soap, "soap_wsse_verify_EncryptedKey", "Plugin not registered", SOAP_PLUGIN_ERROR); #if 0 /* deprecated */ _wsse__Security *security = soap_wsse_Security(soap); if (security) { /* SOAP header is complete when parsing the SOAP Body */ if (!security->xenc__EncryptedKey) return SOAP_OK; if (!security->xenc__EncryptedKey->EncryptionMethod || !security->xenc__EncryptedKey->EncryptionMethod->Algorithm) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid Encryption algorithm or key"); if (security->xenc__EncryptedKey->ds__KeyInfo) { if (security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference && security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier && security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType && security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item) { if (security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->EncodingType) keybase = !strcmp(security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->EncodingType, wsse_Base64BinaryURI); keytype = security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->ValueType; keydata = security->xenc__EncryptedKey->ds__KeyInfo->wsse__SecurityTokenReference->KeyIdentifier->__item; } if (security->xenc__EncryptedKey->ds__KeyInfo->KeyName) keyname = security->xenc__EncryptedKey->ds__KeyInfo->KeyName; else if (security->xenc__EncryptedKey->ds__KeyInfo->X509Data && security->xenc__EncryptedKey->ds__KeyInfo->X509Data->X509SubjectName) keyname = security->xenc__EncryptedKey->ds__KeyInfo->X509Data->X509SubjectName; keyalgo = security->xenc__EncryptedKey->EncryptionMethod->Algorithm; } if (security->xenc__EncryptedKey->CipherData && security->xenc__EncryptedKey->CipherData->CipherValue) keytemp = security->xenc__EncryptedKey->CipherData->CipherValue; /* do not process EncryptedKey again */ security->xenc__EncryptedKey = NULL; } else #endif { /* SOAP header is incomplete while parsing the SOAP Header, so get EncryptedKey from DOM */ if (soap->dom) { struct soap_dom_element *ek = soap_dom_find(soap->dom, soap->dom, xenc_URI, "EncryptedKey", 0); DBGFUN("soap_wsse_verify_EncryptedKey"); if (ek) { struct soap_dom_element *ki; struct soap_dom_element *cd; struct soap_dom_element *elt; struct soap_dom_attribute *att; elt = soap_elt_get(ek, xenc_URI, "EncryptionMethod"); if (elt) { att = soap_att_get(elt, NULL, "Algorithm"); if (att) keyalgo = soap_att_get_text(att); } if (!keyalgo) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid Encryption algorithm or key"); ki = soap_elt_get(ek, ds_URI, "KeyInfo"); if (ki) { elt = soap_elt_get(ki, wsse_URI, "SecurityTokenReference"); if (elt) { elt = soap_elt_get(elt, wsse_URI, "KeyIdentifier"); if (elt) { att = soap_att_get(elt, NULL, "EncodingType"); if (att) keybase = !strcmp(soap_att_get_text(att), wsse_Base64BinaryURI); att = soap_att_get(elt, NULL, "ValueType"); keytype = soap_att_get_text(att); keydata = soap_elt_get_text(elt); } } elt = soap_elt_get(ki, ds_URI, "KeyName"); if (elt) { keyname = soap_elt_get_text(elt); } else { elt = soap_elt_get(ki, ds_URI, "X509Data"); if (elt) { keyname = soap_elt_get_text(soap_elt_get(elt, ds_URI, "X509SubjectName")); elt = soap_elt_get(elt, ds_URI, "X509IssuerSerial"); if (elt) { keyname = soap_elt_get_text(soap_elt_get(elt, ds_URI, "X509IssuerName")); if (keyname) { const char *t = soap_elt_get_text(soap_elt_get(elt, ds_URI, "X509SerialNumber")); if (t) { size_t n = strlen(keyname) + strlen(t) + 2; char *s = (char*)soap_malloc(soap, n); (SOAP_SNPRINTF_SAFE(s, n), "%s#%s", keyname, t); keyname = s; } } } } } } cd = soap_elt_get(ek, xenc_URI, "CipherData"); if (cd) { elt = soap_elt_get(cd, xenc_URI, "CipherValue"); keytemp = soap_elt_get_text(elt); } } } } if (keyalgo) { int keylen; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Verify EncryptedKey %s alg=%x\n", keyalgo, data->deco_alg)); if (keydata) { if (!strcmp(keytype, wsse_X509v3URI)) { X509 *cert = NULL; #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) const unsigned char *der; #else unsigned char *der; #endif int derlen; if (keybase) der = (unsigned char*)soap_base642s(soap, keydata, NULL, 0, &derlen); else der = (unsigned char*)soap_hex2s(soap, keydata, NULL, 0, &derlen); if (!der) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid Encryption algorithm or key"); cert = d2i_X509(&cert, &der, derlen); if (soap_wsse_verify_X509(soap, cert)) { if (cert) X509_free(cert); return soap->error; } /* get the private key from subject name of cert, if not set */ if (!data->deco_key && data->security_token_handler) { char buf[1024]; X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)-1); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting private key from cert name '%s' through security_token_handler callback\n", buf)); data->deco_alg = SOAP_MEC_ENV_DEC_DES_CBC; data->deco_key = data->security_token_handler(soap, &data->deco_alg, buf, NULL, 0, &keylen); data->deco_keylen = 0; } if (cert) X509_free(cert); } else if (!data->deco_key && data->security_token_handler && !strcmp(keytype, wsse_X509v3SubjectKeyIdentifierURI)) { const unsigned char *subjectkeyid; int subjectkeyidlen; if (keybase) subjectkeyid = (unsigned char*)soap_base642s(soap, keydata, NULL, 0, &subjectkeyidlen); else subjectkeyid = (unsigned char*)soap_hex2s(soap, keydata, NULL, 0, &subjectkeyidlen); /* get the private key from subject key id */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting private key from key id '%s' through security_token_handler callback\n", subjectkeyid)); data->deco_alg = SOAP_MEC_ENV_DEC_DES_CBC; data->deco_key = data->security_token_handler(soap, &data->deco_alg, NULL, subjectkeyid, subjectkeyidlen, &keylen); data->deco_keylen = 0; } } else if (!data->deco_key && data->security_token_handler && keyname) { /* get the private key from key name or subject name */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting private key from name '%s' through security_token_handler callback\n", keyname)); data->deco_alg = SOAP_MEC_ENV_DEC_DES_CBC; data->deco_key = data->security_token_handler(soap, &data->deco_alg, keyname, NULL, 0, &keylen); data->deco_keylen = 0; } /* start decryption */ if (data->deco_key && keytemp) { int keylen; unsigned char *key = (unsigned char*)soap_base642s(soap, keytemp, NULL, 0, &keylen); if (!strcmp(keyalgo, xenc_rsaesURI)) data->deco_alg |= SOAP_MEC_OAEP; else if (strcmp(keyalgo, xenc_rsa15URI)) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid Encryption algorithm or key"); if (data->mec) soap_mec_cleanup(soap, data->mec); else data->mec = (struct soap_mec_data*)SOAP_MALLOC(soap, sizeof(struct soap_mec_data)); if (!data->mec) return soap->error = SOAP_EOM; if (soap_mec_begin(soap, data->mec, data->deco_alg, (SOAP_MEC_KEY_TYPE*)data->deco_key, key, &keylen)) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Verified EncryptedKey alg=%x\n", data->deco_alg)); } return SOAP_OK; } /******************************************************************************/ /** @fn void soap_wsse_delete_EncryptedKey(struct soap *soap) @brief Deletes EncryptedKey header element. @param soap context */ SOAP_FMAC1 void SOAP_FMAC2 soap_wsse_delete_EncryptedKey(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); DBGFUN("soap_wsse_delete_EncryptedKey"); if (security) security->xenc__EncryptedKey = NULL; } /******************************************************************************/ /** @fn xenc__EncryptedKeyType* soap_wsse_EncryptedKey(struct soap *soap) @brief Returns EncryptedKey header element if present. @param soap context @return xenc__EncryptedKeyType object or NULL */ SOAP_FMAC1 struct xenc__EncryptedKeyType * SOAP_FMAC2 soap_wsse_EncryptedKey(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); if (security) return security->xenc__EncryptedKey; return NULL; } /******************************************************************************\ * * wsse:Security/xenc:EncryptedKey/ReferenceList/DataReference * \******************************************************************************/ /** @fn int soap_wsse_add_EncryptedKey_DataReferenceURI(struct soap *soap, const char *URI) @brief Adds a DataReference URI to the EncryptedKey header element. @param soap context @param[in] URI value of the URI ID @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_EncryptedKey_DataReferenceURI(struct soap *soap, const char *URI) { _wsse__Security *security = soap_wsse_add_Security(soap); _xenc__ReferenceList *ref; int k, n = 0; DBGFUN1("soap_wsse_add_EncryptedKey_DataReferenceURI", "URI=%s", URI?URI:""); if (!security->xenc__EncryptedKey) { security->xenc__EncryptedKey = (xenc__EncryptedKeyType*)soap_malloc(soap, sizeof(xenc__EncryptedKeyType)); if (!security->xenc__EncryptedKey) return soap->error = SOAP_EOM; soap_default_xenc__EncryptedKeyType(soap, security->xenc__EncryptedKey); } if (!security->xenc__EncryptedKey->ReferenceList) { security->xenc__EncryptedKey->ReferenceList = (struct _xenc__ReferenceList*)soap_malloc(soap, sizeof(struct _xenc__ReferenceList)); if (!security->xenc__EncryptedKey->ReferenceList) return soap->error = SOAP_EOM; soap_default__xenc__ReferenceList(soap, security->xenc__EncryptedKey->ReferenceList); } ref = security->xenc__EncryptedKey->ReferenceList; k = ref->__size_ReferenceList++; /* need to increase space? */ if (k < 0) return soap->error = SOAP_EOM; if (k == 0) n = 1; else if (k >= 1 && (k & (k - 1)) == 0) n = 2 * k; /* yes we do */ if (n) { struct __xenc__union_ReferenceList *tmp = (struct __xenc__union_ReferenceList*)soap_malloc(soap, n * sizeof(struct __xenc__union_ReferenceList)); int i; if (!tmp) return soap->error = SOAP_EOM; for (i = 0; i < k; i++) tmp[i] = ref->__union_ReferenceList[i]; security->xenc__EncryptedKey->ReferenceList->__union_ReferenceList = tmp; ref = security->xenc__EncryptedKey->ReferenceList; } /* add entry */ soap_default___xenc__union_ReferenceList(soap, &ref->__union_ReferenceList[k]); ref->__union_ReferenceList[k].DataReference = (struct xenc__ReferenceType*)soap_malloc(soap, sizeof(struct xenc__ReferenceType)); if (!ref->__union_ReferenceList[k].DataReference) return soap->error = SOAP_EOM; soap_default_xenc__ReferenceType(soap, ref->__union_ReferenceList[k].DataReference); ref->__union_ReferenceList[k].DataReference->URI = soap_strdup(soap, URI); return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_add_DataReferenceURI(struct soap *soap, const char *URI) @brief Adds a DataReference URI to the Security header element. @param soap context @param[in] URI value of the URI ID @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_DataReferenceURI(struct soap *soap, const char *URI) { _wsse__Security *security = soap_wsse_add_Security(soap); _xenc__ReferenceList *ref; int k, n = 0; DBGFUN1("soap_wsse_add_DataReferenceURI", "URI=%s", URI?URI:""); /* initial alloc */ if (!security->xenc__ReferenceList) { security->xenc__ReferenceList = (struct _xenc__ReferenceList*)soap_malloc(soap, sizeof(struct _xenc__ReferenceList)); if (!security->xenc__ReferenceList) return soap->error = SOAP_EOM; soap_default__xenc__ReferenceList(soap, security->xenc__ReferenceList); } ref = security->xenc__ReferenceList; k = ref->__size_ReferenceList++; /* need to increase space? */ if (k < 0) return soap->error = SOAP_EOM; if (k == 0) n = 1; else if (k >= 1 && (k & (k - 1)) == 0) n = 2 * k; /* yes we do */ if (n) { struct __xenc__union_ReferenceList *tmp = (struct __xenc__union_ReferenceList*)soap_malloc(soap, n * sizeof(struct __xenc__union_ReferenceList)); int i; if (!tmp) return soap->error = SOAP_EOM; for (i = 0; i < k; i++) tmp[i] = ref->__union_ReferenceList[i]; security->xenc__ReferenceList->__union_ReferenceList = tmp; ref = security->xenc__ReferenceList; } /* add entry */ soap_default___xenc__union_ReferenceList(soap, &ref->__union_ReferenceList[k]); ref->__union_ReferenceList[k].DataReference = (struct xenc__ReferenceType*)soap_malloc(soap, sizeof(struct xenc__ReferenceType)); if (!ref->__union_ReferenceList[k].DataReference) return soap->error = SOAP_EOM; soap_default_xenc__ReferenceType(soap, ref->__union_ReferenceList[k].DataReference); ref->__union_ReferenceList[k].DataReference->URI = soap_strdup(soap, URI); return SOAP_OK; } /******************************************************************************\ * * xenc:EncryptedData/ds:KeyInfo/Keyname * \******************************************************************************/ /** @fn int soap_wsse_add_EncryptedData_KeyInfo_KeyName(struct soap *soap, const char *keyname) @brief Adds EncryptedData/ds:KeyInfo/Keyname elements. @param soap context @param[in] keyname name of the key @return SOAP_OK or error code This function adds the name of the key to each EncryptedData element to identify the shared secret key used for encryption. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_add_EncryptedData_KeyInfo_KeyName(struct soap *soap, const char *keyname) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_add_EncryptedData_KeyInfo_KeyName"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_add_EncryptedData_KeyInfo_KeyName", "Plugin not registered", SOAP_PLUGIN_ERROR); data->enco_keyname = soap_strdup(soap, keyname); return SOAP_OK; } /******************************************************************************\ * * wsse:Security/saml1:Assertion * \******************************************************************************/ #ifdef SOAP_NAMESPACE_OF_saml1 /** @fn saml1__AssertionType *soap_wsse_add_saml1(struct soap *soap, const char *wsuId) @brief Adds SAML 1.0 Assertion to the wsse:Security header block, default initialized with wsu:Id set to enable signing of the assertion. @param soap context @param[in] wsuId string with unique ID value for signing or NULL to omit signing @return pointer to assertion or NULL when failed to allocate */ SOAP_FMAC1 saml1__AssertionType * SOAP_FMAC2 soap_wsse_add_saml1(struct soap *soap, const char *wsuId) { saml1__AssertionType *assertion = NULL; _wsse__Security *security = soap_wsse_add_Security(soap); if (security) { assertion = (saml1__AssertionType*)soap_malloc(soap, sizeof(saml1__AssertionType)); if (assertion) { soap_default_saml1__AssertionType(soap, assertion); assertion->MajorVersion = (char*)"1"; assertion->MinorVersion = (char*)"0"; assertion->wsu__Id = soap_strdup(soap, wsuId); } } return assertion; } /******************************************************************************/ /** @fn int soap_wsse_sign_saml1(struct soap *soap, saml1__Assertion assertion, int alg, const void *key, int keylen, X509 *cert) @brief Signs a SAML 2.0 assertion. @param soap context @param[in] alg is the signature algorithm, such as SOAP_SMD_HMAC_SHA1/224/256/384/512, SOAP_SMD_SIGN_DSA_SHA1/256, SOAP_SMD_SIGN_RSA_SHA1/224/256/384/512, or SOAP_SMD_SIGN_ECDSA_SHA1/224/256/384/512 @param[in] key is the HMAC secret key or DSA/RSA/ECDSA private EVP_PKEY @param[in] keylen is the HMAC key length @param[in] cert points to the X509 certificate */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_sign_saml1(struct soap *soap, saml1__AssertionType *assertion, int alg, const void *key, int keylen, X509 *cert) { _wsse__Security *security = soap_wsse_Security(soap); soap_mode omode = soap->omode; short version = soap->version; int err = SOAP_OK; if (!assertion) return SOAP_OK; soap_set_omode(soap, SOAP_XML_CANONICAL | SOAP_XML_CANONICAL_NA); soap_clr_omode(soap, SOAP_XML_INDENT); soap->version = 0; soap->encodingStyle = NULL; if (!assertion->AssertionID) assertion->AssertionID = soap_strdup(soap, soap_rand_uuid(soap, "_")); assertion->wsu__Id = assertion->AssertionID; if (soap_wsse_sign(soap, alg, key, keylen) || soap_wsse_sign_only(soap, assertion->AssertionID) || soap_begin_count(soap)) { err = soap->error; } else { soap_strcpy(soap->id, sizeof(soap->id), assertion->AssertionID); soap->event = SOAP_SEC_BEGIN; if (soap_out_saml1__AssertionType(soap, "saml1:Assertion", 0, assertion, "") || soap_end_count(soap) || soap_wsse_add_KeyInfo_X509Certificate(soap, cert)) err = soap->error; } assertion->ds__Signature = soap_wsse_Signature(soap); soap_wsse_delete_Security(soap); soap->header->wsse__Security = security; soap->omode = omode; soap->version = version; return err; } /******************************************************************************/ /** @fn saml1__AssertionType *soap_wsse_get_saml1(struct soap *soap) @brief Returns SAML 1.0 Assertion in the wsse:Security header block, if present. @param soap context @return pointer to assertion or NULL */ SOAP_FMAC1 saml1__AssertionType * SOAP_FMAC2 soap_wsse_get_saml1(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); if (security) return security->saml1__Assertion; return NULL; } /******************************************************************************/ /** @fn int soap_wsse_verify_saml1(struct soap *soap, saml1__AssertionType *assertion) @brief Verifies the SAML 1.0 Assertion with its enveloped signature, requires soap->cafile to be set. @param soap context @param assertion SAML 1.0 assertion to verify @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_saml1(struct soap *soap, saml1__AssertionType *assertion) { struct soap_dom_element *elt = soap->dom; soap_mode omode = soap->omode; short version = soap->version; int err = SOAP_OK; _ds__Signature *signature = assertion->ds__Signature; assertion->ds__Signature = NULL; soap_set_omode(soap, SOAP_XML_DOM | SOAP_XML_CANONICAL_NA); soap_clr_omode(soap, SOAP_XML_INDENT); soap->version = 0; soap->encodingStyle = NULL; soap->dom = NULL; if (soap_begin_send(soap) || soap_put_saml1__AssertionType(soap, assertion, "saml1:Assertion", "") || soap_end_send(soap) || soap_wsse_verify_with_signature(soap, signature)) err = soap->error; soap->version = version; soap->omode = omode; soap->dom = elt; assertion->ds__Signature = signature; return err; } #endif /******************************************************************************\ * * wsse:Security/saml2:Assertion * \******************************************************************************/ #ifdef SOAP_NAMESPACE_OF_saml2 /** @fn saml2__AssertionType *soap_wsse_add_saml2(struct soap *soap, const char *wsuId) @brief Adds SAML 2.0 Assertion to the wsse:Security header block, default initialized with wsu:Id set to enable signing of the assertion. @param soap context @param[in] wsuId string with unique ID value for signing or NULL to omit signing @return pointer to assertion or NULL when failed to allocate */ SOAP_FMAC1 saml2__AssertionType * SOAP_FMAC2 soap_wsse_add_saml2(struct soap *soap, const char *wsuId) { saml2__AssertionType *assertion = NULL; _wsse__Security *security = soap_wsse_add_Security(soap); if (security) { assertion = (saml2__AssertionType*)soap_malloc(soap, sizeof(saml2__AssertionType)); if (assertion) { soap_default_saml2__AssertionType(soap, assertion); assertion->Version = (char*)"2.0"; assertion->wsu__Id = soap_strdup(soap, wsuId); } } return assertion; } /******************************************************************************/ /** @fn int soap_wsse_sign_saml2(struct soap *soap, saml2__Assertion assertion, int alg, const void *key, int keylen, X509 *cert) @brief Signs a SAML 2.0 assertion. @param soap context @param[in] alg is the signature algorithm, such as SOAP_SMD_HMAC_SHA1/224/256/384/512, SOAP_SMD_SIGN_DSA_SHA1/256, SOAP_SMD_SIGN_RSA_SHA1/224/256/384/512, or SOAP_SMD_SIGN_ECDSA_SHA1/224/256/384/512 @param[in] key is the HMAC secret key or DSA/RSA/ECDSA private EVP_PKEY @param[in] keylen is the HMAC key length @param[in] cert points to the X509 certificate */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_sign_saml2(struct soap *soap, saml2__AssertionType *assertion, int alg, const void *key, int keylen, X509 *cert) { _wsse__Security *security = soap_wsse_Security(soap); soap_mode omode = soap->omode; short version = soap->version; int err = SOAP_OK; if (!assertion) return SOAP_OK; soap_set_omode(soap, SOAP_XML_CANONICAL | SOAP_XML_CANONICAL_NA); soap_clr_omode(soap, SOAP_XML_INDENT); soap->version = 0; soap->encodingStyle = NULL; if (!assertion->ID) assertion->ID = soap_strdup(soap, soap_rand_uuid(soap, "_")); if (soap_wsse_sign(soap, alg, key, keylen) || soap_wsse_sign_only(soap, assertion->ID) || soap_begin_count(soap)) { err = soap->error; } else { soap_strcpy(soap->id, sizeof(soap->id), assertion->ID); soap->event = SOAP_SEC_BEGIN; if (soap_out_saml2__AssertionType(soap, "saml2:Assertion", 0, assertion, "") || soap_end_count(soap) || soap_wsse_add_KeyInfo_X509Certificate(soap, cert)) err = soap->error; } assertion->ds__Signature = soap_wsse_Signature(soap); soap_wsse_delete_Security(soap); soap->header->wsse__Security = security; soap->omode = omode; soap->version = version; return err; } /******************************************************************************/ /** @fn saml2__AssertionType *soap_wsse_get_saml2(struct soap *soap) @brief Returns SAML 2.0 Assertion in the wsse:Security header block, if present. @param soap context @return pointer to assertion or NULL */ SOAP_FMAC1 saml2__AssertionType * SOAP_FMAC2 soap_wsse_get_saml2(struct soap *soap) { _wsse__Security *security = soap_wsse_Security(soap); if (security) return security->saml2__Assertion; return NULL; } /******************************************************************************/ /** @fn int soap_wsse_verify_saml2(struct soap *soap, saml2__AssertionType *assertion) @brief Verifies the SAML 2.0 Assertion with its enveloped signature, requires soap->cafile to be set. @param soap context @param assertion SAML 2.0 assertion to verify @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_saml2(struct soap *soap, saml2__AssertionType *assertion) { struct soap_dom_element *elt = soap->dom; soap_mode omode = soap->omode; short version = soap->version; int err = SOAP_OK; _ds__Signature *signature = assertion->ds__Signature; assertion->ds__Signature = NULL; soap_set_omode(soap, SOAP_XML_DOM | SOAP_XML_CANONICAL_NA); soap_clr_omode(soap, SOAP_XML_INDENT); soap->version = 0; soap->encodingStyle = NULL; soap->dom = NULL; if (soap_begin_send(soap) || soap_put_saml2__AssertionType(soap, assertion, "saml2:Assertion", "") || soap_end_send(soap) || soap_wsse_verify_with_signature(soap, signature)) err = soap->error; soap->version = version; soap->omode = omode; soap->dom = elt; assertion->ds__Signature = signature; return err; } #endif /******************************************************************************\ * * Faults * \******************************************************************************/ /** @fn int soap_wsse_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) @brief Sets sender SOAP Fault (sub)code for server fault response. @param soap context @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_sender_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) { #if defined(SOAP_WSA_2003) || defined(SOAP_WSA_2004) || defined(SOAP_WSA_200408) || defined(SOAP_WSA_2005) return soap_wsa_sender_fault_subcode(soap, faultsubcode, faultstring, faultdetail); #else return soap_sender_fault_subcode(soap, faultsubcode, faultstring, faultdetail); #endif } /******************************************************************************/ /** @fn int soap_wsse_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) @brief Sets receiver SOAP Fault (sub)code for server fault response. @param soap context @param[in] faultsubcode sub code string @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_receiver_fault_subcode(struct soap *soap, const char *faultsubcode, const char *faultstring, const char *faultdetail) { #if defined(SOAP_WSA_2003) || defined(SOAP_WSA_2004) || defined(SOAP_WSA_200408) || defined(SOAP_WSA_2005) return soap_wsa_receiver_fault_subcode(soap, faultsubcode, faultstring, faultdetail); #else return soap_receiver_fault_subcode(soap, faultsubcode, faultstring, faultdetail); #endif } /******************************************************************************/ /** @fn int soap_wsse_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail) @brief Sets sender SOAP Fault for server fault response. @param soap context @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail) { return soap_wsse_sender_fault_subcode(soap, NULL, faultstring, faultdetail); } /******************************************************************************/ /** @fn int soap_wsse_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail) @brief Sets receiver SOAP Fault for server fault response. @param soap context @param[in] faultstring fault string @param[in] faultdetail detail string @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail) { return soap_wsse_receiver_fault_subcode(soap, NULL, faultstring, faultdetail); } /******************************************************************************/ /** @fn int soap_wsse_fault(struct soap *soap, wsse__FaultcodeEnum fault, const char *detail) @brief Sets SOAP Fault (sub)code for server response. @param soap context @param[in] fault is one of wsse:FaultcodeEnum @param[in] detail string with optional text message @return SOAP_FAULT */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_fault(struct soap *soap, wsse__FaultcodeEnum fault, const char *detail) { const char *code = soap_wsse__FaultcodeEnum2s(soap, fault); DBGFUN2("soap_wsse_fault", "fault=%s", code ? code : "(null)", "detail=%s", detail ? detail : "(null)"); /* remove incorrect or incomplete Security header */ soap_wsse_delete_Security(soap); /* populate the SOAP Fault as per WS-Security spec */ /* detail = NULL; */ /* uncomment when detail text is to be omitted from SOAP Fault messages */ /* use WSA to populate the SOAP Header when WSA is used */ switch (fault) { case wsse__UnsupportedSecurityToken: return soap_wsse_sender_fault_subcode(soap, code, "An unsupported token was provided", detail); case wsse__UnsupportedAlgorithm: return soap_wsse_sender_fault_subcode(soap, code, "An unsupported signature or encryption algorithm was used", detail); case wsse__InvalidSecurity: return soap_wsse_sender_fault_subcode(soap, code, "An error was discovered processing the header", detail); case wsse__InvalidSecurityToken: return soap_wsse_sender_fault_subcode(soap, code, "An invalid security token was provided", detail); case wsse__FailedAuthentication: return soap_wsse_sender_fault_subcode(soap, code, "The security token could not be authenticated or authorized", detail); case wsse__FailedCheck: return soap_wsse_sender_fault_subcode(soap, code, "The signature or decryption was invalid", detail); case wsse__SecurityTokenUnavailable: return soap_wsse_sender_fault_subcode(soap, code, "Referenced security token could not be retrieved", detail); } return SOAP_FAULT; } /******************************************************************************\ * * Digest authentication session management * \******************************************************************************/ /** @fn static int soap_wsse_session_verify(struct soap *soap, const char hash[SOAP_SMD_SHA1_SIZE], const char *created, const char *nonce) @brief Verifies and updates the digest, nonce, and creation time against the digest authentication session database to prevent replay attacks. @param soap context @param[in] hash binary digest value of PasswordDigest @param[in] created string @param[in] nonce string (base64) @return SOAP_OK or SOAP_FAULT */ static int soap_wsse_session_verify(struct soap *soap, const char hash[SOAP_SMD_SHA1_SIZE], const char *created, const char *nonce) { struct soap_wsse_session *session; time_t expired, now = time(NULL); DBGFUN("soap_wsse_session_verify"); soap_s2dateTime(soap, created, &expired); /* creation time in the future? */ if (expired > now + SOAP_WSSE_CLKSKEW) return soap_wsse_fault(soap, wsse__FailedAuthentication, "Authorization request in future"); expired += SOAP_WSSE_NONCETIME; /* expired? */ if (expired <= now) return soap_wsse_fault(soap, wsse__FailedAuthentication, "Authentication expired"); /* purge expired messages, but don't do this all the time to improve efficiency */ if (now % 10 == 0) soap_wsse_session_cleanup(soap); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Verifying session nonce=%s\n", nonce)); /* enter mutex to check and update session */ MUTEX_LOCK(soap_wsse_session_lock); for (session = soap_wsse_session; session; session = session->next) { if (!memcmp(session->hash, hash, SOAP_SMD_SHA1_SIZE) && !strcmp(session->nonce, nonce)) break; } /* if not found, allocate new session data */ if (!session) { size_t l = strlen(nonce); session = (struct soap_wsse_session*)malloc(sizeof(struct soap_wsse_session) + l); if (session) { session->next = soap_wsse_session; session->expired = expired; (void)soap_memcpy((void*)session->hash, sizeof(session->hash), (const void*)hash, SOAP_SMD_SHA1_SIZE); soap_strcpy(session->nonce, l + 1, nonce); soap_wsse_session = session; } session = NULL; } /* exit mutex */ MUTEX_UNLOCK(soap_wsse_session_lock); /* if replay attack, return non-descript failure */ if (session) return soap_wsse_fault(soap, wsse__FailedAuthentication, NULL); return SOAP_OK; } /******************************************************************************/ /** @fn static void soap_wsse_session_cleanup(struct soap *soap) @brief Removes expired authentication data from the digest authentication session database. @param soap context */ static void soap_wsse_session_cleanup(struct soap *soap) { struct soap_wsse_session **session; time_t now = time(NULL); DBGFUN("soap_wsse_session_cleanup"); /* enter mutex to purge expired session data */ MUTEX_LOCK(soap_wsse_session_lock); session = &soap_wsse_session; while (*session) { if ((*session)->expired < now) { struct soap_wsse_session *p = *session; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deleting session nonce=%s\n", p->nonce)); *session = p->next; free(p); } else session = &(*session)->next; } /* exit mutex */ MUTEX_UNLOCK(soap_wsse_session_lock); } /******************************************************************************\ * * Calculate SHA1(created, nonce, password) digest * \******************************************************************************/ /** @fn static void calc_digest(struct soap *soap, const char *created, const char *nonce, int noncelen, const char *password, char hash[SOAP_SMD_SHA1_SIZE]) @brief Calculates digest value SHA1(created, nonce, password). @param soap context @param[in] created string (XSD dateTime format) @param[in] nonce value @param[in] noncelen length of nonce value @param[in] password string @param[out] hash SHA1 digest */ static void calc_digest(struct soap *soap, const char *created, const char *nonce, int noncelen, const char *password, char hash[SOAP_SMD_SHA1_SIZE]) { struct soap_smd_data context; /* use smdevp engine */ soap_smd_init(soap, &context, SOAP_SMD_DGST_SHA1, NULL, 0); soap_smd_update(soap, &context, nonce, noncelen); soap_smd_update(soap, &context, created, strlen(created)); soap_smd_update(soap, &context, password, strlen(password)); soap_smd_final(soap, &context, hash, NULL); } /******************************************************************************\ * * Calculate randomized hex nonce * \******************************************************************************/ /** @fn static void soap_wsse_rand_nonce(char *nonce, size_t noncelen) @brief Calculates randomized nonce. @param[out] nonce value [0..noncelen-1] @param[in] noncelen length of nonce must be multiple of 4 */ SOAP_FMAC1 void SOAP_FMAC2 soap_wsse_rand_nonce(char *nonce, size_t noncelen) { size_t i; soap_int32 r = (soap_int32)time(NULL); (void)soap_memcpy((void*)nonce, 4, (const void*)&r, 4); for (i = 4; i < noncelen; i += 4) { r = soap_random; (void)soap_memcpy((void*)(nonce + i), 4, (const void*)&r, 4); } } /******************************************************************************\ * * WS-SecureConversation P_MD5, P_SHA1 and P_SHA256 * \******************************************************************************/ /** @fn int soap_pmd5(struct soap *soap, const char *hmac_key, size_t hmac_key_len, char *secret, size_t secretlen, char *pmd5, size_t pmd5len) @brief Computes PMD5(hmac_key[0..hmac_key_len-1], secret[0..secretlen-1], pmd5[0..pmd5len-1]). @param soap context @param[in] hmac_key HMAC key (client secret) 16 raw bytes @param[in] secret seed (server secret) raw bytes @param[in] secretlen number of bytes @param[out] pmd5 points to pmd5 raw bytes to fill with result @param[in] pmd5len number of bytes to fill pmd5 @return SOAP_OK or SOAP_EOM To compute PMD5 with base64 input and output a base64 encoded pmd5[0..pmd5len-1]: @code int pmd5len = 32; // or greater int n, m; const char *client_secret = soap_base642s(soap, client_secret_base64, NULL, 0, &n); const char *server_secret = soap_base642s(soap, server_secret_base64, NULL, 0, &m); char pmd5[pmd5len]; char *pmd5_base64; if (soap_pmd5(soap, client_secret, n, server_secret, m, pmd5, pmd5len)) .. error // insufficient memory pmd5_base64 = soap_s2base64(soap, (unsigned char*)pmd5, NULL, pmd5len); @endcode */ SOAP_FMAC1 int SOAP_FMAC2 soap_pmd5(struct soap *soap, const char *hmac_key, size_t hmac_key_len, const char *secret, size_t secretlen, char *pmd5, size_t pmd5len) { char HA[SOAP_SMD_MD5_SIZE]; char temp[SOAP_SMD_MD5_SIZE]; return soap_p_hash(soap, hmac_key, hmac_key_len, secret, secretlen, SOAP_SMD_HMAC_MD5, HA, SOAP_SMD_MD5_SIZE, temp, pmd5, pmd5len); } /** @fn int soap_psha1(struct soap *soap, const char *hmac_key, size_t hmac_key_len, char *secret, size_t secretlen, char *psha1, size_t psha1len) @brief Computes PSHA1(hmac_key[0..hmac_key_len-1], secret[0..secretlen-1], psha1[0..psha1len-1]). @param soap context @param[in] hmac_key HMAC key (client secret) raw bytes @param[in] hmac_key_len HMAC key length @param[in] secret seed (server secret) raw bytes @param[in] secretlen number of bytes @param[out] psha1 points to psha1 raw bytes to fill with result @param[in] psha1len number of bytes to fill psha1 @return SOAP_OK or SOAP_EOM To compute PSHA1 with base64 input and output a base64 encoded psha1[0..psha1len-1]: @code int psha1len = 32; // or greater int n, m; const char *client_secret = soap_base642s(soap, client_secret_base64, NULL, 0, &n); const char *server_secret = soap_base642s(soap, server_secret_base64, NULL, 0, &m); char psha1[psha1len]; char *psha1_base64; if (soap_psha1(soap, client_secret, n, server_secret, m, psha1, psha1len)) .. error // insufficient memory psha1_base64 = soap_s2base64(soap, (unsigned char*)psha1, NULL, psha1len); @endcode */ SOAP_FMAC1 int SOAP_FMAC2 soap_psha1(struct soap *soap, const char *hmac_key, size_t hmac_key_len, const char *secret, size_t secretlen, char *psha1, size_t psha1len) { char HA[SOAP_SMD_SHA1_SIZE]; char temp[SOAP_SMD_SHA1_SIZE]; return soap_p_hash(soap, hmac_key, hmac_key_len, secret, secretlen, SOAP_SMD_HMAC_SHA1, HA, SOAP_SMD_SHA1_SIZE, temp, psha1, psha1len); } /** @fn int soap_psha256(struct soap *soap, const char *hmac_key, size_t hmac_key_len, char *secret, size_t secretlen, char *psha256, size_t psha256len) @brief Computes PSHA256(hmac_key[0..hmac_key_len-1], secret[0..secretlen-1], psha256[0..psha256len-1]). @param soap context @param[in] hmac_key HMAC key (client secret) raw bytes @param[in] hmac_key_len HMAC key length @param[in] secret seed (server secret) raw bytes @param[in] secretlen number of bytes @param[out] psha256 points to psha256 raw bytes to fill with result @param[in] psha256len number of bytes to fill psha256 @return SOAP_OK or SOAP_EOM To compute PSHA256 with base64 input and output a base64 encoded psha256[0..psha256len-1]: @code int psha256len = 32; // or greater int n, m; const char *client_secret = soap_base642s(soap, client_secret_base64, NULL, 0, &n); const char *server_secret = soap_base642s(soap, server_secret_base64, NULL, 0, &m); char psha256[psha256len]; char *psha256_base64; if (soap_psha256(soap, client_secret, n, server_secret, m, psha256, psha256len)) .. error // insufficient memory psha256_base64 = soap_s2base64(soap, (unsigned char*)psha256, NULL, psha256len); @endcode */ SOAP_FMAC1 int SOAP_FMAC2 soap_psha256(struct soap *soap, const char *hmac_key, size_t hmac_key_len, const char *secret, size_t secretlen, char *psha256, size_t psha256len) { char HA[SOAP_SMD_SHA256_SIZE]; char temp[SOAP_SMD_SHA256_SIZE]; return soap_p_hash(soap, hmac_key, hmac_key_len, secret, secretlen, SOAP_SMD_HMAC_SHA256, HA, SOAP_SMD_SHA256_SIZE, temp, psha256, psha256len); } /** @fn static int soap_p_hash(struct soap *soap, const char *hmac_key, size_t hmac_key_len, const char *secret, size_t secretlen, int alg, char HA[], size_t HA_len, char temp[], char *phash, size_t phashlen) @brief Computes PSHA256(hmac_key[0..hmac_key_len-1], secret[0..secretlen-1], psha256[0..psha256len-1]). @param soap context @param[in] hmac_key HMAC key (client secret) raw bytes @param[in] hmac_key_len HMAC key length @param[in] secret seed (server secret) raw bytes @param[in] secretlen number of bytes @param[in] alg hash algorithm @param HA buffer to contain hash (internally used) @param HA_len buffer length to contain hash (internally used) @param temp buffer to contain hash (internally used) @param[out] psha256 points to psha256 raw bytes to fill with result @param[in] psha256len number of bytes to fill psha256 @return SOAP_OK or SOAP_EOM */ static int soap_p_hash(struct soap *soap, const char *hmac_key, size_t hmac_key_len, const char *secret, size_t secretlen, int alg, char HA[], size_t HA_len, char temp[], char *phash, size_t phashlen) { char *buffer; size_t i; buffer = (char*)SOAP_MALLOC(soap, HA_len + secretlen); if (!buffer) return soap->error = SOAP_EOM; i = 0; while (i < phashlen) { struct soap_smd_data context; size_t j; soap_smd_init(soap, &context, alg, (void*)hmac_key, hmac_key_len); if (i == 0) soap_smd_update(soap, &context, secret, secretlen); else soap_smd_update(soap, &context, HA, HA_len); soap_smd_final(soap, &context, HA, NULL); (void)soap_memcpy((void*)buffer, HA_len + secretlen, (void*)HA, HA_len); (void)soap_memcpy((void*)(buffer + HA_len), secretlen, (void*)secret, secretlen); soap_smd_init(soap, &context, alg, (void*)hmac_key, hmac_key_len); soap_smd_update(soap, &context, buffer, HA_len + secretlen); soap_smd_final(soap, &context, temp, NULL); j = 0; while (j < HA_len && i < phashlen) phash[i++] = temp[j++]; } SOAP_FREE(soap, buffer); return SOAP_OK; } /******************************************************************************\ * * Plugin registry functions * \******************************************************************************/ /** @fn int soap_wsse(struct soap *soap, struct soap_plugin *p, void *arg) @brief Plugin registry function, used with soap_register_plugin. @param soap context @param[in,out] p plugin created in registry @param[in] arg passed from soap_register_plugin_arg is an optional security token handler callback @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse(struct soap *soap, struct soap_plugin *p, void *arg) { DBGFUN("soap_wsse"); p->id = soap_wsse_id; p->data = (void*)SOAP_MALLOC(soap, sizeof(struct soap_wsse_data)); p->fcopy = soap_wsse_copy; p->fdelete = soap_wsse_delete; if (!p->data) return SOAP_EOM; if (soap_wsse_init(soap, (struct soap_wsse_data*)p->data, (const void *(*)(struct soap*, int*, const char*, const unsigned char*, int, int*))arg)) { SOAP_FREE(soap, p->data); return SOAP_EOM; } return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_init(struct soap *soap, struct soap_wsse_data *data, const void *(*arg)(struct soap*, int*, const char*, const unsigned char *keyid, int keyidlen, int*)) @brief Initializes plugin data. @param soap context @param[in,out] data plugin data @param arg security token handler callback @return SOAP_OK */ static int soap_wsse_init(struct soap *soap, struct soap_wsse_data *data, const void *(*arg)(struct soap*, int *alg, const char *keyname, const unsigned char *keyid, int keyidlen, int *keylen)) { DBGFUN("soap_wsse_init"); if (!data) return soap->error = SOAP_EOM; data->sigid = NULL; data->encid = NULL; data->prefixlist = NULL; data->sign_alg = SOAP_SMD_NONE; data->sign_key = NULL; data->sign_keylen = 0; data->vrfy_alg = SOAP_SMD_NONE; data->vrfy_key = NULL; data->vrfy_keylen = 0; data->enco_alg = SOAP_MEC_NONE; data->enco_keyname = NULL; data->enco_key = NULL; data->enco_keylen = 0; data->deco_alg = SOAP_MEC_NONE; data->deco_key = NULL; data->deco_keylen = 0; data->digest = NULL; data->fpreparesend = NULL; data->fpreparefinalsend = NULL; data->fpreparefinalrecv = NULL; data->mec = NULL; data->store = NULL; data->security_token_handler = arg; soap->feltbegin = soap_wsse_element_begin_in; soap->feltendin = soap_wsse_element_end_in; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) @brief Copies plugin data to localize plugin data for threads. @param soap context @param[out] dst target plugin @param[in] src source plugin @return SOAP_OK */ static int soap_wsse_copy(struct soap *soap, struct soap_plugin *dst, struct soap_plugin *src) { DBGFUN("soap_wsse_copy"); *dst = *src; dst->data = (void*)SOAP_MALLOC(soap, sizeof(struct soap_wsse_data)); return soap_wsse_init(soap, (struct soap_wsse_data*)dst->data, ((struct soap_wsse_data*)src->data)->security_token_handler); } /******************************************************************************/ /** @fn void soap_wsse_delete(struct soap *soap, struct soap_plugin *p) @brief Deletes plugin data. @param soap context @param[in,out] p plugin @return SOAP_OK */ static void soap_wsse_delete(struct soap *soap, struct soap_plugin *p) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); (void)p; DBGFUN("soap_wsse_delete"); if (data) { if (data->prefixlist) SOAP_FREE(soap, data->prefixlist); soap_wsse_preparecleanup(soap, data); if (data->mec) { soap_mec_cleanup(soap, data->mec); SOAP_FREE(soap, data->mec); data->mec = NULL; } if (data->store) { X509_STORE_free(data->store); data->store = NULL; } SOAP_FREE(soap, data); } } /******************************************************************************\ * * Plugin-specific functions * \******************************************************************************/ /** @fn soap_wsse_set_security_token_handler(struct soap *soap, const void *(*callback)(struct soap*, int *alg, const char *keyname, const unsigned char *keyid, int keyidlen, int *keylen)) @brief Sets the security token handler callback that is optionaly used to retrieve keys for signature verification and decryption. @param soap context @param[in] callback function pointer @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_set_security_token_handler(struct soap *soap, const void *(*callback)(struct soap*, int *alg, const char *keyname, const unsigned char *keyid, int keyidlen, int *keylen)) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_set_security_token_handler"); if (data) data->security_token_handler = callback; return SOAP_OK; } /** @fn int soap_wsse_set_wsu_id(struct soap *soap, const char *tags) @brief Sets the elements that are to be extended with wsu:Id attributes. The wsu:Id attribute values are set to the string value of the tag's QName by replacing colons with hyphens to produce an xsd:ID value. @param soap context @param[in] tags string of space-separated qualified and unqualified element tag names @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_set_wsu_id(struct soap *soap, const char *tags) { DBGFUN1("soap_wsse_set_wsu_id", "tags=%s", tags?tags:"(null)"); soap->wsuid = soap_strdup(soap, tags); return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_set_InclusiveNamespaces(struct soap *soap, const char *prefixlist) @brief Sets the C14N InclusiveNamespaces Prefix List property. @param soap context @param[in] prefixlist string of space-separated namespace prefixes, or NULL to remove @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_set_InclusiveNamespaces(struct soap *soap, const char *prefixlist) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN1("soap_wsse_set_InclusiveNamespaces", "prefixlist=%s", prefixlist?prefixlist:"(null)"); if (data) { char *s = NULL; if (data->prefixlist) SOAP_FREE(soap, data->prefixlist); if (prefixlist) { size_t l = strlen(prefixlist); if (l + 1 < l || (SOAP_MAXALLOCSIZE > 0 && l > SOAP_MAXALLOCSIZE)) return soap->error = SOAP_EOM; s = (char*)SOAP_MALLOC(soap, l + 1); if (!s) return soap->error = SOAP_EOM; soap_strcpy(s, l + 1, prefixlist); } data->prefixlist = s; } return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_sign_only(struct soap *soap, const char *tags) @brief Filters only the specified wsu:Id names for signing. Can be used with soap_wsse_set_wsu_id() and if so should use the element tag names. @param soap context @param[in] tags string of space-separated qualified and unqualified tag names @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_sign_only(struct soap *soap, const char *tags) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN1("soap_wsse_sign_only", "tags=%s", tags?tags:"(null)"); if (data) data->sigid = soap_wsse_ids(soap, tags, '-'); return SOAP_OK; } /******************************************************************************/ /** @fn static char* soap_wsse_ids(struct soap *soap, const char *tags, int sub) @brief converts tag name(s) to id name(s). @param soap context @param[in] tags string of space-separated (un)qualified tag names @param[in] sub replacement character for ':' @return string of ids */ static char * soap_wsse_ids(struct soap *soap, const char *tags, int sub) { char *s, *t; s = t = soap_strdup(soap, tags); while (s && *s) { if (*s == ':') *s = sub; s++; } return t; } /******************************************************************************/ /** @fn int soap_wsse_sign(struct soap *soap, int alg, const void *key, int keylen) @brief Uses the wsse plugin to sign all wsu:Id attributed elements. @param soap context @param[in] alg is the signature algorithm, such as SOAP_SMD_HMAC_SHA1/224/256/384/512, SOAP_SMD_SIGN_DSA_SHA1/256, SOAP_SMD_SIGN_RSA_SHA1/224/256/384/512, or SOAP_SMD_SIGN_ECDSA_SHA1/224/256/384/512 @param[in] key is the HMAC secret key or DSA/RSA/ECDSA private EVP_PKEY @param[in] keylen is the HMAC key length @return SOAP_OK or fault This function does not actually sign the message, but initiates the plugin's signature algorithm to sign the message upon message transfer. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_sign(struct soap *soap, int alg, const void *key, int keylen) { struct soap_wsse_digest *digest, *next; struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN1("soap_wsse_sign", "alg=%x", alg); if (!data) return soap_set_receiver_error(soap, "soap_wsse_sign", "Plugin not registered", SOAP_PLUGIN_ERROR); if (!alg || !key) return soap_wsse_fault(soap, wsse__InvalidSecurity, "Invalid signature algorithm or key"); soap_wsse_add_Security(soap); /* store alg and key in plugin data */ data->sign_alg = alg; data->sign_key = key; data->sign_keylen = keylen; /* save and set the plugin's callbacks to preprocess outbound messages */ if (soap->fpreparesend != soap_wsse_preparesend) { data->fpreparesend = soap->fpreparesend; soap->fpreparesend = soap_wsse_preparesend; } if (soap->fpreparefinalsend != soap_wsse_preparefinalsend) { data->fpreparefinalsend = soap->fpreparefinalsend; soap->fpreparefinalsend = soap_wsse_preparefinalsend; } /* support HTTP compression only with HTTP chunking to allow signing XML */ if ((soap->omode & SOAP_ENC_ZLIB)) soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_CHUNK; else if ((soap->omode & SOAP_IO) == SOAP_IO_STORE) /* no store buffering (or else fpreparesend not working) */ soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_BUFFER; soap->omode &= ~SOAP_XML_DOM; /* cleanup the digest data */ for (digest = data->digest; digest; digest = next) { next = digest->next; SOAP_FREE(soap, digest); } data->digest = NULL; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_sign_body(struct soap *soap, int alg, const void *key, int keylen) @brief Uses the wsse plugin to sign all wsu:Id attributed elements, including the SOAP Body (by adding a wsu:Id="Body" attribute). @param soap context @param[in] alg is the signature algorithm, such as SOAP_SMD_HMAC_SHA1/224/256/384/512, SOAP_SMD_SIGN_DSA_SHA1/256, SOAP_SMD_SIGN_RSA_SHA1/224/256/384/512, or SOAP_SMD_SIGN_ECDSA_SHA1/224/256/384/512 @param[in] key is the HMAC secret key or DSA/RSA/ECDSA private EVP_PKEY @param[in] keylen is the HMAC key length @return SOAP_OK or fault This function does not actually sign the message, but initiates the plugin's signature algorithm to sign the message upon message transfer. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_sign_body(struct soap *soap, int alg, const void *key, int keylen) { DBGFUN1("soap_wsse_sign_body", "alg=%x", alg); soap_wsse_sign_only(soap, NULL); soap->omode |= SOAP_SEC_WSUID; return soap_wsse_sign(soap, alg, key, keylen); } /******************************************************************************/ /** @fn int soap_wsse_verify_init(struct soap *soap) @brief Uses the wsse plugin to initiate the verification of the signature and SignedInfo Reference digests. @param soap context @return SOAP_OK This function does not actually verify the message, but initiates the plugin's data to store the message in a DOM to verify the signature. The signature and digests in the DOM must be verified manually. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_init(struct soap *soap) { DBGFUN("soap_wsse_verify_init"); /* deserialize inbound message to DOM */ soap->imode |= SOAP_XML_DOM; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_verify_auto(struct soap *soap, int alg, const void *key, size_t keylen) @brief Uses the wsse plugin to initiate the automatic verification of the signature and SignedInfo Reference digests. @param soap context @param[in] alg to verify signature if signature has no secret or public key, use SOAP_SMD_NONE to omit @param[in] key is HMAC key or a DSA/RSA/ECDSA EVP_PKEY or NULL @param[in] keylen is HMAC key length or 0 @return SOAP_OK This function does not actually verify the message, but initiates the plugin's algorithm to store the message in a DOM to automatically verify the signature and digests. If the message does not contain a key to verify the signature, the alg, key, and keylen parameters are used. It is important that the X509 certificate used to verify the signature, which requires soap->cafile and/or soap->capath to be set. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_auto(struct soap *soap, int alg, const void *key, size_t keylen) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_verify_auto"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_verify_auto", "Plugin not registered", SOAP_PLUGIN_ERROR); data->vrfy_alg = alg; data->vrfy_key = key; data->vrfy_keylen = keylen; if (soap->fpreparefinalrecv != soap_wsse_preparefinalrecv) { data->fpreparefinalrecv = soap->fpreparefinalrecv; soap->fpreparefinalrecv = soap_wsse_preparefinalrecv; } return soap_wsse_verify_init(soap); } /******************************************************************************/ /** @fn int soap_wsse_verify_done(struct soap *soap) @brief Terminates the automatic verification of signatures. @param soap context @return SOAP_OK */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_done(struct soap *soap) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_verify_done"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_verify_done", "Plugin not registered", SOAP_PLUGIN_ERROR); soap->imode &= ~SOAP_XML_DOM; soap->omode &= ~SOAP_SEC_WSUID; if (soap->fpreparefinalrecv == soap_wsse_preparefinalrecv) soap->fpreparefinalrecv = data->fpreparefinalrecv; return SOAP_OK; } /******************************************************************************/ /** @fn size_t soap_wsse_verify_element(struct soap *soap, const char *URI, const char *tag) @brief Post-checks the presence of signed element(s), returns the number of matching elements signed or zero when none found or if one or more matching elements are not signed. Does not verify the signature of these elements, which is done with @ref soap_wsse_verify_auto. @param soap context @param URI namespace of element(s) @param tag name of element(s) @return number of matching elements that are signed or 0 if no matching elements found or if one or more non-signed matching elements were found (0 is returned to prevent signature wrapping attacks). This function does not actually verify the signature of each element, but checks whether the elements are signed and thus their integrity is preserved. Signed element nesting rules are obeyed, so if the matching element is a descendent of a signed element, it is signed as well. Thus, the verification process follows nesting rules. Client should call this function after invocation. Services should call this function inside a service operation. This function traverses the entire DOM, so performance is determined by the size of a message. To check the SOAP Body (either using SOAP 1.1 or 1.2), @ref soap_wsse_verify_element(soap, namespaces[0].ns, "Body"). To check whether the Timestamp was signed (assuming it is present and message expiration checked with @ref soap_wsse_verify_Timestamp), use @ref soap_wsse_verify_element(soap, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "Timestamp"). @note For future releases, XPath queries (or forms of these) will be considered. */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_wsse_verify_element(struct soap *soap, const char *URI, const char *tag) { ds__SignedInfoType *signedInfo = soap_wsse_SignedInfo(soap); size_t count = 0; DBGFUN("soap_wsse_verify_element"); if (signedInfo && soap->dom) { struct soap_dom_element *elt; /* traverse the DOM */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SignedInfo and DOM found\n")); elt = soap->dom; while (elt) { /* find wsu:Id or ds:Id and check for Id in signedInfo */ int ok = 0; struct soap_dom_attribute *att; for (att = elt->atts; att; att = att->next) { if (att->name && att->nstr && (!strcmp(att->nstr, wsu_URI) || !strcmp(att->nstr, ds_URI)) && (!strcmp(att->name, "Id") || !soap_tag_cmp(att->name, "*:Id"))) { /* Id attribute found, search Id value in ds:Reference/@URI */ int i; for (i = 0; i < signedInfo->__sizeReference; i++) { ds__ReferenceType *reference = signedInfo->Reference[i]; if (reference->URI && *reference->URI == '#' && !strcmp(reference->URI + 1, att->text)) { ok = 1; break; } } if (ok) break; } } /* the current element is signed, count this and the matching nested */ if (ok) { count += soap_wsse_verify_nested(soap, elt, URI, tag); /* go to next sibling or back up */ if (elt->next) elt = elt->next; else { do elt = elt->prnt; while (elt && !elt->next); if (elt) elt = elt->next; } } else if (elt->name && ((!elt->nstr && !URI) || (elt->nstr && URI && !strcmp(elt->nstr, URI)))) { const char *s = strchr(elt->name, ':'); if (s) s++; else s = elt->name; /* found an unsigned matching element */ if (!strcmp(s, tag)) return 0; elt = soap_dom_next_element(elt, NULL); } else { elt = soap_dom_next_element(elt, NULL); } } } return count; } /******************************************************************************/ /** @fn size_t soap_wsse_verify_nested(struct soap *soap, struct soap_dom_element *dom, const char *URI, const char *tag) @brief Counts signed matching elements from the dom node and down. @param soap context @param dom node to check and down @param URI namespace of element(s) @param tag name of element(s) @return number of matching elements. */ static size_t soap_wsse_verify_nested(struct soap *soap, struct soap_dom_element *dom, const char *URI, const char *tag) { size_t count = 0; /* search the DOM node and descendants for matching elements */ struct soap_dom_element *elt = dom; for (elt = dom; elt && elt != dom->next && elt != dom->prnt; elt = soap_dom_next_element(elt, NULL)) { if (elt->name && ((!elt->nstr && !URI) || (elt->nstr && URI && !strcmp(elt->nstr, URI)))) { const char *s = strchr(elt->name, ':'); if (s) s++; else s = elt->name; /* found element? */ if (!strcmp(s, tag)) count++; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element '%s' (\"%s\":%s) is signed\n", elt->name, elt->nstr, elt->name)); } return count; } /******************************************************************************/ /** @fn int soap_wsse_verify_body(struct soap *soap) @brief Post-checks the presence of signed SOAP Body. Does not verify the signature of the Body, which is done with @ref soap_wsse_verify_auto. @param soap context @return SOAP_OK (signed) or SOAP_FAULT This function does not actually verify the signature of the Body. It checks whether the Body is signed and thus its integrity is preserved. Clients should call this function after invocation. Services should call this function inside a service operation. This function traverses the entire DOM, so performance is determined by the size of a message. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_body(struct soap *soap) { const char *ns = NULL; /* Are we using SOAP 1.1 or 1.2? Check first row of namespace table */ if (soap->local_namespaces) { if (soap->local_namespaces->out) ns = soap->local_namespaces->out; else if (soap->local_namespaces->ns) ns = soap->local_namespaces->ns; } /* If we don't know if we're using SOAP 1.1 or 1.2, then assume it is 1.2 */ if (!ns) ns = "http://www.w3.org/2003/05/soap-envelope"; if (soap_wsse_verify_element(soap, ns, "Body") == 1) return SOAP_OK; return soap_wsse_sender_fault(soap, "Message body not signed", NULL); } /******************************************************************************/ /** @fn int soap_wsse_verify_with_signature(struct soap *soap, const ds__Signature *signature) @brief Verifies XML in DOM of a message that was parsed, using the provided signature, assuming dsig non-WS-Security usage scenarios, requires DOM of the XML message which is created automatically with WS-Security enabled. @param soap context @param signature points to signature structure @return SOAP_OK (signed and verified) or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_verify_with_signature(struct soap *soap, _ds__Signature *signature) { _wsse__Security *new_security, *security; int err; if (!signature) return soap_wsse_fault(soap, wsse__FailedCheck, "Signature required"); if (!soap->dom) return soap_wsse_fault(soap, wsse__FailedCheck, "XML DOM of signed message required"); /* save wsse:Security/ds:Signature when present */ security = soap_wsse_Security(soap); /* set the header wsse:Security/ds:Signature to be used internally */ soap_header(soap); soap->header->wsse__Security = NULL; new_security = soap_wsse_add_Security(soap); if (!new_security) return soap->error = SOAP_EOM; new_security->ds__Signature = signature; err = soap_wsse_verify_Signature(soap); /* restore wsse:Security/ds:Signature when present */ soap->header->wsse__Security = security; return err; } /******************************************************************************/ /** @fn int soap_wsse_encrypt_body(struct soap *soap, int alg, const void *key, int keylen) @brief Initiates the encryption of the SOAP Body. The algorithm should be SOAP_MEC_ENC_DES_CBC etc. for symmetric encryption. Use soap_wsse_add_EncryptedKey for public key encryption. @param soap context @param[in] alg the encryption algorithm, should be SOAP_MEC_ENC_DES_CBC etc. @param[in] key a certificate with public key for encryption, a DES CBC 160-bit key or AES key @param[in] keylen the symmetric encryption key length, 20 bytes for a DES CBC 160-bit key or larger for AES key @return SOAP_OK or error code This function initiates the encryption of the SOAP Body using an RSA public key or a symmetric shared secret key. No WS-Security EncryptedKey header will be set. Use soap_wsse_add_EncryptedKey instead for public key encryption. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_encrypt_body(struct soap *soap, int alg, const void *key, int keylen) { struct soap_wsse_data *data; DBGFUN1("soap_wsse_encrypt_body", "alg=%x", alg); data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); if (!data) return soap_set_receiver_error(soap, "soap_wsse_encrypt_body", "Plugin not registered", SOAP_PLUGIN_ERROR); data->encid = NULL; soap->omode |= SOAP_SEC_WSUID; soap_wsse_add_DataReferenceURI(soap, "#SOAP-ENV_Body"); return soap_wsse_encrypt(soap, alg, key, keylen); } /******************************************************************************/ /** @fn int soap_wsse_encrypt_only(struct soap *soap, int alg, const void *key, int keylen, const char *tags) @brief Initiates the encryption of XML elements specified in the tags string. Should be used in combination with soap_wsse_set_wsu_id to set wsu:Id for given XML element tags. The algorithm should be SOAP_MEC_ENC_DES_CBC etc. for symmetric encryption. Use soap_wsse_add_EncryptedKey_encrypt_only for public key encryption. @param soap context @param[in] alg the encryption algorithm, should be SOAP_MEC_ENC_DES_CBC etc. @param[in] key a certificate with public key for encryption, a DES CBC 160-bit key or AES key @param[in] keylen the symmetric encryption key length, 20 bytes for a DES CBC 160-bit key @param[in] tags string of space-separated qualified and unqualified tag names @return SOAP_OK or error code This function initiates the encryption using an RSA public key or a symmetric shared secret key. No WS-Security EncryptedKey header will be set. Use soap_wsse_add_EncryptedKey instead for public key encryption. @warning Use @ref soap_wsse_add_EncryptedKey_encrypt_only only in combination with @ref soap_wsse_set_wsu_id with the tag names of the elements to be encrypted. OTHERWISE THE GIVEN XML ELEMENTS ARE NOT ENCRYPTED AND WILL BE SENT IN THE CLEAR. @warning The elements identified with @ref soap_wsse_set_wsu_id to encrypt MUST occur EXACTLY ONCE in the SOAP Body. @warning Encryption/decryption of elements with simple content (CDATA content) IS NOT SUPPORTED. This means that elements you want to encrypt with this function must have complex content. That is, only encrypt elements with sub elements or encrypt the entire SOAP Body. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_encrypt_only(struct soap *soap, int alg, const void *key, int keylen, const char *tags) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN2("soap_wsse_encrypt_only", "alg=%x", alg, "tags=%s", tags?tags:"(null)"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_encrypt_only", "Plugin not registered", SOAP_PLUGIN_ERROR); data->encid = soap_strdup(soap, tags); if (tags) { char *s, *t; size_t l = strlen(tags); /* make space to insert # to each id converted from a tag name */ t = (char*)soap_malloc(soap, l + 2); if (!t) return soap->error = SOAP_EOM; *t = '#'; soap_strcpy(t + 1, l + 1, tags); s = soap_wsse_ids(soap, t, '_'); if (!s) return soap->error = SOAP_EOM; s++; for (;;) { t = strchr(s, ' '); if (t) *t = '\0'; *--s = '#'; if (soap_wsse_add_DataReferenceURI(soap, s)) return soap->error; if (!t) break; s = t + 1; while (*s == ' ') s++; } } return soap_wsse_encrypt(soap, alg, key, keylen); } /******************************************************************************/ /** @fn int soap_wsse_encrypt(struct soap *soap, int alg, const void *key, int keylen) @brief Start encryption. This function is supposed to be used internally only. The algorithm should be SOAP_MEC_ENC_DES_CBC etc. for symmetric encryption. Use soap_wsse_add_EncryptedKey for public key. encryption. @param soap context @param[in] alg the encryption algorithm, should be SOAP_MEC_ENC_DES_CBC etc. @param[in] key a certificate with public key for encryption, a DES CBC 160-bit key or AES key @param[in] keylen the symmetric encryption key length, 20 bytes for a DES CBC 160-bit key @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_encrypt(struct soap *soap, int alg, const void *key, int keylen) { struct soap_wsse_data *data; DBGFUN1("soap_wsse_encrypt", "alg=%x", alg); data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); if (!data) return soap_set_receiver_error(soap, "soap_wsse_encrypt", "Plugin not registered", SOAP_PLUGIN_ERROR); if (!alg || !key) return soap_wsse_fault(soap, wsse__UnsupportedAlgorithm, "An unsupported signature or encryption algorithm was used"); if (alg & SOAP_MEC_ENV) return soap_wsse_add_EncryptedKey(soap, alg, NULL, (X509*)key, NULL, NULL, NULL); /* store alg and key in plugin data */ data->enco_alg = (alg | SOAP_MEC_ENC); data->enco_key = key; data->enco_keylen = keylen; if (data->mec) soap_mec_cleanup(soap, data->mec); else data->mec = (struct soap_mec_data*)SOAP_MALLOC(soap, sizeof(struct soap_mec_data)); if (soap_mec_begin(soap, data->mec, alg, NULL, (unsigned char*)key, &keylen)) return soap->error; soap->omode &= ~SOAP_XML_DOM; soap->feltbegout = soap_wsse_element_begin_out; soap->feltendout = soap_wsse_element_end_out; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_decrypt_auto(struct soap *soap, int alg, const void *key, int keylen) @brief Start automatic decryption when needed using the specified key. This function should be used just once. The algorithm should be SOAP_MEC_ENV_DEC_DES_CBC etc. for public key encryption/decryption and SOAP_MEC_DEC_DES_CBC etc. for symmetric shared secret keys. @param soap context @param[in] alg the decryption algorithm, @param[in] key a persistent decryption key for the algorithm, a private RSA key or a shared symmetric secret key @param[in] keylen use 0 for public-key encryption/decryption or the shared secret decryption key length, 20 bytes for a DES CBC 160-bit key @return SOAP_OK or error code This function can be called once before multiple messages are received with WS-Security encrypted content, where only one key is used for encryption (public key or shared secret key). The default decryption key is set. If multiple decryption keys should be used, do NOT use this function but set the security_token_handler callback of the wsse plugin. See @ref wsse_9_2. Use a NULL key to remove the default decryption key. */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_decrypt_auto(struct soap *soap, int alg, const void *key, int keylen) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN1("soap_wsse_decrypt_auto", "alg=%x", alg); if (!data) return soap_set_receiver_error(soap, "soap_wsse_decrypt_auto", "Plugin not registered", SOAP_PLUGIN_ERROR); /* store alg and key in plugin data */ data->deco_alg = (alg & ~SOAP_MEC_ENC); /* TODO should add? data->enco_alg = (alg & ~(SOAP_MEC_ENC|SOAP_MEC_ENV)); */ data->deco_key = key; data->deco_keylen = keylen; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_encrypt_begin(struct soap *soap, const char *id, int alg, const char *URI, const char *keyname, const unsigned char *key, const char *type) @brief Emit XML encryption tags and start encryption of the XML element content. @param soap context @param[in] id string for the EncryptedData element Id attribute @param[in] alg algorithm used, or SOAP_MEC_NONE to ignore @param[in] URI string for the encrypted element wsu:Id attribute @param[in] keyname optional subject key name @param[in] key optional DES/AES key for encryption (to override the current key) @param[in] type of encryption, either xenc_elementURI ("http://www.w3.org/2001/04/xmlenc#Element") or xenc_contentURI ("http://www.w3.org/2001/04/xmlenc#Content") @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_encrypt_begin(struct soap *soap, const char *id, int alg, const char *URI, const char *keyname, const unsigned char *key, const char *type) { int event; const char *algURI = NULL; (void)URI; DBGFUN("soap_wsse_encrypt_begin"); if ((soap->mode & SOAP_IO_LENGTH) && ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_IO) == SOAP_IO_STORE)) return SOAP_OK; /* disable digest */ event = soap->event; soap->event = 0; if (soap_set_attr(soap, "Id", id, 1) || soap_set_attr(soap, "Type", type, 1) || soap_element(soap, "xenc:EncryptedData", 0, NULL) || soap_element_start_end_out(soap, NULL)) return soap->error; switch (alg & SOAP_MEC_MASK & ~SOAP_MEC_ENV) { case SOAP_MEC_ENC_DES_CBC: algURI = xenc_3desURI; break; case SOAP_MEC_ENC_AES128_CBC: algURI = xenc_aes128cbcURI; break; case SOAP_MEC_ENC_AES192_CBC: algURI = xenc_aes192cbcURI; break; case SOAP_MEC_ENC_AES256_CBC: algURI = xenc_aes256cbcURI; break; case SOAP_MEC_ENC_AES512_CBC: algURI = xenc_aes512cbcURI; break; case SOAP_MEC_ENC_AES128_GCM: algURI = xenc_aes128gcmURI; break; case SOAP_MEC_ENC_AES192_GCM: algURI = xenc_aes192gcmURI; break; case SOAP_MEC_ENC_AES256_GCM: algURI = xenc_aes256gcmURI; break; case SOAP_MEC_ENC_AES512_GCM: algURI = xenc_aes512gcmURI; break; } if (algURI) { if (soap_set_attr(soap, "Algorithm", algURI, 1) || soap_element(soap, "xenc:EncryptionMethod", 0, NULL) || soap_element_start_end_out(soap, "xenc:EncryptionMethod")) return soap->error; } #if 0 /* deprecated */ if (URI) { if (soap_element(soap, "ds:KeyInfo", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_element(soap, "wsse:SecurityTokenReference", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_set_attr(soap, "URI", URI, 1) || soap_element(soap, "wsse:Reference", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_element_end_out(soap, "wsse:Reference") || soap_element_end_out(soap, "wsse:SecurityTokenReference") || soap_element_end_out(soap, "ds:KeyInfo")) return soap->error; } else #endif if (keyname) { if (soap_element(soap, "ds:KeyInfo", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_element(soap, "ds:KeyName", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_string_out(soap, keyname, 0) || soap_element_end_out(soap, "ds:KeyName") || soap_element_end_out(soap, "ds:KeyInfo")) return soap->error; } if (soap_element(soap, "xenc:CipherData", 0, NULL) || soap_element_start_end_out(soap, NULL) || soap_element(soap, "xenc:CipherValue", 0, NULL) || soap_element_start_end_out(soap, NULL)) return soap->error; /* re-enable digest */ soap->event = event; /* adjust level, hiding xenc elements */ soap->level -= 3; return soap_mec_start(soap, key); } /******************************************************************************/ /** @fn int soap_wsse_encrypt_end(struct soap *soap) @brief Emit XML encryption end tags and stop encryption of the XML element content. @param soap context @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_encrypt_end(struct soap *soap) { int event; DBGFUN("soap_wsse_encrypt_end"); if ((soap->mode & SOAP_IO_LENGTH) && ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_IO) == SOAP_IO_STORE)) return SOAP_OK; /* disable digest */ event = soap->event; soap->event = 0; /* adjust level, hiding xenc elements */ soap->level += 3; /* base64 body, no indent */ soap->body = 1; if (soap_mec_stop(soap) || soap_element_end_out(soap, "xenc:CipherValue") || soap_element_end_out(soap, "xenc:CipherData") || soap_element_end_out(soap, "xenc:EncryptedData")) return soap->error; /* re-enable digest */ soap->event = event; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_decrypt_begin(struct soap *soap) @brief Check for XML encryption tags and start decryption of the XML element content. If the KeyInfo element is present, the security_token_handler callback will be used to obtain a decryption key based on the key name. @param soap context @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_decrypt_begin(struct soap *soap) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); struct ds__KeyInfoType info; struct xenc__EncryptionMethodType meth; int alg = data->deco_alg; const unsigned char *keyid = NULL; int keyidlen = 0; unsigned char *key = NULL; int keylen = data->deco_keylen; DBGFUN("soap_wsse_decrypt_begin"); if (!data) return soap_set_receiver_error(soap, "soap_wsse_decrypt_begin", "Plugin not registered", SOAP_PLUGIN_ERROR); if (soap_element_begin_in(soap, "xenc:EncryptedData", 0, NULL)) return soap->error; /* TODO: use Type attribute? */ soap_default_xenc__EncryptionMethodType(soap, &meth); if (soap_in_xenc__EncryptionMethodType(soap, "xenc:EncryptionMethod", &meth, NULL)) { if (meth.Algorithm) { if (!strcmp(meth.Algorithm, xenc_3desURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_DES_CBC; else if (!strcmp(meth.Algorithm, xenc_aes128cbcURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES128_CBC; else if (!strcmp(meth.Algorithm, xenc_aes192cbcURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES192_CBC; else if (!strcmp(meth.Algorithm, xenc_aes256cbcURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES256_CBC; else if (!strcmp(meth.Algorithm, xenc_aes512cbcURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES512_CBC; else if (!strcmp(meth.Algorithm, xenc_aes128gcmURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES128_GCM; else if (!strcmp(meth.Algorithm, xenc_aes192gcmURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES192_GCM; else if (!strcmp(meth.Algorithm, xenc_aes256gcmURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES256_GCM; else if (!strcmp(meth.Algorithm, xenc_aes512gcmURI)) alg = (alg & (~SOAP_MEC_MASK | SOAP_MEC_ENV)) | SOAP_MEC_DEC_AES512_GCM; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "EncryptionMethod alg=%x\n", alg)); } } if (soap_in_ds__KeyInfoType(soap, "ds:KeyInfo", &info, NULL)) { if (data->security_token_handler) { keyid = soap_wsse_get_KeyInfo_SecurityTokenReferenceKeyIdentifier(soap, &info, &keyidlen); if (keyid || info.KeyName) { /* retrieve key from token handler callback */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting shared secret key '%s' through security_token_handler callback\n", info.KeyName)); key = (unsigned char*)data->security_token_handler(soap, &alg, info.KeyName, keyid, keyidlen, &keylen); if (key) { if (data->mec) soap_mec_cleanup(soap, data->mec); else data->mec = (struct soap_mec_data*)SOAP_MALLOC(soap, sizeof(struct soap_mec_data)); if (soap_mec_begin(soap, data->mec, alg, NULL, (unsigned char*)key, &keylen)) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); } } } } if (soap_element_begin_in(soap, "xenc:CipherData", 0, NULL) || soap_element_begin_in(soap, "xenc:CipherValue", 0, NULL)) return soap->error; /* if no default shared key is set for symmetric decryption, get it */ if (!(alg & SOAP_MEC_ENV)) { if (alg != data->deco_alg) { if (data->security_token_handler) { /* retrieve key from token handler callback */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting shared secret key for alg=%x through security_token_handler callback\n", alg)); data->deco_key = (const unsigned char*)data->security_token_handler(soap, &alg, NULL, keyid, keyidlen, &keylen); } } if (!key && keylen) key = (unsigned char*)data->deco_key; if (key) { if (data->mec) soap_mec_cleanup(soap, data->mec); else data->mec = (struct soap_mec_data*)SOAP_MALLOC(soap, sizeof(struct soap_mec_data)); if (soap_mec_begin(soap, data->mec, alg, NULL, (unsigned char*)key, &keylen)) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Key=%p/%p keylen=%d alg=%x\n", key, data->deco_key, keylen, alg)); data->deco_alg = alg; data->deco_keylen = keylen; if (soap_mec_start_alg(soap, alg, key)) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_decrypt_end(struct soap *soap) @brief Check for XML encryption ending tags and stop decryption of the XML element content. @param soap context @return SOAP_OK or error code */ SOAP_FMAC1 int SOAP_FMAC2 soap_wsse_decrypt_end(struct soap *soap) { DBGFUN("soap_wsse_decrypt_end"); if (soap_mec_stop(soap) || soap_element_end_in(soap, "xenc:CipherValue") || soap_element_end_in(soap, "xenc:CipherData") || soap_element_end_in(soap, "xenc:EncryptedData")) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); return SOAP_OK; } /******************************************************************************\ * * Callbacks registered by plugin * \******************************************************************************/ /** @fn int soap_wsse_element_begin_in(struct soap *soap, const char *tag) @brief This callback is invoked as soon as a starting tag of an element is received by the XML parser. @param soap context @param[in] tag name of the element parsed @return SOAP_OK or error code */ static int soap_wsse_element_begin_in(struct soap *soap, const char *tag) { /* make sure we always have a header allocated */ if (soap->part == SOAP_IN_ENVELOPE) soap_header(soap); else if (!soap_match_tag(soap, tag, "xenc:EncryptedData")) { struct soap_dom_element **elt, *dom = soap->dom; /* temporarily disable DOM */ soap->dom = NULL; /* parse encryption tags */ if (soap_wsse_decrypt_begin(soap)) return soap->error; /* re-enable dom and adjust DOM tree to skip encryption elements */ soap->dom = dom->prnt; /* remove EncryptedData element from DOM */ for (elt = &soap->dom->elts; *elt && (*elt)->next; elt = &(*elt)->next) continue; if (*elt) *elt = NULL; /* adjust nesting level */ if (soap->level > 3) soap->level -= 3; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Decryption started, parsing encrypted XML\n")); soap->event = SOAP_SEC_DECRYPT; return soap_peek_element(soap); } return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_element_end_in(struct soap *soap, const char *tag1, const char *tag2) @brief This callback is invoked as soon as an ending tag of an element is received by the XML parser. @param soap context @param[in] tag1 name of the element parsed @param[in] tag2 name of the element that was expected by the parser's state, or NULL @return SOAP_OK or error code */ static int soap_wsse_element_end_in(struct soap *soap, const char *tag1, const char *tag2) { if (soap->event == SOAP_SEC_DECRYPT && soap->dom && soap->dom->elts && !soap_match_tag(soap, tag1, ":CipherValue")) { struct soap_dom_element *dom = soap->dom->elts; soap->event = 0; /* temporarily disable DOM */ soap->dom = NULL; /* adjust nesting level */ soap->level += 3; /* parse ending tags */ if (soap_mec_stop(soap) || soap_element_end_in(soap, ":CipherData") || soap_element_end_in(soap, ":EncryptedData")) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); /* adjust DOM tree to skip encryption elements */ while (dom->next) dom = dom->next; /* remove the old indent before ending tag */ dom->tail = NULL; /* re-enable DOM */ soap->dom = dom; if (soap_element_end_in(soap, tag2)) return soap->error; } else if (!soap_match_tag(soap, tag1, ":EncryptedKey")) { return soap_wsse_verify_EncryptedKey(soap); } return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_element_begin_out(struct soap *soap, const char *tag, int id, const char *type) @brief This callback is invoked as soon as a starting tag of an element is to be sent by the XML generator. @param soap context @param[in] tag name of the element @param[in] id of the element or 0 @param[in] type xsi:type of the element or NULL @return SOAP_OK or error code */ static int soap_wsse_element_begin_out(struct soap *soap, const char *tag, int id, const char *type) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); if (data && (!data->encid || soap_tagsearch(data->encid, tag))) { char *URI = NULL; #if 0 /* deprecated */ _wsse__Security *security = soap_wsse_Security(soap); if (security && security->xenc__EncryptedKey && security->xenc__EncryptedKey->Id) { const char *Id = security->xenc__EncryptedKey->Id; size_t l = strlen(Id); URI = (char*)soap_malloc(soap, l + 2); if (!URI) return soap->error = SOAP_EOM; *URI = '#'; soap_strcpy(URI + 1, l + 1, Id); } #endif if (!strcmp(tag, "SOAP-ENV:Body")) { if (soap_element(soap, tag, id, type) || soap_element_start_end_out(soap, NULL)) return soap->error; return soap_wsse_encrypt_begin(soap, "SOAP-ENV_Body", data->enco_alg, URI, data->enco_keyname, NULL, xenc_contentURI); } if (data->encid) { struct soap_attribute *tp, *tq, *tr = soap->attributes; /* preserve attribute lists */ int err; soap->attributes = NULL; err = soap_wsse_encrypt_begin(soap, soap_wsse_ids(soap, tag, '_'), data->enco_alg, URI, data->enco_keyname, NULL, xenc_elementURI); for (tp = soap->attributes; tp; tp = tq) { tq = tp->next; if (tp->value) SOAP_FREE(soap, tp->value); SOAP_FREE(soap, tp); } soap->attributes = tr; if (err) return err; } } if (soap_element(soap, tag, id, type) || soap_element_start_end_out(soap, NULL)) return soap->error; return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_element_end_out(struct soap *soap, const char *tag) @brief This callback is invoked as soon as an ending tag of an element is to be sent by the XML generator. @param soap context @param[in] tag name of the element @return SOAP_OK or error code */ static int soap_wsse_element_end_out(struct soap *soap, const char *tag) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); if (soap->level <= 1 && !(soap->mode & SOAP_IO_LENGTH)) { soap->feltbegout = NULL; soap->feltendout = NULL; } if (data && (!data->encid || soap_tagsearch(data->encid, tag))) { if (!strcmp(tag, "SOAP-ENV:Body")) { if (soap_wsse_encrypt_end(soap)) return soap->error; } else if (data->encid) { if (soap_element_end(soap, tag)) return soap->error; return soap_wsse_encrypt_end(soap); } } return soap_element_end(soap, tag); } /******************************************************************************/ /** @fn int soap_wsse_preparesend(struct soap *soap, const char *buf, size_t len) @brief Takes a piece of the XML message (tokenized) to compute digest. @param soap context @param[in] buf string (XML "tokenized") to be sent @param[in] len buf length @return SOAP_OK or fault This callback is invoked to analyze a message (usually during the HTTP content length phase). @note Nested elements with wsu:Id attributes cannot be individually signed. */ static int soap_wsse_preparesend(struct soap *soap, const char *buf, size_t len) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_preparesend"); if (!data) return SOAP_PLUGIN_ERROR; soap->c14ninclude = data->prefixlist; /* the gSOAP engine signals the start of a wsu:Id element */ if (soap->event == SOAP_SEC_BEGIN) { int alg; /* start new digest or continue? */ if (data->digest && !data->digest->done) { soap->event = SOAP_SEC_SIGN; } else if (!data->sigid || soap_tagsearch(data->sigid, soap->id)) { /* initialize smdevp engine */ struct soap_wsse_digest *digest; size_t l = strlen(soap->id); soap->event = SOAP_SEC_SIGN; digest = (struct soap_wsse_digest*)SOAP_MALLOC(soap, sizeof(struct soap_wsse_digest) + l + 1); if (!digest) return soap->error = SOAP_EOM; digest->next = data->digest; digest->done = 0; digest->level = soap->level; /* digest hash strength is same as signature strength */ alg = (SOAP_SMD_DGST | (data->sign_alg & SOAP_SMD_HASH)); soap_smd_init(soap, &digest->smd, alg, NULL, 0); memset((void*)digest->hash, 0, sizeof(digest->hash)); digest->id[0] = '#'; soap_strcpy(digest->id + 1, l + 1, soap->id); data->digest = digest; /* omit indent for indented XML (next time around, we will catch '<') */ if (*buf != '<') goto end; } } if (soap->event == SOAP_SEC_SIGN) { /* update smdevp engine */ if (data->digest && !data->digest->done) { soap_smd_update(soap, &data->digest->smd, buf, len); if (soap->level < data->digest->level) { soap->event = 0; soap_smd_final(soap, &data->digest->smd, (char*)data->digest->hash, NULL); data->digest->done = 1; } } } end: if (data->fpreparesend) return data->fpreparesend(soap, buf, len); return SOAP_OK; } /******************************************************************************/ /** @fn int soap_wsse_preparefinalsend(struct soap *soap) @brief Collects the digests of all the wsu:Id elements and populates the SignedInfo. @param soap context @return SOAP_OK or fault This callback is invoked just before the message is sent. */ static int soap_wsse_preparefinalsend(struct soap *soap) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); DBGFUN("soap_wsse_preparefinalsend"); if (!data) return SOAP_PLUGIN_ERROR; if (data->digest) { ds__SignatureType *signature = soap_wsse_Signature(soap); struct soap_wsse_digest *digest; const char *transform = NULL; int alg, signature_added = 0; /* if message is canonicalized populate transform element accordingly */ if ((soap->mode & SOAP_XML_CANONICAL)) { if (soap->c14ninclude && *soap->c14ninclude == '*') transform = c14n_URI; else transform = exc_c14n_URI; } /* to increase the message length counter we need to emit the Signature, SignedInfo and SignatureValue elements. However, this does not work if we already populated the wsse:Signature with SignedInfo and should never happen! */ if (!signature) { signature = soap_wsse_add_Signature(soap); signature_added = 1; } else if (signature->SignedInfo) { return soap_set_receiver_error(soap, "wsse error", "Cannot use soap_wsse_sign with populated SignedInfo", SOAP_SSL_ERROR); } /* digest hash strength is same as signature strength */ alg = (SOAP_SMD_DGST | (data->sign_alg & SOAP_SMD_HASH)); /* add the SignedInfo/Reference elements for each digest */ for (digest = data->digest; digest; digest = digest->next) if (soap_wsse_add_SignedInfo_Reference(soap, digest->id, digest->level, transform, data->prefixlist, alg, (char*)digest->hash)) return soap->error; /* then compute the signature and add it */ if (soap_wsse_add_SignatureValue(soap, data->sign_alg, data->sign_key, data->sign_keylen)) return soap->error; /* Reset the callbacks and cleanup digests */ soap_wsse_preparecleanup(soap, data); /* if non-chunked or stored message, adjust HTTP content length */ if ((soap->mode & SOAP_IO) != SOAP_IO_CHUNK && (soap->mode & SOAP_IO) != SOAP_IO_STORE) { /* the code below ensures we increase the HTTP length counter */ short part = soap->part; soap->part = SOAP_IN_HEADER; /* header encoding rules (literal) */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Counting the size of additional SOAP Header elements, mode=0x%x\n", soap->mode)); if (signature_added) { const char *c14ninclude = soap->c14ninclude; soap->c14ninclude = NULL; soap->level = 3; /* indent level for XML Signature */ if ((soap->mode & SOAP_XML_CANONICAL)) { soap->ns = 0; /* need namespaces for canonicalization */ if ((soap->mode & SOAP_XML_INDENT)) soap->count += 4; /* correction for soap->ns = 0: add \n+indent */ } soap_out_ds__SignatureType(soap, "ds:Signature", 0, signature, NULL); soap->c14ninclude = c14ninclude; } else { const char *c14ninclude = soap->c14ninclude; const char *c14nexclude = soap->c14nexclude; soap->c14nexclude = "ds xsi"; /* don't add xmlns:ds or xmlns:xsi to count msg len */ soap->level = 4; /* indent level for XML SignedInfo */ if ((soap->mode & SOAP_XML_CANONICAL)) { soap->ns = 0; /* need namespaces for canonicalization */ soap->c14ninclude = NULL; /* but do not render inclusive namespaces */ if ((soap->mode & SOAP_XML_INDENT)) soap->count += 5; /* correction for soap->ns = 0: add \n+indent */ } soap_out_ds__SignedInfoType(soap, "ds:SignedInfo", 0, signature->SignedInfo, NULL); soap_out__ds__SignatureValue(soap, "ds:SignatureValue", 0, &signature->SignatureValue, NULL); soap->c14ninclude = c14ninclude; soap->c14nexclude = c14nexclude; } soap->part = part; } } else /* Reset the callbacks and cleanup digests */ { soap_wsse_preparecleanup(soap, data); } if (soap->fpreparefinalsend) return soap->fpreparefinalsend(soap); return SOAP_OK; } /******************************************************************************/ /** @fn void soap_wsse_preparecleanup(struct soap *soap, struct soap_wsse_data *data) @brief Restores engine state. @param soap context @param[in,out] data plugin data */ static void soap_wsse_preparecleanup(struct soap *soap, struct soap_wsse_data *data) { struct soap_wsse_digest *digest, *next; DBGFUN("soap_wsse_preparecleanup"); data->sign_alg = SOAP_SMD_NONE; data->sign_key = NULL; data->sign_keylen = 0; if (soap->fpreparesend == soap_wsse_preparesend) soap->fpreparesend = data->fpreparesend; if (soap->fpreparefinalsend == soap_wsse_preparefinalsend) soap->fpreparefinalsend = data->fpreparefinalsend; data->fpreparesend = NULL; data->fpreparefinalsend = NULL; for (digest = data->digest; digest; digest = next) { next = digest->next; SOAP_FREE(soap, digest); } data->digest = NULL; } /******************************************************************************/ /** @fn int soap_wsse_preparefinalrecv(struct soap *soap) @brief Verify signature and SignedInfo digests initiated with soap_wsse_verify_auto. @param soap context @return SOAP_OK or fault @see soap_wsse_verify_auto This callback is invoked immediately after a message was received. */ static int soap_wsse_preparefinalrecv(struct soap *soap) { struct soap_wsse_data *data = (struct soap_wsse_data*)soap_lookup_plugin(soap, soap_wsse_id); soap->omode &= ~SOAP_SEC_WSUID; data->sigid = NULL; /* so we must set again before next send */ data->encid = NULL; /* so we must set again before next send */ DBGFUN("soap_wsse_preparefinalrecv"); if (!data) return SOAP_PLUGIN_ERROR; if (data->deco_alg != SOAP_MEC_NONE && data->mec) if (soap_mec_end(soap, data->mec)) return soap_wsse_fault(soap, wsse__FailedCheck, NULL); data->deco_alg = SOAP_MEC_NONE; if (soap_wsse_verify_Signature(soap)) return soap->error; if (data->fpreparefinalrecv && data->fpreparefinalrecv != soap_wsse_preparefinalrecv) return data->fpreparefinalrecv(soap); return SOAP_OK; } /******************************************************************************/ #ifdef __cplusplus } #endif gsoap-2.8.91/gsoap/plugin/httpda.c0000644000175000017500000014772113525245161016343 0ustar ellertellert/* httpda.c gSOAP HTTP Digest Authentication plugin. Adds support for digest authentication RFC2617 and the RFC7616 draft. gSOAP XML Web services tools Copyright (C) 2000-2016, 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-2016, 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 -------------------------------------------------------------------------------- */ /** @mainpage - @ref httpda documents the http_da plugin for HTTP Digest Authentication. */ /** @page httpda The HTTP-DA plugin [TOC] @section httpda_0 Introduction The upgraded HTTP digest authentication plugin for gSOAP adds support for the RFC7616 draft that is backwards compatible with RFC2617. The new plugin adds SHA-256 (and SHA-512/256 when OpenSSL supports it) algorithms, including the -sess variants. To maintain backwards compatibility with RFC2617 the MD5 algorithm is still supported but not recommended. HTTP **digest authentication** does not transmit the user id and password for authentication. Instead, a server negotiates credentials (username and/or password) with a client using cryptographic hashing algorithms with nonce values to prevent replay attacks. By contrast, HTTP **basic authentication** is not safe over unencrypted channels because the password is transmitted to the server unencrypted. Therefore, this mechanism provides no confidentiality protection for the transmitted credentials. HTTPS is typically preferred over or used in conjunction with HTTP basic authentication. To support HTTP digest authentication in favor of HTTP basic authentication, you will need to install OpenSSL and follow these steps to build your projects: - Compile your project that uses gSOAP source code with `-DWITH_OPENSSL`. - Link libgsoapssl (libgsoapssl++), or use the `stdsoap2.c[pp]` source. - Compile and link your code together with `plugin/httpda.c`, `plugin/smdevp.c`, and `plugin/threads.c` The plugin is MT-safe by means of internal mutex locks. Mutex ensures exclusive access and updates of the shared session store with nonces to prevent replay attacks. @section httpda_1 Client-side usage HTTP basic authentication is the default authentication mechanism supported by gSOAP. You can set the basic authentication credentials at the client-side with: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} soap.userid = ""; soap.passed = ""; if (soap_call_ns__method(&soap, ...)) ... // error ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ or if you use a proxy object generated with saopcpp2 option -j: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} Proxy proxy(...); proxy.soap->userid = ""; proxy.soap->passed = ""; if (proxy.method(...)) ... // error ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HTTP basic authentication should **never** be used over plain HTTP, because the credentials (the ID and password) are transmitted in the clear in base64 encoded form which is easily reversible. This mechanism is safer to use over HTTPS, because the HTTP headers and body are encrypted. This upgraded HTTP digest authentication plugin supports RFC7616 and RFC2617. RFC7616 adds SHA2 and is backwards compatible to clients that use MD5. The MD5 algorithm is not allowed in FIPS making SHA-256 or SHA-512-256 digest algorithms mandatory. The client-side of the plugin handles both RFCs automatically. To use HTTP digest authentication with gSOAP, register the http_da plugin as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "httpda.h" struct soap *soap = soap_new(); soap_register_plugin(soap, http_da); ... soap_destroy(soap); // deallocate data soap_end(soap); // deallocate temp data soap_free(soap); // deregister plugin and deallocate context ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ or if you use a proxy object generated with saopcpp2 option -j: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} #include "httpda.h" Proxy proxy(...); soap_register_plugin(proxy.soap, http_da); ... proxy.destroy(); // deallocate data and temps ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To make a client-side service call you will need to create a digest store `http_da_info`. The store holds the digest information locally on your machine to manage repeated authentication challenges from all servers you connect to. Use `http_da_save()` to add credentials to the store and release the store with `http_da_release()` when you no longer need the credentials. The `http_da_info` store is intended for one thread to issue a sequence of calls that are all authenticated without requiring (re)negotiation. You should not share the `http_da_info` store with multiple threads, unless you use mutex locks. Here is an example: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} struct soap *soap = soap_new(); soap_register_plugin(soap, http_da); struct http_da_info info; if (soap_call_ns__method(soap, ...)) // make a call without authentication { if (soap.error == 401) // HTTP authentication is required { http_da_save(soap, &info, "", "", ""); if (soap_call_ns__method(soap, ...)) // make a call with authentication ... // error http_da_release(soap, &info); // release if auth is no longer needed } else ... // other error } soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Again, if you use a proxy object then replace the `soap_call_ns__method` with the proxy method invocation, as was shown earlier. The `` string is the protected realm of the server that requires authorization. This string can be obtained with the `soap.authrealm` string after an unsuccessful non-authenticated call so you can use it to save credentials to the digest store: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} struct soap *soap = soap_new(); soap_register_plugin(soap, http_da); struct http_da_info info; if (soap_call_ns__method(soap, ...)) // make a call without authentication { if (soap.error == 401) // HTTP authentication is required { const char *realm = soap.authrealm; http_da_save(soap, &info, realm, "", ""); if (soap_call_ns__method(soap, ...)) // make a call with authentication ... // error ... http_da_release(soap, &info); // deallocate authentication info if auth is no longer needed } else ... // error } soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Before a second call is made to the same endpoint that requires authentication, you must restore the authentication state with `http_da_restore()`, then use it, and finally release it with `http_da_release()`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} struct soap *soap = soap_new(); soap_register_plugin(soap, http_da); struct http_da_info info; bool auth = false; if (soap_call_ns__method(soap, ...)) // make a call without authentication { if (soap.error == 401) // HTTP authentication is required { http_da_save(soap, &info, "", "", ""); auth = true; } else ... // other error } if (auth) http_da_restore(soap, &info); if (soap_call_ns__method(soap, ...)) // make a call with authentication ... // error soap_destroy(soap); // okay to dealloc data soap_end(soap); // okay to dealloc data if (auth) http_da_restore(soap, &info); if (soap_call_ns__method(soap, ...)) // make a call with authentication ... // error if (auth) http_da_release(soap, &info); // deallocate authentication info soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For HTTP proxies requiring HTTP digest authenticaiton, use the 'proxy' functions of the plugin: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} struct soap *soap = soap_new(); soap_register_plugin(soap, http_da); struct http_da_info info; if (soap_call_ns__method(soap, ...)) // make a call without authentication { if (soap.error == 407) // HTTP proxy authentication is required { http_da_proxy_save(soap, &info, "", "", ""); auth = true; } else ... // error } if (auth) http_da_proxy_restore(soap, &info); if (soap_call_ns__method(soap, ...)) ... // error http_da_proxy_release(soap, &info); // deallocate authentication info soap_destroy(soap); soap_end(soap); soap_free(soap); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @section httpda_2 Client example A client authenticating against a server: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} struct soap *soap = soap_new(); soap_register_plugin(soap, http_da); if (soap_call_ns__method(soap, ...)) // make a call without authentication { if (soap.error == 401) // HTTP authentication is required { if (!strcmp(soap.authrealm, authrealm)) // check authentication realm { struct http_da_info info; // to store userid and passwd http_da_save(soap, &info, authrealm, userid, passwd); // call again, now with credentials if (soap_call_ns__method(soap, ...) == SOAP_OK) { ... // process response data soap_end(soap); ... // userid and passwd were deallocated (!) http_da_restore(soap, &info); // get userid and passwd after soap_end() if (!soap_call_ns__method(soap, ...) == SOAP_OK) ... // error http_da_release(soap, &info); // deallocate authentication info ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A client authenticating against a proxy: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} struct soap *soap = soap_new(); soap_register_plugin(soap, http_da); if (soap_call_ns__method(soap, ...)) // make a call without authentication { if (soap.error == 407) // HTTP authentication is required { if (!strcmp(soap.authrealm, authrealm)) // check authentication realm { struct http_da_info info; // to store userid and passwd http_da_proxy_save(soap, &info, authrealm, userid, passwd); // call again, now with credentials if (soap_call_ns__method(soap, ...) == SOAP_OK) { ... // process response data soap_end(soap); ... // userid and passwd were deallocated (!) http_da_proxy_restore(soap, &info); // get userid and passwd after soap_end() if (!soap_call_ns__method(soap, ...) == SOAP_OK) ... // error http_da_proxy_release(soap, &info); // deallocate authentication info ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @section httpda_3 Server-side usage As explained in the gSOAP user guid, server-side HTTP basic authentication is enforced by simply checking the `soap.userid` and `soap.passwd` values in a service method that requires client authentication: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} struct soap *soap = soap_new(); soap_register_plugin(soap, http_da); ... soap_serve(soap); // see gSOAP documentation and examples on how to serve requests ... int ns__method(struct soap *soap, ...) { if (!soap->userid || !soap->passwd || strcmp(soap->userid, "") || strcmp(soap->passwd, "")) return 401; // HTTP authentication required ... } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HTTP digest authentication is verified differently, because digests are compared, not passwords: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} struct soap *soap = soap_new(); soap_register_plugin(soap, http_da); ... soap_serve(soap); // see gSOAP documentation and examples on how to serve requests ... int ns__method(struct soap *soap, ...) { if (soap->authrealm && soap->userid) { passwd = ... // database lookup on userid and authrealm to find passwd if (!strcmp(soap->authrealm, authrealm) && !strcmp(soap->userid, userid)) { if (!http_da_verify_post(soap, passwd)) // HTTP POST DA verification { ... // process request and produce response return SOAP_OK; } } } soap->authrealm = authrealm; // realm to send to client return 401; // Not authorized, challenge with digest authentication ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The `http_da_verify_post()` function checks the HTTP POST credentials by computing and comparing a digest of the password. To verify an HTTP GET operation, use `http_da_verify_get()` instead. RFC7616 recommends SHA2 over MD5. The MD5 algorithm is not allowed in FIPS and SHA-256 or SHA-512-256 are mandatory. The upgrade plugin uses SHA-256 as the default algorithm and reverts to MD5 only if required by a client that does not support RFC7616. The default SHA-256 digest algorithm is enabled automatically. However, at the server side you can also use a plugin registry option to set a different algorithm as the default: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} soap_register_plugin_arg(soap, http_da,
\n\n", c_ident(typ)); fprintf(freport, "### `%s`\n\n", c_type(typ)); if (soap_version < 0 && (is_header_or_fault(typ) || is_body(typ))) { fprintf(freport, "This %s is for internal use only\n\n", typ->type == Tstruct ? "struct" : typ->type == Tclass ? "class" : "union"); return; } else { fprintf(freport, "This %s is declared in [%s](%s) at line %d, ", typ->type == Tstruct ? "struct" : typ->type == Tclass ? "class" : "union", p->filename, p->filename, p->lineno); } } if (is_imported(typ)) return; x = xsi_type(typ); if (!x || !*x) x = wsdl_type(typ, ""); if (fd != freport) { fprintf(fd, "\n\n/* %s:%d */", p->filename, p->lineno); if (is_header_or_fault(typ) || is_body(typ)) fprintf(fd, "\n#ifndef WITH_NOGLOBAL"); fprintf(fd, "\n#ifndef %s\n", soap_type(typ)); if (namespaceid) fprintf(fd, "#define %s (-%d)\n", soap_type(typ), typ->num); /* namespaced SOAP_TYPE is negative to avoid clashes */ else fprintf(fd, "#define %s (%d)\n", soap_type(typ), typ->num); } if (typ->recursive) { if (fd == freport) fprintf(freport, "is recursive, meaning it may (in)directly reference itself through its (base or derived class) members, and "); else fprintf(fd, "/* Type %s is a recursive data type, (in)directly referencing itself through its (base or derived class) members */\n", typ->id->name); } if (is_volatile(typ)) { if (fd == freport) fprintf(freport, "is volatile, meaning it is declared external of the data binding interface and not redeclared here"); else fprintf(fd, "#if 0 /* Volatile: declared external of the data binding interface and not redeclared here */\n"); } else if (is_transient(typ)) { if (fd == freport) fprintf(freport, "is transient, meaning not serializable"); else fprintf(fd, "/* Transient type: */\n"); } else if (is_invisible(typ->id->name)) { if (fd == freport) fprintf(freport, "is a wrapper, meaning that it wraps data and is not visible in XML"); else fprintf(fd, "/* Wrapper: */\n"); x = ""; } else if (is_attachment(typ)) { if (fd == freport) fprintf(freport, "is an attachment, meaning binary data attached as a MTOM/MIME/DIME attachment or included as *`xsd:base64Binary`* base64 with `__ptr` pointing to the data of length `__size` and `id`, `type`, and `options` identifying and describing the attachment data (use the `SOAP_ENC_MTOM` or the `SOAP_ENC_MIME` flag and set at least `type` to create an attachment )"); else fprintf(fd, "/* binary data attached as MTOM/MIME/DIME attachment or included as *`xsd:base64Binary`* base64: */\n"); } else if (is_hexBinary(typ)) { if (fd == freport) fprintf(freport, "is binary, meaning serialized as *`xsd:hexBinary`* hex binary data with `__ptr` pointing to the data of length `__size`"); else fprintf(fd, "/* hexBinary XML schema type: */\n"); } else if (is_binary(typ)) { if (fd == freport) fprintf(freport, "is binary, meaning serialized as *`xsd:base64Binary`* base64 binary data with `__ptr` pointing to the data of length `__size`"); else fprintf(fd, "/* base64Binary XML schema type: */\n"); } else if (is_discriminant(typ)) { if (fd == freport) fprintf(freport, "is a choice, meaning a union with a union variant selector"); else fprintf(fd, "/* Choice: */\n"); } else if ((q = is_dynamic_array(typ))) { if (has_ns(typ) || is_untyped(typ)) { if (fd == freport) fprintf(freport, "is a sequence of elements, meaning that it has a pointer member `%s` pointing to an array of `%s` values and has an array size `%s`", ident(q->sym->name), c_type(q->info.typ->ref), ident(q->next->sym->name)); else fprintf(fd, "/* Sequence of %s schema type: */\n", x); } else { if (fd == freport) { int d = get_Darraydims(typ); if (!d) fprintf(freport, "is a SOAP-encoded array, meaning that the type name lacks a prefix and it has a member `%s` pointing to an array of `%s` values and has an array size member `%s`", ident(q->sym->name), c_type(q->info.typ->ref), ident(q->next->sym->name)); else fprintf(freport, "is a %dD SOAP-encoded array, meaning that the type name lacks a prefix and it has a member `%s` pointing to an array of `%s` values and has an array `%s[%d]` of sizes for each dimension", d, ident(q->sym->name), c_type(q->info.typ->ref), ident(q->next->sym->name), d); } else { if (!eflag && soap_version >= 0) { sprintf(errbuf, "SOAP-encoded array '%s' is specific to SOAP encoding only and not compliant with WS-I Basic Profile 1.0a", c_type(typ)); compliancewarn(errbuf); } fprintf(fd, "/* SOAP encoded array of %s schema type: */\n", x); } } } else if (is_primclass(typ)) { if (fd == freport) fprintf(freport, "is a simple content wrapper *`%s`*, meaning it wraps a primitive type", x); else fprintf(fd, "/* simple XML schema type '%s': */\n", x); } else if (is_header_or_fault(typ)) { if (fd == freport) { s = ident(typ->id->name); fprintf(freport, "is the SOAP protocol *`<%s>`* element", ns_convert(p->sym->name)); if (!strcmp(s, "SOAP_ENV__Header")) { int flag = 0; fprintf(freport, " with message-specific child elements that are mandatory to process when attributed with *`mustUnderstand=\"true\"`*. Headers are usually added and processed by plugins. To remove the SOAP Header when sending or returning a message, set `soap->header = NULL`. Use `soap_header(struct soap *soap)` to allocate a `%s` which will be pointed to by `soap->header`, then initialize it with `soap_default_SOAP_ENV__Header(soap, soap->header)` and set one or more of its data members (if any):\n\n", c_type(typ)); if (typ->ref && ((Table*)typ->ref)->list) { for (q = ((Table*)typ->ref)->list; q; q = q->next) { if (q->info.typ->type != Tfun && !is_transient(q->info.typ)) { fprintf(fd, "- `%s%s` ", c_storage(q->info.sto), c_type_id(q->info.typ, q->sym->name)); if (q->info.sto & SmustUnderstand) fprintf(fd, "element %s with mustUnderstand=\"true\">", ns_add(q, nse)); else fprintf(fd, "element %s", ns_add(q, nse)); if ((q->info.typ->type == Tclass || q->info.typ->type == Tstruct || q->info.typ->type == Tenum || q->info.typ->type == Tenumsc || is_typedef(q->info.typ)) && !is_stdstr(q->info.typ)) fprintf(freport, ", see also %s ", ident(q->info.typ->id->name), ident(q->info.typ->id->name)); fprintf(freport, "\n"); } } flag = 1; } if (!flag) fprintf(freport, "*No SOAP headers are applicable*"); fprintf(freport, "\n\nThis struct will be auto-generated when it is not explicitly declared in an interface header file,"); } else if (!strcmp(s, "SOAP_ENV__Fault")) { fprintf(freport, " with fault information and details returned by a service that triggered the error. At the server side, a fault can be explicitly set within a service operation by calling and returning:\n\n- `int soap_sender_fault(struct soap *soap, const char *faultstring, const char *XML)` return this error code when the sender is at fault (irrecoverable)\n- `int soap_receiver_fault(struct soap *soap, const char *faultstring, const char *XML)` return this error code when the receiver is at fault (recoverable, sender may retry)\n\nA service operation may also return an HTTP status or error code (200 to 599).\n\nAt the client side the (proxy) call returns the error code which is also stored in `soap->error`. The fault structure is pointed to by `soap->fault`. The fault can be displayed with:\n\n- `void soap_print_fault(struct soap *soap, FILE *fd)` display fault\n- `void soap_print_fault_location(struct soap *soap, FILE *fd)` display the location of the fault in the XML message that caused it\n- `void soap_sprint_fault(struct soap *soap, char *buf, size_t len)` write fault to buffer\n- `void soap_stream_fault(struct soap *soap, std::ostream&)` write fault to stream\n- `const char *soap_fault_subcode(struct soap *soap)` returns the SOAP Fault subcode QName string or NULL when absent\n- `const char *soap_fault_string(struct soap *soap)` returns the SOAP Fault string/reason or NULL when absent\n- `const char *soap_fault_detail(struct soap *soap)` returns the SOAP Fault detail XML string or NULL when absent\n- `const char **soap_faultsubcode(struct soap *soap)` returns a pointer to the SOAP Fault to set this QName string\n- `const char **soap_faultstring(struct soap *soap)` returns a pointer to the SOAP Fault string/reason to set this string\n- `const char **soap_faultdetail(struct soap *soap)` returns a pointer to the SOAP Fault detail XML string to set this string or returns NULL when not accessible"); fprintf(freport, "\n\nThis struct will be auto-generated when it is not explicitly declared in an interface header file"); } else if (!strcmp(s, "SOAP_ENV__Detail")) { int flag = 0; fprintf(freport, " with details returned by a service that triggered the error. Fault details are added and processed by plugins by setting the `detail` (for SOAP 1.1) or `SOAP_ENV__Detail` (for SOAP 1.2) member of `struct SOAP_ENV__Fault` and then setting one ore more of the detail members:\n\n"); if (typ->ref && ((Table*)typ->ref)->list) { for (q = ((Table*)typ->ref)->list; q; q = q->next) { if (q->info.typ->type != Tfun && !is_transient(q->info.typ)) { fprintf(fd, "- `%s%s` ", c_storage(q->info.sto), c_type_id(q->info.typ, q->sym->name)); if (is_XML(q->info.typ) && is_invisible(q->sym->name)) fprintf(fd, "catch-all XML in literal XML string"); else if (is_XML(q->info.typ)) fprintf(fd, "element *`<%s>`* with XML in literal XML string", ns_add(q, nse)); else if (is_anyType(q->info.typ)) fprintf(fd, "catch-all XML in DOM"); else if (is_anytype(q)) { if (namespaceid) fprintf(fd, "element *`<%s>`* serialized with C/C++ type `%s` = `SOAP_TYPE_%s_`", ns_add(q->next, nse), ident(q->sym->name), namespaceid); else fprintf(fd, "element *`<%s>`* serialized with C/C++ type `%s` = `SOAP_TYPE_`", ns_add(q->next, nse), ident(q->sym->name)); q = q->next; } else fprintf(fd, "element *`<%s>`*", ns_add(q, nse)); if ((q->info.typ->type == Tclass || q->info.typ->type == Tstruct || q->info.typ->type == Tenum || q->info.typ->type == Tenumsc || is_typedef(q->info.typ)) && !is_stdstr(q->info.typ)) fprintf(freport, ", see also %s ", ident(q->info.typ->id->name), ident(q->info.typ->id->name)); fprintf(fd, "\n"); } } flag = 1; } if (!flag) fprintf(freport, "No SOAP Fault details are applicable"); fprintf(freport, "\n\nThis struct will be auto-generated when it is not explicitly declared in an interface header file,"); } else { fprintf(freport, ". This struct is for internal use and will be auto-generated when not explicitly declared.\n\n"); gen_report_hr(); return; } } else fprintf(fd, "/* %s: */\n", ident(typ->id->name)); } else if (typ->type == Tunion) { if (fd == freport) fprintf(freport, "is serializable, but only when used as a member of a struct or class with a union variant selector"); else fprintf(fd, "/* union serializable only when used as a member of a struct or class with a union variant selector */\n"); } else if (x && *x) { if (fd == freport) fprintf(freport, "is serialized as XML schema type *`%s`*", x); else fprintf(fd, "/* complex XML schema type '%s': */\n", x); } else if (fd == freport) fprintf(freport, "is serializable"); if (fd == freport && is_mutable(p)) fprintf(freport, " and is declared mutable, meaning that multiple declarations in interface header files are collected into one structure"); if (fd == freport && typ->type == Tstruct) { int flag = 0; Tnode *r; for (r = Tptr[Tfun]; r; r = r->next) { if (!strcmp(r->id->name, p->sym->name)) { if (*x) fprintf(freport, " and is internally used as the operation request element *`<%s>`* with the request parameters of service operation `%s()`", x, ident(r->id->name)); else fprintf(freport, " and is internally used to wrap the request element(s) of the service operation `%s()`", ident(r->id->name)); flag = 1; } else if (r->response == p) { fprintf(freport, " and is internally used as the operation response element *`<%s>`* with the response parameters of service operation `%s()`", x, ident(r->id->name)); flag = 1; } } if (flag) { fprintf(freport, ".\n\n"); gen_report_hr(); return; } } fflush(fd); if (fd == freport) fprintf(freport, ", and has the following auto-completed declaration in %s:\n", soapStub); if (typ->type == Tstruct) { int permission = -1; int flag = 0; DBGLOG(fprintf(stderr, "\nstruct %s\n", typ->id->name)); if (cflag) { if (fd == freport) fprintf(freport, "\n struct %s {", ident(typ->id->name)); else fprintf(fd, "struct %s {", ident(typ->id->name)); } else { if (fd == freport) fprintf(freport, "\n struct SOAP_CMAC %s {", ident(typ->id->name)); else fprintf(fd, "struct SOAP_CMAC %s {", ident(typ->id->name)); } for (q = ((Table*)typ->ref)->list; q; q = q->next) { if (!cflag && permission != (q->info.sto & (Sprivate | Sprotected))) { if (q->info.sto & Sprivate) fprintf(fd, "\n private:"); else if (q->info.sto & Sprotected) fprintf(fd, "\n protected:"); else fprintf(fd, "\n public:"); permission = (q->info.sto & (Sprivate | Sprotected)); } if (cflag && q->info.typ->type == Tfun) continue; if (cflag && (q->info.sto & Stypedef)) continue; if (flag) flag = 0; else if (q->info.typ->type == Tfun || (q->info.sto & Stypedef)) ; else if (is_anyAttribute(q->info.typ)) fprintf(fd, "\n /** XML DOM attribute list */"); else if (q->info.sto & Sattribute) { if (q->info.minOccurs >= 1) fprintf(fd, "\n /** Required attribute '%s' of XML schema type '%s' */", ns_add(q, nsa), wsdl_type(q->info.typ, "")); else fprintf(fd, "\n /** Optional attribute '%s' of XML schema type '%s' */", ns_add(q, nsa), wsdl_type(q->info.typ, "")); } else if (is_soapref(q->info.typ)) fprintf(fd, "\n /** Context that manages this object */"); else if (q->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fd, "\n /** Not serialized */"); else if (q->info.sto & SmustUnderstand) fprintf(fd, "\n /** MustUnderstand */"); else if (!is_dynamic_array(typ) && is_repetition(q)) { if (q->info.maxOccurs > 1) fprintf(fd, "\n /** Sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements '%s' of XML schema type '%s'", q->info.minOccurs, q->info.maxOccurs, ns_add(q->next, nse), wsdl_type(q->next->info.typ, "")); else if (q->info.minOccurs >= 1) fprintf(fd, "\n /** Sequence of at least " SOAP_LONG_FORMAT " elements '%s' of XML schema type '%s'", q->info.minOccurs, ns_add(q->next, nse), wsdl_type(q->next->info.typ, "")); else fprintf(fd, "\n /** Sequence of elements '%s' of XML schema type '%s'", ns_add(q->next, nse), wsdl_type(q->next->info.typ, "")); fprintf(fd, " stored in dynamic array %s of length %s */", ident(q->next->sym->name), ident(q->sym->name)); flag = 1; } else if (is_anytype(q)) { fprintf(fd, "\n /** Any type of element '%s' assigned to %s with its SOAP_TYPE_ assigned to %s */\n /** Do not create a cyclic data structure through this member unless SOAP encoding or SOAP_XML_GRAPH are used for id-ref serialization */", ns_add(q->next, nse), ident(q->next->sym->name), ident(q->sym->name)); flag = 1; } else if (is_choice(q)) { Entry *r; fprintf(fd, "\n /** Union with %s variant selector %s set to one of:", c_type(q->next->info.typ), ident(q->sym->name)); if ((Table*)q->next->info.typ->ref) for (r = ((Table*)q->next->info.typ->ref)->list; r; r = r->next) fprintf(fd, " %s", soap_union_member(q->next->info.typ, r)); fprintf(fd, " */"); flag = 1; } else if (is_anyType(q->info.typ)) fprintf(fd, "\n /** XML DOM element node graph */"); else if (is_item(q)) fprintf(fd, "\n /** Simple content of XML schema type '%s' wrapped by this struct */", wsdl_type(q->info.typ, "")); else if (q->info.typ->type != Tfun && q->info.typ->type != Tunion && !(q->info.sto & (Sconst | Sprivate | Sprotected)) && !(q->info.sto & Sattribute) && !is_transient(q->info.typ) && !is_external(q->info.typ) && strncmp(q->sym->name, "__", 2)) { if (q->info.maxOccurs > 1) fprintf(fd, "\n /** Sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements '%s' of XML schema type '%s' */", q->info.minOccurs, q->info.maxOccurs, ns_add(q, nse), wsdl_type(q->info.typ, "")); else if (q->info.minOccurs >= 1) { if (q->info.nillable) fprintf(fd, "\n /** Required nillable (xsi:nil when NULL) element '%s' of XML schema type '%s' */", ns_add(q, nse), wsdl_type(q->info.typ, "")); else fprintf(fd, "\n /** Required element '%s' of XML schema type '%s' */", ns_add(q, nse), wsdl_type(q->info.typ, "")); } else fprintf(fd, "\n /** Optional element '%s' of XML schema type '%s' */", ns_add(q, nse), wsdl_type(q->info.typ, "")); } else if (is_external(q->info.typ)) fprintf(fd, "\n /** Typedef %s with custom serializer for %s */", c_type_sym(q->info.typ), c_type(q->info.typ)); else if (is_pointer_to_derived(q)) fprintf(fd, "\n /** Transient pointer to a derived type value that replaces the value of this base type %s when non-NULL */", c_type(typ)); else if (is_transient(q->info.typ)) fprintf(fd, "\n /** Transient (not serialized) */"); else if (is_imported(q->info.typ)) fprintf(fd, "\n /** Type imported from %s */", q->info.typ->imported); if (fd != freport) { if (!is_dynamic_array(typ) && !is_primclass(typ)) { if (!strncmp(q->sym->name, "__size", 6)) { if (q->info.typ->type != Tint && q->info.typ->type != Tsize) { sprintf(errbuf, "Member field '%s' is not an int or size_t type in struct '%s'", q->sym->name, typ->id->name); semwarn(errbuf); } else if (!q->next || (q->next->info.typ->type != Tpointer && !is_smart(q->next->info.typ))) { sprintf(errbuf, "Member field '%s' is not followed by a pointer member field in struct '%s'", q->sym->name, typ->id->name); semwarn(errbuf); } } else if (q->info.typ->type == Tint && !strncmp(q->sym->name, "__type", 6)) { if (!q->next || ((q->next->info.typ->type != Tpointer || ((Tnode*)q->next->info.typ->ref)->type != Tvoid))) { sprintf(errbuf, "Member field '%s' is not followed by a void pointer member field in struct '%s'", q->sym->name, typ->id->name); semwarn(errbuf); } } else if (q->info.typ->type == Tint && !strncmp(q->sym->name, "__union", 7)) { if (!q->next || ((q->next->info.typ->type != Tunion))) { sprintf(errbuf, "Member field '%s' is not followed by a union member field in struct '%s'", q->sym->name, typ->id->name); semwarn(errbuf); } } else if ((q->info.typ->type == Tint || q->info.typ->type == Tsize) && (q->info.sto & Sspecial)) { if (!q->next || (q->next->info.typ->type != Tpointer && !is_smart(q->next->info.typ) && (q->next->info.typ->type != Tunion))) { sprintf(errbuf, "Member field '%s' is not followed by a pointer or union member field in struct '%s'", q->sym->name, typ->id->name); semwarn(errbuf); } } } } fprintf(fd, "\n %s", c_storage(q->info.sto)); if (q->sym == typ->id && q->info.typ->type == Tfun) /* to emit constructor in a struct: constructor has no return value */ ((FNinfo*)q->info.typ->ref)->ret = mknone(); fprintf(fd, "%s", c_type_id(q->info.typ, q->sym->name)); if (q->info.sto & Sconstobj) fprintf(fd, " const"); if (q->info.sto & Sfinal) fprintf(fd, " final"); if (q->info.sto & Soverride) fprintf(fd, " override"); if (q->info.sto & Sconst) fprintf(fd, "%s;", c_init(q)); else { fprintf(fd, ";"); if (q->info.hasval) { if (q->info.fixed) fprintf(fd, "\t/**< initialized with fixed value%s */", c_init(q)); else fprintf(fd, "\t/**< initialized with default value%s */", c_init(q)); } else if (q->info.ptrval) { if (q->info.fixed) fprintf(fd, "\t/**< optional with fixed value%s */", c_init(q)); else fprintf(fd, "\t/**< optional with default value%s */", c_init(q)); } } } if (!cflag && !is_transient(typ) && !is_volatile(typ)) { fprintf(fd, "\n public:\n /** Return unique type id %s */\n long soap_type() const { return %s; }", soap_type(typ), soap_type(typ)); if ((s = union_member(typ))) { if (fd != freport) { sprintf(errbuf, "struct '%s' cannot be assigned a default constructor because it is directly or indirectly used as a member of union '%s'", typ->id->name, ident(s)); semwarn(errbuf); } } else { if (!has_constructor(typ)) { Table *t; Entry *p; fprintf(fd, "\n /** Constructor with member initializations */"); gen_constructor(fd, typ); for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Treference || p->info.typ->type == Trvalueref) { sprintf(errbuf, "no constructor for '%s' to explicitly initialize the reference member '%s'", typ->id->name, p->sym->name); semwarn(errbuf); } } } } /* not necessary to add a default destructor, keep the C -> C++ transparency of structs if (!has_destructor(typ)) fprintf(fd, "\n\t ~%s() { }", ident(typ->id->name)); */ } if (Ecflag) fprintf(fd, "\n /** Friend duplicator */\n friend SOAP_FMAC1 %s * SOAP_FMAC2 %s_dup_%s(struct soap*, %s*, %s);", c_type(typ), fprefix, c_ident(typ), c_type(typ), c_type_constptr_id(typ, "const*")); if (Edflag) fprintf(fd, "\n /** Friend deleter */\n friend SOAP_FMAC1 void SOAP_FMAC2 %s_del_%s(%s);", fprefix, c_ident(typ), c_type_constptr_id(typ, "const*")); fprintf(fd, "\n /** Friend allocator */\n friend SOAP_FMAC1 %s * SOAP_FMAC2 %s_instantiate_%s(struct soap*, int, const char*, const char*, size_t*);", c_ident(typ), fprefix, c_ident(typ)); } if (!((Table*)typ->ref)->list) { if (cflag && fd != freport) fprintf(fd, "\n#ifdef WITH_NOEMPTYSTRUCT\n\tchar dummy;\t/* empty struct is a GNU extension */\n#endif"); } if (fd == freport) { fprintf(freport, "\n };\n\n"); if (!is_transient(p->info.typ) && !is_header_or_fault(p->info.typ)) { const char *ns = prefix_of(p->sym->name); int uf = uflag; uflag = 1; gen_report_members(p, nsa, nse); fprintf(freport, "The following operations on `%s` are available:\n\n", c_type(p->info.typ)); if (cflag) { fprintf(freport, "- `(%s *)soap_malloc(struct soap*, sizeof(%s))` raw managed allocation\n", c_type(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `%s *soap_new_%s(struct soap*, int n)` managed allocation with default initialization of one `%s` when `n` = 1 or array `%s[n]` when `n` > 1\n", c_type(p->info.typ), c_ident(p->info.typ), c_type(p->info.typ), c_type(p->info.typ)); } else { fprintf(freport, "- `%s *soap_new_%s(struct soap*)` managed allocation with default initialization\n", c_type(p->info.typ), c_ident(p->info.typ)); fprintf(freport, "- `%s *soap_new_%s(struct soap*, int n)` managed allocation with default initialization of array `%s[n]`\n", c_type(p->info.typ), c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `%s *soap_new_req_%s(struct soap*", c_type(p->info.typ), c_ident(p->info.typ)); gen_report_req_params(p->info.typ); fprintf(freport, ")` managed allocation with required members assigned the values of these parameters, with all other members default initialized\n"); fprintf(freport, "- `%s *soap_new_set_%s(struct soap*", c_type(p->info.typ), c_ident(p->info.typ)); gen_report_set_params(p->info.typ); fprintf(freport, ")` managed allocation with the public members assigned the values of these parameters\n"); } fprintf(freport, "- `void soap_default_%s(struct soap*, %s*)` (re)set to default initialization values\n", c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `int soap_write_%s(struct soap*, const %s*)` serialize to XML, returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `int soap_read_%s(struct soap*, %s*)` deserialize from XML, returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `int soap_PUT_%s(struct soap*, const char *URL, const %s*)` REST PUT XML, returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `int soap_PATCH_%s(struct soap*, const char *URL, const %s*)` REST PATCH XML, returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `int soap_POST_send_%s(struct soap*, const char *URL, const %s*)` REST POST send XML (should be followed by a `soap_POST_recv_Type`), returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `int soap_POST_recv_%s(struct soap*, %s*)` REST POST receive XML (after a `soap_POST_send_Type`), returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `int soap_GET_%s(struct soap*, const char *URL, %s*)` REST GET XML, returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type(p->info.typ)); if (!wflag) { if (!is_invisible(p->sym->name) && !has_ns_eq("xsd", p->sym->name) && !is_header_or_fault(typ)) { s = ns_of(p->sym->name); if (s && *s && has_ns_eq(NULL, p->sym->name)) fprintf(freport, "\nThe component of XML schema type *`%s`* in schema \"[%s](#doc-namespaces)\" is:\n\n", x, s); else fprintf(freport, "\nThe component of XML schema type *`%s`* is:\n\n", x); gen_schema_type(freport, NULL, p, ns, ns, 1, NULL, NULL); } } fprintf(freport, "\n"); uflag = uf; } } else fprintf(fd, "\n};"); } else if (typ->type == Tclass) { int permission = -1; int flag = 0; DBGLOG(fprintf(stderr, "\nclass %s\n", typ->id->name)); if (fd == freport) fprintf(fd, "\n class SOAP_CMAC %s", ident(typ->id->name)); else fprintf(fd, "class SOAP_CMAC %s", ident(typ->id->name)); if (typ->base) fprintf(fd, " : public %s", ident(typ->base->name)); fprintf(fd, " {"); for (q = ((Table*)typ->ref)->list; q; q = q->next) { if (permission != (q->info.sto & (Sprivate | Sprotected))) { if (q->info.sto & Sprivate) fprintf(fd, "\n private:"); else if (q->info.sto & Sprotected) fprintf(fd, "\n protected:"); else fprintf(fd, "\n public:"); permission = (q->info.sto & (Sprivate | Sprotected)); } if (is_anyAttribute(q->info.typ)) fprintf(fd, "\n /// XML DOM attribute list"); else if (q->info.sto & Sattribute) { if (q->info.minOccurs >= 1) fprintf(fd, "\n /// Required attribute '%s' of XML schema type '%s'", ns_add(q, nsa), wsdl_type(q->info.typ, "")); else fprintf(fd, "\n /// Optional attribute '%s' of XML schema type '%s'", ns_add(q, nsa), wsdl_type(q->info.typ, "")); } if (flag) flag = 0; else if (q->info.typ->type == Tfun || (q->info.sto & Stypedef)) ; else if (is_soapref(q->info.typ)) fprintf(fd, "\n /// Context that manages this object"); else if (q->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fd, "\n /// Not serialized"); else if (q->info.sto & SmustUnderstand) fprintf(fd, "\n /// MustUnderstand"); else if (!is_dynamic_array(typ) && is_repetition(q)) { if (q->info.maxOccurs > 1) fprintf(fd, "\n /// Sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements '%s' of XML schema type '%s'", q->info.minOccurs, q->info.maxOccurs, ns_add(q->next, nse), wsdl_type(q->next->info.typ, "")); else if (q->info.minOccurs >= 1) fprintf(fd, "\n /// Sequence of at least " SOAP_LONG_FORMAT " elements '%s' of XML schema type '%s'", q->info.minOccurs, ns_add(q->next, nse), wsdl_type(q->next->info.typ, "")); else fprintf(fd, "\n /// Sequence of elements '%s' of XML schema type '%s'", ns_add(q->next, nse), wsdl_type(q->next->info.typ, "")); fprintf(fd, " stored in dynamic array %s of length %s", ident(q->next->sym->name), ident(q->sym->name)); flag = 1; } else if (is_anytype(q)) { fprintf(fd, "\n /// Any type of element '%s' assigned to %s with its SOAP_TYPE_ assigned to %s\n /// Do not create a cyclic data structure through this member unless SOAP encoding or SOAP_XML_GRAPH are used for id-ref serialization", ns_add(q->next, nse), ident(q->next->sym->name), ident(q->sym->name)); flag = 1; } else if (is_choice(q)) { Entry *r; fprintf(fd, "\n /// Union with %s variant selector %s set to one of:", c_type(q->next->info.typ), ident(q->sym->name)); for (r = ((Table*)q->next->info.typ->ref)->list; r; r = r->next) fprintf(fd, " %s", soap_union_member(q->next->info.typ, r)); flag = 1; } else if (is_anyType(q->info.typ)) fprintf(fd, "\n /// XML DOM element node graph"); else if (is_item(q)) fprintf(fd, "\n /// Simple content of XML schema type '%s' wrapped by this struct", wsdl_type(q->info.typ, "")); else if (q->info.typ->type != Tfun && q->info.typ->type != Tunion && !(q->info.sto & (Sconst | Sprivate | Sprotected)) && !(q->info.sto & Sattribute) && !is_transient(q->info.typ) && !is_external(q->info.typ) && strncmp(q->sym->name, "__", 2)) { if (q->info.maxOccurs > 1) fprintf(fd, "\n /// Sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements '%s' of XML schema type '%s'", q->info.minOccurs, q->info.maxOccurs, ns_add(q, nse), wsdl_type(q->info.typ, "")); else if (q->info.minOccurs >= 1) { if (q->info.nillable) fprintf(fd, "\n /// Required nillable (xsi:nil when NULL) element '%s' of XML schema type '%s'", ns_add(q, nse), wsdl_type(q->info.typ, "")); else fprintf(fd, "\n /// Required element '%s' of XML schema type '%s'", ns_add(q, nse), wsdl_type(q->info.typ, "")); } else fprintf(fd, "\n /// Optional element '%s' of XML schema type '%s'", ns_add(q, nse), wsdl_type(q->info.typ, "")); } else if (is_external(q->info.typ)) fprintf(fd, "\n /// Typedef %s with custom serializer for %s", c_type_sym(q->info.typ), c_type(q->info.typ)); else if (is_pointer_to_derived(q)) fprintf(fd, "\n /// Transient pointer to a derived type value that replaces the value of this base type %s when non-NULL", c_type(typ)); else if (is_transient(q->info.typ)) fprintf(fd, "\n /// Transient (not serialized)"); else if (is_imported(q->info.typ)) fprintf(fd, "\n /// Type imported from %s", q->info.typ->imported); if (fd != freport) { if (!is_dynamic_array(typ) && !is_primclass(typ)) { if (!strncmp(q->sym->name, "__size", 6)) { if (q->info.typ->type != Tint && q->info.typ->type != Tsize) { sprintf(errbuf, "Member field '%s' is not an int or size_t type in class '%s'", q->sym->name, typ->id->name); semwarn(errbuf); } else if (!q->next || (q->next->info.typ->type != Tpointer && !is_smart(q->next->info.typ))) { sprintf(errbuf, "Member field '%s' is not followed by a pointer member field in class '%s'", q->sym->name, typ->id->name); semwarn(errbuf); } } else if (q->info.typ->type == Tint && !strncmp(q->sym->name, "__type", 6)) { if (!q->next || ((q->next->info.typ->type != Tpointer || ((Tnode*)q->next->info.typ->ref)->type != Tvoid))) { sprintf(errbuf, "Member field '%s' is not followed by a void pointer member field in class '%s'", q->sym->name, typ->id->name); semwarn(errbuf); } } else if (q->info.typ->type == Tint && !strncmp(q->sym->name, "__union", 7)) { if (!q->next || ((q->next->info.typ->type != Tunion))) { sprintf(errbuf, "Member field '%s' is not followed by a union member field in class '%s'", q->sym->name, typ->id->name); semwarn(errbuf); } } else if ((q->info.typ->type == Tint || q->info.typ->type == Tsize) && (q->info.sto & Sspecial)) { if (!q->next || (q->next->info.typ->type != Tpointer && !is_smart(q->next->info.typ) && (q->next->info.typ->type != Tunion))) { sprintf(errbuf, "Member field '%s' is not followed by a pointer or union member field in class '%s'", q->sym->name, typ->id->name); semwarn(errbuf); } } } } fprintf(fd, "\n %s", c_storage(q->info.sto)); fprintf(fd, "%s", c_type_id(q->info.typ, q->sym->name)); if (q->info.sto & Sconstobj) fprintf(fd, " const"); if (q->info.sto & Sfinal) fprintf(fd, " final"); if (q->info.sto & Soverride) fprintf(fd, " override"); if (q->info.sto & Sabstract) fprintf(fd, " = 0;"); else if (q->info.sto & Sconst) fprintf(fd, "%s;", c_init(q)); else { fprintf(fd, ";"); if (q->info.hasval) { if (q->info.fixed) fprintf(fd, "\t///< initialized with fixed value%s", c_init(q)); else fprintf(fd, "\t///< initialized with default value%s", c_init(q)); } else if (q->info.ptrval) { if (q->info.fixed) fprintf(fd, "\t///< optional with fixed value%s", c_init(q)); else fprintf(fd, "\t///< optional with default value%s", c_init(q)); } } } if (!is_transient(typ) && !is_volatile(typ)) { fprintf(fd, "\n public:"); fprintf(fd, "\n /// Return unique type id %s", soap_type(typ)); fprintf(fd, "\n virtual long soap_type(void) const { return %s; }", soap_type(typ)); fprintf(fd, "\n /// (Re)set members to default values"); fprintf(fd, "\n virtual void soap_default(struct soap*);"); fprintf(fd, "\n /// Serialize object to prepare for SOAP 1.1/1.2 encoded output (or with SOAP_XML_GRAPH) by analyzing its (cyclic) structures"); fprintf(fd, "\n virtual void soap_serialize(struct soap*) const;"); if (Etflag) fprintf(fd, "\n virtual void soap_traverse(struct soap*, const char *s, soap_walker, soap_walker);"); fprintf(fd, "\n /// Output object in XML, compliant with SOAP 1.1 encoding style, return error code or SOAP_OK"); fprintf(fd, "\n virtual int soap_put(struct soap*, const char *tag, const char *type) const;"); fprintf(fd, "\n /// Output object in XML, with tag and optional id attribute and xsi:type, return error code or SOAP_OK"); fprintf(fd, "\n virtual int soap_out(struct soap*, const char *tag, int id, const char *type) const;"); fprintf(fd, "\n /// Get object from XML, compliant with SOAP 1.1 encoding style, return pointer to object or NULL on error"); fprintf(fd, "\n virtual void *soap_get(struct soap*, const char *tag, const char *type);"); fprintf(fd, "\n /// Get object from XML, with matching tag and type (NULL matches any tag and type), return pointer to object or NULL on error"); fprintf(fd, "\n virtual void *soap_in(struct soap*, const char *tag, const char *type);"); fprintf(fd, "\n /// Return a new object of type %s, default initialized and not managed by a soap context", c_type(typ)); fprintf(fd, "\n virtual %s *soap_alloc(void) const { return SOAP_NEW_UNMANAGED(%s); }", c_type(typ), c_type(typ)); if (Ecflag) { fprintf(fd, "\n /// Return a duplicate of this object by deep copying, replicating all deep cycles and shared pointers when a managing soap context is provided as argument.\n /// Deep copy is a tree when argument is NULL, but the presence of deep cycles will lead to non-termination.\n /// Use flag SOAP_XML_TREE with a managing context to copy into a tree without cycles and pointers to shared objects"); fprintf(fd, "\n virtual %s *soap_dup(struct soap *soap = NULL, void *dest = NULL) const { return %s_dup_%s(soap, (%s*)dest, this); }", c_type(typ), fprefix, c_ident(typ), c_type(typ)); } if (Edflag) { fprintf(fd, "\n /// Delete heap-allocated members of this object by deep deletion ONLY IF this object and all of its (deep) members are not managed by a soap context AND the deep structure is a tree (no cycles and co-referenced objects by way of multiple (non-smart) pointers pointing to the same data)\n /// Can be safely used after soap_dup(NULL) to delete the deep copy"); fprintf(fd, "\n virtual void soap_del(void) const { %s_del_%s(this); }", fprefix, c_ident(typ)); } if ((s = union_member(typ))) { if (fd != freport) { sprintf(errbuf, "class '%s' cannot be assigned a default constructor because it is directly or indirectly used as a member of union '%s'", typ->id->name, ident(s)); semwarn(errbuf); } } else { if (!has_constructor(typ)) { Table *t; Entry *p; fprintf(fd, "\n public:\n /// Constructor with default initializations"); gen_constructor(fd, typ); for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Treference || p->info.typ->type == Trvalueref) { sprintf(errbuf, "no constructor for '%s' to explicitly initialize the reference member '%s'", typ->id->name, p->sym->name); semwarn(errbuf); } } } } if (!has_destructor(typ)) fprintf(fd, "\n virtual ~%s() { }", c_ident(typ)); } if (Ecflag) fprintf(fd, "\n /// Friend duplicator\n friend SOAP_FMAC1 %s * SOAP_FMAC2 %s_dup_%s(struct soap*, %s*, %s);", c_type(typ), fprefix, c_ident(typ), c_type(typ), c_type_constptr_id(typ, "const*")); if (Edflag) fprintf(fd, "\n /// Friend deleter\n friend SOAP_FMAC1 void SOAP_FMAC2 %s_del_%s(%s);", fprefix, c_ident(typ), c_type_constptr_id(typ, "const*")); fprintf(fd, "\n /// Friend allocator used by soap_new_%s(struct soap*, int)\n friend SOAP_FMAC1 %s * SOAP_FMAC2 %s_instantiate_%s(struct soap*, int, const char*, const char*, size_t*);", c_ident(typ), c_ident(typ), fprefix, c_ident(typ)); /* the use of 'friend' causes problems linking static functions. Adding these friends could enable serializing protected/private members (which is not implemented) fprintf(fd, "\n friend %s *soap_in_%s(struct soap*, const char*, %s*, const char*);", typ->id->name, typ->id->name, typ->id->name); fprintf(fd, "\n friend int soap_out_%s(struct soap*, const char*, int, const %s*, const char*);", typ->id->name, typ->id->name); */ } if (fd == freport) { fprintf(freport, "\n };\n\n"); if (!is_transient(p->info.typ) && !is_header_or_fault(p->info.typ)) { const char *ns = prefix_of(p->sym->name); int uf = uflag; uflag = 1; gen_report_members(p, nsa, nse); fprintf(freport, "The following operations on `%s` are available:\n\n", c_type(p->info.typ)); fprintf(freport, "- `%s *soap_new_%s(struct soap*)` managed allocation with default initialization\n", c_type(p->info.typ), c_ident(p->info.typ)); fprintf(freport, "- `%s *soap_new_%s(struct soap*, int n)` managed allocation of array `%s[n]`\n", c_type(p->info.typ), c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `%s *soap_new_req_%s(struct soap*", c_type(p->info.typ), c_ident(p->info.typ)); gen_report_req_params(p->info.typ); fprintf(freport, ")` managed allocation with required members assigned the values of these parameters, with all other members default initialized\n"); fprintf(freport, "- `%s *soap_new_set_%s(struct soap*", c_type(p->info.typ), c_ident(p->info.typ)); gen_report_set_params(p->info.typ); fprintf(freport, ")` managed allocation with public members assigned the values of these parameters\n"); if (is_external(p->info.typ) || is_volatile(p->info.typ)) fprintf(freport, "- `void soap_default_%s(struct soap*, %s*)` (re)set members to default initialization values\n", c_ident(p->info.typ), c_type(p->info.typ)); else fprintf(freport, "- `void %s::soap_default(struct soap*)` (re)set members to default values\n", c_type(p->info.typ)); fprintf(freport, "- `int soap_write_%s(struct soap*, const %s*)` serialize to XML, returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `int soap_PUT_%s(struct soap*, const char *URL, const %s*)` REST PUT XML, returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `int soap_PATCH_%s(struct soap*, const char *URL, const %s*)` REST PATCH XML, returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `int soap_POST_send_%s(struct soap*, const char *URL, const %s*)` REST POST send XML (MUST be followed by a `soap_POST_recv_Type`), returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `int soap_read_%s(struct soap*, %s*)` deserialize from XML, returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `int soap_GET_%s(struct soap*, const char *URL, %s*)` REST GET XML, returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `int soap_POST_recv_%s(struct soap*, %s*)` REST POST receive XML (after a `soap_POST_send_Type`), returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type(p->info.typ)); if (!wflag) { if (!is_invisible(p->sym->name) && !has_ns_eq("xsd", p->sym->name) && !is_header_or_fault(typ)) { s = ns_of(p->sym->name); if (s && *s && has_ns_eq(NULL, p->sym->name)) fprintf(freport, "\nThe component of XML schema type *`%s`* in schema \"[%s](#doc-namespaces)\" is:\n\n", x, s); else fprintf(freport, "\nThe component of XML schema type *`%s`* is:\n\n", x); gen_schema_type(freport, NULL, p, ns, ns, 1, NULL, NULL); } } fprintf(freport, "\n"); uflag = uf; } } else fprintf(fd, "\n};"); } else if (typ->type == Tunion) { int i = 1; if (fd == freport) fprintf(fd, "\n union %s\n {", ident(typ->id->name)); else fprintf(fd, "union %s\n{", ident(typ->id->name)); for (q = ((Table*)typ->ref)->list; q; q = q->next) { if (q->info.typ->type == Tfun) { if (q->sym == typ->id) /* to emit constructor in a union: constructor has no return value */ ((FNinfo*)q->info.typ->ref)->ret = mknone(); } else { fprintf(fd, "\n #define %s\t(%d)\t/**< union variant selector value for member %s */", soap_union_member(typ, q), i, ident(q->sym->name)); i++; if (q->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fd, "\n /** Not serialized */"); else if (is_transient(q->info.typ)) fprintf(fd, "\n /** Transient (not serialized) */"); else if (is_external(q->info.typ)) fprintf(fd, "\n /** Typedef %s with custom serializer for %s */", c_type_sym(q->info.typ), c_type(q->info.typ)); if (q->info.sto & Sattribute) { sprintf(errbuf, "union '%s' contains attribute declarations", typ->id->name); semwarn(errbuf); } } fprintf(fd, "\n %s", c_storage(q->info.sto)); fprintf(fd, "%s;", c_type_id(q->info.typ, q->sym->name)); } if (!((Table*)typ->ref)->list) { if (cflag && fd != freport) fprintf(fd, "\n#ifdef WITH_NOEMPTYSTRUCT\n\tchar dummy;\t/* empty union is a GNU extension */\n#endif"); } if (fd == freport) fprintf(fd, "\n };\n\n"); else fprintf(fd, "\n};"); } if (fd == freport) { gen_report_hr(); } else { if (is_volatile(typ)) fprintf(fd, "\n#endif"); fprintf(fd, "\n#endif"); if (is_header_or_fault(typ) || is_body(typ)) fprintf(fd, "\n#endif"); } fflush(fd); } void gen_constructor(FILE *fd, Tnode *typ) { Table *t = typ->ref; Entry *p; const char *sep = " :"; if (!t) return; fprintf(fd, "\n %s()", c_ident(typ)); for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) continue; if ((p->info.sto & Sstatic)) continue; if (p->info.hasval) fprintf(fd, "%s %s(%s)", sep, ident(p->sym->name), c_init_a(p, "")); else fprintf(fd, "%s %s()", sep, ident(p->sym->name)); sep = ","; } fprintf(fd, " { }"); fflush(fd); } void generate_header(Table *t) { Service *sp; Entry *p, *q; int i; if (rflag) { fprintf(freport, "
\n@tableofcontents @section README\n\nTo view this file in the Firefox web browser, download readmeviewer.html from https://www.genivia.com/files/readmeviewer.html.zip, unzip and copy it to the same directory where this soapReadme.md file is located, then open it in Firefox to view the contents of soapReadme.md.\n\nThis markdown file is compatible with Doxygen.\n
\n\n"); fprintf(freport, "## Overview {#doc-overview}\n\nThis report was generated by soapcpp2 v" VERSION " for interface header file [%s](%s) with options -r %s%s%s%s%s%s%s%s%s\n\n", filename, filename, copt ? copt : "", soap_version < 0 ? " -0 " : " ", Cflag ? "-C " : "", Sflag ? "-S " : "", Lflag ? "-L " : "", iflag ? "-i " : jflag ? "-j " : "", wflag ? "-w " : "", namespaceid ? "-q" : strcmp(prefix, "soap") ? "-p" : "", strcmp(prefix, "soap") ? prefix : ""); for (sp = services; sp; sp = sp->next) { if (sp->documentation) { gen_text(freport, sp->documentation); fprintf(freport, "\n\n"); } } fprintf(freport, "### Tools\n\nThe **wsdl2h** command line tool takes a set of WSDL and XSD files to generate a data binding interface header file. This interface header file is similar to a C/C++ header file and contains declarations of C/C++ types and functions with explanatory comments, directives, and annotations. Types are declared in this interface header file as serializable. Functions are declared as Web service operations for the client and server sides.\n\nThe **soapcpp2** command line tool takes an interface header file (i.e. a header file) such as [%s](%s) to generate the data binding implementation. This implementation includes XML serializers and source code for the client and server side. An interface header file for soapcpp2 can be a regular C/C++ header file with type and function declarations (without code), and include annotations to declare XML schema-related properties.\n\n", filename, filename); fprintf(freport, "### Files\n\nThe following %s source code files were generated by soapcpp2 for interface header file [%s](%s):\n\n", cflag ? "C" : copt ? copt + 1 : "c++", filename, filename); fprintf(freport, "- [%s](%s) contains an annotated copy of [%s](%s) and of the imported files (if any), where most of the information in this report [%s](%s) is sourced from (this header file also #includes \"stdsoap2.h\")\n", soapStub, pathsoapStub, filename, filename, soapReadme, pathsoapReadme); fprintf(freport, "- [%s](%s) declares allocation and (de)serialization functions for each C/C++ type, to #include in projects (this header file also #includes \"%s\")\n", soapH, pathsoapH, soapStub); fprintf(freport, "- [%s](%s) defines allocation and (de)serialization functions for each C/C++ type, to compile with a project\n", soapC, pathsoapC); if (!Sflag) { if (!iflag && !jflag) { fprintf(freport, "- [%s](%s) defines client call stub functions for service invocation, to compile with a project\n", soapClient, pathsoapClient); if (!Lflag) fprintf(freport, "- [%s](%s) combines %s with %s into one \"library\" file, intended for combining multiple clients and servers that are separately generated with soapcpp2 option -p, thereby preventing serializer naming conflicts (this makes serialization functions locally visible to the client/server as static functions)\n", soapClientLib, pathsoapClientLib, soapC, soapClient); } else { fprintf(freport, "- See [Web client proxy class](#doc-client) for the client-side source code files to use\n"); } } if (!Cflag) { if (!iflag && !jflag) { fprintf(freport, "- [%s](%s) defines server functions, including the service dispatcher that calls back-end service operations, to compile with a project\n", soapServer, pathsoapServer); if (!Lflag) fprintf(freport, "- [%s](%s) combines %s with %s into one \"library\" file, intended for combining multiple clients and servers that are separately generated with soapcpp2 option -p, thereby preventing serializer function naming conflicts (this makes serialization functions locally visible to the client/server as static functions)\n", soapServerLib, pathsoapServerLib, soapC, soapServer); } else { fprintf(freport, "- See [Web service class](#doc-server) for the server-side source code files to use\n"); } } fprintf(freport, "\nAlso compile stdsoap2.%s (and dom.%s %s XML DOM is used) with a project (or link libgsoapssl%s.a) and use the following compile-time options:\n\n- `-DWITH_OPENSSL` to enable HTTPS with OpenSSL\n- `-DWITH_GNUTLS` to enable HTTPS with GNUTLS\n- `-DWITH_DOM` is required when using the WS-Security plugin\n- `-DWITH_GZIP` to enable message compression\n\nSee the gSOAP documentation for additional options.\n\n### Contents\n\nThis report has the following contents describing the data binding interface types, and the client- and the server-side operations (if any):\n\n", cflag ? "c" : "cpp", cflag ? "c" : "cpp", is_anyType_flag ? "because" : "if", cflag ? "" : "++"); if (enumtable && enumtable->list) fprintf(freport, "- [enumeration types](#doc-enums)\n"); if (classtable && classtable->list) fprintf(freport, "- [%sstruct and union types](#doc-classes)\n", cflag ? "" : "class, "); if (typetable && typetable->list) fprintf(freport, "- [typedefs](#doc-typedefs)\n"); fprintf(freport, "- [summary of serializable types](#doc-types)\n"); fprintf(freport, "- [schemas and namespaces](#doc-namespaces)\n"); if (!Sflag) { if (!iflag && !jflag) fprintf(freport, "- [Web client operations](#doc-client) lists the service operations to call\n"); else fprintf(freport, "- [Web client proxy class](#doc-client) lists the methods to invoke\n"); } if (!Cflag) { if (!iflag && !jflag) fprintf(freport, "- [Web server operations](#doc-server) lists the service operations to implement when developing a service\n"); else fprintf(freport, "- [Web service class](#doc-server) lists the methods to implement when developing a service\n"); } fprintf(freport, "\n"); gen_report_hr(); } if (enumtable && enumtable->list) { Table *r = mktable(NULL); banner(fheader, "Enumeration Types"); fflush(fheader); if (rflag) fprintf(freport, "## Enumeration Types {#doc-enums}\n\n\n\n"); for (p = enumtable->list; p; p = p->next) { if (rflag && p->info.typ->ref) fprintf(freport, "\n"); } freetable(r); if (rflag) { int uf = uflag; uflag = 1; fprintf(freport, "
Type Declared Serializable Bitmask Values
%s %s:%d %s %s ", c_ident(p->info.typ), c_type(p->info.typ), p->filename, p->lineno, !is_transient(p->info.typ) ? "yes" : "", is_mask(p->info.typ) ? "yes" : ""); if (!is_imported(p->info.typ) && (!is_transient(p->info.typ) || p->info.typ->ref)) { int enum64 = False; const char *x; x = xsi_type(p->info.typ); if (!x || !*x) x = wsdl_type(p->info.typ, ""); fprintf(fheader, "\n\n/* %s:%d */", p->filename, p->lineno); fprintf(fheader, "\n#ifndef %s", soap_type(p->info.typ)); if (namespaceid) fprintf(fheader, "\n#define %s (-%d)\n", soap_type(p->info.typ), p->info.typ->num); /* namespaced SOAP_TYPE is negative to avoid clashes */ else fprintf(fheader, "\n#define %s (%d)", soap_type(p->info.typ), p->info.typ->num); if (is_volatile(p->info.typ)) fprintf(fheader, "\n#if 0 /* Volatile: not declared here */"); if (is_mask(p->info.typ)) fprintf(fheader, "\n/* Bitmask %s */", x); else fprintf(fheader, "\n/* %s */", x); if ((Table*)p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (q->info.val.i > 0x7FFFLL || q->info.val.i < -0x8000LL) { enum64 = True; break; } } } if (cflag && p->info.typ->type == Tenum && p->sym->token == TYPE) fprintf(fheader, "\ntypedef "); else fprintf(fheader, "\n"); if (p->info.typ->width == 4 || is_mask(p->info.typ)) { if (p->info.typ->type == Tenumsc) { if (enum64) fprintf(fheader, "enum class %s : int64_t {", ident(p->info.typ->id->name)); else fprintf(fheader, "enum class %s {", ident(p->info.typ->id->name)); } else fprintf(fheader, "enum %s {", ident(p->info.typ->id->name)); } else { const char *t; switch (p->info.typ->width) { case 1: t = "int8_t"; break; case 2: t = "int16_t"; break; case 4: t = "int32_t"; break; default: t = "int64_t"; break; } if (p->info.typ->type == Tenumsc) fprintf(fheader, "enum class %s : %s {", ident(p->info.typ->id->name), t); else fprintf(fheader, "enum %s : %s {", ident(p->info.typ->id->name), t); } if ((Table*)p->info.typ->ref) { const char *c = ""; for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { Entry *e = NULL; if (rflag) fprintf(freport, "%s %s ", c, ident(q->sym->name)); if (p->info.typ->type == Tenum && (e = entry(r, q->sym)) && e->info.val.i == q->info.val.i) fprintf(fheader, " /* %s\n\t%s = " SOAP_LONG_FORMAT " */", c, ident(q->sym->name), q->info.val.i); else { if (q->info.val.i > 0 && q->info.val.i < 128 && isalpha((int)q->info.val.i)) fprintf(fheader, "%s\n\t%s = '%c'", c, ident(q->sym->name), (int)q->info.val.i); else if (q->info.val.i <= 0x7FFFLL && q->info.val.i >= -0x8000LL) fprintf(fheader, "%s\n\t%s = " SOAP_LONG_FORMAT, c, ident(q->sym->name), q->info.val.i); else fprintf(fheader, "%s\n\t%s = " SOAP_LONG_FORMAT "LL", c, ident(q->sym->name), q->info.val.i); if (p->info.typ->type == Tenum && !e) { e = enter(r, q->sym); e->info.val.i = q->info.val.i; } c = ","; } } } else { if (!is_transient(p->info.typ) && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_imported(p->info.typ)) { sprintf(errbuf, "%s declared at %s:%d has no content, requires enum constants", c_type(p->info.typ), p->filename, p->lineno); semwarn(errbuf); } } if (cflag && p->info.typ->type == Tenum && p->sym->token == TYPE) fprintf(fheader, "\n} %s;", ident(p->sym->name)); else fprintf(fheader, "\n};"); if (is_volatile(p->info.typ)) fprintf(fheader, "\n#endif"); fprintf(fheader, "\n#endif"); } if (rflag && p->info.typ->ref) fprintf(freport, "
\n\n"); for (p = enumtable->list; p; p = p->next) { const char *ns = prefix_of(p->sym->name); const char *x; x = xsi_type(p->info.typ); if (!x || !*x) x = wsdl_type(p->info.typ, ""); fprintf(freport, "\n\n", c_ident(p->info.typ)); fprintf(freport, "### `%s`\n\n", c_type(p->info.typ)); gen_report_type_doc(p); fprintf(freport, "This enum%s type is declared in [%s](%s) at line %d ", p->info.typ->type == Tenumsc ? " class" : "", p->filename, p->filename, p->lineno); if (is_mask(p->info.typ)) fprintf(freport, "and is a bitmask type, meaning that it represents a set of values created with bit-wise `|` (bitor) operations, "); if ((Table*)p->info.typ->ref) { const char *c = ""; fprintf(freport, "and has values "); for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (!is_mask(p->info.typ) && q->info.val.i > 0 && q->info.val.i < 128 && isalpha((int)q->info.val.i)) fprintf(freport, "%s `%s` (= " SOAP_LONG_FORMAT " = ASCII '%c')", c, ident(q->sym->name), q->info.val.i, (int)q->info.val.i); else fprintf(freport, "%s `%s` (= " SOAP_LONG_FORMAT ")", c, ident(q->sym->name), q->info.val.i); gen_report_member(p, q); c = ","; } } fprintf(freport, ".\n\n"); if (!is_transient(p->info.typ)) { if (cflag) { fprintf(freport, "- `(%s *)soap_malloc(struct soap*, sizeof(%s))` raw managed allocation\n", c_type(p->info.typ), c_type(p->info.typ)); fprintf(freport, "- `%s *soap_new_%s(struct soap*, int n)` managed allocation with default initialization of one `%s` when `n` = 1 or array `%s[n]` when `n` > 1\n", c_type(p->info.typ), c_ident(p->info.typ), c_type(p->info.typ), c_type(p->info.typ)); } else { fprintf(freport, "- `%s *soap_new_%s(struct soap*)` managed allocation with default initialization\n", c_type(p->info.typ), c_ident(p->info.typ)); fprintf(freport, "- `%s *soap_new_%s(struct soap*, int n)` managed allocation with default initialization of array `%s[n]`\n", c_type(p->info.typ), c_ident(p->info.typ), c_type(p->info.typ)); } fprintf(freport, "- `void soap_default_%s(struct soap*, %s)` set to default value\n", c_ident(p->info.typ), c_type_id(p->info.typ, "*value")); fprintf(freport, "- `const char *soap_%s2s(struct soap*, %s)` returns string-converted value in temporary string buffer\n", c_ident(p->info.typ), c_type_id(p->info.typ, "value")); fprintf(freport, "- `int soap_s2%s(struct soap*, const char*, %s)` convert string to value, returns `SOAP_OK` or error code\n", c_ident(p->info.typ), c_type_id(p->info.typ, "*value")); if (!wflag) { if (!is_invisible(p->sym->name) && !has_ns_eq("xsd", p->sym->name)) { const char *s = ns_of(p->sym->name); if (s && *s && has_ns_eq(NULL, p->sym->name)) fprintf(freport, "\nThe component of XML schema type *`%s`* in schema \"[%s](#doc-namespaces)\" is:\n\n", x, s); else fprintf(freport, "\nThe component of XML schema type *`%s`* is:\n\n", x); gen_schema_type(freport, NULL, p, ns, ns, 1, NULL, NULL); } } fprintf(freport, "\n"); } gen_report_hr(); } uflag = uf; } } banner(fheader, "Types with Custom Serializers"); fflush(fheader); if (typetable) { for (p = typetable->list; p; p = p->next) { if (is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_imported(p->info.typ)) { fprintf(fheader, "\n\n/* %s:%d */", p->filename, p->lineno); fprintf(fheader, "\n#ifndef %s", soap_type(p->info.typ)); if (namespaceid) fprintf(fheader, "\n#define %s (-%d)\n", soap_type(p->info.typ), p->info.typ->num); /* namespaced SOAP_TYPE is negative to avoid clashes */ else fprintf(fheader, "\n#define %s (%d)", soap_type(p->info.typ), p->info.typ->num); fprintf(fheader, "\n%s%s;", c_storage(p->info.sto), c_type_synonym_id(p->info.typ, p->sym->name)); fprintf(fheader, "\n#endif"); } } } if (typetable) { for (p = typetable->list; p; p = p->next) { if (p->info.typ->type == Tclass && is_eq(p->info.typ->sym->name, "xsd__QName") && !is_external(p->info.typ) && !is_imported(p->info.typ)) { fprintf(fheader, "\n\n/* %s:%d */", p->filename, p->lineno); fprintf(fheader, "\n#ifndef %s", soap_type(p->info.typ)); if (namespaceid) fprintf(fheader, "\n#define %s (-%d)\n", soap_type(p->info.typ), p->info.typ->num); /* namespaced SOAP_TYPE is negative to avoid clashes */ else fprintf(fheader, "\n#define %s (%d)", soap_type(p->info.typ), p->info.typ->num); fprintf(fheader, "\n%sstd::string %s;", c_storage(p->info.sto), ident(p->sym->name)); fprintf(fheader, "\n#endif\n"); } } } if (classtable && classtable->list) { if (cflag) banner(fheader, "Structs and Unions"); else banner(fheader, "Classes, Structs and Unions"); fflush(fheader); if (rflag) fprintf(freport, "## %sStruct and Union Types {#doc-classes}\n\nThe table below lists the %sstructs and unions declared in [%s](%s) or that are imported:\n\n\n\n", cflag ? "" : "Class, ", cflag ? "" : "classes, ", filename, filename); for (p = classtable->list; p; p = p->next) { if (rflag && p->info.typ->ref && (soap_version >= 0 || (!is_header_or_fault(p->info.typ) && !is_body(p->info.typ)))) fprintf(freport, "\n", c_ident(p->info.typ), c_type(p->info.typ), p->filename, p->lineno, !is_transient(p->info.typ) ? "yes" : ""); if (!is_imported(p->info.typ) && !is_volatile(p->info.typ) && p->info.typ->ref) { if (!is_header_or_fault(p->info.typ) && !is_body(p->info.typ)) { if (cflag && (p->info.typ->type == Tstruct || p->info.typ->type == Tunion) && p->sym->token == TYPE) fprintf(fheader, "\ntypedef "); else fprintf(fheader, "\n"); if (p->info.typ->type == Tstruct) fprintf(fheader, "struct %s", ident(p->sym->name)); else if (!cflag && p->info.typ->type == Tclass) fprintf(fheader, "class %s", ident(p->sym->name)); else if (p->info.typ->type == Tunion) fprintf(fheader, "union %s", ident(p->sym->name)); if (cflag && (p->info.typ->type == Tstruct || p->info.typ->type == Tunion) && p->sym->token == TYPE) fprintf(fheader, " %s;", ident(p->sym->name)); else fprintf(fheader, ";"); fprintf(fheader, "\t/* %s:%d */", p->filename, p->lineno); } } } if (rflag) fprintf(freport, "
Type Declared Serializable
%s %s:%d %s
\n\n"); for (p = classtable->list; p; p = p->next) { if (rflag) gen_class(freport, p); gen_class(fheader, p); } } if (typetable) { banner(fheader, "Typedefs"); fflush(fheader); if (rflag) { fprintf(freport, "## Typedefs {#doc-typedefs}\n\n"); fprintf(freport, "A typedef type is serializable if its underlying base type is serializable. Typedefs may declare custom serializers, meaning their underlying types are custom-serialized in XML using serialization rules that differ from the serialization rules of the underlying base type:"); fprintf(freport, "\n\n\n"); } for (p = typetable->list; p; p = p->next) { if (rflag) { if (!is_transient(p->info.typ)) fprintf(freport, "\n", c_ident(p->info.typ), c_ident(p->info.typ), c_type(p->info.typ), p->filename, p->lineno, is_external(p->info.typ) || is_qname(p->info.typ) || is_stdqname(p->info.typ) || is_XML(p->info.typ) || is_stdXML(p->info.typ) ? "yes" : ""); else fprintf(freport, "\n", c_ident(p->info.typ), c_type(p->info.typ), p->filename, p->lineno); } if (!wflag && !is_primitive_or_string(p->info.typ) && !is_external(p->info.typ) && !is_XML(p->info.typ) && !is_transient(p->info.typ) && !has_ns_t(p->info.typ) && !is_imported(p->info.typ) && !is_template(p->info.typ)) { sprintf(errbuf, "serializable typedef '%s' is not namespace qualified: schema definition for '%s' in WSDL file output may be invalid", p->sym->name, p->sym->name); semwarn(errbuf); } if (p->info.typ->type == Tclass && is_eq(p->info.typ->sym->name, "xsd__QName") && !is_external(p->info.typ) && !is_imported(p->info.typ)) continue; if (!(is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_imported(p->info.typ)) || is_synonym(p->info.typ)) { fprintf(fheader, "\n\n/* %s:%d */", p->filename, p->lineno); fprintf(fheader, "\n#ifndef %s", soap_type(p->info.typ)); if (namespaceid) fprintf(fheader, "\n#define %s (-%d)\n", soap_type(p->info.typ), p->info.typ->num); /* namespaced SOAP_TYPE is negative to avoid clashes */ else fprintf(fheader, "\n#define %s (%d)", soap_type(p->info.typ), p->info.typ->num); fprintf(fheader, "\n%s%s;", c_storage(p->info.sto), c_type_synonym_id(p->info.typ, p->sym->name)); fprintf(fheader, "\n#endif"); } } if (rflag) { fprintf(freport, "
Typedef Type Declared Serializable Custom
%s %s %s:%d yes %s
%s %s %s:%d
\n\n"); for (p = typetable->list; p; p = p->next) { if (!is_transient(p->info.typ)) { fprintf(freport, "\n\n### `%s`\n\n", c_ident(p->info.typ), c_ident(p->info.typ)); gen_report_type_doc(p); if (p->lineno) fprintf(freport, "This typedef is declared in [%s](%s) at line %d", p->filename, p->filename, p->lineno); else fprintf(freport, "This typedef is internally generated"); if (has_ns_t(p->info.typ)) fprintf(freport, ", is serialized as XML schema type *`%s`*", xsi_type(p->info.typ)); if (is_XML(p->info.typ) || is_stdXML(p->info.typ)) fprintf(freport, " and is a built-in string type to hold XML that is literally serialized to and from XML"); else if (is_qname(p->info.typ) || is_stdqname(p->info.typ)) fprintf(freport, " and is a built-in string type to serialize a list of space-separated qualified names (*`xsd:QName`*), such that XML namespace prefixes are normalized to the XML prefixes defined in the [namespace table](#doc-namespaces) or replaced with \"URI\": when the namespace table has no prefix entry for the URI"); else if (is_anyType(p->info.typ)) fprintf(freport, " and is a built-in XML DOM element node graph"); else if (is_anyAttribute(p->info.typ)) fprintf(freport, " and is a built-in XML DOM attribute list"); else fprintf(freport, " and has underlying base type `%s`", c_type(p->info.typ)); if (is_primitive_or_string(p->info.typ) && (p->info.typ->pattern || p->info.typ->hasmin || p->info.typ->hasmax)) { fprintf(freport, ", which should be\n"); if (p->info.typ->pattern) { if (p->info.typ->pattern[0] == '%' && p->info.typ->pattern[1]) { unsigned int n = (unsigned int)strtoul(p->info.typ->pattern + 1, NULL, 10); unsigned int f = 0; const char *s = strchr(p->info.typ->pattern, '.'); if (s) f = (unsigned int)strtoul(s + 1, NULL, 10); if (n) fprintf(freport, "\n- number of total digits: %u", n); if (f) fprintf(freport, "\n- number of fraction digits: %u", f); } else fprintf(freport, "\n- matching regex pattern \"%s\"", p->info.typ->pattern); } if (p->info.typ->hasmin) { if (p->info.typ->type >= Tfloat && p->info.typ->type <= Tldouble) { if (p->info.typ->incmin) fprintf(freport, "\n- greater than or equal to %.16lG\n", p->info.typ->rmin); else fprintf(freport, "\n- greater than %.16lG\n", p->info.typ->rmin); } else if (p->info.typ->type >= Tchar && p->info.typ->type <= Tullong) { if (p->info.typ->incmin) fprintf(freport, "\n- greater than or equal to " SOAP_LONG_FORMAT "\n", p->info.typ->imin); else fprintf(freport, "\n- greater than " SOAP_LONG_FORMAT "\n", p->info.typ->imin); } else if (p->info.typ->hasmax && p->info.typ->imax >= 0 && p->info.typ->incmin && p->info.typ->incmax && p->info.typ->imin == p->info.typ->imax) fprintf(freport, "\n- equal to " SOAP_LONG_FORMAT " characters in length\n", p->info.typ->imin); else fprintf(freport, "\n- longer than or equal to " SOAP_LONG_FORMAT " characters in length\n", p->info.typ->imin); } if (p->info.typ->hasmax) { if (p->info.typ->type >= Tfloat && p->info.typ->type <= Tldouble) { if (p->info.typ->incmax) fprintf(freport, "\n- less than or equal to %.16lG\n", p->info.typ->rmax); else fprintf(freport, "\n- less than %.16lG\n", p->info.typ->rmax); } else if (p->info.typ->type >= Tchar && p->info.typ->type <= Tullong) { if (p->info.typ->incmax) fprintf(freport, "\n- less than or equal to " SOAP_LONG_FORMAT "\n", p->info.typ->imax); else fprintf(freport, "\n- less than " SOAP_LONG_FORMAT "\n", p->info.typ->imax); } else if (p->info.typ->hasmax && p->info.typ->imax >= 0 && p->info.typ->incmin && p->info.typ->incmax && p->info.typ->imin == p->info.typ->imax) ; else fprintf(freport, "\n- shorter than or equal to " SOAP_LONG_FORMAT " characters in length\n", p->info.typ->imin); } } fprintf(freport, "\n\n"); gen_report_hr(); } } } } banner(fheader, "Serializable Types"); fflush(fheader); if (rflag) { fprintf(freport, "## Summary of Serializable Types {#doc-types}\n\n"); fprintf(freport, "Each serializable %s *Type* with binding name *Name* has a set of auto-generated functions:\n\n", cflag ? "C" : "C/C++"); if (cflag) { fprintf(freport, "- `Type *soap_new_Name(struct soap*, int n)` managed allocation with default initialization of one *Type* when `n` = 1 or array *Type*`[n]` when `n` > 1\n"); fprintf(freport, "- `void soap_default_Name(struct soap*, Type*)` initialize or reset *Type* to default\n"); } else { fprintf(freport, "- `Type *soap_new_Name(struct soap*)` managed allocation and default initialization\n"); fprintf(freport, "- `Type *soap_new_Name(struct soap*, int n)` managed allocation and default initialization of an array `Type[n]`\n"); fprintf(freport, "- `void soap_default_Name(struct soap*, Type*)` initialize or reset non-class *Type* to default)\n"); fprintf(freport, "- `void Type::soap_default(struct soap*)` non-volatile class *Type* reset to default\n"); } fprintf(freport, "- `Type *soap_dup_Name(struct soap*, Type *dst, const Type *src)` requires soapcpp2 option -Ec, deep copy `src` to `dst` managed by context or unmanaged when context is NULL, returning `dst` (if `dst` is NULL then allocates `dst` copy)\n"); fprintf(freport, "- `void soap_del_Name(struct soap*, Type*)` requires soapcpp2 option -Ec, deep delete *Type* which must be unmanaged\n"); fprintf(freport, "- `const char *soap_Name2s(struct soap*, Type)` primitive *Type* only, returns string-converted *Type* in temporary string buffer\n"); fprintf(freport, "- `int soap_s2Name(struct soap*, const char*, Type*)` primitive *Type* only, convert string to value, returns `SOAP_OK` or error code\n"); fprintf(freport, "- `int soap_write_Name(struct soap*, const Type*)` serialize *Type* to XML, returns `SOAP_OK` or error code\n"); fprintf(freport, "- `int soap_PUT_Name(struct soap*, const char *URL, const Type*)` REST PUT *Type* in XML, returns `SOAP_OK` or error code\n"); fprintf(freport, "- `int soap_PATCH_Name(struct soap*, const char *URL, const Type*)` REST PATCH *Type* in XML, returns `SOAP_OK` or error code\n"); fprintf(freport, "- `int soap_POST_send_Name(struct soap*, const char *URL, const Type*)` REST POST send *Type* in XML (MUST be followed by a `soap_POST_recv_OtherName`), returns `SOAP_OK` or error code\n"); fprintf(freport, "- `int soap_read_Name(struct soap*, Type*)` deserialize *Type* from XML, returns `SOAP_OK` or error code\n"); fprintf(freport, "- `int soap_GET_Name(struct soap*, const char *URL, Type*)` REST GET *Type* from XML, returns `SOAP_OK` or error code\n"); fprintf(freport, "- `int soap_POST_recv_Name(struct soap*, Type*)` REST GET *Type* from XML (after a `soap_POST_send_OtherName`), returns `SOAP_OK` or error code\n"); if (cflag) fprintf(freport, "- `(Type *)soap_malloc(struct soap*, sizeof(Type))` raw managed allocation of *Type* without initialization\n"); else fprintf(freport, "- `(Type *)soap_malloc(struct soap*, sizeof(Type))` raw managed allocation of primitive *Type* (types that are not structs or classes) without initialization\n"); fprintf(freport, "- `const char *soap_strdup(struct soap*, const char*)` managed allocation and duplication of string\n"); fprintf(freport, "- `const wchar_t *soap_wstrdup(struct soap*, const wchar_t*)` managed allocation and duplication of wide string\n"); if (namespaceid) fprintf(freport, "\nEach *Type* also has a unique type id `SOAP_TYPE_%s_` that you can use to serialize `void*` in a struct/class by setting the `int __type` member to this type id.", namespaceid); else fprintf(freport, "\nEach *Type* also has a unique type id `SOAP_TYPE_` that you can use to serialize `void*` in a struct/class by setting the `int __type` member to this type id."); if (!cflag) fprintf(freport, " The unique type id is also used to distinguish derived class instances from base class instances by calling their `virtual soap_type()` methods that return this type id."); fprintf(freport, "\n\nFrom the toolkit documentation:\n\n"); if (cflag) fprintf(freport, "- Set `soap->sendfd = fd` to serialize to an `int fd` file descriptor\n- Set `soap->os = &cs` to serialize to a string `const char *cs`, which will be assigned by the engine and set to point to a managed string that is automatically deleted\n- Set `soap->recvfd = fd` to deserialize from an `int fd` file descriptor\n- Set `soap->is = cs` to deserialize from a `const char *cs` string\n- All managed allocated data is freed by `soap_end(soap)` with context `soap`\n"); else fprintf(freport, "- Set `soap->sendfd = fd` to serialize to an `int fd` file descriptor\n- Set `soap->os = &os` to serialize to a `std::ostream os`\n- Set `soap->recvfd = fd` to deserialize from an `int fd` file descriptor\n- Set `soap->is = &is` to deserialize from a `std::istream`\n- All managed allocated data is deleted by `soap_destroy(soap)` followed by `soap_end(soap)` with context `soap`\n"); fprintf(freport, "\nThe table below lists the serializable types by *Type*, binding *Name*, *Kind*, and the XSD data binding type and/or element. Pointers, arrays, and containers of these types are also serializable:\n\n\n\n", cflag ? "C" : "C/C++"); } for (i = 0; i < TYPES; i++) { if (i != Tnone && i != Tvoid && i != Tsize && i != Tunion && i != Treference && i != Trvalueref && i != Tfun) { Tnode *p; for (p = Tptr[i]; p; p = p->next) { if (!is_transient(p) && !is_invisible(p->id->name)) { fprintf(fheader, "\n\n/* %s has binding name '%s' for type '%s' */", c_type_sym(p), c_ident(p), xsi_type(p)); fprintf(fheader, "\n#ifndef %s", soap_type(p)); if (namespaceid) fprintf(fheader, "\n#define %s (-%d)\n", soap_type(p), p->num); /* namespaced SOAP_TYPE is negative to avoid clashes */ else fprintf(fheader, "\n#define %s (%d)", soap_type(p), p->num); fprintf(fheader, "\n#endif"); if (rflag && (p->type != Tpointer || is_string(p) || is_wstring(p))) { if ((p->type == Tstruct || p->type == Tclass || p->type == Tenum || p->type == Tenumsc || is_typedef(p)) && !is_stdstr(p)) fprintf(freport, "\n", c_ident(p), c_type_sym(p), c_ident(p), kind_of(p), is_XML(p) ? "(literal XML string)" : is_anyType(p) ? "(XML DOM element)" : is_anyAttribute(p) ? "(XML DOM attribute list)" : xsi_type(p)); else fprintf(freport, "\n", c_type_sym(p), c_ident(p), kind_of(p), is_XML(p) ? "(literal XML string)" : is_anyType(p) ? "(XML DOM element node)" : is_anyAttribute(p) ? "(XML DOM attribute list)" : xsi_type(p)); } } } } } if (rflag) { fprintf(freport, "
%s Type Name Kind XML schema name
%s %s %s %s
%s %s %s %s
\n\n"); gen_report_hr(); } banner(fheader, "Externals"); fflush(fheader); if (t) { for (p = t->list; p; p = p->next) { if (p->info.typ->type != Tfun || (p->info.sto & Sextern)) { fprintf(fheader, "\n\n/* %s:%d */\n", p->filename, p->lineno); if (!(p->info.sto & Sstatic)) fprintf(fheader, "extern "); fprintf(fheader, "%s", c_storage(p->info.sto)); fprintf(fheader, "%s", c_type_id(p->info.typ, p->sym->name)); fprintf(fheader, "%s;", c_init(p)); } } } fflush(fheader); } void get_namespace_prefixes(void) { Symbol *p, *q; Entry *e, *v; int i, n; const char *s; char buf[256]; if (nslist) return; for (p = symlist; p; p = p->next) { s = p->name; if (!strncmp(s, "__size", 6) || !strncmp(s, "__type", 6) || !strncmp(s, "__union", 7)) continue; while (*s == '_' || *s == '~') s++; n = (int)(strlen(s) - 2); for (i = 1; i < n; i++) { if (s[i] == ':' || (s[i-1] != '_' && s[i] == '_' && s[i+1] == '_' && s[i+2] && s[i+2] != '_') || (s[i-1] != '_' && (!strncmp(s+i, "___DOT", 6) || !strncmp(s+i, "___USCORE", 9) || (!strncmp(s+i, "___x", 4) && isxdigit(s[i+4]) && isxdigit(s[i+5]) && isxdigit(s[i+6]) && isxdigit(s[i+7]))))) { if (s[i+1] == ':') { i++; continue; } strncpy(buf, s, i); buf[i] = '\0'; if (!strcmp(buf, "SOAP_ENV") || !strcmp(buf, "SOAP_ENC") || !strcmp(buf, "xsd") || !strcmp(buf, "xsi") || !strcmp(buf, "xml") || !strcmp(buf, "std") || !strncmp(buf, "soap_", 5)) goto nsnext; for (q = nslist; q; q = q->next) if (!strcmp(q->name, buf)) goto nsnext; if (enumtable) for (e = enumtable->list; e; e = e->next) if (!strcmp(buf, e->sym->name)) if (e->info.typ->ref) for (v = ((Table*)e->info.typ->ref)->list; v; v = v->next) if (p == v->sym) goto nsnext; q = (Symbol*)emalloc(sizeof(Symbol)); q->name = (char*)emalloc(i+1); strcpy(q->name, buf); q->name[i] = '\0'; q->next = nslist; nslist = q; break; } } nsnext: ; } q = (Symbol*)emalloc(sizeof(Symbol)); q->name = (char*)emalloc(4); strcpy(q->name, "xsd"); q->next = nslist; nslist = q; q = (Symbol*)emalloc(sizeof(Symbol)); q->name = (char*)emalloc(4); strcpy(q->name, "xsi"); q->next = nslist; nslist = q; q = (Symbol*)emalloc(sizeof(Symbol)); q->name = (char*)emalloc(9); strcpy(q->name, "SOAP-ENC"); q->next = nslist; nslist = q; q = (Symbol*)emalloc(sizeof(Symbol)); q->name = (char*)emalloc(9); strcpy(q->name, "SOAP-ENV"); q->next = nslist; nslist = q; } void generate_schema(Table *t) { Entry *p = NULL; Symbol *ns; const char *name = NULL; const char *URL = NULL; const char *executable = NULL; const char *URI = NULL; const char *style = NULL; const char *encoding = NULL; const char *protocol = NULL; const char *import = NULL; Service *sp = NULL; char buf[4096]; FILE *fd; get_namespace_prefixes(); for (ns = nslist; ns; ns = ns->next) { if (!strcmp(ns->name, "SOAP-ENV") || !strcmp(ns->name, "SOAP-ENC") || !strcmp(ns->name, "xsi") || !strcmp(ns->name, "xsd")) continue; name = NULL; URL = NULL; executable = NULL; URI = NULL; style = NULL; encoding = NULL; import = NULL; for (sp = services; sp; sp = sp->next) { if (!tagcmp(sp->ns, ns->name)) { name = ns_cname(sp->name, NULL); URL = sp->URL; executable = sp->executable; URI = sp->URI; style = sp->style; encoding = sp->encoding; protocol = sp->protocol; import = sp->import; break; } } if (!URI) { char *s = (char*)emalloc(strlen(tmpURI) + strlen(ns->name) + 6); sprintf(s, "%s/%s.xsd", tmpURI, ns_convert(ns->name)); URI = s; } if (soap_version >= 0 && is_document(style) && encoding && !*encoding) { semwarn("Cannot use document style with SOAP encoding"); encoding = NULL; } if (!name) name = "Service"; if (t) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns->name, p->sym->name)) { if (name) fprintf(fmsg, "Using %s service name: %s\n", ns->name, name); if (protocol) fprintf(fmsg, "Using %s service protocol: %s\n", ns->name, protocol); if (style && soap_version >= 0) fprintf(fmsg, "Using %s service style: %s\n", ns->name, style); else if (!eflag && soap_version >= 0) fprintf(fmsg, "Using %s service style: document\n", ns->name); else if (eflag) fprintf(fmsg, "Using %s service style: rpc\n", ns->name); if (encoding && *encoding) fprintf(fmsg, "Using %s service encoding: %s\n", ns->name, encoding); else if (encoding && !*encoding && soap_version >= 0) fprintf(fmsg, "Using %s service encoding: encoded\n", ns->name); else if (!eflag && soap_version >= 0) fprintf(fmsg, "Using %s service encoding: literal\n", ns->name); else if (eflag) fprintf(fmsg, "Using %s service encoding: encoded\n", ns->name); if (URL) fprintf(fmsg, "Using %s service location: %s\n", ns->name, URL); if (executable) fprintf(fmsg, "Using %s service executable: %s\n", ns->name, executable); if (import) fprintf(fmsg, "Using %s schema import namespace: %s\n", ns->name, import); else if (URI) fprintf(fmsg, "Using %s schema namespace: %s\n", ns->name, URI); if (sp && sp->name) sprintf(buf, "%s%s.wsdl", dirpath, ns_cname(name, NULL)); else sprintf(buf, "%s%s.wsdl", dirpath, ns_cname(ns->name, NULL)); if (!wflag && !import) { fprintf(fmsg, "Saving %s Web Service description\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write WSDL file"); gen_wsdl(fd, t, ns->name, name, URL ? URL : "http://localhost:80", executable, URI, style, encoding, protocol); fclose(fd); } if (!cflag) { if (iflag || jflag) { const char *sname; if (sp && sp->name) sname = sp->name; else sname = ""; if (!Sflag) { const char *name1 = ns_cname(sname, "Proxy"); sprintf(soapProxyH, "%s%s.h", prefix, name1); sprintf(pathsoapProxyH, "%s%s", dirpath, soapProxyH); sprintf(soapProxyC, "%s%s.cpp", prefix, name1); sprintf(pathsoapProxyC, "%s%s", dirpath, soapProxyC); fprintf(fmsg, "Saving %s client proxy class\n", pathsoapProxyH); fd = fopen(pathsoapProxyH, "w"); if (!fd) execerror("Cannot write proxy class file"); copyrightnote(fd, soapProxyH); if (rflag) gen_proxy_header(freport, t, ns, name1); gen_proxy_header(fd, t, ns, name1); fclose(fd); fprintf(fmsg, "Saving %s client proxy class\n", pathsoapProxyC); fd = fopen(pathsoapProxyC, "w"); if (!fd) execerror("Cannot write proxy class file"); copyrightnote(fd, soapProxyC); gen_proxy_code(fd, t, ns, name1); fclose(fd); } if (!Cflag) { const char *name1 = ns_cname(sname, "Service"); sprintf(soapServiceH, "%s%s.h", prefix, name1); sprintf(pathsoapServiceH, "%s%s", dirpath, soapServiceH); sprintf(soapServiceC, "%s%s.cpp", prefix, name1); sprintf(pathsoapServiceC, "%s%s", dirpath, soapServiceC); fprintf(fmsg, "Saving %s service class\n", pathsoapServiceH); fd = fopen(pathsoapServiceH, "w"); if (!fd) execerror("Cannot write service class file"); copyrightnote(fd, soapServiceH); if (rflag) gen_object_header(freport, t, ns, name1); gen_object_header(fd, t, ns, name1); fclose(fd); fprintf(fmsg, "Saving %s service class\n", pathsoapServiceC); fd = fopen(pathsoapServiceC, "w"); if (!fd) execerror("Cannot write service class file"); copyrightnote(fd, soapServiceC); gen_object_code(fd, t, ns, name1); fclose(fd); } } else if (zflag == 1) { if (!Sflag && sp && sp->name) { sprintf(buf, "%s%s%s.h", dirpath, prefix, ns_cname(name, "Proxy")); fprintf(fmsg, "Saving %s simple client proxy (deprecated)\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write proxy file"); sprintf(buf, "%s%s.h", prefix, ns_cname(name, "Proxy")); copyrightnote(fd, buf); gen_proxy(fd, t, ns, name, URL ? URL : "http://localhost:80"); fclose(fd); } else if (!Sflag) { sprintf(buf, "%s%s.h", dirpath, ns_cname(prefix, "Proxy")); fprintf(fmsg, "Saving %s simple client proxy (deprecated)\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write proxy file"); sprintf(buf, "%s.h", ns_cname(prefix, "Proxy")); copyrightnote(fd, buf); gen_proxy(fd, t, ns, "Service", URL ? URL : "http://localhost:80"); fclose(fd); } if (!Cflag && sp && sp->name) { sprintf(buf, "%s%s%s.h", dirpath, prefix, ns_cname(name, "Object")); fprintf(fmsg, "Saving %s simple server object (deprecated)\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write server object file"); sprintf(buf, "%s%s.h", prefix, ns_cname(name, "Object")); copyrightnote(fd, buf); gen_object(fd, t, name); fclose(fd); } else if (!Cflag) { sprintf(buf, "%s%s.h", dirpath, ns_cname(prefix, "Object")); fprintf(fmsg, "Saving %s simple server object (deprecated)\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write server object file"); sprintf(buf, "%s.h", ns_cname(prefix, "Object")); copyrightnote(fd, buf); gen_object(fd, t, "Service"); fclose(fd); } } } if (!xflag) { strcpy(buf, dirpath); if (sp && sp->name) strcat(buf, ns_fname(name)); else strcat(buf, ns_fname(ns->name)); strcat(buf, "."); gen_data(buf, t, ns->name, encoding); } break; } } if (sp && sp->name) { has_nsmap = 1; if (nflag) sprintf(buf, "%s%s.nsmap", dirpath, prefix); else sprintf(buf, "%s%s.nsmap", dirpath, ns_cname(name, NULL)); fprintf(fmsg, "Saving %s namespace mapping table\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write nsmap file"); /* fprintf(fd, "\n#include \"%sH.h\"", prefix); better to leave to users to include this, so use stdsoap2.h instead: */ fprintf(fd, "\n#include \"stdsoap2.h\"\n/* This defines the global XML namespaces[] table to #include and compile */"); if (nflag) fprintf(fd, "\nSOAP_NMAC struct Namespace %s_namespaces[] = ", prefix); else fprintf(fd, "\nSOAP_NMAC struct Namespace namespaces[] = "); gen_nsmap(fd); fclose(fd); if (rflag) { Symbol *ns1; fprintf(freport, "## Schemas and Namespaces {#doc-namespaces}\n\nThe following schemas and namespaces are used in addition to the predefined SOAP and built-in XSD namespaces:\n\n"); for (ns1 = nslist; ns1; ns1 = ns1->next) { if (strcmp(ns1->name, "SOAP-ENV") && strcmp(ns1->name, "SOAP-ENC") && strcmp(ns1->name, "xsi") && strcmp(ns1->name, "xsd")) { Service *sp1; for (sp1 = services; sp1; sp1 = sp1->next) if (!tagcmp(sp1->ns, ns1->name) && sp1->URI) break; if (sp1) fprintf(freport, "- Prefix `%s` is bound to namespace URI *`%s`*", ns_convert(ns1->name), sp1->URI); else fprintf(freport, "- Prefix `%s` is bound to namespace URI *`%s/%s.xsd`*", ns_convert(ns1->name), tmpURI, ns_convert(ns1->name)); if (!wflag) { if (sp1 && sp1->name) fprintf(freport, " of service WSDL [%s.wsdl](%s%s.wsdl) and schema [%s.xsd](%s%s.xsd)", ns_cname(sp1->name, NULL), dirpath, ns_cname(sp1->name, NULL), ns_cname(ns1->name, NULL), dirpath, ns_cname(ns1->name, NULL)); else fprintf(freport, " of schema [%s.xsd](%s%s.xsd)", ns_cname(ns1->name, NULL), dirpath, ns_cname(ns1->name, NULL)); } if (sp1 && (sp1->elementForm || sp1->attributeForm)) fprintf(freport, " with local element form default *`%s`* and attribute form default *`%s`*\n", sp->elementForm?sp->elementForm:"unqualified", sp->attributeForm?sp->attributeForm:"unqualified"); else fprintf(freport, " with local element and attribute form default *`unqualified`*\n"); } } fprintf(freport, "\n\nThe following namespace table is saved to %s%s.nsmap:\n\n", dirpath, nflag ? prefix : ns_cname(name, NULL)); if (nflag) fprintf(freport, " struct Namespace %s_namespaces[] = ", prefix); else fprintf(freport, " struct Namespace namespaces[] = "); gen_nsmap(freport); fprintf(freport, "\nThe table binds XML namespace prefixes (first column) to namespace URIs (second column), similar to xmlns:prefix=\"URI\" in XML. The third column is a URI pattern with `*` wildcards that is also accepted as a valid namespace URI for inbound XML messages. The fourth column is NULL. This table is globally defined for the gSOAP engine. The engine context will look for it unless you compiled the gSOAP source codes with `-DWITH_NONAMESPACES`. You must assign this or another namespace table with `soap_set_namespaces(struct soap *soap, struct Namespace *namespaces)` after initializing the context and before processing XML.\n\n"); gen_report_hr(); } if (Cflag) Tflag = 0; if (Tflag) { Entry *method; const char *name1 = NULL; Tflag = 0; strcpy(soapTester, prefix); strcat(soapTester, "Tester"); if (cflag) strcat(soapTester, ".c"); else strcat(soapTester, ".cpp"); strcpy(pathsoapTester, dirpath); strcat(pathsoapTester, soapTester); fprintf(fmsg, "Saving %s auto-test echo server\n", pathsoapTester); fd = fopen(pathsoapTester, "w"); if (!fd) execerror("Cannot write to file"); copyrightnote(fd, soapTester); fprintf(fd, "\n/*\n Stand-alone server auto-test code:\n Takes request from standard input or over TCP/IP socket and returns\nresponse to standard output or socket\n\n Compile:\n cc soapTester.c soapServer.c soapC.c stdsoap2.c\n\n Command line usage with redirect over stdin/out:\n > ./a.out < SomeTest.req.xml\n > ./a.out 12288 < SomeTest.req.xml\n Note: 12288 = SOAP_XML_INDENT | SOAP_XML_STRICT (see codes in stdsoap2.h)\n Command line usage to start server at port 8080:\n > a.out 12288 8080\n*/"); if (iflag || jflag) { const char *sname; if (sp && sp->name) sname = sp->name; else sname = ""; name1 = ns_cname(sname, "Service"); fprintf(fd, "\n\n#include \"%s%s%s.h\"\n#include \"%s%s.nsmap\"\n\n\n\n#ifndef SOAP_DEFMAIN\n# define SOAP_DEFMAIN main\t/* redefine to use your own main() */\n#endif\n\nint SOAP_DEFMAIN(int argc, char **argv)\n{\n\t%s service(argc > 1 ? atoi(argv[1]) : 0);\n\tif (argc <= 2)\n\t\treturn service.serve();\n\twhile (service.run(atoi(argv[2])) != SOAP_OK && service.%serror != SOAP_TCP_ERROR)\n\t\tservice.soap_print_fault(stderr);\n\treturn 0;\n}\n", dirpath, prefix, name1, dirpath, nflag?prefix:ns_cname(name, NULL), name1, iflag ? "" : "soap->"); } else fprintf(fd, "\n\n#include \"%s%sH.h\"\n#include \"%s%s.nsmap\"\n\n#ifndef SOAP_DEFMAIN\n# define SOAP_DEFMAIN main\t/* redefine to use your own main() */\n#endif\n\nint SOAP_DEFMAIN(int argc, char **argv)\n{\n\tstruct soap *soap = soap_new1(argc > 1 ? atoi(argv[1]) : 0);\n\tif (argc <= 2)\n\t\treturn %s_serve(soap);\n\tif (soap_valid_socket(soap_bind(soap, NULL, atoi(argv[2]), 100)))\n\t{\twhile (soap_valid_socket(soap_accept(soap)))\n\t\t{\tif (%s_serve(soap))\n\t\t\t\tsoap_print_fault(soap, stderr);\n\t\t\tsoap_destroy(soap);\n\t\t\tsoap_end(soap);\n\t\t}\n\t}\n\tsoap_destroy(soap);\n\tsoap_end(soap);\n\tsoap_free(soap);\n\treturn 0;\n}\n", dirpath, prefix, dirpath, nflag?prefix:ns_cname(name, NULL), nflag?prefix:"soap", nflag?prefix:"soap"); for (method = t->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) { Entry *p = NULL, *q = entry(t, method->sym); Table *r; if (q) p = (Entry*)q->info.typ->ref; else { fprintf(stderr, "Internal error: no table entry\n"); return; } q = entry(classtable, method->sym); r = (Table*)q->info.typ->ref; if (iflag || jflag) fprintf(fd, "\n\n/** Auto-test server operation %s */\nint %s::%s(", method->sym->name, name1, ns_cname(method->sym->name, NULL)); else fprintf(fd, "\n\n/** Auto-test server operation %s */\nint %s(struct soap *soap", method->sym->name, ident(method->sym->name)); gen_params(fd, r, p, !iflag && !jflag); /* single param to single param echo */ if (p && r && r->list && r->list->info.typ == p->info.typ) fprintf(fd, "\n{\n\t/* Echo request-response parameter */\n\t*%s = *%s;\n\treturn SOAP_OK;\n}\n", ident(p->sym->name), ident(r->list->sym->name)); else if (p && r && r->list && p->info.typ->type == Tpointer && r->list->info.typ == (Tnode*)p->info.typ->ref) fprintf(fd, "\n{\n\t/* Echo request-response parameter */\n\t*%s = %s;\n\treturn SOAP_OK;\n}\n", ident(p->sym->name), ident(r->list->sym->name)); else if (p && r && r->list && p->info.typ->type == Treference && r->list->info.typ == (Tnode*)p->info.typ->ref) fprintf(fd, "\n{\n\t/* Echo request-response parameter */\n\t%s = %s;\n\treturn SOAP_OK;\n}\n", ident(p->sym->name), ident(r->list->sym->name)); else if (p && r && r->list && p->info.typ->type == Treference && r->list->info.typ->type == Tpointer && r->list->info.typ->ref == (Tnode*)p->info.typ->ref) fprintf(fd, "\n{\n\t/* Echo request-response parameter */\n\t%s = *%s;\n\treturn SOAP_OK;\n}\n", ident(p->sym->name), ident(r->list->sym->name)); /* params to wrapped params echo */ else { fprintf(fd, "\n{\n\t(void)soap; /* appease -Wall -Werror */"); if (r && p && p->info.typ->ref && ((Tnode*)p->info.typ->ref)->ref && (((Tnode*)p->info.typ->ref)->type == Tstruct || ((Tnode*)p->info.typ->ref)->type == Tclass)) { const char *s, *a; int d = 1; s = ident(p->sym->name); if (p->info.typ->type == Treference || p->info.typ->type == Trvalueref) a = "."; else a = "->"; for (p = ((Table*)((Tnode*)p->info.typ->ref)->ref)->list, q = r->list; p && q; p = p->next, q = q->next) { if (p->info.typ == q->info.typ) fprintf(fd, "\n\t%s%s%s = %s;", s, a, ident(p->sym->name), ident(q->sym->name)); else if (q->info.typ->type == Tpointer && p->info.typ == (Tnode*)q->info.typ->ref) fprintf(fd, "\n\t%s%s%s = *%s;", s, a, ident(p->sym->name), ident(q->sym->name)); else d = 0; } if (!d) fprintf(fd, "\n\t/* Returns incomplete response containing some default data values */"); } fprintf(fd, "\n\treturn SOAP_OK;\n}\n"); } fflush(fd); } } fclose(fd); } } } if (!wflag && !import) { sprintf(buf, "%s%s.xsd", dirpath, ns_cname(ns->name, NULL)); fprintf(fmsg, "Saving %s XML schema\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write schema file"); fprintf(fd, "\n"); gen_schema(fd, t, ns->name, ns->name, 1, style, encoding); fclose(fd); } } if (Tflag) fprintf(fmsg, "Warning: cannot save soapTester, need directive //gsoap ns service name:\n"); if (!has_nsmap) { for (ns = nslist; ns; ns = ns->next) if (strcmp(ns->name, "SOAP-ENV") && strcmp(ns->name, "SOAP-ENC") && strcmp(ns->name, "xsi") && strcmp(ns->name, "xsd")) break; if (nflag) sprintf(buf, "%s%s.nsmap", dirpath, prefix); else if (ns && ns->name) sprintf(buf, "%s%s.nsmap", dirpath, ns_cname(ns->name, NULL)); else sprintf(buf, "%ssoap.nsmap", dirpath); fprintf(fmsg, "Saving %s namespace mapping table\n", buf); fd = fopen(buf, "w"); if (!fd) execerror("Cannot write nsmap file"); /* fprintf(fd, "\n#include \"%sH.h\"", prefix); better to leave to users to include this, so use stdsoap2.h instead: */ fprintf(fd, "\n#include \"stdsoap2.h\"\n/* This defines the global XML namespaces[] table to #include and compile */"); if (nflag) fprintf(fd, "\nSOAP_NMAC struct Namespace %s_namespaces[] = ", prefix); else fprintf(fd, "\nSOAP_NMAC struct Namespace namespaces[] = "); gen_nsmap(fd); fclose(fd); if (rflag) { Symbol *ns1; fprintf(freport, "## Schemas and Namespaces {#doc-namespaces}\n\nThe following schemas and namespaces are used in addition to the predefined SOAP and built-in XSD namespaces:\n\n"); for (ns1 = nslist; ns1; ns1 = ns1->next) { if (strcmp(ns1->name, "SOAP-ENV") && strcmp(ns1->name, "SOAP-ENC") && strcmp(ns1->name, "xsi") && strcmp(ns1->name, "xsd")) { fprintf(freport, "- Prefix `%s` is bound to namespace URI *`%s/%s.xsd`*", ns_convert(ns1->name), tmpURI, ns_convert(ns1->name)); if (!wflag) fprintf(freport, " of schema [%s.xsd](%s%s.xsd)", ns_cname(ns1->name, NULL), dirpath, ns_cname(ns1->name, NULL)); else fprintf(freport, " with local element and attribute form default *`unqualified`*\n"); } } fprintf(freport, "\n\nThe following namespace table is saved to %s:\n\n", buf); if (nflag) fprintf(freport, " struct Namespace %s_namespaces[] = ", prefix); else fprintf(freport, " struct Namespace namespaces[] = "); gen_nsmap(freport); fprintf(freport, "\nThe table binds XML namespace prefixes (first column) to namespace URIs (second column), similar to xmlns:prefix=\"URI\" in XML. The third column is a URI pattern with `*` wildcards that is also accepted as a valid namespace URI for inbound XML messages. The fourth column is NULL (and can be omitted). This table is globally defined for the gSOAP engine and the engine context will look for it unless you compiled the gSOAP source codes with `-DWITH_NONAMESPACES`. Then assign this or another namespace table with `soap_set_namespaces(struct soap *soap, struct Namespace *namespaces)` after initializing the context and before processing XML.\n\n"); gen_report_hr(); } } } int chkhdr(const char *part) { Entry *p; p = entry(classtable, lookup("SOAP_ENV__Header")); if (p) for (p = ((Table*)p->info.typ->ref)->list; p; p = p->next) if (has_ns_eq(NULL, p->sym->name) && (!strcmp(part, p->sym->name) || is_eq_nons(part, p->sym->name))) return 1; sprintf(errbuf, "Cannot define method-header-part in WSDL: SOAP_ENV__Header \"%s\" member is not qualified", part); semwarn(errbuf); return 0; } void gen_wsdl(FILE *fd, Table *t, const char *ns, const char *name, const char *URL, const char *executable, const char *URI, const char *style, const char *encoding, const char *protocol) { Entry *p, *q, *r; Symbol *s; Service *sp, *sp2; Method *m; const char *mimein = NULL, *mimeout = NULL; int prot, mask = 0x00; /* 0x01 = SOAP, 0x02 = GET, 0x04 = PUT, 0x08 = DELETE, 0x10 = POST */ int hasport = 0; const char *action, *method_style = NULL, *method_encoding = NULL, *method_response_encoding = NULL; const char *portname; const char *binding; fprintf(fd, "\n"); for (sp = services; sp; sp = sp->next) if (!tagcmp(sp->ns, ns)) break; if (sp && sp->definitions) fprintf(fd, "definitions); else fprintf(fd, "WSDL) fprintf(fd, " targetNamespace=\"%s\"\n xmlns:tns=\"%s\"", sp->WSDL, sp->WSDL); else fprintf(fd, " targetNamespace=\"%s/%s.wsdl\"\n xmlns:tns=\"%s/%s.wsdl\"", URI, name, URI, name); if (sp && sp->binding) binding = ns_cname(sp->binding, NULL); else binding = name; if (sp && sp->portname) portname = ns_cname(sp->portname, NULL); else portname = name; for (s = nslist; s; s = s->next) { for (sp2 = services; sp2; sp2 = sp2->next) if (!tagcmp(sp2->ns, s->name) && sp2->URI) break; if (sp2) fprintf(fd, "\n xmlns:%s=\"%s\"", ns_convert(s->name), sp2->URI); else if (!strcmp(s->name, "SOAP-ENV")) fprintf(fd, "\n xmlns:SOAP-ENV=\"%s\"", envURI); else if (!strcmp(s->name, "SOAP-ENC")) fprintf(fd, "\n xmlns:SOAP-ENC=\"%s\"", encURI); else if (!strcmp(s->name, "xsi")) fprintf(fd, "\n xmlns:xsi=\"%s\"", xsiURI); else if (!strcmp(s->name, "xsd")) fprintf(fd, "\n xmlns:xsd=\"%s\"", xsdURI); else fprintf(fd, "\n xmlns:%s=\"%s/%s.xsd\"", ns_convert(s->name), tmpURI, ns_convert(s->name)); } if (is_soap12(encoding)) fprintf(fd, "\n xmlns:SOAP=\"http://schemas.xmlsoap.org/wsdl/soap12/\""); else fprintf(fd, "\n xmlns:SOAP=\"http://schemas.xmlsoap.org/wsdl/soap/\""); fprintf(fd, "\n xmlns:HTTP=\"http://schemas.xmlsoap.org/wsdl/http/\""); fprintf(fd, "\n xmlns:MIME=\"http://schemas.xmlsoap.org/wsdl/mime/\""); fprintf(fd, "\n xmlns:DIME=\"http://schemas.xmlsoap.org/ws/2002/04/dime/wsdl/\""); fprintf(fd, "\n xmlns:WSDL=\"http://schemas.xmlsoap.org/wsdl/\""); fprintf(fd, "\n xmlns=\"http://schemas.xmlsoap.org/wsdl/\">\n\n"); fprintf(fd, "\n\n"); for (s = nslist; s; s = s->next) gen_schema(fd, t, ns, s->name, !strcmp(s->name, ns), style, encoding); fprintf(fd, "\n\n"); fflush(fd); if (t) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) { mimein = NULL; mimeout = NULL; method_style = style; method_encoding = encoding; method_response_encoding = NULL; if (sp) { for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name)) { if (m->mess&MIMEIN) mimein = m->part; if (m->mess&MIMEOUT) mimeout = m->part; if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; else if (m->mess == STYLE) method_style = m->part; } } } if (!method_response_encoding) method_response_encoding = method_encoding; if (get_response(p->info.typ)) fprintf(fd, "\n", ns_remove(p->sym->name)); else fprintf(fd, "\n", ns_remove(p->sym->name)); fflush(fd); if (is_document(method_style)) { if (is_invisible(p->sym->name)) { q = entry(classtable, p->sym); if (q) { q = ((Table*)q->info.typ->ref)->list; if (q) { if (is_invisible(q->sym->name)) { r = entry(classtable, q->sym); if (r) { r = ((Table*)r->info.typ->ref)->list; if (r) { fprintf(fd, " sym, r, ns, 1)) fprintf(fd, " \n"); } } } else { fprintf(fd, " sym, q, ns, 1)) fprintf(fd, " \n"); } } } } else { fprintf(fd, " sym, p, ns, 1)) fprintf(fd, " \n"); } } else { q = entry(classtable, p->sym); if (q) { for (q = ((Table*)q->info.typ->ref)->list; q; q = q->next) { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && !is_repetition(q) && !is_anytype(q)) { if (is_XML(q->info.typ) || is_stdXML(q->info.typ)) fprintf(fd, " \n"); else { fprintf(fd, " sym->name), wsdl_type(q->info.typ, ns)); if (gen_member_documentation(fd, p->sym, q, ns, 1)) fprintf(fd, " \n"); } } } } } if (mimein) fprintf(fd, " \n"); fprintf(fd, "\n\n"); fflush(fd); q = (Entry*)p->info.typ->ref; for (r = t->list; r; r = r->next) if (r != p && r->info.typ->type == Tfun && !(r->info.sto & Sextern) && q == (Entry*)r->info.typ->ref) q = NULL; if (q && is_transient(q->info.typ)) ; else if (q && !is_response(q->info.typ)) { fprintf(fd, "\n", ns_remove(p->sym->name)); if (is_document(method_style)) fprintf(fd, " \n", ns_add(p, ns)); else if (is_literal(method_response_encoding)) { fprintf(fd, " sym->name), ns_add(q, ns)); if (gen_member_documentation(fd, p->sym, q, ns, 1)) fprintf(fd, " \n"); } else if (is_XML((Tnode*)q->info.typ->ref) || is_stdXML((Tnode*)q->info.typ->ref)) fprintf(fd, " \n"); else { fprintf(fd, " sym->name), wsdl_type(q->info.typ, ns)); if (gen_member_documentation(fd, p->sym, q, ns, 1)) fprintf(fd, " \n"); } if (mimeout) fprintf(fd, " \n"); fprintf(fd, "\n\n"); } else if (q && q->info.typ->wsdl == False) { q->info.typ->wsdl = True; fprintf(fd, "\n", ns_remove(((Tnode*)q->info.typ->ref)->id->name)); if (is_document(method_style)) { if (has_ns_eq(NULL, ((Entry*)p->info.typ->ref)->sym->name)) fprintf(fd, " \n", ns_convert(((Entry*)p->info.typ->ref)->sym->name)); else if (is_invisible(((Tnode*)q->info.typ->ref)->id->name)) { r = ((Table*)((Tnode*)q->info.typ->ref)->ref)->list; if (r) { fprintf(fd, " sym, r, ns, 1)) fprintf(fd, " \n"); } } else { fprintf(fd, " info.typ->ref)->id->name)); if (gen_member_documentation(fd, p->sym, q, ns, 1)) fprintf(fd, " \n"); } } else { if (((Tnode*)q->info.typ->ref)->ref) { for (q = ((Table*)((Tnode*)q->info.typ->ref)->ref)->list; q; q = q->next) { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && !is_repetition(q) && !is_anytype(q)) { if (is_XML(q->info.typ) || is_stdXML(q->info.typ)) fprintf(fd, " \n"); else { fprintf(fd, " sym->name), wsdl_type(q->info.typ, ns)); if (gen_member_documentation(fd, p->sym, q, ns, 1)) fprintf(fd, " \n"); } } } } } if (mimeout) fprintf(fd, " \n"); fprintf(fd, "\n\n"); } fflush(fd); } } if (custom_header) { Table *r; fprintf(fd, "\n", name); r = (Table*)entry(classtable, lookup("SOAP_ENV__Header"))->info.typ->ref; if (r) { for (q = r->list; q; q = q->next) { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && !is_repetition(q) && !is_anytype(q)) fprintf(fd, " \n", ns_remove(q->sym->name), ns_add(q, ns)); } } fprintf(fd, "\n\n"); } if (custom_fault) { Table *r; fprintf(fd, "\n", name); r = (Table*)entry(classtable, lookup("SOAP_ENV__Detail"))->info.typ->ref; if (r) for (q = r->list; q; q = q->next) if (!is_transient(q->info.typ) && !is_repetition(q) && !is_anytype(q) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && has_ns_eq(NULL, q->sym->name)) { fprintf(fd, " sym->name), ns_add(q, ns)); if (gen_member_documentation(fd, q->sym, q, ns, 1)) fprintf(fd, " \n"); } fprintf(fd, "\n\n"); } if (sp) { for (m = sp->list; m; m = m->next) { if (m->mess&FAULT && m->part) { Method *m2; int flag = 0; for (m2 = sp->list; m2 && m2 != m; m2 = m2->next) if (m2->mess&FAULT && !strcmp(m2->part, m->part)) flag = 1; if (!flag) { if (typetable) for (p = typetable->list; p; p = p->next) if ((m->mess&FAULT) && is_eq(m->part, p->info.typ->sym->name)) break; if (!p && classtable) for (p = classtable->list; p; p = p->next) if ((m->mess&FAULT) && is_eq(m->part, p->info.typ->id->name)) break; if (p) { fprintf(fd, "\n", ns_remove(m->part)); fprintf(fd, " \n", ns_convert(m->part)); fprintf(fd, "\n\n"); flag = 0; if (custom_fault) { Table *r; r = (Table*)entry(classtable, lookup("SOAP_ENV__Detail"))->info.typ->ref; if (r) for (q = r->list; q; q = q->next) if (!is_transient(q->info.typ) && !is_repetition(q) && !is_anytype(q) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun && (!strcmp(q->sym->name, m->part) || !strcmp(q->sym->name + 1, m->part) || ((q->info.typ->type == Tpointer || is_smart(q->info.typ)) && ((((Tnode*)q->info.typ->ref)->id && !strcmp(((Tnode*)q->info.typ->ref)->id->name, m->part)) || (((Tnode*)q->info.typ->ref)->sym && !strcmp(((Tnode*)q->info.typ->ref)->sym->name, m->part)))))) { flag = 1; break; } } if (!flag) { sprintf(errbuf, "//gsoap %s method-fault %s %s directive does not refer to a member of struct SOAP_ENV__Detail: suggest to define struct SOAP_ENV__Detail with member %s", sp->ns, m->name, m->part, m->part); semwarn(errbuf); } } else { sprintf(errbuf, "//gsoap %s method-fault %s %s directive does not refer to struct/class or typedef: should globablly define fault %s as type (typedef or struct/class)", sp->ns, m->name, m->part, m->part); semwarn(errbuf); } } } } } fflush(fd); if (sp && sp->porttype) fprintf(fd, "\n", sp->porttype); else fprintf(fd, "\n", ns_cname(name, "PortType")); if (protocol) { if (strncmp(protocol, "SOAP", 4)) { if (strstr(protocol, "GET")) mask = 0x02; else if (strstr(protocol, "PUT")) mask = 0x04; else if (strstr(protocol, "DELETE")) mask = 0x08; else /* assume POST */ mask = 0x10; } else mask = 0x01; } for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) { if (sp) { for (m = sp->list; m; m = m->next) { if (m->mess == PROTOCOL) { if (strncmp(m->part, "SOAP", 4)) { if (strstr(m->part, "GET")) mask |= 0x02; else if (strstr(m->part, "PUT")) mask |= 0x04; else if (strstr(m->part, "DELETE")) mask |= 0x08; else /* assume POST */ mask |= 0x10; } else mask |= 0x01; } } } if (!mask) { if (soap_version < 0) mask = 0x10; /* -0 option: use POST */ else mask = 0x01; } fprintf(fd, " \n", ns_remove(p->sym->name)); gen_method_documentation(fd, p, ns); if (get_response(p->info.typ)) fprintf(fd, " \n", ns_remove(p->sym->name)); else fprintf(fd, " \n", ns_remove(p->sym->name)); q = (Entry*)p->info.typ->ref; if (q && is_transient(q->info.typ)) ; else if (q && !is_response(q->info.typ)) fprintf(fd, " \n", ns_remove(p->sym->name)); else if (q) fprintf(fd, " \n", ns_remove(((Tnode*)q->info.typ->ref)->id->name)); if (sp) for (m = sp->list; m; m = m->next) if ((m->mess&FAULT) && is_eq_nons(m->name, p->sym->name)) fprintf(fd, " \n", ns_remove(m->part), ns_remove(m->part)); fprintf(fd, " \n"); } } fprintf(fd, "\n\n"); for (prot = 0x01; prot <= 0x10; prot <<= 1) { if ((prot & mask)) { const char *v = ""; switch (prot) { case 0x01: v = ""; break; case 0x02: v = "GET"; break; case 0x04: v = "PUT"; break; case 0x08: v = "DELETE"; break; case 0x10: v = "POST"; break; } fprintf(fd, "porttype) fprintf(fd, "type=\"tns:%s\">\n porttype); else fprintf(fd, "type=\"tns:%s\">\n porttype) fprintf(fd, "type=\"tns:%s\">\n porttype); else fprintf(fd, "type=\"tns:%s\">\n transport) fprintf(fd, " transport=\"%s\"/>\n", sp->transport); else fprintf(fd, " transport=\"http://schemas.xmlsoap.org/soap/http\"/>\n"); } else { if (sp && sp->porttype) fprintf(fd, "type=\"tns:%s\">\n \n", sp->porttype, v); else fprintf(fd, "type=\"tns:%s\">\n \n", ns_cname(name, "PortType"), v); } fflush(fd); for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) { action = ""; mimein = NULL; mimeout = NULL; method_style = style; method_encoding = encoding; method_response_encoding = NULL; if (sp) { int v = 0x01; if (sp->protocol) { if (strncmp(sp->protocol, "SOAP", 4)) { if (strstr(sp->protocol, "GET")) v = 0x02; else if (strstr(sp->protocol, "PUT")) v = 0x04; else if (strstr(sp->protocol, "DELETE")) v = 0x08; else /* assume POST */ v = 0x10; } } for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name)) { if (m->mess&MIMEIN) mimein = m->part; if (m->mess&MIMEOUT) mimeout = m->part; if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; else if (m->mess == STYLE) method_style = m->part; else if (m->mess == ACTION || m->mess == REQUEST_ACTION) action = m->part; else if (m->mess == RESPONSE_ACTION) action = m->part; else if (m->mess == PROTOCOL) { if (strncmp(m->part, "SOAP", 4)) { if (strstr(m->part, "GET")) v = 0x02; else if (strstr(m->part, "PUT")) v = 0x04; else if (strstr(m->part, "DELETE")) v = 0x08; else /* assume POST */ v = 0x10; } else v = 0x1; } } } if (soap_version < 0) v = 0x10; /* -0 option: POST */ if (prot != v) continue; } if (!method_response_encoding) method_response_encoding = method_encoding; fprintf(fd, " \n", ns_remove(p->sym->name)); if (prot == 0x01) { if (is_document(style)) { if (is_document(method_style)) { if (is_soap12(encoding) && !*action) fprintf(fd, " \n"); else if (*action == '"') fprintf(fd, " \n", action); else fprintf(fd, " \n", action); } else if (is_soap12(encoding) && !*action) fprintf(fd, " \n"); else if (*action == '"') fprintf(fd, " \n", action); else fprintf(fd, " \n", action); } else { if (is_document(method_style)) { if (is_soap12(encoding) && !*action) fprintf(fd, " \n"); else if (*action == '"') fprintf(fd, " \n", action); else fprintf(fd, " \n", action); } else if (is_soap12(encoding) && !*action) fprintf(fd, " \n"); else if (*action == '"') fprintf(fd, " \n", action); else fprintf(fd, " \n", action); } } else { if (!*action) fprintf(fd, " \n"); else if (*action == '"') fprintf(fd, " \n", action); else fprintf(fd, " \n", action); } fprintf(fd, " \n"); q = entry(classtable, p->sym); if (prot == 0x01) { if (mimein) fprintf(fd, " \n \n"); if (is_literal(method_encoding) || (q && (q = (((Table*)q->info.typ->ref)->list)) && q && is_XML(q->info.typ))) { if (is_document(method_style)) fprintf(fd, " \n"); else fprintf(fd, " \n", URI); } else { if (encoding && *encoding) fprintf(fd, " \n", encoding, URI); else if (method_encoding && *method_encoding) fprintf(fd, " \n", method_encoding, URI); else fprintf(fd, " \n", encURI, URI); if (!eflag) { sprintf(errbuf, "operation '%s' is specific to SOAP encoding only and not compliant with WS-I Basic Profile 1.0a", p->sym->name); compliancewarn(errbuf); } } if (custom_header) { m = NULL; if (sp) { for (m = sp->list; m; m = m->next) if (is_eq_nons(m->name, p->sym->name) && (m->mess&HDRIN)) { if (chkhdr(m->part)) fprintf(fd, " \n", name, ns_remove(m->part)); } } } if (mimein) { if (sp) { for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name) && (m->mess&MIMEIN)) fprintf(fd, " \n \n \n", m->part); } } fprintf(fd, " \n \n"); } } else if (prot == 0x02) fprintf(fd, " \n"); else { if (mimein) fprintf(fd, " \n", mimein); else if (!q || is_document(method_style)) fprintf(fd, " \n"); else fprintf(fd, " \n", ns_remove(q->sym->name)); } fprintf(fd, " \n"); q = (Entry*)p->info.typ->ref; if (!q || !q->info.typ->ref) { fprintf(fd, " \n"); continue; } if (prot != 0x04) { fprintf(fd, " \n"); if (prot == 0x01) { if (mimeout) fprintf(fd, " \n \n"); if (is_literal(method_response_encoding) || is_XML((Tnode*)q->info.typ->ref)) { if (is_document(method_style)) fprintf(fd, " \n"); else fprintf(fd, " \n", URI); } else if (encoding && *encoding) fprintf(fd, " \n", encoding, URI); else if (method_response_encoding && *method_response_encoding) fprintf(fd, " \n", method_response_encoding, URI); else fprintf(fd, " \n", encURI, URI); if (custom_header) { if (sp) for (m = sp->list; m; m = m->next) if (is_eq_nons(m->name, p->sym->name) && (m->mess&HDROUT)) { if (chkhdr(m->part)) fprintf(fd, " \n", name, ns_remove(m->part)); } } if (mimeout) { if (sp) { for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name) && (m->mess&MIMEOUT)) fprintf(fd, " \n \n \n", m->part); } } fprintf(fd, " \n \n"); } } else { q = (Entry*)p->info.typ->ref; if (mimeout) fprintf(fd, " \n", mimeout); else if (is_document(method_style)) fprintf(fd, " \n"); else if (q && !is_transient(q->info.typ) && !is_response(q->info.typ) && is_literal(method_response_encoding)) fprintf(fd, " \n", ns_remove(q->sym->name)); else fprintf(fd, " \n"); } fprintf(fd, " \n"); } if (sp) for (m = sp->list; m; m = m->next) if ((m->mess&FAULT) && is_eq_nons(m->name, p->sym->name)) fprintf(fd, " \n \n \n", ns_remove(m->part), ns_remove(m->part)); fprintf(fd, " \n"); fflush(fd); } } fprintf(fd, "\n\n"); } } } fprintf(fd, "\n", name); if (sp && sp->documentation) { fprintf(fd, " \n "); gen_text(fd, sp->documentation); fprintf(fd, "\n \n"); } else { fprintf(fd, " gSOAP " VERSION " generated service definition\n"); } for (prot = 0x01; prot <= 0x10; prot <<= 1) { if ((prot & mask)) { const char *s, *t, *v = "", *b = "", *e = NULL; switch (prot) { case 0x01: v = ""; b = "SOAP"; break; case 0x02: v = "GET"; b = "HTTP"; break; case 0x04: v = "PUT"; b = "HTTP"; break; case 0x08: v = "DELETE"; b = "HTTP"; break; case 0x10: v = "POST"; b = "HTTP"; break; } fprintf(fd, " \n", portname, v, binding, v); if (executable) e = executable; for (s = URL; s; s = t) { int n; t = strchr(s, ' '); if (t) { n = (int)(t - s); t++; } else n = (int)strlen(s); if (e) fprintf(fd, " <%s:address location=\"%.*s/%s\"/>\n", b, n, s, e); else fprintf(fd, " <%s:address location=\"%.*s\"/>\n", b, n, s); } fprintf(fd, " \n"); hasport = 1; } } if (!hasport && executable) { const char *s, *t; fprintf(fd, " \n", portname, binding); for (s = URL; s; s = t) { int n; t = strchr(s, ' '); if (t) { n = (int)(t - s); t++; } else n = (int)strlen(s); fprintf(fd, " \n", n, s, executable); } fprintf(fd, " \n"); } fprintf(fd, "\n\n\n"); } const char * default_value(Entry *e) { Tnode *p = e->info.typ; Entry *q; static char buf[4096]; buf[0] = '\0'; if (e->info.ptrval) p = p->ref; if (e->info.hasval || e->info.ptrval) { switch (p->type) { case Tchar: case Twchar: case Tuchar: case Tshort: case Tushort: case Tint: case Tuint: case Tlong: case Tllong: case Tulong: case Tullong: case Tsize: sprintf(buf, SOAP_LONG_FORMAT, e->info.val.i); break; case Tfloat: case Tdouble: case Tldouble: sprintf(buf, "%.17lG", e->info.val.r); break; case Ttime: break; /* should get value? */ case Tenum: case Tenumsc: if (p->ref) { for (q = ((Table*)p->ref)->list; q; q = q->next) { if (q->info.val.i == e->info.val.i) { sprintf(buf, "%s", ns_remove2(q->sym->name, c_ident(p))); break; } } } break; default: if (e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-12) sprintf(buf, "%s", xstring(e->info.val.s)); break; } } else { switch (p->type) { case Tchar: case Twchar: case Tuchar: case Tshort: case Tushort: case Tint: case Tuint: case Tlong: case Tllong: case Tulong: case Tullong: case Tsize: if (p->hasmin && p->imin > 0) sprintf(buf, SOAP_LONG_FORMAT, p->imin + (p->incmin == False)); else if (p->hasmax && p->imax < 0) sprintf(buf, SOAP_LONG_FORMAT, p->imax - (p->incmax == False)); else strcpy(buf, "0"); break; case Tfloat: case Tdouble: case Tldouble: if (p->hasmin && p->rmin > 0) sprintf(buf, "%.17lG", p->rmin * (1 + (p->incmin == False)/1000)); else if (p->hasmax && p->rmax > 0) sprintf(buf, "%.17lG", p->rmax * (1 - (p->incmax == False)/1000)); else if (p->hasmin && p->rmin < 0) sprintf(buf, "%.17lG", p->rmin * (1 - (p->incmin == False)/1000)); else if (p->hasmax && p->rmax < 0) sprintf(buf, "%.17lG", p->rmax * (1 + (p->incmax == False)/1000)); else strcpy(buf, "0"); break; case Ttime: break; /* should get value? */ case Tenum: case Tenumsc: if (p->ref) if ((q = ((Table*)p->ref)->list)) sprintf(buf, "%s", ns_remove2(q->sym->name, c_ident(p))); break; default: break; } } return buf; } const char * set_default_value(Entry *e) { const char *a; Entry *q; static char buf[4096]; buf[0] = '\0'; if (e->info.fixed) a = "fixed"; else a = "default"; if (e->info.hasval || e->info.ptrval) { Tnode *p = e->info.typ; if (e->info.ptrval) p = p->ref; switch (p->type) { case Tchar: case Twchar: case Tuchar: case Tshort: case Tushort: case Tint: case Tuint: case Tlong: case Tllong: case Tulong: case Tullong: case Tsize: sprintf(buf, " %s=\"" SOAP_LONG_FORMAT "\"", a, e->info.val.i); break; case Tfloat: case Tdouble: case Tldouble: sprintf(buf, " %s=\"%.17lG\"", a, e->info.val.r); break; case Ttime: break; /* should get value? */ case Tenum: case Tenumsc: if (p->ref) { for (q = ((Table*)p->ref)->list; q; q = q->next) { if (q->info.val.i == e->info.val.i) { sprintf(buf, " %s=\"%s\"", a, ns_remove2(q->sym->name, c_ident(p))); break; } } } break; default: if (e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-12) sprintf(buf, " %s=\"%s\"", a, xstring(e->info.val.s)); break; } } return buf; } const char * nillable(Entry *e) { if (e->info.nillable && (e->info.typ->type == Tpointer || is_smart(e->info.typ))) return " nillable=\"true\""; return ""; } const char * nillable_ref(Entry *e) { if (e->info.nillable && (((Tnode*)e->info.typ->ref)->type == Tpointer || is_smart(e->info.typ->ref))) return " nillable=\"true\""; return ""; } void gen_schema(FILE *fd, Table *t, const char *ns1, const char *ns, int all, const char *style, const char *encoding) { Entry *p, *q, *r; Tnode *n; Symbol *s; Service *sp, *sp2; Method *m; int flag; if (!strcmp(ns, "SOAP-ENV") || !strcmp(ns, "SOAP-ENC") || !strcmp(ns, "xsi") || !strcmp(ns, "xsd")) return; for (sp = services; sp; sp = sp->next) if (!tagcmp(sp->ns, ns) && sp->URI) break; if (sp && sp->import) return; fprintf(fd, " URI); else fprintf(fd, "targetNamespace=\"%s/%s.xsd\"", tmpURI, ns_convert(ns)); for (s = nslist; s; s = s->next) { for (sp2 = services; sp2; sp2 = sp2->next) if (!tagcmp(sp2->ns, s->name) && sp2->URI) break; if (sp2) fprintf(fd, "\n xmlns:%s=\"%s\"", ns_convert(s->name), sp2->URI); else if (!strcmp(s->name, "SOAP-ENV")) { if (soap_version >= 0) fprintf(fd, "\n xmlns:SOAP-ENV=\"%s\"", envURI); } else if (!strcmp(s->name, "SOAP-ENC")) { if (soap_version >= 0) fprintf(fd, "\n xmlns:SOAP-ENC=\"%s\"", encURI); } else if (!strcmp(s->name, "xsi")) fprintf(fd, "\n xmlns:xsi=\"%s\"", xsiURI); else if (!strcmp(s->name, "xsd")) fprintf(fd, "\n xmlns:xsd=\"%s\"", xsdURI); else fprintf(fd, "\n xmlns:%s=\"%s/%s.xsd\"", ns_convert(s->name), tmpURI, ns_convert(s->name)); } fprintf(fd, "\n xmlns=\"%s\"\n", xsdURI); if (sp && (sp->elementForm || sp->attributeForm)) fprintf(fd, " elementFormDefault=\"%s\"\n attributeFormDefault=\"%s\">\n", sp->elementForm?sp->elementForm:"unqualified", sp->attributeForm?sp->attributeForm:"unqualified"); else fprintf(fd, " elementFormDefault=\"unqualified\"\n attributeFormDefault=\"unqualified\">\n"); fflush(fd); flag = 0; for (s = nslist; s; s = s->next) { for (sp2 = services; sp2; sp2 = sp2->next) if (sp2 != sp && !tagcmp(sp2->ns, s->name) && sp2->URI) break; if (sp2) { fprintf(fd, " URI); if (sp2->import) fprintf(fd, " schemaLocation=\"%s\"", sp2->import); fprintf(fd, "/>\n"); if (!strcmp(sp2->URI, encURI)) flag = 1; } } if (!flag) fprintf(fd, " ", encURI); fprintf(fd, "\n"); fflush(fd); if (typetable) { for (p = typetable->list; p; p = p->next) { if (is_transient(p->info.typ) || is_invisible(p->sym->name) || p->info.typ->type == Ttemplate) continue; if (is_element(p->info.typ) && (p->info.typ->type == Tclass || p->info.typ->type == Tstruct) && !is_stdstr(p->info.typ)) continue; if ((!is_external(p->info.typ) || is_volatile(p->info.typ)) && ((has_ns_eq(ns, p->sym->name)))) { /* typedefs that are used for SOAP Fault details */ m = NULL; if (p->info.typ->type != Tstruct && p->info.typ->type != Tclass) { for (sp2 = services; sp2 && !m; sp2 = sp2->next) { for (m = sp2->list; m; m = m->next) { if ((m->mess&FAULT) && m->part && is_eq(m->part, p->sym->name)) break; } } } if (m) { if (!uflag) fprintf(fd, " \n"); fprintf(fd, " \n", ns_tag_remove(p), base_type(p->info.typ, ns1)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n"); continue; } if (is_primitive_or_string(p->info.typ) || is_binary(p->info.typ) || (p->info.typ->type == Tpointer && is_primitive_or_string((Tnode*)p->info.typ->ref))) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); if (!is_synonym(p->info.typ) && p->info.typ->pattern && p->info.typ->pattern[0] == '%' && p->info.typ->pattern[1]) { unsigned int n = (unsigned int)strtoul(p->info.typ->pattern + 1, NULL, 10); unsigned int f = 0; const char *s = strchr(p->info.typ->pattern, '.'); if (s) f = (unsigned int)strtoul(s + 1, NULL, 10); if (s && f && (p->info.typ->type == Tfloat || p->info.typ->type == Tdouble || p->info.typ->type == Tldouble)) { fprintf(fd, " \n", base_type(p->info.typ, ns1)); if (n) fprintf(fd, " \n", n); fprintf(fd, " \n", f); } else if (n && (p->info.typ->type == Tfloat || p->info.typ->type == Tdouble || p->info.typ->type == Tldouble)) { fprintf(fd, " \n", base_type(p->info.typ, ns1)); fprintf(fd, " \n", n); } else if (n && p->info.typ->type >= Tchar && p->info.typ->type <= Tullong) { fprintf(fd, " \n", base_type(p->info.typ, ns1)); fprintf(fd, " \n", n); } else { fprintf(fd, " \n", base_type(p->info.typ, ns1)); } } else { fprintf(fd, " \n", base_type(p->info.typ, ns1)); if (!is_synonym(p->info.typ) && p->info.typ->pattern) fprintf(fd, " \n", p->info.typ->pattern); } if (is_primitive(p->info.typ) || (p->info.typ->type == Tpointer && is_primitive((Tnode*)p->info.typ->ref) && !is_string(p->info.typ) && !is_wstring(p->info.typ))) { if (!is_synonym(p->info.typ) && p->info.typ->hasmin) { if (p->info.typ->type >= Tfloat && p->info.typ->type <= Tldouble) { if (p->info.typ->incmin) fprintf(fd, " \n", p->info.typ->rmin); else fprintf(fd, " \n", p->info.typ->rmin); } else { if (p->info.typ->incmin) fprintf(fd, " \n", p->info.typ->imin); else fprintf(fd, " \n", p->info.typ->imin); } } if (!is_synonym(p->info.typ) && p->info.typ->hasmax) { if (p->info.typ->type >= Tfloat && p->info.typ->type <= Tldouble) { if (p->info.typ->incmax) fprintf(fd, " \n", p->info.typ->rmax); else fprintf(fd, " \n", p->info.typ->rmax); } else { if (p->info.typ->incmax) fprintf(fd, " \n", p->info.typ->imax); else fprintf(fd, " \n", p->info.typ->imax); } } } else { if (!is_synonym(p->info.typ) && p->info.typ->hasmax && p->info.typ->imax >= 0 && p->info.typ->incmin && p->info.typ->incmax && p->info.typ->imin == p->info.typ->imax) fprintf(fd, " \n", p->info.typ->imax); else { if (!is_synonym(p->info.typ) && p->info.typ->hasmin && p->info.typ->imin >= 0) { if (p->info.typ->incmin) fprintf(fd, " \n", p->info.typ->imin); else fprintf(fd, " \n", p->info.typ->imin + 1); } if (!is_synonym(p->info.typ) && p->info.typ->hasmax && p->info.typ->imax >= 0) { if (p->info.typ->incmax) fprintf(fd, " \n", (ULONG64)p->info.typ->imax); else fprintf(fd, " \n", (ULONG64)p->info.typ->imax - 1); } } } fprintf(fd, " \n \n"); } else if (is_fixedstring(p->info.typ)) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n", base_type(p->info.typ, ns1)); if (!is_synonym(p->info.typ) && p->info.typ->hasmin && p->info.typ->imin >= 0) { if (p->info.typ->incmin) fprintf(fd, " \n", p->info.typ->imin); else fprintf(fd, " \n", p->info.typ->imin + 1); } if (!is_synonym(p->info.typ) && p->info.typ->hasmax && p->info.typ->imax >= 0) { if (p->info.typ->incmax) fprintf(fd, " \n", p->info.typ->imax); else fprintf(fd, " \n", p->info.typ->imax - 1); } else fprintf(fd, " \n", get_dimension(p->info.typ) - 1); fprintf(fd, " \n \n"); } else if (is_restriction(p->info.typ) && !has_ns_eq("xsd", p->info.typ->restriction->name)) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n", base_type(p->info.typ, ns1)); fprintf(fd, " \n \n \n"); } else { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n", base_type(p->info.typ, ns1)); fprintf(fd, " \n \n"); } } } } fflush(fd); if (enumtable) for (p = enumtable->list; p; p = p->next) gen_schema_type(fd, t, p, ns1, ns, all, style, encoding); fflush(fd); if (classtable) { for (p = classtable->list; p; p = p->next) { if (is_transient(p->info.typ) || is_invisible(p->sym->name)) continue; for (q = t->list; q; q = q->next) if (q->info.typ->type == Tfun && !(q->info.sto & Sextern) && p == get_response(q->info.typ)) break; /* omit the auto-generated and user-defined response struct/class (when necessary) */ if (!q) for (q = t->list; q; q = q->next) if (q->info.typ->type == Tfun && !(q->info.sto & Sextern) && !has_ns_eq(NULL, ((Entry*)q->info.typ->ref)->sym->name)) { r = entry(t, q->sym); if (r && r->info.typ->ref && is_response(((Entry*)r->info.typ->ref)->info.typ) && p->info.typ == (Tnode*)((Entry*)r->info.typ->ref)->info.typ->ref) break; } if (q) continue; /* classes that are used for SOAP Fault details */ m = NULL; for (sp2 = services; sp2 && !m; sp2 = sp2->next) for (m = sp2->list; m; m = m->next) if ((m->mess&FAULT) && m->part && is_eq(m->part, p->sym->name)) break; if (m) { if ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name)) { if (!uflag) fprintf(fd, " \n"); fprintf(fd, " \n", ns_tag_remove(p), base_type(p->info.typ, ns1)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n"); } } gen_schema_type(fd, t, p, ns1, ns, all, style, encoding); } } fflush(fd); for (n = Tptr[Tarray]; n; n = n->next) { if (is_transient(n) || is_fixedstring(n)) continue; if (is_literal(encoding)) fprintf(fd, " \n \n \n \n \n", c_ident(n), wsdl_type((Tnode*)n->ref, ns1), get_dimension(n)); else fprintf(fd, " \n \n \n \n \n \n \n \n \n", c_ident(n), xsi_type((Tnode*)n->ref), get_dimension(n)); fflush(fd); } gen_schema_elements_attributes(fd, t, ns, ns1, style, encoding); fprintf(fd, " \n\n"); } void gen_schema_type(FILE *fd, Table *t, Entry *p, const char *ns1, const char *ns, int all, const char *style, const char *encoding) { int i, d; char cbuf[4]; Entry *q; Tnode *typ = p->info.typ; if (!typ->ref) return; if (typ->type == Tenum || typ->type == Tenumsc) { int flag; if (!is_transient(p->info.typ) && !is_invisible(p->sym->name) && ((!has_ns(p->info.typ) && all) || has_ns_eq(ns, p->sym->name))) { flag = 0; if ((Table*)p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (!has_ns_eq(NULL, ns_remove2(q->sym->name, c_ident(p->info.typ)))) { flag = 1; break; } } if (flag == 1) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { const char *s = ns_remove2(q->sym->name, c_ident(p->info.typ)); while (*s && isdigit(*s)) s++; if (*s) { flag = 2; break; } } } } fprintf(fd, " ", wsdl_type(p->info.typ, NULL)); gen_type_documentation(fd, p, ns); if (is_mask(p->info.typ)) { fprintf(fd, " \n"); if (flag == 0) fprintf(fd, " \n"); else if (flag == 1) fprintf(fd, " \n"); else fprintf(fd, " \n"); if ((Table*)p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (!uflag) fprintf(fd, " \n", q->info.val.i); fprintf(fd, " sym->name, c_ident(p->info.typ))); if (gen_member_documentation(fd, p->sym, q, ns, q->info.typ->type == Tenumsc)) fprintf(fd, " \n"); } } fprintf(fd, " \n \n \n"); } else { if (flag == 0) fprintf(fd, " \n"); else if (flag == 1) fprintf(fd, " \n"); else fprintf(fd, " \n"); if ((Table*)p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (!uflag) fprintf(fd, " \n", q->info.val.i); fprintf(fd, " sym->name, c_ident(p->info.typ))); if (gen_member_documentation(fd, p->sym, q, ns, q->info.typ->type == Tenumsc)) fprintf(fd, " \n"); } } fprintf(fd, " \n \n"); } } } else if (is_binary(typ)) { if ((!has_ns(typ) && all) || has_ns_eq(ns, p->sym->name)) { if (is_attachment(typ)) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n"); fprintf(fd, " "); if (!uflag) fprintf(fd, ""); fprintf(fd, "\n"); gen_schema_attributes(fd, typ, NULL, ns, ns1); fprintf(fd, " \n \n \n"); } else { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); if (is_hexBinary(typ)) fprintf(fd, " \n"); else fprintf(fd, " \n"); if (typ->hasmax && typ->imax >= 0 && typ->incmin && typ->incmax && typ->imin == typ->imax) fprintf(fd, " \n", typ->imin); else { if (typ->hasmin && typ->imin >= 0) { if (typ->incmin) fprintf(fd, " \n", typ->imin); else fprintf(fd, " \n", typ->imin + 1); } if (typ->hasmax && typ->imax >= 0) { if (typ->incmax) fprintf(fd, " \n", typ->imax); else fprintf(fd, " \n", typ->imax - 1); } } fprintf(fd, " \n \n"); } } } else if (!is_transient(typ) && is_primclass(typ)) { if ((!has_ns(typ) && all) || has_ns_eq(ns, p->sym->name)) { q = ((Table*)typ->ref)->list; if (q && strncmp(q->sym->name, "xsd__anyType", 12)) { if (is_string(q->info.typ) || is_wstring(q->info.typ) || is_stdstring(q->info.typ) || is_stdwstring(q->info.typ)) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n", wsdl_type(q->info.typ, ns1)); gen_schema_attributes(fd, typ, NULL, ns, ns1); fprintf(fd, " \n \n \n"); } else { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n", wsdl_type(q->info.typ, ns1)); gen_schema_attributes(fd, typ, NULL, ns, ns1); fprintf(fd, " \n \n \n"); } } } } else if (!is_transient(typ)) { q = ((Table*)typ->ref)->list; if (t && entry(t, p->sym) && (!q || !is_XML(q->info.typ))) ; else if (is_dynamic_array(typ)) { if (eflag || (!has_ns(typ) && !is_untyped(typ))) { if (all && strcmp(typ->id->name, "SOAP_ENC__Array")) { d = get_Darraydims(typ)-1; for (i = 0; i < d; i++) cbuf[i] = ','; cbuf[i] = '\0'; if (q->info.maxOccurs == 1) { fprintf(fd, " \n \n", wsdl_type(typ, NULL)); if (!is_literal(encoding)) fprintf(fd, " \n"); fprintf(fd, " \n \n \n", q->tag?ns_tag_remove(q):q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), nillable_ref(q)); if (!is_literal(encoding)) fprintf(fd, " \n \n", wsdl_type(q->info.typ, ns1), cbuf); fprintf(fd, " \n \n"); } else { fprintf(fd, " \n \n", wsdl_type(typ, NULL)); if (!is_literal(encoding)) fprintf(fd, " \n"); fprintf(fd, " \n \n \n", q->tag?ns_tag_remove(q):q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), q->info.minOccurs, q->info.maxOccurs, nillable_ref(q)); if (!is_literal(encoding)) fprintf(fd, " \n \n", wsdl_type(q->info.typ, ns1), cbuf); fprintf(fd, " \n \n"); } } } else if (typ->ref && ((Table*)typ->ref)->prev && !is_transient(entry(classtable, ((Table*)typ->ref)->prev->sym)->info.typ) && strncmp(((Table*)typ->ref)->prev->sym->name, "xsd__anyType", 12)) { if (q->info.maxOccurs == 1) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n \n", ns_convert(((Table*)typ->ref)->prev->sym->name)); fprintf(fd, " \n", q->tag?ns_tag_remove(q):q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1)); fprintf(fd, " \n \n \n"); gen_schema_attributes(fd, typ, NULL, ns, ns1); fprintf(fd, " \n"); } else { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n \n", ns_convert(((Table*)typ->ref)->prev->sym->name)); fprintf(fd, " \n", q->tag?ns_tag_remove(q):q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), q->info.minOccurs, q->info.maxOccurs, nillable_ref(q)); fprintf(fd, " \n \n \n"); gen_schema_attributes(fd, typ, NULL, ns, ns1); fprintf(fd, " \n"); } } else if (strcmp(typ->id->name, "SOAP_ENC__Array")) { if (q->info.maxOccurs == 1) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n \n \n", q->tag?ns_tag_remove(q):q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), nillable_ref(q)); } else { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n \n \n", q->tag?ns_tag_remove(q):q->sym->name[5]?ns_remove(q->sym->name+5):"item", wsdl_type(q->info.typ, ns1), q->info.minOccurs, q->info.maxOccurs, nillable_ref(q)); } } } else if (is_discriminant(typ) && ((!has_ns(typ) && all) || has_ns_eq(ns, p->sym->name))) { if (typ->ref) { fprintf(fd, " \n", ns_remove(p->sym->name)); gen_schema_elements(fd, typ, NULL, ns, ns1); fprintf(fd, " \n"); } } else if (typ->type == Tstruct && ((!has_ns(typ) && all) || has_ns_eq(ns, p->sym->name))) { if (typ->ref) { Entry *base = base_type_of_derived(typ); if (base) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n \n", ns_convert(base->sym->name)); gen_schema_elements(fd, typ, base->info.typ, ns, ns1); fprintf(fd, " \n \n \n"); gen_schema_attributes(fd, typ, base->info.typ, ns, ns1); fprintf(fd, " \n"); } else { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n"); gen_schema_elements(fd, typ, NULL, ns, ns1); fprintf(fd, " \n"); gen_schema_attributes(fd, typ, NULL, ns, ns1); fprintf(fd, " \n"); } } } else if (typ->type == Tclass && ((!has_ns(typ) && all) || has_ns_eq(ns, p->sym->name))) { if (typ->ref) { Entry *base = base_type_of_derived(typ); if (((Table*)typ->ref)->prev && !is_transient(entry(classtable, ((Table*)typ->ref)->prev->sym)->info.typ) && strncmp(((Table*)typ->ref)->prev->sym->name, "xsd__anyType", 12)) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n \n", ns_convert(((Table*)typ->ref)->prev->sym->name)); gen_schema_elements(fd, typ, NULL, ns, ns1); fprintf(fd, " \n \n \n"); gen_schema_attributes(fd, typ, NULL, ns, ns1); fprintf(fd, " \n"); } else if (base) { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n \n \n", ns_convert(base->sym->name)); gen_schema_elements(fd, typ, base->info.typ, ns, ns1); fprintf(fd, " \n \n \n"); gen_schema_attributes(fd, typ, base->info.typ, ns, ns1); fprintf(fd, " \n"); } else { fprintf(fd, " ", ns_remove(p->sym->name)); gen_type_documentation(fd, p, ns); fprintf(fd, " \n"); gen_schema_elements(fd, typ, NULL, ns, ns1); fprintf(fd, " \n"); gen_schema_attributes(fd, typ, NULL, ns, ns1); fprintf(fd, " \n"); } } } } fflush(fd); } void gen_schema_elements(FILE *fd, Tnode *p, Tnode *b, const char *ns, const char *ns1) { Entry *q; for (q = ((Table*)p->ref)->list; q; q = q->next) { if (b) { Entry *e; for (e = ((Table*)b->ref)->list; e; e = e->next) if (q->info.typ == e->info.typ && q->sym == e->sym) break; if (e) continue; } if (gen_schema_element(fd, p, q, ns, ns1)) q = q->next; } } int gen_schema_element(FILE *fd, Tnode *p, Entry *q, const char *ns, const char *ns1) { const char *s, *t; if (is_transient(q->info.typ) || (q->info.sto & Sattribute) || q->info.typ->type == Tfun || q->info.typ->type == Tunion) return 0; if (is_repetition(q)) { if (is_sequence(q->next)) { if (q->info.maxOccurs == 1) fprintf(fd, " \n", q->info.minOccurs); else fprintf(fd, " \n", q->info.minOccurs, q->info.maxOccurs); if (q->next->info.typ->ref) gen_schema_elements(fd, (Tnode*)q->next->info.typ->ref, NULL, ns, ns1); fprintf(fd, " \n"); return 1; } t = ns_tag_convert(q->next); if (*t == '-') { fprintf(fd, " "); if (!uflag) fprintf(fd, "", q->next->sym->name); fprintf(fd, "\n"); } else if ((s = strchr(t+1, ':')) && (!strchr(q->next->sym->name+1, ':') || !has_ns_eq(ns, q->next->sym->name))) { if (((Tnode*)q->next->info.typ->ref)->type == Tpointer) { if (q->info.maxOccurs == 1) fprintf(fd, " info.minOccurs); else fprintf(fd, " info.minOccurs, q->info.maxOccurs); } else if (q->info.maxOccurs == 1) fprintf(fd, " info.minOccurs); else fprintf(fd, " info.minOccurs, q->info.maxOccurs); if (gen_member_documentation(fd, p->id, q, ns, 1)) fprintf(fd, " \n"); } else { const char *form = ""; if (!s) { s = t; if (*s == ':') { s++; form = " form=\"unqualified\""; } } else { s++; form = " form=\"qualified\""; } if (((Tnode*)q->next->info.typ->ref)->type == Tpointer) { if (q->info.maxOccurs == 1) fprintf(fd, " next->info.typ->ref, ns1), q->info.minOccurs, nillable(q), form); else fprintf(fd, " next->info.typ->ref, ns1), q->info.minOccurs, q->info.maxOccurs, nillable(q), form); } else if (q->info.maxOccurs == 1) fprintf(fd, " next->info.typ->ref, ns1), q->info.minOccurs, form); else fprintf(fd, " next->info.typ->ref, ns1), q->info.minOccurs, q->info.maxOccurs, form); if (gen_member_documentation(fd, p->id, q, ns, 1)) fprintf(fd, " \n"); } return 1; } else if ((q->info.typ->type == Ttemplate && !is_smart(q->info.typ)) || (q->info.typ->type == Tpointer && ((Tnode*)q->info.typ->ref)->type == Ttemplate) || (q->info.typ->type == Treference && ((Tnode*)q->info.typ->ref)->type == Ttemplate) || (q->info.typ->type == Trvalueref && ((Tnode*)q->info.typ->ref)->type == Ttemplate)) { t = ns_tag_convert(q); if (*t == '-') { fprintf(fd, " "); if (!uflag) fprintf(fd, "", q->sym->name); fprintf(fd, "\n"); } else if ((s = strchr(t+1, ':')) && (!strchr(q->sym->name+1, ':') || !has_ns_eq(ns, q->sym->name))) { if (((Tnode*)q->info.typ->ref)->type == Tpointer) { if (q->info.maxOccurs == 1) fprintf(fd, " info.minOccurs); else fprintf(fd, " info.minOccurs, q->info.maxOccurs); } else if (q->info.maxOccurs == 1) fprintf(fd, " info.minOccurs); else fprintf(fd, " info.minOccurs, q->info.maxOccurs); if (gen_member_documentation(fd, p->id, q, ns, 1)) fprintf(fd, " \n"); } else { const char *form = ""; if (!s) { s = t; if (*s == ':') { s++; form = " form=\"unqualified\""; } } else { s++; form = " form=\"qualified\""; } if (((Tnode*)q->info.typ->ref)->type == Tpointer) { if (q->info.maxOccurs == 1) fprintf(fd, " info.typ->ref, ns1), q->info.minOccurs, nillable(q), form); else fprintf(fd, " info.typ->ref, ns1), q->info.minOccurs, q->info.maxOccurs, nillable(q), form); } else if (q->info.maxOccurs == 1) fprintf(fd, " info.typ->ref, ns1), q->info.minOccurs, form); else fprintf(fd, " info.typ->ref, ns1), q->info.minOccurs, q->info.maxOccurs, form); if (gen_member_documentation(fd, p->id, q, ns, 1)) fprintf(fd, " \n"); } } else if (is_anytype(q)) /* ... maybe need to show all possible types rather than xsd:anyType */ { t = ns_tag_convert(q->next); if (*t == '-') { fprintf(fd, " "); if (!uflag) fprintf(fd, "", q->next->sym->name); fprintf(fd, "\n"); } else { fprintf(fd, " \n", t, q->info.minOccurs, q->info.maxOccurs); } return 1; } else if (is_choice(q)) { if (q->info.minOccurs == 0) fprintf(fd, " \n"); else fprintf(fd, " \n"); if (q->next->info.typ->ref) gen_schema_elements(fd, q->next->info.typ, NULL, ns, ns1); fprintf(fd, " \n"); return 1; } else if (is_sequence(q)) { if (q->info.minOccurs == 0) fprintf(fd, " \n"); else fprintf(fd, " \n"); if (q->info.typ->type == Tpointer) gen_schema_elements(fd, (Tnode*)q->info.typ->ref, NULL, ns, ns1); else if (q->info.typ->ref) gen_schema_elements(fd, q->info.typ, NULL, ns, ns1); fprintf(fd, " \n"); return 0; } else { t = ns_tag_convert(q); if (*t == '-' || !*t) { fprintf(fd, " "); if (!uflag) fprintf(fd, "", q->sym->name); fprintf(fd, "\n"); } else if ((s = strchr(t+1, ':')) && (!strchr(q->sym->name+1, ':') || !has_ns_eq(ns, q->sym->name))) { fprintf(fd, " info.minOccurs, q->info.maxOccurs, nillable(q), set_default_value(q)); if (gen_member_documentation(fd, p->id, q, ns, 1)) fprintf(fd, " \n"); } else { const char *form = ""; if (!s) { s = t; if (*s == ':') { s++; form = " form=\"unqualified\""; } } else { s++; form = " form=\"qualified\""; } fprintf(fd, " info.typ, ns1), q->info.minOccurs, q->info.maxOccurs, nillable(q), set_default_value(q), form); if (gen_member_documentation(fd, p->id, q, ns, 1)) fprintf(fd, " \n"); } } fflush(fd); return 0; } void gen_schema_elements_attributes(FILE *fd, Table *t, const char *ns, const char *ns1, const char *style, const char *encoding) { Entry *p, *q, *e; Table *elt, *att; Service *sp; Method *m; Symbol *sym; const char *s, *method_style, *method_encoding, *method_response_encoding; int all = !strcmp(ns, ns1); elt = mktable(NULL); att = mktable(NULL); if (t && all) { for (p = t->list; p; p = p->next) { if (!eflag && p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) { method_encoding = encoding; method_response_encoding = NULL; method_style = style; for (sp = services; sp; sp = sp->next) { if (!tagcmp(sp->ns, ns)) { for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name)) { if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; else if (m->mess == STYLE) method_style = m->part; } } } } if (!method_response_encoding) method_response_encoding = method_encoding; q = entry(classtable, p->sym); if (q) { if (is_document(method_style)) { if (!is_invisible(p->sym->name)) { sym = p->sym; s = sym->name; if (*s == '_' && !(sym = lookup(s + 1))) sym = install(s + 1, ID); if (!entry(elt, sym)) { if (!uflag) fprintf(fd, " \n"); fprintf(fd, " \n \n \n", ns_tag_remove(p)); gen_schema_elements(fd, q->info.typ, NULL, ns, ns1); fprintf(fd, " \n"); gen_schema_attributes(fd, q->info.typ, NULL, ns, ns1); fprintf(fd, " \n \n"); e = enter(elt, sym); e->info = p->info; } } else { for (q = ((Table*)q->info.typ->ref)->list; q; q = q->next) { if (!(q->info.sto & Sextern) && !has_ns_eq(NULL, q->sym->name)) { sym = q->sym; s = sym->name; if (*s == '_' && !(sym = lookup(s + 1))) sym = install(s + 1, ID); if (!entry(elt, sym)) /* enter/entry w/o prefix is not useful to avoid clashes */ { if (!uflag) fprintf(fd, " \n"); fprintf(fd, " \n", ns_tag_remove(q), wsdl_type(q->info.typ, ns1)); e = enter(elt, sym); e->info = q->info; } } } } } q = (Entry*)p->info.typ->ref; for (e = t->list; e; e = e->next) if (e != p && e->info.typ->type == Tfun && !(e->info.sto & Sextern) && q == (Entry*)e->info.typ->ref) q = NULL; if (q && !is_transient(q->info.typ)) { if (!is_response(q->info.typ)) { if (is_document(method_style)) { if (!uflag) fprintf(fd, " \n"); fprintf(fd, " \n \n", ns_tag_remove(p)); fprintf(fd, " \n"); gen_schema_element(fd, p->info.typ, q, ns, ns1); fprintf(fd, " \n"); fprintf(fd, " \n \n"); } } else if (((Tnode*)q->info.typ->ref)->ref) { if (is_document(method_style)) { if (!has_ns_eq(NULL, q->sym->name)) { sym = ((Tnode*)q->info.typ->ref)->id; s = sym->name; if (*s == '_' && !(sym = lookup(s + 1))) sym = install(s + 1, ID); if (!entry(elt, sym)) { if (!uflag) fprintf(fd, " \n"); fprintf(fd, " \n \n", ns_remove(((Tnode*)q->info.typ->ref)->id->name), ns_convert(((Tnode*)q->info.typ->ref)->id->name), ns_remove(((Tnode*)q->info.typ->ref)->id->name)); fprintf(fd, " \n"); gen_schema_elements(fd, (Tnode*)q->info.typ->ref, NULL, ns, ns1); fprintf(fd, " \n"); gen_schema_attributes(fd, (Tnode*)q->info.typ->ref, NULL, ns, ns1); fprintf(fd, " \n"); e = enter(elt, sym); e->info = q->info; } } } } } } } } } if (t && !eflag) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern)) { q = (Entry*)p->info.typ->ref; if (q && !is_transient(q->info.typ)) { if (is_response(q->info.typ)) { if (has_ns_eq(ns, q->sym->name)) { sym = q->sym; s = sym->name; if (*s == '_' && !(sym = lookup(s + 1))) sym = install(s + 1, ID); if (!entry(elt, sym)) { if (!uflag) fprintf(fd, " \n"); fprintf(fd, " \n", ns_tag_remove(q), wsdl_type(q->info.typ, ns1)); e = enter(elt, sym); e->info = q->info; } } } } } } } for (p = typetable->list; p; p = p->next) { if (is_transient(p->info.typ) || is_primclass(p->info.typ) || is_dynamic_array(p->info.typ)) continue; if (is_element(p->info.typ) && has_ns_eq(ns, p->sym->name)) { m = NULL; for (sp = services; sp && !m; sp = sp->next) for (m = sp->list; m; m = m->next) if ((m->mess&FAULT) && m->part && is_eq(m->part, p->sym->name)) break; if (!m) { sym = p->sym; s = sym->name; if (*s == '_' && !(sym = lookup(s + 1))) sym = install(s + 1, ID); if (!entry(elt, sym)) { fprintf(fd, " \n", ns_tag_remove(p), base_type(p->info.typ, ns1)); e = enter(elt, sym); e->info = p->info; } } } } for (p = classtable->list; p; p = p->next) { if (!p->info.typ->ref || /* is_invisible(p->info.typ->id->name) || */ is_transient(p->info.typ) || is_primclass(p->info.typ) || is_dynamic_array(p->info.typ)) continue; for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (!is_repetition(q) && !is_anytype(q) && (!strchr(q->sym->name+1, ':') || !eq_ns(p->sym->name, q->sym->name)) && has_ns_eq(ns, q->sym->name) && !is_transient(q->info.typ) && q->info.typ->type != Tfun) { m = NULL; for (sp = services; sp && !m; sp = sp->next) for (m = sp->list; m; m = m->next) if ((m->mess&FAULT) && m->part && is_eq(m->part, q->sym->name)) break; if (m) continue; /* already generated element for fault */ if (!(q->info.sto & Sattribute) && (q->info.typ->type == Tclass || q->info.typ->type == Tstruct || is_typedef(q->info.typ))) if (is_element(q->info.typ) || is_eq(q->info.typ->id->name, q->sym->name)) continue; /* type is already an element or type name matches member name */ sym = q->sym; s = sym->name; if (*s == '_' && !(sym = lookup(s + 1))) sym = install(s + 1, ID); if (q->info.sto & Sattribute) { e = entry(att, sym); if (e) { if ((!is_primitive(q->info.typ) || e->info.typ->type != q->info.typ->type) && reftype(e->info.typ) != reftype(q->info.typ)) { sprintf(errbuf, "Member '%s::%s' of type '%s' at line %d has a type that does not correspond to the required unique type '%s' defined for root-level attribute '%s'", p->sym->name, q->sym->name, c_type(q->info.typ), q->lineno, c_type(e->info.typ), ns_convert(q->sym->name)); semwarn(errbuf); } } else { fprintf(fd, " \n", ns_tag_remove(q), wsdl_type(q->info.typ, ns1)); e = enter(att, sym); e->info = q->info; } } else { e = entry(elt, sym); if (e) { if ((!is_primitive(q->info.typ) || e->info.typ->type != q->info.typ->type) && reftype(e->info.typ) != reftype(q->info.typ)) { sprintf(errbuf, "Member '%s::%s' of type '%s' at line %d has a type that does not correspond to the required unique type '%s' defined for root-level element '%s'", p->sym->name, q->sym->name, c_type(q->info.typ), q->lineno, c_type(e->info.typ), ns_convert(q->sym->name)); semwarn(errbuf); } } else { fprintf(fd, " \n", ns_tag_remove(q), wsdl_type(q->info.typ, ns1)); e = enter(elt, sym); e->info = q->info; } } } } if (is_element(p->info.typ) && has_ns_eq(ns, p->sym->name)) { m = NULL; for (sp = services; sp && !m; sp = sp->next) for (m = sp->list; m; m = m->next) if ((m->mess&FAULT) && m->part && is_eq(m->part, p->sym->name)) break; if (!m) { sym = p->sym; s = sym->name; if (*s == '_' && !(sym = lookup(s + 1))) sym = install(s + 1, ID); if (!entry(elt, sym)) { fprintf(fd, " \n", ns_tag_remove(p), wsdl_type(p->info.typ, ns1)); e = enter(elt, sym); e->info = p->info; } } } } freetable(elt); freetable(att); } void gen_schema_attributes(FILE *fd, Tnode *p, Tnode *b, const char *ns, const char *ns1) { Entry *q; const char *t = NULL, *s = NULL, *r = NULL; for (q = ((Table*)p->ref)->list; q; q = q->next) { if (b) { Entry *e; for (e = ((Table*)b->ref)->list; e; e = e->next) if (q->info.typ == e->info.typ && q->sym == e->sym) break; if (e) continue; } if (q->info.sto & Sattribute && !(q->info.sto & (Sprivate | Sprotected))) { r = set_default_value(q); t = ns_tag_convert(q); if (*t == '-' || is_anyAttribute(q->info.typ)) { fprintf(fd, " "); if (!uflag) fprintf(fd, "", q->sym->name); fprintf(fd, "\n"); } else if (*t && (s = strchr(t+1, ':')) && (!strchr(q->sym->name+1, ':') || !has_ns_eq(ns, q->sym->name))) { if (q->info.minOccurs) fprintf(fd, " \n", t, r); else if (q->info.maxOccurs == 0) fprintf(fd, " \n", t, r); else fprintf(fd, " \n", t, r); } else { const char *form = ""; if (!s) { s = t; if (*s == ':') { s++; form = " form=\"unqualified\""; } } else { s++; form = " form=\"qualified\""; } if (q->info.minOccurs) fprintf(fd, " info.typ, ns1), form, r); else if (q->info.maxOccurs == 0) fprintf(fd, " info.typ, ns1)); else fprintf(fd, " info.typ, ns1), form, r); if (gen_member_documentation(fd, p->id, q, ns, 1)) fprintf(fd, " \n"); } fflush(fd); } } } void gen_report_hr() { fprintf(freport, "[![][1] To top](#)\n\n\n"); } void gen_report_operation(const char *name, Entry *method, int service) { Service *sp; Method *m; int soap = (soap_version >= 0); int version = soap_version; int get = 0; int put = 0; int del = 0; int post = 0; int mimein = 0; int mimeout = 0; const char *style = NULL, *encoding = NULL; const char *action = NULL, *response_action = NULL, *method_encoding = NULL, *method_response_encoding = NULL; Entry *result, *p; result = (Entry*)method->info.typ->ref; (void)post; (void)method_response_encoding; p = entry(classtable, method->sym); if (!p) execerror("no table entry"); if (name) { if (service) fprintf(freport, "### Service Operation `%s::%s()`\n\n", name, ns_remove(method->sym->name)); else fprintf(freport, "### Proxy Operation `%s::%s()`\n\n", name, ns_remove(method->sym->name)); } else { if (service) fprintf(freport, "### Service Operation `%s()`\n\n", ident(method->sym->name)); else fprintf(freport, "### Operation `%s()`\n\n", ident(method->sym->name)); } for (sp = services; sp; sp = sp->next) { if (has_ns_eq(sp->ns, method->sym->name)) { style = sp->style; encoding = sp->encoding; method_encoding = encoding; method_response_encoding = NULL; if (sp->protocol) { if (strstr(sp->protocol, "GET")) get = 1; else if (strstr(sp->protocol, "PUT")) put = 1; else if (strstr(sp->protocol, "DELETE")) del = 1; else if (strstr(sp->protocol, "POST")) post = 1; if (strncmp(sp->protocol, "SOAP", 4)) soap = 0; else if (strlen(sp->protocol) > 6) version = sp->protocol[6] - '0'; } for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, method->sym->name)) { if (m->mess == ACTION || m->mess == REQUEST_ACTION) action = m->part; else if (m->mess == RESPONSE_ACTION) response_action = m->part; else if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; else if (m->mess == PROTOCOL) { if (strstr(m->part, "GET")) get = 1; else if (strstr(m->part, "PUT")) put = 1; else if (strstr(m->part, "DELETE")) del = 1; else if (strstr(m->part, "POST")) post = 1; if (strncmp(m->part, "SOAP", 4)) soap = 0; else if (strlen(m->part) > 6) version = m->part[6] - '0'; } else { if ((m->mess&MIMEIN) && !strcmp(m->part, "application/x-www-form-urlencoded")) mimein = 1; if ((m->mess&MIMEOUT) && !strcmp(m->part, "application/x-www-form-urlencoded")) mimeout = 1; } } } break; } } gen_report_type_doc(p); fprintf(freport, "This service operation is declared in [%s](%s) at line %d and has the following properties:\n\n", method->filename, method->filename, method->lineno); if (soap) { fprintf(freport, "- SOAP 1.%d protocol\n", version ? version : 1); fprintf(freport, "- SOAP %s style\n", is_document(style) ? "document" : "rpc"); if (sp && sp->URI && method_encoding) { if (is_literal(method_encoding)) fprintf(freport, "- SOAP literal\n"); else if (method_encoding && *method_encoding) fprintf(freport, "- SOAP %s\n", method_encoding); else if (method_encoding) fprintf(freport, "- SOAP encoded\n"); } else if (eflag) fprintf(freport, "- SOAP encoded\n"); else fprintf(freport, "- SOAP literal\n"); if (action && *action == '"') fprintf(freport, "- SOAP action %s\n", action); else if (action) fprintf(freport, "- SOAP action \"%s\"\n", action); else fprintf(freport, "- SOAP action \"\"\n"); if (response_action && *response_action == '"') fprintf(freport, "- SOAP response action %s\n", response_action); else if (response_action) fprintf(freport, "- SOAP response action \"%s\"\n", response_action); } else { fprintf(freport, "- REST operation\n"); } if (post) fprintf(freport, "- POST method\n"); else if (get) fprintf(freport, "- GET method\n"); else if (put) fprintf(freport, "- PUT method\n"); else if (del) fprintf(freport, "- DELETE method\n"); if (!get && !del && mimein) fprintf(freport, "- HTTP application/x-www-form-urlencoded request\n"); if (!put && !del && mimeout) fprintf(freport, "- HTTP application/x-www-form-urlencoded response\n"); if (sp && sp->URL) fprintf(freport, "- Default service endpoint URL \"%s\"\n", sp->URL); if (!soap && action) fprintf(freport, "- Operation endpoint location path \"%s\"\n", action); if (sp && sp->URI) fprintf(freport, "- Operation namespace prefix `%s` and URI \"[%s](#doc-namespaces)\"\n", sp->ns, sp->URI); if (name) { if (service) { if (!is_transient(result->info.typ)) fprintf(freport, "\nThe following service class method must be implemented in the service back-end code and will be called by the service dispatcher `%s::serve(soap)`:\n", name); else fprintf(freport, "\nThe following service class method must be implemented in the service back-end code and will be called by the service dispatcher `%s::serve(soap)`, and should return the value of `int %s::send_empty_%s_response(struct soap *soap, int httpcode)` when using HTTP:\n", name, name, ns_remove(method->sym->name)); } else { fprintf(freport, "\nTo invoke this service operation, use the following methods:\n"); } } else { if (service) { if (!is_transient(result->info.typ)) fprintf(freport, "\nThe following service operation function declared in [%s](%s) should be implemented in the service back-end code and is called by the service dispatcher `%s_serve(soap)` defined in [%s](%s), and should return `SOAP_OK` with the result value `%s` set or return an error code:\n", soapStub, pathsoapStub, nflag?prefix:"soap", soapServer, pathsoapServer, ident(result->sym->name)); else fprintf(freport, "\nThe following service operation function declared in [%s](%s) should be implemented in the service back-end code and is called by the service dispatcher `%s_serve(soap)` defined in [%s](%s), and should return the value of `int soap_send_empty_response(struct soap *soap, int httpcode)` when using HTTP:\n", soapStub, pathsoapStub, nflag?prefix:"soap", soapServer, pathsoapServer); } else { if (!is_transient(result->info.typ)) fprintf(freport, "\nTo invoke this service operation, use the following auto-generated function declared in [%s](%s) and defined in [%s](%s):\n", soapStub, pathsoapStub, soapClient, pathsoapClient); else fprintf(freport, "\nTo invoke this service operation, use the following auto-generated send function declared in [%s](%s) and defined in [%s](%s), where the recv function can be used by an asynchronous receiver:\n", soapStub, pathsoapStub, soapClient, pathsoapClient); } } } void gen_report_type(Tnode *typ, const char *what) { if (!is_transient(typ) && ((typ->type == Tstruct || typ->type == Tclass || typ->type == Tenum || typ->type == Tenumsc || is_typedef(typ)) && !is_stdstr(typ)) && !is_bool(typ)) fprintf(freport, ", where the type of this %s is %s ", what, ident(typ->id->name), ident(typ->id->name)); else if (typ->type == Tpointer && !is_string(typ) && !is_wstring(typ) && !is_soapref(typ)) { Tnode *ref = typ->ref; if ((ref->type == Tstruct || ref->type == Tclass || ref->type == Tenum || ref->type == Tenumsc || is_typedef(ref)) && !is_stdstr(ref) && !is_bool(ref)) fprintf(freport, ", where the type of this %s is a pointer to %s ", what, ident(ref->id->name), ident(ref->id->name)); } else if (is_smart(typ)) { Tnode *ref = typ->ref; if ((ref->type == Tstruct || ref->type == Tclass || ref->type == Tenum || ref->type == Tenumsc || is_typedef(ref)) && !is_stdstr(ref) && !is_bool(ref)) fprintf(freport, ", where the type of this %s is a smart pointer to %s ", what, ident(ref->id->name), ident(ref->id->name)); } else if (is_template(typ)) { Tnode *ref = typ->ref; if (ref->type == Tpointer || is_smart(ref)) { ref = (Tnode*)ref->ref; if ((ref->type == Tstruct || ref->type == Tclass || ref->type == Tenum || ref->type == Tenumsc || is_typedef(ref)) && !is_stdstr(ref) && !is_bool(ref)) fprintf(freport, ", where the type of this %s is a container of pointers to %s ", what, ident(ref->id->name), ident(ref->id->name)); } else if ((ref->type == Tstruct || ref->type == Tclass || ref->type == Tenum || ref->type == Tenumsc || is_typedef(ref)) && !is_stdstr(ref) && !is_bool(ref)) fprintf(freport, ", where the type of this %s is a container of %s ", what, ident(ref->id->name), ident(ref->id->name)); } } void gen_report_type_doc(Entry *type) { Service *sp; Data *d; if (!type->sym) return; for (sp = services; sp; sp = sp->next) { if (has_ns_eq(sp->ns, type->sym->name)) { for (d = sp->data; d; d = d->next) { if (d->name && d->text && !strstr(d->name, "::") && is_eq_nons(d->name, type->sym->name)) { gen_text(freport, d->text); fprintf(freport, "\n\n"); } } } } } void gen_report_members(Entry *type, const char *nsa, const char *nse) { Entry *q; int flag = 0; if (!(Table*)type->info.typ->ref) return; if (is_dynamic_array(type->info.typ) || is_choice(type)) return; fprintf(freport, "where:\n\n"); if (type->info.typ->base) fprintf(freport, "- %s is the base class of this derived class\n", ident(type->info.typ->base->name), ident(type->info.typ->base->name)); for (q = classtable->list; q; q = q->next) if (q->info.typ->base == type->sym) fprintf(freport, "- %s is a derived class of this base class\n", c_type(q->info.typ), c_type(q->info.typ)); q = base_type_of_derived(type->info.typ); if (q) fprintf(freport, "- %s is the base type of this derived type\n", ident(q->sym->name), ident(q->sym->name)); for (q = ((Table*)type->info.typ->ref)->list; q; q = q->next) if (is_pointer_to_derived(q)) fprintf(freport, "- %s is a derived type of this base type\n", c_type(q->info.typ->ref), c_type(q->info.typ->ref)); for (q = ((Table*)type->info.typ->ref)->list; q; q = q->next) { if (q->info.typ->type == Tfun) continue; if ((q->info.sto & Stypedef)) continue; if (flag) { flag = 0; continue; } fprintf(freport, "- `%s`", c_type_id(q->info.typ, q->sym->name)); gen_report_member(type, q); if (is_anyAttribute(q->info.typ)) fprintf(freport, " is an XML DOM attribute list"); else if (q->info.sto & Sattribute) { if (q->info.minOccurs >= 1) fprintf(freport, " is a required attribute *`%s`* of XML schema type *`%s`*", ns_add(q, nsa), wsdl_type(q->info.typ, "")); else fprintf(freport, " is an optional attribute *`%s`* of XML schema type *`%s`*", ns_add(q, nsa), wsdl_type(q->info.typ, "")); if (is_external(q->info.typ)) fprintf(freport, " with a custom serializer `%s`", c_type_sym(q->info.typ)); if (q->info.hasval) { if (q->info.fixed) fprintf(freport, " that must have the fixed value `%s`", c_init_a(q, "")); else fprintf(freport, " that has a default value `%s`", c_init_a(q, "")); } else if (q->info.ptrval) { if (q->info.fixed) fprintf(freport, " that has the fixed value `%s`", c_init_a(q, "")); else fprintf(freport, " that has a default value `%s`", c_init_a(q, "")); } } else if (is_soapref(q->info.typ)) { fprintf(freport, " the context that manages this object"); } else if (q->info.sto & (Sconst | Sprivate | Sprotected)) { fprintf(freport, " is not serialized\n"); continue; } else if (!is_dynamic_array(type->info.typ) && is_repetition(q)) { if (q->info.maxOccurs > 1) fprintf(freport, " is a sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements *`<%s>`* of XML schema type *`%s`*", q->info.minOccurs, q->info.maxOccurs, ns_add(q->next, nse), wsdl_type(q->next->info.typ, "")); else if (q->info.minOccurs >= 1) fprintf(freport, " is a sequence of at least " SOAP_LONG_FORMAT " elements *`<%s>`* of XML schema type *`%s`*", q->info.minOccurs, ns_add(q->next, nse), wsdl_type(q->next->info.typ, "")); else fprintf(freport, " is a sequence of elements *`<%s>`* of XML schema type *`%s`*", ns_add(q->next, nse), wsdl_type(q->next->info.typ, "")); fprintf(freport, " stored in dynamic array `%s` of length `%s`", ident(q->next->sym->name), ident(q->sym->name)); flag = 1; } else if (is_anytype(q)) { fprintf(freport, " is any type of element *`<%s>`* assigned to member `%s` as a `void*` pointer cast, with its `SOAP_TYPE_Name` assigned to member `%s`", ns_add(q->next, nse), ident(q->next->sym->name), ident(q->sym->name)); flag = 1; } else if (is_choice(q)) { Entry *r; fprintf(freport, " is a union `%s` with variant selector `%s` set to one of:", c_type(q->next->info.typ), ident(q->sym->name)); for (r = ((Table*)q->next->info.typ->ref)->list; r; r = r->next) fprintf(freport, " `%s`", soap_union_member(q->next->info.typ, r)); flag = 1; } else if (is_anyType(q->info.typ)) fprintf(freport, " is an XML DOM element node graph"); else if (is_item(q)) fprintf(freport, " is simple content of XML schema type *`%s`* wrapped in *`%s`*", wsdl_type(q->info.typ, ""), wsdl_type(type->info.typ, "")); else if (is_self(q)) fprintf(freport, " is *`%s`* wrapped in *`%s`*, where `__self` matches the element tag of the struct/class member with the `%s` type", wsdl_type(q->info.typ, ""), wsdl_type(type->info.typ, ""), c_type(type->info.typ)); else if (q->info.typ->type != Tfun && q->info.typ->type != Tunion && !(q->info.sto & (Sconst | Sprivate | Sprotected)) && !(q->info.sto & Sattribute) && !is_transient(q->info.typ) && !is_external(q->info.typ) && strncmp(q->sym->name, "__", 2)) { if (q->info.maxOccurs > 1) fprintf(freport, " is a sequence of " SOAP_LONG_FORMAT " to " SOAP_LONG_FORMAT " elements *`<%s>`* of XML schema type *`%s`*", q->info.minOccurs, q->info.maxOccurs, ns_add(q, nse), wsdl_type(q->info.typ, "")); else if (q->info.minOccurs >= 1) { if (q->info.nillable) fprintf(freport, " is a required nillable (xsi:nil when NULL) element *`<%s>`* of XML schema type *`%s`*", ns_add(q, nse), wsdl_type(q->info.typ, "")); else fprintf(freport, " is a required element *`<%s>`* of XML schema type *`%s`*", ns_add(q, nse), wsdl_type(q->info.typ, "")); } else fprintf(freport, " is an optional element *`<%s>`* of XML schema type *`%s`*", ns_add(q, nse), wsdl_type(q->info.typ, "")); } else if (is_external(q->info.typ) && q->info.minOccurs >= 1) { if (q->info.nillable) fprintf(freport, " is a required nillable (xsi:nil when NULL) element *`<%s>`* of XML schema type *`%s`* with a custom serializer `%s`", ns_add(q, nse), wsdl_type(q->info.typ, ""), c_type_sym(q->info.typ)); else fprintf(freport, " is a required element *`<%s>`* of XML schema type *`%s`* with a custom serializer `%s`", ns_add(q, nse), wsdl_type(q->info.typ, ""), c_type_sym(q->info.typ)); } else if (is_external(q->info.typ)) { fprintf(freport, " is an optional element *`<%s>`* of XML schema type *`%s`* with a custom serializer `%s`", ns_add(q, nse), wsdl_type(q->info.typ, ""), c_type_sym(q->info.typ)); } else if (is_pointer_to_derived(q)) { fprintf(freport, " is a transient pointer to a derived type value that replaces the value of this base type when non-NULL"); } else if (is_transient(q->info.typ)) { fprintf(freport, " is transient and not serialized"); } if (q->info.hasval) { if (q->info.fixed) fprintf(freport, " that must have the fixed value `%s`", c_init_a(q, "")); else fprintf(freport, " that has default value `%s`", c_init_a(q, "")); } else if (q->info.ptrval) { if (q->info.fixed) fprintf(freport, " that has the fixed value `%s`", c_init_a(q, "")); else fprintf(freport, " that has default value `%s`", c_init_a(q, "")); } gen_report_type(q->info.typ, "member"); if (is_invisible(q->sym->name)) fprintf(freport, " (the leading underscores of the member name make this member invisible in XML, meaning it has no element tag)"); else if (is_unmatched(q->sym)) fprintf(freport, " (the leading underscore of the member name makes this member a wildcard that matches any XML element tag)"); fprintf(freport, "\n"); } if (has_setter(type->info.typ)) fprintf(freport, "- `int set(struct soap *soap)` is a setter method, which is invoked by the serializer immediately before the instance is serialized\n"); if (has_getter(type->info.typ)) fprintf(freport, "- `int get(struct soap *soap)` is a getter method, which is invoked by the deserializer immediately after the instance is populated by the deserializer\n"); fprintf(freport, "\n"); } void gen_report_member(Entry *type, Entry *member) { Service *sp; const char *t; if (!type->sym || !member->sym->name) return; t = ns_remove(type->sym->name); for (sp = services; sp; sp = sp->next) { Data *d; if (has_ns_eq(sp->ns, type->sym->name)) { for (d = sp->data; d; d = d->next) { const char *s = strstr(d->name, "::"); if (s && !strncmp(t, d->name, s - d->name) && !t[s - d->name] && !strcmp(s + 2, member->sym->name)) { fprintf(freport, " "); gen_text(freport, d->text); } } } } } void gen_method_documentation(FILE *fd, Entry *p, const char *ns) { Service *sp; Data *d; if (!p->sym) return; for (sp = services; sp; sp = sp->next) { if (!tagcmp(sp->ns, ns)) { for (d = sp->data; d; d = d->next) { if (d->name && d->text && !strstr(d->name, "::") && is_eq_nons(d->name, p->sym->name)) { fprintf(fd, " \n "); gen_text(fd, d->text); fprintf(fd, "\n \n"); return; } } } } if (!uflag) fprintf(fd, " Service definition of function %s\n", p->sym->name); } void gen_type_documentation(FILE *fd, Entry *type, const char *ns) { Service *sp; Data *d; if (!type->sym) { fprintf(fd, "\n"); return; } for (sp = services; sp; sp = sp->next) { if (!tagcmp(sp->ns, ns)) { for (d = sp->data; d; d = d->next) { if (d->name && d->text && !strstr(d->name, "::") && is_eq_nons(d->name, type->sym->name)) { fprintf(fd, "\n \n \n "); gen_text(fd, d->text); fprintf(fd, "\n \n \n"); return; } } } } if (!uflag) fprintf(fd, "", type->sym->name); fprintf(fd, "\n"); } int gen_member_documentation(FILE *fd, Symbol *type, Entry *member, const char *ns, int scope) { Service *sp; Data *d; const char *t; if (!type || !member->sym) { fprintf(fd, "/>\n"); return 0; } t = ns_remove(type->name); for (sp = services; sp; sp = sp->next) { if (!tagcmp(sp->ns, ns)) { for (d = sp->data; d; d = d->next) { if (d->name && d->text) { const char *s = strstr(d->name, "::"); if (s && !strncmp(t, d->name, s - d->name) && !t[s - d->name] && !strcmp(s + 2, member->sym->name)) { fprintf(fd, ">\n \n \n "); gen_text(fd, d->text); fprintf(fd, "\n \n \n"); return 1; } } } } } fprintf(fd, "/>"); if (!uflag) { if (scope) fprintf(fd, "", type->name, member->sym->name); else fprintf(fd, "", member->sym->name); } fprintf(fd, "\n"); return 0; } void gen_text(FILE *fd, const char *s) { for (; *s; s++) { if (*s == 10) fprintf(fd, "\n"); else if (*s < 32 || *s >= 127) fprintf(fd, "&#%.2x;", (unsigned char)*s); else if (*s == '<') fprintf(fd, "<"); else if (*s == '>') fprintf(fd, ">"); else if (*s == '&') fprintf(fd, "&"); else if (*s == '\\' && (s[1] == '\n' || s[1] == '\r')) s += (s[1] == '\r'); else if (*s == '\\') fprintf(fd, "\\\\"); else fprintf(fd, "%c", *s); } } void gen_nsmap(FILE *fd) { Symbol *ns1; Service *sp; fprintf(fd, "{\n"); for (ns1 = nslist; ns1; ns1 = ns1->next) { for (sp = services; sp; sp = sp->next) if (!tagcmp(sp->ns, ns1->name) && sp->URI) break; if (sp) { if (!strcmp(ns1->name, "SOAP-ENV")) { if (soap_version < 0) fprintf(fd, " { \"SOAP-ENV\", NULL, NULL, NULL },\n"); else fprintf(fd, " { \"%s\", \"%s\", \"%s\", NULL },\n", ns_convert(ns1->name), sp->URI, sp->URI2 ? sp->URI2 : envURI); } else if (!strcmp(ns1->name, "SOAP-ENC")) { if (soap_version < 0) fprintf(fd, " { \"SOAP-ENC\", NULL, NULL, NULL },\n"); else fprintf(fd, " { \"%s\", \"%s\", \"%s\", NULL },\n", ns_convert(ns1->name), sp->URI, sp->URI2 ? sp->URI2 : encURI); } else if (sp->URI2) fprintf(fd, " { \"%s\", \"%s\", \"%s\", NULL },\n", ns_convert(ns1->name), sp->URI, sp->URI2); else fprintf(fd, " { \"%s\", \"%s\", NULL, NULL },\n", ns_convert(ns1->name), sp->URI); } else if (!strcmp(ns1->name, "SOAP-ENV")) { if (soap_version < 0) fprintf(fd, " { \"SOAP-ENV\", NULL, NULL, NULL },\n"); else if (is_soap12(NULL)) fprintf(fd, " { \"SOAP-ENV\", \"%s\", \"http://schemas.xmlsoap.org/soap/envelope/\", NULL },\n", envURI); else fprintf(fd, " { \"SOAP-ENV\", \"%s\", \"http://www.w3.org/*/soap-envelope\", NULL },\n", envURI); } else if (!strcmp(ns1->name, "SOAP-ENC")) { if (soap_version < 0) fprintf(fd, " { \"SOAP-ENC\", NULL, NULL, NULL },\n"); else if (is_soap12(NULL)) fprintf(fd, " { \"SOAP-ENC\", \"%s\", \"http://schemas.xmlsoap.org/soap/encoding/\", NULL },\n", encURI); else fprintf(fd, " { \"SOAP-ENC\", \"%s\", \"http://www.w3.org/*/soap-encoding\", NULL },\n", encURI); } else if (!strcmp(ns1->name, "xsi")) fprintf(fd, " { \"xsi\", \"%s\", \"http://www.w3.org/*/XMLSchema-instance\", NULL },\n", xsiURI); else if (!strcmp(ns1->name, "xsd")) fprintf(fd, " { \"xsd\", \"%s\", \"http://www.w3.org/*/XMLSchema\", NULL },\n", xsdURI); else fprintf(fd, " { \"%s\", \"%s/%s.xsd\", NULL, NULL },\n", ns_convert(ns1->name), tmpURI, ns_convert(ns1->name)); } fprintf(fd, " { NULL, NULL, NULL, NULL}\n };\n"); } void gen_proxy(FILE *fd, Table *table, Symbol *ns, const char *name, const char *URL) { Entry *p, *q, *r; Table *t, *output; Service *sp; int flag; const char *name1; name1 = ns_cname(name, NULL); for (sp = services; sp; sp = sp->next) if (!tagcmp(sp->ns, ns->name)) break; fprintf(fd, "\n\n#ifndef %s%sProxy_H\n#define %s%sProxy_H\n#include \"%sH.h\"", prefix, name1, prefix, name1, prefix); if (nflag) fprintf(fd, "\nextern SOAP_NMAC struct Namespace %s_namespaces[];", prefix); if (namespaceid) fprintf(fd, "\n\nnamespace %s {", namespaceid); fprintf(fd, "\nclass %s\n{ public:\n\t/// Runtime engine context allocated in constructor\n\tstruct soap *soap;\n\t/// Endpoint URL of service '%s' (change as needed)\n\tconst char *soap_endpoint_url;\n\t/// Constructor allocates soap engine context, sets default endpoint URL, and sets namespace mapping table\n", name1, name); if (nflag) fprintf(fd, "\t%s() { soap = soap_new(); if (soap) soap->namespaces = %s_namespaces; soap_endpoint_url = \"%s\"; }\n", name1, prefix, URL); else { fprintf(fd, "\t%s()\n\t{ soap = soap_new(); soap_endpoint_url = \"%s\"; if (soap && !soap->namespaces) { static const struct Namespace namespaces[] = ", name1, URL); gen_nsmap(fd); fprintf(fd, "\tsoap->namespaces = namespaces; } }\n"); } fprintf(fd, "\t/// Destructor deletes deserialized data and engine context\n\tvirtual ~%s() { if (soap) { soap_destroy(soap); soap_end(soap); soap_free(soap); } }\n", name1); fflush(fd); for (r = table->list; r; r = r->next) { if (r->info.typ->type == Tfun && !(r->info.sto & Sextern) && has_ns_eq(ns->name, r->sym->name)) { p = entry(table, r->sym); if (p) q = (Entry*)p->info.typ->ref; else { fprintf(stderr, "Internal error: no table entry\n"); return; } p = entry(classtable, r->sym); if (!p) { fprintf(stderr, "Internal error: no parameter table entry\n"); return; } output = (Table*)p->info.typ->ref; fprintf(fd, "\t/// Invoke '%s' of service '%s' and return error code (or SOAP_OK)\n", ns_remove(r->sym->name), name); fprintf(fd, "\tvirtual int %s(", ident(r->sym->name)); flag = 0; for (t = output; t; t = t->prev) { p = t->list; if (p) { fprintf(fd, "%s%s", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name)); for (p = p->next; p; p = p->next) fprintf(fd, ", %s%s", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name)); flag = 1; } } if (is_transient(q->info.typ)) fprintf(fd, ") { return soap ? soap_send_%s(soap, soap_endpoint_url, NULL", ident(r->sym->name)); else if (flag) fprintf(fd, ", %s%s) { return soap ? soap_call_%s(soap, soap_endpoint_url, NULL", c_storage(q->info.sto), c_type_id(q->info.typ, q->sym->name), ident(r->sym->name)); else fprintf(fd, "%s%s) { return soap ? soap_call_%s(soap, soap_endpoint_url, NULL", c_storage(q->info.sto), c_type_id(q->info.typ, q->sym->name), ident(r->sym->name)); for (t = output; t; t = t->prev) for (p = t->list; p; p = p->next) fprintf(fd, ", %s", ident(p->sym->name)); if (is_transient(q->info.typ)) fprintf(fd, ") : SOAP_EOM; }\n"); else fprintf(fd, ", %s) : SOAP_EOM; }\n", ident(q->sym->name)); fflush(fd); } } fprintf(fd, "};"); if (namespaceid) fprintf(fd, "\n\n} // namespace %s\n", namespaceid); fprintf(fd, "\n#endif\n"); } void gen_object(FILE *fd, Table *table, const char *name) { const char *name1; Entry *method; name1 = ns_cname(name, NULL); fprintf(fd, "\n\n#ifndef %s%sObject_H\n#define %s%sObject_H\n#include \"%sH.h\"", prefix, name1, prefix, name1, prefix); banner(fd, "Service Object"); if (namespaceid) fprintf(fd, "\n\nnamespace %s {", namespaceid); fprintf(fd, "\nclass %sService : public soap\n{ public:", name1); fprintf(fd, "\n\t%sService()\n\t{ static const struct Namespace namespaces[] = ", name1); gen_nsmap(fd); fprintf(fd, "\n\tsoap_init(this); this->namespaces = namespaces; };"); fprintf(fd, "\n\t/// Destructor deletes deserialized data and engine context"); fprintf(fd, "\n\tvirtual ~%sService() { soap_destroy(this); soap_end(this); };", name1); fprintf(fd, "\n#ifndef WITH_NOIO"); fprintf(fd, "\n\t/// Bind service to port (returns master socket or SOAP_INVALID_SOCKET)"); fprintf(fd, "\n\tvirtual\tSOAP_SOCKET bind(const char *host, int port, int backlog) { return soap_bind(this, host, port, backlog); };"); fprintf(fd, "\n\t/// Accept next request (returns socket or SOAP_INVALID_SOCKET)"); fprintf(fd, "\n\tvirtual\tSOAP_SOCKET accept() { return soap_accept(this); };"); fprintf(fd, "\n#if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); fprintf(fd, "\n\t/// Then accept SSL handshake, when SSL is used"); fprintf(fd, "\n\tvirtual\tint ssl_accept() { return soap_ssl_accept(this); };"); fprintf(fd, "\n#endif"); fprintf(fd, "\n#endif"); fprintf(fd, "\n\t/// Serve the pending request (returns SOAP_OK or error code)"); if (nflag) fprintf(fd, "\n\tvirtual\tint serve() { return %s_serve(this); };", prefix); else fprintf(fd, "\n\tvirtual\tint serve() { return soap_serve(this); };"); fprintf(fd, "\n};"); banner(fd, "Service Operations (you should define these globally)"); for (method = table->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) { Entry *p, *q = entry(table, method->sym); Table *output; if (q) p = (Entry*)q->info.typ->ref; else { fprintf(stderr, "Internal error: no table entry\n"); return; } q = entry(classtable, method->sym); output = (Table*)q->info.typ->ref; fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 %s(struct soap*", ident(method->sym->name)); gen_params(fd, output, p, 1); fprintf(fd, ";"); } } if (namespaceid) fprintf(fd, "\n\n} // namespace %s\n", namespaceid); fprintf(fd, "\n\n#endif\n"); } void gen_proxy_header(FILE *fd, Table *table, Symbol *ns, const char *name) { static int first_class = 1; Entry *p, *method; Table *t; if (fd != freport) fprintf(fd, "\n\n#ifndef %s%s_H\n#define %s%s_H\n#include \"%sH.h\"", prefix, name, prefix, name, prefix); else { Service *sp; if (first_class) fprintf(fd, "## Web Client Proxy Class %s {#doc-client}\n\n", name); else fprintf(fd, "## Web Client Proxy Class %s {#%s}\n\n", name, name); first_class = 0; for (sp = services; sp; sp = sp->next) { if (sp->documentation) { gen_text(freport, sp->documentation); fprintf(freport, "\n\n"); } } fprintf(fd, "This client proxy class is declared in [%s](%s) and defined in [%s](%s):", soapProxyH, pathsoapProxyH, soapProxyC, pathsoapProxyC); } if (namespaceid) fprintf(fd, "\n\n namespace %s {", namespaceid); if (iflag) fprintf(fd, "\n\n class SOAP_CMAC %s : public soap {\n public:", name); else { fprintf(fd, "\n\n class SOAP_CMAC %s {\n public:", name); fprintf(fd, "\n /// Context to manage proxy IO and data\n struct soap *soap;\n /// flag indicating that this context is owned by this proxy and should be deleted by the destructor\n bool soap_own;"); } fprintf(fd, "\n /// Endpoint URL of service '%s' (change as needed)", name); fprintf(fd, "\n const char *soap_endpoint;"); fprintf(fd, "\n /// Variables globally declared in %s, if any", filename); for (p = table->list; p; p = p->next) if (p->info.typ->type != Tfun && !(p->info.sto & Sstatic)) fprintf(fd, "\n %s%s;", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name)); fprintf(fd, "\n /// Construct a proxy with new managing context"); fprintf(fd, "\n %s();", name); fprintf(fd, "\n /// Copy constructor"); fprintf(fd, "\n %s(const %s& rhs);", name, name); if (iflag) { fprintf(fd, "\n /// Construct proxy given a managing context"); fprintf(fd, "\n %s(const struct soap&);", name); fprintf(fd, "\n /// Construct proxy given a managing context and endpoint URL"); fprintf(fd, "\n %s(const struct soap&, const char *soap_endpoint_url);", name); } else { fprintf(fd, "\n /// Construct proxy given a shared managing context"); fprintf(fd, "\n %s(struct soap*);", name); fprintf(fd, "\n /// Construct proxy given a shared managing context and endpoint URL"); fprintf(fd, "\n %s(struct soap*, const char *soap_endpoint_url);", name); } fprintf(fd, "\n /// Constructor taking an endpoint URL"); fprintf(fd, "\n %s(const char *soap_endpoint_url);", name); fprintf(fd, "\n /// Constructor taking input and output mode flags for the new managing context"); fprintf(fd, "\n %s(soap_mode iomode);", name); fprintf(fd, "\n /// Constructor taking endpoint URL and input and output mode flags for the new managing context"); fprintf(fd, "\n %s(const char *soap_endpoint_url, soap_mode iomode);", name); fprintf(fd, "\n /// Constructor taking input and output mode flags for the new managing context"); fprintf(fd, "\n %s(soap_mode imode, soap_mode omode);", name); if (iflag) fprintf(fd, "\n /// Destructor deletes deserialized data and its managing context"); else fprintf(fd, "\n /// Destructor deletes deserialized data and its managing context, when the context was allocated by the constructor"); fprintf(fd, "\n virtual ~%s();", name); fprintf(fd, "\n /// Initializer used by constructors"); fprintf(fd, "\n virtual void %s_init(soap_mode imode, soap_mode omode);", name); fprintf(fd, "\n /// Return a copy that has a new managing context with the same engine state"); fprintf(fd, "\n virtual %s *copy();", name); fprintf(fd, "\n /// Copy assignment"); fprintf(fd, "\n %s& operator=(const %s&);", name, name); fprintf(fd, "\n /// Delete all deserialized data (uses soap_destroy() and soap_end())"); fprintf(fd, "\n virtual void destroy();"); fprintf(fd, "\n /// Delete all deserialized data and reset to default"); fprintf(fd, "\n virtual void reset();"); fprintf(fd, "\n /// Disables and removes SOAP Header from message by setting soap->header = NULL"); fprintf(fd, "\n virtual void soap_noheader();"); if (!namespaceid) { p = entry(classtable, lookup("SOAP_ENV__Header")); if (p) { t = (Table*)p->info.typ->ref; if (t && t->list && !is_void(t->list->info.typ)) { fprintf(fd, "\n /// Add SOAP Header to message"); fprintf(fd, "\n virtual void soap_header("); gen_params_ref(fd, t, NULL, 0); fprintf(fd, ";"); } } } else fprintf(fd, "\n // virtual void soap_header(...) method removed due to option -q or -Q"); fprintf(fd, "\n /// Get SOAP Header structure (i.e. soap->header, which is NULL when absent)"); fprintf(fd, "\n virtual ::SOAP_ENV__Header *soap_header();"); fprintf(fd, "\n /// Get SOAP Fault structure (i.e. soap->fault, which is NULL when absent)"); fprintf(fd, "\n virtual ::SOAP_ENV__Fault *soap_fault();"); fprintf(fd, "\n /// Get SOAP Fault subcode QName string (NULL when absent)"); fprintf(fd, "\n virtual const char *soap_fault_subcode();"); fprintf(fd, "\n /// Get SOAP Fault string/reason (NULL when absent)"); fprintf(fd, "\n virtual const char *soap_fault_string();"); fprintf(fd, "\n /// Get SOAP Fault detail XML string (NULL when absent)"); fprintf(fd, "\n virtual const char *soap_fault_detail();"); fprintf(fd, "\n /// Close connection (normally automatic, except for send_X ops)"); fprintf(fd, "\n virtual int soap_close_socket();"); fprintf(fd, "\n /// Force close connection (can kill a thread blocked on IO)"); fprintf(fd, "\n virtual int soap_force_close_socket();"); fprintf(fd, "\n /// Print fault"); fprintf(fd, "\n virtual void soap_print_fault(FILE*);"); fprintf(fd, "\n #ifndef WITH_LEAN"); fprintf(fd, "\n #ifndef WITH_COMPAT"); fprintf(fd, "\n /// Print fault to stream"); fprintf(fd, "\n virtual void soap_stream_fault(std::ostream&);"); fprintf(fd, "\n #endif"); fprintf(fd, "\n /// Write fault to buffer"); fprintf(fd, "\n virtual char *soap_sprint_fault(char *buf, size_t len);"); fprintf(fd, "\n #endif"); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) gen_method(fd, method, 0); fprintf(fd, "\n };"); if (namespaceid) fprintf(fd, "\n\n } // namespace %s\n", namespaceid); if (fd != freport) fprintf(fd, "\n#endif\n"); else { fprintf(freport, "\n\n"); for (method = table->list; method; method = method->next) { Entry *result, *p; result = (Entry*)method->info.typ->ref; p = entry(classtable, method->sym); if (!p) execerror("no table entry"); if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) { gen_report_operation(name, method, 0); gen_method(freport, method, 0); fprintf(freport, "\n\nwhere:\n\n- `const char *soap_endpoint_url` is the endpoint URL or NULL to use the default endpoint\n- `const char *soap_action` is the SOAP action header or NULL to use the default action\n"); gen_report_params(p, result, 0); if (!is_transient(result->info.typ)) fprintf(freport, "The `%s` method sends the request message and receives the response message, assigning the last parameter `%s` the response value received. The `send_%s` method sends the request message and the `recv_%s` method receives the response message asynchronously. These methods return `SOAP_OK` or an error code.\n\n", ns_remove(method->sym->name), ident(result->sym->name), ns_remove(method->sym->name), ns_remove(method->sym->name)); else fprintf(freport, "The `send_%s` method sends the one-way request message and the `recv_%s` method receives the one-way request message. The `int soap_recv_empty_response(struct soap *soap)` function should be called after `send_%s` when communicating over HTTP to receive the HTTP acknowledgment.\n\n", ns_remove(method->sym->name), ns_remove(method->sym->name), ns_remove(method->sym->name)); gen_report_hr(); } } } } void gen_proxy_code(FILE *fd, Table *table, Symbol *ns, const char *name) { Entry *p, *method, *param; Table *t; const char *soap; if (iflag) soap = "this"; else soap = "this->soap"; fprintf(fd, "\n\n#include \"%s%s.h\"", prefix, name); if (namespaceid) fprintf(fd, "\n\nnamespace %s {", namespaceid); if (iflag) { fprintf(fd, "\n\n%s::%s() : soap(SOAP_IO_DEFAULT)\n{\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const %s& rhs)\n{\tsoap_copy_context(this, &rhs);\n\tthis->soap_endpoint = rhs.soap_endpoint;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const struct soap &_soap) : soap(_soap)\n{ }", name, name); fprintf(fd, "\n\n%s::%s(const struct soap &_soap, const char *soap_endpoint_url) : soap(_soap)\n{\n\tsoap_endpoint = soap_endpoint_url;\n}", name, name); fprintf(fd, "\n\n%s::%s(const char *soap_endpoint_url) : soap(SOAP_IO_DEFAULT)\n{\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n\tsoap_endpoint = soap_endpoint_url;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode iomode) : soap(iomode)\n{\t%s_init(iomode, iomode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const char *soap_endpoint_url, soap_mode iomode) : soap(iomode)\n{\t%s_init(iomode, iomode);\n\tsoap_endpoint = soap_endpoint_url;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode imode, soap_mode omode) : soap(imode, omode)\n{\t%s_init(imode, omode);\n}", name, name, name); fprintf(fd, "\n\n%s::~%s()\n{\n\tthis->destroy();\n}", name, name); } else { fprintf(fd, "\n\n%s::%s()\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const %s& rhs)\n{\tthis->soap = rhs.soap;\n\tthis->soap_own = false;\n\tthis->soap_endpoint = rhs.soap_endpoint;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(struct soap *_soap)\n{\tthis->soap = _soap;\n\tthis->soap_own = false;\n\t%s_init(_soap->imode, _soap->omode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(struct soap *_soap, const char *soap_endpoint_url)\n{\tthis->soap = _soap;\n\tthis->soap_own = false;\n\t%s_init(_soap->imode, _soap->omode);\n\tsoap_endpoint = soap_endpoint_url;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const char *soap_endpoint_url)\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n\tsoap_endpoint = soap_endpoint_url;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode iomode)\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(iomode, iomode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const char *soap_endpoint_url, soap_mode iomode)\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(iomode, iomode);\n\tsoap_endpoint = soap_endpoint_url;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode imode, soap_mode omode)\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(imode, omode);\n}", name, name, name); fprintf(fd, "\n\n%s::~%s()\n{\tif (this->soap_own)\n\t{\tthis->destroy();\n\t\tsoap_free(this->soap);\n\t}\n}", name, name); } fprintf(fd, "\n\nvoid %s::%s_init(soap_mode imode, soap_mode omode)\n{\tsoap_imode(%s, imode);\n\tsoap_omode(%s, omode);\n\tsoap_endpoint = NULL;\n\tstatic const struct Namespace namespaces[] = ", name, name, soap, soap); gen_nsmap(fd); fprintf(fd, "\tsoap_set_namespaces(%s, namespaces);\n}", soap); if (iflag) { fprintf(fd, "\n\n%s *%s::copy()\n{\t%s *dup = SOAP_NEW_UNMANAGED(%s(*(struct soap*)%s));\n\treturn dup;\n}", name, name, name, name, soap); fprintf(fd, "\n\n%s& %s::operator=(const %s& rhs)\n{\tsoap_done(this);\n\tsoap_copy_context(this, &rhs);\n\tthis->soap_endpoint = rhs.soap_endpoint;\n\treturn *this;\n}", name, name, name); } else { fprintf(fd, "\n\n%s *%s::copy()\n{\t%s *dup = SOAP_NEW_UNMANAGED(%s);\n\tif (dup)\n\t{\tsoap_done(dup->soap);\n\t\tsoap_copy_context(dup->soap, this->soap);\n\t}\n\treturn dup;\n}", name, name, name, name); fprintf(fd, "\n\n%s& %s::operator=(const %s& rhs)\n{\tif (this->soap != rhs.soap)\n\t{\tif (this->soap_own)\n\t\t\tsoap_free(this->soap);\n\t\tthis->soap = rhs.soap;\n\t\tthis->soap_own = false;\n\t\tthis->soap_endpoint = rhs.soap_endpoint;\n\t}\n\treturn *this;\n}", name, name, name); } fprintf(fd, "\n\nvoid %s::destroy()\n{\tsoap_destroy(%s);\n\tsoap_end(%s);\n}", name, soap, soap); fprintf(fd, "\n\nvoid %s::reset()\n{\tthis->destroy();\n\tsoap_done(%s);\n\tsoap_initialize(%s);\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, soap, soap, name); fprintf(fd, "\n\nvoid %s::soap_noheader()\n{\t%s->header = NULL;\n}", name, soap); if (!namespaceid) { p = entry(classtable, lookup("SOAP_ENV__Header")); if (p) { t = (Table*)p->info.typ->ref; if (t && t->list && !is_void(t->list->info.typ)) { fprintf(fd, "\n\nvoid %s::soap_header(", name); gen_params_ref(fd, t, NULL, 0); fprintf(fd, "\n{\n\t::soap_header(%s);", soap); for (param = t->list; param; param = param->next) { if (namespaceid) fprintf(fd, "\n\t((%s::SOAP_ENV__Header*)%s->header)->%s = %s;", namespaceid, soap, ident(param->sym->name), ident(param->sym->name)); else fprintf(fd, "\n\t%s->header->%s = %s;", soap, ident(param->sym->name), ident(param->sym->name)); } fprintf(fd, "\n}"); } } } fprintf(fd, "\n\n::SOAP_ENV__Header *%s::soap_header()\n{\treturn %s->header;\n}", name, soap); fprintf(fd, "\n\n::SOAP_ENV__Fault *%s::soap_fault()\n{\treturn %s->fault;\n}", name, soap); fprintf(fd, "\n\nconst char *%s::soap_fault_subcode()\n{\treturn ::soap_fault_subcode(%s);\n}", name, soap); fprintf(fd, "\n\nconst char *%s::soap_fault_string()\n{\treturn ::soap_fault_string(%s);\n}", name, soap); fprintf(fd, "\n\nconst char *%s::soap_fault_detail()\n{\treturn ::soap_fault_detail(%s);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_close_socket()\n{\treturn ::soap_closesock(%s);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_force_close_socket()\n{\treturn ::soap_force_closesock(%s);\n}", name, soap); fprintf(fd, "\n\nvoid %s::soap_print_fault(FILE *fd)\n{\t::soap_print_fault(%s, fd);\n}", name, soap); fprintf(fd, "\n\n#ifndef WITH_LEAN\n#ifndef WITH_COMPAT\nvoid %s::soap_stream_fault(std::ostream& os)\n{\t::soap_stream_fault(%s, os);\n}\n#endif", name, soap); fprintf(fd, "\n\nchar *%s::soap_sprint_fault(char *buf, size_t len)\n{\treturn ::soap_sprint_fault(%s, buf, len);\n}\n#endif", name, soap); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ) && has_ns_eq(ns->name, method->sym->name)) gen_call_method(fd, method, name); if (namespaceid) fprintf(fd, "\n\n} // namespace %s\n", namespaceid); fprintf(fd, "\n/* End of client proxy code */\n"); } void gen_object_header(FILE *fd, Table *table, Symbol *ns, const char *name) { static int first_class = 1; Entry *p, *method; Table *t; if (fd != freport) fprintf(fd, "\n\n#ifndef %s%s_H\n#define %s%s_H\n#include \"%sH.h\"", prefix, name, prefix, name, prefix); else { Service *sp; if (first_class) fprintf(fd, "## Web Service Class %s {#doc-server}\n\n", name); else fprintf(fd, "## Web Service Class %s {#%s}\n\n", name, name); first_class = 0; for (sp = services; sp; sp = sp->next) { if (sp->documentation) { gen_text(freport, sp->documentation); fprintf(freport, "\n\n"); } } fprintf(fd, "This service class is declared in [%s](%s) and defined in [%s](%s):", soapServiceH, pathsoapServiceH, soapServiceC, pathsoapServiceC); } if (namespaceid) fprintf(fd, "\n\n namespace %s {", namespaceid); if (iflag) fprintf(fd, "\n\n class SOAP_CMAC %s : public soap {\n public:", name); else { fprintf(fd, "\n\n class SOAP_CMAC %s {\n public:", name); fprintf(fd, "\n /// Context to manage service IO and data\n struct soap *soap;\n /// flag indicating that this context is owned by this service and should be deleted by the destructor\n bool soap_own;"); } fprintf(fd, "\n /// Variables globally declared in %s, if any", filename); for (p = table->list; p; p = p->next) if (p->info.typ->type != Tfun && !(p->info.sto & Sstatic)) fprintf(fd, "\n %s%s;", c_storage(p->info.sto), c_type_id(p->info.typ, p->sym->name)); fprintf(fd, "\n /// Construct a service with new managing context"); fprintf(fd, "\n %s();", name); fprintf(fd, "\n /// Copy constructor"); fprintf(fd, "\n %s(const %s&);", name, name); if (iflag) { fprintf(fd, "\n /// Construct service given a managing context"); fprintf(fd, "\n %s(const struct soap&);", name); fprintf(fd, "\n /// Construct service given a managing context and endpoint"); fprintf(fd, "\n %s(const struct soap&, const char *soap_endpoint_url);", name); } else { fprintf(fd, "\n /// Construct service given a shared managing context"); fprintf(fd, "\n %s(struct soap*);", name); } fprintf(fd, "\n /// Constructor taking input+output mode flags for the new managing context"); fprintf(fd, "\n %s(soap_mode iomode);", name); fprintf(fd, "\n /// Constructor taking input and output mode flags for the new managing context"); fprintf(fd, "\n %s(soap_mode imode, soap_mode omode);", name); if (iflag) fprintf(fd, "\n /// Destructor deletes deserialized data and its managing context"); else fprintf(fd, "\n /// Destructor deletes deserialized data and its managing context, when the context was allocated by the constructor"); fprintf(fd, "\n virtual ~%s();", name); fprintf(fd, "\n /// Delete all deserialized data (with soap_destroy() and soap_end())"); fprintf(fd, "\n virtual void destroy();"); fprintf(fd, "\n /// Delete all deserialized data and reset to defaults"); fprintf(fd, "\n virtual void reset();"); fprintf(fd, "\n /// Initializer used by constructors"); fprintf(fd, "\n virtual void %s_init(soap_mode imode, soap_mode omode);", name); fprintf(fd, "\n /// Return a copy that has a new managing context with the same engine state"); fprintf(fd, "\n virtual %s *copy() SOAP_PURE_VIRTUAL_COPY;", name); fprintf(fd, "\n /// Copy assignment"); fprintf(fd, "\n %s& operator=(const %s&);", name, name); fprintf(fd, "\n /// Close connection (normally automatic)"); fprintf(fd, "\n virtual int soap_close_socket();"); fprintf(fd, "\n /// Force close connection (can kill a thread blocked on IO)"); fprintf(fd, "\n virtual int soap_force_close_socket();"); fprintf(fd, "\n /// Return sender-related fault to sender"); fprintf(fd, "\n virtual int soap_senderfault(const char *string, const char *detailXML);"); fprintf(fd, "\n /// Return sender-related fault with SOAP 1.2 subcode to sender"); fprintf(fd, "\n virtual int soap_senderfault(const char *subcodeQName, const char *string, const char *detailXML);"); fprintf(fd, "\n /// Return receiver-related fault to sender"); fprintf(fd, "\n virtual int soap_receiverfault(const char *string, const char *detailXML);"); fprintf(fd, "\n /// Return receiver-related fault with SOAP 1.2 subcode to sender"); fprintf(fd, "\n virtual int soap_receiverfault(const char *subcodeQName, const char *string, const char *detailXML);"); fprintf(fd, "\n /// Print fault"); fprintf(fd, "\n virtual void soap_print_fault(FILE*);"); fprintf(fd, "\n #ifndef WITH_LEAN"); fprintf(fd, "\n #ifndef WITH_COMPAT"); fprintf(fd, "\n /// Print fault to stream"); fprintf(fd, "\n virtual void soap_stream_fault(std::ostream&);"); fprintf(fd, "\n #endif"); fprintf(fd, "\n /// Write fault to buffer"); fprintf(fd, "\n virtual char *soap_sprint_fault(char *buf, size_t len);"); fprintf(fd, "\n #endif"); fprintf(fd, "\n /// Disables and removes SOAP Header from message by setting soap->header = NULL"); fprintf(fd, "\n virtual void soap_noheader();"); if (!namespaceid) { p = entry(classtable, lookup("SOAP_ENV__Header")); if (p) { t = (Table*)p->info.typ->ref; if (t && t->list && !is_void(t->list->info.typ)) { fprintf(fd, "\n /// Add SOAP Header to message"); fprintf(fd, "\n virtual void soap_header("); gen_params_ref(fd, t, NULL, 0); fprintf(fd, ";"); } } } else fprintf(fd, "\n // virtual void soap_header(...) method removed due to option -q or -Q"); fprintf(fd, "\n /// Get SOAP Header structure (i.e. soap->header, which is NULL when absent)"); fprintf(fd, "\n virtual ::SOAP_ENV__Header *soap_header();"); fprintf(fd, "\n #ifndef WITH_NOIO"); fprintf(fd, "\n /// Run simple single-thread (iterative, non-SSL) service on port until a connection error occurs (returns SOAP_OK or error code), use this->bind_flag = SO_REUSEADDR to rebind for immediate rerun"); fprintf(fd, "\n virtual int run(int port, int backlog = 1);"); fprintf(fd, "\n #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); fprintf(fd, "\n /// Run simple single-thread SSL service on port until a connection error occurs (returns SOAP_OK or error code), use this->bind_flag = SO_REUSEADDR to rebind for immediate rerun"); fprintf(fd, "\n virtual int ssl_run(int port, int backlog = 1);"); fprintf(fd, "\n #endif"); fprintf(fd, "\n /// Bind service to port (returns master socket or SOAP_INVALID_SOCKET upon error)"); fprintf(fd, "\n virtual SOAP_SOCKET bind(const char *host, int port, int backlog);"); fprintf(fd, "\n /// Accept next request (returns socket or SOAP_INVALID_SOCKET upon error)"); fprintf(fd, "\n virtual SOAP_SOCKET accept();"); fprintf(fd, "\n #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); fprintf(fd, "\n /// When SSL is used, after accept() should perform and accept SSL handshake"); fprintf(fd, "\n virtual int ssl_accept();"); fprintf(fd, "\n #endif"); fprintf(fd, "\n #endif"); fprintf(fd, "\n /// After accept() serve the pending request (returns SOAP_OK or error code)"); fprintf(fd, "\n virtual int serve();"); fprintf(fd, "\n /// Used by serve() to dispatch a pending request (returns SOAP_OK or error code)"); fprintf(fd, "\n virtual int dispatch();"); if (jflag) fprintf(fd, "\n virtual int dispatch(struct soap *soap);"); fprintf(fd, "\n //\n // Service operations are listed below: you should define these\n // Note: compile with -DWITH_PURE_VIRTUAL to declare pure virtual methods"); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) gen_method(fd, method, 1); fprintf(fd, "\n };"); if (namespaceid) fprintf(fd, "\n\n } // namespace %s\n", namespaceid); if (fd != freport) fprintf(fd, "\n#endif\n"); else { fprintf(freport, "\n\nUse the service request dispatcher to accept and process service requests:\n\n"); fprintf(freport, "- `int serve()` serves requests by calling one of the service methods that matches the request. Returns `SOAP_OK` or an error code. This function supports CGI by accepting a request on stdin and sending the response to stdout, and FastCGI. To serve over HTTP(S), use the following functions to establish a connection:\n\n"); fprintf(freport, "- `SOAP_SOCKET bind(const char *host, int port, int backlog)` returns master socket bound to port (and restricted to host name, if not NULL) or `SOAP_INVALID_SOCKET` upon error\n"); fprintf(freport, "- `SOAP_SOCKET accept()` accepts connection and returns socket when accepted, or `SOAP_INVALID_SOCKET` upon error\n"); fprintf(freport, "- `int soap_ssl_accept()` performs SSL handshake and returns `SOAP_OK` when successful or an error code, invoke this method after `accept()` to accept SSL/TLS connection\n\n"); for (method = table->list; method; method = method->next) { Entry *result, *p; result = (Entry*)method->info.typ->ref; p = entry(classtable, method->sym); if (!p) execerror("no table entry"); if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) { gen_report_operation(name, method, 1); gen_method(freport, method, 1); fprintf(freport, "\n\nwhere:\n\n"); gen_report_params(p, result, 1); if (!is_transient(result->info.typ)) fprintf(freport, "This service method should be implemented as part of the service back-end code and return `SOAP_OK` and set the last parameter `%s` to the result, or return an error code\n\n", ident(result->sym->name)); else fprintf(freport, "This service method should be implemented as part of the service back-end code and call `int %s::send_%s_empty_response(int httpcode)` with a HTTP status or error code (200 to 599) to return, when communicating over HTTP to return a HTTP header.\n\n", name, ns_remove(method->sym->name)); gen_report_hr(); } } } } void gen_object_code(FILE *fd, Table *table, Symbol *ns, const char *name) { Entry *p, *method, *catch_method, *param; Table *t; const char *soap; if (iflag) soap = "this"; else soap = "this->soap"; fprintf(fd, "\n\n#include \"%s%s.h\"", prefix, name); if (namespaceid) fprintf(fd, "\n\nnamespace %s {", namespaceid); if (iflag) { fprintf(fd, "\n\n%s::%s() : soap(SOAP_IO_DEFAULT)\n{\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const %s& rhs)\n{\tsoap_copy_context(this, &rhs);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const struct soap &_soap) : soap(_soap)\n{ }", name, name); fprintf(fd, "\n\n%s::%s(soap_mode iomode) : soap(iomode)\n{\t%s_init(iomode, iomode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode imode, soap_mode omode) : soap(imode, omode)\n{\t%s_init(imode, omode);\n}", name, name, name); fprintf(fd, "\n\n%s::~%s()\n{\n\tthis->destroy();\n}", name, name); } else { fprintf(fd, "\n\n%s::%s()\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(const %s& rhs)\n{\tthis->soap = rhs.soap;\n\tthis->soap_own = false;\n}", name, name, name); fprintf(fd, "\n\n%s::%s(struct soap *_soap)\n{\tthis->soap = _soap;\n\tthis->soap_own = false;\n\t%s_init(_soap->imode, _soap->omode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode iomode)\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(iomode, iomode);\n}", name, name, name); fprintf(fd, "\n\n%s::%s(soap_mode imode, soap_mode omode)\n{\tthis->soap = soap_new();\n\tthis->soap_own = true;\n\t%s_init(imode, omode);\n}", name, name, name); fprintf(fd, "\n\n%s::~%s()\n{\tif (this->soap_own)\n\t{\tthis->destroy();\n\t\tsoap_free(this->soap);\n\t}\n}", name, name); } fprintf(fd, "\n\nvoid %s::%s_init(soap_mode imode, soap_mode omode)\n{\tsoap_imode(%s, imode);\n\tsoap_omode(%s, omode);\n\tstatic const struct Namespace namespaces[] = ", name, name, soap, soap); gen_nsmap(fd); fprintf(fd, "\tsoap_set_namespaces(%s, namespaces);\n}", soap); fprintf(fd, "\n\nvoid %s::destroy()\n{\tsoap_destroy(%s);\n\tsoap_end(%s);\n}", name, soap, soap); fprintf(fd, "\n\nvoid %s::reset()\n{\tthis->destroy();\n\tsoap_done(%s);\n\tsoap_initialize(%s);\n\t%s_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);\n}", name, soap, soap, name); if (iflag) { fprintf(fd, "\n\n#ifndef WITH_PURE_VIRTUAL\n%s *%s::copy()\n{\t%s *dup = SOAP_NEW_UNMANAGED(%s(*(struct soap*)%s));\n\treturn dup;\n}\n#endif", name, name, name, name, soap); fprintf(fd, "\n\n%s& %s::operator=(const %s& rhs)\n{\tsoap_done(this);\n\tsoap_copy_context(this, &rhs);\n\treturn *this;\n}", name, name, name); } else { fprintf(fd, "\n\n#ifndef WITH_PURE_VIRTUAL\n%s *%s::copy()\n{\t%s *dup = SOAP_NEW_UNMANAGED(%s);\n\tif (dup)\n\t{\tsoap_done(dup->soap);\n\t\tsoap_copy_context(dup->soap, this->soap);\n\t}\n\treturn dup;\n}\n#endif", name, name, name, name); fprintf(fd, "\n\n%s& %s::operator=(const %s& rhs)\n{\tif (this->soap != rhs.soap)\n\t{\tif (this->soap_own)\n\t\t\tsoap_free(this->soap);\n\t\tthis->soap = rhs.soap;\n\t\tthis->soap_own = false;\n\t}\n\treturn *this;\n}", name, name, name); } fprintf(fd, "\n\nint %s::soap_close_socket()\n{\treturn soap_closesock(%s);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_force_close_socket()\n{\treturn soap_force_closesock(%s);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_senderfault(const char *string, const char *detailXML)\n{\treturn ::soap_sender_fault(%s, string, detailXML);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_senderfault(const char *subcodeQName, const char *string, const char *detailXML)\n{\treturn ::soap_sender_fault_subcode(%s, subcodeQName, string, detailXML);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_receiverfault(const char *string, const char *detailXML)\n{\treturn ::soap_receiver_fault(%s, string, detailXML);\n}", name, soap); fprintf(fd, "\n\nint %s::soap_receiverfault(const char *subcodeQName, const char *string, const char *detailXML)\n{\treturn ::soap_receiver_fault_subcode(%s, subcodeQName, string, detailXML);\n}", name, soap); fprintf(fd, "\n\nvoid %s::soap_print_fault(FILE *fd)\n{\t::soap_print_fault(%s, fd);\n}", name, soap); fprintf(fd, "\n\n#ifndef WITH_LEAN\n#ifndef WITH_COMPAT\nvoid %s::soap_stream_fault(std::ostream& os)\n{\t::soap_stream_fault(%s, os);\n}\n#endif", name, soap); fprintf(fd, "\n\nchar *%s::soap_sprint_fault(char *buf, size_t len)\n{\treturn ::soap_sprint_fault(%s, buf, len);\n}\n#endif", name, soap); fprintf(fd, "\n\nvoid %s::soap_noheader()\n{\t%s->header = NULL;\n}", name, soap); if (!namespaceid) { p = entry(classtable, lookup("SOAP_ENV__Header")); if (p) { t = (Table*)p->info.typ->ref; if (t && t->list && !is_void(t->list->info.typ)) { fprintf(fd, "\n\nvoid %s::soap_header(", name); gen_params_ref(fd, t, NULL, 0); fprintf(fd, "\n{\n\t::soap_header(%s);", soap); for (param = t->list; param; param = param->next) { if (namespaceid) fprintf(fd, "\n\t((%s::SOAP_ENV__Header*)%s->header)->%s = %s;", namespaceid, soap, ident(param->sym->name), ident(param->sym->name)); else fprintf(fd, "\n\t%s->header->%s = %s;", soap, ident(param->sym->name), ident(param->sym->name)); } fprintf(fd, "\n}"); } } } fprintf(fd, "\n\n::SOAP_ENV__Header *%s::soap_header()\n{\treturn %s->header;\n}", name, soap); fprintf(fd, "\n\n#ifndef WITH_NOIO"); fprintf(fd, "\nint %s::run(int port, int backlog)\n{\tif (!soap_valid_socket(%s->master) && !soap_valid_socket(this->bind(NULL, port, backlog)))\n\t\treturn %s->error;\n\tfor (;;)\n\t{\tif (!soap_valid_socket(this->accept()))\n\t\t{\tif (%s->errnum == 0) // timeout?\n\t\t\t\t%s->error = SOAP_OK;\n\t\t\tbreak;\n\t\t}\n\t\tif (this->serve())\n\t\t\tbreak;\n\t\tthis->destroy();\n\t}\n\treturn %s->error;\n}", name, soap, soap, soap, soap, soap); fprintf(fd, "\n\n#if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); fprintf(fd, "\nint %s::ssl_run(int port, int backlog)\n{\tif (!soap_valid_socket(%s->master) && !soap_valid_socket(this->bind(NULL, port, backlog)))\n\t\treturn %s->error;\n\tfor (;;)\n\t{\tif (!soap_valid_socket(this->accept()))\n\t\t{\tif (%s->errnum == 0) // timeout?\n\t\t\t\t%s->error = SOAP_OK;\n\t\t\tbreak;\n\t\t}\n\t\tif (this->ssl_accept() || this->serve())\n\t\t\tbreak;\n\t\tthis->destroy();\n\t}\n\treturn %s->error;\n}", name, soap, soap, soap, soap, soap); fprintf(fd, "\n#endif"); fprintf(fd, "\n\nSOAP_SOCKET %s::bind(const char *host, int port, int backlog)\n{\treturn soap_bind(%s, host, port, backlog);\n}", name, soap); fprintf(fd, "\n\nSOAP_SOCKET %s::accept()\n{\treturn soap_accept(%s);\n}", name, soap); fprintf(fd, "\n\n#if defined(WITH_OPENSSL) || defined(WITH_GNUTLS)"); fprintf(fd, "\nint %s::ssl_accept()\n{\treturn soap_ssl_accept(%s);\n}", name, soap); fprintf(fd, "\n#endif"); fprintf(fd, "\n#endif"); fprintf(fd, "\n\nint %s::serve()", name); fprintf(fd, "\n{\n#ifndef WITH_FASTCGI\n\t%s->keep_alive = %s->max_keep_alive + 1;\n#endif\n\tdo\n\t{", soap, soap); fprintf(fd, "\n#ifndef WITH_FASTCGI\n\t\tif (%s->keep_alive > 0 && %s->max_keep_alive > 0)\n\t\t\t%s->keep_alive--;\n#endif", soap, soap, soap); fprintf(fd, "\n\t\tif (soap_begin_serve(%s))\n\t\t{\tif (%s->error >= SOAP_STOP)\n\t\t\t\tcontinue;\n\t\t\treturn %s->error;\n\t\t}", soap, soap, soap); fprintf(fd, "\n\t\tif ((dispatch() || (%s->fserveloop && %s->fserveloop(%s))) && %s->error && %s->error < SOAP_STOP)\n\t\t{\n#ifdef WITH_FASTCGI\n\t\t\tsoap_send_fault(%s);\n#else\n\t\t\treturn soap_send_fault(%s);\n#endif\n\t\t}", soap, soap, soap, soap, soap, soap, soap); fprintf(fd, "\n#ifdef WITH_FASTCGI\n\t\tsoap_destroy(%s);\n\t\tsoap_end(%s);\n\t} while (1);\n#else\n\t} while (%s->keep_alive);\n#endif", soap, soap, soap); fprintf(fd, "\n\treturn SOAP_OK;"); fprintf(fd, "\n}\n"); for (method = table->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) { if (jflag) fprintf(fd, "\nstatic int serve_%s(struct soap*, %s*);", ident(method->sym->name), name); else fprintf(fd, "\nstatic int serve_%s(%s*);", ident(method->sym->name), name); } } fprintf(fd, "\n\nint %s::dispatch()\n{", name); if (!iflag) { fprintf(fd, "\treturn dispatch(this->soap);\n}"); fprintf(fd, "\n\nint %s::dispatch(struct soap* soap)\n{", name); fprintf(fd, "\n\t%s_init(soap->imode, soap->omode);", name); soap = "soap"; } if (sflag) fprintf(fd, "\n\t%s->mode |= SOAP_XML_STRICT;", soap); if (aflag) { int i, num = 0; struct pair *map; for (method = table->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) { int found = 0; Service *sp; for (sp = services; sp; sp = sp->next) { if (has_ns_eq(sp->ns, method->sym->name)) { Method *m; for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, method->sym->name)) { if (m->mess == ACTION || m->mess == REQUEST_ACTION) { ++num; found = 1; } } } } } if (Aflag && !found) { sprintf(errbuf, "Option -A requires a SOAPAction specified for operation %s where none is defined", ident(method->sym->name)); compliancewarn(errbuf); } } } map = (struct pair*)emalloc(num * sizeof(struct pair)); num = 0; for (method = table->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) { Service *sp; for (sp = services; sp; sp = sp->next) { if (has_ns_eq(sp->ns, method->sym->name)) { Method *m; for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, method->sym->name)) { if (m->mess == ACTION || m->mess == REQUEST_ACTION) { map[num].action = m->part; map[num].method = method; ++num; } } } } } } } if (num > 0) { qsort(map, num, sizeof(struct pair), mapcomp); if (num > 4) /* binary search worthwhile when num > 4 */ { fprintf(fd, "\n\tif (soap->action)\n\t{\n\t\tconst char *soap_action[] = { "); for (i = 0; i < num; i++) { if (*map[i].action == '"') fprintf(fd, "%s, ", map[i].action); else fprintf(fd, "\"%s\", ", map[i].action); } fprintf(fd, " };"); fprintf(fd, "\n\t\tswitch (soap_binary_search_string(soap_action, %d, soap->action))\n\t\t{", num); for (i = 0; i < num; i++) { fprintf(fd, "\n\t\t\tcase %d:\t", i); if (iflag) fprintf(fd, "\n\t\t\t\treturn serve_%s(this);", ident(map[i].method->sym->name)); else fprintf(fd, "\n\t\t\t\treturn serve_%s(%s, this);", ident(map[i].method->sym->name), soap); } fprintf(fd, "\n\t\t}\n\t}"); } else { fprintf(fd, "\n\tif (soap->action)\n\t{"); for (i = 0; i < num; i++) { if (*map[i].action == '"') fprintf(fd, "\n\t\tif (!strcmp(soap->action, %s))", map[i].action); else fprintf(fd, "\n\t\tif (!strcmp(soap->action, \"%s\"))", map[i].action); if (iflag) fprintf(fd, "\n\t\t\treturn serve_%s(this);", ident(map[i].method->sym->name)); else fprintf(fd, "\n\t\t\treturn serve_%s(%s, this);", ident(map[i].method->sym->name), soap); } fprintf(fd, "\n\t}"); } } } if (!Aflag) { fprintf(fd, "\n\tsoap_peek_element(%s);", soap); catch_method = NULL; for (method = table->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && has_ns_eq(ns->name, method->sym->name)) { if (is_invisible(method->sym->name)) { Entry *param = entry(classtable, method->sym); if (param) param = ((Table*)param->info.typ->ref)->list; if (param) { fprintf(fd, "\n\tif (!soap_match_tag(%s, %s->tag, \"%s\")", soap, soap, ns_convert(param->sym->name)); if (iflag) fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(method->sym->name)); else fprintf(fd, ")\n\t\treturn serve_%s(%s, this);", ident(method->sym->name), soap); } else { catch_method = method; } } else { fprintf(fd, "\n\tif (!soap_match_tag(%s, %s->tag, \"%s\")", soap, soap, ns_convert(method->sym->name)); if (iflag) fprintf(fd, ")\n\t\treturn serve_%s(this);", ident(method->sym->name)); else fprintf(fd, ")\n\t\treturn serve_%s(%s, this);", ident(method->sym->name), soap); } } } if (catch_method) { if (iflag) fprintf(fd, "\n\treturn serve_%s(this);\n}", ident(catch_method->sym->name)); else fprintf(fd, "\n\treturn serve_%s(soap, this);\n}", ident(catch_method->sym->name)); } else { fprintf(fd, "\n\treturn %s->error = SOAP_NO_METHOD;\n}", soap); } } else { fprintf(fd, "\n\treturn %s->error = SOAP_NO_METHOD;\n}", soap); } for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ) && has_ns_eq(ns->name, method->sym->name)) gen_serve_method(fd, table, method, name); if (namespaceid) fprintf(fd, "\n\n} // namespace %s\n", namespaceid); fprintf(fd, "\n/* End of server object code */\n"); } void gen_method(FILE *fd, Entry *method, int server) { Table *params; Entry *result, *p; const char *soap; if (iflag) soap = "this"; else soap = "this->soap"; result = (Entry*)method->info.typ->ref; p = entry(classtable, method->sym); if (!p) execerror("no table entry"); params = (Table*)p->info.typ->ref; if (server || !is_transient(result->info.typ)) { if (is_transient(result->info.typ)) fprintf(fd, "\n //\n /// Web service one-way operation '%s' implementation, should return value of send_%s_empty_response() to send HTTP Accept acknowledgment, or return an error code, or return SOAP_OK to immediately return without sending an HTTP response message", ns_remove(method->sym->name), ns_remove(method->sym->name)); else if (server) fprintf(fd, "\n //\n /// Web service operation '%s' implementation, should return SOAP_OK or error code", ns_remove(method->sym->name)); else fprintf(fd, "\n //\n /// Web service synchronous operation '%s' with default endpoint and default SOAP Action header, returns SOAP_OK or error code", ns_remove(method->sym->name)); fprintf(fd, "\n virtual int %s(", ns_cname(method->sym->name, NULL)); gen_params_ref(fd, params, result, 0); if (!server) { fprintf(fd, " { return this->%s(NULL, NULL", ns_cname(method->sym->name, NULL)); gen_args(fd, params, result, 1); fprintf(fd, "; }"); fprintf(fd, "\n /// Web service synchronous operation '%s' to the specified endpoint and SOAP Action header, returns SOAP_OK or error code", ns_remove(method->sym->name)); fprintf(fd, "\n virtual int %s(const char *soap_endpoint_url, const char *soap_action", ns_cname(method->sym->name, NULL)); gen_params_ref(fd, params, result, 1); fprintf(fd, " { return this->send_%s(soap_endpoint_url, soap_action", ns_cname(method->sym->name, NULL)); gen_args(fd, params, NULL, 1); fprintf(fd, " || this->recv_%s(", ns_cname(method->sym->name, NULL)); gen_args(fd, NULL, result, 0); if (iflag) fprintf(fd, " ? this->error : SOAP_OK; }"); else fprintf(fd, " ? this->soap->error : SOAP_OK; }"); fprintf(fd, "\n /// Web service asynchronous operation 'send_%s' to send a request message to the specified endpoint and SOAP Action header, returns SOAP_OK or error code", ns_remove(method->sym->name)); fprintf(fd, "\n virtual int send_%s(const char *soap_endpoint_url, const char *soap_action", ns_cname(method->sym->name, NULL)); gen_params_ref(fd, params, NULL, 1); fprintf(fd, ";"); fprintf(fd, "\n /// Web service asynchronous operation 'recv_%s' to receive a response message from the connected endpoint, returns SOAP_OK or error code", ns_remove(method->sym->name)); fprintf(fd, "\n virtual int recv_%s(", ns_cname(method->sym->name, NULL)); gen_params_ref(fd, NULL, result, 0); fprintf(fd, ";"); } if (server) fprintf(fd, " SOAP_PURE_VIRTUAL;"); if (is_transient(result->info.typ)) { fprintf(fd, "\n /// Web service asynchronous send of HTTP Accept acknowledgment to be called in '%s', returns SOAP_OK or error code", ns_remove(method->sym->name)); fprintf(fd, "\n virtual int send_%s_empty_response(int soap_http_status = 202) { return soap_send_empty_response(%s, soap_http_status); }", ns_cname(method->sym->name, NULL), soap); } } else { fprintf(fd, "\n //\n /// Web service one-way synchronous send operation '%s' to the default endpoint with the default SOAP Action header then wait for HTTP OK/Accept response, returns SOAP_OK or error code", ns_remove(method->sym->name)); fprintf(fd, "\n virtual int %s(", ns_cname(method->sym->name, NULL)); gen_params_ref(fd, params, result, 0); fprintf(fd, " { return this->%s(NULL, NULL", ns_cname(method->sym->name, NULL)); gen_args(fd, params, result, 1); fprintf(fd, "; }"); fprintf(fd, "\n /// Web service one-way synchronous send operation '%s' to the specified endpoint and SOAP Action header then wait for HTTP OK/Accept response, returns SOAP_OK or error code", ns_remove(method->sym->name)); fprintf(fd, "\n virtual int %s(const char *soap_endpoint_url, const char *soap_action", ns_cname(method->sym->name, NULL)); gen_params_ref(fd, params, result, 1); fprintf(fd, " { return (this->send_%s(soap_endpoint_url, soap_action", ns_cname(method->sym->name, NULL)); gen_args(fd, params, result, 1); fprintf(fd, " || soap_recv_empty_response(%s)) ? %s->error : SOAP_OK; }", soap, soap); fprintf(fd, "\n /// Web service one-way asynchronous send operation 'send_%s' with default endpoint and default SOAP Action header, returns SOAP_OK or error code", ns_remove(method->sym->name)); fprintf(fd, "\n virtual int send_%s(", ns_cname(method->sym->name, NULL)); gen_params_ref(fd, params, result, 0); fprintf(fd, " { return this->send_%s(NULL, NULL", ns_cname(method->sym->name, NULL)); gen_args(fd, params, result, 1); fprintf(fd, "; }"); fprintf(fd, "\n /// Web service one-way asynchronous send operation 'send_%s' to the specified endpoint and SOAP Action header, returns SOAP_OK or error code", ns_remove(method->sym->name)); fprintf(fd, "\n virtual int send_%s(const char *soap_endpoint_url, const char *soap_action", ns_cname(method->sym->name, NULL)); gen_params_ref(fd, params, result, 1); fprintf(fd, ";\n /// Web service one-way asynchronous receive operation 'recv_%s', returns SOAP_OK or error code", ns_remove(method->sym->name)); fprintf(fd, ";\n virtual int recv_%s(", ns_cname(method->sym->name, NULL)); fprintf(fd, "struct %s&);", ident(method->sym->name)); fprintf(fd, "\n /// Web service asynchronous receive of HTTP Accept acknowledgment for one-way asynchronous send operation 'send_%s', returns SOAP_OK or error code", ns_remove(method->sym->name)); fprintf(fd, "\n virtual int recv_%s_empty_response() { return soap_recv_empty_response(%s); }", ns_cname(method->sym->name, NULL), soap); } } void gen_report_params(Entry *type, Entry *result, int server) { Table *params = (Table*)type->info.typ->ref; if (params) { Entry *param; for (param = params->list; param; param = param->next) { fprintf(freport, "- `%s` is %s", c_type_id(param->info.typ, param->sym->name), param->info.minOccurs > 0 ? "required" : "optional"); if (param->info.hasval || param->info.ptrval) { if (param->info.fixed) fprintf(freport, " with the fixed value%s", c_init(param)); else fprintf(freport, " with default value%s", c_init(param)); } gen_report_member(type, param); gen_report_type(param->info.typ, "parameter"); if (is_unmatched(param->sym)) fprintf(freport, " (the leading underscore makes this parameter a wildcard that matches any XML element tag)"); fprintf(freport, "\n"); } } if (!is_transient(result->info.typ)) { Tnode *ref = (Tnode*)result->info.typ->ref; if (result->info.typ->type == Tpointer) fprintf(freport, "- `%s` is the service operation response, which is a non-NULL pointer to a `%s`%s", c_type_id(result->info.typ, result->sym->name), c_type(result->info.typ->ref), server ? " that the service operation should populate with the response data" : " that the client provides with the call and is populated by the service operation as the result of the call"); else fprintf(freport, "- `%s` is the service operation response data populated by the service operation", c_type_id(result->info.typ, result->sym->name)); gen_report_type(ref, "result parameter"); if (is_unmatched(result->sym)) fprintf(freport, " (the leading underscore makes this result parameter a wildcard that matches any XML element tag)"); fprintf(freport, "\n"); } fprintf(freport, "\n"); } void gen_report_req_params(Tnode *typ) { Table *Tptr; Entry *Eptr; int derclass = 0, flag = 0; if (!is_dynamic_array(typ)) { for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) { if (is_repetition(Eptr) || is_anytype(Eptr)) flag = 2; if ((Eptr->info.minOccurs > 0 || flag) && !(Eptr->info.sto & (Sprivate | Sprotected | Sconst | Sstatic | Stypedef)) && Eptr->info.typ->type != Tfun && !is_soapref(Eptr->info.typ)) { if (flag) flag--; if (is_smart(Eptr->info.typ)) { if (is_smart_shared(Eptr->info.typ)) fprintf(freport, ", %s %s", c_type_id(Eptr->info.typ, "&"), ident(Eptr->sym->name)); else fprintf(freport, ", %s %s", c_type_id(Eptr->info.typ->ref, "*"), ident(Eptr->sym->name)); } else if (Eptr->info.typ->type == Ttemplate && is_smart(Eptr->info.typ->ref) && !is_smart_shared(Eptr->info.typ->ref)) continue; else if (Eptr->info.typ->type == Tclass || Eptr->info.typ->type == Tstruct || Eptr->info.typ->type == Tunion || Eptr->info.typ->type == Ttemplate) fprintf(freport, ", const %s& %s", c_type(Eptr->info.typ), ident(Eptr->sym->name)); else if ((Eptr->info.sto & Sconstptr)) fprintf(freport, ", const %s", c_type_id(Eptr->info.typ, Eptr->sym->name)); else if (Eptr->info.typ->type == Tarray) fprintf(freport, ", %s", c_type_id(Eptr->info.typ, Eptr->sym->name)); else fprintf(freport, ", %s", c_type_id(Eptr->info.typ, Eptr->sym->name)); if (derclass && Eptr->info.typ->type != Tarray) fprintf(freport, "__%d", derclass); } } } } } void gen_report_set_params(Tnode *typ) { Table *Tptr; Entry *Eptr; int derclass = 0; for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) { if (!(Eptr->info.sto & (Sprivate | Sprotected | Sconst | Sstatic | Stypedef)) && Eptr->info.typ->type != Tfun && !is_soapref(Eptr->info.typ)) { if (is_smart(Eptr->info.typ)) { if (is_smart_shared(Eptr->info.typ)) fprintf(freport, ", %s %s", c_type_id(Eptr->info.typ, "&"), ident(Eptr->sym->name)); else fprintf(freport, ", %s %s", c_type_id(Eptr->info.typ->ref, "*"), ident(Eptr->sym->name)); } else if (Eptr->info.typ->type == Ttemplate && is_smart(Eptr->info.typ->ref) && !is_smart_shared(Eptr->info.typ->ref)) continue; else if (Eptr->info.typ->type == Tclass || Eptr->info.typ->type == Tstruct || Eptr->info.typ->type == Tunion || Eptr->info.typ->type == Ttemplate) fprintf(freport, ", const %s& %s", c_type(Eptr->info.typ), ident(Eptr->sym->name)); else if ((Eptr->info.sto & Sconstptr)) fprintf(freport, ", const %s", c_type_id(Eptr->info.typ, Eptr->sym->name)); else if (Eptr->info.typ->type == Tarray) fprintf(freport, ", %s", c_type_id(Eptr->info.typ, Eptr->sym->name)); else fprintf(freport, ", %s", c_type_id(Eptr->info.typ, Eptr->sym->name)); if (derclass && Eptr->info.typ->type != Tarray) fprintf(freport, "__%d", derclass); } } } } void gen_params_ref(FILE *fd, Table *params, Entry *result, int flag) { if (params) { Entry *param; for (param = params->list; param; param = param->next) { if (!cflag && (param->info.typ->type == Tstruct || param->info.typ->type == Tclass)) fprintf(fd, "%s%s%s& %s", (flag || param != params->list) ? ", " : "", c_storage(param->info.sto | Sconst), c_type(param->info.typ), ident(param->sym->name)); else fprintf(fd, "%s%s%s", (flag || param != params->list) ? ", " : "", c_storage(param->info.sto), c_type_id(param->info.typ, param->sym->name)); } } if (!result || is_transient(result->info.typ)) fprintf(fd, ")"); else fprintf(fd, "%s%s%s)", (flag || (params && params->list)) ? ", " : "", c_storage(result->info.sto), c_type_id(result->info.typ, result->sym->name)); } void gen_params(FILE *fd, Table *params, Entry *result, int flag) { if (params) { Entry *param; for (param = params->list; param; param = param->next) fprintf(fd, "%s%s%s", (flag || param != params->list) ? ", " : "", c_storage(param->info.sto), c_type_id(param->info.typ, param->sym->name)); } if (!result || is_transient(result->info.typ)) fprintf(fd, ")"); else fprintf(fd, "%s%s%s)", (flag || (params && params->list)) ? ", " : "", c_storage(result->info.sto), c_type_id(result->info.typ, result->sym->name)); } void gen_args(FILE *fd, Table *params, Entry *result, int flag) { if (params) { Entry *param; for (param = params->list; param; param = param->next) fprintf(fd, "%s%s", (flag || param != params->list) ? ", " : "", ident(param->sym->name)); } if (!result || is_transient(result->info.typ)) fprintf(fd, ")"); else fprintf(fd, "%s%s)", (flag || (params && params->list)) ? ", " : "", ident(result->sym->name)); } void gen_query_url(FILE *fd, Table *params, int soap) { Entry *param; if (soap) fprintf(fd, "\n\tsoap_extend_url_query(soap, soap_endpoint, NULL);"); else fprintf(fd, "\n\tsoap_extend_url_query(soap, soap_endpoint, soap_action);"); for (param = params->list; param; param = param->next) { if (is_transient(param->info.typ)) continue; if (is_repetition(param) && is_primitive_or_string(param->next->info.typ->ref)) { fprintf(fd, "\n\t{\tint i;\n\t\tfor (i = 0; i < (int)%s; i++)\n\t\t\tsoap_url_query(soap, \"%s=\", ", ident(param->sym->name), ns_remove(param->next->sym->name)); gen_query_url_type2s(fd, param->next->info.typ->ref, ident(param->next->sym->name), "", "[i]"); fprintf(fd, ");\n\t}"); param = param->next; } else if (param->info.typ->type == Tpointer && is_container(param->info.typ->ref) && is_primitive_or_string(((Tnode*)param->info.typ->ref)->ref)) { fprintf(fd, "\n\tif (%s)\n\t\tfor (%s::const_iterator i = %s->begin(); i != %s->end(); ++i)\n\t\t\tsoap_url_query(soap, \"%s=\", ", ident(param->sym->name), c_type(param->info.typ->ref), ident(param->sym->name), ident(param->sym->name), ns_remove(param->sym->name)); gen_query_url_type2s(fd, ((Tnode*)param->info.typ->ref)->ref, "i", "*", ""); fprintf(fd, ");"); } else if (is_primitive_or_string(param->info.typ)) { fprintf(fd, "\n\tsoap_url_query(soap, \"%s=\", ", ns_remove(param->sym->name)); gen_query_url_type2s(fd, param->info.typ, ident(param->sym->name), "", ""); fprintf(fd, ");"); } else if (param->info.typ->type == Tpointer && is_primitive_or_string(param->info.typ->ref)) { fprintf(fd, "\n\tif (%s)\n\t\tsoap_url_query(soap, \"%s=\", ", ident(param->sym->name), ns_remove(param->sym->name)); gen_query_url_type2s(fd, param->info.typ->ref, ident(param->sym->name), "*", ""); fprintf(fd, ");"); } } } void gen_query_url_type2s(FILE *fd, Tnode *typ, const char *name, const char *ptr, const char *idx) { if (!is_transient(typ)) { if (is_stdstring(typ)) fprintf(fd, "(%s%s%s).c_str()", ptr, name, idx); else if (is_stdwstring(typ)) fprintf(fd, "soap_wchar2s(soap, (%s%s%s).c_str())", ptr, name, idx); else if (is_string(typ)) fprintf(fd, "%s%s%s", ptr, name, idx); else if (is_wstring(typ)) fprintf(fd, "soap_wchar2s(soap, %s%s%s)", ptr, name, idx); else if (is_primitive(typ)) fprintf(fd, "soap_%s2s(soap, %s%s%s)", c_ident(typ), ptr, name, idx); } } void gen_query_send_form_init(FILE *fd, Table *params) { Entry *param; for (param = params->list; param; param = param->next) { if (!is_transient(param->info.typ)) { if (is_repetition(param) && is_primitive_or_string(param->next->info.typ->ref)) { fprintf(fd, "\n\tint soap_tmp_i;"); break; } } } } void gen_query_send_form(FILE *fd, Table *params) { Entry *param; int init = 0; for (param = params->list; param; param = param->next) { if (!is_transient(param->info.typ)) { if (is_repetition(param) && is_primitive_or_string(param->next->info.typ->ref)) { if (init) fprintf(fd, ")\n\t\treturn soap_closesock(soap);"); fprintf(fd, "\n\tfor (soap_tmp_i = 0; soap_tmp_i < (int)%s; soap_tmp_i++)\n\t\tif (soap_query_send_key(soap, \"%s\") || ", ident(param->sym->name), ns_remove(param->next->sym->name)); gen_query_form_type2s(fd, param->next->info.typ->ref, ident(param->next->sym->name), "", "[soap_tmp_i]"); fprintf(fd, ")\n\t\t\treturn soap_closesock(soap);"); param = param->next; init = 0; } else if (is_container(param->info.typ) && is_primitive_or_string(param->info.typ->ref)) { if (init) fprintf(fd, ")\n\t\treturn soap_closesock(soap);"); fprintf(fd, "\n\tfor (%s::const_iterator i = %s.begin(); i != %s.end(); ++i)\n\t\tif (soap_query_send_key(soap, \"%s\") || ", c_type(param->info.typ), ident(param->sym->name), ident(param->sym->name), ns_remove(param->sym->name)); gen_query_form_type2s(fd, param->info.typ->ref, "i", "*", ""); fprintf(fd, ")\n\t\t\treturn soap_closesock(soap);"); init = 0; } else if (param->info.typ->type == Tpointer && is_container(param->info.typ->ref) && is_primitive_or_string(((Tnode*)param->info.typ->ref)->ref)) { if (init) fprintf(fd, ")\n\t\treturn soap_closesock(soap);"); fprintf(fd, "\n\tif (%s)\n\t\tfor (%s::const_iterator i = %s->begin(); i != %s->end(); ++i)\n\t\t\tif (soap_query_send_key(soap, \"%s\") || ", ident(param->sym->name), c_type(param->info.typ->ref), ident(param->sym->name), ident(param->sym->name), ns_remove(param->sym->name)); gen_query_form_type2s(fd, ((Tnode*)param->info.typ->ref)->ref, "i", "*", ""); fprintf(fd, ")\n\t\t\t\treturn soap_closesock(soap);"); init = 0; } else if (is_primitive_or_string(param->info.typ)) { if (!init++) fprintf(fd, "\n\tif ("); else fprintf(fd, "\n\t || "); fprintf(fd, "soap_query_send_key(soap, \"%s\")\n\t || ", ns_remove(param->sym->name)); gen_query_form_type2s(fd, param->info.typ, ident(param->sym->name), "", ""); } else if (param->info.typ->type == Tpointer && is_primitive_or_string(param->info.typ->ref)) { if (!init++) fprintf(fd, "\n\tif ("); else fprintf(fd, "\n\t || "); fprintf(fd, "(%s && (soap_query_send_key(soap, \"%s\") || ", ident(param->sym->name), ns_remove(param->sym->name)); gen_query_form_type2s(fd, param->info.typ->ref, ident(param->sym->name), "*", ""); fprintf(fd, "))"); } } } if (!init) fprintf(fd, "\n\tif ("); else fprintf(fd, "\n\t || "); fprintf(fd, "soap_end_send(soap))\n\t\treturn soap_closesock(soap);"); } void gen_query_recv_form_init(FILE *fd, Entry *result) { if ((result->info.typ->type == Treference || result->info.typ->type == Tpointer) && !is_invisible_empty((Tnode*)result->info.typ->ref)) { if ((((Tnode*)(result->info.typ->ref))->type == Tstruct || ((Tnode*)(result->info.typ->ref))->type == Tclass) && !is_stdstr(result->info.typ->ref) && !is_dynamic_array(result->info.typ->ref)) { Table *table = ((Tnode*)result->info.typ->ref)->ref; if (table) { Entry *param; for (param = table->list; param; param = param->next) { if (!is_transient(param->info.typ)) { if (is_repetition(param) && is_primitive_or_string(param->next->info.typ->ref)) { fprintf(fd, "\n\tstruct soap_blist *soap_blist_%s = NULL;", ident(param->next->sym->name)); param = param->next; } } } } } } } void gen_query_recv_form(FILE *fd, Entry *result) { if ((result->info.typ->type == Treference || result->info.typ->type == Tpointer) && !is_invisible_empty((Tnode*)result->info.typ->ref)) { if (is_primitive_or_string(result->info.typ->ref)) { fprintf(fd, "\n\tsoap_tmp_key = soap_query_key(soap, &soap_tmp);\n\tif (!soap_tmp_key)\n\t{\tsoap->error = SOAP_EMPTY;\n\t\treturn soap_closesock(soap);\n\t}"); fprintf(fd, "\n\tif (!strcmp(soap_tmp_key, \"%s\"))\n\t{\tif (", ns_remove(result->sym->name)); gen_query_form_s2type(fd, result->info.typ->ref, ident(result->sym->name), result->info.typ->type == Treference ? "&" : "", "", ""); fprintf(fd, ")\n\t\t\treturn soap_closesock(soap);\n\t}"); } else if ((((Tnode*)(result->info.typ->ref))->type == Tstruct || ((Tnode*)(result->info.typ->ref))->type == Tclass) && !is_dynamic_array(result->info.typ->ref)) { Table *table = ((Tnode*)result->info.typ->ref)->ref; if (table) { Entry *param; fprintf(fd, "\n\twhile (soap_tmp && (soap_tmp_key = soap_query_key(soap, &soap_tmp)))\n\t{"); for (param = table->list; param; param = param->next) { if (!is_transient(param->info.typ)) { if (is_repetition(param) && is_stdstr(param->next->info.typ->ref)) { fprintf(fd, "\n\t\tif (!strcmp(soap_tmp_key, \"%s\"))\n\t\t{\tif (soap_blist_%s == NULL)\n\t\t\t\tsoap_blist_%s = soap_alloc_block(soap);\n\t\t\t%s%s%s = soap_block<%s>::push(soap, soap_blist_%s);\n\t\t\tif (%s%s%s == NULL)\n\t\t\t\tbreak;\n\t\t\t%s%s%s++;\n\t\t\tif (", ns_remove(param->next->sym->name), ident(param->next->sym->name), ident(param->next->sym->name), ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->next->sym->name), c_type(param->next->info.typ->ref), ident(param->next->sym->name), ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->next->sym->name), ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->sym->name)); gen_query_form_s2type(fd, param->next->info.typ->ref, ident(result->sym->name), "", result->info.typ->type == Treference ? "." : "->", ident(param->next->sym->name)); fprintf(fd, ")\n\t\t\t\tbreak;\n\t\t}"); param = param->next; } else if (is_repetition(param) && is_primitive_or_string(param->next->info.typ->ref)) { fprintf(fd, "\n\t\tif (!strcmp(soap_tmp_key, \"%s\"))\n\t\t{\tif (soap_blist_%s == NULL)\n\t\t\t\tsoap_blist_%s = soap_alloc_block(soap);\n\t\t\t%s%s%s = (%s)soap_push_block_max(soap, soap_blist_%s, sizeof(%s));\n\t\t\tif (%s%s%s == NULL)\n\t\t\t\tbreak;\n\t\t\t%s%s%s++;\n\t\t\tif (", ns_remove(param->next->sym->name), ident(param->next->sym->name), ident(param->next->sym->name), ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->next->sym->name), c_type(param->next->info.typ), ident(param->next->sym->name), c_type(param->next->info.typ->ref), ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->next->sym->name), ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->sym->name)); gen_query_form_s2type(fd, param->next->info.typ->ref, ident(result->sym->name), "", result->info.typ->type == Treference ? "." : "->", ident(param->next->sym->name)); fprintf(fd, ")\n\t\t\t\tbreak;\n\t\t}"); param = param->next; } else if (is_container(param->info.typ) && is_primitive_or_string(param->info.typ->ref)) { fprintf(fd, "\n\t\tif (!strcmp(soap_tmp_key, \"%s\"))\n\t\t{\t%s soap_tmp_val;\n\t\t\tif (", ns_remove(param->sym->name), c_type(param->info.typ->ref)); gen_query_form_s2type(fd, param->info.typ->ref, "soap_tmp_val", "&", "", ""); fprintf(fd, ")\n\t\t\t\tbreak;\n\t\t\t%s%s%s.insert(%s%s%s.end(), soap_tmp_val);\n\t\t}", ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->sym->name), ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->sym->name)); } else if (param->info.typ->type == Tpointer && is_container(param->info.typ->ref) && is_primitive_or_string(((Tnode*)param->info.typ->ref)->ref)) { fprintf(fd, "\n\t\tif (!strcmp(soap_tmp_key, \"%s\"))\n\t\t{\t%s soap_tmp_val;\n\t\t\tif (", ns_remove(param->sym->name), c_type(((Tnode*)param->info.typ->ref)->ref)); gen_query_form_s2type(fd, ((Tnode*)param->info.typ->ref)->ref, "soap_tmp_val", "&", "", ""); fprintf(fd, ")\n\t\t\t\tbreak;\n\t\t\t%s%s%s->insert(%s%s%s->end(), soap_tmp_val);\n\t\t}", ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->sym->name), ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->sym->name)); } else if (is_primitive_or_string(param->info.typ)) { fprintf(fd, "\n\t\tif (!strcmp(soap_tmp_key, \"%s\"))\n\t\t{\tif (", ns_remove(param->sym->name)); gen_query_form_s2type(fd, param->info.typ, ident(result->sym->name), "&", result->info.typ->type == Treference ? "." : "->", ident(param->sym->name)); fprintf(fd, ")\n\t\t\t\tbreak;\n\t\t}"); } else if (param->info.typ->type == Tpointer && is_primitive_or_string(param->info.typ->ref)) { fprintf(fd, "\n\t\tif (!strcmp(soap_tmp_key, \"%s\"))\n\t\t{\tif (", ns_remove(param->sym->name)); gen_query_form_s2type(fd, param->info.typ->ref, ident(result->sym->name), "", result->info.typ->type == Treference ? "." : "->", ident(param->sym->name)); fprintf(fd, ")\n\t\t\t\tbreak;\n\t\t}"); } } } fprintf(fd, "\n\t}"); for (param = table->list; param; param = param->next) { if (!is_transient(param->info.typ)) { if (is_repetition(param) && is_stdstr(param->next->info.typ->ref)) { fprintf(fd, "\n\tif (soap_blist_%s)\n\t{\t%s%s%s = soap_new_%s(soap, %s%s%s);\n\t\tif (%s%s%s)\n\t\t\tsoap_block<%s>::save(soap, soap_blist_%s, %s%s%s);\n\t}", ident(param->next->sym->name), ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->next->sym->name), c_ident(param->next->info.typ->ref), ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->sym->name), ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->next->sym->name), c_type(param->next->info.typ->ref), ident(param->next->sym->name), ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->next->sym->name)); } else if (is_repetition(param) && is_primitive_or_string(param->next->info.typ->ref)) { fprintf(fd, "\n\tif (soap_blist_%s)\n\t\t%s%s%s = (%s)soap_save_block(soap, soap_blist_%s, NULL, 1);", ident(param->next->sym->name), ident(result->sym->name), result->info.typ->type == Treference ? "." : "->", ident(param->next->sym->name), c_type(param->next->info.typ), ident(param->next->sym->name)); param = param->next; } } } } } } } void gen_query_form_type2s(FILE *fd, Tnode *typ, const char *name, const char *ptr, const char *idx) { if (is_stdstring(typ)) fprintf(fd, "soap_query_send_val(soap, (%s%s%s).c_str())", ptr, name, idx); else if (is_stdwstring(typ)) fprintf(fd, "soap_query_send_val(soap, soap_wchar2s(soap, (%s%s%s)->c_str()))", ptr, name, idx); else if (is_string(typ)) fprintf(fd, "soap_query_send_val(soap, %s%s%s)", ptr, name, idx); else if (is_wstring(typ)) fprintf(fd, "soap_query_send_val(soap, soap_wchar2s(soap, %s%s%s))", ptr, name, idx); else if (typ->type == Tenum || typ->type == Tenumsc) fprintf(fd, "soap_query_send_val(soap, soap_%s2s(soap, %s%s%s))", c_ident(typ), ptr, name, idx); else if (is_primitive(typ)) fprintf(fd, "soap_query_send_val(soap, soap_%s2s(soap, %s%s%s))", c_ident(typ), ptr, name, idx); } void gen_query_form_s2type(FILE *fd, Tnode *typ, const char *name, const char *ptr, const char *ref, const char *idx) { if (is_stdstring(typ)) fprintf(fd, "soap_s2stdchar(soap, soap_query_val(soap, &soap_tmp), %s%s%s%s, %d, %ld, %ld, %s)", ptr, name, ref, idx, property(typ), minlen(typ), maxlen(typ), pattern(typ)); else if (is_stdwstring(typ)) fprintf(fd, "soap_s2stdwchar(soap, soap_query_val(soap, &soap_tmp), %s%s%s%s, %d, %ld, %ld, %s)", ptr, name, ref, idx, property(typ), minlen(typ), maxlen(typ), pattern(typ)); else if (is_string(typ)) fprintf(fd, "soap_string(soap, soap_query_val(soap, &soap_tmp), %s%s%s%s, %d, %ld, %ld, %s)", ptr, name, ref, idx, property(typ), minlen(typ), maxlen(typ), pattern(typ)); else if (is_wstring(typ)) fprintf(fd, "soap_wstring(soap, soap_query_val(soap, &soap_tmp), %s%s%s%s, %d, %ld, %ld, %s)", ptr, name, ref, idx, property(typ), minlen(typ), maxlen(typ), pattern(typ)); else if (is_primitive(typ)) fprintf(fd, "soap_s2%s(soap, soap_query_val(soap, &soap_tmp), %s%s%s%s)", c_ident(typ), ptr, name, ref, idx); } void gen_call_proto(FILE *fd, Entry *method) { Table *params; Entry *result, *p; result = (Entry*)method->info.typ->ref; p = entry(classtable, method->sym); if (!p) execerror("no table entry"); params = (Table*)p->info.typ->ref; if (fd == freport) gen_report_operation(NULL, method, 0); if (!is_transient(result->info.typ)) { fprintf(fd, "\n "); fprintf(fd, "\n /** Web service synchronous operation 'soap_call_%s' to the specified endpoint and SOAP Action header, returns SOAP_OK or error code */", ident(method->sym->name)); fprintf(fd, "\n SOAP_FMAC5 int SOAP_FMAC6 soap_call_%s(struct soap *soap, const char *soap_endpoint, const char *soap_action", ident(method->sym->name)); gen_params_ref(fd, params, result, 1); fprintf(fd, ";"); fprintf(fd, "\n /** Web service asynchronous operation 'soap_send_%s' to send a request message to the specified endpoint and SOAP Action header, returns SOAP_OK or error code */", ident(method->sym->name)); fprintf(fd, "\n SOAP_FMAC5 int SOAP_FMAC6 soap_send_%s(struct soap *soap, const char *soap_endpoint, const char *soap_action", ident(method->sym->name)); gen_params_ref(fd, params, NULL, 1); fprintf(fd, ";"); fprintf(fd, "\n /** Web service asynchronous operation 'soap_recv_%s' to receive a response message from the connected endpoint, returns SOAP_OK or error code */", ident(method->sym->name)); fprintf(fd, "\n SOAP_FMAC5 int SOAP_FMAC6 soap_recv_%s(struct soap *soap", ident(method->sym->name)); gen_params_ref(fd, NULL, result, 1); fprintf(fd, ";"); } else { fprintf(fd, "\n /** Web service one-way asynchronous operation 'soap_send_%s' */", ident(method->sym->name)); fprintf(fd, "\n SOAP_FMAC5 int SOAP_FMAC6 soap_send_%s(struct soap *soap, const char *soap_endpoint, const char *soap_action", ident(method->sym->name)); gen_params_ref(fd, params, NULL, 1); fprintf(fd, ";"); fprintf(fd, "\n /** Web service one-way asynchronous operation 'soap_recv_%s' */", ident(method->sym->name)); fprintf(fd, "\n SOAP_FMAC5 int SOAP_FMAC6 soap_recv_%s(struct soap *soap, struct %s *%s);", ident(method->sym->name), ident(method->sym->name), ident(result->sym->name)); } if (fd == freport) { fprintf(freport, "\n\nwhere:\n\n- `struct soap *soap` is the context\n- `const char *soap_endpoint` is the endpoint URL (or list of space-separated URLs) or NULL to use the default endpoint(s)\n- `const char *soap_action` is the SOAP action header or NULL to use the default action (recommended)\n"); gen_report_params(p, result, 0); if (!is_transient(result->info.typ)) fprintf(freport, "The `soap_call_%s` function sends the request message and receives the response message, assigning the last parameter `%s` the response value received. The `soap_send_%s` function sends the request message and the `soap_recv_%s` function receives the response message asynchronously. These functions return `SOAP_OK` or an error code.\n\n", ident(method->sym->name), ident(result->sym->name), ident(method->sym->name), ident(method->sym->name)); else fprintf(freport, "The `soap_send_%s` function sends the one-way request message and the `soap_recv_%s` function receives the one-way request message. The `int soap_recv_empty_response(struct soap *soap)` function should be called after the `send_%s` function when communicating over HTTP to receive the HTTP acknowledgment.\n\n", ident(method->sym->name), ident(method->sym->name), ident(method->sym->name)); gen_report_hr(); } } void gen_call_method(FILE *fd, Entry *method, const char *name) { Service *sp; Method *m; int soap = (soap_version >= 0); int version = soap_version; int get = 0; int put = 0; int del = 0; int post = 0; int mimein = 0; int mimeout = 0; const char *encoding = NULL; const char *xtag; const char *action = NULL, *method_encoding = NULL, *method_response_encoding = NULL; Table *params; Entry *param, *result, *p, *response = NULL; result = (Entry*)method->info.typ->ref; (void)post; p = entry(classtable, method->sym); if (!p) execerror("no table entry"); params = (Table*)p->info.typ->ref; if (!is_response(result->info.typ) && !is_XML(result->info.typ)) response = get_response(method->info.typ); if (name) { if (!is_transient(result->info.typ)) { fprintf(fd, "\n\nint %s::send_%s(const char *soap_endpoint_url, const char *soap_action", name, ns_cname(method->sym->name, NULL)); gen_params_ref(fd, params, NULL, 1); } else { fprintf(fd, "\n\nint %s::send_%s(const char *soap_endpoint_url, const char *soap_action", name, ns_cname(method->sym->name, NULL)); gen_params_ref(fd, params, NULL, 1); } } else { if (!is_transient(result->info.typ)) { fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_call_%s(struct soap *soap, const char *soap_endpoint, const char *soap_action", ident(method->sym->name)); gen_params_ref(fd, params, result, 1); fprintf(fd, "\n{\tif (soap_send_%s(soap, soap_endpoint, soap_action", ident(method->sym->name)); gen_args(fd, params, NULL, 1); fprintf(fd, " || soap_recv_%s(soap", ident(method->sym->name)); gen_args(fd, NULL, result, 1); fprintf(fd, ")\n\t\treturn soap->error;\n\treturn SOAP_OK;\n}"); fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_send_%s(struct soap *soap, const char *soap_endpoint, const char *soap_action", ident(method->sym->name)); gen_params_ref(fd, params, NULL, 1); } else { fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_send_%s(struct soap *soap, const char *soap_endpoint, const char *soap_action", ident(method->sym->name)); gen_params_ref(fd, params, NULL, 1); } } if (name) { if (iflag) fprintf(fd, "\n{\n\tstruct soap *soap = this;\n"); else fprintf(fd, "\n{\n"); } else { fprintf(fd, "\n{"); } for (sp = services; sp; sp = sp->next) { if (has_ns_eq(sp->ns, method->sym->name)) { encoding = sp->encoding; method_encoding = encoding; method_response_encoding = NULL; if (sp->protocol) { if (strstr(sp->protocol, "GET")) get = 1; else if (strstr(sp->protocol, "PUT")) put = 1; else if (strstr(sp->protocol, "DELETE")) del = 1; else if (strstr(sp->protocol, "POST")) post = 1; if (strncmp(sp->protocol, "SOAP", 4)) soap = 0; else if (strlen(sp->protocol) > 6) version = sp->protocol[6] - '0'; } for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, method->sym->name)) { if (m->mess == ACTION || m->mess == REQUEST_ACTION) action = m->part; else if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; else if (m->mess == PROTOCOL) { if (strstr(m->part, "GET")) get = 1; else if (strstr(m->part, "PUT")) put = 1; else if (strstr(m->part, "DELETE")) del = 1; else if (strstr(m->part, "POST")) post = 1; if (strncmp(m->part, "SOAP", 4)) soap = 0; else if (strlen(m->part) > 6) version = m->part[6] - '0'; } else { if ((m->mess&MIMEIN) && !strcmp(m->part, "application/x-www-form-urlencoded")) mimein = 1; if ((m->mess&MIMEOUT) && !strcmp(m->part, "application/x-www-form-urlencoded")) mimeout = 1; } } } break; } } if (!get && !del && !mimein) fprintf(fd, "\tstruct %s soap_tmp_%s;", ident(method->sym->name), ident(method->sym->name)); else if (!get && !del && mimein) gen_query_send_form_init(fd, params); if (name) fprintf(fd, "\n\tif (soap_endpoint_url != NULL)\n\t\tsoap_endpoint = soap_endpoint_url;"); if (sp && sp->URL) fprintf(fd, "\n\tif (soap_endpoint == NULL)\n\t\tsoap_endpoint = \"%s\";", sp->URL); if (action) { fprintf(fd, "\n\tif (soap_action == NULL)\n\t\tsoap_action = "); if (*action == '"') fprintf(fd, "%s;", action); else fprintf(fd, "\"%s\";", action); } if (!method_response_encoding) method_response_encoding = method_encoding; if (!get && !del && !mimein) { for (param = params->list; param; param = param->next) { if (param->info.typ->type == Tarray) fprintf(fd, "\n\tsoap_memcpy(soap_tmp_%s.%s, sizeof(%s), %s, sizeof(%s));", ident(method->sym->name), ident(param->sym->name), c_type(param->info.typ), ident(param->sym->name), c_type(param->info.typ)); else fprintf(fd, "\n\tsoap_tmp_%s.%s = %s;", ident(method->sym->name), ident(param->sym->name), ident(param->sym->name)); } fprintf(fd, "\n\tsoap_begin(soap);"); if (!soap) fprintf(fd, "\n\tsoap_set_version(soap, 0); /* no SOAP */"); else if (version > 0) fprintf(fd, "\n\tsoap_set_version(soap, %d); /* use SOAP1.%d */", version, version); if (soap && sp && method_encoding) { if (is_literal(method_encoding)) fprintf(fd, "\n\tsoap->encodingStyle = NULL; /* use SOAP literal style */"); else if (method_encoding) fprintf(fd, "\n\tsoap->encodingStyle = \"%s\"; /* use SOAP encoding style */", method_encoding); } else if (!eflag) { fprintf(fd, "\n\tsoap->encodingStyle = NULL; /* use SOAP literal style */"); } if (soap) fprintf(fd, "\n\tsoap_serializeheader(soap);"); fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", ident(method->sym->name), ident(method->sym->name)); fprintf(fd, "\n\tif (soap_begin_count(soap))\n\t\treturn soap->error;"); fprintf(fd, "\n\tif ((soap->mode & SOAP_IO_LENGTH))"); fprintf(fd, "\n\t{\tif (soap_envelope_begin_out(soap)"); if (soap) { fprintf(fd, "\n\t\t || soap_putheader(soap)"); fprintf(fd, "\n\t\t || soap_body_begin_out(soap)"); } fprintf(fd, "\n\t\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", \"\")", ident(method->sym->name), ident(method->sym->name), ns_convert(method->sym->name)); if (soap) fprintf(fd, "\n\t\t || soap_body_end_out(soap)"); fprintf(fd, "\n\t\t || soap_envelope_end_out(soap))"); fprintf(fd, "\n\t\t\t return soap->error;"); fprintf(fd, "\n\t}"); fprintf(fd, "\n\tif (soap_end_count(soap))\n\t\treturn soap->error;"); if (soap) { fprintf(fd, "\n\tif (soap_connect(soap, soap_endpoint, soap_action)"); } else { if (put) fprintf(fd, "\n\tif (soap_PUT(soap, soap_extend_url(soap, soap_endpoint, soap_action), soap_action, \"text/xml\")"); else fprintf(fd, "\n\tif (soap_POST(soap, soap_extend_url(soap, soap_endpoint, soap_action), soap_action, \"text/xml\")"); } fprintf(fd, "\n\t || soap_envelope_begin_out(soap)"); if (soap) { fprintf(fd, "\n\t || soap_putheader(soap)"); fprintf(fd, "\n\t || soap_body_begin_out(soap)"); } fprintf(fd, "\n\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", \"\")", ident(method->sym->name), ident(method->sym->name), ns_convert(method->sym->name)); if (soap) fprintf(fd, "\n\t || soap_body_end_out(soap)"); fprintf(fd, "\n\t || soap_envelope_end_out(soap)"); fprintf(fd, "\n\t || soap_end_send(soap))"); fprintf(fd, "\n\t\treturn soap_closesock(soap);"); } else if (get) { if (params->list) { gen_query_url(fd, params, soap); fprintf(fd, "\n\tif (soap_GET(soap, soap->msgbuf, soap_action))"); } else if (soap) { fprintf(fd, "\n\tif (soap_GET(soap, soap_endpoint, soap_action))"); } else { fprintf(fd, "\n\tif (soap_GET(soap, soap_extend_url(soap, soap_endpoint, soap_action), soap_action))"); } fprintf(fd, "\n\t\treturn soap_closesock(soap);"); } else if (del) { if (params->list) { gen_query_url(fd, params, soap); fprintf(fd, "\n\tif (soap_DELETE(soap, soap->msgbuf, soap_action))"); } else if (soap) { fprintf(fd, "\n\tif (soap_DELETE(soap, soap_endpoint, soap_action))"); } else { fprintf(fd, "\n\tif (soap_DELETE(soap, soap_extend_url(soap, soap_endpoint, soap_action), soap_action))"); } fprintf(fd, "\n\t\treturn soap_closesock(soap);"); } else if (mimein) { if (put) fprintf(fd, "\n\tif (soap_PUT(soap, soap_extend_url(soap, soap_endpoint, soap_action), soap_action, \"application/x-www-form-urlencoded\"))"); else fprintf(fd, "\n\tif (soap_POST(soap, soap_extend_url(soap, soap_endpoint, soap_action), soap_action, \"application/x-www-form-urlencoded\"))"); fprintf(fd, "\n\t\treturn soap_closesock(soap);"); gen_query_send_form(fd, params); } fprintf(fd, "\n\treturn SOAP_OK;\n}"); if (is_transient(result->info.typ)) { if (name) { fprintf(fd, "\n\nint %s::recv_%s(", name, ns_cname(method->sym->name, NULL)); fprintf(fd, "struct %s& tmp)", ident(method->sym->name)); if (iflag) fprintf(fd, "\n{\n\tstruct soap *soap = this;"); else fprintf(fd, "\n{"); fprintf(fd, "\n\tstruct %s *%s = &tmp;", ident(method->sym->name), ident(result->sym->name)); } else { fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_recv_%s(struct soap *soap, ", ident(method->sym->name)); fprintf(fd, "struct %s *%s)\n{", ident(method->sym->name), ident(result->sym->name)); } fprintf(fd, "\n\tsoap_default_%s(soap, %s);", ident(method->sym->name), ident(result->sym->name)); fprintf(fd, "\n\tsoap_begin(soap);"); } else { if (name) { fprintf(fd, "\n\nint %s::recv_%s(", name, ns_cname(method->sym->name, NULL)); gen_params_ref(fd, NULL, result, 0); if (iflag) fprintf(fd, "\n{\n\tstruct soap *soap = this;"); else fprintf(fd, "\n{"); } else { fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_recv_%s(struct soap *soap", ident(method->sym->name)); gen_params_ref(fd, NULL, result, 1); fprintf(fd, "\n{"); } if (response && !mimeout) fprintf(fd, "\n\tstruct %s *soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); if (mimeout) { fprintf(fd, "\n\tchar *soap_tmp, *soap_tmp_key;"); gen_query_recv_form_init(fd, result); } if (result->info.typ->type == Tarray) fprintf(fd, "\n\tsoap_default_%s(soap, %s);", c_ident(result->info.typ), ident(result->sym->name)); else if (result->info.typ->type == Treference && ((Tnode*)result->info.typ->ref)->type == Tclass && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref)) fprintf(fd, "\n\t%s.soap_default(soap);", ident(result->sym->name)); else if (((Tnode*)result->info.typ->ref)->type == Tclass && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref)) fprintf(fd, "\n\tif (!%s)\n\t\treturn soap_closesock(soap);\n\t%s->soap_default(soap);", ident(result->sym->name), ident(result->sym->name)); else if (result->info.typ->type == Treference && ((Tnode*)result->info.typ->ref)->type == Tpointer) fprintf(fd, "\n\t%s = NULL;", ident(result->sym->name)); else if (((Tnode*)result->info.typ->ref)->type == Tpointer) fprintf(fd, "\n\tif (!%s)\n\t\treturn soap_closesock(soap);\n\t*%s = NULL;", ident(result->sym->name), ident(result->sym->name)); else if (result->info.typ->type == Treference) fprintf(fd, "\n\tsoap_default_%s(soap, &%s);", c_ident((Tnode*)result->info.typ->ref), ident(result->sym->name)); else if (!is_void(result->info.typ)) fprintf(fd, "\n\tif (!%s)\n\t\treturn soap_closesock(soap);\n\tsoap_default_%s(soap, %s);", ident(result->sym->name), c_ident((Tnode*)result->info.typ->ref), ident(result->sym->name)); } if (mimeout) { fprintf(fd, "\n\tif (soap_begin_recv(soap)\n\t || (soap_tmp = soap_http_get_form(soap)) == NULL\n\t || soap_end_recv(soap))"); fprintf(fd, "\n\t\treturn soap_closesock(soap);"); gen_query_recv_form(fd, result); fprintf(fd, "\n\treturn soap_closesock(soap);"); fprintf(fd , "\n}"); fflush(fd); return; } fprintf(fd, "\n\tif (soap_begin_recv(soap)"); fprintf(fd, "\n\t || soap_envelope_begin_in(soap)"); fprintf(fd, "\n\t || soap_recv_header(soap)"); fprintf(fd, "\n\t || soap_body_begin_in(soap))"); fprintf(fd, "\n\t\treturn soap_closesock(soap);"); if (is_transient(result->info.typ)) { if (sflag) fprintf(fd, "\n\tsoap->mode |= SOAP_XML_STRICT;"); fprintf(fd, "\n\tsoap_get_%s(soap, %s, \"%s\", NULL);", ident(method->sym->name), ident(result->sym->name), ns_convert(method->sym->name)); fprintf(fd, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap->level == 2)\n\t\tsoap->error = SOAP_OK;"); fprintf(fd, "\n\tif (soap->error"); fprintf(fd, "\n\t || soap_body_end_in(soap)"); fprintf(fd, "\n\t || soap_envelope_end_in(soap)"); fprintf(fd, "\n\t || soap_end_recv(soap))"); fprintf(fd, "\n\t\treturn soap_closesock(soap);"); fprintf(fd, "\n\treturn soap_closesock(soap);\n}"); fflush(fd); return; } /* With RPC encoded responses, try to parse the fault first */ if (soap && !is_literal(method_response_encoding)) { fprintf(fd, "\n\tif (soap_recv_fault(soap, 1))\n\t\treturn soap->error;"); xtag = ""; } else if (has_ns_eq(NULL, result->sym->name)) { if (response) xtag = xml_tag(response->info.typ); else xtag = ns_convert(result->sym->name); } else { if (response) xtag = xml_tag(response->info.typ); else xtag = xml_tag(result->info.typ); } if (sflag) fprintf(fd, "\n\tsoap->mode |= SOAP_XML_STRICT;"); if (response) { fprintf(fd, "\n\tsoap_tmp_%s = soap_get_%s(soap, NULL, \"%s\", NULL);", c_ident(response->info.typ), c_ident(response->info.typ), xtag); fprintf(fd, "\n\tif (!soap_tmp_%s || soap->error)\n\t\treturn soap_recv_fault(soap, 0);", c_ident(response->info.typ)); } else if ((result->info.typ->type == Treference || result->info.typ->type == Tpointer) && !is_invisible_empty((Tnode*)result->info.typ->ref)) { if (result->info.typ->type == Treference && ((Tnode *) result->info.typ->ref)->type == Tclass && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref) && !is_dynamic_array((Tnode*)result->info.typ->ref)) fprintf(fd, "\n\t%s.soap_get(soap, \"%s\", NULL);", ident(result->sym->name), xtag); else if (result->info.typ->type == Tpointer && ((Tnode *) result->info.typ->ref)->type == Tclass && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref) && !is_dynamic_array((Tnode*)result->info.typ->ref)) fprintf(fd, "\n\t%s->soap_get(soap, \"%s\", NULL);", ident(result->sym->name), xtag); else if (result->info.typ->type == Treference && ((Tnode *) result->info.typ->ref)->type == Tstruct && !is_external((Tnode*)result->info.typ->ref) && !is_volatile((Tnode*)result->info.typ->ref) && !is_dynamic_array((Tnode*)result->info.typ->ref)) { fprintf(fd, "\n\tsoap_get_%s(soap, &%s, \"%s\", NULL);", c_ident((Tnode*)result->info.typ->ref), ident(result->sym->name), xtag); } else if (result->info.typ->type == Tpointer && ((Tnode *) result->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)result->info.typ->ref)) { fprintf(fd, "\n\tsoap_get_%s(soap, %s, \"%s\", NULL);", c_ident((Tnode*)result->info.typ->ref), ident(result->sym->name), xtag); } else if (result->info.typ->type == Tpointer && is_XML((Tnode*)result->info.typ->ref) && is_string((Tnode*)result->info.typ->ref)) { fprintf(fd, "\n\tsoap_inliteral(soap, NULL, (char**)%s);", ident(result->sym->name)); } else if (result->info.typ->type == Treference && is_XML((Tnode*)result->info.typ->ref) && is_string((Tnode*)result->info.typ->ref)) { fprintf(fd, "\n\tsoap_inliteral(soap, NULL, (char**)&%s);", ident(result->sym->name)); } else if (result->info.typ->type == Tpointer && is_XML((Tnode*)result->info.typ->ref) && is_wstring((Tnode*)result->info.typ->ref)) { fprintf(fd, "\n\tsoap_inwliteral(soap, NULL, (wchar_t**)%s);", ident(result->sym->name)); } else if (result->info.typ->type == Treference && is_XML((Tnode*)result->info.typ->ref) && is_wstring((Tnode*)result->info.typ->ref)) { fprintf(fd, "\n\tsoap_inwliteral(soap, NULL, (wchar_t**)&%s);", ident(result->sym->name)); } else if (result->info.typ->type == Treference) { fprintf(fd, "\n\tsoap_get_%s(soap, &%s, \"%s\", NULL);", c_ident(result->info.typ), ident(result->sym->name), xtag); } else { fprintf(fd, "\n\tsoap_get_%s(soap, %s, \"%s\", NULL);", c_ident(result->info.typ), ident(result->sym->name), xtag); } fprintf(fd, "\n\tif (soap->error)\n\t\treturn soap_recv_fault(soap, 0);"); } else if (soap && is_literal(method_response_encoding)) { fprintf(fd, "\n\tif (soap_recv_fault(soap, 1))\n\t\treturn soap->error;"); } fflush(fd); fprintf(fd, "\n\tif (soap_body_end_in(soap)"); fprintf(fd, "\n\t || soap_envelope_end_in(soap)"); fprintf(fd, "\n\t || soap_end_recv(soap))"); fprintf(fd, "\n\t\treturn soap_closesock(soap);"); if (response) { if (result->info.typ->type == Tarray) fprintf(fd, "\n\tsoap_memcpy(%s, sizeof(%s), soap_tmp_%s->%s, sizeof(%s));", ident(result->sym->name), c_ident(response->info.typ), c_type(result->info.typ), ident(result->sym->name), c_type(result->info.typ)); else if (result->info.typ->type == Treference) fprintf(fd, "\n\t%s = soap_tmp_%s->%s;", ident(result->sym->name), c_ident(response->info.typ), ident(result->sym->name)); else { fprintf(fd, "\n\tif (%s && soap_tmp_%s->%s)", ident(result->sym->name), c_ident(response->info.typ), ident(result->sym->name)); fprintf(fd, "\n\t\t*%s = *soap_tmp_%s->%s;", ident(result->sym->name), c_ident(response->info.typ), ident(result->sym->name)); } } fprintf(fd, "\n\treturn soap_closesock(soap);"); fprintf(fd , "\n}"); fflush(fd); } void gen_serve_method(FILE *fd, Table *table, Entry *param, const char *name) { Service *sp = NULL; const char *encoding; Entry *result, *p, *q, *pin, *pout, *response = NULL; Table *input; const char *xtag; Method *m; const char *method_encoding = NULL, *method_response_encoding = NULL; result = (Entry*)param->info.typ->ref; p = entry(classtable, param->sym); if (!p) execerror("no table entry"); if (!is_response(result->info.typ) && !is_XML(result->info.typ)) response = get_response(param->info.typ); q = entry(table, param->sym); if (!q) execerror("no table entry"); pout = (Entry*)q->info.typ->ref; if (!pout) execerror("no table entry"); if (name) { if (iflag) fprintf(fd, "\n\nstatic int serve_%s(%s *soap)\n{", ident(param->sym->name), name); else fprintf(fd, "\n\nstatic int serve_%s(struct soap *soap, %s *service)\n{", ident(param->sym->name), name); } else { fprintf(fheader, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_serve_%s(struct soap*);", ident(param->sym->name)); fprintf(fd, "\n\nSOAP_FMAC5 int SOAP_FMAC6 soap_serve_%s(struct soap *soap)\n{", ident(param->sym->name)); } fprintf(fd, "\tstruct %s soap_tmp_%s;", ident(param->sym->name), ident(param->sym->name)); for (sp = services; sp; sp = sp->next) { if (has_ns_eq(sp->ns, param->sym->name)) { encoding = sp->encoding; method_encoding = encoding; method_response_encoding = NULL; for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, param->sym->name)) { if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; } } break; } } if (!method_response_encoding) method_response_encoding = method_encoding; fflush(fd); if (!is_transient(pout->info.typ)) { if (pout->info.typ->type == Tarray && response) { fprintf(fd, "\n\tstruct %s soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); fprintf(fd, "\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); } else if (pout->info.typ->type == Tpointer && !is_stdstring(pout->info.typ) && !is_stdwstring(pout->info.typ) && response) { fprintf(fd, "\n\tstruct %s soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); fprintf(fd, "\n\t%s soap_tmp_%s;", c_type((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); fprintf(fd, "\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); if (((Tnode*)pout->info.typ->ref)->type == Tclass && !is_external((Tnode*)pout->info.typ->ref) && !is_volatile((Tnode*)pout->info.typ->ref) && !is_typedef((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\tsoap_tmp_%s.soap_default(soap);", c_ident((Tnode*)pout->info.typ->ref)); else if (((Tnode*)pout->info.typ->ref)->type == Tpointer) fprintf(fd, "\n\tsoap_tmp_%s = NULL;", c_ident((Tnode*)pout->info.typ->ref)); else fprintf(fd, "\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); fprintf(fd, "\n\tsoap_tmp_%s.%s = &soap_tmp_%s;", c_ident(response->info.typ), ident(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); } else if (response) { fprintf(fd, "\n\tstruct %s soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); fprintf(fd, "\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); } else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && (is_external((Tnode*)pout->info.typ->ref) || is_volatile((Tnode*)pout->info.typ->ref) || is_typedef((Tnode*)pout->info.typ->ref)) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) { fprintf(fd, "\n\t%s %s;", c_type((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); fprintf(fd, "\n\tsoap_default_%s(soap, &%s);", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); } else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) { fprintf(fd, "\n\t%s %s;", c_type((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); fprintf(fd, "\n\t%s.soap_default(soap);", ident(pout->sym->name)); } else if (((Tnode *)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref)) { fprintf(fd, "\n\t%s %s;", c_type((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); fprintf(fd, "\n\tsoap_default_%s(soap, &%s);", c_ident((Tnode *)pout->info.typ->ref), ident(pout->sym->name)); } else { fprintf(fd, "\n\t%s soap_tmp_%s;", c_type((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); if (is_string((Tnode*)pout->info.typ->ref) || is_wstring((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\tsoap_tmp_%s = NULL;", c_ident((Tnode*)pout->info.typ->ref)); else fprintf(fd, "\n\tsoap_default_%s(soap, &soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); } } fprintf(fd, "\n\tsoap_default_%s(soap, &soap_tmp_%s);", ident(param->sym->name), ident(param->sym->name)); fflush(fd); q = entry(classtable, param->sym); if (!is_invisible_empty(q->info.typ)) { fprintf(fd, "\n\tif (!soap_get_%s(soap, &soap_tmp_%s, \"%s\", NULL))", ident(param->sym->name), ident(param->sym->name), ns_convert(param->sym->name)); fprintf(fd, "\n\t\treturn soap->error;"); } fprintf(fd, "\n\tif (soap_body_end_in(soap)"); fprintf(fd, "\n\t || soap_envelope_end_in(soap)"); fprintf(fd, "\n\t || soap_end_recv(soap))\n\t\treturn soap->error;"); if (name) { if (iflag) fprintf(fd, "\n\tsoap->error = soap->%s(", ns_cname(param->sym->name, NULL)); else fprintf(fd, "\n\tsoap->error = service->%s(", ns_cname(param->sym->name, NULL)); } else fprintf(fd, "\n\tsoap->error = %s(soap", ident(param->sym->name)); fflush(fd); input = (Table*) q->info.typ->ref; if (!input) execerror("no table entry"); for (pin = input->list; pin; pin = pin->next) { if (pin->info.typ->type == Trvalueref) fprintf(fd, "%sstd::move(soap_tmp_%s.%s)", !name || pin != input->list ? ", " : "", ident(param->sym->name), ident(pin->sym->name)); else fprintf(fd, "%ssoap_tmp_%s.%s", !name || pin != input->list ? ", " : "", ident(param->sym->name), ident(pin->sym->name)); } if (is_transient(pout->info.typ)) fprintf(fd, ");"); else { if (!name || input->list) fprintf(fd, ", "); if (response) fprintf(fd, "soap_tmp_%s.%s);", c_ident(response->info.typ), ident(pout->sym->name)); else if (pout->info.typ->type == Treference && (((Tnode*)pout->info.typ->ref)->type == Tstruct || ((Tnode*)pout->info.typ->ref)->type == Tclass) && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "%s);", ident(pout->sym->name)); else if ((((Tnode*)pout->info.typ->ref)->type == Tstruct || ((Tnode*)pout->info.typ->ref)->type == Tclass) && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "&%s);", ident(pout->sym->name)); else if (pout->info.typ->type == Treference) fprintf(fd, "soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref)); else fprintf(fd, "&soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref)); } fprintf(fd, "\n\tif (soap->error)\n\t\treturn soap->error;"); if (!is_transient(pout->info.typ)) { if (sp && method_response_encoding) { if (is_literal(method_response_encoding)) fprintf(fd, "\n\tsoap->encodingStyle = NULL; /* use SOAP literal style */"); else if (sp->encoding) fprintf(fd, "\n\tsoap->encodingStyle = \"%s\"; /* use SOAP encoding style */", sp->encoding); else if (method_response_encoding) fprintf(fd, "\n\tsoap->encodingStyle = \"%s\"; /* use SOAP encoding style */", method_response_encoding); else if (!eflag) fprintf(fd, "\n\tsoap->encodingStyle = NULL; /* use SOAP literal style */"); } else if (!eflag) { fprintf(fd, "\n\tsoap->encodingStyle = NULL; /* use SOAP literal style */"); } fprintf(fd, "\n\tsoap_serializeheader(soap);"); if (pout->info.typ->type == Tarray && response) fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); else if (response) fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", c_ident(response->info.typ), c_ident(response->info.typ)); else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && (is_external((Tnode*)pout->info.typ->ref) || is_volatile((Tnode*)pout->info.typ->ref) || is_typedef((Tnode*)pout->info.typ->ref)) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\tsoap_serialize_%s(soap, &%s);", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t%s.soap_serialize(soap);", ident(pout->sym->name)); else if (((Tnode *)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\tsoap_serialize_%s(soap, &%s);", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name)); else if (!is_XML((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\tsoap_serialize_%s(soap, &soap_tmp_%s);", c_ident((Tnode*)pout->info.typ->ref), c_ident((Tnode*)pout->info.typ->ref)); if (is_literal(method_response_encoding) && has_ns_eq(NULL, pout->sym->name)) xtag = ns_convert(pout->sym->name); else xtag = xml_tag(pout->info.typ); fprintf(fd, "\n\tif (soap_begin_count(soap))\n\t\treturn soap->error;"); fprintf(fd, "\n\tif ((soap->mode & SOAP_IO_LENGTH))"); fprintf(fd, "\n\t{\tif (soap_envelope_begin_out(soap)"); fprintf(fd, "\n\t\t || soap_putheader(soap)"); fprintf(fd, "\n\t\t || soap_body_begin_out(soap)"); if (response) fprintf(fd, "\n\t\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", \"\")", c_ident(response->info.typ), c_ident(response->info.typ), xml_tag(response->info.typ)); else if (((Tnode*)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && (is_external((Tnode*)pout->info.typ->ref) || is_volatile((Tnode*)pout->info.typ->ref) || is_typedef((Tnode*)pout->info.typ->ref)) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t\t || soap_put_%s(soap, &%s, \"%s\", \"\")", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name), ns_convert(pout->sym->name)); else if (((Tnode*)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t\t || %s.soap_put(soap, \"%s\", \"\")", ident(pout->sym->name), xtag); else if (((Tnode*)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t\t || soap_put_%s(soap, &%s, \"%s\", \"\")", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name), xtag); else if (is_XML((Tnode*)pout->info.typ->ref) && is_string((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t\t || soap_outliteral(soap, \"%s\", &soap_tmp_%s, NULL)", ns_convert(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); else if (is_XML((Tnode*)pout->info.typ->ref) && is_wstring((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t\t || soap_outwliteral(soap, \"%s\", &soap_tmp_%s, NULL)", ns_convert(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); else fprintf(fd, "\n\t\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", \"\")", c_ident(pout->info.typ), c_ident((Tnode*)pout->info.typ->ref), ns_convert(pout->sym->name)); fprintf(fd, "\n\t\t || soap_body_end_out(soap)"); fprintf(fd, "\n\t\t || soap_envelope_end_out(soap))"); fprintf(fd, "\n\t\t\t return soap->error;"); fprintf(fd, "\n\t};"); fprintf(fd, "\n\tif (soap_end_count(soap)"); fprintf(fd, "\n\t || soap_response(soap, SOAP_OK)"); fprintf(fd, "\n\t || soap_envelope_begin_out(soap)"); fprintf(fd, "\n\t || soap_putheader(soap)"); fprintf(fd, "\n\t || soap_body_begin_out(soap)"); if (response) fprintf(fd, "\n\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", \"\")", c_ident(response->info.typ), c_ident(response->info.typ), xml_tag(response->info.typ)); else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && (is_external((Tnode*)pout->info.typ->ref) || is_volatile((Tnode*)pout->info.typ->ref) || is_typedef((Tnode*)pout->info.typ->ref)) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t || soap_put_%s(soap, &%s, \"%s\", \"\")", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name), ns_convert(pout->sym->name)); else if (((Tnode *)pout->info.typ->ref)->type == Tclass && !is_stdstring((Tnode*)pout->info.typ->ref) && !is_stdwstring((Tnode*)pout->info.typ->ref) && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t || %s.soap_put(soap, \"%s\", \"\")", ident(pout->sym->name), xtag); else if (((Tnode *)pout->info.typ->ref)->type == Tstruct && !is_dynamic_array((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t || soap_put_%s(soap, &%s, \"%s\", \"\")", c_ident((Tnode*)pout->info.typ->ref), ident(pout->sym->name), xtag); else if (is_XML((Tnode*)pout->info.typ->ref) && is_string((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t || soap_outliteral(soap, \"%s\", &soap_tmp_%s, NULL)", ns_convert(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); else if (is_XML((Tnode*)pout->info.typ->ref) && is_wstring((Tnode*)pout->info.typ->ref)) fprintf(fd, "\n\t || soap_outwliteral(soap, \"%s\", &soap_tmp_%s, NULL)", ns_convert(pout->sym->name), c_ident((Tnode*)pout->info.typ->ref)); else fprintf(fd, "\n\t || soap_put_%s(soap, &soap_tmp_%s, \"%s\", \"\")", c_ident(pout->info.typ), c_ident((Tnode*)pout->info.typ->ref), ns_convert(pout->sym->name)); fprintf(fd, "\n\t || soap_body_end_out(soap)"); fprintf(fd, "\n\t || soap_envelope_end_out(soap)"); fprintf(fd, "\n\t || soap_end_send(soap))"); fprintf(fd, "\n\t\treturn soap->error;"); } fprintf(fd, "\n\treturn soap_closesock(soap);"); fprintf(fd, "\n}"); fflush(fd); } void gen_response_begin(FILE *fd, int n, const char *s, int soap) { if (!is_invisible(s)) { fprintf(fd, "%*s<%sResponse", n, "", s); if (!soap || soap_version < 0) gen_xmlns(fd, 0); fprintf(fd, ">\n"); } } void gen_response_end(FILE *fd, int n, const char *s) { if (!is_invisible(s)) fprintf(fd, "%*s\n", n, "", s); } void gen_element_begin(FILE *fd, int n, const char *s, Entry *p) { if (!is_invisible(s)) { fprintf(fd, "%*s<%s", n, "", s); if (p) { const char *x = xsi_type_u(p->info.typ); if (x && *x) fprintf(fd, " xsi:type=\"%s\"", x); } if (soap_version >= 0 && p && (p->info.sto & SmustUnderstand)) fprintf(fd, " SOAP-ENV:mustUnderstand=\"%s\"", soap_version == 2 ? "true" : "1"); } } void gen_element_array(FILE *fd, int n, const char *s) { if (!is_invisible(s)) { fprintf(fd, "%*s<%s", n, "", s); if (tflag) fprintf(fd, " xsi:type=\"SOAP-ENC:Array\""); } } void gen_element_end(FILE *fd, int n, const char *s) { if (!is_invisible(s)) fprintf(fd, "%*s\n", n, "", s); } void gen_data(const char *buf, Table *t, const char *ns, const char *encoding) { Entry *p, *q, *r; FILE *fd; const char *method_encoding = NULL; const char *method_response_encoding = NULL; if (t) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !(p->info.sto & Sextern) && has_ns_eq(ns, p->sym->name)) { int get = 0, put = 0, soap = 1, mimein = 0, mimeout = 0; Service *sp; Method *m; const char *nse = ns_qualifiedElement(p->info.typ); const char *nsa = ns_qualifiedAttribute(p->info.typ); method_encoding = encoding; method_response_encoding = NULL; for (sp = services; sp; sp = sp->next) { if (!tagcmp(sp->ns, ns)) { for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, p->sym->name)) { if (m->mess == ENCODING) method_encoding = m->part; else if (m->mess == RESPONSE_ENCODING) method_response_encoding = m->part; else if (m->mess == PROTOCOL) { if (strncmp(m->part, "SOAP", 4)) soap = 0; if (strstr(m->part, "GET")) get = 1; else if (strstr(m->part, "PUT")) put = 1; } else { if ((m->mess&MIMEIN) && !strcmp(m->part, "application/x-www-form-urlencoded")) mimein = 1; if ((m->mess&MIMEOUT) && !strcmp(m->part, "application/x-www-form-urlencoded")) mimeout = 1; } } } } } if (!method_response_encoding) method_response_encoding = method_encoding; /* request */ if (!get && !mimein) { fd = gen_env(buf, ns_remove(p->sym->name), 0, method_encoding, soap); if (!fd) return; q = entry(classtable, p->sym); if (yflag) { fprintf(fd, "%*s\n"); } if (!is_invisible(p->sym->name)) { gen_element_begin(fd, 2, ns_convert(p->sym->name), NULL); if (!soap || soap_version < 0) gen_xmlns(fd, 0); } if (q) { int xmlns = 0; if (!is_invisible(p->sym->name)) { gen_atts(fd, (Table*)q->info.typ->ref, nse, nsa, encoding); fprintf(fd, "\n"); } else if (!soap || soap_version < 0) xmlns = 1; for (q = ((Table*)q->info.typ->ref)->list; q; q = q->next) gen_field(fd, 3, q, nse, nsa, method_encoding, q->info.minOccurs == 0, xmlns); } if (!is_invisible(p->sym->name)) gen_element_end(fd, 2, ns_convert(p->sym->name)); if (soap && soap_version >= 0) fprintf(fd, " \n\n"); fclose(fd); } /* response */ q = (Entry*)p->info.typ->ref; if (!put && !mimeout && q && !is_transient(q->info.typ)) { fd = gen_env(buf, ns_remove(p->sym->name), 1, method_response_encoding, soap); if (!fd) return; if (!is_response(q->info.typ)) { if (is_XML((Tnode*)q->info.typ->ref)) { gen_response_begin(fd, 2, ns_convert(p->sym->name), soap); gen_response_end(fd, 2, ns_convert(p->sym->name)); } else { gen_response_begin(fd, 2, ns_convert(p->sym->name), soap); gen_field(fd, 3, q, nse, nsa, method_response_encoding, q->info.minOccurs == 0, 0); gen_response_end(fd, 2, ns_convert(p->sym->name)); } } else if (q->info.typ->ref && ((Tnode*)q->info.typ->ref)->ref) { const char *xtag; nse = ns_qualifiedElement((Tnode*)q->info.typ->ref); nsa = ns_qualifiedAttribute((Tnode*)q->info.typ->ref); if (is_literal(method_response_encoding) && has_ns_eq(NULL, q->sym->name)) xtag = ns_convert(q->sym->name); else xtag = xml_tag(q->info.typ); if (yflag) fprintf(fd, "%*s\n", 2, "", ident(p->sym->name), c_type_id(q->info.typ, q->sym->name)); if (!is_invisible(xtag)) { gen_element_begin(fd, 2, xtag, NULL); if (!soap || soap_version < 0) gen_xmlns(fd, 0); gen_atts(fd, (Table*)((Tnode*)q->info.typ->ref)->ref, nse, nsa, encoding); fprintf(fd, "\n"); } for (r = ((Table*)((Tnode*)q->info.typ->ref)->ref)->list; r; r = r->next) gen_field(fd, 3, r, nse, nsa, method_response_encoding, q->info.minOccurs == 0, 0); if (!is_invisible(xtag)) gen_element_end(fd, 2, ns_addx(xtag, nse)); } fflush(fd); if (soap && soap_version >= 0) fprintf(fd, " \n\n"); fclose(fd); } } } } } void gen_field(FILE *fd, int n, Entry *p, const char *nse, const char *nsa, const char *encoding, int opt, int xmlns) { Entry *q; char tmp[32]; LONG64 i; int d; if (!(p->info.sto & (Sattribute | Sconst | Sprivate | Sprotected | Sspecial)) && !is_transient(p->info.typ) && p->info.typ->type != Tfun && strncmp(p->sym->name, "__size", 6) && strncmp(p->sym->name, "__type", 6) && !is_choice(p)) { if (n > 8 && (p->info.typ->type == Tpointer || is_smart(p->info.typ)) && p->info.nillable && !is_string(p->info.typ) && !is_wstring(p->info.typ)) { gen_element_begin(fd, n, ns_add(p, nse), NULL); if (xmlns) gen_xmlns(fd, 0); fprintf(fd, " xsi:nil=\"true\"/>\n"); return; } if (n > 8 && opt && !is_string(p->info.typ) && !is_wstring(p->info.typ)) return; if (n >= 16) { fprintf(fd, "%*s\n", n, ""); return; } if (yflag) fprintf(fd, "%*s\n", n, "", c_type_id(p->info.typ, p->sym->name)); if (is_container(p->info.typ)) { if (gflag) { fprintf(fd, "%*s<__REPEAT min=\"" SOAP_LONG_FORMAT "\"", n, "", p->info.minOccurs); if (p->info.maxOccurs > 1) fprintf(fd, " max=\"" SOAP_LONG_FORMAT "\"", p->info.maxOccurs); else fprintf(fd, " max=\"unbounded\""); fprintf(fd, ">\n"); } else if (yflag) { fprintf(fd, "%*s\n"); } opt = 0; } if (is_soap12(encoding) && (p->info.sto & Sreturn) && (nse || has_ns_eq(NULL, p->sym->name)) && !is_literal(encoding)) fprintf(fd, "%*s%s\n", n, "", rpcURI, ns_add(p, nse)); if (is_XML(p->info.typ)) { if (!is_invisible(p->sym->name)) { gen_element_begin(fd, n, ns_add(p, nse), NULL); if (xmlns) gen_xmlns(fd, 0); fprintf(fd, ">"); gen_element_end(fd, n, ns_add(p, nse)); } else { fprintf(fd, "%*s\n", n, ""); } } else { if (is_fixedstring(p->info.typ)) { gen_element_begin(fd, n, ns_add(p, nse), p); if (xmlns) gen_xmlns(fd, 0); fprintf(fd, ">"); fflush(fd); if ((p->info.hasval || p->info.ptrval) && p->info.val.s) fprintf(fd, "%s", xstring(p->info.val.s)); else gen_val(fd, n, p->info.typ, nse, nsa, encoding, opt); } else if (p->info.typ->type == Tarray) { i = ((Tnode*) p->info.typ->ref)->width; if (i) { i = p->info.typ->width / i; if (i > 100000) /* SOAP_MAXOCCURS */ i = 100000; } gen_element_array(fd, n, ns_add(p, nse)); if (is_soap12(encoding)) fprintf(fd, " SOAP-ENC:itemType=\"%s\" SOAP-ENC:arraySize=\"" SOAP_LONG_FORMAT "\"", xsi_type_Tarray(p->info.typ), i); else if (!is_literal(encoding)) fprintf(fd, " SOAP-ENC:arrayType=\"%s[" SOAP_LONG_FORMAT "]\"", xsi_type_Tarray(p->info.typ), i); fprintf(fd, ">"); fflush(fd); gen_val(fd, n, p->info.typ, nse, nsa, encoding, opt); } else if (is_binary(p->info.typ)) { gen_element_begin(fd, n, ns_add(p, nse), p); if (xmlns) gen_xmlns(fd, 0); fprintf(fd, ">"); fflush(fd); if ((p->info.hasval || p->info.ptrval) && p->info.val.s) fprintf(fd, "%s", xstring(p->info.val.s)); else gen_val(fd, n, p->info.typ, nse, nsa, encoding, opt); } else if ((q = is_dynamic_array(p->info.typ))) { if (!eflag && (has_ns(p->info.typ) || is_untyped(p->info.typ))) { gen_element_begin(fd, n, ns_add(p, nse), p); if (xmlns) gen_xmlns(fd, 0); gen_atts(fd, (Table*)p->info.typ->ref, nse, nsa, encoding); fprintf(fd, "\n"); gen_val(fd, n, p->info.typ, nse, nsa, encoding, 0); if (!is_invisible(p->sym->name)) fprintf(fd, "%*s", n, ""); } else { d = get_Darraydims(p->info.typ); if (d) { for (i = 0; i < d-1; i++) { if (is_soap12(encoding)) tmp[2*i] = ' '; else tmp[2*i] = ','; tmp[2*i+1] = '1'; } tmp[2*d-2] = '\0'; } else *tmp = '\0'; gen_element_array(fd, n, ns_add(p, nse)); i = q->info.minOccurs < 100000 ? q->info.minOccurs : 100000; if (i < 1) i = 1; if (is_soap12(encoding)) fprintf(fd, " SOAP-ENC:itemType=\"%s\" SOAP-ENC:arraySize=\"" SOAP_LONG_FORMAT "%s\"", wsdl_type(q->info.typ, ""), i, tmp); else if (!is_literal(encoding)) fprintf(fd, " SOAP-ENC:arrayType=\"%s[" SOAP_LONG_FORMAT "%s]\"", wsdl_type(q->info.typ, ""), i, tmp); fprintf(fd, ">\n"); gen_val(fd, n, p->info.typ, nse, nsa, encoding, q->info.minOccurs == 0); fprintf(fd, "%*s", n, ""); } fflush(fd); } else if ((p->info.typ->type == Tpointer || is_smart(p->info.typ) || p->info.typ->type == Treference || p->info.typ->type == Trvalueref) && (q = is_dynamic_array((Tnode*)p->info.typ->ref)) && !is_binary((Tnode*)p->info.typ->ref)) { if (!eflag && (has_ns((Tnode*)p->info.typ->ref) || is_untyped((Tnode*)p->info.typ->ref))) { gen_element_begin(fd, n, ns_add(p, nse), p); if (xmlns) gen_xmlns(fd, 0); gen_atts(fd, (Table*)((Tnode*)p->info.typ->ref)->ref, nse, nsa, encoding); fprintf(fd, "\n"); gen_val(fd, n, (Tnode*)p->info.typ->ref, nse, nsa, encoding, 0); if (!is_invisible(p->sym->name)) fprintf(fd, "%*s", n, ""); } else { d = get_Darraydims((Tnode*)p->info.typ->ref); if (d) { for (i = 0; i < d-1; i++) { tmp[2*i] = ','; tmp[2*i+1] = '1'; } tmp[2*d-2] = '\0'; } else *tmp = '\0'; gen_element_array(fd, n, ns_add(p, nse)); i = q->info.minOccurs < 100000 ? q->info.minOccurs : 100000; if (i < 1) i = 1; if (is_soap12(encoding)) fprintf(fd, " SOAP-ENC:itemType=\"%s\" SOAP-ENC:arraySize=\"" SOAP_LONG_FORMAT "%s\"", wsdl_type(((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.typ, ""), i, tmp); else if (!is_literal(encoding)) fprintf(fd, " SOAP-ENC:arrayType=\"%s[" SOAP_LONG_FORMAT "%s]\"", wsdl_type(((Table*)((Tnode*)p->info.typ->ref)->ref)->list->info.typ, ""), i, tmp); fprintf(fd, ">\n"); gen_val(fd, n, (Tnode*)p->info.typ->ref, nse, nsa, encoding, q->info.minOccurs == 0); fprintf(fd, "%*s", n, ""); } } else if (p->info.typ->type == Tstruct || p->info.typ->type == Tclass) { if (!is_invisible(p->sym->name)) { gen_element_begin(fd, n, ns_add(p, nse), p); if (xmlns) gen_xmlns(fd, 0); gen_atts(fd, (Table*)p->info.typ->ref, nse, nsa, encoding); } else if (is_anyType(p->info.typ)) fprintf(fd, "%*s\n", n, ""); } else if ((p->info.typ->type == Tpointer || is_smart(p->info.typ) || p->info.typ->type == Treference || p->info.typ->type == Trvalueref) && (((Tnode*)p->info.typ->ref)->type == Tstruct || ((Tnode*)p->info.typ->ref)->type == Tclass)) { if (!is_invisible(p->sym->name)) { gen_element_begin(fd, n, ns_add(p, nse), p); if (xmlns) gen_xmlns(fd, 0); gen_atts(fd, (Table*)((Tnode*)p->info.typ->ref)->ref, nse, nsa, encoding); } else if (is_anyType(p->info.typ)) fprintf(fd, "%*s\n", n, ""); } else if (p->info.typ->type != Tunion) { if (!is_invisible(p->sym->name)) { Tnode *ref = p->info.typ; gen_element_begin(fd, n, ns_add(p, nse), p); if (xmlns) gen_xmlns(fd, 0); if (p->info.typ->type == Tpointer || is_smart(p->info.typ) || p->info.typ->type == Treference || is_smart(p->info.typ)) ref = p->info.typ->ref; if (ref->type == Ttemplate) { if ((((Tnode*)ref->ref)->type == Tpointer || is_smart((Tnode*)ref->ref)) && (((Tnode*)((Tnode*)ref->ref)->ref)->type == Tclass || ((Tnode*)((Tnode*)ref->ref)->ref)->type == Tstruct)) gen_atts(fd, (Table*)((Tnode*)((Tnode*)ref->ref)->ref)->ref, nse, nsa, encoding); else if (((Tnode*)ref->ref)->type == Tclass || ((Tnode*)ref->ref)->type == Tstruct) gen_atts(fd, (Table*)((Tnode*)ref->ref)->ref, nse, nsa, encoding); else fprintf(fd, ">"); } else fprintf(fd, ">"); } } if (p->info.typ->sym && has_ns_eq("xsd", p->info.typ->sym->name)) { gen_val(fd, n+1, p->info.typ, nse, nsa, encoding, opt); } else { switch (p->info.typ->type) { case Tchar: case Tshort: case Tint: case Tlong: case Tllong: case Tuchar: case Tushort: case Tuint: case Tulong: case Tullong: if (p->info.hasval || p->info.ptrval) fprintf(fd, SOAP_LONG_FORMAT, p->info.val.i); else gen_val(fd, n+1, p->info.typ, nse, nsa, encoding, opt); break; case Tfloat: case Tdouble: case Tldouble: if (p->info.hasval || p->info.ptrval) fprintf(fd, "%.16lG", p->info.val.r); else gen_val(fd, n+1, p->info.typ, nse, nsa, encoding, opt); break; case Ttime: gen_val(fd, n+1, p->info.typ, nse, nsa, encoding, opt); break; case Tenum: case Tenumsc: if ((p->info.hasval || p->info.ptrval) && p->info.typ->ref) { for (q = ((Table*)p->info.typ->ref)->list; q; q = q->next) { if (p->info.val.i == q->info.val.i) { fprintf(fd, "%s", ns_remove2(q->sym->name, c_ident(p->info.typ))); break; } } } else { gen_val(fd, n+1, p->info.typ, nse, nsa, encoding, opt); } break; case Tpointer: case Treference: case Trvalueref: if (is_string(p->info.typ) || is_wstring(p->info.typ)) { if ((p->info.hasval || p->info.ptrval) && p->info.val.s) fprintf(fd, "%s", xstring(p->info.val.s)); else gen_val(fd, n, p->info.typ, nse, nsa, encoding, opt); } else if (!is_dynamic_array(p->info.typ->ref)) { Tnode *ref= p->info.typ->ref; if (p->info.hasval || p->info.ptrval) { switch (ref->type) { case Tchar: case Tshort: case Tint: case Tlong: case Tllong: case Tuchar: case Tushort: case Tuint: case Tulong: case Tullong: fprintf(fd, SOAP_LONG_FORMAT, p->info.val.i); break; case Tfloat: case Tdouble: case Tldouble: fprintf(fd, "%.16lG", p->info.val.r); break; case Tenum: case Tenumsc: if (ref->ref) { for (q = ((Table*)ref->ref)->list; q; q = q->next) { if (p->info.val.i == q->info.val.i) { fprintf(fd, "%s", ns_remove2(q->sym->name, c_ident(ref))); break; } } } else { gen_val(fd, n, ref, nse, nsa, encoding, opt); } break; default: gen_val(fd, n, ref, nse, nsa, encoding, opt); break; } } else { gen_val(fd, n, ref, nse, nsa, encoding, opt); } } break; case Tclass: if (is_stdstr(p->info.typ)) { if ((p->info.hasval || p->info.ptrval) && p->info.val.s) fprintf(fd, "%s", xstring(p->info.val.s)); else gen_val(fd, n, p->info.typ, nse, nsa, encoding, opt); } else if (!is_dynamic_array(p->info.typ)) gen_val(fd, n, p->info.typ, nse, nsa, encoding, opt); break; case Tstruct: if (!is_dynamic_array(p->info.typ)) gen_val(fd, n, p->info.typ, nse, nsa, encoding, opt); break; case Tunion: gen_val(fd, n, p->info.typ, nse, nsa, encoding, opt); break; case Ttemplate: if (gflag) { gen_val(fd, n, p->info.typ, nse, nsa, encoding, opt); } else if (!is_dynamic_array(p->info.typ->ref)) { if (is_smart(p->info.typ)) { i = 1; } else { i = p->info.minOccurs < 100000 ? p->info.minOccurs : 100000; if (i == 0) i = 1; } do { /* a bit of a hack, with a copy of the code above */ { gen_val(fd, n, p->info.typ, nse, nsa, encoding, opt); if (i > 1) { gen_element_end(fd, 0, ns_add(p, nse)); if (!is_invisible(p->sym->name)) { gen_element_begin(fd, n, ns_add(p, nse), p); if (p->info.typ->type == Ttemplate) { if ((((Tnode*)p->info.typ->ref)->type == Tpointer || is_smart((Tnode*)p->info.typ->ref)) && (((Tnode*)((Tnode*)p->info.typ->ref)->ref)->type == Tclass || ((Tnode*)((Tnode*)p->info.typ->ref)->ref)->type == Tstruct)) gen_atts(fd, (Table*)((Tnode*)((Tnode*)p->info.typ->ref)->ref)->ref, nse, nsa, encoding); else if (((Tnode*)p->info.typ->ref)->type == Tclass || ((Tnode*)p->info.typ->ref)->type == Tstruct) gen_atts(fd, (Table*)((Tnode*)p->info.typ->ref)->ref, nse, nsa, encoding); else fprintf(fd, ">"); } else fprintf(fd, ">"); } } fflush(fd); } } while (--i); } break; default: break; } } if (p->info.typ->type != Tunion) { if (!is_invisible(p->sym->name)) gen_element_end(fd, 0, ns_add(p, nse)); else fprintf(fd, "\n"); } if (gflag && is_container(p->info.typ)) fprintf(fd, "%*s\n", n, ""); fflush(fd); } } } void gen_atts(FILE *fd, Table *t, const char *nse, const char *nsa, const char *encoding) { Entry *q, *r; Tnode *p; while (t) { for (q = t->list; q; q = q->next) { if (q->info.sto & Sattribute && !is_invisible(q->sym->name) && q->info.maxOccurs != 0) { fprintf(fd, " %s=\"", ns_add(q, nsa)); if ((q->info.typ->type == Tpointer || is_smart(q->info.typ) || q->info.typ->type == Treference || q->info.typ->type == Trvalueref || q->info.typ->type == Ttemplate) && !is_string(q->info.typ) && !is_wstring(q->info.typ)) p = (Tnode*)q->info.typ->ref; else p = q->info.typ; if (!gflag && is_eq(q->sym->name, "id")) fprintf(fd, "_%lu", ++idnum); /* id="#" should be unique */ else if (!q->info.hasval && !q->info.ptrval && p->sym && has_ns_eq("xsd", p->sym->name)) { gen_val(fd, 0, p, nse, nsa, encoding, q->info.minOccurs == 0); } else { switch (p->type) { case Tchar: case Tshort: case Tint: case Tuchar: case Tushort: case Tuint: case Tlong: case Tulong: case Tllong: case Tullong: if (q->info.hasval || q->info.ptrval) fprintf(fd, SOAP_LONG_FORMAT, q->info.val.i); else gen_val(fd, 0, p, nse, nsa, encoding, q->info.minOccurs == 0); break; case Tfloat: case Tdouble: case Tldouble: if (q->info.hasval || q->info.ptrval) fprintf(fd, "%.16lG", q->info.val.r); else gen_val(fd, 0, p, nse, nsa, encoding, q->info.minOccurs == 0); break; case Ttime: gen_val(fd, 0, p, nse, nsa, encoding, q->info.minOccurs == 0); break; case Tenum: case Tenumsc: if ((q->info.hasval || q->info.ptrval) && p->ref) { for (r = ((Table*)p->ref)->list; r; r = r->next) { if (r->info.val.i == q->info.val.i) { fprintf(fd, "%s", ns_remove2(r->sym->name, c_ident(p))); break; } } } else gen_val(fd, 0, p, nse, nsa, encoding, q->info.minOccurs == 0); break; case Tpointer: case Treference: case Trvalueref: case Ttemplate: if (is_string(p) || is_wstring(p)) { if ((q->info.hasval || q->info.ptrval) && q->info.val.s) fprintf(fd, "%s", xstring(q->info.val.s)); else gen_val(fd, 0, p, nse, nsa, encoding, q->info.minOccurs == 0); } else if (is_stdstr(p->ref)) { if ((q->info.hasval || q->info.ptrval) && q->info.val.s) fprintf(fd, "%s", xstring(q->info.val.s)); else gen_val(fd, 0, p->ref, nse, nsa, encoding, q->info.minOccurs == 0); } break; case Tstruct: case Tclass: if (is_stdstr(p)) { if ((q->info.hasval || q->info.ptrval) && q->info.val.s) fprintf(fd, "%s", xstring(q->info.val.s)); else gen_val(fd, 0, p, nse, nsa, encoding, q->info.minOccurs == 0); } else { gen_val(fd, 0, p, nse, nsa, encoding, q->info.minOccurs == 0); } break; default: break; } } fprintf(fd, "\""); } } t = t->prev; if (t) nsa = ns_qualifiedAttributeName(t->sym->name); } fprintf(fd, ">"); fflush(fd); } void gen_val(FILE *fd, int n, Tnode *p, const char *nse, const char *nsa, const char *encoding, int opt) { Entry *q; LONG64 i; if (!is_transient(p) && p->type != Tfun && !is_XML(p)) { if (is_fixedstring(p)) { LONG64 k = p->width / ((Tnode*)p->ref)->width - 1; if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[TEXT[" SOAP_LONG_FORMAT ":" SOAP_LONG_FORMAT "]]]%%", k, k); } else { for (i = 0; i < k; i++) fprintf(fd, "X"); } return; } else if (p->type == Tarray) { i = ((Tnode*) p->ref)->width; fprintf(fd, "\n"); if (i) { i = p->width / i; if (gflag) { fprintf(fd, "%*s<__REPEAT min=\"" SOAP_LONG_FORMAT "\" max=\"" SOAP_LONG_FORMAT "\">\n", n+1, "", i, i); fprintf(fd, "%*s", n+1, ""); gen_val(fd, n+1, (Tnode*)p->ref, nse, nsa, encoding, 0); fprintf(fd, "\n"); fprintf(fd, "%*s\n", n+1, ""); } else { fprintf(fd, "%*s", n+1, ""); gen_val(fd, n+1, (Tnode*)p->ref, nse, nsa, encoding, 0); fprintf(fd, "\n"); } fprintf(fd, "%*s", n, ""); } return; } else if ((q = is_dynamic_array(p))) { if (is_hexBinary(p)) { if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[HEX[%ld:%ld]]]%%", minlen(p), maxlen(p)); else if (p->hasmin) fprintf(fd, "%%[[HEX[%ld:2147483647]]]%%", minlen(p)); else if (p->hasmax) fprintf(fd, "%%[[HEX[0:%ld]]]%%", maxlen(p)); else fprintf(fd, "%%[[HEX]]%%"); } } else if (is_binary(p)) { if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[BASE64[%ld:%ld]]]%%", minlen(p), maxlen(p)); else if (p->hasmin) fprintf(fd, "%%[[BASE64[%ld:2147483647]]]%%", minlen(p)); else if (p->hasmax) fprintf(fd, "%%[[BASE64[0:%ld]]]%%", maxlen(p)); else fprintf(fd, "%%[[BASE64]]%%"); } } else { int d = get_Darraydims(p); if (d == 0) d = 1; LONG64 k = q->info.minOccurs < 100000 ? q->info.minOccurs : 100000; if (k < 1 && (q->info.maxOccurs > 0 || q->info.maxOccurs < 0)) k = 1; if (gflag) { for (i = 0; i < d; i++) { fprintf(fd, "%*s<__REPEAT min=\"" SOAP_LONG_FORMAT "\"", n+1, "", q->info.minOccurs); if (q->info.maxOccurs > 1) fprintf(fd, " max=\"" SOAP_LONG_FORMAT "\"", q->info.maxOccurs); else fprintf(fd, " max=\"unbounded\""); fprintf(fd, ">\n"); } k = 1; } else if (yflag) { fprintf(fd, "%*s\n"); } for (i = 0; i < k; ++i) { fprintf(fd, "%*s<%s>", n+1, "", q->sym->name[5]?q->sym->name+5:"item"); gen_val(fd, n+1, q->info.typ, nse, nsa, encoding, q->info.maxOccurs == 0); fprintf(fd, "\n", q->sym->name[5]?q->sym->name+5:"item"); } if (gflag) for (i = 0; i < d; i++) fprintf(fd, "%*s\n", n+1, ""); } return; } else if (has_restriction_base(p, "xsd__anyURI")) { if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[URI]]%%"); } else { fprintf(fd, "http://www.example.com/schema/anyURI"); } return; } else if (has_restriction_base(p, "xsd__boolean")) { if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[BOOL]]%%"); } else { fprintf(fd, "false"); } return; } else if (has_restriction_base(p, "xsd__ENTITY") || has_restriction_base(p, "xsd__ENTITIES")) { if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[ENTITY[%ld:%ld]]]%%", minlen(p), maxlen(p)); else if (p->hasmin) fprintf(fd, "%%[[ENTITY[%ld:2147483647]]]%%", minlen(p)); else if (p->hasmax) fprintf(fd, "%%[[ENTITY[0:%ld]]]%%", maxlen(p)); else fprintf(fd, "%%[[ENTITY]]%%"); } else { if (p->imin > 0 && p->imin < 100000) for (i = 0; i < (int)p->imin; i++) fprintf(fd, "X"); } return; } else if (has_restriction_base(p, "xsd__ID")) { if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[ID[%ld:%ld]]]%%", minlen(p), maxlen(p)); else if (p->hasmin) fprintf(fd, "%%[[ID[%ld:2147483647]]]%%", minlen(p)); else if (p->hasmax) fprintf(fd, "%%[[ID[0:%ld]]]%%", maxlen(p)); else fprintf(fd, "%%[[ID]]%%"); } else if (p->imin > 0 && p->imin < 100000) { for (i = 0; i < (int)p->imin; i++) fprintf(fd, "X"); } else { fprintf(fd, "_%lu", ++idnum); } return; } else if (has_restriction_base(p, "xsd__IDREF") || has_restriction_base(p, "xsd__IDREFS")) { if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[IDREF[%ld:%ld]]]%%", minlen(p), maxlen(p)); else if (p->hasmin) fprintf(fd, "%%[[IDREF[%ld:2147483647]]]%%", minlen(p)); else if (p->hasmax) fprintf(fd, "%%[[IDREF[0:%ld]]]%%", maxlen(p)); else fprintf(fd, "%%[[IDREF]]%%"); } else if (p->imin > 0 && p->imin < 100000) { for (i = 0; i < (int)p->imin; i++) fprintf(fd, "X"); } else { fprintf(fd, "_%lu", ++idnum); } return; } else if (has_restriction_base(p, "xsd__integer")) { if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[INT64]]%%"); } else fprintf(fd, "0"); return; } else if (has_restriction_base(p, "xsd__date")) { if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[DATE]]%%"); } else { fprintf(fd, "1999-12-31"); } return; } else if (has_restriction_base(p, "xsd__dateTime")) { if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[DATETIME]]%%"); } else { char tmp[256]; time_t T = time(NULL); strftime(tmp, 256, "%Y-%m-%dT%H:%M:%SZ", gmtime(&T)); fprintf(fd, "%s", tmp); } return; } else if (has_restriction_base(p, "xsd__decimal")) { if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[DOUBLE]]%%"); } else { fprintf(fd, "0.0"); } return; } else if (has_restriction_base(p, "xsd__duration")) { if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[DURATION]]%%"); } else { fprintf(fd, "PT0S"); } return; } else if (has_restriction_base(p, "xsd__language")) { if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[LANG[%ld:%ld]]]%%", minlen(p), maxlen(p)); else if (p->hasmin) fprintf(fd, "%%[[LANG[%ld:2]]]%%", minlen(p)); else if (p->hasmax) fprintf(fd, "%%[[LANG[0:%ld]]]%%", maxlen(p)); else fprintf(fd, "%%[[LANG]]%%"); } else { if (p->imin > 0 && p->imin < 100000) for (i = 0; i < (int)p->imin; i++) fprintf(fd, "X"); } return; } else if (has_restriction_base(p, "xsd__Name")) { if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[NAME[%ld:%ld]]]%%", minlen(p), maxlen(p)); else if (p->hasmin) fprintf(fd, "%%[[NAME[%ld:2147483647]]]%%", minlen(p)); else if (p->hasmax) fprintf(fd, "%%[[NAME[0:%ld]]]%%", maxlen(p)); else fprintf(fd, "%%[[NAME]]%%"); } else { if (p->imin > 0 && p->imin < 100000) for (i = 0; i < (int)p->imin; i++) fprintf(fd, "X"); } return; } else if (has_restriction_base(p, "xsd__NCName")) { if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[NCNAME[%ld:%ld]]]%%", minlen(p), maxlen(p)); else if (p->hasmin) fprintf(fd, "%%[[NCNAME[%ld:2147483647]]]%%", minlen(p)); else if (p->hasmax) fprintf(fd, "%%[[NCNAME[0:%ld]]]%%", maxlen(p)); else fprintf(fd, "%%[[NCNAME]]%%"); } else { if (p->imin > 0 && p->imin < 100000) for (i = 0; i < (int)p->imin; i++) fprintf(fd, "X"); } return; } else if (has_restriction_base(p, "xsd__NMTOKEN") || has_restriction_base(p, "xsd__NMTOKENS")) { if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[NMTOKEN[%ld:%ld]]]%%", minlen(p), maxlen(p)); else if (p->hasmin) fprintf(fd, "%%[[NMTOKEN[%ld:2147483647]]]%%", minlen(p)); else if (p->hasmax) fprintf(fd, "%%[[NMTOKEN[0:%ld]]]%%", maxlen(p)); else fprintf(fd, "%%[[NMTOKEN]]%%"); } else { if (p->imin > 0 && p->imin < 100000) for (i = 0; i < (int)p->imin; i++) fprintf(fd, "X"); } return; } else if (has_restriction_base(p, "xsd__token") || has_restriction_base(p, "xsd__token")) { if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[TOKEN[%ld:%ld]]]%%", minlen(p), maxlen(p)); else if (p->hasmin) fprintf(fd, "%%[[TOKEN[%ld:2147483647]]]%%", minlen(p)); else if (p->hasmax) fprintf(fd, "%%[[TOKEN[0:%ld]]]%%", maxlen(p)); else fprintf(fd, "%%[[TOKEN]]%%"); } else { if (p->imin > 0 && p->imin < 100000) for (i = 0; i < (int)p->imin; i++) fprintf(fd, "X"); } return; } else if (has_restriction_base(p, "xsd__negativeInteger")) { if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[-9223372036854775808:-1]]%%"); } else { fprintf(fd, "-1"); } return; } else if (has_restriction_base(p, "xsd__nonNegativeInteger")) { if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[0:9223372036854775807]]%%"); } else { fprintf(fd, "0"); } return; } else if (has_restriction_base(p, "xsd__nonPositiveInteger")) { if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[-9223372036854775808:0]]%%"); } else { fprintf(fd, "0"); } return; } else if (has_restriction_base(p, "xsd__positiveInteger")) { if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[1:9223372036854775807]]%%"); } else { fprintf(fd, "1"); } return; } else if (has_restriction_base(p, "xsd__time")) { if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[TIME]]%%"); } else { fprintf(fd, "12:34:56.789Z"); } return; } else if (is_qname(p) || is_stdqname(p)) { if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[QNAME]]%%"); } else { fprintf(fd, "xsd:string"); } return; } if (p->pattern && *p->pattern != '%') { if (gflag) { const char *s; if (opt) fprintf(fd, "???"); fprintf(fd, "%%[['"); for (s = p->pattern; *s; s++) { if (*s == '\'') fprintf(fd, "\\'"); else fprintf(fd, "%c", *s); } if (p->hasmin && p->hasmax) fprintf(fd, "'[%ld:%ld]]]%%", minlen(p), maxlen(p)); else if (p->hasmin) fprintf(fd, "'[%ld:2147483647]]]%%", minlen(p)); else if (p->hasmax) fprintf(fd, "'[0:%ld]]]%%", maxlen(p)); else fprintf(fd, "']]%%"); return; } } switch (p->type) { case Tchar: if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[%d:%d]]%%", (int)p->imin + (p->incmin == False), (int)p->imax - (p->incmax == False)); else if (p->hasmin) fprintf(fd, "%%[[%d:127]]%%", (int)p->imin + (p->incmin == False)); else if (p->hasmax) fprintf(fd, "%%[[-128:%d]]%%", (int)p->imax - (p->incmax == False)); else fprintf(fd, "%%[[INT8]]%%"); } else { if (p->hasmin && p->imin > 0) fprintf(fd, "%d", (int)p->imin + (p->incmin == False)); else if (p->hasmax && p->imax < 0) fprintf(fd, "%d", (int)p->imax - (p->incmax == False)); else fprintf(fd, "0"); } break; case Tshort: if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[%d:%d]]%%", (int)p->imin + (p->incmin == False), (int)p->imax - (p->incmax == False)); else if (p->hasmin) fprintf(fd, "%%[[%d:32767]]%%", (int)p->imin + (p->incmin == False)); else if (p->hasmax) fprintf(fd, "%%[[-32768:%d]]%%", (int)p->imax - (p->incmax == False)); else fprintf(fd, "%%[[INT16]]%%"); } else { if (p->hasmin && p->imin > 0) fprintf(fd, "%d", (int)p->imin + (p->incmin == False)); else if (p->hasmax && p->imax < 0) fprintf(fd, "%d", (int)p->imax - (p->incmax == False)); else fprintf(fd, "0"); } break; case Tint: case Tlong: if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[%ld:%ld]]%%", (long)p->imin + (p->incmin == False), (long)p->imax - (p->incmax == False)); else if (p->hasmin) fprintf(fd, "%%[[%ld:2147483647]]%%", (long)p->imin + (p->incmin == False)); else if (p->hasmax) fprintf(fd, "%%[[-2147483648:%ld]]%%", (long)p->imax - (p->incmax == False)); else fprintf(fd, "%%[[INT32]]%%"); } else { if (p->hasmin && p->imin > 0) fprintf(fd, "%ld", (long)p->imin + (p->incmin == False)); else if (p->hasmax && p->imax < 0) fprintf(fd, "%ld", (long)p->imax - (p->incmax == False)); else fprintf(fd, "0"); } break; case Tllong: if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[" SOAP_LONG_FORMAT ":" SOAP_LONG_FORMAT "]]%%", p->imin + (p->incmin == False), p->imax - (p->incmax == False)); else if (p->hasmin) fprintf(fd, "%%[[" SOAP_LONG_FORMAT ":9223372036854775807]]%%", p->imin + (p->incmin == False)); else if (p->hasmax) fprintf(fd, "%%[[-9223372036854775808:" SOAP_LONG_FORMAT "]]%%", p->imax - (p->incmax == False)); else fprintf(fd, "%%[[INT64]]%%"); } else { if (p->hasmin && p->imin > 0) fprintf(fd, SOAP_LONG_FORMAT, p->imin + (p->incmin == False)); else if (p->hasmax && p->imax < 0) fprintf(fd, SOAP_LONG_FORMAT, p->imax - (p->incmax == False)); else fprintf(fd, "0"); } break; case Tuchar: if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[%u:%u]]%%", (unsigned int)p->imin + (p->incmin == False), (unsigned int)p->imax - (p->incmax == False)); else if (p->hasmin) fprintf(fd, "%%[[%u:255]]%%", (unsigned int)p->imin + (p->incmin == False)); else if (p->hasmax) fprintf(fd, "%%[[0:%u]]%%", (unsigned int)p->imax - (p->incmax == False)); else fprintf(fd, "%%[[UINT8]]%%"); } else { if (p->hasmin && p->imin > 0) fprintf(fd, "%u", (unsigned int)p->imin + (p->incmin == False)); else if (p->hasmax && p->imax < 0) fprintf(fd, "%u", (unsigned int)p->imax - (p->incmax == False)); else fprintf(fd, "0"); } break; case Tushort: if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[%u:%u]]%%", (unsigned int)p->imin + (p->incmin == False), (unsigned int)p->imax - (p->incmax == False)); else if (p->hasmin) fprintf(fd, "%%[[%u:65535]]%%", (unsigned int)p->imin + (p->incmin == False)); else if (p->hasmax) fprintf(fd, "%%[[0:%u]]%%", (unsigned int)p->imax - (p->incmax == False)); else fprintf(fd, "%%[[UINT16]]%%"); } else { if (p->hasmin && p->imin > 0) fprintf(fd, "%u", (unsigned int)p->imin + (p->incmin == False)); else if (p->hasmax && p->imax < 0) fprintf(fd, "%u", (unsigned int)p->imax - (p->incmax == False)); else fprintf(fd, "0"); } break; case Tuint: case Tulong: if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[%lu:%lu]]%%", (unsigned long)p->imin + (p->incmin == False), (unsigned long)p->imax - (p->incmax == False)); else if (p->hasmin) fprintf(fd, "%%[[%lu:4294967295]]%%", (unsigned long)p->imin + (p->incmin == False)); else if (p->hasmax) fprintf(fd, "%%[[0:%lu]]%%", (unsigned long)p->imax - (p->incmax == False)); else fprintf(fd, "%%[[UINT32]]%%"); } else { if (p->hasmin && p->imin > 0) fprintf(fd, "%lu", (unsigned long)p->imin + (p->incmin == False)); else if (p->hasmax && p->imax < 0) fprintf(fd, "%lu", (unsigned long)p->imax - (p->incmax == False)); else fprintf(fd, "0"); } break; case Tullong: if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[" SOAP_ULONG_FORMAT ":" SOAP_ULONG_FORMAT "]]%%", (ULONG64)p->imin + (p->incmin == False), (ULONG64)p->imax - (p->incmax == False)); else if (p->hasmin) fprintf(fd, "%%[[" SOAP_ULONG_FORMAT ":18446744073709551615]]%%", (ULONG64)p->imin + (p->incmin == False)); else if (p->hasmax) fprintf(fd, "%%[[0:" SOAP_ULONG_FORMAT "]]%%", (ULONG64)p->imax - (p->incmax == False)); else fprintf(fd, "%%[[UINT64]]%%"); } else { if (p->hasmin && p->imin > 0) fprintf(fd, SOAP_ULONG_FORMAT, (ULONG64)p->imin + (p->incmin == False)); else if (p->hasmax && p->imax < 0) fprintf(fd, SOAP_ULONG_FORMAT, (ULONG64)p->imax - (p->incmax == False)); else fprintf(fd, "0"); } break; case Tfloat: if (gflag) { const char *pattern = p->pattern && *p->pattern == '%' ? p->pattern : ""; if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax && p->incmin && p->incmax) fprintf(fd, "%%[[%.8E:%.8E%s]]%%", p->rmin, p->rmax, pattern); else if (p->hasmin && p->hasmax && p->incmin) fprintf(fd, "%%[[%.8E:%.8E%s)]%%", p->rmin, p->rmax, pattern); else if (p->hasmin && p->hasmax && p->incmax) fprintf(fd, "%%[(%.8E:%.8E%s]]%%", p->rmin, p->rmax, pattern); else if (p->hasmin && p->hasmax) fprintf(fd, "%%[(%.8E:%.8E%s)]%%", p->rmin, p->rmax, pattern); else if (p->hasmin && p->incmin) fprintf(fd, "%%[[%.8E:%.8E%s]]%%", p->rmin, FLT_MAX, pattern); else if (p->hasmin) fprintf(fd, "%%[(%.8E:%.8E%s]]%%", p->rmin, FLT_MAX, pattern); else if (p->hasmax && p->incmax) fprintf(fd, "%%[[%.8E:%.8E%s]]%%", -FLT_MAX, p->rmax, pattern); else if (p->hasmax) fprintf(fd, "%%[[%.8E:%.8E%s)]%%", -FLT_MAX, p->rmax, pattern); else fprintf(fd, "%%[[FLOAT%s]]%%", pattern); } else { if (p->hasmin && p->rmin > 0) fprintf(fd, "%.9lG", p->rmin * (1 + (p->incmin == False)/1000)); else if (p->hasmax && p->rmax > 0) fprintf(fd, "%.9lG", p->rmax * (1 - (p->incmax == False)/1000)); else if (p->hasmin && p->rmin < 0) fprintf(fd, "%.9lG", p->rmin * (1 - (p->incmin == False)/1000)); else if (p->hasmax && p->rmax < 0) fprintf(fd, "%.9lG", p->rmax * (1 + (p->incmax == False)/1000)); else fprintf(fd, "0.0"); } break; case Tdouble: case Tldouble: if (gflag) { const char *pattern = p->pattern && *p->pattern == '%' ? p->pattern : ""; if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax && p->incmin && p->incmax) fprintf(fd, "%%[[%.16lE:%.16lE%s]]%%", p->rmin, p->rmax, pattern); else if (p->hasmin && p->hasmax && p->incmin) fprintf(fd, "%%[[%.16lE:%.16lE%s)]%%", p->rmin, p->rmax, pattern); else if (p->hasmin && p->hasmax && p->incmax) fprintf(fd, "%%[(%.16lE:%.16lE%s]]%%", p->rmin, p->rmax, pattern); else if (p->hasmin && p->hasmax) fprintf(fd, "%%[(%.16lE:%.16lE%s)]%%", p->rmin, p->rmax, pattern); else if (p->hasmin && p->incmin) fprintf(fd, "%%[[%.16lE:%.16lE%s]]%%", p->rmin, DBL_MAX, pattern); else if (p->hasmin) fprintf(fd, "%%[(%.16lE:%.16lE%s]]%%", p->rmin, DBL_MAX, pattern); else if (p->hasmax && p->incmax) fprintf(fd, "%%[[%.16lE:%.16lE%s]]%%", -DBL_MAX, p->rmax, pattern); else if (p->hasmax) fprintf(fd, "%%[[%.16lE:%.16lE%s)]%%", -DBL_MAX, p->rmax, pattern); else fprintf(fd, "%%[[DOUBLE%s]]%%", pattern); } else { if (p->hasmin && p->rmin > 0) fprintf(fd, "%.17lG", p->rmin * (1 + (p->incmin == False)/1000)); else if (p->hasmax && p->rmax > 0) fprintf(fd, "%.17lG", p->rmax * (1 - (p->incmax == False)/1000)); else if (p->hasmin && p->rmin < 0) fprintf(fd, "%.17lG", p->rmin * (1 - (p->incmin == False)/1000)); else if (p->hasmax && p->rmax < 0) fprintf(fd, "%.17lG", p->rmax * (1 + (p->incmax == False)/1000)); else fprintf(fd, "0.0"); } break; case Ttime: if (gflag) { if (opt) fprintf(fd, "???"); fprintf(fd, "%%[[DATETIME]]%%"); } else { char tmp[256]; time_t T = time(NULL); strftime(tmp, 256, "%Y-%m-%dT%H:%M:%SZ", gmtime(&T)); fprintf(fd, "%s", tmp); } break; case Tenum: case Tenumsc: if (gflag) { if (opt) fprintf(fd, "???"); if (p->ref) { q = ((Table*)p->ref)->list; if (q) { if (!q->next) { fprintf(fd, "%s", ns_remove2(q->sym->name, c_ident(p))); } else { fprintf(fd, "%%[["); while (q) { fprintf(fd, "%s", ns_remove2(q->sym->name, c_ident(p))); if (q->next) fprintf(fd, "]["); q = q->next; } fprintf(fd, "]]%%"); } } } } else { if (p->ref && (q = ((Table*)p->ref)->list)) fprintf(fd, "%s", ns_remove2(q->sym->name, c_ident(p))); else fprintf(fd, "0"); } break; case Tpointer: case Treference: case Trvalueref: case Ttemplate: if (is_string(p) || is_wstring(p)) { if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[TEXT[%ld:%ld]]]%%", minlen(p), maxlen(p)); else if (p->hasmin) fprintf(fd, "%%[[TEXT[%ld:2147483647]]]%%", minlen(p)); else if (p->hasmax) fprintf(fd, "%%[[TEXT[0:%ld]]]%%", maxlen(p)); else fprintf(fd, "%%[[TEXT]]%%"); } else { if (p->imin > 0 && p->imin < 100000) for (i = 0; i < (int)p->imin; i++) fprintf(fd, "X"); } } else { gen_val(fd, n, (Tnode*)p->ref, nse, nsa, encoding, opt); } break; case Tclass: case Tstruct: nse = ns_qualifiedElement(p); nsa = ns_qualifiedAttribute(p); if (is_stdstr(p)) { if (gflag) { if (opt) fprintf(fd, "???"); if (p->hasmin && p->hasmax) fprintf(fd, "%%[[TEXT[%ld:%ld]]]%%", minlen(p), maxlen(p)); else if (p->hasmin) fprintf(fd, "%%[[TEXT[%ld:2147483647]]]%%", minlen(p)); else if (p->hasmax) fprintf(fd, "%%[[TEXT[0:%ld]]]%%", maxlen(p)); else fprintf(fd, "%%[[TEXT]]%%"); } else { if (p->imin > 0 && p->imin < 100000) for (i = 0; i < (int)p->imin; i++) fprintf(fd, "X"); } } else if (is_primclass(p)) { Table *t = (Table*)p->ref; while (t) { Entry *r = entry(classtable, t->sym); r = t->list; while (r && !is_item(r)) r = r->next; if (r) { gen_val(fd, n, r->info.typ, nse, nsa, encoding, opt); return; } t = t->prev; if (t) nse = ns_qualifiedElementName(t->sym->name); } } else if (!is_dynamic_array(p) && p->ref) { int i = 0; Table *t; if (gflag && opt) fprintf(fd, "???"); fprintf(fd, "\n"); for (t = (Table*)p->ref; t; t = t->prev) i++; for (; i > 0; i--) { int j; const char *nse1; t = (Table*)p->ref; for (j = 0; j < i-1; j++) t = t->prev; if (t == (Table*)p->ref) nse1 = nse; else nse1 = ns_qualifiedElementName(t->sym->name); for (q = t->list; q; q = q->next) { if (is_sequence(q)) { if (gflag) { if (q->info.minOccurs == 0) fprintf(fd, "%*s<__REPEAT min=\"" SOAP_LONG_FORMAT "\">\n", n+1, "", q->info.minOccurs); gen_field(fd, n, q, nse1, nsa, encoding, 0, 0); if (q->info.minOccurs == 0) fprintf(fd, "%*s\n", n+1, ""); } else { gen_field(fd, n, q, nse1, nsa, encoding, 0, 0); } } else if (is_repetition(q)) { if (gflag) { fprintf(fd, "%*s<__REPEAT min=\"" SOAP_LONG_FORMAT "\"", n+1, "", q->info.minOccurs); if (q->info.maxOccurs > 1) fprintf(fd, " max=\"" SOAP_LONG_FORMAT "\"", q->info.maxOccurs); else fprintf(fd, " max=\"unbounded\""); fprintf(fd, ">\n"); gen_field(fd, n+1, q->next, nse1, nsa, encoding, 0, 0); fprintf(fd, "%*s\n", n+1, ""); } else { LONG64 j; if (yflag) { fprintf(fd, "%*s\n"); } j = q->info.minOccurs < 100000 ? q->info.minOccurs : 100000; if (j < 1 && (q->info.maxOccurs > 0 || q->info.maxOccurs < 0)) j = 1; for (; j > 0; --j) gen_field(fd, n+1, q->next, nse1, nsa, encoding, q->info.minOccurs == 0 && (opt || !is_invisible(p->id->name)), 0); } q = q->next; } else { gen_field(fd, n+1, q, nse1, nsa, encoding, q->info.minOccurs == 0 && (opt || !is_invisible(p->id->name)), 0); } } } fprintf(fd, "%*s", n, ""); } break; case Tunion: if ((Table*)p->ref && ((Table*)p->ref)->list) { if (gflag) { fprintf(fd, "%*s<__SELECT>\n", n, ""); for (q = ((Table*)p->ref)->list; q; q = q->next) gen_field(fd, n, q, nse, nsa, encoding, 0, 0); fprintf(fd, "%*s\n", n, ""); } else { if (yflag) { fprintf(fd, "%*s\n"); } gen_field(fd, n, ((Table*)p->ref)->list, nse, nsa, encoding, 0, 0); } } break; default: break; } } } void gen_header(FILE *fd, const char *method, int response, const char *encoding) { if (custom_header) { Service *sp; Method *m = NULL; Entry *q; Table *r; q = entry(classtable, lookup("SOAP_ENV__Header")); if (yflag) fprintf(fd, " \n", c_type(q->info.typ)); fprintf(fd, " \n"); if (q) { r = (Table*)q->info.typ->ref; if (r) { for (q = r->list; q; q = q->next) { if (!is_transient(q->info.typ) && !(q->info.sto & Sattribute) && q->info.typ->type != Tfun) { for (sp = services; sp; sp = sp->next) for (m = sp->list; m; m = m->next) if (is_eq(m->name, method) && (!strcmp(m->part, q->sym->name) || is_eq_nons(m->part, q->sym->name)) && ((!response && (m->mess&HDRIN)) || (response && (m->mess&HDROUT)))) { gen_field(fd, 2, q, NULL, NULL, encoding, q->info.minOccurs == 0, 0); break; } } } fprintf(fd, " \n"); } } } } FILE * gen_env(const char *buf, const char *method, int response, const char *encoding, int soap) { char tmp[1024]; FILE *fd; strcpy(tmp, buf); if (!soap) strcat(tmp, "REST."); #ifdef __vms if (!response) { sprintf(strrchr(tmp, '.'), "_%s_req.xml", method); fprintf(fmsg, "Saving %s sample SOAP/XML request\n", tmp); } else { sprintf(strrchr(tmp, '.'), "_%s_res.xml", method); fprintf(fmsg, "Saving %s sample SOAP/XML response\n", tmp); } #else strcpy(strrchr(tmp, '.')+1, method); if (!response) { strcat(tmp, ".req.xml"); fprintf(fmsg, "Saving %s sample SOAP/XML request\n", tmp); } else { strcat(tmp, ".res.xml"); fprintf(fmsg, "Saving %s sample SOAP/XML response\n", tmp); } #endif fd = fopen(tmp, "w"); if (!fd) execerror("Cannot write XML file"); fprintf(fd, "\n"); if (soap && soap_version >= 0) { fprintf(fd, "\n"); gen_header(fd, method, response, encoding); fprintf(fd, " \n"); } return fd; } void gen_xmlns(FILE *fd, int soap) { Symbol *s; Service *sp = NULL; for (s = nslist; s; s = s->next) { for (sp = services; sp; sp = sp->next) if (!tagcmp(sp->ns, s->name) && sp->URI) break; if (sp) fprintf(fd, "\n xmlns:%s=\"%s\"", ns_convert(s->name), sp->URI); else if (!strcmp(s->name, "SOAP-ENV")) { if (soap && soap_version >= 0) fprintf(fd, "\n xmlns:SOAP-ENV=\"%s\"", envURI); } else if (!strcmp(s->name, "SOAP-ENC")) { if (soap && soap_version >= 0) fprintf(fd, "\n xmlns:SOAP-ENC=\"%s\"", encURI); } else if (!strcmp(s->name, "xsi")) fprintf(fd, "\n xmlns:xsi=\"%s\"", xsiURI); else if (!strcmp(s->name, "xsd")) fprintf(fd, "\n xmlns:xsd=\"%s\"", xsdURI); else fprintf(fd, "\n xmlns:%s=\"%s/%s.xsd\"", ns_convert(s->name), tmpURI, ns_convert(s->name)); } } char * emalloc(size_t n) { char *p; if ((p = (char*)malloc(n)) == NULL) execerror("out of memory"); return p; } void soap_serve(Table *table) { if (!Sflag) { Entry *method; banner(fheader, "Client-Side Call Stub Functions"); if (rflag) { Service *sp; fprintf(freport, "## Web Client Operations {#doc-client}\n\n"); for (sp = services; sp; sp = sp->next) { if (sp->documentation) { gen_text(freport, sp->documentation); fprintf(freport, "\n\n"); } } } for (method = table->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ)) { if (rflag) gen_call_proto(freport, method); gen_call_proto(fheader, method); gen_call_method(fclient, method, NULL); } } } if (!Cflag) { Entry *method, *catch_method; if (rflag) { Service *sp; fprintf(freport, "## Web Server Operations {#doc-server}\n\n"); for (sp = services; sp; sp = sp->next) { if (sp->documentation) { gen_text(freport, sp->documentation); fprintf(freport, "\n\n"); } } } banner(fheader, "Server-Side Operations"); if (!cflag && !namespaceid) fprintf(fserver, "extern \"C\" "); fprintf(fserver, "SOAP_FMAC5 int SOAP_FMAC6 %s_serve(struct soap *soap)", nflag?prefix:"soap"); fprintf(fserver, "\n{\n#ifndef WITH_FASTCGI\n\tsoap->keep_alive = soap->max_keep_alive + 1;\n#endif\n\tdo\n\t{"); fprintf(fserver, "\n#ifndef WITH_FASTCGI\n\t\tif (soap->keep_alive > 0 && soap->max_keep_alive > 0)\n\t\t\tsoap->keep_alive--;\n#endif"); fprintf(fserver, "\n\t\tif (soap_begin_serve(soap))\n\t\t{\tif (soap->error >= SOAP_STOP)\n\t\t\t\tcontinue;\n\t\t\treturn soap->error;\n\t\t}"); if (namespaceid) fprintf(fserver, "\n\t\tif ((%s::%s_serve_request(soap) || (soap->fserveloop && soap->fserveloop(soap))) && soap->error && soap->error < SOAP_STOP)\n\t\t{\n#ifdef WITH_FASTCGI\n\t\t\tsoap_send_fault(soap);\n#else\n\t\t\treturn soap_send_fault(soap);\n#endif\n\t\t}", namespaceid, nflag?prefix:"soap"); else fprintf(fserver, "\n\t\tif ((%s_serve_request(soap) || (soap->fserveloop && soap->fserveloop(soap))) && soap->error && soap->error < SOAP_STOP)\n\t\t{\n#ifdef WITH_FASTCGI\n\t\t\tsoap_send_fault(soap);\n#else\n\t\t\treturn soap_send_fault(soap);\n#endif\n\t\t}", nflag?prefix:"soap"); fprintf(fserver, "\n#ifdef WITH_FASTCGI\n\t\tsoap_destroy(soap);\n\t\tsoap_end(soap);\n\t} while (1);\n#else\n\t} while (soap->keep_alive);\n#endif"); fprintf(fserver, "\n\treturn SOAP_OK;"); fprintf(fserver, "\n}"); fprintf(fserver, "\n\n#ifndef WITH_NOSERVEREQUEST\n"); if (!cflag && !namespaceid) fprintf(fserver, "extern \"C\" "); fprintf(fserver, "SOAP_FMAC5 int SOAP_FMAC6 %s_serve_request(struct soap *soap)\n{", nflag?prefix:"soap"); if (sflag) fprintf(fserver, "\n\tsoap->mode |= SOAP_XML_STRICT;"); if (aflag) { int i, num = 0; struct pair *map; for (method = table->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) { int found = 0; Service *sp; for (sp = services; sp; sp = sp->next) { if (has_ns_eq(sp->ns, method->sym->name)) { Method *m; for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, method->sym->name)) { if (m->mess == ACTION || m->mess == REQUEST_ACTION) { ++num; found = 1; } } } } } if (Aflag && !found) { sprintf(errbuf, "Option -A requires a SOAPAction specified for operation %s where none is defined", ident(method->sym->name)); compliancewarn(errbuf); } } } map = (struct pair*)emalloc(num * sizeof(struct pair)); num = 0; for (method = table->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) { Service *sp; for (sp = services; sp; sp = sp->next) { if (has_ns_eq(sp->ns, method->sym->name)) { Method *m; for (m = sp->list; m; m = m->next) { if (is_eq_nons(m->name, method->sym->name)) { if (m->mess == ACTION || m->mess == REQUEST_ACTION) { map[num].action = m->part; map[num].method = method; ++num; } } } } } } } if (num > 0) { qsort(map, num, sizeof(struct pair), mapcomp); if (num > 4) /* binary search worthwhile when num > 4 */ { fprintf(fserver, "\n\tif (soap->action)\n\t{\n\t\tconst char *soap_action[] = { "); for (i = 0; i < num; i++) { if (*map[i].action == '"') fprintf(fserver, "%s, ", map[i].action); else fprintf(fserver, "\"%s\", ", map[i].action); } fprintf(fserver, " };"); fprintf(fserver, "\n\t\tswitch (soap_binary_search_string(soap_action, %d, soap->action))\n\t\t{", num); for (i = 0; i < num; i++) fprintf(fserver, "\n\t\t\tcase %d:\treturn soap_serve_%s(soap);", i, ident(map[i].method->sym->name)); fprintf(fserver, "\n\t\t}\n\t}"); } else { fprintf(fserver, "\n\tif (soap->action)\n\t{"); for (i = 0; i < num; i++) { if (*map[i].action == '"') fprintf(fserver, "\n\t\tif (!strcmp(soap->action, %s))", map[i].action); else fprintf(fserver, "\n\t\tif (!strcmp(soap->action, \"%s\"))", map[i].action); fprintf(fserver, "\n\t\t\treturn soap_serve_%s(soap);", ident(map[i].method->sym->name)); } fprintf(fserver, "\n\t}"); } } } if (!Aflag) { fprintf(fserver, "\n\tsoap_peek_element(soap);"); catch_method = NULL; for (method = table->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) { if (is_invisible(method->sym->name)) { Entry *param = entry(classtable, method->sym); if (param) param = ((Table*)param->info.typ->ref)->list; if (param) fprintf(fserver, "\n\tif (!soap_match_tag(soap, soap->tag, \"%s\"))\n\t\treturn soap_serve_%s(soap);", ns_convert(param->sym->name), ident(method->sym->name)); else catch_method = method; } else { fprintf(fserver, "\n\tif (!soap_match_tag(soap, soap->tag, \"%s\"))\n\t\treturn soap_serve_%s(soap);", ns_convert(method->sym->name), ident(method->sym->name)); } } } if (catch_method) fprintf(fserver, "\n\treturn soap_serve_%s(soap);", ident(catch_method->sym->name)); else fprintf(fserver, "\n\treturn soap->error = SOAP_NO_METHOD;"); } else { fprintf(fserver, "\n\treturn soap->error = SOAP_NO_METHOD;"); } fprintf(fserver, "\n}\n#endif"); if (rflag) { fprintf(freport, "Use the service request dispatcher that is auto-generated in [%s](%s) to accept and process service requests:\n\n", soapServer, pathsoapServer); fprintf(freport, " SOAP_FMAC5 int SOAP_FMAC6 %s_serve(struct soap *soap);\n\n", nflag?prefix:"soap"); fprintf(freport, "This function serves requests by calling one of the service operations listed further below that matches the request. Returns `SOAP_OK` or an error code. This function supports CGI by accepting a request on stdin and sending the response to stdout, and FastCGI. To serve over HTTP(S), use the following functions to establish a connection:\n\n"); fprintf(freport, "- `SOAP_SOCKET soap_bind(struct soap *soap, const char *host, int port, int backlog)` returns master socket bound to port (and restricted to host name if not NULL) or `SOAP_INVALID_SOCKET` upon error\n"); fprintf(freport, "- `SOAP_SOCKET soap_accept(struct soap *soap)` accepts connection and returns socket when accepted, or `SOAP_INVALID_SOCKET` upon error\n"); fprintf(freport, "- `int soap_ssl_accept(struct soap *soap)` performs SSL handshake and returns `SOAP_OK` when successful or an error code, call this function after `soap_accept()` to accept SSL/TLS connection\n\n"); } for (method = table->list; method; method = method->next) { if (method->info.typ->type == Tfun && !(method->info.sto & Sextern)) { if (rflag) generate_proto(freport, table, method); generate_proto(fheader, table, method); } } if (rflag) fprintf(freport, "\n\n"); banner(fheader, "Server-Side Skeletons to Invoke Service Operations"); fprintf(fheader, "\n"); if (!cflag && !namespaceid) fprintf(fheader, "extern \"C\" "); fprintf(fheader, "SOAP_FMAC5 int SOAP_FMAC6 %s_serve(struct soap*);", nflag?prefix:"soap"); fprintf(fheader, "\n\n"); if (!cflag && !namespaceid) fprintf(fheader, "extern \"C\" "); fprintf(fheader, "SOAP_FMAC5 int SOAP_FMAC6 %s_serve_request(struct soap*);", nflag?prefix:"soap"); for (method = table->list; method; method = method->next) if (method->info.typ->type == Tfun && !(method->info.sto & Sextern) && !is_imported(method->info.typ)) gen_serve_method(fserver, table, method, NULL); } } void generate_proto(FILE *fd, Table *table, Entry *param) { Entry *q, *pout; Table *output; Entry *result; result = (Entry*)param->info.typ->ref; q = entry(table, param->sym); if (q) { pout = (Entry*)q->info.typ->ref; } else { fprintf(stderr, "Internal error: no table entry\n"); return; } q = entry(classtable, param->sym); output = (Table*)q->info.typ->ref; if (fd == freport) gen_report_operation(NULL, param, 1); if (is_transient(pout->info.typ)) fprintf(fd, "\n /** Web service one-way operation '%s' implementation, should return value of soap_send_empty_response() to send HTTP Accept acknowledgment, or return an error code, or return SOAP_OK to immediately return without sending an HTTP response message */", ident(param->sym->name)); else fprintf(fd, "\n /** Web service operation '%s' implementation, should return SOAP_OK or error code */", ident(param->sym->name)); fprintf(fd, "\n SOAP_FMAC5 int SOAP_FMAC6 %s(struct soap*", ident(param->sym->name)); gen_params(fd, output, pout, 1); fprintf(fd, ";"); if (fd == freport) { fprintf(freport, "\n\nwhere:\n\n- `struct soap *soap` is the context\n"); gen_report_params(q, result, 1); if (!is_transient(result->info.typ)) fprintf(freport, "This service function should be implemented as part of the service back-end code and return `SOAP_OK` and set the last parameter `%s` to the result, or return an error code\n\n", ident(result->sym->name)); else fprintf(freport, "This service function should be implemented as part of the service back-end code and call `int soap_send_empty_response(struct soap *soap, int httpcode)` with a HTTP status or error code (200 to 599) to return, when communicating over HTTP to return a HTTP header.\n\n"); gen_report_hr(); } } int tagcmp(const char *s, const char *t) { size_t i, n; if (!s) return -1; if (!t) return 1; n = strlen(s); for (i = 0; i < n; i++) { int c = t[i]; if (c == '_' && s[i] != '_') c = '-'; if (s[i] > c) return 1; if (s[i] < c) return -1; } return -(t[i] != 0); } int tagncmp(const char *s, const char *t, size_t n) { size_t i; if (!s) return -1; if (!t) return 1; for (i = 0; i < n; i++) { int c = t[i]; if (c == '_' && s[i] != '_') c = '-'; if (s[i] > c) return 1; if (s[i] < c) return -1; } return 0; } int property(Tnode *p) { if (is_primitive(p)) return 5; /* collapse white space in primitive type values */ return p->property; } void property_pattern(Tnode *p, const char *name) { p->property = 1; p->pattern = NULL; if (is_eq(name, "xsd__QName") || is_eq(name, "QName")) { p->property = 2; } else if (is_eq(name, "xsd__normalizedString") || is_eq(name, "xsd__anyURI")) { p->property = 4; } else if (is_eq(name, "xsd__NOTATION") || is_eq(name, "xsd__token")) { p->property = 5; } else if (is_eq(name, "xsd__language")) { p->property = 5; p->pattern = "([a-zA-Z]{2}|[iI]-[a-zA-Z]+|[xX]-[a-zA-Z]{1,8})(-[a-zA-Z]{1,8})*"; } else if (is_eq(name, "xsd__Name")) { p->property = 5; p->pattern = "\\i\\c*"; } else if (is_eq(name, "xsd__NMTOKEN")) { p->property = 5; p->pattern = "\\c+"; } else if (is_eq(name, "xsd__NMTOKENS")) { p->property = 5; p->pattern = "(\\c+[ ])*\\c+"; } else if (is_eq(name, "xsd__ENTITY") || is_eq(name, "xsd__ID") || is_eq(name, "xsd__IDREF") || is_eq(name, "xsd__NCName")) { p->property = 5; p->pattern = "[\\i-[:]][\\c-[:]]*"; } else if (is_eq(name, "xsd__ENTITIES") || is_eq(name, "xsd__IDREFS")) { p->property = 5; p->pattern = "([\\i-[:]][\\c-[:]]*[ ])*[\\i-[:]][\\c-[:]]*"; } else if (is_eq(name, "xsd__date")) { p->property = 5; p->pattern = "[-+]?\\d{4,}-\\d{2}-\\d{2}(Z|[-+]\\d{2}:\\d{2})?"; } else if (is_eq(name, "xsd__dateTime")) { p->property = 5; p->pattern = "[-+]?\\d{4,}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(Z|[-+]\\d{2}:\\d{2})?"; } else if (is_eq(name, "xsd__decimal")) { p->property = 5; p->pattern = "[-+]?(\\d+|\\d*\\.\\d*)"; } else if (is_eq(name, "xsd__duration")) { p->property = 5; p->pattern = "[-+]?P(\\d+Y)?(\\d+M)?(\\d+D)?(T(\\d+H)?(\\d+M)?(\\d+(\\.\\d*)?S)?)?"; } else if (is_eq(name, "xsd__gDay")) { p->property = 5; p->pattern = "---\\d{2}(Z|[-+]\\d{2}:\\d{2})?"; } else if (is_eq(name, "xsd__gMonth")) { p->property = 5; p->pattern = "--\\d{2}(Z|[-+]\\d{2}:\\d{2})?"; } else if (is_eq(name, "xsd__gMonthDay")) { p->property = 5; p->pattern = "--\\d{2}-\\d{2}(Z|[-+]\\d{2}:\\d{2})?"; } else if (is_eq(name, "xsd__gYear")) { p->property = 5; p->pattern = "([-+]?\\d{4,})(Z|[-+]\\d{2}:\\d{2})?"; } else if (is_eq(name, "xsd__gYearMonth")) { p->property = 5; p->pattern = "([-+]?\\d{4,})-\\d{2}(Z|[-+]\\d{2}:\\d{2})?"; } else if (is_eq(name, "xsd__integer")) { p->property = 5; p->pattern = "[-+]?\\d+"; } else if (is_eq(name, "xsd__negativeInteger")) { p->property = 5; p->pattern = "-\\d*[1-9]\\d*"; } else if (is_eq(name, "xsd__nonNegativeInteger")) { p->property = 5; p->pattern = "\\+?\\d+"; } else if (is_eq(name, "xsd__nonPositiveInteger")) { p->property = 5; p->pattern = "-\\d+|\\+?0+"; } else if (is_eq(name, "xsd__positiveInteger")) { p->property = 5; p->pattern = "\\+?\\d*[1-9]\\d*"; } else if (is_eq(name, "xsd__time")) { p->property = 5; p->pattern = "\\d{2}:\\d{2}:\\d{2}(Z|[-+]\\d{2}:\\d{2})?"; } } int is_qname(Tnode *p) { if (!is_string(p) && !is_wstring(p)) return 0; if (p->property == 2) return 1; if (p->sym && (is_eq(p->sym->name, "xsd__QName") || is_eq(p->sym->name, "QName"))) return 1; return p->id && (is_eq(p->id->name, "xsd__QName") || is_eq(p->id->name, "QName")); } int is_stdqname(Tnode *p) { if (!is_stdstring(p) && !is_stdwstring(p)) return 0; if (p->property == 2) return 1; if (p->sym && (is_eq(p->sym->name, "xsd__QName") || is_eq(p->sym->name, "QName"))) return 1; return p->id && (is_eq(p->id->name, "xsd__QName") || is_eq(p->id->name, "QName")); } int is_XML(Tnode *p) { if (is_synonym(p)) return (is_string(p) || is_wstring(p)) && is_eq(p->synonym->name, "XML"); return (p->sym && (is_string(p) || is_wstring(p)) && is_eq(p->sym->name, "XML")) || ((p->type == Tpointer || p->type == Treference || p->type == Trvalueref) && is_XML((Tnode*)p->ref)); } int is_stdXML(Tnode *p) { if (is_synonym(p)) return (is_stdstring(p) || is_stdwstring(p)) && is_eq(p->synonym->name, "XML"); return p->sym && (is_stdstring(p) || is_stdwstring(p)) && is_eq(p->sym->name, "XML"); } int is_response(Tnode *p) { return (p->type == Tpointer || p->type == Treference || p->type == Trvalueref) && p->ref && has_ns((Tnode*)p->ref) && ((((Tnode*)p->ref)->type == Tstruct || ((Tnode*)p->ref)->type == Tclass) && !is_external((Tnode*)p->ref) && !is_primclass((Tnode*)p->ref) && !is_dynamic_array((Tnode*)p->ref) && !is_stdstring((Tnode*)p->ref) && !is_stdwstring((Tnode*)p->ref)); } Entry* get_response(Tnode *p) { if (p->type == Tfun) return p->response; return 0; } int is_unmatched(Symbol *sym) { const char *s = sym->name; if (*s == ':') s++; return s[0] == '_' && s[1] != '_' && strncmp(s, "_DOT", 4) && strncmp(s, "_USCORE", 7) && (strncmp(s, "_x", 2) || !isxdigit(s[2]) || !isxdigit(s[3]) || !isxdigit(s[4]) || !isxdigit(s[5])); } int is_invisible(const char *name) { return name[0] == '-' || (name[0] == '_' && name[1] == '_' && strncmp(name, "__ptr", 5)); } int is_invisible_empty(Tnode *p) { if (p->type == Tstruct || p->type == Tclass) if (is_invisible(p->id->name)) if (!p->ref || !((Table*)p->ref)->list) return 1; return 0; } int is_element(Tnode *typ) { if (is_XML(typ) || is_stdXML(typ) || is_qname(typ) || is_stdqname(typ)) return 0; if (typ->sym) return is_unmatched(typ->sym); if (typ->type == Tstruct || typ->type == Tclass) return is_unmatched(typ->id); return 0; } int is_untyped(Tnode *typ) { Tnode *p; if (typ->sym) return is_unmatched(typ->sym); if (typ->type == Tpointer || typ->type == Treference || typ->type == Trvalueref || typ->type == Tarray) return is_untyped((Tnode*)typ->ref); if (typ->type == Tstruct || typ->type == Tclass) { if (is_dynamic_array(typ) && !has_ns(typ) && !is_binary(typ)) { p = (Tnode*)((Table*)typ->ref)->list->info.typ->ref; return is_untyped(p); } else return is_unmatched(typ->id); } return 0; } int is_primclass(Tnode *typ) { Table *t; if (typ->type == Tstruct || typ->type == Tclass) { if (!is_dynamic_array(typ)) { t = (Table*)typ->ref; while (t) { Entry *p = t->list; while (p && !is_item(p)) p = p->next; if (p) break; t = t->prev; } if (!t) return 0; t = (Table*)typ->ref; while (t) { Entry *p; for (p = t->list; p; p = p->next) if (!is_item(p) && p->info.typ->type != Tfun && !is_transient(p->info.typ) && p->info.sto != Sattribute && p->info.sto != Sprivate && p->info.sto != Sprotected) return 0; t = t->prev; } return 1; } } else if (typ->type == Tpointer || typ->type == Treference || typ->type == Trvalueref) return is_primclass((Tnode*)typ->ref); return 0; } int is_mask(Tnode *typ) { return ((typ->type == Tenum || typ->type == Tenumsc) && typ->width == 9); } int is_void(Tnode *typ) { if (!typ) return 1; if (typ->type == Tvoid) return 1; if (typ->type == Tpointer || typ->type == Treference || typ->type == Trvalueref || typ->type == Tarray || typ->type == Ttemplate) return is_void((Tnode*)typ->ref); return 0; } int is_pointer_to_derived(Entry *e) { if (is_soapref(e->info.typ)) return 0; if (e->info.typ->type == Tpointer && !(e->info.sto & (Sconst | Sprivate | Sprotected)) && is_transient(e->info.typ)) { Tnode *ref = e->info.typ->ref; if (ref && ref->id && !is_transient(ref)) { if (ref->sym) return is_eq(ref->sym->name, e->sym->name); return is_eq(ref->id->name, e->sym->name); } } return 0; } void gen_match_derived(FILE *fd, Tnode *typ) { fprintf(fd, "!soap_match_tag(soap, soap->type, \"%s\")", xsi_type(typ)); if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref && !is_transient(typ)) { Entry *p; for (p = ((Table*)typ->ref)->list; p; p = p->next) { if (is_pointer_to_derived(p)) { fprintf(fout, " || "); gen_match_derived(fd, p->info.typ->ref); } } } } Entry * base_type_of_derived(Tnode *typ) { Entry *base = NULL; if ((typ->type == Tstruct || typ->type == Tclass) && !is_transient(typ)) { Entry *p; for (p = classtable->list; p; p = p->next) { if ((p->info.typ->type == Tstruct || p->info.typ->type == Tclass) && !is_transient(p->info.typ) && p->info.typ->ref) { Entry *e; for (e = ((Table*)p->info.typ->ref)->list; e; e = e->next) { if (is_pointer_to_derived(e) && e->info.typ->ref == typ) { if (!base) { base = p; } else { sprintf(errbuf, "%s declared at %s:%d has multiple base types, including %s", c_type(typ), p->filename, p->lineno, base->sym->name); semwarn(errbuf); } } } } } } return base; } int is_transient(Tnode *typ) { if (!typ) return 1; if (typ->type == Tstruct && typ->id == lookup("soap")) return 1; if (is_external(typ) || is_volatile(typ)) return 0; if (typ->transient > 0) return 1; if (is_wstring(typ)) /* wchar_t* is serializable but wchar_t is transient */ return 0; switch (typ->type) { case Tpointer: case Treference: case Trvalueref: case Tarray: case Ttemplate: return is_transient((Tnode*)typ->ref); case Tnone: case Tvoid: case Twchar: /* wchar_t is transient */ case Tsize: /* size_t is transient */ return 1; default: break; } return 0; } int is_imported(Tnode* typ) { return typ->imported != NULL; } int is_external(Tnode* typ) { return typ->transient == -1 || typ->transient == -3; } int is_anyType(Tnode* typ) { if (!typ) return 0; if (typ->type == Tpointer || typ->type == Ttemplate) return is_anyType((Tnode*)typ->ref); if (is_external(typ) && typ->type == Tstruct && !strcmp(typ->id->name, "soap_dom_element")) return is_anyType_flag = 1; return 0; } int is_anyAttribute(Tnode* typ) { if (!typ) return 0; if (typ->type == Tpointer || typ->type == Ttemplate) return is_anyAttribute((Tnode*)typ->ref); return is_external(typ) && typ->type == Tstruct && !strcmp(typ->id->name, "soap_dom_attribute"); } int is_volatile(Tnode* typ) { return typ->transient == -2 || typ->transient == -3; } int is_smart(Tnode *p) { return p->type == Ttemplate && p->ref && is_volatile(p); } int is_smart_shared(Tnode *p) { if (is_smart(p)) { const char *s = strstr(p->id->name, "::"); if (s) return !strcmp(s, "::shared_ptr"); /* support shared_ptr STL and Boost */ } return 0; } const char * make_shared(Tnode *p) { const char *s = ""; /* should produce make_shared only if is_smart_shared(p) is true */ if (is_smart_shared(p)) { char *t; s = strstr(p->id->name, "::"); t = emalloc(s - p->id->name + 14); strncpy(t, p->id->name, s - p->id->name + 2); strcpy(t + (s - p->id->name) + 2, "make_shared"); s = t; } return s; } int is_container(Tnode *p) { if (p->type == Tpointer) return is_container((Tnode*)p->ref); return p->type == Ttemplate && !is_smart(p); } int is_template(Tnode *p) { if (p->type == Tpointer) return is_template((Tnode*)p->ref); return p->type == Ttemplate; } int is_repetition(Entry *p) { if (p) return p->next && p->next->info.typ->type == Tpointer && ((Tnode*)p->next->info.typ->ref)->type != Tvoid && (p->info.typ->type == Tint || p->info.typ->type == Tsize) && ((p->info.sto & Sspecial) || !strncmp(p->sym->name, "__size", 6)); return 0; } int is_item(Entry *p) { if (p) { int n; const char *s = p->sym->name; for (n = strlen(s) - 1; n && s[n] == '_'; n--) ; return !strncmp(s, "__item", n + 1); } return 0; } int is_self(Entry *p) { if (p) { int n; const char *s = p->sym->name; for (n = strlen(s) - 1; n && s[n] == '_'; n--) ; return !strncmp(s, "__self", n + 1); } return 0; } int is_choice(Entry *p) { if (p) if (p->next && p->next->info.typ->type == Tunion && p->info.typ->type == Tint && ((p->info.sto & Sspecial) || !strncmp(p->sym->name, "__union", 7))) return 1; return 0; } int required_choice(Tnode *typ) { if (typ->type == Tunion && ((Table*)typ->ref)) { Entry *p; for (p = ((Table*)typ->ref)->list; p; p = p->next) { if (!(p->info.sto & (Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && (!(p->info.sto & Sattribute)) && !is_repetition(p) && !is_anytype(p)) { if (p->info.minOccurs <= 0) return 0; } } } return -1; } int is_sequence(Entry *p) { if (p) { Tnode *q = p->info.typ; if (q->type == Tpointer) q = (Tnode*)q->ref; if ((q->type == Tstruct || q->type == Tclass) && is_invisible(p->sym->name) && is_invisible(q->id->name) && !is_transient(q)) return 1; } return 0; } int is_anytype(Entry *p) { if (p) { if (p->next && p->next->info.typ->type == Tpointer && ((Tnode*)p->next->info.typ->ref)->type == Tvoid && p->info.typ->type == Tint && ((p->info.sto & Sspecial) || !strncmp(p->sym->name, "__type", 6))) { is_anytype_flag = 1; return 1; } } return 0; } int is_keyword(const char *name) { Symbol *s = lookup(name); if (s) return s->token != ID; return 0; } int has_ptr(Tnode *typ) { Tnode *p; if (typ->type == Tpointer || typ->type == Treference || typ->type == Trvalueref) return 0; for (p = Tptr[Tpointer]; p; p = p->next) if ((Tnode*)p->ref == typ && p->transient != 1) return 1; return 0; } int has_detail_string(void) { Entry *p = entry(classtable, lookup("SOAP_ENV__Fault")); if (p && p->info.typ->ref && (p->info.typ->type == Tstruct || p->info.typ->type == Tclass)) { Entry *e = entry((Table*)p->info.typ->ref, lookup("detail")); if (e && e->info.typ->ref && e->info.typ->type == Tpointer && ((Tnode*)e->info.typ->ref)->type == Tstruct) { Entry *e2 = entry((Table*)((Tnode*)e->info.typ->ref)->ref, lookup("__any")); return e2 && is_string(e2->info.typ); } } return 0; } int has_Detail_string(void) { Entry *p = entry(classtable, lookup("SOAP_ENV__Fault")); if (p && p->info.typ->ref && (p->info.typ->type == Tstruct || p->info.typ->type == Tclass)) { Entry *e = entry((Table*)p->info.typ->ref, lookup("SOAP_ENV__Detail")); if (e && e->info.typ->ref && e->info.typ->type == Tpointer && ((Tnode*)e->info.typ->ref)->type == Tstruct) { Entry *e2 = entry((Table*)((Tnode*)e->info.typ->ref)->ref, lookup("__any")); return e2 && is_string(e2->info.typ); } } return 0; } int has_class(Tnode *typ) { Entry *p; if (!cflag && typ->type == Tstruct && typ->ref) { for (p = ((Table*)typ->ref)->list; p; p = p->next) { if (p->info.sto & Stypedef) continue; if (p->info.typ->type == Tclass || p->info.typ->type == Ttemplate) return 1; if (p->info.typ->type == Tstruct && has_class(p->info.typ)) return 1; } } return 0; } int has_external(Tnode *typ) { Entry *p; if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) { for (p = ((Table*)typ->ref)->list; p; p = p->next) { if (p->info.typ->type == Tstruct || p->info.typ->type == Tclass) { if (is_external(p->info.typ) || has_external(p->info.typ)) return 1; } } } return 0; } int has_volatile(Tnode *typ) { Entry *p; if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) { for (p = ((Table*)typ->ref)->list; p; p = p->next) { if (p->info.typ->type == Tstruct || p->info.typ->type == Tclass) { if (is_volatile(p->info.typ) || has_volatile(p->info.typ)) if (!is_stdstr(p->info.typ)) return 1; } } } return 0; } int has_ns(Tnode *typ) { if (typ->type == Tstruct || typ->type == Tclass || typ->type == Tenum || typ->type == Tenumsc) return has_ns_eq(NULL, typ->id->name); return 0; } int has_ns_t(Tnode *typ) { if (typ->sym) return has_ns_eq(NULL, typ->sym->name); return has_ns(typ); } /* needs_lang adds xml:lang attribute to matching struct/class member name we should use an annotation for soapcpp2's input this in the future instead of a hard-coded member name */ void needs_lang(Entry *e) { if (!strcmp(e->sym->name, "SOAP_ENV__Text")) fprintf(fout, "\n\tif (soap->lang)\n\t\tsoap_set_attr(soap, \"xml:lang\", soap->lang, 1);"); } int is_eq_nons(const char *s, const char *t) { size_t n, m; const char *r; while (*s == '_' || *s == ':') s++; while (*t == '_' || *t == ':') t++; if (!*s || !*t) return 0; r = strstr(t, "__"); if (r) t = r + 2; n = strlen(s) - 1; m = strlen(t) - 1; #ifdef SOAP_OLD_DIRECTIVE_NAME_MATCHING while (n > 0 && s[n] == '_') n--; while (m > 0 && t[m] == '_') m--; #endif if (n != m) return 0; return !strncmp(s, t, n + 1); } int is_eq(const char *s, const char *t) { size_t n, m; while (*s == '_' || *s == ':') s++; while (*t == '_' || *t == ':') t++; if (!*s || !*t) return 0; for (n = strlen(s) - 1; n && s[n] == '_'; n--) ; for (m = strlen(t) - 1; m && t[m] == '_'; m--) ; if (n != m) return 0; return !strncmp(s, t, n + 1); } int has_ns_eq(const char *ns, const char *s) { size_t n; while (*s == '_' || *s == ':') s++; if (!ns) { const char *t = *s ? strstr(s + 1, "__") : NULL; if (!t || (t[2] == 'x' && isxdigit(t[3]) && isxdigit(t[4]) && isxdigit(t[5]) && isxdigit(t[6])) || !strncmp(t+2, "DOT", 3) || !strncmp(t+2, "USCORE", 6)) { t = strchr(s, ':'); if (t && t[1] == ':') t = NULL; } return t && t[1] && t[2] && ( t[2] != '_' || (t[3] == 'x' && isxdigit(t[3]) && isxdigit(t[4]) && isxdigit(t[5]) && isxdigit(t[6])) || !strncmp(t+3, "DOT", 3) || !strncmp(t+3, "USCORE", 6)); } if ((n = strlen(ns)) < strlen(s)) return ((s[n] == '_' && s[n+1] == '_') || (s[n] == ':' && s[n+1] != ':')) && !tagncmp(ns, s, n); return 0; } const char * strict_check(void) { if (sflag) return ""; return "(soap->mode & SOAP_XML_STRICT) && "; } void fixed_check(FILE *fd, Entry *e, Table *t, const char *tabs) { const char *name = NULL; const char *type = NULL; char *buf; Tnode *p = e->info.typ; if (!e || (!e->info.hasval && !e->info.ptrval) || !e->info.fixed) return; name = ident(e->sym->name); if (t) type = ident(t->sym->name); buf = emalloc(2*strlen(name) + 2*(t ? strlen(type) + 2 : 0) + 20); if (e->info.ptrval) strcpy(buf, "(*a->"); else strcpy(buf, "a->"); if (t) { strcat(buf, type); strcat(buf, "::"); } strcat(buf, name); if (e->info.ptrval) strcat(buf, ")"); fprintf(fd, "\n%sif (*soap->href != '#' && (%s", tabs, strict_check()); if (e->info.ptrval) { fprintf(fd, "a->"); if (t) fprintf(fd, "%s::", type); fprintf(fd, "%s", name); if (is_smart(e->info.typ)) fprintf(fd, ".get()"); fprintf(fd, " && "); p = p->ref; } switch (p->type) { case Tchar: case Twchar: case Tuchar: case Tshort: case Tushort: case Tint: case Tuint: case Ttime: fprintf(fd, "%s != " SOAP_LONG_FORMAT, buf, e->info.val.i); break; case Tlong: fprintf(fd, "%s != " SOAP_LONG_FORMAT "L", buf, e->info.val.i); break; case Tulong: fprintf(fd, "%s != " SOAP_LONG_FORMAT "UL", buf, e->info.val.i); break; case Tllong: fprintf(fd, "%s != " SOAP_LONG_FORMAT "LL", buf, e->info.val.i); break; case Tullong: case Tsize: fprintf(fd, "%s != " SOAP_LONG_FORMAT "ULL", buf, e->info.val.i); break; case Tfloat: case Tdouble: fprintf(fd, "%s != %g", buf, e->info.val.r); break; case Tldouble: fprintf(fd, "%s != %gL", buf, e->info.val.r); break; case Tenum: case Tenumsc: if (e->info.val.i <= 0x7FFFLL && e->info.val.i >= -0x8000LL) fprintf(fd, "%s != (%s)" SOAP_LONG_FORMAT, buf, c_type(p), e->info.val.i); else fprintf(fd, "%s != (%s)" SOAP_LONG_FORMAT "LL", buf, c_type(p), e->info.val.i); break; default: if (is_stdstring(p) && e->info.val.s) fprintf(fd, "%s.compare(\"%s\")", buf, cstring(e->info.val.s, 0)); else if (is_stdwstring(p) && e->info.val.s) fprintf(fd, "%s.compare(L\"%s\")", buf, cstring(e->info.val.s, 0)); else if (is_wstring(p) && e->info.val.s) fprintf(fd, "wcscmp(%s, L\"%s\")", buf, cstring(e->info.val.s, 0)); else if (is_string(p) && e->info.val.s) fprintf(fd, "strcmp(%s, \"%s\")", buf, cstring(e->info.val.s, 0)); else fprintf(fd, "0"); break; } fprintf(fd, "))\n%s{\tsoap->error = SOAP_FIXED;\n%s\treturn NULL;\n%s}", tabs, tabs, tabs); } const char * ns_of(const char *name) { Service *sp; for (sp = services; sp; sp = sp->next) if (has_ns_eq(sp->ns, name)) break; if (sp) return sp->URI; return NULL; } int eq_ns(const char *s, const char *t) { return ns_of(s) == ns_of(t); } const char * prefix_of(const char *s) { const char *t; if (*s == ':' && s[1] != ':') return NULL; while (*s == '_' || *s == ':') s++; t = *s ? strstr(s + 1, "__") : NULL; if (!t) { t = strchr(s, ':'); if (t && t[1] == ':') t = NULL; } if (t && t[1] && t[2] && t[2] != '_') { char *r = (char*)emalloc(t - s + 1); strncpy(r, s, t - s); r[t - s] = '\0'; return r; } return NULL; } const char * ns_add_overridden(Table *t, Entry *p, const char *ns) { Entry *q; Symbol *s = t->sym; if (s) { do { for (q = t->list; q; q = q->next) if (!strcmp(q->sym->name, p->sym->name)) return ns_add(p, ns ? prefix_of(t->sym->name) : NULL); } while ((t = t->prev) != NULL); } return ns_add(p, ns); } const char * c_ident(Tnode *typ) { if (typ->sym && strcmp(typ->sym->name, "/*?*/")) return res_remove(typ->sym->name); return t_ident(typ); } const char * soap_type(Tnode *typ) { const char *t = c_ident(typ); char *s; if (namespaceid && (Qflag || !is_external(typ))) { s = (char*)emalloc(strlen(t) + strlen(namespaceid) + 12); strcpy(s, "SOAP_TYPE_"); strcat(s, namespaceid); strcat(s, "_"); } else { s = (char*)emalloc(strlen(t) + 11); strcpy(s, "SOAP_TYPE_"); } strcat(s, t); return s; } const char * soap_union_member(Tnode *typ, Entry *p) { const char *t = c_ident(typ); const char *n = ident(p->sym->name); char *s; if (namespaceid && (zflag == 0 || zflag > 3)) { s = (char*)emalloc(strlen(t) + strlen(n) + strlen(namespaceid) + 14); strcpy(s, "SOAP_UNION_"); strcat(s, namespaceid); strcat(s, "_"); } else { s = (char*)emalloc(strlen(t) + strlen(n) + 13); strcpy(s, "SOAP_UNION_"); } strcat(s, t); strcat(s, "_"); strcat(s, n); return s; } const char * ident(const char *name) { if (name) { const char *s = strrchr(name, ':'); if (s && *(s+1) && (s == name || *(s-1) != ':')) return s+1; } return name; } /*t_ident gives the base type name (e.g. when typedef'ed) of a type in identifier format*/ const char * t_ident(Tnode *typ) { char *p; const char *q; if (typ->extsym) return ident(typ->extsym->name); if (typ->restriction) return ident(typ->restriction->name); switch(typ->type) { case Tnone: return ""; case Tvoid: return "void"; case Tchar: return "byte"; case Twchar: return "wchar"; case Tshort: return "short"; case Tint: return "int"; case Tlong: return "long"; case Tllong: return "LONG64"; case Tfloat: return "float"; case Tdouble: return "double"; case Tldouble: return "decimal"; case Tuchar: return "unsignedByte"; case Tushort: return "unsignedShort"; case Tuint: return "unsignedInt"; case Tulong: return "unsignedLong"; case Tullong: return "ULONG64"; case Tsize: return "size_t"; case Ttime: return "dateTime"; case Tstruct: case Tclass: case Tunion: case Tenum: if (is_bool(typ)) return "bool"; case Tenumsc: return res_remove(typ->id->name); case Treference: case Trvalueref: return c_ident((Tnode*)typ->ref); case Tpointer: if (is_string(typ)) return "string"; if (is_wstring(typ)) return "wstring"; p = (char*)emalloc((10+strlen(q = c_ident((Tnode*)typ->ref))) * sizeof(char)); strcpy(p, "PointerTo"); strcat(p, q); return p; case Tarray: p = (char*)emalloc((16+strlen(c_ident((Tnode*)typ->ref))) * sizeof(char)); if (((Tnode*)typ->ref)->width) sprintf(p, "Array%dOf%s", typ->width / ((Tnode*) typ->ref)->width, c_ident((Tnode*)typ->ref)); else sprintf(p, "ArrayOf%s", c_ident((Tnode*)typ->ref)); return p; case Ttemplate: if (typ->ref) { p = (char*)emalloc((11+strlen(res_remove(typ->id->name))+strlen(q = c_ident((Tnode*)typ->ref))) * sizeof(char)); strcpy(p, res_remove(typ->id->name)); strcat(p, "TemplateOf"); strcat(p, q); return p; } case Tfun: return "Function"; } return "anyType"; } void utf8(char **t, long c) { if (c < 0x0080) *(*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'; } const char * ns_tag_convert(Entry *p) { if (p->tag) return p->tag; return ns_convert(p->sym->name); } const char * ns_convert(const char *tag) { const char *t; char *s; size_t i, n; if (*tag == ':') tag++; if (*tag == '_') { if (!strncmp(tag, "__ptr", 5)) { if (tag[5]) tag += 5; else tag = "item"; } else if (strncmp(tag, "_DOT", 4) && strncmp(tag, "_USCORE", 7) && (strncmp(tag, "_x", 2) || !isxdigit(tag[2]) || !isxdigit(tag[3]) || !isxdigit(tag[4]) || !isxdigit(tag[5]))) tag++; /* skip leading _ */ } for (n = strlen(tag); n > 0; n--) { if (tag[n-1] != '_') break; } t = s = (char*)emalloc(n+1); for (i = 0; i < n; i++) { if (tag[i] == '_') { if (tag[i+1] == '_' && !(tag[i+2] == 'x' && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5]) && isxdigit(tag[i+6]))) break; else if (!strncmp(tag+i, "_DOT", 4)) { *s++ = '.'; i += 3; } else if (!strncmp(tag+i, "_USCORE", 7)) { *s++ = '_'; i += 6; } else if (!strncmp(tag+i, "_x", 2) && isxdigit(tag[i+2]) && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5])) { char d[5]; strncpy(d, tag+i+2, 4); d[4] = '\0'; utf8(&s, strtoul(d, NULL, 16)); i += 5; } else *s++ = '-'; } else if (!strncmp(tag+i, "\\u", 2) && isxdigit(tag[i+2]) && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5])) { char d[5]; strncpy(d, tag+i+2, 4); d[4] = '\0'; utf8(&s, strtoul(d, NULL, 16)); i += 5; } else if (tag[i] == ':' && tag[i+1] == ':') break; else *s++ = tag[i]; } if (i < n) { *s++ = ':'; for (i += 2; i < n; i++) { if (tag[i] == '_') { if (!strncmp(tag+i, "_DOT", 4)) { *s++ = '.'; i += 3; } else if (!strncmp(tag+i, "_USCORE", 7)) { *s++ = '_'; i += 6; } else if (!strncmp(tag+i, "_x", 2) && isxdigit(tag[i+2]) && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5])) { char d[5]; strncpy(d, tag+i+2, 4); d[4] = '\0'; utf8(&s, strtoul(d, NULL, 16)); i += 5; } else *s++ = '-'; } else if (!strncmp(tag+i, "\\u", 2) && isxdigit(tag[i+2]) && isxdigit(tag[i+3]) && isxdigit(tag[i+4]) && isxdigit(tag[i+5])) { char d[5]; strncpy(d, tag+i+2, 4); d[4] = '\0'; utf8(&s, strtoul(d, NULL, 16)); i += 5; } else *s++ = tag[i]; } } *s = '\0'; return t; } const char * res_remove(const char *tag) { char *s; const char *t; if (!(t = strchr(tag, ':'))) return tag; if (t[1] != ':') tag = t + 1; if (!strchr(tag, ':')) return tag; s = (char*)emalloc(strlen(tag) + 1); t = strcpy(s, tag); while ((s = strchr(s, ':'))) *s = '_'; return t; } const char * ns_qualifiedElement(Tnode *typ) { const char *s = NULL; if (typ->sym) s = typ->sym->name; if (!s && typ->id) s = typ->id->name; return ns_qualifiedElementName(s); } const char * ns_qualifiedElementName(const char *s) { Service *sp; if (!s) return NULL; s = prefix_of(s); if (!s) return NULL; for (sp = services; sp; sp = sp->next) { if (sp->elementForm && !tagcmp(sp->ns, s)) { if (!strcmp(sp->elementForm, "qualified")) return s; return NULL; } } return NULL; } const char * ns_qualifiedAttribute(Tnode *typ) { const char *s = NULL; if (typ->sym) s = typ->sym->name; if (!s && typ->id) s = typ->id->name; return ns_qualifiedAttributeName(s); } const char * ns_qualifiedAttributeName(const char *s) { Service *sp; if (!s) return NULL; s = prefix_of(s); if (!s) return NULL; for (sp = services; sp; sp = sp->next) { if (sp->attributeForm && !tagcmp(sp->ns, s)) { if (!strcmp(sp->attributeForm, "qualified")) return s; return NULL; } } return NULL; } const char * field(Entry *p, const char *ns) { const char *r; char *s; if (is_self(p)) return "tag"; r = ns_add(p, ns); s = (char*)emalloc(strlen(r) + 3); strcpy(s, "\""); strcat(s, r); strcat(s, "\""); return s; } const char * field_overridden(Table *t, Entry *p, const char *ns) { const char *r; char *s; if (is_self(p)) return "tag"; r = ns_add_overridden(t, p, ns); s = (char*)emalloc(strlen(r) + 3); strcpy(s, "\""); strcat(s, r); strcat(s, "\""); return s; } const char * ns_add(Entry *p, const char *ns) { if (p->tag) return ns_addx(p->tag, ns); if (*p->sym->name == ':') return ns_convert(p->sym->name); return ns_addx(ns_convert(p->sym->name), ns); } const char * ns_addx(const char *tag, const char *ns) { const char *n; char *t; const char *s = tag; if (*s == ':') return s+1; if (!ns || *s == '-' || strchr(s, ':')) return s; n = ns_convert(ns); t = (char*)emalloc(strlen(n) + strlen(s) + 2); strcpy(t, n); strcat(t, ":"); strcat(t, s); return t; } const char * ns_name(const char *tag) { const char *t, *r, *s = tag; if (*s) { for (r = s+strlen(s)-1; r > s; r--) if (*r != '_') break; for (t = s + 1; t < r; t++) { if (t[0] == '_' && t[1] == '_') { s = t + 2; t++; } else if (t[0] == ':' && t[1] != ':') { s = t + 1; t++; } } } return s; } const char * ns_cname(const char *tag, const char *suffix) { char *s; const char *t; size_t i, n; if (!tag) return NULL; t = ns_name(tag); n = strlen(t); if (suffix) s = (char*)emalloc(n + strlen(suffix) + 2); else s = (char*)emalloc(n + 2); for (i = 0; i < n; i++) { if (!isalnum(t[i])) s[i] = '_'; else s[i] = t[i]; } s[i] = '\0'; if (suffix) strcat(s, suffix); if (is_keyword(t)) strcat(s, "_"); return s; } const char * ns_fname(const char *tag) { char *s; size_t i; s = (char*)emalloc(strlen(tag) + 1); strcpy(s, tag); for (i = 0; s[i]; i++) if (!isalnum(s[i])) s[i] = '_'; return s; } const char * ns_tag_remove(Entry *p) { if (p->tag) { const char *s = strchr(p->tag, ':'); if (s) return s + 1; return p->tag; } return ns_remove(p->sym->name); } const char * ns_remove(const char *tag) { return ns_convert(ns_name(tag)); } const char * ns_remove1(const char *tag) { const char *t, *s = tag; int n = 2; if (*s) { for (t = s + 1; *t && n; t++) if (t[0] == '_' && t[1] == '_') { s = t + 2; t++; n--; } if (n || (s[0] == '_' && s[1] != 'x' && strncmp(s, "_USCORE", 7)) || !*s) s = tag; } return s; } const char * ns_remove2(const char *tag, const char *type) { return ns_convert(ns_remove3(tag, type)); } const char * ns_remove3(const char *tag, const char *type) { size_t n; if (tag && type && !strncmp(tag, type, n = strlen(type)) && strlen(tag) > n + 2 && tag[n] == '_' && tag[n + 1] == '_') return tag + n + 2; return tag; } const char * xsi_type_u(Tnode *typ) { Service *sp; const char *s; if (tflag) return xsi_type(typ); s = xsi_type(typ); for (sp = services; sp; sp = sp->next) if (sp->xsi_type && has_ns_eq(sp->ns, s)) return s; return ""; } const char * xsi_type(Tnode *typ) { if (!typ) return "NULL"; if (is_dynamic_array(typ) && !has_ns(typ) && !is_binary(typ)) return xsi_type_Darray(typ); if (typ->type == Tarray) return xsi_type_Tarray(typ); if ((is_qname(typ) || is_stdqname(typ))) return "xsd:QName"; if (is_untyped(typ)) return ""; if (typ->sym) { if (!strncmp(typ->sym->name, "SOAP_ENV__", 10)) return ""; if (is_XML(typ)) return "xsd:anyType"; if (typ->type != Ttemplate) return ns_convert(typ->sym->name); } if (is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ)) return "xsd:string"; switch(typ->type) { case Tvoid: return "xsd:anyType"; case Tchar: return "xsd:byte"; case Twchar: return "wchar"; case Tshort: return "xsd:short"; case Tint: return "xsd:int"; case Tlong: case Tllong: return "xsd:long"; case Tfloat: return "xsd:float"; case Tdouble: return "xsd:double"; case Tldouble: return "xsd:decimal"; case Tuchar: return "xsd:unsignedByte"; case Tushort: return "xsd:unsignedShort"; case Tuint: return "xsd:unsignedInt"; case Tulong: case Tullong: return "xsd:unsignedLong"; case Ttime: return "xsd:dateTime"; case Tpointer: case Treference: case Trvalueref: return xsi_type((Tnode*)typ->ref); case Tenum: if (is_bool(typ)) return "xsd:boolean"; case Tenumsc: case Tstruct: case Tclass: if (!strncmp(typ->id->name, "SOAP_ENV__", 10)) return ""; return ns_convert(typ->id->name); case Ttemplate: if ((Tnode*)typ->ref) return xsi_type((Tnode*)typ->ref); break; default: break; } return ""; } const char * xml_tag(Tnode *typ) { if (!typ) return "NULL"; if ((typ->type == Tpointer && !is_string(typ) && !is_wstring(typ)) || typ->type == Treference || typ->type == Trvalueref) return xml_tag((Tnode*)typ->ref); if (typ->sym) return ns_convert(typ->sym->name); return the_type(typ); } const char * wsdl_type(Tnode *typ, const char *ns) { if (!typ) return "NULL"; if ((is_qname(typ) || is_stdqname(typ)) && ns) return "xsd:QName"; if (typ->sym) { if (is_XML(typ)) return "xsd:anyType"; else if (ns) return ns_convert(typ->sym->name); else return ns_remove(typ->sym->name); } return base_type(typ, ns); } const char * base_type(Tnode *typ, const char *ns) { int d; const char *s; char *t; if (typ->restriction) { if (ns) return ns_convert(typ->restriction->name); else return ns_remove(typ->restriction->name); } if (is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ) || is_fixedstring(typ)) { if (ns) return "xsd:string"; return "string"; } if (is_dynamic_array(typ) && !is_binary(typ) && !has_ns(typ) && !is_untyped(typ)) { s = ns_remove(wsdl_type(((Table*)typ->ref)->list->info.typ, NULL)); if (ns && *ns) { t = (char*)emalloc(strlen(s)+strlen(ns_convert(ns))+13); strcpy(t, ns_convert(ns)); strcat(t, ":"); strcat(t, "ArrayOf"); } else { t = (char*)emalloc(strlen(s)+12); strcpy(t, "ArrayOf"); } strcat(t, s); d = get_Darraydims(typ); if (d) sprintf(t+strlen(t), "%dD", d); return t; } switch (typ->type) { case Tvoid : if (ns) return "xsd:anyType"; return "anyType"; case Tchar : if (ns) return "xsd:byte"; return "byte"; case Tshort : if (ns) return "xsd:short"; return "short"; case Tint : if (ns) return "xsd:int"; return "int"; case Tlong : case Tllong : if (ns) return "xsd:long"; return "long"; case Tfloat: if (ns) return "xsd:float"; return "float"; case Tdouble: if (ns) return "xsd:double"; return "double"; case Tldouble: if (ns) return "xsd:decimal"; return "decimal"; case Tuchar: if (ns) return "xsd:unsignedByte"; return "unsignedByte"; case Tushort: if (ns) return "xsd:unsignedShort"; return "unsignedShort"; case Tuint: if (ns) return "xsd:unsignedInt"; return "unsignedInt"; case Tulong: case Tullong: if (ns) return "xsd:unsignedLong"; return "unsignedLong"; case Ttime: if (ns) return "xsd:dateTime"; return "dateTime"; case Tpointer: case Treference: case Trvalueref: return wsdl_type((Tnode*)typ->ref, ns); case Tarray: if (is_fixedstring(typ)) { if (typ->sym) { if (ns) return ns_convert(typ->sym->name); return ns_remove(typ->sym->name); } if (ns) return "xsd:string"; return "string"; } if (ns && *ns) { t = (char*)emalloc((strlen(ns_convert(ns))+strlen(c_ident(typ))+2) * sizeof(char)); strcpy(t, ns_convert(ns)); strcat(t, ":"); strcat(t, c_ident(typ)); return t; } else return c_ident(typ); case Tenum: if (is_bool(typ)) { if (ns) return "xsd:boolean"; return "boolean"; } case Tenumsc: case Tstruct: case Tclass: if (!has_ns(typ) && ns && *ns) { t = (char*)emalloc((strlen(ns_convert(ns))+strlen(typ->id->name)+2) * sizeof(char)); strcpy(t, ns_convert(ns)); strcat(t, ":"); strcat(t, ns_convert(typ->id->name)); return t; } else if (ns) return ns_convert(typ->id->name); else return ns_remove(typ->id->name); case Tunion: if (ns) return "xsd:choice"; return "choice"; case Ttemplate: if ((Tnode*)typ->ref) return wsdl_type((Tnode*)typ->ref, ns); break; default: break; } return ""; } const char * the_type(Tnode *typ) { if (!typ) return "NULL"; if (typ->type == Tarray || (is_dynamic_array(typ) && !is_binary(typ) && (eflag || (!has_ns(typ) && !is_untyped(typ))))) return "SOAP-ENC:Array"; if (is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ)) return "string"; switch (typ->type) { case Tchar: return "byte"; case Twchar: return "wchar"; case Tshort: return "short"; case Tint : return "int"; case Tlong : case Tllong : return "long"; case Tfloat: return "float"; case Tdouble: return "double"; case Tldouble: return "decimal"; case Tuchar: return "unsignedByte"; case Tushort: return "unsignedShort"; case Tuint: return "unsignedInt"; case Tulong: case Tullong: return "unsignedLong"; case Ttime: return "dateTime"; case Tpointer: case Treference: case Trvalueref: return the_type((Tnode*)typ->ref); case Tarray: return "SOAP-ENC:Array"; case Tenum: if (is_bool(typ)) return "boolean"; case Tenumsc: case Tstruct: case Tclass: return ns_convert(typ->id->name); default: break; } return ""; } /* c_type returns the type to be used in parameter declaration*/ const char * c_type(Tnode *typ) { char *p = NULL; const char *q, *r; Entry *e; if (typ == NULL) return "NULL"; switch (typ->type) { case Tnone: return ""; case Tvoid: return "void"; case Tchar: return "char"; case Twchar: return "wchar_t"; case Tshort: return "short"; case Tint : return "int"; case Tlong : return "long"; case Tllong : return "LONG64"; case Tfloat: return "float"; case Tdouble: return "double"; case Tldouble: return "long double"; case Tuchar: return "unsigned char"; case Tushort: return "unsigned short"; case Tuint: return "unsigned int"; case Tulong: return "unsigned long"; case Tullong: return "ULONG64"; case Tsize: return "size_t"; case Ttime: return "time_t"; case Tstruct: q = ident(typ->id->name); p = (char*)emalloc((8+strlen(q)) * sizeof(char)); strcpy(p, "struct "); strcat(p, q); return p; case Tclass: return ident(typ->id->name); case Tunion: q = ident(typ->id->name); p = (char*)emalloc((7+strlen(q)) * sizeof(char)); strcpy(p, "union "); strcat(p, q); return p; case Tenum: if (is_bool(typ)) return "bool"; q = ident(typ->id->name); p = (char*)emalloc((6+strlen(q)) * sizeof(char)); strcpy(p, "enum "); strcat(p, q); return p; case Tenumsc: return ident(typ->id->name); case Tpointer: return c_type_id((Tnode*)typ->ref, "*"); case Treference: return c_type_id((Tnode*)typ->ref, "&"); case Trvalueref: return c_type_id((Tnode*)typ->ref, "&&"); case Tarray: return c_type_id((Tnode*)typ->ref, "*"); case Tfun: p = (char*)emalloc(1024); strcpy(p, c_type(((FNinfo*)typ->ref)->ret)); strcat(p, "("); if (((FNinfo*)typ->ref)->args) { for (e = ((FNinfo*)typ->ref)->args->list; e; e = e->next) { strcat(p, c_storage(e->info.sto)); if (e->info.typ->type != Tvoid) { strcat(p, c_type_id(e->info.typ, e->sym->name)); strcat(p, c_init(e)); } else strcat(p, "void"); if (e->next) strcat(p, ", "); } } strcat(p, ")"); return p; case Ttemplate: if (typ->ref) { p = (char*)emalloc((strlen(q = c_type((Tnode*)typ->ref)) + strlen(r = ident(typ->id->name)) + 4) * sizeof(char)); strcpy(p, r); strcat(p, "<"); strcat(p, q); strcat(p, "> "); return p; } default: return "UnknownType"; } return p; } const char * c_storage(Storage sto) { static char buf[256]; buf[0] = '\0'; if (sto & Smutable) strcat(buf, "mutable "); if (sto & Sinline) strcat(buf, "inline "); if (sto & Sfriend) strcat(buf, "friend "); if (sto & Svirtual) strcat(buf, "virtual "); if (sto & Stypedef) strcat(buf, "typedef "); if (sto & Sexplicit) strcat(buf, "explicit "); if (sto & Sstatic) strcat(buf, "static "); if (sto & Sregister) strcat(buf, "register "); if (sto & Sauto) strcat(buf, "auto "); if (sto & Sconstptr) strcat(buf, "const "); if (sto & Sconst) strcat(buf, "const "); return buf; } const char * c_const(Storage sto) { if (sto & Sconst) return "const "; if (sto & Sconstptr) return "const "; return ""; } const char * c_init(Entry *e) { return c_init_a(e, " = "); } const char * c_init_a(Entry *e, const char *a) { static char buf[8196]; buf[0] = '\0'; if (e && (e->info.hasval || e->info.ptrval)) { Tnode *p = e->info.typ; if (e->info.ptrval) p = p->ref; switch (p->type) { case Tchar: case Twchar: case Tuchar: case Tshort: case Tushort: case Tint: case Tuint: case Ttime: case Tsize: sprintf(buf, "%s" SOAP_LONG_FORMAT, a, e->info.val.i); break; case Tlong: sprintf(buf, "%s" SOAP_LONG_FORMAT "L", a, e->info.val.i); break; case Tulong: sprintf(buf, "%s" SOAP_LONG_FORMAT "UL", a, e->info.val.i); break; case Tllong: sprintf(buf, "%s" SOAP_LONG_FORMAT "LL", a, e->info.val.i); break; case Tullong: sprintf(buf, "%s" SOAP_LONG_FORMAT "ULL", a, e->info.val.i); break; case Tfloat: case Tdouble: sprintf(buf, "%s%g", a, e->info.val.r); break; case Tldouble: sprintf(buf, "%s%gL", a, e->info.val.r); break; case Tenum: case Tenumsc: if (e->info.val.i <= 0x7FFFLL && e->info.val.i >= -0x8000LL) sprintf(buf, "%s(%s)" SOAP_LONG_FORMAT, a, c_type(p), e->info.val.i); else sprintf(buf, "%s(%s)" SOAP_LONG_FORMAT "LL", a, c_type(p), e->info.val.i); break; default: if (is_stdstring(p) && e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-6) sprintf(buf, "%s\"%s\"", a, cstring(e->info.val.s, 0)); else if (is_stdwstring(p) && e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-7) sprintf(buf, "%sL\"%s\"", a, cstring(e->info.val.s, 0)); else if (is_wstring(p) && e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-17) sprintf(buf, "%s(wchar_t*)L\"%s\"", a, cstring(e->info.val.s, 0)); else if (e->info.val.s && strlen(e->info.val.s) < sizeof(buf)-13) sprintf(buf, "%s(char*)\"%s\"", a, cstring(e->info.val.s, 0)); else if (p->type == Tpointer) sprintf(buf, "%sNULL", a); break; } } return buf; } /* c_type_constptr_id returns the const* type to be used in parameter declaration */ const char * c_type_constptr_id(Tnode *typ, const char *name) { return c_type_id(typ, name); } /* c_type_id returns the type to be used in parameter declaration */ const char * c_type_id(Tnode *typ, const char *name) { const char *id; char *p = NULL; const char *q; char tempBuf[10]; Tnode *temp; Entry *e; if (!typ) return "NULL"; id = ident(name); switch (typ->type) { case Tnone: return id; case Tvoid: p = (char*)emalloc(6+strlen(id)); strcpy(p, "void "); strcat(p, id); break; case Tchar: p = (char*)emalloc(6+strlen(id)); strcpy(p, "char "); strcat(p, id); break; case Twchar: p = (char*)emalloc(9+strlen(id)); strcpy(p, "wchar_t "); strcat(p, id); break; case Tshort: p = (char*)emalloc(7+strlen(id)); strcpy(p, "short "); strcat(p, id); break; case Tint : p = (char*)emalloc(5+strlen(id)); strcpy(p, "int "); strcat(p, id); break; case Tlong : p = (char*)emalloc(6+strlen(id)); strcpy(p, "long "); strcat(p, id); break; case Tllong : p = (char*)emalloc(8+strlen(id)); strcpy(p, "LONG64 "); strcat(p, id); break; case Tfloat: p = (char*)emalloc(7+strlen(id)); strcpy(p, "float "); strcat(p, id); break; case Tdouble: p = (char*)emalloc(8+strlen(id)); strcpy(p, "double "); strcat(p, id); break; case Tldouble: p = (char*)emalloc(13+strlen(id)); strcpy(p, "long double "); strcat(p, id); break; case Tuchar: p = (char*)emalloc(15+strlen(id)); strcpy(p, "unsigned char "); strcat(p, id); break; case Tushort: p = (char*)emalloc(16+strlen(id)); strcpy(p, "unsigned short "); strcat(p, id); break; case Tuint: p = (char*)emalloc(14+strlen(id)); strcpy(p, "unsigned int "); strcat(p, id); break; case Tulong: p = (char*)emalloc(15+strlen(id)); strcpy(p, "unsigned long "); strcat(p, id); break; case Tullong: p = (char*)emalloc(9+strlen(id)); strcpy(p, "ULONG64 "); strcat(p, id); break; case Tsize: p = (char*)emalloc(8+strlen(id)); strcpy(p, "size_t "); strcat(p, id); break; case Ttime: p = (char*)emalloc(8+strlen(id)); strcpy(p, "time_t "); strcat(p, id); break; case Tstruct: q = ident(typ->id->name); p = (char*)emalloc((9+strlen(q)+strlen(id)) * sizeof(char)); strcpy(p, "struct "); strcat(p, q); strcat(p, " "); strcat(p, id); break; case Tclass: q = ident(typ->id->name); p = (char*)emalloc((2+strlen(q)+strlen(id)) * sizeof(char)); strcpy(p, q); strcat(p, " "); strcat(p, id); break; case Tunion: q = ident(typ->id->name); p = (char*)emalloc((8+strlen(q)+strlen(id)) * sizeof(char)); strcpy(p, "union "); strcat(p, q); strcat(p, " "); strcat(p, id); break; case Tenum: if (is_bool(typ)) { p = (char*)emalloc((strlen(id)+6)* sizeof(char)); strcpy(p, "bool "); strcat(p, id); return p; } q = ident(typ->id->name); p = (char*)emalloc((7+strlen(q)+strlen(id)) * sizeof(char)); strcpy(p, "enum "); strcat(p, q); strcat(p, " "); strcat(p, id); break; case Tenumsc: q = ident(typ->id->name); p = (char*)emalloc((7+strlen(q)+strlen(id)) * sizeof(char)); strcpy(p, q); strcat(p, " "); strcat(p, id); break; case Tpointer: p = (char*)emalloc(strlen(id)+2); p[0] = '*'; strcpy(p+1, id); return c_type_id((Tnode*)typ->ref, p); case Treference: p = (char*)emalloc(strlen(id)+2); p[0] = '&'; strcpy(p+1, id); return c_type_id((Tnode*)typ->ref, p); case Trvalueref: p = (char*)emalloc(strlen(id)+3); p[0] = '&'; p[1] = '&'; strcpy(p+2, id); return c_type_id((Tnode*)typ->ref, p); case Tarray: temp = typ; while (((Tnode*) (typ->ref))->type == Tarray) typ = (Tnode*)typ->ref; p = (char*)emalloc((12+strlen(q = c_type_id((Tnode*)typ->ref, id))) * sizeof(char)); strcpy(p, q); typ = temp; while (typ->type == Tarray) { if (((Tnode*) typ->ref)->width) { sprintf(tempBuf, "[%d]", (typ->width / ((Tnode*) typ->ref)->width)); strcat(p, tempBuf); } typ = (Tnode*)typ->ref; } break; case Tfun: if (id && strncmp(id, "operator ", 9)) q = c_type_id(((FNinfo*)typ->ref)->ret, id); else q = id; p = (char*)emalloc(1024); if (q) strcpy(p, q); strcat(p, "("); for (e = ((FNinfo*)typ->ref)->args->list; e; e = e->next) { strcat(p, c_storage(e->info.sto)); if (e->info.typ->type != Tvoid) { strcat(p, c_type_id(e->info.typ, e->sym->name)); strcat(p, c_init(e)); } else strcat(p, "void"); if (e->next) strcat(p, ", "); } strcat(p, ")"); break; case Ttemplate: if (typ->ref) { p = (char*)emalloc((strlen(q = c_type((Tnode*)typ->ref))+strlen(ident(typ->id->name))+strlen(id)+4) * sizeof(char)); strcpy(p, ident(typ->id->name)); strcat(p, "<"); strcat(p, q); strcat(p, "> "); strcat(p, id); break; } default: return "UnknownType"; } return p; } const char * c_type_sym(Tnode *typ) { if (typ->sym) return ident(typ->sym->name); return c_type(typ); } /* c_type_synonym_id returns the typedef synonym name as a type (if present) to be used in parameter declaration */ const char * c_type_synonym_id(Tnode *typ, const char *name) { if (typ->synonym) { const char *synonym = ident(typ->synonym->name); const char *id = ident(name); char *p = (char*)emalloc(strlen(synonym) + strlen(id) + 2); strcpy(p, synonym); strcat(p, " "); strcat(p, id); return p; } return c_type_id(typ, name); } const char * xsi_type_Tarray(Tnode *typ) { Tnode *t; int cardinality; char *p; const char *s; t = (Tnode*)typ->ref; if (is_fixedstring(typ)) { if (typ->sym) return ns_convert(typ->sym->name); return "xsd:string"; } cardinality = 1; while (t->type == Tarray || (is_dynamic_array(t) && !has_ns(t) && !is_untyped(t) && !is_binary(t))) { if (t->type == Tarray) t = (Tnode*)t->ref; else t = (Tnode*)((Table*)t->ref)->list->info.typ->ref; cardinality++; } s = xsi_type(t); if (!*s) s = wsdl_type(t, ""); p = (char*)emalloc(strlen(s)+cardinality+3); strcpy(p, s); if (cardinality > 1) { strcat(p, "["); for (; cardinality > 2; cardinality--) strcat(p, ", "); strcat(p, "]"); } return p; } const char * xsi_type_Darray(Tnode *typ) { Tnode *t; int cardinality; char *p; const char *s; Entry *q; if (!typ->ref) return ""; q = ((Table*)typ->ref)->list; while (q && q->info.typ->type == Tfun) q = q->next; t = (Tnode*)q->info.typ->ref; cardinality = 1; while (t->type == Tarray || (is_dynamic_array(t) && !has_ns(t) && !is_untyped(t) && !is_binary(t))) { if (t->type == Tarray) t = (Tnode*)t->ref; else { q = ((Table*)t->ref)->list; while (q && q->info.typ->type == Tfun) q = q->next; t = (Tnode*)q->info.typ->ref; } cardinality++; } s = xsi_type(t); if (!*s) s = wsdl_type(t, ""); p = (char*)emalloc(strlen(s)+cardinality*2+1); strcpy(p, s); if (cardinality > 1) { strcat(p, "["); for (; cardinality > 2; cardinality--) strcat(p, ", "); strcat(p, "]"); } return p; } void generate_type(Tnode *typ) { if (is_transient(typ) || typ->type == Twchar || is_void(typ)) return; if (lflag && typ->type == Tint && !typ->sym) { fprintf(fhead, "\n\n#ifndef %s_DEFINED", soap_type(typ)); fprintf(fhead, "\n#define %s_DEFINED", soap_type(typ)); fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_int(struct soap*, int*);"); fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_int(struct soap*, const char*, int, const int*, const char*);"); fprintf(fhead, "\nSOAP_FMAC1 int* SOAP_FMAC2 soap_in_int(struct soap*, const char*, int*, const char*);"); fprintf(fhead, "\n#endif"); return; /* do not generate int serializers in libs */ } else if (is_imported(typ) && (typ->type != Tint || typ->sym)) { return; } if (is_typedef(typ) && (is_element(typ) || is_synonym(typ))) fprintf(fhead, "\n/* %s is a typedef synonym of %s */", c_ident(typ), t_ident(typ)); else if (is_typedef(typ) && (is_element(typ) || is_restriction(typ))) fprintf(fhead, "\n/* %s is a typedef restriction of %s */", c_ident(typ), t_ident(typ)); if (is_primitive(typ) || is_string(typ) || is_wstring(typ)) { if (!Qflag && is_external(typ) && namespaceid) { const char *id = namespaceid; namespaceid = NULL; fprintf(fhead, "\n\n#ifndef %s_DEFINED", soap_type(typ)); fprintf(fhead, "\n#define %s_DEFINED", soap_type(typ)); namespaceid = id; fprintf(fhead, "\n\n}"); fprintf(fout, "\n\n}"); } else { fprintf(fhead, "\n\n#ifndef %s_DEFINED", soap_type(typ)); fprintf(fhead, "\n#define %s_DEFINED", soap_type(typ)); } fflush(fhead); soap_default(typ); soap_serialize(typ); if (Etflag) soap_traverse(typ); soap_out(typ); soap_in(typ); if (!Qflag && is_external(typ) && namespaceid) { fprintf(fhead, "\n\nnamespace %s {", namespaceid); fprintf(fout, "\n\nnamespace %s {", namespaceid); } if (is_string(typ) || is_wstring(typ)) { soap_dup(typ); soap_del(typ); } soap_instantiate(typ); soap_put(typ); soap_get(typ); fprintf(fhead, "\n#endif"); return; } switch(typ->type) { case Ttemplate: case Tpointer: case Tarray: case Tstruct: case Tclass: case Tunion: if (is_header_or_fault(typ) || is_body(typ)) { fprintf(fhead, "\n\n#ifndef WITH_NOGLOBAL"); fprintf(fout, "\n\n#ifndef WITH_NOGLOBAL"); } if (!Qflag && is_external(typ) && namespaceid) { const char *id = namespaceid; namespaceid = NULL; fprintf(fhead, "\n\n#ifndef %s_DEFINED", soap_type(typ)); fprintf(fhead, "\n#define %s_DEFINED", soap_type(typ)); namespaceid = id; fprintf(fhead, "\n\n}"); fprintf(fout, "\n\n}"); } else { fprintf(fhead, "\n\n#ifndef %s_DEFINED", soap_type(typ)); fprintf(fhead, "\n#define %s_DEFINED", soap_type(typ)); } fflush(fhead); soap_default(typ); soap_serialize(typ); if (Etflag) soap_traverse(typ); soap_out(typ); soap_in(typ); if (!Qflag && is_external(typ) && namespaceid) { fprintf(fhead, "\n\nnamespace %s {", namespaceid); fprintf(fout, "\n\nnamespace %s {", namespaceid); } soap_dup(typ); soap_del(typ); soap_instantiate(typ); soap_put(typ); soap_get(typ); fprintf(fhead, "\n#endif"); if (is_header_or_fault(typ) || is_body(typ)) { fprintf(fhead, "\n\n#endif"); fprintf(fout, "\n\n#endif"); } break; default: break; } } void matlab_gen_sparseStruct(void) { fprintf(fmheader, "\nstruct soapSparseArray{\n"); fprintf(fmheader, " int *ir;\n"); fprintf(fmheader, " int *jc;\n"); fprintf(fmheader, " double *pr;\n"); fprintf(fmheader, " int num_columns;\n"); fprintf(fmheader, " int num_rows;\n"); fprintf(fmheader, " int nzmax;\n"); fprintf(fmheader, "};\n"); } void matlab_c_to_mx_sparse(void) { fprintf(fmheader, "\nmxArray* c_to_mx_soapSparseArray(struct soapSparseArray);\n"); fprintf(fmatlab, "\nmxArray* c_to_mx_soapSparseArray(struct soapSparseArray a)\n"); fprintf(fmatlab, "{\n"); fprintf(fmatlab, " mxArray *b;\n"); fprintf(fmatlab, " b = mxCreateSparse(a.num_rows, a.num_columns, a.nzmax, mxREAL);\n"); fprintf(fmatlab, " mxSetIr(b,a.ir);\n"); fprintf(fmatlab, " mxSetJc(b,a.jc);\n"); fprintf(fmatlab, " mxSetPr(b,a.pr);\n"); fprintf(fmatlab, " return b;\n"); fprintf(fmatlab, "}\n"); } void matlab_mx_to_c_sparse(void) { fprintf(fmheader, "\nmxArray* mx_to_c_soapSparseArray(const mxArray *, struct soapSparseArray *);\n"); fprintf(fmatlab, "\nmxArray* mx_to_c_soapSparseArray(const mxArray *a, struct soapSparseArray *b)\n"); fprintf(fmatlab, "{\n"); fprintf(fmatlab, " if (!mxIsSparse(a))\n"); fprintf(fmatlab, " {\n"); fprintf(fmatlab, " mexErrMsgTxt(\"Input should be a sparse array.\");\n"); fprintf(fmatlab, " }\n"); fprintf(fmatlab, " /* Get the starting positions of the data in the sparse array. */ \n"); fprintf(fmatlab, " b->pr = mxGetPr(a);\n"); fprintf(fmatlab, " b->ir = mxGetIr(a);\n"); fprintf(fmatlab, " b->jc = mxGetJc(a);\n"); fprintf(fmatlab, " b->num_columns = mxGetN(a);\n"); fprintf(fmatlab, " b->num_rows = mxGetM(a);\n"); fprintf(fmatlab, " b->nzmax = mxGetNzmax(a);\n"); fprintf(fmatlab, "}\n"); } void matlab_mx_to_c_dynamicArray(Tnode* typ) { int d; Entry *p; p = is_dynamic_array(typ); fprintf(fmatlab, "{\n"); fprintf(fmatlab, "\tint i, numdims;\n"); fprintf(fmatlab, "\tconst int *dims;\n"); fprintf(fmatlab, "\tdouble *temp;\n"); fprintf(fmatlab, "\tint size = 1;\n"); fprintf(fmatlab, "\tint ret;\n"); fprintf(fmatlab, "\tnumdims = mxGetNumberOfDimensions(a);\n"); fprintf(fmatlab, "\tdims = mxGetDimensions(a);\n"); d = get_Darraydims(typ); fprintf(fmatlab, "\tif (numdims != %d)\n", d); fprintf(fmatlab, "\t\tmexErrMsgTxt(\"Incompatible array specifications in C and mx.\");\n"); /* fprintf(fmatlab, "\tfor (i=0;i__size[i] = dims[i];\n"); fprintf(fmatlab, "\t}\n"); */ if ((((Tnode *)p->info.typ->ref)->type != Tchar) && (((Tnode *)p->info.typ->ref)->type != Tuchar)) { fprintf(fmatlab, "\ttemp = (double*)mxGetPr(a);\n"); fprintf(fmatlab, "\tif (!temp)\n\t\tmexErrMsgTxt(\"mx_to_c_ArrayOfdouble: Pointer to data is NULL\");\n"); } fprintf(fmatlab, "\tfor (i = 0; i < numdims; i++) {\n"); fprintf(fmatlab, "\t\tif (b->__size[i] < dims[i])\n"); fprintf(fmatlab, "\t\t\tmexErrMsgTxt(\"Incompatible array dimensions in C and mx.\");\n"); fprintf(fmatlab, "\t\tsize *= dims[i];\n"); fprintf(fmatlab, "\t}\n"); if ((((Tnode *)p->info.typ->ref)->type != Tchar) && (((Tnode *)p->info.typ->ref)->type != Tuchar)) { fprintf(fmatlab, "\tfor (i = 0; i < size; i++)\n"); fprintf(fmatlab, "\t\tb->__ptr[i] = (%s)*temp++;\n", c_type((Tnode*)p->info.typ->ref)); } else { fprintf(fmatlab, "\tret = mxGetString(a, b->__ptr, size + 1);\n"); fprintf(fmatlab, "\tmexPrintf(\"ret = %%d, b->__ptr = %%s, size = %%d\", ret, b->__ptr, size);\n"); } fprintf(fmatlab, "\n}\n"); fflush(fmatlab); } void matlab_c_to_mx_dynamicArray(Tnode* typ) { int d, i; Entry *p; p = is_dynamic_array(typ); fprintf(fmatlab, "{\n"); fprintf(fmatlab, "\tmxArray *out;\n"); fprintf(fmatlab, "\t%s;\n", c_type_id((Tnode*)p->info.typ->ref, "*temp")); d = get_Darraydims(typ); fprintf(fmatlab, "\tint i;\n"); fprintf(fmatlab, "\tint ndim = %d, dims[%d] = {", d, d); for (i = 0; i < d; i++) { if (i == 0) fprintf(fmatlab, "a.__size[%d]", i); else fprintf(fmatlab, ", a.__size[%d]", i); } fprintf(fmatlab, "};\n"); fprintf(fmatlab, "\tint size = "); for (i = 0; i < d; i++) { if (i == 0) fprintf(fmatlab, "dims[%d]", i); else fprintf(fmatlab, "*dims[%d]", i); } fprintf(fmatlab, ";\n"); if ((((Tnode *)p->info.typ->ref)->type != Tchar) && (((Tnode *)p->info.typ->ref)->type != Tuchar)) { fprintf(fmatlab, "\tout = mxCreateNumericArray(ndim, dims, %s, mxREAL);\n", get_mxClassID((Tnode*)p->info.typ->ref)); fprintf(fmatlab, "\tif (!out)\n\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); fprintf(fmatlab, "\ttemp = (%s) mxGetPr(out);\n", c_type_id((Tnode*)p->info.typ->ref, "*")); fprintf(fmatlab, "\tif (!temp)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Pointer to data is NULL\");\n"); fprintf(fmatlab, "\tfor (i = 0; i < size; i++)\n"); fprintf(fmatlab, "\t\t*temp++ = a.__ptr[i];\n"); } else { fprintf(fmatlab, "\tout = mxCreateString(a.__ptr);\n"); fprintf(fmatlab, "\tif (!out)\n\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); } fprintf(fmatlab, "\treturn out;\n}\n"); fflush(fmatlab); } const char* get_mxClassID(Tnode* typ) { switch(typ->type) { case Tdouble: return "mxDOUBLE_CLASS"; case Tfloat: return "mxSINGLE_CLASS"; case Tshort: return "mxINT16_CLASS"; case Tushort: return "mxUINT16_CLASS"; case Tint: return "mxINT32_CLASS"; case Tuint: return "mxUINT32_CLASS"; case Tlong: return "mxINT32_CLASS"; case Tulong: return "mxUINT32_CLASS"; case Tllong: return "mxINT64_CLASS"; case Tullong: return "mxUINT64_CLASS"; case Tchar: return "mxCHAR_CLASS"; case Tuchar: return "mxCHAR_CLASS"; default: return ""; } } /*Function not in use.*/ void matlab_array_c_to_mx(Tnode* typ) { Tnode* temp; int d, i; fprintf(fmatlab, "{\n\tint rows, r, cols, c;\n"); fprintf(fmatlab, "\tmxArray* out;\n"); fprintf(fmatlab, "\tdouble* temp;\n"); d = get_dimension(typ); fprintf(fmatlab, "\tint ndim = %d, dims[%d] = {", d, d); temp=typ; for (i = 0; i < d; i++) { if (i == 0) fprintf(fmatlab, "%d", temp->width / ((Tnode*) temp->ref)->width); else fprintf(fmatlab, ", %d", temp->width / ((Tnode*) temp->ref)->width); temp=(Tnode*)typ->ref; } fprintf(fmatlab, "};\n"); fprintf(fmatlab, "\tout = mxCreateNumericArray(ndim, dims, mxDOUBLE_CLASS, mxREAL);\n"); fprintf(fmatlab, "\ttemp = (double *) mxGetPr(out);\n"); fprintf(fmatlab, "\tif (!out)\n\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); fprintf(fmatlab, "\tif (!temp)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Pointer to data is NULL\");\n"); fprintf(fmatlab, "\trows = mxGetM(out);\n"); fprintf(fmatlab, "\tif (!rows)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Data has zero rows\");\n"); fprintf(fmatlab, "\tcols = mxGetN(out);\n"); fprintf(fmatlab, "\tif (!cols)\n\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Data has zero columns\");\n"); fprintf(fmatlab, "\tfor (c = 0; c < cols; c++)\n"); fprintf(fmatlab, "\t\tfor (r = 0; r < rows; r++)\n"); fprintf(fmatlab, "\t\t\t*temp++ = z->a[r][c];\n"); fprintf(fmatlab, "\treturn out;\n}\n"); fflush(fmatlab); } void matlab_c_to_mx_pointer(Tnode* typ) { if (!typ->ref) return; fprintf(fmheader, "\nmxArray* c_to_mx_%s(%s);\n", c_ident(typ), c_type_id(typ, "")); fprintf(fmatlab, "\nmxArray* c_to_mx_%s(%s)\n", c_ident(typ), c_type_id(typ, "a")); fprintf(fmatlab, "{\n"); fprintf(fmatlab, "\tmxArray *fout;\n"); fprintf(fmatlab, "\tfout = c_to_mx_%s(*a);\n", c_ident((Tnode*)typ->ref)); fprintf(fmatlab, "\treturn fout;\n"); fprintf(fmatlab, "}\n"); } void matlab_mx_to_c_pointer(Tnode* typ) { if (!typ->ref) return; fprintf(fmheader, "\nvoid mx_to_c_%s(const mxArray*, %s);\n", c_ident(typ), c_type_id(typ, "*")); fprintf(fmatlab, "\nvoid mx_to_c_%s(const mxArray* a, %s)\n", c_ident(typ), c_type_id(typ, "*b")); fprintf(fmatlab, "{\n\tmx_to_c_%s(a, *b);\n", c_ident((Tnode*)typ->ref)); fprintf(fmatlab, "\n}\n"); } void func2(Tnode* typ) { Table *table, *t; Entry *p; fprintf(fmatlab, "\tif (!mxIsStruct(a))\n\t\tmexErrMsgTxt(\"Input must be a structure.\");\n"); table=(Table*)typ->ref; for (t = table; t != (Table*)0; t = t->prev) { for (p = t->list; p != (Entry*)0; p = p->next) { if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) { fprintf(fmatlab, "\t{mxArray *tmp = mxGetField(a, 0, \"%s\");\n", ident(p->sym->name)); fprintf(fmatlab, "\tif (!tmp) {\n"); fprintf(fmatlab, "\t\tmexErrMsgTxt(\"Above member field is empty!\");\n\t}\n"); fprintf(fmatlab, "\tmx_to_c_%s(tmp, &b->%s);}\n", c_ident(p->info.typ), ident(p->sym->name)); } } } } void matlab_mx_to_c_struct(Tnode* typ) { if (!typ->ref) return; if (is_dynamic_array(typ)) { fprintf(fmheader, "\nvoid mx_to_c_%s(const mxArray*, %s);\n", c_ident(typ), c_type_id(typ, "*")); fprintf(fmatlab, "\nvoid mx_to_c_%s(const mxArray* a, %s)\n", c_ident(typ), c_type_id(typ, "*b")); matlab_mx_to_c_dynamicArray(typ); return; } else if (strstr(c_type_id(typ, ""), "soapSparseArray")) { return; } fprintf(fmheader, "\nvoid mx_to_c_%s(const mxArray*, %s);\n", c_ident(typ), c_type_id(typ, "*")); fprintf(fmatlab, "\nvoid mx_to_c_%s(const mxArray* a, %s)\n", c_ident(typ), c_type_id(typ, "*b")); fprintf(fmatlab, "{\n"); func2(typ); fprintf(fmatlab, "\n}\n"); return; } void matlab_c_to_mx_struct(Tnode* typ) { Table *table, *t; Entry *p; int number_of_fields=0; if (!typ->ref) return; if (is_dynamic_array(typ)) { fprintf(fmheader, "\nmxArray* c_to_mx_%s(%s);\n", c_ident(typ), c_type_id(typ, "")); fprintf(fmatlab, "\nmxArray* c_to_mx_%s(%s)\n", c_ident(typ), c_type_id(typ, "a")); matlab_c_to_mx_dynamicArray(typ); return; } else if (strstr(c_type_id(typ, ""), "soapSparseArray")) return; fprintf(fmheader, "\nmxArray* c_to_mx_%s(%s);\n", c_ident(typ), c_type_id(typ, "")); fprintf(fmatlab, "\nmxArray* c_to_mx_%s(%s)\n", c_ident(typ), c_type_id(typ, "a")); table=(Table*)typ->ref; fprintf(fmatlab, "{\n\tconst char* fnames[] = {"); for (t = table; t != (Table*)0; t = t->prev) { for (p = t->list; p != (Entry*)0; p = p->next) { if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) { if (number_of_fields) fprintf(fmatlab, ", \"%s\"", ident(p->sym->name)); else fprintf(fmatlab, "\"%s\"", ident(p->sym->name)); number_of_fields++; } } } fprintf(fmatlab, "}; /* pointers to member field names */\n"); fprintf(fmatlab, "\tint rows = 1, cols = 1;\n\tint index = 0;\n\tint number_of_fields = %d;\n\tmxArray *struct_array_ptr;\n", number_of_fields); fprintf(fmatlab, "\t/* Create a 1x1 struct matrix for output */\n"); fprintf(fmatlab, "\tstruct_array_ptr = mxCreateStructMatrix(rows, cols, number_of_fields, fnames);\n\tmexPrintf(\"6\");\n\tif (struct_array_ptr == NULL) {\n\t\tmexPrintf(\"COULDNT CREATE A MATRIX\");}\n\tmexPrintf(\"7\");\n"); for (t = table; t != (Table*)0; t = t->prev) { for (p = t->list; p != (Entry*)0; p = p->next) { if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) { fprintf(fmatlab, "\t{mxArray *fout = c_to_mx_%s(a.%s);\n", c_ident(p->info.typ), ident(p->sym->name)); fprintf(fmatlab, "\tmxSetField(struct_array_ptr, index, \"%s\" , fout);}\n", ident(p->sym->name)); } } } fprintf(fmatlab, "\treturn struct_array_ptr;\n}\n"); } void matlab_c_to_mx_primitive(Tnode *typ) { fprintf(fmheader, "\nmxArray* c_to_mx_%s(%s);", c_ident(typ), c_type_id(typ, "")); fprintf(fmatlab, "\nmxArray* c_to_mx_%s(%s)\n", c_ident(typ), c_type_id(typ, "a")); fprintf(fmatlab, "{\n\tmxArray *fout;\n"); if ((typ->type == Tchar) || (typ->type == Tuchar)) { fprintf(fmatlab, "\tchar buf[2];\n"); fprintf(fmatlab, "\tbuf[0] = a;\n"); fprintf(fmatlab, "\tbuf[1] = \'\\0\';\n"); fprintf(fmatlab, "\tfout = mxCreateString(buf);\n"); fprintf(fmatlab, "\tif (!fout)\n"); fprintf(fmatlab, "\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); } else { fprintf(fmatlab, "\tint ndim = 1, dims[1] = {1};\n"); fprintf(fmatlab, "\tfout = mxCreateNumericArray(ndim, dims, %s, mxREAL);\n", get_mxClassID(typ)); fprintf(fmatlab, "\t%s = (%s)mxGetPr(fout);\n", c_type_id(typ, "*temp"), c_type_id(typ, "*")); fprintf(fmatlab, "\tif (!fout)\n"); fprintf(fmatlab, "\t\tmexErrMsgTxt(\"Could not create mxArray.\");\n"); fprintf(fmatlab, "\tif (!temp) \n"); fprintf(fmatlab, "\t\tmexErrMsgTxt(\"matlab_array_c_to_mx: Pointer to data is NULL\");\n"); fprintf(fmatlab, "\t*temp++= a;\n"); } fprintf(fmatlab, "\treturn fout;\n}\n"); } void matlab_mx_to_c_primitive(Tnode *typ) { fprintf(fmheader, "\nvoid mx_to_c_%s(const mxArray *, %s);\n", c_ident(typ), c_type_id(typ, "*")); fprintf(fmatlab, "\nvoid mx_to_c_%s(const mxArray *a, %s)\n", c_ident(typ), c_type_id(typ, "*b")); if ((typ->type == Tchar) || (typ->type == Tuchar)) { fprintf(fmatlab, "{\n\tint ret;\n"); fprintf(fmatlab, "\tchar buf[2];\n"); fprintf(fmatlab, "\tret = mxGetString(a, buf, 2);\n"); fprintf(fmatlab, "\tmexPrintf(\"ret = %%d, buf = %%s\", ret, buf);\n"); fprintf(fmatlab, "\t*b = buf[0];\n"); } else { fprintf(fmatlab, "{\n\tdouble* data = (double*)mxGetData(a);\n"); fprintf(fmatlab, "\t*b = (%s)*data;\n", c_type(typ)); } fprintf(fmatlab, "\n}\n"); } void matlab_out_generate(Tnode *typ) { if (is_transient(typ) || typ->type == Twchar || is_XML(typ)) return; /* typeNO++; if (typeNO>=1024) execerror("Too many user-defined data types"); */ if (is_primitive(typ)) { matlab_c_to_mx_primitive(typ); matlab_mx_to_c_primitive(typ); return; } switch(typ->type) { case Tstruct: matlab_c_to_mx_struct(typ); matlab_mx_to_c_struct(typ); break; case Tpointer: matlab_c_to_mx_pointer(typ); matlab_mx_to_c_pointer(typ); break; default: break; } } /*his function is called first it first generates all routines and then in the second pass calls all routines to generate matlab_out for the table*/ void func1(Table *table, Entry *param) { Entry *q, *pout, *response=NULL; q = entry(table, param->sym); if (q) { pout = (Entry*)q->info.typ->ref; } else { fprintf(stderr, "Internal error: no table entry\n"); return; } q = entry(classtable, param->sym); if (!is_response(pout->info.typ)) { response = get_response(param->info.typ); } fprintf(fmheader, "\n\toutside loop struct %s soap_tmp_%s;", param->sym->name, param->sym->name); if (!is_response(pout->info.typ) && response) { fprintf(fmheader, "\n\tif..inside loop struct %s *soap_tmp_%s;", c_ident(response->info.typ), c_ident(response->info.typ)); } fflush(fmheader); } void matlab_def_table(Table *table) { Entry *q, *pout, *e, *response=NULL; int i; Tnode *p; /* for (q1 = table->list; q1 != (Entry*) 0; q1 = q1->next) if (q1->info.typ->type == Tfun) func1(table, q1); */ /* Sparse matrix code will be present by default */ matlab_gen_sparseStruct(); matlab_c_to_mx_sparse(); matlab_mx_to_c_sparse(); for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p != (Tnode*)0 ; p = p->next) { /* This is generated for everything declared in the ".h" file. To make sure that it doesnt get generated for functions do a comparison with p->sym->name, so that its not generated for functions. */ if (is_XML(p)) continue; if (strstr(c_ident(p), "SOAP_ENV_") != NULL) continue; for (q = table->list; q != (Entry*) 0; q = q->next) { if (strcmp(c_ident(p), q->sym->name) == 0) break; e=entry(table, q->sym); if (e) pout = (Entry*)e->info.typ->ref; else { fprintf(stderr, "Internal error: no table entry\n"); return; } if (!is_response(pout->info.typ)) { response = get_response(q->info.typ); } if (!is_response(pout->info.typ) && response) { if (strcmp(c_ident(p), c_ident(response->info.typ)) == 0) break; } } if (q == (Entry*) 0) matlab_out_generate(p); } } } void detect_cycles(void) { Tnode *p; for (p = Tptr[Tclass]; p; p = p->next) detect_recursive_type(p); for (p = Tptr[Tstruct]; p; p = p->next) detect_recursive_type(p); } void detect_recursive_type(Tnode *p) { if (is_transient(p)) return; if (p->type == Tclass || p->type == Tstruct || p->type == Tunion) { if (p->visited == Unexplored) { Table *t; Entry *e, *b = NULL; Tnode *q; p->visited = Hot; if ((p->type == Tclass || p->type == Tstruct) && p->base) { q = p; while (q->base) { b = entry(classtable, q->base); if (!b) break; q = b->info.typ; if (q->visited == Unexplored) detect_recursive_type(q); if (q->recursive) { p->recursive = True; break; } q->visited = Hot; } } if (!p->recursive) for (t = (Table*)p->ref; t; t = t->prev) for (e = t->list; e; e = e->next) detect_recursive_type(e->info.typ); if ((p->type == Tclass || p->type == Tstruct) && p->base) { q = p; while (q->base) { b = entry(classtable, q->base); if (!b) break; q = b->info.typ; if (q->recursive) p->recursive = True; q->visited = Cold; } } p->visited = Cold; } else if (p->visited == Hot) { p->recursive = True; } } else if (p->type == Tpointer || p->type == Treference || p->type == Trvalueref || p->type == Tarray || p->type == Ttemplate) { detect_recursive_type(p->ref); } } void generate_defs(void) { int i; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (!p->generated && !is_transient(p) && p->type != Twchar && !is_void(p)) { p->generated = True; generate_type(p); if (fflag) if (--partnum == 0) return; } } } } int no_of_var(Tnode *typ) { Entry *p; Table *t; int i=0; if (typ->type == Tstruct || typ->type == Tclass) { t = (Table*)typ->ref; for (p = t->list; p != (Entry*) 0; p = p->next) { if (p->info.typ->type == Tpointer) i++; } } if ((((Tnode *)(typ->ref))->type == Tstruct) || (((Tnode *)(typ->ref))->type == Tclass) ) { t = (Table*)((Tnode*)(typ->ref))->ref; for (p = t->list; p != (Entry*) 0; p = p->next) { if (p->info.typ->type == Tpointer) i++; } } return i; } void in_defs(void) { int i; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (!is_element(p) && !is_transient(p) && p->type != Twchar && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion && !is_XML(p) && !is_header_or_fault(p) && !is_body(p) && !is_template(p)) { const char *s = xsi_type(p); if (!*s) s = wsdl_type(p, ""); if (*s == '-') continue; if (is_string(p)) fprintf(fout, "\n\tcase %s:\n\t{\tchar **s;\n\t\ts = soap_in_%s(soap, tag, NULL, \"%s\");\n\t\treturn s ? *s : NULL;\n\t}", soap_type(p), c_ident(p), s); else if (is_wstring(p)) fprintf(fout, "\n\tcase %s:\n\t{\twchar_t **s;\n\t\ts = soap_in_%s(soap, tag, NULL, \"%s\");\n\t\treturn s ? *s : NULL;\n\t}", soap_type(p), c_ident(p), s); else fprintf(fout, "\n\tcase %s:\n\t\treturn soap_in_%s(soap, tag, NULL, \"%s\");", soap_type(p), c_ident(p), s); } } } } void in_defs2(void) { int i, j; Tnode *p; const char *s; for (i = 0; i < TYPES; i++) { /* make sure (wrapper) classes are checked first */ if (i == 0) j = Tclass; else if (i == Tclass) continue; else j = i; for (p = Tptr[j]; p; p = p->next) { if (!is_element(p) && !is_transient(p) && !is_template(p) && p->type != Twchar && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion && !is_XML(p) && !is_header_or_fault(p) && !is_body(p)) { s = xsi_type(p); if (!*s) s = wsdl_type(p, ""); if (*s == '-') continue; if (*s) { if (is_dynamic_array(p) && !is_binary(p) && !has_ns(p) && !is_untyped(p)) fprintf(fout, "\n\t\tif (*soap->arrayType && !soap_match_array(soap, \"%s\"))\n\t\t{\t*type = %s;\n\t\t\treturn soap_in_%s(soap, tag, NULL, NULL);\n\t\t}", s, soap_type(p), c_ident(p)); else if (is_string(p)) fprintf(fout, "\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\tchar **s;\n\t\t\t*type = %s;\n\t\t\ts = soap_in_%s(soap, tag, NULL, NULL);\n\t\t\treturn s ? *s : NULL;\n\t\t}", s, soap_type(p), c_ident(p)); else if (is_wstring(p)) fprintf(fout, "\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\twchar_t **s;\n\t\t\t*type = %s;\n\t\t\ts = soap_in_%s(soap, tag, NULL, NULL);\n\t\t\treturn s ? *s : NULL;\n\t\t}", s, soap_type(p), c_ident(p)); else if (p->type != Tpointer) fprintf(fout, "\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\t*type = %s;\n\t\t\treturn soap_in_%s(soap, tag, NULL, NULL);\n\t\t}", s, soap_type(p), c_ident(p)); } } } } } void in_defs3(void) { int i; Tnode *p; const char *s; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (is_element(p) && !is_transient(p) && !is_template(p) && p->type != Twchar && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion && !is_XML(p) && !is_header_or_fault(p) && !is_body(p)) { s = xsi_type(p); if (!*s) s = wsdl_type(p, ""); if (*s == '-') continue; if (*s) { if (is_dynamic_array(p) && !is_binary(p) && !has_ns(p) && !is_untyped(p)) fprintf(fout, "\n\t\tif (*soap->arrayType && !soap_match_array(soap, \"%s\"))\n\t\t{\t*type = %s;\n\t\t\treturn soap_in_%s(soap, NULL, NULL, NULL);\n\t\t}", s, soap_type(p), c_ident(p)); else if (is_string(p)) fprintf(fout, "\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\tchar **s;\n\t\t\t*type = %s;\n\t\t\ts = soap_in_%s(soap, NULL, NULL, NULL);\n\t\t\treturn s ? *s : NULL;\n\t\t}", s, soap_type(p), c_ident(p)); else if (is_wstring(p)) fprintf(fout, "\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\twchar_t **s;\n\t\t\t*type = %s;\n\t\t\ts = soap_in_%s(soap, NULL, NULL, NULL);\n\t\t\treturn s ? *s : NULL;\n\t\t}", s, soap_type(p), c_ident(p)); else if (p->type != Tpointer) fprintf(fout, "\n\t\tif (!soap_match_tag(soap, t, \"%s\"))\n\t\t{\t*type = %s;\n\t\t\treturn soap_in_%s(soap, NULL, NULL, NULL);\n\t\t}", s, soap_type(p), c_ident(p)); } } } } } void out_defs(void) { int i; const char *s; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (is_transient(p) || is_template(p) || is_XML(p) || is_header_or_fault(p) || is_body(p)) continue; if (is_element(p)) { s = wsdl_type(p, ""); if (*s == '-') continue; if (p->type == Tarray) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_%s(soap, \"%s\", id, (%s)ptr, \"\");", soap_type(p), c_ident(p), s, c_type_id((Tnode*)p->ref, "(*)")); else if (p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn ((%s)ptr)->soap_out(soap, \"%s\", id, \"\");", soap_type(p), c_type_id(p, "*"), s); else if (is_string(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_string(soap, \"%s\", id, (char*const*)(void*)&ptr, \"\");", soap_type(p), s); else if (is_wstring(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_wstring(soap, \"%s\", id, (wchar_t*const*)(void*)&ptr, \"\");", soap_type(p), s); else if (p->type == Tpointer) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_%s(soap, \"%s\", id, (%s)ptr, \"\");", soap_type(p), c_ident(p), s, c_type_constptr_id(p, "const*")); else if (p->type != Tnone && p->type != Ttemplate && p->type != Twchar && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_%s(soap, \"%s\", id, (const %s)ptr, \"\");", soap_type(p), c_ident(p), s, c_type_id(p, "*")); } else { s = xsi_type(p); if (!*s) s = wsdl_type(p, ""); if (*s == '-') continue; if (p->type == Tarray) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_%s(soap, tag, id, (%s)ptr, \"%s\");", soap_type(p), c_ident(p), c_type_id((Tnode*)p->ref, "(*)"), s); else if (p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn ((%s)ptr)->soap_out(soap, tag, id, \"%s\");", soap_type(p), c_type_id(p, "*"), s); else if (is_string(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_string(soap, tag, id, (char*const*)(void*)&ptr, \"%s\");", soap_type(p), s); else if (is_wstring(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_wstring(soap, tag, id, (wchar_t*const*)(void*)&ptr, \"%s\");", soap_type(p), s); else if (p->type == Tpointer) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_%s(soap, tag, id, (%s)ptr, \"%s\");", soap_type(p), c_ident(p), c_type_constptr_id(p, "const*"), s); else if (p->type != Tnone && p->type != Ttemplate && p->type != Twchar && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_out_%s(soap, tag, id, (const %s)ptr, \"%s\");", soap_type(p), c_ident(p), c_type_id(p, "*"), s); } } } } void mark_defs() { int i; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (is_transient(p) || is_template(p) || is_XML(p) || is_header_or_fault(p) || is_body(p) || is_void(p)) continue; if (p->type == Tarray) continue; else if (p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) fprintf(fout, "\n\tcase %s:\n\t\t((%s)ptr)->soap_serialize(soap);\n\t\tbreak;", soap_type(p), c_type_id(p, "*")); else if (is_string(p)) fprintf(fout, "\n\tcase %s:\n\t\tsoap_serialize_string(soap, (char*const*)(void*)&ptr);\n\t\tbreak;", soap_type(p)); else if (is_wstring(p)) fprintf(fout, "\n\tcase %s:\n\t\tsoap_serialize_wstring(soap, (wchar_t*const*)(void*)&ptr);\n\t\tbreak;", soap_type(p)); else if (p->type == Tpointer) fprintf(fout, "\n\tcase %s:\n\t\tsoap_serialize_%s(soap, (%s)ptr);\n\t\tbreak;", soap_type(p), c_ident(p), c_type_constptr_id(p, "const*")); else if (p->type == Ttemplate && p->ref) fprintf(fout, "\n\tcase %s:\n\t\tsoap_serialize_%s(soap, (const %s)ptr);\n\t\tbreak;", soap_type(p), c_ident(p), c_type_id(p, "*")); else if (!is_primitive(p) && p->type != Tnone && p->type != Ttemplate && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion) fprintf(fout, "\n\tcase %s:\n\t\tsoap_serialize_%s(soap, (const %s)ptr);\n\t\tbreak;", soap_type(p), c_ident(p), c_type_id(p, "*")); } } } void dup_defs() { int i; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (is_transient(p) || is_template(p) || is_XML(p) || is_header_or_fault(p) || is_body(p) || is_void(p)) continue; if (p->type == Tarray) continue; else if (p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)((%s)ptr)->soap_dup(soap);", soap_type(p), c_type_id(p, "*")); else if (is_string(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)soap_strdup(soap, (const char*)ptr);", soap_type(p)); else if (is_wstring(p)) fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)soap_wstrdup(soap, (const wchar_t*)ptr);", soap_type(p)); else if (p->type == Tpointer) fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)%s_dup_%s(soap, NULL, (%s)ptr);", soap_type(p), fprefix, c_ident(p), c_type_constptr_id(p, "const*")); else if (p->type == Ttemplate && p->ref) fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)%s_dup_%s(soap, NULL, (const %s)ptr);", soap_type(p), fprefix, c_ident(p), c_type_id(p, "*")); else if (!is_primitive(p) && p->type != Tnone && p->type != Ttemplate && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion) fprintf(fout, "\n\tcase %s:\n\t\treturn (void*)%s_dup_%s(soap, NULL, (const %s)ptr);", soap_type(p), fprefix, c_ident(p), c_type_id(p, "*")); else if (p->type != Tnone && p->type != Ttemplate && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion) fprintf(fout, "\n\tcase %s:\n\t\treturn soap_memdup(soap, ptr, sizeof(%s));", soap_type(p), c_type(p)); } } } void del_defs() { int i; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (is_transient(p) || is_template(p) || is_XML(p) || is_header_or_fault(p) || is_body(p) || is_void(p)) continue; if (p->type == Tarray) continue; else if (p->type == Tclass && !is_external(p) && !is_volatile(p) && !is_typedef(p)) fprintf(fout, "\n\tcase %s:\n\t\tstatic_cast(ptr)->soap_del();\n\t\tSOAP_DELETE(NULL, static_cast(ptr), %s);\n\t\tbreak;", soap_type(p), c_type(p), c_type(p), c_type(p)); else if (is_string(p)) fprintf(fout, "\n\tcase %s:\n\t\t%s_del_string((char*const*)(void*)&ptr);\n\t\tbreak;", soap_type(p), fprefix); else if (is_wstring(p)) fprintf(fout, "\n\tcase %s:\n\t\t%s_del_wstring((wchar_t*const*)(void*)&ptr);\n\t\tbreak;", soap_type(p), fprefix); else if (p->type == Tpointer) fprintf(fout, "\n\tcase %s:\n\t\t%s_del_%s((%s)ptr);\n\t\tSOAP_FREE(NULL, ptr);\n\t\tbreak;", soap_type(p), fprefix, c_ident(p), c_type_constptr_id(p, "const*")); else if (p->type == Ttemplate && p->ref) fprintf(fout, "\n\tcase %s:\n\t\t%s_del_%s((const %s)ptr);\n\t\tSOAP_DELETE(NULL, static_cast(ptr), %s);\n\t\tbreak;", soap_type(p), fprefix, c_ident(p), c_type_id(p, "*"), c_type(p), c_type(p)); else if (!is_primitive(p) && p->type != Tnone && p->type != Ttemplate && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion) { if (!cflag && (p->type == Tstruct || p->type == Tclass)) fprintf(fout, "\n\tcase %s:\n\t\t%s_del_%s((const %s)ptr);\n\t\tSOAP_DELETE(NULL, static_cast(ptr), %s);\n\t\tbreak;", soap_type(p), fprefix, c_ident(p), c_type_id(p, "*"), c_type(p), c_type(p)); else fprintf(fout, "\n\tcase %s:\n\t\t%s_del_%s((const %s)ptr);\n\t\tSOAP_FREE(NULL, ptr);\n\t\tbreak;", soap_type(p), fprefix, c_ident(p), c_type_id(p, "*")); } else if (p->type != Tnone && p->type != Ttemplate && !is_void(p) && p->type != Tfun && p->type != Treference && p->type != Trvalueref && p->type != Tunion) fprintf(fout, "\n\tcase %s:\n\t\tSOAP_FREE(NULL, (const %s)ptr);\n\t\tbreak;", soap_type(p), c_type_id(p, "*")); } } } void in_attach(void) { int i; Tnode *p; for (i = 0; i < TYPES; i++) { for (p = Tptr[i]; p; p = p->next) { if (is_attachment(p)) { if (p->type == Tclass) fprintf(fout, "\n\t\tcase %s:\n\t\t{\t%s a;\n\t\t\ta = (%s)soap_id_enter(soap, soap->dime.id, NULL, %s, sizeof(%s), NULL, NULL, %s_instantiate, %s_fbase);\n\t\t\tif (a)\n\t\t\t{\ta->__ptr = (unsigned char*)soap->dime.ptr;\n\t\t\t\ta->__size = soap->dime.size;\n\t\t\t\ta->id = (char*)soap->dime.id;\n\t\t\t\ta->type = (char*)soap->dime.type;\n\t\t\t\ta->options = (char*)soap->dime.options;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn soap->error;\n\t\t\tbreak;\n\t\t}", soap_type(p), c_type_id(p, "*"), c_type_id(p, "*"), soap_type(p), c_type(p), prefix, prefix); else fprintf(fout, "\n\t\tcase %s:\n\t\t{\t%s a;\n\t\t\ta = (%s)soap_id_enter(soap, soap->dime.id, NULL, %s, sizeof(%s), NULL, NULL, NULL, NULL);\n\t\t\tif (!a)\n\t\t\t\treturn soap->error;\n\t\t\ta->__ptr = (unsigned char*)soap->dime.ptr;\n\t\t\ta->__size = soap->dime.size;\n\t\t\ta->id = (char*)soap->dime.id;\n\t\t\ta->type = (char*)soap->dime.type;\n\t\t\ta->options = (char*)soap->dime.options;\n\t\t\tbreak;\n\t\t}", soap_type(p), c_type_id(p, "*"), c_type_id(p, "*"), soap_type(p), c_type(p)); } else if (is_binary(p) && !is_transient(p)) { if (p->type == Tclass) fprintf(fout, "\n\t\tcase %s:\n\t\t{\t%s a;\n\t\t\ta = (%s)soap_id_enter(soap, soap->dime.id, NULL, %s, sizeof(%s), NULL, NULL, %s_instantiate, %s_fbase);\n\t\t\tif (!a)\n\t\t\t\treturn soap->error;\n\t\t\ta->__ptr = (unsigned char*)soap->dime.ptr;\n\t\t\ta->__size = soap->dime.size;\n\t\t\tbreak;\n\t\t}", soap_type(p), c_type_id(p, "*"), c_type_id(p, "*"), soap_type(p), c_type(p), prefix, prefix); else fprintf(fout, "\n\t\tcase %s:\n\t\t{\t%s a;\n\t\t\ta = (%s)soap_id_enter(soap, soap->dime.id, NULL, %s, sizeof(%s), NULL, NULL, NULL, NULL);\n\t\t\tif (!a)\n\t\t\t\treturn soap->error;\n\t\t\ta->__ptr = (unsigned char*)soap->dime.ptr;\n\t\t\ta->__size = soap->dime.size;\n\t\t\tbreak;\n\t\t}", soap_type(p), c_type_id(p, "*"), c_type_id(p, "*"), soap_type(p), c_type(p)); } } } } void soap_instantiate(Tnode *typ) { Table *Tptr; Entry *Eptr; int derclass = 0, flag = 0; const char *s; if (is_XML(typ)) return; if (typ->type == Tarray) return; if (typ->type == Tunion) return; if (typ->type == Tpointer && !is_string(typ) && !is_wstring(typ)) return; if (cflag) { if ((is_typedef(typ) && !is_external(typ)) || is_restriction(typ)) fprintf(fhead, "\n#define soap_new_%s soap_new_%s\n", c_ident(typ), t_ident(typ)); else { fprintf(fhead, "\n\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_new_%s(struct soap *soap, int n);", c_type(typ), c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_new_%s(struct soap *soap, int n)\n{\n\t%s *p;\n\t%s *a = (%s*)soap_malloc((soap), (n = (n < 0 ? 1 : n)) * sizeof(%s));\n\tfor (p = a; p && n--; p++)\n\t\tsoap_default_%s(soap, p);\n\treturn a;\n}", c_type(typ), c_ident(typ), c_type(typ), c_type(typ), c_type(typ), c_type(typ), c_ident(typ)); } return; } if (typ->type != Tclass || !typ->sym || !is_eq(typ->sym->name, "xsd__QName") || is_imported(typ)) { if ((is_typedef(typ) && !is_external(typ)) || is_restriction(typ)) { fprintf(fhead, "\n\n#define %s_instantiate_%s %s_instantiate_%s\n", fprefix, c_ident(typ), fprefix, t_ident(typ)); fprintf(fhead, "\n\n#define soap_new_%s soap_new_%s\n", c_ident(typ), t_ident(typ)); if ((typ->type == Tclass || typ->type == Tstruct) && typ->ref) { fprintf(fhead, "\n\n#define soap_new_req_%s soap_new_req_%s\n", c_ident(typ), t_ident(typ)); fprintf(fhead, "\n\n#define soap_new_set_%s soap_new_set_%s\n", c_ident(typ), t_ident(typ)); } return; } } if (is_primitive(typ) || is_string(typ) || is_wstring(typ)) { fprintf(fhead, "\n\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_new_%s(struct soap *soap, int n = -1);", c_type(typ), c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_new_%s(struct soap *soap, int n)\n{\n\t%s *a = static_cast<%s *>(soap_malloc(soap, (n = (n < 0 ? 1 : n)) * sizeof(%s)));\n\tfor (%s *p = a; p && n--; ++p)\n\t\tsoap_default_%s(soap, p);\n\treturn a;\n}", c_type(typ), c_ident(typ), c_type(typ), c_type(typ), c_type(typ), c_type(typ), c_ident(typ)); } /* NO LONGER CONSIDERED: soap_new_copy_Name1 may clash with soap_new_Name2 and soap_copy_X is already in use if (is_primitive(typ)) fprintf(fhead, "\n\ninline %s * soap_new_copy_%s(struct soap *soap, const %s& a)\n{\n\t%s *p = (%s*)soap_malloc(soap, sizeof(%s));\n\tif (p)\n\t\t*p = a;\n\treturn p;\n}", c_type(typ), c_ident(typ), c_type(typ), c_type(typ), c_type(typ), c_type(typ)); else if (is_string(typ)) fprintf(fhead, "\n\ninline char * soap_new_copy_string(struct soap *soap, const char *a)\n{\n\treturn soap_strdup(soap, a);\n}"); else if (is_wstring(typ)) fprintf(fhead, "\n\ninline wchar_t * soap_new_copy_wstring(struct soap *soap, const wchar_t *a)\n{\n\treturn soap_wstrdup(soap, a);\n}"); */ if (typ->type != Tstruct && typ->type != Tclass && typ->type != Ttemplate) return; fprintf(fhead, "\nSOAP_FMAC1 %s * SOAP_FMAC2 %s_instantiate_%s(struct soap*, int, const char*, const char*, size_t*);", c_type(typ), fprefix, c_ident(typ)); fprintf(fhead, "\n\ninline %s * soap_new_%s(struct soap *soap, int n = -1)\n{\n\treturn %s_instantiate_%s(soap, n, NULL, NULL, NULL);\n}", c_type(typ), c_ident(typ), fprefix, c_ident(typ)); /* NO LONGER CONSIDERED: soap_new_copy_Name1 may clash with soap_new_Name2 if (is_stdstring(typ)) { fprintf(fhead, "\n\ninline std::string * soap_new_copy_%s(struct soap *soap, const std::string& a)\n{\n\tstd::string *p = soap_new_%s(soap);\n\tif (p)\n\t\t*p = a;\n\treturn p;\n}", c_ident(typ), c_ident(typ)); fprintf(fhead, "\n\ninline std::string * soap_new_copy_%s(struct soap *soap, const char *a)\n{\n\tstd::string *p = soap_new_%s(soap);\n\tif (p)\n\t\tp->assign(a);\n\treturn p;\n}", c_ident(typ), c_ident(typ)); } else if (is_stdwstring(typ)) { fprintf(fhead, "\n\ninline std::wstring * soap_new_copy_%s(struct soap *soap, const std::wstring& a)\n{\n\tstd::wstring *p = soap_new_%s(soap);\n\tif (p)\n\t\t*p = a;\n\treturn p;\n}", c_ident(typ), c_ident(typ)); fprintf(fhead, "\n\ninline std::wstring * soap_new_copy_%s(struct soap *soap, const wchar_t *a)\n{\n\tstd::wstring *p = soap_new_%s(soap);\n\tif (p)\n\t\tp->assign(a);\n\treturn p;\n}", c_ident(typ), c_ident(typ)); } else if (!is_template(typ)) { fprintf(fhead, "\n\ninline %s * soap_new_copy_%s(struct soap *soap, const %s& a)\n{\n\t%s *p = soap_new_%s(soap);\n\tif (p)\n\t\t*p = a;\n\treturn p;\n}", c_type(typ), c_ident(typ), c_type(typ), c_type(typ), c_ident(typ)); } */ if (typ->type == Tclass || typ->type == Tstruct) { fprintf(fhead, "\n\ninline %s * soap_new_req_%s(\n\tstruct soap *soap", c_type(typ), c_ident(typ)); if (!is_dynamic_array(typ)) { for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) { if (is_repetition(Eptr) || is_anytype(Eptr)) flag = 2; if ((Eptr->info.minOccurs > 0 || flag) && !(Eptr->info.sto & (Sprivate | Sprotected | Sconst | Sstatic | Stypedef)) && Eptr->info.typ->type != Tfun && !is_soapref(Eptr->info.typ)) { if (flag) flag--; if (is_smart(Eptr->info.typ)) { if (is_smart_shared(Eptr->info.typ)) fprintf(fhead, ",\n\t%s %s", c_type_id(Eptr->info.typ, "&"), ident(Eptr->sym->name)); else fprintf(fhead, ",\n\t%s %s", c_type_id(Eptr->info.typ->ref, "*"), ident(Eptr->sym->name)); } else if (Eptr->info.typ->type == Ttemplate && is_smart(Eptr->info.typ->ref) && !is_smart_shared(Eptr->info.typ->ref)) continue; else if (Eptr->info.typ->type == Tclass || Eptr->info.typ->type == Tstruct || Eptr->info.typ->type == Tunion || Eptr->info.typ->type == Ttemplate) fprintf(fhead, ",\n\tconst %s& %s", c_type(Eptr->info.typ), ident(Eptr->sym->name)); else if ((Eptr->info.sto & Sconstptr)) fprintf(fhead, ",\n\tconst %s", c_type_id(Eptr->info.typ, Eptr->sym->name)); else if (Eptr->info.typ->type == Tarray) fprintf(fhead, ",\n\t%s", c_type_id(Eptr->info.typ, Eptr->sym->name)); else fprintf(fhead, ",\n\t%s", c_type_id(Eptr->info.typ, Eptr->sym->name)); if (derclass && Eptr->info.typ->type != Tarray) fprintf(fhead, "__%d", derclass); } } } } if (namespaceid && !is_external(typ)) fprintf(fhead, ")\n{\n\t%s = %s::soap_new_%s(soap);\n\tif (_p)\n\t{\t", c_type_id(typ, "*_p"), namespaceid, c_ident(typ)); else if (!is_external(typ)) fprintf(fhead, ")\n{\n\t%s = ::soap_new_%s(soap);\n\tif (_p)\n\t{\t", c_type_id(typ, "*_p"), c_ident(typ)); else fprintf(fhead, ")\n{\n\t%s = soap_new_%s(soap);\n\tif (_p)\n\t{\t", c_type_id(typ, "*_p"), c_ident(typ)); if (!is_external(typ)) { if (typ->type == Tclass && !is_volatile(typ)) fprintf(fhead, "_p->soap_default(soap);"); else if (namespaceid && !is_external(typ)) fprintf(fhead, "%s::soap_default_%s(soap, _p);", namespaceid, c_ident(typ)); else if (!is_external(typ)) fprintf(fhead, "::soap_default_%s(soap, _p);", c_ident(typ)); else fprintf(fhead, "soap_default_%s(soap, _p);", c_ident(typ)); } flag = 0; if (!is_dynamic_array(typ)) { for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) { if (is_repetition(Eptr) || is_anytype(Eptr)) flag = 2; if ((Eptr->info.minOccurs > 0 || flag) && !(Eptr->info.sto & (Sprivate | Sprotected | Sconst | Sstatic | Stypedef)) && Eptr->info.typ->type != Tfun && !is_soapref(Eptr->info.typ)) { if (flag) flag--; if (is_smart(Eptr->info.typ) && !is_smart_shared(Eptr->info.typ)) /* smart but not shared */ { if (typ->type == Tclass) fprintf(fhead, "\n\t\t_p->%s::%s = %s(%s", ident(Tptr->sym->name), ident(Eptr->sym->name), c_type(Eptr->info.typ), ident(Eptr->sym->name)); else fprintf(fhead, "\n\t\t_p->%s = %s(%s", ident(Eptr->sym->name), c_type(Eptr->info.typ), ident(Eptr->sym->name)); } else if (Eptr->info.typ->type == Tarray) { int cardinality; Tnode *ref = get_item_type(Eptr->info.typ, &cardinality); if (cardinality > 1) { const char *t = c_type(ref); if (typ->type == Tclass) fprintf(fhead, "\n\t\tfor (int i = 0; i < %d; i++)\n\t\t\t((%s*)(_p->%s::%s))[i] = ((%s*)%s)", get_dimension_product(Eptr->info.typ), t, ident(Tptr->sym->name), ident(Eptr->sym->name), t, ident(Eptr->sym->name)); else fprintf(fhead, "\n\t\tfor (int i = 0; i < %d; i++)\n\t\t\t((%s*)(_p->%s))[i] = ((%s*)%s)", get_dimension_product(Eptr->info.typ), t, ident(Eptr->sym->name), t, ident(Eptr->sym->name)); } else { if (typ->type == Tclass) fprintf(fhead, "\n\t\tfor (int i = 0; i < %d; i++)\n\t\t\t_p->%s::%s[i] = %s", get_dimension(Eptr->info.typ), ident(Tptr->sym->name), ident(Eptr->sym->name), ident(Eptr->sym->name)); else fprintf(fhead, "\n\t\tfor (int i = 0; i < %d; i++)\n\t\t\t_p->%s[i] = %s", get_dimension(Eptr->info.typ), ident(Eptr->sym->name), ident(Eptr->sym->name)); } } else if (Eptr->info.typ->type == Ttemplate && is_smart(Eptr->info.typ->ref) && !is_smart_shared(Eptr->info.typ->ref)) continue; else if (typ->type == Tclass) fprintf(fhead, "\n\t\t_p->%s::%s = %s", ident(Tptr->sym->name), ident(Eptr->sym->name), ident(Eptr->sym->name)); else fprintf(fhead, "\n\t\t_p->%s = %s", ident(Eptr->sym->name), ident(Eptr->sym->name)); if (derclass && Eptr->info.typ->type != Tarray) fprintf(fhead, "__%d", derclass); if (Eptr->info.typ->type == Tarray) fprintf(fhead, "[i];"); else if (is_smart(Eptr->info.typ) && !is_smart_shared(Eptr->info.typ)) /* smart but not shared */ fprintf(fhead, ");"); else fprintf(fhead, ";"); } } } } fprintf(fhead, "\n\t}\n\treturn _p;\n}"); fprintf(fhead, "\n\ninline %s * soap_new_set_%s(\n\tstruct soap *soap", c_type(typ), c_ident(typ)); for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) { if (!(Eptr->info.sto & (Sprivate | Sprotected | Sconst | Sstatic | Stypedef)) && Eptr->info.typ->type != Tfun && strcmp(Eptr->sym->name, "soap")) { if (is_smart(Eptr->info.typ)) { if (is_smart_shared(Eptr->info.typ)) fprintf(fhead, ",\n\t%s %s", c_type_id(Eptr->info.typ, "&"), ident(Eptr->sym->name)); else fprintf(fhead, ",\n\t%s %s", c_type_id(Eptr->info.typ->ref, "*"), ident(Eptr->sym->name)); } else if (Eptr->info.typ->type == Ttemplate && is_smart(Eptr->info.typ->ref) && !is_smart_shared(Eptr->info.typ->ref)) continue; else if (Eptr->info.typ->type == Tclass || Eptr->info.typ->type == Tstruct || Eptr->info.typ->type == Tunion || Eptr->info.typ->type == Ttemplate) fprintf(fhead, ",\n\tconst %s& %s", c_type(Eptr->info.typ), ident(Eptr->sym->name)); else if ((Eptr->info.sto & Sconstptr)) fprintf(fhead, ",\n\tconst %s", c_type_id(Eptr->info.typ, Eptr->sym->name)); else if (Eptr->info.typ->type == Tarray) fprintf(fhead, ",\n\t%s", c_type_id(Eptr->info.typ, Eptr->sym->name)); else fprintf(fhead, ",\n\t%s", c_type_id(Eptr->info.typ, Eptr->sym->name)); if (derclass && Eptr->info.typ->type != Tarray) fprintf(fhead, "__%d", derclass); } } } if (namespaceid && !is_external(typ)) fprintf(fhead, ")\n{\n\t%s = %s::soap_new_%s(soap);\n\tif (_p)\n\t{\t", c_type_id(typ, "*_p"), namespaceid, c_ident(typ)); else if (!is_external(typ)) fprintf(fhead, ")\n{\n\t%s = ::soap_new_%s(soap);\n\tif (_p)\n\t{\t", c_type_id(typ, "*_p"), c_ident(typ)); else fprintf(fhead, ")\n{\n\t%s = soap_new_%s(soap);\n\tif (_p)\n\t{\t", c_type_id(typ, "*_p"), c_ident(typ)); if (!is_external(typ)) { if (typ->type == Tclass && !is_volatile(typ)) fprintf(fhead, "_p->soap_default(soap);"); else if (namespaceid && !is_external(typ)) fprintf(fhead, "%s::soap_default_%s(soap, _p);", namespaceid, c_ident(typ)); else if (!is_external(typ)) fprintf(fhead, "::soap_default_%s(soap, _p);", c_ident(typ)); else fprintf(fhead, "soap_default_%s(soap, _p);", c_ident(typ)); } for (Tptr = (Table*)typ->ref, derclass = 0; Tptr; Tptr = Tptr->prev, derclass++) { for (Eptr = Tptr->list; Eptr; Eptr = Eptr->next) { if (!(Eptr->info.sto & (Sprivate | Sprotected | Sconst | Sstatic | Stypedef)) && Eptr->info.typ->type != Tfun && strcmp(Eptr->sym->name, "soap")) { if (is_smart(Eptr->info.typ) && !is_smart_shared(Eptr->info.typ)) /* smart but not shared */ { if (typ->type == Tclass) fprintf(fhead, "\n\t\t_p->%s::%s = %s(%s", ident(Tptr->sym->name), ident(Eptr->sym->name), c_type(Eptr->info.typ), ident(Eptr->sym->name)); else fprintf(fhead, "\n\t\t_p->%s = %s(%s", ident(Eptr->sym->name), c_type(Eptr->info.typ), ident(Eptr->sym->name)); } else if (Eptr->info.typ->type == Tarray) { int cardinality; Tnode *ref = get_item_type(Eptr->info.typ, &cardinality); if (cardinality > 1) { const char *t = c_type(ref); if (typ->type == Tclass) fprintf(fhead, "\n\t\tfor (int i = 0; i < %d; i++)\n\t\t\t((%s*)(_p->%s::%s))[i] = ((%s*)%s)", get_dimension_product(Eptr->info.typ), t, ident(Tptr->sym->name), ident(Eptr->sym->name), t, ident(Eptr->sym->name)); else fprintf(fhead, "\n\t\tfor (int i = 0; i < %d; i++)\n\t\t\t((%s*)(_p->%s))[i] = ((%s*)%s)", get_dimension_product(Eptr->info.typ), t, ident(Eptr->sym->name), t, ident(Eptr->sym->name)); } else { if (typ->type == Tclass) fprintf(fhead, "\n\t\tfor (int i = 0; i < %d; i++)\n\t\t\t_p->%s::%s[i] = %s", get_dimension(Eptr->info.typ), ident(Tptr->sym->name), ident(Eptr->sym->name), ident(Eptr->sym->name)); else fprintf(fhead, "\n\t\tfor (int i = 0; i < %d; i++)\n\t\t\t_p->%s[i] = %s", get_dimension(Eptr->info.typ), ident(Eptr->sym->name), ident(Eptr->sym->name)); } } else if (Eptr->info.typ->type == Ttemplate && is_smart(Eptr->info.typ->ref) && !is_smart_shared(Eptr->info.typ->ref)) continue; else if (typ->type == Tclass) fprintf(fhead, "\n\t\t_p->%s::%s = %s", ident(Tptr->sym->name), ident(Eptr->sym->name), ident(Eptr->sym->name)); else fprintf(fhead, "\n\t\t_p->%s = %s", ident(Eptr->sym->name), ident(Eptr->sym->name)); if (derclass && Eptr->info.typ->type != Tarray) fprintf(fhead, "__%d", derclass); if (Eptr->info.typ->type == Tarray) fprintf(fhead, "[i];"); else if (is_smart(Eptr->info.typ) && !is_smart_shared(Eptr->info.typ)) /* smart but not shared */ fprintf(fhead, ");"); else fprintf(fhead, ";"); } } } fprintf(fhead, "\n\t}\n\treturn _p;\n}"); } /* deprecated fprintf(fhead, "\n\ninline void soap_delete_%s(struct soap *soap, %s) { soap_delete(soap, p); }", c_ident(typ), c_type_id(typ, "*p")); */ fprintf(fout, "\n\nSOAP_FMAC1 %s * SOAP_FMAC2 %s_instantiate_%s(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size)", c_type(typ), fprefix, c_ident(typ)); fprintf(fout, "\n{"); fprintf(fout, "\n\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"%s_instantiate_%s(%%p, %%d, %%s, %%s)\\n\", (void*)soap, n, type?type:\"\", arrayType?arrayType:\"\"));", fprefix, c_ident(typ)); fprintf(fout, "\n\t(void)type; (void)arrayType; /* appease -Wall -Werror */"); for (Eptr = classtable->list; Eptr; Eptr = Eptr->next) { Tptr = ((Table *) Eptr->info.typ->ref); if (Tptr == ((Table *) typ->ref)) { continue; } derclass = 0; while (Tptr) { if (Tptr == (Table*)typ->ref) { derclass = 1; } Tptr = Tptr->prev; } if (derclass == 1 && !is_transient(Eptr->info.typ)) { if (is_dynamic_array(Eptr->info.typ) && !is_binary(Eptr->info.typ) && !has_ns(Eptr->info.typ) && !is_untyped(Eptr->info.typ)) fprintf(fout, "\n\tif (soap && arrayType && !soap_match_tag(soap, arrayType, \"%s\"))", xsi_type(Eptr->info.typ)); else fprintf(fout, "\n\tif (soap && type && !soap_match_tag(soap, type, \"%s\"))", the_type(Eptr->info.typ)); fprintf(fout, "\n\t\treturn %s_instantiate_%s(soap, n, NULL, NULL, size);", fprefix, c_ident(Eptr->info.typ)); derclass = 0; } } fprintf(fout, "\n\t%s;\n\tsize_t k = sizeof(%s);", c_type_id(typ, "*p"), c_type(typ)); fprintf(fout, "\n\tstruct soap_clist *cp = soap_link(soap, %s, n, %s_fdelete);", soap_type(typ), prefix); fprintf(fout, "\n\tif (!cp && soap && n != SOAP_NO_LINK_TO_DELETE)\n\t\treturn NULL;"); fprintf(fout, "\n\tif (n < 0)"); fprintf(fout, "\n\t{\tp = SOAP_NEW(soap, %s);", c_type(typ)); if ((s = has_soapref(typ))) fprintf(fout, "\n\t\tif (p)\n\t\t\tp->%s = soap;", s); fprintf(fout, "\n\t}\n\telse"); fprintf(fout, "\n\t{\tp = SOAP_NEW_ARRAY(soap, %s, n);", c_type(typ)); fprintf(fout, "\n\t\tk *= n;"); if (s) fprintf(fout, "\n\t\tif (p)\n\t\t\tfor (int i = 0; i < n; i++)\n\t\t\t\tp[i].%s = soap;", s); fprintf(fout, "\n\t}"); fprintf(fout, "\n\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Instantiated %s location=%%p n=%%d\\n\", (void*)p, n));", c_type(typ)); fprintf(fout, "\n\tif (size)\n\t\t*size = k;"); fprintf(fout, "\n\tif (!p)\n\t\tsoap->error = SOAP_EOM;"); fprintf(fout, "\n\telse if (cp)\n\t\tcp->ptr = (void*)p;"); fprintf(fout, "\n\treturn p;"); fprintf(fout, "\n}"); } void soap_dup(Tnode *typ) { if (!Ecflag) return; if (is_XML(typ)) return; if (typ->type != Tstruct && typ->type != Tclass && typ->type != Ttemplate && typ->type != Tpointer) return; if (typ->type != Tclass || !(typ->sym && (is_stdstring(typ) || is_stdwstring(typ)) && is_eq(typ->sym->name, "xsd__QName")) || is_imported(typ)) { if ((is_typedef(typ) && !is_external(typ)) || is_restriction(typ)) { fprintf(fhead, "\n\n#define %s_dup_%s %s_dup_%s\n", fprefix, c_ident(typ), fprefix, t_ident(typ)); return; } } if (typ->type == Tstruct && (is_anyType(typ) || is_anyAttribute(typ))) { if (strcmp(fprefix, "soap")) fprintf(fhead, "\n\n#define %s_dup_%s soap_dup_%s\n", fprefix, c_ident(typ), c_ident(typ)); return; } fprintf(fhead, "\n\nSOAP_FMAC1 %s * SOAP_FMAC2 %s_dup_%s(struct soap*, %s*, %s);", c_type(typ), fprefix, c_ident(typ), c_type(typ), c_type_constptr_id(typ, "const*")); fprintf(fout, "\n\nSOAP_FMAC1 %s * SOAP_FMAC2 %s_dup_%s(struct soap *soap, %s *d, %s)\n{", c_type(typ), fprefix, c_ident(typ), c_type(typ), c_type_constptr_id(typ, "const*a")); if (typ->type == Tclass || typ->type == Tstruct) { fprintf(fout, "\n\tstruct soap_plist *pp = NULL;"); if (typ->recursive) fprintf(fout, "\n\tchar *mark = NULL;"); } fprintf(fout, "\n\tif (!a)\n\t\treturn NULL;"); if (typ->type == Tclass || typ->type == Tstruct) { if (typ->recursive) fprintf(fout, "\n\tif (!d && ((d = (%s*)soap_mark_lookup(soap, (const void*)a, %s, &pp, &mark)) || soap_mark_cycle(soap, pp)))\n\t\treturn d;", c_type(typ), soap_type(typ)); else fprintf(fout, "\n\tif (!d && (d = (%s*)soap_mark_lookup(soap, (const void*)a, %s, &pp, NULL)))\n\t\treturn d;", c_type(typ), soap_type(typ)); } if (cflag) fprintf(fout, "\n\tif (!d && !(d = (%s*)soap_malloc(soap, sizeof(%s))))\n\t\treturn NULL; /* ERROR */", c_type(typ), c_type(typ)); else if (typ->type == Tpointer) fprintf(fout, "\n\tif (!d && !(d = (%s*)soap_malloc(soap, sizeof(%s))))\n\t\treturn NULL; /* ERROR */", c_type(typ), c_type(typ)); else fprintf(fout, "\n\tif (!d && !(d = soap_new_%s(soap)))\n\t\treturn NULL; /* ERROR */", c_ident(typ)); if (typ->type == Tclass || typ->type == Tstruct) fprintf(fout, "\n\tsoap_mark_dup(soap, (void*)d, pp);"); fflush(fout); if (is_string(typ)) { fprintf(fout, "\n\t*d = NULL;\n\tif (*a)\n\t{\tstruct soap_plist *pp = NULL;\n\t\tif (!(*d = (%s)soap_mark_lookup(soap, (const void*)*a, %s, &pp, NULL)))", c_type(typ), soap_type(typ)); fprintf(fout, "\n\t\t\tsoap_mark_dup(soap, *d = soap_strdup(soap, *a), pp);\n\t}\n\telse\n\t\t*d = NULL;"); } else if (is_wstring(typ)) { fprintf(fout, "\n\tif (*a)\n\t{\tstruct soap_plist *pp = NULL;\n\t\tif (!(*d = (%s)soap_mark_lookup(soap, (const void*)*a, %s, &pp, NULL)))", c_type(typ), soap_type(typ)); fprintf(fout, "\n\t\t\tsoap_mark_dup(soap, *d = soap_wstrdup(soap, *a), pp);\n\t}\n\telse\n\t\t*d = NULL;"); } else if (typ->type == Tpointer) { Tnode *ref = typ->ref; if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref)) { fprintf(fout, "\n\tif (*a)\n\t\t*d = (*a)->soap_dup(soap);\n\telse\n\t\t*d = NULL;"); } else if (is_XML(ref) && is_string(ref)) { if (cflag) fprintf(fout, "\n\tif (*a && (*d = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t**d = soap_strdup(soap, **a);\n\telse\n\t\t*d = NULL;", c_type(typ), c_type(ref)); else fprintf(fout, "\n\tif (*a && (*d = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t**d = soap_strdup(soap, **a);\n\telse\n\t\t*d = NULL;", c_type(typ), c_type(ref)); } else if (is_XML(ref) && is_wstring(ref)) { if (cflag) fprintf(fout, "\n\tif (*a && (*d = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t**d = soap_wstrdup(soap, **a);\n\telse\n\t\t*d = NULL;", c_type(typ), c_type(ref)); else fprintf(fout, "\n\tif (*a && (*d = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t**d = soap_wstrdup(soap, **a);\n\telse\n\t\t*d = NULL;", c_type(typ), c_type(ref)); } else if (is_primitive(ref) || is_external(typ) || is_volatile(ref) || is_transient(ref)) { if (cflag) fprintf(fout, "\n\tif (*a && (*d = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t**d = **a;\n\telse\n\t\t*d = NULL;", c_type(typ), c_type(ref)); else if (is_primitive(ref)) fprintf(fout, "\n\tif (*a && (*d = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t**d = **a;\n\telse\n\t\t*d = NULL;", c_type(typ), c_type(ref)); else fprintf(fout, "\n\tif (*a && (*d = soap_new_%s(soap)))\n\t\t**d = **a;\n\telse\n\t\t*d = NULL;", c_ident(ref)); if (!is_primitive(ref) && is_transient(ref)) fprintf(fout, " /* transient (shallow copy) */"); } else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) { fprintf(fout, "\n\tif (*a)\n\t\t*d = %s_dup_%s(soap, NULL, *a);\n\telse\n\t\t*d = NULL;", fprefix, c_ident(ref)); } } else if (is_smart(typ)) { Tnode *ref = typ->ref; if (is_smart_shared(typ)) { fprintf(fout, "\n\tif (*a)\n\t{\tstruct soap_plist *pp = NULL;\n\t\tchar *mark = NULL;\n\t\t%s *sp = (%s*)soap_mark_lookup(soap, (const void*)a->get(), %s, &pp, &mark);\n\t\tif (sp)\n\t\t\t*d = *sp;\n\t\telse if (soap_mark_cycle(soap, pp))\n\t\t\treturn d;\n\t\telse\n\t\t{\t", c_type(typ), c_type(typ), soap_type(typ)); if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref) && !is_transient(ref)) fprintf(fout, "*d = %s((*a)->soap_alloc());\n\t\t\tsoap_mark_dup(soap, (void*)d, pp);\n\t\t\t(*a)->soap_dup(soap, (void*)d->get());", c_type(typ)); else if (is_primitive(ref) || is_external(ref) || is_volatile(ref) || is_transient(ref)) fprintf(fout, "*d = %s<%s>(**a);", make_shared(typ), c_type(ref)); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "*d = %s<%s>();\n\t\t\tsoap_mark_dup(soap, (void*)d, pp);\n\t\t\t%s_dup_%s(soap, d->get(), a->get());", make_shared(typ), c_type(ref), fprefix, c_ident(ref)); fprintf(fout, "\n\t\t\tsoap_unmark(soap, mark);\n\t\t}\n\t}"); } else { if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref) && !is_transient(ref)) fprintf(fout, "\n\tif (a->get())\n\t\t*d = %s((*a)->soap_dup(soap, (void*)(*a)->soap_alloc()));", c_type(typ)); else if (is_primitive(ref) || is_transient(ref)) fprintf(fout, "\n\tif (a->get() && (*d = %s(SOAP_NEW(soap, %s))).get())\n\t\t**d = **a;", c_type(typ), c_type(ref)); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\tif (a->get())\n\t\t*d = %s(%s_dup_%s(soap, SOAP_NEW(soap, %s), a->get()));", c_type(typ), fprefix, c_ident(ref), c_type(ref)); } } else if (typ->type == Ttemplate) { Tnode *ref = typ->ref; if (strcmp(typ->id->name, "std::set") || is_primitive(ref) || is_external(ref) || is_volatile(ref) || is_transient(ref)) fprintf(fout, "\n\t*d = *a;"); if (!is_primitive(ref) && !is_external(ref) && !is_volatile(ref) && !is_transient(ref)) { if (!strcmp(typ->id->name, "std::set")) { fprintf(fout, "\n\t%s v;\n\tfor (%s::const_iterator i = a->begin(); i != a->end(); ++i)\n\t{\t", c_type(ref), c_type(typ)); if (is_XML(ref) && is_string(ref)) fprintf(fout, "v = soap_strdup(soap, *i);\n\t\td->insert(v);"); else if (is_XML(ref) && is_wstring(ref)) fprintf(fout, "v = soap_wstrdup(soap, *i);\n\t\td->insert(v);"); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "%s_dup_%s(soap, &v, &*i);\n\t\td->insert(v);", fprefix, c_ident(ref)); else fprintf(fout, "\n\t\td->insert(*i);"); } else { fprintf(fout, "\n\t%s::iterator j = d->begin();\n\tfor (%s::const_iterator i = a->begin(); i != a->end(); ++i, ++j)\n\t{\t", c_type(typ), c_type(typ)); if (is_XML(ref) && is_string(ref)) fprintf(fout, "*j = soap_strdup(soap, *i);"); else if (is_XML(ref) && is_wstring(ref)) fprintf(fout, "*j = soap_wstrdup(soap, *i);"); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "%s_dup_%s(soap, &*j, &*i);", fprefix, c_ident(ref)); } fprintf(fout, "\n\t}"); } } else if (typ->ref) { Entry *p = is_dynamic_array(typ); if (p) { if (is_binary(typ)) { if (cflag) fprintf(fout, "\n\td->__ptr = NULL;\n\td->__size = a->__size;\n\tif (a->__ptr && a->__size > 0)\n\t{\td->__ptr = (unsigned char*)soap_malloc(soap, a->__size);\n\t\tsoap_memcpy(d->__ptr, d->__size, a->__ptr, a->__size);\n\t}"); else fprintf(fout, "\n\td->__ptr = NULL;\n\td->__size = a->__size;\n\tif (a->__ptr && a->__size > 0)\n\t{\td->__ptr = (unsigned char*)soap_malloc(soap, a->__size);\n\t\tsoap_memcpy(d->__ptr, d->__size, a->__ptr, a->__size);\n\t}"); if (is_attachment(typ)) fprintf(fout, "\n\td->id = soap_strdup(soap, a->id);\n\td->type = soap_strdup(soap, a->type);\n\td->options = soap_strdup(soap, a->options); /* WARNING: cannot copy binary DIME attachment options correctly, MIME/MTOM is OK */"); } else { Tnode *ref = p->info.typ->ref; int dim = get_Darraydims(typ); const char *d = ident(p->sym->name); fprintf(fout, "\n\tif (a->%s)\n\t{", d); if (dim) fprintf(fout, "\tsize_t i, n = soap_size(a->__size, %d);", dim); else fprintf(fout, "\tint i, n = a->__size;"); if (cflag) fprintf(fout, "\n\t\td->%s = (%s)soap_malloc(soap, n * sizeof(%s));", d, c_type(p->info.typ), c_type(ref)); else if (is_primitive(ref) || ref->type == Tpointer) fprintf(fout, "\n\t\td->%s = (%s)soap_malloc(soap, n * sizeof(%s));", d, c_type(p->info.typ), c_type(ref)); else fprintf(fout, "\n\t\td->%s = soap_new_%s(soap, n);", d, c_ident(ref)); fprintf(fout, "\n\t\tfor (i = 0; i < n; i++)"); if (is_XML(ref) && is_string(ref)) fprintf(fout, "\n\t\t\td->%s[i] = soap_strdup(soap, a->%s[i]);", d, d); else if (is_XML(ref) && is_wstring(ref)) fprintf(fout, "\n\t\t\td->%s[i] = soap_wstrdup(soap, a->%s[i]);", d, d); else if (is_primitive(ref) || is_transient(ref)) fprintf(fout, "\n\t\t\td->%s[i] = a->%s[i];", d, d); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t\t%s_dup_%s(soap, &d->%s[i], &a->%s[i]);", fprefix, c_ident(ref), d, d); fprintf(fout, "\n\t}\n\telse\n\t\td->%s = NULL;", d); if (dim) fprintf(fout, "\n\tsoap_memcpy(&d->__size, sizeof(d->__size), &a->__size, sizeof(a->__size));"); else fprintf(fout, "\n\td->__size = a->__size;"); if (has_offset(typ)) { if (dim) fprintf(fout, "\n\tsoap_memcpy(&d->__offset, sizeof(d->__offset), &a->__offset, sizeof(a->__offset));"); else fprintf(fout, "\n\td->__offset = a->__offset;"); } } } else { Table *t = (Table*)typ->ref; const char *b = ""; const char *c = ""; if (typ->type == Tclass) { b = ident(t->sym->name); c = "::"; } if (t->prev) fprintf(fout, "\n\t%s_dup_%s(soap, d, a);", fprefix, ident(t->prev->sym->name)); for (p = ((Table*)typ->ref)->list; p; p = p->next) { const char *d = ident(p->sym->name); if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) { continue; } else if (p->info.sto & Sconst) { fprintf(fout, "\n\t/* const %s skipped */", d); } else if (p->info.sto & Sstatic) { fprintf(fout, "\n\t/* static %s skipped */", d); } else if (p->info.sto & Stypedef) { fprintf(fout, "\n\t/* typedef %s skipped */", d); } else if (is_repetition(p)) { Tnode *ref = p->next->info.typ->ref; const char *e = ident(p->next->sym->name); fprintf(fout, "\n\td->%s%s%s = a->%s%s%s;\n\tif (a->%s%s%s > 0 && a->%s%s%s)", b, c, d, b, c, d, b, c, d, b, c, e); if (cflag) { if (ref->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t{\tint i;\n\t\td->%s%s%s = (const %s)soap_malloc(soap, a->%s%s%s * sizeof(%s));", b, c, e, c_type(p->next->info.typ), b, c, d, c_type(ref)); else fprintf(fout, "\n\t{\tint i;\n\t\td->%s%s%s = (%s)soap_malloc(soap, a->%s%s%s * sizeof(%s));", b, c, e, c_type(p->next->info.typ), b, c, d, c_type(ref)); } else if (is_primitive(ref) || ref->type == Tpointer) { if (ref->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t{\tint i;\n\t\td->%s%s%s = (const %s)soap_malloc(soap, a->%s%s%s * sizeof(%s));", b, c, e, c_type(p->next->info.typ), b, c, d, c_type(ref)); else fprintf(fout, "\n\t{\tint i;\n\t\td->%s%s%s = (%s)soap_malloc(soap, a->%s%s%s * sizeof(%s));", b, c, e, c_type(p->next->info.typ), b, c, d, c_type(ref)); } else { fprintf(fout, "\n\t{\tint i;\n\t\td->%s%s%s = soap_new_%s(soap, a->%s%s%s);", b, c, e, c_ident(ref), b, c, d); } fprintf(fout, "\n\t\tfor (i = 0; i < (int)a->%s%s%s; i++)", b, c, d); if (is_XML(ref) && is_string(ref)) fprintf(fout, "\n\t\t\td->%s%s%s[i] = soap_strdup(soap, a->%s%s%s[i]);", b, c, e, b, c, e); else if (is_XML(ref) && is_wstring(ref)) fprintf(fout, "\n\t\t\td->%s%s%s[i] = soap_wstrdup(soap, a->%s%s%s[i]);", b, c, e, b, c, e); else if (is_primitive(ref)) fprintf(fout, "\n\t\t\td->%s%s%s[i] = a->%s%s%s[i];", b, c, e, b, c, e); else if (ref->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t\t\t%s_dup_%s(soap, (%s)&d->%s%s%s[i], (%s)&a->%s%s%s[i]);", fprefix, c_ident(ref), c_type_id(ref, "*"), b, c, e, c_type_id(ref, "const*"), b, c, e); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t\t%s_dup_%s(soap, &d->%s%s%s[i], &a->%s%s%s[i]);", fprefix, c_ident(ref), b, c, e, b, c, e); fprintf(fout, "\n\t}\n\telse\n\t\td->%s%s%s = NULL;", b, c, e); p = p->next; } else if (is_anytype(p)) { fprintf(fout, "\n\td->%s%s%s = soap_dupelement(soap, a->%s%s%s, d->%s%s%s = a->%s%s%s);", b, c, ident(p->next->sym->name), b, c, ident(p->next->sym->name), b, c, d, b, c, d); p = p->next; } else if (is_choice(p)) { Entry *q; const char *e = ident(p->next->sym->name); fprintf(fout, "\n\td->%s%s%s = a->%s%s%s;", b, c, d, b, c, d); fprintf(fout, "\n\tswitch (a->%s%s%s)\n\t{", b, c, d); t = (Table*)p->next->info.typ->ref; if (t) { for (q = t->list; q; q = q->next) { const char *f = ident(q->sym->name); fprintf(fout, "\n\t\tcase %s:", soap_union_member(p->next->info.typ, q)); if (is_XML(q->info.typ) && is_string(q->info.typ)) fprintf(fout, "\n\t\t\td->%s%s%s.%s = soap_strdup(soap, a->%s%s%s.%s);", b, c, e, f, b, c, e, f); else if (is_XML(q->info.typ) && is_wstring(q->info.typ)) fprintf(fout, "\n\t\t\td->%s%s%s.%s = soap_wstrdup(soap, a->%s%s%s.%s);", b, c, e, f, b, c, e, f); else if (is_primitive(q->info.typ)) fprintf(fout, "\n\t\t\td->%s%s%s.%s = a->%s%s%s.%s;", b, c, e, f, b, c, e, f); else if (is_transient(q->info.typ)) fprintf(fout, "\n\t\t\td->%s%s%s.%s = a->%s%s%s.%s; /* transient (shallow copy) */", b, c, e, f, b, c, e, f); else if (q->info.typ->type == Tclass || q->info.typ->type == Tstruct || q->info.typ->type == Ttemplate || q->info.typ->type == Tpointer) fprintf(fout, "\n\t\t\t%s_dup_%s(soap, &d->%s%s%s.%s, &a->%s%s%s.%s);", fprefix, c_ident(q->info.typ), b, c, e, f, b, c, e, f); fprintf(fout, "\n\t\t\tbreak;"); } } fprintf(fout, "\n\t}"); p = p->next; } else if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "\n\td->%s%s%s = soap_strdup(soap, (char*)a->%s%s%s);", b, c, d, b, c, d); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "\n\td->%s%s%s = soap_wstrdup(soap, (char*)a->%s%s%s);", b, c, d, b, c, d); } else if (is_soapref(p->info.typ)) { fprintf(fout, "\n\td->%s%s%s = soap;", b, c, d); } else if (is_primitive(p->info.typ)) { fprintf(fout, "\n\td->%s%s%s = a->%s%s%s;", b, c, d, b, c, d); } else if (is_pointer_to_derived(p)) { Tnode *ref = p->info.typ->ref; if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref)) fprintf(fout, "\n\td->%s%s%s = a->%s%s%s ? a->%s%s%s->soap_dup(soap) : NULL;", b, c, d, b, c, d, b, c, d); else if (ref->type == Tstruct || ref->type == Tclass) fprintf(fout, "\n\td->%s%s%s = a->%s%s%s ? %s_dup_%s(soap, NULL, a->%s%s%s) : NULL;", b, c, d, b, c, d, fprefix, c_ident(ref), b, c, d); else if (is_primitive(ref)) fprintf(fout, "\n\tif (a->%s%s%s && (d->%s%s%s = (%s)soap_malloc(soap, sizeof(%s))) != NULL)\n\t\t*d->%s%s%s = *a->%s%s%s;\n\telse\n\t\td->%s%s%s = NULL;", b, c, d, b, c, d, c_type(p->info.typ), c_type(ref), b, c, d, b, c, d, b, c, d); } else if (is_transient(p->info.typ)) { fprintf(fout, "\n\td->%s%s%s = a->%s%s%s; /* transient (shallow copy) */", b, c, d, b, c, d); } else if (p->info.typ->type == Tarray) { int cardinality; Tnode *ref = get_item_type(p->info.typ, &cardinality); if (cardinality > 1) { const char *t = c_type(ref); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < %d; i++)", get_dimension_product(p->info.typ)); if (is_XML(ref) && is_string(ref)) fprintf(fout, "\n\t\t\t((%s*)(d->%s%s%s))[i] = soap_strdup(soap, ((%s*)(a->%s%s%s))[i]);", t, b, c, d, t, b, c, d); else if (is_XML(ref) && is_wstring(ref)) fprintf(fout, "\n\t\t\t((%s*)(d->%s%s%s))[i] = soap_wstrdup(soap, ((%s*)(a->%s%s%s))[i]);", t, b, c, d, t, b, c, d); else if (is_primitive(ref)) fprintf(fout, "\n\t\t\t((%s*)(d->%s%s%s))[i] = ((%s*)(a->%s%s%s))[i];", t, b, c, d, t, b, c, d); else if (is_transient(ref)) fprintf(fout, "\n\t\t\t((%s*)(d->%s%s%s))[i] = ((%s*)(a->%s%s%s))[i]; /* transient (shallow copy) */", t, b, c, d, t, b, c, d); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t\t%s_dup_%s(soap, &((%s*)(d->%s%s%s))[i], &((%s*)(a->%s%s%s))[i]);", fprefix, c_ident(ref), t, b, c, d, t, b, c, d); } else { fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < %d; i++)", get_dimension(p->info.typ)); if (is_XML(ref) && is_string(ref)) fprintf(fout, "\n\t\t\td->%s%s%s[i] = soap_strdup(soap, a->%s%s%s[i]);", b, c, d, b, c, d); else if (is_XML(ref) && is_wstring(ref)) fprintf(fout, "\n\t\t\td->%s%s%s[i] = soap_wstrdup(soap, a->%s%s%s[i]);", b, c, d, b, c, d); else if (is_primitive(ref)) fprintf(fout, "\n\t\t\td->%s%s%s[i] = a->%s%s%s[i];", b, c, d, b, c, d); else if (is_transient(ref)) fprintf(fout, "\n\t\t\td->%s%s%s[i] = a->%s%s%s[i]; /* transient (shallow copy) */", b, c, d, b, c, d); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t\t%s_dup_%s(soap, &d->%s%s%s[i], &a->%s%s%s[i]);", fprefix, c_ident(ref), b, c, d, b, c, d); } fprintf(fout, "\n\t}"); } else if (p->info.typ->type == Tpointer && (p->info.sto & Sconstptr)) { fprintf(fout, "\n\t%s_dup_%s(soap, (%s)&d->%s%s%s, (%s)&a->%s%s%s);", fprefix, c_ident(p->info.typ), c_type_id(p->info.typ, "*"), b, c, d, c_type_id(p->info.typ, "const*"), b, c, d); } else if (p->info.typ->type == Tclass || p->info.typ->type == Tstruct || p->info.typ->type == Ttemplate || p->info.typ->type == Tpointer) { fprintf(fout, "\n\t%s_dup_%s(soap, &d->%s%s%s, &a->%s%s%s);", fprefix, c_ident(p->info.typ), b, c, d, b, c, d); } else { fprintf(fout, "\n\t/* %s skipped */", d); } } } } else { fprintf(fout, "\n\t*d = *a;"); } if ((typ->type == Tclass || typ->type == Tstruct) && typ->recursive) fprintf(fout, "\n\tsoap_unmark(soap, mark);"); fprintf(fout, "\n\treturn d;\n}"); fflush(fout); } void soap_del(Tnode *typ) { if (!Edflag) return; if (is_XML(typ)) return; if (typ->type != Tstruct && typ->type != Tclass && typ->type != Ttemplate && typ->type != Tpointer) return; if (typ->type != Tclass || !(typ->sym && (is_stdstring(typ) || is_stdwstring(typ)) && is_eq(typ->sym->name, "xsd__QName")) || is_imported(typ)) { if ((is_typedef(typ) && !is_external(typ)) || is_restriction(typ)) { fprintf(fhead, "\n\n#define %s_del_%s %s_del_%s\n", fprefix, c_ident(typ), fprefix, t_ident(typ)); return; } } if (typ->type == Tstruct && (is_anyType(typ) || is_anyAttribute(typ))) { if (strcmp(fprefix, "soap")) fprintf(fhead, "\n\n#define %s_del_%s soap_del_%s\n", fprefix, c_ident(typ), c_ident(typ)); return; } fprintf(fhead, "\n\nSOAP_FMAC1 void SOAP_FMAC2 %s_del_%s(%s);", fprefix, c_ident(typ), c_type_constptr_id(typ, "const*")); fprintf(fout, "\n\nSOAP_FMAC1 void SOAP_FMAC2 %s_del_%s(%s)\n{", fprefix, c_ident(typ), c_type_constptr_id(typ, "const*a")); fprintf(fout, "\n\tif (!a)\n\t\treturn;"); fflush(fout); if (is_string(typ) || is_wstring(typ)) { if (cflag) fprintf(fout, "\n\tif (*a)\n\t\tSOAP_FREE(NULL, *a);"); else fprintf(fout, "\n\tif (*a)\n\t\tSOAP_FREE(NULL, *a);"); } else if (typ->type == Tpointer) { Tnode *ref = typ->ref; if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref)) fprintf(fout, "\n\tif (*a)\n\t{\t(*a)->soap_del();\n\t\tSOAP_DELETE(NULL, *a, %s);\n\t}", c_type(ref)); else if (is_XML(ref)) { if (cflag) fprintf(fout, "\n\tif (*a)\n\t{\tif (**a)\n\t\t\tSOAP_FREE(NULL, **a);\n\t\tSOAP_FREE(NULL, *a);\n\t}"); else fprintf(fout, "\n\tif (*a)\n\t{\tif (**a)\n\t\t\tSOAP_FREE(NULL, **a);\n\t\tSOAP_FREE(NULL, *a);\n\t}"); } else if (is_primitive(ref) || is_external(typ) || is_volatile(ref) || is_transient(ref)) { if (cflag) fprintf(fout, "\n\tif (*a)\n\t\tSOAP_FREE(NULL, *a);"); else if (is_primitive(ref)) fprintf(fout, "\n\tif (*a)\n\t\tSOAP_FREE(NULL, *a);"); else fprintf(fout, "\n\tif (*a)\n\t\tSOAP_DELETE(NULL, *a, %s);", c_type(ref)); } else if (cflag) fprintf(fout, "\n\tif (*a)\n\t{\t%s_del_%s(*a);\n\t\tSOAP_FREE(NULL, *a);\n\t}", fprefix, c_ident(ref)); else if (ref->type == Tpointer) fprintf(fout, "\n\tif (*a)\n\t{\t%s_del_%s(*a);\n\t\tSOAP_FREE(NULL, *a);\n\t}", fprefix, c_ident(ref)); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate) fprintf(fout, "\n\tif (*a)\n\t{\t%s_del_%s(*a);\n\t\tSOAP_DELETE(NULL, *a, %s);\n\t}", fprefix, c_ident(ref), c_type(ref)); } else if (is_smart(typ)) { Tnode *ref = typ->ref; if (is_smart_shared(typ)) { if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref) && !is_transient(ref)) fprintf(fout, "\n\tif (*a)\n\t\t(*a)->soap_del();"); else if (is_primitive(ref) || is_transient(ref)) ; else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\tif (*a)\n\t\t%s_del_%s(a->get());", fprefix, c_ident(ref)); } else { if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref) && !is_transient(ref)) fprintf(fout, "\n\tif (a->get())\n\t\t(*a)->soap_del();"); else if (is_primitive(ref) || is_transient(ref)) ; else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\tif (a->get())\n\t\t%s_del_%s(a->get());", fprefix, c_ident(ref)); } } else if (typ->type == Ttemplate) { Tnode *ref = typ->ref; if (!is_primitive(ref) && !is_external(typ) && !is_volatile(ref) && !is_transient(ref)) { fprintf(fout, "\n\tfor (%s::const_iterator i = a->begin(); i != a->end(); ++i)", c_type(typ)); if (is_XML(ref)) fprintf(fout, "\n\t\tSOAP_FREE(NULL, *i);"); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t%s_del_%s(&*i);", fprefix, c_ident(ref)); else fprintf(fout, "\n\t\t; /* skipped */"); } } else if (typ->ref) { Entry *p = is_dynamic_array(typ); if (p) { if (is_binary(typ)) { if (cflag) fprintf(fout, "\n\tif (a->__ptr)\n\t\tSOAP_FREE(NULL, a->__ptr);"); else fprintf(fout, "\n\tif (a->__ptr)\n\t\tSOAP_FREE(NULL, a->__ptr);"); if (is_attachment(typ)) { if (cflag) fprintf(fout, "\n\tif (a->id)\n\t\tSOAP_FREE(NULL, a->id);\n\tif (a->type)\n\t\tSOAP_FREE(NULL, a->type);\n\tif (a->options)\n\t\tSOAP_FREE(NULL, a->options);"); else fprintf(fout, "\n\tif (a->id)\n\t\tSOAP_FREE(NULL, a->id);\n\tif (a->type)\n\t\tSOAP_FREE(NULL, a->type);\n\tif (a->options)\n\t\tSOAP_FREE(NULL, a->options);"); } } else { Tnode *ref = p->info.typ->ref; int dim = get_Darraydims(typ); const char *d = ident(p->sym->name); fprintf(fout, "\n\tif (a->%s)\n\t{", d); if (!is_primitive(ref) && !is_transient(ref)) { if (dim) fprintf(fout, "\tsize_t i, n = soap_size(a->__size, %d);", dim); else fprintf(fout, "\tint i, n = a->__size;"); fprintf(fout, "\n\t\tfor (i = 0; i < n; i++)"); if (is_XML(ref)) fprintf(fout, "\n\t\t\tSOAP_FREE(NULL, a->%s[i]);", d); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t\t%s_del_%s(&a->%s[i]);", fprefix, c_ident(ref), d); } if (cflag || is_primitive(ref) || ref->type == Tpointer) fprintf(fout, "\n\t\tSOAP_FREE(NULL, a->%s);\n\t}", d); else fprintf(fout, "\n\t\tSOAP_DELETE_ARRAY(NULL, a->%s, %s);\n\t}", d, c_type(ref)); } } else { Table *t = (Table*)typ->ref; const char *b = ""; const char *c = ""; if (typ->type == Tclass) { b = ident(t->sym->name); c = "::"; } if (t->prev) fprintf(fout, "\n\t%s_del_%s(a);", fprefix, ident(t->prev->sym->name)); for (p = ((Table*)typ->ref)->list; p; p = p->next) { const char *d = ident(p->sym->name); if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) { continue; } else if (p->info.sto & Sconst) { fprintf(fout, "\n\t/* const %s skipped */", d); } else if (p->info.sto & Sstatic) { fprintf(fout, "\n\t/* static %s skipped */", d); } else if (p->info.sto & Stypedef) { fprintf(fout, "\n\t/* typedef %s skipped */", d); } else if (is_repetition(p)) { Tnode *ref = p->next->info.typ->ref; const char *e = ident(p->next->sym->name); fprintf(fout, "\n\tif (a->%s%s%s)\n\t{", b, c, e); if (!is_primitive(ref) && !is_transient(ref)) { fprintf(fout, "\tint i;\n\t\tfor (i = 0; i < (int)a->%s%s%s; i++)", b, c, d); if (is_XML(ref)) fprintf(fout, "\n\t\t\tSOAP_FREE(NULL, a->%s%s%s[i]);", b, c, e); else if (ref->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t\t\t%s_del_%s((%s)&a->%s%s%s[i]);", fprefix, c_ident(ref), c_type_id(ref, "*"), b, c, e); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t\t%s_del_%s(&a->%s%s%s[i]);", fprefix, c_ident(ref), b, c, e); } if (cflag) fprintf(fout, "\n\t\tSOAP_FREE(NULL, a->%s%s%s);\n\t}", b, c, e); else if (is_primitive(ref) || ref->type == Tpointer) fprintf(fout, "\n\t\tSOAP_FREE(NULL, a->%s%s%s);\n\t}", b, c, e); else fprintf(fout, "\n\t\tSOAP_DELETE_ARRAY(soap, a->%s%s%s, %s);\n\t}", b, c, e, c_type(ref)); p = p->next; } else if (is_anytype(p)) { fprintf(fout, "\n\tsoap_delelement(a->%s%s%s, a->%s%s%s);", b, c, ident(p->next->sym->name), b, c, d); p = p->next; } else if (is_choice(p)) { Entry *q; const char *e = ident(p->next->sym->name); fprintf(fout, "\n\tswitch (a->%s%s%s)\n\t{", b, c, d); t = (Table*)p->next->info.typ->ref; if (t) { for (q = t->list; q; q = q->next) { if (!is_primitive(q->info.typ) && !is_transient(q->info.typ)) { const char *f = ident(q->sym->name); fprintf(fout, "\n\t\tcase %s:", soap_union_member(p->next->info.typ, q)); if (is_XML(q->info.typ)) fprintf(fout, "\n\t\t\tif (a->%s%s%s.%s)\n\t\t\t\tSOAP_FREE(NULL, a->%s%s%s.%s);", b, c, e, f, b, c, e, f); else if (q->info.typ->type == Tclass || q->info.typ->type == Tstruct || q->info.typ->type == Ttemplate || q->info.typ->type == Tpointer) fprintf(fout, "\n\t\t\t%s_del_%s(&a->%s%s%s.%s);", fprefix, c_ident(q->info.typ), b, c, e, f); fprintf(fout, "\n\t\t\tbreak;"); } } } fprintf(fout, "\n\t}"); p = p->next; } else if (is_XML(p->info.typ)) { fprintf(fout, "\n\tif (a->%s%s%s)\n\t\tSOAP_FREE(NULL, a->%s%s%s);", b, c, d, b, c, d); } else if (p->info.typ->type == Tpointer && (p->info.sto & Sconstptr)) { fprintf(fout, "\n\t%s_del_%s((%s)&a->%s%s%s);", fprefix, c_ident(p->info.typ), c_type_id(p->info.typ, "*"), b, c, d); } else if (is_primitive(p->info.typ)) { fprintf(fout, "\n\t/* %s skipped */", d); } else if (is_pointer_to_derived(p)) { Tnode *ref = p->info.typ->ref; if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref)) fprintf(fout, "\n\tif (a->%s%s%s)\n\t{\ta->%s%s%s->soap_del();\n\t\tSOAP_DELETE(NULL, a->%s%s%s, %s);\n\t}", b, c, d, b, c, d, b, c, d, c_type(ref)); else if (ref->type == Tstruct || ref->type == Tclass) fprintf(fout, "\n\tif (a->%s%s%s)\n\t{\t%s_del_%s(a->%s%s%s);\n\t\tSOAP_FREE(NULL, a->%s%s%s);\n\t}", b, c, d, fprefix, c_ident(ref), b, c, d, b, c, d); else if (is_primitive(ref)) fprintf(fout, "\n\tif (a->%s%s%s)\n\t\tSOAP_FREE(NULL, a->%s%s%s);", b, c, d, b, c, d); } else if (is_transient(p->info.typ)) { fprintf(fout, "\n\t/* transient %s skipped */", d); } else if (p->info.typ->type == Tarray) { int cardinality; Tnode *ref = get_item_type(p->info.typ, &cardinality); if (!is_primitive(ref) && !is_transient(ref)) { if (cardinality > 1) { const char *t = c_type(ref); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < %d; i++)", get_dimension_product(p->info.typ)); if (is_XML(ref)) fprintf(fout, "\n\t\t\tif (((%s*)(a->%s%s%s))[i])\n\t\t\t\tSOAP_FREE(NULL, ((%s*)(a->%s%s%s))[i]);", t, b, c, d, t, b, c, d); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t\t%s_del_%s(&((%s*)(a->%s%s%s))[i]);", fprefix, c_ident(ref), t, b, c, d); } else { fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < %d; i++)", get_dimension(p->info.typ)); if (is_XML(ref)) fprintf(fout, "\n\t\t\tif (a->%s%s%s[i])\n\t\t\t\tSOAP_FREE(NULL, a->%s%s%s[i]);", b, c, d, b, c, d); else if (ref->type == Tclass || ref->type == Tstruct || ref->type == Ttemplate || ref->type == Tpointer) fprintf(fout, "\n\t\t\t%s_del_%s(&a->%s%s%s[i]);", fprefix, c_ident(ref), b, c, d); } fprintf(fout, "\n\t}"); } } else if (p->info.typ->type == Tclass || p->info.typ->type == Tstruct || p->info.typ->type == Ttemplate || p->info.typ->type == Tpointer) { fprintf(fout, "\n\t%s_del_%s(&a->%s%s%s);", fprefix, c_ident(p->info.typ), b, c, d); } else { fprintf(fout, "\n\t/* %s skipped */", d); } } } } fprintf(fout, "\n}"); fflush(fout); } int get_dimension(Tnode *typ) { if (((Tnode*)typ->ref)->width) return typ->width / ((Tnode*) typ->ref)->width; return 0; } int get_dimension_product(Tnode *typ) { int total = 1; while (typ->type == Tarray) { total *= get_dimension(typ); typ = (Tnode*)typ->ref; } return total; } Tnode * get_item_type(Tnode *typ, int *depth) { *depth = 0; while (typ->type == Tarray) { typ = (Tnode*)typ->ref; (*depth)++; } return typ; } void soap_serialize(Tnode *typ) { int d; Table *table, *t; Entry *p; Tnode* temp; int cardinality; const char *self; if (is_XML(typ)) return; if (is_primitive(typ)) return; if (is_typedef(typ) && (is_template(typ) || is_element(typ) || is_restriction(typ) || is_external(typ) || is_imported(typ)) && (!is_external(typ) || is_volatile(typ))) { if (typ->type == Tclass && !is_stdstring(typ) && !is_stdwstring(typ) && !is_volatile(typ)) fprintf(fhead, "\n\n#define soap_serialize_%s(soap, a) (a)->soap_serialize(soap)\n", c_ident(typ)); else { if (typ->type == Tstruct && is_element(typ)) /* don't permit for typedef'd elements, see soap_put() */ fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);", t_ident(typ), c_type_id(typ, "*")); fprintf(fhead, "\n\n#define soap_serialize_%s soap_serialize_%s\n", c_ident(typ), t_ident(typ)); } return; } if ((p = is_dynamic_array(typ))) { if (typ->type == Tclass && !is_typedef(typ) && !is_volatile(typ)) { if (is_external(typ)) return; fprintf(fout, "\n\nvoid %s::soap_serialize(struct soap *soap) const\n{", c_ident(typ)); fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */\n#ifndef WITH_NOIDREF"); if (is_binary(typ)) { if (is_attachment(typ)) fprintf(fout, "\n\tif (this->__ptr)\n\t\t(void)soap_attachment_reference(soap, this, this->__ptr, this->__size, %s, this->id, this->type);\n#endif\n}", soap_type(typ)); else fprintf(fout, "\n\tif (this->__ptr)\n\t\t(void)soap_array_reference(soap, this, this->__ptr, this->__size, %s);\n#endif\n}", soap_type(typ)); fflush(fout); return; } else { d = get_Darraydims(typ); if (d) { fprintf(fout, "\n\tif (this->%s && !soap_array_reference(soap, this, this->%s, %s, %s))", ident(p->sym->name), ident(p->sym->name), get_Darraysize("this", d), soap_type(typ)); fprintf(fout, "\n\t{\tsize_t i, n = soap_size(this->__size, %d);", d); fprintf(fout, "\n\t\tfor (i = 0; i < n; i++)"); } else { fprintf(fout, "\n\tif (this->%s && !soap_array_reference(soap, this, this->%s, this->__size, %s))", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\t{\tfor (size_t i = 0; i < (size_t)this->__size; i++)"); } fprintf(fout, "\n\t\t{"); if (has_ptr((Tnode*)p->info.typ->ref)) fprintf(fout, "\tsoap_embedded(soap, this->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_XML((Tnode*)p->info.typ->ref) && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tthis->%s[i].soap_serialize(soap);", ident(p->sym->name)); else if (is_string((Tnode*)p->info.typ->ref) && !is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (char*const*)(this->%s + i));", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); else if (is_wstring((Tnode*)p->info.typ->ref) && !is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (wchar_t*const*)(this->%s + i));", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); else if (!is_XML((Tnode*)p->info.typ->ref) && !is_primitive((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, this->%s + i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); fprintf(fout, "\n\t\t}\n\t}\n#endif\n}"); return; } } else { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, const %s)\n{", c_ident(typ), c_type_id(typ, "*a")); if (is_binary(typ)) { fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */\n#ifndef WITH_NOIDREF"); if (is_attachment(typ)) fprintf(fout, "\n\tif (a->%s)\n\t\t(void)soap_attachment_reference(soap, a, a->%s, a->__size, %s, a->id, a->type);\n#endif\n}", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); else fprintf(fout, "\n\tif (a->%s)\n\t\t(void)soap_array_reference(soap, a, a->%s, a->__size, %s);\n#endif\n}", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fflush(fout); return; } else { fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */\n#ifndef WITH_NOIDREF"); d = get_Darraydims(typ); if (d) { fprintf(fout, "\n\tif (a->%s && !soap_array_reference(soap, a, a->%s, %s, %s))", ident(p->sym->name), ident(p->sym->name), get_Darraysize("a", d), soap_type(typ)); fprintf(fout, "\n\t{\tsize_t i, n = soap_size(a->__size, %d);", d); fprintf(fout, "\n\t\tfor (i = 0; i < n; i++)"); } else { fprintf(fout, "\n\tif (a->%s && !soap_array_reference(soap, a, a->%s, a->__size, %s))", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < a->__size; i++)"); } fprintf(fout, "\n\t\t{"); if (has_ptr((Tnode*)p->info.typ->ref)) fprintf(fout, "\tsoap_embedded(soap, a->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_XML((Tnode*)p->info.typ->ref) && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\ta->%s[i].soap_serialize(soap);", ident(p->sym->name)); else if (is_string((Tnode*)p->info.typ->ref) && !is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (char*const*)(a->%s + i));", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); else if (is_wstring((Tnode*)p->info.typ->ref) && !is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (wchar_t*const*)(a->%s + i));", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); else if (!is_XML((Tnode*)p->info.typ->ref) && !is_primitive((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, a->%s + i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); fprintf(fout, "\n\t\t}\n\t}\n#endif\n}"); fflush(fout); return; } } } if (is_stdstring(typ) || is_stdwstring(typ)) { fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, const %s)\n{\t(void)soap; (void)a; /* appease -Wall -Werror */\n}", c_ident(typ), c_type_id(typ, "*a")); return; } switch(typ->type) { case Tclass: if (!is_volatile(typ) && typ->ref) /* fall through to switch case Tstruct */ { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); return; } if (!is_typedef(typ)) { self = "this"; fprintf(fout, "\n\nvoid %s::soap_serialize(struct soap *soap) const\n{\n\t(void)soap; /* appease -Wall -Werror */", ident(typ->id->name)); } else { self = "p"; fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, const %s)\n{\n\t(void)soap; (void)p; /* appease -Wall -Werror */", c_ident(typ), c_type_id(typ, "*p")); } fprintf(fout, "\n#ifndef WITH_NOIDREF"); table = (Table*)typ->ref; if (table && !is_invisible(typ->id->name)) { for (p = table->list; p; p = p->next) { if (is_pointer_to_derived(p)) { Tnode *ref = p->info.typ->ref; if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref)) fprintf(fout, "\n\tif (this->%s)\n\t{\tthis->%s->soap_serialize(soap);\n\t\treturn;\n\t}", ident(p->sym->name), ident(p->sym->name)); else if (!is_primitive_or_string(ref)) fprintf(fout, "\n\tif (this->%s)\n\t{\tsoap_serialize_%s(soap, this->%s);\n\t\treturn;\n\t}", ident(p->sym->name), c_ident(ref), ident(p->sym->name)); else fprintf(fout, "\n\tif (this->%s)\n\t\treturn;", ident(p->sym->name)); } } } for (p = table->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if ((p->info.sto & Sattribute)) ; else if (is_repetition(p)) { if (!is_XML(p->next->info.typ)) { fprintf(fout, "\n\tif (%s->%s::%s)", self, ident(table->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < (int)%s->%s::%s; i++)\n\t\t{", self, ident(table->sym->name), ident(p->sym->name)); if (!is_invisible(p->next->sym->name)) if (has_ptr((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_embedded(soap, %s->%s::%s + i, %s);", self, ident(table->sym->name), ident(p->next->sym->name), soap_type((Tnode*)p->next->info.typ->ref)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t%s->%s::%s[i].soap_serialize(soap);", self, ident(table->sym->name), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (char*const*)(%s->%s::%s + i));", c_ident((Tnode*)p->next->info.typ->ref), self, ident(table->sym->name), ident(p->next->sym->name)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (wchar_t*const*)(%s->%s::%s + i));", c_ident((Tnode*)p->next->info.typ->ref), self, ident(table->sym->name), ident(p->next->sym->name)); else if (!is_primitive((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, %s->%s::%s + i);", c_ident((Tnode*)p->next->info.typ->ref), self, ident(table->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\t}\n\t}"); } p = p->next; } else if (is_anytype(p)) { fprintf(fout, "\n\tsoap_markelement(soap, %s->%s, %s->%s);", self, ident(p->next->sym->name), self, ident(p->sym->name)); p = p->next; } else if (is_choice(p)) { fprintf(fout, "\n\tsoap_serialize_%s(soap, %s->%s::%s, &%s->%s::%s);", c_ident(p->next->info.typ), self, ident(table->sym->name), ident(p->sym->name), self, ident(table->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_transient(p->info.typ)) { if (!is_pointer_to_derived(p)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); } else if (p->info.typ->type == Tarray) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, %s->%s::%s, %s);", self, ident(table->sym->name), ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\tsoap_serialize_%s(soap, %s->%s::%s);", c_ident(p->info.typ), self, ident(table->sym->name), ident(p->sym->name)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &%s->%s::%s, %s);", self, ident(table->sym->name), ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\t%s->%s::%s.soap_serialize(soap);", self, ident(table->sym->name), ident(p->sym->name)); } else if (!is_void(p->info.typ) && !is_XML(p->info.typ)) { if (!is_template(p->info.typ)) if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &%s->%s::%s, %s);", self, ident(table->sym->name), ident(p->sym->name), soap_type(p->info.typ)); if (is_string(p->info.typ)) fprintf(fout, "\n\tsoap_serialize_%s(soap, (char*const*)&%s->%s::%s);", c_ident(p->info.typ), self, ident(table->sym->name), ident(p->sym->name)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\tsoap_serialize_%s(soap, (wchar_t*const*)&%s->%s::%s);", c_ident(p->info.typ), self, ident(table->sym->name), ident(p->sym->name)); else if ((p->info.typ->type == Treference || p->info.typ->type == Trvalueref) && ((Tnode*)(p->info.typ->ref))->type == Tclass && !is_external(p->info.typ->ref) && !is_volatile(p->info.typ->ref)) fprintf(fout, "\n\t%s->%s::%s.soap_serialize(soap);", self, ident(table->sym->name), ident(p->sym->name)); else if ((p->info.typ->type == Treference || p->info.typ->type == Trvalueref) && !is_primitive(p->info.typ->ref)) fprintf(fout, "\n\tsoap_serialize_%s(soap, &%s->%s::%s);", c_ident(p->info.typ), self, ident(table->sym->name), ident(p->sym->name)); else if (!is_primitive(p->info.typ) && p->info.typ->type != Treference && p->info.typ->type != Trvalueref) fprintf(fout, "\n\tsoap_serialize_%s(soap, &%s->%s::%s);", c_ident(p->info.typ), self, ident(table->sym->name), ident(p->sym->name)); else if (!is_primitive(p->info.typ)) fprintf(fout, "\n\t/* %s skipped */", ident(p->sym->name)); } } if (table && table->prev) fprintf(fout, "\n\t%s->%s::soap_serialize(soap);", self, ident(table->prev->sym->name)); fprintf(fout, "\n#endif\n}"); break; } /* fall through to next case when class is volatile, since serializers cannot be member functions */ case Tstruct: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, const %s)\n{", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */\n#ifndef WITH_NOIDREF"); table = (Table*)typ->ref; if (table && !is_invisible(typ->id->name)) { for (p = table->list; p; p = p->next) { if (is_pointer_to_derived(p)) { Tnode *ref = p->info.typ->ref; if (ref->type == Tclass && !is_external(ref) && !is_volatile(ref) && !is_typedef(ref)) fprintf(fout, "\n\tif (a->%s)\n\t{\ta->%s->soap_serialize(soap);\n\t\treturn;\n\t}", ident(p->sym->name), ident(p->sym->name)); else if (!is_primitive_or_string(ref)) fprintf(fout, "\n\tif (a->%s)\n\t{\tsoap_serialize_%s(soap, a->%s);\n\t\treturn;\n\t}", ident(p->sym->name), c_ident(ref), ident(p->sym->name)); else fprintf(fout, "\n\tif (a->%s)\n\t\treturn;", ident(p->sym->name)); } } } for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { if (!is_XML(p->next->info.typ)) { fprintf(fout, "\n\tif (a->%s)", ident(p->next->sym->name)); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < (int)a->%s; i++)\n\t\t{", ident(p->sym->name)); if (!is_invisible(p->next->sym->name)) if (has_ptr((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_embedded(soap, a->%s + i, %s);", ident(p->next->sym->name), soap_type((Tnode*)p->next->info.typ->ref)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\ta->%s[i].soap_serialize(soap);", ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (char*const*)(a->%s + i));", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, (wchar_t*const*)(a->%s + i));", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); else if (!is_primitive((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_serialize_%s(soap, a->%s + i);", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); fprintf(fout, "\n\t\t}\n\t}"); } p = p->next; } else if (is_anytype(p)) { fprintf(fout, "\n\tsoap_markelement(soap, a->%s, a->%s);", ident(p->next->sym->name), ident(p->sym->name)); p = p->next; } else if (is_choice(p)) { fprintf(fout, "\n\tsoap_serialize_%s(soap, a->%s, &a->%s);", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_transient(p->info.typ)) { if (!is_pointer_to_derived(p)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); } else if (p->info.typ->type == Tarray) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\tsoap_serialize_%s(soap, a->%s);", c_ident(p->info.typ), ident(p->sym->name)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\ta->%s.soap_serialize(soap);", ident(p->sym->name)); } else if (!is_void(p->info.typ) && !is_XML(p->info.typ)) { if (!is_template(p->info.typ)) if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); if (is_string(p->info.typ)) fprintf(fout, "\n\tsoap_serialize_%s(soap, (char*const*)&a->%s);", c_ident(p->info.typ), ident(p->sym->name)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\tsoap_serialize_%s(soap, (wchar_t*const*)&a->%s);", c_ident(p->info.typ), ident(p->sym->name)); else if ((p->info.typ->type == Treference || p->info.typ->type == Trvalueref) && ((Tnode*)(p->info.typ->ref))->type == Tclass && !is_external(p->info.typ->ref) && !is_volatile(p->info.typ->ref)) fprintf(fout, "\n\ta->%s.soap_serialize(soap);", ident(p->sym->name)); else if ((p->info.typ->type == Treference || p->info.typ->type == Trvalueref) && !is_primitive(p->info.typ->ref)) fprintf(fout, "\n\tsoap_serialize_%s(soap, &a->%s);", c_ident(p->info.typ), ident(p->sym->name)); else if (!is_primitive(p->info.typ) && p->info.typ->type != Treference && p->info.typ->type != Trvalueref) fprintf(fout, "\n\tsoap_serialize_%s(soap, &a->%s);", c_ident(p->info.typ), ident(p->sym->name)); else if (!is_primitive(p->info.typ)) fprintf(fout, "\n\t/* %s skipped */", ident(p->sym->name)); } } } fprintf(fout, "\n#endif\n}"); break; case Tunion: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*")); if (!typ->ref) return; fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, int choice, const %s)\n{", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)soap; (void)choice; (void)a; /* appease -Wall -Werror */\n#ifndef WITH_NOIDREF"); fprintf(fout, "\n\tswitch (choice)\n\t{"); table = (Table*)typ->ref; for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) ; else if (is_anytype(p)) ; else if (is_transient(p->info.typ)) { if (!is_pointer_to_derived(p)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); } else if (p->info.typ->type == Tarray) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); if (has_ptr(p->info.typ)) fprintf(fout, "\n\t\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\t\tsoap_serialize_%s(soap, a->%s);", c_ident(p->info.typ), ident(p->sym->name)); fprintf(fout, "\n\t\tbreak;"); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); if (has_ptr(p->info.typ)) fprintf(fout, "\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\t\ta->%s.soap_serialize(soap);", ident(p->sym->name)); fprintf(fout, "\n\t\tbreak;"); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_XML(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); if (has_ptr(p->info.typ)) fprintf(fout, "\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); if (!is_primitive(p->info.typ)) fprintf(fout, "\n\t\tsoap_serialize_%s(soap, &a->%s);", c_ident(p->info.typ), ident(p->sym->name)); fprintf(fout, "\n\t\tbreak;"); } } } fprintf(fout, "\n\tdefault:\n\t\tbreak;\n\t}\n#endif\n}"); break; case Tpointer: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, %s);", c_ident(typ), c_type_constptr_id(typ, "const*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, %s);", c_ident(typ), c_type_constptr_id(typ, "const*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, %s)\n{\n\t(void)soap; (void)a; /* appease -Wall -Werror */\n#ifndef WITH_NOIDREF", c_ident(typ), c_type_constptr_id(typ, "const*a")); temp = (Tnode*)typ->ref; if (!temp) return; if (is_string(typ) || is_wstring(typ)) fprintf(fout, "\n\t(void)soap_reference(soap, *a, %s);", soap_type(typ)); else if (is_primitive(temp)) fprintf(fout, "\n\t(void)soap_reference(soap, *a, %s);", soap_type(temp)); else { if (is_dynamic_array(temp)) fprintf(fout, "\n\tif (*a)"); else fprintf(fout, "\n\tif (!soap_reference(soap, *a, %s))", soap_type(temp)); if (temp->type == Tclass && !is_external(temp) && !is_volatile(temp) && !is_typedef(temp)) fprintf(fout, "\n\t\t(*a)->soap_serialize(soap);"); else fprintf(fout, "\n\t\tsoap_serialize_%s(soap, *a);", c_ident(temp)); } fprintf(fout, "\n#endif\n}"); break; case Tarray: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "const")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "const")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, %s)\n{", c_ident(typ), c_type_id(typ, "const a")); if (!is_primitive((Tnode*)typ->ref)) { fprintf(fout, "\n\tint i;"); fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */\n#ifndef WITH_NOIDREF"); fprintf(fout, "\n\tfor (i = 0; i < %d; i++)", get_dimension(typ)); (void)get_item_type(typ, &cardinality); fprintf(fout, "\n\t{"); if (has_ptr((Tnode*)typ->ref)) { fprintf(fout, "\tsoap_embedded(soap, a"); if (cardinality > 1) fprintf(fout, "[i]"); else fprintf(fout, "+i"); fprintf(fout, ", %s);", soap_type((Tnode*)typ->ref)); } if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { fprintf(fout, "\n\t\ta[i].soap_serialize(soap)"); } else if (!is_primitive((Tnode*)typ->ref)) { fprintf(fout, "\n\t\tsoap_serialize_%s(soap, a", c_ident((Tnode*)typ->ref)); if (cardinality > 1) { fprintf(fout, "[i])"); } else { fprintf(fout, "+i)"); } } fprintf(fout, ";\n\t}"); fprintf(fout, "\n#endif\n}"); } else fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */\n}"); break; case Ttemplate: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap*, const %s);", c_ident(typ), c_type_id(typ, "*")); temp = (Tnode*)typ->ref; if (!temp) return; fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_serialize_%s(struct soap *soap, const %s)\n{\n\t(void)soap; (void)a;/* appease -Wall -Werror */\n#ifndef WITH_NOIDREF", c_ident(typ), c_type_id(typ, "*a")); if (!is_XML(temp) && temp->type != Tfun && !is_void(temp)) { if (is_smart(typ)) { if (is_primitive(temp)) fprintf(fout, "\n\t(void)soap_reference(soap, a->get(), %s);", soap_type(temp)); else { if (is_dynamic_array(temp)) fprintf(fout, "\n\tif (a->get())"); else fprintf(fout, "\n\tif (!soap_reference(soap, a->get(), %s))", soap_type(temp)); if (temp->type == Tclass && !is_external(temp) && !is_volatile(temp) && !is_typedef(temp)) fprintf(fout, "\n\t\t(*a)->soap_serialize(soap);"); else fprintf(fout, "\n\t\tsoap_serialize_%s(soap, a->get());", c_ident(temp)); } } else if (!is_primitive(temp)) { fprintf(fout, "\n\tfor (%s::const_iterator i = a->begin(); i != a->end(); ++i)", c_type(typ)); if (temp->type == Tclass && !is_external(temp) && !is_volatile(temp) && !is_typedef(temp)) fprintf(fout, "\n\t\t(*i).soap_serialize(soap);"); else fprintf(fout, "\n\t\tsoap_serialize_%s(soap, &(*i));", c_ident(temp)); } } fprintf(fout, "\n#endif\n}"); default: break; } } void soap_default(Tnode* typ) { int i, d; Table *table, *t; Entry *p; const char *s; int cardinality; if (is_XML(typ)) return; if (typ->type == Tpointer && !is_string(typ) && !is_wstring(typ)) return; if (is_typedef(typ) && (is_template(typ) || is_element(typ) || is_restriction(typ) || is_external(typ) || is_imported(typ)) && (!is_external(typ) || is_volatile(typ))) { if (typ->type == Tclass && !is_stdstring(typ) && !is_stdwstring(typ) && !is_volatile(typ)) fprintf(fhead, "\n\n#define soap_default_%s(soap, a) (a)->%s::soap_default(soap)\n", c_ident(typ), t_ident(typ)); else if (typ->type == Tclass && is_eq(typ->sym->name, "xsd__QName")) fprintf(fhead, "\n\n#define soap_default_%s soap_default_std__string\n", c_ident(typ)); else fprintf(fhead, "\n\n#define soap_default_%s soap_default_%s\n", c_ident(typ), t_ident(typ)); return; } p = is_dynamic_array(typ); if (p) { if (typ->type == Tclass && !is_typedef(typ) && !is_volatile(typ)) { if (is_external(typ)) return; fprintf(fout, "\n\nvoid %s::soap_default(struct soap *soap)\n{", c_ident(typ)); if ((s = has_soapref(typ))) fprintf(fout, "\n\tthis->%s = soap;", s); else fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); if (is_smart(p->info.typ)) fprintf(fout, "\n\tthis->%s.reset();", ident(p->sym->name)); else fprintf(fout, "\n\tthis->%s = NULL;", ident(p->sym->name)); d = get_Darraydims(typ); if (d) { for (i = 0; i < d; i++) { fprintf(fout, "\n\tthis->__size[%d] = 0;", i); if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0) fprintf(fout, "\n\tthis->__offset[%d] = 0;", i); } } else { fprintf(fout, "\n\tthis->__size = 0;"); if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0) fprintf(fout, "\n\tthis->__offset = 0;"); } if (is_attachment(typ)) fprintf(fout, "\n\tthis->id = NULL;\n\tthis->type = NULL;\n\tthis->options = NULL;"); fprintf(fout, "\n}"); } else { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{", c_ident(typ), c_type_id(typ, "*a")); if ((s = has_soapref(typ))) fprintf(fout, "\n\ta->%s = soap;", s); else fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); d = get_Darraydims(typ); if (d) { for (i = 0; i < d; i++) { fprintf(fout, "\n\ta->__size[%d] = 0;", i); if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0) fprintf(fout, "\n\ta->__offset[%d] = 0;", i); } } else { fprintf(fout, "\n\ta->__size = 0;"); if (has_offset(typ) && (((Table*)typ->ref)->list->next->next->info.sto & Sconst) == 0) fprintf(fout, "\n\ta->__offset = 0;"); } if (is_attachment(typ)) fprintf(fout, "\n\ta->id = NULL;\n\ta->type = NULL;\n\ta->options = NULL;"); fprintf(fout, "\n}"); } fflush(fout); return; } if (is_primitive(typ) || is_string(typ) || is_wstring(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); return; } if (is_imported(typ) && typ->type == Tint && !typ->sym) fprintf(fout, "\n\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap *soap, %s)\n{\n\t(void)soap; /* appease -Wall -Werror */\n#ifdef SOAP_DEFAULT_%s\n\t*a = SOAP_DEFAULT_%s;\n#else\n\t*a = (%s)0;\n#endif\n}", c_ident(typ), c_type_id(typ, "*a"), c_ident(typ), c_ident(typ), c_type(typ)); else if (cflag) { fprintf(fhead, "\n\n#ifdef SOAP_DEFAULT_%s\n#define soap_default_%s(soap, a) (*(a) = SOAP_DEFAULT_%s)\n#else\n#define soap_default_%s(soap, a) (*(a) = (%s)0)\n#endif", c_ident(typ), c_ident(typ), c_ident(typ), c_ident(typ), c_type(typ)); } else fprintf(fhead, "\n\ninline void soap_default_%s(struct soap *soap, %s)\n{\n\t(void)soap; /* appease -Wall -Werror */\n#ifdef SOAP_DEFAULT_%s\n\t*a = SOAP_DEFAULT_%s;\n#else\n\t*a = (%s)0;\n#endif\n}", c_ident(typ), c_type_id(typ, "*a"), c_ident(typ), c_ident(typ), c_type(typ)); return; } if (is_fixedstring(typ)) { fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, char[]);", c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, char a[])\n{\n\t(void)soap; /* appease -Wall -Werror */\n\ta[0] = '\\0';\n}", c_ident(typ)); return; } if (is_stdstring(typ) || is_stdwstring(typ)) { fprintf(fhead, "\n\ninline void soap_default_%s(struct soap *soap, %s)\n{\n\t(void)soap; /* appease -Wall -Werror */\n\tp->erase();\n}", c_ident(typ), c_type_id(typ, "*p")); return; } switch(typ->type) { case Tclass: if (!is_volatile(typ) && !is_typedef(typ) && typ->ref) /* fall through to switch case Tstruct */ { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); return; } table=(Table*)typ->ref; fprintf(fout, "\n\nvoid %s::soap_default(struct soap *soap)\n{", ident(typ->id->name)); if ((s = has_soapref(typ))) fprintf(fout, "\n\tthis->%s = soap;", s); else fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); fflush(fout); if (table) { if (table->prev) fprintf(fout, "\n\tthis->%s::soap_default(soap);", ident(table->prev->sym->name)); for (p = table->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) continue; if (p->info.sto & Sconst) fprintf(fout, "\n\t/* const %s skipped */", ident(p->sym->name)); else if (is_choice(p)) { fprintf(fout, "\n\tthis->%s::%s = %d;", ident(table->sym->name), ident(p->sym->name), required_choice(p->next->info.typ)); p = p->next; } else if (is_repetition(p) || is_anytype(p)) { fprintf(fout, "\n\tthis->%s::%s = 0;\n\tthis->%s::%s = NULL;", ident(table->sym->name), ident(p->sym->name), ident(table->sym->name), ident(p->next->sym->name)); p = p->next; } else { if (is_fixedstring(p->info.typ)) { if (p->info.hasval) fprintf(fout, "\n\tsoap_strcpy(this->%s::%s, %d, \"%s\");", ident(table->sym->name), ident(p->sym->name), get_dimension(p->info.typ), cstring(p->info.val.s, 0)); else fprintf(fout, "\n\tthis->%s::%s[0] = '\\0';", ident(table->sym->name), ident(p->sym->name)); } else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tsoap_default_%s(soap, this->%s::%s);", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ) && !is_transient(p->info.typ)) fprintf(fout, "\n\tthis->%s::%s.%s::soap_default(soap);", ident(table->sym->name), ident(p->sym->name), c_ident(p->info.typ)); else if (p->info.hasval) fprintf(fout, "\n\tthis->%s::%s%s;", ident(table->sym->name), ident(p->sym->name), c_init(p)); else if (p->info.typ->type == Tpointer && (!is_string(p->info.typ) || is_XML(p->info.typ) || (p->info.sto & Sconstptr))) fprintf(fout, "\n\tthis->%s::%s = NULL;", ident(table->sym->name), ident(p->sym->name)); else if (is_transient(p->info.typ) || is_void(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.typ->type != Treference && p->info.typ->type != Trvalueref) fprintf(fout, "\n\tsoap_default_%s(soap, &this->%s::%s);", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name)); else fprintf(fout, "\n\t/* %s skipped */", ident(p->sym->name)); } } } fprintf(fout, "\n}"); fflush(fout); break; } case Tstruct: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{", c_ident(typ), c_type_id(typ, "*a")); fflush(fout); if ((s = has_soapref(typ))) fprintf(fout, "\n\ta->%s = soap;", s); else fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); table = (Table*)typ->ref; for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) continue; if (p->info.sto & Sconst) fprintf(fout, "\n\t/* const %s skipped */", ident(p->sym->name)); else if (p->info.sto & (Sprivate | Sprotected)) fprintf(fout, "\n\t/* private/protected %s skipped */", ident(p->sym->name)); else if (is_choice(p)) { fprintf(fout, "\n\ta->%s = %d;", ident(p->sym->name), required_choice(p->next->info.typ)); p = p->next; } else if (is_repetition(p) || is_anytype(p)) { fprintf(fout, "\n\ta->%s = 0;\n\ta->%s = NULL;", ident(p->sym->name), ident(p->next->sym->name)); p = p->next; } else { if (is_fixedstring(p->info.typ)) { if (p->info.hasval) fprintf(fout, "\n\tsoap_strcpy(a->%s, %d, \"%s\");", ident(p->sym->name), get_dimension(p->info.typ), cstring(p->info.val.s, 0)); else fprintf(fout, "\n\ta->%s[0] = '\\0';", ident(p->sym->name)); } else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tsoap_default_%s(soap, a->%s);", c_ident(p->info.typ), ident(p->sym->name)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ) && !is_transient(p->info.typ)) fprintf(fout, "\n\ta->%s.%s::soap_default(soap);", ident(p->sym->name), c_ident(p->info.typ)); else if (p->info.hasval) fprintf(fout, "\n\ta->%s%s;", ident(p->sym->name), c_init(p)); else if (p->info.typ->type == Tpointer && (!is_string(p->info.typ) || is_XML(p->info.typ) || (p->info.sto & Sconstptr))) fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); else if (is_transient(p->info.typ) || is_void(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.typ->type != Treference && p->info.typ->type != Trvalueref) fprintf(fout, "\n\tsoap_default_%s(soap, &a->%s);", c_ident(p->info.typ), ident(p->sym->name)); else fprintf(fout, "\n\t/* %s skipped */", ident(p->sym->name)); } } } fprintf(fout, "\n}"); fflush(fout); break; case Tarray: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{", c_ident(typ), c_type_id(typ, "a")); fprintf(fout, "\n\tint i;"); fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); fprintf(fout, "\n\tfor (i = 0; i < %d; i++)", get_dimension(typ)); (void)get_item_type(typ, &cardinality); if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref)) { if (cardinality>1) fprintf(fout, "a[i].%s::soap_default(soap)", t_ident((Tnode*)typ->ref)); else fprintf(fout, "(a+i)->soap_default(soap)"); } else if (((Tnode*)typ->ref)->type == Tpointer) fprintf(fout, "\n\t\ta[i] = NULL"); else { fprintf(fout, "\n\t\tsoap_default_%s(soap, a", c_ident((Tnode*)typ->ref)); if (cardinality>1) fprintf(fout, "[i])"); else fprintf(fout, "+i)"); } fprintf(fout, ";\n}"); break; case Ttemplate: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap*, %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_default_%s(struct soap *soap, %s)\n{", c_ident(typ), c_type_id(typ, "*p")); fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); if (is_smart(typ)) fprintf(fout, "\n\tp->reset();"); else fprintf(fout, "\n\tp->clear();"); fprintf(fout, "\n}"); fflush(fout); break; default: break; } } void soap_traverse(Tnode* typ) { int d; Table *table, *t; Entry *p; Tnode* temp; int cardinality; if (is_primitive_or_string(typ) || is_fixedstring(typ)) { fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{\t(void)soap; (void)q; /* appease -Wall -Werror */", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");\n}", soap_type(typ), c_type(typ)); return; } if (typ->type != Tclass || !(typ->sym && (is_stdstring(typ) || is_stdwstring(typ)) && is_eq(typ->sym->name, "xsd__QName")) || is_external(typ) || is_imported(typ)) if (is_typedef(typ) && !is_external(typ)) { if (typ->type == Tclass && !is_stdstring(typ) && !is_stdwstring(typ) && !is_volatile(typ)) fprintf(fhead, "\n\n#define soap_traverse_%s(soap, a, s, p, q) (a)->soap_traverse(soap, s, p, q)\n", c_ident(typ)); else if (typ->type == Tclass && is_eq(typ->sym->name, "xsd__QName")) fprintf(fhead, "\n\n#define soap_traverse_%s(soap, a, s, p, q) soap_traverse_std__string(soap, a, s, p, q)\n", c_ident(typ)); else fprintf(fhead, "\n\n#define soap_traverse_%s(soap, a, s, p, q) soap_traverse_%s(soap, a, s, p, q)\n", c_ident(typ), t_ident(typ)); return; } if (is_XML(typ)) { fprintf(fhead, "\n\n#define soap_traverse_%s(soap, a, s, p, q) soap_traverse_%s(soap, a, s, p, q)\n", c_ident(typ), t_ident(typ)); return; } if ((p = is_dynamic_array(typ))) { if (typ->type == Tclass && !is_volatile(typ)) { if (is_external(typ)) return; fprintf(fout, "\n\nvoid %s::soap_traverse(struct soap *soap, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ)); if (is_binary(typ)) { if (is_attachment(typ)) fprintf(fout, "\n\tif (this->%s && soap_attachment_reference(soap, this, this->%s, this->__size, %s, this->id, this->type))\n\t{", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); else fprintf(fout, "\n\tif (this->%s && !soap_array_reference(soap, this, this->%s, this->__size, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)this->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name); if (is_attachment(typ)) { fprintf(fout, "\n\t\tif (p) p(soap, (void*)this->id, SOAP_TYPE_string, \"id\", NULL);"); fprintf(fout, "\n\t\tif (q) q(soap, (void*)this->id, SOAP_TYPE_string, \"id\", NULL);"); fprintf(fout, "\n\t\tif (p) p(soap, (void*)this->type, SOAP_TYPE_string, \"type\", NULL);"); fprintf(fout, "\n\t\tif (q) q(soap, (void*)this->type, SOAP_TYPE_string, \"type\", NULL);"); fprintf(fout, "\n\t\tif (p) p(soap, (void*)this->options, 0, \"options\", NULL);"); fprintf(fout, "\n\t\tif (q) q(soap, (void*)this->options, 0, \"options\", NULL);"); } fprintf(fout, "\n\t\tif (q) q(soap, (void*)this->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name); fprintf(fout, "\n\t\tif (q) q(soap, (void*)this, %s, s, \"%s\");\n\t}\n}", soap_type(typ), c_type(typ)); fflush(fout); return; } else { d = get_Darraydims(typ); if (d) { fprintf(fout, "\n\tif (this->%s && !soap_array_reference(soap, this, this->%s, %s, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), get_Darraysize("this", d), soap_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tfor (size_t i = 0; i < soap_size(this->__size, %d); i++)", d); } else { fprintf(fout, "\n\tif (this->%s && !soap_array_reference(soap, this, this->%s, this->__size, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tfor (size_t i = 0; i < (size_t)this->__size; i++)"); } fprintf(fout, "\n\t\t{"); if (has_ptr((Tnode*)p->info.typ->ref)) fprintf(fout, "\tsoap_embedded(soap, this->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tthis->%s[i].soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name); else fprintf(fout, "\n\t\t\tsoap_traverse_%s(soap, this->%s + i, \"%s\", p, q);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), ident(p->sym->name)); fprintf(fout, "\n\t\t}\n\t\tif (q) q(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t}\n}"); return; } } else { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ), c_type_id(typ, "*a")); if (is_binary(typ)) { if (is_attachment(typ)) fprintf(fout, "\n\tif (a->%s && soap_attachment_reference(soap, a, a->%s, a->__size, %s, a->id, a->type))\n\t{", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); else fprintf(fout, "\n\tif (a->%s && !soap_array_reference(soap, a, a->%s, a->__size, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)a->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name); if (is_attachment(typ)) { fprintf(fout, "\n\t\tif (p) p(soap, (void*)a->id, SOAP_TYPE_string, \"id\", NULL);"); fprintf(fout, "\n\t\tif (q) q(soap, (void*)a->id, SOAP_TYPE_string, \"id\", NULL);"); fprintf(fout, "\n\t\tif (p) p(soap, (void*)a->type, SOAP_TYPE_string, \"type\", NULL);"); fprintf(fout, "\n\t\tif (q) q(soap, (void*)a->type, SOAP_TYPE_string, \"type\", NULL);"); fprintf(fout, "\n\t\tif (p) p(soap, (void*)a->options, 0, \"options\", NULL);"); fprintf(fout, "\n\t\tif (q) q(soap, (void*)a->options, 0, \"options\", NULL);"); } fprintf(fout, "\n\t\tif (q) q(soap, (void*)a->%s, 0, \"%s\", NULL);", ident(p->sym->name), p->sym->name); fprintf(fout, "\n\t\tif (q) q(soap, (void*)a, %s, s, \"%s\");\n\t}\n}", soap_type(typ), c_type(typ)); fflush(fout); return; } else { fprintf(fout, "\n\tsize_t i;"); d = get_Darraydims(typ); if (d) { fprintf(fout, "\n\tif (a->%s && !soap_array_reference(soap, a, a->%s, %s, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), get_Darraysize("a", d), soap_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tfor (i = 0; i < soap_size(a->__size, %d); i++)", d); } else { fprintf(fout, "\n\tif (a->%s && !soap_array_reference(soap, a, a->%s, a->__size, %s))\n\t{", ident(p->sym->name), ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tfor (i = 0; i < (size_t)a->__size; i++)"); } fprintf(fout, "\n\t\t{"); if (has_ptr((Tnode*)p->info.typ->ref)) fprintf(fout, "\tsoap_embedded(soap, a->%s + i, %s);", ident(p->sym->name), soap_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\ta->%s[i].soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name); else fprintf(fout, "\n\t\t\tsoap_traverse_%s(soap, a->%s + i, \"%s\", p, q);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), p->sym->name); fprintf(fout, "\n\t\t}\n\t\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\t}\n}"); fflush(fout); return; } } } switch(typ->type) { case Tclass: if (!is_volatile(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } table=(Table*)typ->ref; fprintf(fout, "\n\nvoid %s::soap_traverse(struct soap *soap, const char *s, soap_walker p, soap_walker q)\n{", ident(typ->id->name)); fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */"); fprintf(fout, "\n\tif (p) p(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { fprintf(fout, "\n\tif (this->%s::%s)", ident(t->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < (int)this->%s::%s; i++)\n\t\t{", ident(t->sym->name), ident(p->sym->name)); if (!is_invisible(p->next->sym->name)) if (has_ptr((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_embedded(soap, this->%s::%s + i, %s);", ident(t->sym->name), ident(p->next->sym->name), soap_type((Tnode*)p->next->info.typ->ref)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tthis->%s::%s[i].soap_traverse(soap, \"%s\", p, q);", ident(t->sym->name), ident(p->next->sym->name), p->next->sym->name); else fprintf(fout, "\n\t\t\tsoap_traverse_%s(soap, this->%s::%s + i, \"%s\", p, q);", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name), p->next->sym->name); fprintf(fout, "\n\t\t}\n\t}"); p = p->next; } else if (is_anytype(p)) { p = p->next; } else if (is_choice(p)) { fprintf(fout, "\n\tsoap_traverse_%s(soap, this->%s::%s, &this->%s::%s, \"%s\", p, q);", c_ident(p->next->info.typ), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name), p->next->sym->name); p = p->next; } else if (p->info.typ->type == Tarray) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, this->%s::%s, %s);", ident(t->sym->name), ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\tsoap_traverse_%s(soap, this->%s::%s, \"%s\", p, q);", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), p->sym->name); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &this->%s::%s, %s);", ident(t->sym->name), ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\tthis->%s::%s.soap_traverse(soap, \"%s\", p, q);", ident(t->sym->name), ident(p->sym->name), p->sym->name); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (!is_template(p->info.typ)) if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &this->%s::%s, %s);", ident(t->sym->name), ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\tsoap_traverse_%s(soap, &this->%s::%s, \"%s\", p, q);", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), p->sym->name); } } } fprintf(fout, "\n\tif (q) q(soap, (void*)this, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n}"); break; } /* fall through to next case when class is volatile, since serializers cannot be member functions */ case Tstruct: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); if (!typ->ref) return; fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); table=(Table*)typ->ref; for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { fprintf(fout, "\n\tif (a->%s)", ident(p->next->sym->name)); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < (int)a->%s; i++)\n\t\t{", ident(p->sym->name)); if (!is_invisible(p->next->sym->name)) if (has_ptr((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tsoap_embedded(soap, a->%s + i, %s);", ident(p->next->sym->name), soap_type((Tnode*)p->next->info.typ->ref)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\ta->%s[i].soap_traverse(soap, \"%s\", p, q);", ident(p->next->sym->name), p->next->sym->name); else fprintf(fout, "\n\t\t\tsoap_traverse_%s(soap, a->%s + i, \"%s\", p, q);", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name), p->next->sym->name); fprintf(fout, "\n\t\t}\n\t}"); p = p->next; } else if (is_anytype(p)) { p = p->next; } else if (is_choice(p)) { fprintf(fout, "\n\tsoap_traverse_%s(soap, a->%s, &a->%s, \"%s\", p, q);", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name), p->next->sym->name); p = p->next; } else if (p->info.typ->type == Tarray) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\tsoap_traverse_%s(soap, a->%s, \"%s\", p, q);", c_ident(p->info.typ), ident(p->sym->name), p->sym->name); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\ta->%s.soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (!is_template(p->info.typ)) if (has_ptr(p->info.typ)) fprintf(fout, "\n\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\tsoap_traverse_%s(soap, &a->%s, \"%s\", p, q);", c_ident(p->info.typ), ident(p->sym->name), p->sym->name); } } } fprintf(fout, "\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n}"); break; case Tunion: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, int, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } table = (Table*)typ->ref; fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, int, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, int choice, %s, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\tswitch (choice)\n\t{"); for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) ; else if (is_anytype(p)) ; else if (p->info.typ->type == Tarray) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); if (has_ptr(p->info.typ)) fprintf(fout, "\n\t\tsoap_embedded(soap, a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\t\tsoap_traverse_%s(soap, a->%s, \"%s\", p, q);", c_ident(p->info.typ), ident(p->sym->name), p->sym->name); fprintf(fout, "\n\t\tbreak;"); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); if (has_ptr(p->info.typ)) fprintf(fout, "\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\t\ta->%s.soap_traverse(soap, \"%s\", p, q);", ident(p->sym->name), p->sym->name); fprintf(fout, "\n\t\tbreak;"); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); if (has_ptr(p->info.typ)) fprintf(fout, "\n\t\tsoap_embedded(soap, &a->%s, %s);", ident(p->sym->name), soap_type(p->info.typ)); fprintf(fout, "\n\t\tsoap_traverse_%s(soap, &a->%s, \"%s\", p, q);", c_ident(p->info.typ), ident(p->sym->name), p->sym->name); fprintf(fout, "\n\t\tbreak;"); } } } fprintf(fout, "\n\tdefault:\n\t\tbreak;\n\t}"); fprintf(fout, "\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n}"); break; case Tpointer: if (((Tnode*)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ), c_type_id(typ, "*a")); p = is_dynamic_array((Tnode*)typ->ref); if (p) { d = get_Darraydims((Tnode*)typ->ref); if (d) fprintf(fout, "\n\tif (*a)"); else fprintf(fout, "\n\tif (*a)"); } else fprintf(fout, "\n\tif (!soap_reference(soap, *a, %s))", soap_type((Tnode*)typ->ref)); fprintf(fout, "\n\t\t(*a)->soap_traverse(soap, s, p, q);\n}"); } else { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{", c_ident(typ), c_type_id(typ, "*a")); if (is_primitive((Tnode*)typ->ref)) { fprintf(fout, "\n\tif (!soap_reference(soap, *a, %s))\n\t{", soap_type(typ)); fprintf(fout, "\n\t\tif (p) p(soap, (void*)*a, %s, s, \"%s\");", soap_type((Tnode*)typ->ref), c_type((Tnode*)typ->ref)); fprintf(fout, "\n\t\tif (q) q(soap, (void*)*a, %s, s, \"%s\");\n\t}\n}", soap_type((Tnode*)typ->ref), c_type((Tnode*)typ->ref)); } else if ((p = is_dynamic_array((Tnode*)typ->ref)) != NULL) { d = get_Darraydims((Tnode*)typ->ref); if (d) fprintf(fout, "\n\tif (*a)"); else fprintf(fout, "\n\tif (*a)"); fprintf(fout, "\n\t\tsoap_traverse_%s(soap, *a, s, p, q);\n}", c_ident((Tnode*)typ->ref)); } else { fprintf(fout, "\n\tif (!soap_reference(soap, *a, %s))", soap_type((Tnode*)typ->ref)); fprintf(fout, "\n\t\tsoap_traverse_%s(soap, *a, s, p, q);\n}", c_ident((Tnode*)typ->ref)); } } break; case Tarray: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type(typ)); fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)", c_ident(typ), c_type_id(typ, "a")); if (is_primitive((Tnode*)typ->ref)) { fprintf(fout, "\n{"); fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); } else { fprintf(fout, "\n{\n\tsize_t i;"); fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\tfor (i = 0; i < %d; i++)", get_dimension(typ)); (void)get_item_type(typ, &cardinality); fprintf(fout, "\n\t{"); if (has_ptr((Tnode*)typ->ref)) { fprintf(fout, "\tsoap_embedded(soap, a"); if (cardinality > 1) fprintf(fout, "[i]"); else fprintf(fout, "+i"); fprintf(fout, ", %s);", soap_type((Tnode*)typ->ref)); } if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { fprintf(fout, "\n\ta[i].soap_traverse(soap, s, p, q)"); } else if (!is_primitive((Tnode*)typ->ref)) { fprintf(fout, "\n\tsoap_traverse_%s(soap, a", c_ident((Tnode*)typ->ref)); if (cardinality > 1) fprintf(fout, "[i], s, p, q)"); else fprintf(fout, "+i, s, p, q)"); } fprintf(fout, ";\n\t}"); } fprintf(fout, "\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n}"); break; case Ttemplate: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 void SOAP_FMAC2 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap*, %s, const char *s, soap_walker p, soap_walker q);", c_ident(typ), c_type_id(typ, "*")); temp = (Tnode*)typ->ref; if (!temp) return; fprintf(fout, "\n\nSOAP_FMAC3 void SOAP_FMAC4 soap_traverse_%s(struct soap *soap, %s, const char *s, soap_walker p, soap_walker q)\n{\n\t(void)soap; (void)a; (void)s; (void)p; (void)q; /* appease -Wall -Werror */", c_ident(typ), c_type_id(typ, "*a")); if (!is_primitive(temp) && temp->type != Tfun && !is_void(temp)) { fprintf(fout, "\n\tif (p) p(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); fprintf(fout, "\n\tfor (%s::iterator i = a->begin(); i != a->end(); ++i)", c_type(typ)); if (temp->type == Tclass && !is_external(temp) && !is_volatile(temp) && !is_typedef(temp)) fprintf(fout, "\n\t\t(*i).soap_traverse(soap, s, p, q);"); else fprintf(fout, "\n\t\tsoap_traverse_%s(soap, &(*i), s, p, q);", c_ident(temp)); fprintf(fout, "\n\tif (q) q(soap, (void*)a, %s, s, \"%s\");", soap_type(typ), c_type(typ)); } fprintf(fout, "\n}"); default: break; } } void soap_put(Tnode *typ) { const char *ci = c_ident(typ); const char *ct = c_type(typ); if (is_XML(typ)) return; if (typ->type == Ttemplate || typ->type == Tunion) return; if (is_typedef(typ) && (is_template(typ) /*|| is_element(typ) don't permit for typedef'd elements */ || is_synonym(typ) || is_external(typ) || is_imported(typ)) && (!is_external(typ) || is_volatile(typ))) { fprintf(fhead, "\n\n#define soap_put_%s soap_put_%s\n", c_ident(typ), t_ident(typ)); fprintf(fhead, "\n\n#define soap_write_%s soap_write_%s\n", c_ident(typ), t_ident(typ)); fprintf(fhead, "\n\n#define soap_PUT_%s soap_PUT_%s\n", c_ident(typ), t_ident(typ)); fprintf(fhead, "\n\n#define soap_PATCH_%s soap_PATCH_%s\n", c_ident(typ), t_ident(typ)); fprintf(fhead, "\n\n#define soap_POST_send_%s soap_POST_send_%s\n", c_ident(typ), t_ident(typ)); return; } if (typ->type == Tarray) { fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap*, %s, const char*, const char*);", ci, c_type_id(typ, "const")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap *soap, %s, const char *tag, const char *type)\n{", ci, c_type_id(typ, "const a")); } else if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) fprintf(fout, "\n\nint %s::soap_put(struct soap *soap, const char *tag, const char *type) const\n{", ct); else if (typ->type == Tpointer) { fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap*, %s, const char*, const char*);", ci, c_type_constptr_id(typ, "const*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap *soap, %s, const char *tag, const char *type)\n{", ci, c_type_constptr_id(typ, "const*a")); } else { fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap*, const %s, const char*, const char*);", ci, c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_put_%s(struct soap *soap, const %s, const char *tag, const char *type)\n{", ci, c_type_id(typ, "*a")); } fflush(fout); if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, tag ? tag : \"%s\", -2, this, type))\n\t\treturn soap->error;", ci, xml_tag(typ)); else fprintf(fout, "\n\tif (soap_out_%s(soap, tag ? tag : \"%s\", -2, a, type))\n\t\treturn soap->error;", ci, xml_tag(typ)); if (!is_invisible(typ->id->name)) fprintf(fout, "\n\treturn soap_putindependent(soap);\n}"); else fprintf(fout, "\n\treturn SOAP_OK;\n}"); if ((typ->type != Tpointer || is_string(typ) || is_wstring(typ)) && typ->type != Tarray && typ->type != Treference && typ->type != Trvalueref && !is_template(typ) && !is_anyAttribute(typ)) { const char *x = xsi_type_u(typ); if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && (!is_typedef(typ) || is_element(typ) /* don't permit for typedef'd elements, see above */)) { fprintf(fhead, "\n\ninline int soap_write_%s(struct soap *soap, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_begin_send(soap) || (p->soap_serialize(soap), 0) || p->soap_put(soap, \"%s\", p->soap_type() == %s ? \"%s\" : NULL) || soap_end_send(soap))\n\t\treturn soap->error;\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), xml_tag(typ), soap_type(typ), x); fprintf(fhead, "\n\ninline int soap_PUT_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_PUT(soap, URL, NULL, \"text/xml; charset=utf-8\") || (p->soap_serialize(soap), 0) || p->soap_put(soap, \"%s\", p->soap_type() == %s ? \"%s\" : NULL) || soap_end_send(soap) || soap_recv_empty_response(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), xml_tag(typ), soap_type(typ), x); fprintf(fhead, "\n\ninline int soap_PATCH_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_PATCH(soap, URL, NULL, \"text/xml; charset=utf-8\") || (p->soap_serialize(soap), 0) || p->soap_put(soap, \"%s\", p->soap_type() == %s ? \"%s\" : NULL) || soap_end_send(soap) || soap_recv_empty_response(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), xml_tag(typ), soap_type(typ), x); fprintf(fhead, "\n\ninline int soap_POST_send_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_POST(soap, URL, NULL, \"text/xml; charset=utf-8\") || (p->soap_serialize(soap), 0) || p->soap_put(soap, \"%s\", p->soap_type() == %s ? \"%s\" : NULL) || soap_end_send(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), xml_tag(typ), soap_type(typ), x); } else if (is_primitive_or_string(typ)) { if (cflag) fprintf(fhead, "\n\n#ifndef soap_write_%s\n#define soap_write_%s(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || soap_put_%s(soap, data, \"%s\", \"%s\") || soap_end_send(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), xml_tag(typ), x); else if (namespaceid && !is_external(typ)) fprintf(fhead, "\n\ninline int soap_write_%s(struct soap *soap, %s)\n{\n\tsoap_free_temp(soap);\n\tif (p)\n\t{\tif (soap_begin_send(soap) || %s::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap))\n\t\t\treturn soap->error;\n\t}\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), namespaceid, c_ident(typ), xml_tag(typ), x); else if (!is_external(typ)) fprintf(fhead, "\n\ninline int soap_write_%s(struct soap *soap, %s)\n{\n\tsoap_free_temp(soap);\n\tif (p)\n\t{\tif (soap_begin_send(soap) || ::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap))\n\t\t\treturn soap->error;\n\t}\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), xml_tag(typ), x); else fprintf(fhead, "\n\ninline int soap_write_%s(struct soap *soap, %s)\n{\n\tsoap_free_temp(soap);\n\tif (p)\n\t{\tif (soap_begin_send(soap) || soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap))\n\t\t\treturn soap->error;\n\t}\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), xml_tag(typ), x); if (cflag) fprintf(fhead, "\n\n#ifndef soap_PUT_%s\n#define soap_PUT_%s(soap, URL, data) ( soap_free_temp(soap), soap_PUT(soap, URL, NULL, \"text/xml; charset=utf-8\") || soap_put_%s(soap, data, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap), soap_closesock(soap) )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), xml_tag(typ), x); else if (namespaceid && !is_external(typ)) fprintf(fhead, "\n\ninline int soap_PUT_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_PUT(soap, URL, NULL, \"text/xml; charset=utf-8\") || %s::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), namespaceid, c_ident(typ), xml_tag(typ), x); else if (!is_external(typ)) fprintf(fhead, "\n\ninline int soap_PUT_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_PUT(soap, URL, NULL, \"text/xml; charset=utf-8\") || ::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), xml_tag(typ), x); else fprintf(fhead, "\n\ninline int soap_PUT_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_PUT(soap, URL, NULL, \"text/xml; charset=utf-8\") || soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), xml_tag(typ), x); if (cflag) fprintf(fhead, "\n\n#ifndef soap_PATCH_%s\n#define soap_PATCH_%s(soap, URL, data) ( soap_free_temp(soap), soap_PATCH(soap, URL, NULL, \"text/xml; charset=utf-8\") || soap_put_%s(soap, data, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap), soap_closesock(soap) )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), xml_tag(typ), x); else if (namespaceid && !is_external(typ)) fprintf(fhead, "\n\ninline int soap_PATCH_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_PATCH(soap, URL, NULL, \"text/xml; charset=utf-8\") || %s::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), namespaceid, c_ident(typ), xml_tag(typ), x); else if (!is_external(typ)) fprintf(fhead, "\n\ninline int soap_PATCH_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_PATCH(soap, URL, NULL, \"text/xml; charset=utf-8\") || ::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), xml_tag(typ), x); else fprintf(fhead, "\n\ninline int soap_PATCH_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_PATCH(soap, URL, NULL, \"text/xml; charset=utf-8\") || soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), xml_tag(typ), x); if (cflag) fprintf(fhead, "\n\n#ifndef soap_POST_send_%s\n#define soap_POST_send_%s(soap, URL, data) ( soap_free_temp(soap), ( soap_POST(soap, URL, NULL, \"text/xml; charset=utf-8\") || soap_put_%s(soap, data, \"%s\", \"%s\") || soap_end_send(soap) ) && soap_closesock(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), xml_tag(typ), x); else if (namespaceid && !is_external(typ)) fprintf(fhead, "\n\ninline int soap_POST_send_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_POST(soap, URL, NULL, \"text/xml; charset=utf-8\") || %s::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), namespaceid, c_ident(typ), xml_tag(typ), x); else if (!is_external(typ)) fprintf(fhead, "\n\ninline int soap_POST_send_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_POST(soap, URL, NULL, \"text/xml; charset=utf-8\") || ::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), xml_tag(typ), x); else fprintf(fhead, "\n\ninline int soap_POST_send_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_POST(soap, URL, NULL, \"text/xml; charset=utf-8\") || soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), xml_tag(typ), x); } else { if (cflag) fprintf(fhead, "\n\n#ifndef soap_write_%s\n#define soap_write_%s(soap, data) ( soap_free_temp(soap), soap_begin_send(soap) || (soap_serialize_%s(soap, data), 0) || soap_put_%s(soap, data, \"%s\", \"%s\") || soap_end_send(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), c_ident(typ), xml_tag(typ), x); else if (namespaceid && !is_external(typ)) fprintf(fhead, "\n\ninline int soap_write_%s(struct soap *soap, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_begin_send(soap) || (%s::soap_serialize_%s(soap, p), 0) || %s::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap))\n\t\t\treturn soap->error;\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), namespaceid, c_ident(typ), namespaceid, c_ident(typ), xml_tag(typ), x); else if (!is_external(typ)) fprintf(fhead, "\n\ninline int soap_write_%s(struct soap *soap, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_begin_send(soap) || (::soap_serialize_%s(soap, p), 0) || ::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap))\n\t\t\treturn soap->error;\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), c_ident(typ), xml_tag(typ), x); else fprintf(fhead, "\n\ninline int soap_write_%s(struct soap *soap, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_begin_send(soap) || (soap_serialize_%s(soap, p), 0) || soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap))\n\t\t\treturn soap->error;\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), c_ident(typ), xml_tag(typ), x); if (cflag) fprintf(fhead, "\n\n#ifndef soap_PUT_%s\n#define soap_PUT_%s(soap, URL, data) ( soap_free_temp(soap), soap_PUT(soap, URL, NULL, \"text/xml; charset=utf-8\") || (soap_serialize_%s(soap, data), 0) || soap_put_%s(soap, data, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap), soap_closesock(soap) )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), c_ident(typ), xml_tag(typ), x); else if (namespaceid && !is_external(typ)) fprintf(fhead, "\n\ninline int soap_PUT_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_PUT(soap, URL, NULL, \"text/xml; charset=utf-8\") || (%s::soap_serialize_%s(soap, p), 0) || %s::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), namespaceid, c_ident(typ), namespaceid, c_ident(typ), xml_tag(typ), x); else if (!is_external(typ)) fprintf(fhead, "\n\ninline int soap_PUT_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_PUT(soap, URL, NULL, \"text/xml; charset=utf-8\") || (::soap_serialize_%s(soap, p), 0) || ::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), c_ident(typ), xml_tag(typ), x); else fprintf(fhead, "\n\ninline int soap_PUT_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_PUT(soap, URL, NULL, \"text/xml; charset=utf-8\") || (soap_serialize_%s(soap, p), 0) || soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), c_ident(typ), xml_tag(typ), x); if (cflag) fprintf(fhead, "\n\n#ifndef soap_PATCH_%s\n#define soap_PATCH_%s(soap, URL, data) ( soap_free_temp(soap), soap_PATCH(soap, URL, NULL, \"text/xml; charset=utf-8\") || (soap_serialize_%s(soap, data), 0) || soap_put_%s(soap, data, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap), soap_closesock(soap) )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), c_ident(typ), xml_tag(typ), x); else if (namespaceid && !is_external(typ)) fprintf(fhead, "\n\ninline int soap_PATCH_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_PATCH(soap, URL, NULL, \"text/xml; charset=utf-8\") || (%s::soap_serialize_%s(soap, p), 0) || %s::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), namespaceid, c_ident(typ), namespaceid, c_ident(typ), xml_tag(typ), x); else if (!is_external(typ)) fprintf(fhead, "\n\ninline int soap_PATCH_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_PATCH(soap, URL, NULL, \"text/xml; charset=utf-8\") || (::soap_serialize_%s(soap, p), 0) || ::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), c_ident(typ), xml_tag(typ), x); else fprintf(fhead, "\n\ninline int soap_PATCH_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_PATCH(soap, URL, NULL, \"text/xml; charset=utf-8\") || (soap_serialize_%s(soap, p), 0) || soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap) || soap_recv_empty_response(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), c_ident(typ), xml_tag(typ), x); if (cflag) fprintf(fhead, "\n\n#ifndef soap_POST_send_%s\n#define soap_POST_send_%s(soap, URL, data) ( soap_free_temp(soap), ( soap_POST(soap, URL, NULL, \"text/xml; charset=utf-8\") || (soap_serialize_%s(soap, data), 0) || soap_put_%s(soap, data, \"%s\", \"%s\") || soap_end_send(soap) ) && soap_closesock(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), c_ident(typ), xml_tag(typ), x); else if (namespaceid && !is_external(typ)) fprintf(fhead, "\n\ninline int soap_POST_send_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_POST(soap, URL, NULL, \"text/xml; charset=utf-8\") || (%s::soap_serialize_%s(soap, p), 0) || %s::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), namespaceid, c_ident(typ), namespaceid, c_ident(typ), xml_tag(typ), x); else if (!is_external(typ)) fprintf(fhead, "\n\ninline int soap_POST_send_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_POST(soap, URL, NULL, \"text/xml; charset=utf-8\") || (::soap_serialize_%s(soap, p), 0) || ::soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), c_ident(typ), xml_tag(typ), x); else fprintf(fhead, "\n\ninline int soap_POST_send_%s(struct soap *soap, const char *URL, %s)\n{\n\tsoap_free_temp(soap);\n\tif (soap_POST(soap, URL, NULL, \"text/xml; charset=utf-8\") || (soap_serialize_%s(soap, p), 0) || soap_put_%s(soap, p, \"%s\", \"%s\") || soap_end_send(soap))\n\t\treturn soap_closesock(soap);\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_constptr_id(typ, "const*p"), c_ident(typ), c_ident(typ), xml_tag(typ), x); } } fflush(fout); } Entry * is_dynamic_array(Tnode *typ) { Entry *p; Table *t; if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) { for (t = (Table*)typ->ref; t; t = t->prev) { p = t->list; while (p && p->info.typ->type == Tfun) p = p->next; if (p && (p->info.typ->type == Tpointer || is_smart(p->info.typ)) && !strncmp(ident(p->sym->name), "__ptr", 5)) if (p->next && (p->next->info.typ->type == Tint || (p->next->info.typ->type == Tarray && (((Tnode*)p->next->info.typ->ref)->type == Tint))) && !strncmp(ident(p->next->sym->name), "__size", 6)) return p; } } return NULL; } Entry * is_discriminant(Tnode *typ) { Entry *p; Table *t; if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) { t = (Table*)typ->ref; /* only if this struct/class has a union and is not derived */ if (t && !t->prev) { p = t->list; if (p && p->info.typ->type == Tint && ((p->info.sto & Sspecial) || !strncmp(ident(p->sym->name), "__union", 7))) if (p->next && p->next->info.typ->type == Tunion) { Entry *q; for (q = p->next->next; q; q = q->next) { if (q->info.typ->type != Tfun && !is_void(q->info.typ) && !is_transient(q->info.typ)) return NULL; } return p; } } } return NULL; } int get_Darraydims(Tnode *typ) { Entry *p; Table *t; if ((typ->type == Tstruct || typ->type == Tclass) && typ->ref) { for (t = (Table*)typ->ref; t; t = t->prev) { p = t->list; while (p && p->info.typ->type == Tfun) p = p->next; if (p && (p->info.typ->type == Tpointer || is_smart(p->info.typ)) && !strncmp(ident(p->sym->name), "__ptr", 5)) if (p->next && p->next->info.typ->type == Tarray && ((Tnode*)p->next->info.typ->ref)->type == Tint && !strncmp(ident(p->next->sym->name), "__size", 6)) return get_dimension(p->next->info.typ); } } return 0; } const char* get_Darraysize(const char *a, int d) { int i; char *s = (char*)emalloc(d * (strlen(a) + 16) + 1); *s = '\0'; for (i = 0; i < d; i++) { size_t l = strlen(s); sprintf(s + l, "%s%s->__size[%d]", i ? " * " : "", a, i); } return s; } int has_offset(Tnode *typ) { Entry *p; Table *t; if (typ->type == Tstruct || typ->type == Tclass) { for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if ((p->info.typ->type == Tint || (p->info.typ->type == Tarray && ((Tnode*)p->info.typ->ref)->type == Tint)) && !strcmp(ident(p->sym->name), "__offset")) return 1; } } } return 0; } int is_bool(Tnode *typ) { return (typ->type == Tenum && (Table*)typ->ref == booltable); } int is_boolean(Tnode *typ) { if (typ->type == Tenum) { if ((Table*)typ->ref == booltable) return 1; else { size_t n = strlen(ident(typ->id->name)); return n >= 7 && is_eq(ident(typ->id->name) + n - 7, "boolean"); } } return 0; } int is_hexBinary(Tnode *typ) { Table *t; if (!is_binary(typ)) return 0; if ((typ->synonym && typ->synonym->name && strstr(typ->synonym->name, "hex")) || (typ->sym && typ->sym->name && strstr(typ->sym->name, "hex")) || (typ->id && typ->id->name && strstr(typ->id->name, "hex"))) return 1; for (t = (Table*)typ->ref; t; t = t->prev) if (t->sym && t->sym->name && strstr(t->sym->name, "hex")) return 1; return 0; } int is_binary(Tnode *typ) { if (!has_ns(typ) && !is_element(typ)) return 0; if (typ->type == Tstruct || typ->type == Tclass) { Table *t; for (t = (Table*)typ->ref; t; t = t->prev) { Entry *p; p = t->list; while (p && p->info.typ->type == Tfun) p = p->next; if (p && (p->info.typ->type == Tpointer || is_smart(p->info.typ)) && ((Tnode*)p->info.typ->ref)->type == Tuchar && !strcmp(ident(p->sym->name), "__ptr")) { p = p->next; return p && p->info.typ->type == Tint && !strncmp(ident(p->sym->name), "__size", 6); } } } return 0; } int is_attachment(Tnode *typ) { Entry *p; Table *t; if (!is_binary(typ) || is_transient(typ)) return 0; for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (is_string(p->info.typ) && !strcmp(p->sym->name, "id")) { p = p->next; if (!p || !is_string(p->info.typ) || strcmp(p->sym->name, "type")) break; p = p->next; if (!p || !is_string(p->info.typ) || strcmp(p->sym->name, "options")) break; return 1; } } } return 0; } int is_mutable(Entry *e) { return e->info.typ->transient == -4 || is_header_or_fault(e->info.typ); } int is_header_or_fault(Tnode *typ) { if (typ->type == Tpointer || typ->type == Treference) return is_header_or_fault((Tnode*)typ->ref); return (typ->type == Tstruct || typ->type == Tclass) && (!strcmp(ident(typ->id->name), "SOAP_ENV__Header") || !strcmp(ident(typ->id->name), "SOAP_ENV__Fault") || !strcmp(ident(typ->id->name), "SOAP_ENV__Text") || !strcmp(ident(typ->id->name), "SOAP_ENV__Code") || !strcmp(ident(typ->id->name), "SOAP_ENV__Detail") || !strcmp(ident(typ->id->name), "SOAP_ENV__Reason")); } int is_body(Tnode *typ) { if (typ->type == Tpointer || typ->type == Treference) return is_body((Tnode*)typ->ref); return (typ->type == Tstruct || typ->type == Tclass) && !strcmp(ident(typ->id->name), "SOAP_ENV__Body"); } long minlen(Tnode *typ) { if (!typ->hasmin || typ->imin < 0) return 0; if (typ->imin > 2147483647) return 2147483647; if (typ->incmin) return (long)typ->imin; return (long)typ->imin + 1; } long maxlen(Tnode *typ) { if (!typ->hasmax || typ->imax < 0) return -1; if (typ->imax > 2147483647) return 2147483647; if (typ->incmax) return (long)typ->imax; return (long)typ->imax - 1; } const char* pattern(Tnode *typ) { if (!typ->pattern || (typ->pattern[0] == '%' && typ->pattern[1])) return "NULL"; return cstring(typ->pattern, 1); } int is_soap12(const char *enc) { return !strcmp(envURI, "http://www.w3.org/2003/05/soap-envelope") || (enc && !strcmp(enc, "http://www.w3.org/2003/05/soap-encoding")); } int is_document(const char *style) { return soap_version < 0 || (!eflag && !style) || (style && !strcmp(style, "document")); } int is_literal(const char *encoding) { return soap_version < 0 || (!eflag && !encoding) || (encoding && !strcmp(encoding, "literal")); } const char * has_soapref(Tnode *typ) { Entry *p; Table *t; if (typ->type == Tstruct || typ->type == Tclass) for (t = (Table*)typ->ref; t; t = t->prev) for (p = t->list; p; p = p->next) if (is_soapref(p->info.typ) && (t == (Table*)typ->ref || !(p->info.sto & Sprivate))) return ident(p->sym->name); return NULL; } int is_soapref(Tnode *typ) { return typ->type == Tpointer && ((Tnode*)typ->ref)->type == Tstruct && ((Tnode*)typ->ref)->id == lookup("soap"); } const char * union_member(Tnode *typ) { Table *t; Entry *p, *q; for (p = classtable->list; p; p = p->next) { if (p->info.typ->type == Tunion) { for (t = (Table*)p->info.typ->ref; t; t = t->prev) for (q = t->list; q; q = q->next) if (typ == q->info.typ) return p->info.typ->id->name; } else { for (t = (Table*)p->info.typ->ref; t; t = t->prev) { for (q = t->list; q; q = q->next) { if (typ == q->info.typ) { const char *s = union_member(p->info.typ); if (s) return s; } } } } } return NULL; } int has_union(Tnode *typ) { Table *t; Entry *p; if (typ->type == Tclass || typ->type == Tstruct) { for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tunion) return 1; else if ((p->info.typ->type == Tstruct || p->info.typ->type == Tclass) && has_union(p->info.typ)) return 1; } } } return 0; } int has_constructor(Tnode *typ) { Table *t; Entry *p; if (typ->type == Tclass || typ->type == Tstruct) for (t = (Table*)typ->ref; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->info.typ->type == Tfun && !strcmp(p->sym->name, typ->id->name) && ((FNinfo *)p->info.typ->ref)->ret->type == Tnone) if (!((FNinfo*)p->info.typ->ref)->args->list) return 1; return 0; } int has_destructor(Tnode *typ) { Entry *p; Table *t; if (typ->type == Tclass || typ->type == Tstruct) for (t = (Table*)typ->ref; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->info.typ->type == Tfun && strchr(p->sym->name, '~')) return 1; return 0; } int has_getter(Tnode *typ) { Entry *p, *q; Table *t; if (typ->type == Tclass || (!cflag && typ->type == Tstruct)) { for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !strcmp(p->sym->name, "get") && ((FNinfo *)p->info.typ->ref)->ret->type == Tint) { q = ((FNinfo*)p->info.typ->ref)->args->list; if (q && q->info.typ->type == Tpointer && ((Tnode*)q->info.typ->ref)->type == Tstruct && ((Tnode*)q->info.typ->ref)->id == lookup("soap")) return 1; } } } } return 0; } int has_setter(Tnode *typ) { Entry *p, *q; Table *t; if (typ->type == Tclass || (!cflag && typ->type == Tstruct)) { for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun && !strcmp(p->sym->name, "set") && ((FNinfo *)p->info.typ->ref)->ret->type == Tint) { q = ((FNinfo*)p->info.typ->ref)->args->list; if (q && q->info.typ->type == Tpointer && ((Tnode*)q->info.typ->ref)->type == Tstruct && ((Tnode*)q->info.typ->ref)->id == lookup("soap")) return 1; } } } } return 0; } const char* kind_of(Tnode *typ) { if (is_bool(typ)) return "bool"; if (is_attachment(typ)) return "base64 binary or attachment"; if (is_hexBinary(typ)) return "hex binary"; if (is_binary(typ)) return "base64 binary"; if (is_stdstring(typ)) return "std::string"; if (is_stdwstring(typ)) return "std::wstring"; if (is_external(typ)) return "custom"; if (is_string(typ)) return "string"; if (is_wstring(typ)) return "wide string"; if (typ->type == Tenum || typ->type == Tenumsc) return "enum"; if (is_primitive(typ)) return c_type(typ); if (typ->type == Tclass) return "class"; if (typ->type == Tstruct) return "struct"; if (is_smart(typ)) return "smart pointer"; if (is_template(typ)) return "container"; return ""; } int is_primitive_or_string(Tnode *typ) { return is_primitive(typ) || is_string(typ) || is_wstring(typ) || is_stdstring(typ) || is_stdwstring(typ) || is_qname(typ) || is_stdqname(typ); } int is_primitive(Tnode *typ) { return typ->type >= Tchar && typ->type <= Tenumsc; } int is_string(Tnode *typ) { return typ->type == Tpointer && ((Tnode*)typ->ref)->type == Tchar && !((Tnode*)typ->ref)->sym; } int is_fixedstring(Tnode *typ) { return bflag && typ->type == Tarray && ((Tnode*)typ->ref)->type == Tchar; } int is_wstring(Tnode *typ) { return typ->type == Tpointer && ((Tnode*)typ->ref)->type == Twchar; } int is_stdstring(Tnode *typ) { return typ->type == Tclass && typ->id == lookup("std::string"); } int is_stdwstring(Tnode *typ) { return typ->type == Tclass && typ->id == lookup("std::wstring"); } int is_stdstr(Tnode *typ) { if (typ->type == Tpointer) return is_stdstring((Tnode*)typ->ref) || is_stdwstring((Tnode*)typ->ref); return is_stdstring(typ) || is_stdwstring(typ); } int is_typedef(Tnode *typ) { return typ->sym && !is_transient(typ); } int is_restriction(Tnode *typ) { return is_typedef(typ) && typ->restriction; } int has_restriction_base(Tnode *typ, const char *base) { while (typ) { Entry *p; if (typ->sym && is_eq(typ->sym->name, base)) return 1; if (!typ->restriction) break; if (is_eq(typ->restriction->name, base)) return 1; p = entry(typetable, typ->restriction); if (!p) break; typ = p->info.typ; } return 0; } int is_synonym(Tnode *typ) { return is_typedef(typ) && typ->synonym; } int reflevel(Tnode *typ) { int level; for (level = 0; typ->type == Tpointer || is_smart(typ); level++) typ = (Tnode*)typ->ref; return level; } Tnode * reftype(Tnode *typ) { while ((typ->type == Tpointer && !is_string(typ) && !is_wstring(typ)) || typ->type == Treference || typ->type == Trvalueref || is_smart(typ)) typ = (Tnode*)typ->ref; return typ; } void soap_set_attr(Entry *p, const char *obj, const char *name, const char *tag) { Tnode *typ = p->info.typ; if (p->info.sto & (Sconst | Sprivate | Sprotected)) return; if (typ->type == Treference || typ->type == Trvalueref) typ = typ->ref; if (p->info.minOccurs == 0 && (typ->type != Tpointer || is_string(typ) || is_wstring(typ)) && p->info.hasval && !p->info.ptrval && !p->info.fixed) { if (is_string(typ)) fprintf(fout, "\n\tif (!%s->%s || strcmp(%s->%s, %s))\n\t{\t", obj, name, obj, name, c_init_a(p, "")); else if (is_wstring(typ)) fprintf(fout, "\n\tif (!%s->%s || wcscmp(%s->%s, %s))\n\t{\t", obj, name, obj, name, c_init_a(p, "")); else fprintf(fout, "\n\tif (%s->%s != %s)\n\t{\t", obj, name, c_init_a(p, "")); } else fprintf(fout, "\n\t"); if ((is_external(typ) || is_typedef(typ)) && !is_anyAttribute(typ) && !is_anyType(typ) && !is_smart(typ) && typ->type != Tpointer && !is_stdstr(typ) && !is_string(typ) && !is_wstring(typ) && !is_binary(typ)) fprintf(fout, "soap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, c_ident(typ), obj, name); else if (is_XML(typ)) { if (p->info.minOccurs > 0) fprintf(fout, "soap_set_attr(soap, \"%s\", %s->%s ? %s->%s : \"%s\", 1);", tag, obj, name, obj, name, default_value(p)); else fprintf(fout, "if (%s->%s)\n\t\tsoap_set_attr(soap, \"%s\", %s->%s, 1);", obj, name, tag, obj, name); } else if (is_string(typ)) { if (p->info.minOccurs > 0) fprintf(fout, "soap_set_attr(soap, \"%s\", %s->%s ? soap_%s2s(soap, %s->%s) : \"%s\", 1);", tag, obj, name, c_ident(typ), obj, name, default_value(p)); else fprintf(fout, "if (%s->%s)\n\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", obj, name, tag, c_ident(typ), obj, name); } else if (is_wstring(typ)) { if (p->info.minOccurs > 0) fprintf(fout, "soap_set_attr(soap, \"%s\", %s->%s ? soap_%s2s(soap, %s->%s) : \"%s\", 2);", tag, obj, name, c_ident(typ), obj, name, default_value(p)); else fprintf(fout, "if (%s->%s)\n\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 2);", obj, name, tag, c_ident(typ), obj, name); } else if (is_stdstring(typ)) { fprintf(fout, "soap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, c_ident(typ), obj, name); } else if (is_stdwstring(typ)) { fprintf(fout, "soap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 2);", tag, c_ident(typ), obj, name); } else if (is_smart(typ) || (typ->type == Tpointer && !is_string(typ) && !is_wstring(typ))) { Tnode *ptr = (Tnode*)typ->ref; if (is_smart(typ)) fprintf(fout, "if (%s->%s.get())\n\t{\t", obj, name); else fprintf(fout, "if (%s->%s)\n\t{\t", obj, name); if ((is_external(ptr) || is_typedef(ptr)) && !is_anyAttribute(ptr) && !is_anyType(ptr) && !is_stdstr(ptr) && !is_string(ptr) && !is_wstring(ptr) && !is_binary(ptr)) fprintf(fout, "soap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", tag, c_ident(ptr), obj, name); else if (is_XML(ptr)) fprintf(fout, "if (*%s->%s)\n\t\tsoap_set_attr(soap, \"%s\", *%s->%s, 1);", obj, name, tag, obj, name); else if (is_string(ptr)) fprintf(fout, "if (*%s->%s)\n\t\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", obj, name, tag, c_ident(ptr), obj, name); else if (is_wstring(ptr)) fprintf(fout, "if (*%s->%s)\n\t\t\tsoap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 2);", obj, name, tag, c_ident(ptr), obj, name); else if (is_stdwstring(ptr)) fprintf(fout, "soap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 2);", tag, c_ident(ptr), obj, name); else if (is_primitive_or_string(ptr) || is_binary(ptr)) fprintf(fout, "soap_set_attr(soap, \"%s\", soap_%s2s(soap, *%s->%s), 1);", tag, c_ident(ptr), obj, name); else if (is_anyAttribute(ptr)) fprintf(fout, "if (soap_out_%s(soap, \"%s\", -1, %s->%s, \"%s\"))\n\t\t\treturn soap->error;", c_ident(ptr), tag, obj, name, xsi_type_u(ptr)); else { sprintf(errbuf, "Member '%s' cannot be serialized as an XML attribute", name); semwarn(errbuf); } fprintf(fout, "\n\t}"); if (p->info.minOccurs > 0) { fprintf(fout, "\n\telse\n\t\t"); if (is_wstring(ptr) || is_stdwstring(ptr)) fprintf(fout, "soap_set_attr(soap, \"%s\", \"%s\", 2);", tag, default_value(p)); else fprintf(fout, "soap_set_attr(soap, \"%s\", \"%s\", 1);", tag, default_value(p)); } } else if (is_primitive_or_string(typ) || is_binary(typ)) fprintf(fout, "soap_set_attr(soap, \"%s\", soap_%s2s(soap, %s->%s), 1);", tag, c_ident(typ), obj, name); else if (is_anyAttribute(typ)) fprintf(fout, "if (soap_out_%s(soap, \"%s\", -1, &%s->%s, \"%s\"))\n\t\treturn soap->error;", c_ident(typ), tag, obj, name, xsi_type_u(typ)); else { sprintf(errbuf, "Member '%s' cannot be serialized as an XML attribute", name); semwarn(errbuf); } if (p->info.minOccurs == 0 && (typ->type != Tpointer || is_string(typ) || is_wstring(typ)) && p->info.hasval && !p->info.ptrval && !p->info.fixed) fprintf(fout, "\n\t}"); } void soap_attr_value(Entry *p, const char *obj, const char *name, const char *tag) { int occurs = 0; Tnode *typ = p->info.typ; if (p->info.sto & (Sconst | Sprivate | Sprotected)) return; if (typ->type == Treference || typ->type == Trvalueref) typ = typ->ref; if (p->info.maxOccurs == 0) occurs = 2; /* prohibited */ else if (p->info.minOccurs >= 1) occurs = 1; /* required */ if (sflag && occurs) occurs += 2; /* prohibited/required if SOAP_XML_STRICT */ if ((is_external(typ) || is_typedef(typ)) && !is_anyAttribute(typ) && !is_anyType(typ) && !is_smart(typ) && typ->type != Tpointer && !is_stdstr(typ) && !is_string(typ) && !is_wstring(typ) && !is_binary(typ)) fprintf(fout, "\n\tif (soap_s2%s(soap, soap_attr_value(soap, \"%s\", %d, %d), &%s->%s))\n\t\treturn NULL;", c_ident(typ), tag, property(typ), occurs, obj, name); else if (is_smart(typ) || (typ->type == Tpointer && !is_string(typ) && !is_wstring(typ))) { Tnode *ptr = (Tnode*)typ->ref; const char *get = ""; if (!is_anyAttribute(ptr) && !is_anyType(ptr)) fprintf(fout, "\n\t{\n\t\tconst char *t = soap_attr_value(soap, \"%s\", %d, %d);\n\t\tif (t)\n\t\t{", tag, property(ptr), occurs); if (is_smart(typ)) { fprintf(fout, "\n\t\t\t%s->%s = %s(SOAP_NEW(soap, %s));", obj, name, c_type(typ), c_type(ptr)); get = ".get()"; } else if (is_stdstr(ptr) || ptr->type == Tclass) fprintf(fout, "\n\t\t\tif (!(%s->%s = soap_new_%s(soap)))\n\t\t\t{\tsoap->error = SOAP_EOM;\n\t\t\t\treturn NULL;\n\t\t\t}", obj, name, c_ident(ptr)); else fprintf(fout, "\n\t\t\tif (!(%s->%s = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t\t{\tsoap->error = SOAP_EOM;\n\t\t\t\treturn NULL;\n\t\t\t}", obj, name, c_type(typ), c_type(ptr)); if ((is_external(ptr) || is_typedef(ptr)) && !is_anyAttribute(ptr) && !is_anyType(ptr) && !is_stdstr(ptr) && !is_string(ptr) && !is_wstring(ptr) && !is_binary(ptr)) fprintf(fout, "\n\t\t\tif (soap_s2%s(soap, t, %s->%s%s))\n\t\t\t\treturn NULL;", c_ident(ptr), obj, name, get); else if (is_smart(typ) && is_anyAttribute(ptr)) fprintf(fout, "\n\t\t\tif (!soap_in_%s(soap, \"%s\", %s->%s%s, \"%s\")\n\t\t\t\t%s->%s.reset();", c_ident(ptr), tag, obj, name, get, xsi_type(ptr), obj, name); else if (is_anyAttribute(ptr)) fprintf(fout, "\n\t\t\t%s->%s = soap_in_%s(soap, \"%s\", %s->%s, \"%s\");", obj, name, c_ident(ptr), tag, obj, name, xsi_type(ptr)); else if (is_XML(ptr)) fprintf(fout, "\n\t\t\tif (soap_s2char(soap, t, %s->%s%s, 0, %ld, %ld, %s))\n\t\t\t\treturn NULL;", obj, name, get, minlen(ptr), maxlen(ptr), pattern(ptr)); else if (is_primitive_or_string(ptr) || is_binary(ptr)) fprintf(fout, "\n\t\t\tif (soap_s2%s(soap, t, %s->%s%s))\n\t\t\t\treturn NULL;", c_ident(ptr), obj, name, get); if (!is_anyAttribute(ptr) && !is_anyType(ptr)) { fixed_check(fout, p, NULL, "\t\t\t"); fprintf(fout, "\n\t\t}\n\t\telse if (soap->error)\n\t\t\treturn NULL;\n\t}"); } } else if (is_anyAttribute(typ)) fprintf(fout, "\n\tsoap_in_%s(soap, \"%s\", &%s->%s, \"%s\");", c_ident(typ), tag, obj, name, xsi_type(typ)); else if (is_XML(typ)) fprintf(fout, "\n\tif (soap_s2char(soap, soap_attr_value(soap, \"%s\", 0, %d), &%s->%s, 0, %ld, %ld, %s))\n\t\treturn NULL;", tag, occurs, obj, name, minlen(typ), maxlen(typ), pattern(typ)); else if (is_primitive_or_string(typ) || is_binary(typ)) fprintf(fout, "\n\tif (soap_s2%s(soap, soap_attr_value(soap, \"%s\", %d, %d), &%s->%s))\n\t\treturn NULL;", c_ident(typ), tag, property(typ), occurs, obj, name); if (!is_smart(typ) && !(typ->type == Tpointer && !is_string(typ) && !is_wstring(typ))) fixed_check(fout, p, NULL, "\t"); } const char * ptr_cast(Table *t, const char *name) { const char *type = ident(t->sym->name); char *s = (char*)emalloc(strlen(type) + strlen(name) + 6); sprintf(s, "((%s*)%s)", type, name); return s; } void soap_out(Tnode *typ) { Table *table, *t; Entry *p = NULL; int cardinality, i, j, d; Tnode *temp; const char *nse = ns_qualifiedElement(typ); const char *nsa = ns_qualifiedAttribute(typ); const char *x; if (is_XML(typ)) return; if (is_dynamic_array(typ)) { soap_out_Darray(typ); return; } if (is_external(typ) && !is_volatile(typ)) fprintf(fhead, "\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap*, %s);", c_ident(typ), c_type(typ)); else if (is_qname(typ)) fprintf(fhead, "\n\n#define soap_%s2s(soap, a) soap_QName2s(soap, (a))", c_ident(typ)); else if (is_string(typ)) fprintf(fhead, "\n\n#define soap_%s2s(soap, a) (a)", c_ident(typ)); else if (is_wstring(typ)) fprintf(fhead, "\n\n#define soap_%s2s(soap, a) soap_wchar2s((soap), (a))", c_ident(typ)); else if (is_stdqname(typ)) fprintf(fhead, "\n\n#define soap_%s2s(soap, a) soap_QName2s((soap), (a).c_str())", c_ident(typ)); else if (is_stdstring(typ)) fprintf(fhead, "\n\n#define soap_%s2s(soap, a) ((a).c_str())", c_ident(typ)); else if (is_stdwstring(typ)) fprintf(fhead, "\n\n#define soap_%s2s(soap, a) soap_wchar2s((soap), (a).c_str())", c_ident(typ)); else if (is_typedef(typ) && (!is_external(typ) || is_volatile(typ)) && !is_qname(typ) && !is_stdqname(typ)) { if ((typ->type == Tfloat || typ->type == Tdouble || typ->type == Tldouble) && typ->pattern && typ->pattern[0] == '%' && typ->pattern[1]) { fprintf(fhead, "\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap*, %s);", c_ident(typ), c_type(typ)); fprintf(fout, "\n\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap *soap, %s)", c_ident(typ), c_type_id(typ, "n")); fprintf(fout, "\n{\n\tconst char *s;"); if (typ->type == Tfloat) fprintf(fout, "\n\tconst char *t = soap->float_format;\n\tsoap->float_format = \"%s\";", typ->pattern); else if (typ->type == Tdouble) fprintf(fout, "\n\tconst char *t = soap->double_format;\n\tsoap->double_format = \"%s\";", typ->pattern); else if (typ->type == Tldouble) fprintf(fout, "\n\tconst char *t = soap->long_double_format;\n\tsoap->long_double_format = \"%s\";", typ->pattern); fprintf(fout, "\n\ts = soap_%s2s(soap, n);", t_ident(typ)); if (typ->type == Tfloat) fprintf(fout, "\n\tsoap->float_format = t;"); else if (typ->type == Tdouble) fprintf(fout, "\n\tsoap->double_format = t;"); else if (typ->type == Tldouble) fprintf(fout, "\n\tsoap->long_double_format = t;"); fprintf(fout, "\n\treturn s;\n}"); } else { fprintf(fhead, "\n\n#define soap_%s2s soap_%s2s\n", c_ident(typ), t_ident(typ)); } } if (is_typedef(typ) && (is_element(typ) || is_synonym(typ) || is_external(typ)) && (!is_external(typ) || is_volatile(typ))) { fprintf(fhead, "\n\n#define soap_out_%s soap_out_%s\n", c_ident(typ), t_ident(typ)); return; } if (is_primitive(typ) && typ->type != Tenum && typ->type != Tenumsc) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ), c_type_id(typ, "*a")); if (typ->pattern && typ->pattern[0] == '%' && typ->pattern[1]) { fprintf(fout, "\n\tint err;"); if (typ->type == Tfloat) fprintf(fout, "\n\tconst char *s = soap->float_format;\n\tsoap->float_format = \"%s\";", typ->pattern); else if (typ->type == Tdouble) fprintf(fout, "\n\tconst char *s = soap->double_format;\n\tsoap->double_format = \"%s\";", typ->pattern); else if (typ->type == Tldouble) fprintf(fout, "\n\tconst char *s = soap->long_double_format;\n\tsoap->long_double_format = \"%s\";", typ->pattern); x = xsi_type_u(typ); if (x && *x) fprintf(fout, "\n\tif (!type)\n\t\ttype = \"%s\";", x); if (typ->type == Tllong || typ->type == Tullong) fprintf(fout, "\n\terr = soap_out%s(soap, tag, id, a, type, %s);", c_type(typ), soap_type(typ)); else fprintf(fout, "\n\terr = soap_out%s(soap, tag, id, a, type, %s);", the_type(typ), soap_type(typ)); if (typ->type == Tfloat) fprintf(fout, "\n\tsoap->float_format = s;"); else if (typ->type == Tdouble) fprintf(fout, "\n\tsoap->double_format = s;"); else if (typ->type == Tldouble) fprintf(fout, "\n\tsoap->long_double_format = s;"); fprintf(fout, "\n\treturn err;\n}"); } else { x = xsi_type_u(typ); if (x && *x) fprintf(fout, "\n\tif (!type)\n\t\ttype = \"%s\";", x); if (typ->type == Tllong || typ->type == Tullong) fprintf(fout, "\n\treturn soap_out%s(soap, tag, id, a, type, %s);\n}", c_type(typ), soap_type(typ)); else fprintf(fout, "\n\treturn soap_out%s(soap, tag, id, a, type, %s);\n}", the_type(typ), soap_type(typ)); } return; } if (is_fixedstring(typ)) { fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const char[], const char*);", c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const char a[], const char *type)\n{", c_ident(typ)); fprintf(fout, "\n\treturn soap_outstring(soap, tag, id, (char*const*)(void*)&a, type, %s);\n}", soap_type(typ)); return; } if (is_string(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, char*const*, const char*);", c_ident(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, char*const*, const char*);", c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, char *const*a, const char *type)\n{", c_ident(typ)); fprintf(fout, "\n\treturn soap_outstring(soap, tag, id, a, type, %s);\n}", soap_type(typ)); return; } if (is_wstring(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, wchar_t*const*, const char*);", c_ident(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, wchar_t*const*, const char*);", c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, wchar_t *const*a, const char *type)\n{", c_ident(typ)); fprintf(fout, "\n\treturn soap_outwstring(soap, tag, id, a, type, %s);\n}", soap_type(typ)); return; } if (is_stdstring(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const std::string*, const char*);", c_ident(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const std::string*, const char*);", c_ident(typ)); if (is_stdXML(typ)) fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const std::string *s, const char *type)\n{\n\t(void)id; /* appease -Wall -Werror */\n\tconst char *t = s->c_str();\n\treturn soap_outliteral(soap, tag, (char*const*)(void*)&t, type);\n}", c_ident(typ)); else fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const std::string *s, const char *type)\n{\n\tif ((soap->mode & SOAP_C_NILSTRING) && s->empty())\n\t\treturn soap_element_null(soap, tag, id, type);\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, s, %s), type) || soap_string_out(soap, s->c_str(), 0) || soap_element_end_out(soap, tag))\n\t\treturn soap->error;\n\treturn SOAP_OK;\n}", c_ident(typ), soap_type(typ)); return; } if (is_stdwstring(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const std::wstring*, const char*);", c_ident(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const std::wstring*, const char*);", c_ident(typ)); if (is_stdXML(typ)) fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const std::wstring *s, const char *type)\n{\n\tconst wchar_t *t = s->c_str();\n\treturn soap_outwliteral(soap, tag, (wchar_t*const*)(void*)&t, type);\n}", c_ident(typ)); else fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const std::wstring *s, const char *type)\n{\n\tif ((soap->mode & SOAP_C_NILSTRING) && s->empty())\n\t\treturn soap_element_null(soap, tag, id, type);\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, s, %s), type) || soap_wstring_out(soap, s->c_str(), 0) || soap_element_end_out(soap, tag))\n\t\treturn soap->error;\n\treturn SOAP_OK;\n}", c_ident(typ), soap_type(typ)); return; } switch(typ->type) { case Tstruct: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ), c_type_id(typ, "*a")); table = (Table*)typ->ref; for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (is_repetition(p) || is_anytype(p) || is_choice(p)) p = p->next; else if (is_transient(p->info.typ)) ; else if (p->info.sto & Sattribute) ; else if (is_qname(p->info.typ)) fprintf(fout, "\n\tconst char *soap_tmp_%s;", ident(p->sym->name)); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\tstd::string soap_tmp_%s;", ident(p->sym->name)); else if ((p->info.typ->type == Tpointer || is_smart_shared(p->info.typ)) && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tconst char *soap_tmp_%s;", ident(p->sym->name)); else if (is_smart(p->info.typ) && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tconst char *soap_tmp_%s;", ident(p->sym->name)); } } if (has_setter(typ)) fprintf(fout, "\n\tif (((%s)a)->set(soap))\n\t\treturn soap->error;", c_type_id(typ, "*")); if (table && !is_invisible(typ->id->name)) { for (p = table->list; p; p = p->next) { if (is_pointer_to_derived(p)) fprintf(fout, "\n\tif (a->%s)\n\t\treturn soap_out_%s(soap, tag, id, a->%s, \"%s\");", ident(p->sym->name), c_ident(p->info.typ->ref), ident(p->sym->name), xsi_type(p->info.typ->ref)); } } x = xsi_type_u(typ); if (x && *x) fprintf(fout, "\n\tif (!type)\n\t\ttype = \"%s\";", x); for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (is_repetition(p) || is_anytype(p) || is_choice(p)) p = p->next; else if (is_transient(p->info.typ)) ; else if (p->info.sto & Sattribute) soap_set_attr(p, "a", ident(p->sym->name), ns_add(p, nsa)); else if (is_qname(p->info.typ)) fprintf(fout, "\n\tsoap_tmp_%s = soap_QName2s(soap, a->%s);", ident(p->sym->name), ident(p->sym->name)); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\tsoap_tmp_%s = soap_QName2s(soap, a->%s.c_str());", ident(p->sym->name), ident(p->sym->name)); else if ((p->info.typ->type == Tpointer || is_smart_shared(p->info.typ)) && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tsoap_tmp_%s = a->%s ? soap_QName2s(soap, *a->%s) : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); else if (is_smart(p->info.typ) && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tsoap_tmp_%s = a->%s.get() ? soap_QName2s(soap, *a->%s) : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); else if ((p->info.typ->type == Tpointer || is_smart_shared(p->info.typ)) && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tstd::string soap_temp_%s(a->%s ? soap_QName2s(soap, a->%s->c_str()) : \"\"), *soap_tmp_%s = a->%s ? &soap_temp_%s : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); else if (is_smart(p->info.typ) && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tstd::string soap_temp_%s(a->%s.get() ? soap_QName2s(soap, a->%s->c_str()) : \"\"), *soap_tmp_%s = a->%s.get() ? &soap_temp_%s : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); } } fprintf(fout, "\n\t(void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */"); if (!table) { fprintf(fout, "\n\treturn SOAP_OK;\n}"); } else if (is_primclass(typ)) { for (table = (Table*)typ->ref; table; table = table->prev) { p = table->list; while (p && !is_item(p)) p = p->next; if (p) break; } if ((p->info.sto & SmustUnderstand) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && !is_transient(p->info.typ) && !is_void(p->info.typ) && p->info.typ->type != Tfun) fprintf(fout, "\n\tsoap->mustUnderstand = 1;"); if (p->info.typ->type == Tarray) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, a->%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\treturn a->%s.soap_out(soap, tag, id, \"%s\");", ident(p->sym->name), xsi_type_u(typ)); else if (is_qname(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)(void*)&soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if ((p->info.typ->type == Tpointer || is_smart(p->info.typ)) && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)(void)&soap_tmp_%s, \"%s\");", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type_u(typ->ref)); else if ((p->info.typ->type == Tpointer || is_smart(p->info.typ)) && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tif (soap_tmp_%s)\n\t\treturn soap_out_%s(soap, tag, id, soap_tmp_%s, \"%s\");", ident(p->sym->name), c_ident(p->info.typ->ref), ident(p->sym->name), xsi_type_u(typ->ref)); else if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\treturn soap_outliteral(soap, tag, (char*const*)&a->%s, NULL);", ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\treturn soap_outwliteral(soap, tag, (wchar_t*const*)&a->%s, NULL);", ident(p->sym->name)); else if (is_string(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)&a->%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (wchar_t*const*)&a->%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &a->%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else fprintf(fout, "\n\treturn SOAP_OK;"); fprintf(fout, "\n}"); } else { if (!is_invisible(typ->id->name)) fprintf(fout, "\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), type))\n\t\treturn soap->error;", soap_type(typ)); fflush(fout); for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if ((p->info.sto & Sreturn)) { if (nse || has_ns_eq(NULL, p->sym->name)) { if (p->info.typ->type == Tpointer) fprintf(fout, "\n\tif (a->%s)\n\t\tsoap_element_result(soap, \"%s\");", ident(p->sym->name), ns_add(p, nse)); else fprintf(fout, "\n\tsoap_element_result(soap, \"%s\");", ns_add(p, nse)); } } if ((p->info.sto & SmustUnderstand) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && !is_void(p->info.typ) && p->info.typ->type != Tfun) fprintf(fout, "\n\tsoap->mustUnderstand = 1;"); needs_lang(p); if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if ((p->info.sto & (Sconst | Sprivate | Sprotected))) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if ((p->info.sto & Sattribute)) ; else if (is_repetition(p)) { fprintf(fout, "\n\tif (a->%s)", ident(p->next->sym->name)); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < (int)a->%s; i++)", ident(p->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tif (a->%s[i].soap_out(soap, \"%s\", -1, \"%s\"))\n\t\t\t\treturn soap->error;", ident(p->next->sym->name), ns_add(p->next, nse), xsi_type_u((Tnode*)p->next->info.typ->ref)); else if (is_qname((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t{\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s[i]);\n\t\t\tif (soap_out_%s(soap, \"%s\", -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\t\t\treturn soap->error;\n\t\t}", ident(p->next->sym->name), ident(p->next->sym->name), c_ident((Tnode*)p->next->info.typ->ref), ns_add(p->next, nse), ident(p->next->sym->name), xsi_type_u((Tnode*)p->next->info.typ->ref)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tif (soap_outliteral(soap, \"%s\", (char*const*)(a->%s + i), NULL))\n\t\t\t\treturn soap->error;", ns_add(p->next, nse), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tif (soap_outwliteral(soap, \"%s\", (wchar_t*const*)(a->%s + i), NULL))\n\t\t\t\treturn soap->error;", ns_add(p->next, nse), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tif (soap_out_string(soap, \"%s\", -1, (char*const*)(a->%s + i), \"%s\"))\n\t\t\t\treturn soap->error;", ns_add(p->next, nse), ident(p->next->sym->name), xsi_type_u((Tnode*)p->next->info.typ->ref)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tif (soap_out_wstring(soap, \"%s\", -1, (wchar_t*const*)(a->%s + i), \"%s\"))\n\t\t\t\treturn soap->error;", ns_add(p->next, nse), ident(p->next->sym->name), xsi_type_u((Tnode*)p->next->info.typ->ref)); else fprintf(fout, "\n\t\t\tif (soap_out_%s(soap, \"%s\", -1, a->%s + i, \"%s\"))\n\t\t\t\treturn soap->error;", c_ident((Tnode*)p->next->info.typ->ref), ns_add(p->next, nse), ident(p->next->sym->name), xsi_type_u((Tnode*)p->next->info.typ->ref)); fprintf(fout, "\n\t}"); p = p->next; } else if (is_anytype(p) && is_invisible(p->next->sym->name)) { fprintf(fout, "\n\tif (soap_putelement(soap, a->%s, tag, -1, a->%s))\n\t\treturn soap->error;", ident(p->next->sym->name), ident(p->sym->name)); p = p->next; } else if (is_anytype(p)) { fprintf(fout, "\n\tif (soap_putelement(soap, a->%s, \"%s\", -1, a->%s))\n\t\treturn soap->error;", ident(p->next->sym->name), ns_add(p->next, nse), ident(p->sym->name)); p = p->next; } else if (is_choice(p)) { fprintf(fout, "\n\tif (soap_out_%s(soap, a->%s, &a->%s))\n\t\treturn soap->error;", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_transient(p->info.typ)) { if (!is_pointer_to_derived(p)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); } else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, a->%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_u(p->info.typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif (a->%s.soap_out(soap, %s, -1, \"%s\"))\n\t\treturn soap->error;", ident(p->sym->name), field(p, nse), xsi_type_u(p->info.typ)); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, &soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_u(p->info.typ)); else { if (zflag != 2 && p->info.typ->type == Tpointer && !is_void(p->info.typ) && p->info.minOccurs > 0) { /* xsi:nil only if nillable, otherwise empty element */ if (p->info.nillable) fprintf(fout, "\n\tif (!a->%s)\n\t{\tif (soap_element_nil(soap, %s))\n\t\t\treturn soap->error;\n\t}\n\telse ", ident(p->sym->name), field(p, nse)); else fprintf(fout, "\n\tif (!a->%s)\n\t{\tif (soap_element_empty(soap, %s))\n\t\t\treturn soap->error;\n\t}\n\telse ", ident(p->sym->name), field(p, nse)); } else { fprintf(fout, "\n\t"); } if (is_qname(p->info.typ)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_u(p->info.typ)); else if ((p->info.typ->type == Tpointer || is_smart(p->info.typ)) && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ->ref), field(p, nse), ident(p->sym->name), xsi_type_u(p->info.typ->ref)); else if ((p->info.typ->type == Tpointer || is_smart(p->info.typ)) && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "if (soap_tmp_%s && soap_out_%s(soap, %s, -1, soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", ident(p->sym->name), c_ident(p->info.typ->ref), field(p, nse), ident(p->sym->name), xsi_type_u(p->info.typ->ref)); else if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "if (soap_outliteral(soap, %s, (char*const*)&a->%s, NULL))\n\t\treturn soap->error;", field(p, nse), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "if (soap_outwliteral(soap, %s, (wchar_t*const*)&a->%s, NULL))\n\t\treturn soap->error;", field(p, nse), ident(p->sym->name)); else if (is_string(p->info.typ)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, (char*const*)&a->%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_u(p->info.typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, (wchar_t*const*)&a->%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_u(p->info.typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, &a->%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type_u(p->info.typ)); else fprintf(fout, "{ }"); } } } if (!is_invisible(typ->id->name)) fprintf(fout, "\n\treturn soap_element_end_out(soap, tag);\n}"); else fprintf(fout, "\n\treturn SOAP_OK;\n}"); } fflush(fout); break; case Tclass: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); return; } if (!is_volatile(typ) && !is_typedef(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fout, "\n\nint %s::soap_out(struct soap *soap, const char *tag, int id, const char *type) const", ident(typ->id->name)); fprintf(fout, "\n{\n\treturn soap_out_%s(soap, tag, id, this, type);\n}", c_ident(typ)); } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ), c_type_id(typ, "*a")); fflush(fout); if (has_setter(typ)) fprintf(fout, "\n\tif (((%s)a)->set(soap))\n\t\treturn soap->error;", c_type_id(typ, "*")); table = (Table*)typ->ref; if (table && !is_invisible(typ->id->name)) { for (p = table->list; p; p = p->next) { if (is_pointer_to_derived(p)) fprintf(fout, "\n\tif (a->%s)\n\t\treturn soap_out_%s(soap, tag, id, a->%s, \"%s\");", ident(p->sym->name), c_ident(p->info.typ->ref), ident(p->sym->name), xsi_type(p->info.typ->ref)); } } x = xsi_type_u(typ); if (x && *x) fprintf(fout, "\n\tif (!type)\n\t\ttype = \"%s\";", x); for (t = table; t; t = t->prev) { Entry *e = entry(classtable, t->sym); const char *nsa1 = e ? ns_qualifiedAttribute(e->info.typ) : nsa; for (p = t->list; p; p = p->next) { if (is_repetition(p) || is_anytype(p) || is_choice(p)) p = p->next; else if (is_transient(p->info.typ)) ; else if (p->info.sto & Sattribute) soap_set_attr(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa1)); else if (is_qname(p->info.typ)) fprintf(fout, "\n\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s);", ident(p->sym->name), ident(p->sym->name)); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\tstd::string soap_tmp_%s(soap_QName2s(soap, a->%s.c_str()));", ident(p->sym->name), ident(p->sym->name)); else if ((p->info.typ->type == Tpointer || is_smart_shared(p->info.typ)) && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tconst char *soap_tmp_%s = a->%s ? soap_QName2s(soap, *a->%s) : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); else if (is_smart(p->info.typ) && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tconst char *soap_tmp_%s = a->%s.get() ? soap_QName2s(soap, *a->%s) : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); else if ((p->info.typ->type == Tpointer || is_smart_shared(p->info.typ)) && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tstd::string soap_temp_%s(a->%s ? soap_QName2s(soap, a->%s->c_str()) : \"\"), *soap_tmp_%s = a->%s ? &soap_temp_%s : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); else if (is_smart(p->info.typ) && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tstd::string soap_temp_%s(a->%s.get() ? soap_QName2s(soap, a->%s->c_str()) : \"\"), *soap_tmp_%s = a->%s.get() ? &soap_temp_%s : NULL;", ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name), ident(p->sym->name)); } } fprintf(fout, "\n\t(void)soap; (void)tag; (void)id; (void)a; (void)type; /* appease -Wall -Werror */"); if (!table) { fprintf(fout, "\n\treturn SOAP_OK;\n}"); } else if (is_primclass(typ)) { for (t = table; t; t = t->prev) { p = t->list; while (p && !is_item(p)) p = p->next; if (p) break; } if ((p->info.sto & SmustUnderstand) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && !is_transient(p->info.typ) && !is_void(p->info.typ) && p->info.typ->type != Tfun) fprintf(fout, "\n\tsoap->mustUnderstand = 1;"); if (table && table->prev) { if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\treturn soap_outliteral(soap, tag, (char*const*)&a->%s::%s, \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\treturn soap_outwliteral(soap, tag, (wchar_t*const*)&a->%s::%s, \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else if (is_qname(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)(void*)&soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); else if (is_string(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)&a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (wchar_t*const*)&a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\treturn (a->%s::%s).soap_out(soap, tag, id, \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); else if ((p->info.typ->type == Tpointer || is_smart(p->info.typ)) && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)(void*)&soap_tmp_%s, \"%s\");", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type_u(typ->ref)); else if ((p->info.typ->type == Tpointer || is_smart(p->info.typ)) && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tif (soap_tmp_%s)\n\t\treturn soap_out_%s(soap, tag, id, soap_tmp_%s, \"%s\");", ident(p->sym->name), c_ident(p->info.typ->ref), ident(p->sym->name), xsi_type_u(typ->ref)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(typ)); else fprintf(fout, "\n\treturn SOAP_OK;"); } else { if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\treturn soap_outliteral(soap, tag, (char*const*)&a->%s::%s, NULL);", ident(t->sym->name), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\treturn soap_outwliteral(soap, tag, (wchar_t*const*)&a->%s::%s, NULL);", ident(t->sym->name), ident(p->sym->name)); else if (is_qname(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)(void*)&soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if (is_string(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)&a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type_u(typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (wchar_t*const*)&a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type_u(typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\treturn (a->%s::%s).soap_out(soap, tag, id, \"%s\");", ident(t->sym->name), ident(p->sym->name), xsi_type_u(typ)); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &soap_tmp_%s, \"%s\");", c_ident(p->info.typ), ident(p->sym->name), xsi_type_u(typ)); else if ((p->info.typ->type == Tpointer || is_smart(p->info.typ)) && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, (char*const*)(void*)&soap_tmp_%s, \"%s\");", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type_u(typ->ref)); else if ((p->info.typ->type == Tpointer || is_smart(p->info.typ)) && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\tif (soap_tmp_%s)\n\t\treturn soap_out_%s(soap, tag, id, soap_tmp_%s, \"%s\");", ident(p->sym->name), c_ident(p->info.typ->ref), ident(p->sym->name), xsi_type_u(typ->ref)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, &a->%s::%s, \"%s\");", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type_u(typ)); else fprintf(fout, "\n\treturn SOAP_OK;"); } fprintf(fout, "\n}"); } else { if (!is_invisible(typ->id->name)) { if (table && table->prev) fprintf(fout, "\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), type ? type : \"%s\"))\n\t\treturn soap->error;", soap_type(typ), xsi_type(typ)); else fprintf(fout, "\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), type))\n\t\treturn soap->error;", soap_type(typ)); } fflush(fout); i = 0; /* Get the depth of the inheritance hierarchy */ for (t = table; t; t = t->prev) i++; /* Call routines to output the member data of the class */ /* Data members of the Base Classes are outputed first followed by the data members of the Derived classes. Overridden data members are output twice once for the base class they are defined in and once for the derived class that overwrites them */ for (; i > 0; i--) { Entry *e; const char *nse1; t = table; for (j = 0; j < i-1; j++) t = t->prev; e = entry(classtable, t->sym); nse1 = e ? ns_qualifiedElement(e->info.typ) : nse; for (p = t->list; p != (Entry*) 0; p = p->next) { if (p->info.sto & Sreturn) { if (nse1 || has_ns_eq(NULL, p->sym->name)) { if (p->info.typ->type == Tpointer) fprintf(fout, "\n\tif (a->%s)\n\t\tsoap_element_result(soap, \"%s\");", ident(p->sym->name), ns_add(p, nse1)); else fprintf(fout, "\n\tsoap_element_result(soap, \"%s\");", ns_add(p, nse1)); } } if ((p->info.sto & SmustUnderstand) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && !is_transient(p->info.typ) && !is_void(p->info.typ) && p->info.typ->type != Tfun) fprintf(fout, "\n\tsoap->mustUnderstand = 1;"); needs_lang(p); if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { fprintf(fout, "\n\tif (a->%s::%s)", ident(t->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < (int)a->%s::%s; i++)", ident(t->sym->name), ident(p->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tif (a->%s::%s[i].soap_out(soap, %s, -1, \"%s\"))\n\t\t\t\treturn soap->error;", ident(t->sym->name), ident(p->next->sym->name), field_overridden(t, p->next, nse1), xsi_type_u((Tnode*)p->next->info.typ->ref)); else if (is_qname((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t{\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s[i]);\n\t\t\tif (soap_out_%s(soap, %s, -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\t\t\treturn soap->error;\n\t\t}", ident(p->next->sym->name), ident(p->next->sym->name), c_ident((Tnode*)p->next->info.typ->ref), field_overridden(t, p->next, nse1), ident(p->next->sym->name), xsi_type_u((Tnode*)p->next->info.typ->ref)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tif (soap_outliteral(soap, %s, (char*const*)(a->%s::%s + i), NULL))\n\t\t\t\treturn soap->error;", field_overridden(t, p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tif (soap_outwliteral(soap, %s, (wchar_t*const*)(a->%s::%s + i), NULL))\n\t\t\t\treturn soap->error;", field_overridden(t, p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tif (soap_out_string(soap, \"%s\", -1, (char*const*)(a->%s::%s + i), \"%s\"))\n\t\t\t\treturn soap->error;", ns_add(p->next, nse), ident(t->sym->name), ident(p->next->sym->name), xsi_type_u((Tnode*)p->next->info.typ->ref)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\tif (soap_out_wstring(soap, \"%s\", -1, (wchar_t*const*)(a->%s::%s + i), \"%s\"))\n\t\t\t\treturn soap->error;", ns_add(p->next, nse), ident(t->sym->name), ident(p->next->sym->name), xsi_type_u((Tnode*)p->next->info.typ->ref)); else fprintf(fout, "\n\t\t\tif (soap_out_%s(soap, %s, -1, a->%s::%s + i, \"%s\"))\n\t\t\t\treturn soap->error;", c_ident((Tnode*)p->next->info.typ->ref), field_overridden(t, p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type_u((Tnode*)p->next->info.typ->ref)); fprintf(fout, "\n\t}"); p = p->next; } else if (is_anytype(p) && is_invisible(p->next->sym->name)) { fprintf(fout, "\n\tif (soap_putelement(soap, a->%s::%s, tag, -1, a->%s::%s))\n\t\treturn soap->error;", ident(t->sym->name), ident(p->next->sym->name), ident(t->sym->name), ident(p->sym->name)); p = p->next; } else if (is_anytype(p)) { fprintf(fout, "\n\tif (soap_putelement(soap, a->%s::%s, %s, -1, a->%s::%s))\n\t\treturn soap->error;", ident(t->sym->name), ident(p->next->sym->name), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); p = p->next; } else if (is_choice(p)) { fprintf(fout, "\n\tif (soap_out_%s(soap, a->%s::%s, &a->%s::%s))\n\t\treturn soap->error;", c_ident(p->next->info.typ), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_item(p)) { } else if (is_transient(p->info.typ)) { if (!is_pointer_to_derived(p)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); } else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, a->%s::%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_u(p->info.typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif ((a->%s::%s).soap_out(soap, %s, -1, \"%s\"))\n\t\treturn soap->error;", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1), xsi_type_u(p->info.typ)); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, &soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_u(p->info.typ)); else { if (zflag != 2 && p->info.typ->type == Tpointer && !is_void(p->info.typ) && p->info.minOccurs > 0) { /* xsi:nil only if nillable, otherwise empty element */ if (p->info.nillable) fprintf(fout, "\n\tif (!a->%s::%s)\n\t{\tif (soap_element_nil(soap, %s))\n\t\t\treturn soap->error;\n\t}\n\telse ", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1)); else fprintf(fout, "\n\tif (!a->%s::%s)\n\t{\tif (soap_element_empty(soap, %s))\n\t\t\treturn soap->error;\n\t}\n\telse ", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1)); } else { fprintf(fout, "\n\t"); } if (is_qname(p->info.typ)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_u(p->info.typ)); else if ((p->info.typ->type == Tpointer || is_smart(p->info.typ)) && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident((Tnode*)p->info.typ->ref), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_u(p->info.typ->ref)); else if ((p->info.typ->type == Tpointer || is_smart(p->info.typ)) && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "if (soap_tmp_%s && soap_out_%s(soap, %s, -1, soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", ident(p->sym->name), c_ident(p->info.typ->ref), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_u(p->info.typ->ref)); else if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "if (soap_outliteral(soap, %s, (char*const*)&a->%s::%s, NULL))\n\t\treturn soap->error;", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "if (soap_outwliteral(soap, %s, (wchar_t*const*)&a->%s::%s, NULL))\n\t\treturn soap->error;", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); else if (is_string(p->info.typ)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, (char*const*)&a->%s::%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_u(p->info.typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, (wchar_t*const*)&a->%s::%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_u(p->info.typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, &a->%s::%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_u(p->info.typ)); else fprintf(fout, "{ }"); } } } i = 0; /* Get the depth of the inheritance hierarchy */ for (t = table; t; t = t->prev) i++; /* output __item(s) and inherited DOM at the end */ for (; i > 0; i--) { Entry *e; const char *nse1; t = table; for (j = 0; j < i-1; j++) t = t->prev; e = entry(classtable, t->sym); if (!t->prev && e && e->info.typ && e->info.typ->base && !strcmp(e->info.typ->base->name, "soap_dom_element")) fprintf(fout, "\n\tif (soap_out_xsd__anyType(soap, NULL, -1, static_cast(a), NULL))\n\t\treturn soap->error;"); nse1 = e ? ns_qualifiedElement(e->info.typ) : nse; for (p = t->list; p != (Entry*) 0; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected | Sattribute)) ; else if (is_repetition(p) || is_anytype(p) || is_choice(p)) p = p->next; else if (!is_item(p)) ; else if (is_transient(p->info.typ)) ; else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, a->%s::%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_u(p->info.typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif ((a->%s::%s).soap_out(soap, %s, -1, \"%s\"))\n\t\treturn soap->error;", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1), xsi_type_u(p->info.typ)); else if (is_stdqname(p->info.typ)) fprintf(fout, "\n\tif (soap_out_%s(soap, %s, -1, &soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_u(p->info.typ)); else { if (zflag != 2 && p->info.typ->type == Tpointer && !is_void(p->info.typ) && p->info.minOccurs > 0) { /* xsi:nil only if nillable, otherwise empty element */ if (p->info.nillable) fprintf(fout, "\n\tif(a->%s::%s)\n\t{\tif (soap_element_nil(soap, %s))\n\t\t\treturn soap->error;\n\t}\n\telse", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1)); else fprintf(fout, "\n\tif(a->%s::%s)\n\t{\tif (soap_element_empty(soap, %s))\n\t\t\treturn soap->error;\n\t}\n\telse", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1)); } else { fprintf(fout, "\n\t"); } if (is_qname(p->info.typ)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_u(p->info.typ)); else if ((p->info.typ->type == Tpointer || is_smart(p->info.typ)) && is_qname((Tnode*)p->info.typ->ref)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, (char*const*)(void*)&soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", c_ident((Tnode*)p->info.typ->ref), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_u(p->info.typ->ref)); else if ((p->info.typ->type == Tpointer || is_smart(p->info.typ)) && is_stdqname((Tnode*)p->info.typ->ref)) fprintf(fout, "if (soap_tmp_%s && soap_out_%s(soap, %s, -1, soap_tmp_%s, \"%s\"))\n\t\treturn soap->error;", ident(p->sym->name), c_ident(p->info.typ->ref), field_overridden(t, p, nse1), ident(p->sym->name), xsi_type_u(p->info.typ->ref)); else if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "if (soap_outliteral(soap, %s, (char*const*)&a->%s::%s, NULL))\n\t\treturn soap->error;", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "if (soap_outwliteral(soap, %s, (wchar_t*const*)&a->%s::%s, NULL))\n\t\treturn soap->error;", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); else if (is_string(p->info.typ)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, (char*const*)&a->%s::%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_u(p->info.typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, (wchar_t*const*)&a->%s::%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_u(p->info.typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "if (soap_out_%s(soap, %s, -1, &a->%s::%s, \"%s\"))\n\t\treturn soap->error;", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type_u(p->info.typ)); else fprintf(fout, "{ }"); } fflush(fout); } } if (!is_invisible(typ->id->name)) fprintf(fout, "\n\treturn soap_element_end_out(soap, tag);\n}"); else fprintf(fout, "\n\treturn SOAP_OK;\n}"); } fflush(fout); break; case Tunion: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, int, const %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, int choice, const %s)\n{", c_ident(typ), c_type_id(typ, "*a")); table = (Table*)typ->ref; fprintf(fout, "\n\t(void)soap; (void)a; /* appease -Wall -Werror */"); fprintf(fout, "\n\tswitch (choice)\n\t{"); if (table) { for (p = table->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) ; else if (is_anytype(p)) ; else if (is_transient(p->info.typ)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); else if (p->info.typ->type == Tarray) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn soap_out_%s(soap, \"%s\", -1, a->%s, \"%s\");", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type_u(p->info.typ)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn a->%s.soap_out(soap, \"%s\", -1, \"%s\");", ident(p->sym->name), ns_add(p, nse), xsi_type_u(p->info.typ)); } else if (is_qname(p->info.typ) || is_stdqname(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t{\tconst char *soap_tmp_%s = soap_QName2s(soap, a->%s);", ident(p->sym->name), ident(p->sym->name)); fprintf(fout, "\n\t\treturn soap_out_%s(soap, \"%s\", -1, (char*const*)(void*)&soap_tmp_%s, \"%s\");\n\t}", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type_u(p->info.typ)); } else if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn soap_outliteral(soap, \"%s\", (char*const*)&a->%s, NULL);", ns_add(p, nse), ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn soap_outwliteral(soap, \"%s\", (wchar_t*const*)&a->%s, NULL);", ns_add(p, nse), ident(p->sym->name)); } else if (is_string(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn soap_out_%s(soap, \"%s\", -1, (char*const*)&a->%s, \"%s\");", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type_u(p->info.typ)); } else if (is_wstring(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn soap_out_%s(soap, \"%s\", -1, (wchar_t*const*)&a->%s, \"%s\");", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type_u(p->info.typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "\n\tcase %s:", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn soap_out_%s(soap, \"%s\", -1, &a->%s, \"%s\");", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type_u(p->info.typ)); } } } fprintf(fout, "\n\tdefault:\n\t\tbreak;\n\t}\n\treturn SOAP_OK;\n}"); fflush(fout); break; case Tpointer: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char *, int, %s, const char *);", c_ident(typ), c_type_constptr_id(typ, "const*")); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char *, int, %s, const char *);", c_ident(typ), c_type_constptr_id(typ, "const*")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, %s, const char *type)\n{", c_ident(typ), c_type_constptr_id(typ, "const*a")); if (is_template(typ)) { fprintf(fout, "\n\tif (!*a)"); fprintf(fout, "\n\t\treturn soap_element_null(soap, tag, id, type);"); fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, *a, type);", c_ident((Tnode*)typ->ref)); } else { p = is_dynamic_array((Tnode*)typ->ref); if (p) { d = get_Darraydims((Tnode*)typ->ref); if (d) fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, *a, *a ? (*a)->%s : NULL, *a ? %s : 0, type, %s, NULL);", ident(p->sym->name), get_Darraysize("(*a)", d), soap_type((Tnode*)typ->ref)); else fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, *a, *a ? (*a)->%s : NULL, *a ? (*a)->__size : 0, type, %s, NULL);", ident(p->sym->name), soap_type((Tnode*)typ->ref)); fprintf(fout, "\n\tif (!*a || id < 0)\n\t\treturn soap->error;"); } else { if (((Tnode*)typ->ref)->recursive) fprintf(fout, "\n\tchar *mark;\n\tid = soap_element_id(soap, tag, id, *a, NULL, 0, type, %s, &mark);", soap_type((Tnode*)typ->ref)); else fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, *a, NULL, 0, type, %s, NULL);", soap_type((Tnode*)typ->ref)); fprintf(fout, "\n\tif (id < 0)\n\t\treturn soap->error;"); } if (((Tnode *) typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { if (!p && ((Tnode*)typ->ref)->recursive) fprintf(fout, "\n\t(void)(*a)->soap_out(soap, tag, id, (*a)->soap_type() == %s ? type : NULL);\n\tsoap_unmark(soap, mark);\n\treturn soap->error;", soap_type((Tnode*)typ->ref)); else fprintf(fout, "\n\treturn (*a)->soap_out(soap, tag, id, (*a)->soap_type() == %s ? type : NULL);", soap_type((Tnode*)typ->ref)); } else { if (!p && ((Tnode*)typ->ref)->recursive) fprintf(fout, "\n\t(void)soap_out_%s(soap, tag, id, *a, type);\n\tsoap_unmark(soap, mark);\n\treturn soap->error;", c_ident((Tnode*)typ->ref)); else fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, *a, type);", c_ident((Tnode*)typ->ref)); } } fprintf(fout, "\n}"); break; case Tarray: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, %s, const char*);", c_ident(typ), c_type_id(typ, "const")); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, %s, const char*);", c_ident(typ), c_type_id(typ, "const")); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, %s, const char *type)\n{", c_ident(typ), c_type_id(typ, "const a")); fprintf(fout, "\n\tsize_t i;\n\t(void)type;"); fprintf(fout, "\n\tsoap_array_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), \"%s[%d]\", 0);", soap_type(typ), xsi_type_Tarray(typ), get_dimension(typ)); (void)get_item_type(typ, &cardinality); fprintf(fout, "\n\tfor (i = 0; i < %d; i++)\n\t{", get_dimension(typ)); if (((Tnode *)typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { if (cardinality>1) fprintf(fout, "\n\t\tif (a[i].soap_out(soap, \"item\", -1, \"%s\")", xsi_type_u((Tnode*)typ->ref)); else fprintf(fout, "\n\t\tif ((a+i)->soap_out(soap, \"item\", -1, \"%s\")", xsi_type_u((Tnode*)typ->ref)); } else { if (((Tnode *)typ->ref)->type != Tarray) { if (((Tnode *)typ->ref)->type == Tpointer) fprintf(fout, "\n\t\tsoap->position = 1;\n\t\tsoap->positions[0] = i;\n\t\tif (soap_out_%s(soap, \"item\", -1, a", c_ident((Tnode*)typ->ref)); else fprintf(fout, "\n\t\tif (soap_out_%s(soap, \"item\", -1, a", c_ident((Tnode*)typ->ref)); } else fprintf(fout, "\n\t\tif (soap_out_%s(soap, \"item\", -1, a", c_ident((Tnode*)typ->ref)); if (cardinality>1) fprintf(fout, "[i], \"%s\")", xsi_type_u((Tnode*)typ->ref)); else fprintf(fout, "+i, \"%s\")", xsi_type_u((Tnode*)typ->ref)); } fprintf(fout, ")\n\t\t\treturn soap->error;"); if (((Tnode *)typ->ref)->type == Tpointer) fprintf(fout, "\n\t}\n\tsoap->position = 0;\n\treturn soap_element_end_out(soap, tag);\n}"); else fprintf(fout, "\n\t}\n\treturn soap_element_end_out(soap, tag);\n}"); break; case Tenum: case Tenumsc: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); if (!is_typedef(typ)) { fprintf(fout, "\n\nstatic const struct soap_code_map soap_codes_%s[] =\n{", c_ident(typ)); for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (typ->type == Tenumsc) fprintf(fout, "\t{ (LONG64)%s::%s, \"%s\" },\n", c_ident(typ), ident(p->sym->name), ns_remove2(p->sym->name, c_ident(typ))); else fprintf(fout, "\t{ (LONG64)%s, \"%s\" },\n", ident(p->sym->name), ns_remove2(p->sym->name, c_ident(typ))); } } fprintf(fout, "\t{ 0, NULL }\n"); fprintf(fout, "};"); } if (!is_typedef(typ)) { fprintf(fhead, "\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap*, %s);", c_ident(typ), c_type(typ)); fprintf(fout, "\n\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap *soap, %s)", c_ident(typ), c_type_id(typ, "n")); if (is_boolean(typ)) { fprintf(fout, "\n{\n\t(void)soap; /* appease -Wall -Werror */\n\treturn soap_code_str(soap_codes_%s, n != 0);\n}", c_ident(typ)); } else if (!is_mask(typ)) { fprintf(fout, "\n{\n\tconst char *s = soap_code_str(soap_codes_%s, (long)n);", c_ident(typ)); fprintf(fout, "\n\tif (s)\n\t\treturn s;"); fprintf(fout, "\n\treturn soap_long2s(soap, (long)n);"); fprintf(fout, "\n}"); } else { fprintf(fout, "\n{\n\treturn soap_code_list(soap, soap_codes_%s, (long)n);\n}", c_ident(typ)); } } fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ), c_type_id(typ, "*a")); x = xsi_type_u(typ); if (x && *x) fprintf(fout, "\n\tif (!type)\n\t\ttype = \"%s\";", x); fprintf(fout, "\n\tif (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, %s), type)", soap_type(typ)); fprintf(fout, " || soap_send(soap, soap_%s2s(soap, *a)))\n\t\treturn soap->error;", c_ident(typ)); fprintf(fout, "\n\treturn soap_element_end_out(soap, tag);\n}"); break; case Ttemplate: if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 int SOAP_FMAC2 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); return; } if (is_typedef(typ)) { fprintf(fhead, "\n\n#define soap_out_%s soap_out_%s\n", c_ident(typ), t_ident(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); temp = (Tnode*)typ->ref; if (!temp) return; fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)id; (void)type; /* appease -Wall -Werror */"); if (is_smart(typ)) { p = is_dynamic_array((Tnode*)typ->ref); if (p) { d = get_Darraydims((Tnode*)typ->ref); if (d) fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, a->get(), a->get() ? (*a)->%s : NULL, a->get() ? %s : 0, type, %s, NULL);", ident(p->sym->name), get_Darraysize("(*a)", d), soap_type((Tnode*)typ->ref)); else fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, a->get(), a->get() ? (*a)->%s : NULL, a->get() ? (*a)->__size : 0, type, %s, NULL);", ident(p->sym->name), soap_type((Tnode*)typ->ref)); } else if (((Tnode*)typ->ref)->recursive) fprintf(fout, "\n\tchar *mark;\n\tid = soap_element_id(soap, tag, id, a->get(), NULL, 0, type, %s, &mark);", soap_type((Tnode*)typ->ref)); else fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, a->get(), NULL, 0, type, %s, NULL);", soap_type((Tnode*)typ->ref)); fprintf(fout, "\n\tif (id < 0)\n\t\treturn soap->error;"); if (((Tnode *) typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { if (!p && ((Tnode*)typ->ref)->recursive) fprintf(fout, "\n\t(void)(*a)->soap_out(soap, tag, id, (*a)->soap_type() == %s ? type : NULL);\n\tsoap_unmark(soap, mark);\n\treturn soap->error;", soap_type((Tnode*)typ->ref)); else fprintf(fout, "\n\treturn (*a)->soap_out(soap, tag, id, (*a)->soap_type() == %s ? type : NULL);", soap_type((Tnode*)typ->ref)); } else { if (!p && ((Tnode*)typ->ref)->recursive) fprintf(fout, "\n\t(void)soap_out_%s(soap, tag, id, a->get(), type);\n\tsoap_unmark(soap, mark);\n\treturn soap->error;", c_ident((Tnode*)typ->ref)); else fprintf(fout, "\n\treturn soap_out_%s(soap, tag, id, a->get(), type);", c_ident((Tnode*)typ->ref)); } fprintf(fout, "\n}"); } else { fprintf(fout, "\n\tfor (%s::const_iterator i = a->begin(); i != a->end(); ++i)\n\t{", c_type(typ)); if (temp->type == Tarray) fprintf(fout, "\n\t\tif (soap_out_%s(soap, tag, id, *i, \"%s\"))", c_ident(temp), xsi_type_u(typ)); else if (temp->type == Tclass && !is_external(temp) && !is_volatile(temp) && !is_typedef(temp)) fprintf(fout, "\n\t\tif ((*i).soap_out(soap, tag, id, \"%s\"))", xsi_type_u(typ)); else if (is_qname(temp)) fprintf(fout, "\n\t\tconst char *soap_tmp = soap_QName2s(soap, *i);\n\t\tif (soap_out_%s(soap, tag, id, (char*const*)(void*)&soap_tmp, \"%s\"))", c_ident(temp), xsi_type_u(typ)); else if (is_stdqname(temp)) fprintf(fout, "\n\t\tstd::string soap_tmp(soap_QName2s(soap, (*i).c_str()));\n\t\tif (soap_out_%s(soap, tag, id, &soap_tmp, \"%s\"))", c_ident(temp), xsi_type_u(typ)); else if (is_XML(temp) && is_string(temp)) fprintf(fout, "\n\t\tif (soap_outliteral(soap, tag, (char*const*)&(*i), NULL))"); else if (is_XML(temp) && is_wstring(temp)) fprintf(fout, "\n\t\tif (soap_outwliteral(soap, tag, (wchar_t*const*)&(*i), NULL))"); else if (is_string(temp)) fprintf(fout, "\n\t\tif (soap_out_%s(soap, tag, -1, (char*const*)&(*i), \"%s\"))", c_ident(temp), xsi_type_u(typ)); else if (is_wstring(temp)) fprintf(fout, "\n\t\tif (soap_out_%s(soap, tag, -1, (wchar_t*const*)&(*i), \"%s\"))", c_ident(temp), xsi_type_u(typ)); else if (is_bool(temp)) fprintf(fout, "\n\t\tbool b = (*i);\n\t\tif (soap_out_%s(soap, tag, id, &b, \"%s\"))", c_ident(temp), xsi_type_u(typ)); else fprintf(fout, "\n\t\tif (soap_out_%s(soap, tag, id, &(*i), \"%s\"))", c_ident(temp), xsi_type_u(typ)); fprintf(fout, "\n\t\t\treturn soap->error;"); fprintf(fout, "\n\t}\n\treturn SOAP_OK;\n}"); } break; default: break; } } void soap_out_Darray(Tnode *typ) { int i, j, d = 0; Table *t, *table; Entry *p; const char *nse = ns_qualifiedElement(typ); const char *nsa = ns_qualifiedAttribute(typ); const char *item; table = (Table*)typ->ref; fprintf(fhead, "\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap*, const char*, int, const %s, const char*);", c_ident(typ), c_type_id(typ, "*")); if (is_external(typ)) return; if (is_binary(typ)) { fprintf(fhead, "\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap*, %s);", c_ident(typ), c_type(typ)); fprintf(fout, "\n\nSOAP_FMAC3S const char* SOAP_FMAC4S soap_%s2s(struct soap *soap, %s)\n{", c_ident(typ), c_type_id(typ, "a")); if (is_hexBinary(typ)) fprintf(fout, "\n\treturn soap_s2hex(soap, a.__ptr, NULL, a.__size);"); else fprintf(fout, "\n\treturn soap_s2base64(soap, a.__ptr, NULL, a.__size);"); fprintf(fout, "\n}"); } if (typ->type == Tclass && !is_volatile(typ) && !is_typedef(typ)) { fprintf(fout, "\n\nint %s::soap_out(struct soap *soap, const char *tag, int id, const char *type) const", c_type(typ)); fprintf(fout, "\n{\n\treturn soap_out_%s(soap, tag, id, this, type);\n}", c_ident(typ)); } fflush(fout); fprintf(fout, "\n\nSOAP_FMAC3 int SOAP_FMAC4 soap_out_%s(struct soap *soap, const char *tag, int id, const %s, const char *type)\n{", c_ident(typ), c_type_id(typ, "*a")); if (has_setter(typ)) fprintf(fout, "\n\t((%s)a)->set(soap);", c_type_id(typ, "*")); if (!is_binary(typ)) { p = is_dynamic_array(typ); d = get_Darraydims(typ); if (d) fprintf(fout, "\n\tsize_t i, n = soap_size(a->__size, %d);", d); else fprintf(fout, "\n\tint i, n = a->__size;"); } if (typ->type == Tclass) { for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.sto & Sattribute) soap_set_attr(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa)); } } } else { for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.sto & Sattribute) soap_set_attr(p, "a", ident(p->sym->name), ns_add(p, nsa)); } } } p = is_dynamic_array(typ); if (p->sym->name[5]) item = ns_addx(ns_convert(p->sym->name + 5), nse); else item = ns_addx("item", nse); if (!has_ns(typ) && !is_untyped(typ) && !is_binary(typ)) { const char *s = xsi_type(typ); if (is_untyped(p->info.typ)) s = wsdl_type(p->info.typ, "xsd"); if (d) { if (has_offset(typ)) fprintf(fout, "\n\tchar *t = a->%s ? soap_putsizesoffsets(soap, \"%s\", a->__size, a->__offset, %d) : NULL;", ident(p->sym->name), s, d); else fprintf(fout, "\n\tchar *t = a->%s ? soap_putsizesoffsets(soap, \"%s\", a->__size, NULL, %d) : NULL;", ident(p->sym->name), s, d); } else { if (has_offset(typ)) fprintf(fout, "\n\tchar *t = a->%s ? soap_putsizesoffsets(soap, \"%s\", &a->__size, &a->__offset, 1) : NULL;", ident(p->sym->name), s); else fprintf(fout, "\n\tchar *t = a->%s ? soap_putsizesoffsets(soap, \"%s\", &a->__size, NULL, 1) : NULL;", ident(p->sym->name), s); } } if (d) fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, a, a->%s, %s, type, %s, NULL);", ident(p->sym->name), get_Darraysize("a", d), soap_type(typ)); else if (is_attachment(typ)) { fprintf(fout, "\n#ifndef WITH_LEANER\n\tid = soap_attachment(soap, tag, id, a, a->%s, a->__size, a->id, a->type, a->options, type, %s);", ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n#else\n\tid = soap_element_id(soap, tag, id, a, a->%s, a->__size, type, %s, NULL);\n#endif", ident(p->sym->name), soap_type(typ)); } else fprintf(fout, "\n\tid = soap_element_id(soap, tag, id, a, a->%s, a->__size, type, %s, NULL);", ident(p->sym->name), soap_type(typ)); fprintf(fout, "\n\tif (id < 0)\n\t\treturn soap->error;"); fprintf(fout, "\n\tif ("); if (has_ns(typ) || is_untyped(typ) || is_binary(typ)) { if (table && table->prev) fprintf(fout, "soap_element_begin_out(soap, tag, id, type ? type : \"%s\")", xsi_type(typ)); else fprintf(fout, "soap_element_begin_out(soap, tag, id, type)"); } else if (has_offset(typ)) { if (d) fprintf(fout, "soap_array_begin_out(soap, tag, id, t, soap_putoffsets(soap, a->__offset, %d))", d); else fprintf(fout, "soap_array_begin_out(soap, tag, id, t, soap_putoffsets(soap, &a->__offset, 1))"); } else fprintf(fout, "soap_array_begin_out(soap, tag, id, t, NULL)"); fprintf(fout, ")\n\t\treturn soap->error;"); if (is_hexBinary(typ)) fprintf(fout, "\n\tif (soap_puthex(soap, a->__ptr, a->__size))\n\t\treturn soap->error;"); else if (is_binary(typ)) fprintf(fout, "\n\tif (soap_putbase64(soap, a->__ptr, a->__size))\n\t\treturn soap->error;"); else { fprintf(fout, "\n\tfor (i = 0; i < n; i++)\n\t{"); if (!has_ns(typ) && !is_untyped(typ)) { if (d) { fprintf(fout, "\n\t\tsoap->position = %d;", d); for (i = 0; i < d; i++) { fprintf(fout, "\n\t\tsoap->positions[%d] = i", i); for (j = i+1; j < d; j++) fprintf(fout, "/a->__size[%d]", j); fprintf(fout, "%%a->__size[%d];", i); } fprintf(fout, "\n\t\tif ("); if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "soap_outliteral(soap, \"%s\", (char*const*)&a->%s[i], NULL)", item, ident(p->sym->name)); else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "soap_outwliteral(soap, \"%s\", (wchar_t*const*)&a->%s[i], NULL)", item, ident(p->sym->name)); else if (is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "soap_out_%s(soap, \"%s\", -1, (char*const*)&a->%s[i], \"%s\")", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); else if (is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "soap_out_%s(soap, \"%s\", -1, (wchar_t*const*)&a->%s[i], \"%s\")", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); else if (((Tnode *)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "a->%s[i].soap_out(soap, \"%s\", -1, \"%s\")", ident(p->sym->name), item, xsi_type_u(((Tnode *)p->info.typ->ref))); else fprintf(fout, "soap_out_%s(soap, \"%s\", -1, &a->%s[i], \"%s\")", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); fprintf(fout, ")\n\t\t\treturn soap->error;"); } else { fprintf(fout, "\n\t\tsoap->position = 1;\n\t\tsoap->positions[0] = i;"); fprintf(fout, "\n\t\tif ("); if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "soap_outliteral(soap, \"%s\", &a->%s[i], NULL)", item, ident(p->sym->name)); else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "soap_outwliteral(soap, \"%s\", &a->%s[i], NULL)", item, ident(p->sym->name)); else if (is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "soap_out_%s(soap, \"%s\", -1, (char*const*)&a->%s[i], \"%s\")", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); else if (is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "soap_out_%s(soap, \"%s\", -1, (wchar_t*const*)&a->%s[i], \"%s\")", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); else if (((Tnode *)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "a->%s[i].soap_out(soap, \"%s\", -1, \"%s\")", ident(p->sym->name), item, xsi_type_u(((Tnode *)p->info.typ->ref))); else fprintf(fout, "soap_out_%s(soap, \"%s\", -1, &a->%s[i], \"%s\")", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); fprintf(fout, ")\n\t\t\treturn soap->error;"); } } else { fprintf(fout, "\n\t\tif ("); if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "soap_outliteral(soap, \"%s\", &a->%s[i], NULL)", item, ident(p->sym->name)); else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "soap_outwliteral(soap, \"%s\", &a->%s[i], NULL)", item, ident(p->sym->name)); else if (is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "soap_out_%s(soap, \"%s\", -1, (char*const*)&a->%s[i], \"%s\")", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); else if (is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "soap_out_%s(soap, \"%s\", -1, (wchar_t*const*)&a->%s[i], \"%s\")", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); else if (((Tnode *)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "a->%s[i].soap_out(soap, \"%s\", -1, \"%s\")", ident(p->sym->name), item, xsi_type_u(((Tnode *)p->info.typ->ref))); else fprintf(fout, "soap_out_%s(soap, \"%s\", -1, &a->%s[i], \"%s\")", c_ident(((Tnode *)p->info.typ->ref)), item, ident(p->sym->name), xsi_type_u(((Tnode *)p->info.typ->ref))); fprintf(fout, ")\n\t\t\treturn soap->error;"); } } if (is_binary(typ)) fprintf(fout, "\n\treturn soap_element_end_out(soap, tag);\n}"); else if (!has_ns(typ) && !is_untyped(typ)) fprintf(fout, "\n\t}\n\tsoap->position = 0;\n\treturn soap_element_end_out(soap, tag);\n}"); else fprintf(fout, "\n\t}\n\treturn soap_element_end_out(soap, tag);\n}"); } void soap_get(Tnode *typ) { Tnode *temp; int cardinality; if (is_XML(typ)) return; if (typ->type == Ttemplate || typ->type == Tunion) return; if (is_typedef(typ) && (is_template(typ) || is_element(typ) || is_synonym(typ) || is_external(typ) || is_imported(typ)) && (!is_external(typ) || is_volatile(typ))) { fprintf(fhead, "\n\n#define soap_get_%s soap_get_%s\n", c_ident(typ), t_ident(typ)); fprintf(fhead, "\n\n#define soap_read_%s soap_read_%s\n", c_ident(typ), t_ident(typ)); fprintf(fhead, "\n\n#define soap_GET_%s soap_GET_%s\n", c_ident(typ), t_ident(typ)); fprintf(fhead, "\n\n#define soap_POST_recv_%s soap_POST_recv_%s\n", c_ident(typ), t_ident(typ)); return; } if (typ->type == Tarray) { /* ARRAY */ temp = get_item_type(typ, &cardinality); fprintf(fhead, "\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_get_%s(struct soap*, %s, const char*, const char*);", c_type(temp), c_ident(typ), c_type_id(typ, "")); fprintf(fout, "\n\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_get_%s(struct soap *soap, %s, const char *tag, const char *type)", c_type(temp), c_ident(typ), c_type_id(typ, "a")); fprintf(fout, "\n{\n\t%s;", c_type_id(temp, "(*p)")); fprintf(fout, "\n\tif ((p = soap_in_%s(soap, tag, a, type)))", c_ident(typ)); } else if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) { /* CLASS */ fprintf(fout, "\n\nvoid *%s::soap_get(struct soap *soap, const char *tag, const char *type)", c_type(typ)); fprintf(fout, "\n{\n\treturn soap_get_%s(soap, this, tag, type);\n}", c_ident(typ)); fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_get_%s(struct soap*, %s, const char*, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_get_%s(struct soap *soap, %s, const char *tag, const char *type)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*p")); fprintf(fout, "\n\tif ((p = soap_in_%s(soap, tag, p, type)))", c_ident(typ)); } else { fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_get_%s(struct soap*, %s, const char*, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_get_%s(struct soap *soap, %s, const char *tag, const char *type)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*p")); fprintf(fout, "\n\tif ((p = soap_in_%s(soap, tag, p, type)))", c_ident(typ)); } fprintf(fout, "\n\t\tif (soap_getindependent(soap))\n\t\t\treturn NULL;"); fprintf(fout, "\n\treturn p;\n}"); if ((typ->type != Tpointer || is_string(typ) || is_wstring(typ)) && typ->type != Tarray && typ->type != Treference && typ->type != Trvalueref && !is_template(typ) && !is_anyAttribute(typ)) { if (typ->type == Tclass && !is_external(typ) && !is_volatile(typ) && !is_typedef(typ)) { if (namespaceid && !is_external(typ)) fprintf(fhead, "\n\ninline int soap_read_%s(struct soap *soap, %s)\n{\n\tif (p)\n\t{\tp->soap_default(soap);\n\t\tif (soap_begin_recv(soap) || %s::soap_get_%s(soap, p, NULL, NULL) == NULL || soap_end_recv(soap))\n\t\t\treturn soap->error;\n\t}\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_id(typ, "*p"), namespaceid, c_ident(typ)); else if (!is_external(typ)) fprintf(fhead, "\n\ninline int soap_read_%s(struct soap *soap, %s)\n{\n\tif (p)\n\t{\tp->soap_default(soap);\n\t\tif (soap_begin_recv(soap) || ::soap_get_%s(soap, p, NULL, NULL) == NULL || soap_end_recv(soap))\n\t\t\treturn soap->error;\n\t}\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_id(typ, "*p"), c_ident(typ)); else fprintf(fhead, "\n\ninline int soap_read_%s(struct soap *soap, %s)\n{\n\tif (p)\n\t{\tp->soap_default(soap);\n\t\tif (soap_begin_recv(soap) || soap_get_%s(soap, p, NULL, NULL) == NULL || soap_end_recv(soap))\n\t\t\treturn soap->error;\n\t}\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_id(typ, "*p"), c_ident(typ)); } else if (is_primitive_or_string(typ)) { if (cflag) fprintf(fhead, "\n\n#ifndef soap_read_%s\n#define soap_read_%s(soap, data) ( soap_begin_recv(soap) || !soap_get_%s(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ)); else if (namespaceid && !is_external(typ)) fprintf(fhead, "\n\ninline int soap_read_%s(struct soap *soap, %s)\n{\n\tif (p)\n\t{\tif (soap_begin_recv(soap) || %s::soap_get_%s(soap, p, NULL, NULL) == NULL || soap_end_recv(soap))\n\t\t\treturn soap->error;\n\t}\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_id(typ, "*p"), namespaceid, c_ident(typ)); else if (!is_external(typ)) fprintf(fhead, "\n\ninline int soap_read_%s(struct soap *soap, %s)\n{\n\tif (p)\n\t{\tif (soap_begin_recv(soap) || ::soap_get_%s(soap, p, NULL, NULL) == NULL || soap_end_recv(soap))\n\t\t\treturn soap->error;\n\t}\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_id(typ, "*p"), c_ident(typ)); else fprintf(fhead, "\n\ninline int soap_read_%s(struct soap *soap, %s)\n{\n\tif (p)\n\t{\tif (soap_begin_recv(soap) || soap_get_%s(soap, p, NULL, NULL) == NULL || soap_end_recv(soap))\n\t\t\treturn soap->error;\n\t}\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_id(typ, "*p"), c_ident(typ)); } else { if (cflag) fprintf(fhead, "\n\n#ifndef soap_read_%s\n#define soap_read_%s(soap, data) ( ((data) ? (soap_default_%s(soap, (data)), 0) : 0) || soap_begin_recv(soap) || !soap_get_%s(soap, (data), NULL, NULL) || soap_end_recv(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ), c_ident(typ)); else if (namespaceid && !is_external(typ)) fprintf(fhead, "\n\ninline int soap_read_%s(struct soap *soap, %s)\n{\n\tif (p)\n\t{\t%s::soap_default_%s(soap, p);\n\t\tif (soap_begin_recv(soap) || %s::soap_get_%s(soap, p, NULL, NULL) == NULL || soap_end_recv(soap))\n\t\t\treturn soap->error;\n\t}\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_id(typ, "*p"), namespaceid, c_ident(typ), namespaceid, c_ident(typ)); else if (!is_external(typ)) fprintf(fhead, "\n\ninline int soap_read_%s(struct soap *soap, %s)\n{\n\tif (p)\n\t{\t::soap_default_%s(soap, p);\n\t\tif (soap_begin_recv(soap) || ::soap_get_%s(soap, p, NULL, NULL) == NULL || soap_end_recv(soap))\n\t\t\treturn soap->error;\n\t}\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_id(typ, "*p"), c_ident(typ), c_ident(typ)); else fprintf(fhead, "\n\ninline int soap_read_%s(struct soap *soap, %s)\n{\n\tif (p)\n\t{\tsoap_default_%s(soap, p);\n\t\tif (soap_begin_recv(soap) || soap_get_%s(soap, p, NULL, NULL) == NULL || soap_end_recv(soap))\n\t\t\treturn soap->error;\n\t}\n\treturn SOAP_OK;\n}", c_ident(typ), c_type_id(typ, "*p"), c_ident(typ), c_ident(typ)); } if (cflag) fprintf(fhead, "\n\n#ifndef soap_GET_%s\n#define soap_GET_%s(soap, URL, data) ( soap_GET(soap, URL, NULL) || soap_read_%s(soap, (data)), soap_closesock(soap) )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ)); else if (namespaceid && !is_external(typ)) fprintf(fhead, "\n\ninline int soap_GET_%s(struct soap *soap, const char *URL, %s)\n{\n\tif (soap_GET(soap, URL, NULL) || %s::soap_read_%s(soap, p))\n\t\treturn soap_closesock(soap);\n\treturn soap_closesock(soap);\n}", c_ident(typ), c_type_id(typ, "*p"), namespaceid, c_ident(typ)); else if (!is_external(typ)) fprintf(fhead, "\n\ninline int soap_GET_%s(struct soap *soap, const char *URL, %s)\n{\n\tif (soap_GET(soap, URL, NULL) || ::soap_read_%s(soap, p))\n\t\treturn soap_closesock(soap);\n\treturn soap_closesock(soap);\n}", c_ident(typ), c_type_id(typ, "*p"), c_ident(typ)); else fprintf(fhead, "\n\ninline int soap_GET_%s(struct soap *soap, const char *URL, %s)\n{\n\tif (soap_GET(soap, URL, NULL) || soap_read_%s(soap, p))\n\t\treturn soap_closesock(soap);\n\treturn soap_closesock(soap);\n}", c_ident(typ), c_type_id(typ, "*p"), c_ident(typ)); if (cflag) fprintf(fhead, "\n\n#ifndef soap_POST_recv_%s\n#define soap_POST_recv_%s(soap, data) ( soap_read_%s(soap, (data)) || soap_closesock(soap), (soap)->error )\n#endif\n", c_ident(typ), c_ident(typ), c_ident(typ)); else if (namespaceid && !is_external(typ)) fprintf(fhead, "\n\ninline int soap_POST_recv_%s(struct soap *soap, %s)\n{\n\tif (%s::soap_read_%s(soap, p))\n\t\treturn soap_closesock(soap);\n\treturn soap_closesock(soap);\n}", c_ident(typ), c_type_id(typ, "*p"), namespaceid, c_ident(typ)); else if (!is_external(typ)) fprintf(fhead, "\n\ninline int soap_POST_recv_%s(struct soap *soap, %s)\n{\n\tif (::soap_read_%s(soap, p))\n\t\treturn soap_closesock(soap);\n\treturn soap_closesock(soap);\n}", c_ident(typ), c_type_id(typ, "*p"), c_ident(typ)); else fprintf(fhead, "\n\ninline int soap_POST_recv_%s(struct soap *soap, %s)\n{\n\tif (soap_read_%s(soap, p))\n\t\treturn soap_closesock(soap);\n\treturn soap_closesock(soap);\n}", c_ident(typ), c_type_id(typ, "*p"), c_ident(typ)); } fflush(fout); } void soap_in(Tnode *typ) { Entry *p = NULL; Table *table, *t; int strict, nonempty, flag, cardinality, i, j; Tnode *n, *temp; const char *nse = ns_qualifiedElement(typ); const char *nsa = ns_qualifiedAttribute(typ); int der = 0; if (is_XML(typ)) return; if (is_dynamic_array(typ)) { soap_in_Darray(typ); return; } if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap*, const char*, %s);", c_ident(typ), c_type_id(typ, "*")); } else if (is_qname(typ)) fprintf(fhead, "\n\n#define soap_s2%s(soap, s, a) soap_s2QName((soap), (s), (char**)(a), %ld, %ld, %s)", c_ident(typ), minlen(typ), maxlen(typ), pattern(typ)); else if (is_string(typ)) fprintf(fhead, "\n\n#define soap_s2%s(soap, s, a) soap_s2char((soap), (s), (char**)(a), %d, %ld, %ld, %s)", c_ident(typ), property(typ), minlen(typ), maxlen(typ), pattern(typ)); else if (is_wstring(typ)) fprintf(fhead, "\n\n#define soap_s2%s(soap, s, a) soap_s2wchar((soap), (s), (wchar_t**)(a), %d, %ld, %ld, %s)", c_ident(typ), property(typ), minlen(typ), maxlen(typ), pattern(typ)); else if (is_stdqname(typ)) fprintf(fhead, "\n\n#define soap_s2%s(soap, s, a) soap_s2stdQName((soap), (s), (a), %ld, %ld, %s)", c_ident(typ), minlen(typ), maxlen(typ), pattern(typ)); else if (is_stdstring(typ)) fprintf(fhead, "\n\n#define soap_s2%s(soap, s, a) soap_s2stdchar((soap), (s), (a), %d, %ld, %ld, %s)", c_ident(typ), property(typ), minlen(typ), maxlen(typ), pattern(typ)); else if (is_stdwstring(typ)) fprintf(fhead, "\n\n#define soap_s2%s(soap, s, a) soap_s2stdwchar((soap), (s), (a), %d, %ld, %ld, %s)", c_ident(typ), property(typ), minlen(typ), maxlen(typ), pattern(typ)); else if (is_typedef(typ) && typ->type <= Tstruct && (!is_external(typ) || is_volatile(typ)) && !is_qname(typ) && !is_stdqname(typ)) { if (!is_synonym(typ) && (typ->hasmin || typ->hasmax || (typ->pattern && typ->pattern[0] != '%'))) { fprintf(fhead, "\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap*, const char*, %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap *soap, const char *s, %s)\n{", c_ident(typ), c_type_id(typ, "*a")); if (is_string(typ) || is_wstring(typ) || is_stdstr(typ)) fprintf(fout, "\n\tint err = soap_s2%s(soap, s, a, %ld, %ld, %s);\n\tif (!err)\n\t{", t_ident(typ), minlen(typ), maxlen(typ), pattern(typ)); else { fprintf(fout, "\n\tint err = soap_s2%s(soap, s, a);\n\tif (!err)\n\t{", t_ident(typ)); if (typ->hasmin) { if (!cflag && (typ->type == Tclass || typ->type == Tstruct)) { long min = minlen(typ); if (min > 0) fprintf(fout, "\n\t\tif (a->size() < %ld)\n\t\t\treturn soap->error = SOAP_LENGTH;", min); } else if ((typ->type >= Tfloat && typ->type <= Tldouble) || is_external(typ)) fprintf(fout, "\n\t\tif (*a %s %.17lG)\n\t\t\treturn soap->error = SOAP_LENGTH;", typ->incmin ? "<" : "<=", typ->rmin); else if (typ->imin > 0 || typ->type < Tuchar || typ->type > Tullong) fprintf(fout, "\n\t\tif (*a %s " SOAP_LONG_FORMAT ")\n\t\t\treturn soap->error = SOAP_LENGTH;", typ->incmin ? "<" : "<=", typ->imin); } if (typ->hasmax) { if (!cflag && (typ->type == Tclass || typ->type == Tstruct)) { long max = maxlen(typ); if (max >= 0) fprintf(fout, "\n\t\tif (a->size() > %ld)\n\t\t\treturn soap->error = SOAP_LENGTH;", max); } else if ((typ->type >= Tfloat && typ->type <= Tldouble) || is_external(typ)) fprintf(fout, "\n\t\tif (*a %s %.17lG)\n\t\t\treturn soap->error = SOAP_LENGTH;", typ->incmax ? ">" : ">=", typ->rmax); else if (typ->imax >= 0 || typ->type < Tuchar || typ->type > Tullong) fprintf(fout, "\n\t\tif (*a %s " SOAP_LONG_FORMAT ")\n\t\t\treturn soap->error = SOAP_LENGTH;", typ->incmax ? ">" : ">=", typ->imax); } } fprintf(fout, "\n\t}\n\treturn err;\n}"); } else fprintf(fhead, "\n\n#define soap_s2%s soap_s2%s\n", c_ident(typ), t_ident(typ)); } if (is_typedef(typ) && (is_element(typ) || is_synonym(typ)) && (!is_external(typ) || is_volatile(typ))) { fprintf(fhead, "\n\n#define soap_in_%s soap_in_%s\n", c_ident(typ), t_ident(typ)); return; } if ((is_primitive_or_string(typ) && typ->type != Tenum && typ->type != Tenumsc) || (is_external(typ) && is_volatile(typ))) { if (is_stdstring(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC1 std::string * SOAP_FMAC2 soap_in_%s(struct soap*, const char*, std::string*, const char*);", c_ident(typ)); return; } fprintf(fhead, "\nSOAP_FMAC3 std::string * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::string*, const char*);", c_ident(typ)); if (is_stdXML(typ)) fprintf(fout, "\n\nSOAP_FMAC3 std::string * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, std::string *s, const char *type)\n{\n\tchar *t;\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_inliteral(soap, tag, &t))\n\t{\tif (!s)\n\t\t\ts = soap_new_std__string(soap, -1);\n\t\ts->assign(t);\n\t\treturn s;\n\t}\n\treturn NULL;\n}", c_ident(typ)); else { fprintf(fout, "\n\nSOAP_FMAC3 std::string * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, std::string *s, const char *type)\n{\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;\n\tif (!s)\n\t\ts = soap_new_std__string(soap, -1);\n\tif (soap->null)\n\t\tif (s)\n\t\t\ts->erase();", c_ident(typ)); fprintf(fout, "\n\tif (soap->body && *soap->href != '#')\n\t{\tchar *t;\n\t\ts = (std::string*)soap_id_enter(soap, soap->id, s, %s, sizeof(std::string), soap->type, soap->arrayType, %s_instantiate, %s_fbase);\n\t\tif (s)\n\t\t{\tif (!(t = soap_string_in(soap, %d, %ld, %ld, %s)))\n\t\t\t\treturn NULL;\n\t\t\ts->assign(t);\n\t\t}\n\t}\n\telse\n\t\ts = (std::string*)soap_id_forward(soap, soap->href, soap_id_enter(soap, soap->id, s, %s, sizeof(std::string), soap->type, soap->arrayType, %s_instantiate, %s_fbase), 0, %s, %s, sizeof(std::string), 0, %s_finsert, NULL);\n\tif (soap->body && soap_element_end_in(soap, tag))\n\t\treturn NULL;\n\treturn s;\n}", soap_type(typ), prefix, prefix, property(typ), minlen(typ), maxlen(typ), pattern(typ), soap_type(typ), prefix, prefix, soap_type(typ), soap_type(typ), prefix); } return; } if (is_stdwstring(typ)) { if (is_external(typ)) { fprintf(fhead, "\nSOAP_FMAC3 std::wstring * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::wstring*, const char*);", c_ident(typ)); return; } if (is_stdXML(typ)) fprintf(fout, "\n\nSOAP_FMAC3 std::wstring * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, std::wstring *s, const char *type)\n{\n\twchar_t *t;\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_inwliteral(soap, tag, &t))\n\t{\tif (!s)\n\t\t\ts = soap_new_std__wstring(soap, -1);\n\t\ts->assign(t);\n\t\treturn s;\n\t}\n\treturn NULL;\n}", c_ident(typ)); else { fprintf(fhead, "\nSOAP_FMAC3 std::wstring * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, std::wstring*, const char*);", c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 std::wstring * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, std::wstring *s, const char *type)\n{\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;\n\tif (!s)\n\t\ts = soap_new_std__wstring(soap, -1);\n\tif (soap->null)\n\t\tif (s)\n\t\t\ts->erase();", c_ident(typ)); fprintf(fout, "\n\tif (soap->body && *soap->href != '#')\n\t{\twchar_t *t;\n\t\ts = (std::wstring*)soap_id_enter(soap, soap->id, s, %s, sizeof(std::wstring), soap->type, soap->arrayType, %s_instantiate, %s_fbase);\n\t\tif (s)\n\t\t{\tif (!(t = soap_wstring_in(soap, %d, %ld, %ld, %s)))\n\t\t\t\treturn NULL;\n\t\t\ts->assign(t);\n\t\t}\n\t}\n\telse\n\t\ts = (std::wstring*)soap_id_forward(soap, soap->href, soap_id_enter(soap, soap->id, s, %s, sizeof(std::wstring), soap->type, soap->arrayType, %s_instantiate, %s_fbase), 0, %s, %s, sizeof(std::wstring), 0, %s_finsert, NULL);\n\tif (soap->body && soap_element_end_in(soap, tag))\n\t\treturn NULL;\n\treturn s;\n}", soap_type(typ), prefix, prefix, property(typ), minlen(typ), maxlen(typ), pattern(typ), soap_type(typ), prefix, prefix, soap_type(typ), soap_type(typ), prefix); } return; } if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s * SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type(typ), c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type(typ), c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type(typ), c_ident(typ), c_type_id(typ, "*a")); if (is_wstring(typ)) fprintf(fout, "\n\ta = soap_inwstring(soap, tag, a, type, %s, %d, %ld, %ld, %s);", soap_type(typ), property(typ), minlen(typ), maxlen(typ), pattern(typ)); else if (is_string(typ)) fprintf(fout, "\n\ta = soap_instring(soap, tag, a, type, %s, %d, %ld, %ld, %s);", soap_type(typ), property(typ), minlen(typ), maxlen(typ), pattern(typ)); else { if (typ->type == Tllong || typ->type == Tullong) fprintf(fout, "\n\ta = soap_in%s(soap, tag, a, type, %s);", c_type(typ), soap_type(typ)); else if (is_primitive_or_string(typ)) fprintf(fout, "\n\ta = soap_in%s(soap, tag, a, type, %s);", the_type(typ), soap_type(typ)); else fprintf(fout, "\n\ta = soap_in_%s(soap, tag, a, type);", t_ident(typ)); if (typ->hasmin) { if (!cflag && (typ->type == Tclass || typ->type == Tstruct)) { long min = minlen(typ); if (min > 0) fprintf(fout, "\n\tif (a && a->size() < %ld)\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", min); } else if ((typ->type >= Tfloat && typ->type <= Tldouble) || is_external(typ)) fprintf(fout, "\n\tif (a && *a %s %.17lG)\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", typ->incmin ? "<" : "<=", typ->rmin); else if (typ->imin > 0 || typ->type < Tuchar || typ->type > Tullong) fprintf(fout, "\n\tif (a && *a %s " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", typ->incmin ? "<" : "<=", typ->imin); } if (typ->hasmax) { if (!cflag && (typ->type == Tclass || typ->type == Tstruct)) { long max = maxlen(typ); if (max >= 0) fprintf(fout, "\n\tif (a && a->size() > %ld)\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", max); } else if ((typ->type >= Tfloat && typ->type <= Tldouble) || is_external(typ)) fprintf(fout, "\n\tif (a && *a %s %.17lG)\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", typ->incmax ? ">" : ">=", typ->rmax); else if (typ->imax >= 0 || typ->type < Tuchar || typ->type > Tullong) fprintf(fout, "\n\tif (a && *a %s " SOAP_LONG_FORMAT ")\n\t{\tsoap->error = SOAP_LENGTH;\n\t\treturn NULL;\n\t}", typ->incmax ? ">" : ">=", typ->imax); } } fprintf(fout, "\n\treturn a;\n}"); fflush(fout); return; } if (is_fixedstring(typ)) { int n = typ->width / ((Tnode*)typ->ref)->width; fprintf(fhead, "\nSOAP_FMAC3 char* SOAP_FMAC4 soap_in_%s(struct soap*, const char*, char[], const char*);", c_ident(typ)); fprintf(fout, "\n\nSOAP_FMAC3 char* SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, char a[], const char *type)\n{\tchar *p = NULL;\n\tif (!soap_instring(soap, tag, &p, type, %s, 1, 0, %d, %s))\n\t\treturn NULL;\n\tif (!p)\n\t{\tif (*soap->href == '#')\n\t\t\tsoap_id_nullify(soap, soap->href);\n\t\telse\n\t\t\tsoap->error = SOAP_NULL;\n\t\treturn NULL;\n\t}\n\tsoap_strncpy(a, %d, p, %d);\n\treturn a;\n}", c_ident(typ), soap_type(typ), n - 1, pattern(typ), n, n - 1); return; } switch(typ->type) { case Tstruct: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*a")); table = (Table*)typ->ref; if (!table) { fprintf(fout, "\n\t(void)soap; (void)tag; (void)a; (void)type; /* appease -Wall -Werror */"); fprintf(fout, "\n\tif (!a)\n\t\tsoap->error = SOAP_TAG_MISMATCH;\n\treturn a;\n}"); } else if (is_primclass(typ)) { for (p = table->list; p; p = p->next) { if (is_pointer_to_derived(p)) { der = 1; break; } } if (der) fprintf(fout, "\n\tint err = soap_element_begin_in(soap, tag, 1, type);\n\tif (err && err != SOAP_TYPE)\n\t\treturn NULL;"); else fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;"); fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */"); if (!cflag) fprintf(fout, "\n\tif (!(a = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType, %s_instantiate, %s_fbase)))\n\t\treturn NULL;", c_type_id(typ, "*"), soap_type(typ), c_type(typ), prefix, prefix); else fprintf(fout, "\n\tif (!(a = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), NULL, NULL, NULL, NULL)))\n\t\treturn NULL;", c_type_id(typ, "*"), soap_type(typ), c_type(typ)); fprintf(fout, "\n\tsoap_revert(soap);\n\t*soap->id = '\\0';"); fprintf(fout, "\n\tsoap_default_%s(soap, a);", c_ident(typ)); if (der) { fprintf(fout, "\n\tif (err == SOAP_TYPE)\n\t{"); for (p = table->list; p; p = p->next) { if (is_pointer_to_derived(p)) { fprintf(fout, "\n\t\tif (("); gen_match_derived(fout, p->info.typ->ref); fprintf(fout, ") && (a->%s = soap_in_%s(soap, tag, NULL, NULL)) != NULL)\n\t\t\treturn a;", ident(p->sym->name), c_ident(p->info.typ->ref)); } } fprintf(fout, "\n\t\treturn NULL;\n\t}"); } for (t = (Table*)typ->ref; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, "a", ident(p->sym->name), ns_add(p, nsa)); fflush(fout); for (table = (Table*)typ->ref; table; table = table->prev) { p = table->list; while (p && !is_item(p)) p = p->next; if (p) break; } if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tif (!soap_inliteral(soap, tag, (char**)&a->%s))", ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tif (!soap_inwliteral(soap, tag, (wchar_t**)&a->%s))", ident(p->sym->name)); else if (is_string(p->info.typ)) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, (char**)&a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, (wchar_t**)&a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif (!a->%s.soap_in(soap, tag, \"%s\"))", ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, &a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(typ)); fprintf(fout, "\n\t\treturn NULL;"); fixed_check(fout, p, NULL, "\t"); if (has_getter(typ)) fprintf(fout, "\n\tif (a->get(soap))\n\t\treturn NULL;"); fprintf(fout, "\n\treturn a;\n}"); } else { table = (Table*)typ->ref; if (!is_discriminant(typ)) { for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (!(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (is_anytype(p) || is_choice(p)) { p = p->next; fprintf(fout, "\n\tsize_t soap_flag_%s = " SOAP_LONG_FORMAT ";", ident(p->sym->name), p->info.maxOccurs); } else if (is_repetition(p)) { fprintf(fout, "\n\tstruct soap_blist *soap_blist_%s = NULL;", ident(p->next->sym->name)); p = p->next; } else if (!is_transient(p->info.typ) && !is_container(p->info.typ)) fprintf(fout, "\n\tsize_t soap_flag_%s = " SOAP_LONG_FORMAT ";", ident(p->sym->name), p->info.maxOccurs); } } } } if (!is_invisible(typ->id->name)) { for (p = table->list; p; p = p->next) { if (is_pointer_to_derived(p)) { der = 1; break; } } if (der) fprintf(fout, "\n\tint err = soap_element_begin_in(soap, tag, 0, type);\n\tif (err && err != SOAP_TYPE)\n\t\treturn NULL;"); else fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 0, NULL))\n\t\treturn NULL;"); fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */"); } else if (!is_discriminant(typ)) { if (table && (table->prev || table->list)) fprintf(fout, "\n\tshort soap_flag;"); fprintf(fout, "\n\t(void)tag; (void)type; /* appease -Wall -Werror */"); } else { fprintf(fout, "\n\t(void)tag; (void)type; /* appease -Wall -Werror */"); } if (has_class(typ)) { if (is_invisible(typ->id->name)) fprintf(fout, "\n\ta = (%s*)soap_id_enter(soap, \"\", a, %s, sizeof(%s), soap->type, soap->arrayType, %s_instantiate, %s_fbase);", c_type(typ), soap_type(typ), c_type(typ), prefix, prefix); else fprintf(fout, "\n\ta = (%s*)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType, %s_instantiate, %s_fbase);", c_type(typ), soap_type(typ), c_type(typ), prefix, prefix); } else if (is_invisible(typ->id->name)) fprintf(fout, "\n\ta = (%s*)soap_id_enter(soap, \"\", a, %s, sizeof(%s), NULL, NULL, NULL, NULL);", c_type(typ), soap_type(typ), c_type(typ)); else fprintf(fout, "\n\ta = (%s*)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), NULL, NULL, NULL, NULL);", c_type(typ), soap_type(typ), c_type(typ)); fprintf(fout, "\n\tif (!a)\n\t\treturn NULL;"); fprintf(fout, "\n\tsoap_default_%s(soap, a);", c_ident(typ)); if (der) { fprintf(fout, "\n\tif (err == SOAP_TYPE)\n\t{"); for (p = table->list; p; p = p->next) { if (is_pointer_to_derived(p)) { fprintf(fout, "\n\t\tif (("); gen_match_derived(fout, p->info.typ->ref); fprintf(fout, ") && (a->%s = soap_in_%s(soap, tag, NULL, \"%s\")) != NULL)\n\t\t\treturn a;", ident(p->sym->name), c_ident(p->info.typ->ref), xsi_type(p->info.typ->ref)); } } fprintf(fout, "\n\t\treturn NULL;\n\t}"); } for (t = table; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, "a", ident(p->sym->name), ns_add(p, nsa)); if (!is_invisible(typ->id->name)) { if (!is_discriminant(typ)) { fprintf(fout, "\n\tif (soap->body && *soap->href != '#')\n\t{"); fprintf(fout, "\n\t\tfor (;;)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;"); } else fprintf(fout, "\n\tif (!tag || *tag == '-' || (soap->body && *soap->href != '#'))\n\t{"); } else if (!is_discriminant(typ)) { if (table && (table->prev || table->list)) fprintf(fout, "\n\t\tfor (soap_flag = 0;; soap_flag = 1)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;"); } flag = 0; for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { if (is_unmatched(p->next->sym) || is_invisible(p->next->sym->name)) { p = p->next; continue; } flag = 1; fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && "); fprintf(fout, "!soap_element_begin_in(soap, %s, 1, NULL))", field(p->next, nse)); fprintf(fout, "\n\t\t\t{\tif (a->%s == NULL)\n\t\t\t\t{\tif (soap_blist_%s == NULL)\n\t\t\t\t\t\tsoap_blist_%s = soap_alloc_block(soap);", ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass || ((Tnode*)p->next->info.typ->ref)->type == Ttemplate || has_class((Tnode*)p->next->info.typ->ref) || (!cflag && ((Tnode*)p->next->info.typ->ref)->type == Tstruct)) fprintf(fout, "\n\t\t\t\t\ta->%s = soap_block<%s>::push(soap, soap_blist_%s);\n\t\t\t\t\tif (a->%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name), ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t\t\t\t\ta->%s = (const %s)soap_push_block_max(soap, soap_blist_%s, sizeof(%s));\n\t\t\t\t\tif (a->%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), c_type((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\ta->%s = (%s)soap_push_block_max(soap, soap_blist_%s, sizeof(%s));\n\t\t\t\t\tif (a->%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), c_type((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\ta->%s->soap_default(soap);", ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\tsoap_default_%s(soap, a->%s);", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\t*a->%s = NULL;", ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t}"); fprintf(fout, "\n\t\t\t\tsoap_revert(soap);"); if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, %s, (char**)a->%s))", field(p->next, nse), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, %s, (wchar_t**)a->%s))", field(p->next, nse), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (char**)a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (wchar_t**)a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); fprintf(fout, "\n\t\t\t\t{\ta->%s++;\n\t\t\t\t\ta->%s = NULL;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}", ident(p->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_anytype(p)) { flag = 1; fprintf(fout, "\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->next->sym->name)); if (is_self(p->next)) fprintf(fout, "\n\t\t\t{\tif ((a->%s = soap_getelement(soap, tag, &a->%s)))", ident(p->next->sym->name), ident(p->sym->name)); else if (is_invisible(p->next->sym->name)) fprintf(fout, "\n\t\t\t{\tif ((a->%s = soap_getelement(soap, NULL, &a->%s)))", ident(p->next->sym->name), ident(p->sym->name)); else fprintf(fout, "\n\t\t\t{\tif ((a->%s = soap_getelement(soap, %s, &a->%s)))", ident(p->next->sym->name), field(p->next, nse), ident(p->sym->name)); fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s = 0;", ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}\n\t\t\t}"); p = p->next; } else if (is_discriminant(typ) && p->next) { flag = 1; fprintf(fout, "\n\t\tif (!soap_in_%s(soap, &a->%s, &a->%s))", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\t\treturn NULL;"); break; } else if (is_choice(p)) { flag = 1; fprintf(fout, "\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t{\tif (soap_in_%s(soap, &a->%s, &a->%s))", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s = 0;", ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}\n\t\t\t}"); p = p->next; } else if (is_transient(p->info.typ)) { if (!is_pointer_to_derived(p)) fprintf(fout, "\n\t\t\t/* transient %s skipped */", ident(p->sym->name)); } else { flag = 1; if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap_flag_%s && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))", ident(p->sym->name)); else if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); else fprintf(fout, "\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->sym->name)); fprintf(fout, "\n\t\t\t{\t"); } if (is_unmatched(p->sym)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "if (soap_inliteral(soap, NULL, (char**)&a->%s))", ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "if (soap_inwliteral(soap, NULL, (wchar_t**)&a->%s))", ident(p->sym->name)); } else if (is_string(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, NULL, (char**)&a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(p->info.typ)); } else if (is_wstring(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, NULL, (wchar_t**)&a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tarray) { fprintf(fout, "if (soap_in_%s(soap, NULL, a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "if (a->%s.soap_in(soap, NULL, \"%s\"))", ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, NULL, &a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(p->info.typ)); } } else if (!is_invisible(p->sym->name)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "if (soap_inliteral(soap, %s, (char**)&a->%s))", field(p, nse), ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "if (soap_inwliteral(soap, %s, (wchar_t**)&a->%s))", field(p, nse), ident(p->sym->name)); } else if (is_string(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, %s, (char**)&a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); } else if (is_wstring(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, %s, (wchar_t**)&a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tarray) { fprintf(fout, "if (soap_in_%s(soap, %s, a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "if (a->%s.soap_in(soap, %s, \"%s\"))", ident(p->sym->name), field(p, nse), xsi_type(p->info.typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, %s, &a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); } } if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\t\t\tcontinue;"); else { fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s--;", ident(p->sym->name)); fixed_check(fout, p, NULL, "\t\t\t\t\t"); if (p->info.hasval && !p->info.fixed && (is_string(p->info.typ) || is_wstring(p->info.typ))) { fprintf(fout, "\n\t\t\t\t\tif (*soap->href != '#' && a->%s && ", ident(p->sym->name)); fprintf(fout, "!*a->%s)", ident(p->sym->name)); fprintf(fout, "\n\t\t\t\t\t\ta->%s%s;", ident(p->sym->name), c_init(p)); } else if (p->info.ptrval && !p->info.fixed && (is_string(p->info.typ->ref) || is_wstring(p->info.typ->ref) || is_stdstring(p->info.typ->ref) || is_stdwstring(p->info.typ->ref))) { Tnode *ptr = (Tnode*)p->info.typ->ref; if (is_smart(p->info.typ)) fprintf(fout, "\n\t\t\t\t\tif (*soap->href != '#' && a->%s.get() && ", ident(p->sym->name)); else fprintf(fout, "\n\t\t\t\t\tif (*soap->href != '#' && a->%s && ", ident(p->sym->name)); if (is_string(ptr) || is_wstring(ptr)) fprintf(fout, "*a->%s && !**a->%s)", ident(p->sym->name), ident(p->sym->name)); else fprintf(fout, "a->%s->empty())", ident(p->sym->name)); fprintf(fout, "\n\t\t\t\t\t\t*a->%s%s;", ident(p->sym->name), c_init(p)); } fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}"); if (p->info.ptrval && !p->info.fixed && !(is_string(p->info.typ->ref) || is_wstring(p->info.typ->ref) || is_stdstring(p->info.typ->ref) || is_stdwstring(p->info.typ->ref))) { Tnode *ptr = (Tnode*)p->info.typ->ref; fprintf(fout, "\n\t\t\t\tif (soap->error == SOAP_EMPTY)\n\t\t\t\t{\t"); if (is_smart(p->info.typ)) { if (is_smart_shared(p->info.typ)) fprintf(fout, "a->%s = %s<%s>();", ident(p->sym->name), make_shared(p->info.typ), c_type(ptr)); else if (ptr->type == Tclass && !is_external(ptr) && !is_volatile(ptr) && !is_typedef(ptr)) fprintf(fout, "a->%s = %s(%s_instantiate_%s(soap, SOAP_NO_LINK_TO_DELETE, soap->type, soap->arrayType, NULL));", ident(p->sym->name), c_type(p->info.typ), fprefix, c_ident(ptr)); else fprintf(fout, "a->%s = %s(SOAP_NEW(soap, %s));", ident(p->sym->name), c_type(p->info.typ), c_type(ptr)); } else if (ptr->type == Tclass) { fprintf(fout, "if (!(a->%s = (%s)%s_instantiate_%s(soap, -1, soap->type, soap->arrayType, NULL)))\n\t\t\t\t\t\treturn NULL;", ident(p->sym->name), c_type(p->info.typ), fprefix, c_ident(ptr)); } else { fprintf(fout, "if (!(a->%s = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t\t\t\t\treturn NULL;", ident(p->sym->name), c_type(p->info.typ), c_type(ptr)); } fprintf(fout, "\n\t\t\t\t\t*a->%s%s;", ident(p->sym->name), c_init(p)); fprintf(fout, "\n\t\t\t\t\tsoap->error = SOAP_OK;\n\t\t\t\t\tsoap_flag_%s--;\n\t\t\t\t\tcontinue;\n\t\t\t\t}", ident(p->sym->name)); } } fprintf(fout, "\n\t\t\t}"); } } fflush(fout); } } if (!is_discriminant(typ)) { for (t = table; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (is_repetition(p) && (is_unmatched(p->next->sym) || (is_invisible(p->next->sym->name)))) { flag = 1; fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && "); if (is_unmatched(p->next->sym)) fprintf(fout, "!soap_element_begin_in(soap, NULL, 1, NULL))"); else if (is_invisible(p->next->sym->name)) fprintf(fout, "!soap_peek_element(soap))"); fprintf(fout, "\n\t\t\t{\tif (a->%s == NULL)\n\t\t\t\t{\tif (soap_blist_%s == NULL)\n\t\t\t\t\t\tsoap_blist_%s = soap_alloc_block(soap);", ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass || ((Tnode*)p->next->info.typ->ref)->type == Ttemplate || has_class((Tnode*)p->next->info.typ->ref) || (!cflag && ((Tnode*)p->next->info.typ->ref)->type == Tstruct)) fprintf(fout, "\n\t\t\t\t\ta->%s = soap_block<%s>::push(soap, soap_blist_%s);\n\t\t\t\t\tif (a->%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name), ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t\t\t\t\ta->%s = (const %s)soap_push_block_max(soap, soap_blist_%s, sizeof(%s));\n\t\t\t\t\tif (a->%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), c_type((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\ta->%s = (%s)soap_push_block_max(soap, soap_blist_%s, sizeof(%s));\n\t\t\t\t\tif (a->%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), c_type((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\ta->%s->soap_default(soap);", ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\tsoap_default_%s(soap, a->%s);", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\t*a->%s = NULL;", ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t}"); if (!is_invisible(p->next->sym->name)) fprintf(fout, "\n\t\t\t\tsoap_revert(soap);"); if (is_unmatched(p->next->sym)) { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, NULL, (char**)a->%s))", ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, NULL, (wchar_t**)a->%s))", ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, (char**)a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, (wchar_t**)a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); } else { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, %s, (char**)a->%s))", field(p->next, nse), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, %s, (wchar_t**)a->%s))", field(p->next, nse), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (char**)a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (wchar_t**)a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); } fprintf(fout, "\n\t\t\t\t{\ta->%s++;\n\t\t\t\t\ta->%s = NULL;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}", ident(p->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_repetition(p) || is_anytype(p) || is_choice(p)) { p = p->next; continue; } else if (is_invisible(p->sym->name) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && !(p->info.sto & Sattribute)) { flag = 1; if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap_flag_%s && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))", ident(p->sym->name)); else if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); else fprintf(fout, "\n\t\t\tif (soap_flag_%s && soap->error == SOAP_TAG_MISMATCH)", ident(p->sym->name)); fprintf(fout, "\n\t\t\t{\t"); if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "if (soap_inliteral(soap, %s, (char**)&a->%s))", field(p, nse), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "if (soap_inwliteral(soap, %s, (wchar_t**)&a->%s))", field(p, nse), ident(p->sym->name)); else if (is_string(p->info.typ)) fprintf(fout, "if (soap_in_%s(soap, %s, (char**)&a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "if (soap_in_%s(soap, %s, (wchar_t**)&a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); else if (p->info.typ->type == Tarray) fprintf(fout, "if (soap_in_%s(soap, %s, a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "if (a->%s.soap_in(soap, %s, \"%s\"))", ident(p->sym->name), field(p, nse), xsi_type(p->info.typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "if (soap_in_%s(soap, %s, &a->%s, \"%s\"))", c_ident(p->info.typ), field(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\t\t\tcontinue;"); else { fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s--;", ident(p->sym->name)); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}"); } fprintf(fout, "\n\t\t\t}"); } } } for (t = table; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->info.sto & Sreturn) if (nse || has_ns_eq(NULL, p->sym->name)) fprintf(fout, "\n\t\t\tsoap_check_result(soap, \"%s\");", ns_add(p, nse)); if (!flag && is_invisible(typ->id->name)) fprintf(fout, "\n\tsoap->error = SOAP_TAG_MISMATCH;\n\ta = NULL;"); if (!is_invisible(typ->id->name) || (table && (table->prev || table->list))) { if (!is_invisible(typ->id->name) || is_discriminant(typ)) fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)\n\t\t\t\tsoap->error = soap_ignore_element(soap);"); else fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && soap_flag)\n\t\t\t{\tsoap->error = SOAP_OK;\n\t\t\t\tbreak;\n\t\t\t}"); if (!is_invisible(typ->id->name)) fprintf(fout, "\n\t\t\tif (soap->error == SOAP_NO_TAG)"); else fprintf(fout, "\n\t\t\tif (soap_flag && soap->error == SOAP_NO_TAG)"); fprintf(fout, "\n\t\t\t\tbreak;"); fprintf(fout, "\n\t\t\tif (soap->error)\n\t\t\t\treturn NULL;"); fprintf(fout, "\n\t\t}"); } } if (table && !is_discriminant(typ)) { for (p = table->list; p; p = p->next) { if (is_repetition(p)) { if (((Tnode*)p->next->info.typ->ref)->type == Tclass || ((Tnode*)p->next->info.typ->ref)->type == Ttemplate || has_class((Tnode*)p->next->info.typ->ref) || (!cflag && ((Tnode*)p->next->info.typ->ref)->type == Tstruct)) { fprintf(fout, "\n\t\tif (a->%s)\n\t\t\tsoap_block<%s>::pop(soap, soap_blist_%s);", ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name)); fprintf(fout, "\n\t\tif (a->%s)\n\t\t{\ta->%s = soap_new_%s(soap, a->%s);\n\t\t\tif (!a->%s)\n\t\t\t\treturn NULL;\n\t\t\tsoap_block<%s>::save(soap, soap_blist_%s, a->%s);\n\t\t}\n\t\telse\n\t\t{\ta->%s = NULL;\n\t\t\tif (soap_blist_%s)\n\t\t\t\tsoap_block<%s>::end(soap, soap_blist_%s);\n\t\t}", ident(p->sym->name), ident(p->next->sym->name), c_ident(p->next->info.typ->ref), ident(p->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name)); } else { fprintf(fout, "\n\t\tif (a->%s)\n\t\t\tsoap_pop_block(soap, soap_blist_%s);", ident(p->next->sym->name), ident(p->next->sym->name)); if ((((Tnode*)p->next->info.typ->ref)->type == Tpointer && (p->next->info.sto & Sconstptr))) fprintf(fout, "\n\t\tif (a->%s)\n\t\t{\ta->%s = (const %s)soap_save_block(soap, soap_blist_%s, NULL, 1);\n\t\t}\n\t\telse\n\t\t{\ta->%s = NULL;\n\t\t\tif (soap_blist_%s)\n\t\t\t\tsoap_end_block(soap, soap_blist_%s);\n\t\t}", ident(p->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name)); else fprintf(fout, "\n\t\tif (a->%s)\n\t\t{\ta->%s = (%s)soap_save_block(soap, soap_blist_%s, NULL, 1);\n\t\t}\n\t\telse\n\t\t{\ta->%s = NULL;\n\t\t\tif (soap_blist_%s)\n\t\t\t\tsoap_end_block(soap, soap_blist_%s);\n\t\t}", ident(p->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), ident(p->next->sym->name)); } p = p->next; } } } if (!is_invisible(typ->id->name)) { if (is_discriminant(typ)) fprintf(fout, "\n\t\tif (tag && *tag != '-')\n\t\t{\tsoap->error = soap_ignore_element(soap);\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH || soap_element_end_in(soap, tag))\n\t\t\t\treturn NULL;\n\t\t}"); else fprintf(fout, "\n\t\tif (soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); } strict = 0; nonempty = 0; if (table && !is_discriminant(typ)) { for (p = table->list; p; p = p->next) { if (p->info.minOccurs > 0 && p->info.maxOccurs >= 0 && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_transient(p->info.typ) && !is_container(p->info.typ) && !is_repetition(p) && !is_choice(p)) { if (is_item(p)) continue; if (is_anytype(p)) { p = p->next; if (p->info.minOccurs <= 0) continue; } if ((p->info.typ->type != Tpointer && !is_smart(p->info.typ)) || p->info.nillable) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(soap_flag_%s > " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.maxOccurs - p->info.minOccurs); strict = 1; } else fprintf(fout, " || soap_flag_%s > " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.maxOccurs - p->info.minOccurs); } else if (strict == 0) { if (is_smart(p->info.typ)) fprintf(fout, "\n\t\tif (%s(!a->%s.get()", strict_check(), ident(p->sym->name)); else fprintf(fout, "\n\t\tif (%s(!a->%s", strict_check(), ident(p->sym->name)); strict = 1; } else { if (is_smart(p->info.typ)) fprintf(fout, " || !a->%s.get()", ident(p->sym->name)); else fprintf(fout, " || !a->%s", ident(p->sym->name)); } nonempty = 1; } else if (is_container(p->info.typ)) { if (p->info.minOccurs > 0) { if (p->info.typ->type == Tpointer) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(!a->%s || a->%s->size() < " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), ident(p->sym->name), p->info.minOccurs); strict = 1; } else fprintf(fout, " || !a->%s || a->%s->size() < " SOAP_LONG_FORMAT, ident(p->sym->name), ident(p->sym->name), p->info.minOccurs); } else { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s.size() < " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.minOccurs); strict = 1; } else fprintf(fout, " || a->%s.size() < " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.minOccurs); } nonempty = 1; } if (p->info.maxOccurs > 1) { if (p->info.typ->type == Tpointer) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s((a->%s && a->%s->size() > " SOAP_LONG_FORMAT ")", strict_check(), ident(p->sym->name), ident(p->sym->name), p->info.maxOccurs); strict = 1; } else fprintf(fout, " || (a->%s && a->%s->size() > " SOAP_LONG_FORMAT ")", ident(p->sym->name), ident(p->sym->name), p->info.maxOccurs); } else { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s.size() > " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.maxOccurs); strict = 1; } else fprintf(fout, " || a->%s.size() > " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.maxOccurs); } } } else if (is_repetition(p)) { if (p->info.minOccurs > 0) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s < " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.minOccurs); strict = 1; } else fprintf(fout, " || a->%s < " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.minOccurs); nonempty = 1; } if (p->info.maxOccurs > 1) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s > " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), p->info.maxOccurs); strict = 1; } else fprintf(fout, " || a->%s > " SOAP_LONG_FORMAT, ident(p->sym->name), p->info.maxOccurs); } p = p->next; } else if (is_choice(p)) { if (p->info.minOccurs != 0 && required_choice(p->next->info.typ) < 0) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(soap_flag_%s", strict_check(), ident(p->next->sym->name)); strict = 1; } else fprintf(fout, " || soap_flag_%s", ident(p->next->sym->name)); nonempty = 1; } p = p->next; } } if (strict) fprintf(fout, "))\n\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\treturn NULL;\n\t\t}"); } if (has_getter(typ)) fprintf(fout, "\n\t\tif (a->get(soap))\n\t\t\treturn NULL;"); if (!is_invisible(typ->id->name)) { if (nonempty) fprintf(fout, "\n\t}\n\telse if (%s*soap->href != '#')\n\t{\tsoap->error = SOAP_OCCURS;\n\t\treturn NULL;", strict_check()); fprintf(fout, "\n\t}\n\telse\n\t{\t"); if (!cflag) fprintf(fout, "a = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, %s, sizeof(%s), 0, %s_finsert, NULL);", c_type_id(typ, "*"), soap_type(typ), soap_type(typ), c_type(typ), prefix); else fprintf(fout, "a = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, %s, sizeof(%s), 0, NULL, NULL);", c_type_id(typ, "*"), soap_type(typ), soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;\n\t}"); } fprintf(fout, "\n\treturn a;\n}"); } break; case Tclass: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); if (!is_volatile(typ) && !is_typedef(typ)) { fprintf(fout, "\n\nvoid *%s::soap_in(struct soap *soap, const char *tag, const char *type)", c_type(typ)); fprintf(fout, "\n{\n\treturn soap_in_%s(soap, tag, this, type);\n}", c_ident(typ)); fflush(fout); } fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*a")); table = (Table*)typ->ref; if (!table) { fprintf(fout, "\n\t(void)soap; (void)tag; (void)a; (void)type; /* appease -Wall -Werror */"); fprintf(fout, "\n\tif (!a)\n\t\tsoap->error = SOAP_TAG_MISMATCH;\n\treturn a;\n}"); } else if (is_primclass(typ)) { fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */"); for (p = table->list; p; p = p->next) { if (is_pointer_to_derived(p)) { der = 1; break; } } if (der) fprintf(fout, "\n\tint err = soap_element_begin_in(soap, tag, 1, type);\n\tif (err && err != SOAP_TYPE)\n\t\treturn NULL;"); else fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;"); fprintf(fout, "\n\tif (!(a = (%s*)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType, %s_instantiate, %s_fbase)))\n\t{\tsoap->error = SOAP_TAG_MISMATCH;\n\t\treturn NULL;\n\t}", c_type(typ), soap_type(typ), c_type(typ), prefix, prefix); fprintf(fout, "\n\tsoap_revert(soap);\n\t*soap->id = '\\0';"); fprintf(fout, "\n\tif (soap->alloced && soap->alloced != %s)", soap_type(typ)); fprintf(fout, "\n\t\treturn (%s)a->soap_in(soap, tag, type);", c_type_id(typ, "*")); fprintf(fout, "\n\tif (soap->alloced)\n\t\ta->soap_default(soap);"); if (der) { fprintf(fout, "\n\tif (err == SOAP_TYPE)\n\t{"); for (p = table->list; p; p = p->next) { if (is_pointer_to_derived(p)) { fprintf(fout, "\n\t\tif (("); gen_match_derived(fout, p->info.typ->ref); fprintf(fout, ") && (a->%s = soap_in_%s(soap, tag, NULL, \"%s\")) != NULL)\n\t\t\treturn a;", ident(p->sym->name), c_ident(p->info.typ->ref), xsi_type(p->info.typ->ref)); } } fprintf(fout, "\n\t\treturn NULL;\n\t}"); } for (t = table; t; t = t->prev) { Entry *e = entry(classtable, t->sym); const char *nsa1 = e ? ns_qualifiedAttribute(e->info.typ) : nsa; for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa1)); } fflush(fout); for (table = (Table*)typ->ref; table; table = table->prev) { p = table->list; while (p && !is_item(p)) p = p->next; if (p) break; } if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tif (!soap_inliteral(soap, tag, (char**)&a->%s::%s))", ident(table->sym->name), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tif (!soap_inwliteral(soap, tag, (wchar_t**)&a->%s::%s))", ident(table->sym->name), ident(p->sym->name)); else if (is_string(p->info.typ)) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, (char**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name), xsi_type(typ)); else if (is_wstring(p->info.typ)) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, (wchar_t**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif (!(a->%s::%s).soap_in(soap, tag, \"%s\"))", ident(table->sym->name), ident(p->sym->name), xsi_type(typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) fprintf(fout, "\n\tif (!soap_in_%s(soap, tag, &a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(table->sym->name), ident(p->sym->name), xsi_type(typ)); fprintf(fout, "\n\t\treturn NULL;"); fixed_check(fout, p, t, "\t"); if (has_getter(typ)) fprintf(fout, "\n\tif (a->get(soap))\n\t\treturn NULL;"); fprintf(fout, "\n\treturn a;\n}"); } else { if (!is_invisible(typ->id->name)) { fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */"); for (p = table->list; p; p = p->next) { if (is_pointer_to_derived(p)) { der = 1; break; } } if (der) fprintf(fout, "\n\tint err = soap_element_begin_in(soap, tag, 0, type);\n\tif (err && err != SOAP_TYPE)\n\t\treturn NULL;"); else fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 0, NULL))\n\t\treturn NULL;"); fprintf(fout, "\n\ta = (%s*)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType, %s_instantiate, %s_fbase);", c_type(typ), soap_type(typ), c_type(typ), prefix, prefix); } else { fprintf(fout, "\n\t(void)tag; (void)type; /* appease -Wall -Werror */"); fprintf(fout, "\n\ta = (%s*)soap_id_enter(soap, \"\", a, %s, sizeof(%s), soap->type, soap->arrayType, %s_instantiate, %s_fbase);", c_type(typ), soap_type(typ), c_type(typ), prefix, prefix); } fprintf(fout, "\n\tif (!a)\n\t\treturn NULL;"); table = (Table*)typ->ref; if (!is_discriminant(typ)) { if (!is_invisible(typ->id->name)) { fprintf(fout, "\n\tif (soap->alloced && soap->alloced != %s)", soap_type(typ)); fprintf(fout, "\n\t{\tsoap_revert(soap);"); fprintf(fout, "\n\t\t*soap->id = '\\0';"); if (is_volatile(typ) || is_typedef(typ)) fprintf(fout, "\n\t\treturn soap_in_%s(soap, tag, a, type);", c_ident(typ)); else fprintf(fout, "\n\t\treturn (%s)a->soap_in(soap, tag, type);", c_type_id(typ, "*")); fprintf(fout, "\n\t}"); } } fprintf(fout, "\n\tif (soap->alloced)"); if (is_volatile(typ) || is_typedef(typ)) fprintf(fout, "\n\t\tsoap_default_%s(soap, a);", c_ident(typ)); else fprintf(fout, "\n\t\ta->soap_default(soap);"); if (der) { fprintf(fout, "\n\tif (err == SOAP_TYPE)\n\t{"); for (p = table->list; p; p = p->next) { if (is_pointer_to_derived(p)) { fprintf(fout, "\n\t\tif (("); gen_match_derived(fout, p->info.typ->ref); fprintf(fout, ") && (a->%s = soap_in_%s(soap, tag, NULL, \"%s\")) != NULL)\n\t\t\treturn a;", ident(p->sym->name), c_ident(p->info.typ->ref), xsi_type(p->info.typ->ref)); } } fprintf(fout, "\n\t\treturn NULL;\n\t}"); } for (t = table; t; t = t->prev) { Entry *e = entry(classtable, t->sym); const char *nsa1 = e ? ns_qualifiedAttribute(e->info.typ) : nsa; for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa1)); } fflush(fout); i = 0; if (!is_discriminant(typ)) { for (t = table; t; t = t->prev) i++; for (; i > 0; i--) { t = table; for (j = 0; j < i-1; j++) t = t->prev; if (!t->prev) { Entry *e = entry(classtable, t->sym); if (e && e->info.typ && e->info.typ->base && !strcmp(e->info.typ->base->name, "soap_dom_element")) fprintf(fout, "\n\tsize_t soap_flag_soap_dom_element = 1;"); } for (p = t->list; p; p = p->next) { if (!(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (is_anytype(p) || is_choice(p)) { p = p->next; fprintf(fout, "\n\tsize_t soap_flag_%s%d = " SOAP_LONG_FORMAT ";", ident(p->sym->name), i, p->info.maxOccurs); } else if (is_repetition(p)) { fprintf(fout, "\n\tstruct soap_blist *soap_blist_%s%d = NULL;", ident(p->next->sym->name), i); p = p->next; } else if (!is_transient(p->info.typ) && !is_container(p->info.typ)) fprintf(fout, "\n\tsize_t soap_flag_%s%d = " SOAP_LONG_FORMAT ";", ident(p->sym->name), i, p->info.maxOccurs); } } } } fflush(fout); if (!is_invisible(typ->id->name)) { if (!is_discriminant(typ)) { fprintf(fout, "\n\tif (soap->body && *soap->href != '#')\n\t{"); fprintf(fout, "\n\t\tfor (;;)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;"); } else fprintf(fout, "\n\tif (!tag || *tag == '-' || (soap->body && *soap->href != '#'))\n\t{"); } else if (!is_discriminant(typ)) { if (table && (table->prev || table->list)) fprintf(fout, "\n\t\tfor (short soap_flag = 0;; soap_flag = 1)\n\t\t{\tsoap->error = SOAP_TAG_MISMATCH;"); } table = (Table*)typ->ref; i = 0; flag = 0; for (t = table; t; t = t->prev) i++; for (; i > 0; i--) { Entry *e; const char *nse1; t = table; for (j = 0; j < i-1; j++) t = t->prev; e = entry(classtable, t->sym); nse1 = e ? ns_qualifiedElement(e->info.typ) : nse; for (p = t->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion || is_soapref(p->info.typ)) ; else if (is_item(p)) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t\t\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_repetition(p)) { if (is_unmatched(p->next->sym) || is_invisible(p->next->sym->name)) { p = p->next; continue; } flag = 1; fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && "); fprintf(fout, "!soap_element_begin_in(soap, %s, 1, NULL))", field(p->next, nse1)); fprintf(fout, "\n\t\t\t{\tif (a->%s::%s == NULL)\n\t\t\t\t{\tif (soap_blist_%s%d == NULL)\n\t\t\t\t\t\tsoap_blist_%s%d = soap_alloc_block(soap);", ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i, ident(p->next->sym->name), i); if (((Tnode*)p->next->info.typ->ref)->type == Tclass || ((Tnode*)p->next->info.typ->ref)->type == Ttemplate || has_class((Tnode*)p->next->info.typ->ref) || (!cflag && ((Tnode*)p->next->info.typ->ref)->type == Tstruct)) fprintf(fout, "\n\t\t\t\t\ta->%s::%s = soap_block<%s>::push(soap, soap_blist_%s%d);\n\t\t\t\t\tif (a->%s::%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name), i, ident(t->sym->name), ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t\t\t\t\ta->%s::%s = (const %s)soap_push_block_max(soap, soap_blist_%s%d, sizeof(%s));\n\t\t\t\t\tif (a->%s::%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, c_type((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\ta->%s::%s = (%s)soap_push_block_max(soap, soap_blist_%s%d, sizeof(%s));\n\t\t\t\t\tif (a->%s::%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, c_type((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\ta->%s::%s->soap_default(soap);", ident(t->sym->name), ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\tsoap_default_%s(soap, a->%s::%s);", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\t*a->%s::%s = NULL;", ident(t->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t}"); fprintf(fout, "\n\t\t\t\tsoap_revert(soap);"); if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, %s, (char**)a->%s::%s))", field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, %s, (wchar_t**)a->%s::%s))", field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (char**)a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (wchar_t**)a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); fprintf(fout, "\n\t\t\t\t{\ta->%s::%s++;\n\t\t\t\t\ta->%s::%s = NULL;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_anytype(p)) { flag = 1; fprintf(fout, "\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)", ident(p->next->sym->name), i); if (is_self(p->next)) fprintf(fout, "\n\t\t\t{\tif ((a->%s::%s = soap_getelement(soap, tag, &a->%s::%s)))", ident(t->sym->name), ident(p->next->sym->name), ident(t->sym->name), ident(p->sym->name)); else if (is_invisible(p->next->sym->name)) fprintf(fout, "\n\t\t\t{\tif ((a->%s::%s = soap_getelement(soap, NULL, &a->%s::%s)))", ident(t->sym->name), ident(p->next->sym->name), ident(t->sym->name), ident(p->sym->name)); else fprintf(fout, "\n\t\t\t{\tif ((a->%s::%s = soap_getelement(soap, %s, &a->%s::%s)))", ident(t->sym->name), ident(p->next->sym->name), field(p->next, nse1), ident(t->sym->name), ident(p->sym->name)); fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s%d = 0;", ident(p->next->sym->name), i); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}\n\t\t\t}"); p = p->next; } else if (is_discriminant(typ) && p->next) { flag = 1; fprintf(fout, "\n\t\tif (!soap_in_%s(soap, &a->%s, &a->%s))", c_ident(p->next->info.typ), ident(p->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\t\treturn NULL;"); i = 0; break; } else if (is_choice(p)) { flag = 1; fprintf(fout, "\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)", ident(p->next->sym->name), i); fprintf(fout, "\n\t\t\t{\tif (soap_in_%s(soap, &a->%s::%s, &a->%s::%s))", c_ident(p->next->info.typ), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s%d = 0;", ident(p->next->sym->name), i); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}\n\t\t}"); p = p->next; } else if (is_transient(p->info.typ)) { if (!is_pointer_to_derived(p)) fprintf(fout, "\n\t\t\t/* transient %s skipped */", ident(p->sym->name)); } else { flag = 1; if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap_flag_%s%d && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))", ident(p->sym->name), i); else if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); else fprintf(fout, "\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)", ident(p->sym->name), i); fprintf(fout, "\n\t\t\t{\t"); } if (is_unmatched(p->sym)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "if (soap_inliteral(soap, NULL, (char**)&a->%s::%s))", ident(t->sym->name), ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "if (soap_inwliteral(soap, NULL, (wchar_t**)&a->%s::%s))", ident(t->sym->name), ident(p->sym->name)); } else if (is_string(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, NULL, (char**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (is_wstring(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, NULL, (wchar_t**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tarray) { fprintf(fout, "if (soap_in_%s(soap, NULL, a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "if ((a->%s::%s).soap_in(soap, NULL, \"%s\"))", ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, NULL, &a->%s::%s, \"%s\"))", c_ident(p->info.typ), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } } else if (!is_invisible(p->sym->name)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "if (soap_inliteral(soap, %s, (char**)&a->%s::%s))", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "if (soap_inwliteral(soap, %s, (wchar_t**)&a->%s::%s))", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); } else if (is_string(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, %s, (char**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (is_wstring(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, %s, (wchar_t**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tarray) { fprintf(fout, "if (soap_in_%s(soap, %s, a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "if ((a->%s::%s).soap_in(soap, %s, \"%s\"))", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1), xsi_type(p->info.typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, %s, &a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } } if (!is_invisible(p->sym->name) && !is_primclass(typ) && p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\t\t\tcontinue;"); else { fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s%d--;", ident(p->sym->name), i); fixed_check(fout, p, t, "\t\t\t\t\t"); if (p->info.hasval && !p->info.fixed && (is_string(p->info.typ) || is_wstring(p->info.typ))) { fprintf(fout, "\n\t\t\t\t\tif (*soap->href != '#' && a->%s::%s && ", ident(t->sym->name), ident(p->sym->name)); fprintf(fout, "!*a->%s::%s)", ident(t->sym->name), ident(p->sym->name)); fprintf(fout, "\n\t\t\t\t\t\ta->%s::%s%s;", ident(t->sym->name), ident(p->sym->name), c_init(p)); } else if (p->info.ptrval && !p->info.fixed && (is_string(p->info.typ->ref) || is_wstring(p->info.typ->ref) || is_stdstring(p->info.typ->ref) || is_stdwstring(p->info.typ->ref))) { Tnode *ptr = (Tnode*)p->info.typ->ref; if (is_smart(p->info.typ)) fprintf(fout, "\n\t\t\t\t\tif (*soap->href != '#' && a->%s::%s.get() && ", ident(t->sym->name), ident(p->sym->name)); else fprintf(fout, "\n\t\t\t\t\tif (*soap->href != '#' && a->%s::%s && ", ident(t->sym->name), ident(p->sym->name)); if (is_string(ptr) || is_wstring(ptr)) fprintf(fout, "*a->%s::%s && !**a->%s::%s)", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->sym->name)); else fprintf(fout, "a->%s::%s->empty())", ident(t->sym->name), ident(p->sym->name)); fprintf(fout, "\n\t\t\t\t\t\t*a->%s::%s%s;", ident(t->sym->name), ident(p->sym->name), c_init(p)); } fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}"); if (p->info.ptrval && !p->info.fixed && !(is_string(p->info.typ->ref) || is_wstring(p->info.typ->ref) || is_stdstring(p->info.typ->ref) || is_stdwstring(p->info.typ->ref))) { Tnode *ptr = (Tnode*)p->info.typ->ref; fprintf(fout, "\n\t\t\t\tif (soap->error == SOAP_EMPTY)\n\t\t\t\t{\t"); if (is_smart(p->info.typ)) { if (is_smart_shared(p->info.typ)) fprintf(fout, "a->%s::%s = %s<%s>();", ident(t->sym->name), ident(p->sym->name), make_shared(p->info.typ), c_type(ptr)); else if (ptr->type == Tclass && !is_external(ptr) && !is_volatile(ptr) && !is_typedef(ptr)) fprintf(fout, "a->%s::%s = %s(%s_instantiate_%s(soap, SOAP_NO_LINK_TO_DELETE, soap->type, soap->arrayType, NULL));", ident(t->sym->name), ident(p->sym->name), c_type(p->info.typ), fprefix, c_ident(ptr)); else fprintf(fout, "a->%s::%s = %s(SOAP_NEW(soap, %s));", ident(t->sym->name), ident(p->sym->name), c_type(p->info.typ), c_type(ptr)); } else if (ptr->type == Tclass) { fprintf(fout, "if (!(a->%s::%s = (%s)%s_instantiate_%s(soap, -1, soap->type, soap->arrayType, NULL)))\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->sym->name), c_type(p->info.typ), fprefix, c_ident(ptr)); } else { fprintf(fout, "if (!(a->%s::%s = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->sym->name), c_type(p->info.typ), c_type(ptr)); } fprintf(fout, "\n\t\t\t\t\t*a->%s::%s%s;", ident(t->sym->name), ident(p->sym->name), c_init(p)); fprintf(fout, "\n\t\t\t\t\tsoap->error = SOAP_OK;\n\t\t\t\t\tsoap_flag_%s%d--;\n\t\t\t\t\tcontinue;\n\t\t\t\t}", ident(p->sym->name), i); } } fprintf(fout, "\n\t\t\t}"); } fflush(fout); } } } if (!is_discriminant(typ)) { Entry *e; const char *nse1; i = 0; for (t = table; t; t = t->prev) { i++; e = entry(classtable, t->sym); nse1 = e ? ns_qualifiedElement(e->info.typ) : nse; for (p = t->list; p; p = p->next) { if (is_repetition(p) && (is_unmatched(p->next->sym) || is_invisible(p->next->sym->name))) { flag = 1; fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && "); if (is_unmatched(p->next->sym)) fprintf(fout, "!soap_element_begin_in(soap, NULL, 1, NULL))"); else if (is_invisible(p->next->sym->name)) fprintf(fout, "!soap_peek_element(soap))"); fprintf(fout, "\n\t\t\t{\tif (a->%s::%s == NULL)\n\t\t\t\t{\tif (soap_blist_%s%d == NULL)\n\t\t\t\t\t\tsoap_blist_%s%d = soap_alloc_block(soap);", ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i, ident(p->next->sym->name), i); if (((Tnode*)p->next->info.typ->ref)->type == Tclass || ((Tnode*)p->next->info.typ->ref)->type == Ttemplate || has_class((Tnode*)p->next->info.typ->ref) || (!cflag && ((Tnode*)p->next->info.typ->ref)->type == Tstruct)) fprintf(fout, "\n\t\t\t\t\ta->%s::%s = soap_block<%s>::push(soap, soap_blist_%s%d);\n\t\t\t\t\tif (a->%s::%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name), i, ident(t->sym->name), ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type == Tpointer && (p->next->info.sto & Sconstptr)) fprintf(fout, "\n\t\t\t\t\ta->%s::%s = (const %s)soap_push_block_max(soap, soap_blist_%s%d, sizeof(%s));\n\t\t\t\t\tif (a->%s::%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, c_type((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\ta->%s::%s = (%s)soap_push_block_max(soap, soap_blist_%s%d, sizeof(%s));\n\t\t\t\t\tif (a->%s::%s == NULL)\n\t\t\t\t\t\treturn NULL;", ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, c_type((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); if (((Tnode*)p->next->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->next->info.typ->ref) && !is_volatile((Tnode*)p->next->info.typ->ref) && !is_typedef((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\ta->%s::%s->soap_default(soap);", ident(t->sym->name), ident(p->next->sym->name)); else if (((Tnode*)p->next->info.typ->ref)->type != Tpointer && !is_XML((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\t\tsoap_default_%s(soap, a->%s::%s);", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name)); else fprintf(fout, "\n\t\t\t\t\t*a->%s::%s = NULL;", ident(t->sym->name), ident(p->next->sym->name)); fprintf(fout, "\n\t\t\t\t}"); if (!is_invisible(p->next->sym->name)) fprintf(fout, "\n\t\t\t\tsoap_revert(soap);"); if (is_unmatched(p->next->sym)) { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, NULL, (char**)a->%s::%s))", ident(t->sym->name), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, NULL, (wchar_t**)a->%s::%s))", ident(t->sym->name), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, (char**)a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, (wchar_t**)a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, NULL, a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); } else { if (is_XML((Tnode*)p->next->info.typ->ref) && is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inliteral(soap, %s, (char**)a->%s::%s))", field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else if (is_XML((Tnode*)p->next->info.typ->ref) && is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_inwliteral(soap, %s, (wchar_t**)a->%s::%s))", field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name)); else if (is_string((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (char**)a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else if (is_wstring((Tnode*)p->next->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, (wchar_t**)a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); else fprintf(fout, "\n\t\t\t\tif (soap_in_%s(soap, %s, a->%s::%s, \"%s\"))", c_ident((Tnode*)p->next->info.typ->ref), field(p->next, nse1), ident(t->sym->name), ident(p->next->sym->name), xsi_type((Tnode*)p->next->info.typ->ref)); } fprintf(fout, "\n\t\t\t\t{\ta->%s::%s++;\n\t\t\t\t\ta->%s::%s = NULL;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name)); p = p->next; } else if (is_repetition(p) || is_anytype(p) || is_choice(p)) { p = p->next; continue; } else if (is_invisible(p->sym->name) && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !is_transient(p->info.typ) && !(p->info.sto & Sattribute)) { flag = 1; if (is_string(p->info.typ) || is_wstring(p->info.typ) || is_stdstr(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap_flag_%s%d && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))", ident(p->sym->name), i); else if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)"); else fprintf(fout, "\n\t\t\tif (soap_flag_%s%d && soap->error == SOAP_TAG_MISMATCH)", ident(p->sym->name), i); fprintf(fout, "\n\t\t\t{\t"); if (is_XML(p->info.typ) && is_string(p->info.typ)) { fprintf(fout, "if (soap_inliteral(soap, %s, (char**)&a->%s::%s))", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); } else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) { fprintf(fout, "if (soap_inwliteral(soap, %s, (wchar_t**)&a->%s::%s))", field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name)); } else if (is_string(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, %s, (char**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (is_wstring(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, %s, (wchar_t**)&a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tarray) { fprintf(fout, "if (soap_in_%s(soap, %s, a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) { fprintf(fout, "if ((a->%s::%s).soap_in(soap, %s, \"%s\"))", ident(t->sym->name), ident(p->sym->name), field_overridden(t, p, nse1), xsi_type(p->info.typ)); } else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { fprintf(fout, "if (soap_in_%s(soap, %s, &a->%s::%s, \"%s\"))", c_ident(p->info.typ), field_overridden(t, p, nse1), ident(t->sym->name), ident(p->sym->name), xsi_type(p->info.typ)); } if (is_container(p->info.typ)) fprintf(fout, "\n\t\t\t\t\tcontinue;"); else { fprintf(fout, "\n\t\t\t\t{\tsoap_flag_%s%d--;", ident(p->sym->name), i); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}"); } fprintf(fout, "\n\t\t\t}"); } } if (!t->prev && e && e->info.typ && e->info.typ->base && !strcmp(e->info.typ->base->name, "soap_dom_element")) { fprintf(fout, "\n\t\t\tif (soap_flag_soap_dom_element && soap->error == SOAP_TAG_MISMATCH)\n\t\t\t\tif (soap_in_xsd__anyType(soap, NULL, static_cast(a), NULL))"); fprintf(fout, "\n\t\t\t\t{\tsoap_flag_soap_dom_element = 0;"); fprintf(fout, "\n\t\t\t\t\tcontinue;"); fprintf(fout, "\n\t\t\t\t}"); } } for (t = table; t; t = t->prev) for (p = t->list; p; p = p->next) if (p->info.sto & Sreturn) if (nse || has_ns_eq(NULL, p->sym->name)) fprintf(fout, "\n\t\t\tsoap_check_result(soap, \"%s\");", ns_add(p, nse)); if (!flag && is_invisible(typ->id->name)) fprintf(fout, "\n\tsoap->error = SOAP_TAG_MISMATCH;\n\ta = NULL;"); if (!is_invisible(typ->id->name) || (table && (table->prev || table->list))) { if (!is_invisible(typ->id->name) || is_discriminant(typ)) fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH)\n\t\t\t\tsoap->error = soap_ignore_element(soap);"); else fprintf(fout, "\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH && soap_flag)\n\t\t\t{\n\t\t\t\tsoap->error = SOAP_OK;\n\t\t\t\tbreak;\n\t\t\t}"); if (!is_invisible(typ->id->name)) fprintf(fout, "\n\t\t\tif (soap->error == SOAP_NO_TAG)"); else fprintf(fout, "\n\t\t\tif (soap_flag && soap->error == SOAP_NO_TAG)"); fprintf(fout, "\n\t\t\t\tbreak;"); fprintf(fout, "\n\t\t\tif (soap->error)\n\t\t\t\treturn NULL;"); fprintf(fout, "\n\t\t}"); } } if (!is_discriminant(typ)) { i = 0; for (t = table; t; t = t->prev) i++; for (; i > 0; i--) { t = table; for (j = 0; j < i-1; j++) t = t->prev; for (p = t->list; p; p = p->next) { if (is_repetition(p)) { if (((Tnode*)p->next->info.typ->ref)->type == Tclass || ((Tnode*)p->next->info.typ->ref)->type == Ttemplate || has_class((Tnode*)p->next->info.typ->ref) || (((Tnode*)p->next->info.typ->ref)->type == Tstruct && !cflag)) { fprintf(fout, "\n\t\tif (a->%s::%s)\n\t\t\tsoap_block<%s>::pop(soap, soap_blist_%s%d);", ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name), i); fprintf(fout, "\n\t\tif (a->%s::%s)\n\t\t{\ta->%s::%s = soap_new_%s(soap, a->%s::%s);\n\t\t\tif (!a->%s::%s)\n\t\t\t\treturn NULL;\n\t\t\tsoap_block<%s>::save(soap, soap_blist_%s%d, a->%s::%s);\n\t\t}\n\t\telse\n\t\t{\ta->%s::%s = NULL;\n\t\t\tif (soap_blist_%s%d)\n\t\t\t\tsoap_block<%s>::end(soap, soap_blist_%s%d);\n\t\t}", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name), c_ident(p->next->info.typ->ref), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ->ref), ident(p->next->sym->name), i, ident(t->sym->name), ident(p->next->sym->name), ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i, c_type(p->next->info.typ->ref), ident(p->next->sym->name), i); } else { fprintf(fout, "\n\t\tif (a->%s::%s)\n\t\t\tsoap_pop_block(soap, soap_blist_%s%d);", ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i); if ((((Tnode*)p->next->info.typ->ref)->type == Tpointer && (p->next->info.sto & Sconstptr))) fprintf(fout, "\n\t\tif (a->%s::%s)\n\t\t{\ta->%s::%s = (const %s)soap_save_block(soap, soap_blist_%s%d, NULL, 1);\n\t\t}\n\t\telse\n\t\t{\ta->%s::%s = NULL;\n\t\t\tif (soap_blist_%s%d)\n\t\t\t\tsoap_end_block(soap, soap_blist_%s%d);\n\t\t}", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i, ident(p->next->sym->name), i); else fprintf(fout, "\n\t\tif (a->%s::%s)\n\t\t{\ta->%s::%s = (%s)soap_save_block(soap, soap_blist_%s%d, NULL, 1);\n\t\t}\n\t\telse\n\t\t{\ta->%s::%s = NULL;\n\t\t\tif (soap_blist_%s%d)\n\t\t\t\tsoap_end_block(soap, soap_blist_%s%d);\n\t\t}", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->next->sym->name), c_type(p->next->info.typ), ident(p->next->sym->name), i, ident(t->sym->name), ident(p->next->sym->name), ident(p->next->sym->name), i, ident(p->next->sym->name), i); } p = p->next; } } } } if (!is_invisible(typ->id->name)) { if (is_discriminant(typ)) fprintf(fout, "\n\t\tif (tag && *tag != '-')\n\t\t{\tsoap->error = soap_ignore_element(soap);\n\t\t\tif (soap->error == SOAP_TAG_MISMATCH || soap_element_end_in(soap, tag))\n\t\t\t\treturn NULL;\n\t\t}"); else fprintf(fout, "\n\t\tif (soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); } strict = 0; nonempty = 0; if (!is_discriminant(typ)) { i = 0; for (t = table; t; t = t->prev) i++; for (; i > 0; i--) { t = table; for (j = 0; j < i-1; j++) t = t->prev; for (p = t->list; p; p = p->next) { if (p->info.minOccurs > 0 && p->info.maxOccurs >= 0 && !(p->info.sto & (Sconst | Sprivate | Sprotected)) && !(p->info.sto & Sattribute) && p->info.typ->type != Tfun && !is_void(p->info.typ) && !is_transient(p->info.typ) && !is_container(p->info.typ) && !is_repetition(p) && !is_choice(p)) { if (is_item(p)) continue; if (is_anytype(p)) { p = p->next; if (p->info.minOccurs <= 0) continue; } if ((p->info.typ->type != Tpointer && !is_smart(p->info.typ)) || p->info.nillable) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(soap_flag_%s%d > " SOAP_LONG_FORMAT, strict_check(), ident(p->sym->name), i, p->info.maxOccurs - p->info.minOccurs); strict = 1; } else fprintf(fout, " || soap_flag_%s%d > " SOAP_LONG_FORMAT, ident(p->sym->name), i, p->info.maxOccurs - p->info.minOccurs); } else if (strict == 0) { if (is_smart(p->info.typ)) fprintf(fout, "\n\t\tif (%s(!a->%s::%s.get()", strict_check(), ident(t->sym->name), ident(p->sym->name)); else fprintf(fout, "\n\t\tif (%s(!a->%s::%s", strict_check(), ident(t->sym->name), ident(p->sym->name)); strict = 1; } else { if (is_smart(p->info.typ)) fprintf(fout, " || !a->%s::%s.get()", ident(t->sym->name), ident(p->sym->name)); else fprintf(fout, " || !a->%s::%s", ident(t->sym->name), ident(p->sym->name)); } nonempty = 1; } else if (is_container(p->info.typ)) { if (p->info.minOccurs > 0) { if (p->info.typ->type == Tpointer) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(!a->%s::%s || a->%s::%s->size() < " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); strict = 1; } else fprintf(fout, " || !a->%s::%s || a->%s::%s->size() < " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); } else { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s::%s.size() < " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); strict = 1; } else fprintf(fout, " || a->%s::%s.size() < " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); } nonempty = 1; } if (p->info.maxOccurs > 1) { if (p->info.typ->type == Tpointer) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s((a->%s::%s && a->%s::%s->size() > " SOAP_LONG_FORMAT ")", strict_check(), ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); strict = 1; } else fprintf(fout, " || (a->%s::%s && a->%s::%s->size() > " SOAP_LONG_FORMAT ")", ident(t->sym->name), ident(p->sym->name), ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); } else { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s::%s.size() > " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); strict = 1; } else fprintf(fout, " || a->%s::%s.size() > " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); } } } else if (is_repetition(p)) { if (p->info.minOccurs > 0) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s::%s < " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); strict = 1; } else fprintf(fout, " || a->%s::%s < " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.minOccurs); nonempty = 1; } if (p->info.maxOccurs > 1) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(a->%s::%s > " SOAP_LONG_FORMAT, strict_check(), ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); strict = 1; } else fprintf(fout, " || a->%s::%s > " SOAP_LONG_FORMAT, ident(t->sym->name), ident(p->sym->name), p->info.maxOccurs); } p = p->next; } else if (is_choice(p)) { if (p->info.minOccurs != 0 && required_choice(p->next->info.typ) < 0) { if (strict == 0) { fprintf(fout, "\n\t\tif (%s(soap_flag_%s%d", strict_check(), ident(p->next->sym->name), i); strict = 1; } else fprintf(fout, " || soap_flag_%s%d", ident(p->next->sym->name), i); nonempty = 1; } p = p->next; } } } if (strict) fprintf(fout, "))\n\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\treturn NULL;\n\t\t}"); } if (has_getter(typ)) fprintf(fout, "\n\t\tif (a->get(soap))\n\t\t\treturn NULL;"); if (!is_invisible(typ->id->name)) { if (nonempty) fprintf(fout, "\n\t}\n\telse if (%s*soap->href != '#')\n\t{\tsoap->error = SOAP_OCCURS;\n\t\treturn NULL;", strict_check()); fprintf(fout, "\n\t}\n\telse\n\t{"); fprintf(fout, "\ta = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, %s, sizeof(%s), 0, %s_finsert, %s_fbase);", c_type_id(typ, "*"), soap_type(typ), soap_type(typ), c_type(typ), prefix, prefix); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;\n\t}"); } fprintf(fout, "\n\treturn a;\n}"); } break; case Tunion: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, int*, %s);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, int*, %s);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, int *choice, %s)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)a; /* appease -Wall -Werror */"); fprintf(fout, "\n\tsoap->error = SOAP_TAG_MISMATCH;"); table = (Table *)typ->ref; if (table) { for (p = table->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) fprintf(fout, "\n\t/* non-serializable %s skipped */", ident(p->sym->name)); else if (p->info.sto & Sattribute) ; else if (is_transient(p->info.typ)) { if (!is_pointer_to_derived(p)) fprintf(fout, "\n\t/* transient %s skipped */", ident(p->sym->name)); } else if (!is_invisible(p->sym->name)) { if (is_unmatched(p->sym)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inliteral(soap, NULL, (char**)&a->%s))", ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inwliteral(soap, NULL, (wchar_t**)&a->%s))", ident(p->sym->name)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, NULL, a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(p->info.typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && a->%s.soap_in(soap, NULL, \"%s\"))", ident(p->sym->name), xsi_type(p->info.typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (p->info.typ->type == Tpointer) fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, NULL, &a->%s, \"%s\"))", c_ident(p->info.typ), ident(p->sym->name), xsi_type(p->info.typ)); } } else { if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inliteral(soap, \"%s\", (char**)&a->%s))", ns_add(p, nse), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inwliteral(soap, \"%s\", (wchar_t**)&a->%s))", ns_add(p, nse), ident(p->sym->name)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, \"%s\", a->%s, \"%s\"))", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && a->%s.soap_in(soap, \"%s\", \"%s\"))", ident(p->sym->name), ns_add(p, nse), xsi_type(p->info.typ)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (p->info.typ->type == Tpointer) fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, \"%s\", &a->%s, \"%s\"))", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name), xsi_type(p->info.typ)); } } fprintf(fout, "\n\t{\t*choice = %s;", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn a;"); fprintf(fout, "\n\t}"); fflush(fout); } } } table = (Table *)typ->ref; if (table) { for (p = table->list; p; p = p->next) { if (p->info.typ->type == Tfun || p->info.typ->type == Tunion) ; else if (p->info.sto & (Sconst | Sprivate | Sprotected)) ; else if (is_transient(p->info.typ)) ; else if (p->info.sto & Sattribute) ; else if (is_invisible(p->sym->name)) { if (is_XML(p->info.typ) && is_string(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inliteral(soap, \"%s\", (char**)&a->%s))", ns_add(p, nse), ident(p->sym->name)); else if (is_XML(p->info.typ) && is_wstring(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_inwliteral(soap, \"%s\", (wchar_t**)&a->%s))", ns_add(p, nse), ident(p->sym->name)); else if (p->info.typ->type == Tarray) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, \"%s\", a->%s, NULL))", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name)); else if (p->info.typ->type == Tclass && !is_external(p->info.typ) && !is_volatile(p->info.typ) && !is_typedef(p->info.typ)) fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && a->%s.soap_in(soap, \"%s\", NULL))", ident(p->sym->name), ns_add(p, nse)); else if (p->info.typ->type != Tfun && !is_void(p->info.typ)) { if (p->info.typ->type == Tpointer) fprintf(fout, "\n\ta->%s = NULL;", ident(p->sym->name)); fprintf(fout, "\n\tif (soap->error == SOAP_TAG_MISMATCH && soap_in_%s(soap, \"%s\", &a->%s, NULL))", c_ident(p->info.typ), ns_add(p, nse), ident(p->sym->name)); } fprintf(fout, "\n\t{\t*choice = %s;", soap_union_member(typ, p)); fprintf(fout, "\n\t\treturn a;"); fprintf(fout, "\n\t}"); fflush(fout); } } } fprintf(fout, "\n\t*choice = %d;", required_choice(typ)); fprintf(fout, "\n\tif (!soap->error)\n\t\tsoap->error = SOAP_TAG_MISMATCH;\n\treturn NULL;\n}"); break; case Tpointer: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */\n\tif (soap_element_begin_in(soap, tag, 1, NULL))"); fprintf(fout, "\n\t\treturn NULL;"); if (is_template(typ->ref)) { fprintf(fout, "\n\tsoap_revert(soap);"); fprintf(fout, "\n\tif (!a)\n\t{\tif (!(a = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t\treturn NULL;\n\t\t*a = NULL;\n\t}", c_type_id(typ, "*"), c_type(typ)); fprintf(fout, "\n\tif (!(*a = soap_in_%s(soap, tag, *a, type)))\n\t\treturn NULL;", c_ident((Tnode*)typ->ref)); fprintf(fout, "\n\treturn a;\n}"); } else if (((Tnode *) typ->ref)->type == Tclass && !is_external((Tnode*)typ->ref) && !is_volatile((Tnode*)typ->ref) && !is_typedef((Tnode*)typ->ref)) { fprintf(fout, "\n\tif (!a)\n\t\tif (!(a = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t\treturn NULL;", c_type_id(typ, "*"), c_type(typ)); fprintf(fout, "\n\t*a = NULL;\n\tif (!soap->null && *soap->href != '#')"); fprintf(fout, "\n\t{\tsoap_revert(soap);"); fprintf(fout, "\n\t\tif (!(*a = (%s)%s_instantiate_%s(soap, -1, soap->type, soap->arrayType, NULL)))", c_type(typ), fprefix, c_ident((Tnode*)typ->ref)); fprintf(fout, "\n\t\t\treturn NULL;"); fprintf(fout, "\n\t\t(*a)->soap_default(soap);"); fprintf(fout, "\n\t\tif (!(*a)->soap_in(soap, tag, NULL))"); fprintf(fout, "\n\t\t{\t*a = NULL;\n\t\t\treturn NULL;\n\t\t}"); fprintf(fout, "\n\t}\n\telse\n\t{\ta = (%s)soap_id_lookup(soap, soap->href, (void**)a, %s, sizeof(%s), %d, %s_fbase);", c_type_id(typ, "*"), soap_type(reftype(typ->ref)), c_type(reftype(typ->ref)), reflevel(typ->ref), prefix); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}\n\treturn a;\n}"); } else { fprintf(fout, "\n\tif (!a)\n\t\tif (!(a = (%s)soap_malloc(soap, sizeof(%s))))\n\t\t\treturn NULL;", c_type_id(typ, "*"), c_type(typ)); fprintf(fout, "\n\t*a = NULL;\n\tif (!soap->null && *soap->href != '#')"); fprintf(fout, "\n\t{\tsoap_revert(soap);"); fprintf(fout, "\n\t\tif (!(*a = soap_in_%s(soap, tag, *a, type)))", c_ident((Tnode*)typ->ref)); fprintf(fout, "\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}\n\telse\n\t{\ta = (%s)soap_id_lookup(soap, soap->href, (void**)a, %s, sizeof(%s), %d, NULL);", c_type_id(typ, "*"), soap_type(reftype(typ->ref)), c_type(reftype(typ->ref)), reflevel(typ->ref)); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}\n\treturn a;\n}"); } break; case Tarray: temp = get_item_type(typ, &cardinality); if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s * SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type(temp), c_ident(typ), c_type_id(typ, "")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type(temp), c_ident(typ), c_type_id(typ, "")); fprintf(fout, "\n\nSOAP_FMAC3 %s * SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type(temp), c_ident(typ), c_type_id(typ, "a")); fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 0, NULL))"); fprintf(fout, "\n\t\treturn NULL;"); fprintf(fout, "\n\tif (soap_match_array(soap, type))"); fprintf(fout, "\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}"); fprintf(fout, "\n\ta = (%s)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), NULL, NULL, NULL, NULL);", c_type_id(typ->ref, "(*)"), soap_type(typ), c_type_id(typ, "")); fprintf(fout, "\n\tif (!a)\n\t\treturn NULL;"); fprintf(fout, "\n\tsoap_default_%s(soap, a);", c_ident(typ)); fprintf(fout, "\n\tif (soap->body && *soap->href != '#')"); fprintf(fout, "\n\t{\tint i;\n\t\tfor (i = 0; i < %d; i++)", get_dimension(typ)); fprintf(fout, "\n\t\t{\tsoap_peek_element(soap);\n\t\t\tif (soap->position)\n\t\t\t{\ti = soap->positions[0];\n\t\t\t\tif (i < 0 || i >= %d)\n\t\t\t\t{\tsoap->error = SOAP_IOB;\n\t\t\t\t\treturn NULL;\n\t\t\t\t}\n\t\t\t}", get_dimension(typ)); fprintf(fout, "\n\t\t\tif (!soap_in_%s(soap, NULL, a", c_ident((Tnode*)typ->ref)); if (cardinality > 1) fprintf(fout, "[i]"); else fprintf(fout, "+i"); fprintf(fout, ", \"%s\"))", xsi_type((Tnode*)typ->ref)); fprintf(fout, "\n\t\t\t{\tif (soap->error != SOAP_NO_TAG)\n\t\t\t\t\treturn NULL;"); fprintf(fout, "\n\t\t\t\tsoap->error = SOAP_OK;"); fprintf(fout, "\n\t\t\t\tbreak;"); fprintf(fout, "\n\t\t\t}"); fprintf(fout, "\n\t\t}"); fprintf(fout, "\n\t\tif ((soap->mode & SOAP_C_NOIOB))\n\t\t\twhile (soap_element_end_in(soap, tag) == SOAP_SYNTAX_ERROR)\n\t\t\t{\tsoap->peeked = 1;\n\t\t\t\tsoap_ignore_element(soap);\n\t\t\t}"); fprintf(fout, "\n\t\telse if (soap_element_end_in(soap, tag))\n\t\t{\tif (soap->error == SOAP_SYNTAX_ERROR)\n\t\t\t\tsoap->error = SOAP_IOB;\n\t\t\treturn NULL;\n\t\t}"); if (!cflag) fprintf(fout, "\n\t}\n\telse\n\t{\ta = (%s)soap_id_forward(soap, soap->href, (void*)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), NULL, NULL, NULL, NULL), 0, %s, %s, sizeof(%s), 0, %s_finsert, NULL);", c_type_id(typ->ref, "(*)"), soap_type(typ), c_type_id(typ, ""), soap_type(typ), soap_type(typ), c_type_id(typ, ""), prefix); else fprintf(fout, "\n\t}\n\telse\n\t{\ta = (%s)soap_id_forward(soap, soap->href, (void*)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), NULL, NULL, NULL, NULL), 0, %s, %s, sizeof(%s), 0, NULL, NULL);", c_type_id(typ->ref, "(*)"), soap_type(typ), c_type_id(typ, ""), soap_type(typ), soap_type(typ), c_type_id(typ, "")); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}\n\treturn (%s*)a;\n}", c_type(temp)); break; case Tenum: case Tenumsc: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); return; } fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); if (!is_typedef(typ)) { fprintf(fhead, "\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap*, const char*, %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap *soap, const char *s, %s)\n{", c_ident(typ), c_type_id(typ, "*a")); if (!is_mask(typ)) { LONG64 min = 0; LONG64 max = 0; fprintf(fout, "\n\tconst struct soap_code_map *map;"); t = (Table*)typ->ref; if (t && t->list && has_ns_eq(NULL, ns_remove3(t->list->sym->name, c_ident(typ)))) { fprintf(fout, "\n\tchar *t;"); fprintf(fout, "\n\tif (!s)\n\t\treturn soap->error;"); fprintf(fout, "\n\tsoap_s2QName(soap, s, &t, %ld, %ld, %s);", minlen(typ), maxlen(typ), pattern(typ)); fprintf(fout, "\n\tmap = soap_code(soap_codes_%s, t);", c_ident(typ)); } else { fprintf(fout, "\n\tif (!s)\n\t\treturn soap->error;"); fprintf(fout, "\n\tmap = soap_code(soap_codes_%s, s);", c_ident(typ)); } for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) { if (p->info.val.i < min) min = p->info.val.i; if (p->info.val.i > max) max = p->info.val.i; } } if (is_boolean(typ)) fprintf(fout, "\n\tif (map)\n\t\t*a = (%s)(map->code != 0);\n\telse if (!*s)\n\t\treturn soap->error = SOAP_EMPTY;\n\telse\n\t{\tlong n;\n\t\tif (soap_s2long(soap, s, &n) || n < 0 || n > 1)\n\t\t\treturn soap->error = SOAP_TYPE;\n\t\t*a = (%s)(n != 0);\n\t}\n\treturn SOAP_OK;\n}", c_type(typ), c_type(typ)); else if (sflag) fprintf(fout, "\n\tif (map)\n\t\t*a = (%s)map->code;\n\telse if (!*s)\n\t\treturn soap->error = SOAP_EMPTY;\n\telse\n\t\treturn soap->error = SOAP_TYPE;\n\treturn SOAP_OK;\n}", c_type(typ)); else if (min >= -2147483648LL && min <= 2147483647LL && max >= -2147483648LL && max <= 2147483647LL) fprintf(fout, "\n\tif (map)\n\t\t*a = (%s)map->code;\n\telse if (!*s)\n\t\treturn soap->error = SOAP_EMPTY;\n\telse\n\t{\tint n;\n\t\tif (soap_s2int(soap, s, &n) || n < " SOAP_LONG_FORMAT " || n > " SOAP_LONG_FORMAT ")\n\t\t\treturn soap->error = SOAP_TYPE;\n\t\t*a = (%s)n;\n\t}\n\treturn SOAP_OK;\n}", c_type(typ), min, max, c_type(typ)); else fprintf(fout, "\n\tif (map)\n\t\t*a = (%s)map->code;\n\telse if (!*s)\n\t\treturn soap->error = SOAP_EMPTY;\n\telse\n\t{\tLONG64 n;\n\t\tif (soap_s2LONG64(soap, s, &n) || n < " SOAP_LONG_FORMAT "LL || n > " SOAP_LONG_FORMAT "LL)\n\t\t\treturn soap->error = SOAP_TYPE;\n\t\t*a = (%s)n;\n\t}\n\treturn SOAP_OK;\n}", c_type(typ), min, max, c_type(typ)); } else { t = (Table*)typ->ref; if (t && t->list && has_ns_eq(NULL, ns_remove3(t->list->sym->name, c_ident(typ)))) { fprintf(fout, "\n\tchar *t;"); fprintf(fout, "\n\tsoap_s2QName(soap, s, &t, %ld, %ld, %s);", minlen(typ), maxlen(typ), pattern(typ)); fprintf(fout, "\n\t*a = (%s)soap_code_bits(soap_codes_%s, t);", c_type(typ), c_ident(typ)); } else fprintf(fout, "\n\t(void)soap; /* appease -Wall -Werror */\n\t*a = (%s)soap_code_bits(soap_codes_%s, s);", c_type(typ), c_ident(typ)); fprintf(fout, "\n\treturn SOAP_OK;\n}"); } } fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*a")); if (is_boolean(typ)) { fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 0, NULL))"); fprintf(fout, "\n\t\treturn NULL;"); fprintf(fout, "\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \":boolean\"))"); fprintf(fout, "\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}"); } else if (typ->sym) { fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 0, NULL))"); fprintf(fout, "\n\t\treturn NULL;"); fprintf(fout, "\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \"%s\"))", base_type(typ, "")); fprintf(fout, "\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}"); } else { fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 0, type))"); fprintf(fout, "\n\t\treturn NULL;"); } fprintf(fout, "\n\ta = (%s*)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), NULL, NULL, NULL, NULL);", c_type(typ), soap_type(typ), c_type(typ)); fprintf(fout, "\n\tif (!a)\n\t\treturn NULL;"); fprintf(fout, "\n\tif (*soap->href != '#')\n\t{"); fprintf(fout, "\tint err = soap_s2%s(soap, soap_value(soap), a);\n\t\tif ((soap->body && soap_element_end_in(soap, tag)) || err)\n\t\t\treturn NULL;", c_ident(typ)); fprintf(fout, "\n\t}\n\telse\n\t{\ta = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, %s, sizeof(%s), 0, NULL, NULL);", c_type_id(typ, "*"), soap_type(typ), soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}\n\treturn a;\n}"); break; case Ttemplate: if (is_external(typ) && !is_volatile(typ)) { fprintf(fhead, "\nSOAP_FMAC1 %s SOAP_FMAC2 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); return; } if (is_typedef(typ)) { fprintf(fhead, "\n\n#define soap_in_%s soap_in_%s\n", c_ident(typ), t_ident(typ)); return; } n = (Tnode*)typ->ref; if (n->type == Tfun || is_void(n)) return; fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)\n{", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*a")); fprintf(fout, "\n\t(void)type; /* appease -Wall -Werror */"); if (is_smart(typ)) { fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 1, NULL))"); fprintf(fout, "\n\t\treturn NULL;"); fprintf(fout, "\n\tif (!a && !(a = soap_new_%s(soap)))\n\t\treturn NULL;", c_ident(typ)); fprintf(fout, "\n\tif (!soap->null && *soap->href != '#')\n\t{"); if (is_smart_shared(typ)) { fprintf(fout, "\tvoid **x = soap_id_smart(soap, soap->id, %s, sizeof(%s));", soap_type(n), c_type(n)); if (n->type == Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n)) fprintf(fout, "\n\t\tif (x && *x)\n\t\t\t*a = *(%s)(*x);\n\t\telse if ((*a = %s(%s_instantiate_%s(soap, SOAP_NO_LINK_TO_DELETE, soap->type, soap->arrayType, NULL))))\n\t\t{\tif (x)\n\t\t\t\t*x = (void*)a;\n\t\t}\n\t\telse\n\t\t\treturn NULL;", c_type_id(typ, "*"), c_type(typ), fprefix, c_ident(n)); else fprintf(fout, "\n\t\tif (x && *x)\n\t\t\t*a = *(%s)(*x);\n\t\telse\n\t\t{\t*a = %s<%s>();\n\t\t\tif (x)\n\t\t\t\t*x = (void*)a;\n\t\t}", c_type_id(typ, "*"), make_shared(typ), c_type(n)); } else if (n->type == Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n)) fprintf(fout, "\tif (!(*a = %s(%s_instantiate_%s(soap, SOAP_NO_LINK_TO_DELETE, soap->type, soap->arrayType, NULL))))\n\t\t\treturn NULL;", c_type(typ), fprefix, c_ident(n)); else fprintf(fout, "\tif (!(*a = %s(SOAP_NEW(soap, %s))))\n\t\t\treturn NULL;", c_type(typ), c_type(n)); fprintf(fout, "\n\t\tsoap_revert(soap);"); if (is_XML(n) && is_string(n)) fprintf(fout, "\n\t\tif (!soap_inliteral(soap, tag, (char*const*)a->get()))\n\t\t\treturn NULL;"); else if (is_XML(n) && is_wstring(n)) fprintf(fout, "\n\t\tif (!soap_inwliteral(soap, tag, (wchar_t*const*)a->get()))\n\t\t\treturn NULL;"); else if (n->type == Tarray) fprintf(fout, "\n\t\tif (!soap_in_%s(soap, tag, a->get(), \"%s\"))\n\t\t\treturn NULL;", c_ident(n), xsi_type(n)); else if (n->type == Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n)) { fprintf(fout, "\n\t\t(*a)->soap_default(soap);"); fprintf(fout, "\n\t\tif (!(*a)->soap_in(soap, tag, NULL))\n\t\t\treturn NULL;"); } else { fprintf(fout, "\n\t\tsoap_default_%s(soap, a->get());", c_ident(n)); fprintf(fout, "\n\t\tif (!soap_in_%s(soap, tag, a->get(), \"%s\"))\n\t\t\treturn NULL;", c_ident(n), xsi_type(n)); } fprintf(fout, "\n\t}\n\telse\n\t{"); fprintf(fout, "\tif (!soap_id_forward(soap, soap->href, a, 0, %s, %s, sizeof(%s), %d, %s_finsert, %s_fbase))\n\t\t\treturn NULL;", soap_type(reftype(n)), soap_type(typ), c_type(reftype(n)), reflevel(n) + 1, prefix, prefix); /* reflevel + 1 since smart pointer accepts derived types */ fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}\n\treturn a;\n}"); } else if (c11flag && (!strcmp(typ->id->name, "std::deque") || !strcmp(typ->id->name, "std::list") || (!strcmp(typ->id->name, "std::vector") && !is_bool(n)))) /* use C++11 emplace_back */ { fprintf(fout, "\n\tshort soap_flag;"); fprintf(fout, "\n\tfor (soap_flag = 0;; soap_flag = 1)\n\t{"); fprintf(fout, "\n\t\tif (tag && *tag != '-')\n\t\t{\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\t\t\tbreak;\n\t\t\tsoap_revert(soap);\n\t\t}"); fprintf(fout, "\n\t\tif (!a && !(a = soap_new_%s(soap)))\n\t\t\treturn NULL;", c_ident(typ)); if (!strcmp(typ->id->name, "std::vector") && !is_primitive(n) && n->type != Tpointer) { fprintf(fout, "\n\t\tif (!a->empty() && a->size() == a->capacity())\n\t\t{\tconst void *p = &a->front();"); fprintf(fout, "\n\t\t\ta->emplace_back();"); fprintf(fout, "\n\t\t\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Vector capacity increased to %%lu to fit %%lu items: updating pointers\\n\", a->capacity(), a->size()));"); fprintf(fout, "\n\t\t\tsoap_update_pointers(soap, (const char*)&a->front(), (const char*)p, (a->size() - 1) * sizeof(%s));", c_type(n)); fprintf(fout, "\n\t\t}\n\t\telse\n\t\t{\ta->emplace_back();\n\t\t}"); fprintf(fout, "\n\t\t%s *n = &a->back();\n\t\t", c_type(n)); } else { fprintf(fout, "\n\t\ta->emplace_back();\n\t\t%s *n = &a->back();\n\t\t", c_type(n)); } if (n->type == Tpointer) fprintf(fout, "*n = NULL;"); else if (n->type == Tarray) fprintf(fout, "soap_default_%s(soap, n);", c_ident(n)); else if (n->type == Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n)) fprintf(fout, "n->soap_default(soap);"); else if (n->type != Tfun && !is_void(n) && !is_XML(n)) fprintf(fout, "soap_default_%s(soap, n);", c_ident(n)); if (!is_primitive(n) && n->type != Tpointer) fprintf(fout, "\n\t\tshort soap_shaky = soap_begin_shaky(soap);"); fprintf(fout, "\n\t\tif (tag && *tag != '-' && (*soap->id || *soap->href == '#'))\n\t\t{\tif ("); fprintf(fout, "!soap_id_forward(soap, *soap->id?soap->id:soap->href, a, (size_t)a->size() - 1, %s, %s, sizeof(%s), %d, %s_finsert, %s_fbase))\n\t\t\t\tbreak;\n\t\t\tif (", soap_type(reftype(n)), soap_type(typ), c_type(reftype(n)), reflevel(n), prefix, prefix); if (is_XML(n) && is_string(n)) fprintf(fout, "!soap_inliteral(soap, tag, NULL)"); else if (is_XML(n) && is_wstring(n)) fprintf(fout, "!soap_inwliteral(soap, tag, NULL)"); else if (n->type == Tarray) fprintf(fout, "!soap_in_%s(soap, tag, NULL, \"%s\")", c_ident(n), xsi_type(n)); else fprintf(fout, "!soap_in_%s(soap, tag, NULL, \"%s\")", c_ident(n), xsi_type(n)); fprintf(fout, ")\n\t\t\t\tbreak;\n\t\t}\n\t\telse\n\t\t{\t"); if (is_XML(n) && is_string(n)) fprintf(fout, "if (!soap_inliteral(soap, tag, n))"); else if (is_XML(n) && is_wstring(n)) fprintf(fout, "if (!soap_inwliteral(soap, tag, n))"); else if (n->type == Tarray) fprintf(fout, "if (!soap_in_%s(soap, tag, n, \"%s\"))", c_ident(n), xsi_type(n)); else fprintf(fout, "if (!soap_in_%s(soap, tag, n, \"%s\"))", c_ident(n), xsi_type(n)); fprintf(fout, "\n\t\t\t{\ta->pop_back();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}"); if (!is_primitive(n) && n->type != Tpointer) fprintf(fout, "\n\t\tsoap_end_shaky(soap, soap_shaky);"); fprintf(fout, "\n\t\tif (!tag || *tag == '-')\n\t\t\treturn a;\n\t}\n\tif (soap_flag && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))\n\t{\tsoap->error = SOAP_OK;\n\t\treturn a;\n\t}\n\treturn NULL;\n}"); } else { fprintf(fout, "\n\tshort soap_flag;"); fprintf(fout, "\n\tfor (soap_flag = 0;; soap_flag = 1)\n\t{"); fprintf(fout, "\n\t\tif (tag && *tag != '-')\n\t\t{\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\t\t\tbreak;\n\t\t\tsoap_revert(soap);\n\t\t}"); fprintf(fout, "\n\t\tif (!a && !(a = soap_new_%s(soap)))\n\t\t\treturn NULL;", c_ident(typ)); fprintf(fout, "\n\t\telse if (static_cast(a->size()) > soap->maxoccurs)\n\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\treturn NULL;\n\t\t}"); fprintf(fout, "\n\t\t%s;\n\t\t", c_type_id(n, "n")); if (n->type == Tpointer) fprintf(fout, "n = NULL;"); else if (n->type == Tarray) fprintf(fout, "soap_default_%s(soap, &n);", c_ident(n)); else if (n->type == Tclass && !is_external(n) && !is_volatile(n) && !is_typedef(n)) fprintf(fout, "n.soap_default(soap);"); else if (n->type != Tfun && !is_void(n) && !is_XML(n) && !is_smart(n)) fprintf(fout, "soap_default_%s(soap, &n);", c_ident(n)); if (!is_primitive(n) && n->type != Tpointer) fprintf(fout, "\n\t\tshort soap_shaky = soap_begin_shaky(soap);"); fprintf(fout, "\n\t\tif (tag && *tag != '-' && (*soap->id || *soap->href == '#'))\n\t\t{\tif ("); fprintf(fout, "!soap_id_forward(soap, *soap->id?soap->id:soap->href, a, static_cast(a->size()), %s, %s, sizeof(%s), %d, %s_finsert, %s_fbase))\n\t\t\t\tbreak;\n\t\t\tif (", soap_type(reftype(n)), soap_type(typ), c_type(reftype(n)), reflevel(n), prefix, prefix); if (is_XML(n) && is_string(n)) fprintf(fout, "!soap_inliteral(soap, tag, NULL)"); else if (is_XML(n) && is_wstring(n)) fprintf(fout, "!soap_inwliteral(soap, tag, NULL)"); else if (n->type == Tarray) fprintf(fout, "!soap_in_%s(soap, tag, NULL, \"%s\")", c_ident(n), xsi_type(n)); else fprintf(fout, "!soap_in_%s(soap, tag, NULL, \"%s\")", c_ident(n), xsi_type(n)); fprintf(fout, ")\n\t\t\t\tbreak;\n\t\t}\n\t\telse\n\t\t{\t"); if (is_XML(n) && is_string(n)) fprintf(fout, "if (!soap_inliteral(soap, tag, &n))"); else if (is_XML(n) && is_wstring(n)) fprintf(fout, "if (!soap_inwliteral(soap, tag, &n))"); else if (n->type == Tarray) fprintf(fout, "if (!soap_in_%s(soap, tag, &n, \"%s\"))", c_ident(n), xsi_type(n)); else fprintf(fout, "if (!soap_in_%s(soap, tag, &n, \"%s\"))", c_ident(n), xsi_type(n)); fprintf(fout, "\n\t\t\t\tbreak;\n\t\t}"); if (!is_primitive(n) && n->type != Tpointer) fprintf(fout, "\n\t\tsoap_end_shaky(soap, soap_shaky);"); if (!(!strcmp(typ->id->name, "std::list") || !strcmp(typ->id->name, "std::deque") || !strcmp(typ->id->name, "std::set")) && !is_primitive(n) && n->type != Tpointer && !is_smart(n)) { fprintf(fout, "\n\t\tif (a->size())\n\t\t{\tconst void *p = &*a->begin();\n\t\t\tsoap_update_pointers(soap, (const char*)&(*a->insert(a->end(), n)), (const char*)&n, sizeof(%s));", c_type(n)); fprintf(fout, "\n\t\t\tif (p != &*a->begin())\n\t\t\t{\tDBGLOG(TEST, SOAP_MESSAGE(fdebug, \"Container capacity increased: updating pointers\\n\"));"); fprintf(fout, "\n\t\t\t\tsoap_update_pointers(soap, (const char*)&*a->begin(), (const char*)p, (a->size() - 1) * sizeof(%s));\n\t\t\t}", c_type(n)); fprintf(fout, "\n\t\t}\n\t\telse\n\t\t{\tsoap_update_pointers(soap, (const char*)&(*a->insert(a->end(), n)), (const char*)&n, sizeof(%s));", c_type(n)); fprintf(fout, "\n\t\t}"); } else { if (is_primitive(n) || n->type == Tpointer || is_smart(n)) fprintf(fout, "\n\t\ta->insert(a->end(), n);"); else fprintf(fout, "\n\t\tsoap_update_pointers(soap, (const char*)&(*a->insert(a->end(), n)), (const char*)&n, sizeof(%s));", c_type(n)); } fprintf(fout, "\n\t\tif (!tag || *tag == '-')\n\t\t\treturn a;\n\t}\n\tif (soap_flag && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))\n\t{\tsoap->error = SOAP_OK;\n\t\treturn a;\n\t}\n\treturn NULL;\n}"); } break; default: break; } fflush(fout); } void soap_in_Darray(Tnode *typ) { int i, j, d; Entry *p; Table *t; const char *nsa = ns_qualifiedAttribute(typ); p = is_dynamic_array(typ); d = get_Darraydims(typ); fprintf(fhead, "\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap*, const char*, %s, const char*);", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*")); if (is_external(typ)) return; if (is_binary(typ)) { fprintf(fhead, "\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap*, const char*, %s);", c_ident(typ), c_type_id(typ, "*")); fprintf(fout, "\n\nSOAP_FMAC3S int SOAP_FMAC4S soap_s2%s(struct soap *soap, const char *s, %s)\n{", c_ident(typ), c_type_id(typ, "*a")); if (is_hexBinary(typ)) fprintf(fout, "\n\ta->__ptr = (unsigned char*)soap_hex2s(soap, s, NULL, 0, &a->__size);"); else fprintf(fout, "\n\ta->__ptr = (unsigned char*)soap_base642s(soap, s, NULL, 0, &a->__size);"); fprintf(fout, "\n\tif (!a->__ptr)\n\t\treturn soap->error;"); if (typ->hasmin) { long min = minlen(typ); if (min > 0) fprintf(fout, "\n\tif (a->__size < %ld)\n\t\treturn soap->error = SOAP_LENGTH;", min); } if (typ->hasmax) { long max = maxlen(typ); if (max >= 0) fprintf(fout, "\n\tif (a->__size > %ld)\n\t\treturn soap->error = SOAP_LENGTH;", max); } fprintf(fout, "\n\treturn SOAP_OK;\n}"); } if (typ->type == Tclass && !is_volatile(typ) && !is_typedef(typ)) { fprintf(fout, "\n\nvoid *%s::soap_in(struct soap *soap, const char *tag, const char *type)", c_type(typ)); fprintf(fout, "\n{\n\treturn soap_in_%s(soap, tag, this, type);\n}", c_ident(typ)); } fflush(fout); fprintf(fout, "\n\nSOAP_FMAC3 %s SOAP_FMAC4 soap_in_%s(struct soap *soap, const char *tag, %s, const char *type)", c_type_id(typ, "*"), c_ident(typ), c_type_id(typ, "*a")); if (is_binary(typ)) fprintf(fout, "\n{"); else if (d) fprintf(fout, "\n{\n\tsize_t i, n;\n\tint j;\n\t%s;", c_type_id(p->info.typ, "p")); else fprintf(fout, "\n{\n\tint i, j;\n\t%s;", c_type_id(p->info.typ, "p")); fprintf(fout, "\n\tif (soap_element_begin_in(soap, tag, 1, NULL))\n\t\treturn NULL;"); if (is_hexBinary(typ)) fprintf(fout, "\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \":hexBinary\"))"); else if (is_binary(typ)) fprintf(fout, "\n\tif (*soap->type && soap_match_tag(soap, soap->type, type) && soap_match_tag(soap, soap->type, \":base64Binary\") && soap_match_tag(soap, soap->type, \":base64\"))"); else if (has_ns(typ) || is_untyped(typ)) fprintf(fout, "\n\tif (*soap->type && soap_match_array(soap, \"%s\") && soap_match_tag(soap, soap->type, type))", xsi_type((Tnode*)p->info.typ->ref)); else fprintf(fout, "\n\tif (soap_match_array(soap, type))"); fprintf(fout, "\n\t{\tsoap->error = SOAP_TYPE;\n\t\treturn NULL;\n\t}"); if (typ->type == Tclass) { fprintf(fout, "\n\ta = (%s*)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), soap->type, soap->arrayType, %s_instantiate, %s_fbase);", c_type(typ), soap_type(typ), c_type(typ), prefix, prefix); fprintf(fout, "\n\tif (!a)\n\t\treturn NULL;"); fprintf(fout, "\n\ta->soap_default(soap);"); for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, ptr_cast(t, "a"), ident(p->sym->name), ns_add(p, nsa)); } } else { fprintf(fout, "\n\ta = (%s*)soap_id_enter(soap, soap->id, a, %s, sizeof(%s), NULL, NULL, NULL, NULL);", c_type(typ), soap_type(typ), c_type(typ)); fprintf(fout, "\n\tif (!a)\n\t\treturn NULL;"); fprintf(fout, "\n\tsoap_default_%s(soap, a);", c_ident(typ)); for (t = (Table*)typ->ref; t; t = t->prev) { for (p = t->list; p; p = p->next) if (p->info.sto & Sattribute) soap_attr_value(p, "a", ident(p->sym->name), ns_add(p, nsa)); } } if (is_attachment(typ)) fprintf(fout, "\n\tif (soap->body && !*soap->href)\n\t{"); else fprintf(fout, "\n\tif (soap->body && *soap->href != '#')\n\t{"); p = is_dynamic_array(typ); if (is_binary(typ)) { if (is_hexBinary(typ)) fprintf(fout, "\n\t\ta->__ptr = soap_gethex(soap, &a->__size);"); else { fprintf(fout, "\n\t\ta->__ptr = soap_getbase64(soap, &a->__size, 0);"); if (is_attachment(typ)) fprintf(fout, "\n#ifndef WITH_LEANER\n\t\tif (soap_xop_forward(soap, &a->__ptr, &a->__size, &a->id, &a->type, &a->options))\n\t\t\treturn NULL;\n#endif"); } fprintf(fout, "\n\t\tif ((!a->__ptr && soap->error) || soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); if (typ->hasmin) { long min = minlen(typ); if (min > 0) fprintf(fout, "\n\t\tif (a->__size < %ld)\n\t\t{\tsoap->error = SOAP_LENGTH;\n\t\t\treturn NULL;\n\t\t}", min); } if (typ->hasmax) { long max = maxlen(typ); if (max >= 0) fprintf(fout, "\n\t\tif (a->__size > %ld)\n\t\t{\tsoap->error = SOAP_LENGTH;\n\t\t\treturn NULL;\n\t\t}", max); } } else { fprintf(fout, "\n\t\tif (*soap->arraySize)\n\t\t{"); if (d) { fprintf(fout, "\n\t\t\tn = soap_getsizes(soap->arraySize, a->__size, %d);", d); if (has_offset(typ)) fprintf(fout, "\n\t\t\tn -= j = soap_getoffsets(soap->arrayOffset, a->__size, a->__offset, %d);", d); else fprintf(fout, "\n\t\t\tn -= j = soap_getoffsets(soap->arrayOffset, a->__size, NULL, %d);", d); if (p->info.minOccurs > 0) fprintf(fout, "\n\t\t\tif (%sn < " SOAP_LONG_FORMAT ")\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}", strict_check(), p->info.minOccurs); if (p->info.maxOccurs > 1) fprintf(fout, "\n\t\t\t\tif (%sn > " SOAP_LONG_FORMAT ")\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}", strict_check(), p->info.maxOccurs); else fprintf(fout, "\n\t\t\tif (n > soap->maxoccurs)\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}"); if (((Tnode*)p->info.typ->ref)->type == Tclass || (((Tnode*)p->info.typ->ref)->type == Tstruct && !cflag)) { fprintf(fout, "\n\t\t\ta->%s = soap_new_%s(soap, n);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref)); if (!is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref) && ((Tnode*)p->info.typ->ref)->type == Tclass) fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\t(a->%s+i)->%s::soap_default(soap);", ident(p->sym->name), c_type((Tnode*)p->info.typ->ref)); else if (((Tnode*)p->info.typ->ref)->type == Tpointer) fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } else if (has_class((Tnode*)p->info.typ->ref)) { fprintf(fout, "\n\t\t\ta->%s = soap_new_%s(soap, n);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref)); fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } else { fprintf(fout, "\n\t\t\ta->%s = (%s)soap_malloc(soap, n * sizeof(%s));", ident(p->sym->name), c_type_id((Tnode*)p->info.typ->ref, "*"), c_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tpointer) fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\ta->%s[i] = NULL;", ident(p->sym->name)); else if (!is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } fprintf(fout, "\n\t\t\tfor (i = 0; i < n; i++)"); fprintf(fout, "\n\t\t\t{\tsoap_peek_element(soap);\n\t\t\t\tif (soap->position == %d)", d); fprintf(fout, "\n\t\t\t\t{\ti = (size_t)("); for (i = 0; i < d; i++) { fprintf(fout, "soap->positions[%d]", i); for (j = 1; j < d-i; j++) fprintf(fout, "*a->__size[%d]", j); if (i < d-1) fprintf(fout, "+"); } fprintf(fout, "-j);"); fprintf(fout, "\n\t\t\t\t\tif (i >= n)\n\t\t\t\t\t{\tsoap->error = SOAP_IOB;\n\t\t\t\t\t\treturn NULL;\n\t\t\t\t\t}\n\t\t\t\t}"); fprintf(fout, "\n\t\t\t\tif (!soap_in_%s(soap, NULL, a->%s + i, \"%s\"))", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type((Tnode*)p->info.typ->ref)); fprintf(fout, "\n\t\t\t\t{\tif (soap->error != SOAP_NO_TAG)\n\t\t\t\t\t\treturn NULL;"); fprintf(fout, "\n\t\t\t\t\tsoap->error = SOAP_OK;"); fprintf(fout, "\n\t\t\t\t\tbreak;"); fprintf(fout, "\n\t\t\t\t}"); } else { fprintf(fout, "\n\t\t\tsoap_getsizes(soap->arraySize, &a->__size, 1);"); if (has_offset(typ)) fprintf(fout, "\n\t\t\ta->__size -= j = soap_getoffsets(soap->arrayOffset, &a->__size, &a->__offset, 1);"); else fprintf(fout, "\n\t\t\ta->__size -= j = soap_getoffsets(soap->arrayOffset, &a->__size, NULL, 1);"); if (p->info.minOccurs > 0) fprintf(fout, "\n\t\t\tif (%sa->__size < " SOAP_LONG_FORMAT ")\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}", strict_check(), p->info.minOccurs); if (p->info.maxOccurs > 1) fprintf(fout, "\n\t\t\tif (%sa->__size > " SOAP_LONG_FORMAT ")\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}", strict_check(), p->info.maxOccurs); else fprintf(fout, "\n\t\t\tif ((size_t)a->__size > soap->maxoccurs)\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}"); if (((Tnode*)p->info.typ->ref)->type == Tclass || (((Tnode*)p->info.typ->ref)->type == Tstruct && !cflag)) { fprintf(fout, "\n\t\t\ta->%s = soap_new_%s(soap, a->__size);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref)); if (!is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref) && ((Tnode*)p->info.typ->ref)->type == Tclass) fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\t(a->%s+i)->%s::soap_default(soap);", ident(p->sym->name), c_type((Tnode*)p->info.typ->ref)); else fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } else if (has_class((Tnode*)p->info.typ->ref)) { fprintf(fout, "\n\t\t\ta->%s = soap_new_%s(soap, a->__size);", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref)); fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } else { fprintf(fout, "\n\t\t\ta->%s = (%s)soap_malloc(soap, sizeof(%s) * a->__size);", ident(p->sym->name), c_type_id((Tnode*)p->info.typ->ref, "*"), c_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tpointer) fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\ta->%s[i] = NULL;", ident(p->sym->name)); else if (!is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)\n\t\t\t\tsoap_default_%s(soap, a->%s+i);", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name)); } fprintf(fout, "\n\t\t\tfor (i = 0; i < a->__size; i++)"); fprintf(fout, "\n\t\t\t{\tsoap_peek_element(soap);\n\t\t\t\tif (soap->position)\n\t\t\t\t{\ti = soap->positions[0]-j;\n\t\t\t\t\tif (i < 0 || i >= a->__size)\n\t\t\t\t\t{\tsoap->error = SOAP_IOB;\n\t\t\t\t\t\treturn NULL;\n\t\t\t\t\t}\n\t\t\t\t}"); if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (!soap_inliteral(soap, NULL, (char**)(a->%s + i)))", ident(p->sym->name)); else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (!soap_inwliteral(soap, NULL, (wchar_t**)(a->%s + i)))", ident(p->sym->name)); else if (is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (!soap_in_%s(soap, NULL, (char**)(a->%s + i), \"%s\"))", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type((Tnode*)p->info.typ->ref)); else if (is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (!soap_in_%s(soap, NULL, (wchar_t**)(a->%s + i), \"%s\"))", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type((Tnode*)p->info.typ->ref)); else fprintf(fout, "\n\t\t\t\tif (!soap_in_%s(soap, NULL, a->%s + i, \"%s\"))", c_ident((Tnode*)p->info.typ->ref), ident(p->sym->name), xsi_type((Tnode*)p->info.typ->ref)); fprintf(fout, "\n\t\t\t\t{\tif (soap->error != SOAP_NO_TAG)\n\t\t\t\t\t\treturn NULL;"); fprintf(fout, "\n\t\t\t\t\tsoap->error = SOAP_OK;"); fprintf(fout, "\n\t\t\t\t\tbreak;"); fprintf(fout, "\n\t\t\t\t}"); } fprintf(fout, "\n\t\t\t}\n\t\t}\n\t\telse"); fprintf(fout, "\n\t\t{\tif (soap_alloc_block(soap) == NULL)\n\t\t\t\treturn NULL;"); if (d) { for (i = 1; i < d; i++) fprintf(fout, "\n\t\t\ta->__size[%d] = 1;", i); fprintf(fout, "\n\t\t\tfor (a->__size[0] = 0; ; a->__size[0]++)\n\t\t\t{"); } else { fprintf(fout, "\n\t\t\tfor (a->__size = 0; ; a->__size++)\n\t\t\t{"); } if (((Tnode*)p->info.typ->ref)->type == Tclass || ((Tnode*)p->info.typ->ref)->type == Ttemplate || has_class((Tnode*)p->info.typ->ref) || (!cflag && ((Tnode*)p->info.typ->ref)->type == Tstruct)) fprintf(fout, "\tp = soap_block<%s>::push(soap, NULL);\n\t\t\t\tif (!p)\n\t\t\t\t\tbreak;", c_type((Tnode*)p->info.typ->ref)); else fprintf(fout, "\tp = (%s)soap_push_block(soap, NULL, sizeof(%s));\n\t\t\t\tif (!p)\n\t\t\t\t\tbreak;", c_type(p->info.typ), c_type((Tnode*)p->info.typ->ref)); if (((Tnode*)p->info.typ->ref)->type == Tclass && !is_external((Tnode*)p->info.typ->ref) && !is_volatile((Tnode*)p->info.typ->ref) && !is_typedef((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tp->soap_default(soap);"); else if (((Tnode*)p->info.typ->ref)->type == Tpointer) fprintf(fout, "\n\t\t\t\t*p = NULL;"); else if (!is_XML((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tsoap_default_%s(soap, p);", c_ident((Tnode*)p->info.typ->ref)); if (is_XML((Tnode*)p->info.typ->ref) && is_string((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (!soap_inliteral(soap, NULL, p))"); else if (is_XML((Tnode*)p->info.typ->ref) && is_wstring((Tnode*)p->info.typ->ref)) fprintf(fout, "\n\t\t\t\tif (!soap_inwliteral(soap, NULL, p))"); else fprintf(fout, "\n\t\t\t\tif (!soap_in_%s(soap, NULL, p, \"%s\"))", c_ident((Tnode*)p->info.typ->ref), xsi_type((Tnode*)p->info.typ->ref)); fprintf(fout, "\n\t\t\t\t{\tif (soap->error == SOAP_NO_TAG)"); fprintf(fout, "\n\t\t\t\t\t\tsoap->error = SOAP_OK;"); if (((Tnode*)p->info.typ->ref)->type == Tclass || ((Tnode*)p->info.typ->ref)->type == Ttemplate || has_class((Tnode*)p->info.typ->ref) || (!cflag && ((Tnode*)p->info.typ->ref)->type == Tstruct)) fprintf(fout, "\n\t\t\t\t\tsoap_block<%s>::pop(soap, NULL);", c_type((Tnode*)p->info.typ->ref)); else fprintf(fout, "\n\t\t\t\t\tsoap_pop_block(soap, NULL);"); fprintf(fout, "\n\t\t\t\t\tbreak;"); fprintf(fout, "\n\t\t\t\t}"); if (d) { if (p->info.maxOccurs > 1) fprintf(fout, "\n\t\t\t\tif (%sa->__size[0] > " SOAP_LONG_FORMAT ")", strict_check(), p->info.maxOccurs); else fprintf(fout, "\n\t\t\t\tif ((size_t)a->__size[0] > soap->maxoccurs)"); } else { if (p->info.maxOccurs > 1) fprintf(fout, "\n\t\t\t\tif (%sa->__size > " SOAP_LONG_FORMAT ")", strict_check(), p->info.maxOccurs); else fprintf(fout, "\n\t\t\t\tif ((size_t)a->__size > soap->maxoccurs)"); } fprintf(fout, "\n\t\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\t\treturn NULL;\n\t\t\t\t}"); fprintf(fout, "\n\t\t\t}"); if (p->info.minOccurs > 0) { if (d) fprintf(fout, "\n\t\t\tif (%sa->__size[0] < " SOAP_LONG_FORMAT ")\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}", strict_check(), p->info.minOccurs); else fprintf(fout, "\n\t\t\tif (%sa->__size < " SOAP_LONG_FORMAT ")\n\t\t\t{\tsoap->error = SOAP_OCCURS;\n\t\t\t\treturn NULL;\n\t\t\t}", strict_check(), p->info.minOccurs); } if (((Tnode*)p->info.typ->ref)->type == Tclass || ((Tnode*)p->info.typ->ref)->type == Ttemplate || has_class((Tnode*)p->info.typ->ref) || (!cflag && ((Tnode*)p->info.typ->ref)->type == Tstruct)) { fprintf(fout, "\n\t\t\tif (soap->blist->size)\n\t\t\t\ta->%s = soap_new_%s(soap, soap->blist->size/sizeof(%s));\n\t\t\telse\n\t\t\t\ta->%s = NULL;", ident(p->sym->name), c_ident((Tnode*)p->info.typ->ref), c_type((Tnode*)p->info.typ->ref), ident(p->sym->name)); fprintf(fout, "\n\t\t\tif (a->%s)\n\t\t\t\tsoap_block<%s>::save(soap, NULL, a->%s);\n\t\t\telse\n\t\t\t\tsoap_block<%s>::end(soap, NULL);", ident(p->sym->name), c_type((Tnode*)p->info.typ->ref), ident(p->sym->name), c_type((Tnode*)p->info.typ->ref)); } else fprintf(fout, "\n\t\t\ta->%s = (%s)soap_save_block(soap, NULL, NULL, 1);", ident(p->sym->name), c_type(p->info.typ)); fprintf(fout, "\n\t\t}"); fprintf(fout, "\n\t\tif (soap->error || soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); } if (has_getter(typ)) fprintf(fout, "\n\t\tif (a->get(soap))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}\n\telse\n\t{\t"); if (is_attachment(typ)) fprintf(fout, "\n#ifndef WITH_LEANER\n\t\tif (*soap->href != '#')\n\t\t{\tif (soap_attachment_forward(soap, &a->__ptr, &a->__size, &a->id, &a->type, &a->options))\n\t\t\t\treturn NULL;\n\t\t}\n\t\telse\n#endif\n\t\t\t"); if (typ->type == Tclass || (!cflag && typ->type == Tstruct)) fprintf(fout, "a = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, %s, sizeof(%s), 0, %s_finsert, %s_fbase);", c_type_id(typ, "*"), soap_type(typ), soap_type(typ), c_type(typ), prefix, prefix); else fprintf(fout, "a = (%s)soap_id_forward(soap, soap->href, (void*)a, 0, %s, %s, sizeof(%s), 0, NULL, NULL);", c_type_id(typ, "*"), soap_type(typ), soap_type(typ), c_type(typ)); fprintf(fout, "\n\t\tif (soap->body && soap_element_end_in(soap, tag))\n\t\t\treturn NULL;"); fprintf(fout, "\n\t}"); fprintf(fout, "\n\treturn a;\n}"); } const char * cstring(const char *s, int q) { size_t n; char *t; const char *r; for (n = 0, r = s; *r; n++, r++) { if (*r == '"' || *r == '\\') n++; else if (*r < 32) n += 3; } r = t = (char*)emalloc(n + 2*q + 1); if (q) *t++ = '"'; for (; *s; s++) { if (*s == '"' || *s == '\\') { *t++ = '\\'; *t++ = *s; } else if (*s < 32) { sprintf(t, "\\%03o", (unsigned int)(unsigned char)*s); t += 4; } else *t++ = *s; } if (q) *t++ = '"'; *t = '\0'; return r; } const char * xstring(const char *s) { size_t n; char *t; const char *r; for (n = 0, r = s; *r; n++, r++) { if (*r < 32 || *r >= 127) n += 4; else if (*r == '<' || *r == '>') n += 3; else if (*r == '&') n += 4; else if (*r == '"') n += 5; else if (*r == '\\') n += 1; } r = t = (char*)emalloc(n + 1); for (; *s; s++) { if (*s < 32 || *s >= 127) { sprintf(t, "&#%.2x;", (unsigned char)*s); t += 5; } else if (*s == '<') { strcpy(t, "<"); t += 4; } else if (*s == '>') { strcpy(t, ">"); t += 4; } else if (*s == '&') { strcpy(t, "&"); t += 5; } else if (*s == '"') { strcpy(t, """); t += 6; } else if (*s == '\\') { strcpy(t, "\\\\"); t += 2; } else *t++ = *s; } *t = '\0'; return r; } void set_namespace(const char *id) { namespaceid = id; if (id) { const char *s = id; int h = 0; while (*s) h = 65599*h + *s++; if (h == 0) h = 1; h <<= 12; /* permits 4096 unique types */ if (h < 0) h = -h; typeNO = h; } } gsoap-2.8.91/gsoap/VisualStudio2005/soapcpp2/soapcpp2.sln0000755000175000017500000000157613525245163022355 0ustar ellertellert Microsoft Visual Studio Solution File, Format Version 9.00 # Visual C++ Express 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "soapcpp2", "soapcpp2\soapcpp2.vcproj", "{BDD1B293-CE39-4BEC-8E63-8B1621F3EB56}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {BDD1B293-CE39-4BEC-8E63-8B1621F3EB56}.Debug|Win32.ActiveCfg = Debug|Win32 {BDD1B293-CE39-4BEC-8E63-8B1621F3EB56}.Debug|Win32.Build.0 = Debug|Win32 {BDD1B293-CE39-4BEC-8E63-8B1621F3EB56}.Release|Win32.ActiveCfg = Release|Win32 {BDD1B293-CE39-4BEC-8E63-8B1621F3EB56}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal gsoap-2.8.91/gsoap/VisualStudio2005/soapcpp2/debug/0000755000175000017500000000000013525245163021162 5ustar ellertellertgsoap-2.8.91/gsoap/VisualStudio2005/soapcpp2/release/0000755000175000017500000000000013525245163021514 5ustar ellertellertgsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/0000755000175000017500000000000013525245163017550 5ustar ellertellertgsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h.sln0000755000175000017500000000157013525245163021477 0ustar ellertellert Microsoft Visual Studio Solution File, Format Version 9.00 # Visual C++ Express 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wsdl2h", "wsdl2h\wsdl2h.vcproj", "{6CBC554A-4FFB-461F-91D4-11B358802815}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {6CBC554A-4FFB-461F-91D4-11B358802815}.Debug|Win32.ActiveCfg = Debug|Win32 {6CBC554A-4FFB-461F-91D4-11B358802815}.Debug|Win32.Build.0 = Debug|Win32 {6CBC554A-4FFB-461F-91D4-11B358802815}.Release|Win32.ActiveCfg = Release|Win32 {6CBC554A-4FFB-461F-91D4-11B358802815}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/0000755000175000017500000000000013525564137020760 5ustar ellertellertgsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/imports.h0000644000175000017500000000340113525245163022617 0ustar ellertellert/* imports.h Common XSD types and externs for gSOAP header file import -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ template class std::vector; typedef char *xsd__anyURI, *xsd__ID, *xsd__NCName, *xsd__NMTOKEN, *xsd__NMTOKENS, *xsd__QName, *xsd__token, *xsd__string; typedef bool xsd__boolean; extern class std::ostream; extern class std::istream; #include "includes.h" extern class MapOfStringToString; extern class SetOfString; gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/gwsdl.h0000644000175000017500000000505213525245163022246 0ustar ellertellert/* gwsdl.h OGSI GWSDL binding schema interface -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap gwsdl schema documentation: OGSI GWSDL binding schema //gsoap gwsdl schema namespace: http://www.gridforum.org/namespaces/2003/03/gridWSDLExtensions //gsoap sd schema namespace: http://www.gridforum.org/namespaces/2003/03/serviceData #import "schema.h" class wsdl__operation; enum sd__mutability { static_, constant, extendable, mutable_ }; class sd__serviceData { public: @xsd__NMTOKEN name; @xsd__QName type; @xsd__boolean nillable = false; @xsd__string minOccurs; // xsd:nonNegativeInteger @xsd__string maxOccurs; // xsd:nonNegativeInteger|unbounded @enum sd__mutability mutability = extendable; @xsd__boolean modifiable = false; /* has any content */ public: }; class sd__staticServiceDataValues { public: int __type; /* any content, probably should use DOM */ void* _any; }; class gwsdl__portType { public: @xsd__NMTOKEN name; @xsd__QName extends; // a list of QNames xsd__string documentation; // ? std::vector operation; // * std::vector sd__serviceData_; sd__staticServiceDataValues *sd__staticServiceDataValues_; public: }; gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/bpel.h0000644000175000017500000000630313525245163022050 0ustar ellertellert/* bpel.h BPEL 2.0 binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2014, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #import "imports.h" //gsoap plnk schema documentation: Partner Link Type Schema for WS-BPEL 2.0 //gsoap plnk schema namespace: http://docs.oasis-open.org/wsbpel/2.0/plnktype //gsoap plnk schema elementForm: qualified //gsoap plnk schema attributeForm: unqualified //gsoap vprop schema documentation: Variable Properties Schema for WS-BPEL 2.0 //gsoap vprop schema namespace: http://docs.oasis-open.org/wsbpel/2.0/varprop //gsoap vprop schema elementForm: qualified //gsoap vprop schema attributeForm: unqualified class wsdl__definitions; class wsdl__portType; class plnk__tPartnerLinkType; class plnk__tRole { public: @xsd__NCName name; @xsd__QName portType; xsd__string documentation; private: wsdl__portType *portTypeRef; plnk__tPartnerLinkType *plnkRef; public: plnk__tRole(); int traverse(wsdl__definitions&); wsdl__portType *portTypePtr() const; void plnkPtr(plnk__tPartnerLinkType*); plnk__tPartnerLinkType *plnkPtr() const; }; class plnk__tPartnerLinkType { public: @xsd__NCName name; std::vector role; xsd__string documentation; public: int traverse(wsdl__definitions&); }; class vprop__tQuery { public: @xsd__anyURI queryLanguage = "urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0"; xsd__QName __mixed; }; class vprop__tProperty { public: @xsd__NCName name; @xsd__QName type; @xsd__QName element; xsd__string documentation; public: int traverse(wsdl__definitions&); }; class vprop__tPropertyAlias { public: vprop__tQuery* query; @xsd__QName propertyName; @xsd__QName messageType; @xsd__NCName part; @xsd__QName type; @xsd__QName element; xsd__string documentation; private: vprop__tProperty *vpropRef; public: int traverse(wsdl__definitions&); vprop__tProperty *vpropPtr() const; }; gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/wsdl2h.vcproj0000755000175000017500000001506513525245163023415 0ustar ellertellert gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/wsdl.h0000644000175000017500000005653513525245163022113 0ustar ellertellert/* wsdl.h WSDL 1.1 and WSDL 2.0 schemas -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2014, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoapopt w //gsoap wsdl schema documentation: WSDL 1.1/2.0 binding schema //gsoap wsdl schema namespace: http://schemas.xmlsoap.org/wsdl/ //gsoap wsdl schema namespace2: http://www.w3.org/ns/wsdl //gsoap wsdl schema elementForm: qualified //gsoap wsdl schema attributeForm: unqualified class wsdl__definitions; // forward declaration #import "imports.h" #import "schema.h" #import "wadl.h" #import "soap.h" #import "mime.h" #import "dime.h" #import "http.h" #import "gwsdl.h" #import "wsam.h" #import "wsp.h" #import "bpel.h" class wsdl__import { public: @xsd__anyURI namespace_; @xsd__anyURI location; private: wsdl__definitions *definitionsRef; public: wsdl__import(); int preprocess(wsdl__definitions&); int traverse(wsdl__definitions&); void definitionsPtr(wsdl__definitions*); wsdl__definitions *definitionsPtr() const; void mark(); }; class wsdl__types : public xs__schema // WSDL 2.0 inlined schema { public: xsd__string documentation; // ? std::vector xs__schema_; // * public: int preprocess(wsdl__definitions&); int traverse(wsdl__definitions&); void mark(); }; class wsdl__part { public: @xsd__NMTOKEN name; @xsd__QName element; @xsd__QName type; xsd__string documentation; // ? private: bool optional; // WADL @required bool repeating; // WADL @repeating bool fixed; // true if WADL @fixed xsd__string default_; // WADL @default and @fixed std::vector option; // WADL option/value* xs__element *elementRef; // traverse() finds element xs__simpleType *simpleTypeRef; // traverse() finds simpleType xs__complexType *complexTypeRef; // traverse() finds complexType public: wsdl__part(); int traverse(wsdl__definitions&); void elementPtr(xs__element*); void simpleTypePtr(xs__simpleType*); void complexTypePtr(xs__complexType*); xs__element *elementPtr() const; xs__simpleType *simpleTypePtr() const; xs__complexType *complexTypePtr() const; void set_optional(bool); void set_fixed(bool); void set_repeating(bool); void set_default(char*); void set_option(char*); bool is_optional() const; bool is_fixed() const; bool is_repeating() const; const char* get_default() const; const std::vector& options() const; void mark(); }; class wsdl__message { public: @xsd__NMTOKEN name; xsd__string documentation; // ? std::vector wsp__Policy_; // * std::vector wsp__PolicyReference_;// * std::vector part; // * public: int traverse(wsdl__definitions&); void mark(); }; class wsdl__ioput { public: @xsd__NMTOKEN name; @xsd__QName message; @xsd__NMTOKEN messageLabel; // WSDL 2.0 @xsd__QName element; // WSDL 2.0 @xsd__anyURI wsa__Action; @xsd__anyURI wsam__Action; xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? private: wsdl__message *messageRef; // traverse() finds message xs__element *elementRef; // traverse() finds element WSDL 2.0 public: wsdl__ioput(); int traverse(wsdl__definitions&); void messagePtr(wsdl__message*); wsdl__message *messagePtr() const; void elementPtr(xs__element*); xs__element *elementPtr() const; void mark(); }; class wsdl__fault { public: @xsd__NMTOKEN name; @xsd__QName message; @xsd__QName ref; // WSDL 2.0 @xsd__NMTOKEN messageLabel; // WSDL 2.0 @xsd__QName element; // WSDL 2.0 @xsd__anyURI wsa__Action; @xsd__anyURI wsam__Action; xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? private: wsdl__message *messageRef; // traverse() finds message xs__element *elementRef; // traverse() finds element WSDL 2.0 public: wsdl__fault(); int traverse(wsdl__definitions&); void messagePtr(wsdl__message*); wsdl__message *messagePtr() const; void elementPtr(xs__element*); xs__element *elementPtr() const; void mark(); }; class wsdl__operation { public: @xsd__NMTOKEN name; @xsd__anyURI pattern; // WSDL 2.0 @xsd__anyURI style; // WSDL 2.0 @xsd__string wrpc__signature; // WSDL 2.0 @xsd__string parameterOrder; xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? $int __union1; union wsdl__union_ioput // | { wsdl__ioput *input; wsdl__ioput *output; } __ioput1; $int __union2; union wsdl__union_ioput __ioput2; // | std::vector fault; // * std::vector infault; // * WSDL 2.0 std::vector outfault; // * WSDL 2.0 public: int traverse(wsdl__definitions&); void mark(); }; class wsdl__portType // ... and WSDL 2.0 interface { public: @xsd__NMTOKEN name; @xsd__QName extends; // WSDL 2.0 @xsd__anyURI styleDefault; // WSDL 2.0 xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? std::vector fault; // * WSDL 2.0 std::vector operation; // * private: wsdl__definitions *definitionsRef; public: wsdl__portType(); int traverse(wsdl__definitions&); void definitionsPtr(wsdl__definitions*); wsdl__definitions *definitionsPtr() const; void mark(); }; class wsdl__ext_ioput // binding extensibility element { public: @xsd__NMTOKEN name; @xsd__NMTOKEN messageLabel; // WSDL 2.0 xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? dime__message *dime__message_; // ? soap__body *soap__body_; // ? xsd__string http__urlEncoded; // ? mime__multipartRelated *mime__multipartRelated_;// ? mime__content *mime__content_; // ? mime__mimeXml *mime__mimeXml_; // ? std::vector soap__header_; // * std::vector wsoap__module_; // * WSDL 2.0 std::vector wsoap__header_; // * WSDL 2.0 std::vector whttp__header_; // * WSDL 2.0 public: int traverse(wsdl__definitions&); void mark(); }; class wsdl__ext_fault // binding extensibility element { public: @xsd__NMTOKEN name; @xsd__QName ref; // WSDL 2.0 @xsd__NMTOKEN messageLabel; // WSDL 2.0 @xsd__QName wsoap__code; // WSDL 2.0 @xsd__QName wsoap__subcodes; // WSDL 2.0 xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? soap__fault *soap__fault_; // ? std::vector wsoap__module_; // * WSDL 2.0 private: wsdl__fault *faultRef; public: wsdl__ext_fault(); int traverse(wsdl__definitions&, wsdl__portType*); void faultPtr(wsdl__fault*); wsdl__fault *faultPtr() const; }; class wsdl__ext_operation // binding extensibility element { public: @xsd__NMTOKEN name; @xsd__QName ref; // WSDL 2.0 @xsd__anyURI wsoap__mep; // WSDL 2.0 @xsd__anyURI wsoap__action; // WSDL 2.0 @xsd__string whttp__method; // WSDL 2.0 @xsd__string whttp__location; // WSDL 2.0 xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? soap__operation *soap__operation_; // ? http__operation *http__operation_; // ? wsdl__ext_ioput *input; // ? wsdl__ext_ioput *output; // ? std::vector fault; // * std::vector infault; // * WSDL 2.0 std::vector outfault; // * WSDL 2.0 private: wsdl__operation *operationRef; // traverse() finds operation public: wsdl__ext_operation(); int traverse(wsdl__definitions&, wsdl__portType*); void operationPtr(wsdl__operation*); wsdl__operation *operationPtr() const; void mark(); }; class wsdl__binding { public: @xsd__NMTOKEN name; @xsd__QName type; @xsd__anyURI type_; // WSDL 2.0 @xsd__QName interface_; // WSDL 2.0 @xsd__boolean whttp__cookies = false; // WSDL 2.0 @xsd__string wsoap__version; // WSDL 2.0 @xsd__anyURI wsoap__protocol; // WSDL 2.0 @xsd__anyURI wsoap__mepDefault; // WSDL 2.0 @xsd__string whttp__methodDefault; // WSDL 2.0 xsd__string documentation; // ? std::vector wsp__Policy_; // * std::vector wsp__PolicyReference_;// * soap__binding *soap__binding_; // ? http__binding *http__binding_; // ? std::vector wsoap__module_; // * WSDL 2.0 std::vector fault; // * WSDL 2.0 std::vector operation; // * private: wsdl__portType *portTypeRef; // traverse() finds portType/interface public: wsdl__binding(); int traverse(wsdl__definitions&); void portTypePtr(wsdl__portType*); wsdl__portType *portTypePtr() const; void mark(); }; class wsdl__port // ... and WSDL 2.0 endpoint { public: @xsd__NMTOKEN name; @xsd__QName binding; @xsd__anyURI address; // WSDL 2.0 @xsd__NMTOKEN whttp__authenticationScheme; // WSDL 2.0 @xsd__NMTOKEN whttp__authenticationRealm; // WSDL 2.0 xsd__string documentation; // ? wsp__Policy *wsp__Policy_; // ? wsp__PolicyReference *wsp__PolicyReference_; // ? wsa__EndpointReferenceType *wsa__EndpointReference;// ? xsd__string *wsaw__UsingAddressing; // ? soap__address *soap__address_; // ? http__address *http__address_; // ? private: wsdl__binding *bindingRef; // traverse() finds binding public: wsdl__port(); int traverse(wsdl__definitions&); void bindingPtr(wsdl__binding*); wsdl__binding *bindingPtr() const; }; class wsdl__service { public: @xsd__NMTOKEN name; @xsd__QName interface_; // WSDL 2.0 xsd__string documentation; // ? std::vector wsp__Policy_; // * std::vector wsp__PolicyReference_;// * std::vector port; // * WSDL 1.1 std::vector endpoint; // * WSDL 2.0 public: int traverse(wsdl__definitions&); }; class wsdl__definitions { public: @xsd__NMTOKEN name; @xsd__anyURI targetNamespace = ""; @xsd__NMTOKEN version; std::vector import; // * xsd__string documentation; // ? wsdl__types *types; // ? std::vector message; // * std::vector portType; // * WSDL 1.1 std::vector interface_; // * WSDL 2.0 std::vector binding; // * std::vector service; // * xsd__string wsp__UsingPolicy; // ? WS-Policy 1.2/1.5 std::vector wsp__Policy_; // * WS-Policy 1.2/1.5 std::vector plnk__partnerLinkType; // * BPEL 2.0 std::vector vprop__property; // * BPEL 2.0 std::vector vprop__propertyAlias; // * BPEL 2.0 std::vector gwsdl__portType_; // * struct soap *soap; private: bool soap12; bool updated; char* location; int redirs; MapOfStringToString builtinTypeMap; SetOfString builtinTypeSet; SetOfString builtinElementSet; SetOfString builtinAttributeSet; wadl__application *appRef; bool used; public: wsdl__definitions(); wsdl__definitions(struct soap*); wsdl__definitions(struct soap*, const char*, const char*, const char*); virtual ~wsdl__definitions(); int get(struct soap*); // getter is triggered after parsing int preprocess(); int traverse(); int read(int, char**); int read(const char*, const char*, const char*); const char* sourceLocation(); char* absoluteLocation(const char *loc) const; int error(); bool is_updated(); void print_fault(); void builtinType(const char*); void builtinTypes(const SetOfString&); void builtinTypeDerivation(xs__schema&, const char*, const char*); void builtinTypeDerivations(const MapOfStringToString&); void builtinElement(const char*); void builtinElements(const SetOfString&); void builtinAttribute(const char*); void builtinAttributes(const SetOfString&); const SetOfString& builtinTypes() const; const MapOfStringToString& builtinTypeDerivations() const; const SetOfString& builtinElements() const; const SetOfString& builtinAttributes() const; void appPtr(wadl__application*); wadl__application* appPtr() const; void mark(); friend std::ostream& operator<<(std::ostream&, const wsdl__definitions&); friend std::istream& operator>>(std::istream&, wsdl__definitions&); }; extern std::ostream &operator<<(std::ostream &o, const wsdl__definitions &e); extern std::istream &operator>>(std::istream &i, wsdl__definitions &e); gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/soap.h0000644000175000017500000000775713525245163022106 0ustar ellertellert/* soap.h WSDL/SOAP binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap soap schema documentation: WSDL 1.1 SOAP binding schema //gsoap soap schema namespace: http://schemas.xmlsoap.org/wsdl/soap/ //gsoap soap schema elementForm: qualified //gsoap soap schema attributeForm: unqualified //gsoap wsoap schema documentation: WSDL 2.0 SOAP binding schema //gsoap wsoap schema namespace: http://www.w3.org/ns/wsdl/soap //gsoap wsoap schema elementForm: qualified //gsoap wsoap schema attributeForm: unqualified #import "imports.h" class wsdl__definitions; // forward declaration class wsdl__message; // forward declaration class wsdl__part; // forward declaration enum soap__styleChoice { rpc, document }; class soap__binding { public: @xsd__anyURI transport; @enum soap__styleChoice *style; }; class soap__operation { public: @xsd__anyURI soapAction; @xsd__boolean soapActionRequired = true; @enum soap__styleChoice *style; }; enum soap__useChoice { literal, encoded }; class soap__body { public: @xsd__anyURI encodingStyle; @xsd__NMTOKENS parts; @enum soap__useChoice use; @xsd__anyURI namespace_; }; class soap__fault { public: @xsd__NMTOKEN name; @xsd__anyURI encodingStyle; @enum soap__useChoice use; @xsd__anyURI namespace_; }; class soap__headerfault { public: @xsd__QName message; @xsd__NMTOKEN part; @enum soap__useChoice use; @xsd__anyURI encodingStyle; @xsd__anyURI namespace_; private: wsdl__message *messageRef; wsdl__part *partRef; public: int traverse(wsdl__definitions&); void messagePtr(wsdl__message*); void partPtr(wsdl__part*); wsdl__message *messagePtr() const; wsdl__part *partPtr() const; }; class soap__header { public: @xsd__QName message; @xsd__NMTOKEN part; @enum soap__useChoice use; @xsd__anyURI encodingStyle; @xsd__anyURI namespace_; std::vector headerfault; // * private: wsdl__message *messageRef; wsdl__part *partRef; public: int traverse(wsdl__definitions&); void messagePtr(wsdl__message*); void partPtr(wsdl__part*); wsdl__message *messagePtr() const; wsdl__part *partPtr() const; }; class soap__address { public: @xsd__anyURI location; }; class wsoap__module { public: @xsd__anyURI ref; @xsd__boolean required = false; }; class wsoap__header { public: @xsd__QName element; @xsd__boolean mustUnderstand_ = false; @xsd__boolean required = false; private: xs__element *elementRef; public: int traverse(wsdl__definitions&); void elementPtr(xs__element*); xs__element *elementPtr() const; void mark(); }; gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/schema.h0000644000175000017500000007020013525245163022363 0ustar ellertellert/* schema.h schema of XSD schemas 1.0 and 1.1 -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap xs schema documentation: XSD binding schema //gsoap xs schema namespace: http://www.w3.org/2001/XMLSchema //gsoap xs schema elementForm: qualified //gsoap xs schema attributeForm: unqualified /* For the wsdl:arrayType attribute to support old style SOAP arrays: */ //gsoap wsdl schema namespace: http://schemas.xmlsoap.org/wsdl/ #import "imports.h" class xs__schema; // forward declaration class xs__simpleType; // forward declaration class xs__complexType; // forward declaration class xs__extension; // forward declaration class xs__restriction; // forward declaration class xs__seqchoice; // forward declaration class xs__group; // forward declaration class xs__list; // forward declaration class xs__union; // forward declaration class xs__annotation { public: std::vector documentation; }; class xs__assert { public: @xsd__string test; @xsd__anyURI xpathDefaultNamespace; xs__annotation *annotation; }; class xs__alternative { public: @xsd__string test; @xsd__QName type; @xsd__anyURI xpathDefaultNamespace; xs__annotation *annotation; }; enum xs__formChoice { unqualified, qualified }; class xs__element { public: @xsd__NCName name; @xsd__QName ref; @xsd__QName type; @xsd__string default_; @xsd__QName default__; // also get QName value if element type is QName @xsd__string fixed; @xsd__QName fixed_; // also get QName value if element type is QName @enum xs__formChoice *form; @xsd__boolean nillable = false; @xsd__boolean abstract = false; @xsd__QName substitutionGroup; @xsd__token minOccurs; // xsd:nonNegativeInteger @xsd__token maxOccurs; // xsd:nonNegativeInteger|unbounded @xsd__anyURI targetNamespace; // XSD 1.1 @xsd__string xmime__expectedContentTypes; xs__annotation *annotation; xs__simpleType *simpleType; // choice xs__complexType *complexType; // choice std::vector alternative; // XSD 1.1 (unused) xsd__string unique; // unused private: xs__schema *schemaRef; // schema to which this belongs xs__element *elementRef; // traverse() finds ref xs__simpleType *simpleTypeRef; // traverse() finds type or = simpleType above xs__complexType *complexTypeRef; // traverse() finds type or = complexType above std::vector substitutions; // traverse() finds substitutionGroup elements bool used; public: xs__element(); int traverse(xs__schema&); void schemaPtr(xs__schema*); void elementPtr(xs__element*); void simpleTypePtr(xs__simpleType*); void complexTypePtr(xs__complexType*); xs__schema *schemaPtr() const; xs__element *elementPtr() const; xs__simpleType *simpleTypePtr() const; xs__complexType *complexTypePtr() const; const std::vector *substitutionsPtr() const; void mark(); bool is_used() const; }; enum xs__attribute_use { optional, prohibited, required, default_, fixed_ }; class xs__attribute { public: @xsd__NCName name; @xsd__QName ref; @xsd__QName type; @enum xs__attribute_use use = optional; @xsd__string default_; @xsd__QName default__; // also get QName value if attribute type is QName @xsd__string fixed; @xsd__QName fixed_; // also get QName value if attribute type is QName @enum xs__formChoice *form; @xsd__boolean inheritable; // XSD 1.1 (unused) @xsd__anyURI targetNamespace; // XSD 1.1 @xsd__QName wsdl__arrayType; // extensibility attribute added for WSDL parsing xs__annotation *annotation; xs__simpleType *simpleType; private: xs__schema *schemaRef; // schema to which this belongs xs__attribute *attributeRef; // traverse() finds ref xs__simpleType *simpleTypeRef; // traverse() finds type or = simpleType above bool used; public: xs__attribute(); int traverse(xs__schema&); void schemaPtr(xs__schema*); void attributePtr(xs__attribute*); void simpleTypePtr(xs__simpleType*); xs__schema *schemaPtr() const; xs__attribute *attributePtr() const; xs__simpleType *simpleTypePtr() const; void mark(); bool is_used() const; }; class xs__all { public: std::vector element; public: int traverse(xs__schema&); void mark(); }; enum xs__processContents { strict, skip, lax }; typedef char *xs__namespaceList; // "##any" or "##other" or list of URI, "##targetNamespace", "##local" class xs__any { public: @xs__namespaceList namespace_ = "##any"; @enum xs__processContents processContents = strict; @xsd__token minOccurs; // xsd:nonNegativeInteger @xsd__token maxOccurs; // xsd:nonNegativeInteger|unbounded std::vector element; public: int traverse(xs__schema&); void mark(); }; class xs__contents { public: $int __union; union xs__union_content { xs__element *element; xs__group *group; xs__seqchoice *choice; xs__seqchoice *sequence; xs__any *any; } __content; public: int traverse(xs__schema&); void mark(); }; class xs__seqchoice { public: @xsd__token minOccurs; // xsd:nonNegativeInteger @xsd__token maxOccurs; // xsd:nonNegativeInteger|unbounded xs__annotation *annotation; std::vector __contents; private: xs__schema *schemaRef; // schema to which this belongs public: xs__seqchoice(); int traverse(xs__schema&); void schemaPtr(xs__schema*); xs__schema *schemaPtr() const; void mark(); }; class xs__group { public: @xsd__NCName name; @xsd__QName ref; @xsd__token minOccurs; // xsd:nonNegativeInteger @xsd__token maxOccurs; // xsd:nonNegativeInteger|unbounded xs__annotation *annotation; xs__all *all; xs__seqchoice *choice; xs__seqchoice *sequence; private: xs__schema *schemaRef; // schema to which this belongs xs__group *groupRef; // traverse() finds ref bool used; public: xs__group(); int traverse(xs__schema&); void schemaPtr(xs__schema*); void groupPtr(xs__group*); xs__schema *schemaPtr() const; xs__group *groupPtr() const; void mark(); }; class xs__anyAttribute { public: @xs__namespaceList namespace_ = "##any"; @enum xs__processContents processContents = strict; }; class xs__attributeGroup { public: @xsd__NCName name; @xsd__QName ref; xs__annotation *annotation; std::vector attribute; std::vector attributeGroup; xs__anyAttribute *anyAttribute; private: xs__schema *schemaRef; xs__attributeGroup *attributeGroupRef; bool used; public: xs__attributeGroup(); int traverse(xs__schema&); void schemaPtr(xs__schema*); void attributeGroupPtr(xs__attributeGroup*); xs__schema *schemaPtr() const; xs__attributeGroup *attributeGroupPtr() const; void mark(); }; class xs__enumeration { public: @xsd__string value; @xsd__QName value_; // also get QName value if base type is QName xs__annotation *annotation; public: int traverse(xs__schema&); }; class xs__pattern { public: @xsd__string value; public: int traverse(xs__schema&); }; class xs__simpleContent { public: xs__extension *extension; // choice xs__restriction *restriction; // choice public: int traverse(xs__schema&); void mark(); }; class xs__simpleType { public: @xsd__NMTOKEN name; @xsd__string vc__minVersion; // XSD 1.1 (unused) @xsd__string vc__maxVersion; // XSD 1.1 (unused) xs__annotation *annotation; xs__restriction *restriction; // choice xs__list *list; // choice xs__union *union_; // choice private: xs__schema *schemaRef; std::vector complextype_extensions; std::vector extensions; std::vector restrictions; int level; bool used; public: xs__simpleType(); int traverse(xs__schema&); void schemaPtr(xs__schema*); xs__schema *schemaPtr() const; int baseLevel(); void mark(); bool is_used() const; void add_extension(xs__complexType*, xs__schema&, xsd__NCName); void add_restriction(xs__schema&, xsd__NCName); const std::vector& get_extensions() const; const std::vector& get_restrictions() const; }; class xs__extension { public: @xsd__QName base; xs__group *group; xs__all *all; xs__seqchoice *choice; xs__seqchoice *sequence; std::vector attribute; std::vector attributeGroup; xs__anyAttribute *anyAttribute; xs__annotation *annotation; std::vector assert; // XSD 1.1 private: xs__simpleType *simpleTypeRef; // traverse() finds type xs__complexType *complexTypeRef; // traverse() finds type public: xs__extension(); int traverse(xs__schema&); void simpleTypePtr(xs__simpleType*); void complexTypePtr(xs__complexType*); xs__simpleType *simpleTypePtr() const; xs__complexType *complexTypePtr() const; void mark(); }; class xs__length { public: @xsd__string value; @xsd__boolean fixed; xs__annotation *annotation; }; class xs__whiteSpace { public: @xsd__string value; }; class xs__restriction { public: @xsd__QName base; xs__simpleType *simpleType; // used in xs__attributeGroup *attributeGroup; // not used in xs__group *group; // not used in xs__all *all; // not used in xs__seqchoice *choice; // not used in xs__seqchoice *sequence; // not used in std::vector attribute; // not used in xs__anyAttribute *anyAttribute; // not used in std::vector enumeration; std::vector pattern; xs__whiteSpace *whiteSpace; xs__length *length; xs__length *minLength; xs__length *maxLength; xs__length *precision; // 2000 XSD 1.0 xs__length *scale; // 2000 XSD 1.0 xs__length *totalDigits; // 2001 XSD 1.0 xs__length *fractionDigits; // 2001 XSD 1.0 xs__length *minInclusive; xs__length *maxInclusive; xs__length *minExclusive; xs__length *maxExclusive; xs__annotation *annotation; std::vector assert; // XSD 1.1 xs__assert *assertion; // XSD 1.1 private: xs__simpleType *simpleTypeRef; // traverse() finds type xs__complexType *complexTypeRef; // traverse() finds type xs__simpleType *simpleArrayTypeRef; // traverse() finds type xs__complexType *complexArrayTypeRef; // traverse() finds type public: xs__restriction(); int traverse(xs__schema&); void simpleTypePtr(xs__simpleType*); void complexTypePtr(xs__complexType*); xs__simpleType *simpleTypePtr() const; xs__complexType *complexTypePtr() const; xs__simpleType *simpleArrayTypePtr() const; xs__complexType *complexArrayTypePtr() const; void mark(); }; class xs__list { public: @xsd__QName itemType; xs__restriction *restriction; // choice std::vector simpleType; // choice private: xs__simpleType *itemTypeRef; public: xs__list(); int traverse(xs__schema&); void itemTypePtr(xs__simpleType*); xs__simpleType *itemTypePtr() const; void mark(); }; class xs__union { public: @xsd__NMTOKENS memberTypes; // check if NMTOKENS is ok??? std::vector simpleType; public: int traverse(xs__schema&); void mark(); }; class xs__complexContent { public: @xsd__boolean mixed = false; xs__extension *extension; xs__restriction *restriction; xs__annotation *annotation; public: int traverse(xs__schema&); void mark(); }; class xs__complexType { public: @xsd__NMTOKEN name; @xsd__boolean abstract = false; @xsd__boolean mixed = false; @xsd__boolean defaultAttributesApply = true; // XSD 1.1 @xsd__string vc__minVersion; // XSD 1.1 (unused) @xsd__string vc__maxVersion; // XSD 1.1 (unused) xs__annotation *annotation; xs__simpleContent *simpleContent; xs__complexContent *complexContent; xs__all *all; xs__seqchoice *choice; xs__seqchoice *sequence; xs__group *group; xs__any *any; std::vector attribute; std::vector attributeGroup; xs__anyAttribute *anyAttribute; std::vector assert; // XSD 1.1 private: xs__schema *schemaRef; std::vector complextype_extensions; std::vector extensions; std::vector restrictions; int level; bool used; public: xs__complexType(); int traverse(xs__schema&); void schemaPtr(xs__schema*); xs__schema *schemaPtr() const; int baseLevel(); void mark(); bool is_used() const; void add_extension(xs__complexType*, xs__schema&, xsd__NCName); void add_restriction(xs__schema&, xsd__NCName); const std::vector& get_extensions() const; const std::vector& get_restrictions() const; }; class xs__import { public: @xsd__anyURI namespace_; @xsd__anyURI schemaLocation; @xsd__anyURI location; // work around a Microsoft bug private: xs__schema *schemaRef; // set by WSDL parser or via schemaLocation public: xs__import(); int preprocess(xs__schema&); int traverse(xs__schema&); void schemaPtr(xs__schema*); xs__schema *schemaPtr() const; void mark(); }; class xs__include { public: @xsd__anyURI schemaLocation; private: xs__schema *schemaRef; public: xs__include(); int preprocess(xs__schema&); int traverse(xs__schema&); void schemaPtr(xs__schema*); xs__schema *schemaPtr() const; }; class xs__override { public: @xsd__anyURI schemaLocation; std::vector attribute; std::vector element; std::vector group; std::vector attributeGroup; std::vector simpleType; std::vector complexType; private: xs__schema *schemaRef; public: xs__override(); int preprocess(xs__schema&); int traverse(xs__schema&); void schemaPtr(xs__schema*); xs__schema *schemaPtr() const; }; class xs__redefine { public: @xsd__anyURI schemaLocation; std::vector group; std::vector attributeGroup; std::vector simpleType; std::vector complexType; private: xs__schema *schemaRef; public: xs__redefine(); int preprocess(xs__schema&); int traverse(xs__schema&); void schemaPtr(xs__schema*); xs__schema *schemaPtr() const; }; class xs__schema { public: @xsd__anyURI targetNamespace = ""; @xsd__string version; @xsd__NCName defaultAttributes; // XSD 1.1 @enum xs__formChoice attributeFormDefault = unqualified; @enum xs__formChoice elementFormDefault = unqualified; xs__annotation *annotation; std::vector include; std::vector override_; std::vector redefine; std::vector import; std::vector attribute; std::vector element; std::vector group; std::vector attributeGroup; std::vector simpleType; std::vector complexType; struct soap *soap; private: xs__attributeGroup *attributeGroupRef; // defaultAttributes group bool updated; char* location; int redirs; MapOfStringToString builtinTypeMap; SetOfString builtinTypeSet; SetOfString builtinElementSet; SetOfString builtinAttributeSet; bool used; public: xs__schema(); xs__schema(struct soap*); xs__schema(struct soap*, const char*, const char*, const char*); virtual ~xs__schema(); int get(struct soap*); // getter is triggered after parsing int preprocess(); int insert(xs__schema&); int traverse(); int read(const char*, const char*, const char*); void sourceLocation(const char*); const char* sourceLocation(); char* absoluteLocation(const char*) const; xs__attributeGroup *attributeGroupPtr() const; // defaultAttributes group int error(); void print_fault(); void builtinType(const char*); void builtinTypeDerivation(xs__schema&, const char*, const char*); void builtinElement(const char*); void builtinAttribute(const char*); const SetOfString& builtinTypes() const; const MapOfStringToString& builtinTypeDerivations() const; const SetOfString& builtinElements() const; const SetOfString& builtinAttributes() const; bool empty() const; void mark(); friend std::ostream& operator<<(std::ostream&, const xs__schema&); friend std::istream& operator>>(std::istream&, xs__schema&); }; extern std::ostream &operator<<(std::ostream &o, const xs__schema &e); extern std::istream &operator>>(std::istream &i, xs__schema &e); gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/service.cpp0000644000175000017500000065360513525245163023136 0ustar ellertellert/* service.cpp Generate gSOAP service structures from WSDL. -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2018, 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. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "types.h" #include "service.h" #include #define URI_CHAR(c) ((c) > 32 && (c) != '"' && (c) != '<' && (c) != '>' && (c) != '\\' && (c) != '^' && (c) != '`' && (c) != '|' && (c) <= '~') static const char *urienc(struct soap*, const char*); static bool imported(const char *tag); static void comment(const char *start, const char *middle, const char *end, const char *text); static void page(const char *page, const char *title, const char *text); static void section(const char *section, const char *title, const char *text); static void banner(const char*, const char* = NULL); static void ident(); static void gen_policy(Service&, const std::vector&, const char*, Types&); static void gen_policy_enablers(const Service&); static void gen_plnk(const Service& service); static void gen_vprop(const wsdl__definitions& definitions, Types&); //////////////////////////////////////////////////////////////////////////////// // // Definitions methods // //////////////////////////////////////////////////////////////////////////////// Definitions::Definitions() { } void Definitions::collect(const wsdl__definitions& definitions) { // Collect information: analyze WSDL definitions and imported definitions analyze(definitions); for (std::vector::const_iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) if ((*import).definitionsPtr()) analyze(*(*import).definitionsPtr()); } void Definitions::analyze(const wsdl__definitions& definitions) { // Analyze WADL application linked within empty WSDL definitions analyze_application(definitions); // Analyze WSDL and build Service information binding_count = 0; // Determine number of relevant service bindings (service prefix option only) for (std::vector::const_iterator i = definitions.binding.begin(); i != definitions.binding.end(); ++i) { for (std::vector::const_iterator j = (*i).operation.begin(); j != (*i).operation.end(); ++j) { if ((*j).operationPtr()) { binding_count++; break; } } } if (vflag && definitions.name) fprintf(stderr, "\nAnalyzing \"%s\" which has %d service binding(s)\n", definitions.name, binding_count); if (binding_count == 0 && definitions.import.empty() && definitions.name && (!definitions.portType.empty() || !definitions.interface_.empty())) fprintf(stderr, "\nWarning: WSDL \"%s\" has no bindings to implement operations\n", definitions.name); else if (binding_count > 1 && !service_prefix) { // This puts all operations under a single binding fprintf(stderr, "\nWarning: %d service bindings found, but collected as one service (use option -Nname to produce a separate service for each binding)\n", binding_count); } // Analyze and collect service data for (std::vector::const_iterator binding = definitions.binding.begin(); binding != definitions.binding.end(); ++binding) { // /definitions/binding/documentation const char *binding_documentation = (*binding).documentation; // /definitions/binding/soap:binding soap__binding *soap__binding_ = (*binding).soap__binding_; // /definitions/binding/soap:binding/@transport const char *soap__binding_transport = NULL; int version = 0; if (soap__binding_) soap__binding_transport = soap__binding_->transport; else if ((*binding).wsoap__version && strlen((*binding).wsoap__version) > 2) version = (*binding).wsoap__version[2]-'0'; // WSDL 2.0 else if (!(*binding).http__binding_) version = 2; // assume WSDL 2.0 if (version == 2) soap12 = true; // /definitions/binding/@soap:protocol if ((*binding).wsoap__protocol) soap__binding_transport = (*binding).wsoap__protocol; // /definitions/binding/@name const char *binding_name = ""; if ((*binding).name) binding_name = (*binding).name; else if ((*binding).portTypePtr() && (*binding).portTypePtr()->name) { size_t l = strlen((*binding).portTypePtr()->name); char *s = (char*)soap_malloc(definitions.soap, l + 8); if (s) { soap_strcpy(s, l + 8, (*binding).portTypePtr()->name); soap_strcpy(s + l, 8, "Binding"); binding_name = s; } } if (!Rflag && (!soap__binding_transport || (strcmp(soap__binding_transport+strlen(soap__binding_transport)-4, "http") && strcmp(soap__binding_transport+strlen(soap__binding_transport)-5, "HTTP/")))) { // -R not set: skip WSDL REST bindings if (!Wflag) fprintf(stderr, "\nWarning: ignoring RESTful binding \"%s\" because of non-SOAP transport \"%s\" (use option -R to enable REST)\n", binding_name, soap__binding_transport ? soap__binding_transport : ""); } else { // /definitions/binding/@type // TODO: need to find the Policy of portType, though it is never used...? // const wsp__Policy *portType_policy = NULL; // /definitions/binding/wsp:Policy and wsp:PolicyReference /* const wsp__Policy *binding_policy = NULL; if ((*binding).wsp__Policy_) binding_policy = (*binding).wsp__Policy_; if ((*binding).wsp__PolicyReference_) binding_policy = (*binding).wsp__PolicyReference_->policyPtr(); */ // /definitions/binding/http:binding http__binding *http__binding_ = (*binding).http__binding_; const char *http__binding_verb = NULL; if (http__binding_) http__binding_verb = http__binding_->verb; // HTTP POST and GET else if ((*binding).whttp__methodDefault) http__binding_verb = (*binding).whttp__methodDefault; // HTTP POST and GET // /definitions/binding/soap:binding/@style soap__styleChoice soap__binding_style = document; if (soap__binding_ && soap__binding_->style) soap__binding_style = *soap__binding_->style; // /definitions/binding/operation* for (std::vector::const_iterator operation = (*binding).operation.begin(); operation != (*binding).operation.end(); ++operation) { // /definitions/portType/operation/ associated with /definitions/binding/operation wsdl__operation *wsdl__operation_ = (*operation).operationPtr(); // /definitions/binding/operation/soap:operation soap__operation *soap__operation_ = (*operation).soap__operation_; // /definitions/binding/operation/soap:operation/@style soap__styleChoice soap__operation_style = soap__binding_style; if (soap__operation_ && soap__operation_->style) soap__operation_style = *soap__operation_->style; // /definitions/binding/@wsoap:mepDefault const char *soap__operation_mep = (*binding).wsoap__mepDefault; // /definitions/binding/operation/@wsoap:mep if ((*operation).wsoap__mep) soap__operation_mep = (*operation).wsoap__mep; // /definitions/binding/operation/@whttp:method const char *http_method = http__binding_verb; if ((*operation).whttp__method) http_method = (*operation).whttp__method; // /definitions/binding/operation/@wsoap:action const char *soap__operation_action = NULL; if ((*operation).wsoap__action) soap__operation_action = (*operation).wsoap__action; // /definitions/binding/operation/http:operation http__operation *http__operation_ = (*operation).http__operation_; // /definitions/binding/wsp:Policy and wsp:PolicyReference const wsp__Policy *ext_operation_policy = NULL; if ((*operation).wsp__Policy_) ext_operation_policy = (*operation).wsp__Policy_; if ((*operation).wsp__PolicyReference_) ext_operation_policy = (*operation).wsp__PolicyReference_->policyPtr(); // /definitions/binding/operation/http:operation/@location const char *http__operation_location = NULL; if (http__operation_) http__operation_location = http__operation_->location; else if ((*operation).whttp__location) http__operation_location = (*operation).whttp__location; // /definitions/binding/operation/input and output wsdl__ext_ioput *ext_input, *ext_output; // /definitions/portType/operation if (wsdl__operation_ && wsdl__operation_->name) { bool reversed = false; wsdl__ioput *input = NULL; wsdl__ioput *output = NULL; // normalize input/output order for solicit-response operations if (wsdl__operation_->__union1 == SOAP_UNION_wsdl__union_ioput_input) input = wsdl__operation_->__ioput1.input; else if (wsdl__operation_->__union1 == SOAP_UNION_wsdl__union_ioput_output) { reversed = true; input = wsdl__operation_->__ioput1.output; } if (wsdl__operation_->__union2 == SOAP_UNION_wsdl__union_ioput_input) { reversed = true; output = wsdl__operation_->__ioput2.input; } else if (wsdl__operation_->__union2 == SOAP_UNION_wsdl__union_ioput_output) output = wsdl__operation_->__ioput2.output; else // one input only or one output only (or none) { reversed = false; input = NULL; output = NULL; if (wsdl__operation_->__union1 == SOAP_UNION_wsdl__union_ioput_input) input = wsdl__operation_->__ioput1.input; else if (wsdl__operation_->__union1 == SOAP_UNION_wsdl__union_ioput_output) output = wsdl__operation_->__ioput1.output; } if (!reversed) { ext_input = (*operation).input; ext_output = (*operation).output; } else { ext_input = (*operation).output; ext_output = (*operation).input; } if ((http_method && !strcmp(http_method, "GET")) || (wsdl__operation_->pattern && !strstr(wsdl__operation_->pattern, "in"))) input = NULL; if (wsdl__operation_->pattern && !strstr(wsdl__operation_->pattern, "out")) output = NULL; if (wsdl__operation_->pattern) // WSDL 2.0 { soap__operation_style = document; if (wsdl__operation_->style && !strcmp(wsdl__operation_->style, "http://www.w3.org/ns/wsdl/rpc")) soap__operation_style = rpc; else if ((*binding).portTypePtr() && (*binding).portTypePtr()->styleDefault && !strcmp( (*binding).portTypePtr()->styleDefault, "http://www.w3.org/ns/wsdl/rpc")) soap__operation_style = rpc; } // /definitions/binding/wsp:Policy and wsp:PolicyReference const wsp__Policy *operation_policy = NULL; if (wsdl__operation_->wsp__Policy_) operation_policy = wsdl__operation_->wsp__Policy_; if (wsdl__operation_->wsp__PolicyReference_) operation_policy = wsdl__operation_->wsp__PolicyReference_->policyPtr(); if (!Rflag && (http__operation_ || http__operation_location)) { // skip WSDL REST HTTP operations if (!Wflag) fprintf(stderr, "\nWarning: ignoring RESTful operation \"%s\" in binding \"%s\" (use option -R to enable REST)\n", wsdl__operation_->name, binding_name); } else if (input) { soap__body *input_body = NULL; mime__mimeXml *input_mime = NULL; mime__content *input_mime_content = NULL; if (!reversed && ext_input) { input_body = ext_input->soap__body_; input_mime = ext_input->mime__mimeXml_; input_mime_content = ext_input->mime__content_; if (ext_input->mime__multipartRelated_) { for (std::vector::const_iterator part = ext_input->mime__multipartRelated_->part.begin(); part != ext_input->mime__multipartRelated_->part.end(); ++part) if ((*part).soap__body_) { input_body = (*part).soap__body_; break; } } } else if (ext_output) { input_body = ext_output->soap__body_; input_mime = ext_output->mime__mimeXml_; input_mime_content = ext_output->mime__content_; if (ext_output->mime__multipartRelated_) { for (std::vector::const_iterator part = ext_output->mime__multipartRelated_->part.begin(); part != ext_output->mime__multipartRelated_->part.end(); ++part) if ((*part).soap__body_) { input_body = (*part).soap__body_; break; } } } if (wsdl__operation_->style && !strcmp(wsdl__operation_->style, "http://www.w3.org/ns/wsdl/style/iri")) { input_mime_content = soap_new_mime__content(definitions.soap); input_mime_content->soap_default(definitions.soap); input_mime_content->type = (char*)"application/x-www-form-urlencoded"; } // MUST have an input binding, otherwise can't generate a service operation if (input_body || input_mime || input_mime_content || input->element) { char *URI; if (input_body && soap__operation_style == rpc) URI = input_body->namespace_; else if ((binding_count == 1 || !service_prefix) && definitions.targetNamespace && *definitions.targetNamespace) URI = definitions.targetNamespace; else if ((binding_count == 1 || !service_prefix) && definitions.name && *definitions.name) URI = definitions.name; else { // multiple service bindings are used, each needs a unique new URI size_t l = strlen(definitions.targetNamespace) + strlen(binding_name); URI = (char*)soap_malloc(definitions.soap, l + 2); if (URI) { soap_strcpy(URI, l + 2, definitions.targetNamespace); size_t n = strlen(URI); if (n > 0 && URI[n-1] != '/') { soap_strcpy(URI + n, l + 2 - n, "/"); ++n; } soap_strcpy(URI + n, l + 2 - n, binding_name); } } const char *prefix = types.nsprefix(service_prefix, URI); const char *name = types.aname(NULL, NULL, binding_name); // name of service is binding name Service *service = services[prefix]; if (!service) { service = services[prefix] = new Service(); service->prefix = prefix; service->URI = urienc(definitions.soap, URI); service->name = name; service->transport = soap__binding_transport; if ((*binding).portTypePtr() && (*binding).portTypePtr()->name) service->type = types.aname(NULL, NULL, (*binding).portTypePtr()->name); else service->type = NULL; // collect faults (TODO: this is not used anywhere) for (std::vector::const_iterator fault = (*binding).fault.begin(); fault != (*binding).fault.end(); ++fault) { Message *f = analyze_fault(definitions, service, *fault); if (f) service->fault[f->name] = f; } // collect policies for the bindings for (std::vector::const_iterator p = (*binding).wsp__Policy_.begin(); p != (*binding).wsp__Policy_.end(); ++p) service->policy.push_back(&(*p)); for (std::vector::const_iterator r = (*binding).wsp__PolicyReference_.begin(); r != (*binding).wsp__PolicyReference_.end(); ++r) service->policy.push_back((*r).policyPtr()); // collect policies for the service endpoints for (std::vector::const_iterator s = definitions.service.begin(); s != definitions.service.end(); ++s) { for (std::vector::const_iterator p = (*s).wsp__Policy_.begin(); p != (*s).wsp__Policy_.end(); ++p) service->policy.push_back(&(*p)); for (std::vector::const_iterator r = (*s).wsp__PolicyReference_.begin(); r != (*s).wsp__PolicyReference_.end(); ++r) service->policy.push_back((*r).policyPtr()); } // collect BPEL 2.0 partner link roles for (std::vector::const_iterator p = definitions.plnk__partnerLinkType.begin(); p != definitions.plnk__partnerLinkType.end(); ++p) { for (std::vector::const_iterator r = (*p).role.begin(); r != (*p).role.end(); ++r) { if ((binding_count > 1 && !service_prefix) || (*r).portTypePtr() == (*binding).portTypePtr()) service->role.push_back(&(*r)); } } } for (std::vector::const_iterator s = definitions.service.begin(); s != definitions.service.end(); ++s) { for (std::vector::const_iterator port = (*s).port.begin(); port != (*s).port.end(); ++port) { if ((*port).bindingPtr() == &(*binding)) { if ((*port).soap__address_ && (*port).soap__address_->location) service->location.insert(urienc(definitions.soap, (*port).soap__address_->location)); if ((*port).wsa__EndpointReference && (*port).wsa__EndpointReference->Address) service->location.insert(urienc(definitions.soap, (*port).wsa__EndpointReference->Address)); if ((*port).http__address_ && (*port).http__address_->location) service->location.insert(urienc(definitions.soap, (*port).http__address_->location)); if ((*port).wsaw__UsingAddressing) service->add_import("wsa5.h"); // collect service documentation if ((*s).documentation) service->service_documentation[(*service).name] = (*s).documentation; if ((*port).documentation && (*port).name) service->port_documentation[(*port).name] = (*port).documentation; if (binding_documentation) service->binding_documentation[binding_name] = binding_documentation; // collect policies for the service and endpoints if ((*port).wsp__Policy_) service->policy.push_back((*port).wsp__Policy_); if ((*port).wsp__PolicyReference_ && (*port).wsp__PolicyReference_->policyPtr()) service->policy.push_back((*port).wsp__PolicyReference_->policyPtr()); } } for (std::vector::const_iterator endpoint = (*s).endpoint.begin(); endpoint != (*s).endpoint.end(); ++endpoint) { if ((*endpoint).bindingPtr() == &(*binding)) { if ((*endpoint).address) service->location.insert(urienc(definitions.soap, (*endpoint).address)); if ((*endpoint).wsa__EndpointReference && (*endpoint).wsa__EndpointReference->Address) service->location.insert(urienc(definitions.soap, (*endpoint).wsa__EndpointReference->Address)); if ((*endpoint).http__address_ && (*endpoint).http__address_->location) service->location.insert(urienc(definitions.soap, (*endpoint).http__address_->location)); // TODO: locations need auth // service->auth_scheme = (*endpoint).whttp__authenticationScheme; // service->auth_realm = (*endpoint).whttp__authenticationRealm; // collect service documentation if ((*s).documentation) service->service_documentation[(*service).name] = (*s).documentation; if ((*endpoint).documentation && (*endpoint).name) service->port_documentation[(*endpoint).name] = (*endpoint).documentation; if (binding_documentation) service->binding_documentation[binding_name] = binding_documentation; // collect policies for the service and endpoints if ((*endpoint).wsp__Policy_) service->policy.push_back((*endpoint).wsp__Policy_); if ((*endpoint).wsp__PolicyReference_ && (*endpoint).wsp__PolicyReference_->policyPtr()) service->policy.push_back((*endpoint).wsp__PolicyReference_->policyPtr()); } } } Operation *op = new Operation(); op->operation = wsdl__operation_; op->name = types.aname(NULL, NULL, wsdl__operation_->name); op->prefix = prefix; op->URI = urienc(definitions.soap, URI); op->style = soap__operation_style; op->mep = soap__operation_mep; op->is_rest = false; if (soap__binding_transport && (!strcmp(soap__binding_transport+strlen(soap__binding_transport)-4, "http") || !strcmp(soap__binding_transport+strlen(soap__binding_transport)-5, "HTTP/"))) { if ((op->mep && strstr(op->mep, "soap-response")) || (http_method && !strcmp(http_method, "GET"))) op->protocol = "SOAP-GET"; else if (version == 1) op->protocol = "SOAP1.1"; else if (version == 2) op->protocol = "SOAP1.2"; else op->protocol = "SOAP"; } else { op->is_rest = true; if (http_method) op->protocol = http_method; else op->protocol = "HTTP"; } op->documentation = wsdl__operation_->documentation; op->operation_documentation = (*operation).documentation; op->parameterOrder = wsdl__operation_->parameterOrder; if (http__operation_location) op->action = http__operation_location; // TODO: for now, store HTTP location in action else { op->action = soap__operation_action; if ((*operation).soap__operation_) { if ((*operation).soap__operation_->soapActionRequired) op->action = (*operation).soap__operation_->soapAction; } else if (version != 2) op->action = ""; } if (operation_policy) op->policy.push_back(operation_policy); if (ext_operation_policy) op->policy.push_back(ext_operation_policy); op->input = new Message(); op->input->name = wsdl__operation_->name; if (input_body && soap__operation_style == rpc && !input_body->namespace_) { op->input->URI = ""; fprintf(stderr, "\nError: no soap:body namespace attribute\n"); } else if (input_body) op->input->URI = urienc(definitions.soap, input_body->namespace_); else op->input->URI = service->URI; op->input->style = soap__operation_style; if (input_body) { op->input->use = input_body->use; op->input->encodingStyle = input_body->encodingStyle; } if (input->wsa__Action) op->input->action = input->wsa__Action; else if (input->wsam__Action) op->input->action = input->wsam__Action; else if (op->action) op->input->action = op->action; else if (definitions.targetNamespace && (*binding).portTypePtr() && (*binding).portTypePtr()->name) { const char *name = input->name ? input->name : op->name; size_t l = strlen(definitions.targetNamespace) + strlen((*binding).portTypePtr()->name) + strlen(name); char *tmp = (char*)soap_malloc(definitions.soap, l + 3); if (tmp) { (SOAP_SNPRINTF(tmp, l + 3, l + 2), "%s/%s/%s", definitions.targetNamespace, (*binding).portTypePtr()->name, name); op->input->action = tmp; } } op->input->message = input->messagePtr(); op->input->element = input->elementPtr(); op->input->part = NULL; op->input->mustUnderstand = false; op->input->multipartRelated = NULL; op->input->content = input_mime_content; op->input->body_parts = NULL; op->input->layout = NULL; op->input->ext_documentation = NULL; if (ext_input) { op->input->multipartRelated = ext_input->mime__multipartRelated_; if (ext_input->mime__multipartRelated_ && !ext_input->mime__multipartRelated_->part.empty()) op->input->header = ext_input->mime__multipartRelated_->part.front().soap__header_; else if (!ext_input->soap__header_.empty()) op->input->header = ext_input->soap__header_; else if (!ext_input->wsoap__header_.empty()) op->input->wheader = ext_input->wsoap__header_; if (ext_input->mime__multipartRelated_ && !ext_input->mime__multipartRelated_->part.empty() && ext_input->mime__multipartRelated_->part.front().soap__body_) op->input->body_parts = ext_input->mime__multipartRelated_->part.front().soap__body_->parts; else if (input_body) op->input->body_parts = input_body->parts; if (ext_input->dime__message_) op->input->layout = ext_input->dime__message_->layout; else op->input->layout = NULL; op->input->ext_documentation = ext_input->documentation; } op->input->documentation = input->documentation; // collect input message policies if (op->input->message) { for (std::vector::const_iterator p = op->input->message->wsp__Policy_.begin(); p != op->input->message->wsp__Policy_.end(); ++p) op->input->policy.push_back(&(*p)); for (std::vector::const_iterator r = op->input->message->wsp__PolicyReference_.begin(); r != op->input->message->wsp__PolicyReference_.end(); ++r) op->input->policy.push_back((*r).policyPtr()); } if (input->wsp__Policy_) op->input->policy.push_back(input->wsp__Policy_); if (input->wsp__PolicyReference_ && input->wsp__PolicyReference_->policyPtr()) op->input->policy.push_back(input->wsp__PolicyReference_->policyPtr()); if (ext_input) { if (ext_input->wsp__Policy_) op->input->policy.push_back(ext_input->wsp__Policy_); if (ext_input->wsp__PolicyReference_ && ext_input->wsp__PolicyReference_->policyPtr()) op->input->policy.push_back(ext_input->wsp__PolicyReference_->policyPtr()); } if (soap__operation_style == document) op->input_name = types.oname("__", op->URI, op->input->name); else op->input_name = types.oname(NULL, op->input->URI, op->input->name); if (output) { soap__body *output_body = NULL; mime__mimeXml *output_mime = NULL; mime__content *output_mime_content = NULL; if (ext_output) { output_body = ext_output->soap__body_; output_mime = ext_output->mime__mimeXml_; output_mime_content = ext_output->mime__content_; if (ext_output->mime__multipartRelated_) { for (std::vector::const_iterator part = ext_output->mime__multipartRelated_->part.begin(); part != ext_output->mime__multipartRelated_->part.end(); ++part) if ((*part).soap__body_) { output_body = (*part).soap__body_; break; } } } if (ext_output && ext_output->mime__content_) { op->output = new Message(); op->output->name = NULL; op->output->URI = NULL; op->output->style = soap__operation_style; op->output->use = literal; op->output->encodingStyle = NULL; op->output->action = NULL; op->output->body_parts = NULL; op->output->part = NULL; op->output->mustUnderstand = false; op->output->multipartRelated = NULL; op->output->content = output_mime_content; op->output->message = output->messagePtr(); op->output->element = output->elementPtr(); op->output->layout = NULL; } else if (output_body || output_mime || output_mime_content || output->element) { op->output = new Message(); op->output->name = wsdl__operation_->name; // RPC uses operation/@name with suffix 'Response' as set below op->output->style = soap__operation_style; if (output_body) { op->output->use = output_body->use; // the code below is a hack around the RPC encoded response message element tag mismatch with Axis: if (!output_body->namespace_ || output_body->use == encoded) op->output->URI = op->input->URI; // encoded seems (?) to require the request's namespace else op->output->URI = urienc(definitions.soap, output_body->namespace_); op->output->encodingStyle = output_body->encodingStyle; } else op->output->URI = service->URI; if (output->wsa__Action) op->output->action = output->wsa__Action; else if (output->wsam__Action) op->output->action = output->wsam__Action; else if (http__operation_location) op->output->action = NULL; else if (op->action) { size_t l = strlen(op->action); char *tmp = (char*)soap_malloc(definitions.soap, l + 9); if (tmp) { (SOAP_SNPRINTF(tmp, l + 9, l + 8), "%sResponse", op->action); op->output->action = tmp; } } else if (definitions.targetNamespace && (*binding).portTypePtr() && (*binding).portTypePtr()->name) { const char *name = output->name ? output->name : op->name; size_t l = strlen(definitions.targetNamespace) + strlen((*binding).portTypePtr()->name) + strlen(name); char *tmp = (char*)soap_malloc(definitions.soap, l + 11); if (tmp) { (SOAP_SNPRINTF(tmp, l + 11, l + 10), "%s/%s/%s%s", definitions.targetNamespace, (*binding).portTypePtr()->name, name, output->name ? "" : "Response"); op->output->action = tmp; } } op->output->message = output->messagePtr(); op->output->element = output->elementPtr(); op->output->part = NULL; op->output->content = output_mime_content; op->output->body_parts = NULL; op->output->layout = NULL; op->output->ext_documentation = NULL; op->output->mustUnderstand = false; } if (ext_output) { op->output->multipartRelated = ext_output->mime__multipartRelated_; if (ext_output->mime__multipartRelated_ && !ext_output->mime__multipartRelated_->part.empty()) op->output->header = ext_output->mime__multipartRelated_->part.front().soap__header_; else if (!ext_output->soap__header_.empty()) op->output->header = ext_output->soap__header_; else if (!ext_output->wsoap__header_.empty()) op->output->wheader = ext_output->wsoap__header_; if (ext_output->mime__multipartRelated_ && !ext_output->mime__multipartRelated_->part.empty() && ext_output->mime__multipartRelated_->part.front().soap__body_) op->output->body_parts = ext_output->mime__multipartRelated_->part.front().soap__body_->parts; else if (output_body) op->output->body_parts = output_body->parts; if (ext_output->dime__message_) op->output->layout = ext_output->dime__message_->layout; else op->output->layout = NULL; op->output->ext_documentation = ext_output->documentation; } if (op->output->name) { size_t l = strlen(op->output->name); char *s = (char*)soap_malloc(definitions.soap, l + 9); if (s) { (SOAP_SNPRINTF(s, l + 9, l + 8), "%sResponse", op->output->name); if (soap__operation_style == document) op->output_name = types.oname("__", op->URI, s); else op->output_name = types.oname(NULL, op->output->URI, s); } } op->output->documentation = output->documentation; // collect output message policies if (op->output->message) { for (std::vector::const_iterator p = op->output->message->wsp__Policy_.begin(); p != op->output->message->wsp__Policy_.end(); ++p) op->output->policy.push_back(&(*p)); for (std::vector::const_iterator r = op->output->message->wsp__PolicyReference_.begin(); r != op->output->message->wsp__PolicyReference_.end(); ++r) op->output->policy.push_back((*r).policyPtr()); } if (output->wsp__Policy_) op->output->policy.push_back(output->wsp__Policy_); if (output->wsp__PolicyReference_ && output->wsp__PolicyReference_->policyPtr()) op->output->policy.push_back(output->wsp__PolicyReference_->policyPtr()); if (ext_output) { if (ext_output->wsp__Policy_) op->output->policy.push_back(ext_output->wsp__Policy_); if (ext_output->wsp__PolicyReference_ && ext_output->wsp__PolicyReference_->policyPtr()) op->output->policy.push_back(ext_output->wsp__PolicyReference_->policyPtr()); } } else { op->output_name = NULL; op->output = NULL; } analyze_headers(definitions, service, ext_input, ext_output); analyze_faults(definitions, service, op, operation); service->operation.push_back(op); } else fprintf(stderr, "\nError: no wsdl:definitions/binding/operation/input\n"); } else if (output) { // This part is similar to the previous clause, limited to one-way output operations soap__body *output_body = NULL; mime__mimeXml *output_mime = NULL; mime__content *output_mime_content = NULL; if (!reversed && ext_output) { output_body = ext_output->soap__body_; output_mime = ext_output->mime__mimeXml_; output_mime_content = ext_output->mime__content_; if (ext_output->mime__multipartRelated_) { for (std::vector::const_iterator part = ext_output->mime__multipartRelated_->part.begin(); part != ext_output->mime__multipartRelated_->part.end(); ++part) if ((*part).soap__body_) { output_body = (*part).soap__body_; break; } } } else if (ext_input) { output_body = ext_input->soap__body_; output_mime = ext_input->mime__mimeXml_; output_mime_content = ext_input->mime__content_; if (ext_input->mime__multipartRelated_) { for (std::vector::const_iterator part = ext_input->mime__multipartRelated_->part.begin(); part != ext_input->mime__multipartRelated_->part.end(); ++part) if ((*part).soap__body_) { output_body = (*part).soap__body_; break; } } } if (wsdl__operation_->style && !strcmp(wsdl__operation_->style, "http://www.w3.org/ns/wsdl/style/iri")) { output_mime_content = soap_new_mime__content(definitions.soap); output_mime_content->soap_default(definitions.soap); output_mime_content->type = (char*)"application/x-www-form-urlencoded"; } if (output_body || output_mime || output_mime_content || output->element) { char *URI; if (output_body && soap__operation_style == rpc) URI = output_body->namespace_; else if ((binding_count == 1 || !service_prefix) && definitions.targetNamespace && *definitions.targetNamespace) URI = definitions.targetNamespace; else if ((binding_count == 1 || !service_prefix) && definitions.name && *definitions.name) URI = definitions.name; else { // multiple service bidings are used, each needs a unique new URI size_t l = strlen(definitions.targetNamespace) + strlen(binding_name); URI = (char*)soap_malloc(definitions.soap, l + 2); if (URI) { soap_strcpy(URI, l + 2, definitions.targetNamespace); size_t n = strlen(URI); if (n > 0 && URI[n-1] != '/') { soap_strcpy(URI + n, l + 2 - n, "/"); ++n; } soap_strcpy(URI + n, l + 2 - n, binding_name); } } const char *prefix = types.nsprefix(service_prefix, URI); const char *name = types.aname(NULL, NULL, binding_name); // name of service is binding name Service *service = services[prefix]; if (!service) { service = services[prefix] = new Service(); service->prefix = prefix; service->URI = urienc(definitions.soap, URI); service->name = name; service->transport = soap__binding_transport; if ((*binding).portTypePtr() && (*binding).portTypePtr()->name) service->type = types.aname(NULL, NULL, (*binding).portTypePtr()->name); else service->type = NULL; // collect faults (TODO: this is not used anywhere) for (std::vector::const_iterator fault = (*binding).fault.begin(); fault != (*binding).fault.end(); ++fault) { Message *f = analyze_fault(definitions, service, *fault); if (f) service->fault[f->name] = f; } // collect policies for the bindings for (std::vector::const_iterator p = (*binding).wsp__Policy_.begin(); p != (*binding).wsp__Policy_.end(); ++p) service->policy.push_back(&(*p)); for (std::vector::const_iterator r = (*binding).wsp__PolicyReference_.begin(); r != (*binding).wsp__PolicyReference_.end(); ++r) service->policy.push_back((*r).policyPtr()); // collect policies for the service endpoints for (std::vector::const_iterator s = definitions.service.begin(); s != definitions.service.end(); ++s) { for (std::vector::const_iterator p = (*s).wsp__Policy_.begin(); p != (*s).wsp__Policy_.end(); ++p) service->policy.push_back(&(*p)); for (std::vector::const_iterator r = (*s).wsp__PolicyReference_.begin(); r != (*s).wsp__PolicyReference_.end(); ++r) service->policy.push_back((*r).policyPtr()); } // collect BPEL 2.0 partner link roles for (std::vector::const_iterator p = definitions.plnk__partnerLinkType.begin(); p != definitions.plnk__partnerLinkType.end(); ++p) { for (std::vector::const_iterator r = (*p).role.begin(); r != (*p).role.end(); ++r) { if ((binding_count > 1 && !service_prefix) || (*r).portTypePtr() == (*binding).portTypePtr()) service->role.push_back(&(*r)); } } } for (std::vector::const_iterator s = definitions.service.begin(); s != definitions.service.end(); ++s) { for (std::vector::const_iterator port = (*s).port.begin(); port != (*s).port.end(); ++port) { if ((*port).bindingPtr() == &(*binding)) { if ((*port).soap__address_ && (*port).soap__address_->location) service->location.insert(urienc(definitions.soap, (*port).soap__address_->location)); else if ((*port).wsa__EndpointReference && (*port).wsa__EndpointReference->Address) service->location.insert(urienc(definitions.soap, (*port).wsa__EndpointReference->Address)); if ((*port).wsaw__UsingAddressing) service->add_import("wsa5.h"); // TODO: HTTP address for HTTP operations // if ((*port).http__address_) // http__address_location = http__address_->location; // collect service documentation if ((*s).documentation) service->service_documentation[(*service).name] = (*s).documentation; if ((*port).documentation && (*port).name) service->port_documentation[(*port).name] = (*port).documentation; if (binding_documentation) service->binding_documentation[binding_name] = binding_documentation; // collect policies for the service and endpoints if ((*port).wsp__Policy_) service->policy.push_back((*port).wsp__Policy_); if ((*port).wsp__PolicyReference_ && (*port).wsp__PolicyReference_->policyPtr()) service->policy.push_back((*port).wsp__PolicyReference_->policyPtr()); } } } Operation *op = new Operation(); op->operation = wsdl__operation_; op->input_name = NULL; op->input = NULL; op->name = types.aname(NULL, NULL, wsdl__operation_->name); op->prefix = prefix; op->URI = urienc(definitions.soap, URI); op->style = soap__operation_style; op->mep = soap__operation_mep; op->is_rest = false; if (soap__binding_transport && (!strcmp(soap__binding_transport+strlen(soap__binding_transport)-4, "http") || !strcmp(soap__binding_transport+strlen(soap__binding_transport)-5, "HTTP/"))) { if ((op->mep && strstr(op->mep, "soap-response")) || (http_method && !strcmp(http_method, "GET"))) op->protocol = "SOAP-GET"; else if (version == 1) op->protocol = "SOAP1.1"; else if (version == 2) op->protocol = "SOAP1.2"; else op->protocol = "SOAP"; } else { op->is_rest = true; if (http_method) op->protocol = http_method; else op->protocol = "HTTP"; } op->documentation = wsdl__operation_->documentation; op->operation_documentation = (*operation).documentation; op->parameterOrder = wsdl__operation_->parameterOrder; if (http__operation_location) { op->action = http__operation_location; // TODO: for now, store HTTP location in action } else { op->action = soap__operation_action; if ((*operation).soap__operation_) { if ((*operation).soap__operation_->soapActionRequired) op->action = (*operation).soap__operation_->soapAction; } else if (version != 2) op->action = ""; } if (operation_policy) op->policy.push_back(operation_policy); if (ext_operation_policy) op->policy.push_back(ext_operation_policy); op->output = new Message(); // one-way output operation op->output->name = wsdl__operation_->name; // RPC uses operation/@name if (output_body && soap__operation_style == rpc && !output_body->namespace_) { op->output->URI = ""; fprintf(stderr, "\nError: no soap:body namespace attribute\n"); } else if (output_body) op->output->URI = urienc(definitions.soap, output_body->namespace_); else op->output->URI = service->URI; op->output->style = soap__operation_style; if (output_body) { op->output->use = output_body->use; op->output->encodingStyle = output_body->encodingStyle; } if (output->wsa__Action) op->output->action = output->wsa__Action; else if (output->wsam__Action) op->output->action = output->wsam__Action; else if (op->action) op->output->action = op->action; else if (definitions.targetNamespace && (*binding).portTypePtr() && (*binding).portTypePtr()->name) { const char *name = output->name ? output->name : op->name; size_t l = strlen(definitions.targetNamespace) + strlen((*binding).portTypePtr()->name) + strlen(name); char *tmp = (char*)soap_malloc(definitions.soap, l + 3); if (tmp) { (SOAP_SNPRINTF(tmp, l + 3, l + 2), "%s/%s/%s", definitions.targetNamespace, (*binding).portTypePtr()->name, name); op->output->action = tmp; } } op->output->message = output->messagePtr(); op->output->element = output->elementPtr(); op->output->part = NULL; op->output->mustUnderstand = false; op->output->multipartRelated = NULL; op->output->content = output_mime_content; op->output->body_parts = NULL; op->output->layout = NULL; op->output->ext_documentation = NULL; if (ext_output) { op->output->multipartRelated = ext_output->mime__multipartRelated_; if (ext_output->mime__multipartRelated_ && !ext_output->mime__multipartRelated_->part.empty()) op->output->header = ext_output->mime__multipartRelated_->part.front().soap__header_; else if (!ext_output->soap__header_.empty()) op->output->header = ext_output->soap__header_; else if (!ext_output->wsoap__header_.empty()) op->output->wheader = ext_output->wsoap__header_; if (ext_output->mime__multipartRelated_ && !ext_output->mime__multipartRelated_->part.empty() && ext_output->mime__multipartRelated_->part.front().soap__body_) op->output->body_parts = ext_output->mime__multipartRelated_->part.front().soap__body_->parts; else if (output_body) op->output->body_parts = output_body->parts; if (ext_output->dime__message_) op->output->layout = ext_output->dime__message_->layout; else op->output->layout = NULL; op->output->ext_documentation = ext_output->documentation; } op->output->documentation = output->documentation; // collect output message policies if (op->output->message) { for (std::vector::const_iterator p = op->output->message->wsp__Policy_.begin(); p != op->output->message->wsp__Policy_.end(); ++p) op->output->policy.push_back(&(*p)); for (std::vector::const_iterator r = op->output->message->wsp__PolicyReference_.begin(); r != op->output->message->wsp__PolicyReference_.end(); ++r) op->output->policy.push_back((*r).policyPtr()); } if (output->wsp__Policy_) op->output->policy.push_back(output->wsp__Policy_); if (output->wsp__PolicyReference_ && output->wsp__PolicyReference_->policyPtr()) op->output->policy.push_back(output->wsp__PolicyReference_->policyPtr()); if (ext_output) { if (ext_output->wsp__Policy_) op->output->policy.push_back(ext_output->wsp__Policy_); if (ext_output->wsp__PolicyReference_ && ext_output->wsp__PolicyReference_->policyPtr()) op->output->policy.push_back(ext_output->wsp__PolicyReference_->policyPtr()); } if (soap__operation_style == document) op->input_name = types.oname("__", op->URI, op->output->name); else op->input_name = types.oname(NULL, op->output->URI, op->output->name); size_t l = strlen(op->output->name); char *s = (char*)soap_malloc(definitions.soap, l + 9); if (s) { (SOAP_SNPRINTF(s, l + 9, l + 8), "%sResponse", op->output->name); if (soap__operation_style == document) op->output_name = types.oname("__", op->URI, s); else op->output_name = types.oname(NULL, op->output->URI, s); } analyze_headers(definitions, service, ext_input, ext_output); analyze_faults(definitions, service, op, operation); service->operation.push_back(op); } else fprintf(stderr, "\nError: no wsdl:definitions/binding/operation/output\n"); } else fprintf(stderr, "\nError: no wsdl:definitions/portType/operation/input and output\n"); } else fprintf(stderr, "\nError: no wsdl:definitions/portType/operation\n"); } } } } void Definitions::analyze_headers(const wsdl__definitions& definitions, Service *service, wsdl__ext_ioput *ext_input, wsdl__ext_ioput *ext_output) { // collect input headers and headerfaults if (ext_input) { const std::vector *soap__header_ = NULL; // check if soap header is in mime:multipartRelated if (ext_input->mime__multipartRelated_) { for (std::vector::const_iterator part = ext_input->mime__multipartRelated_->part.begin(); part != ext_input->mime__multipartRelated_->part.end(); ++part) if (!(*part).soap__header_.empty()) { soap__header_ = &(*part).soap__header_; break; } } if (!soap__header_) soap__header_ = &ext_input->soap__header_; for (std::vector::const_iterator header = soap__header_->begin(); header != soap__header_->end(); ++header) { Message *h = new Message(); h->message = (*header).messagePtr(); h->element = NULL; h->body_parts = NULL; h->part = (*header).partPtr(); if ((*header).namespace_) h->URI = urienc(definitions.soap, (*header).namespace_); else h->URI = service->URI; if (h->part && h->part->element) h->name = types.aname(NULL, NULL, h->part->element); else if (h->URI && h->part && h->part->name && h->part->type) h->name = types.aname(NULL, h->URI, h->part->name); else { fprintf(stderr, "\nError in SOAP Header part definition: input part \"%s\" missing?\n", h->part && h->part->name ? h->part->name : "?"); h->name = ""; } h->encodingStyle = (*header).encodingStyle; h->style = document; // irrelevant h->use = (*header).use; h->mustUnderstand = true; h->multipartRelated = NULL; h->content = NULL; h->layout = NULL; h->ext_documentation = NULL; // TODO: may wanto to add document content h->documentation = NULL; // TODO: may wanto to add document content service->header[h->name] = h; for (std::vector::const_iterator headerfault = (*header).headerfault.begin(); headerfault != (*header).headerfault.end(); ++headerfault) { Message *hf = new Message(); hf->message = (*headerfault).messagePtr(); hf->element = NULL; hf->body_parts = NULL; hf->part = (*headerfault).partPtr(); if ((*headerfault).namespace_) hf->URI = urienc(definitions.soap, (*headerfault).namespace_); else hf->URI = service->URI; if (hf->part && hf->part->element) hf->name = types.aname(NULL, NULL, hf->part->element); else if (hf->URI && hf->part && hf->part->name && hf->part->type) hf->name = types.aname(NULL, hf->URI, hf->part->name); else { fprintf(stderr, "\nError in SOAP HeaderFault part definition: input part \"%s\" missing?\n", hf->part && hf->part->name ? hf->part->name : "?"); hf->name = ""; } hf->encodingStyle = (*headerfault).encodingStyle; hf->action = NULL; hf->style = document; // irrelevant hf->use = (*headerfault).use; hf->mustUnderstand = false; hf->multipartRelated = NULL; hf->content = NULL; hf->layout = NULL; hf->ext_documentation = NULL; // TODO: may wanto to add document content hf->documentation = NULL; // TODO: may wanto to add document content service->headerfault[hf->name] = hf; } } for (std::vector::const_iterator wheader = ext_input->wsoap__header_.begin(); wheader != ext_input->wsoap__header_.end(); ++wheader) { Message *h = new Message(); h->message = NULL; h->element = (*wheader).elementPtr(); h->body_parts = NULL; h->part = NULL; h->URI = NULL; h->mustUnderstand = (*wheader).mustUnderstand_; h->name = types.aname(NULL, NULL, (*wheader).element); h->encodingStyle = NULL; h->style = document; // irrelevant h->use = literal; h->multipartRelated = NULL; h->content = NULL; h->layout = NULL; h->ext_documentation = NULL; // TODO: may want to add document content h->documentation = NULL; // TODO: may want to add document content service->header[h->name] = h; } } // collect output headers and headerfaults if (ext_output) { const std::vector *soap__header_ = NULL; // check if soap header is in mime:multipartRelated if (ext_output->mime__multipartRelated_) { for (std::vector::const_iterator part = ext_output->mime__multipartRelated_->part.begin(); part != ext_output->mime__multipartRelated_->part.end(); ++part) if (!(*part).soap__header_.empty()) { soap__header_ = &(*part).soap__header_; break; } } if (!soap__header_) soap__header_ = &ext_output->soap__header_; for (std::vector::const_iterator header = soap__header_->begin(); header != soap__header_->end(); ++header) { Message *h = new Message(); h->message = (*header).messagePtr(); h->element = NULL; h->body_parts = NULL; h->part = (*header).partPtr(); h->URI = urienc(definitions.soap, (*header).namespace_); if (h->part && h->part->element) h->name = types.aname(NULL, NULL, h->part->element); else if (h->URI && h->part && h->part->name && h->part->type) h->name = types.aname(NULL, h->URI, h->part->name); else { fprintf(stderr, "\nError in SOAP Header part definition: output part \"%s\" missing?\n", h->part && h->part->name ? h->part->name : "?"); h->name = ""; } h->encodingStyle = (*header).encodingStyle; h->style = document; // irrelevant h->use = (*header).use; h->mustUnderstand = false; h->multipartRelated = NULL; h->content = NULL; h->layout = NULL; h->ext_documentation = NULL; // TODO: may want to add document content h->documentation = NULL; // TODO: may want to add document content service->header[h->name] = h; for (std::vector::const_iterator headerfault = (*header).headerfault.begin(); headerfault != (*header).headerfault.end(); ++headerfault) { Message *hf = new Message(); hf->message = (*headerfault).messagePtr(); hf->element = NULL; hf->body_parts = NULL; hf->part = (*headerfault).partPtr(); if ((*headerfault).namespace_) hf->URI = urienc(definitions.soap, (*headerfault).namespace_); else hf->URI = service->URI; if (hf->part && hf->part->element) hf->name = types.aname(NULL, NULL, hf->part->element); else if (hf->URI && hf->part && hf->part->name && hf->part->type) hf->name = types.aname(NULL, hf->URI, hf->part->name); else { fprintf(stderr, "\nError in SOAP HeaderFault part definition: output part \"%s\" missing?\n", hf->part && hf->part->name ? hf->part->name : "?"); hf->name = ""; } hf->encodingStyle = (*headerfault).encodingStyle; hf->action = NULL; hf->style = document; // irrelevant hf->use = (*headerfault).use; hf->mustUnderstand = false; hf->multipartRelated = NULL; hf->content = NULL; hf->layout = NULL; hf->ext_documentation = NULL; // TODO: may wanto to add document content hf->documentation = NULL; // TODO: may wanto to add document content service->headerfault[hf->name] = hf; } } for (std::vector::const_iterator wheader = ext_output->wsoap__header_.begin(); wheader != ext_output->wsoap__header_.end(); ++wheader) { Message *h = new Message(); h->message = NULL; h->element = (*wheader).elementPtr(); h->body_parts = NULL; h->part = NULL; h->URI = NULL; h->mustUnderstand = (*wheader).mustUnderstand_; h->name = types.aname(NULL, NULL, (*wheader).element); h->encodingStyle = NULL; h->style = document; // irrelevant h->use = literal; h->multipartRelated = NULL; h->content = NULL; h->layout = NULL; h->ext_documentation = NULL; // TODO: may want to add document content h->documentation = NULL; // TODO: may want to add document content service->header[h->name] = h; } } } void Definitions::analyze_faults(const wsdl__definitions& definitions, Service *service, Operation *op, std::vector::const_iterator& operation) { for (std::vector::const_iterator fault = (*operation).fault.begin(); fault != (*operation).fault.end(); ++fault) { Message *f = analyze_fault(definitions, service, *fault); if (f) { op->outfault.push_back(f); service->fault[f->name] = f; } } for (std::vector::const_iterator infault = (*operation).infault.begin(); infault != (*operation).infault.end(); ++infault) { Message *f = analyze_fault(definitions, service, *infault); if (f) { op->infault.push_back(f); service->fault[f->name] = f; } } for (std::vector::const_iterator outfault = (*operation).outfault.begin(); outfault != (*operation).outfault.end(); ++outfault) { Message *f = analyze_fault(definitions, service, *outfault); if (f) { op->outfault.push_back(f); service->fault[f->name] = f; } } } Message *Definitions::analyze_fault(const wsdl__definitions& definitions, Service *service, const wsdl__ext_fault& ext_fault) { Message *f = NULL; const wsdl__fault *fault = ext_fault.faultPtr(); if (fault && (fault->messagePtr() || fault->elementPtr())) { f = new Message(); f->message = fault->messagePtr(); f->element = fault->elementPtr(); f->body_parts = NULL; f->part = NULL; f->encodingStyle = NULL; if (ext_fault.soap__fault_) f->encodingStyle = ext_fault.soap__fault_->encodingStyle; f->action = NULL; if (fault->wsa__Action) f->action = fault->wsa__Action; else f->action = fault->wsam__Action; if (f->element && f->element->schemaPtr()) f->URI = urienc(definitions.soap, f->element->schemaPtr()->targetNamespace); else if (ext_fault.soap__fault_ && ext_fault.soap__fault_->namespace_) f->URI = urienc(definitions.soap, ext_fault.soap__fault_->namespace_); else f->URI = service->URI; // must have a unique URI f->style = document; // irrelevant f->use = literal; if (ext_fault.soap__fault_) f->use = ext_fault.soap__fault_->use; if (ext_fault.wsoap__code) { size_t l = strlen(ext_fault.wsoap__code); if (ext_fault.wsoap__subcodes) l += strlen(ext_fault.wsoap__subcodes); char *s = (char*)soap_malloc(definitions.soap, l + 40); if (s) { (SOAP_SNPRINTF(s, l + 40, l + 19), "\"%s\" with subcodes \"%s\"", ext_fault.wsoap__code, ext_fault.wsoap__subcodes ? ext_fault.wsoap__subcodes : ""); f->body_parts = s; } } else f->ext_documentation = ext_fault.documentation; f->mustUnderstand = false; f->multipartRelated = NULL; f->content = NULL; f->layout = NULL; if (f->message) { f->name = types.aname("_", f->URI, f->message->name); f->documentation = f->message->documentation; } else { f->name = types.aname(NULL, f->URI, fault->element); f->documentation = fault->documentation; } // collect fault message policies if (fault->wsp__Policy_) f->policy.push_back(fault->wsp__Policy_); if (fault->wsp__PolicyReference_ && fault->wsp__PolicyReference_->policyPtr()) f->policy.push_back(fault->wsp__PolicyReference_->policyPtr()); if (ext_fault.wsp__Policy_) f->policy.push_back(ext_fault.wsp__Policy_); if (ext_fault.wsp__PolicyReference_ && ext_fault.wsp__PolicyReference_->policyPtr()) f->policy.push_back(ext_fault.wsp__PolicyReference_->policyPtr()); } else if (ext_fault.soap__fault_ && ext_fault.soap__fault_->name) fprintf(stderr, "\nError: no wsdl:definitions/binding/operation/fault/soap:fault \"%s\"\n", ext_fault.soap__fault_->name); else fprintf(stderr, "\nError: no wsdl:definitions/binding/operation/fault/soap:fault\n"); return f; } void Definitions::analyze_application(const wsdl__definitions& definitions) { // Analyze WADL application resources and build Service information const wadl__application *app = definitions.appPtr(); if (app) { if (vflag) fprintf(stderr, "\nAnalyzing and collecting WADL application resources\n"); for (std::vector::const_iterator resources = app->resources.begin(); resources != app->resources.end(); ++resources) { const char *URI = (*resources).base; const char *prefix = types.nsprefix(service_prefix, URI); Service *service = services[prefix]; if (!service) { service = services[prefix] = new Service(); service->prefix = prefix; service->URI = urienc(definitions.soap, URI); size_t l = strlen(prefix); char *name = (char*)soap_malloc(definitions.soap, l + 5); (SOAP_SNPRINTF(name, l + 5, l + 4), "%sREST", prefix); service->name = name; service->transport = NULL; service->type = NULL; service->location.insert(URI); for (std::vector::const_iterator resource = (*resources).resource.begin(); resource != (*resources).resource.end(); ++resource) { const char *path = urienc(definitions.soap, (*resource).path); const char *queryType = (*resource).queryType; analyze_resource(definitions, service, &*resource, URI, path, queryType); for (std::vector::const_iterator type = (*resource).typePtrs().begin(); type != (*resource).typePtrs().end(); ++type) analyze_resource(definitions, service, *type, URI, path, queryType); } } } } } void Definitions::analyze_resource(const wsdl__definitions& definitions, Service *service, const wadl__resource_USCOREtype *type, const char *URI, const char *path, const char *queryType) { for (std::vector<__wadl__method_resource_choice>::const_iterator choice = type->__choice.begin(); choice != type->__choice.end(); ++choice) { const wadl__method *method = (*choice).method; if (method) { while (method->methodPtr() && !method->id) method = method->methodPtr(); Operation *op = new Operation(); op->is_rest = true; op->protocol = soap_wadl__HTTPMethods2s(definitions.soap, method->name); op->operation = NULL; // wsdl__operation_; op->prefix = service->prefix; op->URI = service->URI; op->mep = NULL; op->style = document; op->parameterOrder = NULL; if (path && *path != '/') { size_t l = strlen(path); char *action = (char*)soap_malloc(definitions.soap, l + 2); (SOAP_SNPRINTF(action, l + 2, l + 1), "/%s", path); op->action = action; } else { op->action = path; } op->documentation = NULL; op->operation_documentation = NULL; if (!method->doc.empty()) { const wadl__doc& doc = *method->doc.begin(); op->documentation = doc.title; op->operation_documentation = doc.__mixed; } const char *name = method->id ? method->id : op->protocol; op->name = types.aname(NULL, URI, name); op->input_name = types.oname("__", URI, name); size_t l = strlen(name); char *resname = (char*)soap_malloc(definitions.soap, l + 9); if (resname) { (SOAP_SNPRINTF(resname, l + 9, l + 8), "%sResponse", name); op->output_name = types.oname("__", URI, resname); } op->input = NULL; if (method->request) { wsdl__message *message = NULL; const xs__element *element = NULL; const char *documentation = NULL; for (std::vector::const_iterator rep = method->request->representation.begin(); rep != method->request->representation.end(); ++rep) { const wadl__representation *representation = &*rep; while (representation->representationPtr() && !representation->id) representation = representation->representationPtr(); if (!representation->mediaType || strstr(representation->mediaType, "xml")) { if (representation->elementPtr()) element = representation->elementPtr(); if (!representation->doc.empty()) { const wadl__doc& doc = *representation->doc.begin(); if (doc.__mixed && *doc.__mixed) documentation = doc.__mixed; else documentation = doc.title; } break; } } std::vector allparam = type->param; for (std::vector::const_iterator par = method->request->param.begin(); par != method->request->param.end(); ++par) allparam.push_back(*par); for (std::vector::const_iterator par = allparam.begin(); par != allparam.end(); ++par) { const wadl__param *param = &*par; while (param->paramPtr() && !param->id) param = param->paramPtr(); if (param->name) { if (param->style && (*param->style == matrix || *param->style == header || *param->style == plain)) { if (!Wflag) fprintf(stderr, "\nWarning: ignoring param '%s' with unsupported style '%s' in method/response/representation\n", param->name, soap_wadl__ParamStyle2s(definitions.soap, *param->style)); } else { if (!message) { message = soap_new_wsdl__message(definitions.soap); message->soap_default(definitions.soap); } wsdl__part part; part.soap_default(definitions.soap); part.name = param->name; if (param->type) { part.type = param->type; if (param->simpleTypePtr()) part.simpleTypePtr(param->simpleTypePtr()); else if (param->complexTypePtr()) part.complexTypePtr(param->complexTypePtr()); } else { part.type = (char*)"xsd:string"; } part.set_optional(param->required == false); if (param->repeating) { part.set_optional(true); part.set_repeating(true); } else if (param->default_) { part.set_optional(true); // There is no point in setting the default value if param is optional // part.set_default(param->default_); } else if (param->fixed) { part.set_optional(false); part.set_fixed(true); part.set_default(param->fixed); } for (std::vector::const_iterator i = param->option.begin(); i != param->option.end(); ++i) part.set_option((*i).value); if (!param->doc.empty()) { const wadl__doc& doc = *param->doc.begin(); if (doc.__mixed && *doc.__mixed) part.documentation = doc.__mixed; else part.documentation = doc.title; } message->part.push_back(part); } } } op->input = new Message; op->input->name = op->input_name; op->input->URI = service->URI; op->input->style = op->style; op->input->use = literal; op->input->encodingStyle = NULL; op->input->action = NULL; op->input->message = message; op->input->element = element; op->input->part = NULL; op->input->mustUnderstand = false; op->input->multipartRelated = NULL; op->input->content = soap_new_mime__content(definitions.soap); op->input->content->soap_default(definitions.soap); op->input->content->type = (char*)queryType; op->input->body_parts = NULL; op->input->layout = NULL; op->input->multipartRelated = NULL; op->input->layout = NULL; op->input->documentation = documentation; op->input->ext_documentation = NULL; if (!method->request->doc.empty()) { const wadl__doc& doc = *method->request->doc.begin(); if (doc.__mixed && *doc.__mixed) op->input->ext_documentation = doc.__mixed; else op->input->ext_documentation = doc.title; } } op->output = NULL; for (std::vector::const_iterator response = method->response.begin(); response != method->response.end(); ++response) { const char *name = NULL; const xs__element *element = NULL; for (std::vector::const_iterator rep = (*response).representation.begin(); rep != (*response).representation.end(); ++rep) { const wadl__representation *representation = &*rep; while (representation->representationPtr() && !representation->id) representation = representation->representationPtr(); if (!representation->mediaType || strstr(representation->mediaType, "xml")) { if (representation->elementPtr()) { name = representation->element; element = representation->elementPtr(); } for (std::vector::const_iterator param = representation->param.begin(); param != representation->param.end(); ++param) if (!Wflag) fprintf(stderr, "\nWarning: ignoring param '%s' in method/response/representation\n", param->name ? param->name : ""); break; } } if (element) { if (!op->output && (!(*response).status || strstr((*response).status, "200") || strstr((*response).status, "201") || strstr((*response).status, "202"))) { op->output = new Message(); op->output->name = op->output_name; op->output->URI = service->URI; op->output->style = op->style; op->output->use = literal; op->output->encodingStyle = NULL; op->output->action = NULL; op->output->message = NULL; op->output->element = element; op->output->part = NULL; op->output->mustUnderstand = false; op->output->multipartRelated = NULL; op->output->content = NULL; op->output->body_parts = NULL; op->output->layout = NULL; op->output->ext_documentation = NULL; op->output->multipartRelated = NULL; op->output->layout = NULL; op->output->ext_documentation = NULL; op->output->documentation = NULL; } else { Message *fault = new Message(); fault->name = types.aname(NULL, NULL, name); fault->URI = service->URI; fault->style = op->style; fault->use = literal; fault->encodingStyle = NULL; fault->action = NULL; fault->message = NULL; fault->element = element; fault->part = NULL; fault->mustUnderstand = false; fault->multipartRelated = NULL; fault->content = NULL; fault->body_parts = (*response).status; fault->layout = NULL; fault->ext_documentation = NULL; fault->multipartRelated = NULL; fault->layout = NULL; fault->ext_documentation = NULL; fault->documentation = NULL; op->outfault.push_back(fault); } } } service->operation.push_back(op); } wadl__resource *resource = (*choice).resource; if (resource) { const char *fullpath = NULL; if (resource->path) fullpath = urienc(definitions.soap, resource->path); if (path) { if (fullpath) { size_t l = strlen(path) + strlen(fullpath) + 2; char *s = (char*)soap_malloc(definitions.soap, l); (SOAP_SNPRINTF_SAFE(s, l), "%s/%s", path, fullpath + (*fullpath == '/')); fullpath = s; } else { fullpath = path; } } if (!type->param.empty()) { std::vector allparam = type->param; for (std::vector::const_iterator par = resource->param.begin(); par != resource->param.end(); ++par) allparam.push_back(*par); resource->param.swap(allparam); } analyze_resource(definitions, service, resource, URI, fullpath, resource->queryType ? resource->queryType : queryType); } } } void Definitions::compile(const wsdl__definitions& definitions) { // compile the definitions and generate gSOAP header file const char *defs; if (definitions.name) defs = types.aname(NULL, NULL, definitions.name); else defs = "Service"; ident(); fprintf(stream, "/**\n\n"); if (!Lflag) fprintf(stream, "@page page_notes Notes\n\n@note HINTS:\n - Run soapcpp2 on %s to generate the SOAP/XML processing logic:\n Use soapcpp2 -I to specify paths for #import\n Use soapcpp2 -j to generate improved proxy and server classes.\n Use soapcpp2 -r to generate a report.\n - Edit 'typemap.dat' to control namespace bindings and type mappings:\n It is strongly recommended to customize the names of the namespace prefixes\n generated by wsdl2h. To do so, modify the prefix bindings in the Namespaces\n section below and add the modified lines to 'typemap.dat' to rerun wsdl2h.\n - Run Doxygen (www.doxygen.org) on this file to generate documentation.\n - Use wsdl2h -c to generate pure C code.\n - Use wsdl2h -R to include the REST operations defined by the WSDLs.\n - Use wsdl2h -O3 or -O4 to optimize by removing unused schema components.\n - Use wsdl2h -d to enable DOM support for xsd:any and xsd:anyType.\n - Use wsdl2h -F to simulate struct-type derivation in C (also works in C++).\n - Use wsdl2h -f to generate flat C++ class hierarchy, removes type derivation.\n - Use wsdl2h -g to generate top-level root elements with readers and writers.\n - Use wsdl2h -U to map XML names to C++ Unicode identifiers instead of _xNNNN.\n - Use wsdl2h -u to disable the generation of unions.\n - Use wsdl2h -L to remove this @note and all other @note comments.\n - Use wsdl2h -nname to use name as the base namespace prefix instead of 'ns'.\n - Use wsdl2h -Nname for service prefix and produce multiple service bindings\n - Struct/class members serialized as XML attributes are annotated with a '@'.\n - Struct/class members that have a special role are annotated with a '$'.\n\n@warning\n DO NOT INCLUDE THIS ANNOTATED FILE DIRECTLY IN YOUR PROJECT SOURCE CODE.\n USE THE FILES GENERATED BY soapcpp2 FOR YOUR PROJECT'S SOURCE CODE:\n THE GENERATED soapStub.h FILE CONTAINS THIS CONTENT WITHOUT ANNOTATIONS.\n\n", outfile ? outfile : "this file"); fprintf(stream, "@copyright LICENSE:\n@verbatim\n%s@endverbatim\n\n*/\n\n", licensenotice); // gsoap compiler options: 'w' disables WSDL/schema output to avoid file collisions if (cflag) fprintf(stream, "\n//gsoapopt c,w\n"); else if (c11flag) fprintf(stream, "\n//gsoapopt c++11,w\n"); else fprintf(stream, "\n//gsoapopt c++,w\n"); banner("Definitions", definitions.targetNamespace ? definitions.targetNamespace : ""); // copy documentation from WSDL definitions if (definitions.documentation) { fprintf(stream, "/* WSDL Documentation:\n\n"); text(definitions.documentation); fprintf(stream, "*/\n\n"); } if (definitions.version) { banner("Version", definitions.version); fprintf(stream, "#define SOAP_WSDL_VERSION \"%s\"\n", definitions.version); } if (!cflag) { const char *s; if (!sflag) { s = types.vname("$CONTAINER"); if (s && *s != '*' && *s != '$') { banner("$CONTAINER", s); if (!strcmp(s, "std::deque")) fprintf(stream, "#include \n"); else if (!strcmp(s, "std::list")) fprintf(stream, "#include \n"); else if (!strcmp(s, "std::vector")) fprintf(stream, "#include \n"); else if (!strcmp(s, "std::set")) fprintf(stream, "#include \n"); fprintf(stream, "template class %s;\n", s); } } s = types.vname("$POINTER"); if (s && *s != '*' && *s != '$') { banner("$POINTER", s); fprintf(stream, "volatile template class %s;\n", s); } } banner("Import"); if (dflag) { fprintf(stream, "\n// dom.h declares the DOM xsd__anyType object (compiler and link with dom.cpp)\n"); fprintf(stream, "#import \"dom.h\"\n"); } if (mflag) { fprintf(stream, "#import \""); fprintf(stream, "xsd.h\"\t// import built-in XSD types.\n"); } for (SetOfString::const_iterator u = exturis.begin(); u != exturis.end(); ++u) { bool found = false; size_t n = strlen(*u); for (SetOfString::const_iterator i = definitions.builtinTypes().begin(); i != definitions.builtinTypes().end(); ++i) { if (**i == '"' && !strncmp(*u, *i + 1, n) && (*i)[n+1] == '"') { found = true; break; } } if (!found) { for (SetOfString::const_iterator j = definitions.builtinElements().begin(); j != definitions.builtinElements().end(); ++j) { if (**j == '"' && !strncmp(*u, *j + 1, n) && (*j)[n+1] == '"') { found = true; break; } } } if (!found) { for (SetOfString::const_iterator k = definitions.builtinAttributes().begin(); k != definitions.builtinAttributes().end(); ++k) { if (**k == '"' && !strncmp(*u, *k + 1, n) && (*k)[n+1] == '"') { found = true; break; } } } if (found) { if (vflag) fprintf(stderr, "import %s\n", *u); fprintf(stream, "#import \"%s.h\"\t// %s = <%s>\n", types.nsprefix(NULL, *u), types.nsprefix(NULL, *u), *u); } } banner("Schema Namespaces"); // Determine if bindings use SOAP 1.2 soap12 = false; for (Namespace *p = definitions.soap->local_namespaces; p && p->id; p++) { if (p->out && !strcmp(p->id, "soap") && !strcmp(p->out, "http://schemas.xmlsoap.org/wsdl/soap12/")) { soap12 = true; break; } } if (!soap12) { for (std::vector::const_iterator i = definitions.import.begin(); i != definitions.import.end(); ++i) { if ((*i).definitionsPtr()) { for (Namespace *p = (*i).definitionsPtr()->soap->local_namespaces; p && p->id; p++) { if (p->out && !strcmp(p->id, "soap") && !strcmp(p->out, "http://schemas.xmlsoap.org/wsdl/soap12/")) { soap12 = true; break; } } } if (soap12) break; } } if (definitions.types) { if (!Lflag) { fprintf(stream, "\n/* NOTE:\n\nIt is strongly recommended to customize the names of the namespace prefixes\ngenerated by wsdl2h. To do so, modify the prefix bindings below and add the\nmodified lines to 'typemap.dat' then rerun wsdl2h (use wsdl2h -t typemap.dat):\n\n"); if (definitions.targetNamespace && *definitions.targetNamespace) fprintf(stream, "%s = \"%s\"\n", types.nsprefix(service_prefix, definitions.targetNamespace), definitions.targetNamespace); for (std::vector::const_iterator schema1 = definitions.types->xs__schema_.begin(); schema1 != definitions.types->xs__schema_.end(); ++schema1) if ((*schema1)->targetNamespace && *(*schema1)->targetNamespace && (!definitions.targetNamespace || strcmp((*schema1)->targetNamespace, definitions.targetNamespace))) fprintf(stream, "%s = \"%s\"\n", types.nsprefix(NULL, (*schema1)->targetNamespace), (*schema1)->targetNamespace); fprintf(stream, "\n*/\n"); } for (std::vector::const_iterator schema2 = definitions.types->xs__schema_.begin(); schema2 != definitions.types->xs__schema_.end(); ++schema2) { const char *t = types.nsprefix(NULL, (*schema2)->targetNamespace); if (t && *t) { fprintf(stream, "\n"); types.document((*schema2)->annotation); fprintf(stream, "#define SOAP_NAMESPACE_OF_%s\t\"%s\"\n", types.aname(NULL, NULL, t), urienc(definitions.soap, (*schema2)->targetNamespace)); fprintf(stream, schemaformat, t, "namespace", urienc(definitions.soap, (*schema2)->targetNamespace)); if ((*schema2)->elementFormDefault == (*schema2)->attributeFormDefault) fprintf(stream, schemaformat, t, "form", (*schema2)->elementFormDefault == qualified ? "qualified" : "unqualified"); else { fprintf(stream, schemaformat, t, "elementForm", (*schema2)->elementFormDefault == qualified ? "qualified" : "unqualified"); fprintf(stream, schemaformat, t, "attributeForm", (*schema2)->attributeFormDefault == qualified ? "qualified" : "unqualified"); } } } } // generate the prototypes first: these should allow use before def, e.g. class names then generate the defs // check if xsd:anyType is used if (!pflag) { for (SetOfString::const_iterator i = definitions.builtinTypes().begin(); i != definitions.builtinTypes().end(); ++i) { if (!strcmp(*i, "xs:anyType")) { pflag = 1; if (!wflag && !Pflag && !fflag && (!cflag || Fflag)) fprintf(stderr, "\nNote: option -p auto-enabled to generate wrappers for built-in types derived from xsd__anyType to support polymorphism in XML by (de)serializing any derived type of xsd:anyType (or xsd:anySimpleType) as elements annotated by xsi:type attributes in XML, use option -P to suppress and disable this feature\n"); break; } } } // produce built-in primitive types banner("Built-in Schema Types and Top-Level Elements and Attributes"); // define xsd:anyType first, if used if (pflag) { if (Fflag && !fflag && !Pflag) { if (cflag) { types.usetypemap["xsd__anyType"] = "struct xsd__anyType_"; types.ptrtypemap["xsd__anyType"] = "struct xsd__anyType_*"; } else { fprintf(stream, "/// Built-in root XSD type \"xs:anyType\".\n"); fprintf(stream, "class xsd__anyType_;\n\n"); types.usetypemap["xsd__anyType"] = "xsd__anyType_"; types.ptrtypemap["xsd__anyType"] = "xsd__anyType_*"; types.knames.insert("xsd__anyType_"); const char *r = types.vname("$POINTER"); if (r && *r != '*' && *r != '$') { MapOfStringToString::iterator i = types.smptypemap.find("xsd__anyType"); if (i != types.smptypemap.end()) types.smptypemap.erase(i); types.smptypemap["xsd__anyType"] = types.pname(true, true, NULL, NULL, "xs:anyType"); } } } else if (!dflag) { const char *s, *t; t = types.cname(NULL, NULL, "xs:anyType"); s = types.deftypemap[t]; if (s) { if (*s) { if (!mflag) { fprintf(stream, "/// Built-in XSD root type \"xs:anyType\".\n///\n"); if (!cflag && !Lflag) fprintf(stream, "/// @note Call virtual method soap_type() generated by soapcpp2 to check runtime type is SOAP_TYPE_%s or a derived type. Use option -P to remove this class.\n", t); fprintf(stream, "%s\n\n", s); } } s = types.usetypemap[t]; if (s) { if (mflag) fprintf(stream, "// xsd.h: should define type %s\n\n", s); types.knames.insert(s); } } else { fprintf(stderr, "\nError: no xsd__anyType defined in type map\n"); pflag = 0; } } } if (fflag || Pflag) pflag = 0; if (vflag) fprintf(stderr, "\nGenerating built-in types\n"); for (SetOfString::const_iterator i = definitions.builtinTypes().begin(); i != definitions.builtinTypes().end(); ++i) { const char *s, *t; if (!cflag && !strcmp(*i, "xs:anyType")) continue; // make an exception for the rarely-used xs:anySimpleType to equal xs:anyType to make coding easier if (Qflag && !strcmp(*i, "xs:anySimpleType") && types.deftypemap.find("xsd__anySimpleType") == types.deftypemap.end()) { if (pflag) { types.deftypemap["xsd__anySimpleType"] = ""; if (Fflag) { if (cflag) { types.usetypemap["xsd__anySimpleType"] = "struct xsd__anyType_"; types.ptrtypemap["xsd__anySimpleType"] = "struct xsd__anyType_*"; } else { types.usetypemap["xsd__anySimpleType"] = "xsd__anyType_"; types.ptrtypemap["xsd__anySimpleType"] = "xsd__anyType_*"; } } else if (cflag) { types.usetypemap["xsd__anySimpleType"] = types.usetypemap["xsd__anyType"]; } else { types.usetypemap["xsd__anySimpleType"] = "xsd__anyType*"; types.ptrtypemap["xsd__anySimpleType"] = "xsd__anyType*"; } } else { types.deftypemap["xsd__anySimpleType"] = ""; types.usetypemap["xsd__anySimpleType"] = types.usetypemap["xsd__anyType"]; types.ptrtypemap["xsd__anySimpleType"] = types.ptrtypemap["xsd__anyType"]; } } // make an exception for SOAP-ENC:Array if (!strcmp(*i, "SOAP-ENC:Array") && types.deftypemap.find("SOAP_ENC__Array") == types.deftypemap.end()) { if (pflag) { if (Fflag) { if (cflag) { types.deftypemap["SOAP_ENC__Array"] = "struct SOAP_ENC__Array\n{\n/// Pointer to array of elements of type xs:anyType\n struct xsd__anyType_ *__ptr;\n/// Size of the array\n int __size;\n};"; types.usetypemap["SOAP_ENC__Array"] = "struct SOAP_ENC__Array"; } else { types.deftypemap["SOAP_ENC__Array"] = "class SOAP_ENC__Array\n{ public:\n/// Pointer to array of elements of type xs:anyType\n xsd__anyType_ *__ptr;\n/// Size of the array\n int __size;\n};"; types.usetypemap["SOAP_ENC__Array"] = "SOAP_ENC__Array"; } } else if (cflag) { types.deftypemap["SOAP_ENC__Array"] = soap_strdup(definitions.soap, (std::string("struct SOAP_ENC__Array\n{\n/// Pointer to array of elements of type xs:anyType\n ") + std::string(types.usetypemap["xsd__anyType"]) + std::string(" *__ptr;\n/// Size of the array\n int __size;\n};")).c_str()); types.usetypemap["SOAP_ENC__Array"] = "struct SOAP_ENC__Array"; } else { types.deftypemap["SOAP_ENC__Array"] = "class SOAP_ENC__Array : public xsd__anyType\n{ public:\n/// Pointer to array of elements of type xs:anyType\n xsd__anyType **__ptr;\n/// Size of the array\n int __size;\n};"; types.usetypemap["SOAP_ENC__Array"] = "SOAP_ENC__Array"; } } else if (cflag) { if (dflag) { types.deftypemap["SOAP_ENC__Array"] = "struct SOAP_ENC__Array\n{\n/// Pointer to array of DOM nodes\n xsd__anyType *__ptr;\n/// Size of the array\n int __size;\n};"; types.usetypemap["SOAP_ENC__Array"] = "struct SOAP_ENC__Array"; } else { types.deftypemap["SOAP_ENC__Array"] = "struct SOAP_ENC__Array\n{\n/// Pointer to array of XML strings\n _XML *__ptr;\n/// Size of the array\n int __size;\n};"; types.usetypemap["SOAP_ENC__Array"] = "struct SOAP_ENC__Array"; } } else { if (dflag) { types.deftypemap["SOAP_ENC__Array"] = "class SOAP_ENC__Array\n{ public:\n/// Pointer to array of DOM nodes\n xsd__anyType *__ptr;\n/// Size of the array\n int __size;\n};"; types.usetypemap["SOAP_ENC__Array"] = "SOAP_ENC__Array"; } else { types.deftypemap["SOAP_ENC__Array"] = "class SOAP_ENC__Array\n{ public:\n/// Pointer to array of XML strings\n _XML *__ptr;\n/// Size of the array\n int __size;\n};"; types.usetypemap["SOAP_ENC__Array"] = "SOAP_ENC__Array"; } } } t = types.cname(NULL, NULL, *i); s = types.deftypemap[t]; if (s) { if (*s) { if (**i == '"') fprintf(stream, "/// Imported type \"%s\" from typemap %s.\n", *i, mapfile ? mapfile : ""); else fprintf(stream, "/// Built-in type \"%s\".\n", *i); if (mflag) { fprintf(stream, "// (declaration of %s removed by option -m)\n\n", t); } else if (!iflag && !imported(*i)) { types.format(s); fprintf(stream, "\n"); } } s = types.usetypemap[t]; if (s && *s) { if (mflag && **i != '"') fprintf(stream, "// xsd.h: typemap override of type %s with %s\n\n", t, s); if (types.knames.find(s) == types.knames.end()) types.knames.insert(s); } } } for (SetOfString::const_iterator i = definitions.builtinTypes().begin(); i != definitions.builtinTypes().end(); ++i) { const char *s, *t; if (!cflag && (!strcmp(*i, "xs:anyType") || (Qflag && !strcmp(*i, "xs:anySimpleType")) || !strcmp(*i, "SOAP-ENC:Array"))) continue; t = types.cname(NULL, NULL, *i); s = types.deftypemap[t]; if (!s) { if (!mflag) { if (**i == '"') { fprintf(stream, "// Imported type \"%s\" defined by %s.\n\n", *i, t); } else if (!iflag) { s = types.tname(NULL, NULL, "xsd:string"); fprintf(stream, "/// Primitive built-in type \"%s\".\n", *i); fprintf(stream, "typedef %s %s;\n\n", s, t); types.deftname(TYPEDEF, false, types.is_ptr(NULL, NULL, "xsd:string"), NULL, NULL, *i, s); const char *u = types.uri(*i); if (u && !types.uris[u]) { fprintf(stream, schemaformat, types.nsprefix(types.prefix(*i), u), "namespace", u); fprintf(stream, "\n"); } } } else if (**i == '"') { fprintf(stream, "// Imported type \"%s\" defined by %s.\n\n", *i, t); } else { fprintf(stream, "// xsd.h: should define type %s\n\n", t); } types.deftname(TYPEDEF, false, false, NULL, NULL, *i, s); } if (pflag && !cflag && !Fflag) { if (!zflag || zflag > 8) s = types.wname(NULL, NULL, *i, NOLOOKUP); else s = types.aname(NULL, NULL, *i); if (!mflag) { fprintf(stream, "/// Class wrapper %s for built-in type \"%s\" extends xsd__anyType.\n", s, *i); if (!Lflag) fprintf(stream, "/// @note Call virtual method soap_type() generated by soapcpp2 to check runtime type is SOAP_TYPE_%s or a derived type. Use option -P to remove this class.\n", s); fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s); fprintf(stream, elementformat, types.tname(NULL, NULL, *i), "__item"); fprintf(stream, ";\n};\n\n"); } types.knames.insert(s); } } // produce built-in primitive elements if (vflag) fprintf(stderr, "\nGenerating built-in elements\n"); for (SetOfString::const_iterator j = definitions.builtinElements().begin(); j != definitions.builtinElements().end(); ++j) { const char *s, *t; t = types.cname("_", NULL, *j); s = types.deftypemap[t]; if (s) { if (*s) { if (**j == '"') fprintf(stream, "/// Imported element \"%s\" from typemap %s.\n\n", *j, mapfile ? mapfile : ""); else fprintf(stream, "/// Built-in element \"%s\".\n\n", *j); if (mflag) { fprintf(stream, "// (declaration of %s removed by option -m)\n\n", t); } else if (!iflag && !imported(*j)) { types.format(s); fprintf(stream, "\n"); } } s = types.usetypemap[t]; if (s && *s) { if (mflag && **j != '"') fprintf(stream, "// xsd.h: typemap override of element %s with %s\n\n", t, s); if (types.knames.find(s) == types.knames.end()) types.knames.insert(s); } } else { if (!mflag) { if (**j == '"') { fprintf(stream, "// Imported element \"%s\" declared as %s.\n\n", *j, t); } else if (!iflag && !imported(*j)) { s = types.tname(NULL, NULL, "xsd:any"); fprintf(stream, "/// Built-in element \"%s\".\n", *j); fprintf(stream, "typedef %s %s;\n\n", s, t); types.deftname(TYPEDEF, false, true, "_", NULL, *j, s); // already pointer const char *u = types.uri(*j); if (u && !types.uris[u]) { fprintf(stream, schemaformat, types.nsprefix(types.prefix(*j), u), "namespace", u); fprintf(stream, "\n"); } } } else if (**j == '"') { fprintf(stream, "// Imported element \"%s\" declared as %s.\n\n", *j, t); } else { fprintf(stream, "// xsd.h: should define element %s\n\n", t); } types.deftname(TYPEDEF, false, false, "_", NULL, *j, s); } } // produce built-in primitive attributes if (vflag) fprintf(stderr, "\nGenerating built-in attributes\n"); for (SetOfString::const_iterator k = definitions.builtinAttributes().begin(); k != definitions.builtinAttributes().end(); ++k) { const char *s, *t; t = types.cname("_", NULL, *k); s = types.deftypemap[t]; if (s) { if (*s) { if (**k == '"') fprintf(stream, "/// Imported attribute \"%s\" from typemap %s.\n", *k, mapfile ? mapfile : ""); else fprintf(stream, "/// Built-in attribute \"%s\".\n", *k); if (mflag) fprintf(stream, "// (declaration of %s removed by option -m)\n\n", t); else if (!iflag && !imported(*k)) { types.format(s); fprintf(stream, "\n"); } } s = types.usetypemap[t]; if (s && *s) { if (mflag && **k != '"') fprintf(stream, "// xsd.h: typemap override of attribute %s with %s\n\n", t, s); if (types.knames.find(s) == types.knames.end()) types.knames.insert(s); } } else { s = types.tname(NULL, NULL, "xsd:string"); if (!mflag) { if (**k == '"') { fprintf(stream, "// Imported attribute \"%s\" declared as %s.\n", *k, t); } else if (!iflag && !imported(*k)) { fprintf(stream, "/// Built-in attribute \"%s\".\n", *k); fprintf(stream, "typedef %s %s;\n\n", s, t); const char *u = types.uri(*k); if (u && !types.uris[u]) { fprintf(stream, schemaformat, types.nsprefix(types.prefix(*k), u), "namespace", u); fprintf(stream, "\n"); } } } else if (**k == '"') { fprintf(stream, "// Imported attribute \"%s\" declared as %s.\n\n", *k, t); } else { fprintf(stream, "// xsd.h: should define attribute %s\n\n", t); } types.deftname(TYPEDEF, false, types.is_ptr(NULL, NULL, "xsd:string"), "_", NULL, *k, s); } } // produce types // define class/struct types first if (!cflag) banner("Forward Declarations"); if (definitions.types) { comment("Definitions", defs, "types", definitions.types->documentation); fprintf(stream, "\n"); for (std::vector::const_iterator schema4 = definitions.types->xs__schema_.begin(); schema4 != definitions.types->xs__schema_.end(); ++schema4) { if (vflag) fprintf(stderr, "\nDefining types in %s\n", (*schema4)->targetNamespace); for (std::vector::const_iterator complexType = (*schema4)->complexType.begin(); complexType != (*schema4)->complexType.end(); ++complexType) types.define((*schema4)->targetNamespace, NULL, *complexType); if (vflag) fprintf(stderr, "\nDefining elements in %s\n", (*schema4)->targetNamespace); for (std::vector::const_iterator element = (*schema4)->element.begin(); element != (*schema4)->element.end(); ++element) { if (!(*element).type && !(*element).abstract) { if ((*element).complexTypePtr()) { types.define((*schema4)->targetNamespace, (*element).name, *(*element).complexTypePtr()); } else if (!(*element).simpleTypePtr()) { fprintf(stream, "/// @brief Top-level root element \"%s\":%s.\n", (*schema4)->targetNamespace, (*element).name); if (gflag) { const char *t = types.deftname(TYPEDEF, false, false, "_", (*schema4)->targetNamespace, (*element).name, NULL); if (t) fprintf(stream, "typedef _XML %s;\n\n", t); else fprintf(stream, "// Element definition intentionally left blank.\n\n"); types.ptrtypemap[t] = types.usetypemap[t] = "_XML"; } else { const char *s = types.cname("_", (*schema4)->targetNamespace, (*element).name); types.ptrtypemap[s] = types.usetypemap[s] = "_XML"; if (!Lflag) fprintf(stream, "/// @note Use wsdl2h option -g to auto-generate a top-level root element declaration.\n\n"); } } } } } // visit types with lowest base level first int baseLevel = 1; bool found; bool inheritance = false; do { found = (baseLevel == 1); for (std::vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { if (found) banner("Schema Types and Top-Level Elements and Attributes", (*schema)->targetNamespace); for (std::vector::iterator simpleType = (*schema)->simpleType.begin(); simpleType != (*schema)->simpleType.end(); ++simpleType) { if ((*simpleType).baseLevel() == baseLevel) { found = true; types.gen((*schema)->targetNamespace, NULL, *simpleType, false, false); } } for (std::vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if (!(*element).type && (*element).simpleTypePtr() && (*element).simpleTypePtr()->baseLevel() == baseLevel) { found = true; if ((*element).type) fprintf(stream, "/// @brief Top-level root element \"%s\":%s of simpleType %s.\n", (*schema)->targetNamespace, (*element).name, (*element).type); types.document((*element).annotation); types.gen((*schema)->targetNamespace, (*element).name, *(*element).simpleTypePtr(), false, false); } if (!(*element).type && (*element).complexTypePtr() && (*element).complexTypePtr()->baseLevel() == baseLevel) found = true; } for (std::vector::const_iterator attribute = (*schema)->attribute.begin(); attribute != (*schema)->attribute.end(); ++attribute) { if (!(*attribute).type && (*attribute).simpleTypePtr() && (*attribute).simpleTypePtr()->baseLevel() == baseLevel) { found = true; if ((*attribute).type) fprintf(stream, "/// @brief Top-level attribute \"%s\":%s of simpleType %s.\n", (*schema)->targetNamespace, (*attribute).name, (*attribute).type); types.document((*attribute).annotation); types.gen((*schema)->targetNamespace, (*attribute).name, *(*attribute).simpleTypePtr(), false, false); // URI = NULL won't generate type in schema (type without namespace qualifier) } } for (std::vector::iterator complexType = (*schema)->complexType.begin(); complexType != (*schema)->complexType.end(); ++complexType) { if ((*complexType).baseLevel() == baseLevel) found = true; } } if (found && baseLevel > 1) inheritance = true; ++baseLevel; } while (found); if (cflag && !Fflag && !fflag && inheritance && !wflag) fprintf(stderr, "\nWarning: ignoring type inheritance by default for C, use option -F to generate struct declarations with simulated inheritance using transient pointer members pointing to derived types to serialize derived types as elements annotated by xsi:type attributes in XML.\n"); // generate wrapper structs/classes for built-in XSD types with options -p and -F if (pflag && Fflag) { banner("Wrappers for built-in types with their derived types"); for (SetOfString::const_iterator i = definitions.builtinTypes().begin(); i != definitions.builtinTypes().end(); ++i) { if (strcmp(*i, "xs:anyType") && strcmp(*i, "xs:anySimpleType")) { const char *s = types.wname(NULL, NULL, *i, NOLOOKUP); fprintf(stream, "/// Wrapper %s for built-in type \"%s\".\n///\n", s, *i); if (cflag) { if (!Lflag) fprintf(stream, "/// @note Use option -P to remove this struct.\n"); fprintf(stream, "struct %s\n{\n", s); } else { if (!Lflag) fprintf(stream, "/// @note Call virtual method soap_type() generated by soapcpp2 to check runtime type is SOAP_TYPE_%s or a derived type. Use option -P to remove this class.\n", s); fprintf(stream, "class %s\n{ public:\n", s); } fprintf(stream, elementformat, types.tname(NULL, NULL, *i), "__item"); fprintf(stream, ";\n"); for (MapOfStringToString::const_iterator j = definitions.builtinTypeDerivations().begin(); j != definitions.builtinTypeDerivations().end(); ++j) { if (!strcmp(*i, (*j).second)) { fprintf(stream, "/// A transient pointer to a derived type value that replaces the value of this base type %s when non-NULL\n", s); fprintf(stream, derivedformat, types.tnamenoptr(NULL, NULL, (*j).first), types.aname(NULL, NULL, (*j).first)); fprintf(stream, "\n"); } } if (cflag) { fprintf(stream, "};\n\n"); } else { fprintf(stream, pointerformat, "struct soap", soap_context); fprintf(stream, ";\n"); fprintf(stream, "};\n\n"); } } } fprintf(stream, "/// Wrapper xsd__anyType_ for built-in XSD type \"xs:anyType\".\n///\n"); if (cflag) { if (!Lflag) fprintf(stream, "/// @note Use option -P to remove this struct.\n"); fprintf(stream, "struct xsd__anyType_\n{\n"); } else { if (!Lflag) fprintf(stream, "/// @note Call virtual method soap_type() generated by soapcpp2 to check runtime type is SOAP_TYPE_xsd__anyType_ or a derived type. Use option -P to remove this class.\n"); fprintf(stream, "class xsd__anyType_\n{ public:\n"); } if (dflag) fprintf(stream, elementformat, "xsd__anyType", "__item"); else fprintf(stream, elementformat, "_XML", "__item"); fprintf(stream, ";\n"); for (SetOfString::const_iterator i = definitions.builtinTypes().begin(); i != definitions.builtinTypes().end(); ++i) { if (strcmp(*i, "xs:anyType") && strcmp(*i, "xs:anySimpleType")) { fprintf(stream, "/// A transient pointer to a derived type value that replaces the value of this root type xsd__anyType when non-NULL\n"); fprintf(stream, derivedformat, types.wname(NULL, NULL, *i, LOOKUP), types.aname(NULL, NULL, *i)); fprintf(stream, "\n"); } } for (std::vector::const_iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { for (std::vector::const_iterator simpleType = (*schema)->simpleType.begin(); simpleType != (*schema)->simpleType.end(); ++simpleType) { if ((*simpleType).name && !(*simpleType).restriction && !(*simpleType).list && !(*simpleType).union_) { fprintf(stream, "/// A transient pointer to a derived type value that replaces the value of this root type xsd__anyType when non-NULL\n"); fprintf(stream, derivedformat, types.tnamenoptr(NULL, (*schema)->targetNamespace, (*simpleType).name), types.aname(NULL, (*schema)->targetNamespace, (*simpleType).name)); fprintf(stream, "\n"); } } for (std::vector::const_iterator complexType = (*schema)->complexType.begin(); complexType != (*schema)->complexType.end(); ++complexType) { if ((*complexType).name && !(*complexType).abstract && !((*complexType).simpleContent && ((*complexType).simpleContent->restriction || (*complexType).simpleContent->extension)) && !((*complexType).complexContent && ((*complexType).complexContent->restriction || (*complexType).complexContent->extension))) { fprintf(stream, "/// A transient pointer to a derived type value that replaces the value of this root type xsd__anyType when non-NULL\n"); fprintf(stream, derivedformat, types.tnamenoptr(NULL, (*schema)->targetNamespace, (*complexType).name), types.aname(NULL, (*schema)->targetNamespace, (*complexType).name)); fprintf(stream, "\n"); } } } if (!cflag) { fprintf(stream, pointerformat, "struct soap", soap_context); fprintf(stream, ";\n"); } fprintf(stream, "};\n\n"); } // generate complex type defs. Problem: what if a simpleType restriction/extension depends on a complexType simpleContent restriction/extension? int maxLevel = baseLevel; for (baseLevel = 1; baseLevel < maxLevel; ++baseLevel) { for (std::vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { if (baseLevel == 1) banner("Schema Complex Types and Top-Level Elements", (*schema)->targetNamespace); for (std::vector::iterator complexType = (*schema)->complexType.begin(); complexType != (*schema)->complexType.end(); ++complexType) { if ((*complexType).baseLevel() == baseLevel) types.gen((*schema)->targetNamespace, NULL, *complexType, false); } for (std::vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if (!(*element).type && (*element).complexTypePtr() && (*element).complexTypePtr()->baseLevel() == baseLevel) { fprintf(stream, "/// @brief Top-level root element \"%s\":%s\n", (*schema)->targetNamespace, (*element).name); types.document((*element).annotation); types.gen((*schema)->targetNamespace, (*element).name, *(*element).complexTypePtr(), false); } } } } for (std::vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { for (std::vector::iterator simpleType = (*schema)->simpleType.begin(); simpleType != (*schema)->simpleType.end(); ++simpleType) { if ((*simpleType).baseLevel() <= 0) { const char *t = types.deftname(TYPEDEF, false, false, NULL, (*schema)->targetNamespace, (*simpleType).name, NULL); fprintf(stderr, "\nError: circular restriction/extension \n", (*simpleType).name ? (*simpleType).name : ""); fprintf(stream, "\n/// @todo !FIXME! @warning %s defines a simpleType with circular restriction/extension.\n", (*simpleType).name ? (*simpleType).name : ""); fprintf(stream, "typedef _XML %s;\n\n", t); types.ptrtypemap[t] = types.usetypemap[t] = "_XML"; } } for (std::vector::iterator complexType = (*schema)->complexType.begin(); complexType != (*schema)->complexType.end(); ++complexType) { if ((*complexType).baseLevel() <= 0) { fprintf(stderr, "\nError: circular restriction/extension \n", (*complexType).name ? (*complexType).name : ""); fprintf(stream, "\n\n/// @todo !FIXME! @warning %s defines a complexType with circular restriction/extension.\n", (*complexType).name ? (*complexType).name : ""); if (cflag) fprintf(stream, "struct %s { };\n\n", types.cname(NULL, (*schema)->targetNamespace, (*complexType).name)); else fprintf(stream, "class %s { };\n\n", types.cname(NULL, (*schema)->targetNamespace, (*complexType).name)); } } } // option to consider: generate local complexTypes iteratively /* for (MapOfStringToType::const_iterator local = types.locals.begin(); local != types.locals.end(); ++local) { types.gen(NULL, (*local).first, *(*local).second); } */ for (std::vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { if (vflag) fprintf(stderr, "\nGenerating elements in %s\n", (*schema)->targetNamespace); banner("Additional Top-Level Elements", (*schema)->targetNamespace); for (std::vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if ((*element).name && (*element).type && !(*element).abstract) { fprintf(stream, "/// @brief Top-level root element \"%s\":%s of type %s.\n", (*schema)->targetNamespace, (*element).name, (*element).type); types.document((*element).annotation); if (Oflag > 1 && !(*element).is_used()) { fprintf(stream, "// Optimization: element not used and removed\n\n"); } else { if (!types.is_defined("_", (*schema)->targetNamespace, (*element).name)) { if (gflag) { const char *s = types.tnamenoptr(NULL, (*schema)->targetNamespace, (*element).type); const char *t = types.deftname(TYPEDEF, false, false, "_", (*schema)->targetNamespace, (*element).name, s); fprintf(stream, "typedef %s %s;\n\n", s, t); } else if (!Lflag) { fprintf(stream, "/// @note Use wsdl2h option -g to auto-generate a top-level root element declaration.\n\n"); } } else { const char *s = types.cname("_", (*schema)->targetNamespace, (*element).name); const char *t = types.deftypemap[s]; if (t && *t) { fprintf(stream, "/// Imported element \"%s\" from typemap %s.\n", s, mapfile ? mapfile : ""); types.format(t); } else { fprintf(stream, "// \"%s\" element definition intentionally left blank.\n", types.cname("_", (*schema)->targetNamespace, (*element).name)); } } } } } if (vflag) fprintf(stderr, "\nGenerating attributes in %s\n", (*schema)->targetNamespace); banner("Additional Top-Level Attributes", (*schema)->targetNamespace); for (std::vector::iterator attribute = (*schema)->attribute.begin(); attribute != (*schema)->attribute.end(); ++attribute) { if ((*attribute).name && (*attribute).type) { fprintf(stream, "/// @brief Top-level attribute \"%s\":%s of simpleType %s.\n", (*schema)->targetNamespace, (*attribute).name, (*attribute).type); types.document((*attribute).annotation); if (Oflag > 1 && !(*attribute).is_used()) { fprintf(stream, "// Optimization: attribute not used and removed\n\n"); } else { if (!types.is_defined("_", (*schema)->targetNamespace, (*attribute).name)) { if (gflag) { const char *s = types.tnamenoptr(NULL, (*schema)->targetNamespace, (*attribute).type); const char *t = types.deftname(TYPEDEF, false, false, "_", (*schema)->targetNamespace, (*attribute).name, s); fprintf(stream, "typedef %s %s;\n\n", s, t); } else if (!Lflag) { fprintf(stream, "/// @note Use wsdl2h option -g to auto-generate a top-level attribute declaration.\n\n"); } } else { const char *s = types.cname("_", (*schema)->targetNamespace, (*attribute).name); const char *t = types.deftypemap[s]; if (t && *t) { fprintf(stream, "/// Imported attribute \"%s\" from typemap %s.\n", s, mapfile ? mapfile : ""); types.format(t); } else fprintf(stream, "// \"%s\" attribute definition intentionally left blank.\n", types.cname("_", (*schema)->targetNamespace, (*attribute).name)); } } } } } } if (vflag) fprintf(stderr, "\nCollecting service bindings\n"); collect(definitions); if (!services.empty()) { banner("Services"); if (soap12) fprintf(stream, "// This service supports SOAP 1.2 namespaces:\n#import \"soap12.h\"\n"); for (MapOfStringToService::const_iterator service1 = services.begin(); service1 != services.end(); ++service1) { Service *sv = (*service1).second; if (sv) { fprintf(stream, "\n"); if (sv->name) fprintf(stream, serviceformat, sv->prefix, "name", sv->name, ""); if (sv->type) fprintf(stream, serviceformat, sv->prefix, "type", sv->type, ""); for (SetOfString::const_iterator port = sv->location.begin(); port != sv->location.end(); ++port) fprintf(stream, serviceformat, sv->prefix, "port", (*port), ""); if (sv->URI && *sv->URI) fprintf(stream, serviceformat, sv->prefix, "namespace", sv->URI, ""); if (sv->transport) fprintf(stream, serviceformat, sv->prefix, "transport", sv->transport, ""); } } fprintf(stream, "\n/** @mainpage %s Definitions\n", defs); if (definitions.version) { section(defs, "_version Version", NULL); text(definitions.version); } if (definitions.documentation) { section(defs, "_documentation Documentation", NULL); text(definitions.documentation); } if (definitions.types && definitions.types->documentation) { section(defs, "_types Schema Type Information", NULL); text(definitions.types->documentation); } section(defs, "_bindings Service Bindings", NULL); for (MapOfStringToService::const_iterator service2 = services.begin(); service2 != services.end(); ++service2) { Service *sv = (*service2).second; if (sv && sv->name) fprintf(stream, "\n - @ref %s\n", sv->name); } section(defs, "_more More Information", NULL); fprintf(stream, "\n - @ref page_notes \"Notes\"\n"); if (!definitions.vprop__property.empty()) fprintf(stream, "\n - @ref page_bpel \"BPEL 2.0 Variables\"\n"); fprintf(stream, "\n - @ref page_XMLDataBinding \"XML Data Binding\"\n"); if (!jflag) fprintf(stream, "\n - @ref SOAP_ENV__Header \"SOAP Header Content\" (when applicable)\n"); if (!jflag) fprintf(stream, "\n - @ref SOAP_ENV__Detail \"SOAP Fault Detail Content\" (when applicable)\n"); fprintf(stream, "\n\n*/\n"); for (MapOfStringToService::const_iterator service3 = services.begin(); service3 != services.end(); ++service3) { Service *sv = (*service3).second; if (sv && sv->name) { fprintf(stream, "\n/** "); page(sv->name, " Binding", sv->name); for (MapOfStringToString::const_iterator service_doc = sv->service_documentation.begin(); service_doc != sv->service_documentation.end(); ++service_doc) { const char *name = types.aname(NULL, NULL, (*service_doc).first); section(name, "_service Service Documentation", (*service_doc).first); text((*service_doc).second); } for (MapOfStringToString::const_iterator port_doc = sv->port_documentation.begin(); port_doc != sv->port_documentation.end(); ++port_doc) { const char *name = types.aname(NULL, NULL, (*port_doc).first); section(name, "_port Port Documentation", (*port_doc).first); text((*port_doc).second); } for (MapOfStringToString::const_iterator binding_doc = sv->binding_documentation.begin(); binding_doc != sv->binding_documentation.end(); ++binding_doc) { const char *name = types.aname(NULL, NULL, (*binding_doc).first); section(name, "_binding Binding Documentation", (*binding_doc).first); text((*binding_doc).second); } section(sv->name, "_operations Operations of Binding", sv->name); for (std::vector::const_iterator op = sv->operation.begin(); op != sv->operation.end(); ++op) { if (*op && (*op)->input && (*op)->input_name) fprintf(stream, "\n - @ref %s\n", (*op)->input_name); else if (*op && (*op)->output_name) fprintf(stream, "\n - @ref %s\n", (*op)->output_name); } if (!sv->role.empty()) { section(sv->name, "_plnk BPEL 2.0 Partner Links for Binding", sv->name); gen_plnk(*sv); } section(sv->name, "_ports Default endpoints of Binding", sv->name); for (SetOfString::const_iterator port = sv->location.begin(); port != sv->location.end(); ++port) fprintf(stream, "\n - %s\n", *port); if (!sv->policy.empty()) { section(sv->name, "_policy Policy of Binding", sv->name); fprintf(stream, "\nSee Section @ref %s_policy_enablers\n", sv->name); gen_policy(*sv, sv->policy, "service endpoint ports", types); } if (!service_prefix && !Lflag) { if (binding_count > 1) fprintf(stream, "\n@note Multiple service bindings collected as one, use wsdl2h option -Nname to produce a separate service for each binding\n"); else fprintf(stream, "\n@note Use wsdl2h option -Nname to change the service binding prefix name\n"); } fprintf(stream, "\n\n*/\n"); } } } generate(); if (definitions.types) { gen_vprop(definitions, types); banner("XML Data Binding"); fprintf(stream, "\n/** "); page("page_XMLDataBinding", " XML Data Binding", NULL); fprintf(stream, "\nSOAP/XML services use data bindings that are contractually bound by WSDLs and\nare auto-generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data\nbindings are adopted from XML schemas as part of the WSDL types section or when\nrunning wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings.\n"); if (!Lflag) fprintf(stream, "\n@note The following readers and writers are C/C++ data type (de)serializers\nauto-generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the\n(de)serialization code, which is stored in soapC.c[pp]. Include \"soapH.h\" in\nyour code to import these data type and function declarations. Only use the\nsoapcpp2-generated files in your project build. Do not include the wsdl2h-\ngenerated .h file in your code.\n\n@note Data can be read and deserialized from:\n - an int file descriptor, using soap->recvfd = fd\n - a socket, using soap->socket = (int)...\n - a C++ stream (istream, stringstream), using soap->is = (istream*)...\n - a C string, using soap->is = (const char*)...\n - any input, using the soap->frecv() callback\n\n@note Data can be serialized and written to:\n - an int file descriptor, using soap->sendfd = (int)...\n - a socket, using soap->socket = (int)...\n - a C++ stream (ostream, stringstream), using soap->os = (ostream*)...\n - a C string, using soap->os = (const char**)...\n - any output, using the soap->fsend() callback\n\n@note The following options are available for (de)serialization control:\n - soap->encodingStyle = NULL; to remove SOAP 1.1/1.2 encodingStyle\n - soap_set_mode(soap, SOAP_XML_TREE); XML without id-ref (no cycles!)\n - soap_set_mode(soap, SOAP_XML_GRAPH); XML with id-ref (including cycles)\n - soap_set_namespaces(soap, struct Namespace *nsmap); to set xmlns bindings\n\n"); for (std::vector::const_iterator schema5 = definitions.types->xs__schema_.begin(); schema5 != definitions.types->xs__schema_.end(); ++schema5) { const char *prefix = types.nsprefix(NULL, (*schema5)->targetNamespace); fprintf(stream, "\n*/\n\n/**\n\n@section %s Top-level root elements of schema \"%s\"\n", prefix ? prefix : "default", (*schema5)->targetNamespace); for (std::vector::const_iterator element = (*schema5)->element.begin(); element != (*schema5)->element.end(); ++element) { if (prefix && *prefix) fprintf(stream, "\n - <%s:%s> ", prefix, (*element).name); else fprintf(stream, "\n - <%s> ", (*element).name); const char *cname = types.cname("_", (*schema5)->targetNamespace, (*element).name); if (types.is_defined("_", (*schema5)->targetNamespace, (*element).name)) { fprintf(stream, "@ref %s\n", cname); if (!Lflag) { const char *pname = types.pname(true, false, "_", (*schema5)->targetNamespace, (*element).name); fprintf(stream, " @code\n // Reader (returns SOAP_OK on success):\n soap_read_%s(struct soap*, %s);\n // Writer (returns SOAP_OK on success):\n soap_write_%s(struct soap*, %s);\n", cname, pname, cname, pname); fprintf(stream, " // REST GET (returns SOAP_OK on success):\n soap_GET_%s(struct soap*, const char *URL, %s);\n // REST PUT (returns SOAP_OK on success):\n soap_PUT_%s(struct soap*, const char *URL, %s);\n", cname, pname, cname, pname); fprintf(stream, " // REST POST (returns SOAP_OK on success):\n soap_POST_send_%s(struct soap*, const char *URL, %s);\n soap_POST_recv_%s(struct soap*, %s);\n @endcode\n", cname, pname, cname, pname); } } else { fprintf(stream, "(use wsdl2h option -g to auto-generate type %s)\n", cname); } } } fprintf(stream, "\n*/\n"); } if (cppnamespace) fprintf(stream, "\n} // namespace %s\n", cppnamespace); fprintf(stream, "\n/* End of %s */\n", outfile ? outfile : "file"); } void Definitions::generate() { MapOfStringToMessage headers; MapOfStringToMessage headerfaults; MapOfStringToMessage faults; const char *t; for (MapOfStringToService::const_iterator service1 = services.begin(); service1 != services.end(); ++service1) { if ((*service1).second) { for (MapOfStringToMessage::const_iterator header = (*service1).second->header.begin(); header != (*service1).second->header.end(); ++header) headers[(*header).first] = (*header).second; for (MapOfStringToMessage::const_iterator headerfault = (*service1).second->headerfault.begin(); headerfault != (*service1).second->headerfault.end(); ++headerfault) headerfaults[(*headerfault).first] = (*headerfault).second; for (MapOfStringToMessage::const_iterator fault = (*service1).second->fault.begin(); fault != (*service1).second->fault.end(); ++fault) faults[(*fault).first] = (*fault).second; } } // Generate SOAP Header definition t = types.deftypemap["SOAP_ENV__Header"]; if (t && *t) { banner("Custom SOAP Header"); types.format(t); } else if (!jflag && (!headers.empty() || !headerfaults.empty())) { banner("SOAP Header"); fprintf(stream, "/**\n\nThe SOAP Header is part of the gSOAP context and its content is accessed\nthrough the soap.header variable. You may have to set the soap.actor variable\nto serialize SOAP Headers with SOAP-ENV:actor or SOAP-ENV:role attributes.\nUse option -j to remove entire SOAP Header definition.\nUse option -k to remove the mustUnderstand qualifiers.\n\n*/\n"); fprintf(stream, "mutable struct SOAP_ENV__Header\n{\n"); for (MapOfStringToMessage::const_iterator header = headers.begin(); header != headers.end(); ++header) { if ((*header).second->use == encoded && (*header).second->URI && *(*header).second->URI) fprintf(stream, schemaformat, types.nsprefix(NULL, (*header).second->URI), "namespace", (*header).second->URI); comment("Header", (*header).first, "WSDL", (*header).second->ext_documentation); comment("Header", (*header).first, "SOAP", (*header).second->documentation); if ((*header).second->mustUnderstand && !kflag) { fprintf(stream, elementformat, "mustUnderstand", "// must be understood by receiver"); fprintf(stream, "\n"); } if ((*header).second->part && (*header).second->part->elementPtr()) { fprintf(stream, "/// \"%s\" SOAP Header part element.\n", (*header).second->part->name); if ((*header).second->part->elementPtr()->type && (*header).second->part->element) fprintf(stream, elementformat, types.pname(true, false, NULL, NULL, (*header).second->part->elementPtr()->type), types.aname(NULL, NULL, (*header).second->part->element)); else if ((*header).second->part->element) fprintf(stream, elementformat, types.pname(true, false, "_", NULL, (*header).second->part->element), types.aname(NULL, NULL, (*header).second->part->element)); else fprintf(stream, elementformat, types.pname(true, false, "_", NULL, (*header).second->part->elementPtr()->name), (*header).first); fprintf(stream, ";\n"); } else if ((*header).second->part && (*header).second->part->type) { fprintf(stream, "/// \"%s\" SOAP Header part type.\n", (*header).second->part->type); fprintf(stream, elementformat, types.pname(true, false, NULL, NULL, (*header).second->part->type), types.aname(NULL, (*header).second->URI, (*header).second->part->name)); fprintf(stream, ";\n"); } else if ((*header).second->element) { fprintf(stream, "/// \"%s\" SOAP Header element.", (*header).second->name); (*header).second->generate(types, ";", false, true, false, true, false); fprintf(stream, "\n"); } else { if ((*header).second->part && (*header).second->part->element) fprintf(stream, elementformat, types.pname(true, false, "_", NULL, (*header).second->part->element), (*header).first); else fprintf(stream, pointerformat, (*header).first, (*header).first); fprintf(stream, ";\t///< @todo Please check element name and type (imported type)\n"); } } for (MapOfStringToMessage::const_iterator headerfault = headerfaults.begin(); headerfault != headerfaults.end(); ++headerfault) { if ((*headerfault).second->use == encoded && (*headerfault).second->URI && *(*headerfault).second->URI) fprintf(stream, schemaformat, types.nsprefix(NULL, (*headerfault).second->URI), "namespace", (*headerfault).second->URI); comment("HeaderFault", (*headerfault).first, "WSDL", (*headerfault).second->ext_documentation); comment("HeaderFault", (*headerfault).first, "SOAP", (*headerfault).second->documentation); if ((*headerfault).second->mustUnderstand && !kflag) { fprintf(stream, elementformat, "mustUnderstand", "// must be understood by receiver"); fprintf(stream, "\n"); } if ((*headerfault).second->part && (*headerfault).second->part->elementPtr()) { fprintf(stream, "/// \"%s\" SOAP HeaderFault part element optionally contains fault details.\n", (*headerfault).second->part->name); if ((*headerfault).second->part->elementPtr()->type && (*headerfault).second->part->element) fprintf(stream, elementformat, types.pname(true, false, NULL, NULL, (*headerfault).second->part->elementPtr()->type), types.aname(NULL, NULL, (*headerfault).second->part->element)); else if ((*headerfault).second->part->element) fprintf(stream, elementformat, types.pname(true, false, "_", NULL, (*headerfault).second->part->element), types.aname(NULL, NULL, (*headerfault).second->part->element)); else fprintf(stream, elementformat, types.pname(true, false, "_", NULL, (*headerfault).second->part->elementPtr()->name), (*headerfault).first); fprintf(stream, ";\n"); } else if ((*headerfault).second->part && (*headerfault).second->part->type) { fprintf(stream, "/// \"%s\" SOAP HeaderFault part type optionally contains fault details.\n", (*headerfault).second->part->type); fprintf(stream, elementformat, types.pname(true, false, NULL, NULL, (*headerfault).second->part->type), types.aname(NULL, (*headerfault).second->URI, (*headerfault).second->part->name)); fprintf(stream, ";\n"); } else if ((*headerfault).second->element) { fprintf(stream, "/// \"%s\" SOAP HeaderFault element optionally contains fault details.", (*headerfault).second->name); (*headerfault).second->generate(types, ";", false, true, false, true, false); fprintf(stream, "\n"); } else { if ((*headerfault).second->part && (*headerfault).second->part->element) fprintf(stream, elementformat, types.pname(true, false, "_", NULL, (*headerfault).second->part->element), (*headerfault).first); else fprintf(stream, pointerformat, (*headerfault).first, (*headerfault).first); fprintf(stream, ";\t///< @todo Please check element name and type (imported type)\n"); } } types.modify("SOAP_ENV__Header"); fprintf(stream, "\n};\n\n"); } // Generate Fault detail element definitions for (MapOfStringToMessage::const_iterator fault = faults.begin(); fault != faults.end(); ++fault) { if ((*fault).second->use == encoded) { fprintf(stream, schemaformat, types.nsprefix(NULL, (*fault).second->URI), "namespace", (*fault).second->URI); fprintf(stream, "/// SOAP Fault message \"%s\":%s.\n", (*fault).second->URI, (*fault).second->message->name); comment("Fault", (*fault).first, "WSDL", (*fault).second->ext_documentation); comment("Fault", (*fault).first, "SOAP", (*fault).second->documentation); if (cflag) fprintf(stream, "struct %s\n{", (*fault).first); else fprintf(stream, "class %s\n{ public:", (*fault).first); (*fault).second->generate(types, ";", false, true, false, true, false); if (!cflag && soap_context && *soap_context) { fprintf(stream, "\n"); fprintf(stream, pointerformat, "struct soap", soap_context); fprintf(stream, ";"); } fprintf(stream, "\n};\n\n"); if (cflag) fprintf(stream, "typedef struct %s %s;\n\n", (*fault).first, (*fault).first); } } t = types.deftypemap["SOAP_ENV__Detail"]; if (t && *t) { banner("Custom SOAP Fault Detail"); types.format(t); } else if (!jflag && !faults.empty()) { SetOfString fault_elements; banner("SOAP Fault Detail"); fprintf(stream, "/**\n\nThe SOAP Fault is part of the gSOAP context and its content is accessed\nthrough the soap.fault->detail variable (SOAP 1.1) or the\nsoap.fault->SOAP_ENV__Detail variable (SOAP 1.2).\nUse wsdl2h option -j to omit these declarations.\n\n*/\n"); fprintf(stream, "mutable struct SOAP_ENV__Detail\n{\n"); if (dflag) { const char *t = types.tname(NULL, NULL, "xsd:anyAttribute"); fprintf(stream, attributeformat, t, "__anyAttribute"); fprintf(stream, ";\t///< Catch any attribute content in DOM.\n"); } else { fprintf(stream, "/// xsd:anyAttribute omitted: to parse attribute content of the Detail element into DOM anyAttribute, use wsdl2h option -d.\n"); } types.modify("SOAP_ENV__Detail"); /* See below */ /* The DOM representation is not desired since faultdetail is NULL. However, future options may reenable this feature (see keep code here). const char *t = types.tname(NULL, NULL, "xsd:any"); fprintf(stream, elementformat, t, "__any"); if (dflag) fprintf(stream, ";\t///< Catch any element content in DOM.\n"); else fprintf(stream, ";\t///< Catch any element content in XML string.\n"); */ for (MapOfStringToMessage::const_iterator fault = faults.begin(); fault != faults.end(); ++fault) { comment("Fault", (*fault).first, "WSDL", (*fault).second->ext_documentation); comment("Fault", (*fault).first, "SOAP", (*fault).second->documentation); if ((*fault).second->message) { const char *name = (*fault).second->message->name; if (!name) name = "?"; if ((*fault).second->use == literal) { for (std::vector::const_iterator part = (*fault).second->message->part.begin(); part != (*fault).second->message->part.end(); ++part) { if ((*part).elementPtr()) { if (fault_elements.find((*part).element) == fault_elements.end()) { fprintf(stream, "/// SOAP Fault message \"%s\" part \"%s\" element \"%s\".\n", name, (*part).name ? (*part).name : "", (*part).element ? (*part).element : ""); if ((*part).elementPtr()->type) fprintf(stream, elementformat, types.pname(true, false, NULL, NULL, (*part).elementPtr()->type), types.aname(NULL, (*fault).second->URI, (*part).element)); else fprintf(stream, elementformat, types.pname(true, false, "_", NULL, (*part).element), types.aname(NULL, (*fault).second->URI, (*part).element)); fprintf(stream, ";\n"); fault_elements.insert((*part).element); } } else if ((*part).name && (*part).type) { if (fault_elements.find((*part).name) == fault_elements.end()) { fprintf(stream, schemaformat, types.nsprefix(NULL, (*fault).second->URI), "namespace", (*fault).second->URI); fprintf(stream, "/// SOAP Fault message \"%s\" part \"%s\" type \"%s\".\n", name, (*part).name, (*part).type); fprintf(stream, elementformat, types.pname(true, false, NULL, NULL, (*part).type), types.aname(NULL, (*fault).second->URI, (*part).name)); fprintf(stream, ";\n"); fault_elements.insert((*part).name); } } else fprintf(stream, "// Unknown SOAP Fault message \"%s\":%s part \"%s\"\n", (*fault).second->URI, name, (*part).name ? (*part).name : ""); } } else { fprintf(stream, "/// SOAP Fault message \"%s\":%s\n", (*fault).second->URI, name); fprintf(stream, pointerformat, (*fault).first, types.aname(NULL, (*fault).second->URI, (*fault).second->message->name)); fprintf(stream, ";\n"); } } else if ((*fault).second->element) { if (fault_elements.find((*fault).second->name) == fault_elements.end()) { fprintf(stream, "/// SOAP Fault message \"%s\":%s\n", (*fault).second->URI, (*fault).second->element->name); fprintf(stream, elementformat, types.pname(true, false, "_", (*fault).second->URI, (*fault).second->element->name), (*fault).second->name); fprintf(stream, ";\n"); fault_elements.insert((*fault).second->name); } } } fprintf(stream, elementformat, "int", "__type"); fprintf(stream, ";\t///< set to SOAP_TYPE_T for a serializable type T\n"); fprintf(stream, pointerformat, "void", "fault"); fprintf(stream, ";\t///< points to serializable value of type T or NULL\n"); fprintf(stream, elementformat, "_XML", "__any"); fprintf(stream, ";\t///< Catch any other content in XML string.\n"); fprintf(stream, "};\n\n"); } /* The SOAP Fault struct below is autogenerated by soapcpp2 (kept here for future mods) if (!mflag && !faults.empty()) { fprintf(stream, "struct SOAP_ENV__Code\n{\n"); fprintf(stream, elementformat, "_QName", "SOAP_ENV__Value"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "char", "SOAP_ENV__Node"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "char", "SOAP_ENV__Role"); fprintf(stream, ";\n};\n"); fprintf(stream, "struct SOAP_ENV__Detail\n{\n"); fprintf(stream, elementformat, "int", "__type"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "void", "fault"); fprintf(stream, ";\n"); fprintf(stream, elementformat, "_XML", "__any"); fprintf(stream, ";\n};\n"); fprintf(stream, "struct SOAP_ENV__Fault\n{\n"); fprintf(stream, elementformat, "_QName", "faultcode"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "char", "faultstring"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "char", "faultactor"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "struct SOAP_ENV__Detail", "detail"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "struct SOAP_ENV__Code", "SOAP_ENV__Code"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "char", "SOAP_ENV__Reason"); fprintf(stream, ";\n"); fprintf(stream, pointerformat, "struct SOAP_ENV__Detail", "SOAP_ENV__Detail"); fprintf(stream, ";\n};\n"); } */ for (MapOfStringToService::const_iterator service2 = services.begin(); service2 != services.end(); ++service2) if ((*service2).second) (*service2).second->generate(types); } //////////////////////////////////////////////////////////////////////////////// // // Service methods // //////////////////////////////////////////////////////////////////////////////// Service::Service() { prefix = NULL; URI = NULL; name = NULL; type = NULL; transport = NULL; } void Service::generate(Types& types) { const char *method_name; banner("Service Binding", name); for (std::vector::const_iterator op2 = operation.begin(); op2 != operation.end(); ++op2) { if (*op2 && ((*op2)->input || bflag)) { bool flag = false, anonymous = ((*op2)->style != document && (*op2)->parameterOrder != NULL); if (!(*op2)->input) method_name = (*op2)->output_name; else method_name = (*op2)->input_name; banner("Service Operation", method_name); if ((*op2)->output && (*op2)->output_name) { if ((*op2)->style == document) flag = ((*op2)->output->element || ((*op2)->output->message && (*op2)->output->message->part.size() == 1)); else if (!wflag) flag = ((*op2)->output->element || ((*op2)->output->message && (*op2)->output->use == encoded && (*op2)->output->message->part.size() == 1 && !(*(*op2)->output->message->part.begin()).simpleTypePtr() && !(*(*op2)->output->message->part.begin()).complexTypePtr())); if (flag && (*op2)->input && (*op2)->output && (*op2)->input->message && (*op2)->output->message && !(*op2)->output->message->part.empty() && (*(*op2)->output->message->part.begin()).element) for (std::vector::const_iterator part = (*op2)->input->message->part.begin(); part != (*op2)->input->message->part.end(); ++part) if ((*part).element && !strcmp((*part).element, (*(*op2)->output->message->part.begin()).element)) flag = false; if (!flag) { if (bflag) fprintf(stream, "/* soapcpp2 generates the following struct automatically for your use:\n"); fprintf(stream, "/// Operation response struct \"%s\" of operation \"%s\".\n", (*op2)->output_name, method_name); fprintf(stream, "struct %s\n{", (*op2)->output_name); (*op2)->output->generate(types, ";", anonymous, true, false, false, (*op2)->is_rest); fprintf(stream, "\n};\n"); if (bflag) fprintf(stream, "*/\n"); } } fprintf(stream, "\n/** Operation \"%s\" of service binding \"%s\".\n", method_name, name); if ((*op2)->documentation) text((*op2)->documentation); if ((*op2)->operation_documentation) text((*op2)->operation_documentation); if ((*op2)->input && (*op2)->input->documentation) { fprintf(stream, "Input request:\n"); text((*op2)->input->documentation); } if ((*op2)->input && (*op2)->input->ext_documentation) { fprintf(stream, "Input request:\n"); text((*op2)->input->ext_documentation); } if ((*op2)->output) { if ((*op2)->output->documentation) { fprintf(stream, "Output response:\n"); text((*op2)->output->documentation); } if ((*op2)->output->ext_documentation) { fprintf(stream, "Output response:\n"); text((*op2)->output->ext_documentation); } } gen_policy(*this, (*op2)->policy, "operation", types); if ((*op2)->input) { gen_policy(*this, (*op2)->input->policy, "request message", types); if ((*op2)->input->content) { fprintf(stream, "\n - Request message MIME content"); if ((*op2)->input->content->type) { fprintf(stream, " type: "); text((*op2)->input->content->type); } if ((*op2)->input->content->type && !strcmp((*op2)->input->content->type, "application/x-www-form-urlencoded")) fprintf(stream, "\n Use the httpform.c plugin to retrieve key-value pairs from the REST request\n message form data at the server side (client side is automated).\n"); else fprintf(stream, "\n @todo This form of MIME content is not automatically handled.\n"); } } if ((*op2)->output) { gen_policy(*this, (*op2)->output->policy, "response message", types); if ((*op2)->output->content) { fprintf(stream, "\n - Response message MIME content"); if ((*op2)->output->content->type) { fprintf(stream, " type: "); text((*op2)->output->content->type); } fprintf(stream, "\n @todo This form of MIME content response is not automatically handled.\n Use one-way request and implement code to parse response.\n"); } } else fprintf(stream, "\n - One-way service request message\n"); if ((*op2)->mep) fprintf(stream, "\n - SOAP MEP: \"%s\"\n", ((*op2)->mep)); if ((*op2)->style == document) fprintf(stream, "\n - %s %s messaging\n", (*op2)->protocol, (*op2)->input && (*op2)->input->content && (*op2)->input->content->type ? (*op2)->input->content->type : "document/literal style"); else if ((*op2)->input) { if ((*op2)->input->use == literal) fprintf(stream, "\n - %s literal messaging\n", (*op2)->protocol); else if ((*op2)->input->encodingStyle) fprintf(stream, "\n - %s RPC encodingStyle=\"%s\"\n", (*op2)->protocol, (*op2)->input->encodingStyle); else fprintf(stream, "\n - %s RPC encoded messaging\n", (*op2)->protocol); } if ((*op2)->output) { if (!(*op2)->input || (*op2)->input->use != (*op2)->output->use) { if ((*op2)->output->use == literal) fprintf(stream, "\n - %s literal response messages\n", (*op2)->protocol); else if ((*op2)->output->encodingStyle) fprintf(stream, "\n - %s RPC response encodingStyle=\"%s\"\n", (*op2)->protocol, (*op2)->output->encodingStyle); else fprintf(stream, "\n - %s RPC encoded response messages\n", (*op2)->protocol); } } if (!location.empty()) { fprintf(stream, "\n - Default endpoints:\n"); for (SetOfString::const_iterator port = location.begin(); port != location.end(); ++port) fprintf(stream, " - %s\n", *port); } if ((*op2)->action) { if (*(*op2)->action) fprintf(stream, "\n - Default SOAP action or REST location path:\n - \"%s\"\n", (*op2)->action); } if ((*op2)->input) { if ((*op2)->input->action) fprintf(stream, "\n - Addressing input action: \"%s\"\n", (*op2)->input->action); } if ((*op2)->output) { if ((*op2)->output->action) fprintf(stream, "\n - Addressing output action: \"%s\"\n", (*op2)->output->action); } for (std::vector::const_iterator infault = (*op2)->infault.begin(); infault != (*op2)->infault.end(); ++infault) { if ((*infault)->message) { if ((*infault)->use == literal) { for (std::vector::const_iterator part = (*infault)->message->part.begin(); part != (*infault)->message->part.end(); ++part) { if ((*part).element) fprintf(stream, "\n - Input Fault: %s (literal)\n", (*part).element); else if ((*part).name && (*part).type) fprintf(stream, "\n - Input Fault: %s (literal)\n", (*part).name); } } else if ((*infault)->message->name) fprintf(stream, "\n - Input Fault: %s\n", (*infault)->name); if ((*infault)->message->name && (*infault)->action) fprintf(stream, " - Input Fault addressing action: \"%s\"\n", (*infault)->action); } else if ((*infault)->name) fprintf(stream, "\n - Input Fault: %s (literal)\n", (*infault)->name); if ((*infault)->body_parts) fprintf(stream, " Input Fault code: %s\n", (*infault)->body_parts); text((*infault)->documentation); text((*infault)->ext_documentation); gen_policy(*this, (*infault)->policy, "fault message", types); } for (std::vector::const_iterator outfault = (*op2)->outfault.begin(); outfault != (*op2)->outfault.end(); ++outfault) { if ((*outfault)->message) { if ((*outfault)->use == literal) { for (std::vector::const_iterator part = (*outfault)->message->part.begin(); part != (*outfault)->message->part.end(); ++part) { if ((*part).element) fprintf(stream, "\n - Output Fault: %s (literal)\n", (*part).element); else if ((*part).name && (*part).type) fprintf(stream, "\n - Output Fault: %s (literal)\n", (*part).name); } } else if ((*outfault)->message->name) fprintf(stream, "\n - Output Fault: %s\n", (*outfault)->name); if ((*outfault)->message->name && (*outfault)->action) fprintf(stream, " - Output Fault addressing action: \"%s\"\n", (*outfault)->action); } else if ((*outfault)->name) fprintf(stream, "\n - Output Fault: %s (literal)\n", (*outfault)->name); if ((*outfault)->body_parts) fprintf(stream, " Output Fault code: %s\n", (*outfault)->body_parts); text((*outfault)->documentation); text((*outfault)->ext_documentation); gen_policy(*this, (*outfault)->policy, "fault message", types); } if ((*op2)->input) { if (!(*op2)->input->header.empty()) fprintf(stream, "\n - Request message has mandatory header part(s) (see @ref SOAP_ENV__Header):\n"); for (std::vector::const_iterator inputheader = (*op2)->input->header.begin(); inputheader != (*op2)->input->header.end(); ++inputheader) { if ((*inputheader).part) { if ((*inputheader).use == encoded && (*inputheader).namespace_) fprintf(stream, " - %s\n", types.aname(NULL, (*inputheader).namespace_, (*inputheader).part)); else if ((*inputheader).partPtr() && (*inputheader).partPtr()->element) fprintf(stream, " - %s\n", types.aname(NULL, NULL, (*inputheader).partPtr()->element)); } } } if ((*op2)->input && (*op2)->input->multipartRelated) { int k = 2; fprintf(stream, "\n - Request message MIME multipart/related attachments:\n"); for (std::vector::const_iterator part = (*op2)->input->multipartRelated->part.begin(); part != (*op2)->input->multipartRelated->part.end(); ++part) { if ((*part).soap__body_) { fprintf(stream, " -# MIME attachment with SOAP Body and mandatory header part(s):\n"); for (std::vector::const_iterator header = (*part).soap__header_.begin(); header != (*part).soap__header_.end(); ++header) { if ((*header).part) { if ((*header).use == encoded && (*header).namespace_) fprintf(stream, " - %s\n", types.aname(NULL, (*header).namespace_, (*header).part)); else if ((*header).partPtr() && (*header).partPtr()->element) fprintf(stream, " - %s\n", types.aname(NULL, NULL, (*header).partPtr()->element)); } } } else { fprintf(stream, " -# MIME attachment %d:\n", k++); for (std::vector::const_iterator content = (*part).content.begin(); content != (*part).content.end(); ++content) { if ((*content).part) { fprintf(stream, " - part: "); text((*content).part); } if ((*content).type) { fprintf(stream, " - type: "); text((*content).type); } } } } } if ((*op2)->input && (*op2)->input->layout) fprintf(stream, "\n - Request message has DIME attachments in compliance with %s\n", (*op2)->input->layout); if ((*op2)->output) { if (!(*op2)->output->header.empty()) fprintf(stream, "\n - Response message has mandatory header part(s): (see @ref SOAP_ENV__Header)\n"); for (std::vector::const_iterator outputheader = (*op2)->output->header.begin(); outputheader != (*op2)->output->header.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, " - %s\n", types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, " - %s\n", types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } } if ((*op2)->output && (*op2)->output_name && (*op2)->output->multipartRelated) { int k = 2; fprintf(stream, "\n - Response message MIME multipart/related attachments\n"); for (std::vector::const_iterator part = (*op2)->output->multipartRelated->part.begin(); part != (*op2)->output->multipartRelated->part.end(); ++part) { if ((*part).soap__body_) { fprintf(stream, " -# MIME attachment with SOAP Body and mandatory header part(s):\n"); for (std::vector::const_iterator header = (*part).soap__header_.begin(); header != (*part).soap__header_.end(); ++header) { if ((*header).part) { if ((*header).use == encoded && (*header).namespace_) fprintf(stream, " - %s\n", types.aname(NULL, (*header).namespace_, (*header).part)); else if ((*header).partPtr() && (*header).partPtr()->element) fprintf(stream, " - %s\n", types.aname(NULL, NULL, (*header).partPtr()->element)); } } } else { fprintf(stream, " -# MIME attachment %d:\n", k++); for (std::vector::const_iterator content = (*part).content.begin(); content != (*part).content.end(); ++content) { if ((*content).part) { fprintf(stream, " - part: "); text((*content).part); } if ((*content).type) { fprintf(stream, " - type: "); text((*content).type); } } } } } if ((*op2)->output && (*op2)->output_name && (*op2)->output->layout) fprintf(stream, "\n - Response message has DIME attachments in compliance with %s\n", (*op2)->output->layout); if (!Lflag) { fprintf(stream, "\nC stub function (defined in soapClient.c[pp] generated by soapcpp2):\n@code\n int soap_%s_%s(\n struct soap *soap,\n NULL, // char *endpoint = NULL selects default endpoint for this operation\n NULL, // char *action = NULL selects default action for this operation\n // input parameters:", (*op2)->output ? "call" : "send", method_name); if ((*op2)->input) (*op2)->input->generate(types, ",", false, false, false, false, (*op2)->is_rest); if ((*op2)->output && (*op2)->output_name) { fprintf(stream, "\n // output parameters:"); if (flag) { if ((*op2)->style == rpc && (*op2)->output->message && !(*op2)->output->message->part.empty() && (*(*op2)->output->message->part.begin()).name) { fprintf(stream, "\n"); fprintf(stream, anonymous ? anonformat : paraformat, types.tnamenoptr(NULL, NULL, (*(*op2)->output->message->part.begin()).type), cflag ? "*" : "&", types.aname(NULL, NULL, (*(*op2)->output->message->part.begin()).name), ""); } else (*op2)->output->generate(types, "", anonymous, false, true, false, (*op2)->is_rest); } else fprintf(stream, "\n struct %s%s", (*op2)->output_name, cflag ? "*" : "&"); } fprintf(stream, "\n );\n@endcode\n\nC server function (called from the service dispatcher defined in soapServer.c[pp]):\n@code\n int %s(\n struct soap *soap,\n // input parameters:", method_name); if ((*op2)->input) (*op2)->input->generate(types, ",", false, false, false, false, (*op2)->is_rest); fprintf(stream, "\n // output parameters:"); if ((*op2)->output && (*op2)->output_name) { if (flag) { if ((*op2)->style == rpc && (*op2)->output->message && !(*op2)->output->message->part.empty() && (*(*op2)->output->message->part.begin()).name) { fprintf(stream, "\n"); fprintf(stream, anonymous ? anonformat : paraformat, types.tnamenoptr(NULL, NULL, (*(*op2)->output->message->part.begin()).type), cflag ? "*" : "&", types.aname(NULL, NULL, (*(*op2)->output->message->part.begin()).name), ""); } else (*op2)->output->generate(types, "", anonymous, false, true, false, (*op2)->is_rest); } else fprintf(stream, "\n struct %s%s", (*op2)->output_name, cflag ? "*" : "&"); } fprintf(stream, "\n );\n@endcode\n\n"); if (!cflag) { fprintf(stream, "C++ proxy class (defined in soap%sProxy.h generated with soapcpp2):\n", name); fprintf(stream, "@code\n class %sProxy;\n@endcode\n", name); fprintf(stream, "Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes;\n\n"); fprintf(stream, "C++ service class (defined in soap%sService.h generated with soapcpp2):\n", name); fprintf(stream, "@code\n class %sService;\n@endcode\n", name); fprintf(stream, "Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes;\n\n"); } } fprintf(stream, "*/\n\n"); (*op2)->generate(types, *this); } else if (*op2 && (*op2)->output) { if (!(*op2)->input) method_name = (*op2)->output_name; else method_name = (*op2)->input_name; banner("Service Operation", method_name); fprintf(stream, "\n/** Operation \"%s\" of service binding \"%s\".\n", method_name, name); if ((*op2)->documentation) text((*op2)->documentation); if ((*op2)->operation_documentation) text((*op2)->operation_documentation); if ((*op2)->output->documentation) { fprintf(stream, "Output response:\n"); text((*op2)->output->documentation); } if ((*op2)->output->ext_documentation) { fprintf(stream, "Output response:\n"); text((*op2)->output->ext_documentation); } gen_policy(*this, (*op2)->policy, "operation", types); gen_policy(*this, (*op2)->output->policy, "response message", types); fprintf(stream, "\n - One-way service response message\n"); if ((*op2)->mep) fprintf(stream, "\n - SOAP MEP: \"%s\"\n", ((*op2)->mep)); if ((*op2)->style == document) fprintf(stream, "\n - %s document/literal style messaging\n", (*op2)->protocol); else { if ((*op2)->output->use == literal) fprintf(stream, "\n - %s RPC literal messaging\n", (*op2)->protocol); else if ((*op2)->output->encodingStyle) fprintf(stream, "\n - %s RPC encodingStyle=\"%s\"\n", (*op2)->protocol, (*op2)->output->encodingStyle); else fprintf(stream, "\n - %s RPC encoded messaging\n", (*op2)->protocol); } if (!location.empty()) { fprintf(stream, "\n - Default endpoints:\n"); for (SetOfString::const_iterator port = location.begin(); port != location.end(); ++port) fprintf(stream, " - %s\n", *port); } if ((*op2)->action) { if (*(*op2)->action) fprintf(stream, "\n - Default SOAP action or REST location path:\n - \"%s\"\n", (*op2)->action); } if ((*op2)->output) { if ((*op2)->output->action) fprintf(stream, "\n - Addressing output action: \"%s\"\n", (*op2)->output->action); } for (std::vector::const_iterator outfault = (*op2)->outfault.begin(); outfault != (*op2)->outfault.end(); ++outfault) { if ((*outfault)->message) { if ((*outfault)->use == literal) { for (std::vector::const_iterator part = (*outfault)->message->part.begin(); part != (*outfault)->message->part.end(); ++part) { if ((*part).element) fprintf(stream, "\n - SOAP Output Fault: %s (literal)\n", (*part).element); else if ((*part).name && (*part).type) fprintf(stream, "\n - SOAP Output Fault: %s (literal)\n", (*part).name); } } else if ((*outfault)->message->name) fprintf(stream, "\n - SOAP Output Fault: %s\n", (*outfault)->name); if ((*outfault)->message->name && (*outfault)->action) fprintf(stream, " - SOAP Output Fault addressing action: \"%s\"\n", (*outfault)->action); } else if ((*outfault)->name) fprintf(stream, "\n - SOAP Output Fault: %s (literal)\n", (*outfault)->name); gen_policy(*this, (*outfault)->policy, "fault message", types); } if (!(*op2)->output->header.empty()) fprintf(stream, "\n - Response message has mandatory header part(s) (see @ref SOAP_ENV__Header):\n"); for (std::vector::const_iterator outputheader = (*op2)->output->header.begin(); outputheader != (*op2)->output->header.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, " - %s\n", types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, " - %s\n", types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } if ((*op2)->output->multipartRelated) { int k = 2; fprintf(stream, "\n - Response message MIME multipart/related attachments:\n"); for (std::vector::const_iterator part = (*op2)->output->multipartRelated->part.begin(); part != (*op2)->output->multipartRelated->part.end(); ++part) { if ((*part).soap__body_) { fprintf(stream, " -# MIME attachment with SOAP Body and mandatory header part(s):\n"); for (std::vector::const_iterator header = (*part).soap__header_.begin(); header != (*part).soap__header_.end(); ++header) { if ((*header).part) { if ((*header).use == encoded && (*header).namespace_) fprintf(stream, " - %s\n", types.aname(NULL, (*header).namespace_, (*header).part)); else if ((*header).partPtr() && (*header).partPtr()->element) fprintf(stream, " - %s\n", types.aname(NULL, NULL, (*header).partPtr()->element)); } } } else { fprintf(stream, " -# MIME attachment %d:\n", k++); for (std::vector::const_iterator content = (*part).content.begin(); content != (*part).content.end(); ++content) { if ((*content).part) { fprintf(stream, " - part: "); text((*content).part); } if ((*content).type) { fprintf(stream, " - type: "); text((*content).type); } } } } } if ((*op2)->output->layout) fprintf(stream, "\n - Response message has DIME attachments in compliance with %s\n", (*op2)->output->layout); if (!Lflag) { fprintf(stream, "\nC stub function (defined in soapClient.c[pp] generated by soapcpp2):\n@code\n int soap_call_%s(\n struct soap *soap,\n NULL, // char *endpoint = NULL selects default endpoint for this operation\n NULL, // char *action = NULL selects default action for this operation\n // parameters:", method_name); (*op2)->output->generate(types, ",", false, false, false, false, (*op2)->is_rest); fprintf(stream, "\n );\n@endcode\n\nC server function (called from the service dispatcher defined in soapServer.c[pp]):\n@code\n int %s(\n struct soap *soap,\n // parameters:", method_name); (*op2)->output->generate(types, ",", false, false, false, false, (*op2)->is_rest); fprintf(stream, "\n );\n@endcode\n\n"); if (!cflag) { fprintf(stream, "C++ proxy class (defined in soap%sProxy.h):\n", name); fprintf(stream, "@code\n class %sProxy;\n@endcode\n", name); fprintf(stream, "Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use proxy classes;\n\n"); fprintf(stream, "C++ service class (defined in soap%sService.h):\n", name); fprintf(stream, "@code\n class %sService;\n@endcode\n", name); fprintf(stream, "Important: use soapcpp2 option '-j' (or '-i') to generate improved and easy-to-use service classes;\n\n"); } } fprintf(stream, "*/\n\n"); (*op2)->generate(types, *this); } } gen_policy_enablers(*this); } void Service::add_import(const char *s) { if (find_if(imports.begin(), imports.end(), eqstr(s)) == imports.end()) imports.push_back(s); } void Service::del_import(const char *s) { VectorOfString::iterator i = find_if(imports.begin(), imports.end(), eqstr(s)); if (i != imports.end()) imports.erase(i); } //////////////////////////////////////////////////////////////////////////////// // // Operation methods // //////////////////////////////////////////////////////////////////////////////// void Operation::generate(Types& types, Service& service) { bool flag = false, anonymous = ((style != document) && parameterOrder != NULL); const char *method_name = NULL; (void)service; if (output) { if (style == document) flag = (output->element || (output->message && output->message->part.size() == 1)); else if (!wflag) flag = (output->element || (output->message && output->use == encoded && output->message->part.size() == 1 && !(*output->message->part.begin()).simpleTypePtr() && !(*output->message->part.begin()).complexTypePtr())); if (flag && input && input->message && output->message && !output->message->part.empty() && (*output->message->part.begin()).element) for (std::vector::const_iterator part = input->message->part.begin(); part != input->message->part.end(); ++part) if ((*part).element && !strcmp((*part).element, (*output->message->part.begin()).element)) flag = false; } if (output && output_name && bflag) { if (input) { method_name = strstr(output_name + 1, "__"); if (method_name) method_name += 2; else method_name = output_name; } else { method_name = strstr(input_name + 1, "__"); if (method_name) method_name += 2; else method_name = input_name; } if (protocol) fprintf(stream, serviceformat, prefix, "method-protocol", method_name, protocol); if (output->content && output->content->type) fprintf(stream, serviceformat, prefix, "method-mime-type", method_name, output->content->type); else if (style == document) fprintf(stream, serviceformat, prefix, "method-style", method_name, "document"); else fprintf(stream, serviceformat, prefix, "method-style", method_name, "rpc"); if (output->use == literal) fprintf(stream, serviceformat, prefix, "method-encoding", method_name, "literal"); else if (output->encodingStyle) fprintf(stream, serviceformat, prefix, "method-encoding", method_name, output->encodingStyle); else fprintf(stream, serviceformat, prefix, "method-encoding", method_name, "encoded"); if (output->action && *output->action) fprintf(stream, serviceformat, prefix, "method-action", method_name, output->action); else if (action) { if (*action) fprintf(stream, serviceformat, prefix, "method-action", method_name, action); else fprintf(stream, serviceformat, prefix, "method-action", method_name, "\"\""); } for (std::vector::const_iterator message = outfault.begin(); message != outfault.end(); ++message) { if ((*message)->message) { if ((*message)->use == literal) { for (std::vector::const_iterator part = (*message)->message->part.begin(); part != (*message)->message->part.end(); ++part) { if ((*part).element) fprintf(stream, serviceformat, prefix, "method-fault", method_name, types.aname(NULL, NULL, (*part).element)); else if ((*part).type) fprintf(stream, serviceformat, prefix, "method-fault", method_name, types.aname(NULL, (*message)->URI, (*part).name)); } } else { if ((*message)->message->name) fprintf(stream, serviceformat, prefix, "method-fault", method_name, (*message)->name); } if ((*message)->action) fprintf(stream, serviceformat, prefix, "method-fault-action", method_name, (*message)->action); } else if ((*message)->name) fprintf(stream, serviceformat, prefix, "method-fault", method_name, (*message)->name); } if (output->multipartRelated) { for (std::vector::const_iterator outputmime = output->multipartRelated->part.begin(); outputmime != output->multipartRelated->part.end(); ++outputmime) { for (std::vector::const_iterator outputheader = (*outputmime).soap__header_.begin(); outputheader != (*outputmime).soap__header_.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } for (std::vector::const_iterator content = (*outputmime).content.begin(); content != (*outputmime).content.end(); ++content) if ((*content).type) fprintf(stream, serviceformat, prefix, "method-mime-type", method_name, (*content).type); } } // TODO: add headerfault directives? for (std::vector::const_iterator outputheader = output->header.begin(); outputheader != output->header.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } for (std::vector::const_iterator outputwheader = output->wheader.begin(); outputwheader != output->wheader.end(); ++outputwheader) { if ((*outputwheader).element) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, NULL, (*outputwheader).element)); } if (input) { fprintf(stream, "/// Operation response \"%s\" of operation \"%s\".\n", output_name, input_name); fprintf(stream, "int %s(", output_name); } else fprintf(stream, "int %s(", input_name); output->generate(types, ",", anonymous, true, false, false, is_rest); fprintf(stream, "\n void\t///< One-way message: no output parameter\n);\n"); } if (!input && output && output_name) { method_name = strstr(output_name + 1, "__"); if (method_name) method_name += 2; else method_name = output_name; if (protocol) fprintf(stream, serviceformat, prefix, "method-protocol", method_name, protocol); if (output->content && output->content->type) fprintf(stream, serviceformat, prefix, "method-mime-type", method_name, output->content->type); else if (style == document) fprintf(stream, serviceformat, prefix, "method-style", method_name, "document"); else fprintf(stream, serviceformat, prefix, "method-style", method_name, "rpc"); if (output->use == literal) fprintf(stream, serviceformat, prefix, "method-encoding", method_name, "literal"); else if (output->encodingStyle) fprintf(stream, serviceformat, prefix, "method-encoding", method_name, output->encodingStyle); else fprintf(stream, serviceformat, prefix, "method-encoding", method_name, "encoded"); if (output->action && *output->action) fprintf(stream, serviceformat, prefix, "method-action", method_name, output->action); else if (action) { if (*action) fprintf(stream, serviceformat, prefix, "method-action", method_name, action); else fprintf(stream, serviceformat, prefix, "method-action", method_name, "\"\""); } for (std::vector::const_iterator message = outfault.begin(); message != outfault.end(); ++message) { if ((*message)->message) { if ((*message)->use == literal) { for (std::vector::const_iterator part = (*message)->message->part.begin(); part != (*message)->message->part.end(); ++part) { if ((*part).element) fprintf(stream, serviceformat, prefix, "method-fault", method_name, types.aname(NULL, NULL, (*part).element)); else if ((*part).type) fprintf(stream, serviceformat, prefix, "method-fault", method_name, types.aname(NULL, (*message)->URI, (*part).name)); } } else { if ((*message)->message->name) fprintf(stream, serviceformat, prefix, "method-fault", method_name, (*message)->name); } if ((*message)->action) fprintf(stream, serviceformat, prefix, "method-fault-action", method_name, (*message)->action); } else if ((*message)->name) fprintf(stream, serviceformat, prefix, "method-fault", method_name, (*message)->name); } if (output->multipartRelated) { for (std::vector::const_iterator outputmime = output->multipartRelated->part.begin(); outputmime != output->multipartRelated->part.end(); ++outputmime) { for (std::vector::const_iterator outputheader = (*outputmime).soap__header_.begin(); outputheader != (*outputmime).soap__header_.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } for (std::vector::const_iterator content = (*outputmime).content.begin(); content != (*outputmime).content.end(); ++content) if ((*content).type) fprintf(stream, serviceformat, prefix, "method-mime-type", method_name, (*content).type); } } // TODO: add headerfault directives? for (std::vector::const_iterator outputheader = output->header.begin(); outputheader != output->header.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } for (std::vector::const_iterator outputwheader = output->wheader.begin(); outputwheader != output->wheader.end(); ++outputwheader) { if ((*outputwheader).element) fprintf(stream, serviceformat, prefix, "method-header-part", method_name, types.aname(NULL, NULL, (*outputwheader).element)); } fprintf(stream, "int %s(", output_name); if (flag) { if (style == rpc && output->message && (*output->message->part.begin()).name) { fprintf(stream, "\n"); if (output->use == encoded) fprintf(stream, anonymous ? anonformat : paraformat, types.tnamenoptr(NULL, NULL, (*output->message->part.begin()).type), cflag ? "*:" : "&:", types.aname(NULL, NULL, (*output->message->part.begin()).name), ""); else fprintf(stream, anonymous ? anonformat : paraformat, types.tnamenoptr(NULL, NULL, (*output->message->part.begin()).type), cflag ? "*" : "&", types.aname(NULL, NULL, (*output->message->part.begin()).name), ""); fprintf(stream, "\t///< Output parameter%s%s", output->use == encoded ? ", :unqualified name as per RPC encoding" : "", anonymous ? ", _wildcard name as per RPC parameterOrder" : ""); } else output->generate(types, "", anonymous, true, true, false, is_rest); } else { fprintf(stream, "\n struct %-28s%s", output_name, cflag ? "*" : "&"); fprintf(stream, "\t///< Output response struct parameter"); } fprintf(stream, "\n);\n"); } if (input && input_name) { method_name = strstr(input_name + 1, "__"); if (method_name) method_name += 2; else method_name = input_name; if (protocol) fprintf(stream, serviceformat, prefix, "method-protocol", method_name, protocol); if (input->content && input->content->type) fprintf(stream, serviceformat, prefix, "method-input-mime-type", method_name, input->content->type); else if (style == document) fprintf(stream, serviceformat, prefix, "method-style", method_name, "document"); else fprintf(stream, serviceformat, prefix, "method-style", method_name, "rpc"); if (output && output->content && output->content->type) fprintf(stream, serviceformat, prefix, "method-output-mime-type", method_name, output->content->type); if (!input || input->use == literal) fprintf(stream, serviceformat, prefix, "method-encoding", method_name, "literal"); else if (input->encodingStyle) fprintf(stream, serviceformat, prefix, "method-encoding", method_name, input->encodingStyle); else fprintf(stream, serviceformat, prefix, "method-encoding", method_name, "encoded"); if (output) { if (!input || input->use != output->use) { if (output->use == literal) fprintf(stream, serviceformat, prefix, "method-response-encoding", method_name, "literal"); else if (output->encodingStyle) fprintf(stream, serviceformat, prefix, "method-response-encoding", method_name, output->encodingStyle); else fprintf(stream, serviceformat, prefix, "method-response-encoding", method_name, "encoded"); } if (style == rpc && (!input || (input->URI && output->URI && *output->URI && strcmp(input->URI, output->URI)))) fprintf(stream, schemaformat, types.nsprefix(NULL, output->URI), "namespace", output->URI); } if (input && input->action && *input->action) fprintf(stream, serviceformat, prefix, "method-input-action", method_name, input->action); else if (action) { if (*action) fprintf(stream, serviceformat, prefix, "method-action", method_name, action); else fprintf(stream, serviceformat, prefix, "method-action", method_name, "\"\""); } if (output && output->action && *output->action) fprintf(stream, serviceformat, prefix, "method-output-action", method_name, output->action); for (std::vector::const_iterator message = outfault.begin(); message != outfault.end(); ++message) { if ((*message)->message) { if ((*message)->use == literal) { for (std::vector::const_iterator part = (*message)->message->part.begin(); part != (*message)->message->part.end(); ++part) { if ((*part).element) fprintf(stream, serviceformat, prefix, "method-fault", method_name, types.aname(NULL, NULL, (*part).element)); else if ((*part).type) fprintf(stream, serviceformat, prefix, "method-fault", method_name, types.aname(NULL, (*message)->URI, (*part).name)); } } else { if ((*message)->message->name) fprintf(stream, serviceformat, prefix, "method-fault", method_name, (*message)->name); } if ((*message)->action) fprintf(stream, serviceformat, prefix, "method-fault-action", method_name, (*message)->action); } else if ((*message)->name) fprintf(stream, serviceformat, prefix, "method-fault", method_name, (*message)->name); } if (input) { if (input->multipartRelated) { for (std::vector::const_iterator inputmime = input->multipartRelated->part.begin(); inputmime != input->multipartRelated->part.end(); ++inputmime) { for (std::vector::const_iterator inputheader = (*inputmime).soap__header_.begin(); inputheader != (*inputmime).soap__header_.end(); ++inputheader) { if ((*inputheader).part) { if ((*inputheader).use == encoded && (*inputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-input-header-part", method_name, types.aname(NULL, (*inputheader).namespace_, (*inputheader).part)); else if ((*inputheader).partPtr() && (*inputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-input-header-part", method_name, types.aname(NULL, NULL, (*inputheader).partPtr()->element)); } } for (std::vector::const_iterator content = (*inputmime).content.begin(); content != (*inputmime).content.end(); ++content) if ((*content).type) fprintf(stream, serviceformat, prefix, "method-input-mime-type", method_name, (*content).type); } } // TODO: add headerfault directives? for (std::vector::const_iterator inputheader = input->header.begin(); inputheader != input->header.end(); ++inputheader) { if ((*inputheader).part) { if ((*inputheader).use == encoded && (*inputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-input-header-part", method_name, types.aname(NULL, (*inputheader).namespace_, (*inputheader).part)); else if ((*inputheader).partPtr() && (*inputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-input-header-part", method_name, types.aname(NULL, NULL, (*inputheader).partPtr()->element)); } } for (std::vector::const_iterator inputwheader = input->wheader.begin(); inputwheader != input->wheader.end(); ++inputwheader) { if ((*inputwheader).element) fprintf(stream, serviceformat, prefix, "method-input-header-part", method_name, types.aname(NULL, NULL, (*inputwheader).element)); } } if (output) { if (output->multipartRelated) { for (std::vector::const_iterator outputmime = output->multipartRelated->part.begin(); outputmime != output->multipartRelated->part.end(); ++outputmime) { for (std::vector::const_iterator outputheader = (*outputmime).soap__header_.begin(); outputheader != (*outputmime).soap__header_.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-output-header-part", method_name, types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-output-header-part", method_name, types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } for (std::vector::const_iterator content = (*outputmime).content.begin(); content != (*outputmime).content.end(); ++content) if ((*content).type) fprintf(stream, serviceformat, prefix, "method-output-mime-type", method_name, (*content).type); } } for (std::vector::const_iterator outputheader = output->header.begin(); outputheader != output->header.end(); ++outputheader) { if ((*outputheader).part) { if ((*outputheader).use == encoded && (*outputheader).namespace_) fprintf(stream, serviceformat, prefix, "method-output-header-part", method_name, types.aname(NULL, (*outputheader).namespace_, (*outputheader).part)); else if ((*outputheader).partPtr() && (*outputheader).partPtr()->element) fprintf(stream, serviceformat, prefix, "method-output-header-part", method_name, types.aname(NULL, NULL, (*outputheader).partPtr()->element)); } } for (std::vector::const_iterator outputwheader = output->wheader.begin(); outputwheader != output->wheader.end(); ++outputwheader) { if ((*outputwheader).element) fprintf(stream, serviceformat, prefix, "method-output-header-part", method_name, types.aname(NULL, NULL, (*outputwheader).element)); } } if (input) fprintf(stream, "int %s(", input_name); else fprintf(stream, "int %s(", output_name); if (input) input->generate(types, ",", anonymous, true, false, false, is_rest); if (output) { if (flag) { if (style == rpc && output->message && (*output->message->part.begin()).name) { fprintf(stream, "\n"); if (output->use == encoded) fprintf(stream, anonymous ? anonformat : paraformat, types.tnamenoptr(NULL, NULL, (*output->message->part.begin()).type), cflag ? "*:" : "&:", types.aname(NULL, NULL, (*output->message->part.begin()).name), ""); else fprintf(stream, anonymous ? anonformat : paraformat, types.tnamenoptr(NULL, NULL, (*output->message->part.begin()).type), cflag ? "*" : "&", types.aname(NULL, NULL, (*output->message->part.begin()).name), ""); fprintf(stream, "\t///< Output parameter%s%s", output->use == encoded ? ", :unqualified name as per RPC encoding" : "", anonymous ? ", _wildcard name as per RPC parameterOrder" : ""); } else output->generate(types, "", anonymous, true, true, false, is_rest); } else { fprintf(stream, "\n struct %-28s%s", output_name, cflag ? "*" : "&"); fprintf(stream, "\t///< Output response struct parameter"); } fprintf(stream, "\n);\n"); } else fprintf(stream, "\n void\t///< One-way message: no output parameter\n);\n"); } } //////////////////////////////////////////////////////////////////////////////// // // Message methods // //////////////////////////////////////////////////////////////////////////////// void Message::generate(Types& types, const char *sep, bool anonymous, bool remark, bool response, bool optional, bool is_rest) { if (message) { for (std::vector::const_iterator part = message->part.begin(); part != message->part.end(); ++part) { if (!(*part).name) { fprintf(stderr, "\nError: no wsdl:definitions/message/part/@name \"%s\"\n", message->name ? message->name : ""); } else if (!body_parts || soap_tagsearch(body_parts, (*part).name)) { if (remark && (*part).documentation) comment("", (*part).name, "parameter", (*part).documentation); else fprintf(stream, "\n"); if ((*part).element) { if ((*part).elementPtr()) { const char *name, *type, *nameURI = NULL, *typeURI = NULL, *prefix = NULL; if (style == rpc && use == encoded) { name = (*part).name; } else { name = (*part).elementPtr()->name; if (style == document && (*part).elementPtr()->schemaPtr()) nameURI = (*part).elementPtr()->schemaPtr()->targetNamespace; } if ((*part).elementPtr()->type) { type = (*part).elementPtr()->type; } else { type = (*part).elementPtr()->name; prefix = "_"; } if ((*part).elementPtr()->schemaPtr()) typeURI = (*part).elementPtr()->schemaPtr()->targetNamespace; if ((*part).elementPtr()->xmime__expectedContentTypes) fprintf(stream, " /// MTOM attachment with content types %s\n", (*part).elementPtr()->xmime__expectedContentTypes); if (response) { const char *t; bool flag = false; if (!zflag || zflag > 6) t = types.tnamenoptr(prefix, typeURI, type); else { t = types.tname(prefix, typeURI, type); flag = (strchr(t, '*') && strcmp(t, "char*") && strcmp(t, "char *")); } fprintf(stream, anonymous ? anonformat : paraformat, t, flag ? " " : cflag ? "*" : "&", types.aname(NULL, nameURI, name), sep); if (remark) fprintf(stream, "\t///< Output parameter%s", anonymous ? ", _wildcard name as per RPC parameterOrder" : ""); } else { fprintf(stream, anonymous ? anonformat : paraformat, types.pname(optional, false, prefix, typeURI, type), " ", types.aname(NULL, nameURI, name), sep); if (remark) { if (*sep == ',') fprintf(stream, "\t///< Input parameter%s", anonymous ? ", _wildcard name as per RPC parameterOrder" : ""); else fprintf(stream, "\t///< Output parameter%s", anonymous ? ", _wildcard name as per RPC parameterOrder" : ""); } } } else { fprintf(stream, anonymous ? anonformat : paraformat, types.pname(optional, false, NULL, NULL, (*part).element), " ", types.aname(NULL, NULL, (*part).element), sep); if (remark) fprintf(stream, "\t///< @todo Check element type (imported type)"); } } else if ((*part).type) { bool unqual = (style == rpc && use == encoded) && remark; const char *nameURI = NULL, *typeURI = NULL; if (!Xflag && (!zflag || zflag > 8)) { if ((*part).simpleTypePtr() && (*part).simpleTypePtr()->schemaPtr()) typeURI = (*part).simpleTypePtr()->schemaPtr()->targetNamespace; else if ((*part).complexTypePtr() && (*part).complexTypePtr()->schemaPtr()) typeURI = (*part).complexTypePtr()->schemaPtr()->targetNamespace; if (style == document && use == literal && !is_rest) { if (remark && !Wflag) fprintf(stderr, "\nWarning: wsdl:definitions/message/part/@type schema type for part/@name=\"%s\" makes the name ambiguous resulting in a qualified part name when its type is not a primitive XSD type and when option -X is not used to disambiguate wrapped patterns, the document/literal wrapped pattern requires part/@element\n", (*part).name); /* this adds the schema namespace prefix, but not for primitive XSD types and other built-in types */ nameURI = typeURI; } } if (response) { const char *t; bool flag = false; if (!zflag || zflag > 6) t = types.tnamenoptr(NULL, typeURI, (*part).type); else { t = types.tname(NULL, typeURI, (*part).type); flag = (strchr(t, '*') && strcmp(t, "char*") && strcmp(t, "char *")); } if (unqual) fprintf(stream, anonymous ? anonformat : paraformat, t, flag ? " :" : cflag ? "*:" : "&:", types.aname(NULL, NULL, (*part).name), sep); else fprintf(stream, anonymous ? anonformat : paraformat, t, flag ? " " : cflag ? "*" : "&", types.aname(NULL, nameURI, (*part).name), sep); if (remark) fprintf(stream, "\t///< Output parameter%s%s", unqual ? ", :unqualified name as per RPC encoding" : "", anonymous ? ", _wildcard name as per RPC parameterOrder" : ""); } else { const char *t = types.pname((optional || (*part).is_optional()) && !(*part).is_repeating(), false, NULL, typeURI, (*part).type); if ((*part).is_repeating()) { if (cflag) { fprintf(stream, sizeparaformat, "int", types.aname(NULL, NULL, (*part).name), ","); fprintf(stream, "\t///< Repeating parameter\n"); fprintf(stream, anonymous ? anonformat : paraformat, t, unqual ? "*:" : "*", types.aname(NULL, nameURI, (*part).name), ""); } else { fprintf(stream, pointertemplateparaformat, types.vname("$CONTAINER"), t, unqual ? " :" : " ", types.aname(NULL, nameURI, (*part).name), ""); } } else { fprintf(stream, anonymous ? anonformat : paraformat, t, unqual ? " :" : " ", types.aname(NULL, nameURI, (*part).name), ""); types.gendefault(NULL, (*part).type, NULL, (*part).simpleTypePtr(), (*part).get_default(), NULL, "="); } fprintf(stream, "%s", sep); if (remark) { if (*sep == ',') fprintf(stream, "\t///< Input parameter%s%s%s", (*part).is_repeating() ? " is repeating" : optional || (*part).is_optional() ? " is optional" : "", unqual ? ", :unqualified name as per RPC encoding" : "", anonymous ? ", _wildcard name as per RPC parameterOrder" : ""); else fprintf(stream, "\t///< Output parameter%s%s%s", (*part).is_repeating() ? " is repeating" : optional || (*part).is_optional() ? " is optional" : "", unqual ? ", :unqualified name as per RPC encoding" : "", anonymous ? ", _wildcard name as per RPC parameterOrder" : ""); const std::vector& options = (*part).options(); if (!options.empty()) fprintf(stream, " with one of the values"); for (std::vector::const_iterator i = options.begin(); i != options.end(); ++i) fprintf(stream, " '%s'", *i); if ((*part).is_fixed() && (*part).get_default()) fprintf(stream, " with fixed value '%s'", (*part).get_default()); } } } else if (style == rpc) { fprintf(stderr, "\nError: no wsdl:definitions/message/part/@type in part \"%s\"\n", (*part).name); } else { fprintf(stderr, "\nError: no wsdl:definitions/message/part/@element in part \"%s\"\n", (*part).name); } } } } else if (element) // WSDL 2.0 { const char *prefix = NULL; const char *URI = NULL; const char *name = element->name; const char *type = element->type; if (!type) { type = name; prefix = "_"; } if (element->schemaPtr()) URI = element->schemaPtr()->targetNamespace; if (response) { const char *t; bool flag = false; if (!zflag || zflag > 6) t = types.tnamenoptr(prefix, URI, type); else { t = types.tname(prefix, URI, type); flag = (strchr(t, '*') && strcmp(t, "char*") && strcmp(t, "char *")); } fprintf(stream, "\n"); fprintf(stream, paraformat, t, flag ? " " : cflag ? "*" : "&", anonymous ? "" : types.aname(NULL, URI, name), sep); if (remark) fprintf(stream, "\t///< Output parameter%s", anonymous ? ", _wildcard name as per RPC parameterOrder" : ""); } else if (style == document || element->simpleTypePtr()) { // WSDL 2.0 document style fprintf(stream, "\n"); fprintf(stream, anonymous ? anonformat : paraformat, types.pname(optional, false, prefix, URI, type), " ", types.aname(NULL, URI, name), sep); if (remark) { if (*sep == ',') fprintf(stream, "\t///< Input parameter%s", anonymous ? ", _wildcard name as er RPC parameterOrder" : ""); else fprintf(stream, "\t///< Output parameter%s", anonymous ? ", _wildcard name as er RPC parameterOrder" : ""); } } else if (element->complexTypePtr()) { // WSDL 2.0 RPC style xs__seqchoice *seq = element->complexTypePtr()->sequence; for (std::vector::const_iterator i = seq->__contents.begin(); i != seq->__contents.end(); ++i) { if ((*i).__union == SOAP_UNION_xs__union_content_element) { name = (*i).__content.element->name; type = (*i).__content.element->type; if (!type) type = name; fprintf(stream, "\n"); fprintf(stream, anonymous ? anonformat : paraformat, types.pname(optional, false, prefix, URI, type), " ", types.aname(NULL, NULL, name), sep); if (remark) { if (*sep == ',') fprintf(stream, "\t///< Input parameter%s", anonymous ? ", _wildcard name as per RPC parameterOrder" : ""); else fprintf(stream, "\t///< Output parameter%s", anonymous ? ", _wildcard name as per RPC parameterOrder" : ""); } } } } } } //////////////////////////////////////////////////////////////////////////////// // // Miscellaneous // //////////////////////////////////////////////////////////////////////////////// static const char *urienc(struct soap *soap, const char *uri) { const char *r, *s; char *t; size_t n = 0; if (!uri) return NULL; for (s = uri; *s; s++) if (!URI_CHAR(*s)) n++; if (!n) return uri; n = strlen(uri) + 2*n; r = t = (char*)soap_malloc(soap, n + 1); if (r) { for (s = uri; *s; s++) { if (URI_CHAR(*s)) { *t++ = *s; } else { (SOAP_SNPRINTF(t, n + 1 - (t - r), 3), "%%%2.2x", *s); t += 3; } } *t = '\0'; } return r; } static bool imported(const char *tag) { if (!tag || *tag != '"') return false; for (SetOfString::const_iterator u = exturis.begin(); u != exturis.end(); ++u) { size_t n = strlen(*u); if (!strncmp(*u, tag + 1, n) && tag[n+1] == '"') return true; } return false; } static void comment(const char *start, const char *middle, const char *end, const char *text) { if (text) { if (strchr(text, '\r') || strchr(text, '\n')) fprintf(stream, "\n/** %s %s %s documentation:\n%s\n*/\n\n", start, middle, end, text); else fprintf(stream, "\n/// %s %s %s: %s\n", start, middle, end, text); } } static void page(const char *page, const char *title, const char *text) { if (text) fprintf(stream, "@page %s%s \"%s\"\n", page, title, text); else fprintf(stream, "@page %s%s\n", page, title); } static void section(const char *section, const char *title, const char *text) { if (text) fprintf(stream, "\n@section %s%s \"%s\"\n", section, title, text); else fprintf(stream, "\n@section %s%s\n", section, title); } static void banner(const char *text1, const char *text2) { int i; if (!text1) return; fprintf(stream, "\n/"); for (i = 0; i < 78; i++) fputc('*', stream); if (text2) fprintf(stream, "\\\n *%76s*\n * %-75s*\n * %-73s*\n *%76s*\n\\", "", text1, text2, ""); else fprintf(stream, "\\\n *%76s*\n * %-75s*\n *%76s*\n\\", "", text1, ""); for (i = 0; i < 78; i++) fputc('*', stream); fprintf(stream, "/\n\n"); if (vflag) fprintf(stderr, "\n----<< %s: %s >>----\n\n", text1, text2 ? text2 : ""); } static void ident() { time_t t = time(NULL), *p = &t; char tmp[256]; int i; strftime(tmp, 256, "%Y-%m-%d %H:%M:%S GMT", gmtime(p)); fprintf(stream, "/* %s\n Generated by wsdl2h " WSDL2H_VERSION " from ", outfile ? outfile : ""); if (infiles) { for (i = 0; i < infiles; i++) fprintf(stream, "%s ", infile[i]); } else fprintf(stream, "(stdin) "); fprintf(stream, "and %s\n\ %s\n\n\ DO NOT INCLUDE THIS FILE DIRECTLY INTO YOUR PROJECT BUILDS\n\ USE THE soapcpp2-GENERATED SOURCE CODE FILES FOR YOUR PROJECT BUILDS\n\n\ gSOAP XML Web services tools\n\ Copyright (C) 2000-2018, Robert van Engelen, Genivia Inc. All Rights Reserved.\n\ This program is released under the GPL with the additional exemption that\n\ compiling, linking, and/or using OpenSSL is allowed.\n\ --------------------------------------------------------------------------------\n\ A commercial use license is available from Genivia Inc., contact@genivia.com\n\ --------------------------------------------------------------------------------\n\ */\n\n", mapfile, tmp); } void text(const char *text) { const char *s; if (!text) return; size_t k = 0; for (s = text; *s; s++, k++) { switch (*s) { case '\n': if (k) { fputc('\n', stream); k = 0; } break; case '\t': k = 8 * ((k + 8) / 8) - 1; fputc('\t', stream); break; case '/': fputc(*s, stream); if (s[1] == '*') fputc(' ', stream); break; case '*': fputc(*s, stream); if (s[1] == '/') fputc(' ', stream); break; case ' ': if (k >= 79) { fputc('\n', stream); k = 0; } else fputc(' ', stream); break; default: if (*s >= 32) fputc(*s, stream); } } if (k) fputc('\n', stream); } //////////////////////////////////////////////////////////////////////////////// // // WS-Policy // //////////////////////////////////////////////////////////////////////////////// static void gen_policy(Service& service, const std::vector& policy, const char *text, Types& types) { if (!policy.empty()) { fprintf(stream, "\n - WS-Policy applicable to the %s:\n", text); for (std::vector::const_iterator p = policy.begin(); p != policy.end(); ++p) if (*p) (*p)->generate(service, types, 0); } } static void gen_policy_enablers(const Service& service) { fprintf(stream, "\n/** "); page(service.name, " Binding", service.name); section(service.name, "_policy_enablers Policy Enablers of Binding", service.name); if (service.imports.empty()) { fprintf(stream, "\nNone specified.\n\n*/\n"); return; } fprintf(stream, "\nBased on policies and protocol requirements, this service requires importing"); for (VectorOfString::const_iterator i = service.imports.begin(); i != service.imports.end(); ++i) fprintf(stream, " \"%s\"", *i); fprintf(stream, "\n\n - WS-Policy reminders and enablers (when applicable):\n"); fprintf(stream, " - WS-Addressing 1.0 (2005/08, accepts 2004/08):\n\t@code\n\t#import \"wsa5.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsaapi.h\"\n\tsoap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code\n\t// See the user guide gsoap/doc/wsa/html/index.html\n\t@endcode\n"); fprintf(stream, " - WS-Addressing (2004/08):\n\t@code\n\t#import \"wsa.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsaapi.h\"\n\tsoap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code\n\t// See the user guide gsoap/doc/wsa/html/index.html\n\t@endcode\n"); fprintf(stream, " - WS-ReliableMessaging 1.0:\n\t@code\n\t#import \"wsrm5.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsrmapi.h\"\n\tsoap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code\n\tsoap_register_plugin(soap, soap_wsrm); // register the wsrm plugin in your code\n\t// See the user guide gsoap/doc/wsrm/html/index.html\n\t@endcode\n"); fprintf(stream, " - WS-ReliableMessaging 1.1:\n\t@code\n\t#import \"wsrm.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsrmapi.h\"\n\tsoap_register_plugin(soap, soap_wsa); // register the wsa plugin in your code\n\tsoap_register_plugin(soap, soap_wsrm); // register the wsrm plugin in your code\n\t// See the user guide gsoap/doc/wsrm/html/index.html\n\t@endcode\n"); fprintf(stream, " - WS-Discovery 1.0:\n\t@code\n\t#import \"wsrm5.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsddapi.h\" // See the user guide gsoap/doc/wsdd/html/index.html\n\t@endcode\n"); fprintf(stream, " - WS-Discovery 1.1:\n\t@code\n\t#import \"wsrm.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsddapi.h\" // See the user guide gsoap/doc/wsdd/html/index.html\n\t@endcode\n"); fprintf(stream, " - WS-Security (SOAP Message Security) 1.0 (accepts 1.1):\n\t@code\n\t#import \"wsse.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_register_plugin(soap, soap_wsse); // register the wsse plugin in your code\n\t// See the user guide gsoap/doc/wsse/html/index.html\n\t@endcode\n"); fprintf(stream, " - WS-Security (SOAP Message Security) 1.1 (accepts 1.0):\n\t@code\n\t#import \"wsse11.h\" // to be added to this header file for the soapcpp2 build step\n\t@endcode\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_register_plugin(soap, soap_wsse); // register the wsse plugin in your code\n\t// See the user guide gsoap/doc/wsse/html/index.html\n\t@endcode\n"); fprintf(stream, " - HTTP Digest Authentication:\n\t@code\n\t#include \"plugin/httpda.h\"\n\tsoap_register_plugin(soap, soap_http_da); // register the HTTP DA plugin in your code\n\t// See the user guide gsoap/doc/httpda/html/index.html\n\t@endcode\n"); fprintf(stream, "*/\n\n"); for (VectorOfString::const_iterator i = service.imports.begin(); i != service.imports.end(); ++i) fprintf(stream, "#import \"%s\"\n", *i); } //////////////////////////////////////////////////////////////////////////////// // // BPEL 2.0 // //////////////////////////////////////////////////////////////////////////////// static void gen_plnk(const Service& service) { if (!service.role.empty()) { for (std::vector::const_iterator r = service.role.begin(); r != service.role.end(); ++r) { if (*r && (*r)->portTypePtr() && (*r)->plnkPtr()) { fprintf(stream, "\n - \"%s\" role \"%s\" port type \"%s\" operations.\n", (*r)->plnkPtr()->name, (*r)->portTypePtr()->name, (*r)->name); text((*r)->documentation); text((*r)->plnkPtr()->documentation); } } } } static void gen_vprop(const wsdl__definitions& definitions, Types& types) { if (!definitions.vprop__property.empty()) { banner("BPEL 2.0 Variables"); fprintf(stream, "/** "); page("page_bpel", " BPEL 2.0 Variables", NULL); for (std::vector::const_iterator i1 = definitions.vprop__property.begin(); i1 != definitions.vprop__property.end(); ++i1) { if ((*i1).name) { fprintf(stream, "\nBPEL 2.0 Variable \"%s\"\n", (*i1).name); text((*i1).documentation); fprintf(stream, "\n"); for (std::vector::const_iterator j = definitions.vprop__propertyAlias.begin(); j != definitions.vprop__propertyAlias.end(); ++j) { if ((*j).vpropPtr() == &(*i1) && (*j).query && (*j).query->__mixed) { if ((*j).messageType) { if ((*j).type) fprintf(stream, " - Variable property alias for message %s/%s of type %s.\n", (*j).messageType, (*j).part, (*j).type); else if ((*j).element) fprintf(stream, " - Variable property alias for message %s/%s element %s.\n", (*j).messageType, (*j).part, (*j).element); } else fprintf(stream, " - Variable property alias.\n"); text((*j).documentation); if ((*j).type) fprintf(stream, " XPath %s: %s\n", types.tname(NULL, NULL, (*j).type), (*j).query->__mixed); else if ((*j).element) fprintf(stream, " XPath %s: %s\n", types.tname(NULL, NULL, (*j).element), (*j).query->__mixed); } } } } fprintf(stream, "*/\n\n"); for (std::vector::const_iterator i2 = definitions.vprop__property.begin(); i2 != definitions.vprop__property.end(); ++i2) { if ((*i2).name) { for (std::vector::const_iterator j = definitions.vprop__propertyAlias.begin(); j != definitions.vprop__propertyAlias.end(); ++j) { if ((*j).vpropPtr() == &(*i2) && (*j).query && (*j).query->__mixed) { if ((*j).type) fprintf(stream, "//xpath %s %s\n", types.tname(NULL, NULL, (*j).type), (*j).query->__mixed); else if ((*j).element) fprintf(stream, "//xpath %s %s\n", types.tname(NULL, NULL, (*j).element), (*j).query->__mixed); } } if ((*i2).type) fprintf(stream, elementformat, types.tname(NULL, NULL, (*i2).type), types.aname(NULL, NULL, (*i2).name)); else if ((*i2).element) fprintf(stream, elementformat, types.tname(NULL, NULL, (*i2).element), types.aname(NULL, NULL, (*i2).name)); fprintf(stream, ";\n"); } } fprintf(stream, "\n"); } } gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/wsrmp.h0000644000175000017500000000516613525245163022304 0ustar ellertellert/* wsrmp.h WS-ReliableMessaging Policy -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap wsrmp schema documentation: WS-ReliableMessaging Policy binding //gsoap wsrmp schema namespace: http://docs.oasis-open.org/ws-rx/wsrm/200702 //gsoap wsrmp schema elementForm: qualified //gsoap wsrmp schema attributeForm: unqualified //gsoap wsrmp5 schema documentation: WS-ReliableMessaging Policy binding //gsoap wsrmp5 schema namespace: http://schemas.xmlsoap.org/ws/2005/02/rm/policy //gsoap wsrmp5 schema elementForm: qualified //gsoap wsrmp5 schema attributeForm: unqualified #import "imports.h" class wsrmp__Timeout { public: @char *Milliseconds; }; class wsrmp__RMAssertion : public wsp__Assertion { public: wsrmp__Timeout *InactivityTimeout; wsrmp__Timeout *BaseRetransmissionInterval; wsrmp__Timeout *AcknowledgementInterval; char *ExponentialBackoff; // TODO: WCF netrmp extension elements go here, as necessary }; class wsrmp5__Timeout { public: @char *Milliseconds; }; class wsrmp5__RMAssertion : public wsp__Assertion { public: wsrmp5__Timeout *InactivityTimeout; wsrmp5__Timeout *BaseRetransmissionInterval; wsrmp5__Timeout *AcknowledgementInterval; char *ExponentialBackoff; // TODO: WCF netrmp extension elements go here, as necessary }; gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/wst.h0000644000175000017500000000323213525245163021741 0ustar ellertellert/* wst.h WS-Trust -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap wst schema documentation: WS-Trust //gsoap wst schema namespace: http://docs.oasis-open.org/ws-sx/ws-trust/200512 //gsoap wst schema elementForm: qualified //gsoap wst schema attributeForm: unqualified class wst__Claims { public: @xsd__string Dialect; xsd__string __item; }; gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/schema.cpp0000644000175000017500000030423313525245163022724 0ustar ellertellert/* schema.cpp XSD binding schema implementation -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "wsdlH.h" // cannot include "schemaH.h" #include "includes.h" extern struct Namespace namespaces[]; extern "C" { extern int warn_ignore(struct soap*, const char*); } extern const char *qname_token(const char*, const char*); extern int is_builtin_qname(const char*); extern xsd__QName make_qname(xs__schema&, const char *); //////////////////////////////////////////////////////////////////////////////// // // schema // //////////////////////////////////////////////////////////////////////////////// xs__schema::xs__schema() { soap = soap_new1(SOAP_XML_TREE | SOAP_C_UTFSTRING); #ifdef HTTPDA_H soap_register_plugin(soap, http_da); #endif #ifdef WITH_OPENSSL soap_ssl_client_context(soap, SOAP_SSL_NO_AUTHENTICATION | SOAP_SSLv3_TLSv1, NULL, NULL, NULL, NULL, NULL); #endif soap_set_namespaces(soap, namespaces); soap_default(soap); soap->fignore = warn_ignore; soap->encodingStyle = NULL; soap->proxy_host = proxy_host; soap->proxy_port = proxy_port; soap->proxy_userid = proxy_userid; soap->proxy_passwd = proxy_passwd; targetNamespace = NULL; version = NULL; attributeGroupRef = NULL; updated = false; location = NULL; redirs = 0; used = false; } xs__schema::xs__schema(struct soap *copy) { soap = soap_copy(copy); soap->socket = SOAP_INVALID_SOCKET; soap->recvfd = 0; soap->sendfd = 1; soap_default(soap); soap->fignore = warn_ignore; soap->encodingStyle = NULL; targetNamespace = NULL; version = NULL; attributeGroupRef = NULL; updated = false; location = NULL; redirs = 0; } xs__schema::xs__schema(struct soap *copy, const char *cwd, const char *loc, const char *relloc) { soap = soap_copy(copy); soap->socket = SOAP_INVALID_SOCKET; soap->recvfd = 0; soap->sendfd = 1; soap_default(soap); soap->fignore = warn_ignore; soap->encodingStyle = NULL; targetNamespace = NULL; version = NULL; attributeGroupRef = NULL; updated = false; location = NULL; redirs = 0; read(cwd, loc, relloc); } xs__schema::~xs__schema() { } int xs__schema::get(struct soap *soap) { (void)soap; return preprocess(); } int xs__schema::preprocess() { for (std::vector::iterator im = import.begin(); im != import.end(); ++im) (*im).preprocess(*this); // read schema and recurse over for (std::vector::iterator in = include.begin(); in != include.end(); ++in) { (*in).preprocess(*this); // read schema and recurse over , and if ((*in).schemaPtr()) insert(*(*in).schemaPtr()); } for (std::vector::iterator ov = override_.begin(); ov != override_.end(); ++ov) { (*ov).preprocess(*this); // read schema and recurse over , and if ((*ov).schemaPtr()) insert(*(*ov).schemaPtr()); } for (std::vector::iterator re = redefine.begin(); re != redefine.end(); ++re) { (*re).preprocess(*this); // read schema and recurse over , and if ((*re).schemaPtr()) insert(*(*re).schemaPtr()); } return SOAP_OK; } int xs__schema::insert(xs__schema& schema) { bool found; if (targetNamespace && (!schema.targetNamespace || strcmp(targetNamespace, schema.targetNamespace))) { if (!Wflag) fprintf(stderr, "\nWarning: attempt to include schema '%s' with mismatching targetNamespace '%s' into schema namespace '%s', assuming chameleon schema targetNamespace '%s'\n", schema.sourceLocation() ? schema.sourceLocation() : "", schema.targetNamespace, targetNamespace, targetNamespace); schema.targetNamespace = targetNamespace; } if (elementFormDefault != schema.elementFormDefault) { if (!Wflag) fprintf(stderr, "\nWarning: attempt to include schema '%s' with mismatching elementFormDefault into schema namespace '%s', assuming elementFormDefault '%squalified'\n", schema.sourceLocation() ? schema.sourceLocation() : "", targetNamespace ?targetNamespace : "(null)", elementFormDefault == qualified ? "" : "un"); schema.elementFormDefault = elementFormDefault; } if (attributeFormDefault != schema.attributeFormDefault) { if (!Wflag) fprintf(stderr, "\nWarning: attempt to include schema '%s' with mismatching attributeFormDefault into schema namespace '%s', assuming attributeFormDefault '%squalified'\n", schema.sourceLocation() ? schema.sourceLocation() : "", targetNamespace ? targetNamespace : "(null)", attributeFormDefault == qualified ? "" : "un"); schema.attributeFormDefault = attributeFormDefault; } // insert imports for (std::vector::const_iterator im = schema.import.begin(); im != schema.import.end(); ++im) { found = false; if ((*im).schemaLocation) { for (std::vector::const_iterator i = import.begin(); i != import.end(); ++i) { if ((*i).schemaLocation && !strcmp((*im).schemaLocation, (*i).schemaLocation)) { found = true; break; } } } else if ((*im).namespace_) { for (std::vector::const_iterator i = import.begin(); i != import.end(); ++i) { if ((*i).namespace_ && !strcmp((*im).namespace_, (*i).namespace_)) { found = true; break; } } } if (!found) import.push_back(*im); } // insert attributes, but only add attributes with new name (limited conflict check) for (std::vector::const_iterator at = schema.attribute.begin(); at != schema.attribute.end(); ++at) { found = false; if ((*at).name) { for (std::vector::const_iterator a = attribute.begin(); a != attribute.end(); ++a) { if ((*a).name && !strcmp((*at).name, (*a).name)) { found = true; if ((*at).type && (*a).type && strcmp((*at).type, (*a).type)) if (!Wflag) fprintf(stderr, "\nWarning: attempt to redefine attribute '%s' with type '%s' in schema '%s'\n", (*at).name, (*at).type, targetNamespace ? targetNamespace : "(null)"); break; } } } if (!found) { attribute.push_back(*at); attribute.back().schemaPtr(this); } } // insert elements, but only add elements with new name (limited conflict check) for (std::vector::const_iterator el = schema.element.begin(); el != schema.element.end(); ++el) { found = false; if ((*el).name) { for (std::vector::const_iterator e = element.begin(); e != element.end(); ++e) { if ((*e).name && !strcmp((*el).name, (*e).name)) { found = true; if ((*el).type && (*e).type && strcmp((*el).type, (*e).type)) if (!Wflag) fprintf(stderr, "\nWarning: attempt to redefine element '%s' with type '%s' in schema '%s'\n", (*el).name, (*el).type, targetNamespace ? targetNamespace : "(null)"); break; } } } if (!found) { element.push_back(*el); element.back().schemaPtr(this); } } // insert groups, but only add groups with new name (no conflict warning) for (std::vector::const_iterator gp = schema.group.begin(); gp != schema.group.end(); ++gp) { found = false; if ((*gp).name) { for (std::vector::const_iterator g = group.begin(); g != group.end(); ++g) { if ((*g).name && !strcmp((*gp).name, (*g).name)) { found = true; break; } } } if (!found) { group.push_back(*gp); group.back().schemaPtr(this); } } // insert attributeGroups, but only add attributeGroups with new name (no conflict warning) for (std::vector::const_iterator ag = schema.attributeGroup.begin(); ag != schema.attributeGroup.end(); ++ag) { found = false; if ((*ag).name) { for (std::vector::const_iterator g = attributeGroup.begin(); g != attributeGroup.end(); ++g) { if ((*g).name && !strcmp((*ag).name, (*g).name)) { found = true; break; } } } if (!found) { attributeGroup.push_back(*ag); attributeGroup.back().schemaPtr(this); } } // insert simpleTypes, but only add simpleTypes with new name (no conflict warning) for (std::vector::const_iterator st = schema.simpleType.begin(); st != schema.simpleType.end(); ++st) { found = false; if ((*st).name) { for (std::vector::const_iterator s = simpleType.begin(); s != simpleType.end(); ++s) { if ((*s).name && !strcmp((*st).name, (*s).name)) { found = true; break; } } } if (!found) { simpleType.push_back(*st); simpleType.back().schemaPtr(this); } } // insert complexTypes, but only add complexTypes with new name (no conflict warning) for (std::vector::const_iterator ct = schema.complexType.begin(); ct != schema.complexType.end(); ++ct) { found = false; if ((*ct).name) { for (std::vector::const_iterator c = complexType.begin(); c != complexType.end(); ++c) { if ((*c).name && !strcmp((*ct).name, (*c).name)) { found = true; break; } } } if (!found) { complexType.push_back(*ct); complexType.back().schemaPtr(this); } } return SOAP_OK; } int xs__schema::traverse() { if (updated) return SOAP_OK; if (vflag) std::cerr << " Analyzing schema '" << (targetNamespace ? targetNamespace : "(null)") << "' '" << (sourceLocation() ? sourceLocation() : "") << "'" << std::endl; updated = true; if (!targetNamespace) { if (vflag) fprintf(stderr, "\nWarning: Schema has no targetNamespace\n"); targetNamespace = soap_strdup(soap, ""); } else if (exturis.find(targetNamespace) != exturis.end()) { if (vflag) fprintf(stderr, "\nWarning: Built-in schema '%s' content encountered\n", targetNamespace); } // process import for (std::vector::iterator im = import.begin(); im != import.end(); ++im) (*im).traverse(*this); // process attributes for (std::vector::iterator at = attribute.begin(); at != attribute.end(); ++at) (*at).traverse(*this); // process elements for (std::vector::iterator el = element.begin(); el != element.end(); ++el) (*el).traverse(*this); // process simpleTypes, check conflicts with complexTypes for (std::vector::iterator st = simpleType.begin(); st != simpleType.end(); ++st) { (*st).traverse(*this); if ((*st).name) { for (std::vector::iterator ct = complexType.begin(); ct != complexType.end(); ++ct) { if ((*ct).name && !strcmp((*st).name, (*ct).name)) { if (!Wflag) fprintf(stderr, "\nWarning: top-level simpleType name and complexType name '%s' clash in schema '%s'\n", (*st).name, targetNamespace ? targetNamespace : "(null)"); } } } } // process complexTypes for (std::vector::iterator ct = complexType.begin(); ct != complexType.end(); ++ct) (*ct).traverse(*this); // process groups for (std::vector::iterator gp = group.begin(); gp != group.end(); ++gp) (*gp).traverse(*this); // process attributeGroups for (std::vector::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) (*ag).traverse(*this); // XSD 1.1 defaultAttributes if (defaultAttributes) { for (std::vector::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) { if ((*ag).name && !strcmp((*ag).name, defaultAttributes)) { attributeGroupRef = &*ag; break; } } if (!attributeGroupRef) std::cerr << "\nWarning: could not find defaultAttributes attributeGroup '" << defaultAttributes << "' in schema '" << (targetNamespace ? targetNamespace : "(null)") << "'" << std::endl; } if (vflag) std::cerr << " End of schema '" << (targetNamespace ? targetNamespace : "(null)") << "'" << std::endl; return SOAP_OK; } int xs__schema::read(const char *cwd, const char *loc, const char *relloc) { const char *cwd_temp; if (!cwd) cwd = cwd_path; if (vflag) fprintf(stderr, "\nOpening schema '%s' relative to '%s'\n", loc ? loc : "(stdin)", cwd ? cwd : "./"); if (loc) { if (soap->recvfd > 2) { soap_end_recv(soap); close(soap->recvfd); soap->recvfd = -1; } else if (soap_valid_socket(soap->socket)) { soap_end_recv(soap); soap_closesock(soap); } #ifdef WITH_OPENSSL if (!strncmp(loc, "http://", 7) || !strncmp(loc, "https://", 8)) #else if (!strncmp(loc, "https://", 8)) { #ifdef WIN32 fprintf(stderr, "\nCannot connect to https site: SSL/TLS support not enabled in this version. Visit https://www.genivia.com/downloads.html to download the secure version of wsdl2h.exe that supports SSL/TLS to connect to https sites.\n"); #else fprintf(stderr, "\nCannot connect to https site: SSL/TLS support not enabled, please rebuild wsdl2h with SSL/TLS enabled using 'make secure' or download the WSDL/WADL and XSD files and rerun wsdl2h on these files directly by specifying the file names on the command line.\n"); #endif exit(1); } else if (!strncmp(loc, "http://", 7)) #endif { fprintf(stderr, "%*sConnecting to '%s' to retrieve schema...", 2*openfiles, "", loc); location = soap_strdup(soap, loc); if (soap_connect_command(soap, SOAP_GET, location, NULL)) { fprintf(stderr, "\n\nError: connection failed\n"); soap_print_fault(soap, stderr); exit(1); } fprintf(stderr, " connected, receiving...\n"); openfiles++; } else if (cwd && (!strncmp(cwd, "http://", 7) || !strncmp(cwd, "https://", 8))) { size_t l = strlen(cwd) + strlen(loc); location = (char*)soap_malloc(soap, l + 2); soap_strcpy(location, l + 2, cwd); char *s = strrchr(location, '/'); if (s) *s = '\0'; size_t n = strlen(location); soap_strcpy(location + n, l + 2 - n, "/"); ++n; soap_strcpy(location + n, l + 2 - n, loc); fprintf(stderr, "%*sConnecting to '%s' to retrieve schema '%s'...", 2*openfiles, "", location, loc); if (soap_connect_command(soap, SOAP_GET, location, NULL)) { fprintf(stderr, "\n\nError: failed to retrieve '%s'\n", loc); soap_print_fault(soap, stderr); exit(1); } fprintf(stderr, " connected, receiving...\n"); openfiles++; } else { if (!strncmp(loc, "file://", 7)) loc += 7; soap->recvfd = open(loc, O_RDONLY, 0); if (soap->recvfd < 0) { if (loc && cwd) { size_t l = strlen(cwd) + strlen(relloc); location = (char*)soap_malloc(soap, l + 2); soap_strcpy(location, l + 2, cwd); char *s = strrchr(location, '/'); #ifdef WIN32 if (!s) s = strrchr(location, '\\'); #endif if (s) { *s = '\0'; size_t n = strlen(location); soap_strcpy(location + n, l + 2 - n, "/"); ++n; soap_strcpy(location + n, l + 2 - n, relloc); if (!strncmp(location, "file://", 7)) location += 7; soap->recvfd = open(location, O_RDONLY, 0); if (vflag) std::cerr << "Opening file " << location << (soap->recvfd < 0 ? " failed" : " successful") << std::endl; } } if (soap->recvfd < 0 && import_path) { size_t l = strlen(import_path) + strlen(loc); location = (char*)soap_malloc(soap, l + 2); soap_strcpy(location, l + 2, import_path); size_t n = strlen(location); soap_strcpy(location + n, l + 2 - n, "/"); ++n; soap_strcpy(location + n, l + 2 - n, loc); if (!strncmp(location, "file://", 7)) location += 7; soap->recvfd = open(location, O_RDONLY, 0); if (vflag) std::cerr << "Opening file " << location << (soap->recvfd < 0 ? " failed" : " successful") << std::endl; } if (relloc && soap->recvfd < 0 && import_path) { size_t l = strlen(import_path) + strlen(relloc); location = (char*)soap_malloc(soap, l + 2); soap_strcpy(location, l + 2, import_path); size_t n = strlen(location); soap_strcpy(location + n, l + 2 - n, "/"); ++n; soap_strcpy(location + n, l + 2 - n, relloc); if (!strncmp(location, "file://", 7)) location += 7; soap->recvfd = open(location, O_RDONLY, 0); if (vflag) std::cerr << "Opening file " << location << (soap->recvfd < 0 ? " failed" : " successful") << std::endl; } if (soap->recvfd < 0) { fprintf(stderr, "\nCannot open '%s' to retrieve schema\n", loc); exit(1); } } else { location = soap_strdup(soap, loc); } fprintf(stderr, "%*sReading schema '%s'...\n", 2*openfiles, "", location); openfiles++; } } cwd_temp = cwd_path; cwd_path = location; if (!soap_begin_recv(soap)) this->soap_in(soap, "xs:schema", NULL); if ((soap->error >= 301 && soap->error <= 303) || soap->error == 307) // HTTP redirect, socket was closed { int r = SOAP_ERR; fprintf(stderr, "Redirected to '%s'...\n", soap->endpoint); if (redirs++ < 10) r = read(cwd, soap->endpoint, NULL); else fprintf(stderr, "\nMax redirects exceeded\n"); redirs--; return r; } else if (soap->error == 401) { int r = SOAP_ERR; fprintf(stderr, "Authenticating to '%s' realm '%s'...\n", loc, soap->authrealm); if (auth_userid && auth_passwd && redirs++ < 1) { #ifdef HTTPDA_H struct http_da_info info; http_da_save(soap, &info, soap->authrealm, auth_userid, auth_passwd); #else soap->userid = auth_userid; soap->passwd = auth_passwd; #endif r = read(cwd, loc, NULL); #ifdef HTTPDA_H http_da_release(soap, &info); #endif redirs--; } else { fprintf(stderr, "Authentication failed, use option -r:uid:pwd and (re)build with OpenSSL to enable digest authentication\n"); } return r; } if (soap->error) { fprintf(stderr, "\nAn error occurred while parsing schema from '%s'\n", loc ? loc : "(stdin)"); soap_print_fault(soap, stderr); if (soap->error < 200) soap_print_fault_location(soap, stderr); fprintf(stderr, "\nIf this schema namespace is considered \"built-in\", then add\n namespaceprefix = \nto typemap.dat.\n"); exit(1); } openfiles--; fprintf(stderr, "%*sDone reading '%s'\n", 2*openfiles, "", loc ? loc : "(stdin)"); soap_end_recv(soap); if (soap->recvfd > 2) { close(soap->recvfd); soap->recvfd = -1; } else { soap_closesock(soap); } cwd_path = cwd_temp; return SOAP_OK; } void xs__schema::sourceLocation(const char *loc) { location = soap_strdup(soap, loc); } const char *xs__schema::sourceLocation() { return location; } char *xs__schema::absoluteLocation(const char *loc) const { const char *base = location ? location : cwd_path; if (!base) return soap_strdup(soap, loc); if (!strncmp(loc, "http://", 7) || !strncmp(loc, "https://", 8)) return soap_strdup(soap, loc); if (!strncmp(loc, "file://", 7)) loc += 7; const char *s = strrchr(base, '/'); #ifdef WIN32 const char *t = strrchr(base, '\\'); if (!s || s < t) s = t; if (!s) return soap_strdup(soap, loc); while ((!strncmp(loc, "../", 3) || !strncmp(loc, "..\\", 3)) && s > base) { while (--s >= base) { if (*s == '/' || *s == '\\') { if (s[1] != '.') break; if (s[2] == '.' && (s[3] == '/' || s[3] == '\\')) { s += 3; break; } } } loc += 3; } #else if (!s) return soap_strdup(soap, loc); while (!strncmp(loc, "../", 3) && s > base) { while (--s >= base) { if (*s == '/') { if (s[1] != '.') break; if (s[2] == '.' && s[3] == '/') { s += 3; break; } } } loc += 3; } #endif size_t n = s - base + 1; size_t l = n + strlen(loc); char *abs = (char*)soap_malloc(soap, l + 1); soap_strncpy(abs, l + 1, base, n); soap_strcpy(abs + n, l + 1 - n, loc); return abs; } xs__attributeGroup *xs__schema::attributeGroupPtr() const { return attributeGroupRef; } int xs__schema::error() { return soap->error; } void xs__schema::print_fault() { soap_print_fault(soap, stderr); if (soap->error < 200) soap_print_fault_location(soap, stderr); } void xs__schema::builtinType(const char *type) { builtinTypeSet.insert(type); } void xs__schema::builtinTypeDerivation(xs__schema& schema, const char *base, const char *derived) { builtinTypeMap[make_qname(schema, derived)] = base; } void xs__schema::builtinElement(const char *element) { builtinElementSet.insert(element); } void xs__schema::builtinAttribute(const char *attribute) { builtinAttributeSet.insert(attribute); } const SetOfString& xs__schema::builtinTypes() const { return builtinTypeSet; } const MapOfStringToString& xs__schema::builtinTypeDerivations() const { return builtinTypeMap; } const SetOfString& xs__schema::builtinElements() const { return builtinElementSet; } const SetOfString& xs__schema::builtinAttributes() const { return builtinAttributeSet; } bool xs__schema::empty() const { return include.empty() && redefine.empty() && override_.empty() && attribute.empty() && element.empty() && group.empty() && attributeGroup.empty() && simpleType.empty() && complexType.empty(); // empty except for } void xs__schema::mark() { if (Oflag > 1 && !used) { used = true; for (std::vector::iterator im = import.begin(); im != import.end(); ++im) (*im).mark(); // -O2: start with root of usage: use top-level attributes if (Oflag < 3) for (std::vector::iterator at = attribute.begin(); at != attribute.end(); ++at) (*at).mark(); // -O2 and -O3: start with root of usage: use top-level elements if (Oflag < 4) for (std::vector::iterator el = element.begin(); el != element.end(); ++el) (*el).mark(); } } xs__include::xs__include() { schemaLocation = NULL; schemaRef = NULL; } int xs__include::preprocess(xs__schema &schema) { if (!schemaRef) { if (schemaLocation) { // only read from include locations not read already, uses static std::map static std::map included; std::map::iterator i = included.end(); const char *relative_schemaLocation = soap_strdup(schema.soap, schemaLocation); schemaLocation = schema.absoluteLocation(schemaLocation); if (schema.targetNamespace) { for (i = included.begin(); i != included.end(); ++i) { if ((*i).second->targetNamespace && !strcmp(schemaLocation, (*i).first) && !strcmp(schema.targetNamespace, (*i).second->targetNamespace)) break; } } if (i == included.end()) { if (vflag) std::cerr << "Preprocessing schema include '" << (schemaLocation ? schemaLocation : "(null)") << "' into schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << std::endl; schemaRef = new xs__schema(schema.soap); if (!schemaRef) return SOAP_EOF; included[schemaLocation] = schemaRef; schemaRef->read(schema.sourceLocation(), schemaLocation, relative_schemaLocation); if (schema.targetNamespace && (!schemaRef->targetNamespace || strcmp(schema.targetNamespace, schemaRef->targetNamespace))) { if (!Wflag) { if (schemaRef->targetNamespace) fprintf(stderr, "\nWarning: attempt to include schema with mismatching targetNamespace '%s' into schema namespace '%s', assigning targetNamespace '%s'\n", schemaRef->targetNamespace, schema.targetNamespace, schema.targetNamespace); else fprintf(stderr, "\nWarning: attempt to include chameleon schema with no targetNamespace into schema namespace '%s', assigning targetNamespace '%s'\n", schema.targetNamespace, schema.targetNamespace); } } } else { if (vflag) std::cerr << "Schema '" << (schemaLocation ? schemaLocation : "(null)") << "' already included into schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << std::endl; schemaRef = (*i).second; } } else if (!Wflag) { fprintf(stderr, "\nWarning: no schemaLocation in to load schema\n"); } } return SOAP_OK; } int xs__include::traverse(xs__schema &schema) { (void)schema; return SOAP_OK; } void xs__include::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema *xs__include::schemaPtr() const { return schemaRef; } xs__redefine::xs__redefine() { schemaLocation = NULL; schemaRef = NULL; } int xs__redefine::preprocess(xs__schema &schema) { if (vflag) std::cerr << "Preprocessing schema redefine '" << (schemaLocation ? schemaLocation : "(null)") << "' into schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << std::endl; if (!schemaRef) { if (schemaLocation) { const char *relative_schemaLocation = soap_strdup(schema.soap, schemaLocation); schemaLocation = schema.absoluteLocation(schemaLocation); schemaRef = new xs__schema(schema.soap, schema.sourceLocation(), schemaLocation, relative_schemaLocation); // redefine xs:all, xs:choice, or xs:sequence in a group for (std::vector::iterator gp = schemaRef->group.begin(); gp != schemaRef->group.end(); ++gp) { if ((*gp).name) { for (std::vector::const_iterator g = group.begin(); g != group.end(); ++g) { if ((*g).name && !strcmp((*gp).name, (*g).name)) { if ((*g).all) { (*gp).all = (*g).all; } else if ((*g).choice && (*gp).choice) { xs__seqchoice& s = *(*gp).choice; (*gp).choice = soap_new_xs__seqchoice(schema.soap); for (std::vector::iterator c = (*g).choice->__contents.begin(); c != (*g).choice->__contents.end(); ) { if ((*c).__union == SOAP_UNION_xs__union_content_element) { (*gp).choice->__contents.push_back(*c); ++c; } else if ((*c).__union == SOAP_UNION_xs__union_content_group) { if ((*c).__content.group->ref) { const char *token = qname_token((*c).__content.group->ref, schema.targetNamespace); if (token && !strcmp((*gp).name, token)) for (std::vector::const_iterator d = s.__contents.begin(); d != s.__contents.end(); ++d) if ((*d).__union == SOAP_UNION_xs__union_content_element) (*gp).choice->__contents.push_back(*d); (*g).choice->__contents.erase(c); } } else { ++c; } } } else if ((*g).sequence && (*gp).sequence) { xs__seqchoice& s = *(*gp).sequence; (*gp).sequence = soap_new_xs__seqchoice(schema.soap); for (std::vector::iterator c = (*g).sequence->__contents.begin(); c != (*g).sequence->__contents.end(); ) { if ((*c).__union == SOAP_UNION_xs__union_content_element) { (*gp).sequence->__contents.push_back(*c); ++c; } else if ((*c).__union == SOAP_UNION_xs__union_content_group) { if ((*c).__content.group->ref) { const char *token = qname_token((*c).__content.group->ref, schema.targetNamespace); if (token && !strcmp((*gp).name, token)) for (std::vector::const_iterator d = s.__contents.begin(); d != s.__contents.end(); ++d) if ((*d).__union == SOAP_UNION_xs__union_content_element) (*gp).sequence->__contents.push_back(*d); (*g).sequence->__contents.erase(c); } } else { ++c; } } } break; } } } } // redefine specified attributes in an attributeGroup for (std::vector::iterator ag = schemaRef->attributeGroup.begin(); ag != schemaRef->attributeGroup.end(); ++ag) { if ((*ag).name) { for (std::vector::const_iterator g = attributeGroup.begin(); g != attributeGroup.end(); ++g) { if ((*g).name && !strcmp((*ag).name, (*g).name)) { for (std::vector::const_iterator ga = (*g).attribute.begin(); ga != (*g).attribute.end(); ++ga) { if ((*ga).name) { bool found = false; for (std::vector::iterator aga = (*ag).attribute.begin(); aga != (*ag).attribute.end(); ++aga) { if ((*aga).name && !strcmp((*aga).name, (*ga).name)) { *aga = *ga; found = true; break; } } if (!found) (*ag).attribute.push_back(*ga); } } } } } } // redefine simpleType for (std::vector::iterator st = schemaRef->simpleType.begin(); st != schemaRef->simpleType.end(); ++st) { if ((*st).name) { for (std::vector::const_iterator s = simpleType.begin(); s != simpleType.end(); ++s) { if ((*s).name && !strcmp((*st).name, (*s).name)) { char *base = (*st).restriction ? (*st).restriction->base : (char*)"xs:string"; *st = *s; (*st).restriction->base = base; break; } } } } // redefine complexType by extension/restriction for (std::vector::iterator ct = schemaRef->complexType.begin(); ct != schemaRef->complexType.end(); ++ct) { if ((*ct).name) { for (std::vector::const_iterator c = complexType.begin(); c != complexType.end(); ++c) { if ((*c).name && !strcmp((*ct).name, (*c).name)) { if ((*c).complexContent && (*c).complexContent->extension && qname_token((*c).complexContent->extension->base, schemaRef->targetNamespace)) { if ((*ct).all && (*c).complexContent->extension->all) { (*ct).all->element.insert((*ct).all->element.end(), (*c).complexContent->extension->all->element.begin(), (*c).complexContent->extension->all->element.end()); } else if ((*ct).choice && (*c).complexContent->extension->choice) { (*ct).choice->__contents.insert((*ct).choice->__contents.end(), (*c).complexContent->extension->choice->__contents.begin(), (*c).complexContent->extension->choice->__contents.end()); } else if ((*ct).sequence && (*c).complexContent->extension->sequence) { (*ct).sequence->__contents.insert((*ct).sequence->__contents.end(), (*c).complexContent->extension->sequence->__contents.begin(), (*c).complexContent->extension->sequence->__contents.end()); } else if ((*ct).group && (*c).complexContent->extension->group) { if ((*ct).group->sequence && (*c).complexContent->extension->group->sequence) (*ct).group->sequence->__contents.insert((*ct).group->sequence->__contents.end(), (*c).complexContent->extension->group->sequence->__contents.begin(), (*c).complexContent->extension->group->sequence->__contents.end()); } else if ((*ct).complexContent && (*ct).complexContent->extension) { if ((*ct).complexContent->extension->all && (*c).complexContent->extension->all) { (*ct).complexContent->extension->all->element.insert((*ct).complexContent->extension->all->element.end(), (*c).complexContent->extension->all->element.begin(), (*c).complexContent->extension->all->element.end()); } else if ((*ct).complexContent->extension->choice && (*c).complexContent->extension->choice) { (*ct).complexContent->extension->choice->__contents.insert((*ct).complexContent->extension->choice->__contents.end(), (*c).complexContent->extension->choice->__contents.begin(), (*c).complexContent->extension->choice->__contents.end()); } else if ((*ct).complexContent->extension->sequence && (*c).complexContent->extension->sequence) { (*ct).complexContent->extension->sequence->__contents.insert((*ct).complexContent->extension->sequence->__contents.end(), (*c).complexContent->extension->sequence->__contents.begin(), (*c).complexContent->extension->sequence->__contents.end()); } else if ((*ct).complexContent->extension->group && (*c).complexContent->extension->group) { if ((*ct).complexContent->extension->group->sequence && (*c).complexContent->extension->group->sequence) (*ct).complexContent->extension->group->sequence->__contents.insert((*ct).complexContent->extension->group->sequence->__contents.end(), (*c).complexContent->extension->group->sequence->__contents.begin(), (*c).complexContent->extension->group->sequence->__contents.end()); } else { (*ct).complexContent->extension->all = (*c).complexContent->extension->all; (*ct).complexContent->extension->choice = (*c).complexContent->extension->choice; (*ct).complexContent->extension->sequence = (*c).complexContent->extension->sequence; (*ct).complexContent->extension->group = (*c).complexContent->extension->group; } } else if ((*ct).complexContent && (*ct).complexContent->restriction) { if ((*ct).complexContent->restriction->all && (*c).complexContent->extension->all) { (*ct).complexContent->restriction->all->element.insert((*ct).complexContent->restriction->all->element.end(), (*c).complexContent->extension->all->element.begin(), (*c).complexContent->extension->all->element.end()); } else if ((*ct).complexContent->restriction->choice && (*c).complexContent->extension->choice) { (*ct).complexContent->restriction->choice->__contents.insert((*ct).complexContent->restriction->choice->__contents.end(), (*c).complexContent->extension->choice->__contents.begin(), (*c).complexContent->extension->choice->__contents.end()); } else if ((*ct).complexContent->restriction->sequence && (*c).complexContent->extension->sequence) { (*ct).complexContent->restriction->sequence->__contents.insert((*ct).complexContent->restriction->sequence->__contents.end(), (*c).complexContent->extension->sequence->__contents.begin(), (*c).complexContent->extension->sequence->__contents.end()); } else if ((*ct).complexContent->restriction->group && (*c).complexContent->extension->group) { if ((*ct).complexContent->restriction->group->sequence && (*c).complexContent->restriction->group->sequence) (*ct).complexContent->restriction->group->sequence->__contents.insert((*ct).complexContent->restriction->group->sequence->__contents.end(), (*c).complexContent->extension->group->sequence->__contents.begin(), (*c).complexContent->extension->group->sequence->__contents.end()); } else { (*ct).complexContent->restriction->all = (*c).complexContent->extension->all; (*ct).complexContent->restriction->choice = (*c).complexContent->extension->choice; (*ct).complexContent->restriction->sequence = (*c).complexContent->extension->sequence; (*ct).complexContent->restriction->group = (*c).complexContent->extension->group; } } else { (*ct).all = (*c).complexContent->extension->all; (*ct).choice = (*c).complexContent->extension->choice; (*ct).sequence = (*c).complexContent->extension->sequence; (*ct).group = (*c).complexContent->extension->group; } (*ct).attribute.insert((*ct).attribute.begin(), (*c).complexContent->extension->attribute.begin(), (*c).complexContent->extension->attribute.end()); } else if ((*c).complexContent && (*c).complexContent->restriction && qname_token((*c).complexContent->restriction->base, schemaRef->targetNamespace)) { (*ct).all = (*c).complexContent->restriction->all; (*ct).choice = (*c).complexContent->restriction->choice; (*ct).sequence = (*c).complexContent->restriction->sequence; (*ct).group = (*c).complexContent->restriction->group; (*ct).attribute = (*c).complexContent->restriction->attribute; (*ct).complexContent = NULL; } else { if (!Wflag) fprintf(stderr, "\nWarning: redefining complexType \"%s\" in schema \"%s\" by extension requires an extension base\n", (*ct).name, schemaRef->targetNamespace ? schemaRef->targetNamespace : "(null)"); } break; } } } } } else if (!Wflag) { fprintf(stderr, "\nWarning: no schemaLocation in to load schema\n"); } } return SOAP_OK; } int xs__redefine::traverse(xs__schema &schema) { (void)schema; return SOAP_OK; } void xs__redefine::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema *xs__redefine::schemaPtr() const { return schemaRef; } xs__override::xs__override() { schemaLocation = NULL; schemaRef = NULL; } int xs__override::preprocess(xs__schema &schema) { if (vflag) std::cerr << "Preprocessing schema override '" << (schemaLocation ? schemaLocation : "(null)") << "' into schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << std::endl; if (!schemaRef) { if (schemaLocation) { const char *relative_schemaLocation = soap_strdup(schema.soap, schemaLocation); schemaLocation = schema.absoluteLocation(schemaLocation); schemaRef = new xs__schema(schema.soap, schema.sourceLocation(), schemaLocation, relative_schemaLocation); for (std::vector::iterator el = schemaRef->element.begin(); el != schemaRef->element.end(); ++el) { if ((*el).name) { for (std::vector::const_iterator e = element.begin(); e != element.end(); ++e) { if ((*e).name && !strcmp((*el).name, (*e).name)) { *el = *e; break; } } } } for (std::vector::iterator at = schemaRef->attribute.begin(); at != schemaRef->attribute.end(); ++at) { if ((*at).name) { for (std::vector::const_iterator a = attribute.begin(); a != attribute.end(); ++a) { if ((*a).name && !strcmp((*at).name, (*a).name)) { *at = *a; break; } } } } for (std::vector::iterator gp = schemaRef->group.begin(); gp != schemaRef->group.end(); ++gp) { if ((*gp).name) { for (std::vector::const_iterator g = group.begin(); g != group.end(); ++g) { if ((*g).name && !strcmp((*gp).name, (*g).name)) { *gp = *g; break; } } } } for (std::vector::iterator ag = schemaRef->attributeGroup.begin(); ag != schemaRef->attributeGroup.end(); ++ag) { if ((*ag).name) { for (std::vector::const_iterator g = attributeGroup.begin(); g != attributeGroup.end(); ++g) { if ((*g).name && !strcmp((*ag).name, (*g).name)) { *ag = *g; break; } } } } for (std::vector::iterator st = schemaRef->simpleType.begin(); st != schemaRef->simpleType.end(); ++st) { if ((*st).name) { for (std::vector::const_iterator s = simpleType.begin(); s != simpleType.end(); ++s) { if ((*s).name && !strcmp((*st).name, (*s).name)) { *st = *s; break; } } } } for (std::vector::iterator ct = schemaRef->complexType.begin(); ct != schemaRef->complexType.end(); ++ct) { if ((*ct).name) { for (std::vector::const_iterator c = complexType.begin(); c != complexType.end(); ++c) { if ((*c).name && !strcmp((*ct).name, (*c).name)) { *ct = *c; break; } } } } } else if (!Wflag) { fprintf(stderr, "\nWarning: no schemaLocation in to load schema\n"); } } return SOAP_OK; } int xs__override::traverse(xs__schema &schema) { (void)schema; return SOAP_OK; } void xs__override::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema *xs__override::schemaPtr() const { return schemaRef; } xs__import::xs__import() { namespace_ = NULL; schemaLocation = NULL; location = NULL; // work around a Microsoft WSDL bug uses @location instead of @schemaLocation in WSDLs schemaRef = NULL; } int xs__import::preprocess(xs__schema &schema) { // work around a Microsoft bug that uses @location instead of @schemaLocation in WSDLs if (!schemaLocation && location) schemaLocation = location; if (vflag) std::cerr << " Preprocessing schema import '" << (namespace_ ? namespace_ : "(null)") << "'" << std::endl; if (!schemaRef) { bool found = false; if (namespace_) { for (SetOfString::const_iterator i = exturis.begin(); i != exturis.end(); ++i) { if (!soap_tag_cmp(namespace_, *i)) { found = true; break; } } } else if (!Wflag) { fprintf(stderr, "\nWarning: no namespace in \n"); } if (!found && !iflag) // don't import any of the schemas in the .nsmap table (or when -i option is used) { if (schemaLocation) { schemaLocation = schema.absoluteLocation(schemaLocation); // only read from import locations not read already, uses static std::map static std::map included; std::map::iterator i = included.find(schemaLocation); const char *relative_schemaLocation = soap_strdup(schema.soap, schemaLocation); if (i == included.end()) { included[schemaLocation] = schemaRef = new xs__schema(schema.soap); schemaRef->read(schema.sourceLocation(), schemaLocation, relative_schemaLocation); } else { schemaRef = (*i).second; } if (schemaRef) { if (!schemaRef->targetNamespace || !*schemaRef->targetNamespace) schemaRef->targetNamespace = namespace_; else if (!namespace_ || strcmp(schemaRef->targetNamespace, namespace_)) if (!Wflag) fprintf(stderr, "\nWarning: schema import '%s' with schema targetNamespace '%s' mismatch\n", namespace_ ? namespace_ : "(null)", schemaRef->targetNamespace); } } } } return SOAP_OK; } int xs__import::traverse(xs__schema &schema) { (void)schema; if (schemaRef) schemaRef->traverse(); return SOAP_OK; } void xs__import::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema *xs__import::schemaPtr() const { return schemaRef; } void xs__import::mark() { if (Oflag > 1) if (schemaPtr()) schemaPtr()->mark(); } xs__attribute::xs__attribute() { schemaRef = NULL; attributeRef = NULL; simpleTypeRef = NULL; used = false; } int xs__attribute::traverse(xs__schema &schema) { if (vflag) std::cerr << " Analyzing schema attribute '" << (name ? name : "(null)") << "'" << std::endl; schemaRef = &schema; const char *token = qname_token(ref, schema.targetNamespace); attributeRef = NULL; if (token) { for (std::vector::iterator i = schema.attribute.begin(); i != schema.attribute.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { attributeRef = &(*i); if (vflag) std::cerr << " Found attribute '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << std::endl; break; } } } if (!attributeRef) { for (std::vector::iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(ref, s->targetNamespace); if (token) { for (std::vector::iterator j = s->attribute.begin(); j != s->attribute.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { attributeRef = &(*j); if (vflag) std::cerr << " Found attribute '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (attributeRef) break; } } } } if (simpleType) { simpleType->traverse(schema); simpleTypeRef = simpleType; } else { token = qname_token(type, schema.targetNamespace); simpleTypeRef = NULL; if (token) { for (std::vector::iterator i = schema.simpleType.begin(); i != schema.simpleType.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { simpleTypeRef = &(*i); if (vflag) std::cerr << " Found attribute '" << (name ? name : "(null)") << "' type '" << (token ? token : "(null)") << "'" << std::endl; break; } } } if (!simpleTypeRef) { for (std::vector::iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(type, s->targetNamespace); if (token) { for (std::vector::iterator j = s->simpleType.begin(); j != s->simpleType.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { simpleTypeRef = &(*j); if (vflag) std::cerr << " Found attribute '" << (name ? name : "(null)") << "' type '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (simpleTypeRef) break; } } } } } if (!attributeRef && !simpleTypeRef) { if (ref) { if (is_builtin_qname(ref)) schema.builtinAttribute(ref); else if (!Wflag) std::cerr << "\nWarning: could not find the referenced attribute '" << (name ? name : "") << "' ref '" << ref << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << std::endl; /* moved to restriction::traverse() if (wsdl__arrayType) { char *arrayType = soap_strdup(schema.soap, wsdl__arrayType); char *s = strchr(arrayType, '['); if (s) *s = '\0'; if (is_builtin_qname(arrayType)) schema.builtinType(arrayType); } */ } else if (type) { if (is_builtin_qname(type)) schema.builtinType(type); else if (!Wflag) std::cerr << "\nWarning: could not find the type for attribute '" << (name ? name : "(null)") << "' type '" << type << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << std::endl; } } return SOAP_OK; } void xs__attribute::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema* xs__attribute::schemaPtr() const { return schemaRef; } void xs__attribute::attributePtr(xs__attribute *attribute) { attributeRef = attribute; } void xs__attribute::simpleTypePtr(xs__simpleType *simpleType) { simpleTypeRef = simpleType; } xs__attribute *xs__attribute::attributePtr() const { return attributeRef; } xs__simpleType *xs__attribute::simpleTypePtr() const { return simpleTypeRef; } void xs__attribute::mark() { if (Oflag > 1 && !used) { used = true; if (attributePtr()) attributePtr()->mark(); if (simpleTypePtr()) simpleTypePtr()->mark(); } } bool xs__attribute::is_used() const { return used; } xs__element::xs__element() { schemaRef = NULL; elementRef = NULL; simpleTypeRef = NULL; complexTypeRef = NULL; name = NULL; ref = NULL; type = NULL; default_ = NULL; default__ = NULL; fixed = NULL; fixed_ = NULL; form = NULL; nillable = false; abstract = false; substitutionGroup = NULL; minOccurs = NULL; maxOccurs = NULL; xmime__expectedContentTypes = NULL; annotation = NULL; simpleType = NULL; complexType = NULL; unique = NULL; used = false; } int xs__element::traverse(xs__schema &schema) { if (vflag) std::cerr << " Analyzing schema element '" << (name ? name : "(null)") << "'" << std::endl; schemaRef = &schema; const char *token = qname_token(ref, schema.targetNamespace); elementRef = NULL; if (token) { for (std::vector::iterator i = schema.element.begin(); i != schema.element.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { elementRef = &(*i); if (vflag) std::cerr << " Found element '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << std::endl; break; } } } if (!elementRef) { for (std::vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(ref, s->targetNamespace); if (token) { for (std::vector::iterator j = s->element.begin(); j != s->element.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { elementRef = &(*j); if (vflag) std::cerr << " Found element '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (elementRef) break; } } } } if (simpleType) { simpleType->traverse(schema); simpleTypeRef = simpleType; } else { token = qname_token(type, schema.targetNamespace); simpleTypeRef = NULL; if (token) { for (std::vector::iterator i = schema.simpleType.begin(); i != schema.simpleType.end(); ++i) if ((*i).name && !strcmp((*i).name, token)) { simpleTypeRef = &(*i); if (vflag) std::cerr << " Found element '" << (name ? name : "(null)") << "' simpleType '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (!simpleTypeRef) { for (std::vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(type, s->targetNamespace); if (token) { for (std::vector::iterator j = s->simpleType.begin(); j != s->simpleType.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { simpleTypeRef = &(*j); if (vflag) std::cerr << " Found element '" << (name ? name : "(null)") << "' simpleType '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (simpleTypeRef) break; } } } } } if (complexType) { complexType->traverse(schema); complexTypeRef = complexType; } else { token = qname_token(type, schema.targetNamespace); complexTypeRef = NULL; if (token) { for (std::vector::iterator i = schema.complexType.begin(); i != schema.complexType.end(); ++i) if ((*i).name && !strcmp((*i).name, token)) { complexTypeRef = &(*i); if (vflag) std::cerr << " Found element '" << (name ? name : "(null)") << "' complexType '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (!complexTypeRef) { for (std::vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(type, s->targetNamespace); if (token) { for (std::vector::iterator j = s->complexType.begin(); j != s->complexType.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { complexTypeRef = &(*j); if (vflag) std::cerr << " Found element '" << (name ? name : "(null)") << "' complexType '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (complexTypeRef) break; } } } } } if (!abstract && substitutionGroup) { token = qname_token(substitutionGroup, schema.targetNamespace); if (token) { for (std::vector::iterator i = schema.element.begin(); i != schema.element.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { xs__element *elt = this; if (!elementPtr()) { elt = soap_new_xs__element(schema.soap); elt->soap_default(schema.soap); elt->name = name; elt->form = form; elt->elementPtr(this); // create element ref in substitutionGroup elt->schemaPtr(schemaPtr()); elt->targetNamespace = NULL; } (*i).substitutions.push_back(elt); if (vflag) std::cerr << " Found substitutionGroup element '" << (name ? name : "(null)") << "' for element '" << (token ? token : "(null)") << "'" << std::endl; break; } } } for (std::vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(substitutionGroup, s->targetNamespace); if (token) { for (std::vector::iterator j = s->element.begin(); j != s->element.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { xs__element *elt = this; if (!elementPtr()) { elt = soap_new_xs__element(schema.soap); elt->soap_default(schema.soap); elt->name = name; elt->form = form; elt->elementPtr(this); // create element ref in substitutionGroup elt->schemaPtr(schemaPtr()); elt->targetNamespace = NULL; } (*j).substitutions.push_back(elt); if (vflag) std::cerr << " Found substitutionGroup element '" << (name ? name : "(null)") << "' for element '" << (token ? token : "(null)") << "' in '" << s->targetNamespace << "'" << std::endl; break; } } } } } } if (!elementRef && !simpleTypeRef && !complexTypeRef) { if (ref) { if (is_builtin_qname(ref)) schema.builtinElement(ref); else if (!Wflag) std::cerr << "\nWarning: could not find the referenced element '" << (name ? name : "") << "' ref '" << ref << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << std::endl; } else if (type) { if (is_builtin_qname(type)) schema.builtinType(type); else if (!Wflag) std::cerr << "\nWarning: could not find the type for element '" << (name ? name : "(null)") << "' type '" << type << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << std::endl; } } return SOAP_OK; } void xs__element::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema* xs__element::schemaPtr() const { return schemaRef; } void xs__element::elementPtr(xs__element *element) { elementRef = element; } void xs__element::simpleTypePtr(xs__simpleType *simpleType) { simpleTypeRef = simpleType; } void xs__element::complexTypePtr(xs__complexType *complexType) { complexTypeRef = complexType; } xs__element *xs__element::elementPtr() const { return elementRef; } const std::vector* xs__element::substitutionsPtr() const { return &substitutions; } xs__simpleType *xs__element::simpleTypePtr() const { return simpleTypeRef; } xs__complexType *xs__element::complexTypePtr() const { return complexTypeRef; } void xs__element::mark() { if (Oflag > 1 && !used) { used = true; if (elementPtr()) elementPtr()->mark(); if (simpleTypePtr()) simpleTypePtr()->mark(); if (complexTypePtr()) complexTypePtr()->mark(); for (std::vector::iterator i = substitutions.begin(); i != substitutions.end(); ++i) if ((*i)->elementPtr()) (*i)->elementPtr()->mark(); } } bool xs__element::is_used() const { return used; } xs__simpleType::xs__simpleType() { schemaRef = NULL; level = 0; used = false; } int xs__simpleType::traverse(xs__schema &schema) { if (vflag) std::cerr << " Analyzing schema simpleType '" << (name ? name : "(null)") << "'" << std::endl; schemaRef = &schema; if (list) { list->traverse(schema); } else if (restriction) { restriction->traverse(schema); if (name) { xs__simpleType *base = restriction->simpleTypePtr(); if (base) base->add_restriction(schema, name); else if (is_builtin_qname(restriction->base)) schema.builtinTypeDerivation(schema, restriction->base, name); } } else if (union_) { union_->traverse(schema); } return SOAP_OK; } void xs__simpleType::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema *xs__simpleType::schemaPtr() const { return schemaRef; } int xs__simpleType::baseLevel() { if (!level) { if (restriction) { level = -1; if (restriction->simpleTypePtr()) level = restriction->simpleTypePtr()->baseLevel() + 1; else level = 2; } else if (list && list->restriction) { level = -1; if (list->restriction->simpleTypePtr()) level = list->restriction->simpleTypePtr()->baseLevel() + 1; else level = 2; } else level = 1; } else if (level < 0) { std::cerr << "Error: cyclic simpleType restriction/extension base dependency in '" << (name ? name : "(null)") << "'" << std::endl; } return level; } void xs__simpleType::mark() { if (Oflag > 1 && !used) { used = true; if (restriction) restriction->mark(); else if (list) list->mark(); else if (union_) union_->mark(); if (Owflag) for (std::vector::const_iterator i = complextype_extensions.begin(); i != complextype_extensions.end(); ++i) (*i)->mark(); } } bool xs__simpleType::is_used() const { return used; } void xs__simpleType::add_extension(xs__complexType *complexType, xs__schema& schema, xsd__NCName name) { complextype_extensions.push_back(complexType); extensions.push_back(make_qname(schema, name)); } void xs__simpleType::add_restriction(xs__schema& schema, xsd__NCName name) { restrictions.push_back(make_qname(schema, name)); } const std::vector& xs__simpleType::get_extensions() const { return extensions; } const std::vector& xs__simpleType::get_restrictions() const { return restrictions; } xs__complexType::xs__complexType() { schemaRef = NULL; level = 0; used = false; } int xs__complexType::traverse(xs__schema &schema) { if (vflag) std::cerr << " Analyzing schema complexType '" << (name ? name : "(null)") << "'" << std::endl; schemaRef = &schema; if (simpleContent) { simpleContent->traverse(schema); if (name) { if (simpleContent->extension) { xs__complexType *ct_base = simpleContent->extension->complexTypePtr(); if (ct_base) { ct_base->add_extension(this, schema, name); } else { xs__simpleType *st_base = simpleContent->extension->simpleTypePtr(); if (st_base) st_base->add_extension(this, schema, name); else if (is_builtin_qname(simpleContent->extension->base)) schema.builtinTypeDerivation(schema, simpleContent->extension->base, name); } } else if (simpleContent->restriction) { xs__complexType *ct_base = simpleContent->restriction->complexTypePtr(); if (ct_base) { ct_base->add_restriction(schema, name); } else { xs__simpleType *st_base = simpleContent->restriction->simpleTypePtr(); if (st_base) st_base->add_restriction(schema, name); else if (is_builtin_qname(simpleContent->restriction->base)) schema.builtinTypeDerivation(schema, simpleContent->restriction->base, name); } } } } else if (complexContent) { complexContent->traverse(schema); if (name) { if (complexContent->extension) { xs__complexType *ct_base = complexContent->extension->complexTypePtr(); if (ct_base) ct_base->add_extension(this, schema, name); } else if (complexContent->restriction) { xs__complexType *ct_base = complexContent->restriction->complexTypePtr(); if (ct_base) ct_base->add_restriction(schema, name); } } } else if (all) { all->traverse(schema); } else if (choice) { choice->traverse(schema); } else if (sequence) { sequence->traverse(schema); } else if (group) { group->traverse(schema); } else if (any) { any->traverse(schema); } for (std::vector::iterator at = attribute.begin(); at != attribute.end(); ++at) (*at).traverse(schema); for (std::vector::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) (*ag).traverse(schema); return SOAP_OK; } void xs__complexType::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema *xs__complexType::schemaPtr() const { return schemaRef; } int xs__complexType::baseLevel() { if (!level) { if (simpleContent) { if (simpleContent->restriction) { level = -1; if (simpleContent->restriction->simpleTypePtr()) level = simpleContent->restriction->simpleTypePtr()->baseLevel() + 1; else if (simpleContent->restriction->complexTypePtr()) level = simpleContent->restriction->complexTypePtr()->baseLevel() + 1; else level = 2; } else if (simpleContent->extension) { level = -1; if (simpleContent->extension->simpleTypePtr()) level = simpleContent->extension->simpleTypePtr()->baseLevel() + 1; else if (simpleContent->extension->complexTypePtr()) level = simpleContent->extension->complexTypePtr()->baseLevel() + 1; else level = 2; } } else if (complexContent) { if (complexContent->restriction) { level = -1; if (complexContent->restriction->simpleTypePtr()) level = complexContent->restriction->simpleTypePtr()->baseLevel() + 1; else if (complexContent->restriction->complexTypePtr()) level = complexContent->restriction->complexTypePtr()->baseLevel() + 1; else level = 2; } else if (complexContent->extension) { level = -1; if (complexContent->extension->simpleTypePtr()) level = complexContent->extension->simpleTypePtr()->baseLevel() + 1; else if (complexContent->extension->complexTypePtr()) level = complexContent->extension->complexTypePtr()->baseLevel() + 1; else level = 2; } } else level = 1; } else if (level < 0) { std::cerr << "Error: cyclic complexType restriction/extension base dependency in '" << (name ? name : "(null)") << "'" << std::endl; } return level; } void xs__complexType::mark() { if (Oflag > 1 && !used) { used = true; if (simpleContent) simpleContent->mark(); else if (complexContent) complexContent->mark(); else if (all) all->mark(); else if (choice) choice->mark(); else if (sequence) sequence->mark(); else if (group) group->mark(); else if (any) any->mark(); for (std::vector::iterator at = attribute.begin(); at != attribute.end(); ++at) (*at).mark(); for (std::vector::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) (*ag).mark(); if (Owflag) for (std::vector::const_iterator i = complextype_extensions.begin(); i != complextype_extensions.end(); ++i) (*i)->mark(); } } bool xs__complexType::is_used() const { return used; } void xs__complexType::add_extension(xs__complexType *complexType, xs__schema& schema, xsd__NCName name) { complextype_extensions.push_back(complexType); extensions.push_back(make_qname(schema, name)); } void xs__complexType::add_restriction(xs__schema& schema, xsd__NCName name) { restrictions.push_back(make_qname(schema, name)); } const std::vector& xs__complexType::get_extensions() const { return extensions; } const std::vector& xs__complexType::get_restrictions() const { return restrictions; } int xs__simpleContent::traverse(xs__schema &schema) { if (vflag) std::cerr << " Analyzing schema simpleContent" << std::endl; if (extension) extension->traverse(schema); else if (restriction) restriction->traverse(schema); return SOAP_OK; } void xs__simpleContent::mark() { if (Oflag > 1) { if (extension) extension->mark(); else if (restriction) restriction->mark(); } } int xs__complexContent::traverse(xs__schema &schema) { if (vflag) std::cerr << " Analyzing schema complexContent" << std::endl; if (extension) extension->traverse(schema); else if (restriction) restriction->traverse(schema); return SOAP_OK; } void xs__complexContent::mark() { if (Oflag > 1) { if (extension) extension->mark(); else if (restriction) restriction->mark(); } } xs__extension::xs__extension() { simpleTypeRef = NULL; complexTypeRef = NULL; } int xs__extension::traverse(xs__schema &schema) { if (vflag) std::cerr << " Analyzing schema extension '" << (base ? base : "(null)") << "'" << std::endl; if (group) group->traverse(schema); else if (all) all->traverse(schema); else if (choice) choice->traverse(schema); else if (sequence) sequence->traverse(schema); for (std::vector::iterator at = attribute.begin(); at != attribute.end(); ++at) (*at).traverse(schema); for (std::vector::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) (*ag).traverse(schema); const char *token = qname_token(base, schema.targetNamespace); simpleTypeRef = NULL; if (token) { for (std::vector::iterator i = schema.simpleType.begin(); i != schema.simpleType.end(); ++i) if ((*i).name && !strcmp((*i).name, token)) { simpleTypeRef = &(*i); if (vflag) std::cerr << " Found extension base type '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (!simpleTypeRef) { for (std::vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(base, s->targetNamespace); if (token) { for (std::vector::iterator j = s->simpleType.begin(); j != s->simpleType.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { simpleTypeRef = &(*j); if (vflag) std::cerr << " Found extension base type '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (simpleTypeRef) break; } } } } token = qname_token(base, schema.targetNamespace); complexTypeRef = NULL; if (token) { for (std::vector::iterator i = schema.complexType.begin(); i != schema.complexType.end(); ++i) if ((*i).name && !strcmp((*i).name, token)) { complexTypeRef = &(*i); if (vflag) std::cerr << " Found extension base type '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (!complexTypeRef) { for (std::vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(base, s->targetNamespace); if (token) { for (std::vector::iterator j = s->complexType.begin(); j != s->complexType.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { complexTypeRef = &(*j); if (vflag) std::cerr << " Found extension base type '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (complexTypeRef) break; } } } } if (!simpleTypeRef && !complexTypeRef) { if (base) { if (is_builtin_qname(base)) schema.builtinType(base); else if (!Wflag) std::cerr << "\nWarning: could not find extension base type '" << base << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << std::endl; } else std::cerr << "Extension has no base" << std::endl; } return SOAP_OK; } void xs__extension::simpleTypePtr(xs__simpleType *simpleType) { simpleTypeRef = simpleType; } void xs__extension::complexTypePtr(xs__complexType *complexType) { complexTypeRef = complexType; } void xs__extension::mark() { if (Oflag > 1) { if (simpleTypePtr()) simpleTypePtr()->mark(); if (complexTypePtr()) complexTypePtr()->mark(); if (group) group->mark(); else if (all) all->mark(); else if (choice) choice->mark(); else if (sequence) sequence->mark(); for (std::vector::iterator at = attribute.begin(); at != attribute.end(); ++at) (*at).mark(); for (std::vector::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) (*ag).mark(); } } xs__simpleType *xs__extension::simpleTypePtr() const { return simpleTypeRef; } xs__complexType *xs__extension::complexTypePtr() const { return complexTypeRef; } xs__restriction::xs__restriction() { simpleTypeRef = NULL; complexTypeRef = NULL; simpleArrayTypeRef = NULL; complexArrayTypeRef = NULL; } int xs__restriction::traverse(xs__schema &schema) { if (vflag) std::cerr << " Analyzing schema restriction '" << (base ? base : "(null)") << "'" << std::endl; if (simpleType) simpleType->traverse(schema); if (attributeGroup) attributeGroup->traverse(schema); if (group) group->traverse(schema); else if (all) all->traverse(schema); else if (choice) choice->traverse(schema); else if (sequence) sequence->traverse(schema); else { for (std::vector::iterator en = enumeration.begin(); en != enumeration.end(); ++en) (*en).traverse(schema); for (std::vector::iterator pn = pattern.begin(); pn != pattern.end(); ++pn) (*pn).traverse(schema); } for (std::vector::iterator at = attribute.begin(); at != attribute.end(); ++at) { (*at).traverse(schema); if ((*at).wsdl__arrayType) { char *arrayType = soap_strdup(schema.soap, (*at).wsdl__arrayType); char *r = strchr(arrayType, '['); if (r) *r = '\0'; #if 0 /* one work-around for incomplete schemas with SOAP arrays defined solely by wsdl:arrayType is to add sequence/element with type but this creates __ptritem */ if (!sequence) { std::cerr << "ADDED sequence/element for array\n"; sequence = soap_new_xs__seqchoice(schema.soap); sequence->soap_default(schema.soap); xs__contents ct; ct.__union = SOAP_UNION_xs__union_content_element; ct.__content.element = soap_new_xs__element(schema.soap); ct.__content.element->soap_default(schema.soap); ct.__content.element->name = soap_strdup(schema.soap, "item"); ct.__content.element->type = arrayType; ct.__content.element->minOccurs = soap_strdup(schema.soap, "0"); ct.__content.element->maxOccurs = soap_strdup(schema.soap, "unbounded"); sequence->__contents.push_back(ct); sequence->traverse(schema); } #else /* another way is to add simpleArrayTypeRef and complexArrayTypeRef */ const char *token = qname_token(arrayType, schema.targetNamespace); simpleArrayTypeRef = NULL; if (token) { for (std::vector::iterator i = schema.simpleType.begin(); i != schema.simpleType.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { simpleArrayTypeRef = &(*i); if (vflag) std::cerr << " Found restriction array type '" << (token ? token : "(null)") << "'" << std::endl; break; } } } if (!simpleArrayTypeRef) { for (std::vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(arrayType, s->targetNamespace); if (token) { for (std::vector::iterator j = s->simpleType.begin(); j != s->simpleType.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { simpleArrayTypeRef = &(*j); if (vflag) std::cerr << " Found restriction array type '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (simpleArrayTypeRef) break; } } } } token = qname_token(arrayType, schema.targetNamespace); complexArrayTypeRef = NULL; if (token) { for (std::vector::iterator i = schema.complexType.begin(); i != schema.complexType.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { complexArrayTypeRef = &(*i); if (vflag) std::cerr << " Found restriction array type '" << (token ? token : "(null)") << "'" << std::endl; break; } } } if (!complexArrayTypeRef) { for (std::vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(arrayType, s->targetNamespace); if (token) { for (std::vector::iterator j = s->complexType.begin(); j != s->complexType.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { complexArrayTypeRef = &(*j); if (vflag) std::cerr << " Found restriction array type '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (complexArrayTypeRef) break; } } } } if (!simpleArrayTypeRef && !complexArrayTypeRef) { if (is_builtin_qname(arrayType)) schema.builtinType(arrayType); else if (!Wflag) std::cerr << "\nWarning: could not find restriction array type '" << arrayType << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << std::endl; } #endif } } const char *token = qname_token(base, schema.targetNamespace); simpleTypeRef = NULL; if (token) { for (std::vector::iterator i = schema.simpleType.begin(); i != schema.simpleType.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { simpleTypeRef = &(*i); if (vflag) std::cerr << " Found restriction base type '" << (token ? token : "(null)") << "'" << std::endl; break; } } } if (!simpleTypeRef) { for (std::vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(base, s->targetNamespace); if (token) { for (std::vector::iterator j = s->simpleType.begin(); j != s->simpleType.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { simpleTypeRef = &(*j); if (vflag) std::cerr << " Found restriction base type '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (simpleTypeRef) break; } } } } token = qname_token(base, schema.targetNamespace); complexTypeRef = NULL; if (token) { for (std::vector::iterator i = schema.complexType.begin(); i != schema.complexType.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { complexTypeRef = &(*i); if (vflag) std::cerr << " Found restriction base type '" << (token ? token : "(null)") << "'" << std::endl; break; } } } if (!complexTypeRef) { for (std::vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(base, s->targetNamespace); if (token) { for (std::vector::iterator j = s->complexType.begin(); j != s->complexType.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { complexTypeRef = &(*j); if (vflag) std::cerr << " Found restriction base type '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (complexTypeRef) break; } } } } if (!simpleTypeRef && !complexTypeRef) { if (base) { if (is_builtin_qname(base)) schema.builtinType(base); else if (!Wflag) std::cerr << "\nWarning: could not find restriction base type '" << base << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << std::endl; } else if (!simpleType) { std::cerr << "Restriction has no base" << std::endl; } } return SOAP_OK; } void xs__restriction::simpleTypePtr(xs__simpleType *simpleType) { simpleTypeRef = simpleType; } void xs__restriction::complexTypePtr(xs__complexType *complexType) { complexTypeRef = complexType; } xs__simpleType *xs__restriction::simpleTypePtr() const { return simpleTypeRef; } xs__complexType *xs__restriction::complexTypePtr() const { return complexTypeRef; } xs__simpleType *xs__restriction::simpleArrayTypePtr() const { return simpleArrayTypeRef; } xs__complexType *xs__restriction::complexArrayTypePtr() const { return complexArrayTypeRef; } void xs__restriction::mark() { if (Oflag > 1) { if (simpleTypePtr()) simpleTypePtr()->mark(); if (complexTypePtr()) complexTypePtr()->mark(); if (simpleArrayTypePtr()) simpleArrayTypePtr()->mark(); if (complexArrayTypePtr()) complexArrayTypePtr()->mark(); if (simpleType) simpleType->mark(); if (attributeGroup) attributeGroup->mark(); if (group) group->mark(); else if (all) all->mark(); else if (choice) choice->mark(); else if (sequence) sequence->mark(); for (std::vector::iterator at = attribute.begin(); at != attribute.end(); ++at) (*at).mark(); } } xs__list::xs__list() { itemTypeRef = NULL; } int xs__list::traverse(xs__schema &schema) { if (vflag) std::cerr << " Analyzing schema list" << std::endl; if (restriction) restriction->traverse(schema); for (std::vector::iterator i = simpleType.begin(); i != simpleType.end(); ++i) (*i).traverse(schema); itemTypeRef = NULL; const char *token = qname_token(itemType, schema.targetNamespace); if (token) { for (std::vector::iterator i = schema.simpleType.begin(); i != schema.simpleType.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { itemTypeRef = &(*i); if (vflag) std::cerr << " Found list itemType '" << (token ? token : "(null)") << "'" << std::endl; break; } } } if (!itemTypeRef) { for (std::vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(itemType, s->targetNamespace); if (token) { for (std::vector::iterator j = s->simpleType.begin(); j != s->simpleType.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { itemTypeRef = &(*j); if (vflag) std::cerr << " Found list itemType '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (itemTypeRef) break; } } } } if (itemType && !itemTypeRef) { if (is_builtin_qname(itemType)) schema.builtinType(itemType); else if (!Wflag) std::cerr << "\nWarning: could not find list itemType '" << itemType << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << std::endl; } return SOAP_OK; } void xs__list::itemTypePtr(xs__simpleType *simpleType) { itemTypeRef = simpleType; } xs__simpleType *xs__list::itemTypePtr() const { return itemTypeRef; } void xs__list::mark() { if (Oflag > 1) { if (restriction) restriction->mark(); for (std::vector::iterator i = simpleType.begin(); i != simpleType.end(); ++i) (*i).mark(); } } int xs__union::traverse(xs__schema &schema) { if (vflag) std::cerr << " Analyzing schema union" << std::endl; for (std::vector::iterator i = simpleType.begin(); i != simpleType.end(); ++i) (*i).traverse(schema); return SOAP_OK; } void xs__union::mark() { if (Oflag > 1) { for (std::vector::iterator i = simpleType.begin(); i != simpleType.end(); ++i) (*i).mark(); } } int xs__all::traverse(xs__schema &schema) { if (vflag) std::cerr << " Analyzing schema all" << std::endl; for (std::vector::iterator i = element.begin(); i != element.end(); ++i) (*i).traverse(schema); return SOAP_OK; } void xs__all::mark() { if (Oflag > 1) for (std::vector::iterator i = element.begin(); i != element.end(); ++i) (*i).mark(); } int xs__contents::traverse(xs__schema &schema) { switch (__union) { case SOAP_UNION_xs__union_content_element: if (__content.element) __content.element->traverse(schema); break; case SOAP_UNION_xs__union_content_group: if (__content.group) __content.group->traverse(schema); break; case SOAP_UNION_xs__union_content_choice: if (__content.choice) __content.choice->traverse(schema); break; case SOAP_UNION_xs__union_content_sequence: if (__content.sequence) __content.sequence->traverse(schema); break; case SOAP_UNION_xs__union_content_any: if (__content.any) __content.any->traverse(schema); break; } return SOAP_OK; } void xs__contents::mark() { if (Oflag > 1) { switch (__union) { case SOAP_UNION_xs__union_content_element: if (__content.element) __content.element->mark(); break; case SOAP_UNION_xs__union_content_group: if (__content.group) __content.group->mark(); break; case SOAP_UNION_xs__union_content_choice: if (__content.choice) __content.choice->mark(); break; case SOAP_UNION_xs__union_content_sequence: if (__content.sequence) __content.sequence->mark(); break; case SOAP_UNION_xs__union_content_any: if (__content.any) __content.any->mark(); break; } } } xs__seqchoice::xs__seqchoice() { minOccurs = NULL; maxOccurs = NULL; annotation = NULL; schemaRef = NULL; } int xs__seqchoice::traverse(xs__schema &schema) { if (vflag) std::cerr << " Analyzing schema sequence/choice" << std::endl; schemaRef = &schema; for (std::vector::iterator c = __contents.begin(); c != __contents.end(); ++c) (*c).traverse(schema); if (Oflag > 0) { SetOfString members; for (std::vector::iterator c = __contents.begin(); c != __contents.end(); ) { if ((*c).__union == SOAP_UNION_xs__union_content_sequence) { for (std::vector::iterator c1 = (*c).__content.sequence->__contents.begin(); c1 != (*c).__content.sequence->__contents.end(); ) { if ((*c1).__union == SOAP_UNION_xs__union_content_element) { xs__element *e = (*c1).__content.element; if (e->elementPtr()) { e = e->elementPtr(); } if (e->name) { if (members.find(e->name) != members.end()) { (*c).__content.sequence->__contents.erase(c1); if (!Wflag) std::cerr << "\nOptimization: removed duplicate element '" << e->name << "' from nested choice/sequence" << std::endl; } else { members.insert(e->name); ++c1; } } else { ++c1; } } else { ++c1; } } ++c; } else if ((*c).__union == SOAP_UNION_xs__union_content_element) { xs__element *e = (*c).__content.element; if (e->elementPtr()) { e = e->elementPtr(); } if (e->name) { if (members.find(e->name) != members.end()) { __contents.erase(c); std::cerr << "\nOptimization: removed duplicate element '" << e->name << "' from nested xs:sequence/xs:choice" << std::endl; } else { members.insert(e->name); ++c; } } else { ++c; } } else { ++c; } } } return SOAP_OK; } void xs__seqchoice::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema *xs__seqchoice::schemaPtr() const { return schemaRef; } void xs__seqchoice::mark() { if (Oflag > 1) for (std::vector::iterator c = __contents.begin(); c != __contents.end(); ++c) (*c).mark(); } xs__attributeGroup::xs__attributeGroup() { schemaRef = NULL; attributeGroupRef = NULL; used = false; } int xs__attributeGroup::traverse(xs__schema& schema) { if (vflag) std::cerr << " Analyzing schema attributeGroup" << std::endl; schemaRef = &schema; for (std::vector::iterator at = attribute.begin(); at != attribute.end(); ++at) (*at).traverse(schema); for (std::vector::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) (*ag).traverse(schema); attributeGroupRef = NULL; if (ref) { const char *token = qname_token(ref, schema.targetNamespace); if (token) { for (std::vector::iterator i = schema.attributeGroup.begin(); i != schema.attributeGroup.end(); ++i) if ((*i).name && !strcmp((*i).name, token)) { attributeGroupRef = &(*i); if (vflag) std::cerr << " Found attributeGroup '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (!attributeGroupRef) { for (std::vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(ref, s->targetNamespace); if (token) { for (std::vector::iterator j = s->attributeGroup.begin(); j != s->attributeGroup.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { attributeGroupRef = &(*j); if (vflag) std::cerr << " Found attribute Group '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (attributeGroupRef) break; } } } } if (!attributeGroupRef) if (!Wflag) std::cerr << "\nWarning: could not find the referenced attributeGroup '" << (name ? name : "") << "' ref '" << (ref ? ref : "(null)") << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << std::endl; } return SOAP_OK; } void xs__attributeGroup::schemaPtr(xs__schema *schema) { schemaRef = schema; } void xs__attributeGroup::attributeGroupPtr(xs__attributeGroup *attributeGroup) { attributeGroupRef = attributeGroup; } xs__schema *xs__attributeGroup::schemaPtr() const { return schemaRef; } xs__attributeGroup *xs__attributeGroup::attributeGroupPtr() const { return attributeGroupRef; } void xs__attributeGroup::mark() { if (Oflag > 1 && !used) { used = true; if (attributeGroupPtr()) attributeGroupPtr()->mark(); for (std::vector::iterator at = attribute.begin(); at != attribute.end(); ++at) (*at).mark(); for (std::vector::iterator ag = attributeGroup.begin(); ag != attributeGroup.end(); ++ag) (*ag).mark(); } } int xs__any::traverse(xs__schema &schema) { if (vflag) std::cerr << " Analyzing schema any" << std::endl; for (std::vector::iterator i = element.begin(); i != element.end(); ++i) (*i).traverse(schema); return SOAP_OK; } void xs__any::mark() { if (Oflag > 1) for (std::vector::iterator i = element.begin(); i != element.end(); ++i) (*i).mark(); } xs__group::xs__group() { schemaRef = NULL; groupRef = NULL; used = false; } int xs__group::traverse(xs__schema &schema) { if (vflag) std::cerr << " Analyzing schema group" << std::endl; schemaRef = &schema; if (all) all->traverse(schema); if (choice) choice->traverse(schema); if (sequence) sequence->traverse(schema); groupRef = NULL; if (ref) { const char *token = qname_token(ref, schema.targetNamespace); if (token) { for (std::vector::iterator i = schema.group.begin(); i != schema.group.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { groupRef = &(*i); if (vflag) std::cerr << " Found group '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << std::endl; break; } } } if (!groupRef) { for (std::vector::const_iterator i = schema.import.begin(); i != schema.import.end(); ++i) { xs__schema *s = (*i).schemaPtr(); if (s) { token = qname_token(ref, s->targetNamespace); if (token) { for (std::vector::iterator j = s->group.begin(); j != s->group.end(); ++j) { if ((*j).name && !strcmp((*j).name, token)) { groupRef = &(*j); if (vflag) std::cerr << " Found group '" << (name ? name : "(null)") << "' ref '" << (token ? token : "(null)") << "'" << std::endl; break; } } if (groupRef) break; } } } } if (!groupRef) if (!Wflag) std::cerr << "\nWarning: could not find the referenced group '" << (name ? name : "") << "' ref '" << (ref ? ref : "(null)") << "' in schema '" << (schema.targetNamespace ? schema.targetNamespace : "(null)") << "'" << std::endl; } return SOAP_OK; } void xs__group::schemaPtr(xs__schema *schema) { schemaRef = schema; } xs__schema* xs__group::schemaPtr() const { return schemaRef; } void xs__group::groupPtr(xs__group *group) { groupRef = group; } xs__group* xs__group::groupPtr() const { return groupRef; } void xs__group::mark() { if (Oflag > 1 && !used) { used = true; if (groupPtr()) groupPtr()->mark(); if (all) all->mark(); if (choice) choice->mark(); if (sequence) sequence->mark(); } } int xs__enumeration::traverse(xs__schema &schema) { (void)schema; if (vflag) std::cerr << " Analyzing schema enumeration '" << (value ? value : "(null)") << "'" << std::endl; return SOAP_OK; } int xs__pattern::traverse(xs__schema &schema) { (void)schema; if (vflag) std::cerr << " Analyzing schema pattern" << std::endl; return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // I/O // //////////////////////////////////////////////////////////////////////////////// std::ostream &operator<<(std::ostream &o, const xs__schema &e) { if (!e.soap) { struct soap soap; soap_init2(&soap, SOAP_IO_DEFAULT, SOAP_XML_TREE | SOAP_C_UTFSTRING); soap_set_namespaces(&soap, namespaces); e.soap_serialize(&soap); soap_begin_send(&soap); e.soap_out(&soap, "xs:schema", 0, NULL); soap_end_send(&soap); soap_end(&soap); soap_done(&soap); } else { std::ostream *os = e.soap->os; e.soap->os = &o; e.soap_serialize(e.soap); soap_begin_send(e.soap); e.soap_out(e.soap, "xs:schema", 0, NULL); soap_end_send(e.soap); e.soap->os = os; } return o; } std::istream &operator>>(std::istream &i, xs__schema &e) { if (!e.soap) { e.soap = soap_new(); soap_set_namespaces(e.soap, namespaces); } std::istream *is = e.soap->is; e.soap->is = &i; if (soap_begin_recv(e.soap) || !e.soap_in(e.soap, "xs:schema", NULL) || soap_end_recv(e.soap)) { // handle error? Note: e.soap->error is set and app should check } e.soap->is = is; return i; } gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/wsp.h0000644000175000017500000002051213525245163021735 0ustar ellertellert/* wsp.h WS-Policy 1.2 and 1.5 binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap wsp schema documentation: WS-Policy binding //gsoap wsp schema namespace: http://www.w3.org/ns/ws-policy // 1.2 //gsoap wsp schema namespace: http://schemas.xmlsoap.org/ws/2004/09/policy //gsoap wsp schema elementForm: qualified //gsoap wsp schema attributeForm: unqualified #import "imports.h" #import "wsu.h" class wsp__Policy; class wsp__Content; extern class Service; extern class Types; class wsp__PolicyReference { public: @xsd__anyURI URI; @xsd__string Digest; @xsd__anyURI DigestAlgorithm; private: wsp__Policy *policyRef; public: int traverse(wsdl__definitions&); void policyPtr(wsp__Policy*); wsp__Policy *policyPtr() const; }; class wsp__Assertion { public: @bool Optional = false; @bool Ignorable = false; wsp__Content *Policy; }; #import "sp.h" #import "wsrmp.h" #import "wsam.h" class wsp__Content { public: wsp__Policy *Policy; wsp__PolicyReference *PolicyReference; std::vector All; std::vector ExactlyOne; std::vector sp__SignedParts; std::vector sp__EncryptedParts; std::vector sp__RequiredParts; sp__Elements *sp__SignedElements; sp__Elements *sp__EncryptedElements; sp__Elements *sp__ContentEncryptedElements; sp__Elements *sp__RequiredElements; sp__Token *sp__UsernameToken; sp__Token *sp__IssuedToken; sp__Token *sp__X509Token; sp__Token *sp__KerberosToken; sp__Token *sp__SpnegoContextToken; sp__Token *sp__SecurityContextToken; sp__Token *sp__SecureConversationToken; sp__Token *sp__SamlToken; sp__Token *sp__RelToken; sp__Token *sp__HttpsToken; sp__Token *sp__KeyValueToken; wsp__Assertion *sp__TransportBinding; wsp__Assertion *sp__TransportToken; wsp__Assertion *sp__AlgorithmSuite; wsp__Assertion *sp__Layout; wsp__Assertion *sp__SymmetricBinding; wsp__Assertion *sp__AsymmetricBinding; wsp__Assertion *sp__ProtectionToken; wsp__Assertion *sp__InitiatorToken; wsp__Assertion *sp__InitiatorSignatureToken; wsp__Assertion *sp__InitiatorEncryptionToken; wsp__Assertion *sp__RecipientToken; wsp__Assertion *sp__SupportingTokens; wsp__Assertion *sp__SignedSupportingTokens; wsp__Assertion *sp__EndorsingSupportingTokens; wsp__Assertion *sp__SignedEndorsingSupportingTokens; wsp__Assertion *sp__SignedEncryptedSupportingTokens; wsp__Assertion *sp__EncryptedSupportingTokens; wsp__Assertion *sp__EndorsingEncryptedSupportingTokens; wsp__Assertion *sp__SignedEndorsingEncryptedSupportingTokens; wsp__Assertion *sp__Wss10; wsp__Assertion *sp__Wss11; wsp__Assertion *sp__Trust10; wsp__Assertion *sp__Trust13; wsp__Content *sp__BootstrapPolicy; xsd__string wsaw__UsingAddressing; wsp__Assertion *wsam__Addressing; wsrmp__RMAssertion *wsrmp__RMAssertion_; wsrmp__RMAssertion *wsrmp__DeliveryAssurance; xsd__string wsrmp__AtLeastOnce; xsd__string wsrmp__AtMostOnce; xsd__string wsrmp__ExactlyOnce; xsd__string wsrmp__InOrder; wsrmp5__RMAssertion *wsrmp5__RMAssertion_; wsrmp5__RMAssertion *wsrmp5__DeliveryAssurance; xsd__string wsrmp5__AtLeastOnce; xsd__string wsrmp5__AtMostOnce; xsd__string wsrmp5__ExactlyOnce; xsd__string wsrmp5__InOrder; wsp__Assertion *sp__NoPassword; wsp__Assertion *sp__HashPassword; wsp__Assertion *sp__IncludeTimestamp; wsp__Assertion *sp__EncryptBeforeSigning; wsp__Assertion *sp__EncryptSignature; wsp__Assertion *sp__ProtectTokens; wsp__Assertion *sp__OnlySignEntireHeadersAndBody; xsd__string sp__RequireDerivedKeys; xsd__string sp__RequireImpliedDerivedKeys; xsd__string sp__RequireExplicitDerivedKeys; xsd__string sp__WssUsernameToken10; xsd__string sp__WssUsernameToken11; xsd__string sp__RequireExternalReference; xsd__string sp__RequireInternalReference; xsd__string sp__RequireKeyIdentifierReference; xsd__string sp__RequireIssuerSerialReference; xsd__string sp__RequireEmbeddedTokenReference; xsd__string sp__RequireThumbprintReference; xsd__string sp__WssX509V3Token10; xsd__string sp__WssX509Pkcs7Token10; xsd__string sp__WssX509PkiPathV1Token10; xsd__string sp__WssX509V1Token11; xsd__string sp__WssX509V3Token11; xsd__string sp__WssX509Pkcs7Token11; xsd__string sp__WssX509PkiPathV1Token11; xsd__string sp__WssKerberosV5ApReqToken11; xsd__string sp__WssGssKerberosV5ApReqToken11; xsd__string sp__WssRelV10Token10; xsd__string sp__WssRelV20Token10; xsd__string sp__WssRelV10Token11; xsd__string sp__WssRelV20Token11; xsd__string sp__MustNotSendCancel; xsd__string sp__MustNotSendAmend; xsd__string sp__MustNotSendRenew; xsd__string sp__MustSupportRefKeyIdentifier; xsd__string sp__MustSupportRefIssuerSerial; xsd__string sp__MustSupportRefExternalURI; xsd__string sp__MustSupportRefEmbeddedToken; xsd__string sp__MustSupportRefThumbprint; xsd__string sp__MustSupportRefEncryptedKey; xsd__string sp__RequireSignatureConfirmation; xsd__string sp__MustSupportClientChallenge; xsd__string sp__MustSupportServerChallenge; xsd__string sp__RequireClientEntropy; xsd__string sp__RequireServerEntropy; xsd__string sp__MustSupportIssuedTokens; xsd__string sp__RequireRequestSecurityTokenCollection; xsd__string sp__RequireAppliesTo; xsd__string sp__RequireExternalUriReference; xsd__string sp__SC13SecurityContextToken; xsd__string sp__Strict; xsd__string sp__Lax; xsd__string sp__LaxTsFirst; xsd__string sp__LaxTsLast; xsd__string sp__HttpBasicAuthentication; xsd__string sp__HttpDigestAuthentication; xsd__string sp__RequireClientCertificate; xsd__string sp__Basic256; xsd__string sp__Basic192; xsd__string sp__Basic128; xsd__string sp__TripleDes; xsd__string sp__Basic256Rsa15; xsd__string sp__Basic192Rsa15; xsd__string sp__Basic128Rsa15; xsd__string sp__TripleDesRsa15; xsd__string sp__Basic256Sha256; xsd__string sp__Basic192Sha256; xsd__string sp__Basic128Sha256; xsd__string sp__TripleDesSha256; xsd__string sp__Basic256Sha256Rsa15; xsd__string sp__Basic192Sha256Rsa15; xsd__string sp__Basic128Sha256Rsa15; xsd__string sp__TripleDesSha256Rsa15; xsd__string sp__InclusiveC14N; xsd__string sp__SOAPNormalization10; xsd__string sp__STRTransform10; xsd__string sp__Path10; xsd__string sp__XPathFilter20; xsd__string sp__AbsXPath; xsd__string wsam__AnonymousResponses; xsd__string wsam__NonAnonymousResponses; std::vector<_XML> __any; public: int traverse(wsdl__definitions&); void generate(Service& service, Types& types, int indent) const; }; class wsp__Policy : public wsp__Content { public: @xsd__anyURI xml__base; @xsd__string wsu__Id; @xsd__anyURI TargetNamespace; }; class wsp__Attachment { public: wsp__Policy *Policy; wsp__PolicyReference *PolicyReference; }; class wsp__AppliesTo { public: _XML __any; }; class wsp__PolicyAttachment { public: wsp__AppliesTo *AppliesTo; std::vector Attachment; }; gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/wsp.cpp0000644000175000017500000010737513525245163022305 0ustar ellertellert/* wsp.cpp WS-Policy 1.2 and 1.5 binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "wsdlH.h" #include "includes.h" #include "types.h" #include "service.h" static wsp__Policy *search(const char *URI, wsdl__definitions& definitions); static wsp__Policy *search(const char *URI, wsp__Policy *policy); static wsp__Policy *search(const char *URI, wsp__Content *content); static void gen_parts(const sp__Parts& parts, Types& types, const char *what, const char *name, int indent); //////////////////////////////////////////////////////////////////////////////// // // wsp:OperatorContentType // //////////////////////////////////////////////////////////////////////////////// int wsp__Content::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing wsp Policy" << std::endl; if (Policy) Policy->traverse(definitions); if (PolicyReference) PolicyReference->traverse(definitions); for (std::vector::iterator i = All.begin(); i != All.end(); ++i) { if (*i) (*i)->traverse(definitions); } for (std::vector::iterator j = ExactlyOne.begin(); j != ExactlyOne.end(); ++j) { if (*j) (*j)->traverse(definitions); } return SOAP_OK; } void wsp__Content::generate(Service& service, Types& types, int indent) const { static const char stabs[] = "\t\t\t\t\t\t\t\t\t\t"; const char *tabs; if (indent > 8) indent = 8; tabs = stabs + 9 - indent; // Recursive policies and references if (Policy) Policy->generate(service, types, indent); if (PolicyReference && PolicyReference->policyPtr()) PolicyReference->policyPtr()->generate(service, types, indent); // WS-Policy All if (!All.empty()) { fprintf(stream, "%s- All of the following:\n", tabs); for (std::vector::const_iterator p = All.begin(); p != All.end(); ++p) if (*p) (*p)->generate(service, types, indent + 1); } // WS-Policy ExactlyOne if (!ExactlyOne.empty()) { fprintf(stream, "%s- Exactly one of the following:\n", tabs); for (std::vector::const_iterator p = ExactlyOne.begin(); p != ExactlyOne.end(); ++p) if (*p) (*p)->generate(service, types, indent + 1); } // WS-SecurityPolicy Parts (TODO: do we need vectors of these?) for (std::vector::const_iterator sp = sp__SignedParts.begin(); sp != sp__SignedParts.end(); ++sp) gen_parts(*sp, types, "sign", "[4.1.1] WS-Security Signed Parts", indent); for (std::vector::const_iterator ep = sp__EncryptedParts.begin(); ep != sp__EncryptedParts.end(); ++ep) gen_parts(*ep, types, "encrypt", "[4.2.1] Security Encrypted Parts", indent); for (std::vector::const_iterator rp = sp__RequiredParts.begin(); rp != sp__RequiredParts.end(); ++rp) { fprintf(stream, "%s- Required Header elements:", tabs); for (std::vector::const_iterator h = (*rp).Header.begin(); h != (*rp).Header.end(); ++h) if ((*h).Name) fprintf(stream, " %s", types.aname(NULL, (*h).Namespace, (*h).Name)); else if ((*h).Namespace) fprintf(stream, " %s", (*h).Namespace); } // WS-SecurityPolicy Elements sp__Elements *elts = NULL; const char *elts_name = NULL; if (sp__SignedElements) { elts = sp__SignedElements; elts_name = "[4.1.2] Signed"; } if (sp__EncryptedElements) { elts = sp__EncryptedElements; elts_name = "[4.2.2] Encrypted"; } if (sp__ContentEncryptedElements) { elts = sp__ContentEncryptedElements; elts_name = "[4.2.3] Content Encrypted"; } if (sp__RequiredElements) { elts = sp__RequiredElements; elts_name = "[4.3.1] Required"; } if (elts) { fprintf(stream, "%s- %s Elements requirements (XPath%s):\n%s @verbatim\n", tabs, elts_name, elts->XPathVersion?elts->XPathVersion:"", tabs); for (std::vector::const_iterator s = elts->XPath.begin(); s != elts->XPath.end(); ++s) { fprintf(stream, "%s ", tabs); text(*s); } fprintf(stream, "%s @endverbatim\n", tabs); service.add_import("wsse.h"); } // WS-SecurityPolicy Tokens sp__Token *token = NULL; const char *token_name = NULL; if (sp__UsernameToken) { token = sp__UsernameToken; token_name = "[5.4.1] WS-Security Username"; } else if (sp__IssuedToken) { token = sp__IssuedToken; token_name = "[5.4.2] WS-Trust Issued"; } else if (sp__X509Token) { token = sp__X509Token; token_name = "[5.4.3] WS-Security X509"; } else if (sp__KerberosToken) { token = sp__KerberosToken; token_name = "[5.4.4] WS-Security Kerberos"; } else if (sp__SpnegoContextToken) { token = sp__SpnegoContextToken; token_name = "[5.4.5] WS-Trust n-leg RST/RSTR SPNEGO binary negotiation protocol (SpnegoContext)"; } else if (sp__SecurityContextToken) { token = sp__SecurityContextToken; token_name = "[5.4.6] WS-SecureConversation SecurityContext"; } else if (sp__SecureConversationToken) { token = sp__SecureConversationToken; token_name = "[5.4.7] WS-SecureConversation"; } else if (sp__SamlToken) { token = sp__SamlToken; token_name = "[5.4.8] SAML"; } else if (sp__RelToken) { token = sp__RelToken; token_name = "[5.4.9] WSS-REL"; } else if (sp__HttpsToken) { token = sp__HttpsToken; token_name = "[5.4.10] HTTPS"; } else if (sp__KeyValueToken) { token = sp__KeyValueToken; token_name = "[5.4.11] XML Signature"; } if (token) { fprintf(stream, "%s- %s required:\n", tabs, token_name); if (token->IncludeToken) fprintf(stream, "%s -# IncludeToken = %s\n", tabs, token->IncludeToken); if (token->Issuer && token->Issuer->Address) fprintf(stream, "%s -# Issuer = %s\n", tabs, token->Issuer->Address); if (token->IssuerName) fprintf(stream, "%s -# Issuer Name = %s\n", tabs, token->IssuerName); if (token->Policy) token->Policy->generate(service, types, indent + 1); // TODO: add wst:Claims? service.add_import("wsse.h"); } // WS-SecurityPolicy if (sp__AlgorithmSuite) { fprintf(stream, "%s- [7.1] Security Binding Algorithm Suite requirements:\n", tabs); if (sp__AlgorithmSuite->Policy) sp__AlgorithmSuite->Policy->generate(service, types, indent + 1); } if (sp__Layout) { fprintf(stream, "%s- [7.2] WS-Security Header Layout requirements:\n", tabs); if (sp__Layout->Policy) sp__Layout->Policy->generate(service, types, indent + 1); } if (sp__TransportBinding) { fprintf(stream, "%s- [7.3] Transport Binding%s requirements:\n", tabs, sp__TransportBinding->Optional ? " (optional)" : sp__TransportBinding->Ignorable ? " (ignorable)" : ""); if (sp__TransportBinding->Policy) sp__TransportBinding->Policy->generate(service, types, indent + 1); } if (sp__TransportToken) { fprintf(stream, "%s- Transport%s requirements:\n", tabs, sp__TransportToken->Optional ? " (optional)" : sp__TransportToken->Ignorable ? " (ignorable)" : ""); if (sp__TransportToken->Policy) sp__TransportToken->Policy->generate(service, types, indent + 1); } if (sp__SymmetricBinding) { fprintf(stream, "%s- [7.4] WS-Security Symmetric Binding%s requirements:\n", tabs, sp__SymmetricBinding->Optional ? " (optional)" : sp__SymmetricBinding->Ignorable ? " (ignorable)" : ""); if (sp__SymmetricBinding->Policy) sp__SymmetricBinding->Policy->generate(service, types, indent + 1); service.add_import("wsse.h"); } if (sp__ProtectionToken) { fprintf(stream, "%s- Symmetric Protection%s requirements:\n", tabs, sp__ProtectionToken->Optional ? " (optional)" : sp__ProtectionToken->Ignorable ? " (ignorable)" : ""); if (sp__ProtectionToken->Policy) sp__ProtectionToken->Policy->generate(service, types, indent + 1); } if (sp__AsymmetricBinding) { fprintf(stream, "%s- [7.5] WS-Security Asymmetric Binding%s (public key) requirements:\n", tabs, sp__AsymmetricBinding->Optional ? " (optional)" : sp__AsymmetricBinding->Ignorable ? " (ignorable)" : ""); if (sp__AsymmetricBinding->Policy) sp__AsymmetricBinding->Policy->generate(service, types, indent + 1); service.add_import("wsse.h"); } if (sp__InitiatorToken) { fprintf(stream, "%s- Initiator%s requirements:\n", tabs, sp__InitiatorToken->Optional ? " (optional)" : sp__InitiatorToken->Ignorable ? " (ignorable)" : ""); if (sp__InitiatorToken->Policy) sp__InitiatorToken->Policy->generate(service, types, indent + 1); } if (sp__InitiatorSignatureToken) { fprintf(stream, "%s- Initiator Signature%s requirements:\n", tabs, sp__InitiatorSignatureToken->Optional ? " (optional)" : sp__InitiatorSignatureToken->Ignorable ? " (ignorable)" : ""); if (sp__InitiatorSignatureToken->Policy) sp__InitiatorSignatureToken->Policy->generate(service, types, indent + 1); } if (sp__InitiatorEncryptionToken) { fprintf(stream, "%s- Initiator Encryption%s requirements:\n", tabs, sp__InitiatorEncryptionToken->Optional ? " (optional)" : sp__InitiatorEncryptionToken->Ignorable ? " (ignorable)" : ""); if (sp__InitiatorEncryptionToken->Policy) sp__InitiatorEncryptionToken->Policy->generate(service, types, indent + 1); } if (sp__RecipientToken) { fprintf(stream, "%s- Recipient%s requirements:\n", tabs, sp__RecipientToken->Optional ? " (optional)" : sp__RecipientToken->Ignorable ? " (ignorable)" : ""); if (sp__RecipientToken->Policy) sp__RecipientToken->Policy->generate(service, types, indent + 1); } if (sp__SupportingTokens) { fprintf(stream, "%s- [8.1] Supporting Tokens%s requirements:\n", tabs, sp__SupportingTokens->Optional ? " (optional)" : sp__SupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__SupportingTokens->Policy) sp__SupportingTokens->Policy->generate(service, types, indent + 1); } if (sp__SignedSupportingTokens) { fprintf(stream, "%s- [8.2] Signed Supporting Tokens%s requirements:\n", tabs, sp__SignedSupportingTokens->Optional ? " (optional)" : sp__SignedSupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__SignedSupportingTokens->Policy) sp__SignedSupportingTokens->Policy->generate(service, types, indent + 1); } if (sp__EndorsingSupportingTokens) { fprintf(stream, "%s- [8.3] Endorsing Supporting Tokens%s requirements:\n", tabs, sp__EndorsingSupportingTokens->Optional ? " (optional)" : sp__EndorsingSupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__EndorsingSupportingTokens->Policy) sp__EndorsingSupportingTokens->Policy->generate(service, types, indent + 1); } if (sp__SignedEndorsingSupportingTokens) { fprintf(stream, "%s- [8.4] Signed Endorsing Supporting Tokens%s requirements:\n", tabs, sp__SignedEndorsingSupportingTokens->Optional ? " (optional)" : sp__SignedEndorsingSupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__SignedEndorsingSupportingTokens->Policy) sp__SignedEndorsingSupportingTokens->Policy->generate(service, types, indent + 1); } if (sp__SignedEncryptedSupportingTokens) { fprintf(stream, "%s- [8.5] Signed Encrypted Supporting Tokens%s requirements:\n", tabs, sp__SignedEncryptedSupportingTokens->Optional ? " (optional)" : sp__SignedEncryptedSupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__SignedEncryptedSupportingTokens->Policy) sp__SignedEncryptedSupportingTokens->Policy->generate(service, types, indent + 1); } if (sp__EncryptedSupportingTokens) { fprintf(stream, "%s- [8.6] Encrypted Supporting Tokens%s requirements:\n", tabs, sp__EncryptedSupportingTokens->Optional ? " (optional)" : sp__EncryptedSupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__EncryptedSupportingTokens->Policy) sp__EncryptedSupportingTokens->Policy->generate(service, types, indent + 1); } if (sp__EndorsingEncryptedSupportingTokens) { fprintf(stream, "%s- [8.7] Endorsing Encrypted Supporting Tokens%s requirements:\n", tabs, sp__EndorsingEncryptedSupportingTokens->Optional ? " (optional)" : sp__EndorsingEncryptedSupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__EndorsingEncryptedSupportingTokens->Policy) sp__EndorsingEncryptedSupportingTokens->Policy->generate(service, types, indent + 1); } if (sp__SignedEndorsingEncryptedSupportingTokens) { fprintf(stream, "%s- [8.8] Signed Endorsing Encrypted Supporting Tokens%s requirements:\n", tabs, sp__SignedEndorsingEncryptedSupportingTokens->Optional ? " (optional)" : sp__SignedEndorsingEncryptedSupportingTokens->Ignorable ? " (ignorable)" : ""); if (sp__SignedEndorsingEncryptedSupportingTokens->Policy) sp__SignedEndorsingEncryptedSupportingTokens->Policy->generate(service, types, indent + 1); } // Wss10 or Wss11 if (sp__Wss10) { fprintf(stream, "%s- [9.1] WSS: SOAP Message Security 1.0%s options:\n", tabs, sp__Wss10->Optional ? " (optional)" : sp__Wss10->Ignorable ? " (ignorable)" : ""); if (sp__Wss10->Policy) sp__Wss10->Policy->generate(service, types, indent + 1); service.add_import("wsse.h"); } else if (sp__Wss11) { fprintf(stream, "%s- [9.2] WSS: SOAP Message Security 1.1%s options:\n", tabs, sp__Wss11->Optional ? " (optional)" : sp__Wss11->Ignorable ? " (ignorable)" : ""); if (sp__Wss11->Policy) sp__Wss11->Policy->generate(service, types, indent + 1); service.add_import("wsse.h"); } if (sp__MustSupportRefKeyIdentifier) fprintf(stream, "%s- Key Identifier References\n", tabs); if (sp__MustSupportRefIssuerSerial) fprintf(stream, "%s- Issuer Serial References\n", tabs); if (sp__MustSupportRefExternalURI) fprintf(stream, "%s- External URI References\n", tabs); if (sp__MustSupportRefEmbeddedToken) fprintf(stream, "%s- Embedded Token References\n", tabs); if (sp__MustSupportRefThumbprint) fprintf(stream, "%s- Thumbprint References\n", tabs); if (sp__MustSupportRefEncryptedKey) fprintf(stream, "%s- EncryptedKey References\n", tabs); if (sp__RequireSignatureConfirmation) fprintf(stream, "%s- Signature Confirmation\n", tabs); // WS-SecureConversation if (sp__RequireDerivedKeys) fprintf(stream, "%s- Properties = WS-SecureConversation RequireDerivedKeys\n", tabs); else if (sp__RequireImpliedDerivedKeys) fprintf(stream, "%s- Properties = WS-SecureConversation RequireImpliedDerivedKeys\n", tabs); else if (sp__RequireExplicitDerivedKeys) fprintf(stream, "%s- Properties = WS-SecureConversation RequireExplicitDerivedKeys\n", tabs); if (sp__MustNotSendCancel) fprintf(stream, "%s- WS-SecureConversation STS issuing the secure conversation token does not support SCT/Cancel RST messages", tabs); else if (sp__MustNotSendAmend) fprintf(stream, "%s- WS-SecureConversation STS issuing the secure conversation token does not support SCT/Amend RST messages", tabs); else if (sp__MustNotSendRenew) fprintf(stream, "%s- WS-SecureConversation STS issuing the secure conversation token does not support SCT/Renew RST messages", tabs); if (sp__RequireExternalUriReference) fprintf(stream, "%s- WS-SecureConversation external URI reference is required", tabs); if (sp__SC13SecurityContextToken) fprintf(stream, "%s- WS-SecureConversation Security Context Token should be used", tabs); // WS-Security passwords if (sp__NoPassword) fprintf(stream, "%s- No WS-Security password%s required\n", tabs, sp__NoPassword->Optional ? " (optional)" : sp__NoPassword->Ignorable ? " (ignorable)" : ""); else if (sp__HashPassword) { fprintf(stream, "%s- Client-side WS-Security password%s should be set:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_add_UsernameTokenDigest(soap, \"User\", \"\", \"\");\n\t@endcode\n", tabs, sp__HashPassword->Optional ? " (optional)" : sp__HashPassword->Ignorable ? " (ignorable)" : ""); fprintf(stream, "%s- Server-side WS-Security password%s verified with:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tconst char *username = soap_wsse_get_Username(soap);\n\t...\n\tif (soap_wsse_verify_Password(soap, \"\")) ......\n\t@endcode\n", tabs, sp__HashPassword->Optional ? " (optional)" : sp__HashPassword->Ignorable ? " (ignorable)" : ""); service.add_import("wsse.h"); } if (sp__WssUsernameToken10) { fprintf(stream, "%s- Username token should be used as defined in UsernameTokenProfile1.0:\n", tabs); fprintf(stream, "%s - Client-side WS-Security password should be set:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_add_UsernameTokenDigest(soap, \"User\", \"\", \"\");\n\t@endcode\n", tabs); fprintf(stream, "%s - Server-side WS-Security password verified with:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tconst char *username = soap_wsse_get_Username(soap);\n\t...\n\tif (soap_wsse_verify_Password(soap, \"\")) \n\t@endcode\n", tabs); service.add_import("wsse.h"); } else if (sp__WssUsernameToken11) { fprintf(stream, "%s- Username token should be used as defined in UsernameTokenProfile1.1:\n", tabs); fprintf(stream, "%s - Client-side WS-Security plain-text password should be set:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_add_UsernameToken(soap, \"User\", \"\", \"\");\n\t@endcode\n", tabs); fprintf(stream, "%s - Client-side WS-Security digest password should be set:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_add_UsernameTokenDigest(soap, \"User\", \"\", \"\");\n\t@endcode\n", tabs); fprintf(stream, "%s - Server-side WS-Security password verified with:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tconst char *username = soap_wsse_get_Username(soap);\n\t...\n\tif (soap_wsse_verify_Password(soap, \"\")) ...\n\t@endcode\n", tabs); service.add_import("wsse.h"); } // WS-Trust if (sp__RequireExternalReference) fprintf(stream, "%s- WS-Trust external reference is required when referencing this token\n", tabs); else if (sp__RequireInternalReference) fprintf(stream, "%s- WS-Trust internal reference is required when referencing this token\n", tabs); // WS-Trust 1.0 and 1.3 if (sp__Trust10) { fprintf(stream, "%s- [10.1] WS-Trust 1.0%s options:\n", tabs, sp__Trust10->Optional ? " (optional)" : sp__Trust10->Ignorable ? " (ignorable)" : ""); if (sp__Trust10->Policy) sp__Trust10->Policy->generate(service, types, indent + 1); service.add_import("wst.h"); } else if (sp__Trust13) { fprintf(stream, "%s- [10.1] WS-Trust 1.3%s options:\n", tabs, sp__Trust13->Optional ? " (optional)" : sp__Trust13->Ignorable ? " (ignorable)" : ""); if (sp__Trust13->Policy) sp__Trust13->Policy->generate(service, types, indent + 1); service.add_import("wst.h"); } if (sp__MustSupportClientChallenge) { fprintf(stream, "%s- Client Challenge\n", tabs); service.add_import("wst.h"); } if (sp__MustSupportServerChallenge) { fprintf(stream, "%s- Server Challenge\n", tabs); service.add_import("wst.h"); } if (sp__RequireClientEntropy) { fprintf(stream, "%s- Client Entropy\n", tabs); service.add_import("wst.h"); } if (sp__RequireServerEntropy) { fprintf(stream, "%s- Server Entropy\n", tabs); service.add_import("wst.h"); } if (sp__MustSupportIssuedTokens) { fprintf(stream, "%s- Issued Tokens\n", tabs); service.add_import("wst.h"); } if (sp__RequireRequestSecurityTokenCollection) { fprintf(stream, "%s- Collection\n", tabs); service.add_import("wst.h"); } if (sp__RequireAppliesTo) { fprintf(stream, "%s- STS requires the requestor to specify the scope for the issued token using wsp:AppliesTo in the RST\n", tabs); service.add_import("wst.h"); } // WS-Security header layout if (sp__IncludeTimestamp) { fprintf(stream, "%s- WS-Security Timestamp%s should be set prior to send:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_add_Timestamp(soap, \"Timestamp\", );\n\t@endcode\n", tabs, sp__IncludeTimestamp->Optional ? " (optional)" : sp__IncludeTimestamp->Ignorable ? " (ignorable)" : ""); fprintf(stream, "%s- WS-Security Timestamp%s presence and expiration verified post-receive with:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tif (soap_wsse_verify_Timestamp(soap)) ......\n\t@endcode\n", tabs, sp__IncludeTimestamp->Optional ? " (optional)" : sp__IncludeTimestamp->Ignorable ? " (ignorable)" : ""); } if (sp__EncryptBeforeSigning) fprintf(stream, "%s- WS-Security Encrypt Before Signing%s (gSOAP unsupported)\n", tabs, sp__EncryptBeforeSigning->Optional ? " (optional)" : sp__EncryptBeforeSigning->Ignorable ? " (ignorable)" : ""); if (sp__EncryptSignature) fprintf(stream, "%s- WS-Security Encrypt Signature%s\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_add_EncryptedKey_encrypt_only(soap, , NULL, , NULL, , , \"ds:Signature SOAP-ENV:Body\");\n\t@endcode\n", tabs, sp__EncryptSignature->Optional ? " (optional)" : sp__EncryptSignature->Ignorable ? " (ignorable)" : ""); if (sp__ProtectTokens) fprintf(stream, "%s- WS-Security Token Protection%s required\n", tabs, sp__ProtectTokens->Optional ? " (optional)" : sp__ProtectTokens->Ignorable ? " (ignorable)" : ""); if (sp__OnlySignEntireHeadersAndBody) { fprintf(stream, "%s- WS-Security Sign Entire Headers and Body%s:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_set_wsu_id(soap, \" ...\"); // list each ns:tagname used in SOAP Header\n\tsoap_wsse_sign_body(soap, , , );\n\t@endcode\n", tabs, sp__OnlySignEntireHeadersAndBody->Optional ? " (optional)" : sp__OnlySignEntireHeadersAndBody->Ignorable ? " (ignorable)" : ""); } if (sp__Strict) fprintf(stream, "%s- WS-Security headers 'declare before use' required (gSOAP default)\n", tabs); else if (sp__Lax) fprintf(stream, "%s- WS-Security headers may occur in any order (gSOAP allows this)\n", tabs); else if (sp__LaxTsFirst) fprintf(stream, "%s- WS-Security Timestamp must appear first (gSOAP default)\n", tabs); else if (sp__LaxTsLast) fprintf(stream, "%s- WS-Security Timestamp must appear last (requires changing the placement of the Timestamp header in SOAP_ENV__Header defined in import/wsse.h)\n", tabs); // HTTP authentication if (sp__HttpBasicAuthentication) fprintf(stream, "%s- HTTP/S Basic Authentication required:\n\t@code\n\tsoap->userid = \"\"; soap->passwd = \"\";\nsoap_call_ns__method(...)\n\t@endcode\n", tabs); else if (sp__HttpDigestAuthentication) fprintf(stream, "%s- HTTP/S Digest Authentication required:\n%sSee plugin/httpda.c plugin for usage details\n", tabs, tabs); if (sp__RequireClientCertificate) fprintf(stream, "%s- HTTPS client must authenticate to server with a certificate:\n\t@code\n\tsoap_ssl_client_context(soap, , \"\", \"\", ...)\n\t@endcode\n", tabs); // Security token requirements if (sp__RequireKeyIdentifierReference) fprintf(stream, "%s- Key identifier reference is required\n", tabs); if (sp__RequireIssuerSerialReference) fprintf(stream, "%s- Issuer serial reference is required\n", tabs); if (sp__RequireEmbeddedTokenReference) fprintf(stream, "%s- An embedded token reference is required\n", tabs); if (sp__RequireThumbprintReference) fprintf(stream, "%s- A thumbprint reference is required\n", tabs); // Algorithm suite if (sp__Basic256) fprintf(stream, "%s- Basic256\n", tabs); else if (sp__Basic192) fprintf(stream, "%s- Basic192\n", tabs); else if (sp__Basic128) fprintf(stream, "%s- Basic128\n", tabs); else if (sp__TripleDes) fprintf(stream, "%s- TripleDes\n", tabs); else if (sp__Basic256Rsa15) fprintf(stream, "%s- Basic256Rsa15\n", tabs); else if (sp__Basic192Rsa15) fprintf(stream, "%s- Basic192Rsa15\n", tabs); else if (sp__Basic128Rsa15) fprintf(stream, "%s- Basic128Rsa15\n", tabs); else if (sp__TripleDesRsa15) fprintf(stream, "%s- TripleDesRsa15\n", tabs); else if (sp__Basic256Sha256) fprintf(stream, "%s- Basic256Sha256\n", tabs); else if (sp__Basic192Sha256) fprintf(stream, "%s- Basic192Sha256\n", tabs); else if (sp__Basic128Sha256) fprintf(stream, "%s- Basic128Sha256\n", tabs); else if (sp__TripleDesSha256) fprintf(stream, "%s- TripleDesSha256\n", tabs); else if (sp__Basic256Sha256Rsa15) fprintf(stream, "%s- Basic256Sha256Rsa15\n", tabs); else if (sp__Basic192Sha256Rsa15) fprintf(stream, "%s- Basic192Sha256Rsa15\n", tabs); else if (sp__Basic128Sha256Rsa15) fprintf(stream, "%s- Basic128Sha256Rsa15\n", tabs); else if (sp__TripleDesSha256Rsa15) fprintf(stream, "%s- TripleDesSha256Rsa15\n", tabs); if (sp__InclusiveC14N) fprintf(stream, "%s- InclusiveC14N\n", tabs); if (sp__SOAPNormalization10) fprintf(stream, "%s- SOAPNormalization10\n", tabs); if (sp__STRTransform10) fprintf(stream, "%s- STRTransform10\n", tabs); if (sp__Path10) fprintf(stream, "%s- Path10\n", tabs); else if (sp__XPathFilter20) fprintf(stream, "%s- XPathFilter20\n", tabs); else if (sp__AbsXPath) fprintf(stream, "%s- AbsXPath\n", tabs); // WSS if (sp__WssX509V3Token10) fprintf(stream, "%s- An X509 Version 3 token should be used as defined in X509TokenProfile1.0\n", tabs); else if (sp__WssX509Pkcs7Token10) fprintf(stream, "%s- An X509 PKCS7 token should be used as defined in X509TokenProfile1.0\n", tabs); else if (sp__WssX509PkiPathV1Token10) fprintf(stream, "%s- An X509 PKI Path Version 1 token should be used as defined in X509TokenProfile1.0\n", tabs); else if (sp__WssX509V1Token11) fprintf(stream, "%s- An X509 Version 1 token should be used as defined in X509TokenProfile1.1\n", tabs); else if (sp__WssX509V3Token11) fprintf(stream, "%s- An X509 Version 3 token should be used as defined in X509TokenProfile1.1\n", tabs); else if (sp__WssX509Pkcs7Token11) fprintf(stream, "%s- An X509 PKCS7 token should be used as defined in X509TokenProfile1.1\n", tabs); else if (sp__WssX509PkiPathV1Token11) fprintf(stream, "%s- An X509 PKI Path Version 1 token should be used as defined in X509TokenProfile1.1\n", tabs); if (sp__WssKerberosV5ApReqToken11) fprintf(stream, "%s- A Kerberos Version 5 AP-REQ X509 token should be used as defined in KerberosTokenProfile1.1\n", tabs); else if (sp__WssGssKerberosV5ApReqToken11) fprintf(stream, "%s- A GSS Kerberos Version 5 AP-REQ token should be used as defined in KerberosTokenProfile1.1\n", tabs); if (sp__WssRelV10Token10) fprintf(stream, "%s- A REL Version 1.0 token should be used as defined in RELTokenProfile1.0\n", tabs); else if (sp__WssRelV20Token10) fprintf(stream, "%s- A REL Version 2.0 token should be used as defined in RELTokenProfile1.0\n", tabs); else if (sp__WssRelV10Token11) fprintf(stream, "%s- A REL Version 1.0 token should be used as defined in RELTokenProfile1.1\n", tabs); else if (sp__WssRelV20Token11) fprintf(stream, "%s- A REL Version 2.0 token should be used as defined in RELTokenProfile1.1\n", tabs); if (sp__BootstrapPolicy) { fprintf(stream, "%s- SecureConversation BootstrapPolicy\n", tabs); sp__BootstrapPolicy->generate(service, types, indent + 1); } // WS-Addressing WSDL Policy if (wsaw__UsingAddressing) { fprintf(stream, "%s- WS-Addressing is used\n", tabs); service.add_import("wsa5.h"); } // WS-Addressing Metadata Policy if (wsam__Addressing) { fprintf(stream, "%s- WS-Addressing%s is used\n", tabs, wsam__Addressing->Optional ? " (optional)" : wsam__Addressing->Ignorable ? " (ignorable)" : ""); if (wsam__Addressing->Policy) wsam__Addressing->Policy->generate(service, types, indent + 1); service.add_import("wsa5.h"); } if (wsam__AnonymousResponses) fprintf(stream, "%s- WS-Addressing Anonymous Responses\n", tabs); else if (wsam__NonAnonymousResponses) fprintf(stream, "%s- WS-Addressing NonAnonymous Responses\n", tabs); // WS-ReliableMessaging Policy 2007 if (wsrmp__RMAssertion_) { fprintf(stream, "%s- WS-ReliableMessaging%s is used\n", tabs, wsrmp__RMAssertion_->Optional ? " (optional)" : wsrmp__RMAssertion_->Ignorable ? " (ignorable)" : ""); if (wsrmp__RMAssertion_->InactivityTimeout && wsrmp__RMAssertion_->InactivityTimeout->Milliseconds) fprintf(stream, "%s - Inactivity Timeout = %s (ms)\n", tabs, wsrmp__RMAssertion_->InactivityTimeout->Milliseconds); if (wsrmp__RMAssertion_->BaseRetransmissionInterval && wsrmp__RMAssertion_->BaseRetransmissionInterval->Milliseconds) fprintf(stream, "%s - Base Retransmission Interval = %s (ms)\n", tabs, wsrmp__RMAssertion_->BaseRetransmissionInterval->Milliseconds); if (wsrmp__RMAssertion_->AcknowledgementInterval && wsrmp__RMAssertion_->AcknowledgementInterval->Milliseconds) fprintf(stream, "%s - Acknowledgement Interval = %s (ms)\n", tabs, wsrmp__RMAssertion_->AcknowledgementInterval->Milliseconds); if (wsrmp__RMAssertion_->ExponentialBackoff) fprintf(stream, "%s - ExponentialBackoff\n", tabs); if (wsrmp__RMAssertion_->Policy) wsrmp__RMAssertion_->Policy->generate(service, types, indent + 1); service.add_import("wsrm.h"); } if (wsrmp__DeliveryAssurance) { fprintf(stream, "%s- WS-ReliableMessaging Delivery Assurance%s:\n", tabs, wsrmp__DeliveryAssurance->Optional ? " (optional)" : wsrmp__DeliveryAssurance->Ignorable ? " (ignorable)" : ""); if (wsrmp__DeliveryAssurance->Policy) wsrmp__DeliveryAssurance->Policy->generate(service, types, indent + 1); service.add_import("wsrm.h"); } if (wsrmp__AtLeastOnce) fprintf(stream, "%s- At Least Once\n", tabs); if (wsrmp__AtMostOnce) fprintf(stream, "%s- At Most Once\n", tabs); if (wsrmp__ExactlyOnce) fprintf(stream, "%s- Exactly Once\n", tabs); if (wsrmp__InOrder) fprintf(stream, "%s- In Order\n", tabs); // WS-ReliableMessaging Policy 2005 if (wsrmp5__RMAssertion_) { fprintf(stream, "%s- WS-ReliableMessaging%s is used\n", tabs, wsrmp5__RMAssertion_->Optional ? " (optional)" : wsrmp5__RMAssertion_->Ignorable ? " (ignorable)" : ""); if (wsrmp5__RMAssertion_->InactivityTimeout && wsrmp5__RMAssertion_->InactivityTimeout->Milliseconds) fprintf(stream, "%s - Inactivity Timeout = %s (ms)\n", tabs, wsrmp5__RMAssertion_->InactivityTimeout->Milliseconds); if (wsrmp5__RMAssertion_->BaseRetransmissionInterval && wsrmp5__RMAssertion_->BaseRetransmissionInterval->Milliseconds) fprintf(stream, "%s - Base Retransmission Interval = %s (ms)\n", tabs, wsrmp5__RMAssertion_->BaseRetransmissionInterval->Milliseconds); if (wsrmp5__RMAssertion_->AcknowledgementInterval && wsrmp5__RMAssertion_->AcknowledgementInterval->Milliseconds) fprintf(stream, "%s - Acknowledgement Interval = %s (ms)\n", tabs, wsrmp5__RMAssertion_->AcknowledgementInterval->Milliseconds); if (wsrmp5__RMAssertion_->ExponentialBackoff) fprintf(stream, "%s - ExponentialBackoff\n", tabs); if (wsrmp5__RMAssertion_->Policy) wsrmp5__RMAssertion_->Policy->generate(service, types, indent + 1); service.add_import("wsrm5.h"); } if (wsrmp5__DeliveryAssurance) { fprintf(stream, "%s- WS-ReliableMessaging Delivery Assurance%s:\n", tabs, wsrmp5__DeliveryAssurance->Optional ? " (optional)" : wsrmp5__DeliveryAssurance->Ignorable ? " (ignorable)" : ""); if (wsrmp5__DeliveryAssurance->Policy) wsrmp5__DeliveryAssurance->Policy->generate(service, types, indent + 1); service.add_import("wsrm5.h"); } if (wsrmp5__AtLeastOnce) fprintf(stream, "%s- At Least Once\n", tabs); if (wsrmp5__AtMostOnce) fprintf(stream, "%s- At Most Once\n", tabs); if (wsrmp5__ExactlyOnce) fprintf(stream, "%s- Exactly Once\n", tabs); if (wsrmp5__InOrder) fprintf(stream, "%s- In Order\n", tabs); // All else for (std::vector<_XML>::const_iterator x = __any.begin(); x != __any.end(); ++x) { if (*x && *(*x)) { fprintf(stream, "%s- Other policy requirements:\n\t@verbatim\n", tabs); text(*x); fprintf(stream, "\t@endverbatim\n"); } } } static void gen_parts(const sp__Parts& parts, Types& types, const char *what, const char *name, int indent) { static const char stabs[] = "\t\t\t\t\t\t\t\t\t\t"; const char *tabs; if (indent > 8) indent = 8; tabs = stabs + 9 - indent; fprintf(stream, "%s- %s requirements:\n", tabs, name); if (parts.Body) fprintf(stream, "%s -# Body:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_%s_body(soap, , , );\n\t@endcode\n", tabs, what); if (!parts.Header.empty()) { fprintf(stream, "%s -# Header elements:\n\t@code\n\t#include \"plugin/wsseapi.h\"\n\tsoap_wsse_set_wsu_id(soap, \"", tabs); for (std::vector::const_iterator h = parts.Header.begin(); h != parts.Header.end(); ++h) { if ((*h).Name) fprintf(stream, "%s ", types.aname(NULL, (*h).Namespace, (*h).Name)); else if ((*h).Namespace) fprintf(stream, "%s: ", types.nsprefix(NULL, (*h).Namespace)); } fprintf(stream, "\");\n\t@endcode\n"); } if (parts.Attachments) fprintf(stream, "%s -# Attachments as defined in SwAProfile1.1\n", tabs); } //////////////////////////////////////////////////////////////////////////////// // // wsp:PolicyReference // //////////////////////////////////////////////////////////////////////////////// int wsp__PolicyReference::traverse(wsdl__definitions& definitions) { policyRef = NULL; if (!URI || !*URI) { std::cerr << "PolicyReference has no URI" << std::endl; return SOAP_OK; } if (*URI == '#') { policyRef = search(URI + 1, definitions); if (!policyRef) { std::cerr << "PolicyReference URI=\"" << URI << "\" not found" << std::endl; return SOAP_OK; } } return SOAP_OK; } void wsp__PolicyReference::policyPtr(wsp__Policy *Policy) { policyRef = Policy; } wsp__Policy *wsp__PolicyReference::policyPtr() const { return policyRef; } static wsp__Policy *search(const char *URI, wsdl__definitions& definitions) { for (std::vector::iterator p = definitions.wsp__Policy_.begin(); p != definitions.wsp__Policy_.end(); ++p) { wsp__Policy *policy = search(URI, &(*p)); if (policy) return policy; } return NULL; } static wsp__Policy *search(const char *URI, wsp__Policy *policy) { if (!policy) return NULL; if (policy->wsu__Id && !strcmp(URI, policy->wsu__Id)) return policy; return search(URI, (wsp__Content*)policy); } static wsp__Policy *search(const char *URI, wsp__Content *content) { wsp__Policy *policy; policy = search(URI, content->Policy); if (policy) return policy; for (std::vector::iterator i = content->All.begin(); i != content->All.end(); ++i) { policy = search(URI, *i); if (policy) return policy; } for (std::vector::iterator j = content->ExactlyOne.begin(); j != content->ExactlyOne.end(); ++j) { policy = search(URI, *j); if (policy) return policy; } return NULL; } gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/types.cpp0000644000175000017500000051226413525245163022635 0ustar ellertellert/* types.cpp Generate gSOAP types from XML schemas (e.g. embedded in WSDL). -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "types.h" static char *getline(char *s, size_t n, FILE *fd); static const char *nonblank(const char *s); static bool isdelim(int c); static const char *fill(char *t, int n, const char *s, int e); static const char *utf8(char **t, const char *s, bool start); static const char *cstring(const char *s); static const char *xstring(const char *s); static bool is_float(const char *s); static bool is_integer(const char *s); static LONG64 to_integer(const char *s); static void documentation(const char *text); static void operations(const char *t); static int comment_nest = 0; /* keep track of block comments to avoid nesting */ //////////////////////////////////////////////////////////////////////////////// // // Keywords and reserved words // //////////////////////////////////////////////////////////////////////////////// static const char *keywords[] = { "alignas", "alignof", "and", "and_eq", "asm", "auto", "bitand", "bitor", "bool", "break", "case", "catch", "char", "char16_t", "char32_t", "class", "compl", "const", "constexpr", "const_cast", "continue", "decltype", "default", "delete", "do", "double", "dynamic_cast", "else", "enum", "errno", "explicit", "export", "extern", "false", "FILE", "final", "float", "for", "friend", "goto", "if", "INFINITY", "inline", "int", "interface", "long", "LONG64", "max", "min", "mustUnderstand", "mutable", "namespace", "new", "not", "not_eq", "NULL", "nullptr", "nullptr_t", "operator", "or", "or_eq", "override", "private", "protected", "public", "register", "reinterpret_cast", "restrict", "return", "short", "signed", "size_t", "sizeof", "static", "static_assert", "static_cast", "struct", "switch", "template", "this", "thread_local", "throw", "time_t", "true", "try", "typedef", "typeid", "typeof", "typename", "ULONG64", "union", "unsigned", "using", "virtual", "void", "volatile", "wchar_t", "while", "XML", "xor", "xor_eq", "_QName", "_XML", }; //////////////////////////////////////////////////////////////////////////////// // // Types methods // //////////////////////////////////////////////////////////////////////////////// Types::Types() { init(); } int Types::read(const char *file) { FILE *fd; char buf[4096], xsd[4096], def[4096], use[4096], ptr[4096], uri[4096]; const char *s; short copy = 0; MapOfStringToString eqvtypemap; soap_strcpy(buf, sizeof(buf), file); fd = fopen(buf, "r"); if (!fd && import_path) { (SOAP_SNPRINTF(buf, sizeof(buf), strlen(import_path) + strlen(file) + 1), "%s/%s", import_path, file); fd = fopen(buf, "r"); } if (!fd) { fprintf(stderr, "Cannot open file \"%s\"\n", file); return SOAP_EOF; } fprintf(stderr, "Reading type definitions from type map \"%s\"\n", buf); while (getline(buf, sizeof(buf), fd)) { s = buf; if (copy) { if (*s == ']') copy = 0; else fprintf(stream, "%s\n", buf); } else if (*s == '[') { copy = 1; } else if (*s == '<') { s = fill(uri, sizeof(uri), s+1, -1); infile[infiles++] = estrdup(uri); if (infiles >= MAXINFILES) { fprintf(stderr, "wsdl2h: too many files\n"); exit(1); } } else if (*s == '>') { s = fill(uri, sizeof(uri), s+1, -1); if (!outfile) { outfile = estrdup(uri); stream = fopen(outfile, "w"); if (!stream) { fprintf(stderr, "Cannot write to %s\n", outfile); exit(1); } if (cppnamespace) fprintf(stream, "namespace %s {\n", cppnamespace); fprintf(stderr, "Saving %s\n\n", outfile); } } else if (*s && *s != '#') { s = fill(xsd, sizeof(xsd), s, '='); if (s && *s == '=') { s = fill(use, sizeof(use), s+1, '|'); if (*xsd && *use) { s = estrdup(xsd); eqvtypemap[s] = estrdup(use); deftypemap[s] = ""; if (usetypemap.find(use) != usetypemap.end()) usetypemap[s] = usetypemap[use]; else usetypemap[s] = estrdup(use); } } else if (strstr(xsd, "__")) { s = fill(def, sizeof(def), s, '|'); s = fill(use, sizeof(use), s, '|'); s = fill(ptr, sizeof(ptr), s, '|'); if (*xsd) { s = estrdup(xsd); if (*def == '$') { const char *t = modtypemap[s]; if (t) { size_t l = strlen(t) + strlen(def); char *r = (char*)emalloc(l + 1); (SOAP_SNPRINTF(r, l + 1, l), "%s%s", t, def); free((void*)modtypemap[s]); modtypemap[s] = r; } else modtypemap[s] = estrdup(def); } else { if (*def) { if (strcmp(def, "...")) { deftypemap[s] = estrdup(def); ctypemap[s] = ctype(def); } } else deftypemap[s] = ""; if (*use) usetypemap[s] = estrdupf(use); else usetypemap[s] = estrdupf(xsd); if (*ptr) ptrtypemap[s] = estrdupf(ptr); else { MapOfStringToString::iterator i = ptrtypemap.find(s); if (i != ptrtypemap.end()) ptrtypemap.erase(i); } } } } else if (*xsd == '$') { fill(use, sizeof(use), s, 0); if (*use) { s = estrdup(xsd); usetypemap[s] = estrdup(use); } } else if (*xsd) { s = fill(uri, sizeof(uri), s, 0); if (uri[0] == '"') { uri[strlen(uri) - 1] = '\0'; nsprefix(xsd, estrdup(uri + 1)); } else if (uri[0] == '<') { uri[strlen(uri) - 1] = '\0'; char *s = estrdup(uri + 1); nsprefix(xsd, s); exturis.insert(s); } else { nsprefix(xsd, estrdup(uri)); } } } } for (MapOfStringToString::const_iterator i = eqvtypemap.begin(); i != eqvtypemap.end(); ++i) { const char *s = (*i).first, *t = (*i).second; if (usetypemap.find(t) != usetypemap.end()) t = usetypemap[t]; deftypemap[s] = ""; usetypemap[s] = t; if (ptrtypemap.find((*i).second) != ptrtypemap.end()) { ptrtypemap[s] = ptrtypemap[(*i).second]; } else { MapOfStringToString::iterator j = ptrtypemap.find(s); if (j != ptrtypemap.end()) ptrtypemap.erase(j); } for (MapOfStringToString::iterator j = usetypemap.begin(); j != usetypemap.end(); ++j) if (!strcmp((*j).second, s)) (*j).second = t; for (MapOfStringToString::iterator k = ptrtypemap.begin(); k != ptrtypemap.end(); ++k) if (!strcmp((*k).second, s)) (*k).second = t; } fclose(fd); return SOAP_OK; } void Types::init() { snum = 1; unum = 1; gnum = 1; with_union = false; fake_union = false; total = 0; omitted = 0; knames.insert(keywords, keywords + sizeof(keywords)/sizeof(char*)); if (soap_context && *soap_context) knames.insert(soap_context); /* xsd:ur-type is deprecated if (cflag) { deftypemap["xsd__ur_type"] = ""; if (dflag) { usetypemap["xsd__ur_type"] = "xsd__anyType"; } else { usetypemap["xsd__ur_type"] = "_XML"; ptrtypemap["xsd__ur_type"] = "_XML"; } } else { deftypemap["xsd__ur_type"] = "class xsd__ur_type { _XML __item; };"; usetypemap["xsd__ur_type"] = "xsd__ur_type"; } */ if (cflag) { deftypemap["xsd__anyType"] = ""; if (dflag) { usetypemap["xsd__anyType"] = "xsd__anyType"; } else { usetypemap["xsd__anyType"] = "_XML"; ptrtypemap["xsd__anyType"] = "_XML"; } } else { if (dflag) { deftypemap["xsd__anyType"] = ""; } else if (!soap_context || !*soap_context) { deftypemap["xsd__anyType"] = "class xsd__anyType\n{ public:\n _XML __item;\n};"; } else { size_t l = strlen(soap_context) + 67; char *t = (char*)emalloc(l + 1); (SOAP_SNPRINTF(t, l + 1, l), "class xsd__anyType\n{ public:\n _XML __item;\n struct soap *%s;\n};", soap_context); deftypemap["xsd__anyType"] = t; } // xsd__anyType ia a base class: use pointer so can replace with any derived class usetypemap["xsd__anyType"] = "xsd__anyType*"; } deftypemap["xsd__any"] = ""; if (dflag) { usetypemap["xsd__any"] = "xsd__anyType"; } else { usetypemap["xsd__any"] = "_XML"; ptrtypemap["xsd__any"] = "_XML"; } deftypemap["xsd__anyAttribute"] = ""; if (dflag) { usetypemap["xsd__anyAttribute"] = "xsd__anyAttribute"; } else { usetypemap["xsd__anyAttribute"] = "_XML"; ptrtypemap["xsd__anyAttribute"] = "_XML"; } if (cflag) { deftypemap["xsd__base64Binary"] = "struct xsd__base64Binary\n{\n unsigned char *__ptr;\n int __size;\n char *id, *type, *options; // NOTE: non-NULL for DIME/MIME/MTOM XOP attachments only\n};"; usetypemap["xsd__base64Binary"] = "struct xsd__base64Binary"; ptrtypemap["xsd__base64Binary"] = "struct xsd__base64Binary"; } else { deftypemap["xsd__base64Binary"] = "class xsd__base64Binary\n{ public:\n unsigned char *__ptr;\n int __size;\n char *id, *type, *options; // NOTE: non-NULL for DIME/MIME/MTOM XOP attachments only\n};"; usetypemap["xsd__base64Binary"] = "xsd__base64Binary"; } if (cflag) { if (eflag) deftypemap["xsd__boolean"] = "enum xsd__boolean { false_, true_ };"; else deftypemap["xsd__boolean"] = "enum xsd__boolean { xsd__boolean__false_, xsd__boolean__true_ };"; usetypemap["xsd__boolean"] = "enum xsd__boolean"; defename("xsd__boolean", "false", false); defename("xsd__boolean", "true", false); } else { deftypemap["xsd__boolean"] = ""; usetypemap["xsd__boolean"] = "bool"; } deftypemap["xsd__byte"] = "typedef char xsd__byte;"; usetypemap["xsd__byte"] = "xsd__byte"; deftypemap["xsd__dateTime"] = ""; usetypemap["xsd__dateTime"] = "time_t"; deftypemap["xsd__double"] = ""; usetypemap["xsd__double"] = "double"; deftypemap["xsd__float"] = ""; usetypemap["xsd__float"] = "float"; if (cflag) { deftypemap["xsd__hexBinary"] = "struct xsd__hexBinary\n{\n unsigned char *__ptr;\n int __size;\n};"; usetypemap["xsd__hexBinary"] = "struct xsd__hexBinary"; ptrtypemap["xsd__hexBinary"] = "struct xsd__hexBinary"; } else { deftypemap["xsd__hexBinary"] = "class xsd__hexBinary\n{ public:\n unsigned char *__ptr;\n int __size;\n};"; usetypemap["xsd__hexBinary"] = "xsd__hexBinary"; } deftypemap["xsd__int"] = ""; usetypemap["xsd__int"] = "int"; deftypemap["xsd__long"] = ""; usetypemap["xsd__long"] = "LONG64"; deftypemap["xsd__short"] = ""; usetypemap["xsd__short"] = "short"; if (cflag || sflag) { deftypemap["xsd__string"] = ""; usetypemap["xsd__string"] = "char*"; ptrtypemap["xsd__string"] = "char*"; } else { deftypemap["xsd__string"] = ""; usetypemap["xsd__string"] = "std::string"; } if (cflag || sflag) { deftypemap["xsd__QName"] = ""; usetypemap["xsd__QName"] = "_QName"; ptrtypemap["xsd__QName"] = "_QName"; } else { deftypemap["xsd__QName"] = "typedef std::string xsd__QName;"; usetypemap["xsd__QName"] = "xsd__QName"; } deftypemap["xsd__unsignedByte"] = "typedef unsigned char xsd__unsignedByte;"; usetypemap["xsd__unsignedByte"] = "xsd__unsignedByte"; deftypemap["xsd__unsignedInt"] = ""; usetypemap["xsd__unsignedInt"] = "unsigned int"; deftypemap["xsd__unsignedLong"] = ""; usetypemap["xsd__unsignedLong"] = "ULONG64"; deftypemap["xsd__unsignedShort"] = ""; usetypemap["xsd__unsignedShort"] = "unsigned short"; if (cflag) { deftypemap["SOAP_ENC__base64Binary"] = "struct SOAP_ENC__base64Binary\n{\n unsigned char *__ptr;\n int __size;\n};"; usetypemap["SOAP_ENC__base64Binary"] = "struct SOAP_ENC__base64Binary"; ptrtypemap["SOAP_ENC__base64Binary"] = "struct SOAP_ENC__base64Binary"; deftypemap["SOAP_ENC__base64"] = "struct SOAP_ENC__base64\n{\n unsigned char *__ptr;\n int __size;\n};"; usetypemap["SOAP_ENC__base64"] = "struct SOAP_ENC__base64"; ptrtypemap["SOAP_ENC__base64"] = "struct SOAP_ENC__base64"; } else { deftypemap["SOAP_ENC__base64Binary"] = "class SOAP_ENC__base64Binary\n{ public:\n unsigned char *__ptr;\n int __size;\n};"; usetypemap["SOAP_ENC__base64Binary"] = "SOAP_ENC__base64Binary"; deftypemap["SOAP_ENC__base64"] = "class SOAP_ENC__base64\n{ public:\n unsigned char *__ptr;\n int __size;\n};"; usetypemap["SOAP_ENC__base64"] = "SOAP_ENC__base64"; } if (cflag) { if (eflag) deftypemap["SOAP_ENC__boolean"] = "enum SOAP_ENC__boolean { false__, true__ };"; else deftypemap["SOAP_ENC__boolean"] = "enum SOAP_ENC__boolean { SOAP_ENC__boolean__false_, SOAP_ENC__boolean__true_ };"; usetypemap["SOAP_ENC__boolean"] = "enum SOAP_ENC__boolean"; defename("SOAP_ENC__boolean", "false", false); defename("SOAP_ENC__boolean", "true", false); } else { deftypemap["SOAP_ENC__boolean"] = "typedef bool SOAP_ENC__boolean;"; usetypemap["SOAP_ENC__boolean"] = "SOAP_ENC__boolean"; } deftypemap["SOAP_ENC__byte"] = "typedef char SOAP_ENC__byte;"; usetypemap["SOAP_ENC__byte"] = "SOAP_ENC__byte"; deftypemap["SOAP_ENC__dateTime"] = "typedef time_t SOAP_ENC__dateTime;"; usetypemap["SOAP_ENC__dateTime"] = "SOAP_ENC__dateTime"; deftypemap["SOAP_ENC__double"] = "typedef double SOAP_ENC__double;"; usetypemap["SOAP_ENC__double"] = "SOAP_ENC__double"; deftypemap["SOAP_ENC__float"] = "typedef float SOAP_ENC__float;"; usetypemap["SOAP_ENC__float"] = "SOAP_ENC__float"; if (cflag) { deftypemap["SOAP_ENC__hexBinary"] = "struct SOAP_ENC__hexBinary\n{\n unsigned char *__ptr;\n int __size;\n};"; usetypemap["SOAP_ENC__hexBinary"] = "struct SOAP_ENC__hexBinary"; ptrtypemap["SOAP_ENC__hexBinary"] = "struct SOAP_ENC__hexBinary"; } else { deftypemap["SOAP_ENC__hexBinary"] = "class SOAP_ENC__hexBinary\n{ public:\n unsigned char *__ptr;\n int __size;\n};"; usetypemap["SOAP_ENC__hexBinary"] = "SOAP_ENC__hexBinary"; } deftypemap["SOAP_ENC__int"] = "typedef int SOAP_ENC__int;"; usetypemap["SOAP_ENC__int"] = "SOAP_ENC__int"; deftypemap["SOAP_ENC__long"] = "typedef LONG64 SOAP_ENC__long;"; usetypemap["SOAP_ENC__long"] = "SOAP_ENC__long"; deftypemap["SOAP_ENC__short"] = "typedef short SOAP_ENC__short;"; usetypemap["SOAP_ENC__short"] = "SOAP_ENC__short"; if (cflag || sflag) { deftypemap["SOAP_ENC__string"] = "typedef char* SOAP_ENC__string;"; usetypemap["SOAP_ENC__string"] = "SOAP_ENC__string"; ptrtypemap["SOAP_ENC__string"] = "SOAP_ENC__string"; } else { deftypemap["SOAP_ENC__string"] = "typedef std::string SOAP_ENC__string;"; usetypemap["SOAP_ENC__string"] = "SOAP_ENC__string"; } deftypemap["SOAP_ENC__unsignedByte"] = "typedef unsigned char SOAP_ENC__unsignedByte;"; usetypemap["SOAP_ENC__unsignedByte"] = "SOAP_ENC__unsignedByte"; deftypemap["SOAP_ENC__unsignedInt"] = "typedef unsigned int SOAP_ENC__unsignedInt;"; usetypemap["SOAP_ENC__unsignedInt"] = "SOAP_ENC__unsignedInt"; deftypemap["SOAP_ENC__unsignedLong"] = "typedef ULONG64 SOAP_ENC__unsignedLong;"; usetypemap["SOAP_ENC__unsignedLong"] = "SOAP_ENC__unsignedLong"; deftypemap["SOAP_ENC__unsignedShort"] = "typedef unsigned short SOAP_ENC__unsignedShort;"; usetypemap["SOAP_ENC__unsignedShort"] = "SOAP_ENC__unsignedShort"; deftypemap["_SOAP_ENC__arrayType"] = ""; deftypemap["SOAP_ENV__Header"] = ""; usetypemap["SOAP_ENV__Header"] = "struct SOAP_ENV__Header"; deftypemap["_SOAP_ENV__mustUnderstand"] = ""; if (cflag || sflag) usetypemap["_SOAP_ENV__mustUnderstand"] = "char*"; else usetypemap["_SOAP_ENV__mustUnderstand"] = "std::string"; deftypemap["SOAP_ENV__Fault"] = ""; usetypemap["SOAP_ENV__Fault"] = "struct SOAP_ENV__Fault"; deftypemap["SOAP_ENV__detail"] = ""; usetypemap["SOAP_ENV__detail"] = "struct SOAP_ENV__Detail"; deftypemap["SOAP_ENV__Detail"] = ""; usetypemap["SOAP_ENV__Detail"] = "struct SOAP_ENV__Detail"; deftypemap["SOAP_ENV__Code"] = ""; usetypemap["SOAP_ENV__Code"] = "struct SOAP_ENV__Code"; deftypemap["SOAP_ENV__Reason"] = ""; usetypemap["SOAP_ENV__Reason"] = "struct SOAP_ENV__Reason"; usetypemap["$CONTAINER"] = "std::vector"; usetypemap["$SIZE"] = "int"; if (read(mapfile)) fprintf(stderr, "Problem reading type map file '%s'.\nUsing internal type definitions for %s instead.\n\n", mapfile, cflag ? "C" : "C++"); if (!cflag) { // xsd__anyType is a base class: use pointer so can replace with any derived class const char *r = vname("$POINTER"); if (r && *r != '*' && *r != '$' && !strcmp(usetypemap["xsd__anyType"], "xsd__anyType*")) { usetypemap["xsd__anyType"] = "xsd__anyType"; if (!fflag) smptypemap["xsd__anyType"] = usetypemap["xsd__anyType"] = pname(true, true, NULL, NULL, "xs:anyType"); } } } const char *Types::nsprefix(const char *prefix, const char *URI) { if (URI && *URI) { const char *s = uris[URI]; if (!s) { size_t n; if (!prefix || !*prefix || *prefix == '_') s = schema_prefix; else s = estrdup(prefix); if (!syms[s]) n = syms[s] = 1; else n = ++syms[s]; if (n != 1 || !prefix || !*prefix || *prefix == '_') { size_t l = strlen(s); char *t = (char*)emalloc(l + 21); (SOAP_SNPRINTF(t, l + 21, l + 20), "%s%lu", s, (unsigned long)n); s = t; } uris[URI] = s; if (vflag) fprintf(stderr, "namespace prefix %s = \"%s\"\n", s, URI); } // if *prefix == '_', then add prefix string to s if (prefix && *prefix == '_') { size_t l = strlen(s); char *t = (char*)emalloc(l + 2); *t = '_'; soap_strcpy(t + 1, l + 1, s); s = t; } return s; } return ""; } const char *Types::prefix(const char *name) { const char *s; char *t; if (*name == '"') { s = strchr(name + 1, '"'); t = (char*)emalloc(s - name); soap_strncpy(t, s - name, name + 1, s - name - 1); return nsprefix(NULL, t); } s = strchr(name, ':'); if (s) { t = (char*)emalloc(s - name + 1); soap_strncpy(t, s - name + 1, name, s - name); return t; } return NULL; } const char *Types::uri(const char *name) { const char *s; char *t; if (*name == '"') { s = strchr(name + 1, '"'); t = (char*)emalloc(s - name); soap_strncpy(t, s - name, name + 1, s - name - 1); return t; } s = strchr(name, ':'); if (s) { struct Namespace *p = namespaces; if (p) { for (p += 6; p->id; p++) { if (!strncmp(p->id, name, s - name) && !p->id[s - name]) { if (p->in && *p->in) return p->in; return p->ns; } } } } return NULL; } // Find a C name for a QName. If the name has no qualifier, use URI. Suggest prefix for URI const char *Types::fname(const char *prefix, const char *URI, const char *qname, SetOfString *reserved, enum Lookup lookup, bool isqname) { char buf[4096], *t; const char *p, *s, *name; if (!qname) { fprintf(stream, "// Warning: FIXME internal error, no QName in fname()\n"); if (vflag) fprintf(stderr, "Internal error, no QName in fname()\n"); qname = "?"; } name = qname; if (isqname) s = strrchr(name, ':'); else s = NULL; if (s) { name = s + 1; if (qname[0] == '"' && qname[1] == '"') { s = NULL; } else if (*qname == '"') { t = (char*)emalloc(s - qname - 1); soap_strncpy(t, s - qname - 1, qname + 1, s - qname - 2); URI = t; } else if (!strncmp(qname, "xs:", 3)) // this hack is necessary since the nsmap table defines "xs" for "xsd" { s = "xsd"; URI = NULL; } else { t = (char*)emalloc(s - qname + 1); soap_strncpy(t, s - qname + 1, qname, s - qname); s = t; URI = NULL; } } if (URI && *URI) p = nsprefix(prefix, URI); else if (s) p = s; else p = ""; s = NULL; if (lookup == LOOKUP) { if (qnames.find(Pair(p,name)) != qnames.end()) s = qnames[Pair(p,name)]; } if (!s) { t = buf; if (!prefix || *prefix) { s = p; // no longer add '_' when URI != NULL, since nsprefix() will do this if (prefix && *prefix == ':') *t++ = ':'; else if (prefix && *prefix == '_') { if (!URI || !*URI) *t++ = '_'; if (prefix[1] == '_') // ensures ns prefix starts with __ { soap_strcpy(t, sizeof(buf) - (t - buf), prefix + 1); t += strlen(prefix + 1); } } if (s && *s) { for (; *s; s++) { if (t >= buf + sizeof(buf) - 8) break; if (isalnum(*s)) { *t++ = *s; } else if (*s == '-' && s[1] != '-' && s != p) { *t++ = '_'; } else if (*s == '_') { if (s == p) *t++ = '_'; else if (!_flag) { soap_strcpy(t, sizeof(buf) - (t - buf), "_USCORE"); t += 7; } else { s = utf8(&t, s, t == buf) - 1; } } else { s = utf8(&t, s, t == buf) - 1; } } if (!prefix || *prefix != '*') { *t++ = '_'; *t++ = '_'; } } else if (isdigit(*name)) { *t++ = '_'; } } for (s = name; *s; s++) { if (t >= buf + sizeof(buf) - 8) break; if (isalnum(*s)) { *t++ = *s; } else if (*s == '-' && s[1] != '-' && s[1] != '\0' && s != name) { *t++ = '_'; } else if (!_flag && *s == '_') { soap_strcpy(t, sizeof(buf) - (t - buf), "_USCORE"); t += 7; } else { s = utf8(&t, s, t == buf) - 1; } } *t = '\0'; s = strchr(buf, ':'); if (s) s++; else s = buf; while (knames.find(s) != knames.end() || (reserved && reserved->find(s) != reserved->end())) { if (t >= buf + sizeof(buf) - 8) break; *t++ = '_'; *t = '\0'; } if (isalpha(*buf) || *buf == '_' || *buf == ':') { size_t l = strlen(buf); t = (char*)emalloc(l + 1); soap_strcpy(t, l + 1, buf); } else { size_t l = strlen(buf); t = (char*)emalloc(l + 2); *t = '_'; soap_strcpy(t + 1, l + 1, buf); } s = t; if (lookup == LOOKUP) { qnames[Pair(p,name)] = s; if (vflag) { std::cerr << "Mapping '" << p << ":" << name << "' to '" << s << "'" << std::endl; #ifdef DEBUG for (MapOfPairToString::const_iterator i = qnames.begin(); i != qnames.end(); ++i) std::cerr << "Map[" << (*i).first.first << ":" << (*i).first.second << "]='" << (*i).second << "'" << std::endl; #endif } } } return s; } bool Types::is_defined(const char *prefix, const char *URI, const char *qname) { const char *t = fname(prefix, URI, qname, NULL, LOOKUP, true); return usetypemap.find(t) != usetypemap.end(); } const char *Types::aname(const char *prefix, const char *URI, const char *qname, SetOfString *reserved) { const char *s = fname(prefix, URI, qname, reserved, NOLOOKUP, true); if (reserved) reserved->insert(s); return s; } const char *Types::wname(const char *prefix, const char *URI, const char *qname, enum Lookup lookup) { SetOfString reserved; const char *t = aname(prefix, URI, qname, &reserved); const char *s; if (!zflag || zflag > 8) { if (lookup == LOOKUP) { MapOfStringToString::const_iterator i = wnames.find(t); if (i != wnames.end()) return (*i).second; fprintf(stream, "// Warning: FIXME internal error, incomplete wnames\n"); return qname; } s = fname(prefix, URI, qname, &reserved, NOLOOKUP, true); if (cflag) { size_t l = strlen(s); char *r = (char*)emalloc(l + 8); soap_strcpy(r, l + 8, "struct "); soap_strcpy(r + 7, l + 1, s); wnames[t] = r; } else { wnames[t] = s; } } else { s = fname(prefix, URI, qname, &reserved, NOLOOKUP, true); } knames.insert(s); return s; } const char *Types::cname(const char *prefix, const char *URI, const char *qname) { return fname(prefix, URI, qname, NULL, LOOKUP, true); } const char *Types::tname(const char *prefix, const char *URI, const char *qname) { const char *s = NULL, *t; t = cname(prefix, URI, qname); MapOfStringToString::const_iterator i = usetypemap.find(t); if (i != usetypemap.end()) s = (*i).second; if (!s) { s = t; fprintf(stream, "\n/// @todo !FIXME! @warning Undefined QName %s for type %s in namespace \"%s\", check WSDL and schema definitions.\n", qname ? qname : "", t, URI ? URI : "?"); if (vflag) fprintf(stderr, "\nWarning: undefined QName %s for type %s in namespace \"%s\"\n", qname ? qname : "", t, URI ? URI : "?"); } if (vflag) std::cerr << "Mapping use of '" << t << "' to '" << s << "'" << std::endl; return s; } const char *Types::tnameptr(bool flag, const char *prefix, const char *URI, const char *qname) { const char *s = pname(flag, !flag, prefix, URI, qname); if (flag) { if (!strchr(s, '*') || !strncmp(s, "char", 4) || !strncmp(s, "const char", 10) || !strncmp(s, "wchar_t", 7) || !strncmp(s, "const wchar_t", 13) || !strncmp(s, "_QName", 6) || !strncmp(s, "_XML", 4)) { size_t l = strlen(s); char *r = (char*)emalloc(l + 2); soap_strcpy(r, l + 2, s); soap_strcpy(r + l, 2, "*"); return r; } } return s; } const char *Types::tnamenoptr(const char *prefix, const char *URI, const char *qname) { const char *s = tname(prefix, URI, qname); if (strchr(s, '*') && (!strncmp(s, "char", 4) || !strncmp(s, "const char", 10) || !strncmp(s, "wchar_t", 7) || !strncmp(s, "const wchar_t", 13) || !strncmp(s, "_QName", 6) || !strncmp(s, "_XML", 4))) return s; size_t n = strlen(s); if (s[n - 1] == '*') { char *r = (char*)emalloc(n); soap_strncpy(r, n, s, n - 1); return r; } return s; } const char *Types::pname(bool flag, bool smart, const char *prefix, const char *URI, const char *qname) { const char *s = NULL, *t; t = cname(prefix, URI, qname); if (flag) { const char *r = NULL; if (!cflag && smart && (r = vname("$POINTER")) && *r != '*' && *r != '$') { MapOfStringToString::const_iterator i = smptypemap.find(t); if (i != smptypemap.end()) { s = (*i).second; } else { i = usetypemap.find(t); if (i != usetypemap.end()) s = (*i).second; if (!s) { s = t; fprintf(stream, "\n/// @todo !FIXME! @warning Undefined QName %s for pointer to type %s, check WSDL and schema definitions.\n", qname, t); if (vflag) fprintf(stderr, "\nWarning: undefined QName %s for pointer to type %s in namespace \"%s\"\n", qname, t, URI ? URI : "?"); } if (!is_ptr(prefix, URI, qname)) { size_t k = strlen(r); size_t l = strlen(s); char *p = (char*)emalloc(k + l + 4); soap_strcpy(p, k + l + 4, r); soap_strcpy(p + k, l + 4, "<"); soap_strcpy(p + k + 1, l + 3, s); soap_strcpy(p + k + l + 1, 3, "> "); s = p; } if (vflag) std::cerr << "Mapping \"smart\" pointer of '" << t << "' to '" << s << "'" << std::endl; smptypemap[t] = s; } } else { MapOfStringToString::const_iterator i = ptrtypemap.find(t); if (i != ptrtypemap.end()) { s = (*i).second; } else { i = usetypemap.find(t); if (i != usetypemap.end()) s = (*i).second; if (!s) { s = t; fprintf(stream, "\n/// @todo !FIXME! @warning Undefined QName %s for pointer to type %s, check WSDL and schema definitions.\n", qname, t); if (vflag) fprintf(stderr, "\nWarning: undefined QName %s for pointer to type %s in namespace \"%s\"\n", qname, t, URI ? URI : "?"); } if (!is_ptr(prefix, URI, qname)) { size_t l = strlen(s); char *p = (char*)emalloc(l + 2); soap_strcpy(p, l + 2, s); soap_strcpy(p + l, 2, "*"); s = p; } if (vflag) std::cerr << "Mapping pointer of '" << t << "' to '" << s << "'" << std::endl; ptrtypemap[t] = s; } } } else { MapOfStringToString::const_iterator i = usetypemap.find(t); if (i != usetypemap.end()) { if (!cflag && smart && smptypemap.find(t) != smptypemap.end() && ptrtypemap.find(t) != ptrtypemap.end() && usetypemap[t] == ptrtypemap[t]) s = smptypemap[t]; else s = usetypemap[t]; } if (!s) { s = t; fprintf(stream, "\n/// @todo !FIXME! @warning Undefined QName %s for type %s in namespace \"%s\", check WSDL and schema definitions.\n", qname, t, URI ? URI : "?"); if (vflag) fprintf(stderr, "\nWarning: undefined QName %s for type %s in namespace \"%s\"\n", qname, t, URI ? URI : "?"); } } return s; } const char *Types::deftname(enum Type type, bool mk_pointer, bool is_pointer, const char *prefix, const char *URI, const char *qname, const char *base) { char buf[4096]; const char *t = fname(prefix, URI, qname, NULL, LOOKUP, true); if (deftypemap[t]) { if (vflag) fprintf(stderr, "Name %s already defined (probably in typemap \"%s\")\n", qname, mapfile); return NULL; } if (usetypemap[t]) { if (vflag) fprintf(stderr, "Name %s is mapped\n", qname); return t; } const char *q = NULL; switch (type) { case ENUM: if (!c11flag) q = "enum"; if (c11flag || yflag) knames.insert(t); break; case STRUCT: q = "struct"; if (yflag) knames.insert(t); break; case CLASS: knames.insert(t); break; case TYPEDEF: knames.insert(t); if (base) ctypemap[t] = ctype(base); break; default: break; } buf[0] = '\0'; size_t n = 0; if (q) { soap_strcpy(buf, sizeof(buf), q); n = strlen(buf); soap_strcpy(buf + n, sizeof(buf) - n, " "); ++n; } soap_strcpy(buf + n, sizeof(buf) - n, t); const char *r = vname("$POINTER"); if (!cflag && !is_pointer && r && *r != '*' && *r != '$') { n = strlen(buf); size_t l = strlen(r); char *s = (char*)emalloc(l + n + 4); soap_strcpy(s, l + n + 4, r); soap_strcpy(s + l, n + 4, "<"); (void)soap_memcpy(s + l + 1, n + 3, buf, n + 1); soap_strcpy(s + l + n + 1, 3, "> "); smptypemap[t] = s; } if (mk_pointer) { n = strlen(buf); soap_strcpy(buf + n, sizeof(buf) - n, "*"); } n = strlen(buf); char *s = (char*)emalloc(n + 1); soap_strcpy(s, n + 1, buf); usetypemap[t] = s; if (mk_pointer || is_pointer) ptrtypemap[t] = s; if (is_pointer) smptypemap[t] = s; if (vflag) std::cerr << "Defined '" << t << "' ('" << qname << "' in namespace '" << (URI ? URI : prefix ? prefix : "") << "') as '" << s << "'" << std::endl; return t; } // get enumeration value. URI/type refers to the enum simpleType. const char *Types::ename(const char *type, const char *value, bool isqname) { if (c11flag) return fname(NULL, NULL, value, NULL, NOLOOKUP, isqname); const char *s = enames[Pair(type,value)]; if (!s) return defename(type, value, isqname); return s; } // get operation name const char *Types::oname(const char *prefix, const char *URI, const char *qname) { const char *s = fname(prefix, URI, qname, NULL, LOOKUP, true); if (s && usetypemap.find(s) != usetypemap.end()) { // Avoid name clash with structs/classes of the same name onames.insert(s); } s = fname(prefix, URI, qname, &onames, NOLOOKUP, true); onames.insert(s); return s; } // generate struct name const char *Types::sname(const char *URI, const char *name) { const char *s; char *t; if (!name || aflag) { t = (char*)emalloc(28); (SOAP_SNPRINTF(t, 28, 27), "struct-%d", snum++); s = fname("_", URI, t, &rnames, NOLOOKUP, true); rnames.insert(s); return s; } size_t l = strlen(name) + 1; for (VectorOfString::const_iterator i = scope.begin(); i != scope.end(); ++i) l += strlen(*i) + 1; t = (char*)emalloc(l); size_t n = 0; for (VectorOfString::const_iterator j = scope.begin(); j != scope.end(); ++j) { soap_strcpy(t + n, l - n, *j); n = strlen(t); soap_strcpy(t + n, l - n, "-"); ++n; if (n >= l) break; } soap_strcpy(t + n, l - n, name); s = fname("_", URI, t, &rnames, NOLOOKUP, true); rnames.insert(s); return s; } // generate union name const char *Types::uname(const char *URI) { const char *s; char *t; if (aflag) { t = (char*)emalloc(28); (SOAP_SNPRINTF(t, 28, 27), "union-%d", unum++); s = fname("_", URI, t, &rnames, NOLOOKUP, true); rnames.insert(s); return s; } size_t l = 0; for (VectorOfString::const_iterator i = scope.begin(); i != scope.end(); ++i) l += strlen(*i) + 1; t = (char*)emalloc(l + 6); soap_strcpy(t, l + 6, "union"); size_t n = 5; for (VectorOfString::const_iterator j = scope.begin(); j != scope.end(); ++j) { soap_strcpy(t + n, l + 6 - n, "-"); soap_strcpy(t + n + 1, l + 5 - n, *j); n = strlen(t); } s = fname("_", URI, t, &rnames, NOLOOKUP, true); rnames.insert(s); return s; } // generate enum name const char *Types::gname(const char *URI, const char *name) { const char *s; char *t; if (!name || aflag) { t = (char*)emalloc(28); (SOAP_SNPRINTF(t, 28, 27), "enum-%d", gnum++); s = fname("_", URI, t, &rnames, NOLOOKUP, true); rnames.insert(s); return s; } size_t l = strlen(name) + 1; for (VectorOfString::const_iterator i = scope.begin(); i != scope.end(); ++i) l += strlen(*i) + 1; t = (char*)emalloc(l); size_t n = 0; for (VectorOfString::const_iterator j = scope.begin(); j != scope.end(); ++j) { soap_strcpy(t + n, l - n, *j); n = strlen(t); soap_strcpy(t + n, l - n, "-"); ++n; if (n >= l) break; } soap_strcpy(t + n, l - n, name); s = fname("_", URI, t, &rnames, LOOKUP, true); rnames.insert(s); return s; } const char *Types::vname(const char *var) { MapOfStringToString::const_iterator i = usetypemap.find(var); if (i != usetypemap.end()) return (*i).second; return var; } // set enumeration value. URI/type refers to the enum simpleType. const char *Types::defename(const char *type, const char *value, bool isqname) { const char *s = fname(NULL, NULL, value, &rnames, NOLOOKUP, isqname); if (!eflag && type && *type) { // Add prefix to enum if (!*s || (s[0] == '_' && s[1] == '\0')) s = "_x0000"; size_t l = strlen(type) + strlen(s); char *buf = (char*)emalloc(l + 3); // _xXXXX is OK here if (s[0] == '_' && s[1] != 'x' && strncmp(s, "_USCORE", 7)) (SOAP_SNPRINTF(buf, l + 3, l + 1), "%s_%s", type, s); else (SOAP_SNPRINTF(buf, l + 3, l + 2), "%s__%s", type, s); s = buf; } else { rnames.insert(s); } enames[Pair(type,value)] = s; return s; } // checks if nillable or minOccurs=0 bool Types::is_nillable(const xs__element& element) { return (element.nillable || (element.minOccurs && !strcmp(element.minOccurs, "0"))); } // checks if permitted as union member bool Types::is_choicetype(const char *prefix, const char *URI, const char *type) { // TODO: consider c11flag also safe, but classes containing unions must define assignment ops using the selector(s) if (cflag) return true; if (type && !strcmp(type, "xs:byte")) return true; const char *t = tname(prefix, URI, type); return ( !strncmp(t, "enum ", 5) || !strcmp(t, "bool") || !strcmp(t, "int8_t") || !strcmp(t, "int16_t") || !strcmp(t, "int32_t") || !strcmp(t, "int64_t") || !strcmp(t, "uint8_t") || !strcmp(t, "uint16_t") || !strcmp(t, "uint32_t") || !strcmp(t, "uint64_t") || !strcmp(t, "char") || !strcmp(t, "unsigned char") || !strcmp(t, "short") || !strcmp(t, "unsigned short") || !strcmp(t, "int") || !strcmp(t, "unsigned int") || !strcmp(t, "long") || !strcmp(t, "long long") || !strcmp(t, "unsigned long") || !strcmp(t, "unsigned long long") || !strcmp(t, "LONG64") || !strcmp(t, "ULONG64") || !strcmp(t, "float") || !strcmp(t, "double") || !strcmp(t, "long double") || !strcmp(t, "time_t") || !strcmp(t, "_QName") || !strcmp(t, "_XML") ); } bool Types::is_ptr(const char *prefix, const char *URI, const char *qname) { const char *t = cname(prefix, URI, qname); const char *s = NULL; /* TODO perhaps looking at the typedef base type to see if this is a pointer? But this may not be desirable in all cases MapOfStringToString::const_iterator i = deftypemap.find(t); if (i != deftypemap.end()) { s = (*i).second; if (s && !strncmp(s, "typedef ", 8)) s += 8; } */ if ((!s || !*s) && usetypemap.find(t) != usetypemap.end()) { s = usetypemap[t]; if (ptrtypemap.find(t) != ptrtypemap.end() && s == ptrtypemap[t]) return true; if (!strcmp(s, "_QName") || !strcmp(s, "_XML")) return true; while (s && *s) { s = strchr(s + 1, '*'); if (s && *(s-1) != '/' && *(s+1) != '/') return true; } } return false; } void Types::dump(FILE *fd) { fprintf(fd, "\nTypes:\n"); for (MapOfStringToString::const_iterator i = usetypemap.begin(); i != usetypemap.end(); ++i) fprintf(fd, "%s=%s\n", (*i).first, (*i).second ? (*i).second : "(null)"); fprintf(fd, "\nPointers:\n"); for (MapOfStringToString::const_iterator j = ptrtypemap.begin(); j != ptrtypemap.end(); ++j) fprintf(fd, "%s=%s\n", (*j).first, (*j).second ? (*j).second : "(null)"); } void Types::define(const char *URI, const char *name, const xs__complexType& complexType) { if (Oflag > 1 && !complexType.is_used()) return; // generate prototype for structs/classes and store name const char *prefix = NULL; if (complexType.name) name = complexType.name; else prefix = "_"; if (complexType.complexContent && complexType.complexContent->restriction && !strcmp(complexType.complexContent->restriction->base, "SOAP-ENC:Array")) { if (strcmp(schema_prefix, "ns")) prefix = "*"; else prefix = ""; } if (cflag) { const char *t = deftname(STRUCT, true, false, prefix, URI, name, NULL); if (t) { if (yflag) fprintf(stream, "/// @brief Typedef synonym for struct %s.\ntypedef struct %s %s;\n\n", t, t, t); } else if (name) { t = deftypemap[cname(prefix, URI, name)]; if (t) { fprintf(stream, "/// Imported complexType \"%s\":%s from typemap \"%s\".\n", URI, name, mapfile ? mapfile : ""); document(complexType.annotation); if (*t) format(t); else fprintf(stream, "// complexType definition intentionally left blank.\n"); fprintf(stream, "\n"); } } } else { const char *t = deftname(CLASS, true, false, prefix, URI, name, NULL); if (t) { fprintf(stream, "class %s;\n\n", t); } else if (name) { const char *s = cname(prefix, URI, name); t = deftypemap[s]; if (t) { fprintf(stream, "/// Imported complexType \"%s\":%s from typemap \"%s\".\n", URI, name, mapfile ? mapfile : ""); document(complexType.annotation); if (*t) format(t); else fprintf(stream, "// complexType definition for %s intentionally left blank.\n", s); fprintf(stream, "\n"); } } } } void Types::gen(const char *URI, const char *name, const xs__simpleType& simpleType, bool anonymous, bool nested_restriction) { const char *t = NULL; const char *prefix = NULL; if (simpleType.name) name = simpleType.name; else if (!nested_restriction) prefix = "_"; if (!anonymous) { ++total; if (Oflag > 1 && !simpleType.is_used()) { fprintf(stream, "// Optimization: simpleType \"%s\":%s is not used and was removed\n\n", URI, name ? name : ""); ++omitted; return; } } if (!anonymous) { t = deftypemap[cname(NULL, URI, name)]; if (t) { fprintf(stream, "/// Imported simpleType \"%s\":%s from typemap \"%s\".\n", URI, name, mapfile ? mapfile : ""); document(simpleType.annotation); if (*t) format(t); else fprintf(stream, "// simpleType definition intentionally left blank.\n"); return; } } if (simpleType.restriction) { const char *base = simpleType.restriction->base; const xs__simpleType *ref = simpleType.restriction->simpleTypePtr(); while (ref && ref->restriction) ref = ref->restriction->simpleTypePtr(); if (simpleType.restriction->complexTypePtr()) { fprintf(stderr, "\nWarning: %s\"%s\":%s simpleType restriction has invalid base %s complexType\n", anonymous ? "local element/attribute " : "", URI ? URI : "", name ? name : "", base ? base : ""); } if (ref && ref->list) { const char *baseURI = NULL; if (simpleType.restriction->simpleTypePtr() && simpleType.restriction->simpleTypePtr()->schemaPtr()) baseURI = simpleType.restriction->simpleTypePtr()->schemaPtr()->targetNamespace; if (!anonymous) { if (simpleType.restriction->length && simpleType.restriction->length->value) { fprintf(stream, "/// @brief \"%s\":%s is a simpleType restriction of list %s of length %s.\n///\n", URI ? URI : "", name, base ? base : "", simpleType.restriction->length->value); document(simpleType.restriction->length->annotation); } else { const char *a = NULL, *b = "unbounded"; if (simpleType.restriction->minLength) { a = simpleType.restriction->minLength->value; document(simpleType.restriction->minLength->annotation); } if (simpleType.restriction->maxLength) { b = simpleType.restriction->maxLength->value; document(simpleType.restriction->maxLength->annotation); } if (a || b) fprintf(stream, "/// @brief \"%s\":%s is a simpleType of restriction of list %s of length %s..%s.\n", URI ? URI : "", name, base ? base : "", a ? a : "0", b ? b : ""); else fprintf(stream, "/// @brief \"%s\":%s is a simpleType of restriction of list %s.\n///\n", URI ? URI : "", name, base ? base : ""); } if (!simpleType.get_extensions().empty()) { fprintf(stream, "/// This type is extended by:\n"); for (std::vector::const_iterator i = simpleType.get_extensions().begin(); i != simpleType.get_extensions().end(); ++i) { if (is_defined(NULL, NULL, *i)) fprintf(stream, "/// - %s as %s\n", *i, tnamenoptr(NULL, NULL, *i)); else if (!Owflag) fprintf(stream, "/// - %s (not used and removed, retain with option -Ow%d)\n", *i, Oflag); else fprintf(stream, "/// - %s (not used and removed)\n", *i); } fprintf(stream, "///\n"); } if (!simpleType.get_restrictions().empty()) { fprintf(stream, "/// This type is restricted by:\n"); for (std::vector::const_iterator i = simpleType.get_restrictions().begin(); i != simpleType.get_restrictions().end(); ++i) { if (is_defined(NULL, NULL, *i)) fprintf(stream, "/// - %s as %s\n", *i, tnamenoptr(NULL, NULL, *i)); else fprintf(stream, "/// - %s (not used and removed)\n", *i); } fprintf(stream, "///\n"); } } const char *s = tname(NULL, baseURI, base); if (!anonymous) { t = deftname(TYPEDEF, false, is_ptr(NULL, baseURI, base), prefix, URI, name, s); if (t) fprintf(stream, "typedef %s %s;\n\n", s, t); } else { t = ""; fprintf(stream, elementformat, s, ""); fprintf(stream, "\n"); } } else if (!base && simpleType.restriction->simpleType) { if (!anonymous) { if (simpleType.restriction->simpleType->list && simpleType.restriction->length && simpleType.restriction->length->value) { fprintf(stream, "/// @brief \"%s\":%s is a simpleType restriction list of length %s.\n///\n", URI ? URI : "", name, simpleType.restriction->length->value); document(simpleType.restriction->length->annotation); } else { const char *a = NULL, *b = "unbounded"; if (simpleType.restriction->minLength) { a = simpleType.restriction->minLength->value; document(simpleType.restriction->minLength->annotation); } if (simpleType.restriction->maxLength) { b = simpleType.restriction->maxLength->value; document(simpleType.restriction->maxLength->annotation); } if (a || b) fprintf(stream, "/// @brief \"%s\":%s is a simpleType restriction list of length %s..%s.\n", URI ? URI : "", name, a ? a : "0", b ? b : ""); else fprintf(stream, "/// @brief \"%s\":%s is a simpleType restriction list.\n///\n", URI ? URI : "", name); } } gen(URI, name, *simpleType.restriction->simpleType, anonymous, true); } else { if (!base) base = "xs:string"; const char *baseURI = NULL; if (simpleType.restriction->simpleTypePtr() && simpleType.restriction->simpleTypePtr()->schemaPtr()) baseURI = simpleType.restriction->simpleTypePtr()->schemaPtr()->targetNamespace; if (!anonymous) fprintf(stream, "/// @brief \"%s\":%s is a simpleType restriction of type %s.\n///\n", URI ? URI : "", name, base); document(simpleType.annotation); document(simpleType.restriction->annotation); if (simpleType.restriction->assertion && simpleType.restriction->assertion->test) { fprintf(stream, "/// Assertion:\n"); documentation(simpleType.restriction->assertion->test); } if (!simpleType.restriction->enumeration.empty()) { bool is_qname = !strcmp(base, "xs:QName"); if (!anonymous) { t = deftname(ENUM, false, false, prefix, URI, name, NULL); if (t && !eflag && !c11flag && !Lflag) fprintf(stream, "/// @note The enum values are prefixed with \"%s__\" to prevent name clashes: use wsdl2h option -e to omit this prefix or use option -c++11 for scoped enumerations\n", t); } if (!t) t = gname(URI, name); if (c11flag) { if (!anonymous) fprintf(stream, "enum class %s\n{\n", t); else fprintf(stream, " enum class %s\n {\n", t); } else { if (!anonymous) fprintf(stream, "enum %s\n{\n", t); else fprintf(stream, " enum %s\n {\n", t); } SetOfString enumvals; LONG64 enumval = 0; if (!is_qname) { bool letters_ok = true; for (std::vector::const_iterator enumeration = simpleType.restriction->enumeration.begin(); enumeration != simpleType.restriction->enumeration.end(); ++enumeration) { const char *s; if ((s = (*enumeration).value)) { if (!enumvals.count(s)) { if (is_integer(s)) { LONG64 n = soap_strtoll(s, NULL, 10); document((*enumeration).annotation); fprintf(stream, "\t%s = " SOAP_LONG_FORMAT ",\t///< %s value=\"%s\"\n", ename(eflag ? "enum int" : t, s, false), n, base, s); // type="enum int" if eflag so all int enum consts get the same value assigned enumvals.insert(s); if (letters_ok) { if ((n >= 'A' && n <= 'Z') || (n >= 'a' && n <= 'z')) letters_ok = false; } if (n > enumval) enumval = n; } } } } if (letters_ok) { for (std::vector::const_iterator enumeration = simpleType.restriction->enumeration.begin(); enumeration != simpleType.restriction->enumeration.end(); ++enumeration) { const char *s; if ((s = (*enumeration).value)) { if (!enumvals.count(s)) { if (isalpha(s[0]) && !s[1]) { document((*enumeration).annotation); fprintf(stream, "\t%s = '%c',\t///< %s value=\"%s\"\n", ename(eflag ? "enum char" : t, s, false), *s, base, s); // type="enum char" if eflag so all char enum consts get the same value assigned enumvals.insert(s); if (*s > enumval) enumval = *s; } } } } } } for (std::vector::const_iterator enumeration = simpleType.restriction->enumeration.begin(); enumeration != simpleType.restriction->enumeration.end(); ++enumeration) { const char *s; if ((s = (*enumeration).value)) { if (!enumvals.count(s)) { document((*enumeration).annotation); if (is_qname) fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value_, true), base, (*enumeration).value_); else if (enumval) fprintf(stream, "\t%s = " SOAP_LONG_FORMAT ",\t///< %s value=\"%s\"\n", ename(t, s, false), ++enumval, base, s); else fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, s, false), base, s); enumvals.insert(s); } } else { fprintf(stream, "//\tunrecognized: enumeration \"%s\" has no value\n", name ? name : ""); } } if (!anonymous) { fprintf(stream, "};\n\n"); if (!c11flag && yflag) fprintf(stream, "/// @brief Typedef synonym for enum %s.\ntypedef enum %s %s;\n\n", t, t, t); if (!cflag && !Fflag && pflag && simpleType.name) { const char *s = wname(prefix, URI, name, NOLOOKUP); const char *t = tname(prefix, URI, name); fprintf(stream, "/// @brief Class wrapper for type %s derived from xsd__anyType.\n///\n", t); if (!Lflag) fprintf(stream, "/// @note Use option -P to remove this class.\n"); fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s); fprintf(stream, elementformat, t, "__item;"); modify(s); fprintf(stream, "\n};\n\n"); } } else fprintf(stream, " }\n"); } else { if (simpleType.restriction->length && simpleType.restriction->length->value) { fprintf(stream, "/// Length of this content is %s.\n", simpleType.restriction->length->value); document(simpleType.restriction->length->annotation); } else { const char *a = NULL, *b = NULL; if (simpleType.restriction->minLength) { a = simpleType.restriction->minLength->value; document(simpleType.restriction->minLength->annotation); } if (simpleType.restriction->maxLength) { b = simpleType.restriction->maxLength->value; document(simpleType.restriction->maxLength->annotation); } if (a || b) { fprintf(stream, "/// Length of this content is %s to %s.\n", a ? a : "0", b ? b : "unbounded"); } } char format[16]; format[0] = '\0'; if (simpleType.restriction->precision && simpleType.restriction->precision->value) { soap_strcpy(format, sizeof(format), simpleType.restriction->precision->value); fprintf(stream, "/// %s is %s.\n", simpleType.restriction->precision->fixed ? "Fixed precision" : "Precision", simpleType.restriction->precision->value); } else if (simpleType.restriction->totalDigits && simpleType.restriction->totalDigits->value) { soap_strcpy(format, sizeof(format), simpleType.restriction->totalDigits->value); fprintf(stream, "/// %s of total digits is %s.\n", simpleType.restriction->totalDigits->fixed ? "Fixed number" : "Number", simpleType.restriction->totalDigits->value); } if (simpleType.restriction->scale && simpleType.restriction->scale->value) { size_t n = strlen(format); soap_strcpy(format + n, sizeof(format) - n, "."); soap_strcpy(format + n + 1, sizeof(format) - n - 1, simpleType.restriction->scale->value); fprintf(stream, "/// %s is %s.\n", simpleType.restriction->scale->fixed ? "Fixed scale" : "Scale", simpleType.restriction->scale->value); } else if (simpleType.restriction->fractionDigits && simpleType.restriction->fractionDigits->value) { size_t n = strlen(format); soap_strcpy(format + n, sizeof(format) - n, "."); soap_strcpy(format + n + 1, sizeof(format) - n - 1, simpleType.restriction->fractionDigits->value); fprintf(stream, "/// %s of fraction digits is %s.\n", simpleType.restriction->fractionDigits->fixed ? "Fixed number" : "Number", simpleType.restriction->fractionDigits->value); } for (std::vector::const_iterator pattern1 = simpleType.restriction->pattern.begin(); pattern1 != simpleType.restriction->pattern.end(); ++pattern1) fprintf(stream, "/// Content pattern is \"%s\".\n", xstring((*pattern1).value)); const char *ai = NULL, *ae = NULL, *bi = NULL, *be = NULL; if (simpleType.restriction->minInclusive) { ai = simpleType.restriction->minInclusive->value; document(simpleType.restriction->minInclusive->annotation); } else if (simpleType.restriction->minExclusive) { ae = simpleType.restriction->minExclusive->value; document(simpleType.restriction->minExclusive->annotation); } if (simpleType.restriction->maxInclusive) { bi = simpleType.restriction->maxInclusive->value; document(simpleType.restriction->maxInclusive->annotation); } else if (simpleType.restriction->maxExclusive) { be = simpleType.restriction->maxExclusive->value; document(simpleType.restriction->maxExclusive->annotation); } if (ai || ae || bi || be) { fprintf(stream, "/// Value range is "); if (ai) fprintf(stream, "%s", ai); else if (ae) fprintf(stream, "%s (exclusive)", ae); else fprintf(stream, "lowest"); fprintf(stream, " to "); if (bi) fprintf(stream, "%s.\n", bi); else if (be) fprintf(stream, "%s (exclusive).\n", be); else fprintf(stream, "highest.\n"); } if (!simpleType.restriction->attribute.empty()) { if (!Wflag) fprintf(stderr, "\nWarning: simpleType \"%s\" should not have attributes\n", name ? name : ""); } const char *s = tname(NULL, baseURI, base); if (!anonymous) { t = deftname(TYPEDEF, false, is_ptr(NULL, baseURI, base), prefix, URI, name, s); if (t) fprintf(stream, "typedef %s %s", s, t); } else { t = ""; fprintf(stream, elementformat, s, ""); fprintf(stream, "\n"); } if (t) { if (!anonymous && !simpleType.restriction->pattern.empty()) { fprintf(stream, " \""); for (std::vector::const_iterator pattern2 = simpleType.restriction->pattern.begin(); pattern2 != simpleType.restriction->pattern.end(); ++pattern2) { if (pattern2 != simpleType.restriction->pattern.begin()) fprintf(stream, "|"); fprintf(stream, "%s", xstring((*pattern2).value)); } fprintf(stream, "\""); } // add range info only when type is numeric CType type = ctype(s); if (!anonymous && *format) { if (type == CTLONGDOUBLE) { fprintf(stream, " \"%%%sLf\"", format); } else if (type == CTDOUBLE) { fprintf(stream, " \"%%%slf\"", format); } else if (type == CTFLOAT) { fprintf(stream, " \"%%%sf\"", format); } else if (type == CTINT) { fprintf(stream, " \"%%%sd\"", format); } else if (type == CTUINT) { fprintf(stream, " \"%%%su\"", format); } else if (type == CTLONG) { fprintf(stream, " \"%%%slld\"", format); } else if (type == CTULONG) { fprintf(stream, " \"%%%sllu\"", format); } } if (!anonymous && simpleType.restriction->length && simpleType.restriction->length->value) fprintf(stream, " %s", simpleType.restriction->length->value); else if (!anonymous && simpleType.restriction->minLength && simpleType.restriction->minLength->value) fprintf(stream, " %s", simpleType.restriction->minLength->value); else if ((type == CTFLOAT || type == CTDOUBLE || type == CTLONGDOUBLE) && !anonymous && simpleType.restriction->minInclusive && simpleType.restriction->minInclusive->value && is_float(simpleType.restriction->minInclusive->value)) fprintf(stream, " %s", simpleType.restriction->minInclusive->value); else if ((type == CTINT || type == CTUINT || type == CTLONG || type == CTULONG) && !anonymous && simpleType.restriction->minInclusive && simpleType.restriction->minInclusive->value && is_integer(simpleType.restriction->minInclusive->value)) fprintf(stream, " %s", simpleType.restriction->minInclusive->value); else if ((type == CTFLOAT || type == CTDOUBLE || type == CTLONGDOUBLE) && !anonymous && simpleType.restriction->minExclusive && simpleType.restriction->minExclusive->value && is_float(simpleType.restriction->minExclusive->value)) fprintf(stream, " %s <", simpleType.restriction->minExclusive->value); else if ((type == CTINT || type == CTUINT || type == CTLONG || type == CTULONG) && !anonymous && simpleType.restriction->minExclusive && simpleType.restriction->minExclusive->value && is_integer(simpleType.restriction->minExclusive->value)) fprintf(stream, " " SOAP_LONG_FORMAT, to_integer(simpleType.restriction->minExclusive->value)+1); else if (!anonymous && simpleType.restriction->minInclusive && simpleType.restriction->minInclusive->value && is_integer(simpleType.restriction->minInclusive->value)) fprintf(stream, " /* from %s (inclusive) @warning: could not determine if this type is numeric */", simpleType.restriction->minInclusive->value); else if (!anonymous && simpleType.restriction->minExclusive && simpleType.restriction->minExclusive->value && is_integer(simpleType.restriction->minExclusive->value)) fprintf(stream, " /* from %s (exclusive) @warning: could not determine if this type is numeric */", simpleType.restriction->minExclusive->value); if (!anonymous && simpleType.restriction->length && simpleType.restriction->length->value) fprintf(stream, " : %s", simpleType.restriction->length->value); else if (!anonymous && simpleType.restriction->maxLength && simpleType.restriction->maxLength->value) fprintf(stream, " : %s", simpleType.restriction->maxLength->value); else if ((type == CTFLOAT || type == CTDOUBLE || type == CTLONGDOUBLE) && !anonymous && simpleType.restriction->maxInclusive && simpleType.restriction->maxInclusive->value && is_float(simpleType.restriction->maxInclusive->value)) fprintf(stream, " : %s", simpleType.restriction->maxInclusive->value); else if ((type == CTINT || type == CTUINT || type == CTLONG || type == CTULONG) && !anonymous && simpleType.restriction->maxInclusive && simpleType.restriction->maxInclusive->value && is_integer(simpleType.restriction->maxInclusive->value)) fprintf(stream, " : %s", simpleType.restriction->maxInclusive->value); else if ((type == CTFLOAT || type == CTDOUBLE || type == CTLONGDOUBLE) && !anonymous && simpleType.restriction->maxExclusive && simpleType.restriction->maxExclusive->value && is_float(simpleType.restriction->maxExclusive->value)) fprintf(stream, " :< %s", simpleType.restriction->maxExclusive->value); else if ((type == CTINT || type == CTUINT || type == CTLONG || type == CTULONG) && !anonymous && simpleType.restriction->maxExclusive && simpleType.restriction->maxExclusive->value && is_integer(simpleType.restriction->maxExclusive->value)) fprintf(stream, " : " SOAP_LONG_FORMAT, to_integer(simpleType.restriction->maxExclusive->value)-1); else if (!anonymous && simpleType.restriction->maxInclusive && simpleType.restriction->maxInclusive->value && is_integer(simpleType.restriction->maxInclusive->value)) fprintf(stream, " /* to %s (inclusive) @warning: could not determine if this type is numeric */", simpleType.restriction->maxInclusive->value); else if (!anonymous && simpleType.restriction->maxExclusive && simpleType.restriction->maxExclusive->value && is_integer(simpleType.restriction->maxExclusive->value)) fprintf(stream, " /* to %s (exclusive) @warning: could not determine if this type is numeric */", simpleType.restriction->maxExclusive->value); if (!anonymous) { fprintf(stream, ";\n\n"); if (!cflag && !Fflag && pflag && simpleType.name) { const char *s = wname(prefix, URI, name, NOLOOKUP); const char *t = tname(prefix, URI, name); fprintf(stream, "/// @brief Class wrapper for type %s derived from xsd__anyType.\n///\n", t); if (!Lflag) fprintf(stream, "/// @note Use option -P to remove this class.\n"); fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s); fprintf(stream, elementformat, t, "__item;"); modify(s); fprintf(stream, "\n};\n\n"); } } } } } } else if (simpleType.list) { if (simpleType.list->restriction && simpleType.list->restriction->base) { if (!anonymous) { fprintf(stream, "/// @brief \"%s\":%s is a simpleType list restriction of type %s.\n///\n", URI ? URI : "", name, simpleType.list->restriction->base); if (!Lflag) fprintf(stream, "/// @note This enumeration is a bitmask, so a set of values is supported (using | and & bit-ops on the bit vector).\n"); } document(simpleType.annotation); if (!anonymous) { t = deftname(ENUM, false, false, prefix, URI, name, NULL); if (t) { if (c11flag) fprintf(stream, "enum * class : int64_t %s\n{\n", t); else fprintf(stream, "enum * %s\n{\n", t); } } else { t = ""; fprintf(stream, "enum *\n{\n"); } if (t) { for (std::vector::const_iterator enumeration = simpleType.list->restriction->enumeration.begin(); enumeration != simpleType.list->restriction->enumeration.end(); ++enumeration) { if ((*enumeration).value) { if (!strcmp(simpleType.list->restriction->base, "xs:QName") && (*enumeration).value_) fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value_, true), simpleType.list->restriction->base, (*enumeration).value_); else fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value, false), simpleType.list->restriction->base, (*enumeration).value); } else { fprintf(stream, "//\tunrecognized: bitmask enumeration \"%s\" has no value\n", t); } } if (!anonymous) { fprintf(stream, "};\n\n"); if (!c11flag && yflag) fprintf(stream, "/// @brief Typedef synonym for enum %s.\ntypedef enum %s %s;\n\n", t, t, t); if (!cflag && !Fflag && pflag && simpleType.name) { const char *s = wname(prefix, URI, name, NOLOOKUP); const char *t = tname(prefix, URI, name); fprintf(stream, "/// @brief Class wrapper for type %s derived from xsd__anyType.\n///\n", t); if (!Lflag) fprintf(stream, "/// @note Use option -P to remove this class.\n"); fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s); fprintf(stream, elementformat, t, "__item;"); modify(s); fprintf(stream, "\n};\n\n"); } } else fprintf(stream, "}\n"); } } else if (simpleType.list->itemType) { const xs__simpleType *p = simpleType.list->itemTypePtr(); if (p && p->restriction && p->restriction->base && !p->restriction->enumeration.empty() && p->restriction->enumeration.size() <= 64) { if (!anonymous) { fprintf(stream, "/// @brief \"%s\":%s is a simpleType list of values of type %s.\n///\n", URI ? URI : "", name, simpleType.list->itemType); if (!Lflag) fprintf(stream, "/// @note This enumeration is a bitmask, so a set of values is supported (using | and & bit-ops on the bit vector).\n"); } document(simpleType.annotation); if (!anonymous) { t = deftname(ENUM, false, false, prefix, URI, name, NULL); if (t) { if (c11flag) fprintf(stream, "enum * class %s : int64_t\n{\n", t); else fprintf(stream, "enum * %s\n{\n", t); } } else { t = ""; fprintf(stream, "enum *\n{\n"); } if (t) { for (std::vector::const_iterator enumeration = p->restriction->enumeration.begin(); enumeration != p->restriction->enumeration.end(); ++enumeration) { if ((*enumeration).value) { if (!strcmp(p->restriction->base, "xs:QName") && (*enumeration).value_) fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value_, true), p->restriction->base, (*enumeration).value_); else fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value, false), p->restriction->base, (*enumeration).value); } else { fprintf(stream, "//\tunrecognized: bitmask enumeration \"%s\" has no value\n", t); } } if (!anonymous) { fprintf(stream, "};\n\n"); if (!c11flag && yflag) fprintf(stream, "/// @brief Typedef synonym for enum %s.\ntypedef enum %s %s;\n\n", t, t, t); if (!cflag && !Fflag && pflag && simpleType.name) { const char *s = wname(prefix, URI, name, NOLOOKUP); const char *t = tname(prefix, URI, name); fprintf(stream, "/// @brief Class wrapper for type %s derived from xsd__anyType.\n///\n", t); if (!Lflag) fprintf(stream, "/// @note Use option -P to remove this class.\n"); fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s); fprintf(stream, elementformat, t, "__item;"); modify(s); fprintf(stream, "\n};\n\n"); } } else fprintf(stream, "}\n"); } } else { const char *base; if (!strcmp(simpleType.list->itemType, "xs:QName")) base = "xs:QName"; else base = "xs:string"; const char *s = tname(NULL, NULL, base); if (!anonymous) { fprintf(stream, "/// @brief \"%s\":%s is a simpleType containing a whitespace separated list of values of type %s.\n///\n", URI ? URI : "", name, simpleType.list->itemType); t = deftname(TYPEDEF, false, is_ptr(NULL, NULL, base), prefix, URI, name, s); } document(simpleType.annotation); if (t) fprintf(stream, "typedef %s %s;\n", s, t); else { fprintf(stream, elementformat, s, ""); fprintf(stream, "\n"); } fprintf(stream, "\n"); } } else { if (!anonymous) { fprintf(stream, "/// @brief \"%s\":%s is a simpleType list.\n///\n", URI ? URI : "", name); if (!Lflag) fprintf(stream, "/// @note This enumeration is a bitmask, so a set of values is supported (using | and & bit-ops on the bit vector).\n"); } document(simpleType.annotation); if (!anonymous) { t = deftname(ENUM, false, false, prefix, URI, name, NULL); if (t && !eflag && !c11flag && !Lflag) fprintf(stream, "/// @note The enum values are prefixed with \"%s__\" to prevent name clashes: use wsdl2h option -e to omit this prefix or use option -c++11 for scoped enumerations\n", t); } else t = ""; if (t) { if (c11flag) fprintf(stream, "enum * class %s : int64_t\n{\n", t); else fprintf(stream, "enum * %s\n{\n", t); for (std::vector::const_iterator simple = simpleType.list->simpleType.begin(); simple != simpleType.list->simpleType.end(); ++simple) { if ((*simple).restriction && (*simple).restriction->base) { for (std::vector::const_iterator enumeration = (*simple).restriction->enumeration.begin(); enumeration != (*simple).restriction->enumeration.end(); ++enumeration) { if ((*enumeration).value) { if (!strcmp((*simple).restriction->base, "xs:QName") && (*enumeration).value_) fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value_, true), (*simple).restriction->base, (*enumeration).value_); else fprintf(stream, "\t%s,\t///< %s value=\"%s\"\n", ename(t, (*enumeration).value, false), (*simple).restriction->base, (*enumeration).value); } else { fprintf(stream, "//\tunrecognized: bitmask enumeration \"%s\" has no value\n", t); } } } } if (!anonymous) { fprintf(stream, "};\n\n"); if (!c11flag && yflag) fprintf(stream, "/// @brief Typedef synonym for enum %s.\ntypedef enum %s %s;\n\n", t, t, t); if (!cflag && !Fflag && pflag && simpleType.name) { const char *s = wname(prefix, URI, name, NOLOOKUP); const char *t = tname(prefix, URI, name); fprintf(stream, "/// @brief Class wrapper for type %s derived from xsd__anyType.\n///\n", t); if (!Lflag) fprintf(stream, "/// @note Use option -P to remove this class.\n"); fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", s); fprintf(stream, elementformat, t, "__item;"); modify(s); fprintf(stream, "\n};\n\n"); } } else fprintf(stream, "}\n\n"); } } } else if (simpleType.union_) { if (simpleType.union_->memberTypes) { const char *s = tname(NULL, NULL, "xs:string"); if (!anonymous) t = deftname(TYPEDEF, false, is_ptr(NULL, NULL, "xs:string"), prefix, URI, name, s); fprintf(stream, "/// @brief Union of values from member types \"%s\".\n", cstring(simpleType.union_->memberTypes)); if (t) fprintf(stream, "typedef %s %s;\n\n", s, t); else { fprintf(stream, elementformat, s, ""); fprintf(stream, "\n"); } } else if (!simpleType.union_->simpleType.empty()) { const char *s = tname(NULL, NULL, "xs:string"); if (!anonymous) t = deftname(TYPEDEF, false, is_ptr(NULL, NULL, "xs:string"), prefix, URI, name, s); for (std::vector::const_iterator simpleType1 = simpleType.union_->simpleType.begin(); simpleType1 != simpleType.union_->simpleType.end(); ++simpleType1) { if ((*simpleType1).restriction) { fprintf(stream, "/// @brief Union of values from type \"%s\".\n", (*simpleType1).restriction->base); // TODO: are there any other types we should report here? } } if (t) fprintf(stream, "typedef %s %s;\n\n", s, t); else { fprintf(stream, elementformat, s, ""); fprintf(stream, "\n"); } } else { fprintf(stream, "//\tunrecognized\n"); } } else { fprintf(stream, "//\tunrecognized simpleType\n"); } } void Types::gen(const char *URI, const char *name, const xs__complexType& complexType, bool anonymous) { SetOfString members; const char *t = NULL; const char *prefix = NULL; bool soapflag = false; if (complexType.name) name = complexType.name; else prefix = "_"; if (!anonymous) { ++total; if (Oflag > 1 && !complexType.is_used()) { fprintf(stream, "// Optimization: complexType \"%s\":%s is not used and was removed\n\n", URI, name ? name : ""); ++omitted; return; } } if (anonymous && name) { t = sname(URI, name); } else if (name) { t = cname(prefix, URI, name); if (deftypemap[t]) return; } if (name) scope.push_back(name); if (complexType.simpleContent) { if (!anonymous) { if (complexType.simpleContent->restriction) fprintf(stream, "/// @brief \"%s\":%s is a%s complexType with simpleContent restriction of type %s.\n///\n", URI ? URI : "", name ? name : "", complexType.abstract ? "n abstract" : "", complexType.simpleContent->restriction->base ? complexType.simpleContent->restriction->base : "xs:string"); else fprintf(stream, "/// @brief \"%s\":%s is a%s complexType with simpleContent extension of type %s.\n///\n", URI ? URI : "", name ? name : "", complexType.abstract ? "n abstract" : "", complexType.simpleContent->extension->base ? complexType.simpleContent->extension->base : "xs:string"); } document(complexType.annotation); if (!complexType.assert.empty()) { fprintf(stream, "/// Assertions:\n"); for (std::vector::const_iterator a = complexType.assert.begin(); a != complexType.assert.end(); ++a) if ((*a).test) documentation((*a).test); } if (!anonymous) { if (!complexType.get_extensions().empty()) { fprintf(stream, "/// This type is extended by:\n"); for (std::vector::const_iterator i = complexType.get_extensions().begin(); i != complexType.get_extensions().end(); ++i) { if (is_defined(NULL, NULL, *i)) fprintf(stream, "/// - %s as %s\n", *i, tnamenoptr(NULL, NULL, *i)); else if (!Owflag) fprintf(stream, "/// - %s (not used and removed, retain with option -Ow%d)\n", *i, Oflag); else fprintf(stream, "/// - %s (not used and removed)\n", *i); } fprintf(stream, "///\n"); } if (!complexType.get_restrictions().empty()) { fprintf(stream, "/// This type is restricted by:\n"); for (std::vector::const_iterator i = complexType.get_restrictions().begin(); i != complexType.get_restrictions().end(); ++i) { if (is_defined(NULL, NULL, *i)) fprintf(stream, "/// - %s as %s\n", *i, tnamenoptr(NULL, NULL, *i)); else fprintf(stream, "/// - %s (not used and removed)\n", *i); } fprintf(stream, "///\n"); } } operations(t); if (complexType.simpleContent->restriction) { if (cflag || Fflag || fflag || anonymous) { if (anonymous) { if (cflag) fprintf(stream, " struct %s\n {\n", t); else fprintf(stream, " class %s\n { public:\n", t); } else if (cflag) { fprintf(stream, "struct %s\n{\n", t); } else if (pflag && !Fflag && complexType.name) { fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t); } else { fprintf(stream, "class %s\n{ public:\n", t); } const xs__complexType *p = complexType.simpleContent->restriction->complexTypePtr(); if (p && !p->simpleContent) { fprintf(stderr, "\nWarning: %s\"%s\":%s complexType with simpleContent restriction has invalid base %s complexType with no simpleContent\n", anonymous ? "local element " : "", URI ? URI : "", name ? name : "", complexType.simpleContent->restriction->base ? complexType.simpleContent->restriction->base : ""); } gen_inh(URI, &complexType, anonymous); } else { const char *base = complexType.simpleContent->restriction->base; const char *baseURI = NULL; const xs__complexType *p = complexType.simpleContent->restriction->complexTypePtr(); if (p) { if (complexType.simpleContent->restriction->simpleTypePtr() && complexType.simpleContent->restriction->simpleTypePtr()->schemaPtr()) baseURI = complexType.simpleContent->restriction->simpleTypePtr()->schemaPtr()->targetNamespace; else if (complexType.simpleContent->restriction->complexTypePtr() && complexType.simpleContent->restriction->complexTypePtr()->schemaPtr()) baseURI = complexType.simpleContent->restriction->complexTypePtr()->schemaPtr()->targetNamespace; fprintf(stream, "class %s : public %s\n{ public:\n", t, cname(NULL, baseURI, base)); soapflag = true; if (p && !p->simpleContent) { fprintf(stderr, "\nWarning: \"%s\":%s complexType with simpleContent restriction has invalid base %s complexType with no simpleContent\n", URI ? URI : "", name ? name : "", complexType.simpleContent->restriction->base ? complexType.simpleContent->restriction->base : ""); } gen_inh(URI, p, anonymous); } else { if (pflag && !Fflag && complexType.name) fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t); else fprintf(stream, "class %s\n{ public:\n", t); fprintf(stream, "/// __item wraps simpleContent of type %s.\n", base); fprintf(stream, elementformat, tname(NULL, baseURI, base), "__item"); fprintf(stream, ";\n"); } } } else if (complexType.simpleContent->extension) { if (cflag || Fflag || fflag || anonymous) { if (anonymous) { if (cflag) fprintf(stream, " struct %s\n {\n", t); else fprintf(stream, " class %s\n { public:\n", t); } else if (cflag) { fprintf(stream, "struct %s\n{\n", t); } else if (pflag && !Fflag && complexType.name) { fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t); } else { fprintf(stream, "class %s\n{ public:\n", t); } const xs__complexType *p = complexType.simpleContent->extension->complexTypePtr(); if (p && !p->simpleContent) { fprintf(stderr, "\nWarning: %s\"%s\":%s complexType with simpleContent extension has invalid base %s complexType with no simpleContent\n", anonymous ? "local element " : "", URI ? URI : "", name ? name : "", complexType.simpleContent->extension->base ? complexType.simpleContent->extension->base : ""); } gen_inh(URI, &complexType, anonymous); } else { const char *base = complexType.simpleContent->extension->base; const char *baseURI = NULL; const xs__complexType *p = complexType.simpleContent->extension->complexTypePtr(); if (p) { if (complexType.simpleContent->extension->simpleTypePtr() && complexType.simpleContent->extension->simpleTypePtr()->schemaPtr()) baseURI = complexType.simpleContent->extension->simpleTypePtr()->schemaPtr()->targetNamespace; else if (complexType.simpleContent->extension->complexTypePtr() && complexType.simpleContent->extension->complexTypePtr()->schemaPtr()) baseURI = complexType.simpleContent->extension->complexTypePtr()->schemaPtr()->targetNamespace; fprintf(stream, "class %s : public %s\n{ public:\n", t, cname(NULL, baseURI, base)); soapflag = true; if (p && !p->simpleContent) { fprintf(stderr, "\nWarning: \"%s\":%s complexType with simpleContent extension has invalid base %s complexType with no simpleContent\n", URI ? URI : "", name ? name : "", complexType.simpleContent->extension->base ? complexType.simpleContent->extension->base : ""); } gen_inh(URI, p, anonymous); } else { if (pflag && !Fflag && complexType.name) fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t); else fprintf(stream, "class %s\n{ public:\n", t); fprintf(stream, "/// __item wraps simpleContent of type %s.\n", base); fprintf(stream, elementformat, tname(NULL, baseURI, base), "__item"); fprintf(stream, ";\n"); } gen(URI, complexType.simpleContent->extension->attribute, members); gen(URI, complexType.simpleContent->extension->attributeGroup, members); if (complexType.simpleContent->extension->anyAttribute) gen(URI, *complexType.simpleContent->extension->anyAttribute); } } else { fprintf(stream, "//\tunrecognized\n"); } } else if (complexType.complexContent) { if (complexType.complexContent->restriction) { if (!anonymous) fprintf(stream, "/// @brief \"%s\":%s is a%s complexType with complexContent restriction of type %s.\n///\n", URI ? URI : "", name ? name : "", complexType.abstract ? "n abstract" : "", complexType.complexContent->restriction->base ? complexType.complexContent->restriction->base : "xs:string"); document(complexType.annotation); document(complexType.complexContent->annotation); document(complexType.complexContent->restriction->annotation); if (!complexType.assert.empty()) { fprintf(stream, "/// Assertions:\n"); for (std::vector::const_iterator a = complexType.assert.begin(); a != complexType.assert.end(); ++a) if ((*a).test) documentation((*a).test); } if (!complexType.complexContent->restriction->assert.empty()) { fprintf(stream, "/// Assertions on restriction:\n"); for (std::vector::const_iterator a = complexType.complexContent->restriction->assert.begin(); a != complexType.complexContent->restriction->assert.end(); ++a) if ((*a).test) documentation((*a).test); } if (!anonymous) { if (!complexType.get_extensions().empty()) { fprintf(stream, "/// This type is extended by:\n"); for (std::vector::const_iterator i = complexType.get_extensions().begin(); i != complexType.get_extensions().end(); ++i) { if (is_defined(NULL, NULL, *i)) fprintf(stream, "/// - %s as %s\n", *i, tnamenoptr(NULL, NULL, *i)); else if (!Owflag) fprintf(stream, "/// - %s (not used and removed, retain with option -Ow%d)\n", *i, Oflag); else fprintf(stream, "/// - %s (not used and removed)\n", *i); } fprintf(stream, "///\n"); } if (!complexType.get_restrictions().empty()) { fprintf(stream, "/// This type is restricted by:\n"); for (std::vector::const_iterator i = complexType.get_restrictions().begin(); i != complexType.get_restrictions().end(); ++i) { if (is_defined(NULL, NULL, *i)) fprintf(stream, "/// - %s as %s\n", *i, tnamenoptr(NULL, NULL, *i)); else fprintf(stream, "/// - %s (not used and removed)\n", *i); } fprintf(stream, "///\n"); } } operations(t); if (!strcmp(complexType.complexContent->restriction->base, "SOAP-ENC:Array")) { char *item = NULL, *type = NULL; if (!complexType.complexContent->restriction->attribute.empty()) { xs__attribute& attribute = complexType.complexContent->restriction->attribute.front(); if (attribute.wsdl__arrayType) type = attribute.wsdl__arrayType; } xs__seqchoice *s = complexType.complexContent->restriction->sequence; if (s && !s->__contents.empty() && s->__contents.front().__union == SOAP_UNION_xs__union_content_element && s->__contents.front().__content.element) { xs__element& element = *s->__contents.front().__content.element; if (!type) { if (element.type) type = element.type; else if (element.simpleTypePtr()) { if (element.simpleTypePtr()->name) type = element.simpleTypePtr()->name; else if (element.simpleTypePtr()->restriction) type = element.simpleTypePtr()->restriction->base; } else if (element.complexTypePtr()) { if (element.complexTypePtr()->name) type = element.complexTypePtr()->name; else if (element.complexTypePtr()->complexContent && element.complexTypePtr()->complexContent->restriction) type = element.complexTypePtr()->complexContent->restriction->base; } } item = element.name; // } gen_soap_array(t, item, type); } else { const xs__complexType *p = complexType.complexContent->restriction->complexTypePtr(); if (complexType.complexContent->restriction->simpleTypePtr()) { fprintf(stderr, "\nWarning: %s\"%s\":%s complexType with complexContent restriction has invalid base %s simpleType\n", anonymous ? "local element " : "", URI ? URI : "", name ? name : "", complexType.complexContent->restriction->base ? complexType.complexContent->restriction->base : ""); } if (p && p->simpleContent) { fprintf(stderr, "\nWarning: %s\"%s\":%s complexType with complexContent restriction has invalid base %s complexType with simpleContent\n", anonymous ? "local element " : "", URI ? URI : "", name ? name : "", complexType.complexContent->restriction->base ? complexType.complexContent->restriction->base : ""); } if (anonymous) { if (cflag) fprintf(stream, " struct %s\n {\n", t); else fprintf(stream, " class %s\n { public:\n", t); } else if (cflag) fprintf(stream, "struct %s\n{\n", t); else if (pflag && !Fflag && complexType.name) fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t); else fprintf(stream, "class %s\n{ public:\n", t); if (complexType.complexContent->restriction->group) gen(URI, *complexType.complexContent->restriction->group, NULL, NULL, members); if (complexType.complexContent->restriction->all) gen(URI, *complexType.complexContent->restriction->all, NULL, NULL, members); if (complexType.complexContent->restriction->sequence) gen(URI, *complexType.complexContent->restriction->sequence, NULL, NULL, members); if (complexType.complexContent->restriction->choice) gen(URI, name, *complexType.complexContent->restriction->choice, NULL, NULL, members); gen(URI, complexType.complexContent->restriction->attribute, members); bool flag = true; if (complexType.complexContent->restriction->anyAttribute) { gen(URI, *complexType.complexContent->restriction->anyAttribute); flag = false; } while (p) { const char *pURI; if (p->schemaPtr()) pURI = p->schemaPtr()->targetNamespace; else pURI = URI; const char *b = cname(NULL, pURI, p->name); if (zflag && zflag <= 5) { fprintf(stream, "/// RESTRICTED FROM %s:\n", b); } else { if (comment_nest == 0) fprintf(stream, "/* RESTRICTED FROM %s:\n", b); else fprintf(stream, " RESTRICTED FROM %s:\n", b); comment_nest++; } if (p->complexContent && p->complexContent->restriction) { gen(URI, p->complexContent->restriction->attribute, members); if (p->complexContent->restriction->anyAttribute && flag) { gen(URI, *p->complexContent->restriction->anyAttribute); flag = false; } p = p->complexContent->restriction->complexTypePtr(); } else if (p->complexContent && p->complexContent->extension) { gen(URI, p->complexContent->extension->attribute, members); gen(URI, p->complexContent->extension->attributeGroup, members); if (p->complexContent->extension->anyAttribute && flag) { gen(URI, *p->complexContent->extension->anyAttribute); flag = false; } p = p->complexContent->extension->complexTypePtr(); } else { gen(URI, p->attribute, members); gen(URI, p->attributeGroup, members); if (p->anyAttribute && flag) gen(URI, *p->anyAttribute); p = NULL; } if (zflag && zflag <= 5) { fprintf(stream, "// END OF RESTRICTED FROM %s\n", b); } else { comment_nest--; if (comment_nest == 0) fprintf(stream, " END OF RESTRICTED FROM %s */\n", b); else fprintf(stream, " END OF RESTRICTED FROM %s\n", b); } } } } else if (complexType.complexContent->extension) { const char *base = complexType.complexContent->extension->base; xs__complexType *p = complexType.complexContent->extension->complexTypePtr(); if (!anonymous) fprintf(stream, "/// @brief \"%s\":%s is a%s complexType with complexContent extension of type %s.\n///\n", URI ? URI : "", name, complexType.abstract ? "n abstract" : "", base ? base : "xs:string"); document(complexType.annotation); document(complexType.complexContent->annotation); document(complexType.complexContent->extension->annotation); if (!complexType.assert.empty()) { fprintf(stream, "/// Assertions:\n"); for (std::vector::const_iterator a = complexType.assert.begin(); a != complexType.assert.end(); ++a) if ((*a).test) documentation((*a).test); } if (!complexType.complexContent->extension->assert.empty()) { fprintf(stream, "/// Assertions on extension:\n"); for (std::vector::const_iterator a = complexType.complexContent->extension->assert.begin(); a != complexType.complexContent->extension->assert.end(); ++a) if ((*a).test) documentation((*a).test); } operations(t); const char *baseURI = NULL; if (p && p->schemaPtr()) baseURI = p->schemaPtr()->targetNamespace; if (anonymous) { if (cflag) fprintf(stream, " struct %s\n {\n", t); else fprintf(stream, " class %s\n { public:\n", t); } else if (cflag) { fprintf(stream, "struct %s\n{\n", t); } else if (Fflag || fflag) { fprintf(stream, "class %s\n{ public:\n", t); } else // TODO: what to do if base class is in another namespace and elements must be qualified in XML payload? { fprintf(stream, "class %s : public %s\n{ public:\n", t, cname(NULL, baseURI, base)); soapflag = true; } if (complexType.complexContent->extension->simpleTypePtr()) { fprintf(stderr, "\nWarning: %s\"%s\":%s complexType with complexContent extension has invalid base simpleType %s\n", anonymous ? "local element " : "", URI ? URI : "", name ? name : "", base ? base : ""); } gen_inh(URI, p, anonymous); if (complexType.complexContent->extension->group) gen(URI, *complexType.complexContent->extension->group, NULL, NULL, members); if (complexType.complexContent->extension->all) gen(URI, *complexType.complexContent->extension->all, NULL, NULL, members); if (complexType.complexContent->extension->sequence) gen(URI, *complexType.complexContent->extension->sequence, NULL, NULL, members); if (complexType.complexContent->extension->choice) gen(URI, name, *complexType.complexContent->extension->choice, NULL, NULL, members); gen(URI, complexType.complexContent->extension->attribute, members); gen(URI, complexType.complexContent->extension->attributeGroup, members); if (complexType.complexContent->extension->anyAttribute) gen(URI, *complexType.complexContent->extension->anyAttribute); } else { fprintf(stream, "//\tunrecognized\n"); } } else { if (!anonymous) fprintf(stream, "/// @brief \"%s\":%s is a%s complexType.\n///\n", URI ? URI : "", name ? name : "", complexType.abstract ? "n abstract" : ""); document(complexType.annotation); if (!anonymous) { if (!complexType.get_extensions().empty()) { fprintf(stream, "/// This type is extended by:\n"); for (std::vector::const_iterator i = complexType.get_extensions().begin(); i != complexType.get_extensions().end(); ++i) { if (is_defined(NULL, NULL, *i)) fprintf(stream, "/// - %s as %s\n", *i, tnamenoptr(NULL, NULL, *i)); else if (!Owflag) fprintf(stream, "/// - %s (not used and removed, retain with option -Ow%d)\n", *i, Oflag); else fprintf(stream, "/// - %s (not used and removed)\n", *i); } fprintf(stream, "///\n"); } if (!complexType.get_restrictions().empty()) { fprintf(stream, "/// This type is restricted by:\n"); for (std::vector::const_iterator i = complexType.get_restrictions().begin(); i != complexType.get_restrictions().end(); ++i) { if (is_defined(NULL, NULL, *i)) fprintf(stream, "/// - %s as %s\n", *i, tnamenoptr(NULL, NULL, *i)); else fprintf(stream, "/// - %s (not used and removed)\n", *i); } fprintf(stream, "///\n"); } } operations(t); if (anonymous) { if (cflag) fprintf(stream, " struct %s\n {\n", t); else fprintf(stream, " class %s\n { public:\n", t); } else if (cflag) { fprintf(stream, "struct %s\n{\n", t); } else if (pflag && !Fflag && complexType.name) { fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t); } else { fprintf(stream, "class %s\n{ public:\n", t); } if (complexType.all) gen(URI, *complexType.all, NULL, NULL, members); else if (complexType.choice) gen(URI, name, *complexType.choice, NULL, NULL, members); else if (complexType.sequence) gen(URI, *complexType.sequence, NULL, NULL, members); else if (complexType.group) gen(URI, *complexType.group, NULL, NULL, members); else if (complexType.any) gen(URI, *complexType.any, NULL, NULL); } if (!(complexType.complexContent && complexType.complexContent->extension) && complexType.defaultAttributesApply && complexType.schemaPtr() && complexType.schemaPtr()->attributeGroupPtr()) { fprintf(stream, "/// Default attributes \"%s\"\n", complexType.schemaPtr()->defaultAttributes); xs__attributeGroup *a = complexType.schemaPtr()->attributeGroupPtr(); if (a->attributeGroupPtr()) a = a->attributeGroupPtr(); gen(URI, a->attribute, members); gen(URI, a->attributeGroup, members); if (a->anyAttribute) gen(URI, *a->anyAttribute); } gen(URI, complexType.attribute, members); gen(URI, complexType.attributeGroup, members); if (complexType.anyAttribute) gen(URI, *complexType.anyAttribute); if (complexType.mixed || ( complexType.complexContent && ( complexType.complexContent->mixed || ( complexType.complexContent->extension && complexType.complexContent->extension->complexTypePtr() && complexType.complexContent->extension->complexTypePtr()->mixed ) ) )) { fprintf(stream, "/// Mixed content.\n"); if (!Lflag) fprintf(stream, "/// @note Mixed content is user-definable.\n/// Consult the protocol documentation to change or insert declarations.\n/// Use wsdl2h option -d for DOM (soap_dom_element) to store mixed content.\n"); if (dflag) { fprintf(stream, elementformat, pname(with_union, false, NULL, NULL, "xs:any"), "__mixed"); fprintf(stream, "0;\t///< Store mixed content as xsd:any (by default a xsd__anyType DOM soap_dom_element linked node structure).\n"); } else { fprintf(stream, elementformat, tname(NULL, NULL, "xs:any"), "__mixed"); fprintf(stream, "0;\t///< Store mixed content as an xsd:any (an XML string by default).\n"); } } if (t) modify(t); if (!anonymous) { if (Fflag) { for (std::vector::const_iterator i = complexType.get_extensions().begin(); i != complexType.get_extensions().end(); ++i) { fprintf(stream, "/// A transient pointer to a derived type value that replaces the value of this base type %s when non-NULL\n", t); fprintf(stream, derivedformat, tnamenoptr(NULL, NULL, *i), aname(NULL, NULL, *i, &members)); fprintf(stream, "\n"); } for (std::vector::const_iterator i = complexType.get_restrictions().begin(); i != complexType.get_restrictions().end(); ++i) { fprintf(stream, "/// A transient pointer to a derived type value that replaces the value of this base type %s when non-NULL\n", t); fprintf(stream, derivedformat, tnamenoptr(NULL, NULL, *i), aname(NULL, NULL, *i, &members)); fprintf(stream, "\n"); } } if (!cflag && !(pflag && !Fflag && complexType.name) && !soapflag && soap_context && *soap_context) { if (!complexType.complexContent || !complexType.complexContent->extension || !complexType.complexContent->extension->complexTypePtr()) { fprintf(stream, "/// Pointer to soap context that manages this instance.\n"); fprintf(stream, pointerformat, "struct soap", soap_context); fprintf(stream, ";\n"); } } fprintf(stream, "};\n\n"); } if (name) scope.pop_back(); } void Types::gen(const char *URI, const std::vector& attributes, SetOfString& members) { for (std::vector::const_iterator attribute = attributes.begin(); attribute != attributes.end(); ++attribute) gen(URI, *attribute, members); } void Types::gen(const char *URI, const xs__attribute& attribute, SetOfString& members) { const char *name = attribute.name; const char *type = attribute.type; const char *default_ = attribute.default_; const char *default__ = attribute.default__; const char *fixed = attribute.fixed; const char *fixed_ = attribute.fixed_; const char *nameURI = NULL, *typeURI = NULL, *nameprefix = NULL, *typeprefix = NULL; bool is_optional = attribute.use != required && (!default_ || Dflag) && (!fixed || Dflag); document(attribute.annotation); if (!URI) URI = attribute.schemaPtr()->targetNamespace; if (attribute.targetNamespace) { if ((attribute.form && *attribute.form == qualified) || attribute.schemaPtr()->attributeFormDefault == qualified) nameURI = attribute.targetNamespace; else nameprefix = ":"; } else if (!attribute.ref && URI && attribute.schemaPtr() && attribute.schemaPtr()->targetNamespace && strcmp(URI, attribute.schemaPtr()->targetNamespace)) { if ((attribute.form && *attribute.form == qualified) || attribute.schemaPtr()->attributeFormDefault == qualified) nameURI = attribute.schemaPtr()->targetNamespace; // handles attributes defined in another namespace else nameprefix = ":"; } else if (attribute.form) { if (*attribute.form == qualified) nameURI = URI; else nameprefix = ":"; } if (attribute.attributePtr()) // attribute ref { name = attribute.attributePtr()->name; type = attribute.attributePtr()->type; if (!default_) { default_ = attribute.attributePtr()->default_; default__ = attribute.attributePtr()->default__; } if (!fixed) { fixed = attribute.attributePtr()->fixed; fixed_ = attribute.attributePtr()->fixed_; } if (default_) is_optional = attribute.attributePtr()->use != required && (Dflag != 0); else if (fixed) is_optional = false; else if (is_optional) is_optional = attribute.attributePtr()->use != required; if (!type) { type = name; typeprefix = "_"; } if (attribute.attributePtr()->schemaPtr()) { typeURI = attribute.attributePtr()->schemaPtr()->targetNamespace; if (attribute.form && *attribute.form == unqualified) nameprefix = ":"; else if (zflag != 3 && zflag != 2 && URI && typeURI && attribute.schemaPtr()->attributeFormDefault == qualified && !strcmp(URI, typeURI)) nameprefix = NULL; else if (zflag == 3 && URI && typeURI && attribute.schemaPtr()->attributeFormDefault == unqualified && !strcmp(URI, typeURI)) nameprefix = NULL; else nameURI = typeURI; } if (attribute.ref) fprintf(stream, "/// Attribute reference \"%s\":%s.\n", attribute.schemaPtr()->targetNamespace, attribute.ref); document(attribute.attributePtr()->annotation); fprintf(stream, attributeformat, pname(is_optional, true, typeprefix, typeURI, type), aname(nameprefix, nameURI, name, &members)); // make sure no name - type clash } else if (name && type) { fprintf(stream, "/// Attribute \"%s\" of type %s.\n", name, type); fprintf(stream, attributeformat, pname(is_optional, true, NULL, URI, type), aname(nameprefix, nameURI, name, &members)); // make sure no name - type clash } else if (name && attribute.simpleTypePtr()) { const char *s = ""; const char *r = NULL; if (!cflag && is_optional && (r = vname("$POINTER")) && *r != '*' && *r != '$') { s = ">"; fprintf(stream, attrtemplateformat_open, r, "\n"); } else fprintf(stream, "@"); gen(URI, name, *attribute.simpleTypePtr(), true, false); if (r && *r != '*' && *r != '$') fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name, &members)); else if (is_optional) fprintf(stream, pointerformat, s, aname(nameprefix, nameURI, name, &members)); else fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name, &members)); } else if (attribute.ref) { if (!type) type = attribute.ref; fprintf(stream, "/// Imported attribute reference %s.\n", attribute.ref); fprintf(stream, attributeformat, pname(is_optional, true, "_", NULL, attribute.ref), aname(NULL, NULL, attribute.ref, &members)); } else { type = "xs:string"; fprintf(stream, "/// Attribute \"%s\" has no type or ref: assuming string content.\n", name ? name : ""); fprintf(stream, attributeformat, pname(is_optional, true, NULL, NULL, type), aname(NULL, nameURI, name, &members)); } const char *s; switch (attribute.use) { case prohibited: fprintf(stream, " 0:0"); s = "Prohibited attribute"; break; case required: fprintf(stream, " 1"); s = "Required attribute"; break; default: fprintf(stream, " 0"); s = "Optional attribute"; break; } if (default_) { gendefault(typeURI ? typeURI : URI, type, name, attribute.simpleTypePtr(), default_, default__, "="); fprintf(stream, ";\t///< %s with default value=\"%s\".\n", s, default_); } else if (fixed) { gendefault(typeURI ? typeURI : URI, type, name, attribute.simpleTypePtr(), fixed, fixed_, "=="); fprintf(stream, ";\t///< %s with fixed value=\"%s\".\n", s, fixed); } else { fprintf(stream, ";\t///< %s.\n", s); } } void Types::gen(const char *URI, const std::vector& attributeGroups, SetOfString& members) { for (std::vector::const_iterator attributeGroup = attributeGroups.begin(); attributeGroup != attributeGroups.end(); ++attributeGroup) { static std::set visited; const xs__attributeGroup *p = &*attributeGroup; if (visited.find(p) != visited.end()) { if (p->ref) fprintf(stderr, "\nWarning: circular attributeGroup \n", p->ref); else fprintf(stderr, "\nWarning: circular attributeGroup \n", p->name ? p->name : ""); fprintf(stream, "/// @todo !FIXME! @warning %s is an attributeGroup with a circular reference.\n", p->ref ? p->ref : p->name ? p->name : ""); return; } visited.insert(p); const char *pURI = URI; if (p->ref) // attributeGroup ref fprintf(stream, "// BEGIN ATTRIBUTEGROUP .\n", p->ref ? p->ref : ""); else fprintf(stream, "// BEGIN ATTRIBUTEGROUP .\n", p->name ? p->name : ""); if (p->attributeGroupPtr()) { gen(pURI, p->attributeGroupPtr()->attribute, members); gen(pURI, p->attributeGroupPtr()->attributeGroup, members); } else { gen(pURI, p->attribute, members); gen(pURI, p->attributeGroup, members); } if (p->anyAttribute) gen(pURI, *p->anyAttribute); fprintf(stream, "// END OF ATTRIBUTEGROUP\n"); visited.erase(p); } } void Types::gen(const char *URI, const std::vector& alls, SetOfString& members) { for (std::vector::const_iterator all = alls.begin(); all != alls.end(); ++all) gen(URI, *all, NULL, NULL, members); } void Types::gen(const char *URI, const xs__all& all, const char *minOccurs, const char *maxOccurs, SetOfString& members) { bool tmp_union1 = with_union; bool tmp_union2 = fake_union; with_union = false; fake_union = false; gen(URI, all.element, minOccurs, maxOccurs, members); with_union = tmp_union1; fake_union = tmp_union2; } void Types::gen(const char *URI, const std::vector& contents, SetOfString& members) { for (std::vector::const_iterator content = contents.begin(); content != contents.end(); ++content) { switch ((*content).__union) { case SOAP_UNION_xs__union_content_element: if ((*content).__content.element) gen(URI, *(*content).__content.element, true, NULL, NULL, members); break; case SOAP_UNION_xs__union_content_group: if ((*content).__content.group) gen(URI, *(*content).__content.group, NULL, NULL, members); break; case SOAP_UNION_xs__union_content_choice: if ((*content).__content.choice) gen(URI, NULL, *(*content).__content.choice, NULL, NULL, members); break; case SOAP_UNION_xs__union_content_sequence: if ((*content).__content.sequence) gen(URI, *(*content).__content.sequence, NULL, NULL, members); break; case SOAP_UNION_xs__union_content_any: if ((*content).__content.any) gen(URI, *(*content).__content.any, NULL, NULL); break; } } } void Types::gen(const char *URI, const xs__seqchoice& sequence, const char *minOccurs, const char *maxOccurs, SetOfString& members) { const char *min = minOccurs; const char *max = maxOccurs; const char *s = NULL; char *t = NULL; bool tmp_union = with_union; with_union = false; if (sequence.minOccurs) min = sequence.minOccurs; if (sequence.maxOccurs) max = sequence.maxOccurs; if ((min && strcmp(min, "1")) || (max && strcmp(max, "1"))) { fprintf(stream, "// BEGIN SEQUENCE \n"); document(sequence.annotation); s = sname(URI, "sequence"); size_t l = strlen(s); t = (char*)emalloc(l + 2); soap_strcpy(t, l + 2, "_"); soap_strcpy(t + 1, l + 1, s); s = strstr(s, "__"); if (!s) s = t; if (max && strcmp(max, "1")) { if (cflag || sflag || (zflag && zflag <= 2)) { fprintf(stream, sizeformat, vname("$SIZE"), s + 1); if (!fake_union && min) fprintf(stream, " %s", min); if (max && strcmp(max, "1") && is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); } else { fprintf(stream, templateformat_open, vname("$CONTAINER"), "\n"); } } fprintf(stream, " struct %s\n {\n", t); // do not use a class, may clash with member name SetOfString members1; gen(URI, sequence.__contents, members1); } else { if (fake_union) fprintf(stream, "// BEGIN SEQUENCE \n"); document(sequence.annotation); gen(URI, sequence.__contents, members); } if (s) { if (max && strcmp(max, "1")) { if (cflag || sflag || (zflag && zflag <= 2)) { fprintf(stream, pointerformat, "}", s); } else { fprintf(stream, elementformat, "}>", s); if (!fake_union && min) fprintf(stream, " %s", min); if (max && strcmp(max, "1") && is_integer(max)) fprintf(stream, ":%s", max); } } else { fprintf(stream, pointerformat, "}", s); if (!fake_union && min) fprintf(stream, " %s", min); } fprintf(stream, ";\n"); } if (s || fake_union) fprintf(stream, "// END OF SEQUENCE\n"); with_union = tmp_union; } void Types::gen(const char *URI, const std::vector& elements, const char *minOccurs, const char *maxOccurs, SetOfString& members) { for (std::vector::const_iterator element = elements.begin(); element != elements.end(); ++element) gen(URI, *element, true, minOccurs, maxOccurs, members); } void Types::gen(const char *URI, const xs__element& element, bool substok, const char *minOccurs, const char *maxOccurs, SetOfString& members) { const char *name = element.name; const char *type = element.type; const char *default_ = element.default_; const char *default__ = element.default__; const char *fixed = element.fixed; const char *fixed_ = element.fixed_; const char *min = minOccurs; const char *max = maxOccurs; bool nillable = element.nillable; const char *nameURI = NULL, *typeURI = NULL, *nameprefix = NULL, *typeprefix = NULL; document(element.annotation); if (!URI) URI = element.schemaPtr()->targetNamespace; if (element.minOccurs) min = element.minOccurs; if (element.maxOccurs) max = element.maxOccurs; if (element.xmime__expectedContentTypes) fprintf(stream, "/// MTOM attachment with content types %s.\n", element.xmime__expectedContentTypes); if (element.targetNamespace) { if ((element.form && *element.form == qualified) || element.schemaPtr()->elementFormDefault == qualified) nameURI = element.targetNamespace; else nameprefix = ":"; } else if (!element.ref && URI && element.schemaPtr() && element.schemaPtr()->targetNamespace && strcmp(URI, element.schemaPtr()->targetNamespace)) { if ((element.form && *element.form == qualified) || element.schemaPtr()->elementFormDefault == qualified) nameURI = element.schemaPtr()->targetNamespace; // handles elements defined in another namespace else nameprefix = ":"; } else if (element.form) { if (*element.form == qualified) nameURI = URI; else nameprefix = ":"; } if (element.elementPtr()) // element ref (or ref to substitution element) { name = element.elementPtr()->name; type = element.elementPtr()->type; if (!max || !strcmp(max, "0") || !strcmp(max, "1")) { if (!default_) { default_ = element.elementPtr()->default_; default__ = element.elementPtr()->default__; } if (!fixed) { fixed = element.elementPtr()->fixed; fixed_ = element.elementPtr()->fixed_; } } if (!nillable) nillable = element.elementPtr()->nillable; if (!type) { type = name; typeprefix = "_"; } if (element.elementPtr()->schemaPtr()) { typeURI = element.elementPtr()->schemaPtr()->targetNamespace; if (element.form && *element.form == unqualified) nameprefix = ":"; else if (zflag != 3 && zflag != 2 && URI && typeURI && element.schemaPtr()->elementFormDefault == qualified && !strcmp(URI, typeURI)) nameprefix = NULL; else if (zflag == 3 && URI && typeURI && element.schemaPtr()->elementFormDefault == unqualified && !strcmp(URI, typeURI)) nameprefix = NULL; else nameURI = typeURI; } document(element.elementPtr()->annotation); if (element.elementPtr()->xmime__expectedContentTypes) fprintf(stream, "/// MTOM attachment with content types %s.\n", element.elementPtr()->xmime__expectedContentTypes); if (substok && element.elementPtr()->abstract) { fprintf(stream, "/// Reference %s to abstract element.\n", element.ref); gen_substitutions(URI, element, members); } else if (substok && element.elementPtr()->substitutionsPtr() && !element.elementPtr()->substitutionsPtr()->empty()) { if (vflag) fprintf(stderr, "\nWarning: element ref \"%s\" stands as the head of a substitutionGroup but is not declared abstract\n", element.ref); gen_substitutions(URI, element, members); } else if (max && strcmp(max, "1")) // maxOccurs != "1" { const char *s; if (cflag && zflag != 1) s = tnameptr(true, typeprefix, typeURI, type); else if (Fflag || fflag) s = tnamenoptr(typeprefix, typeURI, type); else s = tnameptr(false, typeprefix, typeURI, type); if (cflag || sflag) { fprintf(stream, "/// Size of the dynamic array of values of type %s is %s..%s.\n", s, min ? min : "1", max); fprintf(stream, sizeformat, vname("$SIZE"), aname(NULL, NULL, name, &members)); fprintf(stream, " %s", fake_union ? "0" : min ? min : "1"); if (is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); if (cflag && zflag != 1) { fprintf(stream, "/// Array %s of size %s..%s.\n", s, min ? min : "1", max); fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name, &members)); } else { fprintf(stream, "/// Pointer to array %s of size %s..%s.\n", s, min ? min : "1", max); fprintf(stream, pointerformat, s, aname(nameprefix, nameURI, name, &members)); } } else { fprintf(stream, "/// Vector of %s element refs of length %s..%s.\n", s, min ? min : "1", max); if (with_union) fprintf(stream, pointertemplateformat, vname("$CONTAINER"), s, aname(nameprefix, nameURI, name)); else fprintf(stream, templateformat, vname("$CONTAINER"), s, aname(nameprefix, nameURI, name, &members)); } nillable = false; } else { if (element.ref) fprintf(stream, "/// Element reference \"%s:\"%s.\n", element.schemaPtr()->targetNamespace, element.ref); else fprintf(stream, "/// Element \"%s\":%s.\n", element.schemaPtr()->targetNamespace, name); nillable = (with_union && !is_choicetype(typeprefix, typeURI, type)) || ((fake_union || element.nillable || (is_nillable(element) && !(with_union && is_choicetype(typeprefix, typeURI, type))))); fprintf(stream, elementformat, pname(nillable, !with_union, typeprefix, typeURI, type), aname(nameprefix, nameURI, name, &members)); } } else if (name && type) { if (substok && element.abstract) { fprintf(stream, "/// Abstract element \"%s\" of type %s.\n", name, type); gen_substitutions(URI, element, members); } else if (substok && element.substitutionsPtr() && !element.substitutionsPtr()->empty()) { if (vflag) fprintf(stderr, "\nWarning: element \"%s\" stands as the head of a substitutionGroup but is not declared abstract\n", name); gen_substitutions(URI, element, members); } else if (max && strcmp(max, "1")) // maxOccurs != "1" { const char *s; if (cflag && zflag != 1) s = tnameptr(true, NULL, URI, type); else if (Fflag || fflag) s = tnamenoptr(NULL, URI, type); else s = tnameptr(false, NULL, URI, type); if (cflag || sflag) { fprintf(stream, "/// Size of array of %s is %s..%s.\n", s, min ? min : "1", max); fprintf(stream, sizeformat, vname("$SIZE"), aname(NULL, NULL, name)); fprintf(stream, " %s", fake_union ? "0" : min ? min : "1"); if (is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); if (cflag && zflag != 1) { fprintf(stream, "/// Array %s of size %s..%s.\n", s, min ? min : "1", max); fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name, &members)); } else { fprintf(stream, "/// Pointer to array %s of size %s..%s.\n", s, min ? min : "1", max); fprintf(stream, pointerformat, s, aname(nameprefix, nameURI, name, &members)); } } else { fprintf(stream, "/// Vector of %s of length %s..%s.\n", s, min ? min : "1", max); if (with_union) fprintf(stream, pointertemplateformat, vname("$CONTAINER"), s, aname(nameprefix, nameURI, name, &members)); else fprintf(stream, templateformat, vname("$CONTAINER"), s, aname(nameprefix, nameURI, name, &members)); } nillable = false; } else { fprintf(stream, "/// Element \"%s\" of type %s.\n", name, type); nillable = (with_union && !is_choicetype(NULL, URI, type)) || ((fake_union || element.nillable || (is_nillable(element) && !(with_union && is_choicetype(NULL, URI, type))))); fprintf(stream, elementformat, pname(nillable, !with_union, NULL, URI, type), aname(nameprefix, nameURI, name, &members)); } } else if (name && element.simpleTypePtr()) { const char *s = ""; const char *r = NULL; document(element.simpleTypePtr()->annotation); if (max && strcmp(max, "1")) // maxOccurs != "1" { if (cflag || sflag) { fprintf(stream, "/// Size of %s array is %s..%s.\n", name, min ? min : "1", max); fprintf(stream, sizeformat, vname("$SIZE"), aname(NULL, NULL, name)); fprintf(stream, " %s", fake_union ? "0" : min ? min : "1"); if (is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); } else { if (with_union) s = ">*"; else s = ">"; fprintf(stream, "/// Vector of %s of length %s..%s.\n", name, min ? min : "1", max); fprintf(stream, templateformat_open, vname("$CONTAINER"), "\n"); } nillable = false; } else if (!cflag && !with_union && (r = vname("$POINTER")) && *r != '*' && *r != '$') { if (is_nillable(element) || fake_union) { s = ">"; fprintf(stream, templateformat_open, r, "\n"); } } gen(URI, name, *element.simpleTypePtr(), true, false); if (!with_union && s && s[0] == '>') // container or smart pointer, not in a union { fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name, &members)); } else if (is_nillable(element) || ((cflag || sflag) && max && strcmp(max, "1")) // maxOccurs != "1" || (with_union && !cflag) || fake_union) { fprintf(stream, pointerformat, s, aname(nameprefix, nameURI, name, &members)); } else { fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name, &members)); nillable = false; } } else if (name && element.complexTypePtr()) { const char *s = "}"; const char *r = NULL; document(element.complexTypePtr()->annotation); if (max && strcmp(max, "1")) // maxOccurs != "1" { if (cflag || sflag) { fprintf(stream, "/// Size of %s array is %s..%s.\n", name, min ? min : "1", max); fprintf(stream, sizeformat, vname("$SIZE"), aname(NULL, NULL, name)); fprintf(stream, " %s", fake_union ? "0" : min ? min : "1"); if (is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); } else { if (with_union) s = "}>*"; else s = "}>"; fprintf(stream, "/// Vector of %s of length %s..%s.\n", name, min ? min : "1", max); fprintf(stream, templateformat_open, vname("$CONTAINER"), "\n"); } nillable = false; } else if (!cflag && !with_union && (r = vname("$POINTER")) && *r != '*' && *r != '$') { if (is_nillable(element) || fake_union) { s = "}>"; fprintf(stream, templateformat_open, r, "\n"); } } gen(URI, name, *element.complexTypePtr(), true); if (!with_union && s && s[1] == '>') // container or smart pointer, not in a union { fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name, &members)); } else if (is_nillable(element) || ((cflag || sflag) && max && strcmp(max, "1")) // maxOccurs != "1" || (with_union && !cflag) || fake_union) { fprintf(stream, pointerformat, s, aname(nameprefix, nameURI, name, &members)); } else { fprintf(stream, elementformat, s, aname(nameprefix, nameURI, name, &members)); nillable = false; } } else if (element.ref) { fprintf(stream, "/// Imported element reference %s.\n", element.ref); if (max && strcmp(max, "1")) // maxOccurs != "1" { if (cflag || sflag) { fprintf(stream, "/// Size of %s array is %s..%s.\n", element.ref, min ? min : "1", max); fprintf(stream, sizeformat, vname("$SIZE"), aname(NULL, NULL, element.ref)); fprintf(stream, " %s", fake_union ? "0" : min ? min : "1"); if (is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); fprintf(stream, pointerformat, pname(true, true, "_", NULL, element.ref), aname(nameprefix, nameURI, element.ref, &members)); } else { fprintf(stream, "/// Vector of %s of length %s..%s.\n", element.ref, min ? min : "1", max); if (with_union) fprintf(stream, pointertemplateformat, vname("$CONTAINER"), tname("_", NULL, element.ref), aname(nameprefix, nameURI, element.ref, &members)); else fprintf(stream, templateformat, vname("$CONTAINER"), tname("_", NULL, element.ref), aname(nameprefix, nameURI, element.ref, &members)); } nillable = false; } else { nillable = (with_union && !cflag) || fake_union || is_nillable(element); fprintf(stream, elementformat, pname(nillable, !with_union, "_", NULL, element.ref), aname(nameprefix, nameURI, element.ref, &members)); } } else if (name) { fprintf(stream, "/// Element \"%s\" has no type or ref (empty or with literal XML content).\n", name ? name : ""); if (max && strcmp(max, "1")) // maxOccurs != "1" { if (cflag || sflag) { fprintf(stream, sizeformat, vname("$SIZE"), aname(NULL, NULL, name)); fprintf(stream, " %s", fake_union ? "0" : min ? min : "1"); if (is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); fprintf(stream, "/// Pointer to array of XML.\n"); fprintf(stream, pointerformat, "_XML", aname(NULL, nameURI, name, &members)); } else { fprintf(stream, "/// Vector of XML of length %s..%s.\n", min ? min : "1", max); if (with_union) fprintf(stream, pointertemplateformat, vname("$CONTAINER"), "_XML", aname(NULL, nameURI, name, &members)); else fprintf(stream, templateformat, vname("$CONTAINER"), "_XML", aname(NULL, nameURI, name, &members)); } nillable = false; } else { fprintf(stream, elementformat, "_XML", aname(NULL, nameURI, name, &members)); } } else { fprintf(stream, "/// Element has no name, type, or ref.\n"); } if (!substok || ( !(element.elementPtr() && element.elementPtr()->abstract) && !(element.substitutionsPtr() && !element.substitutionsPtr()->empty()) && !(element.elementPtr() && element.elementPtr()->substitutionsPtr() && !element.elementPtr()->substitutionsPtr()->empty()) )) { if (!with_union && !fake_union && nillable && (!min || !strcmp(min, "1")) && (!max || !strcmp(max, "1"))) fprintf(stream, " nullptr"); if (!with_union && !fake_union && !min) fprintf(stream, " 1"); else if (!with_union && !fake_union && min) fprintf(stream, " %s", min); if (!with_union && max && strcmp(max, "1") && is_integer(max)) fprintf(stream, ":%s", max); const char *s = "Required element"; if ((with_union || fake_union) && min && !strcmp(min, "0")) s = "Choice of optional element (one of multiple choices)"; else if (with_union || fake_union) s = "Choice of element (one of multiple choices)"; else if (nillable && (!min || !strcmp(min, "1")) && (!max || !strcmp(max, "1"))) s = "Required nillable (xsi:nil when NULL) element"; else if (min && !strcmp(min, "0") && (!max || !strcmp(max, "1"))) s = "Optional element"; else if (max && !strcmp(max, "0")) s = "Prohibited element"; else if (max && strcmp(max, "1")) s = "Multiple elements"; if (default_) { if ((!min || !strcmp(min, "0") || !strcmp(min, "1")) && (!max || !strcmp(max, "0") || !strcmp(max, "1"))) // min/maxOccurs <= "0" gendefault(typeURI ? typeURI : URI, type, name, element.simpleTypePtr(), default_, default__, "="); fprintf(stream, ";\t///< %s with default value=\"%s\".\n", s, default_); } else if (fixed) { if ((!min || !strcmp(min, "0") || !strcmp(min, "1")) && (!max || !strcmp(max, "0") || !strcmp(max, "1"))) // min/maxOccurs <= "0" gendefault(typeURI ? typeURI : URI, type, name, element.simpleTypePtr(), fixed, fixed_, "=="); fprintf(stream, ";\t///< %s with fixed value=\"%s\".\n", s, fixed); } else { fprintf(stream, ";\t///< %s.\n", s); } } } void Types::gen(const char *URI, const std::vector& groups, SetOfString& members) { for (std::vector::const_iterator group = groups.begin(); group != groups.end(); ++group) gen(URI, *group, NULL, NULL, members); } void Types::gen(const char *URI, const xs__group& group, const char *minOccurs, const char *maxOccurs, SetOfString& members) { static std::set visited; const char *min = minOccurs; const char *max = maxOccurs; if (visited.find(&group) != visited.end()) { if (group.ref) fprintf(stderr, "\nWarning: circular group \n", group.ref); else fprintf(stderr, "\nWarning: circular group \n", group.name ? group.name : ""); fprintf(stream, "/// @todo !FIXME! @warning %s defines a group with a circular reference.\n", group.ref ? group.ref : group.name ? group.name : ""); return; } visited.insert(&group); if (group.minOccurs) min = group.minOccurs; if (group.maxOccurs) max = group.maxOccurs; if (group.groupPtr()) { gen(URI, *group.groupPtr(), min, max, members); } else { fprintf(stream, "// BEGIN GROUP \n"); document(group.annotation); if (group.all) gen(URI, *group.all, min, max, members); else if (group.choice) gen(URI, NULL, *group.choice, min, max, members); else if (group.sequence) gen(URI, *group.sequence, min, max, members); fprintf(stream, "// END OF GROUP\n"); } visited.erase(&group); } void Types::gen(const char *URI, const char *name, const xs__seqchoice& choice, const char *minOccurs, const char *maxOccurs, SetOfString& members) { const char *r = NULL, *s = NULL, *t = NULL; const char *min = minOccurs; const char *max = maxOccurs; bool use_union = !uflag; bool wrap_union = false; bool tmp_union; int tmp_xflag = xflag; if (!URI && choice.schemaPtr()) URI = choice.schemaPtr()->targetNamespace; fprintf(stream, "// BEGIN CHOICE \n"); document(choice.annotation); for (std::vector::const_iterator c1 = choice.__contents.begin(); c1 != choice.__contents.end(); ++c1) { if (use_union && ((*c1).__union == SOAP_UNION_xs__union_content_group || (*c1).__union == SOAP_UNION_xs__union_content_sequence)) { if (!Lflag) fprintf(stream, "/// @note with embedded or prevents the use of a union for . Instead of being members of a union, the following members are declared optional. Only one sequence of members should be non-NULL by choice.\n"); use_union = false; break; } if (!xflag && !use_union && max && strcmp(max, "1") && (*c1).__union == SOAP_UNION_xs__union_content_any) { if (!Lflag) fprintf(stream, "/// @note with maxOccurs>1 and an embedded requires the use of a union for whereas option -u is currently enabled: locally enabling option -x to remove for this .\n"); xflag = true; } } if (use_union && (cflag || sflag)) { for (std::vector::const_iterator c2 = choice.__contents.begin(); c2 != choice.__contents.end(); ++c2) { if ((*c2).__union == SOAP_UNION_xs__union_content_element && (*c2).__content.element && (*c2).__content.element->maxOccurs && strcmp((*c2).__content.element->maxOccurs, "1")) { if (!Lflag) fprintf(stream, "/// @note with one ore more elements with maxOccurs>1 prevents the use of a union. Instead of being members of a union, the following members are declared optional. Only one member should be non-NULL by choice.\n"); use_union = false; break; } } } t = uname(URI); s = strstr(t, "__union"); #if 0 // Alternative name for choice selector (old style): r = aname(NULL, NULL, name); #else if (s) r = s + 7; if (!r || !*r) { if (strncmp(t, "union", 5) == 0) { r = t + 5; s = r; } else { r = t; s = t; } } #endif if (max && strcmp(max, "1")) { if (!cflag && !sflag && (!zflag || zflag > 7)) { // Use a container instead of __size fprintf(stream, templateformat_open, vname("$CONTAINER"), "\n"); } else { if (with_union) { // Generate a wrapper when we need a union within a union wrap_union = true; fprintf(stream, " struct __%s\n {\n", t); } fprintf(stream, sizeformat, vname("$SIZE"), r); fprintf(stream, " %s", min ? min : "0"); if (is_integer(max)) fprintf(stream, ":%s", max); fprintf(stream, ";\n"); } if (cflag) fprintf(stream, " struct _%s\n {\n", t); else fprintf(stream, " class _%s\n {\n", t); } if (use_union) { if (!with_union || wrap_union) { fprintf(stream, choiceformat, "int", r); if (min) fprintf(stream, " %s", min); fprintf(stream, ";\t///< Union %s selector: set to SOAP_UNION_%s_%s\n", t, t, min && !strcmp(min, "0") ? " or 0 to omit" : ""); if (name) fprintf(stream, "/// Union for choice in %s.\n", cname(NULL, URI, name)); fprintf(stream, " union %s\n {\n", t); } tmp_union = with_union; with_union = true; } else { tmp_union = fake_union; fake_union = true; } if (with_union || wrap_union || (max && strcmp(max, "1"))) { SetOfString members1; gen(URI, choice.__contents, members1); } else { gen(URI, choice.__contents, members); } if (use_union) { with_union = tmp_union; if (!with_union || wrap_union) { fprintf(stream, elementformat, "}", s[0] == '_' && s[1] == '_' ? s+2 : s); fprintf(stream, ";\n"); } } else { fake_union = tmp_union; } if (max && strcmp(max, "1")) { if (!cflag && !sflag && (!zflag || zflag > 7)) { // Use a container instead of __size fprintf(stream, with_union ? pointerformat : elementformat, "}>", s); fprintf(stream, " %s", min ? min : "0"); if (is_integer(max)) fprintf(stream, ":%s", max); } else { fprintf(stream, pointerformat, "}", s); } fprintf(stream, ";\n"); } if (wrap_union) { fprintf(stream, elementformat, "}", s); fprintf(stream, ";\n"); } xflag = tmp_xflag; fprintf(stream, "// END OF CHOICE\n"); } void Types::gen(const char *URI, const std::vector& anys) { for (std::vector::const_iterator any = anys.begin(); any != anys.end(); ++any) gen(URI, *any, NULL, NULL); } void Types::gen(const char *URI, const xs__any& any, const char *minOccurs, const char *maxOccurs) { const char *min = minOccurs; const char *max = maxOccurs; (void)URI; if (any.minOccurs) min = any.minOccurs; if (any.maxOccurs) max = any.maxOccurs; fprintf(stream, "/// \n"); if (!Lflag) fprintf(stream, "/// @note Schema extensibility is user-definable.\n/// Consult the protocol documentation to change or insert declarations.\n/// Use wsdl2h option -x to remove this element.\n/// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element):\n/// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap.\n"); if (!xflag) { if (max && strcmp(max, "1")) { fprintf(stream, "/// Size of the array of XML or DOM nodes is %s..%s.\n", min ? min : "1", max); if (cflag || sflag) { if (!with_union) { fprintf(stream, sizeformat, vname("$SIZE"), ""); fprintf(stream, "0;\n"); fprintf(stream, pointerformat, tname(NULL, NULL, "xs:any"), "__any"); } else { fprintf(stream, elementformat, tname(NULL, NULL, "xs:any"), "__any"); } } else if (with_union) fprintf(stream, pointertemplateformat, vname("$CONTAINER"), tname(NULL, NULL, "xs:any"), "__any"); else fprintf(stream, templateformat, vname("$CONTAINER"), tname(NULL, NULL, "xs:any"), "__any"); } else { fprintf(stream, elementformat, pname(with_union, false, NULL, NULL, "xs:any"), "__any"); } if (dflag) fprintf(stream, "0;\t///< Store any element content in DOM soap_dom_element node.\n"); else fprintf(stream, "0;\t///< Store any element content in XML string.\n"); } } void Types::gen(const char *URI, const xs__anyAttribute& anyAttribute) { (void)URI; if (anyAttribute.namespace_) fprintf(stream, "/// .\n", anyAttribute.namespace_); if (!Lflag) fprintf(stream, "/// @note Schema extensibility is user-definable.\n/// Consult the protocol documentation to change or insert declarations.\n/// Use wsdl2h option -x to remove this attribute.\n/// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute).\n"); if (!xflag) { const char *t = tname(NULL, NULL, "xs:anyAttribute"); fprintf(stream, attributeformat, t, "__anyAttribute"); if (dflag) fprintf(stream, ";\t///< Store anyAttribute content in DOM soap_dom_attribute linked node structure.\n"); else fprintf(stream, ";\t///< A placeholder that has no effect: please see comment.\n"); } } void Types::gen_inh(const char *URI, const xs__complexType *complexType, bool anonymous) { const xs__complexType *p = complexType; if (!p) return; const char *pURI; if (p->schemaPtr()) pURI = p->schemaPtr()->targetNamespace; else pURI = URI; const char *b = p->name ? cname(NULL, pURI, p->name) : NULL; if (p->simpleContent && p->simpleContent->restriction) gen_inh(URI, p->simpleContent->restriction->complexTypePtr(), anonymous); else if (p->simpleContent && p->simpleContent->extension) gen_inh(URI, p->simpleContent->extension->complexTypePtr(), anonymous); else if (p->complexContent && p->complexContent->extension) gen_inh(URI, p->complexContent->extension->complexTypePtr(), anonymous); if (b) { if (cflag || Fflag || fflag || anonymous) { fprintf(stream, "/// INHERITED FROM %s:\n", b); } else { if (comment_nest == 0) fprintf(stream, "/* INHERITED FROM %s:\n", b); else fprintf(stream, " INHERITED FROM %s:\n", b); comment_nest++; } } if (cflag || Fflag || fflag || anonymous) pURI = URI; // if base ns != derived ns then qualify elts and atts SetOfString members; if (p->simpleContent && p->simpleContent->restriction) { if (!p->simpleContent->restriction->complexTypePtr()) { const char *base = p->simpleContent->restriction->base; if (!base) base = "xs:string"; fprintf(stream, "/// __item wraps simpleContent of type %s.\n", base); fprintf(stream, elementformat, tname(NULL, pURI, base), "__item"); fprintf(stream, ";\n"); } } else if (p->simpleContent && p->simpleContent->extension) { if (!p->simpleContent->extension->complexTypePtr()) { const char *base = p->simpleContent->extension->base; if (!base) base = "xs:string"; fprintf(stream, "/// __item wraps simpleContent of type %s.\n", base); fprintf(stream, elementformat, tname(NULL, pURI, base), "__item"); fprintf(stream, ";\n"); } gen(pURI, p->simpleContent->extension->attribute, members); gen(pURI, p->simpleContent->extension->attributeGroup, members); if (p->simpleContent->extension->anyAttribute) gen(pURI, *p->simpleContent->extension->anyAttribute); } else if (p->complexContent && p->complexContent->extension) { if (p->complexContent->extension->group) gen(pURI, *p->complexContent->extension->group, NULL, NULL, members); if (p->complexContent->extension->all) gen(pURI, *p->complexContent->extension->all, NULL, NULL, members); if (p->complexContent->extension->sequence) gen(pURI, *p->complexContent->extension->sequence, NULL, NULL, members); if (p->complexContent->extension->choice) gen(pURI, p->name, *p->complexContent->extension->choice, NULL, NULL, members); gen(pURI, p->complexContent->extension->attribute, members); gen(pURI, p->complexContent->extension->attributeGroup, members); if (p->complexContent->extension->anyAttribute) gen(pURI, *p->complexContent->extension->anyAttribute); } else { if (p->all) gen(pURI, p->all->element, NULL, NULL, members); else if (p->all) gen(pURI, *p->all, NULL, NULL, members); else if (p->choice) gen(pURI, p->name, *p->choice, NULL, NULL, members); else if (p->sequence) gen(pURI, *p->sequence, NULL, NULL, members); else if (p->any) gen(pURI, *p->any, NULL, NULL); if (p->defaultAttributesApply && p->schemaPtr() && p->schemaPtr()->attributeGroupPtr()) { xs__attributeGroup *a = p->schemaPtr()->attributeGroupPtr(); if (a->attributeGroupPtr()) a = a->attributeGroupPtr(); gen(pURI, a->attribute, members); gen(pURI, a->attributeGroup, members); if (a->anyAttribute) gen(pURI, *a->anyAttribute); } gen(pURI, p->attribute, members); gen(pURI, p->attributeGroup, members); if (p->anyAttribute) gen(pURI, *p->anyAttribute); } if (b) { modify(b); if (cflag || Fflag || fflag || anonymous) { fprintf(stream, "// END OF INHERITED FROM %s\n", b); } else { comment_nest--; if (comment_nest == 0) fprintf(stream, " END OF INHERITED FROM %s */\n", b); else fprintf(stream, " END OF INHERITED FROM %s\n", b); } } } void Types::gen_soap_array(const char *t, const char *item, const char *type) { char *tmp = NULL, *dims = NULL, size[24]; if (type) tmp = (char*)estrdup(type); *size = '\0'; if (tmp) dims = strrchr(tmp, '['); if (dims) *dims++ = '\0'; fprintf(stream, "/// SOAP encoded array of values of type %s.\n", tmp ? tmp : "xs:anyType"); if (cflag) fprintf(stream, "struct %s\n{\n", t); else if (pflag && !Fflag && *t) fprintf(stream, "class %s : public xsd__anyType\n{ public:\n", t); else fprintf(stream, "class %s\n{ public:\n", t); if (dims) { char *s = strchr(dims, ']'); if (s && s != dims) (SOAP_SNPRINTF(size, 24, 23), "[%d]", (int)(s - dims + 1)); } if (tmp) { if (strchr(tmp, '[') != NULL) { size_t l = strlen(t); if (!strncmp(t, "ArrayOf", 7) && l > 7) gen_soap_array(t + 7, item, tmp); else if (!strncmp(t, "Array", 5) && l > 5) gen_soap_array(t + 5, item, tmp); else gen_soap_array("", item, tmp); fprintf(stream, arrayformat, "}", item ? aname(NULL, NULL, item) : ""); fprintf(stream, ";\n"); } else { const char *s = tname(NULL, NULL, tmp); fprintf(stream, "/// Pointer to dynamic array of elements <%s> of type %s.\n", item ? item : "item", s); fprintf(stream, arrayformat, s, item ? aname(NULL, NULL, item) : ""); fprintf(stream, ";\n"); } if (*size) fprintf(stream, "/// Size of the multidimensional dynamic array with dimensions=%s.\n", size); else fprintf(stream, "/// Size of the dynamic array.\n"); fprintf(stream, arraysizeformat, "int", size); fprintf(stream, ";\n/// Offset for partially transmitted arrays (uncomment only when required).\n"); fprintf(stream, arrayoffsetformat, "int", size); fprintf(stream, ";\n"); } else { // TODO: how to handle generic SOAP array? E.g. as an array of anyType? if (!Lflag) fprintf(stream, "// @note Add declarations to handle generic SOAP-ENC:Array (array of anyType)\n"); } } void Types::gen_substitutions(const char *URI, const xs__element& element, SetOfString& members) { const std::vector *substitutions; const char *name; const char *r = NULL, *s = NULL, *t = NULL; bool use_union = !uflag; bool wrap_union = false; bool tmp_union; bool abstract = false; if (!URI && element.schemaPtr()) URI = element.schemaPtr()->targetNamespace; if (element.elementPtr()) { name = element.elementPtr()->name; substitutions = element.elementPtr()->substitutionsPtr(); abstract = element.elementPtr()->abstract; if (!abstract && element.elementPtr()->complexTypePtr()) abstract = element.elementPtr()->complexTypePtr()->abstract; } else { name = element.name; substitutions = element.substitutionsPtr(); abstract = element.abstract; if (!abstract && element.complexTypePtr()) abstract = element.complexTypePtr()->abstract; } fprintf(stream, "// BEGIN SUBSTITUTIONS with choice of elements to substitute:\n// "); size_t len = 7; for (std::vector::const_iterator i1 = substitutions->begin(); i1 != substitutions->end(); ++i1) { size_t w = strlen((*i1)->name) + 3; len += w; if (len > 132) { fprintf(stream, "\n// "); len = 7 + w; } fprintf(stream, " <%s>", (*i1)->name); } fprintf(stream, "\n"); t = uname(URI); s = strstr(t, "__union"); r = aname(NULL, NULL, name); if (element.maxOccurs && strcmp(element.maxOccurs, "1")) { if (with_union) { // Generate a wrapper when we need a union within a union wrap_union = true; fprintf(stream, " struct __%s\n {\n", t); } fprintf(stream, sizeformat, vname("$SIZE"), r); fprintf(stream, " %s", element.minOccurs ? element.minOccurs : "0"); if (is_integer(element.maxOccurs)) fprintf(stream, ":%s", element.maxOccurs); fprintf(stream, ";\n"); if (cflag) fprintf(stream, " struct _%s\n {\n", t); else fprintf(stream, " class _%s\n {\n", t); } if (use_union) { if (!with_union || wrap_union) { fprintf(stream, choiceformat, "int", r); if (element.minOccurs) fprintf(stream, " %s", element.minOccurs); fprintf(stream, ";\t///< Union %s selector: set to SOAP_UNION_%s_%s\n", t, t, element.minOccurs && !strcmp(element.minOccurs, "0") ? " or 0 to omit" : ""); if (name) fprintf(stream, "/// Union for substitutionGroup %s.\n", cname(NULL, URI, name)); fprintf(stream, " union %s\n {\n", t); } tmp_union = with_union; with_union = true; } else { tmp_union = fake_union; fake_union = true; } if (!abstract) gen(URI, element, false, NULL, NULL, members); for (std::vector::const_iterator i2 = substitutions->begin(); i2 != substitutions->end(); ++i2) gen(URI, *(*i2), true, NULL, NULL, members); // substitutions can be recursive? if (use_union) { with_union = tmp_union; if (!with_union || wrap_union) { if (s) fprintf(stream, elementformat, "}", s[0] == '_' && s[1] == '_' ? s+2 : s); else fprintf(stream, elementformat, "}", t[0] == '_' ? t+1 : t); fprintf(stream, ";\n"); } } else fake_union = tmp_union; if (element.maxOccurs && strcmp(element.maxOccurs, "1")) { fprintf(stream, pointerformat, "}", s); fprintf(stream, ";\n"); } if (wrap_union) { fprintf(stream, elementformat, "}", s); fprintf(stream, ";\n"); } fprintf(stream, "// END OF SUBSTITUTIONS\n"); } void Types::document(const xs__annotation *annotation) { if (annotation) for (std::vector::const_iterator i = annotation->documentation.begin(); i != annotation->documentation.end(); ++i) documentation(*i); } void Types::modify(const char *name) { // TODO: consider support removal of elements/attributes with ns__X = $- Y const char *s = modtypemap[name]; if (s) { while (*s) { if (*s++ == '$') fprintf(stream, "/// Member declared in %s\n ", mapfile); s = format(s); } } } const char* Types::format(const char *text) { const char *s = text; if (!s) return NULL; while (*s && *s != '$') { if (*s == '\\') { switch (s[1]) { case 'n': fputc('\n', stream); break; case 't': fputc('\t', stream); break; default: fputc(s[1], stream); } s++; } else fputc(*s, stream); s++; } fputc('\n', stream); return s; } void Types::gendefault(const char *URI, const char *type, const char *name, xs__simpleType *p, const char *v, const char *q, const char *a) { if (!v) return; const char *t = NULL; if (!type && p) { if (!p->restriction) return; if (!p->restriction->enumeration.empty() && URI && name) { t = gname(URI, name); if (t) { v = enames[Pair(t, v)]; if (v) fprintf(stream, " %s %s", a, v); } return; } if (p->restriction->base) { if (p->restriction->simpleTypePtr() && p->restriction->simpleTypePtr()->schemaPtr()) URI = p->restriction->simpleTypePtr()->schemaPtr()->targetNamespace; t = cname(NULL, URI, p->restriction->base); } } else if (type) { t = cname(NULL, URI, type); } if (!t) return; switch (ctype(t)) { case CTNONE: if (comment_nest == 0) fprintf(stream, " /* @warning: cannot assign default/fixed value to this type */"); break; case CTBOOL: case CTINT: case CTUINT: case CTLONG: case CTULONG: case CTFLOAT: case CTDOUBLE: case CTLONGDOUBLE: fprintf(stream, " %s %s", a, v); break; case CTENUM: if ((v = enames[Pair(t, v)])) fprintf(stream, " %s %s", a, v); break; case CTSTRING: case CTWSTRING: fprintf(stream, " %s \"%s\"", a, cstring(v)); break; case CTQNAME: case CTWQNAME: fprintf(stream, " %s \"%s\"", a, cstring(q)); break; } } CType Types::ctype(const char *t) { MapOfStringToCType::const_iterator i = ctypemap.find(t); if (i != ctypemap.end()) return (*i).second; CType type = CTINT; const char *s = NULL; MapOfStringToString::const_iterator j = deftypemap.find(t); if (j != deftypemap.end()) { s = (*j).second; if (s && !strncmp(s, "typedef", 7) && isdelim(s[7])) s = nonblank(s + 7); } if (!s || !*s) { j = usetypemap.find(t); if (j != usetypemap.end()) s = (*j).second; if (!s) s = t; } if (!strncmp(s, "const", 5) && isdelim(s[5])) { s = nonblank(s + 5); } if (!strncmp(s, "signed", 6) && isdelim(s[6])) { s = nonblank(s + 6); } else if (!strncmp(s, "unsigned", 8) && isdelim(s[8])) { s = nonblank(s + 8); type = CTUINT; } if (!strncmp(s, "long", 4) && isdelim(s[4])) { s = nonblank(s + 4); if (type == CTUINT) type = CTULONG; else type = CTLONG; } else if (!strncmp(s, "short", 5) && isdelim(s[5])) { s = nonblank(s + 5); } if ((!strncmp(s, "char", 4) && isdelim(s[4]) && strchr(s, '*')) || (!strncmp(s, "_XML", 4) && isdelim(s[4])) || (!strncmp(s, "std::string", 11) && isdelim(s[11]))) { if (!strncmp(t, "xsd__QName", 10)) type = CTQNAME; else type = CTSTRING; } else if ((!strncmp(s, "wchar_t", 7) && isdelim(s[7]) && strchr(s, '*')) || (!strncmp(s, "std::wstring", 12) && isdelim(s[12]))) { if (!strncmp(t, "xsd__QName", 10)) type = CTWQNAME; else type = CTWSTRING; } else if (!strncmp(s, "float", 5) && isdelim(s[5])) { type = CTFLOAT; } else if (!strncmp(s, "double", 6) && isdelim(s[6])) { if (type == CTLONG) type = CTLONGDOUBLE; else type = CTDOUBLE; } else if (!strncmp(s, "bool", 4) && isdelim(s[4])) { type = CTBOOL; } else if (!strncmp(s, "enum", 4) && isdelim(s[4])) { type = CTENUM; } else if ((!strncmp(s, "char", 4) && isdelim(s[4])) || (!strncmp(s, "int", 3) && isdelim(s[3])) || (!strncmp(s, "int8_t", 6) && isdelim(s[6])) || (!strncmp(s, "int16_t", 7) && isdelim(s[7])) || (!strncmp(s, "int32_t", 7) && isdelim(s[7])) || (!strncmp(s, "short", 5) && isdelim(s[5]))) { } else if ((!strncmp(s, "uint8_t", 7) && isdelim(s[7])) || (!strncmp(s, "uint16_t", 8) && isdelim(s[8])) || (!strncmp(s, "uint32_t", 8) && isdelim(s[8])) || (!strncmp(s, "size_t", 6) && isdelim(s[6]))) { type = CTUINT; } else if ((!strncmp(s, "LONG64", 6) && isdelim(s[6])) || (!strncmp(s, "long", 4) && isdelim(s[4])) || (!strncmp(s, "int64_t", 7) && isdelim(s[7]))) { if (type == CTUINT) type = CTULONG; else type = CTLONG; } else if ((!strncmp(s, "ULONG64", 7) && isdelim(s[7])) || (!strncmp(s, "uint64_t", 8) && isdelim(s[8]))) { type = CTULONG; } else if (!strncmp(s, "_QName", 6) && isdelim(s[6])) { type = CTQNAME; } else { type = CTNONE; } ctypemap[t] = type; return type; } //////////////////////////////////////////////////////////////////////////////// // // Type map file parsing // //////////////////////////////////////////////////////////////////////////////// static char *getline(char *s, size_t n, FILE *fd) { int c; char *t = s; if (n) n--; for (;;) { c = fgetc(fd); if (c == '\r') continue; if (c == '\\') { c = fgetc(fd); if (c == '\r') c = fgetc(fd); if (c < ' ') continue; if (n) { *t++ = '\\'; n--; } } if (c == '\n' || c == EOF) break; if (n) { *t++ = c; n--; } } *t++ = '\0'; if (!*s && c == EOF) return NULL; return s; } static bool isdelim(int c) { return c == '\0' || c == EOF || !isalnum(c); } static const char *nonblank(const char *s) { while (*s && isspace(*s)) s++; return s; } static const char *fill(char *t, int n, const char *s, int e) { int i = n; s = nonblank(s); while (*s && *s != e && --i) *t++ = *s++; while (*s && *s != e) s++; if (*s) s++; i = n - i; if (i == 0) *t = '\0'; else { while (isspace(*--t) && i--) ; t[1] = '\0'; } return s; } //////////////////////////////////////////////////////////////////////////////// // // Miscellaneous // //////////////////////////////////////////////////////////////////////////////// static const char *utf8(char **t, const char *s, bool start) { unsigned int c = 0; unsigned int c1, c2, c3; const char *r = s; c = (unsigned char)*r++; if (c >= 0x80) { c1 = (unsigned char)*r++; if (c < 0xC0 || (c1 & 0xC0) != 0x80) r--; /* doesn't look like this is UTF-8, try continue as if ISO-8859-1 */ else { c1 &= 0x3F; if (c < 0xE0) c = ((c & 0x1F) << 6) | c1; else { c2 = (unsigned char)*r++; if ((c == 0xE0 && c1 < 0x20) || (c2 & 0xC0) != 0x80) r -= 2; /* doesn't look like this is UTF-8, try continue as if ISO-8859-1 */ else { c2 &= 0x3F; if (c < 0xF0) c = ((c & 0x0F) << 12) | (c1 << 6) | c2; else { c3 = (unsigned char)*r++; if ((c == 0xF0 && c1 < 0x10) || (c == 0xF4 && c1 >= 0x10) || c >= 0xF5 || (c3 & 0xC0) != 0x80) r -= 3; /* doesn't look like this is UTF-8, try continue as if ISO-8859-1 */ else c = ((c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | (c3 & 0x3F); } } } } } if (Uflag && // Universal character names for identifier characters // E.1 Ranges of characters allowed ( c == 0x00A8 || c == 0x00AA || c == 0x00AD || c == 0x00AF || (0x00B2 <= c && c <= 0x00B5) || (0x00B7 <= c && c <= 0x00BA) || (0x00BC <= c && c <= 0x00BE) || (0x00C0 <= c && c <= 0x00D6) || (0x00D8 <= c && c <= 0x00F6) || (0x00F8 <= c && c <= 0x00FF) || (0x0100 <= c && c <= 0x167F) || (0x1681 <= c && c <= 0x180D) || (0x180F <= c && c <= 0x1FFF) || (0x200B <= c && c <= 0x200D) || (0x202A <= c && c <= 0x202E) || (0x203F <= c && c <= 0x2040) || c == 0x2054 || (0x2060 <= c && c <= 0x206F) || (0x2070 <= c && c <= 0x218F) || (0x2460 <= c && c <= 0x24FF) || (0x2776 <= c && c <= 0x2793) || (0x2C00 <= c && c <= 0x2DFF) || (0x2E80 <= c && c <= 0x2FFF) || (0x3004 <= c && c <= 0x3007) || (0x3021 <= c && c <= 0x302F) || (0x3031 <= c && c <= 0x303F) || (0x3040 <= c && c <= 0xD7FF) || (0xF900 <= c && c <= 0xFD3D) || (0xFD40 <= c && c <= 0xFDCF) || (0xFDF0 <= c && c <= 0xFE44) || (0xFE47 <= c && c <= 0xFFFD) || (0x10000 <= c && c <= 0x1FFFD) || (0x20000 <= c && c <= 0x2FFFD) || (0x30000 <= c && c <= 0x3FFFD) || (0x40000 <= c && c <= 0x4FFFD) || (0x50000 <= c && c <= 0x5FFFD) || (0x60000 <= c && c <= 0x6FFFD) || (0x70000 <= c && c <= 0x7FFFD) || (0x80000 <= c && c <= 0x8FFFD) || (0x90000 <= c && c <= 0x9FFFD) || (0xA0000 <= c && c <= 0xAFFFD) || (0xB0000 <= c && c <= 0xBFFFD) || (0xC0000 <= c && c <= 0xCFFFD) || (0xD0000 <= c && c <= 0xDFFFD) || (0xE0000 <= c && c <= 0xEFFFD) ) && // E.2 Ranges of characters disallowed initially !(start && ( (0x0300 <= c && c <= 0x036F) || (0x1DC0 <= c && c <= 0x1DFF) || (0x20D0 <= c && c <= 0x20FF) || (0xFE20 <= c && c <= 0xFE2F) ) ) ) { soap_strncpy(*t, 7, s, r - s); *t += r - s; } else { // encode up to UCS2 only if (c > 0xFFFF) c = 0xFFFF; (SOAP_SNPRINTF(*t, 7, 6), "_x%4.4x", c); *t += 6; } return r; } static const char *cstring(const char *s) { size_t n; char *t; const char *r; for (n = 0, r = s; *r; n++, r++) if (*r == '"' || *r == '\\') n++; else if (*r < 32) n += 3; r = t = (char*)emalloc(n + 1); for (; *s; s++) { if (*s == '"' || *s == '\\') { *t++ = '\\'; *t++ = *s; } else if (*s == '\n') { soap_strcpy(t, 3, "\\n"); t += 2; } else if (*s < 32) { (SOAP_SNPRINTF(t, 5, 4), "\\%03o", (unsigned int)(unsigned char)*s); t += 4; } else *t++ = *s; } *t = '\0'; return r; } static const char *xstring(const char *s) { size_t n; char *t; const char *r; for (n = 0, r = s; *r; n++, r++) { if (*r < 32 || *r >= 127) n += 4; else if (*r == '<' || *r == '>') n += 3; else if (*r == '&') n += 4; else if (*r == '"') n += 5; else if (*r == '\\') n += 1; } r = t = (char*)emalloc(n + 1); for (; *s; s++) { if (*s < 32 || *s >= 127) { (SOAP_SNPRINTF(t, 6, 4), "&#%.2x;", (unsigned char)*s); t += 5; } else if (*s == '<') { soap_strcpy(t, 5, "<"); t += 4; } else if (*s == '>') { soap_strcpy(t, 5, ">"); t += 4; } else if (*s == '&') { soap_strcpy(t, 6, "&"); t += 5; } else if (*s == '"') { soap_strcpy(t, 7, """); t += 6; } else if (*s == '\\') { soap_strcpy(t, 3, "\\\\"); t += 2; } else *t++ = *s; } *t = '\0'; return r; } static bool is_float(const char *s) { if (*s == '-' || *s == '+') s++; if (!*s || strlen(s) > 20) return false; while (*s && isdigit(*s)) s++; if (*s == '.') s++; while (*s && isdigit(*s)) s++; if (*s == 'e' || *s == 'E') { s++; if (*s == '-' || *s == '+') s++; while (*s && isdigit(*s)) s++; } return *s == '\0'; } static bool is_integer(const char *s) { if (*s == '-' || *s == '+') s++; if (!*s || strlen(s) > 20) return false; while (*s && isdigit(*s)) s++; return *s == '\0'; } static LONG64 to_integer(const char *s) { char *r; return soap_strtoll(s, &r, 10); } static void documentation(const char *text) { const char *s = text; const char *sep = "///
\n/// "; if (!s) return; while (*s) { switch (*s) { case '\n': if (!sep) sep = "\n/// "; break; case '\t': case ' ': if (!sep) sep = " "; break; default: if (*s > 32) { if (sep) { fputs(sep, stream); sep = NULL; } fputc(*s, stream); } } s++; } fprintf(stream, "\n///
\n///\n"); } static void operations(const char *t) { if (!Lflag) { if (cflag) fprintf(stream, "/// @note struct %s operations:\n/// - %s* soap_new_%s(struct soap*, int num) allocate and default initialize one or more values (an array)\n/// - soap_default_%s(struct soap*, %s*) default initialize members\n/// - int soap_read_%s(struct soap*, %s*) deserialize from a source\n/// - int soap_write_%s(struct soap*, %s*) serialize to a sink\n/// - %s* soap_dup_%s(struct soap*, %s* dst, %s *src) returns deep copy of %s src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec)\n/// - soap_del_%s(%s*) deep deletes %s data members, use only on dst after soap_dup_%s(NULL, %s *dst, %s *src) (use soapcpp2 -Ed)\n", t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t); else fprintf(stream, "/// @note class %s operations:\n/// - %s* soap_new_%s(soap*) allocate and default initialize\n/// - %s* soap_new_%s(soap*, int num) allocate and default initialize an array\n/// - %s* soap_new_req_%s(soap*, ...) allocate, set required members\n/// - %s* soap_new_set_%s(soap*, ...) allocate, set all public members\n/// - %s::soap_default(soap*) default initialize members\n/// - int soap_read_%s(soap*, %s*) deserialize from a stream\n/// - int soap_write_%s(soap*, %s*) serialize to a stream\n/// - %s* %s::soap_dup(soap*) returns deep copy of %s, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec)\n/// - %s::soap_del() deep deletes %s data members, use only after %s::soap_dup(NULL) (use soapcpp2 -Ed)\n/// - int %s::soap_type() returns SOAP_TYPE_%s or derived type identifier\n", t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t); } } //////////////////////////////////////////////////////////////////////////////// // // Allocation // //////////////////////////////////////////////////////////////////////////////// void *emalloc(size_t size) { // we will not always make an attempt to release this heap memory // since the wsdl2h tool needs heap allocated data until it terminates void *p = malloc(size); if (!p) { fprintf(stderr, "\nError: Malloc failed\n"); exit(1); } return p; } char *estrdup(const char *s) { size_t l = strlen(s); char *t = (char*)emalloc(l + 1); soap_strcpy(t, l + 1, s); return t; } char *estrdupf(const char *s) { char *t = (char*)emalloc(strlen(s) + 1); char *p; for (p = t; *s; s++) { if (s[0] == '/' && s[1] == '*') { for (s += 2; s[0] && s[1]; s++) { if (s[0] == '*' && s[1] == '/') { s++; break; } } continue; } *p++ = *s; } *p = '\0'; return t; } gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/wadl.cpp0000644000175000017500000003660013525245163022413 0ustar ellertellert/* wadl.cpp WADL binding schema implementation -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "wsdlH.h" #include "includes.h" extern const char *qname_token(const char*, const char*); extern int is_builtin_qname(const char*); //////////////////////////////////////////////////////////////////////////////// // // wadl // //////////////////////////////////////////////////////////////////////////////// int wadl__application::preprocess(wsdl__definitions& definitions) { if (vflag) std::cerr << "Preprocessing wadl application" << std::endl; if (grammars) return grammars->preprocess(definitions); return SOAP_OK; } int wadl__application::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << "Analyzing wadl application" << std::endl; for (std::vector::iterator i1 = resources.begin(); i1 != resources.end(); ++i1) (*i1).traverse(definitions); for (std::vector::iterator i2 = resource_USCOREtype.begin(); i2 != resource_USCOREtype.end(); ++i2) (*i2).traverse(definitions); for (std::vector::iterator i3 = method.begin(); i3 != method.end(); ++i3) (*i3).traverse(definitions); for (std::vector::iterator i4 = representation.begin(); i4 != representation.end(); ++i4) (*i4).traverse(definitions); for (std::vector::iterator i5 = param.begin(); i5 != param.end(); ++i5) (*i5).traverse(definitions); return SOAP_OK; } void wadl__application::mark() { if (Oflag > 1) { for (std::vector::iterator i4 = representation.begin(); i4 != representation.end(); ++i4) (*i4).mark(); for (std::vector::iterator i5 = param.begin(); i5 != param.end(); ++i5) (*i5).mark(); } } int wadl__grammars::preprocess(wsdl__definitions& definitions) { if (vflag) std::cerr << "Preprocessing wadl:grammars" << std::endl; for (std::vector::iterator i = include.begin(); i != include.end(); ++i) (*i).preprocess(definitions); return SOAP_OK; } int wadl__include::preprocess(wsdl__definitions& definitions) { if (vflag) std::cerr << "Preprocessing wadl:include href='" << (href ? href : "") << "'" << std::endl; if (href) { wsdl__import import; import.soap_default(definitions.soap); import.location = href; definitions.import.push_back(import); } return SOAP_OK; } wadl__link::wadl__link() { linkRef = NULL; } int wadl__link::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing wadl:link resource_type '" << (resource_USCOREtype ? resource_USCOREtype : "") << "'" << std::endl; linkRef = NULL; if (resource_USCOREtype) { if (*resource_USCOREtype != '#') { if (!Wflag) std::cerr << "\nWarning: external link resource_type='" << resource_USCOREtype << "' found that is not supported" << std::endl; } else if (definitions.appPtr()) { for (std::vector::iterator i = definitions.appPtr()->resource_USCOREtype.begin(); i != definitions.appPtr()->resource_USCOREtype.end(); ++i) { if ((*i).id && !strcmp((*i).id, resource_USCOREtype + 1)) { linkRef = &*i; break; } } } if (!linkRef) if (!Wflag) std::cerr << "\nWarning: no wadl:resource_type with id '" << resource_USCOREtype << "' found" << std::endl; } return SOAP_OK; } void wadl__link::linkPtr(wadl__resource_USCOREtype *resource) { linkRef = resource; if (!linkRef && vflag) std::cerr << "\nWarning: wadl__link link set to NULL" << std::endl; } const wadl__resource_USCOREtype *wadl__link::linkPtr() const { return linkRef; } wadl__param::wadl__param() { paramRef = NULL; simpleTypeRef = NULL; complexTypeRef = NULL; } int wadl__param::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing wadl:param '" << (name ? name : "") << "' id '" << (id ? id : "") << "'" << std::endl; paramRef = NULL; simpleTypeRef = NULL; complexTypeRef = NULL; if (href) { if (*href != '#') { if (!Wflag) std::cerr << "\nWarning: external reference href='" << href << "' found that is not supported" << std::endl; } else if (definitions.appPtr()) { for (std::vector::iterator i = definitions.appPtr()->param.begin(); i != definitions.appPtr()->param.end(); ++i) { if ((*i).id && !strcmp((*i).id, href + 1)) { paramRef = &*i; break; } } } if (!paramRef) if (!Wflag) std::cerr << "\nWarning: no wadl:param with id '" << href << "' found" << std::endl; } else { if (definitions.types) { for (std::vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(type, (*schema)->targetNamespace); if (token) { for (std::vector::iterator st = (*schema)->simpleType.begin(); st != (*schema)->simpleType.end(); ++st) { if ((*st).name && !strcmp((*st).name, token)) { simpleTypeRef = &(*st); if (vflag) std::cerr << " Found wadl:param simpleType '" << (token ? token : "(null)") << "'" << std::endl; break; } } } token = qname_token(type, (*schema)->targetNamespace); if (token) { for (std::vector::iterator ct = (*schema)->complexType.begin(); ct != (*schema)->complexType.end(); ++ct) { if ((*ct).name && !strcmp((*ct).name, token)) { complexTypeRef = &(*ct); if (vflag) std::cerr << " Found wadl:param complexType '" << (token ? token : "(null)") << "'" << std::endl; break; } } } } } if (type && !simpleTypeRef && !complexTypeRef) { if (is_builtin_qname(type)) definitions.builtinType(type); else if (!Wflag) std::cerr << "\nWarning: no wadl:param type '" << type << "' found" << std::endl; } } if (link) link->traverse(definitions); return SOAP_OK; } void wadl__param::paramPtr(wadl__param *param) { paramRef = param; if (!paramRef && vflag) std::cerr << "\nWarning: wadl__param param set to NULL" << std::endl; } const wadl__param *wadl__param::paramPtr() const { return paramRef; } void wadl__param::simpleTypePtr(xs__simpleType *simpleType) { simpleTypeRef = simpleType; if (!simpleTypeRef && vflag) std::cerr << "\nWarning: wadl__param simpleType set to NULL" << std::endl; } xs__simpleType *wadl__param::simpleTypePtr() const { return simpleTypeRef; } void wadl__param::complexTypePtr(xs__complexType *complexType) { complexTypeRef = complexType; if (!complexTypeRef && vflag) std::cerr << "\nWarning: wadl__param complexType set to NULL" << std::endl; } xs__complexType *wadl__param::complexTypePtr() const { return complexTypeRef; } void wadl__param::mark() { if (Oflag > 1) { if (simpleTypePtr()) simpleTypePtr()->mark(); if (complexTypePtr()) complexTypePtr()->mark(); } } wadl__representation::wadl__representation() { representationRef = NULL; elementRef = NULL; } int wadl__representation::traverse(wsdl__definitions& definitions) { for (std::vector::iterator i = param.begin(); i != param.end(); ++i) (*i).traverse(definitions); if (vflag) std::cerr << " Analyzing wadl:representation id '" << (id ? id : "") << "'" << std::endl; elementRef = NULL; if (href) { if (*href != '#') { if (!Wflag) std::cerr << "\nWarning: external representation reference href='" << href << "' found that is not supported" << std::endl; } else if (definitions.appPtr()) { for (std::vector::iterator i = definitions.appPtr()->representation.begin(); i != definitions.appPtr()->representation.end(); ++i) { if ((*i).id && !strcmp((*i).id, href + 1)) { representationRef = &*i; break; } } } if (!representationRef) if (!Wflag) std::cerr << "\nWarning: no wadl:representation with id '" << href << "' found" << std::endl; } else { if (definitions.types) { for (std::vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(element, (*schema)->targetNamespace); if (token) { for (std::vector::iterator el = (*schema)->element.begin(); el != (*schema)->element.end(); ++el) { if ((*el).name && !strcmp((*el).name, token)) { elementRef = &(*el); if (vflag) std::cerr << " Found wadl:representation element '" << (token ? token : "(null)") << "'" << std::endl; break; } } } } } if (element && !elementRef) { if (is_builtin_qname(element)) definitions.builtinElement(element); else if (!Wflag) std::cerr << "\nWarning: no wadl:representation element '" << element << "'" << std::endl; } } return SOAP_OK; } void wadl__representation::representationPtr(wadl__representation *representation) { representationRef = representation; if (!representationRef && vflag) std::cerr << "\nWarning: wadl__representation representation set to NULL" << std::endl; } const wadl__representation *wadl__representation::representationPtr() const { return representationRef; } void wadl__representation::elementPtr(xs__element *element) { elementRef = element; if (!elementRef && vflag) std::cerr << "\nWarning: wadl__representation element set to NULL" << std::endl; } xs__element *wadl__representation::elementPtr() const { return elementRef; } void wadl__representation::mark() { if (Oflag > 1) { if (elementPtr()) elementPtr()->mark(); } } int wadl__request::traverse(wsdl__definitions& definitions) { for (std::vector::iterator i = param.begin(); i != param.end(); ++i) (*i).traverse(definitions); for (std::vector::iterator j = representation.begin(); j != representation.end(); ++j) (*j).traverse(definitions); return SOAP_OK; } void wadl__request::mark() { if (Oflag > 1) { for (std::vector::iterator i = param.begin(); i != param.end(); ++i) (*i).mark(); for (std::vector::iterator j = representation.begin(); j != representation.end(); ++j) (*j).mark(); } } wadl__method::wadl__method() { methodRef = NULL; } int wadl__method::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing wadl:method name '" << soap_wadl__HTTPMethods2s(definitions.soap, name) << "' id '" << (id ? id : "") << "'" << std::endl; if (request) request->traverse(definitions); for (std::vector::iterator i = response.begin(); i != response.end(); ++i) (*i).traverse(definitions); methodRef = NULL; if (href) { if (*href != '#') { if (!Wflag) std::cerr << "\nWarning: external method href='" << href << "' found that is not supported" << std::endl; } else if (definitions.appPtr()) { for (std::vector::iterator i = definitions.appPtr()->method.begin(); i != definitions.appPtr()->method.end(); ++i) { if ((*i).id && !strcmp((*i).id, href + 1)) { methodRef = &*i; break; } } } if (!methodRef) if (!Wflag) std::cerr << "\nWarning: no wadl:method with id '" << href << "' found" << std::endl; } return SOAP_OK; } void wadl__method::methodPtr(wadl__method *method) { methodRef = method; if (!methodRef && vflag) std::cerr << "\nWarning: wadl__method method set to NULL" << std::endl; } const wadl__method *wadl__method::methodPtr() const { return methodRef; } void wadl__method::mark() { if (Oflag > 1) { if (request) request->mark(); for (std::vector::iterator i = response.begin(); i != response.end(); ++i) (*i).mark(); } } int __wadl__method_resource_choice::traverse(wsdl__definitions& definitions) { if (method) method->traverse(definitions); if (resource) resource->traverse(definitions); return SOAP_OK; } int wadl__resource_USCOREtype::traverse(wsdl__definitions& definitions) { for (std::vector::iterator i = param.begin(); i != param.end(); ++i) (*i).traverse(definitions); for (std::vector<__wadl__method_resource_choice>::iterator j = __choice.begin(); j != __choice.end(); ++j) (*j).traverse(definitions); return SOAP_OK; } int wadl__resource::traverse(wsdl__definitions& definitions) { wadl__resource_USCOREtype::traverse(definitions); if (type) { const char *t = type; while (true) { const char *s = strchr(t, ' '); size_t n = s ? s - t : strlen(t); if (*t != '#') { if (!Wflag) std::cerr << "\nWarning: external resource in type='" << type << "' found that is not supported" << std::endl; } else if (definitions.appPtr()) { for (std::vector::iterator i = definitions.appPtr()->resource_USCOREtype.begin(); i != definitions.appPtr()->resource_USCOREtype.end(); ++i) { if ((*i).id && !strncmp((*i).id, t + 1, n)) { typeRefs.push_back(&*i); break; } } } if (!s) break; t = s + 1; } } return SOAP_OK; } void wadl__resource::typePtr(wadl__resource_USCOREtype *type) { if (type) typeRefs.push_back(type); } const std::vector& wadl__resource::typePtrs() const { return typeRefs; } int wadl__resources::traverse(wsdl__definitions& definitions) { for (std::vector::iterator i = resource.begin(); i != resource.end(); ++i) (*i).traverse(definitions); return SOAP_OK; } gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/Release/0000755000175000017500000000000013525245163022333 5ustar ellertellertgsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/types.h0000644000175000017500000001574213525245163022301 0ustar ellertellert/* types.h WSDL parser and converter to gSOAP header file format -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef TYPES_H #define TYPES_H #include "includes.h" #include "wsdlH.h" enum Type { NONE, CLASS, ENUM, STRUCT, TYPEDEF }; enum CType { CTNONE, CTBOOL, CTINT, CTUINT, CTLONG, CTULONG, CTFLOAT, CTDOUBLE, CTLONGDOUBLE, CTENUM, CTSTRING, CTWSTRING, CTQNAME, CTWQNAME }; typedef std::map MapOfStringToCType; enum Lookup { NOLOOKUP, LOOKUP }; class Types { public: SetOfString knames; // keywords, reserved words, class names, and typedefs MapOfStringToString modtypemap; MapOfStringToString deftypemap; MapOfStringToString usetypemap; MapOfStringToString ptrtypemap; MapOfStringToString smptypemap; MapOfStringToCType ctypemap; MapOfStringToString wnames; // name -> wrapper name MapOfPairToString qnames; // (URI,name) -> name MapOfStringToString uris; // URI -> prefix MapOfStringToNum syms; // prefix -> count (ns1, ns2, ...) SetOfString rnames; // reserved symbolic names to avoid clashes SetOfString onames; // service operator names MapOfPairToString enames; // enum symbolic names VectorOfString scope; // de-anonymizer stack int snum; // struct name index, TODO: consider map of URI to count per URI int unum; // union name index, TODO: consider map of URI to count per URI int gnum; // enum name index, TODO: consider map of URI to count per URI bool with_union; bool fake_union; size_t total; // total number of types size_t omitted; // number of -O removed types Types(); void init(); int read(const char *file); private: const char *fname(const char *prefix, const char *URI, const char *qname, SetOfString *reserved, enum Lookup lookup, bool isqname); public: const char *aname(const char *prefix, const char *URI, const char *qname, SetOfString *reserved = NULL); const char *wname(const char *prefix, const char *URI, const char *qname, enum Lookup lookup); const char *cname(const char *prefix, const char *URI, const char *qname); const char *tname(const char *prefix, const char *URI, const char *qname); const char *tnameptr(bool, const char *prefix, const char *URI, const char *qname); const char *tnamenoptr(const char *prefix, const char *URI, const char *qname); const char *pname(bool flag, bool smart, const char *prefix, const char *URI, const char *qname); const char *oname(const char *prefix, const char *URI, const char *qname); const char *ename(const char *type, const char *value, bool isqname); const char *sname(const char *URI, const char *name); const char *gname(const char *URI, const char *name); const char *uname(const char *URI); const char *vname(const char *var); const char *nsprefix(const char *prefix, const char *URI); const char *prefix(const char *name); const char *uri(const char *name); const char *deftname(enum Type type, bool mk_pointer, bool is_pointer, const char *prefix, const char *URI, const char *qname, const char *base); const char *defename(const char *type, const char *value, bool isqname); bool is_defined(const char *prefix, const char *URI, const char *qname); bool is_nillable(const xs__element& element); bool is_choicetype(const char *prefix, const char *URI, const char *type); bool is_ptr(const char *prefix, const char *URI, const char *type); void dump(FILE*); void define(const char *URI, const char *name, const xs__complexType&); void gen(const char *URI, const std::vector&, SetOfString&); void gen(const char *URI, const std::vector&, SetOfString&); void gen(const char *URI, const std::vector&, SetOfString&); void gen(const char *URI, const std::vector&, const char *minOccurs, const char *maxOccurs, SetOfString&); void gen(const char *URI, const std::vector&, SetOfString&); void gen(const char *URI, const std::vector&); void gen(const char *URI, const std::vector&, SetOfString&); void gen(const char *URI, const char *name, const xs__simpleType&, bool anonymous, bool nested_restriction); void gen(const char *URI, const char *name, const xs__complexType&, bool anonymous); void gen(const char *URI, const xs__attribute&, SetOfString&); void gen(const char *URI, const xs__all&, const char *minOccurs, const char *maxOccurs, SetOfString&); void gen(const char *URI, const xs__seqchoice&, const char *minOccurs, const char *maxOccurs, SetOfString&); void gen(const char *URI, const char *name, const xs__seqchoice&, const char *minOccurs, const char *maxOccurs, SetOfString&); void gen(const char *URI, const xs__element&, bool substok, const char *minOccurs, const char *maxOccurs, SetOfString&); void gen(const char *URI, const xs__group&, const char *minOccurs, const char *maxOccurs, SetOfString&); void gen(const char *URI, const xs__any&, const char *minOccurs, const char *maxOccurs); void gen(const char *URI, const xs__anyAttribute&); void gen_inh(const char *URI, const xs__complexType *complexType, bool anonymous); void gen_soap_array(const char *t, const char *item, const char *type); void gen_substitutions(const char *URI, const xs__element &element, SetOfString&); void document(const xs__annotation*); void modify(const char *name); const char *format(const char *text); void gendefault(const char *URI, const char *type, const char *name, xs__simpleType *p, const char *s, const char *q, const char *a); CType ctype(const char *s); }; #endif gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/wsam.h0000644000175000017500000000417213525245163022077 0ustar ellertellert/* wsam.h WS-Addressing and WS-Addressing Metadata -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap wsa schema documentation: WS-Addressing //gsoap wsa schema namespace: http://www.w3.org/2005/08/addressing //gsoap wsa schema elementForm: qualified //gsoap wsa schema attributeForm: unqualified //gsoap wsam schema documentation: WS-Addressing Metadata //gsoap wsam schema namespace: http://www.w3.org/2007/05/addressing/metadata //gsoap wsam schema elementForm: qualified //gsoap wsam schema attributeForm: unqualified //gsoap wsaw schema documentation: WS-Addressing WSDL //gsoap wsaw schema namespace: http://www.w3.org/2006/05/addressing/wsdl //gsoap wsaw schema elementForm: qualified //gsoap wsaw schema attributeForm: unqualified class wsa__EndpointReferenceType { public: xsd__anyURI Address; _XML __any; }; gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/wsu.h0000644000175000017500000000320113525245163021736 0ustar ellertellert/* wsu.h WS-Utility (namespace only) -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap wsu schema documentation: WS-Utility //gsoap wsu schema namespace: http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd //gsoap wsu schema elementForm: qualified //gsoap wsu schema attributeForm: unqualified gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/Debug/0000755000175000017500000000000013525245163022001 5ustar ellertellertgsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/soap.cpp0000644000175000017500000002243213525245163022424 0ustar ellertellert/* soap.cpp WSDL/SOAP binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "wsdlH.h" // cannot include "schemaH.h" #include "includes.h" extern const char *qname_token(const char*, const char*); extern int is_builtin_qname(const char*); //////////////////////////////////////////////////////////////////////////////// // // soap:header // //////////////////////////////////////////////////////////////////////////////// int soap__header::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing soap header in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << std::endl; messageRef = NULL; partRef = NULL; const char *token = qname_token(message, definitions.targetNamespace); if (token) { for (std::vector::iterator message = definitions.message.begin(); message != definitions.message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) std::cerr << " Found soap header part '" << (part?part:"") << "' message '" << (token?token:"") << "'" << std::endl; break; } } } if (!messageRef) { for (std::vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(message, importdefinitions->targetNamespace); if (token) { for (std::vector::iterator message = importdefinitions->message.begin(); message != importdefinitions->message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) std::cerr << " Found soap header part '" << (part?part:"") << "' message '" << (token?token:"") << "'" << std::endl; break; } } } } } } if (messageRef) { if (part) { for (std::vector::iterator pt = messageRef->part.begin(); pt != messageRef->part.end(); ++pt) if ((*pt).name && !strcmp((*pt).name, part)) { partRef = &(*pt); break; } } if (!partRef) std::cerr << "Warning: soap header has no matching part in message '" << (message?message:"") << "' in wsdl definitions '" << definitions.name << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << std::endl; } else std::cerr << "Warning: could not find soap header part '" << (part?part:"") << "' message '" << (message?message:"") << "' in wsdl definitions '" << definitions.name << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << std::endl; for (std::vector::iterator i = headerfault.begin(); i != headerfault.end(); ++i) (*i).traverse(definitions); return SOAP_OK; } void soap__header::messagePtr(wsdl__message *message) { messageRef = message; } wsdl__message *soap__header::messagePtr() const { return messageRef; } void soap__header::partPtr(wsdl__part *part) { partRef = part; } wsdl__part *soap__header::partPtr() const { return partRef; } //////////////////////////////////////////////////////////////////////////////// // // soap:headerfault // //////////////////////////////////////////////////////////////////////////////// int soap__headerfault::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing soap headerfault in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << std::endl; messageRef = NULL; partRef = NULL; const char *token = qname_token(message, definitions.targetNamespace); if (token) { for (std::vector::iterator message = definitions.message.begin(); message != definitions.message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) std::cerr << " Found soap headerfault part '" << (part?part:"") << "' message '" << (token?token:"") << "'" << std::endl; break; } } } else { for (std::vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(message, importdefinitions->targetNamespace); if (token) { for (std::vector::iterator message = importdefinitions->message.begin(); message != importdefinitions->message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) std::cerr << " Found soap headerfault part '" << (part?part:"") << "' message '" << (token?token:"") << "'" << std::endl; break; } } } } } } if (messageRef) { if (part) { for (std::vector::iterator pt = messageRef->part.begin(); pt != messageRef->part.end(); ++pt) if ((*pt).name && !strcmp((*pt).name, part)) { partRef = &(*pt); break; } } if (!partRef) std::cerr << "Warning: soap headerfault has no matching part in message '" << (message?message:"") << "' in wsdl definitions '" << definitions.name << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << std::endl; } else std::cerr << "Warning: could not find soap headerfault part '" << (part?part:"") << "' message '" << (message?message:"") << "' in wSDL definitions '" << definitions.name << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << std::endl; return SOAP_OK; } void soap__headerfault::messagePtr(wsdl__message *message) { messageRef = message; } wsdl__message *soap__headerfault::messagePtr() const { return messageRef; } void soap__headerfault::partPtr(wsdl__part *part) { partRef = part; } wsdl__part *soap__headerfault::partPtr() const { return partRef; } //////////////////////////////////////////////////////////////////////////////// // // wsoap:header // //////////////////////////////////////////////////////////////////////////////// int wsoap__header::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing soap header in wsdl namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << std::endl; elementRef = NULL; // WSDL 2.0 if (element) { if (definitions.types) { for (std::vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(element, (*schema)->targetNamespace); if (token) { for (std::vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if ((*element).name && !strcmp((*element).name, token)) { elementRef = &(*element); if (vflag) std::cerr << " Found soap header element '" << (token?token:"") << "'" << std::endl; break; } } } } } if (!elementRef) { if (is_builtin_qname(element)) definitions.builtinElement(element); else if (!Wflag) std::cerr << "Warning: no soap header element '" << element << "' in wsdl definitions '" << (definitions.name?definitions.name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << std::endl; } } return SOAP_OK; } void wsoap__header::elementPtr(xs__element *element) { elementRef = element; } xs__element *wsoap__header::elementPtr() const { return elementRef; } void wsoap__header::mark() { if (Oflag > 1) if (elementPtr()) elementPtr()->mark(); } gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/service.h0000644000175000017500000001140713525245163022567 0ustar ellertellert/* service.h Service structures -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2014, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef SERVICE_H #define SERVICE_H #include "includes.h" #include "wsdlH.h" class Message { public: wsdl__message *message; const char *name; const char *URI; soap__styleChoice style; soap__useChoice use; const char *encodingStyle; const char *action; const xs__element *element; const char *body_parts; wsdl__part *part; bool mustUnderstand; std::vector header; std::vector wheader; mime__multipartRelated *multipartRelated; // MIME mime__content *content; // REST/MIME const char *layout; // DIME const char *documentation; const char *ext_documentation; std::vector policy; void generate(Types&, const char *sep, bool anonymous, bool remark, bool response, bool optional, bool rest); }; typedef std::map MapOfStringToMessage; class Operation { public: const wsdl__operation *operation; const char *prefix; const char *URI; const char *name; const char *mep; // WSDL 2.0 bool is_rest; const char *protocol; soap__styleChoice style; const char *parameterOrder; const char *action; // SOAP action, REST HTTP location, or REST path /path const char *input_name; const char *output_name; Message *input; // name, use, and parts Message *output; // name, use, and parts std::vector infault; std::vector outfault; const char *documentation; const char *operation_documentation; std::vector policy; void generate(Types&, Service&); }; class Service { public: const char *prefix; // a gSOAP service has a unique namespace const char *URI; const char *name; // binding name const char *type; // portType const char *transport; // binding transport SetOfString location; // WSDL may specify multiple locations via -> std::vector operation; MapOfStringToMessage header; MapOfStringToMessage headerfault; MapOfStringToMessage fault; MapOfStringToString service_documentation; MapOfStringToString port_documentation; MapOfStringToString binding_documentation; std::vector policy; // WS-Policy std::vector role; // BPEL 2.0 VectorOfString imports; Service(); void generate(Types&); void add_import(const char*); void del_import(const char*); }; typedef std::map MapOfStringToService; class Definitions { public: Types types; // to process schema type information MapOfStringToService services; // service information gathered bool soap12; int binding_count; Definitions(); void collect(const wsdl__definitions&); void compile(const wsdl__definitions&); private: void analyze(const wsdl__definitions&); void analyze_headers(const wsdl__definitions&, Service*, wsdl__ext_ioput*, wsdl__ext_ioput*); void analyze_faults(const wsdl__definitions&, Service*, Operation*, std::vector::const_iterator&); Message *analyze_fault(const wsdl__definitions&, Service*, const wsdl__ext_fault&); void analyze_application(const wsdl__definitions&); void analyze_resource(const wsdl__definitions&, Service*, const wadl__resource_USCOREtype*, const char*, const char*, const char*); void generate(); }; #endif gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/bpel.cpp0000644000175000017500000003506013525245163022405 0ustar ellertellert/* bpel.cpp BPEL 2.0 binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2014, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "wsdlH.h" #include "includes.h" extern const char *qname_token(const char*, const char*); extern int is_builtin_qname(const char*); //////////////////////////////////////////////////////////////////////////////// // // plnk:tRole // //////////////////////////////////////////////////////////////////////////////// plnk__tRole::plnk__tRole() { portTypeRef = NULL; } wsdl__portType *plnk__tRole::portTypePtr() const { return portTypeRef; } int plnk__tRole::traverse(wsdl__definitions& definitions) { const char *token; if (vflag) std::cerr << " Analyzing BPEL Partner Link tRole" << std::endl; portTypeRef = NULL; token = qname_token(portType, definitions.targetNamespace); if (token) { for (std::vector::iterator portType = definitions.portType.begin(); portType != definitions.portType.end(); ++portType) { if ((*portType).name && !strcmp((*portType).name, token)) { portTypeRef = &(*portType); if (vflag) std::cerr << " Found tRole '" << (name?name:"") << "' portType '" << (token?token:"") << "'" << std::endl; break; } } // WSDL 2.0 for (std::vector::iterator i = definitions.interface_.begin(); i != definitions.interface_.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { portTypeRef = &(*i); if (vflag) std::cerr << " Found tRole '" << (name?name:"") << "' interface '" << (token?token:"") << "'" << std::endl; break; } } } if (!portTypeRef) { for (std::vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(portType, importdefinitions->targetNamespace); if (token) { for (std::vector::iterator portType = importdefinitions->portType.begin(); portType != importdefinitions->portType.end(); ++portType) { if ((*portType).name && !strcmp((*portType).name, token)) { portTypeRef = &(*portType); if (vflag) std::cerr << " Found tRole '" << (name?name:"") << "' portType '" << (token?token:"") << "'" << std::endl; break; } } // WSDL 2.0 for (std::vector::iterator i = importdefinitions->interface_.begin(); i != importdefinitions->interface_.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { portTypeRef = &(*i); if (vflag) std::cerr << " Found tRole '" << (name?name:"") << "' interface '" << (token?token:"") << "'" << std::endl; break; } } } } } } if (!portTypeRef) { if (!Wflag) std::cerr << "Warning: no tRole '" << (name?name:"") << "' portType '" << (portType?portType:"") << "' in wsdl definitions '" << (definitions.name?definitions.name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << std::endl; } return SOAP_OK; } void plnk__tRole::plnkPtr(plnk__tPartnerLinkType *plnk) { plnkRef = plnk; } plnk__tPartnerLinkType* plnk__tRole::plnkPtr() const { return plnkRef; } //////////////////////////////////////////////////////////////////////////////// // // plnk:tPartnerLinkType // //////////////////////////////////////////////////////////////////////////////// int plnk__tPartnerLinkType::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing BPEL Partner Link Type" << std::endl; for (std::vector::iterator i = role.begin(); i != role.end(); ++i) { (*i).plnkPtr(this); (*i).traverse(definitions); } return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // vprop:property // //////////////////////////////////////////////////////////////////////////////// int vprop__tProperty::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing BPEL Variable Properties" << std::endl; if (element && definitions.types) { for (std::vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(element, (*schema)->targetNamespace); if (token) { for (std::vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if ((*element).name && !strcmp((*element).name, token)) { type = (*element).type; if (vflag) std::cerr << " Found property '" << (name?name:"") << "' element '" << (token?token:"") << "'" << std::endl; break; } } } } } if (element && !type) { if (is_builtin_qname(element)) definitions.builtinElement(element); else if (!Wflag) std::cerr << "Warning: no BPEL Variable Properties '" << (name?name:"") << "' element '" << element << "' in wsdl definitions '" << (definitions.name?definitions.name:"") << "' namespace '" << (definitions.targetNamespace?definitions.targetNamespace:"") << "'" << std::endl; } else if (type) { if (is_builtin_qname(type)) definitions.builtinType(type); } return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // vprop:tPropertyAlias // //////////////////////////////////////////////////////////////////////////////// int vprop__tPropertyAlias::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing BPEL Variable Property Alias" << std::endl; vpropRef = NULL; for (std::vector::iterator vprop = definitions.vprop__property.begin(); vprop != definitions.vprop__property.end(); ++vprop) { const char *token = qname_token(propertyName, definitions.targetNamespace); if (token && !strcmp((*vprop).name, token)) { vpropRef = &(*vprop); if (vflag) std::cerr << " Found property alias '" << (propertyName?propertyName:"") << "' variable" << std::endl; break; } } if (!vpropRef) { for (std::vector::iterator import = definitions.import.begin(); !vpropRef && import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { for (std::vector::iterator vprop = importdefinitions->vprop__property.begin(); vprop != importdefinitions->vprop__property.end(); ++vprop) { const char *token = qname_token(propertyName, importdefinitions->targetNamespace); if (token && !strcmp((*vprop).name, token)) { vpropRef = &(*vprop); if (vflag) std::cerr << " Found property alias '" << (propertyName?propertyName:"") << "' variable" << std::endl; break; } } } } } xs__complexType *complexTypeRef = NULL; if (element && definitions.types) { for (std::vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(element, (*schema)->targetNamespace); if (token) { for (std::vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if ((*element).name && !strcmp((*element).name, token)) { if ((*element).type) type = (*element).type; else complexTypeRef = (*element).complexType; if (vflag) std::cerr << " Found property alias '" << (propertyName?propertyName:"") << "' element '" << (token?token:"") << "'" << std::endl; break; } } } } } else if (messageType && part) { wsdl__message *messageRef = NULL; const char *token = qname_token(messageType, definitions.targetNamespace); if (token) { for (std::vector::iterator message = definitions.message.begin(); message != definitions.message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) std::cerr << " Found property alias '" << (propertyName?propertyName:"") << "' message '" << (token?token:"") << "'" << std::endl; break; } } } if (!messageRef) { for (std::vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(messageType, importdefinitions->targetNamespace); if (token) { for (std::vector::iterator message = importdefinitions->message.begin(); message != importdefinitions->message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) std::cerr << " Found property alias '" << (propertyName?propertyName:"") << "' message '" << (token?token:"") << "'" << std::endl; break; } } } } } } if (messageRef) { for (std::vector::iterator parti = messageRef->part.begin(); parti != messageRef->part.end(); ++parti) { if ((*parti).name && !strcmp(part, (*parti).name)) { if ((*parti).element && definitions.types) { for (std::vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { if ((*parti).type) type = (*parti).type; else { token = qname_token((*parti).element, (*schema)->targetNamespace); if (token) { for (std::vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if ((*element).name && !strcmp((*element).name, token)) { if ((*element).type) type = (*element).type; else complexTypeRef = (*element).complexType; if (vflag) std::cerr << " Found property alias '" << (propertyName?propertyName:"") << "' element '" << (token?token:"") << "'" << std::endl; break; } } } } } } } } } } if (type && !complexTypeRef && definitions.types) { for (std::vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(type, (*schema)->targetNamespace); if (token) { for (std::vector::iterator complexType = (*schema)->complexType.begin(); complexType != (*schema)->complexType.end(); ++complexType) { if ((*complexType).name && !strcmp((*complexType).name, token)) { complexTypeRef = &(*complexType); break; } } } } } if (query && query->__mixed && complexTypeRef) { // TODO query is an XPath expression, most often just the name of an element const char *tag = strchr(query->__mixed, ':'); if (tag) ++tag; else tag = query->__mixed; if (complexTypeRef->all) { for (std::vector::iterator element = complexTypeRef->all->element.begin(); element != complexTypeRef->all->element.end(); ++element) { if ((*element).name && !strcmp((*element).name, tag)) { // element = (*element).name; type = (*element).type; break; } } } else if (complexTypeRef->sequence) { for (std::vector::iterator content = complexTypeRef->sequence->__contents.begin(); content != complexTypeRef->sequence->__contents.end(); ++content) { if ((*content).__union == SOAP_UNION_xs__union_content_element && (*content).__content.element && (*content).__content.element->name && !strcmp((*content).__content.element->name, tag)) { element = (*content).__content.element->name; type = (*content).__content.element->type; break; } } } } if (element && !type) { if (is_builtin_qname(element)) definitions.builtinElement(element); } else if (type) { if (is_builtin_qname(type)) definitions.builtinType(type); } return SOAP_OK; } vprop__tProperty *vprop__tPropertyAlias::vpropPtr() const { return vpropRef; } gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/mime.cpp0000644000175000017500000000470013525245163022407 0ustar ellertellert/* mime.cpp WSDL/MIME binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "wsdlH.h" // cannot include "schemaH.h" #include "includes.h" extern const char *qname_token(const char*, const char*); //////////////////////////////////////////////////////////////////////////////// // // mime:multipartRelated // //////////////////////////////////////////////////////////////////////////////// int mime__multipartRelated::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << "Analyzing mime multpartRelated " << std::endl; for (std::vector::iterator pt = part.begin(); pt != part.end(); ++pt) (*pt).traverse(definitions); return SOAP_OK; } //////////////////////////////////////////////////////////////////////////////// // // mime:part // //////////////////////////////////////////////////////////////////////////////// int mime__part::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << "Analyzing mime part " << std::endl; for (std::vector::iterator hd = soap__header_.begin(); hd != soap__header_.end(); ++hd) (*hd).traverse(definitions); return SOAP_OK; } gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/mime.h0000644000175000017500000000431613525245163022057 0ustar ellertellert/* mime.h mime and xmime binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap mime schema documentation: WSDL/MIME binding schema //gsoap mime schema namespace: http://schemas.xmlsoap.org/wsdl/mime/ //gsoap mime schema elementForm: qualified //gsoap mime schema attributeForm: unqualified //gsoap xmime schema documentation: xmime binding schema //gsoap xmime schema namespace: http://www.w3.org/2005/05/xmlmime #import "imports.h" #import "soap.h" class mime__content { public: @xsd__NMTOKEN part; @xsd__string type; }; class mime__part { public: soap__body *soap__body_; std::vector soap__header_; std::vector content; public: int traverse(wsdl__definitions&); }; class mime__multipartRelated { public: std::vector part; public: int traverse(wsdl__definitions&); }; class mime__mimeXml { public: @xsd__NMTOKEN part; }; gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/wsdl2h.cpp0000644000175000017500000006107713525245163022675 0ustar ellertellert/* wsdl2h.cpp WSDL/WADL/XSD parser and translator to the gSOAP header file format -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2019, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "includes.h" #include "types.h" #include "service.h" #ifndef WSDL2H_IMPORT_PATH #define WSDL2H_IMPORT_PATH (NULL) #endif #ifndef WSDL_TYPEMAP_FILE #define WSDL_TYPEMAP_FILE "typemap.dat" #endif static void init(); static void options(int argc, char **argv); int _flag = 0, aflag = 0, bflag = 0, cflag = 0, c11flag = 0, Dflag = 0, dflag = 0, eflag = 0, Fflag = 0, fflag = 0, gflag = 0, iflag = 0, jflag = 0, kflag = 0, Lflag = 0, Mflag = 0, mflag = 0, Oflag = 0, Owflag = 0, Pflag = 0, pflag = 0, Qflag = 0, Rflag = 0, sflag = 0, Uflag = 0, uflag = 0, vflag = 0, Wflag = 0, wflag = 0, Xflag = 0, xflag = 0, yflag = 0, zflag = 0; int openfiles = 0; int infiles = 0; char *infile[MAXINFILES], *outfile = NULL, *proxy_host = NULL, *proxy_userid = NULL, *proxy_passwd = NULL, *auth_userid = NULL, *auth_passwd = NULL; const char *mapfile = WSDL_TYPEMAP_FILE, *import_path = WSDL2H_IMPORT_PATH, *cwd_path = NULL, *cppnamespace = NULL; int proxy_port = 8080; FILE *stream = stdout; SetOfString exturis; extern struct Namespace namespaces[]; const char *service_prefix = NULL; const char *schema_prefix = "ns"; const char *soap_context = "soap"; const char elementformat[] = " %-35s %-30s"; const char pointerformat[] = " %-35s *%-30s"; const char attributeformat[] = " @ %-35s %-30s"; const char templateformat[] = " %s<%-23s> %-30s"; const char pointertemplateformat[] = " %s<%-22s> *%-30s"; const char templateformat_open[] = " %s<%s"; const char attrtemplateformat_open[] = " @ %s<%s"; const char arrayformat[] = " %-35s *__ptr%-25s"; const char arraysizeformat[] = " %-35s __size%-24s"; const char arrayoffsetformat[] = "// %-35s __offset%-22s"; const char sizeformat[] = " $ %-35s __size%-24s"; const char choiceformat[] = " $ %-35s __union%-23s"; const char schemaformat[] = "//gsoap %-5s schema %s:\t%s\n"; const char serviceformat[] = "//gsoap %-4s service %s:\t%s %s\n"; const char paraformat[] = " %-35s%s%s%s"; const char anonformat[] = " %-35s%s_%s%s"; const char sizeparaformat[] = " $ %-35s __size%s%s"; const char pointertemplateparaformat[] = " %s<%-21s>*%s%s%s"; const char derivedformat[] = " [ %-35s *%-30s; ]"; const char copyrightnotice[] = "\n** The gSOAP WSDL/WADL/XSD processor for C and C++, wsdl2h release " WSDL2H_VERSION "\n** Copyright (C) 2000-2019 Robert van Engelen, Genivia Inc.\n** All Rights Reserved. This product is provided \"as is\", without any warranty.\n** The wsdl2h tool and its generated software are released under the GPL.\n** ----------------------------------------------------------------------------\n** A commercial use license is available from Genivia Inc., contact@genivia.com\n** ----------------------------------------------------------------------------\n\n"; const char licensenotice[] = "\ --------------------------------------------------------------------------------\n\ gSOAP XML Web services tools\n\ Copyright (C) 2000-2019, Robert van Engelen, Genivia Inc. All Rights Reserved.\n\ The wsdl2h tool and its generated software are released under the GPL.\n\ This software is released under the GPL with the additional exemption that\n\ compiling, linking, and/or using OpenSSL is allowed.\n\ --------------------------------------------------------------------------------\n\ GPL license.\n\ \n\ This program is free software; you can redistribute it and/or modify it under\n\ the terms of the GNU General Public License as published by the Free Software\n\ Foundation; either version 2 of the License, or (at your option) any later\n\ version.\n\ \n\ This program is distributed in the hope that it will be useful, but WITHOUT ANY\n\ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n\ PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\ \n\ You should have received a copy of the GNU General Public License along with\n\ this program; if not, write to the Free Software Foundation, Inc., 59 Temple\n\ Place, Suite 330, Boston, MA 02111-1307 USA\n\ \n\ Author contact information:\n\ engelen@genivia.com / engelen@acm.org\n\ \n\ This program is released under the GPL with the additional exemption that\n\ compiling, linking, and/or using OpenSSL is allowed.\n\ --------------------------------------------------------------------------------\n\ A commercial-use license is available from Genivia, Inc., contact@genivia.com\n\ --------------------------------------------------------------------------------\n"; int main(int argc, char **argv) { options(argc, argv); fprintf(stderr, "%s", copyrightnotice); if (!infiles) fprintf(stderr, "Reading from stdin...\n"); init(); if (cppnamespace) fprintf(stream, "namespace %s {\n", cppnamespace); Definitions def; wsdl__definitions definitions; definitions.read(infiles, infile); if (definitions.error()) { definitions.print_fault(); exit(1); } definitions.traverse(); if (Oflag > 1) definitions.mark(); def.compile(definitions); if (Oflag > 1) { if (def.types.omitted) { fprintf(stderr, "\nOptimization (-O%s%d) removed %zu definitions of unused schema components (%.1f%%)\n", Owflag ? "w" : "", Oflag, def.types.omitted, 100.0*def.types.omitted/def.types.total); if (pflag && !Owflag) fprintf(stderr, "\nWarning: option -O%d removes type definitions that may be used as derived types of base types in XML (which are indicated by xsi:type attributes). Use option -Ow%d instead of -O%d to retain all derived types of base types\n", Oflag, Oflag, Oflag); else if (Fflag && !Owflag) fprintf(stderr, "\nWarning: option -O%d removes type definitions that may be used as derived types of base types in XML (which are indicated by xsi:type attributes). Use option -Ow%d instead of -O%d to retain all derived types of base types\n", Oflag, Oflag, Oflag); } else { fprintf(stderr, "\nOptimization (-O%s%d) found no unused schema components to remove\n", Owflag ? "w" : "", Oflag); } } if (outfile) { fclose(stream); fprintf(stderr, "\nTo finalize code generation, execute:\n> soapcpp2 %s\n", outfile); if (!cflag) fprintf(stderr, "Or to generate C++ proxy and service classes:\n> soapcpp2 -j %s\n", outfile); fprintf(stderr, "\n"); } return 0; } //////////////////////////////////////////////////////////////////////////////// // // Initialization // //////////////////////////////////////////////////////////////////////////////// static void init() { struct Namespace *p = namespaces; if (p) { for (; p->id; p++) { if (p->in && *p->in) exturis.insert(p->in); if (p->ns && *p->ns) exturis.insert(p->ns); } } } //////////////////////////////////////////////////////////////////////////////// // // Parse command line options // //////////////////////////////////////////////////////////////////////////////// static void options(int argc, char **argv) { int i; infiles = 0; openfiles = 0; for (i = 1; i < argc; i++) { char *a = argv[i]; if (*a == '-' #ifdef WIN32 || *a == '/' #endif ) { int g = 1; while (g && *++a) { switch (*a) { case '_': _flag = 1; break; case 'a': aflag = 1; break; case 'b': bflag = 1; break; case 'c': if (a[1] == '+' && a[2] == '+') { a += 2; if (a[1] == '1' && a[2] == '1') { a += 2; c11flag = 1; } cflag = 0; } else { cflag = 1; if (cppnamespace) fprintf(stderr, "wsdl2h: Options -c and -q cannot be used together\n"); } break; case 'D': Dflag = 1; break; case 'd': dflag = 1; break; case 'e': eflag = 1; break; case 'F': Fflag = 1; break; case 'f': fflag = 1; break; case 'g': gflag = 1; break; case 'i': iflag = 1; break; case 'j': jflag = 1; break; case 'k': kflag = 1; break; case 'I': a++; g = 0; if (*a) import_path = a; else if (i < argc && argv[++i]) import_path = argv[i]; else fprintf(stderr, "wsdl2h: Option -I requires a path argument\n"); break; case 'L': Lflag = 1; break; case 'l': fprintf(stderr, "%s", licensenotice); exit(0); break; case 'm': mflag = 1; break; case 'M': Mflag = 1; break; case 'n': a++; g = 0; if (*a) schema_prefix = a; else if (i < argc && argv[++i]) schema_prefix = argv[i]; else fprintf(stderr, "wsdl2h: Option -n requires a prefix name argument\n"); break; case 'N': a++; g = 0; if (*a) service_prefix = a; else if (i < argc && argv[++i]) service_prefix = argv[i]; else fprintf(stderr, "wsdl2h: Option -N requires a prefix name argument\n"); break; case 'o': a++; if (outfile) fprintf(stderr, "wsdl2h: Option -o specified twice\n"); g = 0; if (*a) outfile = a; else if (i < argc && argv[++i]) outfile = argv[i]; else fprintf(stderr, "wsdl2h: Option -o requires an output file argument\n"); break; case 'O': a++; if (*a == 'w') { Owflag = 1; a++; } if (Oflag) fprintf(stderr, "wsdl2h: Option -O specified twice\n"); g = 0; if (*a) Oflag = soap_strtol(a, NULL, 10); else if (i < argc && argv[++i]) Oflag = soap_strtol(argv[i], NULL, 10); else fprintf(stderr, "wsdl2h: Option -O requires an argument number\n"); break; case 'p': pflag = 1; break; case 'P': Pflag = 1; break; case 'Q': Qflag = 1; break; case 'q': a++; g = 0; if (*a) cppnamespace = a; else if (i < argc && argv[++i]) cppnamespace = argv[i]; else fprintf(stderr, "wsdl2h: Option -q requires a C++ namespace name argument\n"); if (cflag) fprintf(stderr, "wsdl2h: Options -c and -q cannot be used together\n"); break; case 'r': a++; g = 0; if (*a) proxy_host = a; else if (i < argc && argv[++i]) proxy_host = argv[i]; else fprintf(stderr, "wsdl2h: Option -r requires proxy host:port:userid:passwd or :userid:passwd authentication argument\n"); if (proxy_host) { size_t l = strlen(proxy_host); char *s = (char*)emalloc(l + 1); soap_strcpy(s, l + 2, proxy_host); proxy_host = s; s = strchr(proxy_host, ':'); if (s) { *s = '\0'; if (*proxy_host) { proxy_port = soap_strtol(s + 1, &s, 10); if (s && *s == ':') { *s = '\0'; proxy_userid = s + 1; s = strchr(proxy_userid, ':'); if (s && *s == ':') { *s = '\0'; proxy_passwd = s + 1; } } } else { s = proxy_host; proxy_host = NULL; auth_userid = s + 1; s = strchr(auth_userid, ':'); if (s && *s == ':') { *s = '\0'; auth_passwd = s + 1; } } } } break; case 'R': Rflag = 1; break; case 's': sflag = 1; break; case 'S': a++; g = 0; if (*a) soap_context = a; else if (i < argc && argv[++i]) soap_context = argv[i]; else fprintf(stderr, "wsdl2h: Option -S requires a name argument\n"); break; case 't': a++; g = 0; if (*a) mapfile = a; else if (i < argc && argv[++i]) mapfile = argv[i]; else fprintf(stderr, "wsdl2h: Option -t requires a type map file argument\n"); break; case 'U': Uflag = 1; break; case 'u': uflag = 1; break; case 'V': printf("%s", WSDL2H_VERSION); exit(0); case 'v': vflag = 1; break; case 'w': wflag = 1; break; case 'W': Wflag = 1; break; case 'X': Xflag = 1; break; case 'x': xflag = 1; break; case 'y': yflag = 1; break; case 'z': { int z = zflag; a++; if (zflag) fprintf(stderr, "wsdl2h: Option -z specified twice\n"); g = 0; if (*a) z = soap_strtol(a, NULL, 10); else if (i < argc && argv[++i]) z = soap_strtol(argv[i], NULL, 10); else fprintf(stderr, "wsdl2h: Option -z requires an argument\n"); if (zflag == 0 || z < zflag) zflag = z; break; } case '?': case 'h': fprintf(stderr, "Usage: wsdl2h [-a] [-b] [-c|-c++|-c++11] [-D] [-d] [-e] [-F] [-f] [-g] [-h] [-I path] [-i] [-j] [-k] [-L] [-l] [-M] [-m] [-N name] [-n name] [-O1|-O2|-O3|-O4|-Ow2|-Ow3|-Ow4] [-P|-p] [-Q] [-q name] [-R] [-r proxyhost[:port[:uid:pwd]]] [-r:uid:pwd] [-Sname] [-s] [-T] [-t typemapfile] [-U] [-u] [-V] [-v] [-w] [-W] [-x] [-y] [-z#] [-_] [-o outfile.h] infile.wsdl infile.xsd http://www... ...\n\n"); fprintf(stderr, "\ -a generate indexed struct names for local elements with anonymous types\n\ -b bi-directional operations (duplex ops) added to serve one-way responses\n\ -c generate C source code\n\ -c++ generate C++ source code (default)\n\ -c++11 generate C++11 source code\n\ -D make attribute members with default/fixed values optional with pointers\n\ -d use DOM to populate xs:any, xs:anyType, and xs:anyAttribute\n\ -e don't qualify enum names\n\ -F add transient members to structs to simulate struct-type derivation in C\n\ -f generate flat C++ class hierarchy by removing inheritance\n\ -g generate global top-level element and attribute declarations\n\ -h display help info and exit\n\ -Ipath use path to locate WSDL and XSD files\n\ -i don't import (advanced option)\n\ -j don't generate SOAP_ENV__Header and SOAP_ENV__Detail definitions\n\ -k don't generate SOAP_ENV__Header mustUnderstand qualifiers\n\ -L generate less documentation by removing generic @note comments\n\ -l display license information\n\ -M suppress error \"must understand element with wsdl:required='true'\"\n\ -m use xsd.h module to import primitive types\n\ -Nname use name for service prefixes to produce a service for each binding\n\ -nname use name as the base namespace prefix instead of 'ns'\n\ -O1 optimize by omitting duplicate choice/sequence members\n\ -O2 optimize -O1 and omit unused schema types (unreachable from roots)\n\ -O3 optimize -O2 and omit unused schema root attributes\n\ -O4 optimize -O3 and omit unused schema root elements (use only with WSDLs)\n\ -Ow2 optimize -O2 while retaining all derived types of used base types\n\ -Ow3 optimize -O3 while retaining all derived types of used base types\n\ -Ow4 optimize -O4 while retaining all derived types of used base types\n\ -ofile output to file\n\ -P don't create polymorphic types inherited from xsd__anyType\n\ -p create polymorphic types inherited from base xsd__anyType\n\ -Q make xsd__anySimpleType equal to xsd__anyType to use as the base type\n\ -qname use name for the C++ namespace of all declarations\n\ -R generate REST operations for REST bindings specified in a WSDL\n\ -rhost[:port[:uid:pwd]]\n\ connect via proxy host, port, and proxy credentials uid and pwd\n\ -r:uid:pwd\n\ connect with authentication credentials uid and pwd\n\ -Sname use name instead of 'soap' for the C++ class members with soap contexts\n\ -s don't generate STL code (no std::string and no std::vector)\n\ -tfile use type map file instead of the default file typemap.dat\n\ -U allow UTF-8-encoded Unicode C/C++ identifiers when mapping XML tag names\n\ -u don't generate unions\n\ -V display the current version and exit\n\ -v verbose output\n\ -W suppress warnings\n\ -w always wrap response parameters in a response struct (<=1.1.4 behavior)\n\ -X don't qualify part names to disambiguate doc/lit wrapped patterns\n\ -x don't generate _XML any/anyAttribute extensibility elements\n\ -y generate typedef synonyms for structs and enums\n\ -z1 compatibility with 2.7.6e: generate pointer-based arrays\n\ -z2 compatibility with 2.7.7 to 2.7.15: qualify element/attribute references\n\ -z3 compatibility with 2.7.16 to 2.8.7: qualify element/attribute references\n\ -z4 compatibility up to 2.8.11: don't generate union structs in std::vector\n\ -z5 compatibility up to 2.8.15: don't include minor improvements\n\ -z6 compatibility up to 2.8.17: don't include minor improvements\n\ -z7 compatibility up to 2.8.59: don't generate std::vector of class of union\n\ -z8 compatibility up to 2.8.74: don't gen quals for doc/lit wrapped patterns\n\ -_ don't generate _USCORE (replace with Unicode code point _x005f)\n\ infile.wsdl infile.xsd http://www... list of input sources (if none reads stdin)\n\ \n"); exit(0); default: fprintf(stderr, "wsdl2h: Unknown option %s\n", a); exit(1); } } } else { infile[infiles++] = argv[i]; if (infiles >= MAXINFILES) { fprintf(stderr, "wsdl2h: too many files\n"); exit(1); } } } if (infiles) { if (!outfile) { if (strncmp(infile[0], "http://", 7) && strncmp(infile[0], "https://", 8)) { const char *s = strrchr(infile[0], '.'); if (s && (!soap_tag_cmp(s, ".wsdl") || !soap_tag_cmp(s, ".wadl") || !soap_tag_cmp(s, ".gwsdl") || !soap_tag_cmp(s, ".xsd"))) { outfile = estrdup(infile[0]); outfile[s - infile[0] + 1] = 'h'; outfile[s - infile[0] + 2] = '\0'; } else { size_t l = strlen(infile[0]); outfile = (char*)emalloc(l + 3); soap_strcpy(outfile, l + 3, infile[0]); soap_strcpy(outfile + l, 3, ".h"); } } } if (outfile) { stream = fopen(outfile, "w"); if (!stream) { fprintf(stderr, "Cannot write to %s\n", outfile); exit(1); } fprintf(stderr, "Saving %s\n\n", outfile); } } } //////////////////////////////////////////////////////////////////////////////// // // Namespaces // //////////////////////////////////////////////////////////////////////////////// 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", NULL, NULL}, {"xsd", "-", NULL, NULL}, // http://www.w3.org/2001/XMLSchema"}, // don't use this, it might conflict with xs {"xml", "http://www.w3.org/XML/1998/namespace", NULL, NULL}, {"xs", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL}, {"vc", "http://www.w3.org/2007/XMLSchema-versioning", NULL, NULL}, {"http", "http://schemas.xmlsoap.org/wsdl/http/", NULL, NULL}, {"soap", "http://schemas.xmlsoap.org/wsdl/soap/", "http://schemas.xmlsoap.org/wsdl/soap*/", NULL}, {"mime", "http://schemas.xmlsoap.org/wsdl/mime/", NULL, NULL}, {"xmime", "http://www.w3.org/2005/05/xmlmime", NULL, NULL}, {"dime", "http://schemas.xmlsoap.org/ws/2002/04/dime/wsdl/", "http://schemas.xmlsoap.org/ws/*/dime/wsdl/", NULL}, {"wadl", "http://wadl.dev.java.net/2009/02", NULL, NULL}, {"wsdl", "http://schemas.xmlsoap.org/wsdl/", "http://www.w3.org/ns/wsdl", NULL}, {"wsdli", "http://www.w3.org/ns/wsdl-instance", NULL, NULL}, {"wsdlx", "http://www.w3.org/ns/wsdl-extensions", NULL, NULL}, {"wsoap", "http://www.w3.org/ns/wsdl/soap", NULL, NULL}, {"whttp", "http://www.w3.org/ns/wsdl/http", NULL, NULL}, {"wrpc", "http://www.w3.org/ns/wsdl/rpc", NULL, NULL}, {"wsaw", "http://www.w3.org/2006/05/addressing/wsdl", NULL, NULL}, {"gwsdl", "http://www.gridforum.org/namespaces/2003/03/gridWSDLExtensions", NULL, NULL}, {"wsa_", "http://www.w3.org/2005/08/addressing", NULL, NULL}, {"wsam", "http://www.w3.org/2007/05/addressing/metadata", NULL, NULL}, {"wsrmp", "http://docs.oasis-open.org/ws-rx/wsrm/200702", "http://docs.oasis-open.org/ws-rx/wsrm/*", NULL}, {"wsrmp5", "http://schemas.xmlsoap.org/ws/2005/02/rm/policy", NULL, NULL}, {"sp", "http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702", "http://schemas.xmlsoap.org/ws/2005/07/securitypolicy", NULL}, {"wsp_", "http://www.w3.org/ns/ws-policy", "http://schemas.xmlsoap.org/ws/2004/09/policy", NULL}, {"wst_", "http://docs.oasis-open.org/ws-sx/ws-trust/200512", NULL, NULL}, {"wsu_", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", NULL, NULL}, {"plnk","http://docs.oasis-open.org/wsbpel/2.0/plnktype", NULL, NULL}, {"vprop","http://docs.oasis-open.org/wsbpel/2.0/varprop", NULL, NULL}, #ifdef WITH_BPEL {"bpel","http://docs.oasis-open.org/wsbpel/2.0/process/executable", NULL, NULL}, {"sref","http://docs.oasis-open.org/wsbpel/2.0/serviceref", NULL, NULL}, #endif {NULL, NULL, NULL, NULL} }; gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/wadl.h0000644000175000017500000002126313525245163022057 0ustar ellertellert/* wadl.h WADL schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap wadl schema documentation: WADL binding schema //gsoap wadl schema namespace: http://wadl.dev.java.net/2009/02 //gsoap wadl schema elementForm: qualified //gsoap wadl schema attributeForm: unqualified #import "imports.h" class wadl__resource; // forward declaration class wadl__resource_USCOREtype; // forward declaration typedef xsd__string wadl__statusCodeList; // list of unsigned ints enum wadl__HTTPMethods { GET, POST, PUT, HEAD, DELETE_ }; enum wadl__ParamStyle { plain, query, matrix, header, template_ }; class wadl__doc { public: @xsd__string title; @xsd__string xml__lang; _XML __mixed; }; class wadl__option { public: @xsd__string value; @xsd__string mediaType; std::vector doc; }; class wadl__link { public: @xsd__anyURI resource_USCOREtype; @xsd__token rel; @xsd__token rev; std::vector doc; private: wadl__resource_USCOREtype* linkRef; public: wadl__link(); int traverse(wsdl__definitions&); void linkPtr(wadl__resource_USCOREtype*); const wadl__resource_USCOREtype* linkPtr() const; }; class wadl__param { public: @xsd__anyURI href; @xsd__NMTOKEN name; @enum wadl__ParamStyle* style; @xsd__ID id; @xsd__QName type; @xsd__string default_; @bool required = false; @bool repeating = false; @xsd__string fixed; @xsd__string path; std::vector doc; std::vector option; wadl__link* link; private: wadl__param* paramRef; xs__simpleType* simpleTypeRef; xs__complexType* complexTypeRef; public: wadl__param(); int traverse(wsdl__definitions&); void paramPtr(wadl__param*); const wadl__param* paramPtr() const; void simpleTypePtr(xs__simpleType*); xs__simpleType* simpleTypePtr() const; void complexTypePtr(xs__complexType*); xs__complexType* complexTypePtr() const; void mark(); }; class wadl__include { public: @xsd__anyURI href; std::vector doc; public: int preprocess(wsdl__definitions&); }; class wadl__grammars { public: std::vector doc; std::vector include; public: int preprocess(wsdl__definitions&); }; class wadl__representation { public: @xsd__ID id; @xsd__QName element; @xsd__string mediaType; @xsd__anyURI href; @xsd__anyURI profile; std::vector doc; std::vector param; private: wadl__representation* representationRef; xs__element* elementRef; public: wadl__representation(); int traverse(wsdl__definitions&); void representationPtr(wadl__representation*); const wadl__representation* representationPtr() const; void elementPtr(xs__element*); xs__element* elementPtr() const; void mark(); }; class wadl__request { public: std::vector doc; std::vector param; std::vector representation; public: int traverse(wsdl__definitions&); void mark(); }; class wadl__response : public wadl__request { public: @wadl__statusCodeList status; }; class wadl__method { public: @xsd__ID id; @enum wadl__HTTPMethods name; @xsd__anyURI href; std::vector doc; wadl__request* request; std::vector response; private: wadl__method* methodRef; public: wadl__method(); int traverse(wsdl__definitions&); void methodPtr(wadl__method*); const wadl__method* methodPtr() const; void mark(); }; class __wadl__method_resource_choice { public: wadl__method* method; wadl__resource* resource; public: int traverse(wsdl__definitions&); }; class wadl__resource_USCOREtype { public: @xsd__ID id; std::vector doc; std::vector param; std::vector<__wadl__method_resource_choice> __choice; public: int traverse(wsdl__definitions&); }; class wadl__resource : public wadl__resource_USCOREtype { public: @xsd__anyURI type; @xsd__string queryType = "application/x-www-form-urlencoded"; @xsd__string path; private: std::vector typeRefs; public: int traverse(wsdl__definitions&); void typePtr(wadl__resource_USCOREtype*); const std::vector& typePtrs() const; }; class wadl__resources { public: @xsd__anyURI base; std::vector doc; std::vector resource; public: int traverse(wsdl__definitions&); }; class wadl__application { public: std::vector doc; wadl__grammars* grammars; std::vector resources; std::vector resource_USCOREtype; std::vector method; std::vector representation; std::vector param; struct soap* soap; public: int preprocess(wsdl__definitions&); int traverse(wsdl__definitions&); void mark(); }; gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/includes.h0000644000175000017500000001035613525245163022737 0ustar ellertellert/* includes.h Common project definitions -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2017, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #ifndef INCLUDES_H #define INCLUDES_H #include "stdsoap2.h" #ifdef WITH_OPENSSL #include "httpda.h" #endif #define WSDL2H_VERSION "2.8.91" #ifdef WIN32 # pragma warning(disable : 4996) #endif #include #include #include #include #include struct ltstr { bool operator()(const char *s1, const char *s2) const { return strcmp(s1, s2) < 0; } }; struct eqstr { const char *s; eqstr(const char *s) : s(s) { } bool operator()(const char *t) const { return strcmp(s, t) == 0; } }; typedef std::set SetOfString; typedef std::pair Pair; struct ltpair { bool operator()(Pair s1, Pair s2) const { int cmp = strcmp(s1.first, s2.first); if (cmp == 0) cmp = strcmp(s1.second, s2.second); return cmp < 0; } }; typedef std::map MapOfStringToString; typedef std::map MapOfPairToString; typedef std::map MapOfStringToNum; typedef std::vector VectorOfString; extern int _flag, aflag, bflag, cflag, c11flag, Dflag, dflag, eflag, Fflag, fflag, gflag, iflag, jflag, kflag, Lflag, Mflag, mflag, Oflag, Owflag, Pflag, pflag, Qflag, Rflag, sflag, sflag, Uflag, uflag, vflag, Wflag, wflag, Xflag, xflag, yflag, zflag; extern FILE *stream; extern SetOfString exturis; #define MAXINFILES (1000) extern int openfiles; extern int infiles; extern char *infile[MAXINFILES], *outfile, *proxy_host, *proxy_userid, *proxy_passwd, *auth_userid, *auth_passwd; extern const char *mapfile, *import_path, *cwd_path, *cppnamespace; extern int proxy_port; extern const char *service_prefix; extern const char *schema_prefix; extern const char *soap_context; extern const char elementformat[]; extern const char pointerformat[]; extern const char attributeformat[]; extern const char templateformat_open[]; extern const char attrtemplateformat_open[]; extern const char templateformat[]; extern const char pointertemplateformat[]; extern const char arrayformat[]; extern const char arraysizeformat[]; extern const char arrayoffsetformat[]; extern const char sizeformat[]; extern const char choiceformat[]; extern const char schemaformat[]; extern const char serviceformat[]; extern const char paraformat[]; extern const char anonformat[]; extern const char sizeparaformat[]; extern const char pointertemplateparaformat[]; extern const char derivedformat[]; extern const char copyrightnotice[]; extern const char licensenotice[]; extern void *emalloc(size_t size); extern char *estrdup(const char *s); extern char *estrdupf(const char *s); extern void text(const char*); class Types; class Message; class Operation; class Service; class Definitions; #endif gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/wsdl.cpp0000644000175000017500000023243613525245163022442 0ustar ellertellert/* wsdl.cpp WSDL 1.1 and WSDL 2.0 binding schema implementation -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2015, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "wsdlH.h" #include "includes.h" extern struct Namespace namespaces[]; const char *qname_token(const char *QName, const char *URI) { if (QName && QName[0] == '"' && QName[1] == '"' && QName[2] == ':') return QName + 3; if (QName && URI && *QName == '"') // QNames are stored in the format "URI":name, unless the URI is in the nsmap { size_t n = strlen(URI); if (!strncmp(QName + 1, URI, n) && QName[n + 1] == '"') return QName + n + 3; } return NULL; } int is_builtin_qname(const char *QName) { if (iflag) return 1; if (QName) { if (*QName == '#') // reserved QNames return 0; if (*QName != '"') return 1; // if the QName does not start with a ", it must be in the nsmap const char *s = strchr(QName + 1, '"'); if (s) { size_t n = s - QName - 1; for (SetOfString::const_iterator i = exturis.begin(); i != exturis.end(); ++i) if (strlen(*i) == n && !strncmp(QName + 1, *i, n)) return 1; // QName is in exturis } } return 0; } xsd__QName make_qname(xs__schema& schema, const char *name) { const char *URI = schema.targetNamespace ? schema.targetNamespace : ""; size_t n = strlen(URI) + strlen(name) + 3; char *s = (char*)soap_malloc(schema.soap, n + 1); (SOAP_SNPRINTF(s, n + 1, n), "\"%s\":%s", URI, name); return s; } //////////////////////////////////////////////////////////////////////////////// // // wsdl // //////////////////////////////////////////////////////////////////////////////// extern "C" { int warn_ignore(struct soap*, const char*); int show_ignore(struct soap*, const char*); } wsdl__definitions::wsdl__definitions() { soap = soap_new1(SOAP_XML_TREE | SOAP_C_UTFSTRING); #ifdef HTTPDA_H soap_register_plugin(soap, http_da); #endif #ifdef WITH_OPENSSL soap_ssl_client_context(soap, SOAP_SSL_NO_AUTHENTICATION | SOAP_SSLv3_TLSv1, NULL, NULL, NULL, NULL, NULL); #endif soap_set_namespaces(soap, namespaces); soap_default(soap); if (vflag) soap->fignore = show_ignore; else soap->fignore = warn_ignore; soap->encodingStyle = NULL; soap->proxy_host = proxy_host; soap->proxy_port = proxy_port; soap->proxy_userid = proxy_userid; soap->proxy_passwd = proxy_passwd; name = NULL; targetNamespace = soap_strdup(soap, ""); documentation = NULL; types = NULL; updated = false; location = NULL; redirs = 0; appRef = NULL; used = false; } wsdl__definitions::wsdl__definitions(struct soap *copy) { soap = soap_copy(copy); soap->socket = SOAP_INVALID_SOCKET; soap->recvfd = 0; soap->sendfd = 1; soap_strcpy(soap->host, sizeof(soap->host), copy->host); soap_default(soap); soap->fignore = warn_ignore; soap->encodingStyle = NULL; updated = false; location = NULL; redirs = 0; appRef = NULL; } wsdl__definitions::wsdl__definitions(struct soap *copy, const char *cwd, const char *loc, const char *relloc) { soap = soap_copy(copy); soap->socket = SOAP_INVALID_SOCKET; soap->recvfd = 0; soap->sendfd = 1; soap_strcpy(soap->host, sizeof(soap->host), copy->host); soap_default(soap); soap->fignore = warn_ignore; soap->encodingStyle = NULL; updated = false; location = NULL; redirs = 0; appRef = NULL; read(cwd, loc, relloc); } wsdl__definitions::~wsdl__definitions() { soap_destroy(soap); soap_end(soap); soap_done(soap); free(soap); } int wsdl__definitions::get(struct soap *soap) { (void)soap; return preprocess(); } int wsdl__definitions::read(int num, char **loc) { if (num <= 0) return read(NULL, NULL, NULL); if (num == 1) return read(NULL, loc[0], NULL); wsdl__import im; im.namespace_ = NULL; name = soap_strdup(soap, "WSDL"); targetNamespace = soap_strdup(soap, "");; for (int i = 0; i < num; i++) { im.location = loc[i]; import.push_back(im); } return preprocess(); } int wsdl__definitions::read(const char *cwd, const char *loc, const char *relloc) { const char *cwd_temp; if (!cwd) cwd = cwd_path; if (vflag) fprintf(stderr, "\nOpening WSDL/WADL or XSD '%s' relative to '%s'\n", loc ? loc : "(stdin)", cwd ? cwd : "./"); if (loc) { if (soap->recvfd > 2) { soap_end_recv(soap); close(soap->recvfd); soap->recvfd = -1; } else if (soap_valid_socket(soap->socket)) { soap_end_recv(soap); soap_closesock(soap); } #ifdef WITH_OPENSSL if (!strncmp(loc, "http://", 7) || !strncmp(loc, "https://", 8)) #else if (!strncmp(loc, "https://", 8)) { #ifdef WIN32 fprintf(stderr, "\nCannot connect to https site: SSL/TLS support not enabled in this version. Visit https://www.genivia.com/downloads.html to download the secure version of wsdl2h.exe that supports SSL/TLS to connect to https sites.\n"); #else fprintf(stderr, "\nCannot connect to https site: SSL/TLS support not enabled, please rebuild wsdl2h with SSL/TLS enabled using 'make secure' or download the WSDL/WADL and XSD files and rerun wsdl2h on these files directly by specifying the file names on the command line.\n"); #endif exit(1); } else if (!strncmp(loc, "http://", 7)) #endif { fprintf(stderr, "%*sConnecting to '%s' to retrieve WSDL/WADL or XSD...", 2*openfiles, "", loc); location = soap_strdup(soap, loc); if (soap_connect_command(soap, SOAP_GET, location, NULL)) { fprintf(stderr, "\n\nError: connection failed\n"); soap_print_fault(soap, stderr); exit(1); } fprintf(stderr, " connected, receiving...\n"); openfiles++; } else if (cwd && (!strncmp(cwd, "http://", 7) || !strncmp(cwd, "https://", 8))) { size_t l = strlen(cwd) + strlen(loc); location = (char*)soap_malloc(soap, l + 2); soap_strcpy(location, l + 2, cwd); char *s = strrchr(location, '/'); if (s) *s = '\0'; size_t n = strlen(location); soap_strcpy(location + n, l + 2 - n, "/"); ++n; soap_strcpy(location + n, l + 2 - n, loc); fprintf(stderr, "%*sConnecting to '%s' to retrieve '%s'...", 2*openfiles, "", location, loc); if (soap_connect_command(soap, SOAP_GET, location, NULL)) { fprintf(stderr, "\n\nError: failed to retrieve '%s'\n", loc); soap_print_fault(soap, stderr); exit(1); } fprintf(stderr, " connected, receiving...\n"); openfiles++; } else { if (!strncmp(loc, "file://", 7)) loc += 7; soap->recvfd = open(loc, O_RDONLY, 0); if (soap->recvfd < 0) { if (loc && cwd) { size_t l = strlen(cwd) + strlen(relloc); location = (char*)soap_malloc(soap, l + 2); soap_strcpy(location, l + 2, cwd); char *s = strrchr(location, '/'); #ifdef WIN32 if (!s) s = strrchr(location, '\\'); #endif if (s) { *s = '\0'; size_t n = strlen(location); soap_strcpy(location + n, l + 2 - n, "/"); ++n; soap_strcpy(location + n, l + 2 - n, relloc); if (!strncmp(location, "file://", 7)) location += 7; soap->recvfd = open(location, O_RDONLY, 0); if (vflag) std::cerr << "Opening file " << location << (soap->recvfd < 0 ? " failed" : " successful") << std::endl; } } if (soap->recvfd < 0 && import_path) { size_t l = strlen(import_path) + strlen(loc); location = (char*)soap_malloc(soap, l + 2); soap_strcpy(location, l + 2, import_path); size_t n = strlen(location); soap_strcpy(location + n, l + 2 - n, "/"); ++n; soap_strcpy(location + n, l + 2 - n, loc); if (!strncmp(location, "file://", 7)) location += 7; soap->recvfd = open(location, O_RDONLY, 0); if (vflag) std::cerr << "Opening file " << location << (soap->recvfd < 0 ? " failed" : " successful") << std::endl; } if (relloc && soap->recvfd < 0 && import_path) { size_t l = strlen(import_path) + strlen(relloc); location = (char*)soap_malloc(soap, l + 2); soap_strcpy(location, l + 2, import_path); size_t n = strlen(location); soap_strcpy(location + n, l + 2 - n, "/"); ++n; soap_strcpy(location + n, l + 2 - n, relloc); if (!strncmp(location, "file://", 7)) location += 7; soap->recvfd = open(location, O_RDONLY, 0); if (vflag) std::cerr << "Opening file " << location << (soap->recvfd < 0 ? " failed" : " successful") << std::endl; } if (soap->recvfd < 0) { fprintf(stderr, "\nCannot open '%s'\n", loc); exit(1); } } else { location = soap_strdup(soap, loc); } fprintf(stderr, "%*sReading '%s'...\n", 2*openfiles, "", location); openfiles++; } } cwd_temp = cwd_path; cwd_path = location; if (!soap_begin_recv(soap)) this->soap_in(soap, "wsdl:", NULL); if (soap->error) { // handle sloppy WSDLs that import schemas at the top level rather than // importing them in // handle WADL when used in place of WSDL if (soap->error == SOAP_TAG_MISMATCH && soap->level == 0) { soap_retry(soap); xs__schema *schema = soap_new_xs__schema(soap); schema->sourceLocation(location); schema->soap_in(soap, "xs:schema", NULL); if (soap->error == SOAP_TAG_MISMATCH && soap->level == 0) { soap_retry(soap); wadl__application *app = soap_new_wadl__application(soap); app->soap_in(soap, "wadl:application", NULL); if (soap->error) { fprintf(stderr, "\nAn error occurred while parsing WSDL/WADL or XSD from '%s'\n", loc ? loc : "(stdin)"); soap_print_fault(soap, stderr); if (soap->error < 200) soap_print_fault_location(soap, stderr); exit(1); } appRef = app; preprocess(); } else { if (soap->error) { fprintf(stderr, "\nAn error occurred while parsing WSDL/WADL or XSD from '%s'\n", loc ? loc : "(stdin)"); soap_print_fault(soap, stderr); if (soap->error < 200) soap_print_fault_location(soap, stderr); exit(1); } name = NULL; targetNamespace = schema->targetNamespace; if (vflag) std::cerr << "Found schema '" << (targetNamespace ? targetNamespace : "(null)") << "' when expecting WSDL" << std::endl; types = soap_new_wsdl__types(soap); types->documentation = NULL; types->xs__schema_.push_back(schema); types->preprocess(*this); } } // check HTTP redirect (socket was closed) else if ((soap->error >= 301 && soap->error <= 303) || soap->error == 307) { int r = SOAP_ERR; fprintf(stderr, "Redirected to '%s'...\n", soap->endpoint); if (redirs++ < 10) r = read(cwd, soap->endpoint, NULL); else fprintf(stderr, "\nMax redirects exceeded\n"); redirs--; return r; } else if (soap->error == 401) { int r = SOAP_ERR; fprintf(stderr, "Authenticating to '%s' realm '%s'...\n", loc, soap->authrealm); if (auth_userid && auth_passwd && redirs++ < 1) { #ifdef HTTPDA_H struct http_da_info info; http_da_save(soap, &info, soap->authrealm, auth_userid, auth_passwd); #else soap->userid = auth_userid; soap->passwd = auth_passwd; #endif r = read(cwd, loc, NULL); #ifdef HTTPDA_H http_da_release(soap, &info); #endif redirs--; } else { fprintf(stderr, "Authentication failed, use option -r:uid:pwd and (re)build with OpenSSL to enable digest authentication\n"); } return r; } else { fprintf(stderr, "\nAn error occurred while parsing WSDL/WADL and XSD from '%s'\n", loc ? loc : "(stdin)"); soap_print_fault(soap, stderr); if (soap->error < 200) soap_print_fault_location(soap, stderr); exit(1); } } openfiles--; fprintf(stderr, "%*sDone reading '%s'\n", 2*openfiles, "", loc ? loc : "(stdin)"); soap_end_recv(soap); if (soap->recvfd > 2) { close(soap->recvfd); soap->recvfd = -1; } else { soap_closesock(soap); } cwd_path = cwd_temp; return SOAP_OK; } int wsdl__definitions::preprocess() { if (vflag) std::cerr << "Preprocessing wsdl definitions '" << (location ? location : "(null)") << "' namespace '" << (targetNamespace ? targetNamespace : "(null)") << "'" << std::endl; // process WADL app if (appPtr()) appPtr()->preprocess(*this); // process import for (std::vector::iterator im1 = import.begin(); im1 != import.end(); ++im1) (*im1).preprocess(*this); // merge nested imported WSDLs into single import list again: for (std::vector::iterator im2 = import.begin(); im2 != import.end(); ++im2) { if ((*im2).definitionsPtr()) { for (std::vector::iterator i = (*im2).definitionsPtr()->import.begin(); i != (*im2).definitionsPtr()->import.end(); ++i) { if ((*i).definitionsPtr()) { bool found = false; if (vflag) std::cerr << "Import WSDL '" << ((*i).location ? (*i).location : "(null)") << std::endl; for (std::vector::iterator j = import.begin(); j != import.end(); ++j) { if ((*i).definitionsPtr() == (*j).definitionsPtr() || ((*i).location && (*j).location && !strcmp((*i).location, (*j).location))) { found = true; break; } } if (!found) { if (vflag) std::cerr << "Adding imported WSDL '" << ((*i).location ? (*i).location : "(null)") << "' to '" << (location ? location : "(null)") << "' ('" << (name ? name : "(null)") << "') namespace '" << (targetNamespace ? targetNamespace : "(null)") << "'" << std::endl; import.push_back(*i); goto again; } } } } } // merge for (std::vector::iterator im3 = import.begin(); im3 != import.end(); ++im3) { if ((*im3).definitionsPtr() && (*im3).definitionsPtr()->types) { if (!types) { types = soap_new_wsdl__types(soap); types->soap_default(soap); } // merge , check for duplicates, add namespaces for sloppy imports for (std::vector::const_iterator i = (*im3).definitionsPtr()->types->xs__schema_.begin(); i != (*im3).definitionsPtr()->types->xs__schema_.end(); ++i) { bool found = false; std::vector::const_iterator j; if (!(*i)->targetNamespace) { (*i)->targetNamespace = targetNamespace; if (!Wflag) std::cerr << "\nWarning: schema imported without namespace, assigning namespace '" << (targetNamespace ? targetNamespace : "(null)") << "'" << std::endl; } for (j = types->xs__schema_.begin(); j != types->xs__schema_.end(); ++j) { if ((*j)->targetNamespace && !strcmp((*i)->targetNamespace, (*j)->targetNamespace)) { found = true; break; } } // add new schema only if not already in , otherwise merge schema components if (found) { if (vflag) std::cerr << "\nSchemas with identical namespace '" << ((*i)->targetNamespace ? (*i)->targetNamespace : "(null)") << "' merged in WSDL '" << (name ? name : "(null)") << "' namespace '" << (targetNamespace ? targetNamespace : "(null)") << "'" << std::endl; (*j)->insert(*(*i)); } else { if (vflag) std::cerr << "Adding schema with namespace '" << ((*i)->targetNamespace ? (*i)->targetNamespace : "(null)") << "' to types in WSDL '" << (name ? name : "(null)") << "' namespace '" << (targetNamespace ? targetNamespace : "(null)") << "'" << std::endl; types->xs__schema_.push_back(*i); } } // make imported WSDL point to merged (*im3).definitionsPtr()->types = types; } } // process the types if (types) types->preprocess(*this); return SOAP_OK; } int wsdl__definitions::traverse() { if (updated) return SOAP_OK; if (vflag) std::cerr << "Analyzing definitions '" << (name ? name : "(null)") << "' in wsdl namespace '" << (targetNamespace ? targetNamespace : "(null)") << "'" << std::endl; updated = true; if (!targetNamespace) { if (vflag) std::cerr << "\nWarning: wsdl '" << (name ? name : "(null)") << "' has no targetNamespace" << std::endl; targetNamespace = soap_strdup(soap, ""); } // process import first for (std::vector::iterator im = import.begin(); im != import.end(); ++im) (*im).traverse(*this); // then process the types if (types) types->traverse(*this); // process WADL if (appRef) appRef->traverse(*this); // process messages before portType for (std::vector::iterator mg = message.begin(); mg != message.end(); ++mg) (*mg).traverse(*this); // process portType before binding for (std::vector::iterator pt = portType.begin(); pt != portType.end(); ++pt) (*pt).traverse(*this); // process interface before binding WSDL 2.0 for (std::vector::iterator in = interface_.begin(); in != interface_.end(); ++in) (*in).traverse(*this); // process binding for (std::vector::iterator bg = binding.begin(); bg != binding.end(); ++bg) (*bg).traverse(*this); // process service for (std::vector::iterator sv = service.begin(); sv != service.end(); ++sv) (*sv).traverse(*this); if (vflag) std::cerr << "End of definitions '" << (name ? name : "(null)") << "' namespace '" << (targetNamespace ? targetNamespace : "(null)") << "'" << std::endl; for (std::vector::iterator wsp = wsp__Policy_.begin(); wsp != wsp__Policy_.end(); ++wsp) (*wsp).traverse(*this); for (std::vector::iterator plt = plnk__partnerLinkType.begin(); plt != plnk__partnerLinkType.end(); ++plt) (*plt).traverse(*this); for (std::vector::iterator vp = vprop__property.begin(); vp != vprop__property.end(); ++vp) (*vp).traverse(*this); for (std::vector::iterator vpa = vprop__propertyAlias.begin(); vpa != vprop__propertyAlias.end(); ++vpa) (*vpa).traverse(*this); return SOAP_OK; } const char *wsdl__definitions::sourceLocation() { return location; } char *wsdl__definitions::absoluteLocation(const char *loc) const { const char *base = location ? location : cwd_path; if (!base) return soap_strdup(soap, loc); if (!strncmp(loc, "http://", 7) || !strncmp(loc, "https://", 8)) return soap_strdup(soap, loc); if (!strncmp(loc, "file://", 7)) loc += 7; const char *s = strrchr(base, '/'); #ifdef WIN32 const char *t = strrchr(base, '\\'); if (!s || s < t) s = t; if (!s) return soap_strdup(soap, loc); while ((!strncmp(loc, "../", 3) || !strncmp(loc, "..\\", 3)) && s > base) { while (--s >= base) { if (*s == '/' || *s == '\\') { if (s[1] != '.') break; if (s[2] == '.' && (s[3] == '/' || s[3] == '\\')) { s += 3; break; } } } loc += 3; } #else if (!s) return soap_strdup(soap, loc); while (!strncmp(loc, "../", 3) && s > base) { while (--s >= base) { if (*s == '/') { if (s[1] != '.') break; if (s[2] == '.' && s[3] == '/') { s += 3; break; } } } loc += 3; } #endif size_t n = s - base + 1; size_t l = n + strlen(loc); char *abs = (char*)soap_malloc(soap, l + 1); soap_strncpy(abs, l + 1, base, n); soap_strcpy(abs + n, l + 1 - n, loc); return abs; } int wsdl__definitions::error() { return soap->error; } bool wsdl__definitions::is_updated() { return updated; } void wsdl__definitions::print_fault() { soap_print_fault(soap, stderr); if (soap->error < 200) soap_print_fault_location(soap, stderr); } void wsdl__definitions::builtinType(const char *type) { builtinTypeSet.insert(type); } void wsdl__definitions::builtinTypeDerivation(xs__schema& schema, const char *base, const char *derived) { builtinTypeMap[make_qname(schema, derived)] = base; } void wsdl__definitions::builtinTypes(const SetOfString& types) { for (SetOfString::const_iterator tp = types.begin(); tp != types.end(); ++tp) builtinTypeSet.insert(*tp); } void wsdl__definitions::builtinTypeDerivations(const MapOfStringToString& derivations) { for (MapOfStringToString::const_iterator dp = derivations.begin(); dp != derivations.end(); ++dp) builtinTypeMap.insert(*dp); } void wsdl__definitions::builtinElement(const char *element) { builtinElementSet.insert(element); } void wsdl__definitions::builtinElements(const SetOfString& elements) { for (SetOfString::const_iterator el = elements.begin(); el != elements.end(); ++el) builtinElementSet.insert(*el); } void wsdl__definitions::builtinAttribute(const char *attribute) { builtinAttributeSet.insert(attribute); } void wsdl__definitions::builtinAttributes(const SetOfString& attributes) { for (SetOfString::const_iterator at = attributes.begin(); at != attributes.end(); ++at) builtinAttributeSet.insert(*at); } const SetOfString& wsdl__definitions::builtinTypes() const { return builtinTypeSet; } const MapOfStringToString& wsdl__definitions::builtinTypeDerivations() const { return builtinTypeMap; } const SetOfString& wsdl__definitions::builtinElements() const { return builtinElementSet; } const SetOfString& wsdl__definitions::builtinAttributes() const { return builtinAttributeSet; } void wsdl__definitions::appPtr(wadl__application *app) { appRef = app; } wadl__application *wsdl__definitions::appPtr() const { return appRef; } void wsdl__definitions::mark() { if (Oflag > 1 && !used) { used = true; for (std::vector::iterator im = import.begin(); im != import.end(); ++im) (*im).mark(); if (types) types->mark(); if (appRef) appRef->mark(); for (std::vector::iterator pt = interface_.begin(); pt != interface_.end(); ++pt) (*pt).mark(); for (std::vector::iterator mg = message.begin(); mg != message.end(); ++mg) (*mg).mark(); for (std::vector::iterator bg = binding.begin(); bg != binding.end(); ++bg) (*bg).mark(); } } int wsdl__service::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << "Analyzing service '" << (name ? name : "(null)") << "' in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; // process ports for (std::vector::iterator pt = port.begin(); pt != port.end(); ++pt) (*pt).traverse(definitions); for (std::vector::iterator ep = endpoint.begin(); ep != endpoint.end(); ++ep) (*ep).traverse(definitions); for (std::vector::iterator py = wsp__Policy_.begin(); py != wsp__Policy_.end(); ++py) (*py).traverse(definitions); for (std::vector::iterator pr = wsp__PolicyReference_.begin(); pr != wsp__PolicyReference_.end(); ++pr) (*pr).traverse(definitions); return SOAP_OK; } wsdl__port::wsdl__port() { bindingRef = NULL; } int wsdl__port::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing service port/endpoint in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; // search binding name const char *token = qname_token(binding, definitions.targetNamespace); bindingRef = NULL; if (token) { for (std::vector::iterator binding = definitions.binding.begin(); binding != definitions.binding.end(); ++binding) { if ((*binding).name && !strcmp((*binding).name, token)) { bindingRef = &(*binding); if (vflag) std::cerr << " Found port/endpoint '" << (name ? name : "(null)") << "' binding '" << (token ? token : "(null)") << "'" << std::endl; break; } } } if (!bindingRef) { for (std::vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(binding, importdefinitions->targetNamespace); if (token) { for (std::vector::iterator binding = importdefinitions->binding.begin(); binding != importdefinitions->binding.end(); ++binding) { if ((*binding).name && !strcmp((*binding).name, token)) { bindingRef = &(*binding); if (vflag) std::cerr << " Found port/endpoint '" << (name ? name : "(null)") << "' binding '" << (token ? token : "(null)") << "'" << std::endl; break; } } } } } } if (!bindingRef) if (!Wflag) std::cerr << "\nWarning: no port/endpoint '" << (name ? name : "(null)") << "' binding '" << (binding ? binding : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } void wsdl__port::bindingPtr(wsdl__binding *binding) { bindingRef = binding; if (!bindingRef && vflag) std::cerr << "\nWarning: wsdl__port binding set to NULL" << std::endl; } wsdl__binding *wsdl__port::bindingPtr() const { return bindingRef; } wsdl__binding::wsdl__binding() { portTypeRef = NULL; } int wsdl__binding::traverse(wsdl__definitions& definitions) { const char *token; if (vflag) std::cerr << " Analyzing binding '" << (name ? name : "(null)") << "' in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; portTypeRef = NULL; if (interface_) // WSDL 2.0 token = qname_token(interface_, definitions.targetNamespace); else token = qname_token(type, definitions.targetNamespace); if (token) { for (std::vector::iterator portType = definitions.portType.begin(); portType != definitions.portType.end(); ++portType) { if ((*portType).name && !strcmp((*portType).name, token)) { portTypeRef = &(*portType); if (vflag) std::cerr << " Found binding '" << (name ? name : "(null)") << "' portType '" << (token ? token : "(null)") << "'" << std::endl; break; } } // WSDL 2.0 for (std::vector::iterator i = definitions.interface_.begin(); i != definitions.interface_.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { portTypeRef = &(*i); if (vflag) std::cerr << " Found binding '" << (name ? name : "(null)") << "' interface '" << (token ? token : "(null)") << "'" << std::endl; break; } } } if (!portTypeRef) { for (std::vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { if (interface_) // WSDL 2.0 token = qname_token(interface_, importdefinitions->targetNamespace); else token = qname_token(type, importdefinitions->targetNamespace); if (token) { for (std::vector::iterator portType = importdefinitions->portType.begin(); portType != importdefinitions->portType.end(); ++portType) { if ((*portType).name && !strcmp((*portType).name, token)) { portTypeRef = &(*portType); if (vflag) std::cerr << " Found binding '" << (name ? name : "(null)") << "' portType '" << (token ? token : "(null)") << "'" << std::endl; break; } } // WSDL 2.0 for (std::vector::iterator i = importdefinitions->interface_.begin(); i != importdefinitions->interface_.end(); ++i) { if ((*i).name && !strcmp((*i).name, token)) { portTypeRef = &(*i); if (vflag) std::cerr << " Found binding '" << (name ? name : "(null)") << "' interface '" << (token ? token : "(null)") << "'" << std::endl; break; } } } } } } if (!portTypeRef) { if (!Wflag) { if (interface_) std::cerr << "\nWarning: no binding '" << (name ? name : "(null)") << "' interface '" << (interface_ ? interface_ : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; else std::cerr << "\nWarning: no binding '" << (name ? name : "(null)") << "' portType '" << (type ? type : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; } } // WSDL 2.0 for (std::vector::iterator f = fault.begin(); f != fault.end(); ++f) (*f).traverse(definitions, portTypeRef); for (std::vector::iterator i = operation.begin(); i != operation.end(); ++i) (*i).traverse(definitions, portTypeRef); for (std::vector::iterator p = wsp__Policy_.begin(); p != wsp__Policy_.end(); ++p) (*p).traverse(definitions); for (std::vector::iterator r = wsp__PolicyReference_.begin(); r != wsp__PolicyReference_.end(); ++r) (*r).traverse(definitions); return SOAP_OK; } void wsdl__binding::portTypePtr(wsdl__portType *portType) { portTypeRef = portType; if (!portTypeRef && vflag) std::cerr << "\nWarning: wsdl__binding portType set to NULL" << std::endl; } wsdl__portType *wsdl__binding::portTypePtr() const { return portTypeRef; } void wsdl__binding::mark() { if (Oflag > 1) for (std::vector::iterator i = operation.begin(); i != operation.end(); ++i) (*i).mark(); } wsdl__ext_operation::wsdl__ext_operation() { operationRef = NULL; } int wsdl__ext_operation::traverse(wsdl__definitions& definitions, wsdl__portType *portTypeRef) { if (vflag) std::cerr << " Analyzing binding operation '" << (name ? name : ref ? ref : "(null)") << "' in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; if (input) input->traverse(definitions); if (output) output->traverse(definitions); for (std::vector::iterator f = fault.begin(); f != fault.end(); ++f) (*f).traverse(definitions, portTypeRef); // WSDL 2.0 for (std::vector::iterator fi = infault.begin(); fi != infault.end(); ++fi) (*fi).traverse(definitions, portTypeRef); for (std::vector::iterator fo = outfault.begin(); fo != outfault.end(); ++fo) (*fo).traverse(definitions, portTypeRef); operationRef = NULL; if (portTypeRef) { // WSDL 2.0, assumption: ref refers to an operation in the interface for this binding const char *token = NULL; if (ref) token = qname_token(ref, portTypeRef->definitionsPtr()->targetNamespace); for (std::vector::iterator i = portTypeRef->operation.begin(); i != portTypeRef->operation.end(); ++i) { if (token) { if ((*i).name && !strcmp((*i).name, token)) { operationRef = &(*i); if (vflag) std::cerr << " Found operation '" << token << "' in interface '" << portTypeRef->name << "'" << std::endl; break; } } else if (name && (*i).name && !strcmp((*i).name, name)) { if ((!input || !input->name || ((*i).__union1 == SOAP_UNION_wsdl__union_ioput_input && (*i).__ioput1.input->name && !strcmp((*i).__ioput1.input->name, input->name)) || ((*i).__union2 == SOAP_UNION_wsdl__union_ioput_input && (*i).__ioput2.input->name && !strcmp((*i).__ioput2.input->name, input->name)) ) && (!output || !output->name || ((*i).__union1 == SOAP_UNION_wsdl__union_ioput_output && (*i).__ioput1.output->name && !strcmp((*i).__ioput1.output->name, output->name)) || ((*i).__union2 == SOAP_UNION_wsdl__union_ioput_output && (*i).__ioput2.output->name && !strcmp((*i).__ioput2.output->name, output->name)) )) { operationRef = &(*i); if (vflag) std::cerr << " Found operation '" << name << "' in portType '" << portTypeRef->name << "'" << std::endl; break; } } } if (name && !operationRef) { for (std::vector::iterator j = portTypeRef->operation.begin(); j != portTypeRef->operation.end(); ++j) { if ((*j).name && !strcmp((*j).name, name)) { if (input && input->name && (((*j).__union1 == SOAP_UNION_wsdl__union_ioput_input && (*j).__ioput1.input->name && !strcmp((*j).__ioput1.input->name, input->name)) || ((*j).__union2 == SOAP_UNION_wsdl__union_ioput_input && (*j).__ioput2.input->name && !strcmp((*j).__ioput2.input->name, input->name)) )) std::cerr << "\nWarning: no matching portType operation input name '" << input->name << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; if (output && output->name && (((*j).__union1 == SOAP_UNION_wsdl__union_ioput_output && (*j).__ioput1.output->name && !strcmp((*j).__ioput1.output->name, output->name)) || ((*j).__union2 == SOAP_UNION_wsdl__union_ioput_output && (*j).__ioput2.output->name && !strcmp((*j).__ioput2.output->name, output->name)) )) std::cerr << "\nWarning: no matching portType operation output name '" << output->name << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; operationRef = &(*j); if (vflag) std::cerr << " Found operation '" << name << "'" << std::endl; break; } } } } if (!operationRef) { if (!Wflag) { if (ref) std::cerr << "\nWarning: no matching interface operation '" << (ref ? ref : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; else std::cerr << "\nWarning: no matching portType operation '" << (name ? name : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; } } else { for (std::vector::iterator i = fault.begin(); i != fault.end(); ++i) { if ((*i).name) { for (std::vector::iterator j = operationRef->fault.begin(); j != operationRef->fault.end(); ++j) { if ((*j).name && !strcmp((*j).name, (*i).name)) { (*i).faultPtr(&(*j)); if (vflag) std::cerr << " Found fault '" << (*j).name << "' message" << std::endl; break; } } } else if ((*i).soap__fault_ && (*i).soap__fault_->name) // try the soap:fault name, this is not elegant, but neither is WSDL 1.1 { for (std::vector::iterator j = operationRef->fault.begin(); j != operationRef->fault.end(); ++j) { if ((*j).name && !strcmp((*j).name, (*i).soap__fault_->name)) { (*i).faultPtr(&(*j)); if (vflag) std::cerr << " Found fault '" << ((*j).name ? (*j).name : "(null)") << "' message" << std::endl; break; } } } if (!(*i).faultPtr()) if (!Wflag) std::cerr << "\nWarning: no soap:fault '" << ((*i).name ? (*i).name : "(null)") << "' message in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' operation '" << (name ? name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; } } if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } void wsdl__ext_operation::operationPtr(wsdl__operation *operation) { operationRef = operation; if (!operationRef && vflag) std::cerr << "\nWarning: wsdl__ext_operation operation set to NULL" << std::endl; } wsdl__operation *wsdl__ext_operation::operationPtr() const { return operationRef; } void wsdl__ext_operation::mark() { if (Oflag > 1) { if (input) input->mark(); if (output) output->mark(); } } int wsdl__ext_ioput::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing binding operation input/output in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; for (std::vector::iterator hd = soap__header_.begin(); hd != soap__header_.end(); ++hd) (*hd).traverse(definitions); for (std::vector::iterator whd = wsoap__header_.begin(); whd != wsoap__header_.end(); ++whd) (*whd).traverse(definitions); if (mime__multipartRelated_) mime__multipartRelated_->traverse(definitions); if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } void wsdl__ext_ioput::mark() { if (Oflag > 1) for (std::vector::iterator sh = wsoap__header_.begin(); sh != wsoap__header_.end(); ++sh) (*sh).mark(); } wsdl__ext_fault::wsdl__ext_fault() { faultRef = NULL; } int wsdl__ext_fault::traverse(wsdl__definitions& definitions, wsdl__portType *portTypeRef) { if (vflag) std::cerr << " Analyzing binding operation fault in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; if (ref && portTypeRef) { // WSDL 2.0, assumption: ref refers to a fault in the interface for this binding const char *token = qname_token(ref, portTypeRef->definitionsPtr()->targetNamespace); if (token) { for (std::vector::iterator fault = portTypeRef->fault.begin(); fault != portTypeRef->fault.end(); ++fault) { if ((*fault).name && !strcmp((*fault).name, token)) { faultRef = &(*fault); if (vflag) std::cerr << " Found fault '" << (*fault).name << std::endl; break; } } } if (!faultRef) if (!Wflag) std::cerr << "\nWarning: no fault '" << (ref ? ref : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' interface '" << (portTypeRef->name ? portTypeRef->name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; } if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } void wsdl__ext_fault::faultPtr(wsdl__fault *fault) { faultRef = fault; if (!faultRef && vflag) std::cerr << "\nWarning: wsdl__ext_fault fault ref set to NULL" << std::endl; } wsdl__fault *wsdl__ext_fault::faultPtr() const { return faultRef; } wsdl__portType::wsdl__portType() { definitionsRef = NULL; } int wsdl__portType::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing portType/interface '" << (name ? name : "(null)") << "' in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; definitionsRef = &definitions; // traverse faults before operations, WSDL 2.0 for (std::vector::iterator f = fault.begin(); f != fault.end(); ++f) (*f).traverse(definitions); for (std::vector::iterator i = operation.begin(); i != operation.end(); ++i) (*i).traverse(definitions); if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } void wsdl__portType::definitionsPtr(wsdl__definitions *definitions) { definitionsRef = definitions; } wsdl__definitions *wsdl__portType::definitionsPtr() const { return definitionsRef; } void wsdl__portType::mark() { if (Oflag > 1) { for (std::vector::iterator ft = fault.begin(); ft != fault.end(); ++ft) (*ft).mark(); for (std::vector::iterator op = operation.begin(); op != operation.end(); ++op) (*op).mark(); } } int wsdl__operation::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing portType/interface operation '" << (name ? name : "(null)") << "' in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; if (__union1 == SOAP_UNION_wsdl__union_ioput_input) if (__ioput1.input) __ioput1.input->traverse(definitions); if (__union1 == SOAP_UNION_wsdl__union_ioput_output) if (__ioput1.output) __ioput1.output->traverse(definitions); if (__union2 == SOAP_UNION_wsdl__union_ioput_input) if (__ioput2.input) __ioput2.input->traverse(definitions); if (__union2 == SOAP_UNION_wsdl__union_ioput_output) if (__ioput2.output) __ioput2.output->traverse(definitions); for (std::vector::iterator i = fault.begin(); i != fault.end(); ++i) (*i).traverse(definitions); // WSDL 2.0 for (std::vector::iterator fi = infault.begin(); fi != infault.end(); ++fi) (*fi).traverse(definitions); for (std::vector::iterator fo = outfault.begin(); fo != outfault.end(); ++fo) (*fo).traverse(definitions); if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } void wsdl__operation::mark() { if (Oflag > 1) { if (__union1 == SOAP_UNION_wsdl__union_ioput_input) if (__ioput1.input) __ioput1.input->mark(); if (__union1 == SOAP_UNION_wsdl__union_ioput_output) if (__ioput1.output) __ioput1.output->mark(); if (__union2 == SOAP_UNION_wsdl__union_ioput_input) if (__ioput2.input) __ioput2.input->mark(); if (__union2 == SOAP_UNION_wsdl__union_ioput_output) if (__ioput2.output) __ioput2.output->mark(); for (std::vector::iterator i = fault.begin(); i != fault.end(); ++i) (*i).mark(); for (std::vector::iterator fi = infault.begin(); fi != infault.end(); ++fi) (*fi).mark(); for (std::vector::iterator fo = outfault.begin(); fo != outfault.end(); ++fo) (*fo).mark(); } } wsdl__ioput::wsdl__ioput() { messageRef = NULL; elementRef = NULL; } int wsdl__ioput::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing portType/interface operation input/output in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; messageRef = NULL; elementRef = NULL; // WSDL 2.0 if (element) { if (definitions.types) { for (std::vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(element, (*schema)->targetNamespace); if (token) { for (std::vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if ((*element).name && !strcmp((*element).name, token)) { elementRef = &(*element); if (vflag) std::cerr << " Found input/output '" << (messageLabel ? messageLabel : "(null)") << "' element '" << (token ? token : "(null)") << "'" << std::endl; break; } } } } } if (*element != '#' && !elementRef) { if (is_builtin_qname(element)) definitions.builtinElement(element); else if (!Wflag) std::cerr << "\nWarning: no input/output '" << (messageLabel ? messageLabel : "(null)") << "' element '" << element << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; } } else { const char *token = qname_token(message, definitions.targetNamespace); if (token) { for (std::vector::iterator message = definitions.message.begin(); message != definitions.message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) std::cerr << " Found input/output '" << (name ? name : "(null)") << "' message '" << (token ? token : "(null)") << "'" << std::endl; break; } } } if (!messageRef) { for (std::vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(message, importdefinitions->targetNamespace); if (token) { for (std::vector::iterator message = importdefinitions->message.begin(); message != importdefinitions->message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) std::cerr << " Found input/output '" << (name ? name : "(null)") << "' message '" << (token ? token : "(null)") << "'" << std::endl; break; } } } } } } if (!messageRef) if (!Wflag) std::cerr << "\nWarning: no input/output '" << (name ? name : "(null)") << "' message '" << (message ? message : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; } if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } void wsdl__ioput::messagePtr(wsdl__message *message) { messageRef = message; } wsdl__message *wsdl__ioput::messagePtr() const { return messageRef; } void wsdl__ioput::elementPtr(xs__element *element) { elementRef = element; } xs__element *wsdl__ioput::elementPtr() const { return elementRef; } void wsdl__ioput::mark() { if (Oflag > 1) if (elementPtr()) elementPtr()->mark(); } wsdl__fault::wsdl__fault() { messageRef = NULL; elementRef = NULL; } int wsdl__fault::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing portType/interface operation faults in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; messageRef = NULL; elementRef = NULL; // WSDL 2.0 if (ref) { const char *token = qname_token(ref, definitions.targetNamespace); if (token) { for (std::vector::iterator i = definitions.interface_.begin(); i != definitions.interface_.end(); ++i) { for (std::vector::iterator fault = (*i).fault.begin(); fault != (*i).fault.end(); ++fault) { if ((*fault).name && !strcmp((*fault).name, token)) { elementRef = (*fault).elementPtr(); if (vflag) std::cerr << " Found fault '" << (ref ? ref : "(null)") << "' element '" << (token ? token : "(null)") << "'" << std::endl; break; } } } } if (!elementRef) { for (std::vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(message, importdefinitions->targetNamespace); if (token) { for (std::vector::iterator i = importdefinitions->interface_.begin(); i != importdefinitions->interface_.end(); ++i) { for (std::vector::iterator fault = (*i).fault.begin(); fault != (*i).fault.end(); ++fault) { if ((*fault).name && !strcmp((*fault).name, token)) { elementRef = (*fault).elementPtr(); if (vflag) std::cerr << " Found fault '" << (ref ? ref : "(null)") << "' element '" << (token ? token : "(null)") << "'" << std::endl; break; } } } } } } } if (!elementRef) { if (is_builtin_qname(element)) definitions.builtinElement(element); else if (!Wflag) std::cerr << "\nWarning: no fault '" << (messageLabel ? messageLabel : "(null)") << "' ref '" << ref << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; } } else if (element) { if (definitions.types) { for (std::vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(element, (*schema)->targetNamespace); if (token) { for (std::vector::iterator element = (*schema)->element.begin(); element != (*schema)->element.end(); ++element) { if ((*element).name && !strcmp((*element).name, token)) { elementRef = &(*element); if (vflag) std::cerr << " Found fault '" << (messageLabel ? messageLabel : "(null)") << "' element '" << (token ? token : "(null)") << "'" << std::endl; break; } } } } } if (!elementRef) { if (is_builtin_qname(element)) definitions.builtinElement(element); else if (!Wflag) std::cerr << "\nWarning: no fault '" << (messageLabel ? messageLabel : "(null)") << "' element '" << element << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; } } else { const char *token = qname_token(message, definitions.targetNamespace); if (token) { for (std::vector::iterator message = definitions.message.begin(); message != definitions.message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) std::cerr << " Found operation fault '" << (name ? name : "(null)") << "' message '" << (token ? token : "(null)") << "'" << std::endl; break; } } } if (!messageRef) { for (std::vector::iterator import = definitions.import.begin(); import != definitions.import.end(); ++import) { wsdl__definitions *importdefinitions = (*import).definitionsPtr(); if (importdefinitions) { token = qname_token(message, importdefinitions->targetNamespace); if (token) { for (std::vector::iterator message = importdefinitions->message.begin(); message != importdefinitions->message.end(); ++message) { if ((*message).name && !strcmp((*message).name, token)) { messageRef = &(*message); if (vflag) std::cerr << " Found operation fault '" << (name ? name : "(null)") << "' message '" << (token ? token : "(null)") << "'" << std::endl; break; } } } } } } if (!messageRef) if (!Wflag) std::cerr << "\nWarning: no operation fault '" << (name ? name : "(null)") << "' message '" << (message ? message : "(null)") << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; } if (wsp__Policy_) wsp__Policy_->traverse(definitions); if (wsp__PolicyReference_) wsp__PolicyReference_->traverse(definitions); return SOAP_OK; } void wsdl__fault::messagePtr(wsdl__message *message) { messageRef = message; } wsdl__message *wsdl__fault::messagePtr() const { return messageRef; } void wsdl__fault::elementPtr(xs__element *element) { elementRef = element; } xs__element *wsdl__fault::elementPtr() const { return elementRef; } void wsdl__fault::mark() { if (Oflag > 1) if (elementPtr()) elementPtr()->mark(); } int wsdl__message::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing message '" << (name ? name : "(null)") << "' in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; for (std::vector::iterator i = part.begin(); i != part.end(); ++i) (*i).traverse(definitions); for (std::vector::iterator p = wsp__Policy_.begin(); p != wsp__Policy_.end(); ++p) (*p).traverse(definitions); for (std::vector::iterator r = wsp__PolicyReference_.begin(); r != wsp__PolicyReference_.end(); ++r) (*r).traverse(definitions); return SOAP_OK; } void wsdl__message::mark() { if (Oflag > 1) for (std::vector::iterator i = part.begin(); i != part.end(); ++i) (*i).mark(); } wsdl__part::wsdl__part() { elementRef = NULL; simpleTypeRef = NULL; complexTypeRef = NULL; optional = false; repeating = false; fixed = false; default_ = NULL; } int wsdl__part::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing message parts in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; elementRef = NULL; simpleTypeRef = NULL; complexTypeRef = NULL; if (definitions.types) { for (std::vector::iterator schema = definitions.types->xs__schema_.begin(); schema != definitions.types->xs__schema_.end(); ++schema) { const char *token = qname_token(element, (*schema)->targetNamespace); if (token) { for (std::vector::iterator el = (*schema)->element.begin(); el != (*schema)->element.end(); ++el) { if ((*el).name && !strcmp((*el).name, token)) { elementRef = &(*el); if (vflag) std::cerr << " Found message part '" << (name ? name : "(null)") << "' element '" << (token ? token : "(null)") << "'" << std::endl; break; } } } token = qname_token(type, (*schema)->targetNamespace); if (token) { for (std::vector::iterator st = (*schema)->simpleType.begin(); st != (*schema)->simpleType.end(); ++st) { if ((*st).name && !strcmp((*st).name, token)) { simpleTypeRef = &(*st); if (vflag) std::cerr << " Found message part '" << (name ? name : "(null)") << "' simpleType '" << (token ? token : "(null)") << "'" << std::endl; break; } } } token = qname_token(type, (*schema)->targetNamespace); if (token) { for (std::vector::iterator ct = (*schema)->complexType.begin(); ct != (*schema)->complexType.end(); ++ct) { if ((*ct).name && !strcmp((*ct).name, token)) { complexTypeRef = &(*ct); if (vflag) std::cerr << " Found message part '" << (name ? name : "(null)") << "' complexType '" << (token ? token : "(null)") << "'" << std::endl; break; } } } } } if (!elementRef && !simpleTypeRef && !complexTypeRef) { if (element) { if (is_builtin_qname(element)) definitions.builtinElement(element); else if (!Wflag) std::cerr << "\nWarning: no message part '" << (name ? name : "(null)") << "' element '" << element << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; } else if (type) { if (is_builtin_qname(type)) definitions.builtinType(type); else if (!Wflag) std::cerr << "\nWarning: no message part '" << (name ? name : "(null)") << "' type '" << type << "' in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; } else if (!Wflag) std::cerr << "\nWarning: no message part '" << (name ? name : "(null)") << "' element or type in wsdl definitions '" << (definitions.name ? definitions.name : "(null)") << "' namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; } return SOAP_OK; } void wsdl__part::elementPtr(xs__element *element) { elementRef = element; if (!elementRef && vflag) std::cerr << "\nWarning: wsdl__part element set to NULL" << std::endl; } void wsdl__part::simpleTypePtr(xs__simpleType *simpleType) { simpleTypeRef = simpleType; if (!simpleTypeRef && vflag) std::cerr << "\nWarning: wsdl__part simpleType set to NULL" << std::endl; } void wsdl__part::complexTypePtr(xs__complexType *complexType) { complexTypeRef = complexType; if (!complexTypeRef && vflag) std::cerr << "\nWarning: wsdl__part complexType set to NULL" << std::endl; } xs__element *wsdl__part::elementPtr() const { return elementRef; } xs__simpleType *wsdl__part::simpleTypePtr() const { return simpleTypeRef; } xs__complexType *wsdl__part::complexTypePtr() const { return complexTypeRef; } void wsdl__part::set_optional(bool b) { optional = b; } void wsdl__part::set_fixed(bool b) { fixed = b; } void wsdl__part::set_repeating(bool b) { repeating = b; } void wsdl__part::set_default(char* s) { default_ = s; } void wsdl__part::set_option(char* s) { if (s) option.push_back(s); } bool wsdl__part::is_optional() const { return optional; } bool wsdl__part::is_fixed() const { return fixed; } bool wsdl__part::is_repeating() const { return repeating; } const char *wsdl__part::get_default() const { return default_; } const std::vector& wsdl__part::options() const { return option; } void wsdl__part::mark() { if (Oflag > 1) { if (elementPtr()) elementPtr()->mark(); if (simpleTypePtr()) simpleTypePtr()->mark(); if (complexTypePtr()) complexTypePtr()->mark(); } } int wsdl__types::preprocess(wsdl__definitions& definitions) { if (vflag) std::cerr << "Preprocessing wsdl types" << std::endl; if (xs__schema_.empty()) // WSDL 2.0 w/o { targetNamespace = definitions.targetNamespace; sourceLocation(definitions.sourceLocation()); xs__schema_.push_back(this); } for (std::vector::iterator schema = xs__schema_.begin(); schema != xs__schema_.end(); ++schema) (*schema)->sourceLocation(definitions.sourceLocation()); again: // link imported schemas, need to repeat when is extended with new imported schema (from inside another schema, etc.) for (std::vector::iterator schema1 = xs__schema_.begin(); schema1 != xs__schema_.end(); ++schema1) { for (std::vector::iterator import = (*schema1)->import.begin(); import != (*schema1)->import.end(); ++import) { if ((*import).namespace_ && !(*import).schemaPtr()) { for (std::vector::const_iterator schema2 = xs__schema_.begin(); schema2 != xs__schema_.end(); ++schema2) { if (schema2 != schema1 && (*schema2)->targetNamespace && !strcmp((*import).namespace_, (*schema2)->targetNamespace)) { (*import).schemaPtr(*schema2); break; } } } } } // if a schema is imported but not in then get it for (std::vector::iterator schema2 = xs__schema_.begin(); schema2 != xs__schema_.end(); ++schema2) { for (std::vector::iterator import = (*schema2)->import.begin(); import != (*schema2)->import.end(); ++import) { bool found = false; if (vflag) std::cerr << "Preprocessing schema '" << (*schema2)->targetNamespace << "' import '" << ((*import).namespace_ ? (*import).namespace_ : "(null)") << "'" << std::endl; if (!found && (*import).namespace_) { for (SetOfString::const_iterator i = exturis.begin(); i != exturis.end(); ++i) { if (!soap_tag_cmp((*import).namespace_, *i)) { found = true; break; } } } if (!found && !iflag) // don't import any of the schemas in the .nsmap table (or when -i option is used) { xs__schema *importschema = (*import).schemaPtr(); if (importschema) { #if 0 // no longer applicable as imports are preprocessed if (!importschema) { const char *s = (*import).schemaLocation; if (!s && (*import).location) { s = (*import).schemaLocation = (*import).location; // work around for Microsoft bugs std::cerr << "Schema import with namespace '" << ((*import).namespace_ ? (*import).namespace_ : "(null)") << "' has a 'location' attribute specified but a 'schemaLocation' attribute must be used, please inform the author of this WSDL to correct this problem" << std::endl; } else if (!s) { s = (*import).namespace_; } if (!s) continue; importschema = new xs__schema(definitions.soap, (*schema2)->sourceLocation(), (*schema2)->absoluteLocation(s)); if (!(*import).namespace_) { if (importschema->targetNamespace) (*import).namespace_ = importschema->targetNamespace; else (*import).namespace_ = soap_strdup(definitions.soap, ""); } if (!importschema->targetNamespace || !*importschema->targetNamespace) importschema->targetNamespace = (*import).namespace_; else if ((*import).namespace_ && strcmp(importschema->targetNamespace, (*import).namespace_)) std::cerr << "Schema import namespace '" << ((*import).namespace_ ? (*import).namespace_ : "(null)") << "' does not correspond to imported namespace '" << importschema->targetNamespace << "'" << std::endl; for (std::vector::const_iterator schema3 = xs__schema_.begin(); schema3 != xs__schema_.end(); ++schema3) { if ((*schema3)->targetNamespace && !strcmp((*import).namespace_, (*schema3)->targetNamespace)) { (*import).schemaPtr(*schema3); if ((*schema3) == this || // WSDL 2.0 has no FormDefaults (*schema3)->empty()) // schema w/o components, only imports { (*schema3)->elementFormDefault = importschema->elementFormDefault; (*schema3)->attributeFormDefault = importschema->attributeFormDefault; } (*schema3)->insert(*importschema); // merge content goto again; } } } #endif if (!found) { for (std::vector::const_iterator schema3 = xs__schema_.begin(); schema3 != xs__schema_.end(); ++schema3) { if (*schema3 == importschema) { found = true; } else if ((*schema3)->targetNamespace && (*import).namespace_ && !strcmp((*import).namespace_, (*schema3)->targetNamespace)) { (*import).schemaPtr(*schema3); if ((*schema3) == this || // WSDL 2.0 has no FormDefaults (*schema3)->empty()) // schema w/o components, only imports { (*schema3)->elementFormDefault = importschema->elementFormDefault; (*schema3)->attributeFormDefault = importschema->attributeFormDefault; } (*schema3)->insert(*importschema); // merge content goto again; } } } if (!found) { xs__schema_.push_back(importschema); if (vflag) std::cerr << "Adding schema '" << importschema->targetNamespace << "'" << std::endl; goto again; } } else if (!Wflag) { fprintf(stderr, "\nWarning: no schemaLocation in to load schema: unknown schema\n", (*import).namespace_ ? (*import).namespace_ : "(null)"); } } } } if (vflag) { for (std::vector::iterator schema4 = xs__schema_.begin(); schema4 != xs__schema_.end(); ++schema4) { std::cerr << std::endl << "Schema " << ((*schema4)->targetNamespace ? (*schema4)->targetNamespace : "") << " " << ((*schema4)->sourceLocation() ? (*schema4)->sourceLocation() : "") << std::endl; for (std::vector::iterator im = (*schema4)->import.begin(); im != (*schema4)->import.end(); ++im) std::cerr << " import " << ((*im).namespace_ ? (*im).namespace_ : "") << " " << ((*im).schemaLocation ? (*im).schemaLocation : "") << std::endl; for (std::vector::iterator st = (*schema4)->simpleType.begin(); st != (*schema4)->simpleType.end(); ++st) std::cerr << " simpleType " << ((*st).name ? (*st).name : "") << std::endl; for (std::vector::iterator ct = (*schema4)->complexType.begin(); ct != (*schema4)->complexType.end(); ++ct) std::cerr << " complexType " << ((*ct).name ? (*ct).name : "") << std::endl; for (std::vector::iterator el = (*schema4)->element.begin(); el != (*schema4)->element.end(); ++el) std::cerr << " element " << ((*el).name ? (*el).name : "") << std::endl; for (std::vector::iterator at = (*schema4)->attribute.begin(); at != (*schema4)->attribute.end(); ++at) std::cerr << " attribute " << ((*at).name ? (*at).name : "") << std::endl; } } return SOAP_OK; } int wsdl__types::traverse(wsdl__definitions& definitions) { if (vflag) std::cerr << " Analyzing types in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; for (std::vector::iterator schema3 = xs__schema_.begin(); schema3 != xs__schema_.end(); ++schema3) { // artificially extend the of each schema to include others so when we traverse schemas we can resolve references for (std::vector::iterator importschema = xs__schema_.begin(); importschema != xs__schema_.end(); ++importschema) { if (schema3 != importschema && (*importschema)->targetNamespace) { xs__import *import = soap_new_xs__import(definitions.soap); import->namespace_ = (*importschema)->targetNamespace; import->schemaPtr(*importschema); (*schema3)->import.push_back(*import); } } // check and report for (std::vector::iterator import = (*schema3)->import.begin(); import != (*schema3)->import.end(); ++import) { if ((*import).namespace_) { bool found = false; for (std::vector::const_iterator importschema = xs__schema_.begin(); importschema != xs__schema_.end(); ++importschema) { if ((*importschema)->targetNamespace && !strcmp((*import).namespace_, (*importschema)->targetNamespace)) { found = true; break; } } if (!found && vflag) std::cerr << "Schema import namespace '" << (*import).namespace_ << "' refers to an unknown Schema" << std::endl; } else if (!Wflag) std::cerr << "\nWarning: schema import '" << ((*import).schemaLocation ? (*import).schemaLocation : "") << "' has no namespace" << std::endl; } } // traverse the schemas for (std::vector::iterator schema4 = xs__schema_.begin(); schema4 != xs__schema_.end(); ++schema4) (*schema4)->traverse(); // find all built-in types, elements, and attributes for (std::vector::iterator schema5 = xs__schema_.begin(); schema5 != xs__schema_.end(); ++schema5) { if (vflag) for (SetOfString::const_iterator i = (*schema5)->builtinTypes().begin(); i != (*schema5)->builtinTypes().end(); ++i) std::cerr << " Built-in schema type '" << (*i) << "'" << std::endl; definitions.builtinTypes((*schema5)->builtinTypes()); definitions.builtinTypeDerivations((*schema5)->builtinTypeDerivations()); definitions.builtinElements((*schema5)->builtinElements()); definitions.builtinAttributes((*schema5)->builtinAttributes()); } return SOAP_OK; } void wsdl__types::mark() { if (Oflag > 1) { xs__schema::mark(); for (std::vector::iterator schema = xs__schema_.begin(); schema != xs__schema_.end(); ++schema) (*schema)->mark(); } } int wsdl__import::preprocess(wsdl__definitions& definitions) { static std::map included; bool found = false; const char *relative_location = soap_strdup(definitions.soap, location); location = definitions.absoluteLocation(location); if (vflag) std::cerr << "Preprocess wsdl import '" << (location ? location : "(null)") << "'" << std::endl; definitionsRef = NULL; if (namespace_) { for (SetOfString::const_iterator i = exturis.begin(); i != exturis.end(); ++i) { if (!soap_tag_cmp(namespace_, *i)) { found = true; break; } } } if (!found && location) { std::map::iterator i = included.find(location); if (i != included.end()) { if (vflag) fprintf(stderr, "\nWSDL/XSD '%s' already imported\n", location); found = true; definitionsRef = (*i).second; } } if (!found && location) { // parse imported definitions const char *source = definitions.sourceLocation(); if (vflag) std::cerr << "Importing '" << location << "' into '" << (source ? source : "(source location not set)") << "'" << std::endl; definitionsRef = new wsdl__definitions(definitions.soap); if (!definitionsRef) return SOAP_EOF; included[location] = definitionsRef; definitionsRef->read(source, location, relative_location); if (!namespace_) namespace_ = definitionsRef->targetNamespace; else if (!definitionsRef->targetNamespace || !*definitionsRef->targetNamespace) definitionsRef->targetNamespace = namespace_; else if (strcmp(namespace_, definitionsRef->targetNamespace)) std::cerr << "Error: wsdl definitions/import '" << location << "' namespace '" << namespace_ << "' does not match imported targetNamespace '" << definitionsRef->targetNamespace << "'" << std::endl; } else if (!location) std::cerr << "\nWarning: wsdl definitions/import has no location attribute" << std::endl; return SOAP_OK; } int wsdl__import::traverse(wsdl__definitions& definitions) { if (definitionsRef) { if (vflag) std::cerr << " Analyzing imported wsdl namespace '" << (namespace_ ? namespace_ : "(null)") << "' in wsdl namespace '" << (definitions.targetNamespace ? definitions.targetNamespace : "(null)") << "'" << std::endl; if (!definitionsRef->targetNamespace) { if (namespace_) definitionsRef->targetNamespace = namespace_; else definitionsRef->targetNamespace = definitions.targetNamespace; } definitionsRef->traverse(); // collect imported artifacts into parent collections definitions.builtinTypes(definitionsRef->builtinTypes()); definitions.builtinTypeDerivations(definitionsRef->builtinTypeDerivations()); definitions.builtinElements(definitionsRef->builtinElements()); definitions.builtinAttributes(definitionsRef->builtinAttributes()); } return SOAP_OK; } void wsdl__import::definitionsPtr(wsdl__definitions *definitions) { definitionsRef = definitions; if (!definitionsRef && vflag) std::cerr << "\nWarning: wsdl__import definitions set to NULL" << std::endl; } wsdl__definitions *wsdl__import::definitionsPtr() const { return definitionsRef; } wsdl__import::wsdl__import() { definitionsRef = NULL; } void wsdl__import::mark() { if (Oflag > 1) { if (definitionsRef) definitionsRef->mark(); } } //////////////////////////////////////////////////////////////////////////////// // // streams // //////////////////////////////////////////////////////////////////////////////// std::ostream &operator<<(std::ostream &o, const wsdl__definitions &e) { if (!e.soap) { struct soap soap; soap_init2(&soap, SOAP_IO_DEFAULT, SOAP_XML_TREE | SOAP_C_UTFSTRING); soap_set_namespaces(&soap, namespaces); e.soap_serialize(&soap); soap_begin_send(&soap); e.soap_out(&soap, "wsdl:definitions", 0, NULL); soap_end_send(&soap); soap_destroy(&soap); soap_end(&soap); soap_done(&soap); } else { std::ostream *os = e.soap->os; e.soap->os = &o; e.soap_serialize(e.soap); soap_begin_send(e.soap); e.soap_out(e.soap, "wsdl:definitions", 0, NULL); soap_end_send(e.soap); e.soap->os = os; } return o; } std::istream &operator>>(std::istream &i, wsdl__definitions &e) { if (!e.soap) { e.soap = soap_new1(SOAP_XML_TREE | SOAP_C_UTFSTRING); soap_set_namespaces(e.soap, namespaces); } std::istream *is = e.soap->is; e.soap->is = &i; if (soap_begin_recv(e.soap) || !e.soap_in(e.soap, "wsdl:", NULL) || soap_end_recv(e.soap)) { // handle error? Note: e.soap->error is set and app should check } e.soap->is = is; return i; } //////////////////////////////////////////////////////////////////////////////// // // Miscellaneous // //////////////////////////////////////////////////////////////////////////////// extern "C" { int warn_ignore(struct soap *soap, const char *tag) { // We don't warn if the omitted element was an annotation or a documentation in an unexpected place if (!Mflag && soap->mustUnderstand) { fprintf(stderr, "\nError: must understand element '%s' at level %d with wsdl:required='true'. Suppress this error with -M\n", tag, soap->level); return soap->error = SOAP_MUSTUNDERSTAND; } if (!Wflag && soap_match_tag(soap, tag, "xs:annotation") && soap_match_tag(soap, tag, "xs:documentation") && soap_match_tag(soap, tag, "xs:appinfo")) fprintf(stderr, "\nWarning: unexpected element '%s' at level %d is skipped (safe to ignore)\n", tag, soap->level); if (soap->body && !soap_string_in(soap, 0, -1, -1, NULL)) return soap->error; return SOAP_OK; } int show_ignore(struct soap *soap, const char *tag) { warn_ignore(soap, tag); soap_print_fault_location(soap, stderr); return SOAP_OK; } } // end extern "C" gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/sp.h0000644000175000017500000000436713525245163021560 0ustar ellertellert/* sp.h WS-SecurityPolicy 1.2 binding schemas -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2010, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap sp schema documentation: WS-SecurityPolicy binding //gsoap sp schema namespace: http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702 // 1.1 //gsoap sp schema namespace: http://schemas.xmlsoap.org/ws/2005/07/securitypolicy //gsoap sp schema elementForm: qualified //gsoap sp schema attributeForm: unqualified #import "imports.h" #import "wsam.h" #import "wst.h" class sp__Header { public: @xsd__NCName Name; @xsd__anyURI Namespace; }; class sp__Parts { public: xsd__string Body; std::vector Header; xsd__string Attachments; }; class sp__Elements { public: @xsd__anyURI XPathVersion; std::vector XPath; }; class sp__Token : public wsp__Assertion { public: @xsd__anyURI IncludeToken; wsa__EndpointReferenceType *Issuer; xsd__anyURI IssuerName; wst__Claims *wst__Claims_; }; gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/stdsoap2.cpp0000644000175000017500000233054313525245163023230 0ustar ellertellert/* stdsoap2.c[pp] 2.8.91 gSOAP runtime engine gSOAP XML Web services tools Copyright (C) 2000-2019, 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 addition licensed under the gSOAP public license: - vxWorks compatible, enabled with compiler option -DVXWORKS -------------------------------------------------------------------------------- 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-2019, 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 -------------------------------------------------------------------------------- */ #define GSOAP_LIB_VERSION 20891 #ifdef AS400 # pragma convert(819) /* EBCDIC to ASCII */ #endif #if defined(__gnu_linux__) && !defined(_GNU_SOURCE) # define _GNU_SOURCE 1 #endif #include "stdsoap2.h" #if GSOAP_VERSION != GSOAP_LIB_VERSION # error "GSOAP VERSION MISMATCH IN LIBRARY: PLEASE REINSTALL PACKAGE" #endif #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) # include /* vxWorks compatible */ #endif #ifdef __BORLANDC__ # pragma warn -8060 #else # ifdef WIN32 # ifdef UNDER_CE # pragma comment(lib, "ws2.lib") /* WinCE */ # else # pragma comment(lib, "Ws2_32.lib") # endif # pragma warning(disable : 4996) /* disable deprecation warnings */ # endif #endif #ifdef __cplusplus SOAP_SOURCE_STAMP("@(#) stdsoap2.cpp ver 2.8.91 2019-08-15 00:00:00 GMT") extern "C" { #else SOAP_SOURCE_STAMP("@(#) stdsoap2.c ver 2.8.91 2019-08-15 00:00:00 GMT") #endif /* 8bit character representing unknown character entity or multibyte data */ #ifndef SOAP_UNKNOWN_CHAR # define SOAP_UNKNOWN_CHAR (0x7F) #endif /* unicode character representing unknown characters outside the XML 1.0 UTF8 unicode space */ #ifdef WITH_REPLACE_ILLEGAL_UTF8 # ifndef SOAP_UNKNOWN_UNICODE_CHAR # define SOAP_UNKNOWN_UNICODE_CHAR (0xFFFD) # endif #endif /* EOF=-1 */ #define SOAP_LT (soap_wchar)(-2) /* XML-specific '<' */ #define SOAP_TT (soap_wchar)(-3) /* XML-specific '' */ #define SOAP_QT (soap_wchar)(-5) /* XML-specific '"' */ #define SOAP_AP (soap_wchar)(-6) /* XML-specific ''' */ #define soap_coblank(c) ((c)+1 > 0 && (c) <= 32) #if defined(WIN32) && !defined(UNDER_CE) #define soap_hash_ptr(p) ((size_t)((PtrToUlong(p) >> 3) & (SOAP_PTRHASH - 1))) #else #define soap_hash_ptr(p) ((size_t)(((unsigned long)(p) >> 3) & (SOAP_PTRHASH-1))) #endif #ifdef SOAP_DEBUG static void soap_init_logs(struct soap*); 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 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); static void soap_version(struct soap*); static void soap_free_ns(struct soap*); static soap_wchar soap_char(struct soap*); static soap_wchar soap_getpi(struct soap*); static int soap_isxdigit(int); static void *fplugin(struct soap*, const char*); static ULONG64 soap_count_attachments(struct soap*); static int soap_try_connect_command(struct soap*, int http_command, const char *endpoint, const char *action); static int soap_init_send(struct soap*); #ifdef WITH_NTLM static int soap_ntlm_handshake(struct soap *soap, int command, const char *endpoint, const char *host, int port); #endif #ifndef WITH_NOIDREF static int soap_has_copies(struct soap*, const char*, const char*); static int soap_type_punned(struct soap*, const struct soap_ilist*); static int soap_is_shaky(struct soap*, void*); static void soap_init_iht(struct soap*); static void soap_free_iht(struct soap*); #endif static void soap_init_pht(struct soap*); static void soap_free_pht(struct soap*); #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, short isearly); static void soap_utilize_ns(struct soap *soap, const char *tag, short isearly); static const wchar_t* soap_wstring(struct soap *soap, const char *s, int flag, long minlen, long maxlen, const char *pattern); static wchar_t* soap_wcollapse(struct soap *soap, wchar_t *s, int flag, int insitu); #endif static const char* soap_string(struct soap *soap, const char *s, int flag, long minlen, long maxlen, const char *pattern); static char* soap_collapse(struct soap *soap, char *s, int flag, int insitu); static const char* soap_QName(struct soap *soap, const char *s, long minlen, long maxlen, const char *pattern); #ifndef WITH_LEANER static int soap_begin_attachments(struct soap*); static int soap_end_attachments(struct soap *soap); static struct soap_multipart *soap_alloc_multipart(struct soap*, struct soap_multipart**, struct soap_multipart**, const 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 #ifdef WITH_GZIP static int soap_getgziphdr(struct soap*); #endif #ifdef WITH_OPENSSL # ifndef SOAP_SSL_RSA_BITS # define SOAP_SSL_RSA_BITS 2048 # endif static 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 *); #endif #ifdef WITH_GNUTLS # ifndef SOAP_SSL_RSA_BITS # define SOAP_SSL_RSA_BITS 2048 # endif static int soap_ssl_init_done = 0; static int ssl_auth_init(struct soap*); static const char *ssl_verify(struct soap *soap, const char *host); # if GNUTLS_VERSION_NUMBER < 0x020b00 # if defined(HAVE_PTHREAD_H) # include /* make GNUTLS thread safe with pthreads */ GCRY_THREAD_OPTION_PTHREAD_IMPL; # elif defined(HAVE_PTH_H) #include /* make GNUTLS thread safe with PTH */ GCRY_THREAD_OPTION_PTH_IMPL; # endif # endif #endif #ifdef WITH_SYSTEMSSL static int ssl_auth_init(struct soap*); static int ssl_recv(int sk, void *s, int n, char *user); static int ssl_send(int sk, void *s, int n, char *user); #endif #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) static const char * soap_decode(char*, size_t, const char*, const char*); #endif #ifndef WITH_NOHTTP static soap_wchar soap_getchunkchar(struct soap*); static const char *http_error(struct soap*, int); static int http_get(struct soap*); static int http_put(struct soap*); static int http_patch(struct soap*); static int http_del(struct soap*); static int http_200(struct soap*); static int http_post(struct soap*, const char*, const char*, int, const char*, const char*, ULONG64); 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, ULONG64); static int http_parse(struct soap*); static int http_parse_header(struct soap*, const char*, const char*); #endif #ifndef WITH_NOIO 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*); #if !defined(WITH_IPV6) static int tcp_gethost(struct soap*, const char *addr, struct in_addr *inaddr); #endif #if !defined(WITH_IPV6) || defined(WITH_COOKIES) static int tcp_gethostbyname(struct soap*, const char *addr, struct hostent *hostent, 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_select(struct soap*, SOAP_SOCKET, int, 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*); #define SOAP_TCP_SELECT_RCV 0x1 #define SOAP_TCP_SELECT_SND 0x2 #define SOAP_TCP_SELECT_ERR 0x4 #define SOAP_TCP_SELECT_ALL 0x7 #define SOAP_TCP_SELECT_PIP 0x8 #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(__VMS) #define SOAP_SOCKBLOCK(fd) \ { \ int blocking = 0; \ ioctl(fd, FIONBIO, &blocking); \ } #define SOAP_SOCKNONBLOCK(fd) \ { \ int nonblocking = 1; \ ioctl(fd, FIONBIO, &nonblocking); \ } #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 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"; const union soap_double_nan soap_double_nan = {{0xFFFFFFFF, 0xFFFFFFFF}}; const char soap_base64o[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 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"; #ifndef WITH_LEAN static const char soap_indent[21] = "\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"; /* Alternative indentation form for SOAP_XML_INDENT with spaces instead of tabs: static const char soap_indent[41] = "\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[] = { { 100, "Continue" }, { 101, "Switching Protocols" }, { 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" }, { 422, "Unprocessable Entity" }, { 426, "Upgrade Required" }, { 428, "Precondition Required" }, { 429, "Too Many Requests" }, { 431, "Request Header Fields Too Large" }, { 500, "Internal Server Error" }, { 501, "Not Implemented" }, { 502, "Bad Gateway" }, { 503, "Service Unavailable" }, { 504, "Gateway Time-out" }, { 505, "HTTP Version not supported" }, { 511, "Network Authentication Required" }, { 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(_AIX43) || defined(TRU64) || defined(HP_UX)) && defined(HAVE_GETHOSTBYNAME_R) #ifndef h_errno extern int h_errno; #endif #endif /******************************************************************************/ #ifndef WITH_NOIO static int fsend(struct soap *soap, const char *s, size_t n) { int nwritten, err; SOAP_SOCKET sk; soap->errnum = 0; #if defined(__cplusplus) && !defined(WITH_COMPAT) if (soap->os) { soap->os->write(s, (std::streamsize)n); if (soap->os->good()) return SOAP_OK; return SOAP_EOF; } #endif sk = soap->sendsk; if (!soap_valid_socket(sk)) sk = soap->socket; while (n) { if (soap_valid_socket(sk)) { if (soap->send_timeout) { for (;;) { int r; #ifdef WITH_SELF_PIPE #ifdef WITH_OPENSSL if (soap->ssl) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL | SOAP_TCP_SELECT_PIP, soap->send_timeout); else #endif #ifdef WITH_GNUTLS if (soap->session) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL | SOAP_TCP_SELECT_PIP, soap->send_timeout); else #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL | SOAP_TCP_SELECT_PIP, soap->send_timeout); else #endif r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR | SOAP_TCP_SELECT_PIP, soap->send_timeout); if ((r & SOAP_TCP_SELECT_PIP)) /* abort if data is pending on pipe */ { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connection closed by self pipe\n")); return SOAP_EOF; } #else #ifdef WITH_OPENSSL if (soap->ssl) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL, soap->send_timeout); else #endif #ifdef WITH_GNUTLS if (soap->session) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL, soap->send_timeout); else #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL, soap->send_timeout); else #endif r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->send_timeout); #endif if (r > 0) break; if (!r) return SOAP_EOF; err = soap->errnum; if (!err) return soap->error; if (err != SOAP_EAGAIN && err != SOAP_EWOULDBLOCK) return SOAP_EOF; } } #ifndef WITH_LEAN if (soap->transfer_timeout) { time_t now = time(NULL); if ((soap->transfer_timeout > 0 && difftime(now, (time_t)soap->start) > (double)soap->transfer_timeout) || (soap->transfer_timeout < 0 && difftime(now, (time_t)soap->start) > -1000000.0 * (double)soap->transfer_timeout)) 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 #ifdef WITH_GNUTLS if (soap->session) nwritten = gnutls_record_send(soap->session, s, n); else #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) { err = gsk_secure_socket_write(soap->ssl, (char*)s, n, &nwritten); if (err != GSK_OK) nwritten = 0; } else #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) { if (soap->peerlen) nwritten = sendto(sk, (char*)s, (SOAP_WINSOCKINT)n, soap->socket_flags, &soap->peer.addr, (SOAP_WINSOCKINT)soap->peerlen); else nwritten = send(sk, 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) { int udp_repeat; int udp_delay; if ((soap->connect_flags & SO_BROADCAST)) udp_repeat = 2; /* SOAP-over-UDP MULTICAST_UDP_REPEAT - 1 */ else udp_repeat = 1; /* SOAP-over-UDP UNICAST_UDP_REPEAT - 1 */ udp_delay = ((unsigned int)soap_random % 201) + 50; /* UDP_MIN_DELAY .. UDP_MAX_DELAY */ do { tcp_select(soap, sk, SOAP_TCP_SELECT_ERR, -1000 * udp_delay); if (soap->peerlen) nwritten = sendto(sk, (char*)s, (SOAP_WINSOCKINT)n, soap->socket_flags, &soap->peer.addr, (SOAP_WINSOCKINT)soap->peerlen); else nwritten = send(sk, 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); } if (nwritten < 0) { err = soap_socket_errno(sk); if (err && err != SOAP_EINTR) { soap->errnum = err; return SOAP_EOF; } nwritten = 0; /* and call write() again */ } } else #endif #if !defined(AS400) nwritten = send(sk, s, (int)n, soap->socket_flags); #else nwritten = send(sk, (void*)s, n, soap->socket_flags); #endif if (nwritten <= 0) { int r = 0; err = soap_socket_errno(sk); #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 #ifdef WITH_GNUTLS if (soap->session) { if (nwritten == GNUTLS_E_INTERRUPTED) err = SOAP_EINTR; else if (nwritten == GNUTLS_E_AGAIN) err = SOAP_EAGAIN; } #endif if (err == SOAP_EWOULDBLOCK || err == SOAP_EAGAIN) { #if defined(WITH_OPENSSL) if (soap->ssl && r == SSL_ERROR_WANT_READ) r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); else #elif defined(WITH_GNUTLS) if (soap->session && !gnutls_record_get_direction(soap->session)) r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); else #endif r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); if (!r && soap->send_timeout) return SOAP_EOF; if (r < 0) return SOAP_EOF; } 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 WMW_RPM_IO /* vxWorks compatible */ if (soap->rpmreqid) nwritten = (httpBlockPut(soap->rpmreqid, (char*)s, n) == 0) ? n : -1; else #endif #ifdef WIN32 nwritten = _write(soap->sendfd, s, (unsigned int)n); #else nwritten = write(soap->sendfd, s, (unsigned int)n); #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 /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_send_raw(struct soap *soap, const char *s, size_t n) { if (!s || !n) return SOAP_OK; #ifndef WITH_LEANER if (soap->fpreparesend && (soap->mode & SOAP_IO) != SOAP_IO_STORE && (soap->mode & SOAP_IO_LENGTH) && (soap->error = soap->fpreparesend(soap, s, n)) != SOAP_OK) return soap->error; if (soap->ffiltersend && (soap->error = soap->ffiltersend(soap, &s, &n)) != SOAP_OK) return soap->error; #endif if ((soap->mode & SOAP_IO_LENGTH)) { soap->count += n; } else if ((soap->mode & SOAP_IO)) { size_t i = sizeof(soap->buf) - soap->bufidx; while (n >= i) { (void)soap_memcpy((void*)(soap->buf + soap->bufidx), i, (const void*)s, i); soap->bufidx = sizeof(soap->buf); if (soap_flush(soap)) return soap->error; s += i; n -= i; i = sizeof(soap->buf); } (void)soap_memcpy((void*)(soap->buf + soap->bufidx), sizeof(soap->buf) - soap->bufidx, (const void*)s, n); soap->bufidx += n; } else { return soap_flush_raw(soap, s, n); } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_flush(struct soap *soap) { size_t n = soap->bufidx; if (!n) return soap->error = soap->fsend(soap, SOAP_STR_EOS, 0); /* force a zero send for HTTP GET and DELETE */ #ifndef WITH_LEANER if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) { int r; if (soap->fpreparesend && (r = soap->fpreparesend(soap, soap->buf, n)) != SOAP_OK) return soap->error = r; } #endif soap->bufidx = 0; #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && soap->d_stream) { 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, sizeof(soap->buf))) return soap->error; soap->d_stream->next_out = (Byte*)soap->z_buf; soap->d_stream->avail_out = sizeof(soap->buf); } } while (soap->d_stream->avail_in); return SOAP_OK; } #endif return soap_flush_raw(soap, soap->buf, n); } /******************************************************************************/ 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) { void *t; t = soap_push_block(soap, NULL, n); if (!t) return soap->error = SOAP_EOM; (void)soap_memcpy(t, n, (const void*)s, n); return SOAP_OK; } #ifndef WITH_LEANER if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { char t[24]; (SOAP_SNPRINTF(t, sizeof(t), 20), &"\r\n%lX\r\n"[soap->chunksize ? 0 : 2], (unsigned long)n); DBGMSG(SENT, t, strlen(t)); soap->error = soap->fsend(soap, t, strlen(t)); if (soap->error) return soap->error; soap->chunksize += n; } DBGMSG(SENT, s, n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Send %u bytes to socket=%d/fd=%d\n", (unsigned int)n, (int)soap->socket, soap->sendfd)); #endif return soap->error = soap->fsend(soap, s, n); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_send(struct soap *soap, const char *s) { if (!s) return SOAP_OK; return soap_send_raw(soap, s, strlen(s)); } /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_query_send_key(struct soap *soap, const char *s) { if (!s) return SOAP_OK; if (!soap->body && soap_send_raw(soap, "&", 1)) return soap->error; soap->body = 0; (void)soap_encode_url(s, soap->msgbuf, (int)sizeof(soap->msgbuf)); /* msgbuf length is max SOAP_TMPLEN or just 1024 bytes */ return soap_send(soap, soap->msgbuf); } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_query_send_val(struct soap *soap, const char *s) { if (!s) return SOAP_OK; if (soap_send_raw(soap, "=", 1)) return soap->error; (void)soap_encode_url(s, soap->msgbuf, (int)sizeof(soap->msgbuf)); /* msgbuf length is max SOAP_TMPLEN or just 1024 bytes */ return soap_send(soap, soap->msgbuf); } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 char * SOAP_FMAC2 soap_query(struct soap *soap) { return strchr(soap->path, '?'); } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 char * SOAP_FMAC2 soap_query_key(struct soap *soap, char **s) { char *t = *s; (void)soap; if (t && *t) { *s = (char*)soap_query_decode(t, strlen(t), t + 1); return t; } return *s = NULL; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 char * SOAP_FMAC2 soap_query_val(struct soap *soap, char **s) { char *t = *s; (void)soap; if (t && *t == '=') { *s = (char*)soap_query_decode(t, strlen(t), t + 1); return t; } return NULL; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 const char * SOAP_FMAC2 soap_query_decode(char *buf, size_t len, const char *val) { const char *s; char *t; for (s = val; *s; s++) if (*s != ' ' && *s != '=') break; if (*s == '"') { t = buf; s++; while (*s && *s != '"' && --len) *t++ = *s++; *t = '\0'; do s++; while (*s && *s != '&' && *s != '='); } else { t = buf; while (*s && *s != '&' && *s != '=' && --len) { switch (*s) { case '+': *t++ = ' '; s++; break; case '\t': case '\n': case '\r': case ' ': s++; break; case '%': *t++ = ((s[1] >= 'A' ? (s[1]&0x7) + 9 : s[1] - '0') << 4) + (s[2] >= 'A' ? (s[2]&0x7) + 9 : s[2] - '0'); s += 3; break; default: *t++ = *s++; } } *t = '\0'; } return s; } #endif /******************************************************************************/ #ifndef WITH_NOIO static size_t frecv(struct soap *soap, char *s, size_t n) { int r; int retries = 100; /* max 100 retries with non-blocking sockets */ SOAP_SOCKET sk; soap->errnum = 0; #if defined(__cplusplus) && !defined(WITH_COMPAT) if (soap->is) /* recv from C++ stream */ { if (soap->is->good()) return (size_t)soap->is->read(s, (std::streamsize)n).gcount(); /* downcast to std::streamsize is OK: gcount() returns how much we got in s[] */ return 0; } #else if (soap->is) /* recv from C buffer until NUL */ { size_t l = strlen(soap->is); if (l > n) l = n; (void)soap_memcpy((void*)s, n, soap->is, l); soap->is += l; return l; } #endif sk = soap->recvsk; if (!soap_valid_socket(sk)) sk = soap->socket; if (soap_valid_socket(sk)) { for (;;) { #if defined(WITH_OPENSSL) || defined(WITH_SYSTEMSSL) int err = 0; #endif #ifdef WITH_OPENSSL if (soap->recv_timeout && !soap->ssl) /* OpenSSL: sockets are nonblocking so go ahead to read */ #else if (soap->recv_timeout) #endif { for (;;) { #ifdef WITH_SELF_PIPE r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR | SOAP_TCP_SELECT_PIP, soap->recv_timeout); if ((r & SOAP_TCP_SELECT_PIP)) /* abort if data is pending on pipe */ { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connection closed by self pipe\n")); return 0; } #else r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->recv_timeout); #endif if (r > 0) break; if (!r) return 0; r = soap->errnum; if (r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) return 0; } } #ifndef WITH_LEAN if (soap->transfer_timeout) { time_t now = time(NULL); if ((soap->transfer_timeout > 0 && difftime(now, (time_t)soap->start) > (double)soap->transfer_timeout) || (soap->transfer_timeout < 0 && difftime(now, (time_t)soap->start) > -1000000.0 * (double)soap->transfer_timeout)) 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 #ifdef WITH_GNUTLS if (soap->session) { r = (int)gnutls_record_recv(soap->session, s, n); if (r >= 0) return (size_t)r; } else #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) { err = gsk_secure_socket_read(soap->ssl, s, n, &r); if (err == GSK_OK && r > 0) return (size_t)r; if (err != GSK_OK && err != GSK_WOULD_BLOCK && err != GSK_WOULD_BLOCK_WRITE) 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(sk, s, (SOAP_WINSOCKINT)n, soap->socket_flags, &soap->peer.addr, &k); /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h, SOAP_WINSOCKINT cast is safe due to limited range of n in the engine (64K) */ soap->peerlen = (size_t)k; #ifdef WITH_IPV6 soap->ip = 0; soap->ip6[0] = 0; soap->ip6[1] = 0; soap->ip6[2] = 0; soap->ip6[3] = 0; #else soap->ip = ntohl(soap->peer.in.sin_addr.s_addr); soap->ip6[0] = 0; soap->ip6[1] = 0; soap->ip6[2] = 0xFFFF; soap->ip6[3] = soap->ip; #endif } else #endif r = recv(sk, s, (SOAP_WINSOCKINT)n, soap->socket_flags); /* SOAP_WINSOCKINT cast is safe due to limited range of n in the engine (64K) */ if (r >= 0) return (size_t)r; r = soap_socket_errno(sk); if (r != SOAP_EINTR && r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) { soap->errnum = r; return 0; } } #if defined(WITH_OPENSSL) if (soap->ssl && err == SSL_ERROR_WANT_WRITE) r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); else #elif defined(WITH_GNUTLS) if (soap->session && gnutls_record_get_direction(soap->session)) r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); else #elif defined(WITH_SYSTEMSSL) if (soap->ssl && err == GSK_WOULD_BLOCK_WRITE) r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); else #endif r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); if (!r && soap->recv_timeout) return 0; if (r < 0) { r = soap->errnum; if (r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) return 0; } if (retries-- <= 0) return 0; } } #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, n); #endif if (r >= 0) return (size_t)r; soap->errnum = soap_errno; return 0; #endif #endif } #endif /******************************************************************************/ #ifndef WITH_NOHTTP 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, sizeof(soap->buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket=%d/fd=%d\n", (unsigned int)soap->buflen, (int)soap->socket, soap->recvfd)); DBGMSG(RECV, soap->buf, soap->buflen); if (soap->buflen) return soap->buf[soap->bufidx++]; return EOF; } #endif /******************************************************************************/ static int soap_isxdigit(int c) { return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_recv_raw(struct soap *soap) { size_t ret; #if !defined(WITH_LEANER) || defined(WITH_ZLIB) int r; #endif #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && soap->d_stream) { if (soap->d_stream->next_out == Z_NULL) { soap->bufidx = soap->buflen = 0; return EOF; } if (soap->d_stream->avail_in || !soap->d_stream->avail_out) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflating\n")); soap->d_stream->next_out = (Byte*)soap->buf; soap->d_stream->avail_out = sizeof(soap->buf); r = inflate(soap->d_stream, Z_NO_FLUSH); if (r == Z_NEED_DICT && soap->z_dict) r = inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len); if (r == Z_OK || r == Z_STREAM_END) { soap->bufidx = 0; ret = soap->buflen = sizeof(soap->buf) - 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->d_stream->next_out = Z_NULL; } if (ret) { if (soap->count + ret < soap->count) return soap->error = SOAP_EOF; soap->count += ret; if (soap->recv_maxlength && soap->count > soap->recv_maxlength) return soap->error = SOAP_EOF; soap->z_ratio_in = (float)soap->d_stream->total_in / (float)soap->d_stream->total_out; if (soap->count > SOAP_MAXINFLATESIZE && soap->z_ratio_in < SOAP_MINDEFLATERATIO) { soap->d_stream->msg = (char*)"caught SOAP_MINDEFLATERATIO explosive decompression guard (remedy: increase SOAP_MAXINFLATESIZE and/or decrease SOAP_MINDEFLATERATIO)"; return soap->error = SOAP_ZLIB_ERROR; } DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- decompressed ----\n")); DBGMSG(RECV, soap->buf, ret); DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n----\n")); #ifndef WITH_LEANER if (soap->fpreparerecv && (r = soap->fpreparerecv(soap, soap->buf, ret)) != SOAP_OK) return soap->error = r; #endif 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; return soap->error = SOAP_ZLIB_ERROR; } } zlib_again: if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK && !soap->chunksize) { (void)soap_memcpy((void*)soap->buf, sizeof(soap->buf), (const void*)soap->z_buf, sizeof(soap->buf)); 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 (;;) { soap_wchar c; char *t, tmp[17]; if (soap->chunksize) { soap->buflen = ret = soap->frecv(soap, soap->buf, soap->chunksize > sizeof(soap->buf) ? sizeof(soap->buf) : soap->chunksize); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk: read %u bytes\n", (unsigned int)ret)); DBGMSG(RECV, soap->buf, ret); soap->bufidx = 0; if (!ret) { soap->ahead = EOF; return EOF; } soap->chunksize -= ret; break; } if (!soap->chunkbuflen) { soap->chunkbuflen = ret = soap->frecv(soap, soap->buf, sizeof(soap->buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes (chunked) from socket=%d\n", (unsigned int)ret, (int)soap->socket)); DBGMSG(RECV, soap->buf, ret); soap->bufidx = 0; if (!ret) { soap->ahead = EOF; return 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) { soap->ahead = EOF; return EOF; } } t = tmp; do { *t++ = (char)c; } while (soap_isxdigit((int)(c = soap_getchunkchar(soap))) && (size_t)(t - tmp) < sizeof(tmp)-1); while ((int)c != EOF && c != '\n') c = soap_getchunkchar(soap); if ((int)c == EOF) { soap->ahead = EOF; return EOF; } *t = '\0'; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunk size = %s (hex)\n", tmp)); soap->chunksize = (size_t)soap_strtoul(tmp, &t, 16); if (!soap->chunksize) { soap->bufidx = soap->buflen = soap->chunkbuflen = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of chunked message\n")); 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, sizeof(soap->buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket=%d/fd=%d\n", (unsigned int)ret, (int)soap->socket, soap->recvfd)); DBGMSG(RECV, soap->buf, ret); } #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB)) { (void)soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)soap->buf, sizeof(soap->buf)); 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 = sizeof(soap->buf); r = inflate(soap->d_stream, Z_NO_FLUSH); if (r == Z_NEED_DICT && soap->z_dict) r = inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len); if (r == Z_OK || r == Z_STREAM_END) { soap->bufidx = 0; soap->z_buflen = soap->buflen; soap->buflen = sizeof(soap->buf) - 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 && r != Z_STREAM_END) 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->d_stream->next_out = Z_NULL; } soap->z_ratio_in = (float)soap->d_stream->total_in / (float)soap->d_stream->total_out; if (soap->count + ret > SOAP_MAXINFLATESIZE && soap->z_ratio_in < SOAP_MINDEFLATERATIO) { soap->d_stream->msg = (char*)"caught SOAP_MINDEFLATERATIO explosive decompression guard (remedy: increase SOAP_MAXINFLATESIZE and/or decrease SOAP_MINDEFLATERATIO)"; return soap->error = SOAP_ZLIB_ERROR; } DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- decompressed ----\n")); DBGMSG(RECV, soap->buf, ret); #ifndef WITH_LEANER if (soap->fpreparerecv && (r = soap->fpreparerecv(soap, soap->buf, ret)) != SOAP_OK) return soap->error = r; #endif } 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; return soap->error = SOAP_ZLIB_ERROR; } } #endif #ifndef WITH_LEANER if (soap->fpreparerecv #ifdef WITH_ZLIB && soap->zlib_in == SOAP_ZLIB_NONE #endif && (r = soap->fpreparerecv(soap, soap->buf + soap->bufidx, ret))) return soap->error = r; #endif if (ret) { if (soap->count + ret < soap->count) return EOF; soap->count += ret; if (soap->recv_maxlength && soap->count > soap->recv_maxlength) return EOF; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read count=" SOAP_ULONG_FORMAT " (+%lu)\n", soap->count, (unsigned long)ret)); return SOAP_OK; } return EOF; } /******************************************************************************/ 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 SOAP in DIME is in buffer\n")); soap->buflen = soap->dime.buflen; soap->dime.buflen = 0; soap->dime.chunksize = 0; 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; } if (!(soap->dime.flags & SOAP_DIME_CF)) return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME hdr for next SOAP in DIME 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; } if ((tmp[0] & 0xF8) != SOAP_DIME_VERSION) return soap->error = SOAP_DIME_MISMATCH; soap->dime.flags = (tmp[0] & 0x7) | (tmp[1] & 0xF0); 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 SOAP in DIME chunk (%u bytes)\n", (unsigned int)soap->dime.size)); soap->dime.chunksize = soap->dime.size; if (soap->buflen - soap->bufidx >= soap->dime.size) { if ((soap->dime.flags & SOAP_DIME_ME)) { soap->mode &= ~SOAP_ENC_DIME; } else { soap->dime.buflen = soap->buflen; soap->buflen = soap->bufidx + soap->dime.chunksize; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked SOAP in DIME (%u bytes buffered)\n", (unsigned int)soap->buflen)); } } else { soap->dime.chunksize -= soap->buflen - soap->bufidx; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked SOAP in DIME (%u bytes in chunk left)\n", (unsigned int)soap->dime.chunksize)); } return SOAP_OK; } if (soap->dime.chunksize) { if (soap_recv_raw(soap)) return EOF; if (soap->buflen - soap->bufidx >= soap->dime.chunksize) { if ((soap->dime.flags & SOAP_DIME_ME)) { soap->dime.chunksize = 0; soap->mode &= ~SOAP_ENC_DIME; } else { soap->dime.buflen = soap->buflen; soap->buflen = soap->bufidx + soap->dime.chunksize; soap->dime.chunksize = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked SOAP in DIME (%u bytes buffered)\n", (unsigned int)soap->buflen)); } } else { soap->dime.chunksize -= soap->buflen - soap->bufidx; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked SOAP in DIME (%u bytes in chunk left)\n", (unsigned int)soap->dime.chunksize)); } return SOAP_OK; } } if (soap->ffilterrecv) { int err; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Filter recverror = %d bufidx = %lu buflen = %lu\n", soap->recverror, (unsigned long)soap->bufidx, (unsigned long)soap->buflen)); if (soap->recverror) { soap->bufidx = soap->buflen = 0; } else { soap->bufidx = soap->buflen = 0; err = soap->ffilterrecv(soap, soap->buf, &soap->buflen, sizeof(soap->buf)); if (err) { if (err == SOAP_EOF) return SOAP_EOF; return soap->error = err; } if (soap->buflen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Filtered output continued %lu bytes\n", (unsigned long)soap->buflen)); return SOAP_OK; } soap->recverror = soap_recv_raw(soap); soap->buflen -= soap->bufidx; /* chunked may set bufidx > 0 to skip hex chunk length */ } while (soap->ffilterrecv) { err = soap->ffilterrecv(soap, soap->buf + soap->bufidx, &soap->buflen, sizeof(soap->buf) - soap->bufidx); if (err) { if (err == SOAP_EOF) return SOAP_EOF; return soap->error = err; } if (soap->buflen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Filtered output %lu bytes\n", (unsigned long)soap->buflen)); soap->buflen += soap->bufidx; return SOAP_OK; } if (soap->recverror) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Returning postponed error %d\n", soap->recverror)); return soap->recverror; } soap->recverror = soap_recv_raw(soap); soap->buflen -= soap->bufidx; /* chunked may set bufidx > 0 to skip hex chunk length */ } } return soap->recverror = soap_recv_raw(soap); #else return soap_recv_raw(soap); #endif } /******************************************************************************/ SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getchar(struct soap *soap) { soap_wchar c; c = soap->ahead; if (c) { if ((int)c != EOF) soap->ahead = 0; return c; } return soap_get1(soap); } /******************************************************************************/ 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; } /******************************************************************************/ SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_code_int(const struct soap_code_map *code_map, const char *str, LONG64 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; } /******************************************************************************/ 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; } /******************************************************************************/ SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_code_bits(const struct soap_code_map *code_map, const char *str) { LONG64 bits = 0; if (code_map) { while (str && *str) { const struct soap_code_map *p; for (p = code_map; p->string; p++) { size_t n = strlen(p->string); if (!strncmp(p->string, str, n) && soap_coblank((soap_wchar)str[n])) { bits |= p->code; str += n; while (*str > 0 && *str <= 32) str++; break; } } if (!p->string) return 0; } } return bits; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_list(struct soap *soap, const struct soap_code_map *code_map, long code) { char *t = soap->tmpbuf; if (code_map) { while (code_map->string) { if ((code_map->code & code)) { 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; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_binary_search_string(const char **a, int n, const char *s) { int min = 0, max = n-1; while (min <= max) { int mid = (min+max)/2; int r = strcmp(s, a[mid]); if (r < 0) max = mid - 1; else if (r > 0) min = mid + 1; else return mid; } return -1; } /******************************************************************************/ static soap_wchar soap_char(struct soap *soap) { char tmp[8]; int i; soap_wchar c; char *s = tmp; for (i = 0; i < (int)sizeof(tmp)-1; 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_wchar)soap_strtol(tmp + 2, NULL, 16); return (soap_wchar)soap_strtol(tmp + 1, NULL, 10); } 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, (LONG64)SOAP_UNKNOWN_CHAR); #else return SOAP_UNKNOWN_CHAR; /* use this to represent unknown code */ #endif } /******************************************************************************/ #ifdef WITH_LEAN 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 /******************************************************************************/ #ifdef WITH_LEAN 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 /******************************************************************************/ SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_get(struct soap *soap) { 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; c = 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_coblank(c)); if (c == '!' || c == '?' || c == '%') { 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_getpi(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; } /******************************************************************************/ static soap_wchar soap_getpi(struct soap *soap) { char buf[64]; char *s = buf; size_t i = sizeof(buf); soap_wchar c; while ((int)(c = soap_getchar(soap)) != EOF && c != '?') { if (i > 1) { if (soap_coblank(c)) c = ' '; *s++ = (char)c; i--; } } *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; } /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_move(struct soap *soap, ULONG64 n) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving " SOAP_ULONG_FORMAT " bytes forward\n", n)); for (; n; n--) if ((int)soap_getchar(soap) == EOF) return SOAP_EOF; return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 ULONG64 SOAP_FMAC2 soap_tell(struct soap *soap) { return soap->count - soap->buflen + soap->bufidx - (soap->ahead != 0); } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_pututf8(struct soap *soap, unsigned long c) { char tmp[24]; if ((c < 0x7F && c > 0x1F)) { *tmp = (char)c; return soap_send_raw(soap, tmp, 1); } #ifdef WITH_REPLACE_ILLEGAL_UTF8 if (!(c == 0x09 || c == 0x0A || c == 0x0D || (c >= 0x80 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD) || (c >= 0x10000 && c <= 0x10FFFF))) c = SOAP_UNKNOWN_UNICODE_CHAR; #endif #ifndef WITH_LEAN if (c > 0x9F) { 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 #endif (SOAP_SNPRINTF(tmp, sizeof(tmp), 20), "&#x%lX;", c); return soap_send(soap, tmp); } /******************************************************************************/ SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getutf8(struct soap *soap) { #ifdef WITH_REPLACE_ILLEGAL_UTF8 soap_wchar c, c1, c2, c3; #else soap_wchar c, c1, c2, c3, c4; #endif c = soap->ahead; if (c >= 0x80) soap->ahead = 0; else c = (soap_wchar)soap_get(soap); if (c < 0x80 || c > 0xFF || (soap->mode & SOAP_ENC_LATIN)) return c; #ifdef WITH_REPLACE_ILLEGAL_UTF8 c1 = (soap_wchar)soap_get1(soap); if (c <= 0xC1 || (c1 & 0xC0) != 0x80) { soap_revget1(soap); return SOAP_UNKNOWN_UNICODE_CHAR; } c1 &= 0x3F; if (c < 0xE0) return (((c & 0x1F) << 6) | c1); c2 = (soap_wchar)soap_get1(soap); if ((c == 0xE0 && c1 < 0x20) || (c2 & 0xC0) != 0x80) { soap_revget1(soap); return SOAP_UNKNOWN_UNICODE_CHAR; } c2 &= 0x3F; if (c < 0xF0) return (((c & 0x0F) << 12) | (c1 << 6) | c2); c3 = (soap_wchar)soap_get1(soap); if ((c == 0xF0 && c1 < 0x10) || (c == 0xF4 && c1 >= 0x10) || c >= 0xF5 || (c3 & 0xC0) != 0x80) { soap_revget1(soap); return SOAP_UNKNOWN_UNICODE_CHAR; } return (((c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | (c3 & 0x3F)); #else c1 = (soap_wchar)soap_get1(soap); if (c < 0xC0 || (c1 & 0xC0) != 0x80) { soap_revget1(soap); /* doesn't look like this is UTF-8, try continue as if ISO-8859-1 */ return c; } c1 &= 0x3F; if (c < 0xE0) return ((soap_wchar)(c & 0x1F) << 6) | c1; c2 = (soap_wchar)soap_get1(soap) & 0x3F; 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 } /******************************************************************************/ SOAP_FMAC1 size_t SOAP_FMAC2 soap_utf8len(const char *s) { size_t l = 0; while (*s) if ((*s++ & 0xC0) != 0x80) l++; return l; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_puthex(struct soap *soap, const unsigned char *s, int n) { char d[2 * SOAP_BINARY_BUFLEN], *p = d; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_s2hex(soap, s, NULL, n); if (!soap->dom->text) return soap->error; return SOAP_OK; } #endif for (; n > 0; n--) { int m = *s++; p[0] = (char)((m >> 4) + (m > 159 ? '7' : '0')); m &= 0x0F; p[1] = (char)(m + (m > 9 ? '7' : '0')); p += 2; if (p - d == sizeof(d)) { if (soap_send_raw(soap, d, sizeof(d))) return soap->error; p = d; } } if (p != d && soap_send_raw(soap, d, p - d)) return soap->error; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_gethex(struct soap *soap, int *n) { size_t l = 0; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_string_in(soap, 0, -1, -1, NULL); return (unsigned char*)soap_hex2s(soap, soap->dom->text, NULL, 0, n); } #endif #ifdef WITH_FAST soap->labidx = 0; for (;;) { char *s; 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++) { char d1, d2; 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 = NULL; l = soap->lablen + i - k; soap_unget(soap, c); if (n) *n = (int)l; if (soap->maxlength > 0 && l > (size_t)soap->maxlength) { soap->error = SOAP_LENGTH; } else { p = (unsigned char*)soap_malloc(soap, l); if (p) (void)soap_memcpy((void*)p, l, (const void*)soap->labbuf, l); } return p; } *s++ = (char)(((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0')); } l = soap->lablen; if (soap->maxlength > 0 && l > (size_t)soap->maxlength) { soap->error = SOAP_LENGTH; return NULL; } } #else if (soap_alloc_block(soap) == NULL) return NULL; for (;;) { int i; 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++) { char d1, d2; 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 (soap->maxlength > 0 && l > (size_t)soap->maxlength) { soap->error = SOAP_LENGTH; soap_end_block(soap, NULL); return NULL; } if (n) *n = (int)soap_size_block(soap, NULL, i); p = (unsigned char*)soap_save_block(soap, NULL, NULL, 0); return p; } *s++ = ((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0'); l++; } if (soap->maxlength > 0 && l > (size_t)soap->maxlength) { soap->error = SOAP_LENGTH; soap_end_block(soap, NULL); return NULL; } } #endif } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_putbase64(struct soap *soap, const unsigned char *s, int n) { char d[4 * SOAP_BINARY_BUFLEN], *p = d; if (!s) return SOAP_OK; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_s2base64(soap, s, NULL, n); if (!soap->dom->text) return soap->error; return SOAP_OK; } #endif for (; n > 2; n -= 3, s += 3) { p[0] = soap_base64o[(s[0] & 0xFC) >> 2]; p[1] = soap_base64o[((s[0] & 0x03) << 4) | ((s[1] & 0xF0) >> 4)]; p[2] = soap_base64o[((s[1] & 0x0F) << 2) | ((s[2] & 0xC0) >> 6)]; p[3] = soap_base64o[s[2] & 0x3F]; p += 4; if (p - d == sizeof(d)) { if (soap_send_raw(soap, d, sizeof(d))) return soap->error; p = d; } } if (n == 2) { p[0] = soap_base64o[(s[0] & 0xFC) >> 2]; p[1] = soap_base64o[((s[0] & 0x03) << 4) | ((s[1] & 0xF0) >> 4)]; p[2] = soap_base64o[(s[1] & 0x0F) << 2]; p[3] = '='; p += 4; } else if (n == 1) { p[0] = soap_base64o[(s[0] & 0xFC) >> 2]; p[1] = soap_base64o[(s[0] & 0x03) << 4]; p[2] = '='; p[3] = '='; p += 4; } if (p != d && soap_send_raw(soap, d, p - d)) return soap->error; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_getbase64(struct soap *soap, int *n, int malloc_flag) { size_t l = 0; (void)malloc_flag; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_string_in(soap, 0, -1, -1, NULL); return (unsigned char*)soap_base642s(soap, soap->dom->text, NULL, 0, n); } #endif #ifdef WITH_FAST soap->labidx = 0; for (;;) { size_t i, k; 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 (k > 2) { for (i = 0; i < k - 2; i += 3) { unsigned long m = 0; int j = 0; do { soap_wchar c = soap_get(soap); if (c < SOAP_AP) c &= 0x7FFFFFFF; if (c == '=' || c < 0) { unsigned char *p = NULL; 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; } l = soap->lablen + i - k; if (n) *n = (int)l; if (soap->maxlength > 0 && l > (size_t)soap->maxlength) soap->error = SOAP_LENGTH; else { p = (unsigned char*)soap_malloc(soap, l); if (p) (void)soap_memcpy((void*)p, l, (const void*)soap->labbuf, l); } if (c >= 0) { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT) continue; } 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_coblank(c + '+')) { soap->error = SOAP_TYPE; return NULL; } } while (j < 4); *s++ = (char)((m >> 16) & 0xFF); *s++ = (char)((m >> 8) & 0xFF); *s++ = (char)(m & 0xFF); } l = soap->lablen; if (soap->maxlength > 0 && l > (size_t)soap->maxlength) { soap->error = SOAP_LENGTH; return NULL; } } } #else if (soap_alloc_block(soap) == NULL) return NULL; for (;;) { int i; 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++) { unsigned long m = 0; int j = 0; do { soap_wchar c = soap_get(soap); if (c < SOAP_AP) c &= 0x7FFFFFFF; if (c == '=' || c < 0) { unsigned char *p; i *= 3; switch (j) { case 2: *s++ = (char)((m >> 4) & 0xFF); i++; l++; break; case 3: *s++ = (char)((m >> 10) & 0xFF); *s++ = (char)((m >> 2) & 0xFF); l += 2; i += 2; } if (n) *n = (int)soap_size_block(soap, NULL, i); if (soap->maxlength > 0 && l > (size_t)soap->maxlength) { soap->error = SOAP_LENGTH; soap_end_block(soap, NULL); return NULL; } p = (unsigned char*)soap_save_block(soap, NULL, NULL, 0); if (c >= 0) { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT) continue; } 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_coblank(c + '+')) { soap->error = SOAP_TYPE; return NULL; } } while (j < 4); *s++ = (char)((m >> 16) & 0xFF); *s++ = (char)((m >> 8) & 0xFF); *s++ = (char)(m & 0xFF); l += 3; } if (soap->maxlength > 0 && l > (size_t)soap->maxlength) { soap->error = SOAP_LENGTH; soap_end_block(soap, NULL); return NULL; } } #endif } /******************************************************************************/ #ifndef WITH_LEANER 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 */ short body = soap->body; /* should save type too? */ if (!soap_peek_element(soap)) { if (!soap_element_begin_in(soap, ":Include", 0, NULL)) { if (soap_attachment_forward(soap, ptr, size, id, type, options) || (soap->body && soap_element_end_in(soap, ":Include"))) return soap->error; } else if (soap->error == SOAP_TAG_MISMATCH) soap_retry(soap); else return soap->error; } soap->body = body; return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_attachment_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 /******************************************************************************/ SOAP_FMAC1 void * SOAP_FMAC2 soap_memdup(struct soap *soap, const void *s, size_t n) { void *t = NULL; if (s) { t = soap_malloc(soap, n); if (t) (void)soap_memcpy(t, n, s, n); } return t; } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_strdup(struct soap *soap, const char *s) { char *t = NULL; if (s) { size_t n = strlen(s) + 1; if (n > 0) { t = (char*)soap_malloc(soap, n); if (t) { (void)soap_memcpy((void*)t, n, (const void*)s, n); t[n - 1] = '\0'; } } } return t; } /******************************************************************************/ 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, m; while (s[n]) n++; n++; m = sizeof(wchar_t) * n; if (n > 0) { t = (wchar_t*)soap_malloc(soap, m); if (t) { (void)soap_memcpy((void*)t, m, (const void*)s, m); t[n - 1] = L'\0'; } } } return t; } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_strtrim(struct soap *soap, char *s) { (void)soap; if (s) { char *t; while ((*s >= 9 && *s <= 13) || *s == 32) s++; t = s; while (*t) t++; while (--t > s && ((*t >= 9 && *t <= 13) || *t == 32)) continue; t[1] = '\0'; } return s; } /******************************************************************************/ SOAP_FMAC1 wchar_t * SOAP_FMAC2 soap_wstrtrim(struct soap *soap, wchar_t *s) { (void)soap; if (s) { wchar_t *t; while ((*s >= 9 && *s <= 13) || *s == 32) s++; t = s; while (*t) t++; while (--t > s && ((*t >= 9 && *t <= 13) || *t == 32)) continue; t[1] = L'\0'; } return s; } /******************************************************************************/ SOAP_FMAC1 struct soap_blist* SOAP_FMAC2 soap_alloc_block(struct soap *soap) { struct soap_blist *p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New block sequence (prev=%p)\n", (void*)soap->blist)); p = (struct soap_blist*)SOAP_MALLOC(soap, sizeof(struct soap_blist)); if (!p) { soap->error = SOAP_EOM; return NULL; } p->next = soap->blist; p->head = NULL; p->size = 0; p->item = 0; soap->blist = p; return p; } /******************************************************************************/ SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block(struct soap *soap, struct soap_blist *b, size_t n) { struct soap_bhead *p; if (!b) b = soap->blist; if (!b || b->size + n < b->size || sizeof(struct soap_bhead) + n < n || (SOAP_MAXALLOCSIZE > 0 && sizeof(struct soap_bhead) + n > SOAP_MAXALLOCSIZE)) { soap->error = SOAP_EOM; return NULL; } p = (struct soap_bhead*)SOAP_MALLOC(soap, sizeof(struct soap_bhead) + n); if (!p) { soap->error = SOAP_EOM; return NULL; } p->next = b->head; b->head = p; p->size = n; b->size += n; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push block %p of %u bytes on %lu previous blocks (%lu bytes total)\n", (void*)p, (unsigned int)n, (unsigned long)b->item, (unsigned long)b->size)); b->item++; return (void*)(p + 1); /* skip block header and point to n allocated bytes */ } /******************************************************************************/ SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block_max(struct soap *soap, struct soap_blist *b, size_t n) { if (b && b->item >= soap->maxoccurs) /* restrict block array length */ { soap->error = SOAP_OCCURS; return NULL; } return soap_push_block(soap, b, n); } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_pop_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *p; if (!b) b = soap->blist; if (!b || !b->head) return; p = b->head; b->size -= p->size; b->head = p->next; b->item--; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pop block %p (%lu items of %lu bytes total)\n", (void*)p, (unsigned long)b->item, (unsigned long)b->size)); SOAP_FREE(soap, p); } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_update_pointers(struct soap *soap, const char *dst, const char *src, size_t len) { const void *start = src, *end = src + len; #ifndef WITH_LEANER struct soap_xlist *xp; #endif #ifndef WITH_NOIDREF if ((soap->version && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH)) { int i; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update pointers %p (%lu bytes) -> %p\n", (void*)src, (unsigned long)len, (void*)dst)); for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { struct soap_flist *fp; void *p, **q; if (ip->shaky) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update shaky id='%s'\n", ip->id)); if (ip->ptr && ip->ptr >= start && ip->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update ptr %p -> %p\n", ip->ptr, (void*)((const char*)ip->ptr + (dst-src)))); ip->ptr = (void*)((const char*)ip->ptr + (dst-src)); } for (q = &ip->link; q; q = (void**)p) { p = *q; if (p && p >= start && p < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Link update id='%s' %p -> %p\n", ip->id, p, (void*)((const char*)p + (dst-src)))); *q = (void*)((const char*)p + (dst-src)); } } for (q = &ip->copy; q; q = (void**)p) { p = *q; if (p && p >= start && p < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy chain update id='%s' %p -> %p\n", ip->id, p, (void*)((const char*)p + (dst-src)))); *q = (void*)((const char*)p + (dst-src)); } } for (fp = ip->flist; fp; fp = fp->next) { if (fp->ptr >= start && fp->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy list update id='%s' target type=%d %p -> %p\n", ip->id, fp->type, fp->ptr, (void*)((char*)fp->ptr + (dst-src)))); fp->ptr = (void*)((const char*)fp->ptr + (dst-src)); } } if (ip->smart && ip->smart >= start && ip->smart < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Smart shared pointer update %p -> %p\n", ip->smart, (void*)((const char*)ip->smart + (dst-src)))); ip->smart = (void*)((const char*)ip->smart + (dst-src)); } } } } } #else (void)soap; (void)start; (void)end; (void)dst; (void)src; #endif #ifndef WITH_LEANER for (xp = soap->xlist; xp; xp = xp->next) { if (xp->ptr && (void*)xp->ptr >= start && (void*)xp->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update attachment id='%s' %p -> %p\n", xp->id ? xp->id : SOAP_STR_EOS, (void*)xp->ptr, (void*)((char*)xp->ptr + (dst-src)))); xp->ptr = (unsigned char**)((char*)xp->ptr + (dst-src)); xp->size = (int*)((char*)xp->size + (dst-src)); xp->type = (char**)((char*)xp->type + (dst-src)); xp->options = (char**)((char*)xp->options + (dst-src)); } } #endif } /******************************************************************************/ #ifndef WITH_NOIDREF static int soap_has_copies(struct soap *soap, const char *start, const char *end) { int i; struct soap_ilist *ip = NULL; struct soap_flist *fp = NULL; 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 (fp->type == ip->type && (const char*)fp->ptr >= start && (const char*)fp->ptr < end) return SOAP_ERR; } } return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_resolve(struct soap *soap) { int i; short flag; const char *id; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded refs\n")); for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { if (ip->ptr) { void **q; struct soap_flist *fp, **fpp = &ip->flist; if (ip->spine) ip->spine[0] = ip->ptr; q = (void**)ip->link; ip->link = NULL; DBGLOG(TEST, if (q) SOAP_MESSAGE(fdebug, "Traversing link chain to resolve id='%s' type=%d\n", ip->id, ip->type)); while (q) { void *p = *q; *q = ip->ptr; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... link %p -> %p\n", (void*)q, ip->ptr)); q = (void**)p; } while ((fp = *fpp)) { if (fp->level > 0 && fp->finsert) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... insert type=%d link %p -> %p\n", fp->type, fp->ptr, ip->ptr)); if (ip->spine && fp->level <= SOAP_MAXPTRS) fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, &ip->spine[fp->level - 1], &ip->smart); else if (fp->level == 1) fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, &ip->ptr, &ip->smart); else if (fp->level <= SOAP_MAXPTRS) { int i; ip->spine = (void**)soap_malloc(soap, SOAP_MAXPTRS * sizeof(void*)); if (!ip->spine) return soap->error = SOAP_EOM; ip->spine[0] = ip->ptr; for (i = 1; i < SOAP_MAXPTRS; i++) ip->spine[i] = &ip->spine[i - 1]; fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, &ip->spine[fp->level - 1], &ip->smart); } *fpp = fp->next; SOAP_FREE(soap, fp); } else fpp = &fp->next; } } else if (*ip->id == '#') { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Missing id='%s'\n", ip->id)); soap_strcpy(soap->id, sizeof(soap->id), ip->id + 1); return soap->error = SOAP_MISSING_ID; } } } do { flag = 0; id = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution phase\n")); for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { if (ip->copy || ip->flist) { if (ip->ptr && !soap_has_copies(soap, (const char*)ip->ptr, (const char*)ip->ptr + ip->size)) { struct soap_flist *fp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving id='%s' type=%d ptr=%p size=%lu ...\n", ip->id, ip->type, ip->ptr, (unsigned long)ip->size)); if (ip->copy) { 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, (void*)q, (unsigned int)ip->size)); p = *q; (void)soap_memcpy((void*)q, ip->size, (const void*)ip->ptr, ip->size); q = (void**)p; } while (q); flag = 1; } while ((fp = ip->flist)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded data type=%d target type=%d location=%p level=%u id='%s'\n", ip->type, fp->type, ip->ptr, fp->level, ip->id)); if (fp->level == 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... copy %p -> %p (%lu bytes)\n", ip->ptr, fp->ptr, (unsigned long)ip->size)); if (fp->finsert) fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, ip->ptr, &ip->smart); else (void)soap_memcpy((void*)fp->ptr, ip->size, (const void*)ip->ptr, ip->size); } ip->flist = fp->next; SOAP_FREE(soap, fp); flag = 1; } } else if (*ip->id == '#') id = ip->id; } } } } while (flag); if (id) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution error: forwarded data for id='%s' could not be propagated, please report this problem to the gSOAP developers\n", id)); return soap_id_nullify(soap, id); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution done\n")); return SOAP_OK; } #endif /******************************************************************************/ 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->head) { b->size -= b->head->size - n; b->head->size = n; } return b->size; } /******************************************************************************/ SOAP_FMAC1 char* SOAP_FMAC2 soap_first_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *p, *q, *r; if (!b) b = soap->blist; p = b->head; if (!p) return NULL; r = NULL; do { q = p->next; p->next = r; r = p; p = q; } while (p); b->head = r; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "First block %p\n", (void*)(r + 1))); return (char*)(r + 1); } /******************************************************************************/ SOAP_FMAC1 char* SOAP_FMAC2 soap_next_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *p; if (!b) b = soap->blist; p = b->head; if (p) { b->head = p->next; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Next block %p, deleting current block\n", (void*)(b->head ? b->head + 1 : NULL))); SOAP_FREE(soap, p); if (b->head) return (char*)(b->head + 1); } return NULL; } /******************************************************************************/ SOAP_FMAC1 size_t SOAP_FMAC2 soap_block_size(struct soap *soap, struct soap_blist *b) { if (!b) b = soap->blist; return b->head->size; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_end_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *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->head; p; p = q) { q = p->next; 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, "Restored previous block sequence\n")); #ifndef WITH_NOIDREF if (!soap->blist && ((soap->version && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH))) { int i; struct soap_ilist *ip = NULL; for (i = 0; i < SOAP_IDHASH; i++) for (ip = soap->iht[i]; ip; ip = ip->next) ip->shaky = 0; } #endif } /******************************************************************************/ SOAP_FMAC1 char* SOAP_FMAC2 soap_save_block(struct soap *soap, struct soap_blist *b, char *p, int flag) { size_t n; char *q, *s; if (!b) b = soap->blist; if (b->size) { if (!p) p = (char*)soap_malloc(soap, b->size); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Save all %lu blocks in contiguous memory space of %u bytes (%p->%p)\n", (unsigned long)b->item, (unsigned int)b->size, (void*)b->head, (void*)p)); if (p) { s = p; for (q = soap_first_block(soap, b); q; q = soap_next_block(soap, b)) { n = soap_block_size(soap, b); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy %u bytes from %p to %p\n", (unsigned int)n, (void*)q, (void*)s)); if (flag) soap_update_pointers(soap, s, q, n); (void)soap_memcpy((void*)s, n, (const void*)q, n); s += n; } } else soap->error = SOAP_EOM; } soap_end_block(soap, b); return p; } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_putsizesoffsets(struct soap *soap, const char *type, const int *size, const int *offset, int dim) { int i; const char *t = ",%d"; if (!type) return NULL; if (soap->version == 2) t = " %d"; if (soap->version != 2 && offset) { (SOAP_SNPRINTF(soap->type, sizeof(soap->type) - 1, strlen(type) + 20), "%s[%d", type, size[0] + offset[0]); for (i = 1; i < dim; i++) { size_t l = strlen(soap->type); (SOAP_SNPRINTF(soap->type + l, sizeof(soap->type) - l - 1, 20), t, size[i] + offset[i]); } } else { (SOAP_SNPRINTF(soap->type, sizeof(soap->type) - 1, strlen(type) + 20), "%s[%d", type, size[0]); for (i = 1; i < dim; i++) { size_t l = strlen(soap->type); (SOAP_SNPRINTF(soap->type + l, sizeof(soap->type) - l - 1, 20), t, size[i]); } } soap_strcat(soap->type, sizeof(soap->type), "]"); return soap->type; } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_putoffsets(struct soap *soap, const int *offset, int dim) { int i; soap->arrayOffset[0] = '\0'; if (soap->version == 1) { (SOAP_SNPRINTF(soap->arrayOffset, sizeof(soap->arrayOffset) - 1, 20), "[%d", offset[0]); for (i = 1; i < dim; i++) { size_t l = strlen(soap->arrayOffset); (SOAP_SNPRINTF(soap->arrayOffset + l, sizeof(soap->arrayOffset) - l - 1, 20), ",%d", offset[i]); } soap_strcat(soap->arrayOffset, sizeof(soap->arrayOffset), "]"); } return soap->arrayOffset; } /******************************************************************************/ SOAP_FMAC1 size_t SOAP_FMAC2 soap_size(const int *size, int dim) { int i; size_t n = 0; if (size[0] <= 0) return 0; n = (size_t)size[0]; for (i = 1; i < dim; i++) { if (size[i] <= 0) return 0; n *= (size_t)size[i]; } return (size_t)n; } /******************************************************************************/ SOAP_FMAC1 size_t SOAP_FMAC2 soap_getsizes(const char *attr, int *size, int dim) { size_t i, k, n; if (!*attr) return 0; i = strlen(attr); n = 1; do { for (; i > 0; i--) if (attr[i - 1] == '[' || attr[i - 1] == ',' || attr[i - 1] == ' ') break; n *= k = (size_t)soap_strtoul(attr + i, NULL, 10); size[--dim] = (int)k; if (n > SOAP_MAXARRAYSIZE) return 0; } while (dim > 0 && --i > 0 && attr[i] != '['); return n; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_getoffsets(const char *attr, const int *size, int *offset, int dim) { int i, j = 0; if (offset) { for (i = 0; i < dim && attr && *attr; i++) { attr++; j *= size[i]; j += offset[i] = (int)soap_strtol(attr, NULL, 10); attr = strchr(attr, ','); } } else { for (i = 0; i < dim && attr && *attr; i++) { attr++; j *= size[i]; j += (int)soap_strtol(attr, NULL, 10); attr = strchr(attr, ','); } } return j; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_getposition(const char *attr, int *pos) { int i, n; if (!*attr) return -1; n = 0; i = 1; do { pos[n++] = (int)soap_strtol(attr + i, NULL, 10); while (attr[i] && attr[i] != ',' && attr[i] != ']') i++; if (attr[i] == ',') i++; } while (n < SOAP_MAXDIMS && attr[i] && attr[i] != ']'); return n; } /******************************************************************************/ SOAP_FMAC1 struct soap_nlist * SOAP_FMAC2 soap_push_namespace(struct soap *soap, const char *id, const char *ns) { struct soap_nlist *np = NULL; struct Namespace *p; short i = -1; size_t n, k; n = strlen(id); k = strlen(ns) + 1; p = soap->local_namespaces; if (p) { for (i = 0; p->id; p++, i++) { if (p->ns && !strcmp(ns, p->ns)) break; if (p->out) { if (!strcmp(ns, p->out)) break; } else if (p->in) { if (!soap_tag_cmp(ns, p->in)) { if (SOAP_MAXALLOCSIZE <= 0 || k <= SOAP_MAXALLOCSIZE) p->out = (char*)SOAP_MALLOC(soap, k); if (p->out) soap_strcpy(p->out, k, ns); break; } } } if (!p->id) i = -1; } if (i >= 0) k = 0; if (sizeof(struct soap_nlist) + n + k > n && (SOAP_MAXALLOCSIZE <= 0 || sizeof(struct soap_nlist) + n + k <= SOAP_MAXALLOCSIZE)) np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k); if (!np) { soap->error = SOAP_EOM; return NULL; } np->next = soap->nlist; soap->nlist = np; np->level = soap->level; np->index = i; soap_strcpy((char*)np->id, n + 1, 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; soap_strcpy((char*)np->ns, k, 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 np; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_pop_namespace(struct soap *soap) { 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' level=%u\n", soap->level, np->id, np->level)); SOAP_FREE(soap, np); } soap->nlist = np; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_match_namespace(struct soap *soap, const char *id1, const char *id2, size_t n1, size_t n2) { struct soap_nlist *np = soap->nlist; const char *s; while (np && (strncmp(np->id, id1, n1) || np->id[n1])) np = np->next; if (np) { if (!(soap->mode & SOAP_XML_IGNORENS) && (n2 > 0 || !np->ns || *np->ns)) { if (np->index < 0 || ((s = soap->local_namespaces[np->index].id) && (strncmp(s, id2, n2) || (s[n2] && s[n2] != '_')))) return SOAP_NAMESPACE; } return SOAP_OK; } if (n1 == 0) return n2 == 0 || (soap->mode & SOAP_XML_IGNORENS) ? SOAP_OK : SOAP_NAMESPACE; if ((n1 == 3 && n1 == n2 && !strncmp(id1, "xml", 3) && !strncmp(id1, id2, 3)) || (soap->mode & SOAP_XML_IGNORENS)) return SOAP_OK; return soap->error = SOAP_SYNTAX_ERROR; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_current_namespace_tag(struct soap *soap, const char *tag) { struct soap_nlist *np; const char *s; if (!tag || !strncmp(tag, "xml", 3)) return NULL; np = soap->nlist; s = strchr(tag, ':'); if (!s) { 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) { s = np->ns; if (*s) return soap_strdup(soap, s); do np = np->next; while (np && *np->id); /* find if there is any other default namespace */ if (np) return soap_strdup(soap, s); } } return NULL; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_current_namespace_att(struct soap *soap, const char *tag) { struct soap_nlist *np; const char *s; if (!tag || !strncmp(tag, "xml", 3)) return NULL; s = strchr(tag, ':'); if (!s) return NULL; np = soap->nlist; 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 && *np->ns) return soap_strdup(soap, np->ns); } return NULL; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_tag_cmp(const char *s, const char *t) { const char *a = NULL; const char *b = NULL; for (;;) { int c1 = *s; int c2 = *t; if (!c1 || c1 == '"') break; if (c2 != '-') { if (c1 < c2) { if (c1 >= 'A' && c1 <= 'Z') c1 += 'a' - 'A'; } else if (c1 > c2) { if (c2 >= 'A' && c2 <= 'Z') c2 += 'a' - 'A'; } if (c2 == '*') { c2 = *++t; if (!c2) return 0; a = s; b = t; continue; } if (c1 != c2) { if (!a) return 1; s = ++a; t = b; continue; } } s++; t++; } if (*t == '*' && !t[1]) return 0; return *t; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_match_tag(struct soap *soap, const char *tag1, const char *tag2) { const char *s, *t; 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; if (t != tag2 && !(soap->mode & SOAP_XML_IGNORENS)) { err = soap_match_namespace(soap, tag1, tag2, s - tag1, t - tag2); if (err) { 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 (!t[1]) { if ((soap->mode & SOAP_XML_IGNORENS) || soap_match_namespace(soap, tag1, tag2, 0, t - tag2)) return SOAP_TAG_MISMATCH; } 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); if (err) { 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->mode & SOAP_XML_IGNORENS) || SOAP_STRCMP(s + 1, tag2)) /* always fails (except when ignoring ns) */ return SOAP_TAG_MISMATCH; } else if (SOAP_STRCMP(tag1, tag2) #ifndef WITH_NOEMPTYNAMESPACES || ((soap->mode & SOAP_XML_STRICT) && !(soap->mode & SOAP_XML_IGNORENS) && soap_match_namespace(soap, tag1, tag2, 0, 0)) /* strict checking: default namespace must be null namespace */ #endif ) { return SOAP_TAG_MISMATCH; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags match: '%s' '%s'\n", tag1, tag2)); return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_match_att(struct soap *soap, const char *tag1, const char *tag2) { const char *s, *t; 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; if (t != tag2 && !(soap->mode & SOAP_XML_IGNORENS)) { err = soap_match_namespace(soap, tag1, tag2, s - tag1, t - tag2); if (err) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Atts '%s' and '%s' match but namespaces differ\n", tag1, tag2)); if (err == SOAP_NAMESPACE) return SOAP_TAG_MISMATCH; return err; } } } else if (!t[1] || t != tag2 || SOAP_STRCMP(tag1, t + 1)) return SOAP_TAG_MISMATCH; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Atts and (default) namespaces match: '%s' '%s'\n", tag1, tag2)); return SOAP_OK; } if (s) { if (!(soap->mode & SOAP_XML_IGNORENS) || SOAP_STRCMP(s + 1, tag2)) /* always fails (except when ignoring ns) */ return SOAP_TAG_MISMATCH; } else if (SOAP_STRCMP(tag1, tag2)) return SOAP_TAG_MISMATCH; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Atts match: '%s' '%s'\n", tag1, tag2)); return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_match_array(struct soap *soap, const char *type) { if (type && *soap->arrayType) { if (soap->version == 1 || !strchr(type, '[')) { 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, "SOAP array type mismatch: '%s' '%s'\n", soap->arrayType, type)); return SOAP_TAG_MISMATCH; } } } return SOAP_OK; } /******************************************************************************\ * * SSL/TLS * \******************************************************************************/ #ifdef WITH_OPENSSL SOAP_FMAC1 int SOAP_FMAC2 soap_rand() { int r; if (!soap_ssl_init_done) soap_ssl_init(); #if OPENSSL_VERSION_NUMBER < 0x10100000L RAND_pseudo_bytes((unsigned char*)&r, sizeof(int)); #else RAND_bytes((unsigned char*)&r, sizeof(int)); #endif return r; } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) SOAP_FMAC1 int SOAP_FMAC2 #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid) #else 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) #endif { int err; soap->keyfile = keyfile; #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap->keyid = keyid; /* vxWorks compatible */ #endif soap->password = password; soap->cafile = cafile; soap->capath = capath; #ifdef WITH_OPENSSL soap->dhfile = dhfile; soap->randfile = randfile; if (!soap->fsslverify) soap->fsslverify = ssl_verify_callback; #endif soap->ssl_flags = flags | (dhfile == NULL ? SOAP_SSL_RSA : 0); #ifdef WITH_GNUTLS (void)randfile; (void)sid; if (dhfile) { char *s; int n = (int)soap_strtoul(dhfile, &s, 10); if (!soap->dh_params) gnutls_dh_params_init(&soap->dh_params); /* if dhfile is numeric, treat it as a key length to generate DH params which can take a while */ if (n >= 512 && s && *s == '\0') gnutls_dh_params_generate2(soap->dh_params, (unsigned int)n); else { unsigned int dparams_len; unsigned char dparams_buf[1024]; FILE *fd = fopen(dhfile, "r"); if (!fd) return soap_set_receiver_error(soap, "SSL/TLS error", "Invalid DH file", SOAP_SSL_ERROR); dparams_len = (unsigned int)fread(dparams_buf, 1, sizeof(dparams_buf), fd); fclose(fd); gnutls_datum_t dparams = { dparams_buf, dparams_len }; if (gnutls_dh_params_import_pkcs3(soap->dh_params, &dparams, GNUTLS_X509_FMT_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Invalid DH file", SOAP_SSL_ERROR); } } else { #if GNUTLS_VERSION_NUMBER < 0x030300 if (!soap->rsa_params) gnutls_rsa_params_init(&soap->rsa_params); gnutls_rsa_params_generate2(soap->rsa_params, SOAP_SSL_RSA_BITS); #endif } if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } #endif #ifdef WITH_SYSTEMSSL (void)randfile; (void)sid; if (soap->ctx) gsk_environment_close(&soap->ctx); #endif err = soap->fsslauth(soap); #ifdef WITH_OPENSSL if (!err) { if (sid) SSL_CTX_set_session_id_context(soap->ctx, (unsigned char*)sid, (unsigned int)strlen(sid)); else SSL_CTX_set_session_cache_mode(soap->ctx, SSL_SESS_CACHE_OFF); } #endif return err; } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) SOAP_FMAC1 int SOAP_FMAC2 #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *randfile) #else 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) #endif { soap->keyfile = keyfile; #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap->keyid = keyid; /* vxWorks compatible */ #endif soap->password = password; soap->cafile = cafile; soap->capath = capath; soap->ssl_flags = SOAP_SSL_CLIENT | flags; #ifdef WITH_OPENSSL soap->dhfile = NULL; soap->randfile = randfile; if (!soap->fsslverify) soap->fsslverify = (flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) == 0 ? ssl_verify_callback : ssl_verify_callback_allow_expired_certificate; #endif #ifdef WITH_GNUTLS (void)randfile; if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } #endif #ifdef WITH_SYSTEMSSL (void)randfile; if (soap->ctx) gsk_environment_close(&soap->ctx); #endif return soap->fsslauth(soap); } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_crl(struct soap *soap, const char *crlfile) { #ifdef WITH_OPENSSL if (crlfile && soap->ctx) { #if OPENSSL_VERSION_NUMBER > 0x00907000L X509_STORE *store = SSL_CTX_get_cert_store(soap->ctx); if (*crlfile) { int ret; X509_LOOKUP *lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file()); if (!lookup) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't create X509_LOOKUP object", SOAP_SSL_ERROR); ret = X509_load_crl_file(lookup, crlfile, X509_FILETYPE_PEM); if (ret <= 0) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CRL PEM file", SOAP_SSL_ERROR); } X509_STORE_set_flags(store, X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL); #endif } else soap->crlfile = crlfile; /* activate later when store is available */ #endif #ifdef WITH_GNUTLS if (crlfile && soap->xcred) { if (*crlfile) if (gnutls_certificate_set_x509_crl_file(soap->xcred, crlfile, GNUTLS_X509_FMT_PEM) < 0) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CRL PEM file", SOAP_SSL_ERROR); } else { soap->crlfile = crlfile; /* activate later when xcred is available */ } #endif return SOAP_OK; } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) SOAP_FMAC1 void SOAP_FMAC2 soap_ssl_init() { /* Note: for multi-threaded applications, the main program should call soap_ssl_init() before any threads are started */ if (!soap_ssl_init_done) { soap_ssl_init_done = 1; #ifdef WITH_OPENSSL SSL_library_init(); OpenSSL_add_all_algorithms(); /* we keep ciphers and digests for the program's lifetime */ #ifndef WITH_LEAN SSL_load_error_strings(); #endif #if !defined(WIN32) && !defined(CYGWIN) && !defined(__MINGW32__) && !defined(__MINGW64__) if (!RAND_load_file("/dev/urandom", 1024)) #else if (1) #endif { /* if /dev/urandom does not exist we need to do at least some pertubations to seed the OpenSSL PRNG */ char buf[1024]; RAND_seed(buf, sizeof(buf)); #ifdef HAVE_RANDOM srandom((unsigned long)time(NULL)); #else srand((unsigned int)time(NULL)); #endif do { #ifdef HAVE_RANDOM long r = random(); /* we actually do no use random() anywhere, except to help seed the OpenSSL PRNG */ RAND_seed(&r, sizeof(long)); #else int r = rand(); /* we actually do no use rand() anywhere, except to help seed the OpenSSL PRNG */ RAND_seed(&r, sizeof(int)); #endif } while (!RAND_status()); } #endif #ifdef WITH_GNUTLS # if GNUTLS_VERSION_NUMBER < 0x020b00 # if defined(HAVE_PTHREAD_H) gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread); # elif defined(HAVE_PTH_H) gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pth); # endif gcry_control(GCRYCTL_ENABLE_QUICK_RANDOM, 0); gcry_control(GCRYCTL_DISABLE_SECMEM, 0); gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); /* libgcrypt init done */ # endif # if GNUTLS_VERSION_NUMBER < 0x030300 gnutls_global_init(); # endif #endif } } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) SOAP_FMAC1 void SOAP_FMAC2 soap_ssl_noinit() { /* Call this first to bypass SSL init is SSL is already initialized elsewhere */ soap_ssl_init_done = 1; } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) SOAP_FMAC1 const char * SOAP_FMAC2 soap_ssl_error(struct soap *soap, int ret, int err) { #ifdef WITH_OPENSSL const char *msg = soap_code_str(h_ssl_error_codes, err); if (!msg) return ERR_error_string(err, soap->msgbuf); (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(msg) + 1), "%s\n", msg); if (ERR_peek_error()) { unsigned long r; while ((r = ERR_get_error())) { size_t l = strlen(soap->msgbuf); ERR_error_string_n(r, soap->msgbuf + l, sizeof(soap->msgbuf) - l); l = strlen(soap->msgbuf); if (l + 1 < sizeof(soap->msgbuf)) { soap->msgbuf[l++] = '\n'; soap->msgbuf[l] = '\0'; } if (ERR_GET_REASON(r) == SSL_R_CERTIFICATE_VERIFY_FAILED && l < sizeof(soap->msgbuf)) { const char *s = X509_verify_cert_error_string(SSL_get_verify_result(soap->ssl)); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, strlen(s)), "%s", s); } } } else { size_t l = strlen(soap->msgbuf); switch (ret) { case 0: soap_strcpy(soap->msgbuf + l, sizeof(soap->msgbuf) - l, "EOF was observed that violates the SSL/TLS protocol. The client probably provided invalid authentication information."); break; case -1: { const char *s = strerror(soap_errno); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, strlen(s) + 42), "Error observed by underlying SSL/TLS BIO: %s", s); } break; } } ERR_clear_error(); return soap->msgbuf; #endif #ifdef WITH_GNUTLS (void)soap; (void)err; return gnutls_strerror(ret); #endif } #endif /******************************************************************************/ #ifdef WITH_SYSTEMSSL static int ssl_recv(int sk, void *s, int n, char *user) { (void)user; return recv(sk, s, n, 0); } #endif /******************************************************************************/ #ifdef WITH_SYSTEMSSL static int ssl_send(int sk, void *s, int n, char *user) { (void)user; return send(sk, s, n, 0); } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) static int ssl_auth_init(struct soap *soap) { #ifdef WITH_OPENSSL #if OPENSSL_VERSION_NUMBER >= 0x10101000L int minv = 0, maxv = 0; #endif long flags = SSL_OP_ALL; int mode; #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) EVP_PKEY* pkey; /* vxWorks compatible */ #endif if (!soap_ssl_init_done) soap_ssl_init(); ERR_clear_error(); if (!soap->ctx) { #if OPENSSL_VERSION_NUMBER >= 0x10100000L /* TLS_method: a TLS/SSL connection established may understand the SSLv3, TLSv1, TLSv1.1 and TLSv1.2 protocols. */ soap->ctx = SSL_CTX_new(TLS_method()); #else /* SSLv23_method: a TLS/SSL connection established may understand the SSLv3, TLSv1, TLSv1.1 and TLSv1.2 protocols. */ soap->ctx = SSL_CTX_new(SSLv23_method()); #endif if (!soap->ctx) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't setup context", SOAP_SSL_ERROR); /* The following alters the behavior of SSL read/write: */ #if 0 SSL_CTX_set_mode(soap->ctx, SSL_MODE_ENABLE_PARTIAL_WRITE | SSL_MODE_AUTO_RETRY); #endif } if (soap->randfile) { if (!RAND_load_file(soap->randfile, -1)) return soap_set_receiver_error(soap, "SSL/TLS 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/TLS error", "Can't read CA PEM file", 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/TLS error", "Can't read default CA PEM file and/or directory", SOAP_SSL_ERROR); } if (soap->crlfile) { if (soap_ssl_crl(soap, soap->crlfile)) return soap->error; } /* This code assumes a typical scenario with key and cert in one PEM file, see alternative code below */ #if 1 if (soap->keyfile) { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't find or read certificate in private key PEM 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); } #ifndef WM_SECURE_KEY_STORAGE if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read private key PEM file", SOAP_SSL_ERROR); #endif } #else /* Suggested alternative approach to check the key file for cert only when 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) { if (soap->keyfile) { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't find or read certificate in private key PEM file", SOAP_SSL_ERROR); if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read private key PEM file", SOAP_SSL_ERROR); } } else /* use cafile for (server) cert and keyfile for (server) key */ { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->cafile)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CA PEM file", SOAP_SSL_ERROR); if (soap->keyfile) if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read private key PEM file", SOAP_SSL_ERROR); } #endif #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) /* vxWorks compatible */ pkey = ipcom_key_db_pkey_get(soap->keyid); if (!pkey) return soap_set_receiver_error(soap, "SSL error", "Can't find key", SOAP_SSL_ERROR); if (!SSL_CTX_use_PrivateKey(soap->ctx, pkey)) return soap_set_receiver_error(soap, "SSL error", "Can't read key", SOAP_SSL_ERROR); #endif if ((soap->ssl_flags & SOAP_SSL_RSA)) { #if OPENSSL_VERSION_NUMBER >= 0x10002000L if (SSL_CTX_need_tmp_RSA(soap->ctx)) { unsigned long e = RSA_F4; BIGNUM *bne = BN_new(); RSA *rsa = RSA_new(); if (!bne || !rsa || !BN_set_word(bne, e) || !RSA_generate_key_ex(rsa, SOAP_SSL_RSA_BITS, bne, NULL) || !SSL_CTX_set_tmp_rsa(soap->ctx, rsa)) { if (bne) BN_free(bne); if (rsa) RSA_free(rsa); return soap_set_receiver_error(soap, "SSL/TLS error", "Can't generate RSA key", SOAP_SSL_ERROR); } BN_free(bne); RSA_free(rsa); } #else RSA *rsa = RSA_generate_key(SOAP_SSL_RSA_BITS, RSA_F4, NULL, NULL); if (!rsa || !SSL_CTX_set_tmp_rsa(soap->ctx, rsa)) { if (rsa) RSA_free(rsa); return soap_set_receiver_error(soap, "SSL/TLS error", "Can't generate RSA key", SOAP_SSL_ERROR); } RSA_free(rsa); #endif } else if (soap->dhfile) { DH *dh = NULL; char *s; int n = (int)soap_strtoul(soap->dhfile, &s, 10); /* if dhfile is numeric, treat it as a key length to generate DH params which can take a while */ if (n >= 512 && s && *s == '\0') { #if OPENSSL_VERSION_NUMBER >= 0x10002000L dh = DH_new(); if (!DH_generate_parameters_ex(dh, n, 2/*or 5*/, NULL)) { DH_free(dh); return soap_set_receiver_error(soap, "SSL/TLS error", "Can't generate DH parameters", SOAP_SSL_ERROR); } #elif defined(VXWORKS) dh = DH_new(); DH_generate_parameters_ex(dh, n, 2/*or 5*/, NULL); #else dh = DH_generate_parameters(n, 2/*or 5*/, NULL, NULL); #endif } else { BIO *bio; bio = BIO_new_file(soap->dhfile, "r"); if (!bio) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read DH PEM file", SOAP_SSL_ERROR); dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL); BIO_free(bio); } if (!dh || DH_check(dh, &n) != 1 || SSL_CTX_set_tmp_dh(soap->ctx, dh) < 0) { if (dh) DH_free(dh); return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set DH parameters", SOAP_SSL_ERROR); } DH_free(dh); } /* enable all TSLv1 protocols and disable SSLv3 by default if no SSL/TLS flags are set */ if ((soap->ssl_flags & SOAP_SSLv3_TLSv1) == 0) soap->ssl_flags |= SOAP_TLSv1; #if OPENSSL_VERSION_NUMBER >= 0x10101000L if ((soap->ssl_flags & SOAP_SSLv3)) minv = SSL3_VERSION; else if ((soap->ssl_flags & SOAP_TLSv1_0)) minv = TLS1_VERSION; else if ((soap->ssl_flags & SOAP_TLSv1_1)) minv = TLS1_1_VERSION; else if ((soap->ssl_flags & SOAP_TLSv1_2)) minv = TLS1_2_VERSION; else if ((soap->ssl_flags & SOAP_TLSv1_3)) minv = TLS1_3_VERSION; if ((soap->ssl_flags & SOAP_TLSv1_3) && OpenSSL_version_num() >= 0x10101000L) maxv = TLS1_3_VERSION; else if ((soap->ssl_flags & SOAP_TLSv1_2)) maxv = TLS1_2_VERSION; else if ((soap->ssl_flags & SOAP_TLSv1_1)) maxv = TLS1_1_VERSION; else if ((soap->ssl_flags & SOAP_TLSv1_0)) maxv = TLS1_VERSION; else maxv = SSL3_VERSION; if (!SSL_CTX_set_min_proto_version(soap->ctx, minv) || !SSL_CTX_set_max_proto_version(soap->ctx, maxv)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set protocol version", SOAP_SSL_ERROR); #else /* disable SSL v2 by default and enable specific protos */ flags = SSL_OP_NO_SSLv2; if (!(soap->ssl_flags & SOAP_SSLv3)) flags |= SSL_OP_NO_SSLv3; #if OPENSSL_VERSION_NUMBER >= 0x10001000L if (!(soap->ssl_flags & SOAP_TLSv1_0)) flags |= SSL_OP_NO_TLSv1; if (!(soap->ssl_flags & SOAP_TLSv1_1)) flags |= SSL_OP_NO_TLSv1_1; if (!(soap->ssl_flags & SOAP_TLSv1_2)) flags |= SSL_OP_NO_TLSv1_2; #endif #endif #ifdef SSL_OP_NO_TICKET /* TLS extension is enabled by default in OPENSSL v0.9.8k disable it by */ flags |= SSL_OP_NO_TICKET; #endif 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 #endif #ifdef WITH_GNUTLS int ret; char priority[80]; soap_strcpy(priority, sizeof(priority), "PERFORMANCE"); if (!soap_ssl_init_done) soap_ssl_init(); if (!soap->xcred) { if (gnutls_certificate_allocate_credentials(&soap->xcred) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't allocate credentials or trust", SOAP_SSL_ERROR); #if GNUTLS_VERSION_NUMBER >= 0x030300 gnutls_certificate_set_x509_system_trust(soap->xcred); #endif if (soap->cafile) { if (gnutls_certificate_set_x509_trust_file(soap->xcred, soap->cafile, GNUTLS_X509_FMT_PEM) < 0) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CA PEM file", SOAP_SSL_ERROR); } if (soap->crlfile) { if (soap_ssl_crl(soap, soap->crlfile)) return soap->error; } if (soap->keyfile) { if (gnutls_certificate_set_x509_key_file2(soap->xcred, soap->keyfile, soap->keyfile, GNUTLS_X509_FMT_PEM, soap->password, GNUTLS_PKCS_PKCS12_3DES | GNUTLS_PKCS_PKCS12_ARCFOUR | GNUTLS_PKCS_PKCS12_RC2_40 | GNUTLS_PKCS_PBES2_AES_128 | GNUTLS_PKCS_PBES2_AES_192 | GNUTLS_PKCS_PBES2_AES_256 | GNUTLS_PKCS_PBES2_DES) < 0) /* Assumes that key and cert(s) are concatenated in the keyfile and the key is encrypted with one of these algorithms */ return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read private key PEM file", SOAP_SSL_ERROR); } } if ((soap->ssl_flags & SOAP_SSL_CLIENT)) { gnutls_init(&soap->session, GNUTLS_CLIENT); if (soap->cafile || soap->crlfile || soap->keyfile) { ret = gnutls_priority_set_direct(soap->session, "PERFORMANCE", NULL); if (ret != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, soap_ssl_error(soap, ret, 0), "SSL/TLS set priority error", SOAP_SSL_ERROR); gnutls_credentials_set(soap->session, GNUTLS_CRD_CERTIFICATE, soap->xcred); } else { if (!soap->acred) gnutls_anon_allocate_client_credentials(&soap->acred); ret = gnutls_priority_set_direct(soap->session, "PERFORMANCE:+ANON-DH:!ARCFOUR-128", NULL); if (ret != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, soap_ssl_error(soap, ret, 0), "SSL/TLS set priority error", SOAP_SSL_ERROR); gnutls_credentials_set(soap->session, GNUTLS_CRD_ANON, soap->acred); } } else if (!soap->keyfile) { return soap_set_receiver_error(soap, "SSL/TLS error", "No key file: anonymous server authentication not supported in this release", SOAP_SSL_ERROR); } else { #if GNUTLS_VERSION_NUMBER < 0x030300 int protocol_priority[] = { 0, 0, 0, 0, 0 }; int *protocol = protocol_priority; if ((soap->ssl_flags & SOAP_SSL_RSA) && soap->rsa_params) gnutls_certificate_set_rsa_export_params(soap->xcred, soap->rsa_params); #endif if (!(soap->ssl_flags & SOAP_SSL_RSA) && soap->dh_params) gnutls_certificate_set_dh_params(soap->xcred, soap->dh_params); if (!soap->cache) gnutls_priority_init(&soap->cache, "NORMAL", NULL); gnutls_init(&soap->session, GNUTLS_SERVER); gnutls_priority_set(soap->session, soap->cache); gnutls_credentials_set(soap->session, GNUTLS_CRD_CERTIFICATE, soap->xcred); if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) gnutls_certificate_server_set_request(soap->session, GNUTLS_CERT_REQUEST); gnutls_session_enable_compatibility_mode(soap->session); /* enable all TSLv1 protocols and disable SSLv3 by default if no SSL/TLS flags are set */ if ((soap->ssl_flags & SOAP_SSLv3_TLSv1) == 0) soap->ssl_flags |= SOAP_TLSv1; #if GNUTLS_VERSION_NUMBER < 0x030300 if ((soap->ssl_flags & SOAP_SSLv3)) *protocol++ = GNUTLS_SSL3; if ((soap->ssl_flags & SOAP_TLSv1_0)) *protocol++ = GNUTLS_TLS1_0; if ((soap->ssl_flags & SOAP_TLSv1_1)) *protocol++ = GNUTLS_TLS1_1; if ((soap->ssl_flags & SOAP_TLSv1_2)) *protocol++ = GNUTLS_TLS1_2; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set protocol", SOAP_SSL_ERROR); #else soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "NORMAL:+VERS-ALL"); if (!(soap->ssl_flags & SOAP_TLSv1_0)) soap_strcat(soap->tmpbuf, sizeof(soap->tmpbuf), ":-VERS-TLS1.0"); if (!(soap->ssl_flags & SOAP_TLSv1_1)) soap_strcat(soap->tmpbuf, sizeof(soap->tmpbuf), ":-VERS-TLS1.1"); if (!(soap->ssl_flags & SOAP_TLSv1_2)) soap_strcat(soap->tmpbuf, sizeof(soap->tmpbuf), ":-VERS-TLS1.2"); if (gnutls_priority_set_direct(soap->session, soap->tmpbuf, NULL) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set protocol priority", SOAP_SSL_ERROR); #endif } #endif #ifdef WITH_SYSTEMSSL if (!soap->ctx) { int err; err = gsk_environment_open(&soap->ctx); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_SSLV2, GSK_PROTOCOL_SSLV2_OFF); /* enable all TSLv1 protocols and disable SSLv3 by default if no SSL/TLS flags are set */ if ((soap->ssl_flags & SOAP_SSLv3_TLSv1) == 0) soap->ssl_flags |= SOAP_TLSv1; if (err == GSK_OK) { if ((soap->ssl_flags & SOAP_SSLv3)) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_SSLV3, GSK_PROTOCOL_SSLV3_ON); else err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_SSLV3, GSK_PROTOCOL_SSLV3_OFF); } if (err == GSK_OK) { if ((soap->ssl_flags & SOAP_TLSv1_0)) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_ON); else err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_OFF); } if (err == GSK_OK) { if ((soap->ssl_flags & SOAP_TLSv1_1)) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_1_ON); else err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_1_OFF); } if (err == GSK_OK) { if ((soap->ssl_flags & SOAP_TLSv1_2)) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_2_ON); else err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_2_OFF); } if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ctx, GSK_KEYRING_FILE, soap->keyfile, 0); /* keyfile is a keyring .kdb file */ if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ctx, GSK_KEYRING_PW, soap->password, 0); /* locked by password */ if (err == GSK_OK) err = gsk_environment_init(soap->ctx); if (err != GSK_OK) return soap_set_receiver_error(soap, gsk_strerror(err), "SYSTEM SSL error in ssl_auth_init()", SOAP_SSL_ERROR); } #endif return SOAP_OK; } #endif /******************************************************************************/ #ifdef WITH_OPENSSL static int ssl_password(char *buf, int num, int rwflag, void *userdata) { (void)rwflag; if (!buf || !userdata) return 0; soap_strcpy(buf, (size_t)num, (char*)userdata); return (int)strlen(buf); } #endif /******************************************************************************/ #ifdef WITH_OPENSSL static int ssl_verify_callback(int ok, X509_STORE_CTX *store) { (void)store; #ifdef SOAP_DEBUG if (!ok) { char buf[1024]; int err = X509_STORE_CTX_get_error(store); X509 *cert = X509_STORE_CTX_get_current_cert(store); fprintf(stderr, "\nDEBUG mode TLS/SSL warnings:\nSSL verify error %d or warning with certificate at depth %d: %s\n", err, X509_STORE_CTX_get_error_depth(store), X509_verify_cert_error_string(err)); X509_NAME_oneline(X509_get_issuer_name(cert), buf, sizeof(buf)-1); fprintf(stderr, " certificate issuer: %s\n", buf); X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)-1); fprintf(stderr, " certificate subject: %s\n", buf); /* accept self-signed certificates and certificates out of date */ switch (err) { case X509_V_ERR_CERT_NOT_YET_VALID: case X509_V_ERR_CERT_HAS_EXPIRED: case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: case X509_V_ERR_UNABLE_TO_GET_CRL: case X509_V_ERR_CRL_NOT_YET_VALID: case X509_V_ERR_CRL_HAS_EXPIRED: X509_STORE_CTX_set_error(store, X509_V_OK); ok = 1; fprintf(stderr, "Initialize soap_ssl_client_context with SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE to allow this verification error to pass without DEBUG mode enabled\n"); } } #endif /* Note: return 1 to try to continue, but unsafe progress will be terminated by OpenSSL */ return ok; } #endif /******************************************************************************/ #ifdef WITH_OPENSSL static int ssl_verify_callback_allow_expired_certificate(int ok, X509_STORE_CTX *store) { ok = ssl_verify_callback(ok, store); if (!ok) { /* accept self signed certificates, expired certificates, and certficiates w/o CRL */ switch (X509_STORE_CTX_get_error(store)) { case X509_V_ERR_CERT_NOT_YET_VALID: case X509_V_ERR_CERT_HAS_EXPIRED: case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: case X509_V_ERR_UNABLE_TO_GET_CRL: case X509_V_ERR_CRL_NOT_YET_VALID: case X509_V_ERR_CRL_HAS_EXPIRED: 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 /******************************************************************************/ #ifdef WITH_GNUTLS static const char * ssl_verify(struct soap *soap, const char *host) { unsigned int status; const char *err = NULL; int r = gnutls_certificate_verify_peers2(soap->session, &status); if (r < 0) err = "Certificate verify error"; else if ((status & GNUTLS_CERT_INVALID)) err = "The certificate is not trusted"; else if ((status & GNUTLS_CERT_SIGNER_NOT_FOUND)) err = "The certificate hasn't got a known issuer"; else if ((status & GNUTLS_CERT_REVOKED)) err = "The certificate has been revoked"; else if (gnutls_certificate_type_get(soap->session) == GNUTLS_CRT_X509) { gnutls_x509_crt_t cert; const gnutls_datum_t *cert_list; unsigned int cert_list_size; if (gnutls_x509_crt_init(&cert) < 0) err = "Could not get X509 certificates"; else if ((cert_list = gnutls_certificate_get_peers(soap->session, &cert_list_size)) == NULL) err = "Could not get X509 certificates"; else if (gnutls_x509_crt_import(cert, &cert_list[0], GNUTLS_X509_FMT_DER) < 0) err = "Error parsing X509 certificate"; else if (!(soap->ssl_flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) && gnutls_x509_crt_get_expiration_time(cert) < time(NULL)) err = "The certificate has expired"; else if (!(soap->ssl_flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) && gnutls_x509_crt_get_activation_time(cert) > time(NULL)) err = "The certificate is not yet activated"; else if (host && !(soap->ssl_flags & SOAP_SSL_SKIP_HOST_CHECK)) { if (!gnutls_x509_crt_check_hostname(cert, host)) err = "Certificate host name mismatch"; } gnutls_x509_crt_deinit(cert); } return err; } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef WITH_NOIO SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_accept(struct soap *soap) { SOAP_SOCKET sk = soap->socket; #ifdef WITH_OPENSSL BIO *bio; int err = SSL_ERROR_NONE; int retries, r, s; ERR_clear_error(); if (!soap_valid_socket(sk)) return soap_set_receiver_error(soap, "SSL/TLS error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR); soap->ssl_flags &= ~SOAP_SSL_CLIENT; if (!soap->ctx && (soap->error = soap->fsslauth(soap)) != SOAP_OK) return soap_closesock(soap); if (!soap->ssl) { soap->ssl = SSL_new(soap->ctx); if (!soap->ssl) { soap_closesock(soap); return soap_set_receiver_error(soap, "SSL/TLS error", "SSL_new() failed in soap_ssl_accept()", SOAP_SSL_ERROR); } } else { SSL_clear(soap->ssl); } bio = BIO_new_socket((int)sk, BIO_NOCLOSE); SSL_set_bio(soap->ssl, bio, bio); /* Default timeout: 10 sec retries, 100 times 0.1 sec */ retries = 100; if (soap->recv_timeout || soap->send_timeout) { int t = soap->recv_timeout > soap->send_timeout ? soap->recv_timeout : soap->send_timeout; if (t > 0) retries = 10 * t; else if (t > -100000) retries = 1; else retries = t/-100000; } SOAP_SOCKNONBLOCK(sk) while ((r = SSL_accept(soap->ssl)) <= 0) { err = SSL_get_error(soap->ssl, r); if (err == SSL_ERROR_WANT_ACCEPT || err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) { if (err == SSL_ERROR_WANT_READ) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; } else { soap->errnum = soap_socket_errno(sk); break; } if (retries-- <= 0) break; } if (!soap->recv_timeout && !soap->send_timeout) SOAP_SOCKBLOCK(sk) if (r <= 0) { soap_set_receiver_error(soap, soap_ssl_error(soap, r, err), "SSL_accept() failed in soap_ssl_accept()", SOAP_SSL_ERROR); return soap_closesock(soap); } 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/TLS error", "No SSL certificate was presented by the peer in soap_ssl_accept()", SOAP_SSL_ERROR); } X509_free(peer); } #endif #ifdef WITH_GNUTLS int retries, r, s; if (!soap_valid_socket(sk)) return soap_set_receiver_error(soap, "SSL/TLS error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR); soap->ssl_flags &= ~SOAP_SSL_CLIENT; if (!soap->session && (soap->error = soap->fsslauth(soap)) != SOAP_OK) return soap_closesock(soap); gnutls_transport_set_ptr(soap->session, (gnutls_transport_ptr_t)(long)sk); /* default timeout: 10 sec retries, 100 times 0.1 sec */ retries = 100; if (soap->recv_timeout || soap->send_timeout) { int t = soap->recv_timeout > soap->send_timeout ? soap->recv_timeout : soap->send_timeout; if (t > 0) retries = 10 * t; else if (t > -100000) retries = 1; else retries = t/-100000; } SOAP_SOCKNONBLOCK(sk) while ((r = gnutls_handshake(soap->session))) { /* GNUTLS repeat handhake when GNUTLS_E_AGAIN */ if (r == GNUTLS_E_AGAIN || r == GNUTLS_E_INTERRUPTED) { if (!gnutls_record_get_direction(soap->session)) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; } else { soap->errnum = soap_socket_errno(sk); break; } if (retries-- <= 0) break; } if (!soap->recv_timeout && !soap->send_timeout) SOAP_SOCKBLOCK(sk) if (r) { soap_set_receiver_error(soap, soap_ssl_error(soap, r, 0), "SSL/TLS handshake failed", SOAP_SSL_ERROR); return soap_closesock(soap); } if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) { const char *err = ssl_verify(soap, NULL); if (err) { soap_closesock(soap); return soap_set_receiver_error(soap, "SSL/TLS error", err, SOAP_SSL_ERROR); } } #endif #ifdef WITH_SYSTEMSSL gsk_iocallback local_io = { ssl_recv, ssl_send, NULL, NULL, NULL, NULL }; int retries, r, s; if (!soap_valid_socket(sk)) return soap_set_receiver_error(soap, "SSL/TLS error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR); soap->ssl_flags &= ~SOAP_SSL_CLIENT; /* default timeout: 10 sec retries, 100 times 0.1 sec */ retries = 100; if (soap->recv_timeout || soap->send_timeout) { int t = soap->recv_timeout > soap->send_timeout ? soap->recv_timeout : soap->send_timeout; if (t > 0) retries = 10 * t; else if (t > -100000) retries = 1; else retries = t/-100000; } SOAP_SOCKNONBLOCK(sk) r = gsk_secure_socket_open(soap->ctx, &soap->ssl); if (r == GSK_OK) r = gsk_attribute_set_numeric_value(soap->ssl, GSK_FD, sk); if (r == GSK_OK) r = gsk_attribute_set_buffer(soap->ssl, GSK_KEYRING_LABEL, soap->cafile, 0); if (r == GSK_OK) r = gsk_attribute_set_enum(soap->ssl, GSK_SESSION_TYPE, GSK_SERVER_SESSION); if (r == GSK_OK) r = gsk_attribute_set_buffer(soap->ssl, GSK_V3_CIPHER_SPECS_EXPANDED, "0035002F000A", 0); if (r == GSK_OK) r = gsk_attribute_set_enum(soap->ssl, GSK_V3_CIPHERS, GSK_V3_CIPHERS_CHAR4); if (r == GSK_OK) r = gsk_attribute_set_callback(soap->ssl, GSK_IO_CALLBACK, &local_io); if (r != GSK_OK) return soap_set_receiver_error(soap, gsk_strerror(r), "SYSTEM SSL error in soap_ssl_accept()", SOAP_SSL_ERROR); while ((r = gsk_secure_socket_init(soap->ssl)) != GSK_OK) { if (r == GSK_WOULD_BLOCK_READ || r == GSK_WOULD_BLOCK_WRITE) { if (r == GSK_WOULD_BLOCK_READ) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; } else { soap->errnum = soap_socket_errno(sk); break; } if (retries-- <= 0) break; } if (!soap->recv_timeout && !soap->send_timeout) SOAP_SOCKBLOCK(sk) if (r != GSK_OK) { soap_set_receiver_error(soap, gsk_strerror(r), "gsk_secure_socket_init() failed in soap_ssl_accept()", SOAP_SSL_ERROR); return soap_closesock(soap); } #endif soap->imode |= SOAP_ENC_SSL; soap->omode |= SOAP_ENC_SSL; return SOAP_OK; } #endif #endif /******************************************************************************\ * * TCP/UDP [SSL/TLS] IPv4 and IPv6 * \******************************************************************************/ #ifndef WITH_NOIO 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 /******************************************************************************/ #ifndef WITH_NOIO static const char* tcp_error(struct soap *soap) { 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 { (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), 37), "TCP/UDP IP error %d", soap->errnum); msg = soap->msgbuf; } } } return msg; } #endif /******************************************************************************/ #if !defined(WITH_IPV6) || defined(WITH_COOKIES) #ifndef WITH_NOIO static int tcp_gethostbyname(struct soap *soap, const char *addr, struct hostent *hostent, struct in_addr *inaddr) { #if (defined(_AIX43) || defined(TRU64) || defined(HP_UX)) && defined(HAVE_GETHOSTBYNAME_R) struct hostent_data ht_data; #elif (!defined(__GLIBC__) || !defined(_GNU_SOURCE) || (!_GNU_SOURCE && !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || defined(__ANDROID__) || defined(FREEBSD) || defined(__FreeBSD__)) && defined(HAVE_GETHOSTBYNAME_R) int r; char *tmpbuf = soap->tmpbuf; size_t tmplen = sizeof(soap->tmpbuf); #elif defined(HAVE_GETHOSTBYNAME_R) char *tmpbuf = soap->tmpbuf; size_t tmplen = sizeof(soap->tmpbuf); #endif #ifdef VXWORKS int hostint; /* vxWorks compatible */ #endif if (inaddr) { soap_int32 iadd = -1; #ifdef AS400 iadd = inet_addr((void*)addr); #else iadd = inet_addr((char*)addr); #endif if (iadd != -1) { if (soap_memcpy((void*)inaddr, sizeof(struct in_addr), (const void*)&iadd, sizeof(iadd))) return soap->error = SOAP_EOM; return SOAP_OK; } } #if (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) { hostent = NULL; soap->errnum = h_errno; } #elif (!defined(__GLIBC__) || !defined(_GNU_SOURCE) || (!_GNU_SOURCE && !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || defined(__ANDROID__) || defined(FREEBSD) || defined(__FreeBSD__)) && defined(HAVE_GETHOSTBYNAME_R) while ((r = gethostbyname_r(addr, hostent, tmpbuf, tmplen, &hostent, &soap->errnum)) < 0) { if (tmpbuf != soap->tmpbuf) SOAP_FREE(soap, tmpbuf); if (r != SOAP_ERANGE) { hostent = NULL; break; } tmplen *= 2; tmpbuf = (char*)SOAP_MALLOC(soap, tmplen); if (!tmpbuf) break; } #elif defined(HAVE_GETHOSTBYNAME_R) hostent = gethostbyname_r(addr, hostent, tmpbuf, tmplen, &soap->errnum); #elif defined(VXWORKS) /* vxWorks compatible */ /* 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) { hostent = NULL; soap->errnum = soap_errno; } #else #ifdef AS400 hostent = gethostbyname((void*)addr); #else hostent = gethostbyname((char*)addr); #endif if (!hostent) soap->errnum = h_errno; #endif if (!hostent) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Host name not found\n")); return SOAP_ERR; } if (inaddr) { #ifdef VXWORKS inaddr->s_addr = hostint; /* vxWorks compatible */ #else if (soap_memcpy((void*)inaddr, sizeof(struct in_addr), (const void*)hostent->h_addr, (size_t)hostent->h_length)) { #if (!defined(__GLIBC__) || !defined(_GNU_SOURCE) || (!_GNU_SOURCE && !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || defined(__ANDROID__) || defined(FREEBSD) || defined(__FreeBSD__)) && defined(HAVE_GETHOSTBYNAME_R) if (tmpbuf && tmpbuf != soap->tmpbuf) SOAP_FREE(soap, tmpbuf); #endif return soap->error = SOAP_EOM; } #endif } #if (!defined(__GLIBC__) || !defined(_GNU_SOURCE) || (!_GNU_SOURCE && !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || defined(__ANDROID__) || defined(FREEBSD) || defined(__FreeBSD__)) && defined(HAVE_GETHOSTBYNAME_R) if (tmpbuf && tmpbuf != soap->tmpbuf) SOAP_FREE(soap, tmpbuf); #endif return SOAP_OK; } #endif #endif /******************************************************************************/ #if !defined(WITH_IPV6) #ifndef WITH_NOIO static int tcp_gethost(struct soap *soap, const char *addr, struct in_addr *inaddr) { struct hostent hostent; return tcp_gethostbyname(soap, addr, &hostent, inaddr); } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO 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 sk; int err = 0; #ifndef WITH_LEAN int set = 1; #endif #if !defined(WITH_LEAN) || defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) int retries; #endif soap->errnum = 0; soap->errmode = 0; if (soap_valid_socket(soap->socket)) { if ((soap->omode & SOAP_IO_UDP) && soap->socket == soap->master) { #ifdef IP_MULTICAST_TTL #ifndef WITH_IPV6 soap->errmode = 2; if (soap->fresolve(soap, host, &soap->peer.in.sin_addr)) { soap_set_receiver_error(soap, tcp_error(soap), "get host by name failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, soap->socket); return soap->socket = SOAP_INVALID_SOCKET; } soap->peer.in.sin_port = htons((short)port); soap->errmode = 0; #else if (getaddrinfo(host, soap_int2s(soap, port), &hints, &res) || !res) { soap_set_receiver_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, soap->socket); return soap->socket = SOAP_INVALID_SOCKET; } if (soap_memcpy((void*)&soap->peer.storage, sizeof(soap->peer.storage), (const void*)res->ai_addr, res->ai_addrlen)) { soap->error = SOAP_EOM; soap->fclosesocket(soap, soap->socket); freeaddrinfo(res); return soap->socket = SOAP_INVALID_SOCKET; } soap->peerlen = res->ai_addrlen; freeaddrinfo(res); #endif if (soap->ipv4_multicast_ttl) { unsigned char ttl = soap->ipv4_multicast_ttl; if (setsockopt(soap->socket, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl, sizeof(ttl))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_TTL failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, soap->socket); return soap->socket = SOAP_INVALID_SOCKET; } } if (soap->ipv4_multicast_if && !soap->ipv6_multicast_if) { if (setsockopt(soap->socket, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) #ifndef WINDOWS { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, soap->socket); return soap->socket = SOAP_INVALID_SOCKET; } #else #ifndef IP_MULTICAST_IF #define IP_MULTICAST_IF 2 #endif if (setsockopt(soap->socket, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, soap->socket); return soap->socket = SOAP_INVALID_SOCKET; } #endif } #endif return soap->socket; } soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; } if (tcp_init(soap)) { soap_set_receiver_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 || !res) { soap_set_receiver_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in tcp_connect()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } ressave = res; again: sk = soap->socket = socket(res->ai_family, res->ai_socktype, res->ai_protocol); soap->error = SOAP_OK; soap->errmode = 0; #else #ifndef WITH_LEAN again: #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) sk = soap->socket = socket(AF_INET, SOCK_DGRAM, 0); else #endif sk = soap->socket = socket(AF_INET, SOCK_STREAM, 0); #endif if (!soap_valid_socket(sk)) { #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } #endif soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "socket failed in tcp_connect()", SOAP_TCP_ERROR); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #ifdef WITH_SOCKET_CLOSE_ON_EXIT #ifdef WIN32 #ifndef UNDER_CE SetHandleInformation((HANDLE)sk, HANDLE_FLAG_INHERIT, 0); #endif #else fcntl(sk, 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(sk, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_LINGER failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return soap->socket = SOAP_INVALID_SOCKET; } } if ((soap->connect_flags & ~SO_LINGER) && setsockopt(sk, SOL_SOCKET, soap->connect_flags & ~SO_LINGER, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #ifndef UNDER_CE if ((soap->keep_alive || soap->tcp_keep_alive) && setsockopt(sk, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } if (soap->sndbuf > 0 && setsockopt(sk, SOL_SOCKET, SO_SNDBUF, (char*)&soap->sndbuf, sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } if (soap->rcvbuf > 0 && setsockopt(sk, SOL_SOCKET, SO_RCVBUF, (char*)&soap->rcvbuf, sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #ifdef TCP_KEEPIDLE if (soap->tcp_keep_idle && setsockopt(sk, IPPROTO_TCP, TCP_KEEPIDLE, (char*)&(soap->tcp_keep_idle), sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_KEEPIDLE failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #endif #ifdef TCP_KEEPINTVL if (soap->tcp_keep_intvl && setsockopt(sk, IPPROTO_TCP, TCP_KEEPINTVL, (char*)&(soap->tcp_keep_intvl), sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_KEEPINTVL failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #endif #ifdef TCP_KEEPCNT if (soap->tcp_keep_cnt && setsockopt(sk, IPPROTO_TCP, TCP_KEEPCNT, (char*)&(soap->tcp_keep_cnt), sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_KEEPCNT failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #endif #ifdef TCP_NODELAY if (!(soap->omode & SOAP_IO_UDP) && setsockopt(sk, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = 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; } #endif #endif #ifdef IP_MULTICAST_TTL if ((soap->omode & SOAP_IO_UDP)) { if (soap->ipv4_multicast_ttl) { unsigned char ttl = soap->ipv4_multicast_ttl; if (setsockopt(sk, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl, sizeof(ttl))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_TTL failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } } if ((soap->omode & SOAP_IO_UDP) && soap->ipv4_multicast_if && !soap->ipv6_multicast_if) { if (setsockopt(sk, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) #ifndef WINDOWS { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #else #ifndef IP_MULTICAST_IF #define IP_MULTICAST_IF 2 #endif if (setsockopt(sk, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #endif } } #endif #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Opening socket=%d to host='%s' port=%d\n", (int)sk, host, port)); #ifndef WITH_IPV6 soap->peerlen = sizeof(soap->peer.in); memset((void*)&soap->peer.in, 0, sizeof(soap->peer.in)); soap->peer.in.sin_family = AF_INET; #ifndef WIN32 if (soap->client_addr) { struct sockaddr_in addr; memset((void*)&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; if (soap->client_port >= 0) addr.sin_port = htons(soap->client_port); if (inet_pton(AF_INET, soap->client_addr, (void*)&addr.sin_addr) != 1 || bind(sk, (struct sockaddr*)&addr, sizeof(addr))) { soap->errnum = soap_socket_errno(sk); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind before connect\n")); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); soap->client_addr = NULL; soap->client_port = -1; return soap->socket = SOAP_INVALID_SOCKET; } soap->client_addr = NULL; /* disable bind before connect, so need to set it again before the next connect */ soap->client_port = -1; /* disable bind before connect, so need to set it again before the next connect */ } else #endif if (soap->client_port >= 0) { struct sockaddr_in addr; memset((void*)&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(soap->client_port); if (bind(sk, (struct sockaddr*)&addr, sizeof(addr))) { soap->errnum = soap_socket_errno(sk); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind before connect\n")); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); soap->client_port = -1; return soap->socket = SOAP_INVALID_SOCKET; } soap->client_port = -1; /* disable bind before connect, so need to set it again before the next connect */ } #ifndef WIN32 if (soap->client_interface) { if (inet_pton(AF_INET, soap->client_interface, &soap->peer.in.sin_addr) != 1) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "inet_pton() failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); soap->client_interface = NULL; return soap->socket = SOAP_INVALID_SOCKET; } soap->client_interface = NULL; /* disable client interface, so need to set it again before the next connect */ } #endif soap->errmode = 2; if (soap->proxy_host) { if (soap->fresolve(soap, soap->proxy_host, &soap->peer.in.sin_addr)) { soap_set_receiver_error(soap, tcp_error(soap), "get proxy host by name failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } soap->peer.in.sin_port = htons((short)soap->proxy_port); } else { if (soap->fresolve(soap, host, &soap->peer.in.sin_addr)) { soap_set_receiver_error(soap, tcp_error(soap), "get host by name failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } soap->peer.in.sin_port = htons((short)port); } soap->errmode = 0; #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) return sk; #endif #else #ifndef WIN32 if (soap->client_addr) { struct sockaddr_in6 addr; memset((void*)&addr, 0, sizeof(addr)); addr.sin6_family = AF_INET6; if ((soap->client_addr_ipv6 && res->ai_family == AF_INET6 && inet_pton(AF_INET6, soap->client_addr_ipv6, (void*)&addr.sin6_addr.s6_addr) == 1) || (!soap->client_addr_ipv6 && inet_pton(AF_INET6, soap->client_addr, (void*)&addr.sin6_addr.s6_addr) == 1) ) { if (soap->client_port >= 0) addr.sin6_port = htons(soap->client_port); if (bind(sk, (struct sockaddr*)&addr, sizeof(addr))) { soap->errnum = soap_socket_errno(sk); freeaddrinfo(ressave); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind before connect\n")); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); soap->client_addr = NULL; soap->client_addr_ipv6 = NULL; soap->client_port = -1; return soap->socket = SOAP_INVALID_SOCKET; } } else /* not an IPv6 address, must be IPv4 */ { struct sockaddr_in addr; memset((void*)&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; if (soap->client_port >= 0) addr.sin_port = htons(soap->client_port); if (inet_pton(AF_INET, soap->client_addr, (void*)&addr.sin_addr) != 1 || bind(sk, (struct sockaddr*)&addr, sizeof(addr))) { soap->errnum = soap_socket_errno(sk); freeaddrinfo(ressave); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind before connect\n")); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); soap->client_addr = NULL; soap->client_addr_ipv6 = NULL; soap->client_port = -1; return soap->socket = SOAP_INVALID_SOCKET; } } soap->client_addr = NULL; /* disable bind before connect, so need to set it again before the next connect */ soap->client_addr_ipv6 = NULL; /* disable bind before connect, so need to set it again before the next connect */ soap->client_port = -1; /* disable bind before connect, so need to set it again before the next connect */ } else #endif if (soap->client_port >= 0) { struct sockaddr_in6 addr; memset((void*)&addr, 0, sizeof(addr)); addr.sin6_family = AF_INET6; addr.sin6_port = htons(soap->client_port); if (bind(sk, (struct sockaddr*)&addr, sizeof(addr))) { soap->errnum = soap_socket_errno(sk); freeaddrinfo(ressave); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind before connect\n")); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); soap->client_port = -1; return soap->socket = SOAP_INVALID_SOCKET; } soap->client_port = -1; /* disable bind before connect, so need to set it again before the next connect */ } #ifndef WIN32 if (soap->client_interface) { if (inet_pton(AF_INET6, soap->client_interface, res->ai_addr) != 1) { if (inet_pton(AF_INET, soap->client_interface, res->ai_addr) != 1) { soap->errnum = soap_socket_errno(sk); freeaddrinfo(ressave); soap_set_receiver_error(soap, tcp_error(soap), "inet_pton() failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); soap->client_interface = NULL; return soap->socket = SOAP_INVALID_SOCKET; } } soap->client_interface = NULL; /* disable client interface, so need to set it again before the next connect */ } #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) { if (soap_memcpy((void*)&soap->peer.storage, sizeof(soap->peer.storage), (const void*)res->ai_addr, res->ai_addrlen)) { soap->error = SOAP_EOM; soap->fclosesocket(soap, sk); soap->socket = sk = SOAP_INVALID_SOCKET; } soap->peerlen = res->ai_addrlen; freeaddrinfo(ressave); return sk; } #endif #endif #ifndef WITH_LEAN if (soap->connect_timeout) SOAP_SOCKNONBLOCK(sk) else SOAP_SOCKBLOCK(sk) retries = 10; #endif for (;;) { #ifdef WITH_IPV6 if (connect(sk, res->ai_addr, (int)res->ai_addrlen)) #else if (connect(sk, &soap->peer.addr, sizeof(soap->peer.in))) #endif { err = soap_socket_errno(sk); #ifdef WITH_IPV6 if (err == SOAP_ECONNREFUSED && res->ai_next) { soap->fclosesocket(soap, sk); res = res->ai_next; goto again; } #endif #ifndef WITH_LEAN if (err == SOAP_EADDRINUSE) { soap->fclosesocket(soap, sk); if (retries-- > 0) goto again; } else if (soap->connect_timeout && (err == SOAP_EINPROGRESS || err == SOAP_EAGAIN || err == SOAP_EWOULDBLOCK)) { SOAP_SOCKLEN_T k; for (;;) { int r; #ifdef WITH_SELF_PIPE r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_PIP, soap->connect_timeout); if ((r & SOAP_TCP_SELECT_PIP)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connection closed by self pipe\n")); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #else r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND, soap->connect_timeout); #endif if (r > 0) break; if (!r) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connect timeout\n")); soap_set_receiver_error(soap, "Timeout", "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } freeaddrinfo(ressave); #endif return soap->socket = SOAP_INVALID_SOCKET; } r = soap->errnum = soap_socket_errno(sk); if (r != SOAP_EINTR) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); soap_set_receiver_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } freeaddrinfo(ressave); #endif return soap->socket = SOAP_INVALID_SOCKET; } } k = (SOAP_SOCKLEN_T)sizeof(soap->errnum); if (!getsockopt(sk, 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(sk); soap_set_receiver_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } freeaddrinfo(ressave); #endif return soap->socket = SOAP_INVALID_SOCKET; } #endif #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; soap->fclosesocket(soap, sk); goto again; } #endif if (err && err != SOAP_EINTR) { soap->errnum = err; #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); soap_set_receiver_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } } else { break; } } #ifdef WITH_IPV6 soap->peerlen = 0; /* IPv6: already connected so use send() */ freeaddrinfo(ressave); #endif soap->imode &= ~SOAP_ENC_SSL; soap->omode &= ~SOAP_ENC_SSL; if (endpoint && !soap_tag_cmp(endpoint, "https:*")) { #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) #ifdef WITH_OPENSSL BIO *bio; #endif #ifdef WITH_SYSTEMSSL gsk_iocallback local_io = { ssl_recv, ssl_send, NULL, NULL, NULL, NULL }; #endif int r; if (soap->proxy_host) { soap_mode m = soap->mode; /* preserve settings */ soap_mode om = soap->omode; /* make sure we only parse HTTP */ ULONG64 n = soap->count; /* save the content length */ const char *userid, *passwd; int status = soap->status; /* save the current status/command */ int keep_alive = soap->keep_alive; /* save the KA status */ soap->omode &= ~SOAP_ENC; /* mask IO and ENC */ soap->omode |= SOAP_IO_BUFFER; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connecting to %s proxy server %s for destination endpoint %s\n", soap->proxy_http_version, soap->proxy_host, endpoint)); #ifdef WITH_NTLM if (soap->ntlm_challenge && soap_ntlm_handshake(soap, SOAP_CONNECT, endpoint, host, port)) { soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #endif if (soap_init_send(soap)) { soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } soap->status = SOAP_CONNECT; if (!soap->keep_alive) soap->keep_alive = -1; /* must keep alive */ soap->error = soap->fpost(soap, endpoint, host, port, NULL, NULL, 0); if (soap->error || soap_end_send_flush(soap)) { soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } soap->keep_alive = keep_alive; soap->omode = om; om = soap->imode; soap->imode &= ~SOAP_ENC; /* mask IO and ENC */ userid = soap->userid; /* preserve */ passwd = soap->passwd; /* preserve */ soap->error = soap->fparse(soap); if (soap->error) { soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } soap->status = status; /* restore */ soap->userid = userid; /* restore */ soap->passwd = passwd; /* restore */ soap->imode = om; /* restore */ soap->count = n; /* restore */ if (soap_init_send(soap)) { soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } if (endpoint) soap_strcpy(soap->endpoint, sizeof(soap->endpoint), endpoint); /* restore */ soap->mode = m; } #ifdef WITH_OPENSSL ERR_clear_error(); soap->ssl_flags |= SOAP_SSL_CLIENT; if (!soap->ctx && (soap->error = soap->fsslauth(soap)) != SOAP_OK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL required, but no ctx set\n")); soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return soap->socket = SOAP_INVALID_SOCKET; } if (!soap->ssl) { soap->ssl = SSL_new(soap->ctx); if (!soap->ssl) { soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return soap->socket = 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; } #if OPENSSL_VERSION_NUMBER >= 0x1000000aL if (!(soap->ssl_flags & SOAP_SSLv3) && !SSL_set_tlsext_host_name(soap->ssl, host)) { soap_set_receiver_error(soap, "SSL/TLS error", "SNI failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #elif (OPENSSL_VERSION_NUMBER >= 0x0090800fL) && defined(SSL_CTRL_SET_TLSEXT_HOSTNAME) if (!SSL_ctrl(soap->ssl, SSL_CTRL_SET_TLSEXT_HOSTNAME, TLSEXT_NAMETYPE_host_name, (void*)host)) { soap_set_receiver_error(soap, "SSL/TLS error", "SNI failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #endif bio = BIO_new_socket((int)sk, BIO_NOCLOSE); SSL_set_bio(soap->ssl, bio, bio); if (soap->connect_timeout || soap->recv_timeout || soap->send_timeout) { /* Set SSL connect timeout and set SSL sockets to non-blocking */ int t = soap->recv_timeout > soap->send_timeout ? soap->recv_timeout : soap->send_timeout; if (soap->connect_timeout > 0 && t < soap->connect_timeout) t = soap->connect_timeout; if (t > 0) retries = 10 * t; else if (t > -100000) retries = 1; else retries = t/-100000; SOAP_SOCKNONBLOCK(sk) } else { /* Set sockets to blocking */ retries = 1; SOAP_SOCKBLOCK(sk) } err = SSL_ERROR_NONE; /* Try connecting until success or timeout */ do { if ((r = SSL_connect(soap->ssl)) <= 0) { err = SSL_get_error(soap->ssl, r); if (err == SSL_ERROR_WANT_CONNECT || err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) { int s; if (err == SSL_ERROR_WANT_READ) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; if (s == 0 && retries-- <= 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL/TLS connect timeout\n")); soap_set_receiver_error(soap, "Timeout", "SSL_connect() failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } } else { soap->errnum = soap_socket_errno(sk); break; } } } while (!SSL_is_init_finished(soap->ssl)); if (r <= 0) { soap_set_sender_error(soap, soap_ssl_error(soap, r, err), "SSL/TLS handshake failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } /* Check server credentials when required */ if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) { if ((err = SSL_get_verify_result(soap->ssl)) != X509_V_OK) { soap_set_sender_error(soap, X509_verify_cert_error_string(err), "SSL/TLS certificate presented by peer cannot be verified in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } if (!(soap->ssl_flags & SOAP_SSL_SKIP_HOST_CHECK)) { X509_NAME *subj; STACK_OF(CONF_VALUE) *val = NULL; #if OPENSSL_VERSION_NUMBER >= 0x0090800fL GENERAL_NAMES *names = NULL; #else int ext_count; #endif int ok = 0; X509 *peer = SSL_get_peer_certificate(soap->ssl); if (!peer) { soap_set_sender_error(soap, "SSL/TLS error", "No SSL/TLS certificate was presented by the peer in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #if OPENSSL_VERSION_NUMBER < 0x0090800fL 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_METHOD*)X509V3_EXT_get(ext); unsigned char *data; if (!meth) break; data = ext->value->data; if (data) { #if OPENSSL_VERSION_NUMBER > 0x00907000L void *ext_data; if (meth->it) ext_data = ASN1_item_d2i(NULL, &data, ext->value->length, ASN1_ITEM_ptr(meth->it)); else { #if OPENSSL_VERSION_NUMBER > 0x0090800fL ext_data = meth->d2i(NULL, (const unsigned char **)&data, ext->value->length); #else ext_data = meth->d2i(NULL, &data, ext->value->length); #endif } if (ext_data) val = meth->i2v(meth, ext_data, NULL); else val = NULL; if (meth->it) ASN1_item_free((ASN1_VALUE*)ext_data, ASN1_ITEM_ptr(meth->it)); else meth->ext_free(ext_data); #else void *ext_data = meth->d2i(NULL, &data, ext->value->length); if (ext_data) val = meth->i2v(meth, ext_data, NULL); meth->ext_free(ext_data); #endif if (val) { int j; 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->name, "IP Address")) && !soap_tag_cmp(host, nval->value)) { ok = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s match with certificate %s %s\n", host, nval->name, nval->value)); break; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s mismatch with certificate %s %s\n", host, nval->name, nval->value)); } } sk_CONF_VALUE_pop_free(val, X509V3_conf_free); } } } if (ok) break; } } #else names = (GENERAL_NAMES*)X509_get_ext_d2i(peer, NID_subject_alt_name, NULL, NULL); if (names) { val = i2v_GENERAL_NAMES(NULL, names, val); sk_GENERAL_NAME_pop_free(names, GENERAL_NAME_free); } if (val) { int j; 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->name, "IP Address")) && !soap_tag_cmp(host, nval->value)) { ok = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s match with certificate %s %s\n", host, nval->name, nval->value)); break; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s mismatch with certificate %s %s\n", host, nval->name, nval->value)); } } sk_CONF_VALUE_pop_free(val, X509V3_conf_free); } #endif if (!ok && (subj = X509_get_subject_name(peer)) != 0) { 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 OPENSSL_VERSION_NUMBER < 0x10100000L const char *tmp = (const char*)ASN1_STRING_data(name); #else const char *tmp = (const char*)ASN1_STRING_get0_data(name); #endif if (!soap_tag_cmp(host, tmp)) { ok = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s match with certificate subject %s\n", host, tmp)); } else { unsigned char *tmp = NULL; ASN1_STRING_to_UTF8(&tmp, name); if (tmp) { if (!soap_tag_cmp(host, (const char*)tmp)) { ok = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s match with certificate subject %s\n", host, tmp)); } else if (tmp[0] == '*') /* wildcard domain */ { const char *t = strchr(host, '.'); if (t && !soap_tag_cmp(t, (const char*)tmp + 1)) { ok = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s match with certificate subject %s\n", host, tmp)); } } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s mismatch with certificate %s\n", host, tmp)); } OPENSSL_free(tmp); } } } } while (!ok); } X509_free(peer); if (!ok) { soap_set_sender_error(soap, "SSL/TLS error", "SSL/TLS certificate host name mismatch in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } } } #endif #ifdef WITH_GNUTLS soap->ssl_flags |= SOAP_SSL_CLIENT; if (!soap->session && (soap->error = soap->fsslauth(soap)) != SOAP_OK) { soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } gnutls_transport_set_ptr(soap->session, (gnutls_transport_ptr_t)(long)sk); if (soap->connect_timeout || soap->recv_timeout || soap->send_timeout) { /* Set SSL connect timeout and set SSL sockets to non-blocking */ int t = soap->recv_timeout > soap->send_timeout ? soap->recv_timeout : soap->send_timeout; if (soap->connect_timeout > 0 && t < soap->connect_timeout) t = soap->connect_timeout; if (t > 0) retries = 10 * t; else if (t > -100000) retries = 1; else retries = t/-100000; SOAP_SOCKNONBLOCK(sk) } else { /* Set sockets to blocking */ retries = 1; SOAP_SOCKBLOCK(sk) } /* Try connecting until success or timeout */ while ((r = gnutls_handshake(soap->session))) { /* GNUTLS repeat handhake when GNUTLS_E_AGAIN */ if (r == GNUTLS_E_AGAIN || r == GNUTLS_E_INTERRUPTED) { int s; if (!gnutls_record_get_direction(soap->session)) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; if (s == 0 && retries-- <= 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL/TLS connect timeout\n")); soap_set_receiver_error(soap, "Timeout", "SSL_connect() failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } } else { soap->errnum = soap_socket_errno(sk); break; } } if (r) { soap_set_sender_error(soap, soap_ssl_error(soap, r, 0), "SSL/TLS handshake failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) { const char *s = ssl_verify(soap, host); if (s) { soap->fclosesocket(soap, sk); soap->error = soap_set_sender_error(soap, "SSL/TLS verify error", s, SOAP_SSL_ERROR); return soap->socket = SOAP_INVALID_SOCKET; } } #endif #ifdef WITH_SYSTEMSSL soap->ssl_flags |= SOAP_SSL_CLIENT; if (!soap->ctx && (soap->error = soap->fsslauth(soap)) != SOAP_OK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL required, but no ctx set\n")); soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return soap->socket = SOAP_INVALID_SOCKET; } if (soap->connect_timeout || soap->recv_timeout || soap->send_timeout) { /* Set SSL connect timeout and set SSL sockets to non-blocking */ int t = soap->recv_timeout > soap->send_timeout ? soap->recv_timeout : soap->send_timeout; if (soap->connect_timeout > 0 && t < soap->connect_timeout) t = soap->connect_timeout; if (t > 0) retries = 10 * t; else if (t > -100000) retries = 1; else retries = t/-100000; SOAP_SOCKNONBLOCK(sk) } else { /* Set sockets to blocking */ retries = 1; SOAP_SOCKBLOCK(sk) } r = gsk_secure_socket_open(soap->ctx, &soap->ssl); if (r == GSK_OK) r = gsk_attribute_set_numeric_value(soap->ssl, GSK_FD, sk); if (r == GSK_OK) r = gsk_attribute_set_buffer(soap->ssl, GSK_KEYRING_LABEL, soap->cafile, 0); /* Certificate label */ if (r == GSK_OK) r = gsk_attribute_set_enum(soap->ssl, GSK_SESSION_TYPE, GSK_CLIENT_SESSION); if (r == GSK_OK) r = gsk_attribute_set_buffer(soap->ssl, GSK_V3_CIPHER_SPECS_EXPANDED, "0035002F000A", 0); if (r == GSK_OK) r = gsk_attribute_set_enum(soap->ssl, GSK_V3_CIPHERS, GSK_V3_CIPHERS_CHAR4); if (r == GSK_OK) r = gsk_attribute_set_callback(soap->ssl, GSK_IO_CALLBACK, &local_io); if (r != GSK_OK) { soap_set_receiver_error(soap, gsk_strerror(r), "SYSTEM SSL error in tcp_connect()", SOAP_SSL_ERROR); return soap->socket = SOAP_INVALID_SOCKET; } /* Try connecting until success or timeout */ while ((r = gsk_secure_socket_init(soap->ssl)) != GSK_OK) { if (r == GSK_WOULD_BLOCK_READ || r == GSK_WOULD_BLOCK_WRITE) { int s; if (r == GSK_WOULD_BLOCK_READ) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; if (s == 0 && retries-- <= 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL/TLS connect timeout\n")); soap_set_receiver_error(soap, "Timeout", "SSL_connect() failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } } else { soap->errnum = soap_socket_errno(sk); break; } } if (r != GSK_OK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL_connect/select error in tcp_connect\n")); soap_set_receiver_error(soap, gsk_strerror(r), "SSL/TLS handshake failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #endif soap->imode |= SOAP_ENC_SSL; soap->omode |= SOAP_ENC_SSL; #else soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return soap->socket = SOAP_INVALID_SOCKET; #endif } if (soap->recv_timeout || soap->send_timeout) SOAP_SOCKNONBLOCK(sk) else SOAP_SOCKBLOCK(sk) return sk; } #endif /******************************************************************************/ #ifndef WITH_NOIO static int tcp_select(struct soap *soap, SOAP_SOCKET sk, int flags, int timeout) { int r; struct timeval tv; fd_set fd[3], *rfd, *sfd, *efd; int retries = 0; int eintr = SOAP_MAXEINTR; soap->errnum = 0; if (!soap_valid_socket(sk)) { soap->error = SOAP_EOF; return -1; } #ifndef WIN32 #if !defined(FD_SETSIZE) || defined(__QNX__) || defined(QNX) /* no FD_SETSIZE or select() is not MT safe on some QNX: always poll */ if (1) #else /* if fd max set size exceeded, use poll() when available */ if ((int)sk >= (int)FD_SETSIZE) #endif #ifdef HAVE_POLL { #ifdef WITH_SELF_PIPE struct pollfd pollfd[2]; pollfd[1].fd = soap->pipe_fd[0]; pollfd[1].events = POLLIN; #else struct pollfd pollfd[1]; #endif pollfd[0].fd = (int)sk; pollfd[0].events = 0; if ((flags & SOAP_TCP_SELECT_RCV)) pollfd[0].events |= POLLIN; if ((flags & SOAP_TCP_SELECT_SND)) pollfd[0].events |= POLLOUT; if ((flags & SOAP_TCP_SELECT_ERR)) pollfd[0].events |= POLLERR; if (timeout <= 0) timeout /= -1000; /* -usec -> ms */ else { retries = timeout - 1; timeout = 1000; } do { #ifdef WITH_SELF_PIPE r = poll(pollfd, 2, timeout); #else r = poll(pollfd, 1, timeout); #endif if (r < 0 && (soap->errnum = soap_socket_errno(sk)) == SOAP_EINTR && eintr > 0) { eintr--; r = 0; } else if (retries-- <= 0) { break; } } while (r == 0); if (r > 0) { r = 0; if ((flags & SOAP_TCP_SELECT_RCV) && (pollfd[0].revents & POLLIN)) r |= SOAP_TCP_SELECT_RCV; if ((flags & SOAP_TCP_SELECT_SND) && (pollfd[0].revents & POLLOUT)) r |= SOAP_TCP_SELECT_SND; if ((flags & SOAP_TCP_SELECT_ERR) && (pollfd[0].revents & POLLERR)) r |= SOAP_TCP_SELECT_ERR; #ifdef WITH_SELF_PIPE if ((flags & SOAP_TCP_SELECT_PIP) && (pollfd[1].revents & POLLIN)) { char ch; for (;;) { if (read(soap->pipe_fd[0], &ch, 1) == -1) { if (soap_socket_errno(soap->pipe_fd[0]) == SOAP_EAGAIN) break; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Self pipe read error\n")); return -1; } } r |= SOAP_TCP_SELECT_PIP; } #endif } else if (r == 0) { soap->errnum = 0; } return r; } #else { soap->error = SOAP_FD_EXCEEDED; return -1; } #endif #endif if (timeout > 0) retries = timeout - 1; do { rfd = sfd = efd = NULL; #ifdef WITH_SELF_PIPE if ((flags & SOAP_TCP_SELECT_PIP) || (flags & SOAP_TCP_SELECT_RCV)) { rfd = &fd[0]; FD_ZERO(rfd); if ((flags & SOAP_TCP_SELECT_PIP)) FD_SET(soap->pipe_fd[0], rfd); if ((flags & SOAP_TCP_SELECT_RCV)) FD_SET(sk, rfd); } #else if ((flags & SOAP_TCP_SELECT_RCV)) { rfd = &fd[0]; FD_ZERO(rfd); FD_SET(sk, rfd); } #endif if ((flags & SOAP_TCP_SELECT_SND)) { sfd = &fd[1]; FD_ZERO(sfd); FD_SET(sk, sfd); } if ((flags & SOAP_TCP_SELECT_ERR)) { efd = &fd[2]; FD_ZERO(efd); FD_SET(sk, efd); } if (timeout <= 0) { tv.tv_sec = -timeout / 1000000; tv.tv_usec = -timeout % 1000000; } else { tv.tv_sec = 1; tv.tv_usec = 0; } #ifdef WITH_SELF_PIPE r = select((int)(sk > soap->pipe_fd[0] ? sk : soap->pipe_fd[0]) + 1, rfd, sfd, efd, &tv); #else r = select((int)sk + 1, rfd, sfd, efd, &tv); #endif if (r < 0 && (soap->errnum = soap_socket_errno(sk)) == SOAP_EINTR && eintr > 0) { eintr--; r = 0; } else if (retries-- <= 0) { break; } } while (r == 0); if (r > 0) { r = 0; if ((flags & SOAP_TCP_SELECT_RCV) && FD_ISSET(sk, rfd)) r |= SOAP_TCP_SELECT_RCV; if ((flags & SOAP_TCP_SELECT_SND) && FD_ISSET(sk, sfd)) r |= SOAP_TCP_SELECT_SND; if ((flags & SOAP_TCP_SELECT_ERR) && FD_ISSET(sk, efd)) r |= SOAP_TCP_SELECT_ERR; #ifdef WITH_SELF_PIPE if ((flags & SOAP_TCP_SELECT_PIP) && FD_ISSET(soap->pipe_fd[0], rfd)) { char ch; for (;;) { if (read(soap->pipe_fd[0], &ch, 1) == -1) { if (soap_socket_errno(soap->pipe_fd[0]) == SOAP_EAGAIN) break; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Self pipe read error\n")); return -1; } } r |= SOAP_TCP_SELECT_PIP; } #endif } else if (r == 0) { soap->errnum = 0; } return r; } #endif /******************************************************************************/ #ifndef WITH_NOIO static SOAP_SOCKET tcp_accept(struct soap *soap, SOAP_SOCKET sk, struct sockaddr *addr, int *len) { SOAP_SOCKET s; (void)soap; s = accept(sk, addr, (SOAP_SOCKLEN_T*)len); /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ #ifdef WITH_SOCKET_CLOSE_ON_EXIT #ifdef WIN32 #ifndef UNDER_CE SetHandleInformation((HANDLE)s, HANDLE_FLAG_INHERIT, 0); #endif #else fcntl(s, F_SETFD, FD_CLOEXEC); #endif #endif return s; } #endif /******************************************************************************/ #ifndef WITH_NOIO static int tcp_disconnect(struct soap *soap) { #ifdef WITH_OPENSSL if (soap->ssl) { int r; if (soap->session) { SSL_SESSION_free(soap->session); soap->session = NULL; } if (*soap->host) { soap->session = SSL_get1_session(soap->ssl); if (soap->session) { soap_strcpy(soap->session_host, sizeof(soap->session_host), soap->host); soap->session_port = soap->port; } } r = SSL_shutdown(soap->ssl); /* SSL shutdown does not work when reads are pending, non-blocking */ if (r == 0) { while (SSL_want_read(soap->ssl)) { if (SSL_read(soap->ssl, NULL, 0) || soap_socket_errno(soap->socket) != SOAP_EAGAIN) { r = SSL_shutdown(soap->ssl); break; } } } if (r == 0) { if (soap_valid_socket(soap->socket)) { if (!soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_WR)) { #if !defined(WITH_LEAN) && !defined(WIN32) /* wait up to 5 seconds for close_notify to be sent by peer (if peer not present, this avoids calling SSL_shutdown() which has a lengthy return timeout) */ r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, 5); if (r <= 0) { soap->errnum = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connection lost...\n")); soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; ERR_clear_error(); SSL_free(soap->ssl); soap->ssl = NULL; return SOAP_OK; } #else r = SSL_shutdown(soap->ssl); if (r <= 0) { 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; } } #endif } } } SSL_free(soap->ssl); soap->ssl = NULL; ERR_clear_error(); } #endif #ifdef WITH_GNUTLS if (soap->session) { gnutls_bye(soap->session, GNUTLS_SHUT_RDWR); gnutls_deinit(soap->session); soap->session = NULL; } #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) { gsk_secure_socket_shutdown(soap->ssl); gsk_secure_socket_close(&soap->ssl); } #endif if (soap_valid_socket(soap->socket) && !(soap->omode & SOAP_IO_UDP)) { soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_RDWR); soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_NOIO static int tcp_closesocket(struct soap *soap, SOAP_SOCKET sk) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Close socket=%d\n", (int)sk)); return soap_closesocket(sk); } #endif /******************************************************************************/ #ifndef WITH_NOIO static int tcp_shutdownsocket(struct soap *soap, SOAP_SOCKET sk, int how) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shutdown socket=%d how=%d\n", (int)sk, how)); return shutdown(sk, how); } #endif /******************************************************************************/ #ifndef WITH_NOIO SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_bind(struct soap *soap, const char *host, int port, int backlog) { #if defined(WITH_IPV6) struct addrinfo *addrinfo = NULL; struct addrinfo hints; struct addrinfo res; int err; int set = 1; int unset = 0; #elif !defined(WITH_LEAN) 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->errnum = 0; 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 = soap->bind_inet6 ? AF_INET6 : 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 (err || !addrinfo) { soap_set_receiver_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in soap_bind()", SOAP_TCP_ERROR); if (addrinfo) freeaddrinfo(addrinfo); return SOAP_INVALID_SOCKET; } res = *addrinfo; if (soap_memcpy((void*)&soap->peer.storage, sizeof(soap->peer.storage), (const void*)addrinfo->ai_addr, addrinfo->ai_addrlen)) { freeaddrinfo(addrinfo); soap->error = SOAP_EOM; return SOAP_INVALID_SOCKET; } soap->peerlen = addrinfo->ai_addrlen; res.ai_addr = &soap->peer.addr; res.ai_addrlen = soap->peerlen; freeaddrinfo(addrinfo); 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; } soap->port = port; #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) soap->socket = soap->master; #endif #ifdef WITH_SOCKET_CLOSE_ON_EXIT #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; } #ifndef UNDER_CE if (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) && (!((soap->imode | soap->omode) & SOAP_IO_UDP)) && setsockopt(soap->master, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) { 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 (soap->sndbuf > 0 && setsockopt(soap->master, SOL_SOCKET, SO_SNDBUF, (char*)&soap->sndbuf, 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 (soap->rcvbuf > 0 && setsockopt(soap->master, SOL_SOCKET, SO_RCVBUF, (char*)&soap->rcvbuf, 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 #ifdef TCP_FASTOPEN if (!(soap->omode & SOAP_IO_UDP) && setsockopt(soap->master, IPPROTO_TCP, TCP_FASTOPEN, (char*)&set, sizeof(int))) { /* silently ignore */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "setsockopt TCP_FASTOPEN failed in soap_bind()\n")); } #endif #endif #endif #ifdef WITH_IPV6 if (res.ai_family == AF_INET6 && setsockopt(soap->master, IPPROTO_IPV6, IPV6_V6ONLY, soap->bind_v6only ? (char*)&set : (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; } 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, bind failed\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.in); memset((void*)&soap->peer.in, 0, sizeof(soap->peer.in)); soap->peer.in.sin_family = AF_INET; soap->errmode = 2; if (host) { if (soap->fresolve(soap, host, &soap->peer.in.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.in.sin_addr.s_addr = htonl(INADDR_ANY); soap->peer.in.sin_port = htons((short)port); soap->errmode = 0; if (bind(soap->master, &soap->peer.addr, (int)soap->peerlen)) { soap->errnum = soap_socket_errno(soap->master); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host, bind failed\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, listen failed\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 /******************************************************************************/ #ifndef WITH_NOIO SOAP_FMAC1 int SOAP_FMAC2 soap_poll(struct soap *soap) { #ifndef WITH_LEAN int r; if (soap_valid_socket(soap->socket)) { r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_ALL, 0); if (r > 0 && (r & SOAP_TCP_SELECT_ERR)) r = -1; } else if (soap_valid_socket(soap->master)) { r = tcp_select(soap, soap->master, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, 0); } else { return SOAP_OK; /* OK when no socket! */ } if (r > 0) { int t; #ifdef WITH_OPENSSL if ((soap->imode & SOAP_ENC_SSL) && soap->ssl) { if (soap_valid_socket(soap->socket) && (r & SOAP_TCP_SELECT_SND) && (!(r & SOAP_TCP_SELECT_RCV) || SSL_peek(soap->ssl, (char*)&t, 1) > 0)) return SOAP_OK; } else #endif { if (soap_valid_socket(soap->socket) && (r & SOAP_TCP_SELECT_SND) && (!(r & SOAP_TCP_SELECT_RCV) || recv(soap->socket, (char*)&t, 1, MSG_PEEK) > 0)) return SOAP_OK; } } else if (r < 0) { if ((soap_valid_socket(soap->master) && soap_socket_errno(soap->master) != SOAP_EINTR) || (soap_valid_socket(soap->socket) && soap_socket_errno(soap->socket) != SOAP_EINTR)) return soap_set_receiver_error(soap, tcp_error(soap), "select failed in soap_poll()", SOAP_TCP_ERROR); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_poll: other end down on socket=%d select=%d\n", (int)soap->socket, r)); return SOAP_EOF; #else (void)soap; return SOAP_OK; #endif } #endif /******************************************************************************/ #ifndef WITH_NOIO SOAP_FMAC1 int SOAP_FMAC2 soap_ready(struct soap *soap) { #ifndef WITH_LEAN int r; if (!soap_valid_socket(soap->socket)) return SOAP_OK; /* OK when no socket! */ r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, 0); if (r > 0 && (r & SOAP_TCP_SELECT_ERR)) r = -1; if (r < 0 && soap_socket_errno(soap->socket) != SOAP_EINTR) return soap_set_receiver_error(soap, tcp_error(soap), "select failed in soap_ready()", SOAP_TCP_ERROR); if (r > 0) { char t; #ifdef WITH_OPENSSL if ((soap->imode & SOAP_ENC_SSL) && soap->ssl) { if (SSL_peek(soap->ssl, &t, 1) > 0) return SOAP_OK; } else #endif { if (recv(soap->socket, &t, 1, MSG_PEEK) > 0) return SOAP_OK; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_ready: other end not ready to send on socket=%d select=%d\n", (int)soap->socket, r)); return SOAP_EOF; #else (void)soap; return SOAP_OK; #endif } #endif /******************************************************************************/ #ifndef WITH_NOIO SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_accept(struct soap *soap) { int n = (int)sizeof(soap->peer); int err; #ifndef WITH_LEAN int set = 1; #endif soap->error = SOAP_OK; memset((void*)&soap->peer, 0, sizeof(soap->peer)); soap->socket = SOAP_INVALID_SOCKET; soap->errmode = 0; soap->errnum = 0; soap->keep_alive = 0; if (!soap_valid_socket(soap->master)) { soap_set_receiver_error(soap, tcp_error(soap), "no master socket in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) return soap->socket = soap->master; #endif for (;;) { if (soap->accept_timeout) { for (;;) { int r; r = tcp_select(soap, soap->master, SOAP_TCP_SELECT_ALL, soap->accept_timeout); if (r > 0) break; if (!r) { soap_set_receiver_error(soap, "Timeout", "accept failed in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } if (r < 0) { r = soap->errnum; if (r != SOAP_EINTR) { soap_closesock(soap); soap_set_receiver_error(soap, tcp_error(soap), "accept failed in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } } } } n = (int)sizeof(soap->peer); soap->socket = soap->faccept(soap, soap->master, &soap->peer.addr, &n); soap->peerlen = (size_t)n; if (soap_valid_socket(soap->socket)) { #ifdef WITH_IPV6 char port[16]; struct addrinfo *res = NULL; struct addrinfo hints; memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_NUMERICHOST | AI_NUMERICSERV; getnameinfo(&soap->peer.addr, n, soap->host, sizeof(soap->host), port, sizeof(port), NI_NUMERICHOST | NI_NUMERICSERV); soap->ip = 0; soap->ip6[0] = 0; soap->ip6[1] = 0; soap->ip6[2] = 0; soap->ip6[3] = 0; if (getaddrinfo(soap->host, NULL, &hints, &res) == 0 && res) { struct sockaddr_storage result; (void)soap_memcpy(&result, sizeof(result), res->ai_addr, res->ai_addrlen); freeaddrinfo(res); if (result.ss_family == AF_INET6) { struct sockaddr_in6 *addr = (struct sockaddr_in6*)&result; struct in6_addr *inaddr = &addr->sin6_addr; int i; for (i = 0; i < 16; i++) soap->ip6[i/4] = (soap->ip6[i/4] << 8) + inaddr->s6_addr[i]; } else if (result.ss_family == AF_INET) { struct sockaddr_in *addr = (struct sockaddr_in*)&result; soap->ip = ntohl(addr->sin_addr.s_addr); soap->ip6[2] = 0xFFFF; soap->ip6[3] = soap->ip; } } soap->port = soap_strtol(port, NULL, 10); #else soap->ip = ntohl(soap->peer.in.sin_addr.s_addr); soap->ip6[0] = 0; soap->ip6[1] = 0; soap->ip6[2] = 0xFFFF; soap->ip6[3] = soap->ip; (SOAP_SNPRINTF(soap->host, sizeof(soap->host), 80), "%u.%u.%u.%u", (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF); soap->port = (int)ntohs(soap->peer.in.sin_port); /* does not return port number on some systems */ #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Accept socket=%d at port=%d from IP='%s'\n", (int)soap->socket, soap->port, soap->host)); #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; } } if ((soap->accept_flags & ~SO_LINGER) && setsockopt(soap->socket, SOL_SOCKET, soap->accept_flags & ~SO_LINGER, (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; } #ifndef UNDER_CE 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 (soap->sndbuf > 0 && setsockopt(soap->socket, SOL_SOCKET, SO_SNDBUF, (char*)&soap->sndbuf, 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 (soap->rcvbuf > 0 && setsockopt(soap->socket, SOL_SOCKET, SO_RCVBUF, (char*)&soap->rcvbuf, 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 (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 #endif soap->keep_alive = -(((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) != 0); if (soap->send_timeout || soap->recv_timeout) SOAP_SOCKNONBLOCK(soap->socket) else SOAP_SOCKBLOCK(soap->socket) 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; } } } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_closesock(struct soap *soap) { int status = soap->error; int err = SOAP_OK; soap->part = SOAP_END; #ifndef WITH_LEANER if (status && status < 200) /* attachment state is not to be trusted */ { soap->mime.first = NULL; soap->mime.last = NULL; soap->dime.first = NULL; soap->dime.last = NULL; } #endif if (soap->fdisconnect) err = soap->fdisconnect(soap); if (err || status == SOAP_EOF || status == SOAP_TCP_ERROR || status == SOAP_SSL_ERROR || !soap->keep_alive) { soap->keep_alive = 0; if (soap->fclose && (soap->error = soap->fclose(soap)) != SOAP_OK) return soap->error; if (err) return soap->error = err; } #ifdef WITH_ZLIB if (!(soap->mode & SOAP_MIME_POSTCHECK)) { 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; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_force_closesock(struct soap *soap) { soap->keep_alive = 0; if (soap_valid_socket(soap->socket) && soap->fclosesocket) { soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; } return soap->error; } /******************************************************************************/ #ifdef WITH_SELF_PIPE SOAP_FMAC1 void SOAP_FMAC2 soap_close_connection(struct soap *soap) { if (soap_valid_socket(soap->socket)) write(soap->pipe_fd[1], "1", 1); } #endif /******************************************************************************/ #ifndef WITH_NOIO 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 /******************************************************************************/ 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%s\n", soap->state == SOAP_COPY ? " copy" : "")); soap_free_temp(soap); while (soap->clist) { struct soap_clist *p = soap->clist->next; SOAP_FREE(soap, soap->clist); soap->clist = p; } if (soap->state == SOAP_INIT) soap->omode &= ~SOAP_IO_UDP; /* to force close the socket */ soap->keep_alive = 0; /* to force close the socket */ if (soap->master == soap->socket) /* do not close twice */ soap->master = SOAP_INVALID_SOCKET; soap_closesock(soap); #ifdef WITH_COOKIES soap_free_cookies(soap); #endif while (soap->plugins) { 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; #ifndef WITH_NOHTTP soap->fpost = http_post; soap->fget = http_get; soap->fput = http_put; soap->fpatch = http_patch; soap->fdel = http_del; soap->fopt = http_200; soap->fhead = http_200; 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->fsvalidate = NULL; soap->fwvalidate = NULL; soap->feltbegin = NULL; soap->feltendin = NULL; soap->feltbegout = NULL; soap->feltendout = NULL; soap->fprepareinitsend = NULL; soap->fprepareinitrecv = NULL; soap->fpreparesend = NULL; soap->fpreparerecv = NULL; soap->fpreparefinalsend = NULL; soap->fpreparefinalrecv = NULL; soap->ffiltersend = NULL; soap->ffilterrecv = 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; } } ERR_clear_error(); # if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER) /* OpenSSL libraries handle thread init and deinit */ # elif OPENSSL_VERSION_NUMBER >= 0x10000000L ERR_remove_thread_state(NULL); # else ERR_remove_state(0); # endif #endif #ifdef WITH_GNUTLS if (soap->state == SOAP_INIT) { if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } if (soap->acred) { gnutls_anon_free_client_credentials(soap->acred); soap->acred = NULL; } if (soap->cache) { gnutls_priority_deinit(soap->cache); soap->cache = NULL; } if (soap->dh_params) { gnutls_dh_params_deinit(soap->dh_params); soap->dh_params = NULL; } # if GNUTLS_VERSION_NUMBER < 0x030300 if (soap->rsa_params) { gnutls_rsa_params_deinit(soap->rsa_params); soap->rsa_params = NULL; } #endif } if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) gsk_secure_socket_close(&soap->ssl); if (soap->state == SOAP_INIT) if (soap->ctx) gsk_environment_close(&soap->ctx); #endif #ifdef WITH_C_LOCALE SOAP_FREELOCALE(soap); #endif #ifdef WITH_ZLIB if (soap->d_stream) { SOAP_FREE(soap, soap->d_stream); soap->d_stream = NULL; } if (soap->z_buf) { SOAP_FREE(soap, 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++) { soap_close_logfile(soap, i); if (soap->logfile[i]) { SOAP_FREE_UNMANAGED(soap->logfile[i]); soap->logfile[i] = NULL; } } #endif #ifdef WITH_SELF_PIPE close(soap->pipe_fd[0]); close(soap->pipe_fd[1]); #endif #ifdef SOAP_MEM_DEBUG soap_free_mht(soap); #endif soap->state = SOAP_NONE; } /******************************************************************************\ * * HTTP * \******************************************************************************/ #ifndef WITH_NOHTTP static int http_parse(struct soap *soap) { char header[SOAP_HDRLEN], *s; int err = SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Waiting for HTTP request/response...\n")); soap->fform = NULL; *soap->endpoint = '\0'; soap->bearer = NULL; #ifdef WITH_NTLM if (!soap->ntlm_challenge) #endif { soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; } #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif soap->proxy_from = NULL; soap->cors_origin = NULL; soap->cors_method = NULL; soap->cors_header = NULL; do { soap->length = 0; soap->http_content = NULL; soap->action = NULL; soap->status = 0; soap->body = 1; if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf))) { if (soap->error == SOAP_EOF) return SOAP_EOF; return soap->error = 414; } s = strchr(soap->msgbuf, ' '); if (s) { soap->status = (unsigned short)soap_strtoul(s, &s, 10); if (!soap_coblank((soap_wchar)*s)) soap->status = 0; } 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, try to 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'; soap->error = soap->fparsehdr(soap, header, s); if (soap->error) { if (soap->error < SOAP_STOP) return soap->error; err = soap->error; soap->error = SOAP_OK; } } } } while (soap->status == 100); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Finished HTTP header parsing, status = %d\n", soap->status)); s = strstr(soap->msgbuf, "HTTP/"); if (s && s[5] == '1' && s[6] == '.' && s[7] == '0') { soap->keep_alive = 0; /* HTTP 1.0 does not support keep-alive */ if (soap->status == 0 && (soap->omode & SOAP_IO) == SOAP_IO_CHUNK) /* soap->status == 0 for HTTP request */ soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE; /* HTTP 1.0 does not support chunked transfers */ } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Keep alive connection = %d\n", soap->keep_alive)); if (soap->status == 0) { size_t l = 0; if (s) { if (!strncmp(soap->msgbuf, "POST ", l = 5)) soap->status = SOAP_POST; else if (!strncmp(soap->msgbuf, "GET ", l = 4)) soap->status = SOAP_GET; else if (!strncmp(soap->msgbuf, "PUT ", l = 4)) soap->status = SOAP_PUT; else if (!strncmp(soap->msgbuf, "PATCH ", l = 4)) soap->status = SOAP_PATCH; else if (!strncmp(soap->msgbuf, "DELETE ", l = 7)) soap->status = SOAP_DEL; else if (!strncmp(soap->msgbuf, "HEAD ", l = 5)) soap->status = SOAP_HEAD; else if (!strncmp(soap->msgbuf, "OPTIONS ", l = 8)) soap->status = SOAP_OPTIONS; } if (s && soap->status) { size_t m, n, k; int r; while (soap->msgbuf[l] && soap_coblank((soap_wchar)soap->msgbuf[l])) l++; m = strlen(soap->endpoint); n = m + (s - soap->msgbuf) - l - 1; if (n >= sizeof(soap->endpoint)) n = sizeof(soap->endpoint) - 1; if (m > n) m = n; k = n - m + 1; if (k >= sizeof(soap->path)) k = sizeof(soap->path) - 1; while (k > 0 && soap_coblank((soap_wchar)soap->msgbuf[l + k - 1])) k--; if (soap_strncpy(soap->path, sizeof(soap->path), soap->msgbuf + l, k)) return soap->error = 414; if (*soap->path && *soap->path != '/') r = soap_strncpy(soap->endpoint, sizeof(soap->endpoint), soap->path, k); else r = soap_strncat(soap->endpoint, sizeof(soap->endpoint), soap->path, k); if (r) return soap->error = 414; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Target endpoint='%s' path='%s'\n", soap->endpoint, soap->path)); if (err) return soap->error = err; } else if (err) { return soap->error = err; } else if (s) { return soap->error = 405; } return SOAP_OK; } if ((soap->status >= 200 && soap->status <= 299) /* OK, Accepted, etc */ || soap->status == 400 /* Bad Request */ || soap->status == 500) /* Internal Server Error */ return soap->error = SOAP_OK; return soap->error = soap->status; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_parse_header(struct soap *soap, const char *key, const char *val) { if (!soap_tag_cmp(key, "Host")) { #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) if ((soap->imode & SOAP_ENC_SSL)) soap_strcpy(soap->endpoint, sizeof(soap->endpoint), "https://"); else #endif soap_strcpy(soap->endpoint, sizeof(soap->endpoint), "http://"); if (soap_strncat(soap->endpoint, sizeof(soap->endpoint), val, sizeof(soap->endpoint) - 9)) return soap->error = SOAP_HDR; } #ifndef WITH_LEANER else if (!soap_tag_cmp(key, "Content-Type")) { const char *action; soap->http_content = soap_strdup(soap, val); if (soap_http_header_attribute(soap, val, "application/dime")) soap->imode |= SOAP_ENC_DIME; else if (soap_http_header_attribute(soap, val, "multipart/related") || soap_http_header_attribute(soap, val, "multipart/form-data")) { const char *type; soap->mime.boundary = soap_strdup(soap, soap_http_header_attribute(soap, val, "boundary")); soap->mime.start = soap_strdup(soap, soap_http_header_attribute(soap, val, "start")); soap->imode |= SOAP_ENC_MIME; type = soap_http_header_attribute(soap, val, "type"); if (type && !strcmp(type, "application/xop+xml")) soap->imode |= SOAP_ENC_MTOM; } action = soap_http_header_attribute(soap, val, "action"); if (action) { if (*action == '"') { soap->action = soap_strdup(soap, action + 1); if (soap->action && *soap->action) 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_strtoull(val, NULL, 10); if (soap->length == 0) soap->body = 0; } 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_http_header_attribute(soap, val, "gzip")) soap->zlib_out = SOAP_ZLIB_GZIP; else #endif if (strchr(val, '*') || soap_http_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, "close")) soap->keep_alive = 0; } #if !defined(WITH_LEAN) || defined(WITH_NTLM) else if (!soap_tag_cmp(key, "Authorization") || !soap_tag_cmp(key, "Proxy-Authorization")) { #ifdef WITH_NTLM if (!soap_tag_cmp(val, "NTLM*")) { soap->ntlm_challenge = soap_strdup(soap, val + 4); } else #endif if (!soap_tag_cmp(val, "Bearer *")) { soap->bearer = soap_strdup(soap, val + 7); } else 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'; s = strchr(soap->tmpbuf, ':'); if (s) { *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_tag_cmp(key, "Proxy-Authenticate")) { #ifdef WITH_NTLM if (!soap_tag_cmp(val, "NTLM*")) soap->ntlm_challenge = soap_strdup(soap, val + 4); else #endif soap->authrealm = soap_strdup(soap, soap_http_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_OK || (soap->error = soap->fposthdr(soap, NULL, NULL)) != SOAP_OK) return soap->error; } } #endif else if (!soap_tag_cmp(key, "SOAPAction")) { if (*val == '"') { soap->action = soap_strdup(soap, val + 1); if (*soap->action) soap->action[strlen(soap->action) - 1] = '\0'; } else soap->action = soap_strdup(soap, val); } else if (!soap_tag_cmp(key, "Location")) { soap_strcpy(soap->endpoint, sizeof(soap->endpoint), val); } else if (!soap_tag_cmp(key, "X-Forwarded-For")) { soap->proxy_from = soap_strdup(soap, val); } else if (!soap_tag_cmp(key, "Origin")) { soap->origin = soap_strdup(soap, val); soap->cors_origin = soap->cors_allow; } else if (!soap_tag_cmp(key, "Access-Control-Request-Method")) { soap->cors_method = soap_strdup(soap, val); } else if (!soap_tag_cmp(key, "Access-Control-Request-Headers")) { soap->cors_header = 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 /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) SOAP_FMAC1 const char* SOAP_FMAC2 soap_http_header_attribute(struct soap *soap, const char *line, const char *key) { const char *s = line; if (s) { while (*s) { 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 /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_key(char *buf, size_t len, const char *val) { return soap_decode(buf, len, val, "=,;"); } #endif /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) 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 /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) static const char * soap_decode(char *buf, size_t len, const char *val, const char *sep) { const char *s; char *t = buf; size_t i = len; for (s = val; *s; s++) if (*s != ' ' && *s != '\t' && !strchr(sep, *s)) break; if (len > 0) { if (*s == '"') { s++; while (*s && *s != '"' && --i) *t++ = *s++; } else { while (*s && !strchr(sep, *s) && --i) { if (*s == '%' && s[1] && s[2]) { *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++; } } buf[len - 1] = '\0'; /* appease static checkers that get confused */ } *t = '\0'; while (*s && !strchr(sep, *s)) s++; return s; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static const char* http_error(struct soap *soap, int status) { const char *msg = SOAP_STR_EOS; (void)soap; (void)status; #ifndef WITH_LEAN msg = soap_code_str(h_http_error_codes, status); if (!msg) msg = SOAP_STR_EOS; #endif return msg; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_get(struct soap *soap) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP GET request\n")); return SOAP_GET_METHOD; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_put(struct soap *soap) { (void)soap; return SOAP_PUT_METHOD; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_patch(struct soap *soap) { (void)soap; return SOAP_PATCH_METHOD; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_del(struct soap *soap) { (void)soap; return SOAP_DEL_METHOD; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_200(struct soap *soap) { if (soap->origin && soap->cors_method) /* CORS Origin and Access-Control-Request-Method headers */ { soap->cors_origin = soap->cors_allow; /* modify this code or hook your own soap->fopt() callback with logic */ soap->cors_methods = "GET, PUT, PATCH, POST, HEAD, OPTIONS"; soap->cors_headers = soap->cors_header; } return soap_send_empty_response(soap, 200); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_post(struct soap *soap, const char *endpoint, const char *host, int port, const char *path, const char *action, ULONG64 count) { const char *s; int err; size_t l; switch (soap->status) { case SOAP_GET: s = "GET"; break; case SOAP_PUT: s = "PUT"; break; case SOAP_PATCH: s = "PATCH"; break; case SOAP_DEL: s = "DELETE"; break; case SOAP_CONNECT: s = "CONNECT"; break; case SOAP_HEAD: s = "HEAD"; break; case SOAP_OPTIONS: s = "OPTIONS"; break; default: s = "POST"; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP %s to %s\n", s, endpoint ? endpoint : "(null)")); if (!endpoint || (soap_tag_cmp(endpoint, "http:*") && soap_tag_cmp(endpoint, "https:*") && soap_tag_cmp(endpoint, "httpg:*"))) return SOAP_OK; /* set l to prevent overruns ('host' and 'soap->host' are substrings of 'endpoint') */ l = strlen(endpoint) + strlen(soap->http_version) + 80; if (l > sizeof(soap->tmpbuf)) return soap->error = SOAP_EOM; if (soap->status == SOAP_CONNECT) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s %s:%d HTTP/%s", s, soap->host, soap->port, soap->http_version); else if (soap->proxy_host && endpoint) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s %s HTTP/%s", s, endpoint, soap->http_version); else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s /%s HTTP/%s", s, (*path == '/' ? path + 1 : path), soap->http_version); err = soap->fposthdr(soap, soap->tmpbuf, NULL); if (err) return err; #ifdef WITH_OPENSSL if ((soap->ssl && port != 443) || (!soap->ssl && port != 80)) #else if (port != 80) #endif { #ifdef WITH_IPV6 if (*host != '[' && strchr(host, ':')) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "[%s]:%d", host, port); /* RFC 2732 */ else #endif (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s:%d", host, port); } else { #ifdef WITH_IPV6 if (*host != '[' && strchr(host, ':')) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "[%s]", host); /* RFC 2732 */ else #endif soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), host); } err = soap->fposthdr(soap, "Host", soap->tmpbuf); if (err) return err; err = soap->fposthdr(soap, "User-Agent", "gSOAP/2.8"); if (err) return err; if (soap->origin) { err = soap->fposthdr(soap, "Origin", soap->origin); if (err) return err; if (soap->status == SOAP_OPTIONS) { err = soap->fposthdr(soap, "Access-Control-Request-Method", soap->cors_method ? soap->cors_method : "POST"); if (err) return err; if (soap->cors_header) { err = soap->fposthdr(soap, "Access-Control-Request-Headers", soap->cors_header); if (err) return err; } } } err = soap_puthttphdr(soap, SOAP_OK, count); if (err) return err; #ifndef WITH_LEANER if ((soap->imode & SOAP_ENC_MTOM)) { err = soap->fposthdr(soap, "Accept", "multipart/related,application/xop+xml,*/*;q=0.8"); if (err) return err; } #endif #ifdef WITH_ZLIB #ifdef WITH_GZIP err = soap->fposthdr(soap, "Accept-Encoding", "gzip,deflate"); #else err = soap->fposthdr(soap, "Accept-Encoding", "deflate"); #endif if (err) return err; #endif #if !defined(WITH_LEAN) || defined(WITH_NTLM) if (soap->bearer) { l = strlen(soap->bearer); (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l + 1), "Bearer %s", soap->bearer); err = soap->fposthdr(soap, "Authorization", soap->tmpbuf); if (err) return err; } #ifdef WITH_NTLM if (soap->ntlm_challenge) { l = strlen(soap->ntlm_challenge); if (l) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l + 5), "NTLM %s", soap->ntlm_challenge); if (soap->proxy_host) { err = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf); if (err) return err; } else { err = soap->fposthdr(soap, "Authorization", soap->tmpbuf); if (err) return err; } } } else { #endif if (soap->userid && soap->passwd) { soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "Basic "); (SOAP_SNPRINTF(soap->tmpbuf + 262, sizeof(soap->tmpbuf) - 262, strlen(soap->userid) + strlen(soap->passwd) + 1), "%s:%s", soap->userid, soap->passwd); soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, (int)strlen(soap->tmpbuf + 262)); err = soap->fposthdr(soap, "Authorization", soap->tmpbuf); if (err) return err; } if (soap->proxy_userid && soap->proxy_passwd) { soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "Basic "); (SOAP_SNPRINTF(soap->tmpbuf + 262, sizeof(soap->tmpbuf) - 262, strlen(soap->proxy_userid) + strlen(soap->proxy_passwd) + 1), "%s:%s", soap->proxy_userid, soap->proxy_passwd); soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, (int)strlen(soap->tmpbuf + 262)); err = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf); if (err) return err; } #ifdef WITH_NTLM } #endif #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 (action && soap->status != SOAP_GET && soap->status != SOAP_DEL) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(action) + 2), "\"%s\"", action); err = soap->fposthdr(soap, "SOAPAction", soap->tmpbuf); if (err) return err; } return soap->fposthdr(soap, NULL, NULL); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_send_header(struct soap *soap, const char *s) { 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 /******************************************************************************/ #ifndef WITH_NOHTTP 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 /******************************************************************************/ #ifndef WITH_NOHTTP static int http_response(struct soap *soap, int status, ULONG64 count) { int err; char http[32]; int code = status; const char *line; #ifdef WMW_RPM_IO if (soap->rpmreqid) httpOutputEnable(soap->rpmreqid); if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket) || soap->recvfd != 0 || soap->sendfd != 1 || soap->os) /* RPM behaves as if standalone */ #else if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket) #ifndef UNDER_CE || soap->recvfd != 0 || soap->sendfd != 1 #else || soap->recvfd != stdin || soap->sendfd != stdout #endif || soap->os) /* standalone server application (over sockets), not CGI (over stdin/out) */ #endif (SOAP_SNPRINTF(http, sizeof(http), strlen(soap->http_version) + 5), "HTTP/%s", soap->http_version); else soap_strcpy(http, sizeof(http), "Status:"); if (status >= SOAP_FILE && status < SOAP_FILE + 600) { code = status - SOAP_FILE; if (code == 0) code = 200; } else if (!status || status == SOAP_HTML) { if (count || ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK)) code = 200; else code = 202; } else if (status < 200 || status >= 600) { const char *s = *soap_faultcode(soap); if (status >= SOAP_GET_METHOD && status <= SOAP_HTTP_METHOD) code = 405; else if (soap->version == 2 && (!s || !strcmp(s, "SOAP-ENV:Sender"))) code = 400; else code = 500; } line = http_error(soap, code); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP Status = %d %s\n", code, line)); (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), sizeof(http) + 22 + strlen(line)), "%s %d %s", http, code, line); err = soap->fposthdr(soap, soap->tmpbuf, NULL); if (err) return err; #ifndef WITH_LEAN if (status == 401) { (SOAP_SNPRINTF_SAFE(soap->tmpbuf, sizeof(soap->tmpbuf)), "Basic realm=\"%s\"", (soap->authrealm && strlen(soap->authrealm) + 14 < sizeof(soap->tmpbuf)) ? soap->authrealm : "gSOAP Web Service"); err = soap->fposthdr(soap, "WWW-Authenticate", soap->tmpbuf); if (err) return err; } else if ((status >= 301 && status <= 303) || status == 307) { err = soap->fposthdr(soap, "Location", soap->endpoint); if (err) return err; } #endif err = soap->fposthdr(soap, "Server", "gSOAP/2.8"); if (err) return err; if (soap->cors_origin) { err = soap->fposthdr(soap, "Access-Control-Allow-Origin", soap->cors_origin); if (err) return err; err = soap->fposthdr(soap, "Access-Control-Allow-Credentials", "true"); if (err) return err; if (soap->cors_methods) { err = soap->fposthdr(soap, "Access-Control-Allow-Methods", soap->cors_methods); if (err) return err; if (soap->cors_headers) { err = soap->fposthdr(soap, "Access-Control-Allow-Headers", soap->cors_headers); if (err) return err; } } } if (soap->x_frame_options) { err = soap->fposthdr(soap, "X-Frame-Options", soap->x_frame_options); if (err) return err; } soap->cors_origin = NULL; soap->cors_methods = NULL; soap->cors_headers = NULL; err = soap_puthttphdr(soap, status, count); if (err) return err; #ifdef WITH_COOKIES if (soap_putsetcookies(soap)) return soap->error; soap_free_cookies(soap); #endif return soap->fposthdr(soap, NULL, NULL); } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_response(struct soap *soap, int status) { ULONG64 count; if (!(soap->omode & (SOAP_ENC_PLAIN | SOAP_IO_STORE /* this tests for chunking too */)) && (status == SOAP_HTML || (status >= SOAP_FILE && status < SOAP_FILE + 600))) soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE; soap->status = status; count = soap_count_attachments(soap); if (soap_init_send(soap)) return soap->error; #ifndef WITH_NOHTTP if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_PLAIN)) { int k = soap->mode; soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB); if ((k & SOAP_IO) != SOAP_IO_FLUSH) soap->mode |= SOAP_IO_BUFFER; soap->error = soap->fresponse(soap, status, count); if (soap->error) return soap->error; #ifndef WITH_LEANER if ((k & SOAP_IO) == SOAP_IO_CHUNK) { if (soap_flush(soap)) return soap->error; } #endif soap->mode = k; } #endif #ifndef WITH_LEANER if (soap_begin_attachments(soap)) return soap->error; #endif return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_extend_url(struct soap *soap, const char *s, const char *t) { if (s) soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), s); else *soap->msgbuf = '\0'; if (t && (*t == '/' || *t == '?')) { char *r = strchr(soap->msgbuf, '?'); if (r) { if (*t == '?') { soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), "&"); soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), t + 1); } else /* *t == '/' */ { size_t l = r - soap->msgbuf; *r = '\0'; soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), t); if (s) soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), s + l); } } else { soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), t); } } return soap->msgbuf; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_extend_url_query(struct soap *soap, const char *s, const char *t) { (void)soap_extend_url(soap, s, t); /* fills and returns soap->msgbuf */ if (strchr(soap->msgbuf, '?')) soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), "&"); else soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), "?"); return soap->msgbuf; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_url_query(struct soap *soap, const char *s, const char *t) { size_t n = strlen(s); if (n) { char *r = soap->msgbuf; size_t k = n - (s[n-1] == '='); while ((r = strchr(r, '{')) != NULL) if (!strncmp(++r, s, k) && r[k] == '}') break; if (r) { size_t m = t ? strlen(t) : 0; (void)soap_memmove(r + m - 1, soap->msgbuf + sizeof(soap->msgbuf) - (r + n + 1), r + k + 1, strlen(r + k + 1) + 1); if (m) (void)soap_memmove(r - 1, soap->msgbuf + sizeof(soap->msgbuf) - (r - 1), t, m); } else { soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), s); if (t) { int m = (int)strlen(soap->msgbuf); /* msgbuf length is max SOAP_TMPLEN or just 1024 bytes */ (void)soap_encode_url(t, soap->msgbuf + m, (int)sizeof(soap->msgbuf) - m); } soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), "&"); } } } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_encode_url(const char *s, char *t, int len) { int c; int n = len; if (s && n > 0) { while ((c = *s++) && --n > 0) { if (c == '-' || c == '.' || (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || c == '_' || (c >= 'a' && c <= 'z') || 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 const char* SOAP_FMAC2 soap_encode_url_string(struct soap *soap, const char *s) { if (s) { int n = 3 * (int)strlen(s) + 1; char *t = (char*)soap_malloc(soap, n); if (t) { (void)soap_encode_url(s, t, n); return t; } } return SOAP_STR_EOS; } /******************************************************************************\ * * HTTP Cookies RFC 6265 * \******************************************************************************/ #ifdef WITH_COOKIES SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_cookie(struct soap *soap, const char *name, const char *domain, const char *path) { return soap_cookie_env(soap, name, domain, path, 0); } /******************************************************************************/ SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_cookie_env(struct soap *soap, const char *name, const char *domain, const char *path, short env) { struct soap_cookie *p; if (!domain && !env) domain = soap->cookie_domain; if (!path) path = soap->cookie_path; if (!path) path = SOAP_STR_EOS; else if (*path == '/') path++; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Search cookie='%s' domain='%s' path='%s' env=%hd\n", name, domain ? domain : "(null)", path ? path : "(null)", env)); 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 ((!env || p->env) && !strcmp(p->name, name) && (!domain || (domain && p->domain && !strcmp(p->domain, domain))) && (!path || (path && p->path && !strncmp(p->path, path, strlen(p->path))))) 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) { q = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie)); if (q) { size_t l = strlen(name) + 1; q->name = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) q->name = (char*)SOAP_MALLOC(soap, l); if (q->name) (void)soap_memcpy(q->name, l, name, l); 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) { if (!value || strcmp(value, q->value)) { SOAP_FREE(soap, q->value); q->value = NULL; } } if (value && *value && !q->value) { size_t l = strlen(value) + 1; q->value = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) q->value = (char*)SOAP_MALLOC(soap, l); if (q->value) soap_strcpy(q->value, l, value); } if (q->domain) { if (!domain || strcmp(domain, q->domain)) { SOAP_FREE(soap, q->domain); q->domain = NULL; } } if (domain && !q->domain) { size_t l = strlen(domain) + 1; q->domain = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) q->domain = (char*)SOAP_MALLOC(soap, l); if (q->domain) soap_strcpy(q->domain, l, domain); } if (q->path) { if (!path || strncmp(path, q->path, strlen(q->path))) { SOAP_FREE(soap, q->path); q->path = NULL; } } if (path && !q->path) { size_t l = strlen(path) + 1; q->path = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) q->path = (char*)SOAP_MALLOC(soap, l); if (q->path) soap_strcpy(q->path, l, 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) path = SOAP_STR_EOS; else if (*path == '/') path++; for (p = &soap->cookies, q = *p; q; q = *p) { if (!strcmp(q->name, name) && (!q->domain || !strcmp(q->domain, domain)) && (!q->path || !strncmp(q->path, path, strlen(q->path)))) { 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 p = &q->next; } } /******************************************************************************/ SOAP_FMAC1 const char * SOAP_FMAC2 soap_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; p = soap_cookie(soap, name, domain, path); if (p) return p->value; return NULL; } /******************************************************************************/ SOAP_FMAC1 const char * SOAP_FMAC2 soap_env_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; p = soap_cookie(soap, name, domain, path); if (p && 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; p = soap_cookie(soap, name, domain, path); if (p) return (time_t)p->expire; return -1; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_expire(struct soap *soap, const char *name, long maxage, const char *domain, const char *path) { struct soap_cookie *p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set cookie expiration max-age=%ld: cookie='%s' domain='%s' path='%s'\n", maxage, name, domain ? domain : "(null)", path ? path : "(null)")); p = soap_cookie(soap, name, domain, path); if (p) { p->maxage = maxage; p->modified = 1; return SOAP_OK; } return SOAP_ERR; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_secure(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set cookie secure: cookie='%s' domain='%s' path='%s'\n", name, domain ? domain : "(null)", path ? path : "(null)")); p = soap_cookie(soap, name, domain, path); if (p) { p->secure = 1; 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; p = soap_cookie(soap, name, domain, path); if (p) { 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; p = soap_cookie(soap, name, domain, path); if (p) { 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 ) && p->name && p->value && *p->name && *p->value) { s = tmp; s += soap_encode_url(p->name, s, 3967); *s++ = '='; s += soap_encode_url(p->value, s, 3968 - (int)(s-tmp)); t = p->domain ? p->domain : soap->cookie_domain; if (t && (int)strlen(t) < 3968 - (int)(s-tmp)) { soap_strcpy(s, 4096 - (s-tmp), ";Domain="); s += 8; soap_strcpy(s, 4096 - (s-tmp), t); s += strlen(s); } t = p->path ? p->path : soap->cookie_path; if (t && (int)strlen(t) < 3976 - (int)(s-tmp)) { soap_strcpy(s, 4096 - (s-tmp), ";Path=/"); s += 7; if (*t == '/') t++; if (strchr(t, '%')) /* already URL encoded? */ { soap_strcpy(s, 4096 - (s-tmp), t); s += strlen(s); } else { s += soap_encode_url(t, s, 4096 - (int)(s-tmp)); } } if (p->version > 0 && s-tmp < 3983) { (SOAP_SNPRINTF(s, 4096 - (s-tmp), 29), ";Version=%u", p->version); s += strlen(s); } if (p->maxage >= 0 && s-tmp < 4012) { (SOAP_SNPRINTF(s, 4096 - (s-tmp), 29), ";Max-Age=%ld", p->maxage); s += strlen(s); } #if !defined(WITH_LEAN) #if defined(HAVE_GMTIME_R) || defined(HAVE_GMTIME) if (p->maxage >= 0 && s-tmp < 4041) { time_t n = time(NULL) + p->maxage; struct tm T, *pT = &T; size_t l = 0; /* format is Wed, 09 Jun 2021 10:18:14 GMT */ #if defined(HAVE_GMTIME_R) if (gmtime_r(&n, pT) != SOAP_FUNC_R_ERR) l = strftime(s, 4096 - (s-tmp), ";Expires=%a, %d %b %Y %H:%M:%S GMT", pT); #else pT = gmtime(&n); if (pT) l = strftime(s, 4096 - (s-tmp), ";Expires=%a, %d %b %Y %H:%M:%S GMT", pT); #endif s += l; } #endif #endif if (s-tmp < 4079 && (p->secure #ifdef WITH_OPENSSL || soap->ssl #endif )) { soap_strcpy(s, 4096 - (s-tmp), ";Secure"); s += strlen(s); } if (s-tmp < 4086) soap_strcpy(s, 4096 - (s-tmp), ";HttpOnly"); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set-Cookie: %s\n", tmp)); soap->error = soap->fposthdr(soap, "Set-Cookie", tmp); if (soap->error) 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; char *s, tmp[4096]; unsigned int version = 0; time_t now = time(NULL); if (!domain || !path) return SOAP_OK; s = tmp; 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 >= (time_t)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; if (!tcp_gethostbyname(soap, (char*)domain, &hostent, NULL)) { const char *r = hostent.h_name; if (*t == '.') { size_t k = strlen(hostent.h_name); if (k >= n) r = hostent.h_name + k - n; } flag = !strncmp(t, r, n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Domain cookie %s host %s (match=%d)\n", t, r, flag)); } } #endif if (flag && (!q->path || !strncmp(q->path, path, strlen(q->path))) #ifndef WITH_INSECURE_COOKIES && (!q->secure || secure) #endif ) { size_t n = 12; if (q->name) n += 3*strlen(q->name); if (q->value && *q->value) n += 3*strlen(q->value) + 1; if (q->path && *q->path) n += strlen(q->path) + 9; if (q->domain) n += strlen(q->domain) + 11; if (s + n >= tmp + sizeof(tmp)) { if (s == tmp) return SOAP_OK; /* header too big, cannot split */ /* split up HTTP header */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie: %s\n", tmp)); soap->error = soap->fposthdr(soap, "Cookie", tmp); if (soap->error) return soap->error; s = tmp; } else if (s != tmp) { *s++ = ';'; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending cookie %s=%s path=\"/%s\" domain=\"%s\"\n", q->name ? q->name : "(null)", q->value ? q->value : "(null)", q->path ? q->path : "(null)", q->domain ? q->domain : "(null)")); if (q->version != version && (s-tmp) + (size_t)36 < sizeof(tmp)) { (SOAP_SNPRINTF_SAFE(s, sizeof(tmp) - (s-tmp)), "$Version=%u;", q->version); version = q->version; s += strlen(s); } if (q->name && (s-tmp) + strlen(q->name) + (size_t)15 < sizeof(tmp)) { s += soap_encode_url(q->name, s, (int)(tmp+sizeof(tmp)-s)-15); } if (q->value && *q->value && (s-tmp) + strlen(q->value) + (size_t)16 < sizeof(tmp)) { *s++ = '='; s += soap_encode_url(q->value, s, (int)(tmp+sizeof(tmp)-s)-16); } if (q->path && (s-tmp) + strlen(q->path) + (size_t)36 < sizeof(tmp)) { (SOAP_SNPRINTF_SAFE(s, sizeof(tmp) - (s-tmp)), ";$Path=\"/%s\"", (*q->path == '/' ? q->path + 1 : q->path)); s += strlen(s); } if (q->domain && (s-tmp) + strlen(q->domain) + (size_t)36 < sizeof(tmp)) { (SOAP_SNPRINTF_SAFE(s, sizeof(tmp) - (s-tmp)), ";$Domain=\"%s\"", q->domain); s += strlen(s); } } p = &q->next; } } if (s != tmp) { soap->error = soap->fposthdr(soap, "Cookie", tmp); if (soap->error) return soap->error; } 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")) { s = soap_decode_val(tmp, sizeof(tmp), s); if (s) { if (p) p->version = (int)soap_strtol(tmp, NULL, 10); else version = (int)soap_strtol(tmp, NULL, 10); } } else if (!soap_tag_cmp(tmp, "$Path")) { s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { size_t l = strlen(tmp) + 1; t = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) t = (char*)SOAP_MALLOC(soap, l); if (t) (void)soap_memcpy((void*)t, l, (const void*)tmp, l); } 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) { size_t l = strlen(tmp) + 1; t = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) t = (char*)SOAP_MALLOC(soap, l); if (t) (void)soap_memcpy((void*)t, l, (const void*)tmp, l); } 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) { size_t l = strlen(tmp) + 1; p->path = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) p->path = (char*)SOAP_MALLOC(soap, l); if (p->path) (void)soap_memcpy((void*)p->path, l, (const void*)tmp, l); } 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) { size_t l = strlen(tmp) + 1; p->domain = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) p->domain = (char*)SOAP_MALLOC(soap, l); if (p->domain) (void)soap_memcpy((void*)p->domain, l, (const void*)tmp, l); } else { p->domain = NULL; } } else if (p && !soap_tag_cmp(tmp, "Version")) { s = soap_decode_val(tmp, sizeof(tmp), s); p->version = (unsigned int)soap_strtoul(tmp, NULL, 10); } else if (p && !soap_tag_cmp(tmp, "Max-Age")) { s = soap_decode_val(tmp, sizeof(tmp), s); p->expire = (ULONG64)(now + soap_strtol(tmp, NULL, 10)); } else if (p && !soap_tag_cmp(tmp, "Expires")) { if (*s == '=') { s = soap_decode(tmp, sizeof(tmp), s + 1, ";"); if (!p->expire && strlen(tmp) >= 23) { char a[3]; struct tm T; static const char mns[] = "anebarprayunulugepctovec"; const char *t = strchr(tmp, ' '); if (t) { a[2] = '\0'; memset((void*)&T, 0, sizeof(T)); if (t[1] >= 'A') { /* format is Sun Nov 6 08:49:37 94 */ a[0] = t[2]; a[1] = t[3]; T.tm_mon = (int)(strstr(mns, a) - mns) / 2; a[0] = t[5]; a[1] = t[6]; T.tm_mday = (int)soap_strtol(a, NULL, 10); if (t[17] && t[18] && t[19] != ' ') t += 2; /* format is Sun Nov 6 08:49:37 2017 - ANSI-C */ a[0] = t[17]; a[1] = t[18]; T.tm_year = 100 + (int)soap_strtol(a, NULL, 10); t += 6; } else { /* format is Sunday, 06-Nov-17 08:49:37 GMT - RFC 850 */ a[0] = t[1]; a[1] = t[2]; T.tm_mday = (int)soap_strtol(a, NULL, 10); a[0] = t[5]; a[1] = t[6]; T.tm_mon = (int)(strstr(mns, a) - mns) / 2; if (t[10] != ' ') t += 2; /* format is Wed, 09 Jun 2021 10:18:14 GMT - RFC 822 */ a[0] = t[8]; a[1] = t[9]; T.tm_year = 100 + (int)soap_strtol(a, NULL, 10); t += 11; } a[0] = t[0]; a[1] = t[1]; T.tm_hour = (int)soap_strtol(a, NULL, 10); a[0] = t[3]; a[1] = t[4]; T.tm_min = (int)soap_strtol(a, NULL, 10); a[0] = t[6]; a[1] = t[7]; T.tm_sec = (int)soap_strtol(a, NULL, 10); p->expire = (ULONG64)soap_timegm(&T); } } } } else if (p && !soap_tag_cmp(tmp, "Secure")) { p->secure = 1; s = soap_decode_val(tmp, sizeof(tmp), s); } else if (p && !soap_tag_cmp(tmp, "HttpOnly")) { s = soap_decode_val(tmp, sizeof(tmp), s); } else if (p && !soap_tag_cmp(tmp, "Comment")) { s = soap_decode_val(tmp, sizeof(tmp), s); } else if (*tmp) { if (p) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie='%s' value='%s' domain='%s' path='%s' expire=" SOAP_ULONG_FORMAT " secure=%d\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->expire, p->secure)); q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path); if (q) { 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); } p = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie)); if (p) { size_t l = strlen(tmp) + 1; p->name = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) p->name = (char*)SOAP_MALLOC(soap, l); if (p->name) (void)soap_memcpy(p->name, l, tmp, l); s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { l = strlen(tmp) + 1; p->value = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) p->value = (char*)SOAP_MALLOC(soap, l); if (p->value) (void)soap_memcpy((void*)p->value, l, (const void*)tmp, l); } else { p->value = NULL; } if (domain) { p->domain = domain; } else { p->domain = NULL; } if (path) { p->path = path; } else if (*soap->path) { l = strlen(soap->path) + 1; p->path = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) p->path = (char*)SOAP_MALLOC(soap, l); if (p->path) (void)soap_memcpy((void*)p->path, l, (const void*)soap->path, l); } else { p->path = (char*)SOAP_MALLOC(soap, 2); if (p->path) (void)soap_memcpy((void*)p->path, 2, (const void*)"/", 2); } p->expire = 0; p->secure = 0; p->version = version; } } } if (p) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie='%s' value='%s' domain='%s' path='%s' expire=" SOAP_ULONG_FORMAT " secure=%d\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->expire, p->secure)); q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path); if (q) { 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] */ s = getenv("HTTP_COOKIE"); if (!s) 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; (void)copy; q = &r; for (p = soap->cookies; p; p = p->next) { *q = (struct soap_cookie*)SOAP_MALLOC(copy, sizeof(struct soap_cookie)); if (!*q) return r; **q = *p; if (p->name) { size_t l = strlen(p->name) + 1; (*q)->name = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) (*q)->name = (char*)SOAP_MALLOC(copy, l); if ((*q)->name) (void)soap_memcpy((*q)->name, l, p->name, l); } if (p->value) { size_t l = strlen(p->value) + 1; (*q)->value = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) (*q)->value = (char*)SOAP_MALLOC(copy, l); if ((*q)->value) (void)soap_memcpy((*q)->value, l, p->value, l); } if (p->domain) { size_t l = strlen(p->domain) + 1; (*q)->domain = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) (*q)->domain = (char*)SOAP_MALLOC(copy, l); if ((*q)->domain) (void)soap_memcpy((*q)->domain, l, p->domain, l); } if (p->path) { size_t l = strlen(p->path) + 1; (*q)->path = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) (*q)->path = (char*)SOAP_MALLOC(copy, l); if ((*q)->path) (void)soap_memcpy((*q)->path, l, p->path, l); } 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 */ /******************************************************************************/ SOAP_FMAC1 size_t SOAP_FMAC2 soap_hash(const char *s) { size_t h = 0; while (*s) h = 65599*h + *s++; return h % SOAP_IDHASH; } /******************************************************************************/ static void soap_init_pht(struct soap *soap) { int i; soap->pblk = NULL; soap->pidx = 0; for (i = 0; i < (int)SOAP_PTRHASH; i++) soap->pht[i] = NULL; } /******************************************************************************/ SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_versioning(soap_new)(soap_mode imode, soap_mode omode) { struct soap *soap; #ifdef __cplusplus soap = SOAP_NEW_UNMANAGED(struct soap); #else soap = (struct soap*)SOAP_MALLOC_UNMANAGED(sizeof(struct soap)); #endif if (soap) soap_versioning(soap_init)(soap, imode, omode); return soap; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_free(struct soap *soap) { soap_done(soap); #ifdef __cplusplus SOAP_DELETE_UNMANAGED(soap); #else SOAP_FREE_UNMANAGED(soap); #endif } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_del(struct soap *soap) { free(soap); } /******************************************************************************/ static void soap_free_pht(struct soap *soap) { struct soap_pblk *pb, *next; 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; } /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_embed(struct soap *soap, const void *p, const void *a, int n, int t) { int id; struct soap_plist *pp; if (soap->version == 2) soap->encoding = 1; if (!p || (!soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH)) || (soap->mode & SOAP_XML_TREE)) return 0; 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_is_single(soap, pp)) return 0; soap_set_embedded(soap, pp); } return id; } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup(struct soap *soap, const void *p, int type, struct soap_plist **ppp) { 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; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_enter(struct soap *soap, const void *p, const void *a, int n, int type, struct soap_plist **ppp) { size_t h; struct soap_plist *pp; (void)n; if (!soap->pblk || soap->pidx >= SOAP_PTRBLK) { 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); else h = soap_hash_ptr(p); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pointer enter location=%p array=%p size=%lu type=%d id=%d\n", p, a, (unsigned long)n, type, soap->idnum+1)); pp->next = soap->pht[h]; pp->type = type; pp->mark1 = 0; pp->mark2 = 0; pp->ptr = p; pp->dup = NULL; pp->array = a; pp->size = n; soap->pht[h] = pp; pp->id = ++soap->idnum; return pp->id; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_array_pointer_lookup(struct soap *soap, const void *p, const void *a, int n, int type, struct soap_plist **ppp) { struct soap_plist *pp; *ppp = NULL; if (!p || !a) return 0; for (pp = soap->pht[soap_hash_ptr(a)]; pp; pp = pp->next) { if (pp->type == type && pp->array == a && pp->size == n) { *ppp = pp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d id=%d\n", a, type, pp->id)); return pp->id; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d: not found\n", a, type)); return 0; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_begin_count(struct soap *soap) { soap_free_ns(soap); soap->error = SOAP_OK; #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_UDP)) { soap->mode &= SOAP_IO; soap->mode |= SOAP_IO_BUFFER | SOAP_ENC_PLAIN; } if ((soap->mode & SOAP_IO) == SOAP_IO_STORE || (((soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_ENC_PLAIN)) #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_PLAIN)) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } #endif #ifndef WITH_LEANER if ((soap->mode & SOAP_ENC_MTOM) && (soap->mode & SOAP_ENC_DIME)) soap->mode |= SOAP_ENC_MIME; else if (!(soap->mode & SOAP_ENC_MIME)) 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_SEND; soap->event = 0; soap->evlev = 0; soap->idnum = 0; soap->body = 1; soap->level = 0; soap_clr_attr(soap); soap_set_local_namespaces(soap); #ifndef WITH_LEANER soap->dime.size = 0; /* accumulate total size of attachments */ if (soap->fprepareinitsend && (soap->mode & SOAP_IO) != SOAP_IO_STORE && (soap->error = soap->fprepareinitsend(soap)) != SOAP_OK) return soap->error; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin count phase (socket=%d mode=0x%x count=" SOAP_ULONG_FORMAT ")\n", (int)soap->socket, (unsigned int)soap->mode, soap->count)); #ifndef WITH_LEANER if ((soap->mode & SOAP_IO_LENGTH)) return soap_begin_attachments(soap); #endif return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_end_count(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of count phase\n")); #ifndef WITH_LEANER if ((soap->mode & SOAP_IO_LENGTH)) { if (soap_end_attachments(soap)) return soap->error; if (soap->fpreparefinalsend && (soap->error = soap->fpreparefinalsend(soap)) != SOAP_OK) return soap->error; } #else (void)soap; #endif return SOAP_OK; } /******************************************************************************/ static int soap_init_send(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing for output to socket=%d/fd=%d\n", (int)soap->socket, soap->sendfd)); *soap->tag = '\0'; soap_free_ns(soap); soap->error = SOAP_OK; soap->mode = soap->omode | (soap->mode & (SOAP_IO_LENGTH | SOAP_ENC_DIME)); #ifndef WITH_LEAN if ((soap->mode & SOAP_IO_UDP)) { soap->mode &= ~SOAP_IO; soap->mode |= SOAP_IO_BUFFER | SOAP_ENC_PLAIN; if ((soap->mode & SOAP_IO_LENGTH) && soap->count > sizeof(soap->buf)) return soap->error = SOAP_UDP_ERROR; } #endif #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH) { if ((soap->mode & SOAP_ENC_PLAIN)) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } #endif #if !defined(__cplusplus) || defined(WITH_COMPAT) if (soap->os) { *soap->os = NULL; soap->mode = (soap->mode & ~SOAP_IO) | SOAP_IO_STORE; } else #endif if ((soap->mode & SOAP_IO) == SOAP_IO_FLUSH && soap_valid_socket(soap->socket)) { if ((soap->mode & SOAP_IO_LENGTH) || (soap->mode & SOAP_ENC_PLAIN)) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } soap->mode &= ~SOAP_IO_LENGTH; if ((soap->mode & SOAP_IO) == SOAP_IO_STORE && soap_alloc_block(soap) == NULL) return soap->error; if (!(soap->mode & SOAP_IO_KEEPALIVE)) soap->keep_alive = 0; #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 if (!(soap->mode & SOAP_ENC_MIME)) { 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) && !soap->os && soap->sendfd >= 0) /* Set win32 stdout or soap->sendfd to BINARY, e.g. to support DIME */ #ifdef __BORLANDC__ setmode(soap->sendfd, _O_BINARY); #else _setmode(soap->sendfd, _O_BINARY); #endif #endif #endif #endif #endif if ((soap->mode & SOAP_IO)) soap->buflen = soap->bufidx = 0; soap->chunksize = 0; soap->ns = 0; soap->null = 0; soap->position = 0; soap->mustUnderstand = 0; soap->encoding = 0; soap->event = 0; soap->evlev = 0; soap->idnum = 0; soap->body = 1; 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->d_stream) { soap->d_stream = (z_stream*)SOAP_MALLOC(soap, sizeof(z_stream)); if (!soap->d_stream) return soap->error = SOAP_EOM; soap->d_stream->zalloc = Z_NULL; soap->d_stream->zfree = Z_NULL; soap->d_stream->opaque = Z_NULL; soap->d_stream->next_in = Z_NULL; } if (!soap->z_buf) soap->z_buf = (char*)SOAP_MALLOC(soap, sizeof(soap->buf)); if (!soap->z_buf) return soap->error = SOAP_EOM; soap->d_stream->next_out = (Byte*)soap->z_buf; soap->d_stream->avail_out = sizeof(soap->buf); #ifdef WITH_GZIP if (soap->zlib_out != SOAP_ZLIB_DEFLATE) { (void)soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)"\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 = sizeof(soap->buf) - 10; soap->z_crc = crc32(0L, NULL, 0); soap->zlib_out = SOAP_ZLIB_GZIP; if (soap->z_dict) *((Byte*)soap->z_buf + 2) = 0xff; 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; if (soap->z_dict) { if (deflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != 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=" SOAP_ULONG_FORMAT ")\n", (int)soap->socket, soap->mode, soap->count)); soap->part = SOAP_BEGIN_SEND; #ifndef WITH_LEANER if (soap->fprepareinitsend && (soap->mode & SOAP_IO) == SOAP_IO_STORE && (soap->error = soap->fprepareinitsend(soap)) != SOAP_OK) return soap->error; #endif #ifndef WITH_LEAN soap->start = (ULONG64)time(NULL); #endif return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_begin_send(struct soap *soap) { #ifndef WITH_LEANER if (soap_init_send(soap)) return soap->error; return soap_begin_attachments(soap); #else return soap_init_send(soap); #endif } /******************************************************************************/ #ifndef WITH_NOIDREF 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 /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_reference(struct soap *soap, const void *p, int t) { struct soap_plist *pp; if (!p || (!soap->encodingStyle && !(soap->omode & (SOAP_ENC_DIME | SOAP_ENC_MIME | SOAP_ENC_MTOM | SOAP_XML_GRAPH))) || (soap->omode & 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)) { 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 /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_array_reference(struct soap *soap, const void *p, const void *a, int n, int t) { struct soap_plist *pp; if (!p || !a || (!soap->encodingStyle && !(soap->omode & SOAP_XML_GRAPH)) || (soap->omode & SOAP_XML_TREE)) return 1; if (soap_array_pointer_lookup(soap, p, a, n, t, &pp)) { if (pp->mark1 == 0) { pp->mark1 = 2; pp->mark2 = 2; } } else if (!soap_pointer_enter(soap, p, a, n, t, &pp)) { return 1; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array reference %p ptr=%p n=%lu t=%d (%d %d)\n", p, a, (unsigned long)n, t, (int)pp->mark1, (int)pp->mark2)); return pp->mark1; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_attachment_reference(struct soap *soap, const void *p, const void *a, int n, int t, const char *id, const char *type) { struct soap_plist *pp; if (!p || !a || (!soap->encodingStyle && !(soap->omode & SOAP_XML_GRAPH) && !id && !type) || (soap->omode & SOAP_XML_TREE)) return 1; if (soap_array_pointer_lookup(soap, p, a, n, t, &pp)) { if (pp->mark1 == 0) { pp->mark1 = 2; pp->mark2 = 2; } } else if (!soap_pointer_enter(soap, p, a, n, t, &pp)) { return 1; } if (id || type) soap->mode |= SOAP_ENC_DIME; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Attachment reference %p ptr=%p n=%lu t=%d (%d %d)\n", p, a, (unsigned long)n, t, (int)pp->mark1, (int)pp->mark2)); return pp->mark1; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_embedded_id(struct soap *soap, int id, const void *p, int t) { struct soap_plist *pp = NULL; if (id >= 0 || (!soap->encodingStyle && !(soap->omode & SOAP_XML_GRAPH)) || (soap->omode & SOAP_XML_TREE)) return id; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id %p type=%d id=%d\n", p, t, id)); if (id < -1) return soap_embed(soap, p, NULL, 0, t); if (id < 0) { id = soap_pointer_lookup(soap, p, t, &pp); if (soap->version == 1 && soap->part != SOAP_IN_HEADER) { 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; } else if (id) { 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 /******************************************************************************/ #ifndef WITH_NOIDREF 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->omode & 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 /******************************************************************************/ #ifndef WITH_NOIDREF 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 /******************************************************************************/ #ifndef WITH_NOIDREF 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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_attachment(struct soap *soap, const char *tag, int id, const void *p, const void *a, int n, const char *aid, const char *atype, const char *aoptions, const char *type, int t) { struct soap_plist *pp; int i; if (!p || !a || (!aid && !atype) || (!soap->encodingStyle && !(soap->omode & (SOAP_ENC_DIME | SOAP_ENC_MIME | SOAP_ENC_MTOM | SOAP_XML_GRAPH))) || (soap->omode & SOAP_XML_TREE)) return soap_element_id(soap, tag, id, p, a, n, type, t, NULL); 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) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(soap->dime_id_format) + 20), soap->dime_id_format, id); aid = soap_strdup(soap, soap->tmpbuf); if (!aid) return -1; } /* Add MTOM xop:Include element when necessary */ /* TODO: this code to be obsoleted with new import/xop.h conventions */ if ((soap->omode & SOAP_ENC_MTOM) && strcmp(tag, "xop:Include")) { if (soap_element_begin_out(soap, tag, 0, type) || soap_element_href(soap, "xop:Include", 0, "xmlns:xop=\"http://www.w3.org/2004/08/xop/include\" 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->omode & SOAP_ENC_MTOM)) content = soap_alloc_multipart(soap, &soap->mime.first, &soap->mime.last, (const char*)a, n); else content = soap_alloc_multipart(soap, &soap->dime.first, &soap->dime.last, (const char*)a, n); if (!content) { soap->error = SOAP_EOM; return -1; } if (!strncmp(aid, "cid:", 4)) /* RFC 2111 */ { if ((soap->omode & SOAP_ENC_MTOM)) { size_t l = strlen(aid) - 1; char *s = (char*)soap_malloc(soap, l); if (s) { s[0] = '<'; (void)soap_strncpy(s + 1, l - 1, aid + 4, l - 3); s[l - 2] = '>'; s[l - 1] = '\0'; 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; } return -1; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF static void soap_init_iht(struct soap *soap) { int i; for (i = 0; i < SOAP_IDHASH; i++) soap->iht[i] = NULL; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF static void soap_free_iht(struct soap *soap) { int i; struct soap_ilist *ip = NULL, *p = NULL; 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 /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 struct soap_ilist * SOAP_FMAC2 soap_lookup(struct soap *soap, const char *id) { 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 /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 struct soap_ilist * SOAP_FMAC2 soap_enter(struct soap *soap, const char *id, int t, size_t n) { size_t h; struct soap_ilist *ip = NULL; size_t l = strlen(id); if (sizeof(struct soap_ilist) + l > l && (SOAP_MAXALLOCSIZE <= 0 || sizeof(struct soap_ilist) + l <= SOAP_MAXALLOCSIZE)) ip = (struct soap_ilist*)SOAP_MALLOC(soap, sizeof(struct soap_ilist) + l); if (ip) { ip->type = t; ip->size = n; ip->ptr = NULL; ip->spine = NULL; ip->link = NULL; ip->copy = NULL; ip->flist = NULL; ip->smart = NULL; ip->shaky = 0; (void)soap_memcpy((char*)ip->id, l + 1, id, l + 1); h = soap_hash(id); /* h = (HASH(id) % SOAP_IDHASH) so soap->iht[h] is safe */ ip->next = soap->iht[h]; soap->iht[h] = ip; } return ip; } #endif /******************************************************************************/ SOAP_FMAC1 void* SOAP_FMAC2 soap_malloc(struct soap *soap, size_t n) { char *p; size_t k = n; if (SOAP_MAXALLOCSIZE > 0 && n > SOAP_MAXALLOCSIZE) { soap->error = SOAP_EOM; return NULL; } if (!soap) return SOAP_MALLOC(soap, n); n += sizeof(short); n += (~n+1) & (sizeof(void*)-1); /* align at 4-, 8- or 16-byte boundary by rounding up */ if (n + sizeof(void*) + sizeof(size_t) < k) { soap->error = SOAP_EOM; return NULL; } p = (char*)SOAP_MALLOC(soap, n + sizeof(void*) + sizeof(size_t)); if (!p) { soap->error = SOAP_EOM; return NULL; } /* set a canary word to detect memory overruns and data corruption */ *(unsigned short*)(p + n - sizeof(unsigned short)) = (unsigned 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; return p; } /******************************************************************************/ #ifdef SOAP_MEM_DEBUG static void soap_init_mht(struct soap *soap) { 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) { int i; 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) { void *p = malloc(size); if (soap) { size_t h = soap_hash_ptr(p); struct soap_mlist *mp = (struct soap_mlist*)malloc(sizeof(struct soap_mlist)); if (soap->fdebug[SOAP_INDEX_TEST]) { 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) { if (!soap) { free(p); } else { size_t h = soap_hash_ptr(p); struct soap_mlist *mp; for (mp = soap->mht[h]; mp; mp = mp->next) if (mp->ptr == p) break; if (mp) { if (mp->live) { if (soap->fdebug[SOAP_INDEX_TEST]) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): free(%p)\n", file, line, p)); } free(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) { size_t h = soap_hash_ptr(p); struct soap_mlist *mp; for (mp = soap->mht[h]; mp; mp = mp->next) if (mp->ptr == p) break; if (mp) mp->live = 0; } #endif /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_dealloc(struct soap *soap, void *p) { if (soap_check_state(soap)) return; if (p) { char **q; for (q = (char**)(void*)&soap->alist; *q; q = *(char***)q) { if (*(unsigned short*)(char*)(*q - sizeof(unsigned short)) != (unsigned 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 { char *q; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free all soap_malloc() data\n")); while (soap->alist) { q = (char*)soap->alist; if (*(unsigned short*)(char*)(q - sizeof(unsigned short)) != (unsigned 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); } /* assume these were deallocated: */ soap->http_content = NULL; soap->action = NULL; soap->fault = NULL; soap->header = NULL; soap->bearer = NULL; soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif #ifndef WITH_LEANER soap_clr_mime(soap); #endif } } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_delete(struct soap *soap, void *p) { struct soap_clist **cp; if (soap_check_state(soap)) return; cp = &soap->clist; if (p) { while (*cp) { if (p == (*cp)->ptr) { struct soap_clist *q = *cp; *cp = q->next; if (q->fdelete(soap, 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) { struct soap_clist *q = *cp; *cp = q->next; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Delete %p type=%d (cp=%p)\n", q->ptr, q->type, (void*)q)); if (q->fdelete(soap, 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; /* assume this was deallocated */ soap->header = NULL; /* assume this was deallocated */ } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_delegate_deletion(struct soap *soap, struct soap *soap_to) { struct soap_clist *cp; char **q; #ifdef SOAP_MEM_DEBUG void *p; struct soap_mlist **mp, *mq; size_t h; #endif for (q = (char**)(void*)&soap->alist; *q; q = *(char***)q) { if (*(unsigned short*)(char*)(*q - sizeof(unsigned short)) != (unsigned 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; } #ifdef SOAP_MEM_DEBUG p = (void*)(*q - *(size_t*)(*q + sizeof(void*))); h = soap_hash_ptr(p); for (mp = &soap->mht[h]; *mp; mp = &(*mp)->next) { if ((*mp)->ptr == p) { mq = *mp; *mp = mq->next; mq->next = soap_to->mht[h]; soap_to->mht[h] = mq; break; } } #endif } *q = (char*)soap_to->alist; soap_to->alist = soap->alist; soap->alist = NULL; #ifdef SOAP_MEM_DEBUG cp = soap->clist; while (cp) { h = soap_hash_ptr(cp); for (mp = &soap->mht[h]; *mp; mp = &(*mp)->next) { if ((*mp)->ptr == cp) { mq = *mp; *mp = mq->next; mq->next = soap_to->mht[h]; soap_to->mht[h] = mq; break; } } cp = cp->next; } #endif cp = soap_to->clist; if (cp) { while (cp->next) cp = cp->next; cp->next = soap->clist; } else { soap_to->clist = soap->clist; } soap->clist = NULL; } /******************************************************************************/ SOAP_FMAC1 struct soap_clist * SOAP_FMAC2 soap_link(struct soap *soap, int t, int n, int (*fdelete)(struct soap*, struct soap_clist*)) { struct soap_clist *cp = NULL; if (soap) { if (n != SOAP_NO_LINK_TO_DELETE) { cp = (struct soap_clist*)SOAP_MALLOC(soap, sizeof(struct soap_clist)); if (!cp) { soap->error = SOAP_EOM; } else { cp->next = soap->clist; cp->type = t; cp->size = n; cp->ptr = NULL; cp->fdelete = fdelete; soap->clist = cp; } } soap->alloced = t; } return cp; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_unlink(struct soap *soap, const void *p) { char **q; struct soap_clist **cp; if (soap && p) { for (q = (char**)(void*)&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 SOAP_OK; /* found and removed from dealloc chain */ } } 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 SOAP_OK; /* found and removed from dealloc chain */ } } } return SOAP_ERR; } /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_lookup_type(struct soap *soap, const char *id) { 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 /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 short SOAP_FMAC2 soap_begin_shaky(struct soap *soap) { short f = soap->shaky; soap->shaky = 1; return f; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 void SOAP_FMAC2 soap_end_shaky(struct soap *soap, short f) { soap->shaky = f; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF static int soap_is_shaky(struct soap *soap, void *p) { (void)p; if (!soap->blist && !soap->shaky) return 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shaky %p\n", p)); return 1; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 void* SOAP_FMAC2 soap_id_lookup(struct soap *soap, const char *id, void **p, int t, size_t n, unsigned int k, int (*fbase)(int, int)) { struct soap_ilist *ip; if (!p || !id || !*id) return p; ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */ if (!ip) { ip = soap_enter(soap, id, t, n); /* new hash table entry for string id */ if (!ip) return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding first href='%s' type=%d location=%p (%u bytes) level=%u\n", id, t, (void*)p, (unsigned int)n, k)); *p = NULL; if (k) { int i; if (k > SOAP_MAXPTRS) return NULL; ip->spine = (void**)soap_malloc(soap, SOAP_MAXPTRS * sizeof(void*)); if (!ip->spine) return NULL; ip->spine[0] = NULL; for (i = 1; i < SOAP_MAXPTRS; i++) ip->spine[i] = &ip->spine[i - 1]; *p = &ip->spine[k - 1]; } else { ip->link = p; ip->shaky = soap_is_shaky(soap, (void*)p); } } else if (ip->type != t && (!fbase || !fbase(ip->type, t)) && (!fbase || !fbase(t, ip->type) || soap_type_punned(soap, ip))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup type incompatibility: ref='%s' id-type=%d ref-type=%d\n", id, ip->type, t)); (void)soap_id_nullify(soap, id); return NULL; } else if (k == 0 && ip->ptr && !ip->shaky) /* when block lists are in use, ip->ptr will change */ { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolved href='%s' type=%d location=%p (%u bytes) level=%u\n", id, t, ip->ptr, (unsigned int)n, k)); *p = ip->ptr; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarded href='%s' type=%d location=%p (%u bytes) level=%u\n", id, t, (void*)p, (unsigned int)n, k)); if (fbase && fbase(t, ip->type) && !soap_type_punned(soap, ip)) { ip->type = t; ip->size = n; } *p = NULL; if (k) { if (!ip->spine) { int i; if (k > SOAP_MAXPTRS) return NULL; ip->spine = (void**)soap_malloc(soap, SOAP_MAXPTRS * sizeof(void*)); if (!ip->spine) return NULL; ip->spine[0] = NULL; for (i = 1; i < SOAP_MAXPTRS; i++) ip->spine[i] = &ip->spine[i - 1]; } *p = &ip->spine[k - 1]; if (ip->ptr && !ip->shaky) ip->spine[0] = ip->ptr; } else { void *q = ip->link; ip->link = p; ip->shaky = soap_is_shaky(soap, (void*)p); *p = q; } } return p; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 void* SOAP_FMAC2 soap_id_forward(struct soap *soap, const char *href, void *p, size_t i, int t, int tt, size_t n, unsigned int k, void (*finsert)(struct soap*, int, int, void*, size_t, const void*, void**), int (*fbase)(int, int)) { 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) { ip = soap_enter(soap, href, t, n); /* new hash table entry for string id */ if (!ip) return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New entry href='%s' type=%d size=%lu level=%d location=%p\n", href, t, (unsigned long)n, k, p)); } else if ((ip->type != t || ip->size != n) && k == 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forward 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, t, (unsigned long)n)); (void)soap_id_nullify(soap, href); return NULL; } if (finsert || n < sizeof(void*)) { struct soap_flist *fp = (struct soap_flist*)SOAP_MALLOC(soap, sizeof(struct soap_flist)); if (!fp) { soap->error = SOAP_EOM; return NULL; } if (fbase && fbase(t, ip->type) && !soap_type_punned(soap, ip)) { ip->type = t; ip->size = n; } if ((ip->type != t || ip->size != n) && (!fbase || !fbase(ip->type, t))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forward 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, t, (unsigned long)n)); SOAP_FREE(soap, fp); (void)soap_id_nullify(soap, href); return NULL; } fp->next = ip->flist; fp->type = tt; fp->ptr = p; fp->level = k; fp->index = i; fp->finsert = finsert; ip->flist = fp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding type=%d (target type=%d) size=%lu location=%p level=%u index=%lu href='%s'\n", t, tt, (unsigned long)n, p, k, (unsigned long)i, href)); } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding copying address %p for type=%d href='%s'\n", p, t, href)); *(void**)p = ip->copy; ip->copy = p; } ip->shaky = soap_is_shaky(soap, p); return p; } #endif /******************************************************************************/ SOAP_FMAC1 void* SOAP_FMAC2 soap_id_enter(struct soap *soap, const char *id, void *p, int t, size_t n, const char *type, const char *arrayType, void *(*finstantiate)(struct soap*, int, const char*, const char*, size_t*), int (*fbase)(int, int)) { #ifndef WITH_NOIDREF struct soap_ilist *ip; #endif (void)id; (void)fbase; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enter id='%s' type=%d location=%p size=%lu\n", id, t, p, (unsigned long)n)); soap->alloced = 0; if (!p) { if (finstantiate) { p = finstantiate(soap, t, type, arrayType, &n); /* soap->alloced is set in soap_link() */ t = soap->alloced; } else { p = soap_malloc(soap, n); soap->alloced = t; } } #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 type=%d\n", id, p, t)); if (!ip) { ip = soap_enter(soap, id, t, n); /* new hash table entry for string id */ if (!ip) return NULL; ip->ptr = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New entry id='%s' type=%d size=%lu location=%p\n", id, t, (unsigned long)n, p)); if (!soap->alloced) ip->shaky = soap_is_shaky(soap, p); } else if (ip->ptr) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Multiply defined id='%s'\n", id)); soap_strcpy(soap->id, sizeof(soap->id), id); soap->error = SOAP_DUPLICATE_ID; return NULL; } else if ((ip->type != t && (!fbase || !fbase(t, ip->type) || soap_type_punned(soap, ip))) || (ip->type == t && ip->size != n && soap_type_punned(soap, ip))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enter type incompatibility id='%s' expect type=%d size=%lu got type=%d size=%lu\n", id, ip->type, (unsigned long)ip->size, t, (unsigned long)n)); (void)soap_id_nullify(soap, id); return NULL; } else { ip->type = t; ip->size = n; ip->ptr = p; if (!soap->alloced) ip->shaky = soap_is_shaky(soap, p); if (soap->alloced || !ip->shaky) { void **q; /* ptr will not change later, so resolve links now */ if (ip->spine) ip->spine[0] = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Traversing link chain to resolve id='%s' type=%d\n", ip->id, ip->type)); q = (void**)ip->link; while (q) { void *r = *q; *q = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... link %p -> %p\n", (void*)q, p)); q = (void**)r; } ip->link = NULL; } } return ip->ptr; #endif } /******************************************************************************/ SOAP_FMAC1 void** SOAP_FMAC2 soap_id_smart(struct soap *soap, const char *id, int t, size_t n) { (void)soap; (void)id; (void)t; (void)n; #ifndef WITH_NOIDREF if (id && *id) { struct soap_ilist *ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */ if (!ip) { ip = soap_enter(soap, id, t, n); /* new hash table entry for string id */ if (!ip) return NULL; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New smart shared pointer entry id='%s' type=%d size=%lu smart=%p\n", id, t, (unsigned long)n, ip->smart)); return &ip->smart; } #endif return NULL; } /******************************************************************************/ #ifndef WITH_NOIDREF static int soap_type_punned(struct soap *soap, const struct soap_ilist *ip) { const struct soap_flist *fp; (void)soap; if (ip->ptr || ip->copy) return 1; for (fp = ip->flist; fp; fp = fp->next) if (fp->level == 0) return 1; return 0; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_id_nullify(struct soap *soap, const char *id) { int i; for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { void *p, *q; for (p = ip->link; p; p = q) { q = *(void**)p; *(void**)p = NULL; } ip->link = NULL; } } soap_strcpy(soap->id, sizeof(soap->id), id); return soap->error = SOAP_HREF; } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_end_send(struct soap *soap) { #ifndef WITH_LEANER int err; err = soap_end_attachments(soap); 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 (!err) err = soap_putdime(soap); if (!err) err = soap_putmime(soap); soap->mime.list = NULL; soap->mime.first = NULL; soap->mime.last = NULL; soap->dime.list = NULL; soap->dime.first = NULL; soap->dime.last = NULL; if (err) return err; #endif return soap_end_send_flush(soap); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_end_send_flush(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End send mode=0x%x\n", soap->mode)); 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) && soap->d_stream) { 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 != sizeof(soap->buf)) { if (soap_flush_raw(soap, soap->z_buf, sizeof(soap->buf) - 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 = sizeof(soap->buf); } } 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) { #if !defined(__cplusplus) || defined(WITH_COMPAT) if (soap->os) { char *b = (char*)soap_push_block(soap, NULL, 1); if (b) { *b = '\0'; *soap->os = soap_save_block(soap, NULL, NULL, 0); } } else #endif { char *p; #ifndef WITH_NOHTTP if (!(soap->mode & SOAP_ENC_PLAIN)) { 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)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Send %u bytes to socket=%d/fd=%d\n", (unsigned int)soap_block_size(soap, NULL), (int)soap->socket, soap->sendfd)); soap->error = soap->fsend(soap, p, soap_block_size(soap, NULL)); if (soap->error) { soap_end_block(soap, NULL); return soap->error; } } soap_end_block(soap, NULL); } #ifndef WITH_LEANER if (soap->fpreparefinalsend && (soap->error = soap->fpreparefinalsend(soap)) != SOAP_OK) return soap->error; #endif if ((soap->omode & SOAP_IO) == SOAP_IO_STORE && (soap->imode & SOAP_IO) != SOAP_IO_STORE) soap->omode = (soap->omode & ~SOAP_IO) | (soap->imode & SOAP_IO); } #ifndef WITH_LEANER else if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { DBGMSG(SENT, "\r\n0\r\n\r\n", 7); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Send 7 bytes to socket=%d/fd=%d\n", (int)soap->socket, soap->sendfd)); soap->error = soap->fsend(soap, "\r\n0\r\n\r\n", 7); if (soap->error) return soap->error; } #endif } #ifdef WITH_TCPFIN #if defined(WITH_OPENSSL) || defined(WITH_SYSTEMSSL) if (!soap->ssl) #endif if (soap_valid_socket(soap->socket) && !soap->keep_alive && !(soap->omode & SOAP_IO_UDP)) soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_WR); /* Send TCP FIN */ #endif #if defined(__cplusplus) && !defined(WITH_COMPAT) if (soap->os) soap->os->flush(); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of send phase\n")); soap->omode &= ~SOAP_SEC_WSUID; soap->count = 0; soap->part = SOAP_END; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_end_recv(struct soap *soap) { soap->part = SOAP_END; #ifndef WITH_LEAN soap->wsuid = NULL; /* reset before next send */ soap->c14nexclude = NULL; /* reset before next send */ soap->c14ninclude = NULL; /* reset before next send */ #endif #ifndef WITH_LEANER soap->ffilterrecv = NULL; 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 so call soap_resolve() and return */ if ((soap->mode & SOAP_ENC_MIME)) { if ((soap->mode & SOAP_MIME_POSTCHECK)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Post checking MIME attachments\n")); if (!soap->keep_alive) soap->keep_alive = -2; /* special case to keep alive */ #ifndef WITH_NOIDREF soap_resolve(soap); #endif return SOAP_OK; } 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) && soap->d_stream) { /* 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; (void)soap_memcpy((void*)soap->buf, sizeof(soap->buf), (const void*)soap->z_buf, sizeof(soap->buf)); 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) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Gzip error: unable to read crc value\n")); return soap->error = SOAP_ZLIB_ERROR; } 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 inflate 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 inflate 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->ahead != EOF && !soap_recv_raw(soap)) continue; #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); #ifndef WITH_LEANER if (soap->fpreparefinalrecv) return soap->error = soap->fpreparefinalrecv(soap); #endif return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_free_temp(struct soap *soap) { struct soap_attribute *tp, *tq; 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) { SOAP_FREE(soap, ns->out); ns->out = NULL; } } 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_iht(soap); #endif soap_free_pht(soap); } /******************************************************************************/ static void soap_free_ns(struct soap *soap) { 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; } /******************************************************************************/ #ifdef 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 /******************************************************************************/ #ifdef 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]; if (s) SOAP_FREE_UNMANAGED(s); if (logfile) { size_t l = strlen(logfile) + 1; t = (char*)SOAP_MALLOC_UNMANAGED(l); if (t) (void)soap_memcpy((void*)t, l, (const void*)logfile, l); } soap->logfile[i] = t; } #endif /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_recv_logfile(struct soap *soap, const char *logfile) { (void)soap; (void)logfile; #ifdef SOAP_DEBUG soap_set_logfile(soap, SOAP_INDEX_RECV, logfile); #endif } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_sent_logfile(struct soap *soap, const char *logfile) { (void)soap; (void)logfile; #ifdef SOAP_DEBUG soap_set_logfile(soap, SOAP_INDEX_SENT, logfile); #endif } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_test_logfile(struct soap *soap, const char *logfile) { (void)soap; (void)logfile; #ifdef SOAP_DEBUG soap_set_logfile(soap, SOAP_INDEX_TEST, logfile); #endif } /******************************************************************************/ SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_copy(const struct soap *soap) { struct soap *copy = soap_versioning(soap_new)(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); soap_done(copy); if (soap_copy_context(copy, soap) != NULL) return copy; soap_free(copy); return NULL; } /******************************************************************************/ SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_copy_context(struct soap *copy, const struct soap *soap) { if (copy == soap) return copy; if (soap_check_state(soap)) return NULL; if (copy) { struct soap_plugin *p = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying context\n")); (void)soap_memcpy((void*)copy, sizeof(struct soap), (const void*)soap, sizeof(struct soap)); copy->state = SOAP_COPY; copy->error = SOAP_OK; copy->bearer = NULL; copy->userid = NULL; copy->passwd = NULL; #ifdef WITH_NTLM copy->ntlm_challenge = NULL; #endif 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 #ifdef SOAP_DEBUG soap_init_logs(copy); 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 copy->namespaces = soap->local_namespaces; copy->local_namespaces = NULL; soap_set_local_namespaces(copy); /* copy content of soap->local_namespaces */ copy->namespaces = soap->namespaces; /* point to shared read-only namespaces table */ copy->c_locale = NULL; #ifdef WITH_OPENSSL copy->bio = NULL; copy->ssl = NULL; copy->session = NULL; copy->session_host[0] = '\0'; copy->session_port = 443; #endif #ifdef WITH_GNUTLS copy->session = NULL; #endif #ifdef WITH_ZLIB copy->d_stream = NULL; copy->z_buf = NULL; #endif #ifndef WITH_NOIDREF soap_init_iht(copy); #endif soap_init_pht(copy); 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) { struct soap_plugin *q = (struct soap_plugin*)SOAP_MALLOC(copy, sizeof(struct soap_plugin)); if (!q) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not allocate plugin '%s'\n", p->id)); soap_end(copy); soap_done(copy); return NULL; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying plugin '%s'\n", p->id)); *q = *p; if (p->fcopy && (copy->error = p->fcopy(copy, q, p)) != SOAP_OK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not copy plugin '%s' error = %d\n", p->id, copy->error)); SOAP_FREE(copy, q); soap_end(copy); soap_done(copy); return NULL; } q->next = copy->plugins; copy->plugins = q; } } #ifdef WITH_SELF_PIPE pipe(copy->pipe_fd); SOAP_SOCKNONBLOCK(copy->pipe_fd[0]) SOAP_SOCKNONBLOCK(copy->pipe_fd[1]) #endif return copy; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_copy_stream(struct soap *copy, struct soap *soap) { struct soap_attribute *tp = NULL, *tq; if (copy == soap) return; copy->header = soap->header; copy->mode = soap->mode; copy->imode = soap->imode; copy->omode = soap->omode; copy->socket = soap->socket; copy->sendsk = soap->sendsk; copy->recvsk = soap->recvsk; copy->transfer_timeout = soap->transfer_timeout; copy->recv_maxlength = soap->recv_maxlength; copy->recv_timeout = soap->recv_timeout; copy->send_timeout = soap->send_timeout; copy->connect_timeout = soap->connect_timeout; copy->accept_timeout = soap->accept_timeout; copy->socket_flags = soap->socket_flags; copy->connect_flags = soap->connect_flags; copy->connect_retry = soap->connect_retry; copy->bind_flags = soap->bind_flags; copy->bind_inet6 = soap->bind_inet6; copy->bind_v6only = soap->bind_v6only; copy->accept_flags = soap->accept_flags; copy->sndbuf = soap->sndbuf; copy->rcvbuf = soap->rcvbuf; copy->linger_time = soap->linger_time; copy->maxlevel = soap->maxlevel; copy->maxlength = soap->maxlength; copy->maxoccurs = soap->maxoccurs; copy->os = soap->os; copy->is = soap->is; 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; copy->ip = soap->ip; copy->ip6[0] = soap->ip6[0]; copy->ip6[1] = soap->ip6[1]; copy->ip6[2] = soap->ip6[2]; copy->ip6[3] = soap->ip6[3]; copy->port = soap->port; (void)soap_memcpy((void*)copy->host, sizeof(copy->host), (const void*)soap->host, sizeof(soap->host)); (void)soap_memcpy((void*)copy->endpoint, sizeof(copy->endpoint), (const void*)soap->endpoint, sizeof(soap->endpoint)); #endif #ifdef WITH_OPENSSL copy->bio = soap->bio; copy->ctx = soap->ctx; copy->ssl = soap->ssl; #endif #ifdef WITH_GNUTLS copy->session = soap->session; #endif #ifdef WITH_SYSTEMSSL copy->ctx = soap->ctx; copy->ssl = soap->ssl; #endif #ifdef WITH_ZLIB copy->zlib_state = soap->zlib_state; copy->zlib_in = soap->zlib_in; copy->zlib_out = soap->zlib_out; if (soap->d_stream && soap->zlib_state != SOAP_ZLIB_NONE) { if (!copy->d_stream) copy->d_stream = (z_stream*)SOAP_MALLOC(copy, sizeof(z_stream)); if (copy->d_stream) (void)soap_memcpy((void*)copy->d_stream, sizeof(z_stream), (const void*)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, sizeof(soap->buf)); if (copy->z_buf) (void)soap_memcpy((void*)copy->z_buf, sizeof(soap->buf), (const void*)soap->z_buf, sizeof(soap->buf)); } copy->z_dict = soap->z_dict; copy->z_dict_len = soap->z_dict_len; #endif (void)soap_memcpy((void*)copy->buf, sizeof(copy->buf), (const void*)soap->buf, sizeof(soap->buf)); /* copy XML parser state */ soap_free_ns(copy); soap_set_local_namespaces(copy); copy->version = soap->version; if (soap->nlist && soap->local_namespaces) { struct soap_nlist *np = NULL, *nq; /* copy reversed nlist */ for (nq = soap->nlist; nq; nq = nq->next) { struct soap_nlist *nr = np; size_t n = sizeof(struct soap_nlist) + strlen(nq->id); np = (struct soap_nlist*)SOAP_MALLOC(copy, n); if (!np) { np = nr; break; } (void)soap_memcpy((void*)np, n, (const void*)nq, n); np->next = nr; } while (np) { const char *s = np->ns; copy->level = np->level; /* preserve element nesting level */ if (!s && np->index >= 0) { s = soap->local_namespaces[np->index].out; if (!s) s = soap->local_namespaces[np->index].ns; } if (s) (void)soap_push_namespace(copy, np->id, s); nq = np; np = np->next; SOAP_FREE(copy, nq); } } (void)soap_memcpy((void*)copy->tag, sizeof(copy->tag), (const void*)soap->tag, sizeof(soap->tag)); (void)soap_memcpy((void*)copy->id, sizeof(copy->id), (const void*)soap->id, sizeof(soap->id)); (void)soap_memcpy((void*)copy->href, sizeof(copy->href), (const void*)soap->href, sizeof(soap->href)); (void)soap_memcpy((void*)copy->type, sizeof(copy->type), (const void*)soap->type, sizeof(soap->type)); copy->other = soap->other; copy->root = soap->root; copy->null = soap->null; copy->body = soap->body; copy->part = soap->part; copy->mustUnderstand = soap->mustUnderstand; copy->level = soap->level; copy->peeked = soap->peeked; /* copy attributes */ for (tq = soap->attributes; tq; tq = tq->next) { struct soap_attribute *tr = tp; size_t n = sizeof(struct soap_attribute) + strlen(tq->name); tp = (struct soap_attribute*)SOAP_MALLOC(copy, n); (void)soap_memcpy((void*)tp, n, (const void*)tq, n); if (tp->size) { tp->value = (char*)SOAP_MALLOC(copy, tp->size); if (tp->value) (void)soap_memcpy((void*)tp->value, tp->size, (const void*)tq->value, tp->size); } tp->ns = NULL; tp->next = tr; } copy->attributes = tp; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_free_stream(struct soap *soap) { soap->socket = SOAP_INVALID_SOCKET; soap->sendsk = SOAP_INVALID_SOCKET; soap->recvsk = SOAP_INVALID_SOCKET; #ifdef WITH_OPENSSL soap->bio = NULL; soap->ctx = NULL; soap->ssl = NULL; #endif #ifdef WITH_GNUTLS soap->xcred = NULL; soap->acred = NULL; soap->cache = NULL; soap->session = NULL; soap->dh_params = NULL; soap->rsa_params = NULL; #endif #ifdef WITH_SYSTEMSSL soap->ctx = (gsk_handle)NULL; soap->ssl = (gsk_handle)NULL; #endif #ifdef WITH_ZLIB if (soap->z_buf) SOAP_FREE(soap, soap->z_buf); soap->z_buf = NULL; #endif } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_initialize(struct soap *soap) { soap_versioning(soap_init)(soap, SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_versioning(soap_init)(struct soap *soap, soap_mode imode, soap_mode omode) { size_t i; soap->state = SOAP_INIT; #ifdef SOAP_MEM_DEBUG soap_init_mht(soap); #endif #ifdef SOAP_DEBUG soap_init_logs(soap); #endif #ifdef TANDEM_NONSTOP soap_set_test_logfile(soap, "TESTLOG"); soap_set_sent_logfile(soap, "SENTLOG"); soap_set_recv_logfile(soap, "RECVLOG"); #else soap_set_test_logfile(soap, "TEST.log"); soap_set_sent_logfile(soap, "SENT.log"); soap_set_recv_logfile(soap, "RECV.log"); #endif #ifdef WITH_SELF_PIPE pipe(soap->pipe_fd); SOAP_SOCKNONBLOCK(soap->pipe_fd[0]) SOAP_SOCKNONBLOCK(soap->pipe_fd[1]) #endif soap->version = 0; soap->imode = imode; soap->omode = omode; soap->mode = imode; soap->plugins = NULL; soap->user = NULL; for (i = 0; i < sizeof(soap->data)/sizeof(*soap->data); i++) soap->data[i] = NULL; soap->bearer = NULL; soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif #ifndef WITH_NOHTTP soap->fpost = http_post; soap->fget = http_get; soap->fput = http_put; soap->fpatch = http_patch; soap->fdel = http_del; soap->fopt = http_200; soap->fhead = http_200; 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; /* in_addr_t value */ soap->ipv4_multicast_if = NULL; /* points to struct in_addr or in_addr_t */ soap->ipv4_multicast_ttl = 0; /* 0: use default */ soap->client_addr = NULL; /* client address (IPv4 or IPv6 or host name) to bind before connect, NULL for none */ soap->client_addr_ipv6 = NULL; /* client address IPv6 or host name to bind before connect, NULL for none */ soap->client_port = -1; /* client port to bind before connect, -1 for none */ soap->client_interface = NULL; /* client interface address, NULL for none */ #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; #ifndef WITH_LEANER soap->fsvalidate = NULL; soap->fwvalidate = NULL; soap->feltbegin = NULL; soap->feltendin = NULL; soap->feltbegout = NULL; soap->feltendout = NULL; soap->fprepareinitsend = NULL; soap->fprepareinitrecv = NULL; soap->fpreparesend = NULL; soap->fpreparerecv = NULL; soap->fpreparefinalsend = NULL; soap->fpreparefinalrecv = NULL; soap->ffiltersend = NULL; soap->ffilterrecv = 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->long_double_format = NULL; /* Defined in custom serializer custom/long_double.c */ soap->dime_id_format = "cid:id%d"; /* default DIME id format for int id index */ soap->recv_maxlength = 0x7FFFFFFF; /* default max length of messages received (2GB) */ soap->recv_timeout = 0; soap->send_timeout = 0; soap->transfer_timeout = 0; soap->connect_timeout = 0; soap->accept_timeout = 0; soap->socket_flags = 0; soap->connect_flags = 0; soap->connect_retry = 0; soap->bind_flags = 0; #ifdef WITH_IPV6_V6ONLY soap->bind_inet6 = 1; soap->bind_v6only = 1; #else soap->bind_inet6 = 0; soap->bind_v6only = 0; #endif soap->accept_flags = 0; #ifdef WIN32 soap->sndbuf = SOAP_BUFLEN + 1; /* this size speeds up windows xfer */ soap->rcvbuf = SOAP_BUFLEN + 1; #else soap->sndbuf = SOAP_BUFLEN; soap->rcvbuf = SOAP_BUFLEN; #endif soap->linger_time = 0; soap->maxlevel = SOAP_MAXLEVEL; soap->maxlength = SOAP_MAXLENGTH; soap->maxoccurs = SOAP_MAXOCCURS; soap->http_version = "1.1"; soap->proxy_http_version = "1.0"; soap->http_content = NULL; soap->http_extra_header = 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->ip = 0; soap->ip6[0] = 0; soap->ip6[1] = 0; soap->ip6[2] = 0; soap->ip6[3] = 0; soap->labbuf = NULL; soap->lablen = 0; soap->labidx = 0; soap->encodingStyle = NULL; #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->shaky = 0; soap->attributes = NULL; soap->header = NULL; soap->fault = NULL; soap->master = SOAP_INVALID_SOCKET; soap->socket = SOAP_INVALID_SOCKET; soap->sendsk = SOAP_INVALID_SOCKET; soap->recvsk = 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->tag[0] = '\0'; 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->endpoint[0] = '\0'; soap->host[0] = '\0'; soap->path[0] = '\0'; soap->port = 0; soap->override_host = NULL; soap->override_port = 0; soap->action = NULL; soap->proxy_host = NULL; soap->proxy_port = 8080; soap->proxy_userid = NULL; soap->proxy_passwd = NULL; soap->proxy_from = NULL; soap->origin = NULL; soap->cors_origin = NULL; soap->cors_allow = "*"; soap->cors_method = NULL; soap->cors_header = NULL; soap->cors_methods = NULL; soap->cors_headers = NULL; soap->x_frame_options = "SAMEORIGIN"; soap->prolog = "\n"; soap->zlib_state = SOAP_ZLIB_NONE; soap->zlib_in = SOAP_ZLIB_NONE; soap->zlib_out = SOAP_ZLIB_NONE; soap->d_stream = NULL; soap->z_buf = NULL; soap->z_level = 6; soap->z_dict = NULL; soap->z_dict_len = 0; #ifndef WITH_LEAN soap->wsuid = NULL; soap->c14nexclude = NULL; soap->c14ninclude = 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 #ifndef WITH_NOIDREF soap_init_iht(soap); #endif soap_init_pht(soap); #ifdef WITH_OPENSSL if (!soap_ssl_init_done) soap_ssl_init(); soap->fsslauth = ssl_auth_init; soap->fsslverify = NULL; soap->bio = NULL; soap->ssl = NULL; soap->ctx = NULL; soap->session = NULL; soap->session_host[0] = '\0'; soap->session_port = 443; soap->ssl_flags = SOAP_SSL_DEFAULT; soap->keyfile = NULL; soap->keyid = NULL; soap->password = NULL; soap->cafile = NULL; soap->capath = NULL; soap->crlfile = NULL; soap->dhfile = NULL; soap->randfile = NULL; #endif #ifdef WITH_GNUTLS if (!soap_ssl_init_done) soap_ssl_init(); soap->fsslauth = ssl_auth_init; soap->fsslverify = NULL; soap->xcred = NULL; soap->acred = NULL; soap->cache = NULL; soap->session = NULL; soap->ssl_flags = SOAP_SSL_DEFAULT; soap->keyfile = NULL; soap->keyid = NULL; soap->password = NULL; soap->cafile = NULL; soap->capath = NULL; soap->crlfile = NULL; soap->dh_params = NULL; soap->rsa_params = NULL; #endif #ifdef WITH_SYSTEMSSL soap->fsslauth = ssl_auth_init; soap->fsslverify = NULL; soap->bio = NULL; soap->ssl = (gsk_handle)NULL; soap->ctx = (gsk_handle)NULL; soap->session = NULL; soap->ssl_flags = SOAP_SSL_DEFAULT; soap->keyfile = NULL; soap->keyid = NULL; soap->password = NULL; soap->cafile = NULL; soap->capath = NULL; soap->crlfile = NULL; soap->dhfile = NULL; soap->randfile = NULL; #endif soap->c_locale = NULL; soap->buflen = 0; soap->bufidx = 0; #ifndef WITH_LEANER soap->dime.chunksize = 0; soap->dime.buflen = 0; #endif soap->other = 0; soap->root = -1; soap->null = 0; soap->position = 0; soap->encoding = 0; soap->mustUnderstand = 0; soap->ns = 0; soap->part = SOAP_END; soap->event = 0; soap->evlev = 0; soap->alloced = 0; soap->count = 0; soap->length = 0; soap->cdata = 0; soap->peeked = 0; soap->ahead = 0; soap->idnum = 0; soap->level = 0; soap->status = 0; soap->error = SOAP_OK; soap->errmode = 0; soap->errnum = 0; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_begin(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Clean up for input/output\n")); soap->error = SOAP_OK; if (!soap->keep_alive) { soap->buflen = 0; soap->bufidx = 0; } soap->encoding = 0; soap->mode = 0; soap->part = SOAP_END; soap->peeked = 0; soap->ahead = 0; soap->level = 0; *soap->endpoint = '\0'; soap->encodingStyle = SOAP_STR_EOS; soap_free_temp(soap); } /******************************************************************************/ 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) { 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 } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_version(struct soap *soap, short version) { soap_set_local_namespaces(soap); if (soap->version != version && soap->local_namespaces && soap->local_namespaces[0].id && soap->local_namespaces[1].id) { if (version == 1) { soap->local_namespaces[0].ns = soap_env1; soap->local_namespaces[1].ns = soap_enc1; } else if (version == 2) { soap->local_namespaces[0].ns = soap_env2; soap->local_namespaces[1].ns = soap_enc2; } soap->version = version; } if (version == 0) soap->encodingStyle = SOAP_STR_EOS; else soap->encodingStyle = NULL; } /******************************************************************************/ static void soap_version(struct soap *soap) { struct Namespace *p = soap->local_namespaces; if (p) { const char *ns = p[0].out; if (!ns) ns = p[0].ns; if (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); p[1].out = (char*)SOAP_MALLOC(soap, sizeof(soap_enc1)); if (p[1].out) (void)soap_memcpy(p[1].out, sizeof(soap_enc1), soap_enc1, sizeof(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); p[1].out = (char*)SOAP_MALLOC(soap, sizeof(soap_enc2)); if (p[1].out) (void)soap_memcpy(p[1].out, sizeof(soap_enc2), soap_enc2, sizeof(soap_enc2)); } } } } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_set_namespaces(struct soap *soap, const struct Namespace *p) { struct Namespace *ns = soap->local_namespaces; struct soap_nlist *np, *nq, *nr; 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) { 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) (void)soap_push_namespace(soap, np->id, s); nq = np; np = np->next; SOAP_FREE(soap, nq); } if (ns) { 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; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_local_namespaces(struct soap *soap) { if (soap->namespaces && !soap->local_namespaces) { const struct Namespace *ns1; struct Namespace *ns2; 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) { (void)soap_memcpy((void*)ns2, n, (const void*)soap->namespaces, n); if (ns2[0].ns) { if (!strcmp(ns2[0].ns, soap_env1)) soap->version = 1; else if (!strcmp(ns2[0].ns, soap_env2)) soap->version = 2; } soap->local_namespaces = ns2; for (; ns2->id; ns2++) ns2->out = NULL; } } } /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char * SOAP_FMAC2 soap_tagsearch(const char *big, const char *little) { if (big && little) { size_t n = strlen(little); const char *s = big; while (s) { const char *t = s; size_t i; for (i = 0; i < n; i++, t++) { if (*t != little[i]) break; } if (*t == '\0' || *t == ' ') { if (i == n || (i > 0 && little[i-1] == ':')) return s; } s = strchr(t, ' '); if (s) s++; } } return NULL; } #endif /******************************************************************************/ SOAP_FMAC1 struct soap_nlist * SOAP_FMAC2 soap_lookup_ns(struct soap *soap, const char *tag, size_t n) { 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; } /******************************************************************************/ #ifndef WITH_LEAN static struct soap_nlist * soap_push_ns(struct soap *soap, const char *id, const char *ns, short utilized, short isearly) { struct soap_nlist *np = NULL; size_t n, k; unsigned int level = soap->level + isearly; if (soap_tagsearch(soap->c14nexclude, id)) return NULL; if (!utilized) { for (np = soap->nlist; np; np = np->next) { if (!strcmp(np->id, id) && ((!np->ns && *id) || (np->ns && !strcmp(np->ns, ns)))) break; } if (np) { if ((np->level < level || (!np->ns && *id)) && np->index == 1) utilized = 1; else return NULL; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Adding namespace binding (level=%u) '%s' '%s' utilized=%d\n", level, id, ns ? ns : "(null)", utilized)); n = strlen(id); if (ns) k = strlen(ns) + 1; else k = 0; if (sizeof(struct soap_nlist) + n + k > n && (SOAP_MAXALLOCSIZE <= 0 || sizeof(struct soap_nlist) + n + k <= SOAP_MAXALLOCSIZE)) np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k); if (!np) { soap->error = SOAP_EOM; return NULL; } np->next = soap->nlist; soap->nlist = np; soap_strcpy((char*)np->id, n + 1, id); if (ns) { np->ns = np->id + n + 1; soap_strcpy((char*)np->ns, k, ns); } else { np->ns = NULL; } np->level = level; np->index = utilized; return np; } #endif /******************************************************************************/ #ifndef WITH_LEAN static void soap_utilize_ns(struct soap *soap, const char *tag, short isearly) { struct soap_nlist *np; size_t n = 0; if (!strncmp(tag, "xmlns:", 6)) { tag += 6; n = strlen(tag); } else { const char *t = strchr(tag, ':'); if (t) n = t - tag; } np = soap_lookup_ns(soap, tag, n); if (np) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Utilizing namespace of '%s' at level %u utilized=%d at level=%u\n", tag, soap->level + isearly, np->index, np->level)); if (np->index <= 0) { if (np->level == soap->level + isearly) np->index = 1; else (void)soap_push_ns(soap, np->id, np->ns, 1, isearly); } } else if (strncmp(tag, "xml", 3)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Utilizing default namespace of '%s' at level %u\n", tag, soap->level + isearly)); (void)soap_strncpy(soap->tag, sizeof(soap->tag), tag, n); (void)soap_push_ns(soap, soap->tag, NULL, 1, isearly); } } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element(struct soap *soap, const char *tag, int id, const char *type) { #ifndef WITH_LEAN const char *s; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element begin tag='%s' level='%u' id='%d' type='%s'\n", tag, soap->level, id, type ? type : SOAP_STR_EOS)); #ifdef WITH_DOM #ifndef WITH_LEAN if (soap_tagsearch(soap->wsuid, tag)) { size_t i; for (s = tag, i = 0; *s && i < sizeof(soap->href) - 1; s++, i++) soap->href[i] = *s == ':' ? '-' : *s; soap->href[i] = '\0'; if (soap_set_attr(soap, "wsu:Id", soap->href, 1)) return soap->error; } #endif #endif soap->level++; if (soap->level > soap->maxlevel) return soap->error = SOAP_LEVEL; #ifdef WITH_DOM #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_DOM_ASIS)) { if (soap->evlev >= soap->level) soap->evlev = 0; if (soap->event == SOAP_SEC_BEGIN && !soap->evlev) { struct soap_nlist *np; /* non-nested wsu:Id found: clear xmlns, re-emit them for exc-c14n */ for (np = soap->nlist; np; np = np->next) { int p = soap->c14ninclude ? *soap->c14ninclude == '+' || soap_tagsearch(soap->c14ninclude, np->id) != NULL : 0; if (np->index == 2 || p) { struct soap_nlist *np1 = soap_push_ns(soap, np->id, np->ns, 1, 0); if (np1 && !p) np1->index = 0; } } soap->evlev = soap->level; } } #endif if ((soap->mode & SOAP_XML_DOM)) { struct soap_dom_element *elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element)); if (!elt) return soap->error = SOAP_EOM; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Adding DOM element tag='%s' %p (parent='%s' %p)\n", tag, elt, soap->dom ? soap->dom->name : "(null)", soap->dom)); elt->soap = soap; elt->next = NULL; elt->prnt = soap->dom; elt->elts = NULL; elt->atts = NULL; elt->nstr = NULL; elt->name = soap_strdup(soap, tag); elt->lead = NULL; elt->text = NULL; elt->code = NULL; elt->tail = NULL; elt->node = NULL; elt->type = 0; 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; if (!elt->name) return soap->error = SOAP_EOM; } else { #endif #ifndef WITH_LEAN if (!soap->ns) { if (!(soap->mode & SOAP_XML_CANONICAL) && soap_send(soap, soap->prolog)) 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; } if ((soap->mode & SOAP_XML_DEFAULTNS)) { size_t n = 0; s = strchr(tag, ':'); if (s) n = s++ - tag; else s = tag; if (soap_send_raw(soap, "<", 1) || soap_send(soap, s)) return soap->error; if (n) { struct Namespace *ns = soap->local_namespaces; for (; ns && ns->id; ns++) { if (*ns->id && ns->ns && !strncmp(ns->id, tag, n) && !ns->id[n]) { if (!soap->nlist || *soap->nlist->id || (soap->nlist->ns && strcmp(soap->nlist->ns, ns->ns))) { (void)soap_push_ns(soap, SOAP_STR_EOS, ns->out ? ns->out : ns->ns, 0, 0); if (soap_attribute(soap, "xmlns", ns->out ? ns->out : ns->ns)) return soap->error; } break; } } } #ifndef WITH_NOEMPTYNAMESPACES else if (!soap->nlist || *soap->nlist->id || (soap->nlist->ns && *soap->nlist->ns)) { (void)soap_push_ns(soap, SOAP_STR_EOS, SOAP_STR_EOS, 0, 0); if (soap_attribute(soap, "xmlns", SOAP_STR_EOS)) return soap->error; } #endif } 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 = soap->local_namespaces; int k = -1; if (ns) { while (k-- && ns->id) { const char *t = ns->out; if (!t) t = ns->ns; if (*ns->id && t && *t) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(ns->id) + 6), "xmlns:%s", ns->id); if (soap_attribute(soap, soap->tmpbuf, t)) return soap->error; } ns++; } } } 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)) { if ((soap->mode & SOAP_XML_DEFAULTNS)) soap_utilize_ns(soap, SOAP_STR_EOS, 0); else soap_utilize_ns(soap, tag, 0); } #endif if (id > 0) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), sizeof(SOAP_BASEREFNAME) + 20), SOAP_BASEREFNAME "%d", id); if (soap->version == 2) { if (soap_attribute(soap, "SOAP-ENC:id", soap->tmpbuf)) return soap->error; } else if (soap_attribute(soap, "id", soap->tmpbuf)) { return soap->error; } } if (type && *type && !(soap->mode & SOAP_XML_NOTYPE)) { #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_XML_CANONICAL_NA)) soap_utilize_ns(soap, type, 0); #endif if (soap_attribute(soap, "xsi:type", type)) return soap->error; } if (soap->null && soap->position > 0 && soap->version == 1) { int i; (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf) - 1, 20), "[%d", soap->positions[0]); for (i = 1; i < soap->position; i++) { size_t l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l - 1, 20), ",%d", soap->positions[i]); } soap_strcat(soap->tmpbuf, sizeof(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 && soap->local_namespaces[0].id && soap->local_namespaces[1].id) { 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->encodingStyle && soap_attribute(soap, "SOAP-ENV:encodingStyle", soap->encodingStyle)) return soap->error; } else { soap->encodingStyle = NULL; } soap->encoding = 0; } soap->null = 0; soap->position = 0; return SOAP_OK; } /******************************************************************************/ 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; #ifdef WITH_DOM if (soap->feltbegout) return soap->error = soap->feltbegout(soap, tag, id, type); #endif if (soap_element(soap, tag, id, type)) return soap->error; return soap_element_start_end_out(soap, NULL); } /******************************************************************************/ #if _MSC_VER < 1400 && !defined(HAVE_STRLCAT) /* concat string (truncating the result, strings must not be NULL) */ SOAP_FMAC1 void SOAP_FMAC2 soap_strcat(char *t, size_t n, const char *s) { size_t k = strlen(t); if (k < n) { t += k; n -= k; while (--n > 0 && *s) *t++ = *s++; *t = '\0'; } } #endif /******************************************************************************/ #if _MSC_VER < 1400 /* concat string up to m chars (leaves destination intact on overrun and returns nonzero, zero if OK) */ SOAP_FMAC1 int SOAP_FMAC2 soap_strncat(char *t, size_t n, const char *s, size_t m) { size_t k; if (!t || !s) return 1; k = strlen(t); if (n <= k + m) return 1; t += k; n -= k; while (--n > 0 && *s) *t++ = *s++; *t = '\0'; return 0; } #endif /******************************************************************************/ #ifndef HAVE_STRRCHR SOAP_FMAC1 char* SOAP_FMAC2 soap_strrchr(const char *s, int t) { char *r = NULL; while (*s) if (*s++ == t) r = (char*)s - 1; return r; } #endif /******************************************************************************/ #ifndef HAVE_STRTOL SOAP_FMAC1 long SOAP_FMAC2 soap_strtol(const char *s, char **t, int b) { long n = 0; 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')) { if (neg && n == 214748364 && c == '8') { if (t) *t = (char*)(s + 1); return -2147483648; } break; } n *= 10; n += c - '0'; s++; } if (neg) n = -n; } else /* assume 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 /******************************************************************************/ #ifndef HAVE_STRTOUL SOAP_FMAC1 unsigned long SOAP_FMAC2 soap_strtoul(const char *s, char **t, int b) { unsigned long n = 0; 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 >= 429496729 && (n > 429496729 || c >= '6')) break; n *= 10; n += c - '0'; s++; } if (neg && n > 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 /******************************************************************************/ #ifndef soap_strtoll SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_strtoll(const char *s, char **t, int b) { LONG64 n = 0LL; 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 >= 922337203685477580LL && (n > 922337203685477580LL || c >= '8')) { if (neg && n == 922337203685477580LL && c == '8') { if (t) *t = (char*)(s + 1); return -9223372036854775807LL - 1LL; /* appease compilers that complain */ } break; } n *= 10LL; n += c - '0'; s++; } if (neg) n = -n; } else /* assume 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 > 0x07FFFFFFFFFFFFFFLL) break; n <<= 4; n += c; s++; } } if (t) *t = (char*)s; return n; } #endif /******************************************************************************/ #ifndef soap_strtoull SOAP_FMAC1 ULONG64 SOAP_FMAC2 soap_strtoull(const char *s, char **t, int b) { ULONG64 n = 0UL; 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 >= 1844674407370955161ULL) break; n *= 10UL; n += c - '0'; s++; } if (neg && n > 0UL) 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 > 0x0FFFFFFFFFFFFFFFULL) break; n <<= 4; n += c; s++; } } if (t) *t = (char*)s; return n; } #endif /******************************************************************************/ 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 || soap->version == 0) return soap_element_begin_out(soap, tag, id, NULL); if (soap_element(soap, tag, id, NULL)) return soap->error; if (soap->version == 1) { if (offset && soap_attribute(soap, "SOAP-ENC:offset", offset)) return soap->error; if (soap_attribute(soap, "SOAP-ENC:arrayType", type)) return soap->error; } else { const char *s; s = strchr(type, '['); if (s && (size_t)(s - type) < sizeof(soap->tmpbuf)) { (void)soap_strncpy(soap->tmpbuf, sizeof(soap->tmpbuf), type, s - type); if (soap_attribute(soap, "SOAP-ENC:itemType", soap->tmpbuf)) return soap->error; s++; if (*s && *s != ']') { soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), s); soap->tmpbuf[strlen(soap->tmpbuf) - 1] = '\0'; if (soap_attribute(soap, "SOAP-ENC:arraySize", soap->tmpbuf)) return soap->error; } } } #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_XML_CANONICAL_NA)) soap_utilize_ns(soap, type, 0); #endif return soap_element_start_end_out(soap, NULL); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_start_end_out(struct soap *soap, const char *tag) { 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 && strchr(tp->name, ':')) soap_utilize_ns(soap, tp->name, 0); } if (soap->event == SOAP_SEC_BEGIN) { for (np = soap->nlist; np; np = np->next) if (soap_tagsearch(soap->c14ninclude, np->id)) (void)soap_push_ns(soap, np->id, np->ns, 1, 0); soap->event = 0; soap->evlev = 0; } for (np = soap->nlist; np; np = np->next) { if (np->ns && np->index == 1) { if (*np->id) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(np->id) + 6), "xmlns:%s", np->id); else soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "xmlns"); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enabling utilized binding (level=%u) %s='%s' SEC-BEGIN=%d c14ninclude='%s'\n", np->level, soap->tmpbuf, np->ns, soap->event == SOAP_SEC_BEGIN, soap->c14ninclude ? soap->c14ninclude : "(null)")); np->index = 2; soap->level--; if (*np->id || *np->ns || soap->level > 1) if (soap_set_attr(soap, soap->tmpbuf, np->ns, 1)) return soap->error; soap->level++; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Binding (level=%u) %s='%s' utilized=%d\n", np->level, np->id, np->ns, np->index)); } } } #endif #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { 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)->text = soap_strdup(soap, tp->value); (*att)->soap = soap; if (!(*att)->name || (tp->value && !(*att)->text)) return soap->error = SOAP_EOM; att = &(*att)->next; tp->visible = 0; } } return SOAP_OK; } #endif for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { if (soap_send_raw(soap, " ", 1) || 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, tp->flag) || soap_send_raw(soap, "\"", 1)) return soap->error; } else { if (soap_send_raw(soap, "=\"\"", 3)) 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 if (soap->nlist) soap_pop_namespace(soap); soap->level--; /* decrement level just before /> */ soap->body = 0; return soap_send_raw(soap, "/>", 2); } return soap_send_raw(soap, ">", 1); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_out(struct soap *soap, const char *tag) { if (*tag == '-') return SOAP_OK; #ifdef WITH_DOM if (soap->feltendout) return soap->error = soap->feltendout(soap, tag); #endif return soap_element_end(soap, tag); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_end(struct soap *soap, const char *tag) { #ifndef WITH_LEAN const char *s; #endif 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->nlist) soap_pop_namespace(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; } if ((soap->mode & SOAP_XML_DEFAULTNS) && (s = strchr(tag, ':')) != NULL) tag = s + 1; #endif if (soap_send_raw(soap, "error; soap->level--; /* decrement level just before > */ return soap_send_raw(soap, ">", 1); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_ref(struct soap *soap, const char *tag, int id, int href) { const char *s = "ref"; int n = 1; if (soap->version == 1) { s = "href"; n = 0; } else if (soap->version == 2) { s = "SOAP-ENC:ref"; } (SOAP_SNPRINTF(soap->href, sizeof(soap->href), sizeof(SOAP_BASEREFNAME) + 21), "#" SOAP_BASEREFNAME "%d", href); return soap_element_href(soap, tag, id, s, soap->href + n); } /******************************************************************************/ 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; soap->body = 0; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_null(struct soap *soap, const char *tag, int id, const char *type) { struct soap_attribute *tp = NULL; 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) || (!tp && soap_attribute(soap, "xsi:nil", "true")) || soap_element_start_end_out(soap, tag)) return soap->error; soap->body = 0; } else { soap->null = 1; soap->position = 0; soap->mustUnderstand = 0; } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_empty(struct soap *soap, const char *tag) { if (soap_element(soap, tag, -1, NULL)) return soap->error; return soap_element_start_end_out(soap, tag); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_nil(struct soap *soap, const char *tag) { if (soap_element(soap, tag, -1, NULL) || (soap_attribute(soap, "xsi:nil", "true"))) return soap->error; return soap_element_start_end_out(soap, tag); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_id(struct soap *soap, const char *tag, int id, const void *p, const void *a, int n, const char *type, int t, char **mark) { (void)a; (void)n; if (!p) { soap->error = soap_element_null(soap, tag, id, type); return -1; } #ifndef WITH_NOIDREF DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element_id %p type=%d id=%d\n", p, t, id)); if ((!soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH)) || (soap->mode & SOAP_XML_TREE)) return soap_check_and_mark(soap, p, t, mark); if (mark) *mark = NULL; if (id < -1) return soap_embed(soap, p, a, n, t); else 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 soap_check_and_mark(soap, p, t, mark); #endif } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_check_and_mark(struct soap *soap, const void *p, int t, char **mark) { if (mark) { struct soap_plist *pp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Check %p and mark %p\n", p, (void*)mark)); if (!soap_pointer_lookup(soap, p, t, &pp)) if (!soap_pointer_enter(soap, p, NULL, 0, t, &pp)) return -1; if ((soap->mode & SOAP_IO_LENGTH)) { if (pp->mark1 > 0) return -1; pp->mark1 = 1; *mark = &pp->mark1; } else { if (pp->mark2 > 0) return -1; pp->mark2 = 1; *mark = &pp->mark2; } } return 0; } /******************************************************************************/ SOAP_FMAC1 void * SOAP_FMAC2 soap_mark_lookup(struct soap *soap, const void *p, int t, struct soap_plist **ppp, char **mark) { if (!soap) return NULL; if (mark || !(soap->mode & SOAP_XML_TREE)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Mark lookup %p type=%d\n", p, t)); if (!soap_pointer_lookup(soap, p, t, ppp)) { if (!soap_pointer_enter(soap, p, NULL, 0, t, ppp)) return NULL; } else if (!(soap->mode & SOAP_XML_TREE)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Mark found %p\n", (*ppp)->dup)); return (*ppp)->dup; } if (mark) { if ((*ppp)->mark1 > 0) (*ppp)->mark1 = 2; /* cycle */ else (*ppp)->mark1 = 1; /* cycle detection */ *mark = &(*ppp)->mark1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Mark cycle %d\n", (*ppp)->mark1)); } } return NULL; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_mark_cycle(struct soap *soap, struct soap_plist *pp) { (void)soap; return pp && pp->mark1 == 2 && (soap->mode & SOAP_XML_TREE); } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_mark_dup(struct soap *soap, void *a, struct soap_plist *pp) { (void)soap; if (pp) pp->dup = a; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_unmark(struct soap *soap, char *mark) { (void)soap; if (mark) *mark = 0; /* release detection */ } /******************************************************************************/ 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; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_check_result(struct soap *soap, const char *tag) { (void)tag; if (soap->version == 2 && soap->encodingStyle) { soap_instring(soap, ":result", NULL, NULL, 0, 2, -1, -1, NULL); /* just ignore content for compliance reasons, but should compare tag to element's QName value? */ } } /******************************************************************************/ 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) { 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->text = soap_strdup(soap, value); a->soap = soap; soap->dom->atts = a; if (!a->name || (value && !a->text)) return soap->error = SOAP_EOM; return SOAP_OK; } #endif #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) { /* push namespace */ if (!strncmp(name, "xmlns", 5) && ((name[5] == ':') || name[5] == '\0')) { if (name[5] == ':' && soap->c14ninclude && ((*soap->c14ninclude == '*' || soap_tagsearch(soap->c14ninclude, name + 6)))) soap_utilize_ns(soap, name, 0); (void)soap_push_ns(soap, name + 5 + (name[5] == ':'), value, 0, 0); } else { soap->level--; if (soap_set_attr(soap, name, value, 1)) return soap->error; soap->level++; } } else #endif { if (soap_send_raw(soap, " ", 1) || 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; } /******************************************************************************/ 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; soap->error = soap_match_tag(soap, soap->tag, tag); if (!soap->error) { if (type && *soap->type && soap_match_tag(soap, soap->type, type)) return soap->error = SOAP_TYPE; soap->peeked = 0; if (!nillable && soap->null && (soap->mode & SOAP_XML_STRICT)) return soap->error = SOAP_NULL; if (soap->body) { soap->level++; if (soap->level > soap->maxlevel) return soap->error = SOAP_LEVEL; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin tag found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag ? tag : SOAP_STR_EOS)); soap->error = SOAP_OK; } } else if (soap->error == SOAP_NO_TAG && tag && *tag == '-') { soap->error = SOAP_OK; } return soap->error; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_in(struct soap *soap, const char *tag) { soap_wchar c; char *s = NULL; 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 significant for DOM "as-is" */ if ((soap->mode & SOAP_XML_DOM) && soap->dom) { const char *t = soap->dom->code; /* save XML code */ s = soap_string_in(soap, -1, -1, -1, NULL); if (!soap->peeked && !s) return soap->error; if (soap->dom->prnt) soap->dom = soap->dom->prnt; if (s && (soap->mode & SOAP_XML_STRICT)) { for (; *s; s++) if (!soap_coblank((soap_wchar)*s)) return soap->error = SOAP_END_TAG; /* reject mixed content before ending tag */ } soap->dom->code = t; /* restore XML code */ } #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_CHK_EOF; if (!soap_coblank(c)) { if ((soap->mode & SOAP_XML_STRICT)) return soap->error = SOAP_END_TAG; /* reject mixed content before ending tag */ if (c == SOAP_LT) n++; else if (c == '/') { c = soap_get(soap); if (c == SOAP_GT && n > 0) n--; else soap_unget(soap, c); } } } } while (n-- > 0); s = soap->tag; n = sizeof(soap->tag); while ((c = soap_get(soap)) > 32) { if (n > 1) { *s++ = (char)c; n--; } } *s = '\0'; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; while (soap_coblank(c)) c = soap_get(soap); if (c != SOAP_GT) return soap->error = SOAP_SYNTAX_ERROR; #ifndef WITH_LEAN #ifdef WITH_DOM if (soap->feltendin) { int err = soap->error; soap->error = soap->feltendin(soap, soap->tag, tag); if (soap->error) return soap->error; if (err) return soap->error = err; /* restore error */ } #endif #endif 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 tag '%s' does not match '%s'\n", soap->tag, tag ? tag : SOAP_STR_EOS)); return soap->error = SOAP_SYNTAX_ERROR; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End tag found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag ? tag : SOAP_STR_EOS)); soap->level--; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 const char * SOAP_FMAC2 soap_attr_value(struct soap *soap, const char *name, int flag, int occurs) { struct soap_attribute *tp; if (*name == '-') return SOAP_STR_EOS; for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible == 2 && !soap_match_att(soap, tp->name, name)) break; } if (tp) { if (occurs == 4 || (occurs == 2 && (soap->mode & SOAP_XML_STRICT))) soap->error = SOAP_PROHIBITED; else if (flag >= 4) return soap_collapse(soap, tp->value, flag, 1); else return tp->value; } else if (occurs == 3 || (occurs == 1 && (soap->mode & SOAP_XML_STRICT))) { soap->error = SOAP_REQUIRED; } else { soap->error = SOAP_OK; } return NULL; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_set_attr(struct soap *soap, const char *name, const char *value, int flag) { struct soap_attribute *tp, *tq; if (*name == '-') return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set attribute %s='%s'\n", name, value ? value : SOAP_STR_EOS)); tq = NULL; for (tp = soap->attributes; tp; tq = tp, tp = tp->next) { if (!strcmp(tp->name, name)) break; } if (!tp) { size_t l = strlen(name); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute %s\n", name)); if (sizeof(struct soap_attribute) + l > l && (SOAP_MAXALLOCSIZE <= 0 || sizeof(struct soap_attribute) + l <= SOAP_MAXALLOCSIZE)) tp = (struct soap_attribute*)SOAP_MALLOC(soap, sizeof(struct soap_attribute) + l); if (!tp) 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 { struct soap_nlist *np = soap_lookup_ns(soap, name, s - name); if (np) { tp->ns = np->ns; } else { struct soap_attribute *tq; for (tq = soap->attributes; tq; tq = tq->next) { if (!strncmp(tq->name, "xmlns:", 6) && !strncmp(tq->name + 6, name, s - name) && !tq->name[6 + s - name]) { tp->ns = tq->ns; break; } } } for (; *tpp; tpp = &(*tpp)->next) { int k; 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 if (tq) { tq->next = tp; tp->next = NULL; } else { tp->next = soap->attributes; soap->attributes = tp; } soap_strcpy((char*)tp->name, l + 1, 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, (void*)tp->value)); SOAP_FREE(soap, tp->value); tp->value = NULL; tp->ns = NULL; } if (value) { if (!tp->value) { tp->size = strlen(value) + 1; if (SOAP_MAXALLOCSIZE <= 0 || tp->size <= SOAP_MAXALLOCSIZE) tp->value = (char*)SOAP_MALLOC(soap, tp->size); if (!tp->value) return soap->error = SOAP_EOM; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute value for %s (%p)\n", tp->name, (void*)tp->value)); } soap_strcpy(tp->value, tp->size, value); if (!strncmp(tp->name, "xmlns:", 6)) tp->ns = tp->value; tp->visible = 2; tp->flag = (short)flag; #ifndef WITH_LEAN if (!strcmp(name, "wsu:Id")) { soap->event = SOAP_SEC_BEGIN; soap_strcpy(soap->id, sizeof(soap->id), value); } if ((soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_XML_CANONICAL_NA)) { const char *s = strchr(name, ':'); if (s && strchr(value, ':')) { struct soap_nlist *np = soap_lookup_ns(soap, name, s - name); if (np && np->ns && soap->local_namespaces) { if ((!strcmp(s + 1, "type") && !strcmp(np->ns, soap->local_namespaces[2].ns)) /* xsi:type QName */ || ((!strcmp(s + 1, "arrayType") || !strcmp(s + 1, "itemType")) && !strcmp(np->ns, soap->local_namespaces[1].ns))) /* SOAP-ENC:arrayType and SOAP-ENC:itemType QName */ soap_utilize_ns(soap, value, 1); } } } #endif } else { tp->visible = 1; } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_clr_attr(struct soap *soap) { 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; } } /******************************************************************************/ static int soap_getattrval(struct soap *soap, char *s, size_t *n, soap_wchar d) { char buf[8]; size_t i; size_t k = *n; size_t m = 0; char *t = buf; for (i = 0; i < k; i++) { soap_wchar c; if (m) { *s++ = *t++; m--; continue; } if ((soap->mode & SOAP_C_UTFSTRING)) { c = soap_get(soap); if ((c & 0x80000000) && c >= -0x7FFFFF80 && c < SOAP_AP) { t = buf; c &= 0x7FFFFFFF; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { #ifdef WITH_REPLACE_ILLEGAL_UTF8 if (!((c >= 0x80 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD) || (c >= 0x10000 && c <= 0x10FFFF))) c = SOAP_UNKNOWN_UNICODE_CHAR; #endif 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 = t - buf - 1; if (i + m >= k) { soap_unget(soap, c | 0x80000000); *n = i; return soap->error = SOAP_EOM; } t = buf; *s++ = *t++; continue; } } else { c = soap_getutf8(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'; *n = i + 1; return SOAP_OK; } *s++ = '>'; break; case SOAP_QT: if (c == d) { *s = '\0'; *n = i + 1; return SOAP_OK; } *s++ = '"'; break; case SOAP_AP: if (c == d) { *s = '\0'; *n = i + 1; return SOAP_OK; } *s++ = '\''; break; case '\t': case '\n': case '\r': case ' ': case '/': if (d == ' ') { soap_unget(soap, c); *s = '\0'; *n = i + 1; return SOAP_OK; } *s++ = (char)c; break; default: if ((int)c == EOF) { *s = '\0'; *n = i + 1; return soap->error = SOAP_CHK_EOF; } *s++ = (char)c; } } return soap->error = SOAP_EOM; } /******************************************************************************/ #ifdef WITH_FAST 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 /******************************************************************************/ #ifdef WITH_FAST SOAP_FMAC1 int SOAP_FMAC2 soap_append_lab(struct soap *soap, const char *s, size_t n) { if (soap->labidx + n < soap->labidx) return soap->error = SOAP_EOM; if (soap->labidx + n >= soap->lablen) { char *t = soap->labbuf; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enlarging look-aside buffer to append data, size=%lu\n", (unsigned long)soap->lablen)); if (soap->lablen == 0) soap->lablen = SOAP_LABLEN; while (soap->labidx + n >= soap->lablen) { if (soap->lablen << 1 < soap->lablen) return soap->error = SOAP_EOM; soap->lablen <<= 1; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New look-aside buffer size=%lu\n", (unsigned long)soap->lablen)); if (SOAP_MAXALLOCSIZE > 0 && soap->lablen > SOAP_MAXALLOCSIZE) return soap->error = SOAP_EOM; soap->labbuf = (char*)SOAP_MALLOC(soap, soap->lablen); if (!soap->labbuf) { if (t) SOAP_FREE(soap, t); return soap->error = SOAP_EOM; } if (t) { (void)soap_memcpy((void*)soap->labbuf, soap->lablen, (const void*)t, soap->labidx); SOAP_FREE(soap, t); } } if (s) { (void)soap_memcpy((void*)(soap->labbuf + soap->labidx), soap->lablen - soap->labidx, (const void*)s, n); soap->labidx += n; } return SOAP_OK; } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_peek_element(struct soap *soap) { #ifdef WITH_DOM struct soap_dom_attribute **att = NULL; char *lead = NULL; #endif struct soap_attribute *tp, *tq = NULL; const char *t; char *s; soap_wchar c; 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; /* UTF-8 BOM? */ c = soap_getchar(soap); if (c == 0xEF && soap_get0(soap) == 0xBB) { soap_get1(soap); c = soap_get1(soap); if (c == 0xBF) soap->mode &= ~SOAP_ENC_LATIN; else soap_unget(soap, (0x0F << 12) | (0xBB << 6) | (c & 0x3F)); /* UTF-8 */ } else if ((c == 0xFE && soap_get0(soap) == 0xFF) /* UTF-16 BE */ || (c == 0xFF && soap_get0(soap) == 0xFE)) /* UTF-16 LE */ { return soap->error = SOAP_UTF_ERROR; } else { soap_unget(soap, c); } c = soap_get(soap); #ifdef WITH_DOM /* whitespace leading up to the start tag is significant for DOM as-is (but comments and PIs are removed from this lead) */ if (soap_coblank(c)) { soap->labidx = 0; do { if (soap_append_lab(soap, NULL, 0)) return soap->error; s = soap->labbuf + soap->labidx; i = soap->lablen - soap->labidx; soap->labidx = soap->lablen; while (soap_coblank(c) && i-- > 0) { *s++ = c; c = soap_get(soap); } } while (soap_coblank(c) || i == 0); *s = '\0'; lead = soap->labbuf; } #else /* skip space */ while (soap_coblank(c)) c = soap_get(soap); #endif if (c != SOAP_LT) { *soap->tag = '\0'; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; soap_unget(soap, c); #ifdef WITH_DOM /* whitespace leading up to the end tag is significant for DOM as-is */ if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (lead && *lead) soap->dom->tail = soap_strdup(soap, lead); else soap->dom->tail = SOAP_STR_EOS; /* body with closing tag instead of */ } #endif return soap->error = SOAP_NO_TAG; } do { c = soap_get1(soap); } while (soap_coblank(c)); s = soap->tag; i = sizeof(soap->tag); while (c != '>' && c != '/' && c > 32 && (int)c != EOF) { if (i > 1) { *s++ = (char)c; i--; } c = soap_get1(soap); } *s = '\0'; while (soap_coblank(c)) c = soap_get1(soap); #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM)) { 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->prnt = soap->dom; elt->elts = NULL; elt->atts = NULL; elt->nstr = NULL; elt->name = soap_strdup(soap, soap->tag); elt->text = NULL; elt->code = NULL; elt->tail = NULL; elt->node = NULL; elt->type = 0; if (lead && *lead) elt->lead = soap_strdup(soap, lead); else elt->lead = 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; if (!elt->name) return soap->error = SOAP_EOM; } #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 != '/' && c > 32 && (int)c != EOF) { if (i > 1) { *s++ = (char)c; i--; } 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)->text = NULL; (*att)->soap = soap; if (!(*att)->name) return soap->error = SOAP_EOM; } #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) { size_t l = strlen(soap->tmpbuf); tp = (struct soap_attribute*)SOAP_MALLOC(soap, sizeof(struct soap_attribute) + l); if (!tp) return soap->error = SOAP_EOM; (void)soap_memcpy((char*)tp->name, l + 1, soap->tmpbuf, l + 1); tp->value = NULL; tp->size = 0; tp->ns = NULL; tp->visible = 0; /* append attribute to the end of the list */ if (tq) { tq->next = tp; tp->next = NULL; } else { tp->next = soap->attributes; soap->attributes = tp; } } while (soap_coblank(c)) c = soap_get1(soap); if (c == '=') { size_t k; do { c = soap_getutf8(soap); } while (soap_coblank(c)); if (c != SOAP_QT && c != SOAP_AP) { soap_unget(soap, c); c = ' '; /* blank delimiter */ } k = tp->size; if (soap_getattrval(soap, tp->value, &k, c)) { #ifdef WITH_FAST if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; if (soap_store_lab(soap, tp->value, k)) return soap->error; if (tp->value) SOAP_FREE(soap, tp->value); tp->value = NULL; for (;;) { k = soap->lablen - soap->labidx; if (soap_getattrval(soap, soap->labbuf + soap->labidx, &k, 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; } tp->value = (char*)SOAP_MALLOC(soap, tp->size); if (!tp->value) return soap->error = SOAP_EOM; soap_strcpy(tp->value, tp->size, soap->labbuf); #else tp->size = k; if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; if (soap_alloc_block(soap) == NULL) return soap->error; for (;;) { s = (char*)soap_push_block(soap, NULL, SOAP_BLKLEN); if (!s) return soap->error; k = SOAP_BLKLEN; if (soap_getattrval(soap, s, &k, c)) { if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; soap_size_block(soap, NULL, k); } else { break; } } k = tp->size + soap->blist->size; if (SOAP_MAXALLOCSIZE > 0 && k > SOAP_MAXALLOCSIZE) return soap->error = SOAP_EOM; s = (char*)SOAP_MALLOC(soap, k); if (!s) return soap->error = SOAP_EOM; if (tp->value) { (void)soap_memcpy((void*)s, k, (const void*)tp->value, tp->size); SOAP_FREE(soap, tp->value); } soap_save_block(soap, NULL, s + tp->size, 0); tp->value = s; tp->size = k; #endif } if (tp->visible) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Duplicate attribute in %s\n", soap->tag)); return soap->error = SOAP_SYNTAX_ERROR; /* redefined (duplicate) attribute */ } tp->visible = 2; /* seen this attribute w/ value */ do { c = soap_get1(soap); } while (soap_coblank(c)); #ifdef WITH_DOM if (att && tp->value) { (*att)->text = soap_strdup(soap, tp->value); if (!(*att)->text) return soap->error = SOAP_EOM; } #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) == NULL) return soap->error; } } #ifdef WITH_DOM if (att) { soap->dom->nstr = soap_current_namespace_tag(soap, soap->tag); for (att = &soap->dom->atts; *att; att = &(*att)->next) (*att)->nstr = soap_current_namespace_att(soap, (*att)->name); } #endif if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; soap->body = (c != '/'); if (!soap->body) { do { c = soap_get1(soap); } while (soap_coblank(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->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH)) { *soap->id = '#'; soap_strcpy(soap->id + 1, sizeof(soap->id) - 1, tp->value); } } else if (!strcmp(tp->name, "href")) { if ((soap->version == 1 && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH) || ((soap->mode & (SOAP_ENC_MTOM | SOAP_ENC_DIME)) && *tp->value != '#')) soap_strcpy(soap->href, sizeof(soap->href), tp->value); } else if (!strcmp(tp->name, "ref")) { if ((soap->version == 2 && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH)) { *soap->href = '#'; soap_strcpy(soap->href + (*tp->value != '#'), sizeof(soap->href) - 1, tp->value); } } #else if (!strcmp(tp->name, "href")) { if ((soap->mode & (SOAP_ENC_MTOM | SOAP_ENC_DIME)) && *tp->value != '#') soap_strcpy(soap->href, sizeof(soap->href), tp->value); } #endif else if (!soap_match_tag(soap, tp->name, "xsi:type")) { soap_strcpy(soap->type, sizeof(soap->type), tp->value); } 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_match_tag(soap, tp->name, "SOAP-ENV:encodingStyle")) { if (!soap->encodingStyle) soap->encodingStyle = SOAP_STR_EOS; soap_version(soap); } 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)) { (void)soap_strncpy(soap->arrayType, sizeof(soap->arrayType), tp->value, s - tp->value); soap_strcpy(soap->arraySize, sizeof(soap->arraySize), s); } else soap_strcpy(soap->arrayType, sizeof(soap->arrayType), tp->value); } else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:offset")) { soap_strcpy(soap->arrayOffset, sizeof(soap->arrayOffset), tp->value); } 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 (!soap_match_tag(soap, tp->name, "SOAP-ENC:id")) { *soap->id = '#'; soap_strcpy(soap->id + 1, sizeof(soap->id) - 1, tp->value); } else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:ref")) { *soap->href = '#'; soap_strcpy(soap->href + (*tp->value != '#'), sizeof(soap->href) - 1, tp->value); } else #endif if (!soap_match_tag(soap, tp->name, "SOAP-ENC:itemType")) { soap_strcpy(soap->arrayType, sizeof(soap->arrayType), tp->value); } else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:arraySize")) { soap_strcpy(soap->arraySize, sizeof(soap->arraySize), tp->value); } 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; } } else { if (!soap_match_tag(soap, tp->name, "wsdl:required") && !strcmp(tp->value, "true")) soap->mustUnderstand = 1; } } } #ifdef WITH_DOM if (soap->feltbegin) return soap->error = soap->feltbegin(soap, soap->tag); #endif return soap->error = SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_retry(struct soap *soap) { soap->error = SOAP_OK; soap_revert(soap); } /******************************************************************************/ 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 to last element '%s' (level=%u)\n", soap->tag, soap->level)); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_ignore(struct soap *soap) { int n = 0; soap_wchar c; soap->level++; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Ignoring XML content at level=%u\n", soap->level)); #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (!soap_string_in(soap, -1, -1, -1, NULL)) return soap->error; } else #endif { for (;;) { c = soap_get(soap); switch (c) { case SOAP_TT: if (n == 0) goto end; n--; break; case SOAP_LT: n++; break; case '/': if (n > 0) { c = soap_get0(soap); if (c == '>') n--; } break; default: if ((int)c == EOF) return soap->error = SOAP_EOF; } } end: soap_unget(soap, c); } return soap_element_end_in(soap, NULL); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_string_out(struct soap *soap, const char *s, int flag) { const char *t; soap_wchar c; soap_wchar mask = (soap_wchar)0xFFFFFF80UL; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_strdup(soap, s); if (!soap->dom->text) return soap->error = SOAP_EOM; return SOAP_OK; } #endif if (flag == 2 || (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 '&': 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; case 0x7F: 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; int m = mbtowc(&wc, t - 1, MB_CUR_MAX); if (m > 0 && !((soap_wchar)wc == c && m == 1 && c < 0x80)) { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, (unsigned long)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); } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_string_in(struct soap *soap, int flag, long minlen, long maxlen, const char *pattern) { char *s; char *t = NULL; size_t i; ULONG64 l = 0; int n = 0, f = 0, m = 0; 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 if (maxlen < 0 && soap->maxlength > 0) maxlen = soap->maxlength; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reading string content, flag=%d\n", flag)); if (flag <= 0 && soap->peeked && *soap->tag) { #ifndef WITH_LEAN struct soap_attribute *tp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String content includes tag '%s' and attributes\n", soap->tag)); t = soap->tmpbuf; *t = '<'; soap_strcpy(t + 1, sizeof(soap->tmpbuf) - 1, soap->tag); t += strlen(t); for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { size_t k = strlen(tp->name); if (t + k + 1 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; /* too many or attribute values to large */ *t++ = ' '; (void)soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->name, k); t += k; if (tp->value) { k = strlen(tp->value); if (t + k + 3 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; /* too many or attribute values to large */ *t++ = '='; *t++ = '"'; (void)soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->value, k); t += k; *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 <= 0) { int state = 0; #ifdef WITH_FAST soap->labidx = 0; /* use look-aside buffer */ #else if (soap_alloc_block(soap) == NULL) return NULL; #endif for (;;) { #ifdef WITH_FAST 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 size_t k = SOAP_BLKLEN; s = (char*)soap_push_block(soap, NULL, k); if (!s) 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 || c < SOAP_AP) && state != 1 && !(soap->mode & SOAP_ENC_LATIN)) { if ((c & 0x7FFFFFFF) >= 0x80) { soap_unget(soap, c); c = soap_getutf8(soap); } if ((c & 0x7FFFFFFF) >= 0x80 && (flag <= 0 || (soap->mode & SOAP_C_UTFSTRING))) { c &= 0x7FFFFFFF; t = buf; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { #ifdef WITH_REPLACE_ILLEGAL_UTF8 if (!((c >= 0x80 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD) || (c >= 0x10000 && c <= 0x10FFFF))) c = SOAP_UNKNOWN_UNICODE_CHAR; #endif 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++ = (char)c; continue; case 2: if (c == '-') state = 6; *s++ = (char)c; continue; case 3: if (c == '?') state = 8; *s++ = (char)c; continue; /* CDATA */ case 4: if (c == ']') state = 5; else state = 1; *s++ = (char)c; continue; case 5: if (c == '>') state = 0; else if (c != ']') state = 1; *s++ = (char)c; continue; /* comment */ case 6: if (c == '-') state = 7; else state = 2; *s++ = (char)c; continue; case 7: if (c == '>') state = 0; else if (c != '-') state = 2; *s++ = (char)c; continue; /* PI */ case 8: if (c == '>') state = 0; else if (c != '?') state = 3; *s++ = (char)c; continue; } switch (c) { case SOAP_TT: if (n == 0) goto end; n--; *s++ = '<'; t = (char*)"/"; m = 1; break; case SOAP_LT: if (flag == 3 || (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_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 == '-') { c = soap_getchar(soap); if (c == '-') 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 if (flag == 3 || (f && n == 0)) { soap_revget1(soap); c = '<'; goto end; } 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)) { #if defined(WIN32) && !defined(CYGWIN) && !defined(__MINGW32__) && !defined(__MINGW64__) && !defined(__BORLANDC__) m = 0; wctomb_s(&m, buf, sizeof(buf), (wchar_t)(c & 0x7FFFFFFF)); #else m = wctomb(buf, (wchar_t)(c & 0x7FFFFFFF)); #endif 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 (maxlen >= 0 && l > (size_t)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_alloc_block(soap) == NULL) return NULL; #endif for (;;) { #ifdef WITH_FAST 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 size_t k = SOAP_BLKLEN; s = (char*)soap_push_block(soap, NULL, k); if (!s) return NULL; #endif for (i = 0; i < k; i++) { if (m > 0) { *s++ = *t++; /* copy multibyte characters */ m--; continue; } #ifndef WITH_CDATA if (flag <= 0) c = soap_getchar(soap); else #endif { c = soap_getutf8(soap); if ((soap->mode & SOAP_C_UTFSTRING)) { if (c >= 0x80 || (c < SOAP_AP && c >= -0x7FFFFF80)) { c &= 0x7FFFFFFF; t = buf; if (c < 0x0800) { *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); } else { #ifdef WITH_REPLACE_ILLEGAL_UTF8 if (!((c >= 0x80 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD) || (c >= 0x10000 && c <= 0x10FFFF))) c = SOAP_UNKNOWN_UNICODE_CHAR; #endif 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++; l++; if (maxlen >= 0 && l > (size_t)maxlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); soap->error = SOAP_LENGTH; return NULL; } continue; } } } switch (c) { case SOAP_TT: if (n == 0) goto end; n--; *s++ = '<'; t = (char*)"/"; m = 1; break; case SOAP_LT: if (flag == 3 || (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) { if (flag > 0) { c = soap_get(soap); if (c == SOAP_GT) n--; } else { c = soap_getchar(soap); if (c == '>') n--; } soap_unget(soap, c); } *s++ = '/'; break; case (soap_wchar)('<' | 0x80000000): if (flag > 0) { *s++ = '<'; } else { *s++ = '&'; t = (char*)"lt;"; m = 3; } break; case (soap_wchar)('>' | 0x80000000): if (flag > 0) { *s++ = '>'; } else { *s++ = '&'; t = (char*)"gt;"; m = 3; } break; case (soap_wchar)('&' | 0x80000000): if (flag > 0) { *s++ = '&'; } else { *s++ = '&'; t = (char*)"amp;"; m = 4; } break; case (soap_wchar)('"' | 0x80000000): if (flag > 0) { *s++ = '"'; } else { *s++ = '&'; t = (char*)"quot;"; m = 5; } break; case (soap_wchar)('\'' | 0x80000000): if (flag > 0) { *s++ = '\''; } else { *s++ = '&'; t = (char*)"apos;"; m = 5; } break; default: if ((int)c == EOF) goto end; #ifndef WITH_CDATA if (c == '<') { c = soap_getchar(soap); soap_unget(soap, c); if (c == '/') { c = SOAP_TT; if (n == 0) goto end; n--; } else { n++; } *s++ = '<'; } else #endif #ifndef WITH_LEANER #ifdef HAVE_WCTOMB if ((soap->mode & SOAP_C_MBSTRING)) { #if defined(WIN32) && !defined(CYGWIN) && !defined(__MINGW32__) && !defined(__MINGW64__) && !defined(__BORLANDC__) m = 0; wctomb_s(&m, buf, sizeof(buf), (wchar_t)(c & 0x7FFFFFFF)); #else m = wctomb(buf, (wchar_t)(c & 0x7FFFFFFF)); #endif 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 (maxlen >= 0 && l > (size_t)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); if (!t) return NULL; #else soap_size_block(soap, NULL, i + 1); t = soap_save_block(soap, NULL, NULL, 0); #endif if (minlen > 0 && l < (size_t)minlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too short: %lu chars, minlen=%ld\n", (unsigned long)l, minlen)); soap->error = SOAP_LENGTH; return NULL; } #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom && *t) { if (flag > 0) soap->dom->text = t; else soap->dom->code = t; } #endif if (flag == 2) { if (soap_s2QName(soap, t, &t, minlen, maxlen, pattern)) return NULL; } else if (flag >= 4 && t) { t = soap_collapse(soap, t, flag, 1); } #ifndef WITH_LEANER else if (pattern && soap->fsvalidate) { soap->error = soap->fsvalidate(soap, pattern, t); if (soap->error) return NULL; } #endif return t; } /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_wstring_out(struct soap *soap, const wchar_t *s, int flag) { const char *t; char tmp; soap_wchar c; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_wchar2s(soap, 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 { /* check for UTF16 encoding when wchar_t is too small to hold UCS */ if (sizeof(wchar_t) < 4 && (c & 0xFC00) == 0xD800) { soap_wchar d = *s; if ((d & 0xFC00) == 0xDC00) { c = ((c - 0xD800) << 10) + (d - 0xDC00) + 0x10000; s++; } #ifdef WITH_REPLACE_ILLEGAL_UTF8 else { c = SOAP_UNKNOWN_UNICODE_CHAR; /* Malformed UTF-16 */ } #endif } if (soap_pututf8(soap, (unsigned long)c)) return soap->error; } continue; } if (soap_send(soap, t)) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 wchar_t * SOAP_FMAC2 soap_wstring_in(struct soap *soap, int flag, long minlen, long maxlen, const char *pattern) { wchar_t *s; int i, n = 0, f = 0; ULONG64 l = 0; soap_wchar c; char *t = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reading wide string content\n")); if (maxlen < 0 && soap->maxlength > 0) maxlen = soap->maxlength; if (flag <= 0 && soap->peeked && *soap->tag) { #ifndef WITH_LEAN struct soap_attribute *tp; t = soap->tmpbuf; *t = '<'; soap_strcpy(t + 1, sizeof(soap->tmpbuf) - 1, soap->tag); t += strlen(t); for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { size_t k = strlen(tp->name); if (t + k + 1 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; *t++ = ' '; (void)soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->name, k); t += k; if (tp->value) { k = strlen(tp->value); if (t + k + 3 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; *t++ = '='; *t++ = '"'; (void)soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->value, k); t += k; *t++ = '"'; } } } if (!soap->body) *t++ = '/'; *t++ = '>'; *t = '\0'; t = soap->tmpbuf; #endif if (soap->body) n = 1; f = 1; soap->peeked = 0; } if (soap_alloc_block(soap) == NULL) return NULL; for (;;) { s = (wchar_t*)soap_push_block(soap, NULL, sizeof(wchar_t)*SOAP_BLKLEN); if (!s) 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++ = L'<'; soap_unget(soap, '/'); break; case SOAP_LT: if (flag == 3 || (f && n == 0)) goto end; n++; *s++ = L'<'; break; case SOAP_GT: *s++ = L'>'; break; case SOAP_QT: *s++ = L'"'; break; case SOAP_AP: *s++ = L'\''; break; case '/': if (n > 0) { c = soap_getutf8(soap); if (c == SOAP_GT) n--; soap_unget(soap, c); } *s++ = L'/'; break; case '<': if (flag > 0) { *s++ = L'<'; } else { *s++ = L'&'; t = (char*)"lt;"; } break; case '>': if (flag > 0) { *s++ = L'>'; } else { *s++ = (wchar_t)'&'; t = (char*)"gt;"; } break; case '"': if (flag > 0) { *s++ = L'"'; } else { *s++ = L'&'; t = (char*)"quot;"; } break; default: if ((int)c == EOF) goto end; /* use UTF16 encoding when wchar_t is too small to hold UCS */ if (sizeof(wchar_t) < 4 && c > 0xFFFF) { soap_wchar c1, c2; c1 = 0xD800 - (0x10000 >> 10) + (c >> 10); c2 = 0xDC00 + (c & 0x3FF); c = c1; soap_unget(soap, c2); } *s++ = (wchar_t)(c & 0x7FFFFFFF); } l++; if (maxlen >= 0 && l > (size_t)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 = L'\0'; soap_size_block(soap, NULL, sizeof(wchar_t) * (i + 1)); if (minlen > 0 && l < (size_t)minlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too short: %lu chars, minlen=%ld\n", (unsigned long)l, minlen)); soap->error = SOAP_LENGTH; return NULL; } s = (wchar_t*)soap_save_block(soap, NULL, NULL, 0); #ifndef WITH_LEAN if (flag >= 4 && s) s = soap_wcollapse(soap, s, flag, 1); #endif #ifndef WITH_LEANER if (pattern && soap->fwvalidate) { soap->error = soap->fwvalidate(soap, pattern, s); if (soap->error) return NULL; } #endif #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) soap->dom->text = soap_wchar2s(soap, s); #endif return s; } #endif /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_int2s(struct soap *soap, int n) { return soap_long2s(soap, (long)n); } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2int(struct soap *soap, const char *s, int *p) { if (s) { long n; char *r; if (!*s) return soap->error = SOAP_EMPTY; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif n = soap_strtol(s, &r, 10); if (s == r || *r #ifndef WITH_LEAN || n != (int)n #endif #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; *p = (int)n; } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (int*)soap_id_enter(soap, soap->id, p, t, sizeof(int), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2int(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (int*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(int), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_long2s(struct soap *soap, long n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), "%ld", n); return soap->tmpbuf; } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2long(struct soap *soap, const char *s, long *p) { if (s) { char *r; if (!*s) return soap->error = SOAP_EMPTY; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = soap_strtol(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (long*)soap_id_enter(soap, soap->id, p, t, sizeof(long), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2long(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (long*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(long), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_LONG642s(struct soap *soap, LONG64 n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), SOAP_LONG_FORMAT, n); return soap->tmpbuf; } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2LONG64(struct soap *soap, const char *s, LONG64 *p) { if (s) { char *r; if (!*s) return soap->error = SOAP_EMPTY; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = soap_strtoll(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (LONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(LONG64), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2LONG64(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (LONG64*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(LONG64), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_byte2s(struct soap *soap, char n) { return soap_long2s(soap, (long)n); } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2byte(struct soap *soap, const char *s, char *p) { if (s) { long n; char *r; if (!*s) return soap->error = SOAP_EMPTY; n = soap_strtol(s, &r, 10); if (s == r || *r || n < -128 || n > 127) soap->error = SOAP_TYPE; *p = (char)n; } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (char*)soap_id_enter(soap, soap->id, p, t, sizeof(char), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2byte(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (char*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(char), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_short2s(struct soap *soap, short n) { return soap_long2s(soap, (long)n); } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2short(struct soap *soap, const char *s, short *p) { if (s) { long n; char *r; if (!*s) return soap->error = SOAP_EMPTY; n = soap_strtol(s, &r, 10); if (s == r || *r || n < -32768 || n > 32767) soap->error = SOAP_TYPE; *p = (short)n; } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (short*)soap_id_enter(soap, soap->id, p, t, sizeof(short), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2short(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (short*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(short), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_float2s(struct soap *soap, float n) { #if defined(WITH_C_LOCALE) # if !defined(WIN32) SOAP_LOCALE_T locale; # endif #else char *s; #endif if (soap_isnan((double)n)) return "NaN"; if (soap_ispinff(n)) return "INF"; if (soap_isninff(n)) return "-INF"; #if defined(WITH_C_LOCALE) # ifdef WIN32 _sprintf_s_l(soap->tmpbuf, _countof(soap->tmpbuf), soap->float_format, SOAP_LOCALE(soap), n); # else locale = uselocale(SOAP_LOCALE(soap)); (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), soap->float_format, n); uselocale(locale); # endif #else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), soap->float_format, n); s = strchr(soap->tmpbuf, ','); /* convert decimal comma to DP */ if (s) *s = '.'; #endif return soap->tmpbuf; } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2float(struct soap *soap, const char *s, float *p) { if (s) { if (!*s) return soap->error = SOAP_EMPTY; 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 strtod first */ #if defined(WITH_C_LOCALE) # if defined(HAVE_STRTOD_L) char *r; # ifdef WIN32 *p = (float)_strtod_l(s, &r, SOAP_LOCALE(soap)); # else *p = (float)strtod_l(s, &r, SOAP_LOCALE(soap)); # endif if (*r) soap->error = SOAP_TYPE; # elif defined(HAVE_STRTOF_L) char *r; *p = strtof_l((char*)s, &r, SOAP_LOCALE(soap)); if (*r) soap->error = SOAP_TYPE; # elif defined(HAVE_SSCANF_L) double n; if (sscanf_l(s, SOAP_LOCALE(soap), "%lf", &n) != 1) soap->error = SOAP_TYPE; *p = (float)n; # elif defined(HAVE_STRTOD) char *r; SOAP_LOCALE_T locale = uselocale(SOAP_LOCALE(soap)); *p = (float)strtod((char*)s, &r); uselocale(locale); if (*r) soap->error = SOAP_TYPE; # elif defined(HAVE_STRTOF) char *r; SOAP_LOCALE_T locale = uselocale(SOAP_LOCALE(soap)); *p = strtof((char*)s, &r); uselocale(locale); if (*r) soap->error = SOAP_TYPE; # elif defined(HAVE_SSCANF) double n; SOAP_LOCALE_T locale = uselocale(SOAP_LOCALE(soap)); if (sscanf(s, "%lf", &n) != 1) soap->error = SOAP_TYPE; uselocale(locale); *p = (float)n; # else soap->error = SOAP_TYPE; # endif #elif defined(HAVE_STRTOD) char *r; *p = (float)strtod(s, &r); if (*r) soap->error = SOAP_TYPE; #elif defined(HAVE_STRTOF) char *r; *p = strtof((char*)s, &r); if (*r) soap->error = SOAP_TYPE; #elif defined(HAVE_SSCANF) double n; if (sscanf(s, "%lf", &n) != 1) soap->error = SOAP_TYPE; *p = (float)n; #else soap->error = SOAP_TYPE; #endif } } return soap->error; } /******************************************************************************/ #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 /******************************************************************************/ 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; #else (void)type; #endif p = (float*)soap_id_enter(soap, soap->id, p, t, sizeof(float), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2float(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (float*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(float), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_double2s(struct soap *soap, double n) { #if defined(WITH_C_LOCALE) # if !defined(WIN32) SOAP_LOCALE_T locale; # endif #else char *s; #endif if (soap_isnan(n)) return "NaN"; if (soap_ispinfd(n)) return "INF"; if (soap_isninfd(n)) return "-INF"; #if defined(WITH_C_LOCALE) # ifdef WIN32 _sprintf_s_l(soap->tmpbuf, _countof(soap->tmpbuf), soap->double_format, SOAP_LOCALE(soap), n); # else locale = uselocale(SOAP_LOCALE(soap)); (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 40), soap->double_format, n); uselocale(locale); # endif #else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 40), soap->double_format, n); s = strchr(soap->tmpbuf, ','); /* convert decimal comma to DP */ if (s) *s = '.'; #endif return soap->tmpbuf; } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2double(struct soap *soap, const char *s, double *p) { if (s) { if (!*s) return soap->error = SOAP_EMPTY; 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(WITH_C_LOCALE) # if defined(HAVE_STRTOD_L) char *r; # ifdef WIN32 *p = _strtod_l(s, &r, SOAP_LOCALE(soap)); # else *p = strtod_l(s, &r, SOAP_LOCALE(soap)); # endif if (*r) soap->error = SOAP_TYPE; # elif defined(HAVE_STRTOD) char *r; SOAP_LOCALE_T locale = uselocale(SOAP_LOCALE(soap)); *p = strtod(s, &r); uselocale(locale); if (*r) soap->error = SOAP_TYPE; # elif defined(HAVE_SSCANF_L) SOAP_LOCALE_T locale = uselocale(SOAP_LOCALE(soap)); if (sscanf_l(s, SOAP_LOCALE(soap), "%lf", p) != 1) soap->error = SOAP_TYPE; uselocale(locale); # else soap->error = SOAP_TYPE; # endif #elif defined(HAVE_STRTOD) char *r; *p = strtod(s, &r); if (*r) soap->error = SOAP_TYPE; #elif defined(HAVE_SSCANF) if (sscanf(s, "%lf", p) != 1) soap->error = SOAP_TYPE; #else soap->error = SOAP_TYPE; #endif } } return soap->error; } /******************************************************************************/ 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; #else (void)type; #endif p = (double*)soap_id_enter(soap, soap->id, p, t, sizeof(double), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2double(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (double*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(double), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedByte2s(struct soap *soap, unsigned char n) { return soap_unsignedLong2s(soap, (unsigned long)n); } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedByte(struct soap *soap, const char *s, unsigned char *p) { if (s) { long n; char *r; if (!*s) return soap->error = SOAP_EMPTY; n = soap_strtol(s, &r, 10); if (s == r || *r || n < 0 || n > 255) soap->error = SOAP_TYPE; *p = (unsigned char)n; } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (unsigned char*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned char), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2unsignedByte(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (unsigned char*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned char), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedShort2s(struct soap *soap, unsigned short n) { return soap_unsignedLong2s(soap, (unsigned long)n); } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedShort(struct soap *soap, const char *s, unsigned short *p) { if (s) { long n; char *r; if (!*s) return soap->error = SOAP_EMPTY; n = soap_strtol(s, &r, 10); if (s == r || *r || n < 0 || n > 65535) soap->error = SOAP_TYPE; *p = (unsigned short)n; } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (unsigned short*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned short), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2unsignedShort(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (unsigned short*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned short), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedInt2s(struct soap *soap, unsigned int n) { return soap_unsignedLong2s(soap, (unsigned long)n); } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedInt(struct soap *soap, const char *s, unsigned int *p) { if (s) { char *r; if (!*s) return soap->error = SOAP_EMPTY; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = (unsigned int)soap_strtoul(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; #ifdef HAVE_STRTOUL if (*p > 0 && strchr(s, '-')) return soap->error = SOAP_TYPE; #endif } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (unsigned int*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned int), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2unsignedInt(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (unsigned int*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned int), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedLong2s(struct soap *soap, unsigned long n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), "%lu", n); return soap->tmpbuf; } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedLong(struct soap *soap, const char *s, unsigned long *p) { if (s) { char *r; if (!*s) return soap->error = SOAP_EMPTY; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = soap_strtoul(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; #ifdef HAVE_STRTOUL if (*p > 0 && strchr(s, '-')) return soap->error = SOAP_TYPE; #endif } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (unsigned long*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned long), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2unsignedLong(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (unsigned long*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned long), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_ULONG642s(struct soap *soap, ULONG64 n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), SOAP_ULONG_FORMAT, n); return soap->tmpbuf; } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2ULONG64(struct soap *soap, const char *s, ULONG64 *p) { if (s) { char *r; if (!*s) return soap->error = SOAP_EMPTY; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = soap_strtoull(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; if (*p > 0 && strchr(s, '-')) return soap->error = SOAP_TYPE; } return soap->error; } /******************************************************************************/ 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; #ifndef WITH_LEAN 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; } #else (void)type; #endif p = (ULONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(ULONG64), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2ULONG64(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (ULONG64*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(ULONG64), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2char(struct soap *soap, const char *s, char **t, int flag, long minlen, long maxlen, const char *pattern) { if (s) { const char *r = soap_string(soap, s, flag, minlen, maxlen, pattern); if (r && (*t = soap_strdup(soap, r)) == NULL) return soap->error = SOAP_EOM; } return soap->error; } /******************************************************************************/ #ifndef WITH_COMPAT #ifdef __cplusplus SOAP_FMAC1 int SOAP_FMAC2 soap_s2stdchar(struct soap *soap, const char *s, std::string *t, int flag, long minlen, long maxlen, const char *pattern) { if (s) { const char *r = soap_string(soap, s, flag, minlen, maxlen, pattern); if (r) t->assign(r); } return soap->error; } #endif #endif /******************************************************************************/ static const char* soap_string(struct soap *soap, const char *s, int flag, long minlen, long maxlen, const char *pattern) { if (s) { if (maxlen < 0 && soap->maxlength > 0) maxlen = soap->maxlength; if (minlen > 0 || maxlen >= 0) { size_t l; if ((soap->mode & SOAP_C_UTFSTRING)) l = soap_utf8len(s); else l = strlen(s); if ((maxlen >= 0 && l > (size_t)maxlen) || (minlen > 0 && l < (size_t)minlen)) { soap->error = SOAP_LENGTH; return NULL; } } if (flag >= 4) s = soap_collapse(soap, (char*)s, flag, 0); #ifndef WITH_LEANER if (pattern && soap->fsvalidate) { soap->error = soap->fsvalidate(soap, pattern, s); if (soap->error) return NULL; } #else (void)pattern; #endif } return s; } /******************************************************************************/ static char* soap_collapse(struct soap *soap, char *s, int flag, int insitu) { /* flag 4=normalizedString (replace), 5=token (collapse) */ char *t; size_t n; if (!s) return NULL; if (flag == 4) { for (t = s; *t && (!soap_coblank((soap_wchar)*t) || *t == 32); t++) continue; if (*t) { /* replace white space and control chars by blanks */ if (!insitu) s = soap_strdup(soap, s); for (t = s; *t; t++) if (soap_coblank((soap_wchar)*t)) *t = ' '; } return s; } /* collapse white space */ for (t = s; *t && soap_coblank((soap_wchar)*t); t++) continue; n = strlen(t); if (insitu && s < t) (void)soap_memmove(s, n + 1, t, n + 1); else s = t; if (n > 0) { if (!soap_coblank((soap_wchar)s[n-1])) { for (t = s; (*t && !soap_coblank((soap_wchar)*t)) || (*t == 32 && (!t[1] || !soap_coblank((soap_wchar)t[1]))); t++) continue; if (!*t) return s; } if (!insitu) s = soap_strdup(soap, s); for (t = s; *t; t++) { if (soap_coblank((soap_wchar)*t)) { char *r; *t = ' '; for (r = t + 1; *r && soap_coblank((soap_wchar)*r); r++) continue; if (r > t + 1) (void)soap_memmove(t + 1, n - (t-s), r, n - (r-s) + 1); } } t--; if (t >= s && *t == 32) *t = '\0'; } return s; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2QName(struct soap *soap, const char *s, char **t, long minlen, long maxlen, const char *pattern) { *t = NULL; if (s) { const char *r = soap_QName(soap, s, minlen, maxlen, pattern); if (r && (*t = soap_strdup(soap, r)) == NULL) return soap->error = SOAP_EOM; } return soap->error; } /******************************************************************************/ #ifndef WITH_COMPAT #ifdef __cplusplus SOAP_FMAC1 int SOAP_FMAC2 soap_s2stdQName(struct soap *soap, const char *s, std::string *t, long minlen, long maxlen, const char *pattern) { t->clear(); if (s) { const char *r = soap_QName(soap, s, minlen, maxlen, pattern); if (r) t->assign(r); } return soap->error; } #endif #endif /******************************************************************************/ static const char* soap_QName(struct soap *soap, const char *s, long minlen, long maxlen, const char *pattern) { if (s) { char *b; if (maxlen < 0 && soap->maxlength > 0) maxlen = soap->maxlength; if (minlen > 0 || maxlen >= 0) { size_t l; if ((soap->mode & SOAP_C_UTFSTRING)) l = soap_utf8len(s); else l = strlen(s); if ((maxlen >= 0 && l > (size_t)maxlen) || (minlen > 0 && l < (size_t)minlen)) { soap->error = SOAP_LENGTH; return NULL; } } #ifdef WITH_FAST soap->labidx = 0; #else if (soap_alloc_block(soap) == NULL) return NULL; #endif 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; const char *p = NULL; short flag = 0; const char *r = NULL; size_t m = 0; #ifndef WITH_FAST size_t k = 0; #endif /* skip blanks */ while (*s && soap_coblank((soap_wchar)*s)) s++; if (!*s) break; /* find next QName */ n = 1; while (s[n] && !soap_coblank((soap_wchar)s[n])) n++; np = soap->nlist; /* if there is no namespace stack, or prefix is "#" or "xml" then copy string */ if (!np || *s == '#' || !strncmp(s, "xml:", 4)) { r = s; m = n; } else /* we normalize the QName by replacing its prefix */ { const char *q; for (p = s; *p && p < s + n; p++) if (*p == ':') break; 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 && (q = soap->local_namespaces[np->index].id) != NULL) { size_t k = strlen(q); if (q[k-1] != '_') { r = q; m = k; } else { flag = 1; r = soap->local_namespaces[np->index].ns; m = strlen(r); } } else if (np->ns) { flag = 1; r = np->ns; m = strlen(r); } 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)); soap->error = SOAP_NAMESPACE; return NULL; } } else if (s[n]) /* no namespace, part of string */ { r = s; m = n; } else /* no namespace: assume "" namespace */ { flag = 1; } } #ifdef WITH_FAST if ((flag && soap_append_lab(soap, "\"", 1)) || (m && soap_append_lab(soap, r, m)) || (flag && soap_append_lab(soap, "\"", 1)) || (p && (soap_append_lab(soap, ":", 1) || soap_append_lab(soap, p, n - (p-s))))) return NULL; #else k = 2*flag + m + (p ? n - (p-s) + 1 : 0) + (s[n] != '\0'); b = (char*)soap_push_block(soap, NULL, k); if (!b) return NULL; if (flag) *b++ = '"'; if (m) { if (soap_memcpy((void*)b, k, (const void*)r, m)) { soap->error = SOAP_EOM; return NULL; } b += m; } if (flag) *b++ = '"'; if (p) { *b++ = ':'; if (soap_memcpy((void*)b, k - m - flag - 1, (const void*)p, n - (p-s))) { soap->error = SOAP_EOM; return NULL; } b += n - (p-s); } #endif /* advance to next and add spacing */ s += n; while (*s && soap_coblank(*s)) s++; if (*s) { #ifdef WITH_FAST if (soap_append_lab(soap, " ", 1)) return NULL; #else *b = ' '; #endif } } #ifdef WITH_FAST if (soap_append_lab(soap, SOAP_STR_EOS, 1)) return NULL; b = soap->labbuf; #else b = (char*)soap_push_block(soap, NULL, 1); if (!b) return NULL; *b = '\0'; b = (char*)soap_save_block(soap, NULL, NULL, 0); #endif #ifndef WITH_LEANER if (pattern && soap->fsvalidate) { soap->error = soap->fsvalidate(soap, pattern, b); if (soap->error) return NULL; } #else (void)pattern; #endif return b; } return NULL; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_QName2s(struct soap *soap, const char *s) { const char *t = NULL; if (s) { #ifdef WITH_FAST soap_store_lab(soap, SOAP_STR_EOS, 1); soap->labidx = 0; #else char *b = NULL; if (soap_alloc_block(soap) == NULL) return NULL; #endif for (;;) { size_t n; const char *q = NULL; const char *r = NULL; size_t m = 0; #ifndef WITH_FAST size_t k = 0; #endif /* skip blanks */ while (*s && soap_coblank((soap_wchar)*s)) s++; if (!*s) { #ifdef WITH_FAST soap->labbuf[soap->labidx > 0 ? soap->labidx - 1 : 0] = '\0'; #else if (!b) return soap_strdup(soap, SOAP_STR_EOS); --b; *b = '\0'; #endif break; } /* find next QName */ n = 0; while (s[n] && !soap_coblank((soap_wchar)s[n])) { if (s[n] == ':') r = s; n++; } if (*s != '"') /* non-quoted: pass string as is */ { #ifndef WITH_LEAN if (r && (soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_XML_CANONICAL_NA)) soap_utilize_ns(soap, s, 1); #endif r = s; m = n + 1; } else /* prefix quoted URI-based string */ { q = strchr(s + 1, '"'); if (q) { struct Namespace *p = soap->local_namespaces; if (p) { for (; p->id; p++) { if (p->ns) if (!soap_tag_cmp(s + 1, p->ns)) break; if (p->in) if (!soap_tag_cmp(s + 1, p->in)) break; } } q++; /* URL is in the namespace table? */ if (p && p->id) { r = p->id; m = strlen(r); } else /* not in namespace table: create xmlns binding */ { char *x = soap_strdup(soap, s + 1); if (!x) return NULL; x[q - s - 2] = '\0'; (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 27), "xmlns:_%d", soap->idnum++); soap_set_attr(soap, soap->tmpbuf, x, 1); r = soap->tmpbuf + 6; m = strlen(r); } } } /* copy normalized QName into buffer, including the ending blank or NUL */ #ifdef WITH_FAST if ((m && soap_append_lab(soap, r, m)) || (q && soap_append_lab(soap, q, n - (q - s) + 1))) return NULL; #else k = m + (q ? n - (q - s) + 1 : 0); b = (char*)soap_push_block(soap, NULL, k); if (!b) { soap->error = SOAP_EOM; return NULL; } if (soap_memcpy((void*)b, k, (const void*)r, m)) { soap->error = SOAP_EOM; return NULL; } b += m; if (q) { if (soap_memcpy((void*)b, k - m, (const void*)q, n - (q - s) + 1)) { soap->error = SOAP_EOM; return NULL; } b += n - (q - s) + 1; } #endif /* advance to next */ s += n; } #ifdef WITH_FAST t = soap_strdup(soap, soap->labbuf); if (!t) soap->error = SOAP_EOM; #else t = (char*)soap_save_block(soap, NULL, NULL, 0); #endif } return t; } /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2wchar(struct soap *soap, const char *s, wchar_t **t, int flag, long minlen, long maxlen, const char *pattern) { if (s) { const wchar_t *r = soap_wstring(soap, s, flag, minlen, maxlen, pattern); if (r && (*t = soap_wstrdup(soap, r)) == NULL) return soap->error = SOAP_EOM; } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_COMPAT #ifdef __cplusplus #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2stdwchar(struct soap *soap, const char *s, std::wstring *t, int flag, long minlen, long maxlen, const char *pattern) { if (s) { const wchar_t *r = soap_wstring(soap, s, flag, minlen, maxlen, pattern); if (r) t->assign(r); } return soap->error; } #endif #endif #endif /******************************************************************************/ #ifndef WITH_LEAN static const wchar_t* soap_wstring(struct soap *soap, const char *s, int flag, long minlen, long maxlen, const char *pattern) { if (s) { size_t l; soap_wchar c; wchar_t *t; if (maxlen < 0 && soap->maxlength > 0) maxlen = soap->maxlength; soap->labidx = 0; if ((soap->mode & SOAP_ENC_LATIN)) { wchar_t *r; if (soap_append_lab(soap, NULL, sizeof(wchar_t) * (strlen(s) + 1))) return NULL; r = (wchar_t*)soap->labbuf; while (*s) *r++ = (wchar_t)*s++; } else { /* Convert UTF8 to wchar_t */ while (*s) { c = (unsigned char)*s++; if (c >= 0x80) { #ifdef WITH_REPLACE_ILLEGAL_UTF8 soap_wchar c1, c2, c3; c1 = (unsigned char)*s; if (c <= 0xC1 || (c1 & 0xC0) != 0x80) { c = SOAP_UNKNOWN_UNICODE_CHAR; } else { ++s; c1 &= 0x3F; if (c < 0xE0) { c = (((c & 0x1F) << 6) | c1); } else { c2 = (unsigned char)*s; if ((c == 0xE0 && c1 < 0x20) || (c2 & 0xC0) != 0x80) { c = SOAP_UNKNOWN_UNICODE_CHAR; } else { ++s; c2 &= 0x3F; if (c < 0xF0) { c = (((c & 0x0F) << 12) | (c1 << 6) | c2); } else { c3 = (unsigned char)*s; if ((c == 0xF0 && c1 < 0x10) || (c == 0xF4 && c1 >= 0x10) || c >= 0xF5 || (c3 & 0xC0) != 0x80) { c = SOAP_UNKNOWN_UNICODE_CHAR; } else { ++s; c = (((c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | (c3 & 0x3F)); } } } } } #else soap_wchar c1, c2, c3, c4; c1 = (unsigned char)*s; if (c1) { s++; c1 &= 0x3F; if (c < 0xE0) { c = (wchar_t)(((soap_wchar)(c & 0x1F) << 6) | c1); } else { c2 = (unsigned char)*s; if (c2) { s++; c2 &= 0x3F; if (c < 0xF0) { c = (wchar_t)(((soap_wchar)(c & 0x0F) << 12) | (c1 << 6) | c2); } else { c3 = (unsigned char)*s; if (c3) { s++; c3 &= 0x3F; if (c < 0xF8) { c = (wchar_t)(((soap_wchar)(c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3); } else { c4 = (unsigned char)*s; if (c4) { s++; c4 &= 0x3F; if (c < 0xFC) { c = (wchar_t)(((soap_wchar)(c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4); } else { c = (wchar_t)(((soap_wchar)(c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (unsigned char)(*s & 0x3F)); if (*s) s++; } } } } } } } } #endif } /* use UTF16 encoding when wchar_t is too small to hold UCS */ if (sizeof(wchar_t) < 4 && c > 0xFFFF) { wchar_t c1, c2; c1 = 0xD800 - (0x10000 >> 10) + (c >> 10); c2 = 0xDC00 + (c & 0x3FF); if (soap_append_lab(soap, (const char*)&c1, sizeof(wchar_t)) || soap_append_lab(soap, (const char*)&c2, sizeof(wchar_t))) return NULL; } else if (soap_append_lab(soap, (const char*)&c, sizeof(wchar_t))) { return NULL; } } } l = soap->labidx / sizeof(wchar_t); c = L'\0'; if (soap_append_lab(soap, (const char*)&c, sizeof(wchar_t))) return NULL; if ((maxlen >= 0 && l > (size_t)maxlen) || (minlen > 0 && l < (size_t)minlen)) { soap->error = SOAP_LENGTH; return NULL; } t = (wchar_t*)soap->labbuf; #ifndef WITH_LEAN if (flag >= 4 && t) t = soap_wcollapse(soap, t, flag, 1); #endif #ifndef WITH_LEANER if (pattern && soap->fwvalidate) { soap->error = soap->fwvalidate(soap, pattern, t); if (soap->error) return NULL; } #endif return t; } return NULL; } #endif /******************************************************************************/ #ifndef WITH_LEAN static wchar_t* soap_wcollapse(struct soap *soap, wchar_t *s, int flag, int insitu) { /* flag 4=normalizedString (replace), 5=token (collapse) */ wchar_t *t; size_t n; if (!s) return NULL; if (flag == 4) { for (t = s; *t && (!soap_coblank((soap_wchar)*t) || *t == 32); t++) continue; if (*t) { /* replace blanks and control char by space */ if (!insitu) s = soap_wstrdup(soap, s); if (s) for (t = s; *t; t++) if (soap_coblank((soap_wchar)*t)) *t = L' '; } return s; } /* collapse white space */ for (t = s; *t && soap_coblank((soap_wchar)*t); t++) continue; n = 0; while (t[n]) n++; if (insitu && s < t) (void)soap_memmove(s, n + 1, t, n + 1); else s = t; if (n > 0) { if (!soap_coblank((soap_wchar)s[n-1])) { for (t = s; (*t && !soap_coblank((soap_wchar)*t)) || (*t == 32 && (!t[1] || !soap_coblank((soap_wchar)t[1]))); t++) continue; if (!*t) return s; } if (!insitu) s = soap_wstrdup(soap, s); if (s) { for (t = s; *t; t++) { if (soap_coblank((soap_wchar)*t)) { wchar_t *r; *t = L' '; for (r = t + 1; *r && soap_coblank((soap_wchar)*r); r++) continue; if (r > t + 1) (void)soap_memmove(t + 1, sizeof(wchar_t) * (n - (t-s)), r, sizeof(wchar_t) * (n - (r-s) + 1)); } } t--; if (t >= s && *t == 32) *t = L'\0'; } } return s; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_wchar2s(struct soap *soap, const wchar_t *s) { soap_wchar c; char *r, *t; const wchar_t *q = s; size_t n = 0; if (!s) return NULL; while ((c = *q++)) { if (c > 0 && c < 0x80) n++; else #ifdef WITH_REPLACE_ILLEGAL_UTF8 n += 4; #else n += 6; #endif } r = t = (char*)soap_malloc(soap, n + 1); if (r) { /* Convert wchar to UTF8 (chars above U+10FFFF are silently converted, but should not be used) */ while ((c = *s++)) { if (c > 0 && c < 0x80) { *t++ = (char)c; } else { /* check for UTF16 encoding when wchar_t is too small to hold UCS */ if (sizeof(wchar_t) < 4 && (c & 0xFC00) == 0xD800) { soap_wchar d = *s; if ((d & 0xFC00) == 0xDC00) { c = ((c - 0xD800) << 10) + (d - 0xDC00) + 0x10000; s++; } #ifdef WITH_REPLACE_ILLEGAL_UTF8 else { c = SOAP_UNKNOWN_UNICODE_CHAR; /* Malformed UTF-16 */ } #endif } if (c < 0x0800) { *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); } else { #ifdef WITH_REPLACE_ILLEGAL_UTF8 if (!((c >= 0x80 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD) || (c >= 0x10000 && c <= 0x10FFFF))) c = SOAP_UNKNOWN_UNICODE_CHAR; #endif 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 /******************************************************************************/ 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, NULL); 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; } /******************************************************************************/ 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, const char *pattern) { (void)type; 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) { p = (char**)soap_malloc(soap, sizeof(char*)); if (!p) return NULL; } if (soap->null) { *p = NULL; } else if (soap->body) { *p = soap_string_in(soap, flag, minlen, maxlen, pattern); if (!*p || !(char*)soap_id_enter(soap, soap->id, *p, t, sizeof(char*), NULL, 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->href != '#') { if (minlen > 0) { soap->error = SOAP_LENGTH; return NULL; } *p = soap_strdup(soap, SOAP_STR_EOS); if (!*p) return NULL; } if (*soap->href == '#') p = (char**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(char**), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } /******************************************************************************/ #ifndef WITH_LEANER 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, NULL); 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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 wchar_t ** SOAP_FMAC2 soap_inwstring(struct soap *soap, const char *tag, wchar_t **p, const char *type, int t, int flag, long minlen, long maxlen, const char *pattern) { (void)type; 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) { p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*)); if (!p) return NULL; } if (soap->null) { *p = NULL; } else if (soap->body) { *p = soap_wstring_in(soap, flag, minlen, maxlen, pattern); if (!*p || !(wchar_t*)soap_id_enter(soap, soap->id, *p, t, sizeof(wchar_t*), NULL, 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->href != '#') { if (minlen > 0) { soap->error = SOAP_LENGTH; return NULL; } *p = soap_wstrdup(soap, L""); } if (*soap->href == '#') p = (wchar_t**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(wchar_t**), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef WITH_LEAN #ifdef UNDER_CE /* WinCE mktime (based on the mingw-runtime, public domain) */ #define __FILETIME_to_ll(f) ((long long)(f).dwHighDateTime << 32 | (long long)(f).dwLowDateTime) static time_t mktime(struct tm *pt) { SYSTEMTIME s, s1, s2; FILETIME f, f1, f2; long long diff; GetSystemTime(&s1); GetLocalTime(&s2); SystemTimeToFileTime(&s1, &f1); SystemTimeToFileTime(&s2, &f2); diff = (__FILETIME_to_ll(f2) - __FILETIME_to_ll(f1)) / 10000000LL; s.wYear = pt->tm_year + 1900; s.wMonth = pt->tm_mon + 1; s.wDayOfWeek = pt->tm_wday; s.wDay = pt->tm_mday; s.wHour = pt->tm_hour; s.wMinute = pt->tm_min; s.wSecond = pt->tm_sec; s.wMilliseconds = 0; SystemTimeToFileTime(&s, &f); return (time_t)((__FILETIME_to_ll(f) - 116444736000000000LL) / 10000000LL) - (time_t)diff; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN #ifdef UNDER_CE /* WinCE gmtime_r (based on the mingw-runtime, public domain) */ #define HAVE_GMTIME_R static struct tm* gmtime_r(const time_t *t, struct tm *pt) { FILETIME f, f1, f2; SYSTEMTIME s, s1 = {0}; long long time = (long long)(*t) * 10000000LL + 116444736000000000LL; f.dwHighDateTime = (DWORD)((time >> 32) & 0x00000000FFFFFFFF); f.dwLowDateTime = (DWORD)(time & 0x00000000FFFFFFFF); FileTimeToSystemTime(&f, &s); pt->tm_year = s.wYear - 1900; pt->tm_mon = s.wMonth - 1; pt->tm_wday = s.wDayOfWeek; pt->tm_mday = s.wDay; s1.wYear = s.wYear; s1.wMonth = 1; s1.wDayOfWeek = 1; s1.wDay = 1; SystemTimeToFileTime(&s1, &f1); SystemTimeToFileTime(&s, &f2); pt->tm_yday = (((__FILETIME_to_ll(f2) - __FILETIME_to_ll(f1)) / 10000000LL) / (60 * 60 * 24)); pt->tm_hour = s.wHour; pt->tm_min = s.wMinute; pt->tm_sec = s.wSecond; pt->tm_isdst = 0; return pt; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN #ifdef UNDER_CE /* WinCE very simple strftime for format "%Y-%m-%dT%H:%M:%SZ", note: %F and %T not supported by MS */ static size_t strftime(char *buf, size_t len, const char *format, const struct tm *pT) { (void)len; (void)format; #ifndef WITH_NOZONE (SOAP_SNPRINTF(buf, len, 20), "%04d-%02d-%02dT%02d:%02d:%02dZ", pT->tm_year + 1900, pT->tm_mon + 1, pT->tm_mday, pT->tm_hour, pT->tm_min, pT->tm_sec); #else (SOAP_SNPRINTF(buf, len, 20), "%04d-%02d-%02dT%02d:%02d:%02d", pT->tm_year + 1900, pT->tm_mon + 1, pT->tm_mday, pT->tm_hour, pT->tm_min, pT->tm_sec); #endif return len; } #endif #endif /******************************************************************************/ #if !defined(WITH_LEAN) || defined(WITH_COOKIES) 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; #ifndef HAVE_GMTIME_R struct tm *tp; #endif t = mktime(T); if (t == (time_t)-1) return (time_t)-1; #ifdef HAVE_GMTIME_R if (gmtime_r(&t, &tm) == SOAP_FUNC_R_ERR) return (time_t)-1; #else tp = gmtime(&t); if (!tp) return (time_t)-1; tm = *tp; #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; size_t l = 0; #if defined(HAVE_GMTIME_R) && !defined(WITH_NOZONE) if (gmtime_r(&n, pT) != SOAP_FUNC_R_ERR) l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT); #elif defined(HAVE_GMTIME) && !defined(WITH_NOZONE) pT = gmtime(&n); if (pT) l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT); #elif (defined(HAVE_TM_GMTOFF) || defined(HAVE_STRUCT_TM_TM_GMTOFF) || defined(HAVE_STRUCT_TM___TM_GMTOFF)) && !defined(WITH_NOZONE) #if defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) { l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S%z", pT); if (l) { (void)soap_memmove(soap->tmpbuf + 23, sizeof(soap->tmpbuf) - 23, soap->tmpbuf + 22, 3); /* 2000-03-01T02:00:00+0300 */ soap->tmpbuf[22] = ':'; /* 2000-03-01T02:00:00+03:00 */ } } #else pT = localtime(&n); if (pT) { l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S%z", pT); if (l) { (void)soap_memmove(soap->tmpbuf + 23, sizeof(soap->tmpbuf) - 23, soap->tmpbuf + 22, 3); /* 2000-03-01T02:00:00+0300 */ soap->tmpbuf[22] = ':'; /* 2000-03-01T02:00:00+03:00 */ } } #endif #elif defined(HAVE_GETTIMEOFDAY) && !defined(WITH_NOZONE) #if defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) { struct timeval tv; struct timezone tz; memset((void*)&tz, 0, sizeof(tz)); gettimeofday(&tv, &tz); l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); if (l) (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -tz.tz_minuteswest/60+(pT->tm_isdst!=0), abs(tz.tz_minuteswest)%60); } #else pT = localtime(&n); if (pT) { struct timeval tv; struct timezone tz; memset((void*)&tz, 0, sizeof(tz)); gettimeofday(&tv, &tz); l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); if (l) (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -tz.tz_minuteswest/60+(pT->tm_isdst!=0), abs(tz.tz_minuteswest)%60); } #endif #elif defined(HAVE_FTIME) && !defined(WITH_NOZONE) #if defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) { struct timeb t; memset((void*)&t, 0, sizeof(t)); #ifdef __BORLANDC__ ::ftime(&t); #else ftime(&t); #endif l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); if (l) (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60); } #else pT = localtime(&n); if (pT) { struct timeb t; memset((void*)&t, 0, sizeof(t)); #ifdef __BORLANDC__ ::ftime(&t); #else ftime(&t); #endif l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); if (l) (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60); } #endif #elif defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); #else pT = localtime(&n); if (pT) l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); #endif if (!l) soap_strcpy(soap->tmpbuf, sizeof(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) { *p = 0; if (s) { char *t; unsigned long d; struct tm T; if (!*s) return soap->error = SOAP_EMPTY; memset((void*)&T, 0, sizeof(T)); d = soap_strtoul(s, &t, 10); if (*t == '-') { /* YYYY-MM-DD */ T.tm_year = (int)d; T.tm_mon = (int)soap_strtoul(t + 1, &t, 10); T.tm_mday = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* YYYYMMDD */ T.tm_year = (int)(d / 10000); T.tm_mon = (int)(d / 100 % 100); T.tm_mday = (int)(d % 100); } else { return soap->error = SOAP_TYPE; } if (*t == 'T' || ((*t == 't' || *t == ' ') && !(soap->mode & SOAP_XML_STRICT))) { d = soap_strtoul(t + 1, &t, 10); if (*t == ':') { /* Thh:mm:ss */ T.tm_hour = (int)d; T.tm_min = (int)soap_strtoul(t + 1, &t, 10); T.tm_sec = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* Thhmmss */ T.tm_hour = (int)(d / 10000); T.tm_min = (int)(d / 100 % 100); T.tm_sec = (int)(d % 100); } else { return soap->error = SOAP_TYPE; } } if (T.tm_year == 1) T.tm_year = 70; else T.tm_year -= 1900; T.tm_mon--; if (*t == '.') { for (t++; *t; t++) if (*t < '0' || *t > '9') break; } if (*t == ' ' && !(soap->mode & SOAP_XML_STRICT)) t++; if (*t) { #ifndef WITH_NOZONE if (*t == '+' || *t == '-') { int h, m; m = (int)soap_strtol(t, &t, 10); if (*t == ':') { /* +hh:mm */ h = m; m = (int)soap_strtol(t + 1, &t, 10); if (h < 0) m = -m; } else if (!(soap->mode & SOAP_XML_STRICT)) { /* +hhmm */ h = m / 100; m = m % 100; } else { /* +hh */ h = m; m = 0; } if (*t) return soap->error = SOAP_TYPE; 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_hour--; } T.tm_mday += T.tm_hour / 24; T.tm_hour %= 24; if (T.tm_hour < 0) { T.tm_hour += 24; T.tm_mday--; } /* note: day of the month may be out of range, timegm() handles it */ } else if (*t != 'Z') { return soap->error = SOAP_TYPE; } #endif *p = soap_timegm(&T); } else /* no UTC or timezone, so assume we got a localtime */ { T.tm_isdst = -1; *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), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2dateTime(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (time_t*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(time_t), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_outliteral(struct soap *soap, const char *tag, char *const*p, const char *type) { if (tag && *tag != '-') if (soap_element_begin_out(soap, tag, 0, type)) return soap->error; if (p && *p) if (soap_send(soap, *p)) /* send as-is */ return soap->error; if (tag && *tag != '-') return soap_element_end_out(soap, tag); return SOAP_OK; } /******************************************************************************/ 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_peek(soap) == SOAP_TT) return NULL; soap->error = SOAP_OK; } if (!p) { p = (char**)soap_malloc(soap, sizeof(char*)); if (!p) return NULL; } if (soap->body || (tag && *tag == '-')) { if (tag && *tag != '-') *p = soap_string_in(soap, -1, -1, -1, NULL); else *p = soap_string_in(soap, 0, -1, -1, NULL); 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; } /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_outwliteral(struct soap *soap, const char *tag, wchar_t *const*p, const char *type) { if (tag && *tag != '-') if (soap_element_begin_out(soap, tag, 0, type)) return soap->error; if (p) { wchar_t c; const wchar_t *s = *p; while ((c = *s++)) { if (soap_pututf8(soap, (unsigned long)c)) /* send as-is in UTF8 */ return soap->error; } } if (tag && *tag != '-') return soap_element_end_out(soap, tag); return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER 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_peek(soap) == SOAP_TT) return NULL; soap->error = SOAP_OK; } if (!p) { p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*)); if (!p) return NULL; } if (soap->body) { if (tag && *tag != '-') *p = soap_wstring_in(soap, -1, -1, -1, NULL); else *p = soap_wstring_in(soap, 0, -1, -1, NULL); 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, L""); } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ SOAP_FMAC1 const char * SOAP_FMAC2 soap_value(struct soap *soap) { size_t i; soap_wchar c = 0; char *s = soap->tmpbuf; if (!soap->body) return SOAP_STR_EOS; do { c = soap_get(soap); } while (soap_coblank(c)); for (i = 0; i < sizeof(soap->tmpbuf) - 1; i++) { if (c == SOAP_TT || c == SOAP_LT || (int)c == EOF) break; *s++ = (char)c; c = soap_get(soap); } for (s--; i > 0; i--, s--) { if (!soap_coblank((soap_wchar)*s)) break; } s[1] = '\0'; soap->tmpbuf[sizeof(soap->tmpbuf) - 1] = '\0'; /* appease */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element content value='%s'\n", soap->tmpbuf)); if (c == SOAP_TT || c == SOAP_LT || (int)c == EOF) { soap_unget(soap, c); } else { soap->error = SOAP_LENGTH; return NULL; } #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_strdup(soap, soap->tmpbuf); if (!soap->dom->text) return NULL; } #endif return soap->tmpbuf; /* return non-null pointer */ } /******************************************************************************/ #if !defined(WITH_LEANER) || !defined(WITH_NOHTTP) SOAP_FMAC1 int SOAP_FMAC2 soap_getline(struct soap *soap, char *buf, int len) { char *s = buf; int i = len; soap_wchar c = 0; for (;;) { while (i > 1) { c = soap_getchar(soap); if (c == '\r' || c == '\n') break; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; *s++ = (char)c; i--; } *s = '\0'; if (c != '\n') c = soap_getchar(soap); /* got \r or something else, now get \n */ if (c == '\n') { if (i == 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_CHK_EOF; } else if (i <= 1) { return soap->error = SOAP_HDR; } } return SOAP_OK; } #endif /******************************************************************************/ static ULONG64 soap_count_attachments(struct soap *soap) { #ifndef WITH_LEANER struct soap_multipart *content; ULONG64 count = soap->count; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the message size with attachments, current count=" SOAP_ULONG_FORMAT "\n", 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) { 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) { 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=" SOAP_ULONG_FORMAT "\n", count)); return count; #else return soap->count; #endif } /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER 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); soap_strcpy(s + 4, n + 1, option); } } return s; } #endif /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER 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)) != NULL || 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_PLAIN) || (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); bufsize = soap->fdimeread(soap, handle, soap->tmpbuf, bufsize); if (!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_CHK_EOF; break; } if (soap_send_raw(soap, soap->tmpbuf, bufsize)) break; size -= bufsize; } while (size); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadclose\n")); if (soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime.size&3)) return soap->error; } 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 /******************************************************************************/ #ifndef WITH_LEANER static char * soap_getdimefield(struct soap *soap, size_t n) { char *p = NULL; if (n > 0) { p = (char*)soap_malloc(soap, n + 1 > n ? n + 1 : n); if (p) { char *s = p; size_t i; for (i = n; i > 0; i--) { soap_wchar c = soap_get1(soap); if ((int)c == EOF) { soap->error = SOAP_CHK_EOF; return NULL; } *s++ = (char)c; } if (n + 1 > n) *s = '\0'; /* force NUL terminated */ soap->error = soap_move(soap, (size_t)(-(long)n&3)); if (soap->error) return NULL; } else { soap->error = SOAP_EOM; } } return p; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_getdimehdr(struct soap *soap) { soap_wchar c; char *s; 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")); s = (char*)tmp; for (i = 12; i > 0; i--) { c = soap_getchar(soap); if ((int)c == EOF) return soap->error = SOAP_CHK_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 = ((size_t)tmp[8] << 24) | ((size_t)tmp[9] << 16) | ((size_t)tmp[10] << 8) | ((size_t)tmp[11]); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME size=%lu flags=0x%X\n", (unsigned long)soap->dime.size, soap->dime.flags)); soap->dime.options = soap_getdimefield(soap, optlen); if (!soap->dime.options && soap->error) return soap->error; soap->dime.id = soap_getdimefield(soap, idlen); if (!soap->dime.id && soap->error) return soap->error; soap->dime.type = soap_getdimefield(soap, typelen); if (!soap->dime.type && soap->error) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME flags=%x id='%s', type='%s', options='%s'\n", soap->dime.flags, 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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_getdime(struct soap *soap) { if (soap->dime.buflen || soap->dime.chunksize) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Skip remainder of SOAP in DIME (%u bytes or %u bytes in chunk left)\n", (unsigned int)soap->dime.buflen, (unsigned int)soap->dime.chunksize)); do if (soap_get1(soap) == (int)EOF) return soap->error = SOAP_CHK_EOF; while (soap->dime.buflen || soap->dime.chunksize); if (soap_move(soap, (size_t)(-(long)soap->dime.size&3))) return soap->error = SOAP_CHK_EOF; if (!(soap->mode & SOAP_ENC_DIME)) return SOAP_OK; } else { if (soap_move(soap, (size_t)(((soap->dime.size+3)&(~3)) - soap_tell(soap)))) return soap->error = SOAP_CHK_EOF; } for (;;) { 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)) != NULL || 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; soap->error = soap->fdimewrite(soap, (void*)soap->dime.ptr, soap->buf + soap->bufidx, n); if (soap->error) break; size -= n; if (!size) { soap->bufidx += n; break; } if (soap_recv(soap)) { soap->error = SOAP_EOF; goto end; } } if (soap_move(soap, (size_t)(-(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_alloc_block(soap) == NULL) return soap->error = SOAP_EOM; for (;;) { soap_wchar c; size_t i; char *s; if (soap->dime.size > SOAP_MAXDIMESIZE) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME size=%lu exceeds SOAP_MAXDIMESIZE=%lu\n", (unsigned long)soap->dime.size, (unsigned long)SOAP_MAXDIMESIZE)); return soap->error = SOAP_DIME_ERROR; } 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--) { c = soap_get1(soap); if ((int)c == EOF) return soap->error = SOAP_EOF; *s++ = (char)c; } if (soap_move(soap, (size_t)(-(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; if (soap->dime.size + 1 > soap->dime.size) soap->blist->size++; /* allocate one more byte in blist for the terminating '\0' */ soap->dime.ptr = soap_save_block(soap, NULL, NULL, 0); if (!soap->dime.ptr) return soap->error; if (soap->dime.size + 1 > soap->dime.size) soap->dime.ptr[soap->dime.size] = '\0'; /* make 0-terminated, just in case even though this is binary data */ soap->dime.id = id; soap->dime.type = type; soap->dime.options = options; } else { soap->dime.ptr = soap_getdimefield(soap, soap->dime.size); } content = soap_alloc_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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_getmimehdr(struct soap *soap) { struct soap_multipart *content; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get MIME header\n")); 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_coblank((soap_wchar)*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->mime.boundary) return soap->error = SOAP_EOM; } 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 (;;) { char *key = soap->msgbuf; 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 (!content->id && !soap_tag_cmp(key, "Content-Disposition")) content->id = soap_strdup(soap, soap_http_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, (LONG64)SOAP_MIME_NONE); } if (soap_getline(soap, key, sizeof(soap->msgbuf))) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_getmime(struct soap *soap) { while (soap_recv_mime_attachment(soap, NULL)) continue; return soap->error; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 void SOAP_FMAC2 soap_post_check_mime_attachments(struct soap *soap) { soap->imode |= SOAP_MIME_POSTCHECK; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_check_mime_attachments(struct soap *soap) { if ((soap->mode & SOAP_MIME_POSTCHECK)) return soap_recv_mime_attachment(soap, NULL) != NULL; return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 struct soap_multipart * SOAP_FMAC2 soap_recv_mime_attachment(struct soap *soap, void *handle) { soap_wchar c = 0; size_t i, m = 0; char *s, *t = NULL; struct soap_multipart *content; short flag = 0; if (!(soap->mode & SOAP_ENC_MIME)) return NULL; content = soap->mime.last; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get MIME (%p)\n", (void*)content)); 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)) != NULL || 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_alloc_block(soap) == NULL) { soap->error = SOAP_EOM; return NULL; } for (;;) { if (content->ptr) { s = soap->tmpbuf; } else { s = (char*)soap_push_block(soap, NULL, sizeof(soap->tmpbuf)); if (!s) { 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_getchar(soap); if ((int)c == EOF) { if (content->ptr && soap->fmimewriteclose) soap->fmimewriteclose(soap, (void*)content->ptr); soap->error = SOAP_CHK_EOF; return NULL; } } if (flag || c == '\r') { memset((void*)soap->msgbuf, 0, sizeof(soap->msgbuf)); soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), "\n--"); if (soap->mime.boundary) { if (soap_strncat(soap->msgbuf, sizeof(soap->msgbuf), soap->mime.boundary, sizeof(soap->msgbuf) - 4)) { soap->error = SOAP_MIME_ERROR; return NULL; } } t = soap->msgbuf; do { c = soap_getchar(soap); } while (c == *t++); if ((int)c == EOF) { if (content->ptr && soap->fmimewriteclose) soap->fmimewriteclose(soap, (void*)content->ptr); soap->error = SOAP_CHK_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) { soap->error = soap->fmimewrite(soap, (void*)content->ptr, soap->tmpbuf, i); if (soap->error) break; } } end: 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 { *s = '\0'; /* make 0-terminated, just in case even though this is binary data */ content->size = soap_size_block(soap, NULL, i + 1) - 1; /* last block with '\0' */ 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)) { if (soap->keep_alive == -2) /* special case to keep alive */ soap->keep_alive = 0; soap_closesock(soap); return NULL; } } else { while (c != '\r' && (int)c != EOF && soap_coblank(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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_match_cid(struct soap *soap, const char *s, const char *t) { 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; (void)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 /******************************************************************************/ /* return UUID "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx" in a temporary buffer */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_rand_uuid(struct soap *soap, const char *prefix) { int r1, r2, r3, r4; #ifdef WITH_OPENSSL r1 = soap_random; r2 = soap_random; #else size_t i; static int k = 0xFACEB00C; int lo = k % 127773; int hi = k / 127773; # if defined(HAVE_GETTIMEOFDAY) struct timeval tv; gettimeofday(&tv, NULL); r1 = 10000000 * tv.tv_sec + tv.tv_usec; # elif defined(UNDER_CE) r1 = (int)Random(); # elif !defined(WITH_LEAN) r1 = (int)time(NULL); # else r1 = k; # endif k = 16807 * lo - 2836 * hi; if (k <= 0) k += 0x7FFFFFFF; r2 = k; /* k &= 0x8FFFFFFF; */ for (i = 0; i < (sizeof(soap->buf) < 16UL ? sizeof(soap->buf) : 16UL); i++) r2 += soap->buf[i]; #endif r3 = soap_random; r4 = soap_random; (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), prefix ? strlen(prefix) + 37 : 37), "%s%8.8x-%4.4hx-4%3.3hx-%4.4hx-%4.4hx%8.8x", prefix ? prefix : SOAP_STR_EOS, r1, (short)(r2 >> 16), (short)(((short)r2 >> 4) & 0x0FFF), (short)(((short)(r3 >> 16) & 0x3FFF) | 0x8000), (short)r3, r4); return soap->tmpbuf; } /******************************************************************************/ #ifndef WITH_LEANER static void soap_resolve_attachment(struct soap *soap, struct soap_multipart *content) { if (content->id) { struct soap_xlist **xp = &soap->xlist; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving attachment data for id='%s'\n", content->id)); while (*xp) { struct soap_xlist *xq = *xp; if (!soap_match_cid(soap, xq->id, content->id)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Found matching attachment id='%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 /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER 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)) != NULL || 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_PLAIN) || (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); bufsize = soap->fmimeread(soap, handle, soap->tmpbuf, bufsize); if (!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 /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER static int soap_begin_attachments(struct soap *soap) { if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary && soap->mime.start) { const char *s; if (strlen(soap->mime.boundary) + strlen(soap->mime.start) + 140 > sizeof(soap->tmpbuf)) return soap->error = SOAP_EOM; 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; charset=utf-8; type=\"text/xml\""; } else { s = "text/xml; charset=utf-8"; } (SOAP_SNPRINTF_SAFE(soap->tmpbuf, sizeof(soap->tmpbuf)), "--%s\r\nContent-Type: %s\r\nContent-Transfer-Encoding: binary\r\nContent-ID: %s\r\n\r\n", soap->mime.boundary, s, soap->mime.start); if (soap_send(soap, soap->tmpbuf)) return soap->error; } if ((soap->mode & SOAP_IO_LENGTH)) soap->dime.size = (size_t)soap->count; /* DIME in MIME correction, soap->count is small */ if (!(soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME)) { if (soap_putdimehdr(soap)) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER static int soap_end_attachments(struct soap *soap) { if ((soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) { if (soap->count > 0xFFFFFFFF) return soap->error = SOAP_DIME_ERROR; soap->dime.size = (size_t)soap->count - soap->dime.size; /* DIME in MIME correction */ (SOAP_SNPRINTF(soap->id, sizeof(soap->id), strlen(soap->dime_id_format) + 20), soap->dime_id_format, 0); soap->dime.id = soap->id; if (soap->local_namespaces && soap->local_namespaces[0].id) { 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); return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER static struct soap_multipart* soap_alloc_multipart(struct soap *soap, struct soap_multipart **first, struct soap_multipart **last, const char *ptr, size_t size) { struct soap_multipart *content; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New DIME/MIME attachment %p (%lu)\n", (void*)ptr, (unsigned long)size)); 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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_set_dime_attachment(struct soap *soap, const char *ptr, size_t size, const char *type, const char *id, unsigned short optype, const char *option) { struct soap_multipart *content = soap_alloc_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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_set_mime_attachment(struct soap *soap, const 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_alloc_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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_next_multipart(struct soap_multipart *content) { if (content) return content->next; return NULL; } #endif /******************************************************************************/ #ifndef WITH_LEANER static void soap_select_mime_boundary(struct soap *soap) { while (!soap->mime.boundary || soap_valid_mime_boundary(soap)) { char *s = soap->mime.boundary; 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; } *s++ = '='; *s++ = '='; n -= 4; while (n) { *s++ = soap_base64o[soap_random & 0x3F]; n--; } *s++ = '='; *s++ = '='; *s = '\0'; } if (!soap->mime.start) soap->mime.start = ""; } #endif /******************************************************************************/ #ifndef WITH_LEANER static int soap_valid_mime_boundary(struct soap *soap) { struct soap_multipart *content; 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) { const char *p = (const char*)content->ptr; 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 /******************************************************************************/ #ifdef WITH_GZIP 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++) { c = soap_get1(soap); if (i == 1 && c == 8) soap->z_dict = 0; if (i == 2) f = c; } if (f & 0x04) /* FEXTRA */ { i = soap_get1(soap); i |= soap_get1(soap) << 8; while (i-- > 0) { if ((int)soap_get1(soap) == EOF) return soap->error = SOAP_ZLIB_ERROR; } } if (f & 0x08) /* skip FNAME */ { do { c = soap_get1(soap); } while (c && (int)c != EOF); } if ((int)c != EOF && (f & 0x10)) /* skip FCOMMENT */ { do { c = soap_get1(soap); } while (c && (int)c != EOF); } if ((int)c != EOF && (f & 0x02)) /* skip FHCRC (CRC32 is used) */ { c = soap_get1(soap); if ((int)c != EOF) c = soap_get1(soap); } if ((int)c == EOF) return soap->error = SOAP_ZLIB_ERROR; return SOAP_OK; } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_begin_serve(struct soap *soap) { #ifdef WITH_FASTCGI if (FCGI_Accept() < 0) { soap->error = SOAP_EOF; return soap_send_fault(soap); } #endif soap_begin(soap); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) { if (soap->error < SOAP_STOP) { #ifdef WITH_FASTCGI (void)soap_send_fault(soap); #else return soap_send_fault(soap); #endif } return soap_closesock(soap); } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_begin_recv(struct soap *soap) { soap_wchar c; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing for input from socket=%d/fd=%d\n", (int)soap->socket, soap->recvfd)); soap->error = SOAP_OK; #ifndef WITH_LEANER soap->recverror = SOAP_OK; #endif 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->imode &= ~SOAP_IO; soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_CHUNK; } soap->imode &= ~(SOAP_ENC_DIME | SOAP_ENC_MIME | SOAP_ENC_MTOM | SOAP_ENC_ZLIB); soap->mode = soap->imode; if (!(soap->mode & SOAP_IO_KEEPALIVE)) soap->keep_alive = 0; if (!soap->keep_alive) soap->buflen = soap->bufidx = 0; soap->null = 0; soap->position = 0; soap->mustUnderstand = 0; soap->shaky = 0; soap->ahead = 0; soap->peeked = 0; soap->level = 0; soap->part = SOAP_BEGIN_RECV; soap->count = 0; soap->length = 0; soap->cdata = 0; *soap->endpoint = '\0'; soap->action = NULL; soap->header = NULL; soap->fault = NULL; soap->status = 0; soap->fform = NULL; soap->body = 1; #ifndef WITH_LEANER soap->dom = NULL; soap->dime.count = 0; 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) && !soap->is && soap->recvfd >= 0) /* Set win32 stdin or soap->recvfd to BINARY, e.g. to support DIME */ #ifdef __BORLANDC__ setmode(soap->recvfd, _O_BINARY); #else _setmode(soap->recvfd, _O_BINARY); #endif #endif #endif #endif #ifdef WITH_ZLIB soap->zlib_in = SOAP_ZLIB_NONE; soap->zlib_out = SOAP_ZLIB_NONE; if (!soap->d_stream) { soap->d_stream = (z_stream*)SOAP_MALLOC(soap, sizeof(z_stream)); if (!soap->d_stream) return soap->error = SOAP_EOM; soap->d_stream->zalloc = Z_NULL; soap->d_stream->zfree = Z_NULL; soap->d_stream->opaque = Z_NULL; soap->d_stream->next_in = Z_NULL; soap->d_stream->msg = Z_NULL; } soap->d_stream->avail_in = 0; soap->d_stream->next_out = (Byte*)soap->buf; soap->d_stream->avail_out = sizeof(soap->buf); soap->z_ratio_in = 1.0; #endif #ifdef WITH_OPENSSL if (soap->ssl) ERR_clear_error(); #endif #ifndef WITH_LEAN soap->start = (ULONG64)time(NULL); #endif #ifndef WITH_LEANER if (soap->fprepareinitrecv && (soap->error = soap->fprepareinitrecv(soap)) != SOAP_OK) return soap->error; #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; if (soap->z_dict) { if (inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != 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, sizeof(soap->buf)); (void)soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)soap->buf, sizeof(soap->buf)); /* 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 = (unsigned int)(soap->buflen - soap->bufidx); soap->z_buflen = soap->buflen; soap->buflen = soap->bufidx; c = ' '; } #endif while (soap_coblank(c)) c = soap_getchar(soap); #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 { /* skip BOM */ if (c == 0xEF && soap_get0(soap) == 0xBB) { soap_get1(soap); c = soap_get1(soap); if (c == 0xBF) { soap->mode &= ~SOAP_ENC_LATIN; c = soap_getchar(soap); } else { c = (0x0F << 12) | (0xBB << 6) | (c & 0x3F); /* UTF-8 */ } } else if ((c == 0xFE && soap_get0(soap) == 0xFF) /* UTF-16 BE */ || (c == 0xFF && soap_get0(soap) == 0xFE)) /* UTF-16 LE */ { return soap->error = SOAP_UTF_ERROR; } /* skip space */ while (soap_coblank(c)) c = soap_getchar(soap); } if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; soap_unget(soap, c); #ifndef WITH_NOHTTP /* if not XML/MIME/DIME/ZLIB, assume HTTP method or status line */ if (((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) && !(soap->mode & (SOAP_ENC_MIME | SOAP_ENC_DIME | SOAP_ENC_ZLIB | SOAP_ENC_PLAIN))) { soap_mode m = soap->imode; soap->error = soap->fparse(soap); soap->mode = soap->imode; /* if imode is changed, effectuate */ soap->imode = m; /* restore imode */ if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { soap->chunkbuflen = soap->buflen; soap->buflen = soap->bufidx; soap->chunksize = 0; } #ifdef WITH_ZLIB soap->mode &= ~SOAP_ENC_ZLIB; if (soap->zlib_in != SOAP_ZLIB_NONE) { #ifdef WITH_GZIP if (soap->zlib_in != SOAP_ZLIB_DEFLATE) { c = soap_get1(soap); if (c == (int)EOF) return soap->error = SOAP_EOF; 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; if (soap->z_dict) { if (inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != 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, sizeof(soap->buf)); (void)soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)soap->buf, sizeof(soap->buf)); soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx); soap->d_stream->avail_in = (unsigned int)(soap->buflen - soap->bufidx); soap->z_buflen = soap->buflen; soap->buflen = soap->bufidx; } #endif #ifndef WITH_LEANER if (soap->fpreparerecv && (soap->mode & SOAP_IO) != SOAP_IO_CHUNK && soap->buflen > soap->bufidx) { int r; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Invoking fpreparerecv\n")); r = soap->fpreparerecv(soap, soap->buf + soap->bufidx, soap->buflen - soap->bufidx); if (r) return soap->error = r; } #endif if (soap->error && soap->error < SOAP_STOP) { if (soap->status >= 200 && soap->status < 600) { const char *s = soap_http_get_body(soap, NULL); (void)soap_end_recv(soap); if (soap->status >= 300) soap->keep_alive = 0; /* to force close */ return soap_set_receiver_error(soap, "HTTP Error", s, soap->status); } return soap->error; } if (!soap->body && soap->status >= 200 && soap->status < 600) return soap->error = soap->status; /* client side received HTTP status code */ if (soap->status > SOAP_POST) { soap->fform = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Invoking http method handler\n")); switch (soap->status) { case SOAP_GET: if (soap_http_skip_body(soap) || soap_end_recv(soap)) return soap->error; soap->error = soap->fget(soap); break; case SOAP_PUT: soap->error = soap->fput(soap); break; case SOAP_PATCH: soap->error = soap->fpatch(soap); break; case SOAP_DEL: if (soap_http_skip_body(soap) || soap_end_recv(soap)) return soap->error; soap->error = soap->fdel(soap); break; case SOAP_HEAD: if (soap_http_skip_body(soap) || soap_end_recv(soap)) return soap->error; soap->error = soap->fhead(soap); break; case SOAP_OPTIONS: if (soap_http_skip_body(soap) || soap_end_recv(soap)) return soap->error; soap->error = soap->fopt(soap); break; default: if (soap_http_skip_body(soap) || soap_end_recv(soap)) return soap->error; return 405; } if (soap->error == SOAP_OK) return soap->error = SOAP_STOP; /* prevents further processing */ if (soap->error != SOAP_FORM || !soap->fform) /* continue if handler returned SOAP_FORM */ return soap->error; soap->error = SOAP_OK; } if (soap->fform) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Invoking http form handler\n")); soap->error = soap->fform(soap); if (soap->error == SOAP_OK) return soap->error = SOAP_STOP; /* prevents further processing */ if (soap->status != SOAP_POST || soap->error != 404) /* continue with POST if handler returned HTTP not found */ return soap->error; soap->error = SOAP_OK; } if (!soap->body) return soap->error = SOAP_NO_DATA; } #endif #ifndef WITH_LEANER if ((soap->mode & SOAP_ENC_MIME)) { do /* skip preamble */ { c = soap_getchar(soap); if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; } while (c != '-' || soap_get0(soap) != '-'); soap_unget(soap, c); 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_recv_mime_attachment(soap, NULL)); } if (soap_http_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 SOAP in DIME 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; if (soap->recv_maxlength && soap->count > soap->recv_maxlength) return soap->error = SOAP_EOF; } #endif return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_out(struct soap *soap) { if (soap->version == 0) return SOAP_OK; soap->part = SOAP_IN_ENVELOPE; return soap_element_begin_out(soap, "SOAP-ENV:Envelope", 0, NULL); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_out(struct soap *soap) { if (soap->version == 0) return SOAP_OK; if (soap_element_end_out(soap, "SOAP-ENV:Envelope") || soap_send_raw(soap, "\r\n", 2)) /* 2.8: always emit \r\n */ return soap->error; soap->part = SOAP_END_ENVELOPE; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_http_has_body(struct soap *soap) { return soap->length || (soap->mode & SOAP_ENC_ZLIB) || (soap->mode & SOAP_IO) == SOAP_IO_CHUNK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_http_skip_body(struct soap *soap) { ULONG64 k = soap->length; /* check HTTP body, return "" if none */ if (!k && !(soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) != SOAP_IO_CHUNK) return SOAP_OK; /* do not consume DIME or MIME attachments, leave this to soap_end_recv */ if ((soap->mode & SOAP_ENC_DIME) || (soap->mode & SOAP_ENC_MIME)) return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Skipping HTTP body (mode=0x%x)\n", soap->mode)); if (k && !(soap->mode & SOAP_ENC_ZLIB)) { size_t i; soap->length = 0; for (i = 0; i < k; i++) { soap_wchar c = soap_get1(soap); if ((int)c == EOF) break; } } else { for (;;) { soap_wchar c = soap_get1(soap); if ((int)c == EOF) break; } } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_http_get_body(struct soap *soap, size_t *len) { return soap_http_get_body_prefix(soap, len, NULL); } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_http_get_form(struct soap *soap) { return soap_http_get_body_prefix(soap, NULL, "?"); } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_http_get_body_prefix(struct soap *soap, size_t *len, const char *prefix) { char *s; ULONG64 k = soap->length; size_t n = 0; if (!prefix) prefix = SOAP_STR_EOS; else n = strlen(prefix); if (len) *len = 0; /* check HTTP body, return "" if none */ if (!k && !(soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) != SOAP_IO_CHUNK) return soap_strdup(soap, prefix); /* do not consume DIME or MIME attachments, leave this to soap_end_recv */ if ((soap->mode & SOAP_ENC_DIME) || (soap->mode & SOAP_ENC_MIME)) return soap_strdup(soap, prefix); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Parsing HTTP body, prefixed with '%s' (mode=0x%x)\n", prefix, soap->mode)); if (k && !(soap->mode & SOAP_ENC_ZLIB)) { char *t; soap->length = 0; /* http content length != 0 and uncompressed body */ if ((SOAP_MAXALLOCSIZE != 0 && n + k > SOAP_MAXALLOCSIZE) || n + k > (ULONG64)((size_t)-2)) { soap->error = SOAP_EOM; return NULL; } s = t = (char*)soap_malloc(soap, (size_t)k + n + 1); if (s) { size_t i; soap_strcpy(t, n + 1, prefix); t += n; for (i = 0; i < k; i++) { soap_wchar c = soap_get1(soap); if ((int)c == EOF) break; *t++ = (char)(c & 0xFF); } *t = '\0'; if (len) *len = n + i; } else { soap->error = SOAP_EOM; return NULL; } } else { size_t i, l = 0; if (soap_alloc_block(soap) == NULL) return NULL; if (n) { s = (char*)soap_push_block(soap, NULL, n); if (!s) return NULL; soap_strcpy(s, n + 1, prefix); l += n; } for (;;) { size_t k = SOAP_BLKLEN; s = (char*)soap_push_block(soap, NULL, k); if (!s) return NULL; for (i = 0; i < k; i++) { soap_wchar c; l++; if (l == 0) { soap->error = SOAP_EOM; return NULL; } c = soap_get1(soap); if ((int)c == EOF) goto end; *s++ = (char)(c & 0xFF); } } end: *s = '\0'; if (len) *len = l - 1; soap_size_block(soap, NULL, i + 1); s = soap_save_block(soap, NULL, NULL, 0); } return s; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_in(struct soap *soap) { soap->part = SOAP_IN_ENVELOPE; if (soap_element_begin_in(soap, "SOAP-ENV:Envelope", 0, NULL)) { if (soap->error == SOAP_TAG_MISMATCH) { if (!soap_element_begin_in(soap, "Envelope", 0, NULL)) soap->error = SOAP_VERSIONMISMATCH; else if (soap->status == 0 || (soap->status >= 200 && soap->status <= 299) || soap->status == 400 || soap->status == 500) return SOAP_OK; /* allow non-SOAP (REST) XML content to be captured */ soap->error = soap->status; } else if (soap->status) { soap->error = soap->status; } return soap->error; } soap_version(soap); return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_in(struct soap *soap) { if (soap->version == 0) return SOAP_OK; soap->part = SOAP_END_ENVELOPE; return soap_element_end_in(soap, "SOAP-ENV:Envelope"); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_out(struct soap *soap) { if (soap->version == 1) soap->encoding = 1; #ifndef WITH_LEAN if ((soap->mode & SOAP_SEC_WSUID) && soap_set_attr(soap, "wsu:Id", "Body", 1)) return soap->error; #endif if (soap->version == 0) return SOAP_OK; soap->part = SOAP_IN_BODY; return soap_element_begin_out(soap, "SOAP-ENV:Body", 0, NULL); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_out(struct soap *soap) { if (soap->version == 0) return SOAP_OK; if (soap_element_end_out(soap, "SOAP-ENV:Body")) return soap->error; soap->part = SOAP_END_BODY; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_in(struct soap *soap) { if (soap->version == 0) return SOAP_OK; 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; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_in(struct soap *soap) { if (soap->version == 0) return SOAP_OK; if (soap->part == SOAP_NO_BODY) return soap->error = SOAP_OK; soap->part = SOAP_END_BODY; return soap_element_end_in(soap, "SOAP-ENV:Body"); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_recv_header(struct soap *soap) { if (soap_getheader(soap) && soap->error == SOAP_TAG_MISMATCH) soap->error = SOAP_OK; if (soap->error == SOAP_OK && soap->fheader) soap->error = soap->fheader(soap); return soap->error; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_endpoint(struct soap *soap, const char *endpoint) { const char *s, *t; 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 soap_strcpy(soap->endpoint, sizeof(soap->endpoint), endpoint); s = strchr(endpoint, ':'); if (s && s[1] == '/' && s[2] == '/') s += 3; else s = endpoint; #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) t = strchr(s, '@'); if (t && *s != ':' && *s != '@') { size_t l = t - s + 1; char *r = (char*)soap_malloc(soap, l); n = s - endpoint; if (r) { s = soap_decode(r, l, s, ":@"); soap->userid = r; soap->passwd = SOAP_STR_EOS; if (*s == ':') { s++; if (*s != '@') { l = t - s + 1; r = r + strlen(r) + 1; s = soap_decode(r, l, s, "@"); soap->passwd = r; } } } s++; soap_strcpy(soap->endpoint + n, sizeof(soap->endpoint) - n, s); } #endif 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] == ':' || s[i] == '?') break; } } #else for (i = 0; i < n; i++) { soap->host[i] = s[i]; if (s[i] == '/' || s[i] == ':' || s[i] == '?') break; } #endif soap->host[i] = '\0'; if (s[i] == ':') { soap->port = (int)soap_strtol(s + i + 1, NULL, 10); for (i++; i < n; i++) if (s[i] == '/') break; } if (i < n && s[i]) soap_strcpy(soap->path, sizeof(soap->path), s + i); if (soap->override_host && *soap->override_host) { soap_strcpy(soap->host, sizeof(soap->host), soap->override_host); if (soap->override_port) soap->port = soap->override_port; } if (soap->userid && !soap->authrealm) soap->authrealm = soap->host; } /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_GET(struct soap *soap, const char *endpoint, const char *action) { return soap_connect_command(soap, SOAP_GET, endpoint, action); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_PUT(struct soap *soap, const char *endpoint, const char *action, const char *type) { soap->http_content = type; if ((soap->omode & SOAP_IO) != SOAP_IO_CHUNK) { soap->omode &= ~SOAP_IO; soap->omode |= SOAP_IO_STORE; } return soap_connect_command(soap, SOAP_PUT, endpoint, action); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_POST(struct soap *soap, const char *endpoint, const char *action, const char *type) { soap->http_content = type; if ((soap->omode & SOAP_IO) != SOAP_IO_CHUNK) { soap->omode &= ~SOAP_IO; soap->omode |= SOAP_IO_STORE; } return soap_connect_command(soap, SOAP_POST_FILE, endpoint, action); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_PATCH(struct soap *soap, const char *endpoint, const char *action, const char *type) { soap->http_content = type; if ((soap->omode & SOAP_IO) != SOAP_IO_CHUNK) { soap->omode &= ~SOAP_IO; soap->omode |= SOAP_IO_STORE; } return soap_connect_command(soap, SOAP_PATCH, endpoint, action); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_DELETE(struct soap *soap, const char *endpoint) { if (soap_connect_command(soap, SOAP_DEL, endpoint, NULL) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } #endif /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_connect_command(struct soap *soap, int http_command, const char *endpoints, const char *action) { if (endpoints) { int retry = soap->connect_retry; unsigned int backoff = 1; for (;;) { struct timeval tv; const char *s; s = strchr(endpoints, ' '); if (s) { size_t l = strlen(endpoints); char *endpoint = NULL; if (SOAP_MAXALLOCSIZE == 0 || l <= SOAP_MAXALLOCSIZE) endpoint = (char*)SOAP_MALLOC(soap, l + 1); if (!endpoint) return soap->error = SOAP_EOM; for (;;) { (void)soap_strncpy(endpoint, l + 1, endpoints, s - endpoints); endpoint[s - endpoints] = '\0'; if (soap_try_connect_command(soap, http_command, endpoint, action) != SOAP_TCP_ERROR) break; while (*s == ' ') s++; if (!*s) break; soap->error = SOAP_OK; 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); } if (soap->error != SOAP_TCP_ERROR || retry <= 0) break; soap->error = SOAP_OK; tv.tv_sec = backoff; tv.tv_usec = 0; select(0, NULL, NULL, NULL, &tv); if (backoff < 32) backoff *= 2; --retry; } } return soap->error; } /******************************************************************************/ 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; ULONG64 count; soap->error = SOAP_OK; (void)soap_memcpy(host, sizeof(host), soap->host, sizeof(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); soap->action = soap_strdup(soap, action); #ifndef WITH_LEANER if (soap->fconnect) { soap->error = soap->fconnect(soap, endpoint, soap->host, soap->port); if (soap->error) 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->error = SOAP_OK; #ifndef WITH_LEAN if (!strncmp(endpoint, "soap.udp:", 9) || !strncmp(endpoint, "udp:", 4)) { soap->omode |= SOAP_IO_UDP; } else #endif { 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 '%s' host='%s' path='%s' port=%d\n", endpoint?endpoint:"(null)", soap->host, soap->path, soap->port)); if (!soap->keep_alive || !soap_valid_socket(soap->socket)) { soap->socket = soap->fopen(soap, endpoint, soap->host, soap->port); if (!soap_valid_socket(soap->socket) || soap->error) { if (soap->error) return soap->error; return soap->error = SOAP_TCP_ERROR; } soap->keep_alive = -((soap->omode & SOAP_IO_KEEPALIVE) != 0); } } } #ifdef WITH_NTLM if (soap_ntlm_handshake(soap, SOAP_GET, endpoint, soap->host, soap->port)) return soap->error; #endif count = soap_count_attachments(soap); if (soap_init_send(soap)) return soap->error; #ifndef WITH_NOHTTP if (http_command == SOAP_GET || http_command == SOAP_DEL || http_command == SOAP_HEAD || http_command == SOAP_OPTIONS) { soap->mode &= ~SOAP_IO; soap->mode |= SOAP_IO_BUFFER; } if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_PLAIN) && endpoint) { soap_mode k = soap->mode; soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB); if ((k & SOAP_IO) != SOAP_IO_FLUSH) soap->mode |= SOAP_IO_BUFFER; soap->error = soap->fpost(soap, endpoint, soap->host, soap->port, soap->path, action, count); if (soap->error) return soap->error; if ((k & SOAP_IO) == SOAP_IO_CHUNK) { if (soap_flush(soap)) return soap->error; } soap->mode = k; } if (http_command == SOAP_GET || http_command == SOAP_DEL || http_command == SOAP_HEAD || http_command == SOAP_OPTIONS) return soap_end_send_flush(soap); #endif #ifndef WITH_LEANER if (soap_begin_attachments(soap)) return soap->error; #endif return SOAP_OK; } /******************************************************************************/ #ifdef WITH_NTLM static int soap_ntlm_handshake(struct soap *soap, int command, const char *endpoint, const char *host, int port) { /* requires libntlm from http://www.nongnu.org/libntlm/ */ const char *userid = (soap->proxy_userid ? soap->proxy_userid : soap->userid); const char *passwd = (soap->proxy_passwd ? soap->proxy_passwd : soap->passwd); struct SOAP_ENV__Header *oldheader; if (soap->ntlm_challenge && userid && passwd && soap->authrealm) { tSmbNtlmAuthRequest req; tSmbNtlmAuthResponse res; tSmbNtlmAuthChallenge ch; int k = soap->keep_alive; ULONG64 l = soap->length; ULONG64 c = soap->count; soap_mode m = soap->mode, o = soap->omode; int s = soap->status; char *a = soap->action; short v = soap->version; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM '%s'\n", soap->ntlm_challenge)); if (!*soap->ntlm_challenge) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM S->C Type 1: received NTLM authentication challenge from server\n")); /* S -> C 401 Unauthorized WWW-Authenticate: NTLM */ buildSmbNtlmAuthRequest(&req, userid, soap->authrealm); soap->ntlm_challenge = soap_s2base64(soap, (unsigned char*)(void*)&req, NULL, SmbLength(&req)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM C->S Type 2: sending NTLM authorization to server\nAuthorization: NTLM %s\n", soap->ntlm_challenge)); /* C -> S GET ... Authorization: NTLM TlRMTVNTUAABAAAAA7IAAAoACgApAAAACQAJACAAAABMSUdIVENJVFlVUlNBLU1JTk9S */ soap->omode = SOAP_IO_BUFFER; if (soap_init_send(soap)) return soap->error; if (!soap->keep_alive) soap->keep_alive = -1; /* client keep alive */ soap->status = command; if (soap->fpost(soap, endpoint, host, port, soap->path, soap->action, 0) || soap_end_send_flush(soap)) return soap->error; soap->mode = m; soap->keep_alive = k; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM S->C Type 2: waiting on server NTLM response\n")); oldheader = soap->header; if (soap_begin_recv(soap)) if (soap->error == SOAP_EOF) return soap->error; (void)soap_end_recv(soap); soap->header = oldheader; soap->length = l; if (soap->status != 401 && soap->status != 407) return soap->error = SOAP_NTLM_ERROR; soap->error = SOAP_OK; } /* S -> C 401 Unauthorized WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAAAAACgAAAABggAAU3J2Tm9uY2UAAAAAAAAAAA== */ soap_base642s(soap, soap->ntlm_challenge, (char*)&ch, sizeof(tSmbNtlmAuthChallenge), NULL); buildSmbNtlmAuthResponse(&ch, &res, userid, passwd); soap->ntlm_challenge = soap_s2base64(soap, (unsigned char*)(void*)&res, NULL, SmbLength(&res)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM C->S Type 3: sending NTLM authorization to server\nAuthorization: NTLM %s\n", soap->ntlm_challenge)); /* C -> S GET ... Authorization: NTLM TlRMTVNTUAADAAAAGAAYAHIAAAAYABgAigAAABQAFABAAAAADAAMAFQAAAASABIAYAAAAAAAAACiAAAAAYIAAFUAUgBTAEEALQBNAEkATgBPAFIAWgBhAHAAaABvAGQATABJAEcASABUAEMASQBUAFkArYfKbe/jRoW5xDxHeoxC1gBmfWiS5+iX4OAN4xBKG/IFPwfH3agtPEia6YnhsADT */ soap->userid = NULL; soap->passwd = NULL; soap->proxy_userid = NULL; soap->proxy_passwd = NULL; soap->keep_alive = k; soap->length = l; soap->count = c; soap->mode = m; soap->omode = o; soap->status = s; soap->action = a; soap->version = v; } return SOAP_OK; } #endif /******************************************************************************/ SOAP_FMAC1 char* SOAP_FMAC2 soap_s2base64(struct soap *soap, const unsigned char *s, char *t, int n) { int i; unsigned long m; 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) /* 0 < n <= 2 implies that t[0..4] is allocated (base64 scaling formula) */ { m = 0; for (i = 0; i < n; i++) m = (m << 8) | *s++; for (; i < 3; i++) m <<= 8; for (i = 4; i > 0; m >>= 6) t[--i] = soap_base64o[m & 0x3F]; for (i = 3; i > n; i--) t[i] = '='; t[4] = '\0'; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_base642s(struct soap *soap, const char *s, char *t, size_t l, int *n) { size_t i, j; soap_wchar c; unsigned long m; 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 + 1; /* space for raw binary and \0 */ t = (char*)soap_malloc(soap, l); } if (!t) return NULL; p = t; if (n) *n = 0; for (i = 0; ; i += 3, l -= 3) { m = 0; j = 0; while (j < 4) { c = *s++; if (c == '=' || !c) { if (l >= j - 1) { switch (j) { case 2: *t++ = (char)((m >> 4) & 0xFF); i++; l--; break; case 3: *t++ = (char)((m >> 10) & 0xFF); *t++ = (char)((m >> 2) & 0xFF); i += 2; l -= 2; } } if (n) *n = (int)i; if (l) *t = '\0'; 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_coblank(c + '+')) { soap->error = SOAP_TYPE; return NULL; } } if (l < 3) { if (n) *n = (int)i; if (l) *t = '\0'; return p; } *t++ = (char)((m >> 16) & 0xFF); *t++ = (char)((m >> 8) & 0xFF); *t++ = (char)(m & 0xFF); } } /******************************************************************************/ SOAP_FMAC1 char* SOAP_FMAC2 soap_s2hex(struct soap *soap, const unsigned char *s, char *t, int n) { 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--) { 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; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_hex2s(struct soap *soap, const char *s, char *t, size_t l, int *n) { 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 + 1; /* make sure enough space for \0 */ t = (char*)soap_malloc(soap, l); } if (!t) return NULL; p = t; while (l) { int d1, d2; d1 = *s++; if (!d1) break; d2 = *s++; if (!d2) break; *t++ = (char)(((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0')); l--; } if (n) *n = (int)(t - p); if (l) *t = '\0'; return p; } /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 const char * SOAP_FMAC2 soap_http_content_type(struct soap *soap, int status) { if (soap->status != SOAP_GET && soap->status != SOAP_DEL && soap->status != SOAP_CONNECT) { const char *s = "text/xml; charset=utf-8"; #ifndef WITH_LEANER const char *r = NULL; size_t n; #endif if (((status >= SOAP_FILE && status < SOAP_FILE + 600) || soap->status == SOAP_PUT || soap->status == SOAP_POST_FILE || soap->status == SOAP_PATCH) && soap->http_content && *soap->http_content && !strchr(soap->http_content, 10) && !strchr(soap->http_content, 13)) s = soap->http_content; else if (status == SOAP_HTML) s = "text/html; charset=utf-8"; else if (soap->version == 2) s = "application/soap+xml; charset=utf-8"; soap->http_content = NULL; /* use http_content once (assign new value before each call) */ #ifndef WITH_LEANER if (soap->mode & (SOAP_ENC_DIME | SOAP_ENC_MTOM)) { if ((soap->mode & SOAP_ENC_MTOM)) { if (soap->version == 2) r = "application/soap+xml"; else r = "text/xml"; s = "application/xop+xml"; } else { s = "application/dime"; } } if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary) { const char *t; size_t l; (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(soap->mime.boundary) + 53), "multipart/related; charset=utf-8; boundary=\"%s\"; type=\"", soap->mime.boundary); t = strchr(s, ';'); if (t) n = t - s; else n = strlen(s); l = strlen(soap->tmpbuf); if (sizeof(soap->tmpbuf) > l + n) (void)soap_strncpy(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, s, n); if (soap->mime.start) { l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, strlen(soap->mime.start) + 10), "\"; start=\"%s", soap->mime.start); } if (r) { l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, strlen(r) + 15), "\"; start-info=\"%s", r); } l = strlen(soap->tmpbuf); if (sizeof(soap->tmpbuf) > l) soap_strcpy(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, "\""); } else { soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), s); } if (status == SOAP_OK && soap->version == 2 && soap->action) { size_t l = strlen(soap->tmpbuf); n = strlen(soap->action); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, n + 11), "; action=\"%s\"", soap->action); } #else soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), s); #endif return soap->tmpbuf; } return NULL; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_puthttphdr(struct soap *soap, int status, ULONG64 count) { int err = SOAP_OK; if (soap_http_content_type(soap, status)) { err = soap->fposthdr(soap, "Content-Type", soap->tmpbuf); if (err) 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 { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), SOAP_ULONG_FORMAT, count); err = soap->fposthdr(soap, "Content-Length", soap->tmpbuf); } if (err) return err; } if (soap->http_extra_header) { err = soap_send(soap, soap->http_extra_header); soap->http_extra_header = NULL; /* use http_extra_header once (assign new value before each call) */ if (err) return err; err = soap_send_raw(soap, "\r\n", 2); if (err) return err; } if (soap->keep_alive) { if (soap->keep_alive > 0 && soap->recv_timeout) { int t = soap->recv_timeout; if (t < 0) t = 1; (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), "timeout=%d, max=%d", soap->recv_timeout, soap->keep_alive); err = soap->fposthdr(soap, "Keep-Alive", soap->tmpbuf); if (err) return err; } return soap->fposthdr(soap, "Connection", "keep-alive"); } return soap->fposthdr(soap, "Connection", "close"); } #endif /******************************************************************************/ #ifndef WITH_LEAN static const char* soap_set_validation_fault(struct soap *soap, const char *s, const char *t) { if (!t) t = SOAP_STR_EOS; if (*soap->tag) (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(s) + strlen(t) + strlen(soap->tag) + 47), "Validation constraint violation: %s%s in element '%s'", s, t, soap->tag); else (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(s) + strlen(t) + 33), "Validation constraint violation: %s%s", s, t); return soap->msgbuf; } #endif /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_fault(struct soap *soap) { const char **c; const char **s; if (soap->version == 0) soap_version(soap); c = soap_faultcode(soap); s = soap_faultstring(soap); if (soap->fseterror) soap->fseterror(soap, c, s); if (!*c) { if (soap->version == 2) *c = "SOAP-ENV:Sender"; else if (soap->version == 1) *c = "SOAP-ENV:Client"; else *c = ""; } if (*s) return; if (soap->error >= SOAP_POST) soap->error = SOAP_HTTP_METHOD; 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: if (*soap->type) *s = soap_set_validation_fault(soap, "type mismatch ", soap->type); else if (*soap->arrayType) *s = soap_set_validation_fault(soap, "array type mismatch", NULL); else *s = soap_set_validation_fault(soap, "invalid value", NULL); break; case SOAP_SYNTAX_ERROR: *s = soap_set_validation_fault(soap, "syntax error", NULL); break; case SOAP_NO_TAG: if (soap->version == 0 && soap->level == 0) *s = soap_set_validation_fault(soap, "root element expected", NULL); else if (soap->level == 0) *s = soap_set_validation_fault(soap, "SOAP message expected", NULL); else *s = soap_set_validation_fault(soap, "element tag expected", NULL); break; case SOAP_END_TAG: *s = soap_set_validation_fault(soap, "closing tag expected", NULL); break; case SOAP_MUSTUNDERSTAND: *c = "SOAP-ENV:MustUnderstand"; (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(soap->tag) + 65), "The data in element '%s' must be understood but cannot be processed", 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 data access error"; break; case SOAP_NO_METHOD: (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(soap->tag) + 66), "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_PATCH_METHOD: *s = "HTTP PATCH method not implemented"; break; case SOAP_DEL_METHOD: *s = "HTTP DELETE method not implemented"; break; case SOAP_HTTP_METHOD: *s = "HTTP method error"; 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 elements (use the SOAP_XML_TREE flag) with duplicate 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 id-ref ", 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_NTLM_ERROR: *s = "An HTTP NTLM authentication error occurred"; break; case SOAP_SSL_ERROR: #ifdef WITH_OPENSSL *s = "SSL/TLS 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 or max DIME size exceeds SOAP_MAXDIMESIZE currently set to " SOAP_XSTRINGIFY(SOAP_MAXDIMESIZE); 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 (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), (soap->d_stream && soap->d_stream->msg ? strlen(soap->d_stream->msg) : 0) + 19), "Zlib/gzip error: '%s'", soap->d_stream && 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_LEVEL: *s = "Maximum XML nesting depth level exceeded: increase maxlevel"; break; case SOAP_LENGTH: *s = soap_set_validation_fault(soap, "value range or content length violation", NULL); break; case SOAP_OCCURS: *s = soap_set_validation_fault(soap, "occurrence constraint violation", NULL); break; case SOAP_FIXED: *s = soap_set_validation_fault(soap, "value does not match the fixed value required", NULL); break; case SOAP_EMPTY: *s = soap_set_validation_fault(soap, "empty value provided where a value is required", NULL); break; case SOAP_FD_EXCEEDED: *s = "Maximum number of open connections was reached: increase FD_SETSIZE or define HAVE_POLL"; break; case SOAP_UTF_ERROR: *s = "UTF content encoding error"; break; case SOAP_STOP: *s = "Stopped: service request already handled by plugin (informative)"; break; #endif case SOAP_EOF: #ifndef WITH_NOIO *s = soap_strerror(soap); /* *s = soap->msgbuf */ #ifndef WITH_LEAN if (strlen(soap->msgbuf) + 25 < sizeof(soap->msgbuf)) { (void)soap_memmove((void*)(soap->msgbuf + 25), sizeof(soap->tmpbuf) - 25, (const void*)soap->msgbuf, strlen(soap->msgbuf) + 1); if (soap->is) #if defined(__cplusplus) && !defined(WITH_COMPAT) (void)soap_memcpy((void*)soap->msgbuf, sizeof(soap->msgbuf), (const void*)"End or bad std::istream: ", 25); #else (void)soap_memcpy((void*)soap->msgbuf, sizeof(soap->msgbuf), (const void*)"End at NUL buffer input: ", 25); #endif else (void)soap_memcpy((void*)soap->msgbuf, sizeof(soap->msgbuf), (const void*)"End of file or no input: ", 25); } #endif break; #else *s = "End of file or no input"; break; #endif case SOAP_ERR: *s = "An unspecified error occurred"; break; default: #ifndef WITH_NOHTTP #ifndef WITH_LEAN if (soap->error >= 200 && soap->error < 600) { const char *t = http_error(soap, soap->error); (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(t) + 54), "Error %d: HTTP %d %s", soap->error, soap->error, t); *s = soap->msgbuf; } else #endif #endif { (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), 26), "Error %d", soap->error); *s = soap->msgbuf; } } } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_send_fault(struct soap *soap) { int status = soap->error; if (status == SOAP_OK || status == SOAP_STOP) return soap_closesock(soap); #ifndef WITH_NOHTTP if (status >= 200 && status <= 299) return soap_send_empty_response(soap, status); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending back fault struct for error code %d\n", soap->error)); soap->keep_alive = 0; /* error: close connection later by disabling keep-alive here */ soap_set_fault(soap); if (soap->error < 200 && soap->error != SOAP_FAULT) soap->header = NULL; 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)) { r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_SND, 0); if (r > 0) { int t; if (!(r & SOAP_TCP_SELECT_SND) || ((r & SOAP_TCP_SELECT_RCV) && recv(soap->socket, (char*)&t, 1, MSG_PEEK) < 0)) r = 0; } } #endif #endif if (r > 0) { soap->error = SOAP_OK; if (soap->version > 0) { soap->encodingStyle = NULL; /* no encodingStyle in Faults */ soap_serializeheader(soap); soap_serializefault(soap); (void)soap_begin_count(soap); if ((soap->mode & SOAP_IO_LENGTH)) { if (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); } (void)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) || soap_end_send(soap)) return soap_closesock(soap); } else { const char *s = *soap_faultstring(soap); const char **d = soap_faultdetail(soap); (void)soap_begin_count(soap); if ((soap->mode & SOAP_IO_LENGTH)) if (soap_element_begin_out(soap, "fault", 0, NULL) || soap_outstring(soap, "reason", 0, (char*const*)&s, NULL, 0) || soap_outliteral(soap, "detail", (char*const*)d, NULL) || soap_element_end_out(soap, "fault")) return soap_closesock(soap); (void)soap_end_count(soap); if (soap_response(soap, status) || soap_element_begin_out(soap, "fault", 0, NULL) || soap_outstring(soap, "reason", 0, (char*const*)&s, NULL, 0) || soap_outliteral(soap, "detail", (char*const*)d, NULL) || soap_element_end_out(soap, "fault") || soap_end_send(soap)) return soap_closesock(soap); } } } soap->error = status; return soap_closesock(soap); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_recv_fault(struct soap *soap, int check) { int status = soap->status; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Check (%d) if receiving SOAP Fault (status = %d)\n", check, status)); if (!check) { /* try getfault when no tag or tag mismatched at level 2, otherwise close and return SOAP_TAG_MISMATCH or HTTP error code */ if (soap->error != SOAP_NO_TAG && (soap->error != SOAP_TAG_MISMATCH || soap->level != 2)) { if (soap->error == SOAP_TAG_MISMATCH && soap->level == 0) { soap->error = SOAP_OK; if (!soap_element_begin_in(soap, "fault", 0, NULL)) { char *s = NULL, *d = NULL; (void)soap_instring(soap, "reason", &s, NULL, 0, 1, 0, -1, NULL); (void)soap_inliteral(soap, "detail", &d); if (!soap_element_end_in(soap, "fault") && !soap_end_recv(soap)) { *soap_faultstring(soap) = s; *soap_faultdetail(soap) = d; if (status) soap->error = status; else soap->error = SOAP_FAULT; soap_set_fault(soap); return soap_closesock(soap); } } soap->error = SOAP_TAG_MISMATCH; } if (status && (status < 200 || status > 299)) soap->error = status; return soap_closesock(soap); } } soap->error = SOAP_OK; if (soap_getfault(soap)) { /* if check>0 and no SOAP Fault is present and no HTTP error then just return to parse request */ if (check && (status == 0 || (status >= 200 && status <= 299)) && ((soap->error == SOAP_TAG_MISMATCH && soap->level == 2) || soap->error == SOAP_NO_TAG)) return soap->error = SOAP_OK; /* if check=0 and empty SOAP Body and encodingStyle is NULL and no HTTP error then just return */ if (!check && (status == 0 || (status >= 200 && status <= 299)) && !soap->encodingStyle && (soap->error == SOAP_NO_TAG && soap->level <= 2)) return soap->error = SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error: soap_get_soapfault() failed with error %d at level %u tag '%s'\n", soap->error, soap->level, soap->tag)); *soap_faultcode(soap) = (soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client"); if (status) soap->error = status; else soap->error = status = SOAP_NO_DATA; soap_set_fault(soap); } else { 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, "Received SOAP Fault code %s\n", s)); status = SOAP_FAULT; } if (!soap_body_end_in(soap)) soap_envelope_end_in(soap); } (void)soap_end_recv(soap); soap->error = status; return soap_closesock(soap); } /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_send_empty_response(struct soap *soap, int httpstatuscode) { soap_mode m = soap->omode; if (!(m & SOAP_IO_UDP)) { soap->count = 0; if ((m & SOAP_IO) == SOAP_IO_CHUNK) soap->omode = (m & ~SOAP_IO) | SOAP_IO_BUFFER; (void)soap_response(soap, httpstatuscode); (void)soap_end_send(soap); /* force end of sends */ soap->error = SOAP_STOP; /* stops the server from returning another response */ soap->omode = m; } return soap_closesock(soap); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_recv_empty_response(struct soap *soap) { soap->error = SOAP_OK; if (!(soap->omode & SOAP_IO_UDP) && !(soap->omode & SOAP_ENC_PLAIN)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Receiving empty response\n")); if (soap_begin_recv(soap) == SOAP_OK) { if (soap_http_skip_body(soap) || soap_end_recv(soap)) return soap_closesock(soap); } else if (soap->error == 200 || soap->error == 201 || soap->error == 202) { soap->error = SOAP_OK; } } #ifndef WITH_LEANER else if ((soap->fprepareinitrecv && (soap->error = soap->fprepareinitrecv(soap))) || (soap->fpreparefinalrecv && (soap->error = soap->fpreparefinalrecv(soap)))) { return soap->error; } #endif return soap_closesock(soap); } #endif /******************************************************************************/ #ifndef WITH_NOIO static const char* soap_strerror(struct soap *soap) { int err = soap->errnum; *soap->msgbuf = '\0'; if (err) { #ifndef WIN32 # ifdef HAVE_STRERROR_R # if !defined(_GNU_SOURCE) || (!_GNU_SOURCE && ((!defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || (_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600)) || defined(__ANDROID__) || !defined(__GLIBC__)) err = strerror_r(err, soap->msgbuf, sizeof(soap->msgbuf)); /* XSI-compliant */ if (err != 0) soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), "unknown error"); # else return strerror_r(err, soap->msgbuf, sizeof(soap->msgbuf)); /* GNU-specific */ # endif # else return strerror(err); # endif #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 #endif } else { if (soap->recv_maxlength && soap->count > soap->recv_maxlength) { soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), "max message length exceeded"); } else { int tt = soap->transfer_timeout, rt = soap->recv_timeout, st = soap->send_timeout; #ifndef WITH_LEAN int tu = ' ', ru = ' ', su = ' '; #endif soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), "message transfer interrupted"); if (tt | rt || st) soap_strcpy(soap->msgbuf + 28, sizeof(soap->msgbuf) - 28, " or timed out"); #ifndef WITH_LEAN if (tt < 0) { tt = -tt; tu = 'u'; } if (rt < 0) { rt = -rt; ru = 'u'; } if (st < 0) { st = -st; su = 'u'; } if (tt) { size_t l = strlen(soap->msgbuf); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, 43), " (%d%csec max transfer time)", tt, tu); } if (rt) { size_t l = strlen(soap->msgbuf); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, 40), " (%d%csec max recv delay)", rt, ru); } if (st) { size_t l = strlen(soap->msgbuf); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, 40), " (%d%csec max send delay)", st, su); } #endif } } return soap->msgbuf; } #endif /******************************************************************************/ 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) { const char **s = soap_faultdetail(soap); if (s) *s = faultdetailXML; } return soap->error = soaperror; } /******************************************************************************/ 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->version == 1 ? "SOAP-ENV:Client" : "at sender", NULL, faultstring, faultdetailXML, soaperror); } /******************************************************************************/ 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->version == 1 ? "SOAP-ENV:Server" : "detected", NULL, faultstring, faultdetailXML, soaperror); } /******************************************************************************/ 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; DBGFUN2("soap_copy_fault", "code=%s", faultcode ? faultcode : "(null)", "string=%s", faultstring ? faultstring : "(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); } /******************************************************************************/ 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); } /******************************************************************************/ 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->version == 1 ? "SOAP-ENV:Client" : "at source", faultsubcodeQName, faultstring, faultdetailXML); } /******************************************************************************/ 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); } /******************************************************************************/ 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->version == 1 ? "SOAP-ENV:Server" : "is internal", faultsubcodeQName, faultstring, faultdetailXML); } /******************************************************************************/ #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; c = soap_faultcode(soap); if (!*c) { soap_set_fault(soap); c = soap_faultcode(soap); } if (soap->version == 2) v = soap_fault_subcode(soap); s = soap_fault_string(soap); d = soap_fault_detail(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 : "[no detail]"); } } #endif /******************************************************************************/ #ifdef __cplusplus #ifndef WITH_LEAN #ifndef WITH_NOSTDLIB #ifndef WITH_COMPAT 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; c = soap_faultcode(soap); if (!*c) { soap_set_fault(soap); c = soap_faultcode(soap); } if (soap->version == 2) v = soap_fault_subcode(soap); s = soap_fault_string(soap); d = soap_fault_detail(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 : "[no detail]") << std::endl; } } #endif #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)) { soap_strcpy(buf, len, "Error: soap struct not initialized"); } else if (soap->error) { const char **c, *v = NULL, *s, *d; c = soap_faultcode(soap); if (!*c) { soap_set_fault(soap); c = soap_faultcode(soap); } if (soap->version == 2) v = soap_fault_subcode(soap); if (!v) v = "no subcode"; s = soap_fault_string(soap); if (!s) s = "[no reason]"; d = soap_fault_detail(soap); if (!d) d = "[no detail]"; (SOAP_SNPRINTF(buf, len, strlen(*c) + strlen(v) + strlen(s) + strlen(d) + 72), "%s%d fault %s [%s]\n\"%s\"\nDetail: %s\n", soap->version ? "SOAP 1." : "Error ", soap->version ? (int)soap->version : soap->error, *c, v, s, d); } else if (len > 0) { *buf = '\0'; } return buf; } #endif #endif /******************************************************************************/ #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_check_state(soap) == SOAP_OK && soap->error && soap->error != SOAP_STOP && soap->bufidx <= soap->buflen && soap->buflen > 0 && soap->buflen <= sizeof(soap->buf)) { 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] = (char)c1; soap->buf[j] = (char)c2; } #else (void)soap; (void)fd; #endif } #endif /******************************************************************************/ #ifdef __cplusplus #ifndef WITH_LEAN #ifndef WITH_NOSTDLIB #ifndef WITH_COMPAT SOAP_FMAC1 void SOAP_FMAC2 soap_stream_fault_location(struct soap *soap, std::ostream& os) { int i, j, c1, c2; if (soap_check_state(soap) == SOAP_OK && soap->error && soap->error != SOAP_STOP && soap->bufidx <= soap->buflen && soap->buflen > 0 && soap->buflen <= sizeof(soap->buf)) { 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'; os << soap->buf << (char)c1 << std::endl << "" << std::endl; if (soap->bufidx < soap->buflen) os << soap->buf + soap->bufidx << std::endl; soap->buf[i] = (char)c1; soap->buf[j] = (char)c2; } } #endif #endif #endif #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_register_plugin_arg(struct soap *soap, int (*fcreate)(struct soap*, struct soap_plugin*, void*), void *arg) { struct soap_plugin *p; int err; p = (struct soap_plugin*)SOAP_MALLOC(soap, sizeof(struct soap_plugin)); if (!p) return soap->error = SOAP_EOM; p->id = NULL; p->data = NULL; p->fcopy = NULL; p->fdelete = NULL; err = fcreate(soap, p, arg); if (!err && p->fdelete && p->id) { if (!soap_lookup_plugin(soap, p->id)) { 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 with the same ID already registered\n", p->id)); SOAP_FREE(soap, p); return SOAP_OK; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not register plugin '%s': plugin returned error %d or plugin ID not set or fdelete callback not set\n", p->id ? p->id : "plugin ID not set", err)); SOAP_FREE(soap, p); soap->error = err ? err : SOAP_PLUGIN_ERROR; return soap->error; } /******************************************************************************/ static void * fplugin(struct soap *soap, const char *id) { 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; } /******************************************************************************/ SOAP_FMAC1 void * SOAP_FMAC2 soap_lookup_plugin(struct soap *soap, const char *id) { return soap->fplugin(soap, id); } /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************\ * * C++ soap struct methods * \******************************************************************************/ #ifdef __cplusplus soap::soap() { soap_init(this); /* no logs to prevent DEBUG mode leaks when the user calls a soap_init() on this context */ soap_set_test_logfile(this, NULL); soap_set_sent_logfile(this, NULL); soap_set_recv_logfile(this, NULL); } #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(const struct soap& soap) { soap_copy_context(this, &soap); } #endif /******************************************************************************/ #ifdef __cplusplus struct soap& soap::operator=(const struct soap& soap) { soap_done(this); soap_copy_context(this, &soap); return *this; } #endif /******************************************************************************/ #ifdef __cplusplus void soap::destroy() { soap_destroy(this); soap_end(this); } #endif /******************************************************************************/ #ifdef __cplusplus soap::~soap() { soap_done(this); } #endif /******************************************************************************/ gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/stdsoap2.h0000644000175000017500000046012413525245163022672 0ustar ellertellert/* stdsoap2.h 2.8.91 gSOAP runtime engine gSOAP XML Web services tools Copyright (C) 2000-2019, 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 addition licensed under the gSOAP public license: - vxWorks compatible, enabled with compiler option -DVXWORKS -------------------------------------------------------------------------------- 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-2019, 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 -------------------------------------------------------------------------------- */ #define GSOAP_VERSION 20891 #ifdef WITH_SOAPDEFS_H # include "soapdefs.h" /* include user-defined stuff in soapdefs.h */ #endif #ifndef _THREAD_SAFE # define _THREAD_SAFE #endif #ifndef OPENSERVER # ifndef _REENTRANT # define _REENTRANT # endif #endif #ifdef _WIN32 # ifndef WIN32 # define WIN32 # endif #endif /* for legacy purposes we use WIN32 macro, even when WIN64 is supported */ #ifdef _WIN64 # ifndef WIN32 # define WIN32 # endif #endif #ifdef WIN32 # ifdef SOAP_STD_EXPORTS /* dllexport the API functions and classes */ # ifndef SOAP_STD_API # define SOAP_STD_API __declspec(dllexport) # endif # ifndef SOAP_CMAC # define SOAP_CMAC SOAP_STD_API /* export soap struct and generated classes */ # endif # ifndef SOAP_FMAC1 # define SOAP_FMAC1 SOAP_STD_API /* export stdsoap2.cpp API */ # endif # ifndef SOAP_FMAC3 # define SOAP_FMAC3 SOAP_STD_API /* export soapC.cpp serializers API */ # endif # ifndef SOAP_FMAC5 # define SOAP_FMAC5 SOAP_STD_API /* export soapClient.cpp and soapServer.cpp API */ # endif # 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 #ifndef STDSOAP_H #define STDSOAP_H #define SOAP_XSTRINGIFY(s) SOAP_STRINGIFY(s) #define SOAP_STRINGIFY(s) #s #if defined(SOAPDEFS_H) && !defined(WITH_SOAPDEFS_H) # include SOAP_XSTRINGIFY(SOAPDEFS_H) /* include user-defined "SOAPDEFS_H" */ #endif #if defined(__vxworks) || defined(__VXWORKS__) # ifndef VXWORKS # define VXWORKS # 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 __clang__ # ifdef _WIN32 # ifndef WIN32 # define WIN32 # endif # endif # else # ifdef __WIN32__ # ifndef WIN32 # define WIN32 # endif # endif # endif #endif #if defined(__CYGWIN__) || defined(__CYGWIN32__) # ifndef CYGWIN # define CYGWIN # endif #endif #ifdef __SYMBIAN32__ # define SYMBIAN # undef WIN32 #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 #if defined(__sun) && defined(__SVR4) # ifndef SUN_OS # define SUN_OS # endif #endif #ifdef HAVE_CONFIG_H # include "config.h" #else # if defined(UNDER_CE) # define SOAP_BUFLEN (2048) # define SOAP_PTRHASH (32) # define SOAP_IDHASH (19) # define SOAP_BLKLEN (32) # define SOAP_TAGLEN (256) # define SOAP_HDRLEN (1024) # define SOAP_MAXDIMS (4) # define HAVE_SSCANF # elif defined(CYGWIN) # define HAVE_POLL # define HAVE_SNPRINTF # 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_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_INTTYPES_H # define HAVE_LOCALE_H # define HAVE_SOCKLEN_T # elif defined(WIN32) # ifdef __BORLANDC__ # ifdef __clang__ # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_STRTOL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_GMTIME # define HAVE_WCTOMB # define HAVE_MBTOWC # define SOAP_LONG_FORMAT "%lld" # define SOAP_ULONG_FORMAT "%llu" # else # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_STRTOL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_GMTIME # define HAVE_WCTOMB # define HAVE_MBTOWC # define SOAP_LONG_FORMAT "%I64d" # define SOAP_ULONG_FORMAT "%I64u" # endif # else # if _MSC_VER >= 1400 # define HAVE_SNPRINTF # endif # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_STRTOL # define HAVE_STRTOUL # if _MSC_VER >= 1300 # define HAVE_STRTOLL /* use _strtoi64 */ # define HAVE_STRTOULL /* use _strtoui64 */ # endif # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_GMTIME # define HAVE_WCTOMB # define HAVE_MBTOWC # define SOAP_LONG_FORMAT "%I64d" # define SOAP_ULONG_FORMAT "%I64u" # define HAVE_LOCALE_H # endif # elif defined(__APPLE__) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRLCPY # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SSCANF_L # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_ASCTIME_R # define HAVE_TM_GMTOFF # define HAVE_GETTIMEOFDAY # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_TIMEGM # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_INTTYPES_H # define HAVE_LOCALE_H # define HAVE_XLOCALE_H # define HAVE_RANDOM # define HAVE_SOCKLEN_T # elif defined(_AIX43) # define HAVE_SNPRINTF # 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_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_LOCALE_H # define HAVE_SOCKLEN_T # elif defined(_AIX41) # define HAVE_SNPRINTF # 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 # define HAVE_LOCALE_H # elif defined(HP_UX) # include # if 0 /* enable if __strtoll and __strtoull are available */ extern intmax_t __strtoll(const char*, char**, int); extern intmax_t __strtoull(const char*, char**, int); # define strtoll __strtoll # define strtoull __strtoull # endif # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # 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_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_ISNAN # define HAVE_LOCALE_H # elif defined(FREEBSD) || defined(__FreeBSD__) || defined(OPENBSD) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRLCPY # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SSCANF_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_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define SOAP_LONG_FORMAT "%qd" # define SOAP_ULONG_FORMAT "%qu" # define HAVE_ISNAN # define HAVE_ISINF # define HAVE_LOCALE_H # define HAVE_XLOCALE_H # define HAVE_RANDOM # define HAVE_SOCKLEN_T # elif defined(__VMS) # include # define HAVE_SNPRINTF # 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_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(TRU64) # define HAVE_SNPRINTF # 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_ASCTIME_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" # define HAVE_LOCALE_H # elif defined(__GLIBC__) || defined(__GNU__) || defined(__GNUC__) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_SYS_TIMEB_H # define HAVE_GETTIMEOFDAY # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_TIMEGM # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_ISNAN # define HAVE_ISINF # if !defined(__GNUC__) || __GNUC__ >= 4 /* gcc 3 and earlier often refuse to compile _l functions */ # define HAVE_STRTOD_L # define HAVE_SSCANF_L # define HAVE_LOCALE_H # endif # define HAVE_SOCKLEN_T # elif defined(MAC_CARBON) # define WITH_NOIO # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # 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_SNPRINTF # 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_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_SOCKLEN_T # elif defined(AS400) # define HAVE_SNPRINTF # 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_ASCTIME_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_POLL # define HAVE_SNPRINTF # define HAVE_STRLCPY # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_GETTIMEOFDAY # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_SOCKLEN_T # elif defined(SUN_OS) # define HAVE_SNPRINTF # 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_ASCTIME_R # define HAVE_LOCALTIME_R # else /* Default assumptions for supported library functions when not including config.h */ # ifndef WITH_C_LOCALE # ifndef WITH_NO_C_LOCALE # define WITH_NO_C_LOCALE /* turn locale support off by default */ # endif # endif # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # 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_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_LOCALE_H # ifdef MB_LEN_MAX # define HAVE_WCTOMB # define HAVE_MBTOWC # endif # endif #endif #ifdef WITH_LEANER # ifndef WITH_LEAN # define WITH_LEAN # endif #endif /* gSOAP 2.7.15 and higher: always use FAST and retain CDATA in literal XML, unless WITH_LEAN or WITH_NOCDATA */ #ifndef WITH_LEAN # ifndef WITH_FAST # define WITH_FAST # endif # ifndef WITH_NOCDATA # ifndef WITH_CDATA # define WITH_CDATA # endif # endif #endif #if !defined(__cplusplus) /* allowing empty struct/union in C is a GNU extension */ # if !defined(__GNU__) && !defined(__GNUC__) # define WITH_NOEMPTYSTRUCT # endif #endif /* silence clang's C99 variadic macro warnings */ #ifdef __clang__ # pragma clang diagnostic ignored "-Wvariadic-macros" #endif #if defined(WITH_PURE_VIRTUAL) # define SOAP_PURE_VIRTUAL = 0 # define SOAP_PURE_VIRTUAL_COPY = 0 #elif defined(WITH_DEFAULT_VIRTUAL) # define SOAP_PURE_VIRTUAL { return SOAP_NO_METHOD; } # define SOAP_PURE_VIRTUAL_COPY #else # define SOAP_PURE_VIRTUAL # define SOAP_PURE_VIRTUAL_COPY #endif /* older OpenVMS TCP/IP stacks cannot handle 65536 bytes */ #ifdef __VMS # ifndef SOAP_BUFLEN # define SOAP_BUFLEN (65535) # endif #endif /* small buffer, to accelerate base64 and hex binary output */ #ifndef SOAP_BINARY_BUFLEN # define SOAP_BINARY_BUFLEN (128) #endif /* if we have locale.h then we should use it WITH_C_LOCALE enabled to avoid decimal point conversion issues */ #ifdef HAVE_LOCALE_H # ifndef WITH_NO_C_LOCALE # ifndef WITH_C_LOCALE # define WITH_C_LOCALE # endif # endif #endif /* MinGW does not support uselocale() and xlocale.h and gettimeofday() */ #if defined(__MINGW32__) || defined(__MINGW64__) # if !defined(WITH_NO_C_LOCALE) # define WITH_NO_C_LOCALE # endif # undef HAVE_GETTIMEOFDAY #endif /* user can set WITH_NO_C_LOCALE to force removal of locale (e.g. in case of compiler errors) */ #ifdef WITH_NO_C_LOCALE # undef WITH_C_LOCALE #endif #ifndef WITH_NOSTDLIB # include # include # include # if !defined(HAVE_CONFIG_H) || defined(HAVE_CTYPE_H) # include # endif # if !defined(HAVE_CONFIG_H) || defined(HAVE_LIMITS_H) # include /* for MB_LEN_MAX */ # endif # if !defined(HAVE_CONFIG_H) || defined(HAVE_FLOAT_H) # include /* for INFINITY */ # endif # if !defined(HAVE_CONFIG_H) || defined(HAVE_MATH_H) # include /* for isnan() and isinf() */ # endif #endif /* force inclusion of xlocale.h when WITH_INCLUDE_XLOCALE_H is defined by the user for systems that require xlocale.h */ #ifdef WITH_INCLUDE_XLOCALE_H # ifndef HAVE_XLOCALE_H # define HAVE_XLOCALE_H # endif #endif #ifdef WITH_C_LOCALE # include # if defined(WIN32) && !defined(CYGWIN) # define SOAP_LOCALE_T _locale_t # define SOAP_LOCALE(soap) ((soap)->c_locale ? (soap)->c_locale : ((soap)->c_locale = _create_locale(LC_ALL, "C"))) # define SOAP_FREELOCALE(soap) (void)((soap)->c_locale && (_free_locale((soap)->c_locale), ((soap)->c_locale = NULL))) # else # if defined(HAVE_XLOCALE_H) # include # endif # define SOAP_LOCALE_T locale_t # define SOAP_LOCALE(soap) ((soap)->c_locale ? (soap)->c_locale : ((soap)->c_locale = newlocale(LC_ALL_MASK, "C", NULL))) # define SOAP_FREELOCALE(soap) (void)((soap)->c_locale && (freelocale((soap)->c_locale), ((soap)->c_locale = NULL))) # if defined(CYGWIN) # undef HAVE_STRTOF_L /* Cygwin does not support strtof_l strtod_l */ # undef HAVE_STRTOD_L # endif # endif #else # undef HAVE_STRTOF_L # undef HAVE_STRTOD_L # undef HAVE_SSCANF_L #endif #ifdef TANDEM_NONSTOP /* Support for Guardian */ # define SOAP_BUFLEN (32767) /*# define WITH_NOSTDLIB */ /* uncommment to remove stdlib dependences */ # define WITH_NOIO /* no IO dependences, e.g. remove TCP/IP */ # define int32_t int # define int64_t long long # define LONG64 long long # define ULONG64 unsigned long long # define DBL_PINFTY (1.1579208923716189e77) # undef HAVE_WCTOMB # undef HAVE_MBTOWC # undef HAVE_GMTIME_R # undef HAVE_ASCTIME_R # undef HAVE_LOCALTIME_R # undef HAVE_SNPRINTF # define SOAP_BUFLEN (32767) # define SOAP_SOCKET short #pragma nolist # include # include # include # include # include # include # include # include # include # include # include # define INET_ERROR 4294967295 #pragma list #elif defined(__TANDEM) /* Support for OSS */ # define int32_t int # define SOAP_BUFLEN (32767) #endif #ifdef WITH_NTLM # include #endif #ifdef HAVE_POLL # include #endif #ifdef __cplusplus # include # include # ifndef WITH_COMPAT # include # include # endif #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 WITH_NOIO # include # include # endif # ifndef WITH_LEAN # ifdef HAVE_SYS_TIMEB_H # include /* for ftime() */ # endif # include # endif #endif #ifdef OPENSERVER # include # include # include extern int h_errno; #endif #ifdef HAVE_GETTIMEOFDAY # ifndef WIN32 # ifdef VXWORKS # ifdef _WRS_KERNEL # include # endif # else # include /* for timeval and gettimeofday() */ # endif # endif #endif #ifndef WITH_NOIO # ifndef WIN32 # include # ifdef VXWORKS # include # include # ifndef _WRS_KERNEL # include # endif # else # ifndef SYMBIAN # include # endif # endif # ifdef SUN_OS # include /* SUN */ # include /* only needed with SUN < 2.8 ? */ # endif # ifdef VXWORKS # ifdef _WRS_KERNEL # include # endif # endif # include # ifdef OS390 # include # else # include /* TCP_NODELAY, TCP_FASTOPEN */ # endif # include # endif #endif #ifdef WIN32 # define SOAP_WINSOCKINT int #else # define SOAP_WINSOCKINT size_t #endif #ifdef WIN32 # undef WITH_SELF_PIPE #endif #if defined(WITH_IPV6_V6ONLY) # ifndef WITH_IPV6 # define WITH_IPV6 # endif #endif #ifdef WIN32 # ifndef UNDER_CE # include # include # endif // When you get macro redefinition errors when compiling the code below, then: // a) try arrange your includes so is included after "stdsoap2.h" // b) or define _WINSOCKAPI_ first: // #define _WINSOCKAPI_ // stops windows.h including winsock.h // #include // #include "stdsoap2.h" // c) or compile with the -DWIN32_LEAN_AND_MEAN switch # include // Visual Studio 2005 users: install Platform SDK (R2) # include // # define _WSPIAPI_COUNTOF // DEV NOTE: enble to fix problems with VC6 // # include # include // DEV NOTE: replaces older wspiapi.h above # ifdef WITH_IPV6 # define SOAP_GAI_STRERROR gai_strerrorA # endif #else # ifdef VXWORKS # include # include # include # endif # ifndef WITH_NOIO # include # include # include # include # ifdef _AIX41 # include # endif # endif #endif #ifdef WITH_FASTCGI # include #endif #ifdef WITH_OPENSSL # ifdef __VMS # pragma names save # pragma names uppercase # endif # undef WITH_GNUTLS # define OPENSSL_NO_KRB5 # include # include # include # 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 # ifdef __VMS # pragma names restore # endif #endif #ifdef WITH_GNUTLS # include # include # if GNUTLS_VERSION_NUMBER < 0x020b00 /* deprecated since GNUTLS 2.11.0 */ # include # endif # ifndef HAVE_PTHREAD_H # ifdef _POSIX_THREADS # define HAVE_PTHREAD_H /* make GNUTLS thread safe */ # endif # endif #endif #ifdef WITH_SYSTEMSSL # include #endif #ifdef WITH_GZIP # ifndef WITH_ZLIB # define WITH_ZLIB # endif #endif #ifdef WITH_CASEINSENSITIVETAGS # define SOAP_STRCMP soap_tag_cmp /* case insensitive XML element/attribute names */ #else # define SOAP_STRCMP strcmp /* case sensitive XML element/attribute names */ #endif #ifdef WITH_ZLIB # include #endif /* #define DEBUG */ /* Uncomment to debug sending (in file SENT.log) receiving (in file RECV.log) and internal operations (in file TEST.log) */ /* #define DEBUG_STAMP */ /* Uncomment to debug sending (in file SENT.log) receiving (in file RECV.log) and time-stamped operations (in file TEST.log) */ #ifdef __cplusplus extern "C" { #endif /* Portability (X/Open, BSD sockets etc): define SOAP_SOCKLEN_T as socklen_t or int or ... */ #if defined(HAVE_SOCKLEN_T) # define SOAP_SOCKLEN_T socklen_t #elif defined(_AIX) || defined(AIX) || defined(HP_UX) # 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(__ANDROID__) || !defined(_GNU_SOURCE) || (!_GNU_SOURCE && !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 # define SOAP_SOCKLEN_T socklen_t #elif defined(IRIX) || defined(WIN32) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS) # define SOAP_SOCKLEN_T int #elif !defined(SOAP_SOCKLEN_T) # define SOAP_SOCKLEN_T socklen_t #endif /* AIX DCE threads portability: define SOAP_FUNC_R_ERR gmtime_r and localtime_r err ret val as -1 */ #ifdef _AIX32_THREADS # define SOAP_FUNC_R_ERR (-1) #elif !defined(SOAP_FUNC_R_ERR) # define SOAP_FUNC_R_ERR (NULL) #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(sk) ((sk) != SOAP_INVALID_SOCKET) #define SOAP_SHUT_WR (1) #define SOAP_SHUT_RDWR (2) #ifndef SOAP_GAI_STRERROR # define SOAP_GAI_STRERROR gai_strerror #endif #ifndef FD_SETSIZE # define FD_SETSIZE (1024) #endif #ifdef WITH_LEAN # define SOAP_CHK_EOF SOAP_EOF #else # define SOAP_CHK_EOF (soap->error ? soap->error : SOAP_EOF) #endif #ifdef __cplusplus # ifndef __STDC_FORMAT_MACROS # define __STDC_FORMAT_MACROS # endif #endif #if defined(SYMBIAN) # warning "Symbian build: removing 64 bit integer support" # define LONG64 long # define ULONG64 unsigned LONG64 # ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%ld" # endif # ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%lu" # endif #elif !defined(WIN32) || defined(CYGWIN) || defined(__GLIBC__) || defined(__GNU__) || defined(__GNUC__) # ifndef LONG64 # if defined(HAVE_INTTYPES_H) # include # define LONG64 int64_t # define ULONG64 uint64_t # if defined(PRId64) && defined(PRIu64) # ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%" PRId64 # endif # ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%" PRIu64 # endif # endif # elif defined(HAVE_SYS_INTTYPES_H) # include # define LONG64 int64_t # define ULONG64 uint64_t # if defined(PRId64) && defined(PRIu64) # ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%" PRId64 # endif # ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%" PRIu64 # endif # endif # elif defined(HAVE_STDINT_H) # include # define LONG64 int64_t # define ULONG64 uint64_t # if defined(PRId64) && defined(PRIu64) # ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%" PRId64 # endif # ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%" PRIu64 # endif # endif # elif defined(CYGWIN) || 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 long long ints */ #endif #ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%llu" /* printf format for unsigned 64 bit long long ints */ #endif #if defined(WIN32) && !defined(CYGWIN) # define soap_int32 __int32 #elif defined(SYMBIAN) # define soap_int32 long #elif defined(_AIX) || 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 # define SOAP_ECONNREFUSED WSAECONNREFUSED #else # ifdef ERANGE # define SOAP_ERANGE ERANGE # else # define SOAP_ERANGE (34) # endif # define SOAP_EINTR EINTR # define SOAP_EAGAIN EAGAIN # define SOAP_EADDRINUSE EADDRINUSE # define SOAP_ECONNREFUSED ECONNREFUSED # 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 # if !defined(WITH_LEAN) # define SOAP_BUFLEN (65536) /* buffer length for socket packets, so don't make this too small */ # else # define SOAP_BUFLEN (2048) /* lean size */ # 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 (4096) /* 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) /* 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 (256) # 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_TMPLEN # ifndef WITH_LEAN # define SOAP_TMPLEN (2048) /* maximum length of msgbuf and tmpbuf short message buffers, must be >=1024 */ # else # define SOAP_TMPLEN (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_MAXPTRS # ifndef WITH_LEAN # define SOAP_MAXPTRS (4) /* maximum depth + 1 of id-ref deserialized pointer types (int* has depth 0, int*** has depth 2) */ # else # define SOAP_MAXPTRS (2) # endif #endif #ifndef SOAP_MAXALLOCSIZE # define SOAP_MAXALLOCSIZE (0) /* max size that malloc() can handle, zero for no limit */ #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 /* Tag name of multiref elements in SOAP 1.1 encoding */ #ifndef SOAP_MULTIREFTAG # define SOAP_MULTIREFTAG "id" #endif /* href-id value base name in multiref SOAP encoding */ #ifndef SOAP_BASEREFNAME # define SOAP_BASEREFNAME "_" #endif /* Max number of EINTR interrupts to ignore while poll/select for pending activity on a socket */ /* Each EINTR ignored may increase the I/O blocking time by at most one second */ #ifndef SOAP_MAXEINTR # define SOAP_MAXEINTR (10) #endif /* SOAP_MAXKEEPALIVE: Max iterations in soap_serve() to keep server connection alive */ #ifndef SOAP_MAXKEEPALIVE # define SOAP_MAXKEEPALIVE (100) #endif /* SOAP_MAXARRAYSIZE: Trusted total max size of an inbound SOAP Array. Arrays of larger size are not pre-allocated, but deserialized on an element-by-element basis until XML validation contrains kick in. This macro only affects the efficiency of parsing SOAP arrays. */ #ifndef SOAP_MAXARRAYSIZE # define SOAP_MAXARRAYSIZE (100000) #endif /* SOAP_MAXDIMESIZE: Trusted max size of inbound DIME data. Increase if necessary to allow larger attachments, or decrease when server resources are limited. This is to deny senders to allocate more than 8 MB at the receiver without actually sending the whole message. */ #ifndef SOAP_MAXDIMESIZE # define SOAP_MAXDIMESIZE (8*1048576) /* 8 MB */ #endif /* SOAP_MAXINFLATESIZE: Trusted inflated content size. Larger content is subject to the SOAP_MINDEFLATERATIO constraint. If SOAP_MINDEFLATERATIO is 1.0, SOAP_MAXINFLATESIZE is always the max size of uncompressed content. */ #ifndef SOAP_MAXINFLATESIZE # define SOAP_MAXINFLATESIZE (1*1048576) /* 1 MB */ #endif /* SOAP_MINDEFLATERATIO: Trusted deflation ratio after SOAP_MAXINFLATESIZE is reached. Trust when compressed / deflated > SOAP_MINDEFLATERATIO Sets a ratio > 0.00096899224806 (1032:1) According to the zlib site: the limit (1032:1) comes from the fact that one length/distance pair can represent at most 258 output bytes. A length requires at least one bit and a distance requires at least one bit, so two bits in can give 258 bytes out, or eight bits in give 1032 bytes out. A dynamic block has no length restriction, so you could get arbitrarily close to the limit of 1032:1. */ #ifndef SOAP_MINDEFLATERATIO # define SOAP_MINDEFLATERATIO (1.0/1032.0) /* ratio of deflated/inflated */ #endif /* maximum XML nesting depth level allowed for inbound XML parsing, must be greater than zero (0) */ #ifndef SOAP_MAXLEVEL # define SOAP_MAXLEVEL (10000) #endif /* maximum string content length if not already constrained by XML schema validation maxLength constraints, zero or negative means unlimited string lengths are allowed unless restricted by XML schema maxLength */ #ifndef SOAP_MAXLENGTH # define SOAP_MAXLENGTH (0) #endif /* maximum number of array or container elements, must be greater than zero (0) */ #ifndef SOAP_MAXOCCURS # define SOAP_MAXOCCURS (100000) #endif #ifdef VXWORKS # ifdef WMW_RPM_IO # include "httpLib.h" # endif # ifdef __INCmathh # include # ifndef HAVE_ISNAN # define HAVE_ISNAN # endif # ifndef soap_isnan # define soap_isnan(num) isNan(num) # endif # endif # ifdef WM_SECURE_KEY_STORAGE # include # endif #endif #ifdef WIN32 # ifndef HAVE_ISNAN # define HAVE_ISNAN # endif # define soap_isnan(n) _isnan(n) # ifndef HAVE_ISINF # define HAVE_ISINF # endif # define soap_isinf(n) (!_finite(n)) #endif #ifdef SUN_OS # define HAVE_ISNAN #endif #ifdef __APPLE__ # ifndef HAVE_ISNAN # define HAVE_ISNAN # endif # ifndef HAVE_ISINF # define HAVE_ISINF # endif #endif #if !defined(HAVE_ISNAN) && (defined(_MATH_H) || defined(_MATH_INCLUDED)) # define HAVE_ISNAN #endif union soap_double_nan {struct {unsigned int n1, n2;} iv; double dv; float fv;}; extern const union soap_double_nan soap_double_nan; extern const char soap_base64o[], soap_base64i[]; #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 (soap_double_nan.fv) #endif #ifndef FLT_PINFTY # if defined(INFINITY) # define FLT_PINFTY INFINITY # elif 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 (soap_double_nan.dv) #endif #ifndef DBL_PINFTY # if defined(INFINITY) # define DBL_PINFTY INFINITY # elif 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) ((n) != (n)) # endif #endif #ifndef soap_isinf # ifdef HAVE_ISINF # define soap_isinf(n) isinf(n) # else # define soap_isinf(n) (!soap_isnan(n) && soap_isnan((n) - (n))) # endif #endif #define soap_ispinfd(n) ((n) > 0 && soap_isinf(n)) #define soap_ispinff(n) ((n) > 0 && soap_isinf(n)) #define soap_isninfd(n) ((n) < 0 && soap_isinf(n)) #define soap_isninff(n) ((n) < 0 && soap_isinf(n)) /* Safer str & mem functions */ /* The gSOAP code uses guards to ensure that these functions are well behaved and do not raise errors. Therefore, the WIN _s functions should never execute the "invalid parameter handler". */ /* use safer snprintf if possible or guard sprintf against overrun (assumes no variadic macros) */ # ifdef HAVE_SNPRINTF # if _MSC_VER >= 1400 # define SOAP_SNPRINTF(buf, len, num) void)_snprintf_s((buf), (len), _TRUNCATE # define SOAP_SNPRINTF_SAFE(buf, len) void)_snprintf_s((buf), (len), _TRUNCATE # else # define SOAP_SNPRINTF(buf, len, num) void)snprintf((buf), (len) # define SOAP_SNPRINTF_SAFE(buf, len) void)snprintf((buf), (len) # endif # else # define SOAP_SNPRINTF(buf, len, num) (len) <= (num)) ? (void)((buf)[0] = '\0') : (void)sprintf((buf) # define SOAP_SNPRINTF_SAFE(buf, len) void)sprintf((buf) # endif /* copy string (truncating the result, strings must not be NULL) */ #if _MSC_VER >= 1400 # define soap_strcpy(buf, len, src) (void)strncpy_s((buf), (len), (src), _TRUNCATE) #elif defined(HAVE_STRLCPY) # define soap_strcpy(buf, len, src) (void)strlcpy((buf), (src), (len)) #else # define soap_strcpy(buf, len, src) (void)(strncpy((buf), (src), (len)), (buf)[(len) - 1] = '\0') #endif /* concat string (truncating the result, strings must not be NULL) */ #if _MSC_VER >= 1400 # define soap_strcat(buf, len, src) (void)strncat_s((buf), (len), (src), _TRUNCATE) #elif defined(HAVE_STRLCAT) # define soap_strcat(buf, len, src) (void)strlcat((buf), (src), (len)) #else SOAP_FMAC1 void SOAP_FMAC2 soap_strcat(char *buf, size_t len, const char *src); #endif /* copy string up to num chars (sets string to empty on overrun and returns nonzero, zero if OK) */ #if _MSC_VER >= 1400 # define soap_strncpy(buf, len, src, num) ((buf) == NULL || ((size_t)(len) > (size_t)(num) ? strncpy_s((buf), (len), (src), (num)) : ((buf)[0] = '\0', 1))) #else # define soap_strncpy(buf, len, src, num) ((buf) == NULL || ((size_t)(len) > (size_t)(num) ? (strncpy((buf), (src), (num)), (buf)[(size_t)(num)] = '\0') : ((buf)[0] = '\0', 1))) #endif /* concat string up to n chars (leaves destination intact on overrun and returns nonzero, zero if OK) */ #if _MSC_VER >= 1400 # define soap_strncat(buf, len, src, num) ((buf) == NULL || ((size_t)(len) > strlen((buf)) + (size_t)(num) ? strncat_s((buf), (len), (src), (num)) : 1)) #else SOAP_FMAC1 int SOAP_FMAC2 soap_strncat(char *buf, size_t len, const char *src, size_t num); #endif /* copy memory (returns SOAP_ERANGE on overrun, zero if OK, pointers must not be NULL) */ #if _MSC_VER >= 1400 # define soap_memcpy(buf, len, src, num) ((size_t)(len) >= (size_t)(num) ? memcpy_s((buf), (len), (src), (num)) : SOAP_ERANGE) #else # define soap_memcpy(buf, len, src, num) ((size_t)(len) >= (size_t)(num) ? !memcpy((buf), (src), (num)) : SOAP_ERANGE) #endif /* move memory (returns SOAP_ERANGE on overrun, zero if OK, pointers must not be NULL) */ #if _MSC_VER >= 1400 # define soap_memmove(buf, len, src, num) ((size_t)(len) >= (size_t)(num) ? memmove_s((buf), (len), (src), (num)) : SOAP_ERANGE) #else # define soap_memmove(buf, len, src, num) ((size_t)(len) >= (size_t)(num) ? !memmove((buf), (src), (num)) : SOAP_ERANGE) #endif /* gSOAP status and error codes */ typedef soap_int32 soap_status; #define SOAP_EOF 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 /* deprecated */ #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_PATCH_METHOD 17 #define SOAP_DEL_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 /* unused */ #define SOAP_REQUIRED 42 #define SOAP_PROHIBITED 43 #define SOAP_OCCURS 44 #define SOAP_LENGTH 45 #define SOAP_PATTERN 46 #define SOAP_FD_EXCEEDED 47 #define SOAP_UTF_ERROR 48 #define SOAP_NTLM_ERROR 49 #define SOAP_LEVEL 50 #define SOAP_FIXED 51 #define SOAP_EMPTY 52 #define SOAP_END_TAG 53 #define SOAP_ERR 99 #define soap_xml_error_check(e) \ ((e) == SOAP_TAG_MISMATCH || \ (e) == SOAP_NO_TAG || \ (e) == SOAP_IOB || \ (e) == SOAP_SYNTAX_ERROR || \ (e) == SOAP_NAMESPACE || \ (e) == SOAP_TYPE || \ (e) == SOAP_DUPLICATE_ID || \ (e) == SOAP_MISSING_ID || \ (e) == SOAP_REQUIRED || \ (e) == SOAP_PROHIBITED || \ (e) == SOAP_OCCURS || \ (e) == SOAP_LENGTH || \ (e) == SOAP_LEVEL || \ (e) == SOAP_PATTERN || \ (e) == SOAP_NULL || \ (e) == SOAP_HREF || \ (e) == SOAP_FIXED || \ (e) == SOAP_EMPTY || \ (e) == SOAP_END_TAG || \ (e) == SOAP_UTF_ERROR) #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 || \ (e) == SOAP_DATAENCODINGUNKNOWN) #define soap_http_error_check(e) \ ((e) == SOAP_HTTP_ERROR || \ (e) == SOAP_NO_DATA || \ ((e) >= SOAP_GET_METHOD && (e) <= SOAP_HTTP_METHOD) || \ ((e) >= 100 && (e) < 600)) #define soap_dime_error_check(e) \ ((e) == SOAP_DIME_ERROR || \ (e) == SOAP_DIME_HREF || \ (e) == SOAP_DIME_MISMATCH || \ (e) == SOAP_DIME_END) #define soap_mime_error_check(e) \ ((e) == SOAP_MIME_ERROR || \ (e) == SOAP_MIME_HREF || \ (e) == SOAP_MIME_END) #define soap_tcp_error_check(e) \ ((e) == SOAP_EOF || \ (e) == SOAP_TCP_ERROR) #define soap_udp_error_check(e) \ ((e) == SOAP_EOF || \ (e) == SOAP_UDP_ERROR) #define soap_ssl_error_check(e) ((e) == SOAP_SSL_ERROR) #define soap_zlib_error_check(e) ((e) == SOAP_ZLIB_ERROR) /* gSOAP HTTP response status codes 100 to 599 are reserved */ /* Codes 600 to 999 are user definable */ /* Exceptional gSOAP HTTP server response status codes >= 1000 */ #define SOAP_STOP 1000 /* No HTTP response should follow after SOAP_STOP is issued */ #define SOAP_FORM 1001 /* Request (form) data is present, no HTTP response should follow */ #define SOAP_HTML 1002 /* Custom HTML response */ #define SOAP_FILE 1200 /* Custom file-based response with soap::http_content and optional http status */ /* gSOAP HTTP method codes (client) */ typedef int soap_http_command; #define SOAP_POST 2000 /* POST request */ #define SOAP_POST_FILE 2001 /* Custom file-based POST request */ #define SOAP_GET 2002 /* GET request */ #define SOAP_PUT 2003 /* PUT request */ #define SOAP_PATCH 2004 /* PATCH request */ #define SOAP_DEL 2005 /* DELETE request */ #define SOAP_HEAD 2006 /* HEAD request */ #define SOAP_OPTIONS 2007 /* OPTIONS request */ #define SOAP_CONNECT 2008 /* CONNECT request */ /* 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 /* out: flush output immediately, no buffering */ #define SOAP_IO_BUFFER 0x00000001 /* out: buffer output in packets of size SOAP_BUFLEN */ #define SOAP_IO_STORE 0x00000002 /* out: store entire output to determine length for transport */ #define SOAP_IO_CHUNK 0x00000003 /* out: use HTTP chunked transfer AND buffer packets */ #define SOAP_IO_UDP 0x00000004 /* in/out: enable UDP instead of TCP */ #define SOAP_IO_LENGTH 0x00000008 /* out: calc message length (internal) */ #define SOAP_IO_KEEPALIVE 0x00000010 /* out: keep connection alive */ #define SOAP_ENC 0x00000FFF /* IO and ENC mask */ #define SOAP_ENC_LATIN 0x00000020 /* in: accept iso-8859-1 */ #define SOAP_ENC_PLAIN 0x00000040 /* out: plain (XML or other) body, no HTTP header */ #define SOAP_ENC_XML 0x00000040 /* deprecated, alias for SOAP_ENC_PLAIN */ #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_XML_STRICT 0x00001000 /* in: strict validation */ #define SOAP_XML_INDENT 0x00002000 /* out: emit indented XML */ #define SOAP_XML_IGNORENS 0x00004000 /* in: ignore namespaces */ #define SOAP_XML_DEFAULTNS 0x00008000 /* out: emit xmlns="..." */ #define SOAP_XML_CANONICAL 0x00010000 /* out: exc-C14N exclusive canonical XML */ #define SOAP_XML_TREE 0x00020000 /* in/out: XML tree (no id/ref) */ #define SOAP_XML_NIL 0x00040000 /* out: all NULLs as xsi:nil */ #define SOAP_XML_NOTYPE 0x00080000 /* out: do not add xsi:type */ #define SOAP_DOM_TREE 0x00100000 /* see DOM manual */ #define SOAP_DOM_NODE 0x00200000 #define SOAP_DOM_ASIS 0x00400000 #define SOAP_XML_CANONICAL_NA 0x00800000 /* out: (exc) C14N not QName aware */ #define SOAP_C_NOIOB 0x01000000 /* don't fault on array index out of bounds (just ignore) */ #define SOAP_C_UTFSTRING 0x02000000 /* (de)serialize strings with UTF8 content */ #define SOAP_C_MBSTRING 0x04000000 /* (de)serialize strings with multi-byte content */ #define SOAP_C_NILSTRING 0x08000000 /* serialize empty strings as nil (omitted) */ #define SOAP_XML_DOM 0x10000000 /* enable internal DOM */ #define SOAP_XML_GRAPH 0x20000000 /* force id-ref XML graph */ #define SOAP_MIME_POSTCHECK 0x40000000 /* MIME flag (internal) */ #define SOAP_SEC_WSUID 0x80000000 /* Add Body wsu:Id flag (internal) */ /* WITH_XMLNS backward compatibility: always use XML default namespaces */ #ifdef WITH_XMLNS # define SOAP_IO_DEFAULT (SOAP_IO_FLUSH | SOAP_XML_DEFAULTNS) #else # define SOAP_IO_DEFAULT SOAP_IO_FLUSH #endif /* SSL client/server authentication settings */ #define SOAP_SSL_NO_AUTHENTICATION (0x0000) /* no authentication */ #define SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION (0x0001) /* client requires server to authenticate */ #define SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION (0x0002) /* server requires client to authenticate */ #define SOAP_SSL_SKIP_HOST_CHECK (0x0004) /* client skips common name check against host name */ #define SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE (0x0008) /* allow self-signed and expired certificates and those w/o CRL */ #define SOAP_SSL_NO_DEFAULT_CA_PATH (0x0010) /* don't use SSL_CTX_set_default_verify_paths */ #define SOAP_SSL_RSA (0x0020) /* use RSA */ #define SOAP_SSLv3 (0x0080) /* enable SSL v3 */ #define SOAP_TLSv1_0 (0x0100) /* enable TLS v1.0 */ #define SOAP_TLSv1_1 (0x0200) /* enable TLS v1.1 */ #define SOAP_TLSv1_2 (0x0400) /* enable TLS v1.2 */ #define SOAP_TLSv1_3 (0x0800) /* enable TLS v1.3 */ #define SOAP_TLSv1 (SOAP_TLSv1_0 | SOAP_TLSv1_1 | SOAP_TLSv1_2 | SOAP_TLSv1_3) #define SOAP_SSLv3_TLSv1 (SOAP_SSLv3 | SOAP_TLSv1) #define SOAP_SSL_CLIENT (0x8000) /* client context flag for internal use */ #define SOAP_SSL_DEFAULT SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION typedef unsigned short soap_ssl_flags; /* 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)) /* parts */ #define SOAP_END 0 #define SOAP_BEGIN_SEND 1 #define SOAP_BEGIN_RECV 2 #define SOAP_IN_ENVELOPE 3 #define SOAP_IN_HEADER 4 #define SOAP_END_HEADER 5 #define SOAP_NO_BODY 6 #define SOAP_IN_BODY 7 #define SOAP_END_BODY 8 #define SOAP_END_ENVELOPE 9 /* events */ #define SOAP_SEC_BEGIN 1 #define SOAP_SEC_SIGN 2 #define SOAP_SEC_DECRYPT 3 /* DEBUG macros */ #ifdef DEBUG_STAMP # ifndef DEBUG # define DEBUG # endif #endif #ifdef DEBUG # ifndef SOAP_DEBUG # define SOAP_DEBUG # endif # ifndef SOAP_MEM_DEBUG # define SOAP_MEM_DEBUG # 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__, (void*)(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((void*)(ptr)) #endif #ifndef SOAP_MALLOC_UNMANAGED /* use libc malloc to alloc soap context with soap_new() */ # define SOAP_MALLOC_UNMANAGED(size) malloc((size)) #endif #ifndef SOAP_FREE_UNMANAGED /* use libc free to free soap context with soap_free() */ # define SOAP_FREE_UNMANAGED(ptr) free((void*)(ptr)) #endif #ifndef SOAP_NOTHROW # if defined(__GNUC__) && (__GNUC__ <= 2) # define SOAP_NOTHROW # elif defined(WITH_LEAN) || defined(WITH_COMPAT) # define SOAP_NOTHROW # else # define SOAP_NOTHROW (std::nothrow) # endif #endif #if defined(__BORLANDC__) && !defined(__clang__) /* Embarcadero Classic compiler special case */ # ifndef SOAP_NEW # define SOAP_NEW(soap, type) new SOAP_NOTHROW (type) # endif # ifndef SOAP_NEW_ARRAY # define SOAP_NEW_ARRAY(soap, type, n) new SOAP_NOTHROW (type[n]) # endif # ifndef SOAP_PLACEMENT_NEW # define SOAP_PLACEMENT_NEW(soap, buf, type) new (buf) (type) # endif #elif (defined(__GNUC__) && (__GNUC__ <= 2)) || defined(__clang__) || defined(_AIX) || defined(AIX) /* old form w/o parenthesis, soap context may be NULL */ # ifndef SOAP_NEW # define SOAP_NEW(soap, type) new SOAP_NOTHROW type # endif # ifndef SOAP_NEW_ARRAY # define SOAP_NEW_ARRAY(soap, type, n) new SOAP_NOTHROW type[n] # endif # ifndef SOAP_PLACEMENT_NEW # define SOAP_PLACEMENT_NEW(soap, buf, type) new (buf) type # endif #else /* new form with parenthesis for (type) but not type[n], soap context may be NULL */ # ifndef SOAP_NEW # define SOAP_NEW(soap, type) new SOAP_NOTHROW (type) # endif # ifndef SOAP_NEW_ARRAY # define SOAP_NEW_ARRAY(soap, type, n) new SOAP_NOTHROW type[n] # endif # ifndef SOAP_PLACEMENT_NEW # define SOAP_PLACEMENT_NEW(soap, buf, type) new (buf) (type) # endif #endif #ifndef SOAP_DELETE /* use C++ delete operator, soap context may be NULL */ # define SOAP_DELETE(soap, obj, type) delete obj #endif #ifndef SOAP_DELETE_ARRAY /* use C++ delete[] operator, soap context may be NULL */ # define SOAP_DELETE_ARRAY(soap, obj, type) delete[] obj #endif #ifndef SOAP_NEW_UNMANAGED /* use C++ unmanaged new operator for soap_new() and soap::copy() */ # define SOAP_NEW_UNMANAGED(soap) new SOAP_NOTHROW soap #endif #ifndef SOAP_DELETE_UNMANAGED /* use C++ unmanaged delete operator for soap_free() */ # define SOAP_DELETE_UNMANAGED(soap) delete soap #endif #ifdef SOAP_DEBUG # ifndef SOAP_MESSAGE # define SOAP_MESSAGE fprintf # endif # ifndef DBGLOG # ifdef DEBUG_STAMP # ifdef WIN32 # 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];\ SYSTEMTIME _localTime;\ ::GetLocalTime(&_localTime); \ fprintf(fdebug, "%02d%02d%02d %02d:%02d:%02d.%03d|", (int)_localTime.wYear%100, (int)_localTime.wMonth, (int)_localTime.wDay, (int)_localTime.wHour, (int)_localTime.wMinute, (int)_localTime.wSecond, (int)_localTime.wMilliseconds);\ CMD;\ fflush(fdebug);\ }\ }\ } # else # 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];\ struct timeval _tv;\ struct tm _tm;\ gettimeofday(&_tv, NULL);\ localtime_r(&_tv.tv_sec, &_tm);\ fprintf(fdebug, "%02d%02d%02d %02d:%02d:%02d.%06ld|", (int)_tm.tm_year%100, (int)_tm.tm_mon+1, (int)_tm.tm_mday, (int)_tm.tm_hour, (int)_tm.tm_min, (int)_tm.tm_sec, (long)_tv.tv_usec);\ CMD;\ fflush(fdebug);\ }\ }\ } # endif # else # 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 # 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((void*)(MSG), 1, (size_t)(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))) # define DBGFUN4(FNAME, FMT1, ARG1, FMT2, ARG2, FMT3, ARG3, FMT4, ARG4) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s(" FMT1 ", " FMT2 ", " FMT3 ", " FMT4 ")\n", __FILE__, __LINE__, FNAME, (ARG1), (ARG2), (ARG3), (ARG4))) # 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 DBGFUN4(FNAME, FMT1, ARG1, FMT2, ARG2, FMT3, ARG3, FMT4, ARG4) # 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; /* forward declaration */ struct SOAP_CMAC soap; /* namespace table row */ struct SOAP_CMAC 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 */ const 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 id[0...] below this struct */ }; /* block header, the data flows into the allocated region below this struct */ struct soap_bhead { struct soap_bhead *next; size_t size; }; /* block stack for nested block allocations */ struct soap_blist { struct soap_blist *next; struct soap_bhead *head; size_t size; size_t item; }; /* pointer serialization management */ struct soap_plist { struct soap_plist *next; const void *ptr; void *dup; const void *array; /* array pointer */ int size; /* array size */ int type; int id; char mark1; /* 0=single-ref, 1=embedded-multi-ref (SOAP1.1), 2=multi-ref, 3=attachment */ 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; /* array size */ int (*fdelete)(struct soap*, struct soap_clist*); }; /* attributes */ struct soap_attribute { struct soap_attribute *next; short flag; /* soap_set_attr: 1 = normal, 2 = utf content */ char *value; size_t size; const char *ns; short visible; char name[1]; /* the actual name string flows into the allocated region below this struct */ }; #if !defined(WITH_LEAN) || defined(WITH_COOKIES) struct soap_cookie { struct soap_cookie *next; char *name; char *value; char *domain; char *path; ULONG64 expire; /* client-side: local time to expire (value cast to time_t) */ 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 SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_next_multipart(struct soap_multipart*); #ifdef __cplusplus 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; } struct soap_multipart *operator->() const { return content; } soap_multipart_iterator& operator++() { content = soap_next_multipart(content); return *this; } soap_multipart_iterator operator++(int) { soap_multipart_iterator iter(*this); content = soap_next_multipart(content); return iter; } 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; const 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 /* dom.c[pp] functions (optional, compile and link dom.c[pp] */ struct SOAP_CMAC soap_dom_element; struct SOAP_CMAC soap_dom_attribute; /* soap_dom_element construction */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_new(struct soap *soap, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_new_w(struct soap *soap, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_set(struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_set_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att(struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt(struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_nth_elt(struct soap_dom_element *elt, const char *ns, const char *tag, size_t n); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_nth_elt_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag, size_t n); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_nth(struct soap_dom_element *elt, size_t n); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_att(struct soap_dom_element *elt, const struct soap_dom_attribute *node); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_elt(struct soap_dom_element *elt, const struct soap_dom_element *node); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_atts(struct soap_dom_element *elt, const struct soap_dom_attribute *atts); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_elts(struct soap_dom_element *elt, const struct soap_dom_element *elts); /* soap_dom_element assignment */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_bool(struct soap_dom_element *elt, LONG64 b); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_int(struct soap_dom_element *elt, LONG64 n); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_double(struct soap_dom_element *elt, double x); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_text(struct soap_dom_element *elt, const char *text); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_text_w(struct soap_dom_element *elt, const wchar_t *text); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_node(struct soap_dom_element *elt, const void *node, int type); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_copy(struct soap_dom_element *elt, const struct soap_dom_element *node); /* soap_dom_element properties */ SOAP_FMAC1 int SOAP_FMAC2 soap_elt_match(const struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_match_w(const struct soap_dom_element *elt, const char *ns, const wchar_t *patt); SOAP_FMAC1 const char * SOAP_FMAC2 soap_elt_get_ns(const struct soap_dom_element *elt); SOAP_FMAC1 const char * SOAP_FMAC2 soap_elt_get_tag(const struct soap_dom_element *elt); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_is_true(const struct soap_dom_element *elt); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_is_false(const struct soap_dom_element *elt); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_get_int(const struct soap_dom_element *elt); SOAP_FMAC1 long SOAP_FMAC2 soap_elt_get_long(const struct soap_dom_element *elt); SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_elt_get_LONG64(const struct soap_dom_element *elt); SOAP_FMAC1 double SOAP_FMAC2 soap_elt_get_double(const struct soap_dom_element *elt); SOAP_FMAC1 const char * SOAP_FMAC2 soap_elt_get_text(const struct soap_dom_element *elt); SOAP_FMAC1 const void * SOAP_FMAC2 soap_elt_get_node(const struct soap_dom_element *elt, int type); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_get_type(const struct soap_dom_element *elt, const void **node); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_parent(const struct soap_dom_element *elt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_depth(const struct soap_dom_element *elt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_index(const struct soap_dom_element *elt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_len(const struct soap_dom_element *elt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_nth(const struct soap_dom_element *elt); /* soap_dom_attribute construction */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_new(struct soap *soap, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_new_w(struct soap *soap, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_set(struct soap_dom_attribute *att, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_set_w(struct soap_dom_attribute *att, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_add(struct soap_dom_attribute *att, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_add_w(struct soap_dom_attribute *att, const char *ns, const wchar_t *tag); /* soap_dom_attribute assignment */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_bool(struct soap_dom_attribute *att, LONG64 b); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_int(struct soap_dom_attribute *att, LONG64 n); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_double(struct soap_dom_attribute *att, double x); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_text(struct soap_dom_attribute *att, const char *text); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_text_w(struct soap_dom_attribute *att, const wchar_t *text); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_copy(struct soap_dom_attribute *att, const struct soap_dom_attribute *node); /* soap_dom_attribute properties */ SOAP_FMAC1 int SOAP_FMAC2 soap_att_match(const struct soap_dom_attribute *att, const char *ns, const char *patt); SOAP_FMAC1 int SOAP_FMAC2 soap_att_match_w(const struct soap_dom_attribute *att, const char *ns, const wchar_t *patt); SOAP_FMAC1 const char * SOAP_FMAC2 soap_att_get_ns(const struct soap_dom_attribute *att); SOAP_FMAC1 const char * SOAP_FMAC2 soap_att_get_tag(const struct soap_dom_attribute *att); SOAP_FMAC1 int SOAP_FMAC2 soap_att_is_true(const struct soap_dom_attribute *att); SOAP_FMAC1 int SOAP_FMAC2 soap_att_is_false(const struct soap_dom_attribute *att); SOAP_FMAC1 int SOAP_FMAC2 soap_att_get_int(const struct soap_dom_attribute *att); SOAP_FMAC1 long SOAP_FMAC2 soap_att_get_long(const struct soap_dom_attribute *att); SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_att_get_LONG64(const struct soap_dom_attribute *att); SOAP_FMAC1 double SOAP_FMAC2 soap_att_get_double(const struct soap_dom_attribute *att); SOAP_FMAC1 const char * SOAP_FMAC2 soap_att_get_text(const struct soap_dom_attribute *att); /* DOM local traversal */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_first(struct soap_dom_element *elt); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_next(const struct soap_dom_attribute *att); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_first(struct soap_dom_element *elt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_next(const struct soap_dom_element *elt); /* DOM local retrieval */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_get(const struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_get_w(const struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get(const struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get_w(const struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get_next(const struct soap_dom_element *elt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get_nth(struct soap_dom_element *elt, size_t n); /* DOM local search */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_find(struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_find_next(const struct soap_dom_attribute *att, const char *ns, const char *patt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find(struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find_next(const struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find_type(struct soap_dom_element *elt, const char *ns, const char *patt, int type); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find_next_type(const struct soap_dom_element *elt, const char *ns, const char *patt, int type); /* DOM size of local search results */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_att_size(struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_size(struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_size_type(struct soap_dom_element *elt, const char *ns, const char *patt, int type); /* DOM deep traversal */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_dom_next_attribute(const struct soap_dom_attribute *att); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_next_element(const struct soap_dom_element *elt, const struct soap_dom_element *end); /* DOM deep search */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_find(struct soap_dom_element *begin, const struct soap_dom_element *end, const char *ns, const char *patt, int type); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_find_next(const struct soap_dom_element *elt, const struct soap_dom_element *end, const char *ns, const char *patt, int type); #endif #if defined(__cplusplus) } /* extern "C" */ #endif #ifndef WITH_LEANER #ifdef __cplusplus class SOAP_CMAC soap_dom_attribute_iterator { public: struct soap_dom_attribute *iter; 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; struct soap_dom_attribute *operator->() const; soap_dom_attribute_iterator& operator++(); soap_dom_attribute_iterator operator++(int); soap_dom_attribute_iterator(); soap_dom_attribute_iterator(struct soap_dom_attribute*); ~soap_dom_attribute_iterator(); }; #endif #endif #ifndef WITH_LEANER struct SOAP_CMAC soap_dom_attribute { struct soap_dom_attribute *next; const char *nstr; const char *name; const char *text; struct soap *soap; #ifdef __cplusplus typedef soap_dom_attribute_iterator iterator; soap_dom_attribute(struct soap *soap = NULL); soap_dom_attribute(const soap_dom_attribute& att); soap_dom_attribute(struct soap *soap, const char *tag); soap_dom_attribute(struct soap *soap, const wchar_t *tag); soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const char *text); soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const wchar_t *text); soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const char *text); soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const wchar_t *text); soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const std::string& text); soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const std::wstring& text); soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const std::string& text); soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const std::wstring& text); ~soap_dom_attribute(); soap_dom_attribute& set(const char *ns, const char *tag) { return *soap_att_set(this, ns, tag); } soap_dom_attribute& set(const char *ns, const wchar_t *tag) { return *soap_att_set_w(this, ns, tag); } soap_dom_attribute& set(bool b) { return *soap_att_bool(this, b); } soap_dom_attribute& set(int n) { return *soap_att_int(this, n); } soap_dom_attribute& set(LONG64 n) { return *soap_att_int(this, n); } soap_dom_attribute& set(float x) { return *soap_att_double(this, x); } soap_dom_attribute& set(double x) { return *soap_att_double(this, x); } soap_dom_attribute& set(const char *text) { return *soap_att_text(this, text); } soap_dom_attribute& set(const wchar_t *text) { return *soap_att_text_w(this, text); } #ifndef WITH_COMPAT soap_dom_attribute& set(const std::string& text) { return *soap_att_text(this, text.c_str()); } soap_dom_attribute& set(const std::wstring& text) { return *soap_att_text_w(this, text.c_str()); } #endif soap_dom_attribute& operator=(bool b) { return *soap_att_bool(this, b); } soap_dom_attribute& operator=(int n) { return *soap_att_int(this, n); } soap_dom_attribute& operator=(LONG64 n) { return *soap_att_int(this, n); } soap_dom_attribute& operator=(float x) { return *soap_att_double(this, x); } soap_dom_attribute& operator=(double x) { return *soap_att_double(this, x); } soap_dom_attribute& operator=(const char *text) { return *soap_att_text(this, text); } soap_dom_attribute& operator=(const wchar_t *text) { return *soap_att_text_w(this, text); } #ifndef WITH_COMPAT soap_dom_attribute& operator=(const std::string& text) { return *soap_att_text(this, text.c_str()); } soap_dom_attribute& operator=(const std::wstring& text) { return *soap_att_text_w(this, text.c_str()); } #endif soap_dom_attribute& operator=(const soap_dom_attribute& att) { return *soap_att_copy(this, &att); } soap_dom_attribute& att(const char *tag) { return *soap_att_add(this, NULL, tag); } soap_dom_attribute& att(const wchar_t *tag) { return *soap_att_add_w(this, NULL, tag); } soap_dom_attribute& att(const char *ns, const char *tag) { return *soap_att_add(this, ns, tag); } soap_dom_attribute& att(const char *ns, const wchar_t *tag) { return *soap_att_add_w(this, ns, tag); } bool match(const char *patt) const { return soap_att_match(this, NULL, patt) != 0; } bool match(const wchar_t *patt) const { return soap_att_match_w(this, NULL, patt) != 0; } bool match(const char *ns, const char *patt) const { return soap_att_match(this, ns, patt) != 0; } bool match(const char *ns, const wchar_t *patt) const { return soap_att_match_w(this, ns, patt) != 0; } const char *ns() const { return this->nstr; } const char *tag() const { return this->name; } bool is_true() const { return soap_att_is_true(this) != 0; } bool is_false() const { return soap_att_is_false(this) != 0; } LONG64 get_int() const { return soap_att_get_LONG64(this); } double get_double() const { return soap_att_get_double(this); } const char *get_text() const { return this->text; } operator bool() const { return soap_att_is_true(this) != 0; } operator int() const { return soap_att_get_int(this); } operator LONG64() const { return soap_att_get_LONG64(this); } operator double() const { return soap_att_get_double(this); } operator const char*() const { return this->text; } soap_dom_attribute_iterator att_begin() { return soap_dom_attribute_iterator(this); } soap_dom_attribute_iterator att_end() { return soap_dom_attribute_iterator(NULL); } soap_dom_attribute_iterator att_find(const char *patt) { return att_find(NULL, patt); } soap_dom_attribute_iterator att_find(const wchar_t *patt) { return att_find(NULL, patt); } soap_dom_attribute_iterator att_find(const char *ns, const char *patt); soap_dom_attribute_iterator att_find(const char *ns, const wchar_t *patt); void unlink(); #endif }; #endif #ifndef WITH_LEANER #ifdef __cplusplus class SOAP_CMAC soap_dom_element_iterator { public: struct soap_dom_element *iter; struct soap_dom_element *stop; const char *nstr; const char *name; int type; bool deep; bool operator==(const soap_dom_element_iterator&) const; bool operator!=(const soap_dom_element_iterator&) const; struct soap_dom_element& operator*() const; struct soap_dom_element *operator->() const; soap_dom_element_iterator& operator++(); soap_dom_element_iterator operator++(int); soap_dom_element_iterator(); soap_dom_element_iterator(struct soap_dom_element*); ~soap_dom_element_iterator(); }; #endif #endif #ifndef WITH_LEANER struct SOAP_CMAC soap_dom_element { struct soap_dom_element *next; struct soap_dom_element *prnt; struct soap_dom_element *elts; struct soap_dom_attribute *atts; const char *nstr; const char *name; const char *lead; const char *text; const char *code; const char *tail; const void *node; int type; struct soap *soap; #ifdef __cplusplus typedef soap_dom_element_iterator iterator; soap_dom_element(struct soap *soap = NULL); soap_dom_element(const soap_dom_element& elt); soap_dom_element(struct soap *soap, const char *tag); soap_dom_element(struct soap *soap, const wchar_t *tag); soap_dom_element(struct soap *soap, const char *ns, const char *tag); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag); soap_dom_element(struct soap *soap, const char *ns, const char *tag, const char *text); soap_dom_element(struct soap *soap, const char *ns, const char *tag, const wchar_t *text); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const char *text); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const wchar_t *text); #ifndef WITH_COMPAT soap_dom_element(struct soap *soap, const char *ns, const char *tag, const std::string& text); soap_dom_element(struct soap *soap, const char *ns, const char *tag, const std::wstring& text); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const std::string& text); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const std::wstring& text); #endif soap_dom_element(struct soap *soap, const char *ns, const char *tag, const void *node, int type); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const void *node, int type); ~soap_dom_element(); soap_dom_element& set(const char *ns, const char *tag) { return *soap_elt_set(this, ns, tag); } soap_dom_element& set(const char *ns, const wchar_t *tag) { return *soap_elt_set_w(this, ns, tag); } soap_dom_element& set(bool b) { return *soap_elt_bool(this, b); } soap_dom_element& set(int n) { return *soap_elt_int(this, n); } soap_dom_element& set(LONG64 n) { return *soap_elt_int(this, n); } soap_dom_element& set(float x) { return *soap_elt_double(this, x); } soap_dom_element& set(double x) { return *soap_elt_double(this, x); } soap_dom_element& set(const char *text) { return *soap_elt_text(this, text); } soap_dom_element& set(const wchar_t *text) { return *soap_elt_text_w(this, text); } #ifndef WITH_COMPAT soap_dom_element& set(const std::string& text) { return *soap_elt_text(this, text.c_str()); } soap_dom_element& set(const std::wstring& text) { return *soap_elt_text_w(this, text.c_str()); } #endif soap_dom_element& set(const void *node, int type) { return *soap_elt_node(this, node, type); } soap_dom_element& add(soap_dom_element& elt) { return *soap_add_elt(this, &elt); } soap_dom_element& add(soap_dom_element *elt) { return *soap_add_elt(this, elt); } soap_dom_element& add(soap_dom_attribute& att) { return *soap_add_att(this, &att); } soap_dom_element& add(soap_dom_attribute *att) { return *soap_add_att(this, att); } soap_dom_element& adds(soap_dom_element& elts) { return *soap_add_elts(this, &elts); } soap_dom_element& adds(soap_dom_element *elts) { return *soap_add_elts(this, elts); } soap_dom_element& adds(soap_dom_attribute& atts) { return *soap_add_atts(this, &atts); } soap_dom_element& adds(soap_dom_attribute *atts) { return *soap_add_atts(this, atts); } soap_dom_element& operator=(bool b) { return *soap_elt_bool(this, b); } soap_dom_element& operator=(int n) { return *soap_elt_int(this, n); } soap_dom_element& operator=(LONG64 n) { return *soap_elt_int(this, n); } soap_dom_element& operator=(float x) { return *soap_elt_double(this, x); } soap_dom_element& operator=(double x) { return *soap_elt_double(this, x); } soap_dom_element& operator=(const char *text) { return *soap_elt_text(this, text); } soap_dom_element& operator=(const wchar_t *text) { return *soap_elt_text_w(this, text); } #ifndef WITH_COMPAT soap_dom_element& operator=(const std::string& text) { return *soap_elt_text(this, text.c_str()); } soap_dom_element& operator=(const std::wstring& text) { return *soap_elt_text_w(this, text.c_str()); } #endif soap_dom_element& operator=(const soap_dom_element& elt) { return *soap_elt_copy(this, &elt); } template soap_dom_element& operator=(const T& node) { return this->set(&node, node.soap_type()); } template soap_dom_element& operator=(const T *node) { return this->set(node, node->soap_type()); } template soap_dom_element& operator=(T *node) { return this->set(node, node->soap_type()); } soap_dom_attribute& att(const char *tag) { return *soap_att(this, NULL, tag); } soap_dom_attribute& att(const wchar_t *tag) { return *soap_att_w(this, NULL, tag); } soap_dom_attribute& att(const char *ns, const char *tag) { return *soap_att(this, ns, tag); } soap_dom_attribute& att(const char *ns, const wchar_t *tag) { return *soap_att_w(this, ns, tag); } soap_dom_element& elt() { return *soap_elt(this, NULL, NULL); } soap_dom_element& elt(const char *tag) { return *soap_elt(this, NULL, tag); } soap_dom_element& elt(const wchar_t *tag) { return *soap_elt_w(this, NULL, tag); } soap_dom_element& elt(const char *ns, const char *tag) { return *soap_elt(this, ns, tag); } soap_dom_element& elt(const char *ns, const wchar_t *tag) { return *soap_elt_w(this, ns, tag); } soap_dom_element& operator[](const char *tag) { return *soap_elt(this, NULL, tag); } soap_dom_element& operator[](const wchar_t *tag) { return *soap_elt_w(this, NULL, tag); } soap_dom_element& operator[](size_t n) { return *soap_nth(this, n); } soap_dom_attribute *att_get(const char *tag) const { return soap_att_get(this, NULL, tag); } soap_dom_attribute *att_get(const wchar_t *tag) const { return soap_att_get_w(this, NULL, tag); } soap_dom_attribute *att_get(const char *ns, const char *tag) const { return soap_att_get(this, ns, tag); } soap_dom_attribute *att_get(const char *ns, const wchar_t *tag) const { return soap_att_get_w(this, ns, tag); } soap_dom_element *elt_get() const { return soap_elt_get(this, NULL, NULL); } soap_dom_element *elt_get(const char *tag) const { return soap_elt_get(this, NULL, tag); } soap_dom_element *elt_get(const wchar_t *tag) const { return soap_elt_get_w(this, NULL, tag); } soap_dom_element *elt_get(const char *ns, const char *tag) const { return soap_elt_get(this, ns, tag); } soap_dom_element *elt_get(const char *ns, const wchar_t *tag) const { return soap_elt_get_w(this, ns, tag); } soap_dom_element *get_next() const { return soap_elt_get_next(this); } soap_dom_element *get_nth(size_t n) { return soap_elt_get_nth(this, n); } bool match(const char *patt) const { return soap_elt_match(this, NULL, patt) != 0; } bool match(const wchar_t *patt) const { return soap_elt_match_w(this, NULL, patt) != 0; } bool match(const char *ns, const char *patt) const { return soap_elt_match(this, ns, patt) != 0; } bool match(const char *ns, const wchar_t *patt) const { return soap_elt_match_w(this, ns, patt) != 0; } const char *ns() const { return this->nstr; } const char *tag() const { return this->name; } soap_dom_element *parent() { return this->prnt; } size_t depth() const { return soap_elt_depth(this); } size_t index() const { return soap_elt_index(this); } size_t len() const { return soap_elt_len(this); } size_t nth() const { return soap_elt_nth(this); } size_t elt_size() { return soap_elt_size(this, NULL, NULL); } size_t elt_size(const char *patt, int type = 0) { return elt_size(NULL, patt, type); } size_t elt_size(const char *ns, const char *patt, int type = 0) { return soap_elt_size_type(this, ns, patt, type); } size_t att_size() { return soap_att_size(this, NULL, NULL); } size_t att_size(const char *patt) { return att_size(NULL, patt); } #ifndef WITH_COMPAT size_t att_size(const std::string& patt) { return att_size(NULL, patt); } #endif size_t att_size(const char *ns, const char *patt) { return soap_att_size(this, ns, patt); } #ifndef WITH_COMPAT size_t att_size(const char *ns, const std::string& patt) { return soap_att_size(this, ns, patt.c_str()); } #endif bool is_true() const { return soap_elt_is_true(this) != 0; } bool is_false() const { return soap_elt_is_false(this) != 0; } LONG64 get_int() const { return soap_elt_get_LONG64(this); } double get_double() const { return soap_elt_get_double(this); } const char *get_text() const { return this->text; } const void *get_node(int type) const { return soap_elt_get_node(this, type); } int get_type(const void **node) const { return soap_elt_get_type(this, node); } operator bool() const { return soap_elt_is_true(this) != 0; } operator int() const { return soap_elt_get_int(this); } operator LONG64() const { return soap_elt_get_LONG64(this); } operator double() const { return soap_elt_get_double(this); } operator const char*() const { return this->text; } soap_dom_element_iterator begin(); soap_dom_element_iterator end() { return soap_dom_element_iterator(NULL); } soap_dom_element_iterator elt_begin() { return soap_dom_element_iterator(this->elts); } soap_dom_element_iterator elt_end() { return soap_dom_element_iterator(NULL); } soap_dom_attribute_iterator att_begin() { return soap_dom_attribute_iterator(this->atts); } soap_dom_attribute_iterator att_end() { return soap_dom_attribute_iterator(NULL); } soap_dom_element_iterator find(const char *patt, int type = 0) { return find(NULL, patt, type); } soap_dom_element_iterator find(const wchar_t *patt, int type = 0) { return find(NULL, patt, type); } soap_dom_element_iterator find(const char *ns, const char *patt, int type = 0); soap_dom_element_iterator find(const char *ns, const wchar_t *patt, int type = 0); soap_dom_element_iterator find(int type); soap_dom_element_iterator elt_find(const char *patt, int type = 0) { return elt_find(NULL, patt, type); } soap_dom_element_iterator elt_find(const wchar_t *patt, int type = 0) { return elt_find(NULL, patt, type); } soap_dom_element_iterator elt_find(const char *ns, const char *patt, int type = 0); soap_dom_element_iterator elt_find(const char *ns, const wchar_t *patt, int type = 0); soap_dom_element_iterator elt_find(int type); soap_dom_attribute_iterator att_find(const char *patt) { return att_find(NULL, patt); } soap_dom_attribute_iterator att_find(const wchar_t *patt) { return att_find(NULL, patt); } soap_dom_attribute_iterator att_find(const char *ns, const char *patt); soap_dom_attribute_iterator att_find(const char *ns, const wchar_t *patt); void unlink(); #endif }; #endif #ifndef WITH_LEANER SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dup_xsd__anyType(struct soap *soap, struct soap_dom_element *d, const struct soap_dom_element *a); SOAP_FMAC1 void SOAP_FMAC2 soap_del_xsd__anyType(const struct soap_dom_element *a); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_dup_xsd__anyAttribute(struct soap *soap, struct soap_dom_attribute *d, const struct soap_dom_attribute *a); SOAP_FMAC1 void SOAP_FMAC2 soap_del_xsd__anyAttribute(const struct soap_dom_attribute *a); SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element *in, struct soap_dom_element *out); #endif #ifndef WITH_LEANER #if defined(__cplusplus) && !defined(WITH_COMPAT) extern std::ostream &operator<<(std::ostream&, const struct soap_dom_element&); extern std::istream &operator>>(std::istream&, struct soap_dom_element&); SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element& in, struct soap_dom_element& out); SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element *in, struct soap_dom_element& out); SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element& in, struct soap_dom_element *out); #endif #endif #if defined(__cplusplus) extern "C" { #endif /******************************************************************************/ struct SOAP_CMAC 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), 0 indicates non-SOAP content */ soap_mode mode; /* internal mode flag, combines imode/omode */ soap_mode imode; /* input mode flag set with soap_init1(), soap_new1(), or soap_set_imode() */ soap_mode omode; /* ouput mode flag set with soap_init1(), soap_new1(), or soap_set_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 *long_double_format;/* user-definable format string for long doubles (<1024 chars) */ const char *dime_id_format; /* user-definable format string for integer DIME id ( 0, sets max message size that can be received */ int recv_timeout; /* user-definable, when > 0, sets socket recv stall timeout in seconds, < 0 in usec */ int send_timeout; /* user-definable, when > 0, sets socket send stall timeout in seconds, < 0 in usec */ int transfer_timeout; /* user-definable, when > 0, sets socket total transfer timeout in seconds, < 0 in usec */ int connect_timeout; /* user-definable, when > 0, sets socket connect() timeout in seconds, < 0 in usec */ int accept_timeout; /* user-definable, when > 0, sets socket accept() timeout in seconds, < 0 in usec */ int socket_flags; /* user-definable socket recv() and send() flags, e.g. set to MSG_NOSIGNAL to disable sigpipe */ int connect_flags; /* user-definable connect() SOL_SOCKET sockopt flags, e.g. set to SO_DEBUG to debug socket */ int connect_retry; /* number of times to retry connecting (exponential backoff), zero by default */ int bind_flags; /* user-definable bind() SOL_SOCKET sockopt flags, e.g. set to SO_REUSEADDR to enable reuse */ short bind_inet6; /* user-definable, when > 0 use AF_INET6 instead of PF_UNSPEC (only with -DWITH_IPV6) */ short bind_v6only; /* user-definable, when > 0 use IPPROTO_IPV6 sockopt IPV6_V6ONLY (only with -DWITH_IPV6) */ int accept_flags; /* user-definable accept() SOL_SOCKET sockopt flags */ #ifdef WITH_SELF_PIPE int pipe_fd[2]; /* self pipe trick file descriptors used to close the select call from another thread */ #endif int sndbuf; /* user-definable SO_SNDBUF setsockopt value */ int rcvbuf; /* user-definable SO_RCVBUF setsockopt value */ unsigned short linger_time; /* user-definable linger time for SO_LINGER option */ unsigned int maxlevel; /* user-definable max XML nesting depth levels, initialized to SOAP_MAXLEVEL */ long maxlength; /* user-definable max string length, initialized to SOAP_MAXLENGTH, maxlength<=0 is unbounded */ size_t maxoccurs; /* user-definable max array/container size, initialized to SOAP_MAXOCCURS */ const char *http_version; /* HTTP version used "1.0" or "1.1" */ const char *http_content; /* optional custom HTTP content type (with SOAP_PUT, SOAP_POST_FILE, SOAP_FILE) */ const char *http_extra_header;/* optional custom HTTP header of the form 'key: val' (multiple headers should be separated in the string by \r\n - crlf) */ const char *encodingStyle; /* default = "" which means that SOAP encoding is used */ const char *actor; /* SOAP-ENV:actor or role attribute value */ const char *lang; /* user-definable xml:lang attribute value of SOAP-ENV:Text */ 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 */ #if !defined(WITH_LEANER) || !defined(WITH_NOIDREF) struct soap_ilist *iht[SOAP_IDHASH]; #endif struct soap_plist *pht[SOAP_PTRHASH]; struct soap_pblk *pblk; /* plist block allocation */ short pidx; /* plist block allocation */ short shaky; /* objects in reallocatable containers are on shaky grounds */ struct SOAP_ENV__Header *header; struct SOAP_ENV__Fault *fault; int idnum; void *user; /* for user to pass user-defined data to callbacks */ void *data[4]; /* extension data = {smdevp, mecevp, ...} */ struct soap_plugin *plugins; /* linked list of plug-in data */ const char *bearer; /* HTTP authorization bearer token value */ const char *userid; /* HTTP Basic authorization userid */ const char *passwd; /* HTTP Basic authorization passwd */ const char *authrealm; /* HTTP authentication realm (and NTLM domain) */ #if !defined(WITH_LEAN) || defined(WITH_NTLM) const char *ntlm_challenge; /* HTTP NTLM challenge key string */ short ntlm_auth; /* HTTP NTLM authentication type */ #endif int (*fpost)(struct soap*, const char*, const char*, int, const char*, const char*, ULONG64); int (*fget)(struct soap*); /* HTTP GET hook (not set by default) */ int (*fput)(struct soap*); /* HTTP PUT hook (handled as POST by default) */ int (*fpatch)(struct soap*); /* HTTP PATCH hook (handled as POST by default) */ int (*fdel)(struct soap*); /* HTTP DELETE hook (not set by default) */ int (*fopt)(struct soap*); /* HTTP OPTIONS hook (not set by default) */ int (*fhead)(struct soap*); /* HTTP HEAD hook (not set by default) */ int (*fform)(struct soap*); /* HTTP/HTML form handler for plugins */ int (*fposthdr)(struct soap*, const char*, const char*); int (*fresponse)(struct soap*, int, ULONG64); 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*); #ifndef WITH_LEANER int (*fsvalidate)(struct soap*, const char*, const char*); int (*fwvalidate)(struct soap*, const char*, const wchar_t*); int (*feltbegin)(struct soap*, const char*); int (*feltendin)(struct soap*, const char*, const char*); int (*feltbegout)(struct soap*, const char*, int, const char*); int (*feltendout)(struct soap*, const char*); int (*fprepareinitsend)(struct soap*); int (*fprepareinitrecv)(struct soap*); int (*fpreparesend)(struct soap*, const char*, size_t); int (*fpreparerecv)(struct soap*, const char*, size_t); int (*fpreparefinalsend)(struct soap*); int (*fpreparefinalrecv)(struct soap*); int recverror; /* last soap_recv_raw error code for filterrecv */ int (*ffiltersend)(struct soap*, const char**, size_t*); int (*ffilterrecv)(struct soap*, char*, size_t*, size_t); 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; /* socket bound to TCP/IP port */ SOAP_SOCKET socket; /* socket to send and receive */ SOAP_SOCKET sendsk; /* socket to send (overrides ::socket) */ SOAP_SOCKET recvsk; /* socket to receive (overrides ::socket) */ #if defined(__cplusplus) && !defined(WITH_COMPAT) std::ostream *os; /* C++ only: ostream to send */ std::istream *is; /* C++ only: istream to receive */ #else const char **os; /* C only: pointer to a const char*, will be set to point to the string output */ const char *is; /* C only: a const char* to read from (soap->is will advance) */ #endif #ifndef UNDER_CE int sendfd; /* int file descriptor for sending */ int recvfd; /* int file descriptor for receiving */ #else FILE *sendfd; /* WinCE FILE* to send */ FILE *recvfd; /* WinCE FILE* to receive */ #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; /* HTTP or XML element has a body (1) or not (0) */ unsigned int level; /* XML nesting level */ #ifndef WITH_LEAN ULONG64 start; /* start time of send/recv (value cast to time_t) */ #endif ULONG64 count; /* message length counter */ ULONG64 length; /* message length as was set by HTTP header received */ 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[SOAP_TMPLEN]; /* in/out buffer for HTTP/MIME headers and short messages, must be >=1024 bytes */ char tmpbuf[SOAP_TMPLEN]; /* 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]; int position; int positions[SOAP_MAXDIMS]; struct soap_attribute *attributes; /* attribute list */ short other; short root; 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; /* zero to output all xmlns */ short part; /* SOAP part state (header or body) */ short event; /* engine events and states for use by plugins */ short peeked; unsigned int evlev; /* event level */ int alloced; size_t chunksize; size_t chunkbuflen; char endpoint[SOAP_TAGLEN]; char path[SOAP_TAGLEN]; char host[SOAP_TAGLEN]; char *action; /* SOAPAction string */ const char *prolog; /* XML declaration prolog */ unsigned int ip; /* IP number retrieved from request */ unsigned int ip6[4]; /* same for IPv6: upper in ip6[0] to lower in ip6[3] requires WITH_IPV6 */ int port; /* port number */ const char *override_host; /* to override the client-side host name/IP when connecting */ int override_port; /* to override client-side port number when connecting */ int keep_alive; /* connection should be kept open (-1, 0, or counts down) */ int 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 */ int max_keep_alive; /* maximum keep-alive session (default=100) 0 to always keep open */ 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 */ const char *origin; /* Origin header received */ const char *cors_origin; /* CORS Allow-Origin header returned by server */ const char *cors_allow; /* CORS Allow-Origin header default value of "*" */ const char *cors_method; /* CORS Request-Method header received */ const char *cors_header; /* CORS Request-Headers header received */ const char *cors_methods; /* CORS Allow-Methods header returned by server */ const char *cors_headers; /* CORS Allow-Headers header returned by server */ const char *x_frame_options; /* "DENY", "SAMEORIGIN" (default), or "ALLOW-FROM uri" */ int status; /* HTTP status code, HTTP method, or other error code */ 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 const char *logfile[SOAP_MAXLOGS]; FILE *fdebug[SOAP_MAXLOGS]; struct soap_mlist *mht[SOAP_PTRHASH]; #ifndef WITH_LEAN const char *wsuid; /* space-separated string of element tags */ const char *c14nexclude; /* space-separated string of prefixes for c14n exclusion */ const char *c14ninclude; /* space-separated string of prefixes for c14n inclusion */ #endif struct soap_cookie *cookies; const char *cookie_domain; const char *cookie_path; int cookie_max; #ifndef WITH_NOIO unsigned int ipv6_multicast_if; /* in_addr_t in6addr->sin6_scope_id IPv6 value */ char* ipv4_multicast_if; /* IP_MULTICAST_IF IPv4 setsockopt interface_addr */ unsigned char ipv4_multicast_ttl; /* IP_MULTICAST_TTL value 0..255 */ const char *client_addr; /* when non-NULL, client binds to this address before connect */ const char *client_addr_ipv6; /* WITH_IPV6: when non-NULL and client_addr is non-NULL and when connecting to a IPv6 server, client binds to this IPv6 address instead of client_addr */ int client_port; /* when nonnegative, client binds to this port before connect */ const char *client_interface; /* when non-NULL, override client-side interface address using this address */ union { struct sockaddr addr; struct sockaddr_in in; struct sockaddr_storage storage; } peer; /* set by soap_connect/soap_accept and by UDP recv */ size_t peerlen; #endif #if defined(WITH_OPENSSL) /* OpenSSL */ int (*fsslauth)(struct soap*); int (*fsslverify)(int, X509_STORE_CTX*); BIO *bio; SSL *ssl; SSL_CTX *ctx; SSL_SESSION *session; const char *dhfile; const char *randfile; #elif defined(WITH_GNUTLS) /* GNUTLS */ int (*fsslauth)(struct soap*); void *fsslverify; gnutls_certificate_credentials_t xcred; /* cert pointer */ gnutls_anon_client_credentials_t acred; /* anon pointer */ gnutls_priority_t cache; /* priority cache pointer */ gnutls_session_t session; /* session pointer */ gnutls_dh_params_t dh_params; gnutls_rsa_params_t rsa_params; #elif defined(WITH_SYSTEMSSL) /* SYSTEM SSL */ int (*fsslauth)(struct soap*); void *fsslverify; /* N/A */ void *bio; /* N/A */ gsk_handle ctx; /* environment */ gsk_handle ssl; /* ssl socket */ void *session; /* N/A */ const char *dhfile; /* N/A */ const char *randfile; /* N/A */ #else /* No SSL/TLS */ void *fsslauth; /* dummy members, to preserve struct size */ void *fsslverify; void *bio; void *ssl; void *ctx; void *session; void *dh_params; void *rsa_params; #endif unsigned short ssl_flags; const char *keyfile; const char *keyid; const char *password; const char *cafile; const char *capath; const char *crlfile; char session_host[SOAP_TAGLEN]; int session_port; #ifdef SOAP_LOCALE_T SOAP_LOCALE_T c_locale; /* if this does not compile, use ./configure --enable-xlocale or compile with -DWITH_INCLUDE_XLOCALE_H, or use -DWITH_NO_C_LOCALE to disable locale support */ #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 const char *z_dict; /* support for zlib static dictionaries */ unsigned int z_dict_len; 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 /* vxWorks compatibility */ void *rpmreqid; #endif #ifdef __cplusplus soap(); soap(soap_mode); soap(soap_mode, soap_mode); soap(const struct soap&); struct soap& operator=(const struct soap&); void destroy(); ~soap(); /* no virtual methods, so sizeof(soap) should be the same in C and C++ */ #endif }; struct soap_code_map { LONG64 code; const char *string; }; /* forwarding list */ struct soap_flist { struct soap_flist *next; int type; void *ptr; unsigned int level; size_t index; void (*finsert)(struct soap*, int, int, void*, size_t, const void*, void**); }; /* id-ref forwarding list */ struct soap_ilist { struct soap_ilist *next; int type; size_t size; void *ptr; void **spine; void *link; void *copy; struct soap_flist *flist; void *smart; short shaky; 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) */ }; extern SOAP_NMAC struct Namespace namespaces[]; #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_versioning_paste(name, ext) name##_REQUIRE_lib_v##ext #define soap_versioning_ext(name, ext) soap_versioning_paste(name, ext) #define soap_versioning(name) soap_versioning_ext(name, GSOAP_VERSION) #define soap_init(soap) soap_init1(soap, SOAP_IO_DEFAULT) #define soap_init1(soap, mode) soap_init2(soap, mode, mode) #define soap_init2(soap, imode, omode) soap_versioning(soap_init)(soap, imode, omode) #define soap_new() soap_new1(SOAP_IO_DEFAULT) #define soap_new1(mode) soap_new2(mode, mode) #define soap_new2(imode, omode) soap_versioning(soap_new)(imode, omode) #define soap_revget1(soap) ((soap)->bufidx--) #define soap_unget(soap, c) ((soap)->ahead = c) #define soap_peek(soap) ((soap)->ahead = soap_get(soap)) #define soap_register_plugin(soap, plugin) soap_register_plugin_arg(soap, plugin, NULL) #define soap_mode(soap, n) ((soap)->mode = (soap)->imode = (soap)->omode = (n)) #define soap_imode(soap, n) ((soap)->imode = (n)) #define soap_omode(soap, n) ((soap)->omode = (n)) #define soap_set_imode(soap, n) ((soap)->imode |= (n)) #define soap_clr_imode(soap, n) ((soap)->imode &= ~(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)->mode |= (n), (soap)->imode |= (n), (soap)->omode |= (n)) #define soap_clr_mode(soap, n) ((soap)->mode &= ~(n), (soap)->imode &= ~(n), (soap)->omode &= ~(n)) #define soap_destroy(soap) soap_delete((soap), NULL) #define SOAP_NO_LINK_TO_DELETE (-2) /* pass to soap_link() as size n: do not manage, smart pointers are self-managing */ #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*, char**, int); #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*, char**, int); #endif #if defined(WIN32) && !defined(__MINGW32__) && !defined(__MINGW64__) && !defined(__BORLANDC__) # define soap_strtoll _strtoi64 #elif defined(HAVE_STRTOLL) && !defined(soap_strtoll) # define soap_strtoll strtoll #elif !defined(soap_strtoll) SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_strtoll(const char*, char**, int); #endif #if defined(WIN32) && !defined(__MINGW32__) && !defined(__MINGW64__) && !defined(__BORLANDC__) # define soap_strtoull _strtoui64 #elif defined(HAVE_STRTOULL) && !defined(soap_strtoull) # define soap_strtoull strtoull #elif !defined(soap_strtoull) SOAP_FMAC1 ULONG64 SOAP_FMAC2 soap_strtoull(const char*, char**, int); #endif #if defined(WITH_OPENSSL) # define soap_random soap_rand() SOAP_FMAC1 int SOAP_FMAC2 soap_rand(void); #elif defined(UNDER_CE) # define soap_random (int)Random() #elif defined(HAVE_RANDOM) # define soap_random (int)random() #else # define soap_random rand() #endif #ifdef WITH_NOIDREF # define soap_embedded(s, p, t) ((void)(s), 0) # define soap_id_lookup(s, i, p, t, n, k, fb) ((void)(s), (p)) # define soap_id_forward(s, h, p, i, t, tt, n, k, fi, fb) ((void)(s), (p)) # define soap_id_nullify(s, i) ((void)(s), (i)) # define soap_reference(s, a, t) ((void)(s), 1) # define soap_array_reference(s, p, a, n, t) ((void)(s), 1) # define soap_attachment_reference(s, p, a, n, t, i, y) ((void)(s), 1) # define soap_embed(s, p, a, n, t) ((void)(s), 0) # define soap_embedded_id(s, i, p, t) ((void)(s), (void)(t), i) # define soap_is_embedded(s, p) ((void)(s), 0) # define soap_is_single(s, p) ((void)(s), 1) # define soap_lookup_type(s, i) ((void)(s), 0) # define soap_getindependent(s) ((void)(s), 0) # define soap_putindependent(s) ((void)(s), 0) # define soap_markelement(s, p, t) ((void)(s), 0) # define soap_begin_shaky(s) ((void)(s), 0) # define soap_end_shaky(s, f) ((void)(s), (void)(f), 0) #endif /* soap_traverse() traversal/walker routines take walker function arguments */ typedef void soap_walker(struct soap*, void*, int, const char*, const char*); SOAP_FMAC5 int SOAP_FMAC6 soap_serve(struct soap *soap); SOAP_FMAC5 int SOAP_FMAC6 soap_serve_request(struct soap *soap); SOAP_FMAC1 void SOAP_FMAC2 soap_ssl_init(void); SOAP_FMAC1 void SOAP_FMAC2 soap_ssl_noinit(void); SOAP_FMAC1 int SOAP_FMAC2 soap_GET(struct soap*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_PUT(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_PATCH(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_POST(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_DELETE(struct soap*, const char*); 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 ret, int err); SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_crl(struct soap*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_poll(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_ready(struct soap*); #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid); #else 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); #endif #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *randfile); #else 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); #endif SOAP_FMAC1 const char * SOAP_FMAC2 soap_http_content_type(struct soap *soap, int status); SOAP_FMAC1 int SOAP_FMAC2 soap_puthttphdr(struct soap*, int status, ULONG64 count); SOAP_FMAC1 const char* SOAP_FMAC2 soap_http_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*); #ifndef WITH_LEANER 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_query_send_key(struct soap*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_query_send_val(struct soap*, const char*); SOAP_FMAC1 char * SOAP_FMAC2 soap_query(struct soap*); SOAP_FMAC1 char * SOAP_FMAC2 soap_query_key(struct soap*, char**); SOAP_FMAC1 char * SOAP_FMAC2 soap_query_val(struct soap*, char**); SOAP_FMAC1 const char * SOAP_FMAC2 soap_query_decode(char*, size_t, const char*); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_pututf8(struct soap*, unsigned long); SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getutf8(struct soap*); SOAP_FMAC1 size_t SOAP_FMAC2 soap_utf8len(const char*); 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_attachment_forward(struct soap*, unsigned char**, int*, char**, char**, char**); #endif 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 void *a, int n, int t, struct soap_plist**); SOAP_FMAC1 int SOAP_FMAC2 soap_array_pointer_lookup(struct soap*, const void *p, const void *a, int n, int t, struct soap_plist**); #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_embed(struct soap *soap, const void *p, const void *a, int n, int t); 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*, int t, size_t n); 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 void *a, int n, int t); SOAP_FMAC1 int SOAP_FMAC2 soap_attachment_reference(struct soap *soap, const void *p, const void *a, int n, int t, const char *id, const char *type); 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_check_and_mark(struct soap *soap, const void *p, int t, char **mark); SOAP_FMAC1 void * SOAP_FMAC2 soap_mark_lookup(struct soap *soap, const void *p, int t, struct soap_plist **pp, char **mark); SOAP_FMAC1 int SOAP_FMAC2 soap_mark_cycle(struct soap *soap, struct soap_plist *pp); SOAP_FMAC1 void SOAP_FMAC2 soap_mark_dup(struct soap *soap, void *a, struct soap_plist *pp); SOAP_FMAC1 void SOAP_FMAC2 soap_unmark(struct soap *soap, char *mark); 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 int SOAP_FMAC2 soap_end_send_flush(struct soap*); SOAP_FMAC1 const struct soap_code_map* SOAP_FMAC2 soap_code(const struct soap_code_map*, const char*); SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_code_int(const struct soap_code_map*, const char*, LONG64); SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_str(const struct soap_code_map*, long); SOAP_FMAC1 LONG64 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_binary_search_string(const char**, int, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_getline(struct soap*, char*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_begin_serve(struct soap*); 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*, int, int, int (*fdelete)(struct soap*, struct soap_clist*)); SOAP_FMAC1 int 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 short SOAP_FMAC2 soap_begin_shaky(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_end_shaky(struct soap*, short); SOAP_FMAC1 void* SOAP_FMAC2 soap_id_lookup(struct soap*, const char *id, void **p, int t, size_t n, unsigned int k, int (*fbase)(int, int)); SOAP_FMAC1 void* SOAP_FMAC2 soap_id_forward(struct soap*, const char *id, void *p, size_t i, int t, int tt, size_t n, unsigned int k, void(*finsert)(struct soap*, int, int, void*, size_t, const void*, void**), int (*fbase)(int, int)); SOAP_FMAC1 int SOAP_FMAC2 soap_id_nullify(struct soap*, const char*); #endif SOAP_FMAC1 void* SOAP_FMAC2 soap_id_enter(struct soap*, const char *id, void *p, int t, size_t n, const char *type, const char *arrayType, void *(*finstantiate)(struct soap*, int, const char*, const char*, size_t*), int (*fbase)(int, int)); SOAP_FMAC1 void** SOAP_FMAC2 soap_id_smart(struct soap *soap, const char*, int t, size_t n); SOAP_FMAC1 size_t SOAP_FMAC2 soap_size(const int *, int); SOAP_FMAC1 size_t SOAP_FMAC2 soap_getsizes(const char *, int *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_getoffsets(const char *, const int *, int *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_getposition(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_putoffsets(struct soap*, const int *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_closesock(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_force_closesock(struct soap*); SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_versioning(soap_new)(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_free_stream(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_versioning(soap_init)(struct soap*, soap_mode, soap_mode); SOAP_FMAC1 void SOAP_FMAC2 soap_initialize(struct soap*); 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*); SOAP_FMAC1 void SOAP_FMAC2 soap_delegate_deletion(struct soap*, struct soap*); #ifdef WITH_SELF_PIPE SOAP_FMAC1 void SOAP_FMAC2 soap_close_connection(struct soap*); #endif /* API functions available with DEBUG or SOAP_DEBUG defined: */ 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); /* */ 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_att(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_start_end_out(struct soap*, const char *tag); 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_empty(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_element_nil(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_element_id(struct soap*, const char *tag, int id, const void *p, const void *a, int n, const char *type, int t, char **mark); 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_end(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 int SOAP_FMAC2 soap_ignore(struct soap*); SOAP_FMAC1 void* SOAP_FMAC2 soap_memdup(struct soap*, const void*, size_t); 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 char* SOAP_FMAC2 soap_strtrim(struct soap*, char*); SOAP_FMAC1 wchar_t* SOAP_FMAC2 soap_wstrtrim(struct soap*, wchar_t*); SOAP_FMAC1 const char * SOAP_FMAC2 soap_tagsearch(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, const char*); #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, const char*); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_match_namespace(struct soap*, const char *, const char*, size_t n1, size_t n2); SOAP_FMAC1 void SOAP_FMAC2 soap_set_version(struct soap*, short); 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 struct soap_nlist* SOAP_FMAC2 soap_push_namespace(struct soap*, const char *,const char *); SOAP_FMAC1 const char* SOAP_FMAC2 soap_current_namespace_tag(struct soap *soap, const char *tag); SOAP_FMAC1 const char* SOAP_FMAC2 soap_current_namespace_att(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_alloc_block(struct soap*); SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block(struct soap*, struct soap_blist*, size_t); SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block_max(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 void SOAP_FMAC2 soap_update_pointers(struct soap *soap, const char *dst, const char *src, size_t len); SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_out(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_out(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_http_has_body(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_http_skip_body(struct soap*); SOAP_FMAC1 char * SOAP_FMAC2 soap_http_get_body(struct soap*, size_t *len); SOAP_FMAC1 char * SOAP_FMAC2 soap_http_get_form(struct soap*); SOAP_FMAC1 char * SOAP_FMAC2 soap_http_get_body_prefix(struct soap*, size_t *len, const char *prefix); 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*, int check); #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 # ifndef WITH_COMPAT # ifdef __cplusplus SOAP_FMAC1 void SOAP_FMAC2 soap_stream_fault(struct soap*, std::ostream&); SOAP_FMAC1 void SOAP_FMAC2 soap_stream_fault_location(struct soap*, std::ostream&); # endif # 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_s2char(struct soap*, const char*, char**, int, long minlen, long maxlen, const char *pattern); SOAP_FMAC1 int SOAP_FMAC2 soap_s2QName(struct soap*, const char*, char**, long minlen, long maxlen, const char *pattern); #ifndef WITH_COMPAT #ifdef __cplusplus SOAP_FMAC1 int SOAP_FMAC2 soap_s2stdQName(struct soap*, const char*, std::string*, long minlen, long maxlen, const char *pattern); SOAP_FMAC1 int SOAP_FMAC2 soap_s2stdchar(struct soap*, const char*, std::string*, int, long minlen, long maxlen, const char *pattern); SOAP_FMAC1 int SOAP_FMAC2 soap_s2stdwchar(struct soap*, const char*, std::wstring*, int, long minlen, long maxlen, const char *pattern); #endif #endif #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2wchar(struct soap*, const char*, wchar_t**, int, long minlen, long maxlen, const char *pattern); SOAP_FMAC1 int SOAP_FMAC2 soap_s2dateTime(struct soap*, const char*, time_t*); #endif 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); 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); #endif 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*); 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, const char*); 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); #endif #if !defined(WITH_LEAN) || defined(WITH_COOKIES) 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, int, long, long, const char*); 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 void*, int, const char*, const char*, const char*, const char*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_move(struct soap*, ULONG64); SOAP_FMAC1 ULONG64 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*, const 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*, const 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_recv_mime_attachment(struct soap *soap, void *handle); SOAP_FMAC1 int SOAP_FMAC2 soap_match_cid(struct soap*, const char*, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_rand_uuid(struct soap*, 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, int occurs); SOAP_FMAC1 int SOAP_FMAC2 soap_set_attr(struct soap *soap, const char *name, const char *value, int flag); SOAP_FMAC1 void SOAP_FMAC2 soap_clr_attr(struct soap *soap); SOAP_FMAC1 const char* SOAP_FMAC2 soap_extend_url(struct soap *soap, const char*, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_extend_url_query(struct soap *soap, const char*, const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_url_query(struct soap *soap, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_encode_url(const char*, char*, int); SOAP_FMAC1 const char* SOAP_FMAC2 soap_encode_url_string(struct soap*, const char*); #ifdef WITH_COOKIES SOAP_FMAC1 void SOAP_FMAC2 soap_getcookies(struct soap *soap, const char *val); SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_set_cookie(struct soap*, const char*, const char*, const char*, const char*); SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_cookie(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_cookie_env(struct soap*, const char*, const char*, const char*, short); SOAP_FMAC1 const char* SOAP_FMAC2 soap_cookie_value(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_env_cookie_value(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 time_t SOAP_FMAC2 soap_cookie_expire(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_expire(struct soap*, const char*, long, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_secure(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_session(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_clr_cookie_session(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_clr_cookie(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_getenv_cookies(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_free_cookies(struct soap*); SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_copy_cookies(struct soap*, const struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putsetcookies(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_putcookies(struct soap *soap, const char *domain, const char *path, int secure); #endif #ifdef __cplusplus } /* extern "C" */ #endif SOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap*); SOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap*); SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultcode(struct soap*); SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultsubcode(struct soap*); SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultstring(struct soap*); SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultdetail(struct soap*); SOAP_FMAC3 const char * SOAP_FMAC4 soap_fault_subcode(struct soap*); SOAP_FMAC3 const char * SOAP_FMAC4 soap_fault_string(struct soap*); SOAP_FMAC3 const char * SOAP_FMAC4 soap_fault_detail(struct soap*); SOAP_FMAC3 void SOAP_FMAC4 soap_serializefault(struct soap*); SOAP_FMAC3 void SOAP_FMAC4 soap_serializeheader(struct soap*); SOAP_FMAC3 int SOAP_FMAC4 soap_getheader(struct soap*); SOAP_FMAC3 int SOAP_FMAC4 soap_putheader(struct soap*); SOAP_FMAC3 int SOAP_FMAC4 soap_getfault(struct soap*); SOAP_FMAC3 int SOAP_FMAC4 soap_putfault(struct soap*); #ifdef __cplusplus /* C++ templates (for generated C++ only, not needed nor used in generated C code) */ template struct soap_block { static T *push(struct soap *soap, struct soap_blist *b) { if (!b) b = soap->blist; if (!b) return NULL; T *p = (T*)soap_push_block_max(soap, b, sizeof(T)); if (p) SOAP_PLACEMENT_NEW(soap, p, T); return p; } static void pop(struct soap *soap, struct soap_blist *b) { if (!b) b = soap->blist; if (!b || !b->head) return; ((T*)(b->head + 1))->~T(); soap_pop_block(soap, b); } static void save(struct soap *soap, struct soap_blist *b, T *p) { if (!b) b = soap->blist; for (T *q = (T*)soap_first_block(soap, b); q; q = (T*)soap_next_block(soap, b)) { soap_update_pointers(soap, (const char*)p, (const char*)q, sizeof(T)); *p++ = *q; q->~T(); } soap_end_block(soap, b); } static void end(struct soap *soap, struct soap_blist *b) { if (!b) b = soap->blist; for (T *p = (T*)soap_first_block(soap, b); p; p = (T*)soap_next_block(soap, b)) p->~T(); soap_end_block(soap, b); } }; #endif #endif /* STDSOAP_H */ gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/dime.h0000644000175000017500000000320713525245163022044 0ustar ellertellert/* dime.h WSDL/DIME binding schema -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap dime schema documentation: WSDL/DIME binding schema //gsoap dime schema namespace: http://schemas.xmlsoap.org/ws/2002/04/dime/wsdl/ #import "imports.h" class dime__message { public: @xsd__anyURI layout; // @xsd__boolean wsdl__required; }; gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/stlvector.h0000644000175000017500000000455213525245163023157 0ustar ellertellert/* stlvector.h Use #import "stlvector.h" in a gSOAP header file to enable STL vectors. Use soapcpp2 option -Ipath:path:... to specify the path(s) for #import 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 A. 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 template class std::vector; gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/wsdl2h/http.h0000644000175000017500000000420113525245163022100 0ustar ellertellert/* http.h WSDL/HTTP binding schema interface -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2000-2012, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ //gsoap http schema documentation: WSDL 1.1 HTTP binding schema //gsoap http schema namespace: http://schemas.xmlsoap.org/wsdl/http/ //gsoap http schema elementForm: qualified //gsoap http schema attributeForm: unqualified //gsoap whttp schema documentation: WSDL 2.0 HTTP binding schema //gsoap whttp schema namespace: http://www.w3.org/ns/wsdl/http //gsoap whttp schema elementForm: qualified //gsoap whttp schema attributeForm: unqualified #import "imports.h" class http__address { public: @xsd__anyURI location; }; class http__binding { public: @xsd__NMTOKEN verb; }; class http__operation { public: @xsd__anyURI location; }; class whttp__header { public: @xsd__string name; @xsd__QName type; @xsd__boolean required = false; }; gsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/debug/0000755000175000017500000000000013525245163020636 5ustar ellertellertgsoap-2.8.91/gsoap/VisualStudio2005/wsdl2h/release/0000755000175000017500000000000013525245163021170 5ustar ellertellertgsoap-2.8.91/gsoap/dom.cpp0000644000175000017500000052432613525245161014700 0ustar ellertellert/* dom.c[pp] DOM API v5 gSOAP 2.8.91 See gsoap/doc/dom/html/index.html for the new DOM API v5 documentation Also located in /gsoap/samples/dom/README.md gSOAP XML Web services tools Copyright (C) 2000-2019, 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. -------------------------------------------------------------------------------- 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-2017, 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 -------------------------------------------------------------------------------- */ /** Compatibility requirement with gSOAP engine version */ #define GSOAP_LIB_VERSION 20891 #include "stdsoap2.h" #if GSOAP_VERSION != GSOAP_LIB_VERSION # error "GSOAP VERSION MISMATCH IN LIBRARY: PLEASE REINSTALL PACKAGE" #endif #ifdef __BORLANDC__ # pragma warn -8060 #endif SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_xsd__anyType(struct soap*, const struct soap_dom_element *); SOAP_FMAC3 void SOAP_FMAC4 soap_traverse_xsd__anyType(struct soap*, struct soap_dom_element*, const char*, soap_walker, soap_walker); SOAP_FMAC1 void SOAP_FMAC2 soap_default_xsd__anyType(struct soap*, struct soap_dom_element *); SOAP_FMAC3 int SOAP_FMAC4 soap_put_xsd__anyType(struct soap*, const struct soap_dom_element*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_out_xsd__anyType(struct soap*, const char*, int, const struct soap_dom_element*, const char*); SOAP_FMAC3 struct soap_dom_element * SOAP_FMAC4 soap_get_xsd__anyType(struct soap*, struct soap_dom_element*, const char*, const char*); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_in_xsd__anyType(struct soap*, const char*, struct soap_dom_element *, const char*); SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_xsd__anyAttribute(struct soap*, const struct soap_dom_attribute*); SOAP_FMAC3 void SOAP_FMAC4 soap_traverse_xsd__anyAttribute(struct soap*, struct soap_dom_attribute*, const char*, soap_walker, soap_walker); SOAP_FMAC1 void SOAP_FMAC2 soap_default_xsd__anyAttribute(struct soap*, struct soap_dom_attribute*); SOAP_FMAC3 int SOAP_FMAC4 soap_put_xsd__anyAttribute(struct soap*, const struct soap_dom_attribute*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_out_xsd__anyAttribute(struct soap*, const char*, int, const struct soap_dom_attribute*, const char*); SOAP_FMAC3 struct soap_dom_attribute * SOAP_FMAC4 soap_get_xsd__anyAttribute(struct soap*, struct soap_dom_attribute*, const char*, const char*); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_in_xsd__anyAttribute(struct soap*, const char*, struct soap_dom_attribute *, const char*); #ifdef SOAP_DOM_EXTERNAL_NAMESPACE namespace SOAP_DOM_EXTERNAL_NAMESPACE { #ifndef WITH_NOIDREF SOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap*, const void*, int); #endif SOAP_FMAC3 void * SOAP_FMAC4 soap_getelement(struct soap*, const char*, int*); SOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap*, const void*, const char*, int, int); SOAP_FMAC3 void * SOAP_FMAC4 soap_dupelement(struct soap*, const void*, int); SOAP_FMAC3 void SOAP_FMAC4 soap_delelement(const void*, int); } #endif #ifdef __cplusplus extern "C" { #endif #ifndef WITH_NOIDREF SOAP_FMAC3 void SOAP_FMAC4 soap_markelement(struct soap*, const void*, int); #endif SOAP_FMAC3 void * SOAP_FMAC4 soap_getelement(struct soap*, const char*, int*); SOAP_FMAC3 int SOAP_FMAC4 soap_putelement(struct soap*, const void*, const char*, int, int); SOAP_FMAC3 void * SOAP_FMAC4 soap_dupelement(struct soap*, const void*, int); SOAP_FMAC3 void SOAP_FMAC4 soap_delelement(const void*, int); #ifdef __cplusplus } #endif /** Format string for generating DOM namespace prefixes (< 16 chars total) */ #ifndef SOAP_DOMID_FORMAT #define SOAP_DOMID_FORMAT "_%d" #endif static int out_element(struct soap*, const struct soap_dom_element*, const char*, const char*); static int out_attribute(struct soap*, const char*, const char*, const char*, int); /* namespace name (URI) lookup and store routines */ static const char *soap_push_prefix(struct soap*, const char*, size_t, const char*, int, int); static const char *soap_prefix_of(struct soap*, const char*); static const char *soap_ns_to_set(struct soap*, const char*); static const char *soap_ns_to_get(struct soap*, const char*); static const char *soap_ns_to_find(struct soap*, const char*); static struct soap_dom_element *new_element(struct soap*); static struct soap_dom_attribute *new_attribute(struct soap*); static int soap_tag_match(const char*, const char*); static int soap_patt_match(const char*, const char*); static int soap_name_match(const char*, const char*); /******************************************************************************\ * * DOM custom (de)serializers * \******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_serialize_xsd__anyType(struct soap *soap, const struct soap_dom_element *node) { if (node) { if (node->type && node->node) { #ifdef SOAP_DOM_EXTERNAL_NAMESPACE SOAP_DOM_EXTERNAL_NAMESPACE::soap_markelement(soap, node->node, node->type); ::soap_markelement(soap, node->node, node->type); #else soap_markelement(soap, node->node, node->type); #endif } else { const struct soap_dom_element *elt; for (elt = node->elts; elt; elt = elt->next) soap_serialize_xsd__anyType(soap, elt); } } } SOAP_FMAC3 void SOAP_FMAC4 soap_traverse_xsd__anyType(struct soap *soap, struct soap_dom_element *node, const char *s, soap_walker p, soap_walker q) { (void)soap; (void)node; (void)s; (void)p; (void)q; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_serialize_xsd__anyAttribute(struct soap *soap, const struct soap_dom_attribute *node) { (void)soap; (void)node; } SOAP_FMAC1 void SOAP_FMAC2 soap_traverse_xsd__anyAttribute(struct soap *soap, struct soap_dom_attribute *node, const char *s, soap_walker p, soap_walker q) { (void)soap; (void)node; (void)s; (void)p; (void)q; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_default_xsd__anyType(struct soap *soap, struct soap_dom_element *node) { node->next = NULL; node->prnt = NULL; node->elts = NULL; node->atts = NULL; node->nstr = NULL; node->name = NULL; node->lead = NULL; node->text = NULL; node->code = NULL; node->tail = NULL; node->node = NULL; node->type = 0; node->soap = soap; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_default_xsd__anyAttribute(struct soap *soap, struct soap_dom_attribute *node) { node->next = NULL; node->nstr = NULL; node->name = NULL; node->text = NULL; node->soap = soap; } /******************************************************************************/ static int out_element(struct soap *soap, const struct soap_dom_element *node, const char *prefix, const char *name) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node lead '%s'\n", node->lead ? node->lead : "")); if (node->lead && soap_send(soap, node->lead)) return soap->error; if (node->type && node->node) { char *s = NULL; struct Namespace *p; if (prefix && *prefix) { size_t l = strlen(prefix) + strlen(name); if (l + 2 < l || (SOAP_MAXALLOCSIZE > 0 && l + 2 > SOAP_MAXALLOCSIZE)) return soap->error = SOAP_EOM; s = (char*)SOAP_MALLOC(soap, l + 2); if (!s) return soap->error = SOAP_EOM; (SOAP_SNPRINTF(s, l + 2, l + 1), "%s:%s", prefix, name); } if (!(soap->mode & SOAP_DOM_ASIS)) { for (p = soap->local_namespaces; p && p->id; p++) { if (p->ns && soap_push_prefix(soap, p->id, strlen(p->id), p->ns, 1, 0) == NULL) { if (s) SOAP_FREE(soap, s); return soap->error; } } } #ifdef SOAP_DOM_EXTERNAL_NAMESPACE if (SOAP_DOM_EXTERNAL_NAMESPACE::soap_putelement(soap, node->node, s ? s : name, 0, node->type) || ::soap_putelement(soap, node->node, s ? s : name, 0, node->type)) { if (s) SOAP_FREE(soap, s); return soap->error; } #else if (soap_putelement(soap, node->node, s ? s : name, 0, node->type)) { if (s) SOAP_FREE(soap, s); return soap->error; } #endif if (s) SOAP_FREE(soap, s); } else if (prefix && *prefix) { size_t l = strlen(prefix) + strlen(name); char *s; if (l + 2 < l || (SOAP_MAXALLOCSIZE > 0 && l + 2 > SOAP_MAXALLOCSIZE)) return soap->error = SOAP_EOM; if (l + 1 < sizeof(soap->msgbuf)) { s = soap->msgbuf; } else { s = (char*)SOAP_MALLOC(soap, l + 2); if (!s) return soap->error = SOAP_EOM; } (SOAP_SNPRINTF(s, l + 2, l + 1), "%s:%s", prefix, name); (void)soap_element(soap, s, 0, NULL); if (s != soap->msgbuf) SOAP_FREE(soap, s); } else if (*name != '-') { soap_mode m = soap->mode; if ((soap->mode & SOAP_DOM_ASIS)) soap->mode &= ~SOAP_XML_INDENT; (void)soap_element(soap, name, 0, NULL); soap->mode = m; } return soap->error; } /******************************************************************************/ static int out_attribute(struct soap *soap, const char *prefix, const char *name, const char *text, int isearly) { char *s; const char *t; size_t l; int err; if (!text) text = ""; if (!prefix || !*prefix) { if ((soap->mode & SOAP_XML_CANONICAL) && !strncmp(name, "xmlns", 5) && ((name[5] == ':') || name[5] == '\0')) return soap_attribute(soap, name, text); if (isearly) return soap_set_attr(soap, name, text, 2); return soap_attribute(soap, name, text); } t = strchr(name, ':'); if (t) t++; else t = name; l = strlen(prefix) + strlen(t); if (l + 2 < l || (SOAP_MAXALLOCSIZE > 0 && l + 2 > SOAP_MAXALLOCSIZE)) return soap->error = SOAP_EOM; if (l + 1 < sizeof(soap->msgbuf)) { s = soap->msgbuf; } else { s = (char*)SOAP_MALLOC(soap, l + 2); if (!s) return soap->error = SOAP_EOM; } (SOAP_SNPRINTF(s, l + 2, l + 1), "%s:%s", prefix, t); if (isearly) err = soap_set_attr(soap, s, text, 2); else err = soap_attribute(soap, s, text); if (s != soap->msgbuf) SOAP_FREE(soap, s); return err; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_out_xsd__anyType(struct soap *soap, const char *tag, int id, const struct soap_dom_element *node, const char *type) { (void)id; (void)type; if (node) { const char *prefix; /* namespace prefix, if namespace is present */ if (!(soap->mode & SOAP_DOM_ASIS) && !(soap->mode & SOAP_XML_CANONICAL)) { const struct soap_dom_attribute *att; for (att = node->atts; att; att = att->next) { if (att->name && att->text && !strncmp(att->name, "xmlns:", 6)) { if (soap_push_namespace(soap, att->name + 6, att->text) == NULL) return soap->error; } else if (att->name && att->text && !strcmp(att->name, "xmlns")) { if (soap_push_namespace(soap, "", att->text) == NULL) return soap->error; } } } if (node->name) tag = node->name; else if (!tag) tag = "-"; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' start at level=%u\n", tag, soap->level)); prefix = NULL; if (!(soap->mode & SOAP_DOM_ASIS)) { const struct soap_nlist *np; size_t n = 0; prefix = strchr(tag, ':'); if (prefix) { n = prefix - tag; if (n && node->nstr) prefix = soap_prefix_of(soap, node->nstr); else prefix = NULL; } np = soap_lookup_ns(soap, tag, n); if (!prefix && ((n && !np) || (node->nstr && (!np || !np->ns || strcmp(node->nstr, np->ns))))) { prefix = soap_push_prefix(soap, tag, n, node->nstr, 1, 1); if (!(prefix)) return soap->error; } if (n && prefix && *prefix) tag += n + 1; } if (!soap->ns) soap->ns = 2; if (out_element(soap, node, prefix, tag)) return soap->error; if (!node->type || !node->node) { struct soap_dom_attribute *att; struct soap_dom_element *elt; for (att = node->atts; att; att = att->next) { if (att->name) { if (!(soap->mode & SOAP_DOM_ASIS)) { const char *p = NULL; if (strncmp(att->name, "xml", 3)) { if (att->nstr) p = soap_prefix_of(soap, att->nstr); if (!p) { const struct soap_nlist *np; size_t n = 0; p = strchr(att->name, ':'); if (p) n = p - att->name; p = NULL; np = soap_lookup_ns(soap, att->name, n); if ((n && !np) || (att->nstr && (!np || !np->ns || strcmp(att->nstr, np->ns)))) { p = soap_push_prefix(soap, att->name, n, att->nstr, 0, 0); if (!p) return soap->error; } } } if (out_attribute(soap, p, att->name, att->text, 0)) return soap->error; } else if (soap_attribute(soap, att->name, att->text)) return soap->error; } } if (!node->text && !node->code && !node->tail && !node->elts && !(soap->mode & SOAP_XML_CANONICAL)) { soap_mode m = soap->mode; soap->mode &= ~SOAP_XML_INDENT; if (*tag != '-' && soap_element_start_end_out(soap, tag)) return soap->error; soap->mode = m; } else { if (*tag != '-' && soap_element_start_end_out(soap, NULL)) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node text '%s'\n", node->text ? node->text : "")); if (node->text && soap_string_out(soap, node->text, 0)) return soap->error; for (elt = node->elts; elt; elt = elt->next) if (soap_out_xsd__anyType(soap, NULL, 0, elt, NULL)) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node code '%s'\n", node->code ? node->code : "")); if (node->code && soap_send(soap, node->code)) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node tail '%s'\n", node->tail ? node->tail : "")); if (node->tail && soap_send(soap, node->tail)) return soap->error; if (!prefix || !*prefix) { soap_mode m = soap->mode; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' end\n", tag)); if ((soap->mode & SOAP_DOM_ASIS)) soap->mode &= ~SOAP_XML_INDENT; if (soap_element_end_out(soap, tag)) return soap->error; soap->mode = m; } else { char *s; size_t l = strlen(prefix) + strlen(tag); if (l + 2 < l || (SOAP_MAXALLOCSIZE > 0 && l + 2 > SOAP_MAXALLOCSIZE)) return soap->error = SOAP_EOM; if (l + 1 < sizeof(soap->msgbuf)) { s = soap->msgbuf; } else { s = (char*)SOAP_MALLOC(soap, l + 2); if (!s) return soap->error = SOAP_EOM; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' end\n", tag)); (SOAP_SNPRINTF(s, l + 2, l + 1), "%s:%s", prefix, tag); if (soap_element_end_out(soap, s)) return soap->error; if (s != soap->msgbuf) SOAP_FREE(soap, s); } } } } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_out_xsd__anyAttribute(struct soap *soap, const char *tag, int id, const struct soap_dom_attribute *node, const char *type) { const struct soap_dom_attribute *att; (void)tag; (void)id; (void)type; if (!(soap->mode & SOAP_DOM_ASIS) && !(soap->mode & SOAP_XML_CANONICAL)) { for (att = node; att; att = att->next) { if (att->name && att->text && !strncmp(att->name, "xmlns:", 6)) { if (soap_push_namespace(soap, att->name + 6, att->text) == NULL) return soap->error; } else if (att->name && att->text && !strcmp(att->name, "xmlns")) { if (soap_push_namespace(soap, "", att->text) == NULL) return soap->error; } } } for (att = node; att; att = att->next) { if (att->name) { if (!(soap->mode & SOAP_DOM_ASIS)) { const char *p = NULL; if (strncmp(att->name, "xml", 3)) { if (att->nstr) p = soap_prefix_of(soap, att->nstr); if (!p) { const struct soap_nlist *np; size_t n = 0; p = strchr(att->name, ':'); if (p) n = p - att->name; p = NULL; np = soap_lookup_ns(soap, att->name, n); if ((n && !np) || (att->nstr && (!np || !np->ns || strcmp(att->nstr, np->ns)))) { p = soap_push_prefix(soap, att->name, n, att->nstr, 1, 0); if (!p) return soap->error; } } } if (out_attribute(soap, p, att->name, att->text, 1)) return soap->error; } else if (soap_attribute(soap, att->name, att->text)) return soap->error; } } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_in_xsd__anyType(struct soap *soap, const char *tag, struct soap_dom_element *node, const char *type) { struct soap_attribute *tp; struct soap_dom_attribute **att; soap_mode m = soap->mode; soap->mode |= SOAP_C_UTFSTRING; (void)tag; (void)type; if (soap_peek_element(soap)) { const char *s; if (soap->error != SOAP_NO_TAG) return NULL; s = soap_strtrim(soap, soap_string_in(soap, 3, -1, -1, NULL)); if (!s || !*s) { soap->mode = m; return NULL; } soap->mode = m; if (!node) { node = new_element(soap); if (!node) { soap->error = SOAP_EOM; return NULL; } } node->text = s; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node with cdata\n")); soap->error = SOAP_OK; soap->peeked = 0; return node; } if (!node) { node = new_element(soap); if (!node) { soap->error = SOAP_EOM; return NULL; } } else { soap_default_xsd__anyType(soap, node); } node->nstr = soap_current_namespace_tag(soap, soap->tag); node->name = soap_strdup(soap, soap->tag); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node element='%s' start namespace='%s'\n", node->name, node->nstr?node->nstr:"(null)")); if ((soap->mode & SOAP_DOM_NODE) || (!(soap->mode & SOAP_DOM_TREE) && *soap->id && (!type || strcmp(type, "xsd:anyType")))) { soap->mode = m; #ifdef SOAP_DOM_EXTERNAL_NAMESPACE node->node = SOAP_DOM_EXTERNAL_NAMESPACE::soap_getelement(soap, NULL, &node->type); if ((!node->node || !node->type) && soap->error == SOAP_TAG_MISMATCH) node->node = ::soap_getelement(soap, NULL, &node->type); #else node->node = soap_getelement(soap, NULL, &node->type); #endif if (node->node && node->type) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node contains type %d from xsi:type or matching element tag name\n", node->type)); return node; } if (soap->error == SOAP_TAG_MISMATCH) soap->error = SOAP_OK; else return NULL; soap->mode |= SOAP_C_UTFSTRING; } att = &node->atts; for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node attribute='%s'\n", tp->name)); *att = new_attribute(soap); if (!*att) { soap->error = SOAP_EOM; return NULL; } (*att)->next = NULL; (*att)->nstr = soap_current_namespace_att(soap, tp->name); (*att)->name = soap_strdup(soap, tp->name); if (tp->visible == 2) (*att)->text = soap_strdup(soap, tp->value); else (*att)->text = NULL; (*att)->soap = soap; att = &(*att)->next; tp->visible = 0; } } if (soap_element_begin_in(soap, NULL, 1, NULL)) return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' pulled (level=%u)\n", node->name, soap->level)); if (soap->body) { struct soap_dom_element **elt; if (soap_peek_element(soap)) { if (soap->error != SOAP_NO_TAG) return NULL; node->text = soap_strtrim(soap, soap_string_in(soap, 3, -1, -1, NULL)); if (!node->text) return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' has cdata\n", node->name)); soap->peeked = 0; } elt = &node->elts; soap->mode = m; for (;;) { *elt = soap_in_xsd__anyType(soap, NULL, NULL, NULL); if (!*elt) { if (soap->error && soap->error != SOAP_NO_TAG) return NULL; break; } (*elt)->prnt = node; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' has subelement '%s'\n", node->name, (*elt)->name)); if (node->text) { if (*node->text) { struct soap_dom_element *elts = new_element(soap); if (!elts) { soap->error = SOAP_EOM; return NULL; } elts->next = *elt; elts->prnt = node; elts->text = node->text; node->elts = elts; elt = &elts->next; } node->text = NULL; } elt = &(*elt)->next; } if (!node->text && !node->elts) node->tail = ""; /* has body so tail is non-NULL for non-empty element tag */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node '%s' end (level=%u)\n", node->name, soap->level)); if (soap_element_end_in(soap, NULL)) return NULL; if (strcmp(soap->tag, node->name)) { soap->error = SOAP_SYNTAX_ERROR; return NULL; } } soap->mode = m; return node; } /******************************************************************************/ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_in_xsd__anyAttribute(struct soap *soap, const char *tag, struct soap_dom_attribute *node, const char *type) { struct soap_attribute *tp; struct soap_dom_attribute *tmp = node; struct soap_dom_attribute *att = node; (void)tag; (void)type; for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { if (!att) { att = new_attribute(soap); if (tmp) tmp->next = att; else node = att; tmp = att; } if (!att) { soap->error = SOAP_EOM; return NULL; } att->next = NULL; att->nstr = soap_current_namespace_att(soap, tp->name); att->name = soap_strdup(soap, tp->name); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM node attribute='%s' namespace='%s'\n", att->name, att->nstr ? att->nstr : "(null)")); if (tp->visible == 2) att->text = soap_strdup(soap, tp->value); else att->text = NULL; att->soap = soap; att = NULL; } } return node; } SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dup_xsd__anyType(struct soap *soap, struct soap_dom_element *d, const struct soap_dom_element *a) { struct soap_dom_element *elt = NULL; if (!a) return NULL; if (!d && (d = new_element(soap)) == NULL) return NULL; d->next = NULL; d->nstr = soap_strdup(soap, a->nstr); d->name = soap_strdup(soap, a->name); d->lead = soap_strdup(soap, a->lead); d->text = soap_strdup(soap, a->text); d->code = soap_strdup(soap, a->code); d->tail = soap_strdup(soap, a->tail); #ifdef SOAP_DOM_EXTERNAL_NAMESPACE if (a->node) { d->node = SOAP_DOM_EXTERNAL_NAMESPACE::soap_dupelement(soap, a->node, a->type); if (!d->node) d->node = ::soap_dupelement(soap, a->node, a->type); } else { d->node = NULL; } #else d->node = soap_dupelement(soap, a->node, a->type); #endif d->type = a->type; d->atts = soap_dup_xsd__anyAttribute(soap, NULL, a->atts); for (a = a->elts; a; a = a->next) { if (elt) elt = elt->next = soap_dup_xsd__anyType(soap, NULL, a); else elt = d->elts = soap_dup_xsd__anyType(soap, NULL, a); elt->prnt = d; } d->soap = soap; return d; } SOAP_FMAC1 void SOAP_FMAC2 soap_del_xsd__anyType(const struct soap_dom_element *a) { const struct soap_dom_element *p = NULL; while (a) { if (a->nstr) SOAP_FREE(NULL, a->nstr); if (a->name) SOAP_FREE(NULL, a->name); if (a->lead) SOAP_FREE(NULL, a->lead); if (a->text) SOAP_FREE(NULL, a->text); if (a->code) SOAP_FREE(NULL, a->code); if (a->tail) SOAP_FREE(NULL, a->tail); #ifdef SOAP_DOM_EXTERNAL_NAMESPACE if (a->node) { SOAP_DOM_EXTERNAL_NAMESPACE::soap_delelement(a->node, a->type); ::soap_delelement(a->node, a->type); } #else soap_delelement(a->node, a->type); #endif if (a->atts) { soap_del_xsd__anyAttribute(a->atts); SOAP_FREE(NULL, a->atts); } if (a->elts) { soap_del_xsd__anyType(a->elts); SOAP_FREE(NULL, a->elts); } a = a->next; if (p) SOAP_FREE(NULL, p); p = a; } } SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_dup_xsd__anyAttribute(struct soap *soap, struct soap_dom_attribute *d, const struct soap_dom_attribute *a) { struct soap_dom_attribute *att; if (!a) return NULL; if (!d && (d = new_attribute(soap)) == NULL) return NULL; att = d; while (a) { att->nstr = soap_strdup(soap, a->nstr); att->name = soap_strdup(soap, a->name); att->text = soap_strdup(soap, a->text); a = a->next; if (a) { att->next = new_attribute(soap); if (!att->next) break; att = att->next; } } d->soap = soap; return d; } SOAP_FMAC1 void SOAP_FMAC2 soap_del_xsd__anyAttribute(const struct soap_dom_attribute *a) { const struct soap_dom_attribute *p = NULL; while (a) { if (a->nstr) SOAP_FREE(NULL, a->nstr); if (a->name) SOAP_FREE(NULL, a->name); if (a->text) SOAP_FREE(NULL, a->text); a = a->next; if (p) SOAP_FREE(NULL, p); p = a; } } /******************************************************************************\ * * Namespace prefix lookup/store * \******************************************************************************/ static const char * soap_push_prefix(struct soap *soap, const char *id, size_t n, const char *ns, int isearly, int iselement) { struct Namespace *p, *ln = soap->local_namespaces; struct soap_nlist *np; if (!n) id = NULL; if (!ns && id) { for (p = ln; p && p->id; p++) if (!strncmp(p->id, id, n) && !p->id[n]) break; if (p && p->id) { id = p->id; ns = p->out; if (!ns) ns = p->ns; } if (!ns) return ""; } else if (!id) { if (!ns) return ""; if (iselement) { id = ""; /* gen xmlsn="ns" for elements with nstr but no prefix */ } else { for (p = ln; p && p->id; p++) if (p->ns && !strcmp(p->ns, ns)) break; if (p && p->id) id = p->id; else { int i = 0; for (np = soap->nlist; np; np = np->next) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DOM find binding %s = '%s' level = %d index = %d\n", np->id, np->ns, np->level, np->index)); if (np->level) i++; } (SOAP_SNPRINTF(soap->tag, sizeof(soap->tag), sizeof(SOAP_DOMID_FORMAT) + 20), SOAP_DOMID_FORMAT, i); id = soap->tag; } } } else { for (np = soap->nlist; np; np = np->next) { if (!strncmp(np->id, id, n) && !np->id[n]) { if (np->ns) { if (!strcmp(np->ns, ns)) return ""; /* xmlns:id="ns" already in scope */ } else { if (!strcmp(ln[np->index].ns, ns) || (ln[np->index].out && !strcmp(ln[np->index].out, ns))) return ""; /* xmlns:id="ns" already in scope */ } break; } } (void)soap_strncpy(soap->tag, sizeof(soap->tag), id, n); id = soap->tag; soap->local_namespaces = NULL; /* do not permit a replacement id, when ns is in table */ } /* fix advance generation of xmlns, when element (at level) is not output yet */ if (isearly) soap->level++; np = soap_push_namespace(soap, id, ns); soap->local_namespaces = ln; if (isearly) soap->level--; if (!np) return NULL; if (!np->ns) { np->ns = ln[np->index].out; if (!np->ns) np->ns = ln[np->index].ns; } np->index = 0; /* for C14N visibly utilized mark */ /* gen xmlns:id="ns" */ if (*np->id) { (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(np->id) + 6), "xmlns:%s", np->id); if (out_attribute(soap, NULL, soap->msgbuf, ns, isearly)) return NULL; } else { if (out_attribute(soap, NULL, "xmlns", ns, isearly)) return NULL; } return np->id; } /******************************************************************************/ static const char * soap_prefix_of(struct soap *soap, const char *ns) { struct soap_nlist *np; for (np = soap->nlist; np; np = np->next) if (np->ns && !strcmp(np->ns, ns)) return np->id; return NULL; } /******************************************************************************/ static const char * soap_ns_to_set(struct soap *soap, const char *tag) { const char *s; size_t n; const struct Namespace *p; if (!tag) return NULL; s = strchr(tag, ':'); if (!s) return NULL; n = s - tag; if (soap) for (p = soap->namespaces; p && p->id; p++) if (!strncmp(p->id, tag, n) && !p->id[n]) return p->ns; return NULL; } /******************************************************************************/ static const char * soap_ns_to_get(struct soap *soap, const char *tag) { const char *s; size_t n; const struct Namespace *p; if (!tag) return ""; s = strchr(tag, ':'); if (!s) return ""; n = s - tag; if (soap) for (p = soap->namespaces; p && p->id; p++) if (!strncmp(p->id, tag, n) && !p->id[n]) return p->out ? p->out : p->ns; return ""; } /******************************************************************************/ static const char * soap_ns_to_find(struct soap *soap, const char *tag) { const char *s; size_t n; const struct Namespace *p; if (!tag || (tag[0] == '*' && !tag[1])) return NULL; s = strchr(tag, ':'); if (!s) return ""; if (*tag == '*') return NULL; n = s - tag; if (soap) for (p = soap->namespaces; p && p->id; p++) if (!strncmp(p->id, tag, n) && !p->id[n]) return p->out ? p->out : p->ns; return NULL; } /******************************************************************************\ * * Tag matching * \******************************************************************************/ static int soap_tag_match(const char *name, const char *tag) { const char *s; if (!name) return !*tag; s = strchr(name, ':'); if (s) name = s + 1; s = strchr(tag, ':'); if (s) tag = s + 1; return !strcmp(name, tag); } /******************************************************************************/ static int soap_patt_match(const char *name, const char *patt) { const char *s; if (!name) return !*patt; s = strchr(name, ':'); if (s) name = s + 1; s = strchr(patt, ':'); if (s) patt = s + 1; return soap_name_match(name, patt); } /******************************************************************************/ static int soap_name_match(const char *name, const char *patt) { for (;;) { int c1 = *name; int c2 = *patt; if (!c1) break; if (c1 != c2) { if (c2 != '*') return 0; c2 = *++patt; if (!c2) return 1; for (;;) { c1 = *name; if (!c1) break; if (c1 == c2 && soap_name_match(name + 1, patt + 1)) return 1; name++; } break; } name++; patt++; } if (*patt == '*' && !patt[1]) return 1; return !*patt; } /******************************************************************************\ * * Memory * \******************************************************************************/ static struct soap_dom_element *new_element(struct soap *soap) { struct soap_dom_element *elt; elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element)); if (elt) { #ifdef __cplusplus SOAP_PLACEMENT_NEW(soap, elt, soap_dom_element); #endif soap_default_xsd__anyType(soap, elt); } return elt; } /******************************************************************************/ static struct soap_dom_attribute *new_attribute(struct soap *soap) { struct soap_dom_attribute *att; att = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute)); if (att) { #ifdef __cplusplus SOAP_PLACEMENT_NEW(soap, att, soap_dom_attribute); #endif soap_default_xsd__anyAttribute(soap, att); } return att; } /******************************************************************************\ * * soap_dom_element construction * \******************************************************************************/ /** @brief Returns pointer to new xsd__anyType DOM element node @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string or NULL (unnamed node) @return pointer to xsd__anyType DOM element node */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_new(struct soap *soap, const char *ns, const char *tag) { return soap_elt_set(new_element(soap), ns, tag); } /******************************************************************************/ /** @brief Returns pointer to new xsd__anyType DOM element node @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string or NULL (unnamed node) @return pointer to xsd__anyType DOM element node */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_new_w(struct soap *soap, const char *ns, const wchar_t *tag) { return soap_elt_set_w(new_element(soap), ns, tag); } /******************************************************************************/ /** @brief Set xsd__anyType DOM element namespace URI and tag name @param elt pointer to xsd__anyType DOM element to set @param ns namespace URI string or NULL @param tag (un)qualified tag name string or NULL (unnamed node) @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_set(struct soap_dom_element *elt, const char *ns, const char *tag) { if (elt) { if (tag && !*tag) tag = NULL; elt->name = soap_strdup(elt->soap, tag); if (!ns) elt->nstr = soap_ns_to_set(elt->soap, tag); else elt->nstr = soap_strdup(elt->soap, ns); } return elt; } /******************************************************************************/ /** @brief Set xsd__anyType DOM element namespace URI and tag name @param elt pointer to xsd__anyType DOM element to set @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string or NULL (unnamed node) @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_set_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag) { if (elt) { if (tag && !*tag) tag = NULL; elt->name = soap_wchar2s(elt->soap, tag); if (!ns) elt->nstr = soap_ns_to_set(elt->soap, elt->name); else elt->nstr = soap_strdup(elt->soap, ns); } return elt; } /******************************************************************************/ /** @brief Populate xsd__anyType DOM element node with an attribute node, if the attribute does not already exists @param elt pointer to xsd__anyType DOM element to populate @param ns namespace URI string or NULL of attribute @param tag (un)qualified tag name string of attribute @return pointer to xsd__anyAttribute attribute node (new attribute node if none matches) */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att(struct soap_dom_element *elt, const char *ns, const char *tag) { if (!elt) return NULL; if (elt->atts) return soap_att_add(elt->atts, ns, tag); return elt->atts = soap_att_new(elt->soap, ns, tag); } /******************************************************************************/ /** @brief Populate xsd__anyType DOM element node with an attribute node, if the attribute does not already exists @param elt pointer to xsd__anyType DOM element to populate @param ns namespace URI string or NULL of attribute @param tag (un)qualified tag name wide string of attribute @return pointer to xsd__anyAttribute attribute node (new attribute node if none matches) */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag) { if (!elt) return NULL; if (elt->atts) return soap_att_add_w(elt->atts, ns, tag); return elt->atts = soap_att_new_w(elt->soap, ns, tag); } /******************************************************************************/ /** @brief Populate xsd__anyType DOM element node with a child element node @param elt pointer to xsd__anyType DOM element to populate @param ns namespace URI string or NULL of child element @param tag (un)qualified tag name string of child element or NULL (unnamed node) @return pointer to child element node (new child element node if none matches) */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt(struct soap_dom_element *elt, const char *ns, const char *tag) { struct soap_dom_element *node = NULL; if (elt) { struct soap_dom_element *last = NULL; const char *ns1 = ns; if (!ns1) ns1 = soap_ns_to_set(elt->soap, tag); for (node = elt->elts; node; node = node->next) { if (tag && soap_tag_match(node->name, tag) && (ns1 == node->nstr || (ns1 && node->nstr && !strcmp(node->nstr, ns1)))) return node; if (!node->next) last = node; } node = soap_elt_new(elt->soap, ns, tag); if (node) node->prnt = elt; if (last) last->next = node; else elt->elts = node; } return node; } /******************************************************************************/ /** @brief Populate xsd__anyType DOM element node with a child element node @param elt pointer to xsd__anyType DOM element to populate @param ns namespace URI string or NULL of child element @param tag (un)qualified tag name wide string of child element or NULL (unnamed node) @return pointer to xsd__anyType child element node (new child element node if none matches) */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag) { struct soap_dom_element *node = NULL; if (elt) { const char *name = soap_wchar2s(elt->soap, tag); struct soap_dom_element *last = NULL; const char *ns1 = ns; if (!ns1) ns1 = soap_ns_to_set(elt->soap, name); for (node = elt->elts; node; node = node->next) { if (name && soap_tag_match(node->name, name) && (ns1 == node->nstr || (ns1 && node->nstr && !strcmp(node->nstr, ns1)))) return node; if (!node->next) last = node; } node = soap_elt_new(elt->soap, ns, name); if (node) node->prnt = elt; if (last) last->next = node; else elt->elts = node; } return node; } /******************************************************************************/ /** @brief Populate xsd__anyType DOM element node with an N-th child element node @param elt pointer to xsd__anyType DOM element to populate @param ns namespace URI string or NULL of child element @param tag (un)qualified tag name string of child element or NULL (unnamed node) @param n child element position, counting from one (1) XPath style @return pointer to xsd__anyType child element node (new child element node if none matches) */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_nth_elt(struct soap_dom_element *elt, const char *ns, const char *tag, size_t n) { return soap_nth(soap_elt(elt, ns, tag), n); } /******************************************************************************/ /** @brief Populate xsd__anyType DOM element node with an N-th child element node @param elt pointer to xsd__anyType DOM element to populate @param ns namespace URI string or NULL of child element @param tag (un)qualified tag name wide string of child element or NULL (unnamed node) @param n child element position, counting from one (1) XPath style @return pointer to xsd__anyType child element node (new child element node if none matches) */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_nth_elt_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag, size_t n) { return soap_nth(soap_elt_w(elt, ns, tag), n); } /******************************************************************************/ /** @brief Add a N-th child element with the same namespace and tag name as a xsd__anyType DOM child element node at position one (1) in a sibling list @param elt pointer to xsd__anyType DOM child element at position one (1) @param n additional child element position requested, counting from one (1) XPath style @return pointer to xsd__anyType child element node (new child element node if none exists at position n) */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_nth(struct soap_dom_element *elt, size_t n) { struct soap_dom_element *node; struct soap_dom_element *prev = elt; if (!elt || n <= 1) return elt; for (node = elt->next; node; node = node->next) { if ((elt->name == node->name || (elt->name && soap_tag_match(node->name, elt->name))) && (elt->nstr == node->nstr || (elt->nstr && node->nstr && !strcmp(node->nstr, elt->nstr)))) { if (--n <= 1) return node; } prev = node; } while (--n >= 1) { node = new_element(elt->soap); node->next = prev->next; node->prnt = elt->prnt; node->nstr = elt->nstr; node->name = elt->name; prev->next = node; prev = node; } return prev; } /******************************************************************************/ /** @brief Add an attribute node to an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element to populate @param node pointer to xsd__anyAttribute attribute node to copy and add to DOM element elt @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_att(struct soap_dom_element *elt, const struct soap_dom_attribute *node) { if (elt && node) { struct soap_dom_attribute *last; struct soap_dom_attribute **next = &elt->atts; for (last = elt->atts; last; last = last->next) if (!last->next) next = &last->next; *next = new_attribute(elt->soap); if (*next) soap_att_copy(*next, node); } return elt; } /******************************************************************************/ /** @brief Add a child element node to an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element to populate @param node pointer to element node to copy and add as a child to DOM element elt @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_elt(struct soap_dom_element *elt, const struct soap_dom_element *node) { if (elt && node) { struct soap_dom_element *last; struct soap_dom_element **next = &elt->elts; for (last = elt->elts; last; last = last->next) if (!last->next) next = &last->next; *next = new_element(elt->soap); if (*next) { soap_elt_copy(*next, node); (*next)->prnt = elt; } } return elt; } /******************************************************************************/ /** @brief Copy list of attribute nodes to an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element to populate @param atts pointer to list of xsd__anyAttribute attribute nodes to copy and add to DOM element elt @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_atts(struct soap_dom_element *elt, const struct soap_dom_attribute *atts) { if (elt && atts) { struct soap_dom_attribute *last; struct soap_dom_attribute **next = &elt->atts; for (last = elt->atts; last; last = last->next) if (!last->next) next = &last->next; for (; atts; atts = atts->next) { *next = new_attribute(elt->soap); if (*next) { soap_att_copy(*next, atts); next = &(*next)->next; } } } return elt; } /******************************************************************************/ /** @brief Copy list of element nodes to an xsd__anyType DOM element node as children @param elt pointer to xsd__anyType DOM element to populate @param elts pointer to list of xsd__anyType DOM element nodes to copy and add as children to DOM element elt @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_elts(struct soap_dom_element *elt, const struct soap_dom_element *elts) { if (elt && elts) { struct soap_dom_element *last; struct soap_dom_element **next = &elt->elts; for (last = elt->elts; last; last = last->next) if (!last->next) next = &last->next; for (; elts; elts = elts->next) { *next = new_element(elt->soap); if (*next) { soap_elt_copy(*next, elts); (*next)->prnt = elt; next = &(*next)->next; } } } return elt; } /******************************************************************************\ * * soap_dom_element assignment * \******************************************************************************/ /** @brief Set text of an xsd__anyType DOM element node to Boolean "false" or "true" @param elt pointer to xsd__anyType DOM element node to set @param b Boolean value (zero = false, nonzero = true) @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_bool(struct soap_dom_element *elt, LONG64 b) { if (elt) elt->text = b ? "true" : "false"; return elt; } /******************************************************************************/ /** @brief Set text of an xsd__anyType DOM element node to a 64 bit integer value @param elt pointer to xsd__anyType DOM element node to set @param n 64 bit integer value @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_int(struct soap_dom_element *elt, LONG64 n) { return soap_elt_text(elt, soap_LONG642s(elt->soap, n)); } /******************************************************************************/ /** @brief Set text of an xsd__anyType DOM element node to a double float value @param elt pointer to xsd__anyType DOM element node to set @param x double float value (NaN and +/-INF are also supported) @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_double(struct soap_dom_element *elt, double x) { return soap_elt_text(elt, soap_double2s(elt->soap, x)); } /******************************************************************************/ /** @brief Set text of an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node to set @param text string or NULL @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_text(struct soap_dom_element *elt, const char *text) { if (elt) elt->text = soap_strdup(elt->soap, text); return elt; } /******************************************************************************/ /** @brief Set text of an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node to set @param text wide string or NULL @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_text_w(struct soap_dom_element *elt, const wchar_t *text) { if (elt) elt->text = soap_wchar2s(elt->soap, text); return elt; } /******************************************************************************/ /** @brief Set an xsd__anyType DOM element node to point to a serializable object @param elt pointer to xsd__anyType DOM element node to set @param node pointer to serializable object @param type SOAP_TYPE_T type of the serializable object of type T @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_node(struct soap_dom_element *elt, const void *node, int type) { if (elt) { elt->node = node; elt->type = type; } return elt; } /******************************************************************************/ /** @brief Copy an xsd__anyType DOM element node to another (not a deep copy) @param elt pointer to xsd__anyType DOM element node to copy to (destination) @param node pointer to xsd__anyType DOM element node to copy from (source) @return elt */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_copy(struct soap_dom_element *elt, const struct soap_dom_element *node) { if (!elt) return NULL; if (!elt->soap) elt->soap = node->soap; elt->nstr = node->nstr; elt->name = node->name; elt->lead = node->lead; elt->text = node->text; elt->code = node->code; elt->tail = node->tail; elt->node = node->node; elt->type = node->type; soap_add_atts(elt, node->atts); return soap_add_elts(elt, node->elts); } /******************************************************************************\ * * soap_dom_element properties * \******************************************************************************/ /** @brief Match the namespace URI and tag name of an xsd__anyType DOM element node against a pattern @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, NULL and "" match the null (empty) namespace) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return nonzero if match */ SOAP_FMAC1 int SOAP_FMAC2 soap_elt_match(const struct soap_dom_element *elt, const char *ns, const char *patt) { if (!elt || !elt->name) return 0; if (!ns && patt) ns = soap_ns_to_find(elt->soap, patt); if (patt && !soap_patt_match(elt->name, patt)) return 0; if (ns && (elt->nstr || *ns) && (!elt->nstr || !soap_name_match(elt->nstr, ns))) return 0; return 1; } /******************************************************************************/ /** @brief Match the namespace URI and tag name of an xsd__anyType DOM element node against a pattern @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, NULL and "" match the null (empty) namespace) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return nonzero if match */ SOAP_FMAC1 int SOAP_FMAC2 soap_elt_match_w(const struct soap_dom_element *elt, const char *ns, const wchar_t *patt) { const char *s; int r = 1; if (!elt || !elt->name) return 0; s = soap_wchar2s(NULL, patt); if (!ns && s) ns = soap_ns_to_find(elt->soap, s); if (s && !soap_patt_match(elt->name, s)) r = 0; else if (ns && (elt->nstr || *ns) && (!elt->nstr || !soap_name_match(elt->nstr, ns))) r = 0; if (s) free((void*)s); return r; } /******************************************************************************/ /** @brief Get the namespace URI of an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @return namespace URI string or NULL */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_elt_get_ns(const struct soap_dom_element *elt) { if (elt) return elt->nstr; return NULL; } /******************************************************************************/ /** @brief Get the tag name of an xsd__anyType DOM element node, if any @param elt pointer to xsd__anyType DOM element node @return tag name string or NULL */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_elt_get_tag(const struct soap_dom_element *elt) { if (elt) return elt->name; return NULL; } /******************************************************************************/ /** @brief Return nonzero if xsd__anyType DOM element node text is Boolean "true" or "1" @param elt pointer to xsd__anyType DOM element node @return zero (not "true" or "1") or nonzero ("true" or "1") */ SOAP_FMAC1 int SOAP_FMAC2 soap_elt_is_true(const struct soap_dom_element *elt) { return elt->text && (!strcmp(elt->text, "true") || !strcmp(elt->text, "1")); } /******************************************************************************/ /** @brief Return nonzero if xsd__anyType DOM element node text is Boolean "false" or "0" @param elt pointer to xsd__anyType DOM element node @return zero (not "false" or "0") or nonzero ("false" or "0") */ SOAP_FMAC1 int SOAP_FMAC2 soap_elt_is_false(const struct soap_dom_element *elt) { return elt->text && (!strcmp(elt->text, "false") || !strcmp(elt->text, "0")); } /******************************************************************************/ /** @brief Return integer value of numeric text of xsd__anyType DOM element node, requires non-NULL soap context in the DOM @param elt pointer to xsd__anyType DOM element node @return integer value or 0 if text is not numeric */ SOAP_FMAC1 int SOAP_FMAC2 soap_elt_get_int(const struct soap_dom_element *elt) { if (elt) { int n; if (elt->text && !soap_s2int(elt->soap, elt->text, &n)) return n; elt->soap->error = SOAP_OK; } return 0; } /******************************************************************************/ /** @brief Return long integer value of numeric text of xsd__anyType DOM element node, requires non-NULL soap context in the DOM @param elt pointer to xsd__anyType DOM element node @return long integer value or 0 if text is not numeric */ SOAP_FMAC1 long SOAP_FMAC2 soap_elt_get_long(const struct soap_dom_element *elt) { if (elt) { long n; if (elt->text && !soap_s2long(elt->soap, elt->text, &n)) return n; elt->soap->error = SOAP_OK; } return 0; } /******************************************************************************/ /** @brief Return 64 bit integer value of numeric text of xsd__anyType DOM element node, requires non-NULL soap context in the DOM @param elt pointer to xsd__anyType DOM element node @return 64 bit integer value or 0 if text is not numeric */ SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_elt_get_LONG64(const struct soap_dom_element *elt) { if (elt) { LONG64 n; if (elt->text && !soap_s2LONG64(elt->soap, elt->text, &n)) return n; elt->soap->error = SOAP_OK; } return 0; } /******************************************************************************/ /** @brief Return double float value of decimal text of xsd__anyType DOM element node, requires non-NULL soap context in the DOM @param elt pointer to xsd__anyType DOM element node @return double float value or NaN if text is not numeric */ SOAP_FMAC1 double SOAP_FMAC2 soap_elt_get_double(const struct soap_dom_element *elt) { if (elt) { double x; if (elt->text && !soap_s2double(elt->soap, elt->text, &x)) return x; elt->soap->error = SOAP_OK; } return DBL_NAN; } /******************************************************************************/ /** @brief Return text of xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @return string or NULL */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_elt_get_text(const struct soap_dom_element *elt) { if (elt) return elt->text; return NULL; } /******************************************************************************/ /** @brief Get pointer to deserialized object stored in xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @param type SOAP_TYPE_T requested type to match @return pointer to deserialized object or NULL if type mismatch or when no deserialized object is present */ SOAP_FMAC1 const void * SOAP_FMAC2 soap_elt_get_node(const struct soap_dom_element *elt, int type) { if (!elt || elt->type != type) return NULL; return elt->node; } /******************************************************************************/ /** @brief Get pointer to deserialized object stored in xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @param node pointer to pointer to void, to be set to point to deserialized object @return SOAP_TYPE_T type of deserialized object, or zero (0) if none */ SOAP_FMAC1 int SOAP_FMAC2 soap_elt_get_type(const struct soap_dom_element *elt, const void **node) { if (!elt) return 0; *node = &elt->node; return elt->type; } /******************************************************************************/ /** @brief Return pointer to parent of an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @return pointer to xsd__anyType DOM element or NULL */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_parent(const struct soap_dom_element *elt) { if (!elt) return NULL; return elt->prnt; } /******************************************************************************/ /** @brief Return depth from the root node of an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @return depth from root node, zero if node is a root node and has no parent */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_depth(const struct soap_dom_element *elt) { size_t n = 0; while (elt) { elt = elt->prnt; n++; } return n; } /******************************************************************************/ /** @brief Return child index of an xsd__anyType DOM child element node in sibling list @param elt pointer to xsd__anyType DOM element node @return nonzero index of child among siblings, or 0 if node is a root node and has no parent */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_index(const struct soap_dom_element *elt) { size_t n = 0; if (elt && elt->prnt) { const struct soap_dom_element *node; n++; for (node = elt->prnt->elts; node && node != elt; n++, node = node->next) continue; } return n; } /******************************************************************************/ /** @brief Return number of siblings of an xsd__anyType DOM child node that have the same namespace URI and tag name @param elt pointer to xsd__anyType DOM element node @return number of siblings plus one (for self) that have the same namespace URI and tag name */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_len(const struct soap_dom_element *elt) { size_t n = 0; if (elt && elt->prnt) { const struct soap_dom_element *node; for (node = soap_elt_get(elt->prnt, elt->nstr, elt->name); node; n++, node = soap_elt_get_next(node)) continue; } return n; } /******************************************************************************/ /** @brief Return index of an xsd__anyType DOM child node among siblings that have the same namespace URI and tag name @param elt pointer to xsd__anyType DOM element node @return nonzero N-th index (1 <= nth <= len), or 0 if element is root or is singular (has no siblings with the same namespace URI and tag name) */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_nth(const struct soap_dom_element *elt) { size_t n = 0; if (elt && elt->prnt) { const struct soap_dom_element *node; for (node = soap_elt_get(elt->prnt, elt->nstr, elt->name); node && node != elt; n++, node = soap_elt_get_next(node)) continue; if (node && (n > 0 || soap_elt_get_next(node))) n++; } return n; } /******************************************************************************\ * * soap_dom_attribute construction * \******************************************************************************/ /** @brief Returns pointer to new xsd__anyAttribute DOM attribute node @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string @return pointer to xsd__anyAttribute DOM attribute node */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_new(struct soap *soap, const char *ns, const char *tag) { return soap_att_set(new_attribute(soap), ns, tag); } /******************************************************************************/ /** @brief Returns pointer to new xsd__anyAttribute DOM attribute node @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string @return pointer to xsd__anyAttribute DOM attribute node */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_new_w(struct soap *soap, const char *ns, const wchar_t *tag) { return soap_att_set_w(new_attribute(soap), ns, tag); } /******************************************************************************/ /** @brief Set xsd__anyAttribute DOM attribute namespace URI and tag name @param att pointer to xsd__anyAttribute DOM attribute to set @param ns namespace URI string or NULL @param tag (un)qualified tag name string @return att */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_set(struct soap_dom_attribute *att, const char *ns, const char *tag) { if (att) { att->name = soap_strdup(att->soap, tag); if (!ns) att->nstr = soap_ns_to_set(att->soap, tag); else att->nstr = soap_strdup(att->soap, ns); } return att; } /******************************************************************************/ /** @brief Set xsd__anyAttribute DOM attribute namespace URI and tag name @param att pointer to xsd__anyAttribute DOM attribute to set @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string @return att */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_set_w(struct soap_dom_attribute *att, const char *ns, const wchar_t *tag) { if (att) { att->name = soap_wchar2s(att->soap, tag); if (!ns) att->nstr = soap_ns_to_set(att->soap, att->name); else att->nstr = soap_strdup(att->soap, ns); } return att; } /******************************************************************************/ /** @brief Add an attribute node to an xsd__anyAttribute DOM attribute node, if the attribute does not already exists, to create or extend an attribute list @param att pointer to xsd__anyAttribute DOM attribute @param ns namespace URI string or NULL of attribute @param tag (un)qualified tag name string of attribute @return pointer to xsd__anyAttribute attribute node (new attribute node if none matches in the list) */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_add(struct soap_dom_attribute *att, const char *ns, const char *tag) { if (att && tag) { const char *ns1 = ns; if (!att->name) return soap_att_set(att, ns, tag); if (!ns1) ns1 = soap_ns_to_set(att->soap, tag); while (att) { if (att->name && soap_tag_match(att->name, tag) && (ns1 == att->nstr || (ns1 && att->nstr && !strcmp(ns1, att->nstr)))) return att; if (!att->next) return att->next = soap_att_new(att->soap, ns, tag); att = att->next; } } return att; } /******************************************************************************/ /** @brief Add an attribute node to an xsd__anyAttribute DOM attribute node, if the attribute does not already exists, to create or extend an attribute list @param att pointer to xsd__anyAttribute DOM attribute @param ns namespace URI string or NULL of attribute @param tag (un)qualified tag name wide string of attribute @return pointer to xsd__anyAttribute attribute node (new attribute node if none matches in the list) */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_add_w(struct soap_dom_attribute *att, const char *ns, const wchar_t *tag) { if (att && tag) { const char *name = soap_wchar2s(att->soap, tag); const char *ns1 = ns; if (!att->name) return soap_att_set(att, ns, name); if (!ns1) ns1 = soap_ns_to_set(att->soap, name); while (att) { if (att->name && soap_tag_match(att->name, name) && (ns1 == att->nstr || (ns1 && att->nstr && !strcmp(ns1, att->nstr)))) return att; if (!att->next) { att->next = soap_att_new(att->soap, ns, NULL); if (att->next) att->next->name = name; return att->next; } att = att->next; } } return att; } /******************************************************************************\ * * soap_dom_attribute assignment * \******************************************************************************/ /** @brief Set text of an xsd__anyAttribute DOM attribute node to Boolean "false" or "true" @param att pointer to xsd__anyAttribute DOM attribute node to set @param b Boolean value (zero = false, nonzero = true) @return att */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_bool(struct soap_dom_attribute *att, LONG64 b) { if (att) att->text = b ? "true" : "false"; return att; } /******************************************************************************/ /** @brief Set text of an xsd__anyAttribute DOM attribute node to a 64 bit integer value @param att pointer to xsd__anyAttribute DOM attribute node to set @param n 64 bit integer value @return att */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_int(struct soap_dom_attribute *att, LONG64 n) { return soap_att_text(att, soap_LONG642s(att->soap, n)); } /******************************************************************************/ /** @brief Set text of an xsd__anyAttribute DOM attribute node to a double float value @param att pointer to xsd__anyAttribute DOM attribute node to set @param x double float value (NaN and +/-INF are also supported) @return att */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_double(struct soap_dom_attribute *att, double x) { return soap_att_text(att, soap_double2s(att->soap, x)); } /******************************************************************************/ /** @brief Set text of an xsd__anyAttribute DOM attribute node @param att pointer to xsd__anyAttribute DOM attribute node to set @param text string or NULL @return att */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_text(struct soap_dom_attribute *att, const char *text) { if (att) att->text = soap_strdup(att->soap, text); return att; } /******************************************************************************/ /** @brief Set text of an xsd__anyAttribute DOM attribute node @param att pointer to xsd__anyAttribute DOM attribute node to set @param text wide string or NULL @return att */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_text_w(struct soap_dom_attribute *att, const wchar_t *text) { if (att) att->text = soap_wchar2s(att->soap, text); return att; } /******************************************************************************/ /** @brief Copy an xsd__anyAttribute DOM attribute node to another (not a deep copy) @param att pointer to xsd__anyAttribute DOM attribute node to copy to (destination) @param node pointer to xsd__anyAttribute DOM attribute node to copy from (source) @return att */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_copy(struct soap_dom_attribute *att, const struct soap_dom_attribute *node) { if (att) { if (!att->soap) att->soap = node->soap; att->nstr = node->nstr; att->name = node->name; att->text = node->text; } return att; } /******************************************************************************\ * * soap_dom_attribute properties * \******************************************************************************/ /** @brief Match the namespace URI and tag name of an xsd__anyAttribute DOM attribute node against a pattern @param att pointer to xsd__anyAttribute DOM attribute node @param ns namespace URI string pattern ("*" matches any, NULL and "" match the null (empty) namespace) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return nonzero if match */ SOAP_FMAC1 int SOAP_FMAC2 soap_att_match(const struct soap_dom_attribute *att, const char *ns, const char *patt) { if (!att || !att->name) return 0; if (!ns && patt) ns = soap_ns_to_find(att->soap, patt); if (patt && !soap_patt_match(att->name, patt)) return 0; if (ns && (att->nstr || *ns) && (!att->nstr || !soap_name_match(att->nstr, ns))) return 0; return 1; } /******************************************************************************/ /** @brief Match the namespace URI and tag name of an xsd__anyAttribute DOM attribute node against a pattern @param att pointer to xsd__anyAttribute DOM attribute node @param ns namespace URI string pattern ("*" matches any, NULL and "" match the null (empty) namespace) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any) @return nonzero if match */ SOAP_FMAC1 int SOAP_FMAC2 soap_att_match_w(const struct soap_dom_attribute *att, const char *ns, const wchar_t *patt) { const char *s; int r = 1; if (!att || !att->name) return 0; s = soap_wchar2s(NULL, patt); if (!ns && s) ns = soap_ns_to_find(att->soap, s); if (s && !soap_patt_match(att->name, s)) r = 0; else if (ns && (att->nstr || *ns) && (!att->nstr || !soap_name_match(att->nstr, ns))) r = 0; if (s) free((void*)s); return r; } /******************************************************************************/ /** @brief Get the namespace URI of an xsd__anyAttribute DOM attribute node @param att pointer to xsd__anyAttribute DOM attribute node @return namespace URI string or NULL */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_att_get_ns(const struct soap_dom_attribute *att) { if (att) return att->nstr; return NULL; } /******************************************************************************/ /** @brief Get the tag name of an xsd__anyAttribute DOM attribute node @param att pointer to xsd__anyAttribute DOM attribute node @return tag name string or NULL */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_att_get_tag(const struct soap_dom_attribute *att) { if (att) return att->name; return NULL; } /******************************************************************************/ /** @brief Return nonzero if xsd__anyAttribute DOM attribute node text is Boolean "true" or "1" @param att pointer to xsd__anyAttribute DOM attribute node @return zero (not "true" or "1") or nonzero ("true" or "1") */ SOAP_FMAC1 int SOAP_FMAC2 soap_att_is_true(const struct soap_dom_attribute *att) { return att->text && (!strcmp(att->text, "true") || !strcmp(att->text, "1")); } /******************************************************************************/ /** @brief Return nonzero if xsd__anyAttribute DOM attribute node text is Boolean "false" or "0" @param att pointer to xsd__anyAttribute DOM attribute node @return zero (not "false" or "0") or nonzero ("false" or "0") */ SOAP_FMAC1 int SOAP_FMAC2 soap_att_is_false(const struct soap_dom_attribute *att) { return att->text && (!strcmp(att->text, "false") || !strcmp(att->text, "0")); } /******************************************************************************/ /** @brief Return integer value of numeric text of xsd__anyAttribute DOM attribute node, requires non-NULL soap context in the DOM @param att pointer to xsd__anyAttribute DOM attribute node @return integer value or 0 if text is not numeric */ SOAP_FMAC1 int SOAP_FMAC2 soap_att_get_int(const struct soap_dom_attribute *att) { if (att) { int n; if (att->text && !soap_s2int(att->soap, att->text, &n)) return n; att->soap->error = SOAP_OK; } return 0; } /******************************************************************************/ /** @brief Return long integer value of numeric text of xsd__anyAttribute DOM attribute node, requires non-NULL soap context in the DOM @param att pointer to xsd__anyAttribute DOM attribute node @return long integer value or 0 if text is not numeric */ SOAP_FMAC1 long SOAP_FMAC2 soap_att_get_long(const struct soap_dom_attribute *att) { if (att) { long n; if (att->text && !soap_s2long(att->soap, att->text, &n)) return n; att->soap->error = SOAP_OK; } return 0; } /******************************************************************************/ /** @brief Return 64 bit integer value of numeric text of xsd__anyAttribute DOM attribute node, requires non-NULL soap context in the DOM @param att pointer to xsd__anyAttribute DOM attribute node @return 64 bit integer value or 0 if text is not numeric */ SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_att_get_LONG64(const struct soap_dom_attribute *att) { if (att) { LONG64 n; if (att->text && !soap_s2LONG64(att->soap, att->text, &n)) return n; att->soap->error = SOAP_OK; } return 0; } /******************************************************************************/ /** @brief Return double float value of decimal text of xsd__anyAttribute DOM attribute node, requires non-NULL soap context in the DOM @param att pointer to xsd__anyAttribute DOM attribute node @return double float value or NaN if text is not numeric */ SOAP_FMAC1 double SOAP_FMAC2 soap_att_get_double(const struct soap_dom_attribute *att) { if (att) { double x; if (att->text && !soap_s2double(att->soap, att->text, &x)) return x; att->soap->error = SOAP_OK; } return DBL_NAN; } /******************************************************************************/ /** @brief Return text of xsd__anyAttribute DOM attribute node @param att pointer to xsd__anyAttribute DOM attribute node @return string or NULL */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_att_get_text(const struct soap_dom_attribute *att) { if (att) return att->text; return NULL; } /******************************************************************************\ * * DOM local traversal * \******************************************************************************/ /** @brief Returns pointer to first xsd__anyAttribute DOM attribute node of xsd__anyType DOM element node, if any @param elt pointer to xsd__anyType DOM element node @return pointer to xsd__anyAttribute DOM attribute node or NULL if none */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_first(struct soap_dom_element *elt) { return elt->atts; } /******************************************************************************/ /** @brief Returns pointer to next xsd__anyAttribute DOM attribute node, if any @param att pointer to current xsd__anyAttribute DOM attribute node in attribute list @return pointer to xsd__anyAttribute DOM attribute node or NULL if none */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_next(const struct soap_dom_attribute *att) { return att->next; } /******************************************************************************/ /** @brief Returns pointer to first child element node of xsd__anyType DOM element node, if any @param elt pointer to xsd__anyType DOM element node @return pointer to xsd__anyType DOM child element node or NULL if none */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_first(struct soap_dom_element *elt) { return elt->elts; } /******************************************************************************/ /** @brief Returns pointer to next xsd__anyType DOM child element node, if any @param elt pointer to current xsd__anyType DOM child element node in sibling list @return pointer to xsd__anyType DOM element node or NULL if none */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_next(const struct soap_dom_element *elt) { return elt->next; } /******************************************************************************\ * * DOM local retrieval * \******************************************************************************/ /** @brief Get attribute node of an xsd__anyType DOM element node, if attribute exists @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string (NULL matches the null (empty) namespace if tag is unqualified) of attribute @param tag (un)qualified tag name string of attribute @return pointer to xsd__anyAttribute DOM attribute node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_get(const struct soap_dom_element *elt, const char *ns, const char *tag) { if (elt && tag) { struct soap_dom_attribute *att; if (!ns) ns = soap_ns_to_get(elt->soap, tag); for (att = elt->atts; att; att = att->next) if (att->name && soap_tag_match(att->name, tag) && ((!att->nstr && !*ns) || (att->nstr && !strcmp(att->nstr, ns)))) return att; } return NULL; } /******************************************************************************/ /** @brief Get attribute node of an xsd__anyType DOM element node, if attribute exists @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string (NULL matches the null (empty) namespace if tag is unqualified) of attribute @param tag (un)qualified tag name wide string of attribute @return pointer to xsd__anyAttribute DOM attribute node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_get_w(const struct soap_dom_element *elt, const char *ns, const wchar_t *tag) { if (elt && tag) { const char *name = soap_wchar2s(NULL, tag); struct soap_dom_attribute *att = NULL; if (!ns) ns = soap_ns_to_get(elt->soap, name); for (att = elt->atts; att; att = att->next) if (att->name && soap_tag_match(att->name, name) && ((!att->nstr && !*ns) || (att->nstr && !strcmp(att->nstr, ns)))) break; if (name) free((void*)name); return att; } return NULL; } /******************************************************************************/ /** @brief Get child element node of an xsd__anyType DOM element node, if child element exists @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string (NULL matches the null (empty) namespace if tag is unqualified) of child element @param tag (un)qualified tag name string (NULL matches unnamed node) of child element @return pointer to xsd__anyType DOM child element node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get(const struct soap_dom_element *elt, const char *ns, const char *tag) { if (elt) { struct soap_dom_element *node; if (!ns) ns = soap_ns_to_get(elt->soap, tag); for (node = elt->elts; node; node = node->next) if ((tag == node->name || (tag && soap_tag_match(node->name, tag))) && ((!node->nstr && !*ns) || (node->nstr && !strcmp(node->nstr, ns)))) return node; } return NULL; } /******************************************************************************/ /** @brief Get child element node of an xsd__anyType DOM element node, if child element exists @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string (NULL matches the null (empty) namespace if tag is unqualified) of child element @param tag (un)qualified tag name wide string (NULL matches unnamed node) of child element @return pointer to xsd__anyType DOM child element node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get_w(const struct soap_dom_element *elt, const char *ns, const wchar_t *tag) { if (elt) { const char *name = soap_wchar2s(NULL, tag); struct soap_dom_element *node; if (!ns) ns = soap_ns_to_get(elt->soap, name); for (node = elt->elts; node; node = node->next) if (((!name && !node->name) || (name && soap_tag_match(node->name, name))) && ((!node->nstr && !*ns) || (node->nstr && !strcmp(node->nstr, ns)))) break; if (name) free((void*)name); return node; } return NULL; } /******************************************************************************/ /** @brief Get next child element node that has the same namespace URI and tag name as the current child element node @param elt pointer to current xsd__anyType DOM child element node @return pointer to xsd__anyType DOM child element node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get_next(const struct soap_dom_element *elt) { if (elt) { const char *ns = elt->nstr; const char *tag = elt->name; struct soap_dom_element *node; for (node = elt->next; node; node = node->next) if ((tag == node->name || (tag && soap_tag_match(node->name, tag))) && (ns == node->nstr || (ns && node->nstr && !strcmp(node->nstr, ns)))) return node; } return NULL; } /******************************************************************************/ /** @brief Get N-th child element node that has the same namespace URI and tag name as the current child element node at position one (1) in the sibling list @param elt pointer to current xsd__anyType DOM child element node at position one (1) in the sibling list @param n N-th element minus one located from the current element node at position one (1), 1 returns the current element (elt) @return pointer to xsd__anyType DOM child element node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get_nth(struct soap_dom_element *elt, size_t n) { while (n-- > 1) elt = soap_elt_get_next(elt); return elt; } /******************************************************************************\ * * DOM local search * \******************************************************************************/ /** @brief Find matching attribute node of an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return pointer to xsd__anyAttribute DOM attribute node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_find(struct soap_dom_element *elt, const char *ns, const char *patt) { struct soap_dom_attribute *att = NULL; if (elt) { att = elt->atts; if (att) { if (!ns && patt) ns = soap_ns_to_find(elt->soap, patt); if (patt && !soap_patt_match(att->name, patt)) return soap_att_find_next(att, ns, patt); if (ns && (att->nstr || *ns) && (!att->nstr || !soap_name_match(att->nstr, ns))) return soap_att_find_next(att, ns, patt); } } return att; } /******************************************************************************/ /** @brief Find next matching attribute node of an xsd__anyType DOM element node @param att pointer to current xsd__anyAttribute DOM attribute node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return pointer to xsd__anyAttribute DOM attribute node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_find_next(const struct soap_dom_attribute *att, const char *ns, const char *patt) { if (att) { struct soap_dom_attribute *node; if (!ns && patt) ns = soap_ns_to_find(att->soap, patt); for (node = att->next; node; node = node->next) { if (patt && !soap_patt_match(node->name, patt)) continue; if (ns && (node->nstr || *ns) && (!node->nstr || !soap_name_match(node->nstr, ns))) continue; return node; } } return NULL; } /******************************************************************************/ /** @brief Find matching child element node of an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return pointer to xsd__anyType DOM child element node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find(struct soap_dom_element *elt, const char *ns, const char *patt) { return soap_elt_find_type(elt, ns, patt, 0); } /******************************************************************************/ /** @brief Find next matching child element node of an xsd__anyType DOM element node @param elt pointer to current xsd__anyType DOM child element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return pointer to xsd__anyType DOM child element node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find_next(const struct soap_dom_element *elt, const char *ns, const char *patt) { return soap_elt_find_next_type(elt, ns, patt, 0); } /******************************************************************************/ /** @brief Find matching child element node of an xsd__anyType DOM element node that has a deserialized object @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @param type SOAP_TYPE_T type of deserialized object of type T to match or 0 @return pointer to xsd__anyType DOM child element node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find_type(struct soap_dom_element *elt, const char *ns, const char *patt, int type) { if (elt) { elt = elt->elts; if (elt) { if (!ns && patt) ns = soap_ns_to_find(elt->soap, patt); if (patt && !soap_patt_match(elt->name, patt)) return soap_elt_find_next_type(elt, ns, patt, type); if (ns && (elt->nstr || *ns) && (!elt->nstr || !soap_name_match(elt->nstr, ns))) return soap_elt_find_next_type(elt, ns, patt, type); if (type && type != elt->type) return soap_elt_find_next_type(elt, ns, patt, type); } } return elt; } /******************************************************************************/ /** @brief Find next matching child element node of an xsd__anyType DOM element node that has a deserialized object @param elt pointer to current xsd__anyType DOM child element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @param type SOAP_TYPE_T type of deserialized object of type T to match or 0 @return pointer to xsd__anyType DOM child element node or NULL if not exists */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find_next_type(const struct soap_dom_element *elt, const char *ns, const char *patt, int type) { if (elt) { struct soap_dom_element *node; if (!ns && patt) ns = soap_ns_to_find(elt->soap, patt); for (node = elt->next; node; node = node->next) { if (patt && !soap_patt_match(node->name, patt)) continue; if (ns && (node->nstr || *ns) && (!node->nstr || !soap_name_match(node->nstr, ns))) continue; if (type && type != node->type) continue; return node; } } return NULL; } /******************************************************************************\ * * DOM size of local search results * \******************************************************************************/ /** @brief Return number of matching attribute nodes of an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return number of matches found */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_att_size(struct soap_dom_element *elt, const char *ns, const char *patt) { size_t n = 0; if (elt) { struct soap_dom_attribute *att = soap_att_find(elt, ns, patt); if (att) { n++; while ((att = soap_att_find_next(att, ns, patt))) n++; } } return n; } /******************************************************************************/ /** @brief Return number of matching child element nodes of an xsd__anyType DOM element node @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return number of matches found */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_size(struct soap_dom_element *elt, const char *ns, const char *patt) { return soap_elt_size_type(elt, ns, patt, 0); } /******************************************************************************/ /** @brief Return number of matching child element nodes of an xsd__anyType DOM element node that have deserialized objects @param elt pointer to xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @param type SOAP_TYPE_T type of deserialized object of type T to match or 0 @return number of matches found */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_size_type(struct soap_dom_element *elt, const char *ns, const char *patt, int type) { size_t n = 0; if (elt) { elt = soap_elt_find_type(elt, ns, patt, type); if (elt) { n++; while ((elt = soap_elt_find_next_type(elt, ns, patt, type))) n++; } } return n; } /******************************************************************************\ * * DOM deep traversal * \******************************************************************************/ /** @brief Return next xsd__anyAttribute DOM attribute node in attribute list @param att pointer to current xsd__anyAttribute DOM attribute node @return pointer to xsd__anyAttribute DOM node or NULL if none */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_dom_next_attribute(const struct soap_dom_attribute *att) { return att->next; } /******************************************************************************/ /** @brief Return next xsd__anyType DOM element node in depth-first traversal of node graph (XPath recursive descent) @param elt pointer to current xsd__anyType DOM element node @param end pointer to the ending xsd__anyType DOM element node (exclusive), usually the starting node of the graph traversal @return pointer to xsd__anyType DOM node or NULL if none or if next node would be the ending node */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_next_element(const struct soap_dom_element *elt, const struct soap_dom_element *end) { struct soap_dom_element *node; if (elt->elts) return elt->elts; if (elt == end) return NULL; if (elt->next) return elt->next; for (node = elt->prnt; node && !node->next; node = node->prnt) if (node == end) return NULL; if (node) node = node->next; return node; } /******************************************************************************\ * * DOM deep search * \******************************************************************************/ /** @brief Find matching xsd__anyType DOM element node in depth-first traversal of node graph (XPath recursive descent) @param begin pointer to starting xsd__anyType DOM element node of node graph to search @param end pointer to the ending xsd__anyType DOM element node (exclusive), usually the starting node of the graph traversal @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (use '@' to match attributes, NULL, "*" and "*:*" match any, "" matches unnamed node) @param type SOAP_TYPE_T type of deserialized object of type T to match or 0 @return pointer to xsd__anyType DOM node or NULL if none or if next node would be the ending node */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_find(struct soap_dom_element *begin, const struct soap_dom_element *end, const char *ns, const char *patt, int type) { if (begin) { if (patt && *patt == '@') { if (soap_att_find(begin, ns, patt + 1)) return begin; return soap_dom_find_next(begin, end, ns, patt, type); } if (!ns && patt) ns = soap_ns_to_find(begin->soap, patt); if (patt && !soap_patt_match(begin->name, patt)) return soap_dom_find_next(begin, end, ns, patt, type); if (ns && (begin->nstr || *ns) && (!begin->nstr || !soap_name_match(begin->nstr, ns))) return soap_dom_find_next(begin, end, ns, patt, type); if (type && type != begin->type) return soap_dom_find_next(begin, end, ns, patt, type); } return begin; } /******************************************************************************/ /** @brief Find next matching xsd__anyType DOM element node in depth-first traversal of node graph (XPath recursive descent) @param elt pointer to current xsd__anyType DOM element node of node graph to search @param end pointer to the ending xsd__anyType DOM element node, usually the starting node of the graph traversal @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (use '@' to match attributes, NULL, "*" and "*:*" match any, "" matches unnamed node) @param type SOAP_TYPE_T type of deserialized object of type T to match or 0 @return pointer to xsd__anyType DOM node or NULL if none or if next node would be the ending node */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_find_next(const struct soap_dom_element *elt, const struct soap_dom_element *end, const char *ns, const char *patt, int type) { if (elt) { struct soap_dom_element *node; if (!ns && patt) ns = soap_ns_to_find(elt->soap, patt + (*patt == '@')); for (node = soap_dom_next_element(elt, end); node; node = soap_dom_next_element(node, end)) { if (patt && *patt == '@') { if (soap_att_find(node, ns, patt + 1)) return node; continue; } if (patt && !soap_patt_match(node->name, patt)) continue; if (ns && (node->nstr || *ns) && (!node->nstr || !soap_name_match(node->nstr, ns))) continue; if (type && type != node->type) continue; return node; } } return NULL; } /******************************************************************************\ * * C REST POST, GET, PUT, DELETE server invocation * \******************************************************************************/ /* @brief REST POST, GET, PUT, DELETE server invocation with XML @param soap context to manage IO @param endpoint server URL @param optional SOAP Action or NULL @param in request XML to be send to server, or NULL for GET or DELETE (both in and out are NULL) @param out response to be populated with response XML received from server, or NULL for PUT or DELETE (both in and out are NULL) */ SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element *in, struct soap_dom_element *out) { if (out) soap_default_xsd__anyType(soap, out); if (in) soap_serialize_xsd__anyType(soap, in); soap->http_content = "text/xml; charset=utf-8"; if (soap_begin_count(soap) || ((soap->mode & SOAP_IO_LENGTH) && soap_out_xsd__anyType(soap, NULL, 0, in, NULL)) || soap_end_count(soap) || soap_connect_command(soap, in && out ? SOAP_POST_FILE : out ? SOAP_GET : in ? SOAP_PUT : SOAP_DEL, endpoint, action) || soap_out_xsd__anyType(soap, NULL, 0, in, NULL) || soap_end_send(soap)) return soap_closesock(soap); if (!out) { if (!soap_begin_recv(soap)) { #ifndef WITH_LEAN (void)soap_http_get_body(soap, NULL); #endif (void)soap_end_recv(soap); } else if (soap->error == 200 || soap->error == 201 || soap->error == 202) soap->error = SOAP_OK; return soap_closesock(soap); } if (soap_begin_recv(soap) || soap_in_xsd__anyType(soap, NULL, out, NULL) == NULL || soap_end_recv(soap)) return soap_closesock(soap); return soap_closesock(soap); } /******************************************************************************/ #ifdef __cplusplus /******************************************************************************\ * * C++ REST POST, GET, PUT, DELETE server invocation * \******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element& in, struct soap_dom_element& out) { return soap_dom_call(soap, endpoint, action, &in, &out); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element *in, struct soap_dom_element& out) { return soap_dom_call(soap, endpoint, action, in, &out); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element& in, struct soap_dom_element *out) { return soap_dom_call(soap, endpoint, action, &in, out); } /******************************************************************************\ * * C++ soap_dom_element and soap_dom_attribute classes * \******************************************************************************/ #if 0 /* DOXYGEN PROCESSING ONLY */ /** @class soap_dom_attribute @brief The xsd__anyAttribute DOM attribute node structure (xsd__anyAttribute is a typedef of soap_dom_attribute) */ struct soap_dom_attribute { struct soap_dom_attribute *next; ///< next attribute node in list const char *nstr; ///< namespace string const char *name; ///< (un)qualified tag name const char *text; ///< text cdata in UTF-8 struct soap *soap; ///< context that manages this object /** iterator over attribute list */ typedef soap_dom_attribute_iterator iterator; /** @brief Construct new xsd__anyAttribute DOM attribute that is empty (must be set later) @param soap context that manages this object */ soap_dom_attribute(struct soap *soap = NULL); /** @brief Construct new xsd__anyAttribute DOM attribute by (shallow) copying another attribute @param att xsd__anyAttribute DOM attribute copied */ soap_dom_attribute(const soap_dom_attribute& att); /** @brief Construct new xsd__anyAttribute DOM attribute with (un)qualified tag name, same as xsd__anyAttribute(soap, NULL, tag, NULL) @param soap context that manages this object @param tag (un)qualified tag name string */ soap_dom_attribute(struct soap *soap, const char *tag); /** @brief Construct new xsd__anyAttribute DOM attribute with (un)qualified tag name, same as xsd__anyAttribute(soap, NULL, tag, NULL) @param soap context that manages this object @param tag (un)qualified tag name wide string */ soap_dom_attribute(struct soap *soap, const wchar_t *tag); /** @brief Construct new xsd__anyAttribute DOM attribute with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string @param text string */ soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const char *text); /** @brief Construct new xsd__anyAttribute DOM attribute with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string @param text wide string */ soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const wchar_t *text); /** @brief Construct new xsd__anyAttribute DOM attribute with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string @param text string */ soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const char *text); /** @brief Construct new xsd__anyAttribute DOM attribute with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string @param text wide string */ soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const wchar_t *text); /** @brief Construct new xsd__anyAttribute DOM attribute with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string @param text string */ soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const std::string& text); /** @brief Construct new xsd__anyAttribute DOM attribute with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string @param text wide string */ soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const std::wstring& text); /** @brief Construct new xsd__anyAttribute DOM attribute with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string @param text string */ soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const std::string& text); /** @brief Construct new xsd__anyAttribute DOM attribute with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string @param text wide string */ soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const std::wstring& text); /** @brief Destructor (no-op, deletes are done by the managing context of this object) */ ~soap_dom_attribute(); /** @brief Set this xsd__anyAttribute DOM attribute namespace URI and tag name @param ns namespace URI string or NULL @param tag (un)qualified tag name string @return reference to *this */ soap_dom_attribute& set(const char *ns, const char *tag); /** @brief Set this xsd__anyAttribute DOM attribute namespace URI and tag name @param ns namespace URI string or NULL @param tag (un)qualified tag name string @return reference to *this */ soap_dom_attribute& set(const char *ns, const wchar_t *tag); /** @brief Set text of this xsd__anyAttribute DOM attribute node to Boolean "false" or "true" @param b Boolean value @return reference to *this */ soap_dom_attribute& set(bool b); /** @brief Set text of this xsd__anyAttribute DOM attribute node to an integer value @param n integer value @return reference to *this */ soap_dom_attribute& set(int n); /** @brief Set text of this xsd__anyAttribute DOM attribute node to a 64 bit integer value @param n 64 bit integer value @return reference to *this */ soap_dom_attribute& set(LONG64 n); /** @brief Set text of this xsd__anyAttribute DOM attribute node to a float value @param x float value (NaN and +/-INF are also supported) @return reference to *this */ soap_dom_attribute& set(float x); /** @brief Set text of this xsd__anyAttribute DOM attribute node to a double float value @param x double float value (NaN and +/-INF are also supported) @return reference to *this */ soap_dom_attribute& set(double x); /** @brief Set text of this xsd__anyAttribute DOM attribute node @param text string or NULL @return reference to *this */ soap_dom_attribute& set(const char *text); /** @brief Set text of this xsd__anyAttribute DOM attribute node @param text wide string or NULL @return reference to *this */ soap_dom_attribute& set(const wchar_t *text); /** @brief Set text of this xsd__anyAttribute DOM attribute node @param text string or NULL @return reference to *this */ soap_dom_attribute& set(const std::string& text); /** @brief Set text of this xsd__anyAttribute DOM attribute node @param text wide string or NULL @return reference to *this */ soap_dom_attribute& set(const std::wstring& text); /** @brief Set text of this xsd__anyAttribute DOM attribute node to Boolean "false" or "true", same as set(b) @param b Boolean value @return reference to *this */ soap_dom_attribute& operator=(bool b); /** @brief Set text of this xsd__anyAttribute DOM attribute node to an integer value, same as set(n) @param n integer value @return reference to *this */ soap_dom_attribute& operator=(int n); /** @brief Set text of this xsd__anyAttribute DOM attribute node to a 64 bit integer value, same as set(n) @param n 64 bit integer value @return reference to *this */ soap_dom_attribute& operator=(LONG64 n); /** @brief Set text of this xsd__anyAttribute DOM attribute node to a float value, same as set(x) @param x float value (NaN and +/-INF are also supported) @return reference to *this */ soap_dom_attribute& operator=(float x); /** @brief Set text of this xsd__anyAttribute DOM attribute node to a double float value, same as set(x) @param x double float value (NaN and +/-INF are also supported) @return reference to *this */ soap_dom_attribute& operator=(double x); /** @brief Set text of this xsd__anyAttribute DOM attribute node, same as set(text) @param text string or NULL @return reference to *this */ soap_dom_attribute& operator=(const char *text); /** @brief Set text of this xsd__anyAttribute DOM attribute node, same as set(text) @param text wide string or NULL @return reference to *this */ soap_dom_attribute& operator=(const wchar_t *text); /** @brief Set text of this xsd__anyAttribute DOM attribute node, same as set(text) @param text string or NULL @return reference to *this */ soap_dom_attribute& operator=(const std::string& text); /** @brief Set text of this xsd__anyAttribute DOM attribute node, same as set(text) @param text wide string or NULL @return reference to *this */ soap_dom_attribute& operator=(const std::wstring& text); /** @brief Copy an xsd__anyAttribute DOM attribute node to this node (not a deep copy) @param att pointer to xsd__anyAttribute DOM attribute node to copy from @return reference to *this */ soap_dom_attribute& operator=(const soap_dom_attribute& att); /** @brief Add an attribute node to this xsd__anyAttribute DOM attribute node to create or extend an attribute list, same as att(NULL, tag) @param tag (un)qualified tag name string of attribute @return reference to xsd__anyAttribute attribute node (new attribute node if none matches in the list) */ soap_dom_attribute& att(const char *tag); /** @brief Add an attribute node to this xsd__anyAttribute DOM attribute node to create or extend an attribute list, same as att(NULL, tag) @param tag (un)qualified tag name wide string of attribute @return reference to xsd__anyAttribute attribute node (new attribute node if none matches in the list) */ soap_dom_attribute& att(const wchar_t *tag); /** @brief Add an attribute node to this xsd__anyAttribute DOM attribute node to create or extend an attribute list @param ns namespace URI string or NULL of attribute @param tag (un)qualified tag name string of attribute @return reference to xsd__anyAttribute attribute node (new attribute node if none matches in the list) */ soap_dom_attribute& att(const char *ns, const char *tag); /** @brief Add an attribute node to this xsd__anyAttribute DOM attribute node to create or extend an attribute list @param ns namespace URI string or NULL of attribute @param tag (un)qualified tag name wide string of attribute @return reference to xsd__anyAttribute attribute node (new attribute node if none matches in the list) */ soap_dom_attribute& att(const char *ns, const wchar_t *tag); /** @brief Match the namespace URI and tag name of this xsd__anyAttribute DOM attribute node against a pattern, same as match(NULL, patt) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return true if match */ bool match(const char *patt) const; /** @brief Match the namespace URI and tag name of this xsd__anyAttribute DOM attribute node against a pattern, same as match(NULL, patt) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any) @return true if match */ bool match(const wchar_t *patt) const; /** @brief Match the namespace URI and tag name of this xsd__anyAttribute DOM attribute node against a pattern @param ns namespace URI string pattern ("*" matches any, NULL and "" match the null (empty) namespace) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return true if match */ bool match(const char *ns, const char *patt) const; /** @brief Match the namespace URI and tag name of this xsd__anyAttribute DOM attribute node against a pattern @param ns namespace URI string pattern ("*" matches any, NULL and "" match the null (empty) namespace) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any) @return true if match */ bool match(const char *ns, const wchar_t *patt) const; /** @brief Get the namespace URI of this xsd__anyAttribute DOM attribute node @return namespace URI string or NULL */ const char *ns() const; /** @brief Get the tag name of this xsd__anyAttribute DOM attribute node @return tag name string or NULL */ const char *tag() const; /** @brief Return true if this xsd__anyAttribute DOM attribute node text is Boolean "true" or "1" @return true if "true" or "1" */ bool is_true() const; /** @brief Return true if this xsd__anyAttribute DOM attribute node text is Boolean "false" or "0" @return true if "false" or "0" */ bool is_false() const; /** @brief Return 64 bit integer value of numeric text of this xsd__anyAttribute DOM attribute node @return 64 bit integer value or 0 if text is not numeric */ LONG64 get_int() const; /** @brief Return double float value of decimal text of this xsd__anyAttribute DOM attribute node @return double float value or NaN if text is not numeric */ double get_double() const; /** @brief Return text of this xsd__anyAttribute DOM attribute node @return string or NULL */ const char *get_text() const; /** @brief Return true if this xsd__anyAttribute DOM attribute node text is Boolean "true" or "1", same as is_true() @return true if "true" or "1" */ operator bool() const; /** @brief Return integer value of numeric text of this xsd__anyAttribute DOM attribute node, same as (int)get_int() @return integer value or 0 if text is not numeric */ operator int() const; /** @brief Return 64 bit integer value of numeric text of this xsd__anyAttribute DOM attribute node, same as get_int() @return 64 bit integer value or 0 if text is not numeric */ operator LONG64() const; /** @brief Return double float value of decimal text of this xsd__anyAttribute DOM attribute node, same as get_double() @return double float value or NaN if text is not numeric */ operator double() const; /** @brief Return text of this xsd__anyAttribute DOM attribute node, same as get_text() @return string or NULL */ operator const char*() const; /** @brief Return iterator to begin of attribute nodes starting with this attribute @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_begin(); /** @brief Return iterator to end of attribute nodes @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_end(); /** @brief Return iterator to search for matching attributes of this node, same as att_find(NULL, patt) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_find(const char *patt); /** @brief Return iterator to search for matching attributes of this node, same as att_find(NULL, patt) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any) @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_find(const wchar_t *patt); /** @brief Return iterator to search for matching attributes of this node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_find(const char *ns, const char *patt); /** @brief Return iterator to search for matching attributes of this node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_find(const char *ns, const wchar_t *patt); void unlink(); }; /** @brief The xsd__anyAttribute DOM attribute node structure (xsd__anyAttribute is a typedef of soap_dom_attribute) */ typedef soap_dom_attribute xsd__anyAttribute; /** @class soap_dom_element @brief The xsd__anyType DOM element node structure (xsd__anyType is a typedef of soap_dom_element) */ struct soap_dom_element { struct soap_dom_element *next; ///< next sibling element node in list struct soap_dom_element *prnt; ///< pointer to parent node struct soap_dom_element *elts; ///< list of child element nodes struct soap_dom_attribute *atts; ///< list of attribute nodes const char *nstr; ///< namespace string const char *name; ///< (un)qualified tag name const char *lead; ///< leading XML content before start tag (used with WITH_DOM) const char *text; ///< text cdata in UTF-8 const char *code; ///< XML "code" (plain unconverted XML used with WTIH_DOM) const char *tail; ///< trailing XML content before end tag (used with WITH_DOM) const void *node; ///< pointer to serializable object int type; ///< SOAP_TYPE_T type of serializable object or 0 struct soap *soap; ///< soap context that manages this object /** iterator over sibling element node list */ typedef soap_dom_element_iterator iterator; /** @brief Construct new xsd__anyType DOM element @param soap context that manages this object */ soap_dom_element(struct soap *soap = NULL); /** @brief Construct new xsd__anyType DOM element by (shallow) copying another element @param elt xsd__anyType DOM element copied */ soap_dom_element(const soap_dom_element& elt); /** @brief Construct new xsd__anyType DOM element with (un)qualified tag name, same as xsd__anyType(soap, NULL, tag) @param soap context that manages this object @param tag (un)qualified tag name string or NULL (unnamed node) */ soap_dom_element(struct soap *soap, const char *tag); /** @brief Construct new xsd__anyType DOM element with (un)qualified tag name, same as xsd__anyType(soap, NULL, tag) @param soap context that manages this object @param tag (un)qualified tag name wide string or NULL (unnamed node) */ soap_dom_element(struct soap *soap, const wchar_t *tag); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns) and (un)qualified tag name @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string or NULL (unnamed node) */ soap_dom_element(struct soap *soap, const char *ns, const char *tag); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns) and (un)qualified tag name @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string or NULL (unnamed node) */ soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string or NULL (unnamed node) @param text string or NULL */ soap_dom_element(struct soap *soap, const char *ns, const char *tag, const char *text); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string or NULL (unnamed node) @param text wide string or NULL */ soap_dom_element(struct soap *soap, const char *ns, const char *tag, const wchar_t *text); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string or NULL (unnamed node) @param text string or NULL */ soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const char *text); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string or NULL (unnamed node) @param text wide string or NULL */ soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const wchar_t *text); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string or "" (unnamed node) @param text string */ soap_dom_element(struct soap *soap, const char *ns, const char *tag, const std::string& text); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string or "" (unnamed node) @param text string */ soap_dom_element(struct soap *soap, const char *ns, const char *tag, const std::wstring& text); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string or "" (unnamed node) @param text wide string */ soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const std::string& text); /** @brief Construct new xsd__anyType DOM element with namespace URI (xmlns), (un)qualified tag name, and text @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string or "" (unnamed node) @param text wide string */ soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const std::wstring& text); /** @brief Construct new xsd__anyType DOM element node with namespace URI (xmlns), (un)qualified tag name, and pointer to a serializable object @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name string or NULL (unnamed node) @param node pointer to serializable object @param type SOAP_TYPE_T type of the serializable object of type T */ soap_dom_element(struct soap *soap, const char *ns, const char *tag, const void *node, int type); /** @brief Construct new xsd__anyType DOM element node with namespace URI (xmlns), (un)qualified tag name, and pointer to a serializable object @param soap context that manages this object @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string or NULL (unnamed node) @param node pointer to serializable object @param type SOAP_TYPE_T type of the serializable object of type T */ soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const void *node, int type); /** @brief Destructor (no-op, deletes are done by the managing context of this object) */ ~soap_dom_element(); /** @brief Set xsd__anyType DOM element namespace URI and tag name @param ns namespace URI string or NULL @param tag (un)qualified tag name string or NULL (unnamed node) @return reference to *this */ soap_dom_element& set(const char *ns, const char *tag); /** @brief Set xsd__anyType DOM element namespace URI and tag name @param ns namespace URI string or NULL @param tag (un)qualified tag name wide string or NULL (unnamed node) @return reference to *this */ soap_dom_element& set(const char *ns, const wchar_t *tag); /** @brief Set text of this xsd__anyType DOM element node to Boolean "false" or "true" @param b Boolean value @return reference to *this */ soap_dom_element& set(bool b); /** @brief Set text of this xsd__anyType DOM element node to an integer value @param n integer value @return reference to *this */ soap_dom_element& set(int n); /** @brief Set text of this xsd__anyType DOM element node to an integer value @param n integer value @return reference to *this */ soap_dom_element& set(LONG64 n); /** @brief Set text of this xsd__anyType DOM element node to a float value @param x float value (NaN and +/-INF are also supported) @return reference to *this */ soap_dom_element& set(float x); /** @brief Set text of this xsd__anyType DOM element node to a double float value @param x double float value (NaN and +/-INF are also supported) @return reference to *this */ soap_dom_element& set(double x); /** @brief Set text of this xsd__anyType DOM element node @param text string or NULL @return reference to *this */ soap_dom_element& set(const char *text); /** @brief Set text of this xsd__anyType DOM element node @param text wide string or NULL @return reference to *this */ soap_dom_element& set(const wchar_t *text); /** @brief Set text of this xsd__anyType DOM element node @param text string @return reference to *this */ soap_dom_element& set(const std::string& text); /** @brief Set text of this xsd__anyType DOM element node @param text wide string @return reference to *this */ soap_dom_element& set(const std::wstring& text); /** @brief Set this xsd__anyType DOM element node to point to a serializable object @param node pointer to serializable object @param type SOAP_TYPE_T type of the serializable object of type T @return reference to *this */ soap_dom_element& set(const void *node, int type); /** @brief Add a child element node to this xsd__anyType DOM element node @param elt reference to element node to copy and add as a child @return reference to *this */ soap_dom_element& add(soap_dom_element& elt); /** @brief Add a child element node to this xsd__anyType DOM element node @param elt pointer to element node to copy and add as a child @return reference to *this */ soap_dom_element& add(soap_dom_element *elt); /** @brief Add an attribute node to this xsd__anyType DOM element node @param att reference to xsd__anyAttribute attribute node to copy and add @return reference to *this */ soap_dom_element& add(soap_dom_attribute& att); /** @brief Add an attribute node to this xsd__anyType DOM element node @param att pointer to xsd__anyAttribute attribute node to copy and add @return reference to *this */ soap_dom_element& add(soap_dom_attribute *att); /** @brief Copy list of element nodes to this xsd__anyType DOM element node as children @param elts reference to list of xsd__anyType DOM element nodes to copy and add as children @return reference to *this */ soap_dom_element& adds(soap_dom_element& elts); /** @brief Copy list of element nodes to this xsd__anyType DOM element node as children @param elts pointer to list of xsd__anyType DOM element nodes to copy and add as children @return reference to *this */ soap_dom_element& adds(soap_dom_element *elts); /** @brief Copy list of attribute nodes to this xsd__anyType DOM element node @param atts reference to list of xsd__anyAttribute attribute nodes to copy and add @return reference to *this */ soap_dom_element& adds(soap_dom_attribute& atts); /** @brief Copy list of attribute nodes to this xsd__anyType DOM element node @param atts pointer to list of xsd__anyAttribute attribute nodes to copy and add @return reference to *this */ soap_dom_element& adds(soap_dom_attribute *atts); /** @brief Set text of this xsd__anyType DOM element node to Boolean "false" or "true", same as set(b) @param b Boolean value @return reference to *this */ soap_dom_element& operator=(bool b); /** @brief Set text of this xsd__anyType DOM element node to an integer value, same as set(n) @param n integer value @return reference to *this */ soap_dom_element& operator=(int n); /** @brief Set text of this xsd__anyType DOM element node to an integer value, same as set(n) @param n 64 bit integer value @return reference to *this */ soap_dom_element& operator=(LONG64 n); /** @brief Set text of this xsd__anyType DOM element node to a float value, same as set(x) @param x float value (NaN and +/-INF are also supported) @return reference to *this */ soap_dom_element& operator=(float x); /** @brief Set text of this xsd__anyType DOM element node to a double float value, same as set(x) @param x double float value (NaN and +/-INF are also supported) @return reference to *this */ soap_dom_element& operator=(double x); /** @brief Set text of this xsd__anyType DOM element node, same as set(text) @param text string or NULL @return reference to *this */ soap_dom_element& operator=(const char *text); /** @brief Set text of this xsd__anyType DOM element node, same as set(text) @param text wide string or NULL @return reference to *this */ soap_dom_element& operator=(const wchar_t *text); /** @brief Set text of this xsd__anyType DOM element node, same as set(text) @param text string @return reference to *this */ soap_dom_element& operator=(const std::string& text); /** @brief Set text of this xsd__anyType DOM element node, same as set(text) @param text wide string @return reference to *this */ soap_dom_element& operator=(const std::wstring& text); /** @brief Copy an xsd__anyType DOM element node to this node (not a deep copy) @param elt reference to xsd__anyType DOM element node to copy from @return reference to *this */ soap_dom_element& operator=(const soap_dom_element& elt); /** @brief Set this xsd__anyType DOM element node to point to a serializable object @param obj reference to serializable object that has a soap_type() member @return reference to *this */ template soap_dom_element& operator=(const T& obj); /** @brief Set this xsd__anyType DOM element node to point to a serializable object @param obj pointer to serializable object that has a soap_type() member @return reference to *this */ template soap_dom_element& operator=(const T *obj); /** @brief Set this xsd__anyType DOM element node to point to a serializable object @param obj pointer to serializable object that has a soap_type() member @return reference to *this */ template soap_dom_element& operator=(T *obj); /** @brief Populate this xsd__anyType DOM element node with an attribute node, same as att(NULL, tag), if the attribute does not already exists @param tag (un)qualified tag name string of attribute @return reference to xsd__anyAttribute attribute node (new attribute node if none matches) */ soap_dom_attribute& att(const char *tag); /** @brief Populate this xsd__anyType DOM element node with an attribute node, same as att(NULL, tag), if the attribute does not already exists @param tag (un)qualified tag name wide string of attribute @return reference to xsd__anyAttribute attribute node (new attribute node if none matches) */ soap_dom_attribute& att(const wchar_t *tag); /** @brief Populate this xsd__anyType DOM element node with an attribute node, if the attribute does not already exists @param ns namespace URI string or NULL of attribute @param tag (un)qualified tag name string of attribute @return reference to xsd__anyAttribute attribute node (new attribute node if none matches) */ soap_dom_attribute& att(const char *ns, const char *tag); /** @brief Populate this xsd__anyType DOM element node with an attribute node, if the attribute does not already exists @param ns namespace URI string or NULL of attribute @param tag (un)qualified tag name wide string of attribute @return reference to xsd__anyAttribute attribute node (new attribute node if none matches) */ soap_dom_attribute& att(const char *ns, const wchar_t *tag); /** @brief Populate this xsd__anyType DOM element node with an unnamed (tagless) child element node, same as elt(NULL, "") @return reference to child element node (new child element node if none matches) */ soap_dom_element& elt(); /** @brief Populate this xsd__anyType DOM element node with a child element node, same as elt(NULL, tag) @param tag (un)qualified tag name string of child element or NULL (unnamed node) @return reference to child element node (new child element node if none matches) */ soap_dom_element& elt(const char *tag); /** @brief Populate this xsd__anyType DOM element node with a child element node, same as elt(NULL, tag) @param tag (un)qualified tag name wide string of child element or NULL (unnamed node) @return reference to child element node (new child element node if none matches) */ soap_dom_element& elt(const wchar_t *tag); /** @brief Populate this xsd__anyType DOM element node with a child element node @param ns namespace URI string or NULL of child element @param tag (un)qualified tag name string of child element or NULL (unnamed node) @return reference to child element node (new child element node if none matches) */ soap_dom_element& elt(const char *ns, const char *tag); /** @brief Populate this xsd__anyType DOM element node with a child element node @param ns namespace URI string or NULL of child element @param tag (un)qualified tag name wide string of child element or NULL (unnamed node) @return reference to child element node (new child element node if none matches) */ soap_dom_element& elt(const char *ns, const wchar_t *tag); /** @brief Populate this xsd__anyType DOM element node with a child element node, same as elt(NULL, tag) @param tag (un)qualified tag name wide string of child element or NULL (unnamed node) @return reference to child element node (new child element node if none matches) */ soap_dom_element& operator[](const char *tag); /** @brief Populate this xsd__anyType DOM element node with a child element node, same as elt(NULL, tag) @param tag (un)qualified tag name wide string of child element or NULL (unnamed node) @return reference to child element node (new child element node if none matches) */ soap_dom_element& operator[](const wchar_t *tag); /** @brief Add a N-th child element with the same namespace and tag name as this xsd__anyType DOM element node that is a child element node at position one (1) in a sibling list @param n additional child element position requested, counting from one (1) XPath style @return reference to xsd__anyType child element node (new child element node if none exists at position n) */ soap_dom_element& operator[](size_t n); /** @brief Get attribute node of this xsd__anyType DOM element node, if attribute exists, same as att_get(NULL, tag) @param tag (un)qualified tag name string of attribute @return pointer to xsd__anyAttribute DOM attribute node or NULL if not exists */ soap_dom_attribute *att_get(const char *tag) const; /** @brief Get attribute node of this xsd__anyType DOM element node, if attribute exists, same as att_get(NULL, tag) @param tag (un)qualified tag name wide string of attribute @return pointer to xsd__anyAttribute DOM attribute node or NULL if not exists */ soap_dom_attribute *att_get(const wchar_t *tag) const; /** @brief Get attribute node of this xsd__anyType DOM element node, if attribute exists @param ns namespace URI string (NULL matches the null (empty) namespace if tag is unqualified) of attribute @param tag (un)qualified tag name string of attribute @return pointer to xsd__anyAttribute DOM attribute node or NULL if not exists */ soap_dom_attribute *att_get(const char *ns, const char *tag) const; /** @brief Get attribute node of this xsd__anyType DOM element node, if attribute exists @param ns namespace URI string (NULL matches the null (empty) namespace if tag is unqualified) of attribute @param tag (un)qualified tag name wide string of attribute @return pointer to xsd__anyAttribute DOM attribute node or NULL if not exists */ soap_dom_attribute *att_get(const char *ns, const wchar_t *tag) const; /** @brief Get unnamed (tagless) child element node of this xsd__anyType DOM element node, if child element exists, same as elt_get(NULL, NULL) or elt_get(NULL, ""); @return pointer to xsd__anyType DOM child element node or NULL if not exists */ soap_dom_element *elt_get() const; /** @brief Get child element node of this xsd__anyType DOM element node, if child element exists @param tag (un)qualified tag name string (NULL matches unnamed node) of child element @return pointer to xsd__anyType DOM child element node or NULL if not exists */ soap_dom_element *elt_get(const char *tag) const; /** @brief Get child element node of this xsd__anyType DOM element node, if child element exists, same as elt_get(NULL, tag) @param tag (un)qualified tag name wide string (NULL matches unnamed node) of child element @return pointer to xsd__anyType DOM child element node or NULL if not exists */ soap_dom_element *elt_get(const wchar_t *tag) const; /** @brief Get child element node of this xsd__anyType DOM element node, if child element exists @param ns namespace URI string (NULL matches the null (empty) namespace if tag is unqualified) of child element @param tag (un)qualified tag name string (NULL matches unnamed node) of child element @return pointer to xsd__anyType DOM child element node or NULL if not exists */ soap_dom_element *elt_get(const char *ns, const char *tag) const; /** @brief Get child element node of this xsd__anyType DOM element node, if child element exists @param ns namespace URI string (NULL matches the null (empty) namespace if tag is unqualified) of child element @param tag (un)qualified tag name wide string (NULL matches unnamed node) of child element @return pointer to xsd__anyType DOM child element node or NULL if not exists */ soap_dom_element *elt_get(const char *ns, const wchar_t *tag) const; /** @brief Get next child element node that has the same namespace URI and tag name as this child element node in a sibling list @return pointer to xsd__anyType DOM child element node or NULL if not exists */ soap_dom_element *get_next() const; /** @brief Get N-th child element node that has the same namespace URI and tag name as this child element node at position one (1) in a sibling list @param n N-th element minus one located from the current element node at position one (1), 1 returns this element node @return pointer to xsd__anyType DOM child element node or NULL if not exists */ soap_dom_element *get_nth(size_t n); /** @brief Match the namespace URI and tag name of this xsd__anyType DOM element node against a pattern @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return true if match */ bool match(const char *patt) const; /** @brief Match the namespace URI and tag name of this xsd__anyType DOM element node against a pattern, same as match(NULL, patt) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return true if match */ bool match(const wchar_t *patt) const; /** @brief Match the namespace URI and tag name of this xsd__anyType DOM element node against a pattern, same as match(NULL, patt) @param ns namespace URI string pattern ("*" matches any, NULL and "" match the null (empty) namespace) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return true if match */ bool match(const char *ns, const char *patt) const; /** @brief Match the namespace URI and tag name of this xsd__anyType DOM element node against a pattern @param ns namespace URI string pattern ("*" matches any, NULL and "" match the null (empty) namespace) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return true if match */ bool match(const char *ns, const wchar_t *patt) const; /** @brief Get the namespace URI of this xsd__anyType DOM element node @return namespace URI string or NULL */ const char *ns() const; /** @brief Get the tag name of this xsd__anyType DOM element node @return tag name string or NULL */ const char *tag() const; /** @brief Return pointer to parent of this xsd__anyType DOM element node, if any @return pointer to xsd__anyType DOM element or NULL */ soap_dom_element *parent(); /** @brief Return depth from the root node of this xsd__anyType DOM element node @return depth from root node, zero if node is a root node and has no parent */ size_t depth() const; /** @brief Return child index of this xsd__anyType DOM child element node in its sibling list @return nonzero index of child among siblings, or 0 if node is a root node and has no parent */ size_t index() const; /** @brief Return number of siblings of this xsd__anyType DOM child node that have the same namespace URI and tag name @return number of siblings plus one (for self) that have the same namespace URI and tag name */ size_t len() const; /** @brief Return index of this xsd__anyType DOM child node among siblings that have the same namespace URI and tag name @return nonzero N-th index (1 <= nth <= len), or 0 if element is root or is singular (has no siblings with the same namespace URI and tag name) */ size_t nth() const; /** @brief Return number of child element nodes of this xsd__anyType DOM element node, same as elt_size(NULL, NULL) @return number of child elements */ size_t elt_size(); /** @brief Return number of matching child element nodes of this xsd__anyType DOM element node, same as elt_size(NULL, patt, type) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return number of matches found */ size_t elt_size(const char *patt, int type = 0); /** @brief Return number of matching child element nodes of this xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return number of matches found */ size_t elt_size(const char *ns, const char *patt, int type = 0); /** @brief Return number of attribute nodes of this xsd__anyType DOM element node, same as att_size(NULL, NULL) @return number of attributes */ size_t att_size(); /** @brief Return number of matching attribute nodes of this xsd__anyType DOM element node, same as att_size(NULL, patt) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return number of matches found */ size_t att_size(const char *patt); /** @brief Return number of matching attribute nodes of this xsd__anyType DOM element node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return number of matches found */ size_t att_size(const char *ns, const char *patt); /** @brief Return true if this xsd__anyType DOM element node text is Boolean "true" or "1" @return true if "true" or "1" */ bool is_true() const; /** @brief Return true if this xsd__anyType DOM element node text is Boolean "false" or "0" @return true if "false" or "0" */ bool is_false() const; /** @brief Return 64 bit integer value of numeric text of this xsd__anyType DOM element node @return 64 bit integer value or 0 if text is not numeric */ LONG64 get_int() const; /** @brief Return double float value of decimal text of this xsd__anyType DOM element node @return double float value or NaN if text is not numeric */ double get_double() const; /** @brief Return text of this xsd__anyType DOM element node @return string or NULL */ const char *get_text() const; /** @brief Return true if this xsd__anyType DOM element node text is Boolean "true" or "1", same as is_true() @return true if "true" or "1" */ operator bool() const; /** @brief Return integer value of numeric text of this xsd__anyType DOM element node, same as (int)get_int() @return integer value or 0 if text is not numeric */ operator int() const; /** @brief Return 64 bit integer value of numeric text of this xsd__anyType DOM element node, same as get_int() @return 64 bit integer value or 0 if text is not numeric */ operator LONG64() const; /** @brief Return double float value of decimal text of this xsd__anyType DOM element node, same as get_double() @return double float value or NaN if text is not numeric */ operator double() const; /** @brief Return text of this xsd__anyType DOM element node, same as get_text() @return string or NULL */ operator const char*() const; /** @brief Return iterator to begin of deep depth-first node graph traversal starting with this node @return xsd__anyType::iterator */ soap_dom_element_iterator begin(); /** @brief Return iterator to end of deep depth-first tnode graph traversal @return xsd__anyType::iterator */ soap_dom_element_iterator end(); /** @brief Return iterator to begin of child element nodes @return xsd__anyType::iterator */ soap_dom_element_iterator elt_begin(); /** @brief Return iterator to end of child element nodes @return xsd__anyType::iterator */ soap_dom_element_iterator elt_end(); /** @brief Return iterator to begin of attribute nodes @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_begin(); /** @brief Return iterator to end of attribute nodes @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_end(); /** @brief Return iterator to search deep depth-first over node graph starting from this node, same as find(NULL, patt, type) @param patt (un)qualified tag name string pattern (use '@' to match attributes, NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator find(const char *patt, int type = 0); /** @brief Return iterator to search deep depth-first over node graph starting from this node, same as find(NULL, patt, type) @param patt (un)qualified tag name wide string pattern (use '@' to match attributes, NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator find(const wchar_t *patt, int type = 0); /** @brief Return iterator to search deep depth-first over node graph starting from this node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (use '@' to match attributes, NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator find(const char *ns, const char *patt, int type = 0); /** @brief Return iterator to search deep depth-first over node graph starting from this node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name wide string pattern (use '@' to match attributes, NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator find(const char *ns, const wchar_t *patt, int type = 0); /** @brief Return iterator to search deep depth-first over node graph to find deserialized objects, starting from this node @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator find(int type); /** @brief Return iterator to search for matching child elements of this node, same as elt_find(NULL, patt, type) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator elt_find(const char *patt, int type = 0); /** @brief Return iterator to search for matching child elements of this node, same as elt_find(NULL, patt, type) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator elt_find(const wchar_t *patt, int type = 0); /** @brief Return iterator to search for matching child elements of this node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator elt_find(const char *ns, const char *patt, int type = 0); /** @brief Return iterator to search for matching child elements of this node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @param type optional SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator elt_find(const char *ns, const wchar_t *patt, int type = 0); /** @brief Return iterator to search for child elements of this node that have deserialized objects @param type SOAP_TYPE_T type of deserialized object of type T to match or 0 @return xsd__anyType::iterator */ soap_dom_element_iterator elt_find(int type); /** @brief Return iterator to search for matching attributes of this node @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any, "" matches unnamed node) @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_find(const char *patt); /** @brief Return iterator to search for matching attributes of this node, same as att_find(NULL, patt) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any) @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_find(const wchar_t *patt); /** @brief Return iterator to search for matching attributes of this node, same as att_find(NULL, patt) @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name string pattern (NULL, "*", and "*:*" match any) @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_find(const char *ns, const char *patt); /** @brief Return iterator to search for matching attributes of this node @param ns namespace URI string pattern ("*" matches any, "" matches the null (empty) namespace, NULL matches the null (empty) namespace if tag is unqualified or the namespace from namespace table if tag is qualified) @param patt (un)qualified tag name wide string pattern (NULL, "*", and "*:*" match any) @return xsd__anyAttribute::iterator */ soap_dom_attribute_iterator att_find(const char *ns, const wchar_t *patt); void unlink(); }; /** @brief The xsd__anyType DOM element node structure (xsd__anyType is a typedef of soap_dom_element) */ typedef soap_dom_element xsd__anyType; /** @brief Write XML to current output (this is an auto-generted macro in soapH.h) @param soap context that manages IO @param dom root element node of the XML document @return SOAP_OK or an error code */ int soap_write_xsd__anyType(struct soap *soap, xsd__anyType *dom); /** @brief Parse XML from current input (this is an auto-generted macro in soapH.h) @param soap context that manages IO @param dom root element node of the XML document @return SOAP_OK or an error code */ int soap_read_xsd__anyType(struct soap *soap, xsd__anyType *dom); #endif /******************************************************************************\ * * soap_dom_element class * \******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap) { soap_default_xsd__anyType(soap, this); } /******************************************************************************/ soap_dom_element::soap_dom_element(const soap_dom_element& elt) { soap_default_xsd__anyType(elt.soap, this); (void)soap_elt_copy(this, &elt); } /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const char *tag) { soap_default_xsd__anyType(soap, this); (void)soap_elt_set(this, NULL, tag); } /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const wchar_t *tag) { soap_default_xsd__anyType(soap, this); (void)soap_elt_set_w(this, NULL, tag); } /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const char *tag) { soap_default_xsd__anyType(soap, this); (void)soap_elt_set(this, ns, tag); } /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag) { soap_default_xsd__anyType(soap, this); (void)soap_elt_set_w(this, ns, tag); } /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const char *tag, const char *text) { soap_default_xsd__anyType(soap, this); (void)soap_elt_text(soap_elt_set(this, ns, tag), text); } /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const char *tag, const wchar_t *text) { soap_default_xsd__anyType(soap, this); (void)soap_elt_text_w(soap_elt_set(this, ns, tag), text); } /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const char *text) { soap_default_xsd__anyType(soap, this); (void)soap_elt_text(soap_elt_set_w(this, ns, tag), text); } /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const wchar_t *text) { soap_default_xsd__anyType(soap, this); (void)soap_elt_text_w(soap_elt_set_w(this, ns, tag), text); } /******************************************************************************/ #ifndef WITH_COMPAT soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const char *tag, const std::string& text) { soap_default_xsd__anyType(soap, this); (void)soap_elt_text(soap_elt_set(this, ns, tag), text.c_str()); } #endif /******************************************************************************/ #ifndef WITH_COMPAT soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const std::string& text) { soap_default_xsd__anyType(soap, this); (void)soap_elt_text(soap_elt_set_w(this, ns, tag), text.c_str()); } #endif /******************************************************************************/ #ifndef WITH_COMPAT soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const char *tag, const std::wstring& text) { soap_default_xsd__anyType(soap, this); (void)soap_elt_text_w(soap_elt_set(this, ns, tag), text.c_str()); } #endif /******************************************************************************/ #ifndef WITH_COMPAT soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const std::wstring& text) { soap_default_xsd__anyType(soap, this); (void)soap_elt_text_w(soap_elt_set_w(this, ns, tag), text.c_str()); } #endif /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const char *tag, const void *node, int type) { soap_default_xsd__anyType(soap, this); (void)soap_elt_node(soap_elt_set(this, ns, tag), node, type); } /******************************************************************************/ soap_dom_element::soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const void *node, int type) { soap_default_xsd__anyType(soap, this); (void)soap_elt_node(soap_elt_set_w(this, ns, tag), node, type); } /******************************************************************************/ soap_dom_element::~soap_dom_element() { } /******************************************************************************/ soap_dom_element_iterator soap_dom_element::begin() { soap_dom_element_iterator iter = soap_dom_element_iterator(this); iter.stop = this; iter.deep = true; return iter; } /******************************************************************************/ soap_dom_element_iterator soap_dom_element::find(const char *ns, const char *patt, int type) { soap_dom_element_iterator iter(soap_dom_find(this, this, ns, patt, type)); iter.stop = this; iter.nstr = ns; iter.name = patt; iter.type = type; iter.deep = true; return iter; } /******************************************************************************/ soap_dom_element_iterator soap_dom_element::find(const char *ns, const wchar_t *tag, int type) { const char *s = soap_wchar2s(NULL, tag); soap_dom_element_iterator iter = this->find(ns, s, type); if (s) free((void*)s); return iter; } /******************************************************************************/ soap_dom_element_iterator soap_dom_element::find(int type) { return this->find((const char*)NULL, (const char*)NULL, type); } /******************************************************************************/ soap_dom_element_iterator soap_dom_element::elt_find(const char *ns, const char *patt, int type) { soap_dom_element_iterator iter(soap_elt_find_type(this, ns, patt, type)); iter.nstr = ns; iter.name = patt; iter.type = type; return iter; } /******************************************************************************/ soap_dom_element_iterator soap_dom_element::elt_find(const char *ns, const wchar_t *patt, int type) { const char *s = soap_wchar2s(NULL, patt); soap_dom_element_iterator iter = this->elt_find(ns, s, type); if (s) free((void*)s); return iter; } /******************************************************************************/ soap_dom_element_iterator soap_dom_element::elt_find(int type) { return this->elt_find((const char*)NULL, (const char*)NULL, type); } /******************************************************************************/ soap_dom_attribute_iterator soap_dom_element::att_find(const char *ns, const char *patt) { soap_dom_attribute_iterator iter(soap_att_find(this, ns, patt)); iter.nstr = ns; iter.name = patt; return iter; } /******************************************************************************/ soap_dom_attribute_iterator soap_dom_element::att_find(const char *ns, const wchar_t *patt) { const char *s = soap_wchar2s(NULL, patt); soap_dom_attribute_iterator iter = this->att_find(ns, s); if (s) free((void*)s); return iter; } /******************************************************************************/ void soap_dom_element::unlink() { soap_unlink(soap, this); soap_unlink(soap, nstr); soap_unlink(soap, name); soap_unlink(soap, text); if (elts) elts->unlink(); if (atts) atts->unlink(); if (next) next->unlink(); node = NULL; type = 0; } /******************************************************************************\ * * soap_dom_attribute class * \******************************************************************************/ soap_dom_attribute::soap_dom_attribute(struct soap *soap) { soap_default_xsd__anyAttribute(soap, this); } /******************************************************************************/ soap_dom_attribute::soap_dom_attribute(const soap_dom_attribute& att) { soap_default_xsd__anyAttribute(att.soap, this); (void)soap_att_copy(this, &att); } /******************************************************************************/ soap_dom_attribute::soap_dom_attribute(struct soap *soap, const char *tag) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_set(this, NULL, tag); } /******************************************************************************/ soap_dom_attribute::soap_dom_attribute(struct soap *soap, const wchar_t *tag) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_set_w(this, NULL, tag); } /******************************************************************************/ soap_dom_attribute::soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const char *text) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_text(soap_att_set(this, ns, tag), text); } /******************************************************************************/ soap_dom_attribute::soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const wchar_t *text) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_text_w(soap_att_set(this, ns, tag), text); } /******************************************************************************/ soap_dom_attribute::soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const char *text) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_text(soap_att_set_w(this, ns, tag), text); } /******************************************************************************/ soap_dom_attribute::soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const wchar_t *text) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_text_w(soap_att_set_w(this, ns, tag), text); } /******************************************************************************/ #ifndef WITH_COMPAT soap_dom_attribute::soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const std::string& text) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_text(soap_att_set(this, ns, tag), text.c_str()); } #endif /******************************************************************************/ #ifndef WITH_COMPAT soap_dom_attribute::soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const std::wstring& text) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_text_w(soap_att_set(this, ns, tag), text.c_str()); } #endif /******************************************************************************/ #ifndef WITH_COMPAT soap_dom_attribute::soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const std::string& text) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_text(soap_att_set_w(this, ns, tag), text.c_str()); } #endif /******************************************************************************/ #ifndef WITH_COMPAT soap_dom_attribute::soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const std::wstring& text) { soap_default_xsd__anyAttribute(soap, this); (void)soap_att_text_w(soap_att_set_w(this, ns, tag), text.c_str()); } #endif /******************************************************************************/ soap_dom_attribute::~soap_dom_attribute() { } /******************************************************************************/ soap_dom_attribute_iterator soap_dom_attribute::att_find(const char *ns, const char *patt) { soap_dom_attribute_iterator iter(this); iter.nstr = ns; iter.name = patt; if (patt) { if (!soap_patt_match(this->name, patt)) return ++iter; if (ns && (!this->nstr || strcmp(this->nstr, ns))) return ++iter; if (!ns && this->nstr) return ++iter; } return iter; } /******************************************************************************/ soap_dom_attribute_iterator soap_dom_attribute::att_find(const char *ns, const wchar_t *patt) { const char *s = soap_wchar2s(NULL, patt); soap_dom_attribute_iterator iter = this->att_find(ns, s); if (s) free((void*)s); return iter; } /******************************************************************************/ void soap_dom_attribute::unlink() { soap_unlink(soap, this); soap_unlink(soap, nstr); soap_unlink(soap, name); soap_unlink(soap, text); if (next) next->unlink(); } /******************************************************************************\ * * soap_dom_element_iterator class * \******************************************************************************/ soap_dom_element_iterator::soap_dom_element_iterator() { iter = NULL; stop = NULL; nstr = NULL; name = NULL; type = 0; deep = false; } /******************************************************************************/ soap_dom_element_iterator::soap_dom_element_iterator(soap_dom_element *node) { iter = node; stop = NULL; nstr = NULL; name = NULL; type = 0; deep = false; } /******************************************************************************/ soap_dom_element_iterator::~soap_dom_element_iterator() { } /******************************************************************************/ bool soap_dom_element_iterator::operator==(const soap_dom_element_iterator &it) const { return this->iter == it.iter; } /******************************************************************************/ bool soap_dom_element_iterator::operator!=(const soap_dom_element_iterator &it) const { return this->iter != it.iter; } /******************************************************************************/ soap_dom_element& soap_dom_element_iterator::operator*() const { return *this->iter; } /******************************************************************************/ soap_dom_element *soap_dom_element_iterator::operator->() const { return this->iter; } /******************************************************************************/ soap_dom_element_iterator &soap_dom_element_iterator::operator++() { if (deep) this->iter = soap_dom_find_next(this->iter, this->stop, this->nstr, this->name, this->type); else this->iter = soap_elt_find_next_type(this->iter, this->nstr, this->name, this->type); return *this; } /******************************************************************************/ soap_dom_element_iterator soap_dom_element_iterator::operator++(int) { soap_dom_element_iterator iter(*this); ++*this; return iter; } /******************************************************************************\ * * soap_dom_attribute_iterator class * \******************************************************************************/ soap_dom_attribute_iterator::soap_dom_attribute_iterator() { iter = NULL; nstr = NULL; name = NULL; } /******************************************************************************/ soap_dom_attribute_iterator::soap_dom_attribute_iterator(soap_dom_attribute *node) { this->iter = node; nstr = NULL; name = NULL; } /******************************************************************************/ soap_dom_attribute_iterator::~soap_dom_attribute_iterator() { } /******************************************************************************/ bool soap_dom_attribute_iterator::operator==(const soap_dom_attribute_iterator &it) const { return this->iter == it.iter; } /******************************************************************************/ bool soap_dom_attribute_iterator::operator!=(const soap_dom_attribute_iterator &it) const { return this->iter != it.iter; } /******************************************************************************/ soap_dom_attribute& soap_dom_attribute_iterator::operator*() const { return *this->iter; } /******************************************************************************/ soap_dom_attribute *soap_dom_attribute_iterator::operator->() const { return this->iter; } /******************************************************************************/ soap_dom_attribute_iterator &soap_dom_attribute_iterator::operator++() { this->iter = soap_att_find_next(this->iter, this->nstr, this->name); return *this; } /******************************************************************************/ soap_dom_attribute_iterator soap_dom_attribute_iterator::operator++(int) { soap_dom_attribute_iterator iter(*this); ++*this; return iter; } /******************************************************************************\ * * I/O * \******************************************************************************/ #ifndef WITH_COMPAT std::ostream &operator<<(std::ostream &o, const struct soap_dom_element &e) { if (!e.soap) { struct soap *soap = soap_new1(SOAP_IO_DEFAULT | SOAP_DOM_TREE); if (soap) { soap->os = &o; soap_serialize_xsd__anyType(soap, &e); if (soap_begin_send(soap) || soap_out_xsd__anyType(soap, NULL, 0, &e, NULL) || soap_end_send(soap)) o.clear(std::ios::failbit); /* writing failed (must be a stream error) */ soap_destroy(soap); soap_end(soap); soap_free(soap); } } else { std::ostream *os = e.soap->os; e.soap->os = &o; soap_serialize_xsd__anyType(e.soap, &e); if (soap_begin_send(e.soap) || soap_out_xsd__anyType(e.soap, NULL, 0, &e, NULL) || soap_end_send(e.soap)) o.clear(std::ios::failbit); /* writing failed (must be a stream error) */ e.soap->os = os; } return o; } /******************************************************************************/ std::istream &operator>>(std::istream &i, struct soap_dom_element &e) { if (!e.soap) e.soap = soap_new(); if (e.soap) { std::istream *is = e.soap->is; e.soap->is = &i; if (soap_begin_recv(e.soap) || soap_in_xsd__anyType(e.soap, NULL, &e, NULL) == NULL || soap_end_recv(e.soap)) { /* e.soap->error is now set and app should check */ } e.soap->is = is; } return i; } #endif #endif gsoap-2.8.91/gsoap/custom/0000755000175000017500000000000013525245157014720 5ustar ellertellertgsoap-2.8.91/gsoap/custom/duration.h0000644000175000017500000000757113525245157016730 0ustar ellertellert/* duration.h Custom serializer for xsd:duration stored in a LONG64 with millisecond (ms) precision. LONG64 is equivalent to long long int and int64_t Millisecond resolution (1/1000 sec) means 1 second = 1000. The `xsd__duration` type is a 64 bit signed integer that can represent 106751991167 days forward (positive) and backward (negative), with increments of 1 ms (1/1000 second). Durations that exceed a month are always output in days, rather than months to avoid days-per-month conversion inacurracies. Durations that are received in years and months instead of total number of days from a reference point are not well defined, since there is no accepted reference time point (it may or may not be the current time). The decoder simple assumes that there are 30 days per month. For example, conversion of "P4M" gives 120 days. Therefore, the durations "P4M" and "P120D" are assumed to be identical, which is not necessarily true depending on the reference point in time. Rescaling of the duration value by may be needed when adding the duration value to a `time_t` value, because `time_t` may or may not have a seconds resolution, depending on the platform and possible changes to `time_t`. #import this file into your gSOAP .h file To automate the wsdl2h-mapping of xsd:duration to LONG64, add this line to the typemap.dat file: xsd__duration = #import "custom/duration.h" | xsd__duration The typemap.dat file is used by wsdl2h to map types (wsdl2h option -t). When using soapcpp2 option -q or -p, you must change duration.c as follows: #include "soapH.h" -> #include "nameH.h" Compile and link your code with custom/duration.c gSOAP XML Web services tools Copyright (C) 2000-2009, 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-2009, 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 -------------------------------------------------------------------------------- */ extern typedef long long xsd__duration; /* duration in ms (1/1000 sec) */ gsoap-2.8.91/gsoap/custom/struct_tm.h0000644000175000017500000001037013525245157017116 0ustar ellertellert/* struct_tm.h Custom serializer for struct tm as xsd:dateTime Because time_t is limited to dates between 1970 and 2038, struct tm should be used for wider date ranges. This custom serializer avoids storing date+time information in time_t values for this reason. #import this file into your gSOAP .h file to enable struct tm serialization and use the serializable xsd__dateTime type. struct tm { int tm_sec; // seconds (0 - 60) int tm_min; // minutes (0 - 59) int tm_hour; // hours (0 - 23) int tm_mday; // day of month (1 - 31) int tm_mon; // month of year (0 - 11) int tm_year; // year - 1900 int tm_wday; // day of week (Sunday = 0) int tm_yday; // day of year (0 - 365) int tm_isdst; // is summer time in effect? char *tm_zone; // abbreviation of timezone name }; Note that tm_wday is always set to 0 (Sunday) when receiving a xsd:dateTime value, because the struct tm content is not computed. To automate the wsdl2h-mapping of xsd:dateTime to struct tm, add this line to the typemap.dat file: xsd__dateTime = #import "custom/struct_tm.h" | xsd__dateTime The typemap.dat file is used by wsdl2h to map types (wsdl2h option -t). When using soapcpp2 option -q or -p, you must change struct_tm.c as follows: #include "soapH.h" -> #include "nameH.h" Compile and link your code with custom/struct_tm.c gSOAP XML Web services tools Copyright (C) 2000-2007, 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-2007, 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 /** externally declared (and "volatile" to avoid redeclaration). Declared here for soapcpp2 to produce soap_dup_xsd__dateTime() */ extern typedef volatile struct tm { int tm_sec; ///< seconds (0 - 60) int tm_min; ///< minutes (0 - 59) int tm_hour; ///< hours (0 - 23) int tm_mday; ///< day of month (1 - 31) int tm_mon; ///< month of year (0 - 11) int tm_year; ///< year - 1900 // N/A: int tm_wday; ///< day of week (Sunday = 0) (NOT USED) // N/A: int tm_yday; ///< day of year (0 - 365) (NOT USED) int tm_isdst; ///< is summer time in effect? // N/A: char* tm_zone; ///< abbreviation of timezone (NOT USED) } xsd__dateTime; gsoap-2.8.91/gsoap/custom/int128.h0000644000175000017500000000520013525245157016113 0ustar ellertellert/* int128.h Custom serializer for __int128_t as xsd:integer (big int). #import this file into your gSOAP .h file. Add this line to typemap.dat to automate the mapping with wsdl2h: xsd__integer = #import "custom/int128.h" | xsd__integer When using soapcpp2 option -q or -p, you must change int128.c as follows: #include "soapH.h" -> #include "nameH.h" Compile and link your code with custom/int128.c gSOAP XML Web services tools Copyright (C) 2000-2015, 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-2015, 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 -------------------------------------------------------------------------------- */ extern class __int128_t; extern typedef __int128_t xsd__integer; gsoap-2.8.91/gsoap/custom/float128.c0000644000175000017500000001203013525245157016420 0ustar ellertellert/* float128.c Custom serializer for the __float128 quad precision float type as xsd:decimal. Compile this file and link it with your code. gSOAP XML Web services tools Copyright (C) 2000-2015, 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-2015, 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 -------------------------------------------------------------------------------- */ /* When using soapcpp2 option -q or -p, you need to change "soapH.h" below */ /* include soapH.h generated by soapcpp2 from .h file containing __float128 types */ #ifdef SOAP_H_FILE /* if set, use the soapcpp2-generated fileH.h file as specified with: cc ... -DSOAP_H_FILE=fileH.h */ # include "stdsoap2.h" # include SOAP_XSTRINGIFY(SOAP_H_FILE) #else # include "soapH.h" /* or manually replace with soapcpp2-generated *H.h file */ #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_xsd__decimal(struct soap *soap, __float128 *a) { (void)soap; *a = 0.0; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_xsd__decimal(struct soap *soap, const __float128 *a) { (void)soap; (void)a; } SOAP_FMAC3 int SOAP_FMAC4 soap_s2xsd__decimal(struct soap *soap, const char *s, __float128 *a) { if (s) { if (!*s) return soap->error = SOAP_TYPE; if (!soap_tag_cmp(s, "INF")) *a = (__float128)DBL_PINFTY; else if (!soap_tag_cmp(s, "+INF")) *a = (__float128)DBL_PINFTY; else if (!soap_tag_cmp(s, "-INF")) *a = (__float128)DBL_NINFTY; else if (!soap_tag_cmp(s, "NaN")) *a = (__float128)DBL_NAN; else { char *r; *a = strtoflt128(s, &r); if (*r) soap->error = SOAP_TYPE; } } return soap->error; } SOAP_FMAC3 const char * SOAP_FMAC4 soap_xsd__decimal2s(struct soap *soap, __float128 a) { char *s; if (isnanq(a)) return "NaN"; if (isinfq(a)) { if (a >= 0) return "INF"; return "-INF"; } quadmath_snprintf(soap->tmpbuf, sizeof(soap->tmpbuf), "%Qg", a); s = strchr(soap->tmpbuf, ','); /* convert decimal comma to DP */ if (s) *s = '.'; return soap->tmpbuf; } SOAP_FMAC3 int SOAP_FMAC4 soap_out_xsd__decimal(struct soap *soap, const char *tag, int id, const __float128 *p, const char *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, SOAP_TYPE_xsd__decimal), type) || soap_string_out(soap, soap_xsd__decimal2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 __float128 * SOAP_FMAC4 soap_in_xsd__decimal(struct soap *soap, const char *tag, __float128 *a, const char *type) { if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (__float128*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_xsd__decimal, sizeof(__float128), NULL, NULL, NULL, NULL); if (!a) return NULL; if (!*soap->href) { int err = soap_s2xsd__decimal(soap, soap_value(soap), a); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { a = (__float128*)soap_id_forward(soap, soap->href, a, 0, SOAP_TYPE_xsd__decimal, 0, sizeof(__float128), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } gsoap-2.8.91/gsoap/custom/struct_tm_date.h0000644000175000017500000000611713525245157020117 0ustar ellertellert/* struct_tm_date.h Custom serializer for xsd:date Gregorian calendar date stored in a struct tm. Basically the same as the struct tm xsd:dateTime serializer, but without the time part, which is considered 00:00:00. Timezone offsets are taken into account to adjust the time part from 00:00:00 UTC. Note that tm_wday is always set to 0 (Sunday) when receiving a xsd:date value, because the tm content is not calculated. #import this file into your gSOAP .h file To automate the wsdl2h-mapping of xsd:date to int, add this line to the typemap.dat file: xsd__date = #import "custom/struct_tm_date.h" | xsd__date The typemap.dat file is used by wsdl2h to map types (wsdl2h option -t). When using soapcpp2 option -q or -p, you must change date.c as follows: #include "soapH.h" -> #include "nameH.h" Compile and link your code with custom/struct_tm_date.c gSOAP XML Web services tools Copyright (C) 2000-2015, 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-2015, 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 extern typedef struct tm xsd__date; gsoap-2.8.91/gsoap/custom/struct_tm.c0000644000175000017500000001666713525245157017130 0ustar ellertellert/* struct_tm.c Custom serializer for struct tm as xsd:dateTime See struct_tm.h for documentation. Compile this file and link it with your code. gSOAP XML Web services tools Copyright (C) 2000-2015, 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-2015, 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 -------------------------------------------------------------------------------- */ /* When using soapcpp2 option -q or -p, you need to change "soapH.h" below */ /* include soapH.h generated by soapcpp2 from .h file containing struct tm */ #ifdef SOAP_H_FILE /* if set, use the soapcpp2-generated fileH.h file as specified with: cc ... -DSOAP_H_FILE=fileH.h */ # include "stdsoap2.h" # include SOAP_XSTRINGIFY(SOAP_H_FILE) #else # include "soapH.h" /* or manually replace with soapcpp2-generated *H.h file */ #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_xsd__dateTime(struct soap *soap, struct tm *a) { (void)soap; memset((void*)a, 0, sizeof(struct tm)); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_xsd__dateTime(struct soap *soap, struct tm const *a) { (void)soap; (void)a; } SOAP_FMAC3 const char * SOAP_FMAC4 soap_xsd__dateTime2s(struct soap *soap, const struct tm a) { if (a.tm_isdst > 0) { struct tm b = a; time_t t; b.tm_isdst = 0; t = soap_timegm(&b) - 3600; #ifdef HAVE_GMTIME_R gmtime_r(&t, &b); #else b = *gmtime(&t); #endif #ifndef WITH_NOZONE strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", &b); #else strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", &b); #endif return soap->tmpbuf; } #ifndef WITH_NOZONE strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", &a); #else strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", &a); #endif return soap->tmpbuf; } SOAP_FMAC3 int SOAP_FMAC4 soap_out_xsd__dateTime(struct soap *soap, const char *tag, int id, const struct tm *a, const char *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_xsd__dateTime), type) || soap_string_out(soap, soap_xsd__dateTime2s(soap, *a), 0)) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 int SOAP_FMAC4 soap_s2xsd__dateTime(struct soap *soap, const char *s, struct tm *a) { memset((void*)a, 0, sizeof(struct tm)); if (s) { char *t; unsigned long d; d = soap_strtoul(s, &t, 10); if (*t == '-') { /* YYYY-MM-DD */ a->tm_year = (int)d; a->tm_mon = (int)soap_strtoul(t + 1, &t, 10); a->tm_mday = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* YYYYMMDD */ a->tm_year = (int)(d / 10000); a->tm_mon = (int)(d / 100 % 100); a->tm_mday = (int)(d % 100); } else return soap->error = SOAP_TYPE; if (*t == 'T' || ((*t == 't' || *t == ' ') && !(soap->mode & SOAP_XML_STRICT))) { d = soap_strtoul(t + 1, &t, 10); if (*t == ':') { /* Thh:mm:ss */ a->tm_hour = (int)d; a->tm_min = (int)soap_strtoul(t + 1, &t, 10); a->tm_sec = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* Thhmmss */ a->tm_hour = (int)(d / 10000); a->tm_min = (int)(d / 100 % 100); a->tm_sec = (int)(d % 100); } else return soap->error = SOAP_TYPE; } if (a->tm_year == 1) a->tm_year = 70; else a->tm_year -= 1900; a->tm_mon--; if (*t == '.') { for (t++; *t; t++) if (*t < '0' || *t > '9') break; } if (*t == ' ' && !(soap->mode & SOAP_XML_STRICT)) t++; if (*t) { #ifndef WITH_NOZONE if (*t == '+' || *t == '-') { int h, m; m = (int)soap_strtol(t, &t, 10); if (*t == ':') { /* +hh:mm */ h = m; m = (int)soap_strtol(t + 1, &t, 10); if (h < 0) m = -m; } else if (!(soap->mode & SOAP_XML_STRICT)) { /* +hhmm */ h = m / 100; m = m % 100; } else { /* +hh */ h = m; m = 0; } if (*t) return soap->error = SOAP_TYPE; a->tm_min -= m; a->tm_hour -= h; /* put hour and min in range */ a->tm_hour += a->tm_min / 60; a->tm_min %= 60; if (a->tm_min < 0) { a->tm_min += 60; a->tm_hour--; } a->tm_mday += a->tm_hour / 24; a->tm_hour %= 24; if (a->tm_hour < 0) { a->tm_hour += 24; a->tm_mday--; } /* note: day of the month may be out of range, timegm() handles it */ } else if (*t != 'Z') return soap->error = SOAP_TYPE; #endif } else /* no UTC or timezone, so assume we got a localtime */ a->tm_isdst = -1; } return soap->error; } SOAP_FMAC3 struct tm * SOAP_FMAC4 soap_in_xsd__dateTime(struct soap *soap, const char *tag, struct tm *a, const char *type) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_att(soap, soap->type, type) && soap_match_att(soap, soap->type, ":dateTime")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } a = (struct tm*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_xsd__dateTime, sizeof(struct tm), NULL, NULL, NULL, NULL); if (*soap->href) a = (struct tm*)soap_id_forward(soap, soap->href, a, 0, SOAP_TYPE_xsd__dateTime, 0, sizeof(struct tm), 0, NULL, NULL); else if (a) { if (soap_s2xsd__dateTime(soap, soap_value(soap), a)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return a; } gsoap-2.8.91/gsoap/custom/float128.h0000644000175000017500000000530013525245157016427 0ustar ellertellert/* float128.h Custom serializer for the __float128 quad precision float type as xsd:decimal. #import this file into your gSOAP .h file. Add this line to typemap.dat to automate the mapping with wsdl2h: xsd__decimal = #import "custom/float128.h" | xsd__decimal When using soapcpp2 option -q or -p, you must change float128.c as follows: #include "soapH.h" -> #include "nameH.h" Compile and link your code with custom/float128.c gSOAP XML Web services tools Copyright (C) 2000-2015, 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-2015, 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 extern class __float128; extern typedef __float128 xsd__decimal; gsoap-2.8.91/gsoap/custom/qdatetime.h0000644000175000017500000000566213525245157017057 0ustar ellertellert/* qdatetime.h Custom serializer for Qt's QDateTime type as xsd:dateTime. Requires Qt 4.8 or higher. When serializing: If the QDateTime is invalid, it will be defaulted to 01-01-01T00:00:00.000Z. When deserializing: If a timezone is found, the QDateTime will automatically be converted to UTC. #import this file into your gSOAP .h file. To automate the wsdl2h-mapping of xsd:dateTime to QDateTime, add this line to the typemap.dat file: xsd__dateTime = #import "custom/qdatetime.h" | xsd__dateTime When using soapcpp2 option -q or -p, you must change qdatetime.cpp as follows: #include "soapH.h" -> #include "nameH.h" Compile and link your code with custom/qdatetime.cpp gSOAP XML Web services tools Copyright (C) 2000-2016, 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-2016, 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 extern class QDateTime; extern typedef QDateTime xsd__dateTime; gsoap-2.8.91/gsoap/custom/qbytearray_hex.h0000644000175000017500000000606013525245157020122 0ustar ellertellert/* qbytearray_hex.h Custom serializer for Qt's QByteArray type as xsd:hexBinary. Requires Qt 4.8 or higher. NOTE: While QByteArrays can embed '\0' characters, C-strings cannot. This serializer treats the first '\0' character in a QByteArray as the end of the array, and truncates the rest. #import this file into your gSOAP .h file. To automate the wsdl2h-mapping of xsd:hexBinary to QByteArray, add this line to the typemap.dat file: xsd__hexBinary = #import "custom/qbytearray_hex.h" When using soapcpp2 option -q or -p, you must change qbytearray_hex.cpp as follows: #include "soapH.h" -> #include "nameH.h" Compile and link your code with custom/qbytearray_hex.cpp gSOAP XML Web services tools Copyright (C) 2000-2016, 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-2016, 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 extern class QByteArray; extern typedef QByteArray xsd__hexBinary; gsoap-2.8.91/gsoap/custom/chrono_time_point.h0000644000175000017500000000563613525245157020622 0ustar ellertellert/* chrono_time_point.h Custom serializer for std::chrono::system_clock::time_point as xsd:dateTime Requires C++11 or higher (compile with -std=c++11). #import this file into your gSOAP .h file To automate the wsdl2h-mapping of xsd:dateTime to std::chrono::system_clock::time_point, add this line to the typemap.dat file: xsd__dateTime = #import "custom/chrono_time_point.h" | xsd__dateTime The typemap.dat file is used by wsdl2h to map types (wsdl2h option -t). When using soapcpp2 option -q or -p, you must change chrono_time_point.cpp as follows: #include "soapH.h" -> #include "nameH.h" Compile and link your code with custom/chrono_time_point.cpp gSOAP XML Web services tools Copyright (C) 2000-2015, 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-2015, 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 extern typedef class std::chrono::system_clock::time_point xsd__dateTime; gsoap-2.8.91/gsoap/custom/long_time.c0000644000175000017500000001522613525245157017047 0ustar ellertellert/* long_time.c Custom serializer for xsd:time stored in an ULONG64 with usec (microsecond) precision See long_time.h for documentation. Compile this file and link it with your code. gSOAP XML Web services tools Copyright (C) 2000-2015, 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-2015, 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 -------------------------------------------------------------------------------- */ /* When using soapcpp2 option -q or -p, you need to change "soapH.h" below */ /* include soapH.h generated by soapcpp2 from .h file containing typedef ULONG64 xsd__time */ #ifdef SOAP_H_FILE /* if set, use the soapcpp2-generated fileH.h file as specified with: cc ... -DSOAP_H_FILE=fileH.h */ # include "stdsoap2.h" # include SOAP_XSTRINGIFY(SOAP_H_FILE) #else # include "soapH.h" /* or manually replace with soapcpp2-generated *H.h file */ #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_xsd__time(struct soap *soap, ULONG64 *a) { (void)soap; /* appease -Wall -Werror */ *a = 0; } SOAP_FMAC3 const char * SOAP_FMAC4 soap_xsd__time2s(struct soap *soap, ULONG64 a) { unsigned int H, M, S, f; f = a % 1000000; a /= 1000000; S = a % 60; a /= 60; M = a % 60; a /= 60; H = a % 24; #ifndef WITH_NOZONE if (f) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 17), "%02u:%02u:%02u.%06uZ", H, M, S, f); else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 10), "%02u:%02u:%02uZ", H, M, S); #else if (f) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 16), "%02u:%02u:%02u.%06u", H, M, S, f); else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 9), "%02u:%02u:%02u", H, M, S); #endif return soap->tmpbuf; } SOAP_FMAC3 int SOAP_FMAC4 soap_out_xsd__time(struct soap *soap, const char *tag, int id, const ULONG64 *a, const char *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_xsd__time), type) || soap_string_out(soap, soap_xsd__time2s(soap, *a), 0)) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 int SOAP_FMAC4 soap_s2xsd__time(struct soap *soap, const char *s, ULONG64 *a) { char *r; ULONG64 H = 0, M = 0, S = 0; float f = 0; *a = 0; if (s) { H = soap_strtoul(s, &r, 10); if (!r || *r != ':') return soap->error = SOAP_TYPE; s = r + 1; M = soap_strtoul(s, &r, 10); if (!r || *r != ':') return soap->error = SOAP_TYPE; s = r + 1; S = soap_strtoul(s, &r, 10); if (!r) return soap->error = SOAP_TYPE; s = r; if (*s == '.') { #if defined(WITH_C_LOCALE) && defined(HAVE_STRTOD_L) # ifdef WIN32 f = (float)_strtod_l(s, NULL, SOAP_LOCALE(soap)); # else f = (float)strtod_l(s, NULL, SOAP_LOCALE(soap)); # endif #elif defined(HAVE_STRTOD) f = (float)strtod(s, NULL); #elif defined(WITH_C_LOCALE) && defined(HAVE_STRTOF_L) f = strtof_l((char*)s, NULL, SOAP_LOCALE(soap)); #elif defined(HAVE_STRTOF) f = strtof((char*)s, NULL); #endif for (s++; *s; s++) if (*s < '0' || *s > '9') break; } if (*s == ' ' && !(soap->mode & SOAP_XML_STRICT)) s++; if (*s == 'Z' || *s == 'z') { s++; } else if (*s == '+' || *s == '-') { int h = 0, m = 0; h = soap_strtol(s, &r, 10); if (!r || *r != ':') return soap->error = SOAP_TYPE; s = r + 1; m = soap_strtol(s, &r, 10); if (!r) return soap->error = SOAP_TYPE; s = r; H += h; if (h < 0) { M += 60 - m; if (M >= 60) M -= 60; else H--; } else { M += m; if (M >= 60) { H++; M -= 60; } } if (H >= 24) return soap->error = SOAP_TYPE; } if (*s) return soap->error = SOAP_TYPE; /* convert H:M:S.f to unsigned long long int microseconds */ *a = ((((((H * 60) + M) * 60) + S) * 1000000) + (ULONG64)(f * 1000000.0 + 0.5)); } return soap->error; } SOAP_FMAC3 ULONG64 * SOAP_FMAC4 soap_in_xsd__time(struct soap *soap, const char *tag, ULONG64 *a, const char *type) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_att(soap, soap->type, type) && soap_match_att(soap, soap->type, ":time")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } a = (ULONG64*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_xsd__time, sizeof(ULONG64), NULL, NULL, NULL, NULL); if (!a) return NULL; if (!*soap->href) { int err = soap_s2xsd__time(soap, soap_value(soap), a); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { a = (ULONG64*)soap_id_forward(soap, soap->href, a, 0, SOAP_TYPE_xsd__time, 0, sizeof(ULONG64), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } gsoap-2.8.91/gsoap/custom/long_double.h0000644000175000017500000000567013525245157017372 0ustar ellertellert/* long_double.h Custom serializer for the long double (extended double) type as xsd:decimal. #import this file into your gSOAP .h file. Add this line to typemap.dat to automate the mapping with wsdl2h: xsd__decimal = #import "custom/long_double.h" | long double When using soapcpp2 option -q or -p, you must change long_double.c as follows: #include "soapH.h" -> #include "nameH.h" Compile and link your code with custom/long_double.c gSOAP XML Web services tools Copyright (C) 2000-2015, 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-2015, 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 -------------------------------------------------------------------------------- */ extern int soap_s2decimal(struct soap *soap, const char *s, long double *p); extern const char *soap_decimal2s(struct soap *soap, long double n); extern int soap_outdecimal(struct soap*, const char*, int, const long double*, const char*, int); extern long double *soap_indecimal(struct soap*, const char*, long double*, const char*, int); gsoap-2.8.91/gsoap/custom/qbytearray_hex.cpp0000644000175000017500000001443513525245157020462 0ustar ellertellert/* qbytearray_hex.cpp See qbytearray_hex.h for documentation. Compile this file and link it with your code. gSOAP XML Web services tools Copyright (C) 2000-2016, 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-2016, 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 -------------------------------------------------------------------------------- */ /* When using soapcpp2 option -q or -p, you need to change "soapH.h" below */ /* include soapH.h generated by soapcpp2 from .h file containing #import "qbytearray_hex.h" */ #ifdef SOAP_H_FILE /* if set, use the soapcpp2-generated fileH.h file as specified with: cc ... -DSOAP_H_FILE=fileH.h */ # include "stdsoap2.h" # include SOAP_XSTRINGIFY(SOAP_H_FILE) #else # include "soapH.h" /* or manually replace with soapcpp2-generated *H.h file */ #endif static void * instantiate_xsd__hexBinary(struct soap*, int, const char*, const char*, size_t*); static int delete_xsd__hexBinary(struct soap*, struct soap_clist*); static void copy_xsd__hexBinary(struct soap*, int, int, void*, size_t, const void*, void**); void soap_serialize_xsd__hexBinary(struct soap *soap, QByteArray const *a) { (void)soap; (void)a; /* appease -Wall -Werror */ } void soap_default_xsd__hexBinary(struct soap *soap, QByteArray *a) { (void)soap; /* appease -Wall -Werror */ *a = QByteArray(); } int soap_out_xsd__hexBinary(struct soap *soap, char const *tag, int id, QByteArray const *a, char const *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_xsd__hexBinary), type) || soap_string_out(soap, soap_xsd__hexBinary2s(soap, *a), 0)) return soap->error; return soap_element_end_out(soap, tag); } QByteArray *soap_in_xsd__hexBinary(struct soap *soap, char const *tag, QByteArray *a, char const *type) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_att(soap, soap->type, type) && soap_match_att(soap, soap->type, ":hexBinary")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } a = (QByteArray*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_xsd__hexBinary, sizeof(QByteArray), NULL, NULL, instantiate_xsd__hexBinary, NULL); if (*soap->href == '#') { a = (QByteArray*)soap_id_forward(soap, soap->href, a, 0, SOAP_TYPE_xsd__hexBinary, 0, sizeof(QByteArray), 0, copy_xsd__hexBinary, NULL); } else if (a && soap->body) { if (soap_s2xsd__hexBinary(soap, soap_string_in(soap, 0, -1, -1, NULL), a)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return a; } const char * soap_xsd__hexBinary2s(struct soap *soap, QByteArray a) { QByteArray ba = a.toHex(); size_t n = qstrlen(ba); char *s = (char*)soap_malloc(soap, n + 1); soap_strcpy(s, n + 1, ba.constData()); return s; } int soap_s2xsd__hexBinary(struct soap *soap, const char *s, QByteArray *a) { *a = QByteArray::fromHex(s); return soap->error; } static void * instantiate_xsd__hexBinary(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_xsd__hexBinary(%d, %s, %s)\n", n, type?type:"", arrayType?arrayType:"")); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_xsd__hexBinary, n, delete_xsd__hexBinary); (void)type; (void)arrayType; /* appease -Wall -Werror */ if (!cp) return NULL; if (n < 0) { cp->ptr = SOAP_NEW(soap, QByteArray); if (size) *size = sizeof(QByteArray); } else { cp->ptr = SOAP_NEW_ARRAY(soap, QByteArray, n); if (size) *size = n * sizeof(QByteArray); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated location=%p\n", cp->ptr)); if (!cp->ptr) soap->error = SOAP_EOM; return (QByteArray*)cp->ptr; } static int delete_xsd__hexBinary(struct soap *soap, struct soap_clist *p) { (void)soap; /* appease -Wall -Werror */ if (p->type == SOAP_TYPE_xsd__hexBinary) { if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), QByteArray); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), QByteArray); return SOAP_OK; } return SOAP_ERR; } static void copy_xsd__hexBinary(struct soap *soap, int st, int tt, void *p, size_t index, const void *q, void **x) { (void)soap; (void)st; (void)tt; (void)index; (void)x; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying QByteArray %p -> %p\n", q, p)); *(QByteArray*)p = *(QByteArray*)q; } gsoap-2.8.91/gsoap/custom/qdate.cpp0000644000175000017500000001634313525245157016531 0ustar ellertellert/* qdate.cpp See qdate.h for documentation. Compile this file and link it with your code. gSOAP XML Web services tools Copyright (C) 2000-2016, 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-2016, 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 -------------------------------------------------------------------------------- */ /* When using soapcpp2 option -q or -p, you need to change "soapH.h" below */ /* include soapH.h generated by soapcpp2 from .h file containing #import "qdate.h" */ #ifdef SOAP_H_FILE /* if set, use the soapcpp2-generated fileH.h file as specified with: cc ... -DSOAP_H_FILE=fileH.h */ # include "stdsoap2.h" # include SOAP_XSTRINGIFY(SOAP_H_FILE) #else # include "soapH.h" /* or manually replace with soapcpp2-generated *H.h file */ #endif static void * instantiate_xsd__date(struct soap*, int, const char*, const char*, size_t*); static int delete_xsd__date(struct soap*, struct soap_clist*); static void copy_xsd__date(struct soap*, int, int, void*, size_t, const void*, void**); void soap_serialize_xsd__date(struct soap *soap, QDate const *a) { (void)soap; (void)a; /* appease -Wall -Werror */ } void soap_default_xsd__date(struct soap *soap, QDate *a) { (void)soap; /* appease -Wall -Werror */ *a = QDate(); } int soap_out_xsd__date(struct soap *soap, char const *tag, int id, QDate const *a, char const *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_xsd__date), type) || soap_string_out(soap, soap_xsd__date2s(soap, *a), 0)) return soap->error; return soap_element_end_out(soap, tag); } QDate *soap_in_xsd__date(struct soap *soap, char const *tag, QDate *a, char const *type) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_att(soap, soap->type, type) && soap_match_att(soap, soap->type, ":date")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } a = (QDate*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_xsd__date, sizeof(QDate), NULL, NULL, instantiate_xsd__date, NULL); if (*soap->href == '#') { a = (QDate*)soap_id_forward(soap, soap->href, a, 0, SOAP_TYPE_xsd__date, 0, sizeof(QDate), 0, copy_xsd__date, NULL); } else if (a) { if (soap_s2xsd__date(soap, soap_value(soap), a)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return a; } const char * soap_xsd__date2s(struct soap *soap, QDate a) { /* YYYY-MM-DDZ */ if (!a.isValid()) a = QDate(1, 1, 1); #ifndef WITH_NOZONE QString str = a.toString(QStringLiteral("yyyy-MM-ddZ")); #else QString str = a.toString(QStringLiteral("yyyy-MM-dd")); #endif QByteArray ba = str.toLatin1(); soap_strcpy(soap->tmpbuf, qstrlen(ba)+1, ba.constData()); return soap->tmpbuf; } int soap_s2xsd__date(struct soap *soap, const char *s, QDate *a) { *a = QDate(); if (s) { char *t; unsigned long d; int yr = 0, mon = 0, day = 0; d = soap_strtoul(s, &t, 10); if (*t == '-') { /* YYYY-MM-DD */ yr = (int)d; mon = (int)soap_strtoul(t + 1, &t, 10); day = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* YYYYMMDD */ yr = (int)(d / 10000); mon = (int)(d / 100 % 100); day = (int)(d % 100); } else { return soap->error = SOAP_TYPE; } //set the date a->setDate(yr, mon, day); //grab the timezone to check validity if (*t == ' ' && !(soap->mode & SOAP_XML_STRICT)) t++; if (*t) { #ifndef WITH_NOZONE if (*t == '+' || *t == '-') { soap_strtol(t, &t, 10); if (*t == ':') soap_strtol(t + 1, &t, 10); if (*t) return soap->error = SOAP_TYPE; } else if (*t != 'Z') { return soap->error = SOAP_TYPE; } #endif } else { /* no UTC or timezone, so assume we got a localtime */ } } return soap->error; } static void * instantiate_xsd__date(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_xsd__date(%d, %s, %s)\n", n, type?type:"", arrayType?arrayType:"")); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_xsd__date, n, delete_xsd__date); (void)type; (void)arrayType; /* appease -Wall -Werror */ if (!cp) return NULL; if (n < 0) { cp->ptr = SOAP_NEW(soap, QDate); if (size) *size = sizeof(QDate); } else { cp->ptr = SOAP_NEW_ARRAY(soap, QDate, n); if (size) *size = n * sizeof(QDate); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated location=%p\n", cp->ptr)); if (!cp->ptr) soap->error = SOAP_EOM; return (QDate*)cp->ptr; } static int delete_xsd__date(struct soap *soap, struct soap_clist *p) { (void)soap; /* appease -Wall -Werror */ if (p->type == SOAP_TYPE_xsd__date) { if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), QDate); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), QDate); return SOAP_OK; } return SOAP_ERR; } static void copy_xsd__date(struct soap *soap, int st, int tt, void *p, size_t index, const void *q, void **x) { (void)soap; (void)st; (void)tt; (void)index; (void)x; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying QDate %p -> %p\n", q, p)); *(QDate*)p = *(QDate*)q; } gsoap-2.8.91/gsoap/custom/struct_tm_date.c0000644000175000017500000001503313525245157020107 0ustar ellertellert/* struct_tm_date.c Custom serializer for xsd:date Gregorian calendar date stored in a struct tm. Basically the same as the struct tm xsd:dateTime serializer, but without the time part, which is considered 00:00:00. See struct_tm_date.h for documentation. Compile this file and link it with your code. gSOAP XML Web services tools Copyright (C) 2000-2015, 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-2015, 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 -------------------------------------------------------------------------------- */ /* When using soapcpp2 option -q or -p, you need to change "soapH.h" below */ /* include soapH.h generated by soapcpp2 from .h file containing struct tm */ #ifdef SOAP_H_FILE /* if set, use the soapcpp2-generated fileH.h file as specified with: cc ... -DSOAP_H_FILE=fileH.h */ # include "stdsoap2.h" # include SOAP_XSTRINGIFY(SOAP_H_FILE) #else # include "soapH.h" /* or manually replace with soapcpp2-generated *H.h file */ #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_xsd__date(struct soap *soap, struct tm *a) { (void)soap; /* appease -Wall -Werror */ memset((void*)a, 0, sizeof(struct tm)); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_xsd__date(struct soap *soap, struct tm const *a) { (void)soap; (void)a; } SOAP_FMAC3 const char * SOAP_FMAC4 soap_xsd__date2s(struct soap *soap, struct tm a) { #ifndef WITH_NOZONE strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dZ", &a); #else strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%d", &a); #endif return soap->tmpbuf; } SOAP_FMAC3 int SOAP_FMAC4 soap_out_xsd__date(struct soap *soap, const char *tag, int id, const struct tm *a, const char *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_xsd__date), type) || soap_string_out(soap, soap_xsd__date2s(soap, *a), 0)) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 int SOAP_FMAC4 soap_s2xsd__date(struct soap *soap, const char *s, struct tm *a) { memset((void*)a, 0, sizeof(struct tm)); if (s) { char *t; unsigned long d; d = soap_strtoul(s, &t, 10); if (*t == '-') { /* YYYY-MM-DD */ a->tm_year = (int)d; a->tm_mon = (int)soap_strtoul(t + 1, &t, 10); a->tm_mday = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* YYYYMMDD */ a->tm_year = (int)(d / 10000); a->tm_mon = (int)(d / 100 % 100); a->tm_mday = (int)(d % 100); } else return soap->error = SOAP_TYPE; if (a->tm_year == 1) a->tm_year = 70; else a->tm_year -= 1900; a->tm_mon--; if (*t == ' ' && !(soap->mode & SOAP_XML_STRICT)) t++; if (*t) { #ifndef WITH_NOZONE if (*t == '+' || *t == '-') { int h, m; m = (int)soap_strtol(t, &t, 10); if (*t == ':') { /* +hh:mm */ h = m; m = (int)soap_strtol(t + 1, &t, 10); if (h < 0) m = -m; } else if (!(soap->mode & SOAP_XML_STRICT)) { /* +hhmm */ h = m / 100; m = m % 100; } else { /* +hh */ h = m; m = 0; } if (*t) return soap->error = SOAP_TYPE; a->tm_min -= m; a->tm_hour -= h; /* put hour and min in range */ a->tm_hour += a->tm_min / 60; a->tm_min %= 60; if (a->tm_min < 0) { a->tm_min += 60; a->tm_hour--; } a->tm_mday += a->tm_hour / 24; a->tm_hour %= 24; if (a->tm_hour < 0) { a->tm_hour += 24; a->tm_mday--; } /* note: day of the month may be out of range, timegm() handles it */ } else if (*t != 'Z') return soap->error = SOAP_TYPE; #endif } else /* no UTC or timezone, so assume we got a localtime */ a->tm_isdst = -1; } return soap->error; } SOAP_FMAC3 struct tm * SOAP_FMAC4 soap_in_xsd__date(struct soap *soap, const char *tag, struct tm *a, const char *type) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_att(soap, soap->type, type) && soap_match_att(soap, soap->type, ":date")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } a = (struct tm*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_xsd__date, sizeof(struct tm), NULL, NULL, NULL, NULL); if (*soap->href) a = (struct tm*)soap_id_forward(soap, soap->href, a, 0, SOAP_TYPE_xsd__date, 0, sizeof(struct tm), 0, NULL, NULL); else if (a) { if (soap_s2xsd__date(soap, soap_value(soap), a)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return a; } gsoap-2.8.91/gsoap/custom/long_time.h0000644000175000017500000000645513525245157017060 0ustar ellertellert/* long_time.h Custom serializer for xsd:time stored in an ULONG64 with usec (microsecond) precision - can represent 00:00:00 to 23:59:59.999999 (= 86399999999) UTC. - inbound value with timezone offset is converted to UTC. - ULONG64 is equivalent to unsigned long long int and uint64_t. - microsecond resolution (1/1000000 sec) means 1 second = 1000000. To obtain the current time and set the UTC time value accordingly: #include struct timeval tv; xsd__time t; // a ULONG64 custom serialized as xsd:time in UTC gettimeofday(&tv, NULL); t = tv.tv_usec + (tv.tv_sec % (24*60*60)) * 1000000; #import this file into your gSOAP .h file To automate the wsdl2h-mapping of xsd:time to ULONG64, add this line to the typemap.dat file: xsd__time = #import "custom/long_time.h" | xsd__time The typemap.dat file is used by wsdl2h to map types (wsdl2h option -t). When using soapcpp2 option -q or -p, you must change time.c as follows: #include "soapH.h" -> #include "nameH.h" Compile and link your code with custom/long_time.c gSOAP XML Web services tools Copyright (C) 2000-2015, 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-2015, 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 -------------------------------------------------------------------------------- */ extern typedef unsigned long long xsd__time; /* HH:MM:SS.uuuuuu time in usec (1/1000000 sec) */ gsoap-2.8.91/gsoap/custom/qstring.cpp0000644000175000017500000001474113525245157017122 0ustar ellertellert/* qstring.cpp See qstring.h for documentation. Compile this file and link it with your code. gSOAP XML Web services tools Copyright (C) 2000-2016, 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-2016, 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 -------------------------------------------------------------------------------- */ /* When using soapcpp2 option -q or -p, you need to change "soapH.h" below */ /* include soapH.h generated by soapcpp2 from .h file containing #import "qstring.h" */ #ifdef SOAP_H_FILE /* if set, use the soapcpp2-generated fileH.h file as specified with: cc ... -DSOAP_H_FILE=fileH.h */ # include "stdsoap2.h" # include SOAP_XSTRINGIFY(SOAP_H_FILE) #else # include "soapH.h" /* or manually replace with soapcpp2-generated *H.h file */ #endif static void * instantiate_xsd__string(struct soap*, int, const char*, const char*, size_t*); static int delete_xsd__string(struct soap*, struct soap_clist*); static void copy_xsd__string(struct soap*, int, int, void*, size_t, const void*, void**); void soap_serialize_xsd__string(struct soap *soap, QString const *a) { (void)soap; (void)a; /* appease -Wall -Werror */ } void soap_default_xsd__string(struct soap *soap, QString *a) { (void)soap; /* appease -Wall -Werror */ *a = QString(); } int soap_out_xsd__string(struct soap *soap, char const *tag, int id, QString const *a, char const *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_xsd__string), type) || soap_string_out(soap, soap_xsd__string2s(soap, *a), 0)) return soap->error; return soap_element_end_out(soap, tag); } QString *soap_in_xsd__string(struct soap *soap, char const *tag, QString *a, char const *type) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_att(soap, soap->type, type) && soap_match_att(soap, soap->type, ":string")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } a = (QString*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_xsd__string, sizeof(QString), NULL, NULL, instantiate_xsd__string, NULL); if (*soap->href == '#') { a = (QString*)soap_id_forward(soap, soap->href, a, 0, SOAP_TYPE_xsd__string, 0, sizeof(QString), 0, copy_xsd__string, NULL); } else if (a && soap->body) { if (soap_s2xsd__string(soap, soap_string_in(soap, 1, -1, -1, NULL), a)) return NULL; } else if (tag && *tag == '-') { soap->error = SOAP_NO_TAG; return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return a; } const char * soap_xsd__string2s(struct soap *soap, QString a) { QByteArray ba; if (soap->mode & SOAP_C_UTFSTRING) ba = a.toUtf8(); else ba = a.toLatin1(); size_t n = qstrlen(ba); char *s = (char*)soap_malloc(soap, n + 1); soap_strcpy(s, n + 1, ba.constData()); return s; } int soap_s2xsd__string(struct soap *soap, const char *s, QString *a) { if (s) { if (soap->mode & SOAP_C_UTFSTRING) *a = QString::fromUtf8(s, (int)strlen(s)); else *a = QString::fromLatin1(s, (int)strlen(s)); } else { *a = QString(); } return soap->error; } static void * instantiate_xsd__string(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_xsd__string(%d, %s, %s)\n", n, type?type:"", arrayType?arrayType:"")); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_xsd__string, n, delete_xsd__string); (void)type; (void)arrayType; /* appease -Wall -Werror */ if (!cp) return NULL; if (n < 0) { cp->ptr = SOAP_NEW(soap, QString); if (size) *size = sizeof(QString); } else { cp->ptr = SOAP_NEW_ARRAY(soap, QString, n); if (size) *size = n * sizeof(QString); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated location=%p\n", cp->ptr)); if (!cp->ptr) soap->error = SOAP_EOM; return (QString*)cp->ptr; } static int delete_xsd__string(struct soap *soap, struct soap_clist *p) { (void)soap; /* appease -Wall -Werror */ if (p->type == SOAP_TYPE_xsd__string) { if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), QString); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), QString); return SOAP_OK; } return SOAP_ERR; } static void copy_xsd__string(struct soap *soap, int st, int tt, void *p, size_t index, const void *q, void **x) { (void)soap; (void)st; (void)tt; (void)index; (void)x; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying QString %p -> %p\n", q, p)); *(QString*)p = *(QString*)q; } gsoap-2.8.91/gsoap/custom/chrono_duration.cpp0000644000175000017500000002230713525245157020625 0ustar ellertellert/* chrono_duration.cpp See chrono_duration.h for documentation. Compile this file and link it with your code. gSOAP XML Web services tools Copyright (C) 2000-2015, 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-2015, 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 -------------------------------------------------------------------------------- */ /* When using soapcpp2 option -q or -p, you need to change "soapH.h" below */ /* include soapH.h generated by soapcpp2 from .h file containing #import "chrono_duration.h" */ #ifdef SOAP_H_FILE /* if set, use the soapcpp2-generated fileH.h file as specified with: cc ... -DSOAP_H_FILE=fileH.h */ # include "stdsoap2.h" # include SOAP_XSTRINGIFY(SOAP_H_FILE) #else # include "soapH.h" /* or manually replace with soapcpp2-generated *H.h file */ #endif static void * instantiate_xsd__duration(struct soap*, int, const char*, const char*, size_t*); static int delete_xsd__duration(struct soap *soap, struct soap_clist*); static void copy_xsd__duration(struct soap*, int, int, void*, size_t, const void*, void**); SOAP_FMAC3 void SOAP_FMAC4 soap_default_xsd__duration(struct soap *soap, std::chrono::nanoseconds *a) { (void)soap; /* appease -Wall -Werror */ *a = a->zero(); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_xsd__duration(struct soap *soap, const std::chrono::nanoseconds *a) { (void)soap; (void)a; /* appease -Wall -Werror */ } SOAP_FMAC3 const char * SOAP_FMAC4 soap_xsd__duration2s(struct soap *soap, std::chrono::nanoseconds a) { LONG64 n = a.count(); int k, h, m, s, f; if (n < 0) { soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "-P"); k = 2; n = -n; } else { soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "P"); k = 1; } f = n % 1000000000LL; n /= 1000000000LL; s = n % 60; n /= 60; m = n % 60; n /= 60; h = n % 24; n /= 24; if (n) (SOAP_SNPRINTF(soap->tmpbuf + k, sizeof(soap->tmpbuf) - k, 21), SOAP_LONG_FORMAT "D", n); if (h || m || s || f) { if (n) k = strlen(soap->tmpbuf); if (f) (SOAP_SNPRINTF(soap->tmpbuf + k, sizeof(soap->tmpbuf) - k, 14), "T%02dH%02dM%02d.%09dS", h, m, s, f); else (SOAP_SNPRINTF(soap->tmpbuf + k, sizeof(soap->tmpbuf) - k, 10), "T%02dH%02dM%02dS", h, m, s); } else if (!n) soap_strcpy(soap->tmpbuf + k, sizeof(soap->tmpbuf) - k, "T0S"); return soap->tmpbuf; } SOAP_FMAC3 int SOAP_FMAC4 soap_out_xsd__duration(struct soap *soap, const char *tag, int id, const std::chrono::nanoseconds *a, const char *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_xsd__duration), type) || soap_string_out(soap, soap_xsd__duration2s(soap, *a), 0)) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 int SOAP_FMAC4 soap_s2xsd__duration(struct soap *soap, const char *s, std::chrono::nanoseconds *a) { LONG64 sign = 1, Y = 0, M = 0, D = 0, H = 0, N = 0, S = 0; double f = 0; *a = a->zero(); if (s) { if (*s == '-') { sign = -1; s++; } if (*s != 'P' && *s != 'p') return soap->error = SOAP_TYPE; s++; /* date part */ while (s && *s) { char *r = NULL; LONG64 n; if (*s == 'T' || *s == 't') { s++; break; } n = soap_strtol(s, &r, 10); if (!r) return soap->error = SOAP_TYPE; s = r; switch (*s) { case 'Y': case 'y': Y = n; break; case 'M': case 'm': M = n; break; case 'D': case 'd': D = n; break; default: return soap->error = SOAP_TYPE; } s++; } /* time part */ while (s && *s) { char *r = NULL; LONG64 n; n = soap_strtol(s, &r, 10); if (!r) return soap->error = SOAP_TYPE; s = r; switch (*s) { case 'H': case 'h': H = n; break; case 'M': case 'm': N = n; break; case '.': S = n; #if defined(WITH_C_LOCALE) && defined(HAVE_STRTOD_L) # ifdef WIN32 f = _strtod_l(s, NULL, SOAP_LOCALE(soap)); # else f = strtod_l(s, NULL, SOAP_LOCALE(soap)); # endif #elif defined(HAVE_STRTOD) f = strtod(s, NULL); #elif defined(WITH_C_LOCALE) && defined(HAVE_STRTOF_L) f = (double)strtof_l((char*)s, NULL, SOAP_LOCALE(soap)); #elif defined(HAVE_STRTOF) f = (double)strtof((char*)s, NULL); #endif s = NULL; continue; case 'S': case 's': S = n; break; default: return soap->error = SOAP_TYPE; } s++; } /* convert Y-M-D H:N:S.f to std::chrono::nanoseconds */ std::chrono::hours hours(sign * ((((((Y * 12) + M) * 30) + D) * 24) + H)); std::chrono::seconds seconds(sign * ((N * 60) + S)); std::chrono::nanoseconds nanos(sign * (LONG64)(1e9 * f + 0.5)); *a = hours + seconds + nanos; } return soap->error; } SOAP_FMAC3 std::chrono::nanoseconds * SOAP_FMAC4 soap_in_xsd__duration(struct soap *soap, const char *tag, std::chrono::nanoseconds *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, ":duration")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } a = (std::chrono::nanoseconds*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_xsd__duration, sizeof(std::chrono::nanoseconds), NULL, NULL, instantiate_xsd__duration, NULL); if (*soap->href) a = (std::chrono::nanoseconds*)soap_id_forward(soap, soap->href, a, 0, SOAP_TYPE_xsd__duration, 0, sizeof(std::chrono::nanoseconds), 0, copy_xsd__duration, NULL); else if (a) { if (soap_s2xsd__duration(soap, soap_value(soap), a)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return a; } static void * instantiate_xsd__duration(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_xsd__duration(%d, %s, %s)\n", n, type?type:"", arrayType?arrayType:"")); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_xsd__duration, n, delete_xsd__duration); (void)type; (void)arrayType; /* appease -Wall -Werror */ if (!cp) return NULL; if (n < 0) { cp->ptr = SOAP_NEW(soap, std::chrono::nanoseconds); if (size) *size = sizeof(std::chrono::nanoseconds); } else { cp->ptr = SOAP_NEW_ARRAY(soap, std::chrono::nanoseconds, n); if (size) *size = n * sizeof(std::chrono::nanoseconds); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated location=%p\n", cp->ptr)); if (!cp->ptr) soap->error = SOAP_EOM; return (std::chrono::nanoseconds*)cp->ptr; } static int delete_xsd__duration(struct soap *soap, struct soap_clist *p) { (void)soap; /* appease -Wall -Werror */ if (p->type == SOAP_TYPE_xsd__duration) { if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), std::chrono::nanoseconds); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), std::chrono::nanoseconds); return SOAP_OK; } return SOAP_ERR; } static void copy_xsd__duration(struct soap *soap, int st, int tt, void *p, size_t index, const void *q, void **x) { (void)soap; (void)st; (void)tt; (void)index; (void)x; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying std::chrono::nanoseconds %p -> %p\n", q, p)); *(std::chrono::nanoseconds*)p = *(std::chrono::nanoseconds*)q; } gsoap-2.8.91/gsoap/custom/README.txt0000644000175000017500000001054113525245157016417 0ustar ellertellert OVERVIEW -------- This directory contains custom serializers for common data types. CONTENTS -------- Custom serializers augment the soapcpp2-generated serialization routines with serializers for additional C and C++ types. See the notes in the source files on specific usage. The following custom serializers are available: long_double.* Serializes long double (extended double) type as xsd:decimal float128.* Serializes __float128 type as xsd:decimal int128.* Serializes __int128_t as xsd:integer struct_tm.* Serializes struct tm as xsd:dateTime struct_timeval.* Serializes struct timeval as xsd:dateTime duration.* Serializes LONG64 milliseconds as xsd:duration struct_tm_date.* Serializes struct tm as xsd:date long_time.* Serializes LONG64 milliseconds as xsd:time chrono_duration.* Serializes C++11 std::chrono::nanoseconds as xsd:duration chrono_time_point.* Serializes C++11 std::chrono::system_clock as xsd:dateTime qbytearray_base64.* Serializes Qt QByteArray as xsd:base64Binary qbytearray_hex.* Serializes Qt QByteArray as xsd:hexBinary qdate.* Serializes Qt QDate to xsd:date qdatetime.* Serializes Qt QDateTime to xsd:dateTime qstring.* Serializes Qt QString to xsd:string (and other XSD) qtime.* Serializes Qt QTime to xsd:time The xsd:dateTime parsers are more permissive to accept alternative ISO8601 formats. To restrict xsd:dateTime formats to the XSD standard, use the SOAP_XML_STRICT flag. Qt vector --------- Containers are serializable when declared in a .h specification file for soapcpp2 as a template class. Therefore, to use Qt vectors, all you have to do is declare in the specification file for soapcpp2: #include template class QVector; C VERSUS C++ ------------ Only .c files are included here for the custom serializers that work both in C and in C++. Copy the .c files that you need to .cpp for compiling and linking in C++. THE 2038 PROBLEM ---------------- Because time_t is limited to dates between 1970 and 2038 (on 32 bit systems), struct tm should be used for wider date ranges. USAGE ----- To use a custom serializer, add an import statement to your gSOAP header file. For example: #import "struct_tm.h" This replaces time_t for xsd__dateTime by struct tm to support a wider date range. You can then use xsd__dateTime as XML elements and attributes: struct ns__example { @xsd__dateTime start; // attribute xsd__dateTime end; // element }; Then run soapcpp2 on this .h file. Compile and link custom/struct_tm.c with your project code. When using soapcpp2 option -q, -q, or -p, you must change struct_tm.c (and other custom serializer .c/.cpp files that you are using) by changing #include "soapH.h" as follows: #include "soapH.h" -> #include "nameH.h" HOW TO USE TYPEMAP.DAT TO AUTOMATE THE MAPPING TO A CUSTOM TYPE WITH WSDL2H --------------------------------------------------------------------------- A mapping is specified in typemap.dat as follows: xsd__dateTime = #import "custom/struct_tm.h" which maps xsd:dateTime to struct tm when wsdl2h is applied to a WSDL. xsd__decimal = #import "custom/long_double.h" | long double This maps xsd:decimal to long double (the column after | specifies usage). To map xsd:string and other XSD string-like types to a Qt QString: xsd__string = #import "custom/qstring.h" IMPLEMENTING YOUR OWN CUSTOM SERIALIZERS ---------------------------------------- To build your own custom serializers: a custom serializer is typically declared in the imported file as follows extern typedef Type X; To implement custom serializers you should implement the following routines: void soap_default_X(struct soap*, X*); sets default values for X void soap_serialize_X(struct soap*, X const*); analyzes X for id-ref serialization (maybe empty) int soap_out_X(struct soap*, const char *tag, int id, X const*, const char *type); emits X in XML as (type is optional) X *soap_in_X(struct soap*, const char *tag, X*, const char *type); parses X from XML as To support XML attribute serialization, you should also define: int soap_s2X(struct soap*, const char *value, X*); converts string to X and returns SOAP_OK const char *soap_X2s(struct soap*, X); converts X to string (or NULL when error) gsoap-2.8.91/gsoap/custom/qtime.cpp0000644000175000017500000001755413525245157016557 0ustar ellertellert/* qtime.cpp See qtime.h for documentation. Compile this file and link it with your code. gSOAP XML Web services tools Copyright (C) 2000-2016, 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-2016, 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 -------------------------------------------------------------------------------- */ /* When using soapcpp2 option -q or -p, you need to change "soapH.h" below */ /* include soapH.h generated by soapcpp2 from .h file containing #import "qtime.h" */ #ifdef SOAP_H_FILE /* if set, use the soapcpp2-generated fileH.h file as specified with: cc ... -DSOAP_H_FILE=fileH.h */ # include "stdsoap2.h" # include SOAP_XSTRINGIFY(SOAP_H_FILE) #else # include "soapH.h" /* or manually replace with soapcpp2-generated *H.h file */ #endif static void * instantiate_xsd__time(struct soap*, int, const char*, const char*, size_t*); static int delete_xsd__time(struct soap*, struct soap_clist*); static void copy_xsd__time(struct soap*, int, int, void*, size_t, const void*, void**); void soap_serialize_xsd__time(struct soap *soap, QTime const *a) { (void)soap; (void)a; /* appease -Wall -Werror */ } void soap_default_xsd__time(struct soap *soap, QTime *a) { (void)soap; /* appease -Wall -Werror */ *a = QTime(); } int soap_out_xsd__time(struct soap *soap, char const *tag, int id, QTime const *a, char const *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_xsd__time), type) || soap_string_out(soap, soap_xsd__time2s(soap, *a), 0)) return soap->error; return soap_element_end_out(soap, tag); } QTime *soap_in_xsd__time(struct soap *soap, char const *tag, QTime *a, char const *type) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_att(soap, soap->type, type) && soap_match_att(soap, soap->type, ":time")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } a = (QTime*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_xsd__time, sizeof(QTime), NULL, NULL, instantiate_xsd__time, NULL); if (*soap->href == '#') { a = (QTime*)soap_id_forward(soap, soap->href, a, 0, SOAP_TYPE_xsd__time, 0, sizeof(QTime), 0, copy_xsd__time, NULL); } else if (a) { if (soap_s2xsd__time(soap, soap_value(soap), a)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return a; } const char * soap_xsd__time2s(struct soap *soap, QTime a) { //hh:mm:ss.zzzZ if (!a.isValid()) a = QTime(0, 0, 0, 0); #ifndef WITH_NOZONE QString str = a.toString(QStringLiteral("HH:mm:ss.zzzZ")); #else QString str = a.toString(QStringLiteral("HH:mm:ss.zzz")); #endif QByteArray ba = str.toLatin1(); soap_strcpy(soap->tmpbuf, qstrlen(ba)+1, ba.constData()); return soap->tmpbuf; } int soap_s2xsd__time(struct soap *soap, const char *s, QTime *a) { *a = QTime(); if (s) { //grab hrs, mins, secs, mills char *t; unsigned long d = 0; int hrs = 0, mins = 0, secs = 0, mills = 0; d = soap_strtoul(s, &t, 10); if (*t == ':') { /* hh:mm:ss */ hrs = d; mins = (int)soap_strtoul(t + 1, &t, 10); secs = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* hhmmss */ hrs = (int)(d / 10000); mins = (int)(d / 100 % 100); secs = (int)(d % 100); } else { return soap->error = SOAP_TYPE; } //grab the milliseconds if it's included if (*t == '.') mills = (int)soap_strtoul(t+1, &t, 10); //set the time a->setHMS(hrs, mins, secs, mills); //grab the timezone and adjust time if (*t == ' ' && !(soap->mode & SOAP_XML_STRICT)) t++; if (*t) { #ifndef WITH_NOZONE if (*t == '+' || *t == '-') { int hrs, mins; mins = (int)soap_strtol(t, &t, 10); if (*t == ':') { /* +hh:mm */ hrs = mins; mins = (int)soap_strtol(t + 1, &t, 10); if (hrs < 0) mins = -mins; } else if (!(soap->mode & SOAP_XML_STRICT)) { /* +hhmm */ hrs = mins / 100; mins = mins % 100; } else { /* +hh */ hrs = mins; mins = 0; } if (*t) return soap->error = SOAP_TYPE; (void)a->addSecs(-mins*60); (void)a->addSecs(-hrs*3600); } else if (*t != 'Z') { return soap->error = SOAP_TYPE; } #endif } else { /* no UTC or timezone, so assume we got a localtime */ } } return soap->error; } static void * instantiate_xsd__time(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_xsd__time(%d, %s, %s)\n", n, type?type:"", arrayType?arrayType:"")); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_xsd__time, n, delete_xsd__time); (void)type; (void)arrayType; /* appease -Wall -Werror */ if (!cp) return NULL; if (n < 0) { cp->ptr = SOAP_NEW(soap, QTime); if (size) *size = sizeof(QTime); } else { cp->ptr = SOAP_NEW_ARRAY(soap, QTime, n); if (size) *size = n * sizeof(QTime); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated location=%p\n", cp->ptr)); if (!cp->ptr) soap->error = SOAP_EOM; return (QTime*)cp->ptr; } static int delete_xsd__time(struct soap *soap, struct soap_clist *p) { (void)soap; /* appease -Wall -Werror */ if (p->type == SOAP_TYPE_xsd__time) { if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), QTime); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), QTime); return SOAP_OK; } return SOAP_ERR; } static void copy_xsd__time(struct soap *soap, int st, int tt, void *p, size_t index, const void *q, void **x) { (void)soap; (void)st; (void)tt; (void)index; (void)x; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying QTime %p -> %p\n", q, p)); *(QTime*)p = *(QTime*)q; } gsoap-2.8.91/gsoap/custom/chrono_time_point.cpp0000644000175000017500000001551313525245157021150 0ustar ellertellert/* chrono_time_point.cpp Custom serializer for std::chrono::system_clock::time_point as xsd:dateTime See chrono_time_point.h for documentation. Compile this file and link it with your code. gSOAP XML Web services tools Copyright (C) 2000-2015, 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-2015, 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 -------------------------------------------------------------------------------- */ /* When using soapcpp2 option -q or -p, you need to change "soapH.h" below */ /* include soapH.h generated by soapcpp2 from .h file containing #import "chrono_time_point.h" */ #ifdef SOAP_H_FILE /* if set, use the soapcpp2-generated fileH.h file as specified with: cc ... -DSOAP_H_FILE=fileH.h */ # include "stdsoap2.h" # include SOAP_XSTRINGIFY(SOAP_H_FILE) #else # include "soapH.h" /* or manually replace with soapcpp2-generated *H.h file */ #endif static void * instantiate_xsd__dateTime(struct soap*, int, const char*, const char*, size_t*); static int delete_xsd__dateTime(struct soap*, struct soap_clist*); static void copy_xsd__dateTime(struct soap*, int, int, void*, size_t, const void*, void**); SOAP_FMAC3 void SOAP_FMAC4 soap_default_xsd__dateTime(struct soap *soap, std::chrono::system_clock::time_point *a) { (void)soap; (void)a; } SOAP_FMAC3 void soap_serialize_xsd__dateTime(struct soap *soap, std::chrono::system_clock::time_point const *a) { (void)soap; (void)a; } SOAP_FMAC3 const char * SOAP_FMAC4 soap_xsd__dateTime2s(struct soap *soap, const std::chrono::system_clock::time_point a) { time_t t = std::chrono::system_clock::to_time_t(a); return soap_dateTime2s(soap, t); } SOAP_FMAC3 int SOAP_FMAC4 soap_out_xsd__dateTime(struct soap *soap, const char *tag, int id, const std::chrono::system_clock::time_point *a, const char *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_xsd__dateTime), type) || soap_string_out(soap, soap_xsd__dateTime2s(soap, *a), 0)) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 int SOAP_FMAC4 soap_s2xsd__dateTime(struct soap *soap, const char *s, std::chrono::system_clock::time_point *a) { time_t t; if (!soap_s2dateTime(soap, s, &t)) *a = std::chrono::system_clock::from_time_t(t); return soap->error; } SOAP_FMAC3 std::chrono::system_clock::time_point * SOAP_FMAC4 soap_in_xsd__dateTime(struct soap *soap, const char *tag, std::chrono::system_clock::time_point *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, ":dateTime")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } a = (std::chrono::system_clock::time_point*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_xsd__dateTime, sizeof(std::chrono::system_clock::time_point), NULL, NULL, instantiate_xsd__dateTime, NULL); if (*soap->href) a = (std::chrono::system_clock::time_point*)soap_id_forward(soap, soap->href, a, 0, SOAP_TYPE_xsd__dateTime, 0, sizeof(std::chrono::system_clock::time_point), 0, copy_xsd__dateTime, NULL); else if (a) { if (soap_s2xsd__dateTime(soap, soap_value(soap), a)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return a; } static void * instantiate_xsd__dateTime(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_xsd__dateTime(%d, %s, %s)\n", n, type?type:"", arrayType?arrayType:"")); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_xsd__dateTime, n, delete_xsd__dateTime); (void)type; (void)arrayType; /* appease -Wall -Werror */ if (!cp) return NULL; if (n < 0) { cp->ptr = SOAP_NEW(soap, std::chrono::nanoseconds); if (size) *size = sizeof(std::chrono::nanoseconds); } else { cp->ptr = SOAP_NEW_ARRAY(soap, std::chrono::nanoseconds, n); if (size) *size = n * sizeof(std::chrono::nanoseconds); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated location=%p\n", cp->ptr)); if (!cp->ptr) soap->error = SOAP_EOM; return (std::chrono::nanoseconds*)cp->ptr; } static int delete_xsd__dateTime(struct soap *soap, struct soap_clist *p) { (void)soap; /* appease -Wall -Werror */ if (p->type == SOAP_TYPE_xsd__dateTime) { if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), std::chrono::nanoseconds); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), std::chrono::nanoseconds); return SOAP_OK; } return SOAP_ERR; } static void copy_xsd__dateTime(struct soap *soap, int st, int tt, void *p, size_t index, const void *q, void **x) { (void)soap; (void)st; (void)tt; (void)index; (void)x; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying std::chrono::system_clock::time_point %p -> %p\n", q, p)); *(std::chrono::nanoseconds*)p = *(std::chrono::nanoseconds*)q; } gsoap-2.8.91/gsoap/custom/qbytearray_base64.h0000644000175000017500000000571213525245157020425 0ustar ellertellert/* qbytearray_base64.h Custom serializer for Qt's QByteArray type as xsd:base64Binary. Requires Qt 4.8 or higher. NOTE: While QByteArrays can embed '\0' characters, C-strings cannot. This serializer treats the first '\0' character in a QByteArray as the end of the array, and truncates the rest. #import this file into your gSOAP .h file. To automate the wsdl2h-mapping of xsd:base64Binary to QByteArray, add this line to the typemap.dat file: xsd__base64Binary = #import "custom/qbytearray_base64.h" When using soapcpp2 option -q or -p, you must change qbytearray_base64.cpp as follows: #include "soapH.h" -> #include "nameH.h" Compile and link your code with custom/qbytearray_base64.cpp gSOAP XML Web services tools Copyright (C) 2000-2016, 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-2016, 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 extern class QByteArray; extern typedef QByteArray xsd__base64Binary; gsoap-2.8.91/gsoap/custom/qdatetime.cpp0000644000175000017500000002207113525245157017403 0ustar ellertellert/* qdatetime.cpp See qdatetime.h for documentation. Compile this file and link it with your code. gSOAP XML Web services tools Copyright (C) 2000-2016, 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-2016, 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 -------------------------------------------------------------------------------- */ /* When using soapcpp2 option -q or -p, you need to change "soapH.h" below */ /* include soapH.h generated by soapcpp2 from .h file containing #import "qdatetime.h" */ #ifdef SOAP_H_FILE /* if set, use the soapcpp2-generated fileH.h file as specified with: cc ... -DSOAP_H_FILE=fileH.h */ # include "stdsoap2.h" # include SOAP_XSTRINGIFY(SOAP_H_FILE) #else # include "soapH.h" /* or manually replace with soapcpp2-generated *H.h file */ #endif #if (QT_VERSION >= QT_VERSION_CHECK(5, 2, 0)) && QT_CONFIG(timezone) # include #endif static void * instantiate_xsd__dateTime(struct soap*, int, const char*, const char*, size_t*); static int delete_xsd__dateTime(struct soap*, struct soap_clist*); static void copy_xsd__dateTime(struct soap*, int, int, void*, size_t, const void*, void**); void soap_serialize_xsd__dateTime(struct soap *soap, QDateTime const *a) { (void)soap; (void)a; /* appease -Wall -Werror */ } void soap_default_xsd__dateTime(struct soap *soap, QDateTime *a) { (void)soap; /* appease -Wall -Werror */ *a = QDateTime(); } int soap_out_xsd__dateTime(struct soap *soap, char const *tag, int id, QDateTime const *a, char const *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_xsd__dateTime), type) || soap_string_out(soap, soap_xsd__dateTime2s(soap, *a), 0)) return soap->error; return soap_element_end_out(soap, tag); } QDateTime *soap_in_xsd__dateTime(struct soap *soap, char const *tag, QDateTime *a, char const *type) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_att(soap, soap->type, type) && soap_match_att(soap, soap->type, ":dateTime")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } a = (QDateTime*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_xsd__dateTime, sizeof(QDateTime), NULL, NULL, instantiate_xsd__dateTime, NULL); if (*soap->href == '#') { a = (QDateTime*)soap_id_forward(soap, soap->href, a, 0, SOAP_TYPE_xsd__dateTime, 0, sizeof(QDateTime), 0, copy_xsd__dateTime, NULL); } else if (a) { if (soap_s2xsd__dateTime(soap, soap_value(soap), a)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return a; } const char * soap_xsd__dateTime2s(struct soap *soap, QDateTime a) { /* YYYY-MM-DDThh:mm:ss.sssZ */ if (!a.isValid()) a = QDateTime(QDate(1, 1, 1), QTime(0, 0, 0), Qt::UTC); else a = a.toUTC(); #ifndef WITH_NOZONE QString str = a.toString(QStringLiteral("yyyy-MM-ddTHH:mm:ss.zzzZ")); #else QString str = a.toString(QStringLiteral("yyyy-MM-ddTHH:mm:ss.zzz")); #endif QByteArray ba = str.toLatin1(); soap_strcpy(soap->tmpbuf, qstrlen(ba)+1, ba.constData()); return soap->tmpbuf; } int soap_s2xsd__dateTime(struct soap *soap, const char *s, QDateTime *a) { *a = QDateTime(); a->setTimeSpec(Qt::UTC); if (s) { char *t; unsigned long d; int yr = 0, mon = 0, day = 0; d = soap_strtoul(s, &t, 10); if (*t == '-') { /* YYYY-MM-DD */ yr = (int)d; mon = (int)soap_strtoul(t + 1, &t, 10); day = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* YYYYMMDD */ yr = (int)(d / 10000); mon = (int)(d / 100 % 100); day = (int)(d % 100); } else { return soap->error = SOAP_TYPE; } //set the date a->setDate(QDate(yr, mon, day)); //grab hrs, mins, secs, and mills int hrs = 0, mins = 0, secs = 0, mills = 0; if (*t == 'T' || ((*t == 't' || *t == ' ') && !(soap->mode & SOAP_XML_STRICT))) { d = soap_strtoul(t + 1, &t, 10); if (*t == ':') { /* Thh:mm:ss */ hrs = d; mins = (int)soap_strtoul(t + 1, &t, 10); secs = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* Thhmmss */ hrs = (int)(d / 10000); mins = (int)(d / 100 % 100); secs = (int)(d % 100); } else { return soap->error = SOAP_TYPE; } } //grab the milliseconds if it's included if (*t == '.') mills = (int)soap_strtoul(t+1, &t, 10); //set the time a->setTime(QTime(hrs, mins, secs, mills)); //grab the timezone and adjust DateTime if (*t == ' ' && !(soap->mode & SOAP_XML_STRICT)) t++; if (*t) { #ifndef WITH_NOZONE if (*t == '+' || *t == '-') { int hrs, mins; mins = (int)soap_strtol(t, &t, 10); if (*t == ':') { /* +hh:mm */ hrs = mins; mins = (int)soap_strtol(t + 1, &t, 10); if (hrs < 0) mins = -mins; } else if (!(soap->mode & SOAP_XML_STRICT)) { /* +hhmm */ hrs = mins / 100; mins = mins % 100; } else { /* +hh */ hrs = mins; mins = 0; } if (*t) return soap->error = SOAP_TYPE; int offsetSeconds = mins*60 + hrs*3600; #if (QT_VERSION >= QT_VERSION_CHECK(5, 2, 0)) && QT_CONFIG(timezone) a->setTimeZone(QTimeZone(offsetSeconds)); #else *a = a->addSecs(offsetSeconds); #endif } else if (*t != 'Z') return soap->error = SOAP_TYPE; #endif } else { /* no UTC or timezone, so assume we got a localtime */ } } return soap->error; } static void * instantiate_xsd__dateTime(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_xsd__dateTime(%d, %s, %s)\n", n, type?type:"", arrayType?arrayType:"")); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_xsd__dateTime, n, delete_xsd__dateTime); (void)type; (void)arrayType; /* appease -Wall -Werror */ if (!cp) return NULL; if (n < 0) { cp->ptr = SOAP_NEW(soap, QDateTime); if (size) *size = sizeof(QDateTime); } else { cp->ptr = SOAP_NEW_ARRAY(soap, QDateTime, n); if (size) *size = n * sizeof(QDateTime); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated location=%p\n", cp->ptr)); if (!cp->ptr) soap->error = SOAP_EOM; return (QDateTime*)cp->ptr; } static int delete_xsd__dateTime(struct soap *soap, struct soap_clist *p) { (void)soap; /* appease -Wall -Werror */ if (p->type == SOAP_TYPE_xsd__dateTime) { if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), QDateTime); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), QDateTime); return SOAP_OK; } return SOAP_ERR; } static void copy_xsd__dateTime(struct soap *soap, int st, int tt, void *p, size_t index, const void *q, void **x) { (void)soap; (void)st; (void)tt; (void)index; (void)x; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying QDateTime %p -> %p\n", q, p)); *(QDateTime*)p = *(QDateTime*)q; } gsoap-2.8.91/gsoap/custom/int128.c0000644000175000017500000001445513525245157016122 0ustar ellertellert/* int128.c Custom serializer for __int128_t_t as xsd:integer (big int). Compile this file and link it with your code. gSOAP XML Web services tools Copyright (C) 2000-2015, 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-2015, 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 -------------------------------------------------------------------------------- */ /* When using soapcpp2 option -q or -p, you need to change "soapH.h" below */ /* include soapH.h generated by soapcpp2 from .h file containing __int128_t types */ #ifdef SOAP_H_FILE /* if set, use the soapcpp2-generated fileH.h file as specified with: cc ... -DSOAP_H_FILE=fileH.h */ # include "stdsoap2.h" # include SOAP_XSTRINGIFY(SOAP_H_FILE) #else # include "soapH.h" /* or manually replace with soapcpp2-generated *H.h file */ #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_xsd__integer(struct soap *soap, __int128_t *a) { (void)soap; *a = 0; } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_xsd__integer(struct soap *soap, const __int128_t *a) { (void)soap; (void)a; } SOAP_FMAC3 int SOAP_FMAC4 soap_s2xsd__integer(struct soap *soap, const char *s, __int128_t *a) { if (s) { if (!*s) return soap->error = SOAP_TYPE; else { __int128_t bigint = 0; /* INT128_MIN = -170141183460469231731687303715884105728 */ __int128_t min128 = -(((__int128_t)UINT64_MAX + 1) * 0x7FFFFFFFFFFFFFFFULL + 0xFFFFFFFFFFFFFFFFULL) - 1; /* INT128_MAX/10 = 17014118346046923173168730371588410572 */ __int128_t max128over10 = ((__int128_t)UINT64_MAX + 1) * 0x0CCCCCCCCCCCCCCCULL + 0xCCCCCCCCCCCCCCCCULL; short len = 0, neg = 0; if (*s == '-') { neg = 1; s++; } else if (*s == '+') s++; while (isdigit(*s) && (len++ < 38 || bigint < max128over10 || (bigint == max128over10 && *s <= '7'))) bigint = 10*bigint + (*s++ - '0'); if (neg && len == 39 && bigint == max128over10 && *s == '8' && !*++s) *a = min128; else if (*s) soap->error = SOAP_TYPE; else if (neg) *a = -bigint; else *a = bigint; } } return soap->error; } SOAP_FMAC3 const char * SOAP_FMAC4 soap_xsd__integer2s(struct soap *soap, __int128_t a) { char *s = soap->tmpbuf; /* INT128_MIN = -170141183460469231731687303715884105728 */ __int128_t min128 = -(((__int128_t)UINT64_MAX + 1) * 0x7FFFFFFFFFFFFFFFULL + 0xFFFFFFFFFFFFFFFFULL) - 1; if (a < 0) { if (a == min128) return "-170141183460469231731687303715884105728"; *s++ = '-'; a = -a; } if (a > UINT64_MAX) { __int128_t l = a / 10000000000000000000ULL; /* leading digits */ uint64_t t = a % 10000000000000000000ULL; /* trailing 19 digits */ if (l > UINT64_MAX) { uint64_t ll = l / 10000000000000000000ULL; uint64_t tl = l % 10000000000000000000ULL; (SOAP_SNPRINTF(s, (s - soap->tmpbuf) + sizeof(soap->tmpbuf), 20), "%" PRIu64, ll); s += strlen(s); (SOAP_SNPRINTF(s, (s - soap->tmpbuf) + sizeof(soap->tmpbuf), 20), "%0.19" PRIu64, tl); } else { (SOAP_SNPRINTF(s, (s - soap->tmpbuf) + sizeof(soap->tmpbuf), 20), "%" PRIu64, (uint64_t)l); } s += strlen(s); (SOAP_SNPRINTF(s, (s - soap->tmpbuf) + sizeof(soap->tmpbuf), 20), "%0.19" PRIu64, t); } else { (SOAP_SNPRINTF(s, sizeof(soap->tmpbuf) - 1, 20), "%" PRIu64, (uint64_t)a); } return soap->tmpbuf; } SOAP_FMAC3 int SOAP_FMAC4 soap_out_xsd__integer(struct soap *soap, const char *tag, int id, const __int128_t *p, const char *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, SOAP_TYPE_xsd__integer), type) || soap_string_out(soap, soap_xsd__integer2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 __int128_t * SOAP_FMAC4 soap_in_xsd__integer(struct soap *soap, const char *tag, __int128_t *a, const char *type) { if (soap_element_begin_in(soap, tag, 0, type)) return NULL; a = (__int128_t*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_xsd__integer, sizeof(__int128_t), NULL, NULL, NULL, NULL); if (!a) return NULL; if (!*soap->href) { int err = soap_s2xsd__integer(soap, soap_value(soap), a); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { a = (__int128_t*)soap_id_forward(soap, soap->href, a, 0, SOAP_TYPE_xsd__integer, 0, sizeof(__int128_t), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return a; } gsoap-2.8.91/gsoap/custom/qstring.h0000644000175000017500000000627013525245157016565 0ustar ellertellert/* qstring.h Custom serializer for Qt's QString type as xsd:string. Requires Qt 4.8 or higher. NOTE: While QStrings can embed '\0' characters, C-strings cannot. This serializer treats the first '\0' character in a QString as the end of the string, and truncates the rest. Use soap context flag SOAP_C_UTFSTRING when initializing your soap struct to enable strings to contain UTF-8 content. This option is recommended. #import this file into your gSOAP .h file. To automate the wsdl2h-mapping of xsd:string to QString, add this line to the typemap.dat file: xsd__string = #import "custom/qstring.h" | xsd__string When using soapcpp2 option -q or -p, you must change qstring.cpp as follows: #include "soapH.h" -> #include "nameH.h" Compile and link your code with custom/qstring.cpp gSOAP XML Web services tools Copyright (C) 2000-2016, 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-2016, 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 extern class QString; extern typedef QString xsd__string; gsoap-2.8.91/gsoap/custom/qbytearray_base64.cpp0000644000175000017500000001463113525245157020760 0ustar ellertellert/* qbytearray_base64.cpp See qbytearray_base64.h for documentation. Compile this file and link it with your code. gSOAP XML Web services tools Copyright (C) 2000-2016, 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-2016, 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 -------------------------------------------------------------------------------- */ /* When using soapcpp2 option -q or -p, you need to change "soapH.h" below */ /* include soapH.h generated by soapcpp2 from .h file containing #import "qbytearray_base64.h" */ #ifdef SOAP_H_FILE /* if set, use the soapcpp2-generated fileH.h file as specified with: cc ... -DSOAP_H_FILE=fileH.h */ # include "stdsoap2.h" # include SOAP_XSTRINGIFY(SOAP_H_FILE) #else # include "soapH.h" /* or manually replace with soapcpp2-generated *H.h file */ #endif static void * instantiate_xsd__base64Binary(struct soap*, int, const char*, const char*, size_t*); static int delete_xsd__base64Binary(struct soap*, struct soap_clist*); static void copy_xsd__base64Binary(struct soap*, int, int, void*, size_t, const void*, void**); void soap_serialize_xsd__base64Binary(struct soap *soap, QByteArray const *a) { (void)soap; (void)a; /* appease -Wall -Werror */ } void soap_default_xsd__base64Binary(struct soap *soap, QByteArray *a) { (void)soap; /* appease -Wall -Werror */ *a = QByteArray(); } int soap_out_xsd__base64Binary(struct soap *soap, char const *tag, int id, QByteArray const *a, char const *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_xsd__base64Binary), type) || soap_string_out(soap, soap_xsd__base64Binary2s(soap, *a), 0)) return soap->error; return soap_element_end_out(soap, tag); } QByteArray *soap_in_xsd__base64Binary(struct soap *soap, char const *tag, QByteArray *a, char const *type) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_att(soap, soap->type, type) && soap_match_att(soap, soap->type, ":base64Binary")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } a = (QByteArray*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_xsd__base64Binary, sizeof(QByteArray), NULL, NULL, instantiate_xsd__base64Binary, NULL); if (*soap->href == '#') { a = (QByteArray*)soap_id_forward(soap, soap->href, a, 0, SOAP_TYPE_xsd__base64Binary, 0, sizeof(QByteArray), 0, copy_xsd__base64Binary, NULL); } else if (a && soap->body) { if (soap_s2xsd__base64Binary(soap, soap_string_in(soap, 0, -1, -1, NULL), a)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return a; } const char * soap_xsd__base64Binary2s(struct soap *soap, QByteArray a) { QByteArray ba = a.toBase64(); size_t n = qstrlen(ba); char *s = (char*)soap_malloc(soap, n + 1); soap_strcpy(s, n + 1, ba.constData()); return s; } int soap_s2xsd__base64Binary(struct soap *soap, const char *s, QByteArray *a) { *a = QByteArray::fromBase64(s); return soap->error; } static void * instantiate_xsd__base64Binary(struct soap *soap, int n, const char *type, const char *arrayType, size_t *size) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_instantiate_xsd__base64Binary(%d, %s, %s)\n", n, type?type:"", arrayType?arrayType:"")); struct soap_clist *cp = soap_link(soap, SOAP_TYPE_xsd__base64Binary, n, delete_xsd__base64Binary); (void)type; (void)arrayType; /* appease -Wall -Werror */ if (!cp) return NULL; if (n < 0) { cp->ptr = SOAP_NEW(soap, QByteArray); if (size) *size = sizeof(QByteArray); } else { cp->ptr = SOAP_NEW_ARRAY(soap, QByteArray, n); if (size) *size = n * sizeof(QByteArray); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Instantiated location=%p\n", cp->ptr)); if (!cp->ptr) soap->error = SOAP_EOM; return (QByteArray*)cp->ptr; } static int delete_xsd__base64Binary(struct soap *soap, struct soap_clist *p) { (void)soap; /* appease -Wall -Werror */ if (p->type == SOAP_TYPE_xsd__base64Binary) { if (p->size < 0) SOAP_DELETE(soap, static_cast(p->ptr), QByteArray); else SOAP_DELETE_ARRAY(soap, static_cast(p->ptr), QByteArray); return SOAP_OK; } return SOAP_ERR; } static void copy_xsd__base64Binary(struct soap *soap, int st, int tt, void *p, size_t index, const void *q, void **x) { (void)soap; (void)st; (void)tt; (void)index; (void)x; /* appease -Wall -Werror */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying QByteArray %p -> %p\n", q, p)); *(QByteArray*)p = *(QByteArray*)q; } gsoap-2.8.91/gsoap/custom/struct_timeval.c0000644000175000017500000001714213525245157020136 0ustar ellertellert/* struct_timeval.c Custom serializer for struct timeval as xsd:dateTime See struct_timeval.h for documentation. Compile this file and link it with your code. gSOAP XML Web services tools Copyright (C) 2000-2015, 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-2015, 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 -------------------------------------------------------------------------------- */ /* When using soapcpp2 option -q or -p, you need to change "soapH.h" below */ /* include soapH.h generated by soapcpp2 from .h file containing struct timeval */ #ifdef SOAP_H_FILE /* if set, use the soapcpp2-generated fileH.h file as specified with: cc ... -DSOAP_H_FILE=fileH.h */ # include "stdsoap2.h" # include SOAP_XSTRINGIFY(SOAP_H_FILE) #else # include "soapH.h" /* or manually replace with soapcpp2-generated *H.h file */ #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_xsd__dateTime(struct soap *soap, struct timeval *a) { (void)soap; memset((void*)a, 0, sizeof(struct timeval)); } SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_xsd__dateTime(struct soap *soap, struct timeval const *a) { (void)soap; (void)a; } SOAP_FMAC3 const char * SOAP_FMAC4 soap_xsd__dateTime2s(struct soap *soap, const struct timeval a) { size_t n; soap_dateTime2s(soap, a.tv_sec); /* assuming result is in tmpbuf! */ n = strlen(soap->tmpbuf); if (soap->tmpbuf[n-1] == 'Z') n--; #ifndef WITH_NOZONE (SOAP_SNPRINTF(soap->tmpbuf + n, sizeof(soap->tmpbuf) - n, 10), ".%.6dZ", a.tv_usec); #else (SOAP_SNPRINTF(soap->tmpbuf + n, sizeof(soap->tmpbuf) - n, 9), ".%.6d", a.tv_usec); #endif return soap->tmpbuf; } SOAP_FMAC3 int SOAP_FMAC4 soap_out_xsd__dateTime(struct soap *soap, const char *tag, int id, const struct timeval *a, const char *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_xsd__dateTime), type) || soap_string_out(soap, soap_xsd__dateTime2s(soap, *a), 0)) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 int SOAP_FMAC4 soap_s2xsd__dateTime(struct soap *soap, const char *s, struct timeval *a) { memset((void*)a, 0, sizeof(struct timeval)); if (s) { char *t; unsigned long d; struct tm T; memset((void*)&T, 0, sizeof(T)); d = soap_strtoul(s, &t, 10); if (*t == '-') { /* YYYY-MM-DD */ T.tm_year = (int)d; T.tm_mon = (int)soap_strtoul(t + 1, &t, 10); T.tm_mday = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* YYYYMMDD */ T.tm_year = (int)(d / 10000); T.tm_mon = (int)(d / 100 % 100); T.tm_mday = (int)(d % 100); } else { return soap->error = SOAP_TYPE; } if (*t == 'T' || ((*t == 't' || *t == ' ') && !(soap->mode & SOAP_XML_STRICT))) { d = soap_strtoul(t + 1, &t, 10); if (*t == ':') { /* Thh:mm:ss */ T.tm_hour = (int)d; T.tm_min = (int)soap_strtoul(t + 1, &t, 10); T.tm_sec = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* Thhmmss */ T.tm_hour = (int)(d / 10000); T.tm_min = (int)(d / 100 % 100); T.tm_sec = (int)(d % 100); } else { return soap->error = SOAP_TYPE; } } if (T.tm_year == 1) T.tm_year = 70; else T.tm_year -= 1900; T.tm_mon--; a->tv_usec = 0; if (*t == '.') { char tmp[32]; int i; float f = 0.0; for (i = 0; i < 31; i++) { tmp[i] = *t++; if (*t < '0' || *t > '9') break; } tmp[i + 1] = '\0'; if (soap_s2float(soap, tmp, &f)) return soap->error; a->tv_usec = (long)(1e6 * f + 0.5); } if (*t == ' ' && !(soap->mode & SOAP_XML_STRICT)) t++; if (*t) { #ifndef WITH_NOZONE if (*t == '+' || *t == '-') { int h, m; m = (int)soap_strtol(t, &t, 10); if (*t == ':') { /* +hh:mm */ h = m; m = (int)soap_strtol(t + 1, &t, 10); if (h < 0) m = -m; } else if (!(soap->mode & SOAP_XML_STRICT)) { /* +hhmm */ h = m / 100; m = m % 100; } else { /* +hh */ h = m; m = 0; } if (*t) return soap->error = SOAP_TYPE; 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_hour--; } T.tm_mday += T.tm_hour / 24; T.tm_hour %= 24; if (T.tm_hour < 0) { T.tm_hour += 24; T.tm_mday--; } /* note: day of the month may be out of range, timegm() handles it */ } else if (*t != 'Z') { return soap->error = SOAP_TYPE; } #endif a->tv_sec = soap_timegm(&T); } else { a->tv_sec = mktime(&T); } } return soap->error; } SOAP_FMAC3 struct timeval * SOAP_FMAC4 soap_in_xsd__dateTime(struct soap *soap, const char *tag, struct timeval *a, const char *type) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_att(soap, soap->type, type) && soap_match_att(soap, soap->type, ":dateTime")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } a = (struct timeval*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_xsd__dateTime, sizeof(struct timeval), NULL, NULL, NULL, NULL); if (*soap->href) a = (struct timeval*)soap_id_forward(soap, soap->href, a, 0, SOAP_TYPE_xsd__dateTime, 0, sizeof(struct timeval), 0, NULL, NULL); else if (a) { if (soap_s2xsd__dateTime(soap, soap_value(soap), a)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return a; } gsoap-2.8.91/gsoap/custom/long_double.c0000644000175000017500000001372513525245157017365 0ustar ellertellert/* long_double.c Custom serializer for the long double (extended double) type as xsd:decimal. Compile this file and link it with your code. gSOAP XML Web services tools Copyright (C) 2000-2015, 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-2015, 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 -------------------------------------------------------------------------------- */ /* When using soapcpp2 option -q or -p, you need to change "soapH.h" below */ /* include soapH.h generated by soapcpp2 from .h file containing long double types */ #ifdef SOAP_H_FILE /* if set, use the soapcpp2-generated fileH.h file as specified with: cc ... -DSOAP_H_FILE=fileH.h */ # include "stdsoap2.h" # include SOAP_XSTRINGIFY(SOAP_H_FILE) #else # include "soapH.h" /* or manually replace with soapcpp2-generated *H.h file */ #endif #include SOAP_FMAC3 int SOAP_FMAC4 soap_s2decimal(struct soap *soap, const char *s, long double *p) { if (s) { if (!*s) return soap->error = SOAP_TYPE; if (!soap_tag_cmp(s, "INF")) *p = (long double)DBL_PINFTY; else if (!soap_tag_cmp(s, "+INF")) *p = (long double)DBL_PINFTY; else if (!soap_tag_cmp(s, "-INF")) *p = (long double)DBL_NINFTY; else if (!soap_tag_cmp(s, "NaN")) *p = (long double)DBL_NAN; else { #if defined(WITH_C_LOCALE) && defined(HAVE_STRTOLD_L) char *r; # ifdef WIN32 *p = _strtold_l(s, &r, SOAP_LOCALE(soap)); # else *p = strtold_l(s, &r, SOAP_LOCALE(soap)); # endif if (*r) #elif defined(HAVE_STRTOLD) char *r; *p = strtold(s, &r); if (*r) #endif #if defined(WITH_C_LOCALE) && defined(HAVE_SSCANF_L) if (sscanf_l(s, SOAP_LOCALE(soap), "%Lf", p) != 1) soap->error = SOAP_TYPE; #elif defined(HAVE_SSCANF) if (sscanf(s, "%Lf", p) != 1) soap->error = SOAP_TYPE; #else soap->error = SOAP_TYPE; #endif } } return soap->error; } SOAP_FMAC3 const char * SOAP_FMAC4 soap_decimal2s(struct soap *soap, long double n) { #if !defined(WITH_C_LOCALE) || !defined(HAVE_SPRINTF_L) char *s; #endif if (soap_isnan(n)) return "NaN"; if (soap_ispinfd(n)) return "INF"; if (soap_isninfd(n)) return "-INF"; #if defined(WITH_C_LOCALE) && defined(HAVE_SPRINTF_L) # ifdef WIN32 if (soap->long_double_format) _sprintf_s_l(soap->tmpbuf, _countof(soap->tmpbuf), soap->long_double_format, SOAP_LOCALE(soap), n); else _sprintf_s_l(soap->tmpbuf, _countof(soap->tmpbuf), "%.*Lg", SOAP_LOCALE(soap), LDBL_DIG, n); # else if (soap->long_double_format) sprintf_l(soap->tmpbuf, SOAP_LOCALE(soap), soap->long_double_format, n); else sprintf_l(soap->tmpbuf, SOAP_LOCALE(soap), "%.*Lg", LDBL_DIG, n); # endif #else if (soap->long_double_format) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), LDBL_DIG + 8), soap->long_double_format, n); else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), LDBL_DIG + 8), "%.*Lg", LDBL_DIG, n); s = strchr(soap->tmpbuf, ','); /* convert decimal comma to DP */ if (s) *s = '.'; #endif return soap->tmpbuf; } SOAP_FMAC3 int SOAP_FMAC4 soap_outdecimal(struct soap *soap, const char *tag, int id, const long 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_decimal2s(soap, *p), 0)) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 long double * SOAP_FMAC4 soap_indecimal(struct soap *soap, const char *tag, long double *p, const char *type, int t) { if (soap_element_begin_in(soap, tag, 0, type)) return NULL; p = (long double*)soap_id_enter(soap, soap->id, p, t, sizeof(long double), NULL, NULL, NULL, NULL); if (!p) return NULL; if (!*soap->href) { int err = soap_s2decimal(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (long double*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(long double), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } gsoap-2.8.91/gsoap/custom/chrono_duration.h0000644000175000017500000000755513525245157020302 0ustar ellertellert/* chrono_duration.h Custom serializer for xsd:duration stored in a std::chrono::nanoseconds object. Requires C++11 or higher (compile with -std=c++11). Can represent 384307168 days (2^63 nanoseconds) forward and backward. Durations that exceed a month are always output in days, rather than months to avoid days-per-month conversion inacurracies. Durations that are received in years and months instead of total number of days from a reference point are not well defined, since there is no accepted reference time point (it may or may not be the current time). The decoder simple assumes that there are 30 days per month. For example, conversion of "P4M" gives 120 days. Therefore, the durations "P4M" and "P120D" are assumed to be identical, which is not necessarily true depending on the reference point in time. Adding std::chrono::nanoseconds values to values of std::chrono::system_clock::time_point is safe. Rescaling of the duration value by may be needed when adding the duration value to a `time_t` value, because `time_t` may or may not have a seconds resolution, depending on the platform and possible changes to `time_t`. #import this file into your gSOAP .h file To automate the wsdl2h-mapping of xsd:duration to std::chrono::nanoseconds, add this line to the typemap.dat file: xsd__duration = #import "custom/chrono_nanoseconds.h" | xsd__duration The typemap.dat file is used by wsdl2h to map types (wsdl2h option -t). When using soapcpp2 option -q or -p, you must change chrono_duration.cpp as follows: #include "soapH.h" -> #include "nameH.h" Compile and link your code with custom/chrono_duration.cpp gSOAP XML Web services tools Copyright (C) 2000-2015, 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-2015, 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 extern typedef class std::chrono::nanoseconds xsd__duration; gsoap-2.8.91/gsoap/custom/duration.c0000644000175000017500000001527113525245157016717 0ustar ellertellert/* duration.c See duration.h for documentation. Compile this file and link it with your code. gSOAP XML Web services tools Copyright (C) 2000-2015, 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-2015, 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 -------------------------------------------------------------------------------- */ /* When using soapcpp2 option -q or -p, you need to change "soapH.h" below */ /* include soapH.h generated by soapcpp2 from .h file containing #import "duration.h" */ #ifdef SOAP_H_FILE /* if set, use the soapcpp2-generated fileH.h file as specified with: cc ... -DSOAP_H_FILE=fileH.h */ # include "stdsoap2.h" # include SOAP_XSTRINGIFY(SOAP_H_FILE) #else # include "soapH.h" /* or manually replace with soapcpp2-generated *H.h file */ #endif SOAP_FMAC3 void SOAP_FMAC4 soap_default_xsd__duration(struct soap *soap, LONG64 *a) { (void)soap; /* appease -Wall -Werror */ *a = 0; } SOAP_FMAC3 const char * SOAP_FMAC4 soap_xsd__duration2s(struct soap *soap, LONG64 a) { LONG64 d; int k, h, m, s, f; if (a < 0) { soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "-P"); k = 2; a = -a; } else { soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "P"); k = 1; } f = a % 1000; a /= 1000; s = a % 60; a /= 60; m = a % 60; a /= 60; h = a % 24; d = a / 24; if (d) (SOAP_SNPRINTF(soap->tmpbuf + k, sizeof(soap->tmpbuf) - k, 21), SOAP_LONG_FORMAT "D", d); if (h || m || s || f) { if (d) k = strlen(soap->tmpbuf); if (f) (SOAP_SNPRINTF(soap->tmpbuf + k, sizeof(soap->tmpbuf) - k, 14), "T%02dH%02dM%02d.%03dS", h, m, s, f); else (SOAP_SNPRINTF(soap->tmpbuf + k, sizeof(soap->tmpbuf) - k, 10), "T%02dH%02dM%02dS", h, m, s); } else if (!d) soap_strcpy(soap->tmpbuf + k, sizeof(soap->tmpbuf) - k, "T0S"); return soap->tmpbuf; } SOAP_FMAC3 int SOAP_FMAC4 soap_out_xsd__duration(struct soap *soap, const char *tag, int id, const LONG64 *a, const char *type) { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_xsd__duration), type) || soap_string_out(soap, soap_xsd__duration2s(soap, *a), 0)) return soap->error; return soap_element_end_out(soap, tag); } SOAP_FMAC3 int SOAP_FMAC4 soap_s2xsd__duration(struct soap *soap, const char *s, LONG64 *a) { LONG64 sign = 1, Y = 0, M = 0, D = 0, H = 0, N = 0, S = 0; float f = 0.0; *a = 0; if (s) { if (*s == '-') { sign = -1; s++; } if (*s != 'P' && *s != 'p') return soap->error = SOAP_TYPE; s++; /* date part */ while (s && *s) { char *r = NULL; LONG64 n; if (*s == 'T' || *s == 't') { s++; break; } n = soap_strtol(s, &r, 10); if (!r) return soap->error = SOAP_TYPE; s = r; switch (*s) { case 'Y': case 'y': Y = n; break; case 'M': case 'm': M = n; break; case 'D': case 'd': D = n; break; default: return soap->error = SOAP_TYPE; } s++; } /* time part */ while (s && *s) { char *r = NULL; LONG64 n; n = soap_strtol(s, &r, 10); if (!r) return soap->error = SOAP_TYPE; s = r; switch (*s) { case 'H': case 'h': H = n; break; case 'M': case 'm': N = n; break; case '.': { char tmp[32]; int i; for (i = 0; i < 31; i++) { tmp[i] = *s++; if (*s < '0' || *s > '9') break; } tmp[i + 1] = '\0'; if (soap_s2float(soap, tmp, &f)) return soap->error; S = n; continue; } case 'S': case 's': S = n; break; default: return soap->error = SOAP_TYPE; } s++; } /* convert Y-M-D H:N:S.f to signed long long int milliseconds */ *a = sign * ((((((((((((Y * 12) + M) * 30) + D) * 24) + H) * 60) + N) * 60) + S) * 1000) + (LONG64)(1000.0 * f + 0.5)); } return soap->error; } SOAP_FMAC3 LONG64 * SOAP_FMAC4 soap_in_xsd__duration(struct soap *soap, const char *tag, LONG64 *a, const char *type) { if (soap_element_begin_in(soap, tag, 0, NULL)) return NULL; if (*soap->type && soap_match_att(soap, soap->type, type) && soap_match_att(soap, soap->type, ":duration")) { soap->error = SOAP_TYPE; soap_revert(soap); return NULL; } a = (LONG64*)soap_id_enter(soap, soap->id, a, SOAP_TYPE_xsd__duration, sizeof(LONG64), NULL, NULL, NULL, NULL); if (*soap->href) a = (LONG64*)soap_id_forward(soap, soap->href, a, 0, SOAP_TYPE_xsd__duration, 0, sizeof(LONG64), 0, NULL, NULL); else if (a) { if (soap_s2xsd__duration(soap, soap_value(soap), a)) return NULL; } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return a; } gsoap-2.8.91/gsoap/custom/qdate.h0000644000175000017500000000601513525245157016171 0ustar ellertellert/* qdate.h Custom serializer for Qt's QDate type as xsd:date. Requires Qt 4.8 or higher. When serializing: If the QDate is invalid, it will be defaulted to 01-01-01. When deserializing: If a timezone is found, it will be checked for validity and then ignored, as QDate's don't handle timezones. #import this file into your gSOAP .h file. To automate the wsdl2h-mapping of xsd:date to QDate, add this line to the typemap.dat file: xsd__date = #import "custom/qdate.h" | xsd__date When using soapcpp2 option -q or -p, you must change qdate.cpp as follows: #include "soapH.h" -> #include "nameH.h" Compile and link your code with custom/qdate.cpp gSOAP XML Web services tools Copyright (C) 2000-2016, 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-2016, 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 extern class QDate; extern typedef QDate xsd__date; gsoap-2.8.91/gsoap/custom/qtime.h0000644000175000017500000000555213525245157016217 0ustar ellertellert/* qtime.h Custom serializer for Qt's QTime type as xsd:time. Requires Qt 4.8 or higher. When serializing: If the QTime is invalid, it will be defaulted to 00:00:00.000. When deserializing: If a timezone is found, the QTime will automatically be converted to UTC. #import this file into your gSOAP .h file. To automate the wsdl2h-mapping of xsd:time to QTime, add this line to the typemap.dat file: xsd__time = #import "custom/qtime.h" | xsd__time When using soapcpp2 option -q or -p, you must change qtime.cpp as follows: #include "soapH.h" -> #include "nameH.h" Compile and link your code with custom/qtime.cpp gSOAP XML Web services tools Copyright (C) 2000-2016, 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-2016, 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 extern class QTime; extern typedef QTime xsd__time; gsoap-2.8.91/gsoap/custom/struct_timeval.h0000644000175000017500000000624213525245157020142 0ustar ellertellert/* struct_timeval.h Custom serializer for struct timeval as xsd:dateTime Because time_t (binds to xsd:dateTime) lacks fractional seconds, struct timeval can be used to represent microseconds since 1970-01-01. #import this file into your gSOAP .h file to enable struct timeval serialization and use the serializable xsd__dateTime type. The struct timeval represents dates since 1970-01-01 with microsecond precision: struct timeval { time_t tv_sec; // seconds since Jan. 1, 1970 suseconds_t tv_usec; // and microseconds }; To automate the wsdl2h-mapping of xsd:dateTime to struct timeval, add this line to the typemap.dat file: xsd__dateTime = #import "custom/struct_timeval.h" | xsd__dateTime The typemap.dat file is used by wsdl2h to map types (wsdl2h option -t). When using soapcpp2 option -q or -p, you must change struct_timeval.c as follows: #include "soapH.h" -> #include "nameH.h" Compiler and link your code with struct_timeval.c gSOAP XML Web services tools Copyright (C) 2000-2007, 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-2007, 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 -------------------------------------------------------------------------------- */ extern typedef struct timeval xsd__dateTime; gsoap-2.8.91/gsoap/Makefile.am0000644000175000017500000000653313525245161015444 0ustar ellertellert## This is the input file for automake, which will generate Makefile.in ## ## not a GNU package. You can remove this line, if ## you have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = subdir-objects foreign 1.4 SUBDIRS = . src wsdl @SAMPLE_DIRS@ CLEANFILES = soapcpp2 wsdl2h stdsoap2_cpp.cpp stdsoap2_ck.c stdsoap2_ck_cpp.cpp stdsoap2_ssl.c stdsoap2_ssl_cpp.cpp dom_cpp.cpp ## *~ *.req.xml *.res.xml *.nsmap *.wsdl *.xsd *Proxy.h \ ## *.o soapH.h soapStub.h soapC.cpp soapC.c soapClient.cpp soapClient.c soapServer.cpp soapServer.c AM_CXXFLAGS = $(SOAPCPP2_DEBUG) -D$(platform) AM_CFLAGS = $(SOAPCPP2_DEBUG) -D$(platform) # Install all soapcpp2 and wsdl2h files into ${prefix}/share/gsoap nobase_pkgdata_DATA = $(top_srcdir)/gsoap/import/* $(top_srcdir)/gsoap/plugin/* $(top_srcdir)/gsoap/WS/* $(top_srcdir)/gsoap/custom/* $(top_srcdir)/gsoap/extras/* ## we cannot build stdsoap2.o from 2 different sources (stdsoap2.cpp and stdsoap2.c), so we need an intermediate target: stdsoap2_ck.c: stdsoap2.cpp $(LN_S) -f $(top_srcdir)/gsoap/stdsoap2.cpp stdsoap2_ck.c stdsoap2_cpp.cpp: stdsoap2.cpp $(LN_S) -f $(top_srcdir)/gsoap/stdsoap2.cpp stdsoap2_cpp.cpp stdsoap2_ck_cpp.cpp: stdsoap2.cpp $(LN_S) -f $(top_srcdir)/gsoap/stdsoap2.cpp stdsoap2_ck_cpp.cpp stdsoap2_ssl.c: stdsoap2.cpp $(LN_S) -f $(top_srcdir)/gsoap/stdsoap2.cpp stdsoap2_ssl.c stdsoap2_ssl_cpp.cpp: stdsoap2.cpp $(LN_S) -f $(top_srcdir)/gsoap/stdsoap2.cpp stdsoap2_ssl_cpp.cpp ## do the same fo dom.cpp since we want to link it into the cpp libs and dom.c into the c libs dom_cpp.cpp: dom.cpp $(LN_S) -f $(top_srcdir)/gsoap/dom.cpp dom_cpp.cpp lib_LIBRARIES = libgsoap.a libgsoap++.a libgsoapck.a libgsoapck++.a libgsoapssl.a libgsoapssl++.a libgsoap_a_SOURCES = stdsoap2.c dom.c libgsoap_a_CFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_NO_C_LOCALE) $(SOAPCPP2_IPV6) $(SOAPCPP2_IPV6_V6ONLY) -D$(platform) libgsoap___a_SOURCES = stdsoap2_cpp.cpp dom_cpp.cpp libgsoap___a_CXXFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_NO_C_LOCALE) $(SOAPCPP2_IPV6) $(SOAPCPP2_IPV6_V6ONLY) -D$(platform) libgsoapck_a_SOURCES = stdsoap2_ck.c dom.c libgsoapck_a_CFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_NO_C_LOCALE) $(SOAPCPP2_IPV6) $(SOAPCPP2_IPV6_V6ONLY) -D$(platform) -DWITH_COOKIES libgsoapck___a_SOURCES = stdsoap2_ck_cpp.cpp dom_cpp.cpp libgsoapck___a_CXXFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_NO_C_LOCALE) $(SOAPCPP2_IPV6) $(SOAPCPP2_IPV6_V6ONLY) -D$(platform) -DWITH_COOKIES libgsoapssl_a_SOURCES = stdsoap2_ssl.c dom.c libgsoapssl_a_CFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_NO_C_LOCALE) $(SOAPCPP2_IPV6) $(SOAPCPP2_IPV6_V6ONLY) -D$(platform) $(WSDL2H_EXTRA_FLAGS) -DWITH_DOM -DWITH_COOKIES libgsoapssl___a_SOURCES = stdsoap2_ssl_cpp.cpp dom_cpp.cpp libgsoapssl___a_CXXFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_NO_C_LOCALE) $(SOAPCPP2_IPV6) $(SOAPCPP2_IPV6_V6ONLY) -D$(platform) $(WSDL2H_EXTRA_FLAGS) -DWITH_DOM -DWITH_COOKIES BUILT_SOURCES = stdsoap2_cpp.cpp dom_cpp.cpp stdsoap2_ck.c stdsoap2_ck_cpp.cpp stdsoap2_ssl.c stdsoap2_ssl_cpp.cpp include_HEADERS = stdsoap2.h install-data-hook: $(LN_S) -f $(top_builddir)/gsoap/src/soapcpp2 $(top_builddir)/gsoap/soapcpp2 || echo "ok, link already exists". $(LN_S) -f $(top_builddir)/gsoap/wsdl/wsdl2h $(top_builddir)/gsoap/wsdl2h || echo "ok, link already exists". gsoap-2.8.91/gsoap/stdsoap2.c0000644000175000017500000233054313525245163015320 0ustar ellertellert/* stdsoap2.c[pp] 2.8.91 gSOAP runtime engine gSOAP XML Web services tools Copyright (C) 2000-2019, 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 addition licensed under the gSOAP public license: - vxWorks compatible, enabled with compiler option -DVXWORKS -------------------------------------------------------------------------------- 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-2019, 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 -------------------------------------------------------------------------------- */ #define GSOAP_LIB_VERSION 20891 #ifdef AS400 # pragma convert(819) /* EBCDIC to ASCII */ #endif #if defined(__gnu_linux__) && !defined(_GNU_SOURCE) # define _GNU_SOURCE 1 #endif #include "stdsoap2.h" #if GSOAP_VERSION != GSOAP_LIB_VERSION # error "GSOAP VERSION MISMATCH IN LIBRARY: PLEASE REINSTALL PACKAGE" #endif #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) # include /* vxWorks compatible */ #endif #ifdef __BORLANDC__ # pragma warn -8060 #else # ifdef WIN32 # ifdef UNDER_CE # pragma comment(lib, "ws2.lib") /* WinCE */ # else # pragma comment(lib, "Ws2_32.lib") # endif # pragma warning(disable : 4996) /* disable deprecation warnings */ # endif #endif #ifdef __cplusplus SOAP_SOURCE_STAMP("@(#) stdsoap2.cpp ver 2.8.91 2019-08-15 00:00:00 GMT") extern "C" { #else SOAP_SOURCE_STAMP("@(#) stdsoap2.c ver 2.8.91 2019-08-15 00:00:00 GMT") #endif /* 8bit character representing unknown character entity or multibyte data */ #ifndef SOAP_UNKNOWN_CHAR # define SOAP_UNKNOWN_CHAR (0x7F) #endif /* unicode character representing unknown characters outside the XML 1.0 UTF8 unicode space */ #ifdef WITH_REPLACE_ILLEGAL_UTF8 # ifndef SOAP_UNKNOWN_UNICODE_CHAR # define SOAP_UNKNOWN_UNICODE_CHAR (0xFFFD) # endif #endif /* EOF=-1 */ #define SOAP_LT (soap_wchar)(-2) /* XML-specific '<' */ #define SOAP_TT (soap_wchar)(-3) /* XML-specific '' */ #define SOAP_QT (soap_wchar)(-5) /* XML-specific '"' */ #define SOAP_AP (soap_wchar)(-6) /* XML-specific ''' */ #define soap_coblank(c) ((c)+1 > 0 && (c) <= 32) #if defined(WIN32) && !defined(UNDER_CE) #define soap_hash_ptr(p) ((size_t)((PtrToUlong(p) >> 3) & (SOAP_PTRHASH - 1))) #else #define soap_hash_ptr(p) ((size_t)(((unsigned long)(p) >> 3) & (SOAP_PTRHASH-1))) #endif #ifdef SOAP_DEBUG static void soap_init_logs(struct soap*); 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 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); static void soap_version(struct soap*); static void soap_free_ns(struct soap*); static soap_wchar soap_char(struct soap*); static soap_wchar soap_getpi(struct soap*); static int soap_isxdigit(int); static void *fplugin(struct soap*, const char*); static ULONG64 soap_count_attachments(struct soap*); static int soap_try_connect_command(struct soap*, int http_command, const char *endpoint, const char *action); static int soap_init_send(struct soap*); #ifdef WITH_NTLM static int soap_ntlm_handshake(struct soap *soap, int command, const char *endpoint, const char *host, int port); #endif #ifndef WITH_NOIDREF static int soap_has_copies(struct soap*, const char*, const char*); static int soap_type_punned(struct soap*, const struct soap_ilist*); static int soap_is_shaky(struct soap*, void*); static void soap_init_iht(struct soap*); static void soap_free_iht(struct soap*); #endif static void soap_init_pht(struct soap*); static void soap_free_pht(struct soap*); #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, short isearly); static void soap_utilize_ns(struct soap *soap, const char *tag, short isearly); static const wchar_t* soap_wstring(struct soap *soap, const char *s, int flag, long minlen, long maxlen, const char *pattern); static wchar_t* soap_wcollapse(struct soap *soap, wchar_t *s, int flag, int insitu); #endif static const char* soap_string(struct soap *soap, const char *s, int flag, long minlen, long maxlen, const char *pattern); static char* soap_collapse(struct soap *soap, char *s, int flag, int insitu); static const char* soap_QName(struct soap *soap, const char *s, long minlen, long maxlen, const char *pattern); #ifndef WITH_LEANER static int soap_begin_attachments(struct soap*); static int soap_end_attachments(struct soap *soap); static struct soap_multipart *soap_alloc_multipart(struct soap*, struct soap_multipart**, struct soap_multipart**, const 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 #ifdef WITH_GZIP static int soap_getgziphdr(struct soap*); #endif #ifdef WITH_OPENSSL # ifndef SOAP_SSL_RSA_BITS # define SOAP_SSL_RSA_BITS 2048 # endif static 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 *); #endif #ifdef WITH_GNUTLS # ifndef SOAP_SSL_RSA_BITS # define SOAP_SSL_RSA_BITS 2048 # endif static int soap_ssl_init_done = 0; static int ssl_auth_init(struct soap*); static const char *ssl_verify(struct soap *soap, const char *host); # if GNUTLS_VERSION_NUMBER < 0x020b00 # if defined(HAVE_PTHREAD_H) # include /* make GNUTLS thread safe with pthreads */ GCRY_THREAD_OPTION_PTHREAD_IMPL; # elif defined(HAVE_PTH_H) #include /* make GNUTLS thread safe with PTH */ GCRY_THREAD_OPTION_PTH_IMPL; # endif # endif #endif #ifdef WITH_SYSTEMSSL static int ssl_auth_init(struct soap*); static int ssl_recv(int sk, void *s, int n, char *user); static int ssl_send(int sk, void *s, int n, char *user); #endif #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) static const char * soap_decode(char*, size_t, const char*, const char*); #endif #ifndef WITH_NOHTTP static soap_wchar soap_getchunkchar(struct soap*); static const char *http_error(struct soap*, int); static int http_get(struct soap*); static int http_put(struct soap*); static int http_patch(struct soap*); static int http_del(struct soap*); static int http_200(struct soap*); static int http_post(struct soap*, const char*, const char*, int, const char*, const char*, ULONG64); 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, ULONG64); static int http_parse(struct soap*); static int http_parse_header(struct soap*, const char*, const char*); #endif #ifndef WITH_NOIO 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*); #if !defined(WITH_IPV6) static int tcp_gethost(struct soap*, const char *addr, struct in_addr *inaddr); #endif #if !defined(WITH_IPV6) || defined(WITH_COOKIES) static int tcp_gethostbyname(struct soap*, const char *addr, struct hostent *hostent, 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_select(struct soap*, SOAP_SOCKET, int, 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*); #define SOAP_TCP_SELECT_RCV 0x1 #define SOAP_TCP_SELECT_SND 0x2 #define SOAP_TCP_SELECT_ERR 0x4 #define SOAP_TCP_SELECT_ALL 0x7 #define SOAP_TCP_SELECT_PIP 0x8 #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(__VMS) #define SOAP_SOCKBLOCK(fd) \ { \ int blocking = 0; \ ioctl(fd, FIONBIO, &blocking); \ } #define SOAP_SOCKNONBLOCK(fd) \ { \ int nonblocking = 1; \ ioctl(fd, FIONBIO, &nonblocking); \ } #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 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"; const union soap_double_nan soap_double_nan = {{0xFFFFFFFF, 0xFFFFFFFF}}; const char soap_base64o[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 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"; #ifndef WITH_LEAN static const char soap_indent[21] = "\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"; /* Alternative indentation form for SOAP_XML_INDENT with spaces instead of tabs: static const char soap_indent[41] = "\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[] = { { 100, "Continue" }, { 101, "Switching Protocols" }, { 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" }, { 422, "Unprocessable Entity" }, { 426, "Upgrade Required" }, { 428, "Precondition Required" }, { 429, "Too Many Requests" }, { 431, "Request Header Fields Too Large" }, { 500, "Internal Server Error" }, { 501, "Not Implemented" }, { 502, "Bad Gateway" }, { 503, "Service Unavailable" }, { 504, "Gateway Time-out" }, { 505, "HTTP Version not supported" }, { 511, "Network Authentication Required" }, { 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(_AIX43) || defined(TRU64) || defined(HP_UX)) && defined(HAVE_GETHOSTBYNAME_R) #ifndef h_errno extern int h_errno; #endif #endif /******************************************************************************/ #ifndef WITH_NOIO static int fsend(struct soap *soap, const char *s, size_t n) { int nwritten, err; SOAP_SOCKET sk; soap->errnum = 0; #if defined(__cplusplus) && !defined(WITH_COMPAT) if (soap->os) { soap->os->write(s, (std::streamsize)n); if (soap->os->good()) return SOAP_OK; return SOAP_EOF; } #endif sk = soap->sendsk; if (!soap_valid_socket(sk)) sk = soap->socket; while (n) { if (soap_valid_socket(sk)) { if (soap->send_timeout) { for (;;) { int r; #ifdef WITH_SELF_PIPE #ifdef WITH_OPENSSL if (soap->ssl) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL | SOAP_TCP_SELECT_PIP, soap->send_timeout); else #endif #ifdef WITH_GNUTLS if (soap->session) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL | SOAP_TCP_SELECT_PIP, soap->send_timeout); else #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL | SOAP_TCP_SELECT_PIP, soap->send_timeout); else #endif r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR | SOAP_TCP_SELECT_PIP, soap->send_timeout); if ((r & SOAP_TCP_SELECT_PIP)) /* abort if data is pending on pipe */ { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connection closed by self pipe\n")); return SOAP_EOF; } #else #ifdef WITH_OPENSSL if (soap->ssl) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL, soap->send_timeout); else #endif #ifdef WITH_GNUTLS if (soap->session) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL, soap->send_timeout); else #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL, soap->send_timeout); else #endif r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->send_timeout); #endif if (r > 0) break; if (!r) return SOAP_EOF; err = soap->errnum; if (!err) return soap->error; if (err != SOAP_EAGAIN && err != SOAP_EWOULDBLOCK) return SOAP_EOF; } } #ifndef WITH_LEAN if (soap->transfer_timeout) { time_t now = time(NULL); if ((soap->transfer_timeout > 0 && difftime(now, (time_t)soap->start) > (double)soap->transfer_timeout) || (soap->transfer_timeout < 0 && difftime(now, (time_t)soap->start) > -1000000.0 * (double)soap->transfer_timeout)) 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 #ifdef WITH_GNUTLS if (soap->session) nwritten = gnutls_record_send(soap->session, s, n); else #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) { err = gsk_secure_socket_write(soap->ssl, (char*)s, n, &nwritten); if (err != GSK_OK) nwritten = 0; } else #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) { if (soap->peerlen) nwritten = sendto(sk, (char*)s, (SOAP_WINSOCKINT)n, soap->socket_flags, &soap->peer.addr, (SOAP_WINSOCKINT)soap->peerlen); else nwritten = send(sk, 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) { int udp_repeat; int udp_delay; if ((soap->connect_flags & SO_BROADCAST)) udp_repeat = 2; /* SOAP-over-UDP MULTICAST_UDP_REPEAT - 1 */ else udp_repeat = 1; /* SOAP-over-UDP UNICAST_UDP_REPEAT - 1 */ udp_delay = ((unsigned int)soap_random % 201) + 50; /* UDP_MIN_DELAY .. UDP_MAX_DELAY */ do { tcp_select(soap, sk, SOAP_TCP_SELECT_ERR, -1000 * udp_delay); if (soap->peerlen) nwritten = sendto(sk, (char*)s, (SOAP_WINSOCKINT)n, soap->socket_flags, &soap->peer.addr, (SOAP_WINSOCKINT)soap->peerlen); else nwritten = send(sk, 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); } if (nwritten < 0) { err = soap_socket_errno(sk); if (err && err != SOAP_EINTR) { soap->errnum = err; return SOAP_EOF; } nwritten = 0; /* and call write() again */ } } else #endif #if !defined(AS400) nwritten = send(sk, s, (int)n, soap->socket_flags); #else nwritten = send(sk, (void*)s, n, soap->socket_flags); #endif if (nwritten <= 0) { int r = 0; err = soap_socket_errno(sk); #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 #ifdef WITH_GNUTLS if (soap->session) { if (nwritten == GNUTLS_E_INTERRUPTED) err = SOAP_EINTR; else if (nwritten == GNUTLS_E_AGAIN) err = SOAP_EAGAIN; } #endif if (err == SOAP_EWOULDBLOCK || err == SOAP_EAGAIN) { #if defined(WITH_OPENSSL) if (soap->ssl && r == SSL_ERROR_WANT_READ) r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); else #elif defined(WITH_GNUTLS) if (soap->session && !gnutls_record_get_direction(soap->session)) r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); else #endif r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); if (!r && soap->send_timeout) return SOAP_EOF; if (r < 0) return SOAP_EOF; } 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 WMW_RPM_IO /* vxWorks compatible */ if (soap->rpmreqid) nwritten = (httpBlockPut(soap->rpmreqid, (char*)s, n) == 0) ? n : -1; else #endif #ifdef WIN32 nwritten = _write(soap->sendfd, s, (unsigned int)n); #else nwritten = write(soap->sendfd, s, (unsigned int)n); #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 /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_send_raw(struct soap *soap, const char *s, size_t n) { if (!s || !n) return SOAP_OK; #ifndef WITH_LEANER if (soap->fpreparesend && (soap->mode & SOAP_IO) != SOAP_IO_STORE && (soap->mode & SOAP_IO_LENGTH) && (soap->error = soap->fpreparesend(soap, s, n)) != SOAP_OK) return soap->error; if (soap->ffiltersend && (soap->error = soap->ffiltersend(soap, &s, &n)) != SOAP_OK) return soap->error; #endif if ((soap->mode & SOAP_IO_LENGTH)) { soap->count += n; } else if ((soap->mode & SOAP_IO)) { size_t i = sizeof(soap->buf) - soap->bufidx; while (n >= i) { (void)soap_memcpy((void*)(soap->buf + soap->bufidx), i, (const void*)s, i); soap->bufidx = sizeof(soap->buf); if (soap_flush(soap)) return soap->error; s += i; n -= i; i = sizeof(soap->buf); } (void)soap_memcpy((void*)(soap->buf + soap->bufidx), sizeof(soap->buf) - soap->bufidx, (const void*)s, n); soap->bufidx += n; } else { return soap_flush_raw(soap, s, n); } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_flush(struct soap *soap) { size_t n = soap->bufidx; if (!n) return soap->error = soap->fsend(soap, SOAP_STR_EOS, 0); /* force a zero send for HTTP GET and DELETE */ #ifndef WITH_LEANER if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) { int r; if (soap->fpreparesend && (r = soap->fpreparesend(soap, soap->buf, n)) != SOAP_OK) return soap->error = r; } #endif soap->bufidx = 0; #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && soap->d_stream) { 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, sizeof(soap->buf))) return soap->error; soap->d_stream->next_out = (Byte*)soap->z_buf; soap->d_stream->avail_out = sizeof(soap->buf); } } while (soap->d_stream->avail_in); return SOAP_OK; } #endif return soap_flush_raw(soap, soap->buf, n); } /******************************************************************************/ 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) { void *t; t = soap_push_block(soap, NULL, n); if (!t) return soap->error = SOAP_EOM; (void)soap_memcpy(t, n, (const void*)s, n); return SOAP_OK; } #ifndef WITH_LEANER if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { char t[24]; (SOAP_SNPRINTF(t, sizeof(t), 20), &"\r\n%lX\r\n"[soap->chunksize ? 0 : 2], (unsigned long)n); DBGMSG(SENT, t, strlen(t)); soap->error = soap->fsend(soap, t, strlen(t)); if (soap->error) return soap->error; soap->chunksize += n; } DBGMSG(SENT, s, n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Send %u bytes to socket=%d/fd=%d\n", (unsigned int)n, (int)soap->socket, soap->sendfd)); #endif return soap->error = soap->fsend(soap, s, n); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_send(struct soap *soap, const char *s) { if (!s) return SOAP_OK; return soap_send_raw(soap, s, strlen(s)); } /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_query_send_key(struct soap *soap, const char *s) { if (!s) return SOAP_OK; if (!soap->body && soap_send_raw(soap, "&", 1)) return soap->error; soap->body = 0; (void)soap_encode_url(s, soap->msgbuf, (int)sizeof(soap->msgbuf)); /* msgbuf length is max SOAP_TMPLEN or just 1024 bytes */ return soap_send(soap, soap->msgbuf); } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_query_send_val(struct soap *soap, const char *s) { if (!s) return SOAP_OK; if (soap_send_raw(soap, "=", 1)) return soap->error; (void)soap_encode_url(s, soap->msgbuf, (int)sizeof(soap->msgbuf)); /* msgbuf length is max SOAP_TMPLEN or just 1024 bytes */ return soap_send(soap, soap->msgbuf); } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 char * SOAP_FMAC2 soap_query(struct soap *soap) { return strchr(soap->path, '?'); } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 char * SOAP_FMAC2 soap_query_key(struct soap *soap, char **s) { char *t = *s; (void)soap; if (t && *t) { *s = (char*)soap_query_decode(t, strlen(t), t + 1); return t; } return *s = NULL; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 char * SOAP_FMAC2 soap_query_val(struct soap *soap, char **s) { char *t = *s; (void)soap; if (t && *t == '=') { *s = (char*)soap_query_decode(t, strlen(t), t + 1); return t; } return NULL; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 const char * SOAP_FMAC2 soap_query_decode(char *buf, size_t len, const char *val) { const char *s; char *t; for (s = val; *s; s++) if (*s != ' ' && *s != '=') break; if (*s == '"') { t = buf; s++; while (*s && *s != '"' && --len) *t++ = *s++; *t = '\0'; do s++; while (*s && *s != '&' && *s != '='); } else { t = buf; while (*s && *s != '&' && *s != '=' && --len) { switch (*s) { case '+': *t++ = ' '; s++; break; case '\t': case '\n': case '\r': case ' ': s++; break; case '%': *t++ = ((s[1] >= 'A' ? (s[1]&0x7) + 9 : s[1] - '0') << 4) + (s[2] >= 'A' ? (s[2]&0x7) + 9 : s[2] - '0'); s += 3; break; default: *t++ = *s++; } } *t = '\0'; } return s; } #endif /******************************************************************************/ #ifndef WITH_NOIO static size_t frecv(struct soap *soap, char *s, size_t n) { int r; int retries = 100; /* max 100 retries with non-blocking sockets */ SOAP_SOCKET sk; soap->errnum = 0; #if defined(__cplusplus) && !defined(WITH_COMPAT) if (soap->is) /* recv from C++ stream */ { if (soap->is->good()) return (size_t)soap->is->read(s, (std::streamsize)n).gcount(); /* downcast to std::streamsize is OK: gcount() returns how much we got in s[] */ return 0; } #else if (soap->is) /* recv from C buffer until NUL */ { size_t l = strlen(soap->is); if (l > n) l = n; (void)soap_memcpy((void*)s, n, soap->is, l); soap->is += l; return l; } #endif sk = soap->recvsk; if (!soap_valid_socket(sk)) sk = soap->socket; if (soap_valid_socket(sk)) { for (;;) { #if defined(WITH_OPENSSL) || defined(WITH_SYSTEMSSL) int err = 0; #endif #ifdef WITH_OPENSSL if (soap->recv_timeout && !soap->ssl) /* OpenSSL: sockets are nonblocking so go ahead to read */ #else if (soap->recv_timeout) #endif { for (;;) { #ifdef WITH_SELF_PIPE r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR | SOAP_TCP_SELECT_PIP, soap->recv_timeout); if ((r & SOAP_TCP_SELECT_PIP)) /* abort if data is pending on pipe */ { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connection closed by self pipe\n")); return 0; } #else r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->recv_timeout); #endif if (r > 0) break; if (!r) return 0; r = soap->errnum; if (r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) return 0; } } #ifndef WITH_LEAN if (soap->transfer_timeout) { time_t now = time(NULL); if ((soap->transfer_timeout > 0 && difftime(now, (time_t)soap->start) > (double)soap->transfer_timeout) || (soap->transfer_timeout < 0 && difftime(now, (time_t)soap->start) > -1000000.0 * (double)soap->transfer_timeout)) 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 #ifdef WITH_GNUTLS if (soap->session) { r = (int)gnutls_record_recv(soap->session, s, n); if (r >= 0) return (size_t)r; } else #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) { err = gsk_secure_socket_read(soap->ssl, s, n, &r); if (err == GSK_OK && r > 0) return (size_t)r; if (err != GSK_OK && err != GSK_WOULD_BLOCK && err != GSK_WOULD_BLOCK_WRITE) 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(sk, s, (SOAP_WINSOCKINT)n, soap->socket_flags, &soap->peer.addr, &k); /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h, SOAP_WINSOCKINT cast is safe due to limited range of n in the engine (64K) */ soap->peerlen = (size_t)k; #ifdef WITH_IPV6 soap->ip = 0; soap->ip6[0] = 0; soap->ip6[1] = 0; soap->ip6[2] = 0; soap->ip6[3] = 0; #else soap->ip = ntohl(soap->peer.in.sin_addr.s_addr); soap->ip6[0] = 0; soap->ip6[1] = 0; soap->ip6[2] = 0xFFFF; soap->ip6[3] = soap->ip; #endif } else #endif r = recv(sk, s, (SOAP_WINSOCKINT)n, soap->socket_flags); /* SOAP_WINSOCKINT cast is safe due to limited range of n in the engine (64K) */ if (r >= 0) return (size_t)r; r = soap_socket_errno(sk); if (r != SOAP_EINTR && r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) { soap->errnum = r; return 0; } } #if defined(WITH_OPENSSL) if (soap->ssl && err == SSL_ERROR_WANT_WRITE) r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); else #elif defined(WITH_GNUTLS) if (soap->session && gnutls_record_get_direction(soap->session)) r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); else #elif defined(WITH_SYSTEMSSL) if (soap->ssl && err == GSK_WOULD_BLOCK_WRITE) r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); else #endif r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); if (!r && soap->recv_timeout) return 0; if (r < 0) { r = soap->errnum; if (r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) return 0; } if (retries-- <= 0) return 0; } } #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, n); #endif if (r >= 0) return (size_t)r; soap->errnum = soap_errno; return 0; #endif #endif } #endif /******************************************************************************/ #ifndef WITH_NOHTTP 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, sizeof(soap->buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket=%d/fd=%d\n", (unsigned int)soap->buflen, (int)soap->socket, soap->recvfd)); DBGMSG(RECV, soap->buf, soap->buflen); if (soap->buflen) return soap->buf[soap->bufidx++]; return EOF; } #endif /******************************************************************************/ static int soap_isxdigit(int c) { return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_recv_raw(struct soap *soap) { size_t ret; #if !defined(WITH_LEANER) || defined(WITH_ZLIB) int r; #endif #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && soap->d_stream) { if (soap->d_stream->next_out == Z_NULL) { soap->bufidx = soap->buflen = 0; return EOF; } if (soap->d_stream->avail_in || !soap->d_stream->avail_out) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflating\n")); soap->d_stream->next_out = (Byte*)soap->buf; soap->d_stream->avail_out = sizeof(soap->buf); r = inflate(soap->d_stream, Z_NO_FLUSH); if (r == Z_NEED_DICT && soap->z_dict) r = inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len); if (r == Z_OK || r == Z_STREAM_END) { soap->bufidx = 0; ret = soap->buflen = sizeof(soap->buf) - 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->d_stream->next_out = Z_NULL; } if (ret) { if (soap->count + ret < soap->count) return soap->error = SOAP_EOF; soap->count += ret; if (soap->recv_maxlength && soap->count > soap->recv_maxlength) return soap->error = SOAP_EOF; soap->z_ratio_in = (float)soap->d_stream->total_in / (float)soap->d_stream->total_out; if (soap->count > SOAP_MAXINFLATESIZE && soap->z_ratio_in < SOAP_MINDEFLATERATIO) { soap->d_stream->msg = (char*)"caught SOAP_MINDEFLATERATIO explosive decompression guard (remedy: increase SOAP_MAXINFLATESIZE and/or decrease SOAP_MINDEFLATERATIO)"; return soap->error = SOAP_ZLIB_ERROR; } DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- decompressed ----\n")); DBGMSG(RECV, soap->buf, ret); DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n----\n")); #ifndef WITH_LEANER if (soap->fpreparerecv && (r = soap->fpreparerecv(soap, soap->buf, ret)) != SOAP_OK) return soap->error = r; #endif 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; return soap->error = SOAP_ZLIB_ERROR; } } zlib_again: if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK && !soap->chunksize) { (void)soap_memcpy((void*)soap->buf, sizeof(soap->buf), (const void*)soap->z_buf, sizeof(soap->buf)); 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 (;;) { soap_wchar c; char *t, tmp[17]; if (soap->chunksize) { soap->buflen = ret = soap->frecv(soap, soap->buf, soap->chunksize > sizeof(soap->buf) ? sizeof(soap->buf) : soap->chunksize); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk: read %u bytes\n", (unsigned int)ret)); DBGMSG(RECV, soap->buf, ret); soap->bufidx = 0; if (!ret) { soap->ahead = EOF; return EOF; } soap->chunksize -= ret; break; } if (!soap->chunkbuflen) { soap->chunkbuflen = ret = soap->frecv(soap, soap->buf, sizeof(soap->buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes (chunked) from socket=%d\n", (unsigned int)ret, (int)soap->socket)); DBGMSG(RECV, soap->buf, ret); soap->bufidx = 0; if (!ret) { soap->ahead = EOF; return 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) { soap->ahead = EOF; return EOF; } } t = tmp; do { *t++ = (char)c; } while (soap_isxdigit((int)(c = soap_getchunkchar(soap))) && (size_t)(t - tmp) < sizeof(tmp)-1); while ((int)c != EOF && c != '\n') c = soap_getchunkchar(soap); if ((int)c == EOF) { soap->ahead = EOF; return EOF; } *t = '\0'; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunk size = %s (hex)\n", tmp)); soap->chunksize = (size_t)soap_strtoul(tmp, &t, 16); if (!soap->chunksize) { soap->bufidx = soap->buflen = soap->chunkbuflen = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of chunked message\n")); 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, sizeof(soap->buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket=%d/fd=%d\n", (unsigned int)ret, (int)soap->socket, soap->recvfd)); DBGMSG(RECV, soap->buf, ret); } #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB)) { (void)soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)soap->buf, sizeof(soap->buf)); 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 = sizeof(soap->buf); r = inflate(soap->d_stream, Z_NO_FLUSH); if (r == Z_NEED_DICT && soap->z_dict) r = inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len); if (r == Z_OK || r == Z_STREAM_END) { soap->bufidx = 0; soap->z_buflen = soap->buflen; soap->buflen = sizeof(soap->buf) - 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 && r != Z_STREAM_END) 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->d_stream->next_out = Z_NULL; } soap->z_ratio_in = (float)soap->d_stream->total_in / (float)soap->d_stream->total_out; if (soap->count + ret > SOAP_MAXINFLATESIZE && soap->z_ratio_in < SOAP_MINDEFLATERATIO) { soap->d_stream->msg = (char*)"caught SOAP_MINDEFLATERATIO explosive decompression guard (remedy: increase SOAP_MAXINFLATESIZE and/or decrease SOAP_MINDEFLATERATIO)"; return soap->error = SOAP_ZLIB_ERROR; } DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- decompressed ----\n")); DBGMSG(RECV, soap->buf, ret); #ifndef WITH_LEANER if (soap->fpreparerecv && (r = soap->fpreparerecv(soap, soap->buf, ret)) != SOAP_OK) return soap->error = r; #endif } 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; return soap->error = SOAP_ZLIB_ERROR; } } #endif #ifndef WITH_LEANER if (soap->fpreparerecv #ifdef WITH_ZLIB && soap->zlib_in == SOAP_ZLIB_NONE #endif && (r = soap->fpreparerecv(soap, soap->buf + soap->bufidx, ret))) return soap->error = r; #endif if (ret) { if (soap->count + ret < soap->count) return EOF; soap->count += ret; if (soap->recv_maxlength && soap->count > soap->recv_maxlength) return EOF; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read count=" SOAP_ULONG_FORMAT " (+%lu)\n", soap->count, (unsigned long)ret)); return SOAP_OK; } return EOF; } /******************************************************************************/ 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 SOAP in DIME is in buffer\n")); soap->buflen = soap->dime.buflen; soap->dime.buflen = 0; soap->dime.chunksize = 0; 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; } if (!(soap->dime.flags & SOAP_DIME_CF)) return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME hdr for next SOAP in DIME 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; } if ((tmp[0] & 0xF8) != SOAP_DIME_VERSION) return soap->error = SOAP_DIME_MISMATCH; soap->dime.flags = (tmp[0] & 0x7) | (tmp[1] & 0xF0); 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 SOAP in DIME chunk (%u bytes)\n", (unsigned int)soap->dime.size)); soap->dime.chunksize = soap->dime.size; if (soap->buflen - soap->bufidx >= soap->dime.size) { if ((soap->dime.flags & SOAP_DIME_ME)) { soap->mode &= ~SOAP_ENC_DIME; } else { soap->dime.buflen = soap->buflen; soap->buflen = soap->bufidx + soap->dime.chunksize; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked SOAP in DIME (%u bytes buffered)\n", (unsigned int)soap->buflen)); } } else { soap->dime.chunksize -= soap->buflen - soap->bufidx; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked SOAP in DIME (%u bytes in chunk left)\n", (unsigned int)soap->dime.chunksize)); } return SOAP_OK; } if (soap->dime.chunksize) { if (soap_recv_raw(soap)) return EOF; if (soap->buflen - soap->bufidx >= soap->dime.chunksize) { if ((soap->dime.flags & SOAP_DIME_ME)) { soap->dime.chunksize = 0; soap->mode &= ~SOAP_ENC_DIME; } else { soap->dime.buflen = soap->buflen; soap->buflen = soap->bufidx + soap->dime.chunksize; soap->dime.chunksize = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked SOAP in DIME (%u bytes buffered)\n", (unsigned int)soap->buflen)); } } else { soap->dime.chunksize -= soap->buflen - soap->bufidx; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked SOAP in DIME (%u bytes in chunk left)\n", (unsigned int)soap->dime.chunksize)); } return SOAP_OK; } } if (soap->ffilterrecv) { int err; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Filter recverror = %d bufidx = %lu buflen = %lu\n", soap->recverror, (unsigned long)soap->bufidx, (unsigned long)soap->buflen)); if (soap->recverror) { soap->bufidx = soap->buflen = 0; } else { soap->bufidx = soap->buflen = 0; err = soap->ffilterrecv(soap, soap->buf, &soap->buflen, sizeof(soap->buf)); if (err) { if (err == SOAP_EOF) return SOAP_EOF; return soap->error = err; } if (soap->buflen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Filtered output continued %lu bytes\n", (unsigned long)soap->buflen)); return SOAP_OK; } soap->recverror = soap_recv_raw(soap); soap->buflen -= soap->bufidx; /* chunked may set bufidx > 0 to skip hex chunk length */ } while (soap->ffilterrecv) { err = soap->ffilterrecv(soap, soap->buf + soap->bufidx, &soap->buflen, sizeof(soap->buf) - soap->bufidx); if (err) { if (err == SOAP_EOF) return SOAP_EOF; return soap->error = err; } if (soap->buflen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Filtered output %lu bytes\n", (unsigned long)soap->buflen)); soap->buflen += soap->bufidx; return SOAP_OK; } if (soap->recverror) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Returning postponed error %d\n", soap->recverror)); return soap->recverror; } soap->recverror = soap_recv_raw(soap); soap->buflen -= soap->bufidx; /* chunked may set bufidx > 0 to skip hex chunk length */ } } return soap->recverror = soap_recv_raw(soap); #else return soap_recv_raw(soap); #endif } /******************************************************************************/ SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getchar(struct soap *soap) { soap_wchar c; c = soap->ahead; if (c) { if ((int)c != EOF) soap->ahead = 0; return c; } return soap_get1(soap); } /******************************************************************************/ 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; } /******************************************************************************/ SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_code_int(const struct soap_code_map *code_map, const char *str, LONG64 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; } /******************************************************************************/ 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; } /******************************************************************************/ SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_code_bits(const struct soap_code_map *code_map, const char *str) { LONG64 bits = 0; if (code_map) { while (str && *str) { const struct soap_code_map *p; for (p = code_map; p->string; p++) { size_t n = strlen(p->string); if (!strncmp(p->string, str, n) && soap_coblank((soap_wchar)str[n])) { bits |= p->code; str += n; while (*str > 0 && *str <= 32) str++; break; } } if (!p->string) return 0; } } return bits; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_list(struct soap *soap, const struct soap_code_map *code_map, long code) { char *t = soap->tmpbuf; if (code_map) { while (code_map->string) { if ((code_map->code & code)) { 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; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_binary_search_string(const char **a, int n, const char *s) { int min = 0, max = n-1; while (min <= max) { int mid = (min+max)/2; int r = strcmp(s, a[mid]); if (r < 0) max = mid - 1; else if (r > 0) min = mid + 1; else return mid; } return -1; } /******************************************************************************/ static soap_wchar soap_char(struct soap *soap) { char tmp[8]; int i; soap_wchar c; char *s = tmp; for (i = 0; i < (int)sizeof(tmp)-1; 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_wchar)soap_strtol(tmp + 2, NULL, 16); return (soap_wchar)soap_strtol(tmp + 1, NULL, 10); } 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, (LONG64)SOAP_UNKNOWN_CHAR); #else return SOAP_UNKNOWN_CHAR; /* use this to represent unknown code */ #endif } /******************************************************************************/ #ifdef WITH_LEAN 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 /******************************************************************************/ #ifdef WITH_LEAN 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 /******************************************************************************/ SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_get(struct soap *soap) { 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; c = 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_coblank(c)); if (c == '!' || c == '?' || c == '%') { 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_getpi(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; } /******************************************************************************/ static soap_wchar soap_getpi(struct soap *soap) { char buf[64]; char *s = buf; size_t i = sizeof(buf); soap_wchar c; while ((int)(c = soap_getchar(soap)) != EOF && c != '?') { if (i > 1) { if (soap_coblank(c)) c = ' '; *s++ = (char)c; i--; } } *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; } /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_move(struct soap *soap, ULONG64 n) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving " SOAP_ULONG_FORMAT " bytes forward\n", n)); for (; n; n--) if ((int)soap_getchar(soap) == EOF) return SOAP_EOF; return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 ULONG64 SOAP_FMAC2 soap_tell(struct soap *soap) { return soap->count - soap->buflen + soap->bufidx - (soap->ahead != 0); } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_pututf8(struct soap *soap, unsigned long c) { char tmp[24]; if ((c < 0x7F && c > 0x1F)) { *tmp = (char)c; return soap_send_raw(soap, tmp, 1); } #ifdef WITH_REPLACE_ILLEGAL_UTF8 if (!(c == 0x09 || c == 0x0A || c == 0x0D || (c >= 0x80 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD) || (c >= 0x10000 && c <= 0x10FFFF))) c = SOAP_UNKNOWN_UNICODE_CHAR; #endif #ifndef WITH_LEAN if (c > 0x9F) { 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 #endif (SOAP_SNPRINTF(tmp, sizeof(tmp), 20), "&#x%lX;", c); return soap_send(soap, tmp); } /******************************************************************************/ SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getutf8(struct soap *soap) { #ifdef WITH_REPLACE_ILLEGAL_UTF8 soap_wchar c, c1, c2, c3; #else soap_wchar c, c1, c2, c3, c4; #endif c = soap->ahead; if (c >= 0x80) soap->ahead = 0; else c = (soap_wchar)soap_get(soap); if (c < 0x80 || c > 0xFF || (soap->mode & SOAP_ENC_LATIN)) return c; #ifdef WITH_REPLACE_ILLEGAL_UTF8 c1 = (soap_wchar)soap_get1(soap); if (c <= 0xC1 || (c1 & 0xC0) != 0x80) { soap_revget1(soap); return SOAP_UNKNOWN_UNICODE_CHAR; } c1 &= 0x3F; if (c < 0xE0) return (((c & 0x1F) << 6) | c1); c2 = (soap_wchar)soap_get1(soap); if ((c == 0xE0 && c1 < 0x20) || (c2 & 0xC0) != 0x80) { soap_revget1(soap); return SOAP_UNKNOWN_UNICODE_CHAR; } c2 &= 0x3F; if (c < 0xF0) return (((c & 0x0F) << 12) | (c1 << 6) | c2); c3 = (soap_wchar)soap_get1(soap); if ((c == 0xF0 && c1 < 0x10) || (c == 0xF4 && c1 >= 0x10) || c >= 0xF5 || (c3 & 0xC0) != 0x80) { soap_revget1(soap); return SOAP_UNKNOWN_UNICODE_CHAR; } return (((c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | (c3 & 0x3F)); #else c1 = (soap_wchar)soap_get1(soap); if (c < 0xC0 || (c1 & 0xC0) != 0x80) { soap_revget1(soap); /* doesn't look like this is UTF-8, try continue as if ISO-8859-1 */ return c; } c1 &= 0x3F; if (c < 0xE0) return ((soap_wchar)(c & 0x1F) << 6) | c1; c2 = (soap_wchar)soap_get1(soap) & 0x3F; 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 } /******************************************************************************/ SOAP_FMAC1 size_t SOAP_FMAC2 soap_utf8len(const char *s) { size_t l = 0; while (*s) if ((*s++ & 0xC0) != 0x80) l++; return l; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_puthex(struct soap *soap, const unsigned char *s, int n) { char d[2 * SOAP_BINARY_BUFLEN], *p = d; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_s2hex(soap, s, NULL, n); if (!soap->dom->text) return soap->error; return SOAP_OK; } #endif for (; n > 0; n--) { int m = *s++; p[0] = (char)((m >> 4) + (m > 159 ? '7' : '0')); m &= 0x0F; p[1] = (char)(m + (m > 9 ? '7' : '0')); p += 2; if (p - d == sizeof(d)) { if (soap_send_raw(soap, d, sizeof(d))) return soap->error; p = d; } } if (p != d && soap_send_raw(soap, d, p - d)) return soap->error; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_gethex(struct soap *soap, int *n) { size_t l = 0; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_string_in(soap, 0, -1, -1, NULL); return (unsigned char*)soap_hex2s(soap, soap->dom->text, NULL, 0, n); } #endif #ifdef WITH_FAST soap->labidx = 0; for (;;) { char *s; 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++) { char d1, d2; 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 = NULL; l = soap->lablen + i - k; soap_unget(soap, c); if (n) *n = (int)l; if (soap->maxlength > 0 && l > (size_t)soap->maxlength) { soap->error = SOAP_LENGTH; } else { p = (unsigned char*)soap_malloc(soap, l); if (p) (void)soap_memcpy((void*)p, l, (const void*)soap->labbuf, l); } return p; } *s++ = (char)(((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0')); } l = soap->lablen; if (soap->maxlength > 0 && l > (size_t)soap->maxlength) { soap->error = SOAP_LENGTH; return NULL; } } #else if (soap_alloc_block(soap) == NULL) return NULL; for (;;) { int i; 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++) { char d1, d2; 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 (soap->maxlength > 0 && l > (size_t)soap->maxlength) { soap->error = SOAP_LENGTH; soap_end_block(soap, NULL); return NULL; } if (n) *n = (int)soap_size_block(soap, NULL, i); p = (unsigned char*)soap_save_block(soap, NULL, NULL, 0); return p; } *s++ = ((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0'); l++; } if (soap->maxlength > 0 && l > (size_t)soap->maxlength) { soap->error = SOAP_LENGTH; soap_end_block(soap, NULL); return NULL; } } #endif } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_putbase64(struct soap *soap, const unsigned char *s, int n) { char d[4 * SOAP_BINARY_BUFLEN], *p = d; if (!s) return SOAP_OK; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_s2base64(soap, s, NULL, n); if (!soap->dom->text) return soap->error; return SOAP_OK; } #endif for (; n > 2; n -= 3, s += 3) { p[0] = soap_base64o[(s[0] & 0xFC) >> 2]; p[1] = soap_base64o[((s[0] & 0x03) << 4) | ((s[1] & 0xF0) >> 4)]; p[2] = soap_base64o[((s[1] & 0x0F) << 2) | ((s[2] & 0xC0) >> 6)]; p[3] = soap_base64o[s[2] & 0x3F]; p += 4; if (p - d == sizeof(d)) { if (soap_send_raw(soap, d, sizeof(d))) return soap->error; p = d; } } if (n == 2) { p[0] = soap_base64o[(s[0] & 0xFC) >> 2]; p[1] = soap_base64o[((s[0] & 0x03) << 4) | ((s[1] & 0xF0) >> 4)]; p[2] = soap_base64o[(s[1] & 0x0F) << 2]; p[3] = '='; p += 4; } else if (n == 1) { p[0] = soap_base64o[(s[0] & 0xFC) >> 2]; p[1] = soap_base64o[(s[0] & 0x03) << 4]; p[2] = '='; p[3] = '='; p += 4; } if (p != d && soap_send_raw(soap, d, p - d)) return soap->error; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_getbase64(struct soap *soap, int *n, int malloc_flag) { size_t l = 0; (void)malloc_flag; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_string_in(soap, 0, -1, -1, NULL); return (unsigned char*)soap_base642s(soap, soap->dom->text, NULL, 0, n); } #endif #ifdef WITH_FAST soap->labidx = 0; for (;;) { size_t i, k; 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 (k > 2) { for (i = 0; i < k - 2; i += 3) { unsigned long m = 0; int j = 0; do { soap_wchar c = soap_get(soap); if (c < SOAP_AP) c &= 0x7FFFFFFF; if (c == '=' || c < 0) { unsigned char *p = NULL; 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; } l = soap->lablen + i - k; if (n) *n = (int)l; if (soap->maxlength > 0 && l > (size_t)soap->maxlength) soap->error = SOAP_LENGTH; else { p = (unsigned char*)soap_malloc(soap, l); if (p) (void)soap_memcpy((void*)p, l, (const void*)soap->labbuf, l); } if (c >= 0) { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT) continue; } 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_coblank(c + '+')) { soap->error = SOAP_TYPE; return NULL; } } while (j < 4); *s++ = (char)((m >> 16) & 0xFF); *s++ = (char)((m >> 8) & 0xFF); *s++ = (char)(m & 0xFF); } l = soap->lablen; if (soap->maxlength > 0 && l > (size_t)soap->maxlength) { soap->error = SOAP_LENGTH; return NULL; } } } #else if (soap_alloc_block(soap) == NULL) return NULL; for (;;) { int i; 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++) { unsigned long m = 0; int j = 0; do { soap_wchar c = soap_get(soap); if (c < SOAP_AP) c &= 0x7FFFFFFF; if (c == '=' || c < 0) { unsigned char *p; i *= 3; switch (j) { case 2: *s++ = (char)((m >> 4) & 0xFF); i++; l++; break; case 3: *s++ = (char)((m >> 10) & 0xFF); *s++ = (char)((m >> 2) & 0xFF); l += 2; i += 2; } if (n) *n = (int)soap_size_block(soap, NULL, i); if (soap->maxlength > 0 && l > (size_t)soap->maxlength) { soap->error = SOAP_LENGTH; soap_end_block(soap, NULL); return NULL; } p = (unsigned char*)soap_save_block(soap, NULL, NULL, 0); if (c >= 0) { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT) continue; } 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_coblank(c + '+')) { soap->error = SOAP_TYPE; return NULL; } } while (j < 4); *s++ = (char)((m >> 16) & 0xFF); *s++ = (char)((m >> 8) & 0xFF); *s++ = (char)(m & 0xFF); l += 3; } if (soap->maxlength > 0 && l > (size_t)soap->maxlength) { soap->error = SOAP_LENGTH; soap_end_block(soap, NULL); return NULL; } } #endif } /******************************************************************************/ #ifndef WITH_LEANER 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 */ short body = soap->body; /* should save type too? */ if (!soap_peek_element(soap)) { if (!soap_element_begin_in(soap, ":Include", 0, NULL)) { if (soap_attachment_forward(soap, ptr, size, id, type, options) || (soap->body && soap_element_end_in(soap, ":Include"))) return soap->error; } else if (soap->error == SOAP_TAG_MISMATCH) soap_retry(soap); else return soap->error; } soap->body = body; return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_attachment_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 /******************************************************************************/ SOAP_FMAC1 void * SOAP_FMAC2 soap_memdup(struct soap *soap, const void *s, size_t n) { void *t = NULL; if (s) { t = soap_malloc(soap, n); if (t) (void)soap_memcpy(t, n, s, n); } return t; } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_strdup(struct soap *soap, const char *s) { char *t = NULL; if (s) { size_t n = strlen(s) + 1; if (n > 0) { t = (char*)soap_malloc(soap, n); if (t) { (void)soap_memcpy((void*)t, n, (const void*)s, n); t[n - 1] = '\0'; } } } return t; } /******************************************************************************/ 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, m; while (s[n]) n++; n++; m = sizeof(wchar_t) * n; if (n > 0) { t = (wchar_t*)soap_malloc(soap, m); if (t) { (void)soap_memcpy((void*)t, m, (const void*)s, m); t[n - 1] = L'\0'; } } } return t; } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_strtrim(struct soap *soap, char *s) { (void)soap; if (s) { char *t; while ((*s >= 9 && *s <= 13) || *s == 32) s++; t = s; while (*t) t++; while (--t > s && ((*t >= 9 && *t <= 13) || *t == 32)) continue; t[1] = '\0'; } return s; } /******************************************************************************/ SOAP_FMAC1 wchar_t * SOAP_FMAC2 soap_wstrtrim(struct soap *soap, wchar_t *s) { (void)soap; if (s) { wchar_t *t; while ((*s >= 9 && *s <= 13) || *s == 32) s++; t = s; while (*t) t++; while (--t > s && ((*t >= 9 && *t <= 13) || *t == 32)) continue; t[1] = L'\0'; } return s; } /******************************************************************************/ SOAP_FMAC1 struct soap_blist* SOAP_FMAC2 soap_alloc_block(struct soap *soap) { struct soap_blist *p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New block sequence (prev=%p)\n", (void*)soap->blist)); p = (struct soap_blist*)SOAP_MALLOC(soap, sizeof(struct soap_blist)); if (!p) { soap->error = SOAP_EOM; return NULL; } p->next = soap->blist; p->head = NULL; p->size = 0; p->item = 0; soap->blist = p; return p; } /******************************************************************************/ SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block(struct soap *soap, struct soap_blist *b, size_t n) { struct soap_bhead *p; if (!b) b = soap->blist; if (!b || b->size + n < b->size || sizeof(struct soap_bhead) + n < n || (SOAP_MAXALLOCSIZE > 0 && sizeof(struct soap_bhead) + n > SOAP_MAXALLOCSIZE)) { soap->error = SOAP_EOM; return NULL; } p = (struct soap_bhead*)SOAP_MALLOC(soap, sizeof(struct soap_bhead) + n); if (!p) { soap->error = SOAP_EOM; return NULL; } p->next = b->head; b->head = p; p->size = n; b->size += n; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push block %p of %u bytes on %lu previous blocks (%lu bytes total)\n", (void*)p, (unsigned int)n, (unsigned long)b->item, (unsigned long)b->size)); b->item++; return (void*)(p + 1); /* skip block header and point to n allocated bytes */ } /******************************************************************************/ SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block_max(struct soap *soap, struct soap_blist *b, size_t n) { if (b && b->item >= soap->maxoccurs) /* restrict block array length */ { soap->error = SOAP_OCCURS; return NULL; } return soap_push_block(soap, b, n); } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_pop_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *p; if (!b) b = soap->blist; if (!b || !b->head) return; p = b->head; b->size -= p->size; b->head = p->next; b->item--; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pop block %p (%lu items of %lu bytes total)\n", (void*)p, (unsigned long)b->item, (unsigned long)b->size)); SOAP_FREE(soap, p); } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_update_pointers(struct soap *soap, const char *dst, const char *src, size_t len) { const void *start = src, *end = src + len; #ifndef WITH_LEANER struct soap_xlist *xp; #endif #ifndef WITH_NOIDREF if ((soap->version && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH)) { int i; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update pointers %p (%lu bytes) -> %p\n", (void*)src, (unsigned long)len, (void*)dst)); for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { struct soap_flist *fp; void *p, **q; if (ip->shaky) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update shaky id='%s'\n", ip->id)); if (ip->ptr && ip->ptr >= start && ip->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update ptr %p -> %p\n", ip->ptr, (void*)((const char*)ip->ptr + (dst-src)))); ip->ptr = (void*)((const char*)ip->ptr + (dst-src)); } for (q = &ip->link; q; q = (void**)p) { p = *q; if (p && p >= start && p < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Link update id='%s' %p -> %p\n", ip->id, p, (void*)((const char*)p + (dst-src)))); *q = (void*)((const char*)p + (dst-src)); } } for (q = &ip->copy; q; q = (void**)p) { p = *q; if (p && p >= start && p < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy chain update id='%s' %p -> %p\n", ip->id, p, (void*)((const char*)p + (dst-src)))); *q = (void*)((const char*)p + (dst-src)); } } for (fp = ip->flist; fp; fp = fp->next) { if (fp->ptr >= start && fp->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy list update id='%s' target type=%d %p -> %p\n", ip->id, fp->type, fp->ptr, (void*)((char*)fp->ptr + (dst-src)))); fp->ptr = (void*)((const char*)fp->ptr + (dst-src)); } } if (ip->smart && ip->smart >= start && ip->smart < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Smart shared pointer update %p -> %p\n", ip->smart, (void*)((const char*)ip->smart + (dst-src)))); ip->smart = (void*)((const char*)ip->smart + (dst-src)); } } } } } #else (void)soap; (void)start; (void)end; (void)dst; (void)src; #endif #ifndef WITH_LEANER for (xp = soap->xlist; xp; xp = xp->next) { if (xp->ptr && (void*)xp->ptr >= start && (void*)xp->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update attachment id='%s' %p -> %p\n", xp->id ? xp->id : SOAP_STR_EOS, (void*)xp->ptr, (void*)((char*)xp->ptr + (dst-src)))); xp->ptr = (unsigned char**)((char*)xp->ptr + (dst-src)); xp->size = (int*)((char*)xp->size + (dst-src)); xp->type = (char**)((char*)xp->type + (dst-src)); xp->options = (char**)((char*)xp->options + (dst-src)); } } #endif } /******************************************************************************/ #ifndef WITH_NOIDREF static int soap_has_copies(struct soap *soap, const char *start, const char *end) { int i; struct soap_ilist *ip = NULL; struct soap_flist *fp = NULL; 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 (fp->type == ip->type && (const char*)fp->ptr >= start && (const char*)fp->ptr < end) return SOAP_ERR; } } return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_resolve(struct soap *soap) { int i; short flag; const char *id; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded refs\n")); for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { if (ip->ptr) { void **q; struct soap_flist *fp, **fpp = &ip->flist; if (ip->spine) ip->spine[0] = ip->ptr; q = (void**)ip->link; ip->link = NULL; DBGLOG(TEST, if (q) SOAP_MESSAGE(fdebug, "Traversing link chain to resolve id='%s' type=%d\n", ip->id, ip->type)); while (q) { void *p = *q; *q = ip->ptr; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... link %p -> %p\n", (void*)q, ip->ptr)); q = (void**)p; } while ((fp = *fpp)) { if (fp->level > 0 && fp->finsert) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... insert type=%d link %p -> %p\n", fp->type, fp->ptr, ip->ptr)); if (ip->spine && fp->level <= SOAP_MAXPTRS) fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, &ip->spine[fp->level - 1], &ip->smart); else if (fp->level == 1) fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, &ip->ptr, &ip->smart); else if (fp->level <= SOAP_MAXPTRS) { int i; ip->spine = (void**)soap_malloc(soap, SOAP_MAXPTRS * sizeof(void*)); if (!ip->spine) return soap->error = SOAP_EOM; ip->spine[0] = ip->ptr; for (i = 1; i < SOAP_MAXPTRS; i++) ip->spine[i] = &ip->spine[i - 1]; fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, &ip->spine[fp->level - 1], &ip->smart); } *fpp = fp->next; SOAP_FREE(soap, fp); } else fpp = &fp->next; } } else if (*ip->id == '#') { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Missing id='%s'\n", ip->id)); soap_strcpy(soap->id, sizeof(soap->id), ip->id + 1); return soap->error = SOAP_MISSING_ID; } } } do { flag = 0; id = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution phase\n")); for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { if (ip->copy || ip->flist) { if (ip->ptr && !soap_has_copies(soap, (const char*)ip->ptr, (const char*)ip->ptr + ip->size)) { struct soap_flist *fp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving id='%s' type=%d ptr=%p size=%lu ...\n", ip->id, ip->type, ip->ptr, (unsigned long)ip->size)); if (ip->copy) { 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, (void*)q, (unsigned int)ip->size)); p = *q; (void)soap_memcpy((void*)q, ip->size, (const void*)ip->ptr, ip->size); q = (void**)p; } while (q); flag = 1; } while ((fp = ip->flist)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded data type=%d target type=%d location=%p level=%u id='%s'\n", ip->type, fp->type, ip->ptr, fp->level, ip->id)); if (fp->level == 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... copy %p -> %p (%lu bytes)\n", ip->ptr, fp->ptr, (unsigned long)ip->size)); if (fp->finsert) fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, ip->ptr, &ip->smart); else (void)soap_memcpy((void*)fp->ptr, ip->size, (const void*)ip->ptr, ip->size); } ip->flist = fp->next; SOAP_FREE(soap, fp); flag = 1; } } else if (*ip->id == '#') id = ip->id; } } } } while (flag); if (id) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution error: forwarded data for id='%s' could not be propagated, please report this problem to the gSOAP developers\n", id)); return soap_id_nullify(soap, id); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution done\n")); return SOAP_OK; } #endif /******************************************************************************/ 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->head) { b->size -= b->head->size - n; b->head->size = n; } return b->size; } /******************************************************************************/ SOAP_FMAC1 char* SOAP_FMAC2 soap_first_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *p, *q, *r; if (!b) b = soap->blist; p = b->head; if (!p) return NULL; r = NULL; do { q = p->next; p->next = r; r = p; p = q; } while (p); b->head = r; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "First block %p\n", (void*)(r + 1))); return (char*)(r + 1); } /******************************************************************************/ SOAP_FMAC1 char* SOAP_FMAC2 soap_next_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *p; if (!b) b = soap->blist; p = b->head; if (p) { b->head = p->next; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Next block %p, deleting current block\n", (void*)(b->head ? b->head + 1 : NULL))); SOAP_FREE(soap, p); if (b->head) return (char*)(b->head + 1); } return NULL; } /******************************************************************************/ SOAP_FMAC1 size_t SOAP_FMAC2 soap_block_size(struct soap *soap, struct soap_blist *b) { if (!b) b = soap->blist; return b->head->size; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_end_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *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->head; p; p = q) { q = p->next; 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, "Restored previous block sequence\n")); #ifndef WITH_NOIDREF if (!soap->blist && ((soap->version && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH))) { int i; struct soap_ilist *ip = NULL; for (i = 0; i < SOAP_IDHASH; i++) for (ip = soap->iht[i]; ip; ip = ip->next) ip->shaky = 0; } #endif } /******************************************************************************/ SOAP_FMAC1 char* SOAP_FMAC2 soap_save_block(struct soap *soap, struct soap_blist *b, char *p, int flag) { size_t n; char *q, *s; if (!b) b = soap->blist; if (b->size) { if (!p) p = (char*)soap_malloc(soap, b->size); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Save all %lu blocks in contiguous memory space of %u bytes (%p->%p)\n", (unsigned long)b->item, (unsigned int)b->size, (void*)b->head, (void*)p)); if (p) { s = p; for (q = soap_first_block(soap, b); q; q = soap_next_block(soap, b)) { n = soap_block_size(soap, b); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy %u bytes from %p to %p\n", (unsigned int)n, (void*)q, (void*)s)); if (flag) soap_update_pointers(soap, s, q, n); (void)soap_memcpy((void*)s, n, (const void*)q, n); s += n; } } else soap->error = SOAP_EOM; } soap_end_block(soap, b); return p; } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_putsizesoffsets(struct soap *soap, const char *type, const int *size, const int *offset, int dim) { int i; const char *t = ",%d"; if (!type) return NULL; if (soap->version == 2) t = " %d"; if (soap->version != 2 && offset) { (SOAP_SNPRINTF(soap->type, sizeof(soap->type) - 1, strlen(type) + 20), "%s[%d", type, size[0] + offset[0]); for (i = 1; i < dim; i++) { size_t l = strlen(soap->type); (SOAP_SNPRINTF(soap->type + l, sizeof(soap->type) - l - 1, 20), t, size[i] + offset[i]); } } else { (SOAP_SNPRINTF(soap->type, sizeof(soap->type) - 1, strlen(type) + 20), "%s[%d", type, size[0]); for (i = 1; i < dim; i++) { size_t l = strlen(soap->type); (SOAP_SNPRINTF(soap->type + l, sizeof(soap->type) - l - 1, 20), t, size[i]); } } soap_strcat(soap->type, sizeof(soap->type), "]"); return soap->type; } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_putoffsets(struct soap *soap, const int *offset, int dim) { int i; soap->arrayOffset[0] = '\0'; if (soap->version == 1) { (SOAP_SNPRINTF(soap->arrayOffset, sizeof(soap->arrayOffset) - 1, 20), "[%d", offset[0]); for (i = 1; i < dim; i++) { size_t l = strlen(soap->arrayOffset); (SOAP_SNPRINTF(soap->arrayOffset + l, sizeof(soap->arrayOffset) - l - 1, 20), ",%d", offset[i]); } soap_strcat(soap->arrayOffset, sizeof(soap->arrayOffset), "]"); } return soap->arrayOffset; } /******************************************************************************/ SOAP_FMAC1 size_t SOAP_FMAC2 soap_size(const int *size, int dim) { int i; size_t n = 0; if (size[0] <= 0) return 0; n = (size_t)size[0]; for (i = 1; i < dim; i++) { if (size[i] <= 0) return 0; n *= (size_t)size[i]; } return (size_t)n; } /******************************************************************************/ SOAP_FMAC1 size_t SOAP_FMAC2 soap_getsizes(const char *attr, int *size, int dim) { size_t i, k, n; if (!*attr) return 0; i = strlen(attr); n = 1; do { for (; i > 0; i--) if (attr[i - 1] == '[' || attr[i - 1] == ',' || attr[i - 1] == ' ') break; n *= k = (size_t)soap_strtoul(attr + i, NULL, 10); size[--dim] = (int)k; if (n > SOAP_MAXARRAYSIZE) return 0; } while (dim > 0 && --i > 0 && attr[i] != '['); return n; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_getoffsets(const char *attr, const int *size, int *offset, int dim) { int i, j = 0; if (offset) { for (i = 0; i < dim && attr && *attr; i++) { attr++; j *= size[i]; j += offset[i] = (int)soap_strtol(attr, NULL, 10); attr = strchr(attr, ','); } } else { for (i = 0; i < dim && attr && *attr; i++) { attr++; j *= size[i]; j += (int)soap_strtol(attr, NULL, 10); attr = strchr(attr, ','); } } return j; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_getposition(const char *attr, int *pos) { int i, n; if (!*attr) return -1; n = 0; i = 1; do { pos[n++] = (int)soap_strtol(attr + i, NULL, 10); while (attr[i] && attr[i] != ',' && attr[i] != ']') i++; if (attr[i] == ',') i++; } while (n < SOAP_MAXDIMS && attr[i] && attr[i] != ']'); return n; } /******************************************************************************/ SOAP_FMAC1 struct soap_nlist * SOAP_FMAC2 soap_push_namespace(struct soap *soap, const char *id, const char *ns) { struct soap_nlist *np = NULL; struct Namespace *p; short i = -1; size_t n, k; n = strlen(id); k = strlen(ns) + 1; p = soap->local_namespaces; if (p) { for (i = 0; p->id; p++, i++) { if (p->ns && !strcmp(ns, p->ns)) break; if (p->out) { if (!strcmp(ns, p->out)) break; } else if (p->in) { if (!soap_tag_cmp(ns, p->in)) { if (SOAP_MAXALLOCSIZE <= 0 || k <= SOAP_MAXALLOCSIZE) p->out = (char*)SOAP_MALLOC(soap, k); if (p->out) soap_strcpy(p->out, k, ns); break; } } } if (!p->id) i = -1; } if (i >= 0) k = 0; if (sizeof(struct soap_nlist) + n + k > n && (SOAP_MAXALLOCSIZE <= 0 || sizeof(struct soap_nlist) + n + k <= SOAP_MAXALLOCSIZE)) np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k); if (!np) { soap->error = SOAP_EOM; return NULL; } np->next = soap->nlist; soap->nlist = np; np->level = soap->level; np->index = i; soap_strcpy((char*)np->id, n + 1, 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; soap_strcpy((char*)np->ns, k, 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 np; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_pop_namespace(struct soap *soap) { 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' level=%u\n", soap->level, np->id, np->level)); SOAP_FREE(soap, np); } soap->nlist = np; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_match_namespace(struct soap *soap, const char *id1, const char *id2, size_t n1, size_t n2) { struct soap_nlist *np = soap->nlist; const char *s; while (np && (strncmp(np->id, id1, n1) || np->id[n1])) np = np->next; if (np) { if (!(soap->mode & SOAP_XML_IGNORENS) && (n2 > 0 || !np->ns || *np->ns)) { if (np->index < 0 || ((s = soap->local_namespaces[np->index].id) && (strncmp(s, id2, n2) || (s[n2] && s[n2] != '_')))) return SOAP_NAMESPACE; } return SOAP_OK; } if (n1 == 0) return n2 == 0 || (soap->mode & SOAP_XML_IGNORENS) ? SOAP_OK : SOAP_NAMESPACE; if ((n1 == 3 && n1 == n2 && !strncmp(id1, "xml", 3) && !strncmp(id1, id2, 3)) || (soap->mode & SOAP_XML_IGNORENS)) return SOAP_OK; return soap->error = SOAP_SYNTAX_ERROR; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_current_namespace_tag(struct soap *soap, const char *tag) { struct soap_nlist *np; const char *s; if (!tag || !strncmp(tag, "xml", 3)) return NULL; np = soap->nlist; s = strchr(tag, ':'); if (!s) { 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) { s = np->ns; if (*s) return soap_strdup(soap, s); do np = np->next; while (np && *np->id); /* find if there is any other default namespace */ if (np) return soap_strdup(soap, s); } } return NULL; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_current_namespace_att(struct soap *soap, const char *tag) { struct soap_nlist *np; const char *s; if (!tag || !strncmp(tag, "xml", 3)) return NULL; s = strchr(tag, ':'); if (!s) return NULL; np = soap->nlist; 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 && *np->ns) return soap_strdup(soap, np->ns); } return NULL; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_tag_cmp(const char *s, const char *t) { const char *a = NULL; const char *b = NULL; for (;;) { int c1 = *s; int c2 = *t; if (!c1 || c1 == '"') break; if (c2 != '-') { if (c1 < c2) { if (c1 >= 'A' && c1 <= 'Z') c1 += 'a' - 'A'; } else if (c1 > c2) { if (c2 >= 'A' && c2 <= 'Z') c2 += 'a' - 'A'; } if (c2 == '*') { c2 = *++t; if (!c2) return 0; a = s; b = t; continue; } if (c1 != c2) { if (!a) return 1; s = ++a; t = b; continue; } } s++; t++; } if (*t == '*' && !t[1]) return 0; return *t; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_match_tag(struct soap *soap, const char *tag1, const char *tag2) { const char *s, *t; 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; if (t != tag2 && !(soap->mode & SOAP_XML_IGNORENS)) { err = soap_match_namespace(soap, tag1, tag2, s - tag1, t - tag2); if (err) { 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 (!t[1]) { if ((soap->mode & SOAP_XML_IGNORENS) || soap_match_namespace(soap, tag1, tag2, 0, t - tag2)) return SOAP_TAG_MISMATCH; } 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); if (err) { 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->mode & SOAP_XML_IGNORENS) || SOAP_STRCMP(s + 1, tag2)) /* always fails (except when ignoring ns) */ return SOAP_TAG_MISMATCH; } else if (SOAP_STRCMP(tag1, tag2) #ifndef WITH_NOEMPTYNAMESPACES || ((soap->mode & SOAP_XML_STRICT) && !(soap->mode & SOAP_XML_IGNORENS) && soap_match_namespace(soap, tag1, tag2, 0, 0)) /* strict checking: default namespace must be null namespace */ #endif ) { return SOAP_TAG_MISMATCH; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags match: '%s' '%s'\n", tag1, tag2)); return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_match_att(struct soap *soap, const char *tag1, const char *tag2) { const char *s, *t; 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; if (t != tag2 && !(soap->mode & SOAP_XML_IGNORENS)) { err = soap_match_namespace(soap, tag1, tag2, s - tag1, t - tag2); if (err) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Atts '%s' and '%s' match but namespaces differ\n", tag1, tag2)); if (err == SOAP_NAMESPACE) return SOAP_TAG_MISMATCH; return err; } } } else if (!t[1] || t != tag2 || SOAP_STRCMP(tag1, t + 1)) return SOAP_TAG_MISMATCH; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Atts and (default) namespaces match: '%s' '%s'\n", tag1, tag2)); return SOAP_OK; } if (s) { if (!(soap->mode & SOAP_XML_IGNORENS) || SOAP_STRCMP(s + 1, tag2)) /* always fails (except when ignoring ns) */ return SOAP_TAG_MISMATCH; } else if (SOAP_STRCMP(tag1, tag2)) return SOAP_TAG_MISMATCH; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Atts match: '%s' '%s'\n", tag1, tag2)); return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_match_array(struct soap *soap, const char *type) { if (type && *soap->arrayType) { if (soap->version == 1 || !strchr(type, '[')) { 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, "SOAP array type mismatch: '%s' '%s'\n", soap->arrayType, type)); return SOAP_TAG_MISMATCH; } } } return SOAP_OK; } /******************************************************************************\ * * SSL/TLS * \******************************************************************************/ #ifdef WITH_OPENSSL SOAP_FMAC1 int SOAP_FMAC2 soap_rand() { int r; if (!soap_ssl_init_done) soap_ssl_init(); #if OPENSSL_VERSION_NUMBER < 0x10100000L RAND_pseudo_bytes((unsigned char*)&r, sizeof(int)); #else RAND_bytes((unsigned char*)&r, sizeof(int)); #endif return r; } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) SOAP_FMAC1 int SOAP_FMAC2 #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid) #else 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) #endif { int err; soap->keyfile = keyfile; #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap->keyid = keyid; /* vxWorks compatible */ #endif soap->password = password; soap->cafile = cafile; soap->capath = capath; #ifdef WITH_OPENSSL soap->dhfile = dhfile; soap->randfile = randfile; if (!soap->fsslverify) soap->fsslverify = ssl_verify_callback; #endif soap->ssl_flags = flags | (dhfile == NULL ? SOAP_SSL_RSA : 0); #ifdef WITH_GNUTLS (void)randfile; (void)sid; if (dhfile) { char *s; int n = (int)soap_strtoul(dhfile, &s, 10); if (!soap->dh_params) gnutls_dh_params_init(&soap->dh_params); /* if dhfile is numeric, treat it as a key length to generate DH params which can take a while */ if (n >= 512 && s && *s == '\0') gnutls_dh_params_generate2(soap->dh_params, (unsigned int)n); else { unsigned int dparams_len; unsigned char dparams_buf[1024]; FILE *fd = fopen(dhfile, "r"); if (!fd) return soap_set_receiver_error(soap, "SSL/TLS error", "Invalid DH file", SOAP_SSL_ERROR); dparams_len = (unsigned int)fread(dparams_buf, 1, sizeof(dparams_buf), fd); fclose(fd); gnutls_datum_t dparams = { dparams_buf, dparams_len }; if (gnutls_dh_params_import_pkcs3(soap->dh_params, &dparams, GNUTLS_X509_FMT_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Invalid DH file", SOAP_SSL_ERROR); } } else { #if GNUTLS_VERSION_NUMBER < 0x030300 if (!soap->rsa_params) gnutls_rsa_params_init(&soap->rsa_params); gnutls_rsa_params_generate2(soap->rsa_params, SOAP_SSL_RSA_BITS); #endif } if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } #endif #ifdef WITH_SYSTEMSSL (void)randfile; (void)sid; if (soap->ctx) gsk_environment_close(&soap->ctx); #endif err = soap->fsslauth(soap); #ifdef WITH_OPENSSL if (!err) { if (sid) SSL_CTX_set_session_id_context(soap->ctx, (unsigned char*)sid, (unsigned int)strlen(sid)); else SSL_CTX_set_session_cache_mode(soap->ctx, SSL_SESS_CACHE_OFF); } #endif return err; } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) SOAP_FMAC1 int SOAP_FMAC2 #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *randfile) #else 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) #endif { soap->keyfile = keyfile; #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap->keyid = keyid; /* vxWorks compatible */ #endif soap->password = password; soap->cafile = cafile; soap->capath = capath; soap->ssl_flags = SOAP_SSL_CLIENT | flags; #ifdef WITH_OPENSSL soap->dhfile = NULL; soap->randfile = randfile; if (!soap->fsslverify) soap->fsslverify = (flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) == 0 ? ssl_verify_callback : ssl_verify_callback_allow_expired_certificate; #endif #ifdef WITH_GNUTLS (void)randfile; if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } #endif #ifdef WITH_SYSTEMSSL (void)randfile; if (soap->ctx) gsk_environment_close(&soap->ctx); #endif return soap->fsslauth(soap); } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_crl(struct soap *soap, const char *crlfile) { #ifdef WITH_OPENSSL if (crlfile && soap->ctx) { #if OPENSSL_VERSION_NUMBER > 0x00907000L X509_STORE *store = SSL_CTX_get_cert_store(soap->ctx); if (*crlfile) { int ret; X509_LOOKUP *lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file()); if (!lookup) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't create X509_LOOKUP object", SOAP_SSL_ERROR); ret = X509_load_crl_file(lookup, crlfile, X509_FILETYPE_PEM); if (ret <= 0) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CRL PEM file", SOAP_SSL_ERROR); } X509_STORE_set_flags(store, X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL); #endif } else soap->crlfile = crlfile; /* activate later when store is available */ #endif #ifdef WITH_GNUTLS if (crlfile && soap->xcred) { if (*crlfile) if (gnutls_certificate_set_x509_crl_file(soap->xcred, crlfile, GNUTLS_X509_FMT_PEM) < 0) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CRL PEM file", SOAP_SSL_ERROR); } else { soap->crlfile = crlfile; /* activate later when xcred is available */ } #endif return SOAP_OK; } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) SOAP_FMAC1 void SOAP_FMAC2 soap_ssl_init() { /* Note: for multi-threaded applications, the main program should call soap_ssl_init() before any threads are started */ if (!soap_ssl_init_done) { soap_ssl_init_done = 1; #ifdef WITH_OPENSSL SSL_library_init(); OpenSSL_add_all_algorithms(); /* we keep ciphers and digests for the program's lifetime */ #ifndef WITH_LEAN SSL_load_error_strings(); #endif #if !defined(WIN32) && !defined(CYGWIN) && !defined(__MINGW32__) && !defined(__MINGW64__) if (!RAND_load_file("/dev/urandom", 1024)) #else if (1) #endif { /* if /dev/urandom does not exist we need to do at least some pertubations to seed the OpenSSL PRNG */ char buf[1024]; RAND_seed(buf, sizeof(buf)); #ifdef HAVE_RANDOM srandom((unsigned long)time(NULL)); #else srand((unsigned int)time(NULL)); #endif do { #ifdef HAVE_RANDOM long r = random(); /* we actually do no use random() anywhere, except to help seed the OpenSSL PRNG */ RAND_seed(&r, sizeof(long)); #else int r = rand(); /* we actually do no use rand() anywhere, except to help seed the OpenSSL PRNG */ RAND_seed(&r, sizeof(int)); #endif } while (!RAND_status()); } #endif #ifdef WITH_GNUTLS # if GNUTLS_VERSION_NUMBER < 0x020b00 # if defined(HAVE_PTHREAD_H) gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread); # elif defined(HAVE_PTH_H) gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pth); # endif gcry_control(GCRYCTL_ENABLE_QUICK_RANDOM, 0); gcry_control(GCRYCTL_DISABLE_SECMEM, 0); gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); /* libgcrypt init done */ # endif # if GNUTLS_VERSION_NUMBER < 0x030300 gnutls_global_init(); # endif #endif } } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) SOAP_FMAC1 void SOAP_FMAC2 soap_ssl_noinit() { /* Call this first to bypass SSL init is SSL is already initialized elsewhere */ soap_ssl_init_done = 1; } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) SOAP_FMAC1 const char * SOAP_FMAC2 soap_ssl_error(struct soap *soap, int ret, int err) { #ifdef WITH_OPENSSL const char *msg = soap_code_str(h_ssl_error_codes, err); if (!msg) return ERR_error_string(err, soap->msgbuf); (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(msg) + 1), "%s\n", msg); if (ERR_peek_error()) { unsigned long r; while ((r = ERR_get_error())) { size_t l = strlen(soap->msgbuf); ERR_error_string_n(r, soap->msgbuf + l, sizeof(soap->msgbuf) - l); l = strlen(soap->msgbuf); if (l + 1 < sizeof(soap->msgbuf)) { soap->msgbuf[l++] = '\n'; soap->msgbuf[l] = '\0'; } if (ERR_GET_REASON(r) == SSL_R_CERTIFICATE_VERIFY_FAILED && l < sizeof(soap->msgbuf)) { const char *s = X509_verify_cert_error_string(SSL_get_verify_result(soap->ssl)); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, strlen(s)), "%s", s); } } } else { size_t l = strlen(soap->msgbuf); switch (ret) { case 0: soap_strcpy(soap->msgbuf + l, sizeof(soap->msgbuf) - l, "EOF was observed that violates the SSL/TLS protocol. The client probably provided invalid authentication information."); break; case -1: { const char *s = strerror(soap_errno); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, strlen(s) + 42), "Error observed by underlying SSL/TLS BIO: %s", s); } break; } } ERR_clear_error(); return soap->msgbuf; #endif #ifdef WITH_GNUTLS (void)soap; (void)err; return gnutls_strerror(ret); #endif } #endif /******************************************************************************/ #ifdef WITH_SYSTEMSSL static int ssl_recv(int sk, void *s, int n, char *user) { (void)user; return recv(sk, s, n, 0); } #endif /******************************************************************************/ #ifdef WITH_SYSTEMSSL static int ssl_send(int sk, void *s, int n, char *user) { (void)user; return send(sk, s, n, 0); } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) static int ssl_auth_init(struct soap *soap) { #ifdef WITH_OPENSSL #if OPENSSL_VERSION_NUMBER >= 0x10101000L int minv = 0, maxv = 0; #endif long flags = SSL_OP_ALL; int mode; #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) EVP_PKEY* pkey; /* vxWorks compatible */ #endif if (!soap_ssl_init_done) soap_ssl_init(); ERR_clear_error(); if (!soap->ctx) { #if OPENSSL_VERSION_NUMBER >= 0x10100000L /* TLS_method: a TLS/SSL connection established may understand the SSLv3, TLSv1, TLSv1.1 and TLSv1.2 protocols. */ soap->ctx = SSL_CTX_new(TLS_method()); #else /* SSLv23_method: a TLS/SSL connection established may understand the SSLv3, TLSv1, TLSv1.1 and TLSv1.2 protocols. */ soap->ctx = SSL_CTX_new(SSLv23_method()); #endif if (!soap->ctx) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't setup context", SOAP_SSL_ERROR); /* The following alters the behavior of SSL read/write: */ #if 0 SSL_CTX_set_mode(soap->ctx, SSL_MODE_ENABLE_PARTIAL_WRITE | SSL_MODE_AUTO_RETRY); #endif } if (soap->randfile) { if (!RAND_load_file(soap->randfile, -1)) return soap_set_receiver_error(soap, "SSL/TLS 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/TLS error", "Can't read CA PEM file", 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/TLS error", "Can't read default CA PEM file and/or directory", SOAP_SSL_ERROR); } if (soap->crlfile) { if (soap_ssl_crl(soap, soap->crlfile)) return soap->error; } /* This code assumes a typical scenario with key and cert in one PEM file, see alternative code below */ #if 1 if (soap->keyfile) { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't find or read certificate in private key PEM 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); } #ifndef WM_SECURE_KEY_STORAGE if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read private key PEM file", SOAP_SSL_ERROR); #endif } #else /* Suggested alternative approach to check the key file for cert only when 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) { if (soap->keyfile) { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't find or read certificate in private key PEM file", SOAP_SSL_ERROR); if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read private key PEM file", SOAP_SSL_ERROR); } } else /* use cafile for (server) cert and keyfile for (server) key */ { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->cafile)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CA PEM file", SOAP_SSL_ERROR); if (soap->keyfile) if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read private key PEM file", SOAP_SSL_ERROR); } #endif #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) /* vxWorks compatible */ pkey = ipcom_key_db_pkey_get(soap->keyid); if (!pkey) return soap_set_receiver_error(soap, "SSL error", "Can't find key", SOAP_SSL_ERROR); if (!SSL_CTX_use_PrivateKey(soap->ctx, pkey)) return soap_set_receiver_error(soap, "SSL error", "Can't read key", SOAP_SSL_ERROR); #endif if ((soap->ssl_flags & SOAP_SSL_RSA)) { #if OPENSSL_VERSION_NUMBER >= 0x10002000L if (SSL_CTX_need_tmp_RSA(soap->ctx)) { unsigned long e = RSA_F4; BIGNUM *bne = BN_new(); RSA *rsa = RSA_new(); if (!bne || !rsa || !BN_set_word(bne, e) || !RSA_generate_key_ex(rsa, SOAP_SSL_RSA_BITS, bne, NULL) || !SSL_CTX_set_tmp_rsa(soap->ctx, rsa)) { if (bne) BN_free(bne); if (rsa) RSA_free(rsa); return soap_set_receiver_error(soap, "SSL/TLS error", "Can't generate RSA key", SOAP_SSL_ERROR); } BN_free(bne); RSA_free(rsa); } #else RSA *rsa = RSA_generate_key(SOAP_SSL_RSA_BITS, RSA_F4, NULL, NULL); if (!rsa || !SSL_CTX_set_tmp_rsa(soap->ctx, rsa)) { if (rsa) RSA_free(rsa); return soap_set_receiver_error(soap, "SSL/TLS error", "Can't generate RSA key", SOAP_SSL_ERROR); } RSA_free(rsa); #endif } else if (soap->dhfile) { DH *dh = NULL; char *s; int n = (int)soap_strtoul(soap->dhfile, &s, 10); /* if dhfile is numeric, treat it as a key length to generate DH params which can take a while */ if (n >= 512 && s && *s == '\0') { #if OPENSSL_VERSION_NUMBER >= 0x10002000L dh = DH_new(); if (!DH_generate_parameters_ex(dh, n, 2/*or 5*/, NULL)) { DH_free(dh); return soap_set_receiver_error(soap, "SSL/TLS error", "Can't generate DH parameters", SOAP_SSL_ERROR); } #elif defined(VXWORKS) dh = DH_new(); DH_generate_parameters_ex(dh, n, 2/*or 5*/, NULL); #else dh = DH_generate_parameters(n, 2/*or 5*/, NULL, NULL); #endif } else { BIO *bio; bio = BIO_new_file(soap->dhfile, "r"); if (!bio) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read DH PEM file", SOAP_SSL_ERROR); dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL); BIO_free(bio); } if (!dh || DH_check(dh, &n) != 1 || SSL_CTX_set_tmp_dh(soap->ctx, dh) < 0) { if (dh) DH_free(dh); return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set DH parameters", SOAP_SSL_ERROR); } DH_free(dh); } /* enable all TSLv1 protocols and disable SSLv3 by default if no SSL/TLS flags are set */ if ((soap->ssl_flags & SOAP_SSLv3_TLSv1) == 0) soap->ssl_flags |= SOAP_TLSv1; #if OPENSSL_VERSION_NUMBER >= 0x10101000L if ((soap->ssl_flags & SOAP_SSLv3)) minv = SSL3_VERSION; else if ((soap->ssl_flags & SOAP_TLSv1_0)) minv = TLS1_VERSION; else if ((soap->ssl_flags & SOAP_TLSv1_1)) minv = TLS1_1_VERSION; else if ((soap->ssl_flags & SOAP_TLSv1_2)) minv = TLS1_2_VERSION; else if ((soap->ssl_flags & SOAP_TLSv1_3)) minv = TLS1_3_VERSION; if ((soap->ssl_flags & SOAP_TLSv1_3) && OpenSSL_version_num() >= 0x10101000L) maxv = TLS1_3_VERSION; else if ((soap->ssl_flags & SOAP_TLSv1_2)) maxv = TLS1_2_VERSION; else if ((soap->ssl_flags & SOAP_TLSv1_1)) maxv = TLS1_1_VERSION; else if ((soap->ssl_flags & SOAP_TLSv1_0)) maxv = TLS1_VERSION; else maxv = SSL3_VERSION; if (!SSL_CTX_set_min_proto_version(soap->ctx, minv) || !SSL_CTX_set_max_proto_version(soap->ctx, maxv)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set protocol version", SOAP_SSL_ERROR); #else /* disable SSL v2 by default and enable specific protos */ flags = SSL_OP_NO_SSLv2; if (!(soap->ssl_flags & SOAP_SSLv3)) flags |= SSL_OP_NO_SSLv3; #if OPENSSL_VERSION_NUMBER >= 0x10001000L if (!(soap->ssl_flags & SOAP_TLSv1_0)) flags |= SSL_OP_NO_TLSv1; if (!(soap->ssl_flags & SOAP_TLSv1_1)) flags |= SSL_OP_NO_TLSv1_1; if (!(soap->ssl_flags & SOAP_TLSv1_2)) flags |= SSL_OP_NO_TLSv1_2; #endif #endif #ifdef SSL_OP_NO_TICKET /* TLS extension is enabled by default in OPENSSL v0.9.8k disable it by */ flags |= SSL_OP_NO_TICKET; #endif 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 #endif #ifdef WITH_GNUTLS int ret; char priority[80]; soap_strcpy(priority, sizeof(priority), "PERFORMANCE"); if (!soap_ssl_init_done) soap_ssl_init(); if (!soap->xcred) { if (gnutls_certificate_allocate_credentials(&soap->xcred) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't allocate credentials or trust", SOAP_SSL_ERROR); #if GNUTLS_VERSION_NUMBER >= 0x030300 gnutls_certificate_set_x509_system_trust(soap->xcred); #endif if (soap->cafile) { if (gnutls_certificate_set_x509_trust_file(soap->xcred, soap->cafile, GNUTLS_X509_FMT_PEM) < 0) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CA PEM file", SOAP_SSL_ERROR); } if (soap->crlfile) { if (soap_ssl_crl(soap, soap->crlfile)) return soap->error; } if (soap->keyfile) { if (gnutls_certificate_set_x509_key_file2(soap->xcred, soap->keyfile, soap->keyfile, GNUTLS_X509_FMT_PEM, soap->password, GNUTLS_PKCS_PKCS12_3DES | GNUTLS_PKCS_PKCS12_ARCFOUR | GNUTLS_PKCS_PKCS12_RC2_40 | GNUTLS_PKCS_PBES2_AES_128 | GNUTLS_PKCS_PBES2_AES_192 | GNUTLS_PKCS_PBES2_AES_256 | GNUTLS_PKCS_PBES2_DES) < 0) /* Assumes that key and cert(s) are concatenated in the keyfile and the key is encrypted with one of these algorithms */ return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read private key PEM file", SOAP_SSL_ERROR); } } if ((soap->ssl_flags & SOAP_SSL_CLIENT)) { gnutls_init(&soap->session, GNUTLS_CLIENT); if (soap->cafile || soap->crlfile || soap->keyfile) { ret = gnutls_priority_set_direct(soap->session, "PERFORMANCE", NULL); if (ret != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, soap_ssl_error(soap, ret, 0), "SSL/TLS set priority error", SOAP_SSL_ERROR); gnutls_credentials_set(soap->session, GNUTLS_CRD_CERTIFICATE, soap->xcred); } else { if (!soap->acred) gnutls_anon_allocate_client_credentials(&soap->acred); ret = gnutls_priority_set_direct(soap->session, "PERFORMANCE:+ANON-DH:!ARCFOUR-128", NULL); if (ret != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, soap_ssl_error(soap, ret, 0), "SSL/TLS set priority error", SOAP_SSL_ERROR); gnutls_credentials_set(soap->session, GNUTLS_CRD_ANON, soap->acred); } } else if (!soap->keyfile) { return soap_set_receiver_error(soap, "SSL/TLS error", "No key file: anonymous server authentication not supported in this release", SOAP_SSL_ERROR); } else { #if GNUTLS_VERSION_NUMBER < 0x030300 int protocol_priority[] = { 0, 0, 0, 0, 0 }; int *protocol = protocol_priority; if ((soap->ssl_flags & SOAP_SSL_RSA) && soap->rsa_params) gnutls_certificate_set_rsa_export_params(soap->xcred, soap->rsa_params); #endif if (!(soap->ssl_flags & SOAP_SSL_RSA) && soap->dh_params) gnutls_certificate_set_dh_params(soap->xcred, soap->dh_params); if (!soap->cache) gnutls_priority_init(&soap->cache, "NORMAL", NULL); gnutls_init(&soap->session, GNUTLS_SERVER); gnutls_priority_set(soap->session, soap->cache); gnutls_credentials_set(soap->session, GNUTLS_CRD_CERTIFICATE, soap->xcred); if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) gnutls_certificate_server_set_request(soap->session, GNUTLS_CERT_REQUEST); gnutls_session_enable_compatibility_mode(soap->session); /* enable all TSLv1 protocols and disable SSLv3 by default if no SSL/TLS flags are set */ if ((soap->ssl_flags & SOAP_SSLv3_TLSv1) == 0) soap->ssl_flags |= SOAP_TLSv1; #if GNUTLS_VERSION_NUMBER < 0x030300 if ((soap->ssl_flags & SOAP_SSLv3)) *protocol++ = GNUTLS_SSL3; if ((soap->ssl_flags & SOAP_TLSv1_0)) *protocol++ = GNUTLS_TLS1_0; if ((soap->ssl_flags & SOAP_TLSv1_1)) *protocol++ = GNUTLS_TLS1_1; if ((soap->ssl_flags & SOAP_TLSv1_2)) *protocol++ = GNUTLS_TLS1_2; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set protocol", SOAP_SSL_ERROR); #else soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "NORMAL:+VERS-ALL"); if (!(soap->ssl_flags & SOAP_TLSv1_0)) soap_strcat(soap->tmpbuf, sizeof(soap->tmpbuf), ":-VERS-TLS1.0"); if (!(soap->ssl_flags & SOAP_TLSv1_1)) soap_strcat(soap->tmpbuf, sizeof(soap->tmpbuf), ":-VERS-TLS1.1"); if (!(soap->ssl_flags & SOAP_TLSv1_2)) soap_strcat(soap->tmpbuf, sizeof(soap->tmpbuf), ":-VERS-TLS1.2"); if (gnutls_priority_set_direct(soap->session, soap->tmpbuf, NULL) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set protocol priority", SOAP_SSL_ERROR); #endif } #endif #ifdef WITH_SYSTEMSSL if (!soap->ctx) { int err; err = gsk_environment_open(&soap->ctx); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_SSLV2, GSK_PROTOCOL_SSLV2_OFF); /* enable all TSLv1 protocols and disable SSLv3 by default if no SSL/TLS flags are set */ if ((soap->ssl_flags & SOAP_SSLv3_TLSv1) == 0) soap->ssl_flags |= SOAP_TLSv1; if (err == GSK_OK) { if ((soap->ssl_flags & SOAP_SSLv3)) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_SSLV3, GSK_PROTOCOL_SSLV3_ON); else err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_SSLV3, GSK_PROTOCOL_SSLV3_OFF); } if (err == GSK_OK) { if ((soap->ssl_flags & SOAP_TLSv1_0)) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_ON); else err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_OFF); } if (err == GSK_OK) { if ((soap->ssl_flags & SOAP_TLSv1_1)) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_1_ON); else err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_1_OFF); } if (err == GSK_OK) { if ((soap->ssl_flags & SOAP_TLSv1_2)) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_2_ON); else err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_2_OFF); } if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ctx, GSK_KEYRING_FILE, soap->keyfile, 0); /* keyfile is a keyring .kdb file */ if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ctx, GSK_KEYRING_PW, soap->password, 0); /* locked by password */ if (err == GSK_OK) err = gsk_environment_init(soap->ctx); if (err != GSK_OK) return soap_set_receiver_error(soap, gsk_strerror(err), "SYSTEM SSL error in ssl_auth_init()", SOAP_SSL_ERROR); } #endif return SOAP_OK; } #endif /******************************************************************************/ #ifdef WITH_OPENSSL static int ssl_password(char *buf, int num, int rwflag, void *userdata) { (void)rwflag; if (!buf || !userdata) return 0; soap_strcpy(buf, (size_t)num, (char*)userdata); return (int)strlen(buf); } #endif /******************************************************************************/ #ifdef WITH_OPENSSL static int ssl_verify_callback(int ok, X509_STORE_CTX *store) { (void)store; #ifdef SOAP_DEBUG if (!ok) { char buf[1024]; int err = X509_STORE_CTX_get_error(store); X509 *cert = X509_STORE_CTX_get_current_cert(store); fprintf(stderr, "\nDEBUG mode TLS/SSL warnings:\nSSL verify error %d or warning with certificate at depth %d: %s\n", err, X509_STORE_CTX_get_error_depth(store), X509_verify_cert_error_string(err)); X509_NAME_oneline(X509_get_issuer_name(cert), buf, sizeof(buf)-1); fprintf(stderr, " certificate issuer: %s\n", buf); X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)-1); fprintf(stderr, " certificate subject: %s\n", buf); /* accept self-signed certificates and certificates out of date */ switch (err) { case X509_V_ERR_CERT_NOT_YET_VALID: case X509_V_ERR_CERT_HAS_EXPIRED: case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: case X509_V_ERR_UNABLE_TO_GET_CRL: case X509_V_ERR_CRL_NOT_YET_VALID: case X509_V_ERR_CRL_HAS_EXPIRED: X509_STORE_CTX_set_error(store, X509_V_OK); ok = 1; fprintf(stderr, "Initialize soap_ssl_client_context with SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE to allow this verification error to pass without DEBUG mode enabled\n"); } } #endif /* Note: return 1 to try to continue, but unsafe progress will be terminated by OpenSSL */ return ok; } #endif /******************************************************************************/ #ifdef WITH_OPENSSL static int ssl_verify_callback_allow_expired_certificate(int ok, X509_STORE_CTX *store) { ok = ssl_verify_callback(ok, store); if (!ok) { /* accept self signed certificates, expired certificates, and certficiates w/o CRL */ switch (X509_STORE_CTX_get_error(store)) { case X509_V_ERR_CERT_NOT_YET_VALID: case X509_V_ERR_CERT_HAS_EXPIRED: case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: case X509_V_ERR_UNABLE_TO_GET_CRL: case X509_V_ERR_CRL_NOT_YET_VALID: case X509_V_ERR_CRL_HAS_EXPIRED: 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 /******************************************************************************/ #ifdef WITH_GNUTLS static const char * ssl_verify(struct soap *soap, const char *host) { unsigned int status; const char *err = NULL; int r = gnutls_certificate_verify_peers2(soap->session, &status); if (r < 0) err = "Certificate verify error"; else if ((status & GNUTLS_CERT_INVALID)) err = "The certificate is not trusted"; else if ((status & GNUTLS_CERT_SIGNER_NOT_FOUND)) err = "The certificate hasn't got a known issuer"; else if ((status & GNUTLS_CERT_REVOKED)) err = "The certificate has been revoked"; else if (gnutls_certificate_type_get(soap->session) == GNUTLS_CRT_X509) { gnutls_x509_crt_t cert; const gnutls_datum_t *cert_list; unsigned int cert_list_size; if (gnutls_x509_crt_init(&cert) < 0) err = "Could not get X509 certificates"; else if ((cert_list = gnutls_certificate_get_peers(soap->session, &cert_list_size)) == NULL) err = "Could not get X509 certificates"; else if (gnutls_x509_crt_import(cert, &cert_list[0], GNUTLS_X509_FMT_DER) < 0) err = "Error parsing X509 certificate"; else if (!(soap->ssl_flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) && gnutls_x509_crt_get_expiration_time(cert) < time(NULL)) err = "The certificate has expired"; else if (!(soap->ssl_flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) && gnutls_x509_crt_get_activation_time(cert) > time(NULL)) err = "The certificate is not yet activated"; else if (host && !(soap->ssl_flags & SOAP_SSL_SKIP_HOST_CHECK)) { if (!gnutls_x509_crt_check_hostname(cert, host)) err = "Certificate host name mismatch"; } gnutls_x509_crt_deinit(cert); } return err; } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef WITH_NOIO SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_accept(struct soap *soap) { SOAP_SOCKET sk = soap->socket; #ifdef WITH_OPENSSL BIO *bio; int err = SSL_ERROR_NONE; int retries, r, s; ERR_clear_error(); if (!soap_valid_socket(sk)) return soap_set_receiver_error(soap, "SSL/TLS error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR); soap->ssl_flags &= ~SOAP_SSL_CLIENT; if (!soap->ctx && (soap->error = soap->fsslauth(soap)) != SOAP_OK) return soap_closesock(soap); if (!soap->ssl) { soap->ssl = SSL_new(soap->ctx); if (!soap->ssl) { soap_closesock(soap); return soap_set_receiver_error(soap, "SSL/TLS error", "SSL_new() failed in soap_ssl_accept()", SOAP_SSL_ERROR); } } else { SSL_clear(soap->ssl); } bio = BIO_new_socket((int)sk, BIO_NOCLOSE); SSL_set_bio(soap->ssl, bio, bio); /* Default timeout: 10 sec retries, 100 times 0.1 sec */ retries = 100; if (soap->recv_timeout || soap->send_timeout) { int t = soap->recv_timeout > soap->send_timeout ? soap->recv_timeout : soap->send_timeout; if (t > 0) retries = 10 * t; else if (t > -100000) retries = 1; else retries = t/-100000; } SOAP_SOCKNONBLOCK(sk) while ((r = SSL_accept(soap->ssl)) <= 0) { err = SSL_get_error(soap->ssl, r); if (err == SSL_ERROR_WANT_ACCEPT || err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) { if (err == SSL_ERROR_WANT_READ) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; } else { soap->errnum = soap_socket_errno(sk); break; } if (retries-- <= 0) break; } if (!soap->recv_timeout && !soap->send_timeout) SOAP_SOCKBLOCK(sk) if (r <= 0) { soap_set_receiver_error(soap, soap_ssl_error(soap, r, err), "SSL_accept() failed in soap_ssl_accept()", SOAP_SSL_ERROR); return soap_closesock(soap); } 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/TLS error", "No SSL certificate was presented by the peer in soap_ssl_accept()", SOAP_SSL_ERROR); } X509_free(peer); } #endif #ifdef WITH_GNUTLS int retries, r, s; if (!soap_valid_socket(sk)) return soap_set_receiver_error(soap, "SSL/TLS error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR); soap->ssl_flags &= ~SOAP_SSL_CLIENT; if (!soap->session && (soap->error = soap->fsslauth(soap)) != SOAP_OK) return soap_closesock(soap); gnutls_transport_set_ptr(soap->session, (gnutls_transport_ptr_t)(long)sk); /* default timeout: 10 sec retries, 100 times 0.1 sec */ retries = 100; if (soap->recv_timeout || soap->send_timeout) { int t = soap->recv_timeout > soap->send_timeout ? soap->recv_timeout : soap->send_timeout; if (t > 0) retries = 10 * t; else if (t > -100000) retries = 1; else retries = t/-100000; } SOAP_SOCKNONBLOCK(sk) while ((r = gnutls_handshake(soap->session))) { /* GNUTLS repeat handhake when GNUTLS_E_AGAIN */ if (r == GNUTLS_E_AGAIN || r == GNUTLS_E_INTERRUPTED) { if (!gnutls_record_get_direction(soap->session)) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; } else { soap->errnum = soap_socket_errno(sk); break; } if (retries-- <= 0) break; } if (!soap->recv_timeout && !soap->send_timeout) SOAP_SOCKBLOCK(sk) if (r) { soap_set_receiver_error(soap, soap_ssl_error(soap, r, 0), "SSL/TLS handshake failed", SOAP_SSL_ERROR); return soap_closesock(soap); } if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) { const char *err = ssl_verify(soap, NULL); if (err) { soap_closesock(soap); return soap_set_receiver_error(soap, "SSL/TLS error", err, SOAP_SSL_ERROR); } } #endif #ifdef WITH_SYSTEMSSL gsk_iocallback local_io = { ssl_recv, ssl_send, NULL, NULL, NULL, NULL }; int retries, r, s; if (!soap_valid_socket(sk)) return soap_set_receiver_error(soap, "SSL/TLS error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR); soap->ssl_flags &= ~SOAP_SSL_CLIENT; /* default timeout: 10 sec retries, 100 times 0.1 sec */ retries = 100; if (soap->recv_timeout || soap->send_timeout) { int t = soap->recv_timeout > soap->send_timeout ? soap->recv_timeout : soap->send_timeout; if (t > 0) retries = 10 * t; else if (t > -100000) retries = 1; else retries = t/-100000; } SOAP_SOCKNONBLOCK(sk) r = gsk_secure_socket_open(soap->ctx, &soap->ssl); if (r == GSK_OK) r = gsk_attribute_set_numeric_value(soap->ssl, GSK_FD, sk); if (r == GSK_OK) r = gsk_attribute_set_buffer(soap->ssl, GSK_KEYRING_LABEL, soap->cafile, 0); if (r == GSK_OK) r = gsk_attribute_set_enum(soap->ssl, GSK_SESSION_TYPE, GSK_SERVER_SESSION); if (r == GSK_OK) r = gsk_attribute_set_buffer(soap->ssl, GSK_V3_CIPHER_SPECS_EXPANDED, "0035002F000A", 0); if (r == GSK_OK) r = gsk_attribute_set_enum(soap->ssl, GSK_V3_CIPHERS, GSK_V3_CIPHERS_CHAR4); if (r == GSK_OK) r = gsk_attribute_set_callback(soap->ssl, GSK_IO_CALLBACK, &local_io); if (r != GSK_OK) return soap_set_receiver_error(soap, gsk_strerror(r), "SYSTEM SSL error in soap_ssl_accept()", SOAP_SSL_ERROR); while ((r = gsk_secure_socket_init(soap->ssl)) != GSK_OK) { if (r == GSK_WOULD_BLOCK_READ || r == GSK_WOULD_BLOCK_WRITE) { if (r == GSK_WOULD_BLOCK_READ) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; } else { soap->errnum = soap_socket_errno(sk); break; } if (retries-- <= 0) break; } if (!soap->recv_timeout && !soap->send_timeout) SOAP_SOCKBLOCK(sk) if (r != GSK_OK) { soap_set_receiver_error(soap, gsk_strerror(r), "gsk_secure_socket_init() failed in soap_ssl_accept()", SOAP_SSL_ERROR); return soap_closesock(soap); } #endif soap->imode |= SOAP_ENC_SSL; soap->omode |= SOAP_ENC_SSL; return SOAP_OK; } #endif #endif /******************************************************************************\ * * TCP/UDP [SSL/TLS] IPv4 and IPv6 * \******************************************************************************/ #ifndef WITH_NOIO 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 /******************************************************************************/ #ifndef WITH_NOIO static const char* tcp_error(struct soap *soap) { 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 { (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), 37), "TCP/UDP IP error %d", soap->errnum); msg = soap->msgbuf; } } } return msg; } #endif /******************************************************************************/ #if !defined(WITH_IPV6) || defined(WITH_COOKIES) #ifndef WITH_NOIO static int tcp_gethostbyname(struct soap *soap, const char *addr, struct hostent *hostent, struct in_addr *inaddr) { #if (defined(_AIX43) || defined(TRU64) || defined(HP_UX)) && defined(HAVE_GETHOSTBYNAME_R) struct hostent_data ht_data; #elif (!defined(__GLIBC__) || !defined(_GNU_SOURCE) || (!_GNU_SOURCE && !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || defined(__ANDROID__) || defined(FREEBSD) || defined(__FreeBSD__)) && defined(HAVE_GETHOSTBYNAME_R) int r; char *tmpbuf = soap->tmpbuf; size_t tmplen = sizeof(soap->tmpbuf); #elif defined(HAVE_GETHOSTBYNAME_R) char *tmpbuf = soap->tmpbuf; size_t tmplen = sizeof(soap->tmpbuf); #endif #ifdef VXWORKS int hostint; /* vxWorks compatible */ #endif if (inaddr) { soap_int32 iadd = -1; #ifdef AS400 iadd = inet_addr((void*)addr); #else iadd = inet_addr((char*)addr); #endif if (iadd != -1) { if (soap_memcpy((void*)inaddr, sizeof(struct in_addr), (const void*)&iadd, sizeof(iadd))) return soap->error = SOAP_EOM; return SOAP_OK; } } #if (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) { hostent = NULL; soap->errnum = h_errno; } #elif (!defined(__GLIBC__) || !defined(_GNU_SOURCE) || (!_GNU_SOURCE && !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || defined(__ANDROID__) || defined(FREEBSD) || defined(__FreeBSD__)) && defined(HAVE_GETHOSTBYNAME_R) while ((r = gethostbyname_r(addr, hostent, tmpbuf, tmplen, &hostent, &soap->errnum)) < 0) { if (tmpbuf != soap->tmpbuf) SOAP_FREE(soap, tmpbuf); if (r != SOAP_ERANGE) { hostent = NULL; break; } tmplen *= 2; tmpbuf = (char*)SOAP_MALLOC(soap, tmplen); if (!tmpbuf) break; } #elif defined(HAVE_GETHOSTBYNAME_R) hostent = gethostbyname_r(addr, hostent, tmpbuf, tmplen, &soap->errnum); #elif defined(VXWORKS) /* vxWorks compatible */ /* 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) { hostent = NULL; soap->errnum = soap_errno; } #else #ifdef AS400 hostent = gethostbyname((void*)addr); #else hostent = gethostbyname((char*)addr); #endif if (!hostent) soap->errnum = h_errno; #endif if (!hostent) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Host name not found\n")); return SOAP_ERR; } if (inaddr) { #ifdef VXWORKS inaddr->s_addr = hostint; /* vxWorks compatible */ #else if (soap_memcpy((void*)inaddr, sizeof(struct in_addr), (const void*)hostent->h_addr, (size_t)hostent->h_length)) { #if (!defined(__GLIBC__) || !defined(_GNU_SOURCE) || (!_GNU_SOURCE && !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || defined(__ANDROID__) || defined(FREEBSD) || defined(__FreeBSD__)) && defined(HAVE_GETHOSTBYNAME_R) if (tmpbuf && tmpbuf != soap->tmpbuf) SOAP_FREE(soap, tmpbuf); #endif return soap->error = SOAP_EOM; } #endif } #if (!defined(__GLIBC__) || !defined(_GNU_SOURCE) || (!_GNU_SOURCE && !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || defined(__ANDROID__) || defined(FREEBSD) || defined(__FreeBSD__)) && defined(HAVE_GETHOSTBYNAME_R) if (tmpbuf && tmpbuf != soap->tmpbuf) SOAP_FREE(soap, tmpbuf); #endif return SOAP_OK; } #endif #endif /******************************************************************************/ #if !defined(WITH_IPV6) #ifndef WITH_NOIO static int tcp_gethost(struct soap *soap, const char *addr, struct in_addr *inaddr) { struct hostent hostent; return tcp_gethostbyname(soap, addr, &hostent, inaddr); } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO 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 sk; int err = 0; #ifndef WITH_LEAN int set = 1; #endif #if !defined(WITH_LEAN) || defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) int retries; #endif soap->errnum = 0; soap->errmode = 0; if (soap_valid_socket(soap->socket)) { if ((soap->omode & SOAP_IO_UDP) && soap->socket == soap->master) { #ifdef IP_MULTICAST_TTL #ifndef WITH_IPV6 soap->errmode = 2; if (soap->fresolve(soap, host, &soap->peer.in.sin_addr)) { soap_set_receiver_error(soap, tcp_error(soap), "get host by name failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, soap->socket); return soap->socket = SOAP_INVALID_SOCKET; } soap->peer.in.sin_port = htons((short)port); soap->errmode = 0; #else if (getaddrinfo(host, soap_int2s(soap, port), &hints, &res) || !res) { soap_set_receiver_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, soap->socket); return soap->socket = SOAP_INVALID_SOCKET; } if (soap_memcpy((void*)&soap->peer.storage, sizeof(soap->peer.storage), (const void*)res->ai_addr, res->ai_addrlen)) { soap->error = SOAP_EOM; soap->fclosesocket(soap, soap->socket); freeaddrinfo(res); return soap->socket = SOAP_INVALID_SOCKET; } soap->peerlen = res->ai_addrlen; freeaddrinfo(res); #endif if (soap->ipv4_multicast_ttl) { unsigned char ttl = soap->ipv4_multicast_ttl; if (setsockopt(soap->socket, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl, sizeof(ttl))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_TTL failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, soap->socket); return soap->socket = SOAP_INVALID_SOCKET; } } if (soap->ipv4_multicast_if && !soap->ipv6_multicast_if) { if (setsockopt(soap->socket, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) #ifndef WINDOWS { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, soap->socket); return soap->socket = SOAP_INVALID_SOCKET; } #else #ifndef IP_MULTICAST_IF #define IP_MULTICAST_IF 2 #endif if (setsockopt(soap->socket, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, soap->socket); return soap->socket = SOAP_INVALID_SOCKET; } #endif } #endif return soap->socket; } soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; } if (tcp_init(soap)) { soap_set_receiver_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 || !res) { soap_set_receiver_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in tcp_connect()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } ressave = res; again: sk = soap->socket = socket(res->ai_family, res->ai_socktype, res->ai_protocol); soap->error = SOAP_OK; soap->errmode = 0; #else #ifndef WITH_LEAN again: #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) sk = soap->socket = socket(AF_INET, SOCK_DGRAM, 0); else #endif sk = soap->socket = socket(AF_INET, SOCK_STREAM, 0); #endif if (!soap_valid_socket(sk)) { #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } #endif soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "socket failed in tcp_connect()", SOAP_TCP_ERROR); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #ifdef WITH_SOCKET_CLOSE_ON_EXIT #ifdef WIN32 #ifndef UNDER_CE SetHandleInformation((HANDLE)sk, HANDLE_FLAG_INHERIT, 0); #endif #else fcntl(sk, 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(sk, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_LINGER failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return soap->socket = SOAP_INVALID_SOCKET; } } if ((soap->connect_flags & ~SO_LINGER) && setsockopt(sk, SOL_SOCKET, soap->connect_flags & ~SO_LINGER, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #ifndef UNDER_CE if ((soap->keep_alive || soap->tcp_keep_alive) && setsockopt(sk, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } if (soap->sndbuf > 0 && setsockopt(sk, SOL_SOCKET, SO_SNDBUF, (char*)&soap->sndbuf, sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } if (soap->rcvbuf > 0 && setsockopt(sk, SOL_SOCKET, SO_RCVBUF, (char*)&soap->rcvbuf, sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #ifdef TCP_KEEPIDLE if (soap->tcp_keep_idle && setsockopt(sk, IPPROTO_TCP, TCP_KEEPIDLE, (char*)&(soap->tcp_keep_idle), sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_KEEPIDLE failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #endif #ifdef TCP_KEEPINTVL if (soap->tcp_keep_intvl && setsockopt(sk, IPPROTO_TCP, TCP_KEEPINTVL, (char*)&(soap->tcp_keep_intvl), sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_KEEPINTVL failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #endif #ifdef TCP_KEEPCNT if (soap->tcp_keep_cnt && setsockopt(sk, IPPROTO_TCP, TCP_KEEPCNT, (char*)&(soap->tcp_keep_cnt), sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_KEEPCNT failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #endif #ifdef TCP_NODELAY if (!(soap->omode & SOAP_IO_UDP) && setsockopt(sk, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = 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; } #endif #endif #ifdef IP_MULTICAST_TTL if ((soap->omode & SOAP_IO_UDP)) { if (soap->ipv4_multicast_ttl) { unsigned char ttl = soap->ipv4_multicast_ttl; if (setsockopt(sk, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl, sizeof(ttl))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_TTL failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } } if ((soap->omode & SOAP_IO_UDP) && soap->ipv4_multicast_if && !soap->ipv6_multicast_if) { if (setsockopt(sk, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) #ifndef WINDOWS { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #else #ifndef IP_MULTICAST_IF #define IP_MULTICAST_IF 2 #endif if (setsockopt(sk, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #endif } } #endif #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Opening socket=%d to host='%s' port=%d\n", (int)sk, host, port)); #ifndef WITH_IPV6 soap->peerlen = sizeof(soap->peer.in); memset((void*)&soap->peer.in, 0, sizeof(soap->peer.in)); soap->peer.in.sin_family = AF_INET; #ifndef WIN32 if (soap->client_addr) { struct sockaddr_in addr; memset((void*)&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; if (soap->client_port >= 0) addr.sin_port = htons(soap->client_port); if (inet_pton(AF_INET, soap->client_addr, (void*)&addr.sin_addr) != 1 || bind(sk, (struct sockaddr*)&addr, sizeof(addr))) { soap->errnum = soap_socket_errno(sk); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind before connect\n")); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); soap->client_addr = NULL; soap->client_port = -1; return soap->socket = SOAP_INVALID_SOCKET; } soap->client_addr = NULL; /* disable bind before connect, so need to set it again before the next connect */ soap->client_port = -1; /* disable bind before connect, so need to set it again before the next connect */ } else #endif if (soap->client_port >= 0) { struct sockaddr_in addr; memset((void*)&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(soap->client_port); if (bind(sk, (struct sockaddr*)&addr, sizeof(addr))) { soap->errnum = soap_socket_errno(sk); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind before connect\n")); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); soap->client_port = -1; return soap->socket = SOAP_INVALID_SOCKET; } soap->client_port = -1; /* disable bind before connect, so need to set it again before the next connect */ } #ifndef WIN32 if (soap->client_interface) { if (inet_pton(AF_INET, soap->client_interface, &soap->peer.in.sin_addr) != 1) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "inet_pton() failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); soap->client_interface = NULL; return soap->socket = SOAP_INVALID_SOCKET; } soap->client_interface = NULL; /* disable client interface, so need to set it again before the next connect */ } #endif soap->errmode = 2; if (soap->proxy_host) { if (soap->fresolve(soap, soap->proxy_host, &soap->peer.in.sin_addr)) { soap_set_receiver_error(soap, tcp_error(soap), "get proxy host by name failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } soap->peer.in.sin_port = htons((short)soap->proxy_port); } else { if (soap->fresolve(soap, host, &soap->peer.in.sin_addr)) { soap_set_receiver_error(soap, tcp_error(soap), "get host by name failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } soap->peer.in.sin_port = htons((short)port); } soap->errmode = 0; #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) return sk; #endif #else #ifndef WIN32 if (soap->client_addr) { struct sockaddr_in6 addr; memset((void*)&addr, 0, sizeof(addr)); addr.sin6_family = AF_INET6; if ((soap->client_addr_ipv6 && res->ai_family == AF_INET6 && inet_pton(AF_INET6, soap->client_addr_ipv6, (void*)&addr.sin6_addr.s6_addr) == 1) || (!soap->client_addr_ipv6 && inet_pton(AF_INET6, soap->client_addr, (void*)&addr.sin6_addr.s6_addr) == 1) ) { if (soap->client_port >= 0) addr.sin6_port = htons(soap->client_port); if (bind(sk, (struct sockaddr*)&addr, sizeof(addr))) { soap->errnum = soap_socket_errno(sk); freeaddrinfo(ressave); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind before connect\n")); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); soap->client_addr = NULL; soap->client_addr_ipv6 = NULL; soap->client_port = -1; return soap->socket = SOAP_INVALID_SOCKET; } } else /* not an IPv6 address, must be IPv4 */ { struct sockaddr_in addr; memset((void*)&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; if (soap->client_port >= 0) addr.sin_port = htons(soap->client_port); if (inet_pton(AF_INET, soap->client_addr, (void*)&addr.sin_addr) != 1 || bind(sk, (struct sockaddr*)&addr, sizeof(addr))) { soap->errnum = soap_socket_errno(sk); freeaddrinfo(ressave); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind before connect\n")); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); soap->client_addr = NULL; soap->client_addr_ipv6 = NULL; soap->client_port = -1; return soap->socket = SOAP_INVALID_SOCKET; } } soap->client_addr = NULL; /* disable bind before connect, so need to set it again before the next connect */ soap->client_addr_ipv6 = NULL; /* disable bind before connect, so need to set it again before the next connect */ soap->client_port = -1; /* disable bind before connect, so need to set it again before the next connect */ } else #endif if (soap->client_port >= 0) { struct sockaddr_in6 addr; memset((void*)&addr, 0, sizeof(addr)); addr.sin6_family = AF_INET6; addr.sin6_port = htons(soap->client_port); if (bind(sk, (struct sockaddr*)&addr, sizeof(addr))) { soap->errnum = soap_socket_errno(sk); freeaddrinfo(ressave); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind before connect\n")); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); soap->client_port = -1; return soap->socket = SOAP_INVALID_SOCKET; } soap->client_port = -1; /* disable bind before connect, so need to set it again before the next connect */ } #ifndef WIN32 if (soap->client_interface) { if (inet_pton(AF_INET6, soap->client_interface, res->ai_addr) != 1) { if (inet_pton(AF_INET, soap->client_interface, res->ai_addr) != 1) { soap->errnum = soap_socket_errno(sk); freeaddrinfo(ressave); soap_set_receiver_error(soap, tcp_error(soap), "inet_pton() failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); soap->client_interface = NULL; return soap->socket = SOAP_INVALID_SOCKET; } } soap->client_interface = NULL; /* disable client interface, so need to set it again before the next connect */ } #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) { if (soap_memcpy((void*)&soap->peer.storage, sizeof(soap->peer.storage), (const void*)res->ai_addr, res->ai_addrlen)) { soap->error = SOAP_EOM; soap->fclosesocket(soap, sk); soap->socket = sk = SOAP_INVALID_SOCKET; } soap->peerlen = res->ai_addrlen; freeaddrinfo(ressave); return sk; } #endif #endif #ifndef WITH_LEAN if (soap->connect_timeout) SOAP_SOCKNONBLOCK(sk) else SOAP_SOCKBLOCK(sk) retries = 10; #endif for (;;) { #ifdef WITH_IPV6 if (connect(sk, res->ai_addr, (int)res->ai_addrlen)) #else if (connect(sk, &soap->peer.addr, sizeof(soap->peer.in))) #endif { err = soap_socket_errno(sk); #ifdef WITH_IPV6 if (err == SOAP_ECONNREFUSED && res->ai_next) { soap->fclosesocket(soap, sk); res = res->ai_next; goto again; } #endif #ifndef WITH_LEAN if (err == SOAP_EADDRINUSE) { soap->fclosesocket(soap, sk); if (retries-- > 0) goto again; } else if (soap->connect_timeout && (err == SOAP_EINPROGRESS || err == SOAP_EAGAIN || err == SOAP_EWOULDBLOCK)) { SOAP_SOCKLEN_T k; for (;;) { int r; #ifdef WITH_SELF_PIPE r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_PIP, soap->connect_timeout); if ((r & SOAP_TCP_SELECT_PIP)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connection closed by self pipe\n")); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #else r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND, soap->connect_timeout); #endif if (r > 0) break; if (!r) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connect timeout\n")); soap_set_receiver_error(soap, "Timeout", "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } freeaddrinfo(ressave); #endif return soap->socket = SOAP_INVALID_SOCKET; } r = soap->errnum = soap_socket_errno(sk); if (r != SOAP_EINTR) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); soap_set_receiver_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } freeaddrinfo(ressave); #endif return soap->socket = SOAP_INVALID_SOCKET; } } k = (SOAP_SOCKLEN_T)sizeof(soap->errnum); if (!getsockopt(sk, 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(sk); soap_set_receiver_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } freeaddrinfo(ressave); #endif return soap->socket = SOAP_INVALID_SOCKET; } #endif #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; soap->fclosesocket(soap, sk); goto again; } #endif if (err && err != SOAP_EINTR) { soap->errnum = err; #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); soap_set_receiver_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } } else { break; } } #ifdef WITH_IPV6 soap->peerlen = 0; /* IPv6: already connected so use send() */ freeaddrinfo(ressave); #endif soap->imode &= ~SOAP_ENC_SSL; soap->omode &= ~SOAP_ENC_SSL; if (endpoint && !soap_tag_cmp(endpoint, "https:*")) { #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) #ifdef WITH_OPENSSL BIO *bio; #endif #ifdef WITH_SYSTEMSSL gsk_iocallback local_io = { ssl_recv, ssl_send, NULL, NULL, NULL, NULL }; #endif int r; if (soap->proxy_host) { soap_mode m = soap->mode; /* preserve settings */ soap_mode om = soap->omode; /* make sure we only parse HTTP */ ULONG64 n = soap->count; /* save the content length */ const char *userid, *passwd; int status = soap->status; /* save the current status/command */ int keep_alive = soap->keep_alive; /* save the KA status */ soap->omode &= ~SOAP_ENC; /* mask IO and ENC */ soap->omode |= SOAP_IO_BUFFER; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connecting to %s proxy server %s for destination endpoint %s\n", soap->proxy_http_version, soap->proxy_host, endpoint)); #ifdef WITH_NTLM if (soap->ntlm_challenge && soap_ntlm_handshake(soap, SOAP_CONNECT, endpoint, host, port)) { soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #endif if (soap_init_send(soap)) { soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } soap->status = SOAP_CONNECT; if (!soap->keep_alive) soap->keep_alive = -1; /* must keep alive */ soap->error = soap->fpost(soap, endpoint, host, port, NULL, NULL, 0); if (soap->error || soap_end_send_flush(soap)) { soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } soap->keep_alive = keep_alive; soap->omode = om; om = soap->imode; soap->imode &= ~SOAP_ENC; /* mask IO and ENC */ userid = soap->userid; /* preserve */ passwd = soap->passwd; /* preserve */ soap->error = soap->fparse(soap); if (soap->error) { soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } soap->status = status; /* restore */ soap->userid = userid; /* restore */ soap->passwd = passwd; /* restore */ soap->imode = om; /* restore */ soap->count = n; /* restore */ if (soap_init_send(soap)) { soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } if (endpoint) soap_strcpy(soap->endpoint, sizeof(soap->endpoint), endpoint); /* restore */ soap->mode = m; } #ifdef WITH_OPENSSL ERR_clear_error(); soap->ssl_flags |= SOAP_SSL_CLIENT; if (!soap->ctx && (soap->error = soap->fsslauth(soap)) != SOAP_OK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL required, but no ctx set\n")); soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return soap->socket = SOAP_INVALID_SOCKET; } if (!soap->ssl) { soap->ssl = SSL_new(soap->ctx); if (!soap->ssl) { soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return soap->socket = 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; } #if OPENSSL_VERSION_NUMBER >= 0x1000000aL if (!(soap->ssl_flags & SOAP_SSLv3) && !SSL_set_tlsext_host_name(soap->ssl, host)) { soap_set_receiver_error(soap, "SSL/TLS error", "SNI failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #elif (OPENSSL_VERSION_NUMBER >= 0x0090800fL) && defined(SSL_CTRL_SET_TLSEXT_HOSTNAME) if (!SSL_ctrl(soap->ssl, SSL_CTRL_SET_TLSEXT_HOSTNAME, TLSEXT_NAMETYPE_host_name, (void*)host)) { soap_set_receiver_error(soap, "SSL/TLS error", "SNI failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #endif bio = BIO_new_socket((int)sk, BIO_NOCLOSE); SSL_set_bio(soap->ssl, bio, bio); if (soap->connect_timeout || soap->recv_timeout || soap->send_timeout) { /* Set SSL connect timeout and set SSL sockets to non-blocking */ int t = soap->recv_timeout > soap->send_timeout ? soap->recv_timeout : soap->send_timeout; if (soap->connect_timeout > 0 && t < soap->connect_timeout) t = soap->connect_timeout; if (t > 0) retries = 10 * t; else if (t > -100000) retries = 1; else retries = t/-100000; SOAP_SOCKNONBLOCK(sk) } else { /* Set sockets to blocking */ retries = 1; SOAP_SOCKBLOCK(sk) } err = SSL_ERROR_NONE; /* Try connecting until success or timeout */ do { if ((r = SSL_connect(soap->ssl)) <= 0) { err = SSL_get_error(soap->ssl, r); if (err == SSL_ERROR_WANT_CONNECT || err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) { int s; if (err == SSL_ERROR_WANT_READ) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; if (s == 0 && retries-- <= 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL/TLS connect timeout\n")); soap_set_receiver_error(soap, "Timeout", "SSL_connect() failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } } else { soap->errnum = soap_socket_errno(sk); break; } } } while (!SSL_is_init_finished(soap->ssl)); if (r <= 0) { soap_set_sender_error(soap, soap_ssl_error(soap, r, err), "SSL/TLS handshake failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } /* Check server credentials when required */ if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) { if ((err = SSL_get_verify_result(soap->ssl)) != X509_V_OK) { soap_set_sender_error(soap, X509_verify_cert_error_string(err), "SSL/TLS certificate presented by peer cannot be verified in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } if (!(soap->ssl_flags & SOAP_SSL_SKIP_HOST_CHECK)) { X509_NAME *subj; STACK_OF(CONF_VALUE) *val = NULL; #if OPENSSL_VERSION_NUMBER >= 0x0090800fL GENERAL_NAMES *names = NULL; #else int ext_count; #endif int ok = 0; X509 *peer = SSL_get_peer_certificate(soap->ssl); if (!peer) { soap_set_sender_error(soap, "SSL/TLS error", "No SSL/TLS certificate was presented by the peer in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #if OPENSSL_VERSION_NUMBER < 0x0090800fL 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_METHOD*)X509V3_EXT_get(ext); unsigned char *data; if (!meth) break; data = ext->value->data; if (data) { #if OPENSSL_VERSION_NUMBER > 0x00907000L void *ext_data; if (meth->it) ext_data = ASN1_item_d2i(NULL, &data, ext->value->length, ASN1_ITEM_ptr(meth->it)); else { #if OPENSSL_VERSION_NUMBER > 0x0090800fL ext_data = meth->d2i(NULL, (const unsigned char **)&data, ext->value->length); #else ext_data = meth->d2i(NULL, &data, ext->value->length); #endif } if (ext_data) val = meth->i2v(meth, ext_data, NULL); else val = NULL; if (meth->it) ASN1_item_free((ASN1_VALUE*)ext_data, ASN1_ITEM_ptr(meth->it)); else meth->ext_free(ext_data); #else void *ext_data = meth->d2i(NULL, &data, ext->value->length); if (ext_data) val = meth->i2v(meth, ext_data, NULL); meth->ext_free(ext_data); #endif if (val) { int j; 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->name, "IP Address")) && !soap_tag_cmp(host, nval->value)) { ok = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s match with certificate %s %s\n", host, nval->name, nval->value)); break; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s mismatch with certificate %s %s\n", host, nval->name, nval->value)); } } sk_CONF_VALUE_pop_free(val, X509V3_conf_free); } } } if (ok) break; } } #else names = (GENERAL_NAMES*)X509_get_ext_d2i(peer, NID_subject_alt_name, NULL, NULL); if (names) { val = i2v_GENERAL_NAMES(NULL, names, val); sk_GENERAL_NAME_pop_free(names, GENERAL_NAME_free); } if (val) { int j; 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->name, "IP Address")) && !soap_tag_cmp(host, nval->value)) { ok = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s match with certificate %s %s\n", host, nval->name, nval->value)); break; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s mismatch with certificate %s %s\n", host, nval->name, nval->value)); } } sk_CONF_VALUE_pop_free(val, X509V3_conf_free); } #endif if (!ok && (subj = X509_get_subject_name(peer)) != 0) { 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 OPENSSL_VERSION_NUMBER < 0x10100000L const char *tmp = (const char*)ASN1_STRING_data(name); #else const char *tmp = (const char*)ASN1_STRING_get0_data(name); #endif if (!soap_tag_cmp(host, tmp)) { ok = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s match with certificate subject %s\n", host, tmp)); } else { unsigned char *tmp = NULL; ASN1_STRING_to_UTF8(&tmp, name); if (tmp) { if (!soap_tag_cmp(host, (const char*)tmp)) { ok = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s match with certificate subject %s\n", host, tmp)); } else if (tmp[0] == '*') /* wildcard domain */ { const char *t = strchr(host, '.'); if (t && !soap_tag_cmp(t, (const char*)tmp + 1)) { ok = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s match with certificate subject %s\n", host, tmp)); } } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s mismatch with certificate %s\n", host, tmp)); } OPENSSL_free(tmp); } } } } while (!ok); } X509_free(peer); if (!ok) { soap_set_sender_error(soap, "SSL/TLS error", "SSL/TLS certificate host name mismatch in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } } } #endif #ifdef WITH_GNUTLS soap->ssl_flags |= SOAP_SSL_CLIENT; if (!soap->session && (soap->error = soap->fsslauth(soap)) != SOAP_OK) { soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } gnutls_transport_set_ptr(soap->session, (gnutls_transport_ptr_t)(long)sk); if (soap->connect_timeout || soap->recv_timeout || soap->send_timeout) { /* Set SSL connect timeout and set SSL sockets to non-blocking */ int t = soap->recv_timeout > soap->send_timeout ? soap->recv_timeout : soap->send_timeout; if (soap->connect_timeout > 0 && t < soap->connect_timeout) t = soap->connect_timeout; if (t > 0) retries = 10 * t; else if (t > -100000) retries = 1; else retries = t/-100000; SOAP_SOCKNONBLOCK(sk) } else { /* Set sockets to blocking */ retries = 1; SOAP_SOCKBLOCK(sk) } /* Try connecting until success or timeout */ while ((r = gnutls_handshake(soap->session))) { /* GNUTLS repeat handhake when GNUTLS_E_AGAIN */ if (r == GNUTLS_E_AGAIN || r == GNUTLS_E_INTERRUPTED) { int s; if (!gnutls_record_get_direction(soap->session)) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; if (s == 0 && retries-- <= 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL/TLS connect timeout\n")); soap_set_receiver_error(soap, "Timeout", "SSL_connect() failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } } else { soap->errnum = soap_socket_errno(sk); break; } } if (r) { soap_set_sender_error(soap, soap_ssl_error(soap, r, 0), "SSL/TLS handshake failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) { const char *s = ssl_verify(soap, host); if (s) { soap->fclosesocket(soap, sk); soap->error = soap_set_sender_error(soap, "SSL/TLS verify error", s, SOAP_SSL_ERROR); return soap->socket = SOAP_INVALID_SOCKET; } } #endif #ifdef WITH_SYSTEMSSL soap->ssl_flags |= SOAP_SSL_CLIENT; if (!soap->ctx && (soap->error = soap->fsslauth(soap)) != SOAP_OK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL required, but no ctx set\n")); soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return soap->socket = SOAP_INVALID_SOCKET; } if (soap->connect_timeout || soap->recv_timeout || soap->send_timeout) { /* Set SSL connect timeout and set SSL sockets to non-blocking */ int t = soap->recv_timeout > soap->send_timeout ? soap->recv_timeout : soap->send_timeout; if (soap->connect_timeout > 0 && t < soap->connect_timeout) t = soap->connect_timeout; if (t > 0) retries = 10 * t; else if (t > -100000) retries = 1; else retries = t/-100000; SOAP_SOCKNONBLOCK(sk) } else { /* Set sockets to blocking */ retries = 1; SOAP_SOCKBLOCK(sk) } r = gsk_secure_socket_open(soap->ctx, &soap->ssl); if (r == GSK_OK) r = gsk_attribute_set_numeric_value(soap->ssl, GSK_FD, sk); if (r == GSK_OK) r = gsk_attribute_set_buffer(soap->ssl, GSK_KEYRING_LABEL, soap->cafile, 0); /* Certificate label */ if (r == GSK_OK) r = gsk_attribute_set_enum(soap->ssl, GSK_SESSION_TYPE, GSK_CLIENT_SESSION); if (r == GSK_OK) r = gsk_attribute_set_buffer(soap->ssl, GSK_V3_CIPHER_SPECS_EXPANDED, "0035002F000A", 0); if (r == GSK_OK) r = gsk_attribute_set_enum(soap->ssl, GSK_V3_CIPHERS, GSK_V3_CIPHERS_CHAR4); if (r == GSK_OK) r = gsk_attribute_set_callback(soap->ssl, GSK_IO_CALLBACK, &local_io); if (r != GSK_OK) { soap_set_receiver_error(soap, gsk_strerror(r), "SYSTEM SSL error in tcp_connect()", SOAP_SSL_ERROR); return soap->socket = SOAP_INVALID_SOCKET; } /* Try connecting until success or timeout */ while ((r = gsk_secure_socket_init(soap->ssl)) != GSK_OK) { if (r == GSK_WOULD_BLOCK_READ || r == GSK_WOULD_BLOCK_WRITE) { int s; if (r == GSK_WOULD_BLOCK_READ) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; if (s == 0 && retries-- <= 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL/TLS connect timeout\n")); soap_set_receiver_error(soap, "Timeout", "SSL_connect() failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } } else { soap->errnum = soap_socket_errno(sk); break; } } if (r != GSK_OK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL_connect/select error in tcp_connect\n")); soap_set_receiver_error(soap, gsk_strerror(r), "SSL/TLS handshake failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #endif soap->imode |= SOAP_ENC_SSL; soap->omode |= SOAP_ENC_SSL; #else soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return soap->socket = SOAP_INVALID_SOCKET; #endif } if (soap->recv_timeout || soap->send_timeout) SOAP_SOCKNONBLOCK(sk) else SOAP_SOCKBLOCK(sk) return sk; } #endif /******************************************************************************/ #ifndef WITH_NOIO static int tcp_select(struct soap *soap, SOAP_SOCKET sk, int flags, int timeout) { int r; struct timeval tv; fd_set fd[3], *rfd, *sfd, *efd; int retries = 0; int eintr = SOAP_MAXEINTR; soap->errnum = 0; if (!soap_valid_socket(sk)) { soap->error = SOAP_EOF; return -1; } #ifndef WIN32 #if !defined(FD_SETSIZE) || defined(__QNX__) || defined(QNX) /* no FD_SETSIZE or select() is not MT safe on some QNX: always poll */ if (1) #else /* if fd max set size exceeded, use poll() when available */ if ((int)sk >= (int)FD_SETSIZE) #endif #ifdef HAVE_POLL { #ifdef WITH_SELF_PIPE struct pollfd pollfd[2]; pollfd[1].fd = soap->pipe_fd[0]; pollfd[1].events = POLLIN; #else struct pollfd pollfd[1]; #endif pollfd[0].fd = (int)sk; pollfd[0].events = 0; if ((flags & SOAP_TCP_SELECT_RCV)) pollfd[0].events |= POLLIN; if ((flags & SOAP_TCP_SELECT_SND)) pollfd[0].events |= POLLOUT; if ((flags & SOAP_TCP_SELECT_ERR)) pollfd[0].events |= POLLERR; if (timeout <= 0) timeout /= -1000; /* -usec -> ms */ else { retries = timeout - 1; timeout = 1000; } do { #ifdef WITH_SELF_PIPE r = poll(pollfd, 2, timeout); #else r = poll(pollfd, 1, timeout); #endif if (r < 0 && (soap->errnum = soap_socket_errno(sk)) == SOAP_EINTR && eintr > 0) { eintr--; r = 0; } else if (retries-- <= 0) { break; } } while (r == 0); if (r > 0) { r = 0; if ((flags & SOAP_TCP_SELECT_RCV) && (pollfd[0].revents & POLLIN)) r |= SOAP_TCP_SELECT_RCV; if ((flags & SOAP_TCP_SELECT_SND) && (pollfd[0].revents & POLLOUT)) r |= SOAP_TCP_SELECT_SND; if ((flags & SOAP_TCP_SELECT_ERR) && (pollfd[0].revents & POLLERR)) r |= SOAP_TCP_SELECT_ERR; #ifdef WITH_SELF_PIPE if ((flags & SOAP_TCP_SELECT_PIP) && (pollfd[1].revents & POLLIN)) { char ch; for (;;) { if (read(soap->pipe_fd[0], &ch, 1) == -1) { if (soap_socket_errno(soap->pipe_fd[0]) == SOAP_EAGAIN) break; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Self pipe read error\n")); return -1; } } r |= SOAP_TCP_SELECT_PIP; } #endif } else if (r == 0) { soap->errnum = 0; } return r; } #else { soap->error = SOAP_FD_EXCEEDED; return -1; } #endif #endif if (timeout > 0) retries = timeout - 1; do { rfd = sfd = efd = NULL; #ifdef WITH_SELF_PIPE if ((flags & SOAP_TCP_SELECT_PIP) || (flags & SOAP_TCP_SELECT_RCV)) { rfd = &fd[0]; FD_ZERO(rfd); if ((flags & SOAP_TCP_SELECT_PIP)) FD_SET(soap->pipe_fd[0], rfd); if ((flags & SOAP_TCP_SELECT_RCV)) FD_SET(sk, rfd); } #else if ((flags & SOAP_TCP_SELECT_RCV)) { rfd = &fd[0]; FD_ZERO(rfd); FD_SET(sk, rfd); } #endif if ((flags & SOAP_TCP_SELECT_SND)) { sfd = &fd[1]; FD_ZERO(sfd); FD_SET(sk, sfd); } if ((flags & SOAP_TCP_SELECT_ERR)) { efd = &fd[2]; FD_ZERO(efd); FD_SET(sk, efd); } if (timeout <= 0) { tv.tv_sec = -timeout / 1000000; tv.tv_usec = -timeout % 1000000; } else { tv.tv_sec = 1; tv.tv_usec = 0; } #ifdef WITH_SELF_PIPE r = select((int)(sk > soap->pipe_fd[0] ? sk : soap->pipe_fd[0]) + 1, rfd, sfd, efd, &tv); #else r = select((int)sk + 1, rfd, sfd, efd, &tv); #endif if (r < 0 && (soap->errnum = soap_socket_errno(sk)) == SOAP_EINTR && eintr > 0) { eintr--; r = 0; } else if (retries-- <= 0) { break; } } while (r == 0); if (r > 0) { r = 0; if ((flags & SOAP_TCP_SELECT_RCV) && FD_ISSET(sk, rfd)) r |= SOAP_TCP_SELECT_RCV; if ((flags & SOAP_TCP_SELECT_SND) && FD_ISSET(sk, sfd)) r |= SOAP_TCP_SELECT_SND; if ((flags & SOAP_TCP_SELECT_ERR) && FD_ISSET(sk, efd)) r |= SOAP_TCP_SELECT_ERR; #ifdef WITH_SELF_PIPE if ((flags & SOAP_TCP_SELECT_PIP) && FD_ISSET(soap->pipe_fd[0], rfd)) { char ch; for (;;) { if (read(soap->pipe_fd[0], &ch, 1) == -1) { if (soap_socket_errno(soap->pipe_fd[0]) == SOAP_EAGAIN) break; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Self pipe read error\n")); return -1; } } r |= SOAP_TCP_SELECT_PIP; } #endif } else if (r == 0) { soap->errnum = 0; } return r; } #endif /******************************************************************************/ #ifndef WITH_NOIO static SOAP_SOCKET tcp_accept(struct soap *soap, SOAP_SOCKET sk, struct sockaddr *addr, int *len) { SOAP_SOCKET s; (void)soap; s = accept(sk, addr, (SOAP_SOCKLEN_T*)len); /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ #ifdef WITH_SOCKET_CLOSE_ON_EXIT #ifdef WIN32 #ifndef UNDER_CE SetHandleInformation((HANDLE)s, HANDLE_FLAG_INHERIT, 0); #endif #else fcntl(s, F_SETFD, FD_CLOEXEC); #endif #endif return s; } #endif /******************************************************************************/ #ifndef WITH_NOIO static int tcp_disconnect(struct soap *soap) { #ifdef WITH_OPENSSL if (soap->ssl) { int r; if (soap->session) { SSL_SESSION_free(soap->session); soap->session = NULL; } if (*soap->host) { soap->session = SSL_get1_session(soap->ssl); if (soap->session) { soap_strcpy(soap->session_host, sizeof(soap->session_host), soap->host); soap->session_port = soap->port; } } r = SSL_shutdown(soap->ssl); /* SSL shutdown does not work when reads are pending, non-blocking */ if (r == 0) { while (SSL_want_read(soap->ssl)) { if (SSL_read(soap->ssl, NULL, 0) || soap_socket_errno(soap->socket) != SOAP_EAGAIN) { r = SSL_shutdown(soap->ssl); break; } } } if (r == 0) { if (soap_valid_socket(soap->socket)) { if (!soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_WR)) { #if !defined(WITH_LEAN) && !defined(WIN32) /* wait up to 5 seconds for close_notify to be sent by peer (if peer not present, this avoids calling SSL_shutdown() which has a lengthy return timeout) */ r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, 5); if (r <= 0) { soap->errnum = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connection lost...\n")); soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; ERR_clear_error(); SSL_free(soap->ssl); soap->ssl = NULL; return SOAP_OK; } #else r = SSL_shutdown(soap->ssl); if (r <= 0) { 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; } } #endif } } } SSL_free(soap->ssl); soap->ssl = NULL; ERR_clear_error(); } #endif #ifdef WITH_GNUTLS if (soap->session) { gnutls_bye(soap->session, GNUTLS_SHUT_RDWR); gnutls_deinit(soap->session); soap->session = NULL; } #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) { gsk_secure_socket_shutdown(soap->ssl); gsk_secure_socket_close(&soap->ssl); } #endif if (soap_valid_socket(soap->socket) && !(soap->omode & SOAP_IO_UDP)) { soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_RDWR); soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_NOIO static int tcp_closesocket(struct soap *soap, SOAP_SOCKET sk) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Close socket=%d\n", (int)sk)); return soap_closesocket(sk); } #endif /******************************************************************************/ #ifndef WITH_NOIO static int tcp_shutdownsocket(struct soap *soap, SOAP_SOCKET sk, int how) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shutdown socket=%d how=%d\n", (int)sk, how)); return shutdown(sk, how); } #endif /******************************************************************************/ #ifndef WITH_NOIO SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_bind(struct soap *soap, const char *host, int port, int backlog) { #if defined(WITH_IPV6) struct addrinfo *addrinfo = NULL; struct addrinfo hints; struct addrinfo res; int err; int set = 1; int unset = 0; #elif !defined(WITH_LEAN) 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->errnum = 0; 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 = soap->bind_inet6 ? AF_INET6 : 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 (err || !addrinfo) { soap_set_receiver_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in soap_bind()", SOAP_TCP_ERROR); if (addrinfo) freeaddrinfo(addrinfo); return SOAP_INVALID_SOCKET; } res = *addrinfo; if (soap_memcpy((void*)&soap->peer.storage, sizeof(soap->peer.storage), (const void*)addrinfo->ai_addr, addrinfo->ai_addrlen)) { freeaddrinfo(addrinfo); soap->error = SOAP_EOM; return SOAP_INVALID_SOCKET; } soap->peerlen = addrinfo->ai_addrlen; res.ai_addr = &soap->peer.addr; res.ai_addrlen = soap->peerlen; freeaddrinfo(addrinfo); 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; } soap->port = port; #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) soap->socket = soap->master; #endif #ifdef WITH_SOCKET_CLOSE_ON_EXIT #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; } #ifndef UNDER_CE if (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) && (!((soap->imode | soap->omode) & SOAP_IO_UDP)) && setsockopt(soap->master, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) { 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 (soap->sndbuf > 0 && setsockopt(soap->master, SOL_SOCKET, SO_SNDBUF, (char*)&soap->sndbuf, 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 (soap->rcvbuf > 0 && setsockopt(soap->master, SOL_SOCKET, SO_RCVBUF, (char*)&soap->rcvbuf, 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 #ifdef TCP_FASTOPEN if (!(soap->omode & SOAP_IO_UDP) && setsockopt(soap->master, IPPROTO_TCP, TCP_FASTOPEN, (char*)&set, sizeof(int))) { /* silently ignore */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "setsockopt TCP_FASTOPEN failed in soap_bind()\n")); } #endif #endif #endif #ifdef WITH_IPV6 if (res.ai_family == AF_INET6 && setsockopt(soap->master, IPPROTO_IPV6, IPV6_V6ONLY, soap->bind_v6only ? (char*)&set : (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; } 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, bind failed\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.in); memset((void*)&soap->peer.in, 0, sizeof(soap->peer.in)); soap->peer.in.sin_family = AF_INET; soap->errmode = 2; if (host) { if (soap->fresolve(soap, host, &soap->peer.in.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.in.sin_addr.s_addr = htonl(INADDR_ANY); soap->peer.in.sin_port = htons((short)port); soap->errmode = 0; if (bind(soap->master, &soap->peer.addr, (int)soap->peerlen)) { soap->errnum = soap_socket_errno(soap->master); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host, bind failed\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, listen failed\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 /******************************************************************************/ #ifndef WITH_NOIO SOAP_FMAC1 int SOAP_FMAC2 soap_poll(struct soap *soap) { #ifndef WITH_LEAN int r; if (soap_valid_socket(soap->socket)) { r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_ALL, 0); if (r > 0 && (r & SOAP_TCP_SELECT_ERR)) r = -1; } else if (soap_valid_socket(soap->master)) { r = tcp_select(soap, soap->master, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, 0); } else { return SOAP_OK; /* OK when no socket! */ } if (r > 0) { int t; #ifdef WITH_OPENSSL if ((soap->imode & SOAP_ENC_SSL) && soap->ssl) { if (soap_valid_socket(soap->socket) && (r & SOAP_TCP_SELECT_SND) && (!(r & SOAP_TCP_SELECT_RCV) || SSL_peek(soap->ssl, (char*)&t, 1) > 0)) return SOAP_OK; } else #endif { if (soap_valid_socket(soap->socket) && (r & SOAP_TCP_SELECT_SND) && (!(r & SOAP_TCP_SELECT_RCV) || recv(soap->socket, (char*)&t, 1, MSG_PEEK) > 0)) return SOAP_OK; } } else if (r < 0) { if ((soap_valid_socket(soap->master) && soap_socket_errno(soap->master) != SOAP_EINTR) || (soap_valid_socket(soap->socket) && soap_socket_errno(soap->socket) != SOAP_EINTR)) return soap_set_receiver_error(soap, tcp_error(soap), "select failed in soap_poll()", SOAP_TCP_ERROR); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_poll: other end down on socket=%d select=%d\n", (int)soap->socket, r)); return SOAP_EOF; #else (void)soap; return SOAP_OK; #endif } #endif /******************************************************************************/ #ifndef WITH_NOIO SOAP_FMAC1 int SOAP_FMAC2 soap_ready(struct soap *soap) { #ifndef WITH_LEAN int r; if (!soap_valid_socket(soap->socket)) return SOAP_OK; /* OK when no socket! */ r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, 0); if (r > 0 && (r & SOAP_TCP_SELECT_ERR)) r = -1; if (r < 0 && soap_socket_errno(soap->socket) != SOAP_EINTR) return soap_set_receiver_error(soap, tcp_error(soap), "select failed in soap_ready()", SOAP_TCP_ERROR); if (r > 0) { char t; #ifdef WITH_OPENSSL if ((soap->imode & SOAP_ENC_SSL) && soap->ssl) { if (SSL_peek(soap->ssl, &t, 1) > 0) return SOAP_OK; } else #endif { if (recv(soap->socket, &t, 1, MSG_PEEK) > 0) return SOAP_OK; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_ready: other end not ready to send on socket=%d select=%d\n", (int)soap->socket, r)); return SOAP_EOF; #else (void)soap; return SOAP_OK; #endif } #endif /******************************************************************************/ #ifndef WITH_NOIO SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_accept(struct soap *soap) { int n = (int)sizeof(soap->peer); int err; #ifndef WITH_LEAN int set = 1; #endif soap->error = SOAP_OK; memset((void*)&soap->peer, 0, sizeof(soap->peer)); soap->socket = SOAP_INVALID_SOCKET; soap->errmode = 0; soap->errnum = 0; soap->keep_alive = 0; if (!soap_valid_socket(soap->master)) { soap_set_receiver_error(soap, tcp_error(soap), "no master socket in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) return soap->socket = soap->master; #endif for (;;) { if (soap->accept_timeout) { for (;;) { int r; r = tcp_select(soap, soap->master, SOAP_TCP_SELECT_ALL, soap->accept_timeout); if (r > 0) break; if (!r) { soap_set_receiver_error(soap, "Timeout", "accept failed in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } if (r < 0) { r = soap->errnum; if (r != SOAP_EINTR) { soap_closesock(soap); soap_set_receiver_error(soap, tcp_error(soap), "accept failed in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } } } } n = (int)sizeof(soap->peer); soap->socket = soap->faccept(soap, soap->master, &soap->peer.addr, &n); soap->peerlen = (size_t)n; if (soap_valid_socket(soap->socket)) { #ifdef WITH_IPV6 char port[16]; struct addrinfo *res = NULL; struct addrinfo hints; memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_NUMERICHOST | AI_NUMERICSERV; getnameinfo(&soap->peer.addr, n, soap->host, sizeof(soap->host), port, sizeof(port), NI_NUMERICHOST | NI_NUMERICSERV); soap->ip = 0; soap->ip6[0] = 0; soap->ip6[1] = 0; soap->ip6[2] = 0; soap->ip6[3] = 0; if (getaddrinfo(soap->host, NULL, &hints, &res) == 0 && res) { struct sockaddr_storage result; (void)soap_memcpy(&result, sizeof(result), res->ai_addr, res->ai_addrlen); freeaddrinfo(res); if (result.ss_family == AF_INET6) { struct sockaddr_in6 *addr = (struct sockaddr_in6*)&result; struct in6_addr *inaddr = &addr->sin6_addr; int i; for (i = 0; i < 16; i++) soap->ip6[i/4] = (soap->ip6[i/4] << 8) + inaddr->s6_addr[i]; } else if (result.ss_family == AF_INET) { struct sockaddr_in *addr = (struct sockaddr_in*)&result; soap->ip = ntohl(addr->sin_addr.s_addr); soap->ip6[2] = 0xFFFF; soap->ip6[3] = soap->ip; } } soap->port = soap_strtol(port, NULL, 10); #else soap->ip = ntohl(soap->peer.in.sin_addr.s_addr); soap->ip6[0] = 0; soap->ip6[1] = 0; soap->ip6[2] = 0xFFFF; soap->ip6[3] = soap->ip; (SOAP_SNPRINTF(soap->host, sizeof(soap->host), 80), "%u.%u.%u.%u", (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF); soap->port = (int)ntohs(soap->peer.in.sin_port); /* does not return port number on some systems */ #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Accept socket=%d at port=%d from IP='%s'\n", (int)soap->socket, soap->port, soap->host)); #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; } } if ((soap->accept_flags & ~SO_LINGER) && setsockopt(soap->socket, SOL_SOCKET, soap->accept_flags & ~SO_LINGER, (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; } #ifndef UNDER_CE 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 (soap->sndbuf > 0 && setsockopt(soap->socket, SOL_SOCKET, SO_SNDBUF, (char*)&soap->sndbuf, 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 (soap->rcvbuf > 0 && setsockopt(soap->socket, SOL_SOCKET, SO_RCVBUF, (char*)&soap->rcvbuf, 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 (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 #endif soap->keep_alive = -(((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) != 0); if (soap->send_timeout || soap->recv_timeout) SOAP_SOCKNONBLOCK(soap->socket) else SOAP_SOCKBLOCK(soap->socket) 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; } } } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_closesock(struct soap *soap) { int status = soap->error; int err = SOAP_OK; soap->part = SOAP_END; #ifndef WITH_LEANER if (status && status < 200) /* attachment state is not to be trusted */ { soap->mime.first = NULL; soap->mime.last = NULL; soap->dime.first = NULL; soap->dime.last = NULL; } #endif if (soap->fdisconnect) err = soap->fdisconnect(soap); if (err || status == SOAP_EOF || status == SOAP_TCP_ERROR || status == SOAP_SSL_ERROR || !soap->keep_alive) { soap->keep_alive = 0; if (soap->fclose && (soap->error = soap->fclose(soap)) != SOAP_OK) return soap->error; if (err) return soap->error = err; } #ifdef WITH_ZLIB if (!(soap->mode & SOAP_MIME_POSTCHECK)) { 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; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_force_closesock(struct soap *soap) { soap->keep_alive = 0; if (soap_valid_socket(soap->socket) && soap->fclosesocket) { soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; } return soap->error; } /******************************************************************************/ #ifdef WITH_SELF_PIPE SOAP_FMAC1 void SOAP_FMAC2 soap_close_connection(struct soap *soap) { if (soap_valid_socket(soap->socket)) write(soap->pipe_fd[1], "1", 1); } #endif /******************************************************************************/ #ifndef WITH_NOIO 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 /******************************************************************************/ 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%s\n", soap->state == SOAP_COPY ? " copy" : "")); soap_free_temp(soap); while (soap->clist) { struct soap_clist *p = soap->clist->next; SOAP_FREE(soap, soap->clist); soap->clist = p; } if (soap->state == SOAP_INIT) soap->omode &= ~SOAP_IO_UDP; /* to force close the socket */ soap->keep_alive = 0; /* to force close the socket */ if (soap->master == soap->socket) /* do not close twice */ soap->master = SOAP_INVALID_SOCKET; soap_closesock(soap); #ifdef WITH_COOKIES soap_free_cookies(soap); #endif while (soap->plugins) { 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; #ifndef WITH_NOHTTP soap->fpost = http_post; soap->fget = http_get; soap->fput = http_put; soap->fpatch = http_patch; soap->fdel = http_del; soap->fopt = http_200; soap->fhead = http_200; 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->fsvalidate = NULL; soap->fwvalidate = NULL; soap->feltbegin = NULL; soap->feltendin = NULL; soap->feltbegout = NULL; soap->feltendout = NULL; soap->fprepareinitsend = NULL; soap->fprepareinitrecv = NULL; soap->fpreparesend = NULL; soap->fpreparerecv = NULL; soap->fpreparefinalsend = NULL; soap->fpreparefinalrecv = NULL; soap->ffiltersend = NULL; soap->ffilterrecv = 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; } } ERR_clear_error(); # if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER) /* OpenSSL libraries handle thread init and deinit */ # elif OPENSSL_VERSION_NUMBER >= 0x10000000L ERR_remove_thread_state(NULL); # else ERR_remove_state(0); # endif #endif #ifdef WITH_GNUTLS if (soap->state == SOAP_INIT) { if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } if (soap->acred) { gnutls_anon_free_client_credentials(soap->acred); soap->acred = NULL; } if (soap->cache) { gnutls_priority_deinit(soap->cache); soap->cache = NULL; } if (soap->dh_params) { gnutls_dh_params_deinit(soap->dh_params); soap->dh_params = NULL; } # if GNUTLS_VERSION_NUMBER < 0x030300 if (soap->rsa_params) { gnutls_rsa_params_deinit(soap->rsa_params); soap->rsa_params = NULL; } #endif } if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) gsk_secure_socket_close(&soap->ssl); if (soap->state == SOAP_INIT) if (soap->ctx) gsk_environment_close(&soap->ctx); #endif #ifdef WITH_C_LOCALE SOAP_FREELOCALE(soap); #endif #ifdef WITH_ZLIB if (soap->d_stream) { SOAP_FREE(soap, soap->d_stream); soap->d_stream = NULL; } if (soap->z_buf) { SOAP_FREE(soap, 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++) { soap_close_logfile(soap, i); if (soap->logfile[i]) { SOAP_FREE_UNMANAGED(soap->logfile[i]); soap->logfile[i] = NULL; } } #endif #ifdef WITH_SELF_PIPE close(soap->pipe_fd[0]); close(soap->pipe_fd[1]); #endif #ifdef SOAP_MEM_DEBUG soap_free_mht(soap); #endif soap->state = SOAP_NONE; } /******************************************************************************\ * * HTTP * \******************************************************************************/ #ifndef WITH_NOHTTP static int http_parse(struct soap *soap) { char header[SOAP_HDRLEN], *s; int err = SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Waiting for HTTP request/response...\n")); soap->fform = NULL; *soap->endpoint = '\0'; soap->bearer = NULL; #ifdef WITH_NTLM if (!soap->ntlm_challenge) #endif { soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; } #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif soap->proxy_from = NULL; soap->cors_origin = NULL; soap->cors_method = NULL; soap->cors_header = NULL; do { soap->length = 0; soap->http_content = NULL; soap->action = NULL; soap->status = 0; soap->body = 1; if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf))) { if (soap->error == SOAP_EOF) return SOAP_EOF; return soap->error = 414; } s = strchr(soap->msgbuf, ' '); if (s) { soap->status = (unsigned short)soap_strtoul(s, &s, 10); if (!soap_coblank((soap_wchar)*s)) soap->status = 0; } 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, try to 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'; soap->error = soap->fparsehdr(soap, header, s); if (soap->error) { if (soap->error < SOAP_STOP) return soap->error; err = soap->error; soap->error = SOAP_OK; } } } } while (soap->status == 100); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Finished HTTP header parsing, status = %d\n", soap->status)); s = strstr(soap->msgbuf, "HTTP/"); if (s && s[5] == '1' && s[6] == '.' && s[7] == '0') { soap->keep_alive = 0; /* HTTP 1.0 does not support keep-alive */ if (soap->status == 0 && (soap->omode & SOAP_IO) == SOAP_IO_CHUNK) /* soap->status == 0 for HTTP request */ soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE; /* HTTP 1.0 does not support chunked transfers */ } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Keep alive connection = %d\n", soap->keep_alive)); if (soap->status == 0) { size_t l = 0; if (s) { if (!strncmp(soap->msgbuf, "POST ", l = 5)) soap->status = SOAP_POST; else if (!strncmp(soap->msgbuf, "GET ", l = 4)) soap->status = SOAP_GET; else if (!strncmp(soap->msgbuf, "PUT ", l = 4)) soap->status = SOAP_PUT; else if (!strncmp(soap->msgbuf, "PATCH ", l = 4)) soap->status = SOAP_PATCH; else if (!strncmp(soap->msgbuf, "DELETE ", l = 7)) soap->status = SOAP_DEL; else if (!strncmp(soap->msgbuf, "HEAD ", l = 5)) soap->status = SOAP_HEAD; else if (!strncmp(soap->msgbuf, "OPTIONS ", l = 8)) soap->status = SOAP_OPTIONS; } if (s && soap->status) { size_t m, n, k; int r; while (soap->msgbuf[l] && soap_coblank((soap_wchar)soap->msgbuf[l])) l++; m = strlen(soap->endpoint); n = m + (s - soap->msgbuf) - l - 1; if (n >= sizeof(soap->endpoint)) n = sizeof(soap->endpoint) - 1; if (m > n) m = n; k = n - m + 1; if (k >= sizeof(soap->path)) k = sizeof(soap->path) - 1; while (k > 0 && soap_coblank((soap_wchar)soap->msgbuf[l + k - 1])) k--; if (soap_strncpy(soap->path, sizeof(soap->path), soap->msgbuf + l, k)) return soap->error = 414; if (*soap->path && *soap->path != '/') r = soap_strncpy(soap->endpoint, sizeof(soap->endpoint), soap->path, k); else r = soap_strncat(soap->endpoint, sizeof(soap->endpoint), soap->path, k); if (r) return soap->error = 414; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Target endpoint='%s' path='%s'\n", soap->endpoint, soap->path)); if (err) return soap->error = err; } else if (err) { return soap->error = err; } else if (s) { return soap->error = 405; } return SOAP_OK; } if ((soap->status >= 200 && soap->status <= 299) /* OK, Accepted, etc */ || soap->status == 400 /* Bad Request */ || soap->status == 500) /* Internal Server Error */ return soap->error = SOAP_OK; return soap->error = soap->status; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_parse_header(struct soap *soap, const char *key, const char *val) { if (!soap_tag_cmp(key, "Host")) { #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) if ((soap->imode & SOAP_ENC_SSL)) soap_strcpy(soap->endpoint, sizeof(soap->endpoint), "https://"); else #endif soap_strcpy(soap->endpoint, sizeof(soap->endpoint), "http://"); if (soap_strncat(soap->endpoint, sizeof(soap->endpoint), val, sizeof(soap->endpoint) - 9)) return soap->error = SOAP_HDR; } #ifndef WITH_LEANER else if (!soap_tag_cmp(key, "Content-Type")) { const char *action; soap->http_content = soap_strdup(soap, val); if (soap_http_header_attribute(soap, val, "application/dime")) soap->imode |= SOAP_ENC_DIME; else if (soap_http_header_attribute(soap, val, "multipart/related") || soap_http_header_attribute(soap, val, "multipart/form-data")) { const char *type; soap->mime.boundary = soap_strdup(soap, soap_http_header_attribute(soap, val, "boundary")); soap->mime.start = soap_strdup(soap, soap_http_header_attribute(soap, val, "start")); soap->imode |= SOAP_ENC_MIME; type = soap_http_header_attribute(soap, val, "type"); if (type && !strcmp(type, "application/xop+xml")) soap->imode |= SOAP_ENC_MTOM; } action = soap_http_header_attribute(soap, val, "action"); if (action) { if (*action == '"') { soap->action = soap_strdup(soap, action + 1); if (soap->action && *soap->action) 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_strtoull(val, NULL, 10); if (soap->length == 0) soap->body = 0; } 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_http_header_attribute(soap, val, "gzip")) soap->zlib_out = SOAP_ZLIB_GZIP; else #endif if (strchr(val, '*') || soap_http_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, "close")) soap->keep_alive = 0; } #if !defined(WITH_LEAN) || defined(WITH_NTLM) else if (!soap_tag_cmp(key, "Authorization") || !soap_tag_cmp(key, "Proxy-Authorization")) { #ifdef WITH_NTLM if (!soap_tag_cmp(val, "NTLM*")) { soap->ntlm_challenge = soap_strdup(soap, val + 4); } else #endif if (!soap_tag_cmp(val, "Bearer *")) { soap->bearer = soap_strdup(soap, val + 7); } else 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'; s = strchr(soap->tmpbuf, ':'); if (s) { *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_tag_cmp(key, "Proxy-Authenticate")) { #ifdef WITH_NTLM if (!soap_tag_cmp(val, "NTLM*")) soap->ntlm_challenge = soap_strdup(soap, val + 4); else #endif soap->authrealm = soap_strdup(soap, soap_http_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_OK || (soap->error = soap->fposthdr(soap, NULL, NULL)) != SOAP_OK) return soap->error; } } #endif else if (!soap_tag_cmp(key, "SOAPAction")) { if (*val == '"') { soap->action = soap_strdup(soap, val + 1); if (*soap->action) soap->action[strlen(soap->action) - 1] = '\0'; } else soap->action = soap_strdup(soap, val); } else if (!soap_tag_cmp(key, "Location")) { soap_strcpy(soap->endpoint, sizeof(soap->endpoint), val); } else if (!soap_tag_cmp(key, "X-Forwarded-For")) { soap->proxy_from = soap_strdup(soap, val); } else if (!soap_tag_cmp(key, "Origin")) { soap->origin = soap_strdup(soap, val); soap->cors_origin = soap->cors_allow; } else if (!soap_tag_cmp(key, "Access-Control-Request-Method")) { soap->cors_method = soap_strdup(soap, val); } else if (!soap_tag_cmp(key, "Access-Control-Request-Headers")) { soap->cors_header = 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 /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) SOAP_FMAC1 const char* SOAP_FMAC2 soap_http_header_attribute(struct soap *soap, const char *line, const char *key) { const char *s = line; if (s) { while (*s) { 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 /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_key(char *buf, size_t len, const char *val) { return soap_decode(buf, len, val, "=,;"); } #endif /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) 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 /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) static const char * soap_decode(char *buf, size_t len, const char *val, const char *sep) { const char *s; char *t = buf; size_t i = len; for (s = val; *s; s++) if (*s != ' ' && *s != '\t' && !strchr(sep, *s)) break; if (len > 0) { if (*s == '"') { s++; while (*s && *s != '"' && --i) *t++ = *s++; } else { while (*s && !strchr(sep, *s) && --i) { if (*s == '%' && s[1] && s[2]) { *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++; } } buf[len - 1] = '\0'; /* appease static checkers that get confused */ } *t = '\0'; while (*s && !strchr(sep, *s)) s++; return s; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static const char* http_error(struct soap *soap, int status) { const char *msg = SOAP_STR_EOS; (void)soap; (void)status; #ifndef WITH_LEAN msg = soap_code_str(h_http_error_codes, status); if (!msg) msg = SOAP_STR_EOS; #endif return msg; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_get(struct soap *soap) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP GET request\n")); return SOAP_GET_METHOD; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_put(struct soap *soap) { (void)soap; return SOAP_PUT_METHOD; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_patch(struct soap *soap) { (void)soap; return SOAP_PATCH_METHOD; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_del(struct soap *soap) { (void)soap; return SOAP_DEL_METHOD; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_200(struct soap *soap) { if (soap->origin && soap->cors_method) /* CORS Origin and Access-Control-Request-Method headers */ { soap->cors_origin = soap->cors_allow; /* modify this code or hook your own soap->fopt() callback with logic */ soap->cors_methods = "GET, PUT, PATCH, POST, HEAD, OPTIONS"; soap->cors_headers = soap->cors_header; } return soap_send_empty_response(soap, 200); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_post(struct soap *soap, const char *endpoint, const char *host, int port, const char *path, const char *action, ULONG64 count) { const char *s; int err; size_t l; switch (soap->status) { case SOAP_GET: s = "GET"; break; case SOAP_PUT: s = "PUT"; break; case SOAP_PATCH: s = "PATCH"; break; case SOAP_DEL: s = "DELETE"; break; case SOAP_CONNECT: s = "CONNECT"; break; case SOAP_HEAD: s = "HEAD"; break; case SOAP_OPTIONS: s = "OPTIONS"; break; default: s = "POST"; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP %s to %s\n", s, endpoint ? endpoint : "(null)")); if (!endpoint || (soap_tag_cmp(endpoint, "http:*") && soap_tag_cmp(endpoint, "https:*") && soap_tag_cmp(endpoint, "httpg:*"))) return SOAP_OK; /* set l to prevent overruns ('host' and 'soap->host' are substrings of 'endpoint') */ l = strlen(endpoint) + strlen(soap->http_version) + 80; if (l > sizeof(soap->tmpbuf)) return soap->error = SOAP_EOM; if (soap->status == SOAP_CONNECT) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s %s:%d HTTP/%s", s, soap->host, soap->port, soap->http_version); else if (soap->proxy_host && endpoint) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s %s HTTP/%s", s, endpoint, soap->http_version); else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s /%s HTTP/%s", s, (*path == '/' ? path + 1 : path), soap->http_version); err = soap->fposthdr(soap, soap->tmpbuf, NULL); if (err) return err; #ifdef WITH_OPENSSL if ((soap->ssl && port != 443) || (!soap->ssl && port != 80)) #else if (port != 80) #endif { #ifdef WITH_IPV6 if (*host != '[' && strchr(host, ':')) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "[%s]:%d", host, port); /* RFC 2732 */ else #endif (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s:%d", host, port); } else { #ifdef WITH_IPV6 if (*host != '[' && strchr(host, ':')) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "[%s]", host); /* RFC 2732 */ else #endif soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), host); } err = soap->fposthdr(soap, "Host", soap->tmpbuf); if (err) return err; err = soap->fposthdr(soap, "User-Agent", "gSOAP/2.8"); if (err) return err; if (soap->origin) { err = soap->fposthdr(soap, "Origin", soap->origin); if (err) return err; if (soap->status == SOAP_OPTIONS) { err = soap->fposthdr(soap, "Access-Control-Request-Method", soap->cors_method ? soap->cors_method : "POST"); if (err) return err; if (soap->cors_header) { err = soap->fposthdr(soap, "Access-Control-Request-Headers", soap->cors_header); if (err) return err; } } } err = soap_puthttphdr(soap, SOAP_OK, count); if (err) return err; #ifndef WITH_LEANER if ((soap->imode & SOAP_ENC_MTOM)) { err = soap->fposthdr(soap, "Accept", "multipart/related,application/xop+xml,*/*;q=0.8"); if (err) return err; } #endif #ifdef WITH_ZLIB #ifdef WITH_GZIP err = soap->fposthdr(soap, "Accept-Encoding", "gzip,deflate"); #else err = soap->fposthdr(soap, "Accept-Encoding", "deflate"); #endif if (err) return err; #endif #if !defined(WITH_LEAN) || defined(WITH_NTLM) if (soap->bearer) { l = strlen(soap->bearer); (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l + 1), "Bearer %s", soap->bearer); err = soap->fposthdr(soap, "Authorization", soap->tmpbuf); if (err) return err; } #ifdef WITH_NTLM if (soap->ntlm_challenge) { l = strlen(soap->ntlm_challenge); if (l) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l + 5), "NTLM %s", soap->ntlm_challenge); if (soap->proxy_host) { err = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf); if (err) return err; } else { err = soap->fposthdr(soap, "Authorization", soap->tmpbuf); if (err) return err; } } } else { #endif if (soap->userid && soap->passwd) { soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "Basic "); (SOAP_SNPRINTF(soap->tmpbuf + 262, sizeof(soap->tmpbuf) - 262, strlen(soap->userid) + strlen(soap->passwd) + 1), "%s:%s", soap->userid, soap->passwd); soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, (int)strlen(soap->tmpbuf + 262)); err = soap->fposthdr(soap, "Authorization", soap->tmpbuf); if (err) return err; } if (soap->proxy_userid && soap->proxy_passwd) { soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "Basic "); (SOAP_SNPRINTF(soap->tmpbuf + 262, sizeof(soap->tmpbuf) - 262, strlen(soap->proxy_userid) + strlen(soap->proxy_passwd) + 1), "%s:%s", soap->proxy_userid, soap->proxy_passwd); soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, (int)strlen(soap->tmpbuf + 262)); err = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf); if (err) return err; } #ifdef WITH_NTLM } #endif #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 (action && soap->status != SOAP_GET && soap->status != SOAP_DEL) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(action) + 2), "\"%s\"", action); err = soap->fposthdr(soap, "SOAPAction", soap->tmpbuf); if (err) return err; } return soap->fposthdr(soap, NULL, NULL); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_send_header(struct soap *soap, const char *s) { 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 /******************************************************************************/ #ifndef WITH_NOHTTP 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 /******************************************************************************/ #ifndef WITH_NOHTTP static int http_response(struct soap *soap, int status, ULONG64 count) { int err; char http[32]; int code = status; const char *line; #ifdef WMW_RPM_IO if (soap->rpmreqid) httpOutputEnable(soap->rpmreqid); if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket) || soap->recvfd != 0 || soap->sendfd != 1 || soap->os) /* RPM behaves as if standalone */ #else if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket) #ifndef UNDER_CE || soap->recvfd != 0 || soap->sendfd != 1 #else || soap->recvfd != stdin || soap->sendfd != stdout #endif || soap->os) /* standalone server application (over sockets), not CGI (over stdin/out) */ #endif (SOAP_SNPRINTF(http, sizeof(http), strlen(soap->http_version) + 5), "HTTP/%s", soap->http_version); else soap_strcpy(http, sizeof(http), "Status:"); if (status >= SOAP_FILE && status < SOAP_FILE + 600) { code = status - SOAP_FILE; if (code == 0) code = 200; } else if (!status || status == SOAP_HTML) { if (count || ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK)) code = 200; else code = 202; } else if (status < 200 || status >= 600) { const char *s = *soap_faultcode(soap); if (status >= SOAP_GET_METHOD && status <= SOAP_HTTP_METHOD) code = 405; else if (soap->version == 2 && (!s || !strcmp(s, "SOAP-ENV:Sender"))) code = 400; else code = 500; } line = http_error(soap, code); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP Status = %d %s\n", code, line)); (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), sizeof(http) + 22 + strlen(line)), "%s %d %s", http, code, line); err = soap->fposthdr(soap, soap->tmpbuf, NULL); if (err) return err; #ifndef WITH_LEAN if (status == 401) { (SOAP_SNPRINTF_SAFE(soap->tmpbuf, sizeof(soap->tmpbuf)), "Basic realm=\"%s\"", (soap->authrealm && strlen(soap->authrealm) + 14 < sizeof(soap->tmpbuf)) ? soap->authrealm : "gSOAP Web Service"); err = soap->fposthdr(soap, "WWW-Authenticate", soap->tmpbuf); if (err) return err; } else if ((status >= 301 && status <= 303) || status == 307) { err = soap->fposthdr(soap, "Location", soap->endpoint); if (err) return err; } #endif err = soap->fposthdr(soap, "Server", "gSOAP/2.8"); if (err) return err; if (soap->cors_origin) { err = soap->fposthdr(soap, "Access-Control-Allow-Origin", soap->cors_origin); if (err) return err; err = soap->fposthdr(soap, "Access-Control-Allow-Credentials", "true"); if (err) return err; if (soap->cors_methods) { err = soap->fposthdr(soap, "Access-Control-Allow-Methods", soap->cors_methods); if (err) return err; if (soap->cors_headers) { err = soap->fposthdr(soap, "Access-Control-Allow-Headers", soap->cors_headers); if (err) return err; } } } if (soap->x_frame_options) { err = soap->fposthdr(soap, "X-Frame-Options", soap->x_frame_options); if (err) return err; } soap->cors_origin = NULL; soap->cors_methods = NULL; soap->cors_headers = NULL; err = soap_puthttphdr(soap, status, count); if (err) return err; #ifdef WITH_COOKIES if (soap_putsetcookies(soap)) return soap->error; soap_free_cookies(soap); #endif return soap->fposthdr(soap, NULL, NULL); } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_response(struct soap *soap, int status) { ULONG64 count; if (!(soap->omode & (SOAP_ENC_PLAIN | SOAP_IO_STORE /* this tests for chunking too */)) && (status == SOAP_HTML || (status >= SOAP_FILE && status < SOAP_FILE + 600))) soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE; soap->status = status; count = soap_count_attachments(soap); if (soap_init_send(soap)) return soap->error; #ifndef WITH_NOHTTP if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_PLAIN)) { int k = soap->mode; soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB); if ((k & SOAP_IO) != SOAP_IO_FLUSH) soap->mode |= SOAP_IO_BUFFER; soap->error = soap->fresponse(soap, status, count); if (soap->error) return soap->error; #ifndef WITH_LEANER if ((k & SOAP_IO) == SOAP_IO_CHUNK) { if (soap_flush(soap)) return soap->error; } #endif soap->mode = k; } #endif #ifndef WITH_LEANER if (soap_begin_attachments(soap)) return soap->error; #endif return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_extend_url(struct soap *soap, const char *s, const char *t) { if (s) soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), s); else *soap->msgbuf = '\0'; if (t && (*t == '/' || *t == '?')) { char *r = strchr(soap->msgbuf, '?'); if (r) { if (*t == '?') { soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), "&"); soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), t + 1); } else /* *t == '/' */ { size_t l = r - soap->msgbuf; *r = '\0'; soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), t); if (s) soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), s + l); } } else { soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), t); } } return soap->msgbuf; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_extend_url_query(struct soap *soap, const char *s, const char *t) { (void)soap_extend_url(soap, s, t); /* fills and returns soap->msgbuf */ if (strchr(soap->msgbuf, '?')) soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), "&"); else soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), "?"); return soap->msgbuf; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_url_query(struct soap *soap, const char *s, const char *t) { size_t n = strlen(s); if (n) { char *r = soap->msgbuf; size_t k = n - (s[n-1] == '='); while ((r = strchr(r, '{')) != NULL) if (!strncmp(++r, s, k) && r[k] == '}') break; if (r) { size_t m = t ? strlen(t) : 0; (void)soap_memmove(r + m - 1, soap->msgbuf + sizeof(soap->msgbuf) - (r + n + 1), r + k + 1, strlen(r + k + 1) + 1); if (m) (void)soap_memmove(r - 1, soap->msgbuf + sizeof(soap->msgbuf) - (r - 1), t, m); } else { soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), s); if (t) { int m = (int)strlen(soap->msgbuf); /* msgbuf length is max SOAP_TMPLEN or just 1024 bytes */ (void)soap_encode_url(t, soap->msgbuf + m, (int)sizeof(soap->msgbuf) - m); } soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), "&"); } } } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_encode_url(const char *s, char *t, int len) { int c; int n = len; if (s && n > 0) { while ((c = *s++) && --n > 0) { if (c == '-' || c == '.' || (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || c == '_' || (c >= 'a' && c <= 'z') || 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 const char* SOAP_FMAC2 soap_encode_url_string(struct soap *soap, const char *s) { if (s) { int n = 3 * (int)strlen(s) + 1; char *t = (char*)soap_malloc(soap, n); if (t) { (void)soap_encode_url(s, t, n); return t; } } return SOAP_STR_EOS; } /******************************************************************************\ * * HTTP Cookies RFC 6265 * \******************************************************************************/ #ifdef WITH_COOKIES SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_cookie(struct soap *soap, const char *name, const char *domain, const char *path) { return soap_cookie_env(soap, name, domain, path, 0); } /******************************************************************************/ SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_cookie_env(struct soap *soap, const char *name, const char *domain, const char *path, short env) { struct soap_cookie *p; if (!domain && !env) domain = soap->cookie_domain; if (!path) path = soap->cookie_path; if (!path) path = SOAP_STR_EOS; else if (*path == '/') path++; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Search cookie='%s' domain='%s' path='%s' env=%hd\n", name, domain ? domain : "(null)", path ? path : "(null)", env)); 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 ((!env || p->env) && !strcmp(p->name, name) && (!domain || (domain && p->domain && !strcmp(p->domain, domain))) && (!path || (path && p->path && !strncmp(p->path, path, strlen(p->path))))) 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) { q = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie)); if (q) { size_t l = strlen(name) + 1; q->name = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) q->name = (char*)SOAP_MALLOC(soap, l); if (q->name) (void)soap_memcpy(q->name, l, name, l); 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) { if (!value || strcmp(value, q->value)) { SOAP_FREE(soap, q->value); q->value = NULL; } } if (value && *value && !q->value) { size_t l = strlen(value) + 1; q->value = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) q->value = (char*)SOAP_MALLOC(soap, l); if (q->value) soap_strcpy(q->value, l, value); } if (q->domain) { if (!domain || strcmp(domain, q->domain)) { SOAP_FREE(soap, q->domain); q->domain = NULL; } } if (domain && !q->domain) { size_t l = strlen(domain) + 1; q->domain = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) q->domain = (char*)SOAP_MALLOC(soap, l); if (q->domain) soap_strcpy(q->domain, l, domain); } if (q->path) { if (!path || strncmp(path, q->path, strlen(q->path))) { SOAP_FREE(soap, q->path); q->path = NULL; } } if (path && !q->path) { size_t l = strlen(path) + 1; q->path = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) q->path = (char*)SOAP_MALLOC(soap, l); if (q->path) soap_strcpy(q->path, l, 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) path = SOAP_STR_EOS; else if (*path == '/') path++; for (p = &soap->cookies, q = *p; q; q = *p) { if (!strcmp(q->name, name) && (!q->domain || !strcmp(q->domain, domain)) && (!q->path || !strncmp(q->path, path, strlen(q->path)))) { 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 p = &q->next; } } /******************************************************************************/ SOAP_FMAC1 const char * SOAP_FMAC2 soap_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; p = soap_cookie(soap, name, domain, path); if (p) return p->value; return NULL; } /******************************************************************************/ SOAP_FMAC1 const char * SOAP_FMAC2 soap_env_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; p = soap_cookie(soap, name, domain, path); if (p && 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; p = soap_cookie(soap, name, domain, path); if (p) return (time_t)p->expire; return -1; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_expire(struct soap *soap, const char *name, long maxage, const char *domain, const char *path) { struct soap_cookie *p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set cookie expiration max-age=%ld: cookie='%s' domain='%s' path='%s'\n", maxage, name, domain ? domain : "(null)", path ? path : "(null)")); p = soap_cookie(soap, name, domain, path); if (p) { p->maxage = maxage; p->modified = 1; return SOAP_OK; } return SOAP_ERR; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_secure(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set cookie secure: cookie='%s' domain='%s' path='%s'\n", name, domain ? domain : "(null)", path ? path : "(null)")); p = soap_cookie(soap, name, domain, path); if (p) { p->secure = 1; 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; p = soap_cookie(soap, name, domain, path); if (p) { 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; p = soap_cookie(soap, name, domain, path); if (p) { 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 ) && p->name && p->value && *p->name && *p->value) { s = tmp; s += soap_encode_url(p->name, s, 3967); *s++ = '='; s += soap_encode_url(p->value, s, 3968 - (int)(s-tmp)); t = p->domain ? p->domain : soap->cookie_domain; if (t && (int)strlen(t) < 3968 - (int)(s-tmp)) { soap_strcpy(s, 4096 - (s-tmp), ";Domain="); s += 8; soap_strcpy(s, 4096 - (s-tmp), t); s += strlen(s); } t = p->path ? p->path : soap->cookie_path; if (t && (int)strlen(t) < 3976 - (int)(s-tmp)) { soap_strcpy(s, 4096 - (s-tmp), ";Path=/"); s += 7; if (*t == '/') t++; if (strchr(t, '%')) /* already URL encoded? */ { soap_strcpy(s, 4096 - (s-tmp), t); s += strlen(s); } else { s += soap_encode_url(t, s, 4096 - (int)(s-tmp)); } } if (p->version > 0 && s-tmp < 3983) { (SOAP_SNPRINTF(s, 4096 - (s-tmp), 29), ";Version=%u", p->version); s += strlen(s); } if (p->maxage >= 0 && s-tmp < 4012) { (SOAP_SNPRINTF(s, 4096 - (s-tmp), 29), ";Max-Age=%ld", p->maxage); s += strlen(s); } #if !defined(WITH_LEAN) #if defined(HAVE_GMTIME_R) || defined(HAVE_GMTIME) if (p->maxage >= 0 && s-tmp < 4041) { time_t n = time(NULL) + p->maxage; struct tm T, *pT = &T; size_t l = 0; /* format is Wed, 09 Jun 2021 10:18:14 GMT */ #if defined(HAVE_GMTIME_R) if (gmtime_r(&n, pT) != SOAP_FUNC_R_ERR) l = strftime(s, 4096 - (s-tmp), ";Expires=%a, %d %b %Y %H:%M:%S GMT", pT); #else pT = gmtime(&n); if (pT) l = strftime(s, 4096 - (s-tmp), ";Expires=%a, %d %b %Y %H:%M:%S GMT", pT); #endif s += l; } #endif #endif if (s-tmp < 4079 && (p->secure #ifdef WITH_OPENSSL || soap->ssl #endif )) { soap_strcpy(s, 4096 - (s-tmp), ";Secure"); s += strlen(s); } if (s-tmp < 4086) soap_strcpy(s, 4096 - (s-tmp), ";HttpOnly"); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set-Cookie: %s\n", tmp)); soap->error = soap->fposthdr(soap, "Set-Cookie", tmp); if (soap->error) 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; char *s, tmp[4096]; unsigned int version = 0; time_t now = time(NULL); if (!domain || !path) return SOAP_OK; s = tmp; 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 >= (time_t)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; if (!tcp_gethostbyname(soap, (char*)domain, &hostent, NULL)) { const char *r = hostent.h_name; if (*t == '.') { size_t k = strlen(hostent.h_name); if (k >= n) r = hostent.h_name + k - n; } flag = !strncmp(t, r, n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Domain cookie %s host %s (match=%d)\n", t, r, flag)); } } #endif if (flag && (!q->path || !strncmp(q->path, path, strlen(q->path))) #ifndef WITH_INSECURE_COOKIES && (!q->secure || secure) #endif ) { size_t n = 12; if (q->name) n += 3*strlen(q->name); if (q->value && *q->value) n += 3*strlen(q->value) + 1; if (q->path && *q->path) n += strlen(q->path) + 9; if (q->domain) n += strlen(q->domain) + 11; if (s + n >= tmp + sizeof(tmp)) { if (s == tmp) return SOAP_OK; /* header too big, cannot split */ /* split up HTTP header */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie: %s\n", tmp)); soap->error = soap->fposthdr(soap, "Cookie", tmp); if (soap->error) return soap->error; s = tmp; } else if (s != tmp) { *s++ = ';'; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending cookie %s=%s path=\"/%s\" domain=\"%s\"\n", q->name ? q->name : "(null)", q->value ? q->value : "(null)", q->path ? q->path : "(null)", q->domain ? q->domain : "(null)")); if (q->version != version && (s-tmp) + (size_t)36 < sizeof(tmp)) { (SOAP_SNPRINTF_SAFE(s, sizeof(tmp) - (s-tmp)), "$Version=%u;", q->version); version = q->version; s += strlen(s); } if (q->name && (s-tmp) + strlen(q->name) + (size_t)15 < sizeof(tmp)) { s += soap_encode_url(q->name, s, (int)(tmp+sizeof(tmp)-s)-15); } if (q->value && *q->value && (s-tmp) + strlen(q->value) + (size_t)16 < sizeof(tmp)) { *s++ = '='; s += soap_encode_url(q->value, s, (int)(tmp+sizeof(tmp)-s)-16); } if (q->path && (s-tmp) + strlen(q->path) + (size_t)36 < sizeof(tmp)) { (SOAP_SNPRINTF_SAFE(s, sizeof(tmp) - (s-tmp)), ";$Path=\"/%s\"", (*q->path == '/' ? q->path + 1 : q->path)); s += strlen(s); } if (q->domain && (s-tmp) + strlen(q->domain) + (size_t)36 < sizeof(tmp)) { (SOAP_SNPRINTF_SAFE(s, sizeof(tmp) - (s-tmp)), ";$Domain=\"%s\"", q->domain); s += strlen(s); } } p = &q->next; } } if (s != tmp) { soap->error = soap->fposthdr(soap, "Cookie", tmp); if (soap->error) return soap->error; } 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")) { s = soap_decode_val(tmp, sizeof(tmp), s); if (s) { if (p) p->version = (int)soap_strtol(tmp, NULL, 10); else version = (int)soap_strtol(tmp, NULL, 10); } } else if (!soap_tag_cmp(tmp, "$Path")) { s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { size_t l = strlen(tmp) + 1; t = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) t = (char*)SOAP_MALLOC(soap, l); if (t) (void)soap_memcpy((void*)t, l, (const void*)tmp, l); } 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) { size_t l = strlen(tmp) + 1; t = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) t = (char*)SOAP_MALLOC(soap, l); if (t) (void)soap_memcpy((void*)t, l, (const void*)tmp, l); } 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) { size_t l = strlen(tmp) + 1; p->path = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) p->path = (char*)SOAP_MALLOC(soap, l); if (p->path) (void)soap_memcpy((void*)p->path, l, (const void*)tmp, l); } 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) { size_t l = strlen(tmp) + 1; p->domain = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) p->domain = (char*)SOAP_MALLOC(soap, l); if (p->domain) (void)soap_memcpy((void*)p->domain, l, (const void*)tmp, l); } else { p->domain = NULL; } } else if (p && !soap_tag_cmp(tmp, "Version")) { s = soap_decode_val(tmp, sizeof(tmp), s); p->version = (unsigned int)soap_strtoul(tmp, NULL, 10); } else if (p && !soap_tag_cmp(tmp, "Max-Age")) { s = soap_decode_val(tmp, sizeof(tmp), s); p->expire = (ULONG64)(now + soap_strtol(tmp, NULL, 10)); } else if (p && !soap_tag_cmp(tmp, "Expires")) { if (*s == '=') { s = soap_decode(tmp, sizeof(tmp), s + 1, ";"); if (!p->expire && strlen(tmp) >= 23) { char a[3]; struct tm T; static const char mns[] = "anebarprayunulugepctovec"; const char *t = strchr(tmp, ' '); if (t) { a[2] = '\0'; memset((void*)&T, 0, sizeof(T)); if (t[1] >= 'A') { /* format is Sun Nov 6 08:49:37 94 */ a[0] = t[2]; a[1] = t[3]; T.tm_mon = (int)(strstr(mns, a) - mns) / 2; a[0] = t[5]; a[1] = t[6]; T.tm_mday = (int)soap_strtol(a, NULL, 10); if (t[17] && t[18] && t[19] != ' ') t += 2; /* format is Sun Nov 6 08:49:37 2017 - ANSI-C */ a[0] = t[17]; a[1] = t[18]; T.tm_year = 100 + (int)soap_strtol(a, NULL, 10); t += 6; } else { /* format is Sunday, 06-Nov-17 08:49:37 GMT - RFC 850 */ a[0] = t[1]; a[1] = t[2]; T.tm_mday = (int)soap_strtol(a, NULL, 10); a[0] = t[5]; a[1] = t[6]; T.tm_mon = (int)(strstr(mns, a) - mns) / 2; if (t[10] != ' ') t += 2; /* format is Wed, 09 Jun 2021 10:18:14 GMT - RFC 822 */ a[0] = t[8]; a[1] = t[9]; T.tm_year = 100 + (int)soap_strtol(a, NULL, 10); t += 11; } a[0] = t[0]; a[1] = t[1]; T.tm_hour = (int)soap_strtol(a, NULL, 10); a[0] = t[3]; a[1] = t[4]; T.tm_min = (int)soap_strtol(a, NULL, 10); a[0] = t[6]; a[1] = t[7]; T.tm_sec = (int)soap_strtol(a, NULL, 10); p->expire = (ULONG64)soap_timegm(&T); } } } } else if (p && !soap_tag_cmp(tmp, "Secure")) { p->secure = 1; s = soap_decode_val(tmp, sizeof(tmp), s); } else if (p && !soap_tag_cmp(tmp, "HttpOnly")) { s = soap_decode_val(tmp, sizeof(tmp), s); } else if (p && !soap_tag_cmp(tmp, "Comment")) { s = soap_decode_val(tmp, sizeof(tmp), s); } else if (*tmp) { if (p) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie='%s' value='%s' domain='%s' path='%s' expire=" SOAP_ULONG_FORMAT " secure=%d\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->expire, p->secure)); q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path); if (q) { 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); } p = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie)); if (p) { size_t l = strlen(tmp) + 1; p->name = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) p->name = (char*)SOAP_MALLOC(soap, l); if (p->name) (void)soap_memcpy(p->name, l, tmp, l); s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { l = strlen(tmp) + 1; p->value = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) p->value = (char*)SOAP_MALLOC(soap, l); if (p->value) (void)soap_memcpy((void*)p->value, l, (const void*)tmp, l); } else { p->value = NULL; } if (domain) { p->domain = domain; } else { p->domain = NULL; } if (path) { p->path = path; } else if (*soap->path) { l = strlen(soap->path) + 1; p->path = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) p->path = (char*)SOAP_MALLOC(soap, l); if (p->path) (void)soap_memcpy((void*)p->path, l, (const void*)soap->path, l); } else { p->path = (char*)SOAP_MALLOC(soap, 2); if (p->path) (void)soap_memcpy((void*)p->path, 2, (const void*)"/", 2); } p->expire = 0; p->secure = 0; p->version = version; } } } if (p) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie='%s' value='%s' domain='%s' path='%s' expire=" SOAP_ULONG_FORMAT " secure=%d\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->expire, p->secure)); q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path); if (q) { 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] */ s = getenv("HTTP_COOKIE"); if (!s) 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; (void)copy; q = &r; for (p = soap->cookies; p; p = p->next) { *q = (struct soap_cookie*)SOAP_MALLOC(copy, sizeof(struct soap_cookie)); if (!*q) return r; **q = *p; if (p->name) { size_t l = strlen(p->name) + 1; (*q)->name = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) (*q)->name = (char*)SOAP_MALLOC(copy, l); if ((*q)->name) (void)soap_memcpy((*q)->name, l, p->name, l); } if (p->value) { size_t l = strlen(p->value) + 1; (*q)->value = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) (*q)->value = (char*)SOAP_MALLOC(copy, l); if ((*q)->value) (void)soap_memcpy((*q)->value, l, p->value, l); } if (p->domain) { size_t l = strlen(p->domain) + 1; (*q)->domain = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) (*q)->domain = (char*)SOAP_MALLOC(copy, l); if ((*q)->domain) (void)soap_memcpy((*q)->domain, l, p->domain, l); } if (p->path) { size_t l = strlen(p->path) + 1; (*q)->path = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) (*q)->path = (char*)SOAP_MALLOC(copy, l); if ((*q)->path) (void)soap_memcpy((*q)->path, l, p->path, l); } 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 */ /******************************************************************************/ SOAP_FMAC1 size_t SOAP_FMAC2 soap_hash(const char *s) { size_t h = 0; while (*s) h = 65599*h + *s++; return h % SOAP_IDHASH; } /******************************************************************************/ static void soap_init_pht(struct soap *soap) { int i; soap->pblk = NULL; soap->pidx = 0; for (i = 0; i < (int)SOAP_PTRHASH; i++) soap->pht[i] = NULL; } /******************************************************************************/ SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_versioning(soap_new)(soap_mode imode, soap_mode omode) { struct soap *soap; #ifdef __cplusplus soap = SOAP_NEW_UNMANAGED(struct soap); #else soap = (struct soap*)SOAP_MALLOC_UNMANAGED(sizeof(struct soap)); #endif if (soap) soap_versioning(soap_init)(soap, imode, omode); return soap; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_free(struct soap *soap) { soap_done(soap); #ifdef __cplusplus SOAP_DELETE_UNMANAGED(soap); #else SOAP_FREE_UNMANAGED(soap); #endif } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_del(struct soap *soap) { free(soap); } /******************************************************************************/ static void soap_free_pht(struct soap *soap) { struct soap_pblk *pb, *next; 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; } /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_embed(struct soap *soap, const void *p, const void *a, int n, int t) { int id; struct soap_plist *pp; if (soap->version == 2) soap->encoding = 1; if (!p || (!soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH)) || (soap->mode & SOAP_XML_TREE)) return 0; 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_is_single(soap, pp)) return 0; soap_set_embedded(soap, pp); } return id; } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup(struct soap *soap, const void *p, int type, struct soap_plist **ppp) { 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; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_enter(struct soap *soap, const void *p, const void *a, int n, int type, struct soap_plist **ppp) { size_t h; struct soap_plist *pp; (void)n; if (!soap->pblk || soap->pidx >= SOAP_PTRBLK) { 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); else h = soap_hash_ptr(p); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pointer enter location=%p array=%p size=%lu type=%d id=%d\n", p, a, (unsigned long)n, type, soap->idnum+1)); pp->next = soap->pht[h]; pp->type = type; pp->mark1 = 0; pp->mark2 = 0; pp->ptr = p; pp->dup = NULL; pp->array = a; pp->size = n; soap->pht[h] = pp; pp->id = ++soap->idnum; return pp->id; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_array_pointer_lookup(struct soap *soap, const void *p, const void *a, int n, int type, struct soap_plist **ppp) { struct soap_plist *pp; *ppp = NULL; if (!p || !a) return 0; for (pp = soap->pht[soap_hash_ptr(a)]; pp; pp = pp->next) { if (pp->type == type && pp->array == a && pp->size == n) { *ppp = pp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d id=%d\n", a, type, pp->id)); return pp->id; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d: not found\n", a, type)); return 0; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_begin_count(struct soap *soap) { soap_free_ns(soap); soap->error = SOAP_OK; #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_UDP)) { soap->mode &= SOAP_IO; soap->mode |= SOAP_IO_BUFFER | SOAP_ENC_PLAIN; } if ((soap->mode & SOAP_IO) == SOAP_IO_STORE || (((soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_ENC_PLAIN)) #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_PLAIN)) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } #endif #ifndef WITH_LEANER if ((soap->mode & SOAP_ENC_MTOM) && (soap->mode & SOAP_ENC_DIME)) soap->mode |= SOAP_ENC_MIME; else if (!(soap->mode & SOAP_ENC_MIME)) 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_SEND; soap->event = 0; soap->evlev = 0; soap->idnum = 0; soap->body = 1; soap->level = 0; soap_clr_attr(soap); soap_set_local_namespaces(soap); #ifndef WITH_LEANER soap->dime.size = 0; /* accumulate total size of attachments */ if (soap->fprepareinitsend && (soap->mode & SOAP_IO) != SOAP_IO_STORE && (soap->error = soap->fprepareinitsend(soap)) != SOAP_OK) return soap->error; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin count phase (socket=%d mode=0x%x count=" SOAP_ULONG_FORMAT ")\n", (int)soap->socket, (unsigned int)soap->mode, soap->count)); #ifndef WITH_LEANER if ((soap->mode & SOAP_IO_LENGTH)) return soap_begin_attachments(soap); #endif return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_end_count(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of count phase\n")); #ifndef WITH_LEANER if ((soap->mode & SOAP_IO_LENGTH)) { if (soap_end_attachments(soap)) return soap->error; if (soap->fpreparefinalsend && (soap->error = soap->fpreparefinalsend(soap)) != SOAP_OK) return soap->error; } #else (void)soap; #endif return SOAP_OK; } /******************************************************************************/ static int soap_init_send(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing for output to socket=%d/fd=%d\n", (int)soap->socket, soap->sendfd)); *soap->tag = '\0'; soap_free_ns(soap); soap->error = SOAP_OK; soap->mode = soap->omode | (soap->mode & (SOAP_IO_LENGTH | SOAP_ENC_DIME)); #ifndef WITH_LEAN if ((soap->mode & SOAP_IO_UDP)) { soap->mode &= ~SOAP_IO; soap->mode |= SOAP_IO_BUFFER | SOAP_ENC_PLAIN; if ((soap->mode & SOAP_IO_LENGTH) && soap->count > sizeof(soap->buf)) return soap->error = SOAP_UDP_ERROR; } #endif #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH) { if ((soap->mode & SOAP_ENC_PLAIN)) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } #endif #if !defined(__cplusplus) || defined(WITH_COMPAT) if (soap->os) { *soap->os = NULL; soap->mode = (soap->mode & ~SOAP_IO) | SOAP_IO_STORE; } else #endif if ((soap->mode & SOAP_IO) == SOAP_IO_FLUSH && soap_valid_socket(soap->socket)) { if ((soap->mode & SOAP_IO_LENGTH) || (soap->mode & SOAP_ENC_PLAIN)) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } soap->mode &= ~SOAP_IO_LENGTH; if ((soap->mode & SOAP_IO) == SOAP_IO_STORE && soap_alloc_block(soap) == NULL) return soap->error; if (!(soap->mode & SOAP_IO_KEEPALIVE)) soap->keep_alive = 0; #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 if (!(soap->mode & SOAP_ENC_MIME)) { 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) && !soap->os && soap->sendfd >= 0) /* Set win32 stdout or soap->sendfd to BINARY, e.g. to support DIME */ #ifdef __BORLANDC__ setmode(soap->sendfd, _O_BINARY); #else _setmode(soap->sendfd, _O_BINARY); #endif #endif #endif #endif #endif if ((soap->mode & SOAP_IO)) soap->buflen = soap->bufidx = 0; soap->chunksize = 0; soap->ns = 0; soap->null = 0; soap->position = 0; soap->mustUnderstand = 0; soap->encoding = 0; soap->event = 0; soap->evlev = 0; soap->idnum = 0; soap->body = 1; 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->d_stream) { soap->d_stream = (z_stream*)SOAP_MALLOC(soap, sizeof(z_stream)); if (!soap->d_stream) return soap->error = SOAP_EOM; soap->d_stream->zalloc = Z_NULL; soap->d_stream->zfree = Z_NULL; soap->d_stream->opaque = Z_NULL; soap->d_stream->next_in = Z_NULL; } if (!soap->z_buf) soap->z_buf = (char*)SOAP_MALLOC(soap, sizeof(soap->buf)); if (!soap->z_buf) return soap->error = SOAP_EOM; soap->d_stream->next_out = (Byte*)soap->z_buf; soap->d_stream->avail_out = sizeof(soap->buf); #ifdef WITH_GZIP if (soap->zlib_out != SOAP_ZLIB_DEFLATE) { (void)soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)"\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 = sizeof(soap->buf) - 10; soap->z_crc = crc32(0L, NULL, 0); soap->zlib_out = SOAP_ZLIB_GZIP; if (soap->z_dict) *((Byte*)soap->z_buf + 2) = 0xff; 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; if (soap->z_dict) { if (deflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != 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=" SOAP_ULONG_FORMAT ")\n", (int)soap->socket, soap->mode, soap->count)); soap->part = SOAP_BEGIN_SEND; #ifndef WITH_LEANER if (soap->fprepareinitsend && (soap->mode & SOAP_IO) == SOAP_IO_STORE && (soap->error = soap->fprepareinitsend(soap)) != SOAP_OK) return soap->error; #endif #ifndef WITH_LEAN soap->start = (ULONG64)time(NULL); #endif return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_begin_send(struct soap *soap) { #ifndef WITH_LEANER if (soap_init_send(soap)) return soap->error; return soap_begin_attachments(soap); #else return soap_init_send(soap); #endif } /******************************************************************************/ #ifndef WITH_NOIDREF 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 /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_reference(struct soap *soap, const void *p, int t) { struct soap_plist *pp; if (!p || (!soap->encodingStyle && !(soap->omode & (SOAP_ENC_DIME | SOAP_ENC_MIME | SOAP_ENC_MTOM | SOAP_XML_GRAPH))) || (soap->omode & 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)) { 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 /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_array_reference(struct soap *soap, const void *p, const void *a, int n, int t) { struct soap_plist *pp; if (!p || !a || (!soap->encodingStyle && !(soap->omode & SOAP_XML_GRAPH)) || (soap->omode & SOAP_XML_TREE)) return 1; if (soap_array_pointer_lookup(soap, p, a, n, t, &pp)) { if (pp->mark1 == 0) { pp->mark1 = 2; pp->mark2 = 2; } } else if (!soap_pointer_enter(soap, p, a, n, t, &pp)) { return 1; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array reference %p ptr=%p n=%lu t=%d (%d %d)\n", p, a, (unsigned long)n, t, (int)pp->mark1, (int)pp->mark2)); return pp->mark1; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_attachment_reference(struct soap *soap, const void *p, const void *a, int n, int t, const char *id, const char *type) { struct soap_plist *pp; if (!p || !a || (!soap->encodingStyle && !(soap->omode & SOAP_XML_GRAPH) && !id && !type) || (soap->omode & SOAP_XML_TREE)) return 1; if (soap_array_pointer_lookup(soap, p, a, n, t, &pp)) { if (pp->mark1 == 0) { pp->mark1 = 2; pp->mark2 = 2; } } else if (!soap_pointer_enter(soap, p, a, n, t, &pp)) { return 1; } if (id || type) soap->mode |= SOAP_ENC_DIME; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Attachment reference %p ptr=%p n=%lu t=%d (%d %d)\n", p, a, (unsigned long)n, t, (int)pp->mark1, (int)pp->mark2)); return pp->mark1; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_embedded_id(struct soap *soap, int id, const void *p, int t) { struct soap_plist *pp = NULL; if (id >= 0 || (!soap->encodingStyle && !(soap->omode & SOAP_XML_GRAPH)) || (soap->omode & SOAP_XML_TREE)) return id; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id %p type=%d id=%d\n", p, t, id)); if (id < -1) return soap_embed(soap, p, NULL, 0, t); if (id < 0) { id = soap_pointer_lookup(soap, p, t, &pp); if (soap->version == 1 && soap->part != SOAP_IN_HEADER) { 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; } else if (id) { 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 /******************************************************************************/ #ifndef WITH_NOIDREF 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->omode & 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 /******************************************************************************/ #ifndef WITH_NOIDREF 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 /******************************************************************************/ #ifndef WITH_NOIDREF 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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_attachment(struct soap *soap, const char *tag, int id, const void *p, const void *a, int n, const char *aid, const char *atype, const char *aoptions, const char *type, int t) { struct soap_plist *pp; int i; if (!p || !a || (!aid && !atype) || (!soap->encodingStyle && !(soap->omode & (SOAP_ENC_DIME | SOAP_ENC_MIME | SOAP_ENC_MTOM | SOAP_XML_GRAPH))) || (soap->omode & SOAP_XML_TREE)) return soap_element_id(soap, tag, id, p, a, n, type, t, NULL); 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) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(soap->dime_id_format) + 20), soap->dime_id_format, id); aid = soap_strdup(soap, soap->tmpbuf); if (!aid) return -1; } /* Add MTOM xop:Include element when necessary */ /* TODO: this code to be obsoleted with new import/xop.h conventions */ if ((soap->omode & SOAP_ENC_MTOM) && strcmp(tag, "xop:Include")) { if (soap_element_begin_out(soap, tag, 0, type) || soap_element_href(soap, "xop:Include", 0, "xmlns:xop=\"http://www.w3.org/2004/08/xop/include\" 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->omode & SOAP_ENC_MTOM)) content = soap_alloc_multipart(soap, &soap->mime.first, &soap->mime.last, (const char*)a, n); else content = soap_alloc_multipart(soap, &soap->dime.first, &soap->dime.last, (const char*)a, n); if (!content) { soap->error = SOAP_EOM; return -1; } if (!strncmp(aid, "cid:", 4)) /* RFC 2111 */ { if ((soap->omode & SOAP_ENC_MTOM)) { size_t l = strlen(aid) - 1; char *s = (char*)soap_malloc(soap, l); if (s) { s[0] = '<'; (void)soap_strncpy(s + 1, l - 1, aid + 4, l - 3); s[l - 2] = '>'; s[l - 1] = '\0'; 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; } return -1; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF static void soap_init_iht(struct soap *soap) { int i; for (i = 0; i < SOAP_IDHASH; i++) soap->iht[i] = NULL; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF static void soap_free_iht(struct soap *soap) { int i; struct soap_ilist *ip = NULL, *p = NULL; 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 /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 struct soap_ilist * SOAP_FMAC2 soap_lookup(struct soap *soap, const char *id) { 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 /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 struct soap_ilist * SOAP_FMAC2 soap_enter(struct soap *soap, const char *id, int t, size_t n) { size_t h; struct soap_ilist *ip = NULL; size_t l = strlen(id); if (sizeof(struct soap_ilist) + l > l && (SOAP_MAXALLOCSIZE <= 0 || sizeof(struct soap_ilist) + l <= SOAP_MAXALLOCSIZE)) ip = (struct soap_ilist*)SOAP_MALLOC(soap, sizeof(struct soap_ilist) + l); if (ip) { ip->type = t; ip->size = n; ip->ptr = NULL; ip->spine = NULL; ip->link = NULL; ip->copy = NULL; ip->flist = NULL; ip->smart = NULL; ip->shaky = 0; (void)soap_memcpy((char*)ip->id, l + 1, id, l + 1); h = soap_hash(id); /* h = (HASH(id) % SOAP_IDHASH) so soap->iht[h] is safe */ ip->next = soap->iht[h]; soap->iht[h] = ip; } return ip; } #endif /******************************************************************************/ SOAP_FMAC1 void* SOAP_FMAC2 soap_malloc(struct soap *soap, size_t n) { char *p; size_t k = n; if (SOAP_MAXALLOCSIZE > 0 && n > SOAP_MAXALLOCSIZE) { soap->error = SOAP_EOM; return NULL; } if (!soap) return SOAP_MALLOC(soap, n); n += sizeof(short); n += (~n+1) & (sizeof(void*)-1); /* align at 4-, 8- or 16-byte boundary by rounding up */ if (n + sizeof(void*) + sizeof(size_t) < k) { soap->error = SOAP_EOM; return NULL; } p = (char*)SOAP_MALLOC(soap, n + sizeof(void*) + sizeof(size_t)); if (!p) { soap->error = SOAP_EOM; return NULL; } /* set a canary word to detect memory overruns and data corruption */ *(unsigned short*)(p + n - sizeof(unsigned short)) = (unsigned 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; return p; } /******************************************************************************/ #ifdef SOAP_MEM_DEBUG static void soap_init_mht(struct soap *soap) { 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) { int i; 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) { void *p = malloc(size); if (soap) { size_t h = soap_hash_ptr(p); struct soap_mlist *mp = (struct soap_mlist*)malloc(sizeof(struct soap_mlist)); if (soap->fdebug[SOAP_INDEX_TEST]) { 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) { if (!soap) { free(p); } else { size_t h = soap_hash_ptr(p); struct soap_mlist *mp; for (mp = soap->mht[h]; mp; mp = mp->next) if (mp->ptr == p) break; if (mp) { if (mp->live) { if (soap->fdebug[SOAP_INDEX_TEST]) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): free(%p)\n", file, line, p)); } free(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) { size_t h = soap_hash_ptr(p); struct soap_mlist *mp; for (mp = soap->mht[h]; mp; mp = mp->next) if (mp->ptr == p) break; if (mp) mp->live = 0; } #endif /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_dealloc(struct soap *soap, void *p) { if (soap_check_state(soap)) return; if (p) { char **q; for (q = (char**)(void*)&soap->alist; *q; q = *(char***)q) { if (*(unsigned short*)(char*)(*q - sizeof(unsigned short)) != (unsigned 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 { char *q; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free all soap_malloc() data\n")); while (soap->alist) { q = (char*)soap->alist; if (*(unsigned short*)(char*)(q - sizeof(unsigned short)) != (unsigned 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); } /* assume these were deallocated: */ soap->http_content = NULL; soap->action = NULL; soap->fault = NULL; soap->header = NULL; soap->bearer = NULL; soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif #ifndef WITH_LEANER soap_clr_mime(soap); #endif } } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_delete(struct soap *soap, void *p) { struct soap_clist **cp; if (soap_check_state(soap)) return; cp = &soap->clist; if (p) { while (*cp) { if (p == (*cp)->ptr) { struct soap_clist *q = *cp; *cp = q->next; if (q->fdelete(soap, 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) { struct soap_clist *q = *cp; *cp = q->next; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Delete %p type=%d (cp=%p)\n", q->ptr, q->type, (void*)q)); if (q->fdelete(soap, 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; /* assume this was deallocated */ soap->header = NULL; /* assume this was deallocated */ } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_delegate_deletion(struct soap *soap, struct soap *soap_to) { struct soap_clist *cp; char **q; #ifdef SOAP_MEM_DEBUG void *p; struct soap_mlist **mp, *mq; size_t h; #endif for (q = (char**)(void*)&soap->alist; *q; q = *(char***)q) { if (*(unsigned short*)(char*)(*q - sizeof(unsigned short)) != (unsigned 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; } #ifdef SOAP_MEM_DEBUG p = (void*)(*q - *(size_t*)(*q + sizeof(void*))); h = soap_hash_ptr(p); for (mp = &soap->mht[h]; *mp; mp = &(*mp)->next) { if ((*mp)->ptr == p) { mq = *mp; *mp = mq->next; mq->next = soap_to->mht[h]; soap_to->mht[h] = mq; break; } } #endif } *q = (char*)soap_to->alist; soap_to->alist = soap->alist; soap->alist = NULL; #ifdef SOAP_MEM_DEBUG cp = soap->clist; while (cp) { h = soap_hash_ptr(cp); for (mp = &soap->mht[h]; *mp; mp = &(*mp)->next) { if ((*mp)->ptr == cp) { mq = *mp; *mp = mq->next; mq->next = soap_to->mht[h]; soap_to->mht[h] = mq; break; } } cp = cp->next; } #endif cp = soap_to->clist; if (cp) { while (cp->next) cp = cp->next; cp->next = soap->clist; } else { soap_to->clist = soap->clist; } soap->clist = NULL; } /******************************************************************************/ SOAP_FMAC1 struct soap_clist * SOAP_FMAC2 soap_link(struct soap *soap, int t, int n, int (*fdelete)(struct soap*, struct soap_clist*)) { struct soap_clist *cp = NULL; if (soap) { if (n != SOAP_NO_LINK_TO_DELETE) { cp = (struct soap_clist*)SOAP_MALLOC(soap, sizeof(struct soap_clist)); if (!cp) { soap->error = SOAP_EOM; } else { cp->next = soap->clist; cp->type = t; cp->size = n; cp->ptr = NULL; cp->fdelete = fdelete; soap->clist = cp; } } soap->alloced = t; } return cp; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_unlink(struct soap *soap, const void *p) { char **q; struct soap_clist **cp; if (soap && p) { for (q = (char**)(void*)&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 SOAP_OK; /* found and removed from dealloc chain */ } } 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 SOAP_OK; /* found and removed from dealloc chain */ } } } return SOAP_ERR; } /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_lookup_type(struct soap *soap, const char *id) { 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 /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 short SOAP_FMAC2 soap_begin_shaky(struct soap *soap) { short f = soap->shaky; soap->shaky = 1; return f; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 void SOAP_FMAC2 soap_end_shaky(struct soap *soap, short f) { soap->shaky = f; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF static int soap_is_shaky(struct soap *soap, void *p) { (void)p; if (!soap->blist && !soap->shaky) return 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shaky %p\n", p)); return 1; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 void* SOAP_FMAC2 soap_id_lookup(struct soap *soap, const char *id, void **p, int t, size_t n, unsigned int k, int (*fbase)(int, int)) { struct soap_ilist *ip; if (!p || !id || !*id) return p; ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */ if (!ip) { ip = soap_enter(soap, id, t, n); /* new hash table entry for string id */ if (!ip) return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding first href='%s' type=%d location=%p (%u bytes) level=%u\n", id, t, (void*)p, (unsigned int)n, k)); *p = NULL; if (k) { int i; if (k > SOAP_MAXPTRS) return NULL; ip->spine = (void**)soap_malloc(soap, SOAP_MAXPTRS * sizeof(void*)); if (!ip->spine) return NULL; ip->spine[0] = NULL; for (i = 1; i < SOAP_MAXPTRS; i++) ip->spine[i] = &ip->spine[i - 1]; *p = &ip->spine[k - 1]; } else { ip->link = p; ip->shaky = soap_is_shaky(soap, (void*)p); } } else if (ip->type != t && (!fbase || !fbase(ip->type, t)) && (!fbase || !fbase(t, ip->type) || soap_type_punned(soap, ip))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup type incompatibility: ref='%s' id-type=%d ref-type=%d\n", id, ip->type, t)); (void)soap_id_nullify(soap, id); return NULL; } else if (k == 0 && ip->ptr && !ip->shaky) /* when block lists are in use, ip->ptr will change */ { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolved href='%s' type=%d location=%p (%u bytes) level=%u\n", id, t, ip->ptr, (unsigned int)n, k)); *p = ip->ptr; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarded href='%s' type=%d location=%p (%u bytes) level=%u\n", id, t, (void*)p, (unsigned int)n, k)); if (fbase && fbase(t, ip->type) && !soap_type_punned(soap, ip)) { ip->type = t; ip->size = n; } *p = NULL; if (k) { if (!ip->spine) { int i; if (k > SOAP_MAXPTRS) return NULL; ip->spine = (void**)soap_malloc(soap, SOAP_MAXPTRS * sizeof(void*)); if (!ip->spine) return NULL; ip->spine[0] = NULL; for (i = 1; i < SOAP_MAXPTRS; i++) ip->spine[i] = &ip->spine[i - 1]; } *p = &ip->spine[k - 1]; if (ip->ptr && !ip->shaky) ip->spine[0] = ip->ptr; } else { void *q = ip->link; ip->link = p; ip->shaky = soap_is_shaky(soap, (void*)p); *p = q; } } return p; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 void* SOAP_FMAC2 soap_id_forward(struct soap *soap, const char *href, void *p, size_t i, int t, int tt, size_t n, unsigned int k, void (*finsert)(struct soap*, int, int, void*, size_t, const void*, void**), int (*fbase)(int, int)) { 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) { ip = soap_enter(soap, href, t, n); /* new hash table entry for string id */ if (!ip) return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New entry href='%s' type=%d size=%lu level=%d location=%p\n", href, t, (unsigned long)n, k, p)); } else if ((ip->type != t || ip->size != n) && k == 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forward 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, t, (unsigned long)n)); (void)soap_id_nullify(soap, href); return NULL; } if (finsert || n < sizeof(void*)) { struct soap_flist *fp = (struct soap_flist*)SOAP_MALLOC(soap, sizeof(struct soap_flist)); if (!fp) { soap->error = SOAP_EOM; return NULL; } if (fbase && fbase(t, ip->type) && !soap_type_punned(soap, ip)) { ip->type = t; ip->size = n; } if ((ip->type != t || ip->size != n) && (!fbase || !fbase(ip->type, t))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forward 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, t, (unsigned long)n)); SOAP_FREE(soap, fp); (void)soap_id_nullify(soap, href); return NULL; } fp->next = ip->flist; fp->type = tt; fp->ptr = p; fp->level = k; fp->index = i; fp->finsert = finsert; ip->flist = fp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding type=%d (target type=%d) size=%lu location=%p level=%u index=%lu href='%s'\n", t, tt, (unsigned long)n, p, k, (unsigned long)i, href)); } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding copying address %p for type=%d href='%s'\n", p, t, href)); *(void**)p = ip->copy; ip->copy = p; } ip->shaky = soap_is_shaky(soap, p); return p; } #endif /******************************************************************************/ SOAP_FMAC1 void* SOAP_FMAC2 soap_id_enter(struct soap *soap, const char *id, void *p, int t, size_t n, const char *type, const char *arrayType, void *(*finstantiate)(struct soap*, int, const char*, const char*, size_t*), int (*fbase)(int, int)) { #ifndef WITH_NOIDREF struct soap_ilist *ip; #endif (void)id; (void)fbase; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enter id='%s' type=%d location=%p size=%lu\n", id, t, p, (unsigned long)n)); soap->alloced = 0; if (!p) { if (finstantiate) { p = finstantiate(soap, t, type, arrayType, &n); /* soap->alloced is set in soap_link() */ t = soap->alloced; } else { p = soap_malloc(soap, n); soap->alloced = t; } } #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 type=%d\n", id, p, t)); if (!ip) { ip = soap_enter(soap, id, t, n); /* new hash table entry for string id */ if (!ip) return NULL; ip->ptr = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New entry id='%s' type=%d size=%lu location=%p\n", id, t, (unsigned long)n, p)); if (!soap->alloced) ip->shaky = soap_is_shaky(soap, p); } else if (ip->ptr) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Multiply defined id='%s'\n", id)); soap_strcpy(soap->id, sizeof(soap->id), id); soap->error = SOAP_DUPLICATE_ID; return NULL; } else if ((ip->type != t && (!fbase || !fbase(t, ip->type) || soap_type_punned(soap, ip))) || (ip->type == t && ip->size != n && soap_type_punned(soap, ip))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enter type incompatibility id='%s' expect type=%d size=%lu got type=%d size=%lu\n", id, ip->type, (unsigned long)ip->size, t, (unsigned long)n)); (void)soap_id_nullify(soap, id); return NULL; } else { ip->type = t; ip->size = n; ip->ptr = p; if (!soap->alloced) ip->shaky = soap_is_shaky(soap, p); if (soap->alloced || !ip->shaky) { void **q; /* ptr will not change later, so resolve links now */ if (ip->spine) ip->spine[0] = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Traversing link chain to resolve id='%s' type=%d\n", ip->id, ip->type)); q = (void**)ip->link; while (q) { void *r = *q; *q = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... link %p -> %p\n", (void*)q, p)); q = (void**)r; } ip->link = NULL; } } return ip->ptr; #endif } /******************************************************************************/ SOAP_FMAC1 void** SOAP_FMAC2 soap_id_smart(struct soap *soap, const char *id, int t, size_t n) { (void)soap; (void)id; (void)t; (void)n; #ifndef WITH_NOIDREF if (id && *id) { struct soap_ilist *ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */ if (!ip) { ip = soap_enter(soap, id, t, n); /* new hash table entry for string id */ if (!ip) return NULL; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New smart shared pointer entry id='%s' type=%d size=%lu smart=%p\n", id, t, (unsigned long)n, ip->smart)); return &ip->smart; } #endif return NULL; } /******************************************************************************/ #ifndef WITH_NOIDREF static int soap_type_punned(struct soap *soap, const struct soap_ilist *ip) { const struct soap_flist *fp; (void)soap; if (ip->ptr || ip->copy) return 1; for (fp = ip->flist; fp; fp = fp->next) if (fp->level == 0) return 1; return 0; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_id_nullify(struct soap *soap, const char *id) { int i; for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { void *p, *q; for (p = ip->link; p; p = q) { q = *(void**)p; *(void**)p = NULL; } ip->link = NULL; } } soap_strcpy(soap->id, sizeof(soap->id), id); return soap->error = SOAP_HREF; } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_end_send(struct soap *soap) { #ifndef WITH_LEANER int err; err = soap_end_attachments(soap); 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 (!err) err = soap_putdime(soap); if (!err) err = soap_putmime(soap); soap->mime.list = NULL; soap->mime.first = NULL; soap->mime.last = NULL; soap->dime.list = NULL; soap->dime.first = NULL; soap->dime.last = NULL; if (err) return err; #endif return soap_end_send_flush(soap); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_end_send_flush(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End send mode=0x%x\n", soap->mode)); 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) && soap->d_stream) { 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 != sizeof(soap->buf)) { if (soap_flush_raw(soap, soap->z_buf, sizeof(soap->buf) - 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 = sizeof(soap->buf); } } 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) { #if !defined(__cplusplus) || defined(WITH_COMPAT) if (soap->os) { char *b = (char*)soap_push_block(soap, NULL, 1); if (b) { *b = '\0'; *soap->os = soap_save_block(soap, NULL, NULL, 0); } } else #endif { char *p; #ifndef WITH_NOHTTP if (!(soap->mode & SOAP_ENC_PLAIN)) { 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)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Send %u bytes to socket=%d/fd=%d\n", (unsigned int)soap_block_size(soap, NULL), (int)soap->socket, soap->sendfd)); soap->error = soap->fsend(soap, p, soap_block_size(soap, NULL)); if (soap->error) { soap_end_block(soap, NULL); return soap->error; } } soap_end_block(soap, NULL); } #ifndef WITH_LEANER if (soap->fpreparefinalsend && (soap->error = soap->fpreparefinalsend(soap)) != SOAP_OK) return soap->error; #endif if ((soap->omode & SOAP_IO) == SOAP_IO_STORE && (soap->imode & SOAP_IO) != SOAP_IO_STORE) soap->omode = (soap->omode & ~SOAP_IO) | (soap->imode & SOAP_IO); } #ifndef WITH_LEANER else if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { DBGMSG(SENT, "\r\n0\r\n\r\n", 7); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Send 7 bytes to socket=%d/fd=%d\n", (int)soap->socket, soap->sendfd)); soap->error = soap->fsend(soap, "\r\n0\r\n\r\n", 7); if (soap->error) return soap->error; } #endif } #ifdef WITH_TCPFIN #if defined(WITH_OPENSSL) || defined(WITH_SYSTEMSSL) if (!soap->ssl) #endif if (soap_valid_socket(soap->socket) && !soap->keep_alive && !(soap->omode & SOAP_IO_UDP)) soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_WR); /* Send TCP FIN */ #endif #if defined(__cplusplus) && !defined(WITH_COMPAT) if (soap->os) soap->os->flush(); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of send phase\n")); soap->omode &= ~SOAP_SEC_WSUID; soap->count = 0; soap->part = SOAP_END; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_end_recv(struct soap *soap) { soap->part = SOAP_END; #ifndef WITH_LEAN soap->wsuid = NULL; /* reset before next send */ soap->c14nexclude = NULL; /* reset before next send */ soap->c14ninclude = NULL; /* reset before next send */ #endif #ifndef WITH_LEANER soap->ffilterrecv = NULL; 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 so call soap_resolve() and return */ if ((soap->mode & SOAP_ENC_MIME)) { if ((soap->mode & SOAP_MIME_POSTCHECK)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Post checking MIME attachments\n")); if (!soap->keep_alive) soap->keep_alive = -2; /* special case to keep alive */ #ifndef WITH_NOIDREF soap_resolve(soap); #endif return SOAP_OK; } 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) && soap->d_stream) { /* 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; (void)soap_memcpy((void*)soap->buf, sizeof(soap->buf), (const void*)soap->z_buf, sizeof(soap->buf)); 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) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Gzip error: unable to read crc value\n")); return soap->error = SOAP_ZLIB_ERROR; } 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 inflate 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 inflate 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->ahead != EOF && !soap_recv_raw(soap)) continue; #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); #ifndef WITH_LEANER if (soap->fpreparefinalrecv) return soap->error = soap->fpreparefinalrecv(soap); #endif return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_free_temp(struct soap *soap) { struct soap_attribute *tp, *tq; 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) { SOAP_FREE(soap, ns->out); ns->out = NULL; } } 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_iht(soap); #endif soap_free_pht(soap); } /******************************************************************************/ static void soap_free_ns(struct soap *soap) { 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; } /******************************************************************************/ #ifdef 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 /******************************************************************************/ #ifdef 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]; if (s) SOAP_FREE_UNMANAGED(s); if (logfile) { size_t l = strlen(logfile) + 1; t = (char*)SOAP_MALLOC_UNMANAGED(l); if (t) (void)soap_memcpy((void*)t, l, (const void*)logfile, l); } soap->logfile[i] = t; } #endif /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_recv_logfile(struct soap *soap, const char *logfile) { (void)soap; (void)logfile; #ifdef SOAP_DEBUG soap_set_logfile(soap, SOAP_INDEX_RECV, logfile); #endif } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_sent_logfile(struct soap *soap, const char *logfile) { (void)soap; (void)logfile; #ifdef SOAP_DEBUG soap_set_logfile(soap, SOAP_INDEX_SENT, logfile); #endif } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_test_logfile(struct soap *soap, const char *logfile) { (void)soap; (void)logfile; #ifdef SOAP_DEBUG soap_set_logfile(soap, SOAP_INDEX_TEST, logfile); #endif } /******************************************************************************/ SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_copy(const struct soap *soap) { struct soap *copy = soap_versioning(soap_new)(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); soap_done(copy); if (soap_copy_context(copy, soap) != NULL) return copy; soap_free(copy); return NULL; } /******************************************************************************/ SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_copy_context(struct soap *copy, const struct soap *soap) { if (copy == soap) return copy; if (soap_check_state(soap)) return NULL; if (copy) { struct soap_plugin *p = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying context\n")); (void)soap_memcpy((void*)copy, sizeof(struct soap), (const void*)soap, sizeof(struct soap)); copy->state = SOAP_COPY; copy->error = SOAP_OK; copy->bearer = NULL; copy->userid = NULL; copy->passwd = NULL; #ifdef WITH_NTLM copy->ntlm_challenge = NULL; #endif 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 #ifdef SOAP_DEBUG soap_init_logs(copy); 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 copy->namespaces = soap->local_namespaces; copy->local_namespaces = NULL; soap_set_local_namespaces(copy); /* copy content of soap->local_namespaces */ copy->namespaces = soap->namespaces; /* point to shared read-only namespaces table */ copy->c_locale = NULL; #ifdef WITH_OPENSSL copy->bio = NULL; copy->ssl = NULL; copy->session = NULL; copy->session_host[0] = '\0'; copy->session_port = 443; #endif #ifdef WITH_GNUTLS copy->session = NULL; #endif #ifdef WITH_ZLIB copy->d_stream = NULL; copy->z_buf = NULL; #endif #ifndef WITH_NOIDREF soap_init_iht(copy); #endif soap_init_pht(copy); 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) { struct soap_plugin *q = (struct soap_plugin*)SOAP_MALLOC(copy, sizeof(struct soap_plugin)); if (!q) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not allocate plugin '%s'\n", p->id)); soap_end(copy); soap_done(copy); return NULL; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying plugin '%s'\n", p->id)); *q = *p; if (p->fcopy && (copy->error = p->fcopy(copy, q, p)) != SOAP_OK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not copy plugin '%s' error = %d\n", p->id, copy->error)); SOAP_FREE(copy, q); soap_end(copy); soap_done(copy); return NULL; } q->next = copy->plugins; copy->plugins = q; } } #ifdef WITH_SELF_PIPE pipe(copy->pipe_fd); SOAP_SOCKNONBLOCK(copy->pipe_fd[0]) SOAP_SOCKNONBLOCK(copy->pipe_fd[1]) #endif return copy; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_copy_stream(struct soap *copy, struct soap *soap) { struct soap_attribute *tp = NULL, *tq; if (copy == soap) return; copy->header = soap->header; copy->mode = soap->mode; copy->imode = soap->imode; copy->omode = soap->omode; copy->socket = soap->socket; copy->sendsk = soap->sendsk; copy->recvsk = soap->recvsk; copy->transfer_timeout = soap->transfer_timeout; copy->recv_maxlength = soap->recv_maxlength; copy->recv_timeout = soap->recv_timeout; copy->send_timeout = soap->send_timeout; copy->connect_timeout = soap->connect_timeout; copy->accept_timeout = soap->accept_timeout; copy->socket_flags = soap->socket_flags; copy->connect_flags = soap->connect_flags; copy->connect_retry = soap->connect_retry; copy->bind_flags = soap->bind_flags; copy->bind_inet6 = soap->bind_inet6; copy->bind_v6only = soap->bind_v6only; copy->accept_flags = soap->accept_flags; copy->sndbuf = soap->sndbuf; copy->rcvbuf = soap->rcvbuf; copy->linger_time = soap->linger_time; copy->maxlevel = soap->maxlevel; copy->maxlength = soap->maxlength; copy->maxoccurs = soap->maxoccurs; copy->os = soap->os; copy->is = soap->is; 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; copy->ip = soap->ip; copy->ip6[0] = soap->ip6[0]; copy->ip6[1] = soap->ip6[1]; copy->ip6[2] = soap->ip6[2]; copy->ip6[3] = soap->ip6[3]; copy->port = soap->port; (void)soap_memcpy((void*)copy->host, sizeof(copy->host), (const void*)soap->host, sizeof(soap->host)); (void)soap_memcpy((void*)copy->endpoint, sizeof(copy->endpoint), (const void*)soap->endpoint, sizeof(soap->endpoint)); #endif #ifdef WITH_OPENSSL copy->bio = soap->bio; copy->ctx = soap->ctx; copy->ssl = soap->ssl; #endif #ifdef WITH_GNUTLS copy->session = soap->session; #endif #ifdef WITH_SYSTEMSSL copy->ctx = soap->ctx; copy->ssl = soap->ssl; #endif #ifdef WITH_ZLIB copy->zlib_state = soap->zlib_state; copy->zlib_in = soap->zlib_in; copy->zlib_out = soap->zlib_out; if (soap->d_stream && soap->zlib_state != SOAP_ZLIB_NONE) { if (!copy->d_stream) copy->d_stream = (z_stream*)SOAP_MALLOC(copy, sizeof(z_stream)); if (copy->d_stream) (void)soap_memcpy((void*)copy->d_stream, sizeof(z_stream), (const void*)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, sizeof(soap->buf)); if (copy->z_buf) (void)soap_memcpy((void*)copy->z_buf, sizeof(soap->buf), (const void*)soap->z_buf, sizeof(soap->buf)); } copy->z_dict = soap->z_dict; copy->z_dict_len = soap->z_dict_len; #endif (void)soap_memcpy((void*)copy->buf, sizeof(copy->buf), (const void*)soap->buf, sizeof(soap->buf)); /* copy XML parser state */ soap_free_ns(copy); soap_set_local_namespaces(copy); copy->version = soap->version; if (soap->nlist && soap->local_namespaces) { struct soap_nlist *np = NULL, *nq; /* copy reversed nlist */ for (nq = soap->nlist; nq; nq = nq->next) { struct soap_nlist *nr = np; size_t n = sizeof(struct soap_nlist) + strlen(nq->id); np = (struct soap_nlist*)SOAP_MALLOC(copy, n); if (!np) { np = nr; break; } (void)soap_memcpy((void*)np, n, (const void*)nq, n); np->next = nr; } while (np) { const char *s = np->ns; copy->level = np->level; /* preserve element nesting level */ if (!s && np->index >= 0) { s = soap->local_namespaces[np->index].out; if (!s) s = soap->local_namespaces[np->index].ns; } if (s) (void)soap_push_namespace(copy, np->id, s); nq = np; np = np->next; SOAP_FREE(copy, nq); } } (void)soap_memcpy((void*)copy->tag, sizeof(copy->tag), (const void*)soap->tag, sizeof(soap->tag)); (void)soap_memcpy((void*)copy->id, sizeof(copy->id), (const void*)soap->id, sizeof(soap->id)); (void)soap_memcpy((void*)copy->href, sizeof(copy->href), (const void*)soap->href, sizeof(soap->href)); (void)soap_memcpy((void*)copy->type, sizeof(copy->type), (const void*)soap->type, sizeof(soap->type)); copy->other = soap->other; copy->root = soap->root; copy->null = soap->null; copy->body = soap->body; copy->part = soap->part; copy->mustUnderstand = soap->mustUnderstand; copy->level = soap->level; copy->peeked = soap->peeked; /* copy attributes */ for (tq = soap->attributes; tq; tq = tq->next) { struct soap_attribute *tr = tp; size_t n = sizeof(struct soap_attribute) + strlen(tq->name); tp = (struct soap_attribute*)SOAP_MALLOC(copy, n); (void)soap_memcpy((void*)tp, n, (const void*)tq, n); if (tp->size) { tp->value = (char*)SOAP_MALLOC(copy, tp->size); if (tp->value) (void)soap_memcpy((void*)tp->value, tp->size, (const void*)tq->value, tp->size); } tp->ns = NULL; tp->next = tr; } copy->attributes = tp; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_free_stream(struct soap *soap) { soap->socket = SOAP_INVALID_SOCKET; soap->sendsk = SOAP_INVALID_SOCKET; soap->recvsk = SOAP_INVALID_SOCKET; #ifdef WITH_OPENSSL soap->bio = NULL; soap->ctx = NULL; soap->ssl = NULL; #endif #ifdef WITH_GNUTLS soap->xcred = NULL; soap->acred = NULL; soap->cache = NULL; soap->session = NULL; soap->dh_params = NULL; soap->rsa_params = NULL; #endif #ifdef WITH_SYSTEMSSL soap->ctx = (gsk_handle)NULL; soap->ssl = (gsk_handle)NULL; #endif #ifdef WITH_ZLIB if (soap->z_buf) SOAP_FREE(soap, soap->z_buf); soap->z_buf = NULL; #endif } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_initialize(struct soap *soap) { soap_versioning(soap_init)(soap, SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_versioning(soap_init)(struct soap *soap, soap_mode imode, soap_mode omode) { size_t i; soap->state = SOAP_INIT; #ifdef SOAP_MEM_DEBUG soap_init_mht(soap); #endif #ifdef SOAP_DEBUG soap_init_logs(soap); #endif #ifdef TANDEM_NONSTOP soap_set_test_logfile(soap, "TESTLOG"); soap_set_sent_logfile(soap, "SENTLOG"); soap_set_recv_logfile(soap, "RECVLOG"); #else soap_set_test_logfile(soap, "TEST.log"); soap_set_sent_logfile(soap, "SENT.log"); soap_set_recv_logfile(soap, "RECV.log"); #endif #ifdef WITH_SELF_PIPE pipe(soap->pipe_fd); SOAP_SOCKNONBLOCK(soap->pipe_fd[0]) SOAP_SOCKNONBLOCK(soap->pipe_fd[1]) #endif soap->version = 0; soap->imode = imode; soap->omode = omode; soap->mode = imode; soap->plugins = NULL; soap->user = NULL; for (i = 0; i < sizeof(soap->data)/sizeof(*soap->data); i++) soap->data[i] = NULL; soap->bearer = NULL; soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif #ifndef WITH_NOHTTP soap->fpost = http_post; soap->fget = http_get; soap->fput = http_put; soap->fpatch = http_patch; soap->fdel = http_del; soap->fopt = http_200; soap->fhead = http_200; 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; /* in_addr_t value */ soap->ipv4_multicast_if = NULL; /* points to struct in_addr or in_addr_t */ soap->ipv4_multicast_ttl = 0; /* 0: use default */ soap->client_addr = NULL; /* client address (IPv4 or IPv6 or host name) to bind before connect, NULL for none */ soap->client_addr_ipv6 = NULL; /* client address IPv6 or host name to bind before connect, NULL for none */ soap->client_port = -1; /* client port to bind before connect, -1 for none */ soap->client_interface = NULL; /* client interface address, NULL for none */ #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; #ifndef WITH_LEANER soap->fsvalidate = NULL; soap->fwvalidate = NULL; soap->feltbegin = NULL; soap->feltendin = NULL; soap->feltbegout = NULL; soap->feltendout = NULL; soap->fprepareinitsend = NULL; soap->fprepareinitrecv = NULL; soap->fpreparesend = NULL; soap->fpreparerecv = NULL; soap->fpreparefinalsend = NULL; soap->fpreparefinalrecv = NULL; soap->ffiltersend = NULL; soap->ffilterrecv = 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->long_double_format = NULL; /* Defined in custom serializer custom/long_double.c */ soap->dime_id_format = "cid:id%d"; /* default DIME id format for int id index */ soap->recv_maxlength = 0x7FFFFFFF; /* default max length of messages received (2GB) */ soap->recv_timeout = 0; soap->send_timeout = 0; soap->transfer_timeout = 0; soap->connect_timeout = 0; soap->accept_timeout = 0; soap->socket_flags = 0; soap->connect_flags = 0; soap->connect_retry = 0; soap->bind_flags = 0; #ifdef WITH_IPV6_V6ONLY soap->bind_inet6 = 1; soap->bind_v6only = 1; #else soap->bind_inet6 = 0; soap->bind_v6only = 0; #endif soap->accept_flags = 0; #ifdef WIN32 soap->sndbuf = SOAP_BUFLEN + 1; /* this size speeds up windows xfer */ soap->rcvbuf = SOAP_BUFLEN + 1; #else soap->sndbuf = SOAP_BUFLEN; soap->rcvbuf = SOAP_BUFLEN; #endif soap->linger_time = 0; soap->maxlevel = SOAP_MAXLEVEL; soap->maxlength = SOAP_MAXLENGTH; soap->maxoccurs = SOAP_MAXOCCURS; soap->http_version = "1.1"; soap->proxy_http_version = "1.0"; soap->http_content = NULL; soap->http_extra_header = 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->ip = 0; soap->ip6[0] = 0; soap->ip6[1] = 0; soap->ip6[2] = 0; soap->ip6[3] = 0; soap->labbuf = NULL; soap->lablen = 0; soap->labidx = 0; soap->encodingStyle = NULL; #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->shaky = 0; soap->attributes = NULL; soap->header = NULL; soap->fault = NULL; soap->master = SOAP_INVALID_SOCKET; soap->socket = SOAP_INVALID_SOCKET; soap->sendsk = SOAP_INVALID_SOCKET; soap->recvsk = 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->tag[0] = '\0'; 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->endpoint[0] = '\0'; soap->host[0] = '\0'; soap->path[0] = '\0'; soap->port = 0; soap->override_host = NULL; soap->override_port = 0; soap->action = NULL; soap->proxy_host = NULL; soap->proxy_port = 8080; soap->proxy_userid = NULL; soap->proxy_passwd = NULL; soap->proxy_from = NULL; soap->origin = NULL; soap->cors_origin = NULL; soap->cors_allow = "*"; soap->cors_method = NULL; soap->cors_header = NULL; soap->cors_methods = NULL; soap->cors_headers = NULL; soap->x_frame_options = "SAMEORIGIN"; soap->prolog = "\n"; soap->zlib_state = SOAP_ZLIB_NONE; soap->zlib_in = SOAP_ZLIB_NONE; soap->zlib_out = SOAP_ZLIB_NONE; soap->d_stream = NULL; soap->z_buf = NULL; soap->z_level = 6; soap->z_dict = NULL; soap->z_dict_len = 0; #ifndef WITH_LEAN soap->wsuid = NULL; soap->c14nexclude = NULL; soap->c14ninclude = 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 #ifndef WITH_NOIDREF soap_init_iht(soap); #endif soap_init_pht(soap); #ifdef WITH_OPENSSL if (!soap_ssl_init_done) soap_ssl_init(); soap->fsslauth = ssl_auth_init; soap->fsslverify = NULL; soap->bio = NULL; soap->ssl = NULL; soap->ctx = NULL; soap->session = NULL; soap->session_host[0] = '\0'; soap->session_port = 443; soap->ssl_flags = SOAP_SSL_DEFAULT; soap->keyfile = NULL; soap->keyid = NULL; soap->password = NULL; soap->cafile = NULL; soap->capath = NULL; soap->crlfile = NULL; soap->dhfile = NULL; soap->randfile = NULL; #endif #ifdef WITH_GNUTLS if (!soap_ssl_init_done) soap_ssl_init(); soap->fsslauth = ssl_auth_init; soap->fsslverify = NULL; soap->xcred = NULL; soap->acred = NULL; soap->cache = NULL; soap->session = NULL; soap->ssl_flags = SOAP_SSL_DEFAULT; soap->keyfile = NULL; soap->keyid = NULL; soap->password = NULL; soap->cafile = NULL; soap->capath = NULL; soap->crlfile = NULL; soap->dh_params = NULL; soap->rsa_params = NULL; #endif #ifdef WITH_SYSTEMSSL soap->fsslauth = ssl_auth_init; soap->fsslverify = NULL; soap->bio = NULL; soap->ssl = (gsk_handle)NULL; soap->ctx = (gsk_handle)NULL; soap->session = NULL; soap->ssl_flags = SOAP_SSL_DEFAULT; soap->keyfile = NULL; soap->keyid = NULL; soap->password = NULL; soap->cafile = NULL; soap->capath = NULL; soap->crlfile = NULL; soap->dhfile = NULL; soap->randfile = NULL; #endif soap->c_locale = NULL; soap->buflen = 0; soap->bufidx = 0; #ifndef WITH_LEANER soap->dime.chunksize = 0; soap->dime.buflen = 0; #endif soap->other = 0; soap->root = -1; soap->null = 0; soap->position = 0; soap->encoding = 0; soap->mustUnderstand = 0; soap->ns = 0; soap->part = SOAP_END; soap->event = 0; soap->evlev = 0; soap->alloced = 0; soap->count = 0; soap->length = 0; soap->cdata = 0; soap->peeked = 0; soap->ahead = 0; soap->idnum = 0; soap->level = 0; soap->status = 0; soap->error = SOAP_OK; soap->errmode = 0; soap->errnum = 0; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_begin(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Clean up for input/output\n")); soap->error = SOAP_OK; if (!soap->keep_alive) { soap->buflen = 0; soap->bufidx = 0; } soap->encoding = 0; soap->mode = 0; soap->part = SOAP_END; soap->peeked = 0; soap->ahead = 0; soap->level = 0; *soap->endpoint = '\0'; soap->encodingStyle = SOAP_STR_EOS; soap_free_temp(soap); } /******************************************************************************/ 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) { 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 } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_version(struct soap *soap, short version) { soap_set_local_namespaces(soap); if (soap->version != version && soap->local_namespaces && soap->local_namespaces[0].id && soap->local_namespaces[1].id) { if (version == 1) { soap->local_namespaces[0].ns = soap_env1; soap->local_namespaces[1].ns = soap_enc1; } else if (version == 2) { soap->local_namespaces[0].ns = soap_env2; soap->local_namespaces[1].ns = soap_enc2; } soap->version = version; } if (version == 0) soap->encodingStyle = SOAP_STR_EOS; else soap->encodingStyle = NULL; } /******************************************************************************/ static void soap_version(struct soap *soap) { struct Namespace *p = soap->local_namespaces; if (p) { const char *ns = p[0].out; if (!ns) ns = p[0].ns; if (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); p[1].out = (char*)SOAP_MALLOC(soap, sizeof(soap_enc1)); if (p[1].out) (void)soap_memcpy(p[1].out, sizeof(soap_enc1), soap_enc1, sizeof(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); p[1].out = (char*)SOAP_MALLOC(soap, sizeof(soap_enc2)); if (p[1].out) (void)soap_memcpy(p[1].out, sizeof(soap_enc2), soap_enc2, sizeof(soap_enc2)); } } } } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_set_namespaces(struct soap *soap, const struct Namespace *p) { struct Namespace *ns = soap->local_namespaces; struct soap_nlist *np, *nq, *nr; 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) { 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) (void)soap_push_namespace(soap, np->id, s); nq = np; np = np->next; SOAP_FREE(soap, nq); } if (ns) { 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; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_local_namespaces(struct soap *soap) { if (soap->namespaces && !soap->local_namespaces) { const struct Namespace *ns1; struct Namespace *ns2; 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) { (void)soap_memcpy((void*)ns2, n, (const void*)soap->namespaces, n); if (ns2[0].ns) { if (!strcmp(ns2[0].ns, soap_env1)) soap->version = 1; else if (!strcmp(ns2[0].ns, soap_env2)) soap->version = 2; } soap->local_namespaces = ns2; for (; ns2->id; ns2++) ns2->out = NULL; } } } /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char * SOAP_FMAC2 soap_tagsearch(const char *big, const char *little) { if (big && little) { size_t n = strlen(little); const char *s = big; while (s) { const char *t = s; size_t i; for (i = 0; i < n; i++, t++) { if (*t != little[i]) break; } if (*t == '\0' || *t == ' ') { if (i == n || (i > 0 && little[i-1] == ':')) return s; } s = strchr(t, ' '); if (s) s++; } } return NULL; } #endif /******************************************************************************/ SOAP_FMAC1 struct soap_nlist * SOAP_FMAC2 soap_lookup_ns(struct soap *soap, const char *tag, size_t n) { 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; } /******************************************************************************/ #ifndef WITH_LEAN static struct soap_nlist * soap_push_ns(struct soap *soap, const char *id, const char *ns, short utilized, short isearly) { struct soap_nlist *np = NULL; size_t n, k; unsigned int level = soap->level + isearly; if (soap_tagsearch(soap->c14nexclude, id)) return NULL; if (!utilized) { for (np = soap->nlist; np; np = np->next) { if (!strcmp(np->id, id) && ((!np->ns && *id) || (np->ns && !strcmp(np->ns, ns)))) break; } if (np) { if ((np->level < level || (!np->ns && *id)) && np->index == 1) utilized = 1; else return NULL; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Adding namespace binding (level=%u) '%s' '%s' utilized=%d\n", level, id, ns ? ns : "(null)", utilized)); n = strlen(id); if (ns) k = strlen(ns) + 1; else k = 0; if (sizeof(struct soap_nlist) + n + k > n && (SOAP_MAXALLOCSIZE <= 0 || sizeof(struct soap_nlist) + n + k <= SOAP_MAXALLOCSIZE)) np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k); if (!np) { soap->error = SOAP_EOM; return NULL; } np->next = soap->nlist; soap->nlist = np; soap_strcpy((char*)np->id, n + 1, id); if (ns) { np->ns = np->id + n + 1; soap_strcpy((char*)np->ns, k, ns); } else { np->ns = NULL; } np->level = level; np->index = utilized; return np; } #endif /******************************************************************************/ #ifndef WITH_LEAN static void soap_utilize_ns(struct soap *soap, const char *tag, short isearly) { struct soap_nlist *np; size_t n = 0; if (!strncmp(tag, "xmlns:", 6)) { tag += 6; n = strlen(tag); } else { const char *t = strchr(tag, ':'); if (t) n = t - tag; } np = soap_lookup_ns(soap, tag, n); if (np) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Utilizing namespace of '%s' at level %u utilized=%d at level=%u\n", tag, soap->level + isearly, np->index, np->level)); if (np->index <= 0) { if (np->level == soap->level + isearly) np->index = 1; else (void)soap_push_ns(soap, np->id, np->ns, 1, isearly); } } else if (strncmp(tag, "xml", 3)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Utilizing default namespace of '%s' at level %u\n", tag, soap->level + isearly)); (void)soap_strncpy(soap->tag, sizeof(soap->tag), tag, n); (void)soap_push_ns(soap, soap->tag, NULL, 1, isearly); } } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element(struct soap *soap, const char *tag, int id, const char *type) { #ifndef WITH_LEAN const char *s; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element begin tag='%s' level='%u' id='%d' type='%s'\n", tag, soap->level, id, type ? type : SOAP_STR_EOS)); #ifdef WITH_DOM #ifndef WITH_LEAN if (soap_tagsearch(soap->wsuid, tag)) { size_t i; for (s = tag, i = 0; *s && i < sizeof(soap->href) - 1; s++, i++) soap->href[i] = *s == ':' ? '-' : *s; soap->href[i] = '\0'; if (soap_set_attr(soap, "wsu:Id", soap->href, 1)) return soap->error; } #endif #endif soap->level++; if (soap->level > soap->maxlevel) return soap->error = SOAP_LEVEL; #ifdef WITH_DOM #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_DOM_ASIS)) { if (soap->evlev >= soap->level) soap->evlev = 0; if (soap->event == SOAP_SEC_BEGIN && !soap->evlev) { struct soap_nlist *np; /* non-nested wsu:Id found: clear xmlns, re-emit them for exc-c14n */ for (np = soap->nlist; np; np = np->next) { int p = soap->c14ninclude ? *soap->c14ninclude == '+' || soap_tagsearch(soap->c14ninclude, np->id) != NULL : 0; if (np->index == 2 || p) { struct soap_nlist *np1 = soap_push_ns(soap, np->id, np->ns, 1, 0); if (np1 && !p) np1->index = 0; } } soap->evlev = soap->level; } } #endif if ((soap->mode & SOAP_XML_DOM)) { struct soap_dom_element *elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element)); if (!elt) return soap->error = SOAP_EOM; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Adding DOM element tag='%s' %p (parent='%s' %p)\n", tag, elt, soap->dom ? soap->dom->name : "(null)", soap->dom)); elt->soap = soap; elt->next = NULL; elt->prnt = soap->dom; elt->elts = NULL; elt->atts = NULL; elt->nstr = NULL; elt->name = soap_strdup(soap, tag); elt->lead = NULL; elt->text = NULL; elt->code = NULL; elt->tail = NULL; elt->node = NULL; elt->type = 0; 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; if (!elt->name) return soap->error = SOAP_EOM; } else { #endif #ifndef WITH_LEAN if (!soap->ns) { if (!(soap->mode & SOAP_XML_CANONICAL) && soap_send(soap, soap->prolog)) 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; } if ((soap->mode & SOAP_XML_DEFAULTNS)) { size_t n = 0; s = strchr(tag, ':'); if (s) n = s++ - tag; else s = tag; if (soap_send_raw(soap, "<", 1) || soap_send(soap, s)) return soap->error; if (n) { struct Namespace *ns = soap->local_namespaces; for (; ns && ns->id; ns++) { if (*ns->id && ns->ns && !strncmp(ns->id, tag, n) && !ns->id[n]) { if (!soap->nlist || *soap->nlist->id || (soap->nlist->ns && strcmp(soap->nlist->ns, ns->ns))) { (void)soap_push_ns(soap, SOAP_STR_EOS, ns->out ? ns->out : ns->ns, 0, 0); if (soap_attribute(soap, "xmlns", ns->out ? ns->out : ns->ns)) return soap->error; } break; } } } #ifndef WITH_NOEMPTYNAMESPACES else if (!soap->nlist || *soap->nlist->id || (soap->nlist->ns && *soap->nlist->ns)) { (void)soap_push_ns(soap, SOAP_STR_EOS, SOAP_STR_EOS, 0, 0); if (soap_attribute(soap, "xmlns", SOAP_STR_EOS)) return soap->error; } #endif } 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 = soap->local_namespaces; int k = -1; if (ns) { while (k-- && ns->id) { const char *t = ns->out; if (!t) t = ns->ns; if (*ns->id && t && *t) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(ns->id) + 6), "xmlns:%s", ns->id); if (soap_attribute(soap, soap->tmpbuf, t)) return soap->error; } ns++; } } } 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)) { if ((soap->mode & SOAP_XML_DEFAULTNS)) soap_utilize_ns(soap, SOAP_STR_EOS, 0); else soap_utilize_ns(soap, tag, 0); } #endif if (id > 0) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), sizeof(SOAP_BASEREFNAME) + 20), SOAP_BASEREFNAME "%d", id); if (soap->version == 2) { if (soap_attribute(soap, "SOAP-ENC:id", soap->tmpbuf)) return soap->error; } else if (soap_attribute(soap, "id", soap->tmpbuf)) { return soap->error; } } if (type && *type && !(soap->mode & SOAP_XML_NOTYPE)) { #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_XML_CANONICAL_NA)) soap_utilize_ns(soap, type, 0); #endif if (soap_attribute(soap, "xsi:type", type)) return soap->error; } if (soap->null && soap->position > 0 && soap->version == 1) { int i; (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf) - 1, 20), "[%d", soap->positions[0]); for (i = 1; i < soap->position; i++) { size_t l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l - 1, 20), ",%d", soap->positions[i]); } soap_strcat(soap->tmpbuf, sizeof(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 && soap->local_namespaces[0].id && soap->local_namespaces[1].id) { 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->encodingStyle && soap_attribute(soap, "SOAP-ENV:encodingStyle", soap->encodingStyle)) return soap->error; } else { soap->encodingStyle = NULL; } soap->encoding = 0; } soap->null = 0; soap->position = 0; return SOAP_OK; } /******************************************************************************/ 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; #ifdef WITH_DOM if (soap->feltbegout) return soap->error = soap->feltbegout(soap, tag, id, type); #endif if (soap_element(soap, tag, id, type)) return soap->error; return soap_element_start_end_out(soap, NULL); } /******************************************************************************/ #if _MSC_VER < 1400 && !defined(HAVE_STRLCAT) /* concat string (truncating the result, strings must not be NULL) */ SOAP_FMAC1 void SOAP_FMAC2 soap_strcat(char *t, size_t n, const char *s) { size_t k = strlen(t); if (k < n) { t += k; n -= k; while (--n > 0 && *s) *t++ = *s++; *t = '\0'; } } #endif /******************************************************************************/ #if _MSC_VER < 1400 /* concat string up to m chars (leaves destination intact on overrun and returns nonzero, zero if OK) */ SOAP_FMAC1 int SOAP_FMAC2 soap_strncat(char *t, size_t n, const char *s, size_t m) { size_t k; if (!t || !s) return 1; k = strlen(t); if (n <= k + m) return 1; t += k; n -= k; while (--n > 0 && *s) *t++ = *s++; *t = '\0'; return 0; } #endif /******************************************************************************/ #ifndef HAVE_STRRCHR SOAP_FMAC1 char* SOAP_FMAC2 soap_strrchr(const char *s, int t) { char *r = NULL; while (*s) if (*s++ == t) r = (char*)s - 1; return r; } #endif /******************************************************************************/ #ifndef HAVE_STRTOL SOAP_FMAC1 long SOAP_FMAC2 soap_strtol(const char *s, char **t, int b) { long n = 0; 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')) { if (neg && n == 214748364 && c == '8') { if (t) *t = (char*)(s + 1); return -2147483648; } break; } n *= 10; n += c - '0'; s++; } if (neg) n = -n; } else /* assume 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 /******************************************************************************/ #ifndef HAVE_STRTOUL SOAP_FMAC1 unsigned long SOAP_FMAC2 soap_strtoul(const char *s, char **t, int b) { unsigned long n = 0; 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 >= 429496729 && (n > 429496729 || c >= '6')) break; n *= 10; n += c - '0'; s++; } if (neg && n > 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 /******************************************************************************/ #ifndef soap_strtoll SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_strtoll(const char *s, char **t, int b) { LONG64 n = 0LL; 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 >= 922337203685477580LL && (n > 922337203685477580LL || c >= '8')) { if (neg && n == 922337203685477580LL && c == '8') { if (t) *t = (char*)(s + 1); return -9223372036854775807LL - 1LL; /* appease compilers that complain */ } break; } n *= 10LL; n += c - '0'; s++; } if (neg) n = -n; } else /* assume 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 > 0x07FFFFFFFFFFFFFFLL) break; n <<= 4; n += c; s++; } } if (t) *t = (char*)s; return n; } #endif /******************************************************************************/ #ifndef soap_strtoull SOAP_FMAC1 ULONG64 SOAP_FMAC2 soap_strtoull(const char *s, char **t, int b) { ULONG64 n = 0UL; 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 >= 1844674407370955161ULL) break; n *= 10UL; n += c - '0'; s++; } if (neg && n > 0UL) 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 > 0x0FFFFFFFFFFFFFFFULL) break; n <<= 4; n += c; s++; } } if (t) *t = (char*)s; return n; } #endif /******************************************************************************/ 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 || soap->version == 0) return soap_element_begin_out(soap, tag, id, NULL); if (soap_element(soap, tag, id, NULL)) return soap->error; if (soap->version == 1) { if (offset && soap_attribute(soap, "SOAP-ENC:offset", offset)) return soap->error; if (soap_attribute(soap, "SOAP-ENC:arrayType", type)) return soap->error; } else { const char *s; s = strchr(type, '['); if (s && (size_t)(s - type) < sizeof(soap->tmpbuf)) { (void)soap_strncpy(soap->tmpbuf, sizeof(soap->tmpbuf), type, s - type); if (soap_attribute(soap, "SOAP-ENC:itemType", soap->tmpbuf)) return soap->error; s++; if (*s && *s != ']') { soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), s); soap->tmpbuf[strlen(soap->tmpbuf) - 1] = '\0'; if (soap_attribute(soap, "SOAP-ENC:arraySize", soap->tmpbuf)) return soap->error; } } } #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_XML_CANONICAL_NA)) soap_utilize_ns(soap, type, 0); #endif return soap_element_start_end_out(soap, NULL); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_start_end_out(struct soap *soap, const char *tag) { 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 && strchr(tp->name, ':')) soap_utilize_ns(soap, tp->name, 0); } if (soap->event == SOAP_SEC_BEGIN) { for (np = soap->nlist; np; np = np->next) if (soap_tagsearch(soap->c14ninclude, np->id)) (void)soap_push_ns(soap, np->id, np->ns, 1, 0); soap->event = 0; soap->evlev = 0; } for (np = soap->nlist; np; np = np->next) { if (np->ns && np->index == 1) { if (*np->id) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(np->id) + 6), "xmlns:%s", np->id); else soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "xmlns"); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enabling utilized binding (level=%u) %s='%s' SEC-BEGIN=%d c14ninclude='%s'\n", np->level, soap->tmpbuf, np->ns, soap->event == SOAP_SEC_BEGIN, soap->c14ninclude ? soap->c14ninclude : "(null)")); np->index = 2; soap->level--; if (*np->id || *np->ns || soap->level > 1) if (soap_set_attr(soap, soap->tmpbuf, np->ns, 1)) return soap->error; soap->level++; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Binding (level=%u) %s='%s' utilized=%d\n", np->level, np->id, np->ns, np->index)); } } } #endif #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { 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)->text = soap_strdup(soap, tp->value); (*att)->soap = soap; if (!(*att)->name || (tp->value && !(*att)->text)) return soap->error = SOAP_EOM; att = &(*att)->next; tp->visible = 0; } } return SOAP_OK; } #endif for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { if (soap_send_raw(soap, " ", 1) || 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, tp->flag) || soap_send_raw(soap, "\"", 1)) return soap->error; } else { if (soap_send_raw(soap, "=\"\"", 3)) 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 if (soap->nlist) soap_pop_namespace(soap); soap->level--; /* decrement level just before /> */ soap->body = 0; return soap_send_raw(soap, "/>", 2); } return soap_send_raw(soap, ">", 1); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_out(struct soap *soap, const char *tag) { if (*tag == '-') return SOAP_OK; #ifdef WITH_DOM if (soap->feltendout) return soap->error = soap->feltendout(soap, tag); #endif return soap_element_end(soap, tag); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_end(struct soap *soap, const char *tag) { #ifndef WITH_LEAN const char *s; #endif 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->nlist) soap_pop_namespace(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; } if ((soap->mode & SOAP_XML_DEFAULTNS) && (s = strchr(tag, ':')) != NULL) tag = s + 1; #endif if (soap_send_raw(soap, "error; soap->level--; /* decrement level just before > */ return soap_send_raw(soap, ">", 1); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_ref(struct soap *soap, const char *tag, int id, int href) { const char *s = "ref"; int n = 1; if (soap->version == 1) { s = "href"; n = 0; } else if (soap->version == 2) { s = "SOAP-ENC:ref"; } (SOAP_SNPRINTF(soap->href, sizeof(soap->href), sizeof(SOAP_BASEREFNAME) + 21), "#" SOAP_BASEREFNAME "%d", href); return soap_element_href(soap, tag, id, s, soap->href + n); } /******************************************************************************/ 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; soap->body = 0; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_null(struct soap *soap, const char *tag, int id, const char *type) { struct soap_attribute *tp = NULL; 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) || (!tp && soap_attribute(soap, "xsi:nil", "true")) || soap_element_start_end_out(soap, tag)) return soap->error; soap->body = 0; } else { soap->null = 1; soap->position = 0; soap->mustUnderstand = 0; } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_empty(struct soap *soap, const char *tag) { if (soap_element(soap, tag, -1, NULL)) return soap->error; return soap_element_start_end_out(soap, tag); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_nil(struct soap *soap, const char *tag) { if (soap_element(soap, tag, -1, NULL) || (soap_attribute(soap, "xsi:nil", "true"))) return soap->error; return soap_element_start_end_out(soap, tag); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_id(struct soap *soap, const char *tag, int id, const void *p, const void *a, int n, const char *type, int t, char **mark) { (void)a; (void)n; if (!p) { soap->error = soap_element_null(soap, tag, id, type); return -1; } #ifndef WITH_NOIDREF DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element_id %p type=%d id=%d\n", p, t, id)); if ((!soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH)) || (soap->mode & SOAP_XML_TREE)) return soap_check_and_mark(soap, p, t, mark); if (mark) *mark = NULL; if (id < -1) return soap_embed(soap, p, a, n, t); else 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 soap_check_and_mark(soap, p, t, mark); #endif } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_check_and_mark(struct soap *soap, const void *p, int t, char **mark) { if (mark) { struct soap_plist *pp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Check %p and mark %p\n", p, (void*)mark)); if (!soap_pointer_lookup(soap, p, t, &pp)) if (!soap_pointer_enter(soap, p, NULL, 0, t, &pp)) return -1; if ((soap->mode & SOAP_IO_LENGTH)) { if (pp->mark1 > 0) return -1; pp->mark1 = 1; *mark = &pp->mark1; } else { if (pp->mark2 > 0) return -1; pp->mark2 = 1; *mark = &pp->mark2; } } return 0; } /******************************************************************************/ SOAP_FMAC1 void * SOAP_FMAC2 soap_mark_lookup(struct soap *soap, const void *p, int t, struct soap_plist **ppp, char **mark) { if (!soap) return NULL; if (mark || !(soap->mode & SOAP_XML_TREE)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Mark lookup %p type=%d\n", p, t)); if (!soap_pointer_lookup(soap, p, t, ppp)) { if (!soap_pointer_enter(soap, p, NULL, 0, t, ppp)) return NULL; } else if (!(soap->mode & SOAP_XML_TREE)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Mark found %p\n", (*ppp)->dup)); return (*ppp)->dup; } if (mark) { if ((*ppp)->mark1 > 0) (*ppp)->mark1 = 2; /* cycle */ else (*ppp)->mark1 = 1; /* cycle detection */ *mark = &(*ppp)->mark1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Mark cycle %d\n", (*ppp)->mark1)); } } return NULL; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_mark_cycle(struct soap *soap, struct soap_plist *pp) { (void)soap; return pp && pp->mark1 == 2 && (soap->mode & SOAP_XML_TREE); } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_mark_dup(struct soap *soap, void *a, struct soap_plist *pp) { (void)soap; if (pp) pp->dup = a; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_unmark(struct soap *soap, char *mark) { (void)soap; if (mark) *mark = 0; /* release detection */ } /******************************************************************************/ 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; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_check_result(struct soap *soap, const char *tag) { (void)tag; if (soap->version == 2 && soap->encodingStyle) { soap_instring(soap, ":result", NULL, NULL, 0, 2, -1, -1, NULL); /* just ignore content for compliance reasons, but should compare tag to element's QName value? */ } } /******************************************************************************/ 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) { 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->text = soap_strdup(soap, value); a->soap = soap; soap->dom->atts = a; if (!a->name || (value && !a->text)) return soap->error = SOAP_EOM; return SOAP_OK; } #endif #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) { /* push namespace */ if (!strncmp(name, "xmlns", 5) && ((name[5] == ':') || name[5] == '\0')) { if (name[5] == ':' && soap->c14ninclude && ((*soap->c14ninclude == '*' || soap_tagsearch(soap->c14ninclude, name + 6)))) soap_utilize_ns(soap, name, 0); (void)soap_push_ns(soap, name + 5 + (name[5] == ':'), value, 0, 0); } else { soap->level--; if (soap_set_attr(soap, name, value, 1)) return soap->error; soap->level++; } } else #endif { if (soap_send_raw(soap, " ", 1) || 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; } /******************************************************************************/ 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; soap->error = soap_match_tag(soap, soap->tag, tag); if (!soap->error) { if (type && *soap->type && soap_match_tag(soap, soap->type, type)) return soap->error = SOAP_TYPE; soap->peeked = 0; if (!nillable && soap->null && (soap->mode & SOAP_XML_STRICT)) return soap->error = SOAP_NULL; if (soap->body) { soap->level++; if (soap->level > soap->maxlevel) return soap->error = SOAP_LEVEL; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin tag found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag ? tag : SOAP_STR_EOS)); soap->error = SOAP_OK; } } else if (soap->error == SOAP_NO_TAG && tag && *tag == '-') { soap->error = SOAP_OK; } return soap->error; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_in(struct soap *soap, const char *tag) { soap_wchar c; char *s = NULL; 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 significant for DOM "as-is" */ if ((soap->mode & SOAP_XML_DOM) && soap->dom) { const char *t = soap->dom->code; /* save XML code */ s = soap_string_in(soap, -1, -1, -1, NULL); if (!soap->peeked && !s) return soap->error; if (soap->dom->prnt) soap->dom = soap->dom->prnt; if (s && (soap->mode & SOAP_XML_STRICT)) { for (; *s; s++) if (!soap_coblank((soap_wchar)*s)) return soap->error = SOAP_END_TAG; /* reject mixed content before ending tag */ } soap->dom->code = t; /* restore XML code */ } #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_CHK_EOF; if (!soap_coblank(c)) { if ((soap->mode & SOAP_XML_STRICT)) return soap->error = SOAP_END_TAG; /* reject mixed content before ending tag */ if (c == SOAP_LT) n++; else if (c == '/') { c = soap_get(soap); if (c == SOAP_GT && n > 0) n--; else soap_unget(soap, c); } } } } while (n-- > 0); s = soap->tag; n = sizeof(soap->tag); while ((c = soap_get(soap)) > 32) { if (n > 1) { *s++ = (char)c; n--; } } *s = '\0'; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; while (soap_coblank(c)) c = soap_get(soap); if (c != SOAP_GT) return soap->error = SOAP_SYNTAX_ERROR; #ifndef WITH_LEAN #ifdef WITH_DOM if (soap->feltendin) { int err = soap->error; soap->error = soap->feltendin(soap, soap->tag, tag); if (soap->error) return soap->error; if (err) return soap->error = err; /* restore error */ } #endif #endif 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 tag '%s' does not match '%s'\n", soap->tag, tag ? tag : SOAP_STR_EOS)); return soap->error = SOAP_SYNTAX_ERROR; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End tag found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag ? tag : SOAP_STR_EOS)); soap->level--; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 const char * SOAP_FMAC2 soap_attr_value(struct soap *soap, const char *name, int flag, int occurs) { struct soap_attribute *tp; if (*name == '-') return SOAP_STR_EOS; for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible == 2 && !soap_match_att(soap, tp->name, name)) break; } if (tp) { if (occurs == 4 || (occurs == 2 && (soap->mode & SOAP_XML_STRICT))) soap->error = SOAP_PROHIBITED; else if (flag >= 4) return soap_collapse(soap, tp->value, flag, 1); else return tp->value; } else if (occurs == 3 || (occurs == 1 && (soap->mode & SOAP_XML_STRICT))) { soap->error = SOAP_REQUIRED; } else { soap->error = SOAP_OK; } return NULL; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_set_attr(struct soap *soap, const char *name, const char *value, int flag) { struct soap_attribute *tp, *tq; if (*name == '-') return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set attribute %s='%s'\n", name, value ? value : SOAP_STR_EOS)); tq = NULL; for (tp = soap->attributes; tp; tq = tp, tp = tp->next) { if (!strcmp(tp->name, name)) break; } if (!tp) { size_t l = strlen(name); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute %s\n", name)); if (sizeof(struct soap_attribute) + l > l && (SOAP_MAXALLOCSIZE <= 0 || sizeof(struct soap_attribute) + l <= SOAP_MAXALLOCSIZE)) tp = (struct soap_attribute*)SOAP_MALLOC(soap, sizeof(struct soap_attribute) + l); if (!tp) 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 { struct soap_nlist *np = soap_lookup_ns(soap, name, s - name); if (np) { tp->ns = np->ns; } else { struct soap_attribute *tq; for (tq = soap->attributes; tq; tq = tq->next) { if (!strncmp(tq->name, "xmlns:", 6) && !strncmp(tq->name + 6, name, s - name) && !tq->name[6 + s - name]) { tp->ns = tq->ns; break; } } } for (; *tpp; tpp = &(*tpp)->next) { int k; 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 if (tq) { tq->next = tp; tp->next = NULL; } else { tp->next = soap->attributes; soap->attributes = tp; } soap_strcpy((char*)tp->name, l + 1, 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, (void*)tp->value)); SOAP_FREE(soap, tp->value); tp->value = NULL; tp->ns = NULL; } if (value) { if (!tp->value) { tp->size = strlen(value) + 1; if (SOAP_MAXALLOCSIZE <= 0 || tp->size <= SOAP_MAXALLOCSIZE) tp->value = (char*)SOAP_MALLOC(soap, tp->size); if (!tp->value) return soap->error = SOAP_EOM; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute value for %s (%p)\n", tp->name, (void*)tp->value)); } soap_strcpy(tp->value, tp->size, value); if (!strncmp(tp->name, "xmlns:", 6)) tp->ns = tp->value; tp->visible = 2; tp->flag = (short)flag; #ifndef WITH_LEAN if (!strcmp(name, "wsu:Id")) { soap->event = SOAP_SEC_BEGIN; soap_strcpy(soap->id, sizeof(soap->id), value); } if ((soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_XML_CANONICAL_NA)) { const char *s = strchr(name, ':'); if (s && strchr(value, ':')) { struct soap_nlist *np = soap_lookup_ns(soap, name, s - name); if (np && np->ns && soap->local_namespaces) { if ((!strcmp(s + 1, "type") && !strcmp(np->ns, soap->local_namespaces[2].ns)) /* xsi:type QName */ || ((!strcmp(s + 1, "arrayType") || !strcmp(s + 1, "itemType")) && !strcmp(np->ns, soap->local_namespaces[1].ns))) /* SOAP-ENC:arrayType and SOAP-ENC:itemType QName */ soap_utilize_ns(soap, value, 1); } } } #endif } else { tp->visible = 1; } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_clr_attr(struct soap *soap) { 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; } } /******************************************************************************/ static int soap_getattrval(struct soap *soap, char *s, size_t *n, soap_wchar d) { char buf[8]; size_t i; size_t k = *n; size_t m = 0; char *t = buf; for (i = 0; i < k; i++) { soap_wchar c; if (m) { *s++ = *t++; m--; continue; } if ((soap->mode & SOAP_C_UTFSTRING)) { c = soap_get(soap); if ((c & 0x80000000) && c >= -0x7FFFFF80 && c < SOAP_AP) { t = buf; c &= 0x7FFFFFFF; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { #ifdef WITH_REPLACE_ILLEGAL_UTF8 if (!((c >= 0x80 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD) || (c >= 0x10000 && c <= 0x10FFFF))) c = SOAP_UNKNOWN_UNICODE_CHAR; #endif 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 = t - buf - 1; if (i + m >= k) { soap_unget(soap, c | 0x80000000); *n = i; return soap->error = SOAP_EOM; } t = buf; *s++ = *t++; continue; } } else { c = soap_getutf8(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'; *n = i + 1; return SOAP_OK; } *s++ = '>'; break; case SOAP_QT: if (c == d) { *s = '\0'; *n = i + 1; return SOAP_OK; } *s++ = '"'; break; case SOAP_AP: if (c == d) { *s = '\0'; *n = i + 1; return SOAP_OK; } *s++ = '\''; break; case '\t': case '\n': case '\r': case ' ': case '/': if (d == ' ') { soap_unget(soap, c); *s = '\0'; *n = i + 1; return SOAP_OK; } *s++ = (char)c; break; default: if ((int)c == EOF) { *s = '\0'; *n = i + 1; return soap->error = SOAP_CHK_EOF; } *s++ = (char)c; } } return soap->error = SOAP_EOM; } /******************************************************************************/ #ifdef WITH_FAST 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 /******************************************************************************/ #ifdef WITH_FAST SOAP_FMAC1 int SOAP_FMAC2 soap_append_lab(struct soap *soap, const char *s, size_t n) { if (soap->labidx + n < soap->labidx) return soap->error = SOAP_EOM; if (soap->labidx + n >= soap->lablen) { char *t = soap->labbuf; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enlarging look-aside buffer to append data, size=%lu\n", (unsigned long)soap->lablen)); if (soap->lablen == 0) soap->lablen = SOAP_LABLEN; while (soap->labidx + n >= soap->lablen) { if (soap->lablen << 1 < soap->lablen) return soap->error = SOAP_EOM; soap->lablen <<= 1; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New look-aside buffer size=%lu\n", (unsigned long)soap->lablen)); if (SOAP_MAXALLOCSIZE > 0 && soap->lablen > SOAP_MAXALLOCSIZE) return soap->error = SOAP_EOM; soap->labbuf = (char*)SOAP_MALLOC(soap, soap->lablen); if (!soap->labbuf) { if (t) SOAP_FREE(soap, t); return soap->error = SOAP_EOM; } if (t) { (void)soap_memcpy((void*)soap->labbuf, soap->lablen, (const void*)t, soap->labidx); SOAP_FREE(soap, t); } } if (s) { (void)soap_memcpy((void*)(soap->labbuf + soap->labidx), soap->lablen - soap->labidx, (const void*)s, n); soap->labidx += n; } return SOAP_OK; } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_peek_element(struct soap *soap) { #ifdef WITH_DOM struct soap_dom_attribute **att = NULL; char *lead = NULL; #endif struct soap_attribute *tp, *tq = NULL; const char *t; char *s; soap_wchar c; 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; /* UTF-8 BOM? */ c = soap_getchar(soap); if (c == 0xEF && soap_get0(soap) == 0xBB) { soap_get1(soap); c = soap_get1(soap); if (c == 0xBF) soap->mode &= ~SOAP_ENC_LATIN; else soap_unget(soap, (0x0F << 12) | (0xBB << 6) | (c & 0x3F)); /* UTF-8 */ } else if ((c == 0xFE && soap_get0(soap) == 0xFF) /* UTF-16 BE */ || (c == 0xFF && soap_get0(soap) == 0xFE)) /* UTF-16 LE */ { return soap->error = SOAP_UTF_ERROR; } else { soap_unget(soap, c); } c = soap_get(soap); #ifdef WITH_DOM /* whitespace leading up to the start tag is significant for DOM as-is (but comments and PIs are removed from this lead) */ if (soap_coblank(c)) { soap->labidx = 0; do { if (soap_append_lab(soap, NULL, 0)) return soap->error; s = soap->labbuf + soap->labidx; i = soap->lablen - soap->labidx; soap->labidx = soap->lablen; while (soap_coblank(c) && i-- > 0) { *s++ = c; c = soap_get(soap); } } while (soap_coblank(c) || i == 0); *s = '\0'; lead = soap->labbuf; } #else /* skip space */ while (soap_coblank(c)) c = soap_get(soap); #endif if (c != SOAP_LT) { *soap->tag = '\0'; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; soap_unget(soap, c); #ifdef WITH_DOM /* whitespace leading up to the end tag is significant for DOM as-is */ if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (lead && *lead) soap->dom->tail = soap_strdup(soap, lead); else soap->dom->tail = SOAP_STR_EOS; /* body with closing tag instead of */ } #endif return soap->error = SOAP_NO_TAG; } do { c = soap_get1(soap); } while (soap_coblank(c)); s = soap->tag; i = sizeof(soap->tag); while (c != '>' && c != '/' && c > 32 && (int)c != EOF) { if (i > 1) { *s++ = (char)c; i--; } c = soap_get1(soap); } *s = '\0'; while (soap_coblank(c)) c = soap_get1(soap); #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM)) { 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->prnt = soap->dom; elt->elts = NULL; elt->atts = NULL; elt->nstr = NULL; elt->name = soap_strdup(soap, soap->tag); elt->text = NULL; elt->code = NULL; elt->tail = NULL; elt->node = NULL; elt->type = 0; if (lead && *lead) elt->lead = soap_strdup(soap, lead); else elt->lead = 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; if (!elt->name) return soap->error = SOAP_EOM; } #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 != '/' && c > 32 && (int)c != EOF) { if (i > 1) { *s++ = (char)c; i--; } 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)->text = NULL; (*att)->soap = soap; if (!(*att)->name) return soap->error = SOAP_EOM; } #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) { size_t l = strlen(soap->tmpbuf); tp = (struct soap_attribute*)SOAP_MALLOC(soap, sizeof(struct soap_attribute) + l); if (!tp) return soap->error = SOAP_EOM; (void)soap_memcpy((char*)tp->name, l + 1, soap->tmpbuf, l + 1); tp->value = NULL; tp->size = 0; tp->ns = NULL; tp->visible = 0; /* append attribute to the end of the list */ if (tq) { tq->next = tp; tp->next = NULL; } else { tp->next = soap->attributes; soap->attributes = tp; } } while (soap_coblank(c)) c = soap_get1(soap); if (c == '=') { size_t k; do { c = soap_getutf8(soap); } while (soap_coblank(c)); if (c != SOAP_QT && c != SOAP_AP) { soap_unget(soap, c); c = ' '; /* blank delimiter */ } k = tp->size; if (soap_getattrval(soap, tp->value, &k, c)) { #ifdef WITH_FAST if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; if (soap_store_lab(soap, tp->value, k)) return soap->error; if (tp->value) SOAP_FREE(soap, tp->value); tp->value = NULL; for (;;) { k = soap->lablen - soap->labidx; if (soap_getattrval(soap, soap->labbuf + soap->labidx, &k, 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; } tp->value = (char*)SOAP_MALLOC(soap, tp->size); if (!tp->value) return soap->error = SOAP_EOM; soap_strcpy(tp->value, tp->size, soap->labbuf); #else tp->size = k; if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; if (soap_alloc_block(soap) == NULL) return soap->error; for (;;) { s = (char*)soap_push_block(soap, NULL, SOAP_BLKLEN); if (!s) return soap->error; k = SOAP_BLKLEN; if (soap_getattrval(soap, s, &k, c)) { if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; soap_size_block(soap, NULL, k); } else { break; } } k = tp->size + soap->blist->size; if (SOAP_MAXALLOCSIZE > 0 && k > SOAP_MAXALLOCSIZE) return soap->error = SOAP_EOM; s = (char*)SOAP_MALLOC(soap, k); if (!s) return soap->error = SOAP_EOM; if (tp->value) { (void)soap_memcpy((void*)s, k, (const void*)tp->value, tp->size); SOAP_FREE(soap, tp->value); } soap_save_block(soap, NULL, s + tp->size, 0); tp->value = s; tp->size = k; #endif } if (tp->visible) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Duplicate attribute in %s\n", soap->tag)); return soap->error = SOAP_SYNTAX_ERROR; /* redefined (duplicate) attribute */ } tp->visible = 2; /* seen this attribute w/ value */ do { c = soap_get1(soap); } while (soap_coblank(c)); #ifdef WITH_DOM if (att && tp->value) { (*att)->text = soap_strdup(soap, tp->value); if (!(*att)->text) return soap->error = SOAP_EOM; } #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) == NULL) return soap->error; } } #ifdef WITH_DOM if (att) { soap->dom->nstr = soap_current_namespace_tag(soap, soap->tag); for (att = &soap->dom->atts; *att; att = &(*att)->next) (*att)->nstr = soap_current_namespace_att(soap, (*att)->name); } #endif if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; soap->body = (c != '/'); if (!soap->body) { do { c = soap_get1(soap); } while (soap_coblank(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->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH)) { *soap->id = '#'; soap_strcpy(soap->id + 1, sizeof(soap->id) - 1, tp->value); } } else if (!strcmp(tp->name, "href")) { if ((soap->version == 1 && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH) || ((soap->mode & (SOAP_ENC_MTOM | SOAP_ENC_DIME)) && *tp->value != '#')) soap_strcpy(soap->href, sizeof(soap->href), tp->value); } else if (!strcmp(tp->name, "ref")) { if ((soap->version == 2 && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH)) { *soap->href = '#'; soap_strcpy(soap->href + (*tp->value != '#'), sizeof(soap->href) - 1, tp->value); } } #else if (!strcmp(tp->name, "href")) { if ((soap->mode & (SOAP_ENC_MTOM | SOAP_ENC_DIME)) && *tp->value != '#') soap_strcpy(soap->href, sizeof(soap->href), tp->value); } #endif else if (!soap_match_tag(soap, tp->name, "xsi:type")) { soap_strcpy(soap->type, sizeof(soap->type), tp->value); } 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_match_tag(soap, tp->name, "SOAP-ENV:encodingStyle")) { if (!soap->encodingStyle) soap->encodingStyle = SOAP_STR_EOS; soap_version(soap); } 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)) { (void)soap_strncpy(soap->arrayType, sizeof(soap->arrayType), tp->value, s - tp->value); soap_strcpy(soap->arraySize, sizeof(soap->arraySize), s); } else soap_strcpy(soap->arrayType, sizeof(soap->arrayType), tp->value); } else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:offset")) { soap_strcpy(soap->arrayOffset, sizeof(soap->arrayOffset), tp->value); } 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 (!soap_match_tag(soap, tp->name, "SOAP-ENC:id")) { *soap->id = '#'; soap_strcpy(soap->id + 1, sizeof(soap->id) - 1, tp->value); } else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:ref")) { *soap->href = '#'; soap_strcpy(soap->href + (*tp->value != '#'), sizeof(soap->href) - 1, tp->value); } else #endif if (!soap_match_tag(soap, tp->name, "SOAP-ENC:itemType")) { soap_strcpy(soap->arrayType, sizeof(soap->arrayType), tp->value); } else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:arraySize")) { soap_strcpy(soap->arraySize, sizeof(soap->arraySize), tp->value); } 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; } } else { if (!soap_match_tag(soap, tp->name, "wsdl:required") && !strcmp(tp->value, "true")) soap->mustUnderstand = 1; } } } #ifdef WITH_DOM if (soap->feltbegin) return soap->error = soap->feltbegin(soap, soap->tag); #endif return soap->error = SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_retry(struct soap *soap) { soap->error = SOAP_OK; soap_revert(soap); } /******************************************************************************/ 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 to last element '%s' (level=%u)\n", soap->tag, soap->level)); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_ignore(struct soap *soap) { int n = 0; soap_wchar c; soap->level++; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Ignoring XML content at level=%u\n", soap->level)); #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (!soap_string_in(soap, -1, -1, -1, NULL)) return soap->error; } else #endif { for (;;) { c = soap_get(soap); switch (c) { case SOAP_TT: if (n == 0) goto end; n--; break; case SOAP_LT: n++; break; case '/': if (n > 0) { c = soap_get0(soap); if (c == '>') n--; } break; default: if ((int)c == EOF) return soap->error = SOAP_EOF; } } end: soap_unget(soap, c); } return soap_element_end_in(soap, NULL); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_string_out(struct soap *soap, const char *s, int flag) { const char *t; soap_wchar c; soap_wchar mask = (soap_wchar)0xFFFFFF80UL; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_strdup(soap, s); if (!soap->dom->text) return soap->error = SOAP_EOM; return SOAP_OK; } #endif if (flag == 2 || (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 '&': 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; case 0x7F: 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; int m = mbtowc(&wc, t - 1, MB_CUR_MAX); if (m > 0 && !((soap_wchar)wc == c && m == 1 && c < 0x80)) { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, (unsigned long)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); } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_string_in(struct soap *soap, int flag, long minlen, long maxlen, const char *pattern) { char *s; char *t = NULL; size_t i; ULONG64 l = 0; int n = 0, f = 0, m = 0; 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 if (maxlen < 0 && soap->maxlength > 0) maxlen = soap->maxlength; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reading string content, flag=%d\n", flag)); if (flag <= 0 && soap->peeked && *soap->tag) { #ifndef WITH_LEAN struct soap_attribute *tp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String content includes tag '%s' and attributes\n", soap->tag)); t = soap->tmpbuf; *t = '<'; soap_strcpy(t + 1, sizeof(soap->tmpbuf) - 1, soap->tag); t += strlen(t); for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { size_t k = strlen(tp->name); if (t + k + 1 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; /* too many or attribute values to large */ *t++ = ' '; (void)soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->name, k); t += k; if (tp->value) { k = strlen(tp->value); if (t + k + 3 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; /* too many or attribute values to large */ *t++ = '='; *t++ = '"'; (void)soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->value, k); t += k; *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 <= 0) { int state = 0; #ifdef WITH_FAST soap->labidx = 0; /* use look-aside buffer */ #else if (soap_alloc_block(soap) == NULL) return NULL; #endif for (;;) { #ifdef WITH_FAST 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 size_t k = SOAP_BLKLEN; s = (char*)soap_push_block(soap, NULL, k); if (!s) 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 || c < SOAP_AP) && state != 1 && !(soap->mode & SOAP_ENC_LATIN)) { if ((c & 0x7FFFFFFF) >= 0x80) { soap_unget(soap, c); c = soap_getutf8(soap); } if ((c & 0x7FFFFFFF) >= 0x80 && (flag <= 0 || (soap->mode & SOAP_C_UTFSTRING))) { c &= 0x7FFFFFFF; t = buf; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { #ifdef WITH_REPLACE_ILLEGAL_UTF8 if (!((c >= 0x80 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD) || (c >= 0x10000 && c <= 0x10FFFF))) c = SOAP_UNKNOWN_UNICODE_CHAR; #endif 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++ = (char)c; continue; case 2: if (c == '-') state = 6; *s++ = (char)c; continue; case 3: if (c == '?') state = 8; *s++ = (char)c; continue; /* CDATA */ case 4: if (c == ']') state = 5; else state = 1; *s++ = (char)c; continue; case 5: if (c == '>') state = 0; else if (c != ']') state = 1; *s++ = (char)c; continue; /* comment */ case 6: if (c == '-') state = 7; else state = 2; *s++ = (char)c; continue; case 7: if (c == '>') state = 0; else if (c != '-') state = 2; *s++ = (char)c; continue; /* PI */ case 8: if (c == '>') state = 0; else if (c != '?') state = 3; *s++ = (char)c; continue; } switch (c) { case SOAP_TT: if (n == 0) goto end; n--; *s++ = '<'; t = (char*)"/"; m = 1; break; case SOAP_LT: if (flag == 3 || (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_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 == '-') { c = soap_getchar(soap); if (c == '-') 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 if (flag == 3 || (f && n == 0)) { soap_revget1(soap); c = '<'; goto end; } 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)) { #if defined(WIN32) && !defined(CYGWIN) && !defined(__MINGW32__) && !defined(__MINGW64__) && !defined(__BORLANDC__) m = 0; wctomb_s(&m, buf, sizeof(buf), (wchar_t)(c & 0x7FFFFFFF)); #else m = wctomb(buf, (wchar_t)(c & 0x7FFFFFFF)); #endif 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 (maxlen >= 0 && l > (size_t)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_alloc_block(soap) == NULL) return NULL; #endif for (;;) { #ifdef WITH_FAST 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 size_t k = SOAP_BLKLEN; s = (char*)soap_push_block(soap, NULL, k); if (!s) return NULL; #endif for (i = 0; i < k; i++) { if (m > 0) { *s++ = *t++; /* copy multibyte characters */ m--; continue; } #ifndef WITH_CDATA if (flag <= 0) c = soap_getchar(soap); else #endif { c = soap_getutf8(soap); if ((soap->mode & SOAP_C_UTFSTRING)) { if (c >= 0x80 || (c < SOAP_AP && c >= -0x7FFFFF80)) { c &= 0x7FFFFFFF; t = buf; if (c < 0x0800) { *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); } else { #ifdef WITH_REPLACE_ILLEGAL_UTF8 if (!((c >= 0x80 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD) || (c >= 0x10000 && c <= 0x10FFFF))) c = SOAP_UNKNOWN_UNICODE_CHAR; #endif 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++; l++; if (maxlen >= 0 && l > (size_t)maxlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); soap->error = SOAP_LENGTH; return NULL; } continue; } } } switch (c) { case SOAP_TT: if (n == 0) goto end; n--; *s++ = '<'; t = (char*)"/"; m = 1; break; case SOAP_LT: if (flag == 3 || (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) { if (flag > 0) { c = soap_get(soap); if (c == SOAP_GT) n--; } else { c = soap_getchar(soap); if (c == '>') n--; } soap_unget(soap, c); } *s++ = '/'; break; case (soap_wchar)('<' | 0x80000000): if (flag > 0) { *s++ = '<'; } else { *s++ = '&'; t = (char*)"lt;"; m = 3; } break; case (soap_wchar)('>' | 0x80000000): if (flag > 0) { *s++ = '>'; } else { *s++ = '&'; t = (char*)"gt;"; m = 3; } break; case (soap_wchar)('&' | 0x80000000): if (flag > 0) { *s++ = '&'; } else { *s++ = '&'; t = (char*)"amp;"; m = 4; } break; case (soap_wchar)('"' | 0x80000000): if (flag > 0) { *s++ = '"'; } else { *s++ = '&'; t = (char*)"quot;"; m = 5; } break; case (soap_wchar)('\'' | 0x80000000): if (flag > 0) { *s++ = '\''; } else { *s++ = '&'; t = (char*)"apos;"; m = 5; } break; default: if ((int)c == EOF) goto end; #ifndef WITH_CDATA if (c == '<') { c = soap_getchar(soap); soap_unget(soap, c); if (c == '/') { c = SOAP_TT; if (n == 0) goto end; n--; } else { n++; } *s++ = '<'; } else #endif #ifndef WITH_LEANER #ifdef HAVE_WCTOMB if ((soap->mode & SOAP_C_MBSTRING)) { #if defined(WIN32) && !defined(CYGWIN) && !defined(__MINGW32__) && !defined(__MINGW64__) && !defined(__BORLANDC__) m = 0; wctomb_s(&m, buf, sizeof(buf), (wchar_t)(c & 0x7FFFFFFF)); #else m = wctomb(buf, (wchar_t)(c & 0x7FFFFFFF)); #endif 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 (maxlen >= 0 && l > (size_t)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); if (!t) return NULL; #else soap_size_block(soap, NULL, i + 1); t = soap_save_block(soap, NULL, NULL, 0); #endif if (minlen > 0 && l < (size_t)minlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too short: %lu chars, minlen=%ld\n", (unsigned long)l, minlen)); soap->error = SOAP_LENGTH; return NULL; } #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom && *t) { if (flag > 0) soap->dom->text = t; else soap->dom->code = t; } #endif if (flag == 2) { if (soap_s2QName(soap, t, &t, minlen, maxlen, pattern)) return NULL; } else if (flag >= 4 && t) { t = soap_collapse(soap, t, flag, 1); } #ifndef WITH_LEANER else if (pattern && soap->fsvalidate) { soap->error = soap->fsvalidate(soap, pattern, t); if (soap->error) return NULL; } #endif return t; } /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_wstring_out(struct soap *soap, const wchar_t *s, int flag) { const char *t; char tmp; soap_wchar c; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_wchar2s(soap, 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 { /* check for UTF16 encoding when wchar_t is too small to hold UCS */ if (sizeof(wchar_t) < 4 && (c & 0xFC00) == 0xD800) { soap_wchar d = *s; if ((d & 0xFC00) == 0xDC00) { c = ((c - 0xD800) << 10) + (d - 0xDC00) + 0x10000; s++; } #ifdef WITH_REPLACE_ILLEGAL_UTF8 else { c = SOAP_UNKNOWN_UNICODE_CHAR; /* Malformed UTF-16 */ } #endif } if (soap_pututf8(soap, (unsigned long)c)) return soap->error; } continue; } if (soap_send(soap, t)) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 wchar_t * SOAP_FMAC2 soap_wstring_in(struct soap *soap, int flag, long minlen, long maxlen, const char *pattern) { wchar_t *s; int i, n = 0, f = 0; ULONG64 l = 0; soap_wchar c; char *t = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reading wide string content\n")); if (maxlen < 0 && soap->maxlength > 0) maxlen = soap->maxlength; if (flag <= 0 && soap->peeked && *soap->tag) { #ifndef WITH_LEAN struct soap_attribute *tp; t = soap->tmpbuf; *t = '<'; soap_strcpy(t + 1, sizeof(soap->tmpbuf) - 1, soap->tag); t += strlen(t); for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { size_t k = strlen(tp->name); if (t + k + 1 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; *t++ = ' '; (void)soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->name, k); t += k; if (tp->value) { k = strlen(tp->value); if (t + k + 3 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; *t++ = '='; *t++ = '"'; (void)soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->value, k); t += k; *t++ = '"'; } } } if (!soap->body) *t++ = '/'; *t++ = '>'; *t = '\0'; t = soap->tmpbuf; #endif if (soap->body) n = 1; f = 1; soap->peeked = 0; } if (soap_alloc_block(soap) == NULL) return NULL; for (;;) { s = (wchar_t*)soap_push_block(soap, NULL, sizeof(wchar_t)*SOAP_BLKLEN); if (!s) 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++ = L'<'; soap_unget(soap, '/'); break; case SOAP_LT: if (flag == 3 || (f && n == 0)) goto end; n++; *s++ = L'<'; break; case SOAP_GT: *s++ = L'>'; break; case SOAP_QT: *s++ = L'"'; break; case SOAP_AP: *s++ = L'\''; break; case '/': if (n > 0) { c = soap_getutf8(soap); if (c == SOAP_GT) n--; soap_unget(soap, c); } *s++ = L'/'; break; case '<': if (flag > 0) { *s++ = L'<'; } else { *s++ = L'&'; t = (char*)"lt;"; } break; case '>': if (flag > 0) { *s++ = L'>'; } else { *s++ = (wchar_t)'&'; t = (char*)"gt;"; } break; case '"': if (flag > 0) { *s++ = L'"'; } else { *s++ = L'&'; t = (char*)"quot;"; } break; default: if ((int)c == EOF) goto end; /* use UTF16 encoding when wchar_t is too small to hold UCS */ if (sizeof(wchar_t) < 4 && c > 0xFFFF) { soap_wchar c1, c2; c1 = 0xD800 - (0x10000 >> 10) + (c >> 10); c2 = 0xDC00 + (c & 0x3FF); c = c1; soap_unget(soap, c2); } *s++ = (wchar_t)(c & 0x7FFFFFFF); } l++; if (maxlen >= 0 && l > (size_t)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 = L'\0'; soap_size_block(soap, NULL, sizeof(wchar_t) * (i + 1)); if (minlen > 0 && l < (size_t)minlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too short: %lu chars, minlen=%ld\n", (unsigned long)l, minlen)); soap->error = SOAP_LENGTH; return NULL; } s = (wchar_t*)soap_save_block(soap, NULL, NULL, 0); #ifndef WITH_LEAN if (flag >= 4 && s) s = soap_wcollapse(soap, s, flag, 1); #endif #ifndef WITH_LEANER if (pattern && soap->fwvalidate) { soap->error = soap->fwvalidate(soap, pattern, s); if (soap->error) return NULL; } #endif #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) soap->dom->text = soap_wchar2s(soap, s); #endif return s; } #endif /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_int2s(struct soap *soap, int n) { return soap_long2s(soap, (long)n); } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2int(struct soap *soap, const char *s, int *p) { if (s) { long n; char *r; if (!*s) return soap->error = SOAP_EMPTY; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif n = soap_strtol(s, &r, 10); if (s == r || *r #ifndef WITH_LEAN || n != (int)n #endif #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; *p = (int)n; } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (int*)soap_id_enter(soap, soap->id, p, t, sizeof(int), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2int(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (int*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(int), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_long2s(struct soap *soap, long n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), "%ld", n); return soap->tmpbuf; } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2long(struct soap *soap, const char *s, long *p) { if (s) { char *r; if (!*s) return soap->error = SOAP_EMPTY; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = soap_strtol(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (long*)soap_id_enter(soap, soap->id, p, t, sizeof(long), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2long(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (long*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(long), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_LONG642s(struct soap *soap, LONG64 n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), SOAP_LONG_FORMAT, n); return soap->tmpbuf; } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2LONG64(struct soap *soap, const char *s, LONG64 *p) { if (s) { char *r; if (!*s) return soap->error = SOAP_EMPTY; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = soap_strtoll(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (LONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(LONG64), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2LONG64(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (LONG64*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(LONG64), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_byte2s(struct soap *soap, char n) { return soap_long2s(soap, (long)n); } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2byte(struct soap *soap, const char *s, char *p) { if (s) { long n; char *r; if (!*s) return soap->error = SOAP_EMPTY; n = soap_strtol(s, &r, 10); if (s == r || *r || n < -128 || n > 127) soap->error = SOAP_TYPE; *p = (char)n; } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (char*)soap_id_enter(soap, soap->id, p, t, sizeof(char), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2byte(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (char*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(char), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_short2s(struct soap *soap, short n) { return soap_long2s(soap, (long)n); } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2short(struct soap *soap, const char *s, short *p) { if (s) { long n; char *r; if (!*s) return soap->error = SOAP_EMPTY; n = soap_strtol(s, &r, 10); if (s == r || *r || n < -32768 || n > 32767) soap->error = SOAP_TYPE; *p = (short)n; } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (short*)soap_id_enter(soap, soap->id, p, t, sizeof(short), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2short(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (short*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(short), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_float2s(struct soap *soap, float n) { #if defined(WITH_C_LOCALE) # if !defined(WIN32) SOAP_LOCALE_T locale; # endif #else char *s; #endif if (soap_isnan((double)n)) return "NaN"; if (soap_ispinff(n)) return "INF"; if (soap_isninff(n)) return "-INF"; #if defined(WITH_C_LOCALE) # ifdef WIN32 _sprintf_s_l(soap->tmpbuf, _countof(soap->tmpbuf), soap->float_format, SOAP_LOCALE(soap), n); # else locale = uselocale(SOAP_LOCALE(soap)); (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), soap->float_format, n); uselocale(locale); # endif #else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), soap->float_format, n); s = strchr(soap->tmpbuf, ','); /* convert decimal comma to DP */ if (s) *s = '.'; #endif return soap->tmpbuf; } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2float(struct soap *soap, const char *s, float *p) { if (s) { if (!*s) return soap->error = SOAP_EMPTY; 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 strtod first */ #if defined(WITH_C_LOCALE) # if defined(HAVE_STRTOD_L) char *r; # ifdef WIN32 *p = (float)_strtod_l(s, &r, SOAP_LOCALE(soap)); # else *p = (float)strtod_l(s, &r, SOAP_LOCALE(soap)); # endif if (*r) soap->error = SOAP_TYPE; # elif defined(HAVE_STRTOF_L) char *r; *p = strtof_l((char*)s, &r, SOAP_LOCALE(soap)); if (*r) soap->error = SOAP_TYPE; # elif defined(HAVE_SSCANF_L) double n; if (sscanf_l(s, SOAP_LOCALE(soap), "%lf", &n) != 1) soap->error = SOAP_TYPE; *p = (float)n; # elif defined(HAVE_STRTOD) char *r; SOAP_LOCALE_T locale = uselocale(SOAP_LOCALE(soap)); *p = (float)strtod((char*)s, &r); uselocale(locale); if (*r) soap->error = SOAP_TYPE; # elif defined(HAVE_STRTOF) char *r; SOAP_LOCALE_T locale = uselocale(SOAP_LOCALE(soap)); *p = strtof((char*)s, &r); uselocale(locale); if (*r) soap->error = SOAP_TYPE; # elif defined(HAVE_SSCANF) double n; SOAP_LOCALE_T locale = uselocale(SOAP_LOCALE(soap)); if (sscanf(s, "%lf", &n) != 1) soap->error = SOAP_TYPE; uselocale(locale); *p = (float)n; # else soap->error = SOAP_TYPE; # endif #elif defined(HAVE_STRTOD) char *r; *p = (float)strtod(s, &r); if (*r) soap->error = SOAP_TYPE; #elif defined(HAVE_STRTOF) char *r; *p = strtof((char*)s, &r); if (*r) soap->error = SOAP_TYPE; #elif defined(HAVE_SSCANF) double n; if (sscanf(s, "%lf", &n) != 1) soap->error = SOAP_TYPE; *p = (float)n; #else soap->error = SOAP_TYPE; #endif } } return soap->error; } /******************************************************************************/ #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 /******************************************************************************/ 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; #else (void)type; #endif p = (float*)soap_id_enter(soap, soap->id, p, t, sizeof(float), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2float(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (float*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(float), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_double2s(struct soap *soap, double n) { #if defined(WITH_C_LOCALE) # if !defined(WIN32) SOAP_LOCALE_T locale; # endif #else char *s; #endif if (soap_isnan(n)) return "NaN"; if (soap_ispinfd(n)) return "INF"; if (soap_isninfd(n)) return "-INF"; #if defined(WITH_C_LOCALE) # ifdef WIN32 _sprintf_s_l(soap->tmpbuf, _countof(soap->tmpbuf), soap->double_format, SOAP_LOCALE(soap), n); # else locale = uselocale(SOAP_LOCALE(soap)); (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 40), soap->double_format, n); uselocale(locale); # endif #else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 40), soap->double_format, n); s = strchr(soap->tmpbuf, ','); /* convert decimal comma to DP */ if (s) *s = '.'; #endif return soap->tmpbuf; } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2double(struct soap *soap, const char *s, double *p) { if (s) { if (!*s) return soap->error = SOAP_EMPTY; 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(WITH_C_LOCALE) # if defined(HAVE_STRTOD_L) char *r; # ifdef WIN32 *p = _strtod_l(s, &r, SOAP_LOCALE(soap)); # else *p = strtod_l(s, &r, SOAP_LOCALE(soap)); # endif if (*r) soap->error = SOAP_TYPE; # elif defined(HAVE_STRTOD) char *r; SOAP_LOCALE_T locale = uselocale(SOAP_LOCALE(soap)); *p = strtod(s, &r); uselocale(locale); if (*r) soap->error = SOAP_TYPE; # elif defined(HAVE_SSCANF_L) SOAP_LOCALE_T locale = uselocale(SOAP_LOCALE(soap)); if (sscanf_l(s, SOAP_LOCALE(soap), "%lf", p) != 1) soap->error = SOAP_TYPE; uselocale(locale); # else soap->error = SOAP_TYPE; # endif #elif defined(HAVE_STRTOD) char *r; *p = strtod(s, &r); if (*r) soap->error = SOAP_TYPE; #elif defined(HAVE_SSCANF) if (sscanf(s, "%lf", p) != 1) soap->error = SOAP_TYPE; #else soap->error = SOAP_TYPE; #endif } } return soap->error; } /******************************************************************************/ 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; #else (void)type; #endif p = (double*)soap_id_enter(soap, soap->id, p, t, sizeof(double), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2double(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (double*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(double), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedByte2s(struct soap *soap, unsigned char n) { return soap_unsignedLong2s(soap, (unsigned long)n); } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedByte(struct soap *soap, const char *s, unsigned char *p) { if (s) { long n; char *r; if (!*s) return soap->error = SOAP_EMPTY; n = soap_strtol(s, &r, 10); if (s == r || *r || n < 0 || n > 255) soap->error = SOAP_TYPE; *p = (unsigned char)n; } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (unsigned char*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned char), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2unsignedByte(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (unsigned char*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned char), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedShort2s(struct soap *soap, unsigned short n) { return soap_unsignedLong2s(soap, (unsigned long)n); } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedShort(struct soap *soap, const char *s, unsigned short *p) { if (s) { long n; char *r; if (!*s) return soap->error = SOAP_EMPTY; n = soap_strtol(s, &r, 10); if (s == r || *r || n < 0 || n > 65535) soap->error = SOAP_TYPE; *p = (unsigned short)n; } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (unsigned short*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned short), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2unsignedShort(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (unsigned short*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned short), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedInt2s(struct soap *soap, unsigned int n) { return soap_unsignedLong2s(soap, (unsigned long)n); } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedInt(struct soap *soap, const char *s, unsigned int *p) { if (s) { char *r; if (!*s) return soap->error = SOAP_EMPTY; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = (unsigned int)soap_strtoul(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; #ifdef HAVE_STRTOUL if (*p > 0 && strchr(s, '-')) return soap->error = SOAP_TYPE; #endif } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (unsigned int*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned int), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2unsignedInt(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (unsigned int*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned int), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedLong2s(struct soap *soap, unsigned long n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), "%lu", n); return soap->tmpbuf; } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedLong(struct soap *soap, const char *s, unsigned long *p) { if (s) { char *r; if (!*s) return soap->error = SOAP_EMPTY; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = soap_strtoul(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; #ifdef HAVE_STRTOUL if (*p > 0 && strchr(s, '-')) return soap->error = SOAP_TYPE; #endif } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (unsigned long*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned long), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2unsignedLong(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (unsigned long*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned long), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_ULONG642s(struct soap *soap, ULONG64 n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), SOAP_ULONG_FORMAT, n); return soap->tmpbuf; } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2ULONG64(struct soap *soap, const char *s, ULONG64 *p) { if (s) { char *r; if (!*s) return soap->error = SOAP_EMPTY; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = soap_strtoull(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; if (*p > 0 && strchr(s, '-')) return soap->error = SOAP_TYPE; } return soap->error; } /******************************************************************************/ 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; #ifndef WITH_LEAN 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; } #else (void)type; #endif p = (ULONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(ULONG64), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2ULONG64(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (ULONG64*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(ULONG64), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2char(struct soap *soap, const char *s, char **t, int flag, long minlen, long maxlen, const char *pattern) { if (s) { const char *r = soap_string(soap, s, flag, minlen, maxlen, pattern); if (r && (*t = soap_strdup(soap, r)) == NULL) return soap->error = SOAP_EOM; } return soap->error; } /******************************************************************************/ #ifndef WITH_COMPAT #ifdef __cplusplus SOAP_FMAC1 int SOAP_FMAC2 soap_s2stdchar(struct soap *soap, const char *s, std::string *t, int flag, long minlen, long maxlen, const char *pattern) { if (s) { const char *r = soap_string(soap, s, flag, minlen, maxlen, pattern); if (r) t->assign(r); } return soap->error; } #endif #endif /******************************************************************************/ static const char* soap_string(struct soap *soap, const char *s, int flag, long minlen, long maxlen, const char *pattern) { if (s) { if (maxlen < 0 && soap->maxlength > 0) maxlen = soap->maxlength; if (minlen > 0 || maxlen >= 0) { size_t l; if ((soap->mode & SOAP_C_UTFSTRING)) l = soap_utf8len(s); else l = strlen(s); if ((maxlen >= 0 && l > (size_t)maxlen) || (minlen > 0 && l < (size_t)minlen)) { soap->error = SOAP_LENGTH; return NULL; } } if (flag >= 4) s = soap_collapse(soap, (char*)s, flag, 0); #ifndef WITH_LEANER if (pattern && soap->fsvalidate) { soap->error = soap->fsvalidate(soap, pattern, s); if (soap->error) return NULL; } #else (void)pattern; #endif } return s; } /******************************************************************************/ static char* soap_collapse(struct soap *soap, char *s, int flag, int insitu) { /* flag 4=normalizedString (replace), 5=token (collapse) */ char *t; size_t n; if (!s) return NULL; if (flag == 4) { for (t = s; *t && (!soap_coblank((soap_wchar)*t) || *t == 32); t++) continue; if (*t) { /* replace white space and control chars by blanks */ if (!insitu) s = soap_strdup(soap, s); for (t = s; *t; t++) if (soap_coblank((soap_wchar)*t)) *t = ' '; } return s; } /* collapse white space */ for (t = s; *t && soap_coblank((soap_wchar)*t); t++) continue; n = strlen(t); if (insitu && s < t) (void)soap_memmove(s, n + 1, t, n + 1); else s = t; if (n > 0) { if (!soap_coblank((soap_wchar)s[n-1])) { for (t = s; (*t && !soap_coblank((soap_wchar)*t)) || (*t == 32 && (!t[1] || !soap_coblank((soap_wchar)t[1]))); t++) continue; if (!*t) return s; } if (!insitu) s = soap_strdup(soap, s); for (t = s; *t; t++) { if (soap_coblank((soap_wchar)*t)) { char *r; *t = ' '; for (r = t + 1; *r && soap_coblank((soap_wchar)*r); r++) continue; if (r > t + 1) (void)soap_memmove(t + 1, n - (t-s), r, n - (r-s) + 1); } } t--; if (t >= s && *t == 32) *t = '\0'; } return s; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2QName(struct soap *soap, const char *s, char **t, long minlen, long maxlen, const char *pattern) { *t = NULL; if (s) { const char *r = soap_QName(soap, s, minlen, maxlen, pattern); if (r && (*t = soap_strdup(soap, r)) == NULL) return soap->error = SOAP_EOM; } return soap->error; } /******************************************************************************/ #ifndef WITH_COMPAT #ifdef __cplusplus SOAP_FMAC1 int SOAP_FMAC2 soap_s2stdQName(struct soap *soap, const char *s, std::string *t, long minlen, long maxlen, const char *pattern) { t->clear(); if (s) { const char *r = soap_QName(soap, s, minlen, maxlen, pattern); if (r) t->assign(r); } return soap->error; } #endif #endif /******************************************************************************/ static const char* soap_QName(struct soap *soap, const char *s, long minlen, long maxlen, const char *pattern) { if (s) { char *b; if (maxlen < 0 && soap->maxlength > 0) maxlen = soap->maxlength; if (minlen > 0 || maxlen >= 0) { size_t l; if ((soap->mode & SOAP_C_UTFSTRING)) l = soap_utf8len(s); else l = strlen(s); if ((maxlen >= 0 && l > (size_t)maxlen) || (minlen > 0 && l < (size_t)minlen)) { soap->error = SOAP_LENGTH; return NULL; } } #ifdef WITH_FAST soap->labidx = 0; #else if (soap_alloc_block(soap) == NULL) return NULL; #endif 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; const char *p = NULL; short flag = 0; const char *r = NULL; size_t m = 0; #ifndef WITH_FAST size_t k = 0; #endif /* skip blanks */ while (*s && soap_coblank((soap_wchar)*s)) s++; if (!*s) break; /* find next QName */ n = 1; while (s[n] && !soap_coblank((soap_wchar)s[n])) n++; np = soap->nlist; /* if there is no namespace stack, or prefix is "#" or "xml" then copy string */ if (!np || *s == '#' || !strncmp(s, "xml:", 4)) { r = s; m = n; } else /* we normalize the QName by replacing its prefix */ { const char *q; for (p = s; *p && p < s + n; p++) if (*p == ':') break; 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 && (q = soap->local_namespaces[np->index].id) != NULL) { size_t k = strlen(q); if (q[k-1] != '_') { r = q; m = k; } else { flag = 1; r = soap->local_namespaces[np->index].ns; m = strlen(r); } } else if (np->ns) { flag = 1; r = np->ns; m = strlen(r); } 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)); soap->error = SOAP_NAMESPACE; return NULL; } } else if (s[n]) /* no namespace, part of string */ { r = s; m = n; } else /* no namespace: assume "" namespace */ { flag = 1; } } #ifdef WITH_FAST if ((flag && soap_append_lab(soap, "\"", 1)) || (m && soap_append_lab(soap, r, m)) || (flag && soap_append_lab(soap, "\"", 1)) || (p && (soap_append_lab(soap, ":", 1) || soap_append_lab(soap, p, n - (p-s))))) return NULL; #else k = 2*flag + m + (p ? n - (p-s) + 1 : 0) + (s[n] != '\0'); b = (char*)soap_push_block(soap, NULL, k); if (!b) return NULL; if (flag) *b++ = '"'; if (m) { if (soap_memcpy((void*)b, k, (const void*)r, m)) { soap->error = SOAP_EOM; return NULL; } b += m; } if (flag) *b++ = '"'; if (p) { *b++ = ':'; if (soap_memcpy((void*)b, k - m - flag - 1, (const void*)p, n - (p-s))) { soap->error = SOAP_EOM; return NULL; } b += n - (p-s); } #endif /* advance to next and add spacing */ s += n; while (*s && soap_coblank(*s)) s++; if (*s) { #ifdef WITH_FAST if (soap_append_lab(soap, " ", 1)) return NULL; #else *b = ' '; #endif } } #ifdef WITH_FAST if (soap_append_lab(soap, SOAP_STR_EOS, 1)) return NULL; b = soap->labbuf; #else b = (char*)soap_push_block(soap, NULL, 1); if (!b) return NULL; *b = '\0'; b = (char*)soap_save_block(soap, NULL, NULL, 0); #endif #ifndef WITH_LEANER if (pattern && soap->fsvalidate) { soap->error = soap->fsvalidate(soap, pattern, b); if (soap->error) return NULL; } #else (void)pattern; #endif return b; } return NULL; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_QName2s(struct soap *soap, const char *s) { const char *t = NULL; if (s) { #ifdef WITH_FAST soap_store_lab(soap, SOAP_STR_EOS, 1); soap->labidx = 0; #else char *b = NULL; if (soap_alloc_block(soap) == NULL) return NULL; #endif for (;;) { size_t n; const char *q = NULL; const char *r = NULL; size_t m = 0; #ifndef WITH_FAST size_t k = 0; #endif /* skip blanks */ while (*s && soap_coblank((soap_wchar)*s)) s++; if (!*s) { #ifdef WITH_FAST soap->labbuf[soap->labidx > 0 ? soap->labidx - 1 : 0] = '\0'; #else if (!b) return soap_strdup(soap, SOAP_STR_EOS); --b; *b = '\0'; #endif break; } /* find next QName */ n = 0; while (s[n] && !soap_coblank((soap_wchar)s[n])) { if (s[n] == ':') r = s; n++; } if (*s != '"') /* non-quoted: pass string as is */ { #ifndef WITH_LEAN if (r && (soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_XML_CANONICAL_NA)) soap_utilize_ns(soap, s, 1); #endif r = s; m = n + 1; } else /* prefix quoted URI-based string */ { q = strchr(s + 1, '"'); if (q) { struct Namespace *p = soap->local_namespaces; if (p) { for (; p->id; p++) { if (p->ns) if (!soap_tag_cmp(s + 1, p->ns)) break; if (p->in) if (!soap_tag_cmp(s + 1, p->in)) break; } } q++; /* URL is in the namespace table? */ if (p && p->id) { r = p->id; m = strlen(r); } else /* not in namespace table: create xmlns binding */ { char *x = soap_strdup(soap, s + 1); if (!x) return NULL; x[q - s - 2] = '\0'; (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 27), "xmlns:_%d", soap->idnum++); soap_set_attr(soap, soap->tmpbuf, x, 1); r = soap->tmpbuf + 6; m = strlen(r); } } } /* copy normalized QName into buffer, including the ending blank or NUL */ #ifdef WITH_FAST if ((m && soap_append_lab(soap, r, m)) || (q && soap_append_lab(soap, q, n - (q - s) + 1))) return NULL; #else k = m + (q ? n - (q - s) + 1 : 0); b = (char*)soap_push_block(soap, NULL, k); if (!b) { soap->error = SOAP_EOM; return NULL; } if (soap_memcpy((void*)b, k, (const void*)r, m)) { soap->error = SOAP_EOM; return NULL; } b += m; if (q) { if (soap_memcpy((void*)b, k - m, (const void*)q, n - (q - s) + 1)) { soap->error = SOAP_EOM; return NULL; } b += n - (q - s) + 1; } #endif /* advance to next */ s += n; } #ifdef WITH_FAST t = soap_strdup(soap, soap->labbuf); if (!t) soap->error = SOAP_EOM; #else t = (char*)soap_save_block(soap, NULL, NULL, 0); #endif } return t; } /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2wchar(struct soap *soap, const char *s, wchar_t **t, int flag, long minlen, long maxlen, const char *pattern) { if (s) { const wchar_t *r = soap_wstring(soap, s, flag, minlen, maxlen, pattern); if (r && (*t = soap_wstrdup(soap, r)) == NULL) return soap->error = SOAP_EOM; } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_COMPAT #ifdef __cplusplus #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2stdwchar(struct soap *soap, const char *s, std::wstring *t, int flag, long minlen, long maxlen, const char *pattern) { if (s) { const wchar_t *r = soap_wstring(soap, s, flag, minlen, maxlen, pattern); if (r) t->assign(r); } return soap->error; } #endif #endif #endif /******************************************************************************/ #ifndef WITH_LEAN static const wchar_t* soap_wstring(struct soap *soap, const char *s, int flag, long minlen, long maxlen, const char *pattern) { if (s) { size_t l; soap_wchar c; wchar_t *t; if (maxlen < 0 && soap->maxlength > 0) maxlen = soap->maxlength; soap->labidx = 0; if ((soap->mode & SOAP_ENC_LATIN)) { wchar_t *r; if (soap_append_lab(soap, NULL, sizeof(wchar_t) * (strlen(s) + 1))) return NULL; r = (wchar_t*)soap->labbuf; while (*s) *r++ = (wchar_t)*s++; } else { /* Convert UTF8 to wchar_t */ while (*s) { c = (unsigned char)*s++; if (c >= 0x80) { #ifdef WITH_REPLACE_ILLEGAL_UTF8 soap_wchar c1, c2, c3; c1 = (unsigned char)*s; if (c <= 0xC1 || (c1 & 0xC0) != 0x80) { c = SOAP_UNKNOWN_UNICODE_CHAR; } else { ++s; c1 &= 0x3F; if (c < 0xE0) { c = (((c & 0x1F) << 6) | c1); } else { c2 = (unsigned char)*s; if ((c == 0xE0 && c1 < 0x20) || (c2 & 0xC0) != 0x80) { c = SOAP_UNKNOWN_UNICODE_CHAR; } else { ++s; c2 &= 0x3F; if (c < 0xF0) { c = (((c & 0x0F) << 12) | (c1 << 6) | c2); } else { c3 = (unsigned char)*s; if ((c == 0xF0 && c1 < 0x10) || (c == 0xF4 && c1 >= 0x10) || c >= 0xF5 || (c3 & 0xC0) != 0x80) { c = SOAP_UNKNOWN_UNICODE_CHAR; } else { ++s; c = (((c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | (c3 & 0x3F)); } } } } } #else soap_wchar c1, c2, c3, c4; c1 = (unsigned char)*s; if (c1) { s++; c1 &= 0x3F; if (c < 0xE0) { c = (wchar_t)(((soap_wchar)(c & 0x1F) << 6) | c1); } else { c2 = (unsigned char)*s; if (c2) { s++; c2 &= 0x3F; if (c < 0xF0) { c = (wchar_t)(((soap_wchar)(c & 0x0F) << 12) | (c1 << 6) | c2); } else { c3 = (unsigned char)*s; if (c3) { s++; c3 &= 0x3F; if (c < 0xF8) { c = (wchar_t)(((soap_wchar)(c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3); } else { c4 = (unsigned char)*s; if (c4) { s++; c4 &= 0x3F; if (c < 0xFC) { c = (wchar_t)(((soap_wchar)(c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4); } else { c = (wchar_t)(((soap_wchar)(c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (unsigned char)(*s & 0x3F)); if (*s) s++; } } } } } } } } #endif } /* use UTF16 encoding when wchar_t is too small to hold UCS */ if (sizeof(wchar_t) < 4 && c > 0xFFFF) { wchar_t c1, c2; c1 = 0xD800 - (0x10000 >> 10) + (c >> 10); c2 = 0xDC00 + (c & 0x3FF); if (soap_append_lab(soap, (const char*)&c1, sizeof(wchar_t)) || soap_append_lab(soap, (const char*)&c2, sizeof(wchar_t))) return NULL; } else if (soap_append_lab(soap, (const char*)&c, sizeof(wchar_t))) { return NULL; } } } l = soap->labidx / sizeof(wchar_t); c = L'\0'; if (soap_append_lab(soap, (const char*)&c, sizeof(wchar_t))) return NULL; if ((maxlen >= 0 && l > (size_t)maxlen) || (minlen > 0 && l < (size_t)minlen)) { soap->error = SOAP_LENGTH; return NULL; } t = (wchar_t*)soap->labbuf; #ifndef WITH_LEAN if (flag >= 4 && t) t = soap_wcollapse(soap, t, flag, 1); #endif #ifndef WITH_LEANER if (pattern && soap->fwvalidate) { soap->error = soap->fwvalidate(soap, pattern, t); if (soap->error) return NULL; } #endif return t; } return NULL; } #endif /******************************************************************************/ #ifndef WITH_LEAN static wchar_t* soap_wcollapse(struct soap *soap, wchar_t *s, int flag, int insitu) { /* flag 4=normalizedString (replace), 5=token (collapse) */ wchar_t *t; size_t n; if (!s) return NULL; if (flag == 4) { for (t = s; *t && (!soap_coblank((soap_wchar)*t) || *t == 32); t++) continue; if (*t) { /* replace blanks and control char by space */ if (!insitu) s = soap_wstrdup(soap, s); if (s) for (t = s; *t; t++) if (soap_coblank((soap_wchar)*t)) *t = L' '; } return s; } /* collapse white space */ for (t = s; *t && soap_coblank((soap_wchar)*t); t++) continue; n = 0; while (t[n]) n++; if (insitu && s < t) (void)soap_memmove(s, n + 1, t, n + 1); else s = t; if (n > 0) { if (!soap_coblank((soap_wchar)s[n-1])) { for (t = s; (*t && !soap_coblank((soap_wchar)*t)) || (*t == 32 && (!t[1] || !soap_coblank((soap_wchar)t[1]))); t++) continue; if (!*t) return s; } if (!insitu) s = soap_wstrdup(soap, s); if (s) { for (t = s; *t; t++) { if (soap_coblank((soap_wchar)*t)) { wchar_t *r; *t = L' '; for (r = t + 1; *r && soap_coblank((soap_wchar)*r); r++) continue; if (r > t + 1) (void)soap_memmove(t + 1, sizeof(wchar_t) * (n - (t-s)), r, sizeof(wchar_t) * (n - (r-s) + 1)); } } t--; if (t >= s && *t == 32) *t = L'\0'; } } return s; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_wchar2s(struct soap *soap, const wchar_t *s) { soap_wchar c; char *r, *t; const wchar_t *q = s; size_t n = 0; if (!s) return NULL; while ((c = *q++)) { if (c > 0 && c < 0x80) n++; else #ifdef WITH_REPLACE_ILLEGAL_UTF8 n += 4; #else n += 6; #endif } r = t = (char*)soap_malloc(soap, n + 1); if (r) { /* Convert wchar to UTF8 (chars above U+10FFFF are silently converted, but should not be used) */ while ((c = *s++)) { if (c > 0 && c < 0x80) { *t++ = (char)c; } else { /* check for UTF16 encoding when wchar_t is too small to hold UCS */ if (sizeof(wchar_t) < 4 && (c & 0xFC00) == 0xD800) { soap_wchar d = *s; if ((d & 0xFC00) == 0xDC00) { c = ((c - 0xD800) << 10) + (d - 0xDC00) + 0x10000; s++; } #ifdef WITH_REPLACE_ILLEGAL_UTF8 else { c = SOAP_UNKNOWN_UNICODE_CHAR; /* Malformed UTF-16 */ } #endif } if (c < 0x0800) { *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); } else { #ifdef WITH_REPLACE_ILLEGAL_UTF8 if (!((c >= 0x80 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD) || (c >= 0x10000 && c <= 0x10FFFF))) c = SOAP_UNKNOWN_UNICODE_CHAR; #endif 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 /******************************************************************************/ 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, NULL); 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; } /******************************************************************************/ 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, const char *pattern) { (void)type; 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) { p = (char**)soap_malloc(soap, sizeof(char*)); if (!p) return NULL; } if (soap->null) { *p = NULL; } else if (soap->body) { *p = soap_string_in(soap, flag, minlen, maxlen, pattern); if (!*p || !(char*)soap_id_enter(soap, soap->id, *p, t, sizeof(char*), NULL, 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->href != '#') { if (minlen > 0) { soap->error = SOAP_LENGTH; return NULL; } *p = soap_strdup(soap, SOAP_STR_EOS); if (!*p) return NULL; } if (*soap->href == '#') p = (char**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(char**), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } /******************************************************************************/ #ifndef WITH_LEANER 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, NULL); 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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 wchar_t ** SOAP_FMAC2 soap_inwstring(struct soap *soap, const char *tag, wchar_t **p, const char *type, int t, int flag, long minlen, long maxlen, const char *pattern) { (void)type; 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) { p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*)); if (!p) return NULL; } if (soap->null) { *p = NULL; } else if (soap->body) { *p = soap_wstring_in(soap, flag, minlen, maxlen, pattern); if (!*p || !(wchar_t*)soap_id_enter(soap, soap->id, *p, t, sizeof(wchar_t*), NULL, 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->href != '#') { if (minlen > 0) { soap->error = SOAP_LENGTH; return NULL; } *p = soap_wstrdup(soap, L""); } if (*soap->href == '#') p = (wchar_t**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(wchar_t**), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef WITH_LEAN #ifdef UNDER_CE /* WinCE mktime (based on the mingw-runtime, public domain) */ #define __FILETIME_to_ll(f) ((long long)(f).dwHighDateTime << 32 | (long long)(f).dwLowDateTime) static time_t mktime(struct tm *pt) { SYSTEMTIME s, s1, s2; FILETIME f, f1, f2; long long diff; GetSystemTime(&s1); GetLocalTime(&s2); SystemTimeToFileTime(&s1, &f1); SystemTimeToFileTime(&s2, &f2); diff = (__FILETIME_to_ll(f2) - __FILETIME_to_ll(f1)) / 10000000LL; s.wYear = pt->tm_year + 1900; s.wMonth = pt->tm_mon + 1; s.wDayOfWeek = pt->tm_wday; s.wDay = pt->tm_mday; s.wHour = pt->tm_hour; s.wMinute = pt->tm_min; s.wSecond = pt->tm_sec; s.wMilliseconds = 0; SystemTimeToFileTime(&s, &f); return (time_t)((__FILETIME_to_ll(f) - 116444736000000000LL) / 10000000LL) - (time_t)diff; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN #ifdef UNDER_CE /* WinCE gmtime_r (based on the mingw-runtime, public domain) */ #define HAVE_GMTIME_R static struct tm* gmtime_r(const time_t *t, struct tm *pt) { FILETIME f, f1, f2; SYSTEMTIME s, s1 = {0}; long long time = (long long)(*t) * 10000000LL + 116444736000000000LL; f.dwHighDateTime = (DWORD)((time >> 32) & 0x00000000FFFFFFFF); f.dwLowDateTime = (DWORD)(time & 0x00000000FFFFFFFF); FileTimeToSystemTime(&f, &s); pt->tm_year = s.wYear - 1900; pt->tm_mon = s.wMonth - 1; pt->tm_wday = s.wDayOfWeek; pt->tm_mday = s.wDay; s1.wYear = s.wYear; s1.wMonth = 1; s1.wDayOfWeek = 1; s1.wDay = 1; SystemTimeToFileTime(&s1, &f1); SystemTimeToFileTime(&s, &f2); pt->tm_yday = (((__FILETIME_to_ll(f2) - __FILETIME_to_ll(f1)) / 10000000LL) / (60 * 60 * 24)); pt->tm_hour = s.wHour; pt->tm_min = s.wMinute; pt->tm_sec = s.wSecond; pt->tm_isdst = 0; return pt; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN #ifdef UNDER_CE /* WinCE very simple strftime for format "%Y-%m-%dT%H:%M:%SZ", note: %F and %T not supported by MS */ static size_t strftime(char *buf, size_t len, const char *format, const struct tm *pT) { (void)len; (void)format; #ifndef WITH_NOZONE (SOAP_SNPRINTF(buf, len, 20), "%04d-%02d-%02dT%02d:%02d:%02dZ", pT->tm_year + 1900, pT->tm_mon + 1, pT->tm_mday, pT->tm_hour, pT->tm_min, pT->tm_sec); #else (SOAP_SNPRINTF(buf, len, 20), "%04d-%02d-%02dT%02d:%02d:%02d", pT->tm_year + 1900, pT->tm_mon + 1, pT->tm_mday, pT->tm_hour, pT->tm_min, pT->tm_sec); #endif return len; } #endif #endif /******************************************************************************/ #if !defined(WITH_LEAN) || defined(WITH_COOKIES) 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; #ifndef HAVE_GMTIME_R struct tm *tp; #endif t = mktime(T); if (t == (time_t)-1) return (time_t)-1; #ifdef HAVE_GMTIME_R if (gmtime_r(&t, &tm) == SOAP_FUNC_R_ERR) return (time_t)-1; #else tp = gmtime(&t); if (!tp) return (time_t)-1; tm = *tp; #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; size_t l = 0; #if defined(HAVE_GMTIME_R) && !defined(WITH_NOZONE) if (gmtime_r(&n, pT) != SOAP_FUNC_R_ERR) l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT); #elif defined(HAVE_GMTIME) && !defined(WITH_NOZONE) pT = gmtime(&n); if (pT) l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT); #elif (defined(HAVE_TM_GMTOFF) || defined(HAVE_STRUCT_TM_TM_GMTOFF) || defined(HAVE_STRUCT_TM___TM_GMTOFF)) && !defined(WITH_NOZONE) #if defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) { l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S%z", pT); if (l) { (void)soap_memmove(soap->tmpbuf + 23, sizeof(soap->tmpbuf) - 23, soap->tmpbuf + 22, 3); /* 2000-03-01T02:00:00+0300 */ soap->tmpbuf[22] = ':'; /* 2000-03-01T02:00:00+03:00 */ } } #else pT = localtime(&n); if (pT) { l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S%z", pT); if (l) { (void)soap_memmove(soap->tmpbuf + 23, sizeof(soap->tmpbuf) - 23, soap->tmpbuf + 22, 3); /* 2000-03-01T02:00:00+0300 */ soap->tmpbuf[22] = ':'; /* 2000-03-01T02:00:00+03:00 */ } } #endif #elif defined(HAVE_GETTIMEOFDAY) && !defined(WITH_NOZONE) #if defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) { struct timeval tv; struct timezone tz; memset((void*)&tz, 0, sizeof(tz)); gettimeofday(&tv, &tz); l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); if (l) (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -tz.tz_minuteswest/60+(pT->tm_isdst!=0), abs(tz.tz_minuteswest)%60); } #else pT = localtime(&n); if (pT) { struct timeval tv; struct timezone tz; memset((void*)&tz, 0, sizeof(tz)); gettimeofday(&tv, &tz); l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); if (l) (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -tz.tz_minuteswest/60+(pT->tm_isdst!=0), abs(tz.tz_minuteswest)%60); } #endif #elif defined(HAVE_FTIME) && !defined(WITH_NOZONE) #if defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) { struct timeb t; memset((void*)&t, 0, sizeof(t)); #ifdef __BORLANDC__ ::ftime(&t); #else ftime(&t); #endif l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); if (l) (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60); } #else pT = localtime(&n); if (pT) { struct timeb t; memset((void*)&t, 0, sizeof(t)); #ifdef __BORLANDC__ ::ftime(&t); #else ftime(&t); #endif l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); if (l) (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60); } #endif #elif defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); #else pT = localtime(&n); if (pT) l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); #endif if (!l) soap_strcpy(soap->tmpbuf, sizeof(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) { *p = 0; if (s) { char *t; unsigned long d; struct tm T; if (!*s) return soap->error = SOAP_EMPTY; memset((void*)&T, 0, sizeof(T)); d = soap_strtoul(s, &t, 10); if (*t == '-') { /* YYYY-MM-DD */ T.tm_year = (int)d; T.tm_mon = (int)soap_strtoul(t + 1, &t, 10); T.tm_mday = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* YYYYMMDD */ T.tm_year = (int)(d / 10000); T.tm_mon = (int)(d / 100 % 100); T.tm_mday = (int)(d % 100); } else { return soap->error = SOAP_TYPE; } if (*t == 'T' || ((*t == 't' || *t == ' ') && !(soap->mode & SOAP_XML_STRICT))) { d = soap_strtoul(t + 1, &t, 10); if (*t == ':') { /* Thh:mm:ss */ T.tm_hour = (int)d; T.tm_min = (int)soap_strtoul(t + 1, &t, 10); T.tm_sec = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* Thhmmss */ T.tm_hour = (int)(d / 10000); T.tm_min = (int)(d / 100 % 100); T.tm_sec = (int)(d % 100); } else { return soap->error = SOAP_TYPE; } } if (T.tm_year == 1) T.tm_year = 70; else T.tm_year -= 1900; T.tm_mon--; if (*t == '.') { for (t++; *t; t++) if (*t < '0' || *t > '9') break; } if (*t == ' ' && !(soap->mode & SOAP_XML_STRICT)) t++; if (*t) { #ifndef WITH_NOZONE if (*t == '+' || *t == '-') { int h, m; m = (int)soap_strtol(t, &t, 10); if (*t == ':') { /* +hh:mm */ h = m; m = (int)soap_strtol(t + 1, &t, 10); if (h < 0) m = -m; } else if (!(soap->mode & SOAP_XML_STRICT)) { /* +hhmm */ h = m / 100; m = m % 100; } else { /* +hh */ h = m; m = 0; } if (*t) return soap->error = SOAP_TYPE; 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_hour--; } T.tm_mday += T.tm_hour / 24; T.tm_hour %= 24; if (T.tm_hour < 0) { T.tm_hour += 24; T.tm_mday--; } /* note: day of the month may be out of range, timegm() handles it */ } else if (*t != 'Z') { return soap->error = SOAP_TYPE; } #endif *p = soap_timegm(&T); } else /* no UTC or timezone, so assume we got a localtime */ { T.tm_isdst = -1; *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), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2dateTime(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (time_t*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(time_t), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_outliteral(struct soap *soap, const char *tag, char *const*p, const char *type) { if (tag && *tag != '-') if (soap_element_begin_out(soap, tag, 0, type)) return soap->error; if (p && *p) if (soap_send(soap, *p)) /* send as-is */ return soap->error; if (tag && *tag != '-') return soap_element_end_out(soap, tag); return SOAP_OK; } /******************************************************************************/ 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_peek(soap) == SOAP_TT) return NULL; soap->error = SOAP_OK; } if (!p) { p = (char**)soap_malloc(soap, sizeof(char*)); if (!p) return NULL; } if (soap->body || (tag && *tag == '-')) { if (tag && *tag != '-') *p = soap_string_in(soap, -1, -1, -1, NULL); else *p = soap_string_in(soap, 0, -1, -1, NULL); 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; } /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_outwliteral(struct soap *soap, const char *tag, wchar_t *const*p, const char *type) { if (tag && *tag != '-') if (soap_element_begin_out(soap, tag, 0, type)) return soap->error; if (p) { wchar_t c; const wchar_t *s = *p; while ((c = *s++)) { if (soap_pututf8(soap, (unsigned long)c)) /* send as-is in UTF8 */ return soap->error; } } if (tag && *tag != '-') return soap_element_end_out(soap, tag); return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER 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_peek(soap) == SOAP_TT) return NULL; soap->error = SOAP_OK; } if (!p) { p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*)); if (!p) return NULL; } if (soap->body) { if (tag && *tag != '-') *p = soap_wstring_in(soap, -1, -1, -1, NULL); else *p = soap_wstring_in(soap, 0, -1, -1, NULL); 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, L""); } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ SOAP_FMAC1 const char * SOAP_FMAC2 soap_value(struct soap *soap) { size_t i; soap_wchar c = 0; char *s = soap->tmpbuf; if (!soap->body) return SOAP_STR_EOS; do { c = soap_get(soap); } while (soap_coblank(c)); for (i = 0; i < sizeof(soap->tmpbuf) - 1; i++) { if (c == SOAP_TT || c == SOAP_LT || (int)c == EOF) break; *s++ = (char)c; c = soap_get(soap); } for (s--; i > 0; i--, s--) { if (!soap_coblank((soap_wchar)*s)) break; } s[1] = '\0'; soap->tmpbuf[sizeof(soap->tmpbuf) - 1] = '\0'; /* appease */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element content value='%s'\n", soap->tmpbuf)); if (c == SOAP_TT || c == SOAP_LT || (int)c == EOF) { soap_unget(soap, c); } else { soap->error = SOAP_LENGTH; return NULL; } #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_strdup(soap, soap->tmpbuf); if (!soap->dom->text) return NULL; } #endif return soap->tmpbuf; /* return non-null pointer */ } /******************************************************************************/ #if !defined(WITH_LEANER) || !defined(WITH_NOHTTP) SOAP_FMAC1 int SOAP_FMAC2 soap_getline(struct soap *soap, char *buf, int len) { char *s = buf; int i = len; soap_wchar c = 0; for (;;) { while (i > 1) { c = soap_getchar(soap); if (c == '\r' || c == '\n') break; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; *s++ = (char)c; i--; } *s = '\0'; if (c != '\n') c = soap_getchar(soap); /* got \r or something else, now get \n */ if (c == '\n') { if (i == 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_CHK_EOF; } else if (i <= 1) { return soap->error = SOAP_HDR; } } return SOAP_OK; } #endif /******************************************************************************/ static ULONG64 soap_count_attachments(struct soap *soap) { #ifndef WITH_LEANER struct soap_multipart *content; ULONG64 count = soap->count; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the message size with attachments, current count=" SOAP_ULONG_FORMAT "\n", 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) { 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) { 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=" SOAP_ULONG_FORMAT "\n", count)); return count; #else return soap->count; #endif } /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER 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); soap_strcpy(s + 4, n + 1, option); } } return s; } #endif /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER 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)) != NULL || 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_PLAIN) || (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); bufsize = soap->fdimeread(soap, handle, soap->tmpbuf, bufsize); if (!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_CHK_EOF; break; } if (soap_send_raw(soap, soap->tmpbuf, bufsize)) break; size -= bufsize; } while (size); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadclose\n")); if (soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime.size&3)) return soap->error; } 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 /******************************************************************************/ #ifndef WITH_LEANER static char * soap_getdimefield(struct soap *soap, size_t n) { char *p = NULL; if (n > 0) { p = (char*)soap_malloc(soap, n + 1 > n ? n + 1 : n); if (p) { char *s = p; size_t i; for (i = n; i > 0; i--) { soap_wchar c = soap_get1(soap); if ((int)c == EOF) { soap->error = SOAP_CHK_EOF; return NULL; } *s++ = (char)c; } if (n + 1 > n) *s = '\0'; /* force NUL terminated */ soap->error = soap_move(soap, (size_t)(-(long)n&3)); if (soap->error) return NULL; } else { soap->error = SOAP_EOM; } } return p; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_getdimehdr(struct soap *soap) { soap_wchar c; char *s; 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")); s = (char*)tmp; for (i = 12; i > 0; i--) { c = soap_getchar(soap); if ((int)c == EOF) return soap->error = SOAP_CHK_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 = ((size_t)tmp[8] << 24) | ((size_t)tmp[9] << 16) | ((size_t)tmp[10] << 8) | ((size_t)tmp[11]); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME size=%lu flags=0x%X\n", (unsigned long)soap->dime.size, soap->dime.flags)); soap->dime.options = soap_getdimefield(soap, optlen); if (!soap->dime.options && soap->error) return soap->error; soap->dime.id = soap_getdimefield(soap, idlen); if (!soap->dime.id && soap->error) return soap->error; soap->dime.type = soap_getdimefield(soap, typelen); if (!soap->dime.type && soap->error) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME flags=%x id='%s', type='%s', options='%s'\n", soap->dime.flags, 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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_getdime(struct soap *soap) { if (soap->dime.buflen || soap->dime.chunksize) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Skip remainder of SOAP in DIME (%u bytes or %u bytes in chunk left)\n", (unsigned int)soap->dime.buflen, (unsigned int)soap->dime.chunksize)); do if (soap_get1(soap) == (int)EOF) return soap->error = SOAP_CHK_EOF; while (soap->dime.buflen || soap->dime.chunksize); if (soap_move(soap, (size_t)(-(long)soap->dime.size&3))) return soap->error = SOAP_CHK_EOF; if (!(soap->mode & SOAP_ENC_DIME)) return SOAP_OK; } else { if (soap_move(soap, (size_t)(((soap->dime.size+3)&(~3)) - soap_tell(soap)))) return soap->error = SOAP_CHK_EOF; } for (;;) { 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)) != NULL || 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; soap->error = soap->fdimewrite(soap, (void*)soap->dime.ptr, soap->buf + soap->bufidx, n); if (soap->error) break; size -= n; if (!size) { soap->bufidx += n; break; } if (soap_recv(soap)) { soap->error = SOAP_EOF; goto end; } } if (soap_move(soap, (size_t)(-(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_alloc_block(soap) == NULL) return soap->error = SOAP_EOM; for (;;) { soap_wchar c; size_t i; char *s; if (soap->dime.size > SOAP_MAXDIMESIZE) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME size=%lu exceeds SOAP_MAXDIMESIZE=%lu\n", (unsigned long)soap->dime.size, (unsigned long)SOAP_MAXDIMESIZE)); return soap->error = SOAP_DIME_ERROR; } 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--) { c = soap_get1(soap); if ((int)c == EOF) return soap->error = SOAP_EOF; *s++ = (char)c; } if (soap_move(soap, (size_t)(-(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; if (soap->dime.size + 1 > soap->dime.size) soap->blist->size++; /* allocate one more byte in blist for the terminating '\0' */ soap->dime.ptr = soap_save_block(soap, NULL, NULL, 0); if (!soap->dime.ptr) return soap->error; if (soap->dime.size + 1 > soap->dime.size) soap->dime.ptr[soap->dime.size] = '\0'; /* make 0-terminated, just in case even though this is binary data */ soap->dime.id = id; soap->dime.type = type; soap->dime.options = options; } else { soap->dime.ptr = soap_getdimefield(soap, soap->dime.size); } content = soap_alloc_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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_getmimehdr(struct soap *soap) { struct soap_multipart *content; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get MIME header\n")); 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_coblank((soap_wchar)*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->mime.boundary) return soap->error = SOAP_EOM; } 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 (;;) { char *key = soap->msgbuf; 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 (!content->id && !soap_tag_cmp(key, "Content-Disposition")) content->id = soap_strdup(soap, soap_http_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, (LONG64)SOAP_MIME_NONE); } if (soap_getline(soap, key, sizeof(soap->msgbuf))) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_getmime(struct soap *soap) { while (soap_recv_mime_attachment(soap, NULL)) continue; return soap->error; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 void SOAP_FMAC2 soap_post_check_mime_attachments(struct soap *soap) { soap->imode |= SOAP_MIME_POSTCHECK; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_check_mime_attachments(struct soap *soap) { if ((soap->mode & SOAP_MIME_POSTCHECK)) return soap_recv_mime_attachment(soap, NULL) != NULL; return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 struct soap_multipart * SOAP_FMAC2 soap_recv_mime_attachment(struct soap *soap, void *handle) { soap_wchar c = 0; size_t i, m = 0; char *s, *t = NULL; struct soap_multipart *content; short flag = 0; if (!(soap->mode & SOAP_ENC_MIME)) return NULL; content = soap->mime.last; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get MIME (%p)\n", (void*)content)); 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)) != NULL || 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_alloc_block(soap) == NULL) { soap->error = SOAP_EOM; return NULL; } for (;;) { if (content->ptr) { s = soap->tmpbuf; } else { s = (char*)soap_push_block(soap, NULL, sizeof(soap->tmpbuf)); if (!s) { 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_getchar(soap); if ((int)c == EOF) { if (content->ptr && soap->fmimewriteclose) soap->fmimewriteclose(soap, (void*)content->ptr); soap->error = SOAP_CHK_EOF; return NULL; } } if (flag || c == '\r') { memset((void*)soap->msgbuf, 0, sizeof(soap->msgbuf)); soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), "\n--"); if (soap->mime.boundary) { if (soap_strncat(soap->msgbuf, sizeof(soap->msgbuf), soap->mime.boundary, sizeof(soap->msgbuf) - 4)) { soap->error = SOAP_MIME_ERROR; return NULL; } } t = soap->msgbuf; do { c = soap_getchar(soap); } while (c == *t++); if ((int)c == EOF) { if (content->ptr && soap->fmimewriteclose) soap->fmimewriteclose(soap, (void*)content->ptr); soap->error = SOAP_CHK_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) { soap->error = soap->fmimewrite(soap, (void*)content->ptr, soap->tmpbuf, i); if (soap->error) break; } } end: 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 { *s = '\0'; /* make 0-terminated, just in case even though this is binary data */ content->size = soap_size_block(soap, NULL, i + 1) - 1; /* last block with '\0' */ 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)) { if (soap->keep_alive == -2) /* special case to keep alive */ soap->keep_alive = 0; soap_closesock(soap); return NULL; } } else { while (c != '\r' && (int)c != EOF && soap_coblank(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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_match_cid(struct soap *soap, const char *s, const char *t) { 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; (void)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 /******************************************************************************/ /* return UUID "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx" in a temporary buffer */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_rand_uuid(struct soap *soap, const char *prefix) { int r1, r2, r3, r4; #ifdef WITH_OPENSSL r1 = soap_random; r2 = soap_random; #else size_t i; static int k = 0xFACEB00C; int lo = k % 127773; int hi = k / 127773; # if defined(HAVE_GETTIMEOFDAY) struct timeval tv; gettimeofday(&tv, NULL); r1 = 10000000 * tv.tv_sec + tv.tv_usec; # elif defined(UNDER_CE) r1 = (int)Random(); # elif !defined(WITH_LEAN) r1 = (int)time(NULL); # else r1 = k; # endif k = 16807 * lo - 2836 * hi; if (k <= 0) k += 0x7FFFFFFF; r2 = k; /* k &= 0x8FFFFFFF; */ for (i = 0; i < (sizeof(soap->buf) < 16UL ? sizeof(soap->buf) : 16UL); i++) r2 += soap->buf[i]; #endif r3 = soap_random; r4 = soap_random; (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), prefix ? strlen(prefix) + 37 : 37), "%s%8.8x-%4.4hx-4%3.3hx-%4.4hx-%4.4hx%8.8x", prefix ? prefix : SOAP_STR_EOS, r1, (short)(r2 >> 16), (short)(((short)r2 >> 4) & 0x0FFF), (short)(((short)(r3 >> 16) & 0x3FFF) | 0x8000), (short)r3, r4); return soap->tmpbuf; } /******************************************************************************/ #ifndef WITH_LEANER static void soap_resolve_attachment(struct soap *soap, struct soap_multipart *content) { if (content->id) { struct soap_xlist **xp = &soap->xlist; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving attachment data for id='%s'\n", content->id)); while (*xp) { struct soap_xlist *xq = *xp; if (!soap_match_cid(soap, xq->id, content->id)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Found matching attachment id='%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 /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER 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)) != NULL || 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_PLAIN) || (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); bufsize = soap->fmimeread(soap, handle, soap->tmpbuf, bufsize); if (!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 /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER static int soap_begin_attachments(struct soap *soap) { if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary && soap->mime.start) { const char *s; if (strlen(soap->mime.boundary) + strlen(soap->mime.start) + 140 > sizeof(soap->tmpbuf)) return soap->error = SOAP_EOM; 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; charset=utf-8; type=\"text/xml\""; } else { s = "text/xml; charset=utf-8"; } (SOAP_SNPRINTF_SAFE(soap->tmpbuf, sizeof(soap->tmpbuf)), "--%s\r\nContent-Type: %s\r\nContent-Transfer-Encoding: binary\r\nContent-ID: %s\r\n\r\n", soap->mime.boundary, s, soap->mime.start); if (soap_send(soap, soap->tmpbuf)) return soap->error; } if ((soap->mode & SOAP_IO_LENGTH)) soap->dime.size = (size_t)soap->count; /* DIME in MIME correction, soap->count is small */ if (!(soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME)) { if (soap_putdimehdr(soap)) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER static int soap_end_attachments(struct soap *soap) { if ((soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) { if (soap->count > 0xFFFFFFFF) return soap->error = SOAP_DIME_ERROR; soap->dime.size = (size_t)soap->count - soap->dime.size; /* DIME in MIME correction */ (SOAP_SNPRINTF(soap->id, sizeof(soap->id), strlen(soap->dime_id_format) + 20), soap->dime_id_format, 0); soap->dime.id = soap->id; if (soap->local_namespaces && soap->local_namespaces[0].id) { 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); return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER static struct soap_multipart* soap_alloc_multipart(struct soap *soap, struct soap_multipart **first, struct soap_multipart **last, const char *ptr, size_t size) { struct soap_multipart *content; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New DIME/MIME attachment %p (%lu)\n", (void*)ptr, (unsigned long)size)); 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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_set_dime_attachment(struct soap *soap, const char *ptr, size_t size, const char *type, const char *id, unsigned short optype, const char *option) { struct soap_multipart *content = soap_alloc_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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_set_mime_attachment(struct soap *soap, const 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_alloc_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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_next_multipart(struct soap_multipart *content) { if (content) return content->next; return NULL; } #endif /******************************************************************************/ #ifndef WITH_LEANER static void soap_select_mime_boundary(struct soap *soap) { while (!soap->mime.boundary || soap_valid_mime_boundary(soap)) { char *s = soap->mime.boundary; 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; } *s++ = '='; *s++ = '='; n -= 4; while (n) { *s++ = soap_base64o[soap_random & 0x3F]; n--; } *s++ = '='; *s++ = '='; *s = '\0'; } if (!soap->mime.start) soap->mime.start = ""; } #endif /******************************************************************************/ #ifndef WITH_LEANER static int soap_valid_mime_boundary(struct soap *soap) { struct soap_multipart *content; 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) { const char *p = (const char*)content->ptr; 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 /******************************************************************************/ #ifdef WITH_GZIP 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++) { c = soap_get1(soap); if (i == 1 && c == 8) soap->z_dict = 0; if (i == 2) f = c; } if (f & 0x04) /* FEXTRA */ { i = soap_get1(soap); i |= soap_get1(soap) << 8; while (i-- > 0) { if ((int)soap_get1(soap) == EOF) return soap->error = SOAP_ZLIB_ERROR; } } if (f & 0x08) /* skip FNAME */ { do { c = soap_get1(soap); } while (c && (int)c != EOF); } if ((int)c != EOF && (f & 0x10)) /* skip FCOMMENT */ { do { c = soap_get1(soap); } while (c && (int)c != EOF); } if ((int)c != EOF && (f & 0x02)) /* skip FHCRC (CRC32 is used) */ { c = soap_get1(soap); if ((int)c != EOF) c = soap_get1(soap); } if ((int)c == EOF) return soap->error = SOAP_ZLIB_ERROR; return SOAP_OK; } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_begin_serve(struct soap *soap) { #ifdef WITH_FASTCGI if (FCGI_Accept() < 0) { soap->error = SOAP_EOF; return soap_send_fault(soap); } #endif soap_begin(soap); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) { if (soap->error < SOAP_STOP) { #ifdef WITH_FASTCGI (void)soap_send_fault(soap); #else return soap_send_fault(soap); #endif } return soap_closesock(soap); } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_begin_recv(struct soap *soap) { soap_wchar c; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing for input from socket=%d/fd=%d\n", (int)soap->socket, soap->recvfd)); soap->error = SOAP_OK; #ifndef WITH_LEANER soap->recverror = SOAP_OK; #endif 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->imode &= ~SOAP_IO; soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_CHUNK; } soap->imode &= ~(SOAP_ENC_DIME | SOAP_ENC_MIME | SOAP_ENC_MTOM | SOAP_ENC_ZLIB); soap->mode = soap->imode; if (!(soap->mode & SOAP_IO_KEEPALIVE)) soap->keep_alive = 0; if (!soap->keep_alive) soap->buflen = soap->bufidx = 0; soap->null = 0; soap->position = 0; soap->mustUnderstand = 0; soap->shaky = 0; soap->ahead = 0; soap->peeked = 0; soap->level = 0; soap->part = SOAP_BEGIN_RECV; soap->count = 0; soap->length = 0; soap->cdata = 0; *soap->endpoint = '\0'; soap->action = NULL; soap->header = NULL; soap->fault = NULL; soap->status = 0; soap->fform = NULL; soap->body = 1; #ifndef WITH_LEANER soap->dom = NULL; soap->dime.count = 0; 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) && !soap->is && soap->recvfd >= 0) /* Set win32 stdin or soap->recvfd to BINARY, e.g. to support DIME */ #ifdef __BORLANDC__ setmode(soap->recvfd, _O_BINARY); #else _setmode(soap->recvfd, _O_BINARY); #endif #endif #endif #endif #ifdef WITH_ZLIB soap->zlib_in = SOAP_ZLIB_NONE; soap->zlib_out = SOAP_ZLIB_NONE; if (!soap->d_stream) { soap->d_stream = (z_stream*)SOAP_MALLOC(soap, sizeof(z_stream)); if (!soap->d_stream) return soap->error = SOAP_EOM; soap->d_stream->zalloc = Z_NULL; soap->d_stream->zfree = Z_NULL; soap->d_stream->opaque = Z_NULL; soap->d_stream->next_in = Z_NULL; soap->d_stream->msg = Z_NULL; } soap->d_stream->avail_in = 0; soap->d_stream->next_out = (Byte*)soap->buf; soap->d_stream->avail_out = sizeof(soap->buf); soap->z_ratio_in = 1.0; #endif #ifdef WITH_OPENSSL if (soap->ssl) ERR_clear_error(); #endif #ifndef WITH_LEAN soap->start = (ULONG64)time(NULL); #endif #ifndef WITH_LEANER if (soap->fprepareinitrecv && (soap->error = soap->fprepareinitrecv(soap)) != SOAP_OK) return soap->error; #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; if (soap->z_dict) { if (inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != 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, sizeof(soap->buf)); (void)soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)soap->buf, sizeof(soap->buf)); /* 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 = (unsigned int)(soap->buflen - soap->bufidx); soap->z_buflen = soap->buflen; soap->buflen = soap->bufidx; c = ' '; } #endif while (soap_coblank(c)) c = soap_getchar(soap); #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 { /* skip BOM */ if (c == 0xEF && soap_get0(soap) == 0xBB) { soap_get1(soap); c = soap_get1(soap); if (c == 0xBF) { soap->mode &= ~SOAP_ENC_LATIN; c = soap_getchar(soap); } else { c = (0x0F << 12) | (0xBB << 6) | (c & 0x3F); /* UTF-8 */ } } else if ((c == 0xFE && soap_get0(soap) == 0xFF) /* UTF-16 BE */ || (c == 0xFF && soap_get0(soap) == 0xFE)) /* UTF-16 LE */ { return soap->error = SOAP_UTF_ERROR; } /* skip space */ while (soap_coblank(c)) c = soap_getchar(soap); } if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; soap_unget(soap, c); #ifndef WITH_NOHTTP /* if not XML/MIME/DIME/ZLIB, assume HTTP method or status line */ if (((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) && !(soap->mode & (SOAP_ENC_MIME | SOAP_ENC_DIME | SOAP_ENC_ZLIB | SOAP_ENC_PLAIN))) { soap_mode m = soap->imode; soap->error = soap->fparse(soap); soap->mode = soap->imode; /* if imode is changed, effectuate */ soap->imode = m; /* restore imode */ if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { soap->chunkbuflen = soap->buflen; soap->buflen = soap->bufidx; soap->chunksize = 0; } #ifdef WITH_ZLIB soap->mode &= ~SOAP_ENC_ZLIB; if (soap->zlib_in != SOAP_ZLIB_NONE) { #ifdef WITH_GZIP if (soap->zlib_in != SOAP_ZLIB_DEFLATE) { c = soap_get1(soap); if (c == (int)EOF) return soap->error = SOAP_EOF; 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; if (soap->z_dict) { if (inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != 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, sizeof(soap->buf)); (void)soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)soap->buf, sizeof(soap->buf)); soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx); soap->d_stream->avail_in = (unsigned int)(soap->buflen - soap->bufidx); soap->z_buflen = soap->buflen; soap->buflen = soap->bufidx; } #endif #ifndef WITH_LEANER if (soap->fpreparerecv && (soap->mode & SOAP_IO) != SOAP_IO_CHUNK && soap->buflen > soap->bufidx) { int r; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Invoking fpreparerecv\n")); r = soap->fpreparerecv(soap, soap->buf + soap->bufidx, soap->buflen - soap->bufidx); if (r) return soap->error = r; } #endif if (soap->error && soap->error < SOAP_STOP) { if (soap->status >= 200 && soap->status < 600) { const char *s = soap_http_get_body(soap, NULL); (void)soap_end_recv(soap); if (soap->status >= 300) soap->keep_alive = 0; /* to force close */ return soap_set_receiver_error(soap, "HTTP Error", s, soap->status); } return soap->error; } if (!soap->body && soap->status >= 200 && soap->status < 600) return soap->error = soap->status; /* client side received HTTP status code */ if (soap->status > SOAP_POST) { soap->fform = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Invoking http method handler\n")); switch (soap->status) { case SOAP_GET: if (soap_http_skip_body(soap) || soap_end_recv(soap)) return soap->error; soap->error = soap->fget(soap); break; case SOAP_PUT: soap->error = soap->fput(soap); break; case SOAP_PATCH: soap->error = soap->fpatch(soap); break; case SOAP_DEL: if (soap_http_skip_body(soap) || soap_end_recv(soap)) return soap->error; soap->error = soap->fdel(soap); break; case SOAP_HEAD: if (soap_http_skip_body(soap) || soap_end_recv(soap)) return soap->error; soap->error = soap->fhead(soap); break; case SOAP_OPTIONS: if (soap_http_skip_body(soap) || soap_end_recv(soap)) return soap->error; soap->error = soap->fopt(soap); break; default: if (soap_http_skip_body(soap) || soap_end_recv(soap)) return soap->error; return 405; } if (soap->error == SOAP_OK) return soap->error = SOAP_STOP; /* prevents further processing */ if (soap->error != SOAP_FORM || !soap->fform) /* continue if handler returned SOAP_FORM */ return soap->error; soap->error = SOAP_OK; } if (soap->fform) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Invoking http form handler\n")); soap->error = soap->fform(soap); if (soap->error == SOAP_OK) return soap->error = SOAP_STOP; /* prevents further processing */ if (soap->status != SOAP_POST || soap->error != 404) /* continue with POST if handler returned HTTP not found */ return soap->error; soap->error = SOAP_OK; } if (!soap->body) return soap->error = SOAP_NO_DATA; } #endif #ifndef WITH_LEANER if ((soap->mode & SOAP_ENC_MIME)) { do /* skip preamble */ { c = soap_getchar(soap); if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; } while (c != '-' || soap_get0(soap) != '-'); soap_unget(soap, c); 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_recv_mime_attachment(soap, NULL)); } if (soap_http_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 SOAP in DIME 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; if (soap->recv_maxlength && soap->count > soap->recv_maxlength) return soap->error = SOAP_EOF; } #endif return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_out(struct soap *soap) { if (soap->version == 0) return SOAP_OK; soap->part = SOAP_IN_ENVELOPE; return soap_element_begin_out(soap, "SOAP-ENV:Envelope", 0, NULL); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_out(struct soap *soap) { if (soap->version == 0) return SOAP_OK; if (soap_element_end_out(soap, "SOAP-ENV:Envelope") || soap_send_raw(soap, "\r\n", 2)) /* 2.8: always emit \r\n */ return soap->error; soap->part = SOAP_END_ENVELOPE; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_http_has_body(struct soap *soap) { return soap->length || (soap->mode & SOAP_ENC_ZLIB) || (soap->mode & SOAP_IO) == SOAP_IO_CHUNK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_http_skip_body(struct soap *soap) { ULONG64 k = soap->length; /* check HTTP body, return "" if none */ if (!k && !(soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) != SOAP_IO_CHUNK) return SOAP_OK; /* do not consume DIME or MIME attachments, leave this to soap_end_recv */ if ((soap->mode & SOAP_ENC_DIME) || (soap->mode & SOAP_ENC_MIME)) return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Skipping HTTP body (mode=0x%x)\n", soap->mode)); if (k && !(soap->mode & SOAP_ENC_ZLIB)) { size_t i; soap->length = 0; for (i = 0; i < k; i++) { soap_wchar c = soap_get1(soap); if ((int)c == EOF) break; } } else { for (;;) { soap_wchar c = soap_get1(soap); if ((int)c == EOF) break; } } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_http_get_body(struct soap *soap, size_t *len) { return soap_http_get_body_prefix(soap, len, NULL); } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_http_get_form(struct soap *soap) { return soap_http_get_body_prefix(soap, NULL, "?"); } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_http_get_body_prefix(struct soap *soap, size_t *len, const char *prefix) { char *s; ULONG64 k = soap->length; size_t n = 0; if (!prefix) prefix = SOAP_STR_EOS; else n = strlen(prefix); if (len) *len = 0; /* check HTTP body, return "" if none */ if (!k && !(soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) != SOAP_IO_CHUNK) return soap_strdup(soap, prefix); /* do not consume DIME or MIME attachments, leave this to soap_end_recv */ if ((soap->mode & SOAP_ENC_DIME) || (soap->mode & SOAP_ENC_MIME)) return soap_strdup(soap, prefix); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Parsing HTTP body, prefixed with '%s' (mode=0x%x)\n", prefix, soap->mode)); if (k && !(soap->mode & SOAP_ENC_ZLIB)) { char *t; soap->length = 0; /* http content length != 0 and uncompressed body */ if ((SOAP_MAXALLOCSIZE != 0 && n + k > SOAP_MAXALLOCSIZE) || n + k > (ULONG64)((size_t)-2)) { soap->error = SOAP_EOM; return NULL; } s = t = (char*)soap_malloc(soap, (size_t)k + n + 1); if (s) { size_t i; soap_strcpy(t, n + 1, prefix); t += n; for (i = 0; i < k; i++) { soap_wchar c = soap_get1(soap); if ((int)c == EOF) break; *t++ = (char)(c & 0xFF); } *t = '\0'; if (len) *len = n + i; } else { soap->error = SOAP_EOM; return NULL; } } else { size_t i, l = 0; if (soap_alloc_block(soap) == NULL) return NULL; if (n) { s = (char*)soap_push_block(soap, NULL, n); if (!s) return NULL; soap_strcpy(s, n + 1, prefix); l += n; } for (;;) { size_t k = SOAP_BLKLEN; s = (char*)soap_push_block(soap, NULL, k); if (!s) return NULL; for (i = 0; i < k; i++) { soap_wchar c; l++; if (l == 0) { soap->error = SOAP_EOM; return NULL; } c = soap_get1(soap); if ((int)c == EOF) goto end; *s++ = (char)(c & 0xFF); } } end: *s = '\0'; if (len) *len = l - 1; soap_size_block(soap, NULL, i + 1); s = soap_save_block(soap, NULL, NULL, 0); } return s; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_in(struct soap *soap) { soap->part = SOAP_IN_ENVELOPE; if (soap_element_begin_in(soap, "SOAP-ENV:Envelope", 0, NULL)) { if (soap->error == SOAP_TAG_MISMATCH) { if (!soap_element_begin_in(soap, "Envelope", 0, NULL)) soap->error = SOAP_VERSIONMISMATCH; else if (soap->status == 0 || (soap->status >= 200 && soap->status <= 299) || soap->status == 400 || soap->status == 500) return SOAP_OK; /* allow non-SOAP (REST) XML content to be captured */ soap->error = soap->status; } else if (soap->status) { soap->error = soap->status; } return soap->error; } soap_version(soap); return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_in(struct soap *soap) { if (soap->version == 0) return SOAP_OK; soap->part = SOAP_END_ENVELOPE; return soap_element_end_in(soap, "SOAP-ENV:Envelope"); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_out(struct soap *soap) { if (soap->version == 1) soap->encoding = 1; #ifndef WITH_LEAN if ((soap->mode & SOAP_SEC_WSUID) && soap_set_attr(soap, "wsu:Id", "Body", 1)) return soap->error; #endif if (soap->version == 0) return SOAP_OK; soap->part = SOAP_IN_BODY; return soap_element_begin_out(soap, "SOAP-ENV:Body", 0, NULL); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_out(struct soap *soap) { if (soap->version == 0) return SOAP_OK; if (soap_element_end_out(soap, "SOAP-ENV:Body")) return soap->error; soap->part = SOAP_END_BODY; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_in(struct soap *soap) { if (soap->version == 0) return SOAP_OK; 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; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_in(struct soap *soap) { if (soap->version == 0) return SOAP_OK; if (soap->part == SOAP_NO_BODY) return soap->error = SOAP_OK; soap->part = SOAP_END_BODY; return soap_element_end_in(soap, "SOAP-ENV:Body"); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_recv_header(struct soap *soap) { if (soap_getheader(soap) && soap->error == SOAP_TAG_MISMATCH) soap->error = SOAP_OK; if (soap->error == SOAP_OK && soap->fheader) soap->error = soap->fheader(soap); return soap->error; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_endpoint(struct soap *soap, const char *endpoint) { const char *s, *t; 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 soap_strcpy(soap->endpoint, sizeof(soap->endpoint), endpoint); s = strchr(endpoint, ':'); if (s && s[1] == '/' && s[2] == '/') s += 3; else s = endpoint; #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) t = strchr(s, '@'); if (t && *s != ':' && *s != '@') { size_t l = t - s + 1; char *r = (char*)soap_malloc(soap, l); n = s - endpoint; if (r) { s = soap_decode(r, l, s, ":@"); soap->userid = r; soap->passwd = SOAP_STR_EOS; if (*s == ':') { s++; if (*s != '@') { l = t - s + 1; r = r + strlen(r) + 1; s = soap_decode(r, l, s, "@"); soap->passwd = r; } } } s++; soap_strcpy(soap->endpoint + n, sizeof(soap->endpoint) - n, s); } #endif 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] == ':' || s[i] == '?') break; } } #else for (i = 0; i < n; i++) { soap->host[i] = s[i]; if (s[i] == '/' || s[i] == ':' || s[i] == '?') break; } #endif soap->host[i] = '\0'; if (s[i] == ':') { soap->port = (int)soap_strtol(s + i + 1, NULL, 10); for (i++; i < n; i++) if (s[i] == '/') break; } if (i < n && s[i]) soap_strcpy(soap->path, sizeof(soap->path), s + i); if (soap->override_host && *soap->override_host) { soap_strcpy(soap->host, sizeof(soap->host), soap->override_host); if (soap->override_port) soap->port = soap->override_port; } if (soap->userid && !soap->authrealm) soap->authrealm = soap->host; } /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_GET(struct soap *soap, const char *endpoint, const char *action) { return soap_connect_command(soap, SOAP_GET, endpoint, action); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_PUT(struct soap *soap, const char *endpoint, const char *action, const char *type) { soap->http_content = type; if ((soap->omode & SOAP_IO) != SOAP_IO_CHUNK) { soap->omode &= ~SOAP_IO; soap->omode |= SOAP_IO_STORE; } return soap_connect_command(soap, SOAP_PUT, endpoint, action); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_POST(struct soap *soap, const char *endpoint, const char *action, const char *type) { soap->http_content = type; if ((soap->omode & SOAP_IO) != SOAP_IO_CHUNK) { soap->omode &= ~SOAP_IO; soap->omode |= SOAP_IO_STORE; } return soap_connect_command(soap, SOAP_POST_FILE, endpoint, action); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_PATCH(struct soap *soap, const char *endpoint, const char *action, const char *type) { soap->http_content = type; if ((soap->omode & SOAP_IO) != SOAP_IO_CHUNK) { soap->omode &= ~SOAP_IO; soap->omode |= SOAP_IO_STORE; } return soap_connect_command(soap, SOAP_PATCH, endpoint, action); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_DELETE(struct soap *soap, const char *endpoint) { if (soap_connect_command(soap, SOAP_DEL, endpoint, NULL) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } #endif /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_connect_command(struct soap *soap, int http_command, const char *endpoints, const char *action) { if (endpoints) { int retry = soap->connect_retry; unsigned int backoff = 1; for (;;) { struct timeval tv; const char *s; s = strchr(endpoints, ' '); if (s) { size_t l = strlen(endpoints); char *endpoint = NULL; if (SOAP_MAXALLOCSIZE == 0 || l <= SOAP_MAXALLOCSIZE) endpoint = (char*)SOAP_MALLOC(soap, l + 1); if (!endpoint) return soap->error = SOAP_EOM; for (;;) { (void)soap_strncpy(endpoint, l + 1, endpoints, s - endpoints); endpoint[s - endpoints] = '\0'; if (soap_try_connect_command(soap, http_command, endpoint, action) != SOAP_TCP_ERROR) break; while (*s == ' ') s++; if (!*s) break; soap->error = SOAP_OK; 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); } if (soap->error != SOAP_TCP_ERROR || retry <= 0) break; soap->error = SOAP_OK; tv.tv_sec = backoff; tv.tv_usec = 0; select(0, NULL, NULL, NULL, &tv); if (backoff < 32) backoff *= 2; --retry; } } return soap->error; } /******************************************************************************/ 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; ULONG64 count; soap->error = SOAP_OK; (void)soap_memcpy(host, sizeof(host), soap->host, sizeof(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); soap->action = soap_strdup(soap, action); #ifndef WITH_LEANER if (soap->fconnect) { soap->error = soap->fconnect(soap, endpoint, soap->host, soap->port); if (soap->error) 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->error = SOAP_OK; #ifndef WITH_LEAN if (!strncmp(endpoint, "soap.udp:", 9) || !strncmp(endpoint, "udp:", 4)) { soap->omode |= SOAP_IO_UDP; } else #endif { 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 '%s' host='%s' path='%s' port=%d\n", endpoint?endpoint:"(null)", soap->host, soap->path, soap->port)); if (!soap->keep_alive || !soap_valid_socket(soap->socket)) { soap->socket = soap->fopen(soap, endpoint, soap->host, soap->port); if (!soap_valid_socket(soap->socket) || soap->error) { if (soap->error) return soap->error; return soap->error = SOAP_TCP_ERROR; } soap->keep_alive = -((soap->omode & SOAP_IO_KEEPALIVE) != 0); } } } #ifdef WITH_NTLM if (soap_ntlm_handshake(soap, SOAP_GET, endpoint, soap->host, soap->port)) return soap->error; #endif count = soap_count_attachments(soap); if (soap_init_send(soap)) return soap->error; #ifndef WITH_NOHTTP if (http_command == SOAP_GET || http_command == SOAP_DEL || http_command == SOAP_HEAD || http_command == SOAP_OPTIONS) { soap->mode &= ~SOAP_IO; soap->mode |= SOAP_IO_BUFFER; } if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_PLAIN) && endpoint) { soap_mode k = soap->mode; soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB); if ((k & SOAP_IO) != SOAP_IO_FLUSH) soap->mode |= SOAP_IO_BUFFER; soap->error = soap->fpost(soap, endpoint, soap->host, soap->port, soap->path, action, count); if (soap->error) return soap->error; if ((k & SOAP_IO) == SOAP_IO_CHUNK) { if (soap_flush(soap)) return soap->error; } soap->mode = k; } if (http_command == SOAP_GET || http_command == SOAP_DEL || http_command == SOAP_HEAD || http_command == SOAP_OPTIONS) return soap_end_send_flush(soap); #endif #ifndef WITH_LEANER if (soap_begin_attachments(soap)) return soap->error; #endif return SOAP_OK; } /******************************************************************************/ #ifdef WITH_NTLM static int soap_ntlm_handshake(struct soap *soap, int command, const char *endpoint, const char *host, int port) { /* requires libntlm from http://www.nongnu.org/libntlm/ */ const char *userid = (soap->proxy_userid ? soap->proxy_userid : soap->userid); const char *passwd = (soap->proxy_passwd ? soap->proxy_passwd : soap->passwd); struct SOAP_ENV__Header *oldheader; if (soap->ntlm_challenge && userid && passwd && soap->authrealm) { tSmbNtlmAuthRequest req; tSmbNtlmAuthResponse res; tSmbNtlmAuthChallenge ch; int k = soap->keep_alive; ULONG64 l = soap->length; ULONG64 c = soap->count; soap_mode m = soap->mode, o = soap->omode; int s = soap->status; char *a = soap->action; short v = soap->version; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM '%s'\n", soap->ntlm_challenge)); if (!*soap->ntlm_challenge) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM S->C Type 1: received NTLM authentication challenge from server\n")); /* S -> C 401 Unauthorized WWW-Authenticate: NTLM */ buildSmbNtlmAuthRequest(&req, userid, soap->authrealm); soap->ntlm_challenge = soap_s2base64(soap, (unsigned char*)(void*)&req, NULL, SmbLength(&req)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM C->S Type 2: sending NTLM authorization to server\nAuthorization: NTLM %s\n", soap->ntlm_challenge)); /* C -> S GET ... Authorization: NTLM TlRMTVNTUAABAAAAA7IAAAoACgApAAAACQAJACAAAABMSUdIVENJVFlVUlNBLU1JTk9S */ soap->omode = SOAP_IO_BUFFER; if (soap_init_send(soap)) return soap->error; if (!soap->keep_alive) soap->keep_alive = -1; /* client keep alive */ soap->status = command; if (soap->fpost(soap, endpoint, host, port, soap->path, soap->action, 0) || soap_end_send_flush(soap)) return soap->error; soap->mode = m; soap->keep_alive = k; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM S->C Type 2: waiting on server NTLM response\n")); oldheader = soap->header; if (soap_begin_recv(soap)) if (soap->error == SOAP_EOF) return soap->error; (void)soap_end_recv(soap); soap->header = oldheader; soap->length = l; if (soap->status != 401 && soap->status != 407) return soap->error = SOAP_NTLM_ERROR; soap->error = SOAP_OK; } /* S -> C 401 Unauthorized WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAAAAACgAAAABggAAU3J2Tm9uY2UAAAAAAAAAAA== */ soap_base642s(soap, soap->ntlm_challenge, (char*)&ch, sizeof(tSmbNtlmAuthChallenge), NULL); buildSmbNtlmAuthResponse(&ch, &res, userid, passwd); soap->ntlm_challenge = soap_s2base64(soap, (unsigned char*)(void*)&res, NULL, SmbLength(&res)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM C->S Type 3: sending NTLM authorization to server\nAuthorization: NTLM %s\n", soap->ntlm_challenge)); /* C -> S GET ... Authorization: NTLM TlRMTVNTUAADAAAAGAAYAHIAAAAYABgAigAAABQAFABAAAAADAAMAFQAAAASABIAYAAAAAAAAACiAAAAAYIAAFUAUgBTAEEALQBNAEkATgBPAFIAWgBhAHAAaABvAGQATABJAEcASABUAEMASQBUAFkArYfKbe/jRoW5xDxHeoxC1gBmfWiS5+iX4OAN4xBKG/IFPwfH3agtPEia6YnhsADT */ soap->userid = NULL; soap->passwd = NULL; soap->proxy_userid = NULL; soap->proxy_passwd = NULL; soap->keep_alive = k; soap->length = l; soap->count = c; soap->mode = m; soap->omode = o; soap->status = s; soap->action = a; soap->version = v; } return SOAP_OK; } #endif /******************************************************************************/ SOAP_FMAC1 char* SOAP_FMAC2 soap_s2base64(struct soap *soap, const unsigned char *s, char *t, int n) { int i; unsigned long m; 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) /* 0 < n <= 2 implies that t[0..4] is allocated (base64 scaling formula) */ { m = 0; for (i = 0; i < n; i++) m = (m << 8) | *s++; for (; i < 3; i++) m <<= 8; for (i = 4; i > 0; m >>= 6) t[--i] = soap_base64o[m & 0x3F]; for (i = 3; i > n; i--) t[i] = '='; t[4] = '\0'; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_base642s(struct soap *soap, const char *s, char *t, size_t l, int *n) { size_t i, j; soap_wchar c; unsigned long m; 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 + 1; /* space for raw binary and \0 */ t = (char*)soap_malloc(soap, l); } if (!t) return NULL; p = t; if (n) *n = 0; for (i = 0; ; i += 3, l -= 3) { m = 0; j = 0; while (j < 4) { c = *s++; if (c == '=' || !c) { if (l >= j - 1) { switch (j) { case 2: *t++ = (char)((m >> 4) & 0xFF); i++; l--; break; case 3: *t++ = (char)((m >> 10) & 0xFF); *t++ = (char)((m >> 2) & 0xFF); i += 2; l -= 2; } } if (n) *n = (int)i; if (l) *t = '\0'; 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_coblank(c + '+')) { soap->error = SOAP_TYPE; return NULL; } } if (l < 3) { if (n) *n = (int)i; if (l) *t = '\0'; return p; } *t++ = (char)((m >> 16) & 0xFF); *t++ = (char)((m >> 8) & 0xFF); *t++ = (char)(m & 0xFF); } } /******************************************************************************/ SOAP_FMAC1 char* SOAP_FMAC2 soap_s2hex(struct soap *soap, const unsigned char *s, char *t, int n) { 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--) { 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; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_hex2s(struct soap *soap, const char *s, char *t, size_t l, int *n) { 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 + 1; /* make sure enough space for \0 */ t = (char*)soap_malloc(soap, l); } if (!t) return NULL; p = t; while (l) { int d1, d2; d1 = *s++; if (!d1) break; d2 = *s++; if (!d2) break; *t++ = (char)(((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0')); l--; } if (n) *n = (int)(t - p); if (l) *t = '\0'; return p; } /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 const char * SOAP_FMAC2 soap_http_content_type(struct soap *soap, int status) { if (soap->status != SOAP_GET && soap->status != SOAP_DEL && soap->status != SOAP_CONNECT) { const char *s = "text/xml; charset=utf-8"; #ifndef WITH_LEANER const char *r = NULL; size_t n; #endif if (((status >= SOAP_FILE && status < SOAP_FILE + 600) || soap->status == SOAP_PUT || soap->status == SOAP_POST_FILE || soap->status == SOAP_PATCH) && soap->http_content && *soap->http_content && !strchr(soap->http_content, 10) && !strchr(soap->http_content, 13)) s = soap->http_content; else if (status == SOAP_HTML) s = "text/html; charset=utf-8"; else if (soap->version == 2) s = "application/soap+xml; charset=utf-8"; soap->http_content = NULL; /* use http_content once (assign new value before each call) */ #ifndef WITH_LEANER if (soap->mode & (SOAP_ENC_DIME | SOAP_ENC_MTOM)) { if ((soap->mode & SOAP_ENC_MTOM)) { if (soap->version == 2) r = "application/soap+xml"; else r = "text/xml"; s = "application/xop+xml"; } else { s = "application/dime"; } } if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary) { const char *t; size_t l; (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(soap->mime.boundary) + 53), "multipart/related; charset=utf-8; boundary=\"%s\"; type=\"", soap->mime.boundary); t = strchr(s, ';'); if (t) n = t - s; else n = strlen(s); l = strlen(soap->tmpbuf); if (sizeof(soap->tmpbuf) > l + n) (void)soap_strncpy(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, s, n); if (soap->mime.start) { l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, strlen(soap->mime.start) + 10), "\"; start=\"%s", soap->mime.start); } if (r) { l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, strlen(r) + 15), "\"; start-info=\"%s", r); } l = strlen(soap->tmpbuf); if (sizeof(soap->tmpbuf) > l) soap_strcpy(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, "\""); } else { soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), s); } if (status == SOAP_OK && soap->version == 2 && soap->action) { size_t l = strlen(soap->tmpbuf); n = strlen(soap->action); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, n + 11), "; action=\"%s\"", soap->action); } #else soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), s); #endif return soap->tmpbuf; } return NULL; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_puthttphdr(struct soap *soap, int status, ULONG64 count) { int err = SOAP_OK; if (soap_http_content_type(soap, status)) { err = soap->fposthdr(soap, "Content-Type", soap->tmpbuf); if (err) 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 { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), SOAP_ULONG_FORMAT, count); err = soap->fposthdr(soap, "Content-Length", soap->tmpbuf); } if (err) return err; } if (soap->http_extra_header) { err = soap_send(soap, soap->http_extra_header); soap->http_extra_header = NULL; /* use http_extra_header once (assign new value before each call) */ if (err) return err; err = soap_send_raw(soap, "\r\n", 2); if (err) return err; } if (soap->keep_alive) { if (soap->keep_alive > 0 && soap->recv_timeout) { int t = soap->recv_timeout; if (t < 0) t = 1; (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), "timeout=%d, max=%d", soap->recv_timeout, soap->keep_alive); err = soap->fposthdr(soap, "Keep-Alive", soap->tmpbuf); if (err) return err; } return soap->fposthdr(soap, "Connection", "keep-alive"); } return soap->fposthdr(soap, "Connection", "close"); } #endif /******************************************************************************/ #ifndef WITH_LEAN static const char* soap_set_validation_fault(struct soap *soap, const char *s, const char *t) { if (!t) t = SOAP_STR_EOS; if (*soap->tag) (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(s) + strlen(t) + strlen(soap->tag) + 47), "Validation constraint violation: %s%s in element '%s'", s, t, soap->tag); else (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(s) + strlen(t) + 33), "Validation constraint violation: %s%s", s, t); return soap->msgbuf; } #endif /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_fault(struct soap *soap) { const char **c; const char **s; if (soap->version == 0) soap_version(soap); c = soap_faultcode(soap); s = soap_faultstring(soap); if (soap->fseterror) soap->fseterror(soap, c, s); if (!*c) { if (soap->version == 2) *c = "SOAP-ENV:Sender"; else if (soap->version == 1) *c = "SOAP-ENV:Client"; else *c = ""; } if (*s) return; if (soap->error >= SOAP_POST) soap->error = SOAP_HTTP_METHOD; 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: if (*soap->type) *s = soap_set_validation_fault(soap, "type mismatch ", soap->type); else if (*soap->arrayType) *s = soap_set_validation_fault(soap, "array type mismatch", NULL); else *s = soap_set_validation_fault(soap, "invalid value", NULL); break; case SOAP_SYNTAX_ERROR: *s = soap_set_validation_fault(soap, "syntax error", NULL); break; case SOAP_NO_TAG: if (soap->version == 0 && soap->level == 0) *s = soap_set_validation_fault(soap, "root element expected", NULL); else if (soap->level == 0) *s = soap_set_validation_fault(soap, "SOAP message expected", NULL); else *s = soap_set_validation_fault(soap, "element tag expected", NULL); break; case SOAP_END_TAG: *s = soap_set_validation_fault(soap, "closing tag expected", NULL); break; case SOAP_MUSTUNDERSTAND: *c = "SOAP-ENV:MustUnderstand"; (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(soap->tag) + 65), "The data in element '%s' must be understood but cannot be processed", 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 data access error"; break; case SOAP_NO_METHOD: (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(soap->tag) + 66), "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_PATCH_METHOD: *s = "HTTP PATCH method not implemented"; break; case SOAP_DEL_METHOD: *s = "HTTP DELETE method not implemented"; break; case SOAP_HTTP_METHOD: *s = "HTTP method error"; 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 elements (use the SOAP_XML_TREE flag) with duplicate 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 id-ref ", 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_NTLM_ERROR: *s = "An HTTP NTLM authentication error occurred"; break; case SOAP_SSL_ERROR: #ifdef WITH_OPENSSL *s = "SSL/TLS 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 or max DIME size exceeds SOAP_MAXDIMESIZE currently set to " SOAP_XSTRINGIFY(SOAP_MAXDIMESIZE); 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 (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), (soap->d_stream && soap->d_stream->msg ? strlen(soap->d_stream->msg) : 0) + 19), "Zlib/gzip error: '%s'", soap->d_stream && 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_LEVEL: *s = "Maximum XML nesting depth level exceeded: increase maxlevel"; break; case SOAP_LENGTH: *s = soap_set_validation_fault(soap, "value range or content length violation", NULL); break; case SOAP_OCCURS: *s = soap_set_validation_fault(soap, "occurrence constraint violation", NULL); break; case SOAP_FIXED: *s = soap_set_validation_fault(soap, "value does not match the fixed value required", NULL); break; case SOAP_EMPTY: *s = soap_set_validation_fault(soap, "empty value provided where a value is required", NULL); break; case SOAP_FD_EXCEEDED: *s = "Maximum number of open connections was reached: increase FD_SETSIZE or define HAVE_POLL"; break; case SOAP_UTF_ERROR: *s = "UTF content encoding error"; break; case SOAP_STOP: *s = "Stopped: service request already handled by plugin (informative)"; break; #endif case SOAP_EOF: #ifndef WITH_NOIO *s = soap_strerror(soap); /* *s = soap->msgbuf */ #ifndef WITH_LEAN if (strlen(soap->msgbuf) + 25 < sizeof(soap->msgbuf)) { (void)soap_memmove((void*)(soap->msgbuf + 25), sizeof(soap->tmpbuf) - 25, (const void*)soap->msgbuf, strlen(soap->msgbuf) + 1); if (soap->is) #if defined(__cplusplus) && !defined(WITH_COMPAT) (void)soap_memcpy((void*)soap->msgbuf, sizeof(soap->msgbuf), (const void*)"End or bad std::istream: ", 25); #else (void)soap_memcpy((void*)soap->msgbuf, sizeof(soap->msgbuf), (const void*)"End at NUL buffer input: ", 25); #endif else (void)soap_memcpy((void*)soap->msgbuf, sizeof(soap->msgbuf), (const void*)"End of file or no input: ", 25); } #endif break; #else *s = "End of file or no input"; break; #endif case SOAP_ERR: *s = "An unspecified error occurred"; break; default: #ifndef WITH_NOHTTP #ifndef WITH_LEAN if (soap->error >= 200 && soap->error < 600) { const char *t = http_error(soap, soap->error); (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(t) + 54), "Error %d: HTTP %d %s", soap->error, soap->error, t); *s = soap->msgbuf; } else #endif #endif { (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), 26), "Error %d", soap->error); *s = soap->msgbuf; } } } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_send_fault(struct soap *soap) { int status = soap->error; if (status == SOAP_OK || status == SOAP_STOP) return soap_closesock(soap); #ifndef WITH_NOHTTP if (status >= 200 && status <= 299) return soap_send_empty_response(soap, status); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending back fault struct for error code %d\n", soap->error)); soap->keep_alive = 0; /* error: close connection later by disabling keep-alive here */ soap_set_fault(soap); if (soap->error < 200 && soap->error != SOAP_FAULT) soap->header = NULL; 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)) { r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_SND, 0); if (r > 0) { int t; if (!(r & SOAP_TCP_SELECT_SND) || ((r & SOAP_TCP_SELECT_RCV) && recv(soap->socket, (char*)&t, 1, MSG_PEEK) < 0)) r = 0; } } #endif #endif if (r > 0) { soap->error = SOAP_OK; if (soap->version > 0) { soap->encodingStyle = NULL; /* no encodingStyle in Faults */ soap_serializeheader(soap); soap_serializefault(soap); (void)soap_begin_count(soap); if ((soap->mode & SOAP_IO_LENGTH)) { if (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); } (void)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) || soap_end_send(soap)) return soap_closesock(soap); } else { const char *s = *soap_faultstring(soap); const char **d = soap_faultdetail(soap); (void)soap_begin_count(soap); if ((soap->mode & SOAP_IO_LENGTH)) if (soap_element_begin_out(soap, "fault", 0, NULL) || soap_outstring(soap, "reason", 0, (char*const*)&s, NULL, 0) || soap_outliteral(soap, "detail", (char*const*)d, NULL) || soap_element_end_out(soap, "fault")) return soap_closesock(soap); (void)soap_end_count(soap); if (soap_response(soap, status) || soap_element_begin_out(soap, "fault", 0, NULL) || soap_outstring(soap, "reason", 0, (char*const*)&s, NULL, 0) || soap_outliteral(soap, "detail", (char*const*)d, NULL) || soap_element_end_out(soap, "fault") || soap_end_send(soap)) return soap_closesock(soap); } } } soap->error = status; return soap_closesock(soap); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_recv_fault(struct soap *soap, int check) { int status = soap->status; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Check (%d) if receiving SOAP Fault (status = %d)\n", check, status)); if (!check) { /* try getfault when no tag or tag mismatched at level 2, otherwise close and return SOAP_TAG_MISMATCH or HTTP error code */ if (soap->error != SOAP_NO_TAG && (soap->error != SOAP_TAG_MISMATCH || soap->level != 2)) { if (soap->error == SOAP_TAG_MISMATCH && soap->level == 0) { soap->error = SOAP_OK; if (!soap_element_begin_in(soap, "fault", 0, NULL)) { char *s = NULL, *d = NULL; (void)soap_instring(soap, "reason", &s, NULL, 0, 1, 0, -1, NULL); (void)soap_inliteral(soap, "detail", &d); if (!soap_element_end_in(soap, "fault") && !soap_end_recv(soap)) { *soap_faultstring(soap) = s; *soap_faultdetail(soap) = d; if (status) soap->error = status; else soap->error = SOAP_FAULT; soap_set_fault(soap); return soap_closesock(soap); } } soap->error = SOAP_TAG_MISMATCH; } if (status && (status < 200 || status > 299)) soap->error = status; return soap_closesock(soap); } } soap->error = SOAP_OK; if (soap_getfault(soap)) { /* if check>0 and no SOAP Fault is present and no HTTP error then just return to parse request */ if (check && (status == 0 || (status >= 200 && status <= 299)) && ((soap->error == SOAP_TAG_MISMATCH && soap->level == 2) || soap->error == SOAP_NO_TAG)) return soap->error = SOAP_OK; /* if check=0 and empty SOAP Body and encodingStyle is NULL and no HTTP error then just return */ if (!check && (status == 0 || (status >= 200 && status <= 299)) && !soap->encodingStyle && (soap->error == SOAP_NO_TAG && soap->level <= 2)) return soap->error = SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error: soap_get_soapfault() failed with error %d at level %u tag '%s'\n", soap->error, soap->level, soap->tag)); *soap_faultcode(soap) = (soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client"); if (status) soap->error = status; else soap->error = status = SOAP_NO_DATA; soap_set_fault(soap); } else { 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, "Received SOAP Fault code %s\n", s)); status = SOAP_FAULT; } if (!soap_body_end_in(soap)) soap_envelope_end_in(soap); } (void)soap_end_recv(soap); soap->error = status; return soap_closesock(soap); } /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_send_empty_response(struct soap *soap, int httpstatuscode) { soap_mode m = soap->omode; if (!(m & SOAP_IO_UDP)) { soap->count = 0; if ((m & SOAP_IO) == SOAP_IO_CHUNK) soap->omode = (m & ~SOAP_IO) | SOAP_IO_BUFFER; (void)soap_response(soap, httpstatuscode); (void)soap_end_send(soap); /* force end of sends */ soap->error = SOAP_STOP; /* stops the server from returning another response */ soap->omode = m; } return soap_closesock(soap); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_recv_empty_response(struct soap *soap) { soap->error = SOAP_OK; if (!(soap->omode & SOAP_IO_UDP) && !(soap->omode & SOAP_ENC_PLAIN)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Receiving empty response\n")); if (soap_begin_recv(soap) == SOAP_OK) { if (soap_http_skip_body(soap) || soap_end_recv(soap)) return soap_closesock(soap); } else if (soap->error == 200 || soap->error == 201 || soap->error == 202) { soap->error = SOAP_OK; } } #ifndef WITH_LEANER else if ((soap->fprepareinitrecv && (soap->error = soap->fprepareinitrecv(soap))) || (soap->fpreparefinalrecv && (soap->error = soap->fpreparefinalrecv(soap)))) { return soap->error; } #endif return soap_closesock(soap); } #endif /******************************************************************************/ #ifndef WITH_NOIO static const char* soap_strerror(struct soap *soap) { int err = soap->errnum; *soap->msgbuf = '\0'; if (err) { #ifndef WIN32 # ifdef HAVE_STRERROR_R # if !defined(_GNU_SOURCE) || (!_GNU_SOURCE && ((!defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || (_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600)) || defined(__ANDROID__) || !defined(__GLIBC__)) err = strerror_r(err, soap->msgbuf, sizeof(soap->msgbuf)); /* XSI-compliant */ if (err != 0) soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), "unknown error"); # else return strerror_r(err, soap->msgbuf, sizeof(soap->msgbuf)); /* GNU-specific */ # endif # else return strerror(err); # endif #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 #endif } else { if (soap->recv_maxlength && soap->count > soap->recv_maxlength) { soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), "max message length exceeded"); } else { int tt = soap->transfer_timeout, rt = soap->recv_timeout, st = soap->send_timeout; #ifndef WITH_LEAN int tu = ' ', ru = ' ', su = ' '; #endif soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), "message transfer interrupted"); if (tt | rt || st) soap_strcpy(soap->msgbuf + 28, sizeof(soap->msgbuf) - 28, " or timed out"); #ifndef WITH_LEAN if (tt < 0) { tt = -tt; tu = 'u'; } if (rt < 0) { rt = -rt; ru = 'u'; } if (st < 0) { st = -st; su = 'u'; } if (tt) { size_t l = strlen(soap->msgbuf); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, 43), " (%d%csec max transfer time)", tt, tu); } if (rt) { size_t l = strlen(soap->msgbuf); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, 40), " (%d%csec max recv delay)", rt, ru); } if (st) { size_t l = strlen(soap->msgbuf); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, 40), " (%d%csec max send delay)", st, su); } #endif } } return soap->msgbuf; } #endif /******************************************************************************/ 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) { const char **s = soap_faultdetail(soap); if (s) *s = faultdetailXML; } return soap->error = soaperror; } /******************************************************************************/ 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->version == 1 ? "SOAP-ENV:Client" : "at sender", NULL, faultstring, faultdetailXML, soaperror); } /******************************************************************************/ 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->version == 1 ? "SOAP-ENV:Server" : "detected", NULL, faultstring, faultdetailXML, soaperror); } /******************************************************************************/ 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; DBGFUN2("soap_copy_fault", "code=%s", faultcode ? faultcode : "(null)", "string=%s", faultstring ? faultstring : "(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); } /******************************************************************************/ 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); } /******************************************************************************/ 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->version == 1 ? "SOAP-ENV:Client" : "at source", faultsubcodeQName, faultstring, faultdetailXML); } /******************************************************************************/ 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); } /******************************************************************************/ 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->version == 1 ? "SOAP-ENV:Server" : "is internal", faultsubcodeQName, faultstring, faultdetailXML); } /******************************************************************************/ #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; c = soap_faultcode(soap); if (!*c) { soap_set_fault(soap); c = soap_faultcode(soap); } if (soap->version == 2) v = soap_fault_subcode(soap); s = soap_fault_string(soap); d = soap_fault_detail(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 : "[no detail]"); } } #endif /******************************************************************************/ #ifdef __cplusplus #ifndef WITH_LEAN #ifndef WITH_NOSTDLIB #ifndef WITH_COMPAT 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; c = soap_faultcode(soap); if (!*c) { soap_set_fault(soap); c = soap_faultcode(soap); } if (soap->version == 2) v = soap_fault_subcode(soap); s = soap_fault_string(soap); d = soap_fault_detail(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 : "[no detail]") << std::endl; } } #endif #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)) { soap_strcpy(buf, len, "Error: soap struct not initialized"); } else if (soap->error) { const char **c, *v = NULL, *s, *d; c = soap_faultcode(soap); if (!*c) { soap_set_fault(soap); c = soap_faultcode(soap); } if (soap->version == 2) v = soap_fault_subcode(soap); if (!v) v = "no subcode"; s = soap_fault_string(soap); if (!s) s = "[no reason]"; d = soap_fault_detail(soap); if (!d) d = "[no detail]"; (SOAP_SNPRINTF(buf, len, strlen(*c) + strlen(v) + strlen(s) + strlen(d) + 72), "%s%d fault %s [%s]\n\"%s\"\nDetail: %s\n", soap->version ? "SOAP 1." : "Error ", soap->version ? (int)soap->version : soap->error, *c, v, s, d); } else if (len > 0) { *buf = '\0'; } return buf; } #endif #endif /******************************************************************************/ #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_check_state(soap) == SOAP_OK && soap->error && soap->error != SOAP_STOP && soap->bufidx <= soap->buflen && soap->buflen > 0 && soap->buflen <= sizeof(soap->buf)) { 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] = (char)c1; soap->buf[j] = (char)c2; } #else (void)soap; (void)fd; #endif } #endif /******************************************************************************/ #ifdef __cplusplus #ifndef WITH_LEAN #ifndef WITH_NOSTDLIB #ifndef WITH_COMPAT SOAP_FMAC1 void SOAP_FMAC2 soap_stream_fault_location(struct soap *soap, std::ostream& os) { int i, j, c1, c2; if (soap_check_state(soap) == SOAP_OK && soap->error && soap->error != SOAP_STOP && soap->bufidx <= soap->buflen && soap->buflen > 0 && soap->buflen <= sizeof(soap->buf)) { 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'; os << soap->buf << (char)c1 << std::endl << "" << std::endl; if (soap->bufidx < soap->buflen) os << soap->buf + soap->bufidx << std::endl; soap->buf[i] = (char)c1; soap->buf[j] = (char)c2; } } #endif #endif #endif #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_register_plugin_arg(struct soap *soap, int (*fcreate)(struct soap*, struct soap_plugin*, void*), void *arg) { struct soap_plugin *p; int err; p = (struct soap_plugin*)SOAP_MALLOC(soap, sizeof(struct soap_plugin)); if (!p) return soap->error = SOAP_EOM; p->id = NULL; p->data = NULL; p->fcopy = NULL; p->fdelete = NULL; err = fcreate(soap, p, arg); if (!err && p->fdelete && p->id) { if (!soap_lookup_plugin(soap, p->id)) { 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 with the same ID already registered\n", p->id)); SOAP_FREE(soap, p); return SOAP_OK; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not register plugin '%s': plugin returned error %d or plugin ID not set or fdelete callback not set\n", p->id ? p->id : "plugin ID not set", err)); SOAP_FREE(soap, p); soap->error = err ? err : SOAP_PLUGIN_ERROR; return soap->error; } /******************************************************************************/ static void * fplugin(struct soap *soap, const char *id) { 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; } /******************************************************************************/ SOAP_FMAC1 void * SOAP_FMAC2 soap_lookup_plugin(struct soap *soap, const char *id) { return soap->fplugin(soap, id); } /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************\ * * C++ soap struct methods * \******************************************************************************/ #ifdef __cplusplus soap::soap() { soap_init(this); /* no logs to prevent DEBUG mode leaks when the user calls a soap_init() on this context */ soap_set_test_logfile(this, NULL); soap_set_sent_logfile(this, NULL); soap_set_recv_logfile(this, NULL); } #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(const struct soap& soap) { soap_copy_context(this, &soap); } #endif /******************************************************************************/ #ifdef __cplusplus struct soap& soap::operator=(const struct soap& soap) { soap_done(this); soap_copy_context(this, &soap); return *this; } #endif /******************************************************************************/ #ifdef __cplusplus void soap::destroy() { soap_destroy(this); soap_end(this); } #endif /******************************************************************************/ #ifdef __cplusplus soap::~soap() { soap_done(this); } #endif /******************************************************************************/ gsoap-2.8.91/gsoap/stdsoap2.cpp0000644000175000017500000233054313525245163015660 0ustar ellertellert/* stdsoap2.c[pp] 2.8.91 gSOAP runtime engine gSOAP XML Web services tools Copyright (C) 2000-2019, 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 addition licensed under the gSOAP public license: - vxWorks compatible, enabled with compiler option -DVXWORKS -------------------------------------------------------------------------------- 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-2019, 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 -------------------------------------------------------------------------------- */ #define GSOAP_LIB_VERSION 20891 #ifdef AS400 # pragma convert(819) /* EBCDIC to ASCII */ #endif #if defined(__gnu_linux__) && !defined(_GNU_SOURCE) # define _GNU_SOURCE 1 #endif #include "stdsoap2.h" #if GSOAP_VERSION != GSOAP_LIB_VERSION # error "GSOAP VERSION MISMATCH IN LIBRARY: PLEASE REINSTALL PACKAGE" #endif #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) # include /* vxWorks compatible */ #endif #ifdef __BORLANDC__ # pragma warn -8060 #else # ifdef WIN32 # ifdef UNDER_CE # pragma comment(lib, "ws2.lib") /* WinCE */ # else # pragma comment(lib, "Ws2_32.lib") # endif # pragma warning(disable : 4996) /* disable deprecation warnings */ # endif #endif #ifdef __cplusplus SOAP_SOURCE_STAMP("@(#) stdsoap2.cpp ver 2.8.91 2019-08-15 00:00:00 GMT") extern "C" { #else SOAP_SOURCE_STAMP("@(#) stdsoap2.c ver 2.8.91 2019-08-15 00:00:00 GMT") #endif /* 8bit character representing unknown character entity or multibyte data */ #ifndef SOAP_UNKNOWN_CHAR # define SOAP_UNKNOWN_CHAR (0x7F) #endif /* unicode character representing unknown characters outside the XML 1.0 UTF8 unicode space */ #ifdef WITH_REPLACE_ILLEGAL_UTF8 # ifndef SOAP_UNKNOWN_UNICODE_CHAR # define SOAP_UNKNOWN_UNICODE_CHAR (0xFFFD) # endif #endif /* EOF=-1 */ #define SOAP_LT (soap_wchar)(-2) /* XML-specific '<' */ #define SOAP_TT (soap_wchar)(-3) /* XML-specific '' */ #define SOAP_QT (soap_wchar)(-5) /* XML-specific '"' */ #define SOAP_AP (soap_wchar)(-6) /* XML-specific ''' */ #define soap_coblank(c) ((c)+1 > 0 && (c) <= 32) #if defined(WIN32) && !defined(UNDER_CE) #define soap_hash_ptr(p) ((size_t)((PtrToUlong(p) >> 3) & (SOAP_PTRHASH - 1))) #else #define soap_hash_ptr(p) ((size_t)(((unsigned long)(p) >> 3) & (SOAP_PTRHASH-1))) #endif #ifdef SOAP_DEBUG static void soap_init_logs(struct soap*); 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 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); static void soap_version(struct soap*); static void soap_free_ns(struct soap*); static soap_wchar soap_char(struct soap*); static soap_wchar soap_getpi(struct soap*); static int soap_isxdigit(int); static void *fplugin(struct soap*, const char*); static ULONG64 soap_count_attachments(struct soap*); static int soap_try_connect_command(struct soap*, int http_command, const char *endpoint, const char *action); static int soap_init_send(struct soap*); #ifdef WITH_NTLM static int soap_ntlm_handshake(struct soap *soap, int command, const char *endpoint, const char *host, int port); #endif #ifndef WITH_NOIDREF static int soap_has_copies(struct soap*, const char*, const char*); static int soap_type_punned(struct soap*, const struct soap_ilist*); static int soap_is_shaky(struct soap*, void*); static void soap_init_iht(struct soap*); static void soap_free_iht(struct soap*); #endif static void soap_init_pht(struct soap*); static void soap_free_pht(struct soap*); #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, short isearly); static void soap_utilize_ns(struct soap *soap, const char *tag, short isearly); static const wchar_t* soap_wstring(struct soap *soap, const char *s, int flag, long minlen, long maxlen, const char *pattern); static wchar_t* soap_wcollapse(struct soap *soap, wchar_t *s, int flag, int insitu); #endif static const char* soap_string(struct soap *soap, const char *s, int flag, long minlen, long maxlen, const char *pattern); static char* soap_collapse(struct soap *soap, char *s, int flag, int insitu); static const char* soap_QName(struct soap *soap, const char *s, long minlen, long maxlen, const char *pattern); #ifndef WITH_LEANER static int soap_begin_attachments(struct soap*); static int soap_end_attachments(struct soap *soap); static struct soap_multipart *soap_alloc_multipart(struct soap*, struct soap_multipart**, struct soap_multipart**, const 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 #ifdef WITH_GZIP static int soap_getgziphdr(struct soap*); #endif #ifdef WITH_OPENSSL # ifndef SOAP_SSL_RSA_BITS # define SOAP_SSL_RSA_BITS 2048 # endif static 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 *); #endif #ifdef WITH_GNUTLS # ifndef SOAP_SSL_RSA_BITS # define SOAP_SSL_RSA_BITS 2048 # endif static int soap_ssl_init_done = 0; static int ssl_auth_init(struct soap*); static const char *ssl_verify(struct soap *soap, const char *host); # if GNUTLS_VERSION_NUMBER < 0x020b00 # if defined(HAVE_PTHREAD_H) # include /* make GNUTLS thread safe with pthreads */ GCRY_THREAD_OPTION_PTHREAD_IMPL; # elif defined(HAVE_PTH_H) #include /* make GNUTLS thread safe with PTH */ GCRY_THREAD_OPTION_PTH_IMPL; # endif # endif #endif #ifdef WITH_SYSTEMSSL static int ssl_auth_init(struct soap*); static int ssl_recv(int sk, void *s, int n, char *user); static int ssl_send(int sk, void *s, int n, char *user); #endif #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) static const char * soap_decode(char*, size_t, const char*, const char*); #endif #ifndef WITH_NOHTTP static soap_wchar soap_getchunkchar(struct soap*); static const char *http_error(struct soap*, int); static int http_get(struct soap*); static int http_put(struct soap*); static int http_patch(struct soap*); static int http_del(struct soap*); static int http_200(struct soap*); static int http_post(struct soap*, const char*, const char*, int, const char*, const char*, ULONG64); 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, ULONG64); static int http_parse(struct soap*); static int http_parse_header(struct soap*, const char*, const char*); #endif #ifndef WITH_NOIO 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*); #if !defined(WITH_IPV6) static int tcp_gethost(struct soap*, const char *addr, struct in_addr *inaddr); #endif #if !defined(WITH_IPV6) || defined(WITH_COOKIES) static int tcp_gethostbyname(struct soap*, const char *addr, struct hostent *hostent, 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_select(struct soap*, SOAP_SOCKET, int, 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*); #define SOAP_TCP_SELECT_RCV 0x1 #define SOAP_TCP_SELECT_SND 0x2 #define SOAP_TCP_SELECT_ERR 0x4 #define SOAP_TCP_SELECT_ALL 0x7 #define SOAP_TCP_SELECT_PIP 0x8 #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(__VMS) #define SOAP_SOCKBLOCK(fd) \ { \ int blocking = 0; \ ioctl(fd, FIONBIO, &blocking); \ } #define SOAP_SOCKNONBLOCK(fd) \ { \ int nonblocking = 1; \ ioctl(fd, FIONBIO, &nonblocking); \ } #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 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"; const union soap_double_nan soap_double_nan = {{0xFFFFFFFF, 0xFFFFFFFF}}; const char soap_base64o[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 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"; #ifndef WITH_LEAN static const char soap_indent[21] = "\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"; /* Alternative indentation form for SOAP_XML_INDENT with spaces instead of tabs: static const char soap_indent[41] = "\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[] = { { 100, "Continue" }, { 101, "Switching Protocols" }, { 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" }, { 422, "Unprocessable Entity" }, { 426, "Upgrade Required" }, { 428, "Precondition Required" }, { 429, "Too Many Requests" }, { 431, "Request Header Fields Too Large" }, { 500, "Internal Server Error" }, { 501, "Not Implemented" }, { 502, "Bad Gateway" }, { 503, "Service Unavailable" }, { 504, "Gateway Time-out" }, { 505, "HTTP Version not supported" }, { 511, "Network Authentication Required" }, { 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(_AIX43) || defined(TRU64) || defined(HP_UX)) && defined(HAVE_GETHOSTBYNAME_R) #ifndef h_errno extern int h_errno; #endif #endif /******************************************************************************/ #ifndef WITH_NOIO static int fsend(struct soap *soap, const char *s, size_t n) { int nwritten, err; SOAP_SOCKET sk; soap->errnum = 0; #if defined(__cplusplus) && !defined(WITH_COMPAT) if (soap->os) { soap->os->write(s, (std::streamsize)n); if (soap->os->good()) return SOAP_OK; return SOAP_EOF; } #endif sk = soap->sendsk; if (!soap_valid_socket(sk)) sk = soap->socket; while (n) { if (soap_valid_socket(sk)) { if (soap->send_timeout) { for (;;) { int r; #ifdef WITH_SELF_PIPE #ifdef WITH_OPENSSL if (soap->ssl) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL | SOAP_TCP_SELECT_PIP, soap->send_timeout); else #endif #ifdef WITH_GNUTLS if (soap->session) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL | SOAP_TCP_SELECT_PIP, soap->send_timeout); else #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL | SOAP_TCP_SELECT_PIP, soap->send_timeout); else #endif r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR | SOAP_TCP_SELECT_PIP, soap->send_timeout); if ((r & SOAP_TCP_SELECT_PIP)) /* abort if data is pending on pipe */ { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connection closed by self pipe\n")); return SOAP_EOF; } #else #ifdef WITH_OPENSSL if (soap->ssl) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL, soap->send_timeout); else #endif #ifdef WITH_GNUTLS if (soap->session) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL, soap->send_timeout); else #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) r = tcp_select(soap, sk, SOAP_TCP_SELECT_ALL, soap->send_timeout); else #endif r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->send_timeout); #endif if (r > 0) break; if (!r) return SOAP_EOF; err = soap->errnum; if (!err) return soap->error; if (err != SOAP_EAGAIN && err != SOAP_EWOULDBLOCK) return SOAP_EOF; } } #ifndef WITH_LEAN if (soap->transfer_timeout) { time_t now = time(NULL); if ((soap->transfer_timeout > 0 && difftime(now, (time_t)soap->start) > (double)soap->transfer_timeout) || (soap->transfer_timeout < 0 && difftime(now, (time_t)soap->start) > -1000000.0 * (double)soap->transfer_timeout)) 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 #ifdef WITH_GNUTLS if (soap->session) nwritten = gnutls_record_send(soap->session, s, n); else #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) { err = gsk_secure_socket_write(soap->ssl, (char*)s, n, &nwritten); if (err != GSK_OK) nwritten = 0; } else #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) { if (soap->peerlen) nwritten = sendto(sk, (char*)s, (SOAP_WINSOCKINT)n, soap->socket_flags, &soap->peer.addr, (SOAP_WINSOCKINT)soap->peerlen); else nwritten = send(sk, 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) { int udp_repeat; int udp_delay; if ((soap->connect_flags & SO_BROADCAST)) udp_repeat = 2; /* SOAP-over-UDP MULTICAST_UDP_REPEAT - 1 */ else udp_repeat = 1; /* SOAP-over-UDP UNICAST_UDP_REPEAT - 1 */ udp_delay = ((unsigned int)soap_random % 201) + 50; /* UDP_MIN_DELAY .. UDP_MAX_DELAY */ do { tcp_select(soap, sk, SOAP_TCP_SELECT_ERR, -1000 * udp_delay); if (soap->peerlen) nwritten = sendto(sk, (char*)s, (SOAP_WINSOCKINT)n, soap->socket_flags, &soap->peer.addr, (SOAP_WINSOCKINT)soap->peerlen); else nwritten = send(sk, 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); } if (nwritten < 0) { err = soap_socket_errno(sk); if (err && err != SOAP_EINTR) { soap->errnum = err; return SOAP_EOF; } nwritten = 0; /* and call write() again */ } } else #endif #if !defined(AS400) nwritten = send(sk, s, (int)n, soap->socket_flags); #else nwritten = send(sk, (void*)s, n, soap->socket_flags); #endif if (nwritten <= 0) { int r = 0; err = soap_socket_errno(sk); #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 #ifdef WITH_GNUTLS if (soap->session) { if (nwritten == GNUTLS_E_INTERRUPTED) err = SOAP_EINTR; else if (nwritten == GNUTLS_E_AGAIN) err = SOAP_EAGAIN; } #endif if (err == SOAP_EWOULDBLOCK || err == SOAP_EAGAIN) { #if defined(WITH_OPENSSL) if (soap->ssl && r == SSL_ERROR_WANT_READ) r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); else #elif defined(WITH_GNUTLS) if (soap->session && !gnutls_record_get_direction(soap->session)) r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); else #endif r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->send_timeout ? soap->send_timeout : -10000); if (!r && soap->send_timeout) return SOAP_EOF; if (r < 0) return SOAP_EOF; } 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 WMW_RPM_IO /* vxWorks compatible */ if (soap->rpmreqid) nwritten = (httpBlockPut(soap->rpmreqid, (char*)s, n) == 0) ? n : -1; else #endif #ifdef WIN32 nwritten = _write(soap->sendfd, s, (unsigned int)n); #else nwritten = write(soap->sendfd, s, (unsigned int)n); #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 /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_send_raw(struct soap *soap, const char *s, size_t n) { if (!s || !n) return SOAP_OK; #ifndef WITH_LEANER if (soap->fpreparesend && (soap->mode & SOAP_IO) != SOAP_IO_STORE && (soap->mode & SOAP_IO_LENGTH) && (soap->error = soap->fpreparesend(soap, s, n)) != SOAP_OK) return soap->error; if (soap->ffiltersend && (soap->error = soap->ffiltersend(soap, &s, &n)) != SOAP_OK) return soap->error; #endif if ((soap->mode & SOAP_IO_LENGTH)) { soap->count += n; } else if ((soap->mode & SOAP_IO)) { size_t i = sizeof(soap->buf) - soap->bufidx; while (n >= i) { (void)soap_memcpy((void*)(soap->buf + soap->bufidx), i, (const void*)s, i); soap->bufidx = sizeof(soap->buf); if (soap_flush(soap)) return soap->error; s += i; n -= i; i = sizeof(soap->buf); } (void)soap_memcpy((void*)(soap->buf + soap->bufidx), sizeof(soap->buf) - soap->bufidx, (const void*)s, n); soap->bufidx += n; } else { return soap_flush_raw(soap, s, n); } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_flush(struct soap *soap) { size_t n = soap->bufidx; if (!n) return soap->error = soap->fsend(soap, SOAP_STR_EOS, 0); /* force a zero send for HTTP GET and DELETE */ #ifndef WITH_LEANER if ((soap->mode & SOAP_IO) == SOAP_IO_STORE) { int r; if (soap->fpreparesend && (r = soap->fpreparesend(soap, soap->buf, n)) != SOAP_OK) return soap->error = r; } #endif soap->bufidx = 0; #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && soap->d_stream) { 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, sizeof(soap->buf))) return soap->error; soap->d_stream->next_out = (Byte*)soap->z_buf; soap->d_stream->avail_out = sizeof(soap->buf); } } while (soap->d_stream->avail_in); return SOAP_OK; } #endif return soap_flush_raw(soap, soap->buf, n); } /******************************************************************************/ 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) { void *t; t = soap_push_block(soap, NULL, n); if (!t) return soap->error = SOAP_EOM; (void)soap_memcpy(t, n, (const void*)s, n); return SOAP_OK; } #ifndef WITH_LEANER if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { char t[24]; (SOAP_SNPRINTF(t, sizeof(t), 20), &"\r\n%lX\r\n"[soap->chunksize ? 0 : 2], (unsigned long)n); DBGMSG(SENT, t, strlen(t)); soap->error = soap->fsend(soap, t, strlen(t)); if (soap->error) return soap->error; soap->chunksize += n; } DBGMSG(SENT, s, n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Send %u bytes to socket=%d/fd=%d\n", (unsigned int)n, (int)soap->socket, soap->sendfd)); #endif return soap->error = soap->fsend(soap, s, n); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_send(struct soap *soap, const char *s) { if (!s) return SOAP_OK; return soap_send_raw(soap, s, strlen(s)); } /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_query_send_key(struct soap *soap, const char *s) { if (!s) return SOAP_OK; if (!soap->body && soap_send_raw(soap, "&", 1)) return soap->error; soap->body = 0; (void)soap_encode_url(s, soap->msgbuf, (int)sizeof(soap->msgbuf)); /* msgbuf length is max SOAP_TMPLEN or just 1024 bytes */ return soap_send(soap, soap->msgbuf); } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_query_send_val(struct soap *soap, const char *s) { if (!s) return SOAP_OK; if (soap_send_raw(soap, "=", 1)) return soap->error; (void)soap_encode_url(s, soap->msgbuf, (int)sizeof(soap->msgbuf)); /* msgbuf length is max SOAP_TMPLEN or just 1024 bytes */ return soap_send(soap, soap->msgbuf); } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 char * SOAP_FMAC2 soap_query(struct soap *soap) { return strchr(soap->path, '?'); } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 char * SOAP_FMAC2 soap_query_key(struct soap *soap, char **s) { char *t = *s; (void)soap; if (t && *t) { *s = (char*)soap_query_decode(t, strlen(t), t + 1); return t; } return *s = NULL; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 char * SOAP_FMAC2 soap_query_val(struct soap *soap, char **s) { char *t = *s; (void)soap; if (t && *t == '=') { *s = (char*)soap_query_decode(t, strlen(t), t + 1); return t; } return NULL; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 const char * SOAP_FMAC2 soap_query_decode(char *buf, size_t len, const char *val) { const char *s; char *t; for (s = val; *s; s++) if (*s != ' ' && *s != '=') break; if (*s == '"') { t = buf; s++; while (*s && *s != '"' && --len) *t++ = *s++; *t = '\0'; do s++; while (*s && *s != '&' && *s != '='); } else { t = buf; while (*s && *s != '&' && *s != '=' && --len) { switch (*s) { case '+': *t++ = ' '; s++; break; case '\t': case '\n': case '\r': case ' ': s++; break; case '%': *t++ = ((s[1] >= 'A' ? (s[1]&0x7) + 9 : s[1] - '0') << 4) + (s[2] >= 'A' ? (s[2]&0x7) + 9 : s[2] - '0'); s += 3; break; default: *t++ = *s++; } } *t = '\0'; } return s; } #endif /******************************************************************************/ #ifndef WITH_NOIO static size_t frecv(struct soap *soap, char *s, size_t n) { int r; int retries = 100; /* max 100 retries with non-blocking sockets */ SOAP_SOCKET sk; soap->errnum = 0; #if defined(__cplusplus) && !defined(WITH_COMPAT) if (soap->is) /* recv from C++ stream */ { if (soap->is->good()) return (size_t)soap->is->read(s, (std::streamsize)n).gcount(); /* downcast to std::streamsize is OK: gcount() returns how much we got in s[] */ return 0; } #else if (soap->is) /* recv from C buffer until NUL */ { size_t l = strlen(soap->is); if (l > n) l = n; (void)soap_memcpy((void*)s, n, soap->is, l); soap->is += l; return l; } #endif sk = soap->recvsk; if (!soap_valid_socket(sk)) sk = soap->socket; if (soap_valid_socket(sk)) { for (;;) { #if defined(WITH_OPENSSL) || defined(WITH_SYSTEMSSL) int err = 0; #endif #ifdef WITH_OPENSSL if (soap->recv_timeout && !soap->ssl) /* OpenSSL: sockets are nonblocking so go ahead to read */ #else if (soap->recv_timeout) #endif { for (;;) { #ifdef WITH_SELF_PIPE r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR | SOAP_TCP_SELECT_PIP, soap->recv_timeout); if ((r & SOAP_TCP_SELECT_PIP)) /* abort if data is pending on pipe */ { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connection closed by self pipe\n")); return 0; } #else r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->recv_timeout); #endif if (r > 0) break; if (!r) return 0; r = soap->errnum; if (r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) return 0; } } #ifndef WITH_LEAN if (soap->transfer_timeout) { time_t now = time(NULL); if ((soap->transfer_timeout > 0 && difftime(now, (time_t)soap->start) > (double)soap->transfer_timeout) || (soap->transfer_timeout < 0 && difftime(now, (time_t)soap->start) > -1000000.0 * (double)soap->transfer_timeout)) 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 #ifdef WITH_GNUTLS if (soap->session) { r = (int)gnutls_record_recv(soap->session, s, n); if (r >= 0) return (size_t)r; } else #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) { err = gsk_secure_socket_read(soap->ssl, s, n, &r); if (err == GSK_OK && r > 0) return (size_t)r; if (err != GSK_OK && err != GSK_WOULD_BLOCK && err != GSK_WOULD_BLOCK_WRITE) 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(sk, s, (SOAP_WINSOCKINT)n, soap->socket_flags, &soap->peer.addr, &k); /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h, SOAP_WINSOCKINT cast is safe due to limited range of n in the engine (64K) */ soap->peerlen = (size_t)k; #ifdef WITH_IPV6 soap->ip = 0; soap->ip6[0] = 0; soap->ip6[1] = 0; soap->ip6[2] = 0; soap->ip6[3] = 0; #else soap->ip = ntohl(soap->peer.in.sin_addr.s_addr); soap->ip6[0] = 0; soap->ip6[1] = 0; soap->ip6[2] = 0xFFFF; soap->ip6[3] = soap->ip; #endif } else #endif r = recv(sk, s, (SOAP_WINSOCKINT)n, soap->socket_flags); /* SOAP_WINSOCKINT cast is safe due to limited range of n in the engine (64K) */ if (r >= 0) return (size_t)r; r = soap_socket_errno(sk); if (r != SOAP_EINTR && r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) { soap->errnum = r; return 0; } } #if defined(WITH_OPENSSL) if (soap->ssl && err == SSL_ERROR_WANT_WRITE) r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); else #elif defined(WITH_GNUTLS) if (soap->session && gnutls_record_get_direction(soap->session)) r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); else #elif defined(WITH_SYSTEMSSL) if (soap->ssl && err == GSK_WOULD_BLOCK_WRITE) r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); else #endif r = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, soap->recv_timeout ? soap->recv_timeout : 5); if (!r && soap->recv_timeout) return 0; if (r < 0) { r = soap->errnum; if (r != SOAP_EAGAIN && r != SOAP_EWOULDBLOCK) return 0; } if (retries-- <= 0) return 0; } } #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, n); #endif if (r >= 0) return (size_t)r; soap->errnum = soap_errno; return 0; #endif #endif } #endif /******************************************************************************/ #ifndef WITH_NOHTTP 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, sizeof(soap->buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket=%d/fd=%d\n", (unsigned int)soap->buflen, (int)soap->socket, soap->recvfd)); DBGMSG(RECV, soap->buf, soap->buflen); if (soap->buflen) return soap->buf[soap->bufidx++]; return EOF; } #endif /******************************************************************************/ static int soap_isxdigit(int c) { return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_recv_raw(struct soap *soap) { size_t ret; #if !defined(WITH_LEANER) || defined(WITH_ZLIB) int r; #endif #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && soap->d_stream) { if (soap->d_stream->next_out == Z_NULL) { soap->bufidx = soap->buflen = 0; return EOF; } if (soap->d_stream->avail_in || !soap->d_stream->avail_out) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflating\n")); soap->d_stream->next_out = (Byte*)soap->buf; soap->d_stream->avail_out = sizeof(soap->buf); r = inflate(soap->d_stream, Z_NO_FLUSH); if (r == Z_NEED_DICT && soap->z_dict) r = inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len); if (r == Z_OK || r == Z_STREAM_END) { soap->bufidx = 0; ret = soap->buflen = sizeof(soap->buf) - 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->d_stream->next_out = Z_NULL; } if (ret) { if (soap->count + ret < soap->count) return soap->error = SOAP_EOF; soap->count += ret; if (soap->recv_maxlength && soap->count > soap->recv_maxlength) return soap->error = SOAP_EOF; soap->z_ratio_in = (float)soap->d_stream->total_in / (float)soap->d_stream->total_out; if (soap->count > SOAP_MAXINFLATESIZE && soap->z_ratio_in < SOAP_MINDEFLATERATIO) { soap->d_stream->msg = (char*)"caught SOAP_MINDEFLATERATIO explosive decompression guard (remedy: increase SOAP_MAXINFLATESIZE and/or decrease SOAP_MINDEFLATERATIO)"; return soap->error = SOAP_ZLIB_ERROR; } DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- decompressed ----\n")); DBGMSG(RECV, soap->buf, ret); DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n----\n")); #ifndef WITH_LEANER if (soap->fpreparerecv && (r = soap->fpreparerecv(soap, soap->buf, ret)) != SOAP_OK) return soap->error = r; #endif 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; return soap->error = SOAP_ZLIB_ERROR; } } zlib_again: if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK && !soap->chunksize) { (void)soap_memcpy((void*)soap->buf, sizeof(soap->buf), (const void*)soap->z_buf, sizeof(soap->buf)); 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 (;;) { soap_wchar c; char *t, tmp[17]; if (soap->chunksize) { soap->buflen = ret = soap->frecv(soap, soap->buf, soap->chunksize > sizeof(soap->buf) ? sizeof(soap->buf) : soap->chunksize); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk: read %u bytes\n", (unsigned int)ret)); DBGMSG(RECV, soap->buf, ret); soap->bufidx = 0; if (!ret) { soap->ahead = EOF; return EOF; } soap->chunksize -= ret; break; } if (!soap->chunkbuflen) { soap->chunkbuflen = ret = soap->frecv(soap, soap->buf, sizeof(soap->buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes (chunked) from socket=%d\n", (unsigned int)ret, (int)soap->socket)); DBGMSG(RECV, soap->buf, ret); soap->bufidx = 0; if (!ret) { soap->ahead = EOF; return 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) { soap->ahead = EOF; return EOF; } } t = tmp; do { *t++ = (char)c; } while (soap_isxdigit((int)(c = soap_getchunkchar(soap))) && (size_t)(t - tmp) < sizeof(tmp)-1); while ((int)c != EOF && c != '\n') c = soap_getchunkchar(soap); if ((int)c == EOF) { soap->ahead = EOF; return EOF; } *t = '\0'; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunk size = %s (hex)\n", tmp)); soap->chunksize = (size_t)soap_strtoul(tmp, &t, 16); if (!soap->chunksize) { soap->bufidx = soap->buflen = soap->chunkbuflen = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of chunked message\n")); 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, sizeof(soap->buf)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes from socket=%d/fd=%d\n", (unsigned int)ret, (int)soap->socket, soap->recvfd)); DBGMSG(RECV, soap->buf, ret); } #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB)) { (void)soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)soap->buf, sizeof(soap->buf)); 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 = sizeof(soap->buf); r = inflate(soap->d_stream, Z_NO_FLUSH); if (r == Z_NEED_DICT && soap->z_dict) r = inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len); if (r == Z_OK || r == Z_STREAM_END) { soap->bufidx = 0; soap->z_buflen = soap->buflen; soap->buflen = sizeof(soap->buf) - 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 && r != Z_STREAM_END) 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->d_stream->next_out = Z_NULL; } soap->z_ratio_in = (float)soap->d_stream->total_in / (float)soap->d_stream->total_out; if (soap->count + ret > SOAP_MAXINFLATESIZE && soap->z_ratio_in < SOAP_MINDEFLATERATIO) { soap->d_stream->msg = (char*)"caught SOAP_MINDEFLATERATIO explosive decompression guard (remedy: increase SOAP_MAXINFLATESIZE and/or decrease SOAP_MINDEFLATERATIO)"; return soap->error = SOAP_ZLIB_ERROR; } DBGLOG(RECV, SOAP_MESSAGE(fdebug, "\n---- decompressed ----\n")); DBGMSG(RECV, soap->buf, ret); #ifndef WITH_LEANER if (soap->fpreparerecv && (r = soap->fpreparerecv(soap, soap->buf, ret)) != SOAP_OK) return soap->error = r; #endif } 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; return soap->error = SOAP_ZLIB_ERROR; } } #endif #ifndef WITH_LEANER if (soap->fpreparerecv #ifdef WITH_ZLIB && soap->zlib_in == SOAP_ZLIB_NONE #endif && (r = soap->fpreparerecv(soap, soap->buf + soap->bufidx, ret))) return soap->error = r; #endif if (ret) { if (soap->count + ret < soap->count) return EOF; soap->count += ret; if (soap->recv_maxlength && soap->count > soap->recv_maxlength) return EOF; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read count=" SOAP_ULONG_FORMAT " (+%lu)\n", soap->count, (unsigned long)ret)); return SOAP_OK; } return EOF; } /******************************************************************************/ 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 SOAP in DIME is in buffer\n")); soap->buflen = soap->dime.buflen; soap->dime.buflen = 0; soap->dime.chunksize = 0; 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; } if (!(soap->dime.flags & SOAP_DIME_CF)) return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME hdr for next SOAP in DIME 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; } if ((tmp[0] & 0xF8) != SOAP_DIME_VERSION) return soap->error = SOAP_DIME_MISMATCH; soap->dime.flags = (tmp[0] & 0x7) | (tmp[1] & 0xF0); 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 SOAP in DIME chunk (%u bytes)\n", (unsigned int)soap->dime.size)); soap->dime.chunksize = soap->dime.size; if (soap->buflen - soap->bufidx >= soap->dime.size) { if ((soap->dime.flags & SOAP_DIME_ME)) { soap->mode &= ~SOAP_ENC_DIME; } else { soap->dime.buflen = soap->buflen; soap->buflen = soap->bufidx + soap->dime.chunksize; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked SOAP in DIME (%u bytes buffered)\n", (unsigned int)soap->buflen)); } } else { soap->dime.chunksize -= soap->buflen - soap->bufidx; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked SOAP in DIME (%u bytes in chunk left)\n", (unsigned int)soap->dime.chunksize)); } return SOAP_OK; } if (soap->dime.chunksize) { if (soap_recv_raw(soap)) return EOF; if (soap->buflen - soap->bufidx >= soap->dime.chunksize) { if ((soap->dime.flags & SOAP_DIME_ME)) { soap->dime.chunksize = 0; soap->mode &= ~SOAP_ENC_DIME; } else { soap->dime.buflen = soap->buflen; soap->buflen = soap->bufidx + soap->dime.chunksize; soap->dime.chunksize = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked SOAP in DIME (%u bytes buffered)\n", (unsigned int)soap->buflen)); } } else { soap->dime.chunksize -= soap->buflen - soap->bufidx; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked SOAP in DIME (%u bytes in chunk left)\n", (unsigned int)soap->dime.chunksize)); } return SOAP_OK; } } if (soap->ffilterrecv) { int err; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Filter recverror = %d bufidx = %lu buflen = %lu\n", soap->recverror, (unsigned long)soap->bufidx, (unsigned long)soap->buflen)); if (soap->recverror) { soap->bufidx = soap->buflen = 0; } else { soap->bufidx = soap->buflen = 0; err = soap->ffilterrecv(soap, soap->buf, &soap->buflen, sizeof(soap->buf)); if (err) { if (err == SOAP_EOF) return SOAP_EOF; return soap->error = err; } if (soap->buflen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Filtered output continued %lu bytes\n", (unsigned long)soap->buflen)); return SOAP_OK; } soap->recverror = soap_recv_raw(soap); soap->buflen -= soap->bufidx; /* chunked may set bufidx > 0 to skip hex chunk length */ } while (soap->ffilterrecv) { err = soap->ffilterrecv(soap, soap->buf + soap->bufidx, &soap->buflen, sizeof(soap->buf) - soap->bufidx); if (err) { if (err == SOAP_EOF) return SOAP_EOF; return soap->error = err; } if (soap->buflen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Filtered output %lu bytes\n", (unsigned long)soap->buflen)); soap->buflen += soap->bufidx; return SOAP_OK; } if (soap->recverror) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Returning postponed error %d\n", soap->recverror)); return soap->recverror; } soap->recverror = soap_recv_raw(soap); soap->buflen -= soap->bufidx; /* chunked may set bufidx > 0 to skip hex chunk length */ } } return soap->recverror = soap_recv_raw(soap); #else return soap_recv_raw(soap); #endif } /******************************************************************************/ SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getchar(struct soap *soap) { soap_wchar c; c = soap->ahead; if (c) { if ((int)c != EOF) soap->ahead = 0; return c; } return soap_get1(soap); } /******************************************************************************/ 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; } /******************************************************************************/ SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_code_int(const struct soap_code_map *code_map, const char *str, LONG64 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; } /******************************************************************************/ 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; } /******************************************************************************/ SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_code_bits(const struct soap_code_map *code_map, const char *str) { LONG64 bits = 0; if (code_map) { while (str && *str) { const struct soap_code_map *p; for (p = code_map; p->string; p++) { size_t n = strlen(p->string); if (!strncmp(p->string, str, n) && soap_coblank((soap_wchar)str[n])) { bits |= p->code; str += n; while (*str > 0 && *str <= 32) str++; break; } } if (!p->string) return 0; } } return bits; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_list(struct soap *soap, const struct soap_code_map *code_map, long code) { char *t = soap->tmpbuf; if (code_map) { while (code_map->string) { if ((code_map->code & code)) { 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; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_binary_search_string(const char **a, int n, const char *s) { int min = 0, max = n-1; while (min <= max) { int mid = (min+max)/2; int r = strcmp(s, a[mid]); if (r < 0) max = mid - 1; else if (r > 0) min = mid + 1; else return mid; } return -1; } /******************************************************************************/ static soap_wchar soap_char(struct soap *soap) { char tmp[8]; int i; soap_wchar c; char *s = tmp; for (i = 0; i < (int)sizeof(tmp)-1; 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_wchar)soap_strtol(tmp + 2, NULL, 16); return (soap_wchar)soap_strtol(tmp + 1, NULL, 10); } 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, (LONG64)SOAP_UNKNOWN_CHAR); #else return SOAP_UNKNOWN_CHAR; /* use this to represent unknown code */ #endif } /******************************************************************************/ #ifdef WITH_LEAN 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 /******************************************************************************/ #ifdef WITH_LEAN 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 /******************************************************************************/ SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_get(struct soap *soap) { 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; c = 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_coblank(c)); if (c == '!' || c == '?' || c == '%') { 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_getpi(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; } /******************************************************************************/ static soap_wchar soap_getpi(struct soap *soap) { char buf[64]; char *s = buf; size_t i = sizeof(buf); soap_wchar c; while ((int)(c = soap_getchar(soap)) != EOF && c != '?') { if (i > 1) { if (soap_coblank(c)) c = ' '; *s++ = (char)c; i--; } } *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; } /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_move(struct soap *soap, ULONG64 n) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving " SOAP_ULONG_FORMAT " bytes forward\n", n)); for (; n; n--) if ((int)soap_getchar(soap) == EOF) return SOAP_EOF; return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 ULONG64 SOAP_FMAC2 soap_tell(struct soap *soap) { return soap->count - soap->buflen + soap->bufidx - (soap->ahead != 0); } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_pututf8(struct soap *soap, unsigned long c) { char tmp[24]; if ((c < 0x7F && c > 0x1F)) { *tmp = (char)c; return soap_send_raw(soap, tmp, 1); } #ifdef WITH_REPLACE_ILLEGAL_UTF8 if (!(c == 0x09 || c == 0x0A || c == 0x0D || (c >= 0x80 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD) || (c >= 0x10000 && c <= 0x10FFFF))) c = SOAP_UNKNOWN_UNICODE_CHAR; #endif #ifndef WITH_LEAN if (c > 0x9F) { 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 #endif (SOAP_SNPRINTF(tmp, sizeof(tmp), 20), "&#x%lX;", c); return soap_send(soap, tmp); } /******************************************************************************/ SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getutf8(struct soap *soap) { #ifdef WITH_REPLACE_ILLEGAL_UTF8 soap_wchar c, c1, c2, c3; #else soap_wchar c, c1, c2, c3, c4; #endif c = soap->ahead; if (c >= 0x80) soap->ahead = 0; else c = (soap_wchar)soap_get(soap); if (c < 0x80 || c > 0xFF || (soap->mode & SOAP_ENC_LATIN)) return c; #ifdef WITH_REPLACE_ILLEGAL_UTF8 c1 = (soap_wchar)soap_get1(soap); if (c <= 0xC1 || (c1 & 0xC0) != 0x80) { soap_revget1(soap); return SOAP_UNKNOWN_UNICODE_CHAR; } c1 &= 0x3F; if (c < 0xE0) return (((c & 0x1F) << 6) | c1); c2 = (soap_wchar)soap_get1(soap); if ((c == 0xE0 && c1 < 0x20) || (c2 & 0xC0) != 0x80) { soap_revget1(soap); return SOAP_UNKNOWN_UNICODE_CHAR; } c2 &= 0x3F; if (c < 0xF0) return (((c & 0x0F) << 12) | (c1 << 6) | c2); c3 = (soap_wchar)soap_get1(soap); if ((c == 0xF0 && c1 < 0x10) || (c == 0xF4 && c1 >= 0x10) || c >= 0xF5 || (c3 & 0xC0) != 0x80) { soap_revget1(soap); return SOAP_UNKNOWN_UNICODE_CHAR; } return (((c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | (c3 & 0x3F)); #else c1 = (soap_wchar)soap_get1(soap); if (c < 0xC0 || (c1 & 0xC0) != 0x80) { soap_revget1(soap); /* doesn't look like this is UTF-8, try continue as if ISO-8859-1 */ return c; } c1 &= 0x3F; if (c < 0xE0) return ((soap_wchar)(c & 0x1F) << 6) | c1; c2 = (soap_wchar)soap_get1(soap) & 0x3F; 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 } /******************************************************************************/ SOAP_FMAC1 size_t SOAP_FMAC2 soap_utf8len(const char *s) { size_t l = 0; while (*s) if ((*s++ & 0xC0) != 0x80) l++; return l; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_puthex(struct soap *soap, const unsigned char *s, int n) { char d[2 * SOAP_BINARY_BUFLEN], *p = d; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_s2hex(soap, s, NULL, n); if (!soap->dom->text) return soap->error; return SOAP_OK; } #endif for (; n > 0; n--) { int m = *s++; p[0] = (char)((m >> 4) + (m > 159 ? '7' : '0')); m &= 0x0F; p[1] = (char)(m + (m > 9 ? '7' : '0')); p += 2; if (p - d == sizeof(d)) { if (soap_send_raw(soap, d, sizeof(d))) return soap->error; p = d; } } if (p != d && soap_send_raw(soap, d, p - d)) return soap->error; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_gethex(struct soap *soap, int *n) { size_t l = 0; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_string_in(soap, 0, -1, -1, NULL); return (unsigned char*)soap_hex2s(soap, soap->dom->text, NULL, 0, n); } #endif #ifdef WITH_FAST soap->labidx = 0; for (;;) { char *s; 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++) { char d1, d2; 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 = NULL; l = soap->lablen + i - k; soap_unget(soap, c); if (n) *n = (int)l; if (soap->maxlength > 0 && l > (size_t)soap->maxlength) { soap->error = SOAP_LENGTH; } else { p = (unsigned char*)soap_malloc(soap, l); if (p) (void)soap_memcpy((void*)p, l, (const void*)soap->labbuf, l); } return p; } *s++ = (char)(((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0')); } l = soap->lablen; if (soap->maxlength > 0 && l > (size_t)soap->maxlength) { soap->error = SOAP_LENGTH; return NULL; } } #else if (soap_alloc_block(soap) == NULL) return NULL; for (;;) { int i; 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++) { char d1, d2; 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 (soap->maxlength > 0 && l > (size_t)soap->maxlength) { soap->error = SOAP_LENGTH; soap_end_block(soap, NULL); return NULL; } if (n) *n = (int)soap_size_block(soap, NULL, i); p = (unsigned char*)soap_save_block(soap, NULL, NULL, 0); return p; } *s++ = ((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0'); l++; } if (soap->maxlength > 0 && l > (size_t)soap->maxlength) { soap->error = SOAP_LENGTH; soap_end_block(soap, NULL); return NULL; } } #endif } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_putbase64(struct soap *soap, const unsigned char *s, int n) { char d[4 * SOAP_BINARY_BUFLEN], *p = d; if (!s) return SOAP_OK; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_s2base64(soap, s, NULL, n); if (!soap->dom->text) return soap->error; return SOAP_OK; } #endif for (; n > 2; n -= 3, s += 3) { p[0] = soap_base64o[(s[0] & 0xFC) >> 2]; p[1] = soap_base64o[((s[0] & 0x03) << 4) | ((s[1] & 0xF0) >> 4)]; p[2] = soap_base64o[((s[1] & 0x0F) << 2) | ((s[2] & 0xC0) >> 6)]; p[3] = soap_base64o[s[2] & 0x3F]; p += 4; if (p - d == sizeof(d)) { if (soap_send_raw(soap, d, sizeof(d))) return soap->error; p = d; } } if (n == 2) { p[0] = soap_base64o[(s[0] & 0xFC) >> 2]; p[1] = soap_base64o[((s[0] & 0x03) << 4) | ((s[1] & 0xF0) >> 4)]; p[2] = soap_base64o[(s[1] & 0x0F) << 2]; p[3] = '='; p += 4; } else if (n == 1) { p[0] = soap_base64o[(s[0] & 0xFC) >> 2]; p[1] = soap_base64o[(s[0] & 0x03) << 4]; p[2] = '='; p[3] = '='; p += 4; } if (p != d && soap_send_raw(soap, d, p - d)) return soap->error; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 unsigned char* SOAP_FMAC2 soap_getbase64(struct soap *soap, int *n, int malloc_flag) { size_t l = 0; (void)malloc_flag; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_string_in(soap, 0, -1, -1, NULL); return (unsigned char*)soap_base642s(soap, soap->dom->text, NULL, 0, n); } #endif #ifdef WITH_FAST soap->labidx = 0; for (;;) { size_t i, k; 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 (k > 2) { for (i = 0; i < k - 2; i += 3) { unsigned long m = 0; int j = 0; do { soap_wchar c = soap_get(soap); if (c < SOAP_AP) c &= 0x7FFFFFFF; if (c == '=' || c < 0) { unsigned char *p = NULL; 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; } l = soap->lablen + i - k; if (n) *n = (int)l; if (soap->maxlength > 0 && l > (size_t)soap->maxlength) soap->error = SOAP_LENGTH; else { p = (unsigned char*)soap_malloc(soap, l); if (p) (void)soap_memcpy((void*)p, l, (const void*)soap->labbuf, l); } if (c >= 0) { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT) continue; } 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_coblank(c + '+')) { soap->error = SOAP_TYPE; return NULL; } } while (j < 4); *s++ = (char)((m >> 16) & 0xFF); *s++ = (char)((m >> 8) & 0xFF); *s++ = (char)(m & 0xFF); } l = soap->lablen; if (soap->maxlength > 0 && l > (size_t)soap->maxlength) { soap->error = SOAP_LENGTH; return NULL; } } } #else if (soap_alloc_block(soap) == NULL) return NULL; for (;;) { int i; 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++) { unsigned long m = 0; int j = 0; do { soap_wchar c = soap_get(soap); if (c < SOAP_AP) c &= 0x7FFFFFFF; if (c == '=' || c < 0) { unsigned char *p; i *= 3; switch (j) { case 2: *s++ = (char)((m >> 4) & 0xFF); i++; l++; break; case 3: *s++ = (char)((m >> 10) & 0xFF); *s++ = (char)((m >> 2) & 0xFF); l += 2; i += 2; } if (n) *n = (int)soap_size_block(soap, NULL, i); if (soap->maxlength > 0 && l > (size_t)soap->maxlength) { soap->error = SOAP_LENGTH; soap_end_block(soap, NULL); return NULL; } p = (unsigned char*)soap_save_block(soap, NULL, NULL, 0); if (c >= 0) { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT) continue; } 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_coblank(c + '+')) { soap->error = SOAP_TYPE; return NULL; } } while (j < 4); *s++ = (char)((m >> 16) & 0xFF); *s++ = (char)((m >> 8) & 0xFF); *s++ = (char)(m & 0xFF); l += 3; } if (soap->maxlength > 0 && l > (size_t)soap->maxlength) { soap->error = SOAP_LENGTH; soap_end_block(soap, NULL); return NULL; } } #endif } /******************************************************************************/ #ifndef WITH_LEANER 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 */ short body = soap->body; /* should save type too? */ if (!soap_peek_element(soap)) { if (!soap_element_begin_in(soap, ":Include", 0, NULL)) { if (soap_attachment_forward(soap, ptr, size, id, type, options) || (soap->body && soap_element_end_in(soap, ":Include"))) return soap->error; } else if (soap->error == SOAP_TAG_MISMATCH) soap_retry(soap); else return soap->error; } soap->body = body; return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_attachment_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 /******************************************************************************/ SOAP_FMAC1 void * SOAP_FMAC2 soap_memdup(struct soap *soap, const void *s, size_t n) { void *t = NULL; if (s) { t = soap_malloc(soap, n); if (t) (void)soap_memcpy(t, n, s, n); } return t; } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_strdup(struct soap *soap, const char *s) { char *t = NULL; if (s) { size_t n = strlen(s) + 1; if (n > 0) { t = (char*)soap_malloc(soap, n); if (t) { (void)soap_memcpy((void*)t, n, (const void*)s, n); t[n - 1] = '\0'; } } } return t; } /******************************************************************************/ 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, m; while (s[n]) n++; n++; m = sizeof(wchar_t) * n; if (n > 0) { t = (wchar_t*)soap_malloc(soap, m); if (t) { (void)soap_memcpy((void*)t, m, (const void*)s, m); t[n - 1] = L'\0'; } } } return t; } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_strtrim(struct soap *soap, char *s) { (void)soap; if (s) { char *t; while ((*s >= 9 && *s <= 13) || *s == 32) s++; t = s; while (*t) t++; while (--t > s && ((*t >= 9 && *t <= 13) || *t == 32)) continue; t[1] = '\0'; } return s; } /******************************************************************************/ SOAP_FMAC1 wchar_t * SOAP_FMAC2 soap_wstrtrim(struct soap *soap, wchar_t *s) { (void)soap; if (s) { wchar_t *t; while ((*s >= 9 && *s <= 13) || *s == 32) s++; t = s; while (*t) t++; while (--t > s && ((*t >= 9 && *t <= 13) || *t == 32)) continue; t[1] = L'\0'; } return s; } /******************************************************************************/ SOAP_FMAC1 struct soap_blist* SOAP_FMAC2 soap_alloc_block(struct soap *soap) { struct soap_blist *p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New block sequence (prev=%p)\n", (void*)soap->blist)); p = (struct soap_blist*)SOAP_MALLOC(soap, sizeof(struct soap_blist)); if (!p) { soap->error = SOAP_EOM; return NULL; } p->next = soap->blist; p->head = NULL; p->size = 0; p->item = 0; soap->blist = p; return p; } /******************************************************************************/ SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block(struct soap *soap, struct soap_blist *b, size_t n) { struct soap_bhead *p; if (!b) b = soap->blist; if (!b || b->size + n < b->size || sizeof(struct soap_bhead) + n < n || (SOAP_MAXALLOCSIZE > 0 && sizeof(struct soap_bhead) + n > SOAP_MAXALLOCSIZE)) { soap->error = SOAP_EOM; return NULL; } p = (struct soap_bhead*)SOAP_MALLOC(soap, sizeof(struct soap_bhead) + n); if (!p) { soap->error = SOAP_EOM; return NULL; } p->next = b->head; b->head = p; p->size = n; b->size += n; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push block %p of %u bytes on %lu previous blocks (%lu bytes total)\n", (void*)p, (unsigned int)n, (unsigned long)b->item, (unsigned long)b->size)); b->item++; return (void*)(p + 1); /* skip block header and point to n allocated bytes */ } /******************************************************************************/ SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block_max(struct soap *soap, struct soap_blist *b, size_t n) { if (b && b->item >= soap->maxoccurs) /* restrict block array length */ { soap->error = SOAP_OCCURS; return NULL; } return soap_push_block(soap, b, n); } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_pop_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *p; if (!b) b = soap->blist; if (!b || !b->head) return; p = b->head; b->size -= p->size; b->head = p->next; b->item--; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pop block %p (%lu items of %lu bytes total)\n", (void*)p, (unsigned long)b->item, (unsigned long)b->size)); SOAP_FREE(soap, p); } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_update_pointers(struct soap *soap, const char *dst, const char *src, size_t len) { const void *start = src, *end = src + len; #ifndef WITH_LEANER struct soap_xlist *xp; #endif #ifndef WITH_NOIDREF if ((soap->version && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH)) { int i; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update pointers %p (%lu bytes) -> %p\n", (void*)src, (unsigned long)len, (void*)dst)); for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { struct soap_flist *fp; void *p, **q; if (ip->shaky) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update shaky id='%s'\n", ip->id)); if (ip->ptr && ip->ptr >= start && ip->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update ptr %p -> %p\n", ip->ptr, (void*)((const char*)ip->ptr + (dst-src)))); ip->ptr = (void*)((const char*)ip->ptr + (dst-src)); } for (q = &ip->link; q; q = (void**)p) { p = *q; if (p && p >= start && p < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Link update id='%s' %p -> %p\n", ip->id, p, (void*)((const char*)p + (dst-src)))); *q = (void*)((const char*)p + (dst-src)); } } for (q = &ip->copy; q; q = (void**)p) { p = *q; if (p && p >= start && p < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy chain update id='%s' %p -> %p\n", ip->id, p, (void*)((const char*)p + (dst-src)))); *q = (void*)((const char*)p + (dst-src)); } } for (fp = ip->flist; fp; fp = fp->next) { if (fp->ptr >= start && fp->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy list update id='%s' target type=%d %p -> %p\n", ip->id, fp->type, fp->ptr, (void*)((char*)fp->ptr + (dst-src)))); fp->ptr = (void*)((const char*)fp->ptr + (dst-src)); } } if (ip->smart && ip->smart >= start && ip->smart < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Smart shared pointer update %p -> %p\n", ip->smart, (void*)((const char*)ip->smart + (dst-src)))); ip->smart = (void*)((const char*)ip->smart + (dst-src)); } } } } } #else (void)soap; (void)start; (void)end; (void)dst; (void)src; #endif #ifndef WITH_LEANER for (xp = soap->xlist; xp; xp = xp->next) { if (xp->ptr && (void*)xp->ptr >= start && (void*)xp->ptr < end) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update attachment id='%s' %p -> %p\n", xp->id ? xp->id : SOAP_STR_EOS, (void*)xp->ptr, (void*)((char*)xp->ptr + (dst-src)))); xp->ptr = (unsigned char**)((char*)xp->ptr + (dst-src)); xp->size = (int*)((char*)xp->size + (dst-src)); xp->type = (char**)((char*)xp->type + (dst-src)); xp->options = (char**)((char*)xp->options + (dst-src)); } } #endif } /******************************************************************************/ #ifndef WITH_NOIDREF static int soap_has_copies(struct soap *soap, const char *start, const char *end) { int i; struct soap_ilist *ip = NULL; struct soap_flist *fp = NULL; 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 (fp->type == ip->type && (const char*)fp->ptr >= start && (const char*)fp->ptr < end) return SOAP_ERR; } } return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_resolve(struct soap *soap) { int i; short flag; const char *id; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded refs\n")); for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { if (ip->ptr) { void **q; struct soap_flist *fp, **fpp = &ip->flist; if (ip->spine) ip->spine[0] = ip->ptr; q = (void**)ip->link; ip->link = NULL; DBGLOG(TEST, if (q) SOAP_MESSAGE(fdebug, "Traversing link chain to resolve id='%s' type=%d\n", ip->id, ip->type)); while (q) { void *p = *q; *q = ip->ptr; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... link %p -> %p\n", (void*)q, ip->ptr)); q = (void**)p; } while ((fp = *fpp)) { if (fp->level > 0 && fp->finsert) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... insert type=%d link %p -> %p\n", fp->type, fp->ptr, ip->ptr)); if (ip->spine && fp->level <= SOAP_MAXPTRS) fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, &ip->spine[fp->level - 1], &ip->smart); else if (fp->level == 1) fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, &ip->ptr, &ip->smart); else if (fp->level <= SOAP_MAXPTRS) { int i; ip->spine = (void**)soap_malloc(soap, SOAP_MAXPTRS * sizeof(void*)); if (!ip->spine) return soap->error = SOAP_EOM; ip->spine[0] = ip->ptr; for (i = 1; i < SOAP_MAXPTRS; i++) ip->spine[i] = &ip->spine[i - 1]; fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, &ip->spine[fp->level - 1], &ip->smart); } *fpp = fp->next; SOAP_FREE(soap, fp); } else fpp = &fp->next; } } else if (*ip->id == '#') { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Missing id='%s'\n", ip->id)); soap_strcpy(soap->id, sizeof(soap->id), ip->id + 1); return soap->error = SOAP_MISSING_ID; } } } do { flag = 0; id = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution phase\n")); for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { if (ip->copy || ip->flist) { if (ip->ptr && !soap_has_copies(soap, (const char*)ip->ptr, (const char*)ip->ptr + ip->size)) { struct soap_flist *fp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving id='%s' type=%d ptr=%p size=%lu ...\n", ip->id, ip->type, ip->ptr, (unsigned long)ip->size)); if (ip->copy) { 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, (void*)q, (unsigned int)ip->size)); p = *q; (void)soap_memcpy((void*)q, ip->size, (const void*)ip->ptr, ip->size); q = (void**)p; } while (q); flag = 1; } while ((fp = ip->flist)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded data type=%d target type=%d location=%p level=%u id='%s'\n", ip->type, fp->type, ip->ptr, fp->level, ip->id)); if (fp->level == 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... copy %p -> %p (%lu bytes)\n", ip->ptr, fp->ptr, (unsigned long)ip->size)); if (fp->finsert) fp->finsert(soap, ip->type, fp->type, fp->ptr, fp->index, ip->ptr, &ip->smart); else (void)soap_memcpy((void*)fp->ptr, ip->size, (const void*)ip->ptr, ip->size); } ip->flist = fp->next; SOAP_FREE(soap, fp); flag = 1; } } else if (*ip->id == '#') id = ip->id; } } } } while (flag); if (id) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution error: forwarded data for id='%s' could not be propagated, please report this problem to the gSOAP developers\n", id)); return soap_id_nullify(soap, id); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution done\n")); return SOAP_OK; } #endif /******************************************************************************/ 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->head) { b->size -= b->head->size - n; b->head->size = n; } return b->size; } /******************************************************************************/ SOAP_FMAC1 char* SOAP_FMAC2 soap_first_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *p, *q, *r; if (!b) b = soap->blist; p = b->head; if (!p) return NULL; r = NULL; do { q = p->next; p->next = r; r = p; p = q; } while (p); b->head = r; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "First block %p\n", (void*)(r + 1))); return (char*)(r + 1); } /******************************************************************************/ SOAP_FMAC1 char* SOAP_FMAC2 soap_next_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *p; if (!b) b = soap->blist; p = b->head; if (p) { b->head = p->next; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Next block %p, deleting current block\n", (void*)(b->head ? b->head + 1 : NULL))); SOAP_FREE(soap, p); if (b->head) return (char*)(b->head + 1); } return NULL; } /******************************************************************************/ SOAP_FMAC1 size_t SOAP_FMAC2 soap_block_size(struct soap *soap, struct soap_blist *b) { if (!b) b = soap->blist; return b->head->size; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_end_block(struct soap *soap, struct soap_blist *b) { struct soap_bhead *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->head; p; p = q) { q = p->next; 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, "Restored previous block sequence\n")); #ifndef WITH_NOIDREF if (!soap->blist && ((soap->version && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH))) { int i; struct soap_ilist *ip = NULL; for (i = 0; i < SOAP_IDHASH; i++) for (ip = soap->iht[i]; ip; ip = ip->next) ip->shaky = 0; } #endif } /******************************************************************************/ SOAP_FMAC1 char* SOAP_FMAC2 soap_save_block(struct soap *soap, struct soap_blist *b, char *p, int flag) { size_t n; char *q, *s; if (!b) b = soap->blist; if (b->size) { if (!p) p = (char*)soap_malloc(soap, b->size); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Save all %lu blocks in contiguous memory space of %u bytes (%p->%p)\n", (unsigned long)b->item, (unsigned int)b->size, (void*)b->head, (void*)p)); if (p) { s = p; for (q = soap_first_block(soap, b); q; q = soap_next_block(soap, b)) { n = soap_block_size(soap, b); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy %u bytes from %p to %p\n", (unsigned int)n, (void*)q, (void*)s)); if (flag) soap_update_pointers(soap, s, q, n); (void)soap_memcpy((void*)s, n, (const void*)q, n); s += n; } } else soap->error = SOAP_EOM; } soap_end_block(soap, b); return p; } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_putsizesoffsets(struct soap *soap, const char *type, const int *size, const int *offset, int dim) { int i; const char *t = ",%d"; if (!type) return NULL; if (soap->version == 2) t = " %d"; if (soap->version != 2 && offset) { (SOAP_SNPRINTF(soap->type, sizeof(soap->type) - 1, strlen(type) + 20), "%s[%d", type, size[0] + offset[0]); for (i = 1; i < dim; i++) { size_t l = strlen(soap->type); (SOAP_SNPRINTF(soap->type + l, sizeof(soap->type) - l - 1, 20), t, size[i] + offset[i]); } } else { (SOAP_SNPRINTF(soap->type, sizeof(soap->type) - 1, strlen(type) + 20), "%s[%d", type, size[0]); for (i = 1; i < dim; i++) { size_t l = strlen(soap->type); (SOAP_SNPRINTF(soap->type + l, sizeof(soap->type) - l - 1, 20), t, size[i]); } } soap_strcat(soap->type, sizeof(soap->type), "]"); return soap->type; } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_putoffsets(struct soap *soap, const int *offset, int dim) { int i; soap->arrayOffset[0] = '\0'; if (soap->version == 1) { (SOAP_SNPRINTF(soap->arrayOffset, sizeof(soap->arrayOffset) - 1, 20), "[%d", offset[0]); for (i = 1; i < dim; i++) { size_t l = strlen(soap->arrayOffset); (SOAP_SNPRINTF(soap->arrayOffset + l, sizeof(soap->arrayOffset) - l - 1, 20), ",%d", offset[i]); } soap_strcat(soap->arrayOffset, sizeof(soap->arrayOffset), "]"); } return soap->arrayOffset; } /******************************************************************************/ SOAP_FMAC1 size_t SOAP_FMAC2 soap_size(const int *size, int dim) { int i; size_t n = 0; if (size[0] <= 0) return 0; n = (size_t)size[0]; for (i = 1; i < dim; i++) { if (size[i] <= 0) return 0; n *= (size_t)size[i]; } return (size_t)n; } /******************************************************************************/ SOAP_FMAC1 size_t SOAP_FMAC2 soap_getsizes(const char *attr, int *size, int dim) { size_t i, k, n; if (!*attr) return 0; i = strlen(attr); n = 1; do { for (; i > 0; i--) if (attr[i - 1] == '[' || attr[i - 1] == ',' || attr[i - 1] == ' ') break; n *= k = (size_t)soap_strtoul(attr + i, NULL, 10); size[--dim] = (int)k; if (n > SOAP_MAXARRAYSIZE) return 0; } while (dim > 0 && --i > 0 && attr[i] != '['); return n; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_getoffsets(const char *attr, const int *size, int *offset, int dim) { int i, j = 0; if (offset) { for (i = 0; i < dim && attr && *attr; i++) { attr++; j *= size[i]; j += offset[i] = (int)soap_strtol(attr, NULL, 10); attr = strchr(attr, ','); } } else { for (i = 0; i < dim && attr && *attr; i++) { attr++; j *= size[i]; j += (int)soap_strtol(attr, NULL, 10); attr = strchr(attr, ','); } } return j; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_getposition(const char *attr, int *pos) { int i, n; if (!*attr) return -1; n = 0; i = 1; do { pos[n++] = (int)soap_strtol(attr + i, NULL, 10); while (attr[i] && attr[i] != ',' && attr[i] != ']') i++; if (attr[i] == ',') i++; } while (n < SOAP_MAXDIMS && attr[i] && attr[i] != ']'); return n; } /******************************************************************************/ SOAP_FMAC1 struct soap_nlist * SOAP_FMAC2 soap_push_namespace(struct soap *soap, const char *id, const char *ns) { struct soap_nlist *np = NULL; struct Namespace *p; short i = -1; size_t n, k; n = strlen(id); k = strlen(ns) + 1; p = soap->local_namespaces; if (p) { for (i = 0; p->id; p++, i++) { if (p->ns && !strcmp(ns, p->ns)) break; if (p->out) { if (!strcmp(ns, p->out)) break; } else if (p->in) { if (!soap_tag_cmp(ns, p->in)) { if (SOAP_MAXALLOCSIZE <= 0 || k <= SOAP_MAXALLOCSIZE) p->out = (char*)SOAP_MALLOC(soap, k); if (p->out) soap_strcpy(p->out, k, ns); break; } } } if (!p->id) i = -1; } if (i >= 0) k = 0; if (sizeof(struct soap_nlist) + n + k > n && (SOAP_MAXALLOCSIZE <= 0 || sizeof(struct soap_nlist) + n + k <= SOAP_MAXALLOCSIZE)) np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k); if (!np) { soap->error = SOAP_EOM; return NULL; } np->next = soap->nlist; soap->nlist = np; np->level = soap->level; np->index = i; soap_strcpy((char*)np->id, n + 1, 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; soap_strcpy((char*)np->ns, k, 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 np; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_pop_namespace(struct soap *soap) { 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' level=%u\n", soap->level, np->id, np->level)); SOAP_FREE(soap, np); } soap->nlist = np; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_match_namespace(struct soap *soap, const char *id1, const char *id2, size_t n1, size_t n2) { struct soap_nlist *np = soap->nlist; const char *s; while (np && (strncmp(np->id, id1, n1) || np->id[n1])) np = np->next; if (np) { if (!(soap->mode & SOAP_XML_IGNORENS) && (n2 > 0 || !np->ns || *np->ns)) { if (np->index < 0 || ((s = soap->local_namespaces[np->index].id) && (strncmp(s, id2, n2) || (s[n2] && s[n2] != '_')))) return SOAP_NAMESPACE; } return SOAP_OK; } if (n1 == 0) return n2 == 0 || (soap->mode & SOAP_XML_IGNORENS) ? SOAP_OK : SOAP_NAMESPACE; if ((n1 == 3 && n1 == n2 && !strncmp(id1, "xml", 3) && !strncmp(id1, id2, 3)) || (soap->mode & SOAP_XML_IGNORENS)) return SOAP_OK; return soap->error = SOAP_SYNTAX_ERROR; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_current_namespace_tag(struct soap *soap, const char *tag) { struct soap_nlist *np; const char *s; if (!tag || !strncmp(tag, "xml", 3)) return NULL; np = soap->nlist; s = strchr(tag, ':'); if (!s) { 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) { s = np->ns; if (*s) return soap_strdup(soap, s); do np = np->next; while (np && *np->id); /* find if there is any other default namespace */ if (np) return soap_strdup(soap, s); } } return NULL; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_current_namespace_att(struct soap *soap, const char *tag) { struct soap_nlist *np; const char *s; if (!tag || !strncmp(tag, "xml", 3)) return NULL; s = strchr(tag, ':'); if (!s) return NULL; np = soap->nlist; 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 && *np->ns) return soap_strdup(soap, np->ns); } return NULL; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_tag_cmp(const char *s, const char *t) { const char *a = NULL; const char *b = NULL; for (;;) { int c1 = *s; int c2 = *t; if (!c1 || c1 == '"') break; if (c2 != '-') { if (c1 < c2) { if (c1 >= 'A' && c1 <= 'Z') c1 += 'a' - 'A'; } else if (c1 > c2) { if (c2 >= 'A' && c2 <= 'Z') c2 += 'a' - 'A'; } if (c2 == '*') { c2 = *++t; if (!c2) return 0; a = s; b = t; continue; } if (c1 != c2) { if (!a) return 1; s = ++a; t = b; continue; } } s++; t++; } if (*t == '*' && !t[1]) return 0; return *t; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_match_tag(struct soap *soap, const char *tag1, const char *tag2) { const char *s, *t; 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; if (t != tag2 && !(soap->mode & SOAP_XML_IGNORENS)) { err = soap_match_namespace(soap, tag1, tag2, s - tag1, t - tag2); if (err) { 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 (!t[1]) { if ((soap->mode & SOAP_XML_IGNORENS) || soap_match_namespace(soap, tag1, tag2, 0, t - tag2)) return SOAP_TAG_MISMATCH; } 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); if (err) { 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->mode & SOAP_XML_IGNORENS) || SOAP_STRCMP(s + 1, tag2)) /* always fails (except when ignoring ns) */ return SOAP_TAG_MISMATCH; } else if (SOAP_STRCMP(tag1, tag2) #ifndef WITH_NOEMPTYNAMESPACES || ((soap->mode & SOAP_XML_STRICT) && !(soap->mode & SOAP_XML_IGNORENS) && soap_match_namespace(soap, tag1, tag2, 0, 0)) /* strict checking: default namespace must be null namespace */ #endif ) { return SOAP_TAG_MISMATCH; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags match: '%s' '%s'\n", tag1, tag2)); return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_match_att(struct soap *soap, const char *tag1, const char *tag2) { const char *s, *t; 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; if (t != tag2 && !(soap->mode & SOAP_XML_IGNORENS)) { err = soap_match_namespace(soap, tag1, tag2, s - tag1, t - tag2); if (err) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Atts '%s' and '%s' match but namespaces differ\n", tag1, tag2)); if (err == SOAP_NAMESPACE) return SOAP_TAG_MISMATCH; return err; } } } else if (!t[1] || t != tag2 || SOAP_STRCMP(tag1, t + 1)) return SOAP_TAG_MISMATCH; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Atts and (default) namespaces match: '%s' '%s'\n", tag1, tag2)); return SOAP_OK; } if (s) { if (!(soap->mode & SOAP_XML_IGNORENS) || SOAP_STRCMP(s + 1, tag2)) /* always fails (except when ignoring ns) */ return SOAP_TAG_MISMATCH; } else if (SOAP_STRCMP(tag1, tag2)) return SOAP_TAG_MISMATCH; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Atts match: '%s' '%s'\n", tag1, tag2)); return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_match_array(struct soap *soap, const char *type) { if (type && *soap->arrayType) { if (soap->version == 1 || !strchr(type, '[')) { 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, "SOAP array type mismatch: '%s' '%s'\n", soap->arrayType, type)); return SOAP_TAG_MISMATCH; } } } return SOAP_OK; } /******************************************************************************\ * * SSL/TLS * \******************************************************************************/ #ifdef WITH_OPENSSL SOAP_FMAC1 int SOAP_FMAC2 soap_rand() { int r; if (!soap_ssl_init_done) soap_ssl_init(); #if OPENSSL_VERSION_NUMBER < 0x10100000L RAND_pseudo_bytes((unsigned char*)&r, sizeof(int)); #else RAND_bytes((unsigned char*)&r, sizeof(int)); #endif return r; } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) SOAP_FMAC1 int SOAP_FMAC2 #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid) #else 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) #endif { int err; soap->keyfile = keyfile; #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap->keyid = keyid; /* vxWorks compatible */ #endif soap->password = password; soap->cafile = cafile; soap->capath = capath; #ifdef WITH_OPENSSL soap->dhfile = dhfile; soap->randfile = randfile; if (!soap->fsslverify) soap->fsslverify = ssl_verify_callback; #endif soap->ssl_flags = flags | (dhfile == NULL ? SOAP_SSL_RSA : 0); #ifdef WITH_GNUTLS (void)randfile; (void)sid; if (dhfile) { char *s; int n = (int)soap_strtoul(dhfile, &s, 10); if (!soap->dh_params) gnutls_dh_params_init(&soap->dh_params); /* if dhfile is numeric, treat it as a key length to generate DH params which can take a while */ if (n >= 512 && s && *s == '\0') gnutls_dh_params_generate2(soap->dh_params, (unsigned int)n); else { unsigned int dparams_len; unsigned char dparams_buf[1024]; FILE *fd = fopen(dhfile, "r"); if (!fd) return soap_set_receiver_error(soap, "SSL/TLS error", "Invalid DH file", SOAP_SSL_ERROR); dparams_len = (unsigned int)fread(dparams_buf, 1, sizeof(dparams_buf), fd); fclose(fd); gnutls_datum_t dparams = { dparams_buf, dparams_len }; if (gnutls_dh_params_import_pkcs3(soap->dh_params, &dparams, GNUTLS_X509_FMT_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Invalid DH file", SOAP_SSL_ERROR); } } else { #if GNUTLS_VERSION_NUMBER < 0x030300 if (!soap->rsa_params) gnutls_rsa_params_init(&soap->rsa_params); gnutls_rsa_params_generate2(soap->rsa_params, SOAP_SSL_RSA_BITS); #endif } if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } #endif #ifdef WITH_SYSTEMSSL (void)randfile; (void)sid; if (soap->ctx) gsk_environment_close(&soap->ctx); #endif err = soap->fsslauth(soap); #ifdef WITH_OPENSSL if (!err) { if (sid) SSL_CTX_set_session_id_context(soap->ctx, (unsigned char*)sid, (unsigned int)strlen(sid)); else SSL_CTX_set_session_cache_mode(soap->ctx, SSL_SESS_CACHE_OFF); } #endif return err; } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) SOAP_FMAC1 int SOAP_FMAC2 #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *randfile) #else 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) #endif { soap->keyfile = keyfile; #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) soap->keyid = keyid; /* vxWorks compatible */ #endif soap->password = password; soap->cafile = cafile; soap->capath = capath; soap->ssl_flags = SOAP_SSL_CLIENT | flags; #ifdef WITH_OPENSSL soap->dhfile = NULL; soap->randfile = randfile; if (!soap->fsslverify) soap->fsslverify = (flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) == 0 ? ssl_verify_callback : ssl_verify_callback_allow_expired_certificate; #endif #ifdef WITH_GNUTLS (void)randfile; if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } #endif #ifdef WITH_SYSTEMSSL (void)randfile; if (soap->ctx) gsk_environment_close(&soap->ctx); #endif return soap->fsslauth(soap); } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_crl(struct soap *soap, const char *crlfile) { #ifdef WITH_OPENSSL if (crlfile && soap->ctx) { #if OPENSSL_VERSION_NUMBER > 0x00907000L X509_STORE *store = SSL_CTX_get_cert_store(soap->ctx); if (*crlfile) { int ret; X509_LOOKUP *lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file()); if (!lookup) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't create X509_LOOKUP object", SOAP_SSL_ERROR); ret = X509_load_crl_file(lookup, crlfile, X509_FILETYPE_PEM); if (ret <= 0) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CRL PEM file", SOAP_SSL_ERROR); } X509_STORE_set_flags(store, X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL); #endif } else soap->crlfile = crlfile; /* activate later when store is available */ #endif #ifdef WITH_GNUTLS if (crlfile && soap->xcred) { if (*crlfile) if (gnutls_certificate_set_x509_crl_file(soap->xcred, crlfile, GNUTLS_X509_FMT_PEM) < 0) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CRL PEM file", SOAP_SSL_ERROR); } else { soap->crlfile = crlfile; /* activate later when xcred is available */ } #endif return SOAP_OK; } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) SOAP_FMAC1 void SOAP_FMAC2 soap_ssl_init() { /* Note: for multi-threaded applications, the main program should call soap_ssl_init() before any threads are started */ if (!soap_ssl_init_done) { soap_ssl_init_done = 1; #ifdef WITH_OPENSSL SSL_library_init(); OpenSSL_add_all_algorithms(); /* we keep ciphers and digests for the program's lifetime */ #ifndef WITH_LEAN SSL_load_error_strings(); #endif #if !defined(WIN32) && !defined(CYGWIN) && !defined(__MINGW32__) && !defined(__MINGW64__) if (!RAND_load_file("/dev/urandom", 1024)) #else if (1) #endif { /* if /dev/urandom does not exist we need to do at least some pertubations to seed the OpenSSL PRNG */ char buf[1024]; RAND_seed(buf, sizeof(buf)); #ifdef HAVE_RANDOM srandom((unsigned long)time(NULL)); #else srand((unsigned int)time(NULL)); #endif do { #ifdef HAVE_RANDOM long r = random(); /* we actually do no use random() anywhere, except to help seed the OpenSSL PRNG */ RAND_seed(&r, sizeof(long)); #else int r = rand(); /* we actually do no use rand() anywhere, except to help seed the OpenSSL PRNG */ RAND_seed(&r, sizeof(int)); #endif } while (!RAND_status()); } #endif #ifdef WITH_GNUTLS # if GNUTLS_VERSION_NUMBER < 0x020b00 # if defined(HAVE_PTHREAD_H) gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread); # elif defined(HAVE_PTH_H) gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pth); # endif gcry_control(GCRYCTL_ENABLE_QUICK_RANDOM, 0); gcry_control(GCRYCTL_DISABLE_SECMEM, 0); gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); /* libgcrypt init done */ # endif # if GNUTLS_VERSION_NUMBER < 0x030300 gnutls_global_init(); # endif #endif } } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) SOAP_FMAC1 void SOAP_FMAC2 soap_ssl_noinit() { /* Call this first to bypass SSL init is SSL is already initialized elsewhere */ soap_ssl_init_done = 1; } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) SOAP_FMAC1 const char * SOAP_FMAC2 soap_ssl_error(struct soap *soap, int ret, int err) { #ifdef WITH_OPENSSL const char *msg = soap_code_str(h_ssl_error_codes, err); if (!msg) return ERR_error_string(err, soap->msgbuf); (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(msg) + 1), "%s\n", msg); if (ERR_peek_error()) { unsigned long r; while ((r = ERR_get_error())) { size_t l = strlen(soap->msgbuf); ERR_error_string_n(r, soap->msgbuf + l, sizeof(soap->msgbuf) - l); l = strlen(soap->msgbuf); if (l + 1 < sizeof(soap->msgbuf)) { soap->msgbuf[l++] = '\n'; soap->msgbuf[l] = '\0'; } if (ERR_GET_REASON(r) == SSL_R_CERTIFICATE_VERIFY_FAILED && l < sizeof(soap->msgbuf)) { const char *s = X509_verify_cert_error_string(SSL_get_verify_result(soap->ssl)); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, strlen(s)), "%s", s); } } } else { size_t l = strlen(soap->msgbuf); switch (ret) { case 0: soap_strcpy(soap->msgbuf + l, sizeof(soap->msgbuf) - l, "EOF was observed that violates the SSL/TLS protocol. The client probably provided invalid authentication information."); break; case -1: { const char *s = strerror(soap_errno); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, strlen(s) + 42), "Error observed by underlying SSL/TLS BIO: %s", s); } break; } } ERR_clear_error(); return soap->msgbuf; #endif #ifdef WITH_GNUTLS (void)soap; (void)err; return gnutls_strerror(ret); #endif } #endif /******************************************************************************/ #ifdef WITH_SYSTEMSSL static int ssl_recv(int sk, void *s, int n, char *user) { (void)user; return recv(sk, s, n, 0); } #endif /******************************************************************************/ #ifdef WITH_SYSTEMSSL static int ssl_send(int sk, void *s, int n, char *user) { (void)user; return send(sk, s, n, 0); } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) static int ssl_auth_init(struct soap *soap) { #ifdef WITH_OPENSSL #if OPENSSL_VERSION_NUMBER >= 0x10101000L int minv = 0, maxv = 0; #endif long flags = SSL_OP_ALL; int mode; #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) EVP_PKEY* pkey; /* vxWorks compatible */ #endif if (!soap_ssl_init_done) soap_ssl_init(); ERR_clear_error(); if (!soap->ctx) { #if OPENSSL_VERSION_NUMBER >= 0x10100000L /* TLS_method: a TLS/SSL connection established may understand the SSLv3, TLSv1, TLSv1.1 and TLSv1.2 protocols. */ soap->ctx = SSL_CTX_new(TLS_method()); #else /* SSLv23_method: a TLS/SSL connection established may understand the SSLv3, TLSv1, TLSv1.1 and TLSv1.2 protocols. */ soap->ctx = SSL_CTX_new(SSLv23_method()); #endif if (!soap->ctx) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't setup context", SOAP_SSL_ERROR); /* The following alters the behavior of SSL read/write: */ #if 0 SSL_CTX_set_mode(soap->ctx, SSL_MODE_ENABLE_PARTIAL_WRITE | SSL_MODE_AUTO_RETRY); #endif } if (soap->randfile) { if (!RAND_load_file(soap->randfile, -1)) return soap_set_receiver_error(soap, "SSL/TLS 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/TLS error", "Can't read CA PEM file", 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/TLS error", "Can't read default CA PEM file and/or directory", SOAP_SSL_ERROR); } if (soap->crlfile) { if (soap_ssl_crl(soap, soap->crlfile)) return soap->error; } /* This code assumes a typical scenario with key and cert in one PEM file, see alternative code below */ #if 1 if (soap->keyfile) { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't find or read certificate in private key PEM 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); } #ifndef WM_SECURE_KEY_STORAGE if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read private key PEM file", SOAP_SSL_ERROR); #endif } #else /* Suggested alternative approach to check the key file for cert only when 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) { if (soap->keyfile) { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't find or read certificate in private key PEM file", SOAP_SSL_ERROR); if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read private key PEM file", SOAP_SSL_ERROR); } } else /* use cafile for (server) cert and keyfile for (server) key */ { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->cafile)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CA PEM file", SOAP_SSL_ERROR); if (soap->keyfile) if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read private key PEM file", SOAP_SSL_ERROR); } #endif #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) /* vxWorks compatible */ pkey = ipcom_key_db_pkey_get(soap->keyid); if (!pkey) return soap_set_receiver_error(soap, "SSL error", "Can't find key", SOAP_SSL_ERROR); if (!SSL_CTX_use_PrivateKey(soap->ctx, pkey)) return soap_set_receiver_error(soap, "SSL error", "Can't read key", SOAP_SSL_ERROR); #endif if ((soap->ssl_flags & SOAP_SSL_RSA)) { #if OPENSSL_VERSION_NUMBER >= 0x10002000L if (SSL_CTX_need_tmp_RSA(soap->ctx)) { unsigned long e = RSA_F4; BIGNUM *bne = BN_new(); RSA *rsa = RSA_new(); if (!bne || !rsa || !BN_set_word(bne, e) || !RSA_generate_key_ex(rsa, SOAP_SSL_RSA_BITS, bne, NULL) || !SSL_CTX_set_tmp_rsa(soap->ctx, rsa)) { if (bne) BN_free(bne); if (rsa) RSA_free(rsa); return soap_set_receiver_error(soap, "SSL/TLS error", "Can't generate RSA key", SOAP_SSL_ERROR); } BN_free(bne); RSA_free(rsa); } #else RSA *rsa = RSA_generate_key(SOAP_SSL_RSA_BITS, RSA_F4, NULL, NULL); if (!rsa || !SSL_CTX_set_tmp_rsa(soap->ctx, rsa)) { if (rsa) RSA_free(rsa); return soap_set_receiver_error(soap, "SSL/TLS error", "Can't generate RSA key", SOAP_SSL_ERROR); } RSA_free(rsa); #endif } else if (soap->dhfile) { DH *dh = NULL; char *s; int n = (int)soap_strtoul(soap->dhfile, &s, 10); /* if dhfile is numeric, treat it as a key length to generate DH params which can take a while */ if (n >= 512 && s && *s == '\0') { #if OPENSSL_VERSION_NUMBER >= 0x10002000L dh = DH_new(); if (!DH_generate_parameters_ex(dh, n, 2/*or 5*/, NULL)) { DH_free(dh); return soap_set_receiver_error(soap, "SSL/TLS error", "Can't generate DH parameters", SOAP_SSL_ERROR); } #elif defined(VXWORKS) dh = DH_new(); DH_generate_parameters_ex(dh, n, 2/*or 5*/, NULL); #else dh = DH_generate_parameters(n, 2/*or 5*/, NULL, NULL); #endif } else { BIO *bio; bio = BIO_new_file(soap->dhfile, "r"); if (!bio) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read DH PEM file", SOAP_SSL_ERROR); dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL); BIO_free(bio); } if (!dh || DH_check(dh, &n) != 1 || SSL_CTX_set_tmp_dh(soap->ctx, dh) < 0) { if (dh) DH_free(dh); return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set DH parameters", SOAP_SSL_ERROR); } DH_free(dh); } /* enable all TSLv1 protocols and disable SSLv3 by default if no SSL/TLS flags are set */ if ((soap->ssl_flags & SOAP_SSLv3_TLSv1) == 0) soap->ssl_flags |= SOAP_TLSv1; #if OPENSSL_VERSION_NUMBER >= 0x10101000L if ((soap->ssl_flags & SOAP_SSLv3)) minv = SSL3_VERSION; else if ((soap->ssl_flags & SOAP_TLSv1_0)) minv = TLS1_VERSION; else if ((soap->ssl_flags & SOAP_TLSv1_1)) minv = TLS1_1_VERSION; else if ((soap->ssl_flags & SOAP_TLSv1_2)) minv = TLS1_2_VERSION; else if ((soap->ssl_flags & SOAP_TLSv1_3)) minv = TLS1_3_VERSION; if ((soap->ssl_flags & SOAP_TLSv1_3) && OpenSSL_version_num() >= 0x10101000L) maxv = TLS1_3_VERSION; else if ((soap->ssl_flags & SOAP_TLSv1_2)) maxv = TLS1_2_VERSION; else if ((soap->ssl_flags & SOAP_TLSv1_1)) maxv = TLS1_1_VERSION; else if ((soap->ssl_flags & SOAP_TLSv1_0)) maxv = TLS1_VERSION; else maxv = SSL3_VERSION; if (!SSL_CTX_set_min_proto_version(soap->ctx, minv) || !SSL_CTX_set_max_proto_version(soap->ctx, maxv)) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set protocol version", SOAP_SSL_ERROR); #else /* disable SSL v2 by default and enable specific protos */ flags = SSL_OP_NO_SSLv2; if (!(soap->ssl_flags & SOAP_SSLv3)) flags |= SSL_OP_NO_SSLv3; #if OPENSSL_VERSION_NUMBER >= 0x10001000L if (!(soap->ssl_flags & SOAP_TLSv1_0)) flags |= SSL_OP_NO_TLSv1; if (!(soap->ssl_flags & SOAP_TLSv1_1)) flags |= SSL_OP_NO_TLSv1_1; if (!(soap->ssl_flags & SOAP_TLSv1_2)) flags |= SSL_OP_NO_TLSv1_2; #endif #endif #ifdef SSL_OP_NO_TICKET /* TLS extension is enabled by default in OPENSSL v0.9.8k disable it by */ flags |= SSL_OP_NO_TICKET; #endif 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 #endif #ifdef WITH_GNUTLS int ret; char priority[80]; soap_strcpy(priority, sizeof(priority), "PERFORMANCE"); if (!soap_ssl_init_done) soap_ssl_init(); if (!soap->xcred) { if (gnutls_certificate_allocate_credentials(&soap->xcred) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't allocate credentials or trust", SOAP_SSL_ERROR); #if GNUTLS_VERSION_NUMBER >= 0x030300 gnutls_certificate_set_x509_system_trust(soap->xcred); #endif if (soap->cafile) { if (gnutls_certificate_set_x509_trust_file(soap->xcred, soap->cafile, GNUTLS_X509_FMT_PEM) < 0) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read CA PEM file", SOAP_SSL_ERROR); } if (soap->crlfile) { if (soap_ssl_crl(soap, soap->crlfile)) return soap->error; } if (soap->keyfile) { if (gnutls_certificate_set_x509_key_file2(soap->xcred, soap->keyfile, soap->keyfile, GNUTLS_X509_FMT_PEM, soap->password, GNUTLS_PKCS_PKCS12_3DES | GNUTLS_PKCS_PKCS12_ARCFOUR | GNUTLS_PKCS_PKCS12_RC2_40 | GNUTLS_PKCS_PBES2_AES_128 | GNUTLS_PKCS_PBES2_AES_192 | GNUTLS_PKCS_PBES2_AES_256 | GNUTLS_PKCS_PBES2_DES) < 0) /* Assumes that key and cert(s) are concatenated in the keyfile and the key is encrypted with one of these algorithms */ return soap_set_receiver_error(soap, "SSL/TLS error", "Can't read private key PEM file", SOAP_SSL_ERROR); } } if ((soap->ssl_flags & SOAP_SSL_CLIENT)) { gnutls_init(&soap->session, GNUTLS_CLIENT); if (soap->cafile || soap->crlfile || soap->keyfile) { ret = gnutls_priority_set_direct(soap->session, "PERFORMANCE", NULL); if (ret != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, soap_ssl_error(soap, ret, 0), "SSL/TLS set priority error", SOAP_SSL_ERROR); gnutls_credentials_set(soap->session, GNUTLS_CRD_CERTIFICATE, soap->xcred); } else { if (!soap->acred) gnutls_anon_allocate_client_credentials(&soap->acred); ret = gnutls_priority_set_direct(soap->session, "PERFORMANCE:+ANON-DH:!ARCFOUR-128", NULL); if (ret != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, soap_ssl_error(soap, ret, 0), "SSL/TLS set priority error", SOAP_SSL_ERROR); gnutls_credentials_set(soap->session, GNUTLS_CRD_ANON, soap->acred); } } else if (!soap->keyfile) { return soap_set_receiver_error(soap, "SSL/TLS error", "No key file: anonymous server authentication not supported in this release", SOAP_SSL_ERROR); } else { #if GNUTLS_VERSION_NUMBER < 0x030300 int protocol_priority[] = { 0, 0, 0, 0, 0 }; int *protocol = protocol_priority; if ((soap->ssl_flags & SOAP_SSL_RSA) && soap->rsa_params) gnutls_certificate_set_rsa_export_params(soap->xcred, soap->rsa_params); #endif if (!(soap->ssl_flags & SOAP_SSL_RSA) && soap->dh_params) gnutls_certificate_set_dh_params(soap->xcred, soap->dh_params); if (!soap->cache) gnutls_priority_init(&soap->cache, "NORMAL", NULL); gnutls_init(&soap->session, GNUTLS_SERVER); gnutls_priority_set(soap->session, soap->cache); gnutls_credentials_set(soap->session, GNUTLS_CRD_CERTIFICATE, soap->xcred); if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) gnutls_certificate_server_set_request(soap->session, GNUTLS_CERT_REQUEST); gnutls_session_enable_compatibility_mode(soap->session); /* enable all TSLv1 protocols and disable SSLv3 by default if no SSL/TLS flags are set */ if ((soap->ssl_flags & SOAP_SSLv3_TLSv1) == 0) soap->ssl_flags |= SOAP_TLSv1; #if GNUTLS_VERSION_NUMBER < 0x030300 if ((soap->ssl_flags & SOAP_SSLv3)) *protocol++ = GNUTLS_SSL3; if ((soap->ssl_flags & SOAP_TLSv1_0)) *protocol++ = GNUTLS_TLS1_0; if ((soap->ssl_flags & SOAP_TLSv1_1)) *protocol++ = GNUTLS_TLS1_1; if ((soap->ssl_flags & SOAP_TLSv1_2)) *protocol++ = GNUTLS_TLS1_2; if (gnutls_protocol_set_priority(soap->session, protocol_priority) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set protocol", SOAP_SSL_ERROR); #else soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "NORMAL:+VERS-ALL"); if (!(soap->ssl_flags & SOAP_TLSv1_0)) soap_strcat(soap->tmpbuf, sizeof(soap->tmpbuf), ":-VERS-TLS1.0"); if (!(soap->ssl_flags & SOAP_TLSv1_1)) soap_strcat(soap->tmpbuf, sizeof(soap->tmpbuf), ":-VERS-TLS1.1"); if (!(soap->ssl_flags & SOAP_TLSv1_2)) soap_strcat(soap->tmpbuf, sizeof(soap->tmpbuf), ":-VERS-TLS1.2"); if (gnutls_priority_set_direct(soap->session, soap->tmpbuf, NULL) != GNUTLS_E_SUCCESS) return soap_set_receiver_error(soap, "SSL/TLS error", "Can't set protocol priority", SOAP_SSL_ERROR); #endif } #endif #ifdef WITH_SYSTEMSSL if (!soap->ctx) { int err; err = gsk_environment_open(&soap->ctx); if (err == GSK_OK) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_SSLV2, GSK_PROTOCOL_SSLV2_OFF); /* enable all TSLv1 protocols and disable SSLv3 by default if no SSL/TLS flags are set */ if ((soap->ssl_flags & SOAP_SSLv3_TLSv1) == 0) soap->ssl_flags |= SOAP_TLSv1; if (err == GSK_OK) { if ((soap->ssl_flags & SOAP_SSLv3)) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_SSLV3, GSK_PROTOCOL_SSLV3_ON); else err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_SSLV3, GSK_PROTOCOL_SSLV3_OFF); } if (err == GSK_OK) { if ((soap->ssl_flags & SOAP_TLSv1_0)) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_ON); else err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_OFF); } if (err == GSK_OK) { if ((soap->ssl_flags & SOAP_TLSv1_1)) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_1_ON); else err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_1_OFF); } if (err == GSK_OK) { if ((soap->ssl_flags & SOAP_TLSv1_2)) err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_2_ON); else err = gsk_attribute_set_enum(soap->ctx, GSK_PROTOCOL_TLSV1, GSK_PROTOCOL_TLSV1_2_OFF); } if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ctx, GSK_KEYRING_FILE, soap->keyfile, 0); /* keyfile is a keyring .kdb file */ if (err == GSK_OK) err = gsk_attribute_set_buffer(soap->ctx, GSK_KEYRING_PW, soap->password, 0); /* locked by password */ if (err == GSK_OK) err = gsk_environment_init(soap->ctx); if (err != GSK_OK) return soap_set_receiver_error(soap, gsk_strerror(err), "SYSTEM SSL error in ssl_auth_init()", SOAP_SSL_ERROR); } #endif return SOAP_OK; } #endif /******************************************************************************/ #ifdef WITH_OPENSSL static int ssl_password(char *buf, int num, int rwflag, void *userdata) { (void)rwflag; if (!buf || !userdata) return 0; soap_strcpy(buf, (size_t)num, (char*)userdata); return (int)strlen(buf); } #endif /******************************************************************************/ #ifdef WITH_OPENSSL static int ssl_verify_callback(int ok, X509_STORE_CTX *store) { (void)store; #ifdef SOAP_DEBUG if (!ok) { char buf[1024]; int err = X509_STORE_CTX_get_error(store); X509 *cert = X509_STORE_CTX_get_current_cert(store); fprintf(stderr, "\nDEBUG mode TLS/SSL warnings:\nSSL verify error %d or warning with certificate at depth %d: %s\n", err, X509_STORE_CTX_get_error_depth(store), X509_verify_cert_error_string(err)); X509_NAME_oneline(X509_get_issuer_name(cert), buf, sizeof(buf)-1); fprintf(stderr, " certificate issuer: %s\n", buf); X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)-1); fprintf(stderr, " certificate subject: %s\n", buf); /* accept self-signed certificates and certificates out of date */ switch (err) { case X509_V_ERR_CERT_NOT_YET_VALID: case X509_V_ERR_CERT_HAS_EXPIRED: case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: case X509_V_ERR_UNABLE_TO_GET_CRL: case X509_V_ERR_CRL_NOT_YET_VALID: case X509_V_ERR_CRL_HAS_EXPIRED: X509_STORE_CTX_set_error(store, X509_V_OK); ok = 1; fprintf(stderr, "Initialize soap_ssl_client_context with SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE to allow this verification error to pass without DEBUG mode enabled\n"); } } #endif /* Note: return 1 to try to continue, but unsafe progress will be terminated by OpenSSL */ return ok; } #endif /******************************************************************************/ #ifdef WITH_OPENSSL static int ssl_verify_callback_allow_expired_certificate(int ok, X509_STORE_CTX *store) { ok = ssl_verify_callback(ok, store); if (!ok) { /* accept self signed certificates, expired certificates, and certficiates w/o CRL */ switch (X509_STORE_CTX_get_error(store)) { case X509_V_ERR_CERT_NOT_YET_VALID: case X509_V_ERR_CERT_HAS_EXPIRED: case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: case X509_V_ERR_UNABLE_TO_GET_CRL: case X509_V_ERR_CRL_NOT_YET_VALID: case X509_V_ERR_CRL_HAS_EXPIRED: 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 /******************************************************************************/ #ifdef WITH_GNUTLS static const char * ssl_verify(struct soap *soap, const char *host) { unsigned int status; const char *err = NULL; int r = gnutls_certificate_verify_peers2(soap->session, &status); if (r < 0) err = "Certificate verify error"; else if ((status & GNUTLS_CERT_INVALID)) err = "The certificate is not trusted"; else if ((status & GNUTLS_CERT_SIGNER_NOT_FOUND)) err = "The certificate hasn't got a known issuer"; else if ((status & GNUTLS_CERT_REVOKED)) err = "The certificate has been revoked"; else if (gnutls_certificate_type_get(soap->session) == GNUTLS_CRT_X509) { gnutls_x509_crt_t cert; const gnutls_datum_t *cert_list; unsigned int cert_list_size; if (gnutls_x509_crt_init(&cert) < 0) err = "Could not get X509 certificates"; else if ((cert_list = gnutls_certificate_get_peers(soap->session, &cert_list_size)) == NULL) err = "Could not get X509 certificates"; else if (gnutls_x509_crt_import(cert, &cert_list[0], GNUTLS_X509_FMT_DER) < 0) err = "Error parsing X509 certificate"; else if (!(soap->ssl_flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) && gnutls_x509_crt_get_expiration_time(cert) < time(NULL)) err = "The certificate has expired"; else if (!(soap->ssl_flags & SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE) && gnutls_x509_crt_get_activation_time(cert) > time(NULL)) err = "The certificate is not yet activated"; else if (host && !(soap->ssl_flags & SOAP_SSL_SKIP_HOST_CHECK)) { if (!gnutls_x509_crt_check_hostname(cert, host)) err = "Certificate host name mismatch"; } gnutls_x509_crt_deinit(cert); } return err; } #endif /******************************************************************************/ #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) #ifndef WITH_NOIO SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_accept(struct soap *soap) { SOAP_SOCKET sk = soap->socket; #ifdef WITH_OPENSSL BIO *bio; int err = SSL_ERROR_NONE; int retries, r, s; ERR_clear_error(); if (!soap_valid_socket(sk)) return soap_set_receiver_error(soap, "SSL/TLS error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR); soap->ssl_flags &= ~SOAP_SSL_CLIENT; if (!soap->ctx && (soap->error = soap->fsslauth(soap)) != SOAP_OK) return soap_closesock(soap); if (!soap->ssl) { soap->ssl = SSL_new(soap->ctx); if (!soap->ssl) { soap_closesock(soap); return soap_set_receiver_error(soap, "SSL/TLS error", "SSL_new() failed in soap_ssl_accept()", SOAP_SSL_ERROR); } } else { SSL_clear(soap->ssl); } bio = BIO_new_socket((int)sk, BIO_NOCLOSE); SSL_set_bio(soap->ssl, bio, bio); /* Default timeout: 10 sec retries, 100 times 0.1 sec */ retries = 100; if (soap->recv_timeout || soap->send_timeout) { int t = soap->recv_timeout > soap->send_timeout ? soap->recv_timeout : soap->send_timeout; if (t > 0) retries = 10 * t; else if (t > -100000) retries = 1; else retries = t/-100000; } SOAP_SOCKNONBLOCK(sk) while ((r = SSL_accept(soap->ssl)) <= 0) { err = SSL_get_error(soap->ssl, r); if (err == SSL_ERROR_WANT_ACCEPT || err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) { if (err == SSL_ERROR_WANT_READ) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; } else { soap->errnum = soap_socket_errno(sk); break; } if (retries-- <= 0) break; } if (!soap->recv_timeout && !soap->send_timeout) SOAP_SOCKBLOCK(sk) if (r <= 0) { soap_set_receiver_error(soap, soap_ssl_error(soap, r, err), "SSL_accept() failed in soap_ssl_accept()", SOAP_SSL_ERROR); return soap_closesock(soap); } 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/TLS error", "No SSL certificate was presented by the peer in soap_ssl_accept()", SOAP_SSL_ERROR); } X509_free(peer); } #endif #ifdef WITH_GNUTLS int retries, r, s; if (!soap_valid_socket(sk)) return soap_set_receiver_error(soap, "SSL/TLS error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR); soap->ssl_flags &= ~SOAP_SSL_CLIENT; if (!soap->session && (soap->error = soap->fsslauth(soap)) != SOAP_OK) return soap_closesock(soap); gnutls_transport_set_ptr(soap->session, (gnutls_transport_ptr_t)(long)sk); /* default timeout: 10 sec retries, 100 times 0.1 sec */ retries = 100; if (soap->recv_timeout || soap->send_timeout) { int t = soap->recv_timeout > soap->send_timeout ? soap->recv_timeout : soap->send_timeout; if (t > 0) retries = 10 * t; else if (t > -100000) retries = 1; else retries = t/-100000; } SOAP_SOCKNONBLOCK(sk) while ((r = gnutls_handshake(soap->session))) { /* GNUTLS repeat handhake when GNUTLS_E_AGAIN */ if (r == GNUTLS_E_AGAIN || r == GNUTLS_E_INTERRUPTED) { if (!gnutls_record_get_direction(soap->session)) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; } else { soap->errnum = soap_socket_errno(sk); break; } if (retries-- <= 0) break; } if (!soap->recv_timeout && !soap->send_timeout) SOAP_SOCKBLOCK(sk) if (r) { soap_set_receiver_error(soap, soap_ssl_error(soap, r, 0), "SSL/TLS handshake failed", SOAP_SSL_ERROR); return soap_closesock(soap); } if ((soap->ssl_flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION)) { const char *err = ssl_verify(soap, NULL); if (err) { soap_closesock(soap); return soap_set_receiver_error(soap, "SSL/TLS error", err, SOAP_SSL_ERROR); } } #endif #ifdef WITH_SYSTEMSSL gsk_iocallback local_io = { ssl_recv, ssl_send, NULL, NULL, NULL, NULL }; int retries, r, s; if (!soap_valid_socket(sk)) return soap_set_receiver_error(soap, "SSL/TLS error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR); soap->ssl_flags &= ~SOAP_SSL_CLIENT; /* default timeout: 10 sec retries, 100 times 0.1 sec */ retries = 100; if (soap->recv_timeout || soap->send_timeout) { int t = soap->recv_timeout > soap->send_timeout ? soap->recv_timeout : soap->send_timeout; if (t > 0) retries = 10 * t; else if (t > -100000) retries = 1; else retries = t/-100000; } SOAP_SOCKNONBLOCK(sk) r = gsk_secure_socket_open(soap->ctx, &soap->ssl); if (r == GSK_OK) r = gsk_attribute_set_numeric_value(soap->ssl, GSK_FD, sk); if (r == GSK_OK) r = gsk_attribute_set_buffer(soap->ssl, GSK_KEYRING_LABEL, soap->cafile, 0); if (r == GSK_OK) r = gsk_attribute_set_enum(soap->ssl, GSK_SESSION_TYPE, GSK_SERVER_SESSION); if (r == GSK_OK) r = gsk_attribute_set_buffer(soap->ssl, GSK_V3_CIPHER_SPECS_EXPANDED, "0035002F000A", 0); if (r == GSK_OK) r = gsk_attribute_set_enum(soap->ssl, GSK_V3_CIPHERS, GSK_V3_CIPHERS_CHAR4); if (r == GSK_OK) r = gsk_attribute_set_callback(soap->ssl, GSK_IO_CALLBACK, &local_io); if (r != GSK_OK) return soap_set_receiver_error(soap, gsk_strerror(r), "SYSTEM SSL error in soap_ssl_accept()", SOAP_SSL_ERROR); while ((r = gsk_secure_socket_init(soap->ssl)) != GSK_OK) { if (r == GSK_WOULD_BLOCK_READ || r == GSK_WOULD_BLOCK_WRITE) { if (r == GSK_WOULD_BLOCK_READ) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; } else { soap->errnum = soap_socket_errno(sk); break; } if (retries-- <= 0) break; } if (!soap->recv_timeout && !soap->send_timeout) SOAP_SOCKBLOCK(sk) if (r != GSK_OK) { soap_set_receiver_error(soap, gsk_strerror(r), "gsk_secure_socket_init() failed in soap_ssl_accept()", SOAP_SSL_ERROR); return soap_closesock(soap); } #endif soap->imode |= SOAP_ENC_SSL; soap->omode |= SOAP_ENC_SSL; return SOAP_OK; } #endif #endif /******************************************************************************\ * * TCP/UDP [SSL/TLS] IPv4 and IPv6 * \******************************************************************************/ #ifndef WITH_NOIO 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 /******************************************************************************/ #ifndef WITH_NOIO static const char* tcp_error(struct soap *soap) { 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 { (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), 37), "TCP/UDP IP error %d", soap->errnum); msg = soap->msgbuf; } } } return msg; } #endif /******************************************************************************/ #if !defined(WITH_IPV6) || defined(WITH_COOKIES) #ifndef WITH_NOIO static int tcp_gethostbyname(struct soap *soap, const char *addr, struct hostent *hostent, struct in_addr *inaddr) { #if (defined(_AIX43) || defined(TRU64) || defined(HP_UX)) && defined(HAVE_GETHOSTBYNAME_R) struct hostent_data ht_data; #elif (!defined(__GLIBC__) || !defined(_GNU_SOURCE) || (!_GNU_SOURCE && !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || defined(__ANDROID__) || defined(FREEBSD) || defined(__FreeBSD__)) && defined(HAVE_GETHOSTBYNAME_R) int r; char *tmpbuf = soap->tmpbuf; size_t tmplen = sizeof(soap->tmpbuf); #elif defined(HAVE_GETHOSTBYNAME_R) char *tmpbuf = soap->tmpbuf; size_t tmplen = sizeof(soap->tmpbuf); #endif #ifdef VXWORKS int hostint; /* vxWorks compatible */ #endif if (inaddr) { soap_int32 iadd = -1; #ifdef AS400 iadd = inet_addr((void*)addr); #else iadd = inet_addr((char*)addr); #endif if (iadd != -1) { if (soap_memcpy((void*)inaddr, sizeof(struct in_addr), (const void*)&iadd, sizeof(iadd))) return soap->error = SOAP_EOM; return SOAP_OK; } } #if (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) { hostent = NULL; soap->errnum = h_errno; } #elif (!defined(__GLIBC__) || !defined(_GNU_SOURCE) || (!_GNU_SOURCE && !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || defined(__ANDROID__) || defined(FREEBSD) || defined(__FreeBSD__)) && defined(HAVE_GETHOSTBYNAME_R) while ((r = gethostbyname_r(addr, hostent, tmpbuf, tmplen, &hostent, &soap->errnum)) < 0) { if (tmpbuf != soap->tmpbuf) SOAP_FREE(soap, tmpbuf); if (r != SOAP_ERANGE) { hostent = NULL; break; } tmplen *= 2; tmpbuf = (char*)SOAP_MALLOC(soap, tmplen); if (!tmpbuf) break; } #elif defined(HAVE_GETHOSTBYNAME_R) hostent = gethostbyname_r(addr, hostent, tmpbuf, tmplen, &soap->errnum); #elif defined(VXWORKS) /* vxWorks compatible */ /* 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) { hostent = NULL; soap->errnum = soap_errno; } #else #ifdef AS400 hostent = gethostbyname((void*)addr); #else hostent = gethostbyname((char*)addr); #endif if (!hostent) soap->errnum = h_errno; #endif if (!hostent) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Host name not found\n")); return SOAP_ERR; } if (inaddr) { #ifdef VXWORKS inaddr->s_addr = hostint; /* vxWorks compatible */ #else if (soap_memcpy((void*)inaddr, sizeof(struct in_addr), (const void*)hostent->h_addr, (size_t)hostent->h_length)) { #if (!defined(__GLIBC__) || !defined(_GNU_SOURCE) || (!_GNU_SOURCE && !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || defined(__ANDROID__) || defined(FREEBSD) || defined(__FreeBSD__)) && defined(HAVE_GETHOSTBYNAME_R) if (tmpbuf && tmpbuf != soap->tmpbuf) SOAP_FREE(soap, tmpbuf); #endif return soap->error = SOAP_EOM; } #endif } #if (!defined(__GLIBC__) || !defined(_GNU_SOURCE) || (!_GNU_SOURCE && !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || defined(__ANDROID__) || defined(FREEBSD) || defined(__FreeBSD__)) && defined(HAVE_GETHOSTBYNAME_R) if (tmpbuf && tmpbuf != soap->tmpbuf) SOAP_FREE(soap, tmpbuf); #endif return SOAP_OK; } #endif #endif /******************************************************************************/ #if !defined(WITH_IPV6) #ifndef WITH_NOIO static int tcp_gethost(struct soap *soap, const char *addr, struct in_addr *inaddr) { struct hostent hostent; return tcp_gethostbyname(soap, addr, &hostent, inaddr); } #endif #endif /******************************************************************************/ #ifndef WITH_NOIO 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 sk; int err = 0; #ifndef WITH_LEAN int set = 1; #endif #if !defined(WITH_LEAN) || defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) int retries; #endif soap->errnum = 0; soap->errmode = 0; if (soap_valid_socket(soap->socket)) { if ((soap->omode & SOAP_IO_UDP) && soap->socket == soap->master) { #ifdef IP_MULTICAST_TTL #ifndef WITH_IPV6 soap->errmode = 2; if (soap->fresolve(soap, host, &soap->peer.in.sin_addr)) { soap_set_receiver_error(soap, tcp_error(soap), "get host by name failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, soap->socket); return soap->socket = SOAP_INVALID_SOCKET; } soap->peer.in.sin_port = htons((short)port); soap->errmode = 0; #else if (getaddrinfo(host, soap_int2s(soap, port), &hints, &res) || !res) { soap_set_receiver_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, soap->socket); return soap->socket = SOAP_INVALID_SOCKET; } if (soap_memcpy((void*)&soap->peer.storage, sizeof(soap->peer.storage), (const void*)res->ai_addr, res->ai_addrlen)) { soap->error = SOAP_EOM; soap->fclosesocket(soap, soap->socket); freeaddrinfo(res); return soap->socket = SOAP_INVALID_SOCKET; } soap->peerlen = res->ai_addrlen; freeaddrinfo(res); #endif if (soap->ipv4_multicast_ttl) { unsigned char ttl = soap->ipv4_multicast_ttl; if (setsockopt(soap->socket, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl, sizeof(ttl))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_TTL failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, soap->socket); return soap->socket = SOAP_INVALID_SOCKET; } } if (soap->ipv4_multicast_if && !soap->ipv6_multicast_if) { if (setsockopt(soap->socket, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) #ifndef WINDOWS { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, soap->socket); return soap->socket = SOAP_INVALID_SOCKET; } #else #ifndef IP_MULTICAST_IF #define IP_MULTICAST_IF 2 #endif if (setsockopt(soap->socket, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) { soap->errnum = soap_socket_errno(soap->socket); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, soap->socket); return soap->socket = SOAP_INVALID_SOCKET; } #endif } #endif return soap->socket; } soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; } if (tcp_init(soap)) { soap_set_receiver_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 || !res) { soap_set_receiver_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in tcp_connect()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } ressave = res; again: sk = soap->socket = socket(res->ai_family, res->ai_socktype, res->ai_protocol); soap->error = SOAP_OK; soap->errmode = 0; #else #ifndef WITH_LEAN again: #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) sk = soap->socket = socket(AF_INET, SOCK_DGRAM, 0); else #endif sk = soap->socket = socket(AF_INET, SOCK_STREAM, 0); #endif if (!soap_valid_socket(sk)) { #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } #endif soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "socket failed in tcp_connect()", SOAP_TCP_ERROR); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return SOAP_INVALID_SOCKET; } #ifdef WITH_SOCKET_CLOSE_ON_EXIT #ifdef WIN32 #ifndef UNDER_CE SetHandleInformation((HANDLE)sk, HANDLE_FLAG_INHERIT, 0); #endif #else fcntl(sk, 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(sk, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger))) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_LINGER failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif return soap->socket = SOAP_INVALID_SOCKET; } } if ((soap->connect_flags & ~SO_LINGER) && setsockopt(sk, SOL_SOCKET, soap->connect_flags & ~SO_LINGER, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #ifndef UNDER_CE if ((soap->keep_alive || soap->tcp_keep_alive) && setsockopt(sk, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } if (soap->sndbuf > 0 && setsockopt(sk, SOL_SOCKET, SO_SNDBUF, (char*)&soap->sndbuf, sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } if (soap->rcvbuf > 0 && setsockopt(sk, SOL_SOCKET, SO_RCVBUF, (char*)&soap->rcvbuf, sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #ifdef TCP_KEEPIDLE if (soap->tcp_keep_idle && setsockopt(sk, IPPROTO_TCP, TCP_KEEPIDLE, (char*)&(soap->tcp_keep_idle), sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_KEEPIDLE failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #endif #ifdef TCP_KEEPINTVL if (soap->tcp_keep_intvl && setsockopt(sk, IPPROTO_TCP, TCP_KEEPINTVL, (char*)&(soap->tcp_keep_intvl), sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_KEEPINTVL failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #endif #ifdef TCP_KEEPCNT if (soap->tcp_keep_cnt && setsockopt(sk, IPPROTO_TCP, TCP_KEEPCNT, (char*)&(soap->tcp_keep_cnt), sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_KEEPCNT failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #endif #ifdef TCP_NODELAY if (!(soap->omode & SOAP_IO_UDP) && setsockopt(sk, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = 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; } #endif #endif #ifdef IP_MULTICAST_TTL if ((soap->omode & SOAP_IO_UDP)) { if (soap->ipv4_multicast_ttl) { unsigned char ttl = soap->ipv4_multicast_ttl; if (setsockopt(sk, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl, sizeof(ttl))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_TTL failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } } if ((soap->omode & SOAP_IO_UDP) && soap->ipv4_multicast_if && !soap->ipv6_multicast_if) { if (setsockopt(sk, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) #ifndef WINDOWS { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #else #ifndef IP_MULTICAST_IF #define IP_MULTICAST_IF 2 #endif if (setsockopt(sk, IPPROTO_IP, IP_MULTICAST_IF, (char*)soap->ipv4_multicast_if, sizeof(struct in_addr))) { soap->errnum = soap_socket_errno(sk); #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IP_MULTICAST_IF failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #endif } } #endif #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Opening socket=%d to host='%s' port=%d\n", (int)sk, host, port)); #ifndef WITH_IPV6 soap->peerlen = sizeof(soap->peer.in); memset((void*)&soap->peer.in, 0, sizeof(soap->peer.in)); soap->peer.in.sin_family = AF_INET; #ifndef WIN32 if (soap->client_addr) { struct sockaddr_in addr; memset((void*)&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; if (soap->client_port >= 0) addr.sin_port = htons(soap->client_port); if (inet_pton(AF_INET, soap->client_addr, (void*)&addr.sin_addr) != 1 || bind(sk, (struct sockaddr*)&addr, sizeof(addr))) { soap->errnum = soap_socket_errno(sk); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind before connect\n")); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); soap->client_addr = NULL; soap->client_port = -1; return soap->socket = SOAP_INVALID_SOCKET; } soap->client_addr = NULL; /* disable bind before connect, so need to set it again before the next connect */ soap->client_port = -1; /* disable bind before connect, so need to set it again before the next connect */ } else #endif if (soap->client_port >= 0) { struct sockaddr_in addr; memset((void*)&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(soap->client_port); if (bind(sk, (struct sockaddr*)&addr, sizeof(addr))) { soap->errnum = soap_socket_errno(sk); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind before connect\n")); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); soap->client_port = -1; return soap->socket = SOAP_INVALID_SOCKET; } soap->client_port = -1; /* disable bind before connect, so need to set it again before the next connect */ } #ifndef WIN32 if (soap->client_interface) { if (inet_pton(AF_INET, soap->client_interface, &soap->peer.in.sin_addr) != 1) { soap->errnum = soap_socket_errno(sk); soap_set_receiver_error(soap, tcp_error(soap), "inet_pton() failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); soap->client_interface = NULL; return soap->socket = SOAP_INVALID_SOCKET; } soap->client_interface = NULL; /* disable client interface, so need to set it again before the next connect */ } #endif soap->errmode = 2; if (soap->proxy_host) { if (soap->fresolve(soap, soap->proxy_host, &soap->peer.in.sin_addr)) { soap_set_receiver_error(soap, tcp_error(soap), "get proxy host by name failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } soap->peer.in.sin_port = htons((short)soap->proxy_port); } else { if (soap->fresolve(soap, host, &soap->peer.in.sin_addr)) { soap_set_receiver_error(soap, tcp_error(soap), "get host by name failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } soap->peer.in.sin_port = htons((short)port); } soap->errmode = 0; #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) return sk; #endif #else #ifndef WIN32 if (soap->client_addr) { struct sockaddr_in6 addr; memset((void*)&addr, 0, sizeof(addr)); addr.sin6_family = AF_INET6; if ((soap->client_addr_ipv6 && res->ai_family == AF_INET6 && inet_pton(AF_INET6, soap->client_addr_ipv6, (void*)&addr.sin6_addr.s6_addr) == 1) || (!soap->client_addr_ipv6 && inet_pton(AF_INET6, soap->client_addr, (void*)&addr.sin6_addr.s6_addr) == 1) ) { if (soap->client_port >= 0) addr.sin6_port = htons(soap->client_port); if (bind(sk, (struct sockaddr*)&addr, sizeof(addr))) { soap->errnum = soap_socket_errno(sk); freeaddrinfo(ressave); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind before connect\n")); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); soap->client_addr = NULL; soap->client_addr_ipv6 = NULL; soap->client_port = -1; return soap->socket = SOAP_INVALID_SOCKET; } } else /* not an IPv6 address, must be IPv4 */ { struct sockaddr_in addr; memset((void*)&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; if (soap->client_port >= 0) addr.sin_port = htons(soap->client_port); if (inet_pton(AF_INET, soap->client_addr, (void*)&addr.sin_addr) != 1 || bind(sk, (struct sockaddr*)&addr, sizeof(addr))) { soap->errnum = soap_socket_errno(sk); freeaddrinfo(ressave); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind before connect\n")); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); soap->client_addr = NULL; soap->client_addr_ipv6 = NULL; soap->client_port = -1; return soap->socket = SOAP_INVALID_SOCKET; } } soap->client_addr = NULL; /* disable bind before connect, so need to set it again before the next connect */ soap->client_addr_ipv6 = NULL; /* disable bind before connect, so need to set it again before the next connect */ soap->client_port = -1; /* disable bind before connect, so need to set it again before the next connect */ } else #endif if (soap->client_port >= 0) { struct sockaddr_in6 addr; memset((void*)&addr, 0, sizeof(addr)); addr.sin6_family = AF_INET6; addr.sin6_port = htons(soap->client_port); if (bind(sk, (struct sockaddr*)&addr, sizeof(addr))) { soap->errnum = soap_socket_errno(sk); freeaddrinfo(ressave); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind before connect\n")); soap_set_receiver_error(soap, tcp_error(soap), "bind failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); soap->client_port = -1; return soap->socket = SOAP_INVALID_SOCKET; } soap->client_port = -1; /* disable bind before connect, so need to set it again before the next connect */ } #ifndef WIN32 if (soap->client_interface) { if (inet_pton(AF_INET6, soap->client_interface, res->ai_addr) != 1) { if (inet_pton(AF_INET, soap->client_interface, res->ai_addr) != 1) { soap->errnum = soap_socket_errno(sk); freeaddrinfo(ressave); soap_set_receiver_error(soap, tcp_error(soap), "inet_pton() failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); soap->client_interface = NULL; return soap->socket = SOAP_INVALID_SOCKET; } } soap->client_interface = NULL; /* disable client interface, so need to set it again before the next connect */ } #endif #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) { if (soap_memcpy((void*)&soap->peer.storage, sizeof(soap->peer.storage), (const void*)res->ai_addr, res->ai_addrlen)) { soap->error = SOAP_EOM; soap->fclosesocket(soap, sk); soap->socket = sk = SOAP_INVALID_SOCKET; } soap->peerlen = res->ai_addrlen; freeaddrinfo(ressave); return sk; } #endif #endif #ifndef WITH_LEAN if (soap->connect_timeout) SOAP_SOCKNONBLOCK(sk) else SOAP_SOCKBLOCK(sk) retries = 10; #endif for (;;) { #ifdef WITH_IPV6 if (connect(sk, res->ai_addr, (int)res->ai_addrlen)) #else if (connect(sk, &soap->peer.addr, sizeof(soap->peer.in))) #endif { err = soap_socket_errno(sk); #ifdef WITH_IPV6 if (err == SOAP_ECONNREFUSED && res->ai_next) { soap->fclosesocket(soap, sk); res = res->ai_next; goto again; } #endif #ifndef WITH_LEAN if (err == SOAP_EADDRINUSE) { soap->fclosesocket(soap, sk); if (retries-- > 0) goto again; } else if (soap->connect_timeout && (err == SOAP_EINPROGRESS || err == SOAP_EAGAIN || err == SOAP_EWOULDBLOCK)) { SOAP_SOCKLEN_T k; for (;;) { int r; #ifdef WITH_SELF_PIPE r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_PIP, soap->connect_timeout); if ((r & SOAP_TCP_SELECT_PIP)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connection closed by self pipe\n")); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #else r = tcp_select(soap, sk, SOAP_TCP_SELECT_SND, soap->connect_timeout); #endif if (r > 0) break; if (!r) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connect timeout\n")); soap_set_receiver_error(soap, "Timeout", "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } freeaddrinfo(ressave); #endif return soap->socket = SOAP_INVALID_SOCKET; } r = soap->errnum = soap_socket_errno(sk); if (r != SOAP_EINTR) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); soap_set_receiver_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } freeaddrinfo(ressave); #endif return soap->socket = SOAP_INVALID_SOCKET; } } k = (SOAP_SOCKLEN_T)sizeof(soap->errnum); if (!getsockopt(sk, 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(sk); soap_set_receiver_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; goto again; } freeaddrinfo(ressave); #endif return soap->socket = SOAP_INVALID_SOCKET; } #endif #ifdef WITH_IPV6 if (res->ai_next) { res = res->ai_next; soap->fclosesocket(soap, sk); goto again; } #endif if (err && err != SOAP_EINTR) { soap->errnum = err; #ifdef WITH_IPV6 freeaddrinfo(ressave); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n")); soap_set_receiver_error(soap, tcp_error(soap), "connect failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } } else { break; } } #ifdef WITH_IPV6 soap->peerlen = 0; /* IPv6: already connected so use send() */ freeaddrinfo(ressave); #endif soap->imode &= ~SOAP_ENC_SSL; soap->omode &= ~SOAP_ENC_SSL; if (endpoint && !soap_tag_cmp(endpoint, "https:*")) { #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) || defined(WITH_SYSTEMSSL) #ifdef WITH_OPENSSL BIO *bio; #endif #ifdef WITH_SYSTEMSSL gsk_iocallback local_io = { ssl_recv, ssl_send, NULL, NULL, NULL, NULL }; #endif int r; if (soap->proxy_host) { soap_mode m = soap->mode; /* preserve settings */ soap_mode om = soap->omode; /* make sure we only parse HTTP */ ULONG64 n = soap->count; /* save the content length */ const char *userid, *passwd; int status = soap->status; /* save the current status/command */ int keep_alive = soap->keep_alive; /* save the KA status */ soap->omode &= ~SOAP_ENC; /* mask IO and ENC */ soap->omode |= SOAP_IO_BUFFER; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connecting to %s proxy server %s for destination endpoint %s\n", soap->proxy_http_version, soap->proxy_host, endpoint)); #ifdef WITH_NTLM if (soap->ntlm_challenge && soap_ntlm_handshake(soap, SOAP_CONNECT, endpoint, host, port)) { soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #endif if (soap_init_send(soap)) { soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } soap->status = SOAP_CONNECT; if (!soap->keep_alive) soap->keep_alive = -1; /* must keep alive */ soap->error = soap->fpost(soap, endpoint, host, port, NULL, NULL, 0); if (soap->error || soap_end_send_flush(soap)) { soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } soap->keep_alive = keep_alive; soap->omode = om; om = soap->imode; soap->imode &= ~SOAP_ENC; /* mask IO and ENC */ userid = soap->userid; /* preserve */ passwd = soap->passwd; /* preserve */ soap->error = soap->fparse(soap); if (soap->error) { soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } soap->status = status; /* restore */ soap->userid = userid; /* restore */ soap->passwd = passwd; /* restore */ soap->imode = om; /* restore */ soap->count = n; /* restore */ if (soap_init_send(soap)) { soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } if (endpoint) soap_strcpy(soap->endpoint, sizeof(soap->endpoint), endpoint); /* restore */ soap->mode = m; } #ifdef WITH_OPENSSL ERR_clear_error(); soap->ssl_flags |= SOAP_SSL_CLIENT; if (!soap->ctx && (soap->error = soap->fsslauth(soap)) != SOAP_OK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL required, but no ctx set\n")); soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return soap->socket = SOAP_INVALID_SOCKET; } if (!soap->ssl) { soap->ssl = SSL_new(soap->ctx); if (!soap->ssl) { soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return soap->socket = 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; } #if OPENSSL_VERSION_NUMBER >= 0x1000000aL if (!(soap->ssl_flags & SOAP_SSLv3) && !SSL_set_tlsext_host_name(soap->ssl, host)) { soap_set_receiver_error(soap, "SSL/TLS error", "SNI failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #elif (OPENSSL_VERSION_NUMBER >= 0x0090800fL) && defined(SSL_CTRL_SET_TLSEXT_HOSTNAME) if (!SSL_ctrl(soap->ssl, SSL_CTRL_SET_TLSEXT_HOSTNAME, TLSEXT_NAMETYPE_host_name, (void*)host)) { soap_set_receiver_error(soap, "SSL/TLS error", "SNI failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #endif bio = BIO_new_socket((int)sk, BIO_NOCLOSE); SSL_set_bio(soap->ssl, bio, bio); if (soap->connect_timeout || soap->recv_timeout || soap->send_timeout) { /* Set SSL connect timeout and set SSL sockets to non-blocking */ int t = soap->recv_timeout > soap->send_timeout ? soap->recv_timeout : soap->send_timeout; if (soap->connect_timeout > 0 && t < soap->connect_timeout) t = soap->connect_timeout; if (t > 0) retries = 10 * t; else if (t > -100000) retries = 1; else retries = t/-100000; SOAP_SOCKNONBLOCK(sk) } else { /* Set sockets to blocking */ retries = 1; SOAP_SOCKBLOCK(sk) } err = SSL_ERROR_NONE; /* Try connecting until success or timeout */ do { if ((r = SSL_connect(soap->ssl)) <= 0) { err = SSL_get_error(soap->ssl, r); if (err == SSL_ERROR_WANT_CONNECT || err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) { int s; if (err == SSL_ERROR_WANT_READ) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; if (s == 0 && retries-- <= 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL/TLS connect timeout\n")); soap_set_receiver_error(soap, "Timeout", "SSL_connect() failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } } else { soap->errnum = soap_socket_errno(sk); break; } } } while (!SSL_is_init_finished(soap->ssl)); if (r <= 0) { soap_set_sender_error(soap, soap_ssl_error(soap, r, err), "SSL/TLS handshake failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } /* Check server credentials when required */ if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) { if ((err = SSL_get_verify_result(soap->ssl)) != X509_V_OK) { soap_set_sender_error(soap, X509_verify_cert_error_string(err), "SSL/TLS certificate presented by peer cannot be verified in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } if (!(soap->ssl_flags & SOAP_SSL_SKIP_HOST_CHECK)) { X509_NAME *subj; STACK_OF(CONF_VALUE) *val = NULL; #if OPENSSL_VERSION_NUMBER >= 0x0090800fL GENERAL_NAMES *names = NULL; #else int ext_count; #endif int ok = 0; X509 *peer = SSL_get_peer_certificate(soap->ssl); if (!peer) { soap_set_sender_error(soap, "SSL/TLS error", "No SSL/TLS certificate was presented by the peer in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #if OPENSSL_VERSION_NUMBER < 0x0090800fL 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_METHOD*)X509V3_EXT_get(ext); unsigned char *data; if (!meth) break; data = ext->value->data; if (data) { #if OPENSSL_VERSION_NUMBER > 0x00907000L void *ext_data; if (meth->it) ext_data = ASN1_item_d2i(NULL, &data, ext->value->length, ASN1_ITEM_ptr(meth->it)); else { #if OPENSSL_VERSION_NUMBER > 0x0090800fL ext_data = meth->d2i(NULL, (const unsigned char **)&data, ext->value->length); #else ext_data = meth->d2i(NULL, &data, ext->value->length); #endif } if (ext_data) val = meth->i2v(meth, ext_data, NULL); else val = NULL; if (meth->it) ASN1_item_free((ASN1_VALUE*)ext_data, ASN1_ITEM_ptr(meth->it)); else meth->ext_free(ext_data); #else void *ext_data = meth->d2i(NULL, &data, ext->value->length); if (ext_data) val = meth->i2v(meth, ext_data, NULL); meth->ext_free(ext_data); #endif if (val) { int j; 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->name, "IP Address")) && !soap_tag_cmp(host, nval->value)) { ok = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s match with certificate %s %s\n", host, nval->name, nval->value)); break; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s mismatch with certificate %s %s\n", host, nval->name, nval->value)); } } sk_CONF_VALUE_pop_free(val, X509V3_conf_free); } } } if (ok) break; } } #else names = (GENERAL_NAMES*)X509_get_ext_d2i(peer, NID_subject_alt_name, NULL, NULL); if (names) { val = i2v_GENERAL_NAMES(NULL, names, val); sk_GENERAL_NAME_pop_free(names, GENERAL_NAME_free); } if (val) { int j; 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->name, "IP Address")) && !soap_tag_cmp(host, nval->value)) { ok = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s match with certificate %s %s\n", host, nval->name, nval->value)); break; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s mismatch with certificate %s %s\n", host, nval->name, nval->value)); } } sk_CONF_VALUE_pop_free(val, X509V3_conf_free); } #endif if (!ok && (subj = X509_get_subject_name(peer)) != 0) { 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 OPENSSL_VERSION_NUMBER < 0x10100000L const char *tmp = (const char*)ASN1_STRING_data(name); #else const char *tmp = (const char*)ASN1_STRING_get0_data(name); #endif if (!soap_tag_cmp(host, tmp)) { ok = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s match with certificate subject %s\n", host, tmp)); } else { unsigned char *tmp = NULL; ASN1_STRING_to_UTF8(&tmp, name); if (tmp) { if (!soap_tag_cmp(host, (const char*)tmp)) { ok = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s match with certificate subject %s\n", host, tmp)); } else if (tmp[0] == '*') /* wildcard domain */ { const char *t = strchr(host, '.'); if (t && !soap_tag_cmp(t, (const char*)tmp + 1)) { ok = 1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s match with certificate subject %s\n", host, tmp)); } } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL: host name %s mismatch with certificate %s\n", host, tmp)); } OPENSSL_free(tmp); } } } } while (!ok); } X509_free(peer); if (!ok) { soap_set_sender_error(soap, "SSL/TLS error", "SSL/TLS certificate host name mismatch in tcp_connect()", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } } } #endif #ifdef WITH_GNUTLS soap->ssl_flags |= SOAP_SSL_CLIENT; if (!soap->session && (soap->error = soap->fsslauth(soap)) != SOAP_OK) { soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } gnutls_transport_set_ptr(soap->session, (gnutls_transport_ptr_t)(long)sk); if (soap->connect_timeout || soap->recv_timeout || soap->send_timeout) { /* Set SSL connect timeout and set SSL sockets to non-blocking */ int t = soap->recv_timeout > soap->send_timeout ? soap->recv_timeout : soap->send_timeout; if (soap->connect_timeout > 0 && t < soap->connect_timeout) t = soap->connect_timeout; if (t > 0) retries = 10 * t; else if (t > -100000) retries = 1; else retries = t/-100000; SOAP_SOCKNONBLOCK(sk) } else { /* Set sockets to blocking */ retries = 1; SOAP_SOCKBLOCK(sk) } /* Try connecting until success or timeout */ while ((r = gnutls_handshake(soap->session))) { /* GNUTLS repeat handhake when GNUTLS_E_AGAIN */ if (r == GNUTLS_E_AGAIN || r == GNUTLS_E_INTERRUPTED) { int s; if (!gnutls_record_get_direction(soap->session)) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; if (s == 0 && retries-- <= 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL/TLS connect timeout\n")); soap_set_receiver_error(soap, "Timeout", "SSL_connect() failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } } else { soap->errnum = soap_socket_errno(sk); break; } } if (r) { soap_set_sender_error(soap, soap_ssl_error(soap, r, 0), "SSL/TLS handshake failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } if ((soap->ssl_flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION)) { const char *s = ssl_verify(soap, host); if (s) { soap->fclosesocket(soap, sk); soap->error = soap_set_sender_error(soap, "SSL/TLS verify error", s, SOAP_SSL_ERROR); return soap->socket = SOAP_INVALID_SOCKET; } } #endif #ifdef WITH_SYSTEMSSL soap->ssl_flags |= SOAP_SSL_CLIENT; if (!soap->ctx && (soap->error = soap->fsslauth(soap)) != SOAP_OK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL required, but no ctx set\n")); soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return soap->socket = SOAP_INVALID_SOCKET; } if (soap->connect_timeout || soap->recv_timeout || soap->send_timeout) { /* Set SSL connect timeout and set SSL sockets to non-blocking */ int t = soap->recv_timeout > soap->send_timeout ? soap->recv_timeout : soap->send_timeout; if (soap->connect_timeout > 0 && t < soap->connect_timeout) t = soap->connect_timeout; if (t > 0) retries = 10 * t; else if (t > -100000) retries = 1; else retries = t/-100000; SOAP_SOCKNONBLOCK(sk) } else { /* Set sockets to blocking */ retries = 1; SOAP_SOCKBLOCK(sk) } r = gsk_secure_socket_open(soap->ctx, &soap->ssl); if (r == GSK_OK) r = gsk_attribute_set_numeric_value(soap->ssl, GSK_FD, sk); if (r == GSK_OK) r = gsk_attribute_set_buffer(soap->ssl, GSK_KEYRING_LABEL, soap->cafile, 0); /* Certificate label */ if (r == GSK_OK) r = gsk_attribute_set_enum(soap->ssl, GSK_SESSION_TYPE, GSK_CLIENT_SESSION); if (r == GSK_OK) r = gsk_attribute_set_buffer(soap->ssl, GSK_V3_CIPHER_SPECS_EXPANDED, "0035002F000A", 0); if (r == GSK_OK) r = gsk_attribute_set_enum(soap->ssl, GSK_V3_CIPHERS, GSK_V3_CIPHERS_CHAR4); if (r == GSK_OK) r = gsk_attribute_set_callback(soap->ssl, GSK_IO_CALLBACK, &local_io); if (r != GSK_OK) { soap_set_receiver_error(soap, gsk_strerror(r), "SYSTEM SSL error in tcp_connect()", SOAP_SSL_ERROR); return soap->socket = SOAP_INVALID_SOCKET; } /* Try connecting until success or timeout */ while ((r = gsk_secure_socket_init(soap->ssl)) != GSK_OK) { if (r == GSK_WOULD_BLOCK_READ || r == GSK_WOULD_BLOCK_WRITE) { int s; if (r == GSK_WOULD_BLOCK_READ) s = tcp_select(soap, sk, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, -100000); else s = tcp_select(soap, sk, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, -100000); if (s < 0) break; if (s == 0 && retries-- <= 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL/TLS connect timeout\n")); soap_set_receiver_error(soap, "Timeout", "SSL_connect() failed in tcp_connect()", SOAP_TCP_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } } else { soap->errnum = soap_socket_errno(sk); break; } } if (r != GSK_OK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "SSL_connect/select error in tcp_connect\n")); soap_set_receiver_error(soap, gsk_strerror(r), "SSL/TLS handshake failed", SOAP_SSL_ERROR); soap->fclosesocket(soap, sk); return soap->socket = SOAP_INVALID_SOCKET; } #endif soap->imode |= SOAP_ENC_SSL; soap->omode |= SOAP_ENC_SSL; #else soap->fclosesocket(soap, sk); soap->error = SOAP_SSL_ERROR; return soap->socket = SOAP_INVALID_SOCKET; #endif } if (soap->recv_timeout || soap->send_timeout) SOAP_SOCKNONBLOCK(sk) else SOAP_SOCKBLOCK(sk) return sk; } #endif /******************************************************************************/ #ifndef WITH_NOIO static int tcp_select(struct soap *soap, SOAP_SOCKET sk, int flags, int timeout) { int r; struct timeval tv; fd_set fd[3], *rfd, *sfd, *efd; int retries = 0; int eintr = SOAP_MAXEINTR; soap->errnum = 0; if (!soap_valid_socket(sk)) { soap->error = SOAP_EOF; return -1; } #ifndef WIN32 #if !defined(FD_SETSIZE) || defined(__QNX__) || defined(QNX) /* no FD_SETSIZE or select() is not MT safe on some QNX: always poll */ if (1) #else /* if fd max set size exceeded, use poll() when available */ if ((int)sk >= (int)FD_SETSIZE) #endif #ifdef HAVE_POLL { #ifdef WITH_SELF_PIPE struct pollfd pollfd[2]; pollfd[1].fd = soap->pipe_fd[0]; pollfd[1].events = POLLIN; #else struct pollfd pollfd[1]; #endif pollfd[0].fd = (int)sk; pollfd[0].events = 0; if ((flags & SOAP_TCP_SELECT_RCV)) pollfd[0].events |= POLLIN; if ((flags & SOAP_TCP_SELECT_SND)) pollfd[0].events |= POLLOUT; if ((flags & SOAP_TCP_SELECT_ERR)) pollfd[0].events |= POLLERR; if (timeout <= 0) timeout /= -1000; /* -usec -> ms */ else { retries = timeout - 1; timeout = 1000; } do { #ifdef WITH_SELF_PIPE r = poll(pollfd, 2, timeout); #else r = poll(pollfd, 1, timeout); #endif if (r < 0 && (soap->errnum = soap_socket_errno(sk)) == SOAP_EINTR && eintr > 0) { eintr--; r = 0; } else if (retries-- <= 0) { break; } } while (r == 0); if (r > 0) { r = 0; if ((flags & SOAP_TCP_SELECT_RCV) && (pollfd[0].revents & POLLIN)) r |= SOAP_TCP_SELECT_RCV; if ((flags & SOAP_TCP_SELECT_SND) && (pollfd[0].revents & POLLOUT)) r |= SOAP_TCP_SELECT_SND; if ((flags & SOAP_TCP_SELECT_ERR) && (pollfd[0].revents & POLLERR)) r |= SOAP_TCP_SELECT_ERR; #ifdef WITH_SELF_PIPE if ((flags & SOAP_TCP_SELECT_PIP) && (pollfd[1].revents & POLLIN)) { char ch; for (;;) { if (read(soap->pipe_fd[0], &ch, 1) == -1) { if (soap_socket_errno(soap->pipe_fd[0]) == SOAP_EAGAIN) break; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Self pipe read error\n")); return -1; } } r |= SOAP_TCP_SELECT_PIP; } #endif } else if (r == 0) { soap->errnum = 0; } return r; } #else { soap->error = SOAP_FD_EXCEEDED; return -1; } #endif #endif if (timeout > 0) retries = timeout - 1; do { rfd = sfd = efd = NULL; #ifdef WITH_SELF_PIPE if ((flags & SOAP_TCP_SELECT_PIP) || (flags & SOAP_TCP_SELECT_RCV)) { rfd = &fd[0]; FD_ZERO(rfd); if ((flags & SOAP_TCP_SELECT_PIP)) FD_SET(soap->pipe_fd[0], rfd); if ((flags & SOAP_TCP_SELECT_RCV)) FD_SET(sk, rfd); } #else if ((flags & SOAP_TCP_SELECT_RCV)) { rfd = &fd[0]; FD_ZERO(rfd); FD_SET(sk, rfd); } #endif if ((flags & SOAP_TCP_SELECT_SND)) { sfd = &fd[1]; FD_ZERO(sfd); FD_SET(sk, sfd); } if ((flags & SOAP_TCP_SELECT_ERR)) { efd = &fd[2]; FD_ZERO(efd); FD_SET(sk, efd); } if (timeout <= 0) { tv.tv_sec = -timeout / 1000000; tv.tv_usec = -timeout % 1000000; } else { tv.tv_sec = 1; tv.tv_usec = 0; } #ifdef WITH_SELF_PIPE r = select((int)(sk > soap->pipe_fd[0] ? sk : soap->pipe_fd[0]) + 1, rfd, sfd, efd, &tv); #else r = select((int)sk + 1, rfd, sfd, efd, &tv); #endif if (r < 0 && (soap->errnum = soap_socket_errno(sk)) == SOAP_EINTR && eintr > 0) { eintr--; r = 0; } else if (retries-- <= 0) { break; } } while (r == 0); if (r > 0) { r = 0; if ((flags & SOAP_TCP_SELECT_RCV) && FD_ISSET(sk, rfd)) r |= SOAP_TCP_SELECT_RCV; if ((flags & SOAP_TCP_SELECT_SND) && FD_ISSET(sk, sfd)) r |= SOAP_TCP_SELECT_SND; if ((flags & SOAP_TCP_SELECT_ERR) && FD_ISSET(sk, efd)) r |= SOAP_TCP_SELECT_ERR; #ifdef WITH_SELF_PIPE if ((flags & SOAP_TCP_SELECT_PIP) && FD_ISSET(soap->pipe_fd[0], rfd)) { char ch; for (;;) { if (read(soap->pipe_fd[0], &ch, 1) == -1) { if (soap_socket_errno(soap->pipe_fd[0]) == SOAP_EAGAIN) break; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Self pipe read error\n")); return -1; } } r |= SOAP_TCP_SELECT_PIP; } #endif } else if (r == 0) { soap->errnum = 0; } return r; } #endif /******************************************************************************/ #ifndef WITH_NOIO static SOAP_SOCKET tcp_accept(struct soap *soap, SOAP_SOCKET sk, struct sockaddr *addr, int *len) { SOAP_SOCKET s; (void)soap; s = accept(sk, addr, (SOAP_SOCKLEN_T*)len); /* portability note: see SOAP_SOCKLEN_T definition in stdsoap2.h */ #ifdef WITH_SOCKET_CLOSE_ON_EXIT #ifdef WIN32 #ifndef UNDER_CE SetHandleInformation((HANDLE)s, HANDLE_FLAG_INHERIT, 0); #endif #else fcntl(s, F_SETFD, FD_CLOEXEC); #endif #endif return s; } #endif /******************************************************************************/ #ifndef WITH_NOIO static int tcp_disconnect(struct soap *soap) { #ifdef WITH_OPENSSL if (soap->ssl) { int r; if (soap->session) { SSL_SESSION_free(soap->session); soap->session = NULL; } if (*soap->host) { soap->session = SSL_get1_session(soap->ssl); if (soap->session) { soap_strcpy(soap->session_host, sizeof(soap->session_host), soap->host); soap->session_port = soap->port; } } r = SSL_shutdown(soap->ssl); /* SSL shutdown does not work when reads are pending, non-blocking */ if (r == 0) { while (SSL_want_read(soap->ssl)) { if (SSL_read(soap->ssl, NULL, 0) || soap_socket_errno(soap->socket) != SOAP_EAGAIN) { r = SSL_shutdown(soap->ssl); break; } } } if (r == 0) { if (soap_valid_socket(soap->socket)) { if (!soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_WR)) { #if !defined(WITH_LEAN) && !defined(WIN32) /* wait up to 5 seconds for close_notify to be sent by peer (if peer not present, this avoids calling SSL_shutdown() which has a lengthy return timeout) */ r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, 5); if (r <= 0) { soap->errnum = 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connection lost...\n")); soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; ERR_clear_error(); SSL_free(soap->ssl); soap->ssl = NULL; return SOAP_OK; } #else r = SSL_shutdown(soap->ssl); if (r <= 0) { 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; } } #endif } } } SSL_free(soap->ssl); soap->ssl = NULL; ERR_clear_error(); } #endif #ifdef WITH_GNUTLS if (soap->session) { gnutls_bye(soap->session, GNUTLS_SHUT_RDWR); gnutls_deinit(soap->session); soap->session = NULL; } #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) { gsk_secure_socket_shutdown(soap->ssl); gsk_secure_socket_close(&soap->ssl); } #endif if (soap_valid_socket(soap->socket) && !(soap->omode & SOAP_IO_UDP)) { soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_RDWR); soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_NOIO static int tcp_closesocket(struct soap *soap, SOAP_SOCKET sk) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Close socket=%d\n", (int)sk)); return soap_closesocket(sk); } #endif /******************************************************************************/ #ifndef WITH_NOIO static int tcp_shutdownsocket(struct soap *soap, SOAP_SOCKET sk, int how) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shutdown socket=%d how=%d\n", (int)sk, how)); return shutdown(sk, how); } #endif /******************************************************************************/ #ifndef WITH_NOIO SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_bind(struct soap *soap, const char *host, int port, int backlog) { #if defined(WITH_IPV6) struct addrinfo *addrinfo = NULL; struct addrinfo hints; struct addrinfo res; int err; int set = 1; int unset = 0; #elif !defined(WITH_LEAN) 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->errnum = 0; 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 = soap->bind_inet6 ? AF_INET6 : 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 (err || !addrinfo) { soap_set_receiver_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in soap_bind()", SOAP_TCP_ERROR); if (addrinfo) freeaddrinfo(addrinfo); return SOAP_INVALID_SOCKET; } res = *addrinfo; if (soap_memcpy((void*)&soap->peer.storage, sizeof(soap->peer.storage), (const void*)addrinfo->ai_addr, addrinfo->ai_addrlen)) { freeaddrinfo(addrinfo); soap->error = SOAP_EOM; return SOAP_INVALID_SOCKET; } soap->peerlen = addrinfo->ai_addrlen; res.ai_addr = &soap->peer.addr; res.ai_addrlen = soap->peerlen; freeaddrinfo(addrinfo); 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; } soap->port = port; #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) soap->socket = soap->master; #endif #ifdef WITH_SOCKET_CLOSE_ON_EXIT #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; } #ifndef UNDER_CE if (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) && (!((soap->imode | soap->omode) & SOAP_IO_UDP)) && setsockopt(soap->master, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int))) { 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 (soap->sndbuf > 0 && setsockopt(soap->master, SOL_SOCKET, SO_SNDBUF, (char*)&soap->sndbuf, 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 (soap->rcvbuf > 0 && setsockopt(soap->master, SOL_SOCKET, SO_RCVBUF, (char*)&soap->rcvbuf, 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 #ifdef TCP_FASTOPEN if (!(soap->omode & SOAP_IO_UDP) && setsockopt(soap->master, IPPROTO_TCP, TCP_FASTOPEN, (char*)&set, sizeof(int))) { /* silently ignore */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "setsockopt TCP_FASTOPEN failed in soap_bind()\n")); } #endif #endif #endif #ifdef WITH_IPV6 if (res.ai_family == AF_INET6 && setsockopt(soap->master, IPPROTO_IPV6, IPV6_V6ONLY, soap->bind_v6only ? (char*)&set : (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; } 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, bind failed\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.in); memset((void*)&soap->peer.in, 0, sizeof(soap->peer.in)); soap->peer.in.sin_family = AF_INET; soap->errmode = 2; if (host) { if (soap->fresolve(soap, host, &soap->peer.in.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.in.sin_addr.s_addr = htonl(INADDR_ANY); soap->peer.in.sin_port = htons((short)port); soap->errmode = 0; if (bind(soap->master, &soap->peer.addr, (int)soap->peerlen)) { soap->errnum = soap_socket_errno(soap->master); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host, bind failed\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, listen failed\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 /******************************************************************************/ #ifndef WITH_NOIO SOAP_FMAC1 int SOAP_FMAC2 soap_poll(struct soap *soap) { #ifndef WITH_LEAN int r; if (soap_valid_socket(soap->socket)) { r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_ALL, 0); if (r > 0 && (r & SOAP_TCP_SELECT_ERR)) r = -1; } else if (soap_valid_socket(soap->master)) { r = tcp_select(soap, soap->master, SOAP_TCP_SELECT_SND | SOAP_TCP_SELECT_ERR, 0); } else { return SOAP_OK; /* OK when no socket! */ } if (r > 0) { int t; #ifdef WITH_OPENSSL if ((soap->imode & SOAP_ENC_SSL) && soap->ssl) { if (soap_valid_socket(soap->socket) && (r & SOAP_TCP_SELECT_SND) && (!(r & SOAP_TCP_SELECT_RCV) || SSL_peek(soap->ssl, (char*)&t, 1) > 0)) return SOAP_OK; } else #endif { if (soap_valid_socket(soap->socket) && (r & SOAP_TCP_SELECT_SND) && (!(r & SOAP_TCP_SELECT_RCV) || recv(soap->socket, (char*)&t, 1, MSG_PEEK) > 0)) return SOAP_OK; } } else if (r < 0) { if ((soap_valid_socket(soap->master) && soap_socket_errno(soap->master) != SOAP_EINTR) || (soap_valid_socket(soap->socket) && soap_socket_errno(soap->socket) != SOAP_EINTR)) return soap_set_receiver_error(soap, tcp_error(soap), "select failed in soap_poll()", SOAP_TCP_ERROR); } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_poll: other end down on socket=%d select=%d\n", (int)soap->socket, r)); return SOAP_EOF; #else (void)soap; return SOAP_OK; #endif } #endif /******************************************************************************/ #ifndef WITH_NOIO SOAP_FMAC1 int SOAP_FMAC2 soap_ready(struct soap *soap) { #ifndef WITH_LEAN int r; if (!soap_valid_socket(soap->socket)) return SOAP_OK; /* OK when no socket! */ r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, 0); if (r > 0 && (r & SOAP_TCP_SELECT_ERR)) r = -1; if (r < 0 && soap_socket_errno(soap->socket) != SOAP_EINTR) return soap_set_receiver_error(soap, tcp_error(soap), "select failed in soap_ready()", SOAP_TCP_ERROR); if (r > 0) { char t; #ifdef WITH_OPENSSL if ((soap->imode & SOAP_ENC_SSL) && soap->ssl) { if (SSL_peek(soap->ssl, &t, 1) > 0) return SOAP_OK; } else #endif { if (recv(soap->socket, &t, 1, MSG_PEEK) > 0) return SOAP_OK; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "soap_ready: other end not ready to send on socket=%d select=%d\n", (int)soap->socket, r)); return SOAP_EOF; #else (void)soap; return SOAP_OK; #endif } #endif /******************************************************************************/ #ifndef WITH_NOIO SOAP_FMAC1 SOAP_SOCKET SOAP_FMAC2 soap_accept(struct soap *soap) { int n = (int)sizeof(soap->peer); int err; #ifndef WITH_LEAN int set = 1; #endif soap->error = SOAP_OK; memset((void*)&soap->peer, 0, sizeof(soap->peer)); soap->socket = SOAP_INVALID_SOCKET; soap->errmode = 0; soap->errnum = 0; soap->keep_alive = 0; if (!soap_valid_socket(soap->master)) { soap_set_receiver_error(soap, tcp_error(soap), "no master socket in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } #ifndef WITH_LEAN if ((soap->omode & SOAP_IO_UDP)) return soap->socket = soap->master; #endif for (;;) { if (soap->accept_timeout) { for (;;) { int r; r = tcp_select(soap, soap->master, SOAP_TCP_SELECT_ALL, soap->accept_timeout); if (r > 0) break; if (!r) { soap_set_receiver_error(soap, "Timeout", "accept failed in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } if (r < 0) { r = soap->errnum; if (r != SOAP_EINTR) { soap_closesock(soap); soap_set_receiver_error(soap, tcp_error(soap), "accept failed in soap_accept()", SOAP_TCP_ERROR); return SOAP_INVALID_SOCKET; } } } } n = (int)sizeof(soap->peer); soap->socket = soap->faccept(soap, soap->master, &soap->peer.addr, &n); soap->peerlen = (size_t)n; if (soap_valid_socket(soap->socket)) { #ifdef WITH_IPV6 char port[16]; struct addrinfo *res = NULL; struct addrinfo hints; memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_NUMERICHOST | AI_NUMERICSERV; getnameinfo(&soap->peer.addr, n, soap->host, sizeof(soap->host), port, sizeof(port), NI_NUMERICHOST | NI_NUMERICSERV); soap->ip = 0; soap->ip6[0] = 0; soap->ip6[1] = 0; soap->ip6[2] = 0; soap->ip6[3] = 0; if (getaddrinfo(soap->host, NULL, &hints, &res) == 0 && res) { struct sockaddr_storage result; (void)soap_memcpy(&result, sizeof(result), res->ai_addr, res->ai_addrlen); freeaddrinfo(res); if (result.ss_family == AF_INET6) { struct sockaddr_in6 *addr = (struct sockaddr_in6*)&result; struct in6_addr *inaddr = &addr->sin6_addr; int i; for (i = 0; i < 16; i++) soap->ip6[i/4] = (soap->ip6[i/4] << 8) + inaddr->s6_addr[i]; } else if (result.ss_family == AF_INET) { struct sockaddr_in *addr = (struct sockaddr_in*)&result; soap->ip = ntohl(addr->sin_addr.s_addr); soap->ip6[2] = 0xFFFF; soap->ip6[3] = soap->ip; } } soap->port = soap_strtol(port, NULL, 10); #else soap->ip = ntohl(soap->peer.in.sin_addr.s_addr); soap->ip6[0] = 0; soap->ip6[1] = 0; soap->ip6[2] = 0xFFFF; soap->ip6[3] = soap->ip; (SOAP_SNPRINTF(soap->host, sizeof(soap->host), 80), "%u.%u.%u.%u", (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF); soap->port = (int)ntohs(soap->peer.in.sin_port); /* does not return port number on some systems */ #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Accept socket=%d at port=%d from IP='%s'\n", (int)soap->socket, soap->port, soap->host)); #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; } } if ((soap->accept_flags & ~SO_LINGER) && setsockopt(soap->socket, SOL_SOCKET, soap->accept_flags & ~SO_LINGER, (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; } #ifndef UNDER_CE 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 (soap->sndbuf > 0 && setsockopt(soap->socket, SOL_SOCKET, SO_SNDBUF, (char*)&soap->sndbuf, 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 (soap->rcvbuf > 0 && setsockopt(soap->socket, SOL_SOCKET, SO_RCVBUF, (char*)&soap->rcvbuf, 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 (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 #endif soap->keep_alive = -(((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) != 0); if (soap->send_timeout || soap->recv_timeout) SOAP_SOCKNONBLOCK(soap->socket) else SOAP_SOCKBLOCK(soap->socket) 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; } } } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_closesock(struct soap *soap) { int status = soap->error; int err = SOAP_OK; soap->part = SOAP_END; #ifndef WITH_LEANER if (status && status < 200) /* attachment state is not to be trusted */ { soap->mime.first = NULL; soap->mime.last = NULL; soap->dime.first = NULL; soap->dime.last = NULL; } #endif if (soap->fdisconnect) err = soap->fdisconnect(soap); if (err || status == SOAP_EOF || status == SOAP_TCP_ERROR || status == SOAP_SSL_ERROR || !soap->keep_alive) { soap->keep_alive = 0; if (soap->fclose && (soap->error = soap->fclose(soap)) != SOAP_OK) return soap->error; if (err) return soap->error = err; } #ifdef WITH_ZLIB if (!(soap->mode & SOAP_MIME_POSTCHECK)) { 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; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_force_closesock(struct soap *soap) { soap->keep_alive = 0; if (soap_valid_socket(soap->socket) && soap->fclosesocket) { soap->fclosesocket(soap, soap->socket); soap->socket = SOAP_INVALID_SOCKET; } return soap->error; } /******************************************************************************/ #ifdef WITH_SELF_PIPE SOAP_FMAC1 void SOAP_FMAC2 soap_close_connection(struct soap *soap) { if (soap_valid_socket(soap->socket)) write(soap->pipe_fd[1], "1", 1); } #endif /******************************************************************************/ #ifndef WITH_NOIO 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 /******************************************************************************/ 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%s\n", soap->state == SOAP_COPY ? " copy" : "")); soap_free_temp(soap); while (soap->clist) { struct soap_clist *p = soap->clist->next; SOAP_FREE(soap, soap->clist); soap->clist = p; } if (soap->state == SOAP_INIT) soap->omode &= ~SOAP_IO_UDP; /* to force close the socket */ soap->keep_alive = 0; /* to force close the socket */ if (soap->master == soap->socket) /* do not close twice */ soap->master = SOAP_INVALID_SOCKET; soap_closesock(soap); #ifdef WITH_COOKIES soap_free_cookies(soap); #endif while (soap->plugins) { 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; #ifndef WITH_NOHTTP soap->fpost = http_post; soap->fget = http_get; soap->fput = http_put; soap->fpatch = http_patch; soap->fdel = http_del; soap->fopt = http_200; soap->fhead = http_200; 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->fsvalidate = NULL; soap->fwvalidate = NULL; soap->feltbegin = NULL; soap->feltendin = NULL; soap->feltbegout = NULL; soap->feltendout = NULL; soap->fprepareinitsend = NULL; soap->fprepareinitrecv = NULL; soap->fpreparesend = NULL; soap->fpreparerecv = NULL; soap->fpreparefinalsend = NULL; soap->fpreparefinalrecv = NULL; soap->ffiltersend = NULL; soap->ffilterrecv = 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; } } ERR_clear_error(); # if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER) /* OpenSSL libraries handle thread init and deinit */ # elif OPENSSL_VERSION_NUMBER >= 0x10000000L ERR_remove_thread_state(NULL); # else ERR_remove_state(0); # endif #endif #ifdef WITH_GNUTLS if (soap->state == SOAP_INIT) { if (soap->xcred) { gnutls_certificate_free_credentials(soap->xcred); soap->xcred = NULL; } if (soap->acred) { gnutls_anon_free_client_credentials(soap->acred); soap->acred = NULL; } if (soap->cache) { gnutls_priority_deinit(soap->cache); soap->cache = NULL; } if (soap->dh_params) { gnutls_dh_params_deinit(soap->dh_params); soap->dh_params = NULL; } # if GNUTLS_VERSION_NUMBER < 0x030300 if (soap->rsa_params) { gnutls_rsa_params_deinit(soap->rsa_params); soap->rsa_params = NULL; } #endif } if (soap->session) { gnutls_deinit(soap->session); soap->session = NULL; } #endif #ifdef WITH_SYSTEMSSL if (soap->ssl) gsk_secure_socket_close(&soap->ssl); if (soap->state == SOAP_INIT) if (soap->ctx) gsk_environment_close(&soap->ctx); #endif #ifdef WITH_C_LOCALE SOAP_FREELOCALE(soap); #endif #ifdef WITH_ZLIB if (soap->d_stream) { SOAP_FREE(soap, soap->d_stream); soap->d_stream = NULL; } if (soap->z_buf) { SOAP_FREE(soap, 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++) { soap_close_logfile(soap, i); if (soap->logfile[i]) { SOAP_FREE_UNMANAGED(soap->logfile[i]); soap->logfile[i] = NULL; } } #endif #ifdef WITH_SELF_PIPE close(soap->pipe_fd[0]); close(soap->pipe_fd[1]); #endif #ifdef SOAP_MEM_DEBUG soap_free_mht(soap); #endif soap->state = SOAP_NONE; } /******************************************************************************\ * * HTTP * \******************************************************************************/ #ifndef WITH_NOHTTP static int http_parse(struct soap *soap) { char header[SOAP_HDRLEN], *s; int err = SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Waiting for HTTP request/response...\n")); soap->fform = NULL; *soap->endpoint = '\0'; soap->bearer = NULL; #ifdef WITH_NTLM if (!soap->ntlm_challenge) #endif { soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; } #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif soap->proxy_from = NULL; soap->cors_origin = NULL; soap->cors_method = NULL; soap->cors_header = NULL; do { soap->length = 0; soap->http_content = NULL; soap->action = NULL; soap->status = 0; soap->body = 1; if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf))) { if (soap->error == SOAP_EOF) return SOAP_EOF; return soap->error = 414; } s = strchr(soap->msgbuf, ' '); if (s) { soap->status = (unsigned short)soap_strtoul(s, &s, 10); if (!soap_coblank((soap_wchar)*s)) soap->status = 0; } 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, try to 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'; soap->error = soap->fparsehdr(soap, header, s); if (soap->error) { if (soap->error < SOAP_STOP) return soap->error; err = soap->error; soap->error = SOAP_OK; } } } } while (soap->status == 100); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Finished HTTP header parsing, status = %d\n", soap->status)); s = strstr(soap->msgbuf, "HTTP/"); if (s && s[5] == '1' && s[6] == '.' && s[7] == '0') { soap->keep_alive = 0; /* HTTP 1.0 does not support keep-alive */ if (soap->status == 0 && (soap->omode & SOAP_IO) == SOAP_IO_CHUNK) /* soap->status == 0 for HTTP request */ soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE; /* HTTP 1.0 does not support chunked transfers */ } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Keep alive connection = %d\n", soap->keep_alive)); if (soap->status == 0) { size_t l = 0; if (s) { if (!strncmp(soap->msgbuf, "POST ", l = 5)) soap->status = SOAP_POST; else if (!strncmp(soap->msgbuf, "GET ", l = 4)) soap->status = SOAP_GET; else if (!strncmp(soap->msgbuf, "PUT ", l = 4)) soap->status = SOAP_PUT; else if (!strncmp(soap->msgbuf, "PATCH ", l = 4)) soap->status = SOAP_PATCH; else if (!strncmp(soap->msgbuf, "DELETE ", l = 7)) soap->status = SOAP_DEL; else if (!strncmp(soap->msgbuf, "HEAD ", l = 5)) soap->status = SOAP_HEAD; else if (!strncmp(soap->msgbuf, "OPTIONS ", l = 8)) soap->status = SOAP_OPTIONS; } if (s && soap->status) { size_t m, n, k; int r; while (soap->msgbuf[l] && soap_coblank((soap_wchar)soap->msgbuf[l])) l++; m = strlen(soap->endpoint); n = m + (s - soap->msgbuf) - l - 1; if (n >= sizeof(soap->endpoint)) n = sizeof(soap->endpoint) - 1; if (m > n) m = n; k = n - m + 1; if (k >= sizeof(soap->path)) k = sizeof(soap->path) - 1; while (k > 0 && soap_coblank((soap_wchar)soap->msgbuf[l + k - 1])) k--; if (soap_strncpy(soap->path, sizeof(soap->path), soap->msgbuf + l, k)) return soap->error = 414; if (*soap->path && *soap->path != '/') r = soap_strncpy(soap->endpoint, sizeof(soap->endpoint), soap->path, k); else r = soap_strncat(soap->endpoint, sizeof(soap->endpoint), soap->path, k); if (r) return soap->error = 414; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Target endpoint='%s' path='%s'\n", soap->endpoint, soap->path)); if (err) return soap->error = err; } else if (err) { return soap->error = err; } else if (s) { return soap->error = 405; } return SOAP_OK; } if ((soap->status >= 200 && soap->status <= 299) /* OK, Accepted, etc */ || soap->status == 400 /* Bad Request */ || soap->status == 500) /* Internal Server Error */ return soap->error = SOAP_OK; return soap->error = soap->status; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_parse_header(struct soap *soap, const char *key, const char *val) { if (!soap_tag_cmp(key, "Host")) { #if defined(WITH_OPENSSL) || defined(WITH_GNUTLS) if ((soap->imode & SOAP_ENC_SSL)) soap_strcpy(soap->endpoint, sizeof(soap->endpoint), "https://"); else #endif soap_strcpy(soap->endpoint, sizeof(soap->endpoint), "http://"); if (soap_strncat(soap->endpoint, sizeof(soap->endpoint), val, sizeof(soap->endpoint) - 9)) return soap->error = SOAP_HDR; } #ifndef WITH_LEANER else if (!soap_tag_cmp(key, "Content-Type")) { const char *action; soap->http_content = soap_strdup(soap, val); if (soap_http_header_attribute(soap, val, "application/dime")) soap->imode |= SOAP_ENC_DIME; else if (soap_http_header_attribute(soap, val, "multipart/related") || soap_http_header_attribute(soap, val, "multipart/form-data")) { const char *type; soap->mime.boundary = soap_strdup(soap, soap_http_header_attribute(soap, val, "boundary")); soap->mime.start = soap_strdup(soap, soap_http_header_attribute(soap, val, "start")); soap->imode |= SOAP_ENC_MIME; type = soap_http_header_attribute(soap, val, "type"); if (type && !strcmp(type, "application/xop+xml")) soap->imode |= SOAP_ENC_MTOM; } action = soap_http_header_attribute(soap, val, "action"); if (action) { if (*action == '"') { soap->action = soap_strdup(soap, action + 1); if (soap->action && *soap->action) 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_strtoull(val, NULL, 10); if (soap->length == 0) soap->body = 0; } 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_http_header_attribute(soap, val, "gzip")) soap->zlib_out = SOAP_ZLIB_GZIP; else #endif if (strchr(val, '*') || soap_http_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, "close")) soap->keep_alive = 0; } #if !defined(WITH_LEAN) || defined(WITH_NTLM) else if (!soap_tag_cmp(key, "Authorization") || !soap_tag_cmp(key, "Proxy-Authorization")) { #ifdef WITH_NTLM if (!soap_tag_cmp(val, "NTLM*")) { soap->ntlm_challenge = soap_strdup(soap, val + 4); } else #endif if (!soap_tag_cmp(val, "Bearer *")) { soap->bearer = soap_strdup(soap, val + 7); } else 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'; s = strchr(soap->tmpbuf, ':'); if (s) { *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_tag_cmp(key, "Proxy-Authenticate")) { #ifdef WITH_NTLM if (!soap_tag_cmp(val, "NTLM*")) soap->ntlm_challenge = soap_strdup(soap, val + 4); else #endif soap->authrealm = soap_strdup(soap, soap_http_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_OK || (soap->error = soap->fposthdr(soap, NULL, NULL)) != SOAP_OK) return soap->error; } } #endif else if (!soap_tag_cmp(key, "SOAPAction")) { if (*val == '"') { soap->action = soap_strdup(soap, val + 1); if (*soap->action) soap->action[strlen(soap->action) - 1] = '\0'; } else soap->action = soap_strdup(soap, val); } else if (!soap_tag_cmp(key, "Location")) { soap_strcpy(soap->endpoint, sizeof(soap->endpoint), val); } else if (!soap_tag_cmp(key, "X-Forwarded-For")) { soap->proxy_from = soap_strdup(soap, val); } else if (!soap_tag_cmp(key, "Origin")) { soap->origin = soap_strdup(soap, val); soap->cors_origin = soap->cors_allow; } else if (!soap_tag_cmp(key, "Access-Control-Request-Method")) { soap->cors_method = soap_strdup(soap, val); } else if (!soap_tag_cmp(key, "Access-Control-Request-Headers")) { soap->cors_header = 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 /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) SOAP_FMAC1 const char* SOAP_FMAC2 soap_http_header_attribute(struct soap *soap, const char *line, const char *key) { const char *s = line; if (s) { while (*s) { 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 /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) SOAP_FMAC1 const char* SOAP_FMAC2 soap_decode_key(char *buf, size_t len, const char *val) { return soap_decode(buf, len, val, "=,;"); } #endif /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) 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 /******************************************************************************/ #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) static const char * soap_decode(char *buf, size_t len, const char *val, const char *sep) { const char *s; char *t = buf; size_t i = len; for (s = val; *s; s++) if (*s != ' ' && *s != '\t' && !strchr(sep, *s)) break; if (len > 0) { if (*s == '"') { s++; while (*s && *s != '"' && --i) *t++ = *s++; } else { while (*s && !strchr(sep, *s) && --i) { if (*s == '%' && s[1] && s[2]) { *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++; } } buf[len - 1] = '\0'; /* appease static checkers that get confused */ } *t = '\0'; while (*s && !strchr(sep, *s)) s++; return s; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static const char* http_error(struct soap *soap, int status) { const char *msg = SOAP_STR_EOS; (void)soap; (void)status; #ifndef WITH_LEAN msg = soap_code_str(h_http_error_codes, status); if (!msg) msg = SOAP_STR_EOS; #endif return msg; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_get(struct soap *soap) { (void)soap; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP GET request\n")); return SOAP_GET_METHOD; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_put(struct soap *soap) { (void)soap; return SOAP_PUT_METHOD; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_patch(struct soap *soap) { (void)soap; return SOAP_PATCH_METHOD; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_del(struct soap *soap) { (void)soap; return SOAP_DEL_METHOD; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_200(struct soap *soap) { if (soap->origin && soap->cors_method) /* CORS Origin and Access-Control-Request-Method headers */ { soap->cors_origin = soap->cors_allow; /* modify this code or hook your own soap->fopt() callback with logic */ soap->cors_methods = "GET, PUT, PATCH, POST, HEAD, OPTIONS"; soap->cors_headers = soap->cors_header; } return soap_send_empty_response(soap, 200); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_post(struct soap *soap, const char *endpoint, const char *host, int port, const char *path, const char *action, ULONG64 count) { const char *s; int err; size_t l; switch (soap->status) { case SOAP_GET: s = "GET"; break; case SOAP_PUT: s = "PUT"; break; case SOAP_PATCH: s = "PATCH"; break; case SOAP_DEL: s = "DELETE"; break; case SOAP_CONNECT: s = "CONNECT"; break; case SOAP_HEAD: s = "HEAD"; break; case SOAP_OPTIONS: s = "OPTIONS"; break; default: s = "POST"; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP %s to %s\n", s, endpoint ? endpoint : "(null)")); if (!endpoint || (soap_tag_cmp(endpoint, "http:*") && soap_tag_cmp(endpoint, "https:*") && soap_tag_cmp(endpoint, "httpg:*"))) return SOAP_OK; /* set l to prevent overruns ('host' and 'soap->host' are substrings of 'endpoint') */ l = strlen(endpoint) + strlen(soap->http_version) + 80; if (l > sizeof(soap->tmpbuf)) return soap->error = SOAP_EOM; if (soap->status == SOAP_CONNECT) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s %s:%d HTTP/%s", s, soap->host, soap->port, soap->http_version); else if (soap->proxy_host && endpoint) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s %s HTTP/%s", s, endpoint, soap->http_version); else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s /%s HTTP/%s", s, (*path == '/' ? path + 1 : path), soap->http_version); err = soap->fposthdr(soap, soap->tmpbuf, NULL); if (err) return err; #ifdef WITH_OPENSSL if ((soap->ssl && port != 443) || (!soap->ssl && port != 80)) #else if (port != 80) #endif { #ifdef WITH_IPV6 if (*host != '[' && strchr(host, ':')) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "[%s]:%d", host, port); /* RFC 2732 */ else #endif (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "%s:%d", host, port); } else { #ifdef WITH_IPV6 if (*host != '[' && strchr(host, ':')) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l), "[%s]", host); /* RFC 2732 */ else #endif soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), host); } err = soap->fposthdr(soap, "Host", soap->tmpbuf); if (err) return err; err = soap->fposthdr(soap, "User-Agent", "gSOAP/2.8"); if (err) return err; if (soap->origin) { err = soap->fposthdr(soap, "Origin", soap->origin); if (err) return err; if (soap->status == SOAP_OPTIONS) { err = soap->fposthdr(soap, "Access-Control-Request-Method", soap->cors_method ? soap->cors_method : "POST"); if (err) return err; if (soap->cors_header) { err = soap->fposthdr(soap, "Access-Control-Request-Headers", soap->cors_header); if (err) return err; } } } err = soap_puthttphdr(soap, SOAP_OK, count); if (err) return err; #ifndef WITH_LEANER if ((soap->imode & SOAP_ENC_MTOM)) { err = soap->fposthdr(soap, "Accept", "multipart/related,application/xop+xml,*/*;q=0.8"); if (err) return err; } #endif #ifdef WITH_ZLIB #ifdef WITH_GZIP err = soap->fposthdr(soap, "Accept-Encoding", "gzip,deflate"); #else err = soap->fposthdr(soap, "Accept-Encoding", "deflate"); #endif if (err) return err; #endif #if !defined(WITH_LEAN) || defined(WITH_NTLM) if (soap->bearer) { l = strlen(soap->bearer); (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l + 1), "Bearer %s", soap->bearer); err = soap->fposthdr(soap, "Authorization", soap->tmpbuf); if (err) return err; } #ifdef WITH_NTLM if (soap->ntlm_challenge) { l = strlen(soap->ntlm_challenge); if (l) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), l + 5), "NTLM %s", soap->ntlm_challenge); if (soap->proxy_host) { err = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf); if (err) return err; } else { err = soap->fposthdr(soap, "Authorization", soap->tmpbuf); if (err) return err; } } } else { #endif if (soap->userid && soap->passwd) { soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "Basic "); (SOAP_SNPRINTF(soap->tmpbuf + 262, sizeof(soap->tmpbuf) - 262, strlen(soap->userid) + strlen(soap->passwd) + 1), "%s:%s", soap->userid, soap->passwd); soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, (int)strlen(soap->tmpbuf + 262)); err = soap->fposthdr(soap, "Authorization", soap->tmpbuf); if (err) return err; } if (soap->proxy_userid && soap->proxy_passwd) { soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "Basic "); (SOAP_SNPRINTF(soap->tmpbuf + 262, sizeof(soap->tmpbuf) - 262, strlen(soap->proxy_userid) + strlen(soap->proxy_passwd) + 1), "%s:%s", soap->proxy_userid, soap->proxy_passwd); soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, (int)strlen(soap->tmpbuf + 262)); err = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf); if (err) return err; } #ifdef WITH_NTLM } #endif #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 (action && soap->status != SOAP_GET && soap->status != SOAP_DEL) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(action) + 2), "\"%s\"", action); err = soap->fposthdr(soap, "SOAPAction", soap->tmpbuf); if (err) return err; } return soap->fposthdr(soap, NULL, NULL); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP static int http_send_header(struct soap *soap, const char *s) { 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 /******************************************************************************/ #ifndef WITH_NOHTTP 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 /******************************************************************************/ #ifndef WITH_NOHTTP static int http_response(struct soap *soap, int status, ULONG64 count) { int err; char http[32]; int code = status; const char *line; #ifdef WMW_RPM_IO if (soap->rpmreqid) httpOutputEnable(soap->rpmreqid); if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket) || soap->recvfd != 0 || soap->sendfd != 1 || soap->os) /* RPM behaves as if standalone */ #else if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket) #ifndef UNDER_CE || soap->recvfd != 0 || soap->sendfd != 1 #else || soap->recvfd != stdin || soap->sendfd != stdout #endif || soap->os) /* standalone server application (over sockets), not CGI (over stdin/out) */ #endif (SOAP_SNPRINTF(http, sizeof(http), strlen(soap->http_version) + 5), "HTTP/%s", soap->http_version); else soap_strcpy(http, sizeof(http), "Status:"); if (status >= SOAP_FILE && status < SOAP_FILE + 600) { code = status - SOAP_FILE; if (code == 0) code = 200; } else if (!status || status == SOAP_HTML) { if (count || ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK)) code = 200; else code = 202; } else if (status < 200 || status >= 600) { const char *s = *soap_faultcode(soap); if (status >= SOAP_GET_METHOD && status <= SOAP_HTTP_METHOD) code = 405; else if (soap->version == 2 && (!s || !strcmp(s, "SOAP-ENV:Sender"))) code = 400; else code = 500; } line = http_error(soap, code); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "HTTP Status = %d %s\n", code, line)); (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), sizeof(http) + 22 + strlen(line)), "%s %d %s", http, code, line); err = soap->fposthdr(soap, soap->tmpbuf, NULL); if (err) return err; #ifndef WITH_LEAN if (status == 401) { (SOAP_SNPRINTF_SAFE(soap->tmpbuf, sizeof(soap->tmpbuf)), "Basic realm=\"%s\"", (soap->authrealm && strlen(soap->authrealm) + 14 < sizeof(soap->tmpbuf)) ? soap->authrealm : "gSOAP Web Service"); err = soap->fposthdr(soap, "WWW-Authenticate", soap->tmpbuf); if (err) return err; } else if ((status >= 301 && status <= 303) || status == 307) { err = soap->fposthdr(soap, "Location", soap->endpoint); if (err) return err; } #endif err = soap->fposthdr(soap, "Server", "gSOAP/2.8"); if (err) return err; if (soap->cors_origin) { err = soap->fposthdr(soap, "Access-Control-Allow-Origin", soap->cors_origin); if (err) return err; err = soap->fposthdr(soap, "Access-Control-Allow-Credentials", "true"); if (err) return err; if (soap->cors_methods) { err = soap->fposthdr(soap, "Access-Control-Allow-Methods", soap->cors_methods); if (err) return err; if (soap->cors_headers) { err = soap->fposthdr(soap, "Access-Control-Allow-Headers", soap->cors_headers); if (err) return err; } } } if (soap->x_frame_options) { err = soap->fposthdr(soap, "X-Frame-Options", soap->x_frame_options); if (err) return err; } soap->cors_origin = NULL; soap->cors_methods = NULL; soap->cors_headers = NULL; err = soap_puthttphdr(soap, status, count); if (err) return err; #ifdef WITH_COOKIES if (soap_putsetcookies(soap)) return soap->error; soap_free_cookies(soap); #endif return soap->fposthdr(soap, NULL, NULL); } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_response(struct soap *soap, int status) { ULONG64 count; if (!(soap->omode & (SOAP_ENC_PLAIN | SOAP_IO_STORE /* this tests for chunking too */)) && (status == SOAP_HTML || (status >= SOAP_FILE && status < SOAP_FILE + 600))) soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE; soap->status = status; count = soap_count_attachments(soap); if (soap_init_send(soap)) return soap->error; #ifndef WITH_NOHTTP if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_PLAIN)) { int k = soap->mode; soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB); if ((k & SOAP_IO) != SOAP_IO_FLUSH) soap->mode |= SOAP_IO_BUFFER; soap->error = soap->fresponse(soap, status, count); if (soap->error) return soap->error; #ifndef WITH_LEANER if ((k & SOAP_IO) == SOAP_IO_CHUNK) { if (soap_flush(soap)) return soap->error; } #endif soap->mode = k; } #endif #ifndef WITH_LEANER if (soap_begin_attachments(soap)) return soap->error; #endif return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_extend_url(struct soap *soap, const char *s, const char *t) { if (s) soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), s); else *soap->msgbuf = '\0'; if (t && (*t == '/' || *t == '?')) { char *r = strchr(soap->msgbuf, '?'); if (r) { if (*t == '?') { soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), "&"); soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), t + 1); } else /* *t == '/' */ { size_t l = r - soap->msgbuf; *r = '\0'; soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), t); if (s) soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), s + l); } } else { soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), t); } } return soap->msgbuf; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_extend_url_query(struct soap *soap, const char *s, const char *t) { (void)soap_extend_url(soap, s, t); /* fills and returns soap->msgbuf */ if (strchr(soap->msgbuf, '?')) soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), "&"); else soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), "?"); return soap->msgbuf; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_url_query(struct soap *soap, const char *s, const char *t) { size_t n = strlen(s); if (n) { char *r = soap->msgbuf; size_t k = n - (s[n-1] == '='); while ((r = strchr(r, '{')) != NULL) if (!strncmp(++r, s, k) && r[k] == '}') break; if (r) { size_t m = t ? strlen(t) : 0; (void)soap_memmove(r + m - 1, soap->msgbuf + sizeof(soap->msgbuf) - (r + n + 1), r + k + 1, strlen(r + k + 1) + 1); if (m) (void)soap_memmove(r - 1, soap->msgbuf + sizeof(soap->msgbuf) - (r - 1), t, m); } else { soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), s); if (t) { int m = (int)strlen(soap->msgbuf); /* msgbuf length is max SOAP_TMPLEN or just 1024 bytes */ (void)soap_encode_url(t, soap->msgbuf + m, (int)sizeof(soap->msgbuf) - m); } soap_strcat(soap->msgbuf, sizeof(soap->msgbuf), "&"); } } } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_encode_url(const char *s, char *t, int len) { int c; int n = len; if (s && n > 0) { while ((c = *s++) && --n > 0) { if (c == '-' || c == '.' || (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || c == '_' || (c >= 'a' && c <= 'z') || 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 const char* SOAP_FMAC2 soap_encode_url_string(struct soap *soap, const char *s) { if (s) { int n = 3 * (int)strlen(s) + 1; char *t = (char*)soap_malloc(soap, n); if (t) { (void)soap_encode_url(s, t, n); return t; } } return SOAP_STR_EOS; } /******************************************************************************\ * * HTTP Cookies RFC 6265 * \******************************************************************************/ #ifdef WITH_COOKIES SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_cookie(struct soap *soap, const char *name, const char *domain, const char *path) { return soap_cookie_env(soap, name, domain, path, 0); } /******************************************************************************/ SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_cookie_env(struct soap *soap, const char *name, const char *domain, const char *path, short env) { struct soap_cookie *p; if (!domain && !env) domain = soap->cookie_domain; if (!path) path = soap->cookie_path; if (!path) path = SOAP_STR_EOS; else if (*path == '/') path++; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Search cookie='%s' domain='%s' path='%s' env=%hd\n", name, domain ? domain : "(null)", path ? path : "(null)", env)); 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 ((!env || p->env) && !strcmp(p->name, name) && (!domain || (domain && p->domain && !strcmp(p->domain, domain))) && (!path || (path && p->path && !strncmp(p->path, path, strlen(p->path))))) 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) { q = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie)); if (q) { size_t l = strlen(name) + 1; q->name = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) q->name = (char*)SOAP_MALLOC(soap, l); if (q->name) (void)soap_memcpy(q->name, l, name, l); 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) { if (!value || strcmp(value, q->value)) { SOAP_FREE(soap, q->value); q->value = NULL; } } if (value && *value && !q->value) { size_t l = strlen(value) + 1; q->value = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) q->value = (char*)SOAP_MALLOC(soap, l); if (q->value) soap_strcpy(q->value, l, value); } if (q->domain) { if (!domain || strcmp(domain, q->domain)) { SOAP_FREE(soap, q->domain); q->domain = NULL; } } if (domain && !q->domain) { size_t l = strlen(domain) + 1; q->domain = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) q->domain = (char*)SOAP_MALLOC(soap, l); if (q->domain) soap_strcpy(q->domain, l, domain); } if (q->path) { if (!path || strncmp(path, q->path, strlen(q->path))) { SOAP_FREE(soap, q->path); q->path = NULL; } } if (path && !q->path) { size_t l = strlen(path) + 1; q->path = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) q->path = (char*)SOAP_MALLOC(soap, l); if (q->path) soap_strcpy(q->path, l, 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) path = SOAP_STR_EOS; else if (*path == '/') path++; for (p = &soap->cookies, q = *p; q; q = *p) { if (!strcmp(q->name, name) && (!q->domain || !strcmp(q->domain, domain)) && (!q->path || !strncmp(q->path, path, strlen(q->path)))) { 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 p = &q->next; } } /******************************************************************************/ SOAP_FMAC1 const char * SOAP_FMAC2 soap_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; p = soap_cookie(soap, name, domain, path); if (p) return p->value; return NULL; } /******************************************************************************/ SOAP_FMAC1 const char * SOAP_FMAC2 soap_env_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; p = soap_cookie(soap, name, domain, path); if (p && 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; p = soap_cookie(soap, name, domain, path); if (p) return (time_t)p->expire; return -1; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_expire(struct soap *soap, const char *name, long maxage, const char *domain, const char *path) { struct soap_cookie *p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set cookie expiration max-age=%ld: cookie='%s' domain='%s' path='%s'\n", maxage, name, domain ? domain : "(null)", path ? path : "(null)")); p = soap_cookie(soap, name, domain, path); if (p) { p->maxage = maxage; p->modified = 1; return SOAP_OK; } return SOAP_ERR; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_secure(struct soap *soap, const char *name, const char *domain, const char *path) { struct soap_cookie *p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set cookie secure: cookie='%s' domain='%s' path='%s'\n", name, domain ? domain : "(null)", path ? path : "(null)")); p = soap_cookie(soap, name, domain, path); if (p) { p->secure = 1; 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; p = soap_cookie(soap, name, domain, path); if (p) { 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; p = soap_cookie(soap, name, domain, path); if (p) { 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 ) && p->name && p->value && *p->name && *p->value) { s = tmp; s += soap_encode_url(p->name, s, 3967); *s++ = '='; s += soap_encode_url(p->value, s, 3968 - (int)(s-tmp)); t = p->domain ? p->domain : soap->cookie_domain; if (t && (int)strlen(t) < 3968 - (int)(s-tmp)) { soap_strcpy(s, 4096 - (s-tmp), ";Domain="); s += 8; soap_strcpy(s, 4096 - (s-tmp), t); s += strlen(s); } t = p->path ? p->path : soap->cookie_path; if (t && (int)strlen(t) < 3976 - (int)(s-tmp)) { soap_strcpy(s, 4096 - (s-tmp), ";Path=/"); s += 7; if (*t == '/') t++; if (strchr(t, '%')) /* already URL encoded? */ { soap_strcpy(s, 4096 - (s-tmp), t); s += strlen(s); } else { s += soap_encode_url(t, s, 4096 - (int)(s-tmp)); } } if (p->version > 0 && s-tmp < 3983) { (SOAP_SNPRINTF(s, 4096 - (s-tmp), 29), ";Version=%u", p->version); s += strlen(s); } if (p->maxage >= 0 && s-tmp < 4012) { (SOAP_SNPRINTF(s, 4096 - (s-tmp), 29), ";Max-Age=%ld", p->maxage); s += strlen(s); } #if !defined(WITH_LEAN) #if defined(HAVE_GMTIME_R) || defined(HAVE_GMTIME) if (p->maxage >= 0 && s-tmp < 4041) { time_t n = time(NULL) + p->maxage; struct tm T, *pT = &T; size_t l = 0; /* format is Wed, 09 Jun 2021 10:18:14 GMT */ #if defined(HAVE_GMTIME_R) if (gmtime_r(&n, pT) != SOAP_FUNC_R_ERR) l = strftime(s, 4096 - (s-tmp), ";Expires=%a, %d %b %Y %H:%M:%S GMT", pT); #else pT = gmtime(&n); if (pT) l = strftime(s, 4096 - (s-tmp), ";Expires=%a, %d %b %Y %H:%M:%S GMT", pT); #endif s += l; } #endif #endif if (s-tmp < 4079 && (p->secure #ifdef WITH_OPENSSL || soap->ssl #endif )) { soap_strcpy(s, 4096 - (s-tmp), ";Secure"); s += strlen(s); } if (s-tmp < 4086) soap_strcpy(s, 4096 - (s-tmp), ";HttpOnly"); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set-Cookie: %s\n", tmp)); soap->error = soap->fposthdr(soap, "Set-Cookie", tmp); if (soap->error) 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; char *s, tmp[4096]; unsigned int version = 0; time_t now = time(NULL); if (!domain || !path) return SOAP_OK; s = tmp; 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 >= (time_t)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; if (!tcp_gethostbyname(soap, (char*)domain, &hostent, NULL)) { const char *r = hostent.h_name; if (*t == '.') { size_t k = strlen(hostent.h_name); if (k >= n) r = hostent.h_name + k - n; } flag = !strncmp(t, r, n); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Domain cookie %s host %s (match=%d)\n", t, r, flag)); } } #endif if (flag && (!q->path || !strncmp(q->path, path, strlen(q->path))) #ifndef WITH_INSECURE_COOKIES && (!q->secure || secure) #endif ) { size_t n = 12; if (q->name) n += 3*strlen(q->name); if (q->value && *q->value) n += 3*strlen(q->value) + 1; if (q->path && *q->path) n += strlen(q->path) + 9; if (q->domain) n += strlen(q->domain) + 11; if (s + n >= tmp + sizeof(tmp)) { if (s == tmp) return SOAP_OK; /* header too big, cannot split */ /* split up HTTP header */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie: %s\n", tmp)); soap->error = soap->fposthdr(soap, "Cookie", tmp); if (soap->error) return soap->error; s = tmp; } else if (s != tmp) { *s++ = ';'; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending cookie %s=%s path=\"/%s\" domain=\"%s\"\n", q->name ? q->name : "(null)", q->value ? q->value : "(null)", q->path ? q->path : "(null)", q->domain ? q->domain : "(null)")); if (q->version != version && (s-tmp) + (size_t)36 < sizeof(tmp)) { (SOAP_SNPRINTF_SAFE(s, sizeof(tmp) - (s-tmp)), "$Version=%u;", q->version); version = q->version; s += strlen(s); } if (q->name && (s-tmp) + strlen(q->name) + (size_t)15 < sizeof(tmp)) { s += soap_encode_url(q->name, s, (int)(tmp+sizeof(tmp)-s)-15); } if (q->value && *q->value && (s-tmp) + strlen(q->value) + (size_t)16 < sizeof(tmp)) { *s++ = '='; s += soap_encode_url(q->value, s, (int)(tmp+sizeof(tmp)-s)-16); } if (q->path && (s-tmp) + strlen(q->path) + (size_t)36 < sizeof(tmp)) { (SOAP_SNPRINTF_SAFE(s, sizeof(tmp) - (s-tmp)), ";$Path=\"/%s\"", (*q->path == '/' ? q->path + 1 : q->path)); s += strlen(s); } if (q->domain && (s-tmp) + strlen(q->domain) + (size_t)36 < sizeof(tmp)) { (SOAP_SNPRINTF_SAFE(s, sizeof(tmp) - (s-tmp)), ";$Domain=\"%s\"", q->domain); s += strlen(s); } } p = &q->next; } } if (s != tmp) { soap->error = soap->fposthdr(soap, "Cookie", tmp); if (soap->error) return soap->error; } 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")) { s = soap_decode_val(tmp, sizeof(tmp), s); if (s) { if (p) p->version = (int)soap_strtol(tmp, NULL, 10); else version = (int)soap_strtol(tmp, NULL, 10); } } else if (!soap_tag_cmp(tmp, "$Path")) { s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { size_t l = strlen(tmp) + 1; t = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) t = (char*)SOAP_MALLOC(soap, l); if (t) (void)soap_memcpy((void*)t, l, (const void*)tmp, l); } 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) { size_t l = strlen(tmp) + 1; t = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) t = (char*)SOAP_MALLOC(soap, l); if (t) (void)soap_memcpy((void*)t, l, (const void*)tmp, l); } 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) { size_t l = strlen(tmp) + 1; p->path = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) p->path = (char*)SOAP_MALLOC(soap, l); if (p->path) (void)soap_memcpy((void*)p->path, l, (const void*)tmp, l); } 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) { size_t l = strlen(tmp) + 1; p->domain = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) p->domain = (char*)SOAP_MALLOC(soap, l); if (p->domain) (void)soap_memcpy((void*)p->domain, l, (const void*)tmp, l); } else { p->domain = NULL; } } else if (p && !soap_tag_cmp(tmp, "Version")) { s = soap_decode_val(tmp, sizeof(tmp), s); p->version = (unsigned int)soap_strtoul(tmp, NULL, 10); } else if (p && !soap_tag_cmp(tmp, "Max-Age")) { s = soap_decode_val(tmp, sizeof(tmp), s); p->expire = (ULONG64)(now + soap_strtol(tmp, NULL, 10)); } else if (p && !soap_tag_cmp(tmp, "Expires")) { if (*s == '=') { s = soap_decode(tmp, sizeof(tmp), s + 1, ";"); if (!p->expire && strlen(tmp) >= 23) { char a[3]; struct tm T; static const char mns[] = "anebarprayunulugepctovec"; const char *t = strchr(tmp, ' '); if (t) { a[2] = '\0'; memset((void*)&T, 0, sizeof(T)); if (t[1] >= 'A') { /* format is Sun Nov 6 08:49:37 94 */ a[0] = t[2]; a[1] = t[3]; T.tm_mon = (int)(strstr(mns, a) - mns) / 2; a[0] = t[5]; a[1] = t[6]; T.tm_mday = (int)soap_strtol(a, NULL, 10); if (t[17] && t[18] && t[19] != ' ') t += 2; /* format is Sun Nov 6 08:49:37 2017 - ANSI-C */ a[0] = t[17]; a[1] = t[18]; T.tm_year = 100 + (int)soap_strtol(a, NULL, 10); t += 6; } else { /* format is Sunday, 06-Nov-17 08:49:37 GMT - RFC 850 */ a[0] = t[1]; a[1] = t[2]; T.tm_mday = (int)soap_strtol(a, NULL, 10); a[0] = t[5]; a[1] = t[6]; T.tm_mon = (int)(strstr(mns, a) - mns) / 2; if (t[10] != ' ') t += 2; /* format is Wed, 09 Jun 2021 10:18:14 GMT - RFC 822 */ a[0] = t[8]; a[1] = t[9]; T.tm_year = 100 + (int)soap_strtol(a, NULL, 10); t += 11; } a[0] = t[0]; a[1] = t[1]; T.tm_hour = (int)soap_strtol(a, NULL, 10); a[0] = t[3]; a[1] = t[4]; T.tm_min = (int)soap_strtol(a, NULL, 10); a[0] = t[6]; a[1] = t[7]; T.tm_sec = (int)soap_strtol(a, NULL, 10); p->expire = (ULONG64)soap_timegm(&T); } } } } else if (p && !soap_tag_cmp(tmp, "Secure")) { p->secure = 1; s = soap_decode_val(tmp, sizeof(tmp), s); } else if (p && !soap_tag_cmp(tmp, "HttpOnly")) { s = soap_decode_val(tmp, sizeof(tmp), s); } else if (p && !soap_tag_cmp(tmp, "Comment")) { s = soap_decode_val(tmp, sizeof(tmp), s); } else if (*tmp) { if (p) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie='%s' value='%s' domain='%s' path='%s' expire=" SOAP_ULONG_FORMAT " secure=%d\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->expire, p->secure)); q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path); if (q) { 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); } p = (struct soap_cookie*)SOAP_MALLOC(soap, sizeof(struct soap_cookie)); if (p) { size_t l = strlen(tmp) + 1; p->name = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) p->name = (char*)SOAP_MALLOC(soap, l); if (p->name) (void)soap_memcpy(p->name, l, tmp, l); s = soap_decode_val(tmp, sizeof(tmp), s); if (*tmp) { l = strlen(tmp) + 1; p->value = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) p->value = (char*)SOAP_MALLOC(soap, l); if (p->value) (void)soap_memcpy((void*)p->value, l, (const void*)tmp, l); } else { p->value = NULL; } if (domain) { p->domain = domain; } else { p->domain = NULL; } if (path) { p->path = path; } else if (*soap->path) { l = strlen(soap->path) + 1; p->path = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) p->path = (char*)SOAP_MALLOC(soap, l); if (p->path) (void)soap_memcpy((void*)p->path, l, (const void*)soap->path, l); } else { p->path = (char*)SOAP_MALLOC(soap, 2); if (p->path) (void)soap_memcpy((void*)p->path, 2, (const void*)"/", 2); } p->expire = 0; p->secure = 0; p->version = version; } } } if (p) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie='%s' value='%s' domain='%s' path='%s' expire=" SOAP_ULONG_FORMAT " secure=%d\n", p->name, p->value ? p->value : "(null)", p->domain ? p->domain : "(null)", p->path ? p->path : "(null)", p->expire, p->secure)); q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path); if (q) { 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] */ s = getenv("HTTP_COOKIE"); if (!s) 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; (void)copy; q = &r; for (p = soap->cookies; p; p = p->next) { *q = (struct soap_cookie*)SOAP_MALLOC(copy, sizeof(struct soap_cookie)); if (!*q) return r; **q = *p; if (p->name) { size_t l = strlen(p->name) + 1; (*q)->name = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) (*q)->name = (char*)SOAP_MALLOC(copy, l); if ((*q)->name) (void)soap_memcpy((*q)->name, l, p->name, l); } if (p->value) { size_t l = strlen(p->value) + 1; (*q)->value = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) (*q)->value = (char*)SOAP_MALLOC(copy, l); if ((*q)->value) (void)soap_memcpy((*q)->value, l, p->value, l); } if (p->domain) { size_t l = strlen(p->domain) + 1; (*q)->domain = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) (*q)->domain = (char*)SOAP_MALLOC(copy, l); if ((*q)->domain) (void)soap_memcpy((*q)->domain, l, p->domain, l); } if (p->path) { size_t l = strlen(p->path) + 1; (*q)->path = NULL; if (SOAP_MAXALLOCSIZE <= 0 || l <= SOAP_MAXALLOCSIZE) (*q)->path = (char*)SOAP_MALLOC(copy, l); if ((*q)->path) (void)soap_memcpy((*q)->path, l, p->path, l); } 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 */ /******************************************************************************/ SOAP_FMAC1 size_t SOAP_FMAC2 soap_hash(const char *s) { size_t h = 0; while (*s) h = 65599*h + *s++; return h % SOAP_IDHASH; } /******************************************************************************/ static void soap_init_pht(struct soap *soap) { int i; soap->pblk = NULL; soap->pidx = 0; for (i = 0; i < (int)SOAP_PTRHASH; i++) soap->pht[i] = NULL; } /******************************************************************************/ SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_versioning(soap_new)(soap_mode imode, soap_mode omode) { struct soap *soap; #ifdef __cplusplus soap = SOAP_NEW_UNMANAGED(struct soap); #else soap = (struct soap*)SOAP_MALLOC_UNMANAGED(sizeof(struct soap)); #endif if (soap) soap_versioning(soap_init)(soap, imode, omode); return soap; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_free(struct soap *soap) { soap_done(soap); #ifdef __cplusplus SOAP_DELETE_UNMANAGED(soap); #else SOAP_FREE_UNMANAGED(soap); #endif } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_del(struct soap *soap) { free(soap); } /******************************************************************************/ static void soap_free_pht(struct soap *soap) { struct soap_pblk *pb, *next; 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; } /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_embed(struct soap *soap, const void *p, const void *a, int n, int t) { int id; struct soap_plist *pp; if (soap->version == 2) soap->encoding = 1; if (!p || (!soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH)) || (soap->mode & SOAP_XML_TREE)) return 0; 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_is_single(soap, pp)) return 0; soap_set_embedded(soap, pp); } return id; } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_lookup(struct soap *soap, const void *p, int type, struct soap_plist **ppp) { 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; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_pointer_enter(struct soap *soap, const void *p, const void *a, int n, int type, struct soap_plist **ppp) { size_t h; struct soap_plist *pp; (void)n; if (!soap->pblk || soap->pidx >= SOAP_PTRBLK) { 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); else h = soap_hash_ptr(p); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pointer enter location=%p array=%p size=%lu type=%d id=%d\n", p, a, (unsigned long)n, type, soap->idnum+1)); pp->next = soap->pht[h]; pp->type = type; pp->mark1 = 0; pp->mark2 = 0; pp->ptr = p; pp->dup = NULL; pp->array = a; pp->size = n; soap->pht[h] = pp; pp->id = ++soap->idnum; return pp->id; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_array_pointer_lookup(struct soap *soap, const void *p, const void *a, int n, int type, struct soap_plist **ppp) { struct soap_plist *pp; *ppp = NULL; if (!p || !a) return 0; for (pp = soap->pht[soap_hash_ptr(a)]; pp; pp = pp->next) { if (pp->type == type && pp->array == a && pp->size == n) { *ppp = pp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d id=%d\n", a, type, pp->id)); return pp->id; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d: not found\n", a, type)); return 0; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_begin_count(struct soap *soap) { soap_free_ns(soap); soap->error = SOAP_OK; #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_UDP)) { soap->mode &= SOAP_IO; soap->mode |= SOAP_IO_BUFFER | SOAP_ENC_PLAIN; } if ((soap->mode & SOAP_IO) == SOAP_IO_STORE || (((soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_ENC_PLAIN)) #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_PLAIN)) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } #endif #ifndef WITH_LEANER if ((soap->mode & SOAP_ENC_MTOM) && (soap->mode & SOAP_ENC_DIME)) soap->mode |= SOAP_ENC_MIME; else if (!(soap->mode & SOAP_ENC_MIME)) 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_SEND; soap->event = 0; soap->evlev = 0; soap->idnum = 0; soap->body = 1; soap->level = 0; soap_clr_attr(soap); soap_set_local_namespaces(soap); #ifndef WITH_LEANER soap->dime.size = 0; /* accumulate total size of attachments */ if (soap->fprepareinitsend && (soap->mode & SOAP_IO) != SOAP_IO_STORE && (soap->error = soap->fprepareinitsend(soap)) != SOAP_OK) return soap->error; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin count phase (socket=%d mode=0x%x count=" SOAP_ULONG_FORMAT ")\n", (int)soap->socket, (unsigned int)soap->mode, soap->count)); #ifndef WITH_LEANER if ((soap->mode & SOAP_IO_LENGTH)) return soap_begin_attachments(soap); #endif return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_end_count(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of count phase\n")); #ifndef WITH_LEANER if ((soap->mode & SOAP_IO_LENGTH)) { if (soap_end_attachments(soap)) return soap->error; if (soap->fpreparefinalsend && (soap->error = soap->fpreparefinalsend(soap)) != SOAP_OK) return soap->error; } #else (void)soap; #endif return SOAP_OK; } /******************************************************************************/ static int soap_init_send(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing for output to socket=%d/fd=%d\n", (int)soap->socket, soap->sendfd)); *soap->tag = '\0'; soap_free_ns(soap); soap->error = SOAP_OK; soap->mode = soap->omode | (soap->mode & (SOAP_IO_LENGTH | SOAP_ENC_DIME)); #ifndef WITH_LEAN if ((soap->mode & SOAP_IO_UDP)) { soap->mode &= ~SOAP_IO; soap->mode |= SOAP_IO_BUFFER | SOAP_ENC_PLAIN; if ((soap->mode & SOAP_IO_LENGTH) && soap->count > sizeof(soap->buf)) return soap->error = SOAP_UDP_ERROR; } #endif #ifdef WITH_ZLIB if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH) { if ((soap->mode & SOAP_ENC_PLAIN)) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } #endif #if !defined(__cplusplus) || defined(WITH_COMPAT) if (soap->os) { *soap->os = NULL; soap->mode = (soap->mode & ~SOAP_IO) | SOAP_IO_STORE; } else #endif if ((soap->mode & SOAP_IO) == SOAP_IO_FLUSH && soap_valid_socket(soap->socket)) { if ((soap->mode & SOAP_IO_LENGTH) || (soap->mode & SOAP_ENC_PLAIN)) soap->mode |= SOAP_IO_BUFFER; else soap->mode |= SOAP_IO_STORE; } soap->mode &= ~SOAP_IO_LENGTH; if ((soap->mode & SOAP_IO) == SOAP_IO_STORE && soap_alloc_block(soap) == NULL) return soap->error; if (!(soap->mode & SOAP_IO_KEEPALIVE)) soap->keep_alive = 0; #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 if (!(soap->mode & SOAP_ENC_MIME)) { 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) && !soap->os && soap->sendfd >= 0) /* Set win32 stdout or soap->sendfd to BINARY, e.g. to support DIME */ #ifdef __BORLANDC__ setmode(soap->sendfd, _O_BINARY); #else _setmode(soap->sendfd, _O_BINARY); #endif #endif #endif #endif #endif if ((soap->mode & SOAP_IO)) soap->buflen = soap->bufidx = 0; soap->chunksize = 0; soap->ns = 0; soap->null = 0; soap->position = 0; soap->mustUnderstand = 0; soap->encoding = 0; soap->event = 0; soap->evlev = 0; soap->idnum = 0; soap->body = 1; 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->d_stream) { soap->d_stream = (z_stream*)SOAP_MALLOC(soap, sizeof(z_stream)); if (!soap->d_stream) return soap->error = SOAP_EOM; soap->d_stream->zalloc = Z_NULL; soap->d_stream->zfree = Z_NULL; soap->d_stream->opaque = Z_NULL; soap->d_stream->next_in = Z_NULL; } if (!soap->z_buf) soap->z_buf = (char*)SOAP_MALLOC(soap, sizeof(soap->buf)); if (!soap->z_buf) return soap->error = SOAP_EOM; soap->d_stream->next_out = (Byte*)soap->z_buf; soap->d_stream->avail_out = sizeof(soap->buf); #ifdef WITH_GZIP if (soap->zlib_out != SOAP_ZLIB_DEFLATE) { (void)soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)"\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 = sizeof(soap->buf) - 10; soap->z_crc = crc32(0L, NULL, 0); soap->zlib_out = SOAP_ZLIB_GZIP; if (soap->z_dict) *((Byte*)soap->z_buf + 2) = 0xff; 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; if (soap->z_dict) { if (deflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != 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=" SOAP_ULONG_FORMAT ")\n", (int)soap->socket, soap->mode, soap->count)); soap->part = SOAP_BEGIN_SEND; #ifndef WITH_LEANER if (soap->fprepareinitsend && (soap->mode & SOAP_IO) == SOAP_IO_STORE && (soap->error = soap->fprepareinitsend(soap)) != SOAP_OK) return soap->error; #endif #ifndef WITH_LEAN soap->start = (ULONG64)time(NULL); #endif return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_begin_send(struct soap *soap) { #ifndef WITH_LEANER if (soap_init_send(soap)) return soap->error; return soap_begin_attachments(soap); #else return soap_init_send(soap); #endif } /******************************************************************************/ #ifndef WITH_NOIDREF 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 /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_reference(struct soap *soap, const void *p, int t) { struct soap_plist *pp; if (!p || (!soap->encodingStyle && !(soap->omode & (SOAP_ENC_DIME | SOAP_ENC_MIME | SOAP_ENC_MTOM | SOAP_XML_GRAPH))) || (soap->omode & 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)) { 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 /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_array_reference(struct soap *soap, const void *p, const void *a, int n, int t) { struct soap_plist *pp; if (!p || !a || (!soap->encodingStyle && !(soap->omode & SOAP_XML_GRAPH)) || (soap->omode & SOAP_XML_TREE)) return 1; if (soap_array_pointer_lookup(soap, p, a, n, t, &pp)) { if (pp->mark1 == 0) { pp->mark1 = 2; pp->mark2 = 2; } } else if (!soap_pointer_enter(soap, p, a, n, t, &pp)) { return 1; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array reference %p ptr=%p n=%lu t=%d (%d %d)\n", p, a, (unsigned long)n, t, (int)pp->mark1, (int)pp->mark2)); return pp->mark1; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_attachment_reference(struct soap *soap, const void *p, const void *a, int n, int t, const char *id, const char *type) { struct soap_plist *pp; if (!p || !a || (!soap->encodingStyle && !(soap->omode & SOAP_XML_GRAPH) && !id && !type) || (soap->omode & SOAP_XML_TREE)) return 1; if (soap_array_pointer_lookup(soap, p, a, n, t, &pp)) { if (pp->mark1 == 0) { pp->mark1 = 2; pp->mark2 = 2; } } else if (!soap_pointer_enter(soap, p, a, n, t, &pp)) { return 1; } if (id || type) soap->mode |= SOAP_ENC_DIME; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Attachment reference %p ptr=%p n=%lu t=%d (%d %d)\n", p, a, (unsigned long)n, t, (int)pp->mark1, (int)pp->mark2)); return pp->mark1; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_embedded_id(struct soap *soap, int id, const void *p, int t) { struct soap_plist *pp = NULL; if (id >= 0 || (!soap->encodingStyle && !(soap->omode & SOAP_XML_GRAPH)) || (soap->omode & SOAP_XML_TREE)) return id; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id %p type=%d id=%d\n", p, t, id)); if (id < -1) return soap_embed(soap, p, NULL, 0, t); if (id < 0) { id = soap_pointer_lookup(soap, p, t, &pp); if (soap->version == 1 && soap->part != SOAP_IN_HEADER) { 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; } else if (id) { 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 /******************************************************************************/ #ifndef WITH_NOIDREF 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->omode & 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 /******************************************************************************/ #ifndef WITH_NOIDREF 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 /******************************************************************************/ #ifndef WITH_NOIDREF 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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_attachment(struct soap *soap, const char *tag, int id, const void *p, const void *a, int n, const char *aid, const char *atype, const char *aoptions, const char *type, int t) { struct soap_plist *pp; int i; if (!p || !a || (!aid && !atype) || (!soap->encodingStyle && !(soap->omode & (SOAP_ENC_DIME | SOAP_ENC_MIME | SOAP_ENC_MTOM | SOAP_XML_GRAPH))) || (soap->omode & SOAP_XML_TREE)) return soap_element_id(soap, tag, id, p, a, n, type, t, NULL); 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) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(soap->dime_id_format) + 20), soap->dime_id_format, id); aid = soap_strdup(soap, soap->tmpbuf); if (!aid) return -1; } /* Add MTOM xop:Include element when necessary */ /* TODO: this code to be obsoleted with new import/xop.h conventions */ if ((soap->omode & SOAP_ENC_MTOM) && strcmp(tag, "xop:Include")) { if (soap_element_begin_out(soap, tag, 0, type) || soap_element_href(soap, "xop:Include", 0, "xmlns:xop=\"http://www.w3.org/2004/08/xop/include\" 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->omode & SOAP_ENC_MTOM)) content = soap_alloc_multipart(soap, &soap->mime.first, &soap->mime.last, (const char*)a, n); else content = soap_alloc_multipart(soap, &soap->dime.first, &soap->dime.last, (const char*)a, n); if (!content) { soap->error = SOAP_EOM; return -1; } if (!strncmp(aid, "cid:", 4)) /* RFC 2111 */ { if ((soap->omode & SOAP_ENC_MTOM)) { size_t l = strlen(aid) - 1; char *s = (char*)soap_malloc(soap, l); if (s) { s[0] = '<'; (void)soap_strncpy(s + 1, l - 1, aid + 4, l - 3); s[l - 2] = '>'; s[l - 1] = '\0'; 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; } return -1; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF static void soap_init_iht(struct soap *soap) { int i; for (i = 0; i < SOAP_IDHASH; i++) soap->iht[i] = NULL; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF static void soap_free_iht(struct soap *soap) { int i; struct soap_ilist *ip = NULL, *p = NULL; 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 /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 struct soap_ilist * SOAP_FMAC2 soap_lookup(struct soap *soap, const char *id) { 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 /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 struct soap_ilist * SOAP_FMAC2 soap_enter(struct soap *soap, const char *id, int t, size_t n) { size_t h; struct soap_ilist *ip = NULL; size_t l = strlen(id); if (sizeof(struct soap_ilist) + l > l && (SOAP_MAXALLOCSIZE <= 0 || sizeof(struct soap_ilist) + l <= SOAP_MAXALLOCSIZE)) ip = (struct soap_ilist*)SOAP_MALLOC(soap, sizeof(struct soap_ilist) + l); if (ip) { ip->type = t; ip->size = n; ip->ptr = NULL; ip->spine = NULL; ip->link = NULL; ip->copy = NULL; ip->flist = NULL; ip->smart = NULL; ip->shaky = 0; (void)soap_memcpy((char*)ip->id, l + 1, id, l + 1); h = soap_hash(id); /* h = (HASH(id) % SOAP_IDHASH) so soap->iht[h] is safe */ ip->next = soap->iht[h]; soap->iht[h] = ip; } return ip; } #endif /******************************************************************************/ SOAP_FMAC1 void* SOAP_FMAC2 soap_malloc(struct soap *soap, size_t n) { char *p; size_t k = n; if (SOAP_MAXALLOCSIZE > 0 && n > SOAP_MAXALLOCSIZE) { soap->error = SOAP_EOM; return NULL; } if (!soap) return SOAP_MALLOC(soap, n); n += sizeof(short); n += (~n+1) & (sizeof(void*)-1); /* align at 4-, 8- or 16-byte boundary by rounding up */ if (n + sizeof(void*) + sizeof(size_t) < k) { soap->error = SOAP_EOM; return NULL; } p = (char*)SOAP_MALLOC(soap, n + sizeof(void*) + sizeof(size_t)); if (!p) { soap->error = SOAP_EOM; return NULL; } /* set a canary word to detect memory overruns and data corruption */ *(unsigned short*)(p + n - sizeof(unsigned short)) = (unsigned 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; return p; } /******************************************************************************/ #ifdef SOAP_MEM_DEBUG static void soap_init_mht(struct soap *soap) { 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) { int i; 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) { void *p = malloc(size); if (soap) { size_t h = soap_hash_ptr(p); struct soap_mlist *mp = (struct soap_mlist*)malloc(sizeof(struct soap_mlist)); if (soap->fdebug[SOAP_INDEX_TEST]) { 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) { if (!soap) { free(p); } else { size_t h = soap_hash_ptr(p); struct soap_mlist *mp; for (mp = soap->mht[h]; mp; mp = mp->next) if (mp->ptr == p) break; if (mp) { if (mp->live) { if (soap->fdebug[SOAP_INDEX_TEST]) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): free(%p)\n", file, line, p)); } free(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) { size_t h = soap_hash_ptr(p); struct soap_mlist *mp; for (mp = soap->mht[h]; mp; mp = mp->next) if (mp->ptr == p) break; if (mp) mp->live = 0; } #endif /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_dealloc(struct soap *soap, void *p) { if (soap_check_state(soap)) return; if (p) { char **q; for (q = (char**)(void*)&soap->alist; *q; q = *(char***)q) { if (*(unsigned short*)(char*)(*q - sizeof(unsigned short)) != (unsigned 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 { char *q; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free all soap_malloc() data\n")); while (soap->alist) { q = (char*)soap->alist; if (*(unsigned short*)(char*)(q - sizeof(unsigned short)) != (unsigned 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); } /* assume these were deallocated: */ soap->http_content = NULL; soap->action = NULL; soap->fault = NULL; soap->header = NULL; soap->bearer = NULL; soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif #ifndef WITH_LEANER soap_clr_mime(soap); #endif } } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_delete(struct soap *soap, void *p) { struct soap_clist **cp; if (soap_check_state(soap)) return; cp = &soap->clist; if (p) { while (*cp) { if (p == (*cp)->ptr) { struct soap_clist *q = *cp; *cp = q->next; if (q->fdelete(soap, 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) { struct soap_clist *q = *cp; *cp = q->next; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Delete %p type=%d (cp=%p)\n", q->ptr, q->type, (void*)q)); if (q->fdelete(soap, 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; /* assume this was deallocated */ soap->header = NULL; /* assume this was deallocated */ } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_delegate_deletion(struct soap *soap, struct soap *soap_to) { struct soap_clist *cp; char **q; #ifdef SOAP_MEM_DEBUG void *p; struct soap_mlist **mp, *mq; size_t h; #endif for (q = (char**)(void*)&soap->alist; *q; q = *(char***)q) { if (*(unsigned short*)(char*)(*q - sizeof(unsigned short)) != (unsigned 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; } #ifdef SOAP_MEM_DEBUG p = (void*)(*q - *(size_t*)(*q + sizeof(void*))); h = soap_hash_ptr(p); for (mp = &soap->mht[h]; *mp; mp = &(*mp)->next) { if ((*mp)->ptr == p) { mq = *mp; *mp = mq->next; mq->next = soap_to->mht[h]; soap_to->mht[h] = mq; break; } } #endif } *q = (char*)soap_to->alist; soap_to->alist = soap->alist; soap->alist = NULL; #ifdef SOAP_MEM_DEBUG cp = soap->clist; while (cp) { h = soap_hash_ptr(cp); for (mp = &soap->mht[h]; *mp; mp = &(*mp)->next) { if ((*mp)->ptr == cp) { mq = *mp; *mp = mq->next; mq->next = soap_to->mht[h]; soap_to->mht[h] = mq; break; } } cp = cp->next; } #endif cp = soap_to->clist; if (cp) { while (cp->next) cp = cp->next; cp->next = soap->clist; } else { soap_to->clist = soap->clist; } soap->clist = NULL; } /******************************************************************************/ SOAP_FMAC1 struct soap_clist * SOAP_FMAC2 soap_link(struct soap *soap, int t, int n, int (*fdelete)(struct soap*, struct soap_clist*)) { struct soap_clist *cp = NULL; if (soap) { if (n != SOAP_NO_LINK_TO_DELETE) { cp = (struct soap_clist*)SOAP_MALLOC(soap, sizeof(struct soap_clist)); if (!cp) { soap->error = SOAP_EOM; } else { cp->next = soap->clist; cp->type = t; cp->size = n; cp->ptr = NULL; cp->fdelete = fdelete; soap->clist = cp; } } soap->alloced = t; } return cp; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_unlink(struct soap *soap, const void *p) { char **q; struct soap_clist **cp; if (soap && p) { for (q = (char**)(void*)&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 SOAP_OK; /* found and removed from dealloc chain */ } } 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 SOAP_OK; /* found and removed from dealloc chain */ } } } return SOAP_ERR; } /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_lookup_type(struct soap *soap, const char *id) { 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 /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 short SOAP_FMAC2 soap_begin_shaky(struct soap *soap) { short f = soap->shaky; soap->shaky = 1; return f; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 void SOAP_FMAC2 soap_end_shaky(struct soap *soap, short f) { soap->shaky = f; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF static int soap_is_shaky(struct soap *soap, void *p) { (void)p; if (!soap->blist && !soap->shaky) return 0; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Shaky %p\n", p)); return 1; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 void* SOAP_FMAC2 soap_id_lookup(struct soap *soap, const char *id, void **p, int t, size_t n, unsigned int k, int (*fbase)(int, int)) { struct soap_ilist *ip; if (!p || !id || !*id) return p; ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */ if (!ip) { ip = soap_enter(soap, id, t, n); /* new hash table entry for string id */ if (!ip) return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding first href='%s' type=%d location=%p (%u bytes) level=%u\n", id, t, (void*)p, (unsigned int)n, k)); *p = NULL; if (k) { int i; if (k > SOAP_MAXPTRS) return NULL; ip->spine = (void**)soap_malloc(soap, SOAP_MAXPTRS * sizeof(void*)); if (!ip->spine) return NULL; ip->spine[0] = NULL; for (i = 1; i < SOAP_MAXPTRS; i++) ip->spine[i] = &ip->spine[i - 1]; *p = &ip->spine[k - 1]; } else { ip->link = p; ip->shaky = soap_is_shaky(soap, (void*)p); } } else if (ip->type != t && (!fbase || !fbase(ip->type, t)) && (!fbase || !fbase(t, ip->type) || soap_type_punned(soap, ip))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup type incompatibility: ref='%s' id-type=%d ref-type=%d\n", id, ip->type, t)); (void)soap_id_nullify(soap, id); return NULL; } else if (k == 0 && ip->ptr && !ip->shaky) /* when block lists are in use, ip->ptr will change */ { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolved href='%s' type=%d location=%p (%u bytes) level=%u\n", id, t, ip->ptr, (unsigned int)n, k)); *p = ip->ptr; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarded href='%s' type=%d location=%p (%u bytes) level=%u\n", id, t, (void*)p, (unsigned int)n, k)); if (fbase && fbase(t, ip->type) && !soap_type_punned(soap, ip)) { ip->type = t; ip->size = n; } *p = NULL; if (k) { if (!ip->spine) { int i; if (k > SOAP_MAXPTRS) return NULL; ip->spine = (void**)soap_malloc(soap, SOAP_MAXPTRS * sizeof(void*)); if (!ip->spine) return NULL; ip->spine[0] = NULL; for (i = 1; i < SOAP_MAXPTRS; i++) ip->spine[i] = &ip->spine[i - 1]; } *p = &ip->spine[k - 1]; if (ip->ptr && !ip->shaky) ip->spine[0] = ip->ptr; } else { void *q = ip->link; ip->link = p; ip->shaky = soap_is_shaky(soap, (void*)p); *p = q; } } return p; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 void* SOAP_FMAC2 soap_id_forward(struct soap *soap, const char *href, void *p, size_t i, int t, int tt, size_t n, unsigned int k, void (*finsert)(struct soap*, int, int, void*, size_t, const void*, void**), int (*fbase)(int, int)) { 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) { ip = soap_enter(soap, href, t, n); /* new hash table entry for string id */ if (!ip) return NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New entry href='%s' type=%d size=%lu level=%d location=%p\n", href, t, (unsigned long)n, k, p)); } else if ((ip->type != t || ip->size != n) && k == 0) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forward 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, t, (unsigned long)n)); (void)soap_id_nullify(soap, href); return NULL; } if (finsert || n < sizeof(void*)) { struct soap_flist *fp = (struct soap_flist*)SOAP_MALLOC(soap, sizeof(struct soap_flist)); if (!fp) { soap->error = SOAP_EOM; return NULL; } if (fbase && fbase(t, ip->type) && !soap_type_punned(soap, ip)) { ip->type = t; ip->size = n; } if ((ip->type != t || ip->size != n) && (!fbase || !fbase(ip->type, t))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forward 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, t, (unsigned long)n)); SOAP_FREE(soap, fp); (void)soap_id_nullify(soap, href); return NULL; } fp->next = ip->flist; fp->type = tt; fp->ptr = p; fp->level = k; fp->index = i; fp->finsert = finsert; ip->flist = fp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding type=%d (target type=%d) size=%lu location=%p level=%u index=%lu href='%s'\n", t, tt, (unsigned long)n, p, k, (unsigned long)i, href)); } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding copying address %p for type=%d href='%s'\n", p, t, href)); *(void**)p = ip->copy; ip->copy = p; } ip->shaky = soap_is_shaky(soap, p); return p; } #endif /******************************************************************************/ SOAP_FMAC1 void* SOAP_FMAC2 soap_id_enter(struct soap *soap, const char *id, void *p, int t, size_t n, const char *type, const char *arrayType, void *(*finstantiate)(struct soap*, int, const char*, const char*, size_t*), int (*fbase)(int, int)) { #ifndef WITH_NOIDREF struct soap_ilist *ip; #endif (void)id; (void)fbase; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enter id='%s' type=%d location=%p size=%lu\n", id, t, p, (unsigned long)n)); soap->alloced = 0; if (!p) { if (finstantiate) { p = finstantiate(soap, t, type, arrayType, &n); /* soap->alloced is set in soap_link() */ t = soap->alloced; } else { p = soap_malloc(soap, n); soap->alloced = t; } } #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 type=%d\n", id, p, t)); if (!ip) { ip = soap_enter(soap, id, t, n); /* new hash table entry for string id */ if (!ip) return NULL; ip->ptr = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New entry id='%s' type=%d size=%lu location=%p\n", id, t, (unsigned long)n, p)); if (!soap->alloced) ip->shaky = soap_is_shaky(soap, p); } else if (ip->ptr) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Multiply defined id='%s'\n", id)); soap_strcpy(soap->id, sizeof(soap->id), id); soap->error = SOAP_DUPLICATE_ID; return NULL; } else if ((ip->type != t && (!fbase || !fbase(t, ip->type) || soap_type_punned(soap, ip))) || (ip->type == t && ip->size != n && soap_type_punned(soap, ip))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enter type incompatibility id='%s' expect type=%d size=%lu got type=%d size=%lu\n", id, ip->type, (unsigned long)ip->size, t, (unsigned long)n)); (void)soap_id_nullify(soap, id); return NULL; } else { ip->type = t; ip->size = n; ip->ptr = p; if (!soap->alloced) ip->shaky = soap_is_shaky(soap, p); if (soap->alloced || !ip->shaky) { void **q; /* ptr will not change later, so resolve links now */ if (ip->spine) ip->spine[0] = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Traversing link chain to resolve id='%s' type=%d\n", ip->id, ip->type)); q = (void**)ip->link; while (q) { void *r = *q; *q = p; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... link %p -> %p\n", (void*)q, p)); q = (void**)r; } ip->link = NULL; } } return ip->ptr; #endif } /******************************************************************************/ SOAP_FMAC1 void** SOAP_FMAC2 soap_id_smart(struct soap *soap, const char *id, int t, size_t n) { (void)soap; (void)id; (void)t; (void)n; #ifndef WITH_NOIDREF if (id && *id) { struct soap_ilist *ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */ if (!ip) { ip = soap_enter(soap, id, t, n); /* new hash table entry for string id */ if (!ip) return NULL; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New smart shared pointer entry id='%s' type=%d size=%lu smart=%p\n", id, t, (unsigned long)n, ip->smart)); return &ip->smart; } #endif return NULL; } /******************************************************************************/ #ifndef WITH_NOIDREF static int soap_type_punned(struct soap *soap, const struct soap_ilist *ip) { const struct soap_flist *fp; (void)soap; if (ip->ptr || ip->copy) return 1; for (fp = ip->flist; fp; fp = fp->next) if (fp->level == 0) return 1; return 0; } #endif /******************************************************************************/ #ifndef WITH_NOIDREF SOAP_FMAC1 int SOAP_FMAC2 soap_id_nullify(struct soap *soap, const char *id) { int i; for (i = 0; i < SOAP_IDHASH; i++) { struct soap_ilist *ip; for (ip = soap->iht[i]; ip; ip = ip->next) { void *p, *q; for (p = ip->link; p; p = q) { q = *(void**)p; *(void**)p = NULL; } ip->link = NULL; } } soap_strcpy(soap->id, sizeof(soap->id), id); return soap->error = SOAP_HREF; } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_end_send(struct soap *soap) { #ifndef WITH_LEANER int err; err = soap_end_attachments(soap); 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 (!err) err = soap_putdime(soap); if (!err) err = soap_putmime(soap); soap->mime.list = NULL; soap->mime.first = NULL; soap->mime.last = NULL; soap->dime.list = NULL; soap->dime.first = NULL; soap->dime.last = NULL; if (err) return err; #endif return soap_end_send_flush(soap); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_end_send_flush(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End send mode=0x%x\n", soap->mode)); 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) && soap->d_stream) { 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 != sizeof(soap->buf)) { if (soap_flush_raw(soap, soap->z_buf, sizeof(soap->buf) - 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 = sizeof(soap->buf); } } 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) { #if !defined(__cplusplus) || defined(WITH_COMPAT) if (soap->os) { char *b = (char*)soap_push_block(soap, NULL, 1); if (b) { *b = '\0'; *soap->os = soap_save_block(soap, NULL, NULL, 0); } } else #endif { char *p; #ifndef WITH_NOHTTP if (!(soap->mode & SOAP_ENC_PLAIN)) { 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)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Send %u bytes to socket=%d/fd=%d\n", (unsigned int)soap_block_size(soap, NULL), (int)soap->socket, soap->sendfd)); soap->error = soap->fsend(soap, p, soap_block_size(soap, NULL)); if (soap->error) { soap_end_block(soap, NULL); return soap->error; } } soap_end_block(soap, NULL); } #ifndef WITH_LEANER if (soap->fpreparefinalsend && (soap->error = soap->fpreparefinalsend(soap)) != SOAP_OK) return soap->error; #endif if ((soap->omode & SOAP_IO) == SOAP_IO_STORE && (soap->imode & SOAP_IO) != SOAP_IO_STORE) soap->omode = (soap->omode & ~SOAP_IO) | (soap->imode & SOAP_IO); } #ifndef WITH_LEANER else if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { DBGMSG(SENT, "\r\n0\r\n\r\n", 7); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Send 7 bytes to socket=%d/fd=%d\n", (int)soap->socket, soap->sendfd)); soap->error = soap->fsend(soap, "\r\n0\r\n\r\n", 7); if (soap->error) return soap->error; } #endif } #ifdef WITH_TCPFIN #if defined(WITH_OPENSSL) || defined(WITH_SYSTEMSSL) if (!soap->ssl) #endif if (soap_valid_socket(soap->socket) && !soap->keep_alive && !(soap->omode & SOAP_IO_UDP)) soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_WR); /* Send TCP FIN */ #endif #if defined(__cplusplus) && !defined(WITH_COMPAT) if (soap->os) soap->os->flush(); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of send phase\n")); soap->omode &= ~SOAP_SEC_WSUID; soap->count = 0; soap->part = SOAP_END; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_end_recv(struct soap *soap) { soap->part = SOAP_END; #ifndef WITH_LEAN soap->wsuid = NULL; /* reset before next send */ soap->c14nexclude = NULL; /* reset before next send */ soap->c14ninclude = NULL; /* reset before next send */ #endif #ifndef WITH_LEANER soap->ffilterrecv = NULL; 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 so call soap_resolve() and return */ if ((soap->mode & SOAP_ENC_MIME)) { if ((soap->mode & SOAP_MIME_POSTCHECK)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Post checking MIME attachments\n")); if (!soap->keep_alive) soap->keep_alive = -2; /* special case to keep alive */ #ifndef WITH_NOIDREF soap_resolve(soap); #endif return SOAP_OK; } 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) && soap->d_stream) { /* 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; (void)soap_memcpy((void*)soap->buf, sizeof(soap->buf), (const void*)soap->z_buf, sizeof(soap->buf)); 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) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Gzip error: unable to read crc value\n")); return soap->error = SOAP_ZLIB_ERROR; } 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 inflate 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 inflate 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->ahead != EOF && !soap_recv_raw(soap)) continue; #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); #ifndef WITH_LEANER if (soap->fpreparefinalrecv) return soap->error = soap->fpreparefinalrecv(soap); #endif return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_free_temp(struct soap *soap) { struct soap_attribute *tp, *tq; 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) { SOAP_FREE(soap, ns->out); ns->out = NULL; } } 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_iht(soap); #endif soap_free_pht(soap); } /******************************************************************************/ static void soap_free_ns(struct soap *soap) { 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; } /******************************************************************************/ #ifdef 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 /******************************************************************************/ #ifdef 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]; if (s) SOAP_FREE_UNMANAGED(s); if (logfile) { size_t l = strlen(logfile) + 1; t = (char*)SOAP_MALLOC_UNMANAGED(l); if (t) (void)soap_memcpy((void*)t, l, (const void*)logfile, l); } soap->logfile[i] = t; } #endif /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_recv_logfile(struct soap *soap, const char *logfile) { (void)soap; (void)logfile; #ifdef SOAP_DEBUG soap_set_logfile(soap, SOAP_INDEX_RECV, logfile); #endif } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_sent_logfile(struct soap *soap, const char *logfile) { (void)soap; (void)logfile; #ifdef SOAP_DEBUG soap_set_logfile(soap, SOAP_INDEX_SENT, logfile); #endif } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_test_logfile(struct soap *soap, const char *logfile) { (void)soap; (void)logfile; #ifdef SOAP_DEBUG soap_set_logfile(soap, SOAP_INDEX_TEST, logfile); #endif } /******************************************************************************/ SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_copy(const struct soap *soap) { struct soap *copy = soap_versioning(soap_new)(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); soap_done(copy); if (soap_copy_context(copy, soap) != NULL) return copy; soap_free(copy); return NULL; } /******************************************************************************/ SOAP_FMAC1 struct soap* SOAP_FMAC2 soap_copy_context(struct soap *copy, const struct soap *soap) { if (copy == soap) return copy; if (soap_check_state(soap)) return NULL; if (copy) { struct soap_plugin *p = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying context\n")); (void)soap_memcpy((void*)copy, sizeof(struct soap), (const void*)soap, sizeof(struct soap)); copy->state = SOAP_COPY; copy->error = SOAP_OK; copy->bearer = NULL; copy->userid = NULL; copy->passwd = NULL; #ifdef WITH_NTLM copy->ntlm_challenge = NULL; #endif 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 #ifdef SOAP_DEBUG soap_init_logs(copy); 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 copy->namespaces = soap->local_namespaces; copy->local_namespaces = NULL; soap_set_local_namespaces(copy); /* copy content of soap->local_namespaces */ copy->namespaces = soap->namespaces; /* point to shared read-only namespaces table */ copy->c_locale = NULL; #ifdef WITH_OPENSSL copy->bio = NULL; copy->ssl = NULL; copy->session = NULL; copy->session_host[0] = '\0'; copy->session_port = 443; #endif #ifdef WITH_GNUTLS copy->session = NULL; #endif #ifdef WITH_ZLIB copy->d_stream = NULL; copy->z_buf = NULL; #endif #ifndef WITH_NOIDREF soap_init_iht(copy); #endif soap_init_pht(copy); 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) { struct soap_plugin *q = (struct soap_plugin*)SOAP_MALLOC(copy, sizeof(struct soap_plugin)); if (!q) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not allocate plugin '%s'\n", p->id)); soap_end(copy); soap_done(copy); return NULL; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying plugin '%s'\n", p->id)); *q = *p; if (p->fcopy && (copy->error = p->fcopy(copy, q, p)) != SOAP_OK) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not copy plugin '%s' error = %d\n", p->id, copy->error)); SOAP_FREE(copy, q); soap_end(copy); soap_done(copy); return NULL; } q->next = copy->plugins; copy->plugins = q; } } #ifdef WITH_SELF_PIPE pipe(copy->pipe_fd); SOAP_SOCKNONBLOCK(copy->pipe_fd[0]) SOAP_SOCKNONBLOCK(copy->pipe_fd[1]) #endif return copy; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_copy_stream(struct soap *copy, struct soap *soap) { struct soap_attribute *tp = NULL, *tq; if (copy == soap) return; copy->header = soap->header; copy->mode = soap->mode; copy->imode = soap->imode; copy->omode = soap->omode; copy->socket = soap->socket; copy->sendsk = soap->sendsk; copy->recvsk = soap->recvsk; copy->transfer_timeout = soap->transfer_timeout; copy->recv_maxlength = soap->recv_maxlength; copy->recv_timeout = soap->recv_timeout; copy->send_timeout = soap->send_timeout; copy->connect_timeout = soap->connect_timeout; copy->accept_timeout = soap->accept_timeout; copy->socket_flags = soap->socket_flags; copy->connect_flags = soap->connect_flags; copy->connect_retry = soap->connect_retry; copy->bind_flags = soap->bind_flags; copy->bind_inet6 = soap->bind_inet6; copy->bind_v6only = soap->bind_v6only; copy->accept_flags = soap->accept_flags; copy->sndbuf = soap->sndbuf; copy->rcvbuf = soap->rcvbuf; copy->linger_time = soap->linger_time; copy->maxlevel = soap->maxlevel; copy->maxlength = soap->maxlength; copy->maxoccurs = soap->maxoccurs; copy->os = soap->os; copy->is = soap->is; 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; copy->ip = soap->ip; copy->ip6[0] = soap->ip6[0]; copy->ip6[1] = soap->ip6[1]; copy->ip6[2] = soap->ip6[2]; copy->ip6[3] = soap->ip6[3]; copy->port = soap->port; (void)soap_memcpy((void*)copy->host, sizeof(copy->host), (const void*)soap->host, sizeof(soap->host)); (void)soap_memcpy((void*)copy->endpoint, sizeof(copy->endpoint), (const void*)soap->endpoint, sizeof(soap->endpoint)); #endif #ifdef WITH_OPENSSL copy->bio = soap->bio; copy->ctx = soap->ctx; copy->ssl = soap->ssl; #endif #ifdef WITH_GNUTLS copy->session = soap->session; #endif #ifdef WITH_SYSTEMSSL copy->ctx = soap->ctx; copy->ssl = soap->ssl; #endif #ifdef WITH_ZLIB copy->zlib_state = soap->zlib_state; copy->zlib_in = soap->zlib_in; copy->zlib_out = soap->zlib_out; if (soap->d_stream && soap->zlib_state != SOAP_ZLIB_NONE) { if (!copy->d_stream) copy->d_stream = (z_stream*)SOAP_MALLOC(copy, sizeof(z_stream)); if (copy->d_stream) (void)soap_memcpy((void*)copy->d_stream, sizeof(z_stream), (const void*)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, sizeof(soap->buf)); if (copy->z_buf) (void)soap_memcpy((void*)copy->z_buf, sizeof(soap->buf), (const void*)soap->z_buf, sizeof(soap->buf)); } copy->z_dict = soap->z_dict; copy->z_dict_len = soap->z_dict_len; #endif (void)soap_memcpy((void*)copy->buf, sizeof(copy->buf), (const void*)soap->buf, sizeof(soap->buf)); /* copy XML parser state */ soap_free_ns(copy); soap_set_local_namespaces(copy); copy->version = soap->version; if (soap->nlist && soap->local_namespaces) { struct soap_nlist *np = NULL, *nq; /* copy reversed nlist */ for (nq = soap->nlist; nq; nq = nq->next) { struct soap_nlist *nr = np; size_t n = sizeof(struct soap_nlist) + strlen(nq->id); np = (struct soap_nlist*)SOAP_MALLOC(copy, n); if (!np) { np = nr; break; } (void)soap_memcpy((void*)np, n, (const void*)nq, n); np->next = nr; } while (np) { const char *s = np->ns; copy->level = np->level; /* preserve element nesting level */ if (!s && np->index >= 0) { s = soap->local_namespaces[np->index].out; if (!s) s = soap->local_namespaces[np->index].ns; } if (s) (void)soap_push_namespace(copy, np->id, s); nq = np; np = np->next; SOAP_FREE(copy, nq); } } (void)soap_memcpy((void*)copy->tag, sizeof(copy->tag), (const void*)soap->tag, sizeof(soap->tag)); (void)soap_memcpy((void*)copy->id, sizeof(copy->id), (const void*)soap->id, sizeof(soap->id)); (void)soap_memcpy((void*)copy->href, sizeof(copy->href), (const void*)soap->href, sizeof(soap->href)); (void)soap_memcpy((void*)copy->type, sizeof(copy->type), (const void*)soap->type, sizeof(soap->type)); copy->other = soap->other; copy->root = soap->root; copy->null = soap->null; copy->body = soap->body; copy->part = soap->part; copy->mustUnderstand = soap->mustUnderstand; copy->level = soap->level; copy->peeked = soap->peeked; /* copy attributes */ for (tq = soap->attributes; tq; tq = tq->next) { struct soap_attribute *tr = tp; size_t n = sizeof(struct soap_attribute) + strlen(tq->name); tp = (struct soap_attribute*)SOAP_MALLOC(copy, n); (void)soap_memcpy((void*)tp, n, (const void*)tq, n); if (tp->size) { tp->value = (char*)SOAP_MALLOC(copy, tp->size); if (tp->value) (void)soap_memcpy((void*)tp->value, tp->size, (const void*)tq->value, tp->size); } tp->ns = NULL; tp->next = tr; } copy->attributes = tp; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_free_stream(struct soap *soap) { soap->socket = SOAP_INVALID_SOCKET; soap->sendsk = SOAP_INVALID_SOCKET; soap->recvsk = SOAP_INVALID_SOCKET; #ifdef WITH_OPENSSL soap->bio = NULL; soap->ctx = NULL; soap->ssl = NULL; #endif #ifdef WITH_GNUTLS soap->xcred = NULL; soap->acred = NULL; soap->cache = NULL; soap->session = NULL; soap->dh_params = NULL; soap->rsa_params = NULL; #endif #ifdef WITH_SYSTEMSSL soap->ctx = (gsk_handle)NULL; soap->ssl = (gsk_handle)NULL; #endif #ifdef WITH_ZLIB if (soap->z_buf) SOAP_FREE(soap, soap->z_buf); soap->z_buf = NULL; #endif } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_initialize(struct soap *soap) { soap_versioning(soap_init)(soap, SOAP_IO_DEFAULT, SOAP_IO_DEFAULT); } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_versioning(soap_init)(struct soap *soap, soap_mode imode, soap_mode omode) { size_t i; soap->state = SOAP_INIT; #ifdef SOAP_MEM_DEBUG soap_init_mht(soap); #endif #ifdef SOAP_DEBUG soap_init_logs(soap); #endif #ifdef TANDEM_NONSTOP soap_set_test_logfile(soap, "TESTLOG"); soap_set_sent_logfile(soap, "SENTLOG"); soap_set_recv_logfile(soap, "RECVLOG"); #else soap_set_test_logfile(soap, "TEST.log"); soap_set_sent_logfile(soap, "SENT.log"); soap_set_recv_logfile(soap, "RECV.log"); #endif #ifdef WITH_SELF_PIPE pipe(soap->pipe_fd); SOAP_SOCKNONBLOCK(soap->pipe_fd[0]) SOAP_SOCKNONBLOCK(soap->pipe_fd[1]) #endif soap->version = 0; soap->imode = imode; soap->omode = omode; soap->mode = imode; soap->plugins = NULL; soap->user = NULL; for (i = 0; i < sizeof(soap->data)/sizeof(*soap->data); i++) soap->data[i] = NULL; soap->bearer = NULL; soap->userid = NULL; soap->passwd = NULL; soap->authrealm = NULL; #ifdef WITH_NTLM soap->ntlm_challenge = NULL; #endif #ifndef WITH_NOHTTP soap->fpost = http_post; soap->fget = http_get; soap->fput = http_put; soap->fpatch = http_patch; soap->fdel = http_del; soap->fopt = http_200; soap->fhead = http_200; 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; /* in_addr_t value */ soap->ipv4_multicast_if = NULL; /* points to struct in_addr or in_addr_t */ soap->ipv4_multicast_ttl = 0; /* 0: use default */ soap->client_addr = NULL; /* client address (IPv4 or IPv6 or host name) to bind before connect, NULL for none */ soap->client_addr_ipv6 = NULL; /* client address IPv6 or host name to bind before connect, NULL for none */ soap->client_port = -1; /* client port to bind before connect, -1 for none */ soap->client_interface = NULL; /* client interface address, NULL for none */ #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; #ifndef WITH_LEANER soap->fsvalidate = NULL; soap->fwvalidate = NULL; soap->feltbegin = NULL; soap->feltendin = NULL; soap->feltbegout = NULL; soap->feltendout = NULL; soap->fprepareinitsend = NULL; soap->fprepareinitrecv = NULL; soap->fpreparesend = NULL; soap->fpreparerecv = NULL; soap->fpreparefinalsend = NULL; soap->fpreparefinalrecv = NULL; soap->ffiltersend = NULL; soap->ffilterrecv = 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->long_double_format = NULL; /* Defined in custom serializer custom/long_double.c */ soap->dime_id_format = "cid:id%d"; /* default DIME id format for int id index */ soap->recv_maxlength = 0x7FFFFFFF; /* default max length of messages received (2GB) */ soap->recv_timeout = 0; soap->send_timeout = 0; soap->transfer_timeout = 0; soap->connect_timeout = 0; soap->accept_timeout = 0; soap->socket_flags = 0; soap->connect_flags = 0; soap->connect_retry = 0; soap->bind_flags = 0; #ifdef WITH_IPV6_V6ONLY soap->bind_inet6 = 1; soap->bind_v6only = 1; #else soap->bind_inet6 = 0; soap->bind_v6only = 0; #endif soap->accept_flags = 0; #ifdef WIN32 soap->sndbuf = SOAP_BUFLEN + 1; /* this size speeds up windows xfer */ soap->rcvbuf = SOAP_BUFLEN + 1; #else soap->sndbuf = SOAP_BUFLEN; soap->rcvbuf = SOAP_BUFLEN; #endif soap->linger_time = 0; soap->maxlevel = SOAP_MAXLEVEL; soap->maxlength = SOAP_MAXLENGTH; soap->maxoccurs = SOAP_MAXOCCURS; soap->http_version = "1.1"; soap->proxy_http_version = "1.0"; soap->http_content = NULL; soap->http_extra_header = 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->ip = 0; soap->ip6[0] = 0; soap->ip6[1] = 0; soap->ip6[2] = 0; soap->ip6[3] = 0; soap->labbuf = NULL; soap->lablen = 0; soap->labidx = 0; soap->encodingStyle = NULL; #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->shaky = 0; soap->attributes = NULL; soap->header = NULL; soap->fault = NULL; soap->master = SOAP_INVALID_SOCKET; soap->socket = SOAP_INVALID_SOCKET; soap->sendsk = SOAP_INVALID_SOCKET; soap->recvsk = 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->tag[0] = '\0'; 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->endpoint[0] = '\0'; soap->host[0] = '\0'; soap->path[0] = '\0'; soap->port = 0; soap->override_host = NULL; soap->override_port = 0; soap->action = NULL; soap->proxy_host = NULL; soap->proxy_port = 8080; soap->proxy_userid = NULL; soap->proxy_passwd = NULL; soap->proxy_from = NULL; soap->origin = NULL; soap->cors_origin = NULL; soap->cors_allow = "*"; soap->cors_method = NULL; soap->cors_header = NULL; soap->cors_methods = NULL; soap->cors_headers = NULL; soap->x_frame_options = "SAMEORIGIN"; soap->prolog = "\n"; soap->zlib_state = SOAP_ZLIB_NONE; soap->zlib_in = SOAP_ZLIB_NONE; soap->zlib_out = SOAP_ZLIB_NONE; soap->d_stream = NULL; soap->z_buf = NULL; soap->z_level = 6; soap->z_dict = NULL; soap->z_dict_len = 0; #ifndef WITH_LEAN soap->wsuid = NULL; soap->c14nexclude = NULL; soap->c14ninclude = 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 #ifndef WITH_NOIDREF soap_init_iht(soap); #endif soap_init_pht(soap); #ifdef WITH_OPENSSL if (!soap_ssl_init_done) soap_ssl_init(); soap->fsslauth = ssl_auth_init; soap->fsslverify = NULL; soap->bio = NULL; soap->ssl = NULL; soap->ctx = NULL; soap->session = NULL; soap->session_host[0] = '\0'; soap->session_port = 443; soap->ssl_flags = SOAP_SSL_DEFAULT; soap->keyfile = NULL; soap->keyid = NULL; soap->password = NULL; soap->cafile = NULL; soap->capath = NULL; soap->crlfile = NULL; soap->dhfile = NULL; soap->randfile = NULL; #endif #ifdef WITH_GNUTLS if (!soap_ssl_init_done) soap_ssl_init(); soap->fsslauth = ssl_auth_init; soap->fsslverify = NULL; soap->xcred = NULL; soap->acred = NULL; soap->cache = NULL; soap->session = NULL; soap->ssl_flags = SOAP_SSL_DEFAULT; soap->keyfile = NULL; soap->keyid = NULL; soap->password = NULL; soap->cafile = NULL; soap->capath = NULL; soap->crlfile = NULL; soap->dh_params = NULL; soap->rsa_params = NULL; #endif #ifdef WITH_SYSTEMSSL soap->fsslauth = ssl_auth_init; soap->fsslverify = NULL; soap->bio = NULL; soap->ssl = (gsk_handle)NULL; soap->ctx = (gsk_handle)NULL; soap->session = NULL; soap->ssl_flags = SOAP_SSL_DEFAULT; soap->keyfile = NULL; soap->keyid = NULL; soap->password = NULL; soap->cafile = NULL; soap->capath = NULL; soap->crlfile = NULL; soap->dhfile = NULL; soap->randfile = NULL; #endif soap->c_locale = NULL; soap->buflen = 0; soap->bufidx = 0; #ifndef WITH_LEANER soap->dime.chunksize = 0; soap->dime.buflen = 0; #endif soap->other = 0; soap->root = -1; soap->null = 0; soap->position = 0; soap->encoding = 0; soap->mustUnderstand = 0; soap->ns = 0; soap->part = SOAP_END; soap->event = 0; soap->evlev = 0; soap->alloced = 0; soap->count = 0; soap->length = 0; soap->cdata = 0; soap->peeked = 0; soap->ahead = 0; soap->idnum = 0; soap->level = 0; soap->status = 0; soap->error = SOAP_OK; soap->errmode = 0; soap->errnum = 0; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_begin(struct soap *soap) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Clean up for input/output\n")); soap->error = SOAP_OK; if (!soap->keep_alive) { soap->buflen = 0; soap->bufidx = 0; } soap->encoding = 0; soap->mode = 0; soap->part = SOAP_END; soap->peeked = 0; soap->ahead = 0; soap->level = 0; *soap->endpoint = '\0'; soap->encodingStyle = SOAP_STR_EOS; soap_free_temp(soap); } /******************************************************************************/ 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) { 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 } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_version(struct soap *soap, short version) { soap_set_local_namespaces(soap); if (soap->version != version && soap->local_namespaces && soap->local_namespaces[0].id && soap->local_namespaces[1].id) { if (version == 1) { soap->local_namespaces[0].ns = soap_env1; soap->local_namespaces[1].ns = soap_enc1; } else if (version == 2) { soap->local_namespaces[0].ns = soap_env2; soap->local_namespaces[1].ns = soap_enc2; } soap->version = version; } if (version == 0) soap->encodingStyle = SOAP_STR_EOS; else soap->encodingStyle = NULL; } /******************************************************************************/ static void soap_version(struct soap *soap) { struct Namespace *p = soap->local_namespaces; if (p) { const char *ns = p[0].out; if (!ns) ns = p[0].ns; if (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); p[1].out = (char*)SOAP_MALLOC(soap, sizeof(soap_enc1)); if (p[1].out) (void)soap_memcpy(p[1].out, sizeof(soap_enc1), soap_enc1, sizeof(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); p[1].out = (char*)SOAP_MALLOC(soap, sizeof(soap_enc2)); if (p[1].out) (void)soap_memcpy(p[1].out, sizeof(soap_enc2), soap_enc2, sizeof(soap_enc2)); } } } } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_set_namespaces(struct soap *soap, const struct Namespace *p) { struct Namespace *ns = soap->local_namespaces; struct soap_nlist *np, *nq, *nr; 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) { 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) (void)soap_push_namespace(soap, np->id, s); nq = np; np = np->next; SOAP_FREE(soap, nq); } if (ns) { 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; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_local_namespaces(struct soap *soap) { if (soap->namespaces && !soap->local_namespaces) { const struct Namespace *ns1; struct Namespace *ns2; 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) { (void)soap_memcpy((void*)ns2, n, (const void*)soap->namespaces, n); if (ns2[0].ns) { if (!strcmp(ns2[0].ns, soap_env1)) soap->version = 1; else if (!strcmp(ns2[0].ns, soap_env2)) soap->version = 2; } soap->local_namespaces = ns2; for (; ns2->id; ns2++) ns2->out = NULL; } } } /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char * SOAP_FMAC2 soap_tagsearch(const char *big, const char *little) { if (big && little) { size_t n = strlen(little); const char *s = big; while (s) { const char *t = s; size_t i; for (i = 0; i < n; i++, t++) { if (*t != little[i]) break; } if (*t == '\0' || *t == ' ') { if (i == n || (i > 0 && little[i-1] == ':')) return s; } s = strchr(t, ' '); if (s) s++; } } return NULL; } #endif /******************************************************************************/ SOAP_FMAC1 struct soap_nlist * SOAP_FMAC2 soap_lookup_ns(struct soap *soap, const char *tag, size_t n) { 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; } /******************************************************************************/ #ifndef WITH_LEAN static struct soap_nlist * soap_push_ns(struct soap *soap, const char *id, const char *ns, short utilized, short isearly) { struct soap_nlist *np = NULL; size_t n, k; unsigned int level = soap->level + isearly; if (soap_tagsearch(soap->c14nexclude, id)) return NULL; if (!utilized) { for (np = soap->nlist; np; np = np->next) { if (!strcmp(np->id, id) && ((!np->ns && *id) || (np->ns && !strcmp(np->ns, ns)))) break; } if (np) { if ((np->level < level || (!np->ns && *id)) && np->index == 1) utilized = 1; else return NULL; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Adding namespace binding (level=%u) '%s' '%s' utilized=%d\n", level, id, ns ? ns : "(null)", utilized)); n = strlen(id); if (ns) k = strlen(ns) + 1; else k = 0; if (sizeof(struct soap_nlist) + n + k > n && (SOAP_MAXALLOCSIZE <= 0 || sizeof(struct soap_nlist) + n + k <= SOAP_MAXALLOCSIZE)) np = (struct soap_nlist*)SOAP_MALLOC(soap, sizeof(struct soap_nlist) + n + k); if (!np) { soap->error = SOAP_EOM; return NULL; } np->next = soap->nlist; soap->nlist = np; soap_strcpy((char*)np->id, n + 1, id); if (ns) { np->ns = np->id + n + 1; soap_strcpy((char*)np->ns, k, ns); } else { np->ns = NULL; } np->level = level; np->index = utilized; return np; } #endif /******************************************************************************/ #ifndef WITH_LEAN static void soap_utilize_ns(struct soap *soap, const char *tag, short isearly) { struct soap_nlist *np; size_t n = 0; if (!strncmp(tag, "xmlns:", 6)) { tag += 6; n = strlen(tag); } else { const char *t = strchr(tag, ':'); if (t) n = t - tag; } np = soap_lookup_ns(soap, tag, n); if (np) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Utilizing namespace of '%s' at level %u utilized=%d at level=%u\n", tag, soap->level + isearly, np->index, np->level)); if (np->index <= 0) { if (np->level == soap->level + isearly) np->index = 1; else (void)soap_push_ns(soap, np->id, np->ns, 1, isearly); } } else if (strncmp(tag, "xml", 3)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Utilizing default namespace of '%s' at level %u\n", tag, soap->level + isearly)); (void)soap_strncpy(soap->tag, sizeof(soap->tag), tag, n); (void)soap_push_ns(soap, soap->tag, NULL, 1, isearly); } } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element(struct soap *soap, const char *tag, int id, const char *type) { #ifndef WITH_LEAN const char *s; #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element begin tag='%s' level='%u' id='%d' type='%s'\n", tag, soap->level, id, type ? type : SOAP_STR_EOS)); #ifdef WITH_DOM #ifndef WITH_LEAN if (soap_tagsearch(soap->wsuid, tag)) { size_t i; for (s = tag, i = 0; *s && i < sizeof(soap->href) - 1; s++, i++) soap->href[i] = *s == ':' ? '-' : *s; soap->href[i] = '\0'; if (soap_set_attr(soap, "wsu:Id", soap->href, 1)) return soap->error; } #endif #endif soap->level++; if (soap->level > soap->maxlevel) return soap->error = SOAP_LEVEL; #ifdef WITH_DOM #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_DOM_ASIS)) { if (soap->evlev >= soap->level) soap->evlev = 0; if (soap->event == SOAP_SEC_BEGIN && !soap->evlev) { struct soap_nlist *np; /* non-nested wsu:Id found: clear xmlns, re-emit them for exc-c14n */ for (np = soap->nlist; np; np = np->next) { int p = soap->c14ninclude ? *soap->c14ninclude == '+' || soap_tagsearch(soap->c14ninclude, np->id) != NULL : 0; if (np->index == 2 || p) { struct soap_nlist *np1 = soap_push_ns(soap, np->id, np->ns, 1, 0); if (np1 && !p) np1->index = 0; } } soap->evlev = soap->level; } } #endif if ((soap->mode & SOAP_XML_DOM)) { struct soap_dom_element *elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element)); if (!elt) return soap->error = SOAP_EOM; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Adding DOM element tag='%s' %p (parent='%s' %p)\n", tag, elt, soap->dom ? soap->dom->name : "(null)", soap->dom)); elt->soap = soap; elt->next = NULL; elt->prnt = soap->dom; elt->elts = NULL; elt->atts = NULL; elt->nstr = NULL; elt->name = soap_strdup(soap, tag); elt->lead = NULL; elt->text = NULL; elt->code = NULL; elt->tail = NULL; elt->node = NULL; elt->type = 0; 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; if (!elt->name) return soap->error = SOAP_EOM; } else { #endif #ifndef WITH_LEAN if (!soap->ns) { if (!(soap->mode & SOAP_XML_CANONICAL) && soap_send(soap, soap->prolog)) 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; } if ((soap->mode & SOAP_XML_DEFAULTNS)) { size_t n = 0; s = strchr(tag, ':'); if (s) n = s++ - tag; else s = tag; if (soap_send_raw(soap, "<", 1) || soap_send(soap, s)) return soap->error; if (n) { struct Namespace *ns = soap->local_namespaces; for (; ns && ns->id; ns++) { if (*ns->id && ns->ns && !strncmp(ns->id, tag, n) && !ns->id[n]) { if (!soap->nlist || *soap->nlist->id || (soap->nlist->ns && strcmp(soap->nlist->ns, ns->ns))) { (void)soap_push_ns(soap, SOAP_STR_EOS, ns->out ? ns->out : ns->ns, 0, 0); if (soap_attribute(soap, "xmlns", ns->out ? ns->out : ns->ns)) return soap->error; } break; } } } #ifndef WITH_NOEMPTYNAMESPACES else if (!soap->nlist || *soap->nlist->id || (soap->nlist->ns && *soap->nlist->ns)) { (void)soap_push_ns(soap, SOAP_STR_EOS, SOAP_STR_EOS, 0, 0); if (soap_attribute(soap, "xmlns", SOAP_STR_EOS)) return soap->error; } #endif } 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 = soap->local_namespaces; int k = -1; if (ns) { while (k-- && ns->id) { const char *t = ns->out; if (!t) t = ns->ns; if (*ns->id && t && *t) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(ns->id) + 6), "xmlns:%s", ns->id); if (soap_attribute(soap, soap->tmpbuf, t)) return soap->error; } ns++; } } } 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)) { if ((soap->mode & SOAP_XML_DEFAULTNS)) soap_utilize_ns(soap, SOAP_STR_EOS, 0); else soap_utilize_ns(soap, tag, 0); } #endif if (id > 0) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), sizeof(SOAP_BASEREFNAME) + 20), SOAP_BASEREFNAME "%d", id); if (soap->version == 2) { if (soap_attribute(soap, "SOAP-ENC:id", soap->tmpbuf)) return soap->error; } else if (soap_attribute(soap, "id", soap->tmpbuf)) { return soap->error; } } if (type && *type && !(soap->mode & SOAP_XML_NOTYPE)) { #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_XML_CANONICAL_NA)) soap_utilize_ns(soap, type, 0); #endif if (soap_attribute(soap, "xsi:type", type)) return soap->error; } if (soap->null && soap->position > 0 && soap->version == 1) { int i; (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf) - 1, 20), "[%d", soap->positions[0]); for (i = 1; i < soap->position; i++) { size_t l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l - 1, 20), ",%d", soap->positions[i]); } soap_strcat(soap->tmpbuf, sizeof(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 && soap->local_namespaces[0].id && soap->local_namespaces[1].id) { 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->encodingStyle && soap_attribute(soap, "SOAP-ENV:encodingStyle", soap->encodingStyle)) return soap->error; } else { soap->encodingStyle = NULL; } soap->encoding = 0; } soap->null = 0; soap->position = 0; return SOAP_OK; } /******************************************************************************/ 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; #ifdef WITH_DOM if (soap->feltbegout) return soap->error = soap->feltbegout(soap, tag, id, type); #endif if (soap_element(soap, tag, id, type)) return soap->error; return soap_element_start_end_out(soap, NULL); } /******************************************************************************/ #if _MSC_VER < 1400 && !defined(HAVE_STRLCAT) /* concat string (truncating the result, strings must not be NULL) */ SOAP_FMAC1 void SOAP_FMAC2 soap_strcat(char *t, size_t n, const char *s) { size_t k = strlen(t); if (k < n) { t += k; n -= k; while (--n > 0 && *s) *t++ = *s++; *t = '\0'; } } #endif /******************************************************************************/ #if _MSC_VER < 1400 /* concat string up to m chars (leaves destination intact on overrun and returns nonzero, zero if OK) */ SOAP_FMAC1 int SOAP_FMAC2 soap_strncat(char *t, size_t n, const char *s, size_t m) { size_t k; if (!t || !s) return 1; k = strlen(t); if (n <= k + m) return 1; t += k; n -= k; while (--n > 0 && *s) *t++ = *s++; *t = '\0'; return 0; } #endif /******************************************************************************/ #ifndef HAVE_STRRCHR SOAP_FMAC1 char* SOAP_FMAC2 soap_strrchr(const char *s, int t) { char *r = NULL; while (*s) if (*s++ == t) r = (char*)s - 1; return r; } #endif /******************************************************************************/ #ifndef HAVE_STRTOL SOAP_FMAC1 long SOAP_FMAC2 soap_strtol(const char *s, char **t, int b) { long n = 0; 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')) { if (neg && n == 214748364 && c == '8') { if (t) *t = (char*)(s + 1); return -2147483648; } break; } n *= 10; n += c - '0'; s++; } if (neg) n = -n; } else /* assume 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 /******************************************************************************/ #ifndef HAVE_STRTOUL SOAP_FMAC1 unsigned long SOAP_FMAC2 soap_strtoul(const char *s, char **t, int b) { unsigned long n = 0; 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 >= 429496729 && (n > 429496729 || c >= '6')) break; n *= 10; n += c - '0'; s++; } if (neg && n > 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 /******************************************************************************/ #ifndef soap_strtoll SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_strtoll(const char *s, char **t, int b) { LONG64 n = 0LL; 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 >= 922337203685477580LL && (n > 922337203685477580LL || c >= '8')) { if (neg && n == 922337203685477580LL && c == '8') { if (t) *t = (char*)(s + 1); return -9223372036854775807LL - 1LL; /* appease compilers that complain */ } break; } n *= 10LL; n += c - '0'; s++; } if (neg) n = -n; } else /* assume 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 > 0x07FFFFFFFFFFFFFFLL) break; n <<= 4; n += c; s++; } } if (t) *t = (char*)s; return n; } #endif /******************************************************************************/ #ifndef soap_strtoull SOAP_FMAC1 ULONG64 SOAP_FMAC2 soap_strtoull(const char *s, char **t, int b) { ULONG64 n = 0UL; 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 >= 1844674407370955161ULL) break; n *= 10UL; n += c - '0'; s++; } if (neg && n > 0UL) 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 > 0x0FFFFFFFFFFFFFFFULL) break; n <<= 4; n += c; s++; } } if (t) *t = (char*)s; return n; } #endif /******************************************************************************/ 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 || soap->version == 0) return soap_element_begin_out(soap, tag, id, NULL); if (soap_element(soap, tag, id, NULL)) return soap->error; if (soap->version == 1) { if (offset && soap_attribute(soap, "SOAP-ENC:offset", offset)) return soap->error; if (soap_attribute(soap, "SOAP-ENC:arrayType", type)) return soap->error; } else { const char *s; s = strchr(type, '['); if (s && (size_t)(s - type) < sizeof(soap->tmpbuf)) { (void)soap_strncpy(soap->tmpbuf, sizeof(soap->tmpbuf), type, s - type); if (soap_attribute(soap, "SOAP-ENC:itemType", soap->tmpbuf)) return soap->error; s++; if (*s && *s != ']') { soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), s); soap->tmpbuf[strlen(soap->tmpbuf) - 1] = '\0'; if (soap_attribute(soap, "SOAP-ENC:arraySize", soap->tmpbuf)) return soap->error; } } } #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_XML_CANONICAL_NA)) soap_utilize_ns(soap, type, 0); #endif return soap_element_start_end_out(soap, NULL); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_start_end_out(struct soap *soap, const char *tag) { 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 && strchr(tp->name, ':')) soap_utilize_ns(soap, tp->name, 0); } if (soap->event == SOAP_SEC_BEGIN) { for (np = soap->nlist; np; np = np->next) if (soap_tagsearch(soap->c14ninclude, np->id)) (void)soap_push_ns(soap, np->id, np->ns, 1, 0); soap->event = 0; soap->evlev = 0; } for (np = soap->nlist; np; np = np->next) { if (np->ns && np->index == 1) { if (*np->id) (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(np->id) + 6), "xmlns:%s", np->id); else soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), "xmlns"); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enabling utilized binding (level=%u) %s='%s' SEC-BEGIN=%d c14ninclude='%s'\n", np->level, soap->tmpbuf, np->ns, soap->event == SOAP_SEC_BEGIN, soap->c14ninclude ? soap->c14ninclude : "(null)")); np->index = 2; soap->level--; if (*np->id || *np->ns || soap->level > 1) if (soap_set_attr(soap, soap->tmpbuf, np->ns, 1)) return soap->error; soap->level++; } else { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Binding (level=%u) %s='%s' utilized=%d\n", np->level, np->id, np->ns, np->index)); } } } #endif #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { 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)->text = soap_strdup(soap, tp->value); (*att)->soap = soap; if (!(*att)->name || (tp->value && !(*att)->text)) return soap->error = SOAP_EOM; att = &(*att)->next; tp->visible = 0; } } return SOAP_OK; } #endif for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { if (soap_send_raw(soap, " ", 1) || 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, tp->flag) || soap_send_raw(soap, "\"", 1)) return soap->error; } else { if (soap_send_raw(soap, "=\"\"", 3)) 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 if (soap->nlist) soap_pop_namespace(soap); soap->level--; /* decrement level just before /> */ soap->body = 0; return soap_send_raw(soap, "/>", 2); } return soap_send_raw(soap, ">", 1); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_out(struct soap *soap, const char *tag) { if (*tag == '-') return SOAP_OK; #ifdef WITH_DOM if (soap->feltendout) return soap->error = soap->feltendout(soap, tag); #endif return soap_element_end(soap, tag); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_end(struct soap *soap, const char *tag) { #ifndef WITH_LEAN const char *s; #endif 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->nlist) soap_pop_namespace(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; } if ((soap->mode & SOAP_XML_DEFAULTNS) && (s = strchr(tag, ':')) != NULL) tag = s + 1; #endif if (soap_send_raw(soap, "error; soap->level--; /* decrement level just before > */ return soap_send_raw(soap, ">", 1); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_ref(struct soap *soap, const char *tag, int id, int href) { const char *s = "ref"; int n = 1; if (soap->version == 1) { s = "href"; n = 0; } else if (soap->version == 2) { s = "SOAP-ENC:ref"; } (SOAP_SNPRINTF(soap->href, sizeof(soap->href), sizeof(SOAP_BASEREFNAME) + 21), "#" SOAP_BASEREFNAME "%d", href); return soap_element_href(soap, tag, id, s, soap->href + n); } /******************************************************************************/ 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; soap->body = 0; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_null(struct soap *soap, const char *tag, int id, const char *type) { struct soap_attribute *tp = NULL; 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) || (!tp && soap_attribute(soap, "xsi:nil", "true")) || soap_element_start_end_out(soap, tag)) return soap->error; soap->body = 0; } else { soap->null = 1; soap->position = 0; soap->mustUnderstand = 0; } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_empty(struct soap *soap, const char *tag) { if (soap_element(soap, tag, -1, NULL)) return soap->error; return soap_element_start_end_out(soap, tag); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_nil(struct soap *soap, const char *tag) { if (soap_element(soap, tag, -1, NULL) || (soap_attribute(soap, "xsi:nil", "true"))) return soap->error; return soap_element_start_end_out(soap, tag); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_id(struct soap *soap, const char *tag, int id, const void *p, const void *a, int n, const char *type, int t, char **mark) { (void)a; (void)n; if (!p) { soap->error = soap_element_null(soap, tag, id, type); return -1; } #ifndef WITH_NOIDREF DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element_id %p type=%d id=%d\n", p, t, id)); if ((!soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH)) || (soap->mode & SOAP_XML_TREE)) return soap_check_and_mark(soap, p, t, mark); if (mark) *mark = NULL; if (id < -1) return soap_embed(soap, p, a, n, t); else 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 soap_check_and_mark(soap, p, t, mark); #endif } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_check_and_mark(struct soap *soap, const void *p, int t, char **mark) { if (mark) { struct soap_plist *pp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Check %p and mark %p\n", p, (void*)mark)); if (!soap_pointer_lookup(soap, p, t, &pp)) if (!soap_pointer_enter(soap, p, NULL, 0, t, &pp)) return -1; if ((soap->mode & SOAP_IO_LENGTH)) { if (pp->mark1 > 0) return -1; pp->mark1 = 1; *mark = &pp->mark1; } else { if (pp->mark2 > 0) return -1; pp->mark2 = 1; *mark = &pp->mark2; } } return 0; } /******************************************************************************/ SOAP_FMAC1 void * SOAP_FMAC2 soap_mark_lookup(struct soap *soap, const void *p, int t, struct soap_plist **ppp, char **mark) { if (!soap) return NULL; if (mark || !(soap->mode & SOAP_XML_TREE)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Mark lookup %p type=%d\n", p, t)); if (!soap_pointer_lookup(soap, p, t, ppp)) { if (!soap_pointer_enter(soap, p, NULL, 0, t, ppp)) return NULL; } else if (!(soap->mode & SOAP_XML_TREE)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Mark found %p\n", (*ppp)->dup)); return (*ppp)->dup; } if (mark) { if ((*ppp)->mark1 > 0) (*ppp)->mark1 = 2; /* cycle */ else (*ppp)->mark1 = 1; /* cycle detection */ *mark = &(*ppp)->mark1; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Mark cycle %d\n", (*ppp)->mark1)); } } return NULL; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_mark_cycle(struct soap *soap, struct soap_plist *pp) { (void)soap; return pp && pp->mark1 == 2 && (soap->mode & SOAP_XML_TREE); } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_mark_dup(struct soap *soap, void *a, struct soap_plist *pp) { (void)soap; if (pp) pp->dup = a; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_unmark(struct soap *soap, char *mark) { (void)soap; if (mark) *mark = 0; /* release detection */ } /******************************************************************************/ 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; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_check_result(struct soap *soap, const char *tag) { (void)tag; if (soap->version == 2 && soap->encodingStyle) { soap_instring(soap, ":result", NULL, NULL, 0, 2, -1, -1, NULL); /* just ignore content for compliance reasons, but should compare tag to element's QName value? */ } } /******************************************************************************/ 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) { 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->text = soap_strdup(soap, value); a->soap = soap; soap->dom->atts = a; if (!a->name || (value && !a->text)) return soap->error = SOAP_EOM; return SOAP_OK; } #endif #ifndef WITH_LEAN if ((soap->mode & SOAP_XML_CANONICAL)) { /* push namespace */ if (!strncmp(name, "xmlns", 5) && ((name[5] == ':') || name[5] == '\0')) { if (name[5] == ':' && soap->c14ninclude && ((*soap->c14ninclude == '*' || soap_tagsearch(soap->c14ninclude, name + 6)))) soap_utilize_ns(soap, name, 0); (void)soap_push_ns(soap, name + 5 + (name[5] == ':'), value, 0, 0); } else { soap->level--; if (soap_set_attr(soap, name, value, 1)) return soap->error; soap->level++; } } else #endif { if (soap_send_raw(soap, " ", 1) || 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; } /******************************************************************************/ 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; soap->error = soap_match_tag(soap, soap->tag, tag); if (!soap->error) { if (type && *soap->type && soap_match_tag(soap, soap->type, type)) return soap->error = SOAP_TYPE; soap->peeked = 0; if (!nillable && soap->null && (soap->mode & SOAP_XML_STRICT)) return soap->error = SOAP_NULL; if (soap->body) { soap->level++; if (soap->level > soap->maxlevel) return soap->error = SOAP_LEVEL; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin tag found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag ? tag : SOAP_STR_EOS)); soap->error = SOAP_OK; } } else if (soap->error == SOAP_NO_TAG && tag && *tag == '-') { soap->error = SOAP_OK; } return soap->error; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_element_end_in(struct soap *soap, const char *tag) { soap_wchar c; char *s = NULL; 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 significant for DOM "as-is" */ if ((soap->mode & SOAP_XML_DOM) && soap->dom) { const char *t = soap->dom->code; /* save XML code */ s = soap_string_in(soap, -1, -1, -1, NULL); if (!soap->peeked && !s) return soap->error; if (soap->dom->prnt) soap->dom = soap->dom->prnt; if (s && (soap->mode & SOAP_XML_STRICT)) { for (; *s; s++) if (!soap_coblank((soap_wchar)*s)) return soap->error = SOAP_END_TAG; /* reject mixed content before ending tag */ } soap->dom->code = t; /* restore XML code */ } #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_CHK_EOF; if (!soap_coblank(c)) { if ((soap->mode & SOAP_XML_STRICT)) return soap->error = SOAP_END_TAG; /* reject mixed content before ending tag */ if (c == SOAP_LT) n++; else if (c == '/') { c = soap_get(soap); if (c == SOAP_GT && n > 0) n--; else soap_unget(soap, c); } } } } while (n-- > 0); s = soap->tag; n = sizeof(soap->tag); while ((c = soap_get(soap)) > 32) { if (n > 1) { *s++ = (char)c; n--; } } *s = '\0'; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; while (soap_coblank(c)) c = soap_get(soap); if (c != SOAP_GT) return soap->error = SOAP_SYNTAX_ERROR; #ifndef WITH_LEAN #ifdef WITH_DOM if (soap->feltendin) { int err = soap->error; soap->error = soap->feltendin(soap, soap->tag, tag); if (soap->error) return soap->error; if (err) return soap->error = err; /* restore error */ } #endif #endif 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 tag '%s' does not match '%s'\n", soap->tag, tag ? tag : SOAP_STR_EOS)); return soap->error = SOAP_SYNTAX_ERROR; } } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End tag found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag ? tag : SOAP_STR_EOS)); soap->level--; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 const char * SOAP_FMAC2 soap_attr_value(struct soap *soap, const char *name, int flag, int occurs) { struct soap_attribute *tp; if (*name == '-') return SOAP_STR_EOS; for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible == 2 && !soap_match_att(soap, tp->name, name)) break; } if (tp) { if (occurs == 4 || (occurs == 2 && (soap->mode & SOAP_XML_STRICT))) soap->error = SOAP_PROHIBITED; else if (flag >= 4) return soap_collapse(soap, tp->value, flag, 1); else return tp->value; } else if (occurs == 3 || (occurs == 1 && (soap->mode & SOAP_XML_STRICT))) { soap->error = SOAP_REQUIRED; } else { soap->error = SOAP_OK; } return NULL; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_set_attr(struct soap *soap, const char *name, const char *value, int flag) { struct soap_attribute *tp, *tq; if (*name == '-') return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set attribute %s='%s'\n", name, value ? value : SOAP_STR_EOS)); tq = NULL; for (tp = soap->attributes; tp; tq = tp, tp = tp->next) { if (!strcmp(tp->name, name)) break; } if (!tp) { size_t l = strlen(name); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute %s\n", name)); if (sizeof(struct soap_attribute) + l > l && (SOAP_MAXALLOCSIZE <= 0 || sizeof(struct soap_attribute) + l <= SOAP_MAXALLOCSIZE)) tp = (struct soap_attribute*)SOAP_MALLOC(soap, sizeof(struct soap_attribute) + l); if (!tp) 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 { struct soap_nlist *np = soap_lookup_ns(soap, name, s - name); if (np) { tp->ns = np->ns; } else { struct soap_attribute *tq; for (tq = soap->attributes; tq; tq = tq->next) { if (!strncmp(tq->name, "xmlns:", 6) && !strncmp(tq->name + 6, name, s - name) && !tq->name[6 + s - name]) { tp->ns = tq->ns; break; } } } for (; *tpp; tpp = &(*tpp)->next) { int k; 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 if (tq) { tq->next = tp; tp->next = NULL; } else { tp->next = soap->attributes; soap->attributes = tp; } soap_strcpy((char*)tp->name, l + 1, 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, (void*)tp->value)); SOAP_FREE(soap, tp->value); tp->value = NULL; tp->ns = NULL; } if (value) { if (!tp->value) { tp->size = strlen(value) + 1; if (SOAP_MAXALLOCSIZE <= 0 || tp->size <= SOAP_MAXALLOCSIZE) tp->value = (char*)SOAP_MALLOC(soap, tp->size); if (!tp->value) return soap->error = SOAP_EOM; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute value for %s (%p)\n", tp->name, (void*)tp->value)); } soap_strcpy(tp->value, tp->size, value); if (!strncmp(tp->name, "xmlns:", 6)) tp->ns = tp->value; tp->visible = 2; tp->flag = (short)flag; #ifndef WITH_LEAN if (!strcmp(name, "wsu:Id")) { soap->event = SOAP_SEC_BEGIN; soap_strcpy(soap->id, sizeof(soap->id), value); } if ((soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_XML_CANONICAL_NA)) { const char *s = strchr(name, ':'); if (s && strchr(value, ':')) { struct soap_nlist *np = soap_lookup_ns(soap, name, s - name); if (np && np->ns && soap->local_namespaces) { if ((!strcmp(s + 1, "type") && !strcmp(np->ns, soap->local_namespaces[2].ns)) /* xsi:type QName */ || ((!strcmp(s + 1, "arrayType") || !strcmp(s + 1, "itemType")) && !strcmp(np->ns, soap->local_namespaces[1].ns))) /* SOAP-ENC:arrayType and SOAP-ENC:itemType QName */ soap_utilize_ns(soap, value, 1); } } } #endif } else { tp->visible = 1; } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_clr_attr(struct soap *soap) { 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; } } /******************************************************************************/ static int soap_getattrval(struct soap *soap, char *s, size_t *n, soap_wchar d) { char buf[8]; size_t i; size_t k = *n; size_t m = 0; char *t = buf; for (i = 0; i < k; i++) { soap_wchar c; if (m) { *s++ = *t++; m--; continue; } if ((soap->mode & SOAP_C_UTFSTRING)) { c = soap_get(soap); if ((c & 0x80000000) && c >= -0x7FFFFF80 && c < SOAP_AP) { t = buf; c &= 0x7FFFFFFF; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { #ifdef WITH_REPLACE_ILLEGAL_UTF8 if (!((c >= 0x80 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD) || (c >= 0x10000 && c <= 0x10FFFF))) c = SOAP_UNKNOWN_UNICODE_CHAR; #endif 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 = t - buf - 1; if (i + m >= k) { soap_unget(soap, c | 0x80000000); *n = i; return soap->error = SOAP_EOM; } t = buf; *s++ = *t++; continue; } } else { c = soap_getutf8(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'; *n = i + 1; return SOAP_OK; } *s++ = '>'; break; case SOAP_QT: if (c == d) { *s = '\0'; *n = i + 1; return SOAP_OK; } *s++ = '"'; break; case SOAP_AP: if (c == d) { *s = '\0'; *n = i + 1; return SOAP_OK; } *s++ = '\''; break; case '\t': case '\n': case '\r': case ' ': case '/': if (d == ' ') { soap_unget(soap, c); *s = '\0'; *n = i + 1; return SOAP_OK; } *s++ = (char)c; break; default: if ((int)c == EOF) { *s = '\0'; *n = i + 1; return soap->error = SOAP_CHK_EOF; } *s++ = (char)c; } } return soap->error = SOAP_EOM; } /******************************************************************************/ #ifdef WITH_FAST 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 /******************************************************************************/ #ifdef WITH_FAST SOAP_FMAC1 int SOAP_FMAC2 soap_append_lab(struct soap *soap, const char *s, size_t n) { if (soap->labidx + n < soap->labidx) return soap->error = SOAP_EOM; if (soap->labidx + n >= soap->lablen) { char *t = soap->labbuf; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enlarging look-aside buffer to append data, size=%lu\n", (unsigned long)soap->lablen)); if (soap->lablen == 0) soap->lablen = SOAP_LABLEN; while (soap->labidx + n >= soap->lablen) { if (soap->lablen << 1 < soap->lablen) return soap->error = SOAP_EOM; soap->lablen <<= 1; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New look-aside buffer size=%lu\n", (unsigned long)soap->lablen)); if (SOAP_MAXALLOCSIZE > 0 && soap->lablen > SOAP_MAXALLOCSIZE) return soap->error = SOAP_EOM; soap->labbuf = (char*)SOAP_MALLOC(soap, soap->lablen); if (!soap->labbuf) { if (t) SOAP_FREE(soap, t); return soap->error = SOAP_EOM; } if (t) { (void)soap_memcpy((void*)soap->labbuf, soap->lablen, (const void*)t, soap->labidx); SOAP_FREE(soap, t); } } if (s) { (void)soap_memcpy((void*)(soap->labbuf + soap->labidx), soap->lablen - soap->labidx, (const void*)s, n); soap->labidx += n; } return SOAP_OK; } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_peek_element(struct soap *soap) { #ifdef WITH_DOM struct soap_dom_attribute **att = NULL; char *lead = NULL; #endif struct soap_attribute *tp, *tq = NULL; const char *t; char *s; soap_wchar c; 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; /* UTF-8 BOM? */ c = soap_getchar(soap); if (c == 0xEF && soap_get0(soap) == 0xBB) { soap_get1(soap); c = soap_get1(soap); if (c == 0xBF) soap->mode &= ~SOAP_ENC_LATIN; else soap_unget(soap, (0x0F << 12) | (0xBB << 6) | (c & 0x3F)); /* UTF-8 */ } else if ((c == 0xFE && soap_get0(soap) == 0xFF) /* UTF-16 BE */ || (c == 0xFF && soap_get0(soap) == 0xFE)) /* UTF-16 LE */ { return soap->error = SOAP_UTF_ERROR; } else { soap_unget(soap, c); } c = soap_get(soap); #ifdef WITH_DOM /* whitespace leading up to the start tag is significant for DOM as-is (but comments and PIs are removed from this lead) */ if (soap_coblank(c)) { soap->labidx = 0; do { if (soap_append_lab(soap, NULL, 0)) return soap->error; s = soap->labbuf + soap->labidx; i = soap->lablen - soap->labidx; soap->labidx = soap->lablen; while (soap_coblank(c) && i-- > 0) { *s++ = c; c = soap_get(soap); } } while (soap_coblank(c) || i == 0); *s = '\0'; lead = soap->labbuf; } #else /* skip space */ while (soap_coblank(c)) c = soap_get(soap); #endif if (c != SOAP_LT) { *soap->tag = '\0'; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; soap_unget(soap, c); #ifdef WITH_DOM /* whitespace leading up to the end tag is significant for DOM as-is */ if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (lead && *lead) soap->dom->tail = soap_strdup(soap, lead); else soap->dom->tail = SOAP_STR_EOS; /* body with closing tag instead of */ } #endif return soap->error = SOAP_NO_TAG; } do { c = soap_get1(soap); } while (soap_coblank(c)); s = soap->tag; i = sizeof(soap->tag); while (c != '>' && c != '/' && c > 32 && (int)c != EOF) { if (i > 1) { *s++ = (char)c; i--; } c = soap_get1(soap); } *s = '\0'; while (soap_coblank(c)) c = soap_get1(soap); #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM)) { 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->prnt = soap->dom; elt->elts = NULL; elt->atts = NULL; elt->nstr = NULL; elt->name = soap_strdup(soap, soap->tag); elt->text = NULL; elt->code = NULL; elt->tail = NULL; elt->node = NULL; elt->type = 0; if (lead && *lead) elt->lead = soap_strdup(soap, lead); else elt->lead = 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; if (!elt->name) return soap->error = SOAP_EOM; } #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 != '/' && c > 32 && (int)c != EOF) { if (i > 1) { *s++ = (char)c; i--; } 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)->text = NULL; (*att)->soap = soap; if (!(*att)->name) return soap->error = SOAP_EOM; } #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) { size_t l = strlen(soap->tmpbuf); tp = (struct soap_attribute*)SOAP_MALLOC(soap, sizeof(struct soap_attribute) + l); if (!tp) return soap->error = SOAP_EOM; (void)soap_memcpy((char*)tp->name, l + 1, soap->tmpbuf, l + 1); tp->value = NULL; tp->size = 0; tp->ns = NULL; tp->visible = 0; /* append attribute to the end of the list */ if (tq) { tq->next = tp; tp->next = NULL; } else { tp->next = soap->attributes; soap->attributes = tp; } } while (soap_coblank(c)) c = soap_get1(soap); if (c == '=') { size_t k; do { c = soap_getutf8(soap); } while (soap_coblank(c)); if (c != SOAP_QT && c != SOAP_AP) { soap_unget(soap, c); c = ' '; /* blank delimiter */ } k = tp->size; if (soap_getattrval(soap, tp->value, &k, c)) { #ifdef WITH_FAST if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; if (soap_store_lab(soap, tp->value, k)) return soap->error; if (tp->value) SOAP_FREE(soap, tp->value); tp->value = NULL; for (;;) { k = soap->lablen - soap->labidx; if (soap_getattrval(soap, soap->labbuf + soap->labidx, &k, 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; } tp->value = (char*)SOAP_MALLOC(soap, tp->size); if (!tp->value) return soap->error = SOAP_EOM; soap_strcpy(tp->value, tp->size, soap->labbuf); #else tp->size = k; if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; if (soap_alloc_block(soap) == NULL) return soap->error; for (;;) { s = (char*)soap_push_block(soap, NULL, SOAP_BLKLEN); if (!s) return soap->error; k = SOAP_BLKLEN; if (soap_getattrval(soap, s, &k, c)) { if (soap->error != SOAP_EOM) return soap->error; soap->error = SOAP_OK; soap_size_block(soap, NULL, k); } else { break; } } k = tp->size + soap->blist->size; if (SOAP_MAXALLOCSIZE > 0 && k > SOAP_MAXALLOCSIZE) return soap->error = SOAP_EOM; s = (char*)SOAP_MALLOC(soap, k); if (!s) return soap->error = SOAP_EOM; if (tp->value) { (void)soap_memcpy((void*)s, k, (const void*)tp->value, tp->size); SOAP_FREE(soap, tp->value); } soap_save_block(soap, NULL, s + tp->size, 0); tp->value = s; tp->size = k; #endif } if (tp->visible) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Duplicate attribute in %s\n", soap->tag)); return soap->error = SOAP_SYNTAX_ERROR; /* redefined (duplicate) attribute */ } tp->visible = 2; /* seen this attribute w/ value */ do { c = soap_get1(soap); } while (soap_coblank(c)); #ifdef WITH_DOM if (att && tp->value) { (*att)->text = soap_strdup(soap, tp->value); if (!(*att)->text) return soap->error = SOAP_EOM; } #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) == NULL) return soap->error; } } #ifdef WITH_DOM if (att) { soap->dom->nstr = soap_current_namespace_tag(soap, soap->tag); for (att = &soap->dom->atts; *att; att = &(*att)->next) (*att)->nstr = soap_current_namespace_att(soap, (*att)->name); } #endif if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; soap->body = (c != '/'); if (!soap->body) { do { c = soap_get1(soap); } while (soap_coblank(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->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH)) { *soap->id = '#'; soap_strcpy(soap->id + 1, sizeof(soap->id) - 1, tp->value); } } else if (!strcmp(tp->name, "href")) { if ((soap->version == 1 && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH) || ((soap->mode & (SOAP_ENC_MTOM | SOAP_ENC_DIME)) && *tp->value != '#')) soap_strcpy(soap->href, sizeof(soap->href), tp->value); } else if (!strcmp(tp->name, "ref")) { if ((soap->version == 2 && !(soap->imode & SOAP_XML_TREE)) || (soap->mode & SOAP_XML_GRAPH)) { *soap->href = '#'; soap_strcpy(soap->href + (*tp->value != '#'), sizeof(soap->href) - 1, tp->value); } } #else if (!strcmp(tp->name, "href")) { if ((soap->mode & (SOAP_ENC_MTOM | SOAP_ENC_DIME)) && *tp->value != '#') soap_strcpy(soap->href, sizeof(soap->href), tp->value); } #endif else if (!soap_match_tag(soap, tp->name, "xsi:type")) { soap_strcpy(soap->type, sizeof(soap->type), tp->value); } 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_match_tag(soap, tp->name, "SOAP-ENV:encodingStyle")) { if (!soap->encodingStyle) soap->encodingStyle = SOAP_STR_EOS; soap_version(soap); } 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)) { (void)soap_strncpy(soap->arrayType, sizeof(soap->arrayType), tp->value, s - tp->value); soap_strcpy(soap->arraySize, sizeof(soap->arraySize), s); } else soap_strcpy(soap->arrayType, sizeof(soap->arrayType), tp->value); } else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:offset")) { soap_strcpy(soap->arrayOffset, sizeof(soap->arrayOffset), tp->value); } 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 (!soap_match_tag(soap, tp->name, "SOAP-ENC:id")) { *soap->id = '#'; soap_strcpy(soap->id + 1, sizeof(soap->id) - 1, tp->value); } else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:ref")) { *soap->href = '#'; soap_strcpy(soap->href + (*tp->value != '#'), sizeof(soap->href) - 1, tp->value); } else #endif if (!soap_match_tag(soap, tp->name, "SOAP-ENC:itemType")) { soap_strcpy(soap->arrayType, sizeof(soap->arrayType), tp->value); } else if (!soap_match_tag(soap, tp->name, "SOAP-ENC:arraySize")) { soap_strcpy(soap->arraySize, sizeof(soap->arraySize), tp->value); } 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; } } else { if (!soap_match_tag(soap, tp->name, "wsdl:required") && !strcmp(tp->value, "true")) soap->mustUnderstand = 1; } } } #ifdef WITH_DOM if (soap->feltbegin) return soap->error = soap->feltbegin(soap, soap->tag); #endif return soap->error = SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_retry(struct soap *soap) { soap->error = SOAP_OK; soap_revert(soap); } /******************************************************************************/ 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 to last element '%s' (level=%u)\n", soap->tag, soap->level)); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_ignore(struct soap *soap) { int n = 0; soap_wchar c; soap->level++; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Ignoring XML content at level=%u\n", soap->level)); #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { if (!soap_string_in(soap, -1, -1, -1, NULL)) return soap->error; } else #endif { for (;;) { c = soap_get(soap); switch (c) { case SOAP_TT: if (n == 0) goto end; n--; break; case SOAP_LT: n++; break; case '/': if (n > 0) { c = soap_get0(soap); if (c == '>') n--; } break; default: if ((int)c == EOF) return soap->error = SOAP_EOF; } } end: soap_unget(soap, c); } return soap_element_end_in(soap, NULL); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_string_out(struct soap *soap, const char *s, int flag) { const char *t; soap_wchar c; soap_wchar mask = (soap_wchar)0xFFFFFF80UL; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_strdup(soap, s); if (!soap->dom->text) return soap->error = SOAP_EOM; return SOAP_OK; } #endif if (flag == 2 || (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 '&': 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; case 0x7F: 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; int m = mbtowc(&wc, t - 1, MB_CUR_MAX); if (m > 0 && !((soap_wchar)wc == c && m == 1 && c < 0x80)) { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, (unsigned long)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); } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_string_in(struct soap *soap, int flag, long minlen, long maxlen, const char *pattern) { char *s; char *t = NULL; size_t i; ULONG64 l = 0; int n = 0, f = 0, m = 0; 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 if (maxlen < 0 && soap->maxlength > 0) maxlen = soap->maxlength; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reading string content, flag=%d\n", flag)); if (flag <= 0 && soap->peeked && *soap->tag) { #ifndef WITH_LEAN struct soap_attribute *tp; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String content includes tag '%s' and attributes\n", soap->tag)); t = soap->tmpbuf; *t = '<'; soap_strcpy(t + 1, sizeof(soap->tmpbuf) - 1, soap->tag); t += strlen(t); for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { size_t k = strlen(tp->name); if (t + k + 1 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; /* too many or attribute values to large */ *t++ = ' '; (void)soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->name, k); t += k; if (tp->value) { k = strlen(tp->value); if (t + k + 3 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; /* too many or attribute values to large */ *t++ = '='; *t++ = '"'; (void)soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->value, k); t += k; *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 <= 0) { int state = 0; #ifdef WITH_FAST soap->labidx = 0; /* use look-aside buffer */ #else if (soap_alloc_block(soap) == NULL) return NULL; #endif for (;;) { #ifdef WITH_FAST 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 size_t k = SOAP_BLKLEN; s = (char*)soap_push_block(soap, NULL, k); if (!s) 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 || c < SOAP_AP) && state != 1 && !(soap->mode & SOAP_ENC_LATIN)) { if ((c & 0x7FFFFFFF) >= 0x80) { soap_unget(soap, c); c = soap_getutf8(soap); } if ((c & 0x7FFFFFFF) >= 0x80 && (flag <= 0 || (soap->mode & SOAP_C_UTFSTRING))) { c &= 0x7FFFFFFF; t = buf; if (c < 0x0800) *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); else { #ifdef WITH_REPLACE_ILLEGAL_UTF8 if (!((c >= 0x80 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD) || (c >= 0x10000 && c <= 0x10FFFF))) c = SOAP_UNKNOWN_UNICODE_CHAR; #endif 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++ = (char)c; continue; case 2: if (c == '-') state = 6; *s++ = (char)c; continue; case 3: if (c == '?') state = 8; *s++ = (char)c; continue; /* CDATA */ case 4: if (c == ']') state = 5; else state = 1; *s++ = (char)c; continue; case 5: if (c == '>') state = 0; else if (c != ']') state = 1; *s++ = (char)c; continue; /* comment */ case 6: if (c == '-') state = 7; else state = 2; *s++ = (char)c; continue; case 7: if (c == '>') state = 0; else if (c != '-') state = 2; *s++ = (char)c; continue; /* PI */ case 8: if (c == '>') state = 0; else if (c != '?') state = 3; *s++ = (char)c; continue; } switch (c) { case SOAP_TT: if (n == 0) goto end; n--; *s++ = '<'; t = (char*)"/"; m = 1; break; case SOAP_LT: if (flag == 3 || (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_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 == '-') { c = soap_getchar(soap); if (c == '-') 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 if (flag == 3 || (f && n == 0)) { soap_revget1(soap); c = '<'; goto end; } 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)) { #if defined(WIN32) && !defined(CYGWIN) && !defined(__MINGW32__) && !defined(__MINGW64__) && !defined(__BORLANDC__) m = 0; wctomb_s(&m, buf, sizeof(buf), (wchar_t)(c & 0x7FFFFFFF)); #else m = wctomb(buf, (wchar_t)(c & 0x7FFFFFFF)); #endif 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 (maxlen >= 0 && l > (size_t)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_alloc_block(soap) == NULL) return NULL; #endif for (;;) { #ifdef WITH_FAST 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 size_t k = SOAP_BLKLEN; s = (char*)soap_push_block(soap, NULL, k); if (!s) return NULL; #endif for (i = 0; i < k; i++) { if (m > 0) { *s++ = *t++; /* copy multibyte characters */ m--; continue; } #ifndef WITH_CDATA if (flag <= 0) c = soap_getchar(soap); else #endif { c = soap_getutf8(soap); if ((soap->mode & SOAP_C_UTFSTRING)) { if (c >= 0x80 || (c < SOAP_AP && c >= -0x7FFFFF80)) { c &= 0x7FFFFFFF; t = buf; if (c < 0x0800) { *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); } else { #ifdef WITH_REPLACE_ILLEGAL_UTF8 if (!((c >= 0x80 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD) || (c >= 0x10000 && c <= 0x10FFFF))) c = SOAP_UNKNOWN_UNICODE_CHAR; #endif 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++; l++; if (maxlen >= 0 && l > (size_t)maxlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen)); soap->error = SOAP_LENGTH; return NULL; } continue; } } } switch (c) { case SOAP_TT: if (n == 0) goto end; n--; *s++ = '<'; t = (char*)"/"; m = 1; break; case SOAP_LT: if (flag == 3 || (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) { if (flag > 0) { c = soap_get(soap); if (c == SOAP_GT) n--; } else { c = soap_getchar(soap); if (c == '>') n--; } soap_unget(soap, c); } *s++ = '/'; break; case (soap_wchar)('<' | 0x80000000): if (flag > 0) { *s++ = '<'; } else { *s++ = '&'; t = (char*)"lt;"; m = 3; } break; case (soap_wchar)('>' | 0x80000000): if (flag > 0) { *s++ = '>'; } else { *s++ = '&'; t = (char*)"gt;"; m = 3; } break; case (soap_wchar)('&' | 0x80000000): if (flag > 0) { *s++ = '&'; } else { *s++ = '&'; t = (char*)"amp;"; m = 4; } break; case (soap_wchar)('"' | 0x80000000): if (flag > 0) { *s++ = '"'; } else { *s++ = '&'; t = (char*)"quot;"; m = 5; } break; case (soap_wchar)('\'' | 0x80000000): if (flag > 0) { *s++ = '\''; } else { *s++ = '&'; t = (char*)"apos;"; m = 5; } break; default: if ((int)c == EOF) goto end; #ifndef WITH_CDATA if (c == '<') { c = soap_getchar(soap); soap_unget(soap, c); if (c == '/') { c = SOAP_TT; if (n == 0) goto end; n--; } else { n++; } *s++ = '<'; } else #endif #ifndef WITH_LEANER #ifdef HAVE_WCTOMB if ((soap->mode & SOAP_C_MBSTRING)) { #if defined(WIN32) && !defined(CYGWIN) && !defined(__MINGW32__) && !defined(__MINGW64__) && !defined(__BORLANDC__) m = 0; wctomb_s(&m, buf, sizeof(buf), (wchar_t)(c & 0x7FFFFFFF)); #else m = wctomb(buf, (wchar_t)(c & 0x7FFFFFFF)); #endif 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 (maxlen >= 0 && l > (size_t)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); if (!t) return NULL; #else soap_size_block(soap, NULL, i + 1); t = soap_save_block(soap, NULL, NULL, 0); #endif if (minlen > 0 && l < (size_t)minlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too short: %lu chars, minlen=%ld\n", (unsigned long)l, minlen)); soap->error = SOAP_LENGTH; return NULL; } #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom && *t) { if (flag > 0) soap->dom->text = t; else soap->dom->code = t; } #endif if (flag == 2) { if (soap_s2QName(soap, t, &t, minlen, maxlen, pattern)) return NULL; } else if (flag >= 4 && t) { t = soap_collapse(soap, t, flag, 1); } #ifndef WITH_LEANER else if (pattern && soap->fsvalidate) { soap->error = soap->fsvalidate(soap, pattern, t); if (soap->error) return NULL; } #endif return t; } /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_wstring_out(struct soap *soap, const wchar_t *s, int flag) { const char *t; char tmp; soap_wchar c; #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_wchar2s(soap, 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 { /* check for UTF16 encoding when wchar_t is too small to hold UCS */ if (sizeof(wchar_t) < 4 && (c & 0xFC00) == 0xD800) { soap_wchar d = *s; if ((d & 0xFC00) == 0xDC00) { c = ((c - 0xD800) << 10) + (d - 0xDC00) + 0x10000; s++; } #ifdef WITH_REPLACE_ILLEGAL_UTF8 else { c = SOAP_UNKNOWN_UNICODE_CHAR; /* Malformed UTF-16 */ } #endif } if (soap_pututf8(soap, (unsigned long)c)) return soap->error; } continue; } if (soap_send(soap, t)) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 wchar_t * SOAP_FMAC2 soap_wstring_in(struct soap *soap, int flag, long minlen, long maxlen, const char *pattern) { wchar_t *s; int i, n = 0, f = 0; ULONG64 l = 0; soap_wchar c; char *t = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reading wide string content\n")); if (maxlen < 0 && soap->maxlength > 0) maxlen = soap->maxlength; if (flag <= 0 && soap->peeked && *soap->tag) { #ifndef WITH_LEAN struct soap_attribute *tp; t = soap->tmpbuf; *t = '<'; soap_strcpy(t + 1, sizeof(soap->tmpbuf) - 1, soap->tag); t += strlen(t); for (tp = soap->attributes; tp; tp = tp->next) { if (tp->visible) { size_t k = strlen(tp->name); if (t + k + 1 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; *t++ = ' '; (void)soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->name, k); t += k; if (tp->value) { k = strlen(tp->value); if (t + k + 3 >= soap->tmpbuf + sizeof(soap->tmpbuf)) break; *t++ = '='; *t++ = '"'; (void)soap_strncpy(t, sizeof(soap->tmpbuf) - (t - soap->tmpbuf), tp->value, k); t += k; *t++ = '"'; } } } if (!soap->body) *t++ = '/'; *t++ = '>'; *t = '\0'; t = soap->tmpbuf; #endif if (soap->body) n = 1; f = 1; soap->peeked = 0; } if (soap_alloc_block(soap) == NULL) return NULL; for (;;) { s = (wchar_t*)soap_push_block(soap, NULL, sizeof(wchar_t)*SOAP_BLKLEN); if (!s) 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++ = L'<'; soap_unget(soap, '/'); break; case SOAP_LT: if (flag == 3 || (f && n == 0)) goto end; n++; *s++ = L'<'; break; case SOAP_GT: *s++ = L'>'; break; case SOAP_QT: *s++ = L'"'; break; case SOAP_AP: *s++ = L'\''; break; case '/': if (n > 0) { c = soap_getutf8(soap); if (c == SOAP_GT) n--; soap_unget(soap, c); } *s++ = L'/'; break; case '<': if (flag > 0) { *s++ = L'<'; } else { *s++ = L'&'; t = (char*)"lt;"; } break; case '>': if (flag > 0) { *s++ = L'>'; } else { *s++ = (wchar_t)'&'; t = (char*)"gt;"; } break; case '"': if (flag > 0) { *s++ = L'"'; } else { *s++ = L'&'; t = (char*)"quot;"; } break; default: if ((int)c == EOF) goto end; /* use UTF16 encoding when wchar_t is too small to hold UCS */ if (sizeof(wchar_t) < 4 && c > 0xFFFF) { soap_wchar c1, c2; c1 = 0xD800 - (0x10000 >> 10) + (c >> 10); c2 = 0xDC00 + (c & 0x3FF); c = c1; soap_unget(soap, c2); } *s++ = (wchar_t)(c & 0x7FFFFFFF); } l++; if (maxlen >= 0 && l > (size_t)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 = L'\0'; soap_size_block(soap, NULL, sizeof(wchar_t) * (i + 1)); if (minlen > 0 && l < (size_t)minlen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "String too short: %lu chars, minlen=%ld\n", (unsigned long)l, minlen)); soap->error = SOAP_LENGTH; return NULL; } s = (wchar_t*)soap_save_block(soap, NULL, NULL, 0); #ifndef WITH_LEAN if (flag >= 4 && s) s = soap_wcollapse(soap, s, flag, 1); #endif #ifndef WITH_LEANER if (pattern && soap->fwvalidate) { soap->error = soap->fwvalidate(soap, pattern, s); if (soap->error) return NULL; } #endif #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) soap->dom->text = soap_wchar2s(soap, s); #endif return s; } #endif /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_int2s(struct soap *soap, int n) { return soap_long2s(soap, (long)n); } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2int(struct soap *soap, const char *s, int *p) { if (s) { long n; char *r; if (!*s) return soap->error = SOAP_EMPTY; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif n = soap_strtol(s, &r, 10); if (s == r || *r #ifndef WITH_LEAN || n != (int)n #endif #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; *p = (int)n; } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (int*)soap_id_enter(soap, soap->id, p, t, sizeof(int), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2int(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (int*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(int), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_long2s(struct soap *soap, long n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), "%ld", n); return soap->tmpbuf; } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2long(struct soap *soap, const char *s, long *p) { if (s) { char *r; if (!*s) return soap->error = SOAP_EMPTY; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = soap_strtol(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (long*)soap_id_enter(soap, soap->id, p, t, sizeof(long), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2long(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (long*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(long), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_LONG642s(struct soap *soap, LONG64 n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), SOAP_LONG_FORMAT, n); return soap->tmpbuf; } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2LONG64(struct soap *soap, const char *s, LONG64 *p) { if (s) { char *r; if (!*s) return soap->error = SOAP_EMPTY; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = soap_strtoll(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (LONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(LONG64), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2LONG64(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (LONG64*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(LONG64), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_byte2s(struct soap *soap, char n) { return soap_long2s(soap, (long)n); } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2byte(struct soap *soap, const char *s, char *p) { if (s) { long n; char *r; if (!*s) return soap->error = SOAP_EMPTY; n = soap_strtol(s, &r, 10); if (s == r || *r || n < -128 || n > 127) soap->error = SOAP_TYPE; *p = (char)n; } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (char*)soap_id_enter(soap, soap->id, p, t, sizeof(char), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2byte(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (char*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(char), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_short2s(struct soap *soap, short n) { return soap_long2s(soap, (long)n); } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2short(struct soap *soap, const char *s, short *p) { if (s) { long n; char *r; if (!*s) return soap->error = SOAP_EMPTY; n = soap_strtol(s, &r, 10); if (s == r || *r || n < -32768 || n > 32767) soap->error = SOAP_TYPE; *p = (short)n; } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (short*)soap_id_enter(soap, soap->id, p, t, sizeof(short), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2short(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (short*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(short), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_float2s(struct soap *soap, float n) { #if defined(WITH_C_LOCALE) # if !defined(WIN32) SOAP_LOCALE_T locale; # endif #else char *s; #endif if (soap_isnan((double)n)) return "NaN"; if (soap_ispinff(n)) return "INF"; if (soap_isninff(n)) return "-INF"; #if defined(WITH_C_LOCALE) # ifdef WIN32 _sprintf_s_l(soap->tmpbuf, _countof(soap->tmpbuf), soap->float_format, SOAP_LOCALE(soap), n); # else locale = uselocale(SOAP_LOCALE(soap)); (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), soap->float_format, n); uselocale(locale); # endif #else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), soap->float_format, n); s = strchr(soap->tmpbuf, ','); /* convert decimal comma to DP */ if (s) *s = '.'; #endif return soap->tmpbuf; } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2float(struct soap *soap, const char *s, float *p) { if (s) { if (!*s) return soap->error = SOAP_EMPTY; 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 strtod first */ #if defined(WITH_C_LOCALE) # if defined(HAVE_STRTOD_L) char *r; # ifdef WIN32 *p = (float)_strtod_l(s, &r, SOAP_LOCALE(soap)); # else *p = (float)strtod_l(s, &r, SOAP_LOCALE(soap)); # endif if (*r) soap->error = SOAP_TYPE; # elif defined(HAVE_STRTOF_L) char *r; *p = strtof_l((char*)s, &r, SOAP_LOCALE(soap)); if (*r) soap->error = SOAP_TYPE; # elif defined(HAVE_SSCANF_L) double n; if (sscanf_l(s, SOAP_LOCALE(soap), "%lf", &n) != 1) soap->error = SOAP_TYPE; *p = (float)n; # elif defined(HAVE_STRTOD) char *r; SOAP_LOCALE_T locale = uselocale(SOAP_LOCALE(soap)); *p = (float)strtod((char*)s, &r); uselocale(locale); if (*r) soap->error = SOAP_TYPE; # elif defined(HAVE_STRTOF) char *r; SOAP_LOCALE_T locale = uselocale(SOAP_LOCALE(soap)); *p = strtof((char*)s, &r); uselocale(locale); if (*r) soap->error = SOAP_TYPE; # elif defined(HAVE_SSCANF) double n; SOAP_LOCALE_T locale = uselocale(SOAP_LOCALE(soap)); if (sscanf(s, "%lf", &n) != 1) soap->error = SOAP_TYPE; uselocale(locale); *p = (float)n; # else soap->error = SOAP_TYPE; # endif #elif defined(HAVE_STRTOD) char *r; *p = (float)strtod(s, &r); if (*r) soap->error = SOAP_TYPE; #elif defined(HAVE_STRTOF) char *r; *p = strtof((char*)s, &r); if (*r) soap->error = SOAP_TYPE; #elif defined(HAVE_SSCANF) double n; if (sscanf(s, "%lf", &n) != 1) soap->error = SOAP_TYPE; *p = (float)n; #else soap->error = SOAP_TYPE; #endif } } return soap->error; } /******************************************************************************/ #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 /******************************************************************************/ 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; #else (void)type; #endif p = (float*)soap_id_enter(soap, soap->id, p, t, sizeof(float), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2float(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (float*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(float), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_double2s(struct soap *soap, double n) { #if defined(WITH_C_LOCALE) # if !defined(WIN32) SOAP_LOCALE_T locale; # endif #else char *s; #endif if (soap_isnan(n)) return "NaN"; if (soap_ispinfd(n)) return "INF"; if (soap_isninfd(n)) return "-INF"; #if defined(WITH_C_LOCALE) # ifdef WIN32 _sprintf_s_l(soap->tmpbuf, _countof(soap->tmpbuf), soap->double_format, SOAP_LOCALE(soap), n); # else locale = uselocale(SOAP_LOCALE(soap)); (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 40), soap->double_format, n); uselocale(locale); # endif #else (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 40), soap->double_format, n); s = strchr(soap->tmpbuf, ','); /* convert decimal comma to DP */ if (s) *s = '.'; #endif return soap->tmpbuf; } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2double(struct soap *soap, const char *s, double *p) { if (s) { if (!*s) return soap->error = SOAP_EMPTY; 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(WITH_C_LOCALE) # if defined(HAVE_STRTOD_L) char *r; # ifdef WIN32 *p = _strtod_l(s, &r, SOAP_LOCALE(soap)); # else *p = strtod_l(s, &r, SOAP_LOCALE(soap)); # endif if (*r) soap->error = SOAP_TYPE; # elif defined(HAVE_STRTOD) char *r; SOAP_LOCALE_T locale = uselocale(SOAP_LOCALE(soap)); *p = strtod(s, &r); uselocale(locale); if (*r) soap->error = SOAP_TYPE; # elif defined(HAVE_SSCANF_L) SOAP_LOCALE_T locale = uselocale(SOAP_LOCALE(soap)); if (sscanf_l(s, SOAP_LOCALE(soap), "%lf", p) != 1) soap->error = SOAP_TYPE; uselocale(locale); # else soap->error = SOAP_TYPE; # endif #elif defined(HAVE_STRTOD) char *r; *p = strtod(s, &r); if (*r) soap->error = SOAP_TYPE; #elif defined(HAVE_SSCANF) if (sscanf(s, "%lf", p) != 1) soap->error = SOAP_TYPE; #else soap->error = SOAP_TYPE; #endif } } return soap->error; } /******************************************************************************/ 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; #else (void)type; #endif p = (double*)soap_id_enter(soap, soap->id, p, t, sizeof(double), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2double(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (double*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(double), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedByte2s(struct soap *soap, unsigned char n) { return soap_unsignedLong2s(soap, (unsigned long)n); } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedByte(struct soap *soap, const char *s, unsigned char *p) { if (s) { long n; char *r; if (!*s) return soap->error = SOAP_EMPTY; n = soap_strtol(s, &r, 10); if (s == r || *r || n < 0 || n > 255) soap->error = SOAP_TYPE; *p = (unsigned char)n; } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (unsigned char*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned char), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2unsignedByte(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (unsigned char*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned char), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedShort2s(struct soap *soap, unsigned short n) { return soap_unsignedLong2s(soap, (unsigned long)n); } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedShort(struct soap *soap, const char *s, unsigned short *p) { if (s) { long n; char *r; if (!*s) return soap->error = SOAP_EMPTY; n = soap_strtol(s, &r, 10); if (s == r || *r || n < 0 || n > 65535) soap->error = SOAP_TYPE; *p = (unsigned short)n; } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (unsigned short*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned short), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2unsignedShort(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (unsigned short*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned short), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedInt2s(struct soap *soap, unsigned int n) { return soap_unsignedLong2s(soap, (unsigned long)n); } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedInt(struct soap *soap, const char *s, unsigned int *p) { if (s) { char *r; if (!*s) return soap->error = SOAP_EMPTY; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = (unsigned int)soap_strtoul(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; #ifdef HAVE_STRTOUL if (*p > 0 && strchr(s, '-')) return soap->error = SOAP_TYPE; #endif } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (unsigned int*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned int), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2unsignedInt(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (unsigned int*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned int), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_unsignedLong2s(struct soap *soap, unsigned long n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), "%lu", n); return soap->tmpbuf; } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2unsignedLong(struct soap *soap, const char *s, unsigned long *p) { if (s) { char *r; if (!*s) return soap->error = SOAP_EMPTY; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = soap_strtoul(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; #ifdef HAVE_STRTOUL if (*p > 0 && strchr(s, '-')) return soap->error = SOAP_TYPE; #endif } return soap->error; } /******************************************************************************/ 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; } #else (void)type; #endif p = (unsigned long*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned long), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2unsignedLong(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (unsigned long*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(unsigned long), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_ULONG642s(struct soap *soap, ULONG64 n) { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), SOAP_ULONG_FORMAT, n); return soap->tmpbuf; } /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2ULONG64(struct soap *soap, const char *s, ULONG64 *p) { if (s) { char *r; if (!*s) return soap->error = SOAP_EMPTY; #ifndef WITH_NOIO #ifndef WITH_LEAN soap_reset_errno; #endif #endif *p = soap_strtoull(s, &r, 10); if (s == r || *r #ifndef WITH_NOIO #ifndef WITH_LEAN || soap_errno == SOAP_ERANGE #endif #endif ) soap->error = SOAP_TYPE; if (*p > 0 && strchr(s, '-')) return soap->error = SOAP_TYPE; } return soap->error; } /******************************************************************************/ 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; #ifndef WITH_LEAN 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; } #else (void)type; #endif p = (ULONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(ULONG64), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2ULONG64(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (ULONG64*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(ULONG64), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2char(struct soap *soap, const char *s, char **t, int flag, long minlen, long maxlen, const char *pattern) { if (s) { const char *r = soap_string(soap, s, flag, minlen, maxlen, pattern); if (r && (*t = soap_strdup(soap, r)) == NULL) return soap->error = SOAP_EOM; } return soap->error; } /******************************************************************************/ #ifndef WITH_COMPAT #ifdef __cplusplus SOAP_FMAC1 int SOAP_FMAC2 soap_s2stdchar(struct soap *soap, const char *s, std::string *t, int flag, long minlen, long maxlen, const char *pattern) { if (s) { const char *r = soap_string(soap, s, flag, minlen, maxlen, pattern); if (r) t->assign(r); } return soap->error; } #endif #endif /******************************************************************************/ static const char* soap_string(struct soap *soap, const char *s, int flag, long minlen, long maxlen, const char *pattern) { if (s) { if (maxlen < 0 && soap->maxlength > 0) maxlen = soap->maxlength; if (minlen > 0 || maxlen >= 0) { size_t l; if ((soap->mode & SOAP_C_UTFSTRING)) l = soap_utf8len(s); else l = strlen(s); if ((maxlen >= 0 && l > (size_t)maxlen) || (minlen > 0 && l < (size_t)minlen)) { soap->error = SOAP_LENGTH; return NULL; } } if (flag >= 4) s = soap_collapse(soap, (char*)s, flag, 0); #ifndef WITH_LEANER if (pattern && soap->fsvalidate) { soap->error = soap->fsvalidate(soap, pattern, s); if (soap->error) return NULL; } #else (void)pattern; #endif } return s; } /******************************************************************************/ static char* soap_collapse(struct soap *soap, char *s, int flag, int insitu) { /* flag 4=normalizedString (replace), 5=token (collapse) */ char *t; size_t n; if (!s) return NULL; if (flag == 4) { for (t = s; *t && (!soap_coblank((soap_wchar)*t) || *t == 32); t++) continue; if (*t) { /* replace white space and control chars by blanks */ if (!insitu) s = soap_strdup(soap, s); for (t = s; *t; t++) if (soap_coblank((soap_wchar)*t)) *t = ' '; } return s; } /* collapse white space */ for (t = s; *t && soap_coblank((soap_wchar)*t); t++) continue; n = strlen(t); if (insitu && s < t) (void)soap_memmove(s, n + 1, t, n + 1); else s = t; if (n > 0) { if (!soap_coblank((soap_wchar)s[n-1])) { for (t = s; (*t && !soap_coblank((soap_wchar)*t)) || (*t == 32 && (!t[1] || !soap_coblank((soap_wchar)t[1]))); t++) continue; if (!*t) return s; } if (!insitu) s = soap_strdup(soap, s); for (t = s; *t; t++) { if (soap_coblank((soap_wchar)*t)) { char *r; *t = ' '; for (r = t + 1; *r && soap_coblank((soap_wchar)*r); r++) continue; if (r > t + 1) (void)soap_memmove(t + 1, n - (t-s), r, n - (r-s) + 1); } } t--; if (t >= s && *t == 32) *t = '\0'; } return s; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_s2QName(struct soap *soap, const char *s, char **t, long minlen, long maxlen, const char *pattern) { *t = NULL; if (s) { const char *r = soap_QName(soap, s, minlen, maxlen, pattern); if (r && (*t = soap_strdup(soap, r)) == NULL) return soap->error = SOAP_EOM; } return soap->error; } /******************************************************************************/ #ifndef WITH_COMPAT #ifdef __cplusplus SOAP_FMAC1 int SOAP_FMAC2 soap_s2stdQName(struct soap *soap, const char *s, std::string *t, long minlen, long maxlen, const char *pattern) { t->clear(); if (s) { const char *r = soap_QName(soap, s, minlen, maxlen, pattern); if (r) t->assign(r); } return soap->error; } #endif #endif /******************************************************************************/ static const char* soap_QName(struct soap *soap, const char *s, long minlen, long maxlen, const char *pattern) { if (s) { char *b; if (maxlen < 0 && soap->maxlength > 0) maxlen = soap->maxlength; if (minlen > 0 || maxlen >= 0) { size_t l; if ((soap->mode & SOAP_C_UTFSTRING)) l = soap_utf8len(s); else l = strlen(s); if ((maxlen >= 0 && l > (size_t)maxlen) || (minlen > 0 && l < (size_t)minlen)) { soap->error = SOAP_LENGTH; return NULL; } } #ifdef WITH_FAST soap->labidx = 0; #else if (soap_alloc_block(soap) == NULL) return NULL; #endif 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; const char *p = NULL; short flag = 0; const char *r = NULL; size_t m = 0; #ifndef WITH_FAST size_t k = 0; #endif /* skip blanks */ while (*s && soap_coblank((soap_wchar)*s)) s++; if (!*s) break; /* find next QName */ n = 1; while (s[n] && !soap_coblank((soap_wchar)s[n])) n++; np = soap->nlist; /* if there is no namespace stack, or prefix is "#" or "xml" then copy string */ if (!np || *s == '#' || !strncmp(s, "xml:", 4)) { r = s; m = n; } else /* we normalize the QName by replacing its prefix */ { const char *q; for (p = s; *p && p < s + n; p++) if (*p == ':') break; 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 && (q = soap->local_namespaces[np->index].id) != NULL) { size_t k = strlen(q); if (q[k-1] != '_') { r = q; m = k; } else { flag = 1; r = soap->local_namespaces[np->index].ns; m = strlen(r); } } else if (np->ns) { flag = 1; r = np->ns; m = strlen(r); } 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)); soap->error = SOAP_NAMESPACE; return NULL; } } else if (s[n]) /* no namespace, part of string */ { r = s; m = n; } else /* no namespace: assume "" namespace */ { flag = 1; } } #ifdef WITH_FAST if ((flag && soap_append_lab(soap, "\"", 1)) || (m && soap_append_lab(soap, r, m)) || (flag && soap_append_lab(soap, "\"", 1)) || (p && (soap_append_lab(soap, ":", 1) || soap_append_lab(soap, p, n - (p-s))))) return NULL; #else k = 2*flag + m + (p ? n - (p-s) + 1 : 0) + (s[n] != '\0'); b = (char*)soap_push_block(soap, NULL, k); if (!b) return NULL; if (flag) *b++ = '"'; if (m) { if (soap_memcpy((void*)b, k, (const void*)r, m)) { soap->error = SOAP_EOM; return NULL; } b += m; } if (flag) *b++ = '"'; if (p) { *b++ = ':'; if (soap_memcpy((void*)b, k - m - flag - 1, (const void*)p, n - (p-s))) { soap->error = SOAP_EOM; return NULL; } b += n - (p-s); } #endif /* advance to next and add spacing */ s += n; while (*s && soap_coblank(*s)) s++; if (*s) { #ifdef WITH_FAST if (soap_append_lab(soap, " ", 1)) return NULL; #else *b = ' '; #endif } } #ifdef WITH_FAST if (soap_append_lab(soap, SOAP_STR_EOS, 1)) return NULL; b = soap->labbuf; #else b = (char*)soap_push_block(soap, NULL, 1); if (!b) return NULL; *b = '\0'; b = (char*)soap_save_block(soap, NULL, NULL, 0); #endif #ifndef WITH_LEANER if (pattern && soap->fsvalidate) { soap->error = soap->fsvalidate(soap, pattern, b); if (soap->error) return NULL; } #else (void)pattern; #endif return b; } return NULL; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_QName2s(struct soap *soap, const char *s) { const char *t = NULL; if (s) { #ifdef WITH_FAST soap_store_lab(soap, SOAP_STR_EOS, 1); soap->labidx = 0; #else char *b = NULL; if (soap_alloc_block(soap) == NULL) return NULL; #endif for (;;) { size_t n; const char *q = NULL; const char *r = NULL; size_t m = 0; #ifndef WITH_FAST size_t k = 0; #endif /* skip blanks */ while (*s && soap_coblank((soap_wchar)*s)) s++; if (!*s) { #ifdef WITH_FAST soap->labbuf[soap->labidx > 0 ? soap->labidx - 1 : 0] = '\0'; #else if (!b) return soap_strdup(soap, SOAP_STR_EOS); --b; *b = '\0'; #endif break; } /* find next QName */ n = 0; while (s[n] && !soap_coblank((soap_wchar)s[n])) { if (s[n] == ':') r = s; n++; } if (*s != '"') /* non-quoted: pass string as is */ { #ifndef WITH_LEAN if (r && (soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_XML_CANONICAL_NA)) soap_utilize_ns(soap, s, 1); #endif r = s; m = n + 1; } else /* prefix quoted URI-based string */ { q = strchr(s + 1, '"'); if (q) { struct Namespace *p = soap->local_namespaces; if (p) { for (; p->id; p++) { if (p->ns) if (!soap_tag_cmp(s + 1, p->ns)) break; if (p->in) if (!soap_tag_cmp(s + 1, p->in)) break; } } q++; /* URL is in the namespace table? */ if (p && p->id) { r = p->id; m = strlen(r); } else /* not in namespace table: create xmlns binding */ { char *x = soap_strdup(soap, s + 1); if (!x) return NULL; x[q - s - 2] = '\0'; (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 27), "xmlns:_%d", soap->idnum++); soap_set_attr(soap, soap->tmpbuf, x, 1); r = soap->tmpbuf + 6; m = strlen(r); } } } /* copy normalized QName into buffer, including the ending blank or NUL */ #ifdef WITH_FAST if ((m && soap_append_lab(soap, r, m)) || (q && soap_append_lab(soap, q, n - (q - s) + 1))) return NULL; #else k = m + (q ? n - (q - s) + 1 : 0); b = (char*)soap_push_block(soap, NULL, k); if (!b) { soap->error = SOAP_EOM; return NULL; } if (soap_memcpy((void*)b, k, (const void*)r, m)) { soap->error = SOAP_EOM; return NULL; } b += m; if (q) { if (soap_memcpy((void*)b, k - m, (const void*)q, n - (q - s) + 1)) { soap->error = SOAP_EOM; return NULL; } b += n - (q - s) + 1; } #endif /* advance to next */ s += n; } #ifdef WITH_FAST t = soap_strdup(soap, soap->labbuf); if (!t) soap->error = SOAP_EOM; #else t = (char*)soap_save_block(soap, NULL, NULL, 0); #endif } return t; } /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2wchar(struct soap *soap, const char *s, wchar_t **t, int flag, long minlen, long maxlen, const char *pattern) { if (s) { const wchar_t *r = soap_wstring(soap, s, flag, minlen, maxlen, pattern); if (r && (*t = soap_wstrdup(soap, r)) == NULL) return soap->error = SOAP_EOM; } return soap->error; } #endif /******************************************************************************/ #ifndef WITH_COMPAT #ifdef __cplusplus #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2stdwchar(struct soap *soap, const char *s, std::wstring *t, int flag, long minlen, long maxlen, const char *pattern) { if (s) { const wchar_t *r = soap_wstring(soap, s, flag, minlen, maxlen, pattern); if (r) t->assign(r); } return soap->error; } #endif #endif #endif /******************************************************************************/ #ifndef WITH_LEAN static const wchar_t* soap_wstring(struct soap *soap, const char *s, int flag, long minlen, long maxlen, const char *pattern) { if (s) { size_t l; soap_wchar c; wchar_t *t; if (maxlen < 0 && soap->maxlength > 0) maxlen = soap->maxlength; soap->labidx = 0; if ((soap->mode & SOAP_ENC_LATIN)) { wchar_t *r; if (soap_append_lab(soap, NULL, sizeof(wchar_t) * (strlen(s) + 1))) return NULL; r = (wchar_t*)soap->labbuf; while (*s) *r++ = (wchar_t)*s++; } else { /* Convert UTF8 to wchar_t */ while (*s) { c = (unsigned char)*s++; if (c >= 0x80) { #ifdef WITH_REPLACE_ILLEGAL_UTF8 soap_wchar c1, c2, c3; c1 = (unsigned char)*s; if (c <= 0xC1 || (c1 & 0xC0) != 0x80) { c = SOAP_UNKNOWN_UNICODE_CHAR; } else { ++s; c1 &= 0x3F; if (c < 0xE0) { c = (((c & 0x1F) << 6) | c1); } else { c2 = (unsigned char)*s; if ((c == 0xE0 && c1 < 0x20) || (c2 & 0xC0) != 0x80) { c = SOAP_UNKNOWN_UNICODE_CHAR; } else { ++s; c2 &= 0x3F; if (c < 0xF0) { c = (((c & 0x0F) << 12) | (c1 << 6) | c2); } else { c3 = (unsigned char)*s; if ((c == 0xF0 && c1 < 0x10) || (c == 0xF4 && c1 >= 0x10) || c >= 0xF5 || (c3 & 0xC0) != 0x80) { c = SOAP_UNKNOWN_UNICODE_CHAR; } else { ++s; c = (((c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | (c3 & 0x3F)); } } } } } #else soap_wchar c1, c2, c3, c4; c1 = (unsigned char)*s; if (c1) { s++; c1 &= 0x3F; if (c < 0xE0) { c = (wchar_t)(((soap_wchar)(c & 0x1F) << 6) | c1); } else { c2 = (unsigned char)*s; if (c2) { s++; c2 &= 0x3F; if (c < 0xF0) { c = (wchar_t)(((soap_wchar)(c & 0x0F) << 12) | (c1 << 6) | c2); } else { c3 = (unsigned char)*s; if (c3) { s++; c3 &= 0x3F; if (c < 0xF8) { c = (wchar_t)(((soap_wchar)(c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3); } else { c4 = (unsigned char)*s; if (c4) { s++; c4 &= 0x3F; if (c < 0xFC) { c = (wchar_t)(((soap_wchar)(c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4); } else { c = (wchar_t)(((soap_wchar)(c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (unsigned char)(*s & 0x3F)); if (*s) s++; } } } } } } } } #endif } /* use UTF16 encoding when wchar_t is too small to hold UCS */ if (sizeof(wchar_t) < 4 && c > 0xFFFF) { wchar_t c1, c2; c1 = 0xD800 - (0x10000 >> 10) + (c >> 10); c2 = 0xDC00 + (c & 0x3FF); if (soap_append_lab(soap, (const char*)&c1, sizeof(wchar_t)) || soap_append_lab(soap, (const char*)&c2, sizeof(wchar_t))) return NULL; } else if (soap_append_lab(soap, (const char*)&c, sizeof(wchar_t))) { return NULL; } } } l = soap->labidx / sizeof(wchar_t); c = L'\0'; if (soap_append_lab(soap, (const char*)&c, sizeof(wchar_t))) return NULL; if ((maxlen >= 0 && l > (size_t)maxlen) || (minlen > 0 && l < (size_t)minlen)) { soap->error = SOAP_LENGTH; return NULL; } t = (wchar_t*)soap->labbuf; #ifndef WITH_LEAN if (flag >= 4 && t) t = soap_wcollapse(soap, t, flag, 1); #endif #ifndef WITH_LEANER if (pattern && soap->fwvalidate) { soap->error = soap->fwvalidate(soap, pattern, t); if (soap->error) return NULL; } #endif return t; } return NULL; } #endif /******************************************************************************/ #ifndef WITH_LEAN static wchar_t* soap_wcollapse(struct soap *soap, wchar_t *s, int flag, int insitu) { /* flag 4=normalizedString (replace), 5=token (collapse) */ wchar_t *t; size_t n; if (!s) return NULL; if (flag == 4) { for (t = s; *t && (!soap_coblank((soap_wchar)*t) || *t == 32); t++) continue; if (*t) { /* replace blanks and control char by space */ if (!insitu) s = soap_wstrdup(soap, s); if (s) for (t = s; *t; t++) if (soap_coblank((soap_wchar)*t)) *t = L' '; } return s; } /* collapse white space */ for (t = s; *t && soap_coblank((soap_wchar)*t); t++) continue; n = 0; while (t[n]) n++; if (insitu && s < t) (void)soap_memmove(s, n + 1, t, n + 1); else s = t; if (n > 0) { if (!soap_coblank((soap_wchar)s[n-1])) { for (t = s; (*t && !soap_coblank((soap_wchar)*t)) || (*t == 32 && (!t[1] || !soap_coblank((soap_wchar)t[1]))); t++) continue; if (!*t) return s; } if (!insitu) s = soap_wstrdup(soap, s); if (s) { for (t = s; *t; t++) { if (soap_coblank((soap_wchar)*t)) { wchar_t *r; *t = L' '; for (r = t + 1; *r && soap_coblank((soap_wchar)*r); r++) continue; if (r > t + 1) (void)soap_memmove(t + 1, sizeof(wchar_t) * (n - (t-s)), r, sizeof(wchar_t) * (n - (r-s) + 1)); } } t--; if (t >= s && *t == 32) *t = L'\0'; } } return s; } #endif /******************************************************************************/ #ifndef WITH_LEAN SOAP_FMAC1 const char* SOAP_FMAC2 soap_wchar2s(struct soap *soap, const wchar_t *s) { soap_wchar c; char *r, *t; const wchar_t *q = s; size_t n = 0; if (!s) return NULL; while ((c = *q++)) { if (c > 0 && c < 0x80) n++; else #ifdef WITH_REPLACE_ILLEGAL_UTF8 n += 4; #else n += 6; #endif } r = t = (char*)soap_malloc(soap, n + 1); if (r) { /* Convert wchar to UTF8 (chars above U+10FFFF are silently converted, but should not be used) */ while ((c = *s++)) { if (c > 0 && c < 0x80) { *t++ = (char)c; } else { /* check for UTF16 encoding when wchar_t is too small to hold UCS */ if (sizeof(wchar_t) < 4 && (c & 0xFC00) == 0xD800) { soap_wchar d = *s; if ((d & 0xFC00) == 0xDC00) { c = ((c - 0xD800) << 10) + (d - 0xDC00) + 0x10000; s++; } #ifdef WITH_REPLACE_ILLEGAL_UTF8 else { c = SOAP_UNKNOWN_UNICODE_CHAR; /* Malformed UTF-16 */ } #endif } if (c < 0x0800) { *t++ = (char)(0xC0 | ((c >> 6) & 0x1F)); } else { #ifdef WITH_REPLACE_ILLEGAL_UTF8 if (!((c >= 0x80 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD) || (c >= 0x10000 && c <= 0x10FFFF))) c = SOAP_UNKNOWN_UNICODE_CHAR; #endif 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 /******************************************************************************/ 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, NULL); 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; } /******************************************************************************/ 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, const char *pattern) { (void)type; 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) { p = (char**)soap_malloc(soap, sizeof(char*)); if (!p) return NULL; } if (soap->null) { *p = NULL; } else if (soap->body) { *p = soap_string_in(soap, flag, minlen, maxlen, pattern); if (!*p || !(char*)soap_id_enter(soap, soap->id, *p, t, sizeof(char*), NULL, 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->href != '#') { if (minlen > 0) { soap->error = SOAP_LENGTH; return NULL; } *p = soap_strdup(soap, SOAP_STR_EOS); if (!*p) return NULL; } if (*soap->href == '#') p = (char**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(char**), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } /******************************************************************************/ #ifndef WITH_LEANER 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, NULL); 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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 wchar_t ** SOAP_FMAC2 soap_inwstring(struct soap *soap, const char *tag, wchar_t **p, const char *type, int t, int flag, long minlen, long maxlen, const char *pattern) { (void)type; 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) { p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*)); if (!p) return NULL; } if (soap->null) { *p = NULL; } else if (soap->body) { *p = soap_wstring_in(soap, flag, minlen, maxlen, pattern); if (!*p || !(wchar_t*)soap_id_enter(soap, soap->id, *p, t, sizeof(wchar_t*), NULL, 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->href != '#') { if (minlen > 0) { soap->error = SOAP_LENGTH; return NULL; } *p = soap_wstrdup(soap, L""); } if (*soap->href == '#') p = (wchar_t**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(wchar_t**), 0, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ #ifndef WITH_LEAN #ifdef UNDER_CE /* WinCE mktime (based on the mingw-runtime, public domain) */ #define __FILETIME_to_ll(f) ((long long)(f).dwHighDateTime << 32 | (long long)(f).dwLowDateTime) static time_t mktime(struct tm *pt) { SYSTEMTIME s, s1, s2; FILETIME f, f1, f2; long long diff; GetSystemTime(&s1); GetLocalTime(&s2); SystemTimeToFileTime(&s1, &f1); SystemTimeToFileTime(&s2, &f2); diff = (__FILETIME_to_ll(f2) - __FILETIME_to_ll(f1)) / 10000000LL; s.wYear = pt->tm_year + 1900; s.wMonth = pt->tm_mon + 1; s.wDayOfWeek = pt->tm_wday; s.wDay = pt->tm_mday; s.wHour = pt->tm_hour; s.wMinute = pt->tm_min; s.wSecond = pt->tm_sec; s.wMilliseconds = 0; SystemTimeToFileTime(&s, &f); return (time_t)((__FILETIME_to_ll(f) - 116444736000000000LL) / 10000000LL) - (time_t)diff; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN #ifdef UNDER_CE /* WinCE gmtime_r (based on the mingw-runtime, public domain) */ #define HAVE_GMTIME_R static struct tm* gmtime_r(const time_t *t, struct tm *pt) { FILETIME f, f1, f2; SYSTEMTIME s, s1 = {0}; long long time = (long long)(*t) * 10000000LL + 116444736000000000LL; f.dwHighDateTime = (DWORD)((time >> 32) & 0x00000000FFFFFFFF); f.dwLowDateTime = (DWORD)(time & 0x00000000FFFFFFFF); FileTimeToSystemTime(&f, &s); pt->tm_year = s.wYear - 1900; pt->tm_mon = s.wMonth - 1; pt->tm_wday = s.wDayOfWeek; pt->tm_mday = s.wDay; s1.wYear = s.wYear; s1.wMonth = 1; s1.wDayOfWeek = 1; s1.wDay = 1; SystemTimeToFileTime(&s1, &f1); SystemTimeToFileTime(&s, &f2); pt->tm_yday = (((__FILETIME_to_ll(f2) - __FILETIME_to_ll(f1)) / 10000000LL) / (60 * 60 * 24)); pt->tm_hour = s.wHour; pt->tm_min = s.wMinute; pt->tm_sec = s.wSecond; pt->tm_isdst = 0; return pt; } #endif #endif /******************************************************************************/ #ifndef WITH_LEAN #ifdef UNDER_CE /* WinCE very simple strftime for format "%Y-%m-%dT%H:%M:%SZ", note: %F and %T not supported by MS */ static size_t strftime(char *buf, size_t len, const char *format, const struct tm *pT) { (void)len; (void)format; #ifndef WITH_NOZONE (SOAP_SNPRINTF(buf, len, 20), "%04d-%02d-%02dT%02d:%02d:%02dZ", pT->tm_year + 1900, pT->tm_mon + 1, pT->tm_mday, pT->tm_hour, pT->tm_min, pT->tm_sec); #else (SOAP_SNPRINTF(buf, len, 20), "%04d-%02d-%02dT%02d:%02d:%02d", pT->tm_year + 1900, pT->tm_mon + 1, pT->tm_mday, pT->tm_hour, pT->tm_min, pT->tm_sec); #endif return len; } #endif #endif /******************************************************************************/ #if !defined(WITH_LEAN) || defined(WITH_COOKIES) 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; #ifndef HAVE_GMTIME_R struct tm *tp; #endif t = mktime(T); if (t == (time_t)-1) return (time_t)-1; #ifdef HAVE_GMTIME_R if (gmtime_r(&t, &tm) == SOAP_FUNC_R_ERR) return (time_t)-1; #else tp = gmtime(&t); if (!tp) return (time_t)-1; tm = *tp; #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; size_t l = 0; #if defined(HAVE_GMTIME_R) && !defined(WITH_NOZONE) if (gmtime_r(&n, pT) != SOAP_FUNC_R_ERR) l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT); #elif defined(HAVE_GMTIME) && !defined(WITH_NOZONE) pT = gmtime(&n); if (pT) l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT); #elif (defined(HAVE_TM_GMTOFF) || defined(HAVE_STRUCT_TM_TM_GMTOFF) || defined(HAVE_STRUCT_TM___TM_GMTOFF)) && !defined(WITH_NOZONE) #if defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) { l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S%z", pT); if (l) { (void)soap_memmove(soap->tmpbuf + 23, sizeof(soap->tmpbuf) - 23, soap->tmpbuf + 22, 3); /* 2000-03-01T02:00:00+0300 */ soap->tmpbuf[22] = ':'; /* 2000-03-01T02:00:00+03:00 */ } } #else pT = localtime(&n); if (pT) { l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S%z", pT); if (l) { (void)soap_memmove(soap->tmpbuf + 23, sizeof(soap->tmpbuf) - 23, soap->tmpbuf + 22, 3); /* 2000-03-01T02:00:00+0300 */ soap->tmpbuf[22] = ':'; /* 2000-03-01T02:00:00+03:00 */ } } #endif #elif defined(HAVE_GETTIMEOFDAY) && !defined(WITH_NOZONE) #if defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) { struct timeval tv; struct timezone tz; memset((void*)&tz, 0, sizeof(tz)); gettimeofday(&tv, &tz); l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); if (l) (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -tz.tz_minuteswest/60+(pT->tm_isdst!=0), abs(tz.tz_minuteswest)%60); } #else pT = localtime(&n); if (pT) { struct timeval tv; struct timezone tz; memset((void*)&tz, 0, sizeof(tz)); gettimeofday(&tv, &tz); l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); if (l) (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -tz.tz_minuteswest/60+(pT->tm_isdst!=0), abs(tz.tz_minuteswest)%60); } #endif #elif defined(HAVE_FTIME) && !defined(WITH_NOZONE) #if defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) { struct timeb t; memset((void*)&t, 0, sizeof(t)); #ifdef __BORLANDC__ ::ftime(&t); #else ftime(&t); #endif l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); if (l) (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60); } #else pT = localtime(&n); if (pT) { struct timeb t; memset((void*)&t, 0, sizeof(t)); #ifdef __BORLANDC__ ::ftime(&t); #else ftime(&t); #endif l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); if (l) (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, 7), "%+03d:%02d", -t.timezone/60+(pT->tm_isdst!=0), abs(t.timezone)%60); } #endif #elif defined(HAVE_LOCALTIME_R) if (localtime_r(&n, pT) != SOAP_FUNC_R_ERR) l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); #else pT = localtime(&n); if (pT) l = strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT); #endif if (!l) soap_strcpy(soap->tmpbuf, sizeof(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) { *p = 0; if (s) { char *t; unsigned long d; struct tm T; if (!*s) return soap->error = SOAP_EMPTY; memset((void*)&T, 0, sizeof(T)); d = soap_strtoul(s, &t, 10); if (*t == '-') { /* YYYY-MM-DD */ T.tm_year = (int)d; T.tm_mon = (int)soap_strtoul(t + 1, &t, 10); T.tm_mday = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* YYYYMMDD */ T.tm_year = (int)(d / 10000); T.tm_mon = (int)(d / 100 % 100); T.tm_mday = (int)(d % 100); } else { return soap->error = SOAP_TYPE; } if (*t == 'T' || ((*t == 't' || *t == ' ') && !(soap->mode & SOAP_XML_STRICT))) { d = soap_strtoul(t + 1, &t, 10); if (*t == ':') { /* Thh:mm:ss */ T.tm_hour = (int)d; T.tm_min = (int)soap_strtoul(t + 1, &t, 10); T.tm_sec = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* Thhmmss */ T.tm_hour = (int)(d / 10000); T.tm_min = (int)(d / 100 % 100); T.tm_sec = (int)(d % 100); } else { return soap->error = SOAP_TYPE; } } if (T.tm_year == 1) T.tm_year = 70; else T.tm_year -= 1900; T.tm_mon--; if (*t == '.') { for (t++; *t; t++) if (*t < '0' || *t > '9') break; } if (*t == ' ' && !(soap->mode & SOAP_XML_STRICT)) t++; if (*t) { #ifndef WITH_NOZONE if (*t == '+' || *t == '-') { int h, m; m = (int)soap_strtol(t, &t, 10); if (*t == ':') { /* +hh:mm */ h = m; m = (int)soap_strtol(t + 1, &t, 10); if (h < 0) m = -m; } else if (!(soap->mode & SOAP_XML_STRICT)) { /* +hhmm */ h = m / 100; m = m % 100; } else { /* +hh */ h = m; m = 0; } if (*t) return soap->error = SOAP_TYPE; 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_hour--; } T.tm_mday += T.tm_hour / 24; T.tm_hour %= 24; if (T.tm_hour < 0) { T.tm_hour += 24; T.tm_mday--; } /* note: day of the month may be out of range, timegm() handles it */ } else if (*t != 'Z') { return soap->error = SOAP_TYPE; } #endif *p = soap_timegm(&T); } else /* no UTC or timezone, so assume we got a localtime */ { T.tm_isdst = -1; *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), NULL, NULL, NULL, NULL); if (!p) return NULL; if (*soap->href != '#') { int err = soap_s2dateTime(soap, soap_value(soap), p); if ((soap->body && soap_element_end_in(soap, tag)) || err) return NULL; } else { p = (time_t*)soap_id_forward(soap, soap->href, p, 0, t, t, sizeof(time_t), 0, NULL, NULL); if (soap->body && soap_element_end_in(soap, tag)) return NULL; } return p; } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_outliteral(struct soap *soap, const char *tag, char *const*p, const char *type) { if (tag && *tag != '-') if (soap_element_begin_out(soap, tag, 0, type)) return soap->error; if (p && *p) if (soap_send(soap, *p)) /* send as-is */ return soap->error; if (tag && *tag != '-') return soap_element_end_out(soap, tag); return SOAP_OK; } /******************************************************************************/ 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_peek(soap) == SOAP_TT) return NULL; soap->error = SOAP_OK; } if (!p) { p = (char**)soap_malloc(soap, sizeof(char*)); if (!p) return NULL; } if (soap->body || (tag && *tag == '-')) { if (tag && *tag != '-') *p = soap_string_in(soap, -1, -1, -1, NULL); else *p = soap_string_in(soap, 0, -1, -1, NULL); 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; } /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_outwliteral(struct soap *soap, const char *tag, wchar_t *const*p, const char *type) { if (tag && *tag != '-') if (soap_element_begin_out(soap, tag, 0, type)) return soap->error; if (p) { wchar_t c; const wchar_t *s = *p; while ((c = *s++)) { if (soap_pututf8(soap, (unsigned long)c)) /* send as-is in UTF8 */ return soap->error; } } if (tag && *tag != '-') return soap_element_end_out(soap, tag); return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER 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_peek(soap) == SOAP_TT) return NULL; soap->error = SOAP_OK; } if (!p) { p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*)); if (!p) return NULL; } if (soap->body) { if (tag && *tag != '-') *p = soap_wstring_in(soap, -1, -1, -1, NULL); else *p = soap_wstring_in(soap, 0, -1, -1, NULL); 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, L""); } if (soap->body && soap_element_end_in(soap, tag)) return NULL; return p; } #endif /******************************************************************************/ SOAP_FMAC1 const char * SOAP_FMAC2 soap_value(struct soap *soap) { size_t i; soap_wchar c = 0; char *s = soap->tmpbuf; if (!soap->body) return SOAP_STR_EOS; do { c = soap_get(soap); } while (soap_coblank(c)); for (i = 0; i < sizeof(soap->tmpbuf) - 1; i++) { if (c == SOAP_TT || c == SOAP_LT || (int)c == EOF) break; *s++ = (char)c; c = soap_get(soap); } for (s--; i > 0; i--, s--) { if (!soap_coblank((soap_wchar)*s)) break; } s[1] = '\0'; soap->tmpbuf[sizeof(soap->tmpbuf) - 1] = '\0'; /* appease */ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element content value='%s'\n", soap->tmpbuf)); if (c == SOAP_TT || c == SOAP_LT || (int)c == EOF) { soap_unget(soap, c); } else { soap->error = SOAP_LENGTH; return NULL; } #ifdef WITH_DOM if ((soap->mode & SOAP_XML_DOM) && soap->dom) { soap->dom->text = soap_strdup(soap, soap->tmpbuf); if (!soap->dom->text) return NULL; } #endif return soap->tmpbuf; /* return non-null pointer */ } /******************************************************************************/ #if !defined(WITH_LEANER) || !defined(WITH_NOHTTP) SOAP_FMAC1 int SOAP_FMAC2 soap_getline(struct soap *soap, char *buf, int len) { char *s = buf; int i = len; soap_wchar c = 0; for (;;) { while (i > 1) { c = soap_getchar(soap); if (c == '\r' || c == '\n') break; if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; *s++ = (char)c; i--; } *s = '\0'; if (c != '\n') c = soap_getchar(soap); /* got \r or something else, now get \n */ if (c == '\n') { if (i == 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_CHK_EOF; } else if (i <= 1) { return soap->error = SOAP_HDR; } } return SOAP_OK; } #endif /******************************************************************************/ static ULONG64 soap_count_attachments(struct soap *soap) { #ifndef WITH_LEANER struct soap_multipart *content; ULONG64 count = soap->count; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the message size with attachments, current count=" SOAP_ULONG_FORMAT "\n", 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) { 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) { 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=" SOAP_ULONG_FORMAT "\n", count)); return count; #else return soap->count; #endif } /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER 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); soap_strcpy(s + 4, n + 1, option); } } return s; } #endif /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER 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)) != NULL || 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_PLAIN) || (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); bufsize = soap->fdimeread(soap, handle, soap->tmpbuf, bufsize); if (!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_CHK_EOF; break; } if (soap_send_raw(soap, soap->tmpbuf, bufsize)) break; size -= bufsize; } while (size); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadclose\n")); if (soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime.size&3)) return soap->error; } 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 /******************************************************************************/ #ifndef WITH_LEANER static char * soap_getdimefield(struct soap *soap, size_t n) { char *p = NULL; if (n > 0) { p = (char*)soap_malloc(soap, n + 1 > n ? n + 1 : n); if (p) { char *s = p; size_t i; for (i = n; i > 0; i--) { soap_wchar c = soap_get1(soap); if ((int)c == EOF) { soap->error = SOAP_CHK_EOF; return NULL; } *s++ = (char)c; } if (n + 1 > n) *s = '\0'; /* force NUL terminated */ soap->error = soap_move(soap, (size_t)(-(long)n&3)); if (soap->error) return NULL; } else { soap->error = SOAP_EOM; } } return p; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_getdimehdr(struct soap *soap) { soap_wchar c; char *s; 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")); s = (char*)tmp; for (i = 12; i > 0; i--) { c = soap_getchar(soap); if ((int)c == EOF) return soap->error = SOAP_CHK_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 = ((size_t)tmp[8] << 24) | ((size_t)tmp[9] << 16) | ((size_t)tmp[10] << 8) | ((size_t)tmp[11]); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME size=%lu flags=0x%X\n", (unsigned long)soap->dime.size, soap->dime.flags)); soap->dime.options = soap_getdimefield(soap, optlen); if (!soap->dime.options && soap->error) return soap->error; soap->dime.id = soap_getdimefield(soap, idlen); if (!soap->dime.id && soap->error) return soap->error; soap->dime.type = soap_getdimefield(soap, typelen); if (!soap->dime.type && soap->error) return soap->error; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME flags=%x id='%s', type='%s', options='%s'\n", soap->dime.flags, 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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_getdime(struct soap *soap) { if (soap->dime.buflen || soap->dime.chunksize) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Skip remainder of SOAP in DIME (%u bytes or %u bytes in chunk left)\n", (unsigned int)soap->dime.buflen, (unsigned int)soap->dime.chunksize)); do if (soap_get1(soap) == (int)EOF) return soap->error = SOAP_CHK_EOF; while (soap->dime.buflen || soap->dime.chunksize); if (soap_move(soap, (size_t)(-(long)soap->dime.size&3))) return soap->error = SOAP_CHK_EOF; if (!(soap->mode & SOAP_ENC_DIME)) return SOAP_OK; } else { if (soap_move(soap, (size_t)(((soap->dime.size+3)&(~3)) - soap_tell(soap)))) return soap->error = SOAP_CHK_EOF; } for (;;) { 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)) != NULL || 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; soap->error = soap->fdimewrite(soap, (void*)soap->dime.ptr, soap->buf + soap->bufidx, n); if (soap->error) break; size -= n; if (!size) { soap->bufidx += n; break; } if (soap_recv(soap)) { soap->error = SOAP_EOF; goto end; } } if (soap_move(soap, (size_t)(-(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_alloc_block(soap) == NULL) return soap->error = SOAP_EOM; for (;;) { soap_wchar c; size_t i; char *s; if (soap->dime.size > SOAP_MAXDIMESIZE) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME size=%lu exceeds SOAP_MAXDIMESIZE=%lu\n", (unsigned long)soap->dime.size, (unsigned long)SOAP_MAXDIMESIZE)); return soap->error = SOAP_DIME_ERROR; } 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--) { c = soap_get1(soap); if ((int)c == EOF) return soap->error = SOAP_EOF; *s++ = (char)c; } if (soap_move(soap, (size_t)(-(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; if (soap->dime.size + 1 > soap->dime.size) soap->blist->size++; /* allocate one more byte in blist for the terminating '\0' */ soap->dime.ptr = soap_save_block(soap, NULL, NULL, 0); if (!soap->dime.ptr) return soap->error; if (soap->dime.size + 1 > soap->dime.size) soap->dime.ptr[soap->dime.size] = '\0'; /* make 0-terminated, just in case even though this is binary data */ soap->dime.id = id; soap->dime.type = type; soap->dime.options = options; } else { soap->dime.ptr = soap_getdimefield(soap, soap->dime.size); } content = soap_alloc_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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_getmimehdr(struct soap *soap) { struct soap_multipart *content; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get MIME header\n")); 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_coblank((soap_wchar)*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->mime.boundary) return soap->error = SOAP_EOM; } 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 (;;) { char *key = soap->msgbuf; 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 (!content->id && !soap_tag_cmp(key, "Content-Disposition")) content->id = soap_strdup(soap, soap_http_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, (LONG64)SOAP_MIME_NONE); } if (soap_getline(soap, key, sizeof(soap->msgbuf))) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_getmime(struct soap *soap) { while (soap_recv_mime_attachment(soap, NULL)) continue; return soap->error; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 void SOAP_FMAC2 soap_post_check_mime_attachments(struct soap *soap) { soap->imode |= SOAP_MIME_POSTCHECK; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_check_mime_attachments(struct soap *soap) { if ((soap->mode & SOAP_MIME_POSTCHECK)) return soap_recv_mime_attachment(soap, NULL) != NULL; return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 struct soap_multipart * SOAP_FMAC2 soap_recv_mime_attachment(struct soap *soap, void *handle) { soap_wchar c = 0; size_t i, m = 0; char *s, *t = NULL; struct soap_multipart *content; short flag = 0; if (!(soap->mode & SOAP_ENC_MIME)) return NULL; content = soap->mime.last; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get MIME (%p)\n", (void*)content)); 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)) != NULL || 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_alloc_block(soap) == NULL) { soap->error = SOAP_EOM; return NULL; } for (;;) { if (content->ptr) { s = soap->tmpbuf; } else { s = (char*)soap_push_block(soap, NULL, sizeof(soap->tmpbuf)); if (!s) { 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_getchar(soap); if ((int)c == EOF) { if (content->ptr && soap->fmimewriteclose) soap->fmimewriteclose(soap, (void*)content->ptr); soap->error = SOAP_CHK_EOF; return NULL; } } if (flag || c == '\r') { memset((void*)soap->msgbuf, 0, sizeof(soap->msgbuf)); soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), "\n--"); if (soap->mime.boundary) { if (soap_strncat(soap->msgbuf, sizeof(soap->msgbuf), soap->mime.boundary, sizeof(soap->msgbuf) - 4)) { soap->error = SOAP_MIME_ERROR; return NULL; } } t = soap->msgbuf; do { c = soap_getchar(soap); } while (c == *t++); if ((int)c == EOF) { if (content->ptr && soap->fmimewriteclose) soap->fmimewriteclose(soap, (void*)content->ptr); soap->error = SOAP_CHK_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) { soap->error = soap->fmimewrite(soap, (void*)content->ptr, soap->tmpbuf, i); if (soap->error) break; } } end: 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 { *s = '\0'; /* make 0-terminated, just in case even though this is binary data */ content->size = soap_size_block(soap, NULL, i + 1) - 1; /* last block with '\0' */ 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)) { if (soap->keep_alive == -2) /* special case to keep alive */ soap->keep_alive = 0; soap_closesock(soap); return NULL; } } else { while (c != '\r' && (int)c != EOF && soap_coblank(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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_match_cid(struct soap *soap, const char *s, const char *t) { 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; (void)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 /******************************************************************************/ /* return UUID "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx" in a temporary buffer */ SOAP_FMAC1 const char* SOAP_FMAC2 soap_rand_uuid(struct soap *soap, const char *prefix) { int r1, r2, r3, r4; #ifdef WITH_OPENSSL r1 = soap_random; r2 = soap_random; #else size_t i; static int k = 0xFACEB00C; int lo = k % 127773; int hi = k / 127773; # if defined(HAVE_GETTIMEOFDAY) struct timeval tv; gettimeofday(&tv, NULL); r1 = 10000000 * tv.tv_sec + tv.tv_usec; # elif defined(UNDER_CE) r1 = (int)Random(); # elif !defined(WITH_LEAN) r1 = (int)time(NULL); # else r1 = k; # endif k = 16807 * lo - 2836 * hi; if (k <= 0) k += 0x7FFFFFFF; r2 = k; /* k &= 0x8FFFFFFF; */ for (i = 0; i < (sizeof(soap->buf) < 16UL ? sizeof(soap->buf) : 16UL); i++) r2 += soap->buf[i]; #endif r3 = soap_random; r4 = soap_random; (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), prefix ? strlen(prefix) + 37 : 37), "%s%8.8x-%4.4hx-4%3.3hx-%4.4hx-%4.4hx%8.8x", prefix ? prefix : SOAP_STR_EOS, r1, (short)(r2 >> 16), (short)(((short)r2 >> 4) & 0x0FFF), (short)(((short)(r3 >> 16) & 0x3FFF) | 0x8000), (short)r3, r4); return soap->tmpbuf; } /******************************************************************************/ #ifndef WITH_LEANER static void soap_resolve_attachment(struct soap *soap, struct soap_multipart *content) { if (content->id) { struct soap_xlist **xp = &soap->xlist; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving attachment data for id='%s'\n", content->id)); while (*xp) { struct soap_xlist *xq = *xp; if (!soap_match_cid(soap, xq->id, content->id)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Found matching attachment id='%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 /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER 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)) != NULL || 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_PLAIN) || (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); bufsize = soap->fmimeread(soap, handle, soap->tmpbuf, bufsize); if (!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 /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER 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 /******************************************************************************/ #ifndef WITH_LEANER static int soap_begin_attachments(struct soap *soap) { if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary && soap->mime.start) { const char *s; if (strlen(soap->mime.boundary) + strlen(soap->mime.start) + 140 > sizeof(soap->tmpbuf)) return soap->error = SOAP_EOM; 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; charset=utf-8; type=\"text/xml\""; } else { s = "text/xml; charset=utf-8"; } (SOAP_SNPRINTF_SAFE(soap->tmpbuf, sizeof(soap->tmpbuf)), "--%s\r\nContent-Type: %s\r\nContent-Transfer-Encoding: binary\r\nContent-ID: %s\r\n\r\n", soap->mime.boundary, s, soap->mime.start); if (soap_send(soap, soap->tmpbuf)) return soap->error; } if ((soap->mode & SOAP_IO_LENGTH)) soap->dime.size = (size_t)soap->count; /* DIME in MIME correction, soap->count is small */ if (!(soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME)) { if (soap_putdimehdr(soap)) return soap->error; } return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER static int soap_end_attachments(struct soap *soap) { if ((soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME) && !(soap->mode & SOAP_ENC_MTOM)) { if (soap->count > 0xFFFFFFFF) return soap->error = SOAP_DIME_ERROR; soap->dime.size = (size_t)soap->count - soap->dime.size; /* DIME in MIME correction */ (SOAP_SNPRINTF(soap->id, sizeof(soap->id), strlen(soap->dime_id_format) + 20), soap->dime_id_format, 0); soap->dime.id = soap->id; if (soap->local_namespaces && soap->local_namespaces[0].id) { 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); return SOAP_OK; } #endif /******************************************************************************/ #ifndef WITH_LEANER static struct soap_multipart* soap_alloc_multipart(struct soap *soap, struct soap_multipart **first, struct soap_multipart **last, const char *ptr, size_t size) { struct soap_multipart *content; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New DIME/MIME attachment %p (%lu)\n", (void*)ptr, (unsigned long)size)); 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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_set_dime_attachment(struct soap *soap, const char *ptr, size_t size, const char *type, const char *id, unsigned short optype, const char *option) { struct soap_multipart *content = soap_alloc_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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 int SOAP_FMAC2 soap_set_mime_attachment(struct soap *soap, const 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_alloc_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 /******************************************************************************/ #ifndef WITH_LEANER SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_next_multipart(struct soap_multipart *content) { if (content) return content->next; return NULL; } #endif /******************************************************************************/ #ifndef WITH_LEANER static void soap_select_mime_boundary(struct soap *soap) { while (!soap->mime.boundary || soap_valid_mime_boundary(soap)) { char *s = soap->mime.boundary; 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; } *s++ = '='; *s++ = '='; n -= 4; while (n) { *s++ = soap_base64o[soap_random & 0x3F]; n--; } *s++ = '='; *s++ = '='; *s = '\0'; } if (!soap->mime.start) soap->mime.start = ""; } #endif /******************************************************************************/ #ifndef WITH_LEANER static int soap_valid_mime_boundary(struct soap *soap) { struct soap_multipart *content; 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) { const char *p = (const char*)content->ptr; 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 /******************************************************************************/ #ifdef WITH_GZIP 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++) { c = soap_get1(soap); if (i == 1 && c == 8) soap->z_dict = 0; if (i == 2) f = c; } if (f & 0x04) /* FEXTRA */ { i = soap_get1(soap); i |= soap_get1(soap) << 8; while (i-- > 0) { if ((int)soap_get1(soap) == EOF) return soap->error = SOAP_ZLIB_ERROR; } } if (f & 0x08) /* skip FNAME */ { do { c = soap_get1(soap); } while (c && (int)c != EOF); } if ((int)c != EOF && (f & 0x10)) /* skip FCOMMENT */ { do { c = soap_get1(soap); } while (c && (int)c != EOF); } if ((int)c != EOF && (f & 0x02)) /* skip FHCRC (CRC32 is used) */ { c = soap_get1(soap); if ((int)c != EOF) c = soap_get1(soap); } if ((int)c == EOF) return soap->error = SOAP_ZLIB_ERROR; return SOAP_OK; } #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_begin_serve(struct soap *soap) { #ifdef WITH_FASTCGI if (FCGI_Accept() < 0) { soap->error = SOAP_EOF; return soap_send_fault(soap); } #endif soap_begin(soap); if (soap_begin_recv(soap) || soap_envelope_begin_in(soap) || soap_recv_header(soap) || soap_body_begin_in(soap)) { if (soap->error < SOAP_STOP) { #ifdef WITH_FASTCGI (void)soap_send_fault(soap); #else return soap_send_fault(soap); #endif } return soap_closesock(soap); } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_begin_recv(struct soap *soap) { soap_wchar c; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing for input from socket=%d/fd=%d\n", (int)soap->socket, soap->recvfd)); soap->error = SOAP_OK; #ifndef WITH_LEANER soap->recverror = SOAP_OK; #endif 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->imode &= ~SOAP_IO; soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_CHUNK; } soap->imode &= ~(SOAP_ENC_DIME | SOAP_ENC_MIME | SOAP_ENC_MTOM | SOAP_ENC_ZLIB); soap->mode = soap->imode; if (!(soap->mode & SOAP_IO_KEEPALIVE)) soap->keep_alive = 0; if (!soap->keep_alive) soap->buflen = soap->bufidx = 0; soap->null = 0; soap->position = 0; soap->mustUnderstand = 0; soap->shaky = 0; soap->ahead = 0; soap->peeked = 0; soap->level = 0; soap->part = SOAP_BEGIN_RECV; soap->count = 0; soap->length = 0; soap->cdata = 0; *soap->endpoint = '\0'; soap->action = NULL; soap->header = NULL; soap->fault = NULL; soap->status = 0; soap->fform = NULL; soap->body = 1; #ifndef WITH_LEANER soap->dom = NULL; soap->dime.count = 0; 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) && !soap->is && soap->recvfd >= 0) /* Set win32 stdin or soap->recvfd to BINARY, e.g. to support DIME */ #ifdef __BORLANDC__ setmode(soap->recvfd, _O_BINARY); #else _setmode(soap->recvfd, _O_BINARY); #endif #endif #endif #endif #ifdef WITH_ZLIB soap->zlib_in = SOAP_ZLIB_NONE; soap->zlib_out = SOAP_ZLIB_NONE; if (!soap->d_stream) { soap->d_stream = (z_stream*)SOAP_MALLOC(soap, sizeof(z_stream)); if (!soap->d_stream) return soap->error = SOAP_EOM; soap->d_stream->zalloc = Z_NULL; soap->d_stream->zfree = Z_NULL; soap->d_stream->opaque = Z_NULL; soap->d_stream->next_in = Z_NULL; soap->d_stream->msg = Z_NULL; } soap->d_stream->avail_in = 0; soap->d_stream->next_out = (Byte*)soap->buf; soap->d_stream->avail_out = sizeof(soap->buf); soap->z_ratio_in = 1.0; #endif #ifdef WITH_OPENSSL if (soap->ssl) ERR_clear_error(); #endif #ifndef WITH_LEAN soap->start = (ULONG64)time(NULL); #endif #ifndef WITH_LEANER if (soap->fprepareinitrecv && (soap->error = soap->fprepareinitrecv(soap)) != SOAP_OK) return soap->error; #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; if (soap->z_dict) { if (inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != 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, sizeof(soap->buf)); (void)soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)soap->buf, sizeof(soap->buf)); /* 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 = (unsigned int)(soap->buflen - soap->bufidx); soap->z_buflen = soap->buflen; soap->buflen = soap->bufidx; c = ' '; } #endif while (soap_coblank(c)) c = soap_getchar(soap); #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 { /* skip BOM */ if (c == 0xEF && soap_get0(soap) == 0xBB) { soap_get1(soap); c = soap_get1(soap); if (c == 0xBF) { soap->mode &= ~SOAP_ENC_LATIN; c = soap_getchar(soap); } else { c = (0x0F << 12) | (0xBB << 6) | (c & 0x3F); /* UTF-8 */ } } else if ((c == 0xFE && soap_get0(soap) == 0xFF) /* UTF-16 BE */ || (c == 0xFF && soap_get0(soap) == 0xFE)) /* UTF-16 LE */ { return soap->error = SOAP_UTF_ERROR; } /* skip space */ while (soap_coblank(c)) c = soap_getchar(soap); } if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; soap_unget(soap, c); #ifndef WITH_NOHTTP /* if not XML/MIME/DIME/ZLIB, assume HTTP method or status line */ if (((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) && !(soap->mode & (SOAP_ENC_MIME | SOAP_ENC_DIME | SOAP_ENC_ZLIB | SOAP_ENC_PLAIN))) { soap_mode m = soap->imode; soap->error = soap->fparse(soap); soap->mode = soap->imode; /* if imode is changed, effectuate */ soap->imode = m; /* restore imode */ if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) { soap->chunkbuflen = soap->buflen; soap->buflen = soap->bufidx; soap->chunksize = 0; } #ifdef WITH_ZLIB soap->mode &= ~SOAP_ENC_ZLIB; if (soap->zlib_in != SOAP_ZLIB_NONE) { #ifdef WITH_GZIP if (soap->zlib_in != SOAP_ZLIB_DEFLATE) { c = soap_get1(soap); if (c == (int)EOF) return soap->error = SOAP_EOF; 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; if (soap->z_dict) { if (inflateSetDictionary(soap->d_stream, (const Bytef*)soap->z_dict, soap->z_dict_len) != 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, sizeof(soap->buf)); (void)soap_memcpy((void*)soap->z_buf, sizeof(soap->buf), (const void*)soap->buf, sizeof(soap->buf)); soap->d_stream->next_in = (Byte*)(soap->z_buf + soap->bufidx); soap->d_stream->avail_in = (unsigned int)(soap->buflen - soap->bufidx); soap->z_buflen = soap->buflen; soap->buflen = soap->bufidx; } #endif #ifndef WITH_LEANER if (soap->fpreparerecv && (soap->mode & SOAP_IO) != SOAP_IO_CHUNK && soap->buflen > soap->bufidx) { int r; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Invoking fpreparerecv\n")); r = soap->fpreparerecv(soap, soap->buf + soap->bufidx, soap->buflen - soap->bufidx); if (r) return soap->error = r; } #endif if (soap->error && soap->error < SOAP_STOP) { if (soap->status >= 200 && soap->status < 600) { const char *s = soap_http_get_body(soap, NULL); (void)soap_end_recv(soap); if (soap->status >= 300) soap->keep_alive = 0; /* to force close */ return soap_set_receiver_error(soap, "HTTP Error", s, soap->status); } return soap->error; } if (!soap->body && soap->status >= 200 && soap->status < 600) return soap->error = soap->status; /* client side received HTTP status code */ if (soap->status > SOAP_POST) { soap->fform = NULL; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Invoking http method handler\n")); switch (soap->status) { case SOAP_GET: if (soap_http_skip_body(soap) || soap_end_recv(soap)) return soap->error; soap->error = soap->fget(soap); break; case SOAP_PUT: soap->error = soap->fput(soap); break; case SOAP_PATCH: soap->error = soap->fpatch(soap); break; case SOAP_DEL: if (soap_http_skip_body(soap) || soap_end_recv(soap)) return soap->error; soap->error = soap->fdel(soap); break; case SOAP_HEAD: if (soap_http_skip_body(soap) || soap_end_recv(soap)) return soap->error; soap->error = soap->fhead(soap); break; case SOAP_OPTIONS: if (soap_http_skip_body(soap) || soap_end_recv(soap)) return soap->error; soap->error = soap->fopt(soap); break; default: if (soap_http_skip_body(soap) || soap_end_recv(soap)) return soap->error; return 405; } if (soap->error == SOAP_OK) return soap->error = SOAP_STOP; /* prevents further processing */ if (soap->error != SOAP_FORM || !soap->fform) /* continue if handler returned SOAP_FORM */ return soap->error; soap->error = SOAP_OK; } if (soap->fform) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Invoking http form handler\n")); soap->error = soap->fform(soap); if (soap->error == SOAP_OK) return soap->error = SOAP_STOP; /* prevents further processing */ if (soap->status != SOAP_POST || soap->error != 404) /* continue with POST if handler returned HTTP not found */ return soap->error; soap->error = SOAP_OK; } if (!soap->body) return soap->error = SOAP_NO_DATA; } #endif #ifndef WITH_LEANER if ((soap->mode & SOAP_ENC_MIME)) { do /* skip preamble */ { c = soap_getchar(soap); if ((int)c == EOF) return soap->error = SOAP_CHK_EOF; } while (c != '-' || soap_get0(soap) != '-'); soap_unget(soap, c); 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_recv_mime_attachment(soap, NULL)); } if (soap_http_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 SOAP in DIME 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; if (soap->recv_maxlength && soap->count > soap->recv_maxlength) return soap->error = SOAP_EOF; } #endif return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_out(struct soap *soap) { if (soap->version == 0) return SOAP_OK; soap->part = SOAP_IN_ENVELOPE; return soap_element_begin_out(soap, "SOAP-ENV:Envelope", 0, NULL); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_out(struct soap *soap) { if (soap->version == 0) return SOAP_OK; if (soap_element_end_out(soap, "SOAP-ENV:Envelope") || soap_send_raw(soap, "\r\n", 2)) /* 2.8: always emit \r\n */ return soap->error; soap->part = SOAP_END_ENVELOPE; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_http_has_body(struct soap *soap) { return soap->length || (soap->mode & SOAP_ENC_ZLIB) || (soap->mode & SOAP_IO) == SOAP_IO_CHUNK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_http_skip_body(struct soap *soap) { ULONG64 k = soap->length; /* check HTTP body, return "" if none */ if (!k && !(soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) != SOAP_IO_CHUNK) return SOAP_OK; /* do not consume DIME or MIME attachments, leave this to soap_end_recv */ if ((soap->mode & SOAP_ENC_DIME) || (soap->mode & SOAP_ENC_MIME)) return SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Skipping HTTP body (mode=0x%x)\n", soap->mode)); if (k && !(soap->mode & SOAP_ENC_ZLIB)) { size_t i; soap->length = 0; for (i = 0; i < k; i++) { soap_wchar c = soap_get1(soap); if ((int)c == EOF) break; } } else { for (;;) { soap_wchar c = soap_get1(soap); if ((int)c == EOF) break; } } return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_http_get_body(struct soap *soap, size_t *len) { return soap_http_get_body_prefix(soap, len, NULL); } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_http_get_form(struct soap *soap) { return soap_http_get_body_prefix(soap, NULL, "?"); } /******************************************************************************/ SOAP_FMAC1 char * SOAP_FMAC2 soap_http_get_body_prefix(struct soap *soap, size_t *len, const char *prefix) { char *s; ULONG64 k = soap->length; size_t n = 0; if (!prefix) prefix = SOAP_STR_EOS; else n = strlen(prefix); if (len) *len = 0; /* check HTTP body, return "" if none */ if (!k && !(soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) != SOAP_IO_CHUNK) return soap_strdup(soap, prefix); /* do not consume DIME or MIME attachments, leave this to soap_end_recv */ if ((soap->mode & SOAP_ENC_DIME) || (soap->mode & SOAP_ENC_MIME)) return soap_strdup(soap, prefix); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Parsing HTTP body, prefixed with '%s' (mode=0x%x)\n", prefix, soap->mode)); if (k && !(soap->mode & SOAP_ENC_ZLIB)) { char *t; soap->length = 0; /* http content length != 0 and uncompressed body */ if ((SOAP_MAXALLOCSIZE != 0 && n + k > SOAP_MAXALLOCSIZE) || n + k > (ULONG64)((size_t)-2)) { soap->error = SOAP_EOM; return NULL; } s = t = (char*)soap_malloc(soap, (size_t)k + n + 1); if (s) { size_t i; soap_strcpy(t, n + 1, prefix); t += n; for (i = 0; i < k; i++) { soap_wchar c = soap_get1(soap); if ((int)c == EOF) break; *t++ = (char)(c & 0xFF); } *t = '\0'; if (len) *len = n + i; } else { soap->error = SOAP_EOM; return NULL; } } else { size_t i, l = 0; if (soap_alloc_block(soap) == NULL) return NULL; if (n) { s = (char*)soap_push_block(soap, NULL, n); if (!s) return NULL; soap_strcpy(s, n + 1, prefix); l += n; } for (;;) { size_t k = SOAP_BLKLEN; s = (char*)soap_push_block(soap, NULL, k); if (!s) return NULL; for (i = 0; i < k; i++) { soap_wchar c; l++; if (l == 0) { soap->error = SOAP_EOM; return NULL; } c = soap_get1(soap); if ((int)c == EOF) goto end; *s++ = (char)(c & 0xFF); } } end: *s = '\0'; if (len) *len = l - 1; soap_size_block(soap, NULL, i + 1); s = soap_save_block(soap, NULL, NULL, 0); } return s; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_in(struct soap *soap) { soap->part = SOAP_IN_ENVELOPE; if (soap_element_begin_in(soap, "SOAP-ENV:Envelope", 0, NULL)) { if (soap->error == SOAP_TAG_MISMATCH) { if (!soap_element_begin_in(soap, "Envelope", 0, NULL)) soap->error = SOAP_VERSIONMISMATCH; else if (soap->status == 0 || (soap->status >= 200 && soap->status <= 299) || soap->status == 400 || soap->status == 500) return SOAP_OK; /* allow non-SOAP (REST) XML content to be captured */ soap->error = soap->status; } else if (soap->status) { soap->error = soap->status; } return soap->error; } soap_version(soap); return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_in(struct soap *soap) { if (soap->version == 0) return SOAP_OK; soap->part = SOAP_END_ENVELOPE; return soap_element_end_in(soap, "SOAP-ENV:Envelope"); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_out(struct soap *soap) { if (soap->version == 1) soap->encoding = 1; #ifndef WITH_LEAN if ((soap->mode & SOAP_SEC_WSUID) && soap_set_attr(soap, "wsu:Id", "Body", 1)) return soap->error; #endif if (soap->version == 0) return SOAP_OK; soap->part = SOAP_IN_BODY; return soap_element_begin_out(soap, "SOAP-ENV:Body", 0, NULL); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_out(struct soap *soap) { if (soap->version == 0) return SOAP_OK; if (soap_element_end_out(soap, "SOAP-ENV:Body")) return soap->error; soap->part = SOAP_END_BODY; return SOAP_OK; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_body_begin_in(struct soap *soap) { if (soap->version == 0) return SOAP_OK; 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; } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_body_end_in(struct soap *soap) { if (soap->version == 0) return SOAP_OK; if (soap->part == SOAP_NO_BODY) return soap->error = SOAP_OK; soap->part = SOAP_END_BODY; return soap_element_end_in(soap, "SOAP-ENV:Body"); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_recv_header(struct soap *soap) { if (soap_getheader(soap) && soap->error == SOAP_TAG_MISMATCH) soap->error = SOAP_OK; if (soap->error == SOAP_OK && soap->fheader) soap->error = soap->fheader(soap); return soap->error; } /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_endpoint(struct soap *soap, const char *endpoint) { const char *s, *t; 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 soap_strcpy(soap->endpoint, sizeof(soap->endpoint), endpoint); s = strchr(endpoint, ':'); if (s && s[1] == '/' && s[2] == '/') s += 3; else s = endpoint; #if !defined(WITH_NOHTTP) || !defined(WITH_LEANER) t = strchr(s, '@'); if (t && *s != ':' && *s != '@') { size_t l = t - s + 1; char *r = (char*)soap_malloc(soap, l); n = s - endpoint; if (r) { s = soap_decode(r, l, s, ":@"); soap->userid = r; soap->passwd = SOAP_STR_EOS; if (*s == ':') { s++; if (*s != '@') { l = t - s + 1; r = r + strlen(r) + 1; s = soap_decode(r, l, s, "@"); soap->passwd = r; } } } s++; soap_strcpy(soap->endpoint + n, sizeof(soap->endpoint) - n, s); } #endif 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] == ':' || s[i] == '?') break; } } #else for (i = 0; i < n; i++) { soap->host[i] = s[i]; if (s[i] == '/' || s[i] == ':' || s[i] == '?') break; } #endif soap->host[i] = '\0'; if (s[i] == ':') { soap->port = (int)soap_strtol(s + i + 1, NULL, 10); for (i++; i < n; i++) if (s[i] == '/') break; } if (i < n && s[i]) soap_strcpy(soap->path, sizeof(soap->path), s + i); if (soap->override_host && *soap->override_host) { soap_strcpy(soap->host, sizeof(soap->host), soap->override_host); if (soap->override_port) soap->port = soap->override_port; } if (soap->userid && !soap->authrealm) soap->authrealm = soap->host; } /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_GET(struct soap *soap, const char *endpoint, const char *action) { return soap_connect_command(soap, SOAP_GET, endpoint, action); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_PUT(struct soap *soap, const char *endpoint, const char *action, const char *type) { soap->http_content = type; if ((soap->omode & SOAP_IO) != SOAP_IO_CHUNK) { soap->omode &= ~SOAP_IO; soap->omode |= SOAP_IO_STORE; } return soap_connect_command(soap, SOAP_PUT, endpoint, action); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_POST(struct soap *soap, const char *endpoint, const char *action, const char *type) { soap->http_content = type; if ((soap->omode & SOAP_IO) != SOAP_IO_CHUNK) { soap->omode &= ~SOAP_IO; soap->omode |= SOAP_IO_STORE; } return soap_connect_command(soap, SOAP_POST_FILE, endpoint, action); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_PATCH(struct soap *soap, const char *endpoint, const char *action, const char *type) { soap->http_content = type; if ((soap->omode & SOAP_IO) != SOAP_IO_CHUNK) { soap->omode &= ~SOAP_IO; soap->omode |= SOAP_IO_STORE; } return soap_connect_command(soap, SOAP_PATCH, endpoint, action); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_DELETE(struct soap *soap, const char *endpoint) { if (soap_connect_command(soap, SOAP_DEL, endpoint, NULL) || soap_recv_empty_response(soap)) return soap_closesock(soap); return SOAP_OK; } #endif /******************************************************************************/ 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); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_connect_command(struct soap *soap, int http_command, const char *endpoints, const char *action) { if (endpoints) { int retry = soap->connect_retry; unsigned int backoff = 1; for (;;) { struct timeval tv; const char *s; s = strchr(endpoints, ' '); if (s) { size_t l = strlen(endpoints); char *endpoint = NULL; if (SOAP_MAXALLOCSIZE == 0 || l <= SOAP_MAXALLOCSIZE) endpoint = (char*)SOAP_MALLOC(soap, l + 1); if (!endpoint) return soap->error = SOAP_EOM; for (;;) { (void)soap_strncpy(endpoint, l + 1, endpoints, s - endpoints); endpoint[s - endpoints] = '\0'; if (soap_try_connect_command(soap, http_command, endpoint, action) != SOAP_TCP_ERROR) break; while (*s == ' ') s++; if (!*s) break; soap->error = SOAP_OK; 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); } if (soap->error != SOAP_TCP_ERROR || retry <= 0) break; soap->error = SOAP_OK; tv.tv_sec = backoff; tv.tv_usec = 0; select(0, NULL, NULL, NULL, &tv); if (backoff < 32) backoff *= 2; --retry; } } return soap->error; } /******************************************************************************/ 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; ULONG64 count; soap->error = SOAP_OK; (void)soap_memcpy(host, sizeof(host), soap->host, sizeof(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); soap->action = soap_strdup(soap, action); #ifndef WITH_LEANER if (soap->fconnect) { soap->error = soap->fconnect(soap, endpoint, soap->host, soap->port); if (soap->error) 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->error = SOAP_OK; #ifndef WITH_LEAN if (!strncmp(endpoint, "soap.udp:", 9) || !strncmp(endpoint, "udp:", 4)) { soap->omode |= SOAP_IO_UDP; } else #endif { 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 '%s' host='%s' path='%s' port=%d\n", endpoint?endpoint:"(null)", soap->host, soap->path, soap->port)); if (!soap->keep_alive || !soap_valid_socket(soap->socket)) { soap->socket = soap->fopen(soap, endpoint, soap->host, soap->port); if (!soap_valid_socket(soap->socket) || soap->error) { if (soap->error) return soap->error; return soap->error = SOAP_TCP_ERROR; } soap->keep_alive = -((soap->omode & SOAP_IO_KEEPALIVE) != 0); } } } #ifdef WITH_NTLM if (soap_ntlm_handshake(soap, SOAP_GET, endpoint, soap->host, soap->port)) return soap->error; #endif count = soap_count_attachments(soap); if (soap_init_send(soap)) return soap->error; #ifndef WITH_NOHTTP if (http_command == SOAP_GET || http_command == SOAP_DEL || http_command == SOAP_HEAD || http_command == SOAP_OPTIONS) { soap->mode &= ~SOAP_IO; soap->mode |= SOAP_IO_BUFFER; } if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_PLAIN) && endpoint) { soap_mode k = soap->mode; soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB); if ((k & SOAP_IO) != SOAP_IO_FLUSH) soap->mode |= SOAP_IO_BUFFER; soap->error = soap->fpost(soap, endpoint, soap->host, soap->port, soap->path, action, count); if (soap->error) return soap->error; if ((k & SOAP_IO) == SOAP_IO_CHUNK) { if (soap_flush(soap)) return soap->error; } soap->mode = k; } if (http_command == SOAP_GET || http_command == SOAP_DEL || http_command == SOAP_HEAD || http_command == SOAP_OPTIONS) return soap_end_send_flush(soap); #endif #ifndef WITH_LEANER if (soap_begin_attachments(soap)) return soap->error; #endif return SOAP_OK; } /******************************************************************************/ #ifdef WITH_NTLM static int soap_ntlm_handshake(struct soap *soap, int command, const char *endpoint, const char *host, int port) { /* requires libntlm from http://www.nongnu.org/libntlm/ */ const char *userid = (soap->proxy_userid ? soap->proxy_userid : soap->userid); const char *passwd = (soap->proxy_passwd ? soap->proxy_passwd : soap->passwd); struct SOAP_ENV__Header *oldheader; if (soap->ntlm_challenge && userid && passwd && soap->authrealm) { tSmbNtlmAuthRequest req; tSmbNtlmAuthResponse res; tSmbNtlmAuthChallenge ch; int k = soap->keep_alive; ULONG64 l = soap->length; ULONG64 c = soap->count; soap_mode m = soap->mode, o = soap->omode; int s = soap->status; char *a = soap->action; short v = soap->version; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM '%s'\n", soap->ntlm_challenge)); if (!*soap->ntlm_challenge) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM S->C Type 1: received NTLM authentication challenge from server\n")); /* S -> C 401 Unauthorized WWW-Authenticate: NTLM */ buildSmbNtlmAuthRequest(&req, userid, soap->authrealm); soap->ntlm_challenge = soap_s2base64(soap, (unsigned char*)(void*)&req, NULL, SmbLength(&req)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM C->S Type 2: sending NTLM authorization to server\nAuthorization: NTLM %s\n", soap->ntlm_challenge)); /* C -> S GET ... Authorization: NTLM TlRMTVNTUAABAAAAA7IAAAoACgApAAAACQAJACAAAABMSUdIVENJVFlVUlNBLU1JTk9S */ soap->omode = SOAP_IO_BUFFER; if (soap_init_send(soap)) return soap->error; if (!soap->keep_alive) soap->keep_alive = -1; /* client keep alive */ soap->status = command; if (soap->fpost(soap, endpoint, host, port, soap->path, soap->action, 0) || soap_end_send_flush(soap)) return soap->error; soap->mode = m; soap->keep_alive = k; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM S->C Type 2: waiting on server NTLM response\n")); oldheader = soap->header; if (soap_begin_recv(soap)) if (soap->error == SOAP_EOF) return soap->error; (void)soap_end_recv(soap); soap->header = oldheader; soap->length = l; if (soap->status != 401 && soap->status != 407) return soap->error = SOAP_NTLM_ERROR; soap->error = SOAP_OK; } /* S -> C 401 Unauthorized WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAAAAACgAAAABggAAU3J2Tm9uY2UAAAAAAAAAAA== */ soap_base642s(soap, soap->ntlm_challenge, (char*)&ch, sizeof(tSmbNtlmAuthChallenge), NULL); buildSmbNtlmAuthResponse(&ch, &res, userid, passwd); soap->ntlm_challenge = soap_s2base64(soap, (unsigned char*)(void*)&res, NULL, SmbLength(&res)); DBGLOG(TEST, SOAP_MESSAGE(fdebug, "NTLM C->S Type 3: sending NTLM authorization to server\nAuthorization: NTLM %s\n", soap->ntlm_challenge)); /* C -> S GET ... Authorization: NTLM TlRMTVNTUAADAAAAGAAYAHIAAAAYABgAigAAABQAFABAAAAADAAMAFQAAAASABIAYAAAAAAAAACiAAAAAYIAAFUAUgBTAEEALQBNAEkATgBPAFIAWgBhAHAAaABvAGQATABJAEcASABUAEMASQBUAFkArYfKbe/jRoW5xDxHeoxC1gBmfWiS5+iX4OAN4xBKG/IFPwfH3agtPEia6YnhsADT */ soap->userid = NULL; soap->passwd = NULL; soap->proxy_userid = NULL; soap->proxy_passwd = NULL; soap->keep_alive = k; soap->length = l; soap->count = c; soap->mode = m; soap->omode = o; soap->status = s; soap->action = a; soap->version = v; } return SOAP_OK; } #endif /******************************************************************************/ SOAP_FMAC1 char* SOAP_FMAC2 soap_s2base64(struct soap *soap, const unsigned char *s, char *t, int n) { int i; unsigned long m; 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) /* 0 < n <= 2 implies that t[0..4] is allocated (base64 scaling formula) */ { m = 0; for (i = 0; i < n; i++) m = (m << 8) | *s++; for (; i < 3; i++) m <<= 8; for (i = 4; i > 0; m >>= 6) t[--i] = soap_base64o[m & 0x3F]; for (i = 3; i > n; i--) t[i] = '='; t[4] = '\0'; } return p; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_base642s(struct soap *soap, const char *s, char *t, size_t l, int *n) { size_t i, j; soap_wchar c; unsigned long m; 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 + 1; /* space for raw binary and \0 */ t = (char*)soap_malloc(soap, l); } if (!t) return NULL; p = t; if (n) *n = 0; for (i = 0; ; i += 3, l -= 3) { m = 0; j = 0; while (j < 4) { c = *s++; if (c == '=' || !c) { if (l >= j - 1) { switch (j) { case 2: *t++ = (char)((m >> 4) & 0xFF); i++; l--; break; case 3: *t++ = (char)((m >> 10) & 0xFF); *t++ = (char)((m >> 2) & 0xFF); i += 2; l -= 2; } } if (n) *n = (int)i; if (l) *t = '\0'; 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_coblank(c + '+')) { soap->error = SOAP_TYPE; return NULL; } } if (l < 3) { if (n) *n = (int)i; if (l) *t = '\0'; return p; } *t++ = (char)((m >> 16) & 0xFF); *t++ = (char)((m >> 8) & 0xFF); *t++ = (char)(m & 0xFF); } } /******************************************************************************/ SOAP_FMAC1 char* SOAP_FMAC2 soap_s2hex(struct soap *soap, const unsigned char *s, char *t, int n) { 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--) { 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; } /******************************************************************************/ SOAP_FMAC1 const char* SOAP_FMAC2 soap_hex2s(struct soap *soap, const char *s, char *t, size_t l, int *n) { 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 + 1; /* make sure enough space for \0 */ t = (char*)soap_malloc(soap, l); } if (!t) return NULL; p = t; while (l) { int d1, d2; d1 = *s++; if (!d1) break; d2 = *s++; if (!d2) break; *t++ = (char)(((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0')); l--; } if (n) *n = (int)(t - p); if (l) *t = '\0'; return p; } /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 const char * SOAP_FMAC2 soap_http_content_type(struct soap *soap, int status) { if (soap->status != SOAP_GET && soap->status != SOAP_DEL && soap->status != SOAP_CONNECT) { const char *s = "text/xml; charset=utf-8"; #ifndef WITH_LEANER const char *r = NULL; size_t n; #endif if (((status >= SOAP_FILE && status < SOAP_FILE + 600) || soap->status == SOAP_PUT || soap->status == SOAP_POST_FILE || soap->status == SOAP_PATCH) && soap->http_content && *soap->http_content && !strchr(soap->http_content, 10) && !strchr(soap->http_content, 13)) s = soap->http_content; else if (status == SOAP_HTML) s = "text/html; charset=utf-8"; else if (soap->version == 2) s = "application/soap+xml; charset=utf-8"; soap->http_content = NULL; /* use http_content once (assign new value before each call) */ #ifndef WITH_LEANER if (soap->mode & (SOAP_ENC_DIME | SOAP_ENC_MTOM)) { if ((soap->mode & SOAP_ENC_MTOM)) { if (soap->version == 2) r = "application/soap+xml"; else r = "text/xml"; s = "application/xop+xml"; } else { s = "application/dime"; } } if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary) { const char *t; size_t l; (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(soap->mime.boundary) + 53), "multipart/related; charset=utf-8; boundary=\"%s\"; type=\"", soap->mime.boundary); t = strchr(s, ';'); if (t) n = t - s; else n = strlen(s); l = strlen(soap->tmpbuf); if (sizeof(soap->tmpbuf) > l + n) (void)soap_strncpy(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, s, n); if (soap->mime.start) { l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, strlen(soap->mime.start) + 10), "\"; start=\"%s", soap->mime.start); } if (r) { l = strlen(soap->tmpbuf); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, strlen(r) + 15), "\"; start-info=\"%s", r); } l = strlen(soap->tmpbuf); if (sizeof(soap->tmpbuf) > l) soap_strcpy(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, "\""); } else { soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), s); } if (status == SOAP_OK && soap->version == 2 && soap->action) { size_t l = strlen(soap->tmpbuf); n = strlen(soap->action); (SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l, n + 11), "; action=\"%s\"", soap->action); } #else soap_strcpy(soap->tmpbuf, sizeof(soap->tmpbuf), s); #endif return soap->tmpbuf; } return NULL; } #endif /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_puthttphdr(struct soap *soap, int status, ULONG64 count) { int err = SOAP_OK; if (soap_http_content_type(soap, status)) { err = soap->fposthdr(soap, "Content-Type", soap->tmpbuf); if (err) 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 { (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), SOAP_ULONG_FORMAT, count); err = soap->fposthdr(soap, "Content-Length", soap->tmpbuf); } if (err) return err; } if (soap->http_extra_header) { err = soap_send(soap, soap->http_extra_header); soap->http_extra_header = NULL; /* use http_extra_header once (assign new value before each call) */ if (err) return err; err = soap_send_raw(soap, "\r\n", 2); if (err) return err; } if (soap->keep_alive) { if (soap->keep_alive > 0 && soap->recv_timeout) { int t = soap->recv_timeout; if (t < 0) t = 1; (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), 20), "timeout=%d, max=%d", soap->recv_timeout, soap->keep_alive); err = soap->fposthdr(soap, "Keep-Alive", soap->tmpbuf); if (err) return err; } return soap->fposthdr(soap, "Connection", "keep-alive"); } return soap->fposthdr(soap, "Connection", "close"); } #endif /******************************************************************************/ #ifndef WITH_LEAN static const char* soap_set_validation_fault(struct soap *soap, const char *s, const char *t) { if (!t) t = SOAP_STR_EOS; if (*soap->tag) (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(s) + strlen(t) + strlen(soap->tag) + 47), "Validation constraint violation: %s%s in element '%s'", s, t, soap->tag); else (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(s) + strlen(t) + 33), "Validation constraint violation: %s%s", s, t); return soap->msgbuf; } #endif /******************************************************************************/ SOAP_FMAC1 void SOAP_FMAC2 soap_set_fault(struct soap *soap) { const char **c; const char **s; if (soap->version == 0) soap_version(soap); c = soap_faultcode(soap); s = soap_faultstring(soap); if (soap->fseterror) soap->fseterror(soap, c, s); if (!*c) { if (soap->version == 2) *c = "SOAP-ENV:Sender"; else if (soap->version == 1) *c = "SOAP-ENV:Client"; else *c = ""; } if (*s) return; if (soap->error >= SOAP_POST) soap->error = SOAP_HTTP_METHOD; 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: if (*soap->type) *s = soap_set_validation_fault(soap, "type mismatch ", soap->type); else if (*soap->arrayType) *s = soap_set_validation_fault(soap, "array type mismatch", NULL); else *s = soap_set_validation_fault(soap, "invalid value", NULL); break; case SOAP_SYNTAX_ERROR: *s = soap_set_validation_fault(soap, "syntax error", NULL); break; case SOAP_NO_TAG: if (soap->version == 0 && soap->level == 0) *s = soap_set_validation_fault(soap, "root element expected", NULL); else if (soap->level == 0) *s = soap_set_validation_fault(soap, "SOAP message expected", NULL); else *s = soap_set_validation_fault(soap, "element tag expected", NULL); break; case SOAP_END_TAG: *s = soap_set_validation_fault(soap, "closing tag expected", NULL); break; case SOAP_MUSTUNDERSTAND: *c = "SOAP-ENV:MustUnderstand"; (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(soap->tag) + 65), "The data in element '%s' must be understood but cannot be processed", 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 data access error"; break; case SOAP_NO_METHOD: (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(soap->tag) + 66), "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_PATCH_METHOD: *s = "HTTP PATCH method not implemented"; break; case SOAP_DEL_METHOD: *s = "HTTP DELETE method not implemented"; break; case SOAP_HTTP_METHOD: *s = "HTTP method error"; 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 elements (use the SOAP_XML_TREE flag) with duplicate 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 id-ref ", 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_NTLM_ERROR: *s = "An HTTP NTLM authentication error occurred"; break; case SOAP_SSL_ERROR: #ifdef WITH_OPENSSL *s = "SSL/TLS 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 or max DIME size exceeds SOAP_MAXDIMESIZE currently set to " SOAP_XSTRINGIFY(SOAP_MAXDIMESIZE); 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 (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), (soap->d_stream && soap->d_stream->msg ? strlen(soap->d_stream->msg) : 0) + 19), "Zlib/gzip error: '%s'", soap->d_stream && 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_LEVEL: *s = "Maximum XML nesting depth level exceeded: increase maxlevel"; break; case SOAP_LENGTH: *s = soap_set_validation_fault(soap, "value range or content length violation", NULL); break; case SOAP_OCCURS: *s = soap_set_validation_fault(soap, "occurrence constraint violation", NULL); break; case SOAP_FIXED: *s = soap_set_validation_fault(soap, "value does not match the fixed value required", NULL); break; case SOAP_EMPTY: *s = soap_set_validation_fault(soap, "empty value provided where a value is required", NULL); break; case SOAP_FD_EXCEEDED: *s = "Maximum number of open connections was reached: increase FD_SETSIZE or define HAVE_POLL"; break; case SOAP_UTF_ERROR: *s = "UTF content encoding error"; break; case SOAP_STOP: *s = "Stopped: service request already handled by plugin (informative)"; break; #endif case SOAP_EOF: #ifndef WITH_NOIO *s = soap_strerror(soap); /* *s = soap->msgbuf */ #ifndef WITH_LEAN if (strlen(soap->msgbuf) + 25 < sizeof(soap->msgbuf)) { (void)soap_memmove((void*)(soap->msgbuf + 25), sizeof(soap->tmpbuf) - 25, (const void*)soap->msgbuf, strlen(soap->msgbuf) + 1); if (soap->is) #if defined(__cplusplus) && !defined(WITH_COMPAT) (void)soap_memcpy((void*)soap->msgbuf, sizeof(soap->msgbuf), (const void*)"End or bad std::istream: ", 25); #else (void)soap_memcpy((void*)soap->msgbuf, sizeof(soap->msgbuf), (const void*)"End at NUL buffer input: ", 25); #endif else (void)soap_memcpy((void*)soap->msgbuf, sizeof(soap->msgbuf), (const void*)"End of file or no input: ", 25); } #endif break; #else *s = "End of file or no input"; break; #endif case SOAP_ERR: *s = "An unspecified error occurred"; break; default: #ifndef WITH_NOHTTP #ifndef WITH_LEAN if (soap->error >= 200 && soap->error < 600) { const char *t = http_error(soap, soap->error); (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), strlen(t) + 54), "Error %d: HTTP %d %s", soap->error, soap->error, t); *s = soap->msgbuf; } else #endif #endif { (SOAP_SNPRINTF(soap->msgbuf, sizeof(soap->msgbuf), 26), "Error %d", soap->error); *s = soap->msgbuf; } } } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_send_fault(struct soap *soap) { int status = soap->error; if (status == SOAP_OK || status == SOAP_STOP) return soap_closesock(soap); #ifndef WITH_NOHTTP if (status >= 200 && status <= 299) return soap_send_empty_response(soap, status); #endif DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending back fault struct for error code %d\n", soap->error)); soap->keep_alive = 0; /* error: close connection later by disabling keep-alive here */ soap_set_fault(soap); if (soap->error < 200 && soap->error != SOAP_FAULT) soap->header = NULL; 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)) { r = tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_SND, 0); if (r > 0) { int t; if (!(r & SOAP_TCP_SELECT_SND) || ((r & SOAP_TCP_SELECT_RCV) && recv(soap->socket, (char*)&t, 1, MSG_PEEK) < 0)) r = 0; } } #endif #endif if (r > 0) { soap->error = SOAP_OK; if (soap->version > 0) { soap->encodingStyle = NULL; /* no encodingStyle in Faults */ soap_serializeheader(soap); soap_serializefault(soap); (void)soap_begin_count(soap); if ((soap->mode & SOAP_IO_LENGTH)) { if (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); } (void)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) || soap_end_send(soap)) return soap_closesock(soap); } else { const char *s = *soap_faultstring(soap); const char **d = soap_faultdetail(soap); (void)soap_begin_count(soap); if ((soap->mode & SOAP_IO_LENGTH)) if (soap_element_begin_out(soap, "fault", 0, NULL) || soap_outstring(soap, "reason", 0, (char*const*)&s, NULL, 0) || soap_outliteral(soap, "detail", (char*const*)d, NULL) || soap_element_end_out(soap, "fault")) return soap_closesock(soap); (void)soap_end_count(soap); if (soap_response(soap, status) || soap_element_begin_out(soap, "fault", 0, NULL) || soap_outstring(soap, "reason", 0, (char*const*)&s, NULL, 0) || soap_outliteral(soap, "detail", (char*const*)d, NULL) || soap_element_end_out(soap, "fault") || soap_end_send(soap)) return soap_closesock(soap); } } } soap->error = status; return soap_closesock(soap); } /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_recv_fault(struct soap *soap, int check) { int status = soap->status; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Check (%d) if receiving SOAP Fault (status = %d)\n", check, status)); if (!check) { /* try getfault when no tag or tag mismatched at level 2, otherwise close and return SOAP_TAG_MISMATCH or HTTP error code */ if (soap->error != SOAP_NO_TAG && (soap->error != SOAP_TAG_MISMATCH || soap->level != 2)) { if (soap->error == SOAP_TAG_MISMATCH && soap->level == 0) { soap->error = SOAP_OK; if (!soap_element_begin_in(soap, "fault", 0, NULL)) { char *s = NULL, *d = NULL; (void)soap_instring(soap, "reason", &s, NULL, 0, 1, 0, -1, NULL); (void)soap_inliteral(soap, "detail", &d); if (!soap_element_end_in(soap, "fault") && !soap_end_recv(soap)) { *soap_faultstring(soap) = s; *soap_faultdetail(soap) = d; if (status) soap->error = status; else soap->error = SOAP_FAULT; soap_set_fault(soap); return soap_closesock(soap); } } soap->error = SOAP_TAG_MISMATCH; } if (status && (status < 200 || status > 299)) soap->error = status; return soap_closesock(soap); } } soap->error = SOAP_OK; if (soap_getfault(soap)) { /* if check>0 and no SOAP Fault is present and no HTTP error then just return to parse request */ if (check && (status == 0 || (status >= 200 && status <= 299)) && ((soap->error == SOAP_TAG_MISMATCH && soap->level == 2) || soap->error == SOAP_NO_TAG)) return soap->error = SOAP_OK; /* if check=0 and empty SOAP Body and encodingStyle is NULL and no HTTP error then just return */ if (!check && (status == 0 || (status >= 200 && status <= 299)) && !soap->encodingStyle && (soap->error == SOAP_NO_TAG && soap->level <= 2)) return soap->error = SOAP_OK; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error: soap_get_soapfault() failed with error %d at level %u tag '%s'\n", soap->error, soap->level, soap->tag)); *soap_faultcode(soap) = (soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client"); if (status) soap->error = status; else soap->error = status = SOAP_NO_DATA; soap_set_fault(soap); } else { 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, "Received SOAP Fault code %s\n", s)); status = SOAP_FAULT; } if (!soap_body_end_in(soap)) soap_envelope_end_in(soap); } (void)soap_end_recv(soap); soap->error = status; return soap_closesock(soap); } /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_send_empty_response(struct soap *soap, int httpstatuscode) { soap_mode m = soap->omode; if (!(m & SOAP_IO_UDP)) { soap->count = 0; if ((m & SOAP_IO) == SOAP_IO_CHUNK) soap->omode = (m & ~SOAP_IO) | SOAP_IO_BUFFER; (void)soap_response(soap, httpstatuscode); (void)soap_end_send(soap); /* force end of sends */ soap->error = SOAP_STOP; /* stops the server from returning another response */ soap->omode = m; } return soap_closesock(soap); } #endif /******************************************************************************/ #ifndef WITH_NOHTTP SOAP_FMAC1 int SOAP_FMAC2 soap_recv_empty_response(struct soap *soap) { soap->error = SOAP_OK; if (!(soap->omode & SOAP_IO_UDP) && !(soap->omode & SOAP_ENC_PLAIN)) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Receiving empty response\n")); if (soap_begin_recv(soap) == SOAP_OK) { if (soap_http_skip_body(soap) || soap_end_recv(soap)) return soap_closesock(soap); } else if (soap->error == 200 || soap->error == 201 || soap->error == 202) { soap->error = SOAP_OK; } } #ifndef WITH_LEANER else if ((soap->fprepareinitrecv && (soap->error = soap->fprepareinitrecv(soap))) || (soap->fpreparefinalrecv && (soap->error = soap->fpreparefinalrecv(soap)))) { return soap->error; } #endif return soap_closesock(soap); } #endif /******************************************************************************/ #ifndef WITH_NOIO static const char* soap_strerror(struct soap *soap) { int err = soap->errnum; *soap->msgbuf = '\0'; if (err) { #ifndef WIN32 # ifdef HAVE_STRERROR_R # if !defined(_GNU_SOURCE) || (!_GNU_SOURCE && ((!defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || (_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600)) || defined(__ANDROID__) || !defined(__GLIBC__)) err = strerror_r(err, soap->msgbuf, sizeof(soap->msgbuf)); /* XSI-compliant */ if (err != 0) soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), "unknown error"); # else return strerror_r(err, soap->msgbuf, sizeof(soap->msgbuf)); /* GNU-specific */ # endif # else return strerror(err); # endif #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 #endif } else { if (soap->recv_maxlength && soap->count > soap->recv_maxlength) { soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), "max message length exceeded"); } else { int tt = soap->transfer_timeout, rt = soap->recv_timeout, st = soap->send_timeout; #ifndef WITH_LEAN int tu = ' ', ru = ' ', su = ' '; #endif soap_strcpy(soap->msgbuf, sizeof(soap->msgbuf), "message transfer interrupted"); if (tt | rt || st) soap_strcpy(soap->msgbuf + 28, sizeof(soap->msgbuf) - 28, " or timed out"); #ifndef WITH_LEAN if (tt < 0) { tt = -tt; tu = 'u'; } if (rt < 0) { rt = -rt; ru = 'u'; } if (st < 0) { st = -st; su = 'u'; } if (tt) { size_t l = strlen(soap->msgbuf); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, 43), " (%d%csec max transfer time)", tt, tu); } if (rt) { size_t l = strlen(soap->msgbuf); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, 40), " (%d%csec max recv delay)", rt, ru); } if (st) { size_t l = strlen(soap->msgbuf); (SOAP_SNPRINTF(soap->msgbuf + l, sizeof(soap->msgbuf) - l, 40), " (%d%csec max send delay)", st, su); } #endif } } return soap->msgbuf; } #endif /******************************************************************************/ 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) { const char **s = soap_faultdetail(soap); if (s) *s = faultdetailXML; } return soap->error = soaperror; } /******************************************************************************/ 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->version == 1 ? "SOAP-ENV:Client" : "at sender", NULL, faultstring, faultdetailXML, soaperror); } /******************************************************************************/ 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->version == 1 ? "SOAP-ENV:Server" : "detected", NULL, faultstring, faultdetailXML, soaperror); } /******************************************************************************/ 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; DBGFUN2("soap_copy_fault", "code=%s", faultcode ? faultcode : "(null)", "string=%s", faultstring ? faultstring : "(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); } /******************************************************************************/ 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); } /******************************************************************************/ 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->version == 1 ? "SOAP-ENV:Client" : "at source", faultsubcodeQName, faultstring, faultdetailXML); } /******************************************************************************/ 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); } /******************************************************************************/ 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->version == 1 ? "SOAP-ENV:Server" : "is internal", faultsubcodeQName, faultstring, faultdetailXML); } /******************************************************************************/ #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; c = soap_faultcode(soap); if (!*c) { soap_set_fault(soap); c = soap_faultcode(soap); } if (soap->version == 2) v = soap_fault_subcode(soap); s = soap_fault_string(soap); d = soap_fault_detail(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 : "[no detail]"); } } #endif /******************************************************************************/ #ifdef __cplusplus #ifndef WITH_LEAN #ifndef WITH_NOSTDLIB #ifndef WITH_COMPAT 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; c = soap_faultcode(soap); if (!*c) { soap_set_fault(soap); c = soap_faultcode(soap); } if (soap->version == 2) v = soap_fault_subcode(soap); s = soap_fault_string(soap); d = soap_fault_detail(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 : "[no detail]") << std::endl; } } #endif #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)) { soap_strcpy(buf, len, "Error: soap struct not initialized"); } else if (soap->error) { const char **c, *v = NULL, *s, *d; c = soap_faultcode(soap); if (!*c) { soap_set_fault(soap); c = soap_faultcode(soap); } if (soap->version == 2) v = soap_fault_subcode(soap); if (!v) v = "no subcode"; s = soap_fault_string(soap); if (!s) s = "[no reason]"; d = soap_fault_detail(soap); if (!d) d = "[no detail]"; (SOAP_SNPRINTF(buf, len, strlen(*c) + strlen(v) + strlen(s) + strlen(d) + 72), "%s%d fault %s [%s]\n\"%s\"\nDetail: %s\n", soap->version ? "SOAP 1." : "Error ", soap->version ? (int)soap->version : soap->error, *c, v, s, d); } else if (len > 0) { *buf = '\0'; } return buf; } #endif #endif /******************************************************************************/ #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_check_state(soap) == SOAP_OK && soap->error && soap->error != SOAP_STOP && soap->bufidx <= soap->buflen && soap->buflen > 0 && soap->buflen <= sizeof(soap->buf)) { 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] = (char)c1; soap->buf[j] = (char)c2; } #else (void)soap; (void)fd; #endif } #endif /******************************************************************************/ #ifdef __cplusplus #ifndef WITH_LEAN #ifndef WITH_NOSTDLIB #ifndef WITH_COMPAT SOAP_FMAC1 void SOAP_FMAC2 soap_stream_fault_location(struct soap *soap, std::ostream& os) { int i, j, c1, c2; if (soap_check_state(soap) == SOAP_OK && soap->error && soap->error != SOAP_STOP && soap->bufidx <= soap->buflen && soap->buflen > 0 && soap->buflen <= sizeof(soap->buf)) { 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'; os << soap->buf << (char)c1 << std::endl << "" << std::endl; if (soap->bufidx < soap->buflen) os << soap->buf + soap->bufidx << std::endl; soap->buf[i] = (char)c1; soap->buf[j] = (char)c2; } } #endif #endif #endif #endif /******************************************************************************/ SOAP_FMAC1 int SOAP_FMAC2 soap_register_plugin_arg(struct soap *soap, int (*fcreate)(struct soap*, struct soap_plugin*, void*), void *arg) { struct soap_plugin *p; int err; p = (struct soap_plugin*)SOAP_MALLOC(soap, sizeof(struct soap_plugin)); if (!p) return soap->error = SOAP_EOM; p->id = NULL; p->data = NULL; p->fcopy = NULL; p->fdelete = NULL; err = fcreate(soap, p, arg); if (!err && p->fdelete && p->id) { if (!soap_lookup_plugin(soap, p->id)) { 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 with the same ID already registered\n", p->id)); SOAP_FREE(soap, p); return SOAP_OK; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not register plugin '%s': plugin returned error %d or plugin ID not set or fdelete callback not set\n", p->id ? p->id : "plugin ID not set", err)); SOAP_FREE(soap, p); soap->error = err ? err : SOAP_PLUGIN_ERROR; return soap->error; } /******************************************************************************/ static void * fplugin(struct soap *soap, const char *id) { 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; } /******************************************************************************/ SOAP_FMAC1 void * SOAP_FMAC2 soap_lookup_plugin(struct soap *soap, const char *id) { return soap->fplugin(soap, id); } /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************\ * * C++ soap struct methods * \******************************************************************************/ #ifdef __cplusplus soap::soap() { soap_init(this); /* no logs to prevent DEBUG mode leaks when the user calls a soap_init() on this context */ soap_set_test_logfile(this, NULL); soap_set_sent_logfile(this, NULL); soap_set_recv_logfile(this, NULL); } #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(const struct soap& soap) { soap_copy_context(this, &soap); } #endif /******************************************************************************/ #ifdef __cplusplus struct soap& soap::operator=(const struct soap& soap) { soap_done(this); soap_copy_context(this, &soap); return *this; } #endif /******************************************************************************/ #ifdef __cplusplus void soap::destroy() { soap_destroy(this); soap_end(this); } #endif /******************************************************************************/ #ifdef __cplusplus soap::~soap() { soap_done(this); } #endif /******************************************************************************/ gsoap-2.8.91/gsoap/Palm/0000755000175000017500000000000013525245161014272 5ustar ellertellertgsoap-2.8.91/gsoap/Palm/README.txt0000644000175000017500000000027413525245161015773 0ustar ellertellert Web services support for the Palm OS Platform is no longer available for gSOAP versions 2.7.9 and up. Please download gSOAP 2.7.8c for the most up-to-date release with Palm OS support. gsoap-2.8.91/gsoap/stdsoap2.h0000644000175000017500000046012413525245163015322 0ustar ellertellert/* stdsoap2.h 2.8.91 gSOAP runtime engine gSOAP XML Web services tools Copyright (C) 2000-2019, 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 addition licensed under the gSOAP public license: - vxWorks compatible, enabled with compiler option -DVXWORKS -------------------------------------------------------------------------------- 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-2019, 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 -------------------------------------------------------------------------------- */ #define GSOAP_VERSION 20891 #ifdef WITH_SOAPDEFS_H # include "soapdefs.h" /* include user-defined stuff in soapdefs.h */ #endif #ifndef _THREAD_SAFE # define _THREAD_SAFE #endif #ifndef OPENSERVER # ifndef _REENTRANT # define _REENTRANT # endif #endif #ifdef _WIN32 # ifndef WIN32 # define WIN32 # endif #endif /* for legacy purposes we use WIN32 macro, even when WIN64 is supported */ #ifdef _WIN64 # ifndef WIN32 # define WIN32 # endif #endif #ifdef WIN32 # ifdef SOAP_STD_EXPORTS /* dllexport the API functions and classes */ # ifndef SOAP_STD_API # define SOAP_STD_API __declspec(dllexport) # endif # ifndef SOAP_CMAC # define SOAP_CMAC SOAP_STD_API /* export soap struct and generated classes */ # endif # ifndef SOAP_FMAC1 # define SOAP_FMAC1 SOAP_STD_API /* export stdsoap2.cpp API */ # endif # ifndef SOAP_FMAC3 # define SOAP_FMAC3 SOAP_STD_API /* export soapC.cpp serializers API */ # endif # ifndef SOAP_FMAC5 # define SOAP_FMAC5 SOAP_STD_API /* export soapClient.cpp and soapServer.cpp API */ # endif # 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 #ifndef STDSOAP_H #define STDSOAP_H #define SOAP_XSTRINGIFY(s) SOAP_STRINGIFY(s) #define SOAP_STRINGIFY(s) #s #if defined(SOAPDEFS_H) && !defined(WITH_SOAPDEFS_H) # include SOAP_XSTRINGIFY(SOAPDEFS_H) /* include user-defined "SOAPDEFS_H" */ #endif #if defined(__vxworks) || defined(__VXWORKS__) # ifndef VXWORKS # define VXWORKS # 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 __clang__ # ifdef _WIN32 # ifndef WIN32 # define WIN32 # endif # endif # else # ifdef __WIN32__ # ifndef WIN32 # define WIN32 # endif # endif # endif #endif #if defined(__CYGWIN__) || defined(__CYGWIN32__) # ifndef CYGWIN # define CYGWIN # endif #endif #ifdef __SYMBIAN32__ # define SYMBIAN # undef WIN32 #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 #if defined(__sun) && defined(__SVR4) # ifndef SUN_OS # define SUN_OS # endif #endif #ifdef HAVE_CONFIG_H # include "config.h" #else # if defined(UNDER_CE) # define SOAP_BUFLEN (2048) # define SOAP_PTRHASH (32) # define SOAP_IDHASH (19) # define SOAP_BLKLEN (32) # define SOAP_TAGLEN (256) # define SOAP_HDRLEN (1024) # define SOAP_MAXDIMS (4) # define HAVE_SSCANF # elif defined(CYGWIN) # define HAVE_POLL # define HAVE_SNPRINTF # 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_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_INTTYPES_H # define HAVE_LOCALE_H # define HAVE_SOCKLEN_T # elif defined(WIN32) # ifdef __BORLANDC__ # ifdef __clang__ # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_STRTOL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_GMTIME # define HAVE_WCTOMB # define HAVE_MBTOWC # define SOAP_LONG_FORMAT "%lld" # define SOAP_ULONG_FORMAT "%llu" # else # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_STRTOL # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_GMTIME # define HAVE_WCTOMB # define HAVE_MBTOWC # define SOAP_LONG_FORMAT "%I64d" # define SOAP_ULONG_FORMAT "%I64u" # endif # else # if _MSC_VER >= 1400 # define HAVE_SNPRINTF # endif # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_STRTOL # define HAVE_STRTOUL # if _MSC_VER >= 1300 # define HAVE_STRTOLL /* use _strtoi64 */ # define HAVE_STRTOULL /* use _strtoui64 */ # endif # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_GMTIME # define HAVE_WCTOMB # define HAVE_MBTOWC # define SOAP_LONG_FORMAT "%I64d" # define SOAP_ULONG_FORMAT "%I64u" # define HAVE_LOCALE_H # endif # elif defined(__APPLE__) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRLCPY # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SSCANF_L # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_RAND_R # define HAVE_GMTIME_R # define HAVE_ASCTIME_R # define HAVE_TM_GMTOFF # define HAVE_GETTIMEOFDAY # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_TIMEGM # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_INTTYPES_H # define HAVE_LOCALE_H # define HAVE_XLOCALE_H # define HAVE_RANDOM # define HAVE_SOCKLEN_T # elif defined(_AIX43) # define HAVE_SNPRINTF # 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_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_LOCALE_H # define HAVE_SOCKLEN_T # elif defined(_AIX41) # define HAVE_SNPRINTF # 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 # define HAVE_LOCALE_H # elif defined(HP_UX) # include # if 0 /* enable if __strtoll and __strtoull are available */ extern intmax_t __strtoll(const char*, char**, int); extern intmax_t __strtoull(const char*, char**, int); # define strtoll __strtoll # define strtoull __strtoull # endif # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # 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_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_ISNAN # define HAVE_LOCALE_H # elif defined(FREEBSD) || defined(__FreeBSD__) || defined(OPENBSD) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRLCPY # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOD_L # define HAVE_SSCANF_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_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define SOAP_LONG_FORMAT "%qd" # define SOAP_ULONG_FORMAT "%qu" # define HAVE_ISNAN # define HAVE_ISINF # define HAVE_LOCALE_H # define HAVE_XLOCALE_H # define HAVE_RANDOM # define HAVE_SOCKLEN_T # elif defined(__VMS) # include # define HAVE_SNPRINTF # 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_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # elif defined(TRU64) # define HAVE_SNPRINTF # 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_ASCTIME_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" # define HAVE_LOCALE_H # elif defined(__GLIBC__) || defined(__GNU__) || defined(__GNUC__) # define HAVE_POLL # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_SYS_TIMEB_H # define HAVE_GETTIMEOFDAY # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_TIMEGM # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_ISNAN # define HAVE_ISINF # if !defined(__GNUC__) || __GNUC__ >= 4 /* gcc 3 and earlier often refuse to compile _l functions */ # define HAVE_STRTOD_L # define HAVE_SSCANF_L # define HAVE_LOCALE_H # endif # define HAVE_SOCKLEN_T # elif defined(MAC_CARBON) # define WITH_NOIO # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # 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_SNPRINTF # 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_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_SOCKLEN_T # elif defined(AS400) # define HAVE_SNPRINTF # 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_ASCTIME_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_POLL # define HAVE_SNPRINTF # define HAVE_STRLCPY # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # define HAVE_STRTOL # define HAVE_STRTOUL # define HAVE_STRTOLL # define HAVE_STRTOULL # define HAVE_GETTIMEOFDAY # define HAVE_SYS_TIMEB_H # define HAVE_FTIME # define HAVE_RAND_R # define HAVE_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_WCTOMB # define HAVE_MBTOWC # define HAVE_SOCKLEN_T # elif defined(SUN_OS) # define HAVE_SNPRINTF # 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_ASCTIME_R # define HAVE_LOCALTIME_R # else /* Default assumptions for supported library functions when not including config.h */ # ifndef WITH_C_LOCALE # ifndef WITH_NO_C_LOCALE # define WITH_NO_C_LOCALE /* turn locale support off by default */ # endif # endif # define HAVE_SNPRINTF # define HAVE_STRRCHR # define HAVE_STRTOD # define HAVE_SSCANF # 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_GETHOSTBYNAME_R # define HAVE_GMTIME_R # define HAVE_ASCTIME_R # define HAVE_LOCALTIME_R # define HAVE_STRERROR_R # define HAVE_LOCALE_H # ifdef MB_LEN_MAX # define HAVE_WCTOMB # define HAVE_MBTOWC # endif # endif #endif #ifdef WITH_LEANER # ifndef WITH_LEAN # define WITH_LEAN # endif #endif /* gSOAP 2.7.15 and higher: always use FAST and retain CDATA in literal XML, unless WITH_LEAN or WITH_NOCDATA */ #ifndef WITH_LEAN # ifndef WITH_FAST # define WITH_FAST # endif # ifndef WITH_NOCDATA # ifndef WITH_CDATA # define WITH_CDATA # endif # endif #endif #if !defined(__cplusplus) /* allowing empty struct/union in C is a GNU extension */ # if !defined(__GNU__) && !defined(__GNUC__) # define WITH_NOEMPTYSTRUCT # endif #endif /* silence clang's C99 variadic macro warnings */ #ifdef __clang__ # pragma clang diagnostic ignored "-Wvariadic-macros" #endif #if defined(WITH_PURE_VIRTUAL) # define SOAP_PURE_VIRTUAL = 0 # define SOAP_PURE_VIRTUAL_COPY = 0 #elif defined(WITH_DEFAULT_VIRTUAL) # define SOAP_PURE_VIRTUAL { return SOAP_NO_METHOD; } # define SOAP_PURE_VIRTUAL_COPY #else # define SOAP_PURE_VIRTUAL # define SOAP_PURE_VIRTUAL_COPY #endif /* older OpenVMS TCP/IP stacks cannot handle 65536 bytes */ #ifdef __VMS # ifndef SOAP_BUFLEN # define SOAP_BUFLEN (65535) # endif #endif /* small buffer, to accelerate base64 and hex binary output */ #ifndef SOAP_BINARY_BUFLEN # define SOAP_BINARY_BUFLEN (128) #endif /* if we have locale.h then we should use it WITH_C_LOCALE enabled to avoid decimal point conversion issues */ #ifdef HAVE_LOCALE_H # ifndef WITH_NO_C_LOCALE # ifndef WITH_C_LOCALE # define WITH_C_LOCALE # endif # endif #endif /* MinGW does not support uselocale() and xlocale.h and gettimeofday() */ #if defined(__MINGW32__) || defined(__MINGW64__) # if !defined(WITH_NO_C_LOCALE) # define WITH_NO_C_LOCALE # endif # undef HAVE_GETTIMEOFDAY #endif /* user can set WITH_NO_C_LOCALE to force removal of locale (e.g. in case of compiler errors) */ #ifdef WITH_NO_C_LOCALE # undef WITH_C_LOCALE #endif #ifndef WITH_NOSTDLIB # include # include # include # if !defined(HAVE_CONFIG_H) || defined(HAVE_CTYPE_H) # include # endif # if !defined(HAVE_CONFIG_H) || defined(HAVE_LIMITS_H) # include /* for MB_LEN_MAX */ # endif # if !defined(HAVE_CONFIG_H) || defined(HAVE_FLOAT_H) # include /* for INFINITY */ # endif # if !defined(HAVE_CONFIG_H) || defined(HAVE_MATH_H) # include /* for isnan() and isinf() */ # endif #endif /* force inclusion of xlocale.h when WITH_INCLUDE_XLOCALE_H is defined by the user for systems that require xlocale.h */ #ifdef WITH_INCLUDE_XLOCALE_H # ifndef HAVE_XLOCALE_H # define HAVE_XLOCALE_H # endif #endif #ifdef WITH_C_LOCALE # include # if defined(WIN32) && !defined(CYGWIN) # define SOAP_LOCALE_T _locale_t # define SOAP_LOCALE(soap) ((soap)->c_locale ? (soap)->c_locale : ((soap)->c_locale = _create_locale(LC_ALL, "C"))) # define SOAP_FREELOCALE(soap) (void)((soap)->c_locale && (_free_locale((soap)->c_locale), ((soap)->c_locale = NULL))) # else # if defined(HAVE_XLOCALE_H) # include # endif # define SOAP_LOCALE_T locale_t # define SOAP_LOCALE(soap) ((soap)->c_locale ? (soap)->c_locale : ((soap)->c_locale = newlocale(LC_ALL_MASK, "C", NULL))) # define SOAP_FREELOCALE(soap) (void)((soap)->c_locale && (freelocale((soap)->c_locale), ((soap)->c_locale = NULL))) # if defined(CYGWIN) # undef HAVE_STRTOF_L /* Cygwin does not support strtof_l strtod_l */ # undef HAVE_STRTOD_L # endif # endif #else # undef HAVE_STRTOF_L # undef HAVE_STRTOD_L # undef HAVE_SSCANF_L #endif #ifdef TANDEM_NONSTOP /* Support for Guardian */ # define SOAP_BUFLEN (32767) /*# define WITH_NOSTDLIB */ /* uncommment to remove stdlib dependences */ # define WITH_NOIO /* no IO dependences, e.g. remove TCP/IP */ # define int32_t int # define int64_t long long # define LONG64 long long # define ULONG64 unsigned long long # define DBL_PINFTY (1.1579208923716189e77) # undef HAVE_WCTOMB # undef HAVE_MBTOWC # undef HAVE_GMTIME_R # undef HAVE_ASCTIME_R # undef HAVE_LOCALTIME_R # undef HAVE_SNPRINTF # define SOAP_BUFLEN (32767) # define SOAP_SOCKET short #pragma nolist # include # include # include # include # include # include # include # include # include # include # include # define INET_ERROR 4294967295 #pragma list #elif defined(__TANDEM) /* Support for OSS */ # define int32_t int # define SOAP_BUFLEN (32767) #endif #ifdef WITH_NTLM # include #endif #ifdef HAVE_POLL # include #endif #ifdef __cplusplus # include # include # ifndef WITH_COMPAT # include # include # endif #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 WITH_NOIO # include # include # endif # ifndef WITH_LEAN # ifdef HAVE_SYS_TIMEB_H # include /* for ftime() */ # endif # include # endif #endif #ifdef OPENSERVER # include # include # include extern int h_errno; #endif #ifdef HAVE_GETTIMEOFDAY # ifndef WIN32 # ifdef VXWORKS # ifdef _WRS_KERNEL # include # endif # else # include /* for timeval and gettimeofday() */ # endif # endif #endif #ifndef WITH_NOIO # ifndef WIN32 # include # ifdef VXWORKS # include # include # ifndef _WRS_KERNEL # include # endif # else # ifndef SYMBIAN # include # endif # endif # ifdef SUN_OS # include /* SUN */ # include /* only needed with SUN < 2.8 ? */ # endif # ifdef VXWORKS # ifdef _WRS_KERNEL # include # endif # endif # include # ifdef OS390 # include # else # include /* TCP_NODELAY, TCP_FASTOPEN */ # endif # include # endif #endif #ifdef WIN32 # define SOAP_WINSOCKINT int #else # define SOAP_WINSOCKINT size_t #endif #ifdef WIN32 # undef WITH_SELF_PIPE #endif #if defined(WITH_IPV6_V6ONLY) # ifndef WITH_IPV6 # define WITH_IPV6 # endif #endif #ifdef WIN32 # ifndef UNDER_CE # include # include # endif // When you get macro redefinition errors when compiling the code below, then: // a) try arrange your includes so is included after "stdsoap2.h" // b) or define _WINSOCKAPI_ first: // #define _WINSOCKAPI_ // stops windows.h including winsock.h // #include // #include "stdsoap2.h" // c) or compile with the -DWIN32_LEAN_AND_MEAN switch # include // Visual Studio 2005 users: install Platform SDK (R2) # include // # define _WSPIAPI_COUNTOF // DEV NOTE: enble to fix problems with VC6 // # include # include // DEV NOTE: replaces older wspiapi.h above # ifdef WITH_IPV6 # define SOAP_GAI_STRERROR gai_strerrorA # endif #else # ifdef VXWORKS # include # include # include # endif # ifndef WITH_NOIO # include # include # include # include # ifdef _AIX41 # include # endif # endif #endif #ifdef WITH_FASTCGI # include #endif #ifdef WITH_OPENSSL # ifdef __VMS # pragma names save # pragma names uppercase # endif # undef WITH_GNUTLS # define OPENSSL_NO_KRB5 # include # include # include # 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 # ifdef __VMS # pragma names restore # endif #endif #ifdef WITH_GNUTLS # include # include # if GNUTLS_VERSION_NUMBER < 0x020b00 /* deprecated since GNUTLS 2.11.0 */ # include # endif # ifndef HAVE_PTHREAD_H # ifdef _POSIX_THREADS # define HAVE_PTHREAD_H /* make GNUTLS thread safe */ # endif # endif #endif #ifdef WITH_SYSTEMSSL # include #endif #ifdef WITH_GZIP # ifndef WITH_ZLIB # define WITH_ZLIB # endif #endif #ifdef WITH_CASEINSENSITIVETAGS # define SOAP_STRCMP soap_tag_cmp /* case insensitive XML element/attribute names */ #else # define SOAP_STRCMP strcmp /* case sensitive XML element/attribute names */ #endif #ifdef WITH_ZLIB # include #endif /* #define DEBUG */ /* Uncomment to debug sending (in file SENT.log) receiving (in file RECV.log) and internal operations (in file TEST.log) */ /* #define DEBUG_STAMP */ /* Uncomment to debug sending (in file SENT.log) receiving (in file RECV.log) and time-stamped operations (in file TEST.log) */ #ifdef __cplusplus extern "C" { #endif /* Portability (X/Open, BSD sockets etc): define SOAP_SOCKLEN_T as socklen_t or int or ... */ #if defined(HAVE_SOCKLEN_T) # define SOAP_SOCKLEN_T socklen_t #elif defined(_AIX) || defined(AIX) || defined(HP_UX) # 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(__ANDROID__) || !defined(_GNU_SOURCE) || (!_GNU_SOURCE && !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 # define SOAP_SOCKLEN_T socklen_t #elif defined(IRIX) || defined(WIN32) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS) # define SOAP_SOCKLEN_T int #elif !defined(SOAP_SOCKLEN_T) # define SOAP_SOCKLEN_T socklen_t #endif /* AIX DCE threads portability: define SOAP_FUNC_R_ERR gmtime_r and localtime_r err ret val as -1 */ #ifdef _AIX32_THREADS # define SOAP_FUNC_R_ERR (-1) #elif !defined(SOAP_FUNC_R_ERR) # define SOAP_FUNC_R_ERR (NULL) #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(sk) ((sk) != SOAP_INVALID_SOCKET) #define SOAP_SHUT_WR (1) #define SOAP_SHUT_RDWR (2) #ifndef SOAP_GAI_STRERROR # define SOAP_GAI_STRERROR gai_strerror #endif #ifndef FD_SETSIZE # define FD_SETSIZE (1024) #endif #ifdef WITH_LEAN # define SOAP_CHK_EOF SOAP_EOF #else # define SOAP_CHK_EOF (soap->error ? soap->error : SOAP_EOF) #endif #ifdef __cplusplus # ifndef __STDC_FORMAT_MACROS # define __STDC_FORMAT_MACROS # endif #endif #if defined(SYMBIAN) # warning "Symbian build: removing 64 bit integer support" # define LONG64 long # define ULONG64 unsigned LONG64 # ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%ld" # endif # ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%lu" # endif #elif !defined(WIN32) || defined(CYGWIN) || defined(__GLIBC__) || defined(__GNU__) || defined(__GNUC__) # ifndef LONG64 # if defined(HAVE_INTTYPES_H) # include # define LONG64 int64_t # define ULONG64 uint64_t # if defined(PRId64) && defined(PRIu64) # ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%" PRId64 # endif # ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%" PRIu64 # endif # endif # elif defined(HAVE_SYS_INTTYPES_H) # include # define LONG64 int64_t # define ULONG64 uint64_t # if defined(PRId64) && defined(PRIu64) # ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%" PRId64 # endif # ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%" PRIu64 # endif # endif # elif defined(HAVE_STDINT_H) # include # define LONG64 int64_t # define ULONG64 uint64_t # if defined(PRId64) && defined(PRIu64) # ifndef SOAP_LONG_FORMAT # define SOAP_LONG_FORMAT "%" PRId64 # endif # ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%" PRIu64 # endif # endif # elif defined(CYGWIN) || 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 long long ints */ #endif #ifndef SOAP_ULONG_FORMAT # define SOAP_ULONG_FORMAT "%llu" /* printf format for unsigned 64 bit long long ints */ #endif #if defined(WIN32) && !defined(CYGWIN) # define soap_int32 __int32 #elif defined(SYMBIAN) # define soap_int32 long #elif defined(_AIX) || 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 # define SOAP_ECONNREFUSED WSAECONNREFUSED #else # ifdef ERANGE # define SOAP_ERANGE ERANGE # else # define SOAP_ERANGE (34) # endif # define SOAP_EINTR EINTR # define SOAP_EAGAIN EAGAIN # define SOAP_EADDRINUSE EADDRINUSE # define SOAP_ECONNREFUSED ECONNREFUSED # 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 # if !defined(WITH_LEAN) # define SOAP_BUFLEN (65536) /* buffer length for socket packets, so don't make this too small */ # else # define SOAP_BUFLEN (2048) /* lean size */ # 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 (4096) /* 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) /* 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 (256) # 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_TMPLEN # ifndef WITH_LEAN # define SOAP_TMPLEN (2048) /* maximum length of msgbuf and tmpbuf short message buffers, must be >=1024 */ # else # define SOAP_TMPLEN (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_MAXPTRS # ifndef WITH_LEAN # define SOAP_MAXPTRS (4) /* maximum depth + 1 of id-ref deserialized pointer types (int* has depth 0, int*** has depth 2) */ # else # define SOAP_MAXPTRS (2) # endif #endif #ifndef SOAP_MAXALLOCSIZE # define SOAP_MAXALLOCSIZE (0) /* max size that malloc() can handle, zero for no limit */ #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 /* Tag name of multiref elements in SOAP 1.1 encoding */ #ifndef SOAP_MULTIREFTAG # define SOAP_MULTIREFTAG "id" #endif /* href-id value base name in multiref SOAP encoding */ #ifndef SOAP_BASEREFNAME # define SOAP_BASEREFNAME "_" #endif /* Max number of EINTR interrupts to ignore while poll/select for pending activity on a socket */ /* Each EINTR ignored may increase the I/O blocking time by at most one second */ #ifndef SOAP_MAXEINTR # define SOAP_MAXEINTR (10) #endif /* SOAP_MAXKEEPALIVE: Max iterations in soap_serve() to keep server connection alive */ #ifndef SOAP_MAXKEEPALIVE # define SOAP_MAXKEEPALIVE (100) #endif /* SOAP_MAXARRAYSIZE: Trusted total max size of an inbound SOAP Array. Arrays of larger size are not pre-allocated, but deserialized on an element-by-element basis until XML validation contrains kick in. This macro only affects the efficiency of parsing SOAP arrays. */ #ifndef SOAP_MAXARRAYSIZE # define SOAP_MAXARRAYSIZE (100000) #endif /* SOAP_MAXDIMESIZE: Trusted max size of inbound DIME data. Increase if necessary to allow larger attachments, or decrease when server resources are limited. This is to deny senders to allocate more than 8 MB at the receiver without actually sending the whole message. */ #ifndef SOAP_MAXDIMESIZE # define SOAP_MAXDIMESIZE (8*1048576) /* 8 MB */ #endif /* SOAP_MAXINFLATESIZE: Trusted inflated content size. Larger content is subject to the SOAP_MINDEFLATERATIO constraint. If SOAP_MINDEFLATERATIO is 1.0, SOAP_MAXINFLATESIZE is always the max size of uncompressed content. */ #ifndef SOAP_MAXINFLATESIZE # define SOAP_MAXINFLATESIZE (1*1048576) /* 1 MB */ #endif /* SOAP_MINDEFLATERATIO: Trusted deflation ratio after SOAP_MAXINFLATESIZE is reached. Trust when compressed / deflated > SOAP_MINDEFLATERATIO Sets a ratio > 0.00096899224806 (1032:1) According to the zlib site: the limit (1032:1) comes from the fact that one length/distance pair can represent at most 258 output bytes. A length requires at least one bit and a distance requires at least one bit, so two bits in can give 258 bytes out, or eight bits in give 1032 bytes out. A dynamic block has no length restriction, so you could get arbitrarily close to the limit of 1032:1. */ #ifndef SOAP_MINDEFLATERATIO # define SOAP_MINDEFLATERATIO (1.0/1032.0) /* ratio of deflated/inflated */ #endif /* maximum XML nesting depth level allowed for inbound XML parsing, must be greater than zero (0) */ #ifndef SOAP_MAXLEVEL # define SOAP_MAXLEVEL (10000) #endif /* maximum string content length if not already constrained by XML schema validation maxLength constraints, zero or negative means unlimited string lengths are allowed unless restricted by XML schema maxLength */ #ifndef SOAP_MAXLENGTH # define SOAP_MAXLENGTH (0) #endif /* maximum number of array or container elements, must be greater than zero (0) */ #ifndef SOAP_MAXOCCURS # define SOAP_MAXOCCURS (100000) #endif #ifdef VXWORKS # ifdef WMW_RPM_IO # include "httpLib.h" # endif # ifdef __INCmathh # include # ifndef HAVE_ISNAN # define HAVE_ISNAN # endif # ifndef soap_isnan # define soap_isnan(num) isNan(num) # endif # endif # ifdef WM_SECURE_KEY_STORAGE # include # endif #endif #ifdef WIN32 # ifndef HAVE_ISNAN # define HAVE_ISNAN # endif # define soap_isnan(n) _isnan(n) # ifndef HAVE_ISINF # define HAVE_ISINF # endif # define soap_isinf(n) (!_finite(n)) #endif #ifdef SUN_OS # define HAVE_ISNAN #endif #ifdef __APPLE__ # ifndef HAVE_ISNAN # define HAVE_ISNAN # endif # ifndef HAVE_ISINF # define HAVE_ISINF # endif #endif #if !defined(HAVE_ISNAN) && (defined(_MATH_H) || defined(_MATH_INCLUDED)) # define HAVE_ISNAN #endif union soap_double_nan {struct {unsigned int n1, n2;} iv; double dv; float fv;}; extern const union soap_double_nan soap_double_nan; extern const char soap_base64o[], soap_base64i[]; #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 (soap_double_nan.fv) #endif #ifndef FLT_PINFTY # if defined(INFINITY) # define FLT_PINFTY INFINITY # elif 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 (soap_double_nan.dv) #endif #ifndef DBL_PINFTY # if defined(INFINITY) # define DBL_PINFTY INFINITY # elif 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) ((n) != (n)) # endif #endif #ifndef soap_isinf # ifdef HAVE_ISINF # define soap_isinf(n) isinf(n) # else # define soap_isinf(n) (!soap_isnan(n) && soap_isnan((n) - (n))) # endif #endif #define soap_ispinfd(n) ((n) > 0 && soap_isinf(n)) #define soap_ispinff(n) ((n) > 0 && soap_isinf(n)) #define soap_isninfd(n) ((n) < 0 && soap_isinf(n)) #define soap_isninff(n) ((n) < 0 && soap_isinf(n)) /* Safer str & mem functions */ /* The gSOAP code uses guards to ensure that these functions are well behaved and do not raise errors. Therefore, the WIN _s functions should never execute the "invalid parameter handler". */ /* use safer snprintf if possible or guard sprintf against overrun (assumes no variadic macros) */ # ifdef HAVE_SNPRINTF # if _MSC_VER >= 1400 # define SOAP_SNPRINTF(buf, len, num) void)_snprintf_s((buf), (len), _TRUNCATE # define SOAP_SNPRINTF_SAFE(buf, len) void)_snprintf_s((buf), (len), _TRUNCATE # else # define SOAP_SNPRINTF(buf, len, num) void)snprintf((buf), (len) # define SOAP_SNPRINTF_SAFE(buf, len) void)snprintf((buf), (len) # endif # else # define SOAP_SNPRINTF(buf, len, num) (len) <= (num)) ? (void)((buf)[0] = '\0') : (void)sprintf((buf) # define SOAP_SNPRINTF_SAFE(buf, len) void)sprintf((buf) # endif /* copy string (truncating the result, strings must not be NULL) */ #if _MSC_VER >= 1400 # define soap_strcpy(buf, len, src) (void)strncpy_s((buf), (len), (src), _TRUNCATE) #elif defined(HAVE_STRLCPY) # define soap_strcpy(buf, len, src) (void)strlcpy((buf), (src), (len)) #else # define soap_strcpy(buf, len, src) (void)(strncpy((buf), (src), (len)), (buf)[(len) - 1] = '\0') #endif /* concat string (truncating the result, strings must not be NULL) */ #if _MSC_VER >= 1400 # define soap_strcat(buf, len, src) (void)strncat_s((buf), (len), (src), _TRUNCATE) #elif defined(HAVE_STRLCAT) # define soap_strcat(buf, len, src) (void)strlcat((buf), (src), (len)) #else SOAP_FMAC1 void SOAP_FMAC2 soap_strcat(char *buf, size_t len, const char *src); #endif /* copy string up to num chars (sets string to empty on overrun and returns nonzero, zero if OK) */ #if _MSC_VER >= 1400 # define soap_strncpy(buf, len, src, num) ((buf) == NULL || ((size_t)(len) > (size_t)(num) ? strncpy_s((buf), (len), (src), (num)) : ((buf)[0] = '\0', 1))) #else # define soap_strncpy(buf, len, src, num) ((buf) == NULL || ((size_t)(len) > (size_t)(num) ? (strncpy((buf), (src), (num)), (buf)[(size_t)(num)] = '\0') : ((buf)[0] = '\0', 1))) #endif /* concat string up to n chars (leaves destination intact on overrun and returns nonzero, zero if OK) */ #if _MSC_VER >= 1400 # define soap_strncat(buf, len, src, num) ((buf) == NULL || ((size_t)(len) > strlen((buf)) + (size_t)(num) ? strncat_s((buf), (len), (src), (num)) : 1)) #else SOAP_FMAC1 int SOAP_FMAC2 soap_strncat(char *buf, size_t len, const char *src, size_t num); #endif /* copy memory (returns SOAP_ERANGE on overrun, zero if OK, pointers must not be NULL) */ #if _MSC_VER >= 1400 # define soap_memcpy(buf, len, src, num) ((size_t)(len) >= (size_t)(num) ? memcpy_s((buf), (len), (src), (num)) : SOAP_ERANGE) #else # define soap_memcpy(buf, len, src, num) ((size_t)(len) >= (size_t)(num) ? !memcpy((buf), (src), (num)) : SOAP_ERANGE) #endif /* move memory (returns SOAP_ERANGE on overrun, zero if OK, pointers must not be NULL) */ #if _MSC_VER >= 1400 # define soap_memmove(buf, len, src, num) ((size_t)(len) >= (size_t)(num) ? memmove_s((buf), (len), (src), (num)) : SOAP_ERANGE) #else # define soap_memmove(buf, len, src, num) ((size_t)(len) >= (size_t)(num) ? !memmove((buf), (src), (num)) : SOAP_ERANGE) #endif /* gSOAP status and error codes */ typedef soap_int32 soap_status; #define SOAP_EOF 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 /* deprecated */ #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_PATCH_METHOD 17 #define SOAP_DEL_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 /* unused */ #define SOAP_REQUIRED 42 #define SOAP_PROHIBITED 43 #define SOAP_OCCURS 44 #define SOAP_LENGTH 45 #define SOAP_PATTERN 46 #define SOAP_FD_EXCEEDED 47 #define SOAP_UTF_ERROR 48 #define SOAP_NTLM_ERROR 49 #define SOAP_LEVEL 50 #define SOAP_FIXED 51 #define SOAP_EMPTY 52 #define SOAP_END_TAG 53 #define SOAP_ERR 99 #define soap_xml_error_check(e) \ ((e) == SOAP_TAG_MISMATCH || \ (e) == SOAP_NO_TAG || \ (e) == SOAP_IOB || \ (e) == SOAP_SYNTAX_ERROR || \ (e) == SOAP_NAMESPACE || \ (e) == SOAP_TYPE || \ (e) == SOAP_DUPLICATE_ID || \ (e) == SOAP_MISSING_ID || \ (e) == SOAP_REQUIRED || \ (e) == SOAP_PROHIBITED || \ (e) == SOAP_OCCURS || \ (e) == SOAP_LENGTH || \ (e) == SOAP_LEVEL || \ (e) == SOAP_PATTERN || \ (e) == SOAP_NULL || \ (e) == SOAP_HREF || \ (e) == SOAP_FIXED || \ (e) == SOAP_EMPTY || \ (e) == SOAP_END_TAG || \ (e) == SOAP_UTF_ERROR) #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 || \ (e) == SOAP_DATAENCODINGUNKNOWN) #define soap_http_error_check(e) \ ((e) == SOAP_HTTP_ERROR || \ (e) == SOAP_NO_DATA || \ ((e) >= SOAP_GET_METHOD && (e) <= SOAP_HTTP_METHOD) || \ ((e) >= 100 && (e) < 600)) #define soap_dime_error_check(e) \ ((e) == SOAP_DIME_ERROR || \ (e) == SOAP_DIME_HREF || \ (e) == SOAP_DIME_MISMATCH || \ (e) == SOAP_DIME_END) #define soap_mime_error_check(e) \ ((e) == SOAP_MIME_ERROR || \ (e) == SOAP_MIME_HREF || \ (e) == SOAP_MIME_END) #define soap_tcp_error_check(e) \ ((e) == SOAP_EOF || \ (e) == SOAP_TCP_ERROR) #define soap_udp_error_check(e) \ ((e) == SOAP_EOF || \ (e) == SOAP_UDP_ERROR) #define soap_ssl_error_check(e) ((e) == SOAP_SSL_ERROR) #define soap_zlib_error_check(e) ((e) == SOAP_ZLIB_ERROR) /* gSOAP HTTP response status codes 100 to 599 are reserved */ /* Codes 600 to 999 are user definable */ /* Exceptional gSOAP HTTP server response status codes >= 1000 */ #define SOAP_STOP 1000 /* No HTTP response should follow after SOAP_STOP is issued */ #define SOAP_FORM 1001 /* Request (form) data is present, no HTTP response should follow */ #define SOAP_HTML 1002 /* Custom HTML response */ #define SOAP_FILE 1200 /* Custom file-based response with soap::http_content and optional http status */ /* gSOAP HTTP method codes (client) */ typedef int soap_http_command; #define SOAP_POST 2000 /* POST request */ #define SOAP_POST_FILE 2001 /* Custom file-based POST request */ #define SOAP_GET 2002 /* GET request */ #define SOAP_PUT 2003 /* PUT request */ #define SOAP_PATCH 2004 /* PATCH request */ #define SOAP_DEL 2005 /* DELETE request */ #define SOAP_HEAD 2006 /* HEAD request */ #define SOAP_OPTIONS 2007 /* OPTIONS request */ #define SOAP_CONNECT 2008 /* CONNECT request */ /* 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 /* out: flush output immediately, no buffering */ #define SOAP_IO_BUFFER 0x00000001 /* out: buffer output in packets of size SOAP_BUFLEN */ #define SOAP_IO_STORE 0x00000002 /* out: store entire output to determine length for transport */ #define SOAP_IO_CHUNK 0x00000003 /* out: use HTTP chunked transfer AND buffer packets */ #define SOAP_IO_UDP 0x00000004 /* in/out: enable UDP instead of TCP */ #define SOAP_IO_LENGTH 0x00000008 /* out: calc message length (internal) */ #define SOAP_IO_KEEPALIVE 0x00000010 /* out: keep connection alive */ #define SOAP_ENC 0x00000FFF /* IO and ENC mask */ #define SOAP_ENC_LATIN 0x00000020 /* in: accept iso-8859-1 */ #define SOAP_ENC_PLAIN 0x00000040 /* out: plain (XML or other) body, no HTTP header */ #define SOAP_ENC_XML 0x00000040 /* deprecated, alias for SOAP_ENC_PLAIN */ #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_XML_STRICT 0x00001000 /* in: strict validation */ #define SOAP_XML_INDENT 0x00002000 /* out: emit indented XML */ #define SOAP_XML_IGNORENS 0x00004000 /* in: ignore namespaces */ #define SOAP_XML_DEFAULTNS 0x00008000 /* out: emit xmlns="..." */ #define SOAP_XML_CANONICAL 0x00010000 /* out: exc-C14N exclusive canonical XML */ #define SOAP_XML_TREE 0x00020000 /* in/out: XML tree (no id/ref) */ #define SOAP_XML_NIL 0x00040000 /* out: all NULLs as xsi:nil */ #define SOAP_XML_NOTYPE 0x00080000 /* out: do not add xsi:type */ #define SOAP_DOM_TREE 0x00100000 /* see DOM manual */ #define SOAP_DOM_NODE 0x00200000 #define SOAP_DOM_ASIS 0x00400000 #define SOAP_XML_CANONICAL_NA 0x00800000 /* out: (exc) C14N not QName aware */ #define SOAP_C_NOIOB 0x01000000 /* don't fault on array index out of bounds (just ignore) */ #define SOAP_C_UTFSTRING 0x02000000 /* (de)serialize strings with UTF8 content */ #define SOAP_C_MBSTRING 0x04000000 /* (de)serialize strings with multi-byte content */ #define SOAP_C_NILSTRING 0x08000000 /* serialize empty strings as nil (omitted) */ #define SOAP_XML_DOM 0x10000000 /* enable internal DOM */ #define SOAP_XML_GRAPH 0x20000000 /* force id-ref XML graph */ #define SOAP_MIME_POSTCHECK 0x40000000 /* MIME flag (internal) */ #define SOAP_SEC_WSUID 0x80000000 /* Add Body wsu:Id flag (internal) */ /* WITH_XMLNS backward compatibility: always use XML default namespaces */ #ifdef WITH_XMLNS # define SOAP_IO_DEFAULT (SOAP_IO_FLUSH | SOAP_XML_DEFAULTNS) #else # define SOAP_IO_DEFAULT SOAP_IO_FLUSH #endif /* SSL client/server authentication settings */ #define SOAP_SSL_NO_AUTHENTICATION (0x0000) /* no authentication */ #define SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION (0x0001) /* client requires server to authenticate */ #define SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION (0x0002) /* server requires client to authenticate */ #define SOAP_SSL_SKIP_HOST_CHECK (0x0004) /* client skips common name check against host name */ #define SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE (0x0008) /* allow self-signed and expired certificates and those w/o CRL */ #define SOAP_SSL_NO_DEFAULT_CA_PATH (0x0010) /* don't use SSL_CTX_set_default_verify_paths */ #define SOAP_SSL_RSA (0x0020) /* use RSA */ #define SOAP_SSLv3 (0x0080) /* enable SSL v3 */ #define SOAP_TLSv1_0 (0x0100) /* enable TLS v1.0 */ #define SOAP_TLSv1_1 (0x0200) /* enable TLS v1.1 */ #define SOAP_TLSv1_2 (0x0400) /* enable TLS v1.2 */ #define SOAP_TLSv1_3 (0x0800) /* enable TLS v1.3 */ #define SOAP_TLSv1 (SOAP_TLSv1_0 | SOAP_TLSv1_1 | SOAP_TLSv1_2 | SOAP_TLSv1_3) #define SOAP_SSLv3_TLSv1 (SOAP_SSLv3 | SOAP_TLSv1) #define SOAP_SSL_CLIENT (0x8000) /* client context flag for internal use */ #define SOAP_SSL_DEFAULT SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION typedef unsigned short soap_ssl_flags; /* 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)) /* parts */ #define SOAP_END 0 #define SOAP_BEGIN_SEND 1 #define SOAP_BEGIN_RECV 2 #define SOAP_IN_ENVELOPE 3 #define SOAP_IN_HEADER 4 #define SOAP_END_HEADER 5 #define SOAP_NO_BODY 6 #define SOAP_IN_BODY 7 #define SOAP_END_BODY 8 #define SOAP_END_ENVELOPE 9 /* events */ #define SOAP_SEC_BEGIN 1 #define SOAP_SEC_SIGN 2 #define SOAP_SEC_DECRYPT 3 /* DEBUG macros */ #ifdef DEBUG_STAMP # ifndef DEBUG # define DEBUG # endif #endif #ifdef DEBUG # ifndef SOAP_DEBUG # define SOAP_DEBUG # endif # ifndef SOAP_MEM_DEBUG # define SOAP_MEM_DEBUG # 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__, (void*)(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((void*)(ptr)) #endif #ifndef SOAP_MALLOC_UNMANAGED /* use libc malloc to alloc soap context with soap_new() */ # define SOAP_MALLOC_UNMANAGED(size) malloc((size)) #endif #ifndef SOAP_FREE_UNMANAGED /* use libc free to free soap context with soap_free() */ # define SOAP_FREE_UNMANAGED(ptr) free((void*)(ptr)) #endif #ifndef SOAP_NOTHROW # if defined(__GNUC__) && (__GNUC__ <= 2) # define SOAP_NOTHROW # elif defined(WITH_LEAN) || defined(WITH_COMPAT) # define SOAP_NOTHROW # else # define SOAP_NOTHROW (std::nothrow) # endif #endif #if defined(__BORLANDC__) && !defined(__clang__) /* Embarcadero Classic compiler special case */ # ifndef SOAP_NEW # define SOAP_NEW(soap, type) new SOAP_NOTHROW (type) # endif # ifndef SOAP_NEW_ARRAY # define SOAP_NEW_ARRAY(soap, type, n) new SOAP_NOTHROW (type[n]) # endif # ifndef SOAP_PLACEMENT_NEW # define SOAP_PLACEMENT_NEW(soap, buf, type) new (buf) (type) # endif #elif (defined(__GNUC__) && (__GNUC__ <= 2)) || defined(__clang__) || defined(_AIX) || defined(AIX) /* old form w/o parenthesis, soap context may be NULL */ # ifndef SOAP_NEW # define SOAP_NEW(soap, type) new SOAP_NOTHROW type # endif # ifndef SOAP_NEW_ARRAY # define SOAP_NEW_ARRAY(soap, type, n) new SOAP_NOTHROW type[n] # endif # ifndef SOAP_PLACEMENT_NEW # define SOAP_PLACEMENT_NEW(soap, buf, type) new (buf) type # endif #else /* new form with parenthesis for (type) but not type[n], soap context may be NULL */ # ifndef SOAP_NEW # define SOAP_NEW(soap, type) new SOAP_NOTHROW (type) # endif # ifndef SOAP_NEW_ARRAY # define SOAP_NEW_ARRAY(soap, type, n) new SOAP_NOTHROW type[n] # endif # ifndef SOAP_PLACEMENT_NEW # define SOAP_PLACEMENT_NEW(soap, buf, type) new (buf) (type) # endif #endif #ifndef SOAP_DELETE /* use C++ delete operator, soap context may be NULL */ # define SOAP_DELETE(soap, obj, type) delete obj #endif #ifndef SOAP_DELETE_ARRAY /* use C++ delete[] operator, soap context may be NULL */ # define SOAP_DELETE_ARRAY(soap, obj, type) delete[] obj #endif #ifndef SOAP_NEW_UNMANAGED /* use C++ unmanaged new operator for soap_new() and soap::copy() */ # define SOAP_NEW_UNMANAGED(soap) new SOAP_NOTHROW soap #endif #ifndef SOAP_DELETE_UNMANAGED /* use C++ unmanaged delete operator for soap_free() */ # define SOAP_DELETE_UNMANAGED(soap) delete soap #endif #ifdef SOAP_DEBUG # ifndef SOAP_MESSAGE # define SOAP_MESSAGE fprintf # endif # ifndef DBGLOG # ifdef DEBUG_STAMP # ifdef WIN32 # 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];\ SYSTEMTIME _localTime;\ ::GetLocalTime(&_localTime); \ fprintf(fdebug, "%02d%02d%02d %02d:%02d:%02d.%03d|", (int)_localTime.wYear%100, (int)_localTime.wMonth, (int)_localTime.wDay, (int)_localTime.wHour, (int)_localTime.wMinute, (int)_localTime.wSecond, (int)_localTime.wMilliseconds);\ CMD;\ fflush(fdebug);\ }\ }\ } # else # 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];\ struct timeval _tv;\ struct tm _tm;\ gettimeofday(&_tv, NULL);\ localtime_r(&_tv.tv_sec, &_tm);\ fprintf(fdebug, "%02d%02d%02d %02d:%02d:%02d.%06ld|", (int)_tm.tm_year%100, (int)_tm.tm_mon+1, (int)_tm.tm_mday, (int)_tm.tm_hour, (int)_tm.tm_min, (int)_tm.tm_sec, (long)_tv.tv_usec);\ CMD;\ fflush(fdebug);\ }\ }\ } # endif # else # 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 # 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((void*)(MSG), 1, (size_t)(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))) # define DBGFUN4(FNAME, FMT1, ARG1, FMT2, ARG2, FMT3, ARG3, FMT4, ARG4) DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%s(%d): %s(" FMT1 ", " FMT2 ", " FMT3 ", " FMT4 ")\n", __FILE__, __LINE__, FNAME, (ARG1), (ARG2), (ARG3), (ARG4))) # 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 DBGFUN4(FNAME, FMT1, ARG1, FMT2, ARG2, FMT3, ARG3, FMT4, ARG4) # 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; /* forward declaration */ struct SOAP_CMAC soap; /* namespace table row */ struct SOAP_CMAC 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 */ const 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 id[0...] below this struct */ }; /* block header, the data flows into the allocated region below this struct */ struct soap_bhead { struct soap_bhead *next; size_t size; }; /* block stack for nested block allocations */ struct soap_blist { struct soap_blist *next; struct soap_bhead *head; size_t size; size_t item; }; /* pointer serialization management */ struct soap_plist { struct soap_plist *next; const void *ptr; void *dup; const void *array; /* array pointer */ int size; /* array size */ int type; int id; char mark1; /* 0=single-ref, 1=embedded-multi-ref (SOAP1.1), 2=multi-ref, 3=attachment */ 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; /* array size */ int (*fdelete)(struct soap*, struct soap_clist*); }; /* attributes */ struct soap_attribute { struct soap_attribute *next; short flag; /* soap_set_attr: 1 = normal, 2 = utf content */ char *value; size_t size; const char *ns; short visible; char name[1]; /* the actual name string flows into the allocated region below this struct */ }; #if !defined(WITH_LEAN) || defined(WITH_COOKIES) struct soap_cookie { struct soap_cookie *next; char *name; char *value; char *domain; char *path; ULONG64 expire; /* client-side: local time to expire (value cast to time_t) */ 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 SOAP_FMAC1 struct soap_multipart* SOAP_FMAC2 soap_next_multipart(struct soap_multipart*); #ifdef __cplusplus 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; } struct soap_multipart *operator->() const { return content; } soap_multipart_iterator& operator++() { content = soap_next_multipart(content); return *this; } soap_multipart_iterator operator++(int) { soap_multipart_iterator iter(*this); content = soap_next_multipart(content); return iter; } 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; const 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 /* dom.c[pp] functions (optional, compile and link dom.c[pp] */ struct SOAP_CMAC soap_dom_element; struct SOAP_CMAC soap_dom_attribute; /* soap_dom_element construction */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_new(struct soap *soap, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_new_w(struct soap *soap, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_set(struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_set_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att(struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt(struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_nth_elt(struct soap_dom_element *elt, const char *ns, const char *tag, size_t n); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_nth_elt_w(struct soap_dom_element *elt, const char *ns, const wchar_t *tag, size_t n); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_nth(struct soap_dom_element *elt, size_t n); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_att(struct soap_dom_element *elt, const struct soap_dom_attribute *node); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_elt(struct soap_dom_element *elt, const struct soap_dom_element *node); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_atts(struct soap_dom_element *elt, const struct soap_dom_attribute *atts); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_add_elts(struct soap_dom_element *elt, const struct soap_dom_element *elts); /* soap_dom_element assignment */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_bool(struct soap_dom_element *elt, LONG64 b); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_int(struct soap_dom_element *elt, LONG64 n); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_double(struct soap_dom_element *elt, double x); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_text(struct soap_dom_element *elt, const char *text); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_text_w(struct soap_dom_element *elt, const wchar_t *text); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_node(struct soap_dom_element *elt, const void *node, int type); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_copy(struct soap_dom_element *elt, const struct soap_dom_element *node); /* soap_dom_element properties */ SOAP_FMAC1 int SOAP_FMAC2 soap_elt_match(const struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_match_w(const struct soap_dom_element *elt, const char *ns, const wchar_t *patt); SOAP_FMAC1 const char * SOAP_FMAC2 soap_elt_get_ns(const struct soap_dom_element *elt); SOAP_FMAC1 const char * SOAP_FMAC2 soap_elt_get_tag(const struct soap_dom_element *elt); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_is_true(const struct soap_dom_element *elt); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_is_false(const struct soap_dom_element *elt); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_get_int(const struct soap_dom_element *elt); SOAP_FMAC1 long SOAP_FMAC2 soap_elt_get_long(const struct soap_dom_element *elt); SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_elt_get_LONG64(const struct soap_dom_element *elt); SOAP_FMAC1 double SOAP_FMAC2 soap_elt_get_double(const struct soap_dom_element *elt); SOAP_FMAC1 const char * SOAP_FMAC2 soap_elt_get_text(const struct soap_dom_element *elt); SOAP_FMAC1 const void * SOAP_FMAC2 soap_elt_get_node(const struct soap_dom_element *elt, int type); SOAP_FMAC1 int SOAP_FMAC2 soap_elt_get_type(const struct soap_dom_element *elt, const void **node); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_parent(const struct soap_dom_element *elt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_depth(const struct soap_dom_element *elt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_index(const struct soap_dom_element *elt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_len(const struct soap_dom_element *elt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_nth(const struct soap_dom_element *elt); /* soap_dom_attribute construction */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_new(struct soap *soap, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_new_w(struct soap *soap, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_set(struct soap_dom_attribute *att, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_set_w(struct soap_dom_attribute *att, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_add(struct soap_dom_attribute *att, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_add_w(struct soap_dom_attribute *att, const char *ns, const wchar_t *tag); /* soap_dom_attribute assignment */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_bool(struct soap_dom_attribute *att, LONG64 b); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_int(struct soap_dom_attribute *att, LONG64 n); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_double(struct soap_dom_attribute *att, double x); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_text(struct soap_dom_attribute *att, const char *text); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_text_w(struct soap_dom_attribute *att, const wchar_t *text); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_copy(struct soap_dom_attribute *att, const struct soap_dom_attribute *node); /* soap_dom_attribute properties */ SOAP_FMAC1 int SOAP_FMAC2 soap_att_match(const struct soap_dom_attribute *att, const char *ns, const char *patt); SOAP_FMAC1 int SOAP_FMAC2 soap_att_match_w(const struct soap_dom_attribute *att, const char *ns, const wchar_t *patt); SOAP_FMAC1 const char * SOAP_FMAC2 soap_att_get_ns(const struct soap_dom_attribute *att); SOAP_FMAC1 const char * SOAP_FMAC2 soap_att_get_tag(const struct soap_dom_attribute *att); SOAP_FMAC1 int SOAP_FMAC2 soap_att_is_true(const struct soap_dom_attribute *att); SOAP_FMAC1 int SOAP_FMAC2 soap_att_is_false(const struct soap_dom_attribute *att); SOAP_FMAC1 int SOAP_FMAC2 soap_att_get_int(const struct soap_dom_attribute *att); SOAP_FMAC1 long SOAP_FMAC2 soap_att_get_long(const struct soap_dom_attribute *att); SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_att_get_LONG64(const struct soap_dom_attribute *att); SOAP_FMAC1 double SOAP_FMAC2 soap_att_get_double(const struct soap_dom_attribute *att); SOAP_FMAC1 const char * SOAP_FMAC2 soap_att_get_text(const struct soap_dom_attribute *att); /* DOM local traversal */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_first(struct soap_dom_element *elt); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_next(const struct soap_dom_attribute *att); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_first(struct soap_dom_element *elt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_next(const struct soap_dom_element *elt); /* DOM local retrieval */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_get(const struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_get_w(const struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get(const struct soap_dom_element *elt, const char *ns, const char *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get_w(const struct soap_dom_element *elt, const char *ns, const wchar_t *tag); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get_next(const struct soap_dom_element *elt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_get_nth(struct soap_dom_element *elt, size_t n); /* DOM local search */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_find(struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_att_find_next(const struct soap_dom_attribute *att, const char *ns, const char *patt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find(struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find_next(const struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find_type(struct soap_dom_element *elt, const char *ns, const char *patt, int type); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_elt_find_next_type(const struct soap_dom_element *elt, const char *ns, const char *patt, int type); /* DOM size of local search results */ SOAP_FMAC1 size_t SOAP_FMAC2 soap_att_size(struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_size(struct soap_dom_element *elt, const char *ns, const char *patt); SOAP_FMAC1 size_t SOAP_FMAC2 soap_elt_size_type(struct soap_dom_element *elt, const char *ns, const char *patt, int type); /* DOM deep traversal */ SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_dom_next_attribute(const struct soap_dom_attribute *att); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_next_element(const struct soap_dom_element *elt, const struct soap_dom_element *end); /* DOM deep search */ SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_find(struct soap_dom_element *begin, const struct soap_dom_element *end, const char *ns, const char *patt, int type); SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dom_find_next(const struct soap_dom_element *elt, const struct soap_dom_element *end, const char *ns, const char *patt, int type); #endif #if defined(__cplusplus) } /* extern "C" */ #endif #ifndef WITH_LEANER #ifdef __cplusplus class SOAP_CMAC soap_dom_attribute_iterator { public: struct soap_dom_attribute *iter; 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; struct soap_dom_attribute *operator->() const; soap_dom_attribute_iterator& operator++(); soap_dom_attribute_iterator operator++(int); soap_dom_attribute_iterator(); soap_dom_attribute_iterator(struct soap_dom_attribute*); ~soap_dom_attribute_iterator(); }; #endif #endif #ifndef WITH_LEANER struct SOAP_CMAC soap_dom_attribute { struct soap_dom_attribute *next; const char *nstr; const char *name; const char *text; struct soap *soap; #ifdef __cplusplus typedef soap_dom_attribute_iterator iterator; soap_dom_attribute(struct soap *soap = NULL); soap_dom_attribute(const soap_dom_attribute& att); soap_dom_attribute(struct soap *soap, const char *tag); soap_dom_attribute(struct soap *soap, const wchar_t *tag); soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const char *text); soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const wchar_t *text); soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const char *text); soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const wchar_t *text); soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const std::string& text); soap_dom_attribute(struct soap *soap, const char *ns, const char *tag, const std::wstring& text); soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const std::string& text); soap_dom_attribute(struct soap *soap, const char *ns, const wchar_t *tag, const std::wstring& text); ~soap_dom_attribute(); soap_dom_attribute& set(const char *ns, const char *tag) { return *soap_att_set(this, ns, tag); } soap_dom_attribute& set(const char *ns, const wchar_t *tag) { return *soap_att_set_w(this, ns, tag); } soap_dom_attribute& set(bool b) { return *soap_att_bool(this, b); } soap_dom_attribute& set(int n) { return *soap_att_int(this, n); } soap_dom_attribute& set(LONG64 n) { return *soap_att_int(this, n); } soap_dom_attribute& set(float x) { return *soap_att_double(this, x); } soap_dom_attribute& set(double x) { return *soap_att_double(this, x); } soap_dom_attribute& set(const char *text) { return *soap_att_text(this, text); } soap_dom_attribute& set(const wchar_t *text) { return *soap_att_text_w(this, text); } #ifndef WITH_COMPAT soap_dom_attribute& set(const std::string& text) { return *soap_att_text(this, text.c_str()); } soap_dom_attribute& set(const std::wstring& text) { return *soap_att_text_w(this, text.c_str()); } #endif soap_dom_attribute& operator=(bool b) { return *soap_att_bool(this, b); } soap_dom_attribute& operator=(int n) { return *soap_att_int(this, n); } soap_dom_attribute& operator=(LONG64 n) { return *soap_att_int(this, n); } soap_dom_attribute& operator=(float x) { return *soap_att_double(this, x); } soap_dom_attribute& operator=(double x) { return *soap_att_double(this, x); } soap_dom_attribute& operator=(const char *text) { return *soap_att_text(this, text); } soap_dom_attribute& operator=(const wchar_t *text) { return *soap_att_text_w(this, text); } #ifndef WITH_COMPAT soap_dom_attribute& operator=(const std::string& text) { return *soap_att_text(this, text.c_str()); } soap_dom_attribute& operator=(const std::wstring& text) { return *soap_att_text_w(this, text.c_str()); } #endif soap_dom_attribute& operator=(const soap_dom_attribute& att) { return *soap_att_copy(this, &att); } soap_dom_attribute& att(const char *tag) { return *soap_att_add(this, NULL, tag); } soap_dom_attribute& att(const wchar_t *tag) { return *soap_att_add_w(this, NULL, tag); } soap_dom_attribute& att(const char *ns, const char *tag) { return *soap_att_add(this, ns, tag); } soap_dom_attribute& att(const char *ns, const wchar_t *tag) { return *soap_att_add_w(this, ns, tag); } bool match(const char *patt) const { return soap_att_match(this, NULL, patt) != 0; } bool match(const wchar_t *patt) const { return soap_att_match_w(this, NULL, patt) != 0; } bool match(const char *ns, const char *patt) const { return soap_att_match(this, ns, patt) != 0; } bool match(const char *ns, const wchar_t *patt) const { return soap_att_match_w(this, ns, patt) != 0; } const char *ns() const { return this->nstr; } const char *tag() const { return this->name; } bool is_true() const { return soap_att_is_true(this) != 0; } bool is_false() const { return soap_att_is_false(this) != 0; } LONG64 get_int() const { return soap_att_get_LONG64(this); } double get_double() const { return soap_att_get_double(this); } const char *get_text() const { return this->text; } operator bool() const { return soap_att_is_true(this) != 0; } operator int() const { return soap_att_get_int(this); } operator LONG64() const { return soap_att_get_LONG64(this); } operator double() const { return soap_att_get_double(this); } operator const char*() const { return this->text; } soap_dom_attribute_iterator att_begin() { return soap_dom_attribute_iterator(this); } soap_dom_attribute_iterator att_end() { return soap_dom_attribute_iterator(NULL); } soap_dom_attribute_iterator att_find(const char *patt) { return att_find(NULL, patt); } soap_dom_attribute_iterator att_find(const wchar_t *patt) { return att_find(NULL, patt); } soap_dom_attribute_iterator att_find(const char *ns, const char *patt); soap_dom_attribute_iterator att_find(const char *ns, const wchar_t *patt); void unlink(); #endif }; #endif #ifndef WITH_LEANER #ifdef __cplusplus class SOAP_CMAC soap_dom_element_iterator { public: struct soap_dom_element *iter; struct soap_dom_element *stop; const char *nstr; const char *name; int type; bool deep; bool operator==(const soap_dom_element_iterator&) const; bool operator!=(const soap_dom_element_iterator&) const; struct soap_dom_element& operator*() const; struct soap_dom_element *operator->() const; soap_dom_element_iterator& operator++(); soap_dom_element_iterator operator++(int); soap_dom_element_iterator(); soap_dom_element_iterator(struct soap_dom_element*); ~soap_dom_element_iterator(); }; #endif #endif #ifndef WITH_LEANER struct SOAP_CMAC soap_dom_element { struct soap_dom_element *next; struct soap_dom_element *prnt; struct soap_dom_element *elts; struct soap_dom_attribute *atts; const char *nstr; const char *name; const char *lead; const char *text; const char *code; const char *tail; const void *node; int type; struct soap *soap; #ifdef __cplusplus typedef soap_dom_element_iterator iterator; soap_dom_element(struct soap *soap = NULL); soap_dom_element(const soap_dom_element& elt); soap_dom_element(struct soap *soap, const char *tag); soap_dom_element(struct soap *soap, const wchar_t *tag); soap_dom_element(struct soap *soap, const char *ns, const char *tag); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag); soap_dom_element(struct soap *soap, const char *ns, const char *tag, const char *text); soap_dom_element(struct soap *soap, const char *ns, const char *tag, const wchar_t *text); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const char *text); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const wchar_t *text); #ifndef WITH_COMPAT soap_dom_element(struct soap *soap, const char *ns, const char *tag, const std::string& text); soap_dom_element(struct soap *soap, const char *ns, const char *tag, const std::wstring& text); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const std::string& text); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const std::wstring& text); #endif soap_dom_element(struct soap *soap, const char *ns, const char *tag, const void *node, int type); soap_dom_element(struct soap *soap, const char *ns, const wchar_t *tag, const void *node, int type); ~soap_dom_element(); soap_dom_element& set(const char *ns, const char *tag) { return *soap_elt_set(this, ns, tag); } soap_dom_element& set(const char *ns, const wchar_t *tag) { return *soap_elt_set_w(this, ns, tag); } soap_dom_element& set(bool b) { return *soap_elt_bool(this, b); } soap_dom_element& set(int n) { return *soap_elt_int(this, n); } soap_dom_element& set(LONG64 n) { return *soap_elt_int(this, n); } soap_dom_element& set(float x) { return *soap_elt_double(this, x); } soap_dom_element& set(double x) { return *soap_elt_double(this, x); } soap_dom_element& set(const char *text) { return *soap_elt_text(this, text); } soap_dom_element& set(const wchar_t *text) { return *soap_elt_text_w(this, text); } #ifndef WITH_COMPAT soap_dom_element& set(const std::string& text) { return *soap_elt_text(this, text.c_str()); } soap_dom_element& set(const std::wstring& text) { return *soap_elt_text_w(this, text.c_str()); } #endif soap_dom_element& set(const void *node, int type) { return *soap_elt_node(this, node, type); } soap_dom_element& add(soap_dom_element& elt) { return *soap_add_elt(this, &elt); } soap_dom_element& add(soap_dom_element *elt) { return *soap_add_elt(this, elt); } soap_dom_element& add(soap_dom_attribute& att) { return *soap_add_att(this, &att); } soap_dom_element& add(soap_dom_attribute *att) { return *soap_add_att(this, att); } soap_dom_element& adds(soap_dom_element& elts) { return *soap_add_elts(this, &elts); } soap_dom_element& adds(soap_dom_element *elts) { return *soap_add_elts(this, elts); } soap_dom_element& adds(soap_dom_attribute& atts) { return *soap_add_atts(this, &atts); } soap_dom_element& adds(soap_dom_attribute *atts) { return *soap_add_atts(this, atts); } soap_dom_element& operator=(bool b) { return *soap_elt_bool(this, b); } soap_dom_element& operator=(int n) { return *soap_elt_int(this, n); } soap_dom_element& operator=(LONG64 n) { return *soap_elt_int(this, n); } soap_dom_element& operator=(float x) { return *soap_elt_double(this, x); } soap_dom_element& operator=(double x) { return *soap_elt_double(this, x); } soap_dom_element& operator=(const char *text) { return *soap_elt_text(this, text); } soap_dom_element& operator=(const wchar_t *text) { return *soap_elt_text_w(this, text); } #ifndef WITH_COMPAT soap_dom_element& operator=(const std::string& text) { return *soap_elt_text(this, text.c_str()); } soap_dom_element& operator=(const std::wstring& text) { return *soap_elt_text_w(this, text.c_str()); } #endif soap_dom_element& operator=(const soap_dom_element& elt) { return *soap_elt_copy(this, &elt); } template soap_dom_element& operator=(const T& node) { return this->set(&node, node.soap_type()); } template soap_dom_element& operator=(const T *node) { return this->set(node, node->soap_type()); } template soap_dom_element& operator=(T *node) { return this->set(node, node->soap_type()); } soap_dom_attribute& att(const char *tag) { return *soap_att(this, NULL, tag); } soap_dom_attribute& att(const wchar_t *tag) { return *soap_att_w(this, NULL, tag); } soap_dom_attribute& att(const char *ns, const char *tag) { return *soap_att(this, ns, tag); } soap_dom_attribute& att(const char *ns, const wchar_t *tag) { return *soap_att_w(this, ns, tag); } soap_dom_element& elt() { return *soap_elt(this, NULL, NULL); } soap_dom_element& elt(const char *tag) { return *soap_elt(this, NULL, tag); } soap_dom_element& elt(const wchar_t *tag) { return *soap_elt_w(this, NULL, tag); } soap_dom_element& elt(const char *ns, const char *tag) { return *soap_elt(this, ns, tag); } soap_dom_element& elt(const char *ns, const wchar_t *tag) { return *soap_elt_w(this, ns, tag); } soap_dom_element& operator[](const char *tag) { return *soap_elt(this, NULL, tag); } soap_dom_element& operator[](const wchar_t *tag) { return *soap_elt_w(this, NULL, tag); } soap_dom_element& operator[](size_t n) { return *soap_nth(this, n); } soap_dom_attribute *att_get(const char *tag) const { return soap_att_get(this, NULL, tag); } soap_dom_attribute *att_get(const wchar_t *tag) const { return soap_att_get_w(this, NULL, tag); } soap_dom_attribute *att_get(const char *ns, const char *tag) const { return soap_att_get(this, ns, tag); } soap_dom_attribute *att_get(const char *ns, const wchar_t *tag) const { return soap_att_get_w(this, ns, tag); } soap_dom_element *elt_get() const { return soap_elt_get(this, NULL, NULL); } soap_dom_element *elt_get(const char *tag) const { return soap_elt_get(this, NULL, tag); } soap_dom_element *elt_get(const wchar_t *tag) const { return soap_elt_get_w(this, NULL, tag); } soap_dom_element *elt_get(const char *ns, const char *tag) const { return soap_elt_get(this, ns, tag); } soap_dom_element *elt_get(const char *ns, const wchar_t *tag) const { return soap_elt_get_w(this, ns, tag); } soap_dom_element *get_next() const { return soap_elt_get_next(this); } soap_dom_element *get_nth(size_t n) { return soap_elt_get_nth(this, n); } bool match(const char *patt) const { return soap_elt_match(this, NULL, patt) != 0; } bool match(const wchar_t *patt) const { return soap_elt_match_w(this, NULL, patt) != 0; } bool match(const char *ns, const char *patt) const { return soap_elt_match(this, ns, patt) != 0; } bool match(const char *ns, const wchar_t *patt) const { return soap_elt_match_w(this, ns, patt) != 0; } const char *ns() const { return this->nstr; } const char *tag() const { return this->name; } soap_dom_element *parent() { return this->prnt; } size_t depth() const { return soap_elt_depth(this); } size_t index() const { return soap_elt_index(this); } size_t len() const { return soap_elt_len(this); } size_t nth() const { return soap_elt_nth(this); } size_t elt_size() { return soap_elt_size(this, NULL, NULL); } size_t elt_size(const char *patt, int type = 0) { return elt_size(NULL, patt, type); } size_t elt_size(const char *ns, const char *patt, int type = 0) { return soap_elt_size_type(this, ns, patt, type); } size_t att_size() { return soap_att_size(this, NULL, NULL); } size_t att_size(const char *patt) { return att_size(NULL, patt); } #ifndef WITH_COMPAT size_t att_size(const std::string& patt) { return att_size(NULL, patt); } #endif size_t att_size(const char *ns, const char *patt) { return soap_att_size(this, ns, patt); } #ifndef WITH_COMPAT size_t att_size(const char *ns, const std::string& patt) { return soap_att_size(this, ns, patt.c_str()); } #endif bool is_true() const { return soap_elt_is_true(this) != 0; } bool is_false() const { return soap_elt_is_false(this) != 0; } LONG64 get_int() const { return soap_elt_get_LONG64(this); } double get_double() const { return soap_elt_get_double(this); } const char *get_text() const { return this->text; } const void *get_node(int type) const { return soap_elt_get_node(this, type); } int get_type(const void **node) const { return soap_elt_get_type(this, node); } operator bool() const { return soap_elt_is_true(this) != 0; } operator int() const { return soap_elt_get_int(this); } operator LONG64() const { return soap_elt_get_LONG64(this); } operator double() const { return soap_elt_get_double(this); } operator const char*() const { return this->text; } soap_dom_element_iterator begin(); soap_dom_element_iterator end() { return soap_dom_element_iterator(NULL); } soap_dom_element_iterator elt_begin() { return soap_dom_element_iterator(this->elts); } soap_dom_element_iterator elt_end() { return soap_dom_element_iterator(NULL); } soap_dom_attribute_iterator att_begin() { return soap_dom_attribute_iterator(this->atts); } soap_dom_attribute_iterator att_end() { return soap_dom_attribute_iterator(NULL); } soap_dom_element_iterator find(const char *patt, int type = 0) { return find(NULL, patt, type); } soap_dom_element_iterator find(const wchar_t *patt, int type = 0) { return find(NULL, patt, type); } soap_dom_element_iterator find(const char *ns, const char *patt, int type = 0); soap_dom_element_iterator find(const char *ns, const wchar_t *patt, int type = 0); soap_dom_element_iterator find(int type); soap_dom_element_iterator elt_find(const char *patt, int type = 0) { return elt_find(NULL, patt, type); } soap_dom_element_iterator elt_find(const wchar_t *patt, int type = 0) { return elt_find(NULL, patt, type); } soap_dom_element_iterator elt_find(const char *ns, const char *patt, int type = 0); soap_dom_element_iterator elt_find(const char *ns, const wchar_t *patt, int type = 0); soap_dom_element_iterator elt_find(int type); soap_dom_attribute_iterator att_find(const char *patt) { return att_find(NULL, patt); } soap_dom_attribute_iterator att_find(const wchar_t *patt) { return att_find(NULL, patt); } soap_dom_attribute_iterator att_find(const char *ns, const char *patt); soap_dom_attribute_iterator att_find(const char *ns, const wchar_t *patt); void unlink(); #endif }; #endif #ifndef WITH_LEANER SOAP_FMAC1 struct soap_dom_element * SOAP_FMAC2 soap_dup_xsd__anyType(struct soap *soap, struct soap_dom_element *d, const struct soap_dom_element *a); SOAP_FMAC1 void SOAP_FMAC2 soap_del_xsd__anyType(const struct soap_dom_element *a); SOAP_FMAC1 struct soap_dom_attribute * SOAP_FMAC2 soap_dup_xsd__anyAttribute(struct soap *soap, struct soap_dom_attribute *d, const struct soap_dom_attribute *a); SOAP_FMAC1 void SOAP_FMAC2 soap_del_xsd__anyAttribute(const struct soap_dom_attribute *a); SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element *in, struct soap_dom_element *out); #endif #ifndef WITH_LEANER #if defined(__cplusplus) && !defined(WITH_COMPAT) extern std::ostream &operator<<(std::ostream&, const struct soap_dom_element&); extern std::istream &operator>>(std::istream&, struct soap_dom_element&); SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element& in, struct soap_dom_element& out); SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element *in, struct soap_dom_element& out); SOAP_FMAC1 int SOAP_FMAC2 soap_dom_call(struct soap *soap, const char *endpoint, const char *action, const struct soap_dom_element& in, struct soap_dom_element *out); #endif #endif #if defined(__cplusplus) extern "C" { #endif /******************************************************************************/ struct SOAP_CMAC 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), 0 indicates non-SOAP content */ soap_mode mode; /* internal mode flag, combines imode/omode */ soap_mode imode; /* input mode flag set with soap_init1(), soap_new1(), or soap_set_imode() */ soap_mode omode; /* ouput mode flag set with soap_init1(), soap_new1(), or soap_set_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 *long_double_format;/* user-definable format string for long doubles (<1024 chars) */ const char *dime_id_format; /* user-definable format string for integer DIME id ( 0, sets max message size that can be received */ int recv_timeout; /* user-definable, when > 0, sets socket recv stall timeout in seconds, < 0 in usec */ int send_timeout; /* user-definable, when > 0, sets socket send stall timeout in seconds, < 0 in usec */ int transfer_timeout; /* user-definable, when > 0, sets socket total transfer timeout in seconds, < 0 in usec */ int connect_timeout; /* user-definable, when > 0, sets socket connect() timeout in seconds, < 0 in usec */ int accept_timeout; /* user-definable, when > 0, sets socket accept() timeout in seconds, < 0 in usec */ int socket_flags; /* user-definable socket recv() and send() flags, e.g. set to MSG_NOSIGNAL to disable sigpipe */ int connect_flags; /* user-definable connect() SOL_SOCKET sockopt flags, e.g. set to SO_DEBUG to debug socket */ int connect_retry; /* number of times to retry connecting (exponential backoff), zero by default */ int bind_flags; /* user-definable bind() SOL_SOCKET sockopt flags, e.g. set to SO_REUSEADDR to enable reuse */ short bind_inet6; /* user-definable, when > 0 use AF_INET6 instead of PF_UNSPEC (only with -DWITH_IPV6) */ short bind_v6only; /* user-definable, when > 0 use IPPROTO_IPV6 sockopt IPV6_V6ONLY (only with -DWITH_IPV6) */ int accept_flags; /* user-definable accept() SOL_SOCKET sockopt flags */ #ifdef WITH_SELF_PIPE int pipe_fd[2]; /* self pipe trick file descriptors used to close the select call from another thread */ #endif int sndbuf; /* user-definable SO_SNDBUF setsockopt value */ int rcvbuf; /* user-definable SO_RCVBUF setsockopt value */ unsigned short linger_time; /* user-definable linger time for SO_LINGER option */ unsigned int maxlevel; /* user-definable max XML nesting depth levels, initialized to SOAP_MAXLEVEL */ long maxlength; /* user-definable max string length, initialized to SOAP_MAXLENGTH, maxlength<=0 is unbounded */ size_t maxoccurs; /* user-definable max array/container size, initialized to SOAP_MAXOCCURS */ const char *http_version; /* HTTP version used "1.0" or "1.1" */ const char *http_content; /* optional custom HTTP content type (with SOAP_PUT, SOAP_POST_FILE, SOAP_FILE) */ const char *http_extra_header;/* optional custom HTTP header of the form 'key: val' (multiple headers should be separated in the string by \r\n - crlf) */ const char *encodingStyle; /* default = "" which means that SOAP encoding is used */ const char *actor; /* SOAP-ENV:actor or role attribute value */ const char *lang; /* user-definable xml:lang attribute value of SOAP-ENV:Text */ 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 */ #if !defined(WITH_LEANER) || !defined(WITH_NOIDREF) struct soap_ilist *iht[SOAP_IDHASH]; #endif struct soap_plist *pht[SOAP_PTRHASH]; struct soap_pblk *pblk; /* plist block allocation */ short pidx; /* plist block allocation */ short shaky; /* objects in reallocatable containers are on shaky grounds */ struct SOAP_ENV__Header *header; struct SOAP_ENV__Fault *fault; int idnum; void *user; /* for user to pass user-defined data to callbacks */ void *data[4]; /* extension data = {smdevp, mecevp, ...} */ struct soap_plugin *plugins; /* linked list of plug-in data */ const char *bearer; /* HTTP authorization bearer token value */ const char *userid; /* HTTP Basic authorization userid */ const char *passwd; /* HTTP Basic authorization passwd */ const char *authrealm; /* HTTP authentication realm (and NTLM domain) */ #if !defined(WITH_LEAN) || defined(WITH_NTLM) const char *ntlm_challenge; /* HTTP NTLM challenge key string */ short ntlm_auth; /* HTTP NTLM authentication type */ #endif int (*fpost)(struct soap*, const char*, const char*, int, const char*, const char*, ULONG64); int (*fget)(struct soap*); /* HTTP GET hook (not set by default) */ int (*fput)(struct soap*); /* HTTP PUT hook (handled as POST by default) */ int (*fpatch)(struct soap*); /* HTTP PATCH hook (handled as POST by default) */ int (*fdel)(struct soap*); /* HTTP DELETE hook (not set by default) */ int (*fopt)(struct soap*); /* HTTP OPTIONS hook (not set by default) */ int (*fhead)(struct soap*); /* HTTP HEAD hook (not set by default) */ int (*fform)(struct soap*); /* HTTP/HTML form handler for plugins */ int (*fposthdr)(struct soap*, const char*, const char*); int (*fresponse)(struct soap*, int, ULONG64); 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*); #ifndef WITH_LEANER int (*fsvalidate)(struct soap*, const char*, const char*); int (*fwvalidate)(struct soap*, const char*, const wchar_t*); int (*feltbegin)(struct soap*, const char*); int (*feltendin)(struct soap*, const char*, const char*); int (*feltbegout)(struct soap*, const char*, int, const char*); int (*feltendout)(struct soap*, const char*); int (*fprepareinitsend)(struct soap*); int (*fprepareinitrecv)(struct soap*); int (*fpreparesend)(struct soap*, const char*, size_t); int (*fpreparerecv)(struct soap*, const char*, size_t); int (*fpreparefinalsend)(struct soap*); int (*fpreparefinalrecv)(struct soap*); int recverror; /* last soap_recv_raw error code for filterrecv */ int (*ffiltersend)(struct soap*, const char**, size_t*); int (*ffilterrecv)(struct soap*, char*, size_t*, size_t); 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; /* socket bound to TCP/IP port */ SOAP_SOCKET socket; /* socket to send and receive */ SOAP_SOCKET sendsk; /* socket to send (overrides ::socket) */ SOAP_SOCKET recvsk; /* socket to receive (overrides ::socket) */ #if defined(__cplusplus) && !defined(WITH_COMPAT) std::ostream *os; /* C++ only: ostream to send */ std::istream *is; /* C++ only: istream to receive */ #else const char **os; /* C only: pointer to a const char*, will be set to point to the string output */ const char *is; /* C only: a const char* to read from (soap->is will advance) */ #endif #ifndef UNDER_CE int sendfd; /* int file descriptor for sending */ int recvfd; /* int file descriptor for receiving */ #else FILE *sendfd; /* WinCE FILE* to send */ FILE *recvfd; /* WinCE FILE* to receive */ #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; /* HTTP or XML element has a body (1) or not (0) */ unsigned int level; /* XML nesting level */ #ifndef WITH_LEAN ULONG64 start; /* start time of send/recv (value cast to time_t) */ #endif ULONG64 count; /* message length counter */ ULONG64 length; /* message length as was set by HTTP header received */ 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[SOAP_TMPLEN]; /* in/out buffer for HTTP/MIME headers and short messages, must be >=1024 bytes */ char tmpbuf[SOAP_TMPLEN]; /* 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]; int position; int positions[SOAP_MAXDIMS]; struct soap_attribute *attributes; /* attribute list */ short other; short root; 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; /* zero to output all xmlns */ short part; /* SOAP part state (header or body) */ short event; /* engine events and states for use by plugins */ short peeked; unsigned int evlev; /* event level */ int alloced; size_t chunksize; size_t chunkbuflen; char endpoint[SOAP_TAGLEN]; char path[SOAP_TAGLEN]; char host[SOAP_TAGLEN]; char *action; /* SOAPAction string */ const char *prolog; /* XML declaration prolog */ unsigned int ip; /* IP number retrieved from request */ unsigned int ip6[4]; /* same for IPv6: upper in ip6[0] to lower in ip6[3] requires WITH_IPV6 */ int port; /* port number */ const char *override_host; /* to override the client-side host name/IP when connecting */ int override_port; /* to override client-side port number when connecting */ int keep_alive; /* connection should be kept open (-1, 0, or counts down) */ int 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 */ int max_keep_alive; /* maximum keep-alive session (default=100) 0 to always keep open */ 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 */ const char *origin; /* Origin header received */ const char *cors_origin; /* CORS Allow-Origin header returned by server */ const char *cors_allow; /* CORS Allow-Origin header default value of "*" */ const char *cors_method; /* CORS Request-Method header received */ const char *cors_header; /* CORS Request-Headers header received */ const char *cors_methods; /* CORS Allow-Methods header returned by server */ const char *cors_headers; /* CORS Allow-Headers header returned by server */ const char *x_frame_options; /* "DENY", "SAMEORIGIN" (default), or "ALLOW-FROM uri" */ int status; /* HTTP status code, HTTP method, or other error code */ 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 const char *logfile[SOAP_MAXLOGS]; FILE *fdebug[SOAP_MAXLOGS]; struct soap_mlist *mht[SOAP_PTRHASH]; #ifndef WITH_LEAN const char *wsuid; /* space-separated string of element tags */ const char *c14nexclude; /* space-separated string of prefixes for c14n exclusion */ const char *c14ninclude; /* space-separated string of prefixes for c14n inclusion */ #endif struct soap_cookie *cookies; const char *cookie_domain; const char *cookie_path; int cookie_max; #ifndef WITH_NOIO unsigned int ipv6_multicast_if; /* in_addr_t in6addr->sin6_scope_id IPv6 value */ char* ipv4_multicast_if; /* IP_MULTICAST_IF IPv4 setsockopt interface_addr */ unsigned char ipv4_multicast_ttl; /* IP_MULTICAST_TTL value 0..255 */ const char *client_addr; /* when non-NULL, client binds to this address before connect */ const char *client_addr_ipv6; /* WITH_IPV6: when non-NULL and client_addr is non-NULL and when connecting to a IPv6 server, client binds to this IPv6 address instead of client_addr */ int client_port; /* when nonnegative, client binds to this port before connect */ const char *client_interface; /* when non-NULL, override client-side interface address using this address */ union { struct sockaddr addr; struct sockaddr_in in; struct sockaddr_storage storage; } peer; /* set by soap_connect/soap_accept and by UDP recv */ size_t peerlen; #endif #if defined(WITH_OPENSSL) /* OpenSSL */ int (*fsslauth)(struct soap*); int (*fsslverify)(int, X509_STORE_CTX*); BIO *bio; SSL *ssl; SSL_CTX *ctx; SSL_SESSION *session; const char *dhfile; const char *randfile; #elif defined(WITH_GNUTLS) /* GNUTLS */ int (*fsslauth)(struct soap*); void *fsslverify; gnutls_certificate_credentials_t xcred; /* cert pointer */ gnutls_anon_client_credentials_t acred; /* anon pointer */ gnutls_priority_t cache; /* priority cache pointer */ gnutls_session_t session; /* session pointer */ gnutls_dh_params_t dh_params; gnutls_rsa_params_t rsa_params; #elif defined(WITH_SYSTEMSSL) /* SYSTEM SSL */ int (*fsslauth)(struct soap*); void *fsslverify; /* N/A */ void *bio; /* N/A */ gsk_handle ctx; /* environment */ gsk_handle ssl; /* ssl socket */ void *session; /* N/A */ const char *dhfile; /* N/A */ const char *randfile; /* N/A */ #else /* No SSL/TLS */ void *fsslauth; /* dummy members, to preserve struct size */ void *fsslverify; void *bio; void *ssl; void *ctx; void *session; void *dh_params; void *rsa_params; #endif unsigned short ssl_flags; const char *keyfile; const char *keyid; const char *password; const char *cafile; const char *capath; const char *crlfile; char session_host[SOAP_TAGLEN]; int session_port; #ifdef SOAP_LOCALE_T SOAP_LOCALE_T c_locale; /* if this does not compile, use ./configure --enable-xlocale or compile with -DWITH_INCLUDE_XLOCALE_H, or use -DWITH_NO_C_LOCALE to disable locale support */ #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 const char *z_dict; /* support for zlib static dictionaries */ unsigned int z_dict_len; 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 /* vxWorks compatibility */ void *rpmreqid; #endif #ifdef __cplusplus soap(); soap(soap_mode); soap(soap_mode, soap_mode); soap(const struct soap&); struct soap& operator=(const struct soap&); void destroy(); ~soap(); /* no virtual methods, so sizeof(soap) should be the same in C and C++ */ #endif }; struct soap_code_map { LONG64 code; const char *string; }; /* forwarding list */ struct soap_flist { struct soap_flist *next; int type; void *ptr; unsigned int level; size_t index; void (*finsert)(struct soap*, int, int, void*, size_t, const void*, void**); }; /* id-ref forwarding list */ struct soap_ilist { struct soap_ilist *next; int type; size_t size; void *ptr; void **spine; void *link; void *copy; struct soap_flist *flist; void *smart; short shaky; 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) */ }; extern SOAP_NMAC struct Namespace namespaces[]; #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_versioning_paste(name, ext) name##_REQUIRE_lib_v##ext #define soap_versioning_ext(name, ext) soap_versioning_paste(name, ext) #define soap_versioning(name) soap_versioning_ext(name, GSOAP_VERSION) #define soap_init(soap) soap_init1(soap, SOAP_IO_DEFAULT) #define soap_init1(soap, mode) soap_init2(soap, mode, mode) #define soap_init2(soap, imode, omode) soap_versioning(soap_init)(soap, imode, omode) #define soap_new() soap_new1(SOAP_IO_DEFAULT) #define soap_new1(mode) soap_new2(mode, mode) #define soap_new2(imode, omode) soap_versioning(soap_new)(imode, omode) #define soap_revget1(soap) ((soap)->bufidx--) #define soap_unget(soap, c) ((soap)->ahead = c) #define soap_peek(soap) ((soap)->ahead = soap_get(soap)) #define soap_register_plugin(soap, plugin) soap_register_plugin_arg(soap, plugin, NULL) #define soap_mode(soap, n) ((soap)->mode = (soap)->imode = (soap)->omode = (n)) #define soap_imode(soap, n) ((soap)->imode = (n)) #define soap_omode(soap, n) ((soap)->omode = (n)) #define soap_set_imode(soap, n) ((soap)->imode |= (n)) #define soap_clr_imode(soap, n) ((soap)->imode &= ~(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)->mode |= (n), (soap)->imode |= (n), (soap)->omode |= (n)) #define soap_clr_mode(soap, n) ((soap)->mode &= ~(n), (soap)->imode &= ~(n), (soap)->omode &= ~(n)) #define soap_destroy(soap) soap_delete((soap), NULL) #define SOAP_NO_LINK_TO_DELETE (-2) /* pass to soap_link() as size n: do not manage, smart pointers are self-managing */ #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*, char**, int); #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*, char**, int); #endif #if defined(WIN32) && !defined(__MINGW32__) && !defined(__MINGW64__) && !defined(__BORLANDC__) # define soap_strtoll _strtoi64 #elif defined(HAVE_STRTOLL) && !defined(soap_strtoll) # define soap_strtoll strtoll #elif !defined(soap_strtoll) SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_strtoll(const char*, char**, int); #endif #if defined(WIN32) && !defined(__MINGW32__) && !defined(__MINGW64__) && !defined(__BORLANDC__) # define soap_strtoull _strtoui64 #elif defined(HAVE_STRTOULL) && !defined(soap_strtoull) # define soap_strtoull strtoull #elif !defined(soap_strtoull) SOAP_FMAC1 ULONG64 SOAP_FMAC2 soap_strtoull(const char*, char**, int); #endif #if defined(WITH_OPENSSL) # define soap_random soap_rand() SOAP_FMAC1 int SOAP_FMAC2 soap_rand(void); #elif defined(UNDER_CE) # define soap_random (int)Random() #elif defined(HAVE_RANDOM) # define soap_random (int)random() #else # define soap_random rand() #endif #ifdef WITH_NOIDREF # define soap_embedded(s, p, t) ((void)(s), 0) # define soap_id_lookup(s, i, p, t, n, k, fb) ((void)(s), (p)) # define soap_id_forward(s, h, p, i, t, tt, n, k, fi, fb) ((void)(s), (p)) # define soap_id_nullify(s, i) ((void)(s), (i)) # define soap_reference(s, a, t) ((void)(s), 1) # define soap_array_reference(s, p, a, n, t) ((void)(s), 1) # define soap_attachment_reference(s, p, a, n, t, i, y) ((void)(s), 1) # define soap_embed(s, p, a, n, t) ((void)(s), 0) # define soap_embedded_id(s, i, p, t) ((void)(s), (void)(t), i) # define soap_is_embedded(s, p) ((void)(s), 0) # define soap_is_single(s, p) ((void)(s), 1) # define soap_lookup_type(s, i) ((void)(s), 0) # define soap_getindependent(s) ((void)(s), 0) # define soap_putindependent(s) ((void)(s), 0) # define soap_markelement(s, p, t) ((void)(s), 0) # define soap_begin_shaky(s) ((void)(s), 0) # define soap_end_shaky(s, f) ((void)(s), (void)(f), 0) #endif /* soap_traverse() traversal/walker routines take walker function arguments */ typedef void soap_walker(struct soap*, void*, int, const char*, const char*); SOAP_FMAC5 int SOAP_FMAC6 soap_serve(struct soap *soap); SOAP_FMAC5 int SOAP_FMAC6 soap_serve_request(struct soap *soap); SOAP_FMAC1 void SOAP_FMAC2 soap_ssl_init(void); SOAP_FMAC1 void SOAP_FMAC2 soap_ssl_noinit(void); SOAP_FMAC1 int SOAP_FMAC2 soap_GET(struct soap*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_PUT(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_PATCH(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_POST(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_DELETE(struct soap*, const char*); 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 ret, int err); SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_crl(struct soap*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_poll(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_ready(struct soap*); #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid); #else 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); #endif #if defined(VXWORKS) && defined(WM_SECURE_KEY_STORAGE) SOAP_FMAC1 int SOAP_FMAC2 soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *keyid, const char *password, const char *cafile, const char *capath, const char *randfile); #else 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); #endif SOAP_FMAC1 const char * SOAP_FMAC2 soap_http_content_type(struct soap *soap, int status); SOAP_FMAC1 int SOAP_FMAC2 soap_puthttphdr(struct soap*, int status, ULONG64 count); SOAP_FMAC1 const char* SOAP_FMAC2 soap_http_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*); #ifndef WITH_LEANER 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_query_send_key(struct soap*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_query_send_val(struct soap*, const char*); SOAP_FMAC1 char * SOAP_FMAC2 soap_query(struct soap*); SOAP_FMAC1 char * SOAP_FMAC2 soap_query_key(struct soap*, char**); SOAP_FMAC1 char * SOAP_FMAC2 soap_query_val(struct soap*, char**); SOAP_FMAC1 const char * SOAP_FMAC2 soap_query_decode(char*, size_t, const char*); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_pututf8(struct soap*, unsigned long); SOAP_FMAC1 soap_wchar SOAP_FMAC2 soap_getutf8(struct soap*); SOAP_FMAC1 size_t SOAP_FMAC2 soap_utf8len(const char*); 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_attachment_forward(struct soap*, unsigned char**, int*, char**, char**, char**); #endif 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 void *a, int n, int t, struct soap_plist**); SOAP_FMAC1 int SOAP_FMAC2 soap_array_pointer_lookup(struct soap*, const void *p, const void *a, int n, int t, struct soap_plist**); #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_embed(struct soap *soap, const void *p, const void *a, int n, int t); 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*, int t, size_t n); 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 void *a, int n, int t); SOAP_FMAC1 int SOAP_FMAC2 soap_attachment_reference(struct soap *soap, const void *p, const void *a, int n, int t, const char *id, const char *type); 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_check_and_mark(struct soap *soap, const void *p, int t, char **mark); SOAP_FMAC1 void * SOAP_FMAC2 soap_mark_lookup(struct soap *soap, const void *p, int t, struct soap_plist **pp, char **mark); SOAP_FMAC1 int SOAP_FMAC2 soap_mark_cycle(struct soap *soap, struct soap_plist *pp); SOAP_FMAC1 void SOAP_FMAC2 soap_mark_dup(struct soap *soap, void *a, struct soap_plist *pp); SOAP_FMAC1 void SOAP_FMAC2 soap_unmark(struct soap *soap, char *mark); 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 int SOAP_FMAC2 soap_end_send_flush(struct soap*); SOAP_FMAC1 const struct soap_code_map* SOAP_FMAC2 soap_code(const struct soap_code_map*, const char*); SOAP_FMAC1 LONG64 SOAP_FMAC2 soap_code_int(const struct soap_code_map*, const char*, LONG64); SOAP_FMAC1 const char* SOAP_FMAC2 soap_code_str(const struct soap_code_map*, long); SOAP_FMAC1 LONG64 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_binary_search_string(const char**, int, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_getline(struct soap*, char*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_begin_serve(struct soap*); 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*, int, int, int (*fdelete)(struct soap*, struct soap_clist*)); SOAP_FMAC1 int 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 short SOAP_FMAC2 soap_begin_shaky(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_end_shaky(struct soap*, short); SOAP_FMAC1 void* SOAP_FMAC2 soap_id_lookup(struct soap*, const char *id, void **p, int t, size_t n, unsigned int k, int (*fbase)(int, int)); SOAP_FMAC1 void* SOAP_FMAC2 soap_id_forward(struct soap*, const char *id, void *p, size_t i, int t, int tt, size_t n, unsigned int k, void(*finsert)(struct soap*, int, int, void*, size_t, const void*, void**), int (*fbase)(int, int)); SOAP_FMAC1 int SOAP_FMAC2 soap_id_nullify(struct soap*, const char*); #endif SOAP_FMAC1 void* SOAP_FMAC2 soap_id_enter(struct soap*, const char *id, void *p, int t, size_t n, const char *type, const char *arrayType, void *(*finstantiate)(struct soap*, int, const char*, const char*, size_t*), int (*fbase)(int, int)); SOAP_FMAC1 void** SOAP_FMAC2 soap_id_smart(struct soap *soap, const char*, int t, size_t n); SOAP_FMAC1 size_t SOAP_FMAC2 soap_size(const int *, int); SOAP_FMAC1 size_t SOAP_FMAC2 soap_getsizes(const char *, int *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_getoffsets(const char *, const int *, int *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_getposition(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_putoffsets(struct soap*, const int *, int); SOAP_FMAC1 int SOAP_FMAC2 soap_closesock(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_force_closesock(struct soap*); SOAP_FMAC1 struct soap *SOAP_FMAC2 soap_versioning(soap_new)(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_free_stream(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_versioning(soap_init)(struct soap*, soap_mode, soap_mode); SOAP_FMAC1 void SOAP_FMAC2 soap_initialize(struct soap*); 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*); SOAP_FMAC1 void SOAP_FMAC2 soap_delegate_deletion(struct soap*, struct soap*); #ifdef WITH_SELF_PIPE SOAP_FMAC1 void SOAP_FMAC2 soap_close_connection(struct soap*); #endif /* API functions available with DEBUG or SOAP_DEBUG defined: */ 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); /* */ 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_att(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_start_end_out(struct soap*, const char *tag); 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_empty(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_element_nil(struct soap*, const char *tag); SOAP_FMAC1 int SOAP_FMAC2 soap_element_id(struct soap*, const char *tag, int id, const void *p, const void *a, int n, const char *type, int t, char **mark); 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_end(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 int SOAP_FMAC2 soap_ignore(struct soap*); SOAP_FMAC1 void* SOAP_FMAC2 soap_memdup(struct soap*, const void*, size_t); 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 char* SOAP_FMAC2 soap_strtrim(struct soap*, char*); SOAP_FMAC1 wchar_t* SOAP_FMAC2 soap_wstrtrim(struct soap*, wchar_t*); SOAP_FMAC1 const char * SOAP_FMAC2 soap_tagsearch(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, const char*); #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, const char*); #endif SOAP_FMAC1 int SOAP_FMAC2 soap_match_namespace(struct soap*, const char *, const char*, size_t n1, size_t n2); SOAP_FMAC1 void SOAP_FMAC2 soap_set_version(struct soap*, short); 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 struct soap_nlist* SOAP_FMAC2 soap_push_namespace(struct soap*, const char *,const char *); SOAP_FMAC1 const char* SOAP_FMAC2 soap_current_namespace_tag(struct soap *soap, const char *tag); SOAP_FMAC1 const char* SOAP_FMAC2 soap_current_namespace_att(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_alloc_block(struct soap*); SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block(struct soap*, struct soap_blist*, size_t); SOAP_FMAC1 void* SOAP_FMAC2 soap_push_block_max(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 void SOAP_FMAC2 soap_update_pointers(struct soap *soap, const char *dst, const char *src, size_t len); SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_begin_out(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_envelope_end_out(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_http_has_body(struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_http_skip_body(struct soap*); SOAP_FMAC1 char * SOAP_FMAC2 soap_http_get_body(struct soap*, size_t *len); SOAP_FMAC1 char * SOAP_FMAC2 soap_http_get_form(struct soap*); SOAP_FMAC1 char * SOAP_FMAC2 soap_http_get_body_prefix(struct soap*, size_t *len, const char *prefix); 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*, int check); #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 # ifndef WITH_COMPAT # ifdef __cplusplus SOAP_FMAC1 void SOAP_FMAC2 soap_stream_fault(struct soap*, std::ostream&); SOAP_FMAC1 void SOAP_FMAC2 soap_stream_fault_location(struct soap*, std::ostream&); # endif # 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_s2char(struct soap*, const char*, char**, int, long minlen, long maxlen, const char *pattern); SOAP_FMAC1 int SOAP_FMAC2 soap_s2QName(struct soap*, const char*, char**, long minlen, long maxlen, const char *pattern); #ifndef WITH_COMPAT #ifdef __cplusplus SOAP_FMAC1 int SOAP_FMAC2 soap_s2stdQName(struct soap*, const char*, std::string*, long minlen, long maxlen, const char *pattern); SOAP_FMAC1 int SOAP_FMAC2 soap_s2stdchar(struct soap*, const char*, std::string*, int, long minlen, long maxlen, const char *pattern); SOAP_FMAC1 int SOAP_FMAC2 soap_s2stdwchar(struct soap*, const char*, std::wstring*, int, long minlen, long maxlen, const char *pattern); #endif #endif #ifndef WITH_LEAN SOAP_FMAC1 int SOAP_FMAC2 soap_s2wchar(struct soap*, const char*, wchar_t**, int, long minlen, long maxlen, const char *pattern); SOAP_FMAC1 int SOAP_FMAC2 soap_s2dateTime(struct soap*, const char*, time_t*); #endif 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); 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); #endif 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*); 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, const char*); 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); #endif #if !defined(WITH_LEAN) || defined(WITH_COOKIES) 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, int, long, long, const char*); 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 void*, int, const char*, const char*, const char*, const char*, int); SOAP_FMAC1 int SOAP_FMAC2 soap_move(struct soap*, ULONG64); SOAP_FMAC1 ULONG64 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*, const 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*, const 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_recv_mime_attachment(struct soap *soap, void *handle); SOAP_FMAC1 int SOAP_FMAC2 soap_match_cid(struct soap*, const char*, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_rand_uuid(struct soap*, 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, int occurs); SOAP_FMAC1 int SOAP_FMAC2 soap_set_attr(struct soap *soap, const char *name, const char *value, int flag); SOAP_FMAC1 void SOAP_FMAC2 soap_clr_attr(struct soap *soap); SOAP_FMAC1 const char* SOAP_FMAC2 soap_extend_url(struct soap *soap, const char*, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_extend_url_query(struct soap *soap, const char*, const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_url_query(struct soap *soap, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_encode_url(const char*, char*, int); SOAP_FMAC1 const char* SOAP_FMAC2 soap_encode_url_string(struct soap*, const char*); #ifdef WITH_COOKIES SOAP_FMAC1 void SOAP_FMAC2 soap_getcookies(struct soap *soap, const char *val); SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_set_cookie(struct soap*, const char*, const char*, const char*, const char*); SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_cookie(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_cookie_env(struct soap*, const char*, const char*, const char*, short); SOAP_FMAC1 const char* SOAP_FMAC2 soap_cookie_value(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 const char* SOAP_FMAC2 soap_env_cookie_value(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 time_t SOAP_FMAC2 soap_cookie_expire(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_expire(struct soap*, const char*, long, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_secure(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_set_cookie_session(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_clr_cookie_session(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 void SOAP_FMAC2 soap_clr_cookie(struct soap*, const char*, const char*, const char*); SOAP_FMAC1 int SOAP_FMAC2 soap_getenv_cookies(struct soap*); SOAP_FMAC1 void SOAP_FMAC2 soap_free_cookies(struct soap*); SOAP_FMAC1 struct soap_cookie* SOAP_FMAC2 soap_copy_cookies(struct soap*, const struct soap*); SOAP_FMAC1 int SOAP_FMAC2 soap_putsetcookies(struct soap *soap); SOAP_FMAC1 int SOAP_FMAC2 soap_putcookies(struct soap *soap, const char *domain, const char *path, int secure); #endif #ifdef __cplusplus } /* extern "C" */ #endif SOAP_FMAC3 void SOAP_FMAC4 soap_header(struct soap*); SOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap*); SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultcode(struct soap*); SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultsubcode(struct soap*); SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultstring(struct soap*); SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultdetail(struct soap*); SOAP_FMAC3 const char * SOAP_FMAC4 soap_fault_subcode(struct soap*); SOAP_FMAC3 const char * SOAP_FMAC4 soap_fault_string(struct soap*); SOAP_FMAC3 const char * SOAP_FMAC4 soap_fault_detail(struct soap*); SOAP_FMAC3 void SOAP_FMAC4 soap_serializefault(struct soap*); SOAP_FMAC3 void SOAP_FMAC4 soap_serializeheader(struct soap*); SOAP_FMAC3 int SOAP_FMAC4 soap_getheader(struct soap*); SOAP_FMAC3 int SOAP_FMAC4 soap_putheader(struct soap*); SOAP_FMAC3 int SOAP_FMAC4 soap_getfault(struct soap*); SOAP_FMAC3 int SOAP_FMAC4 soap_putfault(struct soap*); #ifdef __cplusplus /* C++ templates (for generated C++ only, not needed nor used in generated C code) */ template struct soap_block { static T *push(struct soap *soap, struct soap_blist *b) { if (!b) b = soap->blist; if (!b) return NULL; T *p = (T*)soap_push_block_max(soap, b, sizeof(T)); if (p) SOAP_PLACEMENT_NEW(soap, p, T); return p; } static void pop(struct soap *soap, struct soap_blist *b) { if (!b) b = soap->blist; if (!b || !b->head) return; ((T*)(b->head + 1))->~T(); soap_pop_block(soap, b); } static void save(struct soap *soap, struct soap_blist *b, T *p) { if (!b) b = soap->blist; for (T *q = (T*)soap_first_block(soap, b); q; q = (T*)soap_next_block(soap, b)) { soap_update_pointers(soap, (const char*)p, (const char*)q, sizeof(T)); *p++ = *q; q->~T(); } soap_end_block(soap, b); } static void end(struct soap *soap, struct soap_blist *b) { if (!b) b = soap->blist; for (T *p = (T*)soap_first_block(soap, b); p; p = (T*)soap_next_block(soap, b)) p->~T(); soap_end_block(soap, b); } }; #endif #endif /* STDSOAP_H */ gsoap-2.8.91/gsoap/import/0000755000175000017500000000000013525245161014713 5ustar ellertellertgsoap-2.8.91/gsoap/import/stllist.h0000644000175000017500000000454013525245161016565 0ustar ellertellert/* stllist.h Use #import "stllist.h" in a gSOAP header file to enable STL lists. Use soapcpp2 option -Ipath:path:... to specify the path(s) for #import 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 A. 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 template class std::list; gsoap-2.8.91/gsoap/import/ds2.h0000644000175000017500000004634313525245161015566 0ustar ellertellert/* ds2.h Generated with: wsdl2h -cuxy -o ds.h -t WS/WS-typemap.dat WS/ds.xsd - Removed //gsoapopt - Added //gsoap ds schema import: http://www.w3.org/2000/09/xmldsig# - Changed to #import "xenc2.h" */ /******************************************************************************\ * * * http://www.w3.org/2000/09/xmldsig# * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ //gsoap ds schema import: http://www.w3.org/2000/09/xmldsig# //gsoap ds schema elementForm: qualified //gsoap ds schema attributeForm: unqualified /******************************************************************************\ * * * Schema Types * * * \******************************************************************************/ /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":SignatureType from typemap WS/WS-typemap.dat. typedef char *_ds__SignatureValue; typedef struct ds__SignatureType { struct ds__SignedInfoType* SignedInfo; _ds__SignatureValue SignatureValue; struct ds__KeyInfoType* KeyInfo; @char* Id; } ds__SignatureType, _ds__Signature; /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":SignatureValueType from typemap WS/WS-typemap.dat. /// complexType definition intentionally left blank. /// Typedef synonym for struct ds__SignedInfoType. typedef struct ds__SignedInfoType ds__SignedInfoType; /// Typedef synonym for struct ds__CanonicalizationMethodType. typedef struct ds__CanonicalizationMethodType ds__CanonicalizationMethodType; /// Typedef synonym for struct ds__SignatureMethodType. typedef struct ds__SignatureMethodType ds__SignatureMethodType; /// Typedef synonym for struct ds__ReferenceType. typedef struct ds__ReferenceType ds__ReferenceType; /// Typedef synonym for struct ds__TransformsType. typedef struct ds__TransformsType ds__TransformsType; /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":TransformType from typemap WS/WS-typemap.dat. #import "c14n.h" typedef struct ds__TransformType { _c14n__InclusiveNamespaces* c14n__InclusiveNamespaces; _XML __any; @char* Algorithm; } ds__TransformType, _ds__Transform; /// Typedef synonym for struct ds__DigestMethodType. typedef struct ds__DigestMethodType ds__DigestMethodType; #import "wsse2.h" /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":KeyInfoType from typemap WS/WS-typemap.dat. typedef struct ds__KeyInfoType { char* KeyName; struct ds__KeyValueType* KeyValue; struct ds__RetrievalMethodType* RetrievalMethod; struct ds__X509DataType* X509Data; struct _wsse__SecurityTokenReference* wsse__SecurityTokenReference; @char* Id; } ds__KeyInfoType, _ds__KeyInfo; /// Typedef synonym for struct ds__KeyValueType. typedef struct ds__KeyValueType ds__KeyValueType; /// Typedef synonym for struct ds__RetrievalMethodType. typedef struct ds__RetrievalMethodType ds__RetrievalMethodType; /// Typedef synonym for struct ds__X509DataType. typedef struct ds__X509DataType ds__X509DataType; /// Typedef synonym for struct ds__X509IssuerSerialType. typedef struct ds__X509IssuerSerialType ds__X509IssuerSerialType; /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":PGPDataType from typemap WS/WS-typemap.dat. /// complexType definition intentionally left blank. /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":SPKIDataType from typemap WS/WS-typemap.dat. /// complexType definition intentionally left blank. /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":ObjectType from typemap WS/WS-typemap.dat. /// complexType definition intentionally left blank. /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":ManifestType from typemap WS/WS-typemap.dat. /// complexType definition intentionally left blank. /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":SignaturePropertiesType from typemap WS/WS-typemap.dat. /// complexType definition intentionally left blank. /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":SignaturePropertyType from typemap WS/WS-typemap.dat. /// complexType definition intentionally left blank. /// Typedef synonym for struct ds__DSAKeyValueType. typedef struct ds__DSAKeyValueType ds__DSAKeyValueType; /// Typedef synonym for struct ds__RSAKeyValueType. typedef struct ds__RSAKeyValueType ds__RSAKeyValueType; /// Imported simpleType "http://www.w3.org/2000/09/xmldsig#":CryptoBinary from typemap WS/WS-typemap.dat. /// simpleType definition intentionally left blank. /// Imported simpleType "http://www.w3.org/2000/09/xmldsig#":DigestValueType from typemap WS/WS-typemap.dat. /// simpleType definition intentionally left blank. /// Imported simpleType "http://www.w3.org/2000/09/xmldsig#":HMACOutputLengthType from typemap WS/WS-typemap.dat. /// simpleType definition intentionally left blank. /// "http://www.w3.org/2000/09/xmldsig#":SignedInfoType is a complexType. struct ds__SignedInfoType { /// Element reference "http://www.w3.org/2000/09/xmldsig#":CanonicalizationMethod. struct ds__CanonicalizationMethodType* CanonicalizationMethod 1; ///< Required element. /// Element reference "http://www.w3.org/2000/09/xmldsig#":SignatureMethod. struct ds__SignatureMethodType* SignatureMethod 1; ///< Required element. /// Size of the dynamic array of struct ds__ReferenceType* is 0..unbounded int __sizeReference ; /// Pointer to array of struct ds__ReferenceType*. struct ds__ReferenceType* *Reference 1; /// Attribute Id of type xs:ID. @char* /*ID*/ Id 0; ///< Optional attribute. }; /// "http://www.w3.org/2000/09/xmldsig#":CanonicalizationMethodType is a complexType. struct ds__CanonicalizationMethodType { /// TODO: /// Schema extensibility is user-definable. /// Consult the protocol documentation to change and/or insert declarations. /// Use wsdl2h option -x to remove this element. /// Attribute Algorithm of type xs:anyURI. @char* /*URI*/ Algorithm 1; ///< Required attribute. /// Member declared in WS/WS-typemap.dat _c14n__InclusiveNamespaces* c14n__InclusiveNamespaces; }; /// "http://www.w3.org/2000/09/xmldsig#":SignatureMethodType is a complexType. struct ds__SignatureMethodType { /// Element HMACOutputLength of type "http://www.w3.org/2000/09/xmldsig#":HMACOutputLengthType. int* HMACOutputLength 0; ///< Optional element. /// TODO: /// Schema extensibility is user-definable. /// Consult the protocol documentation to change and/or insert declarations. /// Use wsdl2h option -x to remove this element. /// Attribute Algorithm of type xs:anyURI. @char* /*URI*/ Algorithm 1; ///< Required attribute. }; /// "http://www.w3.org/2000/09/xmldsig#":ReferenceType is a complexType. struct ds__ReferenceType { /// Element reference "http://www.w3.org/2000/09/xmldsig#":Transforms. struct ds__TransformsType* Transforms 0; ///< Optional element. /// Element reference "http://www.w3.org/2000/09/xmldsig#":DigestMethod. struct ds__DigestMethodType* DigestMethod 1; ///< Required element. /// Element reference "http://www.w3.org/2000/09/xmldsig#":DigestValue. char* /*base64*/ DigestValue 1; ///< Required element. /// Attribute Id of type xs:ID. @char* /*ID*/ Id 0; ///< Optional attribute. /// Attribute URI of type xs:anyURI. @char* /*URI*/ URI 0; ///< Optional attribute. /// Attribute Type of type xs:anyURI. @char* /*URI*/ Type 0; ///< Optional attribute. }; /// "http://www.w3.org/2000/09/xmldsig#":TransformsType is a complexType. struct ds__TransformsType { /// Size of the dynamic array of ds__TransformType is 0..unbounded int __sizeTransform ; /// Pointer to array of ds__TransformType. ds__TransformType *Transform 1; }; /// "http://www.w3.org/2000/09/xmldsig#":DigestMethodType is a complexType. struct ds__DigestMethodType { /// TODO: /// Schema extensibility is user-definable. /// Consult the protocol documentation to change and/or insert declarations. /// Use wsdl2h option -x to remove this element. /// Attribute Algorithm of type xs:anyURI. @char* /*URI*/ Algorithm 1; ///< Required attribute. }; /// "http://www.w3.org/2000/09/xmldsig#":KeyValueType is a complexType. struct ds__KeyValueType { /// CHOICE OF ELEMENTS /// Element reference "http://www.w3.org/2000/09/xmldsig#":DSAKeyValue. struct ds__DSAKeyValueType* DSAKeyValue 1; ///< Required element. /// Element reference "http://www.w3.org/2000/09/xmldsig#":RSAKeyValue. struct ds__RSAKeyValueType* RSAKeyValue 1; ///< Required element. /// TODO: /// Schema extensibility is user-definable. /// Consult the protocol documentation to change and/or insert declarations. /// Use wsdl2h option -x to remove this element. // END OF CHOICE }; /// "http://www.w3.org/2000/09/xmldsig#":RetrievalMethodType is a complexType. struct ds__RetrievalMethodType { /// Element reference "http://www.w3.org/2000/09/xmldsig#":Transforms. struct ds__TransformsType* Transforms 0; ///< Optional element. /// Attribute URI of type xs:anyURI. @char* /*URI*/ URI 0; ///< Optional attribute. /// Attribute Type of type xs:anyURI. @char* /*URI*/ Type 0; ///< Optional attribute. }; /// "http://www.w3.org/2000/09/xmldsig#":X509DataType is a complexType. struct ds__X509DataType { /// CHOICE OF ELEMENTS /// Element X509IssuerSerial of type "http://www.w3.org/2000/09/xmldsig#":X509IssuerSerialType. struct ds__X509IssuerSerialType* X509IssuerSerial 1; ///< Required element. /// Element X509SKI of type xs:base64Binary. char* /*base64*/ X509SKI 1; ///< Required element. /// Element X509SubjectName of type xs:string. char* X509SubjectName 1; ///< Required element. /// Element X509Certificate of type xs:base64Binary. char* /*base64*/ X509Certificate 1; ///< Required element. /// Element X509CRL of type xs:base64Binary. char* /*base64*/ X509CRL 1; ///< Required element. /// TODO: /// Schema extensibility is user-definable. /// Consult the protocol documentation to change and/or insert declarations. /// Use wsdl2h option -x to remove this element. // END OF CHOICE }; /// "http://www.w3.org/2000/09/xmldsig#":X509IssuerSerialType is a complexType. struct ds__X509IssuerSerialType { /// Element X509IssuerName of type xs:string. char* X509IssuerName 1; ///< Required element. /// Element X509SerialNumber of type xs:integer. char* X509SerialNumber 1; ///< Required element. }; /// "http://www.w3.org/2000/09/xmldsig#":DSAKeyValueType is a complexType. struct ds__DSAKeyValueType { /// Element G of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ G 0; ///< Optional element. /// Element Y of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ Y 1; ///< Required element. /// Element J of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ J 0; ///< Optional element. /// Element P of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ P 1; ///< Required element. /// Element Q of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ Q 1; ///< Required element. /// Element Seed of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ Seed 1; ///< Required element. /// Element PgenCounter of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ PgenCounter 1; ///< Required element. }; /// "http://www.w3.org/2000/09/xmldsig#":RSAKeyValueType is a complexType. struct ds__RSAKeyValueType { /// Element Modulus of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ Modulus 1; ///< Required element. /// Element Exponent of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ Exponent 1; ///< Required element. }; /// Element "http://www.w3.org/2000/09/xmldsig#":Signature of complexType "http://www.w3.org/2000/09/xmldsig#":SignatureType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":SignatureValue of complexType "http://www.w3.org/2000/09/xmldsig#":SignatureValueType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":SignedInfo of complexType "http://www.w3.org/2000/09/xmldsig#":SignedInfoType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":CanonicalizationMethod of complexType "http://www.w3.org/2000/09/xmldsig#":CanonicalizationMethodType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":SignatureMethod of complexType "http://www.w3.org/2000/09/xmldsig#":SignatureMethodType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":Reference of complexType "http://www.w3.org/2000/09/xmldsig#":ReferenceType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":Transforms of complexType "http://www.w3.org/2000/09/xmldsig#":TransformsType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":Transform of complexType "http://www.w3.org/2000/09/xmldsig#":TransformType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":DigestMethod of complexType "http://www.w3.org/2000/09/xmldsig#":DigestMethodType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":DigestValue of complexType "http://www.w3.org/2000/09/xmldsig#":DigestValueType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":KeyInfo of complexType "http://www.w3.org/2000/09/xmldsig#":KeyInfoType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":KeyName of complexType xs:string. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":MgmtData of complexType xs:string. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":KeyValue of complexType "http://www.w3.org/2000/09/xmldsig#":KeyValueType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":RetrievalMethod of complexType "http://www.w3.org/2000/09/xmldsig#":RetrievalMethodType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":X509Data of complexType "http://www.w3.org/2000/09/xmldsig#":X509DataType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":PGPData of complexType "http://www.w3.org/2000/09/xmldsig#":PGPDataType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":SPKIData of complexType "http://www.w3.org/2000/09/xmldsig#":SPKIDataType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":Object of complexType "http://www.w3.org/2000/09/xmldsig#":ObjectType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":Manifest of complexType "http://www.w3.org/2000/09/xmldsig#":ManifestType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":SignatureProperties of complexType "http://www.w3.org/2000/09/xmldsig#":SignaturePropertiesType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":SignatureProperty of complexType "http://www.w3.org/2000/09/xmldsig#":SignaturePropertyType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":DSAKeyValue of complexType "http://www.w3.org/2000/09/xmldsig#":DSAKeyValueType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":RSAKeyValue of complexType "http://www.w3.org/2000/09/xmldsig#":RSAKeyValueType. /// Note: use wsdl2h option -g to generate this global element declaration. /* End of ds.h */ gsoap-2.8.91/gsoap/import/wstx2.h0000644000175000017500000001405113525245161016154 0ustar ellertellert/* wstx2.h WS-Trust definitions: SOAP Header definitions for WS-Trust 2005/02 WS-Trust operations Imported by import/wst.h gSOAP XML Web services tools Copyright (C) 2000-2015, 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. -------------------------------------------------------------------------------- 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-2015, 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 -------------------------------------------------------------------------------- */ mutable struct SOAP_ENV__Header { int __sizeIssuedTokens 0; ///< size of the array struct wst__RequestSecurityTokenResponseCollectionType *wst__IssuedTokens 0; ///< array of tokens char* wst__RequestType 0; }; //gsoap wst service name: wst //gsoap wst service method-header-part: RequestSecurityToken wsa5__MessageID //gsoap wst service method-header-part: RequestSecurityToken wsa5__RelatesTo //gsoap wst service method-header-part: RequestSecurityToken wsa5__From //gsoap wst service method-header-part: RequestSecurityToken wsa5__ReplyTo //gsoap wst service method-header-part: RequestSecurityToken wsa5__FaultTo //gsoap wst service method-header-part: RequestSecurityToken wsa5__To //gsoap wst service method-header-part: RequestSecurityToken wsa5__Action //gsoap wst service method-header-part: RequestSecurityToken wst__RequestType //gsoap wst service method-action: RequestSecurityToken http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue //gsoap wst service method-output-action: RequestSecurityToken http://schemas.xmlsoap.org/ws/2005/02/trust/RSTR/Issue int __wst__RequestSecurityToken( struct wst__RequestSecurityTokenType *wst__RequestSecurityToken, ///< request message struct wst__RequestSecurityTokenResponseType *wst__RequestSecurityTokenResponse ///< response message ); //gsoap wst service method-header-part: RequestSecurityTokenResponse wsa5__MessageID //gsoap wst service method-header-part: RequestSecurityTokenResponse wsa5__RelatesTo //gsoap wst service method-header-part: RequestSecurityTokenResponse wsa5__From //gsoap wst service method-header-part: RequestSecurityTokenResponse wsa5__ReplyTo //gsoap wst service method-header-part: RequestSecurityTokenResponse wsa5__FaultTo //gsoap wst service method-header-part: RequestSecurityTokenResponse wsa5__To //gsoap wst service method-header-part: RequestSecurityTokenResponse wsa5__Action //gsoap wst service method-header-part: RequestSecurityTokenResponse wst__RequestType //gsoap wst service method-action: RequestSecurityTokenResponse http://schemas.xmlsoap.org/ws/2005/02/trust/RSTR/Issue //gsoap wst service method-output-action: RequestSecurityTokenCollection http://schemas.xmlsoap.org/ws/2005/02/trust/RSTRC/IssueFinal int __wst__RequestSecurityTokenResponse( struct wst__RequestSecurityTokenResponseType *wst__RequestSecurityTokenResponse, ///< request message struct wst__RequestSecurityTokenResponseCollectionType *wst__RequestSecurityTokenResponseCollection ///< response message ); //gsoap wst service method-header-part: RequestSecurityTokenCollection wsa5__MessageID //gsoap wst service method-header-part: RequestSecurityTokenCollection wsa5__RelatesTo //gsoap wst service method-header-part: RequestSecurityTokenCollection wsa5__From //gsoap wst service method-header-part: RequestSecurityTokenCollection wsa5__ReplyTo //gsoap wst service method-header-part: RequestSecurityTokenCollection wsa5__FaultTo //gsoap wst service method-header-part: RequestSecurityTokenCollection wsa5__To //gsoap wst service method-header-part: RequestSecurityTokenCollection wsa5__Action //gsoap wst service method-header-part: RequestSecurityTokenCollection wst__RequestType //gsoap wst service method-action: RequestSecurityTokenCollection http://schemas.xmlsoap.org/ws/2005/02/trust/RSTC/Issue //gsoap wst service method-output-action: RequestSecurityTokenCollection http://schemas.xmlsoap.org/ws/2005/02/trust/RSTRC/IssueFinal int __wst__RequestSecurityTokenCollection( struct wst__RequestSecurityTokenCollectionType *wst__RequestSecurityTokenCollection, ///< request message struct wst__RequestSecurityTokenResponseCollectionType *wst__RequestSecurityTokenResponseCollection ///< response message ); gsoap-2.8.91/gsoap/import/wst2.h0000644000175000017500000034750413525245161016000 0ustar ellertellert/* wst2.h WS-Trust 2005/02 with SAML 1.0/2.0, also accepts 2005/12 Generated with: wsdl2h -cguxy -o wst2.h -t WS/WS-typemap.dat WS/WS-Trust.xsd - Removed //gsoapopt - Changed http://docs.oasis-open.org/ws-sx/ws-trust/200512 to http://schemas.xmlsoap.org/ws/2005/02/trust - Changed http://docs.oasis-open.org/ws-sx/ws-trust/200512 to remove trailing / - Changed //gsoap wst schema namespace directive to import directive - Added //gsoap wst schema namespace2 directive - Added #import "wsp_appliesto.h" - Added #import "wstx2.h" at the end of these definitions */ /******************************************************************************\ * * * Definitions * * http://docs.oasis-open.org/ws-sx/ws-trust/200512/ * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ #import "wsse.h" // wsse = #import "wsu.h" // wsu = #import "wsa5.h" // wsa5 = #import "wsp_appliesto.h" /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ #define SOAP_NAMESPACE_OF_wst "http://schemas.xmlsoap.org/ws/2005/02/trust" //gsoap wst schema import: http://schemas.xmlsoap.org/ws/2005/02/trust //gsoap wst schema namespace2: http://docs.oasis-open.org/ws-sx/ws-trust/200512 //gsoap wst schema elementForm: qualified //gsoap wst schema attributeForm: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ // Imported XSD type ""http://www.w3.org/2005/08/addressing":EndpointReferenceType" defined by wsa5__EndpointReferenceType. /// Imported element ""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityTokenReference" from typemap WS/WS-typemap.dat. /// @brief Typedef synonym for struct wst__RequestSecurityTokenType. typedef struct wst__RequestSecurityTokenType wst__RequestSecurityTokenType; /// @brief Typedef synonym for struct wst__RequestSecurityTokenResponseType. typedef struct wst__RequestSecurityTokenResponseType wst__RequestSecurityTokenResponseType; /// Imported complexType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedSecurityTokenType from typemap "WS/WS-typemap.dat". #import "saml1.h" #import "saml2.h" typedef struct wst__RequestedSecurityTokenType { saml1__AssertionType *saml1__Assertion; saml2__AssertionType *saml2__Assertion; _wsse__SecurityTokenReference *wsse__SecurityTokenReference; struct wsc__SecurityContextTokenType *wsc__SecurityContextToken; } wst__RequestedSecurityTokenType; /// @brief Typedef synonym for struct wst__BinarySecretType. typedef struct wst__BinarySecretType wst__BinarySecretType; /// @brief Typedef synonym for struct wst__ClaimsType. typedef struct wst__ClaimsType wst__ClaimsType; /// Imported complexType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":EntropyType from typemap "WS/WS-typemap.dat". typedef struct wst__EntropyType { struct wst__BinarySecretType *BinarySecret; } wst__EntropyType; /// @brief Typedef synonym for struct wst__LifetimeType. typedef struct wst__LifetimeType wst__LifetimeType; /// @brief Typedef synonym for struct wst__RequestSecurityTokenCollectionType. typedef struct wst__RequestSecurityTokenCollectionType wst__RequestSecurityTokenCollectionType; /// @brief Typedef synonym for struct wst__RequestSecurityTokenResponseCollectionType. typedef struct wst__RequestSecurityTokenResponseCollectionType wst__RequestSecurityTokenResponseCollectionType; /// @brief Typedef synonym for struct wst__RequestedReferenceType. typedef struct wst__RequestedReferenceType wst__RequestedReferenceType; /// @brief Typedef synonym for struct wst__RequestedProofTokenType. typedef struct wst__RequestedProofTokenType wst__RequestedProofTokenType; /// @brief Typedef synonym for struct wst__RenewTargetType. typedef struct wst__RenewTargetType wst__RenewTargetType; /// @brief Typedef synonym for struct wst__AllowPostdatingType. typedef struct wst__AllowPostdatingType wst__AllowPostdatingType; /// @brief Typedef synonym for struct wst__RenewingType. typedef struct wst__RenewingType wst__RenewingType; /// @brief Typedef synonym for struct wst__CancelTargetType. typedef struct wst__CancelTargetType wst__CancelTargetType; /// @brief Typedef synonym for struct wst__RequestedTokenCancelledType. typedef struct wst__RequestedTokenCancelledType wst__RequestedTokenCancelledType; /// @brief Typedef synonym for struct wst__ValidateTargetType. typedef struct wst__ValidateTargetType wst__ValidateTargetType; /// @brief Typedef synonym for struct wst__StatusType. typedef struct wst__StatusType wst__StatusType; /// @brief Typedef synonym for struct wst__SignChallengeType. typedef struct wst__SignChallengeType wst__SignChallengeType; /// @brief Typedef synonym for struct wst__BinaryExchangeType. typedef struct wst__BinaryExchangeType wst__BinaryExchangeType; /// @brief Typedef synonym for struct wst__RequestKETType. typedef struct wst__RequestKETType wst__RequestKETType; /// @brief Typedef synonym for struct wst__KeyExchangeTokenType. typedef struct wst__KeyExchangeTokenType wst__KeyExchangeTokenType; /// Imported complexType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":AuthenticatorType from typemap "WS/WS-typemap.dat". typedef struct wst__AuthenticatorType { char *CombinedHash; } wst__AuthenticatorType; /// @brief Typedef synonym for struct wst__OnBehalfOfType. typedef struct wst__OnBehalfOfType wst__OnBehalfOfType; /// @brief Typedef synonym for struct wst__EncryptionType. typedef struct wst__EncryptionType wst__EncryptionType; /// @brief Typedef synonym for struct wst__ProofEncryptionType. typedef struct wst__ProofEncryptionType wst__ProofEncryptionType; /// @brief Typedef synonym for struct wst__UseKeyType. typedef struct wst__UseKeyType wst__UseKeyType; /// @brief Typedef synonym for struct wst__DelegateToType. typedef struct wst__DelegateToType wst__DelegateToType; /// @brief Typedef synonym for struct wst__ParticipantsType. typedef struct wst__ParticipantsType wst__ParticipantsType; /// @brief Typedef synonym for struct wst__ParticipantType. typedef struct wst__ParticipantType wst__ParticipantType; /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://docs.oasis-open.org/ws-sx/ws-trust/200512/ * * * \******************************************************************************/ /// Imported simpleType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestTypeOpenEnum from typemap "WS/WS-typemap.dat". // simpleType definition intentionally left blank. /// Imported simpleType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":BinarySecretTypeOpenEnum from typemap "WS/WS-typemap.dat". // simpleType definition intentionally left blank. /// Imported simpleType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ComputedKeyOpenEnum from typemap "WS/WS-typemap.dat". // simpleType definition intentionally left blank. /// Imported simpleType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":StatusCodeOpenEnum from typemap "WS/WS-typemap.dat". // simpleType definition intentionally left blank. /// Imported simpleType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":KeyTypeOpenEnum from typemap "WS/WS-typemap.dat". // simpleType definition intentionally left blank. /// Imported simpleType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestTypeEnum from typemap "WS/WS-typemap.dat". // simpleType definition intentionally left blank. /// Imported simpleType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":BinarySecretTypeEnum from typemap "WS/WS-typemap.dat". // simpleType definition intentionally left blank. /// Imported simpleType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ComputedKeyEnum from typemap "WS/WS-typemap.dat". // simpleType definition intentionally left blank. /// Imported simpleType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":StatusCodeEnum from typemap "WS/WS-typemap.dat". // simpleType definition intentionally left blank. /// Imported simpleType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":KeyTypeEnum from typemap "WS/WS-typemap.dat". // simpleType definition intentionally left blank. /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://docs.oasis-open.org/ws-sx/ws-trust/200512/ * * * \******************************************************************************/ /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenType is a complexType. /// ///
/// Actual content model is non-deterministic, hence wildcard. The following shows intended content model: /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// ///
/// struct wst__RequestSecurityTokenType operations: /// - wst__RequestSecurityTokenType* soap_new_wst__RequestSecurityTokenType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__RequestSecurityTokenType(struct soap*, wst__RequestSecurityTokenType*) default initialize members /// - int soap_read_wst__RequestSecurityTokenType(struct soap*, wst__RequestSecurityTokenType*) deserialize from a source /// - int soap_write_wst__RequestSecurityTokenType(struct soap*, wst__RequestSecurityTokenType*) serialize to a sink /// - wst__RequestSecurityTokenType* soap_dup_wst__RequestSecurityTokenType(struct soap*, wst__RequestSecurityTokenType* dst, wst__RequestSecurityTokenType *src) returns deep copy of wst__RequestSecurityTokenType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__RequestSecurityTokenType(wst__RequestSecurityTokenType*) deep deletes wst__RequestSecurityTokenType data members, use only on dst after soap_dup_wst__RequestSecurityTokenType(NULL, wst__RequestSecurityTokenType *dst, wst__RequestSecurityTokenType *src) (use soapcpp2 -Ed) struct wst__RequestSecurityTokenType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// Attribute "Context" of XSD type xs:anyURI. @char* Context 0; ///< Optional attribute. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). /// Member declared in WS/WS-typemap.dat _wsp__AppliesTo_* wsp__AppliesTo; /// Member declared in WS/WS-typemap.dat char* KeyType; /// Member declared in WS/WS-typemap.dat char* RequestType; /// Member declared in WS/WS-typemap.dat char* TokenType; /// Member declared in WS/WS-typemap.dat wst__EntropyType* Entropy; /// Member declared in WS/WS-typemap.dat char* ComputedKeyAlgorithm; /// Member declared in WS/WS-typemap.dat unsigned int* KeySize; /// Member declared in WS/WS-typemap.dat struct wst__BinaryExchangeType* BinaryExchange; /// Member declared in WS/WS-typemap.dat struct wst__AuthenticatorType* Authenticator; }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenResponseType is a complexType. /// ///
/// Actual content model is non-deterministic, hence wildcard. The following shows intended content model: /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// ///
/// struct wst__RequestSecurityTokenResponseType operations: /// - wst__RequestSecurityTokenResponseType* soap_new_wst__RequestSecurityTokenResponseType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__RequestSecurityTokenResponseType(struct soap*, wst__RequestSecurityTokenResponseType*) default initialize members /// - int soap_read_wst__RequestSecurityTokenResponseType(struct soap*, wst__RequestSecurityTokenResponseType*) deserialize from a source /// - int soap_write_wst__RequestSecurityTokenResponseType(struct soap*, wst__RequestSecurityTokenResponseType*) serialize to a sink /// - wst__RequestSecurityTokenResponseType* soap_dup_wst__RequestSecurityTokenResponseType(struct soap*, wst__RequestSecurityTokenResponseType* dst, wst__RequestSecurityTokenResponseType *src) returns deep copy of wst__RequestSecurityTokenResponseType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__RequestSecurityTokenResponseType(wst__RequestSecurityTokenResponseType*) deep deletes wst__RequestSecurityTokenResponseType data members, use only on dst after soap_dup_wst__RequestSecurityTokenResponseType(NULL, wst__RequestSecurityTokenResponseType *dst, wst__RequestSecurityTokenResponseType *src) (use soapcpp2 -Ed) struct wst__RequestSecurityTokenResponseType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// Attribute "Context" of XSD type xs:anyURI. @char* Context 0; ///< Optional attribute. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). /// Member declared in WS/WS-typemap.dat struct wst__RequestedSecurityTokenType* RequestedSecurityToken; /// Member declared in WS/WS-typemap.dat struct wst__RequestedReferenceType* RequestedAttachedReference; /// Member declared in WS/WS-typemap.dat struct wst__RequestedReferenceType* RequestedUnattachedReference; /// Member declared in WS/WS-typemap.dat struct wst__RequestedProofTokenType* RequestedProofToken; /// Member declared in WS/WS-typemap.dat char* KeyType; /// Member declared in WS/WS-typemap.dat char* RequestType; /// Member declared in WS/WS-typemap.dat char* TokenType; /// Member declared in WS/WS-typemap.dat wst__EntropyType* Entropy; /// Member declared in WS/WS-typemap.dat struct wst__LifetimeType* Lifetime; /// Member declared in WS/WS-typemap.dat unsigned int* KeySize; /// Member declared in WS/WS-typemap.dat struct wst__BinaryExchangeType* BinaryExchange; /// Member declared in WS/WS-typemap.dat struct wst__AuthenticatorType* Authenticator; }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ClaimsType is a complexType. /// /// struct wst__ClaimsType operations: /// - wst__ClaimsType* soap_new_wst__ClaimsType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__ClaimsType(struct soap*, wst__ClaimsType*) default initialize members /// - int soap_read_wst__ClaimsType(struct soap*, wst__ClaimsType*) deserialize from a source /// - int soap_write_wst__ClaimsType(struct soap*, wst__ClaimsType*) serialize to a sink /// - wst__ClaimsType* soap_dup_wst__ClaimsType(struct soap*, wst__ClaimsType* dst, wst__ClaimsType *src) returns deep copy of wst__ClaimsType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__ClaimsType(wst__ClaimsType*) deep deletes wst__ClaimsType data members, use only on dst after soap_dup_wst__ClaimsType(NULL, wst__ClaimsType *dst, wst__ClaimsType *src) (use soapcpp2 -Ed) struct wst__ClaimsType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// Attribute "Dialect" of XSD type xs:anyURI. @char* Dialect 0; ///< Optional attribute. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":LifetimeType is a complexType. /// /// struct wst__LifetimeType operations: /// - wst__LifetimeType* soap_new_wst__LifetimeType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__LifetimeType(struct soap*, wst__LifetimeType*) default initialize members /// - int soap_read_wst__LifetimeType(struct soap*, wst__LifetimeType*) deserialize from a source /// - int soap_write_wst__LifetimeType(struct soap*, wst__LifetimeType*) serialize to a sink /// - wst__LifetimeType* soap_dup_wst__LifetimeType(struct soap*, wst__LifetimeType* dst, wst__LifetimeType *src) returns deep copy of wst__LifetimeType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__LifetimeType(wst__LifetimeType*) deep deletes wst__LifetimeType data members, use only on dst after soap_dup_wst__LifetimeType(NULL, wst__LifetimeType *dst, wst__LifetimeType *src) (use soapcpp2 -Ed) struct wst__LifetimeType { /// Imported element reference "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd":Created. char* wsu__Created 0; ///< Optional element. /// Imported element reference "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd":Expires. char* wsu__Expires 0; ///< Optional element. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenCollectionType is a complexType. /// ///
/// The RequestSecurityTokenCollection (RSTC) element is used to provide multiple RST requests. One or more RSTR elements in an RSTRC element are returned in the response to the RequestSecurityTokenCollection. ///
/// struct wst__RequestSecurityTokenCollectionType operations: /// - wst__RequestSecurityTokenCollectionType* soap_new_wst__RequestSecurityTokenCollectionType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__RequestSecurityTokenCollectionType(struct soap*, wst__RequestSecurityTokenCollectionType*) default initialize members /// - int soap_read_wst__RequestSecurityTokenCollectionType(struct soap*, wst__RequestSecurityTokenCollectionType*) deserialize from a source /// - int soap_write_wst__RequestSecurityTokenCollectionType(struct soap*, wst__RequestSecurityTokenCollectionType*) serialize to a sink /// - wst__RequestSecurityTokenCollectionType* soap_dup_wst__RequestSecurityTokenCollectionType(struct soap*, wst__RequestSecurityTokenCollectionType* dst, wst__RequestSecurityTokenCollectionType *src) returns deep copy of wst__RequestSecurityTokenCollectionType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__RequestSecurityTokenCollectionType(wst__RequestSecurityTokenCollectionType*) deep deletes wst__RequestSecurityTokenCollectionType data members, use only on dst after soap_dup_wst__RequestSecurityTokenCollectionType(NULL, wst__RequestSecurityTokenCollectionType *dst, wst__RequestSecurityTokenCollectionType *src) (use soapcpp2 -Ed) struct wst__RequestSecurityTokenCollectionType { /// Size of array of struct wst__RequestSecurityTokenType* is 2..unbounded. $int __sizeRequestSecurityToken 2; /// Array struct wst__RequestSecurityTokenType* of size 2..unbounded. struct wst__RequestSecurityTokenType* RequestSecurityToken 2; }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenResponseCollectionType is a complexType. /// ///
/// The element (RSTRC) MUST be used to return a security token or response to a security token request on the final response. ///
/// struct wst__RequestSecurityTokenResponseCollectionType operations: /// - wst__RequestSecurityTokenResponseCollectionType* soap_new_wst__RequestSecurityTokenResponseCollectionType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__RequestSecurityTokenResponseCollectionType(struct soap*, wst__RequestSecurityTokenResponseCollectionType*) default initialize members /// - int soap_read_wst__RequestSecurityTokenResponseCollectionType(struct soap*, wst__RequestSecurityTokenResponseCollectionType*) deserialize from a source /// - int soap_write_wst__RequestSecurityTokenResponseCollectionType(struct soap*, wst__RequestSecurityTokenResponseCollectionType*) serialize to a sink /// - wst__RequestSecurityTokenResponseCollectionType* soap_dup_wst__RequestSecurityTokenResponseCollectionType(struct soap*, wst__RequestSecurityTokenResponseCollectionType* dst, wst__RequestSecurityTokenResponseCollectionType *src) returns deep copy of wst__RequestSecurityTokenResponseCollectionType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__RequestSecurityTokenResponseCollectionType(wst__RequestSecurityTokenResponseCollectionType*) deep deletes wst__RequestSecurityTokenResponseCollectionType data members, use only on dst after soap_dup_wst__RequestSecurityTokenResponseCollectionType(NULL, wst__RequestSecurityTokenResponseCollectionType *dst, wst__RequestSecurityTokenResponseCollectionType *src) (use soapcpp2 -Ed) struct wst__RequestSecurityTokenResponseCollectionType { /// Size of the dynamic array of struct wst__RequestSecurityTokenResponseType* is 1..unbounded. $int __sizeRequestSecurityTokenResponse 1; /// Array struct wst__RequestSecurityTokenResponseType* of size 1..unbounded. struct wst__RequestSecurityTokenResponseType* RequestSecurityTokenResponse 1; /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedReferenceType is a complexType. /// /// struct wst__RequestedReferenceType operations: /// - wst__RequestedReferenceType* soap_new_wst__RequestedReferenceType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__RequestedReferenceType(struct soap*, wst__RequestedReferenceType*) default initialize members /// - int soap_read_wst__RequestedReferenceType(struct soap*, wst__RequestedReferenceType*) deserialize from a source /// - int soap_write_wst__RequestedReferenceType(struct soap*, wst__RequestedReferenceType*) serialize to a sink /// - wst__RequestedReferenceType* soap_dup_wst__RequestedReferenceType(struct soap*, wst__RequestedReferenceType* dst, wst__RequestedReferenceType *src) returns deep copy of wst__RequestedReferenceType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__RequestedReferenceType(wst__RequestedReferenceType*) deep deletes wst__RequestedReferenceType data members, use only on dst after soap_dup_wst__RequestedReferenceType(NULL, wst__RequestedReferenceType *dst, wst__RequestedReferenceType *src) (use soapcpp2 -Ed) struct wst__RequestedReferenceType { /// Imported element reference "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityTokenReference. _wsse__SecurityTokenReference wsse__SecurityTokenReference 1; ///< Required element. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedProofTokenType is a complexType. /// /// struct wst__RequestedProofTokenType operations: /// - wst__RequestedProofTokenType* soap_new_wst__RequestedProofTokenType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__RequestedProofTokenType(struct soap*, wst__RequestedProofTokenType*) default initialize members /// - int soap_read_wst__RequestedProofTokenType(struct soap*, wst__RequestedProofTokenType*) deserialize from a source /// - int soap_write_wst__RequestedProofTokenType(struct soap*, wst__RequestedProofTokenType*) serialize to a sink /// - wst__RequestedProofTokenType* soap_dup_wst__RequestedProofTokenType(struct soap*, wst__RequestedProofTokenType* dst, wst__RequestedProofTokenType *src) returns deep copy of wst__RequestedProofTokenType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__RequestedProofTokenType(wst__RequestedProofTokenType*) deep deletes wst__RequestedProofTokenType data members, use only on dst after soap_dup_wst__RequestedProofTokenType(NULL, wst__RequestedProofTokenType *dst, wst__RequestedProofTokenType *src) (use soapcpp2 -Ed) struct wst__RequestedProofTokenType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// Member declared in WS/WS-typemap.dat struct xenc__EncryptedKeyType* xenc__EncryptedKey; }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RenewTargetType is a complexType. /// /// struct wst__RenewTargetType operations: /// - wst__RenewTargetType* soap_new_wst__RenewTargetType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__RenewTargetType(struct soap*, wst__RenewTargetType*) default initialize members /// - int soap_read_wst__RenewTargetType(struct soap*, wst__RenewTargetType*) deserialize from a source /// - int soap_write_wst__RenewTargetType(struct soap*, wst__RenewTargetType*) serialize to a sink /// - wst__RenewTargetType* soap_dup_wst__RenewTargetType(struct soap*, wst__RenewTargetType* dst, wst__RenewTargetType *src) returns deep copy of wst__RenewTargetType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__RenewTargetType(wst__RenewTargetType*) deep deletes wst__RenewTargetType data members, use only on dst after soap_dup_wst__RenewTargetType(NULL, wst__RenewTargetType *dst, wst__RenewTargetType *src) (use soapcpp2 -Ed) struct wst__RenewTargetType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":AllowPostdatingType is a complexType. /// /// struct wst__AllowPostdatingType operations: /// - wst__AllowPostdatingType* soap_new_wst__AllowPostdatingType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__AllowPostdatingType(struct soap*, wst__AllowPostdatingType*) default initialize members /// - int soap_read_wst__AllowPostdatingType(struct soap*, wst__AllowPostdatingType*) deserialize from a source /// - int soap_write_wst__AllowPostdatingType(struct soap*, wst__AllowPostdatingType*) serialize to a sink /// - wst__AllowPostdatingType* soap_dup_wst__AllowPostdatingType(struct soap*, wst__AllowPostdatingType* dst, wst__AllowPostdatingType *src) returns deep copy of wst__AllowPostdatingType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__AllowPostdatingType(wst__AllowPostdatingType*) deep deletes wst__AllowPostdatingType data members, use only on dst after soap_dup_wst__AllowPostdatingType(NULL, wst__AllowPostdatingType *dst, wst__AllowPostdatingType *src) (use soapcpp2 -Ed) struct wst__AllowPostdatingType { }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RenewingType is a complexType. /// /// struct wst__RenewingType operations: /// - wst__RenewingType* soap_new_wst__RenewingType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__RenewingType(struct soap*, wst__RenewingType*) default initialize members /// - int soap_read_wst__RenewingType(struct soap*, wst__RenewingType*) deserialize from a source /// - int soap_write_wst__RenewingType(struct soap*, wst__RenewingType*) serialize to a sink /// - wst__RenewingType* soap_dup_wst__RenewingType(struct soap*, wst__RenewingType* dst, wst__RenewingType *src) returns deep copy of wst__RenewingType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__RenewingType(wst__RenewingType*) deep deletes wst__RenewingType data members, use only on dst after soap_dup_wst__RenewingType(NULL, wst__RenewingType *dst, wst__RenewingType *src) (use soapcpp2 -Ed) struct wst__RenewingType { /// Attribute "Allow" of XSD type xs:boolean. @char* Allow 0; ///< Optional attribute. /// Attribute "OK" of XSD type xs:boolean. @char* OK 0; ///< Optional attribute. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":CancelTargetType is a complexType. /// /// struct wst__CancelTargetType operations: /// - wst__CancelTargetType* soap_new_wst__CancelTargetType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__CancelTargetType(struct soap*, wst__CancelTargetType*) default initialize members /// - int soap_read_wst__CancelTargetType(struct soap*, wst__CancelTargetType*) deserialize from a source /// - int soap_write_wst__CancelTargetType(struct soap*, wst__CancelTargetType*) serialize to a sink /// - wst__CancelTargetType* soap_dup_wst__CancelTargetType(struct soap*, wst__CancelTargetType* dst, wst__CancelTargetType *src) returns deep copy of wst__CancelTargetType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__CancelTargetType(wst__CancelTargetType*) deep deletes wst__CancelTargetType data members, use only on dst after soap_dup_wst__CancelTargetType(NULL, wst__CancelTargetType *dst, wst__CancelTargetType *src) (use soapcpp2 -Ed) struct wst__CancelTargetType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedTokenCancelledType is a complexType. /// /// struct wst__RequestedTokenCancelledType operations: /// - wst__RequestedTokenCancelledType* soap_new_wst__RequestedTokenCancelledType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__RequestedTokenCancelledType(struct soap*, wst__RequestedTokenCancelledType*) default initialize members /// - int soap_read_wst__RequestedTokenCancelledType(struct soap*, wst__RequestedTokenCancelledType*) deserialize from a source /// - int soap_write_wst__RequestedTokenCancelledType(struct soap*, wst__RequestedTokenCancelledType*) serialize to a sink /// - wst__RequestedTokenCancelledType* soap_dup_wst__RequestedTokenCancelledType(struct soap*, wst__RequestedTokenCancelledType* dst, wst__RequestedTokenCancelledType *src) returns deep copy of wst__RequestedTokenCancelledType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__RequestedTokenCancelledType(wst__RequestedTokenCancelledType*) deep deletes wst__RequestedTokenCancelledType data members, use only on dst after soap_dup_wst__RequestedTokenCancelledType(NULL, wst__RequestedTokenCancelledType *dst, wst__RequestedTokenCancelledType *src) (use soapcpp2 -Ed) struct wst__RequestedTokenCancelledType { }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ValidateTargetType is a complexType. /// /// struct wst__ValidateTargetType operations: /// - wst__ValidateTargetType* soap_new_wst__ValidateTargetType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__ValidateTargetType(struct soap*, wst__ValidateTargetType*) default initialize members /// - int soap_read_wst__ValidateTargetType(struct soap*, wst__ValidateTargetType*) deserialize from a source /// - int soap_write_wst__ValidateTargetType(struct soap*, wst__ValidateTargetType*) serialize to a sink /// - wst__ValidateTargetType* soap_dup_wst__ValidateTargetType(struct soap*, wst__ValidateTargetType* dst, wst__ValidateTargetType *src) returns deep copy of wst__ValidateTargetType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__ValidateTargetType(wst__ValidateTargetType*) deep deletes wst__ValidateTargetType data members, use only on dst after soap_dup_wst__ValidateTargetType(NULL, wst__ValidateTargetType *dst, wst__ValidateTargetType *src) (use soapcpp2 -Ed) struct wst__ValidateTargetType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":StatusType is a complexType. /// /// struct wst__StatusType operations: /// - wst__StatusType* soap_new_wst__StatusType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__StatusType(struct soap*, wst__StatusType*) default initialize members /// - int soap_read_wst__StatusType(struct soap*, wst__StatusType*) deserialize from a source /// - int soap_write_wst__StatusType(struct soap*, wst__StatusType*) serialize to a sink /// - wst__StatusType* soap_dup_wst__StatusType(struct soap*, wst__StatusType* dst, wst__StatusType *src) returns deep copy of wst__StatusType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__StatusType(wst__StatusType*) deep deletes wst__StatusType data members, use only on dst after soap_dup_wst__StatusType(NULL, wst__StatusType *dst, wst__StatusType *src) (use soapcpp2 -Ed) struct wst__StatusType { /// Element "Code" of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":StatusCodeOpenEnum. char* Code 1; ///< Required element. /// Element "Reason" of XSD type xs:string. char* Reason 0; ///< Optional element. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":SignChallengeType is a complexType. /// /// struct wst__SignChallengeType operations: /// - wst__SignChallengeType* soap_new_wst__SignChallengeType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__SignChallengeType(struct soap*, wst__SignChallengeType*) default initialize members /// - int soap_read_wst__SignChallengeType(struct soap*, wst__SignChallengeType*) deserialize from a source /// - int soap_write_wst__SignChallengeType(struct soap*, wst__SignChallengeType*) serialize to a sink /// - wst__SignChallengeType* soap_dup_wst__SignChallengeType(struct soap*, wst__SignChallengeType* dst, wst__SignChallengeType *src) returns deep copy of wst__SignChallengeType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__SignChallengeType(wst__SignChallengeType*) deep deletes wst__SignChallengeType data members, use only on dst after soap_dup_wst__SignChallengeType(NULL, wst__SignChallengeType *dst, wst__SignChallengeType *src) (use soapcpp2 -Ed) struct wst__SignChallengeType { /// Element reference "http://docs.oasis-open.org/ws-sx/ws-trust/200512/:""http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Challenge. char* Challenge 1; ///< Required element. /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestKETType is a complexType. /// /// struct wst__RequestKETType operations: /// - wst__RequestKETType* soap_new_wst__RequestKETType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__RequestKETType(struct soap*, wst__RequestKETType*) default initialize members /// - int soap_read_wst__RequestKETType(struct soap*, wst__RequestKETType*) deserialize from a source /// - int soap_write_wst__RequestKETType(struct soap*, wst__RequestKETType*) serialize to a sink /// - wst__RequestKETType* soap_dup_wst__RequestKETType(struct soap*, wst__RequestKETType* dst, wst__RequestKETType *src) returns deep copy of wst__RequestKETType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__RequestKETType(wst__RequestKETType*) deep deletes wst__RequestKETType data members, use only on dst after soap_dup_wst__RequestKETType(NULL, wst__RequestKETType *dst, wst__RequestKETType *src) (use soapcpp2 -Ed) struct wst__RequestKETType { }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":KeyExchangeTokenType is a complexType. /// /// struct wst__KeyExchangeTokenType operations: /// - wst__KeyExchangeTokenType* soap_new_wst__KeyExchangeTokenType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__KeyExchangeTokenType(struct soap*, wst__KeyExchangeTokenType*) default initialize members /// - int soap_read_wst__KeyExchangeTokenType(struct soap*, wst__KeyExchangeTokenType*) deserialize from a source /// - int soap_write_wst__KeyExchangeTokenType(struct soap*, wst__KeyExchangeTokenType*) serialize to a sink /// - wst__KeyExchangeTokenType* soap_dup_wst__KeyExchangeTokenType(struct soap*, wst__KeyExchangeTokenType* dst, wst__KeyExchangeTokenType *src) returns deep copy of wst__KeyExchangeTokenType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__KeyExchangeTokenType(wst__KeyExchangeTokenType*) deep deletes wst__KeyExchangeTokenType data members, use only on dst after soap_dup_wst__KeyExchangeTokenType(NULL, wst__KeyExchangeTokenType *dst, wst__KeyExchangeTokenType *src) (use soapcpp2 -Ed) struct wst__KeyExchangeTokenType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":OnBehalfOfType is a complexType. /// /// struct wst__OnBehalfOfType operations: /// - wst__OnBehalfOfType* soap_new_wst__OnBehalfOfType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__OnBehalfOfType(struct soap*, wst__OnBehalfOfType*) default initialize members /// - int soap_read_wst__OnBehalfOfType(struct soap*, wst__OnBehalfOfType*) deserialize from a source /// - int soap_write_wst__OnBehalfOfType(struct soap*, wst__OnBehalfOfType*) serialize to a sink /// - wst__OnBehalfOfType* soap_dup_wst__OnBehalfOfType(struct soap*, wst__OnBehalfOfType* dst, wst__OnBehalfOfType *src) returns deep copy of wst__OnBehalfOfType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__OnBehalfOfType(wst__OnBehalfOfType*) deep deletes wst__OnBehalfOfType data members, use only on dst after soap_dup_wst__OnBehalfOfType(NULL, wst__OnBehalfOfType *dst, wst__OnBehalfOfType *src) (use soapcpp2 -Ed) struct wst__OnBehalfOfType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":EncryptionType is a complexType. /// /// struct wst__EncryptionType operations: /// - wst__EncryptionType* soap_new_wst__EncryptionType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__EncryptionType(struct soap*, wst__EncryptionType*) default initialize members /// - int soap_read_wst__EncryptionType(struct soap*, wst__EncryptionType*) deserialize from a source /// - int soap_write_wst__EncryptionType(struct soap*, wst__EncryptionType*) serialize to a sink /// - wst__EncryptionType* soap_dup_wst__EncryptionType(struct soap*, wst__EncryptionType* dst, wst__EncryptionType *src) returns deep copy of wst__EncryptionType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__EncryptionType(wst__EncryptionType*) deep deletes wst__EncryptionType data members, use only on dst after soap_dup_wst__EncryptionType(NULL, wst__EncryptionType *dst, wst__EncryptionType *src) (use soapcpp2 -Ed) struct wst__EncryptionType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ProofEncryptionType is a complexType. /// /// struct wst__ProofEncryptionType operations: /// - wst__ProofEncryptionType* soap_new_wst__ProofEncryptionType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__ProofEncryptionType(struct soap*, wst__ProofEncryptionType*) default initialize members /// - int soap_read_wst__ProofEncryptionType(struct soap*, wst__ProofEncryptionType*) deserialize from a source /// - int soap_write_wst__ProofEncryptionType(struct soap*, wst__ProofEncryptionType*) serialize to a sink /// - wst__ProofEncryptionType* soap_dup_wst__ProofEncryptionType(struct soap*, wst__ProofEncryptionType* dst, wst__ProofEncryptionType *src) returns deep copy of wst__ProofEncryptionType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__ProofEncryptionType(wst__ProofEncryptionType*) deep deletes wst__ProofEncryptionType data members, use only on dst after soap_dup_wst__ProofEncryptionType(NULL, wst__ProofEncryptionType *dst, wst__ProofEncryptionType *src) (use soapcpp2 -Ed) struct wst__ProofEncryptionType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":UseKeyType is a complexType. /// /// struct wst__UseKeyType operations: /// - wst__UseKeyType* soap_new_wst__UseKeyType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__UseKeyType(struct soap*, wst__UseKeyType*) default initialize members /// - int soap_read_wst__UseKeyType(struct soap*, wst__UseKeyType*) deserialize from a source /// - int soap_write_wst__UseKeyType(struct soap*, wst__UseKeyType*) serialize to a sink /// - wst__UseKeyType* soap_dup_wst__UseKeyType(struct soap*, wst__UseKeyType* dst, wst__UseKeyType *src) returns deep copy of wst__UseKeyType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__UseKeyType(wst__UseKeyType*) deep deletes wst__UseKeyType data members, use only on dst after soap_dup_wst__UseKeyType(NULL, wst__UseKeyType *dst, wst__UseKeyType *src) (use soapcpp2 -Ed) struct wst__UseKeyType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// Attribute "Sig" of XSD type xs:anyURI. @char* Sig 0; ///< Optional attribute. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":DelegateToType is a complexType. /// /// struct wst__DelegateToType operations: /// - wst__DelegateToType* soap_new_wst__DelegateToType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__DelegateToType(struct soap*, wst__DelegateToType*) default initialize members /// - int soap_read_wst__DelegateToType(struct soap*, wst__DelegateToType*) deserialize from a source /// - int soap_write_wst__DelegateToType(struct soap*, wst__DelegateToType*) serialize to a sink /// - wst__DelegateToType* soap_dup_wst__DelegateToType(struct soap*, wst__DelegateToType* dst, wst__DelegateToType *src) returns deep copy of wst__DelegateToType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__DelegateToType(wst__DelegateToType*) deep deletes wst__DelegateToType data members, use only on dst after soap_dup_wst__DelegateToType(NULL, wst__DelegateToType *dst, wst__DelegateToType *src) (use soapcpp2 -Ed) struct wst__DelegateToType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ParticipantsType is a complexType. /// /// struct wst__ParticipantsType operations: /// - wst__ParticipantsType* soap_new_wst__ParticipantsType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__ParticipantsType(struct soap*, wst__ParticipantsType*) default initialize members /// - int soap_read_wst__ParticipantsType(struct soap*, wst__ParticipantsType*) deserialize from a source /// - int soap_write_wst__ParticipantsType(struct soap*, wst__ParticipantsType*) serialize to a sink /// - wst__ParticipantsType* soap_dup_wst__ParticipantsType(struct soap*, wst__ParticipantsType* dst, wst__ParticipantsType *src) returns deep copy of wst__ParticipantsType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__ParticipantsType(wst__ParticipantsType*) deep deletes wst__ParticipantsType data members, use only on dst after soap_dup_wst__ParticipantsType(NULL, wst__ParticipantsType *dst, wst__ParticipantsType *src) (use soapcpp2 -Ed) struct wst__ParticipantsType { /// Element "Primary" of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ParticipantType. struct wst__ParticipantType* Primary 0; ///< Optional element. /// Size of array of struct wst__ParticipantType* is 0..unbounded. $int __sizeParticipant 0; /// Array struct wst__ParticipantType* of size 0..unbounded. struct wst__ParticipantType* Participant 0; /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ParticipantType is a complexType. /// /// struct wst__ParticipantType operations: /// - wst__ParticipantType* soap_new_wst__ParticipantType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__ParticipantType(struct soap*, wst__ParticipantType*) default initialize members /// - int soap_read_wst__ParticipantType(struct soap*, wst__ParticipantType*) deserialize from a source /// - int soap_write_wst__ParticipantType(struct soap*, wst__ParticipantType*) serialize to a sink /// - wst__ParticipantType* soap_dup_wst__ParticipantType(struct soap*, wst__ParticipantType* dst, wst__ParticipantType *src) returns deep copy of wst__ParticipantType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__ParticipantType(wst__ParticipantType*) deep deletes wst__ParticipantType data members, use only on dst after soap_dup_wst__ParticipantType(NULL, wst__ParticipantType *dst, wst__ParticipantType *src) (use soapcpp2 -Ed) struct wst__ParticipantType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":BinarySecretType is a complexType with simpleContent. /// /// struct wst__BinarySecretType operations: /// - wst__BinarySecretType* soap_new_wst__BinarySecretType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__BinarySecretType(struct soap*, wst__BinarySecretType*) default initialize members /// - int soap_read_wst__BinarySecretType(struct soap*, wst__BinarySecretType*) deserialize from a source /// - int soap_write_wst__BinarySecretType(struct soap*, wst__BinarySecretType*) serialize to a sink /// - wst__BinarySecretType* soap_dup_wst__BinarySecretType(struct soap*, wst__BinarySecretType* dst, wst__BinarySecretType *src) returns deep copy of wst__BinarySecretType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__BinarySecretType(wst__BinarySecretType*) deep deletes wst__BinarySecretType data members, use only on dst after soap_dup_wst__BinarySecretType(NULL, wst__BinarySecretType *dst, wst__BinarySecretType *src) (use soapcpp2 -Ed) struct wst__BinarySecretType { /// __item wraps "xs:base64Binary" simpleContent. char* __item ; /// Attribute "Type" of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":BinarySecretTypeOpenEnum. @char* Type 0; ///< Optional attribute. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":BinaryExchangeType is a complexType with simpleContent. /// /// struct wst__BinaryExchangeType operations: /// - wst__BinaryExchangeType* soap_new_wst__BinaryExchangeType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__BinaryExchangeType(struct soap*, wst__BinaryExchangeType*) default initialize members /// - int soap_read_wst__BinaryExchangeType(struct soap*, wst__BinaryExchangeType*) deserialize from a source /// - int soap_write_wst__BinaryExchangeType(struct soap*, wst__BinaryExchangeType*) serialize to a sink /// - wst__BinaryExchangeType* soap_dup_wst__BinaryExchangeType(struct soap*, wst__BinaryExchangeType* dst, wst__BinaryExchangeType *src) returns deep copy of wst__BinaryExchangeType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__BinaryExchangeType(wst__BinaryExchangeType*) deep deletes wst__BinaryExchangeType data members, use only on dst after soap_dup_wst__BinaryExchangeType(NULL, wst__BinaryExchangeType *dst, wst__BinaryExchangeType *src) (use soapcpp2 -Ed) struct wst__BinaryExchangeType { /// __item wraps "xs:string" simpleContent. char* __item ; /// Attribute "ValueType" of XSD type xs:anyURI. @char* ValueType 1; ///< Required attribute. /// Attribute "EncodingType" of XSD type xs:anyURI. @char* EncodingType 1; ///< Required attribute. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /******************************************************************************\ * * * Additional Top-Level Elements * * http://docs.oasis-open.org/ws-sx/ws-trust/200512/ * * * \******************************************************************************/ /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityToken of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenType. typedef struct wst__RequestSecurityTokenType _wst__RequestSecurityToken; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":TokenType of XSD type xs:anyURI. typedef char* _wst__TokenType; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestType of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestTypeOpenEnum. typedef char* _wst__RequestType; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenResponse of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenResponseType. typedef struct wst__RequestSecurityTokenResponseType _wst__RequestSecurityTokenResponse; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedSecurityToken of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedSecurityTokenType. typedef wst__RequestedSecurityTokenType _wst__RequestedSecurityToken; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":BinarySecret of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":BinarySecretType. typedef struct wst__BinarySecretType _wst__BinarySecret; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Claims of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ClaimsType. typedef struct wst__ClaimsType _wst__Claims; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Entropy of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":EntropyType. typedef wst__EntropyType _wst__Entropy; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Lifetime of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":LifetimeType. typedef struct wst__LifetimeType _wst__Lifetime; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenCollection of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenCollectionType. typedef struct wst__RequestSecurityTokenCollectionType _wst__RequestSecurityTokenCollection; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenResponseCollection of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenResponseCollectionType. typedef struct wst__RequestSecurityTokenResponseCollectionType _wst__RequestSecurityTokenResponseCollection; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ComputedKey of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ComputedKeyOpenEnum. typedef char* _wst__ComputedKey; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedAttachedReference of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedReferenceType. typedef struct wst__RequestedReferenceType _wst__RequestedAttachedReference; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedUnattachedReference of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedReferenceType. typedef struct wst__RequestedReferenceType _wst__RequestedUnattachedReference; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedProofToken of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedProofTokenType. typedef struct wst__RequestedProofTokenType _wst__RequestedProofToken; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":IssuedTokens of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenResponseCollectionType. typedef struct wst__RequestSecurityTokenResponseCollectionType _wst__IssuedTokens; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RenewTarget of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RenewTargetType. typedef struct wst__RenewTargetType _wst__RenewTarget; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":AllowPostdating of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":AllowPostdatingType. typedef struct wst__AllowPostdatingType _wst__AllowPostdating; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Renewing of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RenewingType. typedef struct wst__RenewingType _wst__Renewing; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":CancelTarget of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":CancelTargetType. typedef struct wst__CancelTargetType _wst__CancelTarget; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedTokenCancelled of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedTokenCancelledType. typedef struct wst__RequestedTokenCancelledType _wst__RequestedTokenCancelled; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ValidateTarget of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ValidateTargetType. typedef struct wst__ValidateTargetType _wst__ValidateTarget; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Status of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":StatusType. typedef struct wst__StatusType _wst__Status; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":SignChallenge of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":SignChallengeType. typedef struct wst__SignChallengeType _wst__SignChallenge; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":SignChallengeResponse of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":SignChallengeType. typedef struct wst__SignChallengeType _wst__SignChallengeResponse; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Challenge of XSD type xs:string. typedef char* _wst__Challenge; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":BinaryExchange of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":BinaryExchangeType. typedef struct wst__BinaryExchangeType _wst__BinaryExchange; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestKET of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestKETType. typedef struct wst__RequestKETType _wst__RequestKET; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":KeyExchangeToken of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":KeyExchangeTokenType. typedef struct wst__KeyExchangeTokenType _wst__KeyExchangeToken; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Authenticator of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":AuthenticatorType. typedef wst__AuthenticatorType _wst__Authenticator; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":CombinedHash of XSD type xs:base64Binary. typedef char* _wst__CombinedHash; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":OnBehalfOf of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":OnBehalfOfType. typedef struct wst__OnBehalfOfType _wst__OnBehalfOf; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Issuer of XSD type "http://www.w3.org/2005/08/addressing":EndpointReferenceType. typedef wsa5__EndpointReferenceType _wst__Issuer; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":AuthenticationType of XSD type xs:anyURI. typedef char* _wst__AuthenticationType; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":KeyType of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":KeyTypeOpenEnum. typedef char* _wst__KeyType; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":KeySize of XSD type xs:unsignedInt. typedef unsigned int _wst__KeySize; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":SignatureAlgorithm of XSD type xs:anyURI. typedef char* _wst__SignatureAlgorithm; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":EncryptionAlgorithm of XSD type xs:anyURI. typedef char* _wst__EncryptionAlgorithm; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":CanonicalizationAlgorithm of XSD type xs:anyURI. typedef char* _wst__CanonicalizationAlgorithm; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ComputedKeyAlgorithm of XSD type xs:anyURI. typedef char* _wst__ComputedKeyAlgorithm; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Encryption of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":EncryptionType. typedef struct wst__EncryptionType _wst__Encryption; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ProofEncryption of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ProofEncryptionType. typedef struct wst__ProofEncryptionType _wst__ProofEncryption; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":UseKey of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":UseKeyType. typedef struct wst__UseKeyType _wst__UseKey; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":KeyWrapAlgorithm of XSD type xs:anyURI. typedef char* _wst__KeyWrapAlgorithm; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":SignWith of XSD type xs:anyURI. typedef char* _wst__SignWith; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":EncryptWith of XSD type xs:anyURI. typedef char* _wst__EncryptWith; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":DelegateTo of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":DelegateToType. typedef struct wst__DelegateToType _wst__DelegateTo; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Forwardable of XSD type xs:boolean. typedef char* _wst__Forwardable; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Delegatable of XSD type xs:boolean. typedef char* _wst__Delegatable; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Participants of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ParticipantsType. typedef struct wst__ParticipantsType _wst__Participants; /******************************************************************************\ * * * Additional Top-Level Attributes * * http://docs.oasis-open.org/ws-sx/ws-trust/200512/ * * * \******************************************************************************/ /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. Data can be read and deserialized from: - an int file descriptor, using soap->recvfd = fd - a socket, using soap->socket = (int)... - a C++ stream (istream, stringstream), using soap->is = (istream*)... - a C string, using soap->is = (const char*)... - any input, using the soap->frecv() callback Data can be serialized and written to: - an int file descriptor, using soap->sendfd = (int)... - a socket, using soap->socket = (int)... - a C++ stream (ostream, stringstream), using soap->os = (ostream*)... - a C string, using soap->os = (const char**)... - any output, using the soap->fsend() callback The following options are available for (de)serialization control: - soap->encodingStyle = NULL; to remove SOAP 1.1/1.2 encodingStyle - soap_mode(soap, SOAP_XML_TREE); XML without id-ref (no cycles!) - soap_mode(soap, SOAP_XML_GRAPH); XML with id-ref (including cycles) - soap_set_namespaces(soap, struct Namespace *nsmap); to set xmlns bindings @section wst Top-level root elements of schema "http://docs.oasis-open.org/ws-sx/ws-trust/200512/" - @ref _wst__RequestSecurityToken @code // Reader (returns SOAP_OK on success): soap_read__wst__RequestSecurityToken(struct soap*, _wst__RequestSecurityToken*); // Writer (returns SOAP_OK on success): soap_write__wst__RequestSecurityToken(struct soap*, _wst__RequestSecurityToken*); // REST GET (returns SOAP_OK on success): soap_GET__wst__RequestSecurityToken(struct soap*, const char *URL, _wst__RequestSecurityToken*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__RequestSecurityToken(struct soap*, const char *URL, _wst__RequestSecurityToken*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__RequestSecurityToken(struct soap*, const char *URL, _wst__RequestSecurityToken*); soap_POST_recv__wst__RequestSecurityToken(struct soap*, _wst__RequestSecurityToken*); @endcode - @ref _wst__TokenType @code // Reader (returns SOAP_OK on success): soap_read__wst__TokenType(struct soap*, _wst__TokenType*); // Writer (returns SOAP_OK on success): soap_write__wst__TokenType(struct soap*, _wst__TokenType*); // REST GET (returns SOAP_OK on success): soap_GET__wst__TokenType(struct soap*, const char *URL, _wst__TokenType*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__TokenType(struct soap*, const char *URL, _wst__TokenType*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__TokenType(struct soap*, const char *URL, _wst__TokenType*); soap_POST_recv__wst__TokenType(struct soap*, _wst__TokenType*); @endcode - @ref _wst__RequestType @code // Reader (returns SOAP_OK on success): soap_read__wst__RequestType(struct soap*, _wst__RequestType*); // Writer (returns SOAP_OK on success): soap_write__wst__RequestType(struct soap*, _wst__RequestType*); // REST GET (returns SOAP_OK on success): soap_GET__wst__RequestType(struct soap*, const char *URL, _wst__RequestType*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__RequestType(struct soap*, const char *URL, _wst__RequestType*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__RequestType(struct soap*, const char *URL, _wst__RequestType*); soap_POST_recv__wst__RequestType(struct soap*, _wst__RequestType*); @endcode - @ref _wst__RequestSecurityTokenResponse @code // Reader (returns SOAP_OK on success): soap_read__wst__RequestSecurityTokenResponse(struct soap*, _wst__RequestSecurityTokenResponse*); // Writer (returns SOAP_OK on success): soap_write__wst__RequestSecurityTokenResponse(struct soap*, _wst__RequestSecurityTokenResponse*); // REST GET (returns SOAP_OK on success): soap_GET__wst__RequestSecurityTokenResponse(struct soap*, const char *URL, _wst__RequestSecurityTokenResponse*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__RequestSecurityTokenResponse(struct soap*, const char *URL, _wst__RequestSecurityTokenResponse*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__RequestSecurityTokenResponse(struct soap*, const char *URL, _wst__RequestSecurityTokenResponse*); soap_POST_recv__wst__RequestSecurityTokenResponse(struct soap*, _wst__RequestSecurityTokenResponse*); @endcode - @ref _wst__RequestedSecurityToken @code // Reader (returns SOAP_OK on success): soap_read__wst__RequestedSecurityToken(struct soap*, _wst__RequestedSecurityToken*); // Writer (returns SOAP_OK on success): soap_write__wst__RequestedSecurityToken(struct soap*, _wst__RequestedSecurityToken*); // REST GET (returns SOAP_OK on success): soap_GET__wst__RequestedSecurityToken(struct soap*, const char *URL, _wst__RequestedSecurityToken*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__RequestedSecurityToken(struct soap*, const char *URL, _wst__RequestedSecurityToken*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__RequestedSecurityToken(struct soap*, const char *URL, _wst__RequestedSecurityToken*); soap_POST_recv__wst__RequestedSecurityToken(struct soap*, _wst__RequestedSecurityToken*); @endcode - @ref _wst__BinarySecret @code // Reader (returns SOAP_OK on success): soap_read__wst__BinarySecret(struct soap*, _wst__BinarySecret*); // Writer (returns SOAP_OK on success): soap_write__wst__BinarySecret(struct soap*, _wst__BinarySecret*); // REST GET (returns SOAP_OK on success): soap_GET__wst__BinarySecret(struct soap*, const char *URL, _wst__BinarySecret*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__BinarySecret(struct soap*, const char *URL, _wst__BinarySecret*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__BinarySecret(struct soap*, const char *URL, _wst__BinarySecret*); soap_POST_recv__wst__BinarySecret(struct soap*, _wst__BinarySecret*); @endcode - @ref _wst__Claims @code // Reader (returns SOAP_OK on success): soap_read__wst__Claims(struct soap*, _wst__Claims*); // Writer (returns SOAP_OK on success): soap_write__wst__Claims(struct soap*, _wst__Claims*); // REST GET (returns SOAP_OK on success): soap_GET__wst__Claims(struct soap*, const char *URL, _wst__Claims*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__Claims(struct soap*, const char *URL, _wst__Claims*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__Claims(struct soap*, const char *URL, _wst__Claims*); soap_POST_recv__wst__Claims(struct soap*, _wst__Claims*); @endcode - @ref _wst__Entropy @code // Reader (returns SOAP_OK on success): soap_read__wst__Entropy(struct soap*, _wst__Entropy*); // Writer (returns SOAP_OK on success): soap_write__wst__Entropy(struct soap*, _wst__Entropy*); // REST GET (returns SOAP_OK on success): soap_GET__wst__Entropy(struct soap*, const char *URL, _wst__Entropy*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__Entropy(struct soap*, const char *URL, _wst__Entropy*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__Entropy(struct soap*, const char *URL, _wst__Entropy*); soap_POST_recv__wst__Entropy(struct soap*, _wst__Entropy*); @endcode - @ref _wst__Lifetime @code // Reader (returns SOAP_OK on success): soap_read__wst__Lifetime(struct soap*, _wst__Lifetime*); // Writer (returns SOAP_OK on success): soap_write__wst__Lifetime(struct soap*, _wst__Lifetime*); // REST GET (returns SOAP_OK on success): soap_GET__wst__Lifetime(struct soap*, const char *URL, _wst__Lifetime*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__Lifetime(struct soap*, const char *URL, _wst__Lifetime*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__Lifetime(struct soap*, const char *URL, _wst__Lifetime*); soap_POST_recv__wst__Lifetime(struct soap*, _wst__Lifetime*); @endcode - @ref _wst__RequestSecurityTokenCollection @code // Reader (returns SOAP_OK on success): soap_read__wst__RequestSecurityTokenCollection(struct soap*, _wst__RequestSecurityTokenCollection*); // Writer (returns SOAP_OK on success): soap_write__wst__RequestSecurityTokenCollection(struct soap*, _wst__RequestSecurityTokenCollection*); // REST GET (returns SOAP_OK on success): soap_GET__wst__RequestSecurityTokenCollection(struct soap*, const char *URL, _wst__RequestSecurityTokenCollection*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__RequestSecurityTokenCollection(struct soap*, const char *URL, _wst__RequestSecurityTokenCollection*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__RequestSecurityTokenCollection(struct soap*, const char *URL, _wst__RequestSecurityTokenCollection*); soap_POST_recv__wst__RequestSecurityTokenCollection(struct soap*, _wst__RequestSecurityTokenCollection*); @endcode - @ref _wst__RequestSecurityTokenResponseCollection @code // Reader (returns SOAP_OK on success): soap_read__wst__RequestSecurityTokenResponseCollection(struct soap*, _wst__RequestSecurityTokenResponseCollection*); // Writer (returns SOAP_OK on success): soap_write__wst__RequestSecurityTokenResponseCollection(struct soap*, _wst__RequestSecurityTokenResponseCollection*); // REST GET (returns SOAP_OK on success): soap_GET__wst__RequestSecurityTokenResponseCollection(struct soap*, const char *URL, _wst__RequestSecurityTokenResponseCollection*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__RequestSecurityTokenResponseCollection(struct soap*, const char *URL, _wst__RequestSecurityTokenResponseCollection*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__RequestSecurityTokenResponseCollection(struct soap*, const char *URL, _wst__RequestSecurityTokenResponseCollection*); soap_POST_recv__wst__RequestSecurityTokenResponseCollection(struct soap*, _wst__RequestSecurityTokenResponseCollection*); @endcode - @ref _wst__ComputedKey @code // Reader (returns SOAP_OK on success): soap_read__wst__ComputedKey(struct soap*, _wst__ComputedKey*); // Writer (returns SOAP_OK on success): soap_write__wst__ComputedKey(struct soap*, _wst__ComputedKey*); // REST GET (returns SOAP_OK on success): soap_GET__wst__ComputedKey(struct soap*, const char *URL, _wst__ComputedKey*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__ComputedKey(struct soap*, const char *URL, _wst__ComputedKey*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__ComputedKey(struct soap*, const char *URL, _wst__ComputedKey*); soap_POST_recv__wst__ComputedKey(struct soap*, _wst__ComputedKey*); @endcode - @ref _wst__RequestedAttachedReference @code // Reader (returns SOAP_OK on success): soap_read__wst__RequestedAttachedReference(struct soap*, _wst__RequestedAttachedReference*); // Writer (returns SOAP_OK on success): soap_write__wst__RequestedAttachedReference(struct soap*, _wst__RequestedAttachedReference*); // REST GET (returns SOAP_OK on success): soap_GET__wst__RequestedAttachedReference(struct soap*, const char *URL, _wst__RequestedAttachedReference*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__RequestedAttachedReference(struct soap*, const char *URL, _wst__RequestedAttachedReference*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__RequestedAttachedReference(struct soap*, const char *URL, _wst__RequestedAttachedReference*); soap_POST_recv__wst__RequestedAttachedReference(struct soap*, _wst__RequestedAttachedReference*); @endcode - @ref _wst__RequestedUnattachedReference @code // Reader (returns SOAP_OK on success): soap_read__wst__RequestedUnattachedReference(struct soap*, _wst__RequestedUnattachedReference*); // Writer (returns SOAP_OK on success): soap_write__wst__RequestedUnattachedReference(struct soap*, _wst__RequestedUnattachedReference*); // REST GET (returns SOAP_OK on success): soap_GET__wst__RequestedUnattachedReference(struct soap*, const char *URL, _wst__RequestedUnattachedReference*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__RequestedUnattachedReference(struct soap*, const char *URL, _wst__RequestedUnattachedReference*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__RequestedUnattachedReference(struct soap*, const char *URL, _wst__RequestedUnattachedReference*); soap_POST_recv__wst__RequestedUnattachedReference(struct soap*, _wst__RequestedUnattachedReference*); @endcode - @ref _wst__RequestedProofToken @code // Reader (returns SOAP_OK on success): soap_read__wst__RequestedProofToken(struct soap*, _wst__RequestedProofToken*); // Writer (returns SOAP_OK on success): soap_write__wst__RequestedProofToken(struct soap*, _wst__RequestedProofToken*); // REST GET (returns SOAP_OK on success): soap_GET__wst__RequestedProofToken(struct soap*, const char *URL, _wst__RequestedProofToken*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__RequestedProofToken(struct soap*, const char *URL, _wst__RequestedProofToken*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__RequestedProofToken(struct soap*, const char *URL, _wst__RequestedProofToken*); soap_POST_recv__wst__RequestedProofToken(struct soap*, _wst__RequestedProofToken*); @endcode - @ref _wst__IssuedTokens @code // Reader (returns SOAP_OK on success): soap_read__wst__IssuedTokens(struct soap*, _wst__IssuedTokens*); // Writer (returns SOAP_OK on success): soap_write__wst__IssuedTokens(struct soap*, _wst__IssuedTokens*); // REST GET (returns SOAP_OK on success): soap_GET__wst__IssuedTokens(struct soap*, const char *URL, _wst__IssuedTokens*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__IssuedTokens(struct soap*, const char *URL, _wst__IssuedTokens*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__IssuedTokens(struct soap*, const char *URL, _wst__IssuedTokens*); soap_POST_recv__wst__IssuedTokens(struct soap*, _wst__IssuedTokens*); @endcode - @ref _wst__RenewTarget @code // Reader (returns SOAP_OK on success): soap_read__wst__RenewTarget(struct soap*, _wst__RenewTarget*); // Writer (returns SOAP_OK on success): soap_write__wst__RenewTarget(struct soap*, _wst__RenewTarget*); // REST GET (returns SOAP_OK on success): soap_GET__wst__RenewTarget(struct soap*, const char *URL, _wst__RenewTarget*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__RenewTarget(struct soap*, const char *URL, _wst__RenewTarget*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__RenewTarget(struct soap*, const char *URL, _wst__RenewTarget*); soap_POST_recv__wst__RenewTarget(struct soap*, _wst__RenewTarget*); @endcode - @ref _wst__AllowPostdating @code // Reader (returns SOAP_OK on success): soap_read__wst__AllowPostdating(struct soap*, _wst__AllowPostdating*); // Writer (returns SOAP_OK on success): soap_write__wst__AllowPostdating(struct soap*, _wst__AllowPostdating*); // REST GET (returns SOAP_OK on success): soap_GET__wst__AllowPostdating(struct soap*, const char *URL, _wst__AllowPostdating*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__AllowPostdating(struct soap*, const char *URL, _wst__AllowPostdating*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__AllowPostdating(struct soap*, const char *URL, _wst__AllowPostdating*); soap_POST_recv__wst__AllowPostdating(struct soap*, _wst__AllowPostdating*); @endcode - @ref _wst__Renewing @code // Reader (returns SOAP_OK on success): soap_read__wst__Renewing(struct soap*, _wst__Renewing*); // Writer (returns SOAP_OK on success): soap_write__wst__Renewing(struct soap*, _wst__Renewing*); // REST GET (returns SOAP_OK on success): soap_GET__wst__Renewing(struct soap*, const char *URL, _wst__Renewing*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__Renewing(struct soap*, const char *URL, _wst__Renewing*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__Renewing(struct soap*, const char *URL, _wst__Renewing*); soap_POST_recv__wst__Renewing(struct soap*, _wst__Renewing*); @endcode - @ref _wst__CancelTarget @code // Reader (returns SOAP_OK on success): soap_read__wst__CancelTarget(struct soap*, _wst__CancelTarget*); // Writer (returns SOAP_OK on success): soap_write__wst__CancelTarget(struct soap*, _wst__CancelTarget*); // REST GET (returns SOAP_OK on success): soap_GET__wst__CancelTarget(struct soap*, const char *URL, _wst__CancelTarget*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__CancelTarget(struct soap*, const char *URL, _wst__CancelTarget*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__CancelTarget(struct soap*, const char *URL, _wst__CancelTarget*); soap_POST_recv__wst__CancelTarget(struct soap*, _wst__CancelTarget*); @endcode - @ref _wst__RequestedTokenCancelled @code // Reader (returns SOAP_OK on success): soap_read__wst__RequestedTokenCancelled(struct soap*, _wst__RequestedTokenCancelled*); // Writer (returns SOAP_OK on success): soap_write__wst__RequestedTokenCancelled(struct soap*, _wst__RequestedTokenCancelled*); // REST GET (returns SOAP_OK on success): soap_GET__wst__RequestedTokenCancelled(struct soap*, const char *URL, _wst__RequestedTokenCancelled*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__RequestedTokenCancelled(struct soap*, const char *URL, _wst__RequestedTokenCancelled*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__RequestedTokenCancelled(struct soap*, const char *URL, _wst__RequestedTokenCancelled*); soap_POST_recv__wst__RequestedTokenCancelled(struct soap*, _wst__RequestedTokenCancelled*); @endcode - @ref _wst__ValidateTarget @code // Reader (returns SOAP_OK on success): soap_read__wst__ValidateTarget(struct soap*, _wst__ValidateTarget*); // Writer (returns SOAP_OK on success): soap_write__wst__ValidateTarget(struct soap*, _wst__ValidateTarget*); // REST GET (returns SOAP_OK on success): soap_GET__wst__ValidateTarget(struct soap*, const char *URL, _wst__ValidateTarget*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__ValidateTarget(struct soap*, const char *URL, _wst__ValidateTarget*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__ValidateTarget(struct soap*, const char *URL, _wst__ValidateTarget*); soap_POST_recv__wst__ValidateTarget(struct soap*, _wst__ValidateTarget*); @endcode - @ref _wst__Status @code // Reader (returns SOAP_OK on success): soap_read__wst__Status(struct soap*, _wst__Status*); // Writer (returns SOAP_OK on success): soap_write__wst__Status(struct soap*, _wst__Status*); // REST GET (returns SOAP_OK on success): soap_GET__wst__Status(struct soap*, const char *URL, _wst__Status*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__Status(struct soap*, const char *URL, _wst__Status*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__Status(struct soap*, const char *URL, _wst__Status*); soap_POST_recv__wst__Status(struct soap*, _wst__Status*); @endcode - @ref _wst__SignChallenge @code // Reader (returns SOAP_OK on success): soap_read__wst__SignChallenge(struct soap*, _wst__SignChallenge*); // Writer (returns SOAP_OK on success): soap_write__wst__SignChallenge(struct soap*, _wst__SignChallenge*); // REST GET (returns SOAP_OK on success): soap_GET__wst__SignChallenge(struct soap*, const char *URL, _wst__SignChallenge*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__SignChallenge(struct soap*, const char *URL, _wst__SignChallenge*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__SignChallenge(struct soap*, const char *URL, _wst__SignChallenge*); soap_POST_recv__wst__SignChallenge(struct soap*, _wst__SignChallenge*); @endcode - @ref _wst__SignChallengeResponse @code // Reader (returns SOAP_OK on success): soap_read__wst__SignChallengeResponse(struct soap*, _wst__SignChallengeResponse*); // Writer (returns SOAP_OK on success): soap_write__wst__SignChallengeResponse(struct soap*, _wst__SignChallengeResponse*); // REST GET (returns SOAP_OK on success): soap_GET__wst__SignChallengeResponse(struct soap*, const char *URL, _wst__SignChallengeResponse*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__SignChallengeResponse(struct soap*, const char *URL, _wst__SignChallengeResponse*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__SignChallengeResponse(struct soap*, const char *URL, _wst__SignChallengeResponse*); soap_POST_recv__wst__SignChallengeResponse(struct soap*, _wst__SignChallengeResponse*); @endcode - @ref _wst__Challenge @code // Reader (returns SOAP_OK on success): soap_read__wst__Challenge(struct soap*, _wst__Challenge*); // Writer (returns SOAP_OK on success): soap_write__wst__Challenge(struct soap*, _wst__Challenge*); // REST GET (returns SOAP_OK on success): soap_GET__wst__Challenge(struct soap*, const char *URL, _wst__Challenge*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__Challenge(struct soap*, const char *URL, _wst__Challenge*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__Challenge(struct soap*, const char *URL, _wst__Challenge*); soap_POST_recv__wst__Challenge(struct soap*, _wst__Challenge*); @endcode - @ref _wst__BinaryExchange @code // Reader (returns SOAP_OK on success): soap_read__wst__BinaryExchange(struct soap*, _wst__BinaryExchange*); // Writer (returns SOAP_OK on success): soap_write__wst__BinaryExchange(struct soap*, _wst__BinaryExchange*); // REST GET (returns SOAP_OK on success): soap_GET__wst__BinaryExchange(struct soap*, const char *URL, _wst__BinaryExchange*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__BinaryExchange(struct soap*, const char *URL, _wst__BinaryExchange*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__BinaryExchange(struct soap*, const char *URL, _wst__BinaryExchange*); soap_POST_recv__wst__BinaryExchange(struct soap*, _wst__BinaryExchange*); @endcode - @ref _wst__RequestKET @code // Reader (returns SOAP_OK on success): soap_read__wst__RequestKET(struct soap*, _wst__RequestKET*); // Writer (returns SOAP_OK on success): soap_write__wst__RequestKET(struct soap*, _wst__RequestKET*); // REST GET (returns SOAP_OK on success): soap_GET__wst__RequestKET(struct soap*, const char *URL, _wst__RequestKET*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__RequestKET(struct soap*, const char *URL, _wst__RequestKET*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__RequestKET(struct soap*, const char *URL, _wst__RequestKET*); soap_POST_recv__wst__RequestKET(struct soap*, _wst__RequestKET*); @endcode - @ref _wst__KeyExchangeToken @code // Reader (returns SOAP_OK on success): soap_read__wst__KeyExchangeToken(struct soap*, _wst__KeyExchangeToken*); // Writer (returns SOAP_OK on success): soap_write__wst__KeyExchangeToken(struct soap*, _wst__KeyExchangeToken*); // REST GET (returns SOAP_OK on success): soap_GET__wst__KeyExchangeToken(struct soap*, const char *URL, _wst__KeyExchangeToken*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__KeyExchangeToken(struct soap*, const char *URL, _wst__KeyExchangeToken*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__KeyExchangeToken(struct soap*, const char *URL, _wst__KeyExchangeToken*); soap_POST_recv__wst__KeyExchangeToken(struct soap*, _wst__KeyExchangeToken*); @endcode - @ref _wst__Authenticator @code // Reader (returns SOAP_OK on success): soap_read__wst__Authenticator(struct soap*, _wst__Authenticator*); // Writer (returns SOAP_OK on success): soap_write__wst__Authenticator(struct soap*, _wst__Authenticator*); // REST GET (returns SOAP_OK on success): soap_GET__wst__Authenticator(struct soap*, const char *URL, _wst__Authenticator*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__Authenticator(struct soap*, const char *URL, _wst__Authenticator*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__Authenticator(struct soap*, const char *URL, _wst__Authenticator*); soap_POST_recv__wst__Authenticator(struct soap*, _wst__Authenticator*); @endcode - @ref _wst__CombinedHash @code // Reader (returns SOAP_OK on success): soap_read__wst__CombinedHash(struct soap*, _wst__CombinedHash*); // Writer (returns SOAP_OK on success): soap_write__wst__CombinedHash(struct soap*, _wst__CombinedHash*); // REST GET (returns SOAP_OK on success): soap_GET__wst__CombinedHash(struct soap*, const char *URL, _wst__CombinedHash*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__CombinedHash(struct soap*, const char *URL, _wst__CombinedHash*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__CombinedHash(struct soap*, const char *URL, _wst__CombinedHash*); soap_POST_recv__wst__CombinedHash(struct soap*, _wst__CombinedHash*); @endcode - @ref _wst__OnBehalfOf @code // Reader (returns SOAP_OK on success): soap_read__wst__OnBehalfOf(struct soap*, _wst__OnBehalfOf*); // Writer (returns SOAP_OK on success): soap_write__wst__OnBehalfOf(struct soap*, _wst__OnBehalfOf*); // REST GET (returns SOAP_OK on success): soap_GET__wst__OnBehalfOf(struct soap*, const char *URL, _wst__OnBehalfOf*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__OnBehalfOf(struct soap*, const char *URL, _wst__OnBehalfOf*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__OnBehalfOf(struct soap*, const char *URL, _wst__OnBehalfOf*); soap_POST_recv__wst__OnBehalfOf(struct soap*, _wst__OnBehalfOf*); @endcode - @ref _wst__Issuer @code // Reader (returns SOAP_OK on success): soap_read__wst__Issuer(struct soap*, _wst__Issuer*); // Writer (returns SOAP_OK on success): soap_write__wst__Issuer(struct soap*, _wst__Issuer*); // REST GET (returns SOAP_OK on success): soap_GET__wst__Issuer(struct soap*, const char *URL, _wst__Issuer*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__Issuer(struct soap*, const char *URL, _wst__Issuer*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__Issuer(struct soap*, const char *URL, _wst__Issuer*); soap_POST_recv__wst__Issuer(struct soap*, _wst__Issuer*); @endcode - @ref _wst__AuthenticationType @code // Reader (returns SOAP_OK on success): soap_read__wst__AuthenticationType(struct soap*, _wst__AuthenticationType*); // Writer (returns SOAP_OK on success): soap_write__wst__AuthenticationType(struct soap*, _wst__AuthenticationType*); // REST GET (returns SOAP_OK on success): soap_GET__wst__AuthenticationType(struct soap*, const char *URL, _wst__AuthenticationType*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__AuthenticationType(struct soap*, const char *URL, _wst__AuthenticationType*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__AuthenticationType(struct soap*, const char *URL, _wst__AuthenticationType*); soap_POST_recv__wst__AuthenticationType(struct soap*, _wst__AuthenticationType*); @endcode - @ref _wst__KeyType @code // Reader (returns SOAP_OK on success): soap_read__wst__KeyType(struct soap*, _wst__KeyType*); // Writer (returns SOAP_OK on success): soap_write__wst__KeyType(struct soap*, _wst__KeyType*); // REST GET (returns SOAP_OK on success): soap_GET__wst__KeyType(struct soap*, const char *URL, _wst__KeyType*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__KeyType(struct soap*, const char *URL, _wst__KeyType*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__KeyType(struct soap*, const char *URL, _wst__KeyType*); soap_POST_recv__wst__KeyType(struct soap*, _wst__KeyType*); @endcode - @ref _wst__KeySize @code // Reader (returns SOAP_OK on success): soap_read__wst__KeySize(struct soap*, _wst__KeySize*); // Writer (returns SOAP_OK on success): soap_write__wst__KeySize(struct soap*, _wst__KeySize*); // REST GET (returns SOAP_OK on success): soap_GET__wst__KeySize(struct soap*, const char *URL, _wst__KeySize*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__KeySize(struct soap*, const char *URL, _wst__KeySize*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__KeySize(struct soap*, const char *URL, _wst__KeySize*); soap_POST_recv__wst__KeySize(struct soap*, _wst__KeySize*); @endcode - @ref _wst__SignatureAlgorithm @code // Reader (returns SOAP_OK on success): soap_read__wst__SignatureAlgorithm(struct soap*, _wst__SignatureAlgorithm*); // Writer (returns SOAP_OK on success): soap_write__wst__SignatureAlgorithm(struct soap*, _wst__SignatureAlgorithm*); // REST GET (returns SOAP_OK on success): soap_GET__wst__SignatureAlgorithm(struct soap*, const char *URL, _wst__SignatureAlgorithm*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__SignatureAlgorithm(struct soap*, const char *URL, _wst__SignatureAlgorithm*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__SignatureAlgorithm(struct soap*, const char *URL, _wst__SignatureAlgorithm*); soap_POST_recv__wst__SignatureAlgorithm(struct soap*, _wst__SignatureAlgorithm*); @endcode - @ref _wst__EncryptionAlgorithm @code // Reader (returns SOAP_OK on success): soap_read__wst__EncryptionAlgorithm(struct soap*, _wst__EncryptionAlgorithm*); // Writer (returns SOAP_OK on success): soap_write__wst__EncryptionAlgorithm(struct soap*, _wst__EncryptionAlgorithm*); // REST GET (returns SOAP_OK on success): soap_GET__wst__EncryptionAlgorithm(struct soap*, const char *URL, _wst__EncryptionAlgorithm*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__EncryptionAlgorithm(struct soap*, const char *URL, _wst__EncryptionAlgorithm*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__EncryptionAlgorithm(struct soap*, const char *URL, _wst__EncryptionAlgorithm*); soap_POST_recv__wst__EncryptionAlgorithm(struct soap*, _wst__EncryptionAlgorithm*); @endcode - @ref _wst__CanonicalizationAlgorithm @code // Reader (returns SOAP_OK on success): soap_read__wst__CanonicalizationAlgorithm(struct soap*, _wst__CanonicalizationAlgorithm*); // Writer (returns SOAP_OK on success): soap_write__wst__CanonicalizationAlgorithm(struct soap*, _wst__CanonicalizationAlgorithm*); // REST GET (returns SOAP_OK on success): soap_GET__wst__CanonicalizationAlgorithm(struct soap*, const char *URL, _wst__CanonicalizationAlgorithm*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__CanonicalizationAlgorithm(struct soap*, const char *URL, _wst__CanonicalizationAlgorithm*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__CanonicalizationAlgorithm(struct soap*, const char *URL, _wst__CanonicalizationAlgorithm*); soap_POST_recv__wst__CanonicalizationAlgorithm(struct soap*, _wst__CanonicalizationAlgorithm*); @endcode - @ref _wst__ComputedKeyAlgorithm @code // Reader (returns SOAP_OK on success): soap_read__wst__ComputedKeyAlgorithm(struct soap*, _wst__ComputedKeyAlgorithm*); // Writer (returns SOAP_OK on success): soap_write__wst__ComputedKeyAlgorithm(struct soap*, _wst__ComputedKeyAlgorithm*); // REST GET (returns SOAP_OK on success): soap_GET__wst__ComputedKeyAlgorithm(struct soap*, const char *URL, _wst__ComputedKeyAlgorithm*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__ComputedKeyAlgorithm(struct soap*, const char *URL, _wst__ComputedKeyAlgorithm*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__ComputedKeyAlgorithm(struct soap*, const char *URL, _wst__ComputedKeyAlgorithm*); soap_POST_recv__wst__ComputedKeyAlgorithm(struct soap*, _wst__ComputedKeyAlgorithm*); @endcode - @ref _wst__Encryption @code // Reader (returns SOAP_OK on success): soap_read__wst__Encryption(struct soap*, _wst__Encryption*); // Writer (returns SOAP_OK on success): soap_write__wst__Encryption(struct soap*, _wst__Encryption*); // REST GET (returns SOAP_OK on success): soap_GET__wst__Encryption(struct soap*, const char *URL, _wst__Encryption*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__Encryption(struct soap*, const char *URL, _wst__Encryption*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__Encryption(struct soap*, const char *URL, _wst__Encryption*); soap_POST_recv__wst__Encryption(struct soap*, _wst__Encryption*); @endcode - @ref _wst__ProofEncryption @code // Reader (returns SOAP_OK on success): soap_read__wst__ProofEncryption(struct soap*, _wst__ProofEncryption*); // Writer (returns SOAP_OK on success): soap_write__wst__ProofEncryption(struct soap*, _wst__ProofEncryption*); // REST GET (returns SOAP_OK on success): soap_GET__wst__ProofEncryption(struct soap*, const char *URL, _wst__ProofEncryption*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__ProofEncryption(struct soap*, const char *URL, _wst__ProofEncryption*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__ProofEncryption(struct soap*, const char *URL, _wst__ProofEncryption*); soap_POST_recv__wst__ProofEncryption(struct soap*, _wst__ProofEncryption*); @endcode - @ref _wst__UseKey @code // Reader (returns SOAP_OK on success): soap_read__wst__UseKey(struct soap*, _wst__UseKey*); // Writer (returns SOAP_OK on success): soap_write__wst__UseKey(struct soap*, _wst__UseKey*); // REST GET (returns SOAP_OK on success): soap_GET__wst__UseKey(struct soap*, const char *URL, _wst__UseKey*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__UseKey(struct soap*, const char *URL, _wst__UseKey*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__UseKey(struct soap*, const char *URL, _wst__UseKey*); soap_POST_recv__wst__UseKey(struct soap*, _wst__UseKey*); @endcode - @ref _wst__KeyWrapAlgorithm @code // Reader (returns SOAP_OK on success): soap_read__wst__KeyWrapAlgorithm(struct soap*, _wst__KeyWrapAlgorithm*); // Writer (returns SOAP_OK on success): soap_write__wst__KeyWrapAlgorithm(struct soap*, _wst__KeyWrapAlgorithm*); // REST GET (returns SOAP_OK on success): soap_GET__wst__KeyWrapAlgorithm(struct soap*, const char *URL, _wst__KeyWrapAlgorithm*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__KeyWrapAlgorithm(struct soap*, const char *URL, _wst__KeyWrapAlgorithm*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__KeyWrapAlgorithm(struct soap*, const char *URL, _wst__KeyWrapAlgorithm*); soap_POST_recv__wst__KeyWrapAlgorithm(struct soap*, _wst__KeyWrapAlgorithm*); @endcode - @ref _wst__SignWith @code // Reader (returns SOAP_OK on success): soap_read__wst__SignWith(struct soap*, _wst__SignWith*); // Writer (returns SOAP_OK on success): soap_write__wst__SignWith(struct soap*, _wst__SignWith*); // REST GET (returns SOAP_OK on success): soap_GET__wst__SignWith(struct soap*, const char *URL, _wst__SignWith*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__SignWith(struct soap*, const char *URL, _wst__SignWith*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__SignWith(struct soap*, const char *URL, _wst__SignWith*); soap_POST_recv__wst__SignWith(struct soap*, _wst__SignWith*); @endcode - @ref _wst__EncryptWith @code // Reader (returns SOAP_OK on success): soap_read__wst__EncryptWith(struct soap*, _wst__EncryptWith*); // Writer (returns SOAP_OK on success): soap_write__wst__EncryptWith(struct soap*, _wst__EncryptWith*); // REST GET (returns SOAP_OK on success): soap_GET__wst__EncryptWith(struct soap*, const char *URL, _wst__EncryptWith*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__EncryptWith(struct soap*, const char *URL, _wst__EncryptWith*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__EncryptWith(struct soap*, const char *URL, _wst__EncryptWith*); soap_POST_recv__wst__EncryptWith(struct soap*, _wst__EncryptWith*); @endcode - @ref _wst__DelegateTo @code // Reader (returns SOAP_OK on success): soap_read__wst__DelegateTo(struct soap*, _wst__DelegateTo*); // Writer (returns SOAP_OK on success): soap_write__wst__DelegateTo(struct soap*, _wst__DelegateTo*); // REST GET (returns SOAP_OK on success): soap_GET__wst__DelegateTo(struct soap*, const char *URL, _wst__DelegateTo*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__DelegateTo(struct soap*, const char *URL, _wst__DelegateTo*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__DelegateTo(struct soap*, const char *URL, _wst__DelegateTo*); soap_POST_recv__wst__DelegateTo(struct soap*, _wst__DelegateTo*); @endcode - @ref _wst__Forwardable @code // Reader (returns SOAP_OK on success): soap_read__wst__Forwardable(struct soap*, _wst__Forwardable*); // Writer (returns SOAP_OK on success): soap_write__wst__Forwardable(struct soap*, _wst__Forwardable*); // REST GET (returns SOAP_OK on success): soap_GET__wst__Forwardable(struct soap*, const char *URL, _wst__Forwardable*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__Forwardable(struct soap*, const char *URL, _wst__Forwardable*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__Forwardable(struct soap*, const char *URL, _wst__Forwardable*); soap_POST_recv__wst__Forwardable(struct soap*, _wst__Forwardable*); @endcode - @ref _wst__Delegatable @code // Reader (returns SOAP_OK on success): soap_read__wst__Delegatable(struct soap*, _wst__Delegatable*); // Writer (returns SOAP_OK on success): soap_write__wst__Delegatable(struct soap*, _wst__Delegatable*); // REST GET (returns SOAP_OK on success): soap_GET__wst__Delegatable(struct soap*, const char *URL, _wst__Delegatable*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__Delegatable(struct soap*, const char *URL, _wst__Delegatable*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__Delegatable(struct soap*, const char *URL, _wst__Delegatable*); soap_POST_recv__wst__Delegatable(struct soap*, _wst__Delegatable*); @endcode - @ref _wst__Participants @code // Reader (returns SOAP_OK on success): soap_read__wst__Participants(struct soap*, _wst__Participants*); // Writer (returns SOAP_OK on success): soap_write__wst__Participants(struct soap*, _wst__Participants*); // REST GET (returns SOAP_OK on success): soap_GET__wst__Participants(struct soap*, const char *URL, _wst__Participants*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__Participants(struct soap*, const char *URL, _wst__Participants*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__Participants(struct soap*, const char *URL, _wst__Participants*); soap_POST_recv__wst__Participants(struct soap*, _wst__Participants*); @endcode */ #import "wstx2.h" /* End of wst.h */ gsoap-2.8.91/gsoap/import/wsse11.h0000644000175000017500000003126613525245161016217 0ustar ellertellert/* wsse.h 1.1 This file is deprecated. Use wsse.h or wsse2.h. Generated with: wsdl2h -cegxy -o wsse.h -t WS/WS-typemap.dat WS/wsse.xsd - Removed //gsoapopt - Added //gsoap wsse schema import: http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd - Changed namespace to v1.1 - Added mutable SOAP_ENV__Header struct */ /******************************************************************************\ * * * http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ #import "wsu.h" // wsu = /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ //gsoap wsse schema import: http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd //gsoap wsse schema namespace2: http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.0.xsd //gsoap wsse schema elementForm: qualified //gsoap wsse schema attributeForm: unqualified /******************************************************************************\ * * * Schema Types * * * \******************************************************************************/ /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.1.xsd":AttributedString from typemap WS/WS-typemap.dat. /// @brief This type represents an element with arbitrary attributes. /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":PasswordString from typemap WS/WS-typemap.dat. /// @brief This type is used for password elements per Section 4.1. /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":EncodedString from typemap WS/WS-typemap.dat. /// @brief This type is used for elements containing stringified binary data. /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":UsernameTokenType from typemap WS/WS-typemap.dat. /// @brief This type represents a username token per Section 4.1 /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":BinarySecurityTokenType from typemap WS/WS-typemap.dat. /// @brief A security token that is encoded in binary /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":KeyIdentifierType from typemap WS/WS-typemap.dat. /// @brief A security token key identifier /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":ReferenceType from typemap WS/WS-typemap.dat. /// @brief This type represents a reference to an external security token. /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":EmbeddedType from typemap WS/WS-typemap.dat. /// @brief This type represents a reference to an embedded security token. /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityTokenReferenceType from typemap WS/WS-typemap.dat. /// @brief This type is used reference a security token. /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityHeaderType from typemap WS/WS-typemap.dat. /// @brief This complexType defines header block to use for security-relevant data directed at a specific SOAP actor. /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":TransformationParametersType from typemap WS/WS-typemap.dat. /// @brief This complexType defines a container for elements to be specified from any namespace as properties/parameters of a DSIG transformation. /// complexType definition intentionally left blank. /// Imported simpleType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":tUsage from typemap WS/WS-typemap.dat. /// @brief Typedef to allow a list of usages (as URIs). /// simpleType definition intentionally left blank. /// "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":FaultcodeEnum is a simpleType restriction of xs:QName. enum wsse__FaultcodeEnum { wsse__UnsupportedSecurityToken, ///< xs:QName value=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":UnsupportedSecurityToken" wsse__UnsupportedAlgorithm, ///< xs:QName value=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":UnsupportedAlgorithm" wsse__InvalidSecurity, ///< xs:QName value=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":InvalidSecurity" wsse__InvalidSecurityToken, ///< xs:QName value=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":InvalidSecurityToken" wsse__FailedAuthentication, ///< xs:QName value=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":FailedAuthentication" wsse__FailedCheck, ///< xs:QName value=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":FailedCheck" wsse__SecurityTokenUnavailable, ///< xs:QName value=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityTokenUnavailable" }; /// Typedef synonym for enum wsse__FaultcodeEnum. typedef enum wsse__FaultcodeEnum wsse__FaultcodeEnum; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":UsernameToken of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":UsernameTokenType. /// @brief This element defines the wsse:UsernameToken element per Section 4.1. /// Imported element _wsse__UsernameToken from typemap WS/WS-typemap.dat. typedef struct _wsse__UsernameToken { char* Username; struct _wsse__Password* Password; char* Nonce; char* wsu__Created; @char* wsu__Id; } _wsse__UsernameToken; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":BinarySecurityToken of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":BinarySecurityTokenType. /// @brief This element defines the wsse:BinarySecurityToken element per Section 4.2. /// Imported element _wsse__BinarySecurityToken from typemap WS/WS-typemap.dat. typedef struct _wsse__BinarySecurityToken { char* __item; @char* wsu__Id; @char* ValueType; @char* EncodingType; } _wsse__BinarySecurityToken; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":Reference of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":ReferenceType. /// @brief This element defines a security token reference /// Imported element _wsse__Reference from typemap WS/WS-typemap.dat. typedef struct _wsse__Reference { @char* URI; @char* ValueType; } _wsse__Reference; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":Embedded of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":EmbeddedType. /// @brief This element defines a security token embedded reference /// Imported element _wsse__Embedded from typemap WS/WS-typemap.dat. typedef struct _wsse__Embedded { /* Extensible with embedded tokens and assertions */ @char* wsu__Id; @char* ValueType; } _wsse__Embedded; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":KeyIdentifier of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":KeyIdentifierType. /// @brief This element defines a key identifier reference /// Imported element _wsse__KeyIdentifier from typemap WS/WS-typemap.dat. typedef struct _wsse__KeyIdentifier { char* __item; @char* wsu__Id; @char* ValueType; @char* EncodingType; } _wsse__KeyIdentifier; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityTokenReference of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityTokenReferenceType. /// @brief This element defines the wsse:SecurityTokenReference per Section 4.3. /// Imported element _wsse__SecurityTokenReference from typemap WS/WS-typemap.dat. typedef struct _wsse__SecurityTokenReference { struct _wsse__Reference* Reference; struct _wsse__KeyIdentifier* KeyIdentifier; struct _wsse__Embedded* Embedded; struct ds__X509DataType* X509Data; @char* wsu__Id; @char* wsc__Instance; @char* Usage; } _wsse__SecurityTokenReference; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":Security of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityHeaderType. /// @brief This element defines the wsse:Security SOAP header element per Section 4. /// Imported element _wsse__Security from typemap WS/WS-typemap.dat. #import "xenc.h" #import "wsc.h" typedef struct _wsse__Security { struct _wsu__Timestamp* wsu__Timestamp; struct _wsse__UsernameToken* UsernameToken; struct _wsse__BinarySecurityToken* BinarySecurityToken; struct xenc__EncryptedKeyType* xenc__EncryptedKey; struct _xenc__ReferenceList* xenc__ReferenceList; struct wsc__SecurityContextTokenType* wsc__SecurityContextToken; struct ds__SignatureType* ds__Signature; @char* SOAP_ENV__actor; @char* SOAP_ENV__role; } _wsse__Security; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":TransformationParameters of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":TransformationParametersType. /// @brief This element contains properties for transformations from any namespace, including DSIG. /// '_wsse__TransformationParameters' element definition intentionally left blank. /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":Password of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":PasswordString. /// Imported element _wsse__Password from typemap WS/WS-typemap.dat. typedef struct _wsse__Password { char* __item; @char* Type; } _wsse__Password; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":Nonce of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":EncodedString. /// '_wsse__Nonce' element definition intentionally left blank. /// Attribute "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":Usage of simpleType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":tUsage. /// @brief This global attribute is used to indicate the usage of a referenced or indicated token within the containing context /// '_wsse__Usage' attribute definition intentionally left blank. mutable struct SOAP_ENV__Header { mustUnderstand _wsse__Security *wsse__Security 0; }; /* End of wsse.h */ gsoap-2.8.91/gsoap/import/stl.h0000644000175000017500000000510713525245161015671 0ustar ellertellert/* stl.h #import "stl.h" in a gSOAP header file to enable STL vectors, deques, lists, and sets. You can now remap std::vector in wsdl2h's output to another container by defining the '$CONTAINER' variable in typemap.dat, for example to use std::list: $CONTAINER = std::list Use soapcpp2 option -Ipath:path:... to specify the path(s) for #import gSOAP XML Web services tools Copyright (C) 2000-2015, 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-2015 Robert A. 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 -------------------------------------------------------------------------------- */ #import "stldeque.h" #import "stllist.h" #import "stlvector.h" #import "stlset.h" gsoap-2.8.91/gsoap/import/wsdd5.h0000644000175000017500000014446013525245161016123 0ustar ellertellert/* wsdd5.h WS-Discovery 1.0 2005 with WS-Addressing 2005/08 Generated with: wsdl2h -cgyex -o wsdd5.h -t WS/WS-typemap.dat WS/discovery.xsd Modified by Robert van Engelen: - Removed //gsoapopt - Changed //gsoap wssd schema namespace directive to import directive - Changed namespace to WS-Discovery 2005/04 protocol with wsdd5 - Added #import "wsdx.h" at the end of these definitions - Added #define SOAP_WSDD_2005 */ #define SOAP_WSDD_2005 /******************************************************************************\ * * * Definitions * * http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01 * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ #import "wsa5.h" // wsa5 = /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ #define SOAP_NAMESPACE_OF_wsdd "http://schemas.xmlsoap.org/ws/2005/04/discovery" //gsoap wsdd schema import: http://schemas.xmlsoap.org/ws/2005/04/discovery //gsoap wsdd schema elementForm: qualified //gsoap wsdd schema attributeForm: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ // Imported element ""http://www.w3.org/2005/08/addressing":EndpointReference" declared as _wsa5__EndpointReference. /// @brief Typedef synonym for struct wsdd__HelloType. typedef struct wsdd__HelloType wsdd__HelloType; /// @brief Typedef synonym for struct wsdd__ByeType. typedef struct wsdd__ByeType wsdd__ByeType; /// @brief Typedef synonym for struct wsdd__ProbeType. typedef struct wsdd__ProbeType wsdd__ProbeType; /// @brief Typedef synonym for struct wsdd__ProbeMatchesType. typedef struct wsdd__ProbeMatchesType wsdd__ProbeMatchesType; /// @brief Typedef synonym for struct wsdd__ProbeMatchType. typedef struct wsdd__ProbeMatchType wsdd__ProbeMatchType; /// @brief Typedef synonym for struct wsdd__ResolveType. typedef struct wsdd__ResolveType wsdd__ResolveType; /// @brief Typedef synonym for struct wsdd__ResolveMatchesType. typedef struct wsdd__ResolveMatchesType wsdd__ResolveMatchesType; /// @brief Typedef synonym for struct wsdd__ResolveMatchType. typedef struct wsdd__ResolveMatchType wsdd__ResolveMatchType; /// @brief Typedef synonym for struct wsdd__ScopesType. typedef struct wsdd__ScopesType wsdd__ScopesType; /// @brief Typedef synonym for struct wsdd__SecurityType. typedef struct wsdd__SecurityType wsdd__SecurityType; /// @brief Typedef synonym for struct wsdd__SigType. typedef struct wsdd__SigType wsdd__SigType; /// @brief Typedef synonym for struct wsdd__AppSequenceType. typedef struct wsdd__AppSequenceType wsdd__AppSequenceType; /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01 * * * \******************************************************************************/ /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":QNameListType is a simpleType containing a whitespace separated list of xs:QName. /// typedef _QName wsdd__QNameListType; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":UriListType is a simpleType containing a whitespace separated list of xs:anyURI. /// typedef char* wsdd__UriListType; /// @brief Union of values from member types "tns:FaultCodeType xs:QName". typedef char* wsdd__FaultCodeOpenType; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":FaultCodeType is a simpleType restriction of XSD type xs:QName. /// enum wsdd__FaultCodeType { wsdd__MatchingRuleNotSupported, ///< xs:QName value=""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":MatchingRuleNotSupported" }; /// @brief Typedef synonym for enum wsdd__FaultCodeType. typedef enum wsdd__FaultCodeType wsdd__FaultCodeType; /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01 * * * \******************************************************************************/ /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":HelloType is a complexType. /// /// struct wsdd__HelloType operations: /// - wsdd__HelloType* soap_new_wsdd__HelloType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wsdd__HelloType(struct soap*, wsdd__HelloType*) default initialize members /// - int soap_read_wsdd__HelloType(struct soap*, wsdd__HelloType*) deserialize from a source /// - int soap_write_wsdd__HelloType(struct soap*, wsdd__HelloType*) serialize to a sink /// - wsdd__HelloType* soap_dup_wsdd__HelloType(struct soap*, wsdd__HelloType* dst, wsdd__HelloType *src) returns deep copy of wsdd__HelloType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wsdd__HelloType(wsdd__HelloType*) deep deletes wsdd__HelloType data members, use only on dst after soap_dup_wsdd__HelloType(NULL, wsdd__HelloType *dst, wsdd__HelloType *src) (use soapcpp2 -Ed) struct wsdd__HelloType { /// Imported element reference "http://www.w3.org/2005/08/addressing":EndpointReference. _wsa5__EndpointReference wsa5__EndpointReference 1; ///< Required element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Types. wsdd__QNameListType Types 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Scopes. struct wsdd__ScopesType* Scopes 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":XAddrs. wsdd__UriListType XAddrs 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":MetadataVersion. unsigned int MetadataVersion 1; ///< Required element. /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ByeType is a complexType. /// /// struct wsdd__ByeType operations: /// - wsdd__ByeType* soap_new_wsdd__ByeType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wsdd__ByeType(struct soap*, wsdd__ByeType*) default initialize members /// - int soap_read_wsdd__ByeType(struct soap*, wsdd__ByeType*) deserialize from a source /// - int soap_write_wsdd__ByeType(struct soap*, wsdd__ByeType*) serialize to a sink /// - wsdd__ByeType* soap_dup_wsdd__ByeType(struct soap*, wsdd__ByeType* dst, wsdd__ByeType *src) returns deep copy of wsdd__ByeType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wsdd__ByeType(wsdd__ByeType*) deep deletes wsdd__ByeType data members, use only on dst after soap_dup_wsdd__ByeType(NULL, wsdd__ByeType *dst, wsdd__ByeType *src) (use soapcpp2 -Ed) struct wsdd__ByeType { /// Imported element reference "http://www.w3.org/2005/08/addressing":EndpointReference. _wsa5__EndpointReference wsa5__EndpointReference 1; ///< Required element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Types. wsdd__QNameListType Types 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Scopes. struct wsdd__ScopesType* Scopes 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":XAddrs. wsdd__UriListType XAddrs 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":MetadataVersion. unsigned int* MetadataVersion 0; ///< Optional element. /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ProbeType is a complexType. /// /// struct wsdd__ProbeType operations: /// - wsdd__ProbeType* soap_new_wsdd__ProbeType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wsdd__ProbeType(struct soap*, wsdd__ProbeType*) default initialize members /// - int soap_read_wsdd__ProbeType(struct soap*, wsdd__ProbeType*) deserialize from a source /// - int soap_write_wsdd__ProbeType(struct soap*, wsdd__ProbeType*) serialize to a sink /// - wsdd__ProbeType* soap_dup_wsdd__ProbeType(struct soap*, wsdd__ProbeType* dst, wsdd__ProbeType *src) returns deep copy of wsdd__ProbeType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wsdd__ProbeType(wsdd__ProbeType*) deep deletes wsdd__ProbeType data members, use only on dst after soap_dup_wsdd__ProbeType(NULL, wsdd__ProbeType *dst, wsdd__ProbeType *src) (use soapcpp2 -Ed) struct wsdd__ProbeType { /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Types. wsdd__QNameListType Types 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Scopes. struct wsdd__ScopesType* Scopes 0; ///< Optional element. /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ProbeMatchesType is a complexType. /// /// struct wsdd__ProbeMatchesType operations: /// - wsdd__ProbeMatchesType* soap_new_wsdd__ProbeMatchesType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wsdd__ProbeMatchesType(struct soap*, wsdd__ProbeMatchesType*) default initialize members /// - int soap_read_wsdd__ProbeMatchesType(struct soap*, wsdd__ProbeMatchesType*) deserialize from a source /// - int soap_write_wsdd__ProbeMatchesType(struct soap*, wsdd__ProbeMatchesType*) serialize to a sink /// - wsdd__ProbeMatchesType* soap_dup_wsdd__ProbeMatchesType(struct soap*, wsdd__ProbeMatchesType* dst, wsdd__ProbeMatchesType *src) returns deep copy of wsdd__ProbeMatchesType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wsdd__ProbeMatchesType(wsdd__ProbeMatchesType*) deep deletes wsdd__ProbeMatchesType data members, use only on dst after soap_dup_wsdd__ProbeMatchesType(NULL, wsdd__ProbeMatchesType *dst, wsdd__ProbeMatchesType *src) (use soapcpp2 -Ed) struct wsdd__ProbeMatchesType { /// Size of array of struct wsdd__ProbeMatchType* is 0..unbounded. $int __sizeProbeMatch 0; /// Array struct wsdd__ProbeMatchType* of size 0..unbounded. struct wsdd__ProbeMatchType* ProbeMatch 0; /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ProbeMatchType is a complexType. /// /// struct wsdd__ProbeMatchType operations: /// - wsdd__ProbeMatchType* soap_new_wsdd__ProbeMatchType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wsdd__ProbeMatchType(struct soap*, wsdd__ProbeMatchType*) default initialize members /// - int soap_read_wsdd__ProbeMatchType(struct soap*, wsdd__ProbeMatchType*) deserialize from a source /// - int soap_write_wsdd__ProbeMatchType(struct soap*, wsdd__ProbeMatchType*) serialize to a sink /// - wsdd__ProbeMatchType* soap_dup_wsdd__ProbeMatchType(struct soap*, wsdd__ProbeMatchType* dst, wsdd__ProbeMatchType *src) returns deep copy of wsdd__ProbeMatchType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wsdd__ProbeMatchType(wsdd__ProbeMatchType*) deep deletes wsdd__ProbeMatchType data members, use only on dst after soap_dup_wsdd__ProbeMatchType(NULL, wsdd__ProbeMatchType *dst, wsdd__ProbeMatchType *src) (use soapcpp2 -Ed) struct wsdd__ProbeMatchType { /// Imported element reference "http://www.w3.org/2005/08/addressing":EndpointReference. _wsa5__EndpointReference wsa5__EndpointReference 1; ///< Required element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Types. wsdd__QNameListType Types 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Scopes. struct wsdd__ScopesType* Scopes 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":XAddrs. wsdd__UriListType XAddrs 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":MetadataVersion. unsigned int MetadataVersion 1; ///< Required element. /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ResolveType is a complexType. /// /// struct wsdd__ResolveType operations: /// - wsdd__ResolveType* soap_new_wsdd__ResolveType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wsdd__ResolveType(struct soap*, wsdd__ResolveType*) default initialize members /// - int soap_read_wsdd__ResolveType(struct soap*, wsdd__ResolveType*) deserialize from a source /// - int soap_write_wsdd__ResolveType(struct soap*, wsdd__ResolveType*) serialize to a sink /// - wsdd__ResolveType* soap_dup_wsdd__ResolveType(struct soap*, wsdd__ResolveType* dst, wsdd__ResolveType *src) returns deep copy of wsdd__ResolveType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wsdd__ResolveType(wsdd__ResolveType*) deep deletes wsdd__ResolveType data members, use only on dst after soap_dup_wsdd__ResolveType(NULL, wsdd__ResolveType *dst, wsdd__ResolveType *src) (use soapcpp2 -Ed) struct wsdd__ResolveType { /// Imported element reference "http://www.w3.org/2005/08/addressing":EndpointReference. _wsa5__EndpointReference wsa5__EndpointReference 1; ///< Required element. /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ResolveMatchesType is a complexType. /// /// struct wsdd__ResolveMatchesType operations: /// - wsdd__ResolveMatchesType* soap_new_wsdd__ResolveMatchesType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wsdd__ResolveMatchesType(struct soap*, wsdd__ResolveMatchesType*) default initialize members /// - int soap_read_wsdd__ResolveMatchesType(struct soap*, wsdd__ResolveMatchesType*) deserialize from a source /// - int soap_write_wsdd__ResolveMatchesType(struct soap*, wsdd__ResolveMatchesType*) serialize to a sink /// - wsdd__ResolveMatchesType* soap_dup_wsdd__ResolveMatchesType(struct soap*, wsdd__ResolveMatchesType* dst, wsdd__ResolveMatchesType *src) returns deep copy of wsdd__ResolveMatchesType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wsdd__ResolveMatchesType(wsdd__ResolveMatchesType*) deep deletes wsdd__ResolveMatchesType data members, use only on dst after soap_dup_wsdd__ResolveMatchesType(NULL, wsdd__ResolveMatchesType *dst, wsdd__ResolveMatchesType *src) (use soapcpp2 -Ed) struct wsdd__ResolveMatchesType { /// Element "ResolveMatch" of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ResolveMatchType. struct wsdd__ResolveMatchType* ResolveMatch 0; ///< Optional element. /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ResolveMatchType is a complexType. /// /// struct wsdd__ResolveMatchType operations: /// - wsdd__ResolveMatchType* soap_new_wsdd__ResolveMatchType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wsdd__ResolveMatchType(struct soap*, wsdd__ResolveMatchType*) default initialize members /// - int soap_read_wsdd__ResolveMatchType(struct soap*, wsdd__ResolveMatchType*) deserialize from a source /// - int soap_write_wsdd__ResolveMatchType(struct soap*, wsdd__ResolveMatchType*) serialize to a sink /// - wsdd__ResolveMatchType* soap_dup_wsdd__ResolveMatchType(struct soap*, wsdd__ResolveMatchType* dst, wsdd__ResolveMatchType *src) returns deep copy of wsdd__ResolveMatchType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wsdd__ResolveMatchType(wsdd__ResolveMatchType*) deep deletes wsdd__ResolveMatchType data members, use only on dst after soap_dup_wsdd__ResolveMatchType(NULL, wsdd__ResolveMatchType *dst, wsdd__ResolveMatchType *src) (use soapcpp2 -Ed) struct wsdd__ResolveMatchType { /// Imported element reference "http://www.w3.org/2005/08/addressing":EndpointReference. _wsa5__EndpointReference wsa5__EndpointReference 1; ///< Required element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Types. wsdd__QNameListType Types 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Scopes. struct wsdd__ScopesType* Scopes 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":XAddrs. wsdd__UriListType XAddrs 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":MetadataVersion. unsigned int MetadataVersion 1; ///< Required element. /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":SecurityType is a complexType. /// /// struct wsdd__SecurityType operations: /// - wsdd__SecurityType* soap_new_wsdd__SecurityType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wsdd__SecurityType(struct soap*, wsdd__SecurityType*) default initialize members /// - int soap_read_wsdd__SecurityType(struct soap*, wsdd__SecurityType*) deserialize from a source /// - int soap_write_wsdd__SecurityType(struct soap*, wsdd__SecurityType*) serialize to a sink /// - wsdd__SecurityType* soap_dup_wsdd__SecurityType(struct soap*, wsdd__SecurityType* dst, wsdd__SecurityType *src) returns deep copy of wsdd__SecurityType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wsdd__SecurityType(wsdd__SecurityType*) deep deletes wsdd__SecurityType data members, use only on dst after soap_dup_wsdd__SecurityType(NULL, wsdd__SecurityType *dst, wsdd__SecurityType *src) (use soapcpp2 -Ed) struct wsdd__SecurityType { /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Sig. struct wsdd__SigType* Sig 0; ///< Optional element. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":SigType is a complexType. /// /// struct wsdd__SigType operations: /// - wsdd__SigType* soap_new_wsdd__SigType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wsdd__SigType(struct soap*, wsdd__SigType*) default initialize members /// - int soap_read_wsdd__SigType(struct soap*, wsdd__SigType*) deserialize from a source /// - int soap_write_wsdd__SigType(struct soap*, wsdd__SigType*) serialize to a sink /// - wsdd__SigType* soap_dup_wsdd__SigType(struct soap*, wsdd__SigType* dst, wsdd__SigType *src) returns deep copy of wsdd__SigType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wsdd__SigType(wsdd__SigType*) deep deletes wsdd__SigType data members, use only on dst after soap_dup_wsdd__SigType(NULL, wsdd__SigType *dst, wsdd__SigType *src) (use soapcpp2 -Ed) struct wsdd__SigType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// Attribute "Scheme" of XSD type xs:anyURI. @char* Scheme 1; ///< Required attribute. /// Attribute "KeyId" of XSD type xs:base64Binary. @char* KeyId 0; ///< Optional attribute. /// Attribute "Refs" of XSD type xs:IDREFS. @char* Refs 1; ///< Required attribute. /// Attribute "Sig" of XSD type xs:base64Binary. @char* Sig 1; ///< Required attribute. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ScopesType is a complexType with simpleContent. /// /// struct wsdd__ScopesType operations: /// - wsdd__ScopesType* soap_new_wsdd__ScopesType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wsdd__ScopesType(struct soap*, wsdd__ScopesType*) default initialize members /// - int soap_read_wsdd__ScopesType(struct soap*, wsdd__ScopesType*) deserialize from a source /// - int soap_write_wsdd__ScopesType(struct soap*, wsdd__ScopesType*) serialize to a sink /// - wsdd__ScopesType* soap_dup_wsdd__ScopesType(struct soap*, wsdd__ScopesType* dst, wsdd__ScopesType *src) returns deep copy of wsdd__ScopesType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wsdd__ScopesType(wsdd__ScopesType*) deep deletes wsdd__ScopesType data members, use only on dst after soap_dup_wsdd__ScopesType(NULL, wsdd__ScopesType *dst, wsdd__ScopesType *src) (use soapcpp2 -Ed) struct wsdd__ScopesType { /// __item wraps ""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":UriListType" simpleContent. wsdd__UriListType __item ; /// Attribute "MatchBy" of XSD type xs:anyURI. @char* MatchBy 0; ///< Optional attribute. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":AppSequenceType is a complexType with complexContent restriction of XSD type xs:anyType. /// /// struct wsdd__AppSequenceType operations: /// - wsdd__AppSequenceType* soap_new_wsdd__AppSequenceType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wsdd__AppSequenceType(struct soap*, wsdd__AppSequenceType*) default initialize members /// - int soap_read_wsdd__AppSequenceType(struct soap*, wsdd__AppSequenceType*) deserialize from a source /// - int soap_write_wsdd__AppSequenceType(struct soap*, wsdd__AppSequenceType*) serialize to a sink /// - wsdd__AppSequenceType* soap_dup_wsdd__AppSequenceType(struct soap*, wsdd__AppSequenceType* dst, wsdd__AppSequenceType *src) returns deep copy of wsdd__AppSequenceType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wsdd__AppSequenceType(wsdd__AppSequenceType*) deep deletes wsdd__AppSequenceType data members, use only on dst after soap_dup_wsdd__AppSequenceType(NULL, wsdd__AppSequenceType *dst, wsdd__AppSequenceType *src) (use soapcpp2 -Ed) struct wsdd__AppSequenceType { /// Attribute "InstanceId" of XSD type xs:unsignedInt. @unsigned int InstanceId 1; ///< Required attribute. /// Attribute "SequenceId" of XSD type xs:anyURI. @char* SequenceId 0; ///< Optional attribute. /// Attribute "MessageNumber" of XSD type xs:unsignedInt. @unsigned int MessageNumber 1; ///< Required attribute. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /******************************************************************************\ * * * Additional Top-Level Elements * * http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01 * * * \******************************************************************************/ /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Hello of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":HelloType. typedef struct wsdd__HelloType _wsdd__Hello; /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Bye of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ByeType. typedef struct wsdd__ByeType _wsdd__Bye; /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Probe of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ProbeType. typedef struct wsdd__ProbeType _wsdd__Probe; /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ProbeMatches of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ProbeMatchesType. typedef struct wsdd__ProbeMatchesType _wsdd__ProbeMatches; /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Resolve of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ResolveType. typedef struct wsdd__ResolveType _wsdd__Resolve; /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ResolveMatches of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ResolveMatchesType. typedef struct wsdd__ResolveMatchesType _wsdd__ResolveMatches; /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Types of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":QNameListType. typedef wsdd__QNameListType _wsdd__Types; /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Scopes of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ScopesType. typedef struct wsdd__ScopesType _wsdd__Scopes; /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":XAddrs of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":UriListType. typedef wsdd__UriListType _wsdd__XAddrs; /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":MetadataVersion of XSD type xs:unsignedInt. typedef unsigned int _wsdd__MetadataVersion; /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":SupportedMatchingRules of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":UriListType. typedef wsdd__UriListType _wsdd__SupportedMatchingRules; /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Security of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":SecurityType. typedef struct wsdd__SecurityType _wsdd__Security; /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Sig of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":SigType. typedef struct wsdd__SigType _wsdd__Sig; /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":AppSequence of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":AppSequenceType. typedef struct wsdd__AppSequenceType _wsdd__AppSequence; /******************************************************************************\ * * * Additional Top-Level Attributes * * http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01 * * * \******************************************************************************/ /// @brief Top-level attribute "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Id of simpleType xs:ID. typedef char* _wsdd__Id; /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. Data can be read and deserialized from: - an int file descriptor, using soap->recvfd = fd - a socket, using soap->socket = (int)... - a C++ stream (istream, stringstream), using soap->is = (istream*)... - a C string, using soap->is = (const char*)... - any input, using the soap->frecv() callback Data can be serialized and written to: - an int file descriptor, using soap->sendfd = (int)... - a socket, using soap->socket = (int)... - a C++ stream (ostream, stringstream), using soap->os = (ostream*)... - a C string, using soap->os = (const char**)... - any output, using the soap->fsend() callback The following options are available for (de)serialization control: - soap->encodingStyle = NULL; to remove SOAP 1.1/1.2 encodingStyle - soap_mode(soap, SOAP_XML_TREE); XML without id-ref (no cycles!) - soap_mode(soap, SOAP_XML_GRAPH); XML with id-ref (including cycles) - soap_set_namespaces(soap, struct Namespace *nsmap); to set xmlns bindings @section wsdd Top-level root elements of schema "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01" - @ref _wsdd__Hello @code // Reader (returns SOAP_OK on success): soap_read__wsdd__Hello(struct soap*, _wsdd__Hello*); // Writer (returns SOAP_OK on success): soap_write__wsdd__Hello(struct soap*, _wsdd__Hello*); // REST GET (returns SOAP_OK on success): soap_GET__wsdd__Hello(struct soap*, const char *URL, _wsdd__Hello*); // REST PUT (returns SOAP_OK on success): soap_PUT__wsdd__Hello(struct soap*, const char *URL, _wsdd__Hello*); // REST POST (returns SOAP_OK on success): soap_POST_send__wsdd__Hello(struct soap*, const char *URL, _wsdd__Hello*); soap_POST_recv__wsdd__Hello(struct soap*, _wsdd__Hello*); @endcode - @ref _wsdd__Bye @code // Reader (returns SOAP_OK on success): soap_read__wsdd__Bye(struct soap*, _wsdd__Bye*); // Writer (returns SOAP_OK on success): soap_write__wsdd__Bye(struct soap*, _wsdd__Bye*); // REST GET (returns SOAP_OK on success): soap_GET__wsdd__Bye(struct soap*, const char *URL, _wsdd__Bye*); // REST PUT (returns SOAP_OK on success): soap_PUT__wsdd__Bye(struct soap*, const char *URL, _wsdd__Bye*); // REST POST (returns SOAP_OK on success): soap_POST_send__wsdd__Bye(struct soap*, const char *URL, _wsdd__Bye*); soap_POST_recv__wsdd__Bye(struct soap*, _wsdd__Bye*); @endcode - @ref _wsdd__Probe @code // Reader (returns SOAP_OK on success): soap_read__wsdd__Probe(struct soap*, _wsdd__Probe*); // Writer (returns SOAP_OK on success): soap_write__wsdd__Probe(struct soap*, _wsdd__Probe*); // REST GET (returns SOAP_OK on success): soap_GET__wsdd__Probe(struct soap*, const char *URL, _wsdd__Probe*); // REST PUT (returns SOAP_OK on success): soap_PUT__wsdd__Probe(struct soap*, const char *URL, _wsdd__Probe*); // REST POST (returns SOAP_OK on success): soap_POST_send__wsdd__Probe(struct soap*, const char *URL, _wsdd__Probe*); soap_POST_recv__wsdd__Probe(struct soap*, _wsdd__Probe*); @endcode - @ref _wsdd__ProbeMatches @code // Reader (returns SOAP_OK on success): soap_read__wsdd__ProbeMatches(struct soap*, _wsdd__ProbeMatches*); // Writer (returns SOAP_OK on success): soap_write__wsdd__ProbeMatches(struct soap*, _wsdd__ProbeMatches*); // REST GET (returns SOAP_OK on success): soap_GET__wsdd__ProbeMatches(struct soap*, const char *URL, _wsdd__ProbeMatches*); // REST PUT (returns SOAP_OK on success): soap_PUT__wsdd__ProbeMatches(struct soap*, const char *URL, _wsdd__ProbeMatches*); // REST POST (returns SOAP_OK on success): soap_POST_send__wsdd__ProbeMatches(struct soap*, const char *URL, _wsdd__ProbeMatches*); soap_POST_recv__wsdd__ProbeMatches(struct soap*, _wsdd__ProbeMatches*); @endcode - @ref _wsdd__Resolve @code // Reader (returns SOAP_OK on success): soap_read__wsdd__Resolve(struct soap*, _wsdd__Resolve*); // Writer (returns SOAP_OK on success): soap_write__wsdd__Resolve(struct soap*, _wsdd__Resolve*); // REST GET (returns SOAP_OK on success): soap_GET__wsdd__Resolve(struct soap*, const char *URL, _wsdd__Resolve*); // REST PUT (returns SOAP_OK on success): soap_PUT__wsdd__Resolve(struct soap*, const char *URL, _wsdd__Resolve*); // REST POST (returns SOAP_OK on success): soap_POST_send__wsdd__Resolve(struct soap*, const char *URL, _wsdd__Resolve*); soap_POST_recv__wsdd__Resolve(struct soap*, _wsdd__Resolve*); @endcode - @ref _wsdd__ResolveMatches @code // Reader (returns SOAP_OK on success): soap_read__wsdd__ResolveMatches(struct soap*, _wsdd__ResolveMatches*); // Writer (returns SOAP_OK on success): soap_write__wsdd__ResolveMatches(struct soap*, _wsdd__ResolveMatches*); // REST GET (returns SOAP_OK on success): soap_GET__wsdd__ResolveMatches(struct soap*, const char *URL, _wsdd__ResolveMatches*); // REST PUT (returns SOAP_OK on success): soap_PUT__wsdd__ResolveMatches(struct soap*, const char *URL, _wsdd__ResolveMatches*); // REST POST (returns SOAP_OK on success): soap_POST_send__wsdd__ResolveMatches(struct soap*, const char *URL, _wsdd__ResolveMatches*); soap_POST_recv__wsdd__ResolveMatches(struct soap*, _wsdd__ResolveMatches*); @endcode - @ref _wsdd__Types @code // Reader (returns SOAP_OK on success): soap_read__wsdd__Types(struct soap*, _wsdd__Types*); // Writer (returns SOAP_OK on success): soap_write__wsdd__Types(struct soap*, _wsdd__Types*); // REST GET (returns SOAP_OK on success): soap_GET__wsdd__Types(struct soap*, const char *URL, _wsdd__Types*); // REST PUT (returns SOAP_OK on success): soap_PUT__wsdd__Types(struct soap*, const char *URL, _wsdd__Types*); // REST POST (returns SOAP_OK on success): soap_POST_send__wsdd__Types(struct soap*, const char *URL, _wsdd__Types*); soap_POST_recv__wsdd__Types(struct soap*, _wsdd__Types*); @endcode - @ref _wsdd__Scopes @code // Reader (returns SOAP_OK on success): soap_read__wsdd__Scopes(struct soap*, _wsdd__Scopes*); // Writer (returns SOAP_OK on success): soap_write__wsdd__Scopes(struct soap*, _wsdd__Scopes*); // REST GET (returns SOAP_OK on success): soap_GET__wsdd__Scopes(struct soap*, const char *URL, _wsdd__Scopes*); // REST PUT (returns SOAP_OK on success): soap_PUT__wsdd__Scopes(struct soap*, const char *URL, _wsdd__Scopes*); // REST POST (returns SOAP_OK on success): soap_POST_send__wsdd__Scopes(struct soap*, const char *URL, _wsdd__Scopes*); soap_POST_recv__wsdd__Scopes(struct soap*, _wsdd__Scopes*); @endcode - @ref _wsdd__XAddrs @code // Reader (returns SOAP_OK on success): soap_read__wsdd__XAddrs(struct soap*, _wsdd__XAddrs*); // Writer (returns SOAP_OK on success): soap_write__wsdd__XAddrs(struct soap*, _wsdd__XAddrs*); // REST GET (returns SOAP_OK on success): soap_GET__wsdd__XAddrs(struct soap*, const char *URL, _wsdd__XAddrs*); // REST PUT (returns SOAP_OK on success): soap_PUT__wsdd__XAddrs(struct soap*, const char *URL, _wsdd__XAddrs*); // REST POST (returns SOAP_OK on success): soap_POST_send__wsdd__XAddrs(struct soap*, const char *URL, _wsdd__XAddrs*); soap_POST_recv__wsdd__XAddrs(struct soap*, _wsdd__XAddrs*); @endcode - @ref _wsdd__MetadataVersion @code // Reader (returns SOAP_OK on success): soap_read__wsdd__MetadataVersion(struct soap*, _wsdd__MetadataVersion*); // Writer (returns SOAP_OK on success): soap_write__wsdd__MetadataVersion(struct soap*, _wsdd__MetadataVersion*); // REST GET (returns SOAP_OK on success): soap_GET__wsdd__MetadataVersion(struct soap*, const char *URL, _wsdd__MetadataVersion*); // REST PUT (returns SOAP_OK on success): soap_PUT__wsdd__MetadataVersion(struct soap*, const char *URL, _wsdd__MetadataVersion*); // REST POST (returns SOAP_OK on success): soap_POST_send__wsdd__MetadataVersion(struct soap*, const char *URL, _wsdd__MetadataVersion*); soap_POST_recv__wsdd__MetadataVersion(struct soap*, _wsdd__MetadataVersion*); @endcode - @ref _wsdd__SupportedMatchingRules @code // Reader (returns SOAP_OK on success): soap_read__wsdd__SupportedMatchingRules(struct soap*, _wsdd__SupportedMatchingRules*); // Writer (returns SOAP_OK on success): soap_write__wsdd__SupportedMatchingRules(struct soap*, _wsdd__SupportedMatchingRules*); // REST GET (returns SOAP_OK on success): soap_GET__wsdd__SupportedMatchingRules(struct soap*, const char *URL, _wsdd__SupportedMatchingRules*); // REST PUT (returns SOAP_OK on success): soap_PUT__wsdd__SupportedMatchingRules(struct soap*, const char *URL, _wsdd__SupportedMatchingRules*); // REST POST (returns SOAP_OK on success): soap_POST_send__wsdd__SupportedMatchingRules(struct soap*, const char *URL, _wsdd__SupportedMatchingRules*); soap_POST_recv__wsdd__SupportedMatchingRules(struct soap*, _wsdd__SupportedMatchingRules*); @endcode - @ref _wsdd__Security @code // Reader (returns SOAP_OK on success): soap_read__wsdd__Security(struct soap*, _wsdd__Security*); // Writer (returns SOAP_OK on success): soap_write__wsdd__Security(struct soap*, _wsdd__Security*); // REST GET (returns SOAP_OK on success): soap_GET__wsdd__Security(struct soap*, const char *URL, _wsdd__Security*); // REST PUT (returns SOAP_OK on success): soap_PUT__wsdd__Security(struct soap*, const char *URL, _wsdd__Security*); // REST POST (returns SOAP_OK on success): soap_POST_send__wsdd__Security(struct soap*, const char *URL, _wsdd__Security*); soap_POST_recv__wsdd__Security(struct soap*, _wsdd__Security*); @endcode - @ref _wsdd__Sig @code // Reader (returns SOAP_OK on success): soap_read__wsdd__Sig(struct soap*, _wsdd__Sig*); // Writer (returns SOAP_OK on success): soap_write__wsdd__Sig(struct soap*, _wsdd__Sig*); // REST GET (returns SOAP_OK on success): soap_GET__wsdd__Sig(struct soap*, const char *URL, _wsdd__Sig*); // REST PUT (returns SOAP_OK on success): soap_PUT__wsdd__Sig(struct soap*, const char *URL, _wsdd__Sig*); // REST POST (returns SOAP_OK on success): soap_POST_send__wsdd__Sig(struct soap*, const char *URL, _wsdd__Sig*); soap_POST_recv__wsdd__Sig(struct soap*, _wsdd__Sig*); @endcode - @ref _wsdd__AppSequence @code // Reader (returns SOAP_OK on success): soap_read__wsdd__AppSequence(struct soap*, _wsdd__AppSequence*); // Writer (returns SOAP_OK on success): soap_write__wsdd__AppSequence(struct soap*, _wsdd__AppSequence*); // REST GET (returns SOAP_OK on success): soap_GET__wsdd__AppSequence(struct soap*, const char *URL, _wsdd__AppSequence*); // REST PUT (returns SOAP_OK on success): soap_PUT__wsdd__AppSequence(struct soap*, const char *URL, _wsdd__AppSequence*); // REST POST (returns SOAP_OK on success): soap_POST_send__wsdd__AppSequence(struct soap*, const char *URL, _wsdd__AppSequence*); soap_POST_recv__wsdd__AppSequence(struct soap*, _wsdd__AppSequence*); @endcode */ #import "wsdx.h" /* End of wsdd.h */ gsoap-2.8.91/gsoap/import/dom.h0000644000175000017500000000564113525245161015651 0ustar ellertellert/* dom.h gSOAP DOM API v5 Use #import "dom.h" in gSOAP header files to use DOM-based xsd__anyType for XML element and xsd__anyAttribute for XML attributes. This import is automatic with wsdl2h option -d. Compile with dom.c[pp] or link with libgsoapssl.a (for C) or libgsoapssl++.a (for C++) See gsoap/doc/dom/html/index.html for the new DOM API v5 documentation Also located in /gsoap/samples/dom/README.md gSOAP XML Web services tools Copyright (C) 2000-2016, 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. -------------------------------------------------------------------------------- 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-2016, 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 -------------------------------------------------------------------------------- */ // The custom serializer for DOM element nodes is represented by xsd__anyType. extern typedef struct soap_dom_element xsd__anyType; // The custom serializer for DOM attribute nodes is represented by @xsd__anyAttribute. extern typedef struct soap_dom_attribute xsd__anyAttribute; gsoap-2.8.91/gsoap/import/c14n.h0000644000175000017500000000207113525245161015631 0ustar ellertellert/* c14n.h */ /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ //gsoap c14n schema import: http://www.w3.org/2001/10/xml-exc-c14n# //gsoap c14n schema elementForm: qualified //gsoap c14n schema attributeForm: unqualified /******************************************************************************\ * * * Schema Types * * * \******************************************************************************/ typedef struct _c14n__InclusiveNamespaces { @char* PrefixList; } _c14n__InclusiveNamespaces; gsoap-2.8.91/gsoap/import/wsrm.h0000644000175000017500000010103313525245161016052 0ustar ellertellert/* wsrm.h WS-ReliableMessaging 1.1 2007/02 and WS-Addressing 2005/08 Usage: See import/wsrx.h and plugin/wsrmapi.c Generated with: wsdl2h -cyex -o wsrm.h -t WS/WS-typemap.dat WS/WS-ReliableMessaging.xsd Modified by Robert van Engelen: - Removed //gsoapopt - Changed //gsoap wsrm schema namespace directive to import directive - Added #import "wsrx.h" at the end of these definitions - Added #define SOAP_WSRM_2007 - Added //gsoap netrm schema namespace: http://schemas.microsoft.com/ws/2006/05/rm Int* netrm__BufferRemaining; - Added _XML __any; to struct _wsrm__SequenceAcknowledgement */ #define SOAP_WSRM_2007 /******************************************************************************\ * * * Definitions * * http://docs.oasis-open.org/ws-rx/wsrm/200702 * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ #import "wsa5.h" // wsa5 = /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ #define SOAP_NAMESPACE_OF_wsrm "http://docs.oasis-open.org/ws-rx/wsrm/200702" //gsoap wsrm schema import: http://docs.oasis-open.org/ws-rx/wsrm/200702 //gsoap wsrm schema elementForm: qualified //gsoap wsrm schema attributeForm: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ // Imported type "http://www.w3.org/2005/08/addressing":EndpointReferenceType defined by wsa5__EndpointReferenceType /// Typedef synonym for struct wsrm__SequenceType. typedef struct wsrm__SequenceType wsrm__SequenceType; /// Typedef synonym for struct wsrm__AckRequestedType. typedef struct wsrm__AckRequestedType wsrm__AckRequestedType; /// Typedef synonym for struct wsrm__SequenceFaultType. typedef struct wsrm__SequenceFaultType wsrm__SequenceFaultType; /// Imported complexType "http://docs.oasis-open.org/ws-rx/wsrm/200702":DetailType from typemap WS/WS-typemap.dat. // complexType definition intentionally left blank. /// Typedef synonym for struct wsrm__CreateSequenceType. typedef struct wsrm__CreateSequenceType wsrm__CreateSequenceType; /// Typedef synonym for struct wsrm__CreateSequenceResponseType. typedef struct wsrm__CreateSequenceResponseType wsrm__CreateSequenceResponseType; /// Typedef synonym for struct wsrm__CloseSequenceType. typedef struct wsrm__CloseSequenceType wsrm__CloseSequenceType; /// Typedef synonym for struct wsrm__CloseSequenceResponseType. typedef struct wsrm__CloseSequenceResponseType wsrm__CloseSequenceResponseType; /// Typedef synonym for struct wsrm__TerminateSequenceType. typedef struct wsrm__TerminateSequenceType wsrm__TerminateSequenceType; /// Typedef synonym for struct wsrm__TerminateSequenceResponseType. typedef struct wsrm__TerminateSequenceResponseType wsrm__TerminateSequenceResponseType; /// Typedef synonym for struct wsrm__OfferType. typedef struct wsrm__OfferType wsrm__OfferType; /// Typedef synonym for struct wsrm__AcceptType. typedef struct wsrm__AcceptType wsrm__AcceptType; /// Typedef synonym for struct _wsrm__SequenceAcknowledgement. typedef struct _wsrm__SequenceAcknowledgement _wsrm__SequenceAcknowledgement; /// Imported complexType "http://docs.oasis-open.org/ws-rx/wsrm/200702":Identifier from typemap WS/WS-typemap.dat. /// @brief This type is for elements whose [children] is an anyURI and can have arbitrary attributes. typedef char *_wsrm__Identifier; /// Imported complexType "http://docs.oasis-open.org/ws-rx/wsrm/200702":Address from typemap WS/WS-typemap.dat. // complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/ws-rx/wsrm/200702":Expires from typemap WS/WS-typemap.dat. #import "custom/duration.h" /// Typedef synonym for struct _wsrm__UsesSequenceSTR. typedef struct _wsrm__UsesSequenceSTR _wsrm__UsesSequenceSTR; /// Typedef synonym for struct _wsrm__UsesSequenceSSL. typedef struct _wsrm__UsesSequenceSSL _wsrm__UsesSequenceSSL; /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://docs.oasis-open.org/ws-rx/wsrm/200702 * * * \******************************************************************************/ /// Imported simpleType "http://docs.oasis-open.org/ws-rx/wsrm/200702":MessageNumberType from typemap WS/WS-typemap.dat. // simpleType definition intentionally left blank. /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":FaultCodes is a simpleType restriction of xs:QName. enum wsrm__FaultCodes { wsrm__SequenceTerminated, ///< xs:QName value=""http://docs.oasis-open.org/ws-rx/wsrm/200702":SequenceTerminated" wsrm__UnknownSequence, ///< xs:QName value=""http://docs.oasis-open.org/ws-rx/wsrm/200702":UnknownSequence" wsrm__InvalidAcknowledgement, ///< xs:QName value=""http://docs.oasis-open.org/ws-rx/wsrm/200702":InvalidAcknowledgement" wsrm__MessageNumberRollover, ///< xs:QName value=""http://docs.oasis-open.org/ws-rx/wsrm/200702":MessageNumberRollover" wsrm__CreateSequenceRefused, ///< xs:QName value=""http://docs.oasis-open.org/ws-rx/wsrm/200702":CreateSequenceRefused" wsrm__SequenceClosed, ///< xs:QName value=""http://docs.oasis-open.org/ws-rx/wsrm/200702":SequenceClosed" wsrm__WSRMRequired, ///< xs:QName value=""http://docs.oasis-open.org/ws-rx/wsrm/200702":WSRMRequired" }; /// Typedef synonym for enum wsrm__FaultCodes. typedef enum wsrm__FaultCodes wsrm__FaultCodes; /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":IncompleteSequenceBehaviorType is a simpleType restriction of xs:string. enum wsrm__IncompleteSequenceBehaviorType { DiscardEntireSequence, ///< xs:string value="DiscardEntireSequence" DiscardFollowingFirstGap, ///< xs:string value="DiscardFollowingFirstGap" NoDiscard, ///< xs:string value="NoDiscard" }; /// Typedef synonym for enum wsrm__IncompleteSequenceBehaviorType. typedef enum wsrm__IncompleteSequenceBehaviorType wsrm__IncompleteSequenceBehaviorType; /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":UnsupportedElement is a simpleType restriction of xs:QName. /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://docs.oasis-open.org/ws-rx/wsrm/200702 * * * \******************************************************************************/ /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":SequenceType is a complexType. struct wsrm__SequenceType { /// Element reference "http://docs.oasis-open.org/ws-rx/wsrm/200702":Identifier. char* Identifier 1; ///< Required element. /// Element MessageNumber of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":MessageNumberType. ULONG64 MessageNumber 1; ///< Required element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":AckRequestedType is a complexType. struct wsrm__AckRequestedType { /// Element reference "http://docs.oasis-open.org/ws-rx/wsrm/200702":Identifier. char* Identifier 1; ///< Required element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":SequenceFaultType is a complexType. struct wsrm__SequenceFaultType { /// Element FaultCode of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":FaultCodes. enum wsrm__FaultCodes FaultCode 1; ///< Required element. /// Element Detail of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":DetailType. struct SOAP_ENV__Detail* Detail 0; ///< Optional element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":CreateSequenceType is a complexType. struct wsrm__CreateSequenceType { /// Element reference "http://docs.oasis-open.org/ws-rx/wsrm/200702":AcksTo. wsa5__EndpointReferenceType AcksTo 1; ///< Required element. /// Element reference "http://docs.oasis-open.org/ws-rx/wsrm/200702":Expires. xsd__duration* Expires 0; ///< Optional element. /// Element Offer of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":OfferType. struct wsrm__OfferType* Offer 0; ///< Optional element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":CreateSequenceResponseType is a complexType. struct wsrm__CreateSequenceResponseType { /// Element reference "http://docs.oasis-open.org/ws-rx/wsrm/200702":Identifier. char* Identifier 1; ///< Required element. /// Element reference "http://docs.oasis-open.org/ws-rx/wsrm/200702":Expires. xsd__duration* Expires 0; ///< Optional element. /// Element IncompleteSequenceBehavior of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":IncompleteSequenceBehaviorType. enum wsrm__IncompleteSequenceBehaviorType* IncompleteSequenceBehavior 0; ///< Optional element. /// Element Accept of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":AcceptType. struct wsrm__AcceptType* Accept 0; ///< Optional element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":CloseSequenceType is a complexType. struct wsrm__CloseSequenceType { /// Element reference "http://docs.oasis-open.org/ws-rx/wsrm/200702":Identifier. char* Identifier 1; ///< Required element. /// Element LastMsgNumber of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":MessageNumberType. ULONG64* LastMsgNumber 0; ///< Optional element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":CloseSequenceResponseType is a complexType. struct wsrm__CloseSequenceResponseType { /// Element reference "http://docs.oasis-open.org/ws-rx/wsrm/200702":Identifier. char* Identifier 1; ///< Required element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":TerminateSequenceType is a complexType. struct wsrm__TerminateSequenceType { /// Element reference "http://docs.oasis-open.org/ws-rx/wsrm/200702":Identifier. char* Identifier 1; ///< Required element. /// Element LastMsgNumber of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":MessageNumberType. ULONG64* LastMsgNumber 0; ///< Optional element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":TerminateSequenceResponseType is a complexType. struct wsrm__TerminateSequenceResponseType { /// Element reference "http://docs.oasis-open.org/ws-rx/wsrm/200702":Identifier. char* Identifier 1; ///< Required element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":OfferType is a complexType. struct wsrm__OfferType { /// Element reference "http://docs.oasis-open.org/ws-rx/wsrm/200702":Identifier. char* Identifier 1; ///< Required element. /// Element Endpoint of type "http://www.w3.org/2005/08/addressing":EndpointReferenceType. wsa5__EndpointReferenceType Endpoint 1; ///< Required element. /// Element reference "http://docs.oasis-open.org/ws-rx/wsrm/200702":Expires. xsd__duration* Expires 0; ///< Optional element. /// Element IncompleteSequenceBehavior of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":IncompleteSequenceBehaviorType. enum wsrm__IncompleteSequenceBehaviorType* IncompleteSequenceBehavior 0; ///< Optional element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":AcceptType is a complexType. struct wsrm__AcceptType { /// Element reference "http://docs.oasis-open.org/ws-rx/wsrm/200702":AcksTo. wsa5__EndpointReferenceType AcksTo 1; ///< Required element. /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":SequenceAcknowledgement /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":SequenceAcknowledgement is a complexType. struct _wsrm__SequenceAcknowledgement { /// Element reference "http://docs.oasis-open.org/ws-rx/wsrm/200702":Identifier. char* Identifier 1; ///< Required element. /// CHOICE OF ELEMENTS /// Note: with embedded or prevents the use of a union /// Size of array of ULONG64* is 1..unbounded $int __sizeNack 0; /// Array ULONG64* of length 1..unbounded ULONG64* Nack ; /// SEQUENCE OF ELEMENTS struct _wsrm__SequenceAcknowledgement_Final { /// SEQUENCE OF ELEMENTS // END OF SEQUENCE } *Final ; /// CHOICE OF ELEMENTS /// Note: of element with maxOccurs>1 prevents the use of a union /// Size of AcknowledgementRange array is 1..unbounded $int __sizeAcknowledgementRange 0; struct _wsrm__SequenceAcknowledgement_AcknowledgementRange { /// SEQUENCE OF ELEMENTS // END OF SEQUENCE /// Attribute Upper of type xs:unsignedLong. @ULONG64 Upper 1; ///< Required attribute. /// Attribute Lower of type xs:unsignedLong. @ULONG64 Lower 1; ///< Required attribute. /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). } *AcknowledgementRange ; struct _wsrm__SequenceAcknowledgement_None { /// SEQUENCE OF ELEMENTS // END OF SEQUENCE } *None ; // END OF CHOICE // END OF SEQUENCE // END OF CHOICE /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). //gsoap netrm schema namespace: http://schemas.microsoft.com/ws/2006/05/rm int *netrm__BufferRemaining; ///< WCF netrm BufferRemaining _XML __any; // extensibility /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":UsesSequenceSTR /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":UsesSequenceSTR is a complexType. struct _wsrm__UsesSequenceSTR { /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":UsesSequenceSSL /// "http://docs.oasis-open.org/ws-rx/wsrm/200702":UsesSequenceSSL is a complexType. struct _wsrm__UsesSequenceSSL { /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":Identifier /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":Address /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":Expires /******************************************************************************\ * * * Additional Top-Level Elements * * http://docs.oasis-open.org/ws-rx/wsrm/200702 * * * \******************************************************************************/ /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":Sequence of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":SequenceType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":AckRequested of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":AckRequestedType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":SequenceFault of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":SequenceFaultType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":CreateSequence of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":CreateSequenceType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":CreateSequenceResponse of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":CreateSequenceResponseType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":CloseSequence of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":CloseSequenceType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":CloseSequenceResponse of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":CloseSequenceResponseType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":TerminateSequence of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":TerminateSequenceType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":TerminateSequenceResponse of type "http://docs.oasis-open.org/ws-rx/wsrm/200702":TerminateSequenceResponseType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// Top-level root element "http://docs.oasis-open.org/ws-rx/wsrm/200702":AcksTo of type "http://www.w3.org/2005/08/addressing":EndpointReferenceType. /// Note: use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /******************************************************************************\ * * * Additional Top-Level Attributes * * http://docs.oasis-open.org/ws-rx/wsrm/200702 * * * \******************************************************************************/ /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. XML content can be retrieved from: - a FILE* fd, using soap->recvfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->is = ... - a buffer, using the soap->frecv() callback XML content can be stored to: - a FILE* fd, using soap->sendfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->os = ... - a buffer, using the soap->fsend() callback @section wsrm Top-level root elements of schema "http://docs.oasis-open.org/ws-rx/wsrm/200702" - (use wsdl2h option -g to auto-generate) - @ref _wsrm__SequenceAcknowledgement @code // Reader (returns SOAP_OK on success): soap_read__wsrm__SequenceAcknowledgement(struct soap*, struct _wsrm__SequenceAcknowledgement*); // Writer (returns SOAP_OK on success): soap_write__wsrm__SequenceAcknowledgement(struct soap*, struct _wsrm__SequenceAcknowledgement*); @endcode - (use wsdl2h option -g to auto-generate) - @ref _wsrm__Identifier @code // Reader (returns SOAP_OK on success): soap_read__wsrm__Identifier(struct soap*, char*); // Writer (returns SOAP_OK on success): soap_write__wsrm__Identifier(struct soap*, char*); @endcode - @ref _wsrm__Address @code // Reader (returns SOAP_OK on success): soap_read__wsrm__Address(struct soap*, char*); // Writer (returns SOAP_OK on success): soap_write__wsrm__Address(struct soap*, char*); @endcode - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - (use wsdl2h option -g to auto-generate) - @ref _wsrm__Expires @code // Reader (returns SOAP_OK on success): soap_read__wsrm__Expires(struct soap*, xsd__duration*); // Writer (returns SOAP_OK on success): soap_write__wsrm__Expires(struct soap*, xsd__duration*); @endcode - @ref _wsrm__UsesSequenceSTR @code // Reader (returns SOAP_OK on success): soap_read__wsrm__UsesSequenceSTR(struct soap*, struct _wsrm__UsesSequenceSTR*); // Writer (returns SOAP_OK on success): soap_write__wsrm__UsesSequenceSTR(struct soap*, struct _wsrm__UsesSequenceSTR*); @endcode - @ref _wsrm__UsesSequenceSSL @code // Reader (returns SOAP_OK on success): soap_read__wsrm__UsesSequenceSSL(struct soap*, struct _wsrm__UsesSequenceSSL*); // Writer (returns SOAP_OK on success): soap_write__wsrm__UsesSequenceSSL(struct soap*, struct _wsrm__UsesSequenceSSL*); @endcode - @ref _wsrm__UnsupportedElement @code // Reader (returns SOAP_OK on success): soap_read__wsrm__UnsupportedElement(struct soap*, _QName); // Writer (returns SOAP_OK on success): soap_write__wsrm__UnsupportedElement(struct soap*, _QName); @endcode */ #import "wsrx.h" /* End of wsrm.h */ gsoap-2.8.91/gsoap/import/xop.h0000644000175000017500000000562613525245161015703 0ustar ellertellert/* xop.h Use #import "xop.h" in a gSOAP header file to enable MTOM attachments. Use SOAP_ENC_MTOM flag in your code to switch to MTOM attachments, see the gSOAP documentation soapdoc2.html Use soapcpp2 option -Ipath:path:... to specify the path(s) for #import 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, 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-2008 Robert A. 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 -------------------------------------------------------------------------------- */ //gsoap xop schema namespace: http://www.w3.org/2004/08/xop/include //gsoap xop schema import: https://www.w3.org/2004/08/xop/include struct _xop__Include { unsigned char *__ptr; ///< pointer to binary data int __size; ///< size of binary data char *id; ///< NULL to generate an id, or set to a unique UUID char *type; ///< MIME type of the data char *options; ///< optional description of MIME attachment }; typedef struct _xop__Include _xop__Include; gsoap-2.8.91/gsoap/import/wsrm4.h0000644000175000017500000004770113525245161016151 0ustar ellertellert/* wsrm4.h WS-ReliableMessaging 1.0 2004/06 THIS IS AN OBSOLETE SPECIFICATION superseded by WS-ReliableMessaging 2005/08. Support for this version has ceased. Generated with: wsdl2h -cgex -o wsrm4.h -t WS/WS-typemap.dat WS/ws-reliability-1.1.xsd Modified by Robert van Engelen: - Removed //gsoapopt - Changed the //gsoap schema namespace directives to imports */ /******************************************************************************\ * * * http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ #import "ref.h" // ref = /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ //gsoap wsrm schema import: http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd //gsoap wsrm schema elementForm: qualified //gsoap wsrm schema attributeForm: unqualified /******************************************************************************\ * * * Schema Types * * * \******************************************************************************/ // Imported type "http://docs.oasis-open.org/wsrm/2004/06/reference-1.1.xsd":ServiceRefType defined by ref__ServiceRefType /// Built-in type "xs:boolean". enum xsd__boolean_ { _false, _true }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":ReplyPatternTypeValues is a simpleType restriction of xs:string. enum wsrm__ReplyPatternTypeValues { Response, ///< xs:string value="Response" Callback, ///< xs:string value="Callback" Poll, ///< xs:string value="Poll" }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":MIDType is a simpleType restriction of xs:anyURI. typedef char* /*URI*/ wsrm__MIDType; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":FaultCodeEnum is a simpleType restriction of xs:QName. enum wsrm__FaultCodeEnum { wsrm__InvalidMessageId, ///< xs:QName value=""http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":InvalidMessageId" wsrm__InvalidMessageParameters, ///< xs:QName value=""http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":InvalidMessageParameters" wsrm__InvalidPollRequest, ///< xs:QName value=""http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":InvalidPollRequest" wsrm__InvalidRequest, ///< xs:QName value=""http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":InvalidRequest" wsrm__InvalidExpiryTime, ///< xs:QName value=""http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":InvalidExpiryTime" wsrm__InvalidReplyPattern, ///< xs:QName value=""http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":InvalidReplyPattern" wsrm__FeatureNotSupported, ///< xs:QName value=""http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":FeatureNotSupported" wsrm__PermanentProcessingFailure, ///< xs:QName value=""http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":PermanentProcessingFailure" wsrm__MessageProcessingFailure, ///< xs:QName value=""http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":MessageProcessingFailure" wsrm__GroupAborted, ///< xs:QName value=""http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":GroupAborted" }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":BareURIType is a simpleType restriction of xs:anyURI. typedef char* /*URI*/ wsrm__BareURIType; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":HeaderBaseType is a complexType. struct wsrm__HeaderBaseType { /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":EmptyType is a complexType. struct wsrm__EmptyType { }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":ExtensibleType is a complexType. struct wsrm__ExtensibleType { /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":ReplyPatternType is a complexType. struct wsrm__ReplyPatternType { /// Element Value of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":ReplyPatternTypeValues. enum wsrm__ReplyPatternTypeValues Value 1; ///< Required element. /// Element ReplyTo of type "http://docs.oasis-open.org/wsrm/2004/06/reference-1.1.xsd":ServiceRefType. ref__ServiceRefType* ReplyTo 0; ///< Optional element. }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":RequestType is a complexType with complexContent extension of "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":HeaderBaseType. struct wsrm__RequestType { /// INHERITED FROM wsrm__HeaderBaseType: /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). // END OF INHERITED /// Element MessageId of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":MessageIdType. struct wsrm__MessageIdType* MessageId 1; ///< Required element. /// Element ExpiryTime of type xs:dateTime. time_t ExpiryTime 1; ///< Required element. /// Element ReplyPattern of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":ReplyPatternType. struct wsrm__ReplyPatternType* ReplyPattern 1; ///< Required element. /// Element AckRequested of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":EmptyType. struct wsrm__EmptyType* AckRequested 0; ///< Optional element. /// Element DuplicateElimination of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":EmptyType. struct wsrm__EmptyType* DuplicateElimination 0; ///< Optional element. /// Element MessageOrder of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":EmptyType. struct wsrm__EmptyType* MessageOrder 0; ///< Optional element. }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":MessageIdType is a complexType with complexContent extension of "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":EmptyType. struct wsrm__MessageIdType { /// INHERITED FROM wsrm__EmptyType: // END OF INHERITED /// Element SequenceNum of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":SequenceNumType. struct wsrm__SequenceNumType* SequenceNum 0; ///< Optional element. /// Attribute groupId of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":MIDType. @wsrm__MIDType groupId 1; ///< Required attribute. }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":SequenceNumType is a complexType with complexContent extension of "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":EmptyType. struct wsrm__SequenceNumType { /// INHERITED FROM wsrm__EmptyType: // END OF INHERITED /// Attribute number of type xs:unsignedLong. @ULONG64 number 1; ///< Required attribute. /// Attribute last of type xs:boolean. @enum xsd__boolean_ last 0 = false_; ///< Default value="false". /// Attribute groupExpiryTime of type xs:dateTime. @time_t* groupExpiryTime 0; ///< Optional attribute. /// Attribute groupMaxIdleDuration of type xs:duration. @char* /*duration*/ groupMaxIdleDuration 0; ///< Optional attribute. }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":ResponseType is a complexType with complexContent extension of "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":HeaderBaseType. struct wsrm__ResponseType { /// INHERITED FROM wsrm__HeaderBaseType: /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). // END OF INHERITED /// CHOICE OF ELEMENTS FOR choice maxOccurs="unbounded" int __size_ResponseType ; struct __wsrm__union_ResponseType { int __union_ResponseType ; ///< Union _wsrm__union_ResponseType selector: set to SOAP_UNION__wsrm__union_ResponseType_ /// Union for choice in type wsrm__ResponseType union _wsrm__union_ResponseType { /// Element NonSequenceReply of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":NonSequenceReplyType. struct wsrm__NonSequenceReplyType* NonSequenceReply 1; ///< Required element. /// Element SequenceReplies of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":SequenceRepliesType. struct wsrm__SequenceRepliesType* SequenceReplies 1; ///< Required element. } union_ResponseType ; } *__union_ResponseType ; // END OF CHOICE }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":NonSequenceReplyType is a complexType with complexContent extension of "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":ExtensibleType. struct wsrm__NonSequenceReplyType { /// INHERITED FROM wsrm__ExtensibleType: /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). // END OF INHERITED /// Attribute groupId of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":MIDType. @wsrm__MIDType groupId 1; ///< Required attribute. /// Attribute fault of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":FaultCodeEnum. @enum wsrm__FaultCodeEnum* fault 0; ///< Optional attribute. }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":SequenceRepliesType is a complexType with complexContent extension of "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":ExtensibleType. struct wsrm__SequenceRepliesType { /// INHERITED FROM wsrm__ExtensibleType: /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). // END OF INHERITED /// Size of array of struct wsrm__ReplyRangeType* is 1..unbounded int __sizeReplyRange ; /// Array of length 1..unbounded struct wsrm__ReplyRangeType* ReplyRange 1; /// Attribute groupId of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":MIDType. @wsrm__MIDType groupId 1; ///< Required attribute. }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":ReplyRangeType is a complexType with complexContent extension of "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":ExtensibleType. struct wsrm__ReplyRangeType { /// INHERITED FROM wsrm__ExtensibleType: /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). // END OF INHERITED /// Attribute from of type xs:unsignedLong. @ULONG64 from 1; ///< Required attribute. /// Attribute to of type xs:unsignedLong. @ULONG64 to 1; ///< Required attribute. /// Attribute fault of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":FaultCodeEnum. @enum wsrm__FaultCodeEnum* fault 0; ///< Optional attribute. }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":RefToMessageIdsType is a complexType with complexContent extension of "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":EmptyType. struct wsrm__RefToMessageIdsType { /// INHERITED FROM wsrm__EmptyType: // END OF INHERITED /// Size of array of struct wsrm__SequenceNumRangeType* is 0..unbounded int __sizeSequenceNumRange ; /// Array of length 0..unbounded struct wsrm__SequenceNumRangeType* SequenceNumRange 0; /// Attribute groupId of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":MIDType. @wsrm__MIDType groupId 1; ///< Required attribute. }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":SequenceNumRangeType is a complexType with complexContent extension of "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":EmptyType. struct wsrm__SequenceNumRangeType { /// INHERITED FROM wsrm__EmptyType: // END OF INHERITED /// Attribute from of type xs:unsignedLong. @ULONG64 from 1; ///< Required attribute. /// Attribute to of type xs:unsignedLong. @ULONG64 to 1; ///< Required attribute. }; /// "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":PollRequestType is a complexType with complexContent extension of "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":HeaderBaseType. struct wsrm__PollRequestType { /// INHERITED FROM wsrm__HeaderBaseType: /// TODO: /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// /// TODO: Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). // END OF INHERITED /// Size of array of struct wsrm__RefToMessageIdsType* is 1..unbounded int __sizeRefToMessageIds ; /// Array of length 1..unbounded struct wsrm__RefToMessageIdsType* RefToMessageIds 1; /// Element ReplyTo of type "http://docs.oasis-open.org/wsrm/2004/06/reference-1.1.xsd":ServiceRefType. ref__ServiceRefType* ReplyTo 0; ///< Optional element. }; /// Element "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":Request of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":RequestType. typedef struct wsrm__RequestType _wsrm__Request; /// Element "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":Response of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":ResponseType. typedef struct wsrm__ResponseType _wsrm__Response; /// Element "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":PollRequest of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":PollRequestType. typedef struct wsrm__PollRequestType _wsrm__PollRequest; /// Element "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":BareURI of type "http://docs.oasis-open.org/wsrm/2004/06/ws-reliability-1.1.xsd":BareURIType. typedef wsrm__BareURIType _wsrm__BareURI; /* End of wsrm1.h */ gsoap-2.8.91/gsoap/import/WS-example.c0000644000175000017500000000466213525245161017051 0ustar ellertellert/* WS-example.c Example to demonstrate WS-Header.h -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2004-2008, Robert van Engelen, Genivia Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- 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 "soapH.h" #include "calc.nsmap" int main() { struct soap soap; struct SOAP_ENV__Header header; struct wsa__EndpointReferenceType replyTo; double n; soap_init(&soap); soap_default_SOAP_ENV__Header(&soap, &header); soap_default_wsa__EndpointReferenceType(&soap, &replyTo); replyTo.Address = "http://websrv.cs.fsu.edu/~engelen/calcclient.cgi"; header.wsa__MessageID = "uuid:aaaabbbb-cccc-dddd-eeee-ffffffffffff"; header.wsa__ReplyTo = &replyTo; header.wsa__To = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; header.wsa__Action = "http://websrv.cs.fsu.edu/~engelen/result"; soap.header = &header; printf("Testing: the WS-Addressing request send to the calc server is not understood:\n"); if (soap_call_ns__add(&soap, NULL, NULL, 1, 2, &n)) soap_print_fault(&soap, stderr); else printf("1 + 2 = %g\n", n); soap_end(&soap); soap_done(&soap); return 0; } gsoap-2.8.91/gsoap/import/wst.h0000644000175000017500000034731113525245161015712 0ustar ellertellert/* wst.h WS-Trust 2005/12 with SAML 1.0/2.0, also accepts 2005/02 Generated with: wsdl2h -cguxy -o wst.h -t WS/WS-typemap.dat WS/WS-Trust.xsd - Removed //gsoapopt - Changed http://docs.oasis-open.org/ws-sx/ws-trust/200512 to remove trailing / - Changed //gsoap wst schema namespace directive to import directive - Added //gsoap wst schema namespace2 directive - Added #import "wsp_appliesto.h" - Added #import "wstx.h" at the end of these definitions */ /******************************************************************************\ * * * Definitions * * http://docs.oasis-open.org/ws-sx/ws-trust/200512/ * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ #import "wsse.h" // wsse = #import "wsu.h" // wsu = #import "wsa5.h" // wsa5 = #import "wsp_appliesto.h" /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ #define SOAP_NAMESPACE_OF_wst "http://docs.oasis-open.org/ws-sx/ws-trust/200512" //gsoap wst schema import: http://docs.oasis-open.org/ws-sx/ws-trust/200512 //gsoap wst schema namespace2: http://schemas.xmlsoap.org/ws/2005/02/trust //gsoap wst schema elementForm: qualified //gsoap wst schema attributeForm: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ // Imported XSD type ""http://www.w3.org/2005/08/addressing":EndpointReferenceType" defined by wsa5__EndpointReferenceType. /// Imported element ""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityTokenReference" from typemap WS/WS-typemap.dat. /// @brief Typedef synonym for struct wst__RequestSecurityTokenType. typedef struct wst__RequestSecurityTokenType wst__RequestSecurityTokenType; /// @brief Typedef synonym for struct wst__RequestSecurityTokenResponseType. typedef struct wst__RequestSecurityTokenResponseType wst__RequestSecurityTokenResponseType; /// Imported complexType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedSecurityTokenType from typemap "WS/WS-typemap.dat". #import "saml1.h" #import "saml2.h" typedef struct wst__RequestedSecurityTokenType { saml1__AssertionType *saml1__Assertion; saml2__AssertionType *saml2__Assertion; _wsse__SecurityTokenReference *wsse__SecurityTokenReference; struct wsc__SecurityContextTokenType *wsc__SecurityContextToken; } wst__RequestedSecurityTokenType; /// @brief Typedef synonym for struct wst__BinarySecretType. typedef struct wst__BinarySecretType wst__BinarySecretType; /// @brief Typedef synonym for struct wst__ClaimsType. typedef struct wst__ClaimsType wst__ClaimsType; /// Imported complexType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":EntropyType from typemap "WS/WS-typemap.dat". typedef struct wst__EntropyType { struct wst__BinarySecretType *BinarySecret; } wst__EntropyType; /// @brief Typedef synonym for struct wst__LifetimeType. typedef struct wst__LifetimeType wst__LifetimeType; /// @brief Typedef synonym for struct wst__RequestSecurityTokenCollectionType. typedef struct wst__RequestSecurityTokenCollectionType wst__RequestSecurityTokenCollectionType; /// @brief Typedef synonym for struct wst__RequestSecurityTokenResponseCollectionType. typedef struct wst__RequestSecurityTokenResponseCollectionType wst__RequestSecurityTokenResponseCollectionType; /// @brief Typedef synonym for struct wst__RequestedReferenceType. typedef struct wst__RequestedReferenceType wst__RequestedReferenceType; /// @brief Typedef synonym for struct wst__RequestedProofTokenType. typedef struct wst__RequestedProofTokenType wst__RequestedProofTokenType; /// @brief Typedef synonym for struct wst__RenewTargetType. typedef struct wst__RenewTargetType wst__RenewTargetType; /// @brief Typedef synonym for struct wst__AllowPostdatingType. typedef struct wst__AllowPostdatingType wst__AllowPostdatingType; /// @brief Typedef synonym for struct wst__RenewingType. typedef struct wst__RenewingType wst__RenewingType; /// @brief Typedef synonym for struct wst__CancelTargetType. typedef struct wst__CancelTargetType wst__CancelTargetType; /// @brief Typedef synonym for struct wst__RequestedTokenCancelledType. typedef struct wst__RequestedTokenCancelledType wst__RequestedTokenCancelledType; /// @brief Typedef synonym for struct wst__ValidateTargetType. typedef struct wst__ValidateTargetType wst__ValidateTargetType; /// @brief Typedef synonym for struct wst__StatusType. typedef struct wst__StatusType wst__StatusType; /// @brief Typedef synonym for struct wst__SignChallengeType. typedef struct wst__SignChallengeType wst__SignChallengeType; /// @brief Typedef synonym for struct wst__BinaryExchangeType. typedef struct wst__BinaryExchangeType wst__BinaryExchangeType; /// @brief Typedef synonym for struct wst__RequestKETType. typedef struct wst__RequestKETType wst__RequestKETType; /// @brief Typedef synonym for struct wst__KeyExchangeTokenType. typedef struct wst__KeyExchangeTokenType wst__KeyExchangeTokenType; /// Imported complexType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":AuthenticatorType from typemap "WS/WS-typemap.dat". typedef struct wst__AuthenticatorType { char *CombinedHash; } wst__AuthenticatorType; /// @brief Typedef synonym for struct wst__OnBehalfOfType. typedef struct wst__OnBehalfOfType wst__OnBehalfOfType; /// @brief Typedef synonym for struct wst__EncryptionType. typedef struct wst__EncryptionType wst__EncryptionType; /// @brief Typedef synonym for struct wst__ProofEncryptionType. typedef struct wst__ProofEncryptionType wst__ProofEncryptionType; /// @brief Typedef synonym for struct wst__UseKeyType. typedef struct wst__UseKeyType wst__UseKeyType; /// @brief Typedef synonym for struct wst__DelegateToType. typedef struct wst__DelegateToType wst__DelegateToType; /// @brief Typedef synonym for struct wst__ParticipantsType. typedef struct wst__ParticipantsType wst__ParticipantsType; /// @brief Typedef synonym for struct wst__ParticipantType. typedef struct wst__ParticipantType wst__ParticipantType; /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://docs.oasis-open.org/ws-sx/ws-trust/200512/ * * * \******************************************************************************/ /// Imported simpleType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestTypeOpenEnum from typemap "WS/WS-typemap.dat". // simpleType definition intentionally left blank. /// Imported simpleType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":BinarySecretTypeOpenEnum from typemap "WS/WS-typemap.dat". // simpleType definition intentionally left blank. /// Imported simpleType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ComputedKeyOpenEnum from typemap "WS/WS-typemap.dat". // simpleType definition intentionally left blank. /// Imported simpleType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":StatusCodeOpenEnum from typemap "WS/WS-typemap.dat". // simpleType definition intentionally left blank. /// Imported simpleType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":KeyTypeOpenEnum from typemap "WS/WS-typemap.dat". // simpleType definition intentionally left blank. /// Imported simpleType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestTypeEnum from typemap "WS/WS-typemap.dat". // simpleType definition intentionally left blank. /// Imported simpleType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":BinarySecretTypeEnum from typemap "WS/WS-typemap.dat". // simpleType definition intentionally left blank. /// Imported simpleType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ComputedKeyEnum from typemap "WS/WS-typemap.dat". // simpleType definition intentionally left blank. /// Imported simpleType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":StatusCodeEnum from typemap "WS/WS-typemap.dat". // simpleType definition intentionally left blank. /// Imported simpleType "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":KeyTypeEnum from typemap "WS/WS-typemap.dat". // simpleType definition intentionally left blank. /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://docs.oasis-open.org/ws-sx/ws-trust/200512/ * * * \******************************************************************************/ /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenType is a complexType. /// ///
/// Actual content model is non-deterministic, hence wildcard. The following shows intended content model: /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// ///
/// struct wst__RequestSecurityTokenType operations: /// - wst__RequestSecurityTokenType* soap_new_wst__RequestSecurityTokenType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__RequestSecurityTokenType(struct soap*, wst__RequestSecurityTokenType*) default initialize members /// - int soap_read_wst__RequestSecurityTokenType(struct soap*, wst__RequestSecurityTokenType*) deserialize from a source /// - int soap_write_wst__RequestSecurityTokenType(struct soap*, wst__RequestSecurityTokenType*) serialize to a sink /// - wst__RequestSecurityTokenType* soap_dup_wst__RequestSecurityTokenType(struct soap*, wst__RequestSecurityTokenType* dst, wst__RequestSecurityTokenType *src) returns deep copy of wst__RequestSecurityTokenType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__RequestSecurityTokenType(wst__RequestSecurityTokenType*) deep deletes wst__RequestSecurityTokenType data members, use only on dst after soap_dup_wst__RequestSecurityTokenType(NULL, wst__RequestSecurityTokenType *dst, wst__RequestSecurityTokenType *src) (use soapcpp2 -Ed) struct wst__RequestSecurityTokenType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// Attribute "Context" of XSD type xs:anyURI. @char* Context 0; ///< Optional attribute. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). /// Member declared in WS/WS-typemap.dat _wsp__AppliesTo_* wsp__AppliesTo; /// Member declared in WS/WS-typemap.dat char* KeyType; /// Member declared in WS/WS-typemap.dat char* RequestType; /// Member declared in WS/WS-typemap.dat char* TokenType; /// Member declared in WS/WS-typemap.dat wst__EntropyType* Entropy; /// Member declared in WS/WS-typemap.dat char* ComputedKeyAlgorithm; /// Member declared in WS/WS-typemap.dat unsigned int* KeySize; /// Member declared in WS/WS-typemap.dat struct wst__BinaryExchangeType* BinaryExchange; /// Member declared in WS/WS-typemap.dat struct wst__AuthenticatorType* Authenticator; }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenResponseType is a complexType. /// ///
/// Actual content model is non-deterministic, hence wildcard. The following shows intended content model: /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// ///
/// struct wst__RequestSecurityTokenResponseType operations: /// - wst__RequestSecurityTokenResponseType* soap_new_wst__RequestSecurityTokenResponseType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__RequestSecurityTokenResponseType(struct soap*, wst__RequestSecurityTokenResponseType*) default initialize members /// - int soap_read_wst__RequestSecurityTokenResponseType(struct soap*, wst__RequestSecurityTokenResponseType*) deserialize from a source /// - int soap_write_wst__RequestSecurityTokenResponseType(struct soap*, wst__RequestSecurityTokenResponseType*) serialize to a sink /// - wst__RequestSecurityTokenResponseType* soap_dup_wst__RequestSecurityTokenResponseType(struct soap*, wst__RequestSecurityTokenResponseType* dst, wst__RequestSecurityTokenResponseType *src) returns deep copy of wst__RequestSecurityTokenResponseType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__RequestSecurityTokenResponseType(wst__RequestSecurityTokenResponseType*) deep deletes wst__RequestSecurityTokenResponseType data members, use only on dst after soap_dup_wst__RequestSecurityTokenResponseType(NULL, wst__RequestSecurityTokenResponseType *dst, wst__RequestSecurityTokenResponseType *src) (use soapcpp2 -Ed) struct wst__RequestSecurityTokenResponseType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// Attribute "Context" of XSD type xs:anyURI. @char* Context 0; ///< Optional attribute. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). /// Member declared in WS/WS-typemap.dat struct wst__RequestedSecurityTokenType* RequestedSecurityToken; /// Member declared in WS/WS-typemap.dat struct wst__RequestedReferenceType* RequestedAttachedReference; /// Member declared in WS/WS-typemap.dat struct wst__RequestedReferenceType* RequestedUnattachedReference; /// Member declared in WS/WS-typemap.dat struct wst__RequestedProofTokenType* RequestedProofToken; /// Member declared in WS/WS-typemap.dat char* KeyType; /// Member declared in WS/WS-typemap.dat char* RequestType; /// Member declared in WS/WS-typemap.dat char* TokenType; /// Member declared in WS/WS-typemap.dat wst__EntropyType* Entropy; /// Member declared in WS/WS-typemap.dat struct wst__LifetimeType* Lifetime; /// Member declared in WS/WS-typemap.dat unsigned int* KeySize; /// Member declared in WS/WS-typemap.dat struct wst__BinaryExchangeType* BinaryExchange; /// Member declared in WS/WS-typemap.dat struct wst__AuthenticatorType* Authenticator; }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ClaimsType is a complexType. /// /// struct wst__ClaimsType operations: /// - wst__ClaimsType* soap_new_wst__ClaimsType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__ClaimsType(struct soap*, wst__ClaimsType*) default initialize members /// - int soap_read_wst__ClaimsType(struct soap*, wst__ClaimsType*) deserialize from a source /// - int soap_write_wst__ClaimsType(struct soap*, wst__ClaimsType*) serialize to a sink /// - wst__ClaimsType* soap_dup_wst__ClaimsType(struct soap*, wst__ClaimsType* dst, wst__ClaimsType *src) returns deep copy of wst__ClaimsType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__ClaimsType(wst__ClaimsType*) deep deletes wst__ClaimsType data members, use only on dst after soap_dup_wst__ClaimsType(NULL, wst__ClaimsType *dst, wst__ClaimsType *src) (use soapcpp2 -Ed) struct wst__ClaimsType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// Attribute "Dialect" of XSD type xs:anyURI. @char* Dialect 0; ///< Optional attribute. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":LifetimeType is a complexType. /// /// struct wst__LifetimeType operations: /// - wst__LifetimeType* soap_new_wst__LifetimeType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__LifetimeType(struct soap*, wst__LifetimeType*) default initialize members /// - int soap_read_wst__LifetimeType(struct soap*, wst__LifetimeType*) deserialize from a source /// - int soap_write_wst__LifetimeType(struct soap*, wst__LifetimeType*) serialize to a sink /// - wst__LifetimeType* soap_dup_wst__LifetimeType(struct soap*, wst__LifetimeType* dst, wst__LifetimeType *src) returns deep copy of wst__LifetimeType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__LifetimeType(wst__LifetimeType*) deep deletes wst__LifetimeType data members, use only on dst after soap_dup_wst__LifetimeType(NULL, wst__LifetimeType *dst, wst__LifetimeType *src) (use soapcpp2 -Ed) struct wst__LifetimeType { /// Imported element reference "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd":Created. char* wsu__Created 0; ///< Optional element. /// Imported element reference "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd":Expires. char* wsu__Expires 0; ///< Optional element. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenCollectionType is a complexType. /// ///
/// The RequestSecurityTokenCollection (RSTC) element is used to provide multiple RST requests. One or more RSTR elements in an RSTRC element are returned in the response to the RequestSecurityTokenCollection. ///
/// struct wst__RequestSecurityTokenCollectionType operations: /// - wst__RequestSecurityTokenCollectionType* soap_new_wst__RequestSecurityTokenCollectionType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__RequestSecurityTokenCollectionType(struct soap*, wst__RequestSecurityTokenCollectionType*) default initialize members /// - int soap_read_wst__RequestSecurityTokenCollectionType(struct soap*, wst__RequestSecurityTokenCollectionType*) deserialize from a source /// - int soap_write_wst__RequestSecurityTokenCollectionType(struct soap*, wst__RequestSecurityTokenCollectionType*) serialize to a sink /// - wst__RequestSecurityTokenCollectionType* soap_dup_wst__RequestSecurityTokenCollectionType(struct soap*, wst__RequestSecurityTokenCollectionType* dst, wst__RequestSecurityTokenCollectionType *src) returns deep copy of wst__RequestSecurityTokenCollectionType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__RequestSecurityTokenCollectionType(wst__RequestSecurityTokenCollectionType*) deep deletes wst__RequestSecurityTokenCollectionType data members, use only on dst after soap_dup_wst__RequestSecurityTokenCollectionType(NULL, wst__RequestSecurityTokenCollectionType *dst, wst__RequestSecurityTokenCollectionType *src) (use soapcpp2 -Ed) struct wst__RequestSecurityTokenCollectionType { /// Size of array of struct wst__RequestSecurityTokenType* is 2..unbounded. $int __sizeRequestSecurityToken 2; /// Array struct wst__RequestSecurityTokenType* of size 2..unbounded. struct wst__RequestSecurityTokenType* RequestSecurityToken 2; }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenResponseCollectionType is a complexType. /// ///
/// The element (RSTRC) MUST be used to return a security token or response to a security token request on the final response. ///
/// struct wst__RequestSecurityTokenResponseCollectionType operations: /// - wst__RequestSecurityTokenResponseCollectionType* soap_new_wst__RequestSecurityTokenResponseCollectionType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__RequestSecurityTokenResponseCollectionType(struct soap*, wst__RequestSecurityTokenResponseCollectionType*) default initialize members /// - int soap_read_wst__RequestSecurityTokenResponseCollectionType(struct soap*, wst__RequestSecurityTokenResponseCollectionType*) deserialize from a source /// - int soap_write_wst__RequestSecurityTokenResponseCollectionType(struct soap*, wst__RequestSecurityTokenResponseCollectionType*) serialize to a sink /// - wst__RequestSecurityTokenResponseCollectionType* soap_dup_wst__RequestSecurityTokenResponseCollectionType(struct soap*, wst__RequestSecurityTokenResponseCollectionType* dst, wst__RequestSecurityTokenResponseCollectionType *src) returns deep copy of wst__RequestSecurityTokenResponseCollectionType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__RequestSecurityTokenResponseCollectionType(wst__RequestSecurityTokenResponseCollectionType*) deep deletes wst__RequestSecurityTokenResponseCollectionType data members, use only on dst after soap_dup_wst__RequestSecurityTokenResponseCollectionType(NULL, wst__RequestSecurityTokenResponseCollectionType *dst, wst__RequestSecurityTokenResponseCollectionType *src) (use soapcpp2 -Ed) struct wst__RequestSecurityTokenResponseCollectionType { /// Size of the dynamic array of struct wst__RequestSecurityTokenResponseType* is 1..unbounded. $int __sizeRequestSecurityTokenResponse 1; /// Array struct wst__RequestSecurityTokenResponseType* of size 1..unbounded. struct wst__RequestSecurityTokenResponseType* RequestSecurityTokenResponse 1; /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedReferenceType is a complexType. /// /// struct wst__RequestedReferenceType operations: /// - wst__RequestedReferenceType* soap_new_wst__RequestedReferenceType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__RequestedReferenceType(struct soap*, wst__RequestedReferenceType*) default initialize members /// - int soap_read_wst__RequestedReferenceType(struct soap*, wst__RequestedReferenceType*) deserialize from a source /// - int soap_write_wst__RequestedReferenceType(struct soap*, wst__RequestedReferenceType*) serialize to a sink /// - wst__RequestedReferenceType* soap_dup_wst__RequestedReferenceType(struct soap*, wst__RequestedReferenceType* dst, wst__RequestedReferenceType *src) returns deep copy of wst__RequestedReferenceType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__RequestedReferenceType(wst__RequestedReferenceType*) deep deletes wst__RequestedReferenceType data members, use only on dst after soap_dup_wst__RequestedReferenceType(NULL, wst__RequestedReferenceType *dst, wst__RequestedReferenceType *src) (use soapcpp2 -Ed) struct wst__RequestedReferenceType { /// Imported element reference "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityTokenReference. _wsse__SecurityTokenReference wsse__SecurityTokenReference 1; ///< Required element. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedProofTokenType is a complexType. /// /// struct wst__RequestedProofTokenType operations: /// - wst__RequestedProofTokenType* soap_new_wst__RequestedProofTokenType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__RequestedProofTokenType(struct soap*, wst__RequestedProofTokenType*) default initialize members /// - int soap_read_wst__RequestedProofTokenType(struct soap*, wst__RequestedProofTokenType*) deserialize from a source /// - int soap_write_wst__RequestedProofTokenType(struct soap*, wst__RequestedProofTokenType*) serialize to a sink /// - wst__RequestedProofTokenType* soap_dup_wst__RequestedProofTokenType(struct soap*, wst__RequestedProofTokenType* dst, wst__RequestedProofTokenType *src) returns deep copy of wst__RequestedProofTokenType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__RequestedProofTokenType(wst__RequestedProofTokenType*) deep deletes wst__RequestedProofTokenType data members, use only on dst after soap_dup_wst__RequestedProofTokenType(NULL, wst__RequestedProofTokenType *dst, wst__RequestedProofTokenType *src) (use soapcpp2 -Ed) struct wst__RequestedProofTokenType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// Member declared in WS/WS-typemap.dat struct xenc__EncryptedKeyType* xenc__EncryptedKey; }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RenewTargetType is a complexType. /// /// struct wst__RenewTargetType operations: /// - wst__RenewTargetType* soap_new_wst__RenewTargetType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__RenewTargetType(struct soap*, wst__RenewTargetType*) default initialize members /// - int soap_read_wst__RenewTargetType(struct soap*, wst__RenewTargetType*) deserialize from a source /// - int soap_write_wst__RenewTargetType(struct soap*, wst__RenewTargetType*) serialize to a sink /// - wst__RenewTargetType* soap_dup_wst__RenewTargetType(struct soap*, wst__RenewTargetType* dst, wst__RenewTargetType *src) returns deep copy of wst__RenewTargetType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__RenewTargetType(wst__RenewTargetType*) deep deletes wst__RenewTargetType data members, use only on dst after soap_dup_wst__RenewTargetType(NULL, wst__RenewTargetType *dst, wst__RenewTargetType *src) (use soapcpp2 -Ed) struct wst__RenewTargetType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":AllowPostdatingType is a complexType. /// /// struct wst__AllowPostdatingType operations: /// - wst__AllowPostdatingType* soap_new_wst__AllowPostdatingType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__AllowPostdatingType(struct soap*, wst__AllowPostdatingType*) default initialize members /// - int soap_read_wst__AllowPostdatingType(struct soap*, wst__AllowPostdatingType*) deserialize from a source /// - int soap_write_wst__AllowPostdatingType(struct soap*, wst__AllowPostdatingType*) serialize to a sink /// - wst__AllowPostdatingType* soap_dup_wst__AllowPostdatingType(struct soap*, wst__AllowPostdatingType* dst, wst__AllowPostdatingType *src) returns deep copy of wst__AllowPostdatingType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__AllowPostdatingType(wst__AllowPostdatingType*) deep deletes wst__AllowPostdatingType data members, use only on dst after soap_dup_wst__AllowPostdatingType(NULL, wst__AllowPostdatingType *dst, wst__AllowPostdatingType *src) (use soapcpp2 -Ed) struct wst__AllowPostdatingType { }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RenewingType is a complexType. /// /// struct wst__RenewingType operations: /// - wst__RenewingType* soap_new_wst__RenewingType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__RenewingType(struct soap*, wst__RenewingType*) default initialize members /// - int soap_read_wst__RenewingType(struct soap*, wst__RenewingType*) deserialize from a source /// - int soap_write_wst__RenewingType(struct soap*, wst__RenewingType*) serialize to a sink /// - wst__RenewingType* soap_dup_wst__RenewingType(struct soap*, wst__RenewingType* dst, wst__RenewingType *src) returns deep copy of wst__RenewingType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__RenewingType(wst__RenewingType*) deep deletes wst__RenewingType data members, use only on dst after soap_dup_wst__RenewingType(NULL, wst__RenewingType *dst, wst__RenewingType *src) (use soapcpp2 -Ed) struct wst__RenewingType { /// Attribute "Allow" of XSD type xs:boolean. @char* Allow 0; ///< Optional attribute. /// Attribute "OK" of XSD type xs:boolean. @char* OK 0; ///< Optional attribute. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":CancelTargetType is a complexType. /// /// struct wst__CancelTargetType operations: /// - wst__CancelTargetType* soap_new_wst__CancelTargetType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__CancelTargetType(struct soap*, wst__CancelTargetType*) default initialize members /// - int soap_read_wst__CancelTargetType(struct soap*, wst__CancelTargetType*) deserialize from a source /// - int soap_write_wst__CancelTargetType(struct soap*, wst__CancelTargetType*) serialize to a sink /// - wst__CancelTargetType* soap_dup_wst__CancelTargetType(struct soap*, wst__CancelTargetType* dst, wst__CancelTargetType *src) returns deep copy of wst__CancelTargetType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__CancelTargetType(wst__CancelTargetType*) deep deletes wst__CancelTargetType data members, use only on dst after soap_dup_wst__CancelTargetType(NULL, wst__CancelTargetType *dst, wst__CancelTargetType *src) (use soapcpp2 -Ed) struct wst__CancelTargetType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedTokenCancelledType is a complexType. /// /// struct wst__RequestedTokenCancelledType operations: /// - wst__RequestedTokenCancelledType* soap_new_wst__RequestedTokenCancelledType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__RequestedTokenCancelledType(struct soap*, wst__RequestedTokenCancelledType*) default initialize members /// - int soap_read_wst__RequestedTokenCancelledType(struct soap*, wst__RequestedTokenCancelledType*) deserialize from a source /// - int soap_write_wst__RequestedTokenCancelledType(struct soap*, wst__RequestedTokenCancelledType*) serialize to a sink /// - wst__RequestedTokenCancelledType* soap_dup_wst__RequestedTokenCancelledType(struct soap*, wst__RequestedTokenCancelledType* dst, wst__RequestedTokenCancelledType *src) returns deep copy of wst__RequestedTokenCancelledType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__RequestedTokenCancelledType(wst__RequestedTokenCancelledType*) deep deletes wst__RequestedTokenCancelledType data members, use only on dst after soap_dup_wst__RequestedTokenCancelledType(NULL, wst__RequestedTokenCancelledType *dst, wst__RequestedTokenCancelledType *src) (use soapcpp2 -Ed) struct wst__RequestedTokenCancelledType { }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ValidateTargetType is a complexType. /// /// struct wst__ValidateTargetType operations: /// - wst__ValidateTargetType* soap_new_wst__ValidateTargetType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__ValidateTargetType(struct soap*, wst__ValidateTargetType*) default initialize members /// - int soap_read_wst__ValidateTargetType(struct soap*, wst__ValidateTargetType*) deserialize from a source /// - int soap_write_wst__ValidateTargetType(struct soap*, wst__ValidateTargetType*) serialize to a sink /// - wst__ValidateTargetType* soap_dup_wst__ValidateTargetType(struct soap*, wst__ValidateTargetType* dst, wst__ValidateTargetType *src) returns deep copy of wst__ValidateTargetType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__ValidateTargetType(wst__ValidateTargetType*) deep deletes wst__ValidateTargetType data members, use only on dst after soap_dup_wst__ValidateTargetType(NULL, wst__ValidateTargetType *dst, wst__ValidateTargetType *src) (use soapcpp2 -Ed) struct wst__ValidateTargetType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":StatusType is a complexType. /// /// struct wst__StatusType operations: /// - wst__StatusType* soap_new_wst__StatusType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__StatusType(struct soap*, wst__StatusType*) default initialize members /// - int soap_read_wst__StatusType(struct soap*, wst__StatusType*) deserialize from a source /// - int soap_write_wst__StatusType(struct soap*, wst__StatusType*) serialize to a sink /// - wst__StatusType* soap_dup_wst__StatusType(struct soap*, wst__StatusType* dst, wst__StatusType *src) returns deep copy of wst__StatusType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__StatusType(wst__StatusType*) deep deletes wst__StatusType data members, use only on dst after soap_dup_wst__StatusType(NULL, wst__StatusType *dst, wst__StatusType *src) (use soapcpp2 -Ed) struct wst__StatusType { /// Element "Code" of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":StatusCodeOpenEnum. char* Code 1; ///< Required element. /// Element "Reason" of XSD type xs:string. char* Reason 0; ///< Optional element. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":SignChallengeType is a complexType. /// /// struct wst__SignChallengeType operations: /// - wst__SignChallengeType* soap_new_wst__SignChallengeType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__SignChallengeType(struct soap*, wst__SignChallengeType*) default initialize members /// - int soap_read_wst__SignChallengeType(struct soap*, wst__SignChallengeType*) deserialize from a source /// - int soap_write_wst__SignChallengeType(struct soap*, wst__SignChallengeType*) serialize to a sink /// - wst__SignChallengeType* soap_dup_wst__SignChallengeType(struct soap*, wst__SignChallengeType* dst, wst__SignChallengeType *src) returns deep copy of wst__SignChallengeType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__SignChallengeType(wst__SignChallengeType*) deep deletes wst__SignChallengeType data members, use only on dst after soap_dup_wst__SignChallengeType(NULL, wst__SignChallengeType *dst, wst__SignChallengeType *src) (use soapcpp2 -Ed) struct wst__SignChallengeType { /// Element reference "http://docs.oasis-open.org/ws-sx/ws-trust/200512/:""http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Challenge. char* Challenge 1; ///< Required element. /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestKETType is a complexType. /// /// struct wst__RequestKETType operations: /// - wst__RequestKETType* soap_new_wst__RequestKETType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__RequestKETType(struct soap*, wst__RequestKETType*) default initialize members /// - int soap_read_wst__RequestKETType(struct soap*, wst__RequestKETType*) deserialize from a source /// - int soap_write_wst__RequestKETType(struct soap*, wst__RequestKETType*) serialize to a sink /// - wst__RequestKETType* soap_dup_wst__RequestKETType(struct soap*, wst__RequestKETType* dst, wst__RequestKETType *src) returns deep copy of wst__RequestKETType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__RequestKETType(wst__RequestKETType*) deep deletes wst__RequestKETType data members, use only on dst after soap_dup_wst__RequestKETType(NULL, wst__RequestKETType *dst, wst__RequestKETType *src) (use soapcpp2 -Ed) struct wst__RequestKETType { }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":KeyExchangeTokenType is a complexType. /// /// struct wst__KeyExchangeTokenType operations: /// - wst__KeyExchangeTokenType* soap_new_wst__KeyExchangeTokenType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__KeyExchangeTokenType(struct soap*, wst__KeyExchangeTokenType*) default initialize members /// - int soap_read_wst__KeyExchangeTokenType(struct soap*, wst__KeyExchangeTokenType*) deserialize from a source /// - int soap_write_wst__KeyExchangeTokenType(struct soap*, wst__KeyExchangeTokenType*) serialize to a sink /// - wst__KeyExchangeTokenType* soap_dup_wst__KeyExchangeTokenType(struct soap*, wst__KeyExchangeTokenType* dst, wst__KeyExchangeTokenType *src) returns deep copy of wst__KeyExchangeTokenType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__KeyExchangeTokenType(wst__KeyExchangeTokenType*) deep deletes wst__KeyExchangeTokenType data members, use only on dst after soap_dup_wst__KeyExchangeTokenType(NULL, wst__KeyExchangeTokenType *dst, wst__KeyExchangeTokenType *src) (use soapcpp2 -Ed) struct wst__KeyExchangeTokenType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":OnBehalfOfType is a complexType. /// /// struct wst__OnBehalfOfType operations: /// - wst__OnBehalfOfType* soap_new_wst__OnBehalfOfType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__OnBehalfOfType(struct soap*, wst__OnBehalfOfType*) default initialize members /// - int soap_read_wst__OnBehalfOfType(struct soap*, wst__OnBehalfOfType*) deserialize from a source /// - int soap_write_wst__OnBehalfOfType(struct soap*, wst__OnBehalfOfType*) serialize to a sink /// - wst__OnBehalfOfType* soap_dup_wst__OnBehalfOfType(struct soap*, wst__OnBehalfOfType* dst, wst__OnBehalfOfType *src) returns deep copy of wst__OnBehalfOfType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__OnBehalfOfType(wst__OnBehalfOfType*) deep deletes wst__OnBehalfOfType data members, use only on dst after soap_dup_wst__OnBehalfOfType(NULL, wst__OnBehalfOfType *dst, wst__OnBehalfOfType *src) (use soapcpp2 -Ed) struct wst__OnBehalfOfType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":EncryptionType is a complexType. /// /// struct wst__EncryptionType operations: /// - wst__EncryptionType* soap_new_wst__EncryptionType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__EncryptionType(struct soap*, wst__EncryptionType*) default initialize members /// - int soap_read_wst__EncryptionType(struct soap*, wst__EncryptionType*) deserialize from a source /// - int soap_write_wst__EncryptionType(struct soap*, wst__EncryptionType*) serialize to a sink /// - wst__EncryptionType* soap_dup_wst__EncryptionType(struct soap*, wst__EncryptionType* dst, wst__EncryptionType *src) returns deep copy of wst__EncryptionType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__EncryptionType(wst__EncryptionType*) deep deletes wst__EncryptionType data members, use only on dst after soap_dup_wst__EncryptionType(NULL, wst__EncryptionType *dst, wst__EncryptionType *src) (use soapcpp2 -Ed) struct wst__EncryptionType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ProofEncryptionType is a complexType. /// /// struct wst__ProofEncryptionType operations: /// - wst__ProofEncryptionType* soap_new_wst__ProofEncryptionType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__ProofEncryptionType(struct soap*, wst__ProofEncryptionType*) default initialize members /// - int soap_read_wst__ProofEncryptionType(struct soap*, wst__ProofEncryptionType*) deserialize from a source /// - int soap_write_wst__ProofEncryptionType(struct soap*, wst__ProofEncryptionType*) serialize to a sink /// - wst__ProofEncryptionType* soap_dup_wst__ProofEncryptionType(struct soap*, wst__ProofEncryptionType* dst, wst__ProofEncryptionType *src) returns deep copy of wst__ProofEncryptionType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__ProofEncryptionType(wst__ProofEncryptionType*) deep deletes wst__ProofEncryptionType data members, use only on dst after soap_dup_wst__ProofEncryptionType(NULL, wst__ProofEncryptionType *dst, wst__ProofEncryptionType *src) (use soapcpp2 -Ed) struct wst__ProofEncryptionType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":UseKeyType is a complexType. /// /// struct wst__UseKeyType operations: /// - wst__UseKeyType* soap_new_wst__UseKeyType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__UseKeyType(struct soap*, wst__UseKeyType*) default initialize members /// - int soap_read_wst__UseKeyType(struct soap*, wst__UseKeyType*) deserialize from a source /// - int soap_write_wst__UseKeyType(struct soap*, wst__UseKeyType*) serialize to a sink /// - wst__UseKeyType* soap_dup_wst__UseKeyType(struct soap*, wst__UseKeyType* dst, wst__UseKeyType *src) returns deep copy of wst__UseKeyType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__UseKeyType(wst__UseKeyType*) deep deletes wst__UseKeyType data members, use only on dst after soap_dup_wst__UseKeyType(NULL, wst__UseKeyType *dst, wst__UseKeyType *src) (use soapcpp2 -Ed) struct wst__UseKeyType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// Attribute "Sig" of XSD type xs:anyURI. @char* Sig 0; ///< Optional attribute. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":DelegateToType is a complexType. /// /// struct wst__DelegateToType operations: /// - wst__DelegateToType* soap_new_wst__DelegateToType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__DelegateToType(struct soap*, wst__DelegateToType*) default initialize members /// - int soap_read_wst__DelegateToType(struct soap*, wst__DelegateToType*) deserialize from a source /// - int soap_write_wst__DelegateToType(struct soap*, wst__DelegateToType*) serialize to a sink /// - wst__DelegateToType* soap_dup_wst__DelegateToType(struct soap*, wst__DelegateToType* dst, wst__DelegateToType *src) returns deep copy of wst__DelegateToType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__DelegateToType(wst__DelegateToType*) deep deletes wst__DelegateToType data members, use only on dst after soap_dup_wst__DelegateToType(NULL, wst__DelegateToType *dst, wst__DelegateToType *src) (use soapcpp2 -Ed) struct wst__DelegateToType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ParticipantsType is a complexType. /// /// struct wst__ParticipantsType operations: /// - wst__ParticipantsType* soap_new_wst__ParticipantsType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__ParticipantsType(struct soap*, wst__ParticipantsType*) default initialize members /// - int soap_read_wst__ParticipantsType(struct soap*, wst__ParticipantsType*) deserialize from a source /// - int soap_write_wst__ParticipantsType(struct soap*, wst__ParticipantsType*) serialize to a sink /// - wst__ParticipantsType* soap_dup_wst__ParticipantsType(struct soap*, wst__ParticipantsType* dst, wst__ParticipantsType *src) returns deep copy of wst__ParticipantsType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__ParticipantsType(wst__ParticipantsType*) deep deletes wst__ParticipantsType data members, use only on dst after soap_dup_wst__ParticipantsType(NULL, wst__ParticipantsType *dst, wst__ParticipantsType *src) (use soapcpp2 -Ed) struct wst__ParticipantsType { /// Element "Primary" of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ParticipantType. struct wst__ParticipantType* Primary 0; ///< Optional element. /// Size of array of struct wst__ParticipantType* is 0..unbounded. $int __sizeParticipant 0; /// Array struct wst__ParticipantType* of size 0..unbounded. struct wst__ParticipantType* Participant 0; /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ParticipantType is a complexType. /// /// struct wst__ParticipantType operations: /// - wst__ParticipantType* soap_new_wst__ParticipantType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__ParticipantType(struct soap*, wst__ParticipantType*) default initialize members /// - int soap_read_wst__ParticipantType(struct soap*, wst__ParticipantType*) deserialize from a source /// - int soap_write_wst__ParticipantType(struct soap*, wst__ParticipantType*) serialize to a sink /// - wst__ParticipantType* soap_dup_wst__ParticipantType(struct soap*, wst__ParticipantType* dst, wst__ParticipantType *src) returns deep copy of wst__ParticipantType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__ParticipantType(wst__ParticipantType*) deep deletes wst__ParticipantType data members, use only on dst after soap_dup_wst__ParticipantType(NULL, wst__ParticipantType *dst, wst__ParticipantType *src) (use soapcpp2 -Ed) struct wst__ParticipantType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":BinarySecretType is a complexType with simpleContent. /// /// struct wst__BinarySecretType operations: /// - wst__BinarySecretType* soap_new_wst__BinarySecretType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__BinarySecretType(struct soap*, wst__BinarySecretType*) default initialize members /// - int soap_read_wst__BinarySecretType(struct soap*, wst__BinarySecretType*) deserialize from a source /// - int soap_write_wst__BinarySecretType(struct soap*, wst__BinarySecretType*) serialize to a sink /// - wst__BinarySecretType* soap_dup_wst__BinarySecretType(struct soap*, wst__BinarySecretType* dst, wst__BinarySecretType *src) returns deep copy of wst__BinarySecretType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__BinarySecretType(wst__BinarySecretType*) deep deletes wst__BinarySecretType data members, use only on dst after soap_dup_wst__BinarySecretType(NULL, wst__BinarySecretType *dst, wst__BinarySecretType *src) (use soapcpp2 -Ed) struct wst__BinarySecretType { /// __item wraps "xs:base64Binary" simpleContent. char* __item ; /// Attribute "Type" of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":BinarySecretTypeOpenEnum. @char* Type 0; ///< Optional attribute. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":BinaryExchangeType is a complexType with simpleContent. /// /// struct wst__BinaryExchangeType operations: /// - wst__BinaryExchangeType* soap_new_wst__BinaryExchangeType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wst__BinaryExchangeType(struct soap*, wst__BinaryExchangeType*) default initialize members /// - int soap_read_wst__BinaryExchangeType(struct soap*, wst__BinaryExchangeType*) deserialize from a source /// - int soap_write_wst__BinaryExchangeType(struct soap*, wst__BinaryExchangeType*) serialize to a sink /// - wst__BinaryExchangeType* soap_dup_wst__BinaryExchangeType(struct soap*, wst__BinaryExchangeType* dst, wst__BinaryExchangeType *src) returns deep copy of wst__BinaryExchangeType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wst__BinaryExchangeType(wst__BinaryExchangeType*) deep deletes wst__BinaryExchangeType data members, use only on dst after soap_dup_wst__BinaryExchangeType(NULL, wst__BinaryExchangeType *dst, wst__BinaryExchangeType *src) (use soapcpp2 -Ed) struct wst__BinaryExchangeType { /// __item wraps "xs:string" simpleContent. char* __item ; /// Attribute "ValueType" of XSD type xs:anyURI. @char* ValueType 1; ///< Required attribute. /// Attribute "EncodingType" of XSD type xs:anyURI. @char* EncodingType 1; ///< Required attribute. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /******************************************************************************\ * * * Additional Top-Level Elements * * http://docs.oasis-open.org/ws-sx/ws-trust/200512/ * * * \******************************************************************************/ /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityToken of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenType. typedef struct wst__RequestSecurityTokenType _wst__RequestSecurityToken; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":TokenType of XSD type xs:anyURI. typedef char* _wst__TokenType; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestType of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestTypeOpenEnum. typedef char* _wst__RequestType; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenResponse of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenResponseType. typedef struct wst__RequestSecurityTokenResponseType _wst__RequestSecurityTokenResponse; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedSecurityToken of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedSecurityTokenType. typedef wst__RequestedSecurityTokenType _wst__RequestedSecurityToken; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":BinarySecret of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":BinarySecretType. typedef struct wst__BinarySecretType _wst__BinarySecret; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Claims of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ClaimsType. typedef struct wst__ClaimsType _wst__Claims; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Entropy of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":EntropyType. typedef wst__EntropyType _wst__Entropy; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Lifetime of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":LifetimeType. typedef struct wst__LifetimeType _wst__Lifetime; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenCollection of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenCollectionType. typedef struct wst__RequestSecurityTokenCollectionType _wst__RequestSecurityTokenCollection; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenResponseCollection of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenResponseCollectionType. typedef struct wst__RequestSecurityTokenResponseCollectionType _wst__RequestSecurityTokenResponseCollection; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ComputedKey of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ComputedKeyOpenEnum. typedef char* _wst__ComputedKey; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedAttachedReference of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedReferenceType. typedef struct wst__RequestedReferenceType _wst__RequestedAttachedReference; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedUnattachedReference of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedReferenceType. typedef struct wst__RequestedReferenceType _wst__RequestedUnattachedReference; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedProofToken of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedProofTokenType. typedef struct wst__RequestedProofTokenType _wst__RequestedProofToken; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":IssuedTokens of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestSecurityTokenResponseCollectionType. typedef struct wst__RequestSecurityTokenResponseCollectionType _wst__IssuedTokens; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RenewTarget of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RenewTargetType. typedef struct wst__RenewTargetType _wst__RenewTarget; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":AllowPostdating of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":AllowPostdatingType. typedef struct wst__AllowPostdatingType _wst__AllowPostdating; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Renewing of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RenewingType. typedef struct wst__RenewingType _wst__Renewing; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":CancelTarget of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":CancelTargetType. typedef struct wst__CancelTargetType _wst__CancelTarget; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedTokenCancelled of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestedTokenCancelledType. typedef struct wst__RequestedTokenCancelledType _wst__RequestedTokenCancelled; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ValidateTarget of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ValidateTargetType. typedef struct wst__ValidateTargetType _wst__ValidateTarget; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Status of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":StatusType. typedef struct wst__StatusType _wst__Status; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":SignChallenge of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":SignChallengeType. typedef struct wst__SignChallengeType _wst__SignChallenge; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":SignChallengeResponse of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":SignChallengeType. typedef struct wst__SignChallengeType _wst__SignChallengeResponse; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Challenge of XSD type xs:string. typedef char* _wst__Challenge; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":BinaryExchange of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":BinaryExchangeType. typedef struct wst__BinaryExchangeType _wst__BinaryExchange; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestKET of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":RequestKETType. typedef struct wst__RequestKETType _wst__RequestKET; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":KeyExchangeToken of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":KeyExchangeTokenType. typedef struct wst__KeyExchangeTokenType _wst__KeyExchangeToken; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Authenticator of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":AuthenticatorType. typedef wst__AuthenticatorType _wst__Authenticator; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":CombinedHash of XSD type xs:base64Binary. typedef char* _wst__CombinedHash; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":OnBehalfOf of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":OnBehalfOfType. typedef struct wst__OnBehalfOfType _wst__OnBehalfOf; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Issuer of XSD type "http://www.w3.org/2005/08/addressing":EndpointReferenceType. typedef wsa5__EndpointReferenceType _wst__Issuer; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":AuthenticationType of XSD type xs:anyURI. typedef char* _wst__AuthenticationType; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":KeyType of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":KeyTypeOpenEnum. typedef char* _wst__KeyType; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":KeySize of XSD type xs:unsignedInt. typedef unsigned int _wst__KeySize; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":SignatureAlgorithm of XSD type xs:anyURI. typedef char* _wst__SignatureAlgorithm; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":EncryptionAlgorithm of XSD type xs:anyURI. typedef char* _wst__EncryptionAlgorithm; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":CanonicalizationAlgorithm of XSD type xs:anyURI. typedef char* _wst__CanonicalizationAlgorithm; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ComputedKeyAlgorithm of XSD type xs:anyURI. typedef char* _wst__ComputedKeyAlgorithm; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Encryption of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":EncryptionType. typedef struct wst__EncryptionType _wst__Encryption; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ProofEncryption of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ProofEncryptionType. typedef struct wst__ProofEncryptionType _wst__ProofEncryption; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":UseKey of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":UseKeyType. typedef struct wst__UseKeyType _wst__UseKey; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":KeyWrapAlgorithm of XSD type xs:anyURI. typedef char* _wst__KeyWrapAlgorithm; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":SignWith of XSD type xs:anyURI. typedef char* _wst__SignWith; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":EncryptWith of XSD type xs:anyURI. typedef char* _wst__EncryptWith; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":DelegateTo of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":DelegateToType. typedef struct wst__DelegateToType _wst__DelegateTo; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Forwardable of XSD type xs:boolean. typedef char* _wst__Forwardable; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Delegatable of XSD type xs:boolean. typedef char* _wst__Delegatable; /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":Participants of XSD type "http://docs.oasis-open.org/ws-sx/ws-trust/200512/":ParticipantsType. typedef struct wst__ParticipantsType _wst__Participants; /******************************************************************************\ * * * Additional Top-Level Attributes * * http://docs.oasis-open.org/ws-sx/ws-trust/200512/ * * * \******************************************************************************/ /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. Data can be read and deserialized from: - an int file descriptor, using soap->recvfd = fd - a socket, using soap->socket = (int)... - a C++ stream (istream, stringstream), using soap->is = (istream*)... - a C string, using soap->is = (const char*)... - any input, using the soap->frecv() callback Data can be serialized and written to: - an int file descriptor, using soap->sendfd = (int)... - a socket, using soap->socket = (int)... - a C++ stream (ostream, stringstream), using soap->os = (ostream*)... - a C string, using soap->os = (const char**)... - any output, using the soap->fsend() callback The following options are available for (de)serialization control: - soap->encodingStyle = NULL; to remove SOAP 1.1/1.2 encodingStyle - soap_mode(soap, SOAP_XML_TREE); XML without id-ref (no cycles!) - soap_mode(soap, SOAP_XML_GRAPH); XML with id-ref (including cycles) - soap_set_namespaces(soap, struct Namespace *nsmap); to set xmlns bindings @section wst Top-level root elements of schema "http://docs.oasis-open.org/ws-sx/ws-trust/200512/" - @ref _wst__RequestSecurityToken @code // Reader (returns SOAP_OK on success): soap_read__wst__RequestSecurityToken(struct soap*, _wst__RequestSecurityToken*); // Writer (returns SOAP_OK on success): soap_write__wst__RequestSecurityToken(struct soap*, _wst__RequestSecurityToken*); // REST GET (returns SOAP_OK on success): soap_GET__wst__RequestSecurityToken(struct soap*, const char *URL, _wst__RequestSecurityToken*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__RequestSecurityToken(struct soap*, const char *URL, _wst__RequestSecurityToken*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__RequestSecurityToken(struct soap*, const char *URL, _wst__RequestSecurityToken*); soap_POST_recv__wst__RequestSecurityToken(struct soap*, _wst__RequestSecurityToken*); @endcode - @ref _wst__TokenType @code // Reader (returns SOAP_OK on success): soap_read__wst__TokenType(struct soap*, _wst__TokenType*); // Writer (returns SOAP_OK on success): soap_write__wst__TokenType(struct soap*, _wst__TokenType*); // REST GET (returns SOAP_OK on success): soap_GET__wst__TokenType(struct soap*, const char *URL, _wst__TokenType*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__TokenType(struct soap*, const char *URL, _wst__TokenType*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__TokenType(struct soap*, const char *URL, _wst__TokenType*); soap_POST_recv__wst__TokenType(struct soap*, _wst__TokenType*); @endcode - @ref _wst__RequestType @code // Reader (returns SOAP_OK on success): soap_read__wst__RequestType(struct soap*, _wst__RequestType*); // Writer (returns SOAP_OK on success): soap_write__wst__RequestType(struct soap*, _wst__RequestType*); // REST GET (returns SOAP_OK on success): soap_GET__wst__RequestType(struct soap*, const char *URL, _wst__RequestType*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__RequestType(struct soap*, const char *URL, _wst__RequestType*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__RequestType(struct soap*, const char *URL, _wst__RequestType*); soap_POST_recv__wst__RequestType(struct soap*, _wst__RequestType*); @endcode - @ref _wst__RequestSecurityTokenResponse @code // Reader (returns SOAP_OK on success): soap_read__wst__RequestSecurityTokenResponse(struct soap*, _wst__RequestSecurityTokenResponse*); // Writer (returns SOAP_OK on success): soap_write__wst__RequestSecurityTokenResponse(struct soap*, _wst__RequestSecurityTokenResponse*); // REST GET (returns SOAP_OK on success): soap_GET__wst__RequestSecurityTokenResponse(struct soap*, const char *URL, _wst__RequestSecurityTokenResponse*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__RequestSecurityTokenResponse(struct soap*, const char *URL, _wst__RequestSecurityTokenResponse*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__RequestSecurityTokenResponse(struct soap*, const char *URL, _wst__RequestSecurityTokenResponse*); soap_POST_recv__wst__RequestSecurityTokenResponse(struct soap*, _wst__RequestSecurityTokenResponse*); @endcode - @ref _wst__RequestedSecurityToken @code // Reader (returns SOAP_OK on success): soap_read__wst__RequestedSecurityToken(struct soap*, _wst__RequestedSecurityToken*); // Writer (returns SOAP_OK on success): soap_write__wst__RequestedSecurityToken(struct soap*, _wst__RequestedSecurityToken*); // REST GET (returns SOAP_OK on success): soap_GET__wst__RequestedSecurityToken(struct soap*, const char *URL, _wst__RequestedSecurityToken*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__RequestedSecurityToken(struct soap*, const char *URL, _wst__RequestedSecurityToken*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__RequestedSecurityToken(struct soap*, const char *URL, _wst__RequestedSecurityToken*); soap_POST_recv__wst__RequestedSecurityToken(struct soap*, _wst__RequestedSecurityToken*); @endcode - @ref _wst__BinarySecret @code // Reader (returns SOAP_OK on success): soap_read__wst__BinarySecret(struct soap*, _wst__BinarySecret*); // Writer (returns SOAP_OK on success): soap_write__wst__BinarySecret(struct soap*, _wst__BinarySecret*); // REST GET (returns SOAP_OK on success): soap_GET__wst__BinarySecret(struct soap*, const char *URL, _wst__BinarySecret*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__BinarySecret(struct soap*, const char *URL, _wst__BinarySecret*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__BinarySecret(struct soap*, const char *URL, _wst__BinarySecret*); soap_POST_recv__wst__BinarySecret(struct soap*, _wst__BinarySecret*); @endcode - @ref _wst__Claims @code // Reader (returns SOAP_OK on success): soap_read__wst__Claims(struct soap*, _wst__Claims*); // Writer (returns SOAP_OK on success): soap_write__wst__Claims(struct soap*, _wst__Claims*); // REST GET (returns SOAP_OK on success): soap_GET__wst__Claims(struct soap*, const char *URL, _wst__Claims*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__Claims(struct soap*, const char *URL, _wst__Claims*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__Claims(struct soap*, const char *URL, _wst__Claims*); soap_POST_recv__wst__Claims(struct soap*, _wst__Claims*); @endcode - @ref _wst__Entropy @code // Reader (returns SOAP_OK on success): soap_read__wst__Entropy(struct soap*, _wst__Entropy*); // Writer (returns SOAP_OK on success): soap_write__wst__Entropy(struct soap*, _wst__Entropy*); // REST GET (returns SOAP_OK on success): soap_GET__wst__Entropy(struct soap*, const char *URL, _wst__Entropy*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__Entropy(struct soap*, const char *URL, _wst__Entropy*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__Entropy(struct soap*, const char *URL, _wst__Entropy*); soap_POST_recv__wst__Entropy(struct soap*, _wst__Entropy*); @endcode - @ref _wst__Lifetime @code // Reader (returns SOAP_OK on success): soap_read__wst__Lifetime(struct soap*, _wst__Lifetime*); // Writer (returns SOAP_OK on success): soap_write__wst__Lifetime(struct soap*, _wst__Lifetime*); // REST GET (returns SOAP_OK on success): soap_GET__wst__Lifetime(struct soap*, const char *URL, _wst__Lifetime*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__Lifetime(struct soap*, const char *URL, _wst__Lifetime*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__Lifetime(struct soap*, const char *URL, _wst__Lifetime*); soap_POST_recv__wst__Lifetime(struct soap*, _wst__Lifetime*); @endcode - @ref _wst__RequestSecurityTokenCollection @code // Reader (returns SOAP_OK on success): soap_read__wst__RequestSecurityTokenCollection(struct soap*, _wst__RequestSecurityTokenCollection*); // Writer (returns SOAP_OK on success): soap_write__wst__RequestSecurityTokenCollection(struct soap*, _wst__RequestSecurityTokenCollection*); // REST GET (returns SOAP_OK on success): soap_GET__wst__RequestSecurityTokenCollection(struct soap*, const char *URL, _wst__RequestSecurityTokenCollection*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__RequestSecurityTokenCollection(struct soap*, const char *URL, _wst__RequestSecurityTokenCollection*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__RequestSecurityTokenCollection(struct soap*, const char *URL, _wst__RequestSecurityTokenCollection*); soap_POST_recv__wst__RequestSecurityTokenCollection(struct soap*, _wst__RequestSecurityTokenCollection*); @endcode - @ref _wst__RequestSecurityTokenResponseCollection @code // Reader (returns SOAP_OK on success): soap_read__wst__RequestSecurityTokenResponseCollection(struct soap*, _wst__RequestSecurityTokenResponseCollection*); // Writer (returns SOAP_OK on success): soap_write__wst__RequestSecurityTokenResponseCollection(struct soap*, _wst__RequestSecurityTokenResponseCollection*); // REST GET (returns SOAP_OK on success): soap_GET__wst__RequestSecurityTokenResponseCollection(struct soap*, const char *URL, _wst__RequestSecurityTokenResponseCollection*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__RequestSecurityTokenResponseCollection(struct soap*, const char *URL, _wst__RequestSecurityTokenResponseCollection*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__RequestSecurityTokenResponseCollection(struct soap*, const char *URL, _wst__RequestSecurityTokenResponseCollection*); soap_POST_recv__wst__RequestSecurityTokenResponseCollection(struct soap*, _wst__RequestSecurityTokenResponseCollection*); @endcode - @ref _wst__ComputedKey @code // Reader (returns SOAP_OK on success): soap_read__wst__ComputedKey(struct soap*, _wst__ComputedKey*); // Writer (returns SOAP_OK on success): soap_write__wst__ComputedKey(struct soap*, _wst__ComputedKey*); // REST GET (returns SOAP_OK on success): soap_GET__wst__ComputedKey(struct soap*, const char *URL, _wst__ComputedKey*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__ComputedKey(struct soap*, const char *URL, _wst__ComputedKey*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__ComputedKey(struct soap*, const char *URL, _wst__ComputedKey*); soap_POST_recv__wst__ComputedKey(struct soap*, _wst__ComputedKey*); @endcode - @ref _wst__RequestedAttachedReference @code // Reader (returns SOAP_OK on success): soap_read__wst__RequestedAttachedReference(struct soap*, _wst__RequestedAttachedReference*); // Writer (returns SOAP_OK on success): soap_write__wst__RequestedAttachedReference(struct soap*, _wst__RequestedAttachedReference*); // REST GET (returns SOAP_OK on success): soap_GET__wst__RequestedAttachedReference(struct soap*, const char *URL, _wst__RequestedAttachedReference*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__RequestedAttachedReference(struct soap*, const char *URL, _wst__RequestedAttachedReference*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__RequestedAttachedReference(struct soap*, const char *URL, _wst__RequestedAttachedReference*); soap_POST_recv__wst__RequestedAttachedReference(struct soap*, _wst__RequestedAttachedReference*); @endcode - @ref _wst__RequestedUnattachedReference @code // Reader (returns SOAP_OK on success): soap_read__wst__RequestedUnattachedReference(struct soap*, _wst__RequestedUnattachedReference*); // Writer (returns SOAP_OK on success): soap_write__wst__RequestedUnattachedReference(struct soap*, _wst__RequestedUnattachedReference*); // REST GET (returns SOAP_OK on success): soap_GET__wst__RequestedUnattachedReference(struct soap*, const char *URL, _wst__RequestedUnattachedReference*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__RequestedUnattachedReference(struct soap*, const char *URL, _wst__RequestedUnattachedReference*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__RequestedUnattachedReference(struct soap*, const char *URL, _wst__RequestedUnattachedReference*); soap_POST_recv__wst__RequestedUnattachedReference(struct soap*, _wst__RequestedUnattachedReference*); @endcode - @ref _wst__RequestedProofToken @code // Reader (returns SOAP_OK on success): soap_read__wst__RequestedProofToken(struct soap*, _wst__RequestedProofToken*); // Writer (returns SOAP_OK on success): soap_write__wst__RequestedProofToken(struct soap*, _wst__RequestedProofToken*); // REST GET (returns SOAP_OK on success): soap_GET__wst__RequestedProofToken(struct soap*, const char *URL, _wst__RequestedProofToken*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__RequestedProofToken(struct soap*, const char *URL, _wst__RequestedProofToken*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__RequestedProofToken(struct soap*, const char *URL, _wst__RequestedProofToken*); soap_POST_recv__wst__RequestedProofToken(struct soap*, _wst__RequestedProofToken*); @endcode - @ref _wst__IssuedTokens @code // Reader (returns SOAP_OK on success): soap_read__wst__IssuedTokens(struct soap*, _wst__IssuedTokens*); // Writer (returns SOAP_OK on success): soap_write__wst__IssuedTokens(struct soap*, _wst__IssuedTokens*); // REST GET (returns SOAP_OK on success): soap_GET__wst__IssuedTokens(struct soap*, const char *URL, _wst__IssuedTokens*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__IssuedTokens(struct soap*, const char *URL, _wst__IssuedTokens*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__IssuedTokens(struct soap*, const char *URL, _wst__IssuedTokens*); soap_POST_recv__wst__IssuedTokens(struct soap*, _wst__IssuedTokens*); @endcode - @ref _wst__RenewTarget @code // Reader (returns SOAP_OK on success): soap_read__wst__RenewTarget(struct soap*, _wst__RenewTarget*); // Writer (returns SOAP_OK on success): soap_write__wst__RenewTarget(struct soap*, _wst__RenewTarget*); // REST GET (returns SOAP_OK on success): soap_GET__wst__RenewTarget(struct soap*, const char *URL, _wst__RenewTarget*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__RenewTarget(struct soap*, const char *URL, _wst__RenewTarget*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__RenewTarget(struct soap*, const char *URL, _wst__RenewTarget*); soap_POST_recv__wst__RenewTarget(struct soap*, _wst__RenewTarget*); @endcode - @ref _wst__AllowPostdating @code // Reader (returns SOAP_OK on success): soap_read__wst__AllowPostdating(struct soap*, _wst__AllowPostdating*); // Writer (returns SOAP_OK on success): soap_write__wst__AllowPostdating(struct soap*, _wst__AllowPostdating*); // REST GET (returns SOAP_OK on success): soap_GET__wst__AllowPostdating(struct soap*, const char *URL, _wst__AllowPostdating*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__AllowPostdating(struct soap*, const char *URL, _wst__AllowPostdating*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__AllowPostdating(struct soap*, const char *URL, _wst__AllowPostdating*); soap_POST_recv__wst__AllowPostdating(struct soap*, _wst__AllowPostdating*); @endcode - @ref _wst__Renewing @code // Reader (returns SOAP_OK on success): soap_read__wst__Renewing(struct soap*, _wst__Renewing*); // Writer (returns SOAP_OK on success): soap_write__wst__Renewing(struct soap*, _wst__Renewing*); // REST GET (returns SOAP_OK on success): soap_GET__wst__Renewing(struct soap*, const char *URL, _wst__Renewing*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__Renewing(struct soap*, const char *URL, _wst__Renewing*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__Renewing(struct soap*, const char *URL, _wst__Renewing*); soap_POST_recv__wst__Renewing(struct soap*, _wst__Renewing*); @endcode - @ref _wst__CancelTarget @code // Reader (returns SOAP_OK on success): soap_read__wst__CancelTarget(struct soap*, _wst__CancelTarget*); // Writer (returns SOAP_OK on success): soap_write__wst__CancelTarget(struct soap*, _wst__CancelTarget*); // REST GET (returns SOAP_OK on success): soap_GET__wst__CancelTarget(struct soap*, const char *URL, _wst__CancelTarget*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__CancelTarget(struct soap*, const char *URL, _wst__CancelTarget*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__CancelTarget(struct soap*, const char *URL, _wst__CancelTarget*); soap_POST_recv__wst__CancelTarget(struct soap*, _wst__CancelTarget*); @endcode - @ref _wst__RequestedTokenCancelled @code // Reader (returns SOAP_OK on success): soap_read__wst__RequestedTokenCancelled(struct soap*, _wst__RequestedTokenCancelled*); // Writer (returns SOAP_OK on success): soap_write__wst__RequestedTokenCancelled(struct soap*, _wst__RequestedTokenCancelled*); // REST GET (returns SOAP_OK on success): soap_GET__wst__RequestedTokenCancelled(struct soap*, const char *URL, _wst__RequestedTokenCancelled*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__RequestedTokenCancelled(struct soap*, const char *URL, _wst__RequestedTokenCancelled*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__RequestedTokenCancelled(struct soap*, const char *URL, _wst__RequestedTokenCancelled*); soap_POST_recv__wst__RequestedTokenCancelled(struct soap*, _wst__RequestedTokenCancelled*); @endcode - @ref _wst__ValidateTarget @code // Reader (returns SOAP_OK on success): soap_read__wst__ValidateTarget(struct soap*, _wst__ValidateTarget*); // Writer (returns SOAP_OK on success): soap_write__wst__ValidateTarget(struct soap*, _wst__ValidateTarget*); // REST GET (returns SOAP_OK on success): soap_GET__wst__ValidateTarget(struct soap*, const char *URL, _wst__ValidateTarget*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__ValidateTarget(struct soap*, const char *URL, _wst__ValidateTarget*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__ValidateTarget(struct soap*, const char *URL, _wst__ValidateTarget*); soap_POST_recv__wst__ValidateTarget(struct soap*, _wst__ValidateTarget*); @endcode - @ref _wst__Status @code // Reader (returns SOAP_OK on success): soap_read__wst__Status(struct soap*, _wst__Status*); // Writer (returns SOAP_OK on success): soap_write__wst__Status(struct soap*, _wst__Status*); // REST GET (returns SOAP_OK on success): soap_GET__wst__Status(struct soap*, const char *URL, _wst__Status*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__Status(struct soap*, const char *URL, _wst__Status*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__Status(struct soap*, const char *URL, _wst__Status*); soap_POST_recv__wst__Status(struct soap*, _wst__Status*); @endcode - @ref _wst__SignChallenge @code // Reader (returns SOAP_OK on success): soap_read__wst__SignChallenge(struct soap*, _wst__SignChallenge*); // Writer (returns SOAP_OK on success): soap_write__wst__SignChallenge(struct soap*, _wst__SignChallenge*); // REST GET (returns SOAP_OK on success): soap_GET__wst__SignChallenge(struct soap*, const char *URL, _wst__SignChallenge*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__SignChallenge(struct soap*, const char *URL, _wst__SignChallenge*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__SignChallenge(struct soap*, const char *URL, _wst__SignChallenge*); soap_POST_recv__wst__SignChallenge(struct soap*, _wst__SignChallenge*); @endcode - @ref _wst__SignChallengeResponse @code // Reader (returns SOAP_OK on success): soap_read__wst__SignChallengeResponse(struct soap*, _wst__SignChallengeResponse*); // Writer (returns SOAP_OK on success): soap_write__wst__SignChallengeResponse(struct soap*, _wst__SignChallengeResponse*); // REST GET (returns SOAP_OK on success): soap_GET__wst__SignChallengeResponse(struct soap*, const char *URL, _wst__SignChallengeResponse*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__SignChallengeResponse(struct soap*, const char *URL, _wst__SignChallengeResponse*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__SignChallengeResponse(struct soap*, const char *URL, _wst__SignChallengeResponse*); soap_POST_recv__wst__SignChallengeResponse(struct soap*, _wst__SignChallengeResponse*); @endcode - @ref _wst__Challenge @code // Reader (returns SOAP_OK on success): soap_read__wst__Challenge(struct soap*, _wst__Challenge*); // Writer (returns SOAP_OK on success): soap_write__wst__Challenge(struct soap*, _wst__Challenge*); // REST GET (returns SOAP_OK on success): soap_GET__wst__Challenge(struct soap*, const char *URL, _wst__Challenge*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__Challenge(struct soap*, const char *URL, _wst__Challenge*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__Challenge(struct soap*, const char *URL, _wst__Challenge*); soap_POST_recv__wst__Challenge(struct soap*, _wst__Challenge*); @endcode - @ref _wst__BinaryExchange @code // Reader (returns SOAP_OK on success): soap_read__wst__BinaryExchange(struct soap*, _wst__BinaryExchange*); // Writer (returns SOAP_OK on success): soap_write__wst__BinaryExchange(struct soap*, _wst__BinaryExchange*); // REST GET (returns SOAP_OK on success): soap_GET__wst__BinaryExchange(struct soap*, const char *URL, _wst__BinaryExchange*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__BinaryExchange(struct soap*, const char *URL, _wst__BinaryExchange*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__BinaryExchange(struct soap*, const char *URL, _wst__BinaryExchange*); soap_POST_recv__wst__BinaryExchange(struct soap*, _wst__BinaryExchange*); @endcode - @ref _wst__RequestKET @code // Reader (returns SOAP_OK on success): soap_read__wst__RequestKET(struct soap*, _wst__RequestKET*); // Writer (returns SOAP_OK on success): soap_write__wst__RequestKET(struct soap*, _wst__RequestKET*); // REST GET (returns SOAP_OK on success): soap_GET__wst__RequestKET(struct soap*, const char *URL, _wst__RequestKET*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__RequestKET(struct soap*, const char *URL, _wst__RequestKET*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__RequestKET(struct soap*, const char *URL, _wst__RequestKET*); soap_POST_recv__wst__RequestKET(struct soap*, _wst__RequestKET*); @endcode - @ref _wst__KeyExchangeToken @code // Reader (returns SOAP_OK on success): soap_read__wst__KeyExchangeToken(struct soap*, _wst__KeyExchangeToken*); // Writer (returns SOAP_OK on success): soap_write__wst__KeyExchangeToken(struct soap*, _wst__KeyExchangeToken*); // REST GET (returns SOAP_OK on success): soap_GET__wst__KeyExchangeToken(struct soap*, const char *URL, _wst__KeyExchangeToken*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__KeyExchangeToken(struct soap*, const char *URL, _wst__KeyExchangeToken*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__KeyExchangeToken(struct soap*, const char *URL, _wst__KeyExchangeToken*); soap_POST_recv__wst__KeyExchangeToken(struct soap*, _wst__KeyExchangeToken*); @endcode - @ref _wst__Authenticator @code // Reader (returns SOAP_OK on success): soap_read__wst__Authenticator(struct soap*, _wst__Authenticator*); // Writer (returns SOAP_OK on success): soap_write__wst__Authenticator(struct soap*, _wst__Authenticator*); // REST GET (returns SOAP_OK on success): soap_GET__wst__Authenticator(struct soap*, const char *URL, _wst__Authenticator*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__Authenticator(struct soap*, const char *URL, _wst__Authenticator*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__Authenticator(struct soap*, const char *URL, _wst__Authenticator*); soap_POST_recv__wst__Authenticator(struct soap*, _wst__Authenticator*); @endcode - @ref _wst__CombinedHash @code // Reader (returns SOAP_OK on success): soap_read__wst__CombinedHash(struct soap*, _wst__CombinedHash*); // Writer (returns SOAP_OK on success): soap_write__wst__CombinedHash(struct soap*, _wst__CombinedHash*); // REST GET (returns SOAP_OK on success): soap_GET__wst__CombinedHash(struct soap*, const char *URL, _wst__CombinedHash*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__CombinedHash(struct soap*, const char *URL, _wst__CombinedHash*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__CombinedHash(struct soap*, const char *URL, _wst__CombinedHash*); soap_POST_recv__wst__CombinedHash(struct soap*, _wst__CombinedHash*); @endcode - @ref _wst__OnBehalfOf @code // Reader (returns SOAP_OK on success): soap_read__wst__OnBehalfOf(struct soap*, _wst__OnBehalfOf*); // Writer (returns SOAP_OK on success): soap_write__wst__OnBehalfOf(struct soap*, _wst__OnBehalfOf*); // REST GET (returns SOAP_OK on success): soap_GET__wst__OnBehalfOf(struct soap*, const char *URL, _wst__OnBehalfOf*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__OnBehalfOf(struct soap*, const char *URL, _wst__OnBehalfOf*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__OnBehalfOf(struct soap*, const char *URL, _wst__OnBehalfOf*); soap_POST_recv__wst__OnBehalfOf(struct soap*, _wst__OnBehalfOf*); @endcode - @ref _wst__Issuer @code // Reader (returns SOAP_OK on success): soap_read__wst__Issuer(struct soap*, _wst__Issuer*); // Writer (returns SOAP_OK on success): soap_write__wst__Issuer(struct soap*, _wst__Issuer*); // REST GET (returns SOAP_OK on success): soap_GET__wst__Issuer(struct soap*, const char *URL, _wst__Issuer*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__Issuer(struct soap*, const char *URL, _wst__Issuer*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__Issuer(struct soap*, const char *URL, _wst__Issuer*); soap_POST_recv__wst__Issuer(struct soap*, _wst__Issuer*); @endcode - @ref _wst__AuthenticationType @code // Reader (returns SOAP_OK on success): soap_read__wst__AuthenticationType(struct soap*, _wst__AuthenticationType*); // Writer (returns SOAP_OK on success): soap_write__wst__AuthenticationType(struct soap*, _wst__AuthenticationType*); // REST GET (returns SOAP_OK on success): soap_GET__wst__AuthenticationType(struct soap*, const char *URL, _wst__AuthenticationType*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__AuthenticationType(struct soap*, const char *URL, _wst__AuthenticationType*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__AuthenticationType(struct soap*, const char *URL, _wst__AuthenticationType*); soap_POST_recv__wst__AuthenticationType(struct soap*, _wst__AuthenticationType*); @endcode - @ref _wst__KeyType @code // Reader (returns SOAP_OK on success): soap_read__wst__KeyType(struct soap*, _wst__KeyType*); // Writer (returns SOAP_OK on success): soap_write__wst__KeyType(struct soap*, _wst__KeyType*); // REST GET (returns SOAP_OK on success): soap_GET__wst__KeyType(struct soap*, const char *URL, _wst__KeyType*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__KeyType(struct soap*, const char *URL, _wst__KeyType*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__KeyType(struct soap*, const char *URL, _wst__KeyType*); soap_POST_recv__wst__KeyType(struct soap*, _wst__KeyType*); @endcode - @ref _wst__KeySize @code // Reader (returns SOAP_OK on success): soap_read__wst__KeySize(struct soap*, _wst__KeySize*); // Writer (returns SOAP_OK on success): soap_write__wst__KeySize(struct soap*, _wst__KeySize*); // REST GET (returns SOAP_OK on success): soap_GET__wst__KeySize(struct soap*, const char *URL, _wst__KeySize*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__KeySize(struct soap*, const char *URL, _wst__KeySize*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__KeySize(struct soap*, const char *URL, _wst__KeySize*); soap_POST_recv__wst__KeySize(struct soap*, _wst__KeySize*); @endcode - @ref _wst__SignatureAlgorithm @code // Reader (returns SOAP_OK on success): soap_read__wst__SignatureAlgorithm(struct soap*, _wst__SignatureAlgorithm*); // Writer (returns SOAP_OK on success): soap_write__wst__SignatureAlgorithm(struct soap*, _wst__SignatureAlgorithm*); // REST GET (returns SOAP_OK on success): soap_GET__wst__SignatureAlgorithm(struct soap*, const char *URL, _wst__SignatureAlgorithm*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__SignatureAlgorithm(struct soap*, const char *URL, _wst__SignatureAlgorithm*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__SignatureAlgorithm(struct soap*, const char *URL, _wst__SignatureAlgorithm*); soap_POST_recv__wst__SignatureAlgorithm(struct soap*, _wst__SignatureAlgorithm*); @endcode - @ref _wst__EncryptionAlgorithm @code // Reader (returns SOAP_OK on success): soap_read__wst__EncryptionAlgorithm(struct soap*, _wst__EncryptionAlgorithm*); // Writer (returns SOAP_OK on success): soap_write__wst__EncryptionAlgorithm(struct soap*, _wst__EncryptionAlgorithm*); // REST GET (returns SOAP_OK on success): soap_GET__wst__EncryptionAlgorithm(struct soap*, const char *URL, _wst__EncryptionAlgorithm*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__EncryptionAlgorithm(struct soap*, const char *URL, _wst__EncryptionAlgorithm*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__EncryptionAlgorithm(struct soap*, const char *URL, _wst__EncryptionAlgorithm*); soap_POST_recv__wst__EncryptionAlgorithm(struct soap*, _wst__EncryptionAlgorithm*); @endcode - @ref _wst__CanonicalizationAlgorithm @code // Reader (returns SOAP_OK on success): soap_read__wst__CanonicalizationAlgorithm(struct soap*, _wst__CanonicalizationAlgorithm*); // Writer (returns SOAP_OK on success): soap_write__wst__CanonicalizationAlgorithm(struct soap*, _wst__CanonicalizationAlgorithm*); // REST GET (returns SOAP_OK on success): soap_GET__wst__CanonicalizationAlgorithm(struct soap*, const char *URL, _wst__CanonicalizationAlgorithm*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__CanonicalizationAlgorithm(struct soap*, const char *URL, _wst__CanonicalizationAlgorithm*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__CanonicalizationAlgorithm(struct soap*, const char *URL, _wst__CanonicalizationAlgorithm*); soap_POST_recv__wst__CanonicalizationAlgorithm(struct soap*, _wst__CanonicalizationAlgorithm*); @endcode - @ref _wst__ComputedKeyAlgorithm @code // Reader (returns SOAP_OK on success): soap_read__wst__ComputedKeyAlgorithm(struct soap*, _wst__ComputedKeyAlgorithm*); // Writer (returns SOAP_OK on success): soap_write__wst__ComputedKeyAlgorithm(struct soap*, _wst__ComputedKeyAlgorithm*); // REST GET (returns SOAP_OK on success): soap_GET__wst__ComputedKeyAlgorithm(struct soap*, const char *URL, _wst__ComputedKeyAlgorithm*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__ComputedKeyAlgorithm(struct soap*, const char *URL, _wst__ComputedKeyAlgorithm*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__ComputedKeyAlgorithm(struct soap*, const char *URL, _wst__ComputedKeyAlgorithm*); soap_POST_recv__wst__ComputedKeyAlgorithm(struct soap*, _wst__ComputedKeyAlgorithm*); @endcode - @ref _wst__Encryption @code // Reader (returns SOAP_OK on success): soap_read__wst__Encryption(struct soap*, _wst__Encryption*); // Writer (returns SOAP_OK on success): soap_write__wst__Encryption(struct soap*, _wst__Encryption*); // REST GET (returns SOAP_OK on success): soap_GET__wst__Encryption(struct soap*, const char *URL, _wst__Encryption*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__Encryption(struct soap*, const char *URL, _wst__Encryption*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__Encryption(struct soap*, const char *URL, _wst__Encryption*); soap_POST_recv__wst__Encryption(struct soap*, _wst__Encryption*); @endcode - @ref _wst__ProofEncryption @code // Reader (returns SOAP_OK on success): soap_read__wst__ProofEncryption(struct soap*, _wst__ProofEncryption*); // Writer (returns SOAP_OK on success): soap_write__wst__ProofEncryption(struct soap*, _wst__ProofEncryption*); // REST GET (returns SOAP_OK on success): soap_GET__wst__ProofEncryption(struct soap*, const char *URL, _wst__ProofEncryption*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__ProofEncryption(struct soap*, const char *URL, _wst__ProofEncryption*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__ProofEncryption(struct soap*, const char *URL, _wst__ProofEncryption*); soap_POST_recv__wst__ProofEncryption(struct soap*, _wst__ProofEncryption*); @endcode - @ref _wst__UseKey @code // Reader (returns SOAP_OK on success): soap_read__wst__UseKey(struct soap*, _wst__UseKey*); // Writer (returns SOAP_OK on success): soap_write__wst__UseKey(struct soap*, _wst__UseKey*); // REST GET (returns SOAP_OK on success): soap_GET__wst__UseKey(struct soap*, const char *URL, _wst__UseKey*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__UseKey(struct soap*, const char *URL, _wst__UseKey*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__UseKey(struct soap*, const char *URL, _wst__UseKey*); soap_POST_recv__wst__UseKey(struct soap*, _wst__UseKey*); @endcode - @ref _wst__KeyWrapAlgorithm @code // Reader (returns SOAP_OK on success): soap_read__wst__KeyWrapAlgorithm(struct soap*, _wst__KeyWrapAlgorithm*); // Writer (returns SOAP_OK on success): soap_write__wst__KeyWrapAlgorithm(struct soap*, _wst__KeyWrapAlgorithm*); // REST GET (returns SOAP_OK on success): soap_GET__wst__KeyWrapAlgorithm(struct soap*, const char *URL, _wst__KeyWrapAlgorithm*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__KeyWrapAlgorithm(struct soap*, const char *URL, _wst__KeyWrapAlgorithm*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__KeyWrapAlgorithm(struct soap*, const char *URL, _wst__KeyWrapAlgorithm*); soap_POST_recv__wst__KeyWrapAlgorithm(struct soap*, _wst__KeyWrapAlgorithm*); @endcode - @ref _wst__SignWith @code // Reader (returns SOAP_OK on success): soap_read__wst__SignWith(struct soap*, _wst__SignWith*); // Writer (returns SOAP_OK on success): soap_write__wst__SignWith(struct soap*, _wst__SignWith*); // REST GET (returns SOAP_OK on success): soap_GET__wst__SignWith(struct soap*, const char *URL, _wst__SignWith*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__SignWith(struct soap*, const char *URL, _wst__SignWith*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__SignWith(struct soap*, const char *URL, _wst__SignWith*); soap_POST_recv__wst__SignWith(struct soap*, _wst__SignWith*); @endcode - @ref _wst__EncryptWith @code // Reader (returns SOAP_OK on success): soap_read__wst__EncryptWith(struct soap*, _wst__EncryptWith*); // Writer (returns SOAP_OK on success): soap_write__wst__EncryptWith(struct soap*, _wst__EncryptWith*); // REST GET (returns SOAP_OK on success): soap_GET__wst__EncryptWith(struct soap*, const char *URL, _wst__EncryptWith*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__EncryptWith(struct soap*, const char *URL, _wst__EncryptWith*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__EncryptWith(struct soap*, const char *URL, _wst__EncryptWith*); soap_POST_recv__wst__EncryptWith(struct soap*, _wst__EncryptWith*); @endcode - @ref _wst__DelegateTo @code // Reader (returns SOAP_OK on success): soap_read__wst__DelegateTo(struct soap*, _wst__DelegateTo*); // Writer (returns SOAP_OK on success): soap_write__wst__DelegateTo(struct soap*, _wst__DelegateTo*); // REST GET (returns SOAP_OK on success): soap_GET__wst__DelegateTo(struct soap*, const char *URL, _wst__DelegateTo*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__DelegateTo(struct soap*, const char *URL, _wst__DelegateTo*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__DelegateTo(struct soap*, const char *URL, _wst__DelegateTo*); soap_POST_recv__wst__DelegateTo(struct soap*, _wst__DelegateTo*); @endcode - @ref _wst__Forwardable @code // Reader (returns SOAP_OK on success): soap_read__wst__Forwardable(struct soap*, _wst__Forwardable*); // Writer (returns SOAP_OK on success): soap_write__wst__Forwardable(struct soap*, _wst__Forwardable*); // REST GET (returns SOAP_OK on success): soap_GET__wst__Forwardable(struct soap*, const char *URL, _wst__Forwardable*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__Forwardable(struct soap*, const char *URL, _wst__Forwardable*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__Forwardable(struct soap*, const char *URL, _wst__Forwardable*); soap_POST_recv__wst__Forwardable(struct soap*, _wst__Forwardable*); @endcode - @ref _wst__Delegatable @code // Reader (returns SOAP_OK on success): soap_read__wst__Delegatable(struct soap*, _wst__Delegatable*); // Writer (returns SOAP_OK on success): soap_write__wst__Delegatable(struct soap*, _wst__Delegatable*); // REST GET (returns SOAP_OK on success): soap_GET__wst__Delegatable(struct soap*, const char *URL, _wst__Delegatable*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__Delegatable(struct soap*, const char *URL, _wst__Delegatable*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__Delegatable(struct soap*, const char *URL, _wst__Delegatable*); soap_POST_recv__wst__Delegatable(struct soap*, _wst__Delegatable*); @endcode - @ref _wst__Participants @code // Reader (returns SOAP_OK on success): soap_read__wst__Participants(struct soap*, _wst__Participants*); // Writer (returns SOAP_OK on success): soap_write__wst__Participants(struct soap*, _wst__Participants*); // REST GET (returns SOAP_OK on success): soap_GET__wst__Participants(struct soap*, const char *URL, _wst__Participants*); // REST PUT (returns SOAP_OK on success): soap_PUT__wst__Participants(struct soap*, const char *URL, _wst__Participants*); // REST POST (returns SOAP_OK on success): soap_POST_send__wst__Participants(struct soap*, const char *URL, _wst__Participants*); soap_POST_recv__wst__Participants(struct soap*, _wst__Participants*); @endcode */ #import "wstx.h" /* End of wst.h */ gsoap-2.8.91/gsoap/import/wsp_appliesto.h0000644000175000017500000000042513525245161017756 0ustar ellertellert//gsoap wsp schema import: http://schemas.xmlsoap.org/ws/2004/09/policy //gsoap wsp schema elementForm: qualified //gsoap wsp schema attributeForm: unqualified typedef struct _wsp__AppliesTo_ { wsa5__EndpointReferenceType *wsa5__EndpointReference; } _wsp__AppliesTo_; gsoap-2.8.91/gsoap/import/wsdd.h0000644000175000017500000014437013525245161016036 0ustar ellertellert/* wsdd.h WS-Discovery 1.1 2009 with WS-Addressing 2005/08 Generated with: wsdl2h -cgyex -o wsdd.h -t WS/WS-typemap.dat WS/discovery.xsd Modified by Robert van Engelen: - Removed //gsoapopt - Changed //gsoap wssd schema namespace directive to import directive - Added #import "wsdx.h" at the end of these definitions - Added #define SOAP_WSDD_2009 */ #define SOAP_WSDD_2009 /******************************************************************************\ * * * Definitions * * http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01 * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ #import "wsa5.h" // wsa5 = /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ #define SOAP_NAMESPACE_OF_wsdd "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01" //gsoap wsdd schema import: http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01 //gsoap wsdd schema elementForm: qualified //gsoap wsdd schema attributeForm: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ // Imported element ""http://www.w3.org/2005/08/addressing":EndpointReference" declared as _wsa5__EndpointReference. /// @brief Typedef synonym for struct wsdd__HelloType. typedef struct wsdd__HelloType wsdd__HelloType; /// @brief Typedef synonym for struct wsdd__ByeType. typedef struct wsdd__ByeType wsdd__ByeType; /// @brief Typedef synonym for struct wsdd__ProbeType. typedef struct wsdd__ProbeType wsdd__ProbeType; /// @brief Typedef synonym for struct wsdd__ProbeMatchesType. typedef struct wsdd__ProbeMatchesType wsdd__ProbeMatchesType; /// @brief Typedef synonym for struct wsdd__ProbeMatchType. typedef struct wsdd__ProbeMatchType wsdd__ProbeMatchType; /// @brief Typedef synonym for struct wsdd__ResolveType. typedef struct wsdd__ResolveType wsdd__ResolveType; /// @brief Typedef synonym for struct wsdd__ResolveMatchesType. typedef struct wsdd__ResolveMatchesType wsdd__ResolveMatchesType; /// @brief Typedef synonym for struct wsdd__ResolveMatchType. typedef struct wsdd__ResolveMatchType wsdd__ResolveMatchType; /// @brief Typedef synonym for struct wsdd__ScopesType. typedef struct wsdd__ScopesType wsdd__ScopesType; /// @brief Typedef synonym for struct wsdd__SecurityType. typedef struct wsdd__SecurityType wsdd__SecurityType; /// @brief Typedef synonym for struct wsdd__SigType. typedef struct wsdd__SigType wsdd__SigType; /// @brief Typedef synonym for struct wsdd__AppSequenceType. typedef struct wsdd__AppSequenceType wsdd__AppSequenceType; /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01 * * * \******************************************************************************/ /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":QNameListType is a simpleType containing a whitespace separated list of xs:QName. /// typedef _QName wsdd__QNameListType; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":UriListType is a simpleType containing a whitespace separated list of xs:anyURI. /// typedef char* wsdd__UriListType; /// @brief Union of values from member types "tns:FaultCodeType xs:QName". typedef char* wsdd__FaultCodeOpenType; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":FaultCodeType is a simpleType restriction of XSD type xs:QName. /// enum wsdd__FaultCodeType { wsdd__MatchingRuleNotSupported, ///< xs:QName value=""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":MatchingRuleNotSupported" }; /// @brief Typedef synonym for enum wsdd__FaultCodeType. typedef enum wsdd__FaultCodeType wsdd__FaultCodeType; /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01 * * * \******************************************************************************/ /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":HelloType is a complexType. /// /// struct wsdd__HelloType operations: /// - wsdd__HelloType* soap_new_wsdd__HelloType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wsdd__HelloType(struct soap*, wsdd__HelloType*) default initialize members /// - int soap_read_wsdd__HelloType(struct soap*, wsdd__HelloType*) deserialize from a source /// - int soap_write_wsdd__HelloType(struct soap*, wsdd__HelloType*) serialize to a sink /// - wsdd__HelloType* soap_dup_wsdd__HelloType(struct soap*, wsdd__HelloType* dst, wsdd__HelloType *src) returns deep copy of wsdd__HelloType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wsdd__HelloType(wsdd__HelloType*) deep deletes wsdd__HelloType data members, use only on dst after soap_dup_wsdd__HelloType(NULL, wsdd__HelloType *dst, wsdd__HelloType *src) (use soapcpp2 -Ed) struct wsdd__HelloType { /// Imported element reference "http://www.w3.org/2005/08/addressing":EndpointReference. _wsa5__EndpointReference wsa5__EndpointReference 1; ///< Required element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Types. wsdd__QNameListType Types 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Scopes. struct wsdd__ScopesType* Scopes 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":XAddrs. wsdd__UriListType XAddrs 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":MetadataVersion. unsigned int MetadataVersion 1; ///< Required element. /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ByeType is a complexType. /// /// struct wsdd__ByeType operations: /// - wsdd__ByeType* soap_new_wsdd__ByeType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wsdd__ByeType(struct soap*, wsdd__ByeType*) default initialize members /// - int soap_read_wsdd__ByeType(struct soap*, wsdd__ByeType*) deserialize from a source /// - int soap_write_wsdd__ByeType(struct soap*, wsdd__ByeType*) serialize to a sink /// - wsdd__ByeType* soap_dup_wsdd__ByeType(struct soap*, wsdd__ByeType* dst, wsdd__ByeType *src) returns deep copy of wsdd__ByeType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wsdd__ByeType(wsdd__ByeType*) deep deletes wsdd__ByeType data members, use only on dst after soap_dup_wsdd__ByeType(NULL, wsdd__ByeType *dst, wsdd__ByeType *src) (use soapcpp2 -Ed) struct wsdd__ByeType { /// Imported element reference "http://www.w3.org/2005/08/addressing":EndpointReference. _wsa5__EndpointReference wsa5__EndpointReference 1; ///< Required element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Types. wsdd__QNameListType Types 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Scopes. struct wsdd__ScopesType* Scopes 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":XAddrs. wsdd__UriListType XAddrs 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":MetadataVersion. unsigned int* MetadataVersion 0; ///< Optional element. /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ProbeType is a complexType. /// /// struct wsdd__ProbeType operations: /// - wsdd__ProbeType* soap_new_wsdd__ProbeType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wsdd__ProbeType(struct soap*, wsdd__ProbeType*) default initialize members /// - int soap_read_wsdd__ProbeType(struct soap*, wsdd__ProbeType*) deserialize from a source /// - int soap_write_wsdd__ProbeType(struct soap*, wsdd__ProbeType*) serialize to a sink /// - wsdd__ProbeType* soap_dup_wsdd__ProbeType(struct soap*, wsdd__ProbeType* dst, wsdd__ProbeType *src) returns deep copy of wsdd__ProbeType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wsdd__ProbeType(wsdd__ProbeType*) deep deletes wsdd__ProbeType data members, use only on dst after soap_dup_wsdd__ProbeType(NULL, wsdd__ProbeType *dst, wsdd__ProbeType *src) (use soapcpp2 -Ed) struct wsdd__ProbeType { /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Types. wsdd__QNameListType Types 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Scopes. struct wsdd__ScopesType* Scopes 0; ///< Optional element. /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ProbeMatchesType is a complexType. /// /// struct wsdd__ProbeMatchesType operations: /// - wsdd__ProbeMatchesType* soap_new_wsdd__ProbeMatchesType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wsdd__ProbeMatchesType(struct soap*, wsdd__ProbeMatchesType*) default initialize members /// - int soap_read_wsdd__ProbeMatchesType(struct soap*, wsdd__ProbeMatchesType*) deserialize from a source /// - int soap_write_wsdd__ProbeMatchesType(struct soap*, wsdd__ProbeMatchesType*) serialize to a sink /// - wsdd__ProbeMatchesType* soap_dup_wsdd__ProbeMatchesType(struct soap*, wsdd__ProbeMatchesType* dst, wsdd__ProbeMatchesType *src) returns deep copy of wsdd__ProbeMatchesType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wsdd__ProbeMatchesType(wsdd__ProbeMatchesType*) deep deletes wsdd__ProbeMatchesType data members, use only on dst after soap_dup_wsdd__ProbeMatchesType(NULL, wsdd__ProbeMatchesType *dst, wsdd__ProbeMatchesType *src) (use soapcpp2 -Ed) struct wsdd__ProbeMatchesType { /// Size of array of struct wsdd__ProbeMatchType* is 0..unbounded. $int __sizeProbeMatch 0; /// Array struct wsdd__ProbeMatchType* of size 0..unbounded. struct wsdd__ProbeMatchType* ProbeMatch 0; /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ProbeMatchType is a complexType. /// /// struct wsdd__ProbeMatchType operations: /// - wsdd__ProbeMatchType* soap_new_wsdd__ProbeMatchType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wsdd__ProbeMatchType(struct soap*, wsdd__ProbeMatchType*) default initialize members /// - int soap_read_wsdd__ProbeMatchType(struct soap*, wsdd__ProbeMatchType*) deserialize from a source /// - int soap_write_wsdd__ProbeMatchType(struct soap*, wsdd__ProbeMatchType*) serialize to a sink /// - wsdd__ProbeMatchType* soap_dup_wsdd__ProbeMatchType(struct soap*, wsdd__ProbeMatchType* dst, wsdd__ProbeMatchType *src) returns deep copy of wsdd__ProbeMatchType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wsdd__ProbeMatchType(wsdd__ProbeMatchType*) deep deletes wsdd__ProbeMatchType data members, use only on dst after soap_dup_wsdd__ProbeMatchType(NULL, wsdd__ProbeMatchType *dst, wsdd__ProbeMatchType *src) (use soapcpp2 -Ed) struct wsdd__ProbeMatchType { /// Imported element reference "http://www.w3.org/2005/08/addressing":EndpointReference. _wsa5__EndpointReference wsa5__EndpointReference 1; ///< Required element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Types. wsdd__QNameListType Types 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Scopes. struct wsdd__ScopesType* Scopes 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":XAddrs. wsdd__UriListType XAddrs 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":MetadataVersion. unsigned int MetadataVersion 1; ///< Required element. /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ResolveType is a complexType. /// /// struct wsdd__ResolveType operations: /// - wsdd__ResolveType* soap_new_wsdd__ResolveType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wsdd__ResolveType(struct soap*, wsdd__ResolveType*) default initialize members /// - int soap_read_wsdd__ResolveType(struct soap*, wsdd__ResolveType*) deserialize from a source /// - int soap_write_wsdd__ResolveType(struct soap*, wsdd__ResolveType*) serialize to a sink /// - wsdd__ResolveType* soap_dup_wsdd__ResolveType(struct soap*, wsdd__ResolveType* dst, wsdd__ResolveType *src) returns deep copy of wsdd__ResolveType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wsdd__ResolveType(wsdd__ResolveType*) deep deletes wsdd__ResolveType data members, use only on dst after soap_dup_wsdd__ResolveType(NULL, wsdd__ResolveType *dst, wsdd__ResolveType *src) (use soapcpp2 -Ed) struct wsdd__ResolveType { /// Imported element reference "http://www.w3.org/2005/08/addressing":EndpointReference. _wsa5__EndpointReference wsa5__EndpointReference 1; ///< Required element. /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ResolveMatchesType is a complexType. /// /// struct wsdd__ResolveMatchesType operations: /// - wsdd__ResolveMatchesType* soap_new_wsdd__ResolveMatchesType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wsdd__ResolveMatchesType(struct soap*, wsdd__ResolveMatchesType*) default initialize members /// - int soap_read_wsdd__ResolveMatchesType(struct soap*, wsdd__ResolveMatchesType*) deserialize from a source /// - int soap_write_wsdd__ResolveMatchesType(struct soap*, wsdd__ResolveMatchesType*) serialize to a sink /// - wsdd__ResolveMatchesType* soap_dup_wsdd__ResolveMatchesType(struct soap*, wsdd__ResolveMatchesType* dst, wsdd__ResolveMatchesType *src) returns deep copy of wsdd__ResolveMatchesType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wsdd__ResolveMatchesType(wsdd__ResolveMatchesType*) deep deletes wsdd__ResolveMatchesType data members, use only on dst after soap_dup_wsdd__ResolveMatchesType(NULL, wsdd__ResolveMatchesType *dst, wsdd__ResolveMatchesType *src) (use soapcpp2 -Ed) struct wsdd__ResolveMatchesType { /// Element "ResolveMatch" of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ResolveMatchType. struct wsdd__ResolveMatchType* ResolveMatch 0; ///< Optional element. /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ResolveMatchType is a complexType. /// /// struct wsdd__ResolveMatchType operations: /// - wsdd__ResolveMatchType* soap_new_wsdd__ResolveMatchType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wsdd__ResolveMatchType(struct soap*, wsdd__ResolveMatchType*) default initialize members /// - int soap_read_wsdd__ResolveMatchType(struct soap*, wsdd__ResolveMatchType*) deserialize from a source /// - int soap_write_wsdd__ResolveMatchType(struct soap*, wsdd__ResolveMatchType*) serialize to a sink /// - wsdd__ResolveMatchType* soap_dup_wsdd__ResolveMatchType(struct soap*, wsdd__ResolveMatchType* dst, wsdd__ResolveMatchType *src) returns deep copy of wsdd__ResolveMatchType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wsdd__ResolveMatchType(wsdd__ResolveMatchType*) deep deletes wsdd__ResolveMatchType data members, use only on dst after soap_dup_wsdd__ResolveMatchType(NULL, wsdd__ResolveMatchType *dst, wsdd__ResolveMatchType *src) (use soapcpp2 -Ed) struct wsdd__ResolveMatchType { /// Imported element reference "http://www.w3.org/2005/08/addressing":EndpointReference. _wsa5__EndpointReference wsa5__EndpointReference 1; ///< Required element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Types. wsdd__QNameListType Types 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Scopes. struct wsdd__ScopesType* Scopes 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":XAddrs. wsdd__UriListType XAddrs 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":MetadataVersion. unsigned int MetadataVersion 1; ///< Required element. /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":SecurityType is a complexType. /// /// struct wsdd__SecurityType operations: /// - wsdd__SecurityType* soap_new_wsdd__SecurityType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wsdd__SecurityType(struct soap*, wsdd__SecurityType*) default initialize members /// - int soap_read_wsdd__SecurityType(struct soap*, wsdd__SecurityType*) deserialize from a source /// - int soap_write_wsdd__SecurityType(struct soap*, wsdd__SecurityType*) serialize to a sink /// - wsdd__SecurityType* soap_dup_wsdd__SecurityType(struct soap*, wsdd__SecurityType* dst, wsdd__SecurityType *src) returns deep copy of wsdd__SecurityType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wsdd__SecurityType(wsdd__SecurityType*) deep deletes wsdd__SecurityType data members, use only on dst after soap_dup_wsdd__SecurityType(NULL, wsdd__SecurityType *dst, wsdd__SecurityType *src) (use soapcpp2 -Ed) struct wsdd__SecurityType { /// Element reference "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01:""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Sig. struct wsdd__SigType* Sig 0; ///< Optional element. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":SigType is a complexType. /// /// struct wsdd__SigType operations: /// - wsdd__SigType* soap_new_wsdd__SigType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wsdd__SigType(struct soap*, wsdd__SigType*) default initialize members /// - int soap_read_wsdd__SigType(struct soap*, wsdd__SigType*) deserialize from a source /// - int soap_write_wsdd__SigType(struct soap*, wsdd__SigType*) serialize to a sink /// - wsdd__SigType* soap_dup_wsdd__SigType(struct soap*, wsdd__SigType* dst, wsdd__SigType *src) returns deep copy of wsdd__SigType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wsdd__SigType(wsdd__SigType*) deep deletes wsdd__SigType data members, use only on dst after soap_dup_wsdd__SigType(NULL, wsdd__SigType *dst, wsdd__SigType *src) (use soapcpp2 -Ed) struct wsdd__SigType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. /// Attribute "Scheme" of XSD type xs:anyURI. @char* Scheme 1; ///< Required attribute. /// Attribute "KeyId" of XSD type xs:base64Binary. @char* KeyId 0; ///< Optional attribute. /// Attribute "Refs" of XSD type xs:IDREFS. @char* Refs 1; ///< Required attribute. /// Attribute "Sig" of XSD type xs:base64Binary. @char* Sig 1; ///< Required attribute. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ScopesType is a complexType with simpleContent. /// /// struct wsdd__ScopesType operations: /// - wsdd__ScopesType* soap_new_wsdd__ScopesType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wsdd__ScopesType(struct soap*, wsdd__ScopesType*) default initialize members /// - int soap_read_wsdd__ScopesType(struct soap*, wsdd__ScopesType*) deserialize from a source /// - int soap_write_wsdd__ScopesType(struct soap*, wsdd__ScopesType*) serialize to a sink /// - wsdd__ScopesType* soap_dup_wsdd__ScopesType(struct soap*, wsdd__ScopesType* dst, wsdd__ScopesType *src) returns deep copy of wsdd__ScopesType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wsdd__ScopesType(wsdd__ScopesType*) deep deletes wsdd__ScopesType data members, use only on dst after soap_dup_wsdd__ScopesType(NULL, wsdd__ScopesType *dst, wsdd__ScopesType *src) (use soapcpp2 -Ed) struct wsdd__ScopesType { /// __item wraps ""http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":UriListType" simpleContent. wsdd__UriListType __item ; /// Attribute "MatchBy" of XSD type xs:anyURI. @char* MatchBy 0; ///< Optional attribute. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /// @brief "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":AppSequenceType is a complexType with complexContent restriction of XSD type xs:anyType. /// /// struct wsdd__AppSequenceType operations: /// - wsdd__AppSequenceType* soap_new_wsdd__AppSequenceType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_wsdd__AppSequenceType(struct soap*, wsdd__AppSequenceType*) default initialize members /// - int soap_read_wsdd__AppSequenceType(struct soap*, wsdd__AppSequenceType*) deserialize from a source /// - int soap_write_wsdd__AppSequenceType(struct soap*, wsdd__AppSequenceType*) serialize to a sink /// - wsdd__AppSequenceType* soap_dup_wsdd__AppSequenceType(struct soap*, wsdd__AppSequenceType* dst, wsdd__AppSequenceType *src) returns deep copy of wsdd__AppSequenceType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_wsdd__AppSequenceType(wsdd__AppSequenceType*) deep deletes wsdd__AppSequenceType data members, use only on dst after soap_dup_wsdd__AppSequenceType(NULL, wsdd__AppSequenceType *dst, wsdd__AppSequenceType *src) (use soapcpp2 -Ed) struct wsdd__AppSequenceType { /// Attribute "InstanceId" of XSD type xs:unsignedInt. @unsigned int InstanceId 1; ///< Required attribute. /// Attribute "SequenceId" of XSD type xs:anyURI. @char* SequenceId 0; ///< Optional attribute. /// Attribute "MessageNumber" of XSD type xs:unsignedInt. @unsigned int MessageNumber 1; ///< Required attribute. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). }; /******************************************************************************\ * * * Additional Top-Level Elements * * http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01 * * * \******************************************************************************/ /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Hello of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":HelloType. typedef struct wsdd__HelloType _wsdd__Hello; /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Bye of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ByeType. typedef struct wsdd__ByeType _wsdd__Bye; /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Probe of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ProbeType. typedef struct wsdd__ProbeType _wsdd__Probe; /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ProbeMatches of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ProbeMatchesType. typedef struct wsdd__ProbeMatchesType _wsdd__ProbeMatches; /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Resolve of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ResolveType. typedef struct wsdd__ResolveType _wsdd__Resolve; /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ResolveMatches of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ResolveMatchesType. typedef struct wsdd__ResolveMatchesType _wsdd__ResolveMatches; /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Types of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":QNameListType. typedef wsdd__QNameListType _wsdd__Types; /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Scopes of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":ScopesType. typedef struct wsdd__ScopesType _wsdd__Scopes; /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":XAddrs of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":UriListType. typedef wsdd__UriListType _wsdd__XAddrs; /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":MetadataVersion of XSD type xs:unsignedInt. typedef unsigned int _wsdd__MetadataVersion; /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":SupportedMatchingRules of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":UriListType. typedef wsdd__UriListType _wsdd__SupportedMatchingRules; /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Security of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":SecurityType. typedef struct wsdd__SecurityType _wsdd__Security; /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Sig of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":SigType. typedef struct wsdd__SigType _wsdd__Sig; /// @brief Top-level root element "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":AppSequence of XSD type "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":AppSequenceType. typedef struct wsdd__AppSequenceType _wsdd__AppSequence; /******************************************************************************\ * * * Additional Top-Level Attributes * * http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01 * * * \******************************************************************************/ /// @brief Top-level attribute "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01":Id of simpleType xs:ID. typedef char* _wsdd__Id; /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. Data can be read and deserialized from: - an int file descriptor, using soap->recvfd = fd - a socket, using soap->socket = (int)... - a C++ stream (istream, stringstream), using soap->is = (istream*)... - a C string, using soap->is = (const char*)... - any input, using the soap->frecv() callback Data can be serialized and written to: - an int file descriptor, using soap->sendfd = (int)... - a socket, using soap->socket = (int)... - a C++ stream (ostream, stringstream), using soap->os = (ostream*)... - a C string, using soap->os = (const char**)... - any output, using the soap->fsend() callback The following options are available for (de)serialization control: - soap->encodingStyle = NULL; to remove SOAP 1.1/1.2 encodingStyle - soap_mode(soap, SOAP_XML_TREE); XML without id-ref (no cycles!) - soap_mode(soap, SOAP_XML_GRAPH); XML with id-ref (including cycles) - soap_set_namespaces(soap, struct Namespace *nsmap); to set xmlns bindings @section wsdd Top-level root elements of schema "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01" - @ref _wsdd__Hello @code // Reader (returns SOAP_OK on success): soap_read__wsdd__Hello(struct soap*, _wsdd__Hello*); // Writer (returns SOAP_OK on success): soap_write__wsdd__Hello(struct soap*, _wsdd__Hello*); // REST GET (returns SOAP_OK on success): soap_GET__wsdd__Hello(struct soap*, const char *URL, _wsdd__Hello*); // REST PUT (returns SOAP_OK on success): soap_PUT__wsdd__Hello(struct soap*, const char *URL, _wsdd__Hello*); // REST POST (returns SOAP_OK on success): soap_POST_send__wsdd__Hello(struct soap*, const char *URL, _wsdd__Hello*); soap_POST_recv__wsdd__Hello(struct soap*, _wsdd__Hello*); @endcode - @ref _wsdd__Bye @code // Reader (returns SOAP_OK on success): soap_read__wsdd__Bye(struct soap*, _wsdd__Bye*); // Writer (returns SOAP_OK on success): soap_write__wsdd__Bye(struct soap*, _wsdd__Bye*); // REST GET (returns SOAP_OK on success): soap_GET__wsdd__Bye(struct soap*, const char *URL, _wsdd__Bye*); // REST PUT (returns SOAP_OK on success): soap_PUT__wsdd__Bye(struct soap*, const char *URL, _wsdd__Bye*); // REST POST (returns SOAP_OK on success): soap_POST_send__wsdd__Bye(struct soap*, const char *URL, _wsdd__Bye*); soap_POST_recv__wsdd__Bye(struct soap*, _wsdd__Bye*); @endcode - @ref _wsdd__Probe @code // Reader (returns SOAP_OK on success): soap_read__wsdd__Probe(struct soap*, _wsdd__Probe*); // Writer (returns SOAP_OK on success): soap_write__wsdd__Probe(struct soap*, _wsdd__Probe*); // REST GET (returns SOAP_OK on success): soap_GET__wsdd__Probe(struct soap*, const char *URL, _wsdd__Probe*); // REST PUT (returns SOAP_OK on success): soap_PUT__wsdd__Probe(struct soap*, const char *URL, _wsdd__Probe*); // REST POST (returns SOAP_OK on success): soap_POST_send__wsdd__Probe(struct soap*, const char *URL, _wsdd__Probe*); soap_POST_recv__wsdd__Probe(struct soap*, _wsdd__Probe*); @endcode - @ref _wsdd__ProbeMatches @code // Reader (returns SOAP_OK on success): soap_read__wsdd__ProbeMatches(struct soap*, _wsdd__ProbeMatches*); // Writer (returns SOAP_OK on success): soap_write__wsdd__ProbeMatches(struct soap*, _wsdd__ProbeMatches*); // REST GET (returns SOAP_OK on success): soap_GET__wsdd__ProbeMatches(struct soap*, const char *URL, _wsdd__ProbeMatches*); // REST PUT (returns SOAP_OK on success): soap_PUT__wsdd__ProbeMatches(struct soap*, const char *URL, _wsdd__ProbeMatches*); // REST POST (returns SOAP_OK on success): soap_POST_send__wsdd__ProbeMatches(struct soap*, const char *URL, _wsdd__ProbeMatches*); soap_POST_recv__wsdd__ProbeMatches(struct soap*, _wsdd__ProbeMatches*); @endcode - @ref _wsdd__Resolve @code // Reader (returns SOAP_OK on success): soap_read__wsdd__Resolve(struct soap*, _wsdd__Resolve*); // Writer (returns SOAP_OK on success): soap_write__wsdd__Resolve(struct soap*, _wsdd__Resolve*); // REST GET (returns SOAP_OK on success): soap_GET__wsdd__Resolve(struct soap*, const char *URL, _wsdd__Resolve*); // REST PUT (returns SOAP_OK on success): soap_PUT__wsdd__Resolve(struct soap*, const char *URL, _wsdd__Resolve*); // REST POST (returns SOAP_OK on success): soap_POST_send__wsdd__Resolve(struct soap*, const char *URL, _wsdd__Resolve*); soap_POST_recv__wsdd__Resolve(struct soap*, _wsdd__Resolve*); @endcode - @ref _wsdd__ResolveMatches @code // Reader (returns SOAP_OK on success): soap_read__wsdd__ResolveMatches(struct soap*, _wsdd__ResolveMatches*); // Writer (returns SOAP_OK on success): soap_write__wsdd__ResolveMatches(struct soap*, _wsdd__ResolveMatches*); // REST GET (returns SOAP_OK on success): soap_GET__wsdd__ResolveMatches(struct soap*, const char *URL, _wsdd__ResolveMatches*); // REST PUT (returns SOAP_OK on success): soap_PUT__wsdd__ResolveMatches(struct soap*, const char *URL, _wsdd__ResolveMatches*); // REST POST (returns SOAP_OK on success): soap_POST_send__wsdd__ResolveMatches(struct soap*, const char *URL, _wsdd__ResolveMatches*); soap_POST_recv__wsdd__ResolveMatches(struct soap*, _wsdd__ResolveMatches*); @endcode - @ref _wsdd__Types @code // Reader (returns SOAP_OK on success): soap_read__wsdd__Types(struct soap*, _wsdd__Types*); // Writer (returns SOAP_OK on success): soap_write__wsdd__Types(struct soap*, _wsdd__Types*); // REST GET (returns SOAP_OK on success): soap_GET__wsdd__Types(struct soap*, const char *URL, _wsdd__Types*); // REST PUT (returns SOAP_OK on success): soap_PUT__wsdd__Types(struct soap*, const char *URL, _wsdd__Types*); // REST POST (returns SOAP_OK on success): soap_POST_send__wsdd__Types(struct soap*, const char *URL, _wsdd__Types*); soap_POST_recv__wsdd__Types(struct soap*, _wsdd__Types*); @endcode - @ref _wsdd__Scopes @code // Reader (returns SOAP_OK on success): soap_read__wsdd__Scopes(struct soap*, _wsdd__Scopes*); // Writer (returns SOAP_OK on success): soap_write__wsdd__Scopes(struct soap*, _wsdd__Scopes*); // REST GET (returns SOAP_OK on success): soap_GET__wsdd__Scopes(struct soap*, const char *URL, _wsdd__Scopes*); // REST PUT (returns SOAP_OK on success): soap_PUT__wsdd__Scopes(struct soap*, const char *URL, _wsdd__Scopes*); // REST POST (returns SOAP_OK on success): soap_POST_send__wsdd__Scopes(struct soap*, const char *URL, _wsdd__Scopes*); soap_POST_recv__wsdd__Scopes(struct soap*, _wsdd__Scopes*); @endcode - @ref _wsdd__XAddrs @code // Reader (returns SOAP_OK on success): soap_read__wsdd__XAddrs(struct soap*, _wsdd__XAddrs*); // Writer (returns SOAP_OK on success): soap_write__wsdd__XAddrs(struct soap*, _wsdd__XAddrs*); // REST GET (returns SOAP_OK on success): soap_GET__wsdd__XAddrs(struct soap*, const char *URL, _wsdd__XAddrs*); // REST PUT (returns SOAP_OK on success): soap_PUT__wsdd__XAddrs(struct soap*, const char *URL, _wsdd__XAddrs*); // REST POST (returns SOAP_OK on success): soap_POST_send__wsdd__XAddrs(struct soap*, const char *URL, _wsdd__XAddrs*); soap_POST_recv__wsdd__XAddrs(struct soap*, _wsdd__XAddrs*); @endcode - @ref _wsdd__MetadataVersion @code // Reader (returns SOAP_OK on success): soap_read__wsdd__MetadataVersion(struct soap*, _wsdd__MetadataVersion*); // Writer (returns SOAP_OK on success): soap_write__wsdd__MetadataVersion(struct soap*, _wsdd__MetadataVersion*); // REST GET (returns SOAP_OK on success): soap_GET__wsdd__MetadataVersion(struct soap*, const char *URL, _wsdd__MetadataVersion*); // REST PUT (returns SOAP_OK on success): soap_PUT__wsdd__MetadataVersion(struct soap*, const char *URL, _wsdd__MetadataVersion*); // REST POST (returns SOAP_OK on success): soap_POST_send__wsdd__MetadataVersion(struct soap*, const char *URL, _wsdd__MetadataVersion*); soap_POST_recv__wsdd__MetadataVersion(struct soap*, _wsdd__MetadataVersion*); @endcode - @ref _wsdd__SupportedMatchingRules @code // Reader (returns SOAP_OK on success): soap_read__wsdd__SupportedMatchingRules(struct soap*, _wsdd__SupportedMatchingRules*); // Writer (returns SOAP_OK on success): soap_write__wsdd__SupportedMatchingRules(struct soap*, _wsdd__SupportedMatchingRules*); // REST GET (returns SOAP_OK on success): soap_GET__wsdd__SupportedMatchingRules(struct soap*, const char *URL, _wsdd__SupportedMatchingRules*); // REST PUT (returns SOAP_OK on success): soap_PUT__wsdd__SupportedMatchingRules(struct soap*, const char *URL, _wsdd__SupportedMatchingRules*); // REST POST (returns SOAP_OK on success): soap_POST_send__wsdd__SupportedMatchingRules(struct soap*, const char *URL, _wsdd__SupportedMatchingRules*); soap_POST_recv__wsdd__SupportedMatchingRules(struct soap*, _wsdd__SupportedMatchingRules*); @endcode - @ref _wsdd__Security @code // Reader (returns SOAP_OK on success): soap_read__wsdd__Security(struct soap*, _wsdd__Security*); // Writer (returns SOAP_OK on success): soap_write__wsdd__Security(struct soap*, _wsdd__Security*); // REST GET (returns SOAP_OK on success): soap_GET__wsdd__Security(struct soap*, const char *URL, _wsdd__Security*); // REST PUT (returns SOAP_OK on success): soap_PUT__wsdd__Security(struct soap*, const char *URL, _wsdd__Security*); // REST POST (returns SOAP_OK on success): soap_POST_send__wsdd__Security(struct soap*, const char *URL, _wsdd__Security*); soap_POST_recv__wsdd__Security(struct soap*, _wsdd__Security*); @endcode - @ref _wsdd__Sig @code // Reader (returns SOAP_OK on success): soap_read__wsdd__Sig(struct soap*, _wsdd__Sig*); // Writer (returns SOAP_OK on success): soap_write__wsdd__Sig(struct soap*, _wsdd__Sig*); // REST GET (returns SOAP_OK on success): soap_GET__wsdd__Sig(struct soap*, const char *URL, _wsdd__Sig*); // REST PUT (returns SOAP_OK on success): soap_PUT__wsdd__Sig(struct soap*, const char *URL, _wsdd__Sig*); // REST POST (returns SOAP_OK on success): soap_POST_send__wsdd__Sig(struct soap*, const char *URL, _wsdd__Sig*); soap_POST_recv__wsdd__Sig(struct soap*, _wsdd__Sig*); @endcode - @ref _wsdd__AppSequence @code // Reader (returns SOAP_OK on success): soap_read__wsdd__AppSequence(struct soap*, _wsdd__AppSequence*); // Writer (returns SOAP_OK on success): soap_write__wsdd__AppSequence(struct soap*, _wsdd__AppSequence*); // REST GET (returns SOAP_OK on success): soap_GET__wsdd__AppSequence(struct soap*, const char *URL, _wsdd__AppSequence*); // REST PUT (returns SOAP_OK on success): soap_PUT__wsdd__AppSequence(struct soap*, const char *URL, _wsdd__AppSequence*); // REST POST (returns SOAP_OK on success): soap_POST_send__wsdd__AppSequence(struct soap*, const char *URL, _wsdd__AppSequence*); soap_POST_recv__wsdd__AppSequence(struct soap*, _wsdd__AppSequence*); @endcode */ #import "wsdx.h" /* End of wsdd.h */ gsoap-2.8.91/gsoap/import/xmime5.h0000644000175000017500000000574713525245161016305 0ustar ellertellert/* xmime5.h Use #import "xmime5.h" in a gSOAP header file to enable xmlmime 2005/05 bindings. The xmime5:contentType attribute can be used to associate a MIME type with binary content, as in: #import "xmime5.h" struct ns__myBinaryData { unsigned char *__ptr; int __size; @char *xmime5__contentType; }; Use soapcpp2 option -Ipath:path:... to specify the path(s) for #import 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 A. 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 -------------------------------------------------------------------------------- */ //gsoap xmime5 schema namespace: http://www.w3.org/2005/05/xmlmime //gsoap xmime5 schema namespace2: http://www.w3.org/2004/11/xmlmime //gsoap xmime5 schema import: https://www.w3.org/2005/05/xmlmime /** base64 type, can be used as MIME attachment (when id and type are set) */ struct xmime5__base64Binary { unsigned char *__ptr; int __size; char *id; char *type; char *options; }; typedef struct xmime5__base64Binary xmime5__base64Binary; gsoap-2.8.91/gsoap/import/wsrx5.h0000644000175000017500000002404413525245161016160 0ustar ellertellert/* wsrx5.h WS-ReliableMessaging definitions: SOAP Header definitions for WS-RM 1.0 2005 WS-RM Operations for CreateSequence, CloseSequence, TerminateSequence WS-RM SequenceAcknowledgement server operation (RM dest for AcksTo) Note: changed TerminateSequenceResponse to TerminateSequence Imported by import/wsrm5.h gSOAP XML Web services tools Copyright (C) 2000-2012, 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. -------------------------------------------------------------------------------- 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-2012, 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 -------------------------------------------------------------------------------- */ struct SOAP_ENV__Header { struct wsrm__SequenceType *wsrm__Sequence 0; int __sizeAckRequested 0; struct wsrm__AckRequestedType *wsrm__AckRequested 0; int __sizeSequenceAcknowledgement 0; struct _wsrm__SequenceAcknowledgement *wsrm__SequenceAcknowledgement 0; struct wsrm__SequenceFaultType *wsrm__SequenceFault 0; }; //gsoap wsrm service name: wsrm //gsoap wsrm service method-header-part: CreateSequence wsa5__MessageID //gsoap wsrm service method-header-part: CreateSequence wsa5__RelatesTo //gsoap wsrm service method-header-part: CreateSequence wsa5__From //gsoap wsrm service method-header-part: CreateSequence wsa5__ReplyTo //gsoap wsrm service method-header-part: CreateSequence wsa5__FaultTo //gsoap wsrm service method-header-part: CreateSequence wsa5__To //gsoap wsrm service method-header-part: CreateSequence wsa5__Action //gsoap wsrm service method-action: CreateSequence http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequence //gsoap wsrm service method-output-action: CreateSequence http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequenceResponse int __wsrm__CreateSequence( struct wsrm__CreateSequenceType *wsrm__CreateSequence, struct wsrm__CreateSequenceResponseType *wsrm__CreateSequenceResponse); //gsoap wsrm service method-header-part: CloseSequence wsa5__MessageID //gsoap wsrm service method-header-part: CloseSequence wsa5__RelatesTo //gsoap wsrm service method-header-part: CloseSequence wsa5__From //gsoap wsrm service method-header-part: CloseSequence wsa5__ReplyTo //gsoap wsrm service method-header-part: CloseSequence wsa5__FaultTo //gsoap wsrm service method-header-part: CloseSequence wsa5__To //gsoap wsrm service method-header-part: CloseSequence wsa5__Action //gsoap wsrm service method-action: CloseSequence http://schemas.xmlsoap.org/ws/2005/02/rm/CloseSequence //gsoap wsrm service method-output-action: CloseSequence http://schemas.xmlsoap.org/ws/2005/02/rm/CloseSequenceResponse int __wsrm__CloseSequence( struct wsrm__CloseSequenceType *wsrm__CloseSequence, struct wsrm__CloseSequenceResponseType *wsrm__CloseSequenceResponse); //gsoap wsrm service method-header-part: TerminateSequence wsa5__MessageID //gsoap wsrm service method-header-part: TerminateSequence wsa5__RelatesTo //gsoap wsrm service method-header-part: TerminateSequence wsa5__From //gsoap wsrm service method-header-part: TerminateSequence wsa5__ReplyTo //gsoap wsrm service method-header-part: TerminateSequence wsa5__FaultTo //gsoap wsrm service method-header-part: TerminateSequence wsa5__To //gsoap wsrm service method-header-part: TerminateSequence wsa5__Action //gsoap wsrm service method-action: TerminateSequence http://schemas.xmlsoap.org/ws/2005/02/rm/TerminateSequence //gsoap wsrm service method-output-action: TerminateSequence http://schemas.xmlsoap.org/ws/2005/02/rm/TerminateSequence int __wsrm__TerminateSequence( struct wsrm__TerminateSequenceType *wsrm__TerminateSequence, struct wsrm__TerminateSequenceResponseType *wsrm__TerminateSequence_); //gsoap wsrm service method-header-part: CreateSequenceResponse wsa5__MessageID //gsoap wsrm service method-header-part: CreateSequenceResponse wsa5__RelatesTo //gsoap wsrm service method-header-part: CreateSequenceResponse wsa5__From //gsoap wsrm service method-header-part: CreateSequenceResponse wsa5__ReplyTo //gsoap wsrm service method-header-part: CreateSequenceResponse wsa5__FaultTo //gsoap wsrm service method-header-part: CreateSequenceResponse wsa5__To //gsoap wsrm service method-header-part: CreateSequenceResponse wsa5__Action //gsoap wsrm service method-action: CreateSequenceResponse http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequenceResponse int __wsrm__CreateSequenceResponse(struct wsrm__CreateSequenceResponseType *wsrm__CreateSequenceResponse, void); //gsoap wsrm service method-header-part: CloseSequenceResponse wsa5__MessageID //gsoap wsrm service method-header-part: CloseSequenceResponse wsa5__RelatesTo //gsoap wsrm service method-header-part: CloseSequenceResponse wsa5__From //gsoap wsrm service method-header-part: CloseSequenceResponse wsa5__ReplyTo //gsoap wsrm service method-header-part: CloseSequenceResponse wsa5__FaultTo //gsoap wsrm service method-header-part: CloseSequenceResponse wsa5__To //gsoap wsrm service method-header-part: CloseSequenceResponse wsa5__Action //gsoap wsrm service method-action: CloseSequenceResponse http://schemas.xmlsoap.org/ws/2005/02/rm/CloseSequenceResponse int __wsrm__CloseSequenceResponse(struct wsrm__CloseSequenceResponseType *wsrm__CloseSequenceResponse, void); //gsoap wsrm service method-header-part: TerminateSequenceResponse wsa5__MessageID //gsoap wsrm service method-header-part: TerminateSequenceResponse wsa5__RelatesTo //gsoap wsrm service method-header-part: TerminateSequenceResponse wsa5__From //gsoap wsrm service method-header-part: TerminateSequenceResponse wsa5__ReplyTo //gsoap wsrm service method-header-part: TerminateSequenceResponse wsa5__FaultTo //gsoap wsrm service method-header-part: TerminateSequenceResponse wsa5__To //gsoap wsrm service method-header-part: TerminateSequenceResponse wsa5__Action //gsoap wsrm service method-action: TerminateSequenceResponse http://schemas.xmlsoap.org/ws/2005/02/rm/TerminateSequenceResponse int __wsrm__TerminateSequenceResponse(struct wsrm__TerminateSequenceResponseType *wsrm__TerminateSequenceResponse, void); //gsoap wsrm service method-header-part: SequenceAcknowledgement wsa5__MessageID //gsoap wsrm service method-header-part: SequenceAcknowledgement wsa5__RelatesTo //gsoap wsrm service method-header-part: SequenceAcknowledgement wsa5__From //gsoap wsrm service method-header-part: SequenceAcknowledgement wsa5__ReplyTo //gsoap wsrm service method-header-part: SequenceAcknowledgement wsa5__FaultTo //gsoap wsrm service method-header-part: SequenceAcknowledgement wsa5__To //gsoap wsrm service method-header-part: SequenceAcknowledgement wsa5__Action //gsoap wsrm service method-action: SequenceAcknowledgement http://schemas.xmlsoap.org/ws/2005/02/rm/SequenceAcknowledgement int __wsrm__SequenceAcknowledgement(void); //gsoap wsrm service method-header-part: AckRequested wsa5__MessageID //gsoap wsrm service method-header-part: AckRequested wsa5__RelatesTo //gsoap wsrm service method-header-part: AckRequested wsa5__From //gsoap wsrm service method-header-part: AckRequested wsa5__ReplyTo //gsoap wsrm service method-header-part: AckRequested wsa5__FaultTo //gsoap wsrm service method-header-part: AckRequested wsa5__To //gsoap wsrm service method-header-part: AckRequested wsa5__Action //gsoap wsrm service method-action: AckRequested http://schemas.xmlsoap.org/ws/2005/02/rm/AckRequested int __wsrm__AckRequested(void); //gsoap wsrm service method-header-part: LastMessage wsa5__MessageID //gsoap wsrm service method-header-part: LastMessage wsa5__RelatesTo //gsoap wsrm service method-header-part: LastMessage wsa5__From //gsoap wsrm service method-header-part: LastMessage wsa5__ReplyTo //gsoap wsrm service method-header-part: LastMessage wsa5__FaultTo //gsoap wsrm service method-header-part: LastMessage wsa5__To //gsoap wsrm service method-header-part: LastMessage wsa5__Action //gsoap wsrm service method-action: LastMessage http://schemas.xmlsoap.org/ws/2005/02/rm/LastMessage int __wsrm__LastMessage(void); gsoap-2.8.91/gsoap/import/ds.h0000644000175000017500000004630013525245161015475 0ustar ellertellert/* ds.h Generated with: wsdl2h -cuxy -o ds.h -t WS/WS-typemap.dat WS/ds.xsd - Removed //gsoapopt - Added //gsoap ds schema import: http://www.w3.org/2000/09/xmldsig# */ /******************************************************************************\ * * * http://www.w3.org/2000/09/xmldsig# * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ //gsoap ds schema import: http://www.w3.org/2000/09/xmldsig# //gsoap ds schema elementForm: qualified //gsoap ds schema attributeForm: unqualified /******************************************************************************\ * * * Schema Types * * * \******************************************************************************/ /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":SignatureType from typemap WS/WS-typemap.dat. typedef char *_ds__SignatureValue; typedef struct ds__SignatureType { struct ds__SignedInfoType* SignedInfo; _ds__SignatureValue SignatureValue; struct ds__KeyInfoType* KeyInfo; @char* Id; } ds__SignatureType, _ds__Signature; /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":SignatureValueType from typemap WS/WS-typemap.dat. /// complexType definition intentionally left blank. /// Typedef synonym for struct ds__SignedInfoType. typedef struct ds__SignedInfoType ds__SignedInfoType; /// Typedef synonym for struct ds__CanonicalizationMethodType. typedef struct ds__CanonicalizationMethodType ds__CanonicalizationMethodType; /// Typedef synonym for struct ds__SignatureMethodType. typedef struct ds__SignatureMethodType ds__SignatureMethodType; /// Typedef synonym for struct ds__ReferenceType. typedef struct ds__ReferenceType ds__ReferenceType; /// Typedef synonym for struct ds__TransformsType. typedef struct ds__TransformsType ds__TransformsType; /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":TransformType from typemap WS/WS-typemap.dat. #import "c14n.h" typedef struct ds__TransformType { _c14n__InclusiveNamespaces* c14n__InclusiveNamespaces; _XML __any; @char* Algorithm; } ds__TransformType, _ds__Transform; /// Typedef synonym for struct ds__DigestMethodType. typedef struct ds__DigestMethodType ds__DigestMethodType; /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":KeyInfoType from typemap WS/WS-typemap.dat. typedef struct ds__KeyInfoType { char* KeyName; struct ds__KeyValueType* KeyValue; struct ds__RetrievalMethodType* RetrievalMethod; struct ds__X509DataType* X509Data; struct _wsse__SecurityTokenReference* wsse__SecurityTokenReference; @char* Id; } ds__KeyInfoType, _ds__KeyInfo; #import "wsse.h" /// Typedef synonym for struct ds__KeyValueType. typedef struct ds__KeyValueType ds__KeyValueType; /// Typedef synonym for struct ds__RetrievalMethodType. typedef struct ds__RetrievalMethodType ds__RetrievalMethodType; /// Typedef synonym for struct ds__X509DataType. typedef struct ds__X509DataType ds__X509DataType; /// Typedef synonym for struct ds__X509IssuerSerialType. typedef struct ds__X509IssuerSerialType ds__X509IssuerSerialType; /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":PGPDataType from typemap WS/WS-typemap.dat. /// complexType definition intentionally left blank. /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":SPKIDataType from typemap WS/WS-typemap.dat. /// complexType definition intentionally left blank. /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":ObjectType from typemap WS/WS-typemap.dat. /// complexType definition intentionally left blank. /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":ManifestType from typemap WS/WS-typemap.dat. /// complexType definition intentionally left blank. /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":SignaturePropertiesType from typemap WS/WS-typemap.dat. /// complexType definition intentionally left blank. /// Imported complexType "http://www.w3.org/2000/09/xmldsig#":SignaturePropertyType from typemap WS/WS-typemap.dat. /// complexType definition intentionally left blank. /// Typedef synonym for struct ds__DSAKeyValueType. typedef struct ds__DSAKeyValueType ds__DSAKeyValueType; /// Typedef synonym for struct ds__RSAKeyValueType. typedef struct ds__RSAKeyValueType ds__RSAKeyValueType; /// Imported simpleType "http://www.w3.org/2000/09/xmldsig#":CryptoBinary from typemap WS/WS-typemap.dat. /// simpleType definition intentionally left blank. /// Imported simpleType "http://www.w3.org/2000/09/xmldsig#":DigestValueType from typemap WS/WS-typemap.dat. /// simpleType definition intentionally left blank. /// Imported simpleType "http://www.w3.org/2000/09/xmldsig#":HMACOutputLengthType from typemap WS/WS-typemap.dat. /// simpleType definition intentionally left blank. /// "http://www.w3.org/2000/09/xmldsig#":SignedInfoType is a complexType. struct ds__SignedInfoType { /// Element reference "http://www.w3.org/2000/09/xmldsig#":CanonicalizationMethod. struct ds__CanonicalizationMethodType* CanonicalizationMethod 1; ///< Required element. /// Element reference "http://www.w3.org/2000/09/xmldsig#":SignatureMethod. struct ds__SignatureMethodType* SignatureMethod 1; ///< Required element. /// Size of the dynamic array of struct ds__ReferenceType* is 0..unbounded int __sizeReference ; /// Pointer to array of struct ds__ReferenceType*. struct ds__ReferenceType* *Reference 1; /// Attribute Id of type xs:ID. @char* /*ID*/ Id 0; ///< Optional attribute. }; /// "http://www.w3.org/2000/09/xmldsig#":CanonicalizationMethodType is a complexType. struct ds__CanonicalizationMethodType { /// TODO: /// Schema extensibility is user-definable. /// Consult the protocol documentation to change and/or insert declarations. /// Use wsdl2h option -x to remove this element. /// Attribute Algorithm of type xs:anyURI. @char* /*URI*/ Algorithm 1; ///< Required attribute. /// Member declared in WS/WS-typemap.dat _c14n__InclusiveNamespaces* c14n__InclusiveNamespaces; }; /// "http://www.w3.org/2000/09/xmldsig#":SignatureMethodType is a complexType. struct ds__SignatureMethodType { /// Element HMACOutputLength of type "http://www.w3.org/2000/09/xmldsig#":HMACOutputLengthType. int* HMACOutputLength 0; ///< Optional element. /// TODO: /// Schema extensibility is user-definable. /// Consult the protocol documentation to change and/or insert declarations. /// Use wsdl2h option -x to remove this element. /// Attribute Algorithm of type xs:anyURI. @char* /*URI*/ Algorithm 1; ///< Required attribute. }; /// "http://www.w3.org/2000/09/xmldsig#":ReferenceType is a complexType. struct ds__ReferenceType { /// Element reference "http://www.w3.org/2000/09/xmldsig#":Transforms. struct ds__TransformsType* Transforms 0; ///< Optional element. /// Element reference "http://www.w3.org/2000/09/xmldsig#":DigestMethod. struct ds__DigestMethodType* DigestMethod 1; ///< Required element. /// Element reference "http://www.w3.org/2000/09/xmldsig#":DigestValue. char* /*base64*/ DigestValue 1; ///< Required element. /// Attribute Id of type xs:ID. @char* /*ID*/ Id 0; ///< Optional attribute. /// Attribute URI of type xs:anyURI. @char* /*URI*/ URI 0; ///< Optional attribute. /// Attribute Type of type xs:anyURI. @char* /*URI*/ Type 0; ///< Optional attribute. }; /// "http://www.w3.org/2000/09/xmldsig#":TransformsType is a complexType. struct ds__TransformsType { /// Size of the dynamic array of ds__TransformType is 0..unbounded int __sizeTransform ; /// Pointer to array of ds__TransformType. ds__TransformType *Transform 1; }; /// "http://www.w3.org/2000/09/xmldsig#":DigestMethodType is a complexType. struct ds__DigestMethodType { /// TODO: /// Schema extensibility is user-definable. /// Consult the protocol documentation to change and/or insert declarations. /// Use wsdl2h option -x to remove this element. /// Attribute Algorithm of type xs:anyURI. @char* /*URI*/ Algorithm 1; ///< Required attribute. }; /// "http://www.w3.org/2000/09/xmldsig#":KeyValueType is a complexType. struct ds__KeyValueType { /// CHOICE OF ELEMENTS /// Element reference "http://www.w3.org/2000/09/xmldsig#":DSAKeyValue. struct ds__DSAKeyValueType* DSAKeyValue 0; ///< Required element. /// Element reference "http://www.w3.org/2000/09/xmldsig#":RSAKeyValue. struct ds__RSAKeyValueType* RSAKeyValue 0; ///< Required element. /// TODO: /// Schema extensibility is user-definable. /// Consult the protocol documentation to change and/or insert declarations. /// Use wsdl2h option -x to remove this element. // END OF CHOICE }; /// "http://www.w3.org/2000/09/xmldsig#":RetrievalMethodType is a complexType. struct ds__RetrievalMethodType { /// Element reference "http://www.w3.org/2000/09/xmldsig#":Transforms. struct ds__TransformsType* Transforms 0; ///< Optional element. /// Attribute URI of type xs:anyURI. @char* /*URI*/ URI 0; ///< Optional attribute. /// Attribute Type of type xs:anyURI. @char* /*URI*/ Type 0; ///< Optional attribute. }; /// "http://www.w3.org/2000/09/xmldsig#":X509DataType is a complexType. struct ds__X509DataType { /// CHOICE OF ELEMENTS /// Element X509IssuerSerial of type "http://www.w3.org/2000/09/xmldsig#":X509IssuerSerialType. struct ds__X509IssuerSerialType* X509IssuerSerial 0; ///< Required element. /// Element X509SKI of type xs:base64Binary. char* /*base64*/ X509SKI 0; ///< Required element. /// Element X509SubjectName of type xs:string. char* X509SubjectName 0; ///< Required element. /// Element X509Certificate of type xs:base64Binary. char* /*base64*/ X509Certificate 0; ///< Required element. /// Element X509CRL of type xs:base64Binary. char* /*base64*/ X509CRL 0; ///< Required element. /// TODO: /// Schema extensibility is user-definable. /// Consult the protocol documentation to change and/or insert declarations. /// Use wsdl2h option -x to remove this element. // END OF CHOICE }; /// "http://www.w3.org/2000/09/xmldsig#":X509IssuerSerialType is a complexType. struct ds__X509IssuerSerialType { /// Element X509IssuerName of type xs:string. char* X509IssuerName 1; ///< Required element. /// Element X509SerialNumber of type xs:integer. char* X509SerialNumber 1; ///< Required element. }; /// "http://www.w3.org/2000/09/xmldsig#":DSAKeyValueType is a complexType. struct ds__DSAKeyValueType { /// Element G of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ G 0; ///< Optional element. /// Element Y of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ Y 1; ///< Required element. /// Element J of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ J 0; ///< Optional element. /// Element P of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ P 1; ///< Required element. /// Element Q of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ Q 1; ///< Required element. /// Element Seed of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ Seed 1; ///< Required element. /// Element PgenCounter of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ PgenCounter 1; ///< Required element. }; /// "http://www.w3.org/2000/09/xmldsig#":RSAKeyValueType is a complexType. struct ds__RSAKeyValueType { /// Element Modulus of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ Modulus 1; ///< Required element. /// Element Exponent of type "http://www.w3.org/2000/09/xmldsig#":CryptoBinary. char* /*base64*/ Exponent 1; ///< Required element. }; /// Element "http://www.w3.org/2000/09/xmldsig#":Signature of complexType "http://www.w3.org/2000/09/xmldsig#":SignatureType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":SignatureValue of complexType "http://www.w3.org/2000/09/xmldsig#":SignatureValueType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":SignedInfo of complexType "http://www.w3.org/2000/09/xmldsig#":SignedInfoType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":CanonicalizationMethod of complexType "http://www.w3.org/2000/09/xmldsig#":CanonicalizationMethodType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":SignatureMethod of complexType "http://www.w3.org/2000/09/xmldsig#":SignatureMethodType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":Reference of complexType "http://www.w3.org/2000/09/xmldsig#":ReferenceType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":Transforms of complexType "http://www.w3.org/2000/09/xmldsig#":TransformsType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":Transform of complexType "http://www.w3.org/2000/09/xmldsig#":TransformType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":DigestMethod of complexType "http://www.w3.org/2000/09/xmldsig#":DigestMethodType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":DigestValue of complexType "http://www.w3.org/2000/09/xmldsig#":DigestValueType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":KeyInfo of complexType "http://www.w3.org/2000/09/xmldsig#":KeyInfoType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":KeyName of complexType xs:string. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":MgmtData of complexType xs:string. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":KeyValue of complexType "http://www.w3.org/2000/09/xmldsig#":KeyValueType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":RetrievalMethod of complexType "http://www.w3.org/2000/09/xmldsig#":RetrievalMethodType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":X509Data of complexType "http://www.w3.org/2000/09/xmldsig#":X509DataType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":PGPData of complexType "http://www.w3.org/2000/09/xmldsig#":PGPDataType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":SPKIData of complexType "http://www.w3.org/2000/09/xmldsig#":SPKIDataType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":Object of complexType "http://www.w3.org/2000/09/xmldsig#":ObjectType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":Manifest of complexType "http://www.w3.org/2000/09/xmldsig#":ManifestType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":SignatureProperties of complexType "http://www.w3.org/2000/09/xmldsig#":SignaturePropertiesType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":SignatureProperty of complexType "http://www.w3.org/2000/09/xmldsig#":SignaturePropertyType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":DSAKeyValue of complexType "http://www.w3.org/2000/09/xmldsig#":DSAKeyValueType. /// Note: use wsdl2h option -g to generate this global element declaration. /// Element "http://www.w3.org/2000/09/xmldsig#":RSAKeyValue of complexType "http://www.w3.org/2000/09/xmldsig#":RSAKeyValueType. /// Note: use wsdl2h option -g to generate this global element declaration. /* End of ds.h */ gsoap-2.8.91/gsoap/import/xmime.h0000644000175000017500000000521713525245161016210 0ustar ellertellert/* xmime.h Use #import "xmime.h" in a gSOAP header file to enable xmlmime 2004/06 bindings. The xmime:contentType attribute can be used to associate a MIME type with binary content, as in: #import "xmime.h" struct ns__myBinaryData { unsigned char *__ptr; int __size; @char *xmime__contentType; }; Use soapcpp2 option -Ipath:path:... to specify the path(s) for #import 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 A. 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 -------------------------------------------------------------------------------- */ //gsoap xmime schema namespace: http://www.w3.org/2004/06/xmlmime //gsoap xmime schema import: https://www.w3.org/2004/06/xmlmime gsoap-2.8.91/gsoap/import/wsse.h0000644000175000017500000003417013525245161016052 0ustar ellertellert/* wsse.h 1.0 (2004) and 1.1 Generated with: wsdl2h -cegxy -o wsse.h -t WS/WS-typemap.dat WS/wsse.xsd - Removed //gsoapopt - Added //gsoap wsse schema import: http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd - Added //gsoap wsse schema namespace2: http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd - Added mutable SOAP_ENV__Header struct */ /******************************************************************************\ * * * http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd* * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ #import "wsu.h" // wsu = /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ #define SOAP_NAMESPACE_OF_wsse "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" //gsoap wsse schema import: http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd //gsoap wsse schema namespace2: http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd //gsoap wsse schema elementForm: qualified //gsoap wsse schema attributeForm: unqualified /******************************************************************************\ * * * Schema Types * * * \******************************************************************************/ /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":AttributedString from typemap WS/WS-typemap.dat. /// @brief This type represents an element with arbitrary attributes. /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":PasswordString from typemap WS/WS-typemap.dat. /// @brief This type is used for password elements per Section 4.1. /// complexType definition intentionally left blank. /// @brief Typedef synonym for struct wsse__EncodedString. typedef struct wsse__EncodedString wsse__EncodedString; /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":EncodedString from typemap WS/WS-typemap.dat. /// @brief This type is used for elements containing stringified binary data. /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":UsernameTokenType from typemap WS/WS-typemap.dat. /// @brief This type represents a username token per Section 4.1 /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":BinarySecurityTokenType from typemap WS/WS-typemap.dat. /// @brief A security token that is encoded in binary /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":KeyIdentifierType from typemap WS/WS-typemap.dat. /// @brief A security token key identifier /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":ReferenceType from typemap WS/WS-typemap.dat. /// @brief This type represents a reference to an external security token. /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":EmbeddedType from typemap WS/WS-typemap.dat. /// @brief This type represents a reference to an embedded security token. /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityTokenReferenceType from typemap WS/WS-typemap.dat. /// @brief This type is used reference a security token. /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityHeaderType from typemap WS/WS-typemap.dat. /// @brief This complexType defines header block to use for security-relevant data directed at a specific SOAP actor. /// complexType definition intentionally left blank. /// Imported complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":TransformationParametersType from typemap WS/WS-typemap.dat. /// @brief This complexType defines a container for elements to be specified from any namespace as properties/parameters of a DSIG transformation. /// complexType definition intentionally left blank. /// Imported simpleType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":tUsage from typemap WS/WS-typemap.dat. /// @brief Typedef to allow a list of usages (as URIs). /// simpleType definition intentionally left blank. /// "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":FaultcodeEnum is a simpleType restriction of xs:QName. enum wsse__FaultcodeEnum { wsse__UnsupportedSecurityToken, ///< xs:QName value=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":UnsupportedSecurityToken" wsse__UnsupportedAlgorithm, ///< xs:QName value=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":UnsupportedAlgorithm" wsse__InvalidSecurity, ///< xs:QName value=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":InvalidSecurity" wsse__InvalidSecurityToken, ///< xs:QName value=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":InvalidSecurityToken" wsse__FailedAuthentication, ///< xs:QName value=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":FailedAuthentication" wsse__FailedCheck, ///< xs:QName value=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":FailedCheck" wsse__SecurityTokenUnavailable, ///< xs:QName value=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityTokenUnavailable" }; /// Typedef synonym for enum wsse__FaultcodeEnum. typedef enum wsse__FaultcodeEnum wsse__FaultcodeEnum; /// "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":EncodedString is a complexType with simpleContent. /// @brief This type is used for elements containing stringified binary data. struct wsse__EncodedString { /// __item wraps "xs:string" simpleContent. char* __item ; /// Attribute "EncodingType" of XSD type xs:anyURI. @char* EncodingType 0; ///< Optional attribute. /// Imported attribute reference "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd":Id. @char* wsu__Id 0; ///< Optional attribute. }; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":UsernameToken of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":UsernameTokenType. /// @brief This element defines the wsse:UsernameToken element per Section 4.1. /// Imported element _wsse__UsernameToken from typemap WS/WS-typemap.dat. typedef struct _wsse__UsernameToken { char* Username; struct _wsse__Password* Password; struct wsse__EncodedString* Nonce; char* wsu__Created; @char* wsu__Id; } _wsse__UsernameToken; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":BinarySecurityToken of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":BinarySecurityTokenType. /// @brief This element defines the wsse:BinarySecurityToken element per Section 4.2. /// Imported element _wsse__BinarySecurityToken from typemap WS/WS-typemap.dat. typedef struct _wsse__BinarySecurityToken { char* __item; @char* wsu__Id; @char* ValueType; @char* EncodingType; } _wsse__BinarySecurityToken; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":Reference of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":ReferenceType. /// @brief This element defines a security token reference /// Imported element _wsse__Reference from typemap WS/WS-typemap.dat. typedef struct _wsse__Reference { @char* URI; @char* ValueType; } _wsse__Reference; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":Embedded of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":EmbeddedType. /// @brief This element defines a security token embedded reference /// Imported element _wsse__Embedded from typemap WS/WS-typemap.dat. typedef struct _wsse__Embedded { /* Extensible with embedded tokens and assertions */ @char* wsu__Id; @char* ValueType; } _wsse__Embedded; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":KeyIdentifier of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":KeyIdentifierType. /// @brief This element defines a key identifier reference /// Imported element _wsse__KeyIdentifier from typemap WS/WS-typemap.dat. typedef struct _wsse__KeyIdentifier { char* __item; @char* wsu__Id; @char* ValueType; @char* EncodingType; } _wsse__KeyIdentifier; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityTokenReference of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityTokenReferenceType. /// @brief This element defines the wsse:SecurityTokenReference per Section 4.3. /// Imported element _wsse__SecurityTokenReference from typemap WS/WS-typemap.dat. typedef struct _wsse__SecurityTokenReference { struct _wsse__Reference* Reference; struct _wsse__KeyIdentifier* KeyIdentifier; struct _wsse__Embedded* Embedded; struct ds__X509DataType* ds__X509Data; @char* wsu__Id; @char* wsc__Instance; @char* Usage; } _wsse__SecurityTokenReference; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":Security of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityHeaderType. /// @brief This element defines the wsse:Security SOAP header element per Section 4. /// Imported element _wsse__Security from typemap WS/WS-typemap.dat. #import "xenc.h" #import "wsc.h" #import "saml1.h" // remove this line to disable SAML1 and reduce generated code size #import "saml2.h" // remove this line to disable SAML2 and reduce generated code size typedef struct _wsse__Security { struct _wsu__Timestamp* wsu__Timestamp; struct _wsse__UsernameToken* UsernameToken; struct _wsse__BinarySecurityToken* BinarySecurityToken; struct xenc__EncryptedKeyType* xenc__EncryptedKey; struct _xenc__ReferenceList* xenc__ReferenceList; struct wsc__SecurityContextTokenType* wsc__SecurityContextToken; struct ds__SignatureType* ds__Signature; struct saml1__AssertionType* saml1__Assertion; // remove this line to disable SAML1 and reduce generated code size struct saml2__AssertionType* saml2__Assertion; // remove this line to disable SAML2 and reduce generated code size @char* SOAP_ENV__actor; @char* SOAP_ENV__role; } _wsse__Security; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":TransformationParameters of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":TransformationParametersType. /// @brief This element contains properties for transformations from any namespace, including DSIG. /// '_wsse__TransformationParameters' element definition intentionally left blank. /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":Password of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":PasswordString. /// Imported element _wsse__Password from typemap WS/WS-typemap.dat. typedef struct _wsse__Password { char* __item; @char* Type; } _wsse__Password; /// Element "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":Nonce of complexType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":EncodedString. /// '_wsse__Nonce' element definition intentionally left blank. /// Attribute "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":Usage of simpleType "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":tUsage. /// @brief This global attribute is used to indicate the usage of a referenced or indicated token within the containing context /// '_wsse__Usage' attribute definition intentionally left blank. mutable struct SOAP_ENV__Header { mustUnderstand _wsse__Security *wsse__Security 0; }; /* End of wsse.h */ gsoap-2.8.91/gsoap/import/wstx.h0000644000175000017500000001410613525245161016073 0ustar ellertellert/* wstx.h WS-Trust definitions: SOAP Header definitions for WS-Trust 2005/12 WS-Trust operations Imported by import/wst.h gSOAP XML Web services tools Copyright (C) 2000-2015, 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. -------------------------------------------------------------------------------- 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-2015, 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 -------------------------------------------------------------------------------- */ mutable struct SOAP_ENV__Header { int __sizeIssuedTokens 0; ///< size of the array struct wst__RequestSecurityTokenResponseCollectionType *wst__IssuedTokens 0; ///< array of tokens char* wst__RequestType 0; }; //gsoap wst service name: wst //gsoap wst service method-header-part: RequestSecurityToken wsa5__MessageID //gsoap wst service method-header-part: RequestSecurityToken wsa5__RelatesTo //gsoap wst service method-header-part: RequestSecurityToken wsa5__From //gsoap wst service method-header-part: RequestSecurityToken wsa5__ReplyTo //gsoap wst service method-header-part: RequestSecurityToken wsa5__FaultTo //gsoap wst service method-header-part: RequestSecurityToken wsa5__To //gsoap wst service method-header-part: RequestSecurityToken wsa5__Action //gsoap wst service method-header-part: RequestSecurityToken wst__RequestType //gsoap wst service method-action: RequestSecurityToken http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/Issue //gsoap wst service method-output-action: RequestSecurityToken http://docs.oasis-open.org/ws-sx/ws-trust/200512/RSTR/Issue int __wst__RequestSecurityToken( struct wst__RequestSecurityTokenType *wst__RequestSecurityToken, ///< request message struct wst__RequestSecurityTokenResponseType *wst__RequestSecurityTokenResponse ///< response message ); //gsoap wst service method-header-part: RequestSecurityTokenResponse wsa5__MessageID //gsoap wst service method-header-part: RequestSecurityTokenResponse wsa5__RelatesTo //gsoap wst service method-header-part: RequestSecurityTokenResponse wsa5__From //gsoap wst service method-header-part: RequestSecurityTokenResponse wsa5__ReplyTo //gsoap wst service method-header-part: RequestSecurityTokenResponse wsa5__FaultTo //gsoap wst service method-header-part: RequestSecurityTokenResponse wsa5__To //gsoap wst service method-header-part: RequestSecurityTokenResponse wsa5__Action //gsoap wst service method-header-part: RequestSecurityTokenResponse wst__RequestType //gsoap wst service method-action: RequestSecurityTokenResponse http://docs.oasis-open.org/ws-sx/ws-trust/200512/RSTR/Issue //gsoap wst service method-output-action: RequestSecurityTokenCollection http://docs.oasis-open.org/ws-sx/ws-trust/200512/RSTRC/IssueFinal int __wst__RequestSecurityTokenResponse( struct wst__RequestSecurityTokenResponseType *wst__RequestSecurityTokenResponse, ///< request message struct wst__RequestSecurityTokenResponseCollectionType *wst__RequestSecurityTokenResponseCollection ///< response message ); //gsoap wst service method-header-part: RequestSecurityTokenCollection wsa5__MessageID //gsoap wst service method-header-part: RequestSecurityTokenCollection wsa5__RelatesTo //gsoap wst service method-header-part: RequestSecurityTokenCollection wsa5__From //gsoap wst service method-header-part: RequestSecurityTokenCollection wsa5__ReplyTo //gsoap wst service method-header-part: RequestSecurityTokenCollection wsa5__FaultTo //gsoap wst service method-header-part: RequestSecurityTokenCollection wsa5__To //gsoap wst service method-header-part: RequestSecurityTokenCollection wsa5__Action //gsoap wst service method-header-part: RequestSecurityTokenCollection wst__RequestType //gsoap wst service method-action: RequestSecurityTokenCollection http://docs.oasis-open.org/ws-sx/ws-trust/200512/RSTC/Issue //gsoap wst service method-output-action: RequestSecurityTokenCollection http://docs.oasis-open.org/ws-sx/ws-trust/200512/RSTRC/IssueFinal int __wst__RequestSecurityTokenCollection( struct wst__RequestSecurityTokenCollectionType *wst__RequestSecurityTokenCollection, ///< request message struct wst__RequestSecurityTokenResponseCollectionType *wst__RequestSecurityTokenResponseCollection ///< response message ); gsoap-2.8.91/gsoap/import/saml1.h0000644000175000017500000023173513525245161016114 0ustar ellertellert/* saml1.h Generated with: wsdl2h -cguyx -o saml1.h -t WS/WS-typemap.dat WS/oasis-sstc-saml-schema-assertion-1.1.xsd - Removed //gsoapopt - Changed //gsoap saml1 schema namespace directive to import directive - Replaced #import "ds.h" with #import "xenc.h" (that imports "ds.h") - Commented out duplicate saml1__SubjectConfirmation member (due to choice/seq) line 279 */ /******************************************************************************\ * * * Definitions * * urn:oasis:names:tc:SAML:1.0:assertion * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ #import "xenc.h" // xenc = /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ ///
/// Document identifier: oasis-sstc-saml-schema-assertion-1.1 /// Location: http://www.oasis-open.org/committees/documents.php?wg_abbrev=security /// Revision history: /// V1.0 (November, 2002): /// Initial standard schema. /// V1.1 (September, 2003): /// * Note that V1.1 of this schema has the same XML namespace as V1.0. /// Rebased ID content directly on XML Schema types /// Added DoNotCacheCondition element and DoNotCacheConditionType ///
#define SOAP_NAMESPACE_OF_saml1 "urn:oasis:names:tc:SAML:1.0:assertion" //gsoap saml1 schema import: urn:oasis:names:tc:SAML:1.0:assertion //gsoap saml1 schema form: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ // Imported element ""http://www.w3.org/2000/09/xmldsig#":KeyInfo" declared as _ds__KeyInfo. // Imported element ""http://www.w3.org/2000/09/xmldsig#":Signature" declared as _ds__Signature. /// @brief Typedef synonym for struct saml1__AssertionType. typedef struct saml1__AssertionType saml1__AssertionType; /// @brief Typedef synonym for struct saml1__ConditionsType. typedef struct saml1__ConditionsType saml1__ConditionsType; /// @brief Typedef synonym for struct saml1__ConditionAbstractType. typedef struct saml1__ConditionAbstractType saml1__ConditionAbstractType; /// @brief Typedef synonym for struct saml1__AudienceRestrictionConditionType. typedef struct saml1__AudienceRestrictionConditionType saml1__AudienceRestrictionConditionType; /// @brief Typedef synonym for struct saml1__DoNotCacheConditionType. typedef struct saml1__DoNotCacheConditionType saml1__DoNotCacheConditionType; /// @brief Typedef synonym for struct saml1__AdviceType. typedef struct saml1__AdviceType saml1__AdviceType; /// @brief Typedef synonym for struct saml1__StatementAbstractType. typedef struct saml1__StatementAbstractType saml1__StatementAbstractType; /// @brief Typedef synonym for struct saml1__SubjectStatementAbstractType. typedef struct saml1__SubjectStatementAbstractType saml1__SubjectStatementAbstractType; /// @brief Typedef synonym for struct saml1__SubjectType. typedef struct saml1__SubjectType saml1__SubjectType; /// @brief Typedef synonym for struct saml1__NameIdentifierType. typedef struct saml1__NameIdentifierType saml1__NameIdentifierType; /// @brief Typedef synonym for struct saml1__SubjectConfirmationType. typedef struct saml1__SubjectConfirmationType saml1__SubjectConfirmationType; /// @brief Typedef synonym for struct saml1__AuthenticationStatementType. typedef struct saml1__AuthenticationStatementType saml1__AuthenticationStatementType; /// @brief Typedef synonym for struct saml1__SubjectLocalityType. typedef struct saml1__SubjectLocalityType saml1__SubjectLocalityType; /// @brief Typedef synonym for struct saml1__AuthorityBindingType. typedef struct saml1__AuthorityBindingType saml1__AuthorityBindingType; /// @brief Typedef synonym for struct saml1__AuthorizationDecisionStatementType. typedef struct saml1__AuthorizationDecisionStatementType saml1__AuthorizationDecisionStatementType; /// @brief Typedef synonym for struct saml1__ActionType. typedef struct saml1__ActionType saml1__ActionType; /// @brief Typedef synonym for struct saml1__EvidenceType. typedef struct saml1__EvidenceType saml1__EvidenceType; /// @brief Typedef synonym for struct saml1__AttributeStatementType. typedef struct saml1__AttributeStatementType saml1__AttributeStatementType; /// @brief Typedef synonym for struct saml1__AttributeDesignatorType. typedef struct saml1__AttributeDesignatorType saml1__AttributeDesignatorType; /// @brief Typedef synonym for struct saml1__AttributeType. typedef struct saml1__AttributeType saml1__AttributeType; /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * urn:oasis:names:tc:SAML:1.0:assertion * * * \******************************************************************************/ /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":DecisionType is a simpleType restriction of XSD type xs:string. /// /// @note The enum values are prefixed with "saml1__DecisionType__" to prevent name clashes: use wsdl2h option -e to omit this prefix or use option -c++11 for scoped enumerations enum saml1__DecisionType { saml1__DecisionType__Permit, ///< xs:string value="Permit" saml1__DecisionType__Deny, ///< xs:string value="Deny" saml1__DecisionType__Indeterminate, ///< xs:string value="Indeterminate" }; /// @brief Typedef synonym for enum saml1__DecisionType. typedef enum saml1__DecisionType saml1__DecisionType; /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * urn:oasis:names:tc:SAML:1.0:assertion * * * \******************************************************************************/ /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":AssertionType is a complexType. /// /// struct saml1__AssertionType operations: /// - saml1__AssertionType* soap_new_saml1__AssertionType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_saml1__AssertionType(struct soap*, saml1__AssertionType*) default initialize members /// - int soap_read_saml1__AssertionType(struct soap*, saml1__AssertionType*) deserialize from a source /// - int soap_write_saml1__AssertionType(struct soap*, saml1__AssertionType*) serialize to a sink /// - saml1__AssertionType* soap_dup_saml1__AssertionType(struct soap*, saml1__AssertionType* dst, saml1__AssertionType *src) returns deep copy of saml1__AssertionType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_saml1__AssertionType(saml1__AssertionType*) deep deletes saml1__AssertionType data members, use only on dst after soap_dup_saml1__AssertionType(NULL, saml1__AssertionType *dst, saml1__AssertionType *src) (use soapcpp2 -Ed) struct saml1__AssertionType { /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":Conditions. struct saml1__ConditionsType* saml1__Conditions 0; ///< Optional element. /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":Advice. struct saml1__AdviceType* saml1__Advice 0; ///< Optional element. // BEGIN CHOICE $int __size_AssertionType 0; struct __saml1__union_AssertionType { /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":Statement. struct saml1__StatementAbstractType* saml1__Statement nullptr; ///< Required nillable (xsi:nil when NULL) element. /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":SubjectStatement. struct saml1__SubjectStatementAbstractType* saml1__SubjectStatement nullptr; ///< Required nillable (xsi:nil when NULL) element. /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":AuthenticationStatement. struct saml1__AuthenticationStatementType* saml1__AuthenticationStatement nullptr; ///< Required nillable (xsi:nil when NULL) element. /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":AuthorizationDecisionStatement. struct saml1__AuthorizationDecisionStatementType* saml1__AuthorizationDecisionStatement nullptr; ///< Required nillable (xsi:nil when NULL) element. /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":AttributeStatement. struct saml1__AttributeStatementType* saml1__AttributeStatement nullptr; ///< Required nillable (xsi:nil when NULL) element. } *__union_AssertionType ; // END OF CHOICE /// Imported element reference "http://www.w3.org/2000/09/xmldsig#":Signature. _ds__Signature* ds__Signature 0; ///< Optional element. /// Attribute "MajorVersion" of XSD type xs:integer. @char* MajorVersion 1; ///< Required attribute. /// Attribute "MinorVersion" of XSD type xs:integer. @char* MinorVersion 1; ///< Required attribute. /// Attribute "AssertionID" of XSD type xs:ID. @char* AssertionID 1; ///< Required attribute. /// Attribute "Issuer" of XSD type xs:string. @char* Issuer 1; ///< Required attribute. /// Attribute "IssueInstant" of XSD type xs:dateTime. @time_t IssueInstant 1; ///< Required attribute. /// Member declared in WS/WS-typemap.dat @char* wsu__Id 0; ///< Optional attribute. }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":ConditionsType is a complexType. /// /// struct saml1__ConditionsType operations: /// - saml1__ConditionsType* soap_new_saml1__ConditionsType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_saml1__ConditionsType(struct soap*, saml1__ConditionsType*) default initialize members /// - int soap_read_saml1__ConditionsType(struct soap*, saml1__ConditionsType*) deserialize from a source /// - int soap_write_saml1__ConditionsType(struct soap*, saml1__ConditionsType*) serialize to a sink /// - saml1__ConditionsType* soap_dup_saml1__ConditionsType(struct soap*, saml1__ConditionsType* dst, saml1__ConditionsType *src) returns deep copy of saml1__ConditionsType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_saml1__ConditionsType(saml1__ConditionsType*) deep deletes saml1__ConditionsType data members, use only on dst after soap_dup_saml1__ConditionsType(NULL, saml1__ConditionsType *dst, saml1__ConditionsType *src) (use soapcpp2 -Ed) struct saml1__ConditionsType { // BEGIN CHOICE $int __size_ConditionsType 0; struct __saml1__union_ConditionsType { /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":AudienceRestrictionCondition. struct saml1__AudienceRestrictionConditionType* saml1__AudienceRestrictionCondition nullptr; ///< Required nillable (xsi:nil when NULL) element. /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":DoNotCacheCondition. struct saml1__DoNotCacheConditionType* saml1__DoNotCacheCondition nullptr; ///< Required nillable (xsi:nil when NULL) element. /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":Condition. struct saml1__ConditionAbstractType* saml1__Condition nullptr; ///< Required nillable (xsi:nil when NULL) element. } *__union_ConditionsType ; // END OF CHOICE /// Attribute "NotBefore" of XSD type xs:dateTime. @time_t* NotBefore 0; ///< Optional attribute. /// Attribute "NotOnOrAfter" of XSD type xs:dateTime. @time_t* NotOnOrAfter 0; ///< Optional attribute. }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":ConditionAbstractType is an abstract complexType. /// /// struct saml1__ConditionAbstractType operations: /// - saml1__ConditionAbstractType* soap_new_saml1__ConditionAbstractType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_saml1__ConditionAbstractType(struct soap*, saml1__ConditionAbstractType*) default initialize members /// - int soap_read_saml1__ConditionAbstractType(struct soap*, saml1__ConditionAbstractType*) deserialize from a source /// - int soap_write_saml1__ConditionAbstractType(struct soap*, saml1__ConditionAbstractType*) serialize to a sink /// - saml1__ConditionAbstractType* soap_dup_saml1__ConditionAbstractType(struct soap*, saml1__ConditionAbstractType* dst, saml1__ConditionAbstractType *src) returns deep copy of saml1__ConditionAbstractType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_saml1__ConditionAbstractType(saml1__ConditionAbstractType*) deep deletes saml1__ConditionAbstractType data members, use only on dst after soap_dup_saml1__ConditionAbstractType(NULL, saml1__ConditionAbstractType *dst, saml1__ConditionAbstractType *src) (use soapcpp2 -Ed) struct saml1__ConditionAbstractType { }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":AdviceType is a complexType. /// /// struct saml1__AdviceType operations: /// - saml1__AdviceType* soap_new_saml1__AdviceType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_saml1__AdviceType(struct soap*, saml1__AdviceType*) default initialize members /// - int soap_read_saml1__AdviceType(struct soap*, saml1__AdviceType*) deserialize from a source /// - int soap_write_saml1__AdviceType(struct soap*, saml1__AdviceType*) serialize to a sink /// - saml1__AdviceType* soap_dup_saml1__AdviceType(struct soap*, saml1__AdviceType* dst, saml1__AdviceType *src) returns deep copy of saml1__AdviceType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_saml1__AdviceType(saml1__AdviceType*) deep deletes saml1__AdviceType data members, use only on dst after soap_dup_saml1__AdviceType(NULL, saml1__AdviceType *dst, saml1__AdviceType *src) (use soapcpp2 -Ed) struct saml1__AdviceType { // BEGIN CHOICE $int __size_AdviceType 0; struct __saml1__union_AdviceType { /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":AssertionIDReference. char* saml1__AssertionIDReference nullptr; ///< Required nillable (xsi:nil when NULL) element. /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":Assertion. struct saml1__AssertionType* saml1__Assertion nullptr; ///< Required nillable (xsi:nil when NULL) element. /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element): /// wsdl2h maps xsd:any to xsd__anyType, use typemap.dat to remap. } *__union_AdviceType ; // END OF CHOICE }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":StatementAbstractType is an abstract complexType. /// /// struct saml1__StatementAbstractType operations: /// - saml1__StatementAbstractType* soap_new_saml1__StatementAbstractType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_saml1__StatementAbstractType(struct soap*, saml1__StatementAbstractType*) default initialize members /// - int soap_read_saml1__StatementAbstractType(struct soap*, saml1__StatementAbstractType*) deserialize from a source /// - int soap_write_saml1__StatementAbstractType(struct soap*, saml1__StatementAbstractType*) serialize to a sink /// - saml1__StatementAbstractType* soap_dup_saml1__StatementAbstractType(struct soap*, saml1__StatementAbstractType* dst, saml1__StatementAbstractType *src) returns deep copy of saml1__StatementAbstractType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_saml1__StatementAbstractType(saml1__StatementAbstractType*) deep deletes saml1__StatementAbstractType data members, use only on dst after soap_dup_saml1__StatementAbstractType(NULL, saml1__StatementAbstractType *dst, saml1__StatementAbstractType *src) (use soapcpp2 -Ed) struct saml1__StatementAbstractType { }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":SubjectType is a complexType. /// /// struct saml1__SubjectType operations: /// - saml1__SubjectType* soap_new_saml1__SubjectType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_saml1__SubjectType(struct soap*, saml1__SubjectType*) default initialize members /// - int soap_read_saml1__SubjectType(struct soap*, saml1__SubjectType*) deserialize from a source /// - int soap_write_saml1__SubjectType(struct soap*, saml1__SubjectType*) serialize to a sink /// - saml1__SubjectType* soap_dup_saml1__SubjectType(struct soap*, saml1__SubjectType* dst, saml1__SubjectType *src) returns deep copy of saml1__SubjectType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_saml1__SubjectType(saml1__SubjectType*) deep deletes saml1__SubjectType data members, use only on dst after soap_dup_saml1__SubjectType(NULL, saml1__SubjectType *dst, saml1__SubjectType *src) (use soapcpp2 -Ed) struct saml1__SubjectType { // BEGIN CHOICE // BEGIN SEQUENCE /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":NameIdentifier. struct saml1__NameIdentifierType* saml1__NameIdentifier nullptr; ///< Required nillable (xsi:nil when NULL) element. /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":SubjectConfirmation. struct saml1__SubjectConfirmationType* saml1__SubjectConfirmation ; // END OF SEQUENCE /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":SubjectConfirmation. // struct saml1__SubjectConfirmationType* saml1__SubjectConfirmation nullptr; ///< Required nillable (xsi:nil when NULL) element. // END OF CHOICE }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":SubjectConfirmationType is a complexType. /// /// struct saml1__SubjectConfirmationType operations: /// - saml1__SubjectConfirmationType* soap_new_saml1__SubjectConfirmationType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_saml1__SubjectConfirmationType(struct soap*, saml1__SubjectConfirmationType*) default initialize members /// - int soap_read_saml1__SubjectConfirmationType(struct soap*, saml1__SubjectConfirmationType*) deserialize from a source /// - int soap_write_saml1__SubjectConfirmationType(struct soap*, saml1__SubjectConfirmationType*) serialize to a sink /// - saml1__SubjectConfirmationType* soap_dup_saml1__SubjectConfirmationType(struct soap*, saml1__SubjectConfirmationType* dst, saml1__SubjectConfirmationType *src) returns deep copy of saml1__SubjectConfirmationType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_saml1__SubjectConfirmationType(saml1__SubjectConfirmationType*) deep deletes saml1__SubjectConfirmationType data members, use only on dst after soap_dup_saml1__SubjectConfirmationType(NULL, saml1__SubjectConfirmationType *dst, saml1__SubjectConfirmationType *src) (use soapcpp2 -Ed) struct saml1__SubjectConfirmationType { /// Size of the dynamic array of char* * is 1..unbounded. $int __sizeConfirmationMethod 1; /// Array char* * of size 1..unbounded. char* * saml1__ConfirmationMethod 1; /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":SubjectConfirmationData. _XML saml1__SubjectConfirmationData 0; ///< Optional element. /// Imported element reference "http://www.w3.org/2000/09/xmldsig#":KeyInfo. _ds__KeyInfo* ds__KeyInfo 0; ///< Optional element. }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":SubjectLocalityType is a complexType. /// /// struct saml1__SubjectLocalityType operations: /// - saml1__SubjectLocalityType* soap_new_saml1__SubjectLocalityType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_saml1__SubjectLocalityType(struct soap*, saml1__SubjectLocalityType*) default initialize members /// - int soap_read_saml1__SubjectLocalityType(struct soap*, saml1__SubjectLocalityType*) deserialize from a source /// - int soap_write_saml1__SubjectLocalityType(struct soap*, saml1__SubjectLocalityType*) serialize to a sink /// - saml1__SubjectLocalityType* soap_dup_saml1__SubjectLocalityType(struct soap*, saml1__SubjectLocalityType* dst, saml1__SubjectLocalityType *src) returns deep copy of saml1__SubjectLocalityType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_saml1__SubjectLocalityType(saml1__SubjectLocalityType*) deep deletes saml1__SubjectLocalityType data members, use only on dst after soap_dup_saml1__SubjectLocalityType(NULL, saml1__SubjectLocalityType *dst, saml1__SubjectLocalityType *src) (use soapcpp2 -Ed) struct saml1__SubjectLocalityType { /// Attribute "IPAddress" of XSD type xs:string. @char* IPAddress 0; ///< Optional attribute. /// Attribute "DNSAddress" of XSD type xs:string. @char* DNSAddress 0; ///< Optional attribute. }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":AuthorityBindingType is a complexType. /// /// struct saml1__AuthorityBindingType operations: /// - saml1__AuthorityBindingType* soap_new_saml1__AuthorityBindingType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_saml1__AuthorityBindingType(struct soap*, saml1__AuthorityBindingType*) default initialize members /// - int soap_read_saml1__AuthorityBindingType(struct soap*, saml1__AuthorityBindingType*) deserialize from a source /// - int soap_write_saml1__AuthorityBindingType(struct soap*, saml1__AuthorityBindingType*) serialize to a sink /// - saml1__AuthorityBindingType* soap_dup_saml1__AuthorityBindingType(struct soap*, saml1__AuthorityBindingType* dst, saml1__AuthorityBindingType *src) returns deep copy of saml1__AuthorityBindingType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_saml1__AuthorityBindingType(saml1__AuthorityBindingType*) deep deletes saml1__AuthorityBindingType data members, use only on dst after soap_dup_saml1__AuthorityBindingType(NULL, saml1__AuthorityBindingType *dst, saml1__AuthorityBindingType *src) (use soapcpp2 -Ed) struct saml1__AuthorityBindingType { /// Attribute "AuthorityKind" of XSD type xs:QName. @_QName AuthorityKind 1; ///< Required attribute. /// Attribute "Location" of XSD type xs:anyURI. @char* Location 1; ///< Required attribute. /// Attribute "Binding" of XSD type xs:anyURI. @char* Binding 1; ///< Required attribute. }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":EvidenceType is a complexType. /// /// struct saml1__EvidenceType operations: /// - saml1__EvidenceType* soap_new_saml1__EvidenceType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_saml1__EvidenceType(struct soap*, saml1__EvidenceType*) default initialize members /// - int soap_read_saml1__EvidenceType(struct soap*, saml1__EvidenceType*) deserialize from a source /// - int soap_write_saml1__EvidenceType(struct soap*, saml1__EvidenceType*) serialize to a sink /// - saml1__EvidenceType* soap_dup_saml1__EvidenceType(struct soap*, saml1__EvidenceType* dst, saml1__EvidenceType *src) returns deep copy of saml1__EvidenceType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_saml1__EvidenceType(saml1__EvidenceType*) deep deletes saml1__EvidenceType data members, use only on dst after soap_dup_saml1__EvidenceType(NULL, saml1__EvidenceType *dst, saml1__EvidenceType *src) (use soapcpp2 -Ed) struct saml1__EvidenceType { // BEGIN CHOICE $int __size_EvidenceType 0; struct __saml1__union_EvidenceType { /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":AssertionIDReference. char* saml1__AssertionIDReference nullptr; ///< Required nillable (xsi:nil when NULL) element. /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":Assertion. struct saml1__AssertionType* saml1__Assertion nullptr; ///< Required nillable (xsi:nil when NULL) element. } *__union_EvidenceType ; // END OF CHOICE }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":AttributeDesignatorType is a complexType. /// /// struct saml1__AttributeDesignatorType operations: /// - saml1__AttributeDesignatorType* soap_new_saml1__AttributeDesignatorType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_saml1__AttributeDesignatorType(struct soap*, saml1__AttributeDesignatorType*) default initialize members /// - int soap_read_saml1__AttributeDesignatorType(struct soap*, saml1__AttributeDesignatorType*) deserialize from a source /// - int soap_write_saml1__AttributeDesignatorType(struct soap*, saml1__AttributeDesignatorType*) serialize to a sink /// - saml1__AttributeDesignatorType* soap_dup_saml1__AttributeDesignatorType(struct soap*, saml1__AttributeDesignatorType* dst, saml1__AttributeDesignatorType *src) returns deep copy of saml1__AttributeDesignatorType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_saml1__AttributeDesignatorType(saml1__AttributeDesignatorType*) deep deletes saml1__AttributeDesignatorType data members, use only on dst after soap_dup_saml1__AttributeDesignatorType(NULL, saml1__AttributeDesignatorType *dst, saml1__AttributeDesignatorType *src) (use soapcpp2 -Ed) struct saml1__AttributeDesignatorType { /// Attribute "AttributeName" of XSD type xs:string. @char* AttributeName 1; ///< Required attribute. /// Attribute "AttributeNamespace" of XSD type xs:anyURI. @char* AttributeNamespace 1; ///< Required attribute. }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":AudienceRestrictionConditionType is a complexType with complexContent extension of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":ConditionAbstractType. /// /// struct saml1__AudienceRestrictionConditionType operations: /// - saml1__AudienceRestrictionConditionType* soap_new_saml1__AudienceRestrictionConditionType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_saml1__AudienceRestrictionConditionType(struct soap*, saml1__AudienceRestrictionConditionType*) default initialize members /// - int soap_read_saml1__AudienceRestrictionConditionType(struct soap*, saml1__AudienceRestrictionConditionType*) deserialize from a source /// - int soap_write_saml1__AudienceRestrictionConditionType(struct soap*, saml1__AudienceRestrictionConditionType*) serialize to a sink /// - saml1__AudienceRestrictionConditionType* soap_dup_saml1__AudienceRestrictionConditionType(struct soap*, saml1__AudienceRestrictionConditionType* dst, saml1__AudienceRestrictionConditionType *src) returns deep copy of saml1__AudienceRestrictionConditionType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_saml1__AudienceRestrictionConditionType(saml1__AudienceRestrictionConditionType*) deep deletes saml1__AudienceRestrictionConditionType data members, use only on dst after soap_dup_saml1__AudienceRestrictionConditionType(NULL, saml1__AudienceRestrictionConditionType *dst, saml1__AudienceRestrictionConditionType *src) (use soapcpp2 -Ed) struct saml1__AudienceRestrictionConditionType { /// INHERITED FROM saml1__ConditionAbstractType: // END OF INHERITED FROM saml1__ConditionAbstractType /// Size of the dynamic array of char* * is 1..unbounded. $int __sizeAudience 1; /// Array char* * of size 1..unbounded. char* * saml1__Audience 1; }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":DoNotCacheConditionType is a complexType with complexContent extension of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":ConditionAbstractType. /// /// struct saml1__DoNotCacheConditionType operations: /// - saml1__DoNotCacheConditionType* soap_new_saml1__DoNotCacheConditionType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_saml1__DoNotCacheConditionType(struct soap*, saml1__DoNotCacheConditionType*) default initialize members /// - int soap_read_saml1__DoNotCacheConditionType(struct soap*, saml1__DoNotCacheConditionType*) deserialize from a source /// - int soap_write_saml1__DoNotCacheConditionType(struct soap*, saml1__DoNotCacheConditionType*) serialize to a sink /// - saml1__DoNotCacheConditionType* soap_dup_saml1__DoNotCacheConditionType(struct soap*, saml1__DoNotCacheConditionType* dst, saml1__DoNotCacheConditionType *src) returns deep copy of saml1__DoNotCacheConditionType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_saml1__DoNotCacheConditionType(saml1__DoNotCacheConditionType*) deep deletes saml1__DoNotCacheConditionType data members, use only on dst after soap_dup_saml1__DoNotCacheConditionType(NULL, saml1__DoNotCacheConditionType *dst, saml1__DoNotCacheConditionType *src) (use soapcpp2 -Ed) struct saml1__DoNotCacheConditionType { /// INHERITED FROM saml1__ConditionAbstractType: // END OF INHERITED FROM saml1__ConditionAbstractType }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":SubjectStatementAbstractType is an abstract complexType with complexContent extension of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":StatementAbstractType. /// /// struct saml1__SubjectStatementAbstractType operations: /// - saml1__SubjectStatementAbstractType* soap_new_saml1__SubjectStatementAbstractType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_saml1__SubjectStatementAbstractType(struct soap*, saml1__SubjectStatementAbstractType*) default initialize members /// - int soap_read_saml1__SubjectStatementAbstractType(struct soap*, saml1__SubjectStatementAbstractType*) deserialize from a source /// - int soap_write_saml1__SubjectStatementAbstractType(struct soap*, saml1__SubjectStatementAbstractType*) serialize to a sink /// - saml1__SubjectStatementAbstractType* soap_dup_saml1__SubjectStatementAbstractType(struct soap*, saml1__SubjectStatementAbstractType* dst, saml1__SubjectStatementAbstractType *src) returns deep copy of saml1__SubjectStatementAbstractType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_saml1__SubjectStatementAbstractType(saml1__SubjectStatementAbstractType*) deep deletes saml1__SubjectStatementAbstractType data members, use only on dst after soap_dup_saml1__SubjectStatementAbstractType(NULL, saml1__SubjectStatementAbstractType *dst, saml1__SubjectStatementAbstractType *src) (use soapcpp2 -Ed) struct saml1__SubjectStatementAbstractType { /// INHERITED FROM saml1__StatementAbstractType: // END OF INHERITED FROM saml1__StatementAbstractType /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":Subject. struct saml1__SubjectType* saml1__Subject 1; ///< Required element. }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":NameIdentifierType is a complexType with simpleContent. /// /// struct saml1__NameIdentifierType operations: /// - saml1__NameIdentifierType* soap_new_saml1__NameIdentifierType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_saml1__NameIdentifierType(struct soap*, saml1__NameIdentifierType*) default initialize members /// - int soap_read_saml1__NameIdentifierType(struct soap*, saml1__NameIdentifierType*) deserialize from a source /// - int soap_write_saml1__NameIdentifierType(struct soap*, saml1__NameIdentifierType*) serialize to a sink /// - saml1__NameIdentifierType* soap_dup_saml1__NameIdentifierType(struct soap*, saml1__NameIdentifierType* dst, saml1__NameIdentifierType *src) returns deep copy of saml1__NameIdentifierType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_saml1__NameIdentifierType(saml1__NameIdentifierType*) deep deletes saml1__NameIdentifierType data members, use only on dst after soap_dup_saml1__NameIdentifierType(NULL, saml1__NameIdentifierType *dst, saml1__NameIdentifierType *src) (use soapcpp2 -Ed) struct saml1__NameIdentifierType { /// __item wraps "xs:string" simpleContent. char* __item ; /// Attribute "NameQualifier" of XSD type xs:string. @char* NameQualifier 0; ///< Optional attribute. /// Attribute "Format" of XSD type xs:anyURI. @char* Format 0; ///< Optional attribute. }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":ActionType is a complexType with simpleContent. /// /// struct saml1__ActionType operations: /// - saml1__ActionType* soap_new_saml1__ActionType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_saml1__ActionType(struct soap*, saml1__ActionType*) default initialize members /// - int soap_read_saml1__ActionType(struct soap*, saml1__ActionType*) deserialize from a source /// - int soap_write_saml1__ActionType(struct soap*, saml1__ActionType*) serialize to a sink /// - saml1__ActionType* soap_dup_saml1__ActionType(struct soap*, saml1__ActionType* dst, saml1__ActionType *src) returns deep copy of saml1__ActionType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_saml1__ActionType(saml1__ActionType*) deep deletes saml1__ActionType data members, use only on dst after soap_dup_saml1__ActionType(NULL, saml1__ActionType *dst, saml1__ActionType *src) (use soapcpp2 -Ed) struct saml1__ActionType { /// __item wraps "xs:string" simpleContent. char* __item ; /// Attribute "Namespace" of XSD type xs:anyURI. @char* Namespace 0; ///< Optional attribute. }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":AttributeType is a complexType with complexContent extension of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":AttributeDesignatorType. /// /// struct saml1__AttributeType operations: /// - saml1__AttributeType* soap_new_saml1__AttributeType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_saml1__AttributeType(struct soap*, saml1__AttributeType*) default initialize members /// - int soap_read_saml1__AttributeType(struct soap*, saml1__AttributeType*) deserialize from a source /// - int soap_write_saml1__AttributeType(struct soap*, saml1__AttributeType*) serialize to a sink /// - saml1__AttributeType* soap_dup_saml1__AttributeType(struct soap*, saml1__AttributeType* dst, saml1__AttributeType *src) returns deep copy of saml1__AttributeType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_saml1__AttributeType(saml1__AttributeType*) deep deletes saml1__AttributeType data members, use only on dst after soap_dup_saml1__AttributeType(NULL, saml1__AttributeType *dst, saml1__AttributeType *src) (use soapcpp2 -Ed) struct saml1__AttributeType { /// INHERITED FROM saml1__AttributeDesignatorType: /// Attribute "AttributeName" of XSD type xs:string. @char* AttributeName 1; ///< Required attribute. /// Attribute "AttributeNamespace" of XSD type xs:anyURI. @char* AttributeNamespace 1; ///< Required attribute. // END OF INHERITED FROM saml1__AttributeDesignatorType /// Size of the dynamic array of _XML* is 1..unbounded. $int __sizeAttributeValue 1; /// Array _XML* of size 1..unbounded. _XML* saml1__AttributeValue 1; }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":AuthenticationStatementType is a complexType with complexContent extension of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":SubjectStatementAbstractType. /// /// struct saml1__AuthenticationStatementType operations: /// - saml1__AuthenticationStatementType* soap_new_saml1__AuthenticationStatementType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_saml1__AuthenticationStatementType(struct soap*, saml1__AuthenticationStatementType*) default initialize members /// - int soap_read_saml1__AuthenticationStatementType(struct soap*, saml1__AuthenticationStatementType*) deserialize from a source /// - int soap_write_saml1__AuthenticationStatementType(struct soap*, saml1__AuthenticationStatementType*) serialize to a sink /// - saml1__AuthenticationStatementType* soap_dup_saml1__AuthenticationStatementType(struct soap*, saml1__AuthenticationStatementType* dst, saml1__AuthenticationStatementType *src) returns deep copy of saml1__AuthenticationStatementType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_saml1__AuthenticationStatementType(saml1__AuthenticationStatementType*) deep deletes saml1__AuthenticationStatementType data members, use only on dst after soap_dup_saml1__AuthenticationStatementType(NULL, saml1__AuthenticationStatementType *dst, saml1__AuthenticationStatementType *src) (use soapcpp2 -Ed) struct saml1__AuthenticationStatementType { /// INHERITED FROM saml1__StatementAbstractType: // END OF INHERITED FROM saml1__StatementAbstractType /// INHERITED FROM saml1__SubjectStatementAbstractType: /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":Subject. struct saml1__SubjectType* saml1__Subject 1; ///< Required element. // END OF INHERITED FROM saml1__SubjectStatementAbstractType /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":SubjectLocality. struct saml1__SubjectLocalityType* saml1__SubjectLocality 0; ///< Optional element. /// Size of the dynamic array of struct saml1__AuthorityBindingType* is 0..unbounded. $int __sizeAuthorityBinding 0; /// Array struct saml1__AuthorityBindingType* of size 0..unbounded. struct saml1__AuthorityBindingType* saml1__AuthorityBinding 0; /// Attribute "AuthenticationMethod" of XSD type xs:anyURI. @char* AuthenticationMethod 1; ///< Required attribute. /// Attribute "AuthenticationInstant" of XSD type xs:dateTime. @time_t AuthenticationInstant 1; ///< Required attribute. }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":AuthorizationDecisionStatementType is a complexType with complexContent extension of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":SubjectStatementAbstractType. /// /// struct saml1__AuthorizationDecisionStatementType operations: /// - saml1__AuthorizationDecisionStatementType* soap_new_saml1__AuthorizationDecisionStatementType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_saml1__AuthorizationDecisionStatementType(struct soap*, saml1__AuthorizationDecisionStatementType*) default initialize members /// - int soap_read_saml1__AuthorizationDecisionStatementType(struct soap*, saml1__AuthorizationDecisionStatementType*) deserialize from a source /// - int soap_write_saml1__AuthorizationDecisionStatementType(struct soap*, saml1__AuthorizationDecisionStatementType*) serialize to a sink /// - saml1__AuthorizationDecisionStatementType* soap_dup_saml1__AuthorizationDecisionStatementType(struct soap*, saml1__AuthorizationDecisionStatementType* dst, saml1__AuthorizationDecisionStatementType *src) returns deep copy of saml1__AuthorizationDecisionStatementType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_saml1__AuthorizationDecisionStatementType(saml1__AuthorizationDecisionStatementType*) deep deletes saml1__AuthorizationDecisionStatementType data members, use only on dst after soap_dup_saml1__AuthorizationDecisionStatementType(NULL, saml1__AuthorizationDecisionStatementType *dst, saml1__AuthorizationDecisionStatementType *src) (use soapcpp2 -Ed) struct saml1__AuthorizationDecisionStatementType { /// INHERITED FROM saml1__StatementAbstractType: // END OF INHERITED FROM saml1__StatementAbstractType /// INHERITED FROM saml1__SubjectStatementAbstractType: /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":Subject. struct saml1__SubjectType* saml1__Subject 1; ///< Required element. // END OF INHERITED FROM saml1__SubjectStatementAbstractType /// Size of the dynamic array of struct saml1__ActionType* is 1..unbounded. $int __sizeAction 1; /// Array struct saml1__ActionType* of size 1..unbounded. struct saml1__ActionType* saml1__Action 1; /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":Evidence. struct saml1__EvidenceType* saml1__Evidence 0; ///< Optional element. /// Attribute "Resource" of XSD type xs:anyURI. @char* Resource 1; ///< Required attribute. /// Attribute "Decision" of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":DecisionType. @enum saml1__DecisionType Decision 1; ///< Required attribute. }; /// @brief "urn:oasis:names:tc:SAML:1.0:assertion":AttributeStatementType is a complexType with complexContent extension of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":SubjectStatementAbstractType. /// /// struct saml1__AttributeStatementType operations: /// - saml1__AttributeStatementType* soap_new_saml1__AttributeStatementType(struct soap*, int num) allocate and default initialize one or more values (array) /// - soap_default_saml1__AttributeStatementType(struct soap*, saml1__AttributeStatementType*) default initialize members /// - int soap_read_saml1__AttributeStatementType(struct soap*, saml1__AttributeStatementType*) deserialize from a source /// - int soap_write_saml1__AttributeStatementType(struct soap*, saml1__AttributeStatementType*) serialize to a sink /// - saml1__AttributeStatementType* soap_dup_saml1__AttributeStatementType(struct soap*, saml1__AttributeStatementType* dst, saml1__AttributeStatementType *src) returns deep copy of saml1__AttributeStatementType src into dst, copies the (cyclic) graph structure when a context is provided, or (cycle-pruned) tree structure with soap_set_mode(soap, SOAP_XML_TREE) (use soapcpp2 -Ec) /// - soap_del_saml1__AttributeStatementType(saml1__AttributeStatementType*) deep deletes saml1__AttributeStatementType data members, use only on dst after soap_dup_saml1__AttributeStatementType(NULL, saml1__AttributeStatementType *dst, saml1__AttributeStatementType *src) (use soapcpp2 -Ed) struct saml1__AttributeStatementType { /// INHERITED FROM saml1__StatementAbstractType: // END OF INHERITED FROM saml1__StatementAbstractType /// INHERITED FROM saml1__SubjectStatementAbstractType: /// Element reference "urn:oasis:names:tc:SAML:1.0:assertion:""urn:oasis:names:tc:SAML:1.0:assertion":Subject. struct saml1__SubjectType* saml1__Subject 1; ///< Required element. // END OF INHERITED FROM saml1__SubjectStatementAbstractType /// Size of the dynamic array of struct saml1__AttributeType* is 1..unbounded. $int __sizeAttribute 1; /// Array struct saml1__AttributeType* of size 1..unbounded. struct saml1__AttributeType* saml1__Attribute 1; }; /******************************************************************************\ * * * Additional Top-Level Elements * * urn:oasis:names:tc:SAML:1.0:assertion * * * \******************************************************************************/ /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":AssertionIDReference of XSD type xs:NCName. typedef char* _saml1__AssertionIDReference; /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":Assertion of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":AssertionType. typedef struct saml1__AssertionType _saml1__Assertion; /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":Conditions of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":ConditionsType. typedef struct saml1__ConditionsType _saml1__Conditions; /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":Condition of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":ConditionAbstractType. typedef struct saml1__ConditionAbstractType _saml1__Condition; /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":AudienceRestrictionCondition of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":AudienceRestrictionConditionType. typedef struct saml1__AudienceRestrictionConditionType _saml1__AudienceRestrictionCondition; /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":Audience of XSD type xs:anyURI. typedef char* _saml1__Audience; /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":DoNotCacheCondition of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":DoNotCacheConditionType. typedef struct saml1__DoNotCacheConditionType _saml1__DoNotCacheCondition; /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":Advice of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":AdviceType. typedef struct saml1__AdviceType _saml1__Advice; /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":Statement of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":StatementAbstractType. typedef struct saml1__StatementAbstractType _saml1__Statement; /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":SubjectStatement of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":SubjectStatementAbstractType. typedef struct saml1__SubjectStatementAbstractType _saml1__SubjectStatement; /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":Subject of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":SubjectType. typedef struct saml1__SubjectType _saml1__Subject; /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":NameIdentifier of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":NameIdentifierType. typedef struct saml1__NameIdentifierType _saml1__NameIdentifier; /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":SubjectConfirmation of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":SubjectConfirmationType. typedef struct saml1__SubjectConfirmationType _saml1__SubjectConfirmation; /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":SubjectConfirmationData of XSD type xs:anyType. typedef _XML _saml1__SubjectConfirmationData; /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":ConfirmationMethod of XSD type xs:anyURI. typedef char* _saml1__ConfirmationMethod; /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":AuthenticationStatement of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":AuthenticationStatementType. typedef struct saml1__AuthenticationStatementType _saml1__AuthenticationStatement; /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":SubjectLocality of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":SubjectLocalityType. typedef struct saml1__SubjectLocalityType _saml1__SubjectLocality; /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":AuthorityBinding of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":AuthorityBindingType. typedef struct saml1__AuthorityBindingType _saml1__AuthorityBinding; /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":AuthorizationDecisionStatement of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":AuthorizationDecisionStatementType. typedef struct saml1__AuthorizationDecisionStatementType _saml1__AuthorizationDecisionStatement; /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":Action of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":ActionType. typedef struct saml1__ActionType _saml1__Action; /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":Evidence of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":EvidenceType. typedef struct saml1__EvidenceType _saml1__Evidence; /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":AttributeStatement of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":AttributeStatementType. typedef struct saml1__AttributeStatementType _saml1__AttributeStatement; /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":AttributeDesignator of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":AttributeDesignatorType. typedef struct saml1__AttributeDesignatorType _saml1__AttributeDesignator; /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":Attribute of XSD type "urn:oasis:names:tc:SAML:1.0:assertion":AttributeType. typedef struct saml1__AttributeType _saml1__Attribute; /// @brief Top-level root element "urn:oasis:names:tc:SAML:1.0:assertion":AttributeValue of XSD type xs:anyType. typedef _XML _saml1__AttributeValue; /******************************************************************************\ * * * Additional Top-Level Attributes * * urn:oasis:names:tc:SAML:1.0:assertion * * * \******************************************************************************/ /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. Data can be read and deserialized from: - an int file descriptor, using soap->recvfd = fd - a socket, using soap->socket = (int)... - a C++ stream (istream, stringstream), using soap->is = (istream*)... - a C string, using soap->is = (const char*)... - any input, using the soap->frecv() callback Data can be serialized and written to: - an int file descriptor, using soap->sendfd = (int)... - a socket, using soap->socket = (int)... - a C++ stream (ostream, stringstream), using soap->os = (ostream*)... - a C string, using soap->os = (const char**)... - any output, using the soap->fsend() callback The following options are available for (de)serialization control: - soap->encodingStyle = NULL; to remove SOAP 1.1/1.2 encodingStyle - soap_mode(soap, SOAP_XML_TREE); XML without id-ref (no cycles!) - soap_mode(soap, SOAP_XML_GRAPH); XML with id-ref (including cycles) - soap_set_namespaces(soap, struct Namespace *nsmap); to set xmlns bindings @section saml1 Top-level root elements of schema "urn:oasis:names:tc:SAML:1.0:assertion" - @ref _saml1__AssertionIDReference @code // Reader (returns SOAP_OK on success): soap_read__saml1__AssertionIDReference(struct soap*, _saml1__AssertionIDReference*); // Writer (returns SOAP_OK on success): soap_write__saml1__AssertionIDReference(struct soap*, _saml1__AssertionIDReference*); // REST GET (returns SOAP_OK on success): soap_GET__saml1__AssertionIDReference(struct soap*, const char *URL, _saml1__AssertionIDReference*); // REST PUT (returns SOAP_OK on success): soap_PUT__saml1__AssertionIDReference(struct soap*, const char *URL, _saml1__AssertionIDReference*); // REST POST (returns SOAP_OK on success): soap_POST_send__saml1__AssertionIDReference(struct soap*, const char *URL, _saml1__AssertionIDReference*); soap_POST_recv__saml1__AssertionIDReference(struct soap*, _saml1__AssertionIDReference*); @endcode - @ref _saml1__Assertion @code // Reader (returns SOAP_OK on success): soap_read__saml1__Assertion(struct soap*, _saml1__Assertion*); // Writer (returns SOAP_OK on success): soap_write__saml1__Assertion(struct soap*, _saml1__Assertion*); // REST GET (returns SOAP_OK on success): soap_GET__saml1__Assertion(struct soap*, const char *URL, _saml1__Assertion*); // REST PUT (returns SOAP_OK on success): soap_PUT__saml1__Assertion(struct soap*, const char *URL, _saml1__Assertion*); // REST POST (returns SOAP_OK on success): soap_POST_send__saml1__Assertion(struct soap*, const char *URL, _saml1__Assertion*); soap_POST_recv__saml1__Assertion(struct soap*, _saml1__Assertion*); @endcode - @ref _saml1__Conditions @code // Reader (returns SOAP_OK on success): soap_read__saml1__Conditions(struct soap*, _saml1__Conditions*); // Writer (returns SOAP_OK on success): soap_write__saml1__Conditions(struct soap*, _saml1__Conditions*); // REST GET (returns SOAP_OK on success): soap_GET__saml1__Conditions(struct soap*, const char *URL, _saml1__Conditions*); // REST PUT (returns SOAP_OK on success): soap_PUT__saml1__Conditions(struct soap*, const char *URL, _saml1__Conditions*); // REST POST (returns SOAP_OK on success): soap_POST_send__saml1__Conditions(struct soap*, const char *URL, _saml1__Conditions*); soap_POST_recv__saml1__Conditions(struct soap*, _saml1__Conditions*); @endcode - @ref _saml1__Condition @code // Reader (returns SOAP_OK on success): soap_read__saml1__Condition(struct soap*, _saml1__Condition*); // Writer (returns SOAP_OK on success): soap_write__saml1__Condition(struct soap*, _saml1__Condition*); // REST GET (returns SOAP_OK on success): soap_GET__saml1__Condition(struct soap*, const char *URL, _saml1__Condition*); // REST PUT (returns SOAP_OK on success): soap_PUT__saml1__Condition(struct soap*, const char *URL, _saml1__Condition*); // REST POST (returns SOAP_OK on success): soap_POST_send__saml1__Condition(struct soap*, const char *URL, _saml1__Condition*); soap_POST_recv__saml1__Condition(struct soap*, _saml1__Condition*); @endcode - @ref _saml1__AudienceRestrictionCondition @code // Reader (returns SOAP_OK on success): soap_read__saml1__AudienceRestrictionCondition(struct soap*, _saml1__AudienceRestrictionCondition*); // Writer (returns SOAP_OK on success): soap_write__saml1__AudienceRestrictionCondition(struct soap*, _saml1__AudienceRestrictionCondition*); // REST GET (returns SOAP_OK on success): soap_GET__saml1__AudienceRestrictionCondition(struct soap*, const char *URL, _saml1__AudienceRestrictionCondition*); // REST PUT (returns SOAP_OK on success): soap_PUT__saml1__AudienceRestrictionCondition(struct soap*, const char *URL, _saml1__AudienceRestrictionCondition*); // REST POST (returns SOAP_OK on success): soap_POST_send__saml1__AudienceRestrictionCondition(struct soap*, const char *URL, _saml1__AudienceRestrictionCondition*); soap_POST_recv__saml1__AudienceRestrictionCondition(struct soap*, _saml1__AudienceRestrictionCondition*); @endcode - @ref _saml1__Audience @code // Reader (returns SOAP_OK on success): soap_read__saml1__Audience(struct soap*, _saml1__Audience*); // Writer (returns SOAP_OK on success): soap_write__saml1__Audience(struct soap*, _saml1__Audience*); // REST GET (returns SOAP_OK on success): soap_GET__saml1__Audience(struct soap*, const char *URL, _saml1__Audience*); // REST PUT (returns SOAP_OK on success): soap_PUT__saml1__Audience(struct soap*, const char *URL, _saml1__Audience*); // REST POST (returns SOAP_OK on success): soap_POST_send__saml1__Audience(struct soap*, const char *URL, _saml1__Audience*); soap_POST_recv__saml1__Audience(struct soap*, _saml1__Audience*); @endcode - @ref _saml1__DoNotCacheCondition @code // Reader (returns SOAP_OK on success): soap_read__saml1__DoNotCacheCondition(struct soap*, _saml1__DoNotCacheCondition*); // Writer (returns SOAP_OK on success): soap_write__saml1__DoNotCacheCondition(struct soap*, _saml1__DoNotCacheCondition*); // REST GET (returns SOAP_OK on success): soap_GET__saml1__DoNotCacheCondition(struct soap*, const char *URL, _saml1__DoNotCacheCondition*); // REST PUT (returns SOAP_OK on success): soap_PUT__saml1__DoNotCacheCondition(struct soap*, const char *URL, _saml1__DoNotCacheCondition*); // REST POST (returns SOAP_OK on success): soap_POST_send__saml1__DoNotCacheCondition(struct soap*, const char *URL, _saml1__DoNotCacheCondition*); soap_POST_recv__saml1__DoNotCacheCondition(struct soap*, _saml1__DoNotCacheCondition*); @endcode - @ref _saml1__Advice @code // Reader (returns SOAP_OK on success): soap_read__saml1__Advice(struct soap*, _saml1__Advice*); // Writer (returns SOAP_OK on success): soap_write__saml1__Advice(struct soap*, _saml1__Advice*); // REST GET (returns SOAP_OK on success): soap_GET__saml1__Advice(struct soap*, const char *URL, _saml1__Advice*); // REST PUT (returns SOAP_OK on success): soap_PUT__saml1__Advice(struct soap*, const char *URL, _saml1__Advice*); // REST POST (returns SOAP_OK on success): soap_POST_send__saml1__Advice(struct soap*, const char *URL, _saml1__Advice*); soap_POST_recv__saml1__Advice(struct soap*, _saml1__Advice*); @endcode - @ref _saml1__Statement @code // Reader (returns SOAP_OK on success): soap_read__saml1__Statement(struct soap*, _saml1__Statement*); // Writer (returns SOAP_OK on success): soap_write__saml1__Statement(struct soap*, _saml1__Statement*); // REST GET (returns SOAP_OK on success): soap_GET__saml1__Statement(struct soap*, const char *URL, _saml1__Statement*); // REST PUT (returns SOAP_OK on success): soap_PUT__saml1__Statement(struct soap*, const char *URL, _saml1__Statement*); // REST POST (returns SOAP_OK on success): soap_POST_send__saml1__Statement(struct soap*, const char *URL, _saml1__Statement*); soap_POST_recv__saml1__Statement(struct soap*, _saml1__Statement*); @endcode - @ref _saml1__SubjectStatement @code // Reader (returns SOAP_OK on success): soap_read__saml1__SubjectStatement(struct soap*, _saml1__SubjectStatement*); // Writer (returns SOAP_OK on success): soap_write__saml1__SubjectStatement(struct soap*, _saml1__SubjectStatement*); // REST GET (returns SOAP_OK on success): soap_GET__saml1__SubjectStatement(struct soap*, const char *URL, _saml1__SubjectStatement*); // REST PUT (returns SOAP_OK on success): soap_PUT__saml1__SubjectStatement(struct soap*, const char *URL, _saml1__SubjectStatement*); // REST POST (returns SOAP_OK on success): soap_POST_send__saml1__SubjectStatement(struct soap*, const char *URL, _saml1__SubjectStatement*); soap_POST_recv__saml1__SubjectStatement(struct soap*, _saml1__SubjectStatement*); @endcode - @ref _saml1__Subject @code // Reader (returns SOAP_OK on success): soap_read__saml1__Subject(struct soap*, _saml1__Subject*); // Writer (returns SOAP_OK on success): soap_write__saml1__Subject(struct soap*, _saml1__Subject*); // REST GET (returns SOAP_OK on success): soap_GET__saml1__Subject(struct soap*, const char *URL, _saml1__Subject*); // REST PUT (returns SOAP_OK on success): soap_PUT__saml1__Subject(struct soap*, const char *URL, _saml1__Subject*); // REST POST (returns SOAP_OK on success): soap_POST_send__saml1__Subject(struct soap*, const char *URL, _saml1__Subject*); soap_POST_recv__saml1__Subject(struct soap*, _saml1__Subject*); @endcode - @ref _saml1__NameIdentifier @code // Reader (returns SOAP_OK on success): soap_read__saml1__NameIdentifier(struct soap*, _saml1__NameIdentifier*); // Writer (returns SOAP_OK on success): soap_write__saml1__NameIdentifier(struct soap*, _saml1__NameIdentifier*); // REST GET (returns SOAP_OK on success): soap_GET__saml1__NameIdentifier(struct soap*, const char *URL, _saml1__NameIdentifier*); // REST PUT (returns SOAP_OK on success): soap_PUT__saml1__NameIdentifier(struct soap*, const char *URL, _saml1__NameIdentifier*); // REST POST (returns SOAP_OK on success): soap_POST_send__saml1__NameIdentifier(struct soap*, const char *URL, _saml1__NameIdentifier*); soap_POST_recv__saml1__NameIdentifier(struct soap*, _saml1__NameIdentifier*); @endcode - @ref _saml1__SubjectConfirmation @code // Reader (returns SOAP_OK on success): soap_read__saml1__SubjectConfirmation(struct soap*, _saml1__SubjectConfirmation*); // Writer (returns SOAP_OK on success): soap_write__saml1__SubjectConfirmation(struct soap*, _saml1__SubjectConfirmation*); // REST GET (returns SOAP_OK on success): soap_GET__saml1__SubjectConfirmation(struct soap*, const char *URL, _saml1__SubjectConfirmation*); // REST PUT (returns SOAP_OK on success): soap_PUT__saml1__SubjectConfirmation(struct soap*, const char *URL, _saml1__SubjectConfirmation*); // REST POST (returns SOAP_OK on success): soap_POST_send__saml1__SubjectConfirmation(struct soap*, const char *URL, _saml1__SubjectConfirmation*); soap_POST_recv__saml1__SubjectConfirmation(struct soap*, _saml1__SubjectConfirmation*); @endcode - @ref _saml1__SubjectConfirmationData @code // Reader (returns SOAP_OK on success): soap_read__saml1__SubjectConfirmationData(struct soap*, _saml1__SubjectConfirmationData*); // Writer (returns SOAP_OK on success): soap_write__saml1__SubjectConfirmationData(struct soap*, _saml1__SubjectConfirmationData*); // REST GET (returns SOAP_OK on success): soap_GET__saml1__SubjectConfirmationData(struct soap*, const char *URL, _saml1__SubjectConfirmationData*); // REST PUT (returns SOAP_OK on success): soap_PUT__saml1__SubjectConfirmationData(struct soap*, const char *URL, _saml1__SubjectConfirmationData*); // REST POST (returns SOAP_OK on success): soap_POST_send__saml1__SubjectConfirmationData(struct soap*, const char *URL, _saml1__SubjectConfirmationData*); soap_POST_recv__saml1__SubjectConfirmationData(struct soap*, _saml1__SubjectConfirmationData*); @endcode - @ref _saml1__ConfirmationMethod @code // Reader (returns SOAP_OK on success): soap_read__saml1__ConfirmationMethod(struct soap*, _saml1__ConfirmationMethod*); // Writer (returns SOAP_OK on success): soap_write__saml1__ConfirmationMethod(struct soap*, _saml1__ConfirmationMethod*); // REST GET (returns SOAP_OK on success): soap_GET__saml1__ConfirmationMethod(struct soap*, const char *URL, _saml1__ConfirmationMethod*); // REST PUT (returns SOAP_OK on success): soap_PUT__saml1__ConfirmationMethod(struct soap*, const char *URL, _saml1__ConfirmationMethod*); // REST POST (returns SOAP_OK on success): soap_POST_send__saml1__ConfirmationMethod(struct soap*, const char *URL, _saml1__ConfirmationMethod*); soap_POST_recv__saml1__ConfirmationMethod(struct soap*, _saml1__ConfirmationMethod*); @endcode - @ref _saml1__AuthenticationStatement @code // Reader (returns SOAP_OK on success): soap_read__saml1__AuthenticationStatement(struct soap*, _saml1__AuthenticationStatement*); // Writer (returns SOAP_OK on success): soap_write__saml1__AuthenticationStatement(struct soap*, _saml1__AuthenticationStatement*); // REST GET (returns SOAP_OK on success): soap_GET__saml1__AuthenticationStatement(struct soap*, const char *URL, _saml1__AuthenticationStatement*); // REST PUT (returns SOAP_OK on success): soap_PUT__saml1__AuthenticationStatement(struct soap*, const char *URL, _saml1__AuthenticationStatement*); // REST POST (returns SOAP_OK on success): soap_POST_send__saml1__AuthenticationStatement(struct soap*, const char *URL, _saml1__AuthenticationStatement*); soap_POST_recv__saml1__AuthenticationStatement(struct soap*, _saml1__AuthenticationStatement*); @endcode - @ref _saml1__SubjectLocality @code // Reader (returns SOAP_OK on success): soap_read__saml1__SubjectLocality(struct soap*, _saml1__SubjectLocality*); // Writer (returns SOAP_OK on success): soap_write__saml1__SubjectLocality(struct soap*, _saml1__SubjectLocality*); // REST GET (returns SOAP_OK on success): soap_GET__saml1__SubjectLocality(struct soap*, const char *URL, _saml1__SubjectLocality*); // REST PUT (returns SOAP_OK on success): soap_PUT__saml1__SubjectLocality(struct soap*, const char *URL, _saml1__SubjectLocality*); // REST POST (returns SOAP_OK on success): soap_POST_send__saml1__SubjectLocality(struct soap*, const char *URL, _saml1__SubjectLocality*); soap_POST_recv__saml1__SubjectLocality(struct soap*, _saml1__SubjectLocality*); @endcode - @ref _saml1__AuthorityBinding @code // Reader (returns SOAP_OK on success): soap_read__saml1__AuthorityBinding(struct soap*, _saml1__AuthorityBinding*); // Writer (returns SOAP_OK on success): soap_write__saml1__AuthorityBinding(struct soap*, _saml1__AuthorityBinding*); // REST GET (returns SOAP_OK on success): soap_GET__saml1__AuthorityBinding(struct soap*, const char *URL, _saml1__AuthorityBinding*); // REST PUT (returns SOAP_OK on success): soap_PUT__saml1__AuthorityBinding(struct soap*, const char *URL, _saml1__AuthorityBinding*); // REST POST (returns SOAP_OK on success): soap_POST_send__saml1__AuthorityBinding(struct soap*, const char *URL, _saml1__AuthorityBinding*); soap_POST_recv__saml1__AuthorityBinding(struct soap*, _saml1__AuthorityBinding*); @endcode - @ref _saml1__AuthorizationDecisionStatement @code // Reader (returns SOAP_OK on success): soap_read__saml1__AuthorizationDecisionStatement(struct soap*, _saml1__AuthorizationDecisionStatement*); // Writer (returns SOAP_OK on success): soap_write__saml1__AuthorizationDecisionStatement(struct soap*, _saml1__AuthorizationDecisionStatement*); // REST GET (returns SOAP_OK on success): soap_GET__saml1__AuthorizationDecisionStatement(struct soap*, const char *URL, _saml1__AuthorizationDecisionStatement*); // REST PUT (returns SOAP_OK on success): soap_PUT__saml1__AuthorizationDecisionStatement(struct soap*, const char *URL, _saml1__AuthorizationDecisionStatement*); // REST POST (returns SOAP_OK on success): soap_POST_send__saml1__AuthorizationDecisionStatement(struct soap*, const char *URL, _saml1__AuthorizationDecisionStatement*); soap_POST_recv__saml1__AuthorizationDecisionStatement(struct soap*, _saml1__AuthorizationDecisionStatement*); @endcode - @ref _saml1__Action @code // Reader (returns SOAP_OK on success): soap_read__saml1__Action(struct soap*, _saml1__Action*); // Writer (returns SOAP_OK on success): soap_write__saml1__Action(struct soap*, _saml1__Action*); // REST GET (returns SOAP_OK on success): soap_GET__saml1__Action(struct soap*, const char *URL, _saml1__Action*); // REST PUT (returns SOAP_OK on success): soap_PUT__saml1__Action(struct soap*, const char *URL, _saml1__Action*); // REST POST (returns SOAP_OK on success): soap_POST_send__saml1__Action(struct soap*, const char *URL, _saml1__Action*); soap_POST_recv__saml1__Action(struct soap*, _saml1__Action*); @endcode - @ref _saml1__Evidence @code // Reader (returns SOAP_OK on success): soap_read__saml1__Evidence(struct soap*, _saml1__Evidence*); // Writer (returns SOAP_OK on success): soap_write__saml1__Evidence(struct soap*, _saml1__Evidence*); // REST GET (returns SOAP_OK on success): soap_GET__saml1__Evidence(struct soap*, const char *URL, _saml1__Evidence*); // REST PUT (returns SOAP_OK on success): soap_PUT__saml1__Evidence(struct soap*, const char *URL, _saml1__Evidence*); // REST POST (returns SOAP_OK on success): soap_POST_send__saml1__Evidence(struct soap*, const char *URL, _saml1__Evidence*); soap_POST_recv__saml1__Evidence(struct soap*, _saml1__Evidence*); @endcode - @ref _saml1__AttributeStatement @code // Reader (returns SOAP_OK on success): soap_read__saml1__AttributeStatement(struct soap*, _saml1__AttributeStatement*); // Writer (returns SOAP_OK on success): soap_write__saml1__AttributeStatement(struct soap*, _saml1__AttributeStatement*); // REST GET (returns SOAP_OK on success): soap_GET__saml1__AttributeStatement(struct soap*, const char *URL, _saml1__AttributeStatement*); // REST PUT (returns SOAP_OK on success): soap_PUT__saml1__AttributeStatement(struct soap*, const char *URL, _saml1__AttributeStatement*); // REST POST (returns SOAP_OK on success): soap_POST_send__saml1__AttributeStatement(struct soap*, const char *URL, _saml1__AttributeStatement*); soap_POST_recv__saml1__AttributeStatement(struct soap*, _saml1__AttributeStatement*); @endcode - @ref _saml1__AttributeDesignator @code // Reader (returns SOAP_OK on success): soap_read__saml1__AttributeDesignator(struct soap*, _saml1__AttributeDesignator*); // Writer (returns SOAP_OK on success): soap_write__saml1__AttributeDesignator(struct soap*, _saml1__AttributeDesignator*); // REST GET (returns SOAP_OK on success): soap_GET__saml1__AttributeDesignator(struct soap*, const char *URL, _saml1__AttributeDesignator*); // REST PUT (returns SOAP_OK on success): soap_PUT__saml1__AttributeDesignator(struct soap*, const char *URL, _saml1__AttributeDesignator*); // REST POST (returns SOAP_OK on success): soap_POST_send__saml1__AttributeDesignator(struct soap*, const char *URL, _saml1__AttributeDesignator*); soap_POST_recv__saml1__AttributeDesignator(struct soap*, _saml1__AttributeDesignator*); @endcode - @ref _saml1__Attribute @code // Reader (returns SOAP_OK on success): soap_read__saml1__Attribute(struct soap*, _saml1__Attribute*); // Writer (returns SOAP_OK on success): soap_write__saml1__Attribute(struct soap*, _saml1__Attribute*); // REST GET (returns SOAP_OK on success): soap_GET__saml1__Attribute(struct soap*, const char *URL, _saml1__Attribute*); // REST PUT (returns SOAP_OK on success): soap_PUT__saml1__Attribute(struct soap*, const char *URL, _saml1__Attribute*); // REST POST (returns SOAP_OK on success): soap_POST_send__saml1__Attribute(struct soap*, const char *URL, _saml1__Attribute*); soap_POST_recv__saml1__Attribute(struct soap*, _saml1__Attribute*); @endcode - @ref _saml1__AttributeValue @code // Reader (returns SOAP_OK on success): soap_read__saml1__AttributeValue(struct soap*, _saml1__AttributeValue*); // Writer (returns SOAP_OK on success): soap_write__saml1__AttributeValue(struct soap*, _saml1__AttributeValue*); // REST GET (returns SOAP_OK on success): soap_GET__saml1__AttributeValue(struct soap*, const char *URL, _saml1__AttributeValue*); // REST PUT (returns SOAP_OK on success): soap_PUT__saml1__AttributeValue(struct soap*, const char *URL, _saml1__AttributeValue*); // REST POST (returns SOAP_OK on success): soap_POST_send__saml1__AttributeValue(struct soap*, const char *URL, _saml1__AttributeValue*); soap_POST_recv__saml1__AttributeValue(struct soap*, _saml1__AttributeValue*); @endcode */ /* End of saml1.h */ gsoap-2.8.91/gsoap/import/wsc.h0000644000175000017500000003677213525245161015677 0ustar ellertellert/* wsc.h WS-SecureConversation 2005/12, also accepts 2005/02 Generated with: wsdl2h -cex -o wsc.h -t WS/WS-typemap.dat WS/WS-SecureConversation.xsd - Removed //gsoapopt - Changed //gsoap wsc schema namespace directive to import directive - Added //gsoap wsc schema namespace2 directive */ /******************************************************************************\ * * * Definitions * * http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512 * * * \******************************************************************************/ /******************************************************************************\ * * * Import * * * \******************************************************************************/ #import "wsse.h" // wsse = #import "wsu.h" // wsu = /******************************************************************************\ * * * Schema Namespaces * * * \******************************************************************************/ #define SOAP_NAMESPACE_OF_wsc "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512" //gsoap wsc schema import: http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512 //gsoap wsc schema namespace2: http://schemas.xmlsoap.org/ws/2005/02/sc //gsoap wsc schema elementForm: qualified //gsoap wsc schema attributeForm: unqualified /******************************************************************************\ * * * Built-in Schema Types and Top-Level Elements and Attributes * * * \******************************************************************************/ /// Imported element ""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityTokenReference" from typemap "WS/WS-typemap.dat". /******************************************************************************\ * * * Schema Types and Top-Level Elements and Attributes * * http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512 * * * \******************************************************************************/ /// @brief Union of values from member types "wsc:FaultCodeType xs:QName". typedef char* wsc__FaultCodeOpenEnumType; /// @brief "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":FaultCodeType is a simpleType restriction of XSD type xs:QName. /// enum wsc__FaultCodeType { wsc__BadContextToken, ///< xs:QName value=""http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":BadContextToken" wsc__UnsupportedContextToken, ///< xs:QName value=""http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":UnsupportedContextToken" wsc__UnknownDerivationSource, ///< xs:QName value=""http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":UnknownDerivationSource" wsc__RenewNeeded, ///< xs:QName value=""http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":RenewNeeded" wsc__UnableToRenew, ///< xs:QName value=""http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":UnableToRenew" }; /******************************************************************************\ * * * Schema Complex Types and Top-Level Elements * * http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512 * * * \******************************************************************************/ /// @brief "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":SecurityContextTokenType is a complexType. /// ///
/// Actual content model is non-deterministic, hence wildcard. The following shows intended content model: /// /// /// ///
struct wsc__SecurityContextTokenType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). /// Imported attribute reference "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd":Id. @char* wsu__Id 0; ///< Optional attribute. /// @todo . /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this attribute. /// Use wsdl2h option -d for xsd__anyAttribute DOM (soap_dom_attribute). /// Member declared in WS/WS-typemap.dat char* Identifier; /// Member declared in WS/WS-typemap.dat char* Instance; }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":DerivedKeyTokenType is a complexType. /// struct wsc__DerivedKeyTokenType { /// Imported element reference "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd":SecurityTokenReference. _wsse__SecurityTokenReference* wsse__SecurityTokenReference 0; ///< Optional element. /// Element "Properties" of XSD type "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":PropertiesType. struct wsc__PropertiesType* Properties 0; ///< Optional element. // BEGIN SEQUENCE struct __wsc__DerivedKeyTokenType_sequence { // BEGIN CHOICE $int __union_DerivedKeyTokenType ; ///< Union _wsc__union_DerivedKeyTokenType selector: set to SOAP_UNION__wsc__union_DerivedKeyTokenType_ union _wsc__union_DerivedKeyTokenType { /// Element "Generation" of XSD type xs:unsignedLong. ULONG64 Generation 1; ///< Required element. /// Element "Offset" of XSD type xs:unsignedLong. ULONG64 Offset 1; ///< Required element. } union_DerivedKeyTokenType ; // END OF CHOICE /// Element "Length" of XSD type xs:unsignedLong. ULONG64* Length 0; ///< Optional element. } *__DerivedKeyTokenType_sequence 0; // END OF SEQUENCE /// Element reference "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512:""http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":Label. char* Label 0; ///< Optional element. /// Element reference "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512:""http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":Nonce. char* Nonce 0; ///< Optional element. /// Imported attribute reference "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd":Id. @char* wsu__Id 0; ///< Optional attribute. /// Attribute "Algorithm" of XSD type xs:anyURI. @char* Algorithm 0; ///< Optional attribute. }; /// @brief "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":PropertiesType is a complexType. /// struct wsc__PropertiesType { /// @todo /// @todo Schema extensibility is user-definable. /// Consult the protocol documentation to change or insert declarations. /// Use wsdl2h option -x to remove this element. /// Use wsdl2h option -d for xsd__anyType DOM (soap_dom_element). }; /******************************************************************************\ * * * Additional Top-Level Elements * * http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512 * * * \******************************************************************************/ /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":SecurityContextToken of XSD type "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":SecurityContextTokenType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":Identifier of XSD type xs:anyURI. // "_wsc__Identifier" element definition intentionally left blank. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":Instance of XSD type xs:string. // "_wsc__Instance" element definition intentionally left blank. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":DerivedKeyToken of XSD type "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":DerivedKeyTokenType. /// @note Use wsdl2h option -g to auto-generate a top-level root element declaration and processing code. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":Name of XSD type xs:anyURI. // "_wsc__Name" element definition intentionally left blank. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":Label of XSD type xs:string. // "_wsc__Label" element definition intentionally left blank. /// @brief Top-level root element "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":Nonce of XSD type xs:base64Binary. // "_wsc__Nonce" element definition intentionally left blank. /******************************************************************************\ * * * Additional Top-Level Attributes * * http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512 * * * \******************************************************************************/ /// @brief Top-level attribute "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":Instance of simpleType xs:string. // "_wsc__Instance" attribute definition intentionally left blank. /// @brief Top-level attribute "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":Nonce of simpleType xs:base64Binary. // "_wsc__Nonce" attribute definition intentionally left blank. /// @brief Top-level attribute "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512":Length of simpleType xs:unsignedLong. /// @note Use wsdl2h option -g to auto-generate a top-level attribute declaration and processing code. /******************************************************************************\ * * * XML Data Binding * * * \******************************************************************************/ /** @page page_XMLDataBinding XML Data Binding SOAP/XML services use data bindings contractually bound by WSDL and auto- generated by wsdl2h and soapcpp2 (see Service Bindings). Plain data bindings are adopted from XML schemas as part of the WSDL types section or when running wsdl2h on a set of schemas to produce non-SOAP-based XML data bindings. The following readers and writers are C/C++ data type (de)serializers auto- generated by wsdl2h and soapcpp2. Run soapcpp2 on this file to generate the (de)serialization code, which is stored in soapC.c[pp]. Include "soapH.h" in your code to import these data type and function declarations. Only use the soapcpp2-generated files in your project build. Do not include the wsdl2h- generated .h file in your code. Data can be read in XML and deserialized from: - a file descriptor, using soap->recvfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->is = ... - a buffer, using the soap->frecv() callback Data can be serialized in XML and written to: - a file descriptor, using soap->sendfd = fd - a socket, using soap->socket = ... - a C++ stream, using soap->os = ... - a buffer, using the soap->fsend() callback The following options are available for (de)serialization control: - soap->encodingStyle = NULL; to remove SOAP 1.1/1.2 encodingStyle - soap_mode(soap, SOAP_XML_TREE); XML without id-ref (no cycles!) - soap_mode(soap, SOAP_XML_GRAPH); XML with id-ref (including cycles) - soap_set_namespaces(soap, struct Namespace *nsmap); to set xmlns bindings @section wsc Top-level root elements of schema "http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512" - (use wsdl2h option -g to auto-generate) - @ref _wsc__Identifier @code // Reader (returns SOAP_OK on success): soap_read__wsc__Identifier(struct soap*, char*); // Writer (returns SOAP_OK on success): soap_write__wsc__Identifier(struct soap*, char*); @endcode - @ref _wsc__Instance @code // Reader (returns SOAP_OK on success): soap_read__wsc__Instance(struct soap*, char*); // Writer (returns SOAP_OK on success): soap_write__wsc__Instance(struct soap*, char*); @endcode - (use wsdl2h option -g to auto-generate) - @ref _wsc__Name @code // Reader (returns SOAP_OK on success): soap_read__wsc__Name(struct soap*, char*); // Writer (returns SOAP_OK on success): soap_write__wsc__Name(struct soap*, char*); @endcode -